[SCM] ardour/upstream: Imported Upstream version 5.0~dfsg
adiknoth-guest at users.alioth.debian.org
adiknoth-guest at users.alioth.debian.org
Mon Aug 15 23:26:49 UTC 2016
The following commit has been merged in the upstream branch:
commit 6a5f902d3c618ad069a29f8074e7783fc9c3e163
Author: Adrian Knoth <adi at drcomp.erfurt.thur.de>
Date: Sun Aug 14 11:56:44 2016 +0200
Imported Upstream version 5.0~dfsg
diff --git a/TRANSLATORS b/TRANSLATORS
index 26211ad..b8c4c40 100644
--- a/TRANSLATORS
+++ b/TRANSLATORS
@@ -22,7 +22,7 @@ showing the case for Russian):
libs/gtkmm2ext/po/ru.po
Every PO file's name is a two-character code, e.g. 'de' for German, 'es' for
-Spanish and so on. However it's fairly common to have localizations for local
+Spanish, and so on. However it's fairly common to have localizations for local
versions of a language, e.g. 'pt_BR' would stand for Brazilian Portuguese, and
'es_MX' would stand for Mexican Spanish. Please refer to ISO language code
table for details.
@@ -30,22 +30,47 @@ table for details.
Here is the best workflow for existing translations.
1. Build Ardour using './waf' command (this step is actually optional).
+
2a. If there is no existing translation for your language, run './waf i18n_pot'
which will generate a POT (.pot) file for each of the directories shown
-above. For each directory you plan to translate, rename the POT file to end in .po and then
-continue with step 3.
+above. For each directory you plan to translate, rename the POT file to end in
+.po and then continue with step 3.
+
2b. If there is an existing translation for your language, run './waf
-i18n_pot' which will bring it up to date (along with all other PO files)
+i18n_po' which will bring it up to date (along with all other PO files)
+
3. Open the relevant PO file in you PO editor of choice (see below).
-4. Open Ardour, find something untranslated, locate this phrase in PO file, translate.
+
+4. Open Ardour, find something untranslated, locate this phrase in PO file,
+translate.
+
5. Repeat previous step several times, save the PO file.
-6. Run './waf i18n_mo' to regenerate binary MO files and 'sudo ./waf install' to install them.
-7. Restart Ardour to see what your translation looks like and whether it needs fixes, e.g. has to be shorter.
-Note that as of Ardour 3 beta 1 the translations are only installed when you
-run './waf i18n' after './waf' and before 'sudo ./waf install'.
+6. Run './waf i18n_mo' to regenerate binary MO files and 'sudo ./waf install'
+to install them.
+
+7. Restart Ardour to see what your translation looks like and whether it needs
+fixes, e.g. has to be shorter.
+
+Note that as of Ardour 4 the translations are only installed when you run
+'./waf i18n' after './waf' and before 'sudo ./waf install'.
+
+When you are done translating, it's best to get credited for your contribution.
+Here is how you can do it:
+
+1. Run 'git commit -a' (assuming you only modified translation files) and
+describe the changes you made. Typically the commit message looks like
+'Update German translation'. That should be sufficient.
+
+2. Run 'git format-patch origin/master' (assuming you worked on a clone of the
+master branch. That should generate a file called something like
+'0001-Update-German-translation.patch'.
+
+3. Run 'bzip2 0001-Update-German-translation.patch' to compress the file.
-When you are done, save the file and submit it to the tracker.
+4. File a new bug report at http://tracker.ardour.org and attach the resulted
+compressed file and tell either rgareus (Robin Gareus) or las (Paul Davis) on
+the project's IRC channel (#ardour at irc.freenode.net) about your patch.
There are some more things you need to know.
diff --git a/ardour.1.fr b/ardour.1.fr
index 368cb81..4a46d2d 100644
--- a/ardour.1.fr
+++ b/ardour.1.fr
@@ -1,6 +1,6 @@
.TH ARDOUR 1 2002-12-29
.SH NOM
-ardour \- une station de travail audio-numérique
+ardour \- une station de travail audio-numérique
.SH SYNOPSIS
ardour
.B \-b
@@ -12,30 +12,30 @@ ardour
.B \-\-help
.SH DESCRIPTION
Ardour est un enregistreur sur disque dur multi-canaux (HDR) et une station de
-travail audio-numérique (DAW).
-Il est capable d'enregistrer simultanément 24 ou plus canaux audio 32 bits à
+travail audio-numérique (DAW).
+Il est capable d'enregistrer simultanément 24 ou plus canaux audio 32 bits Ã
48 kHz.
Ardour a pour vocation de fonctionner comme un enregistreur sur disque dur
-"professionnel", en remplacement de solutions matérielles dédiées comme le
-Mackie HDR, le Tascam 2424 et les plus traditionnels système à bande tels que
-la série Alesis ADAT.
-Il est aussi conçu pour procurer les mêmes ou de meilleures fonctionnalités
-que des systèmes logiciels comme ProTools, Samplitude, Logic Audio, Nuendo et
-Cubase VST (nous reconnaissons ces marques comme marques déposées appartenant
-à leurs propriétaires respectifs).
-Il supporte MIDI Machine Control, et peut ainsi être contrôlé depuis
-n'importe quel contrôleur MMC, comme le Mackie Digital 8 Bus mixer et de nombreux autres mélangeurs audio-numériques modernes.
+"professionnel", en remplacement de solutions matérielles dédiées comme le
+Mackie HDR, le Tascam 2424 et les plus traditionnels système à bande tels que
+la série Alesis ADAT.
+Il est aussi conçu pour procurer les mêmes ou de meilleures fonctionnalités
+que des systèmes logiciels comme ProTools, Samplitude, Logic Audio, Nuendo et
+Cubase VST (nous reconnaissons ces marques comme marques déposées appartenant
+à leurs propriétaires respectifs).
+Il supporte MIDI Machine Control, et peut ainsi être contrôlé depuis
+n'importe quel contrôleur MMC, comme le Mackie Digital 8 Bus mixer et de nombreux autres mélangeurs audio-numériques modernes.
.SH OPTIONS
.TP
.B \-b
Affiche tous les noms des codes clavier possibles.
.TP
.B \-U
-Indiquer le chemin vers le fichier GTK RC à utiliser.
+Indiquer le chemin vers le fichier GTK RC Ã utiliser.
Le fichier fourni s'appelle
.B ardour_ui.rc
-et se trouve dans la racine du répertoire du code source d'Ardour.
-Ce fichier gère l'utilisation de toutes les couleurs et polices de caractère
+et se trouve dans la racine du répertoire du code source d'Ardour.
+Ce fichier gère l'utilisation de toutes les couleurs et polices de caractère
dans Ardour.
Ardour fonctionnera sans, mais son aspect sera, disons, affreux.
.TP
@@ -44,10 +44,10 @@ Affiche le message d'aide.
.SH FICHIERS
.TP
.B ardour.rc
-Paramètre par défaut et de démarrage d'Ardour.
+Paramètre par défaut et de démarrage d'Ardour.
.TP
.B ardour_ui.rc
-Définitions pour l'interface d'Ardour.
+Définitions pour l'interface d'Ardour.
.SH ENVIRONNEMENT
.TP
.B ARDOUR_RC
@@ -65,7 +65,7 @@ Paul Davis.
Ne
.I pas
le contacter directement.
-Contactez-le plutôt à <ardour-dev at lists.ardour.org>.
+Contactez-le plutôt à <ardour-dev at lists.ardour.org>.
Vous pouvez vous inscrire ici :
.br
http://lists.ardour.org/listinfo.cgi/ardour-dev-ardour.org
diff --git a/ardour.1.ru b/ardour.1.ru
index 06ab114..66f29f0 100644
--- a/ardour.1.ru
+++ b/ardour.1.ru
@@ -1,84 +1,84 @@
.TH "ARDOUR" "1" "2004-05-10" "" ""
-.SH "éíñ"
-ardour \- ÒÁÂÏÞÁÑ ÓÔÁÎÃÉÑ ÄÌÑ ÃÉÆÒÏ×ÏÊ ÏÂÒÁÂÏÔËÉ Ú×ÕËÁ
-.SH "ïâúïò"
+.SH "ÐÐЯ"
+ardour \- ÑабоÑÐ°Ñ ÑÑанÑÐ¸Ñ Ð´Ð»Ñ ÑиÑÑовой обÑабоÑки звÑка
+.SH "ÐÐÐÐÐ "
ardour
.B \-b
.RB [ \-U
-.I R ÆÁÊÌ ]
-.RI [ ÓÅÓÓÉÑ ]
+.I R Ñайл ]
+.RI [ ÑеÑÑÐ¸Ñ ]
.br
ardour
.B \-\-help
-.SH "ïðéóáîéå"
-Ardour \- ÜÔÏ ÐÒÏÇÒÁÍÍÁ ÄÌÑ ÍÎÏÇÏËÁÎÁÌØÎÏÊ ÚÁÐÉÓÉ ÎÁ Ö£ÓÔËÉÊ ÄÉÓË
-(hard disk recorder \- HDR) É ÏÄÎÏ×ÒÅÍÅÎÎÏ ÒÅÄÁËÔÏÒ ÄÌÑ ÃÉÆÒÏ×ÏÊ ÏÂÒÁÂÏÔËÉ Ú×ÕËÁ
+.SH "ÐÐÐСÐÐÐÐ"
+Ardour \- ÑÑо пÑогÑамма Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÐ°Ð½Ð°Ð»Ñной запиÑи на жÑÑÑкий диÑк
+(hard disk recorder \- HDR) и одновÑеменно ÑедакÑÐ¾Ñ Ð´Ð»Ñ ÑиÑÑовой обÑабоÑки звÑка
(digital audio workstation \- DAW).
.br
-ïÎ ÓÐÏÓÏÂÅÎ ÚÁÐÉÓÙ×ÁÔØ ÏÄÎÏ×ÒÅÍÅÎÎÏ ÄÏ 24 ÉÌÉ ÂÏÌÅÅ ËÁÎÁÌÏ× 32\-ÂÉÔÎÙÈ
-ÁÕÄÉÏÄÁÎÎÙÈ Ó ÞÁÓÔÏÔÏÊ ÄÉÓËÒÅÔÉÚÁÃÉÉ 48 ËçÃ.
-Ardour ÎÁÃÅÌÅÎ ÒÁÂÏÔÁÔØ ËÁË "ÐÒÏÆÅÓÓÉÏÎÁÌØÎÁÑ" HDR\-ÓÉÓÔÅÍÁ, ÓÐÏÓÏÂÎÁÑ
-ÚÁÍÅÎÉÔØ ÔÁËÉÅ ÁÐÐÁÒÁÔÎÙÅ ÒÅÛÅÎÉÑ ËÁË Mackie HDR, Tascam 2424 É ÍÎÏÇÉÅ
-ÔÒÁÄÉÃÉÏÎÎÙÅ ÓÉÓÔÅÍÙ ÚÁÐÉÓÉ ÎÁ ÍÁÇÎÉÔÎÕÀ ÌÅÎÔÕ, ÎÁÐÒÉÍÅÒ ÓÅÒÉÀ Alesis ADAT.
-ôÁËÖÅ ÐÒÅÓÌÅÄÕÅÔÓÑ ÃÅÌØ ÏÂÅÓÐÅÞÉÔØ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ ÁÎÁÌÏÇÉÞÎÕÀ ÉÌÉ ÄÁÖÅ ÂÏÌØÛÕÀ
-ÐÏ ÓÒÁ×ÎÅÎÉÀ Ó ÔÁËÉÍÉ ÐÒÏÇÒÁÍÍÎÙÍÉ ÐÒÏÄÕËÔÁÍÉ ËÁË ProTools, Samplitude, Logic Audio,
-Nuendo and Cubase VST (ÍÙ ÐÒÉÚÎÁ£Í, ÞÔÏ ÜÔÉ É ÄÒÕÇÉÅ ÎÁÉÍÅÎÏ×ÁÎÉÑ Ñ×ÌÑÀÔÓÑ
-ÔÏÒÇÏ×ÙÍÉ ÍÁÒËÁÍÉ, ËÏÔÏÒÙÅ ÐÒÉÎÁÄÌÅÖÁÔ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍ ÏÂÌÁÄÁÔÅÌÑÍ).
+Ðн ÑпоÑобен запиÑÑваÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно до 24 или более каналов 32\-биÑнÑÑ
+аÑдиоданнÑÑ
Ñ ÑаÑÑоÑой диÑкÑеÑизаÑии 48 кÐÑ.
+Ardour наÑелен ÑабоÑаÑÑ ÐºÐ°Ðº "пÑоÑеÑÑионалÑнаÑ" HDR\-ÑиÑÑема, ÑпоÑобнаÑ
+замениÑÑ Ñакие аппаÑаÑнÑе ÑеÑÐµÐ½Ð¸Ñ ÐºÐ°Ðº Mackie HDR, Tascam 2424 и многие
+ÑÑадиÑионнÑе ÑиÑÑÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи на магниÑнÑÑ Ð»ÐµÐ½ÑÑ, напÑÐ¸Ð¼ÐµÑ ÑеÑÐ¸Ñ Alesis ADAT.
+Также пÑеÑледÑеÑÑÑ ÑÐµÐ»Ñ Ð¾Ð±ÐµÑпеÑиÑÑ ÑÑнкÑионалÑноÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑÑ Ð¸Ð»Ð¸ даже болÑÑÑÑ
+по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ñакими пÑогÑаммнÑми пÑодÑкÑами как ProTools, Samplitude, Logic Audio,
+Nuendo and Cubase VST (Ð¼Ñ Ð¿ÑизнаÑм, ÑÑо ÑÑи и дÑÑгие Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ ÑвлÑÑÑÑÑ
+ÑоÑговÑми маÑками, коÑоÑÑе пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ ÑооÑвеÑÑÑвÑÑÑим обладаÑелÑм).
.br
-éÍÅÅÔÓÑ ÐÏÄÄÅÒÖËÁ MIDI Machine Control (MMC), × ÔÏÍ ÞÉÓÌÅ ×ÏÚÍÏÖÎÏ É
-ÕÐÒÁ×ÌÅÎÉÅ ÏÔ ÌÀÂÏÇÏ MMC\-ËÏÎÔÒÏÌÌÅÒÁ, ÎÁÐÒÉÍÅÒ, ÔÁËÏÇÏ ËÁË ÍÉËÛÅÒ Mackie Digital
-8 Bus ÉÌÉ ÌÀÂÏÇÏ ÄÒÕÇÏÇÏ ÓÏ×ÒÅÍÅÎÎÏÇÏ ÍÉËÛÅÒÁ.
-.SH "ëìàþé ëïíáîäîïê óôòïëé"
+ÐмееÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка MIDI Machine Control (MMC), в Ñом ÑиÑле возможно и
+ÑпÑавление Ð¾Ñ Ð»Ñбого MMC\-конÑÑоллеÑа, напÑимеÑ, Ñакого как микÑÐµÑ Mackie Digital
+8 Bus или лÑбого дÑÑгого ÑовÑеменного микÑеÑа.
+.SH "ÐÐЮЧРÐÐÐÐÐÐÐÐРСТРÐÐÐ"
.TP
.B \-b, \-\-bindings
-÷Ù×ÅÓÔÉ ÓÐÉÓÏË ÄÏÓÔÕÐÎÙÈ "ÇÏÒÑÞÉÈ" ËÌÁ×ÉÛ.
+ÐÑвеÑÑи ÑпиÑок доÑÑÑпнÑÑ
"гоÑÑÑиÑ
" клавиÑ.
.TP
.B \-n, \-\-no\-splash
-îÅ ×Ù×ÏÄÉÔØ ÚÁÓÔÁ×ËÕ.
+Ðе вÑводиÑÑ Ð·Ð°ÑÑавкÑ.
.TP
-.B \-U, \-\-ui\-rcfile ÐÕÔØ
-õËÁÚÁÔØ ÐÕÔØ Ë ÆÁÊÌÕ ÏÐÉÓÁÎÉÑ ÇÒÁÆÉÞÅÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ (GTK RC).
-÷ Î£Í ÏÐÒÅÄÅÌÅÎÙ ×ÓÅ ÛÒÉÆÔÙ É Ã×ÅÔÁ ÜÌÅÍÅÎÔÏ× ÉÎÔÅÒÆÅÊÓÁ Ardour.
-æÁÊÌ ÄÏÌÖÅÎ ÉÍÅÎÏ×ÁÔØÓÑ ËÁË
+.B \-U, \-\-ui\-rcfile пÑÑÑ
+УказаÑÑ Ð¿ÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð³ÑаÑиÑеÑкого инÑеÑÑейÑа (GTK RC).
+РнÑм опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð²Ñе ÑÑиÑÑÑ Ð¸ ÑвеÑа ÑлеменÑов инÑеÑÑейÑа Ardour.
+Файл должен именоваÑÑÑÑ ÐºÐ°Ðº
.B ardour_ui.rc
-, ÅÇÏ ÛÁÂÌÏÎ ÎÁÈÏÄÉÔÓÑ × ËÏÒÎÅ×ÏÍ ËÁÔÁÌÏÇÅ ÉÓÈÏÄÎÙÈ ÔÅËÓÔÏ× Ardour.
-Ardour ÍÏÖÎÏ ÚÁÐÕÓÔÉÔØ É ÂÅÚ ÎÅÇÏ, ÎÏ ×ÎÅÛÎÉÊ ×ÉÄ ÉÎÔÅÒÆÅÊÓÁ ÂÕÄÅÔ ÂÅÚÏÂÒÁÚÎÙÍ.
+, его Ñаблон наÑ
одиÑÑÑ Ð² коÑневом каÑалоге иÑÑ
однÑÑ
ÑекÑÑов Ardour.
+Ardour можно запÑÑÑиÑÑ Ð¸ без него, но внеÑний вид инÑеÑÑейÑа бÑÐ´ÐµÑ Ð±ÐµÐ·Ð¾Ð±ÑазнÑм.
.TP
-.B \-c, \-\-jack\-client\-name ÉÍÑ
-éÓÐÏÌØÚÏ×ÁÔØ ÄÒÕÇÏÅ ÉÍÑ jack\-ËÌÉÅÎÔÁ, ardour ÐÏ ÕÍÏÌÞÁÎÉÀ.
+.B \-c, \-\-jack\-client\-name имÑ
+ÐÑполÑзоваÑÑ Ð´ÑÑгое Ð¸Ð¼Ñ jack\-клиенÑа, ardour по ÑмолÑаниÑ.
.TP
.B \-v, \-\-version
-éÎÆÏÒÍÁÃÉÑ Ï ×ÅÒÓÉÉ ÐÒÏÇÒÁÍÍÙ.
+ÐнÑоÑмаÑÐ¸Ñ Ð¾ веÑÑии пÑогÑаммÑ.
.TP
.B \-h, \-\-help
-ðÏËÁÚÁÔØ ÓÐÒÁ×ËÕ.
-.SH "æáêìù"
+ÐоказаÑÑ ÑпÑавкÑ.
+.SH "ФÐÐÐЫ"
.TP
.B ardour.rc
-îÁÓÔÒÏÊËÉ ÐÏ ÕÍÏÌÞÁÎÉÀ É ÕÓÔÁÎÏ×ËÉ "ÇÏÒÑÞÉÈ" ËÌÁ×ÉÛ ÄÌÑ Ardour.
+ÐаÑÑÑойки по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ ÑÑÑановки "гоÑÑÑиÑ
" ÐºÐ»Ð°Ð²Ð¸Ñ Ð´Ð»Ñ Ardour.
.TP
.B ardour_ui.rc
-ïÐÉÓÁÎÉÅ ÐÏÌØÚÏ×ÁÔÅÌØÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ Ardour.
-.SH "ïëòõöåîéå"
+ÐпиÑание полÑзоваÑелÑÑкого инÑеÑÑейÑа Ardour.
+.SH "ÐÐРУÐÐÐÐÐ"
.TP
.B ARDOUR_RC
-ðÕÔØ Ë ÆÁÊÌÕ ardour.rc.
+ÐÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ ardour.rc.
.TP
.B ARDOUR_SYSTEM_RC
-ðÕÔØ Ë ÆÁÊÌÕ ardour_system.rc
+ÐÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ ardour_system.rc
.TP
.B LADSPA_PATH
-ðÕÔØ Ë ÍÏÄÕÌÑÍ (ÐÌÁÇÉÎÁÍ) LADSPA.
-.SH "ïûéâëé ÷ ðòïçòáííå"
-äÁ, ÉÍÅÀÔÓÑ.
-.SH "á÷ôïò"
-Paul Davis (ðÏÌ äÜ×ÉÓ).
-ðÏÖÁÌÕÊÓÔÁ,
-.I ÎÅ ÏÂÒÁÝÁÊÔÅÓØ
-Ë ÎÅÍÕ ÎÁÐÒÑÍÕÀ.
-ó×ÑÚÁÔØÓÑ Ó ÎÉÍ É ÄÒÕÇÉÍÉ ÒÁÚÒÁÂÏÔÞÉËÁÍÉ ÍÏÖÎÏ ÏÔÐÒÁ×É× ÓÏÏÂÝÅÎÉÅ × ÓÐÉÓÏË ÒÁÓÓÙÌËÉ,
+ÐÑÑÑ Ðº модÑлÑм (плагинам) LADSPA.
+.SH "ÐШÐÐÐÐ Ð ÐÐ ÐÐÐ ÐÐÐÐ"
+Ðа, имеÑÑÑÑ.
+.SH "ÐÐТÐÐ "
+Paul Davis (Ðол ÐÑвиÑ).
+ÐожалÑйÑÑа,
+.I не обÑаÑайÑеÑÑ
+к Ð½ÐµÐ¼Ñ Ð½Ð°Ð¿ÑÑмÑÑ.
+СвÑзаÑÑÑÑ Ñ Ð½Ð¸Ð¼ и дÑÑгими ÑазÑабоÑÑиками можно оÑпÑавив ÑообÑение в ÑпиÑок ÑаÑÑÑлки,
<ardour-dev at lists.ardour.org>.
.br
-÷Ù ÍÏÖÅÔÅ ÐÏÄÐÉÓÁÔØÓÑ ÎÁ ÎÅÇÏ ÐÏ ÁÄÒÅÓÕ:
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе подпиÑаÑÑÑÑ Ð½Ð° него по адÑеÑÑ:
.br
http://lists.ardour.org/listinfo.cgi/ardour-dev-ardour.org
diff --git a/cfgtool/wscript b/cfgtool/wscript
index 04dda4f..6f594ca 100644
--- a/cfgtool/wscript
+++ b/cfgtool/wscript
@@ -19,6 +19,6 @@ def build(bld):
obj = bld (features = 'cxx c cxxprogram')
obj.source = 'cfgtool.cc'
obj.target = 'cfgtool'
- obj.use = [ 'libpbd', 'libardour', ]
- obj.use = [ 'libpbd', 'libardour', ]
+ obj.use = [ 'libpbd', 'libardour' ]
+ obj.uselib = [ 'GLIBMM', 'XML' ]
obj.install_path = None
diff --git a/doc/.gitignore b/doc/.gitignore
deleted file mode 100644
index 2ec816f..0000000
--- a/doc/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-html
-latex
diff --git a/doc/layering/.gitignore b/doc/layering/.gitignore
deleted file mode 100644
index debc120..0000000
--- a/doc/layering/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.aux
-*.pdf
-*.log
diff --git a/doc/updating_waf.txt b/doc/updating_waf.txt
index 622a0f6..69c1225 100644
--- a/doc/updating_waf.txt
+++ b/doc/updating_waf.txt
@@ -1,7 +1,15 @@
-Download waf (http://code.google.com/p/waf/)
+Download waf (https://waf.io/)
+
autowaf.py is present in the tools directory of the Ardour source code.
+a patch for C++11/clang can be found in tools/waflib.patch (needed for waf 1.8.19)
+
+Current waf is build as follows;
-From within the waf source tree, run:
+ARDOURSRC=`pwd`
+cd /tmp
+curl https://waf.io/waf-1.6.11.tar.bz2 | tar xj
+cd waf-1.6.11
-./waf-light -v --make-waf --tools=misc,doxygen,/path/to/autowaf.py --prelude=''
-cp ./waf /path/to/ardour/3.0/waf
+patch -p1 < $ARDOURSRC/tools/waflib.patch
+./waf-light -v --make-waf --tools=misc,doxygen,$ARDOURSRC/tools/autowaf.py --prelude=''
+cp ./waf $ARDOURSRC/waf
diff --git a/gtk2_ardour/about.cc b/gtk2_ardour/about.cc
index 09781f1..72bccfd 100644
--- a/gtk2_ardour/about.cc
+++ b/gtk2_ardour/about.cc
@@ -36,7 +36,7 @@
#include "configinfo.h"
#include "rgb_macros.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#ifdef WAF_BUILD
#include "gtk2ardour-version.h"
@@ -124,6 +124,7 @@ static const gchar * paypal_xpm[] = {
#endif
static const char* authors[] = {
+ N_("Fons Adriaensen"),
N_("Brian Ahr"),
N_("John Anderson"),
N_("Marcus Andersson"),
@@ -175,6 +176,7 @@ static const char* authors[] = {
N_("Jack O'Quin"),
N_("Pavel Potocek"),
N_("Nimal Ratnayake"),
+ N_("Julien Rivaud"),
N_("David Robillard"),
N_("Julien Roger"),
N_("Taybin Rutkin"),
@@ -613,16 +615,22 @@ About::About ()
codename = "";
}
+#ifndef NDEBUG
+ const std::string suffix = _(" - debug");
+#else
+ const std::string suffix = "";
+#endif
+
set_translator_credits (t);
set_copyright (_("Copyright (C) 1999-2015 Paul Davis\n"));
set_license (gpl);
set_name (X_("Ardour"));
set_website (X_("http://ardour.org/"));
set_website_label (_("http://ardour.org/"));
- set_version ((string_compose(_("%1%2\n(built from revision %3)\n%4"),
+ set_version ((string_compose(_("%1%2\n(rev %3)\n%4%5"),
VERSIONSTRING,
codename,
- revision, cpu_arch)));
+ revision, cpu_arch, suffix)));
Gtk::Button* config_button = manage (new Button (_("Config")));
diff --git a/gtk2_ardour/actions.cc b/gtk2_ardour/actions.cc
index ea6cc4b..1edbcaf 100644
--- a/gtk2_ardour/actions.cc
+++ b/gtk2_ardour/actions.cc
@@ -37,7 +37,7 @@
#include "gtkmm2ext/actions.h"
#include "actions.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -45,23 +45,23 @@ using namespace Glib;
using namespace PBD;
using namespace ARDOUR;
-vector<RefPtr<Gtk::Action> > ActionManager::session_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::write_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::region_list_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::track_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::point_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::time_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::line_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::playlist_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::mouse_edit_point_requires_canvas_actions;
-
-vector<RefPtr<Gtk::Action> > ActionManager::range_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::engine_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::engine_opposite_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::transport_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::edit_point_in_region_sensitive_actions;
-
-static Glib::RefPtr<UIManager> ui_manager;
+typedef std::vector<RefPtr<Gtk::Action> > RelatedActions;
+
+RelatedActions ActionManager::session_sensitive_actions;
+RelatedActions ActionManager::write_sensitive_actions;
+RelatedActions ActionManager::region_list_selection_sensitive_actions;
+RelatedActions ActionManager::plugin_selection_sensitive_actions;
+RelatedActions ActionManager::track_selection_sensitive_actions;
+RelatedActions ActionManager::point_selection_sensitive_actions;
+RelatedActions ActionManager::time_selection_sensitive_actions;
+RelatedActions ActionManager::line_selection_sensitive_actions;
+RelatedActions ActionManager::playlist_selection_sensitive_actions;
+RelatedActions ActionManager::mouse_edit_point_requires_canvas_actions;
+RelatedActions ActionManager::range_sensitive_actions;
+RelatedActions ActionManager::engine_sensitive_actions;
+RelatedActions ActionManager::engine_opposite_sensitive_actions;
+RelatedActions ActionManager::transport_sensitive_actions;
+RelatedActions ActionManager::edit_point_in_region_sensitive_actions;
void
ActionManager::init ()
diff --git a/gtk2_ardour/actions.h b/gtk2_ardour/actions.h
index 1335834..6900e83 100644
--- a/gtk2_ardour/actions.h
+++ b/gtk2_ardour/actions.h
@@ -37,6 +37,7 @@ namespace ActionManager {
extern std::vector<Glib::RefPtr<Gtk::Action> > session_sensitive_actions;
extern std::vector<Glib::RefPtr<Gtk::Action> > write_sensitive_actions;
extern std::vector<Glib::RefPtr<Gtk::Action> > region_list_selection_sensitive_actions;
+ extern std::vector<Glib::RefPtr<Gtk::Action> > plugin_selection_sensitive_actions;
extern std::vector<Glib::RefPtr<Gtk::Action> > track_selection_sensitive_actions;
extern std::vector<Glib::RefPtr<Gtk::Action> > point_selection_sensitive_actions;
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc
index 0a14647..90ccff5 100644
--- a/gtk2_ardour/add_route_dialog.cc
+++ b/gtk2_ardour/add_route_dialog.cc
@@ -28,18 +28,22 @@
#include "pbd/error.h"
#include "pbd/convert.h"
+
#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/doi.h"
#include "ardour/plugin_manager.h"
#include "ardour/profile.h"
#include "ardour/template_utils.h"
#include "ardour/route_group.h"
#include "ardour/session.h"
+#include "ardour/vca.h"
#include "utils.h"
#include "add_route_dialog.h"
#include "route_group_dialog.h"
-#include "i18n.h"
+#include "tooltips.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace Gtkmm2ext;
@@ -51,7 +55,7 @@ using namespace ARDOUR_UI_UTILS;
std::vector<std::string> AddRouteDialog::channel_combo_strings;
AddRouteDialog::AddRouteDialog ()
- : ArdourDialog (_("Add Track or Bus"))
+ : ArdourDialog (_("Add Track/Bus/VCA"))
, routes_adjustment (1, 1, 128, 1, 4)
, routes_spinner (routes_adjustment)
, configuration_label (_("Configuration:"))
@@ -59,33 +63,34 @@ AddRouteDialog::AddRouteDialog ()
, instrument_label (_("Instrument:"))
{
set_name ("AddRouteDialog");
- set_modal (true);
set_skip_taskbar_hint (true);
set_resizable (false);
+ set_position (WIN_POS_MOUSE);
name_template_entry.set_name (X_("AddRouteDialogNameTemplateEntry"));
// routes_spinner.set_name (X_("AddRouteDialogSpinner"));
channel_combo.set_name (X_("ChannelCountSelector"));
mode_combo.set_name (X_("ChannelCountSelector"));
- refill_channel_setups ();
- refill_route_groups ();
refill_track_modes ();
- channel_combo.set_active_text (channel_combo_strings.front());
-
track_bus_combo.append_text (_("Audio Tracks"));
track_bus_combo.append_text (_("MIDI Tracks"));
track_bus_combo.append_text (_("Audio+MIDI Tracks"));
- track_bus_combo.append_text (_("Busses"));
+ track_bus_combo.append_text (_("Audio Busses"));
+ track_bus_combo.append_text (_("MIDI Busses"));
+ track_bus_combo.append_text (_("VCA Masters"));
track_bus_combo.set_active (0);
insert_at_combo.append_text (_("First"));
insert_at_combo.append_text (_("Before Selection"));
insert_at_combo.append_text (_("After Selection"));
insert_at_combo.append_text (_("Last"));
+ insert_at_combo.set_active (3);
- insert_at_combo.set_active (1);
+ strict_io_combo.append_text (_("Flexible-I/O"));
+ strict_io_combo.append_text (_("Strict-I/O"));
+ strict_io_combo.set_active (Config->get_strict_io () ? 1 : 0);
VBox* vbox = manage (new VBox);
Gtk::Label* l;
@@ -135,16 +140,10 @@ AddRouteDialog::AddRouteDialog ()
table2->attach (channel_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
++n;
- if (!ARDOUR::Profile->get_sae ()) {
-
- /* Track mode */
-
- mode_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
- table2->attach (mode_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
- table2->attach (mode_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
- ++n;
-
- }
+ mode_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
+ table2->attach (mode_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ table2->attach (mode_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
+ ++n;
instrument_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
table2->attach (instrument_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
@@ -164,6 +163,20 @@ AddRouteDialog::AddRouteDialog ()
table2->attach (insert_at_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
++n;
+ /* New Route's Routing is.. */
+
+ if (Profile->get_mixbus ()) {
+ strict_io_combo.set_active (1);
+ } else {
+ l = manage (new Label (_("Output Ports:"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
+ table2->attach (*l, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ table2->attach (strict_io_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
+
+ ARDOUR_UI_UTILS::set_tooltip (strict_io_combo,
+ _("With strict-i/o enabled, Effect Processors will not modify the number of channels on a track. The number of output channels will always match the number of input channels."));
+ ++n;
+ }
+
options_box->pack_start (*table2, false, true);
vbox->pack_start (*options_box, false, true);
@@ -204,29 +217,24 @@ AddRouteDialog::TypeWanted
AddRouteDialog::type_wanted() const
{
std::string str = track_bus_combo.get_active_text();
- if (str == _("Busses")) {
+ if (str == _("Audio Busses")) {
return AudioBus;
+ } else if (str == _("MIDI Busses")){
+ return MidiBus;
} else if (str == _("MIDI Tracks")){
return MidiTrack;
} else if (str == _("Audio+MIDI Tracks")) {
return MixedTrack;
- } else {
+ } else if (str == _("Audio Tracks")) {
return AudioTrack;
+ } else {
+ return VCAMaster;
}
}
void
AddRouteDialog::maybe_update_name_template_entry ()
{
- if (
- name_template_entry.get_text() != "" &&
- name_template_entry.get_text() != _("Audio") &&
- name_template_entry.get_text() != _("MIDI") &&
- name_template_entry.get_text() != _("Audio+MIDI") &&
- name_template_entry.get_text() != _("Bus")) {
- return;
- }
-
switch (type_wanted()) {
case AudioTrack:
name_template_entry.set_text (_("Audio"));
@@ -238,8 +246,12 @@ AddRouteDialog::maybe_update_name_template_entry ()
name_template_entry.set_text (_("Audio+MIDI"));
break;
case AudioBus:
+ case MidiBus:
name_template_entry.set_text (_("Bus"));
break;
+ case VCAMaster:
+ name_template_entry.set_text (VCA::default_name_template());
+ break;
}
}
@@ -254,6 +266,9 @@ AddRouteDialog::track_type_chosen ()
configuration_label.set_sensitive (true);
mode_label.set_sensitive (true);
instrument_label.set_sensitive (false);
+ route_group_combo.set_sensitive (true);
+ strict_io_combo.set_sensitive (true);
+ insert_at_combo.set_sensitive (true);
break;
case MidiTrack:
channel_combo.set_sensitive (false);
@@ -262,9 +277,12 @@ AddRouteDialog::track_type_chosen ()
configuration_label.set_sensitive (false);
mode_label.set_sensitive (false);
instrument_label.set_sensitive (true);
+ route_group_combo.set_sensitive (true);
+ strict_io_combo.set_sensitive (true);
+ insert_at_combo.set_sensitive (true);
break;
case MixedTrack:
- {
+ {
MessageDialog msg (_("Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use both audio and MIDI input data\n\n"
"If you do not plan to use such a plugin, then use a normal audio or MIDI track instead."),
true, MESSAGE_INFO, BUTTONS_OK, true);
@@ -277,6 +295,9 @@ AddRouteDialog::track_type_chosen ()
configuration_label.set_sensitive (true);
mode_label.set_sensitive (true);
instrument_label.set_sensitive (true);
+ route_group_combo.set_sensitive (true);
+ strict_io_combo.set_sensitive (true);
+ insert_at_combo.set_sensitive (true);
break;
case AudioBus:
mode_combo.set_sensitive (false);
@@ -285,6 +306,30 @@ AddRouteDialog::track_type_chosen ()
configuration_label.set_sensitive (true);
mode_label.set_sensitive (true);
instrument_label.set_sensitive (false);
+ route_group_combo.set_sensitive (true);
+ strict_io_combo.set_sensitive (true);
+ insert_at_combo.set_sensitive (true);
+ break;
+ case VCAMaster:
+ mode_combo.set_sensitive (false);
+ channel_combo.set_sensitive (false);
+ instrument_combo.set_sensitive (false);
+ configuration_label.set_sensitive (false);
+ mode_label.set_sensitive (false);
+ instrument_label.set_sensitive (false);
+ route_group_combo.set_sensitive (false);
+ strict_io_combo.set_sensitive (false);
+ insert_at_combo.set_sensitive (false);
+ break;
+ case MidiBus:
+ mode_combo.set_sensitive (false);
+ channel_combo.set_sensitive (false);
+ instrument_combo.set_sensitive (true);
+ configuration_label.set_sensitive (false);
+ mode_label.set_sensitive (true);
+ instrument_label.set_sensitive (true);
+ strict_io_combo.set_sensitive (true);
+ insert_at_combo.set_sensitive (true);
break;
}
@@ -306,7 +351,8 @@ AddRouteDialog::name_template_is_default() const
if (n == _("Audio") ||
n == _("MIDI") ||
n == _("Audio+MIDI") ||
- n == _("Bus")) {
+ n == _("Bus") ||
+ n == VCA::default_name_template()) {
return true;
}
@@ -325,11 +371,8 @@ AddRouteDialog::refill_track_modes ()
vector<string> s;
s.push_back (_("Normal"));
-
- if (!ARDOUR::Profile->get_sae ()) {
- s.push_back (_("Non Layered"));
- s.push_back (_("Tape"));
- }
+ s.push_back (_("Non Layered"));
+ s.push_back (_("Tape"));
set_popdown_strings (mode_combo, s);
mode_combo.set_active_text (s.front());
@@ -338,10 +381,6 @@ AddRouteDialog::refill_track_modes ()
ARDOUR::TrackMode
AddRouteDialog::mode ()
{
- if (ARDOUR::Profile->get_sae()) {
- return ARDOUR::Normal;
- }
-
std::string str = mode_combo.get_active_text();
if (str == _("Normal")) {
return ARDOUR::Normal;
@@ -376,6 +415,7 @@ AddRouteDialog::channels ()
ret.set (DataType::MIDI, 0);
break;
+ case MidiBus:
case MidiTrack:
ret.set (DataType::AUDIO, 0);
ret.set (DataType::MIDI, 1);
@@ -391,6 +431,8 @@ AddRouteDialog::channels ()
}
ret.set (DataType::MIDI, 1);
break;
+ default:
+ break;
}
return ret;
@@ -425,6 +467,9 @@ AddRouteDialog::refill_channel_setups ()
ChannelSetup chn;
route_templates.clear ();
+
+ string channel_current_choice = channel_combo.get_active_text();
+
channel_combo_strings.clear ();
channel_setups.clear ();
@@ -441,56 +486,59 @@ AddRouteDialog::refill_channel_setups ()
ARDOUR::find_route_templates (route_templates);
- if (!ARDOUR::Profile->get_sae()) {
- if (!route_templates.empty()) {
- vector<string> v;
- for (vector<TemplateInfo>::iterator x = route_templates.begin(); x != route_templates.end(); ++x) {
- chn.name = x->name;
- chn.channels = 0;
- chn.template_path = x->path;
- channel_setups.push_back (chn);
- }
+ if (!route_templates.empty()) {
+ vector<string> v;
+ for (vector<TemplateInfo>::iterator x = route_templates.begin(); x != route_templates.end(); ++x) {
+ chn.name = x->name;
+ chn.channels = 0;
+ chn.template_path = x->path;
+ channel_setups.push_back (chn);
}
+ }
- /* clear template path for the rest */
+ /* clear template path for the rest */
- chn.template_path = "";
+ chn.template_path = "";
- chn.name = _("3 Channel");
- chn.channels = 3;
- channel_setups.push_back (chn);
+ chn.name = _("3 Channel");
+ chn.channels = 3;
+ channel_setups.push_back (chn);
- chn.name = _("4 Channel");
- chn.channels = 4;
- channel_setups.push_back (chn);
+ chn.name = _("4 Channel");
+ chn.channels = 4;
+ channel_setups.push_back (chn);
- chn.name = _("5 Channel");
- chn.channels = 5;
- channel_setups.push_back (chn);
+ chn.name = _("5 Channel");
+ chn.channels = 5;
+ channel_setups.push_back (chn);
- chn.name = _("6 Channel");
- chn.channels = 6;
- channel_setups.push_back (chn);
+ chn.name = _("6 Channel");
+ chn.channels = 6;
+ channel_setups.push_back (chn);
- chn.name = _("8 Channel");
- chn.channels = 8;
- channel_setups.push_back (chn);
+ chn.name = _("8 Channel");
+ chn.channels = 8;
+ channel_setups.push_back (chn);
- chn.name = _("12 Channel");
- chn.channels = 12;
- channel_setups.push_back (chn);
+ chn.name = _("12 Channel");
+ chn.channels = 12;
+ channel_setups.push_back (chn);
- chn.name = _("Custom");
- chn.channels = 0;
- channel_setups.push_back (chn);
- }
+ chn.name = _("Custom");
+ chn.channels = 0;
+ channel_setups.push_back (chn);
for (ChannelSetups::iterator i = channel_setups.begin(); i != channel_setups.end(); ++i) {
channel_combo_strings.push_back ((*i).name);
}
set_popdown_strings (channel_combo, channel_combo_strings);
- channel_combo.set_active_text (channel_combo_strings.front());
+
+ if (!channel_current_choice.empty()) {
+ channel_combo.set_active_text (channel_current_choice);
+ } else {
+ channel_combo.set_active_text (channel_combo_strings.front());
+ }
}
void
@@ -509,6 +557,11 @@ AddRouteDialog::route_group ()
return _session->route_group_by_name (route_group_combo.get_active_text());
}
+bool
+AddRouteDialog::use_strict_io() {
+ return strict_io_combo.get_active_row_number () == 1;
+}
+
void
AddRouteDialog::refill_route_groups ()
{
@@ -531,19 +584,34 @@ AddRouteDialog::group_changed ()
{
if (_session && route_group_combo.get_active_text () == _("New Group...")) {
RouteGroup* g = new RouteGroup (*_session, "");
- RouteGroupDialog d (g, true);
-
- if (d.do_run ()) {
- delete g;
- route_group_combo.set_active (2);
- } else {
- if (_session) {
- _session->add_route_group (g);
- }
- add_route_group (g);
- route_group_combo.set_active (3);
+ RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+ d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &AddRouteDialog::new_group_dialog_finished), d));
+ d->present();
+ }
+}
+
+void
+AddRouteDialog::new_group_dialog_finished (int r, RouteGroupDialog* d)
+{
+ if (r == RESPONSE_OK) {
+
+ if (!d->name_check()) {
+ return;
}
+
+ if (_session) {
+ _session->add_route_group (d->group());
+ }
+
+ add_route_group (d->group());
+ route_group_combo.set_active (3);
+ } else {
+ delete d->group ();
+ route_group_combo.set_active (2);
}
+
+ delete_when_idle (d);
}
AddRouteDialog::InsertAt
diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h
index eb38338..6856220 100644
--- a/gtk2_ardour/add_route_dialog.h
+++ b/gtk2_ardour/add_route_dialog.h
@@ -42,6 +42,7 @@
#include "instrument_selector.h"
class Editor;
+class RouteGroupDialog;
class AddRouteDialog : public ArdourDialog
{
@@ -49,19 +50,21 @@ class AddRouteDialog : public ArdourDialog
AddRouteDialog ();
~AddRouteDialog ();
- enum TypeWanted {
+ enum TypeWanted {
AudioTrack,
MidiTrack,
MixedTrack,
- AudioBus
+ AudioBus,
+ MidiBus,
+ VCAMaster,
};
- TypeWanted type_wanted() const;
+ TypeWanted type_wanted() const;
- ARDOUR::ChanCount channels ();
+ ARDOUR::ChanCount channels ();
int count ();
- std::string name_template () const;
- bool name_template_is_default () const;
+ std::string name_template () const;
+ bool name_template_is_default () const;
std::string track_template ();
ARDOUR::PluginInfoPtr requested_instrument ();
@@ -74,6 +77,7 @@ class AddRouteDialog : public ArdourDialog
Last
};
InsertAt insert_at();
+ bool use_strict_io();
private:
Gtk::Entry name_template_entry;
@@ -87,8 +91,8 @@ class AddRouteDialog : public ArdourDialog
Gtk::ComboBoxText mode_combo;
Gtk::ComboBoxText route_group_combo;
InstrumentSelector instrument_combo;
- Gtk::Label insert_at_label;
Gtk::ComboBoxText insert_at_combo;
+ Gtk::ComboBoxText strict_io_combo;
std::vector<ARDOUR::TemplateInfo> route_templates;
@@ -104,7 +108,7 @@ class AddRouteDialog : public ArdourDialog
void maybe_update_name_template_entry ();
void reset_template_option_visibility ();
-
+ void new_group_dialog_finished (int, RouteGroupDialog*);
void on_show ();
struct ChannelSetup {
diff --git a/gtk2_ardour/add_video_dialog.cc b/gtk2_ardour/add_video_dialog.cc
index 5fc53c7..bd94c37 100644
--- a/gtk2_ardour/add_video_dialog.cc
+++ b/gtk2_ardour/add_video_dialog.cc
@@ -34,8 +34,9 @@
#include "ardour_ui.h"
#include "add_video_dialog.h"
+#include "ardour_http.h"
#include "utils_videotl.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
@@ -108,7 +109,7 @@ AddVideoDialog::AddVideoDialog (Session* s)
/* file chooser */
chooser.set_border_width (4);
-#ifdef GTKOSX
+#ifdef __APPLE__
/* some broken redraw behaviour - this is a bandaid */
chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw));
#endif
@@ -504,7 +505,7 @@ AddVideoDialog::harvid_request(std::string u)
harvid_list->clear();
- char *res = a3_curl_http_get(url, &status);
+ char* res = ArdourCurl::http_get (url, &status);
if (status != 200) {
printf("request failed\n"); // XXX
harvid_path.set_text(" - request failed -");
@@ -684,7 +685,7 @@ AddVideoDialog::request_preview(std::string u)
, (long long) (video_duration * seek_slider.get_value() / 1000.0)
, clip_width, clip_height, u.c_str());
- char *data = a3_curl_http_get(url, NULL);
+ char* data = ArdourCurl::http_get (url, NULL);
if (!data) {
printf("image preview request failed %s\n", url);
imgbuf->fill(RGBA_TO_UINT(0,0,0,255));
diff --git a/gtk2_ardour/ambiguous_file_dialog.cc b/gtk2_ardour/ambiguous_file_dialog.cc
index 98d0eae..900ab4e 100644
--- a/gtk2_ardour/ambiguous_file_dialog.cc
+++ b/gtk2_ardour/ambiguous_file_dialog.cc
@@ -20,7 +20,7 @@
#include <gtkmm/label.h>
#include "pbd/compose.h"
#include "ambiguous_file_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/analysis_window.cc b/gtk2_ardour/analysis_window.cc
index 4ed17b4..a1a98a8 100644
--- a/gtk2_ardour/analysis_window.cc
+++ b/gtk2_ardour/analysis_window.cc
@@ -36,25 +36,19 @@
#include "selection.h"
#include "audio_region_view.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
-AnalysisWindow::AnalysisWindow() :
-
- source_selection_label (_("Signal source")),
- source_selection_ranges_rb (_("Selected ranges")),
- source_selection_regions_rb (_("Selected regions")),
-
- display_model_label (_("Display model")),
- display_model_composite_separate_rb (_("Composite graphs for each track")),
- display_model_composite_all_tracks_rb (_("Composite graph of all tracks")),
-
- show_minmax_button (_("Show frequency power range")),
- show_normalized_button (_("Normalize values")),
-
- fft_graph (16384)
+AnalysisWindow::AnalysisWindow()
+ : source_selection_label (_("Signal source"))
+ , source_selection_ranges_rb (_("Selected ranges"))
+ , source_selection_regions_rb (_("Selected regions"))
+ , show_minmax_button (_("Show frequency power range"))
+ , show_normalized_button (_("Fit dB range"))
+ , show_proportional_button (_("Proportional Spectrum, -18dB"))
+ , fft_graph (16384)
{
set_name(_("FFT analysis window"));
set_title (_("Spectral Analysis"));
@@ -107,49 +101,31 @@ AnalysisWindow::AnalysisWindow() :
sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::source_selection_changed), &source_selection_regions_rb));
}
- vbox.pack_start(hseparator1, false, false);
-
- // "Display model"
- vbox.pack_start(display_model_label, false, false);
- {
- Gtk::RadioButtonGroup group = display_model_composite_separate_rb.get_group();
- display_model_composite_all_tracks_rb.set_group (group);
-
- display_model_composite_separate_rb.set_active();
-
- vbox.pack_start (display_model_composite_separate_rb, false, false);
- vbox.pack_start (display_model_composite_all_tracks_rb, false, false);
-
- // "Composite graphs for all tracks"
- display_model_composite_separate_rb.signal_toggled().connect (
- sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::display_model_changed), &display_model_composite_separate_rb));
-
- // "Composite graph of all tracks"
- display_model_composite_all_tracks_rb.signal_toggled().connect (
- sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::display_model_changed), &display_model_composite_all_tracks_rb));
- }
-
// Analyze button
refresh_button.set_name("EditorGTKButton");
refresh_button.set_label(_("Re-analyze data"));
+
refresh_button.signal_clicked().connect ( sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::analyze_data), &refresh_button));
vbox.pack_start(refresh_button, false, false, 10);
+ vbox.pack_start(hseparator1, false, false);
// Feature checkboxes
- // minmax
- show_minmax_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_minmax_changed));
- vbox.pack_start(show_minmax_button, false, false);
-
- // normalize
+ // normalize, fit y-range
show_normalized_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_normalized_changed));
vbox.pack_start(show_normalized_button, false, false);
+ // minmax
+ show_minmax_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_minmax_changed));
+ vbox.pack_start(show_minmax_button, false, false);
+ // pink-noise / proportional spectrum
+ show_proportional_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_proportional_changed));
+ vbox.pack_start(show_proportional_button, false, false);
@@ -186,6 +162,12 @@ AnalysisWindow::show_normalized_changed()
}
void
+AnalysisWindow::show_proportional_changed()
+{
+ fft_graph.set_show_proportioanl(show_proportional_button.get_active());
+}
+
+void
AnalysisWindow::set_rangemode()
{
source_selection_ranges_rb.set_active(true);
@@ -273,7 +255,7 @@ AnalysisWindow::analyze_data (Gtk::Button * /*button*/)
// std::cerr << "Analyzing ranges on track " << rui->route()->name() << std::endl;
- FFTResult *res = fft_graph.prepareResult(rui->color(), rui->route()->name());
+ FFTResult *res = fft_graph.prepareResult(rui->route_color(), rui->route()->name());
for (std::list<AudioRange>::iterator j = ts.begin(); j != ts.end(); ++j) {
int n;
@@ -308,7 +290,7 @@ AnalysisWindow::analyze_data (Gtk::Button * /*button*/)
Gtk::TreeModel::Row newrow = *(tlmodel)->append();
newrow[tlcols.trackname] = rui->route()->name();
newrow[tlcols.visible] = true;
- newrow[tlcols.color] = rui->color();
+ newrow[tlcols.color] = rui->route_color ();
newrow[tlcols.graph] = res;
}
} else if (source_selection_regions_rb.get_active()) {
diff --git a/gtk2_ardour/analysis_window.h b/gtk2_ardour/analysis_window.h
index af540b9..cee37b3 100644
--- a/gtk2_ardour/analysis_window.h
+++ b/gtk2_ardour/analysis_window.h
@@ -46,7 +46,6 @@ namespace ARDOUR {
class Session;
}
-
class AnalysisWindow : public Gtk::Window, public ARDOUR::SessionHandlePtr
{
public:
@@ -65,10 +64,12 @@ private:
void source_selection_changed (Gtk::RadioButton *);
void display_model_changed (Gtk::RadioButton *);
- void show_minmax_changed ();
- void show_normalized_changed ();
- void analyze_data (Gtk::Button *);
+ void show_minmax_changed ();
+ void show_normalized_changed ();
+ void show_proportional_changed ();
+
+ void analyze_data (Gtk::Button *);
struct TrackListColumns : public Gtk::TreeModel::ColumnRecord {
public:
@@ -95,22 +96,16 @@ private:
Gtk::Label source_selection_label;
-
Gtk::RadioButton source_selection_ranges_rb;
Gtk::RadioButton source_selection_regions_rb;
Gtk::HSeparator hseparator1;
- Gtk::Label display_model_label;
- Gtk::RadioButton display_model_composite_separate_rb;
- Gtk::RadioButton display_model_composite_all_tracks_rb;
-
Gtk::Button refresh_button;
-
Gtk::CheckButton show_minmax_button;
Gtk::CheckButton show_normalized_button;
-
+ Gtk::CheckButton show_proportional_button;
// The graph
FFTGraph fft_graph;
diff --git a/gtk2_ardour/appdata/po/zh.po b/gtk2_ardour/appdata/po/zh.po
new file mode 100644
index 0000000..2df3f2f
--- /dev/null
+++ b/gtk2_ardour/appdata/po/zh.po
@@ -0,0 +1,53 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Ardour 4\n"
+"POT-Creation-Date: 2015-11-06 11:59+0100\n"
+"PO-Revision-Date: 2016-03-07 09:55+0800\n"
+"Last-Translator: ä¸åé±¼ <YQ-YSY at 163.com>\n"
+"Language-Team: ä¸åé±¼ YQ-YSY at 163.com\n"
+"Language: zh\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.4\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+# Intentionally left untranslated.
+#. (itstool) path: component/name
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:6
+msgid "Ardour"
+msgstr ""
+
+# Intentionally left untranslated.
+#. (itstool) path: component/summary
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:8
+msgid "Digital Audio Workstation"
+msgstr "æ°åé³é¢å·¥ä½ç«"
+
+#. (itstool) path: description/p
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:10
+msgid ""
+"Ardour is a multi-channel digital audio workstation, allowing you to record, "
+"edit, mix and master audio and MIDI projects."
+msgstr ""
+"Ardour æ¯ä¸ä¸ªå¤å£°éæ°åé³é¢å·¥ä½ç«ï¼å
许æ¨å½å¶ï¼ç¼è¾ï¼æ··é³å¹¶ä¸ä¸»æ§é³é¢å MIDI "
+"项ç®ã"
+
+#. (itstool) path: description/p
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:14
+msgid ""
+"It is targeted at audio engineers, musicians, soundtrack editors and "
+"composers."
+msgstr "å®çåºç¨äººç¾¤éå¯¹çæ¯é³é¢å·¥ç¨å¸ãä¹å¸ã声é³è½¨éç¼è¾å¸å使²å®¶ã"
+
+#. (itstool) path: screenshot/caption
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:23
+msgid ""
+"The Editor window where you can arrange audio and MIDI data along a timeline"
+msgstr "ç¼è¾å¨çªå£æ¯æ¨å¯ä»¥æ²¿çæ¶é´çº¿æåé³é¢å MIDI æ°æ®çå°æ¹"
+
+#. (itstool) path: screenshot/caption
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:27
+msgid "The Mixer window which includes channel strips for each track and bus"
+msgstr "æ··é³å¨çªå£å
æ¬ææ¯ä¸ªé³è½¨åæ»çº¿ç声éå·¥å
·æ "
diff --git a/gtk2_ardour/ardbg-core b/gtk2_ardour/ardbg-core
new file mode 100755
index 0000000..d7c949d
--- /dev/null
+++ b/gtk2_ardour/ardbg-core
@@ -0,0 +1,14 @@
+#!/bin/sh
+COREFILE=core
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+LD_LIBRARY_PATH=$LD_LIBRARY_PATH
+export ARDOUR_INSIDE_GDB=1
+
+if test -n "`which gdb`"; then
+ exec gdb --core $COREFILE --args $TOP/$EXECUTABLE $@
+fi
+if test -n "`which lldb`"; then
+ exec lldb -c $COREFILE -- $TOP/$EXECUTABLE $@
+fi
+echo "neither gdb nor lldb was found."
diff --git a/gtk2_ardour/ardev_common.sh.in b/gtk2_ardour/ardev_common.sh.in
index e3161e0..7c6e050 100644
--- a/gtk2_ardour/ardev_common.sh.in
+++ b/gtk2_ardour/ardev_common.sh.in
@@ -10,12 +10,12 @@ libs=$TOP/@LIBS@
# can find all the components.
#
-export ARDOUR_PATH=$TOP/gtk2_ardour/icons:$TOP/gtk2_ardour/pixmaps:$TOP/build/gtk2_ardour:$TOP/gtk2_ardour:.
export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/faderport:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie:$libs/surfaces/wiimote
export ARDOUR_PANNER_PATH=$libs/panners
export ARDOUR_DATA_PATH=$TOP:$TOP/build:$TOP/gtk2_ardour:$TOP/build/gtk2_ardour:.
export ARDOUR_MIDIMAPS_PATH=$TOP/midi_maps:.
export ARDOUR_EXPORT_FORMATS_PATH=$TOP/export:.
+export ARDOUR_THEMES_PATH=$TOP/gtk2_ardour/themes:.
export ARDOUR_BACKEND_PATH=$libs/backends/jack:$libs/backends/wavesaudio:$libs/backends/dummy:$libs/backends/alsa:$libs/backends/coreaudio:$libs/backends/portaudio:$libs/backends/asio
export ARDOUR_TEST_PATH=$TOP/libs/ardour/test/data
export PBD_TEST_PATH=$TOP/libs/pbd/test
diff --git a/gtk2_ardour/ardour.keys.in b/gtk2_ardour/ardour.keys.in
new file mode 100644
index 0000000..f4312e5
--- /dev/null
+++ b/gtk2_ardour/ardour.keys.in
@@ -0,0 +1,409 @@
+; this is a template file processed by tools/fmt-bindings to generate either
+; a gtk accelmap file or a LaTeX key binding cheat sheet.
+;
+; it is the reference for any bindings or cheatsheets
+;
+;
+; FORMAT:
+; $text -> defines cheatsheet title as "text", which may contain LaTeX markup
+;
+; %group owner text -> defines a binding group called "group" which will have the title "text" on the cheatsheet.
+; may be followed by zero or more lines of descriptive text,
+; which may contain LaTeX markup. When generating native ardour
+; bindings, the definition for a binding in group "group" will
+; be placed in the "owner" block of the bindings file. The
+; "owner" field is otherwise ignored.
+;
+; If the group name starts with "-", the binding will not appear
+; on the cheetsheet.
+;
+; @group|action|binding|description -> defines an action+binding with description, as a member of a binding group
+; if group starts with '-' it will not be printed in the cheatsheet.
+; if group starts with '+' it will be printed in the cheatsheet no matter what
+; if the group is a mouse binding group, action should contain a ':', and
+; have the binding before the colon, and the target area after it
+
+;; Title
+$ARDOUR Shortcuts \linebreak Mnemonic US-Keypad
+
+;; GROUP DEFINITIONS
+
+%trans Global Transport \& Recording Control
+
+%sess Global Session \& File Handling
+
+%edit Editor Basic Editing
+
+%vis Editor Changing What's Visible
+
+%wvis Global Window Visibility
+
+%eep Editor Editing with Edit Point
+Most edit functions operate on a single "Edit Point". The edit point can be any of: playhead (default), the mouse or an active marker. The choice of Edit Point (by default) also sets the Zoom Focus.
+
+%aep Editor Aligning with the Edit Point
+Align operations move regions so that their start/end/sync point is at the edit point. "Relative" operations
+just align the first region and moves other selected regions to maintain relative positioning.
+
+%epp Editor Edit Point Playback
+
+%movp Editor Moving the Playhead
+A left click in the rulers positions the playhead unless Ardour is recording. You can use {\tt KP$\_$n} to move the
+playhead to the n-th marker.
+
+%rop Editor Region Operations
+
+%edit Editor Edit Range
+There are only a few functions that refer to an "Edit Range". The current edit range is defined using combinations of the possible edit points: Playhead, Marker or Mouse.\par
+\begin{tabular}{lll}
+{\bf Edit Point} & {\bf Active Mark?} & {\bf Edit Range} \\
+Playhead & no & from Playhead to Mouse \\
+Playhead & yes & from Playhead to Active Marker \\
+ & & \\
+Mouse & no & from Mouse to Playhead \\
+Mouse & yes & from Mouse to Active Marker \\
+ & & \\
+Marker & no & {\it No edit range defined} \\
+Marker & yes & from Active Marker to Mouse
+\end{tabular}
+
+%select Editor Selecting
+
+%ranges Editor Defining Loop, Punch Range and Tempo Changes
+
+%markers Editor Markers \& Locations
+The "move" commands all move the active marker(s). Jump to the first 9 markers using
+the keypad digits 1-9 (requires numlock).
+
+%mmode Editor Mouse Modes
+
+%mouse Editor Mouse Usage
+Right click on most objects and controls displays a context menu
+Shift+Right click deletes most objects.
+OS X users without a 3 button mouse can use {\tt Option+Ctrl+Left} to simulate "Middle" for some purposes.
+Use F1 to step through mouse modes.
+
+%mobject Editor Mouse Object Mode
+This mode provides many different operations on both regions and control points, partially depending on where you click/drag with the mouse. The "body" of a region is the area where the waveform is displayed.
+
+%mzoom Editor Mouse Zoom Mode
+%mops Editor Mouse Ops on Solo/Mute/Rec-enable
+%mopsolo Editor Mouse Ops on Solo Buttons only
+%mopsfader Editor Mouse Ops on Faders \& Plugin Controls
+
+%midi Global MIDI specific commands
+
+;; END GROUP DEFINITIONS
+
+;; punctuation
+
+ at vis|Editor/temporal-zoom-in|equal|zoom in
+ at vis|Editor/temporal-zoom-out|minus|zoom out
+ at vis|Editor/zoom-to-session|<@TERTIARY@>underscore|zoom to session
+ at eep|Editor/edit-cursor-to-previous-region-sync|apostrophe|EP to prev region sync
+ at eep|Editor/edit-cursor-to-next-region-sync|semicolon|EP to next region sync
+ at eep|Editor/cycle-edit-point|grave|next EP w/o marker
+ at eep|Editor/cycle-edit-point-with-marker|<@PRIMARY@>grave|next EP w/marker
+
+ at trans|Transport/ToggleRoll|space|toggle roll
+ at trans|Transport/PlaySelection|<@SECONDARY@>space|play edit range
+ at epp|Editor/play-from-edit-point-and-return|<@PRIMARY@><@TERTIARY@>space|play from EP \& return
+ at trans|Transport/ToggleRollMaybe|<@PRIMARY@><@SECONDARY@>space|stop (keep loop/range play)
+ at trans|Transport/ToggleRollForgetCapture|<@PRIMARY@>space|stop and destroy
+ at trans|Transport/record-roll|<@TERTIARY@>space|start recording
+
+ at edit|Editor/add-location-from-playhead|Tab|add marker
+ at edit|Editor/remove-location-from-playhead|<@PRIMARY@>nabla|add marker
+ at trans|Transport/alternate-GotoStart|Return|to start marker
+
+ at edit|Editor/editor-fade-range|slash|fade range selection
+ at rop|Region/set-fade-in-length|<@PRIMARY@>slash|set fade in length
+;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>slash|toggle fade in active
+ at rop|Region/set-fade-out-length|<@PRIMARY@>backslash|set fade out length
+;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>backslash|toggle fade out active
+
+ at eep|Region/trim-to-previous-region|<@PRIMARY@>j|trim region to end of prev region
+ at eep|Region/trim-to-next-region|<@PRIMARY@>k|trim region to start of next region
+
+ at ranges|Editor/set-loop-from-edit-range|bracketright|set loop range from edit range
+
+ at ranges|Editor/set-punch-from-edit-range|bracketleft|set punch range from edit range
+
+
+;; Alt+number row: region operations
+ at rop|Region/toggle-region-mute|<@SECONDARY@>1|mute/unmute
+ at rop|Region/naturalize-region|<@SECONDARY@>2|move to original position
+ at rop|Region/normalize-region|<@SECONDARY@>3|normalize
+ at rop|Region/reverse-region|<@SECONDARY@>4|reverse
+ at rop|Region/quantize-region|<@SECONDARY@>5|quantize MIDI notes \linebreak[4] in selected region(s)
+ at rop|Region/boost-region-gain|<@SECONDARY@>6|increase region gain
+ at rop|Region/cut-region-gain|<@SECONDARY@>7|reduce region gain
+ at rop|Region/pitch-shift-region|<@SECONDARY@>8|transpose
+ at rop|Region/lower-region|<@SECONDARY@>9|lower region layer
+ at rop|Region/raise-region|<@SECONDARY@>0|raise region layer
+
+;; letters
+;; TOP ROW
+
+ at sess|Common/Quit|<@PRIMARY@>q|quit
+ at sess|Common/Hide|<@PRIMARY@>h|hide
+ at movp|Editor/jump-forward-to-mark|w|to next mark
+ at movp|Editor/jump-backward-to-mark|q|to previous mark
+
+;; note that ctrl-w is special and consumed by the keyboard snooper
+
+ at select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP
+ at rop|Region/export-region|<@PRIMARY@><@SECONDARY@>e|export selected region(s)
+ at sess|Main/ExportAudio|<@SECONDARY@>e|export session
+ at select|Editor/select-all-after-edit-cursor|<@PRIMARY@><@TERTIARY@>e|select all after EP
+ at vis|Editor/show-editor-mixer|<@TERTIARY@>e|toggle editor window mixer
+ at mmode|MouseMode/set-mouse-mode-range|r|range mode
+ at edit|Editor/redo|<@PRIMARY@>r|redo
+ at trans|Transport/Record|<@TERTIARY@>r|engage record
+ at mmode|MouseMode/set-mouse-mode-timefx|t|timefx mode
+ at eep|Editor/select-all-tracks|<@PRIMARY@>t|select all tracks
+ at mmode|MouseMode/set-mouse-mode-object-range|y|link object/range tools
+ at edit|Editor/alternate-redo|<@PRIMARY@>y|redo
+ at select|Editor/select-all-between-cursors|<@PRIMARY@>u|all enclosed by edit range
+ at select|Editor/select-all-within-cursors|u|all present in edit range
+ at eep|Region/insert-region-from-region-list|i|insert from region list
+ at select|Editor/invert-selection|<@TERTIARY@>i|invert selection
+ at edit|Editor/addExistingAudioFiles|<@PRIMARY@>i|import audio files
+ at edit|Editor/toggle-midi-input-active|<@SECONDARY@>i|toggle sel. track MIDI input
+ at mmode|MouseMode/set-mouse-mode-object|g|object mode
+ at mmode|MouseMode/set-mouse-mode-content|e|content mode
+ at sess|Main/Open|<@PRIMARY@>o|open an existing session
+ at sess|Main/Recent|<@PRIMARY@><@TERTIARY@>o|open a recent session
+ at wvis|Window/toggle-session-options-editor|<@SECONDARY@>o|toggle preferences dialog
+ at edit|Editor/set-playhead|p|set playhead position
+ at wvis|Window/toggle-audio-connection-manager|<@SECONDARY@>p|toggle global audio patchbay
+ at midi|MIDI/panic|<@PRIMARY@><@SECONDARY@>p|MIDI panic (stop all notes etc)
+
+;; MIDDLE ROW
+
+ at aep|Region/align-regions-sync-relative|a|align sync points (relative)
+ at select|Editor/select-all-objects|<@PRIMARY@>a|select all objects
+ at aep|Region/align-regions-end|<@SECONDARY@>a|align end(s)
+ at aep|Region/align-regions-sync|<@TERTIARY@>a|align sync points
+ at aep|Region/align-regions-start|<@PRIMARY@><@SECONDARY@>a|align start(s)
+ at aep|Region/align-regions-start-relative|<@PRIMARY@><@TERTIARY@>a|align start(s) relative
+ at rop|Region/split-region|s|split
+ at sess|Common/Save|<@PRIMARY@>s|save session
+ at sess|Main/SnapshotStay|<@PRIMARY@><@TERTIARY@>s|snapshot session
+ at edit|Editor/track-solo-toggle|<@SECONDARY@>s|toggle track solo status
+ at mmode|MouseMode/set-mouse-mode-draw|d|note-draw mode
+ at rop|Region/duplicate-region|<@SECONDARY@>d|duplicate region (once)
+ at rop|Region/multi-duplicate-region|<@TERTIARY@>d|duplicate region (multi)
+ at select|Editor/select-all-in-punch-range|<@PRIMARY@>d|select all in punch range
+ at vis|Editor/fit-selection|f|fit selection vertically
+ at edit|Editor/toggle-follow-playhead|<@PRIMARY@>f|toggle playhead tracking
+ at edit|Region/show-rhythm-ferret|<@SECONDARY@>f|show rhythm ferret window
+ at trans|Transport/ToggleFollowEdits|<@TERTIARY@>f|toggle playhead follows edits
+ at wvis|Common/ToggleMaximalEditor|<@PRIMARY@><@SECONDARY@>f|maximise editor space
+ at wvis|Common/ToggleMaximalMixer|<@PRIMARY@><@TERTIARY@>f|maximise mixer space
+ at epp|Region/play-selected-regions|h|play selected region(s)
+ at eep|Region/trim-front|j|trim front
+ at eep|Region/trim-back|k|trim back
+ at wvis|Window/toggle-key-editor|<@SECONDARY@>k|toggle key bindings editor
+ at trans|Transport/Loop|l|loop play (the loop range)
+ at select|Editor/select-all-in-loop-range|<@PRIMARY@>l|select all in loop range
+ at wvis|Window/toggle-locations|<@SECONDARY@>l| toggle locations dialog
+
+;; BOTTOM ROW
+
+ at mmode|Editor/zoom-to-selection|z|zoom to selection
+ at edit|Editor/undo|<@PRIMARY@>z|undo
+ at edit|Editor/alternate-alternate-redo|<@PRIMARY@><@TERTIARY@>z|redo
+ at vis|Editor/toggle-zoom|<@TERTIARY@>z|toggle last 2 zoom states
+ at mmode|MouseMode/set-mouse-mode-cut|c|cut mode
+ at edit|Editor/editor-cut|<@PRIMARY@>x|cut
+ at edit|Editor/editor-copy|<@PRIMARY@>c|copy
+ at wvis|Window/toggle-big-clock|<@SECONDARY@>c|toggle big clock
+ at -edit|Editor/crop|<@PRIMARY@><@TERTIARY@>c|crop
+ at rop|Region/set-region-sync-position|v|set region sync point
+ at edit|Editor/editor-paste|<@PRIMARY@>v|paste
+ at edit|Editor/ToggleJadeo|<@SECONDARY@>v|video window
+ at wvis|Common/toggle-meterbridge|<@SECONDARY@>b|show meter bridge
+ at edit|Editor/track-record-enable-toggle|<@TERTIARY@>b|toggle track rec-enable
+ at sess|Main/AddTrackBus|<@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses)
+ at sess|Main/New|<@PRIMARY@>n|open a new session
+ at wvis|Window/toggle-midi-connection-manager|<@SECONDARY@><@TERTIARY@>m|toggle global midi patchbay
+ at wvis|Common/toggle-editor-and-mixer|<@SECONDARY@>m|toggle editor & mixer
+
+;; arrow keys, navigation etc.
+
+ at vis|Editor/step-tracks-up|Up|scroll up (step)
+ at trans|Transport/TransitionToRoll|<@TERTIARY@>Up|transition to roll
+ at select|Editor/select-prev-route|<@SECONDARY@>Up|select previous track/bus
+ at vis|Editor/move-selected-tracks-up|<@PRIMARY@>Up|move selected tracks up
+
+ at vis|Editor/step-tracks-down|Down|scroll down (step)
+ at trans|Transport/TransitionToReverse|<@TERTIARY@>Down|transition to reverse
+ at select|Editor/select-next-route|<@SECONDARY@>Down|select next track/bus
+ at vis|Editor/move-selected-tracks-down|<@PRIMARY@>Down|move selected tracks down
+
+ at movp|Editor/playhead-to-previous-region-boundary|Left|to previous region edge
+;@movp|Editor/playhead-to-previous-region-boundary-noselection|<@LEVEL4@>Left|to previous edge \linebreak[4] (ignoring selection)
+ at movp|Editor/playhead-to-previous-region-sync|<@PRIMARY@><@SECONDARY@>Left|to previous region sync
+ at movp|Editor/tab-to-transient-backwards|<@PRIMARY@>Left|to previous transient
+ at movp|Editor/nudge-playhead-backward|<@SECONDARY@>Left|nudge backward
+ at movp|Editor/playhead-backward-to-grid|<@SECONDARY@><@TERTIARY@>Left|to previous grid point
+ at trans|Transport/Rewind|<@TERTIARY@>Left|rewind
+ at markers|Editor/selected-marker-to-previous-region-boundary|<@PRIMARY@><@TERTIARY@>Left|move to prev region edge
+
+ at movp|Editor/playhead-to-next-region-boundary|Right|to next region edge
+;@movp|Editor/playhead-to-next-region-boundary-noselection|<@LEVEL4@>Right|to next region edge \linebreak[4] (ignoring selection)
+ at movp|Editor/playhead-to-next-region-sync|<@PRIMARY@><@SECONDARY@>Right|to next region sync
+ at movp|Editor/tab-to-transient-forwards|<@PRIMARY@>Right|to next transient
+ at movp|Editor/nudge-playhead-forward|<@SECONDARY@>Right|nudge forwards
+ at movp|Editor/playhead-forward-to-grid|<@SECONDARY@><@TERTIARY@>Right|to next grid point
+ at trans|Transport/Forward|<@TERTIARY@>Right|fast forward
+ at markers|Editor/selected-marker-to-next-region-boundary|<@PRIMARY@><@TERTIARY@>Right|move to next region edge
+
+ at wvis|Common/next-tab|<@PRIMARY@>Page_Down|next tab
+ at wvis|Common/previous-tab|<@PRIMARY@>Page_Up|previous tab
+ at vis|Editor/scroll-tracks-down|Page_Down|scroll down (page)
+ at vis|Editor/scroll-tracks-up|Page_Up|scroll up (page)
+ at trans|Transport/GotoStart|Home|to start marker
+ at trans|Transport/GotoEnd|End|to end marker
+ at edit|Editor/editor-delete|Delete|delete
+ at edit|Editor/alternate-editor-delete|BackSpace|backspace (delete)
+
+;; this one is super-global, so we put it in the session group but don't show
+;; it on cheat sheets etc.
+ at -sess|Main/Escape|Escape|break drag or deselect all
+
+;; keypad
+
+ at rop|Region/nudge-backward|KP_Subtract|nudge backward
+ at -edit|Editor/nudge-next-backward|<@PRIMARY@>KP_Subtract|some text
+
+ at movp|Editor/alternate-jump-forward-to-mark|<@PRIMARY@>KP_Right|to next mark
+ at movp|Editor/alternate-jump-backward-to-mark|<@PRIMARY@>KP_Left|to previous mark
+
+ at rop|Region/nudge-forward|KP_Add|nudge forward
+ at -edit|Editor/nudge-next-forward|<@PRIMARY@>KP_Add|some text
+
+ at -edit|Editor/start-range|comma|some text
+ at -edit|Editor/finish-range|period|some text
+ at -edit|Editor/alt-start-range|<@PRIMARY@>KP_Down|set the start of the range selection
+ at -edit|Editor/alt-finish-range|<@PRIMARY@>KP_Up|set the end of the range selection
+ at -edit|Editor/start-punch-range|<@PRIMARY@>comma|set the start of the Punch range
+ at -edit|Editor/finish-punch-range|<@PRIMARY@>period|set the end of the Punch range
+ at -edit|Editor/start-loop-range|<@SECONDARY@>comma|set the start of the Loop range
+ at -edit|Editor/finish-loop-range|<@SECONDARY@>period|set the end of the Loop range
+
+ at markers|Editor/alternate-add-location-from-playhead|KP_Enter|add mark at playhead
+ at markers|Editor/alternate-remove-location-from-playhead|<@PRIMARY@>KP_Enter|add mark at playhead
+ at wvis|Transport/focus-on-clock|KP_Divide|focus on main clock
+
+ at trans|Transport/numpad-decimal|KP_Decimal|numpad decimal should initiate and finalize a locate-to-marker
+ at trans|Transport/alternate-numpad-decimal|KP_Separator|(some keybd layouts have separator instead of decimal)
+
+ at trans|Transport/numpad-0|KP_0|some text
+ at -trans|Transport/numpad-1|KP_1|some text
+ at -trans|Transport/numpad-2|KP_2|some text
+ at -trans|Transport/numpad-3|KP_3|some text
+ at -trans|Transport/numpad-4|KP_4|some text
+ at -trans|Transport/numpad-5|KP_5|some text
+ at -trans|Transport/numpad-6|KP_6|some text
+ at -trans|Transport/numpad-7|KP_7|some text
+ at -trans|Transport/numpad-8|KP_8|some text
+ at -trans|Transport/numpad-9|KP_9|some text
+
+;; F-N keys
+
+ at -edit|Editor/edit-cursor-to-range-start|F1|some text
+ at -edit|Editor/edit-cursor-to-range-end|F2|some text
+
+ at -edit|Editor/save-visual-state-1|<@PRIMARY@>F1|some text
+ at -edit|Editor/save-visual-state-2|<@PRIMARY@>F2|some text
+ at -edit|Editor/save-visual-state-3|<@PRIMARY@>F3|some text
+ at -edit|Editor/save-visual-state-4|<@PRIMARY@>F4|some text
+ at -edit|Editor/save-visual-state-5|<@PRIMARY@>F5|some text
+ at -edit|Editor/save-visual-state-6|<@PRIMARY@>F6|some text
+ at -edit|Editor/save-visual-state-7|<@PRIMARY@>F7|some text
+ at -edit|Editor/save-visual-state-8|<@PRIMARY@>F8|some text
+ at -edit|Editor/save-visual-state-9|<@PRIMARY@>F9|some text
+ at -edit|Editor/save-visual-state-10|<@PRIMARY@>F10|some text
+ at -edit|Editor/save-visual-state-11|<@PRIMARY@>F11|some text
+ at -edit|Editor/save-visual-state-12|<@PRIMARY@>F12|some text
+
+ at -edit|Editor/goto-visual-state-1|F1|some text
+ at -edit|Editor/goto-visual-state-2|F2|some text
+ at -edit|Editor/goto-visual-state-3|F3|some text
+ at -edit|Editor/goto-visual-state-4|F4|some text
+ at -edit|Editor/goto-visual-state-5|F5|some text
+ at -edit|Editor/goto-visual-state-6|F6|some text
+ at -edit|Editor/goto-visual-state-7|F7|some text
+ at -edit|Editor/goto-visual-state-8|F8|some text
+ at -edit|Editor/goto-visual-state-9|F9|some text
+ at -edit|Editor/goto-visual-state-10|F10|some text
+ at -edit|Editor/goto-visual-state-11|F11|some text
+ at -edit|Editor/goto-visual-state-12|F12|some text
+
+
+;; numbers
+
+ at eep|Editor/cycle-zoom-focus|1|cycle to next zoom focus
+ at eep|Editor/cycle-snap-mode|2|cycle to next grid snap mode
+ at eep|Editor/prev-snap-choice|3|use next grid unit
+ at eep|Editor/prev-snap-choice-music-only|<@PRIMARY@>3|use previous grid unit
+ at eep|Editor/next-snap-choice|4|use next grid unit
+ at eep|Editor/next-snap-choice-music-only|<@PRIMARY@>4|use next musical grid unit
+ at trans|Transport/ToggleAutoPlay|5|toggle auto play
+ at trans|Transport/ToggleAutoReturn|6|toggle auto return
+ at trans|Transport/ToggleClick|7|toggle click (metronome)
+ at ranges|Region/set-tempo-from-region|9|set tempo (1 bar) from region(s)
+ at ranges|Editor/set-tempo-from-edit-range|0|set tempo (1 bar) from edit range
+
+; mouse stuff
+
+ at +mobject|foo|left-click:on body|select
+ at +mobject|foo|<@TERTIARY@>left-click:on body|extend selection
+ at +mobject|foo|<@PRIMARY@>left-click:on body|add/remove selection
+ at +mobject|foo|left-drag:on body|move region(s)
+ at +mobject|foo|<@PRIMARY@>left-drag:on body|copy+move region(s)
+ at +mobject|foo|<@PRIMARY@>middle-drag:on body|fixed time copy+move
+ at +mobject|foo|middle-drag:on body|fixed time move
+ at +mobject|foo|<@SECONDARY@><@TERTIARY@>midde:on body|lower region
+ at +mobject|foo|<@TERTIARY@>middle:on body|raise region
+ at +mobject|foo|<@PRIMARY@>left-drag:in trim bar|slip audio in region
+ at +mobject|foo|left-click:in trim bar|set region start
+ at +mobject|foo|middle:in trim bar|set region end
+ at +mobject|foo|left-drag:near ends of trim bar|adjust region edges
+ at +mobject|foo|left-click:in auto track|add control point
+ at +mobject|foo|left-drag:on point|move control point
+ at +mobject|foo|middle-drag:on point|fixed time adjust
+ at +mobject|foo|<@PRIMARY@>left-drag:on point|move point+later points
+ at +mobject|foo|<@PRIMARY@>middle-drag:on point|fixed time move
+ at +mobject|foo|left-drag:on line|move line segment
+ at +mobject|foo|<@PRIMARY@><@SECONDARY@>left-drag:on regions|rubber-band select
+ at +mobject|foo|left-drag:in auto track|rubber-band select\linebreak control points
+ at +mobject|foo|left-drag:empty space|rubber-band select
+
+; mouse zoom
+ at +mzoom|foo|<@PRIMARY@>middle|zoom to session
+ at +mzoom|foo|middle-click|zoom out
+ at +mzoom|foo|left-click|zoom in
+ at +mzoom|foo|left+drag |define the new visible area
+
+; mouse solo etc.
+ at +mops|foo|<@PRIMARY@>middle-click|learn MIDI control
+ at +mops|foo|<@PRIMARY@><@TERTIARY@>left-click|apply to all tracks/busses
+ at +mops|foo|<@PRIMARY@>left-click|apply to group
+ at +mops|foo|middle-click|momentary switch
+ at +mops|foo|left-click|apply to track or active group
+
+; mouse solo
+
+ at +mopsolo|foo|<@PRIMARY@><@SECONDARY@>left-click|exclusive solo
+ at +mopsolo|foo|<@TERTIARY@>left-click|temporary latched solo
+
+; mouse fader etc.
+
+ at +mopsfader|foo|<@PRIMARY@>middle-click|learn MIDI control
+ at +mopsfader|foo|<@TERTIARY@>left-click|reset to default
+ at +mopsfader|foo|<@PRIMARY@><@SECONDARY@>left-drag|finest-drag control
+ at +mopsfader|foo|<@PRIMARY@>left-drag|fine-drag control
+ at +mopsfader|foo|left-drag|adjust
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in
index 411b262..d8ea6eb 100644
--- a/gtk2_ardour/ardour.menus.in
+++ b/gtk2_ardour/ardour.menus.in
@@ -8,7 +8,7 @@
<separator/>
<menuitem action='Save'/>
<menuitem action='SaveAs'/>
-#ifndef WINDOWS // can't move open files.
+#ifndef WINDOWS /* can't move open files. */
<menuitem action='Rename'/>
<menuitem action='SnapshotStay'/>
<menuitem action='SnapshotSwitch'/>
@@ -19,7 +19,7 @@
<menuitem action='ImportMetadata'/>
</menu>
<separator/>
- <menuitem action='AddTrackBus'/>
+ <menuitem action='AddTrackBus'/>
<separator/>
<menuitem action='addExistingAudioFiles'/>
#ifdef PTFORMAT
@@ -27,11 +27,16 @@
#endif
<!--menuitem action='importFromSession'/-->
+ <menu name='Scripting' action='Scripting'>
+ <menuitem action='AddLuaScript'/>
+ <menuitem action='RemoveLuaScript'/>
+ </menu>
+
<menuitem action='OpenVideo'/>
<menuitem action='CloseVideo'/>
<menu name='Export' action='Export'>
- <menuitem action='ExportAudio'/>
+ <menuitem action='ExportAudio'/>
<menuitem action='StemExport'/>
<menuitem action='ExportVideo'/>
</menu>
@@ -43,13 +48,14 @@
</menu>
<separator/>
<menuitem action='toggle-session-options-editor'/>
-#ifdef GTKOSX
+#ifdef __APPLE__
<menuitem action='toggle-about'/>
- <menuitem action='toggle-rc-options-editor'/>
#endif
+#ifndef MIXBUS
<separator/>
<menuitem action='lock'/>
-#ifndef GTKOSX
+#endif
+#ifndef __APPLE__
<separator/>
<menuitem action='Quit'/>
#endif
@@ -83,7 +89,7 @@
<menuitem action='TransitionToReverse'/>
<separator/>
-
+
<menu action="MovePlayHeadMenu">
<menuitem action='set-playhead'/>
<menuitem action='playhead-to-edit'/>
@@ -123,7 +129,7 @@
<menu action="MarkerMenu">
<menuitem action='add-location-from-playhead'/>
- <menuitem action='remove-location-from-playhead'/>
+ <menuitem action='remove-location-from-playhead'/>
<separator/>
<menuitem action='goto-mark-1'/>
<menuitem action='goto-mark-2'/>
@@ -135,8 +141,8 @@
<menuitem action='goto-mark-8'/>
<menuitem action='goto-mark-9'/>
<separator/>
- <menuitem action='set-session-start-from-playhead'/>
- <menuitem action='set-session-end-from-playhead'/>
+ <menuitem action='set-session-start-from-playhead'/>
+ <menuitem action='set-session-end-from-playhead'/>
</menu>
<separator/>
@@ -153,7 +159,7 @@
<menuitem action='toggle-stationary-playhead'/>
<menuitem action='ToggleFollowEdits'/>
<menuitem action='panic'/>
- <separator/>
+ <separator/>
</menu>
<menu name='Edit' action='Edit'>
@@ -162,22 +168,22 @@
<separator/>
<menuitem action='undo-last-selection-op'/>
<menuitem action='redo-last-selection-op'/>
- <separator/>
+ <separator/>
<menuitem action='editor-cut'/>
<menuitem action='editor-copy'/>
<menuitem action='editor-paste'/>
- <separator/>
- <menu action="SelectMenu">
+ <separator/>
+ <menu action="SelectMenu">
<menuitem action='select-all-objects'/>
<menuitem action='select-all-tracks'/>
<menuitem action='deselect-all'/>
<menuitem action='invert-selection'/>
<separator/>
- <menuitem action='select-loop-range'/>
- <menuitem action='select-punch-range'/>
- <menuitem action='select-from-regions'/>
+ <menuitem action='select-loop-range'/>
+ <menuitem action='select-punch-range'/>
+ <menuitem action='select-from-regions'/>
<separator/>
- <menuitem action='select-all-after-edit-cursor'/>
+ <menuitem action='select-all-after-edit-cursor'/>
<menuitem action='select-all-before-edit-cursor'/>
<menuitem action='select-all-between-cursors'/>
<menuitem action='select-all-within-cursors'/>
@@ -194,7 +200,7 @@
<separator/>
<menuitem action='select-next-route'/>
<menuitem action='select-prev-route'/>
- </menu>
+ </menu>
<separator/>
<menuitem action='editor-delete'/>
<menuitem action='editor-crop'/>
@@ -220,7 +226,7 @@
<menuitem action='set-fade-out-length'/>
<menuitem action='toggle-region-fade-out'/>
</menu>
- <separator/>
+ <separator/>
<menuitem action='remove-last-capture'/>
<separator/>
<menu action="EditPointMenu">
@@ -276,11 +282,25 @@
<menuitem action='set-tempo-from-edit-range'/>
</menu>
<menuitem action='set-mouse-mode-object-range'/>
-#ifndef GTKOSX
<separator/>
- <menuitem action='toggle-rc-options-editor'/>
+ <menu action="ActionScripts">
+ <menuitem action='toggle-script-manager'/>
+ <separator/>
+ <menuitem action='script-action-1'/>
+ <menuitem action='script-action-2'/>
+ <menuitem action='script-action-3'/>
+ <menuitem action='script-action-4'/>
+ <menuitem action='script-action-5'/>
+ <menuitem action='script-action-6'/>
+ <menuitem action='script-action-7'/>
+ <menuitem action='script-action-8'/>
+ <menuitem action='script-action-9'/>
+ </menu>
+#ifndef __APPLE__
+ <separator/>
#endif
- </menu>
+ <menuitem action='menu-show-preferences'/>
+ </menu>
<menu name='RegionMenu' action='RegionMenu'>
<menuitem action='insert-region-from-region-list'/>
@@ -288,18 +308,20 @@
<menuitem action='loop-region'/>
<menuitem action='rename-region'/>
<menuitem action='show-region-properties'/>
- <menuitem action='analyze-region'/>
+ <menuitem action='loudness-analyze-region'/>
+ <menuitem action='spectral-analyze-region'/>
<menu action='RegionMenuEdit'>
- <menuitem action='combine-regions'/>
- <menuitem action='uncombine-regions'/>
- <menuitem action='pitch-shift-region'/>
- <menuitem action='split-region-at-transients'/>
- <menuitem action='split-multichannel-region'/>
- <menuitem action='close-region-gaps'/>
- <menuitem action='place-transient' />
- <menuitem action='show-rhythm-ferret'/>
- <menuitem action='strip-region-silence'/>
- <menuitem action='reverse-region'/>
+ <menuitem action='combine-regions'/>
+ <menuitem action='uncombine-regions'/>
+ <menuitem action='pitch-shift-region'/>
+ <menuitem action='split-region'/>
+ <menuitem action='split-region-at-transients'/>
+ <menuitem action='split-multichannel-region'/>
+ <menuitem action='close-region-gaps'/>
+ <menuitem action='place-transient' />
+ <menuitem action='show-rhythm-ferret'/>
+ <menuitem action='strip-region-silence'/>
+ <menuitem action='reverse-region'/>
</menu>
<menu action='RegionMenuLayering'>
<menuitem action='raise-region-to-top'/>
@@ -322,7 +344,7 @@
<menuitem action='toggle-region-mute'/>
<menuitem action='normalize-region'/>
<menuitem action='boost-region-gain'/>
- <menuitem action='cut-region-gain'/>
+ <menuitem action='cut-region-gain'/>
<menuitem action='reset-region-gain-envelopes'/>
<menuitem action='toggle-region-gain-envelope-active'/>
</menu>
@@ -338,7 +360,7 @@
<menuitem action='nudge-backward'/>
<menuitem action='nudge-forward-by-capture-offset'/>
<menuitem action='nudge-backward-by-capture-offset'/>
- <menuitem action='sequence-regions'/>
+ <menuitem action='sequence-regions'/>
</menu>
<menu action='RegionMenuTrim'>
<menuitem action='trim-front'/>
@@ -366,15 +388,20 @@
<menuitem action='region-fill-track'/>
</menu>
<menuitem action='export-region'/>
- <menuitem action='bounce-regions-processed'/>
<menuitem action='bounce-regions-unprocessed'/>
+#ifndef MIXBUS
+ <menuitem action='bounce-regions-processed'/>
+#endif
<separator/>
<menuitem action='remove-region'/>
</menu>
<menu action='TrackMenu'>
- <menuitem action='AddTrackBus'/>
- <menuitem action='duplicate-routes'/>
+ <menuitem action='AddTrackBus'/>
+#ifdef MIXBUS
+ <menuitem action='addExistingAudioFiles'/>
+#endif
+ <menuitem action='duplicate-routes'/>
<separator/>
<menuitem action='track-record-enable-toggle'/>
<menuitem action='track-solo-toggle'/>
@@ -393,20 +420,18 @@
<menuitem action='track-height-small'/>
</menu>
<separator/>
- <menuitem action='toggle-track-active'/>
- <menuitem action='remove-track'/>
+ <menuitem action='toggle-track-active'/>
+ <menuitem action='remove-track'/>
</menu>
<menu name='View' action = 'View'>
<menuitem action='ToggleMaximalEditor'/>
<menuitem action='ToggleMaximalMixer'/>
- <menuitem action='KeepTearoffs'/>
- <menuitem action='reattach-all-tearoffs'/>
<separator/>
<menu action="PrimaryClockMenu">
- <menuitem action='focus-on-clock'/>
+ <menuitem action='focus-on-clock'/>
<menuitem action="primary-clock-timecode"/>
<menuitem action="primary-clock-bbt"/>
<menuitem action="primary-clock-minsec"/>
@@ -515,20 +540,46 @@
<menu action = 'WindowMenu'>
<menuitem action='toggle-audio-midi-setup'/>
<separator/>
- <menuitem action='toggle-mixer'/>
+ <menu action='EditorMenu'>
+ <menuitem action='show-editor'/>
+ <menuitem action='hide-editor'/>
+ <menuitem action='attach-editor'/>
+ <menuitem action='detach-editor'/>
+ </menu>
+ <menu action='MixerMenu'>
+ <menuitem action='show-mixer'/>
+ <menuitem action='hide-mixer'/>
+ <menuitem action='attach-mixer'/>
+ <menuitem action='detach-mixer'/>
+ </menu>
+ <menu action='PrefsMenu'>
+ <menuitem action='show-preferences'/>
+ <menuitem action='hide-preferences'/>
+ <menuitem action='attach-preferences'/>
+ <menuitem action='detach-preferences'/>
+ </menu>
<menuitem action='toggle-meterbridge'/>
- <menuitem action='toggle-editor-mixer'/>
+ <menuitem action='toggle-luawindow'/>
<separator/>
+#ifndef MIXBUS
<menuitem action='toggle-inspector'/>
+#endif
<menuitem action='toggle-locations'/>
<menuitem action='toggle-key-editor'/>
+#ifndef MIXBUS
<menuitem action='toggle-bundle-manager'/>
+#endif
<menuitem action='toggle-big-clock'/>
#if 0
<menuitem action='toggle-speaker-config'/>
#endif
<separator/>
+#ifdef MIXBUS
+ <menuitem action='license-manager'/>
+
+ <separator/>
+#endif
<menuitem action='ToggleJadeo'/>
<separator/>
@@ -540,9 +591,15 @@
<separator/>
</menu>
<menu name='Help' action='Help'>
-#ifndef GTKOSX
+#ifndef __APPLE__
<menuitem action='toggle-about'/>
#endif
+#ifdef MIXBUS
+ <menuitem action='reference'/>
+ <menuitem action='manual'/>
+ <menuitem action='forums'/>
+ <menuitem action='chat'/>
+#else
<menuitem action='chat'/>
<menuitem action='manual'/>
<menuitem action='reference'/>
@@ -551,9 +608,31 @@
<menuitem action='tracker'/>
<menuitem action='website'/>
<menuitem action='website-dev'/>
+#endif
</menu>
</menubar>
+ <popup action="editorTabbableButtonMenu">
+ <menuitem action='show-editor'/>
+ <menuitem action='hide-editor'/>
+ <menuitem action='attach-editor'/>
+ <menuitem action='detach-editor'/>
+ </popup>
+
+ <popup action="mixerTabbableButtonMenu">
+ <menuitem action='show-mixer'/>
+ <menuitem action='hide-mixer'/>
+ <menuitem action='attach-mixer'/>
+ <menuitem action='detach-mixer'/>
+ </popup>
+
+ <popup action="preferencesTabbableButtonMenu">
+ <menuitem action='show-preferences'/>
+ <menuitem action='hide-preferences'/>
+ <menuitem action='attach-preferences'/>
+ <menuitem action='detach-preferences'/>
+ </popup>
+
<popup action="RulerMenuPopup">
<menuitem action="toggle-minsec-ruler"/>
<menuitem action="toggle-timecode-ruler"/>
@@ -578,7 +657,9 @@
<menuitem action='newaux'/>
<separator/>
<menuitem action='controls'/>
+#ifndef MIXBUS
<menuitem action='send_options'/>
+#endif
<separator/>
<menuitem action='clear'/>
<menuitem action='clear_pre'/>
@@ -596,7 +677,11 @@
<separator/>
<menuitem action='activate_all'/>
<menuitem action='deactivate_all'/>
+#ifndef MIXBUS
<menuitem action='ab_plugins'/>
+#endif
+ <separator/>
+ <menuitem action='manage-pins'/>
<separator/>
<menuitem action='edit'/>
<menuitem action='edit-generic'/>
@@ -632,7 +717,7 @@
<separator/>
<menuitem action='addExternalAudioToRegionList'/>
<separator/>
- <menuitem action='removeUnusedRegions'/>
+ <menuitem action='removeUnusedRegions'/>
</popup>
<popup name='PopupRegionMenu' action='PopupRegionMenu'>
@@ -641,16 +726,17 @@
<menuitem action='rename-region'/>
<menuitem action='show-region-properties'/>
<menu action='RegionMenuEdit'>
- <menuitem action='combine-regions'/>
- <menuitem action='uncombine-regions'/>
- <menuitem action='split-region'/>
- <menuitem action='split-multichannel-region'/>
- <menuitem action='pitch-shift-region'/>
- <menuitem action='reverse-region'/>
- <menuitem action='close-region-gaps'/>
- <menuitem action='place-transient' />
- <menuitem action='show-rhythm-ferret'/>
- <menuitem action='strip-region-silence'/>
+ <menuitem action='combine-regions'/>
+ <menuitem action='uncombine-regions'/>
+ <menuitem action='pitch-shift-region'/>
+ <menuitem action='split-region'/>
+ <menuitem action='split-region-at-transients'/>
+ <menuitem action='split-multichannel-region'/>
+ <menuitem action='close-region-gaps'/>
+ <menuitem action='place-transient' />
+ <menuitem action='show-rhythm-ferret'/>
+ <menuitem action='strip-region-silence'/>
+ <menuitem action='reverse-region'/>
</menu>
<menu action='RegionMenuMIDI'>
<menuitem action='transpose-region'/>
@@ -702,7 +788,7 @@
<menuitem action='toggle-region-mute'/>
<menuitem action='normalize-region'/>
<menuitem action='boost-region-gain'/>
- <menuitem action='cut-region-gain'/>
+ <menuitem action='cut-region-gain'/>
<menuitem action='reset-region-gain-envelopes'/>
<menuitem action='toggle-region-gain-envelope-active'/>
</menu>
@@ -717,12 +803,15 @@
<menuitem action='region-fill-track'/>
</menu>
<menuitem action='export-region'/>
- <menuitem action='bounce-regions-processed'/>
<menuitem action='bounce-regions-unprocessed'/>
- <menuitem action='analyze-region'/>
+#ifndef MIXBUS
+ <menuitem action='bounce-regions-processed'/>
+#endif
+ <menuitem action='loudness-analyze-region'/>
+ <menuitem action='spectral-analyze-region'/>
<separator/>
<menuitem action='remove-region'/>
-
+
</popup>
</ui>
diff --git a/gtk2_ardour/ardour.sh.in b/gtk2_ardour/ardour.sh.in
index 288c51f..8bcad1b 100644
--- a/gtk2_ardour/ardour.sh.in
+++ b/gtk2_ardour/ardour.sh.in
@@ -25,7 +25,7 @@ fi
GLIB=$(ldd @LIBDIR@/ardour- at VERSION@ 2> /dev/null | grep glib-2.0 | sed 's/.*=> \([^ ]*\) .*/\1/')
-if [ "$GLIB" = "" ]; then
+if ! type nm >/dev/null 2>&1 || [ "$GLIB" = "" ]; then
echo "WARNING: Could not check your glib-2.0 for mutex locking atomic operations."
echo ""
elif [ $(nm -D --radix=dec --defined-only -S $GLIB | grep -w g_atomic_int_add | cut -d ' ' -f 2) -gt 32 ]; then
@@ -57,7 +57,7 @@ export ARDOUR_SELF="$0"
# VAMP has its own lookup path
#
-export VAMP_PATH=@LIBDIR@/vamp
+export VAMP_PATH=@LIBDIR@/vamp${VAMP_PATH:+:$VAMP_PATH}
if [ $# -gt 0 ] ; then
case $1 in
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc
index a4f346a..5685488 100644
--- a/gtk2_ardour/ardour_button.cc
+++ b/gtk2_ardour/ardour_button.cc
@@ -39,7 +39,7 @@
#include "tooltips.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#define BASELINESTRETCH (1.25)
#define TRACKHEADERBTNW (3.10)
@@ -102,6 +102,9 @@ ArdourButton::ArdourButton (Element e)
ArdourButton::ArdourButton (const std::string& str, Element e)
: _elements (e)
, _tweaks (Tweaks (0))
+ , _char_pixel_width (0)
+ , _char_pixel_height (0)
+ , _char_avg_pixel_width (0)
, _text_width (0)
, _text_height (0)
, _diameter (0)
@@ -169,6 +172,9 @@ ArdourButton::set_layout_font (const Pango::FontDescription& fd)
void
ArdourButton::set_text (const std::string& str)
{
+ if (_text == str) {
+ return;
+ }
_text = str;
if (!is_realized()) {
return;
@@ -284,7 +290,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
}
//show the "convex" or "concave" gradient
- if (!_flat_buttons) {
+ if (!_flat_buttons && (_elements & Body)==Body) {
if ( active_state() == Gtkmm2ext::ExplicitActive && ( !((_elements & Indicator)==Indicator) || use_custom_led_color) ) {
//concave
cairo_set_source (cr, concave_pattern);
@@ -535,12 +541,40 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
}
}
- if ((_elements & Text) && !_text.empty()) {
- // if _layout does not exist, char_pixel_height() creates it,
- req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0));
- _layout->get_pixel_size (_text_width, _text_height);
- req->width += rint(1.75 * char_pixel_width()); // padding
- req->width += _text_width;
+ if (_elements & Text) {
+
+ if (_tweaks & OccasionalText) {
+
+ /* size should not change based on presence or absence
+ * of text.
+ */
+
+ if (!_text.empty()) {
+ ensure_layout ();
+ _layout->set_text (_text);
+ _layout->get_pixel_size (_text_width, _text_height);
+ }
+
+ } else if (!_text.empty()) {
+
+ //if _layout does not exist, char_pixel_height() creates it,
+
+ req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0));
+ assert (_layout);
+ _layout->get_pixel_size (_text_width, _text_height);
+ req->width += rint(1.75 * char_pixel_width()); // padding
+ req->width += _text_width;
+ }
+
+ /* XXX hack (surprise). Deal with two common rotation angles */
+
+ if (_angle == 90 || _angle == 270) {
+ /* do not swap text width or height because we rely on
+ these being the un-rotated values in ::render()
+ */
+ swap (req->width, req->height);
+ }
+
} else {
_text_width = 0;
_text_height = 0;
@@ -601,19 +635,26 @@ void
ArdourButton::set_colors ()
{
_update_colors = false;
- if (_fixed_colors_set) {
+
+ if (_fixed_colors_set == 0x3) {
return;
}
+
std::string name = get_name();
bool failed = false;
- fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed);
- if (failed) {
- fill_active_color = UIConfiguration::instance().color ("generic button: fill active");
+ if (!(_fixed_colors_set & 0x1)) {
+ fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed);
+ if (failed) {
+ fill_active_color = UIConfiguration::instance().color ("generic button: fill active");
+ }
}
- fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed);
- if (failed) {
- fill_inactive_color = UIConfiguration::instance().color ("generic button: fill");
+
+ if (!(_fixed_colors_set & 0x2)) {
+ fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed);
+ if (failed) {
+ fill_inactive_color = UIConfiguration::instance().color ("generic button: fill");
+ }
}
text_active_color = ArdourCanvas::contrasting_text_color (fill_active_color);
@@ -641,13 +682,18 @@ ArdourButton::set_colors ()
*/
void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t color_inactive)
{
- _fixed_colors_set = true;
+ set_active_color (color_active);
+ set_inactive_color (color_inactive);
+}
+
+void ArdourButton::set_active_color (const uint32_t color)
+{
+ _fixed_colors_set |= 0x1;
- fill_active_color = color_active;
- fill_inactive_color = color_inactive;
+ fill_active_color = color;
unsigned char r, g, b, a;
- UINT_TO_RGBA(color_active, &r, &g, &b, &a);
+ UINT_TO_RGBA(color, &r, &g, &b, &a);
double white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
(max (double(g), 255.) - min (double(g), 255.)) +
@@ -661,14 +707,24 @@ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t
RGBA_TO_UINT(255, 255, 255, 255) : /* use white */
RGBA_TO_UINT( 0, 0, 0, 255); /* use black */
+ /* XXX what about led colors ? */
+ CairoWidget::set_dirty ();
+}
+
+void ArdourButton::set_inactive_color (const uint32_t color)
+{
+ _fixed_colors_set |= 0x2;
- UINT_TO_RGBA(color_inactive, &r, &g, &b, &a);
+ fill_inactive_color = color;
- white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
+ unsigned char r, g, b, a;
+ UINT_TO_RGBA(color, &r, &g, &b, &a);
+
+ double white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
(max (double(g), 255.) - min (double(g), 255.)) +
(max (double(b), 255.) - min (double(b), 255.));
- black_contrast = (max (double(r), 0.) - min (double(r), 0.)) +
+ double black_contrast = (max (double(r), 0.) - min (double(r), 0.)) +
(max (double(g), 0.) - min (double(g), 0.)) +
(max (double(b), 0.) - min (double(b), 0.));
@@ -724,7 +780,7 @@ ArdourButton::set_led_left (bool yn)
bool
ArdourButton::on_button_press_event (GdkEventButton *ev)
{
- focus_handler ();
+ focus_handler (this);
if (ev->button == 1 && (_elements & Indicator) && _led_rect && _distinct_led_click) {
if (ev->x >= _led_rect->x && ev->x < _led_rect->x + _led_rect->width &&
diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h
index 25986cc..78c2f5e 100644
--- a/gtk2_ardour/ardour_button.h
+++ b/gtk2_ardour/ardour_button.h
@@ -55,7 +55,8 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
enum Tweaks {
Square = 0x1,
TrackHeader = 0x2,
- unused3 = 0x4,
+ OccasionalText = 0x4,
+ unused4 = 0x8,
};
Tweaks tweaks() const { return _tweaks; }
@@ -104,7 +105,9 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
void set_image (const Glib::RefPtr<Gdk::Pixbuf>&);
- void set_fixed_colors (const uint32_t active_color, const uint32_t inactive_color);
+ void set_fixed_colors (const uint32_t active_color, const uint32_t inactive_color);
+ void set_active_color (const uint32_t active_color);
+ void set_inactive_color (const uint32_t inactive_color);
void set_fallthrough_to_parent(bool fall) { _fallthrough_to_parent = fall; }
@@ -172,7 +175,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
bool _distinct_led_click;
bool _hovering;
bool _focused;
- bool _fixed_colors_set;
+ int _fixed_colors_set;
bool _fallthrough_to_parent;
int _layout_ellipsize_width;
Pango::EllipsizeMode _ellipsis;
diff --git a/gtk2_ardour/ardour_dialog.cc b/gtk2_ardour/ardour_dialog.cc
index f8071c2..89b9914 100644
--- a/gtk2_ardour/ardour_dialog.cc
+++ b/gtk2_ardour/ardour_dialog.cc
@@ -60,7 +60,8 @@ ArdourDialog::~ArdourDialog ()
spl->pop_front();
}
}
- WM::Manager::instance().remove (proxy);
+ Keyboard::the_keyboard().focus_out_window (0, this);
+ WM::Manager::instance().remove (proxy);
}
bool
diff --git a/gtk2_ardour/ardour_display.cc b/gtk2_ardour/ardour_display.cc
index 17f3dc5..d4c75af 100644
--- a/gtk2_ardour/ardour_display.cc
+++ b/gtk2_ardour/ardour_display.cc
@@ -37,7 +37,7 @@
#include "ardour_display.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace Gdk;
@@ -51,8 +51,6 @@ using namespace std;
ArdourDisplay::ArdourDisplay (Element e)
{
- add_elements(e);
- add_elements(ArdourButton::Menu);
add_elements(ArdourButton::Text);
}
@@ -60,12 +58,6 @@ ArdourDisplay::~ArdourDisplay ()
{
}
-bool
-ArdourDisplay::on_button_press_event (GdkEventButton*)
-{
- _menu.popup (1, gtk_get_current_event_time());
- return true;
-}
bool
ArdourDisplay::on_scroll_event (GdkEventScroll* ev)
@@ -101,10 +93,7 @@ void
ArdourDisplay::add_controllable_preset (const char *txt, float val)
{
using namespace Menu_Helpers;
-
- MenuList& items = _menu.items ();
-
- items.push_back (MenuElem (txt, sigc::bind (sigc::mem_fun(*this, &ArdourDisplay::handle_controllable_preset), val)));
+ AddMenuElem(MenuElem (txt, sigc::bind (sigc::mem_fun(*this, &ArdourDisplay::handle_controllable_preset), val)));
}
diff --git a/gtk2_ardour/ardour_display.h b/gtk2_ardour/ardour_display.h
index 8b7712d..1b7c654 100644
--- a/gtk2_ardour/ardour_display.h
+++ b/gtk2_ardour/ardour_display.h
@@ -27,9 +27,9 @@
#include <gtkmm/menuitem.h>
-#include "ardour_button.h"
+#include "ardour_dropdown.h"
-class ArdourDisplay : public ArdourButton
+class ArdourDisplay : public ArdourDropdown
{
public:
@@ -39,8 +39,6 @@ class ArdourDisplay : public ArdourButton
boost::shared_ptr<PBD::Controllable> get_controllable() { return binding_proxy.get_controllable(); }
void set_controllable (boost::shared_ptr<PBD::Controllable> c);
- bool on_button_press_event (GdkEventButton*); //mousedown will pop up our preset menu
-// bool on_button_press_event (GdkEventButton*);
// bool on_button_release_event (GdkEventButton*);
bool on_scroll_event (GdkEventScroll* ev);
// bool on_motion_notify_event (GdkEventMotion *ev) ;
@@ -50,9 +48,6 @@ class ArdourDisplay : public ArdourButton
void controllable_changed ();
PBD::ScopedConnection watch_connection;
-
- private:
- Gtk::Menu _menu;
};
#endif /* __gtk2_ardour_ardour_menu_h__ */
diff --git a/gtk2_ardour/ardour_dropdown.cc b/gtk2_ardour/ardour_dropdown.cc
index 5c0e25f..741db8c 100644
--- a/gtk2_ardour/ardour_dropdown.cc
+++ b/gtk2_ardour/ardour_dropdown.cc
@@ -35,7 +35,7 @@
#include "ardour_dropdown.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#define REFLECTION_HEIGHT 2
@@ -43,8 +43,6 @@ using namespace Gdk;
using namespace Gtk;
using namespace Glib;
using namespace PBD;
-using std::max;
-using std::min;
using namespace std;
@@ -52,6 +50,9 @@ ArdourDropdown::ArdourDropdown (Element e)
: _scrolling_disabled(false)
{
// signal_button_press_event().connect (sigc::mem_fun(*this, &ArdourDropdown::on_mouse_pressed));
+ _menu.signal_size_request().connect (sigc::mem_fun(*this, &ArdourDropdown::menu_size_request));
+
+ _menu.set_reserve_toggle_size(false);
add_elements(e);
add_elements(ArdourButton::Menu);
@@ -61,11 +62,22 @@ ArdourDropdown::~ArdourDropdown ()
{
}
+void
+ArdourDropdown::menu_size_request(Requisition *req) {
+ req->width = max(req->width, get_allocation().get_width());
+}
+
+void
+ArdourDropdown::position_menu(int& x, int& y, bool& push_in) {
+ Gtkmm2ext::position_menu_anchored (&_menu, this, get_text(), x, y, push_in);
+}
+
bool
ArdourDropdown::on_button_press_event (GdkEventButton* ev)
{
if (ev->type == GDK_BUTTON_PRESS) {
- _menu.popup (1, gtk_get_current_event_time());
+ _menu.popup (sigc::mem_fun(this, &ArdourDropdown::position_menu),
+ 1, ev->time);
}
return true;
}
diff --git a/gtk2_ardour/ardour_dropdown.h b/gtk2_ardour/ardour_dropdown.h
index 638f54c..5a710ec 100644
--- a/gtk2_ardour/ardour_dropdown.h
+++ b/gtk2_ardour/ardour_dropdown.h
@@ -38,6 +38,8 @@ class ArdourDropdown : public ArdourButton
bool on_button_press_event (GdkEventButton*);
bool on_scroll_event (GdkEventScroll*);
+ void position_menu(int&, int&, bool&);
+ void menu_size_request(Gtk::Requisition*);
void clear_items ();
void AddMenuElem (Gtk::Menu_Helpers::Element e);
diff --git a/gtk2_ardour/ardour_http.cc b/gtk2_ardour/ardour_http.cc
new file mode 100644
index 0000000..3ffea61
--- /dev/null
+++ b/gtk2_ardour/ardour_http.cc
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <cstring>
+
+#include <glibmm.h>
+
+#include "pbd/compose.h"
+#include "pbd/i18n.h"
+#include "pbd/error.h"
+
+#include "ardour_http.h"
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-version.h"
+#endif
+
+#ifndef ARDOUR_CURL_TIMEOUT
+#define ARDOUR_CURL_TIMEOUT (60)
+#endif
+
+using namespace ArdourCurl;
+
+const char* HttpGet::ca_path = NULL;
+const char* HttpGet::ca_info = NULL;
+
+void
+HttpGet::setup_certificate_paths ()
+{
+ /* this is only needed for Linux Bundles.
+ * (on OSX, Windows, we use system-wide ssl (darwinssl, winssl)
+ * Gnu/Linux distro will link against system-wide libcurl.
+ *
+ * but for linux-bundles we get to enjoy:
+ * https://www.happyassassin.net/2015/01/12/a-note-about-ssltls-trusted-certificate-stores-and-platforms/
+ *
+ * (we do ship curl + nss + nss-pem)
+ *
+ * Short of this mess: we could simply bundle a .crt of
+ * COMODO (ardour) and ghandi (freesound) and be done with it.
+ */
+ assert (!ca_path && !ca_info); // call once
+
+ curl_global_init (CURL_GLOBAL_DEFAULT);
+
+ if (Glib::file_test ("/etc/pki/tls/certs/ca-bundle.crt", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
+ // Fedora / RHEL, Arch
+ ca_info = "/etc/pki/tls/certs/ca-bundle.crt";
+ }
+ else if (Glib::file_test ("/etc/ssl/certs/ca-certificates.crt", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
+ // Debian and derivatives
+ ca_info = "/etc/ssl/certs/ca-certificates.crt";
+ }
+ else if (Glib::file_test ("/etc/pki/tls/cert.pem", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
+ // GNU/TLS can keep extra stuff here
+ ca_info = "/etc/pki/tls/cert.pem";
+ }
+ // else NULL: use default (currently) "/etc/ssl/certs/ca-certificates.crt" if it exists
+
+ if (Glib::file_test ("/etc/pki/tls/certs/ca-bundle.crt", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
+ // we're on RHEL // https://bugzilla.redhat.com/show_bug.cgi?id=1053882
+ ca_path = "/nonexistent_path"; // don't try "/etc/ssl/certs" in case it's curl's default
+ }
+ else if (Glib::file_test ("/etc/ssl/certs", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
+ // Debian and derivs + OpenSuSe
+ ca_path = "/etc/ssl/certs";
+ } else {
+ ca_path = "/nonexistent_path"; // don't try -- just in case:
+ }
+
+ /* If we don't set anything defaults are used. at the time of writing we compile bundled curl on debian
+ * and it'll default to /etc/ssl/certs and /etc/ssl/certs/ca-certificates.crt
+ */
+}
+
+static size_t
+WriteMemoryCallback (void *ptr, size_t size, size_t nmemb, void *data) {
+ size_t realsize = size * nmemb;
+ struct HttpGet::MemStruct *mem = (struct HttpGet::MemStruct*)data;
+
+ mem->data = (char *)realloc (mem->data, mem->size + realsize + 1);
+ if (mem->data) {
+ memcpy (&(mem->data[mem->size]), ptr, realsize);
+ mem->size += realsize;
+ mem->data[mem->size] = 0;
+ }
+ return realsize;
+}
+
+
+HttpGet::HttpGet (bool p, bool ssl)
+ : persist (p)
+ , _status (-1)
+ , _result (-1)
+{
+ error_buffer[0] = '\0';
+ _curl = curl_easy_init ();
+
+ curl_easy_setopt (_curl, CURLOPT_WRITEDATA, (void *)&mem);
+ curl_easy_setopt (_curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+ curl_easy_setopt (_curl, CURLOPT_USERAGENT, PROGRAM_NAME VERSIONSTRING);
+ curl_easy_setopt (_curl, CURLOPT_TIMEOUT, ARDOUR_CURL_TIMEOUT);
+ curl_easy_setopt (_curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (_curl, CURLOPT_ERRORBUFFER, error_buffer);
+
+ // by default use curl's default.
+ if (ssl && ca_info) {
+ curl_easy_setopt (_curl, CURLOPT_CAINFO, ca_info);
+ }
+ if (ssl && ca_path) {
+ curl_easy_setopt (_curl, CURLOPT_CAPATH, ca_path);
+ }
+}
+
+HttpGet::~HttpGet ()
+{
+ curl_easy_cleanup (_curl);
+ if (!persist) {
+ free (mem.data);
+ }
+}
+
+char*
+HttpGet::get (const char* url)
+{
+ _status = _result = -1;
+ if (!_curl || !url) {
+ return NULL;
+ }
+
+ if (strncmp ("http://", url, 7) && strncmp ("https://", url, 8)) {
+ return NULL;
+ }
+
+ if (!persist) {
+ free (mem.data);
+ } // otherwise caller is expected to have free()d or re-used it.
+
+ mem.data = NULL;
+ mem.size = 0;
+
+ curl_easy_setopt (_curl, CURLOPT_URL, url);
+ _result = curl_easy_perform (_curl);
+ curl_easy_getinfo (_curl, CURLINFO_RESPONSE_CODE, &_status);
+
+ if (_result) {
+ PBD::error << string_compose (_("HTTP request failed: (%1) %2"), _result, error_buffer);
+ return NULL;
+ }
+ if (_status != 200) {
+ PBD::error << string_compose (_("HTTP request status: %1"), _status);
+ return NULL;
+ }
+
+ return mem.data;
+}
+
+std::string
+HttpGet::error () const {
+ if (_result != 0) {
+ return string_compose (_("HTTP request failed: (%1) %2"), _result, error_buffer);
+ }
+ if (_status != 200) {
+ return string_compose (_("HTTP request status: %1"), _status);
+ }
+ return "No Error";
+}
+
+char*
+ArdourCurl::http_get (const char* url, int* status) {
+ HttpGet h (true);
+ char* rv = h.get (url);
+ if (status) {
+ *status = h.status ();
+ }
+ return rv;
+}
+
+std::string
+ArdourCurl::http_get (const std::string& url) {
+ return HttpGet (false).get (url);
+}
diff --git a/gtk2_ardour/ardour_http.h b/gtk2_ardour/ardour_http.h
new file mode 100644
index 0000000..06cf46f
--- /dev/null
+++ b/gtk2_ardour/ardour_http.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __gtk_ardour_http_h__
+#define __gtk_ardour_http_h__
+
+#include <curl/curl.h>
+#include <string>
+
+namespace ArdourCurl {
+
+class HttpGet {
+ public:
+ HttpGet (bool persist = false, bool ssl = true);
+ ~HttpGet ();
+
+ struct MemStruct {
+ MemStruct () : data (0), size (0) {}
+ char* data;
+ size_t size;
+ };
+
+ char* get (const char* url);
+
+ std::string get (const std::string& url) {
+ char *rv = get (url.c_str ());
+ return rv ? std::string (rv) : std::string ("");
+ }
+
+ char* data () const { return mem.data; }
+ size_t data_size () const { return mem.size; }
+
+ long int status () const { return _status; }
+
+ char* escape (const char* s, int l) const {
+ return curl_easy_escape (_curl, s, l);
+ }
+
+ char* unescape (const char* s, int l, int *o) const {
+ return curl_easy_unescape (_curl, s, l, o);
+ }
+
+ void free (void *p) const {
+ curl_free (p);
+ }
+
+ std::string error () const;
+
+ CURL* curl () const { return _curl; }
+
+ // called from fixup_bundle_environment
+ static void setup_certificate_paths ();
+
+ private:
+ CURL* _curl;
+ bool persist;
+
+ long int _status;
+ long int _result;
+
+ char error_buffer[CURL_ERROR_SIZE];
+
+ struct MemStruct mem;
+
+ static const char* ca_path;
+ static const char* ca_info;
+};
+
+char* http_get (const char* url, int* status);
+
+std::string http_get (const std::string& url);
+
+} // namespace
+
+#endif /* __gtk_ardour_http_h__ */
diff --git a/gtk2_ardour/ardour_knob.cc b/gtk2_ardour/ardour_knob.cc
index 8cea0f4..cf9eace 100644
--- a/gtk2_ardour/ardour_knob.cc
+++ b/gtk2_ardour/ardour_knob.cc
@@ -33,6 +33,7 @@
#include "gtkmm2ext/gui_thread.h"
#include "gtkmm2ext/keyboard.h"
+#include "ardour/automation_control.h"
#include "ardour/rc_configuration.h" // for widget prelight preference
#include "ardour_knob.h"
@@ -42,7 +43,7 @@
#include "canvas/colors.h"
#include "canvas/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace Gdk;
@@ -69,7 +70,8 @@ ArdourKnob::ArdourKnob (Element e, Flags flags)
UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ArdourKnob::color_handler));
// watch automation :(
- Timers::rapid_connect (sigc::mem_fun (*this, &ArdourKnob::controllable_changed));
+ // TODO only use for GainAutomation
+ Timers::rapid_connect (sigc::bind (sigc::mem_fun (*this, &ArdourKnob::controllable_changed), false));
}
ArdourKnob::~ArdourKnob()
@@ -460,7 +462,7 @@ ArdourKnob::set_controllable (boost::shared_ptr<Controllable> c)
binding_proxy.set_controllable (c);
- c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&ArdourKnob::controllable_changed, this), gui_context());
+ c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&ArdourKnob::controllable_changed, this, false), gui_context());
_normal = c->internal_to_interface(c->normal());
@@ -468,7 +470,7 @@ ArdourKnob::set_controllable (boost::shared_ptr<Controllable> c)
}
void
-ArdourKnob::controllable_changed ()
+ArdourKnob::controllable_changed (bool force_update)
{
boost::shared_ptr<PBD::Controllable> c = binding_proxy.get_controllable();
if (!c) return;
@@ -476,13 +478,19 @@ ArdourKnob::controllable_changed ()
float val = c->get_interface();
val = min( max(0.0f, val), 1.0f); // clamp
- if (val == _val) {
+ if (val == _val && !force_update) {
return;
}
_val = val;
if (!_tooltip_prefix.empty()) {
- _tooltip.set_tip (_tooltip_prefix + c->get_user_string());
+ boost::shared_ptr<ARDOUR::AutomationControl> ac = boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (c);
+ if (_printer && ac) {
+
+ _tooltip.set_tip (_tooltip_prefix + _printer->value_as_string (ac));
+ } else {
+ _tooltip.set_tip (_tooltip_prefix + c->get_user_string());
+ }
}
set_dirty();
}
diff --git a/gtk2_ardour/ardour_knob.h b/gtk2_ardour/ardour_knob.h
index d9a9c94..ede200f 100644
--- a/gtk2_ardour/ardour_knob.h
+++ b/gtk2_ardour/ardour_knob.h
@@ -25,6 +25,8 @@
#include <gtkmm/action.h>
#include "pbd/signals.h"
+#include "ardour/automatable.h"
+
#include "gtkmm2ext/binding_proxy.h"
#include "gtkmm2ext/activatable.h"
#include "gtkmm2ext/cairo_widget.h"
@@ -74,7 +76,7 @@ public:
void add_elements (Element);
static Element default_elements;
- void set_tooltip_prefix (std::string pfx) { _tooltip_prefix = pfx; }
+ void set_tooltip_prefix (std::string pfx) { _tooltip_prefix = pfx; controllable_changed (true); }
boost::shared_ptr<PBD::Controllable> get_controllable() { return binding_proxy.get_controllable(); }
void set_controllable (boost::shared_ptr<PBD::Controllable> c);
@@ -84,6 +86,8 @@ public:
bool on_scroll_event (GdkEventScroll* ev);
bool on_motion_notify_event (GdkEventMotion *ev) ;
+ void set_printer (boost::shared_ptr<ARDOUR::Automatable> p) { _printer = p; controllable_changed (true); }
+
void color_handler ();
protected:
@@ -97,14 +101,14 @@ public:
bool on_focus_in_event (GdkEventFocus*);
bool on_focus_out_event (GdkEventFocus*);
- void controllable_changed ();
+ void controllable_changed (bool force_update = false);
PBD::ScopedConnection watch_connection;
private:
- Element _elements;
-
- BindingProxy binding_proxy;
+ Element _elements;
+ BindingProxy binding_proxy;
+ boost::shared_ptr<ARDOUR::Automatable> _printer;
bool _hovering;
float _grabbed_x;
diff --git a/gtk2_ardour/ardour_spinner.cc b/gtk2_ardour/ardour_spinner.cc
new file mode 100644
index 0000000..66307d6
--- /dev/null
+++ b/gtk2_ardour/ardour_spinner.cc
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "gtkmm2ext/gui_thread.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/keyboard.h"
+
+#include "ardour/value_as_string.h"
+
+#include "ardour_spinner.h"
+
+using namespace ARDOUR;
+
+ArdourSpinner::ArdourSpinner (
+ boost::shared_ptr<ARDOUR::AutomationControl> c,
+ Gtk::Adjustment* adj,
+ boost::shared_ptr<ARDOUR::Automatable> p)
+ : _btn (ArdourButton::Text)
+ , _ctrl_adj (adj)
+ , _spin_adj (0, c->lower (), c->upper (), .1, .01)
+ , _spinner (_spin_adj)
+ , _switching (false)
+ , _switch_on_release (false)
+ , _ctrl_ignore (false)
+ , _spin_ignore (false)
+ , _controllable (c)
+ , _printer (p)
+{
+ add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
+ set (.5, .5, 1.0, 1.0);
+ set_border_width (0);
+
+ _btn.set_controllable (c);
+ _btn.set_fallthrough_to_parent (true);
+
+ _spinner.signal_activate().connect (mem_fun (*this, &ArdourSpinner::entry_activated));
+ _spinner.signal_focus_out_event().connect (mem_fun (*this, &ArdourSpinner::entry_focus_out));
+ _spinner.set_digits (4);
+ _spinner.set_numeric (true);
+ _spinner.set_name ("BarControlSpinner");
+
+ _spin_adj.set_step_increment(c->interface_to_internal(_ctrl_adj->get_step_increment()) - c->lower ());
+ _spin_adj.set_page_increment(c->interface_to_internal(_ctrl_adj->get_page_increment()) - c->lower ());
+
+ _spin_adj.signal_value_changed().connect (sigc::mem_fun(*this, &ArdourSpinner::spin_adjusted));
+ adj->signal_value_changed().connect (sigc::mem_fun(*this, &ArdourSpinner::ctrl_adjusted));
+ c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&ArdourSpinner::controllable_changed, this), gui_context());
+
+
+ // this assume the "upper" value needs most space.
+ std::string txt = ARDOUR::value_as_string (c->desc(), c->upper ());
+ Gtkmm2ext::set_size_request_to_display_given_text (*this, txt, 2, 2);
+
+ add (_btn);
+ show_all ();
+
+ controllable_changed();
+ ctrl_adjusted ();
+}
+
+
+ArdourSpinner::~ArdourSpinner ()
+{
+}
+
+bool
+ArdourSpinner::on_button_press_event (GdkEventButton* ev)
+{
+ if (get_child() != &_btn) {
+ return false;
+ }
+
+ if (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) {
+ _switch_on_release = true;
+ return true;
+ } else {
+ _switch_on_release = false;
+ }
+ return false;
+}
+
+bool
+ArdourSpinner::on_button_release_event (GdkEventButton* ev)
+{
+ if (get_child() != &_btn) {
+ return false;
+ }
+ if (ev->button == 1 && _switch_on_release) {
+ Glib::signal_idle().connect (mem_fun (*this, &ArdourSpinner::switch_to_spinner));
+ return true;
+ }
+ return false;
+}
+
+bool
+ArdourSpinner::on_scroll_event (GdkEventScroll* ev)
+{
+ float scale = 1.0;
+ if (ev->state & Gtkmm2ext::Keyboard::GainFineScaleModifier) {
+ if (ev->state & Gtkmm2ext::Keyboard::GainExtraFineScaleModifier) {
+ scale *= 0.01;
+ } else {
+ scale *= 0.10;
+ }
+ }
+
+ boost::shared_ptr<PBD::Controllable> c = _btn.get_controllable();
+ if (c) {
+ float val = c->get_interface();
+
+ if ( ev->direction == GDK_SCROLL_UP )
+ val += 0.05 * scale; //by default, we step in 1/20ths of the knob travel
+ else
+ val -= 0.05 * scale;
+
+ c->set_interface(val);
+ }
+
+ return true;
+}
+
+gint
+ArdourSpinner::switch_to_button ()
+{
+ if (_switching || get_child() == &_btn) {
+ return false;
+ }
+ _switching = true;
+ remove ();
+ add (_btn);
+ _btn.show ();
+ _btn.set_dirty ();
+ _switching = false;
+ return false;
+}
+
+gint
+ArdourSpinner::switch_to_spinner ()
+{
+ if (_switching || get_child() != &_btn) {
+ return false;
+ }
+ _switching = true;
+ remove ();
+ add (_spinner);
+ _spinner.show ();
+ _spinner.select_region (0, _spinner.get_text_length ());
+ _spinner.grab_focus ();
+ _switching = false;
+ return false;
+}
+
+void
+ArdourSpinner::entry_activated ()
+{
+ switch_to_button ();
+}
+
+bool
+ArdourSpinner::entry_focus_out (GdkEventFocus* /*ev*/)
+{
+ entry_activated ();
+ return true;
+}
+
+void
+ArdourSpinner::ctrl_adjusted ()
+{
+ if (_spin_ignore) {
+ return;
+ }
+ _ctrl_ignore = true;
+ _spin_adj.set_value (_controllable->interface_to_internal (_ctrl_adj->get_value ()));
+ _ctrl_ignore = false;
+}
+
+void
+ArdourSpinner::spin_adjusted ()
+{
+ if (_ctrl_ignore) {
+ return;
+ }
+ _spin_ignore = true;
+ _ctrl_adj->set_value (_controllable->internal_to_interface (_spin_adj.get_value ()));
+ _spin_ignore = false;
+}
+
+void
+ArdourSpinner::controllable_changed ()
+{
+ if (_printer) {
+ _btn.set_text (_printer->value_as_string (_controllable));
+ } else {
+ _btn.set_text (_controllable->get_user_string());
+ }
+ _btn.set_dirty();
+}
diff --git a/gtk2_ardour/ardour_spinner.h b/gtk2_ardour/ardour_spinner.h
new file mode 100644
index 0000000..de8c9a1
--- /dev/null
+++ b/gtk2_ardour/ardour_spinner.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <boost/algorithm/string.hpp>
+#ifndef __gtk2_ardour_ardour_spinner_h__
+#define __gtk2_ardour_ardour_spinner_h__
+
+#include <gtkmm.h>
+
+#include "ardour/automatable.h"
+#include "ardour/automation_control.h"
+#include "ardour_button.h"
+
+class ArdourSpinner : public Gtk::Alignment
+{
+ public:
+ ArdourSpinner (
+ boost::shared_ptr<ARDOUR::AutomationControl>,
+ Gtk::Adjustment* adj,
+ boost::shared_ptr<ARDOUR::Automatable>);
+
+ virtual ~ArdourSpinner ();
+
+ protected:
+ bool on_button_press_event (GdkEventButton*);
+ bool on_button_release_event (GdkEventButton*);
+ bool on_scroll_event (GdkEventScroll* ev);
+
+ void controllable_changed ();
+ PBD::ScopedConnection watch_connection;
+
+ private:
+
+ bool entry_focus_out (GdkEventFocus*);
+ void entry_activated ();
+ gint switch_to_button ();
+ gint switch_to_spinner ();
+
+ void ctrl_adjusted();
+ void spin_adjusted();
+
+ ArdourButton _btn;
+ Gtk::Adjustment* _ctrl_adj;
+ Gtk::Adjustment _spin_adj;
+ Gtk::SpinButton _spinner;
+ bool _switching;
+ bool _switch_on_release;
+ bool _ctrl_ignore;
+ bool _spin_ignore;
+
+ boost::shared_ptr<ARDOUR::AutomationControl> _controllable;
+ boost::shared_ptr<ARDOUR::Automatable> _printer;
+
+};
+
+#endif /* __gtk2_ardour_ardour_menu_h__ */
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 4d6a0a7..e9cf5b2 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -33,6 +33,11 @@
#include <sys/resource.h>
#endif
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
#include <stdint.h>
#include <fcntl.h>
#include <signal.h>
@@ -44,10 +49,12 @@
#include <gtkmm/messagedialog.h>
#include <gtkmm/accelmap.h>
+#include <gtkmm/stock.h>
#include "pbd/error.h"
#include "pbd/basename.h"
#include "pbd/compose.h"
+#include "pbd/convert.h"
#include "pbd/failed_constructor.h"
#include "pbd/enumwriter.h"
#include "pbd/memento_command.h"
@@ -70,6 +77,7 @@
#include "ardour/ardour.h"
#include "ardour/audio_backend.h"
+#include "ardour/audio_track.h"
#include "ardour/audioengine.h"
#include "ardour/audiofilesource.h"
#include "ardour/automation_watch.h"
@@ -77,11 +85,13 @@
#include "ardour/filename_extensions.h"
#include "ardour/filesystem_paths.h"
#include "ardour/ltc_file_reader.h"
+#include "ardour/midi_track.h"
#include "ardour/port.h"
#include "ardour/plugin_manager.h"
#include "ardour/process_thread.h"
#include "ardour/profile.h"
#include "ardour/recent_sessions.h"
+#include "ardour/record_enable_control.h"
#include "ardour/session_directory.h"
#include "ardour/session_route.h"
#include "ardour/session_state_utils.h"
@@ -89,6 +99,11 @@
#include "ardour/source_factory.h"
#include "ardour/slave.h"
#include "ardour/system_exec.h"
+#include "ardour/track.h"
+#include "ardour/vca_manager.h"
+#include "ardour/utils.h"
+
+#include "LuaBridge/LuaBridge.h"
#ifdef WINDOWS_VST_SUPPORT
#include <fst.h>
@@ -97,6 +112,11 @@
#include "ardour/audio_unit.h"
#endif
+// fix for OSX (nsm.h has a check function, AU/Apple defines check)
+#ifdef check
+#undef check
+#endif
+
#include "timecode/time.h"
typedef uint64_t microseconds_t;
@@ -112,6 +132,7 @@ typedef uint64_t microseconds_t;
#include "big_clock_window.h"
#include "bundle_manager.h"
#include "duplicate_routes_dialog.h"
+#include "debug.h"
#include "engine_dialog.h"
#include "export_video_dialog.h"
#include "export_video_infobox.h"
@@ -122,6 +143,8 @@ typedef uint64_t microseconds_t;
#include "keyboard.h"
#include "keyeditor.h"
#include "location_ui.h"
+#include "lua_script_manager.h"
+#include "luawindow.h"
#include "main_clock.h"
#include "missing_file_dialog.h"
#include "missing_plugin_dialog.h"
@@ -138,6 +161,7 @@ typedef uint64_t microseconds_t;
#include "route_time_axis.h"
#include "route_params_ui.h"
#include "save_as_dialog.h"
+#include "script_selector.h"
#include "session_dialog.h"
#include "session_metadata_dialog.h"
#include "session_option_editor.h"
@@ -153,7 +177,7 @@ typedef uint64_t microseconds_t;
#include "add_video_dialog.h"
#include "transcode_video_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -212,19 +236,23 @@ libxml_structured_error_func (void* /* parsing_context*/,
replace_all (msg, "\n", "");
- if (err->file && err->line) {
- error << X_("XML error: ") << msg << " in " << err->file << " at line " << err->line;
+ if (!msg.empty()) {
+ if (err->file && err->line) {
+ error << X_("XML error: ") << msg << " in " << err->file << " at line " << err->line;
- if (err->int2) {
- error << ':' << err->int2;
+ if (err->int2) {
+ error << ':' << err->int2;
+ }
+
+ error << endmsg;
+ } else {
+ error << X_("XML error: ") << msg << endmsg;
}
}
- error << endmsg;
}
ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
-
: Gtkmm2ext::UI (PROGRAM_NAME, X_("gui"), argcp, argvp)
, session_loaded (false)
, gui_object_state (new GUIObjectState)
@@ -232,7 +260,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, secondary_clock (new MainClock (X_("secondary"), X_("secondary"), false))
, big_clock (new AudioClock (X_("bigclock"), false, "big", true, true, false, false))
, video_timeline(0)
+ , global_actions (X_("global"))
, ignore_dual_punch (false)
+ , main_window_visibility (0)
, editor (0)
, mixer (0)
, nsm (0)
@@ -261,21 +291,23 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, last_key_press_time (0)
, save_as_dialog (0)
, meterbridge (0)
+ , luawindow (0)
+ , rc_option_editor (0)
, speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
- , key_editor (X_("key-editor"), _("Key Bindings"))
- , rc_option_editor (X_("rc-options-editor"), _("Preferences"))
, add_route_dialog (X_("add-routes"), _("Add Tracks/Busses"))
, about (X_("about"), _("About"))
- , location_ui (X_("locations"), _("Locations"))
+ , location_ui (X_("locations"), S_("Ranges|Locations"))
, route_params (X_("inspector"), _("Tracks and Busses"))
, audio_midi_setup (X_("audio-midi-setup"), _("Audio/MIDI Setup"))
, export_video_dialog (X_("video-export"), _("Video Export Dialog"))
+ , lua_script_window (X_("script-manager"), _("Script Manager"))
, session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this))
- , add_video_dialog (X_("add-video"), _("Add Tracks/Busses"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
+ , add_video_dialog (X_("add-video"), _("Add Video"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
, bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this))
, big_clock_window (X_("big-clock"), _("Big Clock"), boost::bind (&ARDOUR_UI::create_big_clock_window, this))
, audio_port_matrix (X_("audio-connection-manager"), _("Audio Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::AUDIO))
, midi_port_matrix (X_("midi-connection-manager"), _("MIDI Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::MIDI))
+ , key_editor (X_("key-editor"), _("Bindings Editor"), boost::bind (&ARDOUR_UI::create_key_editor, this))
, video_server_process (0)
, splash (0)
, have_configure_timeout (false)
@@ -286,6 +318,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, _feedback_exists (false)
, _log_not_acknowledged (LogLevelNone)
, duplicate_routes_dialog (0)
+ , editor_visibility_button (S_("Window|Editor"))
+ , mixer_visibility_button (S_("Window|Mixer"))
+ , prefs_visibility_button (S_("Window|Preferences"))
{
Gtkmm2ext::init (localedir);
@@ -298,10 +333,22 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
_exit (0);
}
+
+ if (string (VERSIONSTRING).find (".pre") != string::npos) {
+ /* check this is not being run from ./ardev etc. */
+ if (!running_from_source_tree ()) {
+ pre_release_dialog ();
+ }
+ }
+
if (theArdourUI == 0) {
theArdourUI = this;
}
+ /* track main window visibility */
+
+ main_window_visibility = new VisibilityTracker (_main_window);
+
/* stop libxml from spewing to stdout/stderr */
xmlSetGenericErrorFunc (this, libxml_generic_error_func);
@@ -349,6 +396,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
ARDOUR::Session::AskAboutSampleRateMismatch.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::sr_mismatch_dialog, this, _1, _2));
+ /* handle sr mismatch with a dialog - cross-thread from engine */
+ ARDOUR::Session::NotifyAboutSampleRateMismatch.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::sr_mismatch_message, this, _1, _2), gui_context ());
+
/* handle requests to quit (coming from JACK session) */
ARDOUR::Session::Quit.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::finish, this), gui_context ());
@@ -391,9 +441,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
keyboard->set_state (*node, Stateful::loading_state_version);
}
- /* we don't like certain modifiers */
- Bindings::set_ignored_state (GDK_LOCK_MASK|GDK_MOD2_MASK|GDK_MOD3_MASK);
-
UIConfiguration::instance().reset_dpi ();
TimeAxisViewItem::set_constant_heights ();
@@ -407,24 +454,25 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
const XMLNode* ui_xml = Config->extra_xml (X_("UI"));
if (ui_xml) {
- key_editor.set_state (*ui_xml);
- rc_option_editor.set_state (*ui_xml);
- session_option_editor.set_state (*ui_xml);
- speaker_config_window.set_state (*ui_xml);
- about.set_state (*ui_xml);
- add_route_dialog.set_state (*ui_xml);
- add_video_dialog.set_state (*ui_xml);
- route_params.set_state (*ui_xml);
- bundle_manager.set_state (*ui_xml);
- location_ui.set_state (*ui_xml);
- big_clock_window.set_state (*ui_xml);
- audio_port_matrix.set_state (*ui_xml);
- midi_port_matrix.set_state (*ui_xml);
- export_video_dialog.set_state (*ui_xml);
- }
+ key_editor.set_state (*ui_xml, 0);
+ session_option_editor.set_state (*ui_xml, 0);
+ speaker_config_window.set_state (*ui_xml, 0);
+ about.set_state (*ui_xml, 0);
+ add_route_dialog.set_state (*ui_xml, 0);
+ add_video_dialog.set_state (*ui_xml, 0);
+ route_params.set_state (*ui_xml, 0);
+ bundle_manager.set_state (*ui_xml, 0);
+ location_ui.set_state (*ui_xml, 0);
+ big_clock_window.set_state (*ui_xml, 0);
+ audio_port_matrix.set_state (*ui_xml, 0);
+ midi_port_matrix.set_state (*ui_xml, 0);
+ export_video_dialog.set_state (*ui_xml, 0);
+ lua_script_window.set_state (*ui_xml, 0);
+ }
+
+ /* Separate windows */
WM::Manager::instance().register_window (&key_editor);
- WM::Manager::instance().register_window (&rc_option_editor);
WM::Manager::instance().register_window (&session_option_editor);
WM::Manager::instance().register_window (&speaker_config_window);
WM::Manager::instance().register_window (&about);
@@ -433,12 +481,16 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
WM::Manager::instance().register_window (&route_params);
WM::Manager::instance().register_window (&audio_midi_setup);
WM::Manager::instance().register_window (&export_video_dialog);
+ WM::Manager::instance().register_window (&lua_script_window);
WM::Manager::instance().register_window (&bundle_manager);
WM::Manager::instance().register_window (&location_ui);
WM::Manager::instance().register_window (&big_clock_window);
WM::Manager::instance().register_window (&audio_port_matrix);
WM::Manager::instance().register_window (&midi_port_matrix);
+ /* do not retain position for add route dialog */
+ add_route_dialog.set_state_mask (WindowProxy::Size);
+
/* Trigger setting up the color scheme and loading the GTK RC file */
UIConfiguration::instance().load_rc_file (false);
@@ -451,6 +503,40 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
attach_to_engine ();
}
+void
+ARDOUR_UI::pre_release_dialog ()
+{
+ ArdourDialog d (_("Pre-Release Warning"), true, false);
+ d.add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK);
+
+ Label* label = manage (new Label);
+ label->set_markup (string_compose (_("<b>Welcome to this pre-release build of %1 %2</b>\n\n\
+There are still several issues and bugs to be worked on,\n\
+as well as general workflow improvements, before this can be considered\n\
+release software. So, a few guidelines:\n\
+\n\
+1) Please do <b>NOT</b> use this software with the expectation that it is stable or reliable\n\
+ though it may be so, depending on your workflow.\n\
+2) Please wait for a helpful writeup of new features.\n\
+3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n\
+4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to report issues\n\
+ making sure to note the product version number as 5.0-pre.\n\
+5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and pass on comments.\n\
+6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. You\n\
+ can get there directly from within the program via the Help->Chat menu option.\n\
+\n\
+Full information on all the above can be found on the support page at\n\
+\n\
+ http://ardour.org/support\n\
+"), PROGRAM_NAME, VERSIONSTRING));
+
+ d.get_vbox()->set_border_width (12);
+ d.get_vbox()->pack_start (*label, false, false, 12);
+ d.get_vbox()->show_all ();
+
+ d.run ();
+}
+
GlobalPortMatrixWindow*
ARDOUR_UI::create_global_port_matrix (ARDOUR::DataType type)
{
@@ -533,7 +619,7 @@ was not fast enough. Try to restart\n\
the audio backend and save the session."), PROGRAM_NAME);
}
- MessageDialog msg (*editor, msgstr);
+ MessageDialog msg (_main_window, msgstr);
pop_back_splash (msg);
msg.run ();
@@ -578,22 +664,32 @@ ARDOUR_UI::post_engine ()
check_memory_locking();
- /* this is the first point at which all the keybindings are available */
+ /* this is the first point at which all the possible actions are
+ * available, because some of the available actions are dependent on
+ * aspects of the engine/backend.
+ */
if (ARDOUR_COMMAND_LINE::show_key_actions) {
- vector<string> names;
+
+
vector<string> paths;
+ vector<string> labels;
vector<string> tooltips;
vector<string> keys;
- vector<AccelKey> bindings;
+ vector<Glib::RefPtr<Gtk::Action> > actions;
- ActionManager::get_all_actions (names, paths, tooltips, keys, bindings);
+ Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
- vector<string>::iterator n;
vector<string>::iterator k;
vector<string>::iterator p;
- for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) {
- cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl;
+
+ for (p = paths.begin(), k = keys.begin(); p != paths.end(); ++k, ++p) {
+
+ if ((*k).empty()) {
+ cout << *p << endl;
+ } else {
+ cout << *p << " => " << *k << endl;
+ }
}
halt_connection.disconnect ();
@@ -608,17 +704,12 @@ ARDOUR_UI::post_engine ()
/* set default clock modes */
- if (Profile->get_sae()) {
- primary_clock->set_mode (AudioClock::BBT);
- secondary_clock->set_mode (AudioClock::MinSec);
- } else {
- primary_clock->set_mode (AudioClock::Timecode);
- secondary_clock->set_mode (AudioClock::BBT);
- }
+ primary_clock->set_mode (AudioClock::Timecode);
+ secondary_clock->set_mode (AudioClock::BBT);
/* start the time-of-day-clock */
-#ifndef GTKOSX
+#ifndef __APPLE__
/* OS X provides a nearly-always visible wallclock, so don't be stupid */
update_wall_clock ();
Glib::signal_timeout().connect_seconds (sigc::mem_fun(*this, &ARDOUR_UI::update_wall_clock), 1);
@@ -642,15 +733,17 @@ ARDOUR_UI::~ARDOUR_UI ()
if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
// don't bother at 'real' exit. the OS cleans up for us.
- delete big_clock;
- delete primary_clock;
- delete secondary_clock;
- delete _process_thread;
- delete meterbridge;
- delete editor;
- delete mixer;
- delete nsm;
- delete gui_object_state;
+ delete big_clock; big_clock = 0;
+ delete primary_clock; primary_clock = 0;
+ delete secondary_clock; secondary_clock = 0;
+ delete _process_thread; _process_thread = 0;
+ delete meterbridge; meterbridge = 0;
+ delete luawindow; luawindow = 0;
+ delete editor; editor = 0;
+ delete mixer; mixer = 0;
+ delete nsm; nsm = 0;
+ delete gui_object_state; gui_object_state = 0;
+ delete main_window_visibility;
FastMeter::flush_pattern_cache ();
PixFader::flush_pattern_cache ();
}
@@ -709,7 +802,7 @@ ARDOUR_UI::configure_handler (GdkEventConfigure* /*conf*/)
void
ARDOUR_UI::set_transport_controllable_state (const XMLNode& node)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("roll")) != 0) {
roll_controllable->set_id (prop->value());
@@ -794,10 +887,15 @@ ARDOUR_UI::autosave_session ()
}
void
-ARDOUR_UI::update_autosave ()
+ARDOUR_UI::session_dirty_changed ()
{
- ENSURE_GUI_THREAD (*this, &ARDOUR_UI::update_autosave)
+ update_autosave ();
+ update_title ();
+}
+void
+ARDOUR_UI::update_autosave ()
+{
if (_session && _session->dirty()) {
if (_autosave_connection.connected()) {
_autosave_connection.disconnect();
@@ -848,6 +946,13 @@ ARDOUR_UI::check_announcements ()
#endif
}
+static bool
+_hide_splash (gpointer arg)
+{
+ ((ARDOUR_UI*)arg)->hide_splash();
+ return false;
+}
+
int
ARDOUR_UI::starting ()
{
@@ -1020,8 +1125,6 @@ ARDOUR_UI::starting ()
use_config ();
- goto_editor_window ();
-
WM::Manager::instance().show_visible ();
/* We have to do this here since goto_editor_window() ends up calling show_all() on the
@@ -1030,6 +1133,14 @@ ARDOUR_UI::starting ()
_status_bar_visibility.update ();
BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
+
+ if (splash && splash->is_visible()) {
+ // in 1 second, hide the splash screen
+ Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 1000);
+ }
+
+ /* all other dialogs are created conditionally */
+
return 0;
}
@@ -1097,7 +1208,6 @@ ARDOUR_UI::check_memory_locking ()
pop_back_splash (msg);
- editor->ensure_float (msg);
msg.run ();
if (cb.get_active()) {
@@ -1143,7 +1253,7 @@ ARDOUR_UI::finish()
/* use the default name */
if (save_state_canfail ("")) {
/* failed - don't quit */
- MessageDialog msg (*editor,
+ MessageDialog msg (_main_window,
string_compose (_("\
%1 was unable to save your session.\n\n\
If you still wish to quit, please use the\n\n\
@@ -1514,7 +1624,7 @@ void
ARDOUR_UI::count_recenabled_streams (Route& route)
{
Track* track = dynamic_cast<Track*>(&route);
- if (track && track->record_enabled()) {
+ if (track && track->rec_enable_control()->get_value()) {
rec_enabled_streams += track->n_inputs().n_total();
}
}
@@ -1665,6 +1775,10 @@ ARDOUR_UI::open_recent_session ()
can_return = false;
}
+ if (splash && splash->is_visible()) {
+ // in 1 second, hide the splash screen
+ Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 1000);
+ }
}
bool
@@ -1672,8 +1786,8 @@ ARDOUR_UI::check_audioengine (Gtk::Window& parent)
{
if (!AudioEngine::instance()->connected()) {
MessageDialog msg (parent, string_compose (
- _("%1 is not connected to any audio backend.\n"
- "You cannot open or close sessions in this condition"),
+ _("%1 is not connected to any audio backend.\n"
+ "You cannot open or close sessions in this condition"),
PROGRAM_NAME));
pop_back_splash (msg);
msg.run ();
@@ -1685,7 +1799,7 @@ ARDOUR_UI::check_audioengine (Gtk::Window& parent)
void
ARDOUR_UI::open_session ()
{
- if (!check_audioengine(*editor)) {
+ if (!check_audioengine (_main_window)) {
return;
}
@@ -1737,10 +1851,27 @@ ARDOUR_UI::open_session ()
}
}
+void
+ARDOUR_UI::session_add_vca (const string& name_template, uint32_t n)
+{
+ if (!_session) {
+ return;
+ }
+
+ _session->vca_manager().create_vca (n, name_template);
+}
void
-ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& output, RouteGroup* route_group,
- uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
+ARDOUR_UI::session_add_mixed_track (
+ const ChanCount& input,
+ const ChanCount& output,
+ RouteGroup* route_group,
+ uint32_t how_many,
+ const string& name_template,
+ bool strict_io,
+ PluginInfoPtr instrument,
+ Plugin::PresetRecord* pset,
+ ARDOUR::PresentationInfo::order_t order)
{
list<boost::shared_ptr<MidiTrack> > tracks;
@@ -1750,7 +1881,7 @@ ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& out
}
try {
- tracks = _session->new_midi_track (input, output, instrument, ARDOUR::Normal, route_group, how_many, name_template);
+ tracks = _session->new_midi_track (input, output, instrument, pset, route_group, how_many, name_template, order, ARDOUR::Normal);
if (tracks.size() != how_many) {
error << string_compose(P_("could not create %1 new mixed track", "could not create %1 new mixed tracks", how_many), how_many) << endmsg;
@@ -1758,24 +1889,72 @@ ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& out
}
catch (...) {
- MessageDialog msg (*editor,
- string_compose (_("There are insufficient ports available\n\
-to create a new track or bus.\n\
-You should save %1, exit and\n\
-restart with more ports."), PROGRAM_NAME));
- msg.run ();
+ display_insufficient_ports_message ();
+ return;
+ }
+
+ if (strict_io) {
+ for (list<boost::shared_ptr<MidiTrack> >::iterator i = tracks.begin(); i != tracks.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
}
}
+void
+ARDOUR_UI::session_add_midi_bus (
+ RouteGroup* route_group,
+ uint32_t how_many,
+ const string& name_template,
+ bool strict_io,
+ PluginInfoPtr instrument,
+ Plugin::PresetRecord* pset,
+ ARDOUR::PresentationInfo::order_t order)
+{
+ RouteList routes;
+
+ if (_session == 0) {
+ warning << _("You cannot add a track without a session already loaded.") << endmsg;
+ return;
+ }
+
+ try {
+
+ routes = _session->new_midi_route (route_group, how_many, name_template, instrument, pset, PresentationInfo::MidiBus, order);
+ if (routes.size() != how_many) {
+ error << string_compose(P_("could not create %1 new Midi Bus", "could not create %1 new Midi Busses", how_many), how_many) << endmsg;
+ }
+
+ }
+ catch (...) {
+ display_insufficient_ports_message ();
+ return;
+ }
+
+ if (strict_io) {
+ for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
+ }
+}
void
-ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
+ARDOUR_UI::session_add_midi_route (
+ bool disk,
+ RouteGroup* route_group,
+ uint32_t how_many,
+ const string& name_template,
+ bool strict_io,
+ PluginInfoPtr instrument,
+ Plugin::PresetRecord* pset,
+ ARDOUR::PresentationInfo::order_t order)
{
ChanCount one_midi_channel;
one_midi_channel.set (DataType::MIDI, 1);
if (disk) {
- session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument);
+ session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, instrument, pset, order);
+ } else {
+ session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument, pset, order);
}
}
@@ -1787,8 +1966,9 @@ ARDOUR_UI::session_add_audio_route (
ARDOUR::TrackMode mode,
RouteGroup* route_group,
uint32_t how_many,
- string const & name_template
- )
+ string const & name_template,
+ bool strict_io,
+ ARDOUR::PresentationInfo::order_t order)
{
list<boost::shared_ptr<AudioTrack> > tracks;
RouteList routes;
@@ -1800,7 +1980,7 @@ ARDOUR_UI::session_add_audio_route (
try {
if (track) {
- tracks = _session->new_audio_track (input_channels, output_channels, mode, route_group, how_many, name_template);
+ tracks = _session->new_audio_track (input_channels, output_channels, route_group, how_many, name_template, order, mode);
if (tracks.size() != how_many) {
error << string_compose (P_("could not create %1 new audio track", "could not create %1 new audio tracks", how_many), how_many)
@@ -1809,7 +1989,7 @@ ARDOUR_UI::session_add_audio_route (
} else {
- routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template);
+ routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template, PresentationInfo::AudioBus, order);
if (routes.size() != how_many) {
error << string_compose (P_("could not create %1 new audio bus", "could not create %1 new audio busses", how_many), how_many)
@@ -1819,14 +1999,30 @@ ARDOUR_UI::session_add_audio_route (
}
catch (...) {
- MessageDialog msg (*editor,
- string_compose (_("There are insufficient ports available\n\
+ display_insufficient_ports_message ();
+ return;
+ }
+
+ if (strict_io) {
+ for (list<boost::shared_ptr<AudioTrack> >::iterator i = tracks.begin(); i != tracks.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
+ for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
+ }
+}
+
+void
+ARDOUR_UI::display_insufficient_ports_message ()
+{
+ MessageDialog msg (_main_window,
+ string_compose (_("There are insufficient ports available\n\
to create a new track or bus.\n\
You should save %1, exit and\n\
restart with more ports."), PROGRAM_NAME));
- pop_back_splash (msg);
- msg.run ();
- }
+ pop_back_splash (msg);
+ msg.run ();
}
void
@@ -1945,14 +2141,14 @@ ARDOUR_UI::trx_record_enable_all_tracks ()
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*r);
assert (t);
- if (t->record_enabled()) {
+ if (t->rec_enable_control()->get_value()) {
none_record_enabled = false;
break;
}
}
if (none_record_enabled) {
- _session->set_record_enabled (rl, true, Session::rt_cleanup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), 1.0, Controllable::NoGroup);
}
return none_record_enabled;
@@ -1965,7 +2161,7 @@ ARDOUR_UI::transport_record (bool roll)
switch (_session->record_status()) {
case Session::Disabled:
if (_session->ntracks() == 0) {
- MessageDialog msg (*editor, _("Please create one or more tracks before trying to record.\nYou can do this with the \"Add Track or Bus\" option in the Session menu."));
+ MessageDialog msg (_main_window, _("Please create one or more tracks before trying to record.\nYou can do this with the \"Add Track or Bus\" option in the Session menu."));
msg.run ();
return;
}
@@ -2110,7 +2306,12 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode)
if (affect_transport) {
if (rolling) {
_session->request_stop (with_abort, true);
- } else {
+
+ } else if (!with_abort) { /* with_abort == true means the
+ * command was intended to stop
+ * transport, not start.
+ */
+
/* the only external sync condition we can be in here
* would be Engine (JACK) sync, in which case we still
* want to do this.
@@ -2237,7 +2438,7 @@ ARDOUR_UI::transport_forward (int option)
}
void
-ARDOUR_UI::toggle_record_enable (uint32_t rid)
+ARDOUR_UI::toggle_record_enable (uint16_t rid)
{
if (!_session) {
return;
@@ -2245,12 +2446,12 @@ ARDOUR_UI::toggle_record_enable (uint32_t rid)
boost::shared_ptr<Route> r;
- if ((r = _session->route_by_remote_id (rid)) != 0) {
+ if ((r = _session->get_remote_nth_route (rid)) != 0) {
boost::shared_ptr<Track> t;
if ((t = boost::dynamic_pointer_cast<Track>(r)) != 0) {
- t->set_record_enabled (!t->record_enabled(), Controllable::UseGroup);
+ t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup);
}
}
}
@@ -2520,7 +2721,7 @@ ARDOUR_UI::snapshot_session (bool switch_to_it)
prompter.set_name ("Prompter");
prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
if (switch_to_it) {
- prompter.set_title (_("Save as..."));
+ prompter.set_title (_("Snapshot and switch"));
prompter.set_prompt (_("New session name"));
} else {
prompter.set_title (_("Take Snapshot"));
@@ -2739,7 +2940,7 @@ ARDOUR_UI::save_template ()
{
ArdourPrompter prompter (true);
- if (!check_audioengine(*editor)) {
+ if (!check_audioengine (_main_window)) {
return;
}
@@ -2811,7 +3012,7 @@ ARDOUR_UI::build_session_from_dialog (SessionDialog& sd, const std::string& sess
{
BusProfile bus_profile;
- if (nsm || Profile->get_sae()) {
+ if (nsm) {
bus_profile.master_out_channels = 2;
bus_profile.input_ac = AutoConnectPhysical;
@@ -2899,8 +3100,6 @@ ARDOUR_UI::load_from_application_api (const std::string& path)
if (get_session_parameters (true, false)) {
exit (1);
}
-
- goto_editor_window ();
}
}
@@ -3147,7 +3346,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
void
ARDOUR_UI::close_session()
{
- if (!check_audioengine(*editor)) {
+ if (!check_audioengine (_main_window)) {
return;
}
@@ -3160,8 +3359,10 @@ ARDOUR_UI::close_session()
if (get_session_parameters (true, false)) {
exit (1);
}
-
- goto_editor_window ();
+ if (splash && splash->is_visible()) {
+ // in 1 second, hide the splash screen
+ Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 1000);
+ }
}
/** @param snap_name Snapshot name (without .ardour suffix).
@@ -3298,8 +3499,6 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
session_loaded = true;
- goto_editor_window ();
-
if (_session) {
_session->set_clean ();
}
@@ -3310,7 +3509,7 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
{
Timers::TimerSuspender t;
- flush_pending ();
+ flush_pending (10);
}
#ifdef WINDOWS_VST_SUPPORT
@@ -3375,6 +3574,11 @@ ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name,
new_session->add_instant_xml (*n, false);
}
+ n = Config->instant_xml (X_("Preferences"));
+ if (n) {
+ new_session->add_instant_xml (*n, false);
+ }
+
/* Put the playhead at 0 and scroll fully left */
n = new_session->instant_xml (X_("Editor"));
if (n) {
@@ -3515,7 +3719,7 @@ ARDOUR_UI::display_cleanup_results (ARDOUR::CleanupReport& rep, const gchar* lis
removed = rep.paths.size();
if (removed == 0) {
- MessageDialog msgd (*editor,
+ MessageDialog msgd (_main_window,
_("No files were ready for clean-up"),
true,
Gtk::MESSAGE_INFO,
@@ -3764,15 +3968,15 @@ ARDOUR_UI::cleanup_peakfiles ()
}
}
-void
-ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place)
+PresentationInfo::order_t
+ARDOUR_UI::translate_order (AddRouteDialog::InsertAt place)
{
- uint32_t order_hint = UINT32_MAX;
-
if (editor->get_selection().tracks.empty()) {
- return;
+ return PresentationInfo::max_order;
}
+ PresentationInfo::order_t order_hint = PresentationInfo::max_order;
+
/*
we want the new routes to have their order keys set starting from
the highest order key in the selection + 1 (if available).
@@ -3781,42 +3985,21 @@ ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place)
if (place == AddRouteDialog::AfterSelection) {
RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView*> (editor->get_selection().tracks.back());
if (rtav) {
- order_hint = rtav->route()->order_key();
+ order_hint = rtav->route()->presentation_info().order();
order_hint++;
}
} else if (place == AddRouteDialog::BeforeSelection) {
RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView*> (editor->get_selection().tracks.front());
if (rtav) {
- order_hint = rtav->route()->order_key();
+ order_hint = rtav->route()->presentation_info().order();
}
} else if (place == AddRouteDialog::First) {
order_hint = 0;
} else {
- /* leave order_hint at UINT32_MAX */
+ /* leave order_hint at max_order */
}
- if (order_hint == UINT32_MAX) {
- /** AddRouteDialog::Last or selection with first/last not a RouteTimeAxisView
- * not setting an order hint will place new routes last.
- */
- return;
- }
-
- _session->set_order_hint (order_hint);
-
- /* create a gap in the existing route order keys to accomodate new routes.*/
- boost::shared_ptr <RouteList> rd = _session->get_routes();
- for (RouteList::iterator ri = rd->begin(); ri != rd->end(); ++ri) {
- boost::shared_ptr<Route> rt (*ri);
-
- if (rt->is_monitor()) {
- continue;
- }
-
- if (rt->order_key () >= order_hint) {
- rt->set_order_key (rt->order_key () + add_route_dialog->count());
- }
- }
+ return order_hint;
}
void
@@ -3834,9 +4017,11 @@ ARDOUR_UI::start_duplicate_routes ()
}
void
-ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
+ARDOUR_UI::add_route ()
{
- int count;
+ if (!add_route_dialog.get (false)) {
+ add_route_dialog->signal_response().connect (sigc::mem_fun (*this, &ARDOUR_UI::add_route_dialog_finished));
+ }
if (!_session) {
return;
@@ -3847,7 +4032,14 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
return;
}
- ResponseType r = (ResponseType) add_route_dialog->run ();
+ add_route_dialog->set_position (WIN_POS_MOUSE);
+ add_route_dialog->present();
+}
+
+void
+ARDOUR_UI::add_route_dialog_finished (int r)
+{
+ int count;
add_route_dialog->hide();
@@ -3863,8 +4055,7 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
return;
}
- setup_order_hint(add_route_dialog->insert_at());
-
+ PresentationInfo::order_t order = translate_order (add_route_dialog->insert_at());
string template_path = add_route_dialog->track_template();
DisplaySuspender ds;
@@ -3883,6 +4074,7 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
PluginInfoPtr instrument = add_route_dialog->requested_instrument ();
RouteGroup* route_group = add_route_dialog->route_group ();
AutoConnectOption oac = Config->get_output_auto_connect();
+ bool strict_io = add_route_dialog->use_strict_io ();
if (oac & AutoConnectMaster) {
output_chan.set (DataType::AUDIO, (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan.n_audio()));
@@ -3895,21 +4087,110 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
switch (add_route_dialog->type_wanted()) {
case AddRouteDialog::AudioTrack:
- session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template);
+ session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template, strict_io, order);
break;
case AddRouteDialog::MidiTrack:
- session_add_midi_track (route_group, count, name_template, instrument);
+ session_add_midi_track (route_group, count, name_template, strict_io, instrument, 0, order);
break;
case AddRouteDialog::MixedTrack:
- session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, instrument);
+ session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument, 0, order);
break;
case AddRouteDialog::AudioBus:
- session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template);
+ session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io, order);
+ break;
+ case AddRouteDialog::MidiBus:
+ session_add_midi_bus (route_group, count, name_template, strict_io, instrument, 0, order);
+ break;
+ case AddRouteDialog::VCAMaster:
+ session_add_vca (name_template, count);
break;
}
}
void
+ARDOUR_UI::add_lua_script ()
+{
+ if (!_session) {
+ return;
+ }
+
+ LuaScriptInfoPtr spi;
+ ScriptSelector ss ("Add Lua Session Script", LuaScriptInfo::Session);
+ switch (ss.run ()) {
+ case Gtk::RESPONSE_ACCEPT:
+ spi = ss.script();
+ break;
+ default:
+ return;
+ }
+ ss.hide();
+
+ std::string script = "";
+
+ try {
+ script = Glib::file_get_contents (spi->path);
+ } catch (Glib::FileError e) {
+ string msg = string_compose (_("Cannot read session script '%1': %2"), spi->path, e.what());
+ MessageDialog am (msg);
+ am.run ();
+ return;
+ }
+
+ LuaScriptParamList lsp = LuaScriptParams::script_params (spi, "sess_params");
+ std::vector<std::string> reg = _session->registered_lua_functions ();
+
+ ScriptParameterDialog spd (_("Set Script Parameters"), spi, reg, lsp);
+ switch (spd.run ()) {
+ case Gtk::RESPONSE_ACCEPT:
+ break;
+ default:
+ return;
+ }
+
+ try {
+ _session->register_lua_function (spd.name(), script, lsp);
+ } catch (luabridge::LuaException const& e) {
+ string msg = string_compose (_("Session script '%1' instantiation failed: %2"), spd.name(), e.what ());
+ MessageDialog am (msg);
+ am.run ();
+ } catch (SessionException e) {
+ string msg = string_compose (_("Loading Session script '%1' failed: %2"), spd.name(), e.what ());
+ MessageDialog am (msg);
+ am.run ();
+ }
+}
+
+void
+ARDOUR_UI::remove_lua_script ()
+{
+ if (!_session) {
+ return;
+ }
+ if (_session->registered_lua_function_count () == 0) {
+ string msg = _("There are no active Lua session scripts present in this session.");
+ MessageDialog am (msg);
+ am.run ();
+ return;
+ }
+
+ std::vector<std::string> reg = _session->registered_lua_functions ();
+ SessionScriptManager sm ("Remove Lua Session Script", reg);
+ switch (sm.run ()) {
+ case Gtk::RESPONSE_ACCEPT:
+ break;
+ default:
+ return;
+ }
+ try {
+ _session->unregister_lua_function (sm.name());
+ } catch (luabridge::LuaException const& e) {
+ string msg = string_compose (_("Session script '%1' removal failed: %2"), sm.name(), e.what ());
+ MessageDialog am (msg);
+ am.run ();
+ }
+}
+
+void
ARDOUR_UI::stop_video_server (bool ask_confirm)
{
if (!video_server_process && ask_confirm) {
@@ -4269,6 +4550,24 @@ ARDOUR_UI::export_video (bool range)
}
XMLNode*
+ARDOUR_UI::preferences_settings () const
+{
+ XMLNode* node = 0;
+
+ if (_session) {
+ node = _session->instant_xml(X_("Preferences"));
+ } else {
+ node = Config->instant_xml(X_("Preferences"));
+ }
+
+ if (!node) {
+ node = new XMLNode (X_("Preferences"));
+ }
+
+ return node;
+}
+
+XMLNode*
ARDOUR_UI::mixer_settings () const
{
XMLNode* node = 0;
@@ -4287,6 +4586,30 @@ ARDOUR_UI::mixer_settings () const
}
XMLNode*
+ARDOUR_UI::main_window_settings () const
+{
+ XMLNode* node = 0;
+
+ if (_session) {
+ node = _session->instant_xml(X_("Main"));
+ } else {
+ node = Config->instant_xml(X_("Main"));
+ }
+
+ if (!node) {
+ if (getenv("ARDOUR_INSTANT_XML_PATH")) {
+ node = Config->instant_xml(getenv("ARDOUR_INSTANT_XML_PATH"));
+ }
+ }
+
+ if (!node) {
+ node = new XMLNode (X_("Main"));
+ }
+
+ return node;
+}
+
+XMLNode*
ARDOUR_UI::editor_settings () const
{
XMLNode* node = 0;
@@ -4337,7 +4660,7 @@ void
ARDOUR_UI::halt_on_xrun_message ()
{
cerr << "HALT on xrun\n";
- MessageDialog msg (*editor, _("Recording was stopped because your system could not keep up."));
+ MessageDialog msg (_main_window, _("Recording was stopped because your system could not keep up."));
msg.run ();
}
@@ -4366,7 +4689,7 @@ ARDOUR_UI::disk_overrun_handler ()
if (!have_disk_speed_dialog_displayed) {
have_disk_speed_dialog_displayed = true;
- MessageDialog* msg = new MessageDialog (*editor, string_compose (_("\
+ MessageDialog* msg = new MessageDialog (_main_window, string_compose (_("\
The disk system on your computer\n\
was not able to keep up with %1.\n\
\n\
@@ -4501,7 +4824,7 @@ ARDOUR_UI::disk_underrun_handler ()
if (!have_disk_speed_dialog_displayed) {
have_disk_speed_dialog_displayed = true;
MessageDialog* msg = new MessageDialog (
- *editor, string_compose (_("The disk system on your computer\n\
+ _main_window, string_compose (_("The disk system on your computer\n\
was not able to keep up with %1.\n\
\n\
Specifically, it failed to read data from disk\n\
@@ -4525,12 +4848,7 @@ ARDOUR_UI::session_dialog (std::string msg)
MessageDialog* d;
- if (editor) {
- d = new MessageDialog (*editor, msg, false, MESSAGE_INFO, BUTTONS_OK, true);
- } else {
- d = new MessageDialog (msg, false, MESSAGE_INFO, BUTTONS_OK, true);
- }
-
+ d = new MessageDialog (msg, false, MESSAGE_INFO, BUTTONS_OK, true);
d->show_all ();
d->run ();
delete d;
@@ -4604,6 +4922,21 @@ audio may be played at the wrong sample rate.\n"), desired, PROGRAM_NAME, actual
}
void
+ARDOUR_UI::sr_mismatch_message (framecnt_t desired, framecnt_t actual)
+{
+ MessageDialog msg (string_compose (_("\
+This session was created with a sample rate of %1 Hz, but\n\
+%2 is currently running at %3 Hz.\n\
+Audio will be recorded and played at the wrong sample rate.\n\
+Re-Configure the Audio Engine in\n\
+Menu > Window > Audio/Midi Setup"),
+ desired, PROGRAM_NAME, actual),
+ true,
+ Gtk::MESSAGE_WARNING);
+ msg.run ();
+}
+
+void
ARDOUR_UI::use_config ()
{
XMLNode* node = Config->extra_xml (X_("TransportControllables"));
@@ -4786,11 +5119,6 @@ ARDOUR_UI::setup_profile ()
Profile->set_small_screen ();
}
- if (g_getenv ("ARDOUR_SAE")) {
- Profile->set_sae ();
- Profile->set_single_package ();
- }
-
if (g_getenv ("TRX")) {
Profile->set_trx ();
}
@@ -4880,7 +5208,7 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat
MessageDialog msg (string_compose (_("%4This is a session from an older version of %3%5\n\n"
"%3 has copied the old session file\n\n%6%1%7\n\nto\n\n%6%2%7\n\n"
- "From now on, use the -2000 version with older versions of %3"),
+ "From now on, use the backup copy with older versions of %3"),
xml_path, backup_path, PROGRAM_NAME,
start_big, end_big,
start_mono, end_mono), true);
@@ -4922,10 +5250,15 @@ ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
audio_midi_setup->set_position (WIN_POS_CENTER);
- int response;
+ if (Config->get_try_autostart_engine () || getenv ("TRY_AUTOSTART_ENGINE")) {
+ audio_midi_setup->try_autostart ();
+ if (ARDOUR::AudioEngine::instance()->running()) {
+ return 0;
+ }
+ }
while (true) {
- response = audio_midi_setup->run();
+ int response = audio_midi_setup->run();
switch (response) {
case Gtk::RESPONSE_OK:
if (!AudioEngine::instance()->running()) {
@@ -5056,15 +5389,278 @@ ARDOUR_UI::hide_application ()
}
void
-ARDOUR_UI::cancel_solo ()
+ARDOUR_UI::setup_toplevel_window (Gtk::Window& window, const string& name, void* owner)
{
- if (_session) {
- if (_session->soloing()) {
- _session->set_solo (_session->get_routes(), false);
- } else if (_session->listening()) {
- _session->set_listen (_session->get_routes(), false);
+ /* icons, titles, WM stuff */
+
+ static list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
+
+ if (window_icons.empty()) {
+ Glib::RefPtr<Gdk::Pixbuf> icon;
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px"))) {
+ window_icons.push_back (icon);
+ }
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px"))) {
+ window_icons.push_back (icon);
+ }
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px"))) {
+ window_icons.push_back (icon);
+ }
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
+ window_icons.push_back (icon);
+ }
+ }
+
+ if (!window_icons.empty()) {
+ window.set_default_icon_list (window_icons);
+ }
+
+ Gtkmm2ext::WindowTitle title (Glib::get_application_name());
+
+ if (!name.empty()) {
+ title += name;
+ }
+
+ window.set_title (title.get_string());
+ window.set_wmclass (string_compose (X_("%1_%1"), downcase (PROGRAM_NAME), downcase (name)), PROGRAM_NAME);
+
+ window.set_flags (CAN_FOCUS);
+ window.add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
+
+ /* This is a hack to ensure that GTK-accelerators continue to
+ * work. Once we switch over to entirely native bindings, this will be
+ * unnecessary and should be removed
+ */
+ window.add_accel_group (ActionManager::ui_manager->get_accel_group());
+
+ window.signal_configure_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::configure_handler));
+ window.signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbed_window_state_event_handler), owner));
+ window.signal_key_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_event_handler), &window), false);
+ window.signal_key_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_event_handler), &window), false);
+}
+
+bool
+ARDOUR_UI::key_event_handler (GdkEventKey* ev, Gtk::Window* event_window)
+{
+ Gtkmm2ext::Bindings* bindings = 0;
+ Gtk::Window* window = 0;
+
+ /* until we get ardour bindings working, we are not handling key
+ * releases yet.
+ */
+
+ if (ev->type != GDK_KEY_PRESS) {
+ return false;
+ }
+
+ if (event_window == &_main_window) {
+
+ window = event_window;
+
+ /* find current tab contents */
+
+ Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page());
+
+ /* see if it uses the ardour binding system */
+
+ if (w) {
+ bindings = reinterpret_cast<Gtkmm2ext::Bindings*>(w->get_data ("ardour-bindings"));
+ }
+
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("main window key event, bindings = %1, global = %2\n", bindings, &global_bindings));
+
+ } else {
+
+ window = event_window;
+
+ /* see if window uses ardour binding system */
+
+ bindings = reinterpret_cast<Gtkmm2ext::Bindings*>(window->get_data ("ardour-bindings"));
+ }
+
+ /* An empty binding set is treated as if it doesn't exist */
+
+ if (bindings && bindings->empty()) {
+ bindings = 0;
+ }
+
+ return key_press_focus_accelerator_handler (*window, ev, bindings);
+}
+
+static Gtkmm2ext::Bindings*
+get_bindings_from_widget_heirarchy (GtkWidget* w)
+{
+ void* p = NULL;
+
+ while (w) {
+ if ((p = g_object_get_data (G_OBJECT(w), "ardour-bindings")) != 0) {
+ break;
}
+ w = gtk_widget_get_parent (w);
+ }
+
+ return reinterpret_cast<Gtkmm2ext::Bindings*> (p);
+}
+
+bool
+ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings* bindings)
+{
+ GtkWindow* win = window.gobj();
+ GtkWidget* focus = gtk_window_get_focus (win);
+ bool special_handling_of_unmodified_accelerators = false;
+ const guint mask = (Keyboard::RelevantModifierKeyMask & ~(Gdk::SHIFT_MASK|Gdk::LOCK_MASK));
+
+ if (focus) {
+
+ /* some widget has keyboard focus */
+
+ if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
+
+ /* A particular kind of focusable widget currently has keyboard
+ * focus. All unmodified key events should go to that widget
+ * first and not be used as an accelerator by default
+ */
+
+ special_handling_of_unmodified_accelerators = true;
+
+ } else {
+
+ Gtkmm2ext::Bindings* focus_bindings = get_bindings_from_widget_heirarchy (focus);
+ if (focus_bindings) {
+ bindings = focus_bindings;
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Switch bindings based on focus widget, now using %1\n", bindings->name()));
+ }
+ }
+ }
+
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 [title = %9] focus = %7 (%8) Key event: code = %2 state = %3 special handling ? %4 magic widget focus ? %5 focus widget %6 named %7 mods ? %8\n",
+ win,
+ ev->keyval,
+ Gtkmm2ext::show_gdk_event_state (ev->state),
+ special_handling_of_unmodified_accelerators,
+ Keyboard::some_magic_widget_has_focus(),
+ focus,
+ (focus ? gtk_widget_get_name (focus) : "no focus widget"),
+ ((ev->state & mask) ? "yes" : "no"),
+ window.get_title()));
+
+ /* This exists to allow us to override the way GTK handles
+ key events. The normal sequence is:
+
+ a) event is delivered to a GtkWindow
+ b) accelerators/mnemonics are activated
+ c) if (b) didn't handle the event, propagate to
+ the focus widget and/or focus chain
+
+ The problem with this is that if the accelerators include
+ keys without modifiers, such as the space bar or the
+ letter "e", then pressing the key while typing into
+ a text entry widget results in the accelerator being
+ activated, instead of the desired letter appearing
+ in the text entry.
+
+ There is no good way of fixing this, but this
+ represents a compromise. The idea is that
+ key events involving modifiers (not Shift)
+ get routed into the activation pathway first, then
+ get propagated to the focus widget if necessary.
+
+ If the key event doesn't involve modifiers,
+ we deliver to the focus widget first, thus allowing
+ it to get "normal text" without interference
+ from acceleration.
+
+ Of course, this can also be problematic: if there
+ is a widget with focus, then it will swallow
+ all "normal text" accelerators.
+ */
+
+
+ if (!special_handling_of_unmodified_accelerators || (ev->state & mask)) {
- _session->clear_all_solo_state (_session->get_routes()); // safeguard, ideally this won't do anything, check the log-window
+ /* no special handling or there are modifiers in effect: accelerate first */
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n");
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tevent send-event:%1 time:%2 length:%3 name %7 string:%4 hardware_keycode:%5 group:%6\n",
+ ev->send_event, ev->time, ev->length, ev->string, ev->hardware_keycode, ev->group, gdk_keyval_name (ev->keyval)));
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
+ KeyboardKey k (ev->state, ev->keyval);
+
+ if (bindings) {
+
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tusing Ardour bindings %1 @ %2 for this event\n", bindings->name(), bindings));
+
+ if (bindings->activate (k, Bindings::Press)) {
+ DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+ return true;
+ }
+ }
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n");
+
+ if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
+ DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+ return true;
+ }
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tnot accelerated, now propagate\n");
+
+ if (gtk_window_propagate_key_event (win, ev)) {
+ DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate handled\n");
+ return true;
+ }
+
+ } else {
+
+ /* no modifiers, propagate first */
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate, then activate\n");
+
+ if (gtk_window_propagate_key_event (win, ev)) {
+ DEBUG_TRACE (DEBUG::Accelerators, "\thandled by propagate\n");
+ return true;
+ }
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n");
+ KeyboardKey k (ev->state, ev->keyval);
+
+ if (bindings) {
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tusing Ardour bindings for this window\n");
+
+
+ if (bindings->activate (k, Bindings::Press)) {
+ DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+ return true;
+ }
+
+ }
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n");
+
+ if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
+ DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+ return true;
+ }
+ }
+
+ DEBUG_TRACE (DEBUG::Accelerators, "\tnot handled\n");
+ return true;
+}
+
+void
+ARDOUR_UI::load_bindings ()
+{
+ if ((global_bindings = Bindings::get_bindings (X_("Global"), global_actions)) == 0) {
+ error << _("Global keybindings are missing") << endmsg;
+ }
+}
+
+void
+ARDOUR_UI::cancel_solo ()
+{
+ if (_session) {
+ _session->cancel_all_solo ();
}
}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 3b62065..59a3c96 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -53,10 +53,13 @@
#include <gtkmm/menubar.h>
#include <gtkmm/textbuffer.h>
#include <gtkmm/adjustment.h>
-#include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/click_box.h>
-#include <gtkmm2ext/stateful_button.h>
-#include <gtkmm2ext/bindable_button.h>
+
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/click_box.h"
+#include "gtkmm2ext/stateful_button.h"
+#include "gtkmm2ext/bindable_button.h"
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/visibility_tracker.h"
#include "ardour/ardour.h"
#include "ardour/types.h"
@@ -86,6 +89,7 @@
#include "global_port_matrix.h"
#include "keyeditor.h"
#include "location_ui.h"
+#include "lua_script_manager.h"
#include "rc_option_editor.h"
#include "route_params_ui.h"
#include "session_option_editor.h"
@@ -100,6 +104,7 @@ class EngineControl;
class ExportVideoDialog;
class KeyEditor;
class LocationUIWindow;
+class LuaScriptManager;
class RCOptionEditor;
class RouteParams_UI;
class SessionOptionEditor;
@@ -119,11 +124,12 @@ class ArdourPrompter;
class PublicEditor;
class SaveAsDialog;
class SessionDialog;
-class SessionOptionEditor;
+class SessionOptionEditorWindow;
class ShuttleControl;
class Splash;
class TimeInfoBox;
class Meterbridge;
+class LuaWindow;
class MidiTracer;
class NSM_Client;
class LevelMeterHBox;
@@ -139,17 +145,17 @@ namespace ARDOUR {
class ProcessThread;
}
-namespace Gtkmm2ext {
- class TearOff;
-}
-
namespace Gtk {
class ProgressBar;
}
+namespace Gtkmm2ext {
+ class Tabbable;
+}
+
class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
{
- public:
+public:
ARDOUR_UI (int *argcp, char **argvp[], const char* localedir);
~ARDOUR_UI();
@@ -184,7 +190,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool get_smart_mode () const;
int get_session_parameters (bool quit_on_cancel, bool should_be_new = false, std::string load_template = "");
- int build_session_from_dialog (SessionDialog&, const std::string& session_name, const std::string& session_path);
+ int build_session_from_dialog (SessionDialog&, const std::string& session_name, const std::string& session_path);
bool ask_about_loading_existing_session (const std::string& session_path);
/// @return true if session was successfully unloaded.
@@ -196,6 +202,12 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
static ARDOUR_UI *instance () { return theArdourUI; }
+ /* signal emitted when escape key is pressed. All UI components that
+ need to respond to Escape in some way (e.g. break drag, clear
+ selection, etc) should connect to and handle this.
+ */
+ PBD::Signal0<void> Escape;
+
PublicEditor& the_editor() { return *editor;}
Mixer_UI* the_mixer() { return mixer; }
@@ -216,9 +228,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
static sigc::signal<void, framepos_t, bool, framepos_t> Clock;
static void close_all_dialogs () { CloseAllDialogs(); }
- static sigc::signal<void> CloseAllDialogs;
+ static sigc::signal<void> CloseAllDialogs;
+ XMLNode* main_window_settings() const;
XMLNode* editor_settings() const;
+ XMLNode* preferences_settings() const;
XMLNode* mixer_settings () const;
XMLNode* keyboard_settings () const;
XMLNode* tearoff_settings (const char*) const;
@@ -247,12 +261,17 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void synchronize_sync_source_and_video_pullup ();
- void add_route (Gtk::Window* float_window);
- void add_routes_part_two ();
- void add_routes_thread ();
+ void add_route ();
+ void add_route_dialog_finished (int);
+
+ void add_routes_part_two ();
+ void add_routes_thread ();
void start_duplicate_routes ();
+ void add_lua_script ();
+ void remove_lua_script ();
+
void add_video (Gtk::Window* float_window);
void remove_video ();
void start_video_server_menu (Gtk::Window* float_window);
@@ -261,36 +280,57 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void flush_videotimeline_cache (bool localcacheonly=false);
void export_video (bool range = false);
+ void session_add_vca (std::string const &, uint32_t);
+
+ void session_add_audio_route (bool, int32_t, int32_t, ARDOUR::TrackMode, ARDOUR::RouteGroup *, uint32_t, std::string const &, bool, ARDOUR::PresentationInfo::order_t order);
void session_add_audio_track (
int input_channels,
int32_t output_channels,
ARDOUR::TrackMode mode,
ARDOUR::RouteGroup* route_group,
uint32_t how_many,
- std::string const & name_template
+ std::string const & name_template,
+ bool strict_io,
+ ARDOUR::PresentationInfo::order_t order
) {
-
- session_add_audio_route (true, input_channels, output_channels, mode, route_group, how_many, name_template);
+ session_add_audio_route (true, input_channels, output_channels, mode, route_group, how_many, name_template, strict_io, order);
}
- void session_add_audio_bus (int input_channels, int32_t output_channels, ARDOUR::RouteGroup* route_group,
- uint32_t how_many, std::string const & name_template) {
- session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many, name_template);
+ void session_add_audio_bus (
+ int input_channels,
+ int32_t output_channels,
+ ARDOUR::RouteGroup* route_group,
+ uint32_t how_many,
+ std::string const & name_template,
+ bool strict_io,
+ ARDOUR::PresentationInfo::order_t order
+ ) {
+ session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many, name_template, strict_io, order);
}
- void session_add_midi_track (ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
- ARDOUR::PluginInfoPtr instrument) {
- session_add_midi_route (true, route_group, how_many, name_template, instrument);
+ void session_add_midi_track (
+ ARDOUR::RouteGroup* route_group,
+ uint32_t how_many,
+ std::string const & name_template,
+ bool strict_io,
+ ARDOUR::PluginInfoPtr instrument,
+ ARDOUR::Plugin::PresetRecord* preset,
+ ARDOUR::PresentationInfo::order_t order
+ ) {
+ session_add_midi_route (true, route_group, how_many, name_template, strict_io, instrument, preset, order);
}
- void session_add_mixed_track (const ARDOUR::ChanCount& input, const ARDOUR::ChanCount& output, ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
- ARDOUR::PluginInfoPtr instrument);
-
- /*void session_add_midi_bus () {
- session_add_midi_route (false);
- }*/
-
- void attach_to_engine ();
+ void session_add_mixed_track (const ARDOUR::ChanCount&, const ARDOUR::ChanCount&, ARDOUR::RouteGroup*, uint32_t, std::string const &, bool,
+ ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord* pset,
+ ARDOUR::PresentationInfo::order_t order);
+ void session_add_midi_bus (ARDOUR::RouteGroup*, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord* pset,
+ ARDOUR::PresentationInfo::order_t order);
+ void session_add_midi_route (bool, ARDOUR::RouteGroup *, uint32_t, std::string const &, bool,
+ ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord*,
+ ARDOUR::PresentationInfo::order_t order);
+ void display_insufficient_ports_message ();
+
+ void attach_to_engine ();
void post_engine ();
gint exit_on_main_window_close (GdkEventAny *);
@@ -302,8 +342,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool check_audioengine(Gtk::Window&);
- void update_tearoff_visibility ();
-
void setup_profile ();
void setup_tooltips ();
@@ -316,11 +354,29 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void reset_route_peak_display (ARDOUR::Route*);
void reset_group_peak_display (ARDOUR::RouteGroup*);
- const std::string& announce_string() const { return _announce_string; }
+ const std::string& announce_string() const { return _announce_string; }
void hide_application ();
- protected:
+ Gtk::Notebook& tabs();
+ Gtk::Window& main_window () { return _main_window; }
+
+ void setup_toplevel_window (Gtk::Window&, const std::string& name, void* owner);
+
+ /* called from a static C function */
+
+ GtkNotebook* tab_window_root_drop (GtkNotebook* src,
+ GtkWidget* w,
+ gint x,
+ gint y,
+ gpointer user_data);
+
+ bool tabbed_window_state_event_handler (GdkEventWindowState*, void* object);
+ bool key_event_handler (GdkEventKey*, Gtk::Window* window);
+
+ Gtkmm2ext::ActionMap global_actions;
+
+protected:
friend class PublicEditor;
void toggle_auto_play ();
@@ -334,25 +390,38 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void reenable_hide_loop_punch_ruler_if_appropriate ();
void toggle_auto_return ();
void toggle_click ();
- void toggle_audio_midi_setup ();
+ void toggle_audio_midi_setup ();
void toggle_session_auto_loop ();
void toggle_rc_options_window ();
void toggle_session_options_window ();
- private:
- PublicEditor* editor;
- Mixer_UI* mixer;
- NSM_Client* nsm;
- bool _was_dirty;
- bool _mixer_on_top;
- bool _initial_verbose_plugin_scan;
- bool first_time_engine_run;
-
- void goto_editor_window ();
- void goto_mixer_window ();
- void toggle_mixer_window ();
+private:
+ Gtk::Window _main_window;
+ Gtkmm2ext::VisibilityTracker* main_window_visibility;
+ Gtk::VBox main_vpacker;
+ Gtk::HBox status_bar_hpacker;
+ Gtk::Notebook _tabs;
+ PublicEditor* editor;
+ Mixer_UI* mixer;
+ Gtk::Tooltips _tooltips;
+ NSM_Client* nsm;
+ bool _was_dirty;
+ bool _mixer_on_top;
+ bool _initial_verbose_plugin_scan;
+ bool first_time_engine_run;
+
+ void show_tabbable (Gtkmm2ext::Tabbable*);
+ void hide_tabbable (Gtkmm2ext::Tabbable*);
+ void detach_tabbable (Gtkmm2ext::Tabbable*);
+ void attach_tabbable (Gtkmm2ext::Tabbable*);
+ void button_change_tabbable_visibility (Gtkmm2ext::Tabbable*);
+ void key_change_tabbable_visibility (Gtkmm2ext::Tabbable*);
+ void toggle_editor_and_mixer ();
+
+ void tabbable_state_change (Gtkmm2ext::Tabbable&);
+
void toggle_meterbridge ();
- void toggle_editor_mixer ();
+ void toggle_luawindow ();
int setup_windows ();
void setup_transport ();
@@ -361,7 +430,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
static ARDOUR_UI *theArdourUI;
SessionDialog *_session_dialog;
- int starting ();
+ int starting ();
int ask_about_saving_session (const std::vector<std::string>& actions);
@@ -371,6 +440,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void update_autosave();
sigc::connection _autosave_connection;
+ void session_dirty_changed ();
+ void update_title ();
+
void map_transport_state ();
int32_t do_engine_start ();
@@ -389,22 +461,14 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void start_clocking ();
void stop_clocking ();
- bool main_window_state_event_handler (GdkEventWindowState*, bool window_was_editor);
-
void update_transport_clocks (framepos_t pos);
void record_state_changed ();
std::list<MidiTracer*> _midi_tracer_windows;
- void detach_tearoff (Gtk::Box* parent, Gtk::Widget* contents);
- void reattach_tearoff (Gtk::Box* parent, Gtk::Widget* contents, int32_t order);
- void reattach_all_tearoffs ();
-
/* Transport Control */
- Gtkmm2ext::TearOff* transport_tearoff;
Gtk::Frame transport_frame;
- Gtk::HBox transport_tearoff_hbox;
Gtk::HBox transport_hbox;
Gtk::Fixed transport_base;
Gtk::Fixed transport_button_base;
@@ -475,6 +539,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
ArdourButton feedback_alert_button;
ArdourButton error_alert_button;
+ ArdourButton action_script_call_btn[10];
+ Gtk::Table action_script_table;
+
Gtk::VBox alert_box;
Gtk::VBox meter_box;
LevelMeterHBox * editor_meter;
@@ -568,9 +635,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void edit_metadata ();
void import_metadata ();
- void session_add_audio_route (bool, int32_t, int32_t, ARDOUR::TrackMode, ARDOUR::RouteGroup *, uint32_t, std::string const &);
- void session_add_midi_route (bool, ARDOUR::RouteGroup *, uint32_t, std::string const &, ARDOUR::PluginInfoPtr);
-
void set_transport_sensitivity (bool);
//stuff for ProTools-style numpad
@@ -616,41 +680,49 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool save_as_progress_update (float fraction, int64_t cnt, int64_t total, Gtk::Label* label, Gtk::ProgressBar* bar);
void save_session_as ();
void rename_session ();
- void setup_order_hint (AddRouteDialog::InsertAt);
+ ARDOUR::PresentationInfo::order_t translate_order (AddRouteDialog::InsertAt);
int create_mixer ();
int create_editor ();
+ int create_meterbridge ();
+ int create_luawindow ();
+ int create_masters ();
Meterbridge *meterbridge;
- int create_meterbridge ();
- /* Dialogs that can be created via new<T> */
-
- WM::Proxy<SpeakerDialog> speaker_config_window;
- WM::Proxy<KeyEditor> key_editor;
- WM::Proxy<RCOptionEditor> rc_option_editor;
- WM::Proxy<AddRouteDialog> add_route_dialog;
- WM::Proxy<About> about;
- WM::Proxy<LocationUIWindow> location_ui;
- WM::Proxy<RouteParams_UI> route_params;
- WM::Proxy<EngineControl> audio_midi_setup;
- WM::Proxy<ExportVideoDialog> export_video_dialog;
-
- /* Windows/Dialogs that require a creator method */
-
- WM::ProxyWithConstructor<SessionOptionEditor> session_option_editor;
- WM::ProxyWithConstructor<AddVideoDialog> add_video_dialog;
- WM::ProxyWithConstructor<BundleManager> bundle_manager;
- WM::ProxyWithConstructor<BigClockWindow> big_clock_window;
- WM::ProxyWithConstructor<GlobalPortMatrixWindow> audio_port_matrix;
- WM::ProxyWithConstructor<GlobalPortMatrixWindow> midi_port_matrix;
-
- /* creator methods */
-
- SessionOptionEditor* create_session_option_editor ();
- BundleManager* create_bundle_manager ();
- AddVideoDialog* create_add_video_dialog ();
- BigClockWindow* create_big_clock_window();
- GlobalPortMatrixWindow* create_global_port_matrix (ARDOUR::DataType);
+ LuaWindow *luawindow;
+
+ /* Dialogs that can be created via new<T> */
+
+ RCOptionEditor* rc_option_editor;
+ Gtk::HBox rc_option_editor_placeholder;
+
+ WM::Proxy<SpeakerDialog> speaker_config_window;
+ WM::Proxy<AddRouteDialog> add_route_dialog;
+ WM::Proxy<About> about;
+ WM::Proxy<LocationUIWindow> location_ui;
+ WM::Proxy<RouteParams_UI> route_params;
+ WM::Proxy<EngineControl> audio_midi_setup;
+ WM::Proxy<ExportVideoDialog> export_video_dialog;
+ WM::Proxy<LuaScriptManager> lua_script_window;
+
+ /* Windows/Dialogs that require a creator method */
+
+ WM::ProxyWithConstructor<SessionOptionEditor> session_option_editor;
+ WM::ProxyWithConstructor<AddVideoDialog> add_video_dialog;
+ WM::ProxyWithConstructor<BundleManager> bundle_manager;
+ WM::ProxyWithConstructor<BigClockWindow> big_clock_window;
+ WM::ProxyWithConstructor<GlobalPortMatrixWindow> audio_port_matrix;
+ WM::ProxyWithConstructor<GlobalPortMatrixWindow> midi_port_matrix;
+ WM::ProxyWithConstructor<KeyEditor> key_editor;
+
+ /* creator methods */
+
+ SessionOptionEditor* create_session_option_editor ();
+ BundleManager* create_bundle_manager ();
+ AddVideoDialog* create_add_video_dialog ();
+ BigClockWindow* create_big_clock_window();
+ GlobalPortMatrixWindow* create_global_port_matrix (ARDOUR::DataType);
+ KeyEditor* create_key_editor ();
ARDOUR::SystemExec *video_server_process;
@@ -664,7 +736,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void install_actions ();
- void toggle_record_enable (uint32_t);
+ void toggle_record_enable (uint16_t);
uint32_t rec_enabled_streams;
void count_recenabled_streams (ARDOUR::Route&);
@@ -700,11 +772,12 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void plugin_scan_dialog (std::string type, std::string plugin, bool);
void plugin_scan_timeout (int);
- void session_format_mismatch (std::string, std::string);
+ void session_format_mismatch (std::string, std::string);
void session_dialog (std::string);
int pending_state_dialog ();
int sr_mismatch_dialog (ARDOUR::framecnt_t, ARDOUR::framecnt_t);
+ void sr_mismatch_message (ARDOUR::framecnt_t, ARDOUR::framecnt_t);
Gtk::MenuItem* jack_disconnect_item;
Gtk::MenuItem* jack_reconnect_item;
@@ -737,26 +810,22 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
Glib::RefPtr<Gtk::TextBuffer::Tag> ptag, Glib::RefPtr<Gtk::TextBuffer::Tag> mtag,
const char *msg);
Gtk::Label status_bar_label;
- bool status_bar_button_press (GdkEventButton*);
+ bool status_bar_button_press (GdkEventButton*);
void loading_message (const std::string& msg);
PBD::ScopedConnectionList forever_connections;
- PBD::ScopedConnection halt_connection;
-
- void step_edit_status_change (bool);
+ PBD::ScopedConnection halt_connection;
- void platform_specific ();
- void platform_setup ();
+ void step_edit_status_change (bool);
- /* these are used only in response to a platform-specific "ShouldQuit" signal
- */
+ /* these are used only in response to a platform-specific "ShouldQuit" signal */
bool idle_finish ();
void queue_finish ();
void fontconfig_dialog ();
- int missing_file (ARDOUR::Session*s, std::string str, ARDOUR::DataType type);
- int ambiguous_file (std::string file, std::vector<std::string> hits);
+ int missing_file (ARDOUR::Session*s, std::string str, ARDOUR::DataType type);
+ int ambiguous_file (std::string file, std::vector<std::string> hits);
bool click_button_clicked (GdkEventButton *);
@@ -788,13 +857,37 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool xrun_button_release (GdkEventButton* ev);
- std::string _announce_string;
- void check_announcements ();
+ std::string _announce_string;
+ void check_announcements ();
- int do_audio_midi_setup (uint32_t);
+ int do_audio_midi_setup (uint32_t);
void audioengine_became_silent ();
DuplicateRouteDialog* duplicate_routes_dialog;
+
+ void grab_focus_after_dialog ();
+
+ void tabs_switch (GtkNotebookPage*, guint page_number);
+ void tabs_page_added (Gtk::Widget*, guint);
+ void tabs_page_removed (Gtk::Widget*, guint);
+ ArdourButton editor_visibility_button;
+ ArdourButton mixer_visibility_button;
+ ArdourButton prefs_visibility_button;
+
+ bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings*);
+ bool try_gtk_accel_binding (GtkWindow* win, GdkEventKey* ev, bool translate, GdkModifierType modifier);
+
+ bool main_window_delete_event (GdkEventAny*);
+ bool idle_ask_about_quit ();
+
+ void load_bindings ();
+ bool tabbable_visibility_button_press (GdkEventButton* ev, std::string const& tabbable_name);
+
+ void step_up_through_tabs ();
+ void step_down_through_tabs ();
+
+ void escape ();
+ void pre_release_dialog ();
};
#endif /* __ardour_gui_h__ */
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 3e8fde5..c4404b8 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -29,13 +29,16 @@
#include <cmath>
#include <sigc++/bind.h>
+#include "canvas/canvas.h"
+
#include "pbd/error.h"
#include "pbd/basename.h"
#include "pbd/fastlog.h"
-#include <gtkmm2ext/cairocell.h>
-#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/click_box.h>
-#include <gtkmm2ext/tearoff.h>
+
+#include "gtkmm2ext/cairocell.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/click_box.h"
+#include "gtkmm2ext/window_title.h"
#include "ardour/profile.h"
#include "ardour/session.h"
@@ -47,6 +50,7 @@
#include "audio_clock.h"
#include "actions.h"
#include "main_clock.h"
+#include "mixer_ui.h"
#include "utils.h"
#include "theme_manager.h"
#include "midi_tracer.h"
@@ -56,7 +60,7 @@
#include "rc_option_editor.h"
#include "time_info_box.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -66,65 +70,12 @@ using namespace Gtk;
using namespace Glib;
using namespace ARDOUR_UI_UTILS;
-int
-ARDOUR_UI::setup_windows ()
-{
- if (create_editor ()) {
- error << _("UI: cannot setup editor") << endmsg;
- return -1;
- }
-
- if (create_mixer ()) {
- error << _("UI: cannot setup mixer") << endmsg;
- return -1;
- }
-
- if (create_meterbridge ()) {
- error << _("UI: cannot setup meterbridge") << endmsg;
- return -1;
- }
-
- /* all other dialogs are created conditionally */
-
- we_have_dependents ();
-
-#ifdef TOP_MENUBAR
- HBox* status_bar_packer = manage (new HBox);
- EventBox* status_bar_event_box = manage (new EventBox);
-
- status_bar_event_box->add (status_bar_label);
- status_bar_event_box->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
- status_bar_label.set_size_request (300, -1);
- status_bar_packer->pack_start (*status_bar_event_box, true, true, 6);
-
- status_bar_label.show ();
- status_bar_event_box->show ();
- status_bar_packer->show ();
-
- status_bar_event_box->signal_button_press_event().connect (mem_fun (*this, &ARDOUR_UI::status_bar_button_press));
-
- editor->get_status_bar_packer().pack_start (*status_bar_packer, true, true);
- editor->get_status_bar_packer().pack_start (menu_bar_base, false, false, 2);
-#else
- top_packer.pack_start (menu_bar_base, false, false);
-#endif
-
- editor->add_toplevel_menu (top_packer);
-
- editor->add_transport_frame (transport_frame);
-
- setup_transport();
-
- build_menu_bar ();
-
- setup_tooltips ();
-
- return 0;
-}
void
ARDOUR_UI::setup_tooltips ()
{
+ ArdourCanvas::Canvas::set_tooltip_timeout (Gtk::Settings::get_default()->property_gtk_tooltip_timeout ());
+
set_tip (roll_button, _("Play from playhead"));
set_tip (stop_button, _("Stop playback"));
set_tip (rec_button, _("Toggle record"));
@@ -218,23 +169,23 @@ ARDOUR_UI::tearoff_settings (const char* name) const
#define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
+static
+bool drag_failed (const Glib::RefPtr<Gdk::DragContext>& context, DragResult result, Tabbable* tab)
+{
+ if (result == Gtk::DRAG_RESULT_NO_TARGET) {
+ tab->detach ();
+ return true;
+ }
+ return false;
+}
+
void
ARDOUR_UI::setup_transport ()
{
RefPtr<Action> act;
- transport_tearoff_hbox.set_border_width (PX_SCALE(3));
- transport_tearoff_hbox.set_spacing (PX_SCALE(3));
-
- transport_tearoff = manage (new TearOff (transport_tearoff_hbox));
- transport_tearoff->set_name ("TransportBase");
- transport_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &transport_tearoff->tearoff_window()), false);
-
- if (Profile->get_sae() || Profile->get_mixbus()) {
- transport_tearoff->set_can_be_torn_off (false);
- }
-
- transport_hbox.pack_start (*transport_tearoff, true, false);
+ transport_hbox.set_border_width (PX_SCALE(3));
+ transport_hbox.set_spacing (PX_SCALE(3));
transport_base.set_name ("TransportBase");
transport_base.add (transport_hbox);
@@ -243,15 +194,6 @@ ARDOUR_UI::setup_transport ()
transport_frame.set_name ("BaseFrame");
transport_frame.add (transport_base);
- transport_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::detach_tearoff), static_cast<Box*>(&top_packer),
- static_cast<Widget*>(&transport_frame)));
- transport_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::reattach_tearoff), static_cast<Box*> (&top_packer),
- static_cast<Widget*> (&transport_frame), 1));
- transport_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::detach_tearoff), static_cast<Box*>(&top_packer),
- static_cast<Widget*>(&transport_frame)));
- transport_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::reattach_tearoff), static_cast<Box*> (&top_packer),
- static_cast<Widget*> (&transport_frame), 1));
-
auto_return_button.set_text(_("Auto Return"));
follow_edits_button.set_text(_("Follow Edits"));
@@ -425,11 +367,7 @@ ARDOUR_UI::setup_transport ()
time_info_box = manage (new TimeInfoBox);
- if (ARDOUR::Profile->get_trx()) {
- transport_tearoff_hbox.pack_start (*time_info_box, false, false);
- }
-
- transport_tearoff_hbox.pack_start (*transport_vbox, false, false);
+ transport_hbox.pack_start (*transport_vbox, false, true);
/* transport related toggle controls */
@@ -443,60 +381,67 @@ ARDOUR_UI::setup_transport ()
}
if (!ARDOUR::Profile->get_trx()) {
- transport_tearoff_hbox.pack_start (*auto_box, false, false);
+ transport_hbox.pack_start (*auto_box, false, false);
}
- transport_tearoff_hbox.pack_start (*clock_box, true, true);
+ transport_hbox.pack_start (*clock_box, true, true);
if (ARDOUR::Profile->get_trx()) {
- transport_tearoff_hbox.pack_start (*auto_box, false, false);
+ transport_hbox.pack_start (*auto_box, false, false);
}
if (!ARDOUR::Profile->get_trx()) {
- transport_tearoff_hbox.pack_start (*time_info_box, false, false);
+ transport_hbox.pack_start (*time_info_box, false, false);
}
if (!ARDOUR::Profile->get_trx()) {
- transport_tearoff_hbox.pack_start (alert_box, false, false);
- transport_tearoff_hbox.pack_start (meter_box, false, false);
- transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
+ transport_hbox.pack_start (alert_box, false, false);
+ transport_hbox.pack_start (meter_box, false, false);
+ transport_hbox.pack_start (editor_meter_peak_display, false, false);
}
- if (Profile->get_sae()) {
- Image* img = manage (new Image ((::get_icon (X_("sae")))));
- transport_tearoff_hbox.pack_end (*img, false, false);
- }
+ Gtk::VBox* window_button_box = manage (new Gtk::VBox);
- /* desensitize */
+ editor_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), editor));
+ mixer_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), mixer));
+ prefs_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), rc_option_editor));
- set_transport_sensitivity (false);
+ /* catch context clicks so that we can show a menu on these buttons */
- XMLNode* tnode = tearoff_settings ("transport");
- if (tnode) {
- transport_tearoff->set_state (*tnode);
- }
-}
-#undef PX_SCALE
+ editor_visibility_button.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_visibility_button_press), X_("editor")), false);
+ mixer_visibility_button.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_visibility_button_press), X_("mixer")), false);
+ prefs_visibility_button.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_visibility_button_press), X_("preferences")), false);
-void
-ARDOUR_UI::detach_tearoff (Box* b, Widget* w)
-{
-// editor->ensure_float (transport_tearoff->tearoff_window());
- b->remove (*w);
-}
+ editor_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-editor-visibility")));
+ editor_visibility_button.set_name (X_("page switch button"));
+ mixer_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-mixer-visibility")));
+ mixer_visibility_button.set_name (X_("page switch button"));
+ prefs_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-preferences-visibility")));
+ prefs_visibility_button.set_name (X_("page switch button"));
-void
-ARDOUR_UI::reattach_tearoff (Box* b, Widget* w, int32_t n)
-{
- b->pack_start (*w);
- b->reorder_child (*w, n);
-}
+ Gtkmm2ext::UI::instance()->set_tip (editor_visibility_button,
+ string_compose (_("Drag this tab to the desktop to show %1 in its own window\n\n"
+ "To put the window back, use the Window > %1 > Attach menu action"), editor->name()));
-void
-ARDOUR_UI::reattach_all_tearoffs ()
-{
- if (transport_tearoff) transport_tearoff->put_it_back();
- if (editor) editor->reattach_all_tearoffs ();
+ Gtkmm2ext::UI::instance()->set_tip (mixer_visibility_button,
+ string_compose (_("Drag this tab to the desktop to show %1 in its own window\n\n"
+ "To put the window back, use the Window > %1 > Attach menu action"), mixer->name()));
+
+ Gtkmm2ext::UI::instance()->set_tip (prefs_visibility_button,
+ string_compose (_("Drag this tab to the desktop to show %1 in its own window\n\n"
+ "To put the window back, use the Window > %1 > Attach menu action"), rc_option_editor->name()));
+
+ window_button_box->pack_start (editor_visibility_button, true, false);
+ window_button_box->pack_start (mixer_visibility_button, true, false);
+ window_button_box->pack_start (prefs_visibility_button, true, false);
+
+ transport_hbox.pack_end (*window_button_box, false, false);
+ transport_hbox.pack_end (action_script_table, false, false);
+
+ /* desensitize */
+
+ set_transport_sensitivity (false);
}
+#undef PX_SCALE
void
ARDOUR_UI::soloing_changed (bool onoff)
@@ -670,14 +615,6 @@ ARDOUR_UI::editor_realized ()
}
void
-ARDOUR_UI::update_tearoff_visibility ()
-{
- if (editor) {
- editor->update_tearoff_visibility ();
- }
-}
-
-void
ARDOUR_UI::maximise_editing_space ()
{
if (editor) {
@@ -696,15 +633,12 @@ ARDOUR_UI::restore_editing_space ()
void
ARDOUR_UI::show_ui_prefs ()
{
- RefPtr<Action> act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor"));
- assert (act);
-
- act->activate();
-
- rc_option_editor->set_current_page (_("GUI"));
+ if (rc_option_editor) {
+ show_tabbable (rc_option_editor);
+ rc_option_editor->set_current_page (_("GUI"));
+ }
}
-
bool
ARDOUR_UI::click_button_clicked (GdkEventButton* ev)
{
@@ -713,12 +647,8 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev)
return false;
}
- RefPtr<Action> act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor"));
- assert (act);
-
- act->activate();
-
- rc_option_editor->set_current_page (_("Misc"));
+ show_tabbable (rc_option_editor);
+ rc_option_editor->set_current_page (_("Misc/Click"));
return true;
}
@@ -734,4 +664,30 @@ ARDOUR_UI::toggle_follow_edits ()
UIConfiguration::instance().set_follow_edits (tact->get_active ());
}
+void
+ARDOUR_UI::update_title ()
+{
+ if (_session) {
+ bool dirty = _session->dirty();
+ string session_name;
+
+ if (_session->snap_name() != _session->name()) {
+ session_name = _session->snap_name();
+ } else {
+ session_name = _session->name();
+ }
+
+ if (dirty) {
+ session_name = "*" + session_name;
+ }
+
+ WindowTitle title (session_name);
+ title += Glib::get_application_name();
+ _main_window.set_title (title.get_string());
+ } else {
+ WindowTitle title (Glib::get_application_name());
+ _main_window.set_title (title.get_string());
+ }
+
+}
diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc
index 7227d4f..8490643 100644
--- a/gtk2_ardour/ardour_ui_dependents.cc
+++ b/gtk2_ardour/ardour_ui_dependents.cc
@@ -31,16 +31,22 @@
#include "ardour/session.h"
+#include "gtkmm2ext/bindings.h"
+
#include "actions.h"
#include "ardour_ui.h"
#include "public_editor.h"
#include "meterbridge.h"
+#include "luawindow.h"
#include "mixer_ui.h"
#include "keyboard.h"
#include "splash.h"
+#include "rc_option_editor.h"
#include "route_params_ui.h"
#include "opts.h"
-#include "i18n.h"
+#include "utils.h"
+
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace PBD;
@@ -56,18 +62,53 @@ void
ARDOUR_UI::we_have_dependents ()
{
install_actions ();
+ load_bindings ();
+
ProcessorBox::register_actions ();
- keyboard->setup_keybindings ();
+
+ /* Global, editor, mixer, processor box actions are defined now. Link
+ them with any bindings, so that GTK does not get a chance to define
+ the GTK accel map entries first when we ask the GtkUIManager to
+ create menus/widgets.
+
+ If GTK adds the actions to its accel map before we do, we lose our
+ freedom to use any keys. More precisely, we can use any keys, but
+ ones that GTK considers illegal as accelerators will not show up in
+ menus.
+
+ There are other dynamic actions that can be created by a monitor
+ section, by step entry dialogs. These need to be handled
+ separately. They don't tend to use GTK-illegal bindings and more
+ importantly they don't have menus showing the bindings, so it is
+ less of an issue.
+ */
+
+ Gtkmm2ext::Bindings::associate_all ();
+
editor->setup_tooltips ();
editor->UpdateAllTransportClocks.connect (sigc::mem_fun (*this, &ARDOUR_UI::update_transport_clocks));
+ /* catch up on tabbable state, in the right order to leave the editor
+ * selected by default
+ */
+
+ tabbable_state_change (*rc_option_editor);
+ tabbable_state_change (*mixer);
+ tabbable_state_change (*editor);
+
/* all actions are defined */
- ActionManager::enable_accelerators ();
ActionManager::load_menus (ARDOUR_COMMAND_LINE::menus_file);
editor->track_mixer_selection ();
mixer->track_editor_selection ();
+
+ /* catch up on parameters */
+
+ boost::function<void (std::string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
+ Config->map_parameters (pc);
+
+ UIConfiguration::instance().reset_dpi ();
}
void
@@ -79,6 +120,7 @@ ARDOUR_UI::connect_dependents_to_session (ARDOUR::Session *s)
BootMessage (_("Setup Mixer"));
mixer->set_session (s);
meterbridge->set_session (s);
+ luawindow->set_session (s);
/* its safe to do this now */
@@ -101,3 +143,258 @@ ARDOUR_UI::exit_on_main_window_close (GdkEventAny * /*ev*/)
#endif
}
+GtkNotebook*
+ARDOUR_UI::tab_window_root_drop (GtkNotebook* src,
+ GtkWidget* w,
+ gint x,
+ gint y,
+ gpointer)
+{
+ using namespace std;
+ Gtk::Notebook* nb = 0;
+ Gtk::Window* win = 0;
+ Gtkmm2ext::Tabbable* tabbable = 0;
+
+
+ if (w == GTK_WIDGET(editor->contents().gobj())) {
+ tabbable = editor;
+ } else if (w == GTK_WIDGET(mixer->contents().gobj())) {
+ tabbable = mixer;
+ } else if (w == GTK_WIDGET(rc_option_editor->contents().gobj())) {
+ tabbable = rc_option_editor;
+ } else {
+ return 0;
+ }
+
+ nb = tabbable->tab_root_drop ();
+ win = tabbable->own_window ();
+
+ if (nb) {
+ win->move (x, y);
+ win->show_all ();
+ win->present ();
+ return nb->gobj();
+ }
+
+ return 0; /* what was that? */
+}
+
+bool
+ARDOUR_UI::idle_ask_about_quit ()
+{
+ if (_session && _session->dirty()) {
+ finish ();
+ } else {
+ /* no session or session not dirty, but still ask anyway */
+
+ Gtk::MessageDialog msg (string_compose ("Quit %1?", PROGRAM_NAME),
+ false, /* no markup */
+ Gtk::MESSAGE_INFO,
+ Gtk::BUTTONS_YES_NO,
+ true); /* modal */
+ msg.set_default_response (Gtk::RESPONSE_YES);
+
+ if (msg.run() == Gtk::RESPONSE_YES) {
+ finish ();
+ }
+ }
+
+ /* not reached but keep the compiler happy */
+
+ return false;
+}
+
+bool
+ARDOUR_UI::main_window_delete_event (GdkEventAny* ev)
+{
+ /* quit the application as soon as we go idle. If we call this here,
+ * the window manager/desktop can think we're taking too longer to
+ * handle the "delete" event
+ */
+
+ Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::idle_ask_about_quit));
+
+ return true;
+}
+
+static GtkNotebook*
+tab_window_root_drop (GtkNotebook* src,
+ GtkWidget* w,
+ gint x,
+ gint y,
+ gpointer user_data)
+{
+ return ARDOUR_UI::instance()->tab_window_root_drop (src, w, x, y, user_data);
+}
+
+int
+ARDOUR_UI::setup_windows ()
+{
+ /* actions do not need to be defined when we load keybindings. They
+ * will be lazily discovered. But bindings do need to exist when we
+ * create windows/tabs with their own binding sets.
+ */
+
+ keyboard->setup_keybindings ();
+
+ _tabs.signal_switch_page().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_switch));
+ _tabs.signal_page_added().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_page_added));
+ _tabs.signal_page_removed().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_page_removed));
+
+ rc_option_editor = new RCOptionEditor;
+ rc_option_editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change));
+
+ if (create_editor ()) {
+ error << _("UI: cannot setup editor") << endmsg;
+ return -1;
+ }
+
+ if (create_mixer ()) {
+ error << _("UI: cannot setup mixer") << endmsg;
+ return -1;
+ }
+
+ if (create_meterbridge ()) {
+ error << _("UI: cannot setup meterbridge") << endmsg;
+ return -1;
+ }
+
+ if (create_luawindow ()) {
+ error << _("UI: cannot setup luawindow") << endmsg;
+ return -1;
+ }
+
+ /* order of addition affects order seen in initial window display */
+
+ rc_option_editor->add_to_notebook (_tabs, _("Preferences"));
+ mixer->add_to_notebook (_tabs, _("Mixer"));
+ editor->add_to_notebook (_tabs, _("Editor"));
+
+ /* all other dialogs are created conditionally */
+
+ we_have_dependents ();
+
+#ifdef TOP_MENUBAR
+ EventBox* status_bar_event_box = manage (new EventBox);
+
+ status_bar_event_box->add (status_bar_label);
+ status_bar_event_box->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+ status_bar_label.set_size_request (300, -1);
+
+ status_bar_label.show ();
+ status_bar_event_box->show ();
+
+ status_bar_event_box->signal_button_press_event().connect (mem_fun (*this, &ARDOUR_UI::status_bar_button_press));
+
+ status_bar_hpacker.pack_start (*status_bar_event_box, true, true, 6);
+ status_bar_hpacker.pack_start (menu_bar_base, false, false, 2);
+#else
+ top_packer.pack_start (menu_bar_base, false, false);
+#endif
+
+ main_vpacker.pack_start (top_packer, false, false);
+
+ /* now add the transport frame to the top of main window */
+
+ main_vpacker.pack_start (transport_frame, false, false);
+ main_vpacker.pack_start (_tabs, true, true);
+
+#ifdef TOP_MENUBAR
+ main_vpacker.pack_start (status_bar_hpacker, false, false);
+#endif
+
+ for (int i = 0; i < 9; ++i) {
+ std::string const a = string_compose (X_("script-action-%1"), i + 1);
+ Glib::RefPtr<Action> act = ActionManager::get_action(X_("Editor"), a.c_str());
+ assert (act);
+ action_script_call_btn[i].set_text (string_compose ("%1", i+1));
+ action_script_call_btn[i].set_related_action (act);
+ if (act->get_sensitive ()) {
+ action_script_call_btn[i].set_visual_state (Gtkmm2ext::VisualState (action_script_call_btn[i].visual_state() & ~Gtkmm2ext::Insensitive));
+ } else {
+ action_script_call_btn[i].set_visual_state (Gtkmm2ext::VisualState (action_script_call_btn[i].visual_state() | Gtkmm2ext::Insensitive));
+ }
+ const int row = i % 3;
+ const int col = i / 3;
+ action_script_table.attach (action_script_call_btn[i], col, col + 1, row, row + 1, EXPAND, EXPAND, 1, 1);
+ action_script_call_btn[i].set_no_show_all ();
+ }
+ action_script_table.show ();
+
+ setup_transport();
+ build_menu_bar ();
+ setup_tooltips ();
+
+ _main_window.signal_delete_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::main_window_delete_event));
+
+ /* pack the main vpacker into the main window and show everything
+ */
+
+ _main_window.add (main_vpacker);
+ transport_frame.show_all ();
+
+ const XMLNode* mnode = main_window_settings ();
+
+ if (mnode) {
+ XMLProperty const * prop;
+ gint x = -1;
+ gint y = -1;
+ gint w = -1;
+ gint h = -1;
+
+ if ((prop = mnode->property (X_("x"))) != 0) {
+ x = atoi (prop->value());
+ }
+
+ if ((prop = mnode->property (X_("y"))) != 0) {
+ y = atoi (prop->value());
+ }
+
+ if ((prop = mnode->property (X_("w"))) != 0) {
+ w = atoi (prop->value());
+ }
+
+ if ((prop = mnode->property (X_("h"))) != 0) {
+ h = atoi (prop->value());
+ }
+
+ if (x >= 0 && y >= 0 && w >= 0 && h >= 0) {
+ _main_window.set_position (Gtk::WIN_POS_NONE);
+ }
+
+ if (x >= 0 && y >= 0) {
+ _main_window.move (x, y);
+ }
+
+ if (w > 0 && h > 0) {
+ _main_window.set_default_size (w, h);
+ }
+
+ std::string current_tab;
+
+ if ((prop = mnode->property (X_("current-tab"))) != 0) {
+ current_tab = prop->value();
+ } else {
+ current_tab = "editor";
+ }
+ if (mixer && current_tab == "mixer") {
+ _tabs.set_current_page (_tabs.page_num (mixer->contents()));
+ } else if (rc_option_editor && current_tab == "preferences") {
+ _tabs.set_current_page (_tabs.page_num (rc_option_editor->contents()));
+ } else if (editor) {
+ _tabs.set_current_page (_tabs.page_num (editor->contents()));
+ }
+ }
+
+ setup_toplevel_window (_main_window, "", this);
+ _main_window.show_all ();
+
+ _tabs.set_show_tabs (false);
+
+ /* It would be nice if Gtkmm had wrapped this rather than just
+ * deprecating the old set_window_creation_hook() method, but oh well...
+ */
+ g_signal_connect (_tabs.gobj(), "create-window", (GCallback) ::tab_window_root_drop, this);
+
+ return 0;
+}
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 859a167..e372c1e 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -23,13 +23,21 @@
This is to cut down on the compile times. It also helps with my sanity.
*/
+#include <vector>
+
+#include "pbd/convert.h"
+
#include "ardour/audioengine.h"
#include "ardour/automation_watch.h"
#include "ardour/control_protocol_manager.h"
#include "ardour/profile.h"
#include "ardour/session.h"
+
#include "control_protocol/control_protocol.h"
+#include "gtkmm2ext/keyboard.h"
+#include "gtkmm2ext/utils.h"
+
#include "actions.h"
#include "add_route_dialog.h"
#include "add_video_dialog.h"
@@ -41,12 +49,16 @@
#include "gui_thread.h"
#include "keyeditor.h"
#include "location_ui.h"
+#include "lua_script_manager.h"
+#include "luawindow.h"
#include "main_clock.h"
#include "meterbridge.h"
#include "meter_patterns.h"
+#include "monitor_section.h"
#include "midi_tracer.h"
#include "mixer_ui.h"
#include "public_editor.h"
+#include "processor_box.h"
#include "rc_option_editor.h"
#include "route_params_ui.h"
#include "shuttle_control.h"
@@ -58,9 +70,7 @@
#include "time_info_box.h"
#include "timers.h"
-#include <gtkmm2ext/keyboard.h>
-
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -153,7 +163,7 @@ ARDOUR_UI::set_session (Session *s)
_session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
_session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
_session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
- _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context());
+ _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_dirty_changed, this), gui_context());
_session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
_session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
@@ -188,8 +198,8 @@ ARDOUR_UI::set_session (Session *s)
update_format ();
if (meter_box.get_parent()) {
- transport_tearoff_hbox.remove (meter_box);
- transport_tearoff_hbox.remove (editor_meter_peak_display);
+ transport_hbox.remove (meter_box);
+ transport_hbox.remove (editor_meter_peak_display);
}
if (editor_meter) {
@@ -200,8 +210,8 @@ ARDOUR_UI::set_session (Session *s)
}
if (meter_box.get_parent()) {
- transport_tearoff_hbox.remove (meter_box);
- transport_tearoff_hbox.remove (editor_meter_peak_display);
+ transport_hbox.remove (meter_box);
+ transport_hbox.remove (editor_meter_peak_display);
}
if (_session &&
@@ -231,12 +241,14 @@ ARDOUR_UI::set_session (Session *s)
editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
if (UIConfiguration::instance().get_show_editor_meter() && !ARDOUR::Profile->get_trx()) {
- transport_tearoff_hbox.pack_start (meter_box, false, false);
- transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
+ transport_hbox.pack_start (meter_box, false, false);
+ transport_hbox.pack_start (editor_meter_peak_display, false, false);
meter_box.show();
editor_meter_peak_display.show();
}
}
+
+ update_title ();
}
int
@@ -315,93 +327,430 @@ ARDOUR_UI::unload_session (bool hide_stuff)
session_loaded = false;
update_buffer_load ();
+ update_title ();
return 0;
}
-static bool
-_hide_splash (gpointer arg)
+void
+ARDOUR_UI::toggle_editor_and_mixer ()
{
- ((ARDOUR_UI*)arg)->hide_splash();
- return false;
+ if (editor->tabbed() && mixer->tabbed()) {
+ /* both in the same window */
+ if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
+ _tabs.set_current_page (_tabs.page_num (mixer->contents()));
+ } else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
+ _tabs.set_current_page (_tabs.page_num (editor->contents()));
+ } else {
+ /* go to mixer */
+ _tabs.set_current_page (_tabs.page_num (mixer->contents()));
+ }
+ return;
+ }
+
+
+ if (editor->tabbed() && !mixer->tabbed()) {
+ /* editor is tabbed, mixer is not */
+
+ Gtk::Window* mwin = mixer->current_toplevel ();
+
+ if (!mwin) {
+ /* mixer's own window doesn't exist */
+ mixer->make_visible ();
+ } else if (!mwin->is_mapped ()) {
+ /* mixer's own window exists but isn't mapped */
+ mixer->make_visible ();
+ } else {
+ /* mixer window is mapped, editor is visible as tab */
+ Gtk::Widget* f = mwin->get_focus();
+ if (f && f->has_focus()) {
+ /* mixer has focus, switch to editor */
+ editor->make_visible ();
+ } else {
+ mixer->make_visible ();
+ }
+ }
+ return;
+ }
+
+ if (!editor->tabbed() && mixer->tabbed()) {
+ /* mixer is tabbed, editor is not */
+
+ Gtk::Window* ewin = editor->current_toplevel ();
+
+ if (!ewin) {
+ /* mixer's own window doesn't exist */
+ editor->make_visible ();
+ } else if (!ewin->is_mapped ()) {
+ /* editor's own window exists but isn't mapped */
+ editor->make_visible ();
+ } else {
+ /* editor window is mapped, mixer is visible as tab */
+ Gtk::Widget* f = ewin->get_focus();
+ if (f && f->has_focus()) {
+ /* editor has focus, switch to mixer */
+ mixer->make_visible ();
+ } else {
+ editor->make_visible ();
+ }
+ }
+ return;
+ }
}
void
-ARDOUR_UI::goto_editor_window ()
+ARDOUR_UI::step_up_through_tabs ()
{
- if (splash && splash->is_visible()) {
- // in 2 seconds, hide the splash screen
- Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 2000);
+ std::vector<Tabbable*> candidates;
+
+ /* this list must match the order of visibility buttons */
+
+ if (!editor->window_visible()) {
+ candidates.push_back (editor);
+ }
+
+ if (!mixer->window_visible()) {
+ candidates.push_back (mixer);
+ }
+
+ if (!rc_option_editor->window_visible()) {
+ candidates.push_back (rc_option_editor);
}
- editor->show_window ();
- editor->present ();
- /* mixer should now be on top */
- if (UIConfiguration::instance().get_transients_follow_front()) {
- WM::Manager::instance().set_transient_for (editor);
+ if (candidates.size() < 2) {
+ /* nothing to be done with zero or one visible in tabs */
+ return;
+ }
+
+ std::vector<Tabbable*>::iterator prev = candidates.end();
+ std::vector<Tabbable*>::iterator i;
+ Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+ for (i = candidates.begin(); i != candidates.end(); ++i) {
+ if (w == &(*i)->contents()) {
+ if (prev != candidates.end()) {
+ _tabs.set_current_page (_tabs.page_num ((*prev)->contents()));
+ } else {
+ _tabs.set_current_page (_tabs.page_num (candidates.back()->contents()));
+ }
+ return;
+ }
+ prev = i;
}
- _mixer_on_top = false;
}
void
-ARDOUR_UI::goto_mixer_window ()
+ARDOUR_UI::step_down_through_tabs ()
{
- Glib::RefPtr<Gdk::Window> win;
- Glib::RefPtr<Gdk::Screen> screen;
+ std::vector<Tabbable*> candidates;
+
+ /* this list must match the order of visibility buttons */
+
+ if (!editor->window_visible()) {
+ candidates.push_back (editor);
+ }
+
+ if (!mixer->window_visible()) {
+ candidates.push_back (mixer);
+ }
+
+ if (!rc_option_editor->window_visible()) {
+ candidates.push_back (rc_option_editor);
+ }
+
+ if (candidates.size() < 2) {
+ /* nothing to be done with zero or one visible in tabs */
+ return;
+ }
- if (editor) {
- win = editor->get_window ();
+ std::vector<Tabbable*>::reverse_iterator next = candidates.rend();
+ std::vector<Tabbable*>::reverse_iterator i;
+ Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+ for (i = candidates.rbegin(); i != candidates.rend(); ++i) {
+ if (w == &(*i)->contents()) {
+ if (next != candidates.rend()) {
+ _tabs.set_current_page (_tabs.page_num ((*next)->contents()));
+ } else {
+ _tabs.set_current_page (_tabs.page_num (candidates.front()->contents()));
+ }
+ break;
+ }
+ next = i;
}
+}
- if (win) {
- screen = win->get_screen();
+void
+ARDOUR_UI::key_change_tabbable_visibility (Tabbable* t)
+{
+ if (!t) {
+ return;
+ }
+
+ if (t->tabbed()) {
+ _tabs.set_current_page (_tabs.page_num (t->contents()));
+ } else if (!t->fully_visible()) {
+ t->make_visible ();
} else {
- screen = Gdk::Screen::get_default();
+ _main_window.present ();
}
+}
- if (g_getenv ("ARDOUR_LOVES_STUPID_TINY_SCREENS") == 0 && screen && screen->get_height() < 700) {
- Gtk::MessageDialog msg (_("This screen is not tall enough to display the mixer window"));
- msg.run ();
+void
+ARDOUR_UI::button_change_tabbable_visibility (Tabbable* t)
+{
+ /* For many/most users, clicking a button in the main window will make it
+ the main/front/key window, which will change any stacking relationship they
+ were trying to modify by clicking on the button in the first
+ place. This button-aware method knows that click on
+ a button designed to show/hide a Tabbable that has its own window
+ will have made that window be obscured (as the main window comes to
+ the front). We therefore *hide* the Tabbable's window if it is even
+ partially visible, believing that this is likely because the
+ Tabbable window used to be front, the user clicked to change that,
+ and before we even get here, the main window has become front.
+ */
+
+ if (!t) {
return;
}
- mixer->show_window ();
- mixer->present ();
- /* mixer should now be on top */
- if (UIConfiguration::instance().get_transients_follow_front()) {
- WM::Manager::instance().set_transient_for (mixer);
+ if (t->tabbed()) {
+ _tabs.set_current_page (_tabs.page_num (t->contents()));
+ } else if (t->visible()) {
+ t->hide();
+ } else {
+ t->make_visible ();
}
- _mixer_on_top = true;
}
void
-ARDOUR_UI::toggle_mixer_window ()
+ARDOUR_UI::show_tabbable (Tabbable* t)
{
- /* thse windows are created in ARDOUR_UI::setup_windows()
- * it should be impossible to get here with any of them being NULL
- */
- assert (editor && mixer && meterbridge);
+ if (!t) {
+ return;
+ }
- bool show = false;
- bool obscuring = false;
+ t->make_visible ();
+}
- if (mixer->not_visible ()) {
- show = true;
+void
+ARDOUR_UI::hide_tabbable (Tabbable* t)
+{
+ if (!t) {
+ return;
}
- else if ( (!editor->not_visible () && ARDOUR_UI_UTILS::windows_overlap (editor, mixer))
- || (!meterbridge->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer))
- ) {
- obscuring = true;
+ t->make_invisible ();
+}
+
+void
+ARDOUR_UI::attach_tabbable (Tabbable* t)
+{
+ if (!t) {
+ return;
}
- if (obscuring && (editor->property_has_toplevel_focus() || meterbridge->property_has_toplevel_focus())) {
- show = true;
+ t->attach ();
+}
+
+void
+ARDOUR_UI::detach_tabbable (Tabbable* t)
+{
+ if (!t) {
+ return;
}
+ t->detach ();
+}
+
+void
+ARDOUR_UI::tabs_page_added (Widget*,guint)
+{
+ if (_tabs.get_n_pages() > 1) {
+
+ std::vector<TargetEntry> drag_target_entries;
+ drag_target_entries.push_back (TargetEntry ("tabbable"));
+
+ editor_visibility_button.drag_source_set (drag_target_entries);
+ mixer_visibility_button.drag_source_set (drag_target_entries);
+ prefs_visibility_button.drag_source_set (drag_target_entries);
+
+ editor_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (editor->name(),
+ Pango::FontDescription ("Sans 24"),
+ 0, 0,
+ Gdk::Color ("red")));
+ mixer_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (mixer->name(),
+ Pango::FontDescription ("Sans 24"),
+ 0, 0,
+ Gdk::Color ("red")));
+ prefs_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (rc_option_editor->name(),
+ Pango::FontDescription ("Sans 24"),
+ 0, 0,
+ Gdk::Color ("red")));
+ }
+}
+
+void
+ARDOUR_UI::tabs_page_removed (Widget*, guint)
+{
+ if (_tabs.get_n_pages() < 2) {
+ editor_visibility_button.drag_source_unset ();
+ mixer_visibility_button.drag_source_unset ();
+ prefs_visibility_button.drag_source_unset ();
+ }
+}
+
+void
+ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
+{
+ if (editor && (page == (guint) _tabs.page_num (editor->contents()))) {
+ editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+
+ if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
+ mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
+ }
+
+ if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
+ prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
+ }
+ } else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
+
+ if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
+ editor_visibility_button.set_active_state (Gtkmm2ext::Off);
+ }
+
+ mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+
+ if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
+ prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
+ }
+
+ } else if (page == (guint) _tabs.page_num (rc_option_editor->contents())) {
+
+ if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
+ editor_visibility_button.set_active_state (Gtkmm2ext::Off);
+ }
+
+ if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
+ mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
+ }
+
+ prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+ }
+
+}
+
+void
+ARDOUR_UI::tabbable_state_change (Tabbable& t)
+{
+ std::vector<std::string> insensitive_action_names;
+ std::vector<std::string> sensitive_action_names;
+ std::vector<std::string> active_action_names;
+ std::vector<std::string> inactive_action_names;
+ Glib::RefPtr<Action> action;
+ std::string downcased_name = downcase (t.name());
+ enum ViewState {
+ Tabbed,
+ Windowed,
+ Hidden
+ };
+ ViewState vs;
+
+ if (t.tabbed()) {
+
+ insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+
+ vs = Tabbed;
+
+ } else if (t.tabbed_by_default ()) {
+
+ insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+ insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+
+ vs = Hidden;
+
+ } else if (t.window_visible()) {
+
+ insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+
+ active_action_names.push_back (string_compose ("show-%1", downcased_name));
+ inactive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+
+ vs = Windowed;
- if (show) {
- goto_mixer_window ();
} else {
- mixer->hide ();
+
+ /* not currently visible. allow user to retab it or just make
+ * it visible.
+ */
+
+ insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+ insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+ sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+
+ active_action_names.push_back (string_compose ("hide-%1", downcased_name));
+ inactive_action_names.push_back (string_compose ("show-%1", downcased_name));
+
+ vs = Hidden;
+ }
+
+ for (std::vector<std::string>::iterator s = insensitive_action_names.begin(); s != insensitive_action_names.end(); ++s) {
+ action = ActionManager::get_action (X_("Common"), (*s).c_str());
+ if (action) {
+ action->set_sensitive (false);
+ }
+ }
+
+ for (std::vector<std::string>::iterator s = sensitive_action_names.begin(); s != sensitive_action_names.end(); ++s) {
+ action = ActionManager::get_action (X_("Common"), (*s).c_str());
+ if (action) {
+ action->set_sensitive (true);
+ }
+ }
+
+ ArdourButton* vis_button = 0;
+ std::vector<ArdourButton*> other_vis_buttons;
+
+ if (&t == editor) {
+ vis_button = &editor_visibility_button;
+ other_vis_buttons.push_back (&mixer_visibility_button);
+ other_vis_buttons.push_back (&prefs_visibility_button);
+ } else if (&t == mixer) {
+ vis_button = &mixer_visibility_button;
+ other_vis_buttons.push_back (&editor_visibility_button);
+ other_vis_buttons.push_back (&prefs_visibility_button);
+ } else if (&t == rc_option_editor) {
+ vis_button = &prefs_visibility_button;
+ other_vis_buttons.push_back (&editor_visibility_button);
+ other_vis_buttons.push_back (&mixer_visibility_button);
+ }
+
+ if (!vis_button) {
+ return;
+ }
+
+ switch (vs) {
+ case Tabbed:
+ vis_button->set_active_state (Gtkmm2ext::ImplicitActive);
+ break;
+ case Windowed:
+ vis_button->set_active_state (Gtkmm2ext::ExplicitActive);
+ break;
+ case Hidden:
+ vis_button->set_active_state (Gtkmm2ext::Off);
+ break;
+ }
+
+ for (std::vector<ArdourButton*>::iterator b = other_vis_buttons.begin(); b != other_vis_buttons.end(); ++b) {
+ (*b)->set_active_state (Gtkmm2ext::Off);
}
}
@@ -415,14 +764,13 @@ ARDOUR_UI::toggle_meterbridge ()
if (meterbridge->not_visible ()) {
show = true;
- }
- else if ( (!editor->not_visible() && ARDOUR_UI_UTILS::windows_overlap (editor, meterbridge))
- || (!mixer->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer))
- ) {
+ } else if ((editor->window_visible() && ARDOUR_UI_UTILS::windows_overlap (editor->own_window(), meterbridge)) ||
+ (mixer->window_visible () && ARDOUR_UI_UTILS::windows_overlap (mixer->own_window(), meterbridge))) {
obscuring = true;
}
- if (obscuring && (editor->property_has_toplevel_focus() || mixer->property_has_toplevel_focus())) {
+ if (obscuring && ((editor->own_window() && editor->own_window()->property_has_toplevel_focus()) ||
+ (mixer->own_window() && mixer->own_window()->property_has_toplevel_focus()))) {
show = true;
}
@@ -436,42 +784,27 @@ ARDOUR_UI::toggle_meterbridge ()
}
void
-ARDOUR_UI::toggle_editor_mixer ()
+ARDOUR_UI::toggle_luawindow ()
{
- bool obscuring = false;
+ assert (editor && luawindow);
- if (editor && mixer) {
- if (ARDOUR_UI_UTILS::windows_overlap (editor, mixer)) {
- obscuring = true;
- }
+ bool show = false;
+
+ if (luawindow->not_visible ()) {
+ show = true;
}
+ // TODO check overlap
- if (mixer && !mixer->not_visible() && mixer->property_has_toplevel_focus()) {
- if (obscuring) {
- goto_editor_window();
- }
- } else if (editor && !editor->not_visible() && editor->property_has_toplevel_focus()) {
- if (obscuring) {
- goto_mixer_window();
- }
- } else if (mixer && mixer->not_visible()) {
- if (obscuring) {
- goto_mixer_window ();
- }
- } else if (editor && editor->not_visible()) {
- if (obscuring) {
- goto_editor_window ();
- }
- } else if (obscuring) {
- //it's unclear what to do here, so just do the opposite of what we did last time (old behavior)
- if (_mixer_on_top) {
- goto_editor_window ();
- } else {
- goto_mixer_window ();
- }
+ if (show) {
+ luawindow->show_window ();
+ luawindow->present ();
+ luawindow->raise ();
+ } else {
+ luawindow->hide_window (NULL);
}
}
+
void
ARDOUR_UI::new_midi_tracer_window ()
{
@@ -496,6 +829,18 @@ ARDOUR_UI::new_midi_tracer_window ()
}
}
+KeyEditor*
+ARDOUR_UI::create_key_editor ()
+{
+ KeyEditor* kedit = new KeyEditor;
+
+ for (std::list<Bindings*>::iterator b = Bindings::bindings.begin(); b != Bindings::bindings.end(); ++b) {
+ kedit->add_tab ((*b)->name(), **b);
+ }
+
+ return kedit;
+}
+
BundleManager*
ARDOUR_UI::create_bundle_manager ()
{
@@ -533,23 +878,23 @@ ARDOUR_UI::handle_locations_change (Location *)
}
bool
-ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
+ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* object)
{
- if (window_was_editor) {
+ if (object == editor) {
if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
(ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
if (big_clock_window) {
- big_clock_window->set_transient_for (*editor);
+ big_clock_window->set_transient_for (*editor->own_window());
}
}
- } else {
+ } else if (object == mixer) {
if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
(ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
if (big_clock_window) {
- big_clock_window->set_transient_for (*mixer);
+ big_clock_window->set_transient_for (*mixer->own_window());
}
}
}
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index 06995f7..d10e673 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -30,12 +30,13 @@
#include <cmath>
#include <glibmm/miscutils.h>
+#include <gtkmm/accelmap.h>
#include <gtk/gtk.h>
+#include "gtkmm2ext/cairo_packer.h"
+#include "gtkmm2ext/tearoff.h"
#include "gtkmm2ext/utils.h"
#include "gtkmm2ext/window_title.h"
-#include "gtkmm2ext/tearoff.h"
-#include "gtkmm2ext/cairo_packer.h"
#include "pbd/file_utils.h"
#include "pbd/fpu.h"
@@ -50,12 +51,14 @@
#include "editor.h"
#include "actions.h"
#include "meterbridge.h"
+#include "luawindow.h"
#include "mixer_ui.h"
#include "startup.h"
#include "window_manager.h"
#include "global_port_matrix.h"
#include "location_ui.h"
#include "main_clock.h"
+#include "rc_option_editor.h"
#include <gtkmm2ext/application.h>
@@ -65,7 +68,7 @@
#include "control_protocol/control_protocol.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -79,209 +82,277 @@ ARDOUR_UI::create_editor ()
{
try {
editor = new Editor ();
+ editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change));
}
catch (failed_constructor& err) {
return -1;
}
- editor->Realized.connect (sigc::mem_fun (*this, &ARDOUR_UI::editor_realized));
- editor->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), true));
+ // editor->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), editor));
+
+ return 0;
+}
+
+int
+ARDOUR_UI::create_luawindow ()
+
+{
+ try {
+ luawindow = LuaWindow::instance ();
+ }
+ catch (failed_constructor& err) {
+ return -1;
+ }
return 0;
}
void
+ARDOUR_UI::escape ()
+{
+ Escape (); /* EMIT SIGNAL */
+}
+
+void
ARDOUR_UI::install_actions ()
{
- Glib::RefPtr<ActionGroup> main_actions = ActionGroup::create (X_("Main"));
- Glib::RefPtr<ActionGroup> main_menu_actions = ActionGroup::create (X_("Main_menu"));
+ Glib::RefPtr<ActionGroup> main_actions = global_actions.create_action_group (X_("Main"));
+ Glib::RefPtr<ActionGroup> main_menu_actions = global_actions.create_action_group (X_("Main_menu"));
Glib::RefPtr<Action> act;
+ global_actions.register_action (main_actions, X_("Escape"), _("Escape"), sigc::mem_fun (*this, &ARDOUR_UI::escape));
+
/* menus + submenus that need action items */
- ActionManager::register_action (main_menu_actions, X_("Session"), _("Session"));
- act = ActionManager::register_action (main_menu_actions, X_("Cleanup"), _("Clean-up"));
+ global_actions.register_action (main_menu_actions, X_("Session"), _("Session"));
+ act = global_actions.register_action (main_menu_actions, X_("Cleanup"), _("Clean-up"));
ActionManager::write_sensitive_actions.push_back (act);
- ActionManager::register_action (main_menu_actions, X_("Sync"), _("Sync"));
- ActionManager::register_action (main_menu_actions, X_("TransportOptions"), _("Options"));
- ActionManager::register_action (main_menu_actions, X_("WindowMenu"), _("Window"));
- ActionManager::register_action (main_menu_actions, X_("Help"), _("Help"));
- ActionManager::register_action (main_menu_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
- ActionManager::register_action (main_menu_actions, X_("AudioFileFormat"), _("Audio File Format"));
- ActionManager::register_action (main_menu_actions, X_("AudioFileFormatHeader"), _("File Type"));
- ActionManager::register_action (main_menu_actions, X_("AudioFileFormatData"), _("Sample Format"));
- ActionManager::register_action (main_menu_actions, X_("ControlSurfaces"), _("Control Surfaces"));
- ActionManager::register_action (main_menu_actions, X_("Plugins"), _("Plugins"));
- ActionManager::register_action (main_menu_actions, X_("Metering"), _("Metering"));
- ActionManager::register_action (main_menu_actions, X_("MeteringFallOffRate"), _("Fall Off Rate"));
- ActionManager::register_action (main_menu_actions, X_("MeteringHoldTime"), _("Hold Time"));
- ActionManager::register_action (main_menu_actions, X_("Denormals"), _("Denormal Handling"));
+ global_actions.register_action (main_menu_actions, X_("Sync"), _("Sync"));
+ global_actions.register_action (main_menu_actions, X_("TransportOptions"), _("Options"));
+ global_actions.register_action (main_menu_actions, X_("WindowMenu"), _("Window"));
+ global_actions.register_action (main_menu_actions, X_("MixerMenu"), _("Mixer"));
+ global_actions.register_action (main_menu_actions, X_("EditorMenu"), _("Editor"));
+ global_actions.register_action (main_menu_actions, X_("PrefsMenu"), _("Preferences"));
+ global_actions.register_action (main_menu_actions, X_("DetachMenu"), _("Detach"));
+ global_actions.register_action (main_menu_actions, X_("Help"), _("Help"));
+ global_actions.register_action (main_menu_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
+ global_actions.register_action (main_menu_actions, X_("AudioFileFormat"), _("Audio File Format"));
+ global_actions.register_action (main_menu_actions, X_("AudioFileFormatHeader"), _("File Type"));
+ global_actions.register_action (main_menu_actions, X_("AudioFileFormatData"), _("Sample Format"));
+ global_actions.register_action (main_menu_actions, X_("ControlSurfaces"), _("Control Surfaces"));
+ global_actions.register_action (main_menu_actions, X_("Plugins"), _("Plugins"));
+ global_actions.register_action (main_menu_actions, X_("Metering"), _("Metering"));
+ global_actions.register_action (main_menu_actions, X_("MeteringFallOffRate"), _("Fall Off Rate"));
+ global_actions.register_action (main_menu_actions, X_("MeteringHoldTime"), _("Hold Time"));
+ global_actions.register_action (main_menu_actions, X_("Denormals"), _("Denormal Handling"));
/* the real actions */
- act = ActionManager::register_action (main_actions, X_("New"), _("New..."), hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true, "")));
+ act = global_actions.register_action (main_actions, X_("New"), _("New..."), hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true, "")));
- ActionManager::register_action (main_actions, X_("Open"), _("Open..."), sigc::mem_fun(*this, &ARDOUR_UI::open_session));
- ActionManager::register_action (main_actions, X_("Recent"), _("Recent..."), sigc::mem_fun(*this, &ARDOUR_UI::open_recent_session));
- act = ActionManager::register_action (main_actions, X_("Close"), _("Close"), sigc::mem_fun(*this, &ARDOUR_UI::close_session));
+ global_actions.register_action (main_actions, X_("Open"), _("Open..."), sigc::mem_fun(*this, &ARDOUR_UI::open_session));
+ global_actions.register_action (main_actions, X_("Recent"), _("Recent..."), sigc::mem_fun(*this, &ARDOUR_UI::open_recent_session));
+ act = global_actions.register_action (main_actions, X_("Close"), _("Close"), sigc::mem_fun(*this, &ARDOUR_UI::close_session));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track or Bus..."),
- sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::add_route), (Gtk::Window*) 0));
+ act = global_actions.register_action (main_actions, X_("AddTrackBus"), _("Add Track or Bus..."), sigc::mem_fun(*this, &ARDOUR_UI::add_route));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("duplicate-routes"), _("Duplicate Tracks/Busses..."),
+ act = global_actions.register_action (main_actions, X_("duplicate-routes"), _("Duplicate Tracks/Busses..."),
sigc::mem_fun(*this, &ARDOUR_UI::start_duplicate_routes));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
ActionManager::track_selection_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("cancel-solo"), _("Cancel Solo"), sigc::mem_fun(*this, &ARDOUR_UI::cancel_solo));
+ act = global_actions.register_action (main_actions, X_("cancel-solo"), _("Cancel Solo"), sigc::mem_fun(*this, &ARDOUR_UI::cancel_solo));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
+ act = global_actions.register_action (main_actions, X_("Scripting"), S_("Session|Scripting"));
+ ActionManager::session_sensitive_actions.push_back (act);
+
+ act = global_actions.register_action (main_actions, X_("AddLuaScript"), _("Add Lua Script..."),
+ sigc::mem_fun (*this, &ARDOUR_UI::add_lua_script));
+ ActionManager::session_sensitive_actions.push_back (act);
+
+ act = global_actions.register_action (main_actions, X_("RemoveLuaScript"), _("Remove Lua Script"),
+ sigc::mem_fun (*this, &ARDOUR_UI::remove_lua_script));
+ ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("OpenVideo"), _("Open Video"),
+ act = global_actions.register_action (main_actions, X_("OpenVideo"), _("Open Video..."),
sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::add_video), (Gtk::Window*) 0));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("CloseVideo"), _("Remove Video"),
+ act = global_actions.register_action (main_actions, X_("CloseVideo"), _("Remove Video"),
sigc::mem_fun (*this, &ARDOUR_UI::remove_video));
act->set_sensitive (false);
- act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export to Video File"),
- hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::export_video), false)));
+ act = global_actions.register_action (main_actions, X_("ExportVideo"), _("Export to Video File..."),
+ hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::export_video), false)));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("SnapshotStay"), _("Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false));
+ act = global_actions.register_action (main_actions, X_("SnapshotStay"), _("Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false));
ActionManager::session_sensitive_actions.push_back (act);
- ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("SnapshotSwitch"), _("Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), true));
+ act = global_actions.register_action (main_actions, X_("SnapshotSwitch"), _("Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), true));
ActionManager::session_sensitive_actions.push_back (act);
- ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("QuickSnapshotStay"), _("Quick Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), false));
+ act = global_actions.register_action (main_actions, X_("QuickSnapshotStay"), _("Quick Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), false));
ActionManager::session_sensitive_actions.push_back (act);
- ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("QuickSnapshotSwitch"), _("Quick Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), true));
+ act = global_actions.register_action (main_actions, X_("QuickSnapshotSwitch"), _("Quick Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), true));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("SaveAs"), _("Save As..."), sigc::mem_fun(*this, &ARDOUR_UI::save_session_as));
+ act = global_actions.register_action (main_actions, X_("SaveAs"), _("Save As..."), sigc::mem_fun(*this, &ARDOUR_UI::save_session_as));
ActionManager::session_sensitive_actions.push_back (act);
- ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("Rename"), _("Rename..."), sigc::mem_fun(*this, &ARDOUR_UI::rename_session));
+ act = global_actions.register_action (main_actions, X_("Rename"), _("Rename..."), sigc::mem_fun(*this, &ARDOUR_UI::rename_session));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("SaveTemplate"), _("Save Template..."), sigc::mem_fun(*this, &ARDOUR_UI::save_template));
+ act = global_actions.register_action (main_actions, X_("SaveTemplate"), _("Save Template..."), sigc::mem_fun(*this, &ARDOUR_UI::save_template));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("Metadata"), _("Metadata"));
+ act = global_actions.register_action (main_actions, X_("Metadata"), _("Metadata"));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("EditMetadata"), _("Edit Metadata..."), sigc::mem_fun(*this, &ARDOUR_UI::edit_metadata));
+ act = global_actions.register_action (main_actions, X_("EditMetadata"), _("Edit Metadata..."), sigc::mem_fun(*this, &ARDOUR_UI::edit_metadata));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("ImportMetadata"), _("Import Metadata..."), sigc::mem_fun(*this, &ARDOUR_UI::import_metadata));
+ act = global_actions.register_action (main_actions, X_("ImportMetadata"), _("Import Metadata..."), sigc::mem_fun(*this, &ARDOUR_UI::import_metadata));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("ExportAudio"), _("Export to Audio File(s)..."), sigc::mem_fun (*editor, &PublicEditor::export_audio));
+ act = global_actions.register_action (main_actions, X_("ExportAudio"), _("Export to Audio File(s)..."), sigc::mem_fun (*editor, &PublicEditor::export_audio));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("StemExport"), _("Stem export..."), sigc::mem_fun (*editor, &PublicEditor::stem_export));
+ act = global_actions.register_action (main_actions, X_("StemExport"), _("Stem export..."), sigc::mem_fun (*editor, &PublicEditor::stem_export));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("Export"), _("Export"));
+ act = global_actions.register_action (main_actions, X_("Export"), _("Export"));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("CleanupUnused"), _("Clean-up Unused Sources..."), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
+ act = global_actions.register_action (main_actions, X_("CleanupUnused"), _("Clean-up Unused Sources..."), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("CleanupPeakFiles"), _("Reset Peak Files"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup_peakfiles));
+ act = global_actions.register_action (main_actions, X_("CleanupPeakFiles"), _("Reset Peak Files"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup_peakfiles));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (main_actions, X_("FlushWastebasket"), _("Flush Wastebasket"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
+ act = global_actions.register_action (main_actions, X_("FlushWastebasket"), _("Flush Wastebasket"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
+
ActionManager::write_sensitive_actions.push_back (act);
ActionManager::session_sensitive_actions.push_back (act);
/* these actions are intended to be shared across all windows */
- common_actions = ActionGroup::create (X_("Common"));
- ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish))));
- ActionManager::register_action (common_actions, X_("Hide"), _("Hide"), sigc::mem_fun (*this, &ARDOUR_UI::hide_application));
+ common_actions = global_actions.create_action_group (X_("Common"));
+ global_actions.register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish))));
+ global_actions.register_action (common_actions, X_("Hide"), _("Hide"), sigc::mem_fun (*this, &ARDOUR_UI::hide_application));
+
+ global_actions.register_action (common_actions, X_("show-editor"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), editor));
+ global_actions.register_action (common_actions, X_("show-mixer"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), mixer));
+ global_actions.register_action (common_actions, X_("show-preferences"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), rc_option_editor));
+ global_actions.register_action (common_actions, X_("menu-show-preferences"), _("Preferences"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), rc_option_editor));
+
+ global_actions.register_action (common_actions, X_("hide-editor"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), editor));
+ global_actions.register_action (common_actions, X_("hide-mixer"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), mixer));
+ global_actions.register_action (common_actions, X_("hide-preferences"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), rc_option_editor));
+
+ global_actions.register_action (common_actions, X_("attach-editor"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), editor));
+ global_actions.register_action (common_actions, X_("attach-mixer"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), mixer));
+ global_actions.register_action (common_actions, X_("attach-preferences"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), rc_option_editor));
+
+ global_actions.register_action (common_actions, X_("detach-editor"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), editor));
+ global_actions.register_action (common_actions, X_("detach-mixer"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), mixer));
+ global_actions.register_action (common_actions, X_("detach-preferences"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), rc_option_editor));
+
+ /* These "change" actions are not intended to be used inside menus, but
+ are for the tab/window control buttons, which have somewhat odd
+ semantics.
+ */
+ global_actions.register_action (common_actions, X_("change-editor-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::button_change_tabbable_visibility), editor));
+ global_actions.register_action (common_actions, X_("change-mixer-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::button_change_tabbable_visibility), mixer));
+ global_actions.register_action (common_actions, X_("change-preferences-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::button_change_tabbable_visibility), rc_option_editor));
+
+ /* These "change" actions are not intended to be used inside menus, but
+ are for the tab/window control key bindings, which have somewhat odd
+ semantics.
+ */
+ global_actions.register_action (common_actions, X_("key-change-editor-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), editor));
+ global_actions.register_action (common_actions, X_("key-change-mixer-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), mixer));
+ global_actions.register_action (common_actions, X_("key-change-preferences-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), rc_option_editor));
+
+ global_actions.register_action (common_actions, X_("previous-tab"), _("Previous Tab"), sigc::mem_fun (*this, &ARDOUR_UI::step_up_through_tabs));
+ global_actions.register_action (common_actions, X_("next-tab"), _("Next Tab"), sigc::mem_fun (*this, &ARDOUR_UI::step_down_through_tabs));
+
+ global_actions.register_action (common_actions, X_("toggle-editor-and-mixer"), _("Toggle Editor & Mixer"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editor_and_mixer));
/* windows visibility actions */
- ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
- ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalMixer"), _("Maximise Mixer Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_space));
- act = ActionManager::register_toggle_action (common_actions, X_("KeepTearoffs"), _("Show Toolbars"), mem_fun (*this, &ARDOUR_UI::toggle_keep_tearoffs));
+ global_actions.register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
+ global_actions.register_toggle_action (common_actions, X_("ToggleMaximalMixer"), _("Maximise Mixer Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_space));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (common_actions, X_("ToggleMixerList"), _("Toggle Mixer List"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_list));
+ act = global_actions.register_toggle_action (common_actions, X_("ToggleMixerList"), _("Toggle Mixer List"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_list));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (common_actions, X_("ToggleMonitorSection"), _("Toggle Monitor Section Visibility"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_monitor_section_visibility));
+ act = global_actions.register_toggle_action (common_actions, X_("ToggleMonitorSection"), _("Toggle Monitor Section Visibility"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_monitor_section_visibility));
act->set_sensitive (false);
-if (Profile->get_mixbus())
- ActionManager::register_action (common_actions, X_("show-ui-prefs"), _("Show more UI preferences"), sigc::mem_fun (*this, &ARDOUR_UI::show_ui_prefs));
-
- ActionManager::register_action (common_actions, X_("toggle-mixer"), S_("Window|Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_window));
- ActionManager::register_action (common_actions, X_("toggle-editor-mixer"), _("Toggle Editor+Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_editor_mixer));
- ActionManager::register_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
+ if (Profile->get_mixbus()) {
+ global_actions.register_action (common_actions, X_("show-ui-prefs"), _("Show more UI preferences"), sigc::mem_fun (*this, &ARDOUR_UI::show_ui_prefs));
+ }
- ActionManager::register_action (common_actions, X_("reattach-all-tearoffs"), _("Reattach All Tearoffs"), sigc::mem_fun (*this, &ARDOUR_UI::reattach_all_tearoffs));
+ global_actions.register_action (common_actions, X_("toggle-luawindow"), S_("Window|Scripting"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_luawindow));
+ global_actions.register_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
- act = ActionManager::register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window));
+ act = global_actions.register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window));
ActionManager::session_sensitive_actions.push_back (act);
- ActionManager::register_action (common_actions, X_("chat"), _("Chat"), sigc::mem_fun(*this, &ARDOUR_UI::launch_chat));
+
+ global_actions.register_action (common_actions, X_("chat"), _("Chat"), sigc::mem_fun(*this, &ARDOUR_UI::launch_chat));
/** TRANSLATORS: This is `Manual' in the sense of an instruction book that tells a user how to use Ardour */
- ActionManager::register_action (common_actions, X_("manual"), S_("Help|Manual"), mem_fun(*this, &ARDOUR_UI::launch_manual));
- ActionManager::register_action (common_actions, X_("reference"), S_("Manual|Reference"), mem_fun(*this, &ARDOUR_UI::launch_reference));
- ActionManager::register_action (common_actions, X_("tracker"), _("Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_tracker));
- ActionManager::register_action (common_actions, X_("cheat-sheet"), _("Cheat Sheet"), mem_fun(*this, &ARDOUR_UI::launch_cheat_sheet));
- ActionManager::register_action (common_actions, X_("website"), _("Ardour Website"), mem_fun(*this, &ARDOUR_UI::launch_website));
- ActionManager::register_action (common_actions, X_("website-dev"), _("Ardour Development"), mem_fun(*this, &ARDOUR_UI::launch_website_dev));
- ActionManager::register_action (common_actions, X_("forums"), _("User Forums"), mem_fun(*this, &ARDOUR_UI::launch_forums));
- ActionManager::register_action (common_actions, X_("howto-report"), _("How to Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_howto_report));
+ global_actions.register_action (common_actions, X_("manual"), S_("Help|Manual"), mem_fun(*this, &ARDOUR_UI::launch_manual));
+ global_actions.register_action (common_actions, X_("reference"), S_("Manual|Reference"), mem_fun(*this, &ARDOUR_UI::launch_reference));
+ global_actions.register_action (common_actions, X_("tracker"), _("Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_tracker));
+ global_actions.register_action (common_actions, X_("cheat-sheet"), _("Cheat Sheet"), mem_fun(*this, &ARDOUR_UI::launch_cheat_sheet));
+ global_actions.register_action (common_actions, X_("website"), _("Ardour Website"), mem_fun(*this, &ARDOUR_UI::launch_website));
+ global_actions.register_action (common_actions, X_("website-dev"), _("Ardour Development"), mem_fun(*this, &ARDOUR_UI::launch_website_dev));
+ global_actions.register_action (common_actions, X_("forums"), _("User Forums"), mem_fun(*this, &ARDOUR_UI::launch_forums));
+ global_actions.register_action (common_actions, X_("howto-report"), _("How to Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_howto_report));
- act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), sigc::hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false)));
+ act = global_actions.register_action (common_actions, X_("Save"), _("Save"), sigc::hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false)));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
- Glib::RefPtr<ActionGroup> transport_actions = ActionGroup::create (X_("Transport"));
+ Glib::RefPtr<ActionGroup> transport_actions = global_actions.create_action_group (X_("Transport"));
/* do-nothing action for the "transport" menu bar item */
- ActionManager::register_action (transport_actions, X_("Transport"), _("Transport"));
+ global_actions.register_action (transport_actions, X_("Transport"), _("Transport"));
/* these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
menus and via button proxies.
*/
- act = ActionManager::register_action (transport_actions, X_("Stop"), _("Stop"), sigc::mem_fun(*this, &ARDOUR_UI::transport_stop));
+ act = global_actions.register_action (transport_actions, X_("Stop"), _("Stop"), sigc::mem_fun(*this, &ARDOUR_UI::transport_stop));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("Roll"), _("Roll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_roll));
+ act = global_actions.register_action (transport_actions, X_("Roll"), _("Roll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_roll));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
+ act = global_actions.register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("alternate-ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
+ act = global_actions.register_action (transport_actions, X_("alternate-ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("ToggleRollMaybe"), _("Start/Continue/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true));
+ act = global_actions.register_action (transport_actions, X_("ToggleRollMaybe"), _("Start/Continue/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop and Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false));
+ act = global_actions.register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop and Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
@@ -291,202 +362,194 @@ if (Profile->get_mixbus())
- otherwise do nothing
*/
- act = ActionManager::register_action (transport_actions, X_("TransitionToRoll"), _("Transition to Roll"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
+ act = global_actions.register_action (transport_actions, X_("TransitionToRoll"), _("Transition to Roll"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("TransitionToReverse"), _("Transition to Reverse"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
+ act = global_actions.register_action (transport_actions, X_("TransitionToReverse"), _("Transition to Reverse"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("Loop"), _("Play Loop Range"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
+ act = global_actions.register_action (transport_actions, X_("Loop"), _("Play Loop Range"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_selection));
+ act = global_actions.register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_selection));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("PlayPreroll"), _("Play Selection w/Preroll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_preroll));
+ act = global_actions.register_action (transport_actions, X_("PlayPreroll"), _("Play Selection w/Preroll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_preroll));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("Record"), _("Enable Record"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), false));
+ act = global_actions.register_action (transport_actions, X_("Record"), _("Enable Record"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), false));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
+ act = global_actions.register_action (transport_actions, X_("record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("alternate-record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
+ act = global_actions.register_action (transport_actions, X_("alternate-record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::write_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
+ act = global_actions.register_action (transport_actions, X_("Rewind"), _("Rewind"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
+ act = global_actions.register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
+ act = global_actions.register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
+ act = global_actions.register_action (transport_actions, X_("Forward"), _("Forward"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
+ act = global_actions.register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
+ act = global_actions.register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("GotoZero"), _("Go to Zero"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
+ act = global_actions.register_action (transport_actions, X_("GotoZero"), _("Go to Zero"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
+ act = global_actions.register_action (transport_actions, X_("GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("alternate-GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
+ act = global_actions.register_action (transport_actions, X_("alternate-GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("GotoEnd"), _("Go to End"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_end));
+ act = global_actions.register_action (transport_actions, X_("GotoEnd"), _("Go to End"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_end));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("GotoWallClock"), _("Go to Wall Clock"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_wallclock));
+ act = global_actions.register_action (transport_actions, X_("GotoWallClock"), _("Go to Wall Clock"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_wallclock));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
//these actions handle the numpad events, ProTools style
- act = ActionManager::register_action (transport_actions, X_("numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
+ act = global_actions.register_action (transport_actions, X_("numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("alternate-numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
+ act = global_actions.register_action (transport_actions, X_("alternate-numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-0"), _("Numpad 0"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 0));
+ act = global_actions.register_action (transport_actions, X_("numpad-0"), _("Numpad 0"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 0));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-1"), _("Numpad 1"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 1));
+ act = global_actions.register_action (transport_actions, X_("numpad-1"), _("Numpad 1"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 1));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-2"), _("Numpad 2"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 2));
+ act = global_actions.register_action (transport_actions, X_("numpad-2"), _("Numpad 2"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 2));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-3"), _("Numpad 3"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 3));
+ act = global_actions.register_action (transport_actions, X_("numpad-3"), _("Numpad 3"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 3));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-4"), _("Numpad 4"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 4));
+ act = global_actions.register_action (transport_actions, X_("numpad-4"), _("Numpad 4"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 4));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-5"), _("Numpad 5"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 5));
+ act = global_actions.register_action (transport_actions, X_("numpad-5"), _("Numpad 5"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 5));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-6"), _("Numpad 6"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 6));
+ act = global_actions.register_action (transport_actions, X_("numpad-6"), _("Numpad 6"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 6));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-7"), _("Numpad 7"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 7));
+ act = global_actions.register_action (transport_actions, X_("numpad-7"), _("Numpad 7"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 7));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-8"), _("Numpad 8"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 8));
+ act = global_actions.register_action (transport_actions, X_("numpad-8"), _("Numpad 8"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 8));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("numpad-9"), _("Numpad 9"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 9));
+ act = global_actions.register_action (transport_actions, X_("numpad-9"), _("Numpad 9"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 9));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("focus-on-clock"), _("Focus On Clock"), sigc::mem_fun(*this, &ARDOUR_UI::focus_on_clock));
+ act = global_actions.register_action (transport_actions, X_("focus-on-clock"), _("Focus On Clock"), sigc::mem_fun(*this, &ARDOUR_UI::focus_on_clock));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("primary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Timecode));
+ act = global_actions.register_action (transport_actions, X_("primary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Timecode, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("primary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::BBT));
+ act = global_actions.register_action (transport_actions, X_("primary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::BBT, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("primary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::MinSec));
+ act = global_actions.register_action (transport_actions, X_("primary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::MinSec, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Frames));
+ act = global_actions.register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Frames, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("secondary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Timecode));
+ act = global_actions.register_action (transport_actions, X_("secondary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Timecode, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("secondary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::BBT));
+ act = global_actions.register_action (transport_actions, X_("secondary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::BBT, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("secondary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::MinSec));
+ act = global_actions.register_action (transport_actions, X_("secondary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::MinSec, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Frames));
+ act = global_actions.register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Frames, false));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch In"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
+ act = global_actions.register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch In"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
act->set_short_label (_("In"));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
+ act = global_actions.register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
act->set_short_label (_("Out"));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunch"), _("Punch In/Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch));
+ act = global_actions.register_toggle_action (transport_actions, X_("TogglePunch"), _("Punch In/Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch));
act->set_short_label (_("In/Out"));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_click));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_click));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto Input"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto Input"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto Play"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto Play"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::transport_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync Startup to Video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync Startup to Video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time Master"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_time_master));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time Master"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_time_master));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (transport_actions, X_("ToggleExternalSync"), _("Use External Positional Sync Source"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_external_sync));
+ act = global_actions.register_toggle_action (transport_actions, X_("ToggleExternalSync"), _("Use External Positional Sync Source"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_external_sync));
ActionManager::session_sensitive_actions.push_back (act);
for (int i = 1; i <= 32; ++i) {
string const a = string_compose (X_("ToggleRecordEnableTrack%1"), i);
string const n = string_compose (_("Toggle Record Enable Track %1"), i);
- act = ActionManager::register_action (common_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_record_enable), i - 1));
+ act = global_actions.register_action (common_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_record_enable), i - 1));
ActionManager::session_sensitive_actions.push_back (act);
}
- Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
+ Glib::RefPtr<ActionGroup> shuttle_actions = global_actions.create_action_group ("ShuttleActions");
shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), hide_return (sigc::bind (sigc::mem_fun (*Config, &RCConfiguration::set_shuttle_units), Percentage)));
shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), hide_return (sigc::bind (sigc::mem_fun (*Config, &RCConfiguration::set_shuttle_units), Semitones)));
- Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
+ Glib::RefPtr<ActionGroup> option_actions = global_actions.create_action_group ("Options");
- act = ActionManager::register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
+ act = global_actions.register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
+ act = global_actions.register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
+ act = global_actions.register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (option_actions, X_("SendMidiClock"), _("Send MIDI Clock"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_clock));
+ act = global_actions.register_toggle_action (option_actions, X_("SendMidiClock"), _("Send MIDI Clock"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_clock));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI Feedback"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
+ act = global_actions.register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI Feedback"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
ActionManager::session_sensitive_actions.push_back (act);
/* MIDI */
- Glib::RefPtr<ActionGroup> midi_actions = ActionGroup::create (X_("MIDI"));
- ActionManager::register_action (midi_actions, X_("panic"), _("Panic"), sigc::mem_fun(*this, &ARDOUR_UI::midi_panic));
-
- ActionManager::add_action_group (shuttle_actions);
- ActionManager::add_action_group (option_actions);
- ActionManager::add_action_group (transport_actions);
- ActionManager::add_action_group (main_actions);
- ActionManager::add_action_group (main_menu_actions);
- ActionManager::add_action_group (common_actions);
- ActionManager::add_action_group (midi_actions);
+ Glib::RefPtr<ActionGroup> midi_actions = global_actions.create_action_group (X_("MIDI"));
+ global_actions.register_action (midi_actions, X_("panic"), _("Panic"), sigc::mem_fun(*this, &ARDOUR_UI::midi_panic));
}
void
@@ -495,16 +558,6 @@ ARDOUR_UI::build_menu_bar ()
menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
menu_bar->set_name ("MainMenuBar");
- /*
- * This is needed because this property does not get installed
- * until the Menu GObject class is registered, which happens
- * when the first menu instance is created.
- */
- // XXX bug in gtkmm causes this to popup an error message
- // Gtk::Settings::get_default()->property_gtk_can_change_accels() = true;
- // so use this instead ...
- gtk_settings_set_long_property (gtk_settings_get_default(), "gtk-can-change-accels", 1, "Ardour:designers");
-
EventBox* ev = manage (new EventBox);
ev->show ();
CairoHPacker* hbox = manage (new CairoHPacker);
@@ -538,22 +591,11 @@ ARDOUR_UI::build_menu_bar ()
format_label.set_use_markup ();
#ifndef TOP_MENUBAR
- menu_hbox.pack_start (*menu_bar, false, false);
+ menu_hbox.pack_start (*menu_bar, false, false);
#else
use_menubar_as_top_menubar ();
#endif
- bool wall_clock = false;
- bool disk_space = false;
-
- if (!Profile->get_small_screen()) {
-#ifndef GTKOSX
- // OSX provides its own wallclock, thank you very much
- wall_clock = true;
-#endif
- disk_space = true;
- }
-
hbox->pack_end (error_alert_button, false, false, 2);
hbox->pack_end (wall_clock_label, false, false, 2);
@@ -571,10 +613,11 @@ ARDOUR_UI::build_menu_bar ()
menu_bar_base.set_name ("MainMenuBar");
menu_bar_base.add (menu_hbox);
-#ifndef GTKOSX
- _status_bar_visibility.add (&wall_clock_label, X_("WallClock"), _("Wall Clock"), wall_clock);
+#ifndef __APPLE__
+ // OSX provides its own wallclock, thank you very much
+ _status_bar_visibility.add (&wall_clock_label, X_("WallClock"), _("Wall Clock"), true);
#endif
- _status_bar_visibility.add (&disk_space_label, X_("Disk"), _("Disk Space"), disk_space);
+ _status_bar_visibility.add (&disk_space_label, X_("Disk"), _("Disk Space"), !Profile->get_small_screen());
_status_bar_visibility.add (&cpu_load_label, X_("DSP"), _("DSP"), true);
_status_bar_visibility.add (&xrun_label, X_("XRun"), _("X-run"), false);
_status_bar_visibility.add (&peak_thread_work_label,X_("Peakfile"), _("Active Peak-file Work"), false);
@@ -612,7 +655,7 @@ ARDOUR_UI::use_menubar_as_top_menubar ()
app->add_app_menu_item (group, dynamic_cast<MenuItem*>(widget));
}
- if ((widget = ActionManager::get_widget ("/ui/Main/Session/toggle-rc-options-editor"))) {
+ if ((widget = ActionManager::get_widget ("/ui/Main/Edit/menu-show-preferences"))) {
app->add_app_menu_item (group, dynamic_cast<MenuItem*>(widget));
}
@@ -630,6 +673,7 @@ ARDOUR_UI::save_ardour_state ()
a different lifetime model from add_instant_xml().
*/
+ LocaleGuard lg; // one guard to rule them all
XMLNode* node = new XMLNode (keyboard->get_state());
Config->add_extra_xml (*node);
Config->add_extra_xml (get_transport_controllable_state());
@@ -637,34 +681,49 @@ ARDOUR_UI::save_ardour_state ()
XMLNode* window_node = new XMLNode (X_("UI"));
window_node->add_property (_status_bar_visibility.get_state_name().c_str(), _status_bar_visibility.get_state_value ());
+ /* main window */
+
+ gint mx, my, mw, mh;
+ _main_window.get_position (mx, my);
+ _main_window.get_size (mw, mh);
+
+ XMLNode main_window_node (X_("Main"));
+ main_window_node.add_property (X_("x"), PBD::to_string (mx, std::dec));
+ main_window_node.add_property (X_("y"), PBD::to_string (my, std::dec));
+ main_window_node.add_property (X_("w"), PBD::to_string (mw, std::dec));
+ main_window_node.add_property (X_("h"), PBD::to_string (mh, std::dec));
+
+ string current_tab;
+ int current_page_number = _tabs.get_current_page ();
+ if (current_page_number == _tabs.page_num (editor->contents())) {
+ current_tab = "editor";
+ } else if (current_page_number == _tabs.page_num (mixer->contents())) {
+ current_tab = "mixer";
+ } else if (current_page_number == _tabs.page_num (rc_option_editor->contents())) {
+ current_tab = "preferences";
+ }
+
+ main_window_node.add_property (X_("current-tab"), current_tab);
+
/* Windows */
WM::Manager::instance().add_state (*window_node);
- /* tearoffs */
-
XMLNode* tearoff_node = new XMLNode (X_("Tearoffs"));
- if (transport_tearoff) {
- XMLNode* t = new XMLNode (X_("transport"));
- transport_tearoff->add_state (*t);
- tearoff_node->add_child_nocopy (*t);
- }
-
if (mixer->monitor_section()) {
XMLNode* t = new XMLNode (X_("monitor-section"));
mixer->monitor_section()->tearoff().add_state (*t);
tearoff_node->add_child_nocopy (*t);
}
- if (editor->mouse_mode_tearoff()) {
- XMLNode* t = new XMLNode (X_("mouse-mode"));
- editor->mouse_mode_tearoff ()->add_state (*t);
- tearoff_node->add_child_nocopy (*t);
- }
-
window_node->add_child_nocopy (*tearoff_node);
+ XMLNode& enode (editor->get_state());
+ XMLNode& mnode (mixer->get_state());
+ XMLNode& bnode (meterbridge->get_state());
+ XMLNode& pnode (rc_option_editor->get_state());
+
Config->add_extra_xml (*window_node);
Config->add_extra_xml (audio_midi_setup->get_state());
@@ -672,25 +731,30 @@ ARDOUR_UI::save_ardour_state ()
UIConfiguration::instance().save_state ();
- XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
- XMLNode& mnode (mixer->get_state());
- XMLNode& bnode (meterbridge->get_state());
-
if (_session) {
+ _session->add_instant_xml (main_window_node);
_session->add_instant_xml (enode);
_session->add_instant_xml (mnode);
+ _session->add_instant_xml (pnode);
_session->add_instant_xml (bnode);
if (location_ui) {
_session->add_instant_xml (location_ui->ui().get_state ());
}
} else {
+ Config->add_instant_xml (main_window_node);
Config->add_instant_xml (enode);
Config->add_instant_xml (mnode);
+ Config->add_instant_xml (pnode);
+ Config->add_instant_xml (bnode);
if (location_ui) {
Config->add_instant_xml (location_ui->ui().get_state ());
}
}
+
delete &enode;
+ delete &mnode;
+ delete &bnode;
+ delete &pnode;
Keyboard::save_keybindings ();
}
@@ -725,3 +789,27 @@ ARDOUR_UI::xrun_button_release (GdkEventButton* ev)
}
return true;
}
+
+Gtk::Notebook&
+ARDOUR_UI::tabs()
+{
+ return _tabs;
+}
+
+bool
+ARDOUR_UI::tabbable_visibility_button_press (GdkEventButton* ev, string const& tabbable_name)
+{
+ if (ev->button != 3) {
+ return false;
+ }
+
+ /* context menu is defined in *.menus.in
+ */
+
+ string menu_name = string ("/ui/") + tabbable_name + X_("TabbableButtonMenu");
+ Gtk::Menu* menu = dynamic_cast<Gtk::Menu*> (ActionManager::get_widget (menu_name.c_str()));
+ if (menu) {
+ menu->popup (3, ev->time);
+ }
+ return true;
+}
diff --git a/gtk2_ardour/ardour_ui_mixer.cc b/gtk2_ardour/ardour_ui_mixer.cc
index 56ecc05..4f5614e 100644
--- a/gtk2_ardour/ardour_ui_mixer.cc
+++ b/gtk2_ardour/ardour_ui_mixer.cc
@@ -23,12 +23,14 @@
is to cut down on the nasty compile times for these classes.
*/
+#include "gtkmm2ext/keyboard.h"
+
#include "actions.h"
#include "ardour_ui.h"
#include "mixer_ui.h"
#include "meterbridge.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -39,13 +41,14 @@ ARDOUR_UI::create_mixer ()
{
try {
mixer = Mixer_UI::instance ();
+ mixer->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change));
}
catch (failed_constructor& err) {
return -1;
}
- mixer->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
+ // mixer->signal_event().connect (sigc::bind (sigc::ptr_fun (&Gtkmm2ext::Keyboard::catch_user_event_for_pre_dialog_focus), mixer));
return 0;
}
@@ -63,8 +66,6 @@ ARDOUR_UI::create_meterbridge ()
return -1;
}
- meterbridge->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
-
return 0;
}
diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc
index 0284670..98ede1d 100644
--- a/gtk2_ardour/ardour_ui_options.cc
+++ b/gtk2_ardour/ardour_ui_options.cc
@@ -38,7 +38,7 @@
#include "public_editor.h"
#include "main_clock.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace Gtkmm2ext;
@@ -46,14 +46,6 @@ using namespace ARDOUR;
using namespace PBD;
void
-ARDOUR_UI::toggle_keep_tearoffs ()
-{
- ActionManager::toggle_config_state ("Common", "KeepTearoffs", &UIConfiguration::set_keep_tearoffs, &UIConfiguration::get_keep_tearoffs);
-
- ARDOUR_UI::update_tearoff_visibility();
-}
-
-void
ARDOUR_UI::toggle_external_sync()
{
if (_session) {
@@ -91,31 +83,31 @@ ARDOUR_UI::toggle_time_master ()
void
ARDOUR_UI::toggle_send_mtc ()
{
- ActionManager::toggle_config_state ("options", "SendMTC", &RCConfiguration::set_send_mtc, &RCConfiguration::get_send_mtc);
+ ActionManager::toggle_config_state ("Options", "SendMTC", &RCConfiguration::set_send_mtc, &RCConfiguration::get_send_mtc);
}
void
ARDOUR_UI::toggle_send_mmc ()
{
- ActionManager::toggle_config_state ("options", "SendMMC", &RCConfiguration::set_send_mmc, &RCConfiguration::get_send_mmc);
+ ActionManager::toggle_config_state ("Options", "SendMMC", &RCConfiguration::set_send_mmc, &RCConfiguration::get_send_mmc);
}
void
ARDOUR_UI::toggle_send_midi_clock ()
{
- ActionManager::toggle_config_state ("options", "SendMidiClock", &RCConfiguration::set_send_midi_clock, &RCConfiguration::get_send_midi_clock);
+ ActionManager::toggle_config_state ("Options", "SendMidiClock", &RCConfiguration::set_send_midi_clock, &RCConfiguration::get_send_midi_clock);
}
void
ARDOUR_UI::toggle_use_mmc ()
{
- ActionManager::toggle_config_state ("options", "UseMMC", &RCConfiguration::set_mmc_control, &RCConfiguration::get_mmc_control);
+ ActionManager::toggle_config_state ("Options", "UseMMC", &RCConfiguration::set_mmc_control, &RCConfiguration::get_mmc_control);
}
void
ARDOUR_UI::toggle_send_midi_feedback ()
{
- ActionManager::toggle_config_state ("options", "SendMIDIfeedback", &RCConfiguration::set_midi_feedback, &RCConfiguration::get_midi_feedback);
+ ActionManager::toggle_config_state ("Options", "SendMIDIfeedback", &RCConfiguration::set_midi_feedback, &RCConfiguration::get_midi_feedback);
}
void
@@ -340,18 +332,16 @@ ARDOUR_UI::parameter_changed (std::string p)
} else if (p == "send-mtc") {
- ActionManager::map_some_state ("options", "SendMTC", &RCConfiguration::get_send_mtc);
+ ActionManager::map_some_state ("Options", "SendMTC", &RCConfiguration::get_send_mtc);
} else if (p == "send-mmc") {
- ActionManager::map_some_state ("options", "SendMMC", &RCConfiguration::get_send_mmc);
+ ActionManager::map_some_state ("Options", "SendMMC", &RCConfiguration::get_send_mmc);
- } else if (p == "keep-tearoffs") {
- ActionManager::map_some_state ("Common", "KeepTearoffs", &UIConfiguration::get_keep_tearoffs);
} else if (p == "mmc-control") {
- ActionManager::map_some_state ("options", "UseMMC", &RCConfiguration::get_mmc_control);
+ ActionManager::map_some_state ("Options", "UseMMC", &RCConfiguration::get_mmc_control);
} else if (p == "midi-feedback") {
- ActionManager::map_some_state ("options", "SendMIDIfeedback", &RCConfiguration::get_midi_feedback);
+ ActionManager::map_some_state ("Options", "SendMIDIfeedback", &RCConfiguration::get_midi_feedback);
} else if (p == "auto-play") {
ActionManager::map_some_state ("Transport", "ToggleAutoPlay", sigc::mem_fun (_session->config, &SessionConfiguration::get_auto_play));
} else if (p == "auto-return") {
@@ -404,6 +394,13 @@ ARDOUR_UI::parameter_changed (std::string p)
stop_clocking ();
start_clocking ();
}
+ } else if (p == "use-tooltips") {
+ /* this doesn't really belong here but it has to go somewhere */
+ if (UIConfiguration::instance().get_use_tooltips()) {
+ Gtkmm2ext::enable_tooltips ();
+ } else {
+ Gtkmm2ext::disable_tooltips ();
+ }
} else if (p == "waveform-gradient-depth") {
ArdourCanvas::WaveView::set_global_gradient_depth (UIConfiguration::instance().get_waveform_gradient_depth());
} else if (p == "show-editor-meter") {
@@ -411,13 +408,13 @@ ARDOUR_UI::parameter_changed (std::string p)
if (editor_meter) {
if (meter_box.get_parent()) {
- transport_tearoff_hbox.remove (meter_box);
- transport_tearoff_hbox.remove (editor_meter_peak_display);
+ transport_hbox.remove (meter_box);
+ transport_hbox.remove (editor_meter_peak_display);
}
if (show) {
- transport_tearoff_hbox.pack_start (meter_box, false, false);
- transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
+ transport_hbox.pack_start (meter_box, false, false);
+ transport_hbox.pack_start (editor_meter_peak_display, false, false);
meter_box.show();
editor_meter_peak_display.show();
}
@@ -434,6 +431,18 @@ ARDOUR_UI::parameter_changed (std::string p)
} else if (p == "waveform-cache-size") {
/* GUI option has units of megabytes; image cache uses units of bytes */
ArdourCanvas::WaveView::set_image_cache_size (UIConfiguration::instance().get_waveform_cache_size() * 1048576);
+ } else if (p == "use-wm-visibility") {
+ VisibilityTracker::set_use_window_manager_visibility (UIConfiguration::instance().get_use_wm_visibility());
+ } else if (p == "action-table-columns") {
+ const uint32_t cols = UIConfiguration::instance().get_action_table_columns ();
+ for (int i = 0; i < 9; ++i) {
+ const int col = i / 3;
+ if (cols & (1<<col)) {
+ action_script_call_btn[i].show();
+ } else {
+ action_script_call_btn[i].hide();
+ }
+ }
}
}
diff --git a/gtk2_ardour/ardour_window.cc b/gtk2_ardour/ardour_window.cc
index 029f5f1..6289991 100644
--- a/gtk2_ardour/ardour_window.cc
+++ b/gtk2_ardour/ardour_window.cc
@@ -106,21 +106,33 @@ ArdourWindow::init ()
set_border_width (10);
add_events (Gdk::FOCUS_CHANGE_MASK);
- /* ArdourWindows are not dialogs (they have no "OK" or "Close" button) but
+ /* ArdourWindows are not dialogs (they have no "OK" or "Close" button) but
they should be considered part of the same "window level" as a dialog. This
- works on X11 and Quartz, in that:
+ works on X11 in that:
- (a) utility & dialog windows are considered to be part of the same level
+ (a) there are no window "levels"
(b) they will float above normal windows without any particular effort
(c) present()-ing them will make a utility float over a dialog or
vice versa.
+
+ Some X11 Window managers (e.g. KDE) get this wrong, and so we allow the user
+ to select what type of window hint is used.
+
+ GTK+ on OS X uses different levels for DIALOG and UTILITY, and Cocoa has a bug/design
+ issue that it will not transfer keyboard focus across levels when hiding a window.
+ So on OS X, we use DIALOG for all ArdourWindows to ensure that keyboard focus
+ will return to the main window(s) when this window is hidden.
*/
+#ifdef __APPLE__
+ set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG);
+#else
if (UIConfiguration::instance().get_all_floating_windows_are_dialogs()) {
set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG);
} else {
set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY);
}
+#endif
Gtk::Window* parent = WM::Manager::instance().transient_parent();
diff --git a/gtk2_ardour/ardour_window.h b/gtk2_ardour/ardour_window.h
index 7ae9c3d..a4c5aaa 100644
--- a/gtk2_ardour/ardour_window.h
+++ b/gtk2_ardour/ardour_window.h
@@ -39,20 +39,21 @@ namespace WM {
*/
class ArdourWindow : public Gtk::Window, public ARDOUR::SessionHandlePtr, public Gtkmm2ext::VisibilityTracker
{
- public:
+public:
ArdourWindow (std::string title);
ArdourWindow (Gtk::Window& parent, std::string title);
- ~ArdourWindow();
+ virtual ~ArdourWindow();
+protected:
bool on_focus_in_event (GdkEventFocus*);
bool on_focus_out_event (GdkEventFocus*);
- bool on_delete_event (GdkEventAny *);
- bool on_key_press_event (GdkEventKey*);
+ bool on_delete_event (GdkEventAny *);
+ bool on_key_press_event (GdkEventKey*);
void on_unmap ();
- private:
- WM::ProxyTemporary* proxy;
- void init ();
+private:
+ WM::ProxyTemporary* proxy;
+ void init ();
};
#endif // __ardour_window_h__
diff --git a/gtk2_ardour/arlua b/gtk2_ardour/arlua
new file mode 100755
index 0000000..1286f79
--- /dev/null
+++ b/gtk2_ardour/arlua
@@ -0,0 +1,50 @@
+#!/bin/sh
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+export UBUNTU_MENUPROXY=""
+
+if [ $# -gt 0 ] ; then
+ case $1 in
+ -g|--gdb) DBG=gdb; shift ;;
+ esac
+ case $1 in
+ --valgrind) DBG=valgrind; shift ;;
+ esac
+ case $1 in
+ --callgrind) DBG=callgrind; shift ;;
+ esac
+fi
+
+
+if test -z "$DBG"; then
+ exec $TOP/build/tools/luadevel/luasession "$@"
+fi
+
+if test "$DBG" = "valgrind"; then
+ export ARDOUR_RUNNING_UNDER_VALGRIND=TRUE
+ exec valgrind \
+ --error-limit=no --num-callers=50 \
+ --tool=memcheck \
+ --track-origins=yes \
+ --leak-check=full --show-leak-kinds=all \
+ --suppressions=${TOP}/tools/valgrind.supp \
+ $TOP/build/tools/luadevel/luasession "$@"
+fi
+
+if test "$DBG" = "callgrind"; then
+ exec valgrind \
+ --error-limit=no --num-callers=50 \
+ --tool=callgrind \
+ --separate-callers=3 \
+ --separate-threads=yes \
+ --collect-systime=yes \
+ --collect-jumps=yes \
+ $TOP/build/tools/luadevel/luasession "$@"
+fi
+
+if test -n "`which gdb`"; then
+ exec gdb --args $TOP/build/tools/luadevel/luasession "$@"
+fi
+if test -n "`which lldb`"; then
+ exec lldb -- $TOP/build/tools/luadevel/luasession "$@"
+fi
diff --git a/gtk2_ardour/arluadoc b/gtk2_ardour/arluadoc
new file mode 100755
index 0000000..2190958
--- /dev/null
+++ b/gtk2_ardour/arluadoc
@@ -0,0 +1,15 @@
+#!/bin/sh
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+export UBUNTU_MENUPROXY=""
+
+$TOP/build/gtk2_ardour/luadoc "$@" \
+ | sed 's/__cxx11:://g;' \
+ | sed 's/std::basic_string<char, std::char_traits<char>\, std::allocator<char> >/std::string/g;' \
+ | sed 's/, std::less<[^>]*<[^>]*>[ ]*>[ ]*>//g;' \
+ | sed 's/, std::less<[^>]*>//g;' \
+ | sed 's/, std::allocator<[^>]*<[^>]*>[ ]*>//g;' \
+ | sed 's/, std::allocator<[^>]*>//g;' \
+ | sed 's/ "/"/g;' \
+ | gzip -9 \
+ > $TOP/doc/luadoc.json.gz
diff --git a/gtk2_ardour/arscan b/gtk2_ardour/arscan
new file mode 100755
index 0000000..ab79995
--- /dev/null
+++ b/gtk2_ardour/arscan
@@ -0,0 +1,49 @@
+#!/bin/sh
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+export UBUNTU_MENUPROXY=""
+
+if [ $# -gt 0 ] ; then
+ case $1 in
+ -g|--gdb) DBG=gdb; shift ;;
+ esac
+ case $1 in
+ --valgrind) DBG=valgrind; shift ;;
+ esac
+ case $1 in
+ --callgrind) DBG=callgrind; shift ;;
+ esac
+fi
+
+if test -z "$DBG"; then
+ exec $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+
+if test "$DBG" = "valgrind"; then
+ export ARDOUR_RUNNING_UNDER_VALGRIND=TRUE
+ exec valgrind \
+ --error-limit=no --num-callers=50 \
+ --tool=memcheck \
+ --track-origins=yes \
+ --leak-check=full --show-leak-kinds=all \
+ --suppressions=${TOP}/tools/valgrind.supp \
+ $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+
+if test "$DBG" = "callgrind"; then
+ exec valgrind \
+ --error-limit=no --num-callers=50 \
+ --tool=callgrind \
+ --separate-callers=3 \
+ --separate-threads=yes \
+ --collect-systime=yes \
+ --collect-jumps=yes \
+ $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+
+if test -n "`which gdb`"; then
+ exec gdb --args $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+if test -n "`which lldb`"; then
+ exec lldb -- $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
diff --git a/gtk2_ardour/au_pluginui.h b/gtk2_ardour/au_pluginui.h
index 883e7e0..5e43bcb 100644
--- a/gtk2_ardour/au_pluginui.h
+++ b/gtk2_ardour/au_pluginui.h
@@ -23,6 +23,8 @@
#include <vector>
#include <string>
+#include <stdint.h>
+
#include <AppKit/AppKit.h>
#include <Carbon/Carbon.h>
#include <AudioUnit/AudioUnitCarbonView.h>
@@ -65,6 +67,12 @@ class AUPluginUI;
}
@end
+ at interface LiveResizeNotificationObject : NSObject {
+ @private
+ AUPluginUI* plugin_ui;
+}
+ at end
+
class AUPluginUI : public PlugUIBase, public Gtk::VBox
{
public:
@@ -88,7 +96,6 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
void lower_box_unmap ();
void lower_box_size_request (GtkRequisition*);
void lower_box_size_allocate (Gtk::Allocation&);
- gboolean lower_box_expose (GdkEventExpose*);
void cocoa_view_resized ();
void on_realize ();
@@ -100,6 +107,9 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
OSStatus carbon_event (EventHandlerCallRef nextHandlerRef, EventRef event);
+ void start_live_resize ();
+ void end_live_resize ();
+
private:
WindowRef wr;
boost::shared_ptr<ARDOUR::AUPlugin> au;
@@ -115,20 +125,17 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
static std::vector<std::string> automation_mode_strings;
- bool mapped;
bool resizable;
- int min_width;
- int min_height;
int req_width;
int req_height;
- int alo_width;
- int alo_height;
/* Cocoa */
NSWindow* cocoa_window;
NSView* au_view;
NSRect last_au_frame;
+ bool in_live_resize;
+ uint32_t plugin_requested_resize;
/* Carbon */
@@ -136,9 +143,13 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
ComponentDescription carbon_descriptor;
AudioUnitCarbonView editView;
WindowRef carbon_window;
- EventHandlerRef carbon_event_handler;
+ EventHandlerRef carbon_event_handler;
bool _activating_from_app;
+
+ /* Generic */
+
NotificationObject* _notify;
+ LiveResizeNotificationObject* _resize_notify;
bool test_cocoa_view_support ();
bool test_carbon_view_support ();
@@ -152,6 +163,21 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
void update_view_size ();
bool plugin_class_valid (Class pluginClass);
+
+ friend void au_cf_timer_callback (CFRunLoopTimerRef timer, void* info);
+ static CFRunLoopTimerRef cf_timer;
+ static void cf_timer_callback ();
+ static int64_t last_timer;
+ static bool timer_needed;
+ static uint64_t timer_callbacks;
+ static uint64_t timer_out_of_range;
+
+ static bool timer_callback ();
+ static sigc::connection timer_connection;
+
+ public:
+ static void start_cf_timer ();
+ static void stop_cf_timer ();
};
#endif /* __gtk2_ardour_auplugin_ui_h__ */
diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm
index af174f9..fc73b9b 100644
--- a/gtk2_ardour/au_pluginui.mm
+++ b/gtk2_ardour/au_pluginui.mm
@@ -1,6 +1,7 @@
#undef Marker
#define Marker FuckYouAppleAndYourLackOfNameSpaces
+#include <sys/time.h>
#include <gtkmm/button.h>
#include <gdk/gdkquartz.h>
@@ -14,22 +15,41 @@
#undef check // stupid gtk, stupid apple
#include <gtkmm2ext/utils.h>
+#include <gtkmm2ext/window_proxy.h>
#include "au_pluginui.h"
#include "gui_thread.h"
+#include "processor_box.h"
+
+// yes, yes we know (see wscript for various available OSX compat modes)
+#if defined (__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
#include "CAAudioUnit.h"
#include "CAComponent.h"
+#if defined (__clang__)
+# pragma clang diagnostic pop
+#endif
+
#import <AudioUnit/AUCocoaUIView.h>
#import <CoreAudioKit/AUGenericView.h>
+#import <objc/runtime.h>
+
+#ifndef __ppc__
+#include <dispatch/dispatch.h>
+#endif
#undef Marker
#include "keyboard.h"
#include "utils.h"
#include "public_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
+
+#include "gtk2ardour-config.h"
#ifdef COREAUDIO105
#define ArdourCloseComponent CloseComponent
@@ -43,6 +63,10 @@ using namespace std;
using namespace PBD;
vector<string> AUPluginUI::automation_mode_strings;
+int64_t AUPluginUI::last_timer = 0;
+bool AUPluginUI::timer_needed = true;
+CFRunLoopTimerRef AUPluginUI::cf_timer;
+sigc::connection AUPluginUI::timer_connection;
static const gchar* _automation_mode_strings[] = {
X_("Manual"),
@@ -58,11 +82,21 @@ dump_view_tree (NSView* view, int depth, int maxdepth)
NSArray* subviews = [view subviews];
unsigned long cnt = [subviews count];
+ if (depth == 0) {
+ NSView* su = [view superview];
+ if (su) {
+ NSRect sf = [su frame];
+ cerr << " PARENT view " << su << " @ " << sf.origin.x << ", " << sf.origin.y
+ << ' ' << sf.size.width << " x " << sf.size.height
+ << endl;
+ }
+ }
+
for (int d = 0; d < depth; d++) {
cerr << '\t';
}
NSRect frame = [view frame];
- cerr << " view @ " << frame.origin.x << ", " << frame.origin.y
+ cerr << " view " << view << " @ " << frame.origin.x << ", " << frame.origin.y
<< ' ' << frame.size.width << " x " << frame.size.height
<< endl;
@@ -75,6 +109,181 @@ dump_view_tree (NSView* view, int depth, int maxdepth)
}
}
+/* This deeply hacky block of code exists for a rather convoluted reason.
+ *
+ * The proximal reason is that there are plugins (such as XLN's Addictive Drums
+ * 2) which redraw their GUI/editor windows using a timer, and use a drawing
+ * technique that on Retina displays ends up calling arg32_image_mark_RGB32, a
+ * function that for some reason (probably byte-swapping or pixel-doubling) is
+ * many times slower than the function used on non-Retina displays.
+ *
+ * We are not the first people to discover the problem with
+ * arg32_image_mark_RGB32.
+ *
+ * Justin Fraenkel, the lead author of Reaper, wrote a very detailed account of
+ * the performance issues with arg32_image_mark_RGB32 here:
+ * http://www.1014.org/?article=516
+ *
+ * The problem was also seen by Robert O'Callahan (lead developer of rr, the
+ * reverse debugger) as far back as 2010:
+ * http://robert.ocallahan.org/2010/05/cglayer-performance-trap-with-isflipped_03.html
+ *
+ * In fact, it is so slow that the drawing takes up close to 100% of a single
+ * core, and the event loop that the drawing occurs in never sleeps or "idles".
+ *
+ * In AU hosts built directly on top of Cocoa, or some other toolkits, this
+ * isn't inherently a major problem - it just makes the entire GUI of the
+ * application slow.
+ *
+ * However, there is an additional problem for Ardour because GTK+ is built on
+ * top of the GDK/Quartz event loop integration. This integration is rather
+ * baroque, mostly because it was written at a time when CFRunLoop did not
+ * offer a way to wait for "input" from file descriptors (which arrived in OS X
+ * 10.5). As a result, it uses a hair-raising design involving an additional
+ * thread. This design has a major problem, which is that it effectively
+ * creates two nested run loops.
+ *
+ * The GTK+/GDK/glib one runs until it has nothing to do, at which time it
+ * calls a function to wait until there is something to do. On Linux or Windows
+ * that would involve some variant or relative of poll(2), which puts the
+ * process to sleep until there is something to do.
+ *
+ * On OS X, glib ends up calling [CFRunLoop waitForNextEventMatchingMask] which
+ * will eventually put the process to sleep, but won't do so until the
+ * CFRunLoop also has nothing to do. This includes (at least) a complete redraw
+ * cycle. If redrawing takes too long, and there are timers expired for another
+ * redraw (e.g. Addictive Drums 2, again), then the CFRunLoop will just start
+ * another redraw cycle after processing any events and other stuff.
+ *
+ * If the CFRunLoop stays busy, then it will never return to the glib
+ * level at all, thus stopping any further GTK+ level activity (events,
+ * drawing) from taking place. In short, the current (spring 2016) design of
+ * the GDK/Quartz event loop integration relies on the idea that the internal
+ * CFRunLoop will go idle, and totally breaks if this does not happen.
+ *
+ * So take a fully functional Ardour, add in XLN's Addictive Drums 2, and a
+ * Retina display, and Apple's ridiculously slow blitting code, and the
+ * CFRunLoop never goes idle. As soon as Addictive Drums starts drawing (over
+ * and over again), the GTK+ event loop stops receiving events and stops
+ * drawing.
+ *
+ * One fix for this was to run a nested GTK+ event loop iteration (or two)
+ * whenever a plugin window was redrawn. This works in the sense that the
+ * immediate issue (no GTK+ events or drawing) is fixed. But the recursive GTK+
+ * event loop causes its own (very subtle) problems too.
+ *
+ * This code takes a rather radical approach. We use Objective C's ability to
+ * swizzle object methods. Specifically, we replace [NSView displayIfNeeded]
+ * with our own version which will skip redraws of plugin windows if we tell it
+ * too. If we haven't done that, or if the redraw is of a non-plugin window,
+ * then we invoke the original displayIfNeeded method.
+ *
+ * After every 10 redraws of a given plugin GUI/editor window, we queue up a
+ * GTK/glib idle callback to measure the interval between those idle
+ * callbacks. We do this globally across all plugin windows, so if the callback
+ * is already queued, we don't requeue it.
+ *
+ * If the interval is longer than 40msec (a 25fps redraw rate), we set
+ * block_plugin_redraws to some number. Each successive call to our interposed
+ * displayIfNeeded method will (a) check this value and if non-zero (b) check
+ * if the call is for a plugin-related NSView/NSWindow. If it is, then we will
+ * skip the redisplay entirely, hopefully avoiding any calls to
+ * argb32_image_mark_RGB32 or any other slow drawing code, and thus allowing
+ * the CFRunLoop to go idle. If the value is zero or the call is for a
+ * non-plugin window, then we just invoke the "original" displayIfNeeded
+ * method.
+ *
+ * This hack adds a tiny bit of overhead onto redrawing of the entire
+ * application. But in the common case this consists of 1 conditional (the
+ * check on block_plugin_redraws, which will find it to be zero) and the
+ * invocation of the original method. Given how much work is typically done
+ * during drawing, this seems acceptable.
+ *
+ * The correct fix for this is to redesign the relationship between
+ * GTK+/GDK/glib so that a glib run loop is actually a CFRunLoop, with all
+ * GSources represented as CFRunLoopSources, without any nesting and without
+ * any additional thread. This is not a task to be undertaken lightly, and is
+ * certainly substantially more work than this was. It may never be possible to
+ * do that work in a way that could be integrated back into glib, because of
+ * the rather specific semantics and types of GSources, but it would almost
+ * certainly be possible to make it work for Ardour.
+ */
+
+static uint32_t block_plugin_redraws = 0;
+static const uint32_t minimum_redraw_rate = 30; /* frames per second */
+static const uint32_t block_plugin_redraw_count = 15; /* number of combined plugin redraws to block, if blocking */
+
+#ifdef __ppc__
+
+/* PowerPC versions of OS X do not support libdispatch, which we use below when swizzling objective C. But they also don't have Retina
+ * which is the underlying reason for this code. So just skip it on those CPUs.
+ */
+
+
+static void add_plugin_view (id view) {}
+static void remove_plugin_view (id view) {}
+
+#else
+
+static IMP original_nsview_drawIfNeeded;
+static std::vector<id> plugin_views;
+
+static void add_plugin_view (id view)
+{
+ if (plugin_views.empty()) {
+ AUPluginUI::start_cf_timer ();
+ }
+
+ plugin_views.push_back (view);
+
+}
+
+static void remove_plugin_view (id view)
+{
+ std::vector<id>::iterator x = find (plugin_views.begin(), plugin_views.end(), view);
+ if (x != plugin_views.end()) {
+ plugin_views.erase (x);
+ }
+ if (plugin_views.empty()) {
+ AUPluginUI::stop_cf_timer ();
+ }
+}
+
+static void interposed_drawIfNeeded (id receiver, SEL selector, NSRect rect)
+{
+ if (block_plugin_redraws && (find (plugin_views.begin(), plugin_views.end(), receiver) != plugin_views.end())) {
+ block_plugin_redraws--;
+#ifdef AU_DEBUG_PRINT
+ std::cerr << "Plugin redraw blocked\n";
+#endif
+ /* YOU ... SHALL .... NOT ... DRAW!!!! */
+ return;
+ }
+ (void) ((int (*)(id,SEL,NSRect)) original_nsview_drawIfNeeded) (receiver, selector, rect);
+}
+
+ at implementation NSView (Tracking)
++ (void) load {
+ static dispatch_once_t once_token;
+
+ /* this swizzles NSView::displayIfNeeded and replaces it with
+ * interposed_drawIfNeeded(), which allows us to interpose and block
+ * the redrawing of plugin UIs when their redrawing behaviour
+ * is interfering with event loop behaviour.
+ */
+
+ dispatch_once (&once_token, ^{
+ Method target = class_getInstanceMethod ([NSView class], @selector(displayIfNeeded));
+ original_nsview_drawIfNeeded = method_setImplementation (target, (IMP) interposed_drawIfNeeded);
+ });
+}
+
+ at end
+
+#endif /* __ppc__ */
+
+/* END OF THE PLUGIN REDRAW HACK */
+
@implementation NotificationObject
- (NotificationObject*) initWithPluginUI: (AUPluginUI*) apluginui andCocoaParent: (NSWindow*) cp andTopLevelParent: (NSWindow*) tlp
@@ -139,19 +348,43 @@ dump_view_tree (NSView* view, int depth, int maxdepth)
@end
+ at implementation LiveResizeNotificationObject
+
+- (LiveResizeNotificationObject*) initWithPluginUI: (AUPluginUI*) apluginui
+{
+ self = [ super init ];
+ if (self) {
+ plugin_ui = apluginui;
+ }
+
+ return self;
+}
+
+- (void)windowWillStartLiveResizeHandler:(NSNotification*)notification
+{
+ plugin_ui->start_live_resize ();
+}
+
+- (void)windowWillEndLiveResizeHandler:(NSNotification*)notification
+{
+ plugin_ui->end_live_resize ();
+}
+ at end
+
AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
: PlugUIBase (insert)
, automation_mode_label (_("Automation"))
, preset_label (_("Presets"))
- , mapped (false)
, resizable (false)
- , min_width (0)
- , min_height (0)
, req_width (0)
, req_height (0)
- , alo_width (0)
- , alo_height (0)
-
+ , cocoa_window (0)
+ , au_view (0)
+ , in_live_resize (false)
+ , plugin_requested_resize (0)
+ , cocoa_parent (0)
+ , _notify (0)
+ , _resize_notify (0)
{
if (automation_mode_strings.empty()) {
automation_mode_strings = I18N (_automation_mode_strings);
@@ -170,6 +403,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
HBox* smaller_hbox = manage (new HBox);
smaller_hbox->set_spacing (6);
+ smaller_hbox->pack_start (pin_management_button, false, false, 4);
smaller_hbox->pack_start (preset_label, false, false, 4);
smaller_hbox->pack_start (_preset_modified, false, false);
smaller_hbox->pack_start (_preset_combo, false, false);
@@ -245,7 +479,6 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
low_box.signal_size_allocate ().connect (mem_fun (this, &AUPluginUI::lower_box_size_allocate));
low_box.signal_map ().connect (mem_fun (this, &AUPluginUI::lower_box_map));
low_box.signal_unmap ().connect (mem_fun (this, &AUPluginUI::lower_box_unmap));
- low_box.signal_expose_event ().connect (mem_fun (this, &AUPluginUI::lower_box_expose));
}
}
@@ -255,12 +488,20 @@ AUPluginUI::~AUPluginUI ()
[[NSNotificationCenter defaultCenter] removeObserver:_notify];
}
+ if (_resize_notify) {
+ [[NSNotificationCenter defaultCenter] removeObserver:_resize_notify];
+ }
+
+ NSWindow* win = get_nswindow();
+ if (au_view) {
+ remove_plugin_view ([[win contentView] superview]);
+ }
+
+#ifdef WITH_CARBON
if (cocoa_parent) {
- NSWindow* win = get_nswindow();
[win removeChildWindow:cocoa_parent];
}
-#ifdef WITH_CARBON
if (carbon_window) {
/* not parented, just overlaid on top of our window */
DisposeWindow (carbon_window);
@@ -275,7 +516,6 @@ AUPluginUI::~AUPluginUI ()
/* remove whatever we packed into low_box so that GTK doesn't
mess with it.
*/
-
[au_view removeFromSuperview];
}
}
@@ -397,7 +637,7 @@ AUPluginUI::create_cocoa_view ()
// [A] Show custom UI if view has it
if (CocoaViewBundlePath && factoryClassName) {
- NSBundle *viewBundle = [NSBundle bundleWithPath:[CocoaViewBundlePath path]];
+ NSBundle *viewBundle = [NSBundle bundleWithPath:[CocoaViewBundlePath path]];
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("tried to create bundle, result = %1\n", viewBundle));
@@ -455,8 +695,9 @@ AUPluginUI::create_cocoa_view ()
// Get the initial size of the new AU View's frame
NSRect frame = [au_view frame];
- min_width = req_width = CGRectGetWidth(NSRectToCGRect(frame));
- min_height = req_height = CGRectGetHeight(NSRectToCGRect(frame));
+ req_width = frame.size.width;
+ req_height = frame.size.height;
+
resizable = [au_view autoresizingMask];
low_box.queue_resize ();
@@ -465,25 +706,204 @@ AUPluginUI::create_cocoa_view ()
}
void
+AUPluginUI::update_view_size ()
+{
+ last_au_frame = [au_view frame];
+}
+
+bool
+AUPluginUI::timer_callback ()
+{
+ block_plugin_redraws = 0;
+#ifdef AU_DEBUG_PRINT
+ std::cerr << "Resume redraws after idle\n";
+#endif
+ return false;
+}
+
+void
+au_cf_timer_callback (CFRunLoopTimerRef timer, void* info)
+{
+ reinterpret_cast<AUPluginUI*> (info)->cf_timer_callback ();
+}
+
+void
+AUPluginUI::cf_timer_callback ()
+{
+ int64_t now = ARDOUR::get_microseconds ();
+
+ if (!last_timer || block_plugin_redraws) {
+ last_timer = now;
+ return;
+ }
+
+ const int64_t usecs_slop = (1400000 / minimum_redraw_rate); // 140%
+
+#ifdef AU_DEBUG_PRINT
+ std::cerr << "Timer elapsed : " << now - last_timer << std::endl;
+#endif
+
+ if ((now - last_timer) > (usecs_slop + (1000000/minimum_redraw_rate))) {
+ block_plugin_redraws = block_plugin_redraw_count;
+ timer_connection.disconnect ();
+ timer_connection = Glib::signal_timeout().connect (&AUPluginUI::timer_callback, 40);
+#ifdef AU_DEBUG_PRINT
+ std::cerr << "Timer too slow, block plugin redraws\n";
+#endif
+ }
+
+ last_timer = now;
+}
+
+void
+AUPluginUI::start_cf_timer ()
+{
+ if (!timer_needed) {
+ return;
+ }
+
+ CFTimeInterval interval = 1.0 / (float) minimum_redraw_rate;
+
+ cf_timer = CFRunLoopTimerCreate (kCFAllocatorDefault,
+ CFAbsoluteTimeGetCurrent() + interval,
+ interval, 0, 0,
+ au_cf_timer_callback,
+ 0);
+
+ CFRunLoopAddTimer (CFRunLoopGetCurrent(), cf_timer, kCFRunLoopCommonModes);
+ timer_needed = false;
+}
+
+void
+AUPluginUI::stop_cf_timer ()
+{
+ if (timer_needed) {
+ return;
+ }
+
+ CFRunLoopRemoveTimer (CFRunLoopGetCurrent(), cf_timer, kCFRunLoopCommonModes);
+ timer_needed = true;
+ last_timer = 0;
+}
+
+void
AUPluginUI::cocoa_view_resized ()
{
- if (!mapped || alo_width == 0 || alo_height == 0 || !resizable) {
+ /* we can get here for two reasons:
+
+ 1) the plugin window was resized by the user, a new size was
+ allocated to the window, ::update_view_size() was called, and we
+ explicitly/manually resized the AU NSView.
+
+ 2) the plugin decided to resize itself (probably in response to user
+ action, but not in response to an actual window resize)
+
+ We only want to proceed with a window resizing in the second case.
+ */
+
+ if (in_live_resize) {
+ /* ::update_view_size() will be called at the right times and
+ * will update the view size. We don't need to anything while a
+ * live resize in underway.
+ */
return;
}
- /* check for self-resizing plugins (e.g expand settings in AUSampler)
- * if the widget expands it moves its y-offset (cocoa y-axis points towards the top)
+
+ if (plugin_requested_resize) {
+ /* we tried to change the plugin frame from inside this method
+ * (to adjust the origin), which changes the frame of the AU
+ * NSView, resulting in a reentrant call to the FrameDidChange
+ * handler (this method). Ignore this reentrant call.
+ */
+#ifdef AU_DEBUG_PRINT
+ std::cerr << plugin->name() << " re-entrant call to cocoa_view_resized, ignored\n";
+#endif
+ return;
+ }
+
+ plugin_requested_resize = 1;
+
+ ProcessorWindowProxy* wp = insert->window_proxy();
+ if (wp) {
+ /* Once a plugin has requested a resize of its own window, do
+ * NOT save the window. The user may save state with the plugin
+ * editor expanded to show "extra detail" - the plugin will not
+ * refill this space when the editor is first
+ * instantiated. Leaving the window in the "too big" state
+ * cannot be recovered from.
+ *
+ * The window will be sized to fit the plugin's own request. Done.
+ */
+ wp->set_state_mask (WindowProxy::Position);
+ }
+
+ NSRect new_frame = [au_view frame];
+
+ /* from here on, we know that we've been called because the plugin
+ * decided to change the NSView frame itself.
*/
- NSRect new_au_frame = [au_view frame];
- //float dx = last_au_frame.origin.x - new_au_frame.origin.x;
- float dy = last_au_frame.origin.y - new_au_frame.origin.y;
- //req_width += dx;
- req_height += dy;
- if (req_width < min_width) req_width = min_width;
- if (req_height < min_height) req_height = min_height;
+ /* step one: compute the change in the frame size.
+ */
- last_au_frame = new_au_frame;
- low_box.queue_resize ();
+ float dy = new_frame.size.height - last_au_frame.size.height;
+ float dx = new_frame.size.width - last_au_frame.size.width;
+
+ NSWindow* window = get_nswindow ();
+ NSRect windowFrame= [window frame];
+
+ /* we want the top edge of the window to remain in the same place,
+ but the Cocoa/Quartz origin is at the lower left. So, when we make
+ the window larger, we will move it down, which means shifting the
+ origin toward (x,0). This will leave the top edge in the same place.
+ */
+
+ windowFrame.origin.y -= dy;
+ windowFrame.origin.x -= dx;
+ windowFrame.size.height += dy;
+ windowFrame.size.width += dx;
+
+ NSUInteger old_auto_resize = [au_view autoresizingMask];
+
+ /* Some stupid AU Views change the origin of the original AU View when
+ they are resized (I'm looking at you AUSampler). If the origin has
+ been moved, move it back.
+ */
+
+ if (last_au_frame.origin.x != new_frame.origin.x ||
+ last_au_frame.origin.y != new_frame.origin.y) {
+ new_frame.origin = last_au_frame.origin;
+ [au_view setFrame:new_frame];
+ /* also be sure to redraw the topbox because this can
+ also go wrong.
+ */
+ top_box.queue_draw ();
+ }
+
+ /* We resize the window using Cocoa. We can't use GTK mechanisms
+ * because of this:
+ *
+ * http://www.lists.apple.com/archives/coreaudio-api/2005/Aug/msg00245.html
+ *
+ * "The host needs to be aware that changing the size of the window in
+ * response to the NSViewFrameDidChangeNotification can cause the view
+ * size to change depending on the autoresizing mask of the view. The
+ * host may need to cache the autoresizing mask of the view, set it to
+ * NSViewNotSizable, resize the window, and then reset the autoresizing
+ * mask of the view once the window has been sized."
+ *
+ */
+
+ [au_view setAutoresizingMask:NSViewNotSizable];
+ [window setFrame:windowFrame display:1];
+ [au_view setAutoresizingMask:old_auto_resize];
+
+ /* keep a copy of the size of the AU NSView. We didn't set it - the plugin did */
+ last_au_frame = new_frame;
+ req_width = new_frame.size.width;
+ req_height = new_frame.size.height;
+
+ plugin_requested_resize = 0;
}
int
@@ -651,6 +1071,20 @@ AUPluginUI::parent_cocoa_window ()
NSView* view = gdk_quartz_window_get_nsview (low_box.get_window()->gobj());
[view addSubview:au_view];
+ /* despite the fact that the documentation says that [NSWindow
+ contentView] is the highest "accessible" NSView in an NSWindow, when
+ the redraw cycle is executed, displayIfNeeded is actually executed
+ on the parent of the contentView. To provide a marginal speedup when
+ checking if a given redraw is for a plugin, use this "hidden" NSView
+ to identify the plugin, so that we do not have to call [superview]
+ every time in interposed_drawIfNeeded().
+ */
+ add_plugin_view ([[win contentView] superview]);
+
+ /* this moves the AU NSView down and over to provide a left-hand margin
+ * and to clear the Ardour "task bar" (with plugin preset mgmt buttons,
+ * keyboard focus control, bypass etc).
+ */
gint xx, yy;
gtk_widget_translate_coordinates(
@@ -667,6 +1101,38 @@ AUPluginUI::parent_cocoa_window ()
selector:@selector(auViewResized:) name:NSViewFrameDidChangeNotification
object:au_view];
+ // catch notifications that live resizing is about to start
+
+#if HAVE_COCOA_LIVE_RESIZING
+ _resize_notify = [ [ LiveResizeNotificationObject alloc] initWithPluginUI:this ];
+
+ [[NSNotificationCenter defaultCenter] addObserver:_resize_notify
+ selector:@selector(windowWillStartLiveResizeHandler:) name:NSWindowWillStartLiveResizeNotification
+ object:win];
+
+ [[NSNotificationCenter defaultCenter] addObserver:_resize_notify
+ selector:@selector(windowWillEndLiveResizeHandler:) name:NSWindowDidEndLiveResizeNotification
+ object:win];
+#else
+ /* No way before 10.6 to identify the start of a live resize (drag
+ * resize) without subclassing NSView and overriding two of its
+ * methods. Instead of that, we make the window non-resizable, thus
+ * ending confusion about whether or not resizes are plugin or user
+ * driven (they are always plugin-driven).
+ */
+
+ Gtk::Container* toplevel = get_toplevel();
+ Requisition req;
+
+ resizable = false;
+
+ if (toplevel && toplevel->is_toplevel()) {
+ toplevel->size_request (req);
+ toplevel->set_size_request (req.width, req.height);
+ dynamic_cast<Gtk::Window*>(toplevel)->set_resizable (false);
+ }
+
+#endif
return 0;
}
@@ -736,49 +1202,8 @@ AUPluginUI::lower_box_visibility_notify (GdkEventVisibility* ev)
}
void
-AUPluginUI::update_view_size ()
-{
- if (!mapped || alo_width == 0 || alo_height == 0) {
- return;
- }
- gint xx, yy;
- gtk_widget_translate_coordinates(
- GTK_WIDGET(low_box.gobj()),
- GTK_WIDGET(low_box.get_parent()->gobj()),
- 8, 6, &xx, &yy);
-
- [[NSNotificationCenter defaultCenter] removeObserver:_notify
- name:NSViewFrameDidChangeNotification
- object:au_view];
-
- if (!resizable) {
- xx += (alo_width - req_width) * .5;
- [au_view setFrame:NSMakeRect(xx, yy, req_width, req_height)];
- } else {
- /* this mitigates issues with plugins that resize themselves
- * depending on visible options (e.g AUSampler)
- * since the OSX y-axis points upwards, the plugin adjusts its
- * own y-offset if the view expands to the bottom to accomodate
- * subviews inside the main view.
- */
- [au_view setAutoresizesSubviews:0];
- [au_view setFrame:NSMakeRect(xx, yy, alo_width, alo_height)];
- [au_view setAutoresizesSubviews:1];
- [au_view setNeedsDisplay:1];
- }
-
- last_au_frame = [au_view frame];
-
- [[NSNotificationCenter defaultCenter]
- addObserver:_notify
- selector:@selector(auViewResized:) name:NSViewFrameDidChangeNotification
- object:au_view];
-}
-
-void
AUPluginUI::lower_box_map ()
{
- mapped = true;
[au_view setHidden:0];
update_view_size ();
}
@@ -786,7 +1211,6 @@ AUPluginUI::lower_box_map ()
void
AUPluginUI::lower_box_unmap ()
{
- mapped = false;
[au_view setHidden:1];
}
@@ -800,28 +1224,9 @@ AUPluginUI::lower_box_size_request (GtkRequisition* requisition)
void
AUPluginUI::lower_box_size_allocate (Gtk::Allocation& allocation)
{
- alo_width = allocation.get_width ();
- alo_height = allocation.get_height ();
update_view_size ();
}
-gboolean
-AUPluginUI::lower_box_expose (GdkEventExpose* event)
-{
-#if 0 // AU view magically redraws by itself
- [au_view drawRect:NSMakeRect(event->area.x,
- event->area.y,
- event->area.width,
- event->area.height)];
-#endif
- /* hack to keep ardour responsive
- * some UIs (e.g Addictive Drums) completely hog the CPU
- */
- ARDOUR::GUIIdle();
-
- return true;
-}
-
void
AUPluginUI::on_window_hide ()
{
@@ -880,4 +1285,14 @@ create_au_gui (boost::shared_ptr<PluginInsert> plugin_insert, VBox** box)
return aup;
}
+void
+AUPluginUI::start_live_resize ()
+{
+ in_live_resize = true;
+}
+void
+AUPluginUI::end_live_resize ()
+{
+ in_live_resize = false;
+}
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index d7fb376..16b4151 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -42,7 +42,7 @@
#include "keyboard.h"
#include "gui_thread.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -924,6 +924,12 @@ AudioClock::session_property_changed (const PropertyChange&)
}
void
+AudioClock::metric_position_changed ()
+{
+ set (last_when, true);
+}
+
+void
AudioClock::session_configuration_changed (std::string p)
{
if (_negative_allowed) {
@@ -1252,12 +1258,12 @@ AudioClock::set_bbt (framepos_t when, bool /*force*/)
BBT.beats = 0;
BBT.ticks = 0;
} else {
- _session->tempo_map().bbt_time (when, BBT);
+ BBT = _session->tempo_map().bbt_at_frame (when);
BBT.bars--;
BBT.beats--;
}
} else {
- _session->tempo_map().bbt_time (when, BBT);
+ BBT = _session->tempo_map().bbt_at_frame (when);
}
if (negative) {
@@ -1281,7 +1287,7 @@ AudioClock::set_bbt (framepos_t when, bool /*force*/)
TempoMetric m (_session->tempo_map().metric_at (pos));
- sprintf (buf, "%-5.1f", m.tempo().beats_per_minute());
+ sprintf (buf, "%-5.3f", _session->tempo_map().tempo_at_frame (pos).beats_per_minute());
_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%3</span> <span foreground=\"green\">%2</span></span>",
INFO_FONT_SIZE, buf, _("Tempo")));
@@ -1300,8 +1306,9 @@ AudioClock::set_session (Session *s)
_session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_configuration_changed, this, _1), gui_context());
_session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_property_changed, this, _1), gui_context());
+ _session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::metric_position_changed, this), gui_context());
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNode* node = _session->extra_xml (X_("ClockModes"));
AudioClock::Mode amode;
@@ -1311,7 +1318,7 @@ AudioClock::set_session (Session *s)
if ((prop = (*i)->property (X_("mode"))) != 0) {
amode = AudioClock::Mode (string_2_enum (prop->value(), amode));
- set_mode (amode);
+ set_mode (amode, true);
}
if ((prop = (*i)->property (X_("on"))) != 0) {
set_off (!string_is_affirmative (prop->value()));
@@ -2112,12 +2119,10 @@ AudioClock::build_ops_menu ()
MenuList& ops_items = ops_menu->items();
ops_menu->set_name ("ArdourContextMenu");
- if (!Profile->get_sae()) {
- ops_items.push_back (MenuElem (_("Timecode"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Timecode)));
- }
- ops_items.push_back (MenuElem (_("Bars:Beats"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), BBT)));
- ops_items.push_back (MenuElem (_("Minutes:Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), MinSec)));
- ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Frames)));
+ ops_items.push_back (MenuElem (_("Timecode"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Timecode, false)));
+ ops_items.push_back (MenuElem (_("Bars:Beats"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), BBT, false)));
+ ops_items.push_back (MenuElem (_("Minutes:Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), MinSec, false)));
+ ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Frames, false)));
if (editable && !_off && !is_duration && !_follows_playhead) {
ops_items.push_back (SeparatorElem());
@@ -2150,7 +2155,7 @@ AudioClock::locate ()
}
void
-AudioClock::set_mode (Mode m)
+AudioClock::set_mode (Mode m, bool noemit)
{
if (_mode == m) {
return;
@@ -2224,11 +2229,11 @@ AudioClock::set_mode (Mode m)
set (last_when, true);
- if (!is_transient) {
- ModeChanged (); /* EMIT SIGNAL (the static one)*/
- }
+ if (!is_transient && !noemit) {
+ ModeChanged (); /* EMIT SIGNAL (the static one)*/
+ }
- mode_changed (); /* EMIT SIGNAL (the member one) */
+ mode_changed (); /* EMIT SIGNAL (the member one) */
}
void
diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h
index 3790fa8..51cac85 100644
--- a/gtk2_ardour/audio_clock.h
+++ b/gtk2_ardour/audio_clock.h
@@ -41,7 +41,7 @@ namespace ARDOUR {
class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
{
- public:
+ public:
enum Mode {
Timecode,
BBT,
@@ -67,9 +67,9 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
void set (framepos_t, bool force = false, ARDOUR::framecnt_t offset = 0);
void set_from_playhead ();
void locate ();
- void set_mode (Mode);
+ void set_mode (Mode, bool noemit = false);
void set_bbt_reference (framepos_t);
- void set_is_duration (bool);
+ void set_is_duration (bool);
void copy_text_to_clipboard () const;
@@ -78,7 +78,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
framepos_t current_time (framepos_t position = 0) const;
framepos_t current_duration (framepos_t position = 0) const;
void set_session (ARDOUR::Session *s);
- void set_negative_allowed (bool yn);
+ void set_negative_allowed (bool yn);
/** Alter cairo scaling during rendering.
*
@@ -97,7 +97,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
static sigc::signal<void> ModeChanged;
static std::vector<AudioClock*> clocks;
- protected:
+ protected:
void render (cairo_t*, cairo_rectangle_t*);
bool get_is_duration () const { return is_duration; } ;
@@ -115,7 +115,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
double get_left_rect_width() const {
return round (((get_width() - separator_height) * mode_based_info_ratio) + 0.5);
}
- private:
+ private:
Mode _mode;
std::string _name;
bool is_transient;
@@ -127,8 +127,8 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
bool _off;
int em_width;
bool _edit_by_click_field;
- bool _negative_allowed;
- bool edit_is_negative;
+ bool _negative_allowed;
+ bool edit_is_negative;
Glib::RefPtr<Pango::Layout> _layout;
Glib::RefPtr<Pango::Layout> _left_layout;
@@ -143,7 +143,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
int first_height;
int first_width;
- bool style_resets_first;
+ bool style_resets_first;
int layout_height;
int layout_width;
int info_height;
@@ -213,7 +213,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
void set_minsec (framepos_t, bool);
void set_frames (framepos_t, bool);
- void set_clock_dimensions (Gtk::Requisition&);
+ void set_clock_dimensions (Gtk::Requisition&);
framepos_t get_frame_step (Field, framepos_t pos = 0, int dir = 1);
@@ -221,7 +221,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
bool bbt_validate_edit (const std::string&);
bool minsec_validate_edit (const std::string&);
- framepos_t frames_from_timecode_string (const std::string&) const;
+ framepos_t frames_from_timecode_string (const std::string&) const;
framepos_t frames_from_bbt_string (framepos_t, const std::string&) const;
framepos_t frame_duration_from_bbt_string (framepos_t, const std::string&) const;
framepos_t frames_from_minsec_string (const std::string&) const;
@@ -229,6 +229,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
void session_configuration_changed (std::string);
void session_property_changed (const PBD::PropertyChange&);
+ void metric_position_changed ();
Field index_to_field () const;
diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc
index 3446f58..15186f2 100644
--- a/gtk2_ardour/audio_region_editor.cc
+++ b/gtk2_ardour/audio_region_editor.cc
@@ -33,7 +33,7 @@
#include "audio_region_view.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -43,7 +43,6 @@ using namespace Gtkmm2ext;
static void *
_peak_amplitude_thread (void* arg)
{
- SessionEvent::create_per_thread_pool ("peak amplitude events", 64);
static_cast<AudioRegionEditor*>(arg)->peak_amplitude_thread ();
return 0;
}
@@ -52,11 +51,7 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
: RegionEditor (s, r)
, _audio_region (r)
, gain_adjustment(accurate_coefficient_to_dB(_audio_region->scale_amplitude()), -40.0, +40.0, 0.1, 1.0, 0)
-#ifdef PLATFORM_WINDOWS
- , m_peak_sem ("peak_semaphore", 0)
-#else
, _peak_channel (false)
-#endif
{
Gtk::HBox* b = Gtk::manage (new Gtk::HBox);
@@ -92,14 +87,17 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
_peak_amplitude.set_text (_("Calculating..."));
PeakAmplitudeFound.connect (_peak_amplitude_connection, invalidator (*this), boost::bind (&AudioRegionEditor::peak_amplitude_found, this, _1), gui_context ());
- pthread_create_and_store (X_("peak-amplitude"), &_peak_amplitude_thread_handle, _peak_amplitude_thread, this);
+
+ char name[64];
+ snprintf (name, 64, "peak amplitude-%p", this);
+ pthread_create_and_store (name, &_peak_amplitude_thread_handle, _peak_amplitude_thread, this);
signal_peak_thread ();
}
AudioRegionEditor::~AudioRegionEditor ()
{
void* v;
- pthread_cancel_one (_peak_amplitude_thread_handle);
+ _peak_channel.deliver ('t');
pthread_join (_peak_amplitude_thread_handle, &v);
}
@@ -138,30 +136,20 @@ AudioRegionEditor::gain_adjustment_changed ()
void
AudioRegionEditor::signal_peak_thread ()
{
-#ifdef PLATFORM_WINDOWS
- m_peak_sem.signal ();
-#else
_peak_channel.deliver ('c');
-#endif
-}
-
-void
-AudioRegionEditor::wait_for_signal ()
-{
-#ifdef PLATFORM_WINDOWS
- m_peak_sem.wait ();
-#else
- char msg;
- _peak_channel.receive (msg);
-#endif
}
void
AudioRegionEditor::peak_amplitude_thread ()
{
while (1) {
+ char msg;
/* await instructions to run */
- wait_for_signal ();
+ _peak_channel.receive (msg);
+
+ if (msg == 't') {
+ break;
+ }
/* compute peak amplitude and signal the fact */
PeakAmplitudeFound (accurate_coefficient_to_dB (_audio_region->maximum_amplitude ())); /* EMIT SIGNAL */
diff --git a/gtk2_ardour/audio_region_editor.h b/gtk2_ardour/audio_region_editor.h
index dd726bd..083a39d 100644
--- a/gtk2_ardour/audio_region_editor.h
+++ b/gtk2_ardour/audio_region_editor.h
@@ -36,11 +36,7 @@
#include "pbd/signals.h"
-#ifdef PLATFORM_WINDOWS
-#include "pbd/semutils.h"
-#else
#include "pbd/crossthread.h"
-#endif
#include "audio_clock.h"
#include "ardour_dialog.h"
@@ -78,16 +74,11 @@ class AudioRegionEditor : public RegionEditor
Gtk::Entry _peak_amplitude;
void signal_peak_thread ();
- void wait_for_signal ();
pthread_t _peak_amplitude_thread_handle;
void peak_amplitude_found (double);
PBD::Signal1<void, double> PeakAmplitudeFound;
PBD::ScopedConnection _peak_amplitude_connection;
-#ifdef PLATFORM_WINDOWS
- PBD::Semaphore m_peak_sem;
-#else
CrossThreadChannel _peak_channel;
-#endif
};
#endif /* __gtk_ardour_audio_region_edit_h__ */
diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc
index 148f99f..a70dcaa 100644
--- a/gtk2_ardour/audio_region_view.cc
+++ b/gtk2_ardour/audio_region_view.cc
@@ -62,7 +62,7 @@
#include "gui_thread.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#define MUTED_ALPHA 48
@@ -232,25 +232,23 @@ AudioRegionView::init (bool wfd)
const string line_name = _region->name() + ":gain";
- if (!Profile->get_sae()) {
- gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope()));
- }
+ gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope()));
update_envelope_visibility ();
gain_line->reset ();
- set_height (trackview.current_height()); // XXX not correct for Layered mode, but set_height() will fix later.
+ /* streamview will call set_height() */
+ //set_height (trackview.current_height()); // XXX not correct for Layered mode, but set_height() will fix later.
region_muted ();
region_sync_changed ();
region_resized (ARDOUR::bounds_change);
+ /* region_resized sets ghost region duration */
- for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
- (*i)->set_duration (_region->length() / samples_per_pixel);
- }
+ /* region_locked is a synonym for region_renamed () which is called in region_muted() above */
+ //region_locked ();
- region_locked ();
envelope_active_changed ();
fade_in_active_changed ();
fade_out_active_changed ();
@@ -277,15 +275,14 @@ AudioRegionView::init (bool wfd)
setup_waveform_visibility ();
- pending_peak_data->raise_to_top ();
-
+ /* reset_width_dependent_items() does this:
if (frame_handle_start) {
frame_handle_start->raise_to_top ();
}
if (frame_handle_end) {
frame_handle_end->raise_to_top ();
}
-
+ */
/* XXX sync mark drag? */
}
@@ -434,12 +431,13 @@ AudioRegionView::region_resized (const PropertyChange& what_changed)
}
}
- /* hide transient lines that extend beyond the region end */
-
+ /* hide transient lines that extend beyond the region */
list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
+ framepos_t first = _region->first_frame();
+ framepos_t last = _region->last_frame();
for (l = feature_lines.begin(); l != feature_lines.end(); ++l) {
- if (l->first > _region->length() - 1) {
+ if (l->first < first || l->first >= last) {
l->second->hide();
} else {
l->second->show();
@@ -451,6 +449,10 @@ AudioRegionView::region_resized (const PropertyChange& what_changed)
void
AudioRegionView::reset_width_dependent_items (double pixel_width)
{
+ if (pixel_width == _width) {
+ return;
+ }
+
RegionView::reset_width_dependent_items(pixel_width);
assert(_pixel_width == pixel_width);
@@ -465,25 +467,34 @@ AudioRegionView::reset_width_dependent_items (double pixel_width)
if (end_xfade_rect) { end_xfade_rect->set_outline (false); }
}
- AnalysisFeatureList analysis_features = _region->transients();
- AnalysisFeatureList::const_iterator i;
-
- list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
+ reset_fade_shapes ();
- for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) {
+ /* Update feature lines */
+ AnalysisFeatureList analysis_features;
+ _region->transients (analysis_features);
- float x_pos = trackview.editor().sample_to_pixel (*i);
+ if (feature_lines.size () != analysis_features.size ()) {
+ cerr << "postponed freature line update.\n"; // XXX
+ // AudioRegionView::transients_changed () will pick up on this
+ return;
+ }
- (*l).second->set (ArdourCanvas::Duple (x_pos, 2.0),
- ArdourCanvas::Duple (x_pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
+ framepos_t position = _region->position();
+ AnalysisFeatureList::const_iterator i;
+ list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
+ double y1;
+ if (_height >= NAME_HIGHLIGHT_THRESH) {
+ y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1;
+ } else {
+ y1 = _height - 1;
+ }
+ for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) {
+ float x_pos = trackview.editor().sample_to_pixel ((*i) - position);
(*l).first = *i;
-
(*l).second->set (ArdourCanvas::Duple (x_pos, 2.0),
- ArdourCanvas::Duple (x_pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
+ ArdourCanvas::Duple (x_pos, y1));
}
-
- reset_fade_shapes ();
}
void
@@ -523,6 +534,10 @@ AudioRegionView::setup_fade_handle_positions()
void
AudioRegionView::set_height (gdouble height)
{
+ if (height == _height) {
+ return;
+ }
+
RegionView::set_height (height);
pending_peak_data->set_y1 (height);
@@ -560,20 +575,19 @@ AudioRegionView::set_height (gdouble height)
reset_fade_shapes ();
- /* Update hights for any active feature lines */
+ /* Update heights for any feature lines */
+ framepos_t position = _region->position();
list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
-
+ double y1;
+ if (_height >= NAME_HIGHLIGHT_THRESH) {
+ y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1;
+ } else {
+ y1 = _height - 1;
+ }
for (l = feature_lines.begin(); l != feature_lines.end(); ++l) {
-
- float pos_x = trackview.editor().sample_to_pixel((*l).first);
-
- if (height >= NAME_HIGHLIGHT_THRESH) {
- (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0),
- ArdourCanvas::Duple (pos_x, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
- } else {
- (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0),
- ArdourCanvas::Duple (pos_x, _height - 1));
- }
+ float pos_x = trackview.editor().sample_to_pixel((*l).first - position);
+ (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0),
+ ArdourCanvas::Duple (pos_x, y1));
}
if (name_text) {
@@ -1395,7 +1409,10 @@ GhostRegion*
AudioRegionView::add_ghost (TimeAxisView& tv)
{
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&trackview);
- assert(rtv);
+
+ if (!rtv) {
+ return 0;
+ }
double unit_position = _region->position () / samples_per_pixel;
AudioGhostRegion* ghost = new AudioGhostRegion (*this, tv, trackview, unit_position);
@@ -1606,6 +1623,11 @@ AudioRegionView::set_fade_visibility (bool yn)
void
AudioRegionView::update_coverage_frames (LayerDisplay d)
{
+ if (d != Stacked) {
+ /* don't do coverage frames unless we're in stacked mode */
+ return;
+ }
+
RegionView::update_coverage_frames (d);
if (fade_in_handle) { fade_in_handle->raise_to_top (); }
@@ -1628,15 +1650,26 @@ AudioRegionView::show_region_editor ()
void
AudioRegionView::transients_changed ()
{
- AnalysisFeatureList analysis_features = _region->transients();
+ AnalysisFeatureList analysis_features;
+ _region->transients (analysis_features);
+ framepos_t position = _region->position();
+ framepos_t first = _region->first_frame();
+ framepos_t last = _region->last_frame();
- while (feature_lines.size() < analysis_features.size()) {
+ double y1;
+ if (_height >= NAME_HIGHLIGHT_THRESH) {
+ y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1;
+ } else {
+ y1 = _height - 1;
+ }
+ while (feature_lines.size() < analysis_features.size()) {
ArdourCanvas::Line* canvas_item = new ArdourCanvas::Line(group);
CANVAS_DEBUG_NAME (canvas_item, string_compose ("transient group for %1", region()->name()));
+ canvas_item->set_outline_color (UIConfiguration::instance().color ("zero line")); // also in Editor::leave_handler()
canvas_item->set (ArdourCanvas::Duple (-1.0, 2.0),
- ArdourCanvas::Duple (1.0, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
+ ArdourCanvas::Duple (1.0, y1));
canvas_item->raise_to_top ();
canvas_item->show ();
@@ -1659,15 +1692,21 @@ AudioRegionView::transients_changed ()
for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) {
float *pos = new float;
- *pos = trackview.editor().sample_to_pixel (*i);
+ *pos = trackview.editor().sample_to_pixel (*i - position);
(*l).second->set (
ArdourCanvas::Duple (*pos, 2.0),
- ArdourCanvas::Duple (*pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)
+ ArdourCanvas::Duple (*pos, y1)
);
- (*l).second->set_data ("position", pos);
+ (*l).second->set_data ("position", pos); // is this *modified* (drag?), if not use *i
(*l).first = *i;
+
+ if (l->first < first || l->first >= last) {
+ l->second->hide();
+ } else {
+ l->second->show();
+ }
}
}
@@ -1684,28 +1723,27 @@ AudioRegionView::update_transient(float /*old_pos*/, float new_pos)
float* pos = (float*) (*l).second->get_data ("position");
if (rint(new_pos) == rint(*pos)) {
-
+ framepos_t position = _region->position();
framepos_t old_frame = (*l).first;
- framepos_t new_frame = trackview.editor().pixel_to_sample (new_pos);
-
+ framepos_t new_frame = trackview.editor().pixel_to_sample (new_pos) + position;
_region->update_transient (old_frame, new_frame);
-
break;
}
}
}
void
-AudioRegionView::remove_transient(float pos)
+AudioRegionView::remove_transient (float pos)
{
- /* Find frame at old pos, calulate new frame then update region transients*/
+ /* this is called from Editor::remove_transient () with pos == get_data ("position")
+ * which is the item's x-coordinate inside the ARV.
+ *
+ * Find frame at old pos, calulate new frame then update region transients
+ */
list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
for (l = feature_lines.begin(); l != feature_lines.end(); ++l) {
-
- /* Line has been updated in drag so we compare to new_pos */
float *line_pos = (float*) (*l).second->get_data ("position");
-
if (rint(pos) == rint(*line_pos)) {
_region->remove_transient ((*l).first);
break;
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc
index d078de7..c7adcfc 100644
--- a/gtk2_ardour/audio_streamview.cc
+++ b/gtk2_ardour/audio_streamview.cc
@@ -29,6 +29,7 @@
#include "ardour/audioregion.h"
#include "ardour/audiofilesource.h"
#include "ardour/audio_track.h"
+#include "ardour/record_enable_control.h"
#include "ardour/region_factory.h"
#include "ardour/profile.h"
#include "ardour/rc_configuration.h"
@@ -48,7 +49,7 @@
#include "gui_thread.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -186,7 +187,7 @@ AudioStreamView::setup_rec_box ()
if (!rec_active &&
_trackview.session()->record_status() == Session::Recording &&
- _trackview.track()->record_enabled()) {
+ _trackview.track()->rec_enable_control()->get_value()) {
if (_trackview.audio_track()->mode() == Normal && UIConfiguration::instance().get_show_waveforms_while_recording() && rec_regions.size() == rec_rects.size()) {
/* add a new region, but don't bother if they set show-waveforms-while-recording mid-record */
@@ -240,7 +241,7 @@ AudioStreamView::setup_rec_box ()
} else if (rec_active &&
(_trackview.session()->record_status() != Session::Recording ||
- !_trackview.track()->record_enabled())) {
+ !_trackview.track()->rec_enable_control()->get_value())) {
screen_update_connection.disconnect();
rec_active = false;
rec_updating = false;
@@ -352,8 +353,9 @@ AudioStreamView::update_rec_regions (framepos_t start, framecnt_t cnt)
if (nlen != region->length()) {
region->suspend_property_changes ();
+ /* set non-musical position / length */
region->set_position (_trackview.track()->get_capture_start_frame(n));
- region->set_length (nlen);
+ region->set_length (nlen, 0);
region->resume_property_changes ();
if (origlen == 1) {
@@ -380,7 +382,7 @@ AudioStreamView::update_rec_regions (framepos_t start, framecnt_t cnt)
region->suspend_property_changes ();
region->set_position (_trackview.track()->get_capture_start_frame(n));
- region->set_length (nlen);
+ region->set_length (nlen, 0);
region->resume_property_changes ();
if (origlen == 1) {
@@ -465,11 +467,7 @@ AudioStreamView::color_handler ()
//case cAudioBusBase:
if (!_trackview.is_track()) {
- if (Profile->get_sae() && _trackview.route()->is_master()) {
- canvas_rect->set_fill_color (UIConfiguration::instance().color ("audio master bus base"));
- } else {
- canvas_rect->set_fill_color (UIConfiguration::instance().color_mod ("audio bus base", "audio bus base"));
- }
+ canvas_rect->set_fill_color (UIConfiguration::instance().color_mod ("audio bus base", "audio bus base"));
}
}
diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc
index f59c4bc..4459afa 100644
--- a/gtk2_ardour/audio_time_axis.cc
+++ b/gtk2_ardour/audio_time_axis.cc
@@ -55,7 +55,7 @@
#include "audio_streamview.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -65,7 +65,7 @@ using namespace Gtk;
using namespace Editing;
AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas)
- : AxisView(sess)
+ : SessionHandlePtr (sess)
, RouteTimeAxisView(ed, sess, canvas)
{
}
@@ -307,7 +307,7 @@ AudioTimeAxisView::update_control_names ()
}
}
- if (get_selected()) {
+ if (selected()) {
controls_ebox.set_name (controls_base_selected_name);
time_axis_frame.set_name (controls_base_selected_name);
} else {
diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc
index 3ae1b21..03054fa 100644
--- a/gtk2_ardour/automation_controller.cc
+++ b/gtk2_ardour/automation_controller.cc
@@ -30,12 +30,13 @@
#include "ardour/tempo.h"
#include "ardour_button.h"
+#include "ardour_knob.h"
#include "automation_controller.h"
#include "gui_thread.h"
#include "note_select_dialog.h"
#include "timers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace Gtk;
@@ -65,7 +66,8 @@ AutomationBarController::~AutomationBarController()
AutomationController::AutomationController(boost::shared_ptr<Automatable> printer,
boost::shared_ptr<AutomationControl> ac,
- Adjustment* adj)
+ Adjustment* adj,
+ bool use_knob)
: _widget(NULL)
, _printer (printer)
, _controllable(ac)
@@ -88,7 +90,16 @@ AutomationController::AutomationController(boost::shared_ptr<Automatable>
but->set_controllable(ac);
but->signal_clicked.connect(
sigc::mem_fun(*this, &AutomationController::toggled));
+ const bool active = _adjustment->get_value() >= 0.5;
+ if (but->get_active() != active) {
+ but->set_active(active);
+ }
_widget = but;
+ } else if (use_knob) {
+ ArdourKnob* knob = manage (new ArdourKnob (ArdourKnob::default_elements, ArdourKnob::Detent));
+ knob->set_controllable (ac);
+ knob->set_name("processor control knob");
+ _widget = knob;
} else {
AutomationBarController* bar = manage(new AutomationBarController(_printer, ac, adj));
@@ -123,7 +134,8 @@ boost::shared_ptr<AutomationController>
AutomationController::create(boost::shared_ptr<Automatable> printer,
const Evoral::Parameter& param,
const ParameterDescriptor& desc,
- boost::shared_ptr<AutomationControl> ac)
+ boost::shared_ptr<AutomationControl> ac,
+ bool use_knob)
{
const double lo = ac->internal_to_interface(desc.lower);
const double up = ac->internal_to_interface(desc.upper);
@@ -136,7 +148,7 @@ AutomationController::create(boost::shared_ptr<Automatable> printer,
assert (ac);
assert(ac->parameter() == param);
- return boost::shared_ptr<AutomationController>(new AutomationController(printer, ac, adjustment));
+ return boost::shared_ptr<AutomationController>(new AutomationController(printer, ac, adjustment, use_knob));
}
void
@@ -173,7 +185,6 @@ void
AutomationController::start_touch()
{
_controllable->start_touch (_controllable->session().transport_frame());
- StartGesture.emit(); /* EMIT SIGNAL */
}
void
@@ -190,8 +201,9 @@ AutomationController::end_touch ()
}
_controllable->stop_touch (mark, when);
+ } else {
+ _controllable->stop_touch (false, _controllable->session().transport_frame());
}
- StopGesture.emit(); /* EMIT SIGNAL */
}
void
@@ -261,7 +273,7 @@ AutomationController::set_freq_beats(double beats)
const ARDOUR::ParameterDescriptor& desc = _controllable->desc();
const ARDOUR::Session& session = _controllable->session();
const framepos_t pos = session.transport_frame();
- const ARDOUR::Tempo& tempo = session.tempo_map().tempo_at(pos);
+ const ARDOUR::Tempo& tempo = session.tempo_map().tempo_at_frame (pos);
const double bpm = tempo.beats_per_minute();
const double bps = bpm / 60.0;
const double freq = bps / beats;
diff --git a/gtk2_ardour/automation_controller.h b/gtk2_ardour/automation_controller.h
index c5d64c1..4d58260 100644
--- a/gtk2_ardour/automation_controller.h
+++ b/gtk2_ardour/automation_controller.h
@@ -61,7 +61,8 @@ public:
boost::shared_ptr<ARDOUR::Automatable> parent,
const Evoral::Parameter& param,
const ARDOUR::ParameterDescriptor& desc,
- boost::shared_ptr<ARDOUR::AutomationControl> ac);
+ boost::shared_ptr<ARDOUR::AutomationControl> ac,
+ bool use_knob = false);
~AutomationController();
@@ -77,13 +78,11 @@ public:
void stop_updating ();
- sigc::signal<void> StartGesture;
- sigc::signal<void> StopGesture;
-
private:
AutomationController (boost::shared_ptr<ARDOUR::Automatable> printer,
boost::shared_ptr<ARDOUR::AutomationControl> ac,
- Gtk::Adjustment* adj);
+ Gtk::Adjustment* adj,
+ bool use_knob);
void start_touch();
void end_touch();
diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc
index 2094d43..a422bf9 100644
--- a/gtk2_ardour/automation_line.cc
+++ b/gtk2_ardour/automation_line.cc
@@ -63,7 +63,7 @@
#include "ardour/session.h"
#include "ardour/value_as_string.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -86,6 +86,7 @@ AutomationLine::AutomationLine (const string& name,
, _parent_group (parent)
, _offset (0)
, _maximum_time (max_framepos)
+ , _fill (false)
, _desc (desc)
{
if (converter) {
@@ -171,7 +172,7 @@ AutomationLine::update_visibility ()
}
} else if (_visible & SelectedControlPoints) {
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
- if ((*i)->get_selected()) {
+ if ((*i)->selected()) {
(*i)->show ();
} else {
(*i)->hide ();
@@ -229,6 +230,11 @@ AutomationLine::set_height (guint32 h)
(*i)->set_size (bsz);
}
+ if (_fill) {
+ line->set_fill_y1 (_height);
+ } else {
+ line->set_fill_y1 (0);
+ }
reset ();
}
}
@@ -238,6 +244,7 @@ AutomationLine::set_line_color (uint32_t color)
{
_line_color = color;
line->set_outline_color (color);
+ line->set_fill_color ((color & 0xffff00) + 80); // XXX TODO configurable transparency
}
void
@@ -470,9 +477,9 @@ AutomationLine::start_drag_single (ControlPoint* cp, double x, float fraction)
_drag_points.clear ();
_drag_points.push_back (cp);
- if (cp->get_selected ()) {
+ if (cp->selected ()) {
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
- if (*i != cp && (*i)->get_selected()) {
+ if (*i != cp && (*i)->selected()) {
_drag_points.push_back (*i);
}
}
@@ -546,8 +553,8 @@ AutomationLine::ContiguousControlPoints::compute_x_bounds (PublicEditor& e)
before_x = line.nth (front()->view_index() - 1)->get_x();
const framepos_t pos = e.pixel_to_sample(before_x);
- const Meter& meter = map.meter_at (pos);
- const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at (pos), e.session()->frame_rate())
+ const Meter& meter = map.meter_at_frame (pos);
+ const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at_frame (pos), e.session()->frame_rate())
/ (Timecode::BBT_Time::ticks_per_beat * meter.divisions_per_bar()) );
const double one_tick_in_pixels = e.sample_to_pixel_unrounded (len);
@@ -562,8 +569,8 @@ AutomationLine::ContiguousControlPoints::compute_x_bounds (PublicEditor& e)
after_x = line.nth (back()->view_index() + 1)->get_x();
const framepos_t pos = e.pixel_to_sample(after_x);
- const Meter& meter = map.meter_at (pos);
- const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at (pos), e.session()->frame_rate())
+ const Meter& meter = map.meter_at_frame (pos);
+ const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at_frame (pos), e.session()->frame_rate())
/ (Timecode::BBT_Time::ticks_per_beat * meter.divisions_per_bar()));
const double one_tick_in_pixels = e.sample_to_pixel_unrounded (len);
diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h
index 816cefe..d51e437 100644
--- a/gtk2_ardour/automation_line.h
+++ b/gtk2_ardour/automation_line.h
@@ -73,6 +73,7 @@ public:
void queue_reset ();
void reset ();
void clear ();
+ void set_fill (bool f) { _fill = f; } // owner needs to call set_height
void set_selected_points (PointSelection const &);
void get_selectables (ARDOUR::framepos_t, ARDOUR::framepos_t, double, double, std::list<Selectable*>&);
@@ -236,6 +237,8 @@ private:
/** maximum time that a point on this line can be at, relative to the position of its region or start of its track */
ARDOUR::framecnt_t _maximum_time;
+ bool _fill;
+
const ARDOUR::ParameterDescriptor _desc;
friend class AudioRegionGainLine;
diff --git a/gtk2_ardour/automation_region_view.cc b/gtk2_ardour/automation_region_view.cc
index f1f9d68..963fe63 100644
--- a/gtk2_ardour/automation_region_view.cc
+++ b/gtk2_ardour/automation_region_view.cc
@@ -38,7 +38,7 @@
#include "public_editor.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
AutomationRegionView::AutomationRegionView (ArdourCanvas::Container* parent,
AutomationTimeAxisView& time_axis,
diff --git a/gtk2_ardour/automation_streamview.cc b/gtk2_ardour/automation_streamview.cc
index be72459..8cb19c2 100644
--- a/gtk2_ardour/automation_streamview.cc
+++ b/gtk2_ardour/automation_streamview.cc
@@ -41,7 +41,7 @@
#include "selection.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc
index cb2a3b4..e2b74da 100644
--- a/gtk2_ardour/automation_time_axis.cc
+++ b/gtk2_ardour/automation_time_axis.cc
@@ -52,7 +52,7 @@
#include "item_counts.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -84,7 +84,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (
const string & nom,
const string & nomparent
)
- : AxisView (s)
+ : SessionHandlePtr (s)
, TimeAxisView (s, e, &parent, canvas)
, _route (r)
, _control (c)
@@ -173,7 +173,9 @@ AutomationTimeAxisView::AutomationTimeAxisView (
//name label isn't editable on an automation track; remove the tooltip
set_tooltip (name_label, X_(""));
- /* repack the name label */
+ /* repack the name label, which TimeAxisView has already attached to
+ * the controls_table
+ */
if (name_label.get_parent()) {
name_label.get_parent()->remove (name_label);
@@ -186,7 +188,6 @@ AutomationTimeAxisView::AutomationTimeAxisView (
/* add the buttons */
controls_table.set_border_width (1);
- controls_table.remove (name_hbox);
controls_table.attach (hide_button, 1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
controls_table.attach (name_label, 2, 3, 1, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 2, 0);
controls_table.attach (auto_button, 3, 4, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
@@ -199,12 +200,12 @@ AutomationTimeAxisView::AutomationTimeAxisView (
// subscribe to route_active_changed, ...
if (rtv && rtv->is_audio_track()) {
blank0->set_name ("AudioTrackControlsBaseUnselected");
- }
- else if (rtv && rtv->is_midi_track()) {
+ } else if (rtv && rtv->is_midi_track()) {
blank0->set_name ("MidiTrackControlsBaseUnselected");
- }
- else {
+ } else if (rtv) {
blank0->set_name ("AudioBusControlsBaseUnselected");
+ } else {
+ blank0->set_name ("UnknownControlsBaseUnselected");
}
blank0->set_size_request (-1, -1);
blank1->set_size_request (1, 0);
@@ -269,6 +270,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (
);
line->set_line_color (UIConfiguration::instance().color ("processor automation line"));
+ line->set_fill (true);
line->queue_reset ();
add_line (line);
}
@@ -656,7 +658,7 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t when,
}
bool
-AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx)
+AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
{
if (_line) {
return paste_one (pos, ctx.count, ctx.times, selection, ctx.counts, ctx.greedy);
@@ -873,7 +875,7 @@ AutomationTimeAxisView::what_has_visible_automation (const boost::shared_ptr<Aut
const XMLNode* gui_node = ac->extra_xml ("GUI");
if (gui_node) {
- const XMLProperty* prop = gui_node->property ("shown");
+ XMLProperty const * prop = gui_node->property ("shown");
if (prop) {
if (string_is_affirmative (prop->value())) {
visible.insert (i->first);
@@ -1037,3 +1039,21 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
}
}
}
+
+PresentationInfo const &
+AutomationTimeAxisView::presentation_info () const
+{
+ return _route->presentation_info();
+}
+
+boost::shared_ptr<Stripable>
+AutomationTimeAxisView::stripable () const
+{
+ return _route;
+}
+
+Gdk::Color
+AutomationTimeAxisView::color () const
+{
+ return gdk_color_from_rgb (_route->presentation_info().color());
+}
diff --git a/gtk2_ardour/automation_time_axis.h b/gtk2_ardour/automation_time_axis.h
index aef1300..7852e21 100644
--- a/gtk2_ardour/automation_time_axis.h
+++ b/gtk2_ardour/automation_time_axis.h
@@ -72,6 +72,10 @@ class AutomationTimeAxisView : public TimeAxisView {
virtual void set_height (uint32_t, TrackHeightMode m = OnlySelf);
void set_samples_per_pixel (double);
std::string name() const { return _name; }
+ Gdk::Color color () const;
+
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+ ARDOUR::PresentationInfo const & presentation_info () const;
void add_automation_event (GdkEvent *, framepos_t, double, bool with_guard_points);
@@ -93,7 +97,7 @@ class AutomationTimeAxisView : public TimeAxisView {
/* editing operations */
void cut_copy_clear (Selection&, Editing::CutCopyOp);
- bool paste (ARDOUR::framepos_t, const Selection&, PasteContext&);
+ bool paste (ARDOUR::framepos_t, const Selection&, PasteContext&, const int32_t sub_num);
int set_state (const XMLNode&, int version);
diff --git a/gtk2_ardour/axis_view.cc b/gtk2_ardour/axis_view.cc
index de4202d..016e579 100644
--- a/gtk2_ardour/axis_view.cc
+++ b/gtk2_ardour/axis_view.cc
@@ -37,7 +37,7 @@
#include "gui_object.h"
#include "axis_view.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -47,10 +47,8 @@ using namespace ARDOUR_UI_UTILS;
list<Gdk::Color> AxisView::used_colors;
-AxisView::AxisView (ARDOUR::Session* sess)
- : SessionHandlePtr (sess)
+AxisView::AxisView ()
{
- _selected = false;
}
AxisView::~AxisView()
@@ -99,3 +97,19 @@ AxisView::gui_object_state()
{
return *ARDOUR_UI::instance()->gui_object_state;
}
+
+void
+AxisView::set_selected (bool yn)
+{
+ if (selected() == yn) {
+ return;
+ }
+
+ Selectable::set_selected (yn);
+
+ boost::shared_ptr<Stripable> s = stripable ();
+
+ if (s) {
+ s->presentation_info().set_selected (yn);
+ }
+}
diff --git a/gtk2_ardour/axis_view.h b/gtk2_ardour/axis_view.h
index b47ca98..2a7c378 100644
--- a/gtk2_ardour/axis_view.h
+++ b/gtk2_ardour/axis_view.h
@@ -37,26 +37,26 @@
namespace ARDOUR {
class Session;
+ class Stripable;
+ class PresentationInfo;
}
/**
- * AxisView defines the abstract base class for time-axis trackviews and routes.
+ * AxisView defines the abstract base class for horizontal and vertical
+ * presentations of Stripables.
*
*/
-class AxisView : public virtual Selectable, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+class AxisView : public virtual PBD::ScopedConnectionList, public virtual ARDOUR::SessionHandlePtr, public virtual Selectable
{
public:
- /** @return the track's own color */
- Gdk::Color color () const { return _color; }
-
ARDOUR::Session* session() const { return _session; }
virtual std::string name() const = 0;
+ virtual Gdk::Color color() const = 0;
sigc::signal<void> Hiding;
- void set_old_order_key (uint32_t ok) { _old_order_key = ok; }
- uint32_t old_order_key() const { return _old_order_key; }
+ virtual boost::shared_ptr<ARDOUR::Stripable> stripable() const = 0;
virtual std::string state_id() const = 0;
/* for now, we always return properties in string form.
@@ -77,17 +77,14 @@ class AxisView : public virtual Selectable, public PBD::ScopedConnectionList, pu
property_hashtable.clear ();
}
- bool marked_for_display () const;
+ void set_selected (bool yn);
+
+ virtual bool marked_for_display () const;
virtual bool set_marked_for_display (bool);
static GUIObjectState& gui_object_state();
void clear_property_cache() { property_hashtable.clear(); }
- protected:
-
- AxisView (ARDOUR::Session* sess);
- virtual ~AxisView();
-
/**
* Generate a new random TrackView color, unique from those colors already used.
*
@@ -95,15 +92,15 @@ class AxisView : public virtual Selectable, public PBD::ScopedConnectionList, pu
*/
static Gdk::Color unique_random_color();
- Gdk::Color _color;
+ protected:
+ AxisView ();
+ virtual ~AxisView();
static std::list<Gdk::Color> used_colors;
Gtk::Label name_label;
mutable boost::unordered_map<std::string, std::string> property_hashtable;
- uint32_t _old_order_key;
}; /* class AxisView */
#endif /* __ardour_gtk_axis_view_h__ */
-
diff --git a/gtk2_ardour/big_clock_window.cc b/gtk2_ardour/big_clock_window.cc
index e442c54..3d85e46 100644
--- a/gtk2_ardour/big_clock_window.cc
+++ b/gtk2_ardour/big_clock_window.cc
@@ -27,7 +27,7 @@
#include "public_editor.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using std::min;
using std::string;
@@ -55,8 +55,7 @@ void
BigClockWindow::on_unmap ()
{
ArdourWindow::on_unmap ();
-
- PublicEditor::instance().reset_focus ();
+ PublicEditor::instance().reset_focus (&clock);
}
bool
diff --git a/gtk2_ardour/bundle_env_cocoa.cc b/gtk2_ardour/bundle_env_cocoa.cc
index df951b8..d630574 100644
--- a/gtk2_ardour/bundle_env_cocoa.cc
+++ b/gtk2_ardour/bundle_env_cocoa.cc
@@ -38,8 +38,9 @@
#include "bundle_env.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
+#include <asl.h>
#include <Carbon/Carbon.h>
#include <mach-o/dyld.h>
#include <sys/param.h>
@@ -50,8 +51,35 @@ using namespace std;
extern void set_language_preference (); // cocoacarbon.mm
+static void
+setup_logging(void)
+{
+ /* The ASL API has evolved since it was introduced in 10.4. If ASL_LOG_DESCRIPTOR_WRITE is not available,
+ then we're not interested in doing any of this, since its only purpose is to get stderr/stdout to
+ appear in the Console.
+ */
+#ifdef ASL_LOG_DESCRIPTOR_WRITE
+ aslmsg msg;
+ aslclient c = asl_open (PROGRAM_NAME, "com.apple.console", 0);
+
+ msg = asl_new(ASL_TYPE_MSG);
+ asl_set(msg, ASL_KEY_FACILITY, "com.apple.console");
+ asl_set(msg, ASL_KEY_LEVEL, ASL_STRING_NOTICE);
+ asl_set(msg, ASL_KEY_READ_UID, "-1");
+
+ int fd = dup(2);
+ //asl_set_filter(c, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG));
+ asl_add_log_file(c, fd);
+ asl_log(c, NULL, ASL_LEVEL_INFO, string_compose ("Hello world from %1", PROGRAM_NAME).c_str());
+ asl_log_descriptor(c, msg, ASL_LEVEL_INFO, 1, ASL_LOG_DESCRIPTOR_WRITE);
+ asl_log_descriptor(c, msg, ASL_LEVEL_INFO, 2, ASL_LOG_DESCRIPTOR_WRITE);
+#else
+#warning This build host has an older ASL API, so no console logging in this build.
+#endif
+}
+
void
-fixup_bundle_environment (int, char* [], string & localedir)
+fixup_bundle_environment (int argc, char* argv[], string & localedir)
{
if (!g_getenv ("ARDOUR_BUNDLED")) {
return;
@@ -61,6 +89,8 @@ fixup_bundle_environment (int, char* [], string & localedir)
set_language_preference ();
+ setup_logging ();
+
char execpath[MAXPATHLEN+1];
uint32_t pathsz = sizeof (execpath);
diff --git a/gtk2_ardour/bundle_env_linux.cc b/gtk2_ardour/bundle_env_linux.cc
index 2586ad5..8083096 100644
--- a/gtk2_ardour/bundle_env_linux.cc
+++ b/gtk2_ardour/bundle_env_linux.cc
@@ -36,9 +36,10 @@
#include "pbd/pathexpand.h"
#include "pbd/file_utils.h"
+#include "ardour_http.h"
#include "bundle_env.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
@@ -110,11 +111,12 @@ fixup_bundle_environment (int /*argc*/, char* argv[], string & localedir)
error << _("No fontconfig file found on your system. Things may looked very odd or ugly") << endmsg;
}
- /* this doesn't do much but setting it should prevent various parts of the GTK/GNU stack
- from looking outside the bundle to find the charset.alias file.
- */
- g_setenv ("CHARSETALIASDIR", dir_path.c_str(), 1);
+ /* this doesn't do much but setting it should prevent various parts of the GTK/GNU stack
+ from looking outside the bundle to find the charset.alias file.
+ */
+ g_setenv ("CHARSETALIASDIR", dir_path.c_str(), 1);
+ ArdourCurl::HttpGet::setup_certificate_paths ();
}
void
diff --git a/gtk2_ardour/bundle_env_mingw.cc b/gtk2_ardour/bundle_env_mingw.cc
index c2547be..6ee1e0f 100644
--- a/gtk2_ardour/bundle_env_mingw.cc
+++ b/gtk2_ardour/bundle_env_mingw.cc
@@ -20,7 +20,7 @@
#include <stdlib.h>
#include <string>
#include "bundle_env.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <glibmm.h>
#include <fontconfig/fontconfig.h>
diff --git a/gtk2_ardour/bundle_env_msvc.cc b/gtk2_ardour/bundle_env_msvc.cc
index 864f9d8..9932a19 100644
--- a/gtk2_ardour/bundle_env_msvc.cc
+++ b/gtk2_ardour/bundle_env_msvc.cc
@@ -18,7 +18,7 @@
*/
#include "bundle_env.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <shlobj.h>
#include <stdlib.h>
@@ -386,21 +386,6 @@ fixup_bundle_environment (int argc, char* argv[], string & localedir)
Glib::setenv ("ARDOUR_CONFIG_PATH", path, true);
- // Next, set up 'ARDOUR_PATH'
- path = user_config_directory();
- path = Glib::path_get_dirname (path);
- path += G_SEARCHPATH_SEPARATOR;
- path += windows_search_path().to_string();
- path += "\\icons;";
- path += windows_search_path().to_string();
- path += "\\pixmaps;";
- path += ardour_data_search_path().to_string(); // In fact, adds both the 'data' search
- path += G_SEARCHPATH_SEPARATOR; // path and our 'config' search path
- path += dir_path;
- path += "\\etc";
- Glib::setenv ("ARDOUR_PATH", path, true);
-
-
// Next, set up 'ARDOUR_INSTANT_XML_PATH'
path = user_config_directory();
Glib::setenv ("ARDOUR_INSTANT_XML_PATH", path, true);
diff --git a/gtk2_ardour/bundle_manager.cc b/gtk2_ardour/bundle_manager.cc
index 8302e6d..234a603 100644
--- a/gtk2_ardour/bundle_manager.cc
+++ b/gtk2_ardour/bundle_manager.cc
@@ -29,7 +29,7 @@
#include "ardour/user_bundle.h"
#include "bundle_manager.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "utils.h"
using namespace std;
diff --git a/gtk2_ardour/clearlooks.rc.in b/gtk2_ardour/clearlooks.rc.in
index a8c94fb..4e598d5 100644
--- a/gtk2_ardour/clearlooks.rc.in
+++ b/gtk2_ardour/clearlooks.rc.in
@@ -11,7 +11,7 @@ style "default" = "medium_text"
GtkTreeView :: focus-line-width = 0
GtkTreeView :: tree-line-width = 1
GtkTreeView :: row-ending-details = 0
-
+
GtkWidget :: focus-line-pattern = "\001\001" # Dash pattern used to draw the focus indicator.
GtkWidget :: focus-line-width = 1 # [ 1 ] ( >= 0 ) Width, in pixels, of the focus indicator line.
GtkWidget :: focus-padding = 1 # [ 1 ] ( >= 0 ) Width, in pixels, between focus indicator and the widget box.
@@ -20,12 +20,12 @@ style "default" = "medium_text"
GtkWidget :: scroll-arrow-vlength = 16 # [ 16 ] ( >= 1 ) Length of vertical scroll arrows.
GtkWidget :: link-color = shade(1.25, @bright_color)
GtkWidget :: visited-link-color = @bright_color
-
+
GtkDialog :: action-area-border = 4 # [ 5 ] ( >= 0 ) Width of border around the button area at the bottom of the dialog.
GtkDialog :: button-spacing = 4 # [ 6 ] ( >= 0 ) Spacing between buttons.
GtkDialog :: content-area-border = 2 # [ 2 ] ( >= 0 ) Width of border around the main dialog area.
GtkDialog :: content-area-spacing = 0 # [ 0 ] ( >= 0 ) The default spacing used between elements of the content area of the dialog.
-
+
GtkButton :: default-border = { 0, 0, 0, 0 }
GtkButton :: default-outside_border = { 0, 0, 0, 0 }
@@ -50,7 +50,7 @@ style "default" = "medium_text"
GtkPaned :: handle-size = 4 # [ 5 ] ( >= 0 ) Width of handle.
GtkScale :: activate-slider = 1 # [ 0 ] ( bool ) With this option set to TRUE, sliders will be drawn ACTIVE and with shadow IN while they are dragged.
- GtkScale :: slider-length = 23 # [ 31 ] ( >= 0 ) Length of scale's slider.
+ GtkScale :: slider-length = 23 # [ 31 ] ( >= 0 ) Length of scale's slider.
GtkScale :: slider-width = 14 # [ 14 ] ( >= 0 ) Width of scrollbar or scale thumb.
GtkScale :: trough-side-details = 1 # [ 0 ] ( bool ) When TRUE, the parts of the trough on the two sides of the slider are drawn with different details.
@@ -58,10 +58,10 @@ style "default" = "medium_text"
GtkScrollbar :: arrow-scaling = 0.4 # [ 0.5 ] ( 0.1 ) The arrow size proportion relative to the scroll button size.
GtkScrollbar :: fixed-slider-length = 0 # [ 0 ] ( bool ) Don't change slider size, just lock it to the minimum length.
GtkScrollbar :: min-slider-length = 50 # [ 21 ] ( >= 0 ) Minimum length of scrollbar slider.
- GtkScrollbar :: slider-width = 15 # [ 14 ] ( >= 0 ) Width of scrollbar or scale thumb.
+ GtkScrollbar :: slider-width = 15 # [ 14 ] ( >= 0 ) Width of scrollbar or scale thumb.
GtkScrollbar :: stepper-spacing = 0 # [ 0 ] ( >= 0 ) The spacing between the stepper buttons and thumb. Note that setting this value to anything > 0 will automatically set the trough-under-steppers style property to TRUE as well. Also, stepper-spacing won't have any effect if there are no steppers.
GtkScrollbar :: trough-border = 0 # [ 1 ] ( >= 0 ) Spacing between thumb/steppers and outer trough bevel.
- GtkScrollbar :: trough-side-details = 0 # [ 0 ] ( bool ) When TRUE, the parts of the trough on the two sides of the slider are drawn with different details.
+ GtkScrollbar :: trough-side-details = 0 # [ 0 ] ( bool ) When TRUE, the parts of the trough on the two sides of the slider are drawn with different details.
GtkScrollbar :: trough-under-steppers = 1 # [ 1 ] ( bool ) Whether to draw the trough across the full length of the range or to exclude the steppers and their spacing. Note that setting the "stepper-spacing" style property to any value > 0 will automatically enable trough-under-steppers too.
GtkScrollbar :: has-backward-stepper = 1 # [ 1 ] ( bool ) Display the standard backward arrow button.
@@ -76,7 +76,7 @@ style "default" = "medium_text"
#Menu Properties
GtkMenuBar :: internal-padding = 1 # [ 1 ] ( >= 0 ) Amount of border space between the menubar shadow and the menu items.
- GtkMenuBar :: shadow-type = GTK_SHADOW_OUT # [ GTK_SHADOW_OUT ] Style of bevel around the menubar.
+ GtkMenuBar :: shadow-type = GTK_SHADOW_OUT # [ GTK_SHADOW_OUT ] Style of bevel around the menubar.
GtkMenu :: arrow-placement = GTK_ARROWS_BOTH # [ GTK_ARROWS_BOTH ] Indicates where scroll arrows should be placed.
GtkMenu :: arrow-scaling = 0.5 # [ 0.7 ] ( 0.1 ) Arbitrary constant to scale down the size of the scroll arrow.
@@ -103,15 +103,9 @@ style "default" = "medium_text"
GtkTreeView :: horizontal-separator = 8 # [ 2 ] ( >= 0 ) Horizontal space between cells. Must be an even number.
GtkTreeView :: vertical-separator = 2 # [ 2 ] ( >= 0 ) Vertical space between cells. Must be an even number.
- GtkEntry :: honors-transparent-bg-hint = 1 # [ 0 ] ( bool ) (Clearlooks) Without this, gecko will fill in the background of the entry.
- GtkEntry :: cursor-color = @bg_selected
-
- #GtkToolbar::shadow_type = GTK_SHADOW_ETCHED_IN
-
- #xthickness = 0
- #ythickness = 0
-
-#Base Colors
+ GtkEntry::cursor_color = @entry_cursor
+ GtkEntry::state-hint = 0
+
bg[NORMAL] = @background
bg[PRELIGHT] = shade(1.1, @background)
bg[ACTIVE] = shade(0.9, @background)
@@ -124,33 +118,95 @@ style "default" = "medium_text"
fg[INSENSITIVE] = shade(0.7, @background)
fg[SELECTED] = @fg_selected
+ # These base and text colors will be used by treeviews and some other widgets.
+
base[NORMAL] = @bases
base[PRELIGHT] = @bases
base[INSENSITIVE] = shade(1.0, @background)
- base[ACTIVE] = shade(0.9, @bg_selected)
- base[SELECTED] = @bg_selected
+ base[ACTIVE] = shade(0.9, @bg_selected) /* base for focused, selected text */
+ base[SELECTED] = @bg_selected /* base for non-focused, selected text */
text[NORMAL] = @texts
text[PRELIGHT] = @texts
text[ACTIVE] = @fg_selected
- text[INSENSITIVE] = shade(0.7, @lightest)
- text[SELECTED] = @fg_selected
+ text[INSENSITIVE] = shade(0.7, @lightest) /* text color for focused selected text */
+ text[SELECTED] = @fg_selected /* text color for non-focused selected text */
-#engine specific tweaks
+ #engine specific tweaks
- engine "clearlooks"
+ engine "clearlooks"
{
- #style = GLOSSY
- #colorize_scrollbar = TRUE
menubarstyle = 2 # 0 = flat, 1 = sunken, 2 = flat gradient
- #toolbarstyle = 0 # 0 = flat, 1 = enable effects
}
}
+style "entry"
+{
+ GtkEntry::cursor_color = @entry_cursor
+ GtkEntry::inner-border = { 2, 2, 2, 2 }
+
+ xthickness = 0
+ ythickness = 0
+
+ # special base + text for GtkEntry to aid with visibility during text entry
+
+ base[NORMAL] = @bases
+ base[PRELIGHT] = @bases
+ base[INSENSITIVE] = @bases
+ base[ACTIVE] = @bases
+ base[SELECTED] = @bg_selected
+
+ text[NORMAL] = @texts
+ text[PRELIGHT] = @texts
+ text[INSENSITIVE] = shade (0.92, @texts)
+ text[ACTIVE] = @texts
+ text[SELECTED] = @fg_selected
+}
+
+style "spin_button" = "entry"
+{
+ engine "clearlooks"
+ {
+ # without this empty declaration, SpinButtons draw their arrows oddly
+ }
+
+}
+
+style "mixer_strip_entry" = "small_text"
+{
+ xthickness = 3
+ ythickness = 3
+
+ bg[NORMAL] = @bases
+ bg[ACTIVE] = @bases
+ bg[SELECTED] = @bases
+
+ text[NORMAL] = @texts
+ text[ACTIVE] = @texts
+ text[SELECTED] = @texts
+
+ base[NORMAL] = @bases
+ base[ACTIVE] = @bases
+ base[SELECTED] = @bases
+}
+
+style "peak_display_peaked_entry" = "mixer_strip_entry"
+{
+ fg[ACTIVE] = @texts
+ fg[SELECTED] = @texts
+ text[SELECTED] = @texts
+
+ base[NORMAL] = @bright_indicator
+ base[ACTIVE] = @bright_indicator
+ base[PRELIGHT] = @bright_indicator
+ base[INSENSITIVE] = @bright_indicator
+ base[SELECTED] = @bright_indicator
+}
+
style "treeview_parent_node"
{
# specifies *just* the color used for whole file rows when not selected
-
+
fg[NORMAL] = { 0.0, 0.6, 0.85 }
}
@@ -159,7 +215,7 @@ style "treeview_display" = "small_bold_text"
GtkWidget::focus-line-width = 0
# expander arrow border and DnD "icon" text
- fg[NORMAL] = { 0.8, 0.8, 0.8 }
+ fg[NORMAL] = { 0.8, 0.8, 0.8 }
bg[NORMAL] = { 0.8, 0.8, 0.8 }
@@ -168,7 +224,7 @@ style "treeview_display" = "small_bold_text"
base[NORMAL] = { 0.20, 0.20, 0.25 }
# selected row bg when window does not have focus (including during DnD)
- base[ACTIVE] = { 0.0, 0.75, 0.75 }
+ base[ACTIVE] = { 0.0, 0.75, 0.75 }
# selected row bg when window has focus
base[SELECTED] = { 0, 0.75, 0.75 }
@@ -177,14 +233,14 @@ style "treeview_display" = "small_bold_text"
text[NORMAL] = { 0.80, 0.80, 0.80 }
# selected row text with window focus
- text[SELECTED] = { 1.0, 1.0, 1.0 }
+ text[SELECTED] = { 1.0, 1.0, 1.0 }
# selected row text without window focus (including during DnD)
- text[ACTIVE] = { 1.0, 1.0, 1.0 }
+ text[ACTIVE] = { 1.0, 1.0, 1.0 }
}
style "track_header_inactive" = "larger_text"
-{
+{
bg[NORMAL] = @track_header_inactive
bg[ACTIVE] = @track_header_inactive
bg[INSENSITIVE] = @track_header_inactive
@@ -213,27 +269,27 @@ style "automation_track_header"
style "inspector_processor_list" = "processor_list"
{
- base[SELECTED] = { 0.3, 0.3, 0.3 }
+ base[SELECTED] = { 0.3, 0.3, 0.3 }
}
-style "time_info_box"
+style "time_info_box"
{
bg[NORMAL] = { 0.05, 0.05, 0.05 }
}
-style "status_bar_box"
+style "status_bar_box"
{
bg[NORMAL] = { 0.149, 0.149, 0.149 }
}
style "very_small_text"
{
- font_name = "@FONT_SMALLER@"
+ font_name = "@FONT_SMALLER@"
}
style "small_text"
{
- font_name = "@FONT_SMALL@"
+ font_name = "@FONT_SMALL@"
}
style "small_clock"
@@ -248,17 +304,17 @@ style "small_italic_text"
style "small_bold_text"
{
- font_name = "bold @FONT_SMALL@"
+ font_name = "bold @FONT_SMALL@"
}
style "medium_bold_text"
{
- font_name = "bold @FONT_NORMAL@"
+ font_name = "bold @FONT_NORMAL@"
}
style "medium_text"
{
- font_name = "@FONT_NORMAL@"
+ font_name = "@FONT_NORMAL@"
}
style "medium_monospace_text"
@@ -267,7 +323,7 @@ style "medium_monospace_text"
}
style "red_medium_text" = "medium_text"
-{
+{
fg[NORMAL] = @bright_indicator
fg[ACTIVE] = @bright_indicator
fg[SELECTED] = @bright_indicator
@@ -275,7 +331,7 @@ style "red_medium_text" = "medium_text"
style "large_bold_text"
{
- font_name = "bold @FONT_LARGE@"
+ font_name = "bold @FONT_LARGE@"
}
style "big_text"
@@ -290,7 +346,7 @@ style "bigger_clock"
style "larger_text"
{
- font_name = "@FONT_LARGE@"
+ font_name = "@FONT_LARGE@"
}
style "massive_clock"
@@ -323,7 +379,7 @@ style "marker_text" = "small text"
style "midi_tracer_textview" = "medium_monospace_text"
{
-
+
}
style "time_axis_view_item_name" = "very small text"
@@ -333,7 +389,7 @@ style "time_axis_view_item_name" = "very small text"
style "midi_tracer_textview" = "medium_monospace_text"
{
-
+
}
style "time_axis_view_item_name" = "very small text"
@@ -624,7 +680,7 @@ style "medium_bold_entry" = "medium_bold_text"
fg[NORMAL] = @texts
fg[ACTIVE] = @contrasting_indicator
fg[SELECTED] = @fg_selected
-
+
text[NORMAL] = @texts
text[ACTIVE] = @texts
text[SELECTED] = @fg_selected
@@ -632,31 +688,10 @@ style "medium_bold_entry" = "medium_bold_text"
bg[NORMAL] = @bases
bg[SELECTED] = @bases
bg[SELECTED] = @bases
-
- base[NORMAL] = @bases
- base[ACTIVE] = @bases
- base[SELECTED] = @bg_selected
-}
-
-style "small_entry" = "small_text"
-{
- xthickness = 3
- ythickness = 3
- fg[NORMAL] = @texts
- fg[ACTIVE] = @contrasting_indicator
- fg[SELECTED] = @fg_selected
-
- text[NORMAL] = @texts
- text[ACTIVE] = @texts
- text[SELECTED] = @texts
-
- bg[NORMAL] = @bases
- bg[ACTIVE] = @bases
- bg[SELECTED] = @bases
base[NORMAL] = @bases
base[ACTIVE] = @bases
- base[SELECTED] = @bases
+ base[SELECTED] = @bg_selected
}
style "small_spinner" = "small_text"
@@ -676,13 +711,6 @@ style "small_spinner" = "small_text"
base[SELECTED] = @background
}
-style "red_active_small_entry" = "small_entry"
-{
- fg[ACTIVE] = @texts
- fg[SELECTED] = @texts
- text[SELECTED] = @texts
-}
-
style "small_red_on_black_entry" = "small_bold_text"
{
fg[NORMAL] = @bright_indicator
@@ -730,6 +758,21 @@ style "audio_track_base" = "default"
bg[SELECTED] = @background
}
+style "control_master_base" = "default"
+{
+ font_name = " 8"
+ # NORMAL is used for single-data type labels, or Audio
+ # ACTIVE is used for MIDI in the presence of multiple data type
+ fg[NORMAL] = @foreground
+ fg[ACTIVE] = darker(@foreground)
+
+ bg[NORMAL] = @control_master
+ bg[ACTIVE] = @background
+ bg[PRELIGHT] = @background
+ bg[INSENSITIVE] = @background
+ bg[SELECTED] = @background
+}
+
style "midi_track_base" = "default"
{
font_name = " 8"
@@ -798,25 +841,10 @@ style "audio_bus_metrics_inactive" = "track_controls_inactive"
font_name = ""
}
-style "track_name_display" = "medium_text"
+style "track_name_editor" = "medium_text"
{
xthickness = 0
ythickness = 0
- fg[NORMAL] = @foreground
- fg[ACTIVE] = @foreground
- fg[SELECTED] = @foreground
-
- text[NORMAL] = @foreground
- text[ACTIVE] = @foreground
- text[SELECTED] = @foreground
-
- base[NORMAL] = @bases
- base[ACTIVE] = @bg_selected
- base[SELECTED] = @bg_selected
-
- bg[NORMAL] = lighter(@bases)
- bg[ACTIVE] = lighter(@bases)
- bg[SELECTED] = lighter(@bases)
}
style "track_separator"
@@ -914,19 +942,6 @@ style "paler_bright_when_active" = "medium_text"
bg[ACTIVE] = lighter(@bright_indicator)
}
-style "peak_display_peaked_entry" = "small_entry"
-{
- fg[ACTIVE] = @texts
- fg[SELECTED] = @texts
- text[SELECTED] = @texts
-
- base[NORMAL] = @bright_indicator
- base[ACTIVE] = @bright_indicator
- base[PRELIGHT] = @bright_indicator
- base[INSENSITIVE] = @bright_indicator
- base[SELECTED] = @bright_indicator
-}
-
style "selected_strip_frame"
{
fg[NORMAL] = @bright_indicator
@@ -958,7 +973,7 @@ style "sync_alert"
bg[PRELIGHT] = @somewhat_bright_indicator
bg[SELECTED] = @somewhat_bright_indicator
bg[NORMAL] = @somewhat_bright_indicator
-
+
fg[NORMAL] = @darkest
fg[PRELIGHT] = @darkest
fg[SELECTED] = @darkest
@@ -1019,7 +1034,23 @@ style "settings_notebook" = "big_text"
{
}
+
+style "pane"
+{
+ fg[NORMAL] = lighter(@background)
+ fg[SELECTED] = @foreground
+ fg[ACTIVE] = @somewhat_bright_indicator
+}
+
+style "vca_label_bar" = "medium_bold_text"
+{
+ bg[NORMAL] = @darkest
+ fg[NORMAL] = @lightest
+}
+
class "GtkWidget" style:highest "default"
+class "GtkSpinButton" style:highest "spin_button"
+class "GtkEntry" style "entry" # not :highest to allow instances to override this
class "GtkScrollbar" style:highest "ardour_adjusters"
class "GtkLabel" style:highest "default_generic"
class "GtkButton" style:highest "ardour_button"
@@ -1045,7 +1076,6 @@ widget "*MixerAutomationModeButton.*" style:highest "very_small_button"
widget "*MixerAutomationPlaybackButton*" style:highest "very_small_button"
widget "*MixerAutomationPlaybackButton.*" style:highest "very_small_button"
widget "*ShuttleControl" style:highest "shuttle_control"
-#widget "*MainMenuBar" style:highest "menu_bar_base"
widget "*ErrorMessage" style:highest "error_message"
widget "*FatalMessage" style:highest "fatal_message"
widget "*InfoMessage" style:highest "info_message"
@@ -1058,6 +1088,7 @@ widget "*transport clock" style:highest "bigger_clock"
widget "*secondary clock" style:highest "bigger_clock"
widget "*transport delta clock" style:highest "bigger_clock"
widget "*secondary delta clock" style:highest "bigger_clock"
+widget "*stretch clock" style:highest "bigger_clock"
widget "*silence duration clock" style:highest "medium_text"
widget "*edit point clock" style:highest "medium_text"
widget "*nudge clock" style:highest "small_clock"
@@ -1094,6 +1125,7 @@ widget "*AudioMidiTrackMetricsInactive" style:highest "midi_track_metrics_inacti
widget "*TimeAxisViewControlsBaseUnselected" style:highest "audio_track_base"
widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base"
widget "*MidiTrackControlsBaseUnselected" style:highest "midi_track_base"
+widget "*ControlMasterBaseUnselected" style:highest "control_master_base"
widget "*SendUIFader" style:highest "plugin_slider"
widget "*ReturnUIFader" style:highest "plugin_slider"
@@ -1104,8 +1136,8 @@ widget "*AudioBusFader" style:highest "audio_bus_fader"
widget "*BusControlsBaseUnselected" style:highest "audio_bus_base"
widget "*TrackSeparator" style:highest "track_separator"
-widget "*EditorTrackNameDisplay" style:highest "track_name_display"
-widget "*EditorTrackNameDisplay*" style:highest "track_name_display"
+widget "*TrackNameEditor" style:highest "track_name_editor"
+widget "*TrackNameEditor*" style:highest "track_name_editor"
widget "*CrossfadeEditAuditionButton" style:highest "bright_when_active"
widget "*CrossfadeEditAuditionButton*" style:highest "bright_when_active"
widget "*CrossfadeEditCurveButton" style:highest "bright_when_active"
@@ -1121,8 +1153,6 @@ widget "*BusControlsBaseSelected" style:highest "track_header_selected"
widget "*AutomationTrackControlsBase" style:highest "automation_track_header"
widget "*AutomationTrackControlsBaseSelected" style:highest "track_header_selected"
widget "*PluginParameterLabel" style:highest "medium_text"
-widget "*MotionControllerValue" style:highest "small_entry"
-widget "*MotionControllerValue*" style:highest "small_entry"
widget "*ParameterValueDisplay" style:highest "medium_bold_entry"
widget "*PluginUIClickBox" style:highest "medium_bold_entry"
widget "*PluginUIClickBox*" style:highest "medium_bold_entry"
@@ -1134,11 +1164,9 @@ widget "*MixerTrackCommentArea" style:highest "option_entry"
widget "*MixerPanZone" style:highest "pan_zone"
widget "*RegionEditorLabel" style:highest "medium_text"
widget "*RegionEditorEntry" style:highest "medium_entry"
-widget "*MixerStripGainDisplay" style:highest "small_entry"
-widget "*MixerStripGainDisplay*" style:highest "small_entry"
-widget "*MixerStripPeakDisplay" style:highest "red_active_small_entry"
-widget "*MixerStripPeakDisplay*" style:highest "red_active_small_entry"
-widget "*MixerStripPeakDisplayPeak*" style:highest "peak_display_peaked_entry"
+widget "*MixerStripGainDisplay" style:highest "mixer_strip_entry"
+widget "*MixerStripPeakDisplay" style:highest "mixer_strip_entry"
+widget "*MixerStripPeakDisplayPeak" style:highest "peak_display_peaked_entry"
widget "*MixerStripSelectedFrame" style:highest "selected_strip_frame"
widget "*MixerStripFrame" style:highest "base_frame"
widget "*FadeCurve" style:highest "medium_bold_entry"
@@ -1152,6 +1180,7 @@ widget "*PluginSaveButton" style:highest "small_button"
widget "*PluginSaveButton*" style:highest "small_button"
widget "*PluginEditorButton*" style:highest "default_toggle_button"
widget "*PluginEditorButton-active" style:highest "default_toggle_button_active"
+widget "*PluginAnalysisInfoLabel" style:highest "medium_monospace_text"
widget "*BarControlSpinner" style:highest "small_spinner"
widget "*BarControlSpinner*" style:highest "small_spinner"
@@ -1160,7 +1189,6 @@ widget "*BlackSeparator" style:highest "black_separator"
widget "*MetricLabel" style:highest "medium_text"
widget "*ChoiceWindow" style:highest "default_generic"
-widget "*TrackLabel" style:highest "medium_text"
widget "*TrackParameterName" style:highest "small_italic_text"
widget "*AddRouteDialog*" style:highest "medium_text"
widget "*AddRouteDialogSpinner" style:highest "medium_bold_entry"
@@ -1169,6 +1197,7 @@ widget "*AddRouteDialogNameTemplateEntry" style:highest "medium_bold_entry"
widget "*NewSessionSR1Label" style:highest "red_medium_text"
widget "*NewSessionSR2Label" style:highest "medium_text"
widget "*location edit row clock" style:highest "medium_text"
+widget "*ArdourLuaEntry" style:highest "medium_monospace_text"
widget "*LocationEditNameLabel" style:highest "medium_text"
widget "*LocationEditCdButton" style:highest "small_red_active_and_selected_button"
widget "*LocationEditCdButton*" style:highest "small_red_active_and_selected_button"
@@ -1207,3 +1236,8 @@ widget "*processor fader" style:highest "processor"
widget "*processor postfader" style:highest "processor"
widget "*MonitorSectionLabel" style:highest "small_text"
widget "*ooltip*" style:highest "tooltip"
+widget "*Pane" style:highest "pane"
+widget "*Pane.Divider" style:highest "pane"
+widget "*VCALabelBar" style:highest "vca_label_bar"
+widget "*VCALabelBar*" style:highest "vca_label_bar"
+
diff --git a/gtk2_ardour/cocoacarbon.mm b/gtk2_ardour/cocoacarbon.mm
index 6564843..592a55d 100644
--- a/gtk2_ardour/cocoacarbon.mm
+++ b/gtk2_ardour/cocoacarbon.mm
@@ -41,24 +41,6 @@
using namespace std;
using namespace PBD;
-void
-ARDOUR_UI::platform_specific ()
-{
- gtk_application_ready ();
-
- if (!ARDOUR_COMMAND_LINE::finder_invoked_ardour) {
-
- /* if invoked from the command line, make sure we're visible */
-
- [NSApp activateIgnoringOtherApps:1];
- }
-}
-
-void
-ARDOUR_UI::platform_setup ()
-{
-}
-
bool
cocoa_open_url (const char* uri)
{
diff --git a/gtk2_ardour/color_theme_manager.cc b/gtk2_ardour/color_theme_manager.cc
new file mode 100644
index 0000000..be0278e
--- /dev/null
+++ b/gtk2_ardour/color_theme_manager.cc
@@ -0,0 +1,622 @@
+/*
+ Copyright (C) 2000-2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <cmath>
+#include <errno.h>
+
+#include "fix_carbon.h"
+
+#include "pbd/gstdio_compat.h"
+
+#include "gtkmm2ext/cell_renderer_color_selector.h"
+#include "gtkmm2ext/utils.h"
+
+#include "pbd/compose.h"
+#include "pbd/file_utils.h"
+#include "pbd/replace_all.h"
+
+#include "ardour/filesystem_paths.h"
+#include "ardour/profile.h"
+
+#include "canvas/container.h"
+#include "canvas/rectangle.h"
+#include "canvas/scroll_group.h"
+#include "canvas/wave_view.h"
+
+#include "ardour_button.h"
+#include "ardour_dialog.h"
+#include "color_theme_manager.h"
+#include "rgb_macros.h"
+#include "ui_config.h"
+#include "utils.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace PBD;
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+
+ColorThemeManager::ColorThemeManager ()
+ : reset_button (_("Restore Defaults"))
+ , palette_viewport (*palette_scroller.get_hadjustment(), *palette_scroller.get_vadjustment())
+ , palette_group (0)
+ , palette_window (0)
+ , color_theme_label (_("Color Theme"))
+{
+ set_spacing (12);
+
+ std::map<string,string> color_themes;
+
+ get_color_themes (color_themes);
+
+ if (color_themes.size() > 1) {
+ theme_list = TreeStore::create (color_theme_columns);
+
+ TreeModel::iterator selected_iter = theme_list->children().end();
+
+ for (std::map<string,string>::iterator c = color_themes.begin(); c != color_themes.end(); ++c) {
+ TreeModel::Row row;
+
+ row = *(theme_list->append());
+ row[color_theme_columns.name] = c->first;
+
+ string color_file_name = c->second;
+
+ row[color_theme_columns.path] = color_file_name;
+
+ /* match second (path; really basename) since that is
+ what we store/restore.
+ */
+
+ if (UIConfiguration::instance().get_color_file() == color_file_name) {
+ selected_iter = row;
+ }
+ }
+
+ color_theme_dropdown.set_model (theme_list);
+ color_theme_dropdown.pack_start (color_theme_columns.name);
+
+ if (selected_iter != theme_list->children().end()) {
+ color_theme_dropdown.set_active (selected_iter);
+ }
+
+ Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox());
+ Gtk::Alignment* align = Gtk::manage (new Gtk::Alignment);
+ align->set (0, 0.5);
+ align->add (color_theme_dropdown);
+ hbox->set_spacing (6);
+ hbox->pack_start (color_theme_label, false, false);
+ hbox->pack_start (*align, true, true);
+ pack_start (*hbox, PACK_SHRINK);
+ hbox->show_all ();
+ }
+
+ reset_button.signal_clicked().connect (sigc::mem_fun (*this, &ColorThemeManager::reset_canvas_colors));
+
+ /* Now the alias list */
+
+ alias_list = TreeStore::create (alias_columns);
+ alias_display.set_model (alias_list);
+ alias_display.append_column (_("Object"), alias_columns.name);
+
+ Gtkmm2ext::CellRendererColorSelector* color_renderer = manage (new Gtkmm2ext::CellRendererColorSelector);
+ TreeViewColumn* color_column = manage (new TreeViewColumn (_("Color"), *color_renderer));
+ color_column->add_attribute (color_renderer->property_color(), alias_columns.color);
+ alias_display.append_column (*color_column);
+
+ alias_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
+ alias_display.get_column (0)->set_expand (true);
+ alias_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
+ alias_display.get_column (1)->set_expand (false);
+ alias_display.set_reorderable (false);
+ alias_display.set_headers_visible (true);
+
+ alias_display.signal_button_press_event().connect (sigc::mem_fun (*this, &ColorThemeManager::alias_button_press_event), false);
+
+ alias_scroller.add (alias_display);
+
+ palette_group = initialize_palette_canvas (*palette_viewport.canvas());
+ palette_viewport.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::palette_canvas_allocated), palette_group, palette_viewport.canvas(),
+ sigc::mem_fun (*this, &ColorThemeManager::palette_event)));
+ palette_scroller.add (palette_viewport);
+
+ modifier_scroller.add (modifier_vbox);
+
+ notebook.append_page (alias_scroller, _("Items"));
+ notebook.append_page (palette_scroller, _("Palette"));
+ notebook.append_page (modifier_scroller, _("Transparency"));
+
+ notebook.set_size_request (400, 400);
+
+ pack_start (notebook, true, true);
+ pack_start (reset_button, false, false);
+
+ color_dialog.get_colorsel()->set_has_opacity_control (true);
+ color_dialog.get_colorsel()->set_has_palette (true);
+ color_dialog.get_ok_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_ACCEPT));
+ color_dialog.get_cancel_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_CANCEL));
+
+ color_theme_dropdown.signal_changed().connect (sigc::mem_fun (*this, &ColorThemeManager::on_color_theme_changed));
+
+ /* no need to call setup_palette() here, it will be done when its size is allocated */
+ setup_aliases ();
+ setup_modifiers ();
+
+ UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ColorThemeManager::colors_changed));
+
+ show_all ();
+}
+
+void
+ColorThemeManager::setup_modifiers ()
+{
+ UIConfiguration* uic (&UIConfiguration::instance());
+ UIConfiguration::Modifiers& modifiers (uic->modifiers);
+ Gtk::HBox* mod_hbox;
+ Gtk::Label* mod_label;
+ Gtk::HScale* mod_scale;
+
+ Gtkmm2ext::container_clear (modifier_vbox);
+
+ for (UIConfiguration::Modifiers::const_iterator m = modifiers.begin(); m != modifiers.end(); ++m) {
+ mod_hbox = manage (new HBox);
+
+ mod_scale = manage (new HScale (0.0, 1.0, 0.01));
+ mod_scale->set_draw_value (false);
+ mod_scale->set_value (m->second.a());
+ mod_scale->set_update_policy (Gtk::UPDATE_DISCONTINUOUS);
+ mod_scale->signal_value_changed().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::modifier_edited), mod_scale, m->first));
+
+ mod_label = manage (new Label (m->first));
+ mod_label->set_alignment (1.0, 0.5);
+ mod_label->set_size_request (150, -1); /* 150 pixels should be enough for anyone */
+
+ mod_hbox->pack_start (*mod_label, false, true, 12);
+ mod_hbox->pack_start (*mod_scale, true, true);
+
+ modifier_vbox.pack_start (*mod_hbox, false, false);
+ }
+
+ modifier_vbox.show_all ();
+
+}
+
+void
+ColorThemeManager::modifier_edited (Gtk::Range* range, string name)
+{
+ using namespace ArdourCanvas;
+
+ double alpha = range->get_value();
+ SVAModifier svam (SVAModifier::Assign, -1.0, -1.0, alpha);
+ UIConfiguration::instance().set_modifier (name, svam);
+}
+
+void
+ColorThemeManager::colors_changed ()
+{
+ setup_palette ();
+ setup_aliases ();
+ setup_modifiers ();
+}
+
+void
+ColorThemeManager::reset_canvas_colors()
+{
+ string cfile;
+ string basename;
+
+ /* look for a versioned user-owned color file, and try to rename it */
+
+ basename = UIConfiguration::instance().color_file_name (true, true);
+
+ if (find_file (ardour_config_search_path(), basename, cfile)) {
+ string backup = cfile + string (X_(".old"));
+ g_rename (cfile.c_str(), backup.c_str());
+ /* don't really care if it fails */
+ }
+
+ UIConfiguration::instance().load_color_theme (false);
+ UIConfiguration::instance().save_state ();
+}
+
+ArdourCanvas::Container*
+ColorThemeManager::initialize_palette_canvas (ArdourCanvas::Canvas& canvas)
+{
+ using namespace ArdourCanvas;
+
+ /* hide background */
+ canvas.set_background_color (rgba_to_color (0.0, 0.0, 1.0, 0.0));
+
+ /* bi-directional scroll group */
+
+ ScrollGroup* scroll_group = new ScrollGroup (canvas.root(), ScrollGroup::ScrollSensitivity (ScrollGroup::ScrollsVertically|ScrollGroup::ScrollsHorizontally));
+ canvas.add_scroller (*scroll_group);
+
+ /* new container to hold everything */
+
+ return new ArdourCanvas::Container (scroll_group);
+}
+
+void
+ColorThemeManager::palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler)
+{
+ build_palette_canvas (*canvas, *group, event_handler);
+}
+
+struct NamedColor {
+ string name;
+ ArdourCanvas::HSV color;
+ NamedColor (string s, ArdourCanvas::HSV c) : name (s), color (c) {}
+};
+
+struct SortByHue {
+ bool operator() (NamedColor const & a, NamedColor const & b) {
+ using namespace ArdourCanvas;
+ const HSV black (0, 0, 0);
+ if (a.color.is_gray() || b.color.is_gray()) {
+ return black.distance (a.color) < black.distance (b.color);
+ } else {
+ return a.color.h < b.color.h;
+ // const HSV red (rgba_to_color (1.0, 0.0, 0.0, 1.0));
+ // return red.distance (a.color) < red.distance (b.color);
+ }
+ }
+};
+
+
+void
+ColorThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas::Container& group, sigc::slot<bool,GdkEvent*,std::string> event_handler)
+{
+ using namespace ArdourCanvas;
+
+ /* we want the colors sorted by hue, with their name */
+
+ UIConfiguration::Colors& colors (UIConfiguration::instance().colors);
+ vector<NamedColor> nc;
+ for (UIConfiguration::Colors::const_iterator x = colors.begin(); x != colors.end(); ++x) {
+ nc.push_back (NamedColor (x->first, HSV (x->second)));
+ }
+ SortByHue sorter;
+ sort (nc.begin(), nc.end(), sorter);
+
+ const uint32_t color_limit = nc.size();
+ const double box_size = 20.0;
+ const double width = canvas.width();
+ const double height = canvas.height();
+
+ uint32_t color_num = 0;
+
+ /* clear existing rects and delete them */
+
+ group.clear (true);
+
+ for (uint32_t y = 0; y < height - box_size && color_num < color_limit; y += box_size) {
+ for (uint32_t x = 0; x < width - box_size && color_num < color_limit; x += box_size) {
+ ArdourCanvas::Rectangle* r = new ArdourCanvas::Rectangle (&group, ArdourCanvas::Rect (x, y, x + box_size, y + box_size));
+
+ string name = nc[color_num++].name;
+
+ UIConfiguration::Colors::iterator c = colors.find (name);
+
+ if (c != colors.end()) {
+ Color color = c->second;
+ r->set_fill_color (color);
+ r->set_outline_color (rgba_to_color (0.0, 0.0, 0.0, 1.0));
+ r->set_tooltip (name);
+ r->Event.connect (sigc::bind (event_handler, name));
+ }
+ }
+ }
+}
+
+void
+ColorThemeManager::palette_size_request (Gtk::Requisition* req)
+{
+ uint32_t ncolors = UIConfiguration::instance().colors.size();
+ const int box_size = 20;
+
+ double c = sqrt ((double)ncolors);
+ req->width = (int) floor (c * box_size);
+ req->height = (int) floor (c * box_size);
+
+ /* add overflow row if necessary */
+
+ if (fmod (ncolors, c) != 0.0) {
+ req->height += box_size;
+ }
+}
+
+void
+ColorThemeManager::setup_palette ()
+{
+ build_palette_canvas (*palette_viewport.canvas(), *palette_group, sigc::mem_fun (*this, &ColorThemeManager::palette_event));
+}
+
+bool
+ColorThemeManager::palette_event (GdkEvent* ev, string name)
+{
+ switch (ev->type) {
+ case GDK_BUTTON_RELEASE:
+ edit_palette_color (name);
+ return true;
+ default:
+ break;
+ }
+ return true;
+}
+
+void
+ColorThemeManager::edit_palette_color (std::string name)
+{
+ using namespace ArdourCanvas;
+ double r,g, b, a;
+ UIConfiguration* uic (&UIConfiguration::instance());
+ ArdourCanvas::Color c = uic->color (name);
+ Gdk::Color gdkcolor;
+
+ color_to_rgba (c, r, g, b, a);
+
+ gdkcolor.set_rgb_p (r, g, b);
+ color_dialog.get_colorsel()->set_previous_color (gdkcolor);
+ color_dialog.get_colorsel()->set_current_color (gdkcolor);
+ color_dialog.get_colorsel()->set_previous_alpha ((guint16) (a * 65535));
+ color_dialog.get_colorsel()->set_current_alpha ((guint16) (a * 65535));
+
+ color_dialog_connection.disconnect ();
+ color_dialog_connection = color_dialog.signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::palette_color_response), name));
+ color_dialog.present();
+}
+
+void
+ColorThemeManager::palette_color_response (int result, std::string name)
+{
+ using namespace ArdourCanvas;
+
+ color_dialog_connection.disconnect ();
+
+ UIConfiguration* uic (&UIConfiguration::instance());
+ Gdk::Color gdkcolor;
+ double r,g, b, a;
+
+ switch (result) {
+ case RESPONSE_ACCEPT:
+ case RESPONSE_OK:
+ gdkcolor = color_dialog.get_colorsel()->get_current_color();
+ a = color_dialog.get_colorsel()->get_current_alpha() / 65535.0;
+ r = gdkcolor.get_red_p();
+ g = gdkcolor.get_green_p();
+ b = gdkcolor.get_blue_p();
+
+ uic->set_color (name, rgba_to_color (r, g, b, a));
+ break;
+
+ default:
+ break;
+ }
+
+ color_dialog.hide ();
+}
+
+bool
+ColorThemeManager::alias_palette_event (GdkEvent* ev, string new_alias, string target_name)
+{
+ switch (ev->type) {
+ case GDK_BUTTON_RELEASE:
+ UIConfiguration::instance().set_alias (target_name, new_alias);
+ return true;
+ break;
+ default:
+ break;
+ }
+ return false;
+}
+
+void
+ColorThemeManager::alias_palette_response (int response, std::string target_name, std::string old_alias)
+{
+ switch (response) {
+ case GTK_RESPONSE_OK:
+ case GTK_RESPONSE_ACCEPT:
+ /* rebuild alias list with new color: inefficient but simple */
+ setup_aliases ();
+ break;
+
+ case GTK_RESPONSE_REJECT:
+ /* revert choice */
+ UIConfiguration::instance().set_alias (target_name, old_alias);
+ break;
+
+ default:
+ /* do nothing */
+ break;
+ }
+
+ palette_window->hide ();
+}
+
+void
+ColorThemeManager::choose_color_from_palette (string const & name)
+{
+ UIConfiguration* uic (&UIConfiguration::instance());
+ UIConfiguration::ColorAliases::iterator i = uic->color_aliases.find (name);
+
+ if (i == uic->color_aliases.end()) {
+ return;
+ }
+
+ delete palette_window;
+
+ palette_window = new ArdourDialog (_("Color Palette"));
+ palette_window->add_button (Stock::CANCEL, RESPONSE_REJECT); /* using CANCEL causes confusion if dialog is closed via CloseAllDialogs */
+ palette_window->add_button (Stock::OK, RESPONSE_OK);
+
+ ArdourCanvas::GtkCanvas* canvas = new ArdourCanvas::GtkCanvas ();
+ ArdourCanvas::Container* group = initialize_palette_canvas (*canvas);
+
+ canvas->signal_size_request().connect (sigc::mem_fun (*this, &ColorThemeManager::palette_size_request));
+ canvas->signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::palette_canvas_allocated), group, canvas,
+ sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::alias_palette_event), name)));
+
+ palette_window->get_vbox()->pack_start (*canvas);
+ palette_window->show_all ();
+
+ palette_response_connection = palette_window->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::alias_palette_response), name, i->second));
+
+ palette_window->set_position (WIN_POS_MOUSE);
+ palette_window->present ();
+}
+
+void
+ColorThemeManager::setup_aliases ()
+{
+ using namespace ArdourCanvas;
+
+ UIConfiguration* uic (&UIConfiguration::instance());
+ UIConfiguration::ColorAliases& aliases (uic->color_aliases);
+
+ alias_list->clear ();
+
+ for (UIConfiguration::ColorAliases::iterator i = aliases.begin(); i != aliases.end(); ++i) {
+ TreeModel::Children rows = alias_list->children();
+ TreeModel::Row row;
+ string::size_type colon;
+
+ if ((colon = i->first.find (':')) != string::npos) {
+
+ /* this is supposed to be a child node, so find the
+ * parent
+ */
+
+ string parent = i->first.substr (0, colon);
+ TreeModel::iterator ri;
+
+ for (ri = rows.begin(); ri != rows.end(); ++ri) {
+ string s = (*ri)[alias_columns.name];
+ if (s == parent) {
+ break;
+ }
+ }
+
+ if (ri == rows.end()) {
+ /* not found, add the parent as new top level row */
+ row = *(alias_list->append());
+ row[alias_columns.name] = parent;
+ row[alias_columns.alias] = "";
+
+ /* now add the child as a child of this one */
+
+ row = *(alias_list->insert (row->children().end()));
+ row[alias_columns.name] = i->first.substr (colon+1);
+ } else {
+ row = *(alias_list->insert ((*ri)->children().end()));
+ row[alias_columns.name] = i->first.substr (colon+1);
+ }
+
+ } else {
+ /* add as a child */
+ row = *(alias_list->append());
+ row[alias_columns.name] = i->first;
+ row[alias_columns.key] = i->first;
+ }
+
+ row[alias_columns.key] = i->first;
+ row[alias_columns.alias] = i->second;
+
+ Gdk::Color col;
+ double r, g, b, a;
+ Color c (uic->color (i->second));
+ color_to_rgba (c, r, g, b, a);
+ col.set_rgb_p (r, g, b);
+
+ row[alias_columns.color] = col;
+ }
+}
+
+bool
+ColorThemeManager::alias_button_press_event (GdkEventButton* ev)
+{
+ TreeIter iter;
+ TreeModel::Path path;
+ TreeViewColumn* column;
+ int cellx;
+ int celly;
+
+ if (!alias_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
+ return false;
+ }
+
+ guint32 colnum = GPOINTER_TO_UINT (column->get_data (X_("colnum")));
+
+ switch (colnum) {
+ case 0:
+ /* allow normal processing to occur */
+ return false;
+
+ case 1: /* color */
+ if ((iter = alias_list->get_iter (path))) {
+ string target_color_alias = (*iter)[alias_columns.key];
+ if (!target_color_alias.empty()) {
+ choose_color_from_palette (target_color_alias);
+ }
+ }
+ break;
+ }
+
+ return true;
+}
+
+void
+ColorThemeManager::parameter_changed (string const&)
+{
+}
+
+void
+ColorThemeManager::set_state_from_config ()
+{
+
+}
+
+void
+ColorThemeManager::add_to_page (OptionEditorPage* page)
+{
+ add_widget_to_page (page, this);
+}
+
+Gtk::Widget&
+ColorThemeManager::tip_widget()
+{
+ return reset_button; /* XXX need a better widget for this purpose */
+}
+
+void
+ColorThemeManager::on_color_theme_changed ()
+{
+ Gtk::TreeModel::iterator iter = color_theme_dropdown.get_active();
+
+ if (iter) {
+ Gtk::TreeModel::Row row = *iter;
+
+ if (row) {
+ string new_theme = row[color_theme_columns.path];
+ UIConfiguration::instance().set_color_file (new_theme);
+ }
+ }
+}
diff --git a/gtk2_ardour/color_theme_manager.h b/gtk2_ardour/color_theme_manager.h
new file mode 100644
index 0000000..f3e9132
--- /dev/null
+++ b/gtk2_ardour/color_theme_manager.h
@@ -0,0 +1,167 @@
+/*
+ Copyright (C) 2000-2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_gtk_color_manager_h__
+#define __ardour_gtk_color_manager_h__
+
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/colorselection.h>
+#include <gtkmm/button.h>
+
+#include "canvas/types.h"
+#include "canvas/canvas.h"
+
+#include "option_editor.h"
+#include "ui_config.h"
+
+namespace ArdourCanvas {
+ class Container;
+ class ScrollGroup;
+}
+
+class ArdourDialog;
+
+class ColorThemeManager : public Gtk::VBox, public OptionEditorComponent
+{
+ public:
+ ColorThemeManager();
+
+ void reset_canvas_colors();
+ void on_color_theme_changed ();
+
+ /** Called when a configuration parameter's value has changed.
+ * @param p parameter name
+ */
+ void parameter_changed (std::string const & p);
+
+ /** Called to instruct the object to set its UI state from the configuration */
+ void set_state_from_config ();
+
+ /** Called to instruct the object to add itself to an OptionEditorPage */
+ void add_to_page (OptionEditorPage *);
+
+ void set_note (std::string const &);
+
+ Gtk::Widget& tip_widget();
+
+ private:
+ Gtk::Button reset_button;
+ Gtk::Notebook notebook;
+
+ /* handls response from color dialog when it is used to
+ edit a derived color.
+ */
+ void palette_color_response (int, std::string);
+
+ Gtk::ScrolledWindow palette_scroller;
+ ArdourCanvas::GtkCanvasViewport palette_viewport;
+ ArdourCanvas::Container* palette_group;
+
+ /* these methods create and manage a canvas for use in either the
+ palette tab or in a separate dialog. Different behaviour is
+ accomplished by changing the event handler passed into the
+ allocation handler. We do it there because we have to rebuild
+ the canvas on allocation events, and during the rebuild, connect
+ each rectangle to the event handler.
+
+ the alternative is one event handler for the canvas and a map
+ of where each color rectangle is. nothing wrong with this
+ but the per-rect event setup is simpler and avoids building
+ and looking up the map information.
+ */
+ ArdourCanvas::Container* initialize_palette_canvas (ArdourCanvas::Canvas& canvas);
+ void build_palette_canvas (ArdourCanvas::Canvas&, ArdourCanvas::Container&, sigc::slot<bool,GdkEvent*,std::string> event_handler);
+ void palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler);
+ void palette_size_request (Gtk::Requisition*);
+
+ /* handles events from a palette canvas inside the palette (derived
+ colors) tab
+ */
+ bool palette_event (GdkEvent*, std::string name);
+ /* allows user to edit a named color (e.g. "color 3") after clicking
+ on it inside the palette tab.
+ */
+ void edit_palette_color (std::string);
+
+ struct ColorAliasModelColumns : public Gtk::TreeModel::ColumnRecord {
+ ColorAliasModelColumns() {
+ add (name);
+ add (alias);
+ add (color);
+ add (key);
+ }
+
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<std::string> alias;
+ Gtk::TreeModelColumn<Gdk::Color> color;
+ Gtk::TreeModelColumn<std::string> key;
+ };
+
+ ColorAliasModelColumns alias_columns;
+ Gtk::TreeView alias_display;
+ Glib::RefPtr<Gtk::TreeStore> alias_list;
+ Gtk::ScrolledWindow alias_scroller;
+
+ bool alias_button_press_event (GdkEventButton*);
+
+ ArdourDialog* palette_window;
+ sigc::connection palette_response_connection;
+
+ void choose_color_from_palette (std::string const &target_name);
+
+ bool alias_palette_event (GdkEvent*, std::string, std::string);
+ void alias_palette_response (int, std::string, std::string);
+
+ void setup_aliases ();
+ void setup_palette ();
+
+ Gtk::ScrolledWindow modifier_scroller;
+ Gtk::VBox modifier_vbox;
+
+ void setup_modifiers ();
+ void modifier_edited (Gtk::Range*, std::string);
+
+ Gtk::ColorSelectionDialog color_dialog;
+ sigc::connection color_dialog_connection;
+
+ void colors_changed ();
+ void set_ui_to_state ();
+
+
+ struct ColorThemeModelColumns : public Gtk::TreeModel::ColumnRecord {
+ ColorThemeModelColumns() {
+ add (name);
+ add (path);
+ }
+
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<std::string> path;
+ };
+
+ ColorThemeModelColumns color_theme_columns;
+ Glib::RefPtr<Gtk::TreeStore> theme_list;
+
+ Gtk::Label color_theme_label;
+ Gtk::ComboBox color_theme_dropdown;
+
+};
+
+#endif /* __ardour_gtk_color_manager_h__ */
diff --git a/gtk2_ardour/configinfo.cc b/gtk2_ardour/configinfo.cc
index 67f13a1..f7a3211 100644
--- a/gtk2_ardour/configinfo.cc
+++ b/gtk2_ardour/configinfo.cc
@@ -22,7 +22,7 @@
#include "ardour/ardour.h"
#include "configinfo.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
ConfigInfoDialog::ConfigInfoDialog ()
: ArdourDialog (_("Build Configuration"))
diff --git a/gtk2_ardour/control_point.cc b/gtk2_ardour/control_point.cc
index b906e63..2a457c5 100644
--- a/gtk2_ardour/control_point.cc
+++ b/gtk2_ardour/control_point.cc
@@ -24,7 +24,7 @@
#include "canvas/rectangle.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/control_point_dialog.cc b/gtk2_ardour/control_point_dialog.cc
index 9cb71cb..06ef2ce 100644
--- a/gtk2_ardour/control_point_dialog.cc
+++ b/gtk2_ardour/control_point_dialog.cc
@@ -20,7 +20,7 @@
#include "control_point_dialog.h"
#include "control_point.h"
#include "automation_line.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <gtkmm/stock.h>
/**
diff --git a/gtk2_ardour/control_slave_ui.cc b/gtk2_ardour/control_slave_ui.cc
new file mode 100644
index 0000000..55705cf
--- /dev/null
+++ b/gtk2_ardour/control_slave_ui.cc
@@ -0,0 +1,243 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <string>
+
+#include <gtkmm/menu.h>
+
+#include "pbd/convert.h"
+
+#include "ardour/session.h"
+#include "ardour/stripable.h"
+#include "ardour/types.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/utils.h"
+
+#include "ardour_button.h"
+#include "control_slave_ui.h"
+#include "gui_thread.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace Gtk;
+using std::string;
+
+ControlSlaveUI::ControlSlaveUI (Session* s)
+ : SessionHandlePtr (s)
+ , initial_button (ArdourButton::default_elements)
+{
+ set_no_show_all (true);
+
+ Gtkmm2ext::UI::instance()->set_tip (*this, _("Control Masters"));
+
+ initial_button.set_no_show_all (true);
+ initial_button.set_name (X_("vca assign"));
+ initial_button.set_text (_("-vca-"));
+ initial_button.show ();
+ initial_button.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+ initial_button.signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::vca_button_release), 0), false);
+
+ pack_start (initial_button, true, true);
+}
+
+void
+ControlSlaveUI::set_stripable (boost::shared_ptr<Stripable> s)
+{
+ connections.drop_connections ();
+
+ stripable = s;
+
+ if (stripable) {
+ boost::shared_ptr<GainControl> ac = stripable->gain_control();
+ assert (ac);
+
+ ac->MasterStatusChange.connect (connections,
+ invalidator (*this),
+ boost::bind (&ControlSlaveUI::update_vca_display, this),
+ gui_context());
+
+ stripable->DropReferences.connect (connections, invalidator (*this), boost::bind (&ControlSlaveUI::set_stripable, this, boost::shared_ptr<Stripable>()), gui_context());
+ }
+
+ update_vca_display ();
+}
+
+void
+ControlSlaveUI::update_vca_display ()
+{
+ if (!_session || _session->deletion_in_progress()) {
+ return;
+ }
+
+ VCAList vcas (_session->vca_manager().vcas());
+ bool any = false;
+
+ Gtkmm2ext::container_clear (*this);
+ master_connections.drop_connections ();
+
+ if (stripable) {
+ for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ if (stripable->gain_control()->slaved_to ((*v)->gain_control())) {
+ add_vca_button (*v);
+ any = true;
+ }
+ }
+ }
+
+ if (!any) {
+ pack_start (initial_button, true, true);
+ }
+
+ show ();
+}
+
+void
+ControlSlaveUI::vca_menu_toggle (Gtk::CheckMenuItem* menuitem, uint32_t n)
+{
+ boost::shared_ptr<VCA> vca = _session->vca_manager().vca_by_number (n);
+
+ if (!vca) {
+ return;
+ }
+
+ boost::shared_ptr<Slavable> sl = boost::dynamic_pointer_cast<Slavable> (stripable);
+
+ if (!sl) {
+ return;
+ }
+
+ if (!menuitem->get_active()) {
+ sl->unassign (vca);
+ } else {
+ sl->assign (vca);
+ }
+}
+
+void
+ControlSlaveUI::unassign_all ()
+{
+ boost::shared_ptr<Slavable> sl = boost::dynamic_pointer_cast<Slavable> (stripable);
+
+ if (!sl) {
+ return;
+ }
+
+ sl->unassign (boost::shared_ptr<VCA>());
+}
+
+bool
+ControlSlaveUI::specific_vca_button_release (GdkEventButton* ev, uint32_t n)
+{
+ return vca_button_release (ev, n);
+}
+
+bool
+ControlSlaveUI::vca_button_release (GdkEventButton* ev, uint32_t n)
+{
+ using namespace Gtk::Menu_Helpers;
+
+ if (!_session) {
+ return false;
+ }
+
+ /* primary click only */
+
+ if (ev->button != 1) {
+ return false;
+ }
+
+ if (!stripable) {
+ /* no route - nothing to do */
+ return false;
+ }
+
+ VCAList vcas (_session->vca_manager().vcas());
+
+ if (vcas.empty()) {
+ /* the button should not have been visible under these conditions */
+ return true;
+ }
+
+ Menu* menu = new Menu;
+ MenuList& items = menu->items();
+ bool slaved = false;
+
+ for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+
+ boost::shared_ptr<GainControl> gcs = stripable->gain_control();
+ boost::shared_ptr<GainControl> gcm = (*v)->gain_control();
+
+ if (gcs == gcm) {
+ /* asked to slave to self. not ok */
+ continue;
+ }
+
+ if (gcm->slaved_to (gcs)) {
+ /* master is already slaved to slave */
+ continue;
+ }
+
+ items.push_back (CheckMenuElem ((*v)->name()));
+ Gtk::CheckMenuItem* item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
+
+ if (gcs->slaved_to (gcm)) {
+ item->set_active (true);
+ slaved = true;
+ }
+
+ item->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::vca_menu_toggle), item, (*v)->number()));
+ }
+
+ if (slaved) {
+ items.push_back (MenuElem (_("Unassign All"), sigc::mem_fun (*this, &ControlSlaveUI::unassign_all)));
+ }
+
+ if (!items.empty()) {
+ menu->popup (1, ev->time);
+ }
+
+ return true;
+}
+
+void
+ControlSlaveUI::add_vca_button (boost::shared_ptr<VCA> vca)
+{
+ ArdourButton* vca_button = manage (new ArdourButton (ArdourButton::default_elements));
+
+ vca_button->set_no_show_all (true);
+ vca_button->set_name (X_("vca assign"));
+ vca_button->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+ vca_button->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::specific_vca_button_release), vca->number()), false);
+ vca_button->set_text (PBD::to_string (vca->number(), std::dec));
+ vca_button->set_fixed_colors (vca->presentation_info().color(), vca->presentation_info().color ());
+
+ vca->presentation_info().PropertyChanged.connect (master_connections, invalidator (*this), boost::bind (&ControlSlaveUI::master_property_changed, this, _1), gui_context());
+
+ pack_start (*vca_button);
+ vca_button->show ();
+}
+
+void
+ControlSlaveUI::master_property_changed (PBD::PropertyChange const& /* what_changed */)
+{
+ update_vca_display ();
+}
diff --git a/gtk2_ardour/control_slave_ui.h b/gtk2_ardour/control_slave_ui.h
new file mode 100644
index 0000000..3443e1a
--- /dev/null
+++ b/gtk2_ardour/control_slave_ui.h
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __gtk2_ardour_control_slave_ui_h__
+#define __gtk2_ardour_control_slave_ui_h__
+
+#include <stdint.h>
+
+#include <boost/shared_ptr.hpp>
+
+#include <gtkmm/box.h>
+#include <gtkmm/checkmenuitem.h>
+
+#include "pbd/signals.h"
+#include "pbd/properties.h"
+
+#include "ardour/session_handle.h"
+
+#include "ardour_button.h"
+
+namespace ARDOUR {
+ class VCA;
+ class Stripable;
+ class Session;
+}
+
+class ControlSlaveUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
+{
+ public:
+ ControlSlaveUI (ARDOUR::Session*);
+ void set_stripable (boost::shared_ptr<ARDOUR::Stripable>);
+
+ private:
+ boost::shared_ptr<ARDOUR::Stripable> stripable;
+ PBD::ScopedConnectionList connections;
+ PBD::ScopedConnectionList master_connections;
+ ArdourButton initial_button;
+
+ void master_property_changed (PBD::PropertyChange const &);
+ void update_vca_display ();
+ void vca_menu_toggle (Gtk::CheckMenuItem*, uint32_t n);
+ bool specific_vca_button_release (GdkEventButton* ev, uint32_t n);
+ bool vca_event_box_release (GdkEventButton* ev);
+ bool vca_button_release (GdkEventButton* ev, uint32_t n);
+ void add_vca_button (boost::shared_ptr<ARDOUR::VCA>);
+ void unassign_all ();
+};
+
+#endif /* __gtk2_ardour_control_slave_ui_h__ */
diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc
deleted file mode 100644
index 367bece..0000000
--- a/gtk2_ardour/crossfade_edit.cc
+++ /dev/null
@@ -1,1455 +0,0 @@
-/*
- Copyright (C) 2004 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <cmath>
-
-#include <sigc++/bind.h>
-
-#include <gtkmm/frame.h>
-#include <gtkmm/image.h>
-#include <gtkmm/scrolledwindow.h>
-
-
-#include "pbd/memento_command.h"
-#include "ardour/automation_list.h"
-#include "evoral/Curve.hpp"
-#include "ardour/crossfade.h"
-#include "ardour/dB.h"
-#include "ardour/session.h"
-#include "ardour/auditioner.h"
-#include "ardour/audioplaylist.h"
-#include "ardour/audiosource.h"
-#include "ardour/region_factory.h"
-#include "ardour/profile.h"
-#include "ardour/crossfade_binder.h"
-
-#include <gtkmm2ext/gtk_ui.h>
-
-#include "canvas/rectangle.h"
-#include "canvas/wave_view.h"
-#include "canvas/line.h"
-#include "canvas/polygon.h"
-
-#include "ardour_ui.h"
-#include "crossfade_edit.h"
-#include "rgb_macros.h"
-#include "keyboard.h"
-#include "gui_thread.h"
-#include "actions.h"
-
-using namespace std;
-using namespace ARDOUR;
-using namespace PBD;
-using namespace Gtk;
-using namespace Editing;
-
-using Gtkmm2ext::Keyboard;
-
-#include "i18n.h"
-
-const int32_t CrossfadeEditor::Point::size = 7;
-const double CrossfadeEditor::canvas_border = 10;
-CrossfadeEditor::Presets* CrossfadeEditor::fade_in_presets = 0;
-CrossfadeEditor::Presets* CrossfadeEditor::fade_out_presets = 0;
-
-CrossfadeEditor::Half::Half ()
- : line (0)
- , normative_curve (Evoral::Parameter(GainAutomation))
- , gain_curve (Evoral::Parameter(GainAutomation))
-{
-}
-
-CrossfadeEditor::CrossfadeEditor (Session* s, boost::shared_ptr<Crossfade> xf, double my, double mxy)
- : ArdourDialog (_("Edit Crossfade")),
- xfade (xf),
- clear_button (_("Clear")),
- revert_button (_("Reset")),
- audition_both_button (_("Fade")),
- audition_left_dry_button (_("Out (dry)")),
- audition_left_button (_("Out")),
- audition_right_dry_button (_("In (dry)")),
- audition_right_button (_("In")),
-
- preroll_button (_("With Pre-roll")),
- postroll_button (_("With Post-roll")),
-
- miny (my),
- maxy (mxy),
-
- fade_in_table (3, 3),
- fade_out_table (3, 3),
-
- select_in_button (_("Fade In")),
- select_out_button (_("Fade Out")),
-
- _peaks_ready_connection (0)
-
-{
- set_session (s);
-
- set_wmclass (X_("ardour_automationedit"), PROGRAM_NAME);
- set_name ("CrossfadeEditWindow");
-
- add_accel_group (ActionManager::ui_manager->get_accel_group());
-
- add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
-
- RadioButtonGroup sel_but_group = select_in_button.get_group();
- select_out_button.set_group (sel_but_group);
- select_out_button.set_mode (false);
- select_in_button.set_mode (false);
-
- get_action_area()->set_layout(BUTTONBOX_SPREAD);
- get_action_area()->pack_start(clear_button);
- get_action_area()->pack_start(revert_button);
- cancel_button = add_button ("Cancel", RESPONSE_CANCEL);
- ok_button = add_button ("OK", RESPONSE_ACCEPT);
-
- if (fade_in_presets == 0) {
- build_presets ();
- }
-
- point_grabbed = false;
- toplevel = 0;
-
- canvas = new ArdourCanvas::GtkCanvas ();
- canvas->signal_size_allocate().connect (sigc::mem_fun(*this, &CrossfadeEditor::canvas_allocation));
- canvas->set_size_request (425, 200);
-
- toplevel = new ArdourCanvas::Rectangle (canvas->root());
- toplevel->set (ArdourCanvas::Rect (0, 0, 10, 10));
- toplevel->set_fill (true);
- toplevel->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorBase());
- toplevel->set_outline (false);
- toplevel->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
-
- fade[Out].line = new ArdourCanvas::PolyLine (canvas->root());
- fade[Out].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
-
- fade[Out].shading = new ArdourCanvas::Polygon (canvas->root());
- fade[Out].shading->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorLineShading());
-
- fade[In].line = new ArdourCanvas::PolyLine (canvas->root());
- fade[In].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
-
- fade[In].shading = new ArdourCanvas::Polygon (canvas->root());
- fade[In].shading->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorLineShading());
-
- fade[In].shading->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
- fade[In].line->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event));
- fade[Out].shading->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
- fade[Out].line->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event));
-
- select_in_button.set_name (X_("CrossfadeEditCurveButton"));
- select_out_button.set_name (X_("CrossfadeEditCurveButton"));
-
- select_in_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), In));
- select_out_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), Out));
-
- HBox* acbox = manage (new HBox);
-
- audition_box.set_border_width (7);
- audition_box.set_spacing (5);
- audition_box.set_homogeneous (false);
- audition_box.pack_start (audition_left_dry_button, false, false);
- audition_box.pack_start (audition_left_button, false, false);
- audition_box.pack_start (audition_both_button, false, false);
- audition_box.pack_start (audition_right_button, false, false);
- audition_box.pack_start (audition_right_dry_button, false, false);
-
- Frame* audition_frame = manage (new Frame (_("Audition")));
-
- audition_frame->set_name (X_("CrossfadeEditFrame"));
- audition_frame->add (audition_box);
-
- acbox->pack_start (*audition_frame, true, false);
-
- Frame* canvas_frame = manage (new Frame);
- canvas_frame->add (*canvas);
- canvas_frame->set_shadow_type (Gtk::SHADOW_IN);
-
- fade_in_table.attach (select_in_button, 0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND);
- fade_out_table.attach (select_out_button, 0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND);
-
- Image *pxmap;
- Button* pbutton;
- int row;
- int col;
-
- row = 1;
- col = 0;
-
- for (list<Preset*>::iterator i = fade_in_presets->begin(); i != fade_in_presets->end(); ++i) {
-
- pxmap = manage (new Image (::get_icon ((*i)->image_name)));
- pbutton = manage (new Button);
- pbutton->add (*pxmap);
- pbutton->set_name ("CrossfadeEditButton");
- pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
- ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, "");
- fade_in_table.attach (*pbutton, col, col+1, row, row+1);
- fade_in_buttons.push_back (pbutton);
-
- col++;
-
- if (col == 2) {
- col = 0;
- row++;
- }
- }
-
- row = 1;
- col = 0;
-
- for (list<Preset*>::iterator i = fade_out_presets->begin(); i != fade_out_presets->end(); ++i) {
-
- pxmap = manage (new Image (::get_icon ((*i)->image_name)));
- pbutton = manage (new Button);
- pbutton->add (*pxmap);
- pbutton->set_name ("CrossfadeEditButton");
- pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
- ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, "");
- fade_out_table.attach (*pbutton, col, col+1, row, row+1);
- fade_out_buttons.push_back (pbutton);
-
- col++;
-
- if (col == 2) {
- col = 0;
- row++;
- }
- }
-
- clear_button.set_name ("CrossfadeEditButton");
- revert_button.set_name ("CrossfadeEditButton");
- ok_button->set_name ("CrossfadeEditButton");
- cancel_button->set_name ("CrossfadeEditButton");
- preroll_button.set_name ("CrossfadeEditButton");
- postroll_button.set_name ("CrossfadeEditButton");
- audition_both_button.set_name ("CrossfadeEditAuditionButton");
- audition_left_dry_button.set_name ("CrossfadeEditAuditionButton");
- audition_left_button.set_name ("CrossfadeEditAuditionButton");
- audition_right_dry_button.set_name ("CrossfadeEditAuditionButton");
- audition_right_button.set_name ("CrossfadeEditAuditionButton");
-
- clear_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::clear));
- revert_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::reset));
- audition_both_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_toggled));
- audition_right_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_toggled));
- audition_right_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_dry_toggled));
- audition_left_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_toggled));
- audition_left_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_dry_toggled));
-
- roll_box.pack_start (preroll_button, false, false);
- roll_box.pack_start (postroll_button, false, false);
-
- Gtk::HBox* rcenter_box = manage (new HBox);
- rcenter_box->pack_start (roll_box, true, false);
-
- VBox* vpacker2 = manage (new (VBox));
-
- vpacker2->set_border_width (12);
- vpacker2->set_spacing (7);
- vpacker2->pack_start (*acbox, false, false);
- vpacker2->pack_start (*rcenter_box, false, false);
-
- curve_button_box.set_spacing (7);
- curve_button_box.pack_start (fade_out_table, false, false, 12);
- curve_button_box.pack_start (*vpacker2, false, false, 12);
- curve_button_box.pack_start (fade_in_table, false, false, 12);
-
- get_vbox()->pack_start (*canvas_frame, true, true);
- get_vbox()->pack_start (curve_button_box, false, false);
-
- /* button to allow hackers to check the actual curve values */
-
-// Button* foobut = manage (new Button ("dump"));
-// foobut-.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::dump));
-// vpacker.pack_start (*foobut, false, false);
-
- current = In;
- set (xfade->fade_in(), In);
-
- current = Out;
- set (xfade->fade_out(), Out);
-
- curve_select_clicked (In);
-
- xfade->PropertyChanged.connect (state_connection, invalidator (*this), boost::bind (&CrossfadeEditor::xfade_changed, this, _1), gui_context());
-
- _session->AuditionActive.connect (_session_connections, invalidator (*this), boost::bind (&CrossfadeEditor::audition_state_changed, this, _1), gui_context());
- show_all_children();
-}
-
-CrossfadeEditor::~CrossfadeEditor()
-{
- /* most objects will be destroyed when the toplevel window is. */
-
- for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
- delete *i;
- }
-
- for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
- delete *i;
- }
-
- delete _peaks_ready_connection;
-}
-
-void
-CrossfadeEditor::dump ()
-{
- for (AutomationList::iterator i = fade[Out].normative_curve.begin(); i != fade[Out].normative_curve.end(); ++i) {
- cerr << (*i)->when << ' ' << (*i)->value << endl;
- }
-}
-
-void
-CrossfadeEditor::audition_state_changed (bool yn)
-{
- ENSURE_GUI_THREAD (*this, &CrossfadeEditor::audition_state_changed, yn)
-
- if (!yn) {
- audition_both_button.set_active (false);
- audition_left_button.set_active (false);
- audition_right_button.set_active (false);
- audition_left_dry_button.set_active (false);
- audition_right_dry_button.set_active (false);
- }
-}
-
-void
-CrossfadeEditor::set (const ARDOUR::AutomationList& curve, WhichFade which)
-{
- double firstx, endx;
- ARDOUR::AutomationList::const_iterator the_end;
-
- for (list<Point*>::iterator i = fade[which].points.begin(); i != fade[which].points.end(); ++i) {
- delete *i;
- }
-
- fade[which].points.clear ();
- fade[which].gain_curve.clear ();
- fade[which].normative_curve.clear ();
-
- if (curve.empty()) {
- goto out;
- }
-
- the_end = curve.end();
- --the_end;
-
- firstx = (*curve.begin())->when;
- endx = (*the_end)->when;
-
- for (ARDOUR::AutomationList::const_iterator i = curve.begin(); i != curve.end(); ++i) {
-
- double xfract = ((*i)->when - firstx) / (endx - firstx);
- double yfract = ((*i)->value - miny) / (maxy - miny);
-
- Point* p = make_point ();
-
- p->move_to (x_coordinate (xfract), y_coordinate (yfract),
- xfract, yfract);
-
- fade[which].points.push_back (p);
- }
-
- /* no need to sort because curve is already time-ordered */
-
- out:
-
- swap (which, current);
- redraw ();
- swap (which, current);
-}
-
-bool
-CrossfadeEditor::curve_event (GdkEvent* event)
-{
- /* treat it like a toplevel event */
-
- return canvas_event (event);
-}
-
-bool
-CrossfadeEditor::point_event (GdkEvent* event, Point* point)
-{
-
- if (point->curve != fade[current].line) {
- return FALSE;
- }
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- point_grabbed = true;
- break;
- case GDK_BUTTON_RELEASE:
- point_grabbed = false;
-
- if (Keyboard::is_delete_event (&event->button)) {
- fade[current].points.remove (point);
- delete point;
- }
-
- redraw ();
- break;
-
- case GDK_MOTION_NOTIFY:
- if (point_grabbed) {
- double new_x, new_y;
-
- /* can't drag first or last points horizontally or vertically */
-
- if (point == fade[current].points.front() || point == fade[current].points.back()) {
- new_x = point->x;
- new_y = point->y;
- } else {
- new_x = (event->motion.x - canvas_border)/effective_width();
- new_y = 1.0 - ((event->motion.y - canvas_border)/effective_height());
- }
-
- point->move_to (x_coordinate (new_x), y_coordinate (new_y),
- new_x, new_y);
- redraw ();
- }
- break;
- default:
- break;
- }
- return TRUE;
-}
-
-bool
-CrossfadeEditor::canvas_event (GdkEvent* event)
-{
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- add_control_point ((event->button.x - canvas_border)/effective_width(),
- 1.0 - ((event->button.y - canvas_border)/effective_height()));
- return true;
- break;
- default:
- break;
- }
- return false;
-}
-
-CrossfadeEditor::Point::~Point()
-{
- delete box;
-}
-
-CrossfadeEditor::Point*
-CrossfadeEditor::make_point ()
-{
- Point* p = new Point;
-
- p->box = new ArdourCanvas::Rectangle (canvas->root());
- p->box->set_fill (true);
- p->box->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorPointFill());
- p->box->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorPointOutline());
-
- p->curve = fade[current].line;
-
- p->box->Event.connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::point_event), p));
-
- return p;
-}
-
-void
-CrossfadeEditor::add_control_point (double x, double y)
-{
- PointSorter cmp;
-
- /* enforce end point x location */
-
- if (fade[current].points.empty()) {
- x = 0.0;
- } else if (fade[current].points.size() == 1) {
- x = 1.0;
- }
-
- Point* p = make_point ();
-
- p->move_to (x_coordinate (x), y_coordinate (y), x, y);
-
- fade[current].points.push_back (p);
- fade[current].points.sort (cmp);
-
- redraw ();
-}
-
-void
-CrossfadeEditor::Point::move_to (double nx, double ny, double xfract, double yfract)
-{
- if ( xfract < 0.0 ) {
- xfract = 0.0;
- } else if ( xfract > 1.0 ) {
- xfract = 1.0;
- }
-
- if ( yfract < 0.0 ) {
- yfract = 0.0;
- } else if ( yfract > 1.0 ) {
- yfract = 1.0;
- }
-
- const double half_size = rint(size/2.0);
- double x1 = nx - half_size;
- double x2 = nx + half_size;
-
- box->set (ArdourCanvas::Rect (x1, ny - half_size, x2, ny + half_size));
-
- x = xfract;
- y = yfract;
-}
-
-void
-CrossfadeEditor::canvas_allocation (Gtk::Allocation& /*alloc*/)
-{
- if (toplevel) {
- toplevel->set (
- ArdourCanvas::Rect (
- 0,
- 0,
- canvas->get_allocation().get_width() + canvas_border,
- canvas->get_allocation().get_height() + canvas_border
- )
- );
- }
-
- /* XXX: CANVAS */
-// canvas->set_scroll_region (0.0, 0.0,
-// canvas->get_allocation().get_width(),
-// canvas->get_allocation().get_height());
-
- Point* end = make_point ();
- PointSorter cmp;
-
- if (fade[In].points.size() > 1) {
- Point* old_end = fade[In].points.back();
- fade[In].points.pop_back ();
- end->move_to (x_coordinate (old_end->x),
- y_coordinate (old_end->y),
- old_end->x, old_end->y);
- delete old_end;
- } else {
- double x = 1.0;
- double y = 0.5;
- end->move_to (x_coordinate (x), y_coordinate (y), x, y);
-
- }
-
- fade[In].points.push_back (end);
- fade[In].points.sort (cmp);
-
- for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
- (*i)->move_to (x_coordinate((*i)->x), y_coordinate((*i)->y),
- (*i)->x, (*i)->y);
- }
-
- end = make_point ();
-
- if (fade[Out].points.size() > 1) {
- Point* old_end = fade[Out].points.back();
- fade[Out].points.pop_back ();
- end->move_to (x_coordinate (old_end->x),
- y_coordinate (old_end->y),
- old_end->x, old_end->y);
- delete old_end;
- } else {
- double x = 1.0;
- double y = 0.5;
- end->move_to (x_coordinate (x), y_coordinate (y), x, y);
-
- }
-
- fade[Out].points.push_back (end);
- fade[Out].points.sort (cmp);
-
- for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
- (*i)->move_to (x_coordinate ((*i)->x),
- y_coordinate ((*i)->y),
- (*i)->x, (*i)->y);
- }
-
- WhichFade old_current = current;
- current = In;
- redraw ();
- current = Out;
- redraw ();
- current = old_current;
-
- double spu = xfade->length() / (double) effective_width();
-
- if (fade[In].waves.empty()) {
- make_waves (xfade->in(), In);
- }
-
- if (fade[Out].waves.empty()) {
- make_waves (xfade->out(), Out);
- }
-
- double ht;
- vector<ArdourCanvas::WaveView*>::iterator i;
- uint32_t n;
-
- ht = canvas->get_allocation().get_height() / xfade->in()->n_channels();
-
- for (n = 0, i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i, ++n) {
- double yoff;
-
- yoff = n * ht;
-
- (*i)->set_y_position (yoff);
- (*i)->set_height (ht);
- (*i)->set_samples_per_pixel (spu);
- }
-
- ht = canvas->get_allocation().get_height() / xfade->out()->n_channels();
-
- for (n = 0, i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i, ++n) {
- double yoff;
-
- yoff = n * ht;
-
- (*i)->set_y_position (yoff);
- (*i)->set_height (ht);
- (*i)->set_samples_per_pixel (spu);
- }
-
-}
-
-
-void
-CrossfadeEditor::xfade_changed (const PropertyChange&)
-{
- set (xfade->fade_in(), In);
- set (xfade->fade_out(), Out);
-}
-
-void
-CrossfadeEditor::redraw ()
-{
- if (canvas->get_allocation().get_width() < 2) {
- return;
- }
-
- framecnt_t len = xfade->length ();
-
- fade[current].normative_curve.clear ();
- fade[current].gain_curve.clear ();
-
- for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
- fade[current].normative_curve.add ((*i)->x, (*i)->y);
- double offset;
- if (current==In)
- offset = xfade->in()->start();
- else
- offset = xfade->out()->start()+xfade->out()->length()-xfade->length();
- fade[current].gain_curve.add (((*i)->x * len) + offset, (*i)->y);
- }
-
-
- size_t npoints = (size_t) effective_width();
- float vec[npoints];
-
- fade[current].normative_curve.curve().get_vector (0, 1.0, vec, npoints);
-
- ArdourCanvas::Points pts;
- ArdourCanvas::Points spts;
-
- while (pts.size() < npoints) {
- pts.push_back (ArdourCanvas::Duple (0,0));
- }
-
- while (spts.size() < npoints + 3) {
- spts.push_back (ArdourCanvas::Duple (0,0));
- }
-
- /* the shade coordinates *MUST* be in anti-clockwise order.
- */
-
- if (current == In) {
-
- /* lower left */
-
- spts[0].x = canvas_border;
- spts[0].y = effective_height() + canvas_border;
-
- /* lower right */
-
- spts[1].x = effective_width() + canvas_border;
- spts[1].y = effective_height() + canvas_border;
-
- /* upper right */
-
- spts[2].x = effective_width() + canvas_border;
- spts[2].y = canvas_border;
-
-
- } else {
-
- /* upper left */
-
- spts[0].x = canvas_border;
- spts[0].y = canvas_border;
-
- /* lower left */
-
- spts[1].x = canvas_border;
- spts[1].y = effective_height() + canvas_border;
-
- /* lower right */
-
- spts[2].x = effective_width() + canvas_border;
- spts[2].y = effective_height() + canvas_border;
-
- }
-
- size_t last_spt = (npoints + 3) - 1;
-
- for (size_t i = 0; i < npoints; ++i) {
-
- double y = vec[i];
-
- pts[i].x = canvas_border + i;
- pts[i].y = y_coordinate (y);
-
- spts[last_spt - i].x = canvas_border + i;
- spts[last_spt - i].y = pts[i].y;
- }
-
- fade[current].line->set (pts);
- fade[current].shading->set (pts);
-
- for (vector<ArdourCanvas::WaveView*>::iterator i = fade[current].waves.begin(); i != fade[current].waves.end(); ++i) {
- (*i)->property_gain_src() = static_cast<Evoral::Curve*>(&fade[current].gain_curve.curve());
- }
-}
-
-void
-CrossfadeEditor::apply_preset (Preset *preset)
-{
-
- WhichFade wf = find(fade_in_presets->begin(), fade_in_presets->end(), preset) != fade_in_presets->end() ? In : Out;
-
- if (current != wf) {
-
- if (wf == In) {
- select_in_button.clicked();
- } else {
- select_out_button.clicked();
- }
-
- curve_select_clicked (wf);
- }
-
- for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
- delete *i;
- }
-
- fade[current].points.clear ();
-
- for (Preset::iterator i = preset->begin(); i != preset->end(); ++i) {
- Point* p = make_point ();
- p->move_to (x_coordinate ((*i).x), y_coordinate ((*i).y),
- (*i).x, (*i).y);
- fade[current].points.push_back (p);
- }
-
- redraw ();
-}
-
-void
-CrossfadeEditor::apply ()
-{
- the_editor().begin_reversible_command (_("Edit crossfade"));
-
- XMLNode& before = xfade->get_state ();
-
- _apply_to (xfade);
-
- _session->add_command (
- new MementoCommand<Crossfade> (
- new ARDOUR::CrossfadeBinder (_session->playlists, xfade->id ()),
- &before, &xfade->get_state ()
- )
- );
-
- the_editor().commit_reversible_command ();
-}
-
-void
-CrossfadeEditor::_apply_to (boost::shared_ptr<Crossfade> xf)
-{
- ARDOUR::AutomationList& in (xf->fade_in());
- ARDOUR::AutomationList& out (xf->fade_out());
-
- /* IN */
-
-
- ARDOUR::AutomationList::const_iterator the_end = in.end();
- --the_end;
-
- double firstx = (*in.begin())->when;
- double endx = (*the_end)->when;
-
- in.freeze ();
- in.clear ();
-
- for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
-
- double when = firstx + ((*i)->x * (endx - firstx));
- double value = (*i)->y;
- in.add (when, value);
- }
-
- /* OUT */
-
- the_end = out.end();
- --the_end;
-
- firstx = (*out.begin())->when;
- endx = (*the_end)->when;
-
- out.freeze ();
- out.clear ();
-
- for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
-
- double when = firstx + ((*i)->x * (endx - firstx));
- double value = (*i)->y;
- out.add (when, value);
- }
-
- in.thaw ();
- out.thaw ();
-}
-
-void
-CrossfadeEditor::setup (boost::shared_ptr<Crossfade> xfade)
-{
- _apply_to (xfade);
- xfade->set_active (true);
- xfade->fade_in().curve().solve ();
- xfade->fade_out().curve().solve ();
-}
-
-void
-CrossfadeEditor::clear ()
-{
- for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
- delete *i;
- }
-
- fade[current].points.clear ();
-
- redraw ();
-}
-
-void
-CrossfadeEditor::reset ()
-{
- set (xfade->fade_in(), In);
- set (xfade->fade_out(), Out);
-
- curve_select_clicked (current);
-}
-
-void
-CrossfadeEditor::build_presets ()
-{
- Preset* p;
-
- fade_in_presets = new Presets;
- fade_out_presets = new Presets;
-
- /* FADE IN */
-
- p = new Preset ("Linear (-6dB)", "fadein-linear");
- p->push_back (PresetPoint (0.000000, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.166667, 0.166366));
- p->push_back (PresetPoint (0.333333, 0.332853));
- p->push_back (PresetPoint (0.500000, 0.499459));
- p->push_back (PresetPoint (0.666667, 0.666186));
- p->push_back (PresetPoint (0.833333, 0.833033));
- p->push_back (PresetPoint (1.000000, GAIN_COEFF_UNITY));
- fade_in_presets->push_back (p);
-
- p = new Preset ("S(1)-curve", "fadein-S1");
- p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.1, 0.01));
- p->push_back (PresetPoint (0.2, 0.03));
- p->push_back (PresetPoint (0.8, 0.97));
- p->push_back (PresetPoint (0.9, 0.99));
- p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
- fade_in_presets->push_back (p);
-
- p = new Preset ("S(2)-curve", "fadein-S2");
- p->push_back (PresetPoint (0.0, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.055, 0.222));
- p->push_back (PresetPoint (0.163, 0.35));
- p->push_back (PresetPoint (0.837, 0.678));
- p->push_back (PresetPoint (0.945, 0.783));
- p->push_back (PresetPoint (1.0, GAIN_COEFF_UNITY));
- fade_in_presets->push_back (p);
-
- p = new Preset ("Constant power (-3dB)", "fadein-constant-power");
-
- p->push_back (PresetPoint (0.000000, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.166667, 0.282192));
- p->push_back (PresetPoint (0.333333, 0.518174));
- p->push_back (PresetPoint (0.500000, 0.707946));
- p->push_back (PresetPoint (0.666667, 0.851507));
- p->push_back (PresetPoint (0.833333, 0.948859));
- p->push_back (PresetPoint (1.000000, GAIN_COEFF_UNITY));
-
- fade_in_presets->push_back (p);
-
- if (!Profile->get_sae()) {
-
- p = new Preset ("Short cut", "fadein-short-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.389401, 0.0333333));
- p->push_back (PresetPoint (0.629032, 0.0861111));
- p->push_back (PresetPoint (0.829493, 0.233333));
- p->push_back (PresetPoint (0.9447, 0.483333));
- p->push_back (PresetPoint (0.976959, 0.697222));
- p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
- fade_in_presets->push_back (p);
-
- p = new Preset ("Slow cut", "fadein-slow-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.304147, 0.0694444));
- p->push_back (PresetPoint (0.529954, 0.152778));
- p->push_back (PresetPoint (0.725806, 0.333333));
- p->push_back (PresetPoint (0.847926, 0.558333));
- p->push_back (PresetPoint (0.919355, 0.730556));
- p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
- fade_in_presets->push_back (p);
-
- p = new Preset ("Fast cut", "fadein-fast-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.0737327, 0.308333));
- p->push_back (PresetPoint (0.246544, 0.658333));
- p->push_back (PresetPoint (0.470046, 0.886111));
- p->push_back (PresetPoint (0.652074, 0.972222));
- p->push_back (PresetPoint (0.771889, 0.988889));
- p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
- fade_in_presets->push_back (p);
-
- p = new Preset ("Long cut", "fadein-long-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
- p->push_back (PresetPoint (0.0207373, 0.197222));
- p->push_back (PresetPoint (0.0645161, 0.525));
- p->push_back (PresetPoint (0.152074, 0.802778));
- p->push_back (PresetPoint (0.276498, 0.919444));
- p->push_back (PresetPoint (0.481567, 0.980556));
- p->push_back (PresetPoint (0.767281, 1));
- p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
- fade_in_presets->push_back (p);
- }
-
- /* FADE OUT */
-
- // p = new Preset ("regout.xpm");
- p = new Preset ("Linear (-6dB cut)", "fadeout-linear");
- p->push_back (PresetPoint (0.000000, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.166667, 0.833033));
- p->push_back (PresetPoint (0.333333, 0.666186));
- p->push_back (PresetPoint (0.500000, 0.499459));
- p->push_back (PresetPoint (0.666667, 0.332853));
- p->push_back (PresetPoint (0.833333, 0.166366));
- p->push_back (PresetPoint (1.000000, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- p = new Preset ("S(1)-Curve", "fadeout-S1");
- p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.1, 0.99));
- p->push_back (PresetPoint (0.2, 0.97));
- p->push_back (PresetPoint (0.8, 0.03));
- p->push_back (PresetPoint (0.9, 0.01));
- p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- p = new Preset ("S(2)-Curve", "fadeout-S2");
- p->push_back (PresetPoint (0.0, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.163, 0.678));
- p->push_back (PresetPoint (0.055, 0.783));
- p->push_back (PresetPoint (0.837, 0.35));
- p->push_back (PresetPoint (0.945, 0.222));
- p->push_back (PresetPoint (1.0, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- // p = new Preset ("linout.xpm");
- p = new Preset ("Constant power (-3dB cut)", "fadeout-constant-power");
- p->push_back (PresetPoint (0.000000, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.166667, 0.948859));
- p->push_back (PresetPoint (0.333333, 0.851507));
- p->push_back (PresetPoint (0.500000, 0.707946));
- p->push_back (PresetPoint (0.666667, 0.518174));
- p->push_back (PresetPoint (0.833333, 0.282192));
- p->push_back (PresetPoint (1.000000, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- if (!Profile->get_sae()) {
- // p = new Preset ("hiout.xpm");
- p = new Preset ("Short cut", "fadeout-short-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.305556, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.548611, 0.991736));
- p->push_back (PresetPoint (0.759259, 0.931129));
- p->push_back (PresetPoint (0.918981, 0.68595));
- p->push_back (PresetPoint (0.976852, 0.22865));
- p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- p = new Preset ("Slow cut", "fadeout-slow-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.228111, 0.988889));
- p->push_back (PresetPoint (0.347926, 0.972222));
- p->push_back (PresetPoint (0.529954, 0.886111));
- p->push_back (PresetPoint (0.753456, 0.658333));
- p->push_back (PresetPoint (0.9262673, 0.308333));
- p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- p = new Preset ("Fast cut", "fadeout-fast-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.080645, 0.730556));
- p->push_back (PresetPoint (0.277778, 0.289256));
- p->push_back (PresetPoint (0.470046, 0.152778));
- p->push_back (PresetPoint (0.695853, 0.0694444));
- p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- // p = new Preset ("loout.xpm");
- p = new Preset ("Long cut", "fadeout-long-cut");
- p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
- p->push_back (PresetPoint (0.023041, 0.697222));
- p->push_back (PresetPoint (0.0553, 0.483333));
- p->push_back (PresetPoint (0.170507, 0.233333));
- p->push_back (PresetPoint (0.370968, 0.0861111));
- p->push_back (PresetPoint (0.610599, 0.0333333));
- p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
- fade_out_presets->push_back (p);
-
- }
-}
-
-void
-CrossfadeEditor::curve_select_clicked (WhichFade wf)
-{
- current = wf;
-
- if (wf == In) {
-
- for (vector<ArdourCanvas::WaveView*>::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) {
- (*i)->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
- (*i)->set_fill_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
- }
-
- for (vector<ArdourCanvas::WaveView*>::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) {
- (*i)->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorWave());
- (*i)->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorWave());
- }
-
- fade[In].line->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorLine());
- fade[Out].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
- fade[Out].shading->hide();
- fade[In].shading->show();
-
- for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
- (*i)->box->hide();
- }
-
- for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
- (*i)->box->show ();
- }
-
- } else {
-
- for (vector<ArdourCanvas::WaveView*>::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) {
- (*i)->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorWave());
- (*i)->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorWave());
- }
-
- for (vector<ArdourCanvas::WaveView*>::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) {
- (*i)->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
- (*i)->set_fill_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
- }
-
- fade[Out].line->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorLine());
- fade[In].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
- fade[In].shading->hide();
- fade[Out].shading->show();
-
- for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
- (*i)->box->hide();
- }
-
- for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
- (*i)->box->show();
- }
-
- }
-}
-
-double
-CrossfadeEditor::x_coordinate (double& xfract) const
-{
- xfract = min (1.0, xfract);
- xfract = max (0.0, xfract);
-
- return canvas_border + (xfract * effective_width());
-}
-
-double
-CrossfadeEditor::y_coordinate (double& yfract) const
-{
- yfract = min (1.0, yfract);
- yfract = max (0.0, yfract);
-
- return (canvas->get_allocation().get_height() - (canvas_border)) - (yfract * effective_height());
-}
-
-void
-CrossfadeEditor::make_waves (boost::shared_ptr<AudioRegion> region, WhichFade which)
-{
- gdouble ht;
- uint32_t nchans = region->n_channels();
- guint32 color;
- double spu;
-
- if (which == In) {
- color = UIConfiguration::instance().get_SelectedCrossfadeEditorWave();
- } else {
- color = UIConfiguration::instance().get_CrossfadeEditorWave();
- }
-
- ht = canvas->get_allocation().get_height() / (double) nchans;
- spu = xfade->length() / (double) effective_width();
-
- delete _peaks_ready_connection;
- _peaks_ready_connection = 0;
-
- for (uint32_t n = 0; n < nchans; ++n) {
-
- gdouble yoff = n * ht;
-
- if (region->audio_source(n)->peaks_ready (boost::bind (&CrossfadeEditor::peaks_ready, this, boost::weak_ptr<AudioRegion>(region), which), &_peaks_ready_connection, gui_context())) {
- ArdourCanvas::WaveView* waveview = new ArdourCanvas::WaveView (canvas->root(), region);
-
- waveview->set_channel (n);
- waveview->property_gain_function() = (void*) curve_get_vector_from_c;
- waveview->property_gain_src() = static_cast<Evoral::Curve*>(&fade[which].gain_curve.curve());
- waveview->set_x_position (canvas_border);
- waveview->set_y_position (yoff);
- waveview->set_height (ht);
- waveview->set_samples_per_pixel (spu);
- waveview->property_amplitude_above_axis() = 2.0;
- waveview->set_outline_color (color);
- waveview->set_fill_color (color);
-
- if (which != In) {
- waveview->set_region_start (region->start() + region->length() - xfade->length());
- }
-
- waveview->lower_to_bottom();
- fade[which].waves.push_back (waveview);
- }
- }
-
- toplevel->lower_to_bottom();
-}
-
-void
-CrossfadeEditor::peaks_ready (boost::weak_ptr<AudioRegion> wr, WhichFade which)
-{
- boost::shared_ptr<AudioRegion> r (wr.lock());
-
- if (!r) {
- return;
- }
-
- /* this should never be called, because the peak files for an xfade
- will be ready by the time we want them. but our API forces us
- to provide this, so ..
- */
- delete _peaks_ready_connection;
- _peaks_ready_connection = 0;
-
- make_waves (r, which);
-}
-
-void
-CrossfadeEditor::audition (Audition which)
-{
- AudioPlaylist& pl (_session->the_auditioner()->prepare_playlist());
- framecnt_t preroll;
- framecnt_t postroll;
- framecnt_t left_start_offset;
- framecnt_t right_length;
- framecnt_t left_length;
-
- if (which != Right && preroll_button.get_active()) {
- preroll = _session->frame_rate() * 2; //2 second hardcoded preroll for now
- } else {
- preroll = 0;
- }
-
- if (which != Left && postroll_button.get_active()) {
- postroll = _session->frame_rate() * 2; //2 second hardcoded postroll for now
- } else {
- postroll = 0;
- }
-
- // Is there enough data for the whole preroll?
- left_length = xfade->length();
- if ((left_start_offset = xfade->out()->length() - xfade->length()) > preroll) {
- left_start_offset -= preroll;
- } else {
- preroll = left_start_offset;
- left_start_offset = 0;
- }
- left_length += preroll;
-
- // Is there enough data for the whole postroll?
- right_length = xfade->length();
- if ((xfade->in()->length() - right_length) > postroll) {
- right_length += postroll;
- } else {
- right_length = xfade->in()->length();
- }
-
- PropertyList left_plist;
- PropertyList right_plist;
-
-
- left_plist.add (ARDOUR::Properties::start, left_start_offset);
- left_plist.add (ARDOUR::Properties::length, left_length);
- left_plist.add (ARDOUR::Properties::name, string ("xfade out"));
- left_plist.add (ARDOUR::Properties::layer, 0);
- left_plist.add (ARDOUR::Properties::fade_in_active, true);
-
- right_plist.add (ARDOUR::Properties::start, 0);
- right_plist.add (ARDOUR::Properties::length, right_length);
- right_plist.add (ARDOUR::Properties::name, string("xfade in"));
- right_plist.add (ARDOUR::Properties::layer, 0);
- right_plist.add (ARDOUR::Properties::fade_out_active, true);
-
- if (which == Left) {
- right_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f);
- } else if (which == Right) {
- left_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f);
- }
-
- boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion>
- (RegionFactory::create (xfade->out(), left_plist, false)));
- boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion>
- (RegionFactory::create (xfade->in(), right_plist, false)));
-
- // apply a 20ms declicking fade at the start and end of auditioning
- // XXX this should really be a property
-
- left->set_fade_in_length (_session->frame_rate() / 50);
- right->set_fade_out_length (_session->frame_rate() / 50);
-
- pl.add_region (left, 0);
- pl.add_region (right, 1 + preroll);
-
- /* there is only one ... */
- pl.foreach_crossfade (sigc::mem_fun (*this, &CrossfadeEditor::setup));
-
- _session->audition_playlist ();
-}
-
-void
-CrossfadeEditor::audition_both ()
-{
- audition (Both);
-}
-
-void
-CrossfadeEditor::audition_left_dry ()
-{
- PropertyList plist;
-
- plist.add (ARDOUR::Properties::start, xfade->out()->length() - xfade->length());
- plist.add (ARDOUR::Properties::length, xfade->length());
- plist.add (ARDOUR::Properties::name, string("xfade left"));
- plist.add (ARDOUR::Properties::layer, 0);
-
- boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion>
- (RegionFactory::create (xfade->out(), plist, false)));
-
- _session->audition_region (left);
-}
-
-void
-CrossfadeEditor::audition_left ()
-{
- audition (Left);
-}
-
-void
-CrossfadeEditor::audition_right_dry ()
-{
- PropertyList plist;
-
- plist.add (ARDOUR::Properties::start, 0);
- plist.add (ARDOUR::Properties::length, xfade->length());
- plist.add (ARDOUR::Properties::name, string ("xfade right"));
- plist.add (ARDOUR::Properties::layer, 0);
-
- boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion>
- (RegionFactory::create (xfade->in(), plist, false)));
-
- _session->audition_region (right);
-}
-
-void
-CrossfadeEditor::audition_right ()
-{
- audition (Right);
-}
-
-void
-CrossfadeEditor::cancel_audition ()
-{
- _session->cancel_audition ();
-}
-
-void
-CrossfadeEditor::audition_toggled ()
-{
- bool x;
-
- if ((x = audition_both_button.get_active ()) != _session->is_auditioning()) {
-
- if (x) {
- audition_both ();
- } else {
- cancel_audition ();
- }
- }
-}
-
-void
-CrossfadeEditor::audition_right_toggled ()
-{
- bool x;
-
- if ((x = audition_right_button.get_active ()) != _session->is_auditioning()) {
-
- if (x) {
- audition_right ();
- } else {
- cancel_audition ();
- }
- }
-}
-
-void
-CrossfadeEditor::audition_right_dry_toggled ()
-{
- bool x;
-
- if ((x = audition_right_dry_button.get_active ()) != _session->is_auditioning()) {
-
- if (x) {
- audition_right_dry ();
- } else {
- cancel_audition ();
- }
- }
-}
-
-void
-CrossfadeEditor::audition_left_toggled ()
-{
- bool x;
-
- if ((x = audition_left_button.get_active ()) != _session->is_auditioning()) {
-
- if (x) {
- audition_left ();
- } else {
- cancel_audition ();
- }
- }
-}
-
-void
-CrossfadeEditor::audition_left_dry_toggled ()
-{
- bool x;
-
- if ((x = audition_left_dry_button.get_active ()) != _session->is_auditioning()) {
-
- if (x) {
- audition_left_dry ();
- } else {
- cancel_audition ();
- }
- }
-}
-
-bool
-CrossfadeEditor::on_key_press_event (GdkEventKey */*ev*/)
-{
- return true;
-}
-
-bool
-CrossfadeEditor::on_key_release_event (GdkEventKey* ev)
-{
- switch (ev->keyval) {
- case GDK_Right:
- if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
- audition_right_dry_button.set_active (!audition_right_dry_button.get_active());
- } else {
- audition_right_button.set_active (!audition_right_button.get_active());
- }
- break;
-
- case GDK_Left:
- if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
- audition_left_dry_button.set_active (!audition_left_dry_button.get_active());
- } else {
- audition_left_button.set_active (!audition_left_button.get_active());
- }
- break;
-
- case GDK_space:
- if (_session->is_auditioning()) {
- cancel_audition ();
- } else {
- audition_both_button.set_active (!audition_both_button.get_active());
- }
- break;
-
- default:
- break;
- }
-
- return true;
-}
diff --git a/gtk2_ardour/dark.colors b/gtk2_ardour/dark.colors
deleted file mode 100644
index 2cdc39d..0000000
--- a/gtk2_ardour/dark.colors
+++ /dev/null
@@ -1,512 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Ardour>
- <Colors>
- <Color name="color 1" value="0x20b2b2ff"/>
- <Color name="color 10" value="0xf0f0f0ff"/>
- <Color name="color 100" value="0xe49c9cff"/>
- <Color name="color 101" value="0xa06000ff"/>
- <Color name="color 103" value="0x1e7727ff"/>
- <Color name="color 104" value="0x7f7f7fff"/>
- <Color name="color 11" value="0x9496a3ff"/>
- <Color name="color 12" value="0x18ab27ff"/>
- <Color name="color 13" value="0xffffffff"/>
- <Color name="color 14" value="0x55ccccff"/>
- <Color name="color 15" value="0x282b49ff"/>
- <Color name="color 16" value="0x526d94ff"/>
- <Color name="color 17" value="0x00ff1aff"/>
- <Color name="color 18" value="0x001affff"/>
- <Color name="color 19" value="0xdd6363ff"/>
- <Color name="color 2" value="0x595959ff"/>
- <Color name="color 20" value="0x684d4dff"/>
- <Color name="color 21" value="0x969696ff"/>
- <Color name="color 22" value="0xe5e5e5ff"/>
- <Color name="color 23" value="0x8000ffff"/>
- <Color name="color 24" value="0x9fbca2ff"/>
- <Color name="color 25" value="0x4a4a4aff"/>
- <Color name="color 26" value="0xc7c9d8ff"/>
- <Color name="color 27" value="0x191919ff"/>
- <Color name="color 28" value="0x5d3e7cff"/>
- <Color name="color 29" value="0x202020ff"/>
- <Color name="color 3" value="0x738299ff"/>
- <Color name="color 30" value="0xe500cfff"/>
- <Color name="color 31" value="0xddddd8ff"/>
- <Color name="color 32" value="0xeddc3d77"/>
- <Color name="color 33" value="0xbbbbbbff"/>
- <Color name="color 34" value="0x3d3d3dff"/>
- <Color name="color 35" value="0x4250d0ff"/>
- <Color name="color 36" value="0x473212ff"/>
- <Color name="color 37" value="0x67cb4eff"/>
- <Color name="color 38" value="0x1ee8acff"/>
- <Color name="color 39" value="0x35965cff"/>
- <Color name="color 4" value="0x000000ff"/>
- <Color name="color 40" value="0x7c3a3aff"/>
- <Color name="color 41" value="0x497a5dff"/>
- <Color name="color 42" value="0x404145ff"/>
- <Color name="color 43" value="0x000424ff"/>
- <Color name="color 44" value="0x004f08ff"/>
- <Color name="color 45" value="0xa29e9eff"/>
- <Color name="color 46" value="0x333333ff"/>
- <Color name="color 47" value="0x00880eff"/>
- <Color name="color 48" value="0x00aa11ff"/>
- <Color name="color 49" value="0x00660aff"/>
- <Color name="color 5" value="0x9dadc4ff"/>
- <Color name="color 50" value="0xeeeeecff"/>
- <Color name="color 51" value="0x383d37ff"/>
- <Color name="color 52" value="0xe8faa1ff"/>
- <Color name="color 53" value="0xf2c37dff"/>
- <Color name="color 54" value="0xf48352ff"/>
- <Color name="color 55" value="0xf85813ff"/>
- <Color name="color 56" value="0x8ec794ff"/>
- <Color name="color 57" value="0x7ea854ff"/>
- <Color name="color 58" value="0x474f3fff"/>
- <Color name="color 59" value="0xb2baffff"/>
- <Color name="color 6" value="0x44bc50ff"/>
- <Color name="color 60" value="0x50545aff"/>
- <Color name="color 61" value="0x20242aff"/>
- <Color name="color 62" value="0x8894ffff"/>
- <Color name="color 63" value="0x5566ffff"/>
- <Color name="color 64" value="0xa7acd4ff"/>
- <Color name="color 65" value="0xb8cca3ff"/>
- <Color name="color 66" value="0x4f2f00ff"/>
- <Color name="color 67" value="0x121212ff"/>
- <Color name="color 68" value="0xc57805ff"/>
- <Color name="color 69" value="0x660000ff"/>
- <Color name="color 7" value="0x282828ff"/>
- <Color name="color 70" value="0x304057ff"/>
- <Color name="color 71" value="0x5f5a58ff"/>
- <Color name="color 72" value="0xe58b05ff"/>
- <Color name="color 73" value="0x3240c0ff"/>
- <Color name="color 74" value="0x7a9bccff"/>
- <Color name="color 75" value="0xbba900ff"/>
- <Color name="color 76" value="0x6c6e6aff"/>
- <Color name="color 77" value="0x7aadf9ff"/>
- <Color name="color 78" value="0x256f8fff"/>
- <Color name="color 79" value="0x254528ff"/>
- <Color name="color 8" value="0xff9900ff"/>
- <Color name="color 80" value="0x603535ff"/>
- <Color name="color 81" value="0xa5a5a5ff"/>
- <Color name="color 82" value="0xd8d8d8ff"/>
- <Color name="color 83" value="0xa80000ff"/>
- <Color name="color 84" value="0x7b354aff"/>
- <Color name="color 85" value="0xffa3bfff"/>
- <Color name="color 86" value="0xcc2828ff"/>
- <Color name="color 87" value="0x505050ff"/>
- <Color name="color 88" value="0xc6c6c6ff"/>
- <Color name="color 89" value="0xb6e8fdff"/>
- <Color name="color 9" value="0xf10000ff"/>
- <Color name="color 90" value="0x2c2121ff"/>
- <Color name="color 91" value="0x8ef823ff"/>
- <Color name="color 92" value="0x8cd8f8ff"/>
- <Color name="color 93" value="0x51578aff"/>
- <Color name="color 94" value="0x636363ff"/>
- <Color name="color 95" value="0xe4f4d3ff"/>
- <Color name="color 96" value="0x85e524ff"/>
- <Color name="color 97" value="0xccccccff"/>
- <Color name="color 98" value="0x9e00ffff"/>
- <Color name="color 99" value="0x5da3c1ff"/>
- <Color name="meter color0" value="0x008800ff"/>
- <Color name="meter color1" value="0x00aa00ff"/>
- <Color name="meter color2" value="0x00ff00ff"/>
- <Color name="meter color3" value="0x00ff00ff"/>
- <Color name="meter color4" value="0xfff000ff"/>
- <Color name="meter color5" value="0xfff000ff"/>
- <Color name="meter color6" value="0xff8800ff"/>
- <Color name="meter color7" value="0xff8800ff"/>
- <Color name="meter color8" value="0xff0000ff"/>
- <Color name="meter color9" value="0xff0000ff"/>
- </Colors>
- <ColorAliases>
- <ColorAlias name="active crossfade" alias="color 1"/>
- <ColorAlias name="arrange base" alias="color 34"/>
- <ColorAlias name="audio automation track fill" alias="color 70"/>
- <ColorAlias name="audio bus base" alias="color 3"/>
- <ColorAlias name="audio master bus base" alias="color 4"/>
- <ColorAlias name="audio track base" alias="color 77"/>
- <ColorAlias name="automation line" alias="color 6"/>
- <ColorAlias name="automation track outline" alias="color 7"/>
- <ColorAlias name="big clock active: background" alias="color 4"/>
- <ColorAlias name="big clock active: cursor" alias="color 8"/>
- <ColorAlias name="big clock active: edited text" alias="color 8"/>
- <ColorAlias name="big clock active: text" alias="color 9"/>
- <ColorAlias name="big clock: background" alias="color 67"/>
- <ColorAlias name="big clock: cursor" alias="color 8"/>
- <ColorAlias name="big clock: edited text" alias="color 8"/>
- <ColorAlias name="big clock: text" alias="color 10"/>
- <ColorAlias name="border color" alias="color 4"/>
- <ColorAlias name="cd marker bar" alias="color 87"/>
- <ColorAlias name="clipped waveform" alias="color 9"/>
- <ColorAlias name="clock: background" alias="color 67"/>
- <ColorAlias name="clock: cursor" alias="color 8"/>
- <ColorAlias name="clock: edited text" alias="color 8"/>
- <ColorAlias name="clock: text" alias="color 12"/>
- <ColorAlias name="control point fill" alias="color 17"/>
- <ColorAlias name="control point outline" alias="meter color3"/>
- <ColorAlias name="control point selected fill" alias="color 72"/>
- <ColorAlias name="control point selected outline" alias="color 9"/>
- <ColorAlias name="covered region" alias="color 87"/>
- <ColorAlias name="crossfade editor base" alias="color 15"/>
- <ColorAlias name="crossfade editor line" alias="color 4"/>
- <ColorAlias name="crossfade editor line shading" alias="color 16"/>
- <ColorAlias name="crossfade editor point fill" alias="color 17"/>
- <ColorAlias name="crossfade editor point outline" alias="color 18"/>
- <ColorAlias name="crossfade editor wave" alias="color 13"/>
- <ColorAlias name="crossfade line" alias="color 4"/>
- <ColorAlias name="edit point" alias="color 18"/>
- <ColorAlias name="entered automation line" alias="color 19"/>
- <ColorAlias name="entered gain line" alias="color 19"/>
- <ColorAlias name="entered marker" alias="color 19"/>
- <ColorAlias name="feedback alert: fill" alias="color 20"/>
- <ColorAlias name="feedback alert: fill active" alias="color 9"/>
- <ColorAlias name="feedback alert: led active" alias="color 4"/>
- <ColorAlias name="frame handle" alias="color 23"/>
- <ColorAlias name="gain line" alias="color 6"/>
- <ColorAlias name="gain line inactive" alias="color 24"/>
- <ColorAlias name="generic button: fill" alias="color 25"/>
- <ColorAlias name="generic button: fill active" alias="color 9"/>
- <ColorAlias name="generic button: led active" alias="color 18"/>
- <ColorAlias name="ghost track base" alias="color 46"/>
- <ColorAlias name="ghost track midi outline" alias="color 4"/>
- <ColorAlias name="ghost track wave" alias="color 29"/>
- <ColorAlias name="ghost track wave clip" alias="color 29"/>
- <ColorAlias name="ghost track wave fill" alias="color 29"/>
- <ColorAlias name="ghost track zero line" alias="color 30"/>
- <ColorAlias name="gtk_arm" alias="color 9"/>
- <ColorAlias name="gtk_audio_bus" alias="color 61"/>
- <ColorAlias name="gtk_audio_track" alias="color 70"/>
- <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
- <ColorAlias name="gtk_background" alias="color 34"/>
- <ColorAlias name="gtk_bases" alias="color 27"/>
- <ColorAlias name="gtk_bg_selected" alias="color 99"/>
- <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
- <ColorAlias name="gtk_bright_color" alias="color 74"/>
- <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
- <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
- <ColorAlias name="gtk_control_base" alias="color 61"/>
- <ColorAlias name="gtk_control_text" alias="color 26"/>
- <ColorAlias name="gtk_control_text2" alias="color 83"/>
- <ColorAlias name="gtk_darkest" alias="color 67"/>
- <ColorAlias name="gtk_fg_selected" alias="color 67"/>
- <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
- <ColorAlias name="gtk_foreground" alias="color 50"/>
- <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
- <ColorAlias name="gtk_lightest" alias="color 13"/>
- <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
- <ColorAlias name="gtk_midi_track" alias="color 58"/>
- <ColorAlias name="gtk_monitor" alias="color 8"/>
- <ColorAlias name="gtk_mono" alias="color 95"/>
- <ColorAlias name="gtk_mute" alias="color 52"/>
- <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
- <ColorAlias name="gtk_processor_fader" alias="color 94"/>
- <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
- <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
- <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
- <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
- <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
- <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
- <ColorAlias name="gtk_send_bg" alias="color 38"/>
- <ColorAlias name="gtk_send_fg" alias="color 24"/>
- <ColorAlias name="gtk_solo" alias="color 91"/>
- <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
- <ColorAlias name="gtk_texts" alias="color 50"/>
- <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
- <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
- <ColorAlias name="image track" alias="color 31"/>
- <ColorAlias name="inactive crossfade" alias="color 32"/>
- <ColorAlias name="inactive fade handle" alias="color 33"/>
- <ColorAlias name="inactive group tab" alias="color 34"/>
- <ColorAlias name="invert button: fill active" alias="color 35"/>
- <ColorAlias name="invert button: led active" alias="color 37"/>
- <ColorAlias name="location cd marker" alias="color 38"/>
- <ColorAlias name="location loop" alias="color 39"/>
- <ColorAlias name="location marker" alias="color 32"/>
- <ColorAlias name="location punch" alias="color 40"/>
- <ColorAlias name="location range" alias="color 41"/>
- <ColorAlias name="lock button: fill active" alias="color 42"/>
- <ColorAlias name="lock button: led active" alias="color 4"/>
- <ColorAlias name="marker bar" alias="color 2"/>
- <ColorAlias name="marker bar separator" alias="color 27"/>
- <ColorAlias name="marker drag line" alias="color 44"/>
- <ColorAlias name="marker label" alias="color 4"/>
- <ColorAlias name="marker track" alias="color 31"/>
- <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
- <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
- <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
- <ColorAlias name="measure line bar" alias="color 13"/>
- <ColorAlias name="measure line beat" alias="color 33"/>
- <ColorAlias name="meter background bottom" alias="color 46"/>
- <ColorAlias name="meter background top" alias="color 34"/>
- <ColorAlias name="meter bar" alias="color 7"/>
- <ColorAlias name="meter color BBC" alias="color 8"/>
- <ColorAlias name="meter marker" alias="color 19"/>
- <ColorAlias name="meterbridge label: fill" alias="color 34"/>
- <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
- <ColorAlias name="meterbridge label: led" alias="color 9"/>
- <ColorAlias name="meterbridge label: led active" alias="color 9"/>
- <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
- <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
- <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
- <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
- <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
- <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
- <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
- <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
- <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
- <ColorAlias name="meterstrip vu bg" alias="color 32"/>
- <ColorAlias name="meterstrip vu fg" alias="color 4"/>
- <ColorAlias name="midi automation track fill" alias="color 58"/>
- <ColorAlias name="midi bus base" alias="color 4"/>
- <ColorAlias name="midi device: fill" alias="color 25"/>
- <ColorAlias name="midi device: fill active" alias="color 42"/>
- <ColorAlias name="midi device: led active" alias="color 17"/>
- <ColorAlias name="midi frame base" alias="color 87"/>
- <ColorAlias name="midi input button: fill active" alias="color 48"/>
- <ColorAlias name="midi input button: led active" alias="color 4"/>
- <ColorAlias name="midi meter color0" alias="color 52"/>
- <ColorAlias name="midi meter color1" alias="color 53"/>
- <ColorAlias name="midi meter color2" alias="color 53"/>
- <ColorAlias name="midi meter color3" alias="color 54"/>
- <ColorAlias name="midi meter color4" alias="color 54"/>
- <ColorAlias name="midi meter color5" alias="color 55"/>
- <ColorAlias name="midi meter color6" alias="color 55"/>
- <ColorAlias name="midi meter color7" alias="color 56"/>
- <ColorAlias name="midi meter color8" alias="color 56"/>
- <ColorAlias name="midi meter color9" alias="color 17"/>
- <ColorAlias name="midi note inactive channel" alias="color 4"/>
- <ColorAlias name="midi note max" alias="color 8"/>
- <ColorAlias name="midi note mid" alias="color 96"/>
- <ColorAlias name="midi note min" alias="color 103"/>
- <ColorAlias name="midi note selected" alias="color 40"/>
- <ColorAlias name="midi note selected outline" alias="color 9"/>
- <ColorAlias name="midi note velocity text" alias="color 32"/>
- <ColorAlias name="midi patch change fill" alias="color 60"/>
- <ColorAlias name="midi patch change outline" alias="color 26"/>
- <ColorAlias name="midi select rect outline" alias="color 63"/>
- <ColorAlias name="midi sysex fill" alias="color 32"/>
- <ColorAlias name="midi sysex outline" alias="color 64"/>
- <ColorAlias name="midi track base" alias="color 41"/>
- <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
- <ColorAlias name="mixer strip button: led active" alias="color 8"/>
- <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
- <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
- <ColorAlias name="monitor button: fill active" alias="color 68"/>
- <ColorAlias name="monitor button: led active" alias="color 9"/>
- <ColorAlias name="monitor section knob" alias="color 60"/>
- <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
- <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
- <ColorAlias name="monitor section mono: fill" alias="color 71"/>
- <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
- <ColorAlias name="monitor section mono: led active" alias="color 37"/>
- <ColorAlias name="monitor section dim: fill" alias="color 71"/>
- <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
- <ColorAlias name="monitor section dim: led active" alias="color 37"/>
- <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
- <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
- <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
- <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
- <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
- <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
- <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
- <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
- <ColorAlias name="mono panner bg" alias="color 67"/>
- <ColorAlias name="mono panner fill" alias="color 74"/>
- <ColorAlias name="mono panner outline" alias="color 70"/>
- <ColorAlias name="mono panner position fill" alias="color 11"/>
- <ColorAlias name="mono panner position outline" alias="color 70"/>
- <ColorAlias name="mono panner text" alias="color 4"/>
- <ColorAlias name="mouse mode button: fill active" alias="color 12"/>
- <ColorAlias name="mouse mode button: led active" alias="color 8"/>
- <ColorAlias name="mute button: fill active" alias="color 75"/>
- <ColorAlias name="mute button: led active" alias="color 4"/>
- <ColorAlias name="name highlight fill" alias="color 18"/>
- <ColorAlias name="name highlight outline" alias="color 23"/>
- <ColorAlias name="nudge button: fill" alias="color 20"/>
- <ColorAlias name="nudge button: fill active" alias="color 42"/>
- <ColorAlias name="nudge button: led active" alias="color 8"/>
- <ColorAlias name="nudge clock: background" alias="color 67"/>
- <ColorAlias name="nudge clock: cursor" alias="color 8"/>
- <ColorAlias name="nudge clock: edited text" alias="color 8"/>
- <ColorAlias name="nudge clock: text" alias="color 12"/>
- <ColorAlias name="piano roll black" alias="color 76"/>
- <ColorAlias name="piano roll black outline" alias="color 33"/>
- <ColorAlias name="piano roll white" alias="color 45"/>
- <ColorAlias name="play head" alias="color 9"/>
- <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
- <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
- <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
- <ColorAlias name="processor automation line" alias="color 77"/>
- <ColorAlias name="processor control button: fill" alias="color 29"/>
- <ColorAlias name="processor control button: fill active" alias="color 46"/>
- <ColorAlias name="processor control button: led active" alias="color 62"/>
- <ColorAlias name="processor fader: fill" alias="color 16"/>
- <ColorAlias name="processor fader: fill active" alias="color 78"/>
- <ColorAlias name="processor fader: led active" alias="color 37"/>
- <ColorAlias name="processor postfader: fill" alias="color 58"/>
- <ColorAlias name="processor postfader: fill active" alias="color 79"/>
- <ColorAlias name="processor postfader: led active" alias="color 37"/>
- <ColorAlias name="processor prefader: fill" alias="color 40"/>
- <ColorAlias name="processor prefader: fill active" alias="color 80"/>
- <ColorAlias name="processor prefader: led active" alias="color 37"/>
- <ColorAlias name="processor stub: fill" alias="color 46"/>
- <ColorAlias name="processor stub: fill active" alias="color 46"/>
- <ColorAlias name="punch button: fill" alias="color 20"/>
- <ColorAlias name="punch button: fill active" alias="color 9"/>
- <ColorAlias name="punch button: led active" alias="color 4"/>
- <ColorAlias name="punch clock: background" alias="color 67"/>
- <ColorAlias name="punch clock: cursor" alias="color 9"/>
- <ColorAlias name="punch clock: edited text" alias="color 9"/>
- <ColorAlias name="punch clock: text" alias="color 12"/>
- <ColorAlias name="punch line" alias="color 83"/>
- <ColorAlias name="range drag bar rect" alias="color 21"/>
- <ColorAlias name="range drag rect" alias="color 56"/>
- <ColorAlias name="range marker bar" alias="color 34"/>
- <ColorAlias name="record enable button: fill active" alias="color 83"/>
- <ColorAlias name="record enable button: led active" alias="color 85"/>
- <ColorAlias name="recording rect" alias="color 86"/>
- <ColorAlias name="recording waveform fill" alias="color 13"/>
- <ColorAlias name="recording waveform outline" alias="color 43"/>
- <ColorAlias name="region list automatic" alias="color 53"/>
- <ColorAlias name="region list missing source" alias="color 9"/>
- <ColorAlias name="region list whole file" alias="color 1"/>
- <ColorAlias name="route button: fill active" alias="color 67"/>
- <ColorAlias name="route button: led active" alias="color 8"/>
- <ColorAlias name="rubber band rect" alias="color 88"/>
- <ColorAlias name="rude audition: fill" alias="color 20"/>
- <ColorAlias name="rude audition: fill active" alias="color 86"/>
- <ColorAlias name="rude audition: led active" alias="color 4"/>
- <ColorAlias name="rude isolate: fill" alias="color 42"/>
- <ColorAlias name="rude isolate: fill active" alias="color 89"/>
- <ColorAlias name="rude isolate: led active" alias="color 4"/>
- <ColorAlias name="rude solo: fill" alias="color 20"/>
- <ColorAlias name="rude solo: fill active" alias="color 86"/>
- <ColorAlias name="rude solo: led active" alias="color 4"/>
- <ColorAlias name="ruler base" alias="color 67"/>
- <ColorAlias name="ruler text" alias="color 22"/>
- <ColorAlias name="secondary clock: background" alias="color 67"/>
- <ColorAlias name="secondary clock: cursor" alias="color 8"/>
- <ColorAlias name="secondary clock: edited text" alias="color 8"/>
- <ColorAlias name="secondary clock: text" alias="color 91"/>
- <ColorAlias name="secondary delta clock: background" alias="color 67"/>
- <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
- <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
- <ColorAlias name="secondary delta clock: text" alias="color 92"/>
- <ColorAlias name="selected midi note frame" alias="color 86"/>
- <ColorAlias name="selected region base" alias="color 25"/>
- <ColorAlias name="selected time axis frame" alias="color 86"/>
- <ColorAlias name="selected waveform fill" alias="color 8"/>
- <ColorAlias name="selected waveform outline" alias="color 67"/>
- <ColorAlias name="selection" alias="color 94"/>
- <ColorAlias name="selection clock: background" alias="color 67"/>
- <ColorAlias name="selection clock: cursor" alias="color 9"/>
- <ColorAlias name="selection clock: edited text" alias="color 9"/>
- <ColorAlias name="selection clock: text" alias="color 12"/>
- <ColorAlias name="selection rect" alias="color 95"/>
- <ColorAlias name="send alert button: fill" alias="color 71"/>
- <ColorAlias name="send alert button: fill active" alias="color 38"/>
- <ColorAlias name="send alert button: led active" alias="color 4"/>
- <ColorAlias name="send bg" alias="color 38"/>
- <ColorAlias name="shuttle" alias="color 12"/>
- <ColorAlias name="silence" alias="color 98"/>
- <ColorAlias name="silence text" alias="color 10"/>
- <ColorAlias name="solo button: fill active" alias="color 12"/>
- <ColorAlias name="solo button: led active" alias="color 4"/>
- <ColorAlias name="solo isolate: fill" alias="color 25"/>
- <ColorAlias name="solo isolate: fill active" alias="color 42"/>
- <ColorAlias name="solo isolate: led active" alias="color 9"/>
- <ColorAlias name="solo safe: fill" alias="color 25"/>
- <ColorAlias name="solo safe: fill active" alias="color 42"/>
- <ColorAlias name="solo safe: led active" alias="color 9"/>
- <ColorAlias name="stereo panner bg" alias="color 67"/>
- <ColorAlias name="stereo panner fill" alias="color 74"/>
- <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
- <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
- <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
- <ColorAlias name="stereo panner inverted text" alias="color 4"/>
- <ColorAlias name="stereo panner mono bg" alias="color 67"/>
- <ColorAlias name="stereo panner mono fill" alias="color 54"/>
- <ColorAlias name="stereo panner mono outline" alias="color 101"/>
- <ColorAlias name="stereo panner mono text" alias="color 4"/>
- <ColorAlias name="stereo panner outline" alias="color 70"/>
- <ColorAlias name="stereo panner rule" alias="color 70"/>
- <ColorAlias name="stereo panner text" alias="color 4"/>
- <ColorAlias name="sync mark" alias="color 75"/>
- <ColorAlias name="tempo bar" alias="color 46"/>
- <ColorAlias name="tempo marker" alias="color 19"/>
- <ColorAlias name="time axis frame" alias="color 4"/>
- <ColorAlias name="time axis view item base" alias="color 94"/>
- <ColorAlias name="time stretch fill" alias="color 100"/>
- <ColorAlias name="time stretch outline" alias="color 94"/>
- <ColorAlias name="tracknumber label: fill" alias="color 34"/>
- <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
- <ColorAlias name="tracknumber label: led active" alias="color 9"/>
- <ColorAlias name="transport active option button: fill active" alias="color 48"/>
- <ColorAlias name="transport active option button: led active" alias="color 8"/>
- <ColorAlias name="transport button: fill active" alias="color 48"/>
- <ColorAlias name="transport button: led active" alias="color 4"/>
- <ColorAlias name="transport clock: background" alias="color 67"/>
- <ColorAlias name="transport clock: cursor" alias="color 8"/>
- <ColorAlias name="transport clock: edited text" alias="color 8"/>
- <ColorAlias name="transport clock: text" alias="color 91"/>
- <ColorAlias name="transport delta clock: background" alias="color 67"/>
- <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
- <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
- <ColorAlias name="transport delta clock: text" alias="color 92"/>
- <ColorAlias name="transport drag rect" alias="color 21"/>
- <ColorAlias name="transport loop rect" alias="color 103"/>
- <ColorAlias name="transport marker bar" alias="color 25"/>
- <ColorAlias name="transport option button: fill active" alias="color 42"/>
- <ColorAlias name="transport option button: led active" alias="color 8"/>
- <ColorAlias name="transport punch rect" alias="color 80"/>
- <ColorAlias name="transport recenable button: fill" alias="color 20"/>
- <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
- <ColorAlias name="transport recenable button: led active" alias="color 4"/>
- <ColorAlias name="trim handle" alias="color 18"/>
- <ColorAlias name="trim handle locked" alias="color 86"/>
- <ColorAlias name="trim knob" alias="color 60"/>
- <ColorAlias name="trim knob: arc end" alias="color 81"/>
- <ColorAlias name="trim knob: arc start" alias="color 82"/>
- <ColorAlias name="verbose canvas cursor" alias="color 32"/>
- <ColorAlias name="video timeline bar" alias="color 46"/>
- <ColorAlias name="waveform fill" alias="color 13"/>
- <ColorAlias name="waveform outline" alias="color 4"/>
- <ColorAlias name="zero line" alias="color 104"/>
- <ColorAlias name="zoom button: fill active" alias="color 48"/>
- <ColorAlias name="zoom button: led active" alias="color 8"/>
- </ColorAliases>
- <Modifiers>
- <Modifier name="audio bus base" modifier="= alpha:0.3"/>
- <Modifier name="audio track base" modifier="= alpha:0.3"/>
- <Modifier name="automation track fill" modifier="= alpha:0.3"/>
- <Modifier name="covered region base" modifier="= alpha:0.7"/>
- <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
- <Modifier name="dragging region" modifier="= alpha:0.9"/>
- <Modifier name="editable region" modifier="= alpha:0.25"/>
- <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
- <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
- <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
- <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
- <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
- <Modifier name="marker bar" modifier="= alpha:0.5"/>
- <Modifier name="measure line beat" modifier="= alpha:1.0"/>
- <Modifier name="midi frame base" modifier="= alpha:0.4"/>
- <Modifier name="midi note" modifier="= alpha:0.8"/>
- <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
- <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
- <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
- <Modifier name="midi track base" modifier="= alpha:0.3"/>
- <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
- <Modifier name="opaque region base" modifier="= alpha:0.75"/>
- <Modifier name="panner fill" modifier="= alpha:0.7882"/>
- <Modifier name="piano roll black" modifier="= alpha:0.2"/>
- <Modifier name="piano roll white" modifier="= alpha:0.2"/>
- <Modifier name="recording rect" modifier="= alpha:0.25"/>
- <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
- <Modifier name="selection rect" modifier="= alpha:0.4666"/>
- <Modifier name="silence" modifier="= alpha:0.4784"/>
- <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
- <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
- <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
- <Modifier name="transparent region base" modifier="= alpha:0.6"/>
- <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
- <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
- </Modifiers>
-</Ardour>
diff --git a/gtk2_ardour/default_ui_config.in b/gtk2_ardour/default_ui_config.in
index 9c815d6..f4c0c37 100644
--- a/gtk2_ardour/default_ui_config.in
+++ b/gtk2_ardour/default_ui_config.in
@@ -3,7 +3,7 @@
<UI>
<Option name="icon-set" value="default"/>
<Option name="ui-rc-file" value="clearlooks.rc"/>
- <Option name="color-file" value="dark"/>
+ <Option name="color-file" value="dark-ardour"/>
<Option name="flat-buttons" value="0"/>
<Option name="blink-rec-arm" value="0"/>
<Option name="waveform-gradient-depth" value="0"/>
diff --git a/gtk2_ardour/duplicate_routes_dialog.cc b/gtk2_ardour/duplicate_routes_dialog.cc
index b69d17c..05bb878 100644
--- a/gtk2_ardour/duplicate_routes_dialog.cc
+++ b/gtk2_ardour/duplicate_routes_dialog.cc
@@ -26,7 +26,7 @@
#include "duplicate_routes_dialog.h"
#include "selection.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace Gtk;
diff --git a/gtk2_ardour/edit_note_dialog.cc b/gtk2_ardour/edit_note_dialog.cc
index ae15480..39a3fa4 100644
--- a/gtk2_ardour/edit_note_dialog.cc
+++ b/gtk2_ardour/edit_note_dialog.cc
@@ -26,7 +26,7 @@
#include "midi_region_view.h"
#include "note_base.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -93,7 +93,8 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<NoteBase*> n)
_time_clock.set_session (_region_view->get_time_axis_view().session ());
_time_clock.set_mode (AudioClock::BBT);
- _time_clock.set (_region_view->source_relative_time_converter().to ((*_events.begin())->note()->time ()), true);
+ _time_clock.set (_region_view->source_relative_time_converter().to
+ ((*_events.begin())->note()->time()) + (_region_view->region()->position() - _region_view->region()->start()), true);
l = manage (left_aligned_label (_("Length")));
table->attach (*l, 0, 1, r, r + 1);
@@ -193,7 +194,8 @@ EditNoteDialog::done (int r)
}
}
- Evoral::Beats const t = _region_view->source_relative_time_converter().from (_time_clock.current_time ());
+ Evoral::Beats const t = _region_view->source_relative_time_converter().from
+ (_time_clock.current_time() - (_region_view->region()->position() - _region_view->region()->start()));
if (!_time_all.get_sensitive() || _time_all.get_active ()) {
for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
diff --git a/gtk2_ardour/editing.cc b/gtk2_ardour/editing.cc
index 4868080..10181d5 100644
--- a/gtk2_ardour/editing.cc
+++ b/gtk2_ardour/editing.cc
@@ -22,7 +22,7 @@
#include "editing.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/gtk2_ardour/editor.bindings b/gtk2_ardour/editor.bindings
deleted file mode 100644
index 4ef4acb..0000000
--- a/gtk2_ardour/editor.bindings
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Bindings name="ardour-editor">
- <Press>
- <Binding action="Editor/temporal-zoom-in" key="equal"/>
- <Binding action="Editor/temporal-zoom-out" key="minus"/>
- <Binding action="Editor/edit-cursor-to-previous-region-sync" key="apostrophe"/>
- <Binding action="Editor/edit-cursor-to-next-region-sync" key="semicolon"/>
- <Binding action="Editor/cycle-edit-point" key="grave"/>
- <Binding action="Editor/cycle-edit-point-with-marker" key="Primary-asciicircum"/>
- <Binding action="Editor/move-range-start-to-previous-region-boundary" key="less"/>
- <Binding action="Editor/move-range-start-to-next-region-boundary" key="Primary-less"/>
- <Binding action="Editor/move-range-end-to-previous-region-boundary" key="Primary-greater"/>
- <Binding action="Editor/move-range-end-to-next-region-boundary" key="greater"/>
- <Binding action="Transport/ToggleRoll" key="space"/>
- <Binding action="Editor/play-edit-range" key="Secondary-space"/>
- <Binding action="Editor/play-from-edit-point-and-return" key="Level4-space"/>
- <Binding action="Transport/ToggleRollMaybe" key="Primary-Secondary-space"/>
- <Binding action="Transport/ToggleRollForgetCapture" key="Primary-space"/>
- <Binding action="Transport/record-roll" key="Tertiary-space"/>
- <Binding action="Region/set-fade-in-length" key="slash"/>
- <Binding action="Region/toggle-region-fade-out" key="Primary-slash"/>
- <Binding action="Region/set-fade-out-length" key="backslash"/>
- <Binding action="Region/toggle-region-fade-out" key="Primary-backslash"/>
- <Binding action="Region/trim-from-start" key="Tertiary-braceleft"/>
- <Binding action="Region/trim-to-end" key="Tertiary-braceright"/>
- <Binding action="Editor/trim-to-previous-region" key="Primary-j"/>
- <Binding action="Editor/trim-to-next-region" key="Primary-k"/>
- <Binding action="Editor/set-loop-from-edit-range" key="bracketright"/>
- <Binding action="Region/set-loop-from-region" key="Secondary-bracketright"/>
- <Binding action="Editor/set-punch-from-edit-range" key="bracketleft"/>
- <Binding action="Region/set-punch-from-region" key="Secondary-bracketleft"/>
- <Binding action="Region/boost-region-gain" key="asciicircum"/>
- <Binding action="Region/cut-region-gain" key="ampersand"/>
- <Binding action="Common/Quit" key="Primary-q"/>
- <Binding action="Region/quantize-region" key="q"/>
- <Binding action="Region/legatize-region" key="Primary-apostrophe"/>
- <Binding action="Region/remove-overlap" key="Secondary-apostrophe"/>
- <Binding action="MouseMode/set-mouse-mode-content" key="e"/>
- <Binding action="Editor/select-all-before-edit-cursor" key="Primary-e"/>
- <Binding action="Region/export-region" key="Primary-Level4-e"/>
- <Binding action="Main/ExportSession" key="Level4-e"/>
- <Binding action="Editor/select-all-after-edit-cursor" key="Primary-Tertiary-e"/>
- <Binding action="Editor/show-editor-mixer" key="Tertiary-e"/>
- <Binding action="Common/goto-editor" key="Secondary-e"/>
- <Binding action="MouseMode/set-mouse-mode-range" key="r"/>
- <Binding action="Editor/redo" key="Primary-r"/>
- <Binding action="Region/reverse-region" key="Secondary-r"/>
- <Binding action="Transport/Record" key="Tertiary-r"/>
- <Binding action="MouseMode/set-mouse-mode-timefx" key="t"/>
- <Binding action="Region/pitch-shift-region" key="Secondary-t"/>
- <Binding action="Editor/insert-time" key="Primary-t"/>
- <Binding action="MouseMode/set-mouse-mode-object-range" key="y"/>
- <Binding action="Editor/select-all-between-cursors" key="Primary-u"/>
- <Binding action="Editor/select-all-within-cursors" key="u"/>
- <Binding action="Region/insert-region-from-region-list" key="i"/>
- <Binding action="Editor/invert-selection" key="Tertiary-i"/>
- <Binding action="Editor/addExistingAudioFiles" key="Secondary-i"/>
- <Binding action="MouseMode/set-mouse-mode-object" key="o"/>
- <Binding action="Main/Open" key="Primary-o"/>
- <Binding action="Main/Recent" key="Primary-Tertiary-o"/>
- <Binding action="Common/ToggleOptionsEditor" key="Secondary-o"/>
- <Binding action="Region/naturalize-region" key="Secondary-o"/>
- <Binding action="Editor/set-playhead" key="p"/>
- <Binding action="Editor/select-all-before-playhead" key="Primary-p"/>
- <Binding action="Common/toggle-audio-connection-manager" key="Secondary-p"/>
- <Binding action="Common/toggle-midi-connection-manager" key="Secondary-Tertiary-p"/>
- <Binding action="MIDI/panic" key="Primary-Secondary-p"/>
- <Binding action="Editor/select-all-after-playhead" key="Tertiary-Primary-p"/>
- <Binding action="Region/align-regions-sync-relative" key="a"/>
- <Binding action="Editor/select-all" key="Primary-a"/>
- <Binding action="Region/align-regions-end" key="Secondary-a"/>
- <Binding action="Region/align-regions-sync" key="Tertiary-a"/>
- <Binding action="Region/align-regions-start" key="Primary-Level4-a"/>
- <Binding action="Region/align-regions-start-relative" key="Level4-a"/>
- <Binding action="Region/split-region" key="s"/>
- <Binding action="Common/Save" key="Primary-s"/>
- <Binding action="Main/Snapshot" key="Primary-Tertiary-s"/>
- <Binding action="Editor/track-solo-toggle" key="Secondary-s"/>
- <Binding action="Region/duplicate-region" key="d"/>
- <Binding action="Region/multi-duplicate-region" key="Tertiary-d"/>
- <Binding action="Editor/select-all-in-punch-range" key="Primary-d"/>
- <Binding action="Editor/fit-tracks" key="f"/>
- <Binding action="Editor/toggle-follow-playhead" key="Primary-f"/>
- <Binding action="Region/show-rhythm-ferret" key="Secondary-f"/>
- <Binding action="MouseMode/set-mouse-mode-gain" key="g"/>
- <Binding action="Region/play-selected-regions" key="h"/>
- <Binding action="Region/trim-front" key="j"/>
- <Binding action="Region/trim-back" key="k"/>
- <Binding action="Common/ToggleKeyEditor" key="Secondary-k"/>
- <Binding action="Transport/Loop" key="l"/>
- <Binding action="Editor/select-all-in-loop-range" key="Primary-l"/>
- <Binding action="Common/ToggleLocations" key="Secondary-l"/>
- <Binding action="MouseMode/set-mouse-mode-zoom" key="z"/>
- <Binding action="Editor/undo" key="Primary-z"/>
- <Binding action="Editor/zoom-to-region" key="Primary-Secondary-z"/>
- <Binding action="Editor/zoom-to-region-both-axes" key="Secondary-z"/>
- <Binding action="Editor/toggle-zoom" key="Tertiary-z"/>
- <Binding action="Editor/editor-cut" key="Primary-x"/>
- <Binding action="Editor/editor-copy" key="Primary-c"/>
- <Binding action="Common/ToggleColorManager" key="Secondary-c"/>
- <Binding action="Region/set-region-sync-position" key="v"/>
- <Binding action="Editor/editor-paste" key="Primary-v"/>
- <Binding action="Editor/brush-at-mouse" key="Primary-b"/>
- <Binding action="Editor/track-record-enable-toggle" key="Secondary-b"/>
- <Binding action="Common/ToggleBigClock" key="Secondary-b"/>
- <Binding action="Region/normalize-region" key="n"/>
- <Binding action="Main/AddTrackBus" key="Primary-Tertiary-n"/>
- <Binding action="Main/New" key="Primary-n"/>
- <Binding action="Region/toggle-region-mute" key="Primary-m"/>
- <Binding action="Common/toggle-mixer-on-top" key="Secondary-m"/>
- <Binding action="Editor/step-tracks-up" key="uparrow"/>
- <Binding action="Transport/TransitionToRoll" key="Tertiary-uparrow"/>
- <Binding action="Editor/select-prev-route" key="Secondary-uparrow"/>
- <Binding action="Editor/move-selected-tracks-up" key="Primary-uparrow"/>
- <Binding action="Editor/step-tracks-down" key="downarrow"/>
- <Binding action="Transport/TransitionToReverse" key="Tertiary-downarrow"/>
- <Binding action="Editor/select-next-route" key="Secondary-downarrow"/>
- <Binding action="Editor/move-selected-tracks-down" key="Primary-downarrow"/>
- <Binding action="Editor/playhead-to-previous-region-boundary" key="leftarrow"/>
- <Binding action="Editor/playhead-to-previous-region-boundary-noselection" key="Level4-leftarrow"/>
- <Binding action="Editor/playhead-to-previous-region-sync" key="Primary-Secondary-leftarrow"/>
- <Binding action="Editor/tab-to-transient-backwards" key="Primary-leftarrow"/>
- <Binding action="Editor/nudge-playhead-backward" key="Secondary-leftarrow"/>
- <Binding action="Editor/playhead-backward-to-grid" key="Tertiary-Level4-leftarrow"/>
- <Binding action="Transport/Rewind" key="Tertiary-leftarrow"/>
- <Binding action="Editor/selected-marker-to-previous-region-boundary" key="Primary-Tertiary-leftarrow"/>
- <Binding action="Editor/playhead-to-next-region-boundary" key="rightarrow"/>
- <Binding action="Editor/playhead-to-next-region-boundary-noselection" key="Level4-rightarrow"/>
- <Binding action="Editor/playhead-to-next-region-sync" key="Primary-Secondary-rightarrow"/>
- <Binding action="Editor/tab-to-transient-forwards" key="Primary-rightarrow"/>
- <Binding action="Editor/nudge-playhead-forward" key="Secondary-rightarrow"/>
- <Binding action="Editor/playhead-forward-to-grid" key="Tertiary-Level4-rightarrow"/>
- <Binding action="Transport/Forward" key="Tertiary-rightarrow"/>
- <Binding action="Editor/selected-marker-to-next-region-boundary" key="Primary-Tertiary-rightarrow"/>
- <Binding action="Editor/scroll-tracks-down" key="Page_Down"/>
- <Binding action="Editor/scroll-tracks-up" key="Page_Up"/>
- <Binding action="Transport/GotoStart" key="Home"/>
- <Binding action="Transport/GotoEnd" key="End"/>
- <Binding action="Editor/editor-delete" key="Delete"/>
- <Binding action="Editor/playhead-to-edit" key="Return"/>
- <Binding action="Editor/edit-to-playhead" key="Secondary-Return"/>
- <Binding action="Editor/remove-last-capture" key="Primary-Delete"/>
- <Binding action="Editor/escape" key="Escape"/>
- <Binding action="Region/nudge-backward" key="KP_Subtract"/>
- <Binding action="Editor/nudge-next-backward" key="Primary-KP_Subtract"/>
- <Binding action="Editor/jump-forward-to-mark" key="Primary-KP_Right"/>
- <Binding action="Editor/jump-backward-to-mark" key="Primary-KP_Left"/>
- <Binding action="Region/nudge-forward" key="KP_Add"/>
- <Binding action="Editor/nudge-next-forward" key="Primary-KP_Add"/>
- <Binding action="Editor/start-range" key="Primary-KP_Down"/>
- <Binding action="Editor/finish-range" key="Primary-KP_Up"/>
- <Binding action="Editor/finish-add-range" key="Tertiary-Primary-KP_Up"/>
- <Binding action="Editor/add-location-from-playhead" key="KP_Enter"/>
- <Binding action="Transport/focus-on-clock" key="KP_Divide"/>
- <Binding action="Transport/GotoZero" key="KP_0"/>
- <Binding action="Editor/goto-mark-1" key="KP_1"/>
- <Binding action="Editor/goto-mark-2" key="KP_2"/>
- <Binding action="Editor/goto-mark-3" key="KP_3"/>
- <Binding action="Editor/goto-mark-4" key="KP_4"/>
- <Binding action="Editor/goto-mark-5" key="KP_5"/>
- <Binding action="Editor/goto-mark-6" key="KP_6"/>
- <Binding action="Editor/goto-mark-7" key="KP_7"/>
- <Binding action="Editor/goto-mark-8" key="KP_8"/>
- <Binding action="Editor/goto-mark-9" key="KP_9"/>
- <Binding action="Editor/edit-cursor-to-range-start" key="F1"/>
- <Binding action="Editor/edit-cursor-to-range-end" key="F2"/>
- <Binding action="Editor/crop" key="F3"/>
- <Binding action="Editor/editor-separate" key="F4"/>
- <Binding action="Editor/pitch-shift-region" key="F5"/>
- <Binding action="Editor/select-range-between-cursors" key="F6"/>
- <Binding action="Common/ToggleMaximalEditor" key="F11"/>
- <Binding action="Common/ToggleMaximalMixer" key="F12"/>
- <Binding action="Editor/save-visual-state-1" key="Primary-F1"/>
- <Binding action="Editor/save-visual-state-2" key="Primary-F2"/>
- <Binding action="Editor/save-visual-state-3" key="Primary-F3"/>
- <Binding action="Editor/save-visual-state-4" key="Primary-F4"/>
- <Binding action="Editor/save-visual-state-5" key="Primary-F5"/>
- <Binding action="Editor/save-visual-state-6" key="Primary-F6"/>
- <Binding action="Editor/save-visual-state-7" key="Primary-F7"/>
- <Binding action="Editor/save-visual-state-8" key="Primary-F8"/>
- <Binding action="Editor/save-visual-state-9" key="Primary-F9"/>
- <Binding action="Editor/save-visual-state-10" key="Primary-F10"/>
- <Binding action="Editor/save-visual-state-11" key="Primary-F11"/>
- <Binding action="Editor/save-visual-state-12" key="Primary-F12"/>
- <Binding action="Editor/cycle-snap-mode" key="2"/>
- <Binding action="Editor/cycle-snap-choice" key="3"/>
- <Binding action="Editor/step-mouse-mode" key="4"/>
- <Binding action="Transport/ToggleAutoReturn" key="5"/>
- <Binding action="Transport/ToggleClick" key="6"/>
- <Binding action="Editor/set-tempo-from-region" key="9"/>
- <Binding action="Editor/set-tempo-from-edit-range" key="0"/>
- </Press>
- <Release>
- <Binding action="Editor/goto-visual-state-1" key="Primary-F1"/>
- <Binding action="Editor/goto-visual-state-2" key="Primary-F2"/>
- <Binding action="Editor/goto-visual-state-3" key="Primary-F3"/>
- <Binding action="Editor/goto-visual-state-4" key="Primary-F4"/>
- <Binding action="Editor/goto-visual-state-5" key="Primary-F5"/>
- <Binding action="Editor/goto-visual-state-6" key="Primary-F6"/>
- <Binding action="Editor/goto-visual-state-7" key="Primary-F7"/>
- <Binding action="Editor/goto-visual-state-8" key="Primary-F8"/>
- <Binding action="Editor/goto-visual-state-9" key="Primary-F9"/>
- <Binding action="Editor/goto-visual-state-10" key="Primary-F10"/>
- <Binding action="Editor/goto-visual-state-11" key="Primary-F11"/>
- <Binding action="Editor/goto-visual-state-12" key="Primary-F12"/>
- </Release>
-</Bindings>
-
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index f080ed2..757b767 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -59,22 +59,26 @@
#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/grouped_buttons.h"
#include "gtkmm2ext/gtk_ui.h"
-#include "gtkmm2ext/tearoff.h"
+#include <gtkmm2ext/keyboard.h>
#include "gtkmm2ext/utils.h"
#include "gtkmm2ext/window_title.h"
#include "gtkmm2ext/choice.h"
#include "gtkmm2ext/cell_renderer_pixbuf_toggle.h"
+#include "ardour/analysis_graph.h"
#include "ardour/audio_track.h"
#include "ardour/audioengine.h"
#include "ardour/audioregion.h"
#include "ardour/lmath.h"
#include "ardour/location.h"
#include "ardour/profile.h"
+#include "ardour/route.h"
#include "ardour/route_group.h"
#include "ardour/session_playlists.h"
#include "ardour/tempo.h"
#include "ardour/utils.h"
+#include "ardour/vca_manager.h"
+#include "ardour/vca.h"
#include "canvas/debug.h"
#include "canvas/text.h"
@@ -102,10 +106,13 @@
#include "editor_routes.h"
#include "editor_snapshots.h"
#include "editor_summary.h"
+#include "export_report.h"
#include "global_port_matrix.h"
#include "gui_object.h"
#include "gui_thread.h"
#include "keyboard.h"
+#include "keyeditor.h"
+#include "luainstance.h"
#include "marker.h"
#include "midi_region_view.h"
#include "midi_time_axis.h"
@@ -119,7 +126,9 @@
#include "region_layering_order_editor.h"
#include "rgb_macros.h"
#include "rhythm_ferret.h"
+#include "route_sorter.h"
#include "selection.h"
+#include "simple_progress_dialog.h"
#include "sfdb_ui.h"
#include "tempo_lines.h"
#include "time_axis_view.h"
@@ -127,9 +136,10 @@
#include "tooltips.h"
#include "ui_config.h"
#include "utils.h"
+#include "vca_time_axis.h"
#include "verbose_cursor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -207,8 +217,8 @@ static const gchar *_zoom_focus_strings[] = {
N_("Right"),
N_("Center"),
N_("Playhead"),
- N_("Mouse"),
- N_("Edit point"),
+ N_("Mouse"),
+ N_("Edit point"),
0
};
@@ -227,35 +237,85 @@ static const gchar *_rb_opt_strings[] = {
#define COMBO_TRIANGLE_WIDTH 25 // ArdourButton _diameter (11) + 2 * arrow-padding (2*2) + 2 * text-padding (2*5)
-static void
-pane_size_watcher (Paned* pane)
-{
- /* if the handle of a pane vanishes into (at least) the tabs of a notebook,
- it is:
-
- X: hard to access
- Quartz: impossible to access
-
- so stop that by preventing it from ever getting too narrow. 35
- pixels is basically a rough guess at the tab width.
-
- ugh.
- */
-
- int max_width_of_lhs = GTK_WIDGET(pane->gobj())->allocation.width - 35;
-
- gint pos = pane->get_position ();
-
- if (pos > max_width_of_lhs) {
- pane->set_position (max_width_of_lhs);
- }
-}
-
Editor::Editor ()
- : _join_object_range_state (JOIN_OBJECT_RANGE_NONE)
-
+ : PublicEditor (global_hpacker)
+ , editor_mixer_strip_width (Wide)
+ , constructed (false)
+ , _playlist_selector (0)
+ , no_save_visual (false)
+ , leftmost_frame (0)
+ , samples_per_pixel (2048)
+ , zoom_focus (ZoomFocusPlayhead)
+ , mouse_mode (MouseObject)
+ , pre_internal_snap_type (SnapToBeat)
+ , pre_internal_snap_mode (SnapOff)
+ , internal_snap_type (SnapToBeat)
+ , internal_snap_mode (SnapOff)
+ , _join_object_range_state (JOIN_OBJECT_RANGE_NONE)
+ , _notebook_shrunk (false)
+ , location_marker_color (0)
+ , location_range_color (0)
+ , location_loop_color (0)
+ , location_punch_color (0)
+ , location_cd_marker_color (0)
+ , entered_marker (0)
+ , _show_marker_lines (false)
+ , clicked_axisview (0)
+ , clicked_routeview (0)
+ , clicked_regionview (0)
+ , clicked_selection (0)
+ , clicked_control_point (0)
+ , button_release_can_deselect (true)
, _mouse_changed_selection (false)
- /* time display buttons */
+ , region_edit_menu_split_item (0)
+ , region_edit_menu_split_multichannel_item (0)
+ , track_region_edit_playlist_menu (0)
+ , track_edit_playlist_submenu (0)
+ , track_selection_edit_playlist_submenu (0)
+ , _popup_region_menu_item (0)
+ , _track_canvas (0)
+ , _track_canvas_viewport (0)
+ , within_track_canvas (false)
+ , _verbose_cursor (0)
+ , tempo_group (0)
+ , meter_group (0)
+ , marker_group (0)
+ , range_marker_group (0)
+ , transport_marker_group (0)
+ , cd_marker_group (0)
+ , _time_markers_group (0)
+ , hv_scroll_group (0)
+ , h_scroll_group (0)
+ , cursor_scroll_group (0)
+ , no_scroll_group (0)
+ , _trackview_group (0)
+ , _drag_motion_group (0)
+ , _canvas_drop_zone (0)
+ , no_ruler_shown_update (false)
+ , ruler_grabbed_widget (0)
+ , ruler_dialog (0)
+ , minsec_mark_interval (0)
+ , minsec_mark_modulo (0)
+ , minsec_nmarks (0)
+ , timecode_mark_modulo (0)
+ , timecode_nmarks (0)
+ , _samples_ruler_interval (0)
+ , bbt_bars (0)
+ , bbt_nmarks (0)
+ , bbt_bar_helper_on (0)
+ , bbt_accent_modulo (0)
+ , timecode_ruler (0)
+ , bbt_ruler (0)
+ , samples_ruler (0)
+ , minsec_ruler (0)
+ , visible_timebars (0)
+ , editor_ruler_menu (0)
+ , tempo_bar (0)
+ , meter_bar (0)
+ , marker_bar (0)
+ , range_marker_bar (0)
+ , transport_marker_bar (0)
+ , cd_marker_bar (0)
, minsec_label (_("Mins:Secs"))
, bbt_label (_("Bars:Beats"))
, timecode_label (_("Timecode"))
@@ -267,73 +327,142 @@ Editor::Editor ()
, transport_mark_label (_("Loop/Punch Ranges"))
, cd_mark_label (_("CD Markers"))
, videotl_label (_("Video Timeline"))
+ , videotl_group (0)
+ , playhead_cursor (0)
, edit_packer (4, 4, true)
-
- /* the values here don't matter: layout widgets
- reset them as needed.
- */
-
, vertical_adjustment (0.0, 0.0, 10.0, 400.0)
, horizontal_adjustment (0.0, 0.0, 1e16)
, unused_adjustment (0.0, 0.0, 10.0, 400.0)
-
, controls_layout (unused_adjustment, vertical_adjustment)
-
- /* tool bar related */
-
- , toolbar_selection_clock_table (2,3)
- , _mouse_mode_tearoff (0)
- , automation_mode_button (_("mode"))
- , _zoom_tearoff (0)
- , _tools_tearoff (0)
-
- , _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10)))
+ , _scroll_callbacks (0)
+ , _visible_canvas_width (0)
+ , _visible_canvas_height (0)
+ , _full_canvas_height (0)
+ , edit_controls_left_menu (0)
+ , edit_controls_right_menu (0)
+ , last_update_frame (0)
+ , cut_buffer_start (0)
+ , cut_buffer_length (0)
+ , button_bindings (0)
+ , last_paste_pos (0)
+ , paste_count (0)
+ , sfbrowser (0)
+ , current_interthread_info (0)
+ , analysis_window (0)
+ , select_new_marker (false)
+ , last_scrub_x (0)
+ , scrubbing_direction (0)
+ , scrub_reversals (0)
+ , scrub_reverse_distance (0)
+ , have_pending_keyboard_selection (false)
+ , pending_keyboard_selection_start (0)
+ , _snap_type (SnapToBeat)
+ , _snap_mode (SnapOff)
+ , snap_threshold (5.0)
+ , ignore_gui_changes (false)
+ , _drags (new DragManager (this))
+ , lock_dialog (0)
+ /* , last_event_time { 0, 0 } */ /* this initialization style requires C++11 */
+ , _dragging_playhead (false)
+ , _dragging_edit_point (false)
+ , _show_measures (true)
+ , _follow_playhead (true)
+ , _stationary_playhead (false)
+ , _maximised (false)
+ , tempo_lines (0)
+ , global_rect_group (0)
+ , time_line_group (0)
+ , tempo_marker_menu (0)
+ , meter_marker_menu (0)
+ , marker_menu (0)
+ , range_marker_menu (0)
+ , transport_marker_menu (0)
+ , new_transport_marker_menu (0)
+ , cd_marker_menu (0)
+ , marker_menu_item (0)
+ , bbt_beat_subdivision (4)
+ , _visible_track_count (-1)
+ , toolbar_selection_clock_table (2,3)
+ , automation_mode_button (_("mode"))
+ , _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10)))
+ , selection (new Selection (this))
+ , cut_buffer (new Selection (this))
+ , _selection_memento (new SelectionMemento())
+ , _all_region_actions_sensitized (false)
+ , _ignore_region_action (false)
+ , _last_region_menu_was_main (false)
+ , _ignore_follow_edits (false)
+ , cd_marker_bar_drag_rect (0)
+ , range_bar_drag_rect (0)
+ , transport_bar_drag_rect (0)
+ , transport_bar_range_rect (0)
+ , transport_bar_preroll_rect (0)
+ , transport_bar_postroll_rect (0)
+ , transport_loop_range_rect (0)
+ , transport_punch_range_rect (0)
+ , transport_punchin_line (0)
+ , transport_punchout_line (0)
+ , transport_preroll_rect (0)
+ , transport_postroll_rect (0)
+ , temp_location (0)
+ , rubberband_rect (0)
+ , _route_groups (0)
+ , _routes (0)
+ , _regions (0)
+ , _snapshots (0)
+ , _locations (0)
+ , autoscroll_horizontal_allowed (false)
+ , autoscroll_vertical_allowed (false)
+ , autoscroll_cnt (0)
+ , autoscroll_widget (0)
+ , show_gain_after_trim (false)
, selection_op_cmd_depth (0)
, selection_op_history_it (0)
-
- /* nudge */
-
- , nudge_clock (new AudioClock (X_("nudge"), false, X_("nudge"), true, false, true))
- , meters_running(false)
+ , no_save_instant (false)
+ , current_timefx (0)
+ , current_mixer_strip (0)
+ , show_editor_mixer_when_tracks_arrive (false)
+ , nudge_clock (new AudioClock (X_("nudge"), false, X_("nudge"), true, false, true))
+ , current_stepping_trackview (0)
+ , last_track_height_step_timestamp (0)
+ , entered_track (0)
+ , entered_regionview (0)
+ , clear_entered_track (false)
+ , _edit_point (EditAtMouse)
+ , meters_running (false)
+ , rhythm_ferret (0)
+ , _have_idled (false)
+ , resize_idle_id (-1)
+ , _pending_resize_amount (0)
+ , _pending_resize_view (0)
, _pending_locate_request (false)
, _pending_initial_locate (false)
+ , _summary (0)
+ , _group_tabs (0)
+ , _last_motion_y (0)
+ , layering_order_editor (0)
, _last_cut_copy_source_track (0)
-
, _region_selection_change_updates_region_list (true)
+ , _cursors (0)
, _following_mixer_selection (false)
, _control_point_toggled_on_press (false)
, _stepping_axis_view (0)
, quantize_dialog (0)
, _main_menu_disabler (0)
+ , myactions (X_("editor"))
{
- constructed = false;
-
/* we are a singleton */
PublicEditor::_instance = this;
_have_idled = false;
- selection = new Selection (this);
- cut_buffer = new Selection (this);
- _selection_memento = new SelectionMemento ();
+ last_event_time.tv_sec = 0;
+ last_event_time.tv_usec = 0;
+
selection_op_history.clear();
before.clear();
- clicked_regionview = 0;
- clicked_axisview = 0;
- clicked_routeview = 0;
- clicked_selection = 0;
- clicked_control_point = 0;
- last_update_frame = 0;
- last_paste_pos = 0;
- paste_count = 0;
- _drags = new DragManager (this);
- lock_dialog = 0;
- ruler_dialog = 0;
- current_mixer_strip = 0;
- tempo_lines = 0;
-
snap_type_strings = I18N (_snap_type_strings);
snap_mode_strings = I18N (_snap_mode_strings);
zoom_focus_strings = I18N (_zoom_focus_strings);
@@ -351,77 +480,17 @@ Editor::Editor ()
build_snap_type_menu();
build_edit_point_menu();
- snap_threshold = 5.0;
- bbt_beat_subdivision = 4;
- _visible_canvas_width = 0;
- _visible_canvas_height = 0;
- autoscroll_horizontal_allowed = false;
- autoscroll_vertical_allowed = false;
- logo_item = 0;
-
- analysis_window = 0;
-
- current_interthread_info = 0;
- _show_measures = true;
- _maximised = false;
- show_gain_after_trim = false;
-
- have_pending_keyboard_selection = false;
- _follow_playhead = true;
- _stationary_playhead = false;
- editor_ruler_menu = 0;
- no_ruler_shown_update = false;
- marker_menu = 0;
- range_marker_menu = 0;
- marker_menu_item = 0;
- tempo_or_meter_marker_menu = 0;
- transport_marker_menu = 0;
- new_transport_marker_menu = 0;
- editor_mixer_strip_width = Wide;
- show_editor_mixer_when_tracks_arrive = false;
- region_edit_menu_split_multichannel_item = 0;
- region_edit_menu_split_item = 0;
- temp_location = 0;
- leftmost_frame = 0;
- mouse_mode = MouseObject;
- current_stepping_trackview = 0;
- entered_track = 0;
- entered_regionview = 0;
- entered_marker = 0;
- clear_entered_track = false;
- current_timefx = 0;
- playhead_cursor = 0;
- button_release_can_deselect = true;
- _dragging_playhead = false;
- _dragging_edit_point = false;
- select_new_marker = false;
- rhythm_ferret = 0;
- layering_order_editor = 0;
- no_save_visual = false;
- resize_idle_id = -1;
- within_track_canvas = false;
-
- scrubbing_direction = 0;
-
- sfbrowser = 0;
-
location_marker_color = UIConfiguration::instance().color ("location marker");
location_range_color = UIConfiguration::instance().color ("location range");
location_cd_marker_color = UIConfiguration::instance().color ("location cd marker");
location_loop_color = UIConfiguration::instance().color ("location loop");
location_punch_color = UIConfiguration::instance().color ("location punch");
- zoom_focus = ZoomFocusPlayhead;
- _edit_point = EditAtMouse;
- _visible_track_count = -1;
-
- samples_per_pixel = 2048; /* too early to use reset_zoom () */
+ timebar_height = std::max(12., ceil (15. * ARDOUR_UI::ui_scale));
- timebar_height = std::max(12., ceil (15. * UIConfiguration::instance().get_ui_scale()));
TimeAxisView::setup_sizes ();
ArdourMarker::setup_sizes (timebar_height);
-
- _scroll_callbacks = 0;
+ TempoCurve::setup_sizes (timebar_height);
bbt_label.set_name ("EditorRulerLabel");
bbt_label.set_size_request (-1, (int)timebar_height);
@@ -595,7 +664,18 @@ Editor::Editor ()
_notebook_shrunk = false;
- editor_summary_pane.pack1(edit_packer);
+
+ /* Pick up some settings we need to cache, early */
+
+ XMLNode* settings = ARDOUR_UI::instance()->editor_settings();
+ XMLProperty* prop;
+
+ if (settings && (prop = settings->property ("notebook-shrunk"))) {
+ _notebook_shrunk = string_is_affirmative (prop->value ());
+ }
+
+ editor_summary_pane.set_check_divider_position (true);
+ editor_summary_pane.add (edit_packer);
Button* summary_arrows_left_left = manage (new Button);
summary_arrows_left_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE)));
@@ -636,22 +716,39 @@ Editor::Editor ()
_summary_hbox.pack_start (*summary_arrows_right, false, false);
if (!ARDOUR::Profile->get_trx()) {
- editor_summary_pane.pack2 (_summary_hbox);
+ editor_summary_pane.add (_summary_hbox);
}
- edit_pane.pack1 (editor_summary_pane, true, true);
+ edit_pane.set_check_divider_position (true);
+ edit_pane.add (editor_summary_pane);
if (!ARDOUR::Profile->get_trx()) {
- edit_pane.pack2 (_the_notebook, false, true);
+ edit_pane.add (_the_notebook);
}
- editor_summary_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&editor_summary_pane)));
+ edit_pane.set_drag_cursor (*_cursors->expand_left_right);
+ edit_pane.set_child_minsize (_the_notebook, 30); /* rough guess at width of notebook tabs */
+ editor_summary_pane.set_drag_cursor (*_cursors->expand_up_down);
+
+ float fract;
- /* XXX: editor_summary_pane might need similar to the edit_pane */
+ {
+ LocaleGuard lg;
+
+ if (!settings || ((prop = settings->property ("edit-horizontal-pane-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+ /* initial allocation is 90% to canvas, 10% to notebook */
+ edit_pane.set_divider (0, 0.90);
+ } else {
+ edit_pane.set_divider (0, fract);
+ }
- edit_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&edit_pane)));
+ if (!settings || ((prop = settings->property ("edit-vertical-pane-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+ /* initial allocation is 90% to canvas, 10% to summary */
+ editor_summary_pane.set_divider (0, 0.90);
+ } else {
- Glib::PropertyProxy<int> proxy = edit_pane.property_position();
- proxy.signal_changed().connect (bind (sigc::ptr_fun (pane_size_watcher), static_cast<Paned*> (&edit_pane)));
+ editor_summary_pane.set_divider (0, fract);
+ }
+ }
top_hbox.pack_start (toolbar_frame);
@@ -660,40 +757,20 @@ Editor::Editor ()
global_vpacker.pack_start (top_hbox, false, false);
global_vpacker.pack_start (*hbox, true, true);
-
global_hpacker.pack_start (global_vpacker, true, true);
- set_name ("EditorWindow");
- add_accel_group (ActionManager::ui_manager->get_accel_group());
-
- status_bar_hpacker.show ();
+ /* need to show the "contents" widget so that notebook will show if tab is switched to
+ */
- vpacker.pack_end (status_bar_hpacker, false, false);
- vpacker.pack_end (global_hpacker, true, true);
+ global_hpacker.show ();
/* register actions now so that set_state() can find them and set toggles/checks etc */
register_actions ();
- /* when we start using our own keybinding system for the editor, this
- * will be uncommented
- */
- // load_bindings ();
+ load_bindings ();
setup_toolbar ();
- set_zoom_focus (zoom_focus);
- set_visible_track_count (_visible_track_count);
- _snap_type = SnapToBeat;
- set_snap_to (_snap_type);
- _snap_mode = SnapOff;
- set_snap_mode (_snap_mode);
- set_mouse_mode (MouseObject, true);
- pre_internal_snap_type = _snap_type;
- pre_internal_snap_mode = _snap_mode;
- internal_snap_type = _snap_type;
- internal_snap_mode = _snap_mode;
- set_edit_point_preference (EditAtMouse, true);
-
_playlist_selector = new PlaylistSelector();
_playlist_selector->signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), static_cast<Window *> (_playlist_selector)));
@@ -709,39 +786,6 @@ Editor::Editor ()
fade_context_menu.set_name ("ArdourContextMenu");
- /* icons, titles, WM stuff */
-
- list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
- Glib::RefPtr<Gdk::Pixbuf> icon;
-
- if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
- window_icons.push_back (icon);
- }
- if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
- window_icons.push_back (icon);
- }
- if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
- window_icons.push_back (icon);
- }
- if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
- window_icons.push_back (icon);
- }
- if (!window_icons.empty()) {
- // set_icon_list (window_icons);
- set_default_icon_list (window_icons);
- }
-
- WindowTitle title(Glib::get_application_name());
- title += _("Editor");
- set_title (title.get_string());
- set_wmclass (X_("ardour_editor"), PROGRAM_NAME);
-
- add (vpacker);
- add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
-
- signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
- signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close));
-
Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released));
/* allow external control surfaces/protocols to do various things */
@@ -761,14 +805,18 @@ Editor::Editor ()
ControlProtocol::VerticalZoomInSelected.connect (*this, invalidator (*this), boost::bind (&Editor::control_vertical_zoom_in_selected, this), gui_context());
ControlProtocol::VerticalZoomOutSelected.connect (*this, invalidator (*this), boost::bind (&Editor::control_vertical_zoom_out_selected, this), gui_context());
- ControlProtocol::AddRouteToSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Add), gui_context());
- ControlProtocol::RemoveRouteFromSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
- ControlProtocol::SetRouteSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Set), gui_context());
- ControlProtocol::ToggleRouteSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
- ControlProtocol::ClearRouteSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_unselect, this), gui_context());
+ ControlProtocol::AddStripableToSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Add), gui_context());
+ ControlProtocol::RemoveStripableFromSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
+ ControlProtocol::SetStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Set), gui_context());
+ ControlProtocol::ToggleStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
+ ControlProtocol::ClearStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_unselect, this), gui_context());
BasicUI::AccessAction.connect (*this, invalidator (*this), boost::bind (&Editor::access_action, this, _1, _2), gui_context());
+ /* handle escape */
+
+ ARDOUR_UI::instance()->Escape.connect (*this, invalidator (*this), boost::bind (&Editor::escape, this), gui_context());
+
/* problematic: has to return a value and thus cannot be x-thread */
Session::AskAboutPlaylistDeletion.connect_same_thread (*this, boost::bind (&Editor::playlist_deletion_dialog, this, _1));
@@ -788,12 +836,12 @@ Editor::Editor ()
/* Button bindings */
- button_bindings = new Bindings;
+ button_bindings = new Bindings ("editor-mouse");
XMLNode* node = button_settings();
if (node) {
for (XMLNodeList::const_iterator i = node->children().begin(); i != node->children().end(); ++i) {
- button_bindings->load (**i);
+ button_bindings->load_operation (**i);
}
}
@@ -805,17 +853,21 @@ Editor::Editor ()
setup_fade_images ();
+ LuaInstance::instance(); // instantiate
+ LuaInstance::instance()->ActionChanged.connect (sigc::mem_fun (*this, &Editor::set_script_action_name));
+
instant_save ();
}
Editor::~Editor()
{
- delete button_bindings;
+ delete button_bindings;
delete _routes;
delete _route_groups;
delete _track_canvas_viewport;
delete _drags;
delete nudge_clock;
+ delete _verbose_cursor;
delete quantize_dialog;
delete _summary;
delete _group_tabs;
@@ -842,25 +894,6 @@ Editor::button_settings () const
return node;
}
-void
-Editor::add_toplevel_menu (Container& cont)
-{
- vpacker.pack_start (cont, false, false);
- cont.show_all ();
-}
-
-void
-Editor::add_transport_frame (Container& cont)
-{
- if(ARDOUR::Profile->get_mixbus()) {
- global_vpacker.pack_start (cont, false, false);
- global_vpacker.reorder_child (cont, 0);
- cont.show_all ();
- } else {
- vpacker.pack_start (cont, false, false);
- }
-}
-
bool
Editor::get_smart_mode () const
{
@@ -931,47 +964,9 @@ Editor::set_entered_track (TimeAxisView* tav)
}
void
-Editor::show_window ()
-{
- if (!is_visible ()) {
- DisplaySuspender ds;
- show_all ();
-
- /* XXX: this is a bit unfortunate; it would probably
- be nicer if we could just call show () above rather
- than needing the show_all ()
- */
-
- /* re-hide stuff if necessary */
- editor_list_button_toggled ();
- parameter_changed ("show-summary");
- parameter_changed ("show-group-tabs");
- parameter_changed ("show-zoom-tools");
-
- /* now reset all audio_time_axis heights, because widgets might need
- to be re-hidden
- */
-
- TimeAxisView *tv;
-
- for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
- tv = (static_cast<TimeAxisView*>(*i));
- tv->reset_height ();
- }
-
- if (current_mixer_strip) {
- current_mixer_strip->hide_things ();
- current_mixer_strip->parameter_changed ("mixer-element-visibility");
- }
- }
-
- present ();
-}
-
-void
Editor::instant_save ()
{
- if (!constructed || !ARDOUR_UI::instance()->session_loaded) {
+ if (!constructed || !ARDOUR_UI::instance()->session_loaded || no_save_instant) {
return;
}
@@ -1019,23 +1014,9 @@ Editor::control_unselect ()
}
void
-Editor::control_select (uint32_t rid, Selection::Operation op)
+Editor::control_select (boost::shared_ptr<Stripable> s, Selection::Operation op)
{
- /* handles the (static) signal from the ControlProtocol class that
- * requests setting the selected track to a given RID
- */
-
- if (!_session) {
- return;
- }
-
- boost::shared_ptr<Route> r = _session->route_by_remote_id (rid);
-
- if (!r) {
- return;
- }
-
- TimeAxisView* tav = axis_view_from_route (r);
+ TimeAxisView* tav = axis_view_from_stripable (s);
if (tav) {
switch (op) {
@@ -1160,14 +1141,11 @@ Editor::access_action (std::string action_group, std::string action_item)
void
Editor::on_realize ()
{
- Window::on_realize ();
Realized ();
if (UIConfiguration::instance().get_lock_gui_after_seconds()) {
start_lock_event_timing ();
}
-
- signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler));
}
void
@@ -1187,7 +1165,9 @@ Editor::generic_event_handler (GdkEvent* ev)
case GDK_MOTION_NOTIFY:
case GDK_KEY_PRESS:
case GDK_KEY_RELEASE:
- gettimeofday (&last_event_time, 0);
+ if (contents().is_mapped()) {
+ gettimeofday (&last_event_time, 0);
+ }
break;
case GDK_LEAVE_NOTIFY:
@@ -1202,7 +1182,7 @@ Editor::generic_event_handler (GdkEvent* ev)
/* leaving window, so reset focus, thus ending any and
all text entry operations.
*/
- reset_focus();
+ reset_focus (&contents());
break;
}
break;
@@ -1284,7 +1264,11 @@ Editor::center_screen_internal (framepos_t frame, float page)
void
Editor::update_title ()
{
- ENSURE_GUI_THREAD (*this, &Editor::update_title)
+ ENSURE_GUI_THREAD (*this, &Editor::update_title);
+
+ if (!own_window()) {
+ return;
+ }
if (_session) {
bool dirty = _session->dirty();
@@ -1302,8 +1286,9 @@ Editor::update_title ()
}
WindowTitle title(session_name);
+ title += S_("Window|Editor");
title += Glib::get_application_name();
- set_title (title.get_string());
+ own_window()->set_title (title.get_string());
} else {
/* ::session_going_away() will have taken care of it */
}
@@ -1379,9 +1364,11 @@ Editor::set_session (Session *t)
_session->StepEditStatusChange.connect (_session_connections, invalidator (*this), boost::bind (&Editor::step_edit_status_change, this, _1), gui_context());
_session->TransportStateChange.connect (_session_connections, invalidator (*this), boost::bind (&Editor::map_transport_state, this), gui_context());
_session->PositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::map_position_change, this, _1), gui_context());
+ _session->vca_manager().VCAAdded.connect (_session_connections, invalidator (*this), boost::bind (&Editor::add_vcas, this, _1), gui_context());
_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Editor::add_routes, this, _1), gui_context());
_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::update_title, this), gui_context());
_session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::tempo_map_changed, this, _1), gui_context());
+ _session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::marker_position_changed, this), gui_context());
_session->Located.connect (_session_connections, invalidator (*this), boost::bind (&Editor::located, this), gui_context());
_session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::parameter_changed, this, _1), gui_context());
_session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Editor::session_state_saved, this, _1), gui_context());
@@ -1420,12 +1407,33 @@ Editor::set_session (Session *t)
break;
}
+ /* catch up on selection of stripables (other selection state is lost
+ * when a session is closed
+ */
+
+ StripableList sl;
+ TrackViewList tl;
+ _session->get_stripables (sl);
+ for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
+ if ((*s)->presentation_info().selected()) {
+ RouteTimeAxisView* rtav = get_route_view_by_route_id ((*s)->id());
+ if (rtav) {
+ tl.push_back (rtav);
+ }
+ }
+ }
+ if (!tl.empty()) {
+ selection->set (tl);
+ }
+
/* register for undo history */
_session->register_with_memento_command_factory(id(), this);
_session->register_with_memento_command_factory(_selection_memento->id(), _selection_memento);
ActionManager::ui_manager->signal_pre_activate().connect (sigc::mem_fun (*this, &Editor::action_pre_activated));
+ LuaInstance::instance()->set_session(_session);
+
start_updating_meters ();
}
@@ -1685,7 +1693,7 @@ Editor::build_track_context_menu ()
{
using namespace Menu_Helpers;
- MenuList& edit_items = track_context_menu.items();
+ MenuList& edit_items = track_context_menu.items();
edit_items.clear();
add_dstream_context_items (edit_items);
@@ -1697,7 +1705,7 @@ Editor::build_track_bus_context_menu ()
{
using namespace Menu_Helpers;
- MenuList& edit_items = track_context_menu.items();
+ MenuList& edit_items = track_context_menu.items();
edit_items.clear();
add_bus_context_items (edit_items);
@@ -1734,7 +1742,103 @@ Editor::build_track_region_context_menu ()
}
void
-Editor::analyze_region_selection ()
+Editor::loudness_analyze_region_selection ()
+{
+ if (!_session) {
+ return;
+ }
+ Selection& s (PublicEditor::instance ().get_selection ());
+ RegionSelection ars = s.regions;
+ ARDOUR::AnalysisGraph ag (_session);
+ framecnt_t total_work = 0;
+
+ for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) {
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*> (*j);
+ if (!arv) {
+ continue;
+ }
+ if (!boost::dynamic_pointer_cast<AudioRegion> (arv->region ())) {
+ continue;
+ }
+ assert (dynamic_cast<RouteTimeAxisView *> (&arv->get_time_axis_view ()));
+ total_work += arv->region ()->length ();
+ }
+
+ SimpleProgressDialog spd (_("Region Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel));
+ ScopedConnection c;
+ ag.set_total_frames (total_work);
+ ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2));
+ spd.show();
+
+ for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) {
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*> (*j);
+ if (!arv) {
+ continue;
+ }
+ boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (arv->region ());
+ if (!ar) {
+ continue;
+ }
+ ag.analyze_region (ar);
+ }
+ spd.hide();
+ if (!ag.canceled ()) {
+ ExportReport er (_("Audio Report/Analysis"), ag.results ());
+ er.run();
+ }
+}
+
+void
+Editor::loudness_analyze_range_selection ()
+{
+ if (!_session) {
+ return;
+ }
+ Selection& s (PublicEditor::instance ().get_selection ());
+ TimeSelection ts = s.time;
+ ARDOUR::AnalysisGraph ag (_session);
+ framecnt_t total_work = 0;
+
+ for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) {
+ boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> ((*i)->playlist ());
+ if (!pl) {
+ continue;
+ }
+ RouteUI *rui = dynamic_cast<RouteUI *> (*i);
+ if (!pl || !rui) {
+ continue;
+ }
+ for (std::list<AudioRange>::iterator j = ts.begin (); j != ts.end (); ++j) {
+ total_work += j->length ();
+ }
+ }
+
+ SimpleProgressDialog spd (_("Range Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel));
+ ScopedConnection c;
+ ag.set_total_frames (total_work);
+ ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2));
+ spd.show();
+
+ for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) {
+ boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> ((*i)->playlist ());
+ if (!pl) {
+ continue;
+ }
+ RouteUI *rui = dynamic_cast<RouteUI *> (*i);
+ if (!pl || !rui) {
+ continue;
+ }
+ ag.analyze_range (rui->route (), pl, ts);
+ }
+ spd.hide();
+ if (!ag.canceled ()) {
+ ExportReport er (_("Audio Report/Analysis"), ag.results ());
+ er.run();
+ }
+}
+
+void
+Editor::spectral_analyze_region_selection ()
{
if (analysis_window == 0) {
analysis_window = new AnalysisWindow();
@@ -1752,7 +1856,7 @@ Editor::analyze_region_selection ()
}
void
-Editor::analyze_range_selection()
+Editor::spectral_analyze_range_selection()
{
if (analysis_window == 0) {
analysis_window = new AnalysisWindow();
@@ -1846,7 +1950,8 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items)
edit_items.push_back (MenuElem (_("Zoom to Range"), sigc::bind (sigc::mem_fun(*this, &Editor::temporal_zoom_selection), false)));
edit_items.push_back (SeparatorElem());
- edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::analyze_range_selection)));
+ edit_items.push_back (MenuElem (_("Loudness Analysis"), sigc::mem_fun(*this, &Editor::loudness_analyze_range_selection)));
+ edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::spectral_analyze_range_selection)));
edit_items.push_back (SeparatorElem());
@@ -2053,6 +2158,37 @@ Editor::snap_type() const
return _snap_type;
}
+bool
+Editor::snap_musical() const
+{
+ switch (_snap_type) {
+ case SnapToBeatDiv128:
+ case SnapToBeatDiv64:
+ case SnapToBeatDiv32:
+ case SnapToBeatDiv28:
+ case SnapToBeatDiv24:
+ case SnapToBeatDiv20:
+ case SnapToBeatDiv16:
+ case SnapToBeatDiv14:
+ case SnapToBeatDiv12:
+ case SnapToBeatDiv10:
+ case SnapToBeatDiv8:
+ case SnapToBeatDiv7:
+ case SnapToBeatDiv6:
+ case SnapToBeatDiv5:
+ case SnapToBeatDiv4:
+ case SnapToBeatDiv3:
+ case SnapToBeatDiv2:
+ case SnapToBeat:
+ case SnapToBar:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
SnapMode
Editor::snap_mode() const
{
@@ -2103,14 +2239,10 @@ Editor::set_snap_to (SnapType st)
case SnapToBeatDiv4:
case SnapToBeatDiv3:
case SnapToBeatDiv2: {
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
- compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ update_tempo_based_rulers (grid);
break;
}
@@ -2204,54 +2336,14 @@ Editor::set_edit_point_preference (EditPoint ep, bool force)
}
int
-Editor::set_state (const XMLNode& node, int /*version*/)
+Editor::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
- XMLNode* geometry;
- int x, y;
- Gdk::Geometry g;
-
+ XMLProperty const * prop;
set_id (node);
+ PBD::Unwinder<bool> nsi (no_save_instant, true);
+ LocaleGuard lg;
- g.base_width = default_width;
- g.base_height = default_height;
- x = 1;
- y = 1;
-
- if ((geometry = find_named_node (node, "geometry")) != 0) {
-
- XMLProperty* prop;
-
- if ((prop = geometry->property("x_size")) == 0) {
- prop = geometry->property ("x-size");
- }
- if (prop) {
- g.base_width = atoi(prop->value());
- }
- if ((prop = geometry->property("y_size")) == 0) {
- prop = geometry->property ("y-size");
- }
- if (prop) {
- g.base_height = atoi(prop->value());
- }
-
- if ((prop = geometry->property ("x_pos")) == 0) {
- prop = geometry->property ("x-pos");
- }
- if (prop) {
- x = atoi (prop->value());
-
- }
- if ((prop = geometry->property ("y_pos")) == 0) {
- prop = geometry->property ("y-pos");
- }
- if (prop) {
- y = atoi (prop->value());
- }
- }
-
- set_default_size (g.base_width, g.base_height);
- move (x, y);
+ Tabbable::set_state (node, version);
if (_session && (prop = node.property ("playhead"))) {
framepos_t pos;
@@ -2272,6 +2364,8 @@ Editor::set_state (const XMLNode& node, int /*version*/)
if ((prop = node.property ("zoom-focus"))) {
zoom_focus_selection_done ((ZoomFocus) string_2_enum (prop->value(), zoom_focus));
+ } else {
+ zoom_focus_selection_done (zoom_focus);
}
if ((prop = node.property ("zoom"))) {
@@ -2288,10 +2382,20 @@ Editor::set_state (const XMLNode& node, int /*version*/)
if ((prop = node.property ("snap-to"))) {
snap_type_selection_done ((SnapType) string_2_enum (prop->value(), _snap_type));
+ set_snap_to ((SnapType) string_2_enum (prop->value(), _snap_type));
+ } else {
+ set_snap_to (_snap_type);
}
if ((prop = node.property ("snap-mode"))) {
snap_mode_selection_done((SnapMode) string_2_enum (prop->value(), _snap_mode));
+ /* set text of Dropdown. in case _snap_mode == SnapOff (default)
+ * snap_mode_selection_done() will only mark an already active item as active
+ * which does not trigger set_text().
+ */
+ set_snap_mode ((SnapMode) string_2_enum (prop->value(), _snap_mode));
+ } else {
+ set_snap_mode (_snap_mode);
}
if ((prop = node.property ("internal-snap-to"))) {
@@ -2344,6 +2448,8 @@ Editor::set_state (const XMLNode& node, int /*version*/)
if ((prop = node.property ("edit-point"))) {
set_edit_point_preference ((EditPoint) string_2_enum (prop->value(), _edit_point), true);
+ } else {
+ set_edit_point_preference (_edit_point);
}
if ((prop = node.property ("show-measures"))) {
@@ -2470,43 +2576,26 @@ Editor::set_state (const XMLNode& node, int /*version*/)
}
}
- return 0;
+ return LuaInstance::instance()->set_state(node);
}
XMLNode&
Editor::get_state ()
{
- XMLNode* node = new XMLNode ("Editor");
+ XMLNode* node = new XMLNode (X_("Editor"));
char buf[32];
+ LocaleGuard lg;
id().print (buf, sizeof (buf));
node->add_property ("id", buf);
- if (is_realized()) {
- Glib::RefPtr<Gdk::Window> win = get_window();
-
- int x, y, width, height;
- win->get_root_origin(x, y);
- win->get_size(width, height);
+ node->add_child_nocopy (Tabbable::get_state());
- XMLNode* geometry = new XMLNode ("geometry");
-
- snprintf(buf, sizeof(buf), "%d", width);
- geometry->add_property("x-size", string(buf));
- snprintf(buf, sizeof(buf), "%d", height);
- geometry->add_property("y-size", string(buf));
- snprintf(buf, sizeof(buf), "%d", x);
- geometry->add_property("x-pos", string(buf));
- snprintf(buf, sizeof(buf), "%d", y);
- geometry->add_property("y-pos", string(buf));
- snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&edit_pane)->gobj()));
- geometry->add_property("edit-horizontal-pane-pos", string(buf));
- geometry->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
- snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&editor_summary_pane)->gobj()));
- geometry->add_property("edit-vertical-pane-pos", string(buf));
-
- node->add_child_nocopy (*geometry);
- }
+ snprintf(buf,sizeof(buf), "%f", edit_pane.get_divider ());
+ node->add_property("edit-horizontal-pane-pos", string(buf));
+ node->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
+ snprintf(buf,sizeof(buf), "%f", editor_summary_pane.get_divider());
+ node->add_property("edit-vertical-pane-pos", string(buf));
maybe_add_mixer_strip_width (*node);
@@ -2568,6 +2657,9 @@ Editor::get_state ()
snprintf (buf, sizeof (buf), "%" PRId64, nudge_clock->current_duration());
node->add_property ("nudge-clock-value", buf);
+ node->add_child_nocopy (LuaInstance::instance()->get_action_state());
+ node->add_child_nocopy (LuaInstance::instance()->get_hook_state());
+
return *node;
}
@@ -2972,24 +3064,8 @@ Editor::setup_toolbar ()
if (!ARDOUR::Profile->get_trx()) {
mode_box->pack_start (edit_mode_selector, false, false);
}
- mode_box->pack_start (*mouse_mode_box, false, false);
- _mouse_mode_tearoff = manage (new TearOff (*mode_box));
- _mouse_mode_tearoff->set_name ("MouseModeBase");
- _mouse_mode_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_mouse_mode_tearoff->tearoff_window()), false);
-
- if (Profile->get_sae() || Profile->get_mixbus() ) {
- _mouse_mode_tearoff->set_can_be_torn_off (false);
- }
-
- _mouse_mode_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window()));
- _mouse_mode_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window(), 1));
- _mouse_mode_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window()));
- _mouse_mode_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_mouse_mode_tearoff->tearoff_window(), 1));
+ mode_box->pack_start (*mouse_mode_box, false, false);
/* Zoom */
@@ -3061,23 +3137,6 @@ Editor::setup_toolbar ()
_zoom_box.pack_start (tav_expand_button);
}
- if (!ARDOUR::Profile->get_trx()) {
- _zoom_tearoff = manage (new TearOff (_zoom_box));
-
- _zoom_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_zoom_tearoff->tearoff_window()));
- _zoom_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_zoom_tearoff->tearoff_window(), 0));
- _zoom_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_zoom_tearoff->tearoff_window()));
- _zoom_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_zoom_tearoff->tearoff_window(), 0));
- }
-
- if (Profile->get_sae() || Profile->get_mixbus() ) {
- _zoom_tearoff->set_can_be_torn_off (false);
- }
-
snap_box.set_spacing (2);
snap_box.set_border_width (2);
@@ -3110,37 +3169,19 @@ Editor::setup_toolbar ()
HBox* hbox = manage (new HBox);
hbox->set_spacing(2);
- _tools_tearoff = manage (new TearOff (*hbox));
- _tools_tearoff->set_name ("MouseModeBase");
- _tools_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_tools_tearoff->tearoff_window()), false);
-
- if (Profile->get_sae() || Profile->get_mixbus()) {
- _tools_tearoff->set_can_be_torn_off (false);
- }
-
- _tools_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_tools_tearoff->tearoff_window()));
- _tools_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_tools_tearoff->tearoff_window(), 0));
- _tools_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
- &_tools_tearoff->tearoff_window()));
- _tools_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
- &_tools_tearoff->tearoff_window(), 0));
-
toolbar_hbox.set_spacing (2);
toolbar_hbox.set_border_width (1);
- toolbar_hbox.pack_start (*_mouse_mode_tearoff, false, false);
+ toolbar_hbox.pack_start (*mode_box, false, false);
if (!ARDOUR::Profile->get_trx()) {
- toolbar_hbox.pack_start (*_zoom_tearoff, false, false);
- toolbar_hbox.pack_start (*_tools_tearoff, false, false);
+ toolbar_hbox.pack_start (_zoom_box, false, false);
+ toolbar_hbox.pack_start (*hbox, false, false);
}
if (!ARDOUR::Profile->get_trx()) {
hbox->pack_start (snap_box, false, false);
hbox->pack_start (*nudge_box, false, false);
}
- hbox->pack_start (panic_box, false, false);
hbox->show_all ();
@@ -3624,11 +3665,7 @@ Editor::cycle_edit_mode ()
{
switch (Config->get_edit_mode()) {
case Slide:
- if (Profile->get_sae()) {
- Config->set_edit_mode (Lock);
- } else {
- Config->set_edit_mode (Ripple);
- }
+ Config->set_edit_mode (Ripple);
break;
case Splice:
case Ripple:
@@ -3836,7 +3873,7 @@ bool
Editor::edit_controls_button_release (GdkEventButton* ev)
{
if (Keyboard::is_context_menu_event (ev)) {
- ARDOUR_UI::instance()->add_route (this);
+ ARDOUR_UI::instance()->add_route ();
} else if (ev->button == 1) {
selection->clear_tracks ();
}
@@ -3897,98 +3934,6 @@ Editor::cycle_zoom_focus ()
}
void
-Editor::ensure_float (Window& win)
-{
- win.set_transient_for (*this);
-}
-
-void
-Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
-{
- /* recover or initialize pane positions. do this here rather than earlier because
- we don't want the positions to change the child allocations, which they seem to do.
- */
-
- int pos;
- XMLProperty* prop;
- char buf[32];
- XMLNode* node = ARDOUR_UI::instance()->editor_settings();
-
- enum Pane {
- Horizontal = 0x1,
- Vertical = 0x2
- };
-
- static Pane done;
-
- XMLNode* geometry = find_named_node (*node, "geometry");
-
- if (which == static_cast<Paned*> (&edit_pane)) {
-
- if (done & Horizontal) {
- return;
- }
-
- if (geometry && (prop = geometry->property ("notebook-shrunk"))) {
- _notebook_shrunk = string_is_affirmative (prop->value ());
- }
-
- if (!geometry || (prop = geometry->property ("edit-horizontal-pane-pos")) == 0) {
- /* initial allocation is 90% to canvas, 10% to notebook */
- pos = (int) floor (alloc.get_width() * 0.90f);
- snprintf (buf, sizeof(buf), "%d", pos);
- } else {
- pos = atoi (prop->value());
- }
-
- if (GTK_WIDGET(edit_pane.gobj())->allocation.width > pos) {
- edit_pane.set_position (pos);
- }
-
- done = (Pane) (done | Horizontal);
-
- } else if (which == static_cast<Paned*> (&editor_summary_pane)) {
-
- if (done & Vertical) {
- return;
- }
-
- if (!geometry || (prop = geometry->property ("edit-vertical-pane-pos")) == 0) {
- /* initial allocation is 90% to canvas, 10% to summary */
- pos = (int) floor (alloc.get_height() * 0.90f);
- snprintf (buf, sizeof(buf), "%d", pos);
- } else {
-
- pos = atoi (prop->value());
- }
-
- if (GTK_WIDGET(editor_summary_pane.gobj())->allocation.height > pos) {
- editor_summary_pane.set_position (pos);
- }
-
- done = (Pane) (done | Vertical);
- }
-}
-
-void
-Editor::detach_tearoff (Box* /*b*/, Window* /*w*/)
-{
- if ((_tools_tearoff->torn_off() || !_tools_tearoff->visible()) &&
- (_mouse_mode_tearoff->torn_off() || !_mouse_mode_tearoff->visible()) &&
- (_zoom_tearoff && (_zoom_tearoff->torn_off() || !_zoom_tearoff->visible()))) {
- top_hbox.remove (toolbar_frame);
- }
-}
-
-void
-Editor::reattach_tearoff (Box* /*b*/, Window* /*w*/, int32_t /*n*/)
-{
- if (toolbar_frame.get_parent() == 0) {
- top_hbox.pack_end (toolbar_frame);
- }
-}
-
-void
Editor::set_show_measures (bool yn)
{
if (_show_measures != yn) {
@@ -3999,11 +3944,9 @@ Editor::set_show_measures (bool yn)
tempo_lines->show();
}
- ARDOUR::TempoMap::BBTPointList::const_iterator begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator end;
-
- compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end);
- draw_measures (begin, end);
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ draw_measures (grid);
}
instant_save ();
@@ -4109,6 +4052,47 @@ Editor::get_grid_beat_divisions(framepos_t position)
return 0;
}
+/** returns the current musical grid divisiions using the supplied modifier mask from a GtkEvent.
+ if the grid is non-musical, returns 0.
+ if the grid is snapped to bars, returns -1.
+ @param event_state the current keyboard modifier mask.
+*/
+unsigned
+Editor::get_grid_music_divisions (uint32_t event_state)
+{
+ if (snap_mode() == Editing::SnapOff && !ArdourKeyboard::indicates_snap (event_state)) {
+ return 0;
+ }
+
+ if (snap_mode() != Editing::SnapOff && ArdourKeyboard::indicates_snap (event_state)) {
+ return 0;
+ }
+
+ switch (_snap_type) {
+ case SnapToBeatDiv128: return 128;
+ case SnapToBeatDiv64: return 64;
+ case SnapToBeatDiv32: return 32;
+ case SnapToBeatDiv28: return 28;
+ case SnapToBeatDiv24: return 24;
+ case SnapToBeatDiv20: return 20;
+ case SnapToBeatDiv16: return 16;
+ case SnapToBeatDiv14: return 14;
+ case SnapToBeatDiv12: return 12;
+ case SnapToBeatDiv10: return 10;
+ case SnapToBeatDiv8: return 8;
+ case SnapToBeatDiv7: return 7;
+ case SnapToBeatDiv6: return 6;
+ case SnapToBeatDiv5: return 5;
+ case SnapToBeatDiv4: return 4;
+ case SnapToBeatDiv3: return 3;
+ case SnapToBeatDiv2: return 2;
+ case SnapToBeat: return 1;
+ case SnapToBar : return -1;
+ default: return 0;
+ }
+ return 0;
+}
+
Evoral::Beats
Editor::get_grid_type_as_beats (bool& success, framepos_t position)
{
@@ -4124,7 +4108,7 @@ Editor::get_grid_type_as_beats (bool& success, framepos_t position)
return Evoral::Beats(1.0);
case SnapToBar:
if (_session) {
- return Evoral::Beats(_session->tempo_map().meter_at (position).divisions_per_bar());
+ return Evoral::Beats(_session->tempo_map().meter_at_frame (position).divisions_per_bar());
}
break;
default:
@@ -4268,34 +4252,18 @@ Editor::session_state_saved (string)
}
void
-Editor::update_tearoff_visibility()
-{
- bool visible = UIConfiguration::instance().get_keep_tearoffs();
- _mouse_mode_tearoff->set_visible (visible);
- _tools_tearoff->set_visible (visible);
- if (_zoom_tearoff) {
- _zoom_tearoff->set_visible (visible);
- }
-}
-
-void
-Editor::reattach_all_tearoffs ()
-{
- if (_mouse_mode_tearoff) _mouse_mode_tearoff->put_it_back ();
- if (_tools_tearoff) _tools_tearoff->put_it_back ();
- if (_zoom_tearoff) _zoom_tearoff->put_it_back ();
-}
-
-void
Editor::maximise_editing_space ()
{
if (_maximised) {
return;
}
- fullscreen ();
+ Gtk::Window* toplevel = current_toplevel();
- _maximised = true;
+ if (toplevel) {
+ toplevel->fullscreen ();
+ _maximised = true;
+ }
}
void
@@ -4305,9 +4273,12 @@ Editor::restore_editing_space ()
return;
}
- unfullscreen();
+ Gtk::Window* toplevel = current_toplevel();
- _maximised = false;
+ if (toplevel) {
+ toplevel->unfullscreen();
+ _maximised = false;
+ }
}
/**
@@ -4322,7 +4293,7 @@ Editor::new_playlists (TimeAxisView* v)
begin_reversible_command (_("new playlists"));
vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
_session->playlists->get (playlists);
- mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v, ARDOUR::Properties::select.property_id);
+ mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v, ARDOUR::Properties::group_select.property_id);
commit_reversible_command ();
}
@@ -4338,7 +4309,7 @@ Editor::copy_playlists (TimeAxisView* v)
begin_reversible_command (_("copy playlists"));
vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
_session->playlists->get (playlists);
- mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v, ARDOUR::Properties::select.property_id);
+ mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v, ARDOUR::Properties::group_select.property_id);
commit_reversible_command ();
}
@@ -4353,7 +4324,7 @@ Editor::clear_playlists (TimeAxisView* v)
begin_reversible_command (_("clear playlists"));
vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
_session->playlists->get (playlists);
- mapover_tracks (sigc::mem_fun (*this, &Editor::mapped_clear_playlist), v, ARDOUR::Properties::select.property_id);
+ mapover_tracks (sigc::mem_fun (*this, &Editor::mapped_clear_playlist), v, ARDOUR::Properties::group_select.property_id);
commit_reversible_command ();
}
@@ -4375,19 +4346,6 @@ Editor::mapped_clear_playlist (RouteTimeAxisView& atv, uint32_t /*sz*/)
atv.clear_playlist ();
}
-bool
-Editor::on_key_press_event (GdkEventKey* ev)
-{
- return key_press_focus_accelerator_handler (*this, ev);
-}
-
-bool
-Editor::on_key_release_event (GdkEventKey* ev)
-{
- return Gtk::Window::on_key_release_event (ev);
- // return key_press_focus_accelerator_handler (*this, ev);
-}
-
double
Editor::get_y_origin () const
{
@@ -4456,7 +4414,7 @@ Editor::current_visual_state (bool with_tracks)
vs->zoom_focus = zoom_focus;
if (with_tracks) {
- *vs->gui_state = *ARDOUR_UI::instance()->gui_object_state;
+ vs->gui_state->set_state (ARDOUR_UI::instance()->gui_object_state->get_state());
}
return vs;
@@ -4521,7 +4479,7 @@ Editor::use_visual_state (VisualState& vs)
reposition_and_zoom (vs.leftmost_frame, vs.samples_per_pixel);
if (vs.gui_state) {
- *ARDOUR_UI::instance()->gui_object_state = *vs.gui_state;
+ ARDOUR_UI::instance()->gui_object_state->set_state (vs.gui_state->get_state());
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(*i)->clear_property_cache();
@@ -4655,14 +4613,10 @@ Editor::visual_changer (const VisualChange& vc)
compute_fixed_ruler_scale ();
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
- compute_current_bbt_points (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+ compute_bbt_ruler_scale (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+ update_tempo_based_rulers (grid);
update_video_timeline();
}
@@ -4980,7 +4934,7 @@ Editor::get_regions_from_selection_and_mouse (framepos_t pos)
*/
RegionSelection
-Editor::get_regions_from_selection_and_entered ()
+Editor::get_regions_from_selection_and_entered () const
{
RegionSelection regions = selection->regions;
@@ -5092,12 +5046,11 @@ Editor::first_idle ()
if (track_views.size() > 1) {
Timers::TimerSuspender t;
dialog = new MessageDialog (
- *this,
string_compose (_("Please wait while %1 loads visual data."), PROGRAM_NAME),
true
);
dialog->present ();
- ARDOUR_UI::instance()->flush_pending ();
+ ARDOUR_UI::instance()->flush_pending (60);
}
for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) {
@@ -5233,16 +5186,13 @@ Editor::region_view_removed ()
_summary->set_background_dirty ();
}
-RouteTimeAxisView*
-Editor::axis_view_from_route (boost::shared_ptr<Route> r) const
+TimeAxisView*
+Editor::axis_view_from_stripable (boost::shared_ptr<Stripable> s) const
{
- TrackViewList::const_iterator j = track_views.begin ();
- while (j != track_views.end()) {
- RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*j);
- if (rtv && rtv->route() == r) {
- return rtv;
+ for (TrackViewList::const_iterator j = track_views.begin (); j != track_views.end(); ++j) {
+ if ((*j)->stripable() == s) {
+ return *j;
}
- ++j;
}
return 0;
@@ -5255,7 +5205,7 @@ Editor::axis_views_from_routes (boost::shared_ptr<RouteList> r) const
TrackViewList t;
for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
- TimeAxisView* tv = axis_view_from_route (*i);
+ TimeAxisView* tv = axis_view_from_stripable (*i);
if (tv) {
t.push_back (tv);
}
@@ -5282,56 +5232,94 @@ Editor::resume_route_redisplay ()
}
void
-Editor::add_routes (RouteList& routes)
+Editor::add_vcas (VCAList& vlist)
+{
+ StripableList sl;
+
+ for (VCAList::iterator v = vlist.begin(); v != vlist.end(); ++v) {
+ sl.push_back (boost::dynamic_pointer_cast<Stripable> (*v));
+ }
+
+ add_stripables (sl);
+}
+
+void
+Editor::add_routes (RouteList& rlist)
{
- ENSURE_GUI_THREAD (*this, &Editor::handle_new_route, routes)
+ StripableList sl;
- RouteTimeAxisView *rtv;
- list<RouteTimeAxisView*> new_views;
+ for (RouteList::iterator r = rlist.begin(); r != rlist.end(); ++r) {
+ sl.push_back (*r);
+ }
+
+ add_stripables (sl);
+}
+
+void
+Editor::add_stripables (StripableList& sl)
+{
+ list<TimeAxisView*> new_views;
+ boost::shared_ptr<VCA> v;
+ boost::shared_ptr<Route> r;
TrackViewList new_selection;
bool from_scratch = (track_views.size() == 0);
- for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
- boost::shared_ptr<Route> route = (*x);
+ sl.sort (StripablePresentationInfoSorter());
- if (route->is_auditioner() || route->is_monitor()) {
- continue;
- }
+ for (StripableList::iterator s = sl.begin(); s != sl.end(); ++s) {
- DataType dt = route->input()->default_type();
+ if ((v = boost::dynamic_pointer_cast<VCA> (*s)) != 0) {
- if (dt == ARDOUR::DataType::AUDIO) {
- rtv = new AudioTimeAxisView (*this, _session, *_track_canvas);
- rtv->set_route (route);
- } else if (dt == ARDOUR::DataType::MIDI) {
- rtv = new MidiTimeAxisView (*this, _session, *_track_canvas);
- rtv->set_route (route);
- } else {
- throw unknown_type();
- }
+ VCATimeAxisView* vtv = new VCATimeAxisView (*this, _session, *_track_canvas);
+ vtv->set_vca (v);
+ new_views.push_back (vtv);
- new_views.push_back (rtv);
- track_views.push_back (rtv);
- new_selection.push_back (rtv);
+ } else if ((r = boost::dynamic_pointer_cast<Route> (*s)) != 0) {
- rtv->effective_gain_display ();
+ if (r->is_auditioner() || r->is_monitor()) {
+ continue;
+ }
+
+ RouteTimeAxisView* rtv;
+ DataType dt = r->input()->default_type();
- rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added));
- rtv->view()->RegionViewRemoved.connect (sigc::mem_fun (*this, &Editor::region_view_removed));
+ if (dt == ARDOUR::DataType::AUDIO) {
+ rtv = new AudioTimeAxisView (*this, _session, *_track_canvas);
+ rtv->set_route (r);
+ } else if (dt == ARDOUR::DataType::MIDI) {
+ rtv = new MidiTimeAxisView (*this, _session, *_track_canvas);
+ rtv->set_route (r);
+ } else {
+ throw unknown_type();
+ }
+
+ new_views.push_back (rtv);
+ track_views.push_back (rtv);
+ new_selection.push_back (rtv);
+
+ rtv->effective_gain_display ();
+
+ rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added));
+ rtv->view()->RegionViewRemoved.connect (sigc::mem_fun (*this, &Editor::region_view_removed));
+ }
}
if (new_views.size() > 0) {
- _routes->routes_added (new_views);
- _summary->routes_added (new_views);
+ _routes->time_axis_views_added (new_views);
+ //_summary->routes_added (new_selection); /* XXX requires RouteTimeAxisViewList */
}
- if (!from_scratch) {
+ /* note: !new_selection.empty() means that we got some routes rather
+ * than just VCAs
+ */
+
+ if (!from_scratch && !new_selection.empty()) {
selection->tracks.clear();
selection->add (new_selection);
begin_selection_op_history();
}
- if (show_editor_mixer_when_tracks_arrive) {
+ if (show_editor_mixer_when_tracks_arrive && !new_selection.empty()) {
show_editor_mixer (true);
}
@@ -5665,7 +5653,7 @@ Editor::super_rapid_screen_update ()
/* METERING / MIXER STRIPS */
/* update track meters, if required */
- if (is_mapped() && meters_running) {
+ if (contents().is_mapped() && meters_running) {
RouteTimeAxisView* rtv;
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
if ((rtv = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
@@ -5795,16 +5783,42 @@ Editor::session_going_away ()
stop_step_editing ();
- /* get rid of any existing editor mixer strip */
+ if (own_window()) {
+
+ /* get rid of any existing editor mixer strip */
- WindowTitle title(Glib::get_application_name());
- title += _("Editor");
+ WindowTitle title(Glib::get_application_name());
+ title += _("Editor");
- set_title (title.get_string());
+ own_window()->set_title (title.get_string());
+ }
SessionHandlePtr::session_going_away ();
}
+void
+Editor::trigger_script (int i)
+{
+ LuaInstance::instance()-> call_action (i);
+}
+
+void
+Editor::set_script_action_name (int i, const std::string& n)
+{
+ string const a = string_compose (X_("script-action-%1"), i + 1);
+ Glib::RefPtr<Action> act = ActionManager::get_action(X_("Editor"), a.c_str());
+ assert (act);
+ if (n.empty ()) {
+ act->set_label (string_compose (_("Unset #%1"), i + 1));
+ act->set_tooltip (_("no action bound"));
+ act->set_sensitive (false);
+ } else {
+ act->set_label (n);
+ act->set_tooltip (n);
+ act->set_sensitive (true);
+ }
+ KeyEditor::UpdateBindings ();
+}
void
Editor::show_editor_list (bool yn)
@@ -5920,16 +5934,16 @@ Editor::notebook_tab_clicked (GdkEventButton* ev, Gtk::Widget* page)
if (_notebook_shrunk) {
if (pre_notebook_shrink_pane_width) {
- edit_pane.set_position (*pre_notebook_shrink_pane_width);
+ edit_pane.set_divider (0, *pre_notebook_shrink_pane_width);
}
_notebook_shrunk = false;
} else {
- pre_notebook_shrink_pane_width = edit_pane.get_position();
+ pre_notebook_shrink_pane_width = edit_pane.get_divider();
/* this expands the LHS of the edit pane to cover the notebook
PAGE but leaves the tabs visible.
*/
- edit_pane.set_position (edit_pane.get_position() + page->get_width());
+ edit_pane.set_divider (0, edit_pane.get_divider() + page->get_width());
_notebook_shrunk = true;
}
}
@@ -6026,9 +6040,65 @@ Editor::ui_parameter_changed (string parameter)
}
_cursors->set_cursor_set (UIConfiguration::instance().get_icon_set());
_cursor_stack.push_back(_cursors->grabber);
+ edit_pane.set_drag_cursor (*_cursors->expand_left_right);
+ editor_summary_pane.set_drag_cursor (*_cursors->expand_up_down);
+
} else if (parameter == "draggable-playhead") {
if (_verbose_cursor) {
playhead_cursor->set_sensitive (UIConfiguration::instance().get_draggable_playhead());
}
}
}
+
+Gtk::Window*
+Editor::use_own_window (bool and_fill_it)
+{
+ bool new_window = !own_window();
+
+ Gtk::Window* win = Tabbable::use_own_window (and_fill_it);
+
+ if (win && new_window) {
+ win->set_name ("EditorWindow");
+
+ ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Editor"), this);
+
+ // win->signal_realize().connect (*this, &Editor::on_realize);
+ win->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), win));
+ win->signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler));
+ win->set_data ("ardour-bindings", bindings);
+
+ update_title ();
+ }
+
+ DisplaySuspender ds;
+ contents().show_all ();
+
+ /* XXX: this is a bit unfortunate; it would probably
+ be nicer if we could just call show () above rather
+ than needing the show_all ()
+ */
+
+ /* re-hide stuff if necessary */
+ editor_list_button_toggled ();
+ parameter_changed ("show-summary");
+ parameter_changed ("show-group-tabs");
+ parameter_changed ("show-zoom-tools");
+
+ /* now reset all audio_time_axis heights, because widgets might need
+ to be re-hidden
+ */
+
+ TimeAxisView *tv;
+
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+ tv = (static_cast<TimeAxisView*>(*i));
+ tv->reset_height ();
+ }
+
+ if (current_mixer_strip) {
+ current_mixer_strip->hide_things ();
+ current_mixer_strip->parameter_changed ("mixer-element-visibility");
+ }
+
+ return win;
+}
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index fab6535..d45545b 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -34,11 +34,12 @@
#include <gtkmm/comboboxtext.h>
#include <gtkmm/layout.h>
-#include "gtkmm2ext/selector.h"
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/click_box.h"
#include "gtkmm2ext/dndtreeview.h"
+#include "gtkmm2ext/pane.h"
+#include "gtkmm2ext/selector.h"
#include "gtkmm2ext/stateful_button.h"
-#include "gtkmm2ext/bindings.h"
#include "pbd/stateful.h"
#include "pbd/signals.h"
@@ -60,9 +61,9 @@
#include "editor_items.h"
#include "region_selection.h"
#include "selection_memento.h"
+#include "tempo_curve.h"
namespace Gtkmm2ext {
- class TearOff;
class Bindings;
}
@@ -143,6 +144,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void set_session (ARDOUR::Session *);
ARDOUR::Session* session() const { return _session; }
+ Gtk::Window* use_own_window (bool and_fill_it);
+
void first_idle ();
virtual bool have_idled () const { return _have_idled; }
@@ -170,6 +173,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
Editing::SnapMode snap_mode () const;
Editing::SnapType snap_type () const;
+ bool snap_musical () const;
void undo (uint32_t n = 1);
void redo (uint32_t n = 1);
@@ -245,7 +249,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
/* selection */
Selection& get_selection() const { return *selection; }
- bool get_selection_extents ( framepos_t &start, framepos_t &end ); // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes
+ bool get_selection_extents (framepos_t &start, framepos_t &end) const; // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes
Selection& get_cut_buffer() const { return *cut_buffer; }
void track_mixer_selection ();
@@ -273,8 +277,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
/* analysis window */
- void analyze_region_selection();
- void analyze_range_selection();
+ void loudness_analyze_region_selection();
+ void loudness_analyze_range_selection();
+
+ void spectral_analyze_region_selection();
+ void spectral_analyze_range_selection();
/* export */
@@ -286,10 +293,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool process_midi_export_dialog (MidiExportDialog& dialog, boost::shared_ptr<ARDOUR::MidiRegion> midi_region);
- void add_transport_frame (Gtk::Container&);
- void add_toplevel_menu (Gtk::Container&);
- Gtk::HBox& get_status_bar_packer() { return status_bar_hpacker; }
-
void set_zoom_focus (Editing::ZoomFocus);
Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
framecnt_t get_current_zoom () const { return samples_per_pixel; }
@@ -327,6 +330,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
unsigned get_grid_beat_divisions(framepos_t position);
Evoral::Beats get_grid_type_as_beats (bool& success, framepos_t position);
+ unsigned get_grid_music_divisions (uint32_t event_state);
+
void nudge_forward (bool next, bool force_playhead);
void nudge_backward (bool next, bool force_playhead);
@@ -352,7 +357,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void set_summary ();
void set_group_tabs ();
void toggle_measure_visibility ();
- void toggle_logo_visibility ();
/* fades */
@@ -367,8 +371,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void ensure_float (Gtk::Window&);
- void show_window ();
-
void scroll_tracks_down_line ();
void scroll_tracks_up_line ();
@@ -387,9 +389,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void maximise_editing_space();
void restore_editing_space();
- void update_tearoff_visibility();
- void reattach_all_tearoffs ();
-
double get_y_origin () const;
void reset_x_origin (framepos_t);
void reset_x_origin_to_follow_playhead ();
@@ -445,9 +444,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const;
- Gtkmm2ext::TearOff* mouse_mode_tearoff () const { return _mouse_mode_tearoff; }
- Gtkmm2ext::TearOff* tools_tearoff () const { return _tools_tearoff; }
-
void snap_to (framepos_t& first,
ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
bool for_mark = false,
@@ -538,7 +534,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
/* editing operations that need to be public */
void mouse_add_new_marker (framepos_t where, bool is_cd=false);
- void split_regions_at (framepos_t, RegionSelection&);
+ void split_regions_at (framepos_t, RegionSelection&, const int32_t sub_num);
void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false);
RegionSelection get_regions_from_selection_and_mouse (framepos_t);
@@ -617,17 +613,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void update_join_object_range_location (double);
- boost::optional<int> pre_notebook_shrink_pane_width;
-
- void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
+ boost::optional<float> pre_notebook_shrink_pane_width;
Gtk::Notebook _the_notebook;
bool _notebook_shrunk;
void add_notebook_page (std::string const &, Gtk::Widget &);
bool notebook_tab_clicked (GdkEventButton *, Gtk::Widget *);
- Gtk::HPaned edit_pane;
- Gtk::VPaned editor_summary_pane;
+ Gtkmm2ext::HPane edit_pane;
+ Gtkmm2ext::VPane editor_summary_pane;
Gtk::EventBox meter_base;
Gtk::HBox meter_box;
@@ -645,6 +639,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void remove_marker (ArdourCanvas::Item&, GdkEvent*);
gint really_remove_marker (ARDOUR::Location* loc);
void goto_nth_marker (int nth);
+ void trigger_script (int nth);
void toggle_marker_lines ();
void set_marker_line_visibility (bool);
@@ -779,12 +774,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void popup_note_context_menu (ArdourCanvas::Item *, GdkEvent *);
Gtk::Menu _note_context_menu;
+ void add_stripables (ARDOUR::StripableList&);
void add_routes (ARDOUR::RouteList&);
void timeaxisview_deleted (TimeAxisView *);
+ void add_vcas (ARDOUR::VCAList&);
- Gtk::HBox global_hpacker;
- Gtk::VBox global_vpacker;
- Gtk::VBox vpacker;
+ Gtk::HBox global_hpacker;
+ Gtk::VBox global_vpacker;
/* Cursor stuff. Do not use directly, use via CursorContext. */
friend class CursorContext;
@@ -819,15 +815,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
Gtk::EventBox time_bars_event_box;
Gtk::VBox time_bars_vbox;
- ArdourCanvas::Pixbuf *logo_item;
-#if 0
- /* these will be needed when we have canvas rulers */
- ArdourCanvas::Container *minsec_group;
- ArdourCanvas::Container *bbt_group;
- ArdourCanvas::Container *timecode_group;
- ArdourCanvas::Container *frame_group;
-#endif
-
ArdourCanvas::Container *tempo_group;
ArdourCanvas::Container *meter_group;
ArdourCanvas::Container *marker_group;
@@ -903,8 +890,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void update_just_timecode ();
void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
void update_fixed_rulers ();
- void update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+ void update_tempo_based_rulers (std::vector<ARDOUR::TempoMap::BBTPoint>& grid);
void popup_ruler_menu (framepos_t where = 0, ItemType type = RegionItem);
void update_ruler_visibility ();
void set_ruler_visible (RulerType, bool);
@@ -967,9 +953,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
gint bbt_nmarks;
uint32_t bbt_bar_helper_on;
uint32_t bbt_accent_modulo;
- void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper,
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end);
+ void compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t lower, framepos_t upper);
ArdourCanvas::Ruler* timecode_ruler;
ArdourCanvas::Ruler* bbt_ruler;
@@ -1107,7 +1091,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void control_step_tracks_down ();
void control_view (uint32_t);
void control_scroll (float);
- void control_select (uint32_t rid, Selection::Operation);
+ void control_select (boost::shared_ptr<ARDOUR::Stripable>, Selection::Operation);
void control_unselect ();
void access_action (std::string,std::string);
bool deferred_control_scroll (framepos_t);
@@ -1149,7 +1133,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
/* track views */
TrackViewList track_views;
std::pair<TimeAxisView*, double> trackview_by_y_position (double, bool trackview_relative_offset = true) const;
- RouteTimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
+ TimeAxisView* axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
TrackViewList get_tracks_for_range_action () const;
@@ -1192,8 +1176,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void register_region_actions ();
void load_bindings ();
- Gtkmm2ext::ActionMap editor_action_map;
- Gtkmm2ext::Bindings key_bindings;
/* CUT/COPY/PASTE */
@@ -1208,7 +1190,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void cut_copy_midi (Editing::CutCopyOp);
void mouse_paste ();
- void paste_internal (framepos_t position, float times);
+ void paste_internal (framepos_t position, float times, const int32_t sub_num);
/* EDITING OPERATIONS */
@@ -1294,14 +1276,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void naturalize_region ();
- void reset_focus ();
+ void reset_focus (Gtk::Widget*);
void split_region ();
void delete_ ();
void cut ();
void copy ();
- void paste (float times, bool from_context_menu = false);
+ void paste (float times, bool from_context_menu);
void place_transient ();
void remove_transient (ArdourCanvas::Item* item);
@@ -1587,6 +1569,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, ArdourMarker*);
bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
+ bool canvas_tempo_curve_event (GdkEvent* event,ArdourCanvas::Item*, TempoCurve*);
bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*);
bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *);
@@ -1638,6 +1621,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void initialize_canvas ();
+ void set_script_action_name (int i, const std::string&);
+
/* display control */
bool _show_measures;
@@ -1654,8 +1639,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
ArdourCanvas::Container* time_line_group;
void hide_measures ();
- void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+ void draw_measures (std::vector<ARDOUR::TempoMap::BBTPoint>&);
void new_tempo_section ();
@@ -1674,6 +1658,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void marker_menu_remove ();
void marker_menu_rename ();
void rename_marker (ArdourMarker *marker);
+ void toggle_marker_lock_style ();
+ void toggle_tempo_type ();
void toggle_marker_menu_lock ();
void toggle_marker_menu_glue ();
void marker_menu_hide ();
@@ -1698,11 +1684,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
void build_range_marker_menu (bool, bool);
void build_marker_menu (ARDOUR::Location *);
- void build_tempo_or_meter_marker_menu (bool);
+ void build_tempo_marker_menu (TempoMarker *, bool);
+ void build_meter_marker_menu (MeterMarker *, bool);
void build_new_transport_marker_menu ();
void dynamic_cast_marker_object (void*, MeterMarker**, TempoMarker**) const;
- Gtk::Menu* tempo_or_meter_marker_menu;
+ Gtk::Menu* tempo_marker_menu;
+ Gtk::Menu* meter_marker_menu;
Gtk::Menu* marker_menu;
Gtk::Menu* range_marker_menu;
Gtk::Menu* transport_marker_menu;
@@ -1713,14 +1701,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
typedef std::list<ArdourMarker*> Marks;
Marks metric_marks;
+ typedef std::list<TempoCurve*> Curves;
+ Curves tempo_curves;
+
void remove_metric_marks ();
void draw_metric_marks (const ARDOUR::Metrics& metrics);
- void compute_current_bbt_points (framepos_t left, framepos_t right,
- ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+ void compute_current_bbt_points (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t left, framepos_t right);
void tempo_map_changed (const PBD::PropertyChange&);
+ void marker_position_changed ();
void redisplay_tempo (bool immediate_redraw);
uint32_t bbt_beat_subdivision;
@@ -1752,7 +1742,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
Gtk::Table toolbar_selection_clock_table;
Gtk::Label toolbar_selection_cursor_label;
- Gtkmm2ext::TearOff* _mouse_mode_tearoff;
ArdourButton mouse_select_button;
ArdourButton mouse_draw_button;
ArdourButton mouse_move_button;
@@ -1811,23 +1800,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
Gtk::HBox _zoom_box;
- Gtkmm2ext::TearOff* _zoom_tearoff;
void zoom_adjustment_changed();
void setup_toolbar ();
void setup_tooltips ();
- Gtkmm2ext::TearOff* _tools_tearoff;
Gtk::HBox toolbar_hbox;
Gtk::EventBox toolbar_base;
Gtk::Frame toolbar_frame;
Gtk::Viewport _toolbar_viewport;
- /* midi toolbar */
-
- Gtk::HBox panic_box;
-
void setup_midi_toolbar ();
/* selection process */
@@ -1867,10 +1850,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
ArdourCanvas::Rectangle* cd_marker_bar_drag_rect;
ArdourCanvas::Rectangle* range_bar_drag_rect;
ArdourCanvas::Rectangle* transport_bar_drag_rect;
-
-#ifdef GTKOSX
- ArdourCanvas::Rectangle *bogus_background_rect;
-#endif
ArdourCanvas::Rectangle *transport_bar_range_rect;
ArdourCanvas::Rectangle *transport_bar_preroll_rect;
ArdourCanvas::Rectangle *transport_bar_postroll_rect;
@@ -2004,6 +1983,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void update_title_s (const std::string & snapshot_name);
void instant_save ();
+ bool no_save_instant;
boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
@@ -2050,9 +2030,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void cms_new (boost::shared_ptr<ARDOUR::Route>);
void current_mixer_strip_hidden ();
- void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
- void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
-#ifdef GTKOSX
+#ifdef __APPLE__
void ensure_all_elements_drawn ();
#endif
/* nudging tracks */
@@ -2114,9 +2092,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void toggle_gain_envelope_active ();
void reset_region_gain_envelopes ();
- bool on_key_press_event (GdkEventKey*);
- bool on_key_release_event (GdkEventKey*);
-
void session_state_saved (std::string);
Glib::RefPtr<Gtk::Action> undo_action;
@@ -2128,8 +2103,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void history_changed ();
- Gtk::HBox status_bar_hpacker;
-
Editing::EditPoint _edit_point;
ArdourDropdown edit_point_selector;
@@ -2152,7 +2125,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void get_regions_after (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
RegionSelection get_regions_from_selection_and_edit_point ();
- RegionSelection get_regions_from_selection_and_entered ();
+ RegionSelection get_regions_from_selection_and_entered () const;
void start_updating_meters ();
void stop_updating_meters ();
@@ -2270,12 +2243,21 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
QuantizeDialog* quantize_dialog;
MainMenuDisabler* _main_menu_disabler;
+ /* private helper functions to help with registering axis */
+
+ Glib::RefPtr<Gtk::Action> reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
+ void toggle_reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
+ void radio_reg_sens (Glib::RefPtr<Gtk::ActionGroup> action_group, Gtk::RadioAction::Group& radio_group, char const * name, char const * label, sigc::slot<void> slot);
+
+ Gtkmm2ext::ActionMap myactions;
+
friend class Drag;
friend class RegionDrag;
friend class RegionMoveDrag;
friend class RegionSpliceDrag;
friend class RegionRippleDrag;
friend class TrimDrag;
+ friend class BBTRulerDrag;
friend class MeterMarkerDrag;
friend class TempoMarkerDrag;
friend class CursorDrag;
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index 1010dad..79900b3 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -22,7 +22,7 @@
#include "pbd/file_utils.h"
-#include "gtkmm2ext/tearoff.h"
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/utils.h"
#include "ardour/filesystem_paths.h"
@@ -41,7 +41,7 @@
#include "time_axis_view.h"
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "audio_time_axis.h"
#include "editor_group_tabs.h"
#include "editor_routes.h"
@@ -55,27 +55,29 @@ using namespace ARDOUR_UI_UTILS;
using namespace PBD;
using namespace Editing;
+using Gtkmm2ext::Bindings;
+
/* Convenience functions to slightly reduce verbosity below */
-static RefPtr<Action>
-reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
+RefPtr<Action>
+Editor::reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
{
- RefPtr<Action> act = ActionManager::register_action (group, name, label, slot);
+ RefPtr<Action> act = myactions.register_action (group, name, label, slot);
ActionManager::session_sensitive_actions.push_back (act);
return act;
}
-static void
-toggle_reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
+void
+Editor::toggle_reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
{
- RefPtr<Action> act = ActionManager::register_toggle_action (group, name, label, slot);
+ RefPtr<Action> act = myactions.register_toggle_action (group, name, label, slot);
ActionManager::session_sensitive_actions.push_back (act);
}
-static void
-radio_reg_sens (RefPtr<ActionGroup> action_group, RadioAction::Group& radio_group, char const * name, char const * label, sigc::slot<void> slot)
+void
+Editor::radio_reg_sens (RefPtr<ActionGroup> action_group, RadioAction::Group& radio_group, char const * name, char const * label, sigc::slot<void> slot)
{
- RefPtr<Action> act = ActionManager::register_radio_action (action_group, radio_group, name, label, slot);
+ RefPtr<Action> act = myactions.register_radio_action (action_group, radio_group, name, label, slot);
ActionManager::session_sensitive_actions.push_back (act);
}
@@ -84,78 +86,77 @@ Editor::register_actions ()
{
RefPtr<Action> act;
- editor_actions = ActionGroup::create (X_("Editor"));
- editor_menu_actions = ActionGroup::create (X_("EditorMenu"));
+ editor_actions = myactions.create_action_group (X_("Editor"));
+ editor_menu_actions = myactions.create_action_group (X_("EditorMenu"));
/* non-operative menu items for menu bar */
- ActionManager::register_action (editor_menu_actions, X_("AlignMenu"), _("Align"));
- ActionManager::register_action (editor_menu_actions, X_("Autoconnect"), _("Autoconnect"));
- ActionManager::register_action (editor_menu_actions, X_("Crossfades"), _("Crossfades"));
- ActionManager::register_action (editor_menu_actions, X_("Edit"), _("Edit"));
- ActionManager::register_action (editor_menu_actions, X_("EditCursorMovementOptions"), _("Move Selected Marker"));
- ActionManager::register_action (editor_menu_actions, X_("EditSelectRangeOptions"), _("Select Range Operations"));
- ActionManager::register_action (editor_menu_actions, X_("EditSelectRegionOptions"), _("Select Regions"));
- ActionManager::register_action (editor_menu_actions, X_("EditPointMenu"), _("Edit Point"));
- ActionManager::register_action (editor_menu_actions, X_("FadeMenu"), _("Fade"));
- ActionManager::register_action (editor_menu_actions, X_("LatchMenu"), _("Latch"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenu"), _("Region"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuLayering"), _("Layering"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuPosition"), _("Position"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuEdit"), _("Edit"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuTrim"), _("Trim"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuGain"), _("Gain"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuRanges"), _("Ranges"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuFades"), _("Fades"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuMIDI"), _("MIDI"));
- ActionManager::register_action (editor_menu_actions, X_("RegionMenuDuplicate"), _("Duplicate"));
- ActionManager::register_action (editor_menu_actions, X_("Link"), _("Link"));
- ActionManager::register_action (editor_menu_actions, X_("ZoomFocusMenu"), _("Zoom Focus"));
- ActionManager::register_action (editor_menu_actions, X_("LocateToMarker"), _("Locate to Markers"));
- ActionManager::register_action (editor_menu_actions, X_("MarkerMenu"), _("Markers"));
- ActionManager::register_action (editor_menu_actions, X_("MeterFalloff"), _("Meter falloff"));
- ActionManager::register_action (editor_menu_actions, X_("MeterHold"), _("Meter hold"));
- ActionManager::register_action (editor_menu_actions, X_("MIDI"), _("MIDI Options"));
- ActionManager::register_action (editor_menu_actions, X_("MiscOptions"), _("Misc Options"));
- ActionManager::register_action (editor_menu_actions, X_("Monitoring"), _("Monitoring"));
- ActionManager::register_action (editor_menu_actions, X_("MoveActiveMarkMenu"), _("Active Mark"));
- ActionManager::register_action (editor_menu_actions, X_("MovePlayHeadMenu"), _("Playhead"));
- ActionManager::register_action (editor_menu_actions, X_("PlayMenu"), _("Play"));
- ActionManager::register_action (editor_menu_actions, X_("PrimaryClockMenu"), _("Primary Clock"));
- ActionManager::register_action (editor_menu_actions, X_("Pullup"), _("Pullup / Pulldown"));
- ActionManager::register_action (editor_menu_actions, X_("RegionEditOps"), _("Region operations"));
- ActionManager::register_action (editor_menu_actions, X_("RegionGainMenu"), _("Gain"));
- ActionManager::register_action (editor_menu_actions, X_("RulerMenu"), _("Rulers"));
- ActionManager::register_action (editor_menu_actions, X_("SavedViewMenu"), _("Views"));
- ActionManager::register_action (editor_menu_actions, X_("ScrollMenu"), _("Scroll"));
- ActionManager::register_action (editor_menu_actions, X_("SecondaryClockMenu"), _("Secondary Clock"));
- ActionManager::register_action (editor_menu_actions, X_("Select"), _("Select"));
- ActionManager::register_action (editor_menu_actions, X_("SelectMenu"), _("Select"));
- ActionManager::register_action (editor_menu_actions, X_("SeparateMenu"), _("Separate"));
- ActionManager::register_action (editor_menu_actions, X_("SetLoopMenu"), _("Loop"));
- ActionManager::register_action (editor_menu_actions, X_("SetPunchMenu"), _("Punch"));
- ActionManager::register_action (editor_menu_actions, X_("Solo"), _("Solo"));
- ActionManager::register_action (editor_menu_actions, X_("Subframes"), _("Subframes"));
- ActionManager::register_action (editor_menu_actions, X_("SyncMenu"), _("Sync"));
- ActionManager::register_action (editor_menu_actions, X_("TempoMenu"), _("Tempo"));
- ActionManager::register_action (editor_menu_actions, X_("Timecode"), _("Timecode fps"));
- ActionManager::register_action (editor_menu_actions, X_("TrackHeightMenu"), _("Height"));
- ActionManager::register_action (editor_menu_actions, X_("TrackMenu"), _("Track"));
- ActionManager::register_action (editor_menu_actions, X_("Tools"), _("Tools"));
- ActionManager::register_action (editor_menu_actions, X_("View"), _("View"));
- ActionManager::register_action (editor_menu_actions, X_("ZoomFocus"), _("Zoom Focus"));
- ActionManager::register_action (editor_menu_actions, X_("ZoomMenu"), _("Zoom"));
+ myactions.register_action (editor_menu_actions, X_("AlignMenu"), _("Align"));
+ myactions.register_action (editor_menu_actions, X_("Autoconnect"), _("Autoconnect"));
+ myactions.register_action (editor_menu_actions, X_("Crossfades"), _("Crossfades"));
+ myactions.register_action (editor_menu_actions, X_("Edit"), _("Edit"));
+ myactions.register_action (editor_menu_actions, X_("EditCursorMovementOptions"), _("Move Selected Marker"));
+ myactions.register_action (editor_menu_actions, X_("EditSelectRangeOptions"), _("Select Range Operations"));
+ myactions.register_action (editor_menu_actions, X_("EditSelectRegionOptions"), _("Select Regions"));
+ myactions.register_action (editor_menu_actions, X_("EditPointMenu"), _("Edit Point"));
+ myactions.register_action (editor_menu_actions, X_("FadeMenu"), _("Fade"));
+ myactions.register_action (editor_menu_actions, X_("LatchMenu"), _("Latch"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenu"), _("Region"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuLayering"), _("Layering"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuPosition"), _("Position"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuEdit"), _("Edit"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuTrim"), _("Trim"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuGain"), _("Gain"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuRanges"), _("Ranges"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuFades"), _("Fades"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuMIDI"), _("MIDI"));
+ myactions.register_action (editor_menu_actions, X_("RegionMenuDuplicate"), _("Duplicate"));
+ myactions.register_action (editor_menu_actions, X_("Link"), _("Link"));
+ myactions.register_action (editor_menu_actions, X_("ZoomFocusMenu"), _("Zoom Focus"));
+ myactions.register_action (editor_menu_actions, X_("LocateToMarker"), _("Locate to Markers"));
+ myactions.register_action (editor_menu_actions, X_("MarkerMenu"), _("Markers"));
+ myactions.register_action (editor_menu_actions, X_("MeterFalloff"), _("Meter falloff"));
+ myactions.register_action (editor_menu_actions, X_("MeterHold"), _("Meter hold"));
+ myactions.register_action (editor_menu_actions, X_("MIDI"), _("MIDI Options"));
+ myactions.register_action (editor_menu_actions, X_("MiscOptions"), _("Misc Options"));
+ myactions.register_action (editor_menu_actions, X_("Monitoring"), _("Monitoring"));
+ myactions.register_action (editor_menu_actions, X_("MoveActiveMarkMenu"), _("Active Mark"));
+ myactions.register_action (editor_menu_actions, X_("MovePlayHeadMenu"), _("Playhead"));
+ myactions.register_action (editor_menu_actions, X_("PlayMenu"), _("Play"));
+ myactions.register_action (editor_menu_actions, X_("PrimaryClockMenu"), _("Primary Clock"));
+ myactions.register_action (editor_menu_actions, X_("Pullup"), _("Pullup / Pulldown"));
+ myactions.register_action (editor_menu_actions, X_("RegionEditOps"), _("Region operations"));
+ myactions.register_action (editor_menu_actions, X_("RegionGainMenu"), _("Gain"));
+ myactions.register_action (editor_menu_actions, X_("RulerMenu"), _("Rulers"));
+ myactions.register_action (editor_menu_actions, X_("SavedViewMenu"), _("Views"));
+ myactions.register_action (editor_menu_actions, X_("ScrollMenu"), _("Scroll"));
+ myactions.register_action (editor_menu_actions, X_("SecondaryClockMenu"), _("Secondary Clock"));
+ myactions.register_action (editor_menu_actions, X_("Select"), _("Select"));
+ myactions.register_action (editor_menu_actions, X_("SelectMenu"), _("Select"));
+ myactions.register_action (editor_menu_actions, X_("SeparateMenu"), _("Separate"));
+ myactions.register_action (editor_menu_actions, X_("SetLoopMenu"), _("Loop"));
+ myactions.register_action (editor_menu_actions, X_("SetPunchMenu"), _("Punch"));
+ myactions.register_action (editor_menu_actions, X_("Solo"), _("Solo"));
+ myactions.register_action (editor_menu_actions, X_("Subframes"), _("Subframes"));
+ myactions.register_action (editor_menu_actions, X_("SyncMenu"), _("Sync"));
+ myactions.register_action (editor_menu_actions, X_("TempoMenu"), _("Tempo"));
+ myactions.register_action (editor_menu_actions, X_("Timecode"), _("Timecode fps"));
+ myactions.register_action (editor_menu_actions, X_("TrackHeightMenu"), _("Height"));
+ myactions.register_action (editor_menu_actions, X_("TrackMenu"), _("Track"));
+ myactions.register_action (editor_menu_actions, X_("Tools"), _("Tools"));
+ myactions.register_action (editor_menu_actions, X_("View"), _("View"));
+ myactions.register_action (editor_menu_actions, X_("ZoomFocus"), _("Zoom Focus"));
+ myactions.register_action (editor_menu_actions, X_("ZoomMenu"), _("Zoom"));
+ myactions.register_action (editor_menu_actions, X_("ActionScripts"), _("Scripted Actions"));
register_region_actions ();
/* add named actions for the editor */
- ActionManager::register_action (editor_actions, "escape", _("Break drag or deselect all"), sigc::mem_fun (*this, &Editor::escape));
-
/* We don't bother registering "unlock" because it would be insensitive
when required. Editor::unlock() must be invoked directly.
*/
- ActionManager::register_action (editor_actions, "lock", S_("Session|Lock"), sigc::mem_fun (*this, &Editor::lock));
+ myactions.register_action (editor_actions, "lock", S_("Session|Lock"), sigc::mem_fun (*this, &Editor::lock));
toggle_reg_sens (editor_actions, "show-editor-mixer", _("Show Editor Mixer"), sigc::mem_fun (*this, &Editor::editor_mixer_button_toggled));
toggle_reg_sens (editor_actions, "show-editor-list", _("Show Editor List"), sigc::mem_fun (*this, &Editor::editor_list_button_toggled));
@@ -244,6 +245,7 @@ Editor::register_actions ()
reg_sens (editor_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &Editor::goto_nth_marker), i - 1));
}
+
reg_sens (editor_actions, "jump-forward-to-mark", _("Jump to Next Mark"), sigc::mem_fun(*this, &Editor::jump_forward_to_mark));
reg_sens (editor_actions, "alternate-jump-forward-to-mark", _("Jump to Next Mark"), sigc::mem_fun(*this, &Editor::jump_forward_to_mark));
reg_sens (editor_actions, "jump-backward-to-mark", _("Jump to Previous Mark"), sigc::mem_fun(*this, &Editor::jump_backward_to_mark));
@@ -363,7 +365,8 @@ Editor::register_actions ()
reg_sens (editor_actions, "editor-fade-range", _("Fade Range Selection"), sigc::mem_fun(*this, &Editor::fade_range));
- reg_sens (editor_actions, "set-tempo-from-edit-range", _("Set Tempo from Edit Range = Bar"), sigc::mem_fun(*this, &Editor::use_range_as_bar));
+ act = myactions.register_action (editor_actions, "set-tempo-from-edit-range", _("Set Tempo from Edit Range = Bar"), sigc::mem_fun(*this, &Editor::use_range_as_bar));
+ ActionManager::time_selection_sensitive_actions.push_back (act);
toggle_reg_sens (editor_actions, "toggle-log-window", _("Log"),
sigc::mem_fun (ARDOUR_UI::instance(), &ARDOUR_UI::toggle_errors));
@@ -423,11 +426,11 @@ Editor::register_actions ()
toggle_reg_sens (editor_actions, "toggle-follow-playhead", _("Follow Playhead"), (sigc::mem_fun(*this, &Editor::toggle_follow_playhead)));
act = reg_sens (editor_actions, "remove-last-capture", _("Remove Last Capture"), (sigc::mem_fun(*this, &Editor::remove_last_capture)));
- ActionManager::register_toggle_action (editor_actions, "toggle-stationary-playhead", _("Stationary Playhead"), (mem_fun(*this, &Editor::toggle_stationary_playhead)));
+ myactions.register_toggle_action (editor_actions, "toggle-stationary-playhead", _("Stationary Playhead"), (mem_fun(*this, &Editor::toggle_stationary_playhead)));
act = reg_sens (editor_actions, "insert-time", _("Insert Time"), (sigc::mem_fun(*this, &Editor::do_insert_time)));
ActionManager::track_selection_sensitive_actions.push_back (act);
- act = ActionManager::register_action (editor_actions, "remove-time", _("Remove Time"), (mem_fun(*this, &Editor::do_remove_time)));
+ act = myactions.register_action (editor_actions, "remove-time", _("Remove Time"), (mem_fun(*this, &Editor::do_remove_time)));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::track_selection_sensitive_actions.push_back (act);
@@ -459,7 +462,7 @@ Editor::register_actions ()
toggle_reg_sens (editor_actions, "sound-midi-notes", _("Sound Selected MIDI Notes"), sigc::mem_fun (*this, &Editor::toggle_sound_midi_notes));
- Glib::RefPtr<ActionGroup> zoom_actions = ActionGroup::create (X_("Zoom"));
+ Glib::RefPtr<ActionGroup> zoom_actions = myactions.create_action_group (X_("Zoom"));
RadioAction::Group zoom_group;
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusLeft));
@@ -469,148 +472,155 @@ Editor::register_actions ()
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-mouse", _("Zoom Focus Mouse"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusMouse));
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusEdit));
- ActionManager::register_action (editor_actions, X_("cycle-zoom-focus"), _("Next Zoom Focus"), sigc::mem_fun (*this, &Editor::cycle_zoom_focus));
+ myactions.register_action (editor_actions, X_("cycle-zoom-focus"), _("Next Zoom Focus"), sigc::mem_fun (*this, &Editor::cycle_zoom_focus));
+ for (int i = 1; i <= 9; ++i) {
+ string const a = string_compose (X_("script-action-%1"), i);
+ string const n = string_compose (_("Unset #%1"), i);
+ act = myactions.register_action (editor_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &Editor::trigger_script), i - 1));
+ act->set_tooltip (_("no action bound"));
+ act->set_sensitive (false);
+ }
- Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode"));
+ Glib::RefPtr<ActionGroup> mouse_mode_actions = myactions.create_action_group (X_("MouseMode"));
RadioAction::Group mouse_mode_group;
- act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Object Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));
+ act = myactions.register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Object Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));
smart_mode_action = Glib::RefPtr<ToggleAction>::cast_static (act);
smart_mode_button.set_related_action (smart_mode_action);
smart_mode_button.set_text (_("Smart"));
smart_mode_button.set_name ("mouse mode button");
- act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject));
+ act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject));
mouse_move_button.set_related_action (act);
mouse_move_button.set_icon (Gtkmm2ext::ArdourIcon::ToolGrab);
mouse_move_button.set_name ("mouse mode button");
- act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseRange));
+ act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseRange));
mouse_select_button.set_related_action (act);
mouse_select_button.set_icon (Gtkmm2ext::ArdourIcon::ToolRange);
mouse_select_button.set_name ("mouse mode button");
- act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseDraw));
+ act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseDraw));
mouse_draw_button.set_related_action (act);
mouse_draw_button.set_icon (Gtkmm2ext::ArdourIcon::ToolDraw);
mouse_draw_button.set_name ("mouse mode button");
- act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-audition", _("Audition Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseAudition));
+ act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-audition", _("Audition Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseAudition));
mouse_audition_button.set_related_action (act);
mouse_audition_button.set_icon (Gtkmm2ext::ArdourIcon::ToolAudition);
mouse_audition_button.set_name ("mouse mode button");
- act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseTimeFX));
+ act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseTimeFX));
mouse_timefx_button.set_related_action (act);
mouse_timefx_button.set_icon (Gtkmm2ext::ArdourIcon::ToolStretch);
mouse_timefx_button.set_name ("mouse mode button");
- act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-content", _("Content Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseContent));
+ act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-content", _("Content Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseContent));
mouse_content_button.set_related_action (act);
mouse_content_button.set_icon (Gtkmm2ext::ArdourIcon::ToolContent);
mouse_content_button.set_name ("mouse mode button");
if(!Profile->get_mixbus()) {
- act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseCut));
+ act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseCut));
mouse_cut_button.set_related_action (act);
mouse_cut_button.set_icon (Gtkmm2ext::ArdourIcon::ToolCut);
mouse_cut_button.set_name ("mouse mode button");
}
- ActionManager::register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), sigc::bind (sigc::mem_fun(*this, &Editor::step_mouse_mode), true));
+ myactions.register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), sigc::bind (sigc::mem_fun(*this, &Editor::step_mouse_mode), true));
RadioAction::Group edit_point_group;
- ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-playhead"), _("Playhead"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead)));
- ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-mouse"), _("Mouse"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtMouse)));
- ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-selected-marker"), _("Marker"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtSelectedMarker)));
+ myactions.register_radio_action (editor_actions, edit_point_group, X_("edit-at-playhead"), _("Playhead"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead)));
+ myactions.register_radio_action (editor_actions, edit_point_group, X_("edit-at-mouse"), _("Mouse"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtMouse)));
+ myactions.register_radio_action (editor_actions, edit_point_group, X_("edit-at-selected-marker"), _("Marker"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtSelectedMarker)));
- ActionManager::register_action (editor_actions, "cycle-edit-point", _("Change Edit Point"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), false));
- ActionManager::register_action (editor_actions, "cycle-edit-point-with-marker", _("Change Edit Point Including Marker"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), true));
+ myactions.register_action (editor_actions, "cycle-edit-point", _("Change Edit Point"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), false));
+ myactions.register_action (editor_actions, "cycle-edit-point-with-marker", _("Change Edit Point Including Marker"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), true));
-// ActionManager::register_action (editor_actions, "set-edit-splice", _("Splice"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Splice));
- ActionManager::register_action (editor_actions, "set-edit-ripple", _("Ripple"), bind (mem_fun (*this, &Editor::set_edit_mode), Ripple));
- ActionManager::register_action (editor_actions, "set-edit-slide", _("Slide"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Slide));
- ActionManager::register_action (editor_actions, "set-edit-lock", S_("EditMode|Lock"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Lock));
- ActionManager::register_action (editor_actions, "cycle-edit-mode", _("Cycle Edit Mode"), sigc::mem_fun (*this, &Editor::cycle_edit_mode));
+// myactions.register_action (editor_actions, "set-edit-splice", _("Splice"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Splice));
+ myactions.register_action (editor_actions, "set-edit-ripple", _("Ripple"), bind (mem_fun (*this, &Editor::set_edit_mode), Ripple));
+ myactions.register_action (editor_actions, "set-edit-slide", _("Slide"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Slide));
+ myactions.register_action (editor_actions, "set-edit-lock", S_("EditMode|Lock"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Lock));
+ myactions.register_action (editor_actions, "cycle-edit-mode", _("Cycle Edit Mode"), sigc::mem_fun (*this, &Editor::cycle_edit_mode));
- ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap to"));
- ActionManager::register_action (editor_actions, X_("SnapMode"), _("Snap Mode"));
+ myactions.register_action (editor_actions, X_("SnapTo"), _("Snap to"));
+ myactions.register_action (editor_actions, X_("SnapMode"), _("Snap Mode"));
RadioAction::Group snap_mode_group;
- ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-off"), _("No Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapOff)));
- ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal)));
- ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic)));
+ myactions.register_radio_action (editor_actions, snap_mode_group, X_("snap-off"), _("No Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapOff)));
+ myactions.register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal)));
+ myactions.register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic)));
- ActionManager::register_action (editor_actions, X_("cycle-snap-mode"), _("Next Snap Mode"), sigc::mem_fun (*this, &Editor::cycle_snap_mode));
- ActionManager::register_action (editor_actions, X_("next-snap-choice"), _("Next Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice));
- ActionManager::register_action (editor_actions, X_("next-snap-choice-music-only"), _("Next Musical Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice_music_only));
- ActionManager::register_action (editor_actions, X_("prev-snap-choice"), _("Previous Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice));
- ActionManager::register_action (editor_actions, X_("prev-snap-choice-music-only"), _("Previous Musical Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice_music_only));
+ myactions.register_action (editor_actions, X_("cycle-snap-mode"), _("Next Snap Mode"), sigc::mem_fun (*this, &Editor::cycle_snap_mode));
+ myactions.register_action (editor_actions, X_("next-snap-choice"), _("Next Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice));
+ myactions.register_action (editor_actions, X_("next-snap-choice-music-only"), _("Next Musical Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice_music_only));
+ myactions.register_action (editor_actions, X_("prev-snap-choice"), _("Previous Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice));
+ myactions.register_action (editor_actions, X_("prev-snap-choice-music-only"), _("Previous Musical Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice_music_only));
- Glib::RefPtr<ActionGroup> snap_actions = ActionGroup::create (X_("Snap"));
+ Glib::RefPtr<ActionGroup> snap_actions = myactions.create_action_group (X_("Snap"));
RadioAction::Group snap_choice_group;
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to CD Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToCDFrame)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-frame"), _("Snap to Timecode Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeFrame)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-seconds"), _("Snap to Timecode Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeSeconds)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-minutes"), _("Snap to Timecode Minutes"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeMinutes)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to Seconds"), (sigc::bind (sigc::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"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMinutes)));
-
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-onetwentyeighths"), _("Snap to One Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv128)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixtyfourths"), _("Snap to Sixty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv64)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to Thirty Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv32)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyeighths"), _("Snap to Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv28)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyfourths"), _("Snap to Twenty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv24)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentieths"), _("Snap to Twentieths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv20)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to Sixteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv16)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fourteenths"), _("Snap to Fourteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv14)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twelfths"), _("Snap to Twelfths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv12)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-tenths"), _("Snap to Tenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv10)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv8)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sevenths"), _("Snap to Sevenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv7)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixths"), _("Snap to Sixths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv6)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fifths"), _("Snap to Fifths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv5)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to Quarters"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv4)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to Thirds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv3)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-halves"), _("Snap to Halves"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv2)));
-
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to Beat"), (sigc::bind (sigc::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"), (sigc::bind (sigc::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"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMark)));
- ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to Region Start"), (sigc::bind (sigc::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"), (sigc::bind (sigc::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"), (sigc::bind (sigc::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"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionBoundary)));
-
- ActionManager::register_toggle_action (editor_actions, X_("show-marker-lines"), _("Show Marker Lines"), sigc::mem_fun (*this, &Editor::toggle_marker_lines));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to CD Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToCDFrame)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-frame"), _("Snap to Timecode Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeFrame)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-seconds"), _("Snap to Timecode Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeSeconds)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-minutes"), _("Snap to Timecode Minutes"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeMinutes)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSeconds)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-minutes"), _("Snap to Minutes"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMinutes)));
+
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-onetwentyeighths"), _("Snap to One Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv128)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixtyfourths"), _("Snap to Sixty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv64)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to Thirty Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv32)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyeighths"), _("Snap to Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv28)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyfourths"), _("Snap to Twenty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv24)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentieths"), _("Snap to Twentieths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv20)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to Sixteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv16)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fourteenths"), _("Snap to Fourteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv14)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twelfths"), _("Snap to Twelfths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv12)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-tenths"), _("Snap to Tenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv10)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv8)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sevenths"), _("Snap to Sevenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv7)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixths"), _("Snap to Sixths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv6)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fifths"), _("Snap to Fifths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv5)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to Quarters"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv4)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to Thirds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv3)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-halves"), _("Snap to Halves"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv2)));
+
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to Beat"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeat)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to Bar"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBar)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to Mark"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMark)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to Region Start"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionStart)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to Region End"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionEnd)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to Region Sync"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionSync)));
+ myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-boundary"), _("Snap to Region Boundary"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionBoundary)));
+
+ myactions.register_toggle_action (editor_actions, X_("show-marker-lines"), _("Show Marker Lines"), sigc::mem_fun (*this, &Editor::toggle_marker_lines));
/* RULERS */
- Glib::RefPtr<ActionGroup> ruler_actions = ActionGroup::create (X_("Rulers"));
- ruler_tempo_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-tempo-ruler"), _("Tempo"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_tempo)));
- ruler_meter_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-meter-ruler"), _("Meter"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_meter)));
- ruler_range_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-range-ruler"), _("Ranges"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_range_marker)));
- ruler_marker_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-marker-ruler"), _("Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_marker)));
- ruler_cd_marker_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-cd-marker-ruler"), _("CD Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_cd_marker)));
- ruler_loop_punch_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-loop-punch-ruler"), _("Loop/Punch"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_transport_marker)));
- ruler_bbt_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-bbt-ruler"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_bbt)));
- ruler_samples_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-samples-ruler"), _("Samples"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_samples)));
- ruler_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-timecode-ruler"), _("Timecode"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_timecode)));
- ruler_minsec_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-minsec-ruler"), _("Min:Sec"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_minsec)));
-
- ActionManager::register_action (editor_menu_actions, X_("VideoMonitorMenu"), _("Video Monitor"));
-
- ruler_video_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-video-ruler"), _("Video"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_video_timeline)));
- xjadeo_proc_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("ToggleJadeo"), _("Video Monitor"), sigc::mem_fun (*this, &Editor::set_xjadeo_proc)));
-
- xjadeo_ontop_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-ontop"), _("Always on Top"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 1)));
- xjadeo_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 2)));
- xjadeo_frame_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-frame"), _("Frame number"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 3)));
- xjadeo_osdbg_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-osdbg"), _("Timecode Background"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 4)));
- xjadeo_fullscreen_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-fullscreen"), _("Fullscreen"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 5)));
- xjadeo_letterbox_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-letterbox"), _("Letterbox"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 6)));
+ Glib::RefPtr<ActionGroup> ruler_actions = myactions.create_action_group (X_("Rulers"));
+ ruler_tempo_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-tempo-ruler"), _("Tempo"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_tempo)));
+ ruler_meter_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-meter-ruler"), _("Meter"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_meter)));
+ ruler_range_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-range-ruler"), _("Ranges"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_range_marker)));
+ ruler_marker_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-marker-ruler"), _("Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_marker)));
+ ruler_cd_marker_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-cd-marker-ruler"), _("CD Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_cd_marker)));
+ ruler_loop_punch_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-loop-punch-ruler"), _("Loop/Punch"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_transport_marker)));
+ ruler_bbt_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-bbt-ruler"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_bbt)));
+ ruler_samples_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-samples-ruler"), _("Samples"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_samples)));
+ ruler_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-timecode-ruler"), _("Timecode"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_timecode)));
+ ruler_minsec_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-minsec-ruler"), _("Min:Sec"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_minsec)));
+
+ myactions.register_action (editor_menu_actions, X_("VideoMonitorMenu"), _("Video Monitor"));
+
+ ruler_video_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-video-ruler"), _("Video"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_video_timeline)));
+ xjadeo_proc_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("ToggleJadeo"), _("Video Monitor"), sigc::mem_fun (*this, &Editor::set_xjadeo_proc)));
+
+ xjadeo_ontop_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-ontop"), _("Always on Top"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 1)));
+ xjadeo_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 2)));
+ xjadeo_frame_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-frame"), _("Frame number"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 3)));
+ xjadeo_osdbg_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-osdbg"), _("Timecode Background"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 4)));
+ xjadeo_fullscreen_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-fullscreen"), _("Fullscreen"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 5)));
+ xjadeo_letterbox_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-letterbox"), _("Letterbox"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 6)));
xjadeo_zoom_100 = reg_sens (editor_actions, "zoom-vmon-100", _("Original Size"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 7));
/* set defaults here */
@@ -635,7 +645,7 @@ Editor::register_actions ()
ruler_range_action->set_active (true);
ruler_loop_punch_action->set_active (true);
ruler_loop_punch_action->set_active (true);
- ruler_bbt_action->set_active (false);
+ ruler_bbt_action->set_active (true);
ruler_cd_marker_action->set_active (true);
ruler_timecode_action->set_active (true);
ruler_minsec_action->set_active (false);
@@ -663,52 +673,52 @@ Editor::register_actions ()
/* REGION LIST */
- Glib::RefPtr<ActionGroup> rl_actions = ActionGroup::create (X_("RegionList"));
+ Glib::RefPtr<ActionGroup> rl_actions = myactions.create_action_group (X_("RegionList"));
RadioAction::Group sort_type_group;
RadioAction::Group sort_order_group;
/* the region list popup menu */
- ActionManager::register_action (rl_actions, X_("RegionListSort"), _("Sort"));
+ myactions.register_action (rl_actions, X_("RegionListSort"), _("Sort"));
- act = ActionManager::register_action (rl_actions, X_("rlAudition"), _("Audition"), sigc::mem_fun(*this, &Editor::audition_region_from_region_list));
+ act = myactions.register_action (rl_actions, X_("rlAudition"), _("Audition"), sigc::mem_fun(*this, &Editor::audition_region_from_region_list));
ActionManager::region_list_selection_sensitive_actions.push_back (act);
- act = ActionManager::register_action (rl_actions, X_("rlHide"), _("Hide"), sigc::mem_fun(*this, &Editor::hide_region_from_region_list));
+ act = myactions.register_action (rl_actions, X_("rlHide"), _("Hide"), sigc::mem_fun(*this, &Editor::hide_region_from_region_list));
ActionManager::region_list_selection_sensitive_actions.push_back (act);
- act = ActionManager::register_action (rl_actions, X_("rlShow"), _("Show"), sigc::mem_fun(*this, &Editor::show_region_in_region_list));
+ act = myactions.register_action (rl_actions, X_("rlShow"), _("Show"), sigc::mem_fun(*this, &Editor::show_region_in_region_list));
ActionManager::region_list_selection_sensitive_actions.push_back (act);
- ActionManager::register_toggle_action (rl_actions, X_("rlShowAll"), _("Show All"), sigc::mem_fun(*_regions, &EditorRegions::toggle_full));
- ActionManager::register_toggle_action (rl_actions, X_("rlShowAuto"), _("Show Automatic Regions"), sigc::mem_fun (*_regions, &EditorRegions::toggle_show_auto_regions));
+ myactions.register_toggle_action (rl_actions, X_("rlShowAll"), _("Show All"), sigc::mem_fun(*_regions, &EditorRegions::toggle_full));
+ myactions.register_toggle_action (rl_actions, X_("rlShowAuto"), _("Show Automatic Regions"), sigc::mem_fun (*_regions, &EditorRegions::toggle_show_auto_regions));
- ActionManager::register_radio_action (rl_actions, sort_order_group, X_("SortAscending"), _("Ascending"),
+ myactions.register_radio_action (rl_actions, sort_order_group, X_("SortAscending"), _("Ascending"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_direction), true));
- ActionManager::register_radio_action (rl_actions, sort_order_group, X_("SortDescending"), _("Descending"),
+ myactions.register_radio_action (rl_actions, sort_order_group, X_("SortDescending"), _("Descending"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_direction), false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionName"), _("By Region Name"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionName"), _("By Region Name"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByName, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionLength"), _("By Region Length"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionLength"), _("By Region Length"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByLength, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionPosition"), _("By Region Position"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionPosition"), _("By Region Position"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByPosition, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionTimestamp"), _("By Region Timestamp"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionTimestamp"), _("By Region Timestamp"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByTimestamp, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionStartinFile"), _("By Region Start in File"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionStartinFile"), _("By Region Start in File"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByStartInFile, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionEndinFile"), _("By Region End in File"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionEndinFile"), _("By Region End in File"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByEndInFile, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileName"), _("By Source File Name"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileName"), _("By Source File Name"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileName, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileLength"), _("By Source File Length"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileLength"), _("By Source File Length"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileLength, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileCreationDate"), _("By Source File Creation Date"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileCreationDate"), _("By Source File Creation Date"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileCreationDate, false));
- ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFilesystem"), _("By Source Filesystem"),
+ myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFilesystem"), _("By Source Filesystem"),
sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileFS, false));
- ActionManager::register_action (rl_actions, X_("removeUnusedRegions"), _("Remove Unused"), sigc::mem_fun (*_regions, &EditorRegions::remove_unused_regions));
+ myactions.register_action (rl_actions, X_("removeUnusedRegions"), _("Remove Unused"), sigc::mem_fun (*_regions, &EditorRegions::remove_unused_regions));
act = reg_sens (editor_actions, X_("addExistingPTFiles"), _("Import PT session"), sigc::mem_fun (*this, &Editor::external_pt_dialog));
ActionManager::write_sensitive_actions.push_back (act);
@@ -721,52 +731,28 @@ Editor::register_actions ()
act = reg_sens (editor_actions, X_("addExternalAudioToRegionList"), _("Import to Region List..."), sigc::bind (sigc::mem_fun(*this, &Editor::add_external_audio_action), ImportAsRegion));
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (editor_actions, X_("importFromSession"), _("Import from Session"), sigc::mem_fun(*this, &Editor::session_import_dialog));
+ act = myactions.register_action (editor_actions, X_("importFromSession"), _("Import from Session"), sigc::mem_fun(*this, &Editor::session_import_dialog));
ActionManager::write_sensitive_actions.push_back (act);
- act = ActionManager::register_action (editor_actions, X_("bring-into-session"), _("Bring all media into session folder"), sigc::mem_fun(*this, &Editor::bring_all_sources_into_session));
+ act = myactions.register_action (editor_actions, X_("bring-into-session"), _("Bring all media into session folder"), sigc::mem_fun(*this, &Editor::bring_all_sources_into_session));
ActionManager::write_sensitive_actions.push_back (act);
- ActionManager::register_toggle_action (editor_actions, X_("ToggleSummary"), _("Show Summary"), sigc::mem_fun (*this, &Editor::set_summary));
-
- ActionManager::register_toggle_action (editor_actions, X_("ToggleGroupTabs"), _("Show Group Tabs"), sigc::mem_fun (*this, &Editor::set_group_tabs));
+ myactions.register_toggle_action (editor_actions, X_("ToggleSummary"), _("Show Summary"), sigc::mem_fun (*this, &Editor::set_summary));
- ActionManager::register_toggle_action (editor_actions, X_("ToggleMeasureVisibility"), _("Show Measure Lines"), sigc::mem_fun (*this, &Editor::toggle_measure_visibility));
+ myactions.register_toggle_action (editor_actions, X_("ToggleGroupTabs"), _("Show Group Tabs"), sigc::mem_fun (*this, &Editor::set_group_tabs));
- /* if there is a logo in the editor canvas, its always visible at startup */
+ myactions.register_toggle_action (editor_actions, X_("ToggleMeasureVisibility"), _("Show Measure Lines"), sigc::mem_fun (*this, &Editor::toggle_measure_visibility));
- act = ActionManager::register_toggle_action (editor_actions, X_("ToggleLogoVisibility"), _("Show Logo"), sigc::mem_fun (*this, &Editor::toggle_logo_visibility));
- Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- tact->set_active (true);
-
- ActionManager::register_action (editor_actions, X_("toggle-midi-input-active"), _("Toggle MIDI Input Active for Editor-Selected Tracks/Busses"),
+ myactions.register_action (editor_actions, X_("toggle-midi-input-active"), _("Toggle MIDI Input Active for Editor-Selected Tracks/Busses"),
sigc::bind (sigc::mem_fun (*this, &Editor::toggle_midi_input_active), false));
-
- ActionManager::add_action_group (rl_actions);
- ActionManager::add_action_group (ruler_actions);
- ActionManager::add_action_group (zoom_actions);
- ActionManager::add_action_group (mouse_mode_actions);
- ActionManager::add_action_group (snap_actions);
- ActionManager::add_action_group (editor_actions);
- ActionManager::add_action_group (editor_menu_actions);
}
void
Editor::load_bindings ()
{
- /* XXX move this to a better place */
-
- key_bindings.set_action_map (editor_action_map);
-
- std::string binding_file;
-
- if (find_file (ardour_config_search_path(), "editor.bindings", binding_file)) {
- key_bindings.load (binding_file);
- info << string_compose (_("Loaded editor bindings from %1"), binding_file) << endmsg;
- } else {
- error << string_compose (_("Could not find editor.bindings in search path %1"), ardour_config_search_path().to_string()) << endmsg;
- }
+ bindings = Bindings::get_bindings (X_("Editor"), myactions);
+ global_hpacker.set_data ("ardour-bindings", bindings);
}
void
@@ -994,23 +980,6 @@ Editor::toggle_measure_visibility ()
}
}
-void
-Editor::toggle_logo_visibility ()
-{
- Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleLogoVisibility"));
-
- if (act) {
- Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- if (logo_item) {
- if (tact->get_active()) {
- logo_item->show ();
- } else {
- logo_item->hide ();
- }
- }
- }
-}
-
RefPtr<RadioAction>
Editor::snap_type_action (SnapType type)
{
@@ -1730,10 +1699,6 @@ Editor::parameter_changed (std::string p)
}
} else if (p == "timecode-offset" || p == "timecode-offset-negative") {
update_just_timecode ();
- } else if (p == "show-zoom-tools") {
- if (_zoom_tearoff) {
- _zoom_tearoff->set_visible (UIConfiguration::instance().get_show_zoom_tools(), true);
- }
} else if (p == "sound-midi-notes") {
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("sound-midi-notes"));
@@ -1746,19 +1711,6 @@ Editor::parameter_changed (std::string p)
}
} else if (p == "show-region-gain") {
set_gain_envelope_visibility ();
- } else if (p == "remote-model") {
- if (_routes) {
- _routes->reset_remote_control_ids ();
- }
- } else if (p == "use-tooltips") {
-
- /* this doesn't really belong here but it has to go somewhere */
-
- if (UIConfiguration::instance().get_use_tooltips()) {
- Gtkmm2ext::enable_tooltips ();
- } else {
- Gtkmm2ext::disable_tooltips ();
- }
} else if (p == "skip-playback") {
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("toggle-skip-playback"));
@@ -1773,9 +1725,40 @@ Editor::parameter_changed (std::string p)
}
void
-Editor::reset_focus ()
+Editor::reset_focus (Gtk::Widget* w)
{
- _track_canvas->grab_focus();
+ /* this resets focus to the first focusable parent of the given widget,
+ * or, if there is no focusable parent, cancels focus in the toplevel
+ * window that the given widget is packed into (if there is one).
+ */
+
+ if (!w) {
+ return;
+ }
+
+ Gtk::Widget* top = w->get_toplevel();
+
+ if (!top || !top->is_toplevel()) {
+ return;
+ }
+
+ w = w->get_parent ();
+
+ while (w) {
+ if (w->get_can_focus ()) {
+ Window* win = dynamic_cast<Window*> (top);
+ win->set_focus (*w);
+ return;
+ }
+ w = w->get_parent ();
+ }
+
+ /* no focusable parent found, cancel focus in top level window.
+ C++ API cannot be used for this. Thanks, references.
+ */
+
+ gtk_window_set_focus (GTK_WINDOW(top->gobj()), 0);
+
}
void
@@ -1794,7 +1777,7 @@ Editor::reset_canvas_action_sensitivity (bool onoff)
void
Editor::register_region_actions ()
{
- _region_actions = ActionGroup::create (X_("Region"));
+ _region_actions = myactions.create_action_group (X_("Region"));
/* PART 1: actions that operate on the selection, and for which the edit point type and location is irrelevant */
@@ -1958,7 +1941,8 @@ Editor::register_region_actions ()
reg_sens (_region_actions, "combine-regions", _("Combine"), sigc::mem_fun (*this, &Editor::combine_regions));
reg_sens (_region_actions, "uncombine-regions", _("Uncombine"), sigc::mem_fun (*this, &Editor::uncombine_regions));
- reg_sens (_region_actions, "analyze-region", _("Spectral Analysis..."), sigc::mem_fun (*this, &Editor::analyze_region_selection));
+ reg_sens (_region_actions, "loudness-analyze-region", _("Loudness Analysis..."), sigc::mem_fun (*this, &Editor::loudness_analyze_region_selection));
+ reg_sens (_region_actions, "spectral-analyze-region", _("Spectral Analysis..."), sigc::mem_fun (*this, &Editor::spectral_analyze_region_selection));
reg_sens (_region_actions, "reset-region-gain-envelopes", _("Reset Envelope"), sigc::mem_fun (*this, &Editor::reset_region_gain_envelopes));
@@ -2062,13 +2046,9 @@ Editor::register_region_actions ()
sigc::bind (sigc::mem_fun (*this, &Editor::align_regions_relative), ARDOUR::SyncPoint)
);
- Glib::RefPtr<Action> a = reg_sens (_region_actions, "choose-top-region", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), false));
- a->set_accel_group (get_accel_group ());
-
- a = reg_sens (_region_actions, "choose-top-region-context-menu", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), true));
- a->set_accel_group (get_accel_group ());
-
- _all_region_actions_sensitized = true;
+ reg_sens (_region_actions, "choose-top-region", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), false));
+ reg_sens (_region_actions, "choose-top-region-context-menu", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), true));
- ActionManager::add_action_group (_region_actions);
+ /* desensitize them all by default. region selection will change this */
+ sensitize_all_region_actions (false);
}
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc
index 4da1625..237fb67 100644
--- a/gtk2_ardour/editor_audio_import.cc
+++ b/gtk2_ardour/editor_audio_import.cc
@@ -58,7 +58,7 @@
#include "mouse_cursors.h"
#include "editor_cursors.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -507,7 +507,10 @@ Editor::import_sndfiles (vector<string> paths,
gtk_main_iteration ();
}
- import_status.done = true;
+ // wait for thread to terminate
+ while (!import_status.done) {
+ gtk_main_iteration ();
+ }
int result = -1;
@@ -934,24 +937,38 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
{
if (!existing_track) {
if (ar) {
- list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, Normal, 0, 1));
+ list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Normal));
if (at.empty()) {
return -1;
}
+ if (Config->get_strict_io ()) {
+ for (list<boost::shared_ptr<AudioTrack> >::iterator i = at.begin(); i != at.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
+ }
existing_track = at.front();
} else if (mr) {
list<boost::shared_ptr<MidiTrack> > mt (
_session->new_midi_track (ChanCount (DataType::MIDI, 1),
ChanCount (DataType::MIDI, 1),
- instrument,
- Normal, 0, 1));
+ instrument, (Plugin::PresetRecord*) 0,
+ (RouteGroup*) 0,
+ 1,
+ string(),
+ PresentationInfo::max_order));
if (mt.empty()) {
return -1;
}
+ if (Config->get_strict_io ()) {
+ for (list<boost::shared_ptr<MidiTrack> >::iterator i = mt.begin(); i != mt.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
+ }
+ // TODO set strict_io from preferences
existing_track = mt.front();
}
@@ -976,7 +993,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
return -1;
}
- list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, Destructive));
+ list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Destructive));
if (!at.empty()) {
boost::shared_ptr<Playlist> playlist = at.front()->playlist();
boost::shared_ptr<Region> copy (RegionFactory::create (region, true));
@@ -984,6 +1001,11 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
playlist->add_region (copy, pos);
_session->add_command (new StatefulDiffCommand (playlist));
}
+ if (Config->get_strict_io ()) {
+ for (list<boost::shared_ptr<AudioTrack> >::iterator i = at.begin(); i != at.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
+ }
break;
}
}
diff --git a/gtk2_ardour/editor_audiotrack.cc b/gtk2_ardour/editor_audiotrack.cc
index b569037..4693ea8 100644
--- a/gtk2_ardour/editor_audiotrack.cc
+++ b/gtk2_ardour/editor_audiotrack.cc
@@ -29,7 +29,7 @@
#include "selection.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -39,7 +39,7 @@ Editor::start_updating_meters ()
{
RouteTimeAxisView* rtv;
- if (is_mapped() && _session) {
+ if (contents().is_mapped() && _session) {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
if ((rtv = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
rtv->reset_meter ();
@@ -57,7 +57,7 @@ Editor::stop_updating_meters ()
meters_running = false;
- if (is_mapped() && _session) {
+ if (contents().is_mapped() && _session) {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
if ((rtv = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
rtv->hide_meter ();
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index 233a3fb..4fbe0d8 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -54,7 +54,7 @@
#include "ui_config.h"
#include "verbose_cursor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -98,18 +98,6 @@ Editor::initialize_canvas ()
_verbose_cursor = new VerboseCursor (this);
- /* on the bottom, an image */
-
- if (Profile->get_sae()) {
- Image img (::get_icon (X_("saelogo")));
- // logo_item = new ArdourCanvas::Pixbuf (_track_canvas->root(), 0.0, 0.0, img.get_pixbuf());
- // logo_item->property_height_in_pixels() = true;
- // logo_item->property_width_in_pixels() = true;
- // logo_item->property_height_set() = true;
- // logo_item->property_width_set() = true;
- // logo_item->show ();
- }
-
/*a group to hold global rects like punch/loop indicators */
global_rect_group = new ArdourCanvas::Container (hv_scroll_group);
CANVAS_DEBUG_NAME (global_rect_group, "global rect group");
@@ -227,10 +215,6 @@ Editor::initialize_canvas ()
playhead_cursor = new EditorCursor (*this, &Editor::canvas_playhead_cursor_event);
- if (logo_item) {
- logo_item->lower_to_bottom ();
- }
-
_canvas_drop_zone = new ArdourCanvas::Rectangle (hv_scroll_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, 0.0));
/* this thing is transparent */
_canvas_drop_zone->set_fill (false);
@@ -329,7 +313,7 @@ Editor::reset_controls_layout_width ()
edit_controls_vbox.size_request (req);
w = req.width;
- if (_group_tabs->is_mapped()) {
+ if (_group_tabs->is_visible()) {
_group_tabs->size_request (req);
w += req.width;
}
@@ -428,7 +412,7 @@ Editor::drop_paths_part_two (const vector<string>& paths, framepos_t frame, doub
InstrumentSelector is; // instantiation builds instrument-list and sets default.
do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, frame, is.selected_instrument());
- if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files() || copy) {
+ if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, SrcBest, frame);
} else {
do_embed (audio_paths, Editing::ImportDistinctFiles, ImportAsTrack, frame);
@@ -444,7 +428,7 @@ Editor::drop_paths_part_two (const vector<string>& paths, framepos_t frame, doub
do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack, SrcBest, frame);
- if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files() || copy) {
+ if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, SrcBest, frame);
} else {
do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, frame);
@@ -478,7 +462,7 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context,
snap_to (frame);
bool copy = ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY);
-#ifdef GTKOSX
+#ifdef __APPLE__
/* We are not allowed to call recursive main event loops from within
the main event loop with GTK/Quartz. Since import/embed wants
to push up a progress dialog, defer all this till we go idle.
@@ -500,6 +484,12 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context,
void
Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers)
{
+ Gtk::Window* toplevel = dynamic_cast<Gtk::Window*>(contents().get_toplevel());
+
+ if (!toplevel) {
+ return;
+ }
+
if (!UIConfiguration::instance().get_autoscroll_editor () || autoscroll_active ()) {
return;
}
@@ -557,7 +547,7 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers)
int x, y;
Gdk::ModifierType mask;
- get_window()->get_pointer (x, y, mask);
+ toplevel->get_window()->get_pointer (x, y, mask);
if ((allow_horiz && ((x < scrolling_boundary.x0 && leftmost_frame > 0) || x >= scrolling_boundary.x1)) ||
(allow_vert && ((y < scrolling_boundary.y0 && vertical_adjustment.get_value() > 0)|| y >= scrolling_boundary.y1))) {
@@ -578,8 +568,13 @@ Editor::autoscroll_canvas ()
Gdk::ModifierType mask;
frameoffset_t dx = 0;
bool no_stop = false;
+ Gtk::Window* toplevel = dynamic_cast<Gtk::Window*>(contents().get_toplevel());
+
+ if (!toplevel) {
+ return false;
+ }
- get_window()->get_pointer (x, y, mask);
+ toplevel->get_window()->get_pointer (x, y, mask);
VisualChange vc;
bool vertical_motion = false;
@@ -643,6 +638,7 @@ Editor::autoscroll_canvas ()
scroll_up_one_track ();
vertical_motion = true;
}
+ no_stop = true;
} else if (y > autoscroll_boundary.y1) {
@@ -650,9 +646,9 @@ Editor::autoscroll_canvas ()
scroll_down_one_track ();
vertical_motion = true;
}
+ no_stop = true;
}
- no_stop = true;
}
if (vc.pending || vertical_motion) {
@@ -682,7 +678,7 @@ Editor::autoscroll_canvas ()
int cx;
int cy;
- translate_coordinates (*_track_canvas, x, y, cx, cy);
+ toplevel->translate_coordinates (*_track_canvas, x, y, cx, cy);
/* clamp x and y to remain within the autoscroll boundary,
* which is defined in window coordinates
@@ -734,7 +730,7 @@ Editor::autoscroll_canvas ()
}
y = min (max ((ArdourCanvas::Coord) y, autoscroll_boundary.y0), autoscroll_boundary.y1);
- translate_coordinates (*_track_canvas_viewport, x, y, cx, cy);
+ toplevel->translate_coordinates (*_track_canvas_viewport, x, y, cx, cy);
ArdourCanvas::Duple d = _track_canvas->window_to_canvas (ArdourCanvas::Duple (cx, cy));
ev.x = d.x;
@@ -762,7 +758,6 @@ Editor::start_canvas_autoscroll (bool allow_horiz, bool allow_vert, const Ardour
stop_canvas_autoscroll ();
- autoscroll_cnt = 0;
autoscroll_horizontal_allowed = allow_horiz;
autoscroll_vertical_allowed = allow_vert;
autoscroll_boundary = boundary;
@@ -781,6 +776,7 @@ void
Editor::stop_canvas_autoscroll ()
{
autoscroll_connection.disconnect ();
+ autoscroll_cnt = 0;
}
Editor::EnterContext*
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc
index 25907fe..30e2504 100644
--- a/gtk2_ardour/editor_canvas_events.cc
+++ b/gtk2_ardour/editor_canvas_events.cc
@@ -51,7 +51,7 @@
#include "ui_config.h"
#include "verbose_cursor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -677,10 +677,14 @@ Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, Automation
AudioRegionGainLine* gl;
if ((gl = dynamic_cast<AudioRegionGainLine*> (al)) != 0) {
type = GainLineItem;
- clicked_regionview = &gl->region_view ();
+ if (event->type == GDK_BUTTON_PRESS) {
+ clicked_regionview = &gl->region_view ();
+ }
} else {
type = AutomationLineItem;
- clicked_regionview = 0;
+ if (event->type == GDK_BUTTON_PRESS) {
+ clicked_regionview = 0;
+ }
}
clicked_control_point = 0;
@@ -1010,6 +1014,12 @@ Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Te
}
bool
+Editor::canvas_tempo_curve_event (GdkEvent *event, ArdourCanvas::Item* item, TempoCurve* /*marker*/)
+{
+ return typed_event (item, event, TempoCurveItem);
+}
+
+bool
Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
{
return typed_event (item, event, MeterMarkerItem);
@@ -1219,7 +1229,7 @@ Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const& context,
* TODO: check if file is audio/midi, allow drops on same track-type only,
* currently: if audio is dropped on a midi-track, it is only added to the region-list
*/
- if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files()) {
+ if (UIConfiguration::instance().get_only_copy_imported_files()) {
context->drag_status(Gdk::ACTION_COPY, time);
} else {
if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) {
@@ -1270,13 +1280,15 @@ Editor::drop_regions (const Glib::RefPtr<Gdk::DragContext>& /*context*/,
output_chan = session()->master_out()->n_inputs().n_audio();
}
list<boost::shared_ptr<AudioTrack> > audio_tracks;
- audio_tracks = session()->new_audio_track (region->n_channels(), output_chan, ARDOUR::Normal, 0, 1, region->name());
- rtav = axis_view_from_route (audio_tracks.front());
+ audio_tracks = session()->new_audio_track (region->n_channels(), output_chan, 0, 1, region->name(), PresentationInfo::max_order);
+ rtav = dynamic_cast<RouteTimeAxisView*> (axis_view_from_stripable (audio_tracks.front()));
} else if (boost::dynamic_pointer_cast<MidiRegion> (region)) {
ChanCount one_midi_port (DataType::MIDI, 1);
list<boost::shared_ptr<MidiTrack> > midi_tracks;
- midi_tracks = session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(), ARDOUR::Normal, 0, 1, region->name());
- rtav = axis_view_from_route (midi_tracks.front());
+ midi_tracks = session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(),
+ (ARDOUR::Plugin::PresetRecord*) 0,
+ (ARDOUR::RouteGroup*) 0, 1, region->name(), PresentationInfo::max_order);
+ rtav = dynamic_cast<RouteTimeAxisView*> (axis_view_from_stripable (midi_tracks.front()));
} else {
return;
}
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 21cd043..6fa3cb0 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -44,7 +44,7 @@
#include "canvas/scroll_group.h"
#include "editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "keyboard.h"
#include "audio_region_view.h"
#include "automation_region_view.h"
@@ -510,28 +510,24 @@ Drag::show_verbose_cursor_text (string const & text)
}
boost::shared_ptr<Region>
-Drag::add_midi_region (MidiTimeAxisView* view, bool commit)
+Drag::add_midi_region (MidiTimeAxisView* view, bool commit, const int32_t sub_num)
{
if (_editor->session()) {
const TempoMap& map (_editor->session()->tempo_map());
framecnt_t pos = grab_frame();
- const Meter& m = map.meter_at (pos);
/* not that the frame rate used here can be affected by pull up/down which
might be wrong.
*/
- framecnt_t len = m.frames_per_bar (map.tempo_at (pos), _editor->session()->frame_rate());
- return view->add_region (grab_frame(), len, commit);
+ framecnt_t len = map.frame_at_beat (map.beat_at_frame (pos) + 1.0) - pos;
+ return view->add_region (grab_frame(), len, commit, sub_num);
}
return boost::shared_ptr<Region>();
}
-struct EditorOrderTimeAxisViewSorter {
+struct PresentationInfoTimeAxisViewSorter {
bool operator() (TimeAxisView* a, TimeAxisView* b) {
- RouteTimeAxisView* ra = dynamic_cast<RouteTimeAxisView*> (a);
- RouteTimeAxisView* rb = dynamic_cast<RouteTimeAxisView*> (b);
- assert (ra && rb);
- return ra->route()->order_key () < rb->route()->order_key ();
+ return a->stripable()->presentation_info().order() < b->stripable()->presentation_info().order();
}
};
@@ -547,7 +543,7 @@ RegionDrag::RegionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<Re
*/
TrackViewList track_views = _editor->track_views;
- track_views.sort (EditorOrderTimeAxisViewSorter ());
+ track_views.sort (PresentationInfoTimeAxisViewSorter ());
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
_time_axis_views.push_back (*i);
@@ -847,7 +843,7 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
if (!rtv || !rtv->is_track()) {
- /* ignore busses early on. we can't move any regions on them */
+ /* ignore non-tracks early on. we can't move any regions on them */
} else if (_last_pointer_time_axis_view < 0) {
/* Was in the drop-zone, now over a track.
* Hence it must be an upward move (from the bottom)
@@ -1260,8 +1256,8 @@ RegionMoveDrag::motion (GdkEvent* event, bool first_move)
MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(rv);
const boost::shared_ptr<const Region> original = rv->region();
- boost::shared_ptr<Region> region_copy = RegionFactory::create (original, true);
- region_copy->set_position (original->position());
+ boost::shared_ptr<Region> region_copy = RegionFactory::create (original, true
+ , _editor->get_grid_music_divisions (event->button.state));
/* need to set this so that the drop zone code can work. This doesn't
actually put the region into the playlist, but just sets a weak pointer
to it.
@@ -1368,7 +1364,8 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
finished_copy (
changed_position,
changed_tracks,
- drag_delta
+ drag_delta,
+ ev->button.state
);
} else {
@@ -1376,7 +1373,8 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
finished_no_copy (
changed_position,
changed_tracks,
- drag_delta
+ drag_delta,
+ ev->button.state
);
}
@@ -1398,21 +1396,23 @@ RegionMoveDrag::create_destination_time_axis (boost::shared_ptr<Region> region,
if ((Config->get_output_auto_connect() & AutoConnectMaster) && _editor->session()->master_out()) {
output_chan = _editor->session()->master_out()->n_inputs().n_audio();
}
- audio_tracks = _editor->session()->new_audio_track (region->n_channels(), output_chan, ARDOUR::Normal, 0, 1, region->name());
- RouteTimeAxisView* rtav = _editor->axis_view_from_route (audio_tracks.front());
- if (rtav) {
- rtav->set_height (original->current_height());
+ audio_tracks = _editor->session()->new_audio_track (region->n_channels(), output_chan, 0, 1, region->name(), PresentationInfo::max_order);
+ TimeAxisView* tav =_editor->axis_view_from_stripable (audio_tracks.front());
+ if (tav) {
+ tav->set_height (original->current_height());
}
- return rtav;
+ return dynamic_cast<RouteTimeAxisView*>(tav);
} else {
ChanCount one_midi_port (DataType::MIDI, 1);
list<boost::shared_ptr<MidiTrack> > midi_tracks;
- midi_tracks = _editor->session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(), ARDOUR::Normal, 0, 1, region->name());
- RouteTimeAxisView* rtav = _editor->axis_view_from_route (midi_tracks.front());
- if (rtav) {
- rtav->set_height (original->current_height());
+ midi_tracks = _editor->session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(),
+ (ARDOUR::Plugin::PresetRecord*) 0,
+ (ARDOUR::RouteGroup*) 0, 1, region->name(), PresentationInfo::max_order);
+ TimeAxisView* tav = _editor->axis_view_from_stripable (midi_tracks.front());
+ if (tav) {
+ tav->set_height (original->current_height());
}
- return rtav;
+ return dynamic_cast<RouteTimeAxisView*> (tav);
}
} catch (...) {
error << _("Could not create new track after region placed in the drop zone") << endmsg;
@@ -1421,7 +1421,7 @@ RegionMoveDrag::create_destination_time_axis (boost::shared_ptr<Region> region,
}
void
-RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed_tracks*/, framecnt_t const drag_delta)
+RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed_tracks*/, framecnt_t const drag_delta, int32_t const ev_state)
{
RegionSelection new_views;
PlaylistSet modified_playlists;
@@ -1478,7 +1478,9 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed
}
if (dest_rtv != 0) {
- RegionView* new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where, modified_playlists);
+ RegionView* new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
+ modified_playlists, _editor->get_grid_music_divisions (ev_state));
+
if (new_view != 0) {
new_views.push_back (new_view);
}
@@ -1512,7 +1514,8 @@ void
RegionMoveDrag::finished_no_copy (
bool const changed_position,
bool const changed_tracks,
- framecnt_t const drag_delta
+ framecnt_t const drag_delta,
+ int32_t const ev_state
)
{
RegionSelection new_views;
@@ -1573,7 +1576,8 @@ RegionMoveDrag::finished_no_copy (
/* insert into new playlist */
RegionView* new_view = insert_region_into_playlist (
- RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where, modified_playlists
+ RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
+ modified_playlists, _editor->get_grid_music_divisions (ev_state)
);
if (new_view == 0) {
@@ -1633,7 +1637,7 @@ RegionMoveDrag::finished_no_copy (
playlist->freeze ();
}
- rv->region()->set_position (where);
+ rv->region()->set_position (where, _editor->get_grid_music_divisions (ev_state));
_editor->session()->add_command (new StatefulDiffCommand (rv->region()));
}
@@ -1736,7 +1740,8 @@ RegionMoveDrag::insert_region_into_playlist (
RouteTimeAxisView* dest_rtv,
layer_t dest_layer,
framecnt_t where,
- PlaylistSet& modified_playlists
+ PlaylistSet& modified_playlists,
+ const int32_t sub_num
)
{
boost::shared_ptr<Playlist> dest_playlist = dest_rtv->playlist ();
@@ -1753,8 +1758,7 @@ RegionMoveDrag::insert_region_into_playlist (
if (r.second) {
dest_playlist->clear_changes ();
}
-
- dest_playlist->add_region (region, where);
+ dest_playlist->add_region (region, where, 1.0, false, sub_num);
if (dest_rtv->view()->layer_display() == Stacked || dest_rtv->view()->layer_display() == Expanded) {
dest_playlist->set_layer (region, dest_layer);
@@ -1878,7 +1882,7 @@ RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, Rout
}
void
-RegionInsertDrag::finished (GdkEvent *, bool)
+RegionInsertDrag::finished (GdkEvent * event, bool)
{
int pos = _views.front().time_axis_view;
assert(pos >= 0 && pos < (int)_time_axis_views.size());
@@ -2305,7 +2309,7 @@ RegionCreateDrag::motion (GdkEvent* event, bool first_move)
{
if (first_move) {
_editor->begin_reversible_command (_("create region"));
- _region = add_midi_region (_view, false);
+ _region = add_midi_region (_view, false, _editor->get_grid_music_divisions (event->button.state));
_view->playlist()->freeze ();
} else {
if (_region) {
@@ -2322,16 +2326,16 @@ RegionCreateDrag::motion (GdkEvent* event, bool first_move)
*/
framecnt_t const len = (framecnt_t) fabs ((double)(f - grab_frame () - 1));
- _region->set_length (len < 1 ? 1 : len);
+ _region->set_length (len < 1 ? 1 : len, _editor->get_grid_music_divisions (event->button.state));
}
}
}
void
-RegionCreateDrag::finished (GdkEvent*, bool movement_occurred)
+RegionCreateDrag::finished (GdkEvent* event, bool movement_occurred)
{
if (!movement_occurred) {
- add_midi_region (_view, true);
+ add_midi_region (_view, true, _editor->get_grid_music_divisions (event->button.state));
} else {
_view->playlist()->thaw ();
_editor->commit_reversible_command();
@@ -2852,7 +2856,6 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
RegionView* rv = i->view;
- rv->enable_display (false);
rv->region()->playlist()->clear_owned_changes ();
if (_operation == StartTrim) {
@@ -2913,7 +2916,9 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
switch (_operation) {
case StartTrim:
for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
- bool changed = i->view->trim_front (i->initial_position + dt, non_overlap_trim);
+ bool changed = i->view->trim_front (i->initial_position + dt, non_overlap_trim
+ , _editor->get_grid_music_divisions (event->button.state));
+
if (changed && _preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
if (arv) {
@@ -2931,7 +2936,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
case EndTrim:
for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
- bool changed = i->view->trim_end (i->initial_end + dt, non_overlap_trim);
+ bool changed = i->view->trim_end (i->initial_end + dt, non_overlap_trim, _editor->get_grid_music_divisions (event->button.state));
if (changed && _preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
if (arv) {
@@ -3116,13 +3121,17 @@ TrimDrag::setup_pointer_frame_offset ()
}
MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
- : Drag (e, i),
- _copy (c)
+ : Drag (e, i)
+ , _copy (c)
+ , _old_snap_type (e->snap_type())
+ , _old_snap_mode (e->snap_mode())
, before_state (0)
{
DEBUG_TRACE (DEBUG::Drags, "New MeterMarkerDrag\n");
_marker = reinterpret_cast<MeterMarker*> (_item->get_data ("marker"));
assert (_marker);
+ _real_section = &_marker->meter();
+
}
void
@@ -3141,22 +3150,8 @@ MeterMarkerDrag::setup_pointer_frame_offset ()
void
MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
{
- if (!_marker->meter().movable()) {
- return;
- }
-
if (first_move) {
-
- // create a dummy marker for visual representation of moving the
- // section, because whether its a copy or not, we're going to
- // leave or lose the original marker (leave if its a copy; lose if its
- // not, because we'll remove it from the map).
-
- MeterSection section (_marker->meter());
-
- if (!section.movable()) {
- return;
- }
+ // create a dummy marker to catch events, then hide it.
char name[64];
snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ());
@@ -3171,20 +3166,54 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
/* use the new marker for the grab */
swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
+ _marker->hide();
+
+ TempoMap& map (_editor->session()->tempo_map());
+ /* get current state */
+ before_state = &map.get_state();
if (!_copy) {
- TempoMap& map (_editor->session()->tempo_map());
- /* get current state */
- before_state = &map.get_state();
- /* remove the section while we drag it */
- map.remove_meter (section, true);
+ _editor->begin_reversible_command (_("move meter mark"));
+ } else {
+ _editor->begin_reversible_command (_("copy meter mark"));
+
+ Timecode::BBT_Time bbt = _real_section->bbt();
+
+ /* we can't add a meter where one currently exists */
+ if (_real_section->frame() < adjusted_current_frame (event, false)) {
+ ++bbt.bars;
+ } else {
+ --bbt.bars;
+ }
+ const double beat = map.beat_at_bbt (bbt);
+ _real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor())
+ , beat, bbt, map.frame_at_bbt (bbt), _real_section->position_lock_style());
+ if (!_real_section) {
+ aborted (true);
+ return;
+ }
+
+ }
+ /* only snap to bars. leave snap mode alone for audio locked meters.*/
+ if (_real_section->position_lock_style() != AudioTime) {
+ _editor->set_snap_to (SnapToBar);
+ _editor->set_snap_mode (SnapNormal);
}
}
- framepos_t const pf = adjusted_current_frame (event);
+ framepos_t pf = adjusted_current_frame (event);
- _marker->set_position (pf);
- show_verbose_cursor_time (pf);
+ if (_real_section->position_lock_style() == AudioTime && _editor->snap_musical()) {
+ /* never snap to music for audio locked */
+ pf = adjusted_current_frame (event, false);
+ }
+
+ _editor->session()->tempo_map().gui_move_meter (_real_section, pf);
+
+ /* fake marker meeds to stay under the mouse, unlike the real one. */
+ _marker->set_position (adjusted_current_frame (event, false));
+
+ show_verbose_cursor_time (_real_section->frame());
}
void
@@ -3197,35 +3226,15 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
return;
}
- if (!_marker->meter().movable()) {
- return;
- }
-
- motion (event, false);
-
- Timecode::BBT_Time when;
+ /* reinstate old snap setting */
+ _editor->set_snap_to (_old_snap_type);
+ _editor->set_snap_mode (_old_snap_mode);
TempoMap& map (_editor->session()->tempo_map());
- map.bbt_time (_marker->position(), when);
-
- if (_copy == true) {
- _editor->begin_reversible_command (_("copy meter mark"));
- XMLNode &before = map.get_state();
- map.add_meter (_marker->meter(), when);
- XMLNode &after = map.get_state();
- _editor->session()->add_command(new MementoCommand<TempoMap>(map, &before, &after));
- _editor->commit_reversible_command ();
- } else {
- _editor->begin_reversible_command (_("move meter mark"));
-
- /* we removed it before, so add it back now */
-
- map.add_meter (_marker->meter(), when);
- XMLNode &after = map.get_state();
- _editor->session()->add_command(new MementoCommand<TempoMap>(map, before_state, &after));
- _editor->commit_reversible_command ();
- }
+ XMLNode &after = map.get_state();
+ _editor->session()->add_command(new MementoCommand<TempoMap>(map, before_state, &after));
+ _editor->commit_reversible_command ();
// delete the dummy marker we used for visual representation while moving.
// a new visual marker will show up automatically.
@@ -3236,11 +3245,12 @@ void
MeterMarkerDrag::aborted (bool moved)
{
_marker->set_position (_marker->meter().frame ());
-
if (moved) {
- TempoMap& map (_editor->session()->tempo_map());
- /* we removed it before, so add it back now */
- map.add_meter (_marker->meter(), _marker->meter().frame());
+ /* reinstate old snap setting */
+ _editor->set_snap_to (_old_snap_type);
+ _editor->set_snap_mode (_old_snap_mode);
+
+ _editor->session()->tempo_map().set_state (*before_state, Stateful::current_state_version);
// delete the dummy marker we used for visual representation while moving.
// a new visual marker will show up automatically.
delete _marker;
@@ -3255,6 +3265,8 @@ TempoMarkerDrag::TempoMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
DEBUG_TRACE (DEBUG::Drags, "New TempoMarkerDrag\n");
_marker = reinterpret_cast<TempoMarker*> (_item->get_data ("marker"));
+ _real_section = &_marker->tempo();
+ _movable = _real_section->movable();
assert (_marker);
}
@@ -3262,31 +3274,29 @@ void
TempoMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
{
Drag::start_grab (event, cursor);
- show_verbose_cursor_time (adjusted_current_frame (event));
+ if (!_real_section->active()) {
+ show_verbose_cursor_text (_("inactive"));
+ } else {
+ show_verbose_cursor_time (adjusted_current_frame (event));
+ }
}
void
TempoMarkerDrag::setup_pointer_frame_offset ()
{
- _pointer_frame_offset = raw_grab_frame() - _marker->tempo().frame();
+ _pointer_frame_offset = raw_grab_frame() - _real_section->frame();
}
void
TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
{
- if (!_marker->tempo().movable()) {
+ if (!_real_section->active()) {
return;
}
if (first_move) {
- // create a dummy marker for visual representation of moving the
- // section, because whether its a copy or not, we're going to
- // leave or lose the original marker (leave if its a copy; lose if its
- // not, because we'll remove it from the map).
-
- // create a dummy marker for visual representation of moving the copy.
- // The actual copying is not done before we reach the finish callback.
+ // mvc drag - create a dummy marker to catch events, hide it.
char name[64];
snprintf (name, sizeof (name), "%.2f", _marker->tempo().beats_per_minute());
@@ -3303,25 +3313,65 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
/* use the new marker for the grab */
swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
+ _marker->hide();
+
+ TempoMap& map (_editor->session()->tempo_map());
+ /* get current state */
+ before_state = &map.get_state();
if (!_copy) {
_editor->begin_reversible_command (_("move tempo mark"));
- TempoMap& map (_editor->session()->tempo_map());
- /* get current state */
- before_state = &map.get_state();
- /* remove the section while we drag it */
- map.remove_tempo (section, true);
+
+ } else {
+ const Tempo tempo (_marker->tempo());
+ const framepos_t frame = adjusted_current_frame (event) + 1;
+ const TempoSection::Type type = _real_section->type();
+
+ _editor->begin_reversible_command (_("copy tempo mark"));
+
+ if (_real_section->position_lock_style() == MusicTime) {
+ _real_section = map.add_tempo (tempo, map.pulse_at_frame (frame), 0, type, MusicTime);
+ } else {
+ _real_section = map.add_tempo (tempo, 0.0, frame, type, AudioTime);
+ }
+
+ if (!_real_section) {
+ aborted (true);
+ return;
+ }
}
+
}
- framepos_t const pf = adjusted_current_frame (event);
- _marker->set_position (pf);
- show_verbose_cursor_time (pf);
+ if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier ())) {
+ /* use vertical movement to alter tempo .. should be log */
+ double new_bpm = _real_section->beats_per_minute() + ((last_pointer_y() - current_pointer_y()) / 5.0);
+ stringstream strs;
+
+ _editor->session()->tempo_map().gui_change_tempo (_real_section, Tempo (new_bpm, _real_section->note_type()));
+ strs << new_bpm;
+ show_verbose_cursor_text (strs.str());
+
+ } else if (_movable && !_real_section->locked_to_meter()) {
+ const framepos_t pf = adjusted_current_frame (event);
+ TempoMap& map (_editor->session()->tempo_map());
+
+ /* snap to beat is 1, snap to bar is -1 (sorry) */
+ int sub_num = _editor->get_grid_music_divisions (event->button.state);
+
+ map.gui_move_tempo (_real_section, pf, sub_num);
+
+ show_verbose_cursor_time (_real_section->frame());
+ }
+ _marker->set_position (adjusted_current_frame (event, false));
}
void
TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
{
+ if (!_real_section->active()) {
+ return;
+ }
if (!movement_occurred) {
if (was_double_click()) {
_editor->edit_tempo_marker (*_marker);
@@ -3329,33 +3379,11 @@ TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
return;
}
- if (!_marker->tempo().movable()) {
- return;
- }
-
- motion (event, false);
-
TempoMap& map (_editor->session()->tempo_map());
- framepos_t beat_time = map.round_to_beat (_marker->position(), RoundNearest);
- Timecode::BBT_Time when;
-
- map.bbt_time (beat_time, when);
- if (_copy == true) {
- _editor->begin_reversible_command (_("copy tempo mark"));
- XMLNode &before = map.get_state();
- map.add_tempo (_marker->tempo(), when);
- XMLNode &after = map.get_state();
- _editor->session()->add_command (new MementoCommand<TempoMap>(map, &before, &after));
- _editor->commit_reversible_command ();
-
- } else {
- /* we removed it before, so add it back now */
- map.add_tempo (_marker->tempo(), when);
- XMLNode &after = map.get_state();
- _editor->session()->add_command (new MementoCommand<TempoMap>(map, before_state, &after));
- _editor->commit_reversible_command ();
- }
+ XMLNode &after = map.get_state();
+ _editor->session()->add_command (new MementoCommand<TempoMap>(map, before_state, &after));
+ _editor->commit_reversible_command ();
// delete the dummy marker we used for visual representation while moving.
// a new visual marker will show up automatically.
@@ -3368,14 +3396,112 @@ TempoMarkerDrag::aborted (bool moved)
_marker->set_position (_marker->tempo().frame());
if (moved) {
TempoMap& map (_editor->session()->tempo_map());
- /* we removed it before, so add it back now */
- map.add_tempo (_marker->tempo(), _marker->tempo().start());
- // delete the dummy marker we used for visual representation while moving.
- // a new visual marker will show up automatically.
+ map.set_state (*before_state, Stateful::current_state_version);
+ // delete the dummy (hidden) marker we used for events while moving.
delete _marker;
}
}
+BBTRulerDrag::BBTRulerDrag (Editor* e, ArdourCanvas::Item* i)
+ : Drag (e, i)
+ , _pulse (0.0)
+ , _tempo (0)
+ , before_state (0)
+{
+ DEBUG_TRACE (DEBUG::Drags, "New BBTRulerDrag\n");
+
+}
+
+void
+BBTRulerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
+{
+ Drag::start_grab (event, cursor);
+ TempoMap& map (_editor->session()->tempo_map());
+ _tempo = const_cast<TempoSection*> (&map.tempo_section_at_frame (raw_grab_frame()));
+ ostringstream sstr;
+
+ sstr << "^" << fixed << setprecision(3) << map.tempo_at_frame (adjusted_current_frame (event)).beats_per_minute() << "\n";
+ sstr << "<" << fixed << setprecision(3) << _tempo->beats_per_minute();
+ show_verbose_cursor_text (sstr.str());
+ finished (event, false);
+}
+
+void
+BBTRulerDrag::setup_pointer_frame_offset ()
+{
+ TempoMap& map (_editor->session()->tempo_map());
+ const double beat_at_frame = map.beat_at_frame (raw_grab_frame());
+ const uint32_t divisions = _editor->get_grid_beat_divisions (0);
+ double beat = 0.0;
+
+ if (divisions > 0) {
+ beat = floor (beat_at_frame) + (floor (((beat_at_frame - floor (beat_at_frame)) * divisions)) / divisions);
+ } else {
+ /* while it makes some sense for the user to determine the division to 'grab',
+ grabbing a bar often leads to confusing results wrt the actual tempo section being altered
+ and the result over steep tempo curves. Use sixteenths.
+ */
+ beat = floor (beat_at_frame) + (floor (((beat_at_frame - floor (beat_at_frame)) * 4)) / 4);
+ }
+
+ _pulse = map.pulse_at_beat (beat);
+
+ _pointer_frame_offset = raw_grab_frame() - map.frame_at_pulse (_pulse);
+
+}
+
+void
+BBTRulerDrag::motion (GdkEvent* event, bool first_move)
+{
+ TempoMap& map (_editor->session()->tempo_map());
+
+ if (first_move) {
+ /* get current state */
+ before_state = &map.get_state();
+ _editor->begin_reversible_command (_("dilate tempo"));
+ }
+
+ framepos_t pf;
+
+ if (_editor->snap_musical()) {
+ pf = adjusted_current_frame (event, false);
+ } else {
+ pf = adjusted_current_frame (event);
+ }
+
+ if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) {
+ /* adjust previous tempo to match pointer frame */
+ _editor->session()->tempo_map().gui_dilate_tempo (_tempo, map.frame_at_pulse (_pulse), pf, _pulse);
+ }
+ ostringstream sstr;
+ sstr << "^" << fixed << setprecision(3) << map.tempo_at_frame (pf).beats_per_minute() << "\n";
+ sstr << "<" << fixed << setprecision(3) << _tempo->beats_per_minute();
+ show_verbose_cursor_text (sstr.str());
+}
+
+void
+BBTRulerDrag::finished (GdkEvent* event, bool movement_occurred)
+{
+ if (!movement_occurred) {
+ return;
+ }
+
+ TempoMap& map (_editor->session()->tempo_map());
+
+ XMLNode &after = map.get_state();
+ _editor->session()->add_command(new MementoCommand<TempoMap>(map, before_state, &after));
+ _editor->commit_reversible_command ();
+}
+
+void
+BBTRulerDrag::aborted (bool moved)
+{
+ if (moved) {
+ _editor->session()->tempo_map().set_state (*before_state, Stateful::current_state_version);
+ }
+}
+
+
CursorDrag::CursorDrag (Editor* e, EditorCursor& c, bool s)
: Drag (e, &c.track_canvas_item(), false)
, _cursor (c)
@@ -3762,12 +3888,14 @@ MarkerDrag::MarkerDrag (Editor* e, ArdourCanvas::Item* i)
, _selection_changed (false)
{
DEBUG_TRACE (DEBUG::Drags, "New MarkerDrag\n");
-
+ Gtk::Window* toplevel = _editor->current_toplevel();
_marker = reinterpret_cast<ArdourMarker*> (_item->get_data ("marker"));
+
assert (_marker);
_points.push_back (ArdourCanvas::Duple (0, 0));
- _points.push_back (ArdourCanvas::Duple (0, physical_screen_height (_editor->get_window())));
+
+ _points.push_back (ArdourCanvas::Duple (0, toplevel ? physical_screen_height (toplevel->get_window()) : 900));
}
MarkerDrag::~MarkerDrag ()
@@ -3998,7 +4126,7 @@ MarkerDrag::motion (GdkEvent* event, bool)
if (move_both || (*x).move_both) {
copy_location->set_start (new_start);
copy_location->set_end (new_end);
- } else if (new_start < copy_location->end()) {
+ } else if (new_start < copy_location->end()) {
copy_location->set_start (new_start);
} else if (newframe > 0) {
//_editor->snap_to (next, RoundUpAlways, true);
@@ -4115,6 +4243,10 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
} else {
location->set (((*x).location)->start(), ((*x).location)->end());
}
+
+ if (location->is_session_range()) {
+ _editor->session()->set_end_is_free (false);
+ }
}
}
@@ -4126,9 +4258,9 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
}
void
-MarkerDrag::aborted (bool movement_occured)
+MarkerDrag::aborted (bool movement_occurred)
{
- if (!movement_occured) {
+ if (!movement_occurred) {
return;
}
@@ -4382,9 +4514,9 @@ LineDrag::motion (GdkEvent* event, bool first_move)
}
void
-LineDrag::finished (GdkEvent* event, bool movement_occured)
+LineDrag::finished (GdkEvent* event, bool movement_occurred)
{
- if (movement_occured) {
+ if (movement_occurred) {
motion (event, false);
_line->end_drag (false, 0);
_editor->commit_reversible_command ();
@@ -4646,7 +4778,7 @@ RubberbandSelectDrag::finished (GdkEvent* event, bool movement_occurred)
/* MIDI track */
if (_editor->selection->empty() && _editor->mouse_mode == MouseDraw) {
/* nothing selected */
- add_midi_region (mtv, true);
+ add_midi_region (mtv, true, _editor->get_grid_music_divisions(event->button.state));
do_deselect = false;
}
}
@@ -4714,31 +4846,37 @@ TimeFXDrag::motion (GdkEvent* event, bool)
void
TimeFXDrag::finished (GdkEvent* event, bool movement_occurred)
{
- if (!movement_occurred) {
- return;
- }
+ /* this may have been a single click, no drag. We still want the dialog
+ to show up in that case, so that the user can manually edit the
+ parameters for the timestretch.
+ */
- motion (event, false);
+ float fraction = 1.0;
- _primary->get_time_axis_view().hide_timestretch ();
+ if (movement_occurred) {
- framepos_t adjusted_frame_pos = adjusted_current_frame (event);
+ motion (event, false);
- if (adjusted_frame_pos < _primary->region()->position()) {
- /* backwards drag of the left edge - not usable */
- return;
- }
+ _primary->get_time_axis_view().hide_timestretch ();
- framecnt_t newlen = adjusted_frame_pos - _primary->region()->position();
+ framepos_t adjusted_frame_pos = adjusted_current_frame (event);
- float percentage = (double) newlen / (double) _primary->region()->length();
+ if (adjusted_frame_pos < _primary->region()->position()) {
+ /* backwards drag of the left edge - not usable */
+ return;
+ }
+
+ framecnt_t newlen = adjusted_frame_pos - _primary->region()->position();
+
+ fraction = (double) newlen / (double) _primary->region()->length();
#ifndef USE_RUBBERBAND
- // Soundtouch uses percentage / 100 instead of normal (/ 1)
- if (_primary->region()->data_type() == DataType::AUDIO) {
- percentage = (float) ((double) newlen - (double) _primary->region()->length()) / ((double) newlen) * 100.0f;
- }
+ // Soundtouch uses fraction / 100 instead of normal (/ 1)
+ if (_primary->region()->data_type() == DataType::AUDIO) {
+ fraction = (float) ((double) newlen - (double) _primary->region()->length()) / ((double) newlen) * 100.0f;
+ }
#endif
+ }
if (!_editor->get_selection().regions.empty()) {
/* primary will already be included in the selection, and edit
@@ -4747,7 +4885,7 @@ TimeFXDrag::finished (GdkEvent* event, bool movement_occurred)
selection.
*/
- if (_editor->time_stretch (_editor->get_selection().regions, percentage) == -1) {
+ if (_editor->time_stretch (_editor->get_selection().regions, fraction) == -1) {
error << _("An error occurred while executing time stretch operation") << endmsg;
}
}
@@ -4967,7 +5105,7 @@ SelectionDrag::motion (GdkEvent* event, bool first_move)
TrackViewList grouped_add = new_selection;
for (TrackViewList::const_iterator i = new_selection.begin(); i != new_selection.end(); ++i) {
RouteTimeAxisView *n = dynamic_cast<RouteTimeAxisView *>(*i);
- if ( n && n->route()->route_group() && n->route()->route_group()->is_active() && n->route()->route_group()->enabled_property (ARDOUR::Properties::select.property_id) ) {
+ if ( n && n->route()->route_group() && n->route()->route_group()->is_active() && n->route()->route_group()->enabled_property (ARDOUR::Properties::group_select.property_id) ) {
for (TrackViewList::const_iterator j = all_tracks.begin(); j != all_tracks.end(); ++j) {
RouteTimeAxisView *check = dynamic_cast<RouteTimeAxisView *>(*j);
if ( check && (n != check) && (check->route()->route_group() == n->route()->route_group()) )
@@ -5139,7 +5277,7 @@ RangeMarkerBarDrag::RangeMarkerBarDrag (Editor* e, ArdourCanvas::Item* i, Operat
_drag_rect = new ArdourCanvas::Rectangle (_editor->time_line_group,
ArdourCanvas::Rect (0.0, 0.0, 0.0,
- physical_screen_height (_editor->get_window())));
+ physical_screen_height (_editor->current_toplevel()->get_window())));
_drag_rect->hide ();
_drag_rect->set_fill_color (UIConfiguration::instance().color ("range drag rect"));
@@ -5361,9 +5499,9 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
}
void
-RangeMarkerBarDrag::aborted (bool movement_occured)
+RangeMarkerBarDrag::aborted (bool movement_occurred)
{
- if (movement_occured) {
+ if (movement_occurred) {
_drag_rect->hide ();
}
}
@@ -5875,6 +6013,9 @@ void
PatchChangeDrag::finished (GdkEvent* ev, bool movement_occurred)
{
if (!movement_occurred) {
+ if (was_double_click()) {
+ _region_view->edit_patch_change (_patch_change);
+ }
return;
}
@@ -6209,7 +6350,7 @@ RegionCutDrag::motion (GdkEvent*, bool)
}
void
-RegionCutDrag::finished (GdkEvent*, bool)
+RegionCutDrag::finished (GdkEvent* event, bool)
{
_editor->get_track_canvas()->canvas()->re_enter();
@@ -6223,7 +6364,7 @@ RegionCutDrag::finished (GdkEvent*, bool)
return;
}
- _editor->split_regions_at (pos, rs);
+ _editor->split_regions_at (pos, rs, _editor->get_grid_music_divisions (event->button.state));
}
void
diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h
index cd1b0c2..cc0e9d9 100644
--- a/gtk2_ardour/editor_drag.h
+++ b/gtk2_ardour/editor_drag.h
@@ -25,6 +25,7 @@
#include <gdk/gdk.h>
#include <stdint.h>
+#include "ardour/tempo.h"
#include "ardour/types.h"
#include "canvas/types.h"
@@ -36,6 +37,7 @@
namespace ARDOUR {
class Location;
+ class TempoSection;
}
namespace ArdourCanvas {
@@ -246,7 +248,7 @@ protected:
/* sets snap delta from unsnapped pos */
void setup_snap_delta (framepos_t pos);
- boost::shared_ptr<ARDOUR::Region> add_midi_region (MidiTimeAxisView*, bool commit);
+ boost::shared_ptr<ARDOUR::Region> add_midi_region (MidiTimeAxisView*, bool commit, const int32_t sub_num);
void show_verbose_cursor_time (framepos_t);
void show_verbose_cursor_duration (framepos_t, framepos_t, double xoffset = 0);
@@ -405,13 +407,15 @@ private:
void finished_no_copy (
bool const,
bool const,
- ARDOUR::framecnt_t const
+ ARDOUR::framecnt_t const,
+ int32_t const ev_state
);
void finished_copy (
bool const,
bool const,
- ARDOUR::framecnt_t const
+ ARDOUR::framecnt_t const,
+ int32_t const ev_state
);
RegionView* insert_region_into_playlist (
@@ -419,7 +423,8 @@ private:
RouteTimeAxisView*,
ARDOUR::layer_t,
ARDOUR::framecnt_t,
- PlaylistSet&
+ PlaylistSet&,
+ const int32_t sub_num
);
void remove_region_from_playlist (
@@ -704,7 +709,11 @@ public:
private:
MeterMarker* _marker;
+ ARDOUR::MeterSection* _real_section;
+
bool _copy;
+ Editing::SnapType _old_snap_type;
+ Editing::SnapMode _old_snap_mode;
XMLNode* before_state;
};
@@ -724,17 +733,46 @@ public:
}
bool y_movement_matters () const {
- return false;
+ return true;
}
void setup_pointer_frame_offset ();
private:
TempoMarker* _marker;
+ ARDOUR::TempoSection* _real_section;
+
bool _copy;
+ bool _movable;
XMLNode* before_state;
};
+/** BBT Ruler drag */
+class BBTRulerDrag : public Drag
+{
+public:
+ BBTRulerDrag (Editor *, ArdourCanvas::Item *);
+
+ void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
+ void motion (GdkEvent *, bool);
+ void finished (GdkEvent *, bool);
+ void aborted (bool);
+
+ bool allow_vertical_autoscroll () const {
+ return false;
+ }
+
+ bool y_movement_matters () const {
+ return false;
+ }
+
+ void setup_pointer_frame_offset ();
+
+private:
+ double _pulse;
+ ARDOUR::TempoSection* _tempo;
+ XMLNode* before_state;
+};
/** Drag of the playhead cursor */
class CursorDrag : public Drag
diff --git a/gtk2_ardour/editor_export_audio.cc b/gtk2_ardour/editor_export_audio.cc
index 2bd607f..c1def2b 100644
--- a/gtk2_ardour/editor_export_audio.cc
+++ b/gtk2_ardour/editor_export_audio.cc
@@ -53,7 +53,7 @@
#include "time_axis_view.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -125,9 +125,7 @@ Editor::process_midi_export_dialog (MidiExportDialog& dialog, boost::shared_ptr<
::g_unlink (path.c_str());
}
- (void) midi_region->clone (path);
-
- return true;
+ return midi_region->do_export (path);
}
/** Export the first selected region */
diff --git a/gtk2_ardour/editor_group_tabs.cc b/gtk2_ardour/editor_group_tabs.cc
index 48fe9e2..04f8854 100644
--- a/gtk2_ardour/editor_group_tabs.cc
+++ b/gtk2_ardour/editor_group_tabs.cc
@@ -32,7 +32,7 @@
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -192,8 +192,3 @@ EditorGroupTabs::selected_routes () const
return rl;
}
-void
-EditorGroupTabs::sync_order_keys ()
-{
- _editor->_routes->sync_order_keys_from_treeview ();
-}
diff --git a/gtk2_ardour/editor_group_tabs.h b/gtk2_ardour/editor_group_tabs.h
index 7377911..61e0ecf 100644
--- a/gtk2_ardour/editor_group_tabs.h
+++ b/gtk2_ardour/editor_group_tabs.h
@@ -37,5 +37,4 @@ private:
}
void add_menu_items (Gtk::Menu *, ARDOUR::RouteGroup *);
ARDOUR::RouteList selected_routes () const;
- void sync_order_keys ();
};
diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h
index 743a93b..79a94df 100644
--- a/gtk2_ardour/editor_items.h
+++ b/gtk2_ardour/editor_items.h
@@ -36,6 +36,7 @@ enum ItemType {
GainLineItem,
AutomationLineItem,
MeterMarkerItem,
+ TempoCurveItem,
TempoMarkerItem,
MeterBarItem,
TempoBarItem,
diff --git a/gtk2_ardour/editor_keys.cc b/gtk2_ardour/editor_keys.cc
index 8b1e46e..e1562db 100644
--- a/gtk2_ardour/editor_keys.cc
+++ b/gtk2_ardour/editor_keys.cc
@@ -32,7 +32,7 @@
#include "selection.h"
#include "time_axis_view.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -105,5 +105,5 @@ Editor::keyboard_selection_begin (Editing::EditIgnoreOption ign)
void
Editor::keyboard_paste ()
{
- paste (1);
+ paste (1, false);
}
diff --git a/gtk2_ardour/editor_locations.cc b/gtk2_ardour/editor_locations.cc
index 03509ac..0c0066c 100644
--- a/gtk2_ardour/editor_locations.cc
+++ b/gtk2_ardour/editor_locations.cc
@@ -20,7 +20,7 @@
#include "editor_locations.h"
#include "location_ui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace Gtk;
diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc
index 201631e..d204049 100644
--- a/gtk2_ardour/editor_markers.cc
+++ b/gtk2_ardour/editor_markers.cc
@@ -40,7 +40,7 @@
#include "prompter.h"
#include "editor_drag.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -808,15 +808,20 @@ Editor::tempo_or_meter_marker_context_menu (GdkEventButton* ev, ArdourCanvas::It
if (mm) {
can_remove = mm->meter().movable ();
+ delete meter_marker_menu;
+ build_meter_marker_menu (mm, can_remove);
+ meter_marker_menu->popup (1, ev->time);
} else if (tm) {
- can_remove = tm->tempo().movable ();
+ if (!tm->tempo().active()) {
+ return;
+ }
+ can_remove = tm->tempo().movable() && !tm->tempo().locked_to_meter();
+ delete tempo_marker_menu;
+ build_tempo_marker_menu (tm, can_remove);
+ tempo_marker_menu->popup (1, ev->time);
} else {
return;
}
-
- delete tempo_or_meter_marker_menu;
- build_tempo_or_meter_marker_menu (can_remove);
- tempo_or_meter_marker_menu->popup (1, ev->time);
}
void
@@ -943,9 +948,7 @@ Editor::build_range_marker_menu (bool loop_or_punch, bool session)
items.push_back (MenuElem (_("Loop Range"), sigc::mem_fun(*this, &Editor::marker_menu_loop_range)));
items.push_back (MenuElem (_("Set Marker from Playhead"), sigc::mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
- if (!Profile->get_sae()) {
- items.push_back (MenuElem (_("Set Range from Selection"), sigc::bind (sigc::mem_fun(*this, &Editor::marker_menu_set_from_selection), false)));
- }
+ items.push_back (MenuElem (_("Set Range from Selection"), sigc::bind (sigc::mem_fun(*this, &Editor::marker_menu_set_from_selection), false)));
items.push_back (MenuElem (_("Zoom to Range"), sigc::mem_fun (*this, &Editor::marker_menu_zoom_to_range)));
@@ -968,19 +971,49 @@ Editor::build_range_marker_menu (bool loop_or_punch, bool session)
items.push_back (MenuElem (_("Separate Regions in Range"), sigc::mem_fun(*this, &Editor::marker_menu_separate_regions_using_location)));
items.push_back (MenuElem (_("Select All in Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_all_selectables_using_range)));
- if (!Profile->get_sae()) {
- items.push_back (MenuElem (_("Select Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_using_range)));
+ items.push_back (MenuElem (_("Select Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_using_range)));
+}
+
+void
+Editor::build_tempo_marker_menu (TempoMarker* loc, bool can_remove)
+{
+ using namespace Menu_Helpers;
+
+ tempo_marker_menu = new Menu;
+ MenuList& items = tempo_marker_menu->items();
+ tempo_marker_menu->set_name ("ArdourContextMenu");
+
+ if (loc->tempo().type() == TempoSection::Constant) {
+ items.push_back (MenuElem (_("Make Ramped"), sigc::mem_fun(*this, &Editor::toggle_tempo_type)));
+ } else {
+ items.push_back (MenuElem (_("Make Constant"), sigc::mem_fun(*this, &Editor::toggle_tempo_type)));
+ }
+
+ if (loc->tempo().position_lock_style() == AudioTime && can_remove) {
+ items.push_back (MenuElem (_("Lock to Music"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+ } else if (can_remove) {
+ items.push_back (MenuElem (_("Lock to Audio"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
}
+
+ items.push_back (MenuElem (_("Edit..."), sigc::mem_fun(*this, &Editor::marker_menu_edit)));
+ items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::marker_menu_remove)));
+ items.back().set_sensitive (can_remove);
}
void
-Editor::build_tempo_or_meter_marker_menu (bool can_remove)
+Editor::build_meter_marker_menu (MeterMarker* loc, bool can_remove)
{
using namespace Menu_Helpers;
- tempo_or_meter_marker_menu = new Menu;
- MenuList& items = tempo_or_meter_marker_menu->items();
- tempo_or_meter_marker_menu->set_name ("ArdourContextMenu");
+ meter_marker_menu = new Menu;
+ MenuList& items = meter_marker_menu->items();
+ meter_marker_menu->set_name ("ArdourContextMenu");
+
+ if (loc->meter().position_lock_style() == AudioTime && can_remove) {
+ items.push_back (MenuElem (_("Lock to Music"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+ } else if (can_remove) {
+ items.push_back (MenuElem (_("Lock to Audio"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+ }
items.push_back (MenuElem (_("Edit..."), sigc::mem_fun(*this, &Editor::marker_menu_edit)));
items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::marker_menu_remove)));
@@ -1348,6 +1381,75 @@ Editor::marker_menu_remove ()
}
void
+Editor::toggle_marker_lock_style ()
+{
+ MeterMarker* mm;
+ TempoMarker* tm;
+ dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
+
+ if (mm) {
+ begin_reversible_command (_("change meter lock style"));
+ XMLNode &before = _session->tempo_map().get_state();
+ MeterSection* msp = &mm->meter();
+
+ const Meter meter (msp->divisions_per_bar(), msp->note_divisor());
+ const Timecode::BBT_Time bbt (msp->bbt());
+ const framepos_t frame = msp->frame();
+ const PositionLockStyle pls = (msp->position_lock_style() == AudioTime) ? MusicTime : AudioTime;
+
+ _session->tempo_map().replace_meter (*msp, meter, bbt, frame, pls);
+
+ XMLNode &after = _session->tempo_map().get_state();
+ _session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+ commit_reversible_command ();
+ } else if (tm) {
+ TempoSection* tsp = &tm->tempo();
+
+ const Tempo tempo (tsp->beats_per_minute());
+ const double pulse = tsp->pulse();
+ const framepos_t frame = tsp->frame();
+ const TempoSection::Type type = tsp->type();
+ const PositionLockStyle pls = (tsp->position_lock_style() == AudioTime) ? MusicTime : AudioTime;
+
+ begin_reversible_command (_("change tempo lock style"));
+ XMLNode &before = _session->tempo_map().get_state();
+
+ _session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls);
+
+ XMLNode &after = _session->tempo_map().get_state();
+ _session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+ commit_reversible_command ();
+ }
+}
+
+void
+Editor::toggle_tempo_type ()
+{
+ TempoMarker* tm;
+ MeterMarker* mm;
+ dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
+
+ if (tm) {
+ TempoSection* tsp = &tm->tempo();
+
+ const Tempo tempo (tsp->beats_per_minute(), tsp->note_type());
+ const double pulse = tsp->pulse();
+ const framepos_t frame = tsp->frame();
+ const TempoSection::Type type = (tsp->type() == TempoSection::Ramp) ? TempoSection::Constant : TempoSection::Ramp;
+ const PositionLockStyle pls = tsp->position_lock_style();
+
+ begin_reversible_command (_("change tempo type"));
+ XMLNode &before = _session->tempo_map().get_state();
+
+ _session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls);
+
+ XMLNode &after = _session->tempo_map().get_state();
+ _session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+ commit_reversible_command ();
+ }
+}
+
+void
Editor::toggle_marker_menu_lock ()
{
ArdourMarker* marker;
diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc
index 9769d61..0c03483 100644
--- a/gtk2_ardour/editor_mixer.cc
+++ b/gtk2_ardour/editor_mixer.cc
@@ -30,6 +30,8 @@
#include "ardour/rc_configuration.h"
+#include "control_protocol/control_protocol.h"
+
#include "actions.h"
#include "ardour_ui.h"
#include "audio_time_axis.h"
@@ -44,7 +46,7 @@
#include "selection.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtkmm2ext;
@@ -78,11 +80,16 @@ Editor::show_editor_mixer (bool yn)
show_editor_mixer_when_tracks_arrive = false;
if (yn) {
- Glib::RefPtr<Gdk::Window> win = get_window ();
+ Gtk::Window* toplevel = current_toplevel();
+ Glib::RefPtr<Gdk::Window> win;
Glib::RefPtr<Gdk::Screen> screen;
+ if (toplevel) {
+ win = toplevel->get_window();
+ }
+
if (win) {
- screen = win->get_screen();
+ screen = win->get_screen();
} else {
screen = Gdk::Screen::get_default();
}
@@ -156,13 +163,13 @@ Editor::show_editor_mixer (bool yn)
}
}
-#ifdef GTKOSX
+#ifdef __APPLE__
/* XXX gtk problem here */
ensure_all_elements_drawn();
#endif
}
-#ifdef GTKOSX
+#ifdef __APPLE__
void
Editor::ensure_all_elements_drawn ()
{
@@ -174,13 +181,11 @@ Editor::ensure_all_elements_drawn ()
void
Editor::create_editor_mixer ()
{
- current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(),
- _session,
- false);
+ current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), _session, false);
current_mixer_strip->Hiding.connect (sigc::mem_fun(*this, &Editor::current_mixer_strip_hidden));
current_mixer_strip->WidthChanged.connect (sigc::mem_fun (*this, &Editor::mixer_strip_width_changed));
-#ifdef GTKOSX
+#ifdef __APPLE__
current_mixer_strip->WidthChanged.connect (sigc::mem_fun(*this, &Editor::ensure_all_elements_drawn));
#endif
current_mixer_strip->set_embedded (true);
@@ -194,21 +199,6 @@ Editor::set_selected_mixer_strip (TimeAxisView& view)
return;
}
- Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer"));
-
- if (act) {
- Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(act);
- if (!tact || !tact->get_active()) {
- /* not showing mixer strip presently */
- return;
- }
- }
-
- if (current_mixer_strip == 0) {
- create_editor_mixer ();
- }
-
-
// if this is an automation track, then we shold the mixer strip should
// show the parent
@@ -237,6 +227,26 @@ Editor::set_selected_mixer_strip (TimeAxisView& view)
}
}
+ /* Typically this is set by changing the TAV selection but if for any
+ reason we decide to show a different strip for some reason, make
+ sure that control surfaces can find it.
+ */
+ ARDOUR::ControlProtocol::set_first_selected_stripable (route);
+
+ Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer"));
+
+ if (act) {
+ Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(act);
+ if (!tact || !tact->get_active()) {
+ /* not showing mixer strip presently */
+ return;
+ }
+ }
+
+ if (current_mixer_strip == 0) {
+ create_editor_mixer ();
+ }
+
if (current_mixer_strip->route() == route) {
return;
}
@@ -268,7 +278,7 @@ Editor::maybe_add_mixer_strip_width (XMLNode& node)
void
Editor::mixer_strip_width_changed ()
{
-#ifdef GTKOSX
+#ifdef __APPLE__
ensure_all_elements_drawn ();
#endif
@@ -291,12 +301,12 @@ Editor::follow_mixer_selection ()
_following_mixer_selection = true;
selection->block_tracks_changed (true);
- RouteUISelection& s (Mixer_UI::instance()->selection().routes);
+ AxisViewSelection& s (Mixer_UI::instance()->selection().axes);
selection->clear_tracks ();
- for (RouteUISelection::iterator i = s.begin(); i != s.end(); ++i) {
- TimeAxisView* tav = get_route_view_by_route_id ((*i)->route()->id());
+ for (AxisViewSelection::iterator i = s.begin(); i != s.end(); ++i) {
+ TimeAxisView* tav = axis_view_from_stripable ((*i)->stripable());
if (tav) {
selection->add (tav);
}
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index a7b7059..8a8a951 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -34,7 +34,6 @@
#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/utils.h"
-#include "gtkmm2ext/tearoff.h"
#include "canvas/canvas.h"
@@ -72,7 +71,7 @@
#include "verbose_cursor.h"
#include "note.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -685,7 +684,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
new TempoMarkerDrag (
this,
item,
- Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+ Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier)
),
event
);
@@ -698,7 +697,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
new MeterMarkerDrag (
this,
item,
- Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+ Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier)
),
event
);
@@ -712,13 +711,17 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case MarkerBarItem:
case TempoBarItem:
+ case TempoCurveItem:
case MeterBarItem:
case TimecodeRulerItem:
case SamplesRulerItem:
case MinsecRulerItem:
case BBTRulerItem:
- if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
+ if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)
+ && !Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) {
_drags->set (new CursorDrag (this, *playhead_cursor, false), event);
+ } else if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) {
+ _drags->set (new BBTRulerDrag (this, item), event);
}
return true;
break;
@@ -1034,7 +1037,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
if (!prev) {
_drags->set (new RegionCreateDrag (this, item, parent), event);
} else {
- prev->set_length (t - prev->position ());
+ prev->set_length (t - prev->position (), get_grid_music_divisions (event->button.state));
}
}
} else {
@@ -1334,7 +1337,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case RegionItem:
show_region_properties ();
break;
-
case TempoMarkerItem: {
ArdourMarker* marker;
TempoMarker* tempo_marker;
@@ -1439,6 +1441,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case TransportMarkerBarItem:
case CdMarkerBarItem:
case TempoBarItem:
+ case TempoCurveItem:
case MeterBarItem:
case VideoBarItem:
case TimecodeRulerItem:
@@ -1548,8 +1551,8 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
mouse_add_new_marker (where, true);
}
return true;
-
case TempoBarItem:
+ case TempoCurveItem:
if (!_dragging_playhead) {
snap_to_with_modifier (where, event);
mouse_add_new_tempo_event (where);
@@ -2079,8 +2082,12 @@ Editor::edit_notes (MidiRegionView* mrv)
void
Editor::note_edit_done (int r, EditNoteDialog* d)
{
+ begin_reversible_command (_("edit note(s)"));
+
d->done (r);
delete d;
+
+ commit_reversible_command();
}
void
@@ -2093,7 +2100,7 @@ Editor::visible_order_range (int* low, int* high) const
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
- if (!rtv->hidden()) {
+ if (rtv && !rtv->hidden()) {
if (*high < rtv->order()) {
*high = rtv->order ();
@@ -2306,7 +2313,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos)
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&rv->get_time_axis_view());
- if (rtv == 0 || !rtv->is_track()) {
+ if (!rtv || !rtv->is_track()) {
return;
}
@@ -2457,7 +2464,7 @@ Editor::escape ()
selection->clear ();
}
- reset_focus ();
+ reset_focus (&contents());
}
/** Update _join_object_range_state which indicate whether we are over the top
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 115d37a..c208e55 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -42,6 +42,7 @@
#include "ardour/audio_track.h"
#include "ardour/audioregion.h"
+#include "ardour/boost_debug.h"
#include "ardour/dB.h"
#include "ardour/location.h"
#include "ardour/midi_region.h"
@@ -101,7 +102,7 @@
#include "transform_dialog.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -150,7 +151,7 @@ Editor::redo (uint32_t n)
}
void
-Editor::split_regions_at (framepos_t where, RegionSelection& regions)
+Editor::split_regions_at (framepos_t where, RegionSelection& regions, const int32_t sub_num)
{
bool frozen = false;
@@ -225,7 +226,7 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions)
if (pl) {
pl->clear_changes ();
- pl->split_region ((*a)->region(), where);
+ pl->split_region ((*a)->region(), where, sub_num);
_session->add_command (new StatefulDiffCommand (pl));
}
@@ -432,6 +433,9 @@ Editor::nudge_forward (bool next, bool force_playhead)
} else {
loc->set_end (max_framepos);
}
+ if (loc->is_session_range()) {
+ _session->set_end_is_free (false);
+ }
}
if (!in_command) {
begin_reversible_command (_("nudge location forward"));
@@ -523,6 +527,9 @@ Editor::nudge_backward (bool next, bool force_playhead)
} else {
loc->set_end (loc->length());
}
+ if (loc->is_session_range()) {
+ _session->set_end_is_free (false);
+ }
}
if (!in_command) {
begin_reversible_command (_("nudge location forward"));
@@ -1921,7 +1928,7 @@ Editor::temporal_zoom_region (bool both_axes)
bool
-Editor::get_selection_extents ( framepos_t &start, framepos_t &end )
+Editor::get_selection_extents (framepos_t &start, framepos_t &end) const
{
start = max_framepos;
end = 0;
@@ -2232,6 +2239,8 @@ Editor::set_session_end_from_playhead ()
commit_reversible_command ();
}
+
+ _session->set_end_is_free (false);
}
void
@@ -2573,7 +2582,7 @@ Editor::play_from_edit_point_and_return ()
void
Editor::play_selection ()
{
- framepos_t start, end;
+ framepos_t start, end;
if (!get_selection_extents ( start, end))
return;
@@ -2782,7 +2791,7 @@ Editor::rename_region ()
return;
}
- ArdourDialog d (*this, _("Rename Region"), true, false);
+ ArdourDialog d (_("Rename Region"), true, false);
Entry entry;
Label label (_("New name:"));
HBox hbox;
@@ -3042,62 +3051,63 @@ Editor::separate_regions_between (const TimeSelection& ts)
for (TrackSelection::iterator i = tmptracks.begin(); i != tmptracks.end(); ++i) {
- RouteTimeAxisView* rtv;
-
- if ((rtv = dynamic_cast<RouteTimeAxisView*> ((*i))) != 0) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> ((*i));
- if (rtv->is_track()) {
+ if (!rtv) {
+ continue;
+ }
- /* no edits to destructive tracks */
+ if (!rtv->is_track()) {
+ continue;
+ }
- if (rtv->track()->destructive()) {
- continue;
- }
+ /* no edits to destructive tracks */
- if ((playlist = rtv->playlist()) != 0) {
+ if (rtv->track()->destructive()) {
+ continue;
+ }
- playlist->clear_changes ();
+ if ((playlist = rtv->playlist()) != 0) {
- /* XXX need to consider musical time selections here at some point */
+ playlist->clear_changes ();
- double speed = rtv->track()->speed();
+ /* XXX need to consider musical time selections here at some point */
+ double speed = rtv->track()->speed();
- for (list<AudioRange>::const_iterator t = ts.begin(); t != ts.end(); ++t) {
+ for (list<AudioRange>::const_iterator t = ts.begin(); t != ts.end(); ++t) {
- sigc::connection c = rtv->view()->RegionViewAdded.connect (
- sigc::mem_fun(*this, &Editor::collect_new_region_view));
+ sigc::connection c = rtv->view()->RegionViewAdded.connect (
+ sigc::mem_fun(*this, &Editor::collect_new_region_view));
- latest_regionviews.clear ();
+ latest_regionviews.clear ();
- playlist->partition ((framepos_t)((*t).start * speed),
- (framepos_t)((*t).end * speed), false);
+ playlist->partition ((framepos_t)((*t).start * speed),
+ (framepos_t)((*t).end * speed), false);
- c.disconnect ();
+ c.disconnect ();
- if (!latest_regionviews.empty()) {
+ if (!latest_regionviews.empty()) {
- rtv->view()->foreach_regionview (sigc::bind (
- sigc::ptr_fun (add_if_covered),
- &(*t), &new_selection));
+ rtv->view()->foreach_regionview (sigc::bind (
+ sigc::ptr_fun (add_if_covered),
+ &(*t), &new_selection));
- if (!in_command) {
- begin_reversible_command (_("separate"));
- in_command = true;
- }
+ if (!in_command) {
+ begin_reversible_command (_("separate"));
+ in_command = true;
+ }
- /* pick up changes to existing regions */
+ /* pick up changes to existing regions */
- vector<Command*> cmds;
- playlist->rdiff (cmds);
- _session->add_commands (cmds);
+ vector<Command*> cmds;
+ playlist->rdiff (cmds);
+ _session->add_commands (cmds);
- /* pick up changes to the playlist itself (adds/removes)
- */
+ /* pick up changes to the playlist itself (adds/removes)
+ */
- _session->add_command(new StatefulDiffCommand (playlist));
- }
- }
+ _session->add_command(new StatefulDiffCommand (playlist));
}
}
}
@@ -3217,7 +3227,7 @@ Editor::separate_under_selected_regions ()
if (!playlist) {
// is this check necessary?
- continue;
+ continue;
}
vector<PlaylistState>::iterator i;
@@ -3292,17 +3302,18 @@ Editor::crop_region_to (framepos_t start, framepos_t end)
for (TrackSelection::iterator i = ts.begin(); i != ts.end(); ++i) {
- RouteTimeAxisView* rtv;
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> ((*i));
- if ((rtv = dynamic_cast<RouteTimeAxisView*> ((*i))) != 0) {
+ if (!rtv) {
+ continue;
+ }
- boost::shared_ptr<Track> t = rtv->track();
+ boost::shared_ptr<Track> t = rtv->track();
- if (t != 0 && ! t->destructive()) {
+ if (t != 0 && ! t->destructive()) {
- if ((playlist = rtv->playlist()) != 0) {
- playlists.push_back (playlist);
- }
+ if ((playlist = rtv->playlist()) != 0) {
+ playlists.push_back (playlist);
}
}
}
@@ -3391,7 +3402,7 @@ Editor::region_fill_track ()
sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
framepos_t const position = end_frame + (r->first_frame() - start_frame + 1);
- playlist = (*i)->region()->playlist();
+ playlist = (*i)->region()->playlist();
playlist->clear_changes ();
playlist->duplicate_until (r, position, gap, end);
_session->add_command(new StatefulDiffCommand (playlist));
@@ -3917,6 +3928,7 @@ Editor::freeze_route ()
gtk_main_iteration ();
}
+ pthread_join (itt.thread, 0);
current_interthread_info = 0;
}
@@ -3955,9 +3967,9 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) {
- RouteTimeAxisView* rtv;
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
- if ((rtv = dynamic_cast<RouteTimeAxisView*> (*i)) == 0) {
+ if (!rtv) {
continue;
}
@@ -4166,6 +4178,7 @@ Editor::cut_copy (CutCopyOp op)
}
}
+
struct AutomationRecord {
AutomationRecord () : state (0) , line(NULL) {}
AutomationRecord (XMLNode* s, const AutomationLine* l) : state (s) , line (l) {}
@@ -4174,7 +4187,11 @@ struct AutomationRecord {
const AutomationLine* line; ///< line this came from
boost::shared_ptr<Evoral::ControlList> copy; ///< copied events for the cut buffer
};
-
+struct PointsSelectionPositionSorter {
+ bool operator() (ControlPoint* a, ControlPoint* b) {
+ return (*(a->model()))->when < (*(b->model()))->when;
+ }
+};
/** Cut, copy or clear selected automation points.
* @param op Operation (Cut, Copy or Clear)
*/
@@ -4192,9 +4209,12 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
typedef std::map<boost::shared_ptr<AutomationList>, AutomationRecord> Lists;
Lists lists;
+ /* user could select points in any order */
+ selection->points.sort(PointsSelectionPositionSorter ());
+
/* Go through all selected points, making an AutomationRecord for each distinct AutomationList */
- for (PointSelection::iterator i = selection->points.begin(); i != selection->points.end(); ++i) {
- const AutomationLine& line = (*i)->line();
+ for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
+ const AutomationLine& line = (*sel_point)->line();
const boost::shared_ptr<AutomationList> al = line.the_list();
if (lists.find (al) == lists.end ()) {
/* We haven't seen this list yet, so make a record for it. This includes
@@ -4214,17 +4234,17 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
/* Add all selected points to the relevant copy ControlLists */
framepos_t start = std::numeric_limits<framepos_t>::max();
- for (PointSelection::iterator i = selection->points.begin(); i != selection->points.end(); ++i) {
- boost::shared_ptr<AutomationList> al = (*i)->line().the_list();
- AutomationList::const_iterator j = (*i)->model();
+ for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
+ boost::shared_ptr<AutomationList> al = (*sel_point)->line().the_list();
+ AutomationList::const_iterator ctrl_evt = (*sel_point)->model ();
- lists[al].copy->fast_simple_add ((*j)->when, (*j)->value);
+ lists[al].copy->fast_simple_add ((*ctrl_evt)->when, (*ctrl_evt)->value);
if (midi) {
/* Update earliest MIDI start time in beats */
- earliest = std::min(earliest, Evoral::Beats((*j)->when));
+ earliest = std::min(earliest, Evoral::Beats((*ctrl_evt)->when));
} else {
/* Update earliest session start time in frames */
- start = std::min(start, (*i)->line().session_position(j));
+ start = std::min(start, (*sel_point)->line().session_position(ctrl_evt));
}
}
@@ -4247,12 +4267,13 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
start time, so relative ordering between points is preserved
when copying from several lists and the paste starts at the
earliest copied piece of data. */
- for (AutomationList::iterator j = i->second.copy->begin(); j != i->second.copy->end(); ++j) {
- (*j)->when -= line_offset;
+ boost::shared_ptr<Evoral::ControlList> &al_cpy = i->second.copy;
+ for (AutomationList::iterator ctrl_evt = al_cpy->begin(); ctrl_evt != al_cpy->end(); ++ctrl_evt) {
+ (*ctrl_evt)->when -= line_offset;
}
/* And add it to the cut buffer */
- cut_buffer->add (i->second.copy);
+ cut_buffer->add (al_cpy);
}
}
@@ -4264,9 +4285,22 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
}
/* Remove each selected point from its AutomationList */
- for (PointSelection::iterator i = selection->points.begin(); i != selection->points.end(); ++i) {
- boost::shared_ptr<AutomationList> al = (*i)->line().the_list();
- al->erase ((*i)->model ());
+ for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
+ AutomationLine& line = (*sel_point)->line ();
+ boost::shared_ptr<AutomationList> al = line.the_list();
+
+ bool erase = true;
+
+ if (dynamic_cast<AudioRegionGainLine*> (&line)) {
+ /* removing of first and last gain point in region gain lines is prohibited*/
+ if (line.is_last_point (*(*sel_point)) || line.is_first_point (*(*sel_point))) {
+ erase = false;
+ }
+ }
+
+ if(erase) {
+ al->erase ((*sel_point)->model ());
+ }
}
/* Thaw the lists and add undo records for them */
@@ -4382,7 +4416,7 @@ Editor::remove_selected_regions ()
if (!playlist) {
// is this check necessary?
- continue;
+ continue;
}
/* get_regions_from_selection_and_entered() guarantees that
@@ -4567,7 +4601,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs)
list<boost::shared_ptr<Playlist> > foo;
- /* the pmap is in the same order as the tracks in which selected regions occured */
+ /* the pmap is in the same order as the tracks in which selected regions occurred */
for (vector<PlaylistMapping>::iterator i = pmap.begin(); i != pmap.end(); ++i) {
if ((*i).pl) {
@@ -4631,7 +4665,7 @@ Editor::paste (float times, bool from_context)
{
DEBUG_TRACE (DEBUG::CutNPaste, "paste to preferred edit pos\n");
- paste_internal (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), times);
+ paste_internal (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), times, get_grid_music_divisions (0));
}
void
@@ -4645,11 +4679,11 @@ Editor::mouse_paste ()
}
snap_to (where);
- paste_internal (where, 1);
+ paste_internal (where, 1, get_grid_music_divisions (0));
}
void
-Editor::paste_internal (framepos_t position, float times)
+Editor::paste_internal (framepos_t position, float times, const int32_t sub_num)
{
DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("apparent paste position is %1\n", position));
@@ -4742,7 +4776,7 @@ Editor::paste_internal (framepos_t position, float times)
"greedy" paste from one automation type to another. */
PasteContext ctx(paste_count, times, ItemCounts(), true);
- ts.front()->paste (position, *cut_buffer, ctx);
+ ts.front()->paste (position, *cut_buffer, ctx, sub_num);
} else {
@@ -4750,7 +4784,7 @@ Editor::paste_internal (framepos_t position, float times)
PasteContext ctx(paste_count, times, ItemCounts(), false);
for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) {
- (*i)->paste (position, *cut_buffer, ctx);
+ (*i)->paste (position, *cut_buffer, ctx, sub_num);
}
}
@@ -4786,7 +4820,7 @@ Editor::duplicate_some_regions (RegionSelection& regions, float times)
sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
framepos_t const position = end_frame + (r->first_frame() - start_frame + 1);
- playlist = (*i)->region()->playlist();
+ playlist = (*i)->region()->playlist();
playlist->clear_changes ();
playlist->duplicate (r, position, gap, times);
_session->add_command(new StatefulDiffCommand (playlist));
@@ -5160,12 +5194,13 @@ Editor::strip_region_silence ()
StripSilenceDialog d (_session, audio_only);
int const r = d.run ();
- d.drop_rects ();
+ d.drop_rects ();
- if (r == Gtk::RESPONSE_OK) {
- ARDOUR::AudioIntervalMap silences;
- d.silences (silences);
+ if (r == Gtk::RESPONSE_OK) {
+ ARDOUR::AudioIntervalMap silences;
+ d.silences (silences);
StripSilence s (*_session, silences, d.fade_length());
+
apply_filter (s, _("strip silence"), &d);
}
}
@@ -5440,6 +5475,11 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
playlist->clear_changes ();
playlist->clear_owned_changes ();
+ if (!in_command) {
+ begin_reversible_command (command);
+ in_command = true;
+ }
+
if (filter.results.empty ()) {
/* no regions returned; remove the old one */
@@ -5460,14 +5500,10 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
}
}
+
/* We might have removed regions, which alters other regions' layering_index,
so we need to do a recursive diff here.
*/
-
- if (!in_command) {
- begin_reversible_command (command);
- in_command = true;
- }
vector<Command*> cmds;
playlist->rdiff (cmds);
_session->add_commands (cmds);
@@ -5695,11 +5731,11 @@ Editor::toggle_record_enable ()
continue;
if (first) {
- new_state = !rtav->track()->record_enabled();
+ new_state = !rtav->track()->rec_enable_control()->get_value();
first = false;
}
- rtav->track()->set_record_enabled (new_state, Controllable::UseGroup);
+ rtav->track()->rec_enable_control()->set_value (new_state, Controllable::UseGroup);
}
}
@@ -5708,7 +5744,7 @@ Editor::toggle_solo ()
{
bool new_state = false;
bool first = true;
- boost::shared_ptr<RouteList> rl (new RouteList);
+ boost::shared_ptr<ControlList> cl (new ControlList);
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView *>(*i);
@@ -5722,10 +5758,10 @@ Editor::toggle_solo ()
first = false;
}
- rl->push_back (rtav->route());
+ cl->push_back (rtav->route()->solo_control());
}
- _session->set_solo (rl, new_state, Session::rt_cleanup, Controllable::UseGroup);
+ _session->set_controls (cl, new_state ? 1.0 : 0.0, Controllable::UseGroup);
}
void
@@ -5750,7 +5786,7 @@ Editor::toggle_mute ()
rl->push_back (rtav->route());
}
- _session->set_mute (rl, new_state, Session::rt_cleanup, Controllable::UseGroup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), new_state, Controllable::UseGroup);
}
void
@@ -6145,16 +6181,14 @@ Editor::split_region ()
return;
}
- split_regions_at (where, rs);
+ if (snap_musical()) {
+ split_regions_at (where, rs, get_grid_music_divisions (0));
+ } else {
+ split_regions_at (where, rs, 0);
+ }
}
}
-struct EditorOrderRouteSorter {
- bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
- return a->order_key () < b->order_key ();
- }
-};
-
void
Editor::select_next_route()
{
@@ -6168,6 +6202,7 @@ Editor::select_next_route()
RouteUI *rui;
do {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+
if (*i == current) {
++i;
if (i != track_views.end()) {
@@ -6179,10 +6214,12 @@ Editor::select_next_route()
break;
}
}
+
rui = dynamic_cast<RouteUI *>(current);
- } while ( current->hidden() || (rui != NULL && !rui->route()->active()));
- selection->set(current);
+ } while (current->hidden() || (rui == NULL) || !rui->route()->active());
+
+ selection->set (current);
ensure_time_axis_view_is_visible (*current, false);
}
@@ -6200,6 +6237,7 @@ Editor::select_prev_route()
RouteUI *rui;
do {
for (TrackViewList::reverse_iterator i = track_views.rbegin(); i != track_views.rend(); ++i) {
+
if (*i == current) {
++i;
if (i != track_views.rend()) {
@@ -6211,7 +6249,8 @@ Editor::select_prev_route()
}
}
rui = dynamic_cast<RouteUI *>(current);
- } while ( current->hidden() || (rui != NULL && !rui->route()->active()));
+
+ } while (current->hidden() || (rui == NULL) || !rui->route()->active());
selection->set (current);
@@ -6278,11 +6317,11 @@ Editor::set_session_extents_from_selection ()
Location* loc;
if ((loc = _session->locations()->session_range_location()) == 0) {
- _session->set_session_extents ( start, end ); // this will create a new session range; no need for UNDO
+ _session->set_session_extents (start, end); // this will create a new session range; no need for UNDO
} else {
XMLNode &before = loc->get_state();
- _session->set_session_extents ( start, end );
+ _session->set_session_extents (start, end);
XMLNode &after = loc->get_state();
@@ -6292,6 +6331,8 @@ Editor::set_session_extents_from_selection ()
commit_reversible_command ();
}
+
+ _session->set_end_is_free (false);
}
void
@@ -6472,11 +6513,13 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
{
framepos_t length = end - start;
- const Meter& m (_session->tempo_map().meter_at (start));
+ const Meter& m (_session->tempo_map().meter_at_frame (start));
/* length = 1 bar */
- /* now we want frames per beat.
+ /* We're going to deliver a constant tempo here,
+ so we can use frames per beat to determine length.
+ now we want frames per beat.
we have frames per bar, and beats per bar, so ...
*/
@@ -6495,7 +6538,7 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
*/
- const TempoSection& t (_session->tempo_map().tempo_section_at (start));
+ const TempoSection& t (_session->tempo_map().tempo_section_at_frame (start));
bool do_global = false;
@@ -6546,9 +6589,8 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
} else if (t.frame() == start) {
_session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type());
} else {
- Timecode::BBT_Time bbt;
- _session->tempo_map().bbt_time (start, bbt);
- _session->tempo_map().add_tempo (Tempo (beats_per_minute, t.note_type()), bbt);
+ const Tempo tempo (beats_per_minute, t.note_type());
+ _session->tempo_map().add_tempo (tempo, 0.0, start, TempoSection::Constant, AudioTime);
}
XMLNode& after (_session->tempo_map().get_state());
@@ -6579,7 +6621,8 @@ Editor::split_region_at_transients ()
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> ((*i)->region());
- if (ar && (ar->get_transients (positions) == 0)) {
+ if (ar) {
+ ar->transients (positions);
split_region_at_points ((*i)->region(), positions, true);
positions.clear ();
}
@@ -6608,7 +6651,6 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
return;
}
-
if (positions.size() > 20 && can_ferret) {
std::string msgstr = string_compose (_("You are about to split\n%1\ninto %2 pieces.\nThis could take a long time."), r->name(), positions.size() + 1);
MessageDialog msg (msgstr,
@@ -6661,27 +6703,28 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
framepos_t pos = 0;
+ framepos_t rstart = r->first_frame ();
+ framepos_t rend = r->last_frame ();
+
while (x != positions.end()) {
/* deal with positons that are out of scope of present region bounds */
- if (*x <= 0 || *x > r->length()) {
+ if (*x <= rstart || *x > rend) {
++x;
continue;
}
- /* file start = original start + how far we from the initial position ?
- */
+ /* file start = original start + how far we from the initial position ? */
framepos_t file_start = r->start() + pos;
- /* length = next position - current position
- */
+ /* length = next position - current position */
- framepos_t len = (*x) - pos;
+ framepos_t len = (*x) - pos - rstart;
/* XXX we do we really want to allow even single-sample regions?
- shouldn't we have some kind of lower limit on region size?
- */
+ * shouldn't we have some kind of lower limit on region size?
+ */
if (len <= 0) {
break;
@@ -6701,14 +6744,15 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
plist.add (ARDOUR::Properties::length, len);
plist.add (ARDOUR::Properties::name, new_name);
plist.add (ARDOUR::Properties::layer, 0);
+ // TODO set transients_offset
boost::shared_ptr<Region> nr = RegionFactory::create (r->sources(), plist, false);
/* because we set annouce to false, manually add the new region to the
- RegionFactory map
- */
+ * RegionFactory map
+ */
RegionFactory::map_add (nr);
- pl->add_region (nr, r->position() + pos);
+ pl->add_region (nr, rstart + pos);
if (select_new) {
new_regions.push_front(nr);
@@ -6778,8 +6822,7 @@ Editor::place_transient()
begin_reversible_command (_("place transient"));
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
- framepos_t position = (*r)->region()->position();
- (*r)->region()->add_transient(where - position);
+ (*r)->region()->add_transient(where);
}
commit_reversible_command ();
@@ -7095,6 +7138,7 @@ Editor::remove_tracks ()
bool
Editor::idle_remove_tracks ()
{
+ Session::StateProtector sp (_session);
_remove_tracks ();
return false; /* do not call again */
}
@@ -7198,12 +7242,17 @@ edit your ardour.rc file to set the\n\
}
{
- Session::StateProtector sp (_session);
DisplaySuspender ds;
+ boost::shared_ptr<RouteList> rl (new RouteList);
for (vector<boost::shared_ptr<Route> >::iterator x = routes.begin(); x != routes.end(); ++x) {
- _session->remove_route (*x);
+ rl->push_back (*x);
}
+ _session->remove_routes (rl);
}
+ /* TrackSelection and RouteList leave scope,
+ * destructors are called,
+ * diskstream drops references, save_state is called (again for every track)
+ */
}
void
@@ -7282,7 +7331,8 @@ Editor::insert_time (
(*i)->clear_owned_changes ();
if (opt == SplitIntersected) {
- (*i)->split (pos);
+ /* non musical split */
+ (*i)->split (pos, 0);
}
(*i)->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue);
@@ -7597,7 +7647,7 @@ Editor::fit_tracks (TrackViewList & tracks)
double first_y_pos = DBL_MAX;
if (h < TimeAxisView::preset_height (HeightSmall)) {
- MessageDialog msg (*this, _("There are too many tracks to fit in the current window"));
+ MessageDialog msg (_("There are too many tracks to fit in the current window"));
/* too small to be displayed */
return;
}
@@ -7881,7 +7931,7 @@ Editor::update_bring_in_message (Gtk::Label* label, uint32_t n, uint32_t total,
{
Timers::TimerSuspender t;
label->set_text (string_compose ("Copying %1, %2 of %3", name, n, total));
- Gtkmm2ext::UI::instance()->flush_pending ();
+ Gtkmm2ext::UI::instance()->flush_pending (1);
}
void
@@ -7901,7 +7951,7 @@ Editor::bring_all_sources_into_session ()
*/
Timers::TimerSuspender t;
- Gtkmm2ext::UI::instance()->flush_pending ();
+ Gtkmm2ext::UI::instance()->flush_pending (3);
cerr << " Do it\n";
diff --git a/gtk2_ardour/editor_pt_import.cc b/gtk2_ardour/editor_pt_import.cc
index 15723c3..2b659e0 100644
--- a/gtk2_ardour/editor_pt_import.cc
+++ b/gtk2_ardour/editor_pt_import.cc
@@ -60,7 +60,7 @@
#include "mouse_cursors.h"
#include "editor_cursors.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -121,6 +121,7 @@ Editor::do_ptimport (std::string ptpath,
vector<string> to_import;
string fullpath;
bool ok = false;
+ bool onefailed = false;
PTFFormat ptf;
framepos_t pos = -1;
@@ -165,9 +166,19 @@ Editor::do_ptimport (std::string ptpath,
ptfwavpair.push_back(p);
imported.push_back(import_status.sources.back());
+ } else {
+ onefailed = true;
}
}
+ if (onefailed) {
+ MessageDialog msg (_("Failed to load one or more of the audio files, but continuing to attempt import."));
+ msg.run ();
+ } else {
+ MessageDialog msg (_("Success! Import should complete soon."));
+ msg.run ();
+ }
+
for (vector<PTFFormat::region_t>::iterator a = ptf.regions.begin();
a != ptf.regions.end(); ++a) {
for (vector<ptflookup_t>::iterator p = ptfwavpair.begin();
@@ -233,12 +244,27 @@ Editor::do_ptimport (std::string ptpath,
} else {
// Put on a new track
DEBUG_TRACE (DEBUG::FileUtils, string_compose ("\twav(%1) reg(%2) new_tr(%3)\n", a->reg.wave.filename.c_str(), a->reg.index, nth));
- list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (1, 2, Normal, 0, 1));
+ list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (1, 2, 0, 1, string(), PresentationInfo::max_order, Normal));
if (at.empty()) {
return;
}
existing_track = at.back();
- existing_track->set_name (a->name);
+ std::string trackname;
+ try {
+ trackname = Glib::convert_with_fallback (a->name, "UTF-8", "UTF-8", "_");
+ } catch (Glib::ConvertError& err) {
+ trackname = string_compose ("Invalid %1", a->index);
+ }
+ // TODO legalize track name (no slashes, no colons)
+#if 0 // TODO -- "find_route_name" is currently private
+ /* generate a unique name by adding a number if needed */
+ uint32_t id = 0;
+ if (!_session->find_route_name (trackname.c_str (), id, trackname, false)) {
+ fatal << _("PTImport: UINT_MAX routes? impossible!") << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+#endif
+ existing_track->set_name (trackname);
boost::shared_ptr<Playlist> playlist = existing_track->playlist();
boost::shared_ptr<Region> copy (RegionFactory::create (r, true));
playlist->clear_changes ();
diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc
index d23648a..845e56f 100644
--- a/gtk2_ardour/editor_regions.cc
+++ b/gtk2_ardour/editor_regions.cc
@@ -52,7 +52,7 @@
#include "tooltips.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -84,6 +84,7 @@ EditorRegions::EditorRegions (Editor* e)
_display.set_size_request (100, -1);
_display.set_rules_hint (true);
_display.set_name ("EditGroupList");
+ _display.set_fixed_height_mode (true);
/* Try to prevent single mouse presses from initiating edits.
This relies on a hack in gtktreeview.c:gtk_treeview_button_press()
@@ -94,19 +95,62 @@ EditorRegions::EditorRegions (Editor* e)
_model->set_sort_func (0, sigc::mem_fun (*this, &EditorRegions::sorter));
_model->set_sort_column (0, SORT_ASCENDING);
- _display.set_model (_model);
-
- _display.append_column ("", _columns.name);
- _display.append_column ("", _columns.position);
- _display.append_column ("", _columns.end);
- _display.append_column ("", _columns.length);
- _display.append_column ("", _columns.sync);
- _display.append_column ("", _columns.fadein);
- _display.append_column ("", _columns.fadeout);
- _display.append_column ("", _columns.locked);
- _display.append_column ("", _columns.glued);
- _display.append_column ("", _columns.muted);
- _display.append_column ("", _columns.opaque);
+ /* column widths */
+ int bbt_width, sync_width, check_width, height;
+
+ Glib::RefPtr<Pango::Layout> layout = _display.create_pango_layout (X_("000|000|000"));
+ Gtkmm2ext::get_pixel_size (layout, bbt_width, height);
+
+ layout = _display.create_pango_layout (X_("Start "));
+ Gtkmm2ext::get_pixel_size (layout, sync_width, height);
+
+ check_width = 20;
+
+ TreeViewColumn* col_name = manage (new TreeViewColumn ("", _columns.name));
+ col_name->set_fixed_width (120);
+ col_name->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_position = manage (new TreeViewColumn ("", _columns.position));
+ col_position->set_fixed_width (bbt_width);
+ col_position->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_end = manage (new TreeViewColumn ("", _columns.end));
+ col_end->set_fixed_width (bbt_width);
+ col_end->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_length = manage (new TreeViewColumn ("", _columns.length));
+ col_length->set_fixed_width (bbt_width);
+ col_length->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_sync = manage (new TreeViewColumn ("", _columns.sync));
+ col_sync->set_fixed_width (sync_width);
+ col_sync->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_fadein = manage (new TreeViewColumn ("", _columns.fadein));
+ col_fadein->set_fixed_width (bbt_width);
+ col_fadein->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_fadeout = manage (new TreeViewColumn ("", _columns.fadeout));
+ col_fadeout->set_fixed_width (bbt_width);
+ col_fadeout->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_locked = manage (new TreeViewColumn ("", _columns.locked));
+ col_locked->set_fixed_width (check_width);
+ col_locked->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_glued = manage (new TreeViewColumn ("", _columns.glued));
+ col_glued->set_fixed_width (check_width);
+ col_glued->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_muted = manage (new TreeViewColumn ("", _columns.muted));
+ col_muted->set_fixed_width (check_width);
+ col_muted->set_sizing (TREE_VIEW_COLUMN_FIXED);
+ TreeViewColumn* col_opaque = manage (new TreeViewColumn ("", _columns.opaque));
+ col_opaque->set_fixed_width (check_width);
+ col_opaque->set_sizing (TREE_VIEW_COLUMN_FIXED);
+
+ _display.append_column (*col_name);
+ _display.append_column (*col_position);
+ _display.append_column (*col_end);
+ _display.append_column (*col_length);
+ _display.append_column (*col_sync);
+ _display.append_column (*col_fadein);
+ _display.append_column (*col_fadeout);
+ _display.append_column (*col_locked);
+ _display.append_column (*col_glued);
+ _display.append_column (*col_muted);
+ _display.append_column (*col_opaque);
TreeViewColumn* col;
Gtk::Label* l;
@@ -138,6 +182,7 @@ EditorRegions::EditorRegions (Editor* e)
col->set_alignment (ALIGN_CENTER);
}
}
+ _display.set_model (_model);
_display.set_headers_visible (true);
_display.set_rules_hint ();
@@ -379,15 +424,7 @@ EditorRegions::add_region (boost::shared_ptr<Region> region)
str = region->name();
}
- if (region->n_channels() > 1) {
- std::stringstream foo;
- foo << region->n_channels ();
- str += " [";
- str += foo.str();
- str += "]";
- }
-
- row[_columns.name] = str;
+ populate_row_name (region, row);
row[_columns.region] = region;
row[_columns.property_toggles_visible] = false;
@@ -446,8 +483,8 @@ EditorRegions::add_region (boost::shared_ptr<Region> region)
row[_columns.region] = region;
region_row_map.insert(pair<boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::RowReference>(region, TreeRowReference(_model, TreePath (row))) );
-
- populate_row(region, (*row));
+ PropertyChange pc;
+ populate_row(region, (*row), pc);
}
void
@@ -495,14 +532,13 @@ EditorRegions::region_changed (boost::shared_ptr<Region> r, const PropertyChange
our_interests.add (ARDOUR::Properties::fade_out_active);
if (what_changed.contains (our_interests)) {
-
if (last_row != 0) {
TreeModel::iterator j = _model->get_iter (last_row.get_path());
boost::shared_ptr<Region> c = (*j)[_columns.region];
if (c == r) {
- populate_row (r, (*j));
+ populate_row (r, (*j), what_changed);
if (what_changed.contains (ARDOUR::Properties::hidden)) {
redisplay ();
@@ -522,7 +558,7 @@ EditorRegions::region_changed (boost::shared_ptr<Region> r, const PropertyChange
boost::shared_ptr<Region> c = (*j)[_columns.region];
if (c == r) {
- populate_row (r, (*j));
+ populate_row (r, (*j), what_changed);
if (what_changed.contains (ARDOUR::Properties::hidden)) {
redisplay ();
@@ -661,9 +697,9 @@ EditorRegions::update_row (boost::shared_ptr<Region> region)
it = region_row_map.find (region);
if (it != region_row_map.end()){
-
+ PropertyChange c;
TreeModel::iterator j = _model->get_iter ((*it).second.get_path());
- populate_row(region, (*j));
+ populate_row(region, (*j), c);
}
}
@@ -683,7 +719,8 @@ EditorRegions::update_all_rows ()
boost::shared_ptr<Region> region = (*j)[_columns.region];
if (!region->automatic()) {
- populate_row(region, (*j));
+ PropertyChange c;
+ populate_row(region, (*j), c);
}
}
}
@@ -702,7 +739,7 @@ EditorRegions::format_position (framepos_t pos, char* buf, size_t bufsize, bool
switch (ARDOUR_UI::instance()->secondary_clock->mode ()) {
case AudioClock::BBT:
- _session->tempo_map().bbt_time (pos, bbt);
+ bbt = _session->tempo_map().bbt_at_frame (pos);
if (onoff) {
snprintf (buf, bufsize, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
} else {
@@ -750,26 +787,53 @@ EditorRegions::format_position (framepos_t pos, char* buf, size_t bufsize, bool
}
void
-EditorRegions::populate_row (boost::shared_ptr<Region> region, TreeModel::Row const &row)
+EditorRegions::populate_row (boost::shared_ptr<Region> region, TreeModel::Row const &row, PBD::PropertyChange const &what_changed)
{
boost::shared_ptr<AudioRegion> audioregion = boost::dynamic_pointer_cast<AudioRegion>(region);
//uint32_t used = _session->playlists->region_use_count (region);
/* Presently a region is only used once so let's save on the sequential scan to determine use count */
uint32_t used = 1;
- populate_row_position (region, row, used);
- populate_row_end (region, row, used);
- populate_row_sync (region, row, used);
- populate_row_fade_in (region, row, used, audioregion);
- populate_row_fade_out (region, row, used, audioregion);
- populate_row_locked (region, row, used);
- populate_row_glued (region, row, used);
- populate_row_muted (region, row, used);
- populate_row_opaque (region, row, used);
- populate_row_length (region, row);
- populate_row_source (region, row);
- populate_row_name (region, row);
- populate_row_used (region, row, used);
+ PropertyChange c;
+ const bool all = what_changed == c;
+
+ if (all || what_changed.contains (Properties::position)) {
+ populate_row_position (region, row, used);
+ }
+ if (all || what_changed.contains (Properties::start)) {
+ populate_row_sync (region, row, used);
+ }
+ if (all || what_changed.contains (Properties::fade_in)) {
+ populate_row_fade_in (region, row, used, audioregion);
+ }
+ if (all || what_changed.contains (Properties::fade_out)) {
+ populate_row_fade_out (region, row, used, audioregion);
+ }
+ if (all || what_changed.contains (Properties::locked)) {
+ populate_row_locked (region, row, used);
+ }
+ if (all || what_changed.contains (Properties::position_lock_style)) {
+ populate_row_glued (region, row, used);
+ }
+ if (all || what_changed.contains (Properties::muted)) {
+ populate_row_muted (region, row, used);
+ }
+ if (all || what_changed.contains (Properties::opaque)) {
+ populate_row_opaque (region, row, used);
+ }
+ if (all || what_changed.contains (Properties::length)) {
+ populate_row_end (region, row, used);
+ populate_row_length (region, row);
+ }
+ if (all) {
+ populate_row_source (region, row);
+ }
+ if (all || what_changed.contains (Properties::name)) {
+ populate_row_name (region, row);
+ }
+ if (all) {
+ populate_row_used (region, row, used);
+ }
}
#if 0
@@ -815,7 +879,15 @@ void
EditorRegions::populate_row_length (boost::shared_ptr<Region> region, TreeModel::Row const &row)
{
char buf[16];
- format_position (region->length(), buf, sizeof (buf));
+
+ if (ARDOUR_UI::instance()->secondary_clock->mode () == AudioClock::BBT) {
+ TempoMap& map (_session->tempo_map());
+ Timecode::BBT_Time bbt = map.bbt_at_beat (map.beat_at_frame (region->last_frame()) - map.beat_at_frame (region->first_frame()));
+ snprintf (buf, sizeof (buf), "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+ } else {
+ format_position (region->length(), buf, sizeof (buf));
+ }
+
row[_columns.length] = buf;
}
@@ -1249,7 +1321,7 @@ EditorRegions::drag_data_received (const RefPtr<Gdk::DragContext>& context,
framepos_t pos = 0;
bool copy = ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY);
- if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files() || copy) {
+ if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
_editor->do_import (paths, Editing::ImportDistinctFiles, Editing::ImportAsRegion, SrcBest, pos);
} else {
_editor->do_embed (paths, Editing::ImportDistinctFiles, ImportAsRegion, pos);
@@ -1281,7 +1353,7 @@ EditorRegions::selection_filter (const RefPtr<TreeModel>& model, const TreeModel
}
void
-EditorRegions::name_editing_started (CellEditable* ce, const Glib::ustring&)
+EditorRegions::name_editing_started (CellEditable* ce, const Glib::ustring& path)
{
name_editable = ce;
@@ -1291,6 +1363,15 @@ EditorRegions::name_editing_started (CellEditable* ce, const Glib::ustring&)
if (e) {
e->set_name (X_("RegionNameEditorEntry"));
+
+ TreeIter iter;
+ if ((iter = _model->get_iter (path))) {
+ boost::shared_ptr<Region> region = (*iter)[_columns.region];
+
+ if(region) {
+ e->set_text(region->name());
+ }
+ }
}
}
@@ -1300,11 +1381,11 @@ EditorRegions::name_edit (const std::string& path, const std::string& new_text)
name_editable = 0;
boost::shared_ptr<Region> region;
- TreeIter iter;
+ TreeIter row_iter;
- if ((iter = _model->get_iter (path))) {
- region = (*iter)[_columns.region];
- (*iter)[_columns.name] = new_text;
+ if ((row_iter = _model->get_iter (path))) {
+ region = (*row_iter)[_columns.region];
+ (*row_iter)[_columns.name] = new_text;
}
/* now mapover everything */
@@ -1318,8 +1399,9 @@ EditorRegions::name_edit (const std::string& path, const std::string& new_text)
(*i)->region()->set_name (new_text);
}
}
- }
+ populate_row_name (region, (*row_iter));
+ }
}
/** @return Region that has been dragged out of the list, or 0 */
diff --git a/gtk2_ardour/editor_regions.h b/gtk2_ardour/editor_regions.h
index 76c742a..ae830b0 100644
--- a/gtk2_ardour/editor_regions.h
+++ b/gtk2_ardour/editor_regions.h
@@ -153,7 +153,7 @@ private:
void add_region (boost::shared_ptr<ARDOUR::Region>);
- void populate_row (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &);
+ void populate_row (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, PBD::PropertyChange const &);
void populate_row_used (boost::shared_ptr<ARDOUR::Region> region, Gtk::TreeModel::Row const& row, uint32_t used);
void populate_row_position (boost::shared_ptr<ARDOUR::Region> region, Gtk::TreeModel::Row const& row, uint32_t used);
void populate_row_end (boost::shared_ptr<ARDOUR::Region> region, Gtk::TreeModel::Row const& row, uint32_t used);
diff --git a/gtk2_ardour/editor_route_groups.cc b/gtk2_ardour/editor_route_groups.cc
index 8564435..3cfa1ee 100644
--- a/gtk2_ardour/editor_route_groups.cc
+++ b/gtk2_ardour/editor_route_groups.cc
@@ -48,7 +48,7 @@
#include "tooltips.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -380,21 +380,22 @@ EditorRouteGroups::row_change (const Gtk::TreeModel::Path&, const Gtk::TreeModel
plist.add (Properties::name, string ((*iter)[_columns.text]));
bool val = (*iter)[_columns.gain];
- plist.add (Properties::gain, val);
+ plist.add (Properties::group_gain, val);
val = (*iter)[_columns.gain_relative];
- plist.add (Properties::relative, val);
+ plist.add (Properties::group_relative, val);
val = (*iter)[_columns.mute];
- plist.add (Properties::mute, val);
+ plist.add (Properties::group_mute, val);
val = (*iter)[_columns.solo];
- plist.add (Properties::solo, val);
+ plist.add (Properties::group_solo, val);
val = (*iter)[_columns.record];
- plist.add (Properties::recenable, val);
+ plist.add (Properties::group_recenable, val);
val = (*iter)[_columns.monitoring];
- plist.add (Properties::monitoring, val);
+ plist.add (Properties::group_monitoring, val);
val = (*iter)[_columns.select];
- plist.add (Properties::select, val);
+ plist.add (Properties::group_select, val);
val = (*iter)[_columns.active_shared];
- plist.add (Properties::route_active, val);
+ plist.add (Properties::group_route_active, val);
+
val = (*iter)[_columns.active_state];
plist.add (Properties::active, val);
val = (*iter)[_columns.is_visible];
@@ -517,7 +518,6 @@ EditorRouteGroups::property_changed (RouteGroup* group, const PropertyChange&)
}
}
}
- _editor->_routes->reset_remote_control_ids ();
}
void
@@ -563,7 +563,7 @@ EditorRouteGroups::set_session (Session* s)
}
PBD::PropertyChange pc;
- pc.add (Properties::select);
+ pc.add (Properties::group_select);
pc.add (Properties::active);
groups_changed ();
@@ -572,9 +572,7 @@ EditorRouteGroups::set_session (Session* s)
void
EditorRouteGroups::run_new_group_dialog ()
{
- RouteList rl;
-
- return _editor->_group_tabs->run_new_group_dialog (rl);
+ return _editor->_group_tabs->run_new_group_dialog (0, false);
}
/** Called when a model row is deleted, but also when the model is
diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc
index e4a48db..6ea6a1d 100644
--- a/gtk2_ardour/editor_routes.cc
+++ b/gtk2_ardour/editor_routes.cc
@@ -28,9 +28,14 @@
#include "pbd/unwind.h"
#include "ardour/debug.h"
+#include "ardour/audio_track.h"
#include "ardour/midi_track.h"
#include "ardour/route.h"
#include "ardour/session.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/utils.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
#include "gtkmm2ext/cell_renderer_pixbuf_multi.h"
#include "gtkmm2ext/cell_renderer_pixbuf_toggle.h"
@@ -46,11 +51,13 @@
#include "keyboard.h"
#include "midi_time_axis.h"
#include "mixer_strip.h"
+#include "plugin_setup_dialog.h"
#include "route_sorter.h"
#include "tooltips.h"
+#include "vca_time_axis.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -108,6 +115,23 @@ EditorRoutes::EditorRoutes (Editor* e)
rec_state_column->set_expand(false);
rec_state_column->set_fixed_width(column_width);
+
+ // Record safe toggle
+ CellRendererPixbufMulti* rec_safe_renderer = manage (new CellRendererPixbufMulti ());
+
+ rec_safe_renderer->set_pixbuf (0, ::get_icon("rec-safe-disabled"));
+ rec_safe_renderer->set_pixbuf (1, ::get_icon("rec-safe-enabled"));
+ rec_safe_renderer->signal_changed().connect (sigc::mem_fun (*this, &EditorRoutes::on_tv_rec_safe_toggled));
+
+ TreeViewColumn* rec_safe_column = manage (new TreeViewColumn(_("RS"), *rec_safe_renderer));
+ rec_safe_column->add_attribute(rec_safe_renderer->property_state(), _columns.rec_safe);
+ rec_safe_column->add_attribute(rec_safe_renderer->property_visible(), _columns.is_track);
+ rec_safe_column->set_sizing(TREE_VIEW_COLUMN_FIXED);
+ rec_safe_column->set_alignment(ALIGN_CENTER);
+ rec_safe_column->set_expand(false);
+ rec_safe_column->set_fixed_width(column_width);
+
+
// MIDI Input Active
CellRendererPixbufMulti* input_active_col_renderer = manage (new CellRendererPixbufMulti());
@@ -195,6 +219,7 @@ EditorRoutes::EditorRoutes (Editor* e)
_display.append_column (*input_active_column);
_display.append_column (*rec_state_column);
+ _display.append_column (*rec_safe_column);
_display.append_column (*mute_state_column);
_display.append_column (*solo_state_column);
_display.append_column (*solo_isolate_state_column);
@@ -210,10 +235,11 @@ EditorRoutes::EditorRoutes (Editor* e)
{ 2, S_("Active|A"), _("Track/Bus active ?") },
{ 3, S_("MidiInput|I"), _("MIDI input enabled") },
{ 4, S_("Rec|R"), _("Record enabled") },
- { 5, S_("Mute|M"), _("Muted") },
- { 6, S_("Solo|S"), _("Soloed") },
- { 7, S_("SoloIso|SI"), _("Solo Isolated") },
- { 8, S_("SoloLock|SS"), _("Solo Safe (Locked)") },
+ { 5, S_("Rec|RS"), _("Record Safe") },
+ { 6, S_("Mute|M"), _("Muted") },
+ { 7, S_("Solo|S"), _("Soloed") },
+ { 8, S_("SoloIso|SI"), _("Solo Isolated") },
+ { 9, S_("SoloLock|SS"), _("Solo Safe (Locked)") },
{ -1, 0, 0 }
};
@@ -233,7 +259,7 @@ EditorRoutes::EditorRoutes (Editor* e)
_display.set_name (X_("EditGroupList"));
_display.set_rules_hint (true);
_display.set_size_request (100, -1);
- _display.add_object_drag (_columns.route.index(), "routes");
+ _display.add_object_drag (_columns.stripable.index(), "routes");
CellRendererText* name_cell = dynamic_cast<CellRendererText*> (_display.get_column_cell_renderer (_name_column));
@@ -291,7 +317,8 @@ EditorRoutes::EditorRoutes (Editor* e)
_display.set_enable_search (false);
- Route::SyncOrderKeys.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::sync_treeview_from_order_keys, this), gui_context());
+ Route::PluginSetup.connect_same_thread (*this, boost::bind (&EditorRoutes::plugin_setup, this, _1, _2, _3));
+ PresentationInfo::Change.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::sync_treeview_from_presentation_info, this), gui_context());
}
bool
@@ -393,17 +420,38 @@ EditorRoutes::on_input_active_changed (std::string const & path_string)
void
EditorRoutes::on_tv_rec_enable_changed (std::string const & path_string)
{
- DisplaySuspender ds;
// Get the model row that has been toggled.
Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string));
TimeAxisView* tv = row[_columns.tv];
RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*> (tv);
- if (rtv && rtv->track()) {
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (rtv->route());
- _session->set_record_enabled (rl, !rtv->track()->record_enabled(), Session::rt_cleanup);
+ if (!rtv) {
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> ac = rtv->route()->rec_enable_control();
+
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
+ }
+}
+
+void
+EditorRoutes::on_tv_rec_safe_toggled (std::string const & path_string)
+{
+ Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string));
+ TimeAxisView* tv = row[_columns.tv];
+ RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*> (tv);
+
+ if (!rtv) {
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> ac (rtv->route()->rec_safe_control());
+
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
}
}
@@ -416,10 +464,14 @@ EditorRoutes::on_tv_mute_enable_toggled (std::string const & path_string)
TimeAxisView *tv = row[_columns.tv];
RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*> (tv);
- if (rtv != 0) {
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (rtv->route());
- _session->set_mute (rl, !rtv->route()->muted(), Session::rt_cleanup);
+ if (!rtv) {
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> ac (rtv->route()->mute_control());
+
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
}
}
@@ -432,14 +484,14 @@ EditorRoutes::on_tv_solo_enable_toggled (std::string const & path_string)
TimeAxisView *tv = row[_columns.tv];
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
- if (rtv != 0) {
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (rtv->route());
- if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (rl, !rtv->route()->listening_via_monitor(), Session::rt_cleanup);
- } else {
- _session->set_solo (rl, !rtv->route()->self_soloed(), Session::rt_cleanup);
- }
+ if (!rtv) {
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> ac (rtv->route()->solo_control());
+
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
}
}
@@ -452,8 +504,14 @@ EditorRoutes::on_tv_solo_isolate_toggled (std::string const & path_string)
TimeAxisView *tv = row[_columns.tv];
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
- if (rtv) {
- rtv->route()->set_solo_isolated (!rtv->route()->solo_isolated(), Controllable::UseGroup);
+ if (!rtv) {
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> ac (rtv->route()->solo_isolate_control());
+
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
}
}
@@ -466,8 +524,14 @@ EditorRoutes::on_tv_solo_safe_toggled (std::string const & path_string)
TimeAxisView *tv = row[_columns.tv];
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
- if (rtv) {
- rtv->route()->set_solo_safe (!rtv->route()->solo_safe(), Controllable::UseGroup);
+ if (!rtv) {
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> ac (rtv->route()->solo_safe_control());
+
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
}
}
@@ -517,7 +581,6 @@ EditorRoutes::redisplay_real ()
for (n = 0, position = 0, i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[_columns.tv];
- boost::shared_ptr<Route> route = (*i)[_columns.route];
if (tv == 0) {
// just a "title" row
@@ -568,15 +631,18 @@ EditorRoutes::redisplay ()
}
// model deprecated g_atomic_int_exchange_and_add(, 1)
- g_atomic_int_inc(&_redisplay_active);
- if (!g_atomic_int_compare_and_exchange (&_redisplay_active, 1, 1)) {
+ g_atomic_int_inc(const_cast<gint*>(&_redisplay_active));
+ if (!g_atomic_int_compare_and_exchange (const_cast<gint*>(&_redisplay_active), 1, 1)) {
+ /* recursive re-display can happen if redisplay shows/hides a TrackView
+ * which has children and their display status changes as result.
+ */
return;
}
redisplay_real ();
- while (!g_atomic_int_compare_and_exchange (&_redisplay_active, 1, 0)) {
- g_atomic_int_set(&_redisplay_active, 1);
+ while (!g_atomic_int_compare_and_exchange (const_cast<gint*>(&_redisplay_active), 1, 0)) {
+ g_atomic_int_set(const_cast<gint*>(&_redisplay_active), 1);
redisplay_real ();
}
}
@@ -584,31 +650,35 @@ EditorRoutes::redisplay ()
void
EditorRoutes::row_deleted (Gtk::TreeModel::Path const &)
{
+ if (!_session || _session->deletion_in_progress()) {
+ return;
+ }
/* this happens as the second step of a DnD within the treeview, and
* when a route is actually removed. we don't differentiate between
* the two cases.
*
- * note that the sync_orders_keys() step may not actually change any
- * RID's (e.g. the last track may be removed, so all other tracks keep
- * the same RID), which means that no redisplay would happen. so we
- * have to force a redisplay.
+ * note that the sync_presentation_info_from_treeview() step may not
+ * actually change any presentation info (e.g. the last track may be
+ * removed, so all other tracks keep the same presentation info), which
+ * means that no redisplay would happen. so we have to force a
+ * redisplay.
*/
DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview row deleted\n");
DisplaySuspender ds;
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
void
EditorRoutes::reordered (TreeModel::Path const &, TreeModel::iterator const &, int* /*what*/)
{
- /* reordering implies that RID's will change, so sync_order_keys() will
- cause a redisplay.
+ /* reordering implies that RID's will change, so
+ sync_presentation_info_from_treeview() will cause a redisplay.
*/
DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview reordered\n");
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
void
@@ -641,82 +711,126 @@ EditorRoutes::active_changed (std::string const & path)
}
Gtk::TreeModel::Row row = *_model->get_iter (path);
- boost::shared_ptr<Route> route = row[_columns.route];
- bool const active = row[_columns.active];
- route->set_active (!active, this);
+ boost::shared_ptr<Stripable> stripable = row[_columns.stripable];
+ boost::shared_ptr<Route> route = boost::dynamic_pointer_cast<Route> (stripable);
+ if (route) {
+ bool const active = row[_columns.active];
+ route->set_active (!active, this);
+ }
}
void
-EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
+EditorRoutes::time_axis_views_added (list<TimeAxisView*> tavs)
{
PBD::Unwinder<bool> at (_adding_routes, true);
bool from_scratch = (_model->children().size() == 0);
Gtk::TreeModel::Children::iterator insert_iter = _model->children().end();
for (Gtk::TreeModel::Children::iterator it = _model->children().begin(); it != _model->children().end(); ++it) {
- boost::shared_ptr<Route> r = (*it)[_columns.route];
- if (r->order_key() == (routes.front()->route()->order_key() + routes.size())) {
+ boost::shared_ptr<Stripable> r = (*it)[_columns.stripable];
+
+ if (r->presentation_info().order() == (tavs.front()->stripable()->presentation_info().order() + tavs.size())) {
insert_iter = it;
break;
}
}
- DisplaySuspender ds;
-
_display.set_model (Glib::RefPtr<ListStore>());
- for (list<RouteTimeAxisView*>::iterator x = routes.begin(); x != routes.end(); ++x) {
+ for (list<TimeAxisView*>::iterator x = tavs.begin(); x != tavs.end(); ++x) {
- boost::shared_ptr<MidiTrack> midi_trk = boost::dynamic_pointer_cast<MidiTrack> ((*x)->route());
+ VCATimeAxisView* vtav = dynamic_cast<VCATimeAxisView*> (*x);
+ RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x);
TreeModel::Row row = *(_model->insert (insert_iter));
- row[_columns.text] = (*x)->route()->name();
- row[_columns.visible] = (*x)->marked_for_display();
- row[_columns.active] = (*x)->route()->active ();
- row[_columns.tv] = *x;
- row[_columns.route] = (*x)->route ();
- row[_columns.is_track] = (boost::dynamic_pointer_cast<Track> ((*x)->route()) != 0);
+ boost::shared_ptr<Stripable> stripable;
+ boost::shared_ptr<MidiTrack> midi_trk;
- if (midi_trk) {
- row[_columns.is_input_active] = midi_trk->input_active ();
- row[_columns.is_midi] = true;
- } else {
+ if (vtav) {
+
+ stripable = vtav->vca();
+
+ row[_columns.is_track] = false;
row[_columns.is_input_active] = false;
row[_columns.is_midi] = false;
+
+ } else if (rtav) {
+
+ stripable = rtav->route ();
+ midi_trk= boost::dynamic_pointer_cast<MidiTrack> (stripable);
+
+ row[_columns.is_track] = (boost::dynamic_pointer_cast<Track> (stripable) != 0);
+
+
+ if (midi_trk) {
+ row[_columns.is_input_active] = midi_trk->input_active ();
+ row[_columns.is_midi] = true;
+ } else {
+ row[_columns.is_input_active] = false;
+ row[_columns.is_midi] = false;
+ }
}
- row[_columns.mute_state] = (*x)->route()->muted() ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off;
- row[_columns.solo_state] = RouteUI::solo_active_state ((*x)->route());
- row[_columns.solo_visible] = !(*x)->route()->is_master ();
- row[_columns.solo_isolate_state] = (*x)->route()->solo_isolated();
- row[_columns.solo_safe_state] = (*x)->route()->solo_safe();
+ if (!stripable) {
+ continue;
+ }
+
+ row[_columns.text] = stripable->name();
+ row[_columns.visible] = (*x)->marked_for_display();
+ row[_columns.active] = true;
+ row[_columns.tv] = *x;
+ row[_columns.stripable] = stripable;
+ row[_columns.mute_state] = RouteUI::mute_active_state (_session, stripable);
+ row[_columns.solo_state] = RouteUI::solo_active_state (stripable);
+ row[_columns.solo_visible] = true;
+ row[_columns.solo_isolate_state] = RouteUI::solo_isolate_active_state (stripable);
+ row[_columns.solo_safe_state] = RouteUI::solo_safe_active_state (stripable);
row[_columns.name_editable] = true;
- boost::weak_ptr<Route> wr ((*x)->route());
+ boost::weak_ptr<Stripable> ws (stripable);
- (*x)->route()->gui_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context());
- (*x)->route()->PropertyChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::route_property_changed, this, _1, wr), gui_context());
+ /* for now, we need both of these. PropertyChanged covers on
+ * pre-defined, "global" things of interest to a
+ * UI. gui_changed covers arbitrary, un-enumerated, un-typed
+ * changes that may only be of interest to a particular
+ * UI (e.g. track-height is not of any relevant to OSC)
+ */
+
+ stripable->gui_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context());
+ stripable->PropertyChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::route_property_changed, this, _1, ws), gui_context());
+ stripable->presentation_info().PropertyChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::route_property_changed, this, _1, ws), gui_context());
- if ((*x)->is_track()) {
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> ((*x)->route());
- t->RecordEnableChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
+ if (boost::dynamic_pointer_cast<Track> (stripable)) {
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (stripable);
+ t->rec_enable_control()->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
+ t->rec_safe_control()->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
}
- if ((*x)->is_midi_track()) {
- boost::shared_ptr<MidiTrack> t = boost::dynamic_pointer_cast<MidiTrack> ((*x)->route());
- t->StepEditStatusChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
- t->InputActiveChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_input_active_display, this), gui_context());
+ if (midi_trk) {
+ midi_trk->StepEditStatusChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
+ midi_trk->InputActiveChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_input_active_display, this), gui_context());
}
- (*x)->route()->mute_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_mute_display, this), gui_context());
- (*x)->route()->solo_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this), gui_context());
- (*x)->route()->listen_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this), gui_context());
- (*x)->route()->solo_isolated_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_isolate_display, this), gui_context());
- (*x)->route()->solo_safe_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_safe_display, this), gui_context());
- (*x)->route()->active_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_active_display, this), gui_context ());
+ boost::shared_ptr<AutomationControl> ac;
+ if ((ac = stripable->mute_control()) != 0) {
+ ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_mute_display, this), gui_context());
+ }
+ if ((ac = stripable->solo_control()) != 0) {
+ ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this), gui_context());
+ }
+ if ((ac = stripable->solo_isolate_control()) != 0) {
+ ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_isolate_display, this), gui_context());
+ }
+ if ((ac = stripable->solo_safe_control()) != 0) {
+ ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_safe_display, this), gui_context());
+ }
+
+ if (rtav) {
+ rtav->route()->active_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_active_display, this), gui_context ());
+ }
}
update_rec_display ();
@@ -730,9 +844,12 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
_display.set_model (_model);
/* now update route order keys from the treeview/track display order */
+
if (!from_scratch) {
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
+
+ redisplay ();
}
void
@@ -776,17 +893,19 @@ EditorRoutes::route_removed (TimeAxisView *tv)
}
void
-EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Route> r)
+EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Stripable> s)
{
- if (!what_changed.contains (ARDOUR::Properties::name)) {
+ if (!what_changed.contains (ARDOUR::Properties::hidden) && !what_changed.contains (ARDOUR::Properties::name)) {
return;
}
- ENSURE_GUI_THREAD (*this, &EditorRoutes::route_name_changed, r)
+ if (_adding_routes) {
+ return;
+ }
- boost::shared_ptr<Route> route = r.lock ();
+ boost::shared_ptr<Stripable> stripable = s.lock ();
- if (!route) {
+ if (!stripable) {
return;
}
@@ -794,9 +913,23 @@ EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost:
TreeModel::Children::iterator i;
for (i = rows.begin(); i != rows.end(); ++i) {
- boost::shared_ptr<Route> t = (*i)[_columns.route];
- if (t == route) {
- (*i)[_columns.text] = route->name();
+
+ boost::shared_ptr<Stripable> ss = (*i)[_columns.stripable];
+
+ if (ss == stripable) {
+
+ if (what_changed.contains (ARDOUR::Properties::name)) {
+ (*i)[_columns.text] = stripable->name();
+ break;
+ }
+
+ if (what_changed.contains (ARDOUR::Properties::hidden)) {
+ (*i)[_columns.visible] = !stripable->presentation_info().hidden();
+ cerr << stripable->name() << " visibility changed, redisplay\n";
+ redisplay ();
+
+ }
+
break;
}
}
@@ -805,7 +938,7 @@ EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost:
void
EditorRoutes::update_active_display ()
{
- if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+ if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
}
}
@@ -826,7 +959,7 @@ EditorRoutes::update_visibility ()
/* force route order keys catch up with visibility changes
*/
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
void
@@ -863,66 +996,7 @@ EditorRoutes::show_track_in_display (TimeAxisView& tv)
}
void
-EditorRoutes::reset_remote_control_ids ()
-{
- if (Config->get_remote_model() == UserOrdered || !_session || _session->deletion_in_progress()) {
- return;
- }
-
- TreeModel::Children rows = _model->children();
-
- if (rows.empty()) {
- return;
- }
-
-
- DEBUG_TRACE (DEBUG::OrderKeys, "editor reset remote control ids\n");
-
- TreeModel::Children::iterator ri;
- bool rid_change = false;
- uint32_t rid = 1;
- uint32_t invisible_key = UINT32_MAX;
-
- for (ri = rows.begin(); ri != rows.end(); ++ri) {
-
- /* skip two special values */
-
- if (rid == Route::MasterBusRemoteControlID) {
- rid++;
- }
-
- if (rid == Route::MonitorBusRemoteControlID) {
- rid++;
- }
-
- boost::shared_ptr<Route> route = (*ri)[_columns.route];
- bool visible = (*ri)[_columns.visible];
-
- if (!route->is_master() && !route->is_monitor()) {
-
- uint32_t new_rid = (visible ? rid : invisible_key--);
-
- if (new_rid != route->remote_control_id()) {
- route->set_remote_control_id_explicit (new_rid);
- rid_change = true;
- }
-
- if (visible) {
- rid++;
- }
-
- }
- }
-
- if (rid_change) {
- /* tell the world that we changed the remote control IDs */
- _session->notify_remote_id_change ();
- }
-}
-
-
-void
-EditorRoutes::sync_order_keys_from_treeview ()
+EditorRoutes::sync_presentation_info_from_treeview ()
{
if (_ignore_reorder || !_session || _session->deletion_in_progress()) {
return;
@@ -934,60 +1008,43 @@ EditorRoutes::sync_order_keys_from_treeview ()
return;
}
-
- DEBUG_TRACE (DEBUG::OrderKeys, "editor sync order keys from treeview\n");
+ DEBUG_TRACE (DEBUG::OrderKeys, "editor sync presentation info from treeview\n");
TreeModel::Children::iterator ri;
- bool changed = false;
- bool rid_change = false;
- uint32_t order = 0;
- uint32_t rid = 1;
- uint32_t invisible_key = UINT32_MAX;
+ bool change = false;
+ PresentationInfo::order_t order = 0;
for (ri = rows.begin(); ri != rows.end(); ++ri) {
- boost::shared_ptr<Route> route = (*ri)[_columns.route];
+ boost::shared_ptr<Stripable> stripable = (*ri)[_columns.stripable];
bool visible = (*ri)[_columns.visible];
- uint32_t old_key = route->order_key ();
-
- if (order != old_key) {
- route->set_order_key (order);
+ /* Monitor and Auditioner do not get their presentation
+ * info reset here.
+ */
- changed = true;
+ if (stripable->is_monitor() || stripable->is_auditioner()) {
+ continue;
}
- if ((Config->get_remote_model() == MixerOrdered) && !route->is_master() && !route->is_monitor()) {
-
- uint32_t new_rid = (visible ? rid : invisible_key--);
-
- if (new_rid != route->remote_control_id()) {
- route->set_remote_control_id_explicit (new_rid);
- rid_change = true;
- }
-
- if (visible) {
- rid++;
- }
+ stripable->presentation_info().set_hidden (!visible);
+ if (order != stripable->presentation_info().order()) {
+ stripable->set_presentation_order (order, false);
+ change = true;
}
++order;
}
- if (changed) {
- /* tell the world that we changed the editor sort keys */
- _session->sync_order_keys ();
- }
-
- if (rid_change) {
- /* tell the world that we changed the remote control IDs */
- _session->notify_remote_id_change ();
+ if (change) {
+ DEBUG_TRACE (DEBUG::OrderKeys, "... notify PI change from editor GUI\n");
+ _session->notify_presentation_info_change ();
}
}
void
-EditorRoutes::sync_treeview_from_order_keys ()
+EditorRoutes::sync_treeview_from_presentation_info ()
{
/* Some route order key(s) have been changed, make sure that
we update out tree/list model and GUI to reflect the change.
@@ -997,12 +1054,7 @@ EditorRoutes::sync_treeview_from_order_keys ()
return;
}
- DEBUG_TRACE (DEBUG::OrderKeys, "editor sync model from order keys.\n");
-
- /* we could get here after either a change in the Mixer or Editor sort
- * order, but either way, the mixer order keys reflect the intended
- * order for the GUI, so reorder the treeview model to match it.
- */
+ DEBUG_TRACE (DEBUG::OrderKeys, "editor sync model from presentation info.\n");
vector<int> neworder;
TreeModel::Children rows = _model->children();
@@ -1013,30 +1065,28 @@ EditorRoutes::sync_treeview_from_order_keys ()
return;
}
- OrderKeySortedRoutes sorted_routes;
+ OrderingKeys sorted;
for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
- boost::shared_ptr<Route> route = (*ri)[_columns.route];
- sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key ()));
+ boost::shared_ptr<Stripable> stripable = (*ri)[_columns.stripable];
+ /* use global order */
+ sorted.push_back (OrderKeys (old_order, stripable->presentation_info().order()));
}
SortByNewDisplayOrder cmp;
- sort (sorted_routes.begin(), sorted_routes.end(), cmp);
- neworder.assign (sorted_routes.size(), 0);
+ sort (sorted.begin(), sorted.end(), cmp);
+ neworder.assign (sorted.size(), 0);
uint32_t n = 0;
- for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
+ for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) {
neworder[n] = sr->old_display_order;
if (sr->old_display_order != n) {
changed = true;
}
-
- DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order for %1 from %2 to %3\n",
- sr->route->name(), sr->old_display_order, n));
}
if (changed) {
@@ -1092,7 +1142,7 @@ EditorRoutes::set_all_tracks_visibility (bool yn)
/* force route order keys catch up with visibility changes
*/
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
void
@@ -1157,7 +1207,7 @@ EditorRoutes::set_all_audio_midi_visibility (int tracks, bool yn)
/* force route order keys catch up with visibility changes
*/
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
void
@@ -1235,25 +1285,27 @@ EditorRoutes::key_press (GdkEventKey* ev)
case 'm':
if (get_relevant_routes (rl)) {
- _session->set_mute (rl, !rl->front()->muted(), Session::rt_cleanup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), rl->front()->muted() ? 0.0 : 1.0, Controllable::NoGroup);
}
return true;
break;
case 's':
if (get_relevant_routes (rl)) {
- if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (rl, !rl->front()->listening_via_monitor(), Session::rt_cleanup);
- } else {
- _session->set_solo (rl, !rl->front()->self_soloed(), Session::rt_cleanup);
- }
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::solo_control), rl->front()->self_soloed() ? 0.0 : 1.0, Controllable::NoGroup);
}
return true;
break;
case 'r':
if (get_relevant_routes (rl)) {
- _session->set_record_enabled (rl, !rl->front()->record_enabled(), Session::rt_cleanup);
+ for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*r);
+ if (t) {
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), !t->rec_enable_control()->get_value(), Controllable::NoGroup);
+ break;
+ }
+ }
}
break;
@@ -1389,7 +1441,7 @@ EditorRoutes::selection_filter (Glib::RefPtr<TreeModel> const &, TreeModel::Path
return true;
}
-struct EditorOrderRouteSorter
+struct PresentationInfoRouteSorter
{
bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
if (a->is_master()) {
@@ -1399,7 +1451,14 @@ struct EditorOrderRouteSorter
/* everything else before master */
return false;
}
- return a->order_key () < b->order_key ();
+ return a->presentation_info().order () < b->presentation_info().order ();
+ }
+};
+
+struct PresentationInfoVCASorter
+{
+ bool operator() (boost::shared_ptr<VCA> a, boost::shared_ptr<VCA> b) {
+ return a->presentation_info().order () < b->presentation_info().order ();
}
};
@@ -1413,10 +1472,19 @@ EditorRoutes::initial_display ()
return;
}
+ StripableList s;
+
RouteList r (*_session->get_routes());
+ for (RouteList::iterator ri = r.begin(); ri != r.end(); ++ri) {
+ s.push_back (*ri);
+ }
- r.sort (EditorOrderRouteSorter ());
- _editor->add_routes (r);
+ VCAList v (_session->vca_manager().vcas());
+ for (VCAList::iterator vi = v.begin(); vi != v.end(); ++vi) {
+ s.push_back (*vi);
+ }
+
+ _editor->add_stripables (s);
}
void
@@ -1433,6 +1501,15 @@ EditorRoutes::display_drag_data_received (const RefPtr<Gdk::DragContext>& contex
context->drag_finish (true, false, time);
}
+struct ViewStripable {
+ TimeAxisView* tav;
+ boost::shared_ptr<Stripable> stripable;
+ uint32_t old_order;
+
+ ViewStripable (TimeAxisView* t, boost::shared_ptr<Stripable> s, uint32_t n)
+ : tav (t), stripable (s), old_order (n) {}
+};
+
void
EditorRoutes::move_selected_tracks (bool up)
{
@@ -1440,33 +1517,32 @@ EditorRoutes::move_selected_tracks (bool up)
return;
}
- typedef std::pair<TimeAxisView*,boost::shared_ptr<Route> > ViewRoute;
- std::list<ViewRoute> view_routes;
+ std::list<ViewStripable> view_stripables;
std::vector<int> neworder;
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator ri;
+ TreeModel::Children::size_type n;
- for (ri = rows.begin(); ri != rows.end(); ++ri) {
+ for (n = 0, ri = rows.begin(); ri != rows.end(); ++ri, ++n) {
TimeAxisView* tv = (*ri)[_columns.tv];
- boost::shared_ptr<Route> route = (*ri)[_columns.route];
-
- view_routes.push_back (ViewRoute (tv, route));
+ boost::shared_ptr<Stripable> stripable = (*ri)[_columns.stripable];
+ view_stripables.push_back (ViewStripable (tv, stripable, n));
}
- list<ViewRoute>::iterator trailing;
- list<ViewRoute>::iterator leading;
+ list<ViewStripable>::iterator trailing;
+ list<ViewStripable>::iterator leading;
if (up) {
- trailing = view_routes.begin();
- leading = view_routes.begin();
+ trailing = view_stripables.begin();
+ leading = view_stripables.begin();
++leading;
- while (leading != view_routes.end()) {
- if (_editor->selection->selected (leading->first)) {
- view_routes.insert (trailing, ViewRoute (leading->first, leading->second));
- leading = view_routes.erase (leading);
+ while (leading != view_stripables.end()) {
+ if (_editor->selection->selected (leading->tav)) {
+ view_stripables.insert (trailing, ViewStripable (*leading));
+ leading = view_stripables.erase (leading);
} else {
++leading;
++trailing;
@@ -1480,17 +1556,17 @@ EditorRoutes::move_selected_tracks (bool up)
and so it looks like a bit of a mess.
*/
- trailing = view_routes.end();
- leading = view_routes.end();
+ trailing = view_stripables.end();
+ leading = view_stripables.end();
- --leading; if (leading == view_routes.begin()) { return; }
+ --leading; if (leading == view_stripables.begin()) { return; }
--leading;
--trailing;
while (1) {
- if (_editor->selection->selected (leading->first)) {
- list<ViewRoute>::iterator tmp;
+ if (_editor->selection->selected (leading->tav)) {
+ list<ViewStripable>::iterator tmp;
/* need to insert *after* trailing, not *before* it,
which is what insert (iter, val) normally does.
@@ -1499,7 +1575,7 @@ EditorRoutes::move_selected_tracks (bool up)
tmp = trailing;
tmp++;
- view_routes.insert (tmp, ViewRoute (leading->first, leading->second));
+ view_stripables.insert (tmp, ViewStripable (*leading));
/* can't use iter = cont.erase (iter); form here, because
we need iter to move backwards.
@@ -1510,7 +1586,7 @@ EditorRoutes::move_selected_tracks (bool up)
bool done = false;
- if (leading == view_routes.begin()) {
+ if (leading == view_stripables.begin()) {
/* the one we've just inserted somewhere else
was the first in the list. erase this copy,
and then break, because we're done.
@@ -1518,7 +1594,7 @@ EditorRoutes::move_selected_tracks (bool up)
done = true;
}
- view_routes.erase (leading);
+ view_stripables.erase (leading);
if (done) {
break;
@@ -1527,7 +1603,7 @@ EditorRoutes::move_selected_tracks (bool up)
leading = tmp;
} else {
- if (leading == view_routes.begin()) {
+ if (leading == view_stripables.begin()) {
break;
}
--leading;
@@ -1536,26 +1612,24 @@ EditorRoutes::move_selected_tracks (bool up)
};
}
- for (leading = view_routes.begin(); leading != view_routes.end(); ++leading) {
- uint32_t order = leading->second->order_key ();
- neworder.push_back (order);
- }
+ for (leading = view_stripables.begin(); leading != view_stripables.end(); ++leading) {
+ neworder.push_back (leading->old_order);
+#ifndef NDEBUG
+ if (leading->old_order != neworder.size() - 1) {
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("move %1 to %2\n", leading->old_order, neworder.size() - 1));
+ }
+#endif
+ }
#ifndef NDEBUG
DEBUG_TRACE (DEBUG::OrderKeys, "New order after moving tracks:\n");
for (vector<int>::iterator i = neworder.begin(); i != neworder.end(); ++i) {
DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("\t%1\n", *i));
}
DEBUG_TRACE (DEBUG::OrderKeys, "-------\n");
-
- for (vector<int>::iterator i = neworder.begin(); i != neworder.end(); ++i) {
- if (*i >= (int) neworder.size()) {
- cerr << "Trying to move something to " << *i << " of " << neworder.size() << endl;
- }
- assert (*i < (int) neworder.size ());
- }
#endif
+
_model->reorder (neworder);
}
@@ -1566,10 +1640,10 @@ EditorRoutes::update_input_active_display ()
TreeModel::Children::iterator i;
for (i = rows.begin(); i != rows.end(); ++i) {
- boost::shared_ptr<Route> route = (*i)[_columns.route];
+ boost::shared_ptr<Stripable> stripable = (*i)[_columns.stripable];
- if (boost::dynamic_pointer_cast<Track> (route)) {
- boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
+ if (boost::dynamic_pointer_cast<Track> (stripable)) {
+ boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (stripable);
if (mt) {
(*i)[_columns.is_input_active] = mt->input_active();
@@ -1581,7 +1655,7 @@ EditorRoutes::update_input_active_display ()
void
EditorRoutes::update_rec_display ()
{
- if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+ if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
}
}
@@ -1589,21 +1663,29 @@ EditorRoutes::update_rec_display ()
bool
EditorRoutes::idle_update_mute_rec_solo_etc()
{
- g_atomic_int_set (&_queue_tv_update, 0);
+ g_atomic_int_set (const_cast<gint*>(&_queue_tv_update), 0);
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator i;
for (i = rows.begin(); i != rows.end(); ++i) {
- boost::shared_ptr<Route> route = (*i)[_columns.route];
- (*i)[_columns.mute_state] = RouteUI::mute_active_state (_session, route);
- (*i)[_columns.solo_state] = RouteUI::solo_active_state (route);
- (*i)[_columns.solo_isolate_state] = RouteUI::solo_isolate_active_state (route) ? 1 : 0;
- (*i)[_columns.solo_safe_state] = RouteUI::solo_safe_active_state (route) ? 1 : 0;
- (*i)[_columns.active] = route->active ();
- if (boost::dynamic_pointer_cast<Track> (route)) {
+ boost::shared_ptr<Stripable> stripable = (*i)[_columns.stripable];
+ boost::shared_ptr<Route> route = boost::dynamic_pointer_cast<Route> (stripable);
+ (*i)[_columns.mute_state] = RouteUI::mute_active_state (_session, stripable);
+ (*i)[_columns.solo_state] = RouteUI::solo_active_state (stripable);
+ (*i)[_columns.solo_isolate_state] = RouteUI::solo_isolate_active_state (stripable) ? 1 : 0;
+ (*i)[_columns.solo_safe_state] = RouteUI::solo_safe_active_state (stripable) ? 1 : 0;
+ if (route) {
+ (*i)[_columns.active] = route->active ();
+ } else {
+ (*i)[_columns.active] = true;
+ }
+
+ boost::shared_ptr<Track> trk (boost::dynamic_pointer_cast<Track>(route));
+
+ if (trk) {
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
- if (route->record_enabled()) {
+ if (trk->rec_enable_control()->get_value()) {
if (_session->record_status() == Session::Recording) {
(*i)[_columns.rec_state] = 1;
} else {
@@ -1615,7 +1697,8 @@ EditorRoutes::idle_update_mute_rec_solo_etc()
(*i)[_columns.rec_state] = 0;
}
- (*i)[_columns.name_editable] = !route->record_enabled ();
+ (*i)[_columns.rec_safe] = trk->rec_safe_control()->get_value();
+ (*i)[_columns.name_editable] = !trk->rec_enable_control()->get_value();
}
}
@@ -1626,7 +1709,7 @@ EditorRoutes::idle_update_mute_rec_solo_etc()
void
EditorRoutes::update_mute_display ()
{
- if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+ if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
}
}
@@ -1634,7 +1717,7 @@ EditorRoutes::update_mute_display ()
void
EditorRoutes::update_solo_display ()
{
- if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+ if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
}
}
@@ -1642,7 +1725,7 @@ EditorRoutes::update_solo_display ()
void
EditorRoutes::update_solo_isolate_display ()
{
- if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+ if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
}
}
@@ -1650,7 +1733,7 @@ EditorRoutes::update_solo_isolate_display ()
void
EditorRoutes::update_solo_safe_display ()
{
- if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+ if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
}
}
@@ -1699,10 +1782,10 @@ EditorRoutes::name_edit (std::string const & path, std::string const & new_text)
return;
}
- boost::shared_ptr<Route> route = (*iter)[_columns.route];
+ boost::shared_ptr<Stripable> stripable = (*iter)[_columns.stripable];
- if (route && route->name() != new_text) {
- route->set_name (new_text);
+ if (stripable && stripable->name() != new_text) {
+ stripable->set_name (new_text);
}
}
@@ -1719,7 +1802,7 @@ EditorRoutes::show_tracks_with_regions_at_playhead ()
set<TimeAxisView*> show;
for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
- TimeAxisView* tav = _editor->axis_view_from_route (*i);
+ TimeAxisView* tav = _editor->axis_view_from_stripable (*i);
if (tav) {
show.insert (tav);
}
@@ -1739,5 +1822,12 @@ EditorRoutes::show_tracks_with_regions_at_playhead ()
/* force route order keys catch up with visibility changes
*/
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
+}
+
+int
+EditorRoutes::plugin_setup (boost::shared_ptr<Route> r, boost::shared_ptr<PluginInsert> pi, ARDOUR::Route::PluginSetupOptions flags)
+{
+ PluginSetupDialog psd (r, pi, flags);
+ return psd.run ();
}
diff --git a/gtk2_ardour/editor_routes.h b/gtk2_ardour/editor_routes.h
index bee3737..29e8b45 100644
--- a/gtk2_ardour/editor_routes.h
+++ b/gtk2_ardour/editor_routes.h
@@ -22,8 +22,11 @@
#include "pbd/signals.h"
#include "gtkmm2ext/widget_state.h"
+
#include "editor_component.h"
+class VCATimeAxisView;
+
class EditorRoutes : public EditorComponent, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
{
public:
@@ -55,33 +58,33 @@ public:
void redisplay ();
void update_visibility ();
- void routes_added (std::list<RouteTimeAxisView*> routes);
+ void time_axis_views_added (std::list<TimeAxisView*>);
void route_removed (TimeAxisView *);
void hide_track_in_display (TimeAxisView &);
std::list<TimeAxisView*> views () const;
void hide_all_tracks (bool);
void clear ();
- void sync_order_keys_from_treeview ();
- void reset_remote_control_ids ();
+ void sync_presentation_info_from_treeview ();
private:
void initial_display ();
void redisplay_real ();
void on_input_active_changed (std::string const &);
void on_tv_rec_enable_changed (std::string const &);
+ void on_tv_rec_safe_toggled (std::string const &);
void on_tv_mute_enable_toggled (std::string const &);
void on_tv_solo_enable_toggled (std::string const &);
void on_tv_solo_isolate_toggled (std::string const &);
void on_tv_solo_safe_toggled (std::string const &);
void build_menu ();
void show_menu ();
- void sync_treeview_from_order_keys ();
+ void sync_treeview_from_presentation_info ();
void row_deleted (Gtk::TreeModel::Path const &);
void visible_changed (std::string const &);
void active_changed (std::string const &);
void reordered (Gtk::TreeModel::Path const &, Gtk::TreeModel::iterator const &, int *);
bool button_press (GdkEventButton *);
- void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route>);
+ void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Stripable>);
void handle_gui_changes (std::string const &, void *);
bool idle_update_mute_rec_solo_etc ();
void update_rec_display ();
@@ -104,6 +107,8 @@ private:
void show_tracks_with_regions_at_playhead ();
void selection_changed ();
+ int plugin_setup (boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::PluginInsert>, ARDOUR::Route::PluginSetupOptions);
+
void display_drag_data_received (
Glib::RefPtr<Gdk::DragContext> const &, gint, gint, Gtk::SelectionData const &, guint, guint
);
@@ -117,6 +122,7 @@ private:
add (text);
add (visible);
add (rec_state);
+ add (rec_safe);
add (mute_state);
add (solo_state);
add (solo_visible);
@@ -124,7 +130,7 @@ private:
add (solo_safe_state);
add (is_track);
add (tv);
- add (route);
+ add (stripable);
add (name_editable);
add (is_input_active);
add (is_midi);
@@ -134,6 +140,7 @@ private:
Gtk::TreeModelColumn<std::string> text;
Gtk::TreeModelColumn<bool> visible;
Gtk::TreeModelColumn<uint32_t> rec_state;
+ Gtk::TreeModelColumn<uint32_t> rec_safe;
Gtk::TreeModelColumn<uint32_t> mute_state;
Gtk::TreeModelColumn<uint32_t> solo_state;
/** true if the solo buttons are visible for this route, otherwise false */
@@ -142,7 +149,7 @@ private:
Gtk::TreeModelColumn<uint32_t> solo_safe_state;
Gtk::TreeModelColumn<bool> is_track;
Gtk::TreeModelColumn<TimeAxisView*> tv;
- Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> > route;
+ Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Stripable> > stripable;
Gtk::TreeModelColumn<bool> name_editable;
Gtk::TreeModelColumn<bool> is_input_active;
Gtk::TreeModelColumn<bool> is_midi;
diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc
index ae646a5..868b006 100644
--- a/gtk2_ardour/editor_rulers.cc
+++ b/gtk2_ardour/editor_rulers.cc
@@ -53,7 +53,7 @@
#include "editor_cursors.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -313,7 +313,7 @@ Editor::store_ruler_visibility ()
void
Editor::restore_ruler_visibility ()
{
- XMLProperty* prop;
+ XMLProperty const * prop;
XMLNode * node = _session->extra_xml (X_("RulerVisibility"));
no_ruler_shown_update = true;
@@ -439,7 +439,7 @@ Editor::update_ruler_visibility ()
double tbgpos = 0.0;
double old_unit_pos;
-#ifdef GTKOSX
+#ifdef __APPLE__
/* gtk update probs require this (damn) */
meter_label.hide();
tempo_label.hide();
@@ -540,7 +540,7 @@ Editor::update_ruler_visibility ()
tempo_label.hide();
}
- if (!Profile->get_sae() && ruler_range_action->get_active()) {
+ if (ruler_range_action->get_active()) {
old_unit_pos = range_marker_group->position().y;
if (tbpos != old_unit_pos) {
range_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos));
@@ -710,15 +710,13 @@ Editor::update_fixed_rulers ()
}
void
-Editor::update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end)
+Editor::update_tempo_based_rulers (std::vector<TempoMap::BBTPoint>& grid)
{
if (_session == 0) {
return;
}
- compute_bbt_ruler_scale (leftmost_frame, leftmost_frame+current_page_samples(),
- begin, end);
+ compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame+current_page_samples());
_bbt_metric->units_per_pixel = samples_per_pixel;
@@ -1011,19 +1009,25 @@ Editor::metric_get_timecode (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdou
}
void
-Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper,
- ARDOUR::TempoMap::BBTPointList::const_iterator begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator end)
+Editor::compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t lower, framepos_t upper)
{
if (_session == 0) {
return;
}
- TempoMap::BBTPointList::const_iterator i;
+ std::vector<TempoMap::BBTPoint>::const_iterator i;
Timecode::BBT_Time lower_beat, upper_beat; // the beats at each end of the ruler
+ double floor_lower_beat = floor(_session->tempo_map().beat_at_frame (lower));
- _session->bbt_time (lower, lower_beat);
- _session->bbt_time (upper, upper_beat);
+ if (floor_lower_beat < 0.0) {
+ floor_lower_beat = 0.0;
+ }
+
+ const framecnt_t beat_before_lower_pos = _session->tempo_map().frame_at_beat (floor_lower_beat);
+ const framecnt_t beat_after_upper_pos = _session->tempo_map().frame_at_beat (floor (_session->tempo_map().beat_at_frame (upper)) + 1.0);
+
+ _session->bbt_time (beat_before_lower_pos, lower_beat);
+ _session->bbt_time (beat_after_upper_pos, upper_beat);
uint32_t beats = 0;
bbt_accent_modulo = 1;
@@ -1103,44 +1107,46 @@ Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper,
bbt_beat_subdivision = 4;
break;
}
-
- if (distance (begin, end) == 0) {
+ if (distance (grid.begin(), grid.end()) == 0) {
return;
}
- i = end;
+ i = grid.end();
i--;
- if ((*i).beat >= (*begin).beat) {
- bbt_bars = (*i).bar - (*begin).bar;
+
+ /* XX ?? */
+ if ((*i).beat >= (*grid.begin()).beat) {
+ bbt_bars = (*i).bar - (*grid.begin()).bar;
} else {
- bbt_bars = (*i).bar - (*begin).bar - 1;
+ bbt_bars = (*i).bar - (*grid.begin()).bar;
}
- beats = distance (begin, end) - bbt_bars;
+ beats = distance (grid.begin(), grid.end()) - bbt_bars;
+ double beat_density = ((distance (grid.begin(), grid.end()) + 1) * ((double) (upper - lower) / (double) (1 + grid.back().frame - grid.front().frame))) / 5.0;
/* Only show the bar helper if there aren't many bars on the screen */
if ((bbt_bars < 2) || (beats < 5)) {
bbt_bar_helper_on = true;
}
- if (bbt_bars > 8192) {
- bbt_ruler_scale = bbt_show_many;
- } else if (bbt_bars > 1024) {
+ if (beat_density > 8192) {
+ bbt_ruler_scale = bbt_show_many;
+ } else if (beat_density > 1024) {
bbt_ruler_scale = bbt_show_64;
- } else if (bbt_bars > 256) {
+ } else if (beat_density > 512) {
bbt_ruler_scale = bbt_show_16;
- } else if (bbt_bars > 64) {
+ } else if (beat_density > 128) {
bbt_ruler_scale = bbt_show_4;
- } else if (bbt_bars > 10) {
+ } else if (beat_density > 16) {
bbt_ruler_scale = bbt_show_1;
- } else if (bbt_bars > 2) {
+ } else if (beat_density > 2) {
bbt_ruler_scale = bbt_show_beats;
- } else if (bbt_bars > 0) {
+ } else if (beat_density > 0.5) {
bbt_ruler_scale = bbt_show_ticks;
} else {
bbt_ruler_scale = bbt_show_ticks_detail;
}
- if ((bbt_ruler_scale == bbt_show_ticks_detail) && (lower_beat.beats == upper_beat.beats) && (upper_beat.ticks - lower_beat.ticks <= Timecode::BBT_Time::ticks_per_beat / 4)) {
+ if ((bbt_ruler_scale == bbt_show_ticks_detail) && beats < 3) {
bbt_ruler_scale = bbt_show_ticks_super_detail;
}
}
@@ -1161,38 +1167,34 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
return;
}
- TempoMap::BBTPointList::const_iterator i;
+ std::vector<TempoMap::BBTPoint>::const_iterator i;
char buf[64];
gint n = 0;
framepos_t pos;
Timecode::BBT_Time next_beat;
- framepos_t next_beat_pos;
uint32_t beats = 0;
uint32_t tick = 0;
uint32_t skip;
uint32_t t;
- framepos_t frame_skip;
- double frame_skip_error;
double bbt_position_of_helper;
- double accumulated_error;
bool i_am_accented = false;
bool helper_active = false;
ArdourCanvas::Ruler::Mark mark;
- ARDOUR::TempoMap::BBTPointList::const_iterator begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator end;
+ std::vector<TempoMap::BBTPoint> grid;
- compute_current_bbt_points (lower, upper, begin, end);
+ compute_current_bbt_points (grid, lower, upper);
- if (distance (begin, end) == 0) {
+ if (distance (grid.begin(), grid.end()) == 0) {
return;
}
switch (bbt_ruler_scale) {
case bbt_show_beats:
- beats = distance (begin, end);
+
+ beats = distance (grid.begin(), grid.end());
bbt_nmarks = beats + 2;
mark.label = "";
@@ -1200,7 +1202,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
mark.style = ArdourCanvas::Ruler::Mark::Micro;
marks.push_back (mark);
- for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) {
+ for (n = 1, i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
if ((*i).frame < lower && (bbt_bar_helper_on)) {
snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1228,7 +1230,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
case bbt_show_ticks:
- beats = distance (begin, end);
+ beats = distance (grid.begin(), grid.end());
bbt_nmarks = (beats + 2) * bbt_beat_subdivision;
bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ());
@@ -1240,7 +1242,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
mark.style = ArdourCanvas::Ruler::Mark::Micro;
marks.push_back (mark);
- for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) {
+ for (n = 1, i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
if ((*i).frame < lower && (bbt_bar_helper_on)) {
snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1265,45 +1267,20 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
}
/* Add the tick marks */
+ skip = Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision;
+ tick = skip; // the first non-beat tick
+ t = 0;
+ while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
- /* Find the next beat */
- next_beat.beats = (*i).beat;
- next_beat.bars = (*i).bar;
- next_beat.ticks = 0;
-
- if ((*i).meter->divisions_per_bar() > (next_beat.beats + 1)) {
- next_beat.beats += 1;
- } else {
- next_beat.bars += 1;
- next_beat.beats = 1;
- }
-
- next_beat_pos = _session->tempo_map().frame_time(next_beat);
-
- frame_skip = (framepos_t) floor (frame_skip_error = (_session->frame_rate() * 60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
- frame_skip_error -= frame_skip;
- skip = (uint32_t) (Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision);
-
- pos = (*i).frame + frame_skip;
- accumulated_error = frame_skip_error;
-
- tick = skip;
+ next_beat.beats = (*i).beat;
+ next_beat.bars = (*i).bar;
+ next_beat.ticks = tick;
+ pos = _session->tempo_map().frame_at_bbt (next_beat);
- for (t = 0; (tick < Timecode::BBT_Time::ticks_per_beat) && (n < bbt_nmarks) && (pos < next_beat_pos) ; pos += frame_skip, tick += skip, ++t) {
-
- if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
+ if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
i_am_accented = true;
}
-
mark.label = "";
-
- /* Error compensation for float to framepos_t*/
- accumulated_error += frame_skip_error;
- if (accumulated_error > 1) {
- pos += 1;
- accumulated_error -= 1.0f;
- }
-
mark.position = pos;
if ((bbt_beat_subdivision > 4) && i_am_accented) {
@@ -1313,7 +1290,10 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
}
i_am_accented = false;
marks.push_back (mark);
- n++;
+
+ tick += skip;
+ ++t;
+ ++n;
}
}
@@ -1321,17 +1301,17 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
case bbt_show_ticks_detail:
- beats = distance (begin, end);
+ beats = distance (grid.begin(), grid.end());
bbt_nmarks = (beats + 2) * bbt_beat_subdivision;
- bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ());
+ bbt_position_of_helper = lower + (3 * Editor::get_current_zoom ());
mark.label = "";
mark.position = lower;
mark.style = ArdourCanvas::Ruler::Mark::Micro;
marks.push_back (mark);
- for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) {
+ for (n = 1, i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
if ((*i).frame < lower && (bbt_bar_helper_on)) {
snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1356,36 +1336,20 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
}
/* Add the tick marks */
+ skip = Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision;
+ tick = skip; // the first non-beat tick
- /* Find the next beat */
-
- next_beat.beats = (*i).beat;
- next_beat.bars = (*i).bar;
-
- if ((*i).meter->divisions_per_bar() > (next_beat.beats + 1)) {
- next_beat.beats += 1;
- } else {
- next_beat.bars += 1;
- next_beat.beats = 1;
- }
-
- next_beat_pos = _session->tempo_map().frame_time(next_beat);
-
- frame_skip = (framepos_t) floor (frame_skip_error = (_session->frame_rate() * 60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
- frame_skip_error -= frame_skip;
- skip = (uint32_t) (Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision);
-
- pos = (*i).frame + frame_skip;
- accumulated_error = frame_skip_error;
+ t = 0;
+ while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
- tick = skip;
+ next_beat.beats = (*i).beat;
+ next_beat.bars = (*i).bar;
+ next_beat.ticks = tick;
+ pos = _session->tempo_map().frame_at_bbt (next_beat);
- for (t = 0; (tick < Timecode::BBT_Time::ticks_per_beat) && (n < bbt_nmarks) && (pos < next_beat_pos) ; pos += frame_skip, tick += skip, ++t) {
-
- if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
- i_am_accented = true;
+ if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
+ i_am_accented = true;
}
-
if (i_am_accented && (pos > bbt_position_of_helper)){
snprintf (buf, sizeof(buf), "%" PRIu32, tick);
} else {
@@ -1393,14 +1357,6 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
}
mark.label = buf;
-
- /* Error compensation for float to framepos_t*/
- accumulated_error += frame_skip_error;
- if (accumulated_error > 1) {
- pos += 1;
- accumulated_error -= 1.0f;
- }
-
mark.position = pos;
if ((bbt_beat_subdivision > 4) && i_am_accented) {
@@ -1409,7 +1365,11 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
mark.style = ArdourCanvas::Ruler::Mark::Micro;
}
i_am_accented = false;
- n++;
+ marks.push_back (mark);
+
+ tick += skip;
+ ++t;
+ ++n;
}
}
@@ -1417,17 +1377,17 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
case bbt_show_ticks_super_detail:
- beats = distance (begin, end);
+ beats = distance (grid.begin(), grid.end());
bbt_nmarks = (beats + 2) * bbt_beat_subdivision;
- bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ());
+ bbt_position_of_helper = lower + (3 * Editor::get_current_zoom ());
mark.label = "";
mark.position = lower;
mark.style = ArdourCanvas::Ruler::Mark::Micro;
marks.push_back (mark);
- for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) {
+ for (n = 1, i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
if ((*i).frame < lower && (bbt_bar_helper_on)) {
snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1452,61 +1412,40 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
}
/* Add the tick marks */
-
- /* Find the next beat */
+ skip = Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision;
next_beat.beats = (*i).beat;
next_beat.bars = (*i).bar;
+ tick = skip; // the first non-beat tick
+ t = 0;
+ while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
- if ((*i).meter->divisions_per_bar() > (next_beat.beats + 1)) {
- next_beat.beats += 1;
- } else {
- next_beat.bars += 1;
- next_beat.beats = 1;
- }
-
- next_beat_pos = _session->tempo_map().frame_time(next_beat);
-
- frame_skip = (framepos_t) floor (frame_skip_error = (_session->frame_rate() * 60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
- frame_skip_error -= frame_skip;
- skip = (uint32_t) (Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision);
-
- pos = (*i).frame + frame_skip;
- accumulated_error = frame_skip_error;
-
- tick = skip;
-
- for (t = 0; (tick < Timecode::BBT_Time::ticks_per_beat) && (n < bbt_nmarks) && (pos < next_beat_pos) ; pos += frame_skip, tick += skip, ++t) {
-
- if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
- i_am_accented = true;
- }
-
- if (pos > bbt_position_of_helper) {
- snprintf (buf, sizeof(buf), "%" PRIu32, tick);
- } else {
- buf[0] = '\0';
- }
+ next_beat.ticks = tick;
+ pos = _session->tempo_map().frame_at_bbt (next_beat);
+ if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
+ i_am_accented = true;
+ }
- mark.label = buf;
+ if (pos > bbt_position_of_helper) {
+ snprintf (buf, sizeof(buf), "%" PRIu32, tick);
+ } else {
+ buf[0] = '\0';
+ }
- /* Error compensation for float to framepos_t*/
- accumulated_error += frame_skip_error;
- if (accumulated_error > 1) {
- pos += 1;
- accumulated_error -= 1.0f;
- }
+ mark.label = buf;
+ mark.position = pos;
- mark.position = pos;
+ if ((bbt_beat_subdivision > 4) && i_am_accented) {
+ mark.style = ArdourCanvas::Ruler::Mark::Minor;
+ } else {
+ mark.style = ArdourCanvas::Ruler::Mark::Micro;
+ }
+ i_am_accented = false;
+ marks.push_back (mark);
- if ((bbt_beat_subdivision > 4) && i_am_accented) {
- mark.style = ArdourCanvas::Ruler::Mark::Minor;
- } else {
- mark.style = ArdourCanvas::Ruler::Mark::Micro;
- }
- i_am_accented = false;
- marks.push_back (mark);
- n++;
+ tick += skip;
+ ++t;
+ ++n;
}
}
@@ -1523,7 +1462,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
case bbt_show_64:
bbt_nmarks = (gint) (bbt_bars / 64) + 1;
- for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) {
+ for (n = 0, i = grid.begin(); i != grid.end() && n < bbt_nmarks; i++) {
if ((*i).is_bar()) {
if ((*i).bar % 64 == 1) {
if ((*i).bar % 256 == 1) {
@@ -1548,7 +1487,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
case bbt_show_16:
bbt_nmarks = (bbt_bars / 16) + 1;
- for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) {
+ for (n = 0, i = grid.begin(); i != grid.end() && n < bbt_nmarks; i++) {
if ((*i).is_bar()) {
if ((*i).bar % 16 == 1) {
if ((*i).bar % 64 == 1) {
@@ -1573,7 +1512,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
case bbt_show_4:
bbt_nmarks = (bbt_bars / 4) + 1;
- for (n = 0, i = begin; i != end && n < bbt_nmarks; ++i) {
+ for (n = 0, i = grid.begin(); i != grid.end() && n < bbt_nmarks; ++i) {
if ((*i).is_bar()) {
if ((*i).bar % 4 == 1) {
if ((*i).bar % 16 == 1) {
@@ -1599,7 +1538,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
case bbt_show_1:
// default:
bbt_nmarks = bbt_bars + 2;
- for (n = 0, i = begin; i != end && n < bbt_nmarks; ++i) {
+ for (n = 0, i = grid.begin(); i != grid.end() && n < bbt_nmarks; ++i) {
if ((*i).is_bar()) {
if ((*i).bar % 4 == 1) {
snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar);
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index afddfad..c5ba764 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -43,7 +43,7 @@
#include "midi_region_view.h"
#include "sfdb_ui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -621,7 +621,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
if (press) {
if (selection->selected (clicked_routeview)) {
- get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+ get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id);
} else {
all_equivalent_regions.push_back (clicked_regionview);
}
@@ -639,7 +639,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
case Selection::Set:
if (!selection->selected (clicked_regionview)) {
- get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+ get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id);
selection->set (all_equivalent_regions);
commit = true;
} else {
@@ -649,7 +649,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
else {
if (selection->regions.size() > 1) {
/* collapse region selection down to just this one region (and its equivalents) */
- get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+ get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id);
selection->set(all_equivalent_regions);
commit = true;
}
@@ -791,7 +791,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
RouteTimeAxisView* closest = 0;
int distance = INT_MAX;
- int key = rtv->route()->order_key ();
+ int key = rtv->route()->presentation_info().order ();
for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
@@ -806,7 +806,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
if (result.second) {
/* newly added to already_in_selection */
- int d = artv->route()->order_key ();
+ int d = artv->route()->presentation_info().order ();
d -= key;
@@ -822,7 +822,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
/* now add all tracks between that one and this one */
- int okey = closest->route()->order_key ();
+ int okey = closest->route()->presentation_info().order ();
if (okey > key) {
swap (okey, key);
@@ -832,7 +832,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
RouteTimeAxisView* artv = dynamic_cast<RouteTimeAxisView*>(*x);
if (artv && artv != rtv) {
- int k = artv->route()->order_key ();
+ int k = artv->route()->presentation_info().order ();
if (k >= okey && k <= key) {
@@ -962,6 +962,7 @@ Editor::track_selection_changed ()
}
RouteNotificationListPtr routes (new RouteNotificationList);
+ StripableNotificationListPtr stripables (new StripableNotificationList);
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
@@ -985,6 +986,7 @@ Editor::track_selection_changed ()
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
if (rtav) {
routes->push_back (rtav->route());
+ stripables->push_back (rtav->route());
}
}
}
@@ -993,7 +995,7 @@ Editor::track_selection_changed ()
/* notify control protocols */
- ControlProtocol::TrackSelectionChanged (routes);
+ ControlProtocol::StripableSelectionChanged (stripables);
if (sfbrowser && _session && !_session->deletion_in_progress()) {
uint32_t audio_track_cnt = 0;
@@ -1025,10 +1027,6 @@ Editor::track_selection_changed ()
void
Editor::time_selection_changed ()
{
- if (Profile->get_sae()) {
- return;
- }
-
/* XXX this is superficially inefficient. Hide the selection in all
* tracks, then show it in all selected tracks.
*
@@ -1090,7 +1088,6 @@ Editor::sensitize_all_region_actions (bool s)
void
Editor::sensitize_the_right_region_actions ()
{
-
RegionSelection rs = get_regions_from_selection_and_entered ();
sensitize_all_region_actions (!rs.empty ());
@@ -1120,6 +1117,7 @@ Editor::sensitize_the_right_region_actions ()
bool have_inactive_fade_out = false;
bool have_active_fade_in = false;
bool have_active_fade_out = false;
+ bool have_transients = false;
for (list<RegionView*>::const_iterator i = rs.begin(); i != rs.end(); ++i) {
@@ -1175,6 +1173,10 @@ Editor::sensitize_the_right_region_actions ()
have_not_at_natural_position = true;
}
+ if (r->has_transients ()){
+ have_transients = true;
+ }
+
if (ar) {
if (ar->envelope_active()) {
have_envelope_active = true;
@@ -1200,6 +1202,8 @@ Editor::sensitize_the_right_region_actions ()
}
}
+ _region_actions->get_action("split-region-at-transients")->set_sensitive (have_transients);
+
if (rs.size() > 1) {
_region_actions->get_action("show-region-list-editor")->set_sensitive (false);
_region_actions->get_action("show-region-properties")->set_sensitive (false);
@@ -1262,7 +1266,8 @@ Editor::sensitize_the_right_region_actions ()
} else {
- _region_actions->get_action("analyze-region")->set_sensitive (false);
+ _region_actions->get_action("loudness-analyze-region")->set_sensitive (false);
+ _region_actions->get_action("spectral-analyze-region")->set_sensitive (false);
_region_actions->get_action("reset-region-gain-envelopes")->set_sensitive (false);
_region_actions->get_action("toggle-region-gain-envelope-active")->set_sensitive (false);
_region_actions->get_action("pitch-shift-region")->set_sensitive (false);
@@ -1367,11 +1372,15 @@ Editor::region_selection_changed ()
_regions->block_change_connection (false);
editor_regions_selection_changed_connection.block(false);
- if (!_all_region_actions_sensitized) {
- /* This selection change might have changed what region actions
- are allowed, so sensitize them all in case a key is pressed.
- */
- sensitize_all_region_actions (true);
+ if (selection->regions.empty()) {
+ sensitize_all_region_actions (false);
+ } else {
+ if (!_all_region_actions_sensitized) {
+ /* This selection change might have changed what region actions
+ are allowed, so sensitize them all in case a key is pressed.
+ */
+ sensitize_all_region_actions (true);
+ }
}
if (_session && !_session->transport_rolling() && !selection->regions.empty()) {
@@ -1560,7 +1569,7 @@ Editor::select_all_within (framepos_t start, framepos_t end, double top, double
if (preserve_if_selected && op != Selection::Toggle) {
list<Selectable*>::iterator i = found.begin();
- while (i != found.end() && (*i)->get_selected()) {
+ while (i != found.end() && (*i)->selected()) {
++i;
}
@@ -1614,9 +1623,7 @@ Editor::set_selection_from_region ()
selection->set (tvl);
- if (!Profile->get_sae()) {
- set_mouse_mode (Editing::MouseRange, false);
- }
+ set_mouse_mode (Editing::MouseRange, false);
}
void
@@ -1649,9 +1656,7 @@ Editor::set_selection_from_range (Location& loc)
selection->set (loc.start(), loc.end());
commit_reversible_selection_op ();
- if (!Profile->get_sae()) {
- set_mouse_mode (Editing::MouseRange, false);
- }
+ set_mouse_mode (Editing::MouseRange, false);
}
void
diff --git a/gtk2_ardour/editor_snapshots.cc b/gtk2_ardour/editor_snapshots.cc
index f79a442..b90737c 100644
--- a/gtk2_ardour/editor_snapshots.cc
+++ b/gtk2_ardour/editor_snapshots.cc
@@ -35,7 +35,7 @@
#include "editor_snapshots.h"
#include "ardour_ui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "utils.h"
#include "prompter.h"
diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc
index ba03d91..a2882a2 100644
--- a/gtk2_ardour/editor_summary.cc
+++ b/gtk2_ardour/editor_summary.cc
@@ -107,7 +107,7 @@ EditorSummary::set_session (Session* s)
if (_session) {
Region::RegionPropertyChanged.connect (region_property_connection, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
- Route::RemoteControlIDChange.connect (route_ctrl_id_connection, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
+ PresentationInfo::Change.connect (route_ctrl_id_connection, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
_editor->playhead_cursor->PositionChanged.connect (position_connection, invalidator (*this), boost::bind (&EditorSummary::playhead_position_changed, this, _1), gui_context());
_session->StartTimeChanged.connect (_session_connections, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
_session->EndTimeChanged.connect (_session_connections, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
@@ -293,8 +293,10 @@ EditorSummary::render_region (RegionView* r, cairo_t* cr, double y) const
void
EditorSummary::set_background_dirty ()
{
- _background_dirty = true;
- set_dirty ();
+ if (!_background_dirty) {
+ _background_dirty = true;
+ set_dirty ();
+ }
}
/** Set the summary so that just the overlays (viewbox, playhead etc.) will be re-rendered */
@@ -1050,8 +1052,8 @@ void
EditorSummary::routes_added (list<RouteTimeAxisView*> const & r)
{
for (list<RouteTimeAxisView*>::const_iterator i = r.begin(); i != r.end(); ++i) {
- /* Connect to gui_changed() on the route so that we know when their colour has changed */
- (*i)->route()->gui_changed.connect (*this, invalidator (*this), boost::bind (&EditorSummary::route_gui_changed, this, _1), gui_context ());
+ /* Connect to the relevant signal for the route so that we know when its colour has changed */
+ (*i)->route()->presentation_info().PropertyChanged.connect (*this, invalidator (*this), boost::bind (&EditorSummary::route_gui_changed, this, _1), gui_context ());
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> ((*i)->route ());
if (tr) {
tr->PlaylistChanged.connect (*this, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context ());
@@ -1062,9 +1064,9 @@ EditorSummary::routes_added (list<RouteTimeAxisView*> const & r)
}
void
-EditorSummary::route_gui_changed (string c)
+EditorSummary::route_gui_changed (PBD::PropertyChange const& what_changed)
{
- if (c == "color") {
+ if (what_changed.contains (Properties::color)) {
set_background_dirty ();
}
}
diff --git a/gtk2_ardour/editor_summary.h b/gtk2_ardour/editor_summary.h
index e95406f..4fb406a 100644
--- a/gtk2_ardour/editor_summary.h
+++ b/gtk2_ardour/editor_summary.h
@@ -88,7 +88,7 @@ private:
double editor_y_to_summary (double) const;
Position get_position (double, double) const;
void set_cursor (Position);
- void route_gui_changed (std::string);
+ void route_gui_changed (PBD::PropertyChange const&);
bool suspending_editor_updates () const;
double playhead_frame_to_position (framepos_t) const;
framepos_t position_to_playhead_frame_to_position (double pos) const;
diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc
index 38685e5..722490c 100644
--- a/gtk2_ardour/editor_tempodisplay.cc
+++ b/gtk2_ardour/editor_tempodisplay.cc
@@ -51,7 +51,7 @@
#include "tempo_lines.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -69,19 +69,25 @@ Editor::remove_metric_marks ()
delete_when_idle (*x);
}
metric_marks.clear ();
+
+ for (Curves::iterator x = tempo_curves.begin(); x != tempo_curves.end(); ++x) {
+ delete (*x);
+ }
+ tempo_curves.clear ();
}
void
Editor::draw_metric_marks (const Metrics& metrics)
{
-
- const MeterSection *ms;
- const TempoSection *ts;
char buf[64];
+ double max_tempo = 0.0;
+ double min_tempo = DBL_MAX;
- remove_metric_marks ();
+ remove_metric_marks (); // also clears tempo curves
for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ const MeterSection *ms;
+ const TempoSection *ts;
if ((ms = dynamic_cast<const MeterSection*>(*i)) != 0) {
snprintf (buf, sizeof(buf), "%g/%g", ms->divisions_per_bar(), ms->note_divisor ());
@@ -89,18 +95,59 @@ Editor::draw_metric_marks (const Metrics& metrics)
*(const_cast<MeterSection*>(ms))));
} else if ((ts = dynamic_cast<const TempoSection*>(*i)) != 0) {
if (UIConfiguration::instance().get_allow_non_quarter_pulse()) {
- snprintf (buf, sizeof (buf), "%.2f/%.0f", ts->beats_per_minute(), ts->note_type());
+ snprintf (buf, sizeof (buf), "%.3f/%.0f", ts->beats_per_minute(), ts->note_type());
} else {
- snprintf (buf, sizeof (buf), "%.2f", ts->beats_per_minute());
+ snprintf (buf, sizeof (buf), "%.3f", ts->beats_per_minute());
}
- metric_marks.push_back (new TempoMarker (*this, *tempo_group, UIConfiguration::instance().color ("tempo marker"), buf,
+
+ max_tempo = max (max_tempo, ts->beats_per_minute());
+ min_tempo = min (min_tempo, ts->beats_per_minute());
+
+ tempo_curves.push_back (new TempoCurve (*this, *tempo_group, UIConfiguration::instance().color ("tempo curve"),
+ *(const_cast<TempoSection*>(ts)), ts->frame(), false));
+ if (ts->position_lock_style() == MusicTime) {
+ metric_marks.push_back (new TempoMarker (*this, *tempo_group, UIConfiguration::instance().color ("tempo marker music"), buf,
+ *(const_cast<TempoSection*>(ts))));
+ } else {
+ metric_marks.push_back (new TempoMarker (*this, *tempo_group, UIConfiguration::instance().color ("tempo marker"), buf,
*(const_cast<TempoSection*>(ts))));
+ }
+
}
}
+ const double min_tempo_range = 5.0;
+ const double tempo_delta = fabs (max_tempo - min_tempo);
+
+ if (tempo_delta < min_tempo_range) {
+ max_tempo += min_tempo_range - tempo_delta;
+ min_tempo += tempo_delta - min_tempo_range;
+ }
+
+ for (Curves::iterator x = tempo_curves.begin(); x != tempo_curves.end(); ) {
+ Curves::iterator tmp = x;
+ (*x)->set_max_tempo (max_tempo);
+ (*x)->set_min_tempo (min_tempo);
+ ++tmp;
+ if (tmp != tempo_curves.end()) {
+ (*x)->set_position ((*x)->tempo().frame(), (*tmp)->tempo().frame());
+ } else {
+ (*x)->set_position ((*x)->tempo().frame(), UINT32_MAX);
+ }
+ ++x;
+ }
+
+ for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) {
+ TempoMarker* tempo_marker;
+
+ if ((tempo_marker = dynamic_cast<TempoMarker*> (*x)) != 0) {
+ tempo_marker->update_height_mark ((tempo_marker->tempo().beats_per_minute() - min_tempo) / max (10.0, max_tempo - min_tempo));
+ }
+ }
}
+
void
Editor::tempo_map_changed (const PropertyChange& /*ignored*/)
{
@@ -114,13 +161,93 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/)
tempo_lines->tempo_map_changed();
}
- ARDOUR::TempoMap::BBTPointList::const_iterator begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator end;
-
- compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end);
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
_session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
- draw_measures (begin, end);
- update_tempo_based_rulers (begin, end);
+ draw_measures (grid);
+ update_tempo_based_rulers (grid);
+}
+
+struct CurveComparator {
+ bool operator() (TempoCurve const * a, TempoCurve const * b) {
+ return a->position() < b->position();
+ }
+};
+
+void
+Editor::marker_position_changed ()
+{
+ if (!_session) {
+ return;
+ }
+
+ ENSURE_GUI_THREAD (*this, &Editor::tempo_map_changed);
+
+ if (tempo_lines) {
+ tempo_lines->tempo_map_changed();
+ }
+
+ double max_tempo = 0.0;
+ double min_tempo = DBL_MAX;
+
+ for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) {
+ TempoMarker* tempo_marker;
+ MeterMarker* meter_marker;
+ const TempoSection *ts;
+ const MeterSection *ms;
+
+ if ((tempo_marker = dynamic_cast<TempoMarker*> (*x)) != 0) {
+ if ((ts = &tempo_marker->tempo()) != 0) {
+ tempo_marker->set_position (ts->frame ());
+ char buf[64];
+ snprintf (buf, sizeof (buf), "%.3f", ts->beats_per_minute());
+ tempo_marker->set_name (buf);
+
+ max_tempo = max (max_tempo, ts->beats_per_minute());
+ min_tempo = min (min_tempo, ts->beats_per_minute());
+ }
+ }
+ if ((meter_marker = dynamic_cast<MeterMarker*> (*x)) != 0) {
+ if ((ms = &meter_marker->meter()) != 0) {
+ meter_marker->set_position (ms->frame ());
+ }
+ }
+ }
+
+ tempo_curves.sort (CurveComparator());
+
+ const double min_tempo_range = 5.0;
+ const double tempo_delta = fabs (max_tempo - min_tempo);
+
+ if (tempo_delta < min_tempo_range) {
+ max_tempo += min_tempo_range - tempo_delta;
+ min_tempo += tempo_delta - min_tempo_range;
+ }
+
+ for (Curves::iterator x = tempo_curves.begin(); x != tempo_curves.end(); ) {
+ Curves::iterator tmp = x;
+ (*x)->set_max_tempo (max_tempo);
+ (*x)->set_min_tempo (min_tempo);
+ ++tmp;
+ if (tmp != tempo_curves.end()) {
+ (*x)->set_position ((*x)->tempo().frame(), (*tmp)->tempo().frame());
+ } else {
+ (*x)->set_position ((*x)->tempo().frame(), UINT32_MAX);
+ }
+ ++x;
+ }
+
+ for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) {
+ TempoMarker* tempo_marker;
+ if ((tempo_marker = dynamic_cast<TempoMarker*> (*x)) != 0) {
+ tempo_marker->update_height_mark ((tempo_marker->tempo().beats_per_minute() - min_tempo) / max (max_tempo - min_tempo, 10.0));
+ }
+ }
+
+ std::vector<TempoMap::BBTPoint> grid;
+ compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ draw_measures (grid);
+ update_tempo_based_rulers (grid);
}
void
@@ -131,23 +258,20 @@ Editor::redisplay_tempo (bool immediate_redraw)
}
if (immediate_redraw) {
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
+ std::vector<TempoMap::BBTPoint> grid;
- compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(),
- current_bbt_points_begin, current_bbt_points_end);
- draw_measures (current_bbt_points_begin, current_bbt_points_end);
- update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end); // redraw rulers and measures
+ compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+ draw_measures (grid);
+ update_tempo_based_rulers (grid); // redraw rulers and measure lines
} else {
Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::mem_fun (*this, &Editor::redisplay_tempo), true), false));
}
}
+/* computes a grid starting a beat before and ending a beat after leftmost and rightmost respectively */
void
-Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost,
- ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end)
+Editor::compute_current_bbt_points (std::vector<TempoMap::BBTPoint>& grid, framepos_t leftmost, framepos_t rightmost)
{
if (!_session) {
return;
@@ -155,8 +279,8 @@ Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost,
/* prevent negative values of leftmost from creeping into tempomap
*/
-
- _session->tempo_map().get_grid (begin, end, max (leftmost, (framepos_t) 0), rightmost);
+ const double lower_beat = floor (_session->tempo_map().beat_at_frame (leftmost)) - 1.0;
+ _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost);
}
void
@@ -168,10 +292,9 @@ Editor::hide_measures ()
}
void
-Editor::draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end)
+Editor::draw_measures (std::vector<ARDOUR::TempoMap::BBTPoint>& grid)
{
- if (_session == 0 || _show_measures == false || distance (begin, end) == 0) {
+ if (_session == 0 || _show_measures == false || distance (grid.begin(), grid.end()) == 0) {
return;
}
@@ -180,7 +303,7 @@ Editor::draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
}
const unsigned divisions = get_grid_beat_divisions(leftmost_frame);
- tempo_lines->draw (begin, end, divisions, leftmost_frame, _session->frame_rate());
+ tempo_lines->draw (grid, divisions, leftmost_frame, _session->frame_rate());
}
void
@@ -191,33 +314,19 @@ Editor::mouse_add_new_tempo_event (framepos_t frame)
}
TempoMap& map(_session->tempo_map());
- TempoDialog tempo_dialog (map, frame, _("add"));
- //this causes compiz to display no border.
- //tempo_dialog.signal_realize().connect (sigc::bind (sigc::ptr_fun (set_decoration), &tempo_dialog, Gdk::WMDecoration (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
-
- switch (tempo_dialog.run()) {
- case RESPONSE_ACCEPT:
- break;
- default:
- return;
- }
-
- double bpm = 0;
- Timecode::BBT_Time requested;
-
- bpm = tempo_dialog.get_bpm ();
- double nt = tempo_dialog.get_note_type();
- bpm = max (0.01, bpm);
+ begin_reversible_command (_("add tempo mark"));
+ const double pulse = map.pulse_at_frame (frame);
- tempo_dialog.get_bbt_time (requested);
+ if (pulse > 0.0) {
+ XMLNode &before = map.get_state();
+ /* add music-locked ramped (?) tempo using the bpm/note type at frame*/
+ map.add_tempo (map.tempo_at_frame (frame), pulse, 0, TempoSection::Ramp, MusicTime);
- begin_reversible_command (_("add tempo mark"));
- XMLNode &before = map.get_state();
- map.add_tempo (Tempo (bpm,nt), requested);
- XMLNode &after = map.get_state();
- _session->add_command(new MementoCommand<TempoMap>(map, &before, &after));
- commit_reversible_command ();
+ XMLNode &after = map.get_state();
+ _session->add_command(new MementoCommand<TempoMap>(map, &before, &after));
+ commit_reversible_command ();
+ }
//map.dump (cerr);
}
@@ -233,9 +342,6 @@ Editor::mouse_add_new_meter_event (framepos_t frame)
TempoMap& map(_session->tempo_map());
MeterDialog meter_dialog (map, frame, _("add"));
- //this causes compiz to display no border..
- //meter_dialog.signal_realize().connect (sigc::bind (sigc::ptr_fun (set_decoration), &meter_dialog, Gdk::WMDecoration (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
-
switch (meter_dialog.run ()) {
case RESPONSE_ACCEPT:
break;
@@ -247,13 +353,21 @@ Editor::mouse_add_new_meter_event (framepos_t frame)
bpb = max (1.0, bpb); // XXX is this a reasonable limit?
double note_type = meter_dialog.get_note_type ();
- Timecode::BBT_Time requested;
+ Timecode::BBT_Time requested;
meter_dialog.get_bbt_time (requested);
+ const double beat = map.beat_at_bbt (requested);
+
begin_reversible_command (_("add meter mark"));
XMLNode &before = map.get_state();
- map.add_meter (Meter (bpb, note_type), requested);
+
+ if (meter_dialog.get_lock_style() == MusicTime) {
+ map.add_meter (Meter (bpb, note_type), beat, requested, map.frame_at_beat (beat), MusicTime);
+ } else {
+ map.add_meter (Meter (bpb, note_type), beat, requested, map.frame_at_beat (beat), AudioTime);
+ }
+
_session->add_command(new MementoCommand<TempoMap>(map, &before, &map.get_state()));
commit_reversible_command ();
@@ -284,7 +398,7 @@ Editor::remove_tempo_marker (ArdourCanvas::Item* item)
void
Editor::edit_meter_section (MeterSection* section)
{
- MeterDialog meter_dialog (*section, _("done"));
+ MeterDialog meter_dialog (_session->tempo_map(), *section, _("done"));
switch (meter_dialog.run()) {
case RESPONSE_ACCEPT:
@@ -296,15 +410,21 @@ Editor::edit_meter_section (MeterSection* section)
double bpb = meter_dialog.get_bpb ();
bpb = max (1.0, bpb); // XXX is this a reasonable limit?
- double note_type = meter_dialog.get_note_type ();
+ double const note_type = meter_dialog.get_note_type ();
+ const Meter meter (bpb, note_type);
Timecode::BBT_Time when;
- meter_dialog.get_bbt_time(when);
+ meter_dialog.get_bbt_time (when);
- begin_reversible_command (_("replace tempo mark"));
+ framepos_t const frame = _session->tempo_map().frame_at_bbt (when);
+ const PositionLockStyle pls = (meter_dialog.get_lock_style() == AudioTime) ? AudioTime : MusicTime;
+
+ begin_reversible_command (_("replace meter mark"));
XMLNode &before = _session->tempo_map().get_state();
- _session->tempo_map().replace_meter (*section, Meter (bpb, note_type), when);
- XMLNode &after = _session->tempo_map().get_state();
+
+ _session->tempo_map().replace_meter (*section, meter, when, frame, pls);
+
+ XMLNode &after = _session->tempo_map().get_state();
_session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
commit_reversible_command ();
}
@@ -312,7 +432,7 @@ Editor::edit_meter_section (MeterSection* section)
void
Editor::edit_tempo_section (TempoSection* section)
{
- TempoDialog tempo_dialog (*section, _("done"));
+ TempoDialog tempo_dialog (_session->tempo_map(), *section, _("done"));
switch (tempo_dialog.run ()) {
case RESPONSE_ACCEPT:
@@ -323,13 +443,25 @@ Editor::edit_tempo_section (TempoSection* section)
double bpm = tempo_dialog.get_bpm ();
double nt = tempo_dialog.get_note_type ();
- Timecode::BBT_Time when;
- tempo_dialog.get_bbt_time(when);
bpm = max (0.01, bpm);
+ const Tempo tempo (bpm, nt);
+
+ Timecode::BBT_Time when;
+ tempo_dialog.get_bbt_time (when);
+
+ const TempoSection::Type ttype (tempo_dialog.get_tempo_type());
begin_reversible_command (_("replace tempo mark"));
XMLNode &before = _session->tempo_map().get_state();
- _session->tempo_map().replace_tempo (*section, Tempo (bpm, nt), when);
+
+ if (tempo_dialog.get_lock_style() == AudioTime) {
+ framepos_t const f = _session->tempo_map().predict_tempo_position (section, when).second;
+ _session->tempo_map().replace_tempo (*section, tempo, 0.0, f, ttype, AudioTime);
+ } else {
+ double const p = _session->tempo_map().predict_tempo_position (section, when).first;
+ _session->tempo_map().replace_tempo (*section, tempo, p, 0, ttype, MusicTime);
+ }
+
XMLNode &after = _session->tempo_map().get_state();
_session->add_command (new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
commit_reversible_command ();
diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc
index d78340d..067cfef 100644
--- a/gtk2_ardour/editor_timefx.cc
+++ b/gtk2_ardour/editor_timefx.cc
@@ -29,6 +29,13 @@
#include "pbd/memento_command.h"
#include "pbd/stateful_diff_command.h"
+#include "ardour/audioregion.h"
+#include "ardour/midi_stretch.h"
+#include "ardour/pitch.h"
+#include "ardour/region.h"
+#include "ardour/session.h"
+#include "ardour/stretch.h"
+
#include <gtkmm2ext/utils.h>
#include "audio_region_view.h"
@@ -37,19 +44,12 @@
#include "region_selection.h"
#include "time_fx_dialog.h"
-#include "ardour/audioregion.h"
-#include "ardour/midi_stretch.h"
-#include "ardour/pitch.h"
-#include "ardour/region.h"
-#include "ardour/session.h"
-#include "ardour/stretch.h"
-
#ifdef USE_RUBBERBAND
#include <rubberband/RubberBandStretcher.h>
using namespace RubberBand;
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -146,22 +146,18 @@ Editor::pitch_shift (RegionSelection& regions, float fraction)
int
Editor::time_fx (RegionList& regions, float val, bool pitching)
{
- delete current_timefx;
- current_timefx = new TimeFXDialog (*this, pitching);
- current_timefx->regions = regions;
-
- /* See if we have any audio regions on our list */
- RegionList::iterator i = regions.begin ();
- while (i != regions.end() && boost::dynamic_pointer_cast<AudioRegion> (*i) == 0) {
- ++i;
- }
-
- if (i == regions.end ()) {
- /* No audio regions; we can just do the timefx without a dialogue */
- do_timefx ();
+ if (regions.empty()) {
return 0;
}
+ const framecnt_t oldlen = (framecnt_t) (regions.front()->length());
+ const framecnt_t newlen = (framecnt_t) (regions.front()->length() * val);
+ const framecnt_t pos = regions.front()->position ();
+
+ delete current_timefx;
+ current_timefx = new TimeFXDialog (*this, pitching, oldlen, newlen, pos);
+ current_timefx->regions = regions;
+
switch (current_timefx->run ()) {
case RESPONSE_ACCEPT:
break;
@@ -171,34 +167,14 @@ Editor::time_fx (RegionList& regions, float val, bool pitching)
}
current_timefx->status = 0;
+ current_timefx->request.time_fraction = current_timefx->get_time_fraction ();
+ current_timefx->request.pitch_fraction = current_timefx->get_pitch_fraction ();
- if (pitching) {
-
- float cents = current_timefx->pitch_octave_adjustment.get_value() * 1200.0;
- float pitch_fraction;
- cents += current_timefx->pitch_semitone_adjustment.get_value() * 100.0;
- cents += current_timefx->pitch_cent_adjustment.get_value();
-
- if (cents == 0.0) {
- // user didn't change anything
- current_timefx->hide ();
- return 0;
- }
-
- // one octave == 1200 cents
- // adding one octave doubles the frequency
- // ratio is 2^^octaves
-
- pitch_fraction = pow(2, cents/1200);
-
- current_timefx->request.time_fraction = 1.0;
- current_timefx->request.pitch_fraction = pitch_fraction;
-
- } else {
-
- current_timefx->request.time_fraction = val;
- current_timefx->request.pitch_fraction = 1.0;
-
+ if (current_timefx->request.time_fraction == 1.0 &&
+ current_timefx->request.pitch_fraction == 1.0) {
+ /* nothing to do */
+ current_timefx->hide ();
+ return 0;
}
#ifdef USE_RUBBERBAND
@@ -299,6 +275,8 @@ Editor::time_fx (RegionList& regions, float val, bool pitching)
current_timefx->first_delete = current_timefx->signal_delete_event().connect
(sigc::mem_fun (current_timefx, &TimeFXDialog::delete_in_progress));
+ current_timefx->start_updates ();
+
if (pthread_create_and_store ("timefx", ¤t_timefx->request.thread, timefx_thread, current_timefx)) {
current_timefx->hide ();
error << _("timefx cannot be started - thread creation error") << endmsg;
@@ -413,4 +391,3 @@ Editor::timefx_thread (void *arg)
#endif
return 0;
}
-
diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc
index 65c4fc7..e5f5db3 100644
--- a/gtk2_ardour/editor_videotimeline.cc
+++ b/gtk2_ardour/editor_videotimeline.cc
@@ -35,7 +35,7 @@
#include "interthread_progress_window.h"
#include "pbd/openuri.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index 762d162..4f03e92 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -53,7 +53,7 @@
#include "engine_dialog.h"
#include "gui_thread.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -307,13 +307,18 @@ EngineControl::EngineControl ()
set_default_state ();
}
+ update_sensitivity ();
connect_changed_signals ();
notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page));
connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click));
- connect_disconnect_button.set_no_show_all();
+ connect_disconnect_button.set_no_show_all();
+ use_buffered_io_button.set_no_show_all();
+ update_devices_button.set_no_show_all();
+ start_stop_button.set_no_show_all();
+ midi_devices_button.set_no_show_all();
}
void
@@ -419,6 +424,18 @@ EngineControl::on_show ()
}
bool
+EngineControl::try_autostart ()
+{
+ if (!start_stop_button.get_sensitive()) {
+ return false;
+ }
+ if (ARDOUR::AudioEngine::instance()->running()) {
+ return true;
+ }
+ return start_engine ();
+}
+
+bool
EngineControl::start_engine ()
{
if (push_state_to_backend(true) != 0) {
@@ -1579,12 +1596,7 @@ EngineControl::output_device_changed ()
string
EngineControl::bufsize_as_string (uint32_t sz)
{
- /* Translators: "samples" is always plural here, so no
- need for plural+singular forms.
- */
- char buf[64];
- snprintf (buf, sizeof (buf), "%u %s", sz, P_("sample", "samples", sz));
- return buf;
+ return string_compose (P_("%1 sample", "%1 samples", sz), sz);
}
string
@@ -1883,7 +1895,7 @@ EngineControl::maybe_display_saved_state ()
XMLNode&
EngineControl::get_state ()
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNode* root = new XMLNode ("AudioMIDISetup");
std::string path;
@@ -1953,11 +1965,9 @@ EngineControl::set_state (const XMLNode& root)
{
XMLNodeList clist, cclist;
XMLNodeConstIterator citer, cciter;
- XMLNode* child;
- XMLNode* grandchild;
- XMLProperty* prop = NULL;
-
- fprintf (stderr, "EngineControl::set_state\n");
+ XMLNode const * child;
+ XMLNode const * grandchild;
+ XMLProperty const * prop = NULL;
if (root.name() != "AudioMIDISetup") {
return false;
@@ -2225,7 +2235,9 @@ EngineControl::set_current_state (const State& state)
device_combo.set_active_text (state->device);
input_device_combo.set_active_text (state->input_device);
output_device_combo.set_active_text (state->output_device);
- sample_rate_combo.set_active_text (rate_as_string (state->sample_rate));
+ if (!_desired_sample_rate) {
+ sample_rate_combo.set_active_text (rate_as_string (state->sample_rate));
+ }
set_active_text_if_present (buffer_size_combo, bufsize_as_string (state->buffer_size));
set_active_text_if_present (nperiods_combo, nperiods_as_string (state->n_periods));
input_latency.set_value (state->input_latency);
@@ -2350,6 +2362,8 @@ EngineControl::push_state_to_backend (bool start)
change_channels = true;
change_latency = true;
change_midi = true;
+ change_buffered_io = backend->can_use_buffered_io();
+ change_channels = true;
change_nperiods = backend->can_set_period_size() && get_popdown_string_count (nperiods_combo) > 0;
}
@@ -2411,7 +2425,7 @@ EngineControl::push_state_to_backend (bool start)
if (change_driver || change_device || change_channels || change_nperiods ||
(change_latency && !backend->can_change_systemic_latency_when_running ()) ||
(change_rate && !backend->can_change_sample_rate_when_running()) ||
- change_midi ||
+ change_midi || change_buffered_io ||
(change_bufsize && !backend->can_change_buffer_size_when_running())) {
restart_required = true;
} else {
@@ -2754,6 +2768,10 @@ void
EngineControl::set_desired_sample_rate (uint32_t sr)
{
_desired_sample_rate = sr;
+ if (ARDOUR::AudioEngine::instance ()->running ()
+ && ARDOUR::AudioEngine::instance ()->sample_rate () != sr) {
+ stop_engine ();
+ }
device_changed ();
}
diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h
index faf12d7..8f47f2b 100644
--- a/gtk2_ardour/engine_dialog.h
+++ b/gtk2_ardour/engine_dialog.h
@@ -49,6 +49,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
bool set_state (const XMLNode&);
void set_desired_sample_rate (uint32_t);
+ bool try_autostart ();
private:
Gtk::Notebook notebook;
diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc
index 4cae1f5..4f8a348 100644
--- a/gtk2_ardour/enums.cc
+++ b/gtk2_ardour/enums.cc
@@ -150,6 +150,7 @@ setup_gtk_ardour_enums ()
REGISTER_ENUM (GainLineItem);
REGISTER_ENUM (AutomationLineItem);
REGISTER_ENUM (MeterMarkerItem);
+ REGISTER_ENUM (TempoCurveItem);
REGISTER_ENUM (TempoMarkerItem);
REGISTER_ENUM (MeterBarItem);
REGISTER_ENUM (TempoBarItem);
diff --git a/gtk2_ardour/export/CD.format b/gtk2_ardour/export/CD.format
deleted file mode 100644
index 0253301..0000000
--- a/gtk2_ardour/export/CD.format
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ExportFormatSpecification name="CD" id="888228ba-4863-4906-a059-7bc01023c113">
- <Encoding id="F_WAV" type="T_Sndfile" extension="wav" name="WAV" has-sample-format="true" channel-limit="256"/>
- <SampleRate rate="44100"/>
- <SRCQuality quality="SRC_SincBest"/>
- <EncodingOptions>
- <Option name="sample-format" value="SF_16"/>
- <Option name="dithering" value="D_Shaped"/>
- <Option name="tag-metadata" value="false"/>
- <Option name="tag-support" value="false"/>
- <Option name="broadcast-info" value="false"/>
- </EncodingOptions>
- <Processing>
- <Normalize enabled="true" target="-0"/>
- <Silence>
- <Start>
- <Trim enabled="false"/>
- <Add enabled="false">
- <Duration format="Timecode" hours="0" minutes="0" seconds="0" frames="0"/>
- </Add>
- </Start>
- <End>
- <Trim enabled="false"/>
- <Add enabled="false">
- <Duration format="Timecode" hours="0" minutes="0" seconds="0" frames="0"/>
- </Add>
- </End>
- </Silence>
- </Processing>
-</ExportFormatSpecification>
diff --git a/gtk2_ardour/export_channel_selector.cc b/gtk2_ardour/export_channel_selector.cc
index c868d69..acbed62 100644
--- a/gtk2_ardour/export_channel_selector.cc
+++ b/gtk2_ardour/export_channel_selector.cc
@@ -18,8 +18,6 @@
*/
-#include "export_channel_selector.h"
-
#include <algorithm>
#include "pbd/convert.h"
@@ -33,19 +31,16 @@
#include <sstream>
-#include "i18n.h"
+#include "export_channel_selector.h"
+#include "route_sorter.h"
+
+#include "pbd/i18n.h"
using namespace std;
using namespace Glib;
using namespace ARDOUR;
using namespace PBD;
-struct EditorOrderRouteSorter {
- bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
- return a->order_key () < b->order_key ();
- }
-};
-
PortExportChannelSelector::PortExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager) :
ExportChannelSelector (session, manager),
channels_label (_("Channels:"), Gtk::ALIGN_LEFT),
@@ -104,6 +99,11 @@ PortExportChannelSelector::sync_with_manager ()
split_checkbox.set_active (state->config->get_split());
channels_spinbutton.set_value (state->config->get_n_chans());
+ /* when loading presets, config is ready set here (shared ptr)
+ * fill_route_list () -> update_channel_count () -> set_channel_count () -> update_config()
+ * will call config->clear_channels(); and clear the config
+ */
+ channel_view.set_config (ChannelConfigPtr ());
fill_route_list ();
channel_view.set_config (state->config);
}
@@ -121,7 +121,7 @@ PortExportChannelSelector::fill_route_list ()
channel_view.add_route (master);
}
- routes.sort (EditorOrderRouteSorter ());
+ routes.sort (Stripable::PresentationOrderSorter ());
for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
if ((*it)->is_master () || (*it)->is_monitor ()) {
@@ -217,6 +217,7 @@ PortExportChannelSelector::ChannelTreeView::set_config (ChannelConfigPtr c)
if (config == c) { return; }
config = c;
+ if (!config) { return; }
uint32_t i = 1;
ExportChannelConfiguration::ChannelList chan_list = config->get_channels();
@@ -536,7 +537,8 @@ RegionExportChannelSelector::handle_selection ()
factory.reset (new RegionExportChannelFactory (_session, region, track, type));
state->config->set_region_processing_type (type);
- for (size_t chan = 0; chan < region_chans; ++chan) {
+ const size_t cc = type == RegionExportChannelFactory::Processed ? track_chans : region_chans;
+ for (size_t chan = 0; chan < cc; ++chan) {
state->config->register_channel (factory->create (chan));
}
@@ -693,7 +695,7 @@ TrackExportChannelSelector::add_track (boost::shared_ptr<Route> route)
row[track_cols.selected] = false;
row[track_cols.label] = route->name();
row[track_cols.route] = route;
- row[track_cols.order_key] = route->order_key();
+ row[track_cols.order_key] = route->presentation_info().order();
}
void
@@ -708,7 +710,7 @@ TrackExportChannelSelector::update_config()
continue;
}
- ExportProfileManager::ChannelConfigStatePtr state = manager->add_channel_config();
+ ExportProfileManager::ChannelConfigStatePtr state;
boost::shared_ptr<Route> route = row[track_cols.route];
@@ -720,16 +722,25 @@ TrackExportChannelSelector::update_config()
ExportChannelPtr channel (new PortExportChannel ());
PortExportChannel * pec = static_cast<PortExportChannel *> (channel.get());
pec->add_port(port);
+ if (!state) {
+ state = manager->add_channel_config();
+ }
state->config->register_channel(channel);
}
}
} else {
std::list<ExportChannelPtr> list;
RouteExportChannel::create_from_route (list, route);
+ if (list.size () == 0) {
+ continue;
+ }
+ state = manager->add_channel_config();
state->config->register_channels (list);
}
- state->config->set_name (route->name());
+ if (state) {
+ state->config->set_name (route->name());
+ }
}
diff --git a/gtk2_ardour/export_channel_selector.h b/gtk2_ardour/export_channel_selector.h
index 6dd770c..d5607ef 100644
--- a/gtk2_ardour/export_channel_selector.h
+++ b/gtk2_ardour/export_channel_selector.h
@@ -236,6 +236,8 @@ class TrackExportChannelSelector : public ExportChannelSelector
virtual void sync_with_manager ();
+ bool track_output () const { return track_output_button.get_active(); }
+
private:
void fill_list();
diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc
index e9f2559..6b9d74e 100644
--- a/gtk2_ardour/export_dialog.cc
+++ b/gtk2_ardour/export_dialog.cc
@@ -24,15 +24,17 @@
#include <gtkmm/messagedialog.h>
#include "ardour/audioregion.h"
+#include "ardour/export_channel_configuration.h"
#include "ardour/export_status.h"
#include "ardour/export_handler.h"
+#include "ardour/profile.h"
#include "export_dialog.h"
#include "export_report.h"
#include "gui_thread.h"
#include "nag.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -95,9 +97,13 @@ ExportDialog::set_session (ARDOUR::Session* s)
preset_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::sync_with_manager));
timespan_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename));
channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename));
+ channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_realtime_selection));
file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename));
update_warnings_and_example_filename ();
+ update_realtime_selection ();
+
+ _session->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&ExportDialog::parameter_changed, this, _1), gui_context());
}
void
@@ -204,6 +210,7 @@ ExportDialog::sync_with_manager ()
file_notebook->sync_with_manager ();
update_warnings_and_example_filename ();
+ update_realtime_selection ();
}
void
@@ -245,6 +252,47 @@ ExportDialog::update_warnings_and_example_filename ()
}
void
+ExportDialog::update_realtime_selection ()
+{
+ bool rt_ok = true;
+ switch (profile_manager->type ()) {
+ case ExportProfileManager::RegularExport:
+ break;
+ case ExportProfileManager::RangeExport:
+ break;
+ case ExportProfileManager::SelectionExport:
+ break;
+ case ExportProfileManager::RegionExport:
+ if (!profile_manager->get_channel_configs().empty ()) {
+ switch (profile_manager->get_channel_configs().front()->config->region_processing_type ()) {
+ case RegionExportChannelFactory::Raw:
+ case RegionExportChannelFactory::Fades:
+ rt_ok = false;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case ExportProfileManager::StemExport:
+ if (! static_cast<TrackExportChannelSelector*>(channel_selector.get())->track_output ()) {
+ rt_ok = false;
+ }
+ break;
+ }
+
+ timespan_selector->allow_realtime_export (rt_ok);
+}
+
+void
+ExportDialog::parameter_changed (std::string const& p)
+{
+ if (p == "realtime-export") {
+ update_realtime_selection ();
+ }
+}
+
+void
ExportDialog::show_conflicting_files ()
{
ArdourDialog dialog (_("Files that will be overwritten"), true);
@@ -300,6 +348,8 @@ ExportDialog::do_export ()
void
ExportDialog::show_progress ()
{
+ export_notebook.set_sensitive (false);
+
cancel_button->set_label (_("Stop Export"));
export_button->set_sensitive (false);
@@ -329,16 +379,17 @@ ExportDialog::show_progress ()
if (!status->aborted()) {
hide();
-
- NagScreen* ns = NagScreen::maybe_nag (_("export"));
-
- if (ns) {
- ns->nag ();
- delete ns;
+ if (!ARDOUR::Profile->get_mixbus()) {
+ NagScreen* ns = NagScreen::maybe_nag (_("export"));
+ if (ns) {
+ ns->nag ();
+ delete ns;
+ }
}
} else {
notify_errors ();
}
+ export_notebook.set_sensitive (true);
}
gint
@@ -355,7 +406,12 @@ ExportDialog::progress_timeout ()
case ExportStatus::Normalizing:
status_text = string_compose (_("Normalizing '%3' (timespan %1 of %2)"),
status->timespan, status->total_timespans, status->timespan_name);
- progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles;
+ progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
+ break;
+ case ExportStatus::Encoding:
+ status_text = string_compose (_("Encoding '%3' (timespan %1 of %2)"),
+ status->timespan, status->total_timespans, status->timespan_name);
+ progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
break;
case ExportStatus::Tagging:
status_text = string_compose (_("Tagging '%3' (timespan %1 of %2)"),
diff --git a/gtk2_ardour/export_dialog.h b/gtk2_ardour/export_dialog.h
index 54446b7..fee7013 100644
--- a/gtk2_ardour/export_dialog.h
+++ b/gtk2_ardour/export_dialog.h
@@ -103,6 +103,9 @@ class ExportDialog : public ArdourDialog, public PBD::ScopedConnectionList
void do_export ();
+ void update_realtime_selection ();
+ void parameter_changed (std::string const&);
+
void show_progress ();
gint progress_timeout ();
diff --git a/gtk2_ardour/export_file_notebook.cc b/gtk2_ardour/export_file_notebook.cc
index 0ebee83..8e37356 100644
--- a/gtk2_ardour/export_file_notebook.cc
+++ b/gtk2_ardour/export_file_notebook.cc
@@ -24,7 +24,7 @@
#include "gui_thread.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
diff --git a/gtk2_ardour/export_filename_selector.cc b/gtk2_ardour/export_filename_selector.cc
index fd41171..e16f527 100644
--- a/gtk2_ardour/export_filename_selector.cc
+++ b/gtk2_ardour/export_filename_selector.cc
@@ -20,9 +20,10 @@
#include <gtkmm/messagedialog.h>
+#include "pbd/openuri.h"
#include "export_filename_selector.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -36,6 +37,7 @@ ExportFilenameSelector::ExportFilenameSelector () :
path_label (_("Folder:"), Gtk::ALIGN_LEFT),
browse_button (_("Browse")),
+ open_button (_("Open Folder")),
example_filename_label ("", Gtk::ALIGN_LEFT),
_require_timespan (false)
@@ -61,6 +63,7 @@ ExportFilenameSelector::ExportFilenameSelector () :
path_hbox.pack_start (path_label, false, false, 3);
path_hbox.pack_start (path_entry, true, true, 3);
path_hbox.pack_start (browse_button, false, false, 3);
+ path_hbox.pack_start (open_button, false, false, 3); // maybe Mixbus only ?
path_entry.set_activates_default ();
@@ -104,6 +107,7 @@ ExportFilenameSelector::ExportFilenameSelector () :
revision_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFilenameSelector::change_revision_value));
browse_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportFilenameSelector::open_browse_dialog));
+ open_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportFilenameSelector::open_folder));
}
ExportFilenameSelector::~ExportFilenameSelector ()
@@ -367,6 +371,18 @@ ExportFilenameSelector::change_revision_value ()
}
void
+ExportFilenameSelector::open_folder ()
+{
+ const std::string& dir (path_entry.get_text());
+ if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR|Glib::FILE_TEST_EXISTS)) {
+ Gtk::MessageDialog msg (string_compose (_("%1: this is not a valid directory/folder."), dir));
+ msg.run ();
+ return;
+ }
+ PBD::open_folder (dir);
+}
+
+void
ExportFilenameSelector::open_browse_dialog ()
{
Gtk::FileChooserDialog dialog(_("Choose export folder"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
diff --git a/gtk2_ardour/export_filename_selector.h b/gtk2_ardour/export_filename_selector.h
index 54ed296..a65e168 100644
--- a/gtk2_ardour/export_filename_selector.h
+++ b/gtk2_ardour/export_filename_selector.h
@@ -61,6 +61,7 @@ class ExportFilenameSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
void change_revision_value ();
void open_browse_dialog ();
+ void open_folder ();
boost::shared_ptr<ARDOUR::ExportFilename> filename;
@@ -84,6 +85,7 @@ class ExportFilenameSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
Gtk::Label path_label;
Gtk::Entry path_entry;
Gtk::Button browse_button;
+ Gtk::Button open_button;
Gtk::Label example_filename_label;
/* Date combo */
diff --git a/gtk2_ardour/export_format_dialog.cc b/gtk2_ardour/export_format_dialog.cc
index f76effa..862401f 100644
--- a/gtk2_ardour/export_format_dialog.cc
+++ b/gtk2_ardour/export_format_dialog.cc
@@ -23,7 +23,8 @@
#include "export_format_dialog.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "tooltips.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -38,9 +39,16 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
name_label (_("Label: "), Gtk::ALIGN_LEFT),
name_generated_part ("", Gtk::ALIGN_LEFT),
- normalize_checkbox (_("Normalize to:")),
- normalize_adjustment (0.00, -90.00, 0.00, 0.1, 0.2),
- normalize_db_label (_("dBFS"), Gtk::ALIGN_LEFT),
+ normalize_checkbox (_("Normalize:")),
+ normalize_peak_rb (_("Peak")),
+ normalize_loudness_rb (_("Loudness")),
+ normalize_dbfs_adjustment ( 0.00, -90.00, 0.00, 0.1, 0.2),
+ normalize_lufs_adjustment (-23.0, -90.00, 0.00, 0.1, 1.0),
+ normalize_dbtp_adjustment ( -1.0, -90.00, 0.00, 0.1, 0.2),
+
+ normalize_dbfs_label (_("dBFS"), Gtk::ALIGN_LEFT),
+ normalize_lufs_label (_("LUFS"), Gtk::ALIGN_LEFT),
+ normalize_dbtp_label (_("dBTP"), Gtk::ALIGN_LEFT),
silence_table (2, 4),
trim_start_checkbox (_("Trim silence at start")),
@@ -51,7 +59,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
silence_end_checkbox (_("Add silence at end:")),
silence_end_clock ("silence_end", true, "", true, false, true),
- command_label(_("Command to run post-export\n(%f=full path & filename, %d=directory, %b=basename):"), Gtk::ALIGN_LEFT),
+ command_label(_("Command to run post-export\n(%f=file path, %d=directory, %b=basename, see tooltip for more):"), Gtk::ALIGN_LEFT),
format_table (3, 4),
compatibility_label (_("Compatibility"), Gtk::ALIGN_LEFT),
@@ -95,11 +103,29 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
/* Normalize */
- normalize_hbox.pack_start (normalize_checkbox, false, false, 0);
- normalize_hbox.pack_start (normalize_spinbutton, false, false, 6);
- normalize_hbox.pack_start (normalize_db_label, false, false, 0);
+ Gtk::RadioButtonGroup normalize_group = normalize_loudness_rb.get_group();
+ normalize_peak_rb.set_group (normalize_group);
+
+ normalize_hbox.pack_start (normalize_checkbox, false, false, 2);
+ normalize_hbox.pack_start (normalize_peak_rb, false, false, 0);
+ normalize_hbox.pack_start (normalize_dbfs_spinbutton, false, false, 2);
+ normalize_hbox.pack_start (normalize_dbfs_label, false, false, 0);
+
+ normalize_hbox.pack_start (*Gtk::manage (new Gtk::Label ("")), false, false, 6); // separator
+
+ normalize_hbox.pack_start (normalize_loudness_rb, false, false, 0);
+ normalize_hbox.pack_start (normalize_lufs_spinbutton, false, false, 2);
+ normalize_hbox.pack_start (normalize_lufs_label, false, false, 0);
+ normalize_hbox.pack_start (*Gtk::manage (new Gtk::Label (_("\u2227"))), false, false, 4);
+ normalize_hbox.pack_start (normalize_dbtp_spinbutton, false, false, 2);
+ normalize_hbox.pack_start (normalize_dbtp_label, false, false, 0);
+
+ ARDOUR_UI_UTILS::set_tooltip (normalize_loudness_rb,
+ _("Normalize to EBU-R128 LUFS target loudness without exceeding the given true-peak limit. EBU-R128 normalization is only available for mono and stereo targets, true-peak works for any channel layout."));
- normalize_spinbutton.configure (normalize_adjustment, 0.1, 2);
+ normalize_dbfs_spinbutton.configure (normalize_dbfs_adjustment, 0.1, 2);
+ normalize_lufs_spinbutton.configure (normalize_lufs_adjustment, 0.1, 2);
+ normalize_dbtp_spinbutton.configure (normalize_dbtp_adjustment, 0.1, 2);
/* Silence */
@@ -121,6 +147,33 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
get_vbox()->pack_start (command_label, false, false);
get_vbox()->pack_start (command_entry, false, false);
+ ARDOUR_UI_UTILS::set_tooltip (command_entry,
+ _(
+ "%a Artist name\n"
+ "%b File's base-name\n"
+ "%c Copyright\n"
+ "%d File's directory\n"
+ "%f File's full absolute path\n"
+ "%l Lyricist\n"
+ "%n Session name\n"
+ "%o Conductor\n"
+ "%t Title\n"
+ "%z Organization\n"
+ "%A Album\n"
+ "%C Comment\n"
+ "%E Engineer\n"
+ "%G Genre\n"
+ "%L Total track count\n"
+ "%M Mixer\n"
+ "%N Timespan name\n"
+ "%O Composer\n"
+ "%P Producer\n"
+ "%S Disc subtitle\n"
+ "%T Track number\n"
+ "%Y Year\n"
+ "%Z Country"
+ ));
+
/* Format table */
init_format_table();
@@ -171,7 +224,11 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
trim_end_checkbox.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_trim_end_selection));
normalize_checkbox.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
- normalize_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+ normalize_peak_rb.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+ normalize_loudness_rb.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+ normalize_dbfs_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+ normalize_lufs_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+ normalize_dbtp_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
silence_start_checkbox.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_silence_start_selection));
silence_start_clock.ValueChanged.connect (sigc::mem_fun (*this, &ExportFormatDialog::update_silence_start_selection));
@@ -201,6 +258,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
/* Finalize */
show_all_children();
+ update_normalize_sensitivity ();
}
ExportFormatDialog::~ExportFormatDialog ()
@@ -252,7 +310,11 @@ ExportFormatDialog::load_state (FormatPtr spec)
name_entry.set_text (spec->name());
normalize_checkbox.set_active (spec->normalize());
- normalize_spinbutton.set_value (spec->normalize_target());
+ normalize_peak_rb.set_active (!spec->normalize_loudness());
+ normalize_loudness_rb.set_active (spec->normalize_loudness());
+ normalize_dbfs_spinbutton.set_value (spec->normalize_dbfs());
+ normalize_lufs_spinbutton.set_value (spec->normalize_lufs());
+ normalize_dbtp_spinbutton.set_value (spec->normalize_dbtp());
trim_start_checkbox.set_active (spec->trim_beginning());
silence_start = spec->silence_beginning_time();
@@ -307,6 +369,7 @@ ExportFormatDialog::load_state (FormatPtr spec)
}
}
+ update_normalize_sensitivity ();
tag_checkbox.set_active (spec->tag());
command_entry.set_text (spec->command());
}
@@ -768,10 +831,24 @@ ExportFormatDialog::update_trim_end_selection ()
}
void
+ExportFormatDialog::update_normalize_sensitivity ()
+{
+ bool en = normalize_checkbox.get_active();
+ bool loudness = normalize_loudness_rb.get_active();
+ normalize_dbfs_spinbutton.set_sensitive (!loudness && en);
+ normalize_lufs_spinbutton.set_sensitive (loudness && en);
+ normalize_dbtp_spinbutton.set_sensitive (loudness && en);
+}
+
+void
ExportFormatDialog::update_normalize_selection ()
{
manager.select_normalize (normalize_checkbox.get_active());
- manager.select_normalize_target (normalize_spinbutton.get_value ());
+ manager.select_normalize_loudness (normalize_loudness_rb.get_active());
+ manager.select_normalize_dbfs (normalize_dbfs_spinbutton.get_value ());
+ manager.select_normalize_lufs (normalize_lufs_spinbutton.get_value ());
+ manager.select_normalize_dbtp (normalize_dbtp_spinbutton.get_value ());
+ update_normalize_sensitivity ();
}
void
diff --git a/gtk2_ardour/export_format_dialog.h b/gtk2_ardour/export_format_dialog.h
index 6197d0d..8709ff9 100644
--- a/gtk2_ardour/export_format_dialog.h
+++ b/gtk2_ardour/export_format_dialog.h
@@ -126,6 +126,7 @@ class ExportFormatDialog : public ArdourDialog, public PBD::ScopedConnectionList
void update_trim_end_selection ();
void update_normalize_selection ();
+ void update_normalize_sensitivity ();
void update_silence_start_selection ();
void update_silence_end_selection ();
@@ -163,9 +164,17 @@ class ExportFormatDialog : public ArdourDialog, public PBD::ScopedConnectionList
Gtk::HBox normalize_hbox;
Gtk::CheckButton normalize_checkbox;
- Gtk::SpinButton normalize_spinbutton;
- Gtk::Adjustment normalize_adjustment;
- Gtk::Label normalize_db_label;
+ Gtk::RadioButton normalize_peak_rb;
+ Gtk::RadioButton normalize_loudness_rb;
+ Gtk::SpinButton normalize_dbfs_spinbutton;
+ Gtk::Adjustment normalize_dbfs_adjustment;
+ Gtk::SpinButton normalize_lufs_spinbutton;
+ Gtk::Adjustment normalize_lufs_adjustment;
+ Gtk::SpinButton normalize_dbtp_spinbutton;
+ Gtk::Adjustment normalize_dbtp_adjustment;
+ Gtk::Label normalize_dbfs_label;
+ Gtk::Label normalize_lufs_label;
+ Gtk::Label normalize_dbtp_label;
/* Silence */
diff --git a/gtk2_ardour/export_format_selector.cc b/gtk2_ardour/export_format_selector.cc
index 4074656..c77a09c 100644
--- a/gtk2_ardour/export_format_selector.cc
+++ b/gtk2_ardour/export_format_selector.cc
@@ -25,7 +25,7 @@
#include "ardour/export_format_specification.h"
#include "ardour/export_profile_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
ExportFormatSelector::ExportFormatSelector () :
edit_button (Gtk::Stock::EDIT),
diff --git a/gtk2_ardour/export_preset_selector.cc b/gtk2_ardour/export_preset_selector.cc
index 3e3b0d0..018beae 100644
--- a/gtk2_ardour/export_preset_selector.cc
+++ b/gtk2_ardour/export_preset_selector.cc
@@ -22,7 +22,7 @@
#include "ardour/export_preset.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
ExportPresetSelector::ExportPresetSelector () :
label (_("Preset"), Gtk::ALIGN_LEFT),
diff --git a/gtk2_ardour/export_report.cc b/gtk2_ardour/export_report.cc
index c03a8bb..942e1dd 100644
--- a/gtk2_ardour/export_report.cc
+++ b/gtk2_ardour/export_report.cc
@@ -24,6 +24,7 @@
#include <gtkmm/stock.h>
#include "pbd/openuri.h"
+#include "pbd/basename.h"
#include "gtkmm2ext/utils.h"
#include "gtkmm2ext/utils.h"
#include "canvas/utils.h"
@@ -46,29 +47,45 @@
#include "logmeter.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace ARDOUR;
ExportReport::ExportReport (Session* session, StatusPtr s)
: ArdourDialog (_("Export Report/Analysis"))
- , status (s)
, _session (session)
+ , stop_btn (0)
+ , play_btn (0)
, _audition_num (-1)
, _page_num (0)
{
+ init (s->result_map, true);
+}
+
+ExportReport::ExportReport (const std::string & title, const AnalysisResults & ar)
+ : ArdourDialog (title)
+ , _session (0)
+ , stop_btn (0)
+ , play_btn (0)
+ , _audition_num (-1)
+ , _page_num (0)
+{
+ init (ar, false);
+}
+
+void
+ExportReport::init (const AnalysisResults & ar, bool with_file)
+{
set_resizable (false);
pages.set_scrollable ();
- AnalysisResults & ar = status->result_map;
-
std::vector<double> dashes;
dashes.push_back (3.0);
dashes.push_back (5.0);
int page = 0;
- for (AnalysisResults::iterator i = ar.begin (); i != ar.end (); ++i, ++page) {
+ for (AnalysisResults::const_iterator i = ar.begin (); i != ar.end (); ++i, ++page) {
Label *l;
VBox *vb = manage (new VBox ());
Table *t = manage (new Table (4, 4));
@@ -87,19 +104,21 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
std::list<CimgPlayheadArea*> playhead_widgets;
- l = manage (new Label (_("File:"), ALIGN_END));
- t->attach (*l, 0, 1, 0, 1);
- l = manage (new Label ());
- l->set_ellipsize (Pango::ELLIPSIZE_START);
- l->set_width_chars (48);
- l->set_max_width_chars (48);
- l->set_text (path);
- l->set_alignment (ALIGN_START, ALIGN_CENTER);
- t->attach (*l, 1, 3, 0, 1, FILL, SHRINK);
+ if (with_file) {
+ l = manage (new Label (_("File:"), ALIGN_END));
+ t->attach (*l, 0, 1, 0, 1);
+ l = manage (new Label ());
+ l->set_ellipsize (Pango::ELLIPSIZE_START);
+ l->set_width_chars (48);
+ l->set_max_width_chars (48);
+ l->set_text (path);
+ l->set_alignment (ALIGN_START, ALIGN_CENTER);
+ t->attach (*l, 1, 3, 0, 1, FILL, SHRINK);
- Button *b = manage (new Button (_("Open Folder")));
- t->attach (*b, 3, 4, 0, 2, FILL, SHRINK);
- b->signal_clicked ().connect (sigc::bind (sigc::mem_fun (*this, &ExportReport::open_folder), path));
+ Button *b = manage (new Button (_("Open Folder")));
+ t->attach (*b, 3, 4, 0, 2, FILL, SHRINK);
+ b->signal_clicked ().connect (sigc::bind (sigc::mem_fun (*this, &ExportReport::open_folder), path));
+ }
SoundFileInfo info;
std::string errmsg;
@@ -108,8 +127,9 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
framecnt_t sample_rate = 0;
framecnt_t start_off = 0;
unsigned int channels = 0;
+ std::string file_fmt;
- if (AudioFileSource::get_soundfile_info (path, info, errmsg)) {
+ if (with_file && AudioFileSource::get_soundfile_info (path, info, errmsg)) {
AudioClock * clock;
file_length = info.length;
@@ -126,13 +146,13 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
l = manage (new Label (_("Format:"), ALIGN_END));
t->attach (*l, 0, 1, 1, 2);
- std::string fmt = info.format_name;
- std::replace (fmt.begin (), fmt.end (), '\n', ' ');
+ file_fmt = info.format_name;
+ std::replace (file_fmt.begin (), file_fmt.end (), '\n', ' ');
l = manage (new Label ());
l->set_ellipsize (Pango::ELLIPSIZE_START);
l->set_width_chars (48);
l->set_max_width_chars (48);
- l->set_text (fmt);
+ l->set_text (file_fmt);
l->set_alignment (ALIGN_START, ALIGN_CENTER);
t->attach (*l, 1, 3, 1, 2, FILL, SHRINK);
@@ -161,7 +181,7 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
clock->set_mode (AudioClock::Timecode);
clock->set (info.timecode * src_coef + 0.5, true);
t->attach (*clock, 3, 4, 3, 4);
- } else {
+ } else if (with_file) {
l = manage (new Label (_("Error:"), ALIGN_END));
t->attach (*l, 0, 1, 1, 2);
l = manage (new Label (errmsg, ALIGN_START));
@@ -230,7 +250,7 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
mnw = (m_l - /*hist-width*/ 540 - /*box spacing*/ 8 + /*peak-width*/ 800 + m_r) / 2;
const int nw2 = mnw / 2; // nums, horizontal center
- int y0[4];
+ int y0[6];
if (p->normalized) {
y0[0] = (hh - ht) * .5;
} else {
@@ -242,6 +262,81 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
y0[4] = y0[3] + lin[3] * 1.25;
y0[5] = y0[4] + lin[4] * 1.25;
+ /* calc heights & alignment of png-image */
+ const float specth = sizeof (p->spectrum[0]) / sizeof (float);
+ const float waveh2 = std::min (100, 8 * lin[0] / (int) p->n_channels);
+
+ Cairo::RefPtr<Cairo::ImageSurface> png_surface;
+ int png_w = 0;
+ int png_y0 = 0;
+
+ if (with_file && UIConfiguration::instance().get_save_export_analysis_image ()) { /*png image */
+ const int top_w = 540 + 2 * (mnw + 4); // 4px spacing
+ const int wav_w = m_l + m_r + 4 + sizeof (p->peaks) / sizeof (ARDOUR::PeakData::PeakDatum) / 4;
+ const int spc_w = m_l + m_r + 4 + sizeof (p->spectrum) / sizeof (float) / specth;
+ int ann_h = 0;
+ int linesp = 0;
+
+ if (channels > 0 && file_length > 0 && sample_rate > 0) {
+ layout->set_font_description (UIConfiguration::instance ().get_SmallMonospaceFont ());
+ layout->set_text (_("00:00:00.000"));
+ layout->get_pixel_size (w, h);
+ int height = h * 1.75;
+ ann_h = 4 + height /* Time Axis */;
+
+ layout->set_font_description (UIConfiguration::instance ().get_SmallFont ());
+ layout->set_text (_("0|A8"));
+ layout->get_pixel_size (w, h);
+ linesp = h * 1.5;
+ ann_h += 4 + 3 * linesp; /* File Info */;
+ }
+
+ const int png_h = hh + 4 + p->n_channels * (2 * waveh2 + 4) + ann_h + specth + 4;
+ png_w = std::max (std::max (top_w, wav_w), spc_w);
+
+ png_surface = Cairo::ImageSurface::create (Cairo::FORMAT_RGB24, png_w, png_h);
+ Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+ pcx->set_source_rgb (.2, .2, .2);
+ pcx->paint ();
+
+ if (channels > 0 && file_length > 0 && sample_rate > 0) {
+ png_y0 += 4;
+ // Add file-name, format, duration, sample-rate & timecode
+ pcx->set_source_rgb (.7, .7, .7);
+ layout->set_font_description (UIConfiguration::instance ().get_SmallFont ());
+ layout->set_alignment (Pango::ALIGN_LEFT);
+
+#define IMGLABEL(X0, STR, VAL) { \
+ layout->set_text (STR); \
+ pcx->move_to (X0, png_y0); \
+ layout->get_pixel_size (w, h); \
+ layout->show_in_cairo_context (pcx); \
+ layout->set_text (VAL); \
+ pcx->move_to (X0 + w + 2, png_y0); \
+ layout->show_in_cairo_context (pcx); \
+}
+
+ // TODO get max width of labels per column, right-align labels, x-align 1/3, 2/3 columns
+ const int lx0 = m_l;
+ const int lx1 = m_l + png_w / 2;
+
+ IMGLABEL (lx0, _("File:"), Glib::path_get_basename (path));
+ IMGLABEL (lx1, _("Channels:"), string_compose ("%1", channels));
+ png_y0 += linesp;
+
+ IMGLABEL (lx0, _("Format:"), file_fmt);
+ IMGLABEL (lx1, _("Sample rate:"), string_compose (_("%1 Hz"), sample_rate));
+ png_y0 += linesp;
+
+ if (_session) {
+ Timecode::Time tct;
+ _session->sample_to_timecode (start_off, tct, false, false);
+ IMGLABEL (lx0, _("Timecode:"), Timecode::timecode_format_time (tct));
+ }
+ IMGLABEL (lx1, _("Duration:"), Timecode::timecode_format_sampletime (file_length, sample_rate, 1000, false));
+ png_y0 += linesp;
+ }
+ }
{ /* peak, loudness and R128 histogram */
Cairo::RefPtr<Cairo::ImageSurface> nums = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, mnw, hh);
@@ -463,6 +558,17 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
hist->flush ();
+ if (png_surface) {
+ Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+ pcx->set_source (nums, 0, png_y0);
+ pcx->paint ();
+ pcx->set_source (hist, (png_w - 540) / 2, png_y0);
+ pcx->paint ();
+ pcx->set_source (ebur, png_w - mnw, png_y0);
+ pcx->paint ();
+ png_y0 += hh + 4;
+ }
+
CimgArea *nu = manage (new CimgArea (nums));
CimgArea *eb = manage (new CimgArea (ebur));
CimgArea *hi = manage (new CimgArea (hist));
@@ -496,6 +602,9 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
VBox *lrb = manage (new VBox());
ToggleButton *log = manage (new ToggleButton (S_("Logscale|Lg")));
ToggleButton *rec = manage (new ToggleButton (S_("Rectified|Rf")));
+ Gtkmm2ext::UI::instance()->set_tip (log, _("Logscale"));
+ Gtkmm2ext::UI::instance()->set_tip (rec, _("Rectified"));
+
lrb->pack_start (*log, false, false, 5);
lrb->pack_end (*rec, false, false, 5);
log->signal_toggled ().connect (sigc::bind (sigc::mem_fun (*this, &ExportReport::on_logscale_toggled), log));
@@ -512,10 +621,10 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
Cairo::RefPtr<Cairo::ImageSurface> wave_log;
Cairo::RefPtr<Cairo::ImageSurface> wave_rect;
Cairo::RefPtr<Cairo::ImageSurface> wave_lr;
- draw_waveform(wave, p, c, m_l, width, anw, lin[0], false, false);
- draw_waveform(wave_log, p, c, m_l, width, anw, lin[0], true, false);
- draw_waveform(wave_rect, p, c, m_l, width, anw, lin[0], false, true);
- draw_waveform(wave_lr, p, c, m_l, width, anw, lin[0], true, true);
+ draw_waveform(wave, p, c, m_l, width, anw, waveh2, false, false);
+ draw_waveform(wave_log, p, c, m_l, width, anw, waveh2, true, false);
+ draw_waveform(wave_rect, p, c, m_l, width, anw, waveh2, false, true);
+ draw_waveform(wave_lr, p, c, m_l, width, anw, waveh2, true, true);
CimgWaveArea *wv = manage (new CimgWaveArea (wave, wave_log, wave_rect, wave_lr, m_l, width));
@@ -524,6 +633,13 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
wv->seek_playhead.connect (sigc::bind<0> (sigc::mem_fun (*this, &ExportReport::audition_seek), page));
wtbl->attach (*wv, 0, 1, wrow, wrow + 1, SHRINK, SHRINK);
++wrow;
+
+ if (png_surface) {
+ Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+ pcx->set_source (wave, 0, png_y0);
+ pcx->paint ();
+ png_y0 += 2 * waveh2 + 4;
+ }
}
if (channels > 0 && file_length > 0 && sample_rate > 0)
@@ -581,12 +697,19 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
tm->seek_playhead.connect (sigc::bind<0> (sigc::mem_fun (*this, &ExportReport::audition_seek), page));
wtbl->attach (*tm, 0, 1, wrow, wrow + 1, SHRINK, SHRINK);
++wrow;
+
+ if (png_surface) {
+ Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+ pcx->set_source (ytme, 0, png_y0);
+ pcx->paint ();
+ png_y0 += height + 4;
+ }
}
{
/* Draw Spectrum */
+ const size_t height = specth;
const size_t swh = sizeof (p->spectrum) / sizeof (float);
- const size_t height = sizeof (p->spectrum[0]) / sizeof (float);
const size_t width = swh / height;
Cairo::RefPtr<Cairo::ImageSurface> spec = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, m_l + width, height);
@@ -692,6 +815,14 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
wtbl->attach (*sp, 0, 1, wrow, wrow + 1, SHRINK, SHRINK);
wtbl->attach (*an, 1, 2, wrow, wrow + 1, SHRINK, SHRINK);
++wrow;
+
+ if (png_surface) {
+ Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+ pcx->set_source (spec, 0, png_y0);
+ pcx->paint ();
+ pcx->set_source (scale, png_w - m_r, png_y0);
+ pcx->paint ();
+ }
}
timeline[page] = playhead_widgets;
@@ -706,6 +837,13 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
img->hide();
pages.pages ().push_back (Notebook_Helpers::TabElem (*vb, *tab));
pages.signal_switch_page().connect (sigc::mem_fun (*this, &ExportReport::on_switch_page));
+
+ if (png_surface) {
+ assert (with_file && !path.empty ());
+ std::string imgpath = Glib::build_filename (Glib::path_get_dirname (path), PBD::basename_nosuffix (path) + ".png");
+ PBD::info << string_compose(_("Writing Export Analysis Image: %1."), imgpath) << endmsg;
+ png_surface->write_to_png (imgpath);
+ }
}
pages.set_show_tabs (true);
@@ -721,14 +859,18 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
_session->the_auditioner()->AuditionProgress.connect(auditioner_connections, invalidator (*this), boost::bind (&ExportReport::audition_progress, this, _1, _2), gui_context());
}
- play_btn = add_button (Stock::MEDIA_PLAY, RESPONSE_ACCEPT);
- stop_btn = add_button (Stock::MEDIA_STOP, RESPONSE_ACCEPT);
+ if (_session && with_file) {
+ play_btn = add_button (Stock::MEDIA_PLAY, RESPONSE_ACCEPT);
+ stop_btn = add_button (Stock::MEDIA_STOP, RESPONSE_ACCEPT);
+ }
add_button (Stock::CLOSE, RESPONSE_CLOSE);
set_default_response (RESPONSE_CLOSE);
- stop_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::stop_audition));
- play_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::play_audition));
- stop_btn->set_sensitive (false);
+ if (_session && with_file) {
+ stop_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::stop_audition));
+ play_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::play_audition));
+ stop_btn->set_sensitive (false);
+ }
show_all ();
}
@@ -757,6 +899,9 @@ ExportReport::open_folder (std::string p)
void
ExportReport::audition_active (bool active)
{
+ if (!stop_btn || !play_btn) {
+ return;
+ }
stop_btn->set_sensitive (active);
play_btn->set_sensitive (!active);
@@ -924,11 +1069,10 @@ ExportReport::on_rectivied_toggled (Gtk::ToggleButton* b)
}
void
-ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAnalysisPtr p, uint32_t c, int m_l, size_t width, int anw, int height, bool log, bool rect)
+ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAnalysisPtr p, uint32_t c, int m_l, size_t width, int anw, int height_2, bool log, bool rect)
{
int w, h;
Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (get_pango_context ());
- const float height_2 = std::min (100, 8 * height / (int) p->n_channels); // TODO refine
const float ht = 2.f * height_2;
std::vector<double> dashes;
@@ -1005,7 +1149,7 @@ ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAna
}
}
- // > 0dBFS
+ // >= 0dBFS
cr->set_source_rgba (1.0, 0, 0, 1.0);
for (size_t x = 0 ; x < width; ++x) {
if (p->peaks[c][x].max >= 1.0) {
@@ -1019,7 +1163,7 @@ ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAna
}
cr->stroke ();
- // > -1dBTP
+ // >= -1dBTP (coeff >= .89125, libs/vamp-plugins/TruePeak.cpp)
cr->set_source_rgba (1.0, 0.7, 0, 0.7);
for (std::set<framepos_t>::const_iterator i = p->truepeakpos[c].begin (); i != p->truepeakpos[c].end (); ++i) {
cr->move_to (m_l + (*i) - .5, clip_top);
diff --git a/gtk2_ardour/export_report.h b/gtk2_ardour/export_report.h
index 019b2f7..65339be 100644
--- a/gtk2_ardour/export_report.h
+++ b/gtk2_ardour/export_report.h
@@ -186,9 +186,11 @@ class ExportReport : public ArdourDialog
public:
typedef boost::shared_ptr<ARDOUR::ExportStatus> StatusPtr;
ExportReport (ARDOUR::Session*, StatusPtr);
+ ExportReport (const std::string & title, const ARDOUR::AnalysisResults & ar);
int run ();
private:
+ void init (const ARDOUR::AnalysisResults &, bool);
void draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave,
ARDOUR::ExportAnalysisPtr, uint32_t, int, size_t, int, int, bool, bool);
@@ -203,7 +205,6 @@ private:
void on_logscale_toggled (Gtk::ToggleButton*);
void on_rectivied_toggled (Gtk::ToggleButton*);
- StatusPtr status;
Gtk::Notebook pages;
ARDOUR::Session* _session;
Gtk::Button* stop_btn;
diff --git a/gtk2_ardour/export_timespan_selector.cc b/gtk2_ardour/export_timespan_selector.cc
index 9a294af..c87d4ef 100644
--- a/gtk2_ardour/export_timespan_selector.cc
+++ b/gtk2_ardour/export_timespan_selector.cc
@@ -32,37 +32,47 @@
#include <sstream>
#include <iomanip>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Glib;
using namespace ARDOUR;
using namespace PBD;
using std::string;
-ExportTimespanSelector::ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager) :
- manager (manager),
- time_format_label (_("Show Times as:"), Gtk::ALIGN_LEFT)
+ExportTimespanSelector::ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager, bool multi)
+ : manager (manager)
+ , _realtime_available (true)
+ , time_format_label (_("Show Times as:"), Gtk::ALIGN_LEFT)
+ , realtime_checkbutton (_("Realtime Export"))
{
set_session (session);
option_hbox.pack_start (time_format_label, false, false, 0);
option_hbox.pack_start (time_format_combo, false, false, 6);
- Gtk::Button* b = Gtk::manage (new Gtk::Button (_("Select All")));
- b->signal_clicked().connect (
- sigc::bind (
- sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), true
- )
- );
- option_hbox.pack_start (*b, false, false, 6);
-
- b = Gtk::manage (new Gtk::Button (_("Deselect All")));
- b->signal_clicked().connect (
- sigc::bind (
- sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), false
- )
- );
- option_hbox.pack_start (*b, false, false, 6);
+ if (multi) {
+ Gtk::Button* b = Gtk::manage (new Gtk::Button (_("Select All")));
+ b->signal_clicked().connect (
+ sigc::bind (
+ sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), true
+ )
+ );
+ option_hbox.pack_start (*b, false, false, 6);
+
+ b = Gtk::manage (new Gtk::Button (_("Deselect All")));
+ b->signal_clicked().connect (
+ sigc::bind (
+ sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), false
+ )
+ );
+ option_hbox.pack_start (*b, false, false, 6);
+ }
+ option_hbox.pack_start (realtime_checkbutton, false, false, 6);
+ realtime_checkbutton.set_active (session->config.get_realtime_export ());
+
+ realtime_checkbutton.signal_toggled ().connect (
+ sigc::mem_fun (*this, &ExportTimespanSelector::toggle_realtime)
+ );
range_scroller.add (range_view);
@@ -131,7 +141,7 @@ ExportTimespanSelector::location_sorter(Gtk::TreeModel::iterator a, Gtk::TreeMod
}
void
-ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc)
+ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc, bool rt)
{
ExportTimespanPtr span = _session->get_export_handler()->add_timespan();
@@ -145,6 +155,7 @@ ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc)
span->set_range (loc->start(), loc->end());
span->set_name (loc->name());
span->set_range_id (id);
+ span->set_realtime (rt);
state->timespans->push_back (span);
}
@@ -168,6 +179,30 @@ ExportTimespanSelector::sync_with_manager ()
}
void
+ExportTimespanSelector::allow_realtime_export (bool yn)
+{
+ if (_realtime_available == yn) {
+ return;
+ }
+ _realtime_available = yn;
+ realtime_checkbutton.set_sensitive (_realtime_available);
+ update_timespans ();
+}
+
+void
+ExportTimespanSelector::toggle_realtime ()
+{
+ const bool realtime = !_session->config.get_realtime_export ();
+ _session->config.set_realtime_export (realtime);
+ realtime_checkbutton.set_inconsistent (false);
+ realtime_checkbutton.set_active (realtime);
+
+ for (Gtk::TreeStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) {
+ it->set_value (range_cols.realtime, realtime);
+ }
+}
+
+void
ExportTimespanSelector::change_time_format ()
{
state->time_format = time_format_combo.get_active()->get_value (time_format_cols.format);
@@ -357,13 +392,18 @@ ExportTimespanSelector::set_selection_state_of_all_timespans (bool s)
/*** ExportTimespanSelectorSingle ***/
ExportTimespanSelectorSingle::ExportTimespanSelectorSingle (ARDOUR::Session * session, ProfileManagerPtr manager, std::string range_id) :
- ExportTimespanSelector (session, manager),
+ ExportTimespanSelector (session, manager, false),
range_id (range_id)
{
range_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER);
+ range_view.append_column_editable (_("RT"), range_cols.realtime);
range_view.append_column_editable (_("Range"), range_cols.name);
- if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (0))) {
+ if (Gtk::CellRendererToggle * renderer = dynamic_cast<Gtk::CellRendererToggle *> (range_view.get_column_cell_renderer (0))) {
+ renderer->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &ExportTimespanSelectorSingle::update_timespans)));
+ }
+
+ if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (1))) {
renderer->signal_edited().connect (sigc::mem_fun (*this, &ExportTimespanSelectorSingle::update_range_name));
}
@@ -376,9 +416,17 @@ ExportTimespanSelectorSingle::ExportTimespanSelectorSingle (ARDOUR::Session * se
}
void
+ExportTimespanSelectorSingle::allow_realtime_export (bool yn)
+{
+ ExportTimespanSelector::allow_realtime_export (yn);
+ range_view.get_column (0)->set_visible (_realtime_available);
+}
+
+void
ExportTimespanSelectorSingle::fill_range_list ()
{
if (!state) { return; }
+ const bool realtime = _session->config.get_realtime_export ();
std::string id;
if (!range_id.compare (X_("selection"))) {
@@ -400,11 +448,12 @@ ExportTimespanSelectorSingle::fill_range_list ()
row[range_cols.location] = *it;
row[range_cols.selected] = true;
+ row[range_cols.realtime] = realtime;
row[range_cols.name] = (*it)->name();
row[range_cols.label] = construct_label (*it);
row[range_cols.length] = construct_length (*it);
- add_range_to_selection (*it);
+ add_range_to_selection (*it, false);
break;
}
@@ -413,19 +462,39 @@ ExportTimespanSelectorSingle::fill_range_list ()
set_time_format_from_state();
}
+void
+ExportTimespanSelectorSingle::update_timespans ()
+{
+ state->timespans->clear();
+ const bool realtime = _session->config.get_realtime_export ();
+ bool inconsistent = false;
+
+ for (Gtk::TreeStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) {
+ add_range_to_selection (it->get_value (range_cols.location), it->get_value (range_cols.realtime) && _realtime_available);
+ if (it->get_value (range_cols.realtime) != realtime) {
+ inconsistent = true;
+ }
+ }
+ realtime_checkbutton.set_inconsistent (inconsistent);
+}
+
/*** ExportTimespanSelectorMultiple ***/
ExportTimespanSelectorMultiple::ExportTimespanSelectorMultiple (ARDOUR::Session * session, ProfileManagerPtr manager) :
- ExportTimespanSelector (session, manager)
+ ExportTimespanSelector (session, manager, true)
{
range_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
range_view.append_column_editable ("", range_cols.selected);
+ range_view.append_column_editable (_("RT"), range_cols.realtime);
range_view.append_column_editable (_("Range"), range_cols.name);
if (Gtk::CellRendererToggle * renderer = dynamic_cast<Gtk::CellRendererToggle *> (range_view.get_column_cell_renderer (0))) {
renderer->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &ExportTimespanSelectorMultiple::update_selection)));
}
- if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (1))) {
+ if (Gtk::CellRendererToggle * renderer = dynamic_cast<Gtk::CellRendererToggle *> (range_view.get_column_cell_renderer (1))) {
+ renderer->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &ExportTimespanSelectorMultiple::update_selection)));
+ }
+ if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (2))) {
renderer->signal_edited().connect (sigc::mem_fun (*this, &ExportTimespanSelectorMultiple::update_range_name));
}
@@ -438,9 +507,17 @@ ExportTimespanSelectorMultiple::ExportTimespanSelectorMultiple (ARDOUR::Session
}
void
+ExportTimespanSelectorMultiple::allow_realtime_export (bool yn)
+{
+ ExportTimespanSelector::allow_realtime_export (yn);
+ range_view.get_column (1)->set_visible (_realtime_available);
+}
+
+void
ExportTimespanSelectorMultiple::fill_range_list ()
{
if (!state) { return; }
+ const bool realtime = _session->config.get_realtime_export ();
range_list->clear();
@@ -453,6 +530,7 @@ ExportTimespanSelectorMultiple::fill_range_list ()
row[range_cols.location] = *it;
row[range_cols.selected] = false;
+ row[range_cols.realtime] = realtime;
row[range_cols.name] = (*it)->name();
row[range_cols.label] = construct_label (*it);
row[range_cols.length] = construct_length (*it);
@@ -474,6 +552,7 @@ ExportTimespanSelectorMultiple::set_selection_from_state ()
if ((id == "selection" && loc == state->selection_range.get()) ||
(id == loc->id().to_s())) {
tree_it->set_value (range_cols.selected, true);
+ tree_it->set_value (range_cols.realtime, (*it)->realtime ());
}
}
}
@@ -492,11 +571,17 @@ void
ExportTimespanSelectorMultiple::update_timespans ()
{
state->timespans->clear();
+ const bool realtime = _session->config.get_realtime_export ();
+ bool inconsistent = false;
for (Gtk::TreeStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) {
if (it->get_value (range_cols.selected)) {
- add_range_to_selection (it->get_value (range_cols.location));
+ add_range_to_selection (it->get_value (range_cols.location), it->get_value (range_cols.realtime) && _realtime_available);
+ }
+ if (it->get_value (range_cols.realtime) != realtime) {
+ inconsistent = true;
}
}
+ realtime_checkbutton.set_inconsistent (inconsistent);
}
diff --git a/gtk2_ardour/export_timespan_selector.h b/gtk2_ardour/export_timespan_selector.h
index 1216670..91a53e5 100644
--- a/gtk2_ardour/export_timespan_selector.h
+++ b/gtk2_ardour/export_timespan_selector.h
@@ -60,11 +60,12 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
public:
- ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager);
+ ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager, bool multi);
virtual ~ExportTimespanSelector ();
void sync_with_manager ();
+ virtual void allow_realtime_export (bool);
sigc::signal<void> CriticalSelectionChanged;
@@ -72,11 +73,14 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
ProfileManagerPtr manager;
TimespanStatePtr state;
+ bool _realtime_available;
virtual void fill_range_list () = 0;
+ virtual void update_timespans () = 0;
- void add_range_to_selection (ARDOUR::Location const * loc);
+ void add_range_to_selection (ARDOUR::Location const * loc, bool rt);
void set_time_format_from_state ();
+ void toggle_realtime ();
void change_time_format ();
@@ -93,8 +97,9 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
/*** GUI components ***/
- Gtk::HBox option_hbox;
- Gtk::Label time_format_label;
+ Gtk::HBox option_hbox;
+ Gtk::Label time_format_label;
+ Gtk::CheckButton realtime_checkbutton;
/* Time format */
@@ -120,10 +125,11 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
Gtk::TreeModelColumn<ARDOUR::Location *> location;
Gtk::TreeModelColumn<std::string> label;
Gtk::TreeModelColumn<bool> selected;
+ Gtk::TreeModelColumn<bool> realtime;
Gtk::TreeModelColumn<std::string> name;
Gtk::TreeModelColumn<std::string> length;
- RangeCols () { add (location); add(label); add(selected); add(name); add(length); }
+ RangeCols () { add (location); add(label); add(selected); add(realtime); add(name); add(length); }
};
RangeCols range_cols;
@@ -139,6 +145,8 @@ class ExportTimespanSelectorMultiple : public ExportTimespanSelector
public:
ExportTimespanSelectorMultiple (ARDOUR::Session * session, ProfileManagerPtr manager);
+ void allow_realtime_export (bool);
+
private:
virtual void fill_range_list ();
@@ -154,9 +162,12 @@ class ExportTimespanSelectorSingle : public ExportTimespanSelector
public:
ExportTimespanSelectorSingle (ARDOUR::Session * session, ProfileManagerPtr manager, std::string range_id);
+ void allow_realtime_export (bool);
+
private:
virtual void fill_range_list ();
+ void update_timespans ();
std::string range_id;
diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc
index f09306d..fba09e9 100644
--- a/gtk2_ardour/export_video_dialog.cc
+++ b/gtk2_ardour/export_video_dialog.cc
@@ -55,7 +55,7 @@
#include "opts.h"
#include "export_video_dialog.h"
#include "utils_videotl.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
@@ -366,7 +366,7 @@ ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
float tcfps = _session->timecode_frames_per_second();
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNode* node = _session->extra_xml (X_("Videotimeline"));
bool filenameset = false;
@@ -402,7 +402,7 @@ ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
node = _session->extra_xml (X_("Videoexport"));
if (node) {
- const XMLProperty* prop;
+ XMLProperty const * prop;
prop = node->property (X_("ChangeGeometry"));
if (prop) { scale_checkbox.set_active(atoi(prop->value())?true:false); }
prop = node->property (X_("KeepAspect"));
@@ -482,7 +482,7 @@ ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
XMLNode&
ExportVideoDialog::get_state ()
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNode* node = new XMLNode (X_("Videoexport"));
node->add_property (X_("ChangeGeometry"), scale_checkbox.get_active() ? X_("1") : X_("0"));
node->add_property (X_("KeepAspect"), scale_aspect.get_active() ? X_("1") : X_("0"));
@@ -559,7 +559,7 @@ ExportVideoDialog::audio_progress_display ()
switch (status->active_job) {
case ExportStatus::Normalizing:
pbar.set_text (_("Normalizing audio"));
- progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles;
+ progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
progress = progress / (_twopass ? 4.0 : 3.0) + (_twopass ? .25 : 1.0 / 3.0);
break;
case ExportStatus::Exporting:
diff --git a/gtk2_ardour/export_video_infobox.cc b/gtk2_ardour/export_video_infobox.cc
index 15ecc1a..f886bee 100644
--- a/gtk2_ardour/export_video_infobox.cc
+++ b/gtk2_ardour/export_video_infobox.cc
@@ -22,7 +22,7 @@
#undef interface
#endif
#include "export_video_infobox.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
diff --git a/gtk2_ardour/fft_graph.cc b/gtk2_ardour/fft_graph.cc
index 1edd483..ec54acb 100644
--- a/gtk2_ardour/fft_graph.cc
+++ b/gtk2_ardour/fft_graph.cc
@@ -14,7 +14,6 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
*/
#ifdef COMPILER_MSVC
@@ -40,12 +39,15 @@ using std::min; using std::max;
#include "fft_graph.h"
#include "analysis_window.h"
+#include "public_editor.h"
+
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
using namespace Gdk;
-FFTGraph::FFTGraph(int windowSize)
+FFTGraph::FFTGraph (int windowSize)
{
_logScale = 0;
@@ -54,287 +56,488 @@ FFTGraph::FFTGraph(int windowSize)
_hanning = 0;
_logScale = 0;
+ _surface = 0;
_a_window = 0;
- _show_minmax = false;
- _show_normalized = false;
+ _show_minmax = false;
+ _show_normalized = false;
+ _show_proportional = false;
- setWindowSize(windowSize);
+ _ann_x = _ann_y = -1;
+ _yoff = v_margin;
+ _ann_area.width = 0;
+ _ann_area.height = 0;
+
+ setWindowSize (windowSize);
+ set_events (Gdk::POINTER_MOTION_MASK | Gdk::LEAVE_NOTIFY_MASK | Gdk::BUTTON_PRESS_MASK);
}
void
-FFTGraph::setWindowSize(int windowSize)
+FFTGraph::setWindowSize (int windowSize)
{
if (_a_window) {
Glib::Threads::Mutex::Lock lm (_a_window->track_list_lock);
- setWindowSize_internal(windowSize);
+ setWindowSize_internal (windowSize);
} else {
- setWindowSize_internal(windowSize);
+ setWindowSize_internal (windowSize);
}
}
void
-FFTGraph::setWindowSize_internal(int windowSize)
+FFTGraph::setWindowSize_internal (int windowSize)
{
// remove old tracklist & graphs
if (_a_window) {
- _a_window->clear_tracklist();
+ _a_window->clear_tracklist ();
}
_windowSize = windowSize;
_dataSize = windowSize / 2;
if (_in != 0) {
- fftwf_destroy_plan(_plan);
- free(_in);
+ fftwf_destroy_plan (_plan);
+ free (_in);
_in = 0;
}
if (_out != 0) {
- free(_out);
+ free (_out);
_out = 0;
}
if (_hanning != 0) {
- free(_hanning);
+ free (_hanning);
_hanning = 0;
}
if (_logScale != 0) {
- free(_logScale);
+ free (_logScale);
_logScale = 0;
}
// When destroying, window size is set to zero to free up memory
- if (windowSize == 0)
+ if (windowSize == 0) {
return;
+ }
// FFT input & output buffers
- _in = (float *) fftwf_malloc(sizeof(float) * _windowSize);
- _out = (float *) fftwf_malloc(sizeof(float) * _windowSize);
+ _in = (float *) fftwf_malloc (sizeof (float) * _windowSize);
+ _out = (float *) fftwf_malloc (sizeof (float) * _windowSize);
// Hanning window
- _hanning = (float *) malloc(sizeof(float) * _windowSize);
-
+ _hanning = (float *) malloc (sizeof (float) * _windowSize);
// normalize the window
double sum = 0.0;
- for (int i=0; i < _windowSize; i++) {
- _hanning[i]=0.81f * ( 0.5f - (0.5f * (float) cos(2.0f * M_PI * (float)i / (float)(_windowSize))));
+ for (unsigned int i = 0; i < _windowSize; ++i) {
+ _hanning[i] = 0.5f - (0.5f * (float) cos (2.0f * M_PI * (float)i / (float)(_windowSize)));
sum += _hanning[i];
}
- double isum = 1.0 / sum;
+ double isum = 2.0 / sum;
- for (int i=0; i < _windowSize; i++) {
+ for (unsigned int i = 0; i < _windowSize; i++) {
_hanning[i] *= isum;
}
- _logScale = (int *) malloc(sizeof(int) * _dataSize);
- //float count = 0;
- for (int i = 0; i < _dataSize; i++) {
+ _logScale = (int *) malloc (sizeof (int) * _dataSize);
+
+ for (unsigned int i = 0; i < _dataSize; i++) {
_logScale[i] = 0;
}
- _plan = fftwf_plan_r2r_1d(_windowSize, _in, _out, FFTW_R2HC, FFTW_ESTIMATE);
+ _plan = fftwf_plan_r2r_1d (_windowSize, _in, _out, FFTW_R2HC, FFTW_MEASURE);
}
-FFTGraph::~FFTGraph()
+FFTGraph::~FFTGraph ()
{
// This will free everything
- setWindowSize(0);
+ setWindowSize (0);
+
+ if (_surface) {
+ cairo_surface_destroy (_surface);
+ }
}
bool
-FFTGraph::on_expose_event (GdkEventExpose* /*event*/)
+FFTGraph::on_expose_event (GdkEventExpose* event)
{
- redraw();
- return true;
-}
+ cairo_t* cr = gdk_cairo_create (GDK_DRAWABLE (get_window ()->gobj ()));
+ cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
+ cairo_clip (cr);
-FFTResult *
-FFTGraph::prepareResult(Gdk::Color color, string trackname)
-{
- FFTResult *res = new FFTResult(this, color, trackname);
+ cairo_set_source_surface(cr, _surface, 0, 0);
+ cairo_paint (cr);
- return res;
-}
+ if (_ann_x > 0 && _ann_y > 0) {
+ const float x = _ann_x - hl_margin;
+ const float freq = expf(_fft_log_base * x / currentScaleWidth) * _fft_start;
-void
-FFTGraph::set_analysis_window(AnalysisWindow *a_window)
-{
- _a_window = a_window;
-}
+ std::stringstream ss;
+ if (freq >= 10000) {
+ ss << std::setprecision (1) << std::fixed << freq / 1000 << " kHz";
+ } else if (freq >= 1000) {
+ ss << std::setprecision (2) << std::fixed << freq / 1000 << " kHz";
+ } else {
+ ss << std::setprecision (0) << std::fixed << freq << " Hz";
+ }
+ layout->set_text (ss.str ());
+ int lw, lh;
+ layout->get_pixel_size (lw, lh);
+ lw|=1; lh|=1;
-void
-FFTGraph::draw_scales(Glib::RefPtr<Gdk::Window> window)
-{
+ const float y0 = _ann_y - lh - 7;
- Glib::RefPtr<Gtk::Style> style = get_style();
- Glib::RefPtr<Gdk::GC> black = style->get_black_gc();
- Glib::RefPtr<Gdk::GC> white = style->get_white_gc();
+ _ann_area.x = _ann_x - 1 - lw * .5;
+ _ann_area.y = y0 - 1;
+ _ann_area.width = lw + 3;
+ _ann_area.height = lh + 8;
- window->draw_rectangle(black, true, 0, 0, width, height);
+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.7);
+ cairo_rectangle (cr, _ann_x - 1 - lw * .5, y0 - 1, lw + 2, lh + 2);
+ cairo_fill (cr);
- /**
- * 4 5
- * _ _
- * | |
- * 1 | | 2
- * |________|
- * 3
- **/
+ cairo_move_to (cr, _ann_x , _ann_y - 0.5);
+ cairo_rel_line_to (cr, -3.0, -5.5);
+ cairo_rel_line_to (cr, 6, 0);
+ cairo_close_path (cr);
+ cairo_fill (cr);
- // Line 1
- window->draw_line(white, h_margin, v_margin, h_margin, height - v_margin );
+ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+ cairo_move_to (cr, _ann_x - lw / 2, y0);
+ pango_cairo_update_layout (cr, layout->gobj ());
+ pango_cairo_show_layout (cr, layout->gobj ());
- // Line 2
- window->draw_line(white, width - h_margin + 1, v_margin, width - h_margin + 1, height - v_margin );
+ }
- // Line 3
- window->draw_line(white, h_margin, height - v_margin, width - h_margin, height - v_margin );
+#ifdef HARLEQUIN_DEBUGGING
+ cairo_rectangle (cr, 0, 0, width, height);
+ cairo_set_source_rgba (cr, (random() % 255) / 255.f, (random() % 255) / 255.f, 0.0, 0.5);
+ cairo_fill (cr);
+#endif
-#define DB_METRIC_LENGTH 8
- // Line 4
- window->draw_line(white, h_margin - DB_METRIC_LENGTH, v_margin, h_margin, v_margin );
+ cairo_destroy (cr);
+ return true;
+}
- // Line 5
- window->draw_line(white, width - h_margin + 1, v_margin, width - h_margin + DB_METRIC_LENGTH, v_margin );
+bool
+FFTGraph::on_motion_notify_event (GdkEventMotion* ev)
+{
+ gint x, y;
+ x = (int) floor (ev->x);
+ y = (int) floor (ev->y);
+ if (x <= hl_margin + 1 || x >= width - hr_margin) {
+ x = -1;
+ }
+ if (y <= _yoff || y >= height - v_margin - 1) {
+ y = -1;
+ }
- if (graph_gc == 0) {
- graph_gc = GC::create( get_window() );
+ if (x == _ann_x && y == _ann_y) {
+ return true;
}
+ _ann_x = x;
+ _ann_y = y;
- Color grey;
+ if (_ann_area.width == 0 || _ann_area.height == 0) {
+ queue_draw ();
+ } else {
+ queue_draw_area (_ann_area.x, _ann_area.y, _ann_area.width, _ann_area.height + 1);
+ }
- grey.set_rgb_p(0.2, 0.2, 0.2);
+ if (_ann_x > 0 &&_ann_y > 0) {
+ queue_draw_area (_ann_x - _ann_area.width, _ann_y - _ann_area.height - 1, _ann_area.width * 2, _ann_area.height + 2);
+ }
- graph_gc->set_rgb_fg_color( grey );
+ return true;
+}
- if (layout == 0) {
- layout = create_pango_layout ("");
- layout->set_font_description (get_style()->get_font());
+bool
+FFTGraph::on_leave_notify_event (GdkEventCrossing *)
+{
+ if (_ann_x == -1 && _ann_y == -1) {
+ return true;
+ }
+ _ann_x = _ann_y = -1;
+ if (_ann_area.width == 0 || _ann_area.height == 0) {
+ queue_draw ();
+ } else {
+ queue_draw_area (_ann_area.x, _ann_area.y, _ann_area.width, _ann_area.height + 1);
}
+ _ann_area.width = _ann_area.height = 0;
+ return false;
+}
+
+FFTResult *
+FFTGraph::prepareResult (Gdk::Color color, string trackname)
+{
+ FFTResult *res = new FFTResult (this, color, trackname);
- // Draw logscale
- int logscale_pos = 0;
- int position_on_scale;
+ return res;
+}
+void
+FFTGraph::set_analysis_window (AnalysisWindow *a_window)
+{
+ _a_window = a_window;
+}
-/* TODO, write better scales and change the log function so that octaves are of equal pixel length
- float scale_points[10] = { 55.0, 110.0, 220.0, 440.0, 880.0, 1760.0, 3520.0, 7040.0, 14080.0, 28160.0 };
+int
+FFTGraph::draw_scales (cairo_t* cr)
+{
+ int label_height = v_margin;
- for (int x = 0; x < 10; x++) {
+ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+ cairo_rectangle (cr, 0, 0, width, height);
+ cairo_fill (cr);
- // i = 0.. _dataSize-1
- float freq_at_bin = (SR/2.0) * ((double)i / (double)_dataSize);
+ /*
+ * 1 5
+ * _ _
+ * | |
+ * 2 | | 4
+ * |________|
+ * 3
+ */
+
+ cairo_set_line_width (cr, 1.0);
+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
+ cairo_move_to (cr, 3 , .5 + v_margin);
+ cairo_line_to (cr, .5 + hl_margin , .5 + v_margin); // 1
+ cairo_line_to (cr, .5 + hl_margin , .5 + height - v_margin); // 2
+ cairo_line_to (cr, 1.5 + width - hr_margin, .5 + height - v_margin); // 3
+ cairo_line_to (cr, 1.5 + width - hr_margin, .5 + v_margin); // 4
+ cairo_line_to (cr, width - 3 , .5 + v_margin); // 5
+ cairo_stroke (cr);
+
+ if (! layout) {
+ layout = create_pango_layout ("");
+ layout->set_font_description (get_style ()->get_font ());
+ }
+ // Draw x-axis scale 1/3 octaves centered around 1K
+ int overlap = 0;
+ // make sure 1K (x=0) is visible
+ for (int x = 0; x < 27; ++x) {
+ float freq = powf (2.f, x / 3.0) * 1000.f;
+ if (freq <= _fft_start) { continue; }
+ if (freq >= _fft_end) { break; }
- freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)(currentScaleWidth - 1) );
- }
- */
+ const float pos = currentScaleWidth * logf (freq / _fft_start) / _fft_log_base;
+ const int coord = floor (hl_margin + pos);
- for (int x = 1; x < 8; x++) {
- position_on_scale = (int)floor( (double)currentScaleWidth*(double)x/8.0);
+ if (coord < overlap) {
+ continue;
+ }
+
+ std::stringstream ss;
+ if (freq >= 10000) {
+ ss << std::setprecision (1) << std::fixed << freq / 1000 << "k";
+ } else if (freq >= 1000) {
+ ss << std::setprecision (2) << std::fixed << freq / 1000 << "k";
+ } else {
+ ss << std::setprecision (0) << std::fixed << freq << "Hz";
+ }
+ layout->set_text (ss.str ());
+ int lw, lh;
+ layout->get_pixel_size (lw, lh);
+ overlap = coord + lw + 3;
- while (_logScale[logscale_pos] < position_on_scale)
- logscale_pos++;
+ if (coord + lw / 2 > width - hr_margin - 2) {
+ break;
+ }
+ if (v_margin / 2 + lh > label_height) {
+ label_height = v_margin / 2 + lh;
+ }
- int coord = (int)(v_margin + 1.0 + position_on_scale);
+ cairo_set_source_rgba (cr, 0.2, 0.2, 0.2, 1.0);
+ cairo_move_to (cr, coord, v_margin);
+ cairo_line_to (cr, coord, height - v_margin - 1);
+ cairo_stroke (cr);
+
+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
+ cairo_move_to (cr, coord - lw / 2, v_margin / 2);
+ pango_cairo_update_layout (cr, layout->gobj ());
+ pango_cairo_show_layout (cr, layout->gobj ());
+ }
- int SR = 44100;
+ // now from 1K down to 4Hz
+ for (int x = 0; x > -24; --x) {
+ float freq = powf (2.f, x / 3.0) * 1000.f;
+ if (freq >= _fft_end) { continue; }
+ if (freq <= _fft_start) { break; }
- int rate_at_pos = (int)((double)(SR/2) * (double)logscale_pos / (double)_dataSize);
+ const float pos = currentScaleWidth * logf (freq / _fft_start) / _fft_log_base;
+ const int coord = floor (hl_margin + pos);
- char buf[32];
- 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) );
+ if (x != 0 && coord > overlap) {
+ continue;
+ }
- std::string label = buf;
+ std::stringstream ss;
+ if (freq >= 10000) {
+ ss << std::setprecision (1) << std::fixed << freq / 1000 << "k";
+ } else if (freq >= 1000) {
+ ss << std::setprecision (2) << std::fixed << freq / 1000 << "k";
+ } else {
+ ss << std::setprecision (0) << std::fixed << freq << "Hz";
+ }
+ layout->set_text (ss.str ());
+ int lw, lh;
+ layout->get_pixel_size (lw, lh);
- layout->set_text(label);
+ overlap = coord - lw - 3;
- window->draw_line(graph_gc, coord, v_margin, coord, height - v_margin - 1);
+ if (coord - lw / 2 < hl_margin + 2) {
+ break;
+ }
+ if (x == 0) {
+ // just get overlap position
+ continue;
+ }
+ if (v_margin / 2 + lh > label_height) {
+ label_height = v_margin / 2 + lh;
+ }
- int width, height;
- layout->get_pixel_size (width, height);
- window->draw_layout(white, coord - width / 2, v_margin / 2, layout);
+ cairo_set_source_rgba (cr, 0.2, 0.2, 0.2, 1.0);
+ cairo_move_to (cr, coord, v_margin);
+ cairo_line_to (cr, coord, height - v_margin - 1);
+ cairo_stroke (cr);
+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
+ cairo_move_to (cr, coord - lw / 2, v_margin / 2);
+ pango_cairo_update_layout (cr, layout->gobj ());
+ pango_cairo_show_layout (cr, layout->gobj ());
}
+ return label_height;
}
void
-FFTGraph::redraw()
+FFTGraph::redraw ()
{
Glib::Threads::Mutex::Lock lm (_a_window->track_list_lock);
- draw_scales(get_window());
+ assert (_surface);
+ cairo_t* cr = cairo_create (_surface);
+ _yoff = draw_scales (cr);
- if (_a_window == 0)
+ if (_a_window == 0) {
+ cairo_destroy (cr);
+ queue_draw ();
return;
+ }
- if (!_a_window->track_list_ready)
+ if (!_a_window->track_list_ready) {
+ cairo_destroy (cr);
+ queue_draw ();
return;
+ }
- cairo_t *cr;
- cr = gdk_cairo_create(GDK_DRAWABLE(get_window()->gobj()));
- cairo_set_line_width(cr, 1.5);
- cairo_translate(cr, (float)v_margin + 1.0, (float)h_margin);
-
-
-
- // Find "session wide" min & max
- float minf = 1000000000000.0;
- float maxf = -1000000000000.0;
-
- TreeNodeChildren track_rows = _a_window->track_list.get_model()->children();
+ float minf;
+ float maxf;
- for (TreeIter i = track_rows.begin(); i != track_rows.end(); i++) {
+ TreeNodeChildren track_rows = _a_window->track_list.get_model ()->children ();
- TreeModel::Row row = *i;
- FFTResult *res = row[_a_window->tlcols.graph];
+ if (!_show_normalized) {
+ maxf = 0.0f;
+ minf = -108.0f;
+ } else {
+ minf = 999.0f;
+ maxf = -999.0f;
+ for (TreeIter i = track_rows.begin (); i != track_rows.end (); i++) {
+ TreeModel::Row row = *i;
+ FFTResult *res = row[_a_window->tlcols.graph];
+
+ // disregard fft analysis from empty signals
+ if (res->minimum (_show_proportional) == res->maximum (_show_proportional)) {
+ continue;
+ }
+ // don't include invisible graphs
+ if (!row[_a_window->tlcols.visible]) {
+ continue;
+ }
- // disregard fft analysis from empty signals
- if (res->minimum() == res->maximum()) {
- continue;
+ minf = std::min (minf, res->minimum (_show_proportional));
+ maxf = std::max (maxf, res->maximum (_show_proportional));
}
+ }
- if ( res->minimum() < minf) {
- minf = res->minimum();
- }
+ // clamp range, > -200dBFS, at least 24dB (two y-axis labels) range
+ minf = std::max (-200.f, minf);
+ if (maxf <= minf) {
+ cairo_destroy (cr);
+ queue_draw ();
+ return;
+ }
- if ( res->maximum() > maxf) {
- maxf = res->maximum();
- }
+ if (maxf - minf < 24) {
+ maxf += 6.f;
+ minf = maxf - 24.f;
}
- if (!_show_normalized) {
- minf = -150.0f;
- maxf = 0.0f;
+ cairo_set_line_width (cr, 1.5);
+ cairo_translate (cr, hl_margin + 1, _yoff);
+
+ float fft_pane_size_w = width - hl_margin - hr_margin;
+ float fft_pane_size_h = height - v_margin - 1 - _yoff;
+ double pixels_per_db = (double)fft_pane_size_h / (double)(maxf - minf);
+
+ // draw y-axis dB
+ cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+
+ int btm_lbl = fft_pane_size_h;
+ {
+ // y-axis legend
+ layout->set_text (_("dBFS"));
+ int lw, lh;
+ layout->get_pixel_size (lw, lh);
+ cairo_move_to (cr, -2 - lw, fft_pane_size_h - lh / 2);
+ pango_cairo_update_layout (cr, layout->gobj ());
+ pango_cairo_show_layout (cr, layout->gobj ());
+ btm_lbl = fft_pane_size_h - lh;
}
- //int graph_height = height - 2 * h_margin;
+ for (int x = -6; x >= -200; x -= 12) {
+ float yp = 1.5 + fft_pane_size_h - rint ((x - minf) * pixels_per_db);
+ assert (layout);
+ std::stringstream ss;
+ ss << x;
+ layout->set_text (ss.str ());
+ int lw, lh;
+ layout->get_pixel_size (lw, lh);
+ if (yp + 2 + lh / 2 > btm_lbl) {
+ continue;
+ }
+ if (yp < 2 + lh / 2) {
+ continue;
+ }
- float fft_pane_size_w = (float)(width - 2*v_margin) - 1.0;
- float fft_pane_size_h = (float)(height - 2*h_margin);
+ cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+ cairo_move_to (cr, -2 - lw, yp - lh / 2);
+ pango_cairo_update_layout (cr, layout->gobj ());
+ pango_cairo_show_layout (cr, layout->gobj ());
- double pixels_per_db = (double)fft_pane_size_h / (double)(maxf - minf);
+ cairo_set_source_rgba (cr, .2, .2, .2, 1.0);
+ cairo_move_to (cr, 0, yp);
+ cairo_line_to (cr, fft_pane_size_w, yp);
+ cairo_stroke (cr);
+ }
- cairo_rectangle(cr, 0.0, 0.0, fft_pane_size_w, fft_pane_size_h);
- cairo_clip(cr);
+ cairo_rectangle (cr, 1, 1, fft_pane_size_w, fft_pane_size_h);
+ cairo_clip (cr);
- for (TreeIter i = track_rows.begin(); i != track_rows.end(); i++) {
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
+ cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
+ for (TreeIter i = track_rows.begin (); i != track_rows.end (); i++) {
TreeModel::Row row = *i;
// don't show graphs for tracks which are deselected
@@ -345,144 +548,121 @@ FFTGraph::redraw()
FFTResult *res = row[_a_window->tlcols.graph];
// don't show graphs for empty signals
- if (res->minimum() == res->maximum()) {
+ if (res->minimum (_show_proportional) == res->maximum (_show_proportional)) {
continue;
}
float mpp;
+ float X,Y;
if (_show_minmax) {
- mpp = -1000000.0;
- cairo_set_source_rgba(cr, res->get_color().get_red_p(), res->get_color().get_green_p(), res->get_color().get_blue_p(), 0.30);
- cairo_move_to(cr, 0.5f + (float)_logScale[0], 0.5f + (float)( fft_pane_size_h - (int)floor( (res->maxAt(0) - minf) * pixels_per_db) ));
+ X = 0.5f + _logScale[0];
+ Y = 1.5f + fft_pane_size_h - pixels_per_db * (res->maxAt (0, _show_proportional) - minf);
+ cairo_move_to (cr, X, Y);
// Draw the line of maximum values
- for (int x = 1; x < res->length(); x++) {
- if (res->maxAt(x) > mpp)
- mpp = res->maxAt(x);
- mpp = fmax(mpp, minf);
- mpp = fmin(mpp, maxf);
-
- // If the next point on the log scale is at the same location,
- // don't draw yet
- if (x + 1 < res->length() && _logScale[x] == _logScale[x + 1]) {
+ mpp = minf;
+ for (unsigned int x = 1; x < res->length () - 1; ++x) {
+ mpp = std::max (mpp, res->maxAt (x, _show_proportional));
+
+ if (_logScale[x] == _logScale[x + 1]) {
continue;
}
- float X = 0.5f + (float)_logScale[x];
- float Y = 0.5f + (float)( fft_pane_size_h - (int)floor( (mpp - minf) * pixels_per_db) );
-
- cairo_line_to(cr, X, Y);
-
- mpp = -1000000.0;
+ mpp = fmin (mpp, maxf);
+ X = 0.5f + _logScale[x];
+ Y = 1.5f + fft_pane_size_h - pixels_per_db * (mpp - minf);
+ cairo_line_to (cr, X, Y);
+ mpp = minf;
}
- mpp = +10000000.0;
+ mpp = maxf;
// Draw back to the start using the minimum value
- for (int x = res->length()-1; x >= 0; x--) {
- if (res->minAt(x) < mpp)
- mpp = res->minAt(x);
- mpp = fmax(mpp, minf);
- mpp = fmin(mpp, maxf);
-
- // If the next point on the log scale is at the same location,
- // don't draw yet
- if (x - 1 > 0 && _logScale[x] == _logScale[x - 1]) {
+ for (int x = res->length () - 1; x >= 0; --x) {
+ mpp = std::min (mpp, res->minAt (x, _show_proportional));
+
+ if (_logScale[x] == _logScale[x + 1]) {
continue;
}
- float X = 0.5f + (float)_logScale[x];
- float Y = 0.5f + (float)( fft_pane_size_h - (int)floor( (mpp - minf) * pixels_per_db) );
-
- cairo_line_to(cr, X, Y );
-
- mpp = +10000000.0;
+ mpp = fmax (mpp, minf);
+ X = 0.5f + _logScale[x];
+ Y = 1.5f + fft_pane_size_h - pixels_per_db * (mpp - minf);
+ cairo_line_to (cr, X, Y);
+ mpp = maxf;
}
- cairo_close_path(cr);
-
- cairo_fill(cr);
+ cairo_set_source_rgba (cr, res->get_color ().get_red_p (), res->get_color ().get_green_p (), res->get_color ().get_blue_p (), 0.30);
+ cairo_close_path (cr);
+ cairo_fill (cr);
}
+ // draw max of averages
+ X = 0.5f + _logScale[0];
+ Y = 1.5f + fft_pane_size_h - pixels_per_db * (res->avgAt (0, _show_proportional) - minf);
+ cairo_move_to (cr, X, Y);
+ mpp = minf;
+ for (unsigned int x = 0; x < res->length () - 1; x++) {
+ mpp = std::max (mpp, res->avgAt (x, _show_proportional));
- // Set color from track
- cairo_set_source_rgb(cr, res->get_color().get_red_p(), res->get_color().get_green_p(), res->get_color().get_blue_p());
-
- mpp = -1000000.0;
-
- cairo_move_to(cr, 0.5, fft_pane_size_h-0.5);
-
- for (int x = 0; x < res->length(); x++) {
-
-
- if (res->avgAt(x) > mpp)
- mpp = res->avgAt(x);
- mpp = fmax(mpp, minf);
- mpp = fmin(mpp, maxf);
-
- // If the next point on the log scale is at the same location,
- // don't draw yet
- if (x + 1 < res->length() && _logScale[x] == _logScale[x + 1]) {
+ if (_logScale[x] == _logScale[x + 1]) {
continue;
}
- cairo_line_to(cr, 0.5f + (float)_logScale[x], 0.5f + (float)( fft_pane_size_h - (int)floor( (mpp - minf) * pixels_per_db) ));
+ mpp = fmax (mpp, minf);
+ mpp = fmin (mpp, maxf);
- mpp = -1000000.0;
+ X = 0.5f + _logScale[x];
+ Y = 1.5f + fft_pane_size_h - pixels_per_db * (mpp - minf);
+ cairo_line_to (cr, X, Y);
+ mpp = minf;
}
- cairo_stroke(cr);
+ cairo_set_source_rgb (cr, res->get_color ().get_red_p (), res->get_color ().get_green_p (), res->get_color ().get_blue_p ());
+ cairo_stroke (cr);
}
-
- cairo_destroy(cr);
+ cairo_destroy (cr);
+ queue_draw ();
}
void
-FFTGraph::on_size_request(Gtk::Requisition* requisition)
+FFTGraph::on_size_request (Gtk::Requisition* requisition)
{
- width = max(requisition->width, minScaleWidth + h_margin * 2);
- height = max(requisition->height, minScaleHeight + 2 + v_margin * 2);
-
- update_size();
+ width = max (requisition->width, minScaleWidth + hl_margin + hr_margin);
+ height = max (requisition->height, minScaleHeight + 2 + v_margin * 2);
requisition->width = width;;
requisition->height = height;
}
void
-FFTGraph::on_size_allocate(Gtk::Allocation & alloc)
+FFTGraph::on_size_allocate (Gtk::Allocation & alloc)
{
- width = alloc.get_width();
- height = alloc.get_height();
+ width = alloc.get_width ();
+ height = alloc.get_height ();
- update_size();
+ update_size ();
DrawingArea::on_size_allocate (alloc);
}
void
-FFTGraph::update_size()
+FFTGraph::update_size ()
{
- currentScaleWidth = width - h_margin*2;
- currentScaleHeight = height - 2 - v_margin*2;
-
- 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++) {
- float freq_at_bin = (SR/2.0) * ((double)i / (double)_dataSize);
- float freq_at_pixel;
- pixel--;
- do {
- pixel++;
- freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)(currentScaleWidth - 1) );
- } while (freq_at_bin > freq_at_pixel);
-
- _logScale[i] = (int)floor(pixel);
+ framecnt_t SR = PublicEditor::instance ().session ()->nominal_frame_rate ();
+ _fft_start = SR / (double)_dataSize;
+ _fft_end = .5 * SR;
+ _fft_log_base = logf (.5 * _dataSize);
+ currentScaleWidth = width - hl_margin - hr_margin;
+ _logScale[0] = 0;
+ for (unsigned int i = 1; i < _dataSize; ++i) {
+ _logScale[i] = floor (currentScaleWidth * logf (.5 * i) / _fft_log_base);
+ }
+ if (_surface) {
+ cairo_surface_destroy (_surface);
}
+ _surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+ redraw ();
}
-
diff --git a/gtk2_ardour/fft_graph.h b/gtk2_ardour/fft_graph.h
index ab05da3..f5be5c6 100644
--- a/gtk2_ardour/fft_graph.h
+++ b/gtk2_ardour/fft_graph.h
@@ -38,62 +38,77 @@ class AnalysisWindow;
class FFTGraph : public Gtk::DrawingArea
{
- public:
+public:
- FFTGraph(int windowSize);
- ~FFTGraph();
+ FFTGraph (int windowSize);
+ ~FFTGraph ();
- void set_analysis_window(AnalysisWindow *a_window);
+ void set_analysis_window (AnalysisWindow *a_window);
- int windowSize() const { return _windowSize; }
- void setWindowSize(int windowSize);
+ int windowSize () const { return _windowSize; }
+ void setWindowSize (int windowSize);
- void redraw();
- bool on_expose_event (GdkEventExpose* event);
+ void redraw ();
+ bool on_expose_event (GdkEventExpose* event);
+ bool on_motion_notify_event (GdkEventMotion*);
+ bool on_leave_notify_event (GdkEventCrossing*);
+ bool on_button_press_event (GdkEventButton*) { return true; }
- void on_size_request(Gtk::Requisition* requisition);
- void on_size_allocate(Gtk::Allocation & alloc);
- FFTResult *prepareResult(Gdk::Color color, std::string trackname);
+ void on_size_request (Gtk::Requisition* requisition);
+ void on_size_allocate (Gtk::Allocation & alloc);
+ FFTResult *prepareResult (Gdk::Color color, std::string trackname);
- void set_show_minmax (bool v) { _show_minmax = v; redraw(); }
- void set_show_normalized (bool v) { _show_normalized = v; redraw(); }
+ void set_show_minmax (bool v) { _show_minmax = v; redraw (); }
+ void set_show_normalized (bool v) { _show_normalized = v; redraw (); }
+ void set_show_proportioanl(bool v) { _show_proportional = v; redraw (); }
- private:
+private:
- void update_size();
+ void update_size ();
- void setWindowSize_internal(int windowSize);
+ void setWindowSize_internal (int windowSize);
- void draw_scales(Glib::RefPtr<Gdk::Window> window);
+ int draw_scales (cairo_t*);
- static const int minScaleWidth = 512;
- static const int minScaleHeight = 420;
+ static const int minScaleWidth = 512;
+ static const int minScaleHeight = 420;
- int currentScaleWidth;
- int currentScaleHeight;
+ static const int hl_margin = 40; // this should scale with font (dBFS labels)
+ static const int hr_margin = 12;
+ static const int v_margin = 12;
- static const int h_margin = 20;
- static const int v_margin = 20;
- Glib::RefPtr<Gdk::GC> graph_gc;
+ int currentScaleWidth;
- int width;
- int height;
+ int width;
+ int height;
- int _windowSize;
- int _dataSize;
+ int _yoff;
+ int _ann_x;
+ int _ann_y;
+ cairo_rectangle_t _ann_area;
- Glib::RefPtr<Pango::Layout> layout;
- AnalysisWindow *_a_window;
+ unsigned int _windowSize;
+ unsigned int _dataSize;
- fftwf_plan _plan;
+ Glib::RefPtr<Pango::Layout> layout;
+ cairo_surface_t* _surface;
- float *_out;
- float *_in;
- float *_hanning;
- int *_logScale;
+ AnalysisWindow *_a_window;
- bool _show_minmax;
- bool _show_normalized;
+ fftwf_plan _plan;
+
+ float* _out;
+ float* _in;
+ float* _hanning;
+ int* _logScale;
+
+ bool _show_minmax;
+ bool _show_normalized;
+ bool _show_proportional;
+
+ float _fft_start;
+ float _fft_end;
+ float _fft_log_base;
friend class FFTResult;
};
diff --git a/gtk2_ardour/fft_result.cc b/gtk2_ardour/fft_result.cc
index a83b65e..b4a82c2 100644
--- a/gtk2_ardour/fft_result.cc
+++ b/gtk2_ardour/fft_result.cc
@@ -1,22 +1,21 @@
/*
- Copyright (C) 2006 Paul Davis
- Written by Sampo Savolainen
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2006, 2016 Paul Davis
+ * Written by Sampo Savolainen & Robin Gareus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
#include "fft_result.h"
#include "fft_graph.h"
@@ -24,8 +23,7 @@
#include <cstring>
#include <string>
#include <cmath>
-
-#include <iostream>
+#include <algorithm>
using namespace std;
@@ -35,18 +33,24 @@ FFTResult::FFTResult(FFTGraph *graph, Gdk::Color color, string trackname)
_windowSize = _graph->windowSize();
_dataSize = _windowSize / 2;
-
_averages = 0;
-
- _data_avg = (float *) malloc(sizeof(float) * _dataSize);
- memset(_data_avg,0,sizeof(float) * _dataSize);
-
- _data_min = (float *) malloc(sizeof(float) * _dataSize);
- _data_max = (float *) malloc(sizeof(float) * _dataSize);
-
- for (int i = 0; i < _dataSize; i++) {
- _data_min[i] = FLT_MAX;
- _data_max[i] = FLT_MIN;
+ _min_flat = _max_flat = 0.0;
+ _min_prop = _max_prop = 0.0;
+
+ _data_flat_avg = (float *) malloc (sizeof(float) * _dataSize);
+ _data_flat_min = (float *) malloc (sizeof(float) * _dataSize);
+ _data_flat_max = (float *) malloc (sizeof(float) * _dataSize);
+ _data_prop_avg = (float *) malloc (sizeof(float) * _dataSize);
+ _data_prop_min = (float *) malloc (sizeof(float) * _dataSize);
+ _data_prop_max = (float *) malloc (sizeof(float) * _dataSize);
+
+ for (unsigned int i = 0; i < _dataSize; i++) {
+ _data_flat_min[i] = FLT_MAX;
+ _data_flat_max[i] = FLT_MIN;
+ _data_flat_avg[i] = 0;
+ _data_prop_min[i] = FLT_MAX;
+ _data_prop_max[i] = FLT_MIN;
+ _data_prop_avg[i] = 0;
}
_color = color;
@@ -56,34 +60,31 @@ FFTResult::FFTResult(FFTGraph *graph, Gdk::Color color, string trackname)
void
FFTResult::analyzeWindow(float *window)
{
- float *_hanning = _graph->_hanning;
+ float const * const _hanning = _graph->_hanning;
float *_in = _graph->_in;
float *_out = _graph->_out;
- int i;
// Copy the data and apply the hanning window
- for (i = 0; i < _windowSize; i++) {
- _in[i] = window[ i ] * _hanning[ i ];
+ for (unsigned int i = 0; i < _windowSize; ++i) {
+ _in[i] = window[i] * _hanning[i];
}
fftwf_execute(_graph->_plan);
+ // calculate signal power per bin
float b = _out[0] * _out[0];
- _data_avg[0] += b;
- if (b < _data_min[0]) _data_min[0] = b;
- if (b > _data_max[0]) _data_max[0] = b;
-
- for (i=1; i < _dataSize - 1; i++) { // TODO: check with Jesse whether this is really correct
- b = (_out[i] * _out[i]);
-
- _data_avg[i] += b; // + (_out[_windowSize-i] * _out[_windowSize-i]);, TODO: thanks to Stefan Kost
+ _data_flat_avg[0] += b;
+ if (b < _data_flat_min[0]) _data_flat_min[0] = b;
+ if (b > _data_flat_max[0]) _data_flat_max[0] = b;
- if (_data_min[i] > b) _data_min[i] = b;
- if (_data_max[i] < b ) _data_max[i] = b;
+ for (unsigned int i = 1; i < _dataSize - 1; ++i) {
+ b = (_out[i] * _out[i]) + (_out[_windowSize - i] * _out[_windowSize - i]);
+ _data_flat_avg[i] += b;
+ if (_data_flat_min[i] > b) _data_flat_min[i] = b;
+ if (_data_flat_max[i] < b ) _data_flat_max[i] = b;
}
-
_averages++;
}
@@ -91,32 +92,43 @@ void
FFTResult::finalize()
{
if (_averages == 0) {
- _minimum = 0.0;
- _maximum = 0.0;
+ _min_flat = _max_flat = 0.0;
+ _min_prop = _max_prop = 0.0;
return;
}
// Average & scale
- for (int i = 0; i < _dataSize; i++) {
- _data_avg[i] /= _averages;
- _data_avg[i] = 10.0f * log10f(_data_avg[i]);
-
- _data_min[i] = 10.0f * log10f(_data_min[i]);
- if (_data_min[i] < -10000.0f) {
- _data_min[i] = -10000.0f;
- }
- _data_max[i] = 10.0f * log10f(_data_max[i]);
+ for (unsigned int i = 0; i < _dataSize - 1; ++i) {
+ _data_flat_avg[i] /= _averages;
+ // proportional, pink spectrum @ -18dB
+ _data_prop_avg[i] = _data_flat_avg [i] * i / 63.096f;
+ _data_prop_min[i] = _data_flat_min [i] * i / 63.096f;
+ _data_prop_max[i] = _data_flat_max [i] * i / 63.096f;
+ }
+
+ _data_prop_avg[0] = _data_flat_avg [0] / 63.096f;
+ _data_prop_min[0] = _data_flat_min [0] / 63.096f;
+ _data_prop_max[0] = _data_flat_max [0] / 63.096f;
+
+ // calculate power
+ for (unsigned int i = 0; i < _dataSize - 1; ++i) {
+ _data_flat_min[i] = power_to_db (_data_flat_min[i]);
+ _data_flat_max[i] = power_to_db (_data_flat_max[i]);
+ _data_flat_avg[i] = power_to_db (_data_flat_avg[i]);
+ _data_prop_min[i] = power_to_db (_data_prop_min[i]);
+ _data_prop_max[i] = power_to_db (_data_prop_max[i]);
+ _data_prop_avg[i] = power_to_db (_data_prop_avg[i]);
}
// find min & max
- _minimum = _maximum = _data_avg[0];
-
- for (int i = 1; i < _dataSize; i++) {
- if (_data_avg[i] < _minimum && !isinf(_data_avg[i])) {
- _minimum = _data_avg[i];
- } else if (_data_avg[i] > _maximum && !isinf(_data_avg[i])) {
- _maximum = _data_avg[i];
- }
+ _min_flat = _max_flat = _data_flat_avg[0];
+ _min_prop = _max_prop = _data_prop_avg[0];
+
+ for (unsigned int i = 1; i < _dataSize - 1; ++i) {
+ _min_flat = std::min (_min_flat, _data_flat_avg[i]);
+ _max_flat = std::max (_max_flat, _data_flat_avg[i]);
+ _min_prop = std::min (_min_prop, _data_prop_avg[i]);
+ _max_prop = std::max (_max_prop, _data_prop_avg[i]);
}
_averages = 0;
@@ -124,36 +136,10 @@ FFTResult::finalize()
FFTResult::~FFTResult()
{
- free(_data_avg);
- free(_data_min);
- free(_data_max);
+ free(_data_flat_avg);
+ free(_data_flat_min);
+ free(_data_flat_max);
+ free(_data_prop_avg);
+ free(_data_prop_min);
+ free(_data_prop_max);
}
-
-
-float
-FFTResult::avgAt(int x)
-{
- if (x < 0 || x>= _dataSize)
- return 0.0f;
-
- return _data_avg[x];
-}
-
-float
-FFTResult::minAt(int x)
-{
- if (x < 0 || x>= _dataSize)
- return 0.0f;
-
- return _data_min[x];
-}
-
-float
-FFTResult::maxAt(int x)
-{
- if (x < 0 || x>= _dataSize)
- return 0.0f;
-
- return _data_max[x];
-}
-
diff --git a/gtk2_ardour/fft_result.h b/gtk2_ardour/fft_result.h
index ddf2bb1..d7895b0 100644
--- a/gtk2_ardour/fft_result.h
+++ b/gtk2_ardour/fft_result.h
@@ -1,26 +1,26 @@
/*
- Copyright (C) 2006 Paul Davis
- Written by Sampo Savolainen
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2006, 2016 Paul Davis
+ * Written by Sampo Savolainen & Robin Gareus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
#ifndef __ardour_fft_result_h
#define __ardour_fft_result_h
+#include <math.h>
#include <fftw3.h>
#include <gdkmm/color.h>
@@ -31,47 +31,56 @@ class FFTGraph;
class FFTResult
{
- public:
+public:
- ~FFTResult();
+ ~FFTResult ();
- void analyzeWindow(float *window);
- void finalize();
+ void analyzeWindow (float *window);
+ void finalize ();
- int length() const { return _dataSize; }
+ unsigned int length () const { return _dataSize; }
- float avgAt(int x);
- float maxAt(int x);
- float minAt(int x);
+ float avgAt (unsigned int x, bool p) const
+ { return p ? _data_prop_avg[x] : _data_flat_avg[x]; }
+ float maxAt (unsigned int x, bool p) const
+ { return p ? _data_prop_max[x] : _data_flat_max[x]; }
+ float minAt (unsigned int x, bool p) const
+ { return p ? _data_prop_min[x] : _data_flat_min[x]; }
- float minimum() const { return _minimum; }
- float maximum() const { return _maximum; }
+ float minimum (bool p) const
+ { return p ? _min_prop : _min_flat; }
+ float maximum (bool p) const
+ { return p ? _max_prop : _max_flat; }
- Gdk::Color get_color() const { return _color; }
+ const Gdk::Color& get_color () const { return _color; }
- private:
- FFTResult(FFTGraph *graph, Gdk::Color color, std::string trackname);
-
- int _averages;
+private:
+ FFTResult (FFTGraph *graph, Gdk::Color color, std::string trackname);
+ friend class FFTGraph;
- float* _data_avg;
- float* _data_max;
- float* _data_min;
+ int _averages;
- float* _work;
+ float* _data_flat_avg;
+ float* _data_flat_max;
+ float* _data_flat_min;
+ float* _data_prop_avg;
+ float* _data_prop_max;
+ float* _data_prop_min;
- int _windowSize;
- int _dataSize;
+ unsigned int _windowSize;
+ unsigned int _dataSize;
- float _minimum;
- float _maximum;
+ float _min_flat;
+ float _max_flat;
+ float _min_prop;
+ float _max_prop;
- FFTGraph *_graph;
+ FFTGraph *_graph;
- Gdk::Color _color;
- std::string _trackname;
+ Gdk::Color _color;
+ std::string _trackname;
- friend class FFTGraph;
+ static float power_to_db (float v) { return v > 1e-20 ? 10.0f * log10f (v) : -200.0f; }
};
#endif /* __ardour_fft_result_h */
diff --git a/gtk2_ardour/floating_text_entry.cc b/gtk2_ardour/floating_text_entry.cc
index d264ee9..571969d 100644
--- a/gtk2_ardour/floating_text_entry.cc
+++ b/gtk2_ardour/floating_text_entry.cc
@@ -25,13 +25,14 @@
#include "gtkmm2ext/doi.h"
#include "gtkmm2ext/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
-FloatingTextEntry::FloatingTextEntry (const std::string& initial_contents)
+FloatingTextEntry::FloatingTextEntry (Gtk::Window* parent, const std::string& initial_contents)
: Gtk::Window (Gtk::WINDOW_POPUP)
, entry_changed (false)
+ , by_popup_menu (false)
{
- set_name (X_("FloatingTextEntry"));
+ //set_name (X_("FloatingTextEntry"));
set_position (Gtk::WIN_POS_MOUSE);
set_border_width (0);
@@ -42,14 +43,27 @@ FloatingTextEntry::FloatingTextEntry (const std::string& initial_contents)
entry.show ();
entry.signal_changed().connect (sigc::mem_fun (*this, &FloatingTextEntry::changed));
entry.signal_activate().connect (sigc::mem_fun (*this, &FloatingTextEntry::activated));
- entry.signal_key_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_press));
+ entry.signal_key_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_press), false);
+ entry.signal_key_release_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_release), false);
entry.signal_button_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::button_press));
- PublicEditor::instance ().signal_focus_out_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::entry_focus_out));
+ entry.signal_populate_popup().connect (sigc::mem_fun (*this, &FloatingTextEntry::populate_popup));
+
+ entry.select_region (0, -1);
+
+ if (parent) {
+ parent->signal_focus_out_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::entry_focus_out));
+ }
add (entry);
}
void
+FloatingTextEntry::populate_popup (Gtk::Menu *)
+{
+ by_popup_menu = true;
+}
+
+void
FloatingTextEntry::changed ()
{
entry_changed = true;
@@ -66,9 +80,14 @@ FloatingTextEntry::on_realize ()
bool
FloatingTextEntry::entry_focus_out (GdkEventFocus* ev)
{
+ if (by_popup_menu) {
+ by_popup_menu = false;
+ return false;
+ }
+
entry.remove_modal_grab ();
if (entry_changed) {
- use_text (entry.get_text ());
+ use_text (entry.get_text (), 0);
}
delete_when_idle ( this);
@@ -89,7 +108,7 @@ FloatingTextEntry::button_press (GdkEventButton* ev)
Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::ptr_fun (gtk_main_do_event), gdk_event_copy ((GdkEvent*) ev)), false));
if (entry_changed) {
- use_text (entry.get_text ());
+ use_text (entry.get_text (), 0);
}
delete_when_idle ( this);
@@ -100,24 +119,54 @@ FloatingTextEntry::button_press (GdkEventButton* ev)
void
FloatingTextEntry::activated ()
{
- use_text (entry.get_text()); // EMIT SIGNAL
+ use_text (entry.get_text(), 0); // EMIT SIGNAL
delete_when_idle (this);
}
bool
FloatingTextEntry::key_press (GdkEventKey* ev)
{
+ /* steal escape, tabs from GTK */
+
+ switch (ev->keyval) {
+ case GDK_Escape:
+ case GDK_ISO_Left_Tab:
+ case GDK_Tab:
+ return true;
+ }
+ return false;
+}
+
+bool
+FloatingTextEntry::key_release (GdkEventKey* ev)
+{
switch (ev->keyval) {
case GDK_Escape:
+ /* cancel edit */
+ delete_when_idle (this);
+ return true;
+
+ case GDK_ISO_Left_Tab:
+ /* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually
+ * generates a different ev->keyval, rather than setting
+ * ev->state.
+ */
+ use_text (entry.get_text(), -1); // EMIT SIGNAL, move to prev
+ delete_when_idle (this);
+ return true;
+
+ case GDK_Tab:
+ use_text (entry.get_text(), 1); // EMIT SIGNAL, move to next
delete_when_idle (this);
return true;
- break;
default:
break;
}
+
return false;
}
+
void
FloatingTextEntry::on_hide ()
{
diff --git a/gtk2_ardour/floating_text_entry.h b/gtk2_ardour/floating_text_entry.h
index 72e5adc..596914c 100644
--- a/gtk2_ardour/floating_text_entry.h
+++ b/gtk2_ardour/floating_text_entry.h
@@ -26,20 +26,29 @@
class FloatingTextEntry : public Gtk::Window
{
public:
- FloatingTextEntry (const std::string& initial_contents);
+ FloatingTextEntry (Gtk::Window* parent, const std::string& initial_contents);
- sigc::signal1<void,std::string> use_text;
+ /* 1st argument to handler is the new text
+ * 2nd argument is 0, 1 or -1 to indicate:
+ * - do not move to next editable field
+ * - move to next editable field
+ * - move to previous editable field.
+ */
+ sigc::signal2<void,std::string,int> use_text;
private:
Gtk::Entry entry;
bool entry_changed;
+ bool by_popup_menu;
/* handlers for Entry events */
- bool entry_focus_out (GdkEventFocus*);
+ bool entry_focus_out (GdkEventFocus*);
bool key_press (GdkEventKey*);
+ bool key_release (GdkEventKey*);
void activated ();
bool button_press (GdkEventButton*);
void changed ();
+ void populate_popup (Gtk::Menu*);
/* handlers for window events */
@@ -48,4 +57,3 @@ class FloatingTextEntry : public Gtk::Window
};
#endif // __ardour_window_h__
-
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index 2abd9d3..4b72a25 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -52,7 +52,7 @@
#include "ardour/midi_track.h"
#include "ardour/dB.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -82,6 +82,8 @@ reset_cursor_to_default_state (Gtk::StateType, Gtk::Entry* widget)
reset_cursor_to_default (widget);
}
+sigc::signal<void, ARDOUR::AutoState> GainMeterBase::ChangeGainAutomationState;
+
GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int fader_girth)
: gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), // value
0.0, // lower
@@ -90,6 +92,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
dB_coeff_step(Config->get_max_gain())) // page increment
, gain_automation_style_button ("")
, gain_automation_state_button ("")
+ , gain_astate_propagate (false)
, _data_type (DataType::AUDIO)
{
using namespace Menu_Helpers;
@@ -126,13 +129,13 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
gain_display.signal_activate().connect (sigc::mem_fun (*this, &GainMeter::gain_activated));
gain_display.signal_focus_in_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false);
gain_display.signal_focus_out_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false);
- gain_display.set_alignment(0.5);
+ gain_display.set_alignment (0.5);
peak_display.set_name ("MixerStripPeakDisplay");
set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */
max_peak = minus_infinity();
peak_display.set_text (_("-inf"));
- peak_display.set_alignment(0.5);
+ peak_display.set_alignment (0.5);
/* stuff related to the fact that the peak display is not, in
fact, supposed to be a text entry.
@@ -161,7 +164,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
gain_astate_menu.set_name ("ArdourContextMenu");
gain_astyle_menu.set_name ("ArdourContextMenu");
- gain_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &GainMeterBase::gain_adjusted));
+ gain_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &GainMeterBase::fader_moved));
peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeterBase::peak_button_release), false);
gain_display.signal_key_press_event().connect (sigc::mem_fun(*this, &GainMeterBase::gain_key_press), false);
@@ -190,12 +193,15 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
connections.clear ();
model_connections.drop_connections ();
- if (!pm && !amp) {
+ /* no meter and no control? nothing to do ... */
+
+ if (!pm && !control) {
level_meter->set_meter (0);
gain_slider->set_controllable (boost::shared_ptr<PBD::Controllable>());
_meter.reset ();
_amp.reset ();
_route.reset ();
+ _control.reset ();
return;
}
@@ -204,8 +210,6 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
_route = r;
_control = control;
- assert (_control);
-
level_meter->set_meter (pm.get());
gain_slider->set_controllable (_control);
@@ -224,20 +228,17 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
gain_astate_menu.items().clear ();
gain_astate_menu.items().push_back (MenuElem (S_("Automation|Manual"),
- sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
- Evoral::Parameter(GainAutomation), (AutoState) ARDOUR::Off)));
+ sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Off)));
gain_astate_menu.items().push_back (MenuElem (_("Play"),
- sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
- Evoral::Parameter(GainAutomation), (AutoState) Play)));
+ sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Play)));
gain_astate_menu.items().push_back (MenuElem (_("Write"),
- sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
- Evoral::Parameter(GainAutomation), (AutoState) Write)));
+ sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Write)));
gain_astate_menu.items().push_back (MenuElem (_("Touch"),
- sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
- Evoral::Parameter(GainAutomation), (AutoState) Touch)));
+ sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Touch)));
connections.push_back (gain_automation_style_button.signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeterBase::gain_automation_style_button_event), false));
connections.push_back (gain_automation_state_button.signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeterBase::gain_automation_state_button_event), false));
+ connections.push_back (ChangeGainAutomationState.connect (sigc::mem_fun(*this, &GainMeterBase::set_gain_astate)));
_control->alist()->automation_state_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::gain_automation_state_changed, this), gui_context());
_control->alist()->automation_style_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::gain_automation_style_changed, this), gui_context());
@@ -250,6 +251,23 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
gain_changed ();
show_gain ();
update_gain_sensitive ();
+
+ if (!_meter) {
+ peak_display.hide ();
+ } else {
+ peak_display.show ();
+ }
+}
+
+void
+GainMeterBase::set_gain_astate (AutoState as)
+{
+ if (gain_astate_propagate) {
+ gain_astate_propagate = false;
+ ChangeGainAutomationState (as);
+ return;
+ }
+ _amp->set_parameter_automation_state (Evoral::Parameter (GainAutomation), as);
}
void
@@ -400,7 +418,7 @@ GainMeterBase::reset_peak_display ()
{
_meter->reset_max();
level_meter->clear_meters();
- max_peak = -INFINITY;
+ max_peak = minus_infinity ();
peak_display.set_text (_("-inf"));
peak_display.set_name ("MixerStripPeakDisplay");
}
@@ -463,7 +481,7 @@ GainMeterBase::gain_activated ()
// if they use different LC_NUMERIC conventions,
// we will honor them.
- PBD::LocaleGuard lg ("");
+ PBD::LocaleGuard lg;
if (sscanf (gain_display.get_text().c_str(), "%f", &f) != 1) {
return;
}
@@ -472,10 +490,10 @@ GainMeterBase::gain_activated ()
/* clamp to displayable values */
if (_data_type == DataType::AUDIO) {
f = min (f, 6.0f);
- _control->set_value (dB_to_coefficient(f), Controllable::NoGroup);
+ _control->set_value (dB_to_coefficient(f), Controllable::UseGroup);
} else {
f = min (fabs (f), 2.0f);
- _control->set_value (f, Controllable::NoGroup);
+ _control->set_value (f, Controllable::UseGroup);
}
if (gain_display.has_focus()) {
@@ -520,24 +538,21 @@ GainMeterBase::show_gain ()
}
void
-GainMeterBase::gain_adjusted ()
+GainMeterBase::fader_moved ()
{
- gain_t value;
+ if (!ignore_toggle) {
- /* convert from adjustment range (0..1) to gain coefficient */
+ gain_t value;
- if (_data_type == DataType::AUDIO) {
- value = slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain());
- } else {
- value = gain_adjustment.get_value();
- }
+ /* convert from adjustment range (0..1) to gain coefficient */
- if (!ignore_toggle) {
- if (_route && _route->amp() == _amp) {
- _route->set_gain (value, Controllable::UseGroup);
+ if (_data_type == DataType::AUDIO) {
+ value = slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain());
} else {
- _control->set_value (value, Controllable::NoGroup);
+ value = gain_adjustment.get_value();
}
+
+ _control->set_value (value, Controllable::UseGroup);
}
show_gain ();
@@ -546,20 +561,23 @@ GainMeterBase::gain_adjusted ()
void
GainMeterBase::effective_gain_display ()
{
- float value = GAIN_COEFF_ZERO;
+ gain_t fader_position = 0;
switch (_data_type) {
case DataType::AUDIO:
- value = gain_to_slider_position_with_max (_control->get_value(), Config->get_max_gain());
+ /* the position of the fader should reflect any master gain,
+ * not just the control's own inherent value
+ */
+ fader_position = gain_to_slider_position_with_max (_control->get_value(), Config->get_max_gain());
break;
case DataType::MIDI:
- value = _control->get_value ();
+ fader_position = _control->get_value ();
break;
}
- if (gain_adjustment.get_value() != value) {
+ if (gain_adjustment.get_value() != fader_position) {
ignore_toggle = true;
- gain_adjustment.set_value (value);
+ gain_adjustment.set_value (fader_position);
ignore_toggle = false;
}
}
@@ -731,13 +749,13 @@ GainMeterBase::meter_point_clicked ()
void
GainMeterBase::amp_start_touch ()
{
- _control->start_touch (_amp->session().transport_frame());
+ _control->start_touch (_control->session().transport_frame());
}
void
GainMeterBase::amp_stop_touch ()
{
- _control->stop_touch (false, _amp->session().transport_frame());
+ _control->stop_touch (false, _control->session().transport_frame());
}
gint
@@ -749,6 +767,7 @@ GainMeterBase::gain_automation_state_button_event (GdkEventButton *ev)
switch (ev->button) {
case 1:
+ gain_astate_propagate = Keyboard::modifier_state_contains (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier | Keyboard::TertiaryModifier));
gain_astate_menu.popup (1, ev->time);
break;
default:
@@ -970,19 +989,18 @@ GainMeter::GainMeter (Session* s, int fader_length)
gain_automation_state_button.set_size_request (PX_SCALE(12, 15), PX_SCALE(12, 15));
gain_automation_style_button.set_size_request (PX_SCALE(12, 15), PX_SCALE(12, 15));
- fader_vbox = manage (new Gtk::VBox());
- fader_vbox->set_spacing (0);
- fader_vbox->pack_start (*gain_slider, true, true);
+ fader_vbox.set_spacing (0);
+ fader_vbox.pack_start (*gain_slider, true, true);
fader_alignment.set (0.5, 0.5, 0.0, 1.0);
- fader_alignment.add (*fader_vbox);
+ fader_alignment.add (fader_vbox);
hbox.pack_start (fader_alignment, true, true);
set_spacing (PX_SCALE(2, 2));
pack_start (gain_display_box, Gtk::PACK_SHRINK);
- pack_start (hbox, Gtk::PACK_SHRINK);
+ pack_start (hbox, true, true);
meter_alignment.set (0.5, 0.5, 0.0, 1.0);
meter_alignment.add (*level_meter);
@@ -1037,20 +1055,20 @@ GainMeter::set_controls (boost::shared_ptr<Route> r,
if (_route) {
_route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ());
+ hbox.pack_start (meter_hbox, true, true);
+ meter_hbox.show ();
}
- /*
- if we have a non-hidden route (ie. we're not the click or the auditioner),
- pack some route-dependent stuff.
- */
-
- hbox.pack_start (meter_hbox, true, true);
-
// if (r && !r->is_auditioner()) {
// fader_vbox->pack_start (gain_automation_state_button, false, false, 0);
// }
- hbox.show_all ();
+ gain_display_box.show ();
+ gain_display.show ();
+ gain_slider->show ();
+ fader_vbox.show ();
+ fader_alignment.show ();
+ hbox.show ();
setup_meters ();
}
diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h
index 7cf3410..1594876 100644
--- a/gtk2_ardour/gain_meter.h
+++ b/gtk2_ardour/gain_meter.h
@@ -98,6 +98,14 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
*/
PBD::Signal1<bool, GdkEventButton *> LevelMeterButtonPress;
+ static std::string astate_string (ARDOUR::AutoState);
+ static std::string short_astate_string (ARDOUR::AutoState);
+ static std::string _astate_string (ARDOUR::AutoState, bool);
+
+ static std::string astyle_string (ARDOUR::AutoStyle);
+ static std::string short_astyle_string (ARDOUR::AutoStyle);
+ static std::string _astyle_string (ARDOUR::AutoStyle, bool);
+
protected:
friend class MixerStrip;
@@ -131,6 +139,10 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
Gtk::Menu gain_astate_menu;
Gtk::Menu gain_astyle_menu;
+ void set_gain_astate (ARDOUR::AutoState);
+ bool gain_astate_propagate;
+ static sigc::signal<void, ARDOUR::AutoState> ChangeGainAutomationState;
+
gint gain_automation_style_button_event (GdkEventButton *);
gint gain_automation_state_button_event (GdkEventButton *);
gint pan_automation_style_button_event (GdkEventButton *);
@@ -140,15 +152,6 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
void gain_automation_style_changed();
void setup_gain_adjustment ();
-
- std::string astate_string (ARDOUR::AutoState);
- std::string short_astate_string (ARDOUR::AutoState);
- std::string _astate_string (ARDOUR::AutoState, bool);
-
- std::string astyle_string (ARDOUR::AutoStyle);
- std::string short_astyle_string (ARDOUR::AutoStyle);
- std::string _astyle_string (ARDOUR::AutoStyle, bool);
-
Width _width;
void show_gain ();
@@ -157,7 +160,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
float max_peak;
- void gain_adjusted ();
+ void fader_moved ();
void gain_changed ();
void meter_point_clicked ();
@@ -232,7 +235,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
Gtk::HBox gain_display_box;
Gtk::HBox fader_box;
- Gtk::VBox* fader_vbox;
+ Gtk::VBox fader_vbox;
Gtk::HBox hbox;
Gtk::HBox meter_hbox;
Gtk::Alignment fader_alignment;
diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc
index ef2de43..7832dcf 100644
--- a/gtk2_ardour/generic_pluginui.cc
+++ b/gtk2_ardour/generic_pluginui.cc
@@ -28,6 +28,7 @@
#include <vector>
#include "pbd/stl_delete.h"
+#include "pbd/unwind.h"
#include "pbd/xml++.h"
#include "pbd/failed_constructor.h"
@@ -47,11 +48,13 @@
#include "plugin_ui.h"
#include "gui_thread.h"
#include "automation_controller.h"
+#include "ardour_knob.h"
+#include "gain_meter.h"
#include "timers.h"
#include "tooltips.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -62,11 +65,6 @@ using namespace ARDOUR_UI_UTILS;
GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrollable)
: PlugUIBase (pi)
- , button_table (initial_button_rows, initial_button_cols)
- , output_table (initial_output_rows, initial_output_cols)
- , hAdjustment(0.0, 0.0, 0.0)
- , vAdjustment(0.0, 0.0, 0.0)
- , scroller_view(hAdjustment, vAdjustment)
, automation_menu (0)
, is_scrollable(scrollable)
{
@@ -89,6 +87,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
set_latency_label ();
smaller_hbox->pack_start (latency_button, false, false, 4);
+ smaller_hbox->pack_start (pin_management_button, false, false, 4);
smaller_hbox->pack_start (_preset_combo, false, false);
smaller_hbox->pack_start (_preset_modified, false, false);
smaller_hbox->pack_start (add_button, false, false);
@@ -136,25 +135,31 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
main_contents.pack_start (*constraint_hbox, false, false);
- if (is_scrollable ) {
- scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
- scroller.set_name ("PluginEditor");
- scroller_view.set_name("PluginEditor");
- scroller_view.add (hpacker);
- scroller.add (scroller_view);
-
- main_contents.pack_start (scroller, true, true);
-
+ if (is_scrollable) {
+ Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow());
+ scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+ scroller->set_name ("PluginEditor");
+ scroller->add (hpacker);
+ main_contents.pack_start (*scroller, true, true);
} else {
main_contents.pack_start (hpacker, false, false);
}
pi->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(pi)), gui_context());
- bypass_button.set_active (!pi->active());
+ bypass_button.set_active (!pi->enabled());
prefheight = 0;
build ();
+
+ /* Listen for property changes that are not notified normally because
+ * AutomationControl has only support for numeric values currently.
+ * The only case is Variant::PATH for now */
+ plugin->PropertyChanged.connect(*this, invalidator(*this),
+ boost::bind(&GenericPluginUI::path_property_changed, this, _1, _2),
+ gui_context());
+
+ main_contents.show ();
}
GenericPluginUI::~GenericPluginUI ()
@@ -216,58 +221,11 @@ static const float default_similarity_threshold = 0.3;
void
GenericPluginUI::build ()
{
- guint32 i = 0;
- guint32 x = 0;
- Frame* frame;
- Frame* bt_frame;
- VBox* box;
- int output_row, output_col;
- int button_row, button_col;
- int output_rows, output_cols;
- int button_rows, button_cols;
-
- hpacker.set_spacing (10);
-
- output_rows = initial_output_rows;
- output_cols = initial_output_cols;
- button_rows = initial_button_rows;
- button_cols = initial_button_cols;
- output_row = 0;
- button_row = 0;
- output_col = 0;
- button_col = 0;
-
- button_table.set_homogeneous (false);
- button_table.set_row_spacings (2);
- button_table.set_col_spacings (2);
- output_table.set_homogeneous (true);
- output_table.set_row_spacings (2);
- output_table.set_col_spacings (2);
- button_table.set_border_width (5);
- output_table.set_border_width (5);
-
- hpacker.set_border_width (10);
-
- bt_frame = manage (new Frame);
- bt_frame->set_name ("BaseFrame");
- bt_frame->set_label (_("Switches"));
- bt_frame->add (button_table);
- hpacker.pack_start(*bt_frame, true, true);
-
- box = manage (new VBox);
- box->set_border_width (5);
- box->set_spacing (1);
-
- frame = manage (new Frame);
- frame->set_name ("BaseFrame");
- frame->set_label (_("Controls"));
- frame->add (*box);
- hpacker.pack_start(*frame, true, true);
-
std::vector<ControlUI *> control_uis;
+ bool grid = true;
// Build a ControlUI for each control port
- for (i = 0; i < plugin->parameter_count(); ++i) {
+ for (size_t i = 0; i < plugin->parameter_count(); ++i) {
if (plugin->parameter_is_control (i)) {
@@ -285,6 +243,11 @@ GenericPluginUI::build ()
const float value = plugin->get_parameter(i);
ControlUI* cui;
+ Plugin::UILayoutHint hint;
+
+ if (!plugin->get_layout(i, hint)) {
+ grid = false;
+ }
boost::shared_ptr<ARDOUR::AutomationControl> c
= boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
@@ -292,18 +255,24 @@ GenericPluginUI::build ()
ParameterDescriptor desc;
plugin->get_parameter_descriptor(i, desc);
- if ((cui = build_control_ui (param, desc, c, value, plugin->parameter_is_input(i))) == 0) {
+ if ((cui = build_control_ui (param, desc, c, value, plugin->parameter_is_input(i), hint.knob)) == 0) {
error << string_compose(_("Plugin Editor: could not build control element for port %1"), i) << endmsg;
continue;
}
+ if (grid) {
+ cui->x0 = hint.x0;
+ cui->x1 = hint.x1;
+ cui->y0 = hint.y0;
+ cui->y1 = hint.y1;
+ }
+
const std::string param_docs = plugin->get_parameter_docs(i);
if (!param_docs.empty()) {
set_tooltip(cui, param_docs.c_str());
}
control_uis.push_back(cui);
- input_controls_with_automation.push_back (cui);
}
}
@@ -335,39 +304,117 @@ GenericPluginUI::build ()
plugin->announce_property_values();
}
+ if (grid) {
+ custom_layout (control_uis);
+ } else {
+ automatic_layout (control_uis);
+ }
+
+ output_update ();
+
+ automation_manual_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Off));
+ automation_play_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Play));
+ automation_write_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Write));
+ automation_touch_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Touch));
+
+ /* XXX This is a workaround for AutomationControl not knowing about preset loads */
+ plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&GenericPluginUI::update_input_displays, this), gui_context ());
+}
+
+
+void
+GenericPluginUI::automatic_layout (const std::vector<ControlUI*>& control_uis)
+{
+ guint32 x = 0;
+
+ static const int32_t initial_button_rows = 12;
+ static const int32_t initial_button_cols = 1;
+ static const int32_t initial_output_rows = 1;
+ static const int32_t initial_output_cols = 4;
+
+ Gtk::Table* button_table = manage (new Gtk::Table (initial_button_rows, initial_button_cols));
+ Gtk::Table* output_table = manage (new Gtk::Table (initial_output_rows, initial_output_cols));
+
+ Frame* frame;
+ Frame* bt_frame;
+ VBox* box;
+ int output_row, output_col;
+ int button_row, button_col;
+ int output_rows, output_cols;
+ int button_rows, button_cols;
+
+ hpacker.set_spacing (10);
+ hpacker.set_border_width (10);
+
+ output_rows = initial_output_rows;
+ output_cols = initial_output_cols;
+ button_rows = initial_button_rows;
+ button_cols = initial_button_cols;
+ output_row = 0;
+ button_row = 0;
+ output_col = 0;
+ button_col = 0;
+
+ button_table->set_homogeneous (false);
+ button_table->set_row_spacings (2);
+ button_table->set_col_spacings (2);
+ output_table->set_homogeneous (true);
+ output_table->set_row_spacings (2);
+ output_table->set_col_spacings (2);
+ button_table->set_border_width (5);
+ output_table->set_border_width (5);
+
+
+ bt_frame = manage (new Frame);
+ bt_frame->set_name ("BaseFrame");
+ bt_frame->set_label (_("Switches"));
+ bt_frame->add (*button_table);
+ hpacker.pack_start(*bt_frame, true, true);
+
+ box = manage (new VBox);
+ box->set_border_width (5);
+ box->set_spacing (1);
+
+ frame = manage (new Frame);
+ frame->set_name ("BaseFrame");
+ frame->set_label (_("Controls"));
+ frame->add (*box);
+ hpacker.pack_start(*frame, true, true);
+
// Add special controls to UI, and build list of normal controls to be layed out later
std::vector<ControlUI *> cui_controls_list;
- for (i = 0; i < control_uis.size(); ++i) {
+ for (size_t i = 0; i < control_uis.size(); ++i) {
ControlUI* cui = control_uis[i];
- if (cui->controller || cui->clickbox || cui->combo) {
- // Get all of the controls into a list, so that
- // we can lay them out a bit more nicely later.
- cui_controls_list.push_back(cui);
- } else if (cui->button || cui->file_button) {
+ if (cui->button || cui->file_button) {
if (!is_scrollable && button_row == button_rows) {
button_row = 0;
if (++button_col == button_cols) {
button_cols += 2;
- button_table.resize (button_rows, button_cols);
+ button_table->resize (button_rows, button_cols);
}
}
- button_table.attach (*cui, button_col, button_col + 1, button_row, button_row+1,
+ button_table->attach (*cui, button_col, button_col + 1, button_row, button_row+1,
FILL|EXPAND, FILL);
button_row++;
+ } else if (cui->controller || cui->clickbox || cui->combo) {
+ // Get all of the controls into a list, so that
+ // we can lay them out a bit more nicely later.
+ cui_controls_list.push_back(cui);
+
} else if (cui->display) {
- output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1,
+ output_table->attach (*cui, output_col, output_col + 1, output_row, output_row+1,
FILL|EXPAND, FILL);
// TODO: The meters should be divided into multiple rows
if (++output_col == output_cols) {
output_cols ++;
- output_table.resize (output_rows, output_cols);
+ output_table->resize (output_rows, output_cols);
}
}
}
@@ -381,7 +428,7 @@ GenericPluginUI::build ()
std::vector<float> similarity_scores(cui_controls_list.size());
float most_similar = 0.0, least_similar = 1.0;
- i = 0;
+ size_t i = 0;
for (vector<ControlUI*>::iterator cuip = cui_controls_list.begin(); cuip != cui_controls_list.end(); ++cuip, ++i) {
label = (*cuip)->label.get_text();
numbers_in_labels[i] = get_number(label);
@@ -461,33 +508,52 @@ GenericPluginUI::build ()
hpacker.remove (*frame);
}
- if (button_table.children().empty()) {
+ if (button_table->children().empty()) {
hpacker.remove (*bt_frame);
+ delete button_table;
+ } else {
+ button_table->show_all ();
}
- if (!output_table.children().empty()) {
+ if (!output_table->children().empty()) {
frame = manage (new Frame);
frame->set_name ("BaseFrame");
frame->set_label(_("Meters"));
- frame->add (output_table);
+ frame->add (*output_table);
hpacker.pack_end (*frame, true, true);
+ output_table->show_all ();
+ } else {
+ delete output_table;
}
+}
- output_update ();
-
- output_table.show_all ();
- button_table.show_all ();
+void
+GenericPluginUI::custom_layout (const std::vector<ControlUI*>& control_uis)
+{
+ Gtk::Table* layout = manage (new Gtk::Table ());
- automation_manual_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Off));
- automation_play_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Play));
- automation_write_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Write));
- automation_touch_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Touch));
+ for (vector<ControlUI*>::const_iterator i = control_uis.begin(); i != control_uis.end(); ++i) {
+ ControlUI* cui = *i;
+ if (cui->x0 < 0 || cui->y0 < 0) {
+ continue;
+ }
+ layout->attach (*cui, cui->x0, cui->x1, cui->y0, cui->y1, FILL, SHRINK, 2, 2);
+ }
+ hpacker.pack_start (*layout, true, true);
}
GenericPluginUI::ControlUI::ControlUI (const Evoral::Parameter& p)
: param(p)
, automate_button (X_("")) // force creation of a label
- , file_button(NULL)
+ , combo (0)
+ , clickbox (0)
+ , file_button (0)
+ , spin_box (0)
+ , display (0)
+ , hbox (0)
+ , vbox (0)
+ , meterinfo (0)
+ , knobtable (0)
{
automate_button.set_name ("PluginAutomateButton");
set_tooltip (automate_button, _("Automation control"));
@@ -497,13 +563,13 @@ GenericPluginUI::ControlUI::ControlUI (const Evoral::Parameter& p)
below). be sure to include a descender.
*/
- set_size_request_to_display_given_text (automate_button, _("Mgnual"), 15, 10);
+ set_size_request_to_display_given_text (automate_button, _("Mgnual"), 12, 6);
+
+ ignore_change = false;
+ update_pending = false;
+ button = false;
- ignore_change = 0;
- display = 0;
- button = 0;
- clickbox = 0;
- meterinfo = 0;
+ x0 = x1 = y0 = y1 = -1;
}
GenericPluginUI::ControlUI::~ControlUI()
@@ -521,21 +587,30 @@ GenericPluginUI::automation_state_changed (ControlUI* cui)
// don't lock to avoid deadlock because we're triggered by
// AutomationControl::Changed() while the automation lock is taken
+
+ if (cui->knobtable) {
+ cui->automate_button.set_text (
+ GainMeterBase::astate_string (
+ insert->get_parameter_automation_state (cui->parameter()))
+ );
+ return;
+ }
+
switch (insert->get_parameter_automation_state (cui->parameter()) & (ARDOUR::Off|Play|Touch|Write)) {
case ARDOUR::Off:
- cui->automate_button.set_label (S_("Automation|Manual"));
+ cui->automate_button.set_text (S_("Automation|Manual"));
break;
case Play:
- cui->automate_button.set_label (_("Play"));
+ cui->automate_button.set_text (_("Play"));
break;
case Write:
- cui->automate_button.set_label (_("Write"));
+ cui->automate_button.set_text (_("Write"));
break;
case Touch:
- cui->automate_button.set_label (_("Touch"));
+ cui->automate_button.set_text (_("Touch"));
break;
default:
- cui->automate_button.set_label (_("???"));
+ cui->automate_button.set_text (_("???"));
break;
}
}
@@ -574,24 +649,59 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter& param,
const ParameterDescriptor& desc,
boost::shared_ptr<AutomationControl> mcontrol,
float value,
- bool is_input)
+ bool is_input,
+ bool use_knob)
{
ControlUI* control_ui = 0;
control_ui = manage (new ControlUI (param));
control_ui->combo = 0;
control_ui->control = mcontrol;
- control_ui->update_pending = false;
control_ui->label.set_text (desc.label);
control_ui->label.set_alignment (0.0, 0.5);
control_ui->label.set_name ("PluginParameterLabel");
-
control_ui->set_spacing (5);
Gtk::Requisition req (control_ui->automate_button.size_request());
if (is_input) {
+ if (desc.datatype == Variant::PATH) {
+
+ /* We shouldn't get that type for input ports */
+ assert(param.type() == PluginPropertyAutomation);
+
+ /* Build a file selector button */
+
+ // Create/add controller
+ control_ui->file_button = manage(new Gtk::FileChooserButton(Gtk::FILE_CHOOSER_ACTION_OPEN));
+ control_ui->file_button->set_title(desc.label);
+
+ if (use_knob) {
+ control_ui->knobtable = manage (new Table());
+ control_ui->pack_start(*control_ui->knobtable, true, false);
+ control_ui->knobtable->attach (control_ui->label, 0, 1, 0, 1);
+ control_ui->knobtable->attach (*control_ui->file_button, 0, 1, 1, 2);
+ } else {
+ control_ui->pack_start (control_ui->label, false, true);
+ control_ui->pack_start (*control_ui->file_button, true, true);
+ }
+
+ // Monitor changes from the user.
+ control_ui->file_button->signal_file_set().connect(
+ sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::set_path_property),
+ desc, control_ui->file_button));
+
+ /* Add the filebutton control to a map so that we can update it when
+ * the corresponding property changes. This doesn't go through the usual
+ * AutomationControls, because they don't support non-numeric values. */
+ _filepath_controls.insert(std::make_pair(desc.key, control_ui->file_button));
+
+ return control_ui;
+ }
+
+ assert(mcontrol);
+
/* See if there any named values for our input value */
control_ui->scale_points = desc.scale_points;
@@ -607,137 +717,145 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter& param,
* b) This port is marked as being an enumeration.
*/
- std::vector<std::string> labels;
- for (
- ARDOUR::ScalePoints::const_iterator i = control_ui->scale_points->begin();
- i != control_ui->scale_points->end();
- ++i) {
-
- labels.push_back(i->first);
+ control_ui->combo = new ArdourDropdown();
+ for (ARDOUR::ScalePoints::const_iterator i = control_ui->scale_points->begin();
+ i != control_ui->scale_points->end();
+ ++i) {
+ control_ui->combo->AddMenuElem(Menu_Helpers::MenuElem(
+ i->first,
+ sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed),
+ control_ui,
+ i->second)));
}
- control_ui->combo = new Gtk::ComboBoxText();
- set_popdown_strings(*control_ui->combo, labels);
- control_ui->combo->signal_changed().connect(
- sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed),
- control_ui));
- mcontrol->Changed.connect(control_connections, invalidator(*this),
- boost::bind(&GenericPluginUI::ui_parameter_changed,
- this, control_ui),
- gui_context());
- control_ui->pack_start(control_ui->label, true, true);
- control_ui->pack_start(*control_ui->combo, false, true);
-
update_control_display(control_ui);
- return control_ui;
- }
-
- if (desc.toggled) {
+ } else {
- /* Build a button */
+ /* create the controller */
- control_ui->button = manage (new ToggleButton ());
- control_ui->button->set_name ("PluginEditorButton");
- control_ui->button->set_size_request (20, 20);
+ /* XXX memory leak: SliderController not destroyed by ControlUI
+ * destructor, and manage() reports object hierarchy
+ * ambiguity.
+ */
+ control_ui->controller = AutomationController::create(insert, mcontrol->parameter(), desc, mcontrol, use_knob);
- control_ui->pack_start (control_ui->label, true, true);
- control_ui->pack_start (*control_ui->button, false, true);
- control_ui->pack_start (control_ui->automate_button, false, false);
+ /* Control UI's don't need the rapid timer workaround */
+ control_ui->controller->stop_updating ();
- control_ui->button->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_port_toggled), control_ui));
- control_ui->automate_button.signal_clicked().connect (bind (mem_fun(*this, &GenericPluginUI::astate_clicked), control_ui));
+ /* XXX this code is not right yet, because it doesn't handle
+ the absence of bounds in any sensible fashion.
+ */
- mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::toggle_parameter_changed, this, control_ui), gui_context());
- mcontrol->alist()->automation_state_changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui), gui_context());
+ Adjustment* adj = control_ui->controller->adjustment();
- if (value > 0.5){
- control_ui->button->set_active(true);
+ if (desc.integer_step && !desc.toggled) {
+ control_ui->clickbox = new ClickBox (adj, "PluginUIClickBox", true);
+ Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
+ if (desc.unit == ParameterDescriptor::MIDI_NOTE) {
+ control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::midinote_printer), control_ui));
+ } else {
+ control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::integer_printer), control_ui));
+ }
+ } else if (desc.toggled) {
+ control_ui->controller->set_size_request (req.height, req.height);
+ } else if (use_knob) {
+ control_ui->controller->set_size_request (req.height * 1.5, req.height * 1.5);
+ } else {
+ control_ui->controller->set_size_request (200, req.height);
+ control_ui->controller->set_name (X_("ProcessorControlSlider"));
}
- automation_state_changed (control_ui);
-
- return control_ui;
- }
-
- if (desc.datatype == Variant::PATH) {
-
- /* Build a file selector button */
-
- // Create/add controller
- control_ui->file_button = manage(new Gtk::FileChooserButton(Gtk::FILE_CHOOSER_ACTION_OPEN));
- control_ui->file_button->set_title(desc.label);
-
- control_ui->pack_start (control_ui->label, false, true);
- control_ui->pack_start (*control_ui->file_button, true, true);
-
- // Connect signals (TODO: do this via the Control)
- control_ui->file_button->signal_file_set().connect(
- sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::set_property),
- desc, control_ui->file_button));
- plugin->PropertyChanged.connect(*this, invalidator(*this),
- boost::bind(&GenericPluginUI::property_changed, this, _1, _2),
- gui_context());
-
- _property_controls.insert(std::make_pair(desc.key, control_ui->file_button));
- control_ui->file_button = control_ui->file_button;
-
- return control_ui;
- }
+ if (!desc.integer_step && !desc.toggled && use_knob) {
+ control_ui->spin_box = manage (new ArdourSpinner (mcontrol, adj, insert));
+ }
- /* create the controller */
+ adj->set_value (mcontrol->internal_to_interface(value));
- if (mcontrol) {
- control_ui->controller = AutomationController::create(insert, mcontrol->parameter(), desc, mcontrol);
}
- /* XXX this code is not right yet, because it doesn't handle
- the absence of bounds in any sensible fashion.
- */
-
- Adjustment* adj = control_ui->controller->adjustment();
-
- if (desc.integer_step) {
- control_ui->clickbox = new ClickBox (adj, "PluginUIClickBox", true);
- Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
- if (desc.unit == ParameterDescriptor::MIDI_NOTE) {
- control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::midinote_printer), control_ui));
+ if (use_knob) {
+ set_size_request_to_display_given_text (control_ui->automate_button, "M", 2, 2);
+
+ control_ui->label.set_alignment (0.5, 0.5);
+ control_ui->knobtable = manage (new Table());
+ control_ui->pack_start(*control_ui->knobtable, true, true);
+
+ if (control_ui->combo) {
+ control_ui->knobtable->attach (control_ui->label, 0, 1, 0, 1);
+ control_ui->knobtable->attach (*control_ui->combo, 0, 1, 1, 2);
+ } else if (control_ui->clickbox) {
+ control_ui->knobtable->attach (*control_ui->clickbox, 0, 2, 0, 1);
+ control_ui->knobtable->attach (control_ui->label, 0, 1, 1, 2, FILL, SHRINK);
+ control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 1, 2, SHRINK, SHRINK, 2, 0);
+ } else if (control_ui->spin_box) {
+ ArdourKnob* knob = dynamic_cast<ArdourKnob*>(control_ui->controller->widget ());
+ knob->set_tooltip_prefix (desc.label + ": ");
+ knob->set_printer (insert);
+ Alignment *align = manage (new Alignment (.5, .5, 0, 0));
+ align->add (*control_ui->controller);
+ control_ui->knobtable->attach (*align, 0, 1, 0, 1, EXPAND, SHRINK, 1, 2);
+ control_ui->knobtable->attach (*control_ui->spin_box, 0, 2, 1, 2);
+ control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 0, 1, SHRINK, SHRINK, 2, 0);
+ } else if (desc.toggled) {
+ Alignment *align = manage (new Alignment (.5, .5, 0, 0));
+ align->add (*control_ui->controller);
+ control_ui->knobtable->attach (*align, 0, 2, 0, 1, EXPAND, SHRINK, 2, 2);
+ control_ui->knobtable->attach (control_ui->label, 0, 1, 1, 2, FILL, SHRINK);
+ control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 1, 2, SHRINK, SHRINK, 2, 0);
} else {
- control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::integer_printer), control_ui));
+ control_ui->knobtable->attach (*control_ui->controller, 0, 2, 0, 1);
+ control_ui->knobtable->attach (control_ui->label, 0, 1, 1, 2, FILL, SHRINK);
+ control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 1, 2, SHRINK, SHRINK, 2, 0);
}
- } else {
- //sigc::slot<void,char*,uint32_t> pslot = sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::print_parameter), (uint32_t) port_index);
- control_ui->controller->set_size_request (200, req.height);
- control_ui->controller->set_name (X_("ProcessorControlSlider"));
+ } else {
+ control_ui->pack_start (control_ui->label, true, true);
+ if (control_ui->combo) {
+ control_ui->pack_start(*control_ui->combo, false, true);
+ } else if (control_ui->clickbox) {
+ control_ui->pack_start (*control_ui->clickbox, false, false);
+ } else if (control_ui->spin_box) {
+ control_ui->pack_start (*control_ui->spin_box, false, false);
+ control_ui->pack_start (*control_ui->controller, false, false);
+ } else {
+ control_ui->pack_start (*control_ui->controller, false, false);
+ }
+ control_ui->pack_start (control_ui->automate_button, false, false);
}
- adj->set_value (mcontrol->internal_to_interface(value));
-
- /* XXX memory leak: SliderController not destroyed by ControlUI
- destructor, and manage() reports object hierarchy
- ambiguity.
- */
- control_ui->pack_start (control_ui->label, true, true);
- if (desc.integer_step) {
- control_ui->pack_start (*control_ui->clickbox, false, false);
+ if (mcontrol->flags () & Controllable::NotAutomatable) {
+ control_ui->automate_button.set_sensitive (false);
+ set_tooltip(control_ui->automate_button, _("This control cannot be automated"));
} else {
- control_ui->pack_start (*control_ui->controller, false, false);
+ control_ui->automate_button.signal_clicked.connect (sigc::bind (
+ sigc::mem_fun(*this, &GenericPluginUI::astate_clicked),
+ control_ui));
+ mcontrol->alist()->automation_state_changed.connect (
+ control_connections,
+ invalidator (*this),
+ boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui),
+ gui_context());
+ input_controls_with_automation.push_back (control_ui);
}
- control_ui->pack_start (control_ui->automate_button, false, false);
- control_ui->automate_button.signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::astate_clicked), control_ui));
+ if (desc.toggled) {
+ control_ui->button = true;
+ ArdourButton* but = dynamic_cast<ArdourButton*>(control_ui->controller->widget ());
+ assert (but);
+ but->set_name ("pluginui toggle");
+ update_control_display(control_ui);
+ }
automation_state_changed (control_ui);
- mcontrol->alist()->automation_state_changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui), gui_context());
-
+ /* Add to the list of CUIs that need manual update to workaround
+ * AutomationControl not knowing about preset loads */
input_controls.push_back (control_ui);
- input_controls_with_automation.push_back (control_ui);
- } else if (!is_input) {
+ } else {
control_ui->display = manage (new EventBox);
control_ui->display->set_name ("ParameterValueDisplay");
@@ -751,54 +869,64 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter& param,
control_ui->display->show_all ();
- /* set up a meter */
- /* TODO: only make a meter if the port is Hinted for it */
-
- MeterInfo * info = new MeterInfo();
- control_ui->meterinfo = info;
-
- info->meter = new FastMeter (
- 5, 5, FastMeter::Vertical, 0,
- 0x0000aaff,
- 0x008800ff, 0x008800ff,
- 0x00ff00ff, 0x00ff00ff,
- 0xcccc00ff, 0xcccc00ff,
- 0xffaa00ff, 0xffaa00ff,
- 0xff0000ff,
- UIConfiguration::instance().color ("meter background bottom"),
- UIConfiguration::instance().color ("meter background top")
- );
+ control_ui->vbox = manage (new VBox);
+ control_ui->vbox->set_spacing(3);
- info->min_unbound = desc.min_unbound;
- info->max_unbound = desc.max_unbound;
+ if (desc.integer_step || desc.enumeration) {
+ control_ui->vbox->pack_end (*control_ui->display, false, false);
+ control_ui->vbox->pack_end (control_ui->label, false, false);
+ } else {
+ /* set up a meter for float ports */
- info->min = desc.lower;
- info->max = desc.upper;
+ MeterInfo * info = new MeterInfo();
+ control_ui->meterinfo = info;
- control_ui->vbox = manage (new VBox);
- control_ui->hbox = manage (new HBox);
+ info->meter = new FastMeter (
+ 5, 5, FastMeter::Vertical, 0,
+ 0x0000aaff,
+ 0x008800ff, 0x008800ff,
+ 0x00ff00ff, 0x00ff00ff,
+ 0xcccc00ff, 0xcccc00ff,
+ 0xffaa00ff, 0xffaa00ff,
+ 0xff0000ff,
+ UIConfiguration::instance().color ("meter background bottom"),
+ UIConfiguration::instance().color ("meter background top")
+ );
- control_ui->hbox->set_spacing(1);
- control_ui->vbox->set_spacing(3);
+ info->min_unbound = desc.min_unbound;
+ info->max_unbound = desc.max_unbound;
- control_ui->label.set_angle(90);
- control_ui->hbox->pack_start (control_ui->label, false, false);
- control_ui->hbox->pack_start (*info->meter, false, false);
+ info->min = desc.lower;
+ info->max = desc.upper;
- control_ui->vbox->pack_start (*control_ui->hbox, false, false);
+ control_ui->label.set_angle(90);
- control_ui->vbox->pack_start (*control_ui->display, false, false);
+ HBox* center = manage (new HBox);
+ center->set_spacing(1);
+ center->pack_start (control_ui->label, false, false);
+ center->pack_start (*info->meter, false, false);
- control_ui->pack_start (*control_ui->vbox);
+ control_ui->hbox = manage (new HBox);
+ control_ui->hbox->pack_start (*center, true, false);
+
+ // horizontally center this hbox in the vbox
+ control_ui->vbox->pack_start (*control_ui->hbox, false, false);
- control_ui->meterinfo->meter->show_all();
- control_ui->meterinfo->packed = true;
+ control_ui->meterinfo->meter->show_all();
+ control_ui->meterinfo->packed = true;
+ control_ui->vbox->pack_start (*control_ui->display, false, false);
+ }
+
+ control_ui->pack_start (*control_ui->vbox);
output_controls.push_back (control_ui);
}
if (mcontrol) {
- mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::ui_parameter_changed, this, control_ui), gui_context());
+ mcontrol->Changed.connect(control_connections, invalidator(*this),
+ boost::bind(&GenericPluginUI::ui_parameter_changed,
+ this, control_ui),
+ gui_context());
}
return control_ui;
@@ -812,6 +940,7 @@ GenericPluginUI::astate_clicked (ControlUI* cui)
if (automation_menu == 0) {
automation_menu = manage (new Menu);
automation_menu->set_name ("ArdourContextMenu");
+ automation_menu->set_reserve_toggle_size(false);
}
MenuList& items (automation_menu->items());
@@ -826,7 +955,9 @@ GenericPluginUI::astate_clicked (ControlUI* cui)
items.push_back (MenuElem (_("Touch"),
sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Touch, cui)));
- automation_menu->popup (1, gtk_get_current_event_time());
+ automation_menu->popup (
+ boost::bind (&Gtkmm2ext::position_menu_anchored, automation_menu, &cui->automate_button, "", _1, _2, _3),
+ 1, gtk_get_current_event_time());
}
void
@@ -846,22 +977,6 @@ GenericPluginUI::set_automation_state (AutoState state, ControlUI* cui)
}
void
-GenericPluginUI::toggle_parameter_changed (ControlUI* cui)
-{
- float val = cui->control->get_value();
-
- if (!cui->ignore_change) {
- if (val > 0.5) {
- cui->button->set_active (true);
- cui->button->set_name ("PluginEditorButton-active");
- } else {
- cui->button->set_active (false);
- cui->button->set_name ("PluginEditorButton");
- }
- }
-}
-
-void
GenericPluginUI::ui_parameter_changed (ControlUI* cui)
{
if (!cui->update_pending) {
@@ -879,22 +994,17 @@ GenericPluginUI::update_control_display (ControlUI* cui)
float val = cui->control->get_value();
- cui->ignore_change++;
+ PBD::Unwinder<bool> (cui->ignore_change, true);
if (cui->combo && cui->scale_points) {
for (ARDOUR::ScalePoints::iterator it = cui->scale_points->begin(); it != cui->scale_points->end(); ++it) {
if (it->second == val) {
- cui->combo->set_active_text(it->first);
+ cui->combo->set_text(it->first);
break;
}
}
} else if (cui->button) {
-
- if (val > 0.5) {
- cui->button->set_active (true);
- } else {
- cui->button->set_active (false);
- }
+ // AutomationController handles this
}
if( cui->controller ) {
@@ -910,29 +1020,25 @@ GenericPluginUI::update_control_display (ControlUI* cui)
cui->adjustment->set_value (val);
}
}*/
- cui->ignore_change--;
}
void
-GenericPluginUI::control_port_toggled (ControlUI* cui)
+GenericPluginUI::update_input_displays ()
{
- cui->ignore_change++;
- const bool active = cui->button->get_active();
- if (active) {
- cui->button->set_name ("PluginEditorButton-active");
- } else {
- cui->button->set_name ("PluginEditorButton");
+ /* XXX This is a workaround for AutomationControl not knowing about preset loads */
+ for (vector<ControlUI*>::iterator i = input_controls.begin();
+ i != input_controls.end();
+ ++i) {
+ update_control_display(*i);
}
- insert->automation_control (cui->parameter())->set_value (active, Controllable::NoGroup);
- cui->ignore_change--;
+ return;
}
void
-GenericPluginUI::control_combo_changed (ControlUI* cui)
+GenericPluginUI::control_combo_changed (ControlUI* cui, float value)
{
- if (!cui->ignore_change && cui->scale_points) {
- string value = cui->combo->get_active_text();
- insert->automation_control (cui->parameter())->set_value ((*cui->scale_points)[value], Controllable::NoGroup);
+ if (!cui->ignore_change) {
+ insert->automation_control (cui->parameter())->set_value (value, Controllable::NoGroup);
}
}
@@ -949,14 +1055,9 @@ GenericPluginUI::start_updating (GdkEventAny*)
bool
GenericPluginUI::stop_updating (GdkEventAny*)
{
- for (vector<ControlUI*>::iterator i = input_controls.begin(); i != input_controls.end(); ++i) {
- (*i)->controller->stop_updating ();
- }
-
if (output_controls.size() > 0 ) {
screen_update_connection.disconnect();
}
-
return false;
}
@@ -995,17 +1096,17 @@ GenericPluginUI::output_update ()
}
void
-GenericPluginUI::set_property (const ParameterDescriptor& desc,
- Gtk::FileChooserButton* widget)
+GenericPluginUI::set_path_property (const ParameterDescriptor& desc,
+ Gtk::FileChooserButton* widget)
{
plugin->set_property(desc.key, Variant(Variant::PATH, widget->get_filename()));
}
void
-GenericPluginUI::property_changed (uint32_t key, const Variant& value)
+GenericPluginUI::path_property_changed (uint32_t key, const Variant& value)
{
- PropertyControls::iterator c = _property_controls.find(key);
- if (c != _property_controls.end()) {
+ FilePathControls::iterator c = _filepath_controls.find(key);
+ if (c != _filepath_controls.end()) {
c->second->set_filename(value.get_path());
} else {
std::cerr << "warning: property change for property with no control" << std::endl;
diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc
index 127ab64..ef0e020 100644
--- a/gtk2_ardour/ghostregion.cc
+++ b/gtk2_ardour/ghostregion.cc
@@ -267,8 +267,10 @@ MidiGhostRegion::set_colors()
GhostRegion::set_colors();
for (EventList::iterator it = events.begin(); it != events.end(); ++it) {
- (*it)->item->set_fill_color (UIConfiguration::instance().color_mod((*it)->event->base_color(), "ghost track midi fill"));
- (*it)->item->set_outline_color (UIConfiguration::instance().color ("ghost track midi outline"));
+ _fill = UIConfiguration::instance().color_mod((*it)->event->base_color(), "ghost track midi fill");
+ _outline = UIConfiguration::instance().color ("ghost track midi outline");
+ (*it)->item->set_fill_color (_fill);
+ (*it)->item->set_outline_color (_outline);
}
}
@@ -331,8 +333,8 @@ MidiGhostRegion::add_note (NoteBase* n)
GhostEvent* event = new GhostEvent (n, group);
events.push_back (event);
- event->item->set_fill_color (UIConfiguration::instance().color_mod(n->base_color(), "ghost track midi fill"));
- event->item->set_outline_color (UIConfiguration::instance().color ("ghost track midi outline"));
+ event->item->set_fill_color (_fill);
+ event->item->set_outline_color (_outline);
MidiStreamView* mv = midi_view();
@@ -347,8 +349,7 @@ MidiGhostRegion::add_note (NoteBase* n)
ArdourCanvas::Rectangle* rect = NULL;
ArdourCanvas::Polygon* poly = NULL;
if ((rect = dynamic_cast<ArdourCanvas::Rectangle*>(event->item))) {
- rect->set_y0 (y);
- rect->set_y1 (y + h);
+ rect->set (ArdourCanvas::Rect (rect->x0(), y, rect->x1(), y + h));
} else if ((poly = dynamic_cast<ArdourCanvas::Polygon*>(event->item))) {
Duple position = poly->position();
position.y = y;
@@ -387,10 +388,7 @@ MidiGhostRegion::update_note (NoteBase* parent)
ArdourCanvas::Polygon* poly = NULL;
if ((note = dynamic_cast<Note*>(parent))) {
if ((rect = dynamic_cast<ArdourCanvas::Rectangle*>(ev->item))) {
- double const x1 = parent->x0 ();
- double const x2 = parent->x1 ();
- rect->set_x0 (x1);
- rect->set_x1 (x2);
+ rect->set (ArdourCanvas::Rect (parent->x0(), rect->y0(), parent->x1(), rect->y1()));
}
} else if ((hit = dynamic_cast<Hit*>(parent))) {
if ((poly = dynamic_cast<ArdourCanvas::Polygon*>(ev->item))) {
diff --git a/gtk2_ardour/ghostregion.h b/gtk2_ardour/ghostregion.h
index 8a4a828..152d34a 100644
--- a/gtk2_ardour/ghostregion.h
+++ b/gtk2_ardour/ghostregion.h
@@ -115,6 +115,8 @@ public:
void clear_events();
private:
+ ArdourCanvas::Color _fill;
+ ArdourCanvas::Color _outline;
MidiGhostRegion::GhostEvent* find_event (NoteBase*);
diff --git a/gtk2_ardour/glade/new_session_dialog.glade b/gtk2_ardour/glade/new_session_dialog.glade
deleted file mode 100644
index 5ecee3b..0000000
--- a/gtk2_ardour/glade/new_session_dialog.glade
+++ /dev/null
@@ -1,1026 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="NewSessionDialog">
- <property name="title">Create New Session</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
- <property name="has_separator">True</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="vbox2">
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="hbuttonbox2">
- <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
-
- <child>
- <widget class="GtkButton" id="QuitButton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-quit</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ClearButton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-clear</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="OkButton">
- <property name="visible">True</property>
- <property name="label">gtk-new</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="TheNotebook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="border_width">5</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">1</property>
- <property name="column_spacing">1</property>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="label">Session Name</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="SessionNameEntry">
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="label">Session Location</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFileChooserButton" id="SessionFolderChooser">
- <property name="title">Select A Folder</property>
- <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
- <property name="local_only">True</property>
- <property name="show_hidden">False</property>
- <property name="do_overwrite_confirmation">False</property>
- <property name="width_chars">-1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="label">Session Template</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFileChooserButton" id="SessionTemplateChooser">
- <property name="title" translatable="yes">Select a File</property>
- <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
- <property name="local_only">True</property>
- <property name="show_hidden">False</property>
- <property name="do_overwrite_confirmation">False</property>
- <property name="width_chars">-1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkExpander" id="expander1">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="expanded">True</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkVBox" id="vbox7">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkTable" id="table4">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">True</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label19">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Channel Count</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="CreateControlBus">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Create Control Bus</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="ControlChannelCount">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">2 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="MasterChannelCount">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">2 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="CreateMasterBus">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Create Master Bus</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">True</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label16">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Track/Bus connection options</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">14</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame4">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment4">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkTable" id="table3">
- <property name="visible">True</property>
- <property name="n_rows">1</property>
- <property name="n_columns">1</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="ConnectInputs">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Automatically connect inputs</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="LimitInputPorts">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Port limit</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="InputLimitCount">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label14">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Input</b></property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame5">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment5">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkVBox" id="vbox8">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="ConnectOutputs">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Automatically connect outputs</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="LimitOutputPorts">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Port limit</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="OutputLimitCount">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">False</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox9">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkRadioButton" id="ConnectOutsToMaster">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Connect to Master Bus</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="ConnectOutsToPhysical">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Connect to physical outputs</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">ConnectOutsToMaster</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label15">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Output</b></property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Advanced</b></property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label19">
- <property name="visible">True</property>
- <property name="label" translatable="yes">New Session</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox10">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkFrame" id="frame7">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment7">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkHBox" id="hbox5">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label22">
- <property name="label">Open Session</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <placeholder/>
- </child>
-
- <child>
- <widget class="GtkFileChooserButton" id="OpenFilechooserButton">
- <property name="title" translatable="yes">Select a Session</property>
- <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
- <property name="local_only">True</property>
- <property name="show_hidden">False</property>
- <property name="do_overwrite_confirmation">False</property>
- <property name="width_chars">-1</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label24">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Open Session</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="frame6">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
-
- <child>
- <widget class="GtkAlignment" id="alignment6">
- <property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTreeView" id="TheTreeview">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">True</property>
- <property name="rules_hint">False</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- <property name="fixed_height_mode">False</property>
- <property name="hover_selection">False</property>
- <property name="hover_expand">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label23">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Open Recent Session</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">5</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label20">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Open Session</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc
index 706b4b6..9a6db25 100644
--- a/gtk2_ardour/global_port_matrix.cc
+++ b/gtk2_ardour/global_port_matrix.cc
@@ -28,7 +28,7 @@
#include "ardour/audioengine.h"
#include "ardour/port.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc
index 6c3ce31..5b5d5d1 100644
--- a/gtk2_ardour/group_tabs.cc
+++ b/gtk2_ardour/group_tabs.cc
@@ -18,15 +18,20 @@
*/
#include <gtkmm/stock.h>
+
#include "ardour/session.h"
#include "ardour/route_group.h"
#include "ardour/route.h"
+#include "ardour/vca_manager.h"
+#include "ardour/vca.h"
+
+#include "gtkmm2ext/doi.h"
#include "gui_thread.h"
#include "route_group_dialog.h"
#include "group_tabs.h"
#include "keyboard.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "ardour_ui.h"
#include "rgb_macros.h"
#include "ui_config.h"
@@ -142,7 +147,7 @@ GroupTabs::on_button_press_event (GdkEventButton* ev)
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier) && g) {
/* edit */
RouteGroupDialog d (g, false);
- d.do_run ();
+ d.present ();
} else {
Menu* m = get_menu (g, true);
if (m) {
@@ -205,12 +210,7 @@ GroupTabs::on_button_release_event (GdkEventButton*)
if (!routes.empty()) {
if (_dragging_new_tab) {
- RouteGroup* g = create_and_add_group ();
- if (g) {
- for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
- g->add (*i);
- }
- }
+ run_new_group_dialog (&routes, false);
} else {
boost::shared_ptr<RouteList> r = _session->get_routes ();
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
@@ -300,34 +300,73 @@ GroupTabs::click_to_tab (double c, list<Tab>::iterator* prev, list<Tab>::iterato
return under;
}
+void
+GroupTabs::add_new_from_items (Menu_Helpers::MenuList& items)
+{
+ using namespace Menu_Helpers;
+ Menu *new_from;
+
+ new_from = new Menu;
+ {
+ MenuList& f = new_from->items ();
+ f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), false)));
+ f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), false)));
+ f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), false)));
+ }
+ items.push_back (MenuElem (_("Create New Group From..."), *new_from));
+
+ new_from = new Menu;
+ {
+ MenuList& f = new_from->items ();
+ f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), true)));
+ f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), true)));
+ f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), true)));
+ }
+ items.push_back (MenuElem (_("Create New Group with Master From..."), *new_from));
+}
+
Gtk::Menu*
-GroupTabs::get_menu (RouteGroup* g, bool TabArea)
+GroupTabs::get_menu (RouteGroup* g, bool in_tab_area)
{
using namespace Menu_Helpers;
delete _menu;
- Menu* new_from = new Menu;
- MenuList& f = new_from->items ();
- f.push_back (MenuElem (_("Selection..."), sigc::mem_fun (*this, &GroupTabs::new_from_selection)));
- f.push_back (MenuElem (_("Record Enabled..."), sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled)));
- f.push_back (MenuElem (_("Soloed..."), sigc::mem_fun (*this, &GroupTabs::new_from_soloed)));
-
_menu = new Menu;
_menu->set_name ("ArdourContextMenu");
+
MenuList& items = _menu->items();
+ Menu* vca_menu;
- if (!TabArea) {
- items.push_back (MenuElem (_("Create New Group ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group))));
- }
+ const VCAList vcas = _session->vca_manager().vcas ();
- items.push_back (MenuElem (_("Create New Group From"), *new_from));
+ if (!in_tab_area) {
+ /* context menu is not for a group tab, show the "create new
+ from" items here
+ */
+ add_new_from_items (items);
+ }
if (g) {
+ items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Edit Group..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::edit_group), g)));
items.push_back (MenuElem (_("Collect Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::collect), g)));
items.push_back (MenuElem (_("Remove Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::remove_group), g)));
+
items.push_back (SeparatorElem());
+
+ vca_menu = new Menu;
+ MenuList& f (vca_menu->items());
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_group_to_master), 0, g, true)));
+
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_group_to_master), (*v)->number(), g, true)));
+ }
+ items.push_back (MenuElem (_("Assign Group to Control Master..."), *vca_menu));
+
+
+ items.push_back (SeparatorElem());
+
if (g->has_subgroup()) {
items.push_back (MenuElem (_("Remove Subgroup Bus"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::un_subgroup), g)));
} else {
@@ -335,51 +374,160 @@ GroupTabs::get_menu (RouteGroup* g, bool TabArea)
}
items.push_back (MenuElem (_("Add New Aux Bus (pre-fader)"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, true, PreFader)));
items.push_back (MenuElem (_("Add New Aux Bus (post-fader)"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, true, PostFader)));
+ items.push_back (SeparatorElem());
+
}
add_menu_items (_menu, g);
+ if (in_tab_area) {
+ /* context menu is for a group tab, show the "create new
+ from" items here
+ */
+ add_new_from_items (items);
+ }
+
+ items.push_back (SeparatorElem());
+
+ vca_menu = new Menu;
+ {
+ MenuList& f (vca_menu->items());
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+ }
+ }
+
+ items.push_back (MenuElem (_("Assign Selection to Control Master..."), *vca_menu));
+
+ vca_menu = new Menu;
+ {
+ MenuList& f (vca_menu->items());
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+ }
+
+ }
+ items.push_back (MenuElem (_("Assign Record Enabled to Control Master..."), *vca_menu));
+
+ vca_menu = new Menu;
+ {
+ MenuList& f (vca_menu->items());
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+ }
+
+ }
+ items.push_back (MenuElem (_("Assign Soloed to Control Master...")));
+
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Enable All Groups"), sigc::mem_fun(*this, &GroupTabs::activate_all)));
items.push_back (MenuElem (_("Disable All Groups"), sigc::mem_fun(*this, &GroupTabs::disable_all)));
return _menu;
-
}
void
-GroupTabs::new_from_selection ()
+GroupTabs::assign_group_to_master (uint32_t which, RouteGroup* group, bool rename_master) const
{
- RouteList rl = selected_routes ();
- if (rl.empty()) {
+ if (!_session || !group) {
return;
}
- run_new_group_dialog (rl);
+ boost::shared_ptr<VCA> master;
+
+ if (which == 0) {
+ if (_session->vca_manager().create_vca (1)) {
+ /* error */
+ return;
+ }
+
+ /* VCAs use 1-based counting. Get most recently created VCA... */
+ which = _session->vca_manager().n_vcas();
+ }
+
+ master = _session->vca_manager().vca_by_number (which);
+
+ if (!master) {
+ /* should never happen; if it does, basically something deeply
+ odd happened, no reason to tell user because there's no
+ sensible explanation.
+ */
+ return;
+ }
+
+ group->assign_master (master);
+
+ if (rename_master){
+ master->set_name (group->name());
+ }
}
void
-GroupTabs::new_from_rec_enabled ()
+GroupTabs::assign_some_to_master (uint32_t which, RouteList rl)
{
- boost::shared_ptr<RouteList> rl = _session->get_routes ();
+ if (!_session) {
+ return;
+ }
- RouteList rec_enabled;
+ boost::shared_ptr<VCA> master;
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if ((*i)->record_enabled()) {
- rec_enabled.push_back (*i);
+ if (which == 0) {
+ if (_session->vca_manager().create_vca (1)) {
+ /* error */
+ return;
}
+
+ /* VCAs use 1-based counting. Get most recently created VCA... */
+ which = _session->vca_manager().n_vcas();
+ }
+
+ master = _session->vca_manager().vca_by_number (which);
+
+ if (!master) {
+ /* should never happen; if it does, basically something deeply
+ odd happened, no reason to tell user because there's no
+ sensible explanation.
+ */
+ return;
}
- if (rec_enabled.empty()) {
+
+ if (rl.empty()) {
return;
}
- run_new_group_dialog (rec_enabled);
+ for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
+ (*r)->assign (master);
+ }
}
-void
-GroupTabs::new_from_soloed ()
+RouteList
+GroupTabs::get_rec_enabled ()
+{
+ RouteList rec_enabled;
+
+ if (!_session) {
+ return rec_enabled;
+ }
+
+ boost::shared_ptr<RouteList> rl = _session->get_routes ();
+
+ for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+ boost::shared_ptr<Track> trk (boost::dynamic_pointer_cast<Track> (*i));
+ if (trk && trk->rec_enable_control()->get_value()) {
+ rec_enabled.push_back (*i);
+ }
+ }
+
+ return rec_enabled;
+}
+
+
+RouteList
+GroupTabs::get_soloed ()
{
boost::shared_ptr<RouteList> rl = _session->get_routes ();
@@ -391,49 +539,102 @@ GroupTabs::new_from_soloed ()
}
}
- if (soloed.empty()) {
- return;
- }
+ return soloed;
+}
- run_new_group_dialog (soloed);
+void
+GroupTabs::assign_selection_to_master (uint32_t which)
+{
+ assign_some_to_master (which, selected_routes ());
}
void
-GroupTabs::run_new_group_dialog (RouteList const & rl)
+GroupTabs::assign_recenabled_to_master (uint32_t which)
{
- RouteGroup* g = new RouteGroup (*_session, "");
- RouteGroupDialog d (g, true);
+ assign_some_to_master (which, get_rec_enabled());
+}
- if (d.do_run ()) {
- delete g;
- } else {
- _session->add_route_group (g);
- for (RouteList::const_iterator i = rl.begin(); i != rl.end(); ++i) {
- g->add (*i);
- }
- }
+void
+GroupTabs::assign_soloed_to_master (uint32_t which)
+{
+ assign_some_to_master (which, get_soloed());
+}
+
+void
+GroupTabs::new_from_selection (bool with_master)
+{
+ RouteList rl (selected_routes());
+ run_new_group_dialog (&rl, with_master);
}
-RouteGroup *
-GroupTabs::create_and_add_group () const
+void
+GroupTabs::new_from_rec_enabled (bool with_master)
+{
+ RouteList rl (get_rec_enabled());
+ run_new_group_dialog (&rl, with_master);
+}
+
+void
+GroupTabs::new_from_soloed (bool with_master)
+{
+ RouteList rl (get_soloed());
+ run_new_group_dialog (&rl, with_master);
+}
+
+void
+GroupTabs::run_new_group_dialog (RouteList const * rl, bool with_master)
{
+ if (rl && rl->empty()) {
+ return;
+ }
+
RouteGroup* g = new RouteGroup (*_session, "");
- RouteGroupDialog d (g, true);
+ RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+ d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_group_dialog_finished), d, rl ? new RouteList (*rl): 0, with_master));
+ d->present ();
+}
+
+void
+GroupTabs::new_group_dialog_finished (int r, RouteGroupDialog* d, RouteList const * rl, bool with_master) const
+{
+ if (r == RESPONSE_OK) {
- if (d.do_run ()) {
- delete g;
- return 0;
+ if (!d->name_check()) {
+ return;
+ }
+
+ _session->add_route_group (d->group());
+
+ if (rl) {
+ for (RouteList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
+ d->group()->add (*i);
+ }
+
+ if (with_master) {
+ assign_group_to_master (0, d->group(), true); /* zero => new master */
+ }
+ }
+ } else {
+ delete d->group ();
}
- _session->add_route_group (g);
- return g;
+ delete rl;
+ delete_when_idle (d);
}
void
GroupTabs::edit_group (RouteGroup* g)
{
- RouteGroupDialog d (g, false);
- d.do_run ();
+ RouteGroupDialog* d = new RouteGroupDialog (g, false);
+ d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &GroupTabs::edit_group_dialog_finished), d));
+ d->present ();
+}
+
+void
+GroupTabs::edit_group_dialog_finished (int r, RouteGroupDialog* d) const
+{
+ delete_when_idle (d);
}
void
@@ -448,18 +649,6 @@ GroupTabs::un_subgroup (RouteGroup* g)
g->destroy_subgroup ();
}
-struct CollectSorter {
- bool operator () (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
- return a->order_key () < b->order_key ();
- }
-};
-
-struct OrderSorter {
- bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
- return a->order_key () < b->order_key ();
- }
-};
-
/** Collect all members of a RouteGroup so that they are together in the Editor or Mixer.
* @param g Group to collect.
*/
@@ -467,19 +656,19 @@ void
GroupTabs::collect (RouteGroup* g)
{
boost::shared_ptr<RouteList> group_routes = g->route_list ();
- group_routes->sort (CollectSorter ());
+ group_routes->sort (Stripable::PresentationOrderSorter());
int const N = group_routes->size ();
RouteList::iterator i = group_routes->begin ();
boost::shared_ptr<RouteList> routes = _session->get_routes ();
- routes->sort (OrderSorter ());
+ routes->sort (Stripable::PresentationOrderSorter());
RouteList::const_iterator j = routes->begin ();
int diff = 0;
int coll = -1;
while (i != group_routes->end() && j != routes->end()) {
- int const k = (*j)->order_key ();
+ PresentationInfo::order_t const k = (*j)->presentation_info ().order();
if (*i == *j) {
@@ -490,21 +679,21 @@ GroupTabs::collect (RouteGroup* g)
--diff;
}
- (*j)->set_order_key (coll);
+ (*j)->set_presentation_order (coll, false);
++coll;
++i;
} else {
- (*j)->set_order_key (k + diff);
+ (*j)->set_presentation_order (k + diff, false);
}
++j;
}
- sync_order_keys ();
+ _session->notify_presentation_info_change ();
}
void
@@ -545,11 +734,12 @@ GroupTabs::set_group_color (RouteGroup* group, uint32_t color)
UINT_TO_RGBA (color, &r, &g, &b, &a);
/* Hack to disallow black route groups; force a dark grey instead */
+ const uint32_t dark_gray = 25;
- if (r == 0 && g == 0 && b == 0) {
- r = 25;
- g = 25;
- b = 25;
+ if (r < dark_gray && g < dark_gray && b < dark_gray) {
+ r = dark_gray;
+ g = dark_gray;
+ b = dark_gray;
}
GUIObjectState& gui_state = *ARDOUR_UI::instance()->gui_object_state;
@@ -644,7 +834,7 @@ GroupTabs::route_added_to_route_group (RouteGroup*, boost::weak_ptr<Route> w)
return;
}
- r->gui_changed (X_("color"), 0);
+ r->presentation_info().PropertyChanged (Properties::color);
set_dirty ();
}
@@ -659,7 +849,7 @@ GroupTabs::route_removed_from_route_group (RouteGroup*, boost::weak_ptr<Route> w
return;
}
- r->gui_changed (X_("color"), 0);
+ r->presentation_info().PropertyChanged (Properties::color);
set_dirty ();
}
diff --git a/gtk2_ardour/group_tabs.h b/gtk2_ardour/group_tabs.h
index e31ad96..39ea78d 100644
--- a/gtk2_ardour/group_tabs.h
+++ b/gtk2_ardour/group_tabs.h
@@ -27,6 +27,7 @@ namespace ARDOUR {
}
class Editor;
+class RouteGroupDialog;
/** Parent class for tabs which represent route groups as colored tabs;
* Currently used on the left-hand side of the editor and at the top of the mixer.
@@ -48,7 +49,7 @@ public:
*/
Gtk::Menu* get_menu (ARDOUR::RouteGroup* g, bool tabArea = false);
- void run_new_group_dialog (ARDOUR::RouteList const &);
+ void run_new_group_dialog (ARDOUR::RouteList const *, bool with_master);
static void set_group_color (ARDOUR::RouteGroup *, uint32_t);
static std::string group_gui_id (ARDOUR::RouteGroup *);
@@ -92,12 +93,16 @@ private:
virtual void add_menu_items (Gtk::Menu *, ARDOUR::RouteGroup *) {}
virtual ARDOUR::RouteList selected_routes () const = 0;
- virtual void sync_order_keys () = 0;
- void new_from_selection ();
- void new_from_rec_enabled ();
- void new_from_soloed ();
- ARDOUR::RouteGroup* create_and_add_group () const;
+ void add_new_from_items (Gtk::Menu_Helpers::MenuList&);
+
+ void new_from_selection (bool with_master);
+ void new_from_rec_enabled (bool with_master);
+ void new_from_soloed (bool with_master);
+
+ void new_group_dialog_finished (int, RouteGroupDialog*, ARDOUR::RouteList const *, bool with_master) const;
+ void edit_group_dialog_finished (int, RouteGroupDialog*) const;
+
void collect (ARDOUR::RouteGroup *);
void set_activation (ARDOUR::RouteGroup *, bool);
void edit_group (ARDOUR::RouteGroup *);
@@ -119,6 +124,15 @@ private:
void route_added_to_route_group (ARDOUR::RouteGroup *, boost::weak_ptr<ARDOUR::Route>);
void route_removed_from_route_group (ARDOUR::RouteGroup *, boost::weak_ptr<ARDOUR::Route>);
+ void assign_group_to_master (uint32_t which, ARDOUR::RouteGroup*, bool rename_master) const;
+ void assign_selection_to_master (uint32_t which);
+ void assign_recenabled_to_master (uint32_t which);
+ void assign_soloed_to_master (uint32_t which);
+ void assign_some_to_master (uint32_t which, ARDOUR::RouteList);
+
+ ARDOUR::RouteList get_soloed ();
+ ARDOUR::RouteList get_rec_enabled ();
+
Gtk::Menu* _menu;
std::list<Tab> _tabs; ///< current list of tabs
Tab* _dragging; ///< tab being dragged, or 0
diff --git a/gtk2_ardour/gtk2_ardour5.pot b/gtk2_ardour/gtk2_ardour5.pot
new file mode 100644
index 0000000..87b0fe6
--- /dev/null
+++ b/gtk2_ardour/gtk2_ardour5.pot
@@ -0,0 +1,14894 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-08 20:24-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
+msgid "Brian Ahr"
+msgstr ""
+
+#: about.cc:129
+msgid "John Anderson"
+msgstr ""
+
+#: about.cc:130
+msgid "Marcus Andersson"
+msgstr ""
+
+#: about.cc:131
+msgid "Nedko Arnaudov"
+msgstr ""
+
+#: about.cc:132
+msgid "Hans Baier"
+msgstr ""
+
+#: about.cc:133
+msgid "Ben Bell"
+msgstr ""
+
+#: about.cc:134
+msgid "Sakari Bergen"
+msgstr ""
+
+#: about.cc:135
+msgid "Christian Borss"
+msgstr ""
+
+#: about.cc:136
+msgid "Chris Cannam"
+msgstr ""
+
+#: about.cc:137
+msgid "Jeremy Carter"
+msgstr ""
+
+#: about.cc:138
+msgid "Jesse Chappell"
+msgstr ""
+
+#: about.cc:139
+msgid "Thomas Charbonnel"
+msgstr ""
+
+#: about.cc:140
+msgid "Sam Chessman"
+msgstr ""
+
+#: about.cc:141
+msgid "André Colomb"
+msgstr ""
+
+#: about.cc:142
+msgid "Paul Davis"
+msgstr ""
+
+#: about.cc:143
+msgid "Gerard van Dongen"
+msgstr ""
+
+#: about.cc:144
+msgid "John Emmas"
+msgstr ""
+
+#: about.cc:145
+msgid "Colin Fletcher"
+msgstr ""
+
+#: about.cc:146
+msgid "Dave Flick"
+msgstr ""
+
+#: about.cc:147
+msgid "Hans Fugal"
+msgstr ""
+
+#: about.cc:148
+msgid "Robin Gareus"
+msgstr ""
+
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
+msgid "Christopher George"
+msgstr ""
+
+#: about.cc:151
+msgid "Chris Goddard"
+msgstr ""
+
+#: about.cc:152
+msgid "J. Abelardo Gutierrez"
+msgstr ""
+
+#: about.cc:153
+msgid "Jeremy Hall"
+msgstr ""
+
+#: about.cc:154
+msgid "Audun Halland"
+msgstr ""
+
+#: about.cc:155
+msgid "David Halter"
+msgstr ""
+
+#: about.cc:156
+msgid "Steve Harris"
+msgstr ""
+
+#: about.cc:157
+msgid "Melvin Ray Herr"
+msgstr ""
+
+#: about.cc:158
+msgid "Carl Hetherington"
+msgstr ""
+
+#: about.cc:159
+msgid "Rob Holland"
+msgstr ""
+
+#: about.cc:160
+msgid "Robert Jordens"
+msgstr ""
+
+#: about.cc:161
+msgid "Stefan Kersten"
+msgstr ""
+
+#: about.cc:162
+msgid "Armand Klenk"
+msgstr ""
+
+#: about.cc:163
+msgid "Julien de Kozak"
+msgstr ""
+
+#: about.cc:164
+msgid "Matt Krai"
+msgstr ""
+
+#: about.cc:165
+msgid "Georg Krause"
+msgstr ""
+
+#: about.cc:166
+msgid "Nick Lanham"
+msgstr ""
+
+#: about.cc:167
+msgid "Colin Law"
+msgstr ""
+
+#: about.cc:168
+msgid "Joshua Leach"
+msgstr ""
+
+#: about.cc:169
+msgid "Ben Loftis"
+msgstr ""
+
+#: about.cc:170
+msgid "Nick Mainsbridge"
+msgstr ""
+
+#: about.cc:171
+msgid "Tim Mayberry"
+msgstr ""
+
+#: about.cc:172
+msgid "Doug Mclain"
+msgstr ""
+
+#: about.cc:173
+msgid "Todd Naugle"
+msgstr ""
+
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
+msgid "Jack O'Quin"
+msgstr ""
+
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
+msgid "Nimal Ratnayake"
+msgstr ""
+
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
+msgid "David Robillard"
+msgstr ""
+
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
+msgid "Taybin Rutkin"
+msgstr ""
+
+#: about.cc:183
+msgid "Andreas Ruge"
+msgstr ""
+
+#: about.cc:184
+msgid "Sampo Savolainen"
+msgstr ""
+
+#: about.cc:185
+msgid "Rodrigo Severo"
+msgstr ""
+
+#: about.cc:186
+msgid "Per Sigmond"
+msgstr ""
+
+#: about.cc:187
+msgid "Lincoln Spiteri"
+msgstr ""
+
+#: about.cc:188
+msgid "Mike Start"
+msgstr ""
+
+#: about.cc:189
+msgid "Mark Stewart"
+msgstr ""
+
+#: about.cc:190
+msgid "Roland Stigge"
+msgstr ""
+
+#: about.cc:191
+msgid "Petter Sundlöf"
+msgstr ""
+
+#: about.cc:192
+msgid "Mike Täht"
+msgstr ""
+
+#: about.cc:193
+msgid "Roy Vegard"
+msgstr ""
+
+#: about.cc:194
+msgid "Thorsten Wilms"
+msgstr ""
+
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
+msgid "Grygorii Zharun"
+msgstr ""
+
+#: about.cc:201
+msgid ""
+"French:\n"
+"\tAlain Fréhel <alain.frehel at free.fr>\n"
+"\tChristophe Combelles <ccomb at free.fr>\n"
+"\tMartin Blanchard\n"
+"\tRomain Arnaud <roming22 at gmail.com>\n"
+msgstr ""
+
+#: about.cc:202
+msgid ""
+"German:\n"
+"\tKarsten Petersen <kapet at kapet.de>\n"
+"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
+"\tRobert Schwede <schwede at ironshark.com>\n"
+"\tBenjamin Scherrer <realhangman at web.de>\n"
+"\tEdgar Aichinger <edogawa at aon.at>\n"
+"\tRichard Oax <richard at pagliacciempire.de>\n"
+"\tRobin Gloster <robin at loc-com.de>\n"
+msgstr ""
+
+#: about.cc:209
+msgid ""
+"Italian:\n"
+"\tFilippo Pappalardo <filippo at email.it>\n"
+"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
+msgstr ""
+
+#: about.cc:210
+msgid ""
+"Portuguese:\n"
+"\tRui Nuno Capela <rncbc at rncbc.org>\n"
+msgstr ""
+
+#: about.cc:211
+msgid ""
+"Brazilian Portuguese:\n"
+"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
+"\tChris Ross <chris at tebibyte.org>\n"
+msgstr ""
+
+#: about.cc:213
+msgid ""
+"Spanish:\n"
+"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
+"\tPablo Fernández <pablo.fbus at gmail.com>\n"
+msgstr ""
+
+#: about.cc:214
+msgid ""
+"Russian:\n"
+"\t Igor Blinov <pitstop at nm.ru>\n"
+"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
+msgstr ""
+
+#: about.cc:216
+msgid ""
+"Greek:\n"
+"\t Klearchos Gourgourinis <muadib at in.gr>\n"
+msgstr ""
+
+#: about.cc:217
+msgid ""
+"Swedish:\n"
+"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
+msgstr ""
+
+#: about.cc:218
+msgid ""
+"Polish:\n"
+"\t Piotr Zaryk <pzaryk at gmail.com>\n"
+msgstr ""
+
+#: about.cc:219
+msgid ""
+"Czech:\n"
+"\t Pavel Fric <pavelfric at seznam.cz>\n"
+msgstr ""
+
+#: about.cc:220
+msgid ""
+"Norwegian:\n"
+"\t Eivind ÃdegÃ¥rd\n"
+msgstr ""
+
+#: about.cc:221
+msgid ""
+"Chinese:\n"
+"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
+msgstr ""
+
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
+msgid "Copyright (C) 1999-2015 Paul Davis\n"
+msgstr ""
+
+#: about.cc:629
+msgid "http://ardour.org/"
+msgstr ""
+
+#: about.cc:630
+msgid ""
+"%1%2\n"
+"(rev %3)\n"
+"%4%5"
+msgstr ""
+
+#: about.cc:635
+msgid "Config"
+msgstr ""
+
+#: actions.cc:83
+msgid "Loading menus from %1"
+msgstr ""
+
+#: actions.cc:86 actions.cc:87
+msgid "badly formatted menu definition file: %1"
+msgstr ""
+
+#: actions.cc:89
+msgid "%1 menu definition file not found"
+msgstr ""
+
+#: actions.cc:93 actions.cc:94
+msgid "%1 will not work without a valid menu definition file"
+msgstr ""
+
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
+
+#: add_route_dialog.cc:61
+msgid "Configuration:"
+msgstr ""
+
+#: add_route_dialog.cc:62
+msgid "Record Mode:"
+msgstr ""
+
+#: add_route_dialog.cc:63
+msgid "Instrument:"
+msgstr ""
+
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
+msgid "Audio Tracks"
+msgstr ""
+
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
+msgid "MIDI Tracks"
+msgstr ""
+
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
+msgid "Audio+MIDI Tracks"
+msgstr ""
+
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
+msgid "First"
+msgstr ""
+
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr ""
+
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr ""
+
+#: add_route_dialog.cc:88
+msgid "Last"
+msgstr ""
+
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
+msgid "Add:"
+msgstr ""
+
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
+msgid "<b>Options</b>"
+msgstr ""
+
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
+msgid "Name:"
+msgstr ""
+
+#: add_route_dialog.cc:155
+msgid "Group:"
+msgstr ""
+
+#: add_route_dialog.cc:161
+msgid "Insert:"
+msgstr ""
+
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
+msgid "Audio"
+msgstr ""
+
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
+msgid "MIDI"
+msgstr ""
+
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
+msgid "Audio+MIDI"
+msgstr ""
+
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
+msgid "Bus"
+msgstr ""
+
+#: add_route_dialog.cc:286
+msgid ""
+"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
+"both audio and MIDI input data\n"
+"\n"
+"If you do not plan to use such a plugin, then use a normal audio or MIDI "
+"track instead."
+msgstr ""
+
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1294
+msgid "Normal"
+msgstr ""
+
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
+msgid "Non Layered"
+msgstr ""
+
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
+msgid "Tape"
+msgstr ""
+
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
+msgid "Mono"
+msgstr ""
+
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
+msgid "Stereo"
+msgstr ""
+
+#: add_route_dialog.cc:503
+msgid "3 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:507
+msgid "4 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:511
+msgid "5 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:515
+msgid "6 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:519
+msgid "8 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:523
+msgid "12 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
+msgid "Custom"
+msgstr ""
+
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
+msgid "New Group..."
+msgstr ""
+
+#: add_route_dialog.cc:573 route_group_menu.cc:89
+msgid "No Group"
+msgstr ""
+
+#: ambiguous_file_dialog.cc:30
+msgid "Ambiguous File"
+msgstr ""
+
+#: ambiguous_file_dialog.cc:37
+msgid ""
+"%1 has found the file <i>%2</i> in the following places:\n"
+"\n"
+msgstr ""
+
+#: ambiguous_file_dialog.cc:46
+msgid ""
+"\n"
+"\n"
+"Please select the path that you want to get the file from."
+msgstr ""
+
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
+msgid "Done"
+msgstr ""
+
+#: analysis_window.cc:45
+msgid "Signal source"
+msgstr ""
+
+#: analysis_window.cc:46
+msgid "Selected ranges"
+msgstr ""
+
+#: analysis_window.cc:47
+msgid "Selected regions"
+msgstr ""
+
+#: analysis_window.cc:48
+msgid "Show frequency power range"
+msgstr ""
+
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
+
+#: analysis_window.cc:53
+msgid "FFT analysis window"
+msgstr ""
+
+#: analysis_window.cc:54 editor.cc:1954
+msgid "Spectral Analysis"
+msgstr ""
+
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
+msgid "Track"
+msgstr ""
+
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
+msgid "Show"
+msgstr ""
+
+#: analysis_window.cc:107
+msgid "Re-analyze data"
+msgstr ""
+
+#: ardour_button.cc:876
+msgid "button cannot watch state of non-existing Controllable\n"
+msgstr ""
+
+#: ardour_button.cc:1144
+msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
+msgid ""
+"%1 %2.x has discovered configuration files from %1 %3.x.\n"
+"\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
+"\n"
+"(This will require you to restart %1.)"
+msgstr ""
+
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
+msgid "Audition"
+msgstr ""
+
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
+msgid "Solo"
+msgstr ""
+
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
+msgid "Feedback"
+msgstr ""
+
+#: ardour_ui.cc:296 speaker_dialog.cc:36
+msgid "Speaker Configuration"
+msgstr ""
+
+#: ardour_ui.cc:297
+msgid "Add Tracks/Busses"
+msgstr ""
+
+#: ardour_ui.cc:298
+msgid "About"
+msgstr ""
+
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
+
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
+msgid "Tracks and Busses"
+msgstr ""
+
+#: ardour_ui.cc:301 engine_dialog.cc:73
+msgid "Audio/MIDI Setup"
+msgstr ""
+
+#: ardour_ui.cc:302
+msgid "Video Export Dialog"
+msgstr ""
+
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
+msgid "Properties"
+msgstr ""
+
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
+msgid "Bundle Manager"
+msgstr ""
+
+#: ardour_ui.cc:307 big_clock_window.cc:37
+msgid "Big Clock"
+msgstr ""
+
+#: ardour_ui.cc:308
+msgid "Audio Connections"
+msgstr ""
+
+#: ardour_ui.cc:309
+msgid "MIDI Connections"
+msgstr ""
+
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
+msgid "Your configuration files were copied. You can now restart %1."
+msgstr ""
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
+msgid ""
+"The audio backend was shutdown because:\n"
+"\n"
+"%1"
+msgstr ""
+
+#: ardour_ui.cc:615
+msgid ""
+"The audio backend has either been shutdown or it\n"
+"disconnected %1 because %1\n"
+"was not fast enough. Try to restart\n"
+"the audio backend and save the session."
+msgstr ""
+
+#: ardour_ui.cc:639
+msgid ""
+"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
+"Please see the log window for further details."
+msgstr ""
+
+#: ardour_ui.cc:640
+msgid "Audio Unit Plugin Scan Failed:"
+msgstr ""
+
+#: ardour_ui.cc:1008
+msgid "NSM server did not announce itself"
+msgstr ""
+
+#: ardour_ui.cc:1021
+msgid "NSM: no client ID provided"
+msgstr ""
+
+#: ardour_ui.cc:1028
+msgid "NSM: no session created"
+msgstr ""
+
+#: ardour_ui.cc:1051
+msgid "NSM: initialization failed"
+msgstr ""
+
+#: ardour_ui.cc:1083
+msgid "Free/Demo Version Warning"
+msgstr ""
+
+#: ardour_ui.cc:1085
+msgid "Subscribe and support development of %1"
+msgstr ""
+
+#: ardour_ui.cc:1086
+msgid "Don't warn me about this again"
+msgstr ""
+
+#: ardour_ui.cc:1088
+msgid ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
+msgstr ""
+
+#: ardour_ui.cc:1089
+msgid "This is a free/demo version of %1"
+msgstr ""
+
+#: ardour_ui.cc:1090
+msgid "It will not restore OR save any plugin settings"
+msgstr ""
+
+#: ardour_ui.cc:1091
+msgid ""
+"If you load an existing session with plugin settings\n"
+"they will not be used and will be lost."
+msgstr ""
+
+#: ardour_ui.cc:1093 plugin_ui.cc:586
+msgid ""
+"To get full access to updates without this limitation\n"
+"consider becoming a subscriber for a low cost every month."
+msgstr ""
+
+#: ardour_ui.cc:1103
+msgid "Quit now"
+msgstr ""
+
+#: ardour_ui.cc:1104
+msgid "Continue using %1"
+msgstr ""
+
+#: ardour_ui.cc:1135 startup.cc:349
+msgid "%1 is ready for use"
+msgstr ""
+
+#: ardour_ui.cc:1185
+msgid ""
+"WARNING: Your system has a limit for maximum amount of locked memory. This "
+"might cause %1 to run out of memory before your system runs out of memory. \n"
+"\n"
+"You can view the memory limit with 'ulimit -l', and it is normally "
+"controlled by %2"
+msgstr ""
+
+#: ardour_ui.cc:1202
+msgid "Do not show this window again"
+msgstr ""
+
+#: ardour_ui.cc:1245
+msgid "Don't quit"
+msgstr ""
+
+#: ardour_ui.cc:1246
+msgid "Just quit"
+msgstr ""
+
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
+msgid "Save and quit"
+msgstr ""
+
+#: ardour_ui.cc:1257
+msgid ""
+"%1 was unable to save your session.\n"
+"\n"
+"If you still wish to quit, please use the\n"
+"\n"
+"\"Just quit\" option."
+msgstr ""
+
+#: ardour_ui.cc:1307
+msgid "Unsaved Session"
+msgstr ""
+
+#: ardour_ui.cc:1328
+msgid ""
+"The session \"%1\"\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 ""
+
+#: ardour_ui.cc:1331
+msgid ""
+"The snapshot \"%1\"\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 ""
+
+#: ardour_ui.cc:1345
+msgid "Prompter"
+msgstr ""
+
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
+msgid "Audio: <span foreground=\"red\">none</span>"
+msgstr ""
+
+#: ardour_ui.cc:1471
+#, c-format
+msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
+msgstr ""
+
+#: ardour_ui.cc:1475
+#, c-format
+msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
+msgstr ""
+
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
+msgid "File:"
+msgstr ""
+
+#: ardour_ui.cc:1497
+msgid "BWF"
+msgstr ""
+
+#: ardour_ui.cc:1500
+msgid "WAV"
+msgstr ""
+
+#: ardour_ui.cc:1503
+msgid "WAV64"
+msgstr ""
+
+#: ardour_ui.cc:1506 session_option_editor.cc:202
+msgid "CAF"
+msgstr ""
+
+#: ardour_ui.cc:1509
+msgid "AIFF"
+msgstr ""
+
+#: ardour_ui.cc:1512
+msgid "iXML"
+msgstr ""
+
+#: ardour_ui.cc:1515 session_option_editor.cc:203
+msgid "RF64"
+msgstr ""
+
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
+msgid "32-float"
+msgstr ""
+
+#: ardour_ui.cc:1532
+msgid "24-int"
+msgstr ""
+
+#: ardour_ui.cc:1535
+msgid "16-int"
+msgstr ""
+
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
+#, c-format
+msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
+msgstr ""
+
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
+#, c-format
+msgid ""
+"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
+msgstr ""
+
+#: ardour_ui.cc:1650
+msgid "Disk: <span foreground=\"green\">Unknown</span>"
+msgstr ""
+
+#: ardour_ui.cc:1652
+msgid "Disk: <span foreground=\"green\">24hrs+</span>"
+msgstr ""
+
+#: ardour_ui.cc:1670
+msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
+msgstr ""
+
+#: ardour_ui.cc:1681
+#, c-format
+msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
+msgstr ""
+
+#: ardour_ui.cc:1707
+#, c-format
+msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
+msgstr ""
+
+#: ardour_ui.cc:1789
+msgid ""
+"%1 is not connected to any audio backend.\n"
+"You cannot open or close sessions in this condition"
+msgstr ""
+
+#: ardour_ui.cc:1807
+msgid "Open Session"
+msgstr ""
+
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
+msgid "%1 sessions"
+msgstr ""
+
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
+msgid "You cannot add a track without a session already loaded."
+msgstr ""
+
+#: ardour_ui.cc:1887
+msgid "could not create %1 new mixed track"
+msgid_plural "could not create %1 new mixed tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1977
+msgid "You cannot add a track or bus without a session already loaded."
+msgstr ""
+
+#: ardour_ui.cc:1986
+msgid "could not create %1 new audio track"
+msgid_plural "could not create %1 new audio tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1995
+msgid "could not create %1 new audio bus"
+msgid_plural "could not create %1 new audio busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
+msgstr ""
+
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr ""
+
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
+
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
+
+#: ardour_ui.cc:2684
+msgid ""
+"To ensure compatibility with various systems\n"
+"snapshot names may not contain a '%1' character"
+msgstr ""
+
+#: ardour_ui.cc:2698
+msgid "Confirm Snapshot Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
+msgid "Rename Session"
+msgstr ""
+
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
+msgid ""
+"To ensure compatibility with various systems\n"
+"session names may not contain a '%1' character"
+msgstr ""
+
+#: ardour_ui.cc:2798
+msgid ""
+"That name is already in use by another directory/folder. Please try again."
+msgstr ""
+
+#: ardour_ui.cc:2807
+msgid ""
+"Renaming this session failed.\n"
+"Things could be seriously messed up at this point"
+msgstr ""
+
+#: ardour_ui.cc:2923 route_ui.cc:1871
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1872
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
+msgid "Save Template"
+msgstr ""
+
+#: ardour_ui.cc:2949
+msgid "Name for template:"
+msgstr ""
+
+#: ardour_ui.cc:2950
+msgid "-template"
+msgstr ""
+
+#: ardour_ui.cc:2987
+msgid ""
+"This session\n"
+"%1\n"
+"already exists. Do you want to open it?"
+msgstr ""
+
+#: ardour_ui.cc:2997
+msgid "Open Existing Session"
+msgstr ""
+
+#: ardour_ui.cc:3295
+msgid "There is no existing session at \"%1\""
+msgstr ""
+
+#: ardour_ui.cc:3391
+msgid "Please wait while %1 loads your session"
+msgstr ""
+
+#: ardour_ui.cc:3406
+msgid "Port Registration Error"
+msgstr ""
+
+#: ardour_ui.cc:3407
+msgid "Click the Close button to try again."
+msgstr ""
+
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
+
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
+msgid "Loading Error"
+msgstr ""
+
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr ""
+
+#: ardour_ui.cc:3475
+msgid ""
+"This session has been opened in read-only mode.\n"
+"\n"
+"You will not be able to record or save."
+msgstr ""
+
+#: ardour_ui.cc:3480
+msgid "Read-only Session"
+msgstr ""
+
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
+msgid "Could not create session in \"%1\""
+msgstr ""
+
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
+msgid "No files were ready for clean-up"
+msgstr ""
+
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
+msgid "Clean-up"
+msgstr ""
+
+#: ardour_ui.cc:3728
+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 ""
+
+#: ardour_ui.cc:3787
+msgid "kilo"
+msgstr ""
+
+#: ardour_ui.cc:3790
+msgid "mega"
+msgstr ""
+
+#: ardour_ui.cc:3793
+msgid "giga"
+msgstr ""
+
+#: ardour_ui.cc:3798
+msgid ""
+"The following file was deleted from %2,\n"
+"releasing %3 %4bytes of disk space"
+msgid_plural ""
+"The following %1 files were deleted from %2,\n"
+"releasing %3 %4bytes of disk space"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:3805
+msgid ""
+"The following file was not in use and \n"
+"has been moved to: %2\n"
+"\n"
+"After a restart of %5\n"
+"\n"
+"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
+"\n"
+"will release an additional %3 %4bytes of disk space.\n"
+msgid_plural ""
+"The following %1 files were not in use and \n"
+"have been moved to: %2\n"
+"\n"
+"After a restart of %5\n"
+"\n"
+"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
+"\n"
+"will release an additional %3 %4bytes of disk space.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:3865
+msgid "Are you sure you want to clean-up?"
+msgstr ""
+
+#: ardour_ui.cc:3872
+msgid ""
+"Clean-up is a destructive operation.\n"
+"ALL undo/redo information will be lost if you clean-up.\n"
+"Clean-up will move all unused files to a \"dead\" location."
+msgstr ""
+
+#: ardour_ui.cc:3880
+msgid "CleanupDialog"
+msgstr ""
+
+#: ardour_ui.cc:3910
+msgid "Cleaned Files"
+msgstr ""
+
+#: ardour_ui.cc:3927
+msgid "deleted file"
+msgstr ""
+
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
+msgid "Video-Server was not launched by %1. The request to stop it is ignored."
+msgstr ""
+
+#: ardour_ui.cc:4201
+msgid "Stop Video-Server"
+msgstr ""
+
+#: ardour_ui.cc:4202
+msgid "Do you really want to stop the Video Server?"
+msgstr ""
+
+#: ardour_ui.cc:4205
+msgid "Yes, Stop It"
+msgstr ""
+
+#: ardour_ui.cc:4231
+msgid "The Video Server is already started."
+msgstr ""
+
+#: ardour_ui.cc:4233
+msgid ""
+"An external Video Server is configured and can be reached. Not starting a "
+"new instance."
+msgstr ""
+
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
+msgid ""
+"Could not connect to the Video Server. Start it or configure its access URL "
+"in Preferences."
+msgstr ""
+
+#: ardour_ui.cc:4271
+msgid "Specified docroot is not an existing directory."
+msgstr ""
+
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
+msgid "Given Video Server is not an executable file."
+msgstr ""
+
+#: ardour_ui.cc:4317
+msgid "Cannot launch the video-server"
+msgstr ""
+
+#: ardour_ui.cc:4327
+msgid "Video-server was started but does not respond to requests..."
+msgstr ""
+
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
+msgid "could not open %1"
+msgstr ""
+
+#: ardour_ui.cc:4376
+msgid "no video-file selected"
+msgstr ""
+
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
+msgid "Recording was stopped because your system could not keep up."
+msgstr ""
+
+#: ardour_ui.cc:4692
+msgid ""
+"The disk system on your computer\n"
+"was not able to keep up with %1.\n"
+"\n"
+"Specifically, it failed to write data to disk\n"
+"quickly enough to keep up with recording.\n"
+msgstr ""
+
+#: ardour_ui.cc:4765
+msgid "Scanning for plugins"
+msgstr ""
+
+#: ardour_ui.cc:4767
+msgid "Cancel plugin scan"
+msgstr ""
+
+#: ardour_ui.cc:4776
+msgid "Stop Timeout"
+msgstr ""
+
+#: ardour_ui.cc:4783
+msgid "Scan Timeout"
+msgstr ""
+
+#: ardour_ui.cc:4827
+msgid ""
+"The disk system on your computer\n"
+"was not able to keep up with %1.\n"
+"\n"
+"Specifically, it failed to read data from disk\n"
+"quickly enough to keep up with playback.\n"
+msgstr ""
+
+#: ardour_ui.cc:4862
+msgid "Crash Recovery"
+msgstr ""
+
+#: ardour_ui.cc:4863
+msgid ""
+"This session appears to have been in the\n"
+"middle of recording when %1 or\n"
+"the computer was shutdown.\n"
+"\n"
+"%1 can recover any captured audio for\n"
+"you, or it can ignore it. Please decide\n"
+"what you would like to do.\n"
+msgstr ""
+
+#: ardour_ui.cc:4875
+msgid "Ignore crash data"
+msgstr ""
+
+#: ardour_ui.cc:4876
+msgid "Recover from crash"
+msgstr ""
+
+#: ardour_ui.cc:4896
+msgid "Sample Rate Mismatch"
+msgstr ""
+
+#: ardour_ui.cc:4897
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz. If you load this session,\n"
+"audio may be played at the wrong sample rate.\n"
+msgstr ""
+
+#: ardour_ui.cc:4906
+msgid "Do not load session"
+msgstr ""
+
+#: ardour_ui.cc:4907
+msgid "Load session anyway"
+msgstr ""
+
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+
+#: ardour_ui.cc:5209
+msgid ""
+"%4This is a session from an older version of %3%5\n"
+"\n"
+"%3 has copied the old session file\n"
+"\n"
+"%6%1%7\n"
+"\n"
+"to\n"
+"\n"
+"%6%2%7\n"
+"\n"
+"From now on, use the backup copy with older versions of %3"
+msgstr ""
+
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
+
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
+
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
+msgid "Play from playhead"
+msgstr ""
+
+#: ardour_ui2.cc:80
+msgid "Stop playback"
+msgstr ""
+
+#: ardour_ui2.cc:81
+msgid "Toggle record"
+msgstr ""
+
+#: ardour_ui2.cc:82
+msgid "Play range/selection"
+msgstr ""
+
+#: ardour_ui2.cc:83
+msgid "Go to start of session"
+msgstr ""
+
+#: ardour_ui2.cc:84
+msgid "Go to end of session"
+msgstr ""
+
+#: ardour_ui2.cc:85
+msgid "Play loop range"
+msgstr ""
+
+#: ardour_ui2.cc:86
+msgid ""
+"MIDI Panic\n"
+"Send note off and reset controller messages on all MIDI channels"
+msgstr ""
+
+#: ardour_ui2.cc:87
+msgid "Return to last playback start when stopped"
+msgstr ""
+
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
+
+#: ardour_ui2.cc:89
+msgid "Be sensible about input monitoring"
+msgstr ""
+
+#: ardour_ui2.cc:90
+msgid "Enable/Disable audio click"
+msgstr ""
+
+#: ardour_ui2.cc:91 monitor_section.cc:129
+msgid ""
+"When active, something is soloed.\n"
+"Click to de-solo everything"
+msgstr ""
+
+#: ardour_ui2.cc:92
+msgid ""
+"When active, auditioning is taking place.\n"
+"Click to stop the audition"
+msgstr ""
+
+#: ardour_ui2.cc:93
+msgid "When active, there is a feedback loop."
+msgstr ""
+
+#: ardour_ui2.cc:94
+msgid ""
+"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
+msgstr ""
+
+#: ardour_ui2.cc:95
+msgid ""
+"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
+msgstr ""
+
+#: ardour_ui2.cc:96
+msgid "Reset All Peak Indicators"
+msgstr ""
+
+#: ardour_ui2.cc:97
+msgid "Show Error Log and acknowledge warnings"
+msgstr ""
+
+#: ardour_ui2.cc:130
+msgid "[ERROR]: "
+msgstr ""
+
+#: ardour_ui2.cc:133
+msgid "[WARNING]: "
+msgstr ""
+
+#: ardour_ui2.cc:136
+msgid "[INFO]: "
+msgstr ""
+
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
+msgid "Auto Return"
+msgstr ""
+
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
+msgid "Follow Edits"
+msgstr ""
+
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
+msgid "GUI"
+msgstr ""
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: ardour_ui_dependents.cc:118
+msgid "Setup Editor"
+msgstr ""
+
+#: ardour_ui_dependents.cc:120
+msgid "Setup Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:127
+msgid "Reload Session History"
+msgstr ""
+
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr ""
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
+msgid "Don't close"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:264
+msgid "Just close"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:265
+msgid "Save and close"
+msgstr ""
+
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr ""
+
+#: ardour_ui_ed.cc:128
+msgid "Session"
+msgstr ""
+
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
+msgid "Sync"
+msgstr ""
+
+#: ardour_ui_ed.cc:132
+msgid "Options"
+msgstr ""
+
+#: ardour_ui_ed.cc:133
+msgid "Window"
+msgstr ""
+
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
+msgid "Help"
+msgstr ""
+
+#: ardour_ui_ed.cc:139
+msgid "Misc. Shortcuts"
+msgstr ""
+
+#: ardour_ui_ed.cc:140
+msgid "Audio File Format"
+msgstr ""
+
+#: ardour_ui_ed.cc:141
+msgid "File Type"
+msgstr ""
+
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
+msgid "Sample Format"
+msgstr ""
+
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
+msgid "Control Surfaces"
+msgstr ""
+
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
+msgid "Plugins"
+msgstr ""
+
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
+msgid "Metering"
+msgstr ""
+
+#: ardour_ui_ed.cc:146
+msgid "Fall Off Rate"
+msgstr ""
+
+#: ardour_ui_ed.cc:147
+msgid "Hold Time"
+msgstr ""
+
+#: ardour_ui_ed.cc:148
+msgid "Denormal Handling"
+msgstr ""
+
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
+msgid "New..."
+msgstr ""
+
+#: ardour_ui_ed.cc:154
+msgid "Open..."
+msgstr ""
+
+#: ardour_ui_ed.cc:155
+msgid "Recent..."
+msgstr ""
+
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
+msgid "Close"
+msgstr ""
+
+#: ardour_ui_ed.cc:159
+msgid "Add Track or Bus..."
+msgstr ""
+
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
+msgid "Remove Video"
+msgstr ""
+
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
+msgid "Save As..."
+msgstr ""
+
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
+msgid "Rename..."
+msgstr ""
+
+#: ardour_ui_ed.cc:214
+msgid "Save Template..."
+msgstr ""
+
+#: ardour_ui_ed.cc:217
+msgid "Metadata"
+msgstr ""
+
+#: ardour_ui_ed.cc:220
+msgid "Edit Metadata..."
+msgstr ""
+
+#: ardour_ui_ed.cc:223
+msgid "Import Metadata..."
+msgstr ""
+
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
+
+#: ardour_ui_ed.cc:229
+msgid "Stem export..."
+msgstr ""
+
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:136 export_video_dialog.cc:80
+msgid "Export"
+msgstr ""
+
+#: ardour_ui_ed.cc:235
+msgid "Clean-up Unused Sources..."
+msgstr ""
+
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
+msgid "Flush Wastebasket"
+msgstr ""
+
+#: ardour_ui_ed.cc:251
+msgid "Quit"
+msgstr ""
+
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr ""
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
+msgid "Maximise Editor Space"
+msgstr ""
+
+#: ardour_ui_ed.cc:295
+msgid "Maximise Mixer Space"
+msgstr ""
+
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr ""
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
+
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
+msgstr ""
+
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
+msgid "Window|Meterbridge"
+msgstr ""
+
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
+msgid "MIDI Tracer"
+msgstr ""
+
+#: ardour_ui_ed.cc:314
+msgid "Chat"
+msgstr ""
+
+#: ardour_ui_ed.cc:316
+msgid "Help|Manual"
+msgstr ""
+
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
+
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr ""
+
+#: ardour_ui_ed.cc:319
+msgid "Cheat Sheet"
+msgstr ""
+
+#: ardour_ui_ed.cc:320
+msgid "Ardour Website"
+msgstr ""
+
+#: ardour_ui_ed.cc:321
+msgid "Ardour Development"
+msgstr ""
+
+#: ardour_ui_ed.cc:322
+msgid "User Forums"
+msgstr ""
+
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr ""
+
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:420
+msgid "Save"
+msgstr ""
+
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
+msgid "Transport"
+msgstr ""
+
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
+msgid "Stop"
+msgstr ""
+
+#: ardour_ui_ed.cc:342
+msgid "Roll"
+msgstr ""
+
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
+msgid "Start/Stop"
+msgstr ""
+
+#: ardour_ui_ed.cc:352
+msgid "Start/Continue/Stop"
+msgstr ""
+
+#: ardour_ui_ed.cc:355
+msgid "Stop and Forget Capture"
+msgstr ""
+
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
+
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
+
+#: ardour_ui_ed.cc:373
+msgid "Play Loop Range"
+msgstr ""
+
+#: ardour_ui_ed.cc:376
+msgid "Play Selection"
+msgstr ""
+
+#: ardour_ui_ed.cc:379
+msgid "Play Selection w/Preroll"
+msgstr ""
+
+#: ardour_ui_ed.cc:383
+msgid "Enable Record"
+msgstr ""
+
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
+msgid "Start Recording"
+msgstr ""
+
+#: ardour_ui_ed.cc:394
+msgid "Rewind"
+msgstr ""
+
+#: ardour_ui_ed.cc:397
+msgid "Rewind (Slow)"
+msgstr ""
+
+#: ardour_ui_ed.cc:400
+msgid "Rewind (Fast)"
+msgstr ""
+
+#: ardour_ui_ed.cc:403
+msgid "Forward"
+msgstr ""
+
+#: ardour_ui_ed.cc:406
+msgid "Forward (Slow)"
+msgstr ""
+
+#: ardour_ui_ed.cc:409
+msgid "Forward (Fast)"
+msgstr ""
+
+#: ardour_ui_ed.cc:412
+msgid "Go to Zero"
+msgstr ""
+
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
+msgid "Go to Start"
+msgstr ""
+
+#: ardour_ui_ed.cc:421
+msgid "Go to End"
+msgstr ""
+
+#: ardour_ui_ed.cc:424
+msgid "Go to Wall Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
+msgid "Numpad Decimal"
+msgstr ""
+
+#: ardour_ui_ed.cc:435
+msgid "Numpad 0"
+msgstr ""
+
+#: ardour_ui_ed.cc:438
+msgid "Numpad 1"
+msgstr ""
+
+#: ardour_ui_ed.cc:441
+msgid "Numpad 2"
+msgstr ""
+
+#: ardour_ui_ed.cc:444
+msgid "Numpad 3"
+msgstr ""
+
+#: ardour_ui_ed.cc:447
+msgid "Numpad 4"
+msgstr ""
+
+#: ardour_ui_ed.cc:450
+msgid "Numpad 5"
+msgstr ""
+
+#: ardour_ui_ed.cc:453
+msgid "Numpad 6"
+msgstr ""
+
+#: ardour_ui_ed.cc:456
+msgid "Numpad 7"
+msgstr ""
+
+#: ardour_ui_ed.cc:459
+msgid "Numpad 8"
+msgstr ""
+
+#: ardour_ui_ed.cc:462
+msgid "Numpad 9"
+msgstr ""
+
+#: ardour_ui_ed.cc:466
+msgid "Focus On Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
+#: session_option_editor.cc:41 session_option_editor.cc:61
+#: session_option_editor.cc:80 session_option_editor.cc:96
+#: session_option_editor.cc:109 session_option_editor.cc:122
+#: session_option_editor.cc:124 session_option_editor.cc:126
+msgid "Timecode"
+msgstr ""
+
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
+msgid "Bars & Beats"
+msgstr ""
+
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
+msgid "Minutes & Seconds"
+msgstr ""
+
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
+msgid "Samples"
+msgstr ""
+
+#: ardour_ui_ed.cc:488
+msgid "Punch In"
+msgstr ""
+
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:191
+#: time_info_box.cc:110
+msgid "In"
+msgstr ""
+
+#: ardour_ui_ed.cc:492
+msgid "Punch Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
+msgid "Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:496
+msgid "Punch In/Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:497
+msgid "In/Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
+msgid "Click"
+msgstr ""
+
+#: ardour_ui_ed.cc:503
+msgid "Auto Input"
+msgstr ""
+
+#: ardour_ui_ed.cc:506
+msgid "Auto Play"
+msgstr ""
+
+#: ardour_ui_ed.cc:517
+msgid "Sync Startup to Video"
+msgstr ""
+
+#: ardour_ui_ed.cc:519
+msgid "Time Master"
+msgstr ""
+
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
+msgid "Toggle Record Enable Track %1"
+msgstr ""
+
+#: ardour_ui_ed.cc:533
+msgid "Percentage"
+msgstr ""
+
+#: ardour_ui_ed.cc:534 shuttle_control.cc:206
+msgid "Semitones"
+msgstr ""
+
+#: ardour_ui_ed.cc:538
+msgid "Send MTC"
+msgstr ""
+
+#: ardour_ui_ed.cc:540
+msgid "Send MMC"
+msgstr ""
+
+#: ardour_ui_ed.cc:542
+msgid "Use MMC"
+msgstr ""
+
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
+msgid "Send MIDI Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:546
+msgid "Send MIDI Feedback"
+msgstr ""
+
+#: ardour_ui_ed.cc:552
+msgid "Panic"
+msgstr ""
+
+#: ardour_ui_ed.cc:618
+msgid "Wall Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:620
+msgid "Disk Space"
+msgstr ""
+
+#: ardour_ui_ed.cc:621
+msgid "DSP"
+msgstr ""
+
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:624
+msgid "Buffers"
+msgstr ""
+
+#: ardour_ui_ed.cc:626
+msgid "Timecode Format"
+msgstr ""
+
+#: ardour_ui_ed.cc:627
+msgid "File Format"
+msgstr ""
+
+#: ardour_ui_options.cc:55
+msgid ""
+"It is not possible to use JACK as the the sync source\n"
+"when the pull up/down setting is non-zero."
+msgstr ""
+
+#: ardour_ui_options.cc:309
+msgid "Internal"
+msgstr ""
+
+#: ardour_ui_options.cc:518
+msgid "Enable/Disable external positional sync"
+msgstr ""
+
+#: ardour_ui_options.cc:520
+msgid "Sync to JACK is not possible: video pull up/down is set"
+msgstr ""
+
+#: audio_clock.cc:1057 audio_clock.cc:1076
+msgid "--pending--"
+msgstr ""
+
+#: audio_clock.cc:1128
+msgid "SR"
+msgstr ""
+
+#: audio_clock.cc:1134 audio_clock.cc:1138
+msgid "Pull"
+msgstr ""
+
+#: audio_clock.cc:1136
+#, c-format
+msgid "%+.4f%%"
+msgstr ""
+
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
+msgid "Tempo"
+msgstr ""
+
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
+msgid "Meter"
+msgstr ""
+
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
+msgid "programming error: %1"
+msgstr ""
+
+#: audio_clock.cc:2011 audio_clock.cc:2039
+msgid "programming error: %1 %2"
+msgstr ""
+
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
+msgid "Bars:Beats"
+msgstr ""
+
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
+msgid "Minutes:Seconds"
+msgstr ""
+
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
+
+#: audio_clock.cc:2130
+msgid "Locate to This Time"
+msgstr ""
+
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
+msgid "dB"
+msgstr ""
+
+#: audio_region_editor.cc:63
+msgid "Region gain:"
+msgstr ""
+
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
+msgid "dBFS"
+msgstr ""
+
+#: audio_region_editor.cc:76
+msgid "Peak amplitude:"
+msgstr ""
+
+#: audio_region_editor.cc:87
+msgid "Calculating..."
+msgstr ""
+
+#: audio_region_view.cc:1385
+msgid "add gain control point"
+msgstr ""
+
+#: automation_controller.cc:304 automation_controller.cc:320
+msgid "Select Note..."
+msgstr ""
+
+#: automation_controller.cc:311
+msgid "Halve"
+msgstr ""
+
+#: automation_controller.cc:314
+msgid "Double"
+msgstr ""
+
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
+
+#: automation_line.cc:292 editor_drag.cc:4387
+msgid "automation event move"
+msgstr ""
+
+#: automation_line.cc:888 region_gain_line.cc:75
+msgid "remove control point"
+msgstr ""
+
+#: automation_line.cc:1013
+msgid "Ignoring illegal points on AutomationLine \"%1\""
+msgstr ""
+
+#: automation_region_view.cc:193 automation_time_axis.cc:649
+msgid "add automation event"
+msgstr ""
+
+#: automation_streamview.cc:94
+msgid "unable to display automation region for control without list"
+msgstr ""
+
+#: automation_time_axis.cc:163
+msgid "automation state"
+msgstr ""
+
+#: automation_time_axis.cc:164
+msgid "hide track"
+msgstr ""
+
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:601
+#: generic_pluginui.cc:949 panner_ui.cc:151
+msgid "Automation|Manual"
+msgstr ""
+
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2034 editor.cc:2112
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:101 generic_pluginui.cc:604 generic_pluginui.cc:951
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
+#: panner_ui.cc:154
+msgid "Play"
+msgstr ""
+
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:103
+#: generic_pluginui.cc:607 generic_pluginui.cc:953 panner_ui.cc:157
+msgid "Write"
+msgstr ""
+
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:105
+#: generic_pluginui.cc:610 generic_pluginui.cc:955 panner_ui.cc:160
+msgid "Touch"
+msgstr ""
+
+#: automation_time_axis.cc:406 generic_pluginui.cc:613 meter_patterns.cc:118
+msgid "???"
+msgstr ""
+
+#: automation_time_axis.cc:447
+msgid "clear automation"
+msgstr ""
+
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
+msgid "Clear"
+msgstr ""
+
+#: automation_time_axis.cc:578
+msgid "State"
+msgstr ""
+
+#: automation_time_axis.cc:594
+msgid "Discrete"
+msgstr ""
+
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
+msgid "Linear"
+msgstr ""
+
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:225
+msgid "Mode"
+msgstr ""
+
+#: bundle_manager.cc:182
+msgid "Disassociate"
+msgstr ""
+
+#: bundle_manager.cc:186
+msgid "Edit Bundle"
+msgstr ""
+
+#: bundle_manager.cc:201
+msgid "Direction:"
+msgstr ""
+
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
+msgid "Input"
+msgstr ""
+
+#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
+msgid "Output"
+msgstr ""
+
+#: bundle_manager.cc:265 editor.cc:2076 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
+msgid "Edit"
+msgstr ""
+
+#: bundle_manager.cc:266 editor.cc:5963 editor.cc:5993 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:421
+#: processor_box.cc:3681 processor_box.cc:3683
+msgid "Delete"
+msgstr ""
+
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
+msgid "Name"
+msgstr ""
+
+#: bundle_manager.cc:283 luawindow.cc:566
+msgid "New"
+msgstr ""
+
+#: bundle_manager.cc:333
+msgid "Bundle"
+msgstr ""
+
+#: bundle_manager.cc:418
+msgid "Add Channel"
+msgstr ""
+
+#: bundle_manager.cc:425
+msgid "Rename Channel"
+msgstr ""
+
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr ""
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr ""
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr ""
+
+#: configinfo.cc:28
+msgid "Build Configuration"
+msgstr ""
+
+#: control_point_dialog.cc:33
+msgid "Control point"
+msgstr ""
+
+#: control_point_dialog.cc:45
+msgid "Value"
+msgstr ""
+
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
+#: edit_note_dialog.cc:42
+msgid "Note"
+msgstr ""
+
+#: edit_note_dialog.cc:45
+msgid "Set selected notes to this channel"
+msgstr ""
+
+#: edit_note_dialog.cc:46
+msgid "Set selected notes to this pitch"
+msgstr ""
+
+#: edit_note_dialog.cc:47
+msgid "Set selected notes to this velocity"
+msgstr ""
+
+#: edit_note_dialog.cc:49
+msgid "Set selected notes to this time"
+msgstr ""
+
+#: edit_note_dialog.cc:51
+msgid "Set selected notes to this length"
+msgstr ""
+
+#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
+#: step_entry.cc:394
+msgid "Channel"
+msgstr ""
+
+#: edit_note_dialog.cc:68
+msgid "Pitch"
+msgstr ""
+
+#: edit_note_dialog.cc:78 step_entry.cc:408
+msgid "Velocity"
+msgstr ""
+
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
+msgid "Time"
+msgstr ""
+
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:415 export_timespan_selector.cc:506
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
+msgid "Length"
+msgstr ""
+
+#: edit_note_dialog.cc:166
+msgid "edit note"
+msgstr ""
+
+#: editor.cc:160
+msgid "CD Frames"
+msgstr ""
+
+#: editor.cc:161
+msgid "TC Frames"
+msgstr ""
+
+#: editor.cc:162
+msgid "TC Seconds"
+msgstr ""
+
+#: editor.cc:163
+msgid "TC Minutes"
+msgstr ""
+
+#: editor.cc:164
+msgid "Seconds"
+msgstr ""
+
+#: editor.cc:165
+msgid "Minutes"
+msgstr ""
+
+#: editor.cc:166 quantize_dialog.cc:37
+msgid "Beats/128"
+msgstr ""
+
+#: editor.cc:167 quantize_dialog.cc:38
+msgid "Beats/64"
+msgstr ""
+
+#: editor.cc:168 quantize_dialog.cc:39
+msgid "Beats/32"
+msgstr ""
+
+#: editor.cc:169 quantize_dialog.cc:40
+msgid "Beats/28"
+msgstr ""
+
+#: editor.cc:170 quantize_dialog.cc:41
+msgid "Beats/24"
+msgstr ""
+
+#: editor.cc:171 quantize_dialog.cc:42
+msgid "Beats/20"
+msgstr ""
+
+#: editor.cc:172 quantize_dialog.cc:43
+msgid "Beats/16"
+msgstr ""
+
+#: editor.cc:173 quantize_dialog.cc:44
+msgid "Beats/14"
+msgstr ""
+
+#: editor.cc:174 quantize_dialog.cc:45
+msgid "Beats/12"
+msgstr ""
+
+#: editor.cc:175 quantize_dialog.cc:46
+msgid "Beats/10"
+msgstr ""
+
+#: editor.cc:176 quantize_dialog.cc:47
+msgid "Beats/8"
+msgstr ""
+
+#: editor.cc:177 quantize_dialog.cc:48
+msgid "Beats/7"
+msgstr ""
+
+#: editor.cc:178 quantize_dialog.cc:49
+msgid "Beats/6"
+msgstr ""
+
+#: editor.cc:179 quantize_dialog.cc:50
+msgid "Beats/5"
+msgstr ""
+
+#: editor.cc:180 quantize_dialog.cc:51
+msgid "Beats/4"
+msgstr ""
+
+#: editor.cc:181 quantize_dialog.cc:52
+msgid "Beats/3"
+msgstr ""
+
+#: editor.cc:182 quantize_dialog.cc:53
+msgid "Beats/2"
+msgstr ""
+
+#: editor.cc:183 quantize_dialog.cc:54
+msgid "Beats"
+msgstr ""
+
+#: editor.cc:184
+msgid "Bars"
+msgstr ""
+
+#: editor.cc:185
+msgid "Marks"
+msgstr ""
+
+#: editor.cc:186
+msgid "Region starts"
+msgstr ""
+
+#: editor.cc:187
+msgid "Region ends"
+msgstr ""
+
+#: editor.cc:188
+msgid "Region syncs"
+msgstr ""
+
+#: editor.cc:189
+msgid "Region bounds"
+msgstr ""
+
+#: editor.cc:194 editor_actions.cc:551
+msgid "No Grid"
+msgstr ""
+
+#: editor.cc:195 editor_actions.cc:552
+msgid "Grid"
+msgstr ""
+
+#: editor.cc:196 editor_actions.cc:553
+msgid "Magnetic"
+msgstr ""
+
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
+msgid "Playhead"
+msgstr ""
+
+#: editor.cc:202 editor_actions.cc:536
+msgid "Marker"
+msgstr ""
+
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
+msgid "Mouse"
+msgstr ""
+
+#: editor.cc:208 editor_actions.cc:543
+msgid "Slide"
+msgstr ""
+
+#: editor.cc:209
+msgid "Splice"
+msgstr ""
+
+#: editor.cc:210 editor_actions.cc:542
+msgid "Ripple"
+msgstr ""
+
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
+msgid "Lock"
+msgstr ""
+
+#: editor.cc:216 mono_panner_editor.cc:44
+msgid "Left"
+msgstr ""
+
+#: editor.cc:217 mono_panner_editor.cc:49
+msgid "Right"
+msgstr ""
+
+#: editor.cc:218
+msgid "Center"
+msgstr ""
+
+#: editor.cc:221
+msgid "Edit point"
+msgstr ""
+
+#: editor.cc:227
+msgid "Mushy"
+msgstr ""
+
+#: editor.cc:228
+msgid "Smooth"
+msgstr ""
+
+#: editor.cc:229
+msgid "Balanced multitimbral mixture"
+msgstr ""
+
+#: editor.cc:230
+msgid "Unpitched percussion with stable notes"
+msgstr ""
+
+#: editor.cc:231
+msgid "Crisp monophonic instrumental"
+msgstr ""
+
+#: editor.cc:232
+msgid "Unpitched solo percussion"
+msgstr ""
+
+#: editor.cc:233
+msgid "Resample without preserving pitch"
+msgstr ""
+
+#: editor.cc:319
+msgid "Mins:Secs"
+msgstr ""
+
+#: editor.cc:325
+msgid "Location Markers"
+msgstr ""
+
+#: editor.cc:326
+msgid "Range Markers"
+msgstr ""
+
+#: editor.cc:327
+msgid "Loop/Punch Ranges"
+msgstr ""
+
+#: editor.cc:328 editor_actions.cc:606
+msgid "CD Markers"
+msgstr ""
+
+#: editor.cc:329
+msgid "Video Timeline"
+msgstr ""
+
+#: editor.cc:386
+msgid "mode"
+msgstr ""
+
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
+msgid "Markers"
+msgstr ""
+
+#: editor.cc:653 rc_option_editor.cc:2527
+msgid "Regions"
+msgstr ""
+
+#: editor.cc:654
+msgid "Tracks & Busses"
+msgstr ""
+
+#: editor.cc:655
+msgid "Snapshots"
+msgstr ""
+
+#: editor.cc:656
+msgid "Track & Bus Groups"
+msgstr ""
+
+#: editor.cc:657
+msgid "Ranges & Marks"
+msgstr ""
+
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
+msgid "Loop"
+msgstr ""
+
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
+msgid "Punch"
+msgstr ""
+
+#: editor.cc:1475 rc_option_editor.cc:2299
+msgid "Linear (for highly correlated material)"
+msgstr ""
+
+#: editor.cc:1485 rc_option_editor.cc:2300
+msgid "Constant power"
+msgstr ""
+
+#: editor.cc:1494 rc_option_editor.cc:2301
+msgid "Symmetric"
+msgstr ""
+
+#: editor.cc:1504 rc_option_editor.cc:2302
+msgid "Slow"
+msgstr ""
+
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
+msgid "Fast"
+msgstr ""
+
+#: editor.cc:1535 editor.cc:1560
+msgid "Deactivate"
+msgstr ""
+
+#: editor.cc:1537 editor.cc:1562
+msgid "Activate"
+msgstr ""
+
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
+msgid "Freeze"
+msgstr ""
+
+#: editor.cc:1667
+msgid "Unfreeze"
+msgstr ""
+
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1902
+msgid "Selected Regions"
+msgstr ""
+
+#: editor.cc:1946 editor_markers.cc:945
+msgid "Play Range"
+msgstr ""
+
+#: editor.cc:1947 editor_markers.cc:948
+msgid "Loop Range"
+msgstr ""
+
+#: editor.cc:1950 editor_markers.cc:953
+msgid "Zoom to Range"
+msgstr ""
+
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1960 editor_actions.cc:401
+msgid "Move Range Start to Previous Region Boundary"
+msgstr ""
+
+#: editor.cc:1967 editor_actions.cc:408
+msgid "Move Range Start to Next Region Boundary"
+msgstr ""
+
+#: editor.cc:1974 editor_actions.cc:415
+msgid "Move Range End to Previous Region Boundary"
+msgstr ""
+
+#: editor.cc:1981 editor_actions.cc:422
+msgid "Move Range End to Next Region Boundary"
+msgstr ""
+
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
+msgid "Separate"
+msgstr ""
+
+#: editor.cc:1988
+msgid "Convert to Region in Region List"
+msgstr ""
+
+#: editor.cc:1991 editor_markers.cc:973
+msgid "Select All in Range"
+msgstr ""
+
+#: editor.cc:1994 editor_actions.cc:319
+msgid "Set Loop from Selection"
+msgstr ""
+
+#: editor.cc:1995 editor_actions.cc:320
+msgid "Set Punch from Selection"
+msgstr ""
+
+#: editor.cc:1996 editor_actions.cc:321
+msgid "Set Session Start/End from Selection"
+msgstr ""
+
+#: editor.cc:1999
+msgid "Add Range Markers"
+msgstr ""
+
+#: editor.cc:2002
+msgid "Crop Region to Range"
+msgstr ""
+
+#: editor.cc:2003 editor_actions.cc:333
+msgid "Duplicate Range"
+msgstr ""
+
+#: editor.cc:2006
+msgid "Consolidate Range"
+msgstr ""
+
+#: editor.cc:2007
+msgid "Consolidate Range with Processing"
+msgstr ""
+
+#: editor.cc:2008
+msgid "Bounce Range to Region List"
+msgstr ""
+
+#: editor.cc:2009
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
+
+#: editor.cc:2010 editor_markers.cc:956
+msgid "Export Range..."
+msgstr ""
+
+#: editor.cc:2012
+msgid "Export Video Range..."
+msgstr ""
+
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
+
+#: editor.cc:2029 editor.cc:2111
+msgid "Play from Start"
+msgstr ""
+
+#: editor.cc:2030
+msgid "Play Region"
+msgstr ""
+
+#: editor.cc:2032
+msgid "Loop Region"
+msgstr ""
+
+#: editor.cc:2042 editor.cc:2120
+msgid "Select All in Track"
+msgstr ""
+
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
+msgid "Select All Objects"
+msgstr ""
+
+#: editor.cc:2044 editor.cc:2122
+msgid "Invert Selection in Track"
+msgstr ""
+
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
+msgid "Invert Selection"
+msgstr ""
+
+#: editor.cc:2047 editor_actions.cc:201
+msgid "Set Range to Loop Range"
+msgstr ""
+
+#: editor.cc:2048 editor_actions.cc:202
+msgid "Set Range to Punch Range"
+msgstr ""
+
+#: editor.cc:2049 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
+msgid "Select All After Edit Point"
+msgstr ""
+
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
+msgid "Select All Before Edit Point"
+msgstr ""
+
+#: editor.cc:2053 editor.cc:2127
+msgid "Select All After Playhead"
+msgstr ""
+
+#: editor.cc:2054 editor.cc:2128
+msgid "Select All Before Playhead"
+msgstr ""
+
+#: editor.cc:2055
+msgid "Select All Between Playhead and Edit Point"
+msgstr ""
+
+#: editor.cc:2056
+msgid "Select All Within Playhead and Edit Point"
+msgstr ""
+
+#: editor.cc:2057
+msgid "Select Range Between Playhead and Edit Point"
+msgstr ""
+
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
+msgid "Select"
+msgstr ""
+
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
+msgid "Cut"
+msgstr ""
+
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
+msgid "Copy"
+msgstr ""
+
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
+msgid "Paste"
+msgstr ""
+
+#: editor.cc:2073 editor_actions.cc:94
+msgid "Align"
+msgstr ""
+
+#: editor.cc:2074
+msgid "Align Relative"
+msgstr ""
+
+#: editor.cc:2081
+msgid "Insert Selected Region"
+msgstr ""
+
+#: editor.cc:2082
+msgid "Insert Existing Media"
+msgstr ""
+
+#: editor.cc:2091 editor.cc:2147
+msgid "Nudge Entire Track Later"
+msgstr ""
+
+#: editor.cc:2092 editor.cc:2148
+msgid "Nudge Track After Edit Point Later"
+msgstr ""
+
+#: editor.cc:2093 editor.cc:2149
+msgid "Nudge Entire Track Earlier"
+msgstr ""
+
+#: editor.cc:2094 editor.cc:2150
+msgid "Nudge Track After Edit Point Earlier"
+msgstr ""
+
+#: editor.cc:2096 editor.cc:2152
+msgid "Nudge"
+msgstr ""
+
+#: editor.cc:2354
+msgid ""
+"Playhead position stored with a negative value - ignored (use zero instead)"
+msgstr ""
+
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
+#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
+msgid "All"
+msgstr ""
+
+#: editor.cc:3281
+msgid "Smart Mode (add range functions to Grab Mode)"
+msgstr ""
+
+#: editor.cc:3282
+msgid "Grab Mode (select/move objects)"
+msgstr ""
+
+#: editor.cc:3283
+msgid "Cut Mode (split regions)"
+msgstr ""
+
+#: editor.cc:3284
+msgid "Range Mode (select time ranges)"
+msgstr ""
+
+#: editor.cc:3285
+msgid "Draw Mode (draw and edit gain/notes/automation)"
+msgstr ""
+
+#: editor.cc:3286
+msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
+msgstr ""
+
+#: editor.cc:3287
+msgid "Audition Mode (listen to regions)"
+msgstr ""
+
+#: editor.cc:3288
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr ""
+
+#: editor.cc:3289
+msgid ""
+"Groups: click to (de)activate\n"
+"Context-click for other operations"
+msgstr ""
+
+#: editor.cc:3290
+msgid "Nudge Region/Selection Later"
+msgstr ""
+
+#: editor.cc:3291
+msgid "Nudge Region/Selection Earlier"
+msgstr ""
+
+#: editor.cc:3292 editor_actions.cc:272
+msgid "Zoom In"
+msgstr ""
+
+#: editor.cc:3293 editor_actions.cc:271
+msgid "Zoom Out"
+msgstr ""
+
+#: editor.cc:3294
+msgid "Zoom to Time Scale"
+msgstr ""
+
+#: editor.cc:3295 editor.cc:3798 editor_actions.cc:273
+msgid "Zoom to Session"
+msgstr ""
+
+#: editor.cc:3296 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr ""
+
+#: editor.cc:3297
+msgid "Expand Tracks"
+msgstr ""
+
+#: editor.cc:3298
+msgid "Shrink Tracks"
+msgstr ""
+
+#: editor.cc:3299
+msgid "Number of visible tracks"
+msgstr ""
+
+#: editor.cc:3300
+msgid "Snap/Grid Units"
+msgstr ""
+
+#: editor.cc:3301
+msgid "Snap/Grid Mode"
+msgstr ""
+
+#: editor.cc:3302 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3303
+msgid "Edit Mode"
+msgstr ""
+
+#: editor.cc:3304
+msgid ""
+"Nudge Clock\n"
+"(controls distance used to nudge regions and selections)"
+msgstr ""
+
+#: editor.cc:3572 editor_actions.cc:335
+msgid "Command|Undo"
+msgstr ""
+
+#: editor.cc:3574
+msgid "Command|Undo (%1)"
+msgstr ""
+
+#: editor.cc:3581 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
+msgid "Redo"
+msgstr ""
+
+#: editor.cc:3584
+msgid "Redo (%1)"
+msgstr ""
+
+#: editor.cc:3604 editor.cc:3628 editor_actions.cc:113 editor_actions.cc:1863
+msgid "Duplicate"
+msgstr ""
+
+#: editor.cc:3605
+msgid "Number of duplications:"
+msgstr ""
+
+#: editor.cc:3775 route_group_dialog.cc:51 time_info_box.cc:61
+msgid "Selection"
+msgstr ""
+
+#: editor.cc:3778
+msgid "Fit 1 track"
+msgstr ""
+
+#: editor.cc:3779
+msgid "Fit 2 tracks"
+msgstr ""
+
+#: editor.cc:3780
+msgid "Fit 4 tracks"
+msgstr ""
+
+#: editor.cc:3781
+msgid "Fit 8 tracks"
+msgstr ""
+
+#: editor.cc:3782
+msgid "Fit 16 tracks"
+msgstr ""
+
+#: editor.cc:3783
+msgid "Fit 24 tracks"
+msgstr ""
+
+#: editor.cc:3784
+msgid "Fit 32 tracks"
+msgstr ""
+
+#: editor.cc:3785
+msgid "Fit 48 tracks"
+msgstr ""
+
+#: editor.cc:3786
+msgid "Fit All tracks"
+msgstr ""
+
+#: editor.cc:3787
+msgid "Fit Selection"
+msgstr ""
+
+#: editor.cc:3789 editor_actions.cc:288
+msgid "Zoom to 10 ms"
+msgstr ""
+
+#: editor.cc:3790 editor_actions.cc:289
+msgid "Zoom to 100 ms"
+msgstr ""
+
+#: editor.cc:3791 editor_actions.cc:290
+msgid "Zoom to 1 sec"
+msgstr ""
+
+#: editor.cc:3792 editor_actions.cc:291
+msgid "Zoom to 10 sec"
+msgstr ""
+
+#: editor.cc:3793 editor_actions.cc:292
+msgid "Zoom to 1 min"
+msgstr ""
+
+#: editor.cc:3794 editor_actions.cc:294
+msgid "Zoom to 10 min"
+msgstr ""
+
+#: editor.cc:3795
+msgid "Zoom to 1 hour"
+msgstr ""
+
+#: editor.cc:3796
+msgid "Zoom to 8 hours"
+msgstr ""
+
+#: editor.cc:3797
+msgid "Zoom to 24 hours"
+msgstr ""
+
+#: editor.cc:3799
+msgid "Zoom to Range/Region Selection"
+msgstr ""
+
+#: editor.cc:3869
+msgid "*"
+msgstr ""
+
+#: editor.cc:4136
+msgid "Playlist Deletion"
+msgstr ""
+
+#: editor.cc:4137
+msgid ""
+"Playlist %1 is currently unused.\n"
+"If it is kept, its audio files will not be cleaned.\n"
+"If it is deleted, audio files used by it alone will be cleaned."
+msgstr ""
+
+#: editor.cc:4147
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4148
+msgid "Delete Playlist"
+msgstr ""
+
+#: editor.cc:4149
+msgid "Keep Playlist"
+msgstr ""
+
+#: editor.cc:4150
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4151 editor_audio_import.cc:600 editor_ops.cc:6552
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
+msgid "Cancel"
+msgstr ""
+
+#: editor.cc:4293
+msgid "new playlists"
+msgstr ""
+
+#: editor.cc:4309
+msgid "copy playlists"
+msgstr ""
+
+#: editor.cc:4324
+msgid "clear playlists"
+msgstr ""
+
+#: editor.cc:5049
+msgid "Please wait while %1 loads visual data."
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5813 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5962 editor.cc:5997 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
+msgid "Edit..."
+msgstr ""
+
+#: editor.cc:6003 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6007 editor_actions.cc:1959
+msgid "Legatize"
+msgstr ""
+
+#: editor.cc:6013 editor_actions.cc:1958
+msgid "Quantize..."
+msgstr ""
+
+#: editor.cc:6016 editor_actions.cc:1961
+msgid "Remove Overlap"
+msgstr ""
+
+#: editor.cc:6022 editor_actions.cc:1960
+msgid "Transform..."
+msgstr ""
+
+#: editor_actions.cc:95
+msgid "Autoconnect"
+msgstr ""
+
+#: editor_actions.cc:96
+msgid "Crossfades"
+msgstr ""
+
+#: editor_actions.cc:98
+msgid "Move Selected Marker"
+msgstr ""
+
+#: editor_actions.cc:99
+msgid "Select Range Operations"
+msgstr ""
+
+#: editor_actions.cc:100
+msgid "Select Regions"
+msgstr ""
+
+#: editor_actions.cc:102
+msgid "Fade"
+msgstr ""
+
+#: editor_actions.cc:103
+msgid "Latch"
+msgstr ""
+
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
+msgid "Region"
+msgstr ""
+
+#: editor_actions.cc:105
+msgid "Layering"
+msgstr ""
+
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
+msgid "Position"
+msgstr ""
+
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
+msgid "Trim"
+msgstr ""
+
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
+msgid "Gain"
+msgstr ""
+
+#: editor_actions.cc:110 editor_actions.cc:604
+msgid "Ranges"
+msgstr ""
+
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
+#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
+msgid "Fades"
+msgstr ""
+
+#: editor_actions.cc:114
+msgid "Link"
+msgstr ""
+
+#: editor_actions.cc:116
+msgid "Locate to Markers"
+msgstr ""
+
+#: editor_actions.cc:118
+msgid "Meter falloff"
+msgstr ""
+
+#: editor_actions.cc:119
+msgid "Meter hold"
+msgstr ""
+
+#: editor_actions.cc:120 session_option_editor.cc:342
+msgid "MIDI Options"
+msgstr ""
+
+#: editor_actions.cc:121
+msgid "Misc Options"
+msgstr ""
+
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
+msgid "Monitoring"
+msgstr ""
+
+#: editor_actions.cc:123
+msgid "Active Mark"
+msgstr ""
+
+#: editor_actions.cc:126
+msgid "Primary Clock"
+msgstr ""
+
+#: editor_actions.cc:127
+msgid "Pullup / Pulldown"
+msgstr ""
+
+#: editor_actions.cc:128
+msgid "Region operations"
+msgstr ""
+
+#: editor_actions.cc:130 ruler_dialog.cc:28
+msgid "Rulers"
+msgstr ""
+
+#: editor_actions.cc:131
+msgid "Views"
+msgstr ""
+
+#: editor_actions.cc:132
+msgid "Scroll"
+msgstr ""
+
+#: editor_actions.cc:133
+msgid "Secondary Clock"
+msgstr ""
+
+#: editor_actions.cc:140
+msgid "Subframes"
+msgstr ""
+
+#: editor_actions.cc:143
+msgid "Timecode fps"
+msgstr ""
+
+#: editor_actions.cc:144 route_time_axis.cc:599
+msgid "Height"
+msgstr ""
+
+#: editor_actions.cc:146
+msgid "Tools"
+msgstr ""
+
+#: editor_actions.cc:147
+msgid "View"
+msgstr ""
+
+#: editor_actions.cc:149
+msgid "Zoom"
+msgstr ""
+
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
+
+#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
+msgid "Show Editor Mixer"
+msgstr ""
+
+#: editor_actions.cc:162
+msgid "Show Editor List"
+msgstr ""
+
+#: editor_actions.cc:164
+msgid "Playhead to Next Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:165
+msgid "Playhead to Next Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:166
+msgid "Playhead to Previous Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:167
+msgid "Playhead to Previous Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:169
+msgid "Playhead to Next Region Start"
+msgstr ""
+
+#: editor_actions.cc:170
+msgid "Playhead to Next Region End"
+msgstr ""
+
+#: editor_actions.cc:171
+msgid "Playhead to Next Region Sync"
+msgstr ""
+
+#: editor_actions.cc:173
+msgid "Playhead to Previous Region Start"
+msgstr ""
+
+#: editor_actions.cc:174
+msgid "Playhead to Previous Region End"
+msgstr ""
+
+#: editor_actions.cc:175
+msgid "Playhead to Previous Region Sync"
+msgstr ""
+
+#: editor_actions.cc:177
+msgid "To Next Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:178
+msgid "To Next Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:179
+msgid "To Previous Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:180
+msgid "To Previous Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:182
+msgid "To Next Region Start"
+msgstr ""
+
+#: editor_actions.cc:183
+msgid "To Next Region End"
+msgstr ""
+
+#: editor_actions.cc:184
+msgid "To Next Region Sync"
+msgstr ""
+
+#: editor_actions.cc:186
+msgid "To Previous Region Start"
+msgstr ""
+
+#: editor_actions.cc:187
+msgid "To Previous Region End"
+msgstr ""
+
+#: editor_actions.cc:188
+msgid "To Previous Region Sync"
+msgstr ""
+
+#: editor_actions.cc:190
+msgid "To Range Start"
+msgstr ""
+
+#: editor_actions.cc:191
+msgid "To Range End"
+msgstr ""
+
+#: editor_actions.cc:193
+msgid "Playhead to Range Start"
+msgstr ""
+
+#: editor_actions.cc:194
+msgid "Playhead to Range End"
+msgstr ""
+
+#: editor_actions.cc:197
+msgid "Select All Tracks"
+msgstr ""
+
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
+msgid "Deselect All"
+msgstr ""
+
+#: editor_actions.cc:210
+msgid "Select All Overlapping Edit Range"
+msgstr ""
+
+#: editor_actions.cc:211
+msgid "Select All Inside Edit Range"
+msgstr ""
+
+#: editor_actions.cc:213
+msgid "Select Edit Range"
+msgstr ""
+
+#: editor_actions.cc:215
+msgid "Select All in Punch Range"
+msgstr ""
+
+#: editor_actions.cc:216
+msgid "Select All in Loop Range"
+msgstr ""
+
+#: editor_actions.cc:218
+msgid "Select Next Track or Bus"
+msgstr ""
+
+#: editor_actions.cc:219
+msgid "Select Previous Track or Bus"
+msgstr ""
+
+#: editor_actions.cc:221
+msgid "Toggle Record Enable"
+msgstr ""
+
+#: editor_actions.cc:223
+msgid "Toggle Solo"
+msgstr ""
+
+#: editor_actions.cc:225
+msgid "Toggle Mute"
+msgstr ""
+
+#: editor_actions.cc:227
+msgid "Toggle Solo Isolate"
+msgstr ""
+
+#: editor_actions.cc:232
+msgid "Save View %1"
+msgstr ""
+
+#: editor_actions.cc:238
+msgid "Go to View %1"
+msgstr ""
+
+#: editor_actions.cc:244
+msgid "Locate to Mark %1"
+msgstr ""
+
+#: editor_actions.cc:249 editor_actions.cc:250
+msgid "Jump to Next Mark"
+msgstr ""
+
+#: editor_actions.cc:251 editor_actions.cc:252
+msgid "Jump to Previous Mark"
+msgstr ""
+
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
+msgid "Add Mark from Playhead"
+msgstr ""
+
+#: editor_actions.cc:260 editor_actions.cc:261
+msgid "Remove Mark at Playhead"
+msgstr ""
+
+#: editor_actions.cc:263
+msgid "Nudge Next Later"
+msgstr ""
+
+#: editor_actions.cc:264
+msgid "Nudge Next Earlier"
+msgstr ""
+
+#: editor_actions.cc:266
+msgid "Nudge Playhead Forward"
+msgstr ""
+
+#: editor_actions.cc:267
+msgid "Nudge Playhead Backward"
+msgstr ""
+
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
+
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
+
+#: editor_actions.cc:274
+msgid "Zoom to Selection"
+msgstr ""
+
+#: editor_actions.cc:275
+msgid "Toggle Zoom State"
+msgstr ""
+
+#: editor_actions.cc:277
+msgid "Expand Track Height"
+msgstr ""
+
+#: editor_actions.cc:278
+msgid "Shrink Track Height"
+msgstr ""
+
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
+msgid "Move Selected Tracks Up"
+msgstr ""
+
+#: editor_actions.cc:298
+msgid "Move Selected Tracks Down"
+msgstr ""
+
+#: editor_actions.cc:301
+msgid "Scroll Tracks Up"
+msgstr ""
+
+#: editor_actions.cc:302
+msgid "Scroll Tracks Down"
+msgstr ""
+
+#: editor_actions.cc:303
+msgid "Step Tracks Up"
+msgstr ""
+
+#: editor_actions.cc:304
+msgid "Step Tracks Down"
+msgstr ""
+
+#: editor_actions.cc:306
+msgid "Scroll Backward"
+msgstr ""
+
+#: editor_actions.cc:307
+msgid "Scroll Forward"
+msgstr ""
+
+#: editor_actions.cc:308
+msgid "Center Playhead"
+msgstr ""
+
+#: editor_actions.cc:309
+msgid "Center Edit Point"
+msgstr ""
+
+#: editor_actions.cc:311
+msgid "Playhead Forward"
+msgstr ""
+
+#: editor_actions.cc:312
+msgid "Playhead Backward"
+msgstr ""
+
+#: editor_actions.cc:314
+msgid "Playhead to Active Mark"
+msgstr ""
+
+#: editor_actions.cc:315
+msgid "Active Mark to Playhead"
+msgstr ""
+
+#: editor_actions.cc:317
+msgid "Use Skip Ranges"
+msgstr ""
+
+#: editor_actions.cc:324
+msgid "Play Selected Regions"
+msgstr ""
+
+#: editor_actions.cc:326
+msgid "Play from Edit Point and Return"
+msgstr ""
+
+#: editor_actions.cc:328
+msgid "Play Edit Range"
+msgstr ""
+
+#: editor_actions.cc:330
+msgid "Playhead to Mouse"
+msgstr ""
+
+#: editor_actions.cc:331
+msgid "Active Marker to Mouse"
+msgstr ""
+
+#: editor_actions.cc:341
+msgid "Undo Selection Change"
+msgstr ""
+
+#: editor_actions.cc:342
+msgid "Redo Selection Change"
+msgstr ""
+
+#: editor_actions.cc:344
+msgid "Export Audio"
+msgstr ""
+
+#: editor_actions.cc:345 export_dialog.cc:476
+msgid "Export Range"
+msgstr ""
+
+#: editor_actions.cc:350
+msgid "Separate Using Punch Range"
+msgstr ""
+
+#: editor_actions.cc:353
+msgid "Separate Using Loop Range"
+msgstr ""
+
+#: editor_actions.cc:356 editor_actions.cc:379
+msgid "Crop"
+msgstr ""
+
+#: editor_actions.cc:366
+msgid "Fade Range Selection"
+msgstr ""
+
+#: editor_actions.cc:368
+msgid "Set Tempo from Edit Range = Bar"
+msgstr ""
+
+#: editor_actions.cc:371
+msgid "Log"
+msgstr ""
+
+#: editor_actions.cc:374 editor_actions.cc:376
+msgid "Move to Next Transient"
+msgstr ""
+
+#: editor_actions.cc:375 editor_actions.cc:377
+msgid "Move to Previous Transient"
+msgstr ""
+
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
+msgid "Start Range"
+msgstr ""
+
+#: editor_actions.cc:385 editor_actions.cc:394
+msgid "Finish Range"
+msgstr ""
+
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
+msgid "Follow Playhead"
+msgstr ""
+
+#: editor_actions.cc:427
+msgid "Remove Last Capture"
+msgstr ""
+
+#: editor_actions.cc:429
+msgid "Stationary Playhead"
+msgstr ""
+
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
+msgid "Insert Time"
+msgstr ""
+
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
+msgid "Toggle Active"
+msgstr ""
+
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
+msgid "Remove"
+msgstr ""
+
+#: editor_actions.cc:445
+msgid "Fit Selection (Vertical)"
+msgstr ""
+
+#: editor_actions.cc:447 time_axis_view.cc:1291
+msgid "Largest"
+msgstr ""
+
+#: editor_actions.cc:450 time_axis_view.cc:1292
+msgid "Larger"
+msgstr ""
+
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1293
+msgid "Large"
+msgstr ""
+
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1295
+msgid "Small"
+msgstr ""
+
+#: editor_actions.cc:463
+msgid "Sound Selected MIDI Notes"
+msgstr ""
+
+#: editor_actions.cc:468
+msgid "Zoom Focus Left"
+msgstr ""
+
+#: editor_actions.cc:469
+msgid "Zoom Focus Right"
+msgstr ""
+
+#: editor_actions.cc:470
+msgid "Zoom Focus Center"
+msgstr ""
+
+#: editor_actions.cc:471
+msgid "Zoom Focus Playhead"
+msgstr ""
+
+#: editor_actions.cc:472
+msgid "Zoom Focus Mouse"
+msgstr ""
+
+#: editor_actions.cc:473
+msgid "Zoom Focus Edit Point"
+msgstr ""
+
+#: editor_actions.cc:475
+msgid "Next Zoom Focus"
+msgstr ""
+
+#: editor_actions.cc:488
+msgid "Smart Object Mode"
+msgstr ""
+
+#: editor_actions.cc:491
+msgid "Smart"
+msgstr ""
+
+#: editor_actions.cc:494
+msgid "Object Tool"
+msgstr ""
+
+#: editor_actions.cc:499
+msgid "Range Tool"
+msgstr ""
+
+#: editor_actions.cc:504
+msgid "Note Drawing Tool"
+msgstr ""
+
+#: editor_actions.cc:509
+msgid "Audition Tool"
+msgstr ""
+
+#: editor_actions.cc:514
+msgid "Time FX Tool"
+msgstr ""
+
+#: editor_actions.cc:519
+msgid "Content Tool"
+msgstr ""
+
+#: editor_actions.cc:525
+msgid "Cut Tool"
+msgstr ""
+
+#: editor_actions.cc:531
+msgid "Step Mouse Mode"
+msgstr ""
+
+#: editor_actions.cc:538
+msgid "Change Edit Point"
+msgstr ""
+
+#: editor_actions.cc:539
+msgid "Change Edit Point Including Marker"
+msgstr ""
+
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
+msgid "Cycle Edit Mode"
+msgstr ""
+
+#: editor_actions.cc:547
+msgid "Snap to"
+msgstr ""
+
+#: editor_actions.cc:548
+msgid "Snap Mode"
+msgstr ""
+
+#: editor_actions.cc:555
+msgid "Next Snap Mode"
+msgstr ""
+
+#: editor_actions.cc:556
+msgid "Next Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:557
+msgid "Next Musical Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:558
+msgid "Previous Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:559
+msgid "Previous Musical Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:564
+msgid "Snap to CD Frame"
+msgstr ""
+
+#: editor_actions.cc:565
+msgid "Snap to Timecode Frame"
+msgstr ""
+
+#: editor_actions.cc:566
+msgid "Snap to Timecode Seconds"
+msgstr ""
+
+#: editor_actions.cc:567
+msgid "Snap to Timecode Minutes"
+msgstr ""
+
+#: editor_actions.cc:568
+msgid "Snap to Seconds"
+msgstr ""
+
+#: editor_actions.cc:569
+msgid "Snap to Minutes"
+msgstr ""
+
+#: editor_actions.cc:571
+msgid "Snap to One Twenty Eighths"
+msgstr ""
+
+#: editor_actions.cc:572
+msgid "Snap to Sixty Fourths"
+msgstr ""
+
+#: editor_actions.cc:573
+msgid "Snap to Thirty Seconds"
+msgstr ""
+
+#: editor_actions.cc:574
+msgid "Snap to Twenty Eighths"
+msgstr ""
+
+#: editor_actions.cc:575
+msgid "Snap to Twenty Fourths"
+msgstr ""
+
+#: editor_actions.cc:576
+msgid "Snap to Twentieths"
+msgstr ""
+
+#: editor_actions.cc:577
+msgid "Snap to Sixteenths"
+msgstr ""
+
+#: editor_actions.cc:578
+msgid "Snap to Fourteenths"
+msgstr ""
+
+#: editor_actions.cc:579
+msgid "Snap to Twelfths"
+msgstr ""
+
+#: editor_actions.cc:580
+msgid "Snap to Tenths"
+msgstr ""
+
+#: editor_actions.cc:581
+msgid "Snap to Eighths"
+msgstr ""
+
+#: editor_actions.cc:582
+msgid "Snap to Sevenths"
+msgstr ""
+
+#: editor_actions.cc:583
+msgid "Snap to Sixths"
+msgstr ""
+
+#: editor_actions.cc:584
+msgid "Snap to Fifths"
+msgstr ""
+
+#: editor_actions.cc:585
+msgid "Snap to Quarters"
+msgstr ""
+
+#: editor_actions.cc:586
+msgid "Snap to Thirds"
+msgstr ""
+
+#: editor_actions.cc:587
+msgid "Snap to Halves"
+msgstr ""
+
+#: editor_actions.cc:589
+msgid "Snap to Beat"
+msgstr ""
+
+#: editor_actions.cc:590
+msgid "Snap to Bar"
+msgstr ""
+
+#: editor_actions.cc:591
+msgid "Snap to Mark"
+msgstr ""
+
+#: editor_actions.cc:592
+msgid "Snap to Region Start"
+msgstr ""
+
+#: editor_actions.cc:593
+msgid "Snap to Region End"
+msgstr ""
+
+#: editor_actions.cc:594
+msgid "Snap to Region Sync"
+msgstr ""
+
+#: editor_actions.cc:595
+msgid "Snap to Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:597
+msgid "Show Marker Lines"
+msgstr ""
+
+#: editor_actions.cc:607
+msgid "Loop/Punch"
+msgstr ""
+
+#: editor_actions.cc:611
+msgid "Min:Sec"
+msgstr ""
+
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
+msgid "Video Monitor"
+msgstr ""
+
+#: editor_actions.cc:615 rc_option_editor.cc:2844
+msgid "Video"
+msgstr ""
+
+#: editor_actions.cc:618
+msgid "Always on Top"
+msgstr ""
+
+#: editor_actions.cc:620
+msgid "Frame number"
+msgstr ""
+
+#: editor_actions.cc:621
+msgid "Timecode Background"
+msgstr ""
+
+#: editor_actions.cc:622
+msgid "Fullscreen"
+msgstr ""
+
+#: editor_actions.cc:623
+msgid "Letterbox"
+msgstr ""
+
+#: editor_actions.cc:624
+msgid "Original Size"
+msgstr ""
+
+#: editor_actions.cc:681
+msgid "Sort"
+msgstr ""
+
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
+msgid "Show All"
+msgstr ""
+
+#: editor_actions.cc:693
+msgid "Show Automatic Regions"
+msgstr ""
+
+#: editor_actions.cc:695
+msgid "Ascending"
+msgstr ""
+
+#: editor_actions.cc:697
+msgid "Descending"
+msgstr ""
+
+#: editor_actions.cc:700
+msgid "By Region Name"
+msgstr ""
+
+#: editor_actions.cc:702
+msgid "By Region Length"
+msgstr ""
+
+#: editor_actions.cc:704
+msgid "By Region Position"
+msgstr ""
+
+#: editor_actions.cc:706
+msgid "By Region Timestamp"
+msgstr ""
+
+#: editor_actions.cc:708
+msgid "By Region Start in File"
+msgstr ""
+
+#: editor_actions.cc:710
+msgid "By Region End in File"
+msgstr ""
+
+#: editor_actions.cc:712
+msgid "By Source File Name"
+msgstr ""
+
+#: editor_actions.cc:714
+msgid "By Source File Length"
+msgstr ""
+
+#: editor_actions.cc:716
+msgid "By Source File Creation Date"
+msgstr ""
+
+#: editor_actions.cc:718
+msgid "By Source Filesystem"
+msgstr ""
+
+#: editor_actions.cc:721
+msgid "Remove Unused"
+msgstr ""
+
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
+msgid "Import"
+msgstr ""
+
+#: editor_actions.cc:731
+msgid "Import to Region List..."
+msgstr ""
+
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
+msgstr ""
+
+#: editor_actions.cc:738
+msgid "Bring all media into session folder"
+msgstr ""
+
+#: editor_actions.cc:741
+msgid "Show Summary"
+msgstr ""
+
+#: editor_actions.cc:743
+msgid "Show Group Tabs"
+msgstr ""
+
+#: editor_actions.cc:745
+msgid "Show Measure Lines"
+msgstr ""
+
+#: editor_actions.cc:747
+msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
+msgstr ""
+
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1714
+msgid "programming error: %1: %2"
+msgstr ""
+
+#: editor_actions.cc:1791
+msgid "Raise"
+msgstr ""
+
+#: editor_actions.cc:1794
+msgid "Raise to Top"
+msgstr ""
+
+#: editor_actions.cc:1797
+msgid "Lower"
+msgstr ""
+
+#: editor_actions.cc:1800
+msgid "Lower to Bottom"
+msgstr ""
+
+#: editor_actions.cc:1803
+msgid "Move to Original Position"
+msgstr ""
+
+#: editor_actions.cc:1808
+msgid "Lock to Video"
+msgstr ""
+
+#: editor_actions.cc:1813 editor_markers.cc:917
+msgid "Glue to Bars and Beats"
+msgstr ""
+
+#: editor_actions.cc:1818
+msgid "Remove Sync"
+msgstr ""
+
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
+msgid "Mute"
+msgstr ""
+
+#: editor_actions.cc:1824
+msgid "Normalize..."
+msgstr ""
+
+#: editor_actions.cc:1827
+msgid "Reverse"
+msgstr ""
+
+#: editor_actions.cc:1830
+msgid "Make Mono Regions"
+msgstr ""
+
+#: editor_actions.cc:1833
+msgid "Boost Gain"
+msgstr ""
+
+#: editor_actions.cc:1836
+msgid "Cut Gain"
+msgstr ""
+
+#: editor_actions.cc:1839
+msgid "Pitch Shift..."
+msgstr ""
+
+#: editor_actions.cc:1845
+msgid "Opaque"
+msgstr ""
+
+#: editor_actions.cc:1849 editor_regions.cc:164
+msgid "Fade In"
+msgstr ""
+
+#: editor_actions.cc:1854 editor_regions.cc:165
+msgid "Fade Out"
+msgstr ""
+
+#: editor_actions.cc:1869
+msgid "Multi-Duplicate..."
+msgstr ""
+
+#: editor_actions.cc:1874
+msgid "Fill Track"
+msgstr ""
+
+#: editor_actions.cc:1878 editor_markers.cc:1033
+msgid "Set Loop Range"
+msgstr ""
+
+#: editor_actions.cc:1885
+msgid "Set Punch"
+msgstr ""
+
+#: editor_actions.cc:1889
+msgid "Add Single Range Marker"
+msgstr ""
+
+#: editor_actions.cc:1894
+msgid "Add Range Marker Per Region"
+msgstr ""
+
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
+msgstr ""
+
+#: editor_actions.cc:1901
+msgid "Close Gaps"
+msgstr ""
+
+#: editor_actions.cc:1904
+msgid "Rhythm Ferret..."
+msgstr ""
+
+#: editor_actions.cc:1907
+msgid "Export..."
+msgstr ""
+
+#: editor_actions.cc:1913
+msgid "Separate Under"
+msgstr ""
+
+#: editor_actions.cc:1917 editor_actions.cc:1918
+msgid "Set Fade In Length"
+msgstr ""
+
+#: editor_actions.cc:1919 editor_actions.cc:1920
+msgid "Set Fade Out Length"
+msgstr ""
+
+#: editor_actions.cc:1922
+msgid "Set Tempo from Region = Bar"
+msgstr ""
+
+#: editor_actions.cc:1927
+msgid "Split at Percussion Onsets"
+msgstr ""
+
+#: editor_actions.cc:1932
+msgid "List Editor..."
+msgstr ""
+
+#: editor_actions.cc:1935
+msgid "Properties..."
+msgstr ""
+
+#: editor_actions.cc:1939
+msgid "Bounce (with processing)"
+msgstr ""
+
+#: editor_actions.cc:1940
+msgid "Bounce (without processing)"
+msgstr ""
+
+#: editor_actions.cc:1941
+msgid "Combine"
+msgstr ""
+
+#: editor_actions.cc:1942
+msgid "Uncombine"
+msgstr ""
+
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
+msgid "Spectral Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1947
+msgid "Reset Envelope"
+msgstr ""
+
+#: editor_actions.cc:1949
+msgid "Reset Gain"
+msgstr ""
+
+#: editor_actions.cc:1954
+msgid "Envelope Active"
+msgstr ""
+
+#: editor_actions.cc:1962 editor_actions.cc:1963
+msgid "Insert Patch Change..."
+msgstr ""
+
+#: editor_actions.cc:1964
+msgid "Unlink from other copies"
+msgstr ""
+
+#: editor_actions.cc:1965
+msgid "Strip Silence..."
+msgstr ""
+
+#: editor_actions.cc:1966
+msgid "Set Range Selection"
+msgstr ""
+
+#: editor_actions.cc:1968 editor_actions.cc:1969
+msgid "Nudge Later"
+msgstr ""
+
+#: editor_actions.cc:1970 editor_actions.cc:1971
+msgid "Nudge Earlier"
+msgstr ""
+
+#: editor_actions.cc:1973
+msgid "Sequence Regions"
+msgstr ""
+
+#: editor_actions.cc:1978
+msgid "Nudge Later by Capture Offset"
+msgstr ""
+
+#: editor_actions.cc:1985
+msgid "Nudge Earlier by Capture Offset"
+msgstr ""
+
+#: editor_actions.cc:1989
+msgid "Trim to Loop"
+msgstr ""
+
+#: editor_actions.cc:1990
+msgid "Trim to Punch"
+msgstr ""
+
+#: editor_actions.cc:1992
+msgid "Trim to Previous"
+msgstr ""
+
+#: editor_actions.cc:1993
+msgid "Trim to Next"
+msgstr ""
+
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
+
+#: editor_actions.cc:2006
+msgid "Set Sync Position"
+msgstr ""
+
+#: editor_actions.cc:2007
+msgid "Place Transient"
+msgstr ""
+
+#: editor_actions.cc:2008
+msgid "Split/Separate"
+msgstr ""
+
+#: editor_actions.cc:2009
+msgid "Trim Start at Edit Point"
+msgstr ""
+
+#: editor_actions.cc:2010
+msgid "Trim End at Edit Point"
+msgstr ""
+
+#: editor_actions.cc:2015
+msgid "Align Start"
+msgstr ""
+
+#: editor_actions.cc:2022
+msgid "Align Start Relative"
+msgstr ""
+
+#: editor_actions.cc:2026
+msgid "Align End"
+msgstr ""
+
+#: editor_actions.cc:2031
+msgid "Align End Relative"
+msgstr ""
+
+#: editor_actions.cc:2038
+msgid "Align Sync"
+msgstr ""
+
+#: editor_actions.cc:2045
+msgid "Align Sync Relative"
+msgstr ""
+
+#: editor_actions.cc:2049 editor_actions.cc:2050
+msgid "Choose Top..."
+msgstr ""
+
+#: editor_audio_import.cc:77 editor_audio_import.cc:99
+msgid "You can't import or embed an audiofile until you have a session loaded."
+msgstr ""
+
+#: editor_audio_import.cc:83 editor_audio_import.cc:127
+msgid "Add Existing Media"
+msgstr ""
+
+#: editor_audio_import.cc:175
+msgid ""
+"The session already contains a source file named %1. Do you want to import "
+"%1 as a new file, or skip it?"
+msgstr ""
+
+#: editor_audio_import.cc:177
+msgid ""
+"The session already contains a source file named %1. Do you want to import "
+"%2 as a new source, or skip it?"
+msgstr ""
+
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
+msgid "Cancel Import"
+msgstr ""
+
+#: editor_audio_import.cc:565
+msgid "Editor: cannot open file \"%1\", (%2)"
+msgstr ""
+
+#: editor_audio_import.cc:573
+msgid "Cancel entire import"
+msgstr ""
+
+#: editor_audio_import.cc:574
+msgid "Don't embed it"
+msgstr ""
+
+#: editor_audio_import.cc:575
+msgid "Embed all without questions"
+msgstr ""
+
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
+msgid "Sample rate"
+msgstr ""
+
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
+msgid ""
+"%1\n"
+"This audiofile's sample rate doesn't match the session sample rate!"
+msgstr ""
+
+#: editor_audio_import.cc:601
+msgid "Embed it anyway"
+msgstr ""
+
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
+msgid "Could not create new track after region placed in the drop zone"
+msgstr ""
+
+#: editor_drag.cc:1306
+msgid "fixed time region drag"
+msgstr ""
+
+#: editor_drag.cc:2249
+msgid "Ripple drag"
+msgstr ""
+
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
+msgid "resize notes"
+msgstr ""
+
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
+msgid "Video Start:"
+msgstr ""
+
+#: editor_drag.cc:2685
+msgid "Diff:"
+msgstr ""
+
+#: editor_drag.cc:2707
+msgid "Move Video"
+msgstr ""
+
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr ""
+
+#: editor_drag.cc:3178
+msgid "copy meter mark"
+msgstr ""
+
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr ""
+
+#: editor_drag.cc:3323
+msgid "move tempo mark"
+msgstr ""
+
+#: editor_drag.cc:3330
+msgid "copy tempo mark"
+msgstr ""
+
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3735
+msgid "change fade in length"
+msgstr ""
+
+#: editor_drag.cc:3860
+msgid "change fade out length"
+msgstr ""
+
+#: editor_drag.cc:4238
+msgid "move marker"
+msgstr ""
+
+#: editor_drag.cc:4505 editor_drag.cc:5832
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4889
+msgid "An error occurred while executing time stretch operation"
+msgstr ""
+
+#: editor_drag.cc:5350
+msgid "programming_error: %1"
+msgstr ""
+
+#: editor_drag.cc:5419 editor_drag.cc:5429
+msgid "new skip marker"
+msgstr ""
+
+#: editor_drag.cc:5420
+msgid "skip"
+msgstr ""
+
+#: editor_drag.cc:5424 location_ui.cc:60
+msgid "CD"
+msgstr ""
+
+#: editor_drag.cc:5425
+msgid "new CD marker"
+msgstr ""
+
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
+msgid "unnamed"
+msgstr ""
+
+#: editor_drag.cc:5739
+msgid "Automation range drag created for invalid region type"
+msgstr ""
+
+#: editor_route_groups.cc:97
+msgid "Col"
+msgstr ""
+
+#: editor_route_groups.cc:97
+msgid "Group Tab Color"
+msgstr ""
+
+#: editor_route_groups.cc:98
+msgid "Name of Group"
+msgstr ""
+
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr ""
+
+#: editor_route_groups.cc:99
+msgid "Group is visible?"
+msgstr ""
+
+#: editor_route_groups.cc:100
+msgid "On"
+msgstr ""
+
+#: editor_route_groups.cc:100
+msgid "Group is enabled?"
+msgstr ""
+
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr ""
+
+#: editor_route_groups.cc:101
+msgid "Sharing Gain?"
+msgstr ""
+
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr ""
+
+#: editor_route_groups.cc:102
+msgid "Relative Gain Changes?"
+msgstr ""
+
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
+msgid "Mute|M"
+msgstr ""
+
+#: editor_route_groups.cc:103
+msgid "Sharing Mute?"
+msgstr ""
+
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr ""
+
+#: editor_route_groups.cc:104
+msgid "Sharing Solo?"
+msgstr ""
+
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
+msgid "Rec"
+msgstr ""
+
+#: editor_route_groups.cc:105
+msgid "Sharing Record-enable Status?"
+msgstr ""
+
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr ""
+
+#: editor_route_groups.cc:106
+msgid "Sharing Monitoring Choice?"
+msgstr ""
+
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr ""
+
+#: editor_route_groups.cc:107
+msgid "Sharing Selected/Editing Status?"
+msgstr ""
+
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr ""
+
+#: editor_route_groups.cc:108
+msgid "Sharing Active Status?"
+msgstr ""
+
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
+msgid "programming error: marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr ""
+
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr ""
+
+#: editor_group_tabs.cc:176
+msgid "Fit to Window"
+msgstr ""
+
+#: editor_markers.cc:139
+msgid "start"
+msgstr ""
+
+#: editor_markers.cc:140
+msgid "end"
+msgstr ""
+
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
+msgid "add marker"
+msgstr ""
+
+#: editor_markers.cc:682 editor_markers.cc:1558
+msgid "set loop range"
+msgstr ""
+
+#: editor_markers.cc:698 editor_markers.cc:1564
+msgid "set punch range"
+msgstr ""
+
+#: editor_markers.cc:715 editor_ops.cc:4159
+msgid "range"
+msgstr ""
+
+#: editor_markers.cc:718
+msgid "new range marker"
+msgstr ""
+
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
+msgid "remove marker"
+msgstr ""
+
+#: editor_markers.cc:899
+msgid "Locate to Here"
+msgstr ""
+
+#: editor_markers.cc:900
+msgid "Play from Here"
+msgstr ""
+
+#: editor_markers.cc:901
+msgid "Move Mark to Playhead"
+msgstr ""
+
+#: editor_markers.cc:905
+msgid "Create Range to Next Marker"
+msgstr ""
+
+#: editor_markers.cc:946
+msgid "Locate to Marker"
+msgstr ""
+
+#: editor_markers.cc:947
+msgid "Play from Marker"
+msgstr ""
+
+#: editor_markers.cc:950
+msgid "Set Marker from Playhead"
+msgstr ""
+
+#: editor_markers.cc:951
+msgid "Set Range from Selection"
+msgstr ""
+
+#: editor_markers.cc:960
+msgid "Hide Range"
+msgstr ""
+
+#: editor_markers.cc:961
+msgid "Rename Range..."
+msgstr ""
+
+#: editor_markers.cc:965
+msgid "Remove Range"
+msgstr ""
+
+#: editor_markers.cc:972
+msgid "Separate Regions in Range"
+msgstr ""
+
+#: editor_markers.cc:974
+msgid "Select Range"
+msgstr ""
+
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
+msgid "Set Punch Range"
+msgstr ""
+
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
+msgid "New Name:"
+msgstr ""
+
+#: editor_markers.cc:1512
+msgid "Rename Mark"
+msgstr ""
+
+#: editor_markers.cc:1514
+msgid "Rename Range"
+msgstr ""
+
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1641
+#: vca_master_strip.cc:395
+msgid "Rename"
+msgstr ""
+
+#: editor_markers.cc:1534
+msgid "rename marker"
+msgstr ""
+
+#: editor_mixer.cc:98
+msgid "This screen is not tall enough to display the editor mixer"
+msgstr ""
+
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
+msgid ""
+"programming error: tempo marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
+msgid "programming error: marker for tempo is not a tempo marker!"
+msgstr ""
+
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
+msgid "programming error: marker for meter is not a meter marker!"
+msgstr ""
+
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
+msgid ""
+"programming error: control point canvas item has no control point object "
+"pointer!"
+msgstr ""
+
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
+msgid "start point trim"
+msgstr ""
+
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
+
+#: editor_mouse.cc:2270
+msgid "Name for region:"
+msgstr ""
+
+#: editor_ops.cc:168
+msgid "split"
+msgstr ""
+
+#: editor_ops.cc:342
+msgid "alter selection"
+msgstr ""
+
+#: editor_ops.cc:384
+msgid "nudge regions forward"
+msgstr ""
+
+#: editor_ops.cc:441 editor_ops.cc:535
+msgid "nudge location forward"
+msgstr ""
+
+#: editor_ops.cc:472
+msgid "nudge regions backward"
+msgstr ""
+
+#: editor_ops.cc:567
+msgid "nudge forward"
+msgstr ""
+
+#: editor_ops.cc:591
+msgid "nudge backward"
+msgstr ""
+
+#: editor_ops.cc:656
+msgid "sequence regions"
+msgstr ""
+
+#: editor_ops.cc:718
+msgid "build_region_boundary_cache called with snap_type = %1"
+msgstr ""
+
+#: editor_ops.cc:2121
+msgid "New Location Marker"
+msgstr ""
+
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
+msgid "add markers"
+msgstr ""
+
+#: editor_ops.cc:2400
+msgid "clear markers"
+msgstr ""
+
+#: editor_ops.cc:2415
+msgid "clear ranges"
+msgstr ""
+
+#: editor_ops.cc:2431
+msgid "clear locations"
+msgstr ""
+
+#: editor_ops.cc:2494
+msgid "insert region"
+msgstr ""
+
+#: editor_ops.cc:2685
+msgid "raise regions"
+msgstr ""
+
+#: editor_ops.cc:2687
+msgid "raise region"
+msgstr ""
+
+#: editor_ops.cc:2693
+msgid "raise regions to top"
+msgstr ""
+
+#: editor_ops.cc:2695
+msgid "raise region to top"
+msgstr ""
+
+#: editor_ops.cc:2701
+msgid "lower regions"
+msgstr ""
+
+#: editor_ops.cc:2703 editor_ops.cc:2711
+msgid "lower region"
+msgstr ""
+
+#: editor_ops.cc:2709
+msgid "lower regions to bottom"
+msgstr ""
+
+#: editor_ops.cc:2794
+msgid "Rename Region"
+msgstr ""
+
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1639
+msgid "New name:"
+msgstr ""
+
+#: editor_ops.cc:3097
+msgid "separate"
+msgstr ""
+
+#: editor_ops.cc:3207
+msgid "separate region under"
+msgstr ""
+
+#: editor_ops.cc:3360
+msgid "trim to selection"
+msgstr ""
+
+#: editor_ops.cc:3442
+msgid "set sync point"
+msgstr ""
+
+#: editor_ops.cc:3466
+msgid "remove region sync"
+msgstr ""
+
+#: editor_ops.cc:3488
+msgid "move regions to original position"
+msgstr ""
+
+#: editor_ops.cc:3490
+msgid "move region to original position"
+msgstr ""
+
+#: editor_ops.cc:3511
+msgid "align selection"
+msgstr ""
+
+#: editor_ops.cc:3585
+msgid "align selection (relative)"
+msgstr ""
+
+#: editor_ops.cc:3619
+msgid "align region"
+msgstr ""
+
+#: editor_ops.cc:3670
+msgid "trim front"
+msgstr ""
+
+#: editor_ops.cc:3670
+msgid "trim back"
+msgstr ""
+
+#: editor_ops.cc:3700
+msgid "trim to loop"
+msgstr ""
+
+#: editor_ops.cc:3710
+msgid "trim to punch"
+msgstr ""
+
+#: editor_ops.cc:3832
+msgid "trim to region"
+msgstr ""
+
+#: editor_ops.cc:3891
+msgid ""
+"This track/bus cannot be frozen because the signal adds or loses channels "
+"before reaching the outputs.\n"
+"This is typically caused by plugins that generate stereo output from mono "
+"input or vice versa."
+msgstr ""
+
+#: editor_ops.cc:3894
+msgid "Cannot freeze"
+msgstr ""
+
+#: editor_ops.cc:3900
+msgid ""
+"<b>%1</b>\n"
+"\n"
+"This track has at least one send/insert/return as part of its signal flow.\n"
+"\n"
+"Freezing will only process the signal as far as the first send/insert/return."
+msgstr ""
+
+#: editor_ops.cc:3904
+msgid "Freeze anyway"
+msgstr ""
+
+#: editor_ops.cc:3905
+msgid "Don't freeze"
+msgstr ""
+
+#: editor_ops.cc:3906
+msgid "Freeze Limits"
+msgstr ""
+
+#: editor_ops.cc:3921
+msgid "Cancel Freeze"
+msgstr ""
+
+#: editor_ops.cc:3952
+msgid ""
+"You can't perform this operation because the processing of the signal will "
+"cause one or more of the tracks to end up with a region with more channels "
+"than this track has inputs.\n"
+"\n"
+"You can do this without processing, which is a different operation."
+msgstr ""
+
+#: editor_ops.cc:3956
+msgid "Cannot bounce"
+msgstr ""
+
+#: editor_ops.cc:4007
+msgid "bounce range"
+msgstr ""
+
+#: editor_ops.cc:4074
+msgid "delete"
+msgstr ""
+
+#: editor_ops.cc:4077
+msgid "cut"
+msgstr ""
+
+#: editor_ops.cc:4080
+msgid "copy"
+msgstr ""
+
+#: editor_ops.cc:4083
+msgid "clear"
+msgstr ""
+
+#: editor_ops.cc:4132
+msgid "objects"
+msgstr ""
+
+#: editor_ops.cc:4364 editor_ops.cc:4449
+msgid "remove region"
+msgstr ""
+
+#: editor_ops.cc:4866
+msgid "duplicate range selection"
+msgstr ""
+
+#: editor_ops.cc:4960
+msgid "nudge track"
+msgstr ""
+
+#: editor_ops.cc:4987
+msgid ""
+"Do you really want to destroy the last capture?\n"
+"(This is destructive and cannot be undone)"
+msgstr ""
+
+#: editor_ops.cc:4990 editor_ops.cc:7224 editor_regions.cc:503
+#: editor_snapshots.cc:171
+msgid "No, do nothing."
+msgstr ""
+
+#: editor_ops.cc:4991
+msgid "Yes, destroy it."
+msgstr ""
+
+#: editor_ops.cc:4993
+msgid "Destroy last capture"
+msgstr ""
+
+#: editor_ops.cc:5069
+msgid "normalize"
+msgstr ""
+
+#: editor_ops.cc:5167
+msgid "reverse regions"
+msgstr ""
+
+#: editor_ops.cc:5204
+msgid "strip silence"
+msgstr ""
+
+#: editor_ops.cc:5285
+msgid "Fork Region(s)"
+msgstr ""
+
+#: editor_ops.cc:5292
+msgid "Could not unlink %1"
+msgstr ""
+
+#: editor_ops.cc:5554
+msgid "reset region gain"
+msgstr ""
+
+#: editor_ops.cc:5612
+msgid "region gain envelope active"
+msgstr ""
+
+#: editor_ops.cc:5637
+msgid "toggle region lock"
+msgstr ""
+
+#: editor_ops.cc:5661
+msgid "Toggle Video Lock"
+msgstr ""
+
+#: editor_ops.cc:5685
+msgid "region lock style"
+msgstr ""
+
+#: editor_ops.cc:5710
+msgid "change region opacity"
+msgstr ""
+
+#: editor_ops.cc:5803
+msgid "fade range"
+msgstr ""
+
+#: editor_ops.cc:5841
+msgid "set fade in length"
+msgstr ""
+
+#: editor_ops.cc:5848
+msgid "set fade out length"
+msgstr ""
+
+#: editor_ops.cc:5913
+msgid "set fade in shape"
+msgstr ""
+
+#: editor_ops.cc:5948
+msgid "set fade out shape"
+msgstr ""
+
+#: editor_ops.cc:5984
+msgid "set fade in active"
+msgstr ""
+
+#: editor_ops.cc:6018
+msgid "set fade out active"
+msgstr ""
+
+#: editor_ops.cc:6078
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6271
+msgid "set loop range from selection"
+msgstr ""
+
+#: editor_ops.cc:6285
+msgid "set loop range from region"
+msgstr ""
+
+#: editor_ops.cc:6304
+msgid "set punch range from selection"
+msgstr ""
+
+#: editor_ops.cc:6328
+msgid "set session start/end from selection"
+msgstr ""
+
+#: editor_ops.cc:6366
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6394
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6427
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6455
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6466
+msgid "set punch range from region"
+msgstr ""
+
+#: editor_ops.cc:6553
+msgid "Add new marker"
+msgstr ""
+
+#: editor_ops.cc:6554
+msgid "Set global tempo"
+msgstr ""
+
+#: editor_ops.cc:6557
+msgid "Define one bar"
+msgstr ""
+
+#: editor_ops.cc:6558
+msgid "Do you want to set the global tempo or add a new tempo marker?"
+msgstr ""
+
+#: editor_ops.cc:6584
+msgid "set tempo from region"
+msgstr ""
+
+#: editor_ops.cc:6613
+msgid "split regions"
+msgstr ""
+
+#: editor_ops.cc:6655
+msgid ""
+"You are about to split\n"
+"%1\n"
+"into %2 pieces.\n"
+"This could take a long time."
+msgstr ""
+
+#: editor_ops.cc:6662
+msgid "Call for the Ferret!"
+msgstr ""
+
+#: editor_ops.cc:6663
+msgid ""
+"Press OK to continue with this split operation\n"
+"or ask the Ferret dialog to tune the analysis"
+msgstr ""
+
+#: editor_ops.cc:6665
+msgid "Press OK to continue with this split operation"
+msgstr ""
+
+#: editor_ops.cc:6668
+msgid "Excessive split?"
+msgstr ""
+
+#: editor_ops.cc:6822
+msgid "place transient"
+msgstr ""
+
+#: editor_ops.cc:6856
+msgid "snap regions to grid"
+msgstr ""
+
+#: editor_ops.cc:6895
+msgid "Close Region Gaps"
+msgstr ""
+
+#: editor_ops.cc:6900
+msgid "Crossfade length"
+msgstr ""
+
+#: editor_ops.cc:6909 editor_ops.cc:6920 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
+msgid "ms"
+msgstr ""
+
+#: editor_ops.cc:6911
+msgid "Pull-back length"
+msgstr ""
+
+#: editor_ops.cc:6924 keyeditor.cc:71
+msgid "Ok"
+msgstr ""
+
+#: editor_ops.cc:6939
+msgid "close region gaps"
+msgstr ""
+
+#: editor_ops.cc:7182
+msgid "That would be bad news ...."
+msgstr ""
+
+#: editor_ops.cc:7187
+msgid ""
+"Removing the master or monitor bus is such a bad idea\n"
+"that %1 is not going to allow it.\n"
+"\n"
+"If you really want to do this sort of thing\n"
+"edit your ardour.rc file to set the\n"
+"\"allow-special-bus-removal\" option to be \"yes\""
+msgstr ""
+
+#: editor_ops.cc:7203
+msgid "track"
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: editor_ops.cc:7204
+msgid "bus"
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: editor_ops.cc:7208
+msgid ""
+"Do you really want to remove %1 %2 and %3 %4?\n"
+"(You may also lose the playlists associated with the %2)\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten!"
+msgstr ""
+
+#: editor_ops.cc:7213
+msgid ""
+"Do you really want to remove %1 %2?\n"
+"(You may also lose the playlists associated with the %2)\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten!"
+msgstr ""
+
+#: editor_ops.cc:7219
+msgid ""
+"Do you really want to remove %1 %2?\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten"
+msgstr ""
+
+#: editor_ops.cc:7226
+msgid "Yes, remove them."
+msgstr ""
+
+#: editor_ops.cc:7228 editor_snapshots.cc:172
+msgid "Yes, remove it."
+msgstr ""
+
+#: editor_ops.cc:7233 editor_ops.cc:7235
+msgid "Remove %1"
+msgstr ""
+
+#: editor_ops.cc:7341 editor_ops.cc:7355 editor_ops.cc:7395 editor_ops.cc:7405
+msgid "insert time"
+msgstr ""
+
+#: editor_ops.cc:7458
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7478 editor_ops.cc:7490 editor_ops.cc:7563 editor_ops.cc:7576
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7650
+msgid "There are too many tracks to fit in the current window"
+msgstr ""
+
+#: editor_ops.cc:7711
+msgid "Sel"
+msgstr ""
+
+#: editor_ops.cc:7750
+#, c-format
+msgid "Saved view %u"
+msgstr ""
+
+#: editor_ops.cc:7775
+msgid "mute regions"
+msgstr ""
+
+#: editor_ops.cc:7777
+msgid "mute region"
+msgstr ""
+
+#: editor_ops.cc:7814
+msgid "combine regions"
+msgstr ""
+
+#: editor_ops.cc:7852
+msgid "uncombine regions"
+msgstr ""
+
+#: editor_ops.cc:7889
+msgid "%1: Locked"
+msgstr ""
+
+#: editor_ops.cc:7896
+msgid "Click to unlock"
+msgstr ""
+
+#: editor_ops.cc:7945
+msgid "Moving embedded files into session folder"
+msgstr ""
+
+#: editor_regions.cc:159
+msgid "Region name, with number of channels in []'s"
+msgstr ""
+
+#: editor_regions.cc:160
+msgid "Position of start of region"
+msgstr ""
+
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
+msgid "End"
+msgstr ""
+
+#: editor_regions.cc:161
+msgid "Position of end of region"
+msgstr ""
+
+#: editor_regions.cc:162
+msgid "Length of the region"
+msgstr ""
+
+#: editor_regions.cc:163
+msgid "Position of region sync point, relative to start of the region"
+msgstr ""
+
+#: editor_regions.cc:164
+msgid "Length of region fade-in (units: secondary clock), () if disabled"
+msgstr ""
+
+#: editor_regions.cc:165
+msgid "Length of region fade-out (units: secondary clock), () if disabled"
+msgstr ""
+
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
+
+#: editor_regions.cc:166
+msgid "Region position locked?"
+msgstr ""
+
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr ""
+
+#: editor_regions.cc:167
+msgid "Region position glued to Bars|Beats time?"
+msgstr ""
+
+#: editor_regions.cc:168
+msgid "Region muted?"
+msgstr ""
+
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
+
+#: editor_regions.cc:169
+msgid "Region opaque (blocks regions below it from being heard)?"
+msgstr ""
+
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
+msgid "Hidden"
+msgstr ""
+
+#: editor_regions.cc:432
+msgid "(MISSING) "
+msgstr ""
+
+#: editor_regions.cc:500
+msgid ""
+"Do you really want to remove unused regions?\n"
+"(This is destructive and cannot be undone)"
+msgstr ""
+
+#: editor_regions.cc:504
+msgid "Yes, remove."
+msgstr ""
+
+#: editor_regions.cc:506
+msgid "Remove unused regions"
+msgstr ""
+
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
+msgid "Mult."
+msgstr ""
+
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
+msgid "Start"
+msgstr ""
+
+#: editor_regions.cc:951 editor_regions.cc:967
+msgid "Multiple"
+msgstr ""
+
+#: editor_regions.cc:1036
+msgid "MISSING "
+msgstr ""
+
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
+msgid "SS"
+msgstr ""
+
+#: editor_routes.cc:233
+msgid "Track/Bus Name"
+msgstr ""
+
+#: editor_routes.cc:234
+msgid "Track/Bus visible ?"
+msgstr ""
+
+#: editor_routes.cc:235
+msgid "Track/Bus active ?"
+msgstr ""
+
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
+
+#: editor_routes.cc:236
+msgid "MIDI input enabled"
+msgstr ""
+
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
+
+#: editor_routes.cc:237
+msgid "Record enabled"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
+msgstr ""
+
+#: editor_routes.cc:240
+msgid "Soloed"
+msgstr ""
+
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
+
+#: editor_routes.cc:241
+msgid "Solo Isolated"
+msgstr ""
+
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
+msgid "Solo Safe (Locked)"
+msgstr ""
+
+#: editor_routes.cc:550 mixer_ui.cc:1498
+msgid "Hide All"
+msgstr ""
+
+#: editor_routes.cc:551 mixer_ui.cc:1499
+msgid "Show All Audio Tracks"
+msgstr ""
+
+#: editor_routes.cc:552 mixer_ui.cc:1500
+msgid "Hide All Audio Tracks"
+msgstr ""
+
+#: editor_routes.cc:553 mixer_ui.cc:1501
+msgid "Show All Audio Busses"
+msgstr ""
+
+#: editor_routes.cc:554 mixer_ui.cc:1502
+msgid "Hide All Audio Busses"
+msgstr ""
+
+#: editor_routes.cc:555 mixer_ui.cc:1503
+msgid "Show All Midi Tracks"
+msgstr ""
+
+#: editor_routes.cc:556 mixer_ui.cc:1504
+msgid "Hide All Midi Tracks"
+msgstr ""
+
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
+
+#: editor_rulers.cc:212
+msgid "New location marker"
+msgstr ""
+
+#: editor_rulers.cc:213
+msgid "Clear all locations"
+msgstr ""
+
+#: editor_rulers.cc:214
+msgid "Unhide locations"
+msgstr ""
+
+#: editor_rulers.cc:218
+msgid "New range"
+msgstr ""
+
+#: editor_rulers.cc:219
+msgid "Clear all ranges"
+msgstr ""
+
+#: editor_rulers.cc:220
+msgid "Unhide ranges"
+msgstr ""
+
+#: editor_rulers.cc:224
+msgid "New Loop range"
+msgstr ""
+
+#: editor_rulers.cc:225
+msgid "New Punch range"
+msgstr ""
+
+#: editor_rulers.cc:230
+msgid "New CD track marker"
+msgstr ""
+
+#: editor_rulers.cc:234 tempo_dialog.cc:38
+msgid "New Tempo"
+msgstr ""
+
+#: editor_rulers.cc:238 tempo_dialog.cc:419
+msgid "New Meter"
+msgstr ""
+
+#: editor_snapshots.cc:149
+msgid "Rename Snapshot"
+msgstr ""
+
+#: editor_snapshots.cc:151
+msgid "New name of snapshot"
+msgstr ""
+
+#: editor_snapshots.cc:169
+msgid ""
+"Do you really want to remove snapshot \"%1\" ?\n"
+"(which cannot be undone)"
+msgstr ""
+
+#: editor_snapshots.cc:174
+msgid "Remove snapshot"
+msgstr ""
+
+#: editor_tempodisplay.cc:318
+msgid "add tempo mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr ""
+
+#: editor_tempodisplay.cc:362
+msgid "add meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
+msgid "done"
+msgstr ""
+
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
+msgid "replace tempo mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
+msgid "remove tempo mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:502
+msgid ""
+"programming error: meter marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: editor_timefx.cc:68
+msgid "stretch/shrink"
+msgstr ""
+
+#: editor_timefx.cc:130
+msgid "pitch shift"
+msgstr ""
+
+#: editor_timefx.cc:282
+msgid "timefx cannot be started - thread creation error"
+msgstr ""
+
+#: engine_dialog.cc:86
+msgid "Device Control Panel"
+msgstr ""
+
+#: engine_dialog.cc:87
+msgid "Midi Device Setup"
+msgstr ""
+
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
+msgid "Measure"
+msgstr ""
+
+#: engine_dialog.cc:92
+msgid "Use results"
+msgstr ""
+
+#: engine_dialog.cc:93
+msgid "Back to settings ... (ignore results)"
+msgstr ""
+
+#: engine_dialog.cc:94
+msgid "Calibrate Audio"
+msgstr ""
+
+#: engine_dialog.cc:98
+msgid "Back to settings"
+msgstr ""
+
+#: engine_dialog.cc:120
+msgid ""
+"No audio/MIDI backends detected. %1 cannot run\n"
+"\n"
+"(This is a build/packaging/system error. It should never happen.)"
+msgstr ""
+
+#: engine_dialog.cc:145
+msgid "Latency Measurement Tool"
+msgstr ""
+
+#: engine_dialog.cc:157
+msgid ""
+"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
+"low level.</span>"
+msgstr ""
+
+#: engine_dialog.cc:166
+msgid "Select two channels below and connect them using a cable."
+msgstr ""
+
+#: engine_dialog.cc:171
+msgid "Output channel"
+msgstr ""
+
+#: engine_dialog.cc:179
+msgid "Input channel"
+msgstr ""
+
+#: engine_dialog.cc:213
+msgid "Once the channels are connected, click the \"Measure\" button."
+msgstr ""
+
+#: engine_dialog.cc:220
+msgid "When satisfied with the results, click the \"Use results\" button."
+msgstr ""
+
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
+msgid "No measurement results yet"
+msgstr ""
+
+#: engine_dialog.cc:245 route_params_ui.cc:106
+msgid "Latency"
+msgstr ""
+
+#: engine_dialog.cc:520
+msgid "Audio System:"
+msgstr ""
+
+#: engine_dialog.cc:564
+msgid "Driver:"
+msgstr ""
+
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
+msgid "Device:"
+msgstr ""
+
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
+msgid "Sample rate:"
+msgstr ""
+
+#: engine_dialog.cc:597 engine_dialog.cc:706
+msgid "Buffer size:"
+msgstr ""
+
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
+msgid "Input Channels:"
+msgstr ""
+
+#: engine_dialog.cc:637
+msgid "Output Channels:"
+msgstr ""
+
+#: engine_dialog.cc:649
+msgid "Hardware input latency:"
+msgstr ""
+
+#: engine_dialog.cc:652 engine_dialog.cc:665
+msgid "samples"
+msgstr ""
+
+#: engine_dialog.cc:662
+msgid "Hardware output latency:"
+msgstr ""
+
+#: engine_dialog.cc:673
+msgid "MIDI System:"
+msgstr ""
+
+#: engine_dialog.cc:691
+msgid ""
+"%1 is already running. %2 will connect to it and use the existing settings."
+msgstr ""
+
+#: engine_dialog.cc:744
+msgid ""
+"Failed to start or connect to audio-engine.\n"
+"\n"
+"Latency calibration requires a working audio interface."
+msgstr ""
+
+#: engine_dialog.cc:750
+msgid ""
+"Your selected audio configuration is playback- or capture-only.\n"
+"\n"
+"Latency calibration requires playback and capture"
+msgstr ""
+
+#: engine_dialog.cc:965
+msgid "MIDI Devices"
+msgstr ""
+
+#: engine_dialog.cc:971
+msgid "Device"
+msgstr ""
+
+#: engine_dialog.cc:973
+msgid "Hardware Latencies"
+msgstr ""
+
+#: engine_dialog.cc:1014
+msgid "Calibrate"
+msgstr ""
+
+#: engine_dialog.cc:1117
+msgid "all available channels"
+msgstr ""
+
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] ""
+msgstr[1] ""
+
+#: engine_dialog.cc:1662
+#, c-format
+msgid "(%.1f ms)"
+msgstr ""
+
+#: engine_dialog.cc:2413
+msgid "Could not start backend engine %1"
+msgstr ""
+
+#: engine_dialog.cc:2445
+msgid "Cannot set driver to %1"
+msgstr ""
+
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
+msgid "Cannot set device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2464
+msgid "Cannot set sample rate to %1"
+msgstr ""
+
+#: engine_dialog.cc:2468
+msgid "Cannot set buffer size to %1"
+msgstr ""
+
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
+msgid "Cannot set input channels to %1"
+msgstr ""
+
+#: engine_dialog.cc:2482
+msgid "Cannot set output channels to %1"
+msgstr ""
+
+#: engine_dialog.cc:2488
+msgid "Cannot set input latency to %1"
+msgstr ""
+
+#: engine_dialog.cc:2492
+msgid "Cannot set output latency to %1"
+msgstr ""
+
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
+msgid "No signal detected "
+msgstr ""
+
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
+#: port_insert_ui.cc:98
+msgid "Disconnected from audio engine"
+msgstr ""
+
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
+msgid "Detected roundtrip latency: "
+msgstr ""
+
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
+msgid "Systemic latency: "
+msgstr ""
+
+#: engine_dialog.cc:2889
+msgid "(signal detection error)"
+msgstr ""
+
+#: engine_dialog.cc:2895
+msgid "(inverted - bad wiring)"
+msgstr ""
+
+#: engine_dialog.cc:2942
+msgid "(averaging)"
+msgstr ""
+
+#: engine_dialog.cc:2948
+msgid "(too large jitter)"
+msgstr ""
+
+#: engine_dialog.cc:2952
+msgid "(large jitter)"
+msgstr ""
+
+#: engine_dialog.cc:2964
+msgid "Timeout - large MIDI jitter."
+msgstr ""
+
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
+msgid "Detecting ..."
+msgstr ""
+
+#: engine_dialog.cc:3081
+msgid "Disconnect from %1"
+msgstr ""
+
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
+
+#: engine_dialog.cc:3099
+msgid "Connect to %1"
+msgstr ""
+
+#: engine_dialog.cc:3103 shuttle_control.cc:663
+msgid "Stopped"
+msgstr ""
+
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
+msgid "Channels:"
+msgstr ""
+
+#: export_channel_selector.cc:47
+msgid "Split to mono files"
+msgstr ""
+
+#: export_channel_selector.cc:197
+msgid "Bus or Track"
+msgstr ""
+
+#: export_channel_selector.cc:474
+msgid "Region contents without fades nor region gain (channels: %1)"
+msgstr ""
+
+#: export_channel_selector.cc:478
+msgid "Region contents with fades and region gain (channels: %1)"
+msgstr ""
+
+#: export_channel_selector.cc:482
+msgid "Track output (channels: %1)"
+msgstr ""
+
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
+
+#: export_dialog.cc:49
+msgid ""
+"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
+"span>"
+msgstr ""
+
+#: export_dialog.cc:50
+msgid "List files"
+msgstr ""
+
+#: export_dialog.cc:163 export_format_dialog.cc:67
+msgid "File format"
+msgstr ""
+
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
+msgid "Time Span"
+msgstr ""
+
+#: export_dialog.cc:165
+msgid "Channels"
+msgstr ""
+
+#: export_dialog.cc:187
+msgid ""
+"Export has been aborted due to an error!\n"
+"See the Log for details."
+msgstr ""
+
+#: export_dialog.cc:298
+msgid "Files that will be overwritten"
+msgstr ""
+
+#: export_dialog.cc:343
+msgid "Export initialization failed: %1"
+msgstr ""
+
+#: export_dialog.cc:353
+msgid "Stop Export"
+msgstr ""
+
+#: export_dialog.cc:383
+msgid "export"
+msgstr ""
+
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:407
+msgid "Normalizing '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:453 export_dialog.cc:455
+msgid "<span color=\"#ffa755\">Error: "
+msgstr ""
+
+#: export_dialog.cc:465
+msgid "<span color=\"#ffa755\">Warning: "
+msgstr ""
+
+#: export_dialog.cc:467
+msgid ""
+"\n"
+"<span color=\"#ffa755\">Warning: "
+msgstr ""
+
+#: export_dialog.cc:491
+msgid "Export Selection"
+msgstr ""
+
+#: export_dialog.cc:505
+msgid "Export Region"
+msgstr ""
+
+#: export_dialog.cc:514
+msgid "Source"
+msgstr ""
+
+#: export_dialog.cc:530
+msgid "Stem Export"
+msgstr ""
+
+#: export_file_notebook.cc:39
+msgid "Add another format"
+msgstr ""
+
+#: export_file_notebook.cc:198
+msgid "Format"
+msgstr ""
+
+#: export_file_notebook.cc:199
+msgid "Location"
+msgstr ""
+
+#: export_file_notebook.cc:200
+msgid "Upload to Soundcloud"
+msgstr ""
+
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
+msgid "No format!"
+msgstr ""
+
+#: export_file_notebook.cc:304
+msgid "Format %1: %2"
+msgstr ""
+
+#: export_filename_selector.cc:33
+msgid "Label:"
+msgstr ""
+
+#: export_filename_selector.cc:34 session_dialog.cc:310
+msgid "Session Name"
+msgstr ""
+
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
+msgid "Folder:"
+msgstr ""
+
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
+#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
+msgid "Browse"
+msgstr ""
+
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
+
+#: export_filename_selector.cc:217
+msgid ""
+"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
+msgstr ""
+
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
+
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
+msgid ""
+"%1: this is only the directory/folder name, not the filename.\n"
+"The filename will be chosen from the information just above the folder "
+"selector."
+msgstr ""
+
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
+msgid "Choose export folder"
+msgstr ""
+
+#: export_format_dialog.cc:32
+msgid "New Export Format Profile"
+msgstr ""
+
+#: export_format_dialog.cc:32
+msgid "Edit Export Format Profile"
+msgstr ""
+
+#: export_format_dialog.cc:39
+msgid "Label: "
+msgstr ""
+
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
+msgid "Trim silence at start"
+msgstr ""
+
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
+msgstr ""
+
+#: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
+msgid ""
+"Command to run post-export\n"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
+msgstr ""
+
+#: export_format_dialog.cc:65
+msgid "Compatibility"
+msgstr ""
+
+#: export_format_dialog.cc:66
+msgid "Quality"
+msgstr ""
+
+#: export_format_dialog.cc:69
+msgid "Sample rate conversion quality:"
+msgstr ""
+
+#: export_format_dialog.cc:76
+msgid "Dithering"
+msgstr ""
+
+#: export_format_dialog.cc:78
+msgid "Create CUE file for disk-at-once CD/DVD creation"
+msgstr ""
+
+#: export_format_dialog.cc:79
+msgid "Create TOC file for disk-at-once CD/DVD creation"
+msgstr ""
+
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
+msgid "Tag file with session's metadata"
+msgstr ""
+
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
+msgid "Best (sinc)"
+msgstr ""
+
+#: export_format_dialog.cc:542
+msgid "Medium (sinc)"
+msgstr ""
+
+#: export_format_dialog.cc:547
+msgid "Fast (sinc)"
+msgstr ""
+
+#: export_format_dialog.cc:557
+msgid "Zero order hold"
+msgstr ""
+
+#: export_format_dialog.cc:981
+msgid "Linear encoding options"
+msgstr ""
+
+#: export_format_dialog.cc:997
+msgid "Ogg Vorbis options"
+msgstr ""
+
+#: export_format_dialog.cc:1008
+msgid "FLAC options"
+msgstr ""
+
+#: export_format_dialog.cc:1025
+msgid "Broadcast Wave options"
+msgstr ""
+
+#: export_format_selector.cc:131
+msgid "Do you really want to remove the format?"
+msgstr ""
+
+#: export_preset_selector.cc:28
+msgid "Preset"
+msgstr ""
+
+#: export_preset_selector.cc:99
+msgid ""
+"The selected preset did not load successfully!\n"
+"Perhaps it references a format that has been removed?"
+msgstr ""
+
+#: export_preset_selector.cc:151
+msgid "Do you really want to remove this preset?"
+msgstr ""
+
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr ""
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr ""
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr ""
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr ""
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr ""
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr ""
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr ""
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr ""
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr ""
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr ""
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
+msgid "P"
+msgstr ""
+
+#: gain_meter.cc:822
+msgid "T"
+msgstr ""
+
+#: gain_meter.cc:825
+msgid "W"
+msgstr ""
+
+#: generic_pluginui.cc:83
+msgid "<span size=\"large\">Presets</span>"
+msgstr ""
+
+#: generic_pluginui.cc:99 plugin_pin_dialog.cc:333
+msgid "Manual"
+msgstr ""
+
+#: generic_pluginui.cc:108
+msgid "All Automation"
+msgstr ""
+
+#: generic_pluginui.cc:259
+msgid "Plugin Editor: could not build control element for port %1"
+msgstr ""
+
+#: generic_pluginui.cc:290
+msgid "Plugin Editor: no control for property %1"
+msgstr ""
+
+#: generic_pluginui.cc:296
+msgid "Plugin Editor: could not build control element for property %1"
+msgstr ""
+
+#: generic_pluginui.cc:370
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:380 generic_pluginui.cc:486 processor_box.cc:3665
+msgid "Controls"
+msgstr ""
+
+#: generic_pluginui.cc:521
+msgid "Meters"
+msgstr ""
+
+#: generic_pluginui.cc:559
+msgid "Automation control"
+msgstr ""
+
+#: generic_pluginui.cc:566
+msgid "Mgnual"
+msgstr ""
+
+#: generic_pluginui.cc:831
+msgid "This control cannot be automated"
+msgstr ""
+
+#: global_port_matrix.cc:158
+msgid "Audio Connection Manager"
+msgstr ""
+
+#: global_port_matrix.cc:161
+msgid "MIDI Connection Manager"
+msgstr ""
+
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
+msgid "Disconnect"
+msgstr ""
+
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
+msgid "port"
+msgstr ""
+
+#: group_tabs.cc:312 group_tabs.cc:321
+msgid "Selection..."
+msgstr ""
+
+#: group_tabs.cc:313 group_tabs.cc:322
+msgid "Record Enabled..."
+msgstr ""
+
+#: group_tabs.cc:314 group_tabs.cc:323
+msgid "Soloed..."
+msgstr ""
+
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:352
+msgid "Edit Group..."
+msgstr ""
+
+#: group_tabs.cc:353
+msgid "Collect Group"
+msgstr ""
+
+#: group_tabs.cc:354
+msgid "Remove Group"
+msgstr ""
+
+#: group_tabs.cc:365
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:371
+msgid "Remove Subgroup Bus"
+msgstr ""
+
+#: group_tabs.cc:373
+msgid "Add New Subgroup Bus"
+msgstr ""
+
+#: group_tabs.cc:375
+msgid "Add New Aux Bus (pre-fader)"
+msgstr ""
+
+#: group_tabs.cc:376
+msgid "Add New Aux Bus (post-fader)"
+msgstr ""
+
+#: group_tabs.cc:401
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:412
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:423
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Enable All Groups"
+msgstr ""
+
+#: group_tabs.cc:427
+msgid "Disable All Groups"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
+msgid "Time to insert:"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:61
+msgid "Intersected regions should:"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:64
+msgid "stay in position"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:65
+msgid "move"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:66
+msgid "be split"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:76
+msgid "Move glued regions"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:78
+msgid "Move markers"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:81
+msgid "Move glued markers"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:86
+msgid "Move locked markers"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:91
+msgid ""
+"Move tempo and meter changes\n"
+"<i>(may cause oddities in the tempo map)</i>"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
+msgid "Insert time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
+msgid "-none-"
+msgstr ""
+
+#: interthread_progress_window.cc:114
+msgid "Importing file: %1 of %2"
+msgstr ""
+
+#: io_selector.cc:221
+msgid "I/O selector"
+msgstr ""
+
+#: io_selector.cc:266 monitor_selector.cc:244
+msgid "%1 input"
+msgstr ""
+
+#: io_selector.cc:268 monitor_selector.cc:246
+msgid "%1 output"
+msgstr ""
+
+#: keyboard.cc:93
+msgid "your own"
+msgstr ""
+
+#: keyboard.cc:157 keyboard.cc:181
+msgid "Default keybindings not found - %1 will be hard to use!"
+msgstr ""
+
+#: keyboard.cc:160
+msgid "Key bindings file \"%1\" not found. Default bindings used instead"
+msgstr ""
+
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr ""
+
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
+
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr ""
+
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr ""
+
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr ""
+
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr ""
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr ""
+
+#: keyeditor.cc:370
+msgid "RegionList"
+msgstr ""
+
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr ""
+
+#: latency_gui.cc:40
+msgid "msec"
+msgstr ""
+
+#: latency_gui.cc:41
+msgid "period"
+msgstr ""
+
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:422
+msgid "Reset"
+msgstr ""
+
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
+msgid "programming error: %1 (%2)"
+msgstr ""
+
+#: location_ui.cc:54 location_ui.cc:57
+msgid "Use PH"
+msgstr ""
+
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
+msgid "Glue"
+msgstr ""
+
+#: location_ui.cc:88
+msgid "Performer:"
+msgstr ""
+
+#: location_ui.cc:89
+msgid "Composer:"
+msgstr ""
+
+#: location_ui.cc:91
+msgid "Pre-Emphasis"
+msgstr ""
+
+#: location_ui.cc:319
+msgid "Remove this range"
+msgstr ""
+
+#: location_ui.cc:320
+msgid "Start time - middle click to locate here"
+msgstr ""
+
+#: location_ui.cc:321
+msgid "End time - middle click to locate here"
+msgstr ""
+
+#: location_ui.cc:324
+msgid "Set range start from playhead location"
+msgstr ""
+
+#: location_ui.cc:325
+msgid "Set range end from playhead location"
+msgstr ""
+
+#: location_ui.cc:329
+msgid "Remove this marker"
+msgstr ""
+
+#: location_ui.cc:330
+msgid "Position - middle click to locate here"
+msgstr ""
+
+#: location_ui.cc:332
+msgid "Set marker time from playhead location"
+msgstr ""
+
+#: location_ui.cc:524
+msgid "You cannot put a CD marker at the start of the session"
+msgstr ""
+
+#: location_ui.cc:750
+msgid "New Marker"
+msgstr ""
+
+#: location_ui.cc:751
+msgid "New Range"
+msgstr ""
+
+#: location_ui.cc:764
+msgid "<b>Loop/Punch Ranges</b>"
+msgstr ""
+
+#: location_ui.cc:790
+msgid "<b>Markers (Including CD Index)</b>"
+msgstr ""
+
+#: location_ui.cc:825
+msgid "<b>Ranges (Including CD Track Ranges)</b>"
+msgstr ""
+
+#: location_ui.cc:1068
+msgid "add range marker"
+msgstr ""
+
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
+msgid "%1 could not connect to the audio backend."
+msgstr ""
+
+#: main.cc:135 main.cc:151
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr ""
+
+#: main.cc:138
+msgid ""
+"%2 exited unexpectedly, and without notifying %1.\n"
+"\n"
+"This could be due to misconfiguration or to an error inside %2.\n"
+"\n"
+"Click OK to exit %1."
+msgstr ""
+
+#: main.cc:152
+msgid "%2 exited unexpectedly, and without notifying %1."
+msgstr ""
+
+#: main.cc:247
+msgid ""
+"\n"
+" %1 could not understand your command line "
+msgstr ""
+
+#: main.cc:249
+msgid "An error was encountered while launching %1"
+msgstr ""
+
+#: main.cc:350
+msgid " (built using "
+msgstr ""
+
+#: main.cc:353
+msgid " and GCC version "
+msgstr ""
+
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
+
+#: main.cc:364
+msgid ""
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
+msgstr ""
+
+#: main.cc:366
+msgid "%1 comes with ABSOLUTELY NO WARRANTY"
+msgstr ""
+
+#: main.cc:367
+msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: main.cc:368
+msgid "This is free software, and you are welcome to redistribute it "
+msgstr ""
+
+#: main.cc:369
+msgid "under certain conditions; see the source for copying conditions."
+msgstr ""
+
+#: main.cc:374
+msgid "could not initialize %1."
+msgstr ""
+
+#: main.cc:384
+msgid "Cannot xinstall SIGPIPE error handler"
+msgstr ""
+
+#: main.cc:391
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:398
+msgid "could not create %1 GUI"
+msgstr ""
+
+#: main_clock.cc:51
+msgid "Display delta to edit cursor"
+msgstr ""
+
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
+msgid "MarkerText"
+msgstr ""
+
+#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
+msgid "None"
+msgstr ""
+
+#: midi_channel_selector.cc:165 midi_channel_selector.cc:405
+#: midi_channel_selector.cc:441
+msgid "Invert"
+msgstr ""
+
+#: midi_channel_selector.cc:169
+msgid "Force"
+msgstr ""
+
+#: midi_channel_selector.cc:328 midi_channel_selector.cc:370
+msgid "MIDI Channel Control"
+msgstr ""
+
+#: midi_channel_selector.cc:330
+msgid "Playback all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:331
+msgid "Play only selected channels"
+msgstr ""
+
+#: midi_channel_selector.cc:332
+msgid "Use a single fixed channel for all playback"
+msgstr ""
+
+#: midi_channel_selector.cc:333
+msgid "Record all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:334
+msgid "Record only selected channels"
+msgstr ""
+
+#: midi_channel_selector.cc:335
+msgid "Force all channels to 1 channel"
+msgstr ""
+
+#: midi_channel_selector.cc:376
+msgid "Inbound"
+msgstr ""
+
+#: midi_channel_selector.cc:396
+msgid "Click to enable recording all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:401
+msgid "Click to disable recording all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:406
+msgid "Click to invert currently selected recording channels"
+msgstr ""
+
+#: midi_channel_selector.cc:413
+msgid "Playback"
+msgstr ""
+
+#: midi_channel_selector.cc:432
+msgid "Click to enable playback of all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:437
+msgid "Click to disable playback of all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:442
+msgid "Click to invert current selected playback channels"
+msgstr ""
+
+#: midi_channel_selector.cc:620
+msgid "Click to toggle playback of channel %1"
+msgstr ""
+
+#: midi_channel_selector.cc:628
+msgid "Click to force all MIDI channel messages to channel %1"
+msgstr ""
+
+#: midi_channel_selector.cc:720
+msgid "Click to toggle recording of channel %1"
+msgstr ""
+
+#: midi_channel_selector.cc:728
+msgid "Click to force all recorded channels to %1"
+msgstr ""
+
+#: midi_export_dialog.cc:35
+msgid "Export MIDI: %1"
+msgstr ""
+
+#: midi_list_editor.cc:56
+msgid "Whole"
+msgstr ""
+
+#: midi_list_editor.cc:57
+msgid "Half"
+msgstr ""
+
+#: midi_list_editor.cc:58
+msgid "Triplet"
+msgstr ""
+
+#: midi_list_editor.cc:59
+msgid "Quarter"
+msgstr ""
+
+#: midi_list_editor.cc:60
+msgid "Eighth"
+msgstr ""
+
+#: midi_list_editor.cc:61
+msgid "Sixteenth"
+msgstr ""
+
+#: midi_list_editor.cc:62
+msgid "Thirty-second"
+msgstr ""
+
+#: midi_list_editor.cc:63
+msgid "Sixty-fourth"
+msgstr ""
+
+#: midi_list_editor.cc:106
+msgid "Num"
+msgstr ""
+
+#: midi_list_editor.cc:108
+msgid "Vel"
+msgstr ""
+
+#: midi_list_editor.cc:216
+msgid "edit note start"
+msgstr ""
+
+#: midi_list_editor.cc:225
+msgid "edit note channel"
+msgstr ""
+
+#: midi_list_editor.cc:235
+msgid "edit note number"
+msgstr ""
+
+#: midi_list_editor.cc:245
+msgid "edit note velocity"
+msgstr ""
+
+#: midi_list_editor.cc:259
+msgid "edit note length"
+msgstr ""
+
+#: midi_list_editor.cc:463
+msgid "insert new note"
+msgstr ""
+
+#: midi_list_editor.cc:527
+msgid "delete notes (from list)"
+msgstr ""
+
+#: midi_list_editor.cc:602
+msgid "change note channel"
+msgstr ""
+
+#: midi_list_editor.cc:610
+msgid "change note number"
+msgstr ""
+
+#: midi_list_editor.cc:620
+msgid "change note velocity"
+msgstr ""
+
+#: midi_list_editor.cc:690
+msgid "change note length"
+msgstr ""
+
+#: midi_port_dialog.cc:39
+msgid "Add MIDI Port"
+msgstr ""
+
+#: midi_port_dialog.cc:40
+msgid "Port name:"
+msgstr ""
+
+#: midi_port_dialog.cc:45
+msgid "MidiPortDialog"
+msgstr ""
+
+#: midi_region_view.cc:855
+msgid "channel edit"
+msgstr ""
+
+#: midi_region_view.cc:891
+msgid "velocity edit"
+msgstr ""
+
+#: midi_region_view.cc:958
+msgid "add note"
+msgstr ""
+
+#: midi_region_view.cc:1902
+msgid "step add"
+msgstr ""
+
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
+msgid "alter patch change"
+msgstr ""
+
+#: midi_region_view.cc:2055
+msgid "add patch change"
+msgstr ""
+
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
+msgid "move patch change"
+msgstr ""
+
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
+msgid "delete patch change"
+msgstr ""
+
+#: midi_region_view.cc:2129
+msgid "delete selection"
+msgstr ""
+
+#: midi_region_view.cc:2146
+msgid "delete note"
+msgstr ""
+
+#: midi_region_view.cc:2587
+msgid "move notes"
+msgstr ""
+
+#: midi_region_view.cc:3137
+msgid "change velocities"
+msgstr ""
+
+#: midi_region_view.cc:3203
+msgid "transpose"
+msgstr ""
+
+#: midi_region_view.cc:3231
+msgid "change note lengths"
+msgstr ""
+
+#: midi_region_view.cc:3307
+msgid "nudge"
+msgstr ""
+
+#: midi_region_view.cc:3322
+msgid "change channel"
+msgstr ""
+
+#: midi_region_view.cc:3370
+msgid "Bank "
+msgstr ""
+
+#: midi_region_view.cc:3372
+msgid "Channel "
+msgstr ""
+
+#: midi_region_view.cc:3564
+msgid "paste"
+msgstr ""
+
+#: midi_streamview.cc:184
+msgid "attempt to display MIDI region with no source"
+msgstr ""
+
+#: midi_streamview.cc:194
+msgid "attempt to display MIDI region with no model"
+msgstr ""
+
+#: midi_streamview.cc:505
+msgid "failed to create MIDI region"
+msgstr ""
+
+#: midi_time_axis.cc:306
+msgid "External MIDI Device"
+msgstr ""
+
+#: midi_time_axis.cc:307
+msgid "External Device Mode"
+msgstr ""
+
+#: midi_time_axis.cc:315
+msgid "Chns"
+msgstr ""
+
+#: midi_time_axis.cc:317
+msgid "Click to edit channel settings"
+msgstr ""
+
+#: midi_time_axis.cc:516
+msgid "Show Full Range"
+msgstr ""
+
+#: midi_time_axis.cc:521
+msgid "Fit Contents"
+msgstr ""
+
+#: midi_time_axis.cc:525
+msgid "Note Range"
+msgstr ""
+
+#: midi_time_axis.cc:526
+msgid "Note Mode"
+msgstr ""
+
+#: midi_time_axis.cc:527
+msgid "Channel Selector"
+msgstr ""
+
+#: midi_time_axis.cc:532
+msgid "Color Mode"
+msgstr ""
+
+#: midi_time_axis.cc:591
+msgid "Bender"
+msgstr ""
+
+#: midi_time_axis.cc:595
+msgid "Pressure"
+msgstr ""
+
+#: midi_time_axis.cc:607
+msgid "Controllers"
+msgstr ""
+
+#: midi_time_axis.cc:612
+msgid "No MIDI Channels selected"
+msgstr ""
+
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
+msgid "Hide all channels"
+msgstr ""
+
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
+msgid "Show all channels"
+msgstr ""
+
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
+msgid "Channel %1"
+msgstr ""
+
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
+msgid "Controllers %1-%2"
+msgstr ""
+
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
+msgid "Controller %1"
+msgstr ""
+
+#: midi_time_axis.cc:988
+msgid "Sustained"
+msgstr ""
+
+#: midi_time_axis.cc:995
+msgid "Percussive"
+msgstr ""
+
+#: midi_time_axis.cc:1015
+msgid "Meter Colors"
+msgstr ""
+
+#: midi_time_axis.cc:1022
+msgid "Channel Colors"
+msgstr ""
+
+#: midi_time_axis.cc:1029
+msgid "Track Color"
+msgstr ""
+
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
+msgid "all"
+msgstr ""
+
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
+msgid "some"
+msgstr ""
+
+#: midi_tracer.cc:48
+msgid "Line history: "
+msgstr ""
+
+#: midi_tracer.cc:55
+msgid "Auto-Scroll"
+msgstr ""
+
+#: midi_tracer.cc:56
+msgid "Decimal"
+msgstr ""
+
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
+msgid "Enabled"
+msgstr ""
+
+#: midi_tracer.cc:58
+msgid "Delta times"
+msgstr ""
+
+#: midi_tracer.cc:71
+msgid "Port:"
+msgstr ""
+
+#: midi_velocity_dialog.cc:31
+msgid "New velocity"
+msgstr ""
+
+#: missing_file_dialog.cc:36
+msgid "Missing File"
+msgstr ""
+
+#: missing_file_dialog.cc:38
+msgid "Select a folder to search"
+msgstr ""
+
+#: missing_file_dialog.cc:39
+msgid "Add chosen folder to search path, and try again"
+msgstr ""
+
+#: missing_file_dialog.cc:41
+msgid "Stop loading this session"
+msgstr ""
+
+#: missing_file_dialog.cc:42
+msgid "Skip all missing files"
+msgstr ""
+
+#: missing_file_dialog.cc:43
+msgid "Skip this file"
+msgstr ""
+
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
+msgid "audio"
+msgstr ""
+
+#: missing_file_dialog.cc:74
+msgid ""
+"%1 cannot find the %2 file\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"in any of these folders:\n"
+"\n"
+"<tt>%4</tt>\n"
+"\n"
+msgstr ""
+
+#: missing_file_dialog.cc:108
+msgid "Click to choose an additional folder"
+msgstr ""
+
+#: missing_plugin_dialog.cc:29
+msgid "Missing Plugins"
+msgstr ""
+
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
+msgid "OK"
+msgstr ""
+
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
+
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+
+#: mixer_strip.cc:100 mixer_strip.cc:133
+msgid "pre"
+msgstr ""
+
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1548 mixer_strip.cc:1559 rc_option_editor.cc:3147
+msgid "Comments"
+msgstr ""
+
+#: mixer_strip.cc:160
+msgid "Click to toggle the width of this mixer strip."
+msgstr ""
+
+#: mixer_strip.cc:162
+msgid ""
+"\n"
+"%1-%2-click to toggle the width of all strips."
+msgstr ""
+
+#: mixer_strip.cc:171
+msgid "Hide this mixer strip"
+msgstr ""
+
+#: mixer_strip.cc:182
+msgid "Click to select metering point"
+msgstr ""
+
+#: mixer_strip.cc:198
+msgid "Isolate Solo"
+msgstr ""
+
+#: mixer_strip.cc:206
+msgid "Lock Solo Status"
+msgstr ""
+
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2224
+msgid "Iso"
+msgstr ""
+
+#: mixer_strip.cc:263
+msgid "Mix group"
+msgstr ""
+
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
+msgid "Phase Invert"
+msgstr ""
+
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
+msgid "Record & Monitor"
+msgstr ""
+
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
+msgid "Solo Iso / Lock"
+msgstr ""
+
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:545
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:590
+msgid "Enable/Disable MIDI input"
+msgstr ""
+
+#: mixer_strip.cc:756
+msgid "Aux"
+msgstr ""
+
+#: mixer_strip.cc:782
+msgid "Snd"
+msgstr ""
+
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
+msgid "Not connected to audio engine - no I/O changes are possible"
+msgstr ""
+
+#: mixer_strip.cc:911 mixer_strip.cc:1014
+msgid "Add %1 port"
+msgstr ""
+
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
+msgid "Routing Grid"
+msgstr ""
+
+#: mixer_strip.cc:1298
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1302
+msgid "<b>INPUT</b> to %1"
+msgstr ""
+
+#: mixer_strip.cc:1304 monitor_section.cc:1511
+msgid "<b>OUTPUT</b> from %1"
+msgstr ""
+
+#: mixer_strip.cc:1417 monitor_section.cc:1598
+msgid "Disconnected"
+msgstr ""
+
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr ""
+
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
+msgid "Cmt"
+msgstr ""
+
+#: mixer_strip.cc:1604
+msgid "Grp"
+msgstr ""
+
+#: mixer_strip.cc:1607
+msgid "~G"
+msgstr ""
+
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
+msgid "Color..."
+msgstr ""
+
+#: mixer_strip.cc:1650 route_time_axis.cc:587
+msgid "Comments..."
+msgstr ""
+
+#: mixer_strip.cc:1652 route_time_axis.cc:589
+msgid "Inputs..."
+msgstr ""
+
+#: mixer_strip.cc:1654 route_time_axis.cc:591
+msgid "Outputs..."
+msgstr ""
+
+#: mixer_strip.cc:1659
+msgid "Save As Template..."
+msgstr ""
+
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr ""
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1683 plugin_ui.cc:424 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1687
+msgid "Adjust Latency..."
+msgstr ""
+
+#: mixer_strip.cc:1690
+msgid "Protect Against Denormals"
+msgstr ""
+
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
+
+#: mixer_strip.cc:2004
+msgid "Pre"
+msgstr ""
+
+#: mixer_strip.cc:2008
+msgid "Post"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2028
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2032
+msgid "Meter|Po"
+msgstr ""
+
+#: mixer_strip.cc:2036
+msgid "Meter|O"
+msgstr ""
+
+#: mixer_strip.cc:2041
+msgid "Meter|C"
+msgstr ""
+
+#: mixer_strip.cc:2202 route_ui.cc:197
+msgid "Disk"
+msgstr ""
+
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2217 monitor_section.cc:81
+msgid "AFL"
+msgstr ""
+
+#: mixer_strip.cc:2220 monitor_section.cc:82
+msgid "PFL"
+msgstr ""
+
+#: mixer_strip.cc:2230 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2231 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
+
+#: mixer_strip.cc:2249
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2254
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2255
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2460
+msgid "Pre Fader"
+msgstr ""
+
+#: mixer_strip.cc:2461
+msgid "Post Fader"
+msgstr ""
+
+#: mixer_strip.cc:2506 meter_strip.cc:858
+msgid "Change all in Group to %1"
+msgstr ""
+
+#: mixer_strip.cc:2508 meter_strip.cc:860
+msgid "Change all to %1"
+msgstr ""
+
+#: mixer_strip.cc:2510 meter_strip.cc:862
+msgid "Change same track-type to %1"
+msgstr ""
+
+#: mixer_ui.cc:152 route_time_axis.cc:828
+msgid "Group"
+msgstr ""
+
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
+msgid "track display list item for renamed strip not found!"
+msgstr ""
+
+#: mixer_ui.cc:1636
+msgid "-all-"
+msgstr ""
+
+#: mixer_ui.cc:2135
+msgid "Strips"
+msgstr ""
+
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
+msgid "Reset Peak"
+msgstr ""
+
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
+msgid "Variable height"
+msgstr ""
+
+#: meter_strip.cc:895
+msgid "Short"
+msgstr ""
+
+#: meter_strip.cc:896
+msgid "Tall"
+msgstr ""
+
+#: meter_strip.cc:897
+msgid "Grande"
+msgstr ""
+
+#: meter_strip.cc:898
+msgid "Venti"
+msgstr ""
+
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
+msgid "RMS + Peak"
+msgstr ""
+
+#: meter_patterns.cc:93
+msgid "IEC1/DIN"
+msgstr ""
+
+#: meter_patterns.cc:96
+msgid "IEC1/Nordic"
+msgstr ""
+
+#: meter_patterns.cc:99
+msgid "IEC2/BBC"
+msgstr ""
+
+#: meter_patterns.cc:102
+msgid "IEC2/EBU"
+msgstr ""
+
+#: meter_patterns.cc:105
+msgid "K20/RMS"
+msgstr ""
+
+#: meter_patterns.cc:108
+msgid "K14/RMS"
+msgstr ""
+
+#: meter_patterns.cc:111
+msgid "K12/RMS"
+msgstr ""
+
+#: meter_patterns.cc:114
+msgid "VU"
+msgstr ""
+
+#: monitor_section.cc:80
+msgid "SiP"
+msgstr ""
+
+#: monitor_section.cc:113 route_group_dialog.cc:49
+msgid "Soloing"
+msgstr ""
+
+#: monitor_section.cc:117
+msgid "Isolated"
+msgstr ""
+
+#: monitor_section.cc:121
+msgid "Auditioning"
+msgstr ""
+
+#: monitor_section.cc:132
+msgid ""
+"When active, something is solo-isolated.\n"
+"Click to de-isolate everything"
+msgstr ""
+
+#: monitor_section.cc:135
+msgid ""
+"When active, auditioning is active.\n"
+"Click to stop the audition"
+msgstr ""
+
+#: monitor_section.cc:152
+msgid "Solo controls affect solo-in-place"
+msgstr ""
+
+#: monitor_section.cc:158
+msgid "Solo controls toggle after-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:164
+msgid "Solo controls toggle pre-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
+msgid "Gain increase for soloed signals (0dB is normal)"
+msgstr ""
+
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
+msgid "Solo Boost"
+msgstr ""
+
+#: monitor_section.cc:222
+msgid ""
+"Gain reduction non-soloed signals\n"
+"A value above -inf dB causes \"solo-in-front\""
+msgstr ""
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
+msgid "SiP Cut"
+msgstr ""
+
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
+msgstr ""
+
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr ""
+
+#: monitor_section.cc:399 port_group.cc:552
+msgid "Monitor"
+msgstr ""
+
+#: monitor_section.cc:897
+msgid "Switch monitor to mono"
+msgstr ""
+
+#: monitor_section.cc:900
+msgid "Cut monitor"
+msgstr ""
+
+#: monitor_section.cc:903
+msgid "Dim monitor"
+msgstr ""
+
+#: monitor_section.cc:906
+msgid "Toggle exclusive solo mode"
+msgstr ""
+
+#: monitor_section.cc:912
+msgid "Toggle mute overrides solo mode"
+msgstr ""
+
+#: monitor_section.cc:921
+msgid "Cut monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:926
+msgid "Dim monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:931
+msgid "Solo monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:936
+msgid "Invert monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:946
+msgid "In-place solo"
+msgstr ""
+
+#: monitor_section.cc:948
+msgid "After Fade Listen (AFL) solo"
+msgstr ""
+
+#: monitor_section.cc:950
+msgid "Pre Fade Listen (PFL) solo"
+msgstr ""
+
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
+msgid "bypassed"
+msgstr ""
+
+#: mono_panner.cc:119
+#, c-format
+msgid "L:%3d R:%3d"
+msgstr ""
+
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
+msgid "Mono Panner"
+msgstr ""
+
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
+msgid "%"
+msgstr ""
+
+#: nag.cc:41
+msgid "Support %1 Development"
+msgstr ""
+
+#: nag.cc:42
+msgid "I'd like to make a one-time donation"
+msgstr ""
+
+#: nag.cc:43
+msgid "Tell me more about becoming a subscriber"
+msgstr ""
+
+#: nag.cc:44
+msgid "I'm already a subscriber!"
+msgstr ""
+
+#: nag.cc:45
+msgid "Ask about this the next time I export"
+msgstr ""
+
+#: nag.cc:46
+msgid "Never ever ask me about this again"
+msgstr ""
+
+#: nag.cc:49
+msgid ""
+"Congratulations on your session export.\n"
+"\n"
+"It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
+"to bother you again about this - I'm working on improving our subscriber "
+"system\n"
+"so that I don't have to keep annoying you with this message.\n"
+"\n"
+"If you're not a subscriber, perhaps you might consider supporting my work\n"
+"on Ardour with either a one-time donation or subscription. Nothing will \n"
+"happen if you choose not to do so. However Ardour's continuing development\n"
+"relies on a stable, sustainable income stream. Thanks for using Ardour!"
+msgstr ""
+
+#: nag.cc:58
+msgid ""
+"Congratulations on your session export.\n"
+"\n"
+"I hope you find Ardour a useful tool. I'd like to ask you to consider "
+"supporting\n"
+"its development with either a one-time donation or subscription. Nothing\n"
+"will happen if you choose not to do so. However Ardour's continuing "
+"development\n"
+"relies on a stable, sustainable income stream. Thanks for using Ardour!"
+msgstr ""
+
+#: new_plugin_preset_dialog.cc:30
+msgid "Replace existing preset with this name"
+msgstr ""
+
+#: new_plugin_preset_dialog.cc:34
+msgid "Name of new preset"
+msgstr ""
+
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
+#: normalize_dialog.cc:34
+msgid "Normalize regions"
+msgstr ""
+
+#: normalize_dialog.cc:34
+msgid "Normalize region"
+msgstr ""
+
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:56
+msgid "Normalize each region using its own peak value"
+msgstr ""
+
+#: normalize_dialog.cc:58
+msgid "Normalize each region using the peak value of all regions"
+msgstr ""
+
+#: normalize_dialog.cc:73
+msgid "Normalize"
+msgstr ""
+
+#: note_select_dialog.cc:33
+msgid "Select Note"
+msgstr ""
+
+#: opts.cc:61
+msgid "Usage: "
+msgstr ""
+
+#: opts.cc:62
+msgid " [SESSION_NAME] Name of session to load\n"
+msgstr ""
+
+#: opts.cc:63
+msgid " -v, --version Show version information\n"
+msgstr ""
+
+#: opts.cc:64
+msgid " -h, --help Print this message\n"
+msgstr ""
+
+#: opts.cc:65
+msgid ""
+" -a, --no-announcements Do not contact website for announcements\n"
+msgstr ""
+
+#: opts.cc:66
+msgid ""
+" -b, --bindings Print all possible keyboard binding names\n"
+msgstr ""
+
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
+msgid ""
+" -c, --name <name> Use a specific backend client name, default is "
+"ardour\n"
+msgstr ""
+
+#: opts.cc:69
+msgid ""
+" -d, --disable-plugins Disable all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:70
+msgid ""
+" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
+"available options\n"
+msgstr ""
+
+#: opts.cc:71
+msgid " -n, --no-splash Do not show splash screen\n"
+msgstr ""
+
+#: opts.cc:72
+msgid " -m, --menus file Use \"file\" to define menus\n"
+msgstr ""
+
+#: opts.cc:73
+msgid ""
+" -N, --new session-name Create a new session from the command line\n"
+msgstr ""
+
+#: opts.cc:74
+msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
+msgstr ""
+
+#: opts.cc:75
+msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
+msgstr ""
+
+#: opts.cc:76
+msgid " -S, --sync Draw the gui synchronously \n"
+msgstr ""
+
+#: opts.cc:78
+msgid " -V, --novst Do not use VST support\n"
+msgstr ""
+
+#: opts.cc:80
+msgid ""
+" -E, --save <file> Load the specified session, save it to <file> "
+"and then quit\n"
+msgstr ""
+
+#: opts.cc:81
+msgid " -C, --curvetest filename Curve algorithm debugger\n"
+msgstr ""
+
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
+msgstr ""
+
+#: panner2d.cc:896
+msgid "Panner (2D)"
+msgstr ""
+
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:465
+msgid "Bypass"
+msgstr ""
+
+#: panner2d.cc:904
+msgid "Panner"
+msgstr ""
+
+#: panner_ui.cc:72
+msgid "Pan automation mode"
+msgstr ""
+
+#: panner_ui.cc:73
+msgid "Pan automation type"
+msgstr ""
+
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
+#: playlist_selector.cc:43
+msgid "Playlists"
+msgstr ""
+
+#: playlist_selector.cc:54
+msgid "Playlists grouped by track"
+msgstr ""
+
+#: playlist_selector.cc:101
+msgid "Playlist for %1"
+msgstr ""
+
+#: playlist_selector.cc:114
+msgid "Other tracks"
+msgstr ""
+
+#: playlist_selector.cc:139
+msgid "unassigned"
+msgstr ""
+
+#: playlist_selector.cc:194
+msgid "Imported"
+msgstr ""
+
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
+msgid "dB scale"
+msgstr ""
+
+#: plugin_eq_gui.cc:124
+msgid "Show phase"
+msgstr ""
+
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
+msgid "Name contains"
+msgstr ""
+
+#: plugin_selector.cc:55 plugin_selector.cc:326
+msgid "Type contains"
+msgstr ""
+
+#: plugin_selector.cc:56 plugin_selector.cc:324
+msgid "Category contains"
+msgstr ""
+
+#: plugin_selector.cc:57 plugin_selector.cc:349
+msgid "Author contains"
+msgstr ""
+
+#: plugin_selector.cc:58 plugin_selector.cc:351
+msgid "Library contains"
+msgstr ""
+
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
+msgid "Favorites only"
+msgstr ""
+
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
+msgid "Hidden only"
+msgstr ""
+
+#: plugin_selector.cc:65
+msgid "Plugin Manager"
+msgstr ""
+
+#: plugin_selector.cc:96
+msgid "Fav"
+msgstr ""
+
+#: plugin_selector.cc:98
+msgid "Available Plugins"
+msgstr ""
+
+#: plugin_selector.cc:99
+msgid "Type"
+msgstr ""
+
+#: plugin_selector.cc:100
+msgid "Category"
+msgstr ""
+
+#: plugin_selector.cc:101
+msgid "Creator"
+msgstr ""
+
+#: plugin_selector.cc:102
+msgid "# Audio In"
+msgstr ""
+
+#: plugin_selector.cc:103
+msgid "# Audio Out"
+msgstr ""
+
+#: plugin_selector.cc:104
+msgid "# MIDI In"
+msgstr ""
+
+#: plugin_selector.cc:105
+msgid "# MIDI Out"
+msgstr ""
+
+#: plugin_selector.cc:132
+msgid "Plugins to be connected"
+msgstr ""
+
+#: plugin_selector.cc:145
+msgid "Add a plugin to the effect list"
+msgstr ""
+
+#: plugin_selector.cc:149
+msgid "Remove a plugin from the effect list"
+msgstr ""
+
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
+
+#: plugin_selector.cc:232
+msgid "Insert Plugin(s)"
+msgstr ""
+
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
+msgid "variable"
+msgstr ""
+
+#: plugin_selector.cc:598
+msgid ""
+"The plugin \"%1\" could not be loaded\n"
+"\n"
+"See the Log window for more details (maybe)"
+msgstr ""
+
+#: plugin_selector.cc:757
+msgid "Favorites"
+msgstr ""
+
+#: plugin_selector.cc:759
+msgid "Plugin Manager..."
+msgstr ""
+
+#: plugin_selector.cc:763
+msgid "By Creator"
+msgstr ""
+
+#: plugin_selector.cc:766
+msgid "By Category"
+msgstr ""
+
+#: plugin_ui.cc:115
+msgid "Eh? LADSPA plugins don't have editors!"
+msgstr ""
+
+#: plugin_ui.cc:124 plugin_ui.cc:229
+msgid ""
+"unknown type of editor-supplying plugin (note: no VST support in this "
+"version of %1)"
+msgstr ""
+
+#: plugin_ui.cc:127
+msgid "unknown type of editor-supplying plugin"
+msgstr ""
+
+#: plugin_ui.cc:259
+msgid ""
+"unknown type of editor-supplying plugin (note: no linuxVST support in this "
+"version of %1)"
+msgstr ""
+
+#: plugin_ui.cc:331
+msgid "create_lv2_editor called on non-LV2 plugin"
+msgstr ""
+
+#: plugin_ui.cc:419
+msgid "Add"
+msgstr ""
+
+#: plugin_ui.cc:425
+msgid "Description"
+msgstr ""
+
+#: plugin_ui.cc:426
+msgid "Plugin analysis"
+msgstr ""
+
+#: plugin_ui.cc:433
+msgid ""
+"Presets (if any) for this plugin\n"
+"(Both factory and user-created)"
+msgstr ""
+
+#: plugin_ui.cc:434
+msgid "Save a new preset"
+msgstr ""
+
+#: plugin_ui.cc:435
+msgid "Save the current preset"
+msgstr ""
+
+#: plugin_ui.cc:436
+msgid "Delete the current preset"
+msgstr ""
+
+#: plugin_ui.cc:437
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:439
+msgid "Show Plugin Pin Management Dialog"
+msgstr ""
+
+#: plugin_ui.cc:441
+msgid "Disable signal processing by the plugin"
+msgstr ""
+
+#: plugin_ui.cc:480 plugin_ui.cc:699
+msgid ""
+"Click to allow the plugin to receive keyboard events that %1 would normally "
+"use as a shortcut"
+msgstr ""
+
+#: plugin_ui.cc:481
+msgid "Click to enable/disable this plugin"
+msgstr ""
+
+#: plugin_ui.cc:524
+msgid "latency (%1 sample)"
+msgid_plural "latency (%1 samples)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_ui.cc:526
+msgid "latency (%1 ms)"
+msgstr ""
+
+#: plugin_ui.cc:537
+msgid "Edit Latency"
+msgstr ""
+
+#: plugin_ui.cc:583
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr ""
+
+#: plugin_ui.cc:591
+msgid ""
+"Plugin presets are not supported in this build, see the Log window for more "
+"information."
+msgstr ""
+
+#: plugin_ui.cc:599
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:706
+msgid "Click to allow normal use of %1 keyboard shortcuts"
+msgstr ""
+
+#: plugin_ui.cc:813
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
+msgid "%1 Busses"
+msgstr ""
+
+#: port_group.cc:339
+msgid "%1 Tracks"
+msgstr ""
+
+#: port_group.cc:340
+msgid "Hardware"
+msgstr ""
+
+#: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
+msgid "Other"
+msgstr ""
+
+#: port_group.cc:435 port_group.cc:436
+msgid "LTC Out"
+msgstr ""
+
+#: port_group.cc:439 port_group.cc:440
+msgid "LTC In"
+msgstr ""
+
+#: port_group.cc:474
+msgid "MTC in"
+msgstr ""
+
+#: port_group.cc:477
+msgid "MIDI control in"
+msgstr ""
+
+#: port_group.cc:480
+msgid "MIDI clock in"
+msgstr ""
+
+#: port_group.cc:483
+msgid "MMC in"
+msgstr ""
+
+#: port_group.cc:487
+msgid "MTC out"
+msgstr ""
+
+#: port_group.cc:490
+msgid "MIDI control out"
+msgstr ""
+
+#: port_group.cc:493
+msgid "MIDI clock out"
+msgstr ""
+
+#: port_group.cc:496
+msgid "MMC out"
+msgstr ""
+
+#: port_group.cc:579
+msgid "Scene "
+msgstr ""
+
+#: port_insert_ui.cc:39
+msgid "Measure Latency"
+msgstr ""
+
+#: port_insert_ui.cc:50
+msgid "Send/Output"
+msgstr ""
+
+#: port_insert_ui.cc:51
+msgid "Return/Input"
+msgstr ""
+
+#: port_insert_ui.cc:85
+msgid "No signal detected"
+msgstr ""
+
+#: port_insert_ui.cc:165
+msgid "Port Insert "
+msgstr ""
+
+#: port_matrix.cc:341 port_matrix.cc:367
+msgid "<b>Sources</b>"
+msgstr ""
+
+#: port_matrix.cc:342 port_matrix.cc:368
+msgid "<b>Destinations</b>"
+msgstr ""
+
+#: port_matrix.cc:450 port_matrix.cc:458
+#, c-format
+msgid "Add %s %s"
+msgstr ""
+
+#: port_matrix.cc:466
+#, c-format
+msgid "Rename '%s'..."
+msgstr ""
+
+#: port_matrix.cc:482
+msgid "Remove all"
+msgstr ""
+
+#: port_matrix.cc:502 port_matrix.cc:514
+#, c-format
+msgid "%s all"
+msgstr ""
+
+#: port_matrix.cc:537
+msgid "Rescan"
+msgstr ""
+
+#: port_matrix.cc:539
+msgid "Show individual ports"
+msgstr ""
+
+#: port_matrix.cc:545
+msgid "Flip"
+msgstr ""
+
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
+msgstr ""
+
+#: port_matrix.cc:733
+msgid "Cannot add port"
+msgstr ""
+
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr ""
+
+#: port_matrix.cc:981
+#, c-format
+msgid "Remove '%s'"
+msgstr ""
+
+#: port_matrix.cc:996
+#, c-format
+msgid "%s all from '%s'"
+msgstr ""
+
+#: port_matrix.cc:1062 transform_dialog.cc:62
+msgid "channel"
+msgstr ""
+
+#: port_matrix_body.cc:82
+msgid "There are no ports to connect."
+msgstr ""
+
+#: port_matrix_body.cc:84
+msgid "There are no %1 ports to connect."
+msgstr ""
+
+#: processor_box.cc:226
+msgid "Return"
+msgstr ""
+
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr ""
+
+#: processor_box.cc:501
+msgid ""
+"\n"
+"This mono plugin has been replicated %1 times."
+msgstr ""
+
+#: processor_box.cc:505 processor_box.cc:1528
+msgid ""
+"<b>%1</b>\n"
+"Double-click to show GUI.\n"
+"%2+double-click to show generic GUI.%3"
+msgstr ""
+
+#: processor_box.cc:508 processor_box.cc:1531
+msgid ""
+"<b>%1</b>\n"
+"Double-click to show generic GUI.%2"
+msgstr ""
+
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
+#, c-format
+msgid "(%1x1) "
+msgstr ""
+
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
+msgid "Show All Controls"
+msgstr ""
+
+#: processor_box.cc:707
+msgid "Hide All Controls"
+msgstr ""
+
+#: processor_box.cc:752
+msgid "Link panner controls"
+msgstr ""
+
+#: processor_box.cc:859
+msgid "on"
+msgstr ""
+
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
+msgid "off"
+msgstr ""
+
+#: processor_box.cc:1819
+msgid ""
+"Right-click to add/remove/edit\n"
+"plugins,inserts,sends and more"
+msgstr ""
+
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2455 processor_box.cc:2998
+msgid "Plugin Incompatibility"
+msgstr ""
+
+#: processor_box.cc:2458
+msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
+msgstr ""
+
+#: processor_box.cc:2464
+msgid ""
+"\n"
+"This plugin has:\n"
+msgstr ""
+
+#: processor_box.cc:2467
+msgid "\t%1 MIDI input\n"
+msgid_plural "\t%1 MIDI inputs\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2471
+msgid "\t%1 audio input\n"
+msgid_plural "\t%1 audio inputs\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2474
+msgid ""
+"\n"
+"but at the insertion point, there are:\n"
+msgstr ""
+
+#: processor_box.cc:2477
+msgid "\t%1 MIDI channel\n"
+msgid_plural "\t%1 MIDI channels\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2481
+msgid "\t%1 audio channel\n"
+msgid_plural "\t%1 audio channels\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2484
+msgid ""
+"\n"
+"%1 is unable to insert this plugin here.\n"
+msgstr ""
+
+#: processor_box.cc:3001
+msgid ""
+"You cannot reorder these plugins/sends/inserts\n"
+"in that way because the inputs and\n"
+"outputs will not work correctly."
+msgstr ""
+
+#: processor_box.cc:3201
+msgid "Rename Processor"
+msgstr ""
+
+#: processor_box.cc:3232
+msgid "At least 100 IO objects exist with a name like %1 - name not changed"
+msgstr ""
+
+#: processor_box.cc:3383
+msgid "plugin insert constructor failed"
+msgstr ""
+
+#: processor_box.cc:3394
+msgid ""
+"Copying the set of processors on the clipboard failed,\n"
+"probably because the I/O configuration of the plugins\n"
+"could not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:3440
+msgid ""
+"Do you really want to remove all processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+
+#: processor_box.cc:3444 processor_box.cc:3469
+msgid "Yes, remove them all"
+msgstr ""
+
+#: processor_box.cc:3446 processor_box.cc:3471
+msgid "Remove processors"
+msgstr ""
+
+#: processor_box.cc:3461
+msgid ""
+"Do you really want to remove all pre-fader processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+
+#: processor_box.cc:3464
+msgid ""
+"Do you really want to remove all post-fader processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+
+#: processor_box.cc:3653
+msgid "New Plugin"
+msgstr ""
+
+#: processor_box.cc:3656
+msgid "New Insert"
+msgstr ""
+
+#: processor_box.cc:3659
+msgid "New External Send ..."
+msgstr ""
+
+#: processor_box.cc:3663
+msgid "New Aux Send ..."
+msgstr ""
+
+#: processor_box.cc:3666
+msgid "Send Options"
+msgstr ""
+
+#: processor_box.cc:3668
+msgid "Clear (all)"
+msgstr ""
+
+#: processor_box.cc:3670
+msgid "Clear (pre-fader)"
+msgstr ""
+
+#: processor_box.cc:3672
+msgid "Clear (post-fader)"
+msgstr ""
+
+#: processor_box.cc:3702
+msgid "Activate All"
+msgstr ""
+
+#: processor_box.cc:3704
+msgid "Deactivate All"
+msgstr ""
+
+#: processor_box.cc:3706
+msgid "A/B Plugins"
+msgstr ""
+
+#: processor_box.cc:3719
+msgid "Edit with generic controls..."
+msgstr ""
+
+#: processor_box.cc:4051
+msgid "%1: %2 (by %3)"
+msgstr ""
+
+#: processor_box.cc:4053
+msgid "%1 (by %2)"
+msgstr ""
+
+#: patch_change_dialog.cc:50
+msgid "Patch Change"
+msgstr ""
+
+#: patch_change_dialog.cc:76
+msgid "Patch Bank"
+msgstr ""
+
+#: patch_change_dialog.cc:83
+msgid "Patch"
+msgstr ""
+
+#: patch_change_dialog.cc:98 step_entry.cc:430
+msgid "Program"
+msgstr ""
+
+#: patch_change_dialog.cc:106 step_entry.cc:422
+msgid "Bank"
+msgstr ""
+
+#: quantize_dialog.cc:36
+msgid "main grid"
+msgstr ""
+
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
+msgid "Quantize"
+msgstr ""
+
+#: quantize_dialog.cc:65
+msgid "Strength"
+msgstr ""
+
+#: quantize_dialog.cc:68
+msgid "Swing"
+msgstr ""
+
+#: quantize_dialog.cc:71
+msgid "Threshold (ticks)"
+msgstr ""
+
+#: quantize_dialog.cc:72
+msgid "Snap note start"
+msgstr ""
+
+#: quantize_dialog.cc:73
+msgid "Snap note end"
+msgstr ""
+
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
+msgstr ""
+
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
+msgid "Click emphasis audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:154
+msgid "Choose Click"
+msgstr ""
+
+#: rc_option_editor.cc:177
+msgid "Choose Click Emphasis"
+msgstr ""
+
+#: rc_option_editor.cc:238
+msgid "Limit undo history to"
+msgstr ""
+
+#: rc_option_editor.cc:239
+msgid "Save undo history of"
+msgstr ""
+
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
+msgid "commands"
+msgstr ""
+
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
+msgid "Edit using:"
+msgstr ""
+
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
+msgid "+ button"
+msgstr ""
+
+#: rc_option_editor.cc:459
+msgid "Delete using:"
+msgstr ""
+
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
+msgid "Insert note using:"
+msgstr ""
+
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr ""
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
+msgstr ""
+
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr ""
+
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr ""
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr ""
+
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
+
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr ""
+
+#: rc_option_editor.cc:1032
+msgid "Default"
+msgstr ""
+
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr ""
+
+#: rc_option_editor.cc:1100
+msgid "â"
+msgstr ""
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr ""
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr ""
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr ""
+
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
+msgstr ""
+
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr ""
+
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr ""
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr ""
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
+msgstr ""
+
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr ""
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr ""
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr ""
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr ""
+
+#: rc_option_editor.cc:1887
+msgid "%1 processors"
+msgstr ""
+
+#: rc_option_editor.cc:1890
+msgid "This setting will only take effect when %1 is restarted."
+msgstr ""
+
+#: rc_option_editor.cc:1895
+msgid "Options|Undo"
+msgstr ""
+
+#: rc_option_editor.cc:1902
+msgid "Verify removal of last capture"
+msgstr ""
+
+#: rc_option_editor.cc:1907
+msgid "Session Management"
+msgstr ""
+
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr ""
+
+#: rc_option_editor.cc:1920
+msgid "Always copy imported files"
+msgstr ""
+
+#: rc_option_editor.cc:1927
+msgid "Default folder for new sessions:"
+msgstr ""
+
+#: rc_option_editor.cc:1935
+msgid "Maximum number of recent sessions"
+msgstr ""
+
+#: rc_option_editor.cc:1948
+msgid "Click gain level"
+msgstr ""
+
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
+msgid "Automation"
+msgstr ""
+
+#: rc_option_editor.cc:1958
+msgid "Thinning factor (larger value => less data)"
+msgstr ""
+
+#: rc_option_editor.cc:1967
+msgid "Automation sampling interval (milliseconds)"
+msgstr ""
+
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
+msgid "Keep record-enable engaged on stop"
+msgstr ""
+
+#: rc_option_editor.cc:1990
+msgid "Play loop is a transport mode"
+msgstr ""
+
+#: rc_option_editor.cc:1995
+msgid ""
+"<b>When enabled</b> the loop button does not start playback but forces "
+"playback to always play the loop\n"
+"\n"
+"<b>When disabled</b> the loop button starts playing the loop, but stop then "
+"cancels loop playback"
+msgstr ""
+
+#: rc_option_editor.cc:2001
+msgid "Stop recording when an xrun occurs"
+msgstr ""
+
+#: rc_option_editor.cc:2006
+msgid ""
+"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
+"detected by the audio engine"
+msgstr ""
+
+#: rc_option_editor.cc:2012
+msgid "Create markers where xruns occur"
+msgstr ""
+
+#: rc_option_editor.cc:2021
+msgid "Stop at the end of the session"
+msgstr ""
+
+#: rc_option_editor.cc:2026
+msgid ""
+"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
+"transport when it reaches the current session end marker\n"
+"\n"
+"<b>When disabled</b> %1 will continue to roll past the session end marker at "
+"all times"
+msgstr ""
+
+#: rc_option_editor.cc:2034
+msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
+msgstr ""
+
+#: rc_option_editor.cc:2039
+msgid ""
+"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
+"the loop point, preventing any need to do a transport locate at the end of "
+"the loop\n"
+"\n"
+"<b>When disabled</b> looping is done by locating back to the start of the "
+"loop when %1 reaches the end which will often cause a small click or delay"
+msgstr ""
+
+#: rc_option_editor.cc:2047
+msgid "Disable per-track record disarm while rolling"
+msgstr ""
+
+#: rc_option_editor.cc:2051
+msgid ""
+"<b>When enabled</b> this will prevent you from accidentally stopping "
+"specific tracks recording during a take"
+msgstr ""
+
+#: rc_option_editor.cc:2056
+msgid "12dB gain reduction during fast-forward and fast-rewind"
+msgstr ""
+
+#: rc_option_editor.cc:2060
+msgid ""
+"This will reduce the unpleasant increase in perceived volume that occurs "
+"when fast-forwarding or rewinding through some kinds of audio"
+msgstr ""
+
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
+msgid "External timecode source"
+msgstr ""
+
+#: rc_option_editor.cc:2094
+msgid "Match session video frame rate to external timecode"
+msgstr ""
+
+#: rc_option_editor.cc:2100
+msgid ""
+"This option controls the value of the video frame rate <i>while chasing</i> "
+"an external timecode source.\n"
+"\n"
+"<b>When enabled</b> the session video frame rate will be changed to match "
+"that of the selected external timecode source.\n"
+"\n"
+"<b>When disabled</b> the session video frame rate will not be changed to "
+"match that of the selected external timecode source.Instead the frame rate "
+"indication in the main clock will flash red and %1 will convert between the "
+"external timecode standard and the session standard."
+msgstr ""
+
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
+msgstr ""
+
+#: rc_option_editor.cc:2116
+msgid ""
+"<b>When enabled</b> %1 will never varispeed when slaved to external "
+"timecode. Sync Lock indicates that the selected external timecode source "
+"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
+"interface. This option disables drift compensation. The transport speed is "
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
+"\n"
+"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
+"the timecode sources shares clock sync."
+msgstr ""
+
+#: rc_option_editor.cc:2131
+msgid "Lock to 29.9700 fps instead of 30000/1001"
+msgstr ""
+
+#: rc_option_editor.cc:2137
+msgid ""
+"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
+"instead of 30000/1001.\n"
+"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions "
+"that drop-frame timecode has an accumulated error of -86ms over a 24-hour "
+"period.\n"
+"Drop-frame timecode would compensate exactly for a NTSC color frame rate of "
+"30 * 0.9990 (ie 29.970000). That is not the actual rate. However, some "
+"vendors use that rate - despite it being against the specs - because the "
+"variant of using exactly 29.97 fps has zero timecode drift.\n"
+msgstr ""
+
+#: rc_option_editor.cc:2147
+msgid "LTC Reader"
+msgstr ""
+
+#: rc_option_editor.cc:2151
+msgid "LTC incoming port"
+msgstr ""
+
+#: rc_option_editor.cc:2167
+msgid "LTC Generator"
+msgstr ""
+
+#: rc_option_editor.cc:2172
+msgid "Enable LTC generator"
+msgstr ""
+
+#: rc_option_editor.cc:2179
+msgid "Send LTC while stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2185
+msgid ""
+"<b>When enabled</b> %1 will continue to send LTC information even when the "
+"transport (playhead) is not moving"
+msgstr ""
+
+#: rc_option_editor.cc:2191
+msgid "LTC generator level"
+msgstr ""
+
+#: rc_option_editor.cc:2195
+msgid ""
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is 0dBu ^= -18dBFS in an EBU calibrated system"
+msgstr ""
+
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr ""
+
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr ""
+
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
+msgstr ""
+
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
+msgstr ""
+
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr ""
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr ""
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr ""
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr ""
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr ""
+
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr ""
+
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr ""
+
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
+
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
+msgstr ""
+
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
+msgstr ""
+
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
+
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr ""
+
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
+
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr ""
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr ""
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr ""
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr ""
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr ""
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr ""
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
+msgstr ""
+
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr ""
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr ""
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
+msgid "Buffering"
+msgstr ""
+
+#: rc_option_editor.cc:2405
+msgid "Record monitoring handled by"
+msgstr ""
+
+#: rc_option_editor.cc:2411
+msgid "via Audio Driver"
+msgstr ""
+
+#: rc_option_editor.cc:2417
+msgid "audio hardware"
+msgstr ""
+
+#: rc_option_editor.cc:2424
+msgid "Tape machine mode"
+msgstr ""
+
+#: rc_option_editor.cc:2429
+msgid "Connection of tracks and busses"
+msgstr ""
+
+#: rc_option_editor.cc:2435
+msgid "Auto-connect master/monitor busses"
+msgstr ""
+
+#: rc_option_editor.cc:2442
+msgid "Connect track inputs"
+msgstr ""
+
+#: rc_option_editor.cc:2447
+msgid "automatically to physical inputs"
+msgstr ""
+
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
+msgid "manually"
+msgstr ""
+
+#: rc_option_editor.cc:2454
+msgid "Connect track and bus outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2459
+msgid "automatically to physical outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2460
+msgid "automatically to master bus"
+msgstr ""
+
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
+msgid "Denormals"
+msgstr ""
+
+#: rc_option_editor.cc:2483
+msgid "Use DC bias to protect against denormals"
+msgstr ""
+
+#: rc_option_editor.cc:2490
+msgid "Processor handling"
+msgstr ""
+
+#: rc_option_editor.cc:2496
+msgid "no processor handling"
+msgstr ""
+
+#: rc_option_editor.cc:2502
+msgid "use FlushToZero"
+msgstr ""
+
+#: rc_option_editor.cc:2509
+msgid "use DenormalsAreZero"
+msgstr ""
+
+#: rc_option_editor.cc:2516
+msgid "use FlushToZero and DenormalsAreZero"
+msgstr ""
+
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
+msgstr ""
+
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
+msgstr ""
+
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
+
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
+msgstr ""
+
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr ""
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr ""
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr ""
+
+#: rc_option_editor.cc:2592
+msgid "Listen Position"
+msgstr ""
+
+#: rc_option_editor.cc:2597
+msgid "after-fader (AFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2598
+msgid "pre-fader (PFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2604
+msgid "PFL signals come from"
+msgstr ""
+
+#: rc_option_editor.cc:2609
+msgid "before pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2610
+msgid "pre-fader but after pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2616
+msgid "AFL signals come from"
+msgstr ""
+
+#: rc_option_editor.cc:2621
+msgid "immediately post-fader"
+msgstr ""
+
+#: rc_option_editor.cc:2622
+msgid "after post-fader processors (before pan)"
+msgstr ""
+
+#: rc_option_editor.cc:2626
+msgid "Default track / bus muting options"
+msgstr ""
+
+#: rc_option_editor.cc:2631
+msgid "Mute affects pre-fader sends"
+msgstr ""
+
+#: rc_option_editor.cc:2639
+msgid "Mute affects post-fader sends"
+msgstr ""
+
+#: rc_option_editor.cc:2647
+msgid "Mute affects control outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2655
+msgid "Mute affects main outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2662
+msgid "Send Routing"
+msgstr ""
+
+#: rc_option_editor.cc:2666
+msgid "Link panners of Aux and External Sends with main panner by default"
+msgstr ""
+
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
+msgid "MIDI read-ahead time (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+" <i>(requires a restart of %1 to take effect)</i>\n"
+" <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
+msgid "Preferences|GUI"
+msgstr ""
+
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3072
+msgid "Graphically indicate mouse pointer hovering over various widgets"
+msgstr ""
+
+#: rc_option_editor.cc:3080
+msgid "Show tooltips if mouse hovers over a control"
+msgstr ""
+
+#: rc_option_editor.cc:3088
+msgid "Use name highlight bars in region displays (requires a restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
+msgstr ""
+
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3127
+msgid "Lock timeout (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:3135
+msgid "Lock GUI after this many idle seconds (zero to never lock)"
+msgstr ""
+
+#: rc_option_editor.cc:3153
+msgid "Mixer Strip"
+msgstr ""
+
+#: rc_option_editor.cc:3163
+msgid "Use narrow strips in the mixer by default"
+msgstr ""
+
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
+msgid "Preferences|Metering"
+msgstr ""
+
+#: rc_option_editor.cc:3180
+msgid "Peak hold time"
+msgstr ""
+
+#: rc_option_editor.cc:3186
+msgid "short"
+msgstr ""
+
+#: rc_option_editor.cc:3187
+msgid "medium"
+msgstr ""
+
+#: rc_option_editor.cc:3188
+msgid "long"
+msgstr ""
+
+#: rc_option_editor.cc:3194
+msgid "DPM fall-off"
+msgstr ""
+
+#: rc_option_editor.cc:3200
+msgid "slowest [6.6dB/sec]"
+msgstr ""
+
+#: rc_option_editor.cc:3201
+msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
+msgstr ""
+
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr ""
+
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr ""
+
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
+msgstr ""
+
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
+msgstr ""
+
+#: rc_option_editor.cc:3211
+msgid "Meter line-up level; 0dBu"
+msgstr ""
+
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
+msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
+msgstr ""
+
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
+msgid "-20dBFS (SMPTE RP.0155)"
+msgstr ""
+
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
+msgid "-18dBFS (EBU, BBC)"
+msgstr ""
+
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
+msgid "-15dBFS (DIN)"
+msgstr ""
+
+#: rc_option_editor.cc:3221
+msgid ""
+"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
+"level for IEC1/Nordic, IEC2 PPM and VU meter."
+msgstr ""
+
+#: rc_option_editor.cc:3227
+msgid "IEC1/DIN Meter line-up level; 0dBu"
+msgstr ""
+
+#: rc_option_editor.cc:3237
+msgid "Reference level for IEC1/DIN meter."
+msgstr ""
+
+#: rc_option_editor.cc:3243
+msgid "VU Meter standard"
+msgstr ""
+
+#: rc_option_editor.cc:3248
+msgid "0VU = -2dBu (France)"
+msgstr ""
+
+#: rc_option_editor.cc:3249
+msgid "0VU = 0dBu (North America, Australia)"
+msgstr ""
+
+#: rc_option_editor.cc:3250
+msgid "0VU = +4dBu (standard)"
+msgstr ""
+
+#: rc_option_editor.cc:3251
+msgid "0VU = +8dBu"
+msgstr ""
+
+#: rc_option_editor.cc:3257
+msgid "Peak threshold [dBFS]"
+msgstr ""
+
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3313
+msgid ""
+"Specify the audio signal level in dBFS at and above which the meter-peak "
+"indicator will flash red."
+msgstr ""
+
+#: rc_option_editor.cc:3320
+msgid "LED meter style"
+msgstr ""
+
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3356
+msgid "Theme"
+msgstr ""
+
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
+msgid "audition this region"
+msgstr ""
+
+#: region_editor.cc:90 region_layering_order_editor.cc:75
+msgid "Position:"
+msgstr ""
+
+#: region_editor.cc:92 add_video_dialog.cc:156
+msgid "End:"
+msgstr ""
+
+#: region_editor.cc:94 sfdb_ui.cc:145
+msgid "Length:"
+msgstr ""
+
+#: region_editor.cc:96
+msgid "Sync point (relative to region):"
+msgstr ""
+
+#: region_editor.cc:98
+msgid "Sync point (absolute):"
+msgstr ""
+
+#: region_editor.cc:100
+msgid "File start:"
+msgstr ""
+
+#: region_editor.cc:104
+msgid "Sources:"
+msgstr ""
+
+#: region_editor.cc:106
+msgid "Source:"
+msgstr ""
+
+#: region_editor.cc:168
+msgid "Region '%1'"
+msgstr ""
+
+#: region_editor.cc:279
+msgid "change region start position"
+msgstr ""
+
+#: region_editor.cc:299
+msgid "change region end position"
+msgstr ""
+
+#: region_editor.cc:322
+msgid "change region length"
+msgstr ""
+
+#: region_editor.cc:416 region_editor.cc:428
+msgid "change region sync point"
+msgstr ""
+
+#: region_layering_order_editor.cc:42
+msgid "RegionLayeringOrderEditor"
+msgstr ""
+
+#: region_layering_order_editor.cc:55
+msgid "Region Name"
+msgstr ""
+
+#: region_layering_order_editor.cc:72
+msgid "Track:"
+msgstr ""
+
+#: region_layering_order_editor.cc:104
+msgid "Choose Top Region"
+msgstr ""
+
+#: region_view.cc:271
+msgid "SilenceText"
+msgstr ""
+
+#: region_view.cc:286 region_view.cc:305
+msgid "minutes"
+msgstr ""
+
+#: region_view.cc:289 region_view.cc:308
+msgid "msecs"
+msgstr ""
+
+#: region_view.cc:292 region_view.cc:311
+msgid "secs"
+msgstr ""
+
+#: region_view.cc:295
+msgid "%1 silent segment"
+msgid_plural "%1 silent segments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: region_view.cc:297
+msgid "shortest = %1 %2"
+msgstr ""
+
+#: region_view.cc:314
+msgid ""
+"\n"
+" (shortest audible segment = %1 %2)"
+msgstr ""
+
+#: return_ui.cc:102
+msgid "Return "
+msgstr ""
+
+#: rhythm_ferret.cc:48
+msgid "Percussive Onset"
+msgstr ""
+
+#: rhythm_ferret.cc:49
+msgid "Note Onset"
+msgstr ""
+
+#: rhythm_ferret.cc:54
+msgid "Energy Based"
+msgstr ""
+
+#: rhythm_ferret.cc:55
+msgid "Spectral Difference"
+msgstr ""
+
+#: rhythm_ferret.cc:56
+msgid "High-Frequency Content"
+msgstr ""
+
+#: rhythm_ferret.cc:57
+msgid "Complex Domain"
+msgstr ""
+
+#: rhythm_ferret.cc:58
+msgid "Phase Deviation"
+msgstr ""
+
+#: rhythm_ferret.cc:59
+msgid "Kullback-Liebler"
+msgstr ""
+
+#: rhythm_ferret.cc:60
+msgid "Modified Kullback-Liebler"
+msgstr ""
+
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
+msgid "Split region"
+msgstr ""
+
+#: rhythm_ferret.cc:70
+msgid "Snap regions"
+msgstr ""
+
+#: rhythm_ferret.cc:71
+msgid "Conform regions"
+msgstr ""
+
+#: rhythm_ferret.cc:77
+msgid "Rhythm Ferret"
+msgstr ""
+
+#: rhythm_ferret.cc:83
+msgid "Analyze"
+msgstr ""
+
+#: rhythm_ferret.cc:122
+msgid "Detection function"
+msgstr ""
+
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
+
+#: rhythm_ferret.cc:131
+msgid "Peak threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:135
+msgid "Silence threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
+msgid "Sensitivity"
+msgstr ""
+
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
+msgid "Operation"
+msgstr ""
+
+#: rhythm_ferret.cc:382
+msgid "split regions (rhythm ferret)"
+msgstr ""
+
+#: route_group_dialog.cc:42
+msgid "Track/bus Group"
+msgstr ""
+
+#: route_group_dialog.cc:47
+msgid "Relative"
+msgstr ""
+
+#: route_group_dialog.cc:48
+msgid "Muting"
+msgstr ""
+
+#: route_group_dialog.cc:50
+msgid "Record enable"
+msgstr ""
+
+#: route_group_dialog.cc:52
+msgid "Active state"
+msgstr ""
+
+#: route_group_dialog.cc:58
+msgid "RouteGroupDialog"
+msgstr ""
+
+#: route_group_dialog.cc:99
+msgid "<b>Sharing</b>"
+msgstr ""
+
+#: route_group_dialog.cc:192
+msgid "The group name is not unique. Please use a different name."
+msgstr ""
+
+#: route_params_ui.cc:84
+msgid "Tracks/Busses"
+msgstr ""
+
+#: route_params_ui.cc:103
+msgid "Inputs"
+msgstr ""
+
+#: route_params_ui.cc:104
+msgid "Outputs"
+msgstr ""
+
+#: route_params_ui.cc:105
+msgid "Plugins, Inserts & Sends"
+msgstr ""
+
+#: route_params_ui.cc:201
+msgid "route display list item for renamed route not found!"
+msgstr ""
+
+#: route_params_ui.cc:271 route_params_ui.cc:299
+#, c-format
+msgid "Playback delay: %<PRId64> samples"
+msgstr ""
+
+#: route_params_ui.cc:491
+msgid "NO TRACK"
+msgstr ""
+
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
+msgid "No Track or Bus Selected"
+msgstr ""
+
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
+msgid "Record (Right-click for Step Edit)"
+msgstr ""
+
+#: route_time_axis.cc:197
+msgid "Record"
+msgstr ""
+
+#: route_time_axis.cc:265
+msgid "Route Group"
+msgstr ""
+
+#: route_time_axis.cc:275
+msgid "MIDI Controllers and Automation"
+msgstr ""
+
+#: route_time_axis.cc:510
+msgid "Show All Automation"
+msgstr ""
+
+#: route_time_axis.cc:513
+msgid "Show Existing Automation"
+msgstr ""
+
+#: route_time_axis.cc:516
+msgid "Hide All Automation"
+msgstr ""
+
+#: route_time_axis.cc:525
+msgid "Processor automation"
+msgstr ""
+
+#: route_time_axis.cc:532
+msgid "Fader"
+msgstr ""
+
+#: route_time_axis.cc:559
+msgid "Pan"
+msgstr ""
+
+#: route_time_axis.cc:643
+msgid "Overlaid"
+msgstr ""
+
+#: route_time_axis.cc:649
+msgid "Stacked"
+msgstr ""
+
+#: route_time_axis.cc:657
+msgid "Layers"
+msgstr ""
+
+#: route_time_axis.cc:721
+msgid "Automatic (based on I/O connections)"
+msgstr ""
+
+#: route_time_axis.cc:730
+msgid "(Currently: Existing Material)"
+msgstr ""
+
+#: route_time_axis.cc:733
+msgid "(Currently: Capture Time)"
+msgstr ""
+
+#: route_time_axis.cc:741
+msgid "Align With Existing Material"
+msgstr ""
+
+#: route_time_axis.cc:746
+msgid "Align With Capture Time"
+msgstr ""
+
+#: route_time_axis.cc:751
+msgid "Alignment"
+msgstr ""
+
+#: route_time_axis.cc:786
+msgid "Normal Mode"
+msgstr ""
+
+#: route_time_axis.cc:792
+msgid "Tape Mode"
+msgstr ""
+
+#: route_time_axis.cc:798
+msgid "Non-Layered Mode"
+msgstr ""
+
+#: route_time_axis.cc:804
+msgid "Record Mode"
+msgstr ""
+
+#: route_time_axis.cc:809 route_time_axis.cc:1795
+msgid "Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1107
+msgid "Rename Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1108
+msgid "New name for playlist:"
+msgstr ""
+
+#: route_time_axis.cc:1193
+msgid "New Copy Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
+msgid "Name for new playlist:"
+msgstr ""
+
+#: route_time_axis.cc:1246
+msgid "New Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
+
+#: route_time_axis.cc:1684
+msgid "New Copy..."
+msgstr ""
+
+#: route_time_axis.cc:1688
+msgid "New Take"
+msgstr ""
+
+#: route_time_axis.cc:1689
+msgid "Copy Take"
+msgstr ""
+
+#: route_time_axis.cc:1694
+msgid "Clear Current"
+msgstr ""
+
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
+
+#: route_time_axis.cc:1785
+msgid "Take: %1.%2"
+msgstr ""
+
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
+msgid "programming error: "
+msgstr ""
+
+#: route_time_axis.cc:2614
+msgid "Underlays"
+msgstr ""
+
+#: route_time_axis.cc:2617
+msgid "Remove \"%1\""
+msgstr ""
+
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
+msgid "programming error: underlay reference pointer pairs are inconsistent!"
+msgstr ""
+
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
+msgid "After-fade listen (AFL)"
+msgstr ""
+
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
+msgid "Pre-fade listen (PFL)"
+msgstr ""
+
+#: route_ui.cc:169
+msgid "Mute this track"
+msgstr ""
+
+#: route_ui.cc:173
+msgid "Mute other (non-soloed) tracks"
+msgstr ""
+
+#: route_ui.cc:179
+msgid "Enable recording on this track"
+msgstr ""
+
+#: route_ui.cc:187
+msgid "make mixer strips show sends to this bus"
+msgstr ""
+
+#: route_ui.cc:192
+msgid "Monitor input"
+msgstr ""
+
+#: route_ui.cc:198
+msgid "Monitor playback"
+msgstr ""
+
+#: route_ui.cc:710
+msgid "Not connected to AudioEngine - cannot engage record"
+msgstr ""
+
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:892
+msgid "Step Entry"
+msgstr ""
+
+#: route_ui.cc:991
+msgid "Assign all tracks (prefader)"
+msgstr ""
+
+#: route_ui.cc:995
+msgid "Assign all tracks and buses (prefader)"
+msgstr ""
+
+#: route_ui.cc:999
+msgid "Assign all tracks (postfader)"
+msgstr ""
+
+#: route_ui.cc:1003
+msgid "Assign all tracks and buses (postfader)"
+msgstr ""
+
+#: route_ui.cc:1007
+msgid "Assign selected tracks (prefader)"
+msgstr ""
+
+#: route_ui.cc:1011
+msgid "Assign selected tracks and buses (prefader)"
+msgstr ""
+
+#: route_ui.cc:1014
+msgid "Assign selected tracks (postfader)"
+msgstr ""
+
+#: route_ui.cc:1018
+msgid "Assign selected tracks and buses (postfader)"
+msgstr ""
+
+#: route_ui.cc:1021
+msgid "Copy track/bus gains to sends"
+msgstr ""
+
+#: route_ui.cc:1022
+msgid "Set sends gain to -inf"
+msgstr ""
+
+#: route_ui.cc:1023
+msgid "Set sends gain to 0dB"
+msgstr ""
+
+#: route_ui.cc:1361
+msgid "Solo Isolate"
+msgstr ""
+
+#: route_ui.cc:1368
+msgid "Solo Safe"
+msgstr ""
+
+#: route_ui.cc:1390
+msgid "Pre Fader Sends"
+msgstr ""
+
+#: route_ui.cc:1396
+msgid "Post Fader Sends"
+msgstr ""
+
+#: route_ui.cc:1402
+msgid "Control Outs"
+msgstr ""
+
+#: route_ui.cc:1408
+msgid "Main Outs"
+msgstr ""
+
+#: route_ui.cc:1575
+msgid "Color Selection"
+msgstr ""
+
+#: route_ui.cc:1617
+msgid ""
+"The use of colons (':') is discouraged in track and bus names.\n"
+"Do you want to use this new name?"
+msgstr ""
+
+#: route_ui.cc:1621
+msgid "Use the new name"
+msgstr ""
+
+#: route_ui.cc:1622
+msgid "Re-edit the name"
+msgstr ""
+
+#: route_ui.cc:1635
+msgid "Rename Track"
+msgstr ""
+
+#: route_ui.cc:1637
+msgid "Rename Bus"
+msgstr ""
+
+#: route_ui.cc:1697
+msgid ": comment editor"
+msgstr ""
+
+#: route_ui.cc:1852
+msgid " latency"
+msgstr ""
+
+#: route_ui.cc:1892
+msgid "Cannot create route template directory %1"
+msgstr ""
+
+#: route_ui.cc:1898
+msgid "Save As Template"
+msgstr ""
+
+#: route_ui.cc:1899
+msgid "Template name:"
+msgstr ""
+
+#: route_ui.cc:2023
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
+
+#: route_ui.cc:2025
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
+
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr ""
+
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr ""
+
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr ""
+
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr ""
+
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr ""
+
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr ""
+
+#: search_path_option.cc:35
+msgid "Select folder to search for media"
+msgstr ""
+
+#: search_path_option.cc:44
+msgid "Click to add a new location"
+msgstr ""
+
+#: search_path_option.cc:51
+msgid "the session folder"
+msgstr ""
+
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
+#: send_ui.cc:134
+msgid "Send "
+msgstr ""
+
+#: session_dialog.cc:71
+msgid "Session Setup"
+msgstr ""
+
+#: session_dialog.cc:76
+msgid "Advanced options ..."
+msgstr ""
+
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr ""
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr ""
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr ""
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr ""
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
+msgstr ""
+
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
+msgstr ""
+
+#: session_dialog.cc:404
+msgid "Select session file"
+msgstr ""
+
+#: session_dialog.cc:417
+msgid "Other Sessions"
+msgstr ""
+
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
+msgid "Open"
+msgstr ""
+
+#: session_dialog.cc:521
+msgid "Session name:"
+msgstr ""
+
+#: session_dialog.cc:543
+msgid "Create session folder in:"
+msgstr ""
+
+#: session_dialog.cc:564
+msgid "Select folder for session"
+msgstr ""
+
+#: session_dialog.cc:591
+msgid "Use this template"
+msgstr ""
+
+#: session_dialog.cc:594
+msgid "no template"
+msgstr ""
+
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr ""
+
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr ""
+
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr ""
+
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
+msgid "channels"
+msgstr ""
+
+#: session_dialog.cc:893
+msgid "<b>Busses</b>"
+msgstr ""
+
+#: session_dialog.cc:894
+msgid "<b>Inputs</b>"
+msgstr ""
+
+#: session_dialog.cc:895
+msgid "<b>Outputs</b>"
+msgstr ""
+
+#: session_dialog.cc:903
+msgid "Create master bus"
+msgstr ""
+
+#: session_dialog.cc:913
+msgid "Automatically connect to physical inputs"
+msgstr ""
+
+#: session_dialog.cc:920 session_dialog.cc:979
+msgid "Use only"
+msgstr ""
+
+#: session_dialog.cc:973
+msgid "Automatically connect outputs"
+msgstr ""
+
+#: session_dialog.cc:995
+msgid "... to master bus"
+msgstr ""
+
+#: session_dialog.cc:1005
+msgid "... to physical outputs"
+msgstr ""
+
+#: session_import_dialog.cc:74
+msgid "Elements"
+msgstr ""
+
+#: session_import_dialog.cc:111
+msgid "Cannot load XML for session from %1"
+msgstr ""
+
+#: session_import_dialog.cc:128 session_import_dialog.cc:212
+msgid "Some elements had errors in them. Please see the log for details"
+msgstr ""
+
+#: session_import_dialog.cc:164
+msgid "Import from session"
+msgstr ""
+
+#: session_import_dialog.cc:228
+msgid "This will select all elements of this type!"
+msgstr ""
+
+#: session_metadata_dialog.cc:288
+msgid "EAN Check digit OK"
+msgstr ""
+
+#: session_metadata_dialog.cc:292
+msgid "EAN Check digit error"
+msgstr ""
+
+#: session_metadata_dialog.cc:292
+msgid "expected"
+msgstr ""
+
+#: session_metadata_dialog.cc:297
+msgid "EAN Length error"
+msgstr ""
+
+#: session_metadata_dialog.cc:426
+msgid "Field"
+msgstr ""
+
+#: session_metadata_dialog.cc:430
+msgid "Values (current value on top)"
+msgstr ""
+
+#: session_metadata_dialog.cc:644
+msgid "User"
+msgstr ""
+
+#: session_metadata_dialog.cc:652
+msgid "Email"
+msgstr ""
+
+#: session_metadata_dialog.cc:655
+msgid "Web"
+msgstr ""
+
+#: session_metadata_dialog.cc:658
+msgid "Organization"
+msgstr ""
+
+#: session_metadata_dialog.cc:661
+msgid "Country"
+msgstr ""
+
+#: session_metadata_dialog.cc:675
+msgid "Title"
+msgstr ""
+
+#: session_metadata_dialog.cc:678
+msgid "Track Number"
+msgstr ""
+
+#: session_metadata_dialog.cc:681
+msgid "Subtitle"
+msgstr ""
+
+#: session_metadata_dialog.cc:684
+msgid "Grouping"
+msgstr ""
+
+#: session_metadata_dialog.cc:687
+msgid "Artist"
+msgstr ""
+
+#: session_metadata_dialog.cc:690
+msgid "Genre"
+msgstr ""
+
+#: session_metadata_dialog.cc:693
+msgid "Comment"
+msgstr ""
+
+#: session_metadata_dialog.cc:696
+msgid "Copyright"
+msgstr ""
+
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
+msgid "Album"
+msgstr ""
+
+#: session_metadata_dialog.cc:712
+msgid "Year"
+msgstr ""
+
+#: session_metadata_dialog.cc:715
+msgid "Album Artist"
+msgstr ""
+
+#: session_metadata_dialog.cc:718
+msgid "Total Tracks"
+msgstr ""
+
+#: session_metadata_dialog.cc:721
+msgid "Disc Subtitle"
+msgstr ""
+
+#: session_metadata_dialog.cc:724
+msgid "Disc Number"
+msgstr ""
+
+#: session_metadata_dialog.cc:727
+msgid "Total Discs"
+msgstr ""
+
+#: session_metadata_dialog.cc:730
+msgid "Compilation"
+msgstr ""
+
+#: session_metadata_dialog.cc:733
+msgid "ISRC"
+msgstr ""
+
+#: session_metadata_dialog.cc:736
+msgid "EAN barcode"
+msgstr ""
+
+#: session_metadata_dialog.cc:749
+msgid "People"
+msgstr ""
+
+#: session_metadata_dialog.cc:754
+msgid "Lyricist"
+msgstr ""
+
+#: session_metadata_dialog.cc:757
+msgid "Composer"
+msgstr ""
+
+#: session_metadata_dialog.cc:760
+msgid "Conductor"
+msgstr ""
+
+#: session_metadata_dialog.cc:763
+msgid "Remixer"
+msgstr ""
+
+#: session_metadata_dialog.cc:766
+msgid "Arranger"
+msgstr ""
+
+#: session_metadata_dialog.cc:769
+msgid "Engineer"
+msgstr ""
+
+#: session_metadata_dialog.cc:772
+msgid "Producer"
+msgstr ""
+
+#: session_metadata_dialog.cc:775
+msgid "DJ Mixer"
+msgstr ""
+
+#: session_metadata_dialog.cc:778
+msgid "Metadata|Mixer"
+msgstr ""
+
+#: session_metadata_dialog.cc:786
+msgid "School"
+msgstr ""
+
+#: session_metadata_dialog.cc:791
+msgid "Instructor"
+msgstr ""
+
+#: session_metadata_dialog.cc:794
+msgid "Course"
+msgstr ""
+
+#: session_metadata_dialog.cc:802
+msgid "Edit Session Metadata"
+msgstr ""
+
+#: session_metadata_dialog.cc:833
+msgid "Import session metadata"
+msgstr ""
+
+#: session_metadata_dialog.cc:854
+msgid "Choose session to import metadata from"
+msgstr ""
+
+#: session_metadata_dialog.cc:892
+msgid "This session file could not be read!"
+msgstr ""
+
+#: session_metadata_dialog.cc:902
+msgid ""
+"The session file didn't contain metadata!\n"
+"Maybe this is an old session format?"
+msgstr ""
+
+#: session_metadata_dialog.cc:921
+msgid "Import all from:"
+msgstr ""
+
+#: session_option_editor.cc:32
+msgid "Session Properties"
+msgstr ""
+
+#: session_option_editor.cc:41
+msgid "Timecode Settings"
+msgstr ""
+
+#: session_option_editor.cc:45
+msgid "Timecode frames-per-second"
+msgstr ""
+
+#: session_option_editor.cc:50
+msgid "23.976"
+msgstr ""
+
+#: session_option_editor.cc:51
+msgid "24"
+msgstr ""
+
+#: session_option_editor.cc:52
+msgid "24.975"
+msgstr ""
+
+#: session_option_editor.cc:53
+msgid "25"
+msgstr ""
+
+#: session_option_editor.cc:54
+msgid "29.97"
+msgstr ""
+
+#: session_option_editor.cc:55
+msgid "29.97 drop"
+msgstr ""
+
+#: session_option_editor.cc:56
+msgid "30"
+msgstr ""
+
+#: session_option_editor.cc:57
+msgid "30 drop"
+msgstr ""
+
+#: session_option_editor.cc:58
+msgid "59.94"
+msgstr ""
+
+#: session_option_editor.cc:59
+msgid "60"
+msgstr ""
+
+#: session_option_editor.cc:65
+msgid "Pull-up / pull-down"
+msgstr ""
+
+#: session_option_editor.cc:70
+msgid "4.1667 + 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:71
+msgid "4.1667"
+msgstr ""
+
+#: session_option_editor.cc:72
+msgid "4.1667 - 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:73
+msgid "0.1"
+msgstr ""
+
+#: session_option_editor.cc:74
+msgid "none"
+msgstr ""
+
+#: session_option_editor.cc:75
+msgid "-0.1"
+msgstr ""
+
+#: session_option_editor.cc:76
+msgid "-4.1667 + 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:77
+msgid "-4.1667"
+msgstr ""
+
+#: session_option_editor.cc:78
+msgid "-4.1667 - 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:84
+msgid ""
+"Use Video File's FPS Instead of Timecode Value for Timeline and Video "
+"Monitor."
+msgstr ""
+
+#: session_option_editor.cc:91
+msgid ""
+"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
+"sync)."
+msgstr ""
+
+#: session_option_editor.cc:96
+msgid "Ext Timecode Offsets"
+msgstr ""
+
+#: session_option_editor.cc:100
+msgid "Slave Timecode offset"
+msgstr ""
+
+#: session_option_editor.cc:107
+msgid "The specified offset is added to the received timecode (MTC or LTC)."
+msgstr ""
+
+#: session_option_editor.cc:113
+msgid "Timecode Generator offset"
+msgstr ""
+
+#: session_option_editor.cc:120
+msgid ""
+"Specify an offset which is added to the generated timecode (so far only LTC)."
+msgstr ""
+
+#: session_option_editor.cc:124
+msgid "JACK Transport/Time Settings"
+msgstr ""
+
+#: session_option_editor.cc:128
+msgid ""
+"%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
+msgstr ""
+
+#: session_option_editor.cc:136
+msgid "destructive-xfade-seconds"
+msgstr ""
+
+#: session_option_editor.cc:137
+msgid "Destructive crossfade length"
+msgstr ""
+
+#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
+msgid "Region fades visible"
+msgstr ""
+
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
+msgid "Media"
+msgstr ""
+
+#: session_option_editor.cc:174
+msgid "Audio file format"
+msgstr ""
+
+#: session_option_editor.cc:178
+msgid "Sample format"
+msgstr ""
+
+#: session_option_editor.cc:183
+msgid "32-bit floating point"
+msgstr ""
+
+#: session_option_editor.cc:184
+msgid "24-bit integer"
+msgstr ""
+
+#: session_option_editor.cc:185
+msgid "16-bit integer"
+msgstr ""
+
+#: session_option_editor.cc:191
+msgid "File type"
+msgstr ""
+
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr ""
+
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
+msgid "WAVE-64"
+msgstr ""
+
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
+msgid "File locations"
+msgstr ""
+
+#: session_option_editor.cc:212
+msgid "Search for audio files in:"
+msgstr ""
+
+#: session_option_editor.cc:218
+msgid "Search for MIDI files in:"
+msgstr ""
+
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
+msgid "Filenames"
+msgstr ""
+
+#: session_option_editor.cc:227
+msgid "File Naming"
+msgstr ""
+
+#: session_option_editor.cc:233
+msgid "Prefix Track number"
+msgstr ""
+
+#: session_option_editor.cc:238
+msgid ""
+"Adds the current track number to the beginning of the recorded file name."
+msgstr ""
+
+#: session_option_editor.cc:243
+msgid "Prefix Take Name"
+msgstr ""
+
+#: session_option_editor.cc:248
+msgid "Adds the Take Name to the beginning of the recorded file name."
+msgstr ""
+
+#: session_option_editor.cc:253
+msgid "Take Name"
+msgstr ""
+
+#: session_option_editor.cc:266
+msgid ""
+"Track Input Monitoring automatically follows transport state (\"auto-input\")"
+msgstr ""
+
+#: session_option_editor.cc:273
+msgid "Use monitor section in this session"
+msgstr ""
+
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
+msgid "Meterbridge"
+msgstr ""
+
+#: session_option_editor.cc:278
+msgid "Route Display"
+msgstr ""
+
+#: session_option_editor.cc:282
+msgid "Show Midi Tracks"
+msgstr ""
+
+#: session_option_editor.cc:289
+msgid "Show Busses"
+msgstr ""
+
+#: session_option_editor.cc:296
+msgid "Include Master Bus"
+msgstr ""
+
+#: session_option_editor.cc:301
+msgid "Button Area"
+msgstr ""
+
+#: session_option_editor.cc:305
+msgid "Rec-enable Button"
+msgstr ""
+
+#: session_option_editor.cc:312
+msgid "Mute Button"
+msgstr ""
+
+#: session_option_editor.cc:319
+msgid "Solo Button"
+msgstr ""
+
+#: session_option_editor.cc:326
+msgid "Monitor Buttons"
+msgstr ""
+
+#: session_option_editor.cc:331
+msgid "Name Labels"
+msgstr ""
+
+#: session_option_editor.cc:335
+msgid "Track Name"
+msgstr ""
+
+#: session_option_editor.cc:346
+msgid "MIDI region copies are independent"
+msgstr ""
+
+#: session_option_editor.cc:353
+msgid ""
+"Policy for handling overlapping notes\n"
+" on the same MIDI channel"
+msgstr ""
+
+#: session_option_editor.cc:358
+msgid "never allow them"
+msgstr ""
+
+#: session_option_editor.cc:359
+msgid "don't do anything in particular"
+msgstr ""
+
+#: session_option_editor.cc:360
+msgid "replace any overlapped existing note"
+msgstr ""
+
+#: session_option_editor.cc:361
+msgid "shorten the overlapped existing note"
+msgstr ""
+
+#: session_option_editor.cc:362
+msgid "shorten the overlapping new note"
+msgstr ""
+
+#: session_option_editor.cc:363
+msgid "replace both overlapping notes with a single note"
+msgstr ""
+
+#: session_option_editor.cc:367
+msgid "Glue to bars and beats"
+msgstr ""
+
+#: session_option_editor.cc:371
+msgid "Glue new markers to bars and beats"
+msgstr ""
+
+#: session_option_editor.cc:378
+msgid "Glue new regions to bars and beats"
+msgstr ""
+
+#: session_option_editor.cc:383
+msgid "Defaults"
+msgstr ""
+
+#: session_option_editor.cc:385
+msgid "Use these settings as defaults"
+msgstr ""
+
+#: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
+msgid "as new tracks"
+msgstr ""
+
+#: sfdb_ui.cc:92 sfdb_ui.cc:112
+msgid "to selected tracks"
+msgstr ""
+
+#: sfdb_ui.cc:94 sfdb_ui.cc:114
+msgid "to region list"
+msgstr ""
+
+#: sfdb_ui.cc:96 sfdb_ui.cc:116
+msgid "as new tape tracks"
+msgstr ""
+
+#: sfdb_ui.cc:100
+msgid "programming error: unknown import mode string %1"
+msgstr ""
+
+#: sfdb_ui.cc:127
+msgid "Auto-play"
+msgstr ""
+
+#: sfdb_ui.cc:135 sfdb_ui.cc:324
+msgid "<b>Sound File Information</b>"
+msgstr ""
+
+#: sfdb_ui.cc:147
+msgid "Timestamp:"
+msgstr ""
+
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
+msgid "Tags:"
+msgstr ""
+
+#: sfdb_ui.cc:297
+msgid "<b>Midi File Information</b>"
+msgstr ""
+
+#: sfdb_ui.cc:530
+msgid "SoundFileBox: Could not tokenize string: "
+msgstr ""
+
+#: sfdb_ui.cc:550 sfdb_ui.cc:552
+msgid "Search"
+msgstr ""
+
+#: sfdb_ui.cc:581
+msgid "Audio and MIDI files"
+msgstr ""
+
+#: sfdb_ui.cc:584
+msgid "Audio files"
+msgstr ""
+
+#: sfdb_ui.cc:587
+msgid "MIDI files"
+msgstr ""
+
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
+msgid "All files"
+msgstr ""
+
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
+msgid "Browse Files"
+msgstr ""
+
+#: sfdb_ui.cc:638
+msgid "Paths"
+msgstr ""
+
+#: sfdb_ui.cc:647
+msgid "Search Tags"
+msgstr ""
+
+#: sfdb_ui.cc:664
+msgid "Sort:"
+msgstr ""
+
+#: sfdb_ui.cc:672
+msgid "Longest"
+msgstr ""
+
+#: sfdb_ui.cc:673
+msgid "Shortest"
+msgstr ""
+
+#: sfdb_ui.cc:674
+msgid "Newest"
+msgstr ""
+
+#: sfdb_ui.cc:675
+msgid "Oldest"
+msgstr ""
+
+#: sfdb_ui.cc:676
+msgid "Most downloaded"
+msgstr ""
+
+#: sfdb_ui.cc:677
+msgid "Least downloaded"
+msgstr ""
+
+#: sfdb_ui.cc:678
+msgid "Highest rated"
+msgstr ""
+
+#: sfdb_ui.cc:679
+msgid "Lowest rated"
+msgstr ""
+
+#: sfdb_ui.cc:684
+msgid "More"
+msgstr ""
+
+#: sfdb_ui.cc:688
+msgid "Similar"
+msgstr ""
+
+#: sfdb_ui.cc:700
+msgid "ID"
+msgstr ""
+
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
+msgid "Filename"
+msgstr ""
+
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
+msgid "Duration"
+msgstr ""
+
+#: sfdb_ui.cc:704
+msgid "Size"
+msgstr ""
+
+#: sfdb_ui.cc:705
+msgid "Samplerate"
+msgstr ""
+
+#: sfdb_ui.cc:706
+msgid "License"
+msgstr ""
+
+#: sfdb_ui.cc:724
+msgid "Search Freesound"
+msgstr ""
+
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr ""
+
+#: sfdb_ui.cc:742
+msgid "Press to close this window without importing any files"
+msgstr ""
+
+#: sfdb_ui.cc:937
+msgid "SoundFileBrowser: Could not tokenize string: "
+msgstr ""
+
+#: sfdb_ui.cc:1137
+msgid "%1 more page of 100 results available"
+msgid_plural "%1 more pages of 100 results available"
+msgstr[0] ""
+msgstr[1] ""
+
+#: sfdb_ui.cc:1142
+msgid "No more results available"
+msgstr ""
+
+#: sfdb_ui.cc:1206
+msgid "B"
+msgstr ""
+
+#: sfdb_ui.cc:1208
+msgid "kB"
+msgstr ""
+
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
+msgid "MB"
+msgstr ""
+
+#: sfdb_ui.cc:1214
+msgid "GB"
+msgstr ""
+
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
+msgid "one track per file"
+msgstr ""
+
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
+msgid "one track per channel"
+msgstr ""
+
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
+msgid "sequence files"
+msgstr ""
+
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
+msgid "all files in one track"
+msgstr ""
+
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
+msgid "merge files"
+msgstr ""
+
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
+msgid "one region per file"
+msgstr ""
+
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
+msgid "one region per channel"
+msgstr ""
+
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
+msgid "all files in one region"
+msgstr ""
+
+#: sfdb_ui.cc:1527
+msgid ""
+"One or more of the selected files\n"
+"cannot be used by %1"
+msgstr ""
+
+#: sfdb_ui.cc:1671
+msgid "Copy files to session"
+msgstr ""
+
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
+msgid "file timestamp"
+msgstr ""
+
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
+msgid "edit point"
+msgstr ""
+
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
+msgid "playhead"
+msgstr ""
+
+#: sfdb_ui.cc:1689
+msgid "session start"
+msgstr ""
+
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1700
+msgid "<b>Insert at</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1705
+msgid "<b>Mapping</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1710
+msgid "<b>Conversion quality</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1715
+msgid "<b>Instrument</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
+msgid "Best"
+msgstr ""
+
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
+msgid "Good"
+msgstr ""
+
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
+msgid "Quick"
+msgstr ""
+
+#: sfdb_ui.cc:1738
+msgid "Fastest"
+msgstr ""
+
+#: shuttle_control.cc:64
+msgid "Shuttle speed control (Context-click for options)"
+msgstr ""
+
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
+msgid "Percent"
+msgstr ""
+
+#: shuttle_control.cc:210
+msgid "Units"
+msgstr ""
+
+#: shuttle_control.cc:216 shuttle_control.cc:679
+msgid "Sprung"
+msgstr ""
+
+#: shuttle_control.cc:220 shuttle_control.cc:682
+msgid "Wheel"
+msgstr ""
+
+#: shuttle_control.cc:254
+msgid "Maximum speed"
+msgstr ""
+
+#: shuttle_control.cc:257
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:641
+msgid "Playing"
+msgstr ""
+
+#: shuttle_control.cc:656
+#, c-format
+msgid "<<< %+d semitones"
+msgstr ""
+
+#: shuttle_control.cc:658
+#, c-format
+msgid ">>> %+d semitones"
+msgstr ""
+
+#: soundcloud_export_selector.cc:44
+msgid "User Email"
+msgstr ""
+
+#: soundcloud_export_selector.cc:45
+msgid "Password"
+msgstr ""
+
+#: soundcloud_export_selector.cc:46
+msgid "Make files public"
+msgstr ""
+
+#: soundcloud_export_selector.cc:47
+msgid "Open uploaded files in browser"
+msgstr ""
+
+#: soundcloud_export_selector.cc:48
+msgid "Make files downloadable"
+msgstr ""
+
+#: soundcloud_export_selector.cc:107
+msgid "%1: %2 of %3 bytes uploaded"
+msgstr ""
+
+#: splash.cc:78
+msgid "%1 loading ..."
+msgstr ""
+
+#: speaker_dialog.cc:40
+msgid "Add Speaker"
+msgstr ""
+
+#: speaker_dialog.cc:41
+msgid "Remove Speaker"
+msgstr ""
+
+#: speaker_dialog.cc:63
+msgid "Azimuth:"
+msgstr ""
+
+#: startup.cc:71
+msgid ""
+"Use an external mixer or the hardware mixer of your audio interface.\n"
+"%1 will play NO role in monitoring"
+msgstr ""
+
+#: startup.cc:73
+msgid "Ask %1 to play back material as it is being recorded"
+msgstr ""
+
+#: startup.cc:146
+msgid ""
+"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
+"record, edit and mix multi-track audio. You can produce your own CDs, mix "
+"video soundtracks, or experiment with new ideas about music and sound. \n"
+"\n"
+"There are a few things that need to be configured before you start using the "
+"program.</span> "
+msgstr ""
+
+#: startup.cc:172
+msgid "Welcome to %1"
+msgstr ""
+
+#: startup.cc:195
+msgid "Default folder for %1 sessions"
+msgstr ""
+
+#: startup.cc:201
+msgid ""
+"Each project that you work on with %1 has its own folder.\n"
+"These can require a lot of disk space if you are recording audio.\n"
+"\n"
+"Where would you like new %1 sessions to be stored by default?\n"
+"\n"
+"<i>(You can put new sessions anywhere, this is just a default)</i>"
+msgstr ""
+
+#: startup.cc:224
+msgid "Default folder for new sessions"
+msgstr ""
+
+#: startup.cc:245
+msgid ""
+"While recording instruments or vocals, you probably want to listen to the\n"
+"signal as well as record it. This is called \"monitoring\". There are\n"
+"different ways to do this depending on the equipment you have and the\n"
+"configuration of that equipment. The two most common are presented here.\n"
+"Please choose whichever one is right for your setup.\n"
+"\n"
+"<i>(You can change this preference at any time, via the Preferences dialog)</"
+"i>\n"
+"\n"
+"<i>If you do not understand what this is about, just accept the default.</i>"
+msgstr ""
+
+#: startup.cc:266
+msgid "Monitoring Choices"
+msgstr ""
+
+#: startup.cc:289
+msgid "Use a Master bus directly"
+msgstr ""
+
+#: startup.cc:291
+msgid ""
+"Connect the Master bus directly to your hardware outputs. This is preferable "
+"for simple usage."
+msgstr ""
+
+#: startup.cc:300
+msgid "Use an additional Monitor bus"
+msgstr ""
+
+#: startup.cc:303
+msgid ""
+"Use a Monitor bus between Master bus and hardware outputs for \n"
+"greater control in monitoring without affecting the mix."
+msgstr ""
+
+#: startup.cc:325
+msgid ""
+"<i>You can change this preference at any time via the Preferences dialog.\n"
+"You can also add or remove the monitor section to/from any session.</i>\n"
+"\n"
+"<i>If you do not understand what this is about, just accept the default.</i>"
+msgstr ""
+
+#: startup.cc:336
+msgid "Monitor Section"
+msgstr ""
+
+#: step_entry.cc:59
+msgid "Step Entry: %1"
+msgstr ""
+
+#: step_entry.cc:64
+msgid ">beat"
+msgstr ""
+
+#: step_entry.cc:65
+msgid ">bar"
+msgstr ""
+
+#: step_entry.cc:66
+msgid ">EP"
+msgstr ""
+
+#: step_entry.cc:67
+msgid "sustain"
+msgstr ""
+
+#: step_entry.cc:68
+msgid "rest"
+msgstr ""
+
+#: step_entry.cc:69
+msgid "g-rest"
+msgstr ""
+
+#: step_entry.cc:70
+msgid "back"
+msgstr ""
+
+#: step_entry.cc:191
+msgid "Set note length to a whole note"
+msgstr ""
+
+#: step_entry.cc:192
+msgid "Set note length to a half note"
+msgstr ""
+
+#: step_entry.cc:193
+msgid "Set note length to a quarter note"
+msgstr ""
+
+#: step_entry.cc:194
+msgid "Set note length to a eighth note"
+msgstr ""
+
+#: step_entry.cc:195
+msgid "Set note length to a sixteenth note"
+msgstr ""
+
+#: step_entry.cc:196
+msgid "Set note length to a thirty-second note"
+msgstr ""
+
+#: step_entry.cc:197
+msgid "Set note length to a sixty-fourth note"
+msgstr ""
+
+#: step_entry.cc:276
+msgid "Set volume (velocity) to pianississimo"
+msgstr ""
+
+#: step_entry.cc:277
+msgid "Set volume (velocity) to pianissimo"
+msgstr ""
+
+#: step_entry.cc:278
+msgid "Set volume (velocity) to piano"
+msgstr ""
+
+#: step_entry.cc:279
+msgid "Set volume (velocity) to mezzo-piano"
+msgstr ""
+
+#: step_entry.cc:280
+msgid "Set volume (velocity) to mezzo-forte"
+msgstr ""
+
+#: step_entry.cc:281
+msgid "Set volume (velocity) to forte"
+msgstr ""
+
+#: step_entry.cc:282
+msgid "Set volume (velocity) to fortissimo"
+msgstr ""
+
+#: step_entry.cc:283
+msgid "Set volume (velocity) to fortississimo"
+msgstr ""
+
+#: step_entry.cc:331
+msgid "Stack inserted notes to form a chord"
+msgstr ""
+
+#: step_entry.cc:332
+msgid "Extend selected notes by note length"
+msgstr ""
+
+#: step_entry.cc:333
+msgid "Use undotted note lengths"
+msgstr ""
+
+#: step_entry.cc:334
+msgid "Use dotted (* 1.5) note lengths"
+msgstr ""
+
+#: step_entry.cc:335
+msgid "Use double-dotted (* 1.75) note lengths"
+msgstr ""
+
+#: step_entry.cc:336
+msgid "Use triple-dotted (* 1.875) note lengths"
+msgstr ""
+
+#: step_entry.cc:337
+msgid "Insert a note-length's rest"
+msgstr ""
+
+#: step_entry.cc:338
+msgid "Insert a grid-unit's rest"
+msgstr ""
+
+#: step_entry.cc:339
+msgid "Insert a rest until the next beat"
+msgstr ""
+
+#: step_entry.cc:340
+msgid "Insert a rest until the next bar"
+msgstr ""
+
+#: step_entry.cc:341
+msgid "Insert a bank change message"
+msgstr ""
+
+#: step_entry.cc:342
+msgid "Insert a program change message"
+msgstr ""
+
+#: step_entry.cc:343 step_entry.cc:645
+msgid "Move Insert Position Back by Note Length"
+msgstr ""
+
+#: step_entry.cc:344 step_entry.cc:643
+msgid "Move Insert Position to Edit Point"
+msgstr ""
+
+#: step_entry.cc:401
+msgid "1/Note"
+msgstr ""
+
+#: step_entry.cc:415
+msgid "Octave"
+msgstr ""
+
+#: step_entry.cc:592
+msgid "Insert Note A"
+msgstr ""
+
+#: step_entry.cc:593
+msgid "Insert Note A-sharp"
+msgstr ""
+
+#: step_entry.cc:594
+msgid "Insert Note B"
+msgstr ""
+
+#: step_entry.cc:595
+msgid "Insert Note C"
+msgstr ""
+
+#: step_entry.cc:596
+msgid "Insert Note C-sharp"
+msgstr ""
+
+#: step_entry.cc:597
+msgid "Insert Note D"
+msgstr ""
+
+#: step_entry.cc:598
+msgid "Insert Note D-sharp"
+msgstr ""
+
+#: step_entry.cc:599
+msgid "Insert Note E"
+msgstr ""
+
+#: step_entry.cc:600
+msgid "Insert Note F"
+msgstr ""
+
+#: step_entry.cc:601
+msgid "Insert Note F-sharp"
+msgstr ""
+
+#: step_entry.cc:602
+msgid "Insert Note G"
+msgstr ""
+
+#: step_entry.cc:603
+msgid "Insert Note G-sharp"
+msgstr ""
+
+#: step_entry.cc:605
+msgid "Insert a Note-length Rest"
+msgstr ""
+
+#: step_entry.cc:606
+msgid "Insert a Snap-length Rest"
+msgstr ""
+
+#: step_entry.cc:608 step_entry.cc:609
+msgid "Move to next octave"
+msgstr ""
+
+#: step_entry.cc:611
+msgid "Move to Next Note Length"
+msgstr ""
+
+#: step_entry.cc:612
+msgid "Move to Previous Note Length"
+msgstr ""
+
+#: step_entry.cc:614
+msgid "Increase Note Length"
+msgstr ""
+
+#: step_entry.cc:615
+msgid "Decrease Note Length"
+msgstr ""
+
+#: step_entry.cc:617
+msgid "Move to Next Note Velocity"
+msgstr ""
+
+#: step_entry.cc:618
+msgid "Move to Previous Note Velocity"
+msgstr ""
+
+#: step_entry.cc:620
+msgid "Increase Note Velocity"
+msgstr ""
+
+#: step_entry.cc:621
+msgid "Decrease Note Velocity"
+msgstr ""
+
+#: step_entry.cc:623
+msgid "Switch to the 1st octave"
+msgstr ""
+
+#: step_entry.cc:624
+msgid "Switch to the 2nd octave"
+msgstr ""
+
+#: step_entry.cc:625
+msgid "Switch to the 3rd octave"
+msgstr ""
+
+#: step_entry.cc:626
+msgid "Switch to the 4th octave"
+msgstr ""
+
+#: step_entry.cc:627
+msgid "Switch to the 5th octave"
+msgstr ""
+
+#: step_entry.cc:628
+msgid "Switch to the 6th octave"
+msgstr ""
+
+#: step_entry.cc:629
+msgid "Switch to the 7th octave"
+msgstr ""
+
+#: step_entry.cc:630
+msgid "Switch to the 8th octave"
+msgstr ""
+
+#: step_entry.cc:631
+msgid "Switch to the 9th octave"
+msgstr ""
+
+#: step_entry.cc:632
+msgid "Switch to the 10th octave"
+msgstr ""
+
+#: step_entry.cc:633
+msgid "Switch to the 11th octave"
+msgstr ""
+
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
+msgid "Set Note Length to Whole"
+msgstr ""
+
+#: step_entry.cc:652
+msgid "Set Note Length to 1/2"
+msgstr ""
+
+#: step_entry.cc:654
+msgid "Set Note Length to 1/3"
+msgstr ""
+
+#: step_entry.cc:656
+msgid "Set Note Length to 1/4"
+msgstr ""
+
+#: step_entry.cc:658
+msgid "Set Note Length to 1/8"
+msgstr ""
+
+#: step_entry.cc:660
+msgid "Set Note Length to 1/16"
+msgstr ""
+
+#: step_entry.cc:662
+msgid "Set Note Length to 1/32"
+msgstr ""
+
+#: step_entry.cc:664
+msgid "Set Note Length to 1/64"
+msgstr ""
+
+#: step_entry.cc:669
+msgid "Set Note Velocity to Pianississimo"
+msgstr ""
+
+#: step_entry.cc:671
+msgid "Set Note Velocity to Pianissimo"
+msgstr ""
+
+#: step_entry.cc:673
+msgid "Set Note Velocity to Piano"
+msgstr ""
+
+#: step_entry.cc:675
+msgid "Set Note Velocity to Mezzo-Piano"
+msgstr ""
+
+#: step_entry.cc:677
+msgid "Set Note Velocity to Mezzo-Forte"
+msgstr ""
+
+#: step_entry.cc:679
+msgid "Set Note Velocity to Forte"
+msgstr ""
+
+#: step_entry.cc:681 step_entry.cc:683
+msgid "Set Note Velocity to Fortississimo"
+msgstr ""
+
+#: step_entry.cc:688
+msgid "No Dotted Notes"
+msgstr ""
+
+#: step_entry.cc:689
+msgid "Toggled Dotted Notes"
+msgstr ""
+
+#: step_entry.cc:690
+msgid "Toggled Double-Dotted Notes"
+msgstr ""
+
+#: step_entry.cc:691
+msgid "Toggled Triple-Dotted Notes"
+msgstr ""
+
+#: stereo_panner.cc:129
+#, c-format
+msgid "L:%3d R:%3d Width:%d%%"
+msgstr ""
+
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
+msgid "Stereo Panner"
+msgstr ""
+
+#: stereo_panner_editor.cc:51
+msgid "Width"
+msgstr ""
+
+#: strip_silence_dialog.cc:44
+msgid "Strip Silence"
+msgstr ""
+
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
+msgid "Minimum length"
+msgstr ""
+
+#: strip_silence_dialog.cc:84
+msgid "Fade length"
+msgstr ""
+
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
+msgid "bar:"
+msgstr ""
+
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
+msgid "beat:"
+msgstr ""
+
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
+msgid "Pulse note"
+msgstr ""
+
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
+msgid "Tap tempo"
+msgstr ""
+
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
+msgid "whole"
+msgstr ""
+
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
+msgid "second"
+msgstr ""
+
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
+msgid "third"
+msgstr ""
+
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
+msgid "quarter"
+msgstr ""
+
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
+msgid "eighth"
+msgstr ""
+
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
+msgid "sixteenth"
+msgstr ""
+
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
+msgid "thirty-second"
+msgstr ""
+
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
+msgid "sixty-fourth"
+msgstr ""
+
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
+msgid "one-hundred-twenty-eighth"
+msgstr ""
+
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
+msgid "Beats per minute:"
+msgstr ""
+
+#: tempo_dialog.cc:195
+msgid "Tempo begins at"
+msgstr ""
+
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
+msgid "incomprehensible pulse note type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:498
+msgid "Note value:"
+msgstr ""
+
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
+msgstr ""
+
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
+msgstr ""
+
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
+
+#: theme_manager.cc:53
+msgid "Draw \"flat\" buttons"
+msgstr ""
+
+#: theme_manager.cc:54
+msgid "Blink Rec-Arm buttons"
+msgstr ""
+
+#: theme_manager.cc:55
+msgid "Color regions using their track's color"
+msgstr ""
+
+#: theme_manager.cc:56
+msgid "Show waveform clipping"
+msgstr ""
+
+#: theme_manager.cc:58
+msgid "Waveforms color gradient depth"
+msgstr ""
+
+#: theme_manager.cc:60
+msgid "Timeline item gradient depth"
+msgstr ""
+
+#: theme_manager.cc:61
+msgid "All floating windows are dialogs"
+msgstr ""
+
+#: theme_manager.cc:62
+msgid "Transient windows follow front window."
+msgstr ""
+
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
+msgstr ""
+
+#: theme_manager.cc:64
+msgid "Icon Set"
+msgstr ""
+
+#: theme_manager.cc:132
+msgid ""
+"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
+"\" for some.\n"
+"This may help with some window managers. This requires a restart of %1 to "
+"take effect"
+msgstr ""
+
+#: theme_manager.cc:136
+msgid ""
+"Make transient windows follow the front window when toggling between the "
+"editor and mixer.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
+
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
+
+#: time_axis_view.cc:148
+msgid "Track/Bus name (double click to edit)"
+msgstr ""
+
+#: time_axis_view_item.cc:326
+msgid "new duration %1 frame is out of bounds for %2"
+msgid_plural "new duration of %1 frames is out of bounds for %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: time_fx_dialog.cc:60
+msgid "Quick but Ugly"
+msgstr ""
+
+#: time_fx_dialog.cc:61
+msgid "Skip Anti-aliasing"
+msgstr ""
+
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
+
+#: time_fx_dialog.cc:63
+msgid "Minimize time distortion"
+msgstr ""
+
+#: time_fx_dialog.cc:64
+msgid "Preserve Formants"
+msgstr ""
+
+#: time_fx_dialog.cc:81
+msgid "TimeFXDialog"
+msgstr ""
+
+#: time_fx_dialog.cc:84
+msgid "Pitch Shift Audio"
+msgstr ""
+
+#: time_fx_dialog.cc:86
+msgid "Time Stretch Audio"
+msgstr ""
+
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
+msgid "Octaves:"
+msgstr ""
+
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
+msgid "Semitones:"
+msgstr ""
+
+#: time_fx_dialog.cc:124
+msgid "Cents:"
+msgstr ""
+
+#: time_fx_dialog.cc:132
+msgid "Time|Shift"
+msgstr ""
+
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
+msgid "TimeFXButton"
+msgstr ""
+
+#: time_fx_dialog.cc:193
+msgid "Stretch/Shrink"
+msgstr ""
+
+#: time_fx_dialog.cc:203
+msgid "<b>Progress</b>"
+msgstr ""
+
+#: time_info_box.cc:118
+msgid "Start recording at auto-punch start"
+msgstr ""
+
+#: time_info_box.cc:119
+msgid "Stop recording at auto-punch end"
+msgstr ""
+
+#: time_selection.cc:40
+msgid "programming error: request for non-existent audio range (%1)!"
+msgstr ""
+
+#: transform_dialog.cc:39
+msgid "this note's"
+msgstr ""
+
+#: transform_dialog.cc:40
+msgid "the previous note's"
+msgstr ""
+
+#: transform_dialog.cc:41
+msgid "this note's index"
+msgstr ""
+
+#: transform_dialog.cc:42
+msgid "the number of notes"
+msgstr ""
+
+#: transform_dialog.cc:43
+msgid "exactly"
+msgstr ""
+
+#: transform_dialog.cc:44
+msgid "a random number from"
+msgstr ""
+
+#: transform_dialog.cc:55
+msgid "equal steps from"
+msgstr ""
+
+#: transform_dialog.cc:58
+msgid "note number"
+msgstr ""
+
+#: transform_dialog.cc:59
+msgid "velocity"
+msgstr ""
+
+#: transform_dialog.cc:60
+msgid "start time"
+msgstr ""
+
+#: transform_dialog.cc:61
+msgid "length"
+msgstr ""
+
+#: transform_dialog.cc:82 transform_dialog.cc:113
+msgid "Transform"
+msgstr ""
+
+#: transform_dialog.cc:91
+msgid "Set "
+msgstr ""
+
+#: transpose_dialog.cc:30
+msgid "Transpose MIDI"
+msgstr ""
+
+#: transpose_dialog.cc:55
+msgid "Transpose"
+msgstr ""
+
+#: ui_config.cc:234 ui_config.cc:422
+msgid "Loading default ui configuration file %1"
+msgstr ""
+
+#: ui_config.cc:237 ui_config.cc:425
+msgid "cannot read default ui configuration file \"%1\""
+msgstr ""
+
+#: ui_config.cc:240 ui_config.cc:430
+msgid "default ui configuration file \"%1\" not loaded successfully."
+msgstr ""
+
+#: ui_config.cc:248
+msgid "Could not find default UI configuration file %1"
+msgstr ""
+
+#: ui_config.cc:289
+msgid "Loading color file %1"
+msgstr ""
+
+#: ui_config.cc:292
+msgid "cannot read color file \"%1\""
+msgstr ""
+
+#: ui_config.cc:297
+msgid "color file \"%1\" not loaded successfully."
+msgstr ""
+
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:403 ui_config.cc:486
+msgid "Color file %1 not saved"
+msgstr ""
+
+#: ui_config.cc:439
+msgid "Loading user ui configuration file %1"
+msgstr ""
+
+#: ui_config.cc:442
+msgid "cannot read ui configuration file \"%1\""
+msgstr ""
+
+#: ui_config.cc:447
+msgid "user ui configuration file \"%1\" not loaded successfully."
+msgstr ""
+
+#: ui_config.cc:455
+msgid "could not find any ui configuration file, canvas will look broken."
+msgstr ""
+
+#: ui_config.cc:476
+msgid "Config file %1 not saved"
+msgstr ""
+
+#: ui_config.cc:720
+msgid "Color %1 not found"
+msgstr ""
+
+#: ui_config.cc:790
+msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
+msgstr ""
+
+#: utils.cc:118 utils.cc:161
+msgid "bad XPM header %1"
+msgstr ""
+
+#: utils.cc:365
+msgid "cannot find XPM file for %1"
+msgstr ""
+
+#: utils.cc:418 utils.cc:448 utils.cc:468
+msgid "default"
+msgstr ""
+
+#: utils.cc:469
+msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
+msgstr ""
+
+#: utils.cc:476
+msgid "cannot find icon image for %1 using %2"
+msgstr ""
+
+#: utils.cc:493 utils.cc:509
+msgid "Caught exception while loading icon named %1"
+msgstr ""
+
+#: utils.cc:759
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
+#: add_video_dialog.cc:55
+msgid "Set Video Track"
+msgstr ""
+
+#: add_video_dialog.cc:63
+msgid "Open Video Monitor Window"
+msgstr ""
+
+#: add_video_dialog.cc:64
+msgid "Adjust Session Framerate to Match Video Framerate"
+msgstr ""
+
+#: add_video_dialog.cc:66
+msgid "Reload docroot"
+msgstr ""
+
+#: add_video_dialog.cc:121
+msgid "Video files"
+msgstr ""
+
+#: add_video_dialog.cc:150
+msgid "<b>Video Information</b>"
+msgstr ""
+
+#: add_video_dialog.cc:153
+msgid "Start:"
+msgstr ""
+
+#: add_video_dialog.cc:159
+msgid "Frame rate:"
+msgstr ""
+
+#: add_video_dialog.cc:162
+msgid "Aspect Ratio:"
+msgstr ""
+
+#: add_video_dialog.cc:245
+msgid "VideoServerIndex"
+msgstr ""
+
+#: add_video_dialog.cc:676
+msgid " %1 fps"
+msgstr ""
+
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:473
+msgid ""
+"Parsing video file info failed. Is the Video Server running? Is the file "
+"readable by the Video Server? Does the docroot match? Is it a video file?"
+msgstr ""
+
+#: video_timeline.cc:511
+msgid ""
+"Failed to set session-framerate: '%1' does not have a corresponding option "
+"setting in %2."
+msgstr ""
+
+#: video_timeline.cc:519
+msgid ""
+"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
+"vs '%3'"
+msgstr ""
+
+#: video_timeline.cc:592
+msgid ""
+"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
+"means that the video server was not started by %1 and uses a different "
+"document-root."
+msgstr ""
+
+#: video_timeline.cc:729
+msgid ""
+"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
+"(a custom path to xjadeo can be specified by setting the XJREMOTE "
+"environment variable. It should point to an application compatible with "
+"xjadeo's remote-control interface 'xjremote').\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+
+#: video_timeline.cc:744
+msgid "Video-monitor 'xjadeo' cannot be launched."
+msgstr ""
+
+#: video_timeline.cc:776
+msgid ""
+"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
+"later. http://xjadeo.sf.net/"
+msgstr ""
+
+#: video_monitor.cc:283
+msgid "Video Monitor: File Not Found."
+msgstr ""
+
+#: transcode_ffmpeg.cc:56
+msgid ""
+"ffmpeg installation was not found on this system.\n"
+"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
+"\n"
+"The tools are included with the %1 releases from ardour.org and also "
+"available with the video-server at http://x42.github.com/harvid/\n"
+"\n"
+"Important: the files need to be installed in $PATH and named ffmpeg_harvid "
+"and ffprobe_harvid.\n"
+"If you already have a suitable ffmpeg installation on your system, we "
+"recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
+"ffprobe to ffprobe_harvid.\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+
+#: transcode_video_dialog.cc:56
+msgid "Transcode/Import Video File "
+msgstr ""
+
+#: transcode_video_dialog.cc:58
+msgid "Output File:"
+msgstr ""
+
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
+msgid "Abort"
+msgstr ""
+
+#: transcode_video_dialog.cc:63
+msgid "Height = "
+msgstr ""
+
+#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
+msgid "Manual Override"
+msgstr ""
+
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
+msgid "Debug Mode: Print ffmpeg command and output to stdout."
+msgstr ""
+
+#: transcode_video_dialog.cc:107
+msgid "<b>File Information</b>"
+msgstr ""
+
+#: transcode_video_dialog.cc:113
+msgid ""
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
+msgstr ""
+
+#: transcode_video_dialog.cc:120
+msgid ""
+"File-info can not be read. Most likely '%1' is not a valid video-file or an "
+"unsupported video codec or format."
+msgstr ""
+
+#: transcode_video_dialog.cc:137
+msgid "FPS:"
+msgstr ""
+
+#: transcode_video_dialog.cc:141
+msgid "Codec:"
+msgstr ""
+
+#: transcode_video_dialog.cc:143
+msgid "Geometry:"
+msgstr ""
+
+#: transcode_video_dialog.cc:158
+msgid "??"
+msgstr ""
+
+#: transcode_video_dialog.cc:179
+msgid "<b>Import Settings</b>"
+msgstr ""
+
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
+msgstr ""
+
+#: transcode_video_dialog.cc:185
+msgid "Import/Transcode Video to Session"
+msgstr ""
+
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
+msgid "Do Not Import Video (Audio Import Only)"
+msgstr ""
+
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
+msgid "Scale Video: Width = "
+msgstr ""
+
+#: transcode_video_dialog.cc:230
+msgid "Original Width"
+msgstr ""
+
+#: transcode_video_dialog.cc:245
+msgid "Bitrate (KBit/s):"
+msgstr ""
+
+#: transcode_video_dialog.cc:250
+msgid "Extract Audio:"
+msgstr ""
+
+#: transcode_video_dialog.cc:255
+msgid "No Audio Track Present"
+msgstr ""
+
+#: transcode_video_dialog.cc:258
+msgid "Do Not Extract Audio"
+msgstr ""
+
+#: transcode_video_dialog.cc:374
+msgid "Extracting Audio.."
+msgstr ""
+
+#: transcode_video_dialog.cc:377
+msgid "Audio Extraction Failed."
+msgstr ""
+
+#: transcode_video_dialog.cc:403
+msgid "Transcoding Video.."
+msgstr ""
+
+#: transcode_video_dialog.cc:437
+msgid "Transcoding Failed."
+msgstr ""
+
+#: transcode_video_dialog.cc:541
+msgid "Save Transcoded Video File"
+msgstr ""
+
+#: video_server_dialog.cc:52
+msgid "Launch Video Server"
+msgstr ""
+
+#: video_server_dialog.cc:53
+msgid "Server Executable:"
+msgstr ""
+
+#: video_server_dialog.cc:55
+msgid "Server Docroot:"
+msgstr ""
+
+#: video_server_dialog.cc:61
+msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
+msgstr ""
+
+#: video_server_dialog.cc:94
+msgid ""
+"The external video server 'harvid' can not be found.\n"
+"The tool is included with the %1 releases from ardour.org, alternatively you "
+"can download it from http://x42.github.com/harvid/ or acquire it from your "
+"distribution.\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+
+#: video_server_dialog.cc:126
+msgid "Listen Address:"
+msgstr ""
+
+#: video_server_dialog.cc:131
+msgid "Listen Port:"
+msgstr ""
+
+#: video_server_dialog.cc:136
+msgid "Cache Size:"
+msgstr ""
+
+#: video_server_dialog.cc:142
+msgid ""
+"%1 relies on an external video server for the videotimeline.\n"
+"The server configured in Edit -> Preferences -> Video is not reachable.\n"
+"Do you want %1 to launch 'harvid' on this machine?"
+msgstr ""
+
+#: video_server_dialog.cc:186
+msgid "Set Video Server Executable"
+msgstr ""
+
+#: video_server_dialog.cc:206
+msgid "Server docroot"
+msgstr ""
+
+#: utils_videotl.cc:63
+msgid "Destination is outside Video Server's docroot. "
+msgstr ""
+
+#: utils_videotl.cc:64
+msgid ""
+"The destination file path is outside of the Video Server's docroot. The file "
+"will not be readable by the Video Server. Do you still want to continue?"
+msgstr ""
+
+#: utils_videotl.cc:67
+msgid "Continue"
+msgstr ""
+
+#: utils_videotl.cc:74
+msgid "Confirm Overwrite"
+msgstr ""
+
+#: utils_videotl.cc:84 utils_videotl.cc:100
+msgid "Cannot create video folder \"%1\" (%2)"
+msgstr ""
+
+#: export_video_dialog.cc:67
+msgid "Export Video File "
+msgstr ""
+
+#: export_video_dialog.cc:78
+msgid "Video:"
+msgstr ""
+
+#: export_video_dialog.cc:83
+msgid "Scale Video (W x H):"
+msgstr ""
+
+#: export_video_dialog.cc:84
+msgid "Retain Aspect"
+msgstr ""
+
+#: export_video_dialog.cc:89
+msgid "Set Aspect Ratio:"
+msgstr ""
+
+#: export_video_dialog.cc:90
+msgid "Normalize Audio"
+msgstr ""
+
+#: export_video_dialog.cc:91
+msgid "2 Pass Encoding"
+msgstr ""
+
+#: export_video_dialog.cc:92
+msgid "Codec Optimizations:"
+msgstr ""
+
+#: export_video_dialog.cc:94
+msgid "Deinterlace"
+msgstr ""
+
+#: export_video_dialog.cc:95
+msgid "Use [2] B-frames (MPEG 2 or 4 only)"
+msgstr ""
+
+#: export_video_dialog.cc:96
+msgid "Override FPS (Default is to retain FPS from the input video file):"
+msgstr ""
+
+#: export_video_dialog.cc:97
+msgid "Include Session Metadata"
+msgstr ""
+
+#: export_video_dialog.cc:115
+msgid ""
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
+msgstr ""
+
+#: export_video_dialog.cc:126
+msgid "<b>Output:</b> (file extension defines format)"
+msgstr ""
+
+#: export_video_dialog.cc:136
+msgid "<b>Input Video:</b>"
+msgstr ""
+
+#: export_video_dialog.cc:147
+msgid "Audio:"
+msgstr ""
+
+#: export_video_dialog.cc:149
+msgid "Master Bus"
+msgstr ""
+
+#: export_video_dialog.cc:153
+msgid "from the %1 session's start to the session's end"
+msgstr ""
+
+#: export_video_dialog.cc:156
+msgid "<b>Settings:</b>"
+msgstr ""
+
+#: export_video_dialog.cc:164
+msgid "Range:"
+msgstr ""
+
+#: export_video_dialog.cc:170
+msgid "Video Codec:"
+msgstr ""
+
+#: export_video_dialog.cc:173
+msgid "Video KBit/s:"
+msgstr ""
+
+#: export_video_dialog.cc:176
+msgid "Audio Codec:"
+msgstr ""
+
+#: export_video_dialog.cc:179
+msgid "Audio KBit/s:"
+msgstr ""
+
+#: export_video_dialog.cc:182
+msgid "Audio Samplerate:"
+msgstr ""
+
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
+msgid "(default for format)"
+msgstr ""
+
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
+msgid "(default)"
+msgstr ""
+
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
+msgid "(retain)"
+msgstr ""
+
+#: export_video_dialog.cc:335
+msgid "from 00:00:00:00 to the video's end"
+msgstr ""
+
+#: export_video_dialog.cc:337
+msgid "from the video's start to the video's end"
+msgstr ""
+
+#: export_video_dialog.cc:340
+msgid "Selected range"
+msgstr ""
+
+#: export_video_dialog.cc:561
+msgid "Normalizing audio"
+msgstr ""
+
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
+msgid "Exporting audio"
+msgstr ""
+
+#: export_video_dialog.cc:632
+msgid "Exporting Audio..."
+msgstr ""
+
+#: export_video_dialog.cc:689
+msgid ""
+"Export Video: Cannot query duration of video-file, using duration from "
+"timeline instead."
+msgstr ""
+
+#: export_video_dialog.cc:719
+msgid "Export Video: export-range does not include video."
+msgstr ""
+
+#: export_video_dialog.cc:732
+msgid "Export Video: No Master Out Ports to Connect for Audio Export"
+msgstr ""
+
+#: export_video_dialog.cc:774
+msgid "Encoding Video..."
+msgstr ""
+
+#: export_video_dialog.cc:794
+msgid "Export Video: Video input file cannot be read."
+msgstr ""
+
+#: export_video_dialog.cc:900
+msgid "Encoding Video.. Pass 1/2"
+msgstr ""
+
+#: export_video_dialog.cc:912
+msgid "Encoding Video.. Pass 2/2"
+msgstr ""
+
+#: export_video_dialog.cc:1015
+msgid "Transcoding failed."
+msgstr ""
+
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
+msgid "Save Exported Video File"
+msgstr ""
+
+#: export_video_infobox.cc:33
+msgid "Video Export Info"
+msgstr ""
+
+#: export_video_infobox.cc:34
+msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
+msgstr ""
+
+#: export_video_infobox.cc:46
+msgid "<b>Video Export Info</b>"
+msgstr ""
+
+#: export_video_infobox.cc:51
+msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
+"Video encoding is a non-trivial task with many details.\n"
+"\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
+"\n"
+"Open Manual in Browser? "
+msgstr ""
diff --git a/gtk2_ardour/gtk_pianokeyboard.c b/gtk2_ardour/gtk_pianokeyboard.c
index 8917017..2be8cdf 100644
--- a/gtk2_ardour/gtk_pianokeyboard.c
+++ b/gtk2_ardour/gtk_pianokeyboard.c
@@ -686,7 +686,9 @@ piano_keyboard_new(void)
pk->note_being_pressed_using_mouse = -1;
pk->last_key = 0;
pk->monophonic = FALSE;
+
memset((void *)pk->notes, 0, sizeof(struct PKNote) * NNOTES);
+
pk->key_bindings = g_hash_table_new(g_str_hash, g_str_equal);
bind_keys_qwerty(pk);
diff --git a/gtk2_ardour/gtk_pianokeyboard.h b/gtk2_ardour/gtk_pianokeyboard.h
index 4b188a9..3fd0fc2 100644
--- a/gtk2_ardour/gtk_pianokeyboard.h
+++ b/gtk2_ardour/gtk_pianokeyboard.h
@@ -61,7 +61,7 @@ struct _PianoKeyboard
int note_being_pressed_using_mouse;
int last_key;
gboolean monophonic;
- volatile struct PKNote notes[NNOTES];
+ struct PKNote notes[NNOTES];
/* Table used to translate from PC keyboard character to MIDI note number. */
GHashTable *key_bindings;
};
diff --git a/gtk2_ardour/gui_object.cc b/gtk2_ardour/gui_object.cc
index 3128e61..3f6b79c 100644
--- a/gtk2_ardour/gui_object.cc
+++ b/gtk2_ardour/gui_object.cc
@@ -21,38 +21,26 @@
#include <sstream>
#include "gui_object.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using std::string;
-const string GUIObjectState::xml_node_name (X_("GUIObjectState"));
-
-GUIObjectState::GUIObjectState ()
- : _state (X_("GUIObjectState"))
-{
-
-}
-
-XMLNode *
+/*static*/ XMLNode *
GUIObjectState::get_node (const XMLNode* parent, const string& id)
{
XMLNodeList const & children = parent->children ();
for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
-
if ((*i)->name() != X_("Object")) {
continue;
}
-
- XMLProperty* p = (*i)->property (X_("id"));
- if (p && p->value() == id) {
+ if ((*i)->has_property_with_value(X_("id"), id)) {
return *i;
}
}
-
return 0;
}
-XMLNode *
+/*static*/ XMLNode *
GUIObjectState::get_or_add_node (XMLNode* parent, const string& id)
{
XMLNode* child = get_node (parent, id);
@@ -61,46 +49,53 @@ GUIObjectState::get_or_add_node (XMLNode* parent, const string& id)
child->add_property (X_("id"), id);
parent->add_child_nocopy (*child);
}
-
return child;
}
+
+const string GUIObjectState::xml_node_name (X_("GUIObjectState"));
+
+GUIObjectState::GUIObjectState ()
+ : _state (X_("GUIObjectState"))
+{
+}
+
XMLNode *
GUIObjectState::get_or_add_node (const string& id)
{
- return get_or_add_node (&_state, id);
+ std::map <std::string, XMLNode*>::iterator i = object_map.find (id);
+ if (i != object_map.end()) {
+ return i->second;
+ }
+ //assert (get_node (&_state, id) == 0); // XXX performance penalty due to get_node()
+ XMLNode* child = new XMLNode (X_("Object"));
+ child->add_property (X_("id"), id);
+ _state.add_child_nocopy (*child);
+ object_map[id] = child;
+ return child;
}
-/** Remove node with provided id.
- * @param id property of Object node to look for.
- */
-
void
GUIObjectState::remove_node (const std::string& id)
{
+ object_map.erase (id);
_state.remove_nodes_and_delete(X_("id"), id );
}
-/** Get a string from our state.
- * @param id property of Object node to look for.
- * @param prop_name name of the Object property to return.
- * @param empty if non-0, filled in with true if the property is currently non-existant, otherwise false.
- * @return value of property `prop_name', or empty.
- */
-
string
GUIObjectState::get_string (const string& id, const string& prop_name, bool* empty)
{
- XMLNode* child = get_node (&_state, id);
-
- if (!child) {
+ std::map <std::string, XMLNode*>::const_iterator i = object_map.find (id);
+ if (i == object_map.end()) {
+ //assert (get_node (&_state, id) == 0); // XXX performance penalty due to get_node()
if (empty) {
*empty = true;
}
return string ();
}
+ //assert (get_node (&_state, id) == i->second); // XXX performance penalty due to get_node()
- XMLProperty* p = child->property (prop_name);
+ XMLProperty const * p (i->second->property (prop_name));
if (!p) {
if (empty) {
*empty = true;
@@ -128,7 +123,20 @@ GUIObjectState::set_state (const XMLNode& node)
return -1;
}
+ object_map.clear ();
_state = node;
+
+ XMLNodeList const & children (_state.children ());
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ if ((*i)->name() != X_("Object")) {
+ continue;
+ }
+ XMLProperty const * prop = (*i)->property (X_("id"));
+ if (!prop) {
+ continue;
+ }
+ object_map[prop->value ()] = *i;
+ }
return 0;
}
@@ -142,19 +150,9 @@ std::list<string>
GUIObjectState::all_ids () const
{
std::list<string> ids;
- XMLNodeList const & children = _state.children ();
- for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
- if ((*i)->name() != X_("Object")) {
- continue;
- }
-
- XMLProperty* p = (*i)->property (X_("id"));
- if (p) {
- ids.push_back (p->value ());
- }
+ for (std::map <std::string, XMLNode*>::const_iterator i = object_map.begin ();
+ i != object_map.end (); ++i) {
+ ids.push_back (i->first);
}
-
return ids;
}
-
-
diff --git a/gtk2_ardour/gui_object.h b/gtk2_ardour/gui_object.h
index 39cf579..62eeaa9 100644
--- a/gtk2_ardour/gui_object.h
+++ b/gtk2_ardour/gui_object.h
@@ -33,12 +33,18 @@ class GUIObjectState
public:
GUIObjectState ();
- XMLNode& get_state () const;
- int set_state (const XMLNode&);
-
static const std::string xml_node_name;
void load (const XMLNode&);
+ int set_state (const XMLNode&);
+ XMLNode& get_state () const;
+
+ /** Get a string from our state.
+ * @param id property of Object node to look for.
+ * @param prop_name name of the Object property to return.
+ * @param empty if non-0, filled in with true if the property is currently non-existant, otherwise false.
+ * @return value of property `prop_name', or empty.
+ */
std::string get_string (const std::string& id, const std::string& prop_name, bool* empty = 0);
template<typename T> void set_property (const std::string& id, const std::string& prop_name, const T& val) {
@@ -48,17 +54,26 @@ public:
child->add_property (prop_name.c_str(), s.str());
}
+ /** Remove node with provided id.
+ * @param id property of Object node to look for.
+ */
+ void remove_node (const std::string& id);
std::list<std::string> all_ids () const;
- static XMLNode* get_node (const XMLNode *, const std::string &);
XMLNode* get_or_add_node (const std::string &);
- static XMLNode* get_or_add_node (XMLNode *, const std::string &);
- void remove_node (const std::string& id);
+ static XMLNode* get_node (const XMLNode *, const std::string &);
+ static XMLNode* get_or_add_node (XMLNode *, const std::string &);
private:
+ // no copy construction. object_map saves pointers to _state XMLNodes
+ // use set_state(get_state())
+ GUIObjectState (const GUIObjectState& other);
+
XMLNode _state;
+ // ideally we'd use a O(1) hash table here,
+ // but O(log(N)) is fine already.
+ std::map <std::string, XMLNode*> object_map;
};
-
#endif /* __gtk_ardour_gui_object_h__ */
diff --git a/gtk2_ardour/hit.cc b/gtk2_ardour/hit.cc
index cb9e479..e3a227d 100644
--- a/gtk2_ardour/hit.cc
+++ b/gtk2_ardour/hit.cc
@@ -17,6 +17,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include "evoral/Beats.hpp"
#include "evoral/Note.hpp"
#include "canvas/polygon.h"
diff --git a/gtk2_ardour/icons/ardour.ico b/gtk2_ardour/icons/ardour.ico
index b85a5e1..9cf40da 100644
Binary files a/gtk2_ardour/icons/ardour.ico and b/gtk2_ardour/icons/ardour.ico differ
diff --git a/gtk2_ardour/icons/cursor_z/hide.png b/gtk2_ardour/icons/cursor_z/hide.png
deleted file mode 100755
index 635f32f..0000000
Binary files a/gtk2_ardour/icons/cursor_z/hide.png and /dev/null differ
diff --git a/gtk2_ardour/icons/export_icons.sh b/gtk2_ardour/icons/export_icons.sh
deleted file mode 100755
index 11e5c40..0000000
--- a/gtk2_ardour/icons/export_icons.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#! /bin/bash
-
-# Export one PNG for every icon-size in app-icon_tango.svg. The "targets" layer in the SVG should be hidden.
-
-for s in \
- "ardour-app-icon_tango_256px" \
- "ardour-app-icon_tango_048px" \
- "ardour-app-icon_tango_032px" \
- "ardour-app-icon_tango_022px" \
- "ardour-app-icon_tango_016px" \
- "ardour-app-icon_osx" \
- "ardour-app-icon_osx_mask";
- do inkscape --export-id "$s" --export-png "$s.png" app-icon_tango.svg;
-done
diff --git a/gtk2_ardour/icons/fadein-S1.png b/gtk2_ardour/icons/fadein-S1.png
deleted file mode 100644
index 09d6279..0000000
Binary files a/gtk2_ardour/icons/fadein-S1.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadein-S2.png b/gtk2_ardour/icons/fadein-S2.png
deleted file mode 100644
index d7aaf5f..0000000
Binary files a/gtk2_ardour/icons/fadein-S2.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadein-long-cut.png b/gtk2_ardour/icons/fadein-long-cut.png
deleted file mode 100644
index 578346a..0000000
Binary files a/gtk2_ardour/icons/fadein-long-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadein-short-cut.png b/gtk2_ardour/icons/fadein-short-cut.png
deleted file mode 100644
index 465698f..0000000
Binary files a/gtk2_ardour/icons/fadein-short-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-S1.png b/gtk2_ardour/icons/fadeout-S1.png
deleted file mode 100644
index 6313690..0000000
Binary files a/gtk2_ardour/icons/fadeout-S1.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-S2.png b/gtk2_ardour/icons/fadeout-S2.png
deleted file mode 100644
index 35efbea..0000000
Binary files a/gtk2_ardour/icons/fadeout-S2.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-long-cut.png b/gtk2_ardour/icons/fadeout-long-cut.png
deleted file mode 100644
index 66c9bb5..0000000
Binary files a/gtk2_ardour/icons/fadeout-long-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-short-cut.png b/gtk2_ardour/icons/fadeout-short-cut.png
deleted file mode 100644
index 43c6a57..0000000
Binary files a/gtk2_ardour/icons/fadeout-short-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt.png b/gtk2_ardour/icons/fader_belt.png
deleted file mode 100644
index eefed15..0000000
Binary files a/gtk2_ardour/icons/fader_belt.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_desensitised.png b/gtk2_ardour/icons/fader_belt_desensitised.png
deleted file mode 100644
index 9c7094e..0000000
Binary files a/gtk2_ardour/icons/fader_belt_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h.png b/gtk2_ardour/icons/fader_belt_h.png
deleted file mode 100644
index 3525767..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_desensitised.png b/gtk2_ardour/icons/fader_belt_h_desensitised.png
deleted file mode 100644
index d2952d0..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_medium.png b/gtk2_ardour/icons/fader_belt_h_medium.png
deleted file mode 100644
index 25c1466..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_medium.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_medium_desensitised.png b/gtk2_ardour/icons/fader_belt_h_medium_desensitised.png
deleted file mode 100644
index ff920b7..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_medium_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_thin.png b/gtk2_ardour/icons/fader_belt_h_thin.png
deleted file mode 100644
index b3dec4b..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_thin.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png b/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png
deleted file mode 100644
index c92f38f..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/hide.png b/gtk2_ardour/icons/hide.png
deleted file mode 100644
index 2db8173..0000000
Binary files a/gtk2_ardour/icons/hide.png and /dev/null differ
diff --git a/gtk2_ardour/icons/join_tools.png b/gtk2_ardour/icons/join_tools.png
deleted file mode 100644
index b5159c0..0000000
Binary files a/gtk2_ardour/icons/join_tools.png and /dev/null differ
diff --git a/gtk2_ardour/icons/knob.png b/gtk2_ardour/icons/knob.png
deleted file mode 100644
index 1047e49..0000000
Binary files a/gtk2_ardour/icons/knob.png and /dev/null differ
diff --git a/gtk2_ardour/icons/metronome.png b/gtk2_ardour/icons/metronome.png
deleted file mode 100644
index 656a3d4..0000000
Binary files a/gtk2_ardour/icons/metronome.png and /dev/null differ
diff --git a/gtk2_ardour/icons/midi_panic.png b/gtk2_ardour/icons/midi_panic.png
deleted file mode 100644
index 9163467..0000000
Binary files a/gtk2_ardour/icons/midi_panic.png and /dev/null differ
diff --git a/gtk2_ardour/icons/nudge_left.png b/gtk2_ardour/icons/nudge_left.png
deleted file mode 100644
index c885477..0000000
Binary files a/gtk2_ardour/icons/nudge_left.png and /dev/null differ
diff --git a/gtk2_ardour/icons/nudge_right.png b/gtk2_ardour/icons/nudge_right.png
deleted file mode 100644
index a6c1581..0000000
Binary files a/gtk2_ardour/icons/nudge_right.png and /dev/null differ
diff --git a/gtk2_ardour/icons/rec-safe-disabled.png b/gtk2_ardour/icons/rec-safe-disabled.png
new file mode 100644
index 0000000..10f76de
Binary files /dev/null and b/gtk2_ardour/icons/rec-safe-disabled.png differ
diff --git a/gtk2_ardour/icons/rec-safe-enabled.png b/gtk2_ardour/icons/rec-safe-enabled.png
new file mode 100644
index 0000000..44f2f7e
Binary files /dev/null and b/gtk2_ardour/icons/rec-safe-enabled.png differ
diff --git a/gtk2_ardour/icons/search.png b/gtk2_ardour/icons/search.png
new file mode 100644
index 0000000..0a0db84
Binary files /dev/null and b/gtk2_ardour/icons/search.png differ
diff --git a/gtk2_ardour/icons/step-editing.png b/gtk2_ardour/icons/step-editing.png
deleted file mode 100644
index 3d65495..0000000
Binary files a/gtk2_ardour/icons/step-editing.png and /dev/null differ
diff --git a/gtk2_ardour/icons/strip_width.png b/gtk2_ardour/icons/strip_width.png
deleted file mode 100644
index 99a0e72..0000000
Binary files a/gtk2_ardour/icons/strip_width.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tav_exp.png b/gtk2_ardour/icons/tav_exp.png
deleted file mode 100644
index 0e8daf5..0000000
Binary files a/gtk2_ardour/icons/tav_exp.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tav_shrink.png b/gtk2_ardour/icons/tav_shrink.png
deleted file mode 100644
index 44b4277..0000000
Binary files a/gtk2_ardour/icons/tav_shrink.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_audition.png b/gtk2_ardour/icons/tool_audition.png
deleted file mode 100644
index 409771b..0000000
Binary files a/gtk2_ardour/icons/tool_audition.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_content.png b/gtk2_ardour/icons/tool_content.png
deleted file mode 100644
index 6ab448c..0000000
Binary files a/gtk2_ardour/icons/tool_content.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_cut.png b/gtk2_ardour/icons/tool_cut.png
deleted file mode 100644
index 6aa830f..0000000
Binary files a/gtk2_ardour/icons/tool_cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_gain.png b/gtk2_ardour/icons/tool_gain.png
deleted file mode 100644
index f54be94..0000000
Binary files a/gtk2_ardour/icons/tool_gain.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_note.png b/gtk2_ardour/icons/tool_note.png
deleted file mode 100644
index f0e5760..0000000
Binary files a/gtk2_ardour/icons/tool_note.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_object.png b/gtk2_ardour/icons/tool_object.png
deleted file mode 100644
index 0b5739e..0000000
Binary files a/gtk2_ardour/icons/tool_object.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_object.xpm b/gtk2_ardour/icons/tool_object.xpm
deleted file mode 100644
index b6b2fea..0000000
--- a/gtk2_ardour/icons/tool_object.xpm
+++ /dev/null
@@ -1,54 +0,0 @@
-/* XPM */
-static char * tool_object_xpm[] = {
-"16 12 39 1",
-" c None",
-". c #000000",
-"+ c #0C0C0C",
-"@ c #151515",
-"# c #D1D1D1",
-"$ c #121212",
-"% c #161616",
-"& c #DADADA",
-"* c #131313",
-"= c #D6D6D6",
-"- c #0F0F0F",
-"; c #050505",
-"> c #D3D3D3",
-", c #0A0A0A",
-"' c #070707",
-") c #E5E5E5",
-"! c #292929",
-"~ c #B0B0B0",
-"{ c #262626",
-"] c #5C5C5C",
-"^ c #333333",
-"/ c #0E0E0E",
-"( c #111111",
-"_ c #3D3D3D",
-": c #F4F4F4",
-"< c #FFFFFF",
-"[ c #EBEBEB",
-"} c #D0D0D0",
-"| c #030303",
-"1 c #F1F1F1",
-"2 c #FDFDFD",
-"3 c #C3C3C3",
-"4 c #101010",
-"5 c #141414",
-"6 c #F2F2F2",
-"7 c #4E4E4E",
-"8 c #686868",
-"9 c #0B0B0B",
-"0 c #020202",
-" .+. ",
-" @#$ ",
-" %&* ",
-" +=-.. ",
-" ;>.,,-.. ",
-" .')!~{]^/ ",
-" (_:<<<[}| ",
-" '12<<<<<| ",
-" -~<<<<<34 ",
-" .56<<<<7| ",
-" /8<<<),. ",
-" .9|||0- "};
diff --git a/gtk2_ardour/icons/tool_object_range.png b/gtk2_ardour/icons/tool_object_range.png
deleted file mode 100644
index cd3732e..0000000
Binary files a/gtk2_ardour/icons/tool_object_range.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_range.png b/gtk2_ardour/icons/tool_range.png
deleted file mode 100644
index 10dd90a..0000000
Binary files a/gtk2_ardour/icons/tool_range.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_stretch.png b/gtk2_ardour/icons/tool_stretch.png
deleted file mode 100644
index a599fbe..0000000
Binary files a/gtk2_ardour/icons/tool_stretch.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_zoom.png b/gtk2_ardour/icons/tool_zoom.png
deleted file mode 100644
index f6b5e27..0000000
Binary files a/gtk2_ardour/icons/tool_zoom.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_end.png b/gtk2_ardour/icons/transport_end.png
deleted file mode 100644
index ccba118..0000000
Binary files a/gtk2_ardour/icons/transport_end.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_loop.png b/gtk2_ardour/icons/transport_loop.png
deleted file mode 100644
index c2831c1..0000000
Binary files a/gtk2_ardour/icons/transport_loop.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_play.png b/gtk2_ardour/icons/transport_play.png
deleted file mode 100644
index 07e8969..0000000
Binary files a/gtk2_ardour/icons/transport_play.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_range.png b/gtk2_ardour/icons/transport_range.png
deleted file mode 100644
index bf4473b..0000000
Binary files a/gtk2_ardour/icons/transport_range.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_record.png b/gtk2_ardour/icons/transport_record.png
deleted file mode 100644
index f92b607..0000000
Binary files a/gtk2_ardour/icons/transport_record.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_start.png b/gtk2_ardour/icons/transport_start.png
deleted file mode 100644
index fe05dc2..0000000
Binary files a/gtk2_ardour/icons/transport_start.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_stop.png b/gtk2_ardour/icons/transport_stop.png
deleted file mode 100644
index 05562b1..0000000
Binary files a/gtk2_ardour/icons/transport_stop.png and /dev/null differ
diff --git a/gtk2_ardour/icons/zoom_full.png b/gtk2_ardour/icons/zoom_full.png
deleted file mode 100644
index f8a4eb7..0000000
Binary files a/gtk2_ardour/icons/zoom_full.png and /dev/null differ
diff --git a/gtk2_ardour/icons/zoom_in.png b/gtk2_ardour/icons/zoom_in.png
deleted file mode 100644
index a290fe2..0000000
Binary files a/gtk2_ardour/icons/zoom_in.png and /dev/null differ
diff --git a/gtk2_ardour/icons/zoom_out.png b/gtk2_ardour/icons/zoom_out.png
deleted file mode 100644
index e4fd222..0000000
Binary files a/gtk2_ardour/icons/zoom_out.png and /dev/null differ
diff --git a/gtk2_ardour/insert_remove_time_dialog.cc b/gtk2_ardour/insert_remove_time_dialog.cc
index 8620ba1..0aeca1e 100644
--- a/gtk2_ardour/insert_remove_time_dialog.cc
+++ b/gtk2_ardour/insert_remove_time_dialog.cc
@@ -23,7 +23,7 @@
#include <gtkmm/alignment.h>
#include "insert_remove_time_dialog.h"
#include "audio_clock.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace Editing;
diff --git a/gtk2_ardour/instrument_selector.cc b/gtk2_ardour/instrument_selector.cc
index 5dfa091..ffd11cc 100644
--- a/gtk2_ardour/instrument_selector.cc
+++ b/gtk2_ardour/instrument_selector.cc
@@ -17,10 +17,10 @@
*/
#include "ardour/plugin_manager.h"
-
+#include "gtkmm2ext/gui_thread.h"
#include "instrument_selector.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace ARDOUR;
@@ -28,10 +28,39 @@ using namespace ARDOUR;
InstrumentSelector::InstrumentSelector()
: _reasonable_synth_id(0)
{
+ refill ();
+
+ PluginManager::instance ().PluginListChanged.connect (_update_connection, invalidator (*this), boost::bind (&InstrumentSelector::refill, this), gui_context());
+}
+
+void
+InstrumentSelector::refill()
+{
+ TreeModel::iterator iter = get_active();
+ std::string selected;
+ if (iter) {
+ const TreeModel::Row& row = (*iter);
+ selected = row[_instrument_list_columns.name];
+ }
+
+ unset_model ();
+ clear ();
build_instrument_list();
set_model(_instrument_list);
pack_start(_instrument_list_columns.name);
- set_active(_reasonable_synth_id);
+ if (selected.empty ()) {
+ set_active(_reasonable_synth_id);
+ } else {
+ TreeModel::Children rows = _instrument_list->children();
+ TreeModel::Children::iterator i;
+ for (i = rows.begin(); i != rows.end(); ++i) {
+ std::string cn = (*i)[_instrument_list_columns.name];
+ if (cn == selected) {
+ set_active(*i);
+ break;
+ }
+ }
+ }
set_button_sensitivity(Gtk::SENSITIVITY_AUTO);
}
@@ -42,6 +71,7 @@ InstrumentSelector::build_instrument_list()
PluginInfoList all_plugs;
all_plugs.insert(all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
+ all_plugs.insert(all_plugs.end(), manager.lua_plugin_info().begin(), manager.lua_plugin_info().end());
#ifdef WINDOWS_VST_SUPPORT
all_plugs.insert(all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
#endif
diff --git a/gtk2_ardour/instrument_selector.h b/gtk2_ardour/instrument_selector.h
index 81beff6..7fe6c8c 100644
--- a/gtk2_ardour/instrument_selector.h
+++ b/gtk2_ardour/instrument_selector.h
@@ -26,6 +26,8 @@
#include <gtkmm/treemodel.h>
#include <gtkmm/liststore.h>
+#include "pbd/signals.h"
+
#include "ardour/plugin.h"
#include "ardour/types.h"
#include "ardour/template_utils.h"
@@ -52,10 +54,12 @@ private:
};
void build_instrument_list();
+ void refill();
Glib::RefPtr<Gtk::ListStore> _instrument_list;
InstrumentListColumns _instrument_list_columns;
uint32_t _reasonable_synth_id;
+ PBD::ScopedConnection _update_connection;
};
#endif /* __gtk_ardour_instrument_selector_h__ */
diff --git a/gtk2_ardour/interthread_progress_window.cc b/gtk2_ardour/interthread_progress_window.cc
index e63bf62..c74f129 100644
--- a/gtk2_ardour/interthread_progress_window.cc
+++ b/gtk2_ardour/interthread_progress_window.cc
@@ -22,7 +22,7 @@
#include "gtkmm2ext/utils.h"
#include "ardour/import_status.h"
#include "interthread_progress_window.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -50,12 +50,22 @@ InterthreadProgressWindow::InterthreadProgressWindow (ARDOUR::InterThreadInfo* i
set_default_size (200, 100);
show_all ();
- hide ();
+ hide ();
+ _interthread_info->cancel = false; // override on_hide
Glib::signal_timeout().connect (sigc::mem_fun (*this, &InterthreadProgressWindow::update), 100);
}
void
+InterthreadProgressWindow::on_hide ()
+{
+ if (_interthread_info && !_interthread_info->done) {
+ //catch user pressing 'esc' or WM close
+ _interthread_info->cancel = true;
+ }
+}
+
+void
InterthreadProgressWindow::cancel_clicked ()
{
_interthread_info->cancel = true;
diff --git a/gtk2_ardour/interthread_progress_window.h b/gtk2_ardour/interthread_progress_window.h
index 653ec46..ee7b58e 100644
--- a/gtk2_ardour/interthread_progress_window.h
+++ b/gtk2_ardour/interthread_progress_window.h
@@ -42,6 +42,7 @@ public:
protected:
virtual bool update ();
+ virtual void on_hide ();
Gtk::Button _cancel_button;
Gtk::Label _cancel_label;
diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc
index 574b3cd..6d0ede3 100644
--- a/gtk2_ardour/io_selector.cc
+++ b/gtk2_ardour/io_selector.cc
@@ -33,7 +33,7 @@
#include "io_selector.h"
#include "utils.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
diff --git a/gtk2_ardour/keyboard.cc b/gtk2_ardour/keyboard.cc
index 79f83a4..6341071 100644
--- a/gtk2_ardour/keyboard.cc
+++ b/gtk2_ardour/keyboard.cc
@@ -20,6 +20,7 @@
#include "pbd/convert.h"
#include "pbd/error.h"
#include "pbd/file_utils.h"
+#include "pbd/basename.h"
#include "ardour/filesystem_paths.h"
@@ -27,8 +28,9 @@
#include "public_editor.h"
#include "keyboard.h"
#include "opts.h"
+#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -36,19 +38,7 @@ using namespace PBD;
using namespace ARDOUR;
using Gtkmm2ext::Keyboard;
-static void
-accel_map_changed (GtkAccelMap* /*map*/,
- gchar* /*path*/,
- guint /*key*/,
- GdkModifierType /*mod*/,
- gpointer keyboard)
-{
- ArdourKeyboard* me = (ArdourKeyboard*)keyboard;
- Keyboard::keybindings_changed ();
- me->ui.setup_tooltips ();
-}
-
-#ifdef GTKOSX
+#ifdef __APPLE__
guint ArdourKeyboard::constraint_mod = Keyboard::PrimaryModifier;
#else
guint ArdourKeyboard::constraint_mod = Keyboard::SecondaryModifier;
@@ -61,21 +51,42 @@ guint ArdourKeyboard::push_points_mod = Keyboard::PrimaryModifier;
guint ArdourKeyboard::note_size_relative_mod = Keyboard::PrimaryModifier;
void
+ArdourKeyboard::find_bindings_files (map<string,string>& files)
+{
+ vector<std::string> found;
+ Searchpath spath = ardour_config_search_path();
+
+ find_files_matching_pattern (found, spath, string_compose ("*%1", Keyboard::binding_filename_suffix));
+
+ if (found.empty()) {
+ return;
+ }
+
+ for (vector<std::string>::iterator x = found.begin(); x != found.end(); ++x) {
+ std::string path(*x);
+ pair<string,string> namepath;
+ namepath.second = path;
+ namepath.first = PBD::basename_nosuffix (path);
+ files.insert (namepath);
+ }
+}
+
+void
ArdourKeyboard::setup_keybindings ()
{
using namespace ARDOUR_COMMAND_LINE;
- string default_bindings = "mnemonic-us.bindings";
+ string default_bindings = string_compose ("%1%2", UIConfiguration::instance().get_default_bindings(), Keyboard::binding_filename_suffix);
vector<string> strs;
binding_files.clear ();
- ARDOUR::find_bindings_files (binding_files);
+ find_bindings_files (binding_files);
/* set up the per-user bindings path */
string lowercase_program_name = downcase (string(PROGRAM_NAME));
- user_keybindings_path = Glib::build_filename (user_config_directory(), lowercase_program_name + ".bindings");
+ user_keybindings_path = Glib::build_filename (user_config_directory(), lowercase_program_name + binding_filename_suffix);
if (Glib::file_test (user_keybindings_path, Glib::FILE_TEST_EXISTS)) {
std::pair<string,string> newpair;
@@ -84,11 +95,10 @@ ArdourKeyboard::setup_keybindings ()
binding_files.insert (newpair);
}
- /* check to see if they gave a style name ("SAE", "ergonomic") or
- an actual filename (*.bindings)
+ /* check to see if they gave a style name ("ergonomic") or an actual filename (*.bindings)
*/
- if (!keybindings_path.empty() && keybindings_path.find (".bindings") == string::npos) {
+ if (!keybindings_path.empty() && keybindings_path.find (binding_filename_suffix) == string::npos) {
// just a style name - allow user to
// specify the layout type.
@@ -109,7 +119,7 @@ ArdourKeyboard::setup_keybindings ()
keybindings_path += "-us";
}
- keybindings_path += ".bindings";
+ keybindings_path += binding_filename_suffix;
}
if (keybindings_path.empty()) {
@@ -132,6 +142,8 @@ ArdourKeyboard::setup_keybindings ()
keybindings_path = default_bindings;
}
+ cerr << "KP is " << keybindings_path << endl;
+
while (true) {
if (!Glib::path_is_absolute (keybindings_path)) {
@@ -139,7 +151,7 @@ ArdourKeyboard::setup_keybindings ()
/* not absolute - look in the usual places */
std::string keybindings_file;
- if ( ! find_file (ardour_config_search_path(), keybindings_path, keybindings_file)) {
+ if (!find_file (ardour_config_search_path(), keybindings_path, keybindings_file)) {
if (keybindings_path == default_bindings) {
error << string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME) << endmsg;
@@ -178,12 +190,14 @@ ArdourKeyboard::setup_keybindings ()
}
}
+ info << string_compose (_("Loading keybindings from %1"), keybindings_path) << endmsg;
+
load_keybindings (keybindings_path);
- /* catch changes */
+ /* catch changes made via some GTK mechanism */
- GtkAccelMap* accelmap = gtk_accel_map_get();
- g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
+ // GtkAccelMap* accelmap = gtk_accel_map_get();
+ // g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
}
XMLNode&
@@ -213,7 +227,7 @@ ArdourKeyboard::get_state (void)
int
ArdourKeyboard::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("constraint-modifier")) != 0) {
sscanf (prop->value().c_str(), "%d", &constraint_mod);
diff --git a/gtk2_ardour/keyboard.h b/gtk2_ardour/keyboard.h
index 9ca6095..c6a05ab 100644
--- a/gtk2_ardour/keyboard.h
+++ b/gtk2_ardour/keyboard.h
@@ -20,6 +20,9 @@
#ifndef __ardour_keyboard_h__
#define __ardour_keyboard_h__
+#include <map>
+#include <string>
+
#include "ardour/types.h"
#include "gtkmm2ext/keyboard.h"
@@ -93,6 +96,8 @@ private:
static guint fine_adjust_mod;
static guint push_points_mod;
static guint note_size_relative_mod;
+
+ void find_bindings_files (std::map<std::string,std::string>& files);
};
#endif /* __ardour_keyboard_h__ */
diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc
index cbbbfaf..b19b6d5 100644
--- a/gtk2_ardour/keyeditor.cc
+++ b/gtk2_ardour/keyeditor.cc
@@ -22,6 +22,13 @@
#endif
#include <map>
+#include <fstream>
+#include <sstream>
+
+#include <boost/algorithm/string.hpp>
+
+#include <glib.h>
+#include <glib/gstdio.h>
#include <gtkmm/stock.h>
#include <gtkmm/label.h>
@@ -29,8 +36,11 @@
#include <gtkmm/accelmap.h>
#include <gtkmm/uimanager.h>
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/utils.h"
+#include "pbd/error.h"
+#include "pbd/openuri.h"
#include "pbd/strsplit.h"
#include "ardour/filesystem_paths.h"
@@ -40,7 +50,7 @@
#include "keyboard.h"
#include "keyeditor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -48,272 +58,515 @@ using namespace Gdk;
using namespace PBD;
using Gtkmm2ext::Keyboard;
+using Gtkmm2ext::Bindings;
+
+sigc::signal<void> KeyEditor::UpdateBindings;
+
+void bindings_collision_dialog (Gtk::Window& parent)
+{
+ ArdourDialog dialog (parent, _("Colliding keybindings"), true);
+ Label label (_("The key sequence is already bound. Please remove the other binding first."));
+
+ dialog.get_vbox()->pack_start (label, true, true);
+ dialog.add_button (_("Ok"), Gtk::RESPONSE_ACCEPT);
+ dialog.show_all ();
+ dialog.run();
+}
KeyEditor::KeyEditor ()
: ArdourWindow (_("Key Bindings"))
, unbind_button (_("Remove shortcut"))
, unbind_box (BUTTONBOX_END)
-
+ , filter_entry (_("Search..."), true)
+ , filter_string("")
+ , print_button (_("Print"))
+ , sort_column(0)
+ , sort_type(Gtk::SORT_ASCENDING)
{
- last_keyval = 0;
- model = TreeStore::create(columns);
+ notebook.signal_switch_page ().connect (sigc::mem_fun (*this, &KeyEditor::page_change));
- view.set_model (model);
- view.append_column (_("Action"), columns.action);
- view.append_column (_("Shortcut"), columns.binding);
- view.set_headers_visible (true);
- view.get_selection()->set_mode (SELECTION_SINGLE);
- view.set_reorderable (false);
- view.set_size_request (500,300);
- view.set_enable_search (false);
- view.set_rules_hint (true);
- view.set_name (X_("KeyEditorTree"));
-
- view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &KeyEditor::action_selected));
-
- scroller.add (view);
- scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-
- vpacker.set_spacing (6);
- vpacker.set_border_width (12);
- vpacker.pack_start (scroller);
+ vpacker.pack_start (notebook, true, true);
- if (!ARDOUR::Profile->get_sae()) {
+ Glib::RefPtr<Gdk::Pixbuf> icon = ARDOUR_UI_UTILS::get_icon ("search");
+ filter_entry.set_icon_from_pixbuf (icon);
+ filter_entry.set_icon_tooltip_text (_("Click to reset search string"));
+ filter_entry.signal_search_string_updated ().connect (sigc::mem_fun (*this, &KeyEditor::search_string_updated));
+ vpacker.pack_start (filter_entry, false, false);
- Label* hint = manage (new Label (_("Select an action, then press the key(s) to (re)set its shortcut")));
- hint->show ();
- unbind_box.set_spacing (6);
- unbind_box.pack_start (*hint, false, true);
- unbind_box.pack_start (unbind_button, false, false);
- unbind_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::unbind));
+ Label* hint = manage (new Label (_("To remove a shortcut select an action then press this: ")));
+ hint->show ();
+ unbind_box.set_spacing (6);
+ unbind_box.pack_start (*hint, false, true);
+ unbind_box.pack_start (unbind_button, false, false);
+ unbind_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::unbind));
- vpacker.pack_start (unbind_box, false, false);
- unbind_box.show ();
- unbind_button.show ();
-
- }
+ vpacker.pack_start (unbind_box, false, false);
+ unbind_box.show ();
+ unbind_button.show ();
reset_button.add (reset_label);
reset_label.set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("Reset Bindings to Defaults")));
+ print_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::print));
+
reset_box.pack_start (reset_button, true, false);
+ reset_box.pack_start (print_button, true, false);
reset_box.show ();
reset_button.show ();
reset_label.show ();
+ print_button.show ();
reset_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::reset));
vpacker.pack_start (reset_box, false, false);
add (vpacker);
- view.show ();
- scroller.show ();
- vpacker.show ();
-
unbind_button.set_sensitive (false);
+ UpdateBindings.connect (sigc::mem_fun (*this, &KeyEditor::refresh));
}
void
-KeyEditor::unbind ()
+KeyEditor::add_tab (string const & name, Bindings& bindings)
{
- TreeModel::iterator i = view.get_selection()->get_selected();
+ Tab* t = new Tab (*this, name, &bindings);
- unbind_button.set_sensitive (false);
+ if (t->populate () == 0) {
+ /* no bindings */
+ delete t;
+ return;
+ }
- if (i != model->children().end()) {
- string path = (*i)[columns.path];
+ tabs.push_back (t);
+ t->show_all ();
+ notebook.append_page (*t, name);
+}
- if (!(*i)[columns.bindable]) {
- return;
- }
- bool result = AccelMap::change_entry (path,
- 0,
- (ModifierType) 0,
- true);
- if (result) {
- (*i)[columns.binding] = string ();
+void
+KeyEditor::remove_tab (string const &name)
+{
+ guint npages = notebook.get_n_pages ();
+
+ for (guint n = 0; n < npages; ++n) {
+ Widget* w = notebook.get_nth_page (n);
+ Tab* tab = dynamic_cast<Tab*> (w);
+ if (tab) {
+ if (tab->name == name) {
+ notebook.remove_page (*w);
+ return;
+ }
}
}
+ cerr << "Removed " << name << endl;
}
void
-KeyEditor::on_show ()
+KeyEditor::unbind ()
{
- populate ();
- view.get_selection()->unselect_all ();
- ArdourWindow::on_show ();
+ current_tab()->unbind ();
}
void
-KeyEditor::on_unmap ()
+KeyEditor::page_change (GtkNotebookPage*, guint)
{
- ArdourWindow::on_unmap ();
+ current_tab()->view.get_selection()->unselect_all ();
+ unbind_button.set_sensitive (false);
}
-void
-KeyEditor::action_selected ()
+bool
+KeyEditor::Tab::key_press_event (GdkEventKey* ev)
{
- if (view.get_selection()->count_selected_rows() == 0) {
- return;
+ if (view.get_selection()->count_selected_rows() != 1) {
+ return false;
}
- TreeModel::iterator i = view.get_selection()->get_selected();
+ if (!ev->is_modifier) {
+ last_keyval = ev->keyval;
+ }
- unbind_button.set_sensitive (false);
+ /* Don't let anything else handle the key press, because navigation
+ * keys will be used by GTK to change the selection/treeview cursor
+ * position
+ */
- if (i != model->children().end()) {
+ return true;
+}
- string path = (*i)[columns.path];
+bool
+KeyEditor::Tab::key_release_event (GdkEventKey* ev)
+{
+ if (view.get_selection()->count_selected_rows() != 1) {
+ return false;
+ }
- if (!(*i)[columns.bindable]) {
- return;
- }
+ if (last_keyval == 0) {
+ return false;
+ }
- string binding = (*i)[columns.binding];
+ owner.current_tab()->bind (ev, last_keyval);
- if (!binding.empty()) {
- unbind_button.set_sensitive (true);
- }
- }
+ last_keyval = 0;
+ return true;
}
-bool
-KeyEditor::on_key_press_event (GdkEventKey* ev)
+KeyEditor::Tab::Tab (KeyEditor& ke, string const & str, Bindings* b)
+ : owner (ke)
+ , name (str)
+ , bindings (b)
+ , last_keyval (0)
{
- if (!ev->is_modifier) {
- last_keyval = ev->keyval;
- }
- return ArdourWindow::on_key_press_event (ev);
+ data_model = TreeStore::create(columns);
+ populate ();
+
+ filter = TreeModelFilter::create(data_model);
+ filter->set_visible_func (sigc::mem_fun (*this, &Tab::visible_func));
+
+ sorted_filter = TreeModelSort::create(filter);
+
+ view.set_model (sorted_filter);
+ view.append_column (_("Action"), columns.name);
+ view.append_column (_("Shortcut"), columns.binding);
+ view.set_headers_visible (true);
+ view.set_headers_clickable (true);
+ view.get_selection()->set_mode (SELECTION_SINGLE);
+ view.set_reorderable (false);
+ view.set_size_request (500,300);
+ view.set_enable_search (false);
+ view.set_rules_hint (true);
+ view.set_name (X_("KeyEditorTree"));
+
+ view.signal_cursor_changed().connect (sigc::mem_fun (*this, &Tab::action_selected));
+ view.signal_key_press_event().connect (sigc::mem_fun (*this, &Tab::key_press_event), false);
+ view.signal_key_release_event().connect (sigc::mem_fun (*this, &Tab::key_release_event), false);
+
+ view.get_column(0)->set_sort_column (columns.name);
+ view.get_column(1)->set_sort_column (columns.binding);
+ data_model->set_sort_column (owner.sort_column, owner.sort_type);
+ data_model->signal_sort_column_changed().connect (sigc::mem_fun (*this, &Tab::sort_column_changed));
+
+ signal_map().connect (sigc::mem_fun (*this, &Tab::tab_mapped));
+
+ scroller.add (view);
+ scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+
+ set_spacing (6);
+ set_border_width (12);
+ pack_start (scroller);
}
-bool
-KeyEditor::on_key_release_event (GdkEventKey* ev)
+void
+KeyEditor::Tab::action_selected ()
{
- if (ARDOUR::Profile->get_sae() || last_keyval == 0) {
- return false;
+ if (view.get_selection()->count_selected_rows() == 0) {
+ return;
}
- TreeModel::iterator i = view.get_selection()->get_selected();
+ TreeModel::const_iterator it = view.get_selection()->get_selected();
- if (i != model->children().end()) {
- string path = (*i)[columns.path];
+ if (!it) {
+ return;
+ }
- if (!(*i)[columns.bindable]) {
- goto out;
- }
+ if (!(*it)[columns.bindable]) {
+ owner.unbind_button.set_sensitive (false);
+ return;
+ }
- GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & ev->state);
+ const string& binding = (*it)[columns.binding];
- Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (ev->keyval);
- Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator (mod);
+ if (!binding.empty()) {
+ owner.unbind_button.set_sensitive (true);
+ }
+}
+
+void
+KeyEditor::Tab::unbind ()
+{
+ const std::string& action_path = (*view.get_selection()->get_selected())[columns.path];
- bool result = AccelMap::change_entry (path,
- last_keyval,
- Gdk::ModifierType(mod),
- true);
+ TreeModel::iterator it = find_action_path (data_model->children().begin(), data_model->children().end(), action_path);
- if (result) {
- AccelKey key;
- (*i)[columns.binding] = ActionManager::get_key_representation (path, key);
- unbind_button.set_sensitive (true);
- }
+ if (!it || !(*it)[columns.bindable]) {
+ return;
}
- out:
- last_keyval = 0;
- return true;
+ bindings->remove (Gtkmm2ext::Bindings::Press, action_path , true);
+ (*it)[columns.binding] = string ();
+
+ owner.unbind_button.set_sensitive (false);
}
void
-KeyEditor::populate ()
+KeyEditor::Tab::bind (GdkEventKey* release_event, guint pressed_key)
+{
+ const std::string& action_path = (*view.get_selection()->get_selected())[columns.path];
+ TreeModel::iterator it = find_action_path (data_model->children().begin(), data_model->children().end(), action_path);
+
+ /* pressed key could be upper case if Shift was used. We want all
+ single keys stored as their lower-case version, so ensure this
+ */
+
+ pressed_key = gdk_keyval_to_lower (pressed_key);
+
+ if (!it || !(*it)[columns.bindable]) {
+ return;
+ }
+
+ GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & release_event->state);
+ Gtkmm2ext::KeyboardKey new_binding (mod, pressed_key);
+
+ if (bindings->is_bound (new_binding, Gtkmm2ext::Bindings::Press)) {
+ bindings_collision_dialog (owner);
+ return;
+ }
+
+ bool result = bindings->replace (new_binding, Gtkmm2ext::Bindings::Press, action_path);
+
+ if (result) {
+ (*it)[columns.binding] = gtk_accelerator_get_label (new_binding.key(), (GdkModifierType) new_binding.state());
+ owner.unbind_button.set_sensitive (true);
+ }
+}
+
+uint32_t
+KeyEditor::Tab::populate ()
{
vector<string> paths;
vector<string> labels;
vector<string> tooltips;
vector<string> keys;
- vector<AccelKey> bindings;
+ vector<Glib::RefPtr<Action> > actions;
typedef std::map<string,TreeIter> NodeMap;
NodeMap nodes;
NodeMap::iterator r;
- ActionManager::get_all_actions (labels, paths, tooltips, keys, bindings);
+ bindings->get_all_actions (paths, labels, tooltips, keys, actions);
vector<string>::iterator k;
vector<string>::iterator p;
vector<string>::iterator t;
vector<string>::iterator l;
+ vector<Glib::RefPtr<Action> >::iterator a;
- model->clear ();
+ data_model->clear ();
- for (l = labels.begin(), k = keys.begin(), p = paths.begin(), t = tooltips.begin(); l != labels.end(); ++k, ++p, ++t, ++l) {
+ for (a = actions.begin(), l = labels.begin(), k = keys.begin(), p = paths.begin(), t = tooltips.begin(); l != labels.end(); ++k, ++p, ++t, ++l, ++a) {
TreeModel::Row row;
vector<string> parts;
- parts.clear ();
-
split (*p, parts, '/');
- if (parts.empty()) {
+ string category = parts[1];
+ string action_name = parts[2];
+
+ if (action_name.empty()) {
continue;
}
//kinda kludgy way to avoid displaying menu items as mappable
- if ( parts[1] == _("Main_menu") )
- continue;
- if ( parts[1] == _("redirectmenu") )
- continue;
- if ( parts[1] == _("Editor_menus") )
- continue;
- if ( parts[1] == _("RegionList") )
- continue;
- if ( parts[1] == _("ProcessorMenu") )
+ if ((action_name.find ("Menu") == action_name.length() - 4) ||
+ (action_name.find ("menu") == action_name.length() - 4) ||
+ (action_name == _("RegionList"))) {
continue;
+ }
- if ((r = nodes.find (parts[1])) == nodes.end()) {
+ if ((r = nodes.find (category)) == nodes.end()) {
- /* top level is missing */
+ /* category/group is missing, so add it first */
TreeIter rowp;
TreeModel::Row parent;
- rowp = model->append();
- nodes[parts[1]] = rowp;
+ rowp = data_model->append();
+ nodes[category] = rowp;
parent = *(rowp);
- parent[columns.action] = parts[1];
+ parent[columns.name] = category;
parent[columns.bindable] = false;
+ parent[columns.action] = *a;
- row = *(model->append (parent.children()));
+ /* now set up the child row that we're about to fill
+ * out with information
+ */
+
+ row = *(data_model->append (parent.children()));
} else {
- row = *(model->append ((*r->second)->children()));
+ /* category/group is present, so just add the child row */
+
+ row = *(data_model->append ((*r->second)->children()));
}
/* add this action */
+ /* use the "visible label" as the action name */
+
if (l->empty ()) {
- row[columns.action] = *t;
+ /* no label, try using the tooltip instead */
+ row[columns.name] = *t;
} else {
- row[columns.action] = *l;
+ row[columns.name] = *l;
}
- row[columns.path] = (*p);
+ row[columns.path] = string_compose ("%1/%2", category, action_name);
row[columns.bindable] = true;
if (*k == ActionManager::unbound_string) {
row[columns.binding] = string();
} else {
- row[columns.binding] = (*k);
+ row[columns.binding] = *k;
+ }
+ row[columns.action] = *a;
+ }
+
+ return data_model->children().size();
+}
+
+void
+KeyEditor::Tab::sort_column_changed ()
+{
+ int column;
+ SortType type;
+ if (data_model->get_sort_column_id (column, type)) {
+ owner.sort_column = column;
+ owner.sort_type = type;
+ }
+}
+
+void
+KeyEditor::Tab::tab_mapped ()
+{
+ data_model->set_sort_column (owner.sort_column, owner.sort_type);
+ filter->refilter ();
+}
+
+bool
+KeyEditor::Tab::visible_func(const Gtk::TreeModel::const_iterator& iter) const
+{
+ if (!iter) {
+ return false;
+ }
+
+ // never filter when search string is empty or item is a category
+ if (owner.filter_string.empty () || !(*iter)[columns.bindable]) {
+ return true;
+ }
+
+ // search name
+ std::string name = (*iter)[columns.name];
+ boost::to_lower (name);
+ if (name.find (owner.filter_string) != std::string::npos) {
+ return true;
+ }
+
+ // search binding
+ std::string binding = (*iter)[columns.binding];
+ boost::to_lower (binding);
+ if (binding.find (owner.filter_string) != std::string::npos) {
+ return true;
+ }
+
+ return false;
+}
+
+TreeModel::iterator
+KeyEditor::Tab::find_action_path (TreeModel::const_iterator begin, TreeModel::const_iterator end, const std::string& action_path) const
+{
+ if (!begin) {
+ return end;
+ }
+
+ for (TreeModel::iterator it = begin; it != end; ++it) {
+ if (it->children()) {
+ TreeModel::iterator jt = find_action_path (it->children().begin(), it->children().end(), action_path);
+ if (jt != it->children().end()) {
+ return jt;
+ }
+ }
+ const std::string& path = (*it)[columns.path];
+ if (action_path.compare(path) == 0) {
+ return it;
}
}
+ return end;
}
void
KeyEditor::reset ()
{
Keyboard::the_keyboard().reset_bindings ();
- populate ();
- view.get_selection()->unselect_all ();
- populate ();
+ refresh ();
+}
+
+void
+KeyEditor::refresh ()
+{
+ for (Tabs::iterator t = tabs.begin(); t != tabs.end(); ++t) {
+ (*t)->view.get_selection()->unselect_all ();
+ (*t)->populate ();
+ }
+}
+
+KeyEditor::Tab*
+KeyEditor::current_tab ()
+{
+ return dynamic_cast<Tab*> (notebook.get_nth_page (notebook.get_current_page()));
+}
+
+void
+KeyEditor::search_string_updated (const std::string& filter)
+{
+ filter_string = boost::to_lower_copy(filter);
+ KeyEditor::Tab* tab = current_tab ();
+ if (tab) {
+ tab->filter->refilter ();
+ }
+}
+
+void
+KeyEditor::print () const
+{
+ stringstream sstr;
+ Bindings::save_all_bindings_as_html (sstr);
+
+ if (sstr.str().empty()) {
+ return;
+ }
+
+
+ gchar* file_name;
+ GError *err = NULL;
+ gint fd;
+
+ if ((fd = g_file_open_tmp ("akprintXXXXXX.html", &file_name, &err)) < 0) {
+ if (err) {
+ error << string_compose (_("Could not open temporary file to print bindings (%1)"), err->message) << endmsg;
+ g_error_free (err);
+ }
+ return;
+ }
+
+#ifdef PLATFORM_WINDOWS
+ ::close (fd);
+#endif
+
+ err = NULL;
+
+ if (!g_file_set_contents (file_name, sstr.str().c_str(), sstr.str().size(), &err)) {
+#ifndef PLATFORM_WINDOWS
+ ::close (fd);
+#endif
+ g_unlink (file_name);
+ if (err) {
+ error << string_compose (_("Could not save bindings to file (%1)"), err->message) << endmsg;
+ g_error_free (err);
+ }
+ return;
+ }
+
+#ifndef PLATFORM_WINDOWS
+ ::close (fd);
+#endif
+
+ PBD::open_uri (string_compose ("file:///%1", file_name));
}
diff --git a/gtk2_ardour/keyeditor.h b/gtk2_ardour/keyeditor.h
index 14ae2b9..a566233 100644
--- a/gtk2_ardour/keyeditor.h
+++ b/gtk2_ardour/keyeditor.h
@@ -23,56 +23,107 @@
#include <string>
#include <gtkmm/buttonbox.h>
+#include <gtkmm/notebook.h>
+#include <gtkmm/scrolledwindow.h>
#include <gtkmm/treeview.h>
#include <gtkmm/treestore.h>
-#include <gtkmm/scrolledwindow.h>
+#include "gtkmm2ext/searchbar.h"
#include "ardour_window.h"
+namespace Gtkmm2ext {
+ class Bindings;
+}
+
class KeyEditor : public ArdourWindow
{
public:
KeyEditor ();
- protected:
- void on_show ();
- void on_unmap ();
- bool on_key_press_event (GdkEventKey*);
- bool on_key_release_event (GdkEventKey*);
-
- private:
- struct KeyEditorColumns : public Gtk::TreeModel::ColumnRecord {
- KeyEditorColumns () {
- add (action);
- add (binding);
- add (path);
- add (bindable);
- }
- Gtk::TreeModelColumn<std::string> action;
- Gtk::TreeModelColumn<std::string> binding;
- Gtk::TreeModelColumn<std::string> path;
- Gtk::TreeModelColumn<bool> bindable;
+ void add_tab (std::string const &name, Gtkmm2ext::Bindings&);
+ void remove_tab (std::string const &name);
+
+ static sigc::signal<void> UpdateBindings;
+
+ private:
+ class Tab : public Gtk::VBox
+ {
+ public:
+ Tab (KeyEditor&, std::string const &name, Gtkmm2ext::Bindings*);
+
+ uint32_t populate ();
+ void unbind ();
+ void bind (GdkEventKey* release_event, guint pressed_key);
+ void action_selected ();
+ void sort_column_changed ();
+ void tab_mapped ();
+ bool visible_func(const Gtk::TreeModel::const_iterator& iter) const;
+
+ struct KeyEditorColumns : public Gtk::TreeModel::ColumnRecord {
+ KeyEditorColumns () {
+ add (name);
+ add (binding);
+ add (path);
+ add (bindable);
+ add (action);
+ }
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<std::string> binding;
+ Gtk::TreeModelColumn<std::string> path;
+ Gtk::TreeModelColumn<bool> bindable;
+ Gtk::TreeModelColumn<Glib::RefPtr<Gtk::Action> > action;
+ };
+
+ Gtk::VBox vpacker;
+ /* give KeyEditor full access to these. This is just a helper
+ class with no special semantics
+ */
+
+ KeyEditor& owner;
+ std::string name;
+ Gtkmm2ext::Bindings* bindings;
+ Gtk::ScrolledWindow scroller;
+ Gtk::TreeView view;
+ Glib::RefPtr<Gtk::TreeStore> data_model;
+ Glib::RefPtr<Gtk::TreeModelFilter> filter;
+ Glib::RefPtr<Gtk::TreeModelSort> sorted_filter;
+ KeyEditorColumns columns;
+ guint last_keyval;
+
+ protected:
+ bool key_press_event (GdkEventKey*);
+ bool key_release_event (GdkEventKey*);
+ Gtk::TreeModel::iterator find_action_path (Gtk::TreeModel::const_iterator begin, Gtk::TreeModel::const_iterator end, const std::string& path) const;
};
- Gtk::VBox vpacker;
- Gtk::ScrolledWindow scroller;
- Gtk::TreeView view;
- Glib::RefPtr<Gtk::TreeStore> model;
- KeyEditorColumns columns;
+ friend class Tab;
+
+ Gtk::VBox vpacker;
+ Gtk::Notebook notebook;
Gtk::Button unbind_button;
Gtk::HButtonBox unbind_box;
Gtk::HBox reset_box;
Gtk::Button reset_button;
Gtk::Label reset_label;
+ Gtkmm2ext::SearchBar filter_entry;
+ std::string filter_string;
+ Gtk::Button print_button;
- void unbind ();
-
- guint last_keyval;
+ typedef std::vector<Tab*> Tabs;
- void action_selected ();
- void populate ();
+ Tabs tabs;
+ Tab* current_tab();
+ void unbind ();
void reset ();
+ void refresh ();
+ void page_change (GtkNotebookPage*, guint);
+
+ unsigned int sort_column;
+ Gtk::SortType sort_type;
+ void toggle_sort_type ();
+ void search_string_updated (const std::string&);
+ void print () const;
};
#endif /* __ardour_gtk_key_editor_h__ */
diff --git a/gtk2_ardour/latency_gui.cc b/gtk2_ardour/latency_gui.cc
index d21a055..dbb3e08 100644
--- a/gtk2_ardour/latency_gui.cc
+++ b/gtk2_ardour/latency_gui.cc
@@ -27,7 +27,7 @@
#include "latency_gui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace Gtk;
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc
index d9f3130..c8c2133 100644
--- a/gtk2_ardour/level_meter.cc
+++ b/gtk2_ardour/level_meter.cc
@@ -32,7 +32,7 @@
#include "public_editor.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -51,7 +51,9 @@ LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord*
, max_peak (minus_infinity())
, meter_type (MeterPeak)
, visible_meter_type (MeterType(0))
- , visible_meter_count (0)
+ , midi_count (0)
+ , meter_count (0)
+ , max_visible_meters (0)
, color_changed (false)
{
set_session (s);
@@ -230,7 +232,18 @@ LevelMeterBase::hide_all_meters ()
(*i).packed = false;
}
}
- visible_meter_count = 0;
+ meter_count = 0;
+}
+
+void
+LevelMeterBase::set_max_audio_meter_count (uint32_t cnt)
+{
+ if (cnt == max_visible_meters) {
+ return;
+ }
+ color_changed = true; // force re-setup
+ max_visible_meters = cnt;
+ setup_meters (meter_length, regular_meter_width, thin_meter_width);
}
void
@@ -242,7 +255,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
return; /* do it later or never */
}
- int32_t nmidi = _meter->input_streams().n_midi();
+ uint32_t nmidi = _meter->input_streams().n_midi();
uint32_t nmeters = _meter->input_streams().n_total();
regular_meter_width = initial_width;
thin_meter_width = thin_width;
@@ -264,7 +277,8 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
width = rint (width * UIConfiguration::instance().get_ui_scale());
if ( meters.size() > 0
- && nmeters == visible_meter_count
+ && nmidi == midi_count
+ && nmeters == meter_count
&& meters[0].width == width
&& meters[0].length == len
&& !color_changed
@@ -277,7 +291,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
(meters.size() > 0) ? "yes" : "no",
(meters.size() > 0 && meters[0].width == width) ? "yes" : "no",
(meters.size() > 0 && meters[0].length == len) ? "yes" : "no",
- (nmeters == visible_meter_count) ? "yes" : "no",
+ (nmeters == meter_count) ? "yes" : "no",
(meter_type == visible_meter_type) ? "yes" : "no",
!color_changed ? "yes" : "no"
);
@@ -438,7 +452,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
}
}
}
- if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) {
+ if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type || nmidi != midi_count) {
bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false;
meters[n].packed = false;
delete meters[n].meter;
@@ -459,13 +473,18 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
//pack_end (*meters[n].meter, false, false);
mtr_pack (*meters[n].meter);
- meters[n].meter->show_all ();
meters[n].packed = true;
+ if (max_visible_meters == 0 || (uint32_t) n < max_visible_meters + nmidi) {
+ meters[n].meter->show_all ();
+ } else {
+ meters[n].meter->hide ();
+ }
}
//show();
color_changed = false;
visible_meter_type = meter_type;
- visible_meter_count = nmeters;
+ midi_count = nmidi;
+ meter_count = nmeters;
}
void
diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h
index a7a64d7..d5fb62c 100644
--- a/gtk2_ardour/level_meter.h
+++ b/gtk2_ardour/level_meter.h
@@ -65,6 +65,7 @@ class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::tra
void clear_meters (bool reset_highlight = true);
void hide_meters ();
void setup_meters (int len=0, int width=3, int thin=2);
+ void set_max_audio_meter_count (uint32_t cnt = 0);
void set_type (ARDOUR::MeterType);
ARDOUR::MeterType get_type () { return meter_type; }
@@ -108,7 +109,9 @@ class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::tra
float max_peak;
ARDOUR::MeterType meter_type;
ARDOUR::MeterType visible_meter_type;
- uint32_t visible_meter_count;
+ uint32_t midi_count;
+ uint32_t meter_count;
+ uint32_t max_visible_meters;
PBD::ScopedConnection _configuration_connection;
PBD::ScopedConnection _meter_type_connection;
diff --git a/gtk2_ardour/linux_vst_gui_support.cc b/gtk2_ardour/linux_vst_gui_support.cc
index 37f046e..a2f637a 100644
--- a/gtk2_ardour/linux_vst_gui_support.cc
+++ b/gtk2_ardour/linux_vst_gui_support.cc
@@ -56,7 +56,7 @@ static VSTState * vstfx_first = NULL;
const char magic[] = "VSTFX Plugin State v002";
-static int gui_quit = 0;
+static volatile int gui_quit = 0;
/*This will be our connection to X*/
@@ -471,7 +471,7 @@ again:
clock1 = g_get_monotonic_time();
}
- if (may_sleep && elapsed_time_ms + 1 < LXVST_sched_timer_interval) {
+ if (!gui_quit && may_sleep && elapsed_time_ms + 1 < LXVST_sched_timer_interval) {
Glib::usleep(1000 * (LXVST_sched_timer_interval - elapsed_time_ms - 1));
}
}
@@ -487,6 +487,8 @@ normally started in globals.cc*/
int vstfx_init (void* ptr)
{
+ assert (gui_quit == 0);
+ pthread_mutex_init (&plugin_mutex, NULL);
int thread_create_result;
@@ -553,7 +555,11 @@ void vstfx_exit()
/*We need to pthread_join the gui_thread here so
we know when it has stopped*/
+ // BEWARE: some Plugin GUIs can crash if the thread local storage is free()d
+ // after the shared library containing the destructor is already dl-closed.
+ // (e.g u-he LXVST GUI, crash in __nptl_deallocate_tsd) :(
pthread_join(LXVST_gui_event_thread, NULL);
+ pthread_mutex_destroy (&plugin_mutex);
}
/*Adds a new plugin (VSTFX) instance to the linked list*/
@@ -689,7 +695,7 @@ vstfx_launch_editor (VSTState* vstfx)
return 0;
Window parent_window;
- struct ERect* er;
+ struct ERect* er = NULL;
int x_size = 1;
int y_size = 1;
@@ -724,11 +730,15 @@ vstfx_launch_editor (VSTState* vstfx)
vstfx->plugin->dispatcher (vstfx->plugin, effEditGetRect, 0, 0, &er, 0 );
- x_size = er->right - er->left;
- y_size = er->bottom - er->top;
+ if (er) {
+ // Don't crash is plugin does not implement effEditGetRect
+ // it'll result in 1x1 px window but that's not our problem :)
+ x_size = er->right - er->left;
+ y_size = er->bottom - er->top;
+ }
- vstfx->width = x_size;
- vstfx->height = y_size;
+ vstfx->width = x_size;
+ vstfx->height = y_size;
XResizeWindow(LXVST_XDisplay, parent_window, x_size, y_size);
diff --git a/gtk2_ardour/location_ui.cc b/gtk2_ardour/location_ui.cc
index 4a2fc45..76111a4 100644
--- a/gtk2_ardour/location_ui.cc
+++ b/gtk2_ardour/location_ui.cc
@@ -37,7 +37,7 @@
#include "tooltips.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -48,155 +48,155 @@ using namespace Gtkmm2ext;
LocationEditRow::LocationEditRow(Session * sess, Location * loc, int32_t num)
: SessionHandlePtr (0) /* explicitly set below */
- , location(0)
- , item_table (1, 6, false)
- , start_clock (X_("locationstart"), true, "", true, false)
+ , location(0)
+ , item_table (1, 6, false)
+ , start_clock (X_("locationstart"), true, "", true, false)
, start_to_playhead_button (_("Use PH"))
- , end_clock (X_("locationend"), true, "", true, false)
+ , locate_to_start_button (_("Goto"))
+ , end_clock (X_("locationend"), true, "", true, false)
, end_to_playhead_button (_("Use PH"))
- , length_clock (X_("locationlength"), true, "", true, false, true)
- , cd_check_button (_("CD"))
- , hide_check_button (_("Hide"))
- , lock_check_button (_("Lock"))
- , glue_check_button (_("Glue"))
- , _clock_group (0)
+ , locate_to_end_button (_("Goto"))
+ , length_clock (X_("locationlength"), true, "", true, false, true)
+ , cd_check_button (_("CD"))
+ , hide_check_button (_("Hide"))
+ , lock_check_button (_("Lock"))
+ , glue_check_button (_("Glue"))
+ , _clock_group (0)
{
- i_am_the_modifier = 0;
-
- remove_button.set_image (*manage (new Image (Stock::REMOVE, Gtk::ICON_SIZE_MENU)));
-
- start_to_playhead_button.set_name ("LocationEditCdButton");
- end_to_playhead_button.set_name ("LocationEditCdButton");
-
- number_label.set_name ("LocationEditNumberLabel");
- name_label.set_name ("LocationEditNameLabel");
- name_entry.set_name ("LocationEditNameEntry");
- cd_check_button.set_name ("LocationEditCdButton");
- hide_check_button.set_name ("LocationEditHideButton");
- lock_check_button.set_name ("LocationEditLockButton");
- glue_check_button.set_name ("LocationEditGlueButton");
- remove_button.set_name ("LocationEditRemoveButton");
- isrc_label.set_name ("LocationEditNumberLabel");
- isrc_entry.set_name ("LocationEditNameEntry");
- scms_check_button.set_name ("LocationEditCdButton");
- preemph_check_button.set_name ("LocationEditCdButton");
- performer_label.set_name ("LocationEditNumberLabel");
- performer_entry.set_name ("LocationEditNameEntry");
- composer_label.set_name ("LocationEditNumberLabel");
- composer_entry.set_name ("LocationEditNameEntry");
-
- isrc_label.set_text (X_("ISRC:"));
- performer_label.set_text (_("Performer:"));
- composer_label.set_text (_("Composer:"));
- scms_label.set_text (X_("SCMS"));
- preemph_label.set_text (_("Pre-Emphasis"));
-
- isrc_entry.set_size_request (112, -1);
- isrc_entry.set_max_length(12);
- isrc_entry.set_editable (true);
-
- performer_entry.set_size_request (100, -1);
- performer_entry.set_editable (true);
-
- composer_entry.set_size_request (100, -1);
- composer_entry.set_editable (true);
-
- name_label.set_alignment (0, 0.5);
-
- Gtk::HBox* front_spacing = manage (new HBox);
- front_spacing->set_size_request (20, -1);
- Gtk::HBox* mid_spacing = manage (new HBox);
- mid_spacing->set_size_request (20, -1);
-
- cd_track_details_hbox.set_spacing (4);
- cd_track_details_hbox.pack_start (*front_spacing, false, false);
- cd_track_details_hbox.pack_start (isrc_label, false, false);
- cd_track_details_hbox.pack_start (isrc_entry, false, false);
- cd_track_details_hbox.pack_start (performer_label, false, false);
- cd_track_details_hbox.pack_start (performer_entry, true, true);
- cd_track_details_hbox.pack_start (composer_label, false, false);
- cd_track_details_hbox.pack_start (composer_entry, true, true);
- cd_track_details_hbox.pack_start (*mid_spacing, false, false);
- cd_track_details_hbox.pack_start (scms_label, false, false);
- cd_track_details_hbox.pack_start (scms_check_button, false, false);
- cd_track_details_hbox.pack_start (preemph_label, false, false);
- cd_track_details_hbox.pack_start (preemph_check_button, false, false);
-
- isrc_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::isrc_entry_changed));
- performer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::performer_entry_changed));
- composer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::composer_entry_changed));
- scms_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::scms_toggled));
- preemph_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::preemph_toggled));
-
- set_session (sess);
-
- start_hbox.set_spacing (2);
- start_hbox.pack_start (start_clock, false, false);
- start_hbox.pack_start (start_to_playhead_button, false, false);
-
- /* this is always in this location, no matter what the location is */
-
- VBox *rbox = manage (new VBox);
- rbox->pack_start (remove_button, false, false);
-
- item_table.attach (*rbox, 0, 1, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
- item_table.attach (start_hbox, 2, 3, 0, 1, FILL, Gtk::AttachOptions(0), 4, 0);
-
- start_to_playhead_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocStart));
- start_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocStart));
- start_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &start_clock), false);
-
- end_hbox.set_spacing (2);
- end_hbox.pack_start (end_clock, false, false);
- end_hbox.pack_start (end_to_playhead_button, false, false);
-
- end_to_playhead_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocEnd));
- end_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocEnd));
- end_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &end_clock), false);
-
- length_clock.ValueChanged.connect (sigc::bind ( sigc::mem_fun(*this, &LocationEditRow::clock_changed), LocLength));
-
- cd_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::cd_toggled));
- hide_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::hide_toggled));
- lock_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::lock_toggled));
- glue_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::glue_toggled));
-
- remove_button.signal_clicked().connect(sigc::mem_fun(*this, &LocationEditRow::remove_button_pressed));
-
- pack_start(item_table, true, true);
-
- set_location (loc);
- set_number (num);
- cd_toggled(); // show/hide cd-track details
- }
-
- LocationEditRow::~LocationEditRow()
- {
- if (location) {
- connections.drop_connections ();
- }
-
- if (_clock_group) {
- _clock_group->remove (start_clock);
- _clock_group->remove (end_clock);
- _clock_group->remove (length_clock);
- }
- }
-
- void
- LocationEditRow::set_clock_group (ClockGroup& cg)
- {
- if (_clock_group) {
- _clock_group->remove (start_clock);
- _clock_group->remove (end_clock);
- _clock_group->remove (length_clock);
- }
-
- _clock_group = &cg;
-
- _clock_group->add (start_clock);
- _clock_group->add (end_clock);
- _clock_group->add (length_clock);
+ i_am_the_modifier = 0;
+
+ remove_button.set_icon (ArdourIcon::CloseCross);
+ remove_button.set_events (remove_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+
+ number_label.set_name ("LocationEditNumberLabel");
+ name_label.set_name ("LocationEditNameLabel");
+ name_entry.set_name ("LocationEditNameEntry");
+ cd_check_button.set_name ("LocationEditCdButton");
+ hide_check_button.set_name ("LocationEditHideButton");
+ lock_check_button.set_name ("LocationEditLockButton");
+ glue_check_button.set_name ("LocationEditGlueButton");
+ isrc_label.set_name ("LocationEditNumberLabel");
+ isrc_entry.set_name ("LocationEditNameEntry");
+ scms_check_button.set_name ("LocationEditCdButton");
+ preemph_check_button.set_name ("LocationEditCdButton");
+ performer_label.set_name ("LocationEditNumberLabel");
+ performer_entry.set_name ("LocationEditNameEntry");
+ composer_label.set_name ("LocationEditNumberLabel");
+ composer_entry.set_name ("LocationEditNameEntry");
+
+ isrc_label.set_text (X_("ISRC:"));
+ performer_label.set_text (_("Performer:"));
+ composer_label.set_text (_("Composer:"));
+ scms_label.set_text (X_("SCMS"));
+ preemph_label.set_text (_("Pre-Emphasis"));
+
+ isrc_entry.set_size_request (112, -1);
+ isrc_entry.set_max_length(12);
+ isrc_entry.set_editable (true);
+
+ performer_entry.set_size_request (100, -1);
+ performer_entry.set_editable (true);
+
+ composer_entry.set_size_request (100, -1);
+ composer_entry.set_editable (true);
+
+ name_label.set_alignment (0, 0.5);
+
+ Gtk::HBox* front_spacing = manage (new HBox);
+ front_spacing->set_size_request (20, -1);
+ Gtk::HBox* mid_spacing = manage (new HBox);
+ mid_spacing->set_size_request (20, -1);
+
+ cd_track_details_hbox.set_spacing (4);
+ cd_track_details_hbox.pack_start (*front_spacing, false, false);
+ cd_track_details_hbox.pack_start (isrc_label, false, false);
+ cd_track_details_hbox.pack_start (isrc_entry, false, false);
+ cd_track_details_hbox.pack_start (performer_label, false, false);
+ cd_track_details_hbox.pack_start (performer_entry, true, true);
+ cd_track_details_hbox.pack_start (composer_label, false, false);
+ cd_track_details_hbox.pack_start (composer_entry, true, true);
+ cd_track_details_hbox.pack_start (*mid_spacing, false, false);
+ cd_track_details_hbox.pack_start (scms_label, false, false);
+ cd_track_details_hbox.pack_start (scms_check_button, false, false);
+ cd_track_details_hbox.pack_start (preemph_label, false, false);
+ cd_track_details_hbox.pack_start (preemph_check_button, false, false);
+
+ isrc_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::isrc_entry_changed));
+ performer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::performer_entry_changed));
+ composer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::composer_entry_changed));
+ scms_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::scms_toggled));
+ preemph_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::preemph_toggled));
+
+ set_session (sess);
+
+ start_hbox.set_spacing (2);
+ start_hbox.pack_start (locate_to_start_button, false, false);
+ start_hbox.pack_start (start_clock, false, false);
+ start_hbox.pack_start (start_to_playhead_button, false, false);
+
+ /* this is always in this location, no matter what the location is */
+
+ item_table.attach (remove_button, 8, 9, 0, 1, SHRINK, SHRINK, 4, 1);
+ item_table.attach (start_hbox, 0, 1, 0, 1, FILL, Gtk::AttachOptions(0), 4, 0);
+
+ start_to_playhead_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocStart));
+ locate_to_start_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_button_pressed), LocStart));
+ start_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocStart));
+ start_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &start_clock), false);
+
+ end_hbox.set_spacing (2);
+ end_hbox.pack_start (locate_to_end_button, false, false);
+ end_hbox.pack_start (end_clock, false, false);
+ end_hbox.pack_start (end_to_playhead_button, false, false);
+
+ end_to_playhead_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocEnd));
+ locate_to_end_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_button_pressed), LocEnd));
+ end_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocEnd));
+ end_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &end_clock), false);
+
+ length_clock.ValueChanged.connect (sigc::bind ( sigc::mem_fun(*this, &LocationEditRow::clock_changed), LocLength));
+
+ cd_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::cd_toggled));
+ hide_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::hide_toggled));
+ lock_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::lock_toggled));
+ glue_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::glue_toggled));
+
+ remove_button.signal_clicked.connect(sigc::mem_fun(*this, &LocationEditRow::remove_button_pressed));
+
+ pack_start(item_table, true, true);
+
+ set_location (loc);
+ set_number (num);
+ cd_toggled(); // show/hide cd-track details
+}
+
+LocationEditRow::~LocationEditRow()
+{
+ if (location) {
+ connections.drop_connections ();
+ }
+
+ if (_clock_group) {
+ _clock_group->remove (start_clock);
+ _clock_group->remove (end_clock);
+ _clock_group->remove (length_clock);
+ }
+}
+
+void
+LocationEditRow::set_clock_group (ClockGroup& cg)
+{
+ if (_clock_group) {
+ _clock_group->remove (start_clock);
+ _clock_group->remove (end_clock);
+ _clock_group->remove (length_clock);
+ }
+
+ _clock_group = &cg;
+
+ _clock_group->add (start_clock);
+ _clock_group->add (end_clock);
+ _clock_group->add (length_clock);
}
void
@@ -239,9 +239,9 @@ LocationEditRow::set_location (Location *loc)
++i_am_the_modifier;
if (!hide_check_button.get_parent()) {
- item_table.attach (hide_check_button, 6, 7, 0, 1, FILL, Gtk::FILL, 4, 0);
- item_table.attach (lock_check_button, 7, 8, 0, 1, FILL, Gtk::FILL, 4, 0);
- item_table.attach (glue_check_button, 8, 9, 0, 1, FILL, Gtk::FILL, 4, 0);
+ item_table.attach (hide_check_button, 5, 6, 0, 1, FILL, Gtk::FILL, 4, 0);
+ item_table.attach (lock_check_button, 6, 7, 0, 1, FILL, Gtk::FILL, 4, 0);
+ item_table.attach (glue_check_button, 7, 8, 0, 1, FILL, Gtk::FILL, 4, 0);
}
hide_check_button.set_active (location->is_hidden());
lock_check_button.set_active (location->locked());
@@ -256,7 +256,7 @@ LocationEditRow::set_location (Location *loc)
remove_button.hide ();
if (!name_label.get_parent()) {
- item_table.attach (name_label, 1, 2, 0, 1, FILL, FILL, 4, 0);
+ item_table.attach (name_label, 2, 3, 0, 1, EXPAND|FILL, FILL, 4, 0);
}
name_label.show();
@@ -269,12 +269,12 @@ LocationEditRow::set_location (Location *loc)
name_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::name_entry_changed));
if (!name_entry.get_parent()) {
- item_table.attach (name_entry, 1, 2, 0, 1, FILL | EXPAND, FILL, 4, 0);
+ item_table.attach (name_entry, 2, 3, 0, 1, FILL | EXPAND, FILL, 4, 0);
}
name_entry.show();
if (!cd_check_button.get_parent()) {
- item_table.attach (cd_check_button, 5, 6, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
+ item_table.attach (cd_check_button, 4, 5, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
}
if (location->is_session_range()) {
@@ -300,10 +300,10 @@ LocationEditRow::set_location (Location *loc)
if (!location->is_mark()) {
if (!end_hbox.get_parent()) {
- item_table.attach (end_hbox, 3, 4, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
+ item_table.attach (end_hbox, 1, 2, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
}
if (!length_clock.get_parent()) {
- end_hbox.pack_start (length_clock, false, false);
+ end_hbox.pack_start (length_clock, false, false, 4);
}
end_clock.set (location->end(), true);
@@ -316,20 +316,20 @@ LocationEditRow::set_location (Location *loc)
show_cd_track_details ();
}
- set_tooltip (remove_button, _("Remove this range"));
+ set_tooltip (&remove_button, _("Remove this range"));
set_tooltip (start_clock, _("Start time - middle click to locate here"));
set_tooltip (end_clock, _("End time - middle click to locate here"));
set_tooltip (length_clock, _("Length"));
- set_tooltip (start_to_playhead_button, _("Set range start from playhead location"));
- set_tooltip (end_to_playhead_button, _("Set range end from playhead location"));
+ set_tooltip (&start_to_playhead_button, _("Set range start from playhead location"));
+ set_tooltip (&end_to_playhead_button, _("Set range end from playhead location"));
} else {
- set_tooltip (remove_button, _("Remove this marker"));
+ set_tooltip (&remove_button, _("Remove this marker"));
set_tooltip (start_clock, _("Position - middle click to locate here"));
- set_tooltip (start_to_playhead_button, _("Set marker time from playhead location"));
+ set_tooltip (&start_to_playhead_button, _("Set marker time from playhead location"));
end_clock.hide();
length_clock.hide();
@@ -339,21 +339,21 @@ LocationEditRow::set_location (Location *loc)
--i_am_the_modifier;
- /* connect to per-location signals, since this row only cares about this location */
+ /* connect to per-location signals, since this row only cares about this location */
location->NameChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::name_changed, this), gui_context());
- location->StartChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::start_changed, this), gui_context());
- location->EndChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::end_changed, this), gui_context());
- location->Changed.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::location_changed, this), gui_context());
- location->FlagsChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::flags_changed, this), gui_context());
- location->LockChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::lock_changed, this), gui_context());
- location->PositionLockStyleChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::position_lock_style_changed, this), gui_context());
+ location->StartChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::start_changed, this), gui_context());
+ location->EndChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::end_changed, this), gui_context());
+ location->Changed.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::location_changed, this), gui_context());
+ location->FlagsChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::flags_changed, this), gui_context());
+ location->LockChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::lock_changed, this), gui_context());
+ location->PositionLockStyleChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::position_lock_style_changed, this), gui_context());
}
void
LocationEditRow::name_entry_changed ()
{
- ENSURE_GUI_THREAD (*this, &LocationEditRow::name_entry_changed)
+ ENSURE_GUI_THREAD (*this, &LocationEditRow::name_entry_changed);
if (i_am_the_modifier || !location) {
return;
@@ -366,44 +366,44 @@ LocationEditRow::name_entry_changed ()
void
LocationEditRow::isrc_entry_changed ()
{
- ENSURE_GUI_THREAD (*this, &LocationEditRow::isrc_entry_changed)
+ ENSURE_GUI_THREAD (*this, &LocationEditRow::isrc_entry_changed);
if (i_am_the_modifier || !location) return;
if (isrc_entry.get_text() != "" ) {
- location->cd_info["isrc"] = isrc_entry.get_text();
+ location->cd_info["isrc"] = isrc_entry.get_text();
} else {
- location->cd_info.erase("isrc");
+ location->cd_info.erase("isrc");
}
}
void
LocationEditRow::performer_entry_changed ()
{
- ENSURE_GUI_THREAD (*this, &LocationEditRow::performer_entry_changed)
+ ENSURE_GUI_THREAD (*this, &LocationEditRow::performer_entry_changed);
if (i_am_the_modifier || !location) return;
if (performer_entry.get_text() != "") {
- location->cd_info["performer"] = performer_entry.get_text();
+ location->cd_info["performer"] = performer_entry.get_text();
} else {
- location->cd_info.erase("performer");
+ location->cd_info.erase("performer");
}
}
void
LocationEditRow::composer_entry_changed ()
{
- ENSURE_GUI_THREAD (*this, &LocationEditRow::composer_entry_changed)
+ ENSURE_GUI_THREAD (*this, &LocationEditRow::composer_entry_changed);
if (i_am_the_modifier || !location) return;
if (composer_entry.get_text() != "") {
- location->cd_info["composer"] = composer_entry.get_text();
+ location->cd_info["composer"] = composer_entry.get_text();
} else {
- location->cd_info.erase("composer");
+ location->cd_info.erase("composer");
}
}
@@ -415,14 +415,32 @@ LocationEditRow::to_playhead_button_pressed (LocationPart part)
}
switch (part) {
- case LocStart:
- location->set_start (_session->transport_frame ());
- break;
- case LocEnd:
- location->set_end (_session->transport_frame ());
- break;
- default:
- break;
+ case LocStart:
+ location->set_start (_session->transport_frame ());
+ break;
+ case LocEnd:
+ location->set_end (_session->transport_frame ());
+ if (location->is_session_range()) {
+ _session->set_end_is_free (false);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void
+LocationEditRow::locate_button_pressed (LocationPart part)
+{
+ switch (part) {
+ case LocStart:
+ _session->request_locate (start_clock.current_time());
+ break;
+ case LocEnd:
+ _session->request_locate (end_clock.current_time());
+ break;
+ default:
+ break;
}
}
@@ -444,23 +462,28 @@ LocationEditRow::clock_changed (LocationPart part)
}
switch (part) {
- case LocStart:
- location->set_start (start_clock.current_time());
- break;
- case LocEnd:
- location->set_end (end_clock.current_time());
- break;
- case LocLength:
- location->set_end (location->start() + length_clock.current_duration());
- default:
- break;
+ case LocStart:
+ location->set_start (start_clock.current_time());
+ break;
+ case LocEnd:
+ location->set_end (end_clock.current_time());
+ if (location->is_session_range()) {
+ _session->set_end_is_free (false);
+ }
+ break;
+ case LocLength:
+ location->set_end (location->start() + length_clock.current_duration());
+ if (location->is_session_range()) {
+ _session->set_end_is_free (false);
+ }
+ default:
+ break;
}
}
void
LocationEditRow::show_cd_track_details ()
{
-
if (location->cd_info.find("isrc") != location->cd_info.end()) {
isrc_entry.set_text(location->cd_info["isrc"]);
}
@@ -729,7 +752,7 @@ LocationUI::LocationUI ()
{
i_am_the_modifier = 0;
- _clock_group = new ClockGroup;
+ _clock_group = new ClockGroup;
VBox* vbox = manage (new VBox);
@@ -744,9 +767,10 @@ LocationUI::LocationUI ()
table->attach (*l, 0, 2, table_row, table_row + 1);
++table_row;
- loop_edit_row.set_clock_group (*_clock_group);
- punch_edit_row.set_clock_group (*_clock_group);
+ loop_edit_row.set_clock_group (*_clock_group);
+ punch_edit_row.set_clock_group (*_clock_group);
+ loop_punch_box.set_border_width (6); // 5 + 1 px framebox-border
loop_punch_box.pack_start (loop_edit_row, false, false);
loop_punch_box.pack_start (punch_edit_row, false, false);
@@ -755,7 +779,7 @@ LocationUI::LocationUI ()
vbox->pack_start (*table, false, false);
- table = manage (new Table (3, 2));
+ table = manage (new Table (3, 2));
table->set_spacings (2);
table->set_col_spacing (0, 32);
table_row = 0;
@@ -788,9 +812,9 @@ LocationUI::LocationUI ()
table->attach (loc_frame_box, 0, 2, table_row, table_row + 1);
++table_row;
- loc_range_panes.pack1 (*table, true, false);
+ loc_range_panes.add (*table);
- table = manage (new Table (3, 2));
+ table = manage (new Table (3, 2));
table->set_spacings (2);
table->set_col_spacing (0, 32);
table_row = 0;
@@ -820,7 +844,7 @@ LocationUI::LocationUI ()
table->attach (range_frame_box, 0, 2, table_row, table_row + 1);
++table_row;
- loc_range_panes.pack2 (*table, true, false);
+ loc_range_panes.add (*table);
HBox* add_button_box = manage (new HBox);
add_button_box->pack_start (add_location_button, true, true);
@@ -904,7 +928,7 @@ LocationUI::location_added (Location* location)
LocationEditRow* erow = manage (new LocationEditRow (_session, location));
- erow->set_clock_group (*_clock_group);
+ erow->set_clock_group (*_clock_group);
erow->remove_requested.connect (sigc::mem_fun (*this, &LocationUI::location_remove_requested));
Box_Helpers::BoxList & children = location->is_range_marker() ? range_rows.children () : location_rows.children ();
@@ -985,7 +1009,7 @@ LocationUI::map_locations (const Locations::LocationList& locations)
erow->remove_requested.connect (sigc::mem_fun(*this, &LocationUI::location_remove_requested));
erow->redraw_ranges.connect (sigc::mem_fun(*this, &LocationUI::location_redraw_ranges));
- Box_Helpers::BoxList & loc_children = location_rows.children();
+ Box_Helpers::BoxList & loc_children = location_rows.children();
loc_children.push_back(Box_Helpers::Element(*erow, PACK_SHRINK, 1, PACK_START));
} else if (location->is_auto_punch()) {
punch_edit_row.set_session (_session);
@@ -998,7 +1022,7 @@ LocationUI::map_locations (const Locations::LocationList& locations)
} else {
LocationEditRow* erow = manage (new LocationEditRow(_session, location));
- erow->set_clock_group (*_clock_group);
+ erow->set_clock_group (*_clock_group);
erow->remove_requested.connect (sigc::mem_fun(*this, &LocationUI::location_remove_requested));
Box_Helpers::BoxList & range_children = range_rows.children();
@@ -1128,7 +1152,7 @@ LocationUI::clock_mode_from_session_instant_xml () const
return AudioClock::Frames;
}
- XMLProperty* p = node->property (X_("clock-mode"));
+ XMLProperty const * p = node->property (X_("clock-mode"));
if (!p) {
return ARDOUR_UI::instance()->secondary_clock->mode();
}
@@ -1140,7 +1164,7 @@ LocationUI::clock_mode_from_session_instant_xml () const
/*------------------------*/
LocationUIWindow::LocationUIWindow ()
- : ArdourWindow (_("Locations"))
+ : ArdourWindow (S_("Ranges|Locations"))
{
set_wmclass(X_("ardour_locations"), PROGRAM_NAME);
set_name ("LocationWindow");
diff --git a/gtk2_ardour/location_ui.h b/gtk2_ardour/location_ui.h
index c9e7b49..cdbc952 100644
--- a/gtk2_ardour/location_ui.h
+++ b/gtk2_ardour/location_ui.h
@@ -26,7 +26,6 @@
#include <gtkmm/table.h>
#include <gtkmm/entry.h>
#include <gtkmm/label.h>
-#include <gtkmm/paned.h>
#include <gtkmm/scrolledwindow.h>
#include "pbd/signals.h"
@@ -34,6 +33,9 @@
#include "ardour/location.h"
#include "ardour/session_handle.h"
+#include <gtkmm2ext/pane.h>
+
+#include "ardour_button.h"
#include "ardour_window.h"
#include "audio_clock.h"
@@ -80,11 +82,13 @@ class LocationEditRow : public Gtk::HBox, public ARDOUR::SessionHandlePtr
Gtk::HBox start_hbox;
AudioClock start_clock;
- Gtk::Button start_to_playhead_button;
+ ArdourButton start_to_playhead_button;
+ ArdourButton locate_to_start_button;
Gtk::HBox end_hbox;
AudioClock end_clock;
- Gtk::Button end_to_playhead_button;
+ ArdourButton end_to_playhead_button;
+ ArdourButton locate_to_end_button;
AudioClock length_clock;
Gtk::CheckButton cd_check_button;
@@ -92,7 +96,7 @@ class LocationEditRow : public Gtk::HBox, public ARDOUR::SessionHandlePtr
Gtk::CheckButton lock_check_button;
Gtk::CheckButton glue_check_button;
- Gtk::Button remove_button;
+ ArdourButton remove_button;
Gtk::HBox cd_track_details_hbox;
Gtk::Entry isrc_entry;
@@ -118,6 +122,7 @@ class LocationEditRow : public Gtk::HBox, public ARDOUR::SessionHandlePtr
void composer_entry_changed ();
void to_playhead_button_pressed (LocationPart part);
+ void locate_button_pressed (LocationPart part);
void clock_changed (LocationPart part);
bool locate_to_clock (GdkEventButton*, AudioClock*);
@@ -174,7 +179,7 @@ class LocationUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
LocationEditRow punch_edit_row;
Gtk::VBox loop_punch_box;
- Gtk::VPaned loc_range_panes;
+ Gtkmm2ext::VPane loc_range_panes;
Gtk::VBox loc_frame_box;
Gtk::Button add_location_button;
diff --git a/gtk2_ardour/lua_script_manager.cc b/gtk2_ardour/lua_script_manager.cc
new file mode 100644
index 0000000..c33dea3
--- /dev/null
+++ b/gtk2_ardour/lua_script_manager.cc
@@ -0,0 +1,312 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "gtkmm2ext/utils.h"
+
+#include "lua_script_manager.h"
+#include "script_selector.h"
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace ARDOUR;
+
+LuaScriptManager::LuaScriptManager ()
+ : ArdourWindow (_("Script Manager"))
+ , _a_set_button (_("Add/Set"))
+ , _a_del_button (_("Remove"))
+ , _a_edit_button (_("Edit"))
+ , _a_call_button (_("Call"))
+ , _c_add_button (_("New Hook"))
+ , _c_del_button (_("Remove"))
+{
+ /* action script page */
+ _a_store = ListStore::create (_a_model);
+ _a_view.set_model (_a_store);
+ _a_view.append_column (_("Action"), _a_model.action);
+ _a_view.append_column (_("Name"), _a_model.name);
+ _a_view.get_column(0)->set_resizable (true);
+ _a_view.get_column(0)->set_expand (true);
+ _a_view.get_column(1)->set_resizable (true);
+ _a_view.get_column(1)->set_expand (true);
+
+ Gtk::HBox* edit_box = manage (new Gtk::HBox);
+ edit_box->set_spacing(3);
+
+ edit_box->pack_start (_a_set_button, true, true);
+ edit_box->pack_start (_a_del_button, true, true);
+ edit_box->pack_start (_a_edit_button, true, true);
+ edit_box->pack_start (_a_call_button, true, true);
+
+ _a_set_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::set_action_btn_clicked));
+ _a_del_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::del_action_btn_clicked));
+ _a_edit_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::edit_action_btn_clicked));
+ _a_call_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::call_action_btn_clicked));
+ _a_view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &LuaScriptManager::action_selection_changed));
+
+ LuaInstance::instance()->ActionChanged.connect (sigc::mem_fun (*this, &LuaScriptManager::set_action_script_name));
+ LuaInstance::instance()->SlotChanged.connect (sigc::mem_fun (*this, &LuaScriptManager::set_callback_script_name));
+
+ Gtk::VBox *vbox = manage (new VBox());
+ vbox->pack_start (_a_view, false, false);
+ vbox->pack_end (*edit_box, false, false);
+ vbox->show_all ();
+
+ pages.pages ().push_back (Notebook_Helpers::TabElem (*vbox, "Action Scripts"));
+
+ /* action hooks page */
+
+ _c_store = ListStore::create (_c_model);
+ _c_view.set_model (_c_store);
+ _c_view.append_column (_("Name"), _c_model.name);
+ _c_view.append_column (_("Signal(s)"), _c_model.signals);
+ _c_view.get_column(0)->set_resizable (true);
+ _c_view.get_column(0)->set_expand (true);
+ _c_view.get_column(1)->set_resizable (true);
+ _c_view.get_column(1)->set_expand (true);
+ Gtk::CellRendererText* r = dynamic_cast<Gtk::CellRendererText*>(_c_view.get_column_cell_renderer (1));
+ r->property_ellipsize () = Pango::ELLIPSIZE_MIDDLE;
+
+ edit_box = manage (new Gtk::HBox);
+ edit_box->set_spacing(3);
+ edit_box->pack_start (_c_add_button, true, true);
+ edit_box->pack_start (_c_del_button, true, true);
+
+ _c_add_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::add_callback_btn_clicked));
+ _c_del_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::del_callback_btn_clicked));
+ _c_view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &LuaScriptManager::callback_selection_changed));
+
+ vbox = manage (new VBox());
+ vbox->pack_start (_c_view, false, false);
+ vbox->pack_end (*edit_box, false, false);
+ vbox->show_all ();
+
+ pages.pages ().push_back (Notebook_Helpers::TabElem (*vbox, "Action Hooks"));
+
+
+ add (pages);
+ pages.show();
+
+ setup_actions ();
+ setup_callbacks ();
+
+ action_selection_changed ();
+ callback_selection_changed ();
+}
+
+void
+LuaScriptManager::session_going_away ()
+{
+ ArdourWindow::session_going_away ();
+ hide_all();
+}
+
+void
+LuaScriptManager::setup_actions ()
+{
+ LuaInstance *li = LuaInstance::instance();
+ for (int i = 0; i < 9; ++i) {
+ std::string name;
+ TreeModel::Row r = *_a_store->append ();
+ r[_a_model.id] = i;
+ r[_a_model.action] = string_compose (_("Action %1"), i + 1);
+ if (li->lua_action_name (i, name)) {
+ r[_a_model.name] = name;
+ r[_a_model.enabled] = true;
+ } else {
+ r[_a_model.name] = _("Unset");
+ r[_a_model.enabled] = false;
+ }
+ }
+}
+
+void
+LuaScriptManager::action_selection_changed ()
+{
+ TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+ if (row) {
+ _a_set_button.set_sensitive (true);
+ }
+ else {
+ _a_set_button.set_sensitive (false);
+ }
+
+ if (row && row[_a_model.enabled]) {
+ _a_del_button.set_sensitive (true);
+ _a_edit_button.set_sensitive (false); // TODO
+ _a_call_button.set_sensitive (true);
+ } else {
+ _a_del_button.set_sensitive (false);
+ _a_edit_button.set_sensitive (false);
+ _a_call_button.set_sensitive (false);
+ }
+}
+
+void
+LuaScriptManager::set_action_btn_clicked ()
+{
+ TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+ assert (row);
+ LuaInstance *li = LuaInstance::instance();
+ li->interactive_add (LuaScriptInfo::EditorAction, row[_a_model.id]);
+}
+
+void
+LuaScriptManager::del_action_btn_clicked ()
+{
+ TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+ assert (row);
+ LuaInstance *li = LuaInstance::instance();
+ if (!li->remove_lua_action (row[_a_model.id])) {
+ // error
+ }
+}
+
+void
+LuaScriptManager::call_action_btn_clicked ()
+{
+ TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+ assert (row && row[_a_model.enabled]);
+ LuaInstance *li = LuaInstance::instance();
+ li->call_action (row[_a_model.id]);
+}
+
+void
+LuaScriptManager::edit_action_btn_clicked ()
+{
+ TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+ assert (row);
+ int id = row[_a_model.id];
+ LuaInstance *li = LuaInstance::instance();
+ std::string name, script;
+ LuaScriptParamList args;
+ if (!li->lua_action (id, name, script, args)) {
+ return;
+ }
+
+ // TODO text-editor window, update script directly
+
+ if (!LuaScripting::try_compile (script, args)) {
+ // compilation failed, keep editing
+ return;
+ }
+
+ if (li->set_lua_action (id, name, script, args)) {
+ // OK
+ } else {
+ // load failed, keep editing..
+ }
+ action_selection_changed ();
+}
+
+void
+LuaScriptManager::set_action_script_name (int i, const std::string& name)
+{
+ typedef Gtk::TreeModel::Children type_children;
+ type_children children = _a_store->children();
+ for(type_children::iterator iter = children.begin(); iter != children.end(); ++iter) {
+ Gtk::TreeModel::Row row = *iter;
+ if (row[_a_model.id] == i) {
+ if (name.empty()) {
+ row[_a_model.enabled] = false;
+ row[_a_model.name] = _("Unset");
+ } else {
+ row[_a_model.enabled] = true;
+ row[_a_model.name] = name;
+ }
+ break;
+ }
+ }
+ action_selection_changed ();
+}
+
+
+void
+LuaScriptManager::setup_callbacks ()
+{
+ LuaInstance *li = LuaInstance::instance();
+ std::vector<PBD::ID> ids = li->lua_slots();
+ for (std::vector<PBD::ID>::const_iterator i = ids.begin(); i != ids.end(); ++i) {
+ std::string name;
+ std::string script;
+ ActionHook ah;
+ LuaScriptParamList lsp;
+ if (li->lua_slot (*i, name, script, ah, lsp)) {
+ set_callback_script_name (*i, name, ah);
+ }
+ }
+}
+
+void
+LuaScriptManager::callback_selection_changed ()
+{
+ TreeModel::Row row = *(_c_view.get_selection()->get_selected());
+ if (row) {
+ _c_del_button.set_sensitive (true);
+ } else {
+ _c_del_button.set_sensitive (false);
+ }
+}
+
+void
+LuaScriptManager::add_callback_btn_clicked ()
+{
+ LuaInstance *li = LuaInstance::instance();
+ li->interactive_add (LuaScriptInfo::EditorHook, -1);
+}
+
+void
+LuaScriptManager::del_callback_btn_clicked ()
+{
+ TreeModel::Row row = *(_c_view.get_selection()->get_selected());
+ assert (row);
+ LuaInstance *li = LuaInstance::instance();
+ if (!li->unregister_lua_slot (row[_c_model.id])) {
+ // error
+ }
+}
+
+void
+LuaScriptManager::set_callback_script_name (PBD::ID id, const std::string& name, const ActionHook& ah)
+{
+ if (name.empty()) {
+ typedef Gtk::TreeModel::Children type_children;
+ type_children children = _c_store->children();
+ for(type_children::iterator iter = children.begin(); iter != children.end(); ++iter) {
+ Gtk::TreeModel::Row row = *iter;
+ PBD::ID i = row[_c_model.id];
+ if (i == id) {
+ _c_store->erase (iter);
+ break;
+ }
+ }
+ } else {
+ TreeModel::Row r = *_c_store->append ();
+ r[_c_model.id] = id;
+ r[_c_model.name] = name;
+ string sig;
+ for (uint32_t i = 0; i < LuaSignal::LAST_SIGNAL; ++i) {
+ if (ah[i]) {
+ if (!sig.empty()) sig += ", ";
+ sig += enum2str (LuaSignal::LuaSignal (i));
+ }
+ }
+ r[_c_model.signals] = sig;
+ }
+ callback_selection_changed ();
+}
diff --git a/gtk2_ardour/lua_script_manager.h b/gtk2_ardour/lua_script_manager.h
new file mode 100644
index 0000000..03e2756
--- /dev/null
+++ b/gtk2_ardour/lua_script_manager.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _gtk2_ardour_lua_script_manager_h_
+#define _gtk2_ardour_lua_script_manager_h_
+
+#include <gtkmm.h>
+#include "ardour/luascripting.h"
+
+#include "ardour_window.h"
+#include "luainstance.h"
+
+class LuaScriptManager : public ArdourWindow
+{
+public:
+ LuaScriptManager ();
+
+protected:
+ void session_going_away();
+
+private:
+ Gtk::Notebook pages;
+
+ /* action scripts */
+ void setup_actions ();
+ void action_selection_changed ();
+ void set_action_script_name (int, const std::string&);
+
+ void set_action_btn_clicked ();
+ void del_action_btn_clicked ();
+ void edit_action_btn_clicked ();
+ void call_action_btn_clicked ();
+
+ class LuaActionScriptModelColumns : public Gtk::TreeModelColumnRecord
+ {
+ public:
+ LuaActionScriptModelColumns ()
+ {
+ add (id);
+ add (action);
+ add (name);
+ add (enabled);
+ }
+
+ Gtk::TreeModelColumn<int> id;
+ Gtk::TreeModelColumn<std::string> action;
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<bool> enabled;
+ };
+
+ Gtk::Button _a_set_button;
+ Gtk::Button _a_del_button;
+ Gtk::Button _a_edit_button;
+ Gtk::Button _a_call_button;
+
+ Glib::RefPtr<Gtk::ListStore> _a_store;
+ LuaActionScriptModelColumns _a_model;
+ Gtk::TreeView _a_view;
+
+ /* action callback hooks */
+ void setup_callbacks ();
+ void callback_selection_changed ();
+ void set_callback_script_name (PBD::ID, const std::string&, const ActionHook& ah);
+
+ void add_callback_btn_clicked ();
+ void del_callback_btn_clicked ();
+
+ class LuaCallbackScriptModelColumns : public Gtk::TreeModelColumnRecord
+ {
+ public:
+ LuaCallbackScriptModelColumns ()
+ {
+ add (id);
+ add (name);
+ add (signals);
+ }
+
+ Gtk::TreeModelColumn<PBD::ID> id;
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<std::string> signals;
+ };
+
+ Glib::RefPtr<Gtk::ListStore> _c_store;
+ LuaCallbackScriptModelColumns _c_model;
+ Gtk::TreeView _c_view;
+
+ Gtk::Button _c_add_button;
+ Gtk::Button _c_del_button;
+};
+
+#endif /* _gtk2_ardour_lua_script_manager_h_ */
diff --git a/gtk2_ardour/luadoc.cc b/gtk2_ardour/luadoc.cc
new file mode 100644
index 0000000..35aaeed
--- /dev/null
+++ b/gtk2_ardour/luadoc.cc
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <string.h>
+#include <iostream>
+
+#include "ardour/luabindings.h"
+#include "ardour/revision.h"
+#include "luainstance.h"
+#include "LuaBridge/LuaBridge.h"
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-version.h"
+#endif
+
+int main (int argc, char **argv)
+{
+#ifdef LUABINDINGDOC
+ luabridge::setPrintBindings (true);
+ LuaState lua;
+ lua_State* L = lua.getState ();
+#ifdef LUADOCOUT
+ printf ("-- %s\n", ARDOUR::revision);
+ printf ("doc = {\n");
+#else
+ printf ("[\n");
+ printf ("{\"version\" : \"%s\"},\n\n", ARDOUR::revision);
+#endif
+ LuaInstance::register_classes (L);
+ ARDOUR::LuaBindings::dsp (L);
+#ifdef LUADOCOUT
+ printf ("}\n");
+#else
+ printf ("{} ]\n");
+#endif
+ return 0;
+#else
+ return 1;
+#endif
+}
diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc
new file mode 100644
index 0000000..c813eee
--- /dev/null
+++ b/gtk2_ardour/luainstance.cc
@@ -0,0 +1,1789 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <cairomm/context.h>
+#include <cairomm/surface.h>
+#include <pango/pangocairo.h>
+
+#include "gtkmm2ext/gui_thread.h"
+
+#include "ardour/audioengine.h"
+#include "ardour/diskstream.h"
+#include "ardour/plugin_manager.h"
+#include "ardour/route.h"
+#include "ardour/session.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#include "ardour_http.h"
+#include "ardour_ui.h"
+#include "public_editor.h"
+#include "region_selection.h"
+#include "luainstance.h"
+#include "luasignal.h"
+#include "marker.h"
+#include "time_axis_view.h"
+#include "selection.h"
+#include "script_selector.h"
+#include "timers.h"
+#include "utils_videotl.h"
+
+#include "pbd/i18n.h"
+
+namespace LuaCairo {
+/** wrap RefPtr< Cairo::ImageSurface >
+ *
+ * Image surfaces provide the ability to render to memory buffers either
+ * allocated by cairo or by the calling code. The supported image formats are
+ * those defined in Cairo::Format.
+ */
+class ImageSurface {
+ public:
+ /**
+ * Creates an image surface of the specified format and dimensions. Initially
+ * the surface contents are all 0. (Specifically, within each pixel, each
+ * color or alpha channel belonging to format will be 0. The contents of bits
+ * within a pixel, but not belonging to the given format are undefined).
+ *
+ * @param format format of pixels in the surface to create
+ * @param width width of the surface, in pixels
+ * @param height height of the surface, in pixels
+ */
+ ImageSurface (Cairo::Format format, int width, int height)
+ : _surface (Cairo::ImageSurface::create (format, width, height))
+ , _ctx (Cairo::Context::create (_surface))
+ , ctx (_ctx->cobj ()) {}
+
+ ~ImageSurface () {}
+
+ /**
+ * Set this surface as source for another context.
+ * This allows to draw this surface
+ */
+ void set_as_source (Cairo::Context* c, int x, int y) {
+ _surface->flush ();
+ c->set_source (_surface, x, y);
+ }
+
+ /**
+ * Returns a context object to perform operations on the surface
+ */
+ Cairo::Context* context () {
+ return (Cairo::Context *)&ctx;
+ }
+
+ /**
+ * Returns the stride of the image surface in bytes (or 0 if surface is not
+ * an image surface). The stride is the distance in bytes from the beginning
+ * of one row of the image data to the beginning of the next row.
+ */
+ int get_stride () const {
+ return _surface->get_stride ();
+ }
+
+ /** Gets the width of the ImageSurface in pixels */
+ int get_width () const {
+ return _surface->get_width ();
+ }
+
+ /** Gets the height of the ImageSurface in pixels */
+ int get_height () const {
+ return _surface->get_height ();
+ }
+
+ /**
+ * Get a pointer to the data of the image surface, for direct
+ * inspection or modification.
+ *
+ * Return value: a pointer to the image data of this surface or NULL
+ * if @surface is not an image surface.
+ *
+ */
+ unsigned char* get_data () {
+ return _surface->get_data ();
+ }
+
+ /** Tells cairo to consider the data buffer dirty.
+ *
+ * In particular, if you've created an ImageSurface with a data buffer that
+ * you've allocated yourself and you draw to that data buffer using means
+ * other than cairo, you must call mark_dirty() before doing any additional
+ * drawing to that surface with cairo.
+ *
+ * Note that if you do draw to the Surface outside of cairo, you must call
+ * flush() before doing the drawing.
+ */
+ void mark_dirty () {
+ _surface->mark_dirty ();
+ }
+
+ /** Marks a rectangular area of the given surface dirty.
+ *
+ * @param x X coordinate of dirty rectangle
+ * @param y Y coordinate of dirty rectangle
+ * @param width width of dirty rectangle
+ * @param height height of dirty rectangle
+ */
+ void mark_dirty (int x, int y, int width, int height) {
+ _surface->mark_dirty (x, y, width, height);
+ }
+
+ private:
+ Cairo::RefPtr<Cairo::ImageSurface> _surface;
+ Cairo::RefPtr<Cairo::Context> _ctx;
+ Cairo::Context ctx;
+};
+
+class PangoLayout {
+ public:
+ /** Create a new PangoLayout Text Display
+ * @param c CairoContext for the layout
+ * @param font_name a font-description e.g. "Mono 8px"
+ */
+ PangoLayout (Cairo::Context* c, std::string font_name) {
+ ::PangoLayout* pl = pango_cairo_create_layout (c->cobj ());
+ _layout = Glib::wrap (pl);
+ Pango::FontDescription fd (font_name);
+ _layout->set_font_description (fd);
+ }
+
+ ~PangoLayout () {}
+
+ /** Gets the text in the layout. The returned text should not
+ * be freed or modified.
+ *
+ * @return The text in the @a layout.
+ */
+ std::string get_text () const {
+ return _layout->get_text ();
+ }
+ /** Set the text of the layout.
+ * @param text The text for the layout.
+ */
+ void set_text (const std::string& text) {
+ _layout->set_text (text);
+ }
+
+ /** Sets the layout text and attribute list from marked-up text (see markup format).
+ * Replaces the current text and attribute list.
+ * @param markup Some marked-up text.
+ */
+ void set_markup (const std::string& markup) {
+ _layout->set_markup (markup);
+ }
+
+ /** Sets the width to which the lines of the Pango::Layout should wrap or
+ * ellipsized. The default value is -1: no width set.
+ *
+ * @param width The desired width in Pango units, or -1 to indicate that no
+ * wrapping or ellipsization should be performed.
+ */
+ void set_width (int width) {
+ _layout->set_width (width * PANGO_SCALE);
+ }
+
+ /** Gets the width to which the lines of the Pango::Layout should wrap.
+ *
+ * @return The width in Pango units, or -1 if no width set.
+ */
+ int get_width () const {
+ return _layout->get_width () / PANGO_SCALE;
+ }
+
+ /** Sets the type of ellipsization being performed for @a layout.
+ * Depending on the ellipsization mode @a ellipsize text is
+ * removed from the start, middle, or end of text so they
+ * fit within the width and height of layout set with
+ * set_width() and set_height().
+ *
+ * If the layout contains characters such as newlines that
+ * force it to be layed out in multiple paragraphs, then whether
+ * each paragraph is ellipsized separately or the entire layout
+ * is ellipsized as a whole depends on the set height of the layout.
+ * See set_height() for details.
+ *
+ * @param ellipsize The new ellipsization mode for @a layout.
+ */
+ void set_ellipsize (Pango::EllipsizeMode ellipsize) {
+ _layout->set_ellipsize (ellipsize);
+ }
+
+ /** Gets the type of ellipsization being performed for @a layout.
+ * See set_ellipsize()
+ *
+ * @return The current ellipsization mode for @a layout.
+ *
+ * Use is_ellipsized() to query whether any paragraphs
+ * were actually ellipsized.
+ */
+ Pango::EllipsizeMode get_ellipsize () const {
+ return _layout->get_ellipsize ();
+ }
+
+ /** Queries whether the layout had to ellipsize any paragraphs.
+ *
+ * This returns <tt>true</tt> if the ellipsization mode for @a layout
+ * is not Pango::ELLIPSIZE_NONE, a positive width is set on @a layout,
+ * and there are paragraphs exceeding that width that have to be
+ * ellipsized.
+ *
+ * @return <tt>true</tt> if any paragraphs had to be ellipsized, <tt>false</tt>
+ * otherwise.
+ */
+ bool is_ellipsized () const {
+ return _layout->is_ellipsized ();
+ }
+
+ /** Sets the wrap mode; the wrap mode only has effect if a width
+ * is set on the layout with set_width().
+ * To turn off wrapping, set the width to -1.
+ *
+ * @param wrap The wrap mode.
+ */
+ void set_wrap (Pango::WrapMode wrap) {
+ _layout->set_width (wrap);
+ }
+
+ /** Gets the wrap mode for the layout.
+ *
+ * Use is_wrapped() to query whether any paragraphs
+ * were actually wrapped.
+ *
+ * @return Active wrap mode.
+ */
+ Pango::WrapMode get_wrap () const {
+ return _layout->get_wrap ();
+ }
+
+ /** Queries whether the layout had to wrap any paragraphs.
+ *
+ * This returns <tt>true</tt> if a positive width is set on @a layout,
+ * ellipsization mode of @a layout is set to Pango::ELLIPSIZE_NONE,
+ * and there are paragraphs exceeding the layout width that have
+ * to be wrapped.
+ *
+ * @return <tt>true</tt> if any paragraphs had to be wrapped, <tt>false</tt>
+ * otherwise.
+ */
+ bool is_wrapped () const {
+ return _layout->is_wrapped ();
+ }
+
+ /** Determines the logical width and height of a Pango::Layout
+ * in device units.
+ */
+ int get_pixel_size (lua_State *L) {
+ int width, height;
+ _layout->get_pixel_size (width, height);
+ luabridge::Stack<int>::push (L, width);
+ luabridge::Stack<int>::push (L, height);
+ return 2;
+ }
+
+
+ /** Draws a Layout in the specified Cairo @a context. The top-left
+ * corner of the Layout will be drawn at the current point of the
+ * cairo context.
+ *
+ * @param context A Cairo context.
+ */
+ void show_in_cairo_context (Cairo::Context* c) {
+ pango_cairo_update_layout (c->cobj (), _layout->gobj());
+ pango_cairo_show_layout (c->cobj (), _layout->gobj());
+ }
+
+ private:
+ Glib::RefPtr<Pango::Layout> _layout;
+};
+
+}; // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace LuaSignal {
+
+#define STATIC(name,c,p) else if (!strcmp(type, #name)) {return name;}
+#define SESSION(name,c,p) else if (!strcmp(type, #name)) {return name;}
+#define ENGINE(name,c,p) else if (!strcmp(type, #name)) {return name;}
+
+LuaSignal
+str2luasignal (const std::string &str) {
+ const char* type = str.c_str();
+ if (0) { }
+# include "luasignal_syms.h"
+ else {
+ PBD::fatal << string_compose (_("programming error: %1: %2"), "Impossible LuaSignal type", str) << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+}
+#undef STATIC
+#undef SESSION
+#undef ENGINE
+
+#define STATIC(name,c,p) N_(#name),
+#define SESSION(name,c,p) N_(#name),
+#define ENGINE(name,c,p) N_(#name),
+const char *luasignalstr[] = {
+# include "luasignal_syms.h"
+ 0
+};
+
+#undef STATIC
+#undef SESSION
+#undef ENGINE
+}; // namespace
+
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define xstr(s) stringify(s)
+#define stringify(s) #s
+
+using namespace ARDOUR;
+
+PBD::Signal0<void> LuaInstance::LuaTimerDS;
+
+void
+LuaInstance::register_hooks (lua_State* L)
+{
+
+#define ENGINE(name,c,p) .addConst (stringify(name), (LuaSignal::LuaSignal)LuaSignal::name)
+#define STATIC(name,c,p) .addConst (stringify(name), (LuaSignal::LuaSignal)LuaSignal::name)
+#define SESSION(name,c,p) .addConst (stringify(name), (LuaSignal::LuaSignal)LuaSignal::name)
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("LuaSignal")
+# include "luasignal_syms.h"
+ .endNamespace ();
+#undef ENGINE
+#undef SESSION
+#undef STATIC
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("LuaSignal")
+ .beginStdBitSet <LuaSignal::LAST_SIGNAL> ("Set")
+ .endClass()
+ .endNamespace ();
+}
+
+void
+LuaInstance::bind_cairo (lua_State* L)
+{
+ /* std::vector<double> for set_dash()
+ * for Windows (DLL, .exe) this needs to be bound in the same memory context as "Cairo".
+ *
+ * The std::vector<> argument in set_dash() has a fixed address in ardour.exe, while
+ * the address of the one in libardour.dll is mapped when loading the .dll
+ *
+ * see LuaBindings::set_session() for a detailed explanation
+ */
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("C")
+ .beginStdVector <double> ("DoubleVector")
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Cairo")
+ .beginClass <Cairo::Context> ("Context")
+ .addFunction ("save", &Cairo::Context::save)
+ .addFunction ("restore", &Cairo::Context::restore)
+ .addFunction ("set_operator", &Cairo::Context::set_operator)
+ //.addFunction ("set_source", &Cairo::Context::set_operator) // needs RefPtr
+ .addFunction ("set_source_rgb", &Cairo::Context::set_source_rgb)
+ .addFunction ("set_source_rgba", &Cairo::Context::set_source_rgba)
+ .addFunction ("set_line_width", &Cairo::Context::set_line_width)
+ .addFunction ("set_line_cap", &Cairo::Context::set_line_cap)
+ .addFunction ("set_line_join", &Cairo::Context::set_line_join)
+ .addFunction ("set_dash", (void (Cairo::Context::*)(const std::vector<double>&, double))&Cairo::Context::set_dash)
+ .addFunction ("unset_dash", &Cairo::Context::unset_dash)
+ .addFunction ("translate", &Cairo::Context::translate)
+ .addFunction ("scale", &Cairo::Context::scale)
+ .addFunction ("rotate", &Cairo::Context::rotate)
+ .addFunction ("begin_new_path", &Cairo::Context::begin_new_path)
+ .addFunction ("begin_new_sub_path", &Cairo::Context::begin_new_sub_path)
+ .addFunction ("move_to", &Cairo::Context::move_to)
+ .addFunction ("line_to", &Cairo::Context::line_to)
+ .addFunction ("curve_to", &Cairo::Context::curve_to)
+ .addFunction ("arc", &Cairo::Context::arc)
+ .addFunction ("arc_negative", &Cairo::Context::arc_negative)
+ .addFunction ("rel_move_to", &Cairo::Context::rel_move_to)
+ .addFunction ("rel_line_to", &Cairo::Context::rel_line_to)
+ .addFunction ("rel_curve_to", &Cairo::Context::rel_curve_to)
+ .addFunction ("rectangle", (void (Cairo::Context::*)(double, double, double, double))&Cairo::Context::rectangle)
+ .addFunction ("close_path", &Cairo::Context::close_path)
+ .addFunction ("paint", &Cairo::Context::paint)
+ .addFunction ("paint_with_alpha", &Cairo::Context::paint_with_alpha)
+ .addFunction ("stroke", &Cairo::Context::stroke)
+ .addFunction ("stroke_preserve", &Cairo::Context::stroke_preserve)
+ .addFunction ("fill", &Cairo::Context::fill)
+ .addFunction ("fill_preserve", &Cairo::Context::fill_preserve)
+ .addFunction ("reset_clip", &Cairo::Context::reset_clip)
+ .addFunction ("clip", &Cairo::Context::clip)
+ .addFunction ("clip_preserve", &Cairo::Context::clip_preserve)
+ .addFunction ("set_font_size", &Cairo::Context::set_font_size)
+ .addFunction ("show_text", &Cairo::Context::show_text)
+ .endClass ()
+ /* enums */
+ // LineCap, LineJoin, Operator
+ .beginNamespace ("LineCap")
+ .addConst ("Butt", CAIRO_LINE_CAP_BUTT)
+ .addConst ("Round", CAIRO_LINE_CAP_ROUND)
+ .addConst ("Square", CAIRO_LINE_CAP_SQUARE)
+ .endNamespace ()
+
+ .beginNamespace ("LineJoin")
+ .addConst ("Miter", CAIRO_LINE_JOIN_MITER)
+ .addConst ("Round", CAIRO_LINE_JOIN_ROUND)
+ .addConst ("Bevel", CAIRO_LINE_JOIN_BEVEL)
+ .endNamespace ()
+
+ .beginNamespace ("Operator")
+ .addConst ("Clear", CAIRO_OPERATOR_CLEAR)
+ .addConst ("Source", CAIRO_OPERATOR_SOURCE)
+ .addConst ("Over", CAIRO_OPERATOR_OVER)
+ .addConst ("Add", CAIRO_OPERATOR_ADD)
+ .endNamespace ()
+
+ .beginNamespace ("Format")
+ .addConst ("ARGB32", CAIRO_FORMAT_ARGB32)
+ .addConst ("RGB24", CAIRO_FORMAT_RGB24)
+ .endNamespace ()
+
+ .beginClass <LuaCairo::ImageSurface> ("ImageSurface")
+ .addConstructor <void (*) (Cairo::Format, int, int)> ()
+ .addFunction ("set_as_source", &LuaCairo::ImageSurface::set_as_source)
+ .addFunction ("context", &LuaCairo::ImageSurface::context)
+ .addFunction ("get_stride", &LuaCairo::ImageSurface::get_stride)
+ .addFunction ("get_width", &LuaCairo::ImageSurface::get_width)
+ .addFunction ("get_height", &LuaCairo::ImageSurface::get_height)
+ //.addFunction ("get_data", &LuaCairo::ImageSurface::get_data) // uint8_t* array is n/a
+ .endClass ()
+
+ .beginClass <LuaCairo::PangoLayout> ("PangoLayout")
+ .addConstructor <void (*) (Cairo::Context*, std::string)> ()
+ .addCFunction ("get_pixel_size", &LuaCairo::PangoLayout::get_pixel_size)
+ .addFunction ("get_text", &LuaCairo::PangoLayout::get_text)
+ .addFunction ("set_text", &LuaCairo::PangoLayout::set_text)
+ .addFunction ("show_in_cairo_context", &LuaCairo::PangoLayout::show_in_cairo_context)
+ .addFunction ("set_markup", &LuaCairo::PangoLayout::set_markup)
+ .addFunction ("set_width", &LuaCairo::PangoLayout::set_width)
+ .addFunction ("set_ellipsize", &LuaCairo::PangoLayout::set_ellipsize)
+ .addFunction ("get_ellipsize", &LuaCairo::PangoLayout::get_ellipsize)
+ .addFunction ("is_ellipsized", &LuaCairo::PangoLayout::is_ellipsized)
+ .addFunction ("set_wrap", &LuaCairo::PangoLayout::set_wrap)
+ .addFunction ("get_wrap", &LuaCairo::PangoLayout::get_wrap)
+ .addFunction ("is_wrapped", &LuaCairo::PangoLayout::is_wrapped)
+ .endClass ()
+
+ /* enums */
+ .beginNamespace ("EllipsizeMode")
+ .addConst ("None", Pango::ELLIPSIZE_NONE)
+ .addConst ("Start", Pango::ELLIPSIZE_START)
+ .addConst ("Middle", Pango::ELLIPSIZE_MIDDLE)
+ .addConst ("End", Pango::ELLIPSIZE_END)
+ .endNamespace ()
+
+ .beginNamespace ("WrapMode")
+ .addConst ("Word", Pango::WRAP_WORD)
+ .addConst ("Char", Pango::WRAP_CHAR)
+ .addConst ("WordChar", Pango::WRAP_WORD_CHAR)
+ .endNamespace ()
+
+ .endNamespace ();
+
+/* Lua/cairo bindings operate on Cairo::Context, there is no Cairo::RefPtr wrapper [yet].
+ one can work around this as follows:
+
+ LuaState lua;
+ LuaInstance::register_classes (lua.getState());
+ lua.do_command (
+ "function render (ctx)"
+ " ctx:rectangle (0, 0, 100, 100)"
+ " ctx:set_source_rgba (0.1, 1.0, 0.1, 1.0)"
+ " ctx:fill ()"
+ " end"
+ );
+ {
+ Cairo::RefPtr<Cairo::Context> context = get_window ()->create_cairo_context ();
+ Cairo::Context ctx (context->cobj ());
+
+ luabridge::LuaRef lua_render = luabridge::getGlobal (lua.getState(), "render");
+ lua_render ((Cairo::Context *)&ctx);
+ }
+*/
+
+}
+
+void
+LuaInstance::register_classes (lua_State* L)
+{
+ LuaBindings::stddef (L);
+ LuaBindings::common (L);
+ LuaBindings::session (L);
+ LuaBindings::osc (L);
+
+ bind_cairo (L);
+ register_hooks (L);
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ArdourUI")
+
+ .addFunction ("http_get", (std::string (*)(const std::string&))&ArdourCurl::http_get)
+
+ .beginStdList <ArdourMarker*> ("ArdourMarkerList")
+ .endClass ()
+
+ .beginClass <ArdourMarker> ("ArdourMarker")
+ .addFunction ("name", &ArdourMarker::name)
+ .addFunction ("position", &ArdourMarker::position)
+ .addFunction ("_type", &ArdourMarker::type)
+ .endClass ()
+
+#if 0
+ .beginClass <AxisView> ("AxisView")
+ .endClass ()
+ .deriveClass <TimeAxisView, AxisView> ("TimeAxisView")
+ .endClass ()
+ .deriveClass <RouteTimeAxisView, TimeAxisView> ("RouteTimeAxisView")
+ .endClass ()
+#endif
+
+ .beginClass <RegionSelection> ("RegionSelection")
+ .addFunction ("clear_all", &RegionSelection::clear_all)
+ .addFunction ("start", &RegionSelection::start)
+ .addFunction ("end_frame", &RegionSelection::end_frame)
+ .addFunction ("n_midi_regions", &RegionSelection::n_midi_regions)
+ .addFunction ("regionlist", &RegionSelection::regionlist) // XXX check windows binding (libardour)
+ .endClass ()
+
+ .deriveClass <TimeSelection, std::list<ARDOUR::AudioRange> > ("TimeSelection")
+ .addFunction ("start", &TimeSelection::start)
+ .addFunction ("end_frame", &TimeSelection::end_frame)
+ .addFunction ("length", &TimeSelection::length)
+ .endClass ()
+
+ .deriveClass <MarkerSelection, std::list<ArdourMarker*> > ("MarkerSelection")
+ .endClass ()
+
+ .beginClass <TrackViewList> ("TrackViewList")
+ .addFunction ("routelist", &TrackViewList::routelist) // XXX check windows binding (libardour)
+ .endClass ()
+
+ .deriveClass <TrackSelection, TrackViewList> ("TrackSelection")
+ .endClass ()
+
+ .beginClass <Selection> ("Selection")
+ .addFunction ("clear", &Selection::clear)
+ .addFunction ("clear_all", &Selection::clear_all)
+ .addFunction ("empty", &Selection::empty)
+ .addData ("tracks", &Selection::tracks)
+ .addData ("regions", &Selection::regions)
+ .addData ("time", &Selection::time)
+ .addData ("markers", &Selection::markers)
+#if 0
+ .addData ("lines", &Selection::lines)
+ .addData ("playlists", &Selection::playlists)
+ .addData ("points", &Selection::points)
+ .addData ("midi_regions", &Selection::midi_regions)
+ .addData ("midi_notes", &Selection::midi_notes) // cut buffer only
+#endif
+ .endClass ()
+
+ .beginClass <PublicEditor> ("Editor")
+ .addFunction ("snap_type", &PublicEditor::snap_type)
+ .addFunction ("snap_mode", &PublicEditor::snap_mode)
+ .addFunction ("set_snap_mode", &PublicEditor::set_snap_mode)
+ .addFunction ("set_snap_threshold", &PublicEditor::set_snap_threshold)
+
+ .addFunction ("undo", &PublicEditor::undo)
+ .addFunction ("redo", &PublicEditor::redo)
+
+ .addFunction ("set_mouse_mode", &PublicEditor::set_mouse_mode)
+ .addFunction ("current_mouse_mode", &PublicEditor::current_mouse_mode)
+
+ .addFunction ("consider_auditioning", &PublicEditor::consider_auditioning)
+
+ .addFunction ("new_region_from_selection", &PublicEditor::new_region_from_selection)
+ .addFunction ("separate_region_from_selection", &PublicEditor::separate_region_from_selection)
+ .addFunction ("pixel_to_sample", &PublicEditor::pixel_to_sample)
+ .addFunction ("sample_to_pixel", &PublicEditor::sample_to_pixel)
+
+ .addFunction ("get_selection", &PublicEditor::get_selection)
+ .addFunction ("get_cut_buffer", &PublicEditor::get_cut_buffer)
+ .addRefFunction ("get_selection_extents", &PublicEditor::get_selection_extents)
+
+ .addFunction ("play_selection", &PublicEditor::play_selection)
+ .addFunction ("play_with_preroll", &PublicEditor::play_with_preroll)
+ .addFunction ("maybe_locate_with_edit_preroll", &PublicEditor::maybe_locate_with_edit_preroll)
+ .addFunction ("goto_nth_marker", &PublicEditor::goto_nth_marker)
+
+ .addFunction ("add_location_from_playhead_cursor", &PublicEditor::add_location_from_playhead_cursor)
+ .addFunction ("remove_location_at_playhead_cursor", &PublicEditor::remove_location_at_playhead_cursor)
+
+ .addFunction ("set_show_measures", &PublicEditor::set_show_measures)
+ .addFunction ("show_measures", &PublicEditor::show_measures)
+ .addFunction ("remove_tracks", &PublicEditor::remove_tracks)
+
+ .addFunction ("set_loop_range", &PublicEditor::set_loop_range)
+ .addFunction ("set_punch_range", &PublicEditor::set_punch_range)
+
+ .addFunction ("effective_mouse_mode", &PublicEditor::effective_mouse_mode)
+
+ .addRefFunction ("do_import", &PublicEditor::do_import)
+ .addRefFunction ("do_embed", &PublicEditor::do_embed)
+
+ .addFunction ("export_audio", &PublicEditor::export_audio)
+ .addFunction ("stem_export", &PublicEditor::stem_export)
+ .addFunction ("export_selection", &PublicEditor::export_selection)
+ .addFunction ("export_range", &PublicEditor::export_range)
+
+ .addFunction ("set_zoom_focus", &PublicEditor::set_zoom_focus)
+ .addFunction ("get_zoom_focus", &PublicEditor::get_zoom_focus)
+ .addFunction ("get_current_zoom", &PublicEditor::get_current_zoom)
+ .addFunction ("reset_zoom", &PublicEditor::reset_zoom)
+
+#if 0 // These need TimeAxisView* which isn't exposed, yet
+ .addFunction ("playlist_selector", &PublicEditor::playlist_selector)
+ .addFunction ("clear_playlist", &PublicEditor::clear_playlist)
+ .addFunction ("new_playlists", &PublicEditor::new_playlists)
+ .addFunction ("copy_playlists", &PublicEditor::copy_playlists)
+ .addFunction ("clear_playlists", &PublicEditor::clear_playlists)
+#endif
+
+ .addFunction ("select_all_tracks", &PublicEditor::select_all_tracks)
+ .addFunction ("deselect_all", &PublicEditor::deselect_all)
+#if 0
+ .addFunction ("set_selected_track", &PublicEditor::set_selected_track)
+ .addFunction ("set_selected_mixer_strip", &PublicEditor::set_selected_mixer_strip)
+ .addFunction ("hide_track_in_display", &PublicEditor::hide_track_in_display)
+#endif
+ .addFunction ("set_stationary_playhead", &PublicEditor::set_stationary_playhead)
+ .addFunction ("stationary_playhead", &PublicEditor::stationary_playhead)
+ .addFunction ("set_follow_playhead", &PublicEditor::set_follow_playhead)
+ .addFunction ("follow_playhead", &PublicEditor::follow_playhead)
+
+ .addFunction ("dragging_playhead", &PublicEditor::dragging_playhead)
+ .addFunction ("leftmost_sample", &PublicEditor::leftmost_sample)
+ .addFunction ("current_page_samples", &PublicEditor::current_page_samples)
+ .addFunction ("visible_canvas_height", &PublicEditor::visible_canvas_height)
+ .addFunction ("temporal_zoom_step", &PublicEditor::temporal_zoom_step)
+ //.addFunction ("ensure_time_axis_view_is_visible", &PublicEditor::ensure_time_axis_view_is_visible)
+ .addFunction ("override_visible_track_count", &PublicEditor::override_visible_track_count)
+
+ .addFunction ("scroll_tracks_down_line", &PublicEditor::scroll_tracks_down_line)
+ .addFunction ("scroll_tracks_up_line", &PublicEditor::scroll_tracks_up_line)
+ .addFunction ("scroll_down_one_track", &PublicEditor::scroll_down_one_track)
+ .addFunction ("scroll_up_one_track", &PublicEditor::scroll_up_one_track)
+
+ .addFunction ("reset_x_origin", &PublicEditor::reset_x_origin)
+ .addFunction ("get_y_origin", &PublicEditor::get_y_origin)
+ .addFunction ("reset_y_origin", &PublicEditor::reset_y_origin)
+
+ .addFunction ("remove_last_capture", &PublicEditor::remove_last_capture)
+
+ .addFunction ("maximise_editing_space", &PublicEditor::maximise_editing_space)
+ .addFunction ("restore_editing_space", &PublicEditor::restore_editing_space)
+ .addFunction ("toggle_meter_updating", &PublicEditor::toggle_meter_updating)
+
+ //.addFunction ("get_preferred_edit_position", &PublicEditor::get_preferred_edit_position)
+ //.addFunction ("split_regions_at", &PublicEditor::split_regions_at)
+
+ .addRefFunction ("get_nudge_distance", &PublicEditor::get_nudge_distance)
+ .addFunction ("get_paste_offset", &PublicEditor::get_paste_offset)
+ .addFunction ("get_grid_beat_divisions", &PublicEditor::get_grid_beat_divisions)
+ .addRefFunction ("get_grid_type_as_beats", &PublicEditor::get_grid_type_as_beats)
+
+ .addFunction ("toggle_ruler_video", &PublicEditor::toggle_ruler_video)
+ .addFunction ("toggle_xjadeo_proc", &PublicEditor::toggle_xjadeo_proc)
+ .addFunction ("get_videotl_bar_height", &PublicEditor::get_videotl_bar_height)
+ .addFunction ("set_video_timeline_height", &PublicEditor::set_video_timeline_height)
+
+#if 0
+ .addFunction ("get_route_view_by_route_id", &PublicEditor::get_route_view_by_route_id)
+ .addFunction ("get_equivalent_regions", &PublicEditor::get_equivalent_regions)
+
+ .addFunction ("axis_view_from_route", &PublicEditor::axis_view_from_route)
+ .addFunction ("axis_views_from_routes", &PublicEditor::axis_views_from_routes)
+ .addFunction ("get_track_views", &PublicEditor::get_track_views)
+ .addFunction ("drags", &PublicEditor::drags)
+#endif
+
+ .addFunction ("center_screen", &PublicEditor::center_screen)
+
+ .addFunction ("get_smart_mode", &PublicEditor::get_smart_mode)
+ .addRefFunction ("get_pointer_position", &PublicEditor::get_pointer_position)
+
+ .addRefFunction ("find_location_from_marker", &PublicEditor::find_location_from_marker)
+ .addFunction ("find_marker_from_location_id", &PublicEditor::find_marker_from_location_id)
+ .addFunction ("mouse_add_new_marker", &PublicEditor::mouse_add_new_marker)
+#if 0
+ .addFunction ("get_regions_at", &PublicEditor::get_regions_at)
+ .addFunction ("get_regions_after", &PublicEditor::get_regions_after)
+ .addFunction ("get_regions_from_selection_and_mouse", &PublicEditor::get_regions_from_selection_and_mouse)
+ .addFunction ("get_regionviews_by_id", &PublicEditor::get_regionviews_by_id)
+ .addFunction ("get_per_region_note_selection", &PublicEditor::get_per_region_note_selection)
+#endif
+
+#if 0
+ .addFunction ("mouse_add_new_tempo_event", &PublicEditor::mouse_add_new_tempo_event)
+ .addFunction ("mouse_add_new_meter_event", &PublicEditor::mouse_add_new_meter_event)
+ .addFunction ("edit_tempo_section", &PublicEditor::edit_tempo_section)
+ .addFunction ("edit_meter_section", &PublicEditor::edit_meter_section)
+#endif
+
+ .addFunction ("access_action", &PublicEditor::access_action)
+ .endClass ()
+
+ /* ArdourUI enums */
+ .beginNamespace ("MarkerType")
+ .addConst ("Mark", ArdourMarker::Type(ArdourMarker::Mark))
+ .addConst ("Tempo", ArdourMarker::Type(ArdourMarker::Tempo))
+ .addConst ("Meter", ArdourMarker::Type(ArdourMarker::Meter))
+ .addConst ("SessionStart", ArdourMarker::Type(ArdourMarker::SessionStart))
+ .addConst ("SessionEnd", ArdourMarker::Type(ArdourMarker::SessionEnd))
+ .addConst ("RangeStart", ArdourMarker::Type(ArdourMarker::RangeStart))
+ .addConst ("RangeEnd", ArdourMarker::Type(ArdourMarker::RangeEnd))
+ .addConst ("LoopStart", ArdourMarker::Type(ArdourMarker::LoopStart))
+ .addConst ("LoopEnd", ArdourMarker::Type(ArdourMarker::LoopEnd))
+ .addConst ("PunchIn", ArdourMarker::Type(ArdourMarker::PunchIn))
+ .addConst ("PunchOut", ArdourMarker::Type(ArdourMarker::PunchOut))
+ .endNamespace ()
+
+ .endNamespace (); // end ArdourUI
+
+ // Editing Symbols
+
+#undef ZOOMFOCUS
+#undef SNAPTYPE
+#undef SNAPMODE
+#undef MOUSEMODE
+#undef DISPLAYCONTROL
+#undef IMPORTMODE
+#undef IMPORTPOSITION
+#undef IMPORTDISPOSITION
+
+#define ZOOMFOCUS(NAME) .addConst (stringify(NAME), (Editing::ZoomFocus)Editing::NAME)
+#define SNAPTYPE(NAME) .addConst (stringify(NAME), (Editing::SnapType)Editing::NAME)
+#define SNAPMODE(NAME) .addConst (stringify(NAME), (Editing::SnapMode)Editing::NAME)
+#define MOUSEMODE(NAME) .addConst (stringify(NAME), (Editing::MouseMode)Editing::NAME)
+#define DISPLAYCONTROL(NAME) .addConst (stringify(NAME), (Editing::DisplayControl)Editing::NAME)
+#define IMPORTMODE(NAME) .addConst (stringify(NAME), (Editing::ImportMode)Editing::NAME)
+#define IMPORTPOSITION(NAME) .addConst (stringify(NAME), (Editing::ImportPosition)Editing::NAME)
+#define IMPORTDISPOSITION(NAME) .addConst (stringify(NAME), (Editing::ImportDisposition)Editing::NAME)
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Editing")
+# include "editing_syms.h"
+ .endNamespace ();
+}
+
+#undef xstr
+#undef stringify
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace PBD;
+using namespace std;
+
+#ifndef NDEBUG
+static void _lua_print (std::string s) {
+ std::cout << "LuaInstance: " << s << "\n";
+}
+#endif
+
+LuaInstance* LuaInstance::_instance = 0;
+
+LuaInstance*
+LuaInstance::instance ()
+{
+ if (!_instance) {
+ _instance = new LuaInstance;
+ }
+
+ return _instance;
+}
+
+LuaInstance::LuaInstance ()
+{
+#ifndef NDEBUG
+ lua.Print.connect (&_lua_print);
+#endif
+ init ();
+
+ LuaScriptParamList args;
+}
+
+LuaInstance::~LuaInstance ()
+{
+ delete _lua_call_action;
+ delete _lua_add_action;
+ delete _lua_del_action;
+ delete _lua_get_action;
+
+ delete _lua_load;
+ delete _lua_save;
+ delete _lua_clear;
+ _callbacks.clear();
+}
+
+void
+LuaInstance::init ()
+{
+ lua.do_command (
+ "function ScriptManager ()"
+ " local self = { scripts = {}, instances = {} }"
+ ""
+ " local remove = function (id)"
+ " self.scripts[id] = nil"
+ " self.instances[id] = nil"
+ " end"
+ ""
+ " local addinternal = function (i, n, s, f, a)"
+ " assert(type(i) == 'number', 'id must be numeric')"
+ " assert(type(n) == 'string', 'Name must be string')"
+ " assert(type(s) == 'string', 'Script must be string')"
+ " assert(type(f) == 'function', 'Factory is a not a function')"
+ " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+ " self.scripts[i] = { ['n'] = n, ['s'] = s, ['f'] = f, ['a'] = a }"
+ " local env = _ENV; env.f = nil env.debug = nil os.exit = nil require = nil dofile = nil loadfile = nil package = nil"
+ " self.instances[i] = load (string.dump(f, true), nil, nil, env)(a)"
+ " end"
+ ""
+ " local call = function (id)"
+ " if type(self.instances[id]) == 'function' then"
+ " local status, err = pcall (self.instances[id])"
+ " if not status then"
+ " print ('action \"'.. id .. '\": ', err)" // error out
+ " remove (id)"
+ " end"
+ " end"
+ " collectgarbage()"
+ " end"
+ ""
+ " local add = function (i, n, s, b, a)"
+ " assert(type(b) == 'string', 'ByteCode must be string')"
+ " load (b)()" // assigns f
+ " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+ " addinternal (i, n, s, load(f), a)"
+ " end"
+ ""
+ " local get = function (id)"
+ " if type(self.scripts[id]) == 'table' then"
+ " return { ['name'] = self.scripts[id]['n'],"
+ " ['script'] = self.scripts[id]['s'],"
+ " ['args'] = self.scripts[id]['a'] }"
+ " end"
+ " return nil"
+ " end"
+ ""
+ " local function basic_serialize (o)"
+ " if type(o) == \"number\" then"
+ " return tostring(o)"
+ " else"
+ " return string.format(\"%q\", o)"
+ " end"
+ " end"
+ ""
+ " local function serialize (name, value)"
+ " local rv = name .. ' = '"
+ " collectgarbage()"
+ " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+ " return rv .. basic_serialize(value) .. ' '"
+ " elseif type(value) == \"table\" then"
+ " rv = rv .. '{} '"
+ " for k,v in pairs(value) do"
+ " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+ " rv = rv .. serialize(fieldname, v) .. ' '"
+ " collectgarbage()" // string concatenation allocates a new string
+ " end"
+ " return rv;"
+ " elseif type(value) == \"function\" then"
+ " return rv .. string.format(\"%q\", string.dump(value, true))"
+ " else"
+ " error('cannot save a ' .. type(value))"
+ " end"
+ " end"
+ ""
+ ""
+ " local save = function ()"
+ " return (serialize('scripts', self.scripts))"
+ " end"
+ ""
+ " local clear = function ()"
+ " self.scripts = {}"
+ " self.instances = {}"
+ " collectgarbage()"
+ " end"
+ ""
+ " local restore = function (state)"
+ " clear()"
+ " load (state)()"
+ " for i, s in pairs (scripts) do"
+ " addinternal (i, s['n'], s['s'], load(s['f']), s['a'])"
+ " end"
+ " collectgarbage()"
+ " end"
+ ""
+ " return { call = call, add = add, remove = remove, get = get,"
+ " restore = restore, save = save, clear = clear}"
+ " end"
+ " "
+ " manager = ScriptManager ()"
+ " ScriptManager = nil"
+ );
+
+ lua_State* L = lua.getState();
+
+ try {
+ luabridge::LuaRef lua_mgr = luabridge::getGlobal (L, "manager");
+ lua.do_command ("manager = nil"); // hide it.
+ lua.do_command ("collectgarbage()");
+
+ _lua_add_action = new luabridge::LuaRef(lua_mgr["add"]);
+ _lua_del_action = new luabridge::LuaRef(lua_mgr["remove"]);
+ _lua_get_action = new luabridge::LuaRef(lua_mgr["get"]);
+ _lua_call_action = new luabridge::LuaRef(lua_mgr["call"]);
+ _lua_save = new luabridge::LuaRef(lua_mgr["save"]);
+ _lua_load = new luabridge::LuaRef(lua_mgr["restore"]);
+ _lua_clear = new luabridge::LuaRef(lua_mgr["clear"]);
+
+ } catch (luabridge::LuaException const& e) {
+ fatal << string_compose (_("programming error: %1"),
+ X_("Failed to setup Lua action interpreter"))
+ << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+
+ register_classes (L);
+
+ luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
+ lua_setglobal (L, "Editor");
+}
+
+void LuaInstance::set_session (Session* s)
+{
+ SessionHandlePtr::set_session (s);
+ if (!_session) {
+ return;
+ }
+
+ lua_State* L = lua.getState();
+ LuaBindings::set_session (L, _session);
+
+ for (LuaCallbackMap::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) {
+ i->second->set_session (s);
+ }
+ point_one_second_connection = Timers::rapid_connect (sigc::mem_fun(*this, & LuaInstance::every_point_one_seconds));
+}
+
+void
+LuaInstance::session_going_away ()
+{
+ ENSURE_GUI_THREAD (*this, &LuaInstance::session_going_away);
+ point_one_second_connection.disconnect ();
+
+ (*_lua_clear)();
+ for (int i = 0; i < 9; ++i) {
+ ActionChanged (i, ""); /* EMIT SIGNAL */
+ }
+ SessionHandlePtr::session_going_away ();
+ _session = 0;
+
+ lua_State* L = lua.getState();
+ LuaBindings::set_session (L, _session);
+ lua.do_command ("collectgarbage();");
+}
+
+void
+LuaInstance::every_point_one_seconds ()
+{
+ LuaTimerDS (); // emit signal
+}
+
+int
+LuaInstance::set_state (const XMLNode& node)
+{
+ LocaleGuard lg;
+ XMLNode* child;
+
+ if ((child = find_named_node (node, "ActionScript"))) {
+ for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+ if (!(*n)->is_content ()) { continue; }
+ gsize size;
+ guchar* buf = g_base64_decode ((*n)->content ().c_str (), &size);
+ try {
+ (*_lua_load)(std::string ((const char*)buf, size));
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+ for (int i = 0; i < 9; ++i) {
+ std::string name;
+ if (lua_action_name (i, name)) {
+ ActionChanged (i, name); /* EMIT SIGNAL */
+ }
+ }
+ g_free (buf);
+ }
+ }
+
+ if ((child = find_named_node (node, "ActionHooks"))) {
+ for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+ try {
+ LuaCallbackPtr p (new LuaCallback (_session, *(*n)));
+ _callbacks.insert (std::make_pair(p->id(), p));
+ p->drop_callback.connect (_slotcon, MISSING_INVALIDATOR, boost::bind (&LuaInstance::unregister_lua_slot, this, p->id()), gui_context());
+ SlotChanged (p->id(), p->name(), p->signals()); /* EMIT SIGNAL */
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+ }
+ }
+
+ return 0;
+}
+
+bool
+LuaInstance::interactive_add (LuaScriptInfo::ScriptType type, int id)
+{
+ std::string title;
+ std::vector<std::string> reg;
+
+ switch (type) {
+ case LuaScriptInfo::EditorAction:
+ reg = lua_action_names ();
+ title = "Add Lua Action";
+ break;
+ case LuaScriptInfo::EditorHook:
+ reg = lua_slot_names ();
+ title = "Add Lua Callback Hook";
+ break;
+ default:
+ return false;
+ }
+
+ LuaScriptInfoPtr spi;
+ ScriptSelector ss (title, type);
+ switch (ss.run ()) {
+ case Gtk::RESPONSE_ACCEPT:
+ spi = ss.script();
+ break;
+ default:
+ return false;
+ }
+ ss.hide ();
+
+ std::string script = "";
+
+ try {
+ script = Glib::file_get_contents (spi->path);
+ } catch (Glib::FileError e) {
+ string msg = string_compose (_("Cannot read script '%1': %2"), spi->path, e.what());
+ Gtk::MessageDialog am (msg);
+ am.run ();
+ return false;
+ }
+
+ LuaScriptParamList lsp = LuaScriptParams::script_params (spi, "action_params");
+
+ ScriptParameterDialog spd (_("Set Script Parameters"), spi, reg, lsp);
+ switch (spd.run ()) {
+ case Gtk::RESPONSE_ACCEPT:
+ break;
+ default:
+ return false;
+ }
+
+ switch (type) {
+ case LuaScriptInfo::EditorAction:
+ return set_lua_action (id, spd.name(), script, lsp);
+ break;
+ case LuaScriptInfo::EditorHook:
+ return register_lua_slot (spd.name(), script, lsp);
+ break;
+ default:
+ break;
+ }
+ return false;
+}
+
+XMLNode&
+LuaInstance::get_action_state ()
+{
+ LocaleGuard lg;
+ std::string saved;
+ {
+ luabridge::LuaRef savedstate ((*_lua_save)());
+ saved = savedstate.cast<std::string>();
+ }
+ lua.collect_garbage ();
+
+ gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ());
+ std::string b64s (b64);
+ g_free (b64);
+
+ XMLNode* script_node = new XMLNode (X_("ActionScript"));
+ script_node->add_property (X_("lua"), LUA_VERSION);
+ script_node->add_content (b64s);
+
+ return *script_node;
+}
+
+XMLNode&
+LuaInstance::get_hook_state ()
+{
+ XMLNode* script_node = new XMLNode (X_("ActionHooks"));
+ for (LuaCallbackMap::const_iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) {
+ script_node->add_child_nocopy (i->second->get_state ());
+ }
+ return *script_node;
+}
+
+void
+LuaInstance::call_action (const int id)
+{
+ try {
+ (*_lua_call_action)(id + 1);
+ lua.collect_garbage_step ();
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+}
+
+bool
+LuaInstance::set_lua_action (
+ const int id,
+ const std::string& name,
+ const std::string& script,
+ const LuaScriptParamList& args)
+{
+ try {
+ lua_State* L = lua.getState();
+ // get bytcode of factory-function in a sandbox
+ // (don't allow scripts to interfere)
+ const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+ luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+ for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+ if ((*i)->optional && !(*i)->is_set) { continue; }
+ tbl_arg[(*i)->name] = (*i)->value;
+ }
+ (*_lua_add_action)(id + 1, name, script, bytecode, tbl_arg);
+ ActionChanged (id, name); /* EMIT SIGNAL */
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ return false;
+ }
+ return true;
+}
+
+bool
+LuaInstance::remove_lua_action (const int id)
+{
+ try {
+ (*_lua_del_action)(id + 1);
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ return false;
+ }
+ ActionChanged (id, ""); /* EMIT SIGNAL */
+ return true;
+}
+
+bool
+LuaInstance::lua_action_name (const int id, std::string& rv)
+{
+ try {
+ luabridge::LuaRef ref ((*_lua_get_action)(id + 1));
+ if (ref.isNil()) {
+ return false;
+ }
+ if (ref["name"].isString()) {
+ rv = ref["name"].cast<std::string>();
+ return true;
+ }
+ return true;
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ return false;
+ }
+ return false;
+}
+
+std::vector<std::string>
+LuaInstance::lua_action_names ()
+{
+ std::vector<std::string> rv;
+ for (int i = 0; i < 9; ++i) {
+ std::string name;
+ if (lua_action_name (i, name)) {
+ rv.push_back (name);
+ }
+ }
+ return rv;
+}
+
+bool
+LuaInstance::lua_action (const int id, std::string& name, std::string& script, LuaScriptParamList& args)
+{
+ try {
+ luabridge::LuaRef ref ((*_lua_get_action)(id + 1));
+ if (ref.isNil()) {
+ return false;
+ }
+ if (!ref["name"].isString()) {
+ return false;
+ }
+ if (!ref["script"].isString()) {
+ return false;
+ }
+ if (!ref["args"].isTable()) {
+ return false;
+ }
+ name = ref["name"].cast<std::string>();
+ script = ref["script"].cast<std::string>();
+
+ args.clear();
+ LuaScriptInfoPtr lsi = LuaScripting::script_info (script);
+ if (!lsi) {
+ return false;
+ }
+ args = LuaScriptParams::script_params (lsi, "action_params");
+ luabridge::LuaRef rargs (ref["args"]);
+ LuaScriptParams::ref_to_params (args, &rargs);
+ return true;
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ return false;
+ }
+ return false;
+}
+
+bool
+LuaInstance::register_lua_slot (const std::string& name, const std::string& script, const ARDOUR::LuaScriptParamList& args)
+{
+ /* parse script, get ActionHook(s) from script */
+ ActionHook ah;
+ try {
+ LuaState l;
+#ifndef NDEBUG
+ l.Print.connect (&_lua_print);
+#endif
+ lua_State* L = l.getState();
+ register_hooks (L);
+ l.do_command ("function ardour () end");
+ l.do_command (script);
+ luabridge::LuaRef signals = luabridge::getGlobal (L, "signals");
+ if (signals.isFunction()) {
+ ah = signals();
+ }
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+
+ if (ah.none ()) {
+ cerr << "Script registered no hooks." << endl;
+ return false;
+ }
+
+ /* register script w/args, get entry-point / ID */
+
+ try {
+ LuaCallbackPtr p (new LuaCallback (_session, name, script, ah, args));
+ _callbacks.insert (std::make_pair(p->id(), p));
+ p->drop_callback.connect (_slotcon, MISSING_INVALIDATOR, boost::bind (&LuaInstance::unregister_lua_slot, this, p->id()), gui_context());
+ SlotChanged (p->id(), p->name(), p->signals()); /* EMIT SIGNAL */
+ return true;
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+ return false;
+}
+
+bool
+LuaInstance::unregister_lua_slot (const PBD::ID& id)
+{
+ LuaCallbackMap::iterator i = _callbacks.find (id);
+ if (i != _callbacks.end()) {
+ SlotChanged (id, "", ActionHook()); /* EMIT SIGNAL */
+ _callbacks.erase (i);
+ return true;
+ }
+ return false;
+}
+
+std::vector<PBD::ID>
+LuaInstance::lua_slots () const
+{
+ std::vector<PBD::ID> rv;
+ for (LuaCallbackMap::const_iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) {
+ rv.push_back (i->first);
+ }
+ return rv;
+}
+
+bool
+LuaInstance::lua_slot_name (const PBD::ID& id, std::string& name) const
+{
+ LuaCallbackMap::const_iterator i = _callbacks.find (id);
+ if (i != _callbacks.end()) {
+ name = i->second->name();
+ return true;
+ }
+ return false;
+}
+
+std::vector<std::string>
+LuaInstance::lua_slot_names () const
+{
+ std::vector<std::string> rv;
+ std::vector<PBD::ID> ids = lua_slots();
+ for (std::vector<PBD::ID>::const_iterator i = ids.begin(); i != ids.end(); ++i) {
+ std::string name;
+ if (lua_slot_name (*i, name)) {
+ rv.push_back (name);
+ }
+ }
+ return rv;
+}
+
+bool
+LuaInstance::lua_slot (const PBD::ID& id, std::string& name, std::string& script, ActionHook& ah, ARDOUR::LuaScriptParamList& args)
+{
+ LuaCallbackMap::const_iterator i = _callbacks.find (id);
+ if (i == _callbacks.end()) {
+ return false; // error
+ }
+ return i->second->lua_slot (name, script, ah, args);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+LuaCallback::LuaCallback (Session *s,
+ const std::string& name,
+ const std::string& script,
+ const ActionHook& ah,
+ const ARDOUR::LuaScriptParamList& args)
+ : SessionHandlePtr (s)
+ , _id ("0")
+ , _name (name)
+ , _signals (ah)
+{
+ // TODO: allow to reference object (e.g region)
+ init ();
+
+ lua_State* L = lua.getState();
+ luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+ for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+ if ((*i)->optional && !(*i)->is_set) { continue; }
+ tbl_arg[(*i)->name] = (*i)->value;
+ }
+
+ try {
+ const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+ (*_lua_add)(name, script, bytecode, tbl_arg);
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ throw failed_constructor ();
+ }
+
+ _id.reset ();
+ set_session (s);
+}
+
+LuaCallback::LuaCallback (Session *s, XMLNode & node)
+ : SessionHandlePtr (s)
+{
+ XMLNode* child = NULL;
+ if (node.name() != X_("LuaCallback")
+ || !node.property ("signals")
+ || !node.property ("id")
+ || !node.property ("name")) {
+ throw failed_constructor ();
+ }
+
+ for (XMLNodeList::const_iterator n = node.children ().begin (); n != node.children ().end (); ++n) {
+ if (!(*n)->is_content ()) { continue; }
+ child = *n;
+ }
+
+ if (!child) {
+ throw failed_constructor ();
+ }
+
+ init ();
+
+ _id = PBD::ID (node.property ("id")->value ());
+ _name = node.property ("name")->value ();
+ _signals = ActionHook (node.property ("signals")->value ());
+
+ gsize size;
+ guchar* buf = g_base64_decode (child->content ().c_str (), &size);
+ try {
+ (*_lua_load)(std::string ((const char*)buf, size));
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+ g_free (buf);
+
+ set_session (s);
+}
+
+LuaCallback::~LuaCallback ()
+{
+ delete _lua_add;
+ delete _lua_get;
+ delete _lua_call;
+ delete _lua_load;
+ delete _lua_save;
+}
+
+XMLNode&
+LuaCallback::get_state (void)
+{
+ std::string saved;
+ {
+ luabridge::LuaRef savedstate ((*_lua_save)());
+ saved = savedstate.cast<std::string>();
+ }
+ lua.collect_garbage ();
+
+ gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ());
+ std::string b64s (b64);
+ g_free (b64);
+
+ XMLNode* script_node = new XMLNode (X_("LuaCallback"));
+ script_node->add_property (X_("lua"), LUA_VERSION);
+ script_node->add_property (X_("id"), _id.to_s ());
+ script_node->add_property (X_("name"), _name);
+ script_node->add_property (X_("signals"), _signals.to_string ());
+ script_node->add_content (b64s);
+ return *script_node;
+}
+
+void
+LuaCallback::init (void)
+{
+#ifndef NDEBUG
+ lua.Print.connect (&_lua_print);
+#endif
+
+ lua.do_command (
+ "function ScriptManager ()"
+ " local self = { script = {}, instance = {} }"
+ ""
+ " local addinternal = function (n, s, f, a)"
+ " assert(type(n) == 'string', 'Name must be string')"
+ " assert(type(s) == 'string', 'Script must be string')"
+ " assert(type(f) == 'function', 'Factory is a not a function')"
+ " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+ " self.script = { ['n'] = n, ['s'] = s, ['f'] = f, ['a'] = a }"
+ " local env = _ENV; env.f = nil env.debug = nil os.exit = nil require = nil dofile = nil loadfile = nil package = nil"
+ " self.instance = load (string.dump(f, true), nil, nil, env)(a)"
+ " end"
+ ""
+ " local call = function (...)"
+ " if type(self.instance) == 'function' then"
+ " local status, err = pcall (self.instance, ...)"
+ " if not status then"
+ " print ('callback \"'.. self.script['n'] .. '\": ', err)" // error out
+ " self.script = nil"
+ " self.instance = nil"
+ " return false"
+ " end"
+ " end"
+ " collectgarbage()"
+ " return true"
+ " end"
+ ""
+ " local add = function (n, s, b, a)"
+ " assert(type(b) == 'string', 'ByteCode must be string')"
+ " load (b)()" // assigns f
+ " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+ " addinternal (n, s, load(f), a)"
+ " end"
+ ""
+ " local get = function ()"
+ " if type(self.instance) == 'function' and type(self.script['n']) == 'string' then"
+ " return { ['name'] = self.script['n'],"
+ " ['script'] = self.script['s'],"
+ " ['args'] = self.script['a'] }"
+ " end"
+ " return nil"
+ " end"
+ ""
+ // code dup
+ ""
+ " local function basic_serialize (o)"
+ " if type(o) == \"number\" then"
+ " return tostring(o)"
+ " else"
+ " return string.format(\"%q\", o)"
+ " end"
+ " end"
+ ""
+ " local function serialize (name, value)"
+ " local rv = name .. ' = '"
+ " collectgarbage()"
+ " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+ " return rv .. basic_serialize(value) .. ' '"
+ " elseif type(value) == \"table\" then"
+ " rv = rv .. '{} '"
+ " for k,v in pairs(value) do"
+ " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+ " rv = rv .. serialize(fieldname, v) .. ' '"
+ " collectgarbage()" // string concatenation allocates a new string
+ " end"
+ " return rv;"
+ " elseif type(value) == \"function\" then"
+ " return rv .. string.format(\"%q\", string.dump(value, true))"
+ " else"
+ " error('cannot save a ' .. type(value))"
+ " end"
+ " end"
+ ""
+ // end code dup
+ ""
+ " local save = function ()"
+ " return (serialize('s', self.script))"
+ " end"
+ ""
+ " local restore = function (state)"
+ " self.script = {}"
+ " load (state)()"
+ " addinternal (s['n'], s['s'], load(s['f']), s['a'])"
+ " end"
+ ""
+ " return { call = call, add = add, get = get,"
+ " restore = restore, save = save}"
+ " end"
+ " "
+ " manager = ScriptManager ()"
+ " ScriptManager = nil"
+ );
+
+ lua_State* L = lua.getState();
+
+ try {
+ luabridge::LuaRef lua_mgr = luabridge::getGlobal (L, "manager");
+ lua.do_command ("manager = nil"); // hide it.
+ lua.do_command ("collectgarbage()");
+
+ _lua_add = new luabridge::LuaRef(lua_mgr["add"]);
+ _lua_get = new luabridge::LuaRef(lua_mgr["get"]);
+ _lua_call = new luabridge::LuaRef(lua_mgr["call"]);
+ _lua_save = new luabridge::LuaRef(lua_mgr["save"]);
+ _lua_load = new luabridge::LuaRef(lua_mgr["restore"]);
+
+ } catch (luabridge::LuaException const& e) {
+ fatal << string_compose (_("programming error: %1"),
+ X_("Failed to setup Lua callback interpreter"))
+ << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+
+ LuaInstance::register_classes (L);
+
+ luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
+ lua_setglobal (L, "Editor");
+}
+
+bool
+LuaCallback::lua_slot (std::string& name, std::string& script, ActionHook& ah, ARDOUR::LuaScriptParamList& args)
+{
+ // TODO consolidate w/ LuaInstance::lua_action()
+ try {
+ luabridge::LuaRef ref = (*_lua_get)();
+ if (ref.isNil()) {
+ return false;
+ }
+ if (!ref["name"].isString()) {
+ return false;
+ }
+ if (!ref["script"].isString()) {
+ return false;
+ }
+ if (!ref["args"].isTable()) {
+ return false;
+ }
+
+ ah = _signals;
+ name = ref["name"].cast<std::string> ();
+ script = ref["script"].cast<std::string> ();
+
+ args.clear();
+ LuaScriptInfoPtr lsi = LuaScripting::script_info (script);
+ if (!lsi) {
+ return false;
+ }
+ args = LuaScriptParams::script_params (lsi, "action_params");
+ luabridge::LuaRef rargs (ref["args"]);
+ LuaScriptParams::ref_to_params (args, &rargs);
+ return true;
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ return false;
+ }
+ return false;
+}
+
+void
+LuaCallback::set_session (ARDOUR::Session *s)
+{
+ SessionHandlePtr::set_session (s);
+
+ if (!_session) {
+ return;
+ }
+
+ lua_State* L = lua.getState();
+ LuaBindings::set_session (L, _session);
+
+ reconnect();
+}
+
+void
+LuaCallback::session_going_away ()
+{
+ ENSURE_GUI_THREAD (*this, &LuaCallback::session_going_away);
+ lua.do_command ("collectgarbage();");
+
+ SessionHandlePtr::session_going_away ();
+ _session = 0;
+
+ drop_callback (); /* EMIT SIGNAL */
+
+ lua_State* L = lua.getState();
+ LuaBindings::set_session (L, 0);
+ lua.do_command ("collectgarbage();");
+}
+
+void
+LuaCallback::reconnect ()
+{
+ _connections.drop_connections ();
+ if ((*_lua_get) ().isNil ()) {
+ drop_callback (); /* EMIT SIGNAL */
+ return;
+ }
+
+ // TODO pass object which emits the signal (e.g region)
+ //
+ // save/load bound objects will be tricky.
+ // Best idea so far is to save/lookup the PBD::ID
+ // (either use boost::any indirection or templates for bindable
+ // object types or a switch statement..)
+ //
+ // _session->route_by_id ()
+ // _session->track_by_diskstream_id ()
+ // _session->source_by_id ()
+ // _session->controllable_by_id ()
+ // _session->processor_by_id ()
+ // RegionFactory::region_by_id ()
+ //
+ // TODO loop over objects (if any)
+
+ reconnect_object ((void*)0);
+}
+
+template <class T> void
+LuaCallback::reconnect_object (T obj)
+{
+ for (uint32_t i = 0; i < LuaSignal::LAST_SIGNAL; ++i) {
+ if (_signals[i]) {
+#define ENGINE(n,c,p) else if (i == LuaSignal::n) { connect_ ## p (LuaSignal::n, AudioEngine::instance(), &(AudioEngine::instance()->c)); }
+#define SESSION(n,c,p) else if (i == LuaSignal::n) { if (_session) { connect_ ## p (LuaSignal::n, _session, &(_session->c)); } }
+#define STATIC(n,c,p) else if (i == LuaSignal::n) { connect_ ## p (LuaSignal::n, obj, c); }
+ if (0) {}
+# include "luasignal_syms.h"
+ else {
+ PBD::fatal << string_compose (_("programming error: %1: %2"), "Impossible LuaSignal type", i) << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+#undef ENGINE
+#undef SESSION
+#undef STATIC
+ }
+ }
+}
+
+template <typename T, typename S> void
+LuaCallback::connect_0 (enum LuaSignal::LuaSignal ls, T ref, S *signal) {
+ signal->connect (
+ _connections, invalidator (*this),
+ boost::bind (&LuaCallback::proxy_0<T>, this, ls, ref),
+ gui_context());
+}
+
+template <typename T, typename C1> void
+LuaCallback::connect_1 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal1<void, C1> *signal) {
+ signal->connect (
+ _connections, invalidator (*this),
+ boost::bind (&LuaCallback::proxy_1<T, C1>, this, ls, ref, _1),
+ gui_context());
+}
+
+template <typename T, typename C1, typename C2> void
+LuaCallback::connect_2 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal2<void, C1, C2> *signal) {
+ signal->connect (
+ _connections, invalidator (*this),
+ boost::bind (&LuaCallback::proxy_2<T, C1, C2>, this, ls, ref, _1, _2),
+ gui_context());
+}
+
+template <typename T> void
+LuaCallback::proxy_0 (enum LuaSignal::LuaSignal ls, T ref) {
+ bool ok = true;
+ {
+ const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref));
+ if (! rv.cast<bool> ()) {
+ ok = false;
+ }
+ }
+ /* destroy LuaRef ^^ first before calling drop_callback() */
+ if (!ok) {
+ drop_callback (); /* EMIT SIGNAL */
+ }
+}
+
+template <typename T, typename C1> void
+LuaCallback::proxy_1 (enum LuaSignal::LuaSignal ls, T ref, C1 a1) {
+ bool ok = true;
+ {
+ const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1));
+ if (! rv.cast<bool> ()) {
+ ok = false;
+ }
+ }
+ if (!ok) {
+ drop_callback (); /* EMIT SIGNAL */
+ }
+}
+
+template <typename T, typename C1, typename C2> void
+LuaCallback::proxy_2 (enum LuaSignal::LuaSignal ls, T ref, C1 a1, C2 a2) {
+ bool ok = true;
+ {
+ const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1, a2));
+ if (! rv.cast<bool> ()) {
+ ok = false;
+ }
+ }
+ if (!ok) {
+ drop_callback (); /* EMIT SIGNAL */
+ }
+}
diff --git a/gtk2_ardour/luainstance.h b/gtk2_ardour/luainstance.h
new file mode 100644
index 0000000..4291732
--- /dev/null
+++ b/gtk2_ardour/luainstance.h
@@ -0,0 +1,142 @@
+#ifndef __gtkardour_luainstance_h__
+#define __gtkardour_luainstance_h__
+
+#include <bitset>
+
+#include "pbd/id.h"
+#include "pbd/signals.h"
+#include "pbd/xml++.h"
+
+#include "ardour/luascripting.h"
+#include "ardour/lua_script_params.h"
+#include "ardour/luabindings.h"
+#include "ardour/session_handle.h"
+
+#include "lua/luastate.h"
+
+#include "luasignal.h"
+
+namespace luabridge {
+ class LuaRef;
+}
+
+typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
+
+class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
+{
+public:
+ LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
+ LuaCallback (ARDOUR::Session*, XMLNode & node);
+ ~LuaCallback ();
+
+ XMLNode& get_state (void);
+ void set_session (ARDOUR::Session *);
+
+ const PBD::ID& id () const { return _id; }
+ const std::string& name () const { return _name; }
+ ActionHook signals () const { return _signals; }
+ bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
+ PBD::Signal0<void> drop_callback;
+
+protected:
+ void session_going_away ();
+
+private:
+ LuaState lua;
+
+ PBD::ID _id;
+ std::string _name;
+ ActionHook _signals;
+
+ void reconnect ();
+ template <class T> void reconnect_object (T);
+ void init ();
+
+ luabridge::LuaRef * _lua_add;
+ luabridge::LuaRef * _lua_get;
+ luabridge::LuaRef * _lua_call;
+ luabridge::LuaRef * _lua_save;
+ luabridge::LuaRef * _lua_load;
+
+ PBD::ScopedConnectionList _connections;
+
+ template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
+ template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
+
+ template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
+ template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
+
+ template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
+ template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
+};
+
+typedef boost::shared_ptr<LuaCallback> LuaCallbackPtr;
+typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
+
+
+
+class LuaInstance : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+{
+public:
+ static LuaInstance* instance();
+ ~LuaInstance();
+
+ static void register_classes (lua_State* L);
+ static void register_hooks (lua_State* L);
+ static void bind_cairo (lua_State* L);
+
+ void set_session (ARDOUR::Session* s);
+
+ int set_state (const XMLNode&);
+ XMLNode& get_action_state (void);
+ XMLNode& get_hook_state (void);
+
+ bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
+
+ /* actions */
+ void call_action (const int);
+
+ bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
+ bool remove_lua_action (const int);
+ bool lua_action_name (const int, std::string&);
+ std::vector<std::string> lua_action_names ();
+ bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
+ sigc::signal<void,int,std::string> ActionChanged;
+
+ /* callbacks */
+ bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
+ bool unregister_lua_slot (const PBD::ID&);
+ std::vector<PBD::ID> lua_slots () const;
+ bool lua_slot_name (const PBD::ID&, std::string&) const;
+ std::vector<std::string> lua_slot_names () const;
+ bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
+ sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
+
+ static PBD::Signal0<void> LuaTimerDS; // deci-seconds (Timer every .1s)
+
+private:
+ LuaInstance();
+ static LuaInstance* _instance;
+
+ void init ();
+ void session_going_away ();
+
+ LuaState lua;
+
+ luabridge::LuaRef * _lua_call_action;
+ luabridge::LuaRef * _lua_add_action;
+ luabridge::LuaRef * _lua_del_action;
+ luabridge::LuaRef * _lua_get_action;
+
+ luabridge::LuaRef * _lua_load;
+ luabridge::LuaRef * _lua_save;
+ luabridge::LuaRef * _lua_clear;
+
+ LuaCallbackMap _callbacks;
+ PBD::ScopedConnectionList _slotcon;
+
+ void every_point_one_seconds ();
+ sigc::connection point_one_second_connection;
+};
+
+#endif
diff --git a/gtk2_ardour/luasignal.h b/gtk2_ardour/luasignal.h
new file mode 100644
index 0000000..ef2de4f
--- /dev/null
+++ b/gtk2_ardour/luasignal.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#ifndef _luasignal_h_
+#define _luasignal_h_
+namespace LuaSignal {
+
+#define ENGINE(name,c,p) name,
+#define STATIC(name,c,p) name,
+#define SESSION(name,c,p) name,
+
+ enum LuaSignal {
+# include "luasignal_syms.h"
+ LAST_SIGNAL
+ };
+
+#undef ENGINE
+#undef SESSION
+#undef STATIC
+
+extern const char *luasignalstr[];
+inline const char* enum2str (LuaSignal i) { return luasignalstr[i]; }
+LuaSignal str2luasignal (const std::string &);
+
+} // namespace
+#endif
diff --git a/gtk2_ardour/luasignal_syms.h b/gtk2_ardour/luasignal_syms.h
new file mode 100644
index 0000000..9cd1af7
--- /dev/null
+++ b/gtk2_ardour/luasignal_syms.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+// editor
+#if 0
+STATIC(SessionLoad, &, 0)
+STATIC(SessionClose, &, 0)
+#endif
+//STATIC(EverySecond, get_timers().second, 0) // XXX
+STATIC(ConfigChanged, &ARDOUR::Config->ParameterChanged, 1)
+
+// engine instance
+ENGINE(EngineRunning, Running, 0)
+ENGINE(EngineStopped, Stopped, 0)
+ENGINE(EngineHalted, Halted, 1)
+ENGINE(EngineDeviceListChanged, DeviceListChanged, 0)
+ENGINE(BufferSizeChanged, BufferSizeChanged, 1)
+ENGINE(SampleRateChanged, SampleRateChanged, 1)
+
+// session static
+STATIC(FeedbackDetected, &ARDOUR::Session::FeedbackDetected, 0)
+STATIC(SuccessfulGraphSort, &ARDOUR::Session::SuccessfulGraphSort, 0)
+STATIC(StartTimeChanged, &ARDOUR::Session::StartTimeChanged, 1)
+STATIC(EndTimeChanged, &ARDOUR::Session::EndTimeChanged, 1)
+STATIC(Exported, &ARDOUR::Session::Exported, 2)
+
+// stripable static globals
+STATIC(Change, &PresentationInfo::Change, 0)
+
+// session specific (re-subscribe when session changes)
+SESSION(SessionConfigChanged, config.ParameterChanged, 1)
+SESSION(TransportStateChange, TransportStateChange, 0)
+SESSION(DirtyChanged, DirtyChanged, 0)
+SESSION(StateSaved, StateSaved, 1)
+SESSION(Xrun, Xrun, 1)
+SESSION(TransportLooped, TransportLooped, 0)
+SESSION(SoloActive, SoloActive, 1)
+SESSION(SoloChanged, SoloChanged, 0)
+SESSION(IsolatedChanged, IsolatedChanged, 0)
+SESSION(MonitorChanged, MonitorChanged, 0)
+SESSION(RecordStateChanged, RecordStateChanged, 0)
+SESSION(RecordArmStateChanged, RecordArmStateChanged, 0)
+SESSION(AudioLoopLocationChanged, auto_loop_location_changed, 1)
+SESSION(AudioPunchLocationChanged, auto_punch_location_changed, 1)
+SESSION(LocationsModified, locations_modified, 0)
+SESSION(AuditionActive, AuditionActive, 1)
+SESSION(BundleAddedOrRemoved, BundleAddedOrRemoved, 0)
+SESSION(PositionChanged, PositionChanged, 1)
+SESSION(Located, Located, 0)
+SESSION(RoutesReconnected, session_routes_reconnected, 0)
+SESSION(RouteAdded, RouteAdded, 1)
+SESSION(RouteGroupPropertyChanged, RouteGroupPropertyChanged, 1)
+SESSION(RouteAddedToRouteGroup, RouteAddedToRouteGroup, 2)
+SESSION(RouteRemovedFromRouteGroup, RouteRemovedFromRouteGroup, 2)
+SESSION(StepEditStatusChange, StepEditStatusChange, 1)
+SESSION(RouteGroupAdded, route_group_added, 1)
+SESSION(RouteGroupRemoved, route_group_removed, 0)
+SESSION(RouteGroupsReordered, route_groups_reordered, 0)
+
+// plugin manager instance
+STATIC(PluginListChanged, &(PluginManager::instance().PluginListChanged), 0)
+STATIC(PluginStatusesChanged, &(PluginManager::instance().PluginStatusesChanged), 0)
+
+// Diskstream static global
+STATIC(DiskOverrun, &ARDOUR::Diskstream::DiskOverrun, 0)
+STATIC(DiskUnderrun, &ARDOUR::Diskstream::DiskUnderrun, 0)
+
+// Region static
+STATIC(RegionPropertyChanged, &ARDOUR::Region::RegionPropertyChanged, 2)
+
+// Timers
+STATIC(LuaTimerDS, &LuaInstance::LuaTimerDS, 0)
+
+// TODO per track/route signals,
+// TODO per plugin actions / controllables
+// TODO per region actions
+//SESSIONOBJECT(PropertyChanged, &ARDOUR::Stateful::PropertyChanged, 1)
+
+// TODO any location action
diff --git a/gtk2_ardour/luawindow.cc b/gtk2_ardour/luawindow.cc
new file mode 100644
index 0000000..4733bcb
--- /dev/null
+++ b/gtk2_ardour/luawindow.cc
@@ -0,0 +1,723 @@
+/*
+ Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifdef PLATFORM_WINDOWS
+#define random() rand()
+#endif
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
+#include "pbd/gstdio_compat.h"
+#include <glibmm/fileutils.h>
+#include <gtkmm/messagedialog.h>
+
+#include "pbd/basename.h"
+#include "pbd/file_utils.h"
+#include "pbd/md5.h"
+
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/pane.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/window_title.h"
+
+#include "ardour/filesystem_paths.h"
+#include "ardour/luabindings.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "ardour_ui.h"
+#include "gui_thread.h"
+#include "luainstance.h"
+#include "luawindow.h"
+#include "public_editor.h"
+#include "tooltips.h"
+#include "utils.h"
+#include "utils_videotl.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace PBD;
+using namespace Gtk;
+using namespace Glib;
+using namespace Gtkmm2ext;
+using namespace std;
+
+
+inline LuaWindow::BufferFlags operator| (const LuaWindow::BufferFlags& a, const LuaWindow::BufferFlags& b) {
+ return static_cast<LuaWindow::BufferFlags> (static_cast <int>(a) | static_cast<int> (b));
+}
+
+inline LuaWindow::BufferFlags operator|= (LuaWindow::BufferFlags& a, const LuaWindow::BufferFlags& b) {
+ return a = static_cast<LuaWindow::BufferFlags> (static_cast <int>(a) | static_cast<int> (b));
+}
+
+inline LuaWindow::BufferFlags operator&= (LuaWindow::BufferFlags& a, const LuaWindow::BufferFlags& b) {
+ return a = static_cast<LuaWindow::BufferFlags> (static_cast <int>(a) & static_cast<int> (b));
+}
+
+LuaWindow* LuaWindow::_instance = 0;
+
+LuaWindow*
+LuaWindow::instance ()
+{
+ if (!_instance) {
+ _instance = new LuaWindow;
+ }
+
+ return _instance;
+}
+
+LuaWindow::LuaWindow ()
+ : Window (Gtk::WINDOW_TOPLEVEL)
+ , VisibilityTracker (*((Gtk::Window*) this))
+ , lua (0)
+ , _visible (false)
+ , _menu_scratch (0)
+ , _menu_snippet (0)
+ , _menu_actions (0)
+ , _btn_run (_("Run"))
+ , _btn_clear (_("Clear Output"))
+ , _btn_open (_("Import"))
+ , _btn_save (_("Save"))
+ , _btn_delete (_("Delete"))
+ , _btn_revert (_("Revert"))
+ , _current_buffer ()
+{
+ set_name ("Lua");
+
+ reinit_lua ();
+ update_title ();
+ set_wmclass (X_("ardour_mixer"), PROGRAM_NAME);
+
+ script_select.disable_scrolling ();
+
+ set_border_width (0);
+
+ outtext.set_editable (false);
+ outtext.set_wrap_mode (Gtk::WRAP_WORD);
+ outtext.set_cursor_visible (false);
+
+ signal_delete_event().connect (sigc::mem_fun (*this, &LuaWindow::hide_window));
+ signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
+
+ _btn_run.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::run_script));
+ _btn_clear.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::clear_output));
+ _btn_open.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::import_script));
+ _btn_save.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::save_script));
+ _btn_delete.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::delete_script));
+ _btn_revert.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::revert_script));
+
+ _btn_open.set_sensitive (false); // TODO
+ _btn_save.set_sensitive (false);
+ _btn_delete.set_sensitive (false);
+ _btn_revert.set_sensitive (false);
+
+ // layout
+
+ Gtk::ScrolledWindow *scrollin = manage (new Gtk::ScrolledWindow);
+ scrollin->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+ scrollin->add (entry);
+ scrollout.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
+ scrollout.add (outtext);
+
+ entry.set_name ("ArdourLuaEntry");
+ outtext.set_name ("ArdourLuaEntry");
+
+ Gtk::HBox *hbox = manage (new HBox());
+
+ hbox->pack_start (_btn_run, false, false, 2);
+ hbox->pack_start (_btn_clear, false, false, 2);
+ hbox->pack_start (_btn_open, false, false, 2);
+ hbox->pack_start (_btn_save, false, false, 2);
+ hbox->pack_start (_btn_delete, false, false, 2);
+ hbox->pack_start (_btn_revert, false, false, 2);
+ hbox->pack_start (script_select, false, false, 2);
+
+ Gtk::VBox *vbox = manage (new VBox());
+ vbox->pack_start (*scrollin, true, true, 0);
+ vbox->pack_start (*hbox, false, false, 2);
+
+ Gtkmm2ext::VPane *vpane = manage (new Gtkmm2ext::VPane ());
+ vpane->add (*vbox);
+ vpane->add (scrollout);
+
+ vpane->show_all ();
+ add (*vpane);
+ set_size_request (640, 480); // XXX
+ ARDOUR_UI_UTILS::set_tooltip (script_select, _("Select Editor Buffer"));
+
+ setup_buffers ();
+ LuaScripting::instance().scripts_changed.connect (*this, invalidator (*this), boost::bind (&LuaWindow::refresh_scriptlist, this), gui_context());
+
+ Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+ _script_changed_connection = tb->signal_changed().connect (sigc::mem_fun(*this, &LuaWindow::script_changed));
+}
+
+LuaWindow::~LuaWindow ()
+{
+ delete lua;
+}
+
+void
+LuaWindow::show_window ()
+{
+ present();
+ _visible = true;
+}
+
+bool
+LuaWindow::hide_window (GdkEventAny *ev)
+{
+ if (!_visible) return 0;
+ _visible = false;
+ return just_hide_it (ev, static_cast<Gtk::Window *>(this));
+}
+
+void LuaWindow::reinit_lua ()
+{
+ ENSURE_GUI_THREAD (*this, &LuaWindow::session_going_away);
+ delete lua;
+ lua = new LuaState();
+ lua->Print.connect (sigc::mem_fun (*this, &LuaWindow::append_text));
+
+ lua_State* L = lua->getState();
+ LuaInstance::register_classes (L);
+ luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
+ lua_setglobal (L, "Editor");
+}
+
+void LuaWindow::set_session (Session* s)
+{
+ SessionHandlePtr::set_session (s);
+ if (!_session) {
+ return;
+ }
+
+ update_title ();
+ _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&LuaWindow::update_title, this), gui_context());
+
+ lua_State* L = lua->getState();
+ LuaBindings::set_session (L, _session);
+}
+
+void
+LuaWindow::session_going_away ()
+{
+ ENSURE_GUI_THREAD (*this, &LuaWindow::session_going_away);
+ reinit_lua (); // drop state (all variables, session references)
+
+ SessionHandlePtr::session_going_away ();
+ _session = 0;
+ update_title ();
+
+ lua_State* L = lua->getState();
+ LuaBindings::set_session (L, _session);
+}
+
+void
+LuaWindow::update_title ()
+{
+ if (_session) {
+ string n;
+
+ if (_session->snap_name() != _session->name()) {
+ n = _session->snap_name ();
+ } else {
+ n = _session->name ();
+ }
+
+ if (_session->dirty ()) {
+ n = "*" + n;
+ }
+
+ WindowTitle title (n);
+ title += S_("Window|Lua");
+ title += Glib::get_application_name ();
+ set_title (title.get_string());
+
+ } else {
+ WindowTitle title (S_("Window|Lua"));
+ title += Glib::get_application_name ();
+ set_title (title.get_string());
+ }
+}
+
+void
+LuaWindow::scroll_to_bottom ()
+{
+ Gtk::Adjustment *adj;
+ adj = scrollout.get_vadjustment();
+ adj->set_value (MAX(0,(adj->get_upper() - adj->get_page_size())));
+}
+
+void
+LuaWindow::run_script ()
+{
+ Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+ std::string script = tb->get_text();
+ const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+ if (bytecode.empty()) {
+ // plain script or faulty script -- run directly
+ try {
+ lua->do_command ("function ardour () end");
+ if (0 == lua->do_command (script)) {
+ append_text ("> OK");
+ }
+ } catch (luabridge::LuaException const& e) {
+ append_text (string_compose (_("LuaException: %1"), e.what()));
+ }
+ } else {
+ // script with factory method
+ try {
+ lua_State* L = lua->getState();
+ lua->do_command ("function ardour () end");
+
+ LuaScriptParamList args = LuaScriptParams::script_params (script, "action_param", false);
+ luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+ LuaScriptParams::params_to_ref (&tbl_arg, args);
+ lua->do_command (script); // register "factory"
+ luabridge::LuaRef lua_factory = luabridge::getGlobal (L, "factory");
+ if (lua_factory.isFunction()) {
+ lua_factory(tbl_arg)();
+ }
+ lua->do_command ("factory = nil;");
+ } catch (luabridge::LuaException const& e) {
+ append_text (string_compose (_("LuaException: %1"), e.what()));
+ }
+ }
+}
+
+void
+LuaWindow::append_text (std::string s)
+{
+ Glib::RefPtr<Gtk::TextBuffer> tb (outtext.get_buffer());
+ tb->insert (tb->end(), s + "\n");
+ scroll_to_bottom ();
+}
+
+void
+LuaWindow::clear_output ()
+{
+ Glib::RefPtr<Gtk::TextBuffer> tb (outtext.get_buffer());
+ tb->set_text ("");
+}
+
+void
+LuaWindow::new_script ()
+{
+ char buf[32];
+ snprintf (buf, sizeof (buf), "#%d", count_scratch_buffers () + 1);
+ script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer (buf)));
+ script_selection_changed (script_buffers.back ());
+ refresh_scriptlist ();
+}
+
+void
+LuaWindow::delete_script ()
+{
+ assert ((_current_buffer->flags & Buffer_Scratch) || !(_current_buffer->flags & Buffer_ReadOnly));
+ bool refresh = false;
+ bool neednew = true;
+ if (_current_buffer->flags & Buffer_HasFile) {
+ if (0 == ::g_unlink (_current_buffer->path.c_str())) {
+ append_text (X_("> ") + string_compose (_("Deleted %1"), _current_buffer->path));
+ refresh = true;
+ } else {
+ append_text (X_("> ") + string_compose (_("Failed to delete %1"), _current_buffer->path));
+ }
+ }
+ for (ScriptBufferList::iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+ if ((*i) == _current_buffer) {
+ script_buffers.erase (i);
+ break;
+ }
+ }
+
+ for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+ if ((*i)->flags & Buffer_Scratch) {
+ script_selection_changed (*i);
+ neednew = false;
+ }
+ }
+ if (neednew) {
+ new_script ();
+ }
+ if (refresh) {
+ LuaScripting::instance ().refresh (true);
+ }
+}
+
+void
+LuaWindow::revert_script ()
+{
+ _current_buffer->flags &= BufferFlags(~Buffer_Valid);
+ script_selection_changed (_current_buffer, true);
+}
+
+void
+LuaWindow::import_script ()
+{
+ // TODO: dialog to select file or enter URL
+ // TODO convert a few URL (eg. pastebin) to raw.
+#if 0
+ char *url = "http://pastebin.com/raw/3UMkZ6nV";
+ char *rv = ArdourCurl::http_get (url, 0);
+ if (rv) {
+ new_script ();
+ Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+ tb->set_text (rv);
+ _current_buffer->flags &= BufferFlags(~Buffer_Dirty);
+ update_gui_state ();
+ }
+ free (rv);
+#endif
+}
+
+void
+LuaWindow::save_script ()
+{
+ Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+ std::string script = tb->get_text();
+ std::string msg = "Unknown error";
+
+ std::string path;
+ LuaScriptInfoPtr lsi = LuaScripting::script_info (script);
+ ScriptBuffer & sb (*_current_buffer);
+
+ assert (sb.flags & Buffer_Dirty);
+
+ // 1) check if it has a valid header and factory
+ const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+ if (bytecode.empty()) {
+ msg = _("Missing script header.\nThe script requires an '{ardour}' info table and a 'factory' function.");
+ goto errorout;
+ }
+
+ if (!LuaScripting::try_compile (script, LuaScriptParams::script_params (script, "action_param", false))) {
+ msg = _("Script fails to compile.");
+ goto errorout;
+ }
+
+ // 2) check script name & type
+ lsi = LuaScripting::script_info (script);
+ if (!lsi) {
+ msg = _("Invalid or missing script-name or script-type.");
+ goto errorout;
+ }
+
+ if (lsi->type != LuaScriptInfo::Snippet && lsi->type != LuaScriptInfo::EditorAction) {
+ msg = _("Invalid script-type.\nValid types are 'EditorAction' and 'Snippet'.");
+ goto errorout;
+ }
+
+ // 3) if there's already a writable file,...
+ if ((sb.flags & Buffer_HasFile) && !(sb.flags & Buffer_ReadOnly)) {
+ try {
+ Glib::file_set_contents (sb.path, script);
+ sb.name = lsi->name;
+ sb.flags &= BufferFlags(~Buffer_Dirty);
+ update_gui_state (); // XXX here?
+ append_text (X_("> ") + string_compose (_("Saved as %1"), sb.path));
+ return; // OK
+ } catch (Glib::FileError e) {
+ msg = string_compose (_("Error saving file: %1"), e.what());
+ goto errorout;
+ }
+ }
+
+ // 4) check if the name is unique for the given type; locally at least
+ if (true /*sb.flags & Buffer_HasFile*/) {
+ LuaScriptList& lsl (LuaScripting::instance ().scripts (lsi->type));
+ for (LuaScriptList::const_iterator s = lsl.begin(); s != lsl.end(); ++s) {
+ if ((*s)->name == lsi->name) {
+ msg = string_compose (_("Script with given name '%1' already exists.\nUse a different name in the descriptor."), lsi->name);
+ goto errorout;
+ }
+ }
+ }
+
+ // 5) construct filename -- TODO ask user for name, ask to replace file.
+ do {
+ char buf[80];
+ time_t t = time(0);
+ struct tm * timeinfo = localtime (&t);
+ strftime (buf, sizeof(buf), "%s%d", timeinfo);
+ sprintf (buf, "%s%ld", buf, random ()); // is this valid?
+ MD5 md5;
+ std::string fn = md5.digestString (buf);
+
+ switch (lsi->type) {
+ case LuaScriptInfo::EditorAction:
+ fn = "a_" + fn;
+ break;
+ case LuaScriptInfo::Snippet:
+ fn = "s_" + fn;
+ break;
+ default:
+ break;
+ }
+ path = Glib::build_filename (LuaScripting::user_script_dir (), fn.substr(0, 11) + ".lua");
+ } while (Glib::file_test (path, Glib::FILE_TEST_EXISTS));
+
+ try {
+ Glib::file_set_contents (path, script);
+ sb.path = path;
+ sb.name = lsi->name;
+ sb.flags |= Buffer_HasFile;
+ sb.flags &= BufferFlags(~Buffer_Dirty);
+ sb.flags &= BufferFlags(~Buffer_ReadOnly);
+ update_gui_state (); // XXX here? .refresh (true) may trigger this, too
+ LuaScripting::instance().refresh (true);
+ append_text (X_("> ") + string_compose (_("Saved as %1"), path));
+ return; // OK
+ } catch (Glib::FileError e) {
+ msg = string_compose (_("Error saving file: %1"), e.what());
+ goto errorout;
+ }
+
+errorout:
+ MessageDialog am (msg);
+ am.run ();
+}
+
+void
+LuaWindow::setup_buffers ()
+{
+ if (script_buffers.size() > 0) {
+ return;
+ }
+ script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer("#1")));
+ _current_buffer = script_buffers.front();
+
+ Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+ tb->set_text (_current_buffer->script);
+
+ refresh_scriptlist ();
+ update_gui_state ();
+}
+
+uint32_t
+LuaWindow::count_scratch_buffers () const
+{
+ uint32_t n = 0;
+ for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+ if ((*i)->flags & Buffer_Scratch) {
+ ++n;
+ }
+ }
+ return n;
+}
+
+void
+LuaWindow::refresh_scriptlist ()
+{
+ for (ScriptBufferList::iterator i = script_buffers.begin (); i != script_buffers.end ();) {
+ if ((*i)->flags & Buffer_Scratch) {
+ ++i;
+ continue;
+ }
+ i = script_buffers.erase (i);
+ }
+ LuaScriptList& lsa (LuaScripting::instance ().scripts (LuaScriptInfo::EditorAction));
+ for (LuaScriptList::const_iterator s = lsa.begin(); s != lsa.end(); ++s) {
+ script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer(*s)));
+ }
+
+ LuaScriptList& lss (LuaScripting::instance ().scripts (LuaScriptInfo::Snippet));
+ for (LuaScriptList::const_iterator s = lss.begin(); s != lss.end(); ++s) {
+ script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer(*s)));
+ }
+ rebuild_menu ();
+}
+
+void
+LuaWindow::rebuild_menu ()
+{
+ using namespace Menu_Helpers;
+
+ _menu_scratch = manage (new Menu);
+ _menu_snippet = manage (new Menu);
+ _menu_actions = manage (new Menu);
+
+ MenuList& items_scratch (_menu_scratch->items());
+ MenuList& items_snippet (_menu_snippet->items());
+ MenuList& items_actions (_menu_actions->items());
+
+ {
+ Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem(_("New"),
+ sigc::mem_fun(*this, &LuaWindow::new_script));
+ items_scratch.push_back(elem);
+ }
+
+ items_scratch.push_back(SeparatorElem());
+
+ for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+ std::string name;
+ if ((*i)->flags & Buffer_ReadOnly) {
+ name = "[R] " + (*i)->name;
+ } else {
+ name = (*i)->name;
+ }
+ Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem(name,
+ sigc::bind(sigc::mem_fun(*this, &LuaWindow::script_selection_changed), (*i), false));
+
+ if ((*i)->flags & Buffer_Scratch) {
+ items_scratch.push_back(elem);
+ }
+ else if ((*i)->type == LuaScriptInfo::EditorAction) {
+ items_actions.push_back(elem);
+ }
+ else if ((*i)->type == LuaScriptInfo::Snippet) {
+ items_snippet.push_back(elem);
+ }
+ }
+
+ script_select.clear_items ();
+ script_select.AddMenuElem (Menu_Helpers::MenuElem ("Scratch", *_menu_scratch));
+ script_select.AddMenuElem (Menu_Helpers::MenuElem ("Snippets", *_menu_snippet));
+ script_select.AddMenuElem (Menu_Helpers::MenuElem ("Actions", *_menu_actions));
+}
+
+void
+LuaWindow::script_selection_changed (ScriptBufferPtr n, bool force)
+{
+ if (n == _current_buffer && !force) {
+ return;
+ }
+
+ Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+
+ if (_current_buffer->flags & Buffer_Valid) {
+ _current_buffer->script = tb->get_text();
+ }
+
+ if (!(n->flags & Buffer_Valid)) {
+ if (!n->load()) {
+ append_text ("! Failed to load buffer.");
+ }
+ }
+
+ if (n->flags & Buffer_Valid) {
+ _current_buffer = n;
+ _script_changed_connection.block ();
+ tb->set_text (n->script);
+ _script_changed_connection.unblock ();
+ } else {
+ append_text ("! Failed to switch buffer.");
+ }
+ update_gui_state ();
+}
+
+void
+LuaWindow::update_gui_state ()
+{
+ const ScriptBuffer & sb (*_current_buffer);
+ std::string name;
+ if (sb.flags & Buffer_Scratch) {
+ name = string_compose (_("Scratch Buffer %1"), sb.name);
+ } else if (sb.type == LuaScriptInfo::EditorAction) {
+ name = string_compose (_("Action: '%1'"), sb.name);
+ } else if (sb.type == LuaScriptInfo::Snippet) {
+ name = string_compose (_("Snippet: %1"), sb.name);
+ } else {
+ cerr << "Invalid Script type\n";
+ assert (0);
+ return;
+ }
+ if (sb.flags & Buffer_Dirty) {
+ name += " *";
+ }
+ script_select.set_text(name);
+
+ if (sb.flags & Buffer_ReadOnly) {
+ _btn_save.set_text (_("Save as"));
+ } else {
+ _btn_save.set_text (_("Save"));
+ }
+ _btn_save.set_sensitive (sb.flags & Buffer_Dirty);
+ _btn_delete.set_sensitive (sb.flags & Buffer_Scratch || ((sb.flags & (Buffer_ReadOnly | Buffer_HasFile)) == Buffer_HasFile));
+ _btn_revert.set_sensitive ((sb.flags & Buffer_Dirty) && (sb.flags & Buffer_HasFile));
+}
+
+void
+LuaWindow::script_changed () {
+ if (_current_buffer->flags & Buffer_Dirty) {
+ return;
+ }
+ _current_buffer->flags |= Buffer_Dirty;
+ update_gui_state ();
+}
+
+LuaWindow::ScriptBuffer::ScriptBuffer (const std::string& n)
+ : name (n)
+ , flags (Buffer_Scratch | Buffer_Valid)
+{
+ script =
+ "---- this header is (only) required to save the script\n"
+ "-- ardour { [\"type\"] = \"Snippet\", name = \"\" }\n"
+ "-- function factory () return function () -- -- end end\n";
+}
+
+LuaWindow::ScriptBuffer::ScriptBuffer (LuaScriptInfoPtr p)
+ : name (p->name)
+ , path (p->path)
+ , flags (Buffer_HasFile)
+ , type (p->type)
+{
+ if (!PBD::exists_and_writable (path)) {
+ flags |= Buffer_ReadOnly;
+ }
+ if (path.find (user_config_directory ()) != 0) {
+ // mark non-user scripts as read-only
+ flags |= Buffer_ReadOnly;
+ }
+}
+
+#if 0
+LuaWindow::ScriptBuffer::ScriptBuffer (const ScriptBuffer& other)
+ : script (other.script)
+ , name (other.name)
+ , path (other.path)
+ , flags (other.flags)
+ , type (other.type)
+{
+}
+#endif
+
+LuaWindow::ScriptBuffer::~ScriptBuffer ()
+{
+}
+
+bool
+LuaWindow::ScriptBuffer::load ()
+{
+ assert (!(flags & Buffer_Valid));
+ if (!(flags & Buffer_HasFile)) return false;
+ try {
+ script = Glib::file_get_contents (path);
+ flags |= Buffer_Valid;
+ flags &= BufferFlags(~Buffer_Dirty);
+ } catch (Glib::FileError e) {
+ return false;
+ }
+ return true;
+}
diff --git a/gtk2_ardour/luawindow.h b/gtk2_ardour/luawindow.h
new file mode 100644
index 0000000..38f688d
--- /dev/null
+++ b/gtk2_ardour/luawindow.h
@@ -0,0 +1,143 @@
+/*
+ Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+#ifndef __ardour_luawindow_h__
+#define __ardour_luawindow_h__
+
+#include <glibmm/thread.h>
+
+#include <gtkmm/box.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/label.h>
+#include <gtkmm/window.h>
+
+#include "pbd/signals.h"
+#include "pbd/stateful.h"
+
+#include "ardour/ardour.h"
+#include "ardour/luascripting.h"
+#include "ardour/session_handle.h"
+#include "ardour/types.h"
+
+#include "gtkmm2ext/visibility_tracker.h"
+
+#include "lua/luastate.h"
+
+#include "ardour_button.h"
+#include "ardour_dropdown.h"
+
+class LuaWindow :
+ public Gtk::Window,
+ public PBD::ScopedConnectionList,
+ public ARDOUR::SessionHandlePtr,
+ public Gtkmm2ext::VisibilityTracker
+{
+ public:
+ static LuaWindow* instance();
+ ~LuaWindow();
+
+ void show_window ();
+ bool hide_window (GdkEventAny *ev);
+
+ void set_session (ARDOUR::Session* s);
+
+ typedef enum {
+ Buffer_NOFLAG = 0x00,
+ Buffer_Valid = 0x01, ///< script is loaded
+ Buffer_HasFile = 0x02,
+ Buffer_ReadOnly = 0x04,
+ Buffer_Dirty = 0x08,
+ Buffer_Scratch = 0x10,
+ } BufferFlags;
+
+ class ScriptBuffer {
+ public:
+ ScriptBuffer (const std::string&);
+ ScriptBuffer (ARDOUR::LuaScriptInfoPtr);
+ //ScriptBuffer (const ScriptBuffer& other);
+ ~ScriptBuffer ();
+
+ bool load ();
+
+ std::string script;
+ std::string name;
+ std::string path;
+ BufferFlags flags;
+ ARDOUR::LuaScriptInfo::ScriptType type;
+ };
+
+ private:
+ LuaWindow ();
+ static LuaWindow* _instance;
+
+ LuaState *lua;
+ bool _visible;
+
+ Gtk::Menu* _menu_scratch;
+ Gtk::Menu* _menu_snippet;
+ Gtk::Menu* _menu_actions;
+
+ sigc::connection _script_changed_connection;
+
+ Gtk::TextView entry;
+ Gtk::TextView outtext;
+ Gtk::ScrolledWindow scrollout;
+
+ ArdourButton _btn_run;
+ ArdourButton _btn_clear;
+ ArdourButton _btn_open;
+ ArdourButton _btn_save;
+ ArdourButton _btn_delete;
+ ArdourButton _btn_revert;
+
+ ArdourDropdown script_select;
+
+ typedef boost::shared_ptr<ScriptBuffer> ScriptBufferPtr;
+ typedef std::vector<ScriptBufferPtr> ScriptBufferList;
+
+ ScriptBufferList script_buffers;
+ ScriptBufferPtr _current_buffer;
+
+ void session_going_away ();
+ void update_title ();
+ void reinit_lua ();
+
+ void setup_buffers ();
+ void refresh_scriptlist ();
+ void rebuild_menu ();
+ uint32_t count_scratch_buffers () const;
+
+ void script_changed ();
+ void script_selection_changed (ScriptBufferPtr n, bool force = false);
+ void update_gui_state ();
+
+ void append_text (std::string s);
+ void scroll_to_bottom ();
+ void clear_output ();
+
+ void run_script ();
+
+ void new_script ();
+ void delete_script ();
+ void revert_script ();
+ void import_script ();
+ void save_script ();
+};
+
+
+#endif
diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc
index c9950fa..7f735df 100644
--- a/gtk2_ardour/lv2_plugin_ui.cc
+++ b/gtk2_ardour/lv2_plugin_ui.cc
@@ -31,7 +31,7 @@
#include <lilv/lilv.h>
#include <suil/suil.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace Gtk;
@@ -241,6 +241,7 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
_ardour_buttons_box.pack_end (add_button, false, false);
_ardour_buttons_box.pack_end (_preset_combo, false, false);
_ardour_buttons_box.pack_end (_preset_modified, false, false);
+ _ardour_buttons_box.pack_end (pin_management_button, false, false);
plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&LV2PluginUI::queue_port_update, this), gui_context ());
}
diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc
index 6a8347f..a123631 100644
--- a/gtk2_ardour/main.cc
+++ b/gtk2_ardour/main.cc
@@ -18,10 +18,12 @@
*/
#include <cstdlib>
-#include <signal.h>
#include <cerrno>
#include <vector>
+#include <signal.h>
+#include <locale.h>
+
#include <sigc++/bind.h>
#include <gtkmm/settings.h>
@@ -56,7 +58,7 @@
#include "enums.h"
#include "bundle_env.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#ifdef PLATFORM_WINDOWS
#include <fcntl.h> // Needed for '_fmode'
@@ -273,6 +275,8 @@ extern "C" {
int ardour_main (int argc, char *argv[])
+#elif defined NOMAIN
+int nomain (int argc, char *argv[])
#else
int main (int argc, char *argv[])
#endif
@@ -292,7 +296,13 @@ int main (int argc, char *argv[])
#endif
#ifdef ENABLE_NLS
- gtk_set_locale ();
+ /* initialize C and C++ locales to user preference */
+ setlocale (LC_ALL, "");
+ try {
+ std::locale::global (std::locale (setlocale (LC_ALL, 0)));
+ } catch (...) {
+ std::cerr << "Cannot set C++ locale\n";
+ }
#endif
console_madness_begin();
@@ -375,6 +385,8 @@ int main (int argc, char *argv[])
}
#endif
+ DEBUG_TRACE (DEBUG::Locale, string_compose ("main() locale '%1'\n", setlocale (LC_NUMERIC, NULL)));
+
if (UIConfiguration::instance().pre_gui_init ()) {
error << _("Could not complete pre-GUI initialization") << endmsg;
exit (1);
diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc
index 1f217ef..9a7360b 100644
--- a/gtk2_ardour/main_clock.cc
+++ b/gtk2_ardour/main_clock.cc
@@ -22,7 +22,7 @@
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "ardour/tempo.h"
@@ -94,16 +94,16 @@ void
MainClock::edit_current_tempo ()
{
if (!PublicEditor::instance().session()) return;
- ARDOUR::TempoSection ts = PublicEditor::instance().session()->tempo_map().tempo_section_at (absolute_time());
- PublicEditor::instance().edit_tempo_section (&ts);
+ ARDOUR::TempoSection* ts = const_cast<ARDOUR::TempoSection*>(&PublicEditor::instance().session()->tempo_map().tempo_section_at_frame (absolute_time()));
+ PublicEditor::instance().edit_tempo_section (ts);
}
void
MainClock::edit_current_meter ()
{
if (!PublicEditor::instance().session()) return;
- ARDOUR::MeterSection ms = PublicEditor::instance().session()->tempo_map().meter_section_at (absolute_time());
- PublicEditor::instance().edit_meter_section (&ms);
+ ARDOUR::MeterSection* ms = const_cast<ARDOUR::MeterSection*>(&PublicEditor::instance().session()->tempo_map().meter_section_at_frame (absolute_time()));
+ PublicEditor::instance().edit_meter_section (ms);
}
void
diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc
index 2d9da96..87c0c06 100644
--- a/gtk2_ardour/marker.cc
+++ b/gtk2_ardour/marker.cc
@@ -47,7 +47,7 @@
#include <gtkmm2ext/utils.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -198,7 +198,7 @@ ArdourMarker::ArdourMarker (PublicEditor& ed, ArdourCanvas::Container& parent, g
case SessionEnd:
case RangeEnd:
- points = new ArdourCanvas::Points ();
+ points = new ArdourCanvas::Points (); // leaks
points->push_back (ArdourCanvas::Duple ( M6, 0.0));
points->push_back (ArdourCanvas::Duple ( M6, MH));
points->push_back (ArdourCanvas::Duple (0.0, MH * .5));
@@ -316,6 +316,7 @@ ArdourMarker::~ArdourMarker ()
/* destroying the parent group destroys its contents, namely any polygons etc. that we added */
delete group;
delete _track_canvas_line;
+ delete points;
}
void ArdourMarker::reparent(ArdourCanvas::Container & parent)
@@ -535,6 +536,26 @@ TempoMarker::~TempoMarker ()
{
}
+void
+TempoMarker::update_height_mark (const double& ratio)
+{
+ const double MH = marker_height;
+ const double top = MH * (1 - ratio);
+ const double M3 = std::max(1.f, rintf(3.f * UIConfiguration::instance().get_ui_scale()));
+ const double M6 = std::max(2.f, rintf(6.f * UIConfiguration::instance().get_ui_scale()));
+
+ delete points;
+ points = new ArdourCanvas::Points ();
+ points->push_back (ArdourCanvas::Duple ( M3, top));
+ points->push_back (ArdourCanvas::Duple ( M6, min (top + (MH * .6), MH)));
+ points->push_back (ArdourCanvas::Duple ( M6, MH));
+ points->push_back (ArdourCanvas::Duple (0.0, MH));
+ points->push_back (ArdourCanvas::Duple (0.0, min (top + (MH * .6), MH)));
+ points->push_back (ArdourCanvas::Duple ( M3, top));
+
+ mark->set (*points);
+}
+
/***********************************************************************/
MeterMarker::MeterMarker (PublicEditor& editor, ArdourCanvas::Container& parent, guint32 rgba, const string& text,
diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h
index b769f8d..becc809 100644
--- a/gtk2_ardour/marker.h
+++ b/gtk2_ardour/marker.h
@@ -38,6 +38,10 @@ namespace ARDOUR {
class PublicEditor;
+/** Location Marker
+ *
+ * Editor ruler representation of a location marker or range on the timeline.
+ */
class ArdourMarker : public sigc::trackable
{
public:
@@ -141,6 +145,7 @@ class TempoMarker : public ArdourMarker
ARDOUR::TempoSection& tempo() const { return _tempo; }
+ void update_height_mark (const double& ratio);
private:
ARDOUR::TempoSection& _tempo;
};
diff --git a/gtk2_ardour/marker_selection.h b/gtk2_ardour/marker_selection.h
index 6d4749f..1b322d0 100644
--- a/gtk2_ardour/marker_selection.h
+++ b/gtk2_ardour/marker_selection.h
@@ -24,9 +24,10 @@
#include "marker.h"
-struct MarkerSelection : public std::list<ArdourMarker*>
+class MarkerSelection : public std::list<ArdourMarker*>
{
- void range (ARDOUR::framepos_t& start, ARDOUR::framepos_t& end);
+ public:
+ void range (ARDOUR::framepos_t& start, ARDOUR::framepos_t& end);
};
#endif /* __ardour_gtk_marker_selection_h__ */
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
index 1b582a9..ab6b944 100644
--- a/gtk2_ardour/meter_patterns.cc
+++ b/gtk2_ardour/meter_patterns.cc
@@ -30,7 +30,7 @@
#include "meter_patterns.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -1010,6 +1010,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
layout->set_text("mid");
layout->get_pixel_size(tw, th);
break;
+ default: // DataType::NIL;
+ layout->set_text("");
+ tw = th = 0;
+ assert (0); // not reached
+ break;
}
if (!background) {
c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc
index 82acd1d..db96a3c 100644
--- a/gtk2_ardour/meter_strip.cc
+++ b/gtk2_ardour/meter_strip.cc
@@ -45,7 +45,7 @@
#include "meter_strip.h"
#include "meter_patterns.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -62,8 +62,7 @@ PBD::Signal0<void> MeterStrip::ConfigurationChanged;
#define PX_SCALE(pxmin, dflt) rint(std::max((double)pxmin, (double)dflt * UIConfiguration::instance().get_ui_scale()))
MeterStrip::MeterStrip (int metricmode, MeterType mt)
- : AxisView(0)
- , RouteUI(0)
+ : RouteUI ((Session*) 0)
{
level_meter = 0;
_strip_type = 0;
@@ -117,7 +116,7 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt)
}
MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
- : AxisView(sess)
+ : SessionHandlePtr (sess)
, RouteUI(0)
, _route(rt)
, peak_display()
@@ -294,7 +293,6 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
meter_ticks2_area.signal_expose_event().connect (sigc::mem_fun(*this, &MeterStrip::meter_ticks2_expose));
_route->DropReferences.connect (meter_route_connections, invalidator (*this), boost::bind (&MeterStrip::self_delete, this), gui_context());
- _route->PropertyChanged.connect (meter_route_connections, invalidator (*this), boost::bind (&MeterStrip::strip_property_changed, this, _1), gui_context());
peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::peak_button_release), false);
name_label.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::name_label_button_release), false);
@@ -366,7 +364,7 @@ MeterStrip::set_button_names()
{
mute_button->set_text (S_("Mute|M"));
- if (_route && _route->solo_safe()) {
+ if (_route && _route->solo_safe_control()->solo_safe()) {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
} else {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -389,7 +387,7 @@ MeterStrip::set_button_names()
}
void
-MeterStrip::strip_property_changed (const PropertyChange& what_changed)
+MeterStrip::route_property_changed (const PropertyChange& what_changed)
{
if (!what_changed.contains (ARDOUR::Properties::name)) {
return;
@@ -801,12 +799,12 @@ MeterStrip::name_changed () {
}
name_label.set_text(_route->name ());
if (_session && _session->config.get_track_name_number()) {
- const int64_t track_number = _route->track_number ();
+ const uint64_t track_number = _route->track_number();
if (track_number == 0) {
number_label.set_text("-");
number_label.hide();
} else {
- number_label.set_text (PBD::to_string (abs(_route->track_number ()), std::dec));
+ number_label.set_text (PBD::to_string (track_number, std::dec));
number_label.show();
}
const int tnh = 4 + std::max(2u, _session->track_number_decimals()) * 8; // TODO 8 = max_width_of_digit_0_to_9()
@@ -967,3 +965,16 @@ MeterStrip::set_meter_type_multi (int what, RouteGroup* group, MeterType type)
break;
}
}
+
+string
+MeterStrip::name () const
+{
+ return _route->name();
+}
+
+Gdk::Color
+MeterStrip::color () const
+{
+ return RouteUI::route_color ();
+}
+
diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h
index dfeb406..0e72325 100644
--- a/gtk2_ardour/meter_strip.h
+++ b/gtk2_ardour/meter_strip.h
@@ -43,13 +43,18 @@ namespace Gtk {
class Style;
}
-class MeterStrip : public Gtk::VBox, public RouteUI
+class MeterStrip : public Gtk::VBox, public AxisView, public RouteUI
{
public:
MeterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>);
MeterStrip (int, ARDOUR::MeterType);
~MeterStrip ();
+ std::string name() const;
+ Gdk::Color color () const;
+
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
+
void set_session (ARDOUR::Session* s);
void fast_update ();
boost::shared_ptr<ARDOUR::Route> route() { return _route; }
@@ -72,6 +77,8 @@ class MeterStrip : public Gtk::VBox, public RouteUI
bool is_metric_display() { return _strip_type == 0; }
ARDOUR::MeterType meter_type();
+ bool selected() const { return false; }
+
protected:
boost::shared_ptr<ARDOUR::Route> _route;
PBD::ScopedConnectionList meter_route_connections;
@@ -130,7 +137,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
LevelMeterHBox *level_meter;
- void strip_property_changed (const PBD::PropertyChange&);
+ void route_property_changed (const PBD::PropertyChange&);
void meter_configuration_changed (ARDOUR::ChanCount);
void meter_type_changed (ARDOUR::MeterType);
void update_background (ARDOUR::MeterType);
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc
index 1a320fa..02350c9 100644
--- a/gtk2_ardour/meterbridge.cc
+++ b/gtk2_ardour/meterbridge.cc
@@ -40,7 +40,6 @@
#include "ardour/audio_track.h"
#include "ardour/midi_track.h"
-#include "ardour/route_sorters.h"
#include "meterbridge.h"
@@ -55,7 +54,7 @@
#include "meter_patterns.h"
#include "timers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -124,7 +123,6 @@ Meterbridge::Meterbridge ()
signal_delete_event().connect (sigc::mem_fun (*this, &Meterbridge::hide_window));
signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
- Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this), gui_context());
MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context());
MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context());
@@ -256,7 +254,7 @@ Meterbridge::on_key_press_event (GdkEventKey* ev)
if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
return true;
}
- return forward_key_press (ev);
+ return relay_key_press (ev, this);
}
bool
@@ -400,6 +398,22 @@ Meterbridge::on_scroll()
metrics_right.set_metric_mode(mm_right, mt_right);
}
+struct PresentationInfoRouteSorter
+{
+ bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+ if (a->is_master() || a->is_monitor()) {
+ /* "a" is a special route (master, monitor, etc), and comes
+ * last in the mixer ordering
+ */
+ return false;
+ } else if (b->is_master() || b->is_monitor()) {
+ /* everything comes before b */
+ return true;
+ }
+ return a->presentation_info().order() < b->presentation_info().order();
+ }
+};
+
void
Meterbridge::set_session (Session* s)
{
@@ -422,12 +436,11 @@ Meterbridge::set_session (Session* s)
_show_master = _session->config.get_show_master_on_meterbridge();
_show_midi = _session->config.get_show_midi_on_meterbridge();
- ARDOUR::SignalOrderRouteSorter sorter;
boost::shared_ptr<RouteList> routes = _session->get_routes();
- RouteList copy(*routes);
- copy.sort(sorter);
- add_strips(copy);
+ RouteList copy (*routes);
+ copy.sort (PresentationInfoRouteSorter());
+ add_strips (copy);
_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::add_strips, this, _1), gui_context());
_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::update_title, this), gui_context());
@@ -463,7 +476,7 @@ Meterbridge::session_going_away ()
int
Meterbridge::set_state (const XMLNode& node)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNode* geometry;
m_width = default_width;
@@ -473,7 +486,7 @@ Meterbridge::set_state (const XMLNode& node)
if ((geometry = find_named_node (node, "geometry")) != 0) {
- XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = geometry->property("x_size")) == 0) {
prop = geometry->property ("x-size");
diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h
index 1709455..a1715b2 100644
--- a/gtk2_ardour/meterbridge.h
+++ b/gtk2_ardour/meterbridge.h
@@ -107,7 +107,7 @@ class Meterbridge :
/* everything comes before b */
return true;
}
- return a->order_key () < b->order_key ();
+ return a->presentation_info().order() < b->presentation_info().order();
}
};
diff --git a/gtk2_ardour/midi_automation_line.cc b/gtk2_ardour/midi_automation_line.cc
index c76a35a..9a40ebb 100644
--- a/gtk2_ardour/midi_automation_line.cc
+++ b/gtk2_ardour/midi_automation_line.cc
@@ -25,7 +25,7 @@
#include "midi_automation_line.h"
#include "midi_time_axis.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/gtk2_ardour/midi_channel_dialog.cc b/gtk2_ardour/midi_channel_dialog.cc
index d39853e..6d79306 100644
--- a/gtk2_ardour/midi_channel_dialog.cc
+++ b/gtk2_ardour/midi_channel_dialog.cc
@@ -20,7 +20,7 @@
#include "midi_channel_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
diff --git a/gtk2_ardour/midi_channel_selector.cc b/gtk2_ardour/midi_channel_selector.cc
index d76a5d5..1da8fd9 100644
--- a/gtk2_ardour/midi_channel_selector.cc
+++ b/gtk2_ardour/midi_channel_selector.cc
@@ -38,7 +38,7 @@
#include "midi_channel_selector.h"
#include "rgb_macros.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/midi_cut_buffer.h b/gtk2_ardour/midi_cut_buffer.h
index 8c92b9a..da17c50 100644
--- a/gtk2_ardour/midi_cut_buffer.h
+++ b/gtk2_ardour/midi_cut_buffer.h
@@ -19,7 +19,7 @@
#ifndef __gtk_ardour_midi_cut_buffer_h__
#define __gtk_ardour_midi_cut_buffer_h__
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
#include "ardour/automatable_sequence.h"
diff --git a/gtk2_ardour/midi_export_dialog.cc b/gtk2_ardour/midi_export_dialog.cc
index 3e91ca4..9fd0239 100644
--- a/gtk2_ardour/midi_export_dialog.cc
+++ b/gtk2_ardour/midi_export_dialog.cc
@@ -27,7 +27,7 @@
#include "midi_export_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
diff --git a/gtk2_ardour/midi_list_editor.cc b/gtk2_ardour/midi_list_editor.cc
index 6334c38..731f8b1 100644
--- a/gtk2_ardour/midi_list_editor.cc
+++ b/gtk2_ardour/midi_list_editor.cc
@@ -39,7 +39,7 @@
#include "note_player.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -760,13 +760,11 @@ MidiListEditor::redisplay_model ()
for (MidiModel::Notes::iterator i = notes.begin(); i != notes.end(); ++i) {
row = *(model->append());
row[columns.channel] = (*i)->channel() + 1;
- row[columns.note_name] = Evoral::midi_note_name ((*i)->note());
+ row[columns.note_name] = ParameterDescriptor::midi_note_name ((*i)->note());
row[columns.note] = (*i)->note();
row[columns.velocity] = (*i)->velocity();
- Timecode::BBT_Time bbt;
-
- _session->tempo_map().bbt_time (conv.to ((*i)->time()), bbt);
+ Timecode::BBT_Time bbt (_session->tempo_map().bbt_at_frame (conv.to ((*i)->time())));
ss.str ("");
ss << bbt;
diff --git a/gtk2_ardour/midi_list_editor.h b/gtk2_ardour/midi_list_editor.h
index 9ff4139..283a0da 100644
--- a/gtk2_ardour/midi_list_editor.h
+++ b/gtk2_ardour/midi_list_editor.h
@@ -25,14 +25,13 @@
#include <gtkmm/liststore.h>
#include <gtkmm/scrolledwindow.h>
-#include "evoral/types.hpp"
-
#include "ardour/session_handle.h"
#include "ardour_window.h"
namespace Evoral {
template<typename Time> class Note;
+ class Beats;
};
namespace ARDOUR {
diff --git a/gtk2_ardour/midi_port_dialog.cc b/gtk2_ardour/midi_port_dialog.cc
index cbf2ca5..20904fa 100644
--- a/gtk2_ardour/midi_port_dialog.cc
+++ b/gtk2_ardour/midi_port_dialog.cc
@@ -26,7 +26,7 @@
#include "midi_port_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 0b13c3f..6a4f08a 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -82,7 +82,7 @@
#include "sys_ex.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -111,7 +111,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent,
, _step_edit_cursor_width (1.0)
, _step_edit_cursor_position (0.0)
, _channel_selection_scoped_note (0)
- , _temporary_note_group (0)
, _mouse_state(None)
, _pressed_button(0)
, _sort_needed (true)
@@ -155,7 +154,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent,
, _step_edit_cursor_width (1.0)
, _step_edit_cursor_position (0.0)
, _channel_selection_scoped_note (0)
- , _temporary_note_group (0)
, _mouse_state(None)
, _pressed_button(0)
, _sort_needed (true)
@@ -204,7 +202,6 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other)
, _step_edit_cursor_width (1.0)
, _step_edit_cursor_position (0.0)
, _channel_selection_scoped_note (0)
- , _temporary_note_group (0)
, _mouse_state(None)
, _pressed_button(0)
, _sort_needed (true)
@@ -237,7 +234,6 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M
, _step_edit_cursor_width (1.0)
, _step_edit_cursor_position (0.0)
, _channel_selection_scoped_note (0)
- , _temporary_note_group (0)
, _mouse_state(None)
, _pressed_button(0)
, _sort_needed (true)
@@ -271,12 +267,12 @@ MidiRegionView::init (bool wfd)
RegionView::init (false);
- set_height (trackview.current_height());
+ //set_height (trackview.current_height());
region_muted ();
region_sync_changed ();
region_resized (ARDOUR::bounds_change);
- region_locked ();
+ //region_locked ();
set_colors ();
@@ -536,7 +532,7 @@ MidiRegionView::button_release (GdkEventButton* ev)
switch (editor.current_mouse_mode()) {
case MouseRange:
- /* no motion occured - simple click */
+ /* no motion occurred - simple click */
clear_editor_note_selection ();
_mouse_changed_selection = true;
break;
@@ -928,16 +924,24 @@ MidiRegionView::create_note_at (framepos_t t, double y, Evoral::Beats length, bo
MidiTimeAxisView* const mtv = dynamic_cast<MidiTimeAxisView*>(&trackview);
MidiStreamView* const view = mtv->midi_view();
+ boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion> (_region);
+
+ if (!mr) {
+ return;
+ }
// Start of note in frames relative to region start
+ uint32_t divisions = 0;
+
if (snap_t) {
framecnt_t grid_frames;
t = snap_frame_to_grid_underneath (t, grid_frames);
+ divisions = trackview.editor().get_grid_music_divisions (0);
}
- const MidiModel::TimeType beat_time = region_frames_to_region_beats(
- t + _region->start());
+ const MidiModel::TimeType beat_time = Evoral::Beats (trackview.session()->tempo_map().exact_beat_at_frame (_region->position() + t, divisions)
+ - (mr->beat() - mr->start_beats().to_double()));
const double note = view->y_to_note(y);
const uint8_t chan = mtv->get_channel_for_add();
const uint8_t velocity = get_velocity_for_add(beat_time);
@@ -1180,21 +1184,20 @@ MidiRegionView::redisplay_model()
_optimization_iterator = _events.begin();
bool empty_when_starting = _events.empty();
+ NoteBase* cne;
for (MidiModel::Notes::iterator n = notes.begin(); n != notes.end(); ++n) {
boost::shared_ptr<NoteType> note (*n);
- NoteBase* cne;
bool visible;
if (note_in_region_range (note, visible)) {
if (!empty_when_starting && (cne = find_canvas_note (note)) != 0) {
- cne->validate ();
- update_note (cne);
-
if (visible) {
+ cne->validate ();
+ update_note (cne);
cne->show ();
} else {
cne->hide ();
@@ -1395,27 +1398,32 @@ MidiRegionView::~MidiRegionView ()
delete _note_group;
delete _note_diff_command;
delete _step_edit_cursor;
- delete _temporary_note_group;
}
void
MidiRegionView::region_resized (const PropertyChange& what_changed)
{
- RegionView::region_resized(what_changed);
+ RegionView::region_resized(what_changed); // calls RegionView::set_duration()
if (what_changed.contains (ARDOUR::Properties::position)) {
_region_relative_time_converter.set_origin_b(_region->position());
_region_relative_time_converter_double.set_origin_b(_region->position());
- set_duration(_region->length(), 0);
- if (_enable_display) {
- redisplay_model();
- }
+ /* reset_width dependent_items() redisplays model */
+
}
if (what_changed.contains (ARDOUR::Properties::start) ||
what_changed.contains (ARDOUR::Properties::position)) {
_source_relative_time_converter.set_origin_b (_region->position() - _region->start());
}
+ /* catch end and start trim so we can update the view*/
+ if (!what_changed.contains (ARDOUR::Properties::start) &&
+ what_changed.contains (ARDOUR::Properties::length)) {
+ enable_display (true);
+ } else if (what_changed.contains (ARDOUR::Properties::start) &&
+ what_changed.contains (ARDOUR::Properties::length)) {
+ enable_display (true);
+ }
}
void
@@ -1670,12 +1678,9 @@ MidiRegionView::start_playing_midi_chord (vector<boost::shared_ptr<NoteType> > n
bool
MidiRegionView::note_in_region_range (const boost::shared_ptr<NoteType> note, bool& visible) const
{
- /* This is imprecise due to all the conversion conversion involved, so only
- hide notes if they seem to start more than one tick before the start. */
- const framecnt_t tick_frames = Evoral::Beats::tick().to_ticks(trackview.session()->frame_rate());
- const framepos_t note_start_frames = source_beats_to_region_frames (note->time());
- const bool outside = ((note_start_frames <= -tick_frames) ||
- (note_start_frames >= _region->length()));
+ const boost::shared_ptr<ARDOUR::MidiRegion> midi_reg = midi_region();
+ const bool outside = (note->time() < midi_reg->start_beats() ||
+ note->time() > midi_reg->start_beats() + midi_reg->length_beats());
visible = (note->note() >= midi_stream_view()->lowest_note()) &&
(note->note() <= midi_stream_view()->highest_note());
@@ -1702,23 +1707,36 @@ MidiRegionView::update_note (NoteBase* note, bool update_ghost_regions)
void
MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions)
{
+ TempoMap& map (trackview.session()->tempo_map());
+ const boost::shared_ptr<ARDOUR::MidiRegion> mr = midi_region();
boost::shared_ptr<NoteType> note = ev->note();
- const double x = trackview.editor().sample_to_pixel (source_beats_to_region_frames (note->time()));
+ const framepos_t note_start_frames = map.frame_at_beat (_region->beat() - mr->start_beats().to_double()
+ + note->time().to_double()) - _region->position();
+
+ const double x0 = trackview.editor().sample_to_pixel (note_start_frames);
+ double x1;
const double y0 = 1 + floor(midi_stream_view()->note_to_y(note->note()));
+ double y1;/* trim note display to not overlap the end of its region */
+
+ if (note->length() > 0) {
+ Evoral::Beats note_end_time = note->end_time();
- ev->set_x0 (x);
- ev->set_y0 (y0);
+ if (note->end_time() > mr->start_beats() + mr->length_beats()) {
+ note_end_time = mr->start_beats() + mr->length_beats();
+ }
- /* trim note display to not overlap the end of its region */
+ const framepos_t note_end_frames = map.frame_at_beat (_region->beat() - mr->start_beats().to_double()
+ + note_end_time.to_double()) - _region->position();
- if (note->length() > 0) {
- const framepos_t note_end_frames = min (source_beats_to_region_frames (note->end_time()), _region->length());
- ev->set_x1 (std::max(1., trackview.editor().sample_to_pixel (note_end_frames)) - 1);
+ x1 = std::max(1., trackview.editor().sample_to_pixel (note_end_frames)) - 1;
} else {
- ev->set_x1 (std::max(1., trackview.editor().sample_to_pixel (_region->length())) - 1);
+ x1 = std::max(1., trackview.editor().sample_to_pixel (_region->length())) - 1;
}
- ev->set_y1 (y0 + std::max(1., floor(midi_stream_view()->note_height()) - 1));
+ y1 = y0 + std::max(1., floor(midi_stream_view()->note_height()) - 1);
+
+ ArdourCanvas::Rect rect (x0, y0, x1, y1);
+ ev->set (rect);
if (!note->length()) {
if (_active_notes && note->note() < 128) {
@@ -1726,7 +1744,7 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions)
if (old_rect) {
/* There is an active note on this key, so we have a stuck
note. Finish the old rectangle here. */
- old_rect->set_x1 (x);
+ old_rect->set_x1 (x1);
old_rect->set_outline_all ();
}
_active_notes[note->note()] = ev;
@@ -1742,8 +1760,9 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions)
}
// Update color in case velocity has changed
- ev->set_fill_color(ev->base_color());
- ev->set_outline_color(ev->calculate_outline(ev->base_color(), ev->selected()));
+ //const uint32_t base_col = ev->base_color();
+ //ev->set_fill_color(base_col);
+ //ev->set_outline_color(ev->calculate_outline(base_col, ev->selected()));
if (update_ghost_regions) {
for (std::vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
@@ -1760,7 +1779,8 @@ MidiRegionView::update_hit (Hit* ev, bool update_ghost_regions)
{
boost::shared_ptr<NoteType> note = ev->note();
- const framepos_t note_start_frames = source_beats_to_region_frames(note->time());
+ const framepos_t note_start_frames = trackview.session()->tempo_map().frame_at_beat (_region->beat() - midi_region()->start_beats().to_double()
+ + note->time().to_double()) - _region->position();
const double x = trackview.editor().sample_to_pixel(note_start_frames);
const double diamond_size = std::max(1., floor(midi_stream_view()->note_height()) - 2.);
const double y = 1.5 + floor(midi_stream_view()->note_to_y(note->note())) + diamond_size * .5;
@@ -1868,7 +1888,8 @@ MidiRegionView::step_add_note (uint8_t channel, uint8_t number, uint8_t velocity
framepos_t region_end = _region->last_frame();
if (end_frame > region_end) {
- _region->set_length (end_frame - _region->position());
+ /* XX sets length in beats from audio space. make musical */
+ _region->set_length (end_frame - _region->position(), 0);
}
MidiTimeAxisView* const mtv = dynamic_cast<MidiTimeAxisView*>(&trackview);
@@ -2727,6 +2748,7 @@ MidiRegionView::begin_resizing (bool /*at_front*/)
void
MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap)
{
+ TempoMap& tmap (trackview.session()->tempo_map());
bool cursor_set = false;
bool const ensure_snap = trackview.editor().snap_mode () != SnapMagnetic;
@@ -2788,9 +2810,19 @@ MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_
sign = -1;
}
- const double snapped_x = (with_snap ? snap_pixel_to_sample (current_x, ensure_snap) : trackview.editor ().pixel_to_sample (current_x));
- Evoral::Beats beats = region_frames_to_region_beats (snapped_x);
- Evoral::Beats len = Evoral::Beats();
+ double snapped_x;
+ uint32_t divisions = 0;
+
+ if (with_snap) {
+ snapped_x = snap_pixel_to_sample (current_x, ensure_snap);
+ divisions = trackview.editor().get_grid_music_divisions (0);
+ } else {
+ snapped_x = trackview.editor ().pixel_to_sample (current_x);
+ }
+ const Evoral::Beats beats = Evoral::Beats (tmap.exact_beat_at_frame (snapped_x + midi_region()->position(), divisions)
+ - midi_region()->beat()) + midi_region()->start_beats();
+
+ Evoral::Beats len = Evoral::Beats();
if (at_front) {
if (beats < canvas_note->note()->end_time()) {
@@ -2823,6 +2855,7 @@ void
MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap)
{
_note_diff_command = _model->new_note_diff_command (_("resize notes"));
+ TempoMap& tmap (trackview.session()->tempo_map());
/* XX why doesn't snap_pixel_to_sample() handle this properly? */
bool const ensure_snap = trackview.editor().snap_mode () != SnapMagnetic;
@@ -2870,16 +2903,19 @@ MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_
sign = -1;
}
+ uint32_t divisions = 0;
/* Convert the new x position to a frame within the source */
framepos_t current_fr;
if (with_snap) {
- current_fr = snap_pixel_to_sample (current_x, ensure_snap) + _region->start ();
+ current_fr = snap_pixel_to_sample (current_x, ensure_snap);
+ divisions = trackview.editor().get_grid_music_divisions (0);
} else {
- current_fr = trackview.editor().pixel_to_sample (current_x) + _region->start ();
+ current_fr = trackview.editor().pixel_to_sample (current_x);
}
/* and then to beats */
- const Evoral::Beats x_beats = region_frames_to_region_beats (current_fr);
+ const Evoral::Beats x_beats = Evoral::Beats (tmap.exact_beat_at_frame (current_fr + midi_region()->position(), divisions)
+ - midi_region()->beat()) + midi_region()->start_beats();
if (at_front && x_beats < canvas_note->note()->end_time()) {
note_diff_add_change (canvas_note, MidiModel::NoteDiffCommand::StartTime, x_beats - (sign * snap_delta_beats));
@@ -3228,7 +3264,7 @@ MidiRegionView::nudge_notes (bool forward, bool fine)
if (!fine) {
/* non-fine, move by 1 bar regardless of snap */
- delta = Evoral::Beats(trackview.session()->tempo_map().meter_at(ref_point).divisions_per_bar());
+ delta = Evoral::Beats(trackview.session()->tempo_map().meter_at_frame (ref_point).divisions_per_bar());
} else if (trackview.editor().snap_mode() == Editing::SnapOff) {
@@ -3331,9 +3367,8 @@ void
MidiRegionView::patch_entered (PatchChange* p)
{
ostringstream s;
- /* XXX should get patch name if we can */
s << _("Bank ") << (p->patch()->bank() + MIDI_BP_ZERO) << '\n'
- << _("Program ") << ((int) p->patch()->program()) + MIDI_BP_ZERO << '\n'
+ << instrument_info().get_patch_name_without (p->patch()->bank(), p->patch()->program(), p->patch()->channel()) << '\n'
<< _("Channel ") << ((int) p->patch()->channel() + 1);
show_verbose_cursor (s.str(), 10, 20);
p->item().grab_focus();
@@ -3487,14 +3522,16 @@ MidiRegionView::selection_as_cut_buffer () const
/** This method handles undo */
bool
-MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx)
+MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx, const int32_t sub_num)
{
bool commit = false;
// Paste notes, if available
MidiNoteSelection::const_iterator m = selection.midi_notes.get_nth(ctx.counts.n_notes());
if (m != selection.midi_notes.end()) {
ctx.counts.increase_n_notes();
- if (!(*m)->empty()) { commit = true; }
+ if (!(*m)->empty()) {
+ commit = true;
+ }
paste_internal(pos, ctx.count, ctx.times, **m);
}
@@ -3502,7 +3539,10 @@ MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContex
typedef RouteTimeAxisView::AutomationTracks ATracks;
const ATracks& atracks = midi_view()->automation_tracks();
for (ATracks::const_iterator a = atracks.begin(); a != atracks.end(); ++a) {
- if (a->second->paste(pos, selection, ctx)) {
+ if (a->second->paste(pos, selection, ctx, sub_num)) {
+ if(!commit) {
+ trackview.editor().begin_reversible_command (Operations::paste);
+ }
commit = true;
}
}
@@ -3565,7 +3605,8 @@ MidiRegionView::paste_internal (framepos_t pos, unsigned paste_count, float time
DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("Paste extended region from %1 to %2\n", region_end, end_frame));
_region->clear_changes ();
- _region->set_length (end_frame - _region->position());
+ /* we probably need to get the snap modifier somehow to make this correct for non-musical use */
+ _region->set_length (end_frame - _region->position(), trackview.editor().get_grid_music_divisions (0));
trackview.session()->add_command (new StatefulDiffCommand (_region));
}
@@ -3827,9 +3868,6 @@ void
MidiRegionView::enable_display (bool yn)
{
RegionView::enable_display (yn);
- if (yn) {
- redisplay_model ();
- }
}
void
@@ -3875,7 +3913,9 @@ MidiRegionView::set_step_edit_cursor_width (Evoral::Beats beats)
_step_edit_cursor_width = beats;
if (_step_edit_cursor) {
- _step_edit_cursor->set_x1 (_step_edit_cursor->x0() + trackview.editor().sample_to_pixel (region_beats_to_region_frames (beats)));
+ _step_edit_cursor->set_x1 (_step_edit_cursor->x0() + trackview.editor().sample_to_pixel (
+ region_beats_to_region_frames (_step_edit_cursor_position + beats)
+ - region_beats_to_region_frames (_step_edit_cursor_position)));
}
}
@@ -3943,21 +3983,14 @@ MidiRegionView::data_recorded (boost::weak_ptr<MidiSource> w)
void
MidiRegionView::trim_front_starting ()
{
- /* Reparent the note group to the region view's parent, so that it doesn't change
- when the region view is trimmed.
+ /* We used to eparent the note group to the region view's parent, so that it didn't change.
+ now we update it.
*/
- _temporary_note_group = new ArdourCanvas::Container (group->parent ());
- _temporary_note_group->move (group->position ());
- _note_group->reparent (_temporary_note_group);
}
void
MidiRegionView::trim_front_ending ()
{
- _note_group->reparent (group);
- delete _temporary_note_group;
- _temporary_note_group = 0;
-
if (_region->start() < 0) {
/* Trim drag made start time -ve; fix this */
midi_region()->fix_negative_start ();
@@ -4020,7 +4053,7 @@ MidiRegionView::get_note_name (boost::shared_ptr<NoteType> n, uint8_t note_value
char buf[128];
snprintf (buf, sizeof (buf), "%d %s\nCh %d Vel %d",
(int) note_value,
- name.empty() ? Evoral::midi_note_name (note_value).c_str() : name.c_str(),
+ name.empty() ? ParameterDescriptor::midi_note_name (note_value).c_str() : name.c_str(),
(int) n->channel() + 1,
(int) n->velocity());
@@ -4088,10 +4121,10 @@ framepos_t
MidiRegionView::snap_frame_to_grid_underneath (framepos_t p, framecnt_t& grid_frames) const
{
PublicEditor& editor = trackview.editor ();
-
const Evoral::Beats grid_beats = get_grid_beats(p);
+ const Evoral::Beats p_beat = max (Evoral::Beats(), region_frames_to_region_beats (p));
- grid_frames = region_beats_to_region_frames (grid_beats);
+ grid_frames = region_beats_to_region_frames (p_beat + grid_beats) - region_beats_to_region_frames (p_beat);
/* Hack so that we always snap to the note that we are over, instead of snapping
to the next one if we're more than halfway through the one we're over.
@@ -4123,7 +4156,7 @@ MidiRegionView::get_grid_beats(framepos_t pos) const
{
PublicEditor& editor = trackview.editor();
bool success = false;
- Evoral::Beats beats = editor.get_grid_type_as_beats(success, pos);
+ Evoral::Beats beats = editor.get_grid_type_as_beats (success, pos);
if (!success) {
beats = Evoral::Beats(1);
}
diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h
index b24b767..ac2cd4b 100644
--- a/gtk2_ardour/midi_region_view.h
+++ b/gtk2_ardour/midi_region_view.h
@@ -122,7 +122,7 @@ public:
void resolve_note(uint8_t note_num, Evoral::Beats end_time);
void cut_copy_clear (Editing::CutCopyOp);
- bool paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx);
+ bool paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx, const int32_t sub_num);
void paste_internal (framepos_t pos, unsigned paste_count, float times, const MidiCutBuffer&);
void add_canvas_patch_change (ARDOUR::MidiModel::PatchChangePtr patch, const std::string& displaytext, bool);
@@ -427,11 +427,6 @@ private:
Evoral::Beats _step_edit_cursor_position;
NoteBase* _channel_selection_scoped_note;
- /** A group used to temporarily reparent _note_group to during start trims, so
- * that the notes don't move with the parent region view.
- */
- ArdourCanvas::Container* _temporary_note_group;
-
MouseState _mouse_state;
int _pressed_button;
diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc
index 9258cf0..301e9dd 100644
--- a/gtk2_ardour/midi_streamview.cc
+++ b/gtk2_ardour/midi_streamview.cc
@@ -47,7 +47,7 @@
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -440,7 +440,7 @@ MidiStreamView::setup_rec_box ()
if (!rec_active &&
_trackview.session()->record_status() == Session::Recording &&
- _trackview.track()->record_enabled()) {
+ _trackview.track()->rec_enable_control()->get_value()) {
if (UIConfiguration::instance().get_show_waveforms_while_recording() && rec_regions.size() == rec_rects.size()) {
@@ -512,7 +512,7 @@ MidiStreamView::setup_rec_box ()
} else if (rec_active &&
(_trackview.session()->record_status() != Session::Recording ||
- !_trackview.track()->record_enabled())) {
+ !_trackview.track()->rec_enable_control()->get_value())) {
screen_update_connection.disconnect();
rec_active = false;
rec_updating = false;
@@ -610,7 +610,7 @@ MidiStreamView::update_rec_box ()
/* Update the region being recorded to reflect where we currently are */
boost::shared_ptr<ARDOUR::Region> region = rec_regions.back().first;
- region->set_length (_trackview.track()->current_capture_end () - _trackview.track()->current_capture_start());
+ region->set_length (_trackview.track()->current_capture_end () - _trackview.track()->current_capture_start(), 0);
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rec_regions.back().second);
mrv->extend_active_notes ();
@@ -662,7 +662,7 @@ struct RegionPositionSorter {
};
bool
-MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx)
+MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
{
/* Paste into the first region which starts on or before pos. Only called when
using an internal editing tool. */
@@ -690,5 +690,5 @@ MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, Paste
}
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*prev);
- return mrv ? mrv->paste(pos, selection, ctx) : false;
+ return mrv ? mrv->paste(pos, selection, ctx, sub_num) : false;
}
diff --git a/gtk2_ardour/midi_streamview.h b/gtk2_ardour/midi_streamview.h
index 9be3b34..59cf2da 100644
--- a/gtk2_ardour/midi_streamview.h
+++ b/gtk2_ardour/midi_streamview.h
@@ -98,7 +98,7 @@ class MidiStreamView : public StreamView
RegionView* create_region_view (boost::shared_ptr<ARDOUR::Region>, bool, bool);
- bool paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx);
+ bool paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num);
void apply_note_range(uint8_t lowest, uint8_t highest, bool to_region_views);
diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc
index 7d01857..57cde4a 100644
--- a/gtk2_ardour/midi_time_axis.cc
+++ b/gtk2_ardour/midi_time_axis.cc
@@ -89,7 +89,7 @@
#include "ardour/midi_track.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -104,8 +104,8 @@ static const uint32_t MIDI_CONTROLS_BOX_MIN_HEIGHT = 160;
static const uint32_t KEYBOARD_MIN_HEIGHT = 130;
MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas)
- : AxisView(sess) // virtually inherited
- , RouteTimeAxisView(ed, sess, canvas)
+ : SessionHandlePtr (sess)
+ , RouteTimeAxisView (ed, sess, canvas)
, _ignore_signals(false)
, _range_scroomer(0)
, _piano_roll_header(0)
@@ -1301,7 +1301,7 @@ MidiTimeAxisView::update_control_names ()
}
}
- if (get_selected()) {
+ if (selected()) {
controls_ebox.set_name (controls_base_selected_name);
time_axis_frame.set_name (controls_base_selected_name);
} else {
@@ -1508,7 +1508,7 @@ MidiTimeAxisView::automation_child_menu_item (Evoral::Parameter param)
}
boost::shared_ptr<MidiRegion>
-MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit)
+MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit, const int32_t sub_num)
{
Editor* real_editor = dynamic_cast<Editor*> (&_editor);
if (commit) {
@@ -1526,8 +1526,9 @@ MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit)
plist.add (ARDOUR::Properties::name, PBD::basename_nosuffix(src->name()));
boost::shared_ptr<Region> region = (RegionFactory::create (src, plist));
-
- playlist()->add_region (region, pos);
+ /* sets beat position */
+ region->set_position (pos, sub_num);
+ playlist()->add_region (region, pos, 1.0, false, sub_num);
_session->add_command (new StatefulDiffCommand (playlist()));
if (commit) {
@@ -1634,12 +1635,12 @@ MidiTimeAxisView::capture_channel_mode_changed ()
}
bool
-MidiTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx)
+MidiTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
{
if (!_editor.internal_editing()) {
// Non-internal paste, paste regions like any other route
- return RouteTimeAxisView::paste(pos, selection, ctx);
+ return RouteTimeAxisView::paste(pos, selection, ctx, sub_num);
}
- return midi_view()->paste(pos, selection, ctx);
+ return midi_view()->paste(pos, selection, ctx, sub_num);
}
diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h
index 6fe77dc..fa6102c 100644
--- a/gtk2_ardour/midi_time_axis.h
+++ b/gtk2_ardour/midi_time_axis.h
@@ -82,13 +82,13 @@ public:
void set_height (uint32_t, TrackHeightMode m = OnlySelf);
- boost::shared_ptr<ARDOUR::MidiRegion> add_region (ARDOUR::framepos_t, ARDOUR::framecnt_t, bool);
+ boost::shared_ptr<ARDOUR::MidiRegion> add_region (ARDOUR::framepos_t, ARDOUR::framecnt_t, bool, const int32_t sub_num);
void show_all_automation (bool apply_to_selection = false);
void show_existing_automation (bool apply_to_selection = false);
void create_automation_child (const Evoral::Parameter& param, bool show);
- bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx);
+ bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx, const int32_t sub_num);
ARDOUR::NoteMode note_mode() const { return _note_mode; }
ARDOUR::ColorMode color_mode() const { return _color_mode; }
diff --git a/gtk2_ardour/midi_tracer.cc b/gtk2_ardour/midi_tracer.cc
index 3d5e6ac..2f97e5b 100644
--- a/gtk2_ardour/midi_tracer.cc
+++ b/gtk2_ardour/midi_tracer.cc
@@ -34,7 +34,7 @@
#include "midi_tracer.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
diff --git a/gtk2_ardour/midi_velocity_dialog.cc b/gtk2_ardour/midi_velocity_dialog.cc
index 5b21e56..4c0e42f 100644
--- a/gtk2_ardour/midi_velocity_dialog.cc
+++ b/gtk2_ardour/midi_velocity_dialog.cc
@@ -20,7 +20,7 @@
#include "midi_velocity_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
diff --git a/gtk2_ardour/missing_file_dialog.cc b/gtk2_ardour/missing_file_dialog.cc
index 9fe1258..47e6948 100644
--- a/gtk2_ardour/missing_file_dialog.cc
+++ b/gtk2_ardour/missing_file_dialog.cc
@@ -25,7 +25,7 @@
#include "gtkmm2ext/utils.h"
#include "missing_file_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
diff --git a/gtk2_ardour/missing_plugin_dialog.cc b/gtk2_ardour/missing_plugin_dialog.cc
index 1e216c3..1f2a4f0 100644
--- a/gtk2_ardour/missing_plugin_dialog.cc
+++ b/gtk2_ardour/missing_plugin_dialog.cc
@@ -18,7 +18,7 @@
#include <gtkmm/label.h>
#include "missing_plugin_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
diff --git a/gtk2_ardour/mixer.bindings b/gtk2_ardour/mixer.bindings
index 62a19ba..f835655 100644
--- a/gtk2_ardour/mixer.bindings
+++ b/gtk2_ardour/mixer.bindings
@@ -1,23 +1,21 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Bindings name="ardour-mixer">
+ <Bindings name="Mixer">
<Press>
- <Binding key="s" action="Mixer/solo"/>
- <Binding key="m" action="Mixer/mute"/>
- <Binding key="Secondary-i" action="Mixer/toggle-midi-input-active"/>
- <Binding key="r" action="Mixer/recenable"/>
- <Binding key="0" action="Mixer/unity-gain"/>
- <Binding key="Up" action="Mixer/increment-gain"/>
- <Binding key="Down" action="Mixer/decrement-gain"/>
- <Binding key="Left" action="Mixer/scroll-left"/>
- <Binding key="Right" action="Mixer/scroll-right"/>
- <Binding key="Primary-x" action="Mixer/cut-processors"/>
- <Binding key="Primary-c" action="Mixer/copy-processors"/>
- <Binding key="Primary-v" action="Mixer/paste-processors"/>
- <Binding key="Delete" action="Mixer/delete-processors"/>
- <Binding key="BackSpace" action="Mixer/delete-processors"/>
- <Binding key="Return" action="Mixer/toggle-processors"/>
- <Binding key="Primary-a" action="Mixer/select-all-processors"/>
- <Binding key="Slash" action="Mixer/ab-plugins"/>
- <Binding key="Escape" action="Mixer/select-none"/>
+ <Binding key="s" action="Mixer/solo"/>
+ <Binding key="m" action="Mixer/mute"/>
+ <Binding key="Secondary-i" action="Mixer/toggle-midi-input-active"/>
+ <Binding key="r" action="Mixer/recenable"/>
+ <Binding key="0" action="Mixer/unity-gain"/>
+ <Binding key="Up" action="Mixer/increment-gain"/>
+ <Binding key="Down" action="Mixer/decrement-gain"/>
+ <Binding key="Left" action="Mixer/scroll-left"/>
+ <Binding key="Right" action="Mixer/scroll-right"/>
+ <Binding key="Primary-x" action="Mixer/cut-processors"/>
+ <Binding key="Primary-c" action="Mixer/copy-processors"/>
+ <Binding key="Primary-v" action="Mixer/paste-processors"/>
+ <Binding key="Delete" action="Mixer/delete-processors"/>
+ <Binding key="BackSpace" action="Mixer/delete-processors"/>
+ <Binding key="Return" action="Mixer/toggle-processors"/>
+ <Binding key="Primary-a" action="Mixer/select-all-processors"/>
+ <Binding key="slash" action="Mixer/ab-plugins"/>
</Press>
-</Bindings>
+ </Bindings>
diff --git a/gtk2_ardour/mixer_actor.cc b/gtk2_ardour/mixer_actor.cc
deleted file mode 100644
index 87a4d01..0000000
--- a/gtk2_ardour/mixer_actor.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- Copyright (C) 2000-2004 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifdef WAF_BUILD
-#include "gtk2ardour-config.h"
-#endif
-
-#include <boost/foreach.hpp>
-
-#include "pbd/file_utils.h"
-#include "pbd/error.h"
-
-#include "ardour/filesystem_paths.h"
-
-#include "actions.h"
-#include "mixer_actor.h"
-#include "mixer_strip.h"
-#include "route_ui.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-using namespace Gtk;
-using namespace PBD;
-
-MixerActor::MixerActor ()
-{
- register_actions ();
- load_bindings ();
-}
-
-MixerActor::~MixerActor ()
-{
-}
-
-void
-MixerActor::register_actions ()
-{
- myactions.register_action ("Mixer", "solo", _("Toggle Solo on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::solo_action));
- myactions.register_action ("Mixer", "mute", _("Toggle Mute on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::mute_action));
- myactions.register_action ("Mixer", "recenable", _("Toggle Rec-enable on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::rec_enable_action));
- myactions.register_action ("Mixer", "increment-gain", _("Decrease Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::step_gain_up_action));
- myactions.register_action ("Mixer", "decrement-gain", _("Increase Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::step_gain_down_action));
- myactions.register_action ("Mixer", "unity-gain", _("Set Gain to 0dB on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::unity_gain_action));
-
-
- myactions.register_action ("Mixer", "copy-processors", _("Copy Selected Processors"), sigc::mem_fun (*this, &MixerActor::copy_processors));
- myactions.register_action ("Mixer", "cut-processors", _("Cut Selected Processors"), sigc::mem_fun (*this, &MixerActor::cut_processors));
- myactions.register_action ("Mixer", "paste-processors", _("Paste Selected Processors"), sigc::mem_fun (*this, &MixerActor::paste_processors));
- myactions.register_action ("Mixer", "delete-processors", _("Delete Selected Processors"), sigc::mem_fun (*this, &MixerActor::delete_processors));
- myactions.register_action ("Mixer", "select-all-processors", _("Select All (visible) Processors"), sigc::mem_fun (*this, &MixerActor::select_all_processors));
- myactions.register_action ("Mixer", "toggle-processors", _("Toggle Selected Processors"), sigc::mem_fun (*this, &MixerActor::toggle_processors));
- myactions.register_action ("Mixer", "ab-plugins", _("Toggle Selected Plugins"), sigc::mem_fun (*this, &MixerActor::ab_plugins));
- myactions.register_action ("Mixer", "select-none", _("Deselect all strips and processors"), sigc::mem_fun (*this, &MixerActor::select_none));
-
- myactions.register_action ("Mixer", "scroll-left", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &MixerActor::scroll_left));
- myactions.register_action ("Mixer", "scroll-right", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &MixerActor::scroll_right));
-
- myactions.register_action ("Mixer", "toggle-midi-input-active", _("Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"),
- sigc::bind (sigc::mem_fun (*this, &MixerActor::toggle_midi_input_active), false));
-}
-
-void
-MixerActor::load_bindings ()
-{
- /* XXX move this to a better place */
-
- bindings.set_action_map (myactions);
-
- std::string binding_file;
-
- if (find_file (ardour_config_search_path(), "mixer.bindings", binding_file)) {
- bindings.load (binding_file);
- info << string_compose (_("Loaded mixer bindings from %1"), binding_file) << endmsg;
- } else {
- error << string_compose (_("Could not find mixer.bindings in search path %1"), ardour_config_search_path().to_string()) << endmsg;
- }
-}
-
-void
-MixerActor::solo_action ()
-{
- GdkEventButton ev;
-
- ev.type = GDK_BUTTON_PRESS;
- ev.button = 1;
- ev.state = 0;
-
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- r->solo_press (&ev);
- }
-}
-
-void
-MixerActor::mute_action ()
-{
- GdkEventButton ev;
-
- ev.type = GDK_BUTTON_PRESS;
- ev.button = 1;
- ev.state = 0;
-
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- r->mute_press (&ev);
- }
-}
-
-void
-MixerActor::rec_enable_action ()
-{
- GdkEventButton ev;
-
- ev.type = GDK_BUTTON_PRESS;
- ev.button = 1;
- ev.state = 0;
-
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- r->rec_enable_press (&ev);
- }
-}
-
-void
-MixerActor::step_gain_up_action ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->step_gain_up ();
- }
- }
-}
-
-void
-MixerActor::step_gain_down_action ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->step_gain_down ();
- }
- }
-}
-
-void
-MixerActor::unity_gain_action ()
-{
- set_route_targets_for_operation ();
-
-printf("setting gain to unity (?)");
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- boost::shared_ptr<Route> rp = r->route();
- if (rp) {
- rp->set_gain (1.0, Controllable::NoGroup);
- }
- }
-}
-
-void
-MixerActor::copy_processors ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->copy_processors ();
- }
- }
-}
-void
-MixerActor::cut_processors ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->cut_processors ();
- }
- }
-}
-void
-MixerActor::paste_processors ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->paste_processors ();
- }
- }
-}
-void
-MixerActor::select_all_processors ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->select_all_processors ();
- }
- }
-}
-void
-MixerActor::toggle_processors ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->toggle_processors ();
- }
- }
-}
-void
-MixerActor::ab_plugins ()
-{
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (ms) {
- ms->ab_plugins ();
- }
- }
-}
-
diff --git a/gtk2_ardour/mixer_actor.h b/gtk2_ardour/mixer_actor.h
deleted file mode 100644
index d3e861b..0000000
--- a/gtk2_ardour/mixer_actor.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- Copyright (C) 2000 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef __gtk2_ardour_mixer_actor_h__
-#define __gtk2_ardour_mixer_actor_h__
-
-#include <glibmm/refptr.h>
-#include <gtkmm2ext/bindings.h>
-
-#include "route_processor_selection.h"
-
-namespace Gtk {
- class ActionGroup;
-}
-
-class MixerActor : virtual public sigc::trackable
-{
- public:
- MixerActor ();
- virtual ~MixerActor ();
-
- RouteProcessorSelection& selection() { return _selection; }
- void register_actions ();
-
- void load_bindings ();
- Gtkmm2ext::Bindings bindings;
-
- protected:
- RouteProcessorSelection _selection;
- RouteUISelection _route_targets;
- Gtkmm2ext::ActionMap myactions;
-
- virtual void set_route_targets_for_operation () = 0;
-
- void solo_action ();
- void mute_action ();
- void rec_enable_action ();
- void step_gain_up_action ();
- void step_gain_down_action ();
- void unity_gain_action ();
-
- void copy_processors ();
- void cut_processors ();
- void paste_processors ();
- void select_all_processors ();
- void toggle_processors ();
- void ab_plugins ();
-
- //this op is different because it checks _all_ mixer strips, and deletes selected plugins on any of them (ignores track selections)
- //BUT... note that we have used mixerstrip's "Enter" to enforce the rule that only one strip will have an active selection
- virtual void delete_processors () = 0;
-
- virtual void select_none () = 0;
-
-
- /* these actions need access to a Session, do defer to
- a derived class
- */
- virtual void toggle_midi_input_active (bool flip_others) = 0;
-
- /* these actions don't apply to the selection, so defer to
- a derived class.
- */
- virtual void scroll_left () {}
- virtual void scroll_right () {}
-};
-
-#endif /* __gtk2_ardour_mixer_actor_h__ */
diff --git a/gtk2_ardour/mixer_group_tabs.cc b/gtk2_ardour/mixer_group_tabs.cc
index f84c53b..63bb1a0 100644
--- a/gtk2_ardour/mixer_group_tabs.cc
+++ b/gtk2_ardour/mixer_group_tabs.cc
@@ -33,7 +33,7 @@
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -61,7 +61,12 @@ MixerGroupTabs::compute_tabs () const
TreeModel::Children rows = _mixer->track_model->children ();
for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
- MixerStrip* s = (*i)[_mixer->track_columns.strip];
+ AxisView* av = (*i)[_mixer->stripable_columns.strip];
+ MixerStrip* s = dynamic_cast<MixerStrip*> (av);
+
+ if (!s) {
+ continue;
+ }
if (s->route()->is_master() || s->route()->is_monitor() || !s->marked_for_display()) {
continue;
@@ -149,11 +154,16 @@ MixerGroupTabs::routes_for_tab (Tab const * t) const
TreeModel::Children rows = _mixer->track_model->children ();
for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
- MixerStrip* s = (*i)[_mixer->track_columns.strip];
+ AxisView* av = (*i)[_mixer->stripable_columns.strip];
+ MixerStrip* s = dynamic_cast<MixerStrip*> (av);
+
+ if (!s) {
+ continue;
+ }
- if (s->route()->is_master() || s->route()->is_monitor() || !s->marked_for_display()) {
- continue;
- }
+ if (s->route()->is_master() || s->route()->is_monitor() || !s->marked_for_display()) {
+ continue;
+ }
if (x >= t->to) {
/* tab finishes before this track starts */
@@ -176,8 +186,8 @@ RouteList
MixerGroupTabs::selected_routes () const
{
RouteList rl;
- BOOST_FOREACH (RouteUI* r, _mixer->selection().routes) {
- boost::shared_ptr<Route> rp = r->route();
+ BOOST_FOREACH (AxisView* r, _mixer->selection().axes) {
+ boost::shared_ptr<Route> rp = boost::dynamic_pointer_cast<Route> (r->stripable());
if (rp) {
rl.push_back (rp);
}
@@ -185,8 +195,3 @@ MixerGroupTabs::selected_routes () const
return rl;
}
-void
-MixerGroupTabs::sync_order_keys ()
-{
- _mixer->sync_order_keys_from_treeview ();
-}
diff --git a/gtk2_ardour/mixer_group_tabs.h b/gtk2_ardour/mixer_group_tabs.h
index 5f15255..8da5a1b 100644
--- a/gtk2_ardour/mixer_group_tabs.h
+++ b/gtk2_ardour/mixer_group_tabs.h
@@ -36,7 +36,6 @@ private:
}
ARDOUR::RouteList selected_routes () const;
- void sync_order_keys ();
Mixer_UI* _mixer;
};
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 553f44a..1e8717d 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -38,6 +38,7 @@
#include "ardour/audio_track.h"
#include "ardour/audioengine.h"
#include "ardour/internal_send.h"
+#include "ardour/io.h"
#include "ardour/meter.h"
#include "ardour/midi_track.h"
#include "ardour/pannable.h"
@@ -52,6 +53,8 @@
#include "ardour/session.h"
#include "ardour/types.h"
#include "ardour/user_bundle.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
#include "ardour_window.h"
#include "mixer_strip.h"
@@ -68,7 +71,7 @@
#include "tooltips.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -79,11 +82,10 @@ using namespace std;
using namespace ArdourMeter;
MixerStrip* MixerStrip::_entered_mixer_strip;
-
PBD::Signal1<void,MixerStrip*> MixerStrip::CatchDeletion;
MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
- : AxisView(sess)
+ : SessionHandlePtr (sess)
, RouteUI (sess)
, _mixer(mx)
, _mixer_owned (in_mixer)
@@ -98,9 +100,11 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
, meter_point_button (_("pre"))
, monitor_section_button (0)
, midi_input_enable_button (0)
+ , _plugin_insert_cnt (0)
, _comment_button (_("Comments"))
, trim_control (ArdourKnob::default_elements, ArdourKnob::Flags (ArdourKnob::Detent | ArdourKnob::ArcToZero))
, _visibility (X_("mixer-element-visibility"))
+ , control_slave_ui (sess)
{
init ();
@@ -114,7 +118,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
}
MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt, bool in_mixer)
- : AxisView(sess)
+ : SessionHandlePtr (sess)
, RouteUI (sess)
, _mixer(mx)
, _mixer_owned (in_mixer)
@@ -132,6 +136,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
, _comment_button (_("Comments"))
, trim_control (ArdourKnob::default_elements, ArdourKnob::Flags (ArdourKnob::Detent | ArdourKnob::ArcToZero))
, _visibility (X_("mixer-element-visibility"))
+ , control_slave_ui (sess)
{
init ();
set_route (rt);
@@ -158,9 +163,11 @@ MixerStrip::init ()
}
width_button.set_icon (ArdourIcon::StripWidth);
+ hide_button.set_tweaks (ArdourButton::Square);
set_tooltip (width_button, t);
hide_button.set_icon (ArdourIcon::CloseCross);
+ hide_button.set_tweaks (ArdourButton::Square);
set_tooltip (&hide_button, _("Hide this mixer strip"));
input_button_box.set_spacing(2);
@@ -257,7 +264,9 @@ MixerStrip::init ()
group_button.set_name ("mixer strip button");
_comment_button.set_name (X_("mixer strip button"));
+ _comment_button.set_text_ellipsize (Pango::ELLIPSIZE_END);
_comment_button.signal_clicked.connect (sigc::mem_fun (*this, &RouteUI::toggle_comment_editor));
+ _comment_button.signal_size_allocate().connect (sigc::mem_fun (*this, &MixerStrip::comment_button_resized));
// TODO implement ArdourKnob::on_size_request properly
#define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
@@ -277,7 +286,6 @@ MixerStrip::init ()
width_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::width_button_pressed), false);
hide_button.signal_clicked.connect (sigc::mem_fun(*this, &MixerStrip::hide_clicked));
-// width_hide_box.set_border_width (1);
width_hide_box.set_spacing (2);
width_hide_box.pack_start (width_button, false, true);
width_hide_box.pack_start (number_label, true, true);
@@ -290,6 +298,7 @@ MixerStrip::init ()
number_label.set_fixed_colors (0x80808080, 0x80808080);
number_label.set_alignment (.5, .5);
number_label.set_fallthrough_to_parent (true);
+ number_label.set_tweaks (ArdourButton::OccasionalText);
global_vpacker.set_spacing (2);
if (!ARDOUR::Profile->get_trx()) {
@@ -304,6 +313,7 @@ MixerStrip::init ()
global_vpacker.pack_start (solo_iso_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (mute_solo_table, Gtk::PACK_SHRINK);
global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
+ global_vpacker.pack_start (control_slave_ui, Gtk::PACK_SHRINK);
global_vpacker.pack_start (bottom_button_table, Gtk::PACK_SHRINK);
if (!ARDOUR::Profile->get_trx()) {
global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
@@ -385,6 +395,7 @@ MixerStrip::init ()
_visibility.add (&solo_iso_table, X_("SoloIsoLock"), _("Solo Iso / Lock"), false);
_visibility.add (&output_button, X_("Output"), _("Output"), false);
_visibility.add (&_comment_button, X_("Comments"), _("Comments"), false);
+ _visibility.add (&control_slave_ui, X_("VCA"), _("VCA Assigns"), false);
parameter_changed (X_("mixer-element-visibility"));
UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &MixerStrip::parameter_changed));
@@ -437,6 +448,29 @@ MixerStrip::mixer_strip_leave_event (GdkEventCrossing *ev)
return false;
}
+string
+MixerStrip::name() const
+{
+ if (_route) {
+ return _route->name();
+ }
+ return string();
+}
+
+void
+MixerStrip::update_trim_control ()
+{
+ if (route()->trim() && route()->trim()->active() &&
+ route()->n_inputs().n_audio() > 0) {
+ trim_control.show ();
+ trim_control.set_controllable (route()->trim()->gain_control());
+ } else {
+ trim_control.hide ();
+ boost::shared_ptr<Controllable> none;
+ trim_control.set_controllable (none);
+ }
+}
+
void
MixerStrip::set_route (boost::shared_ptr<Route> rt)
{
@@ -461,6 +495,8 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
RouteUI::set_route (rt);
+ control_slave_ui.set_stripable (boost::dynamic_pointer_cast<Stripable> (rt));
+
/* ProcessorBox needs access to _route so that it can read
GUI object state.
*/
@@ -541,14 +577,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
monitor_disk_button->hide ();
}
- if (route()->trim() && route()->trim()->active()) {
- trim_control.show ();
- trim_control.set_controllable (route()->trim()->gain_control());
- } else {
- trim_control.hide ();
- boost::shared_ptr<Controllable> none;
- trim_control.set_controllable (none);
- }
+ update_trim_control();
if (is_midi_track()) {
if (midi_input_enable_button == 0) {
@@ -583,7 +612,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
if (is_track ()) {
rec_mon_table.attach (*rec_enable_button, 0, 1, 0, ARDOUR::Profile->get_mixbus() ? 1 : 2);
- rec_enable_button->set_sensitive (_session->writable());
rec_enable_button->show();
if (ARDOUR::Profile->get_mixbus()) {
@@ -628,7 +656,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
}
_route->comment_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::setup_comment_button, this), gui_context());
- _route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::property_changed, this, _1), gui_context());
set_stuff_from_route ();
@@ -639,6 +666,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
name_changed ();
comment_changed ();
route_group_changed ();
+ update_track_number_visibility ();
connect_to_pan ();
panners.setup_pan ();
@@ -874,15 +902,17 @@ MixerStrip::output_press (GdkEventButton *ev)
citems.pop_back ();
}
- citems.push_back (SeparatorElem());
+ if (!ARDOUR::Profile->get_mixbus()) {
+ citems.push_back (SeparatorElem());
- for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
- citems.push_back (
- MenuElem (
- string_compose (_("Add %1 port"), (*i).to_i18n_string()),
- sigc::bind (sigc::mem_fun (*this, &MixerStrip::add_output_port), *i)
- )
- );
+ for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+ citems.push_back (
+ MenuElem (
+ string_compose (_("Add %1 port"), (*i).to_i18n_string()),
+ sigc::bind (sigc::mem_fun (*this, &MixerStrip::add_output_port), *i)
+ )
+ );
+ }
}
citems.push_back (SeparatorElem());
@@ -930,7 +960,7 @@ MixerStrip::input_press (GdkEventButton *ev)
return true;
}
- if (_session->actively_recording() && _route->record_enabled())
+ if (_session->actively_recording() && is_track() && track()->rec_enable_control()->get_value())
return true;
switch (ev->button) {
@@ -1037,9 +1067,9 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR:
{
using namespace Menu_Helpers;
- if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
- return;
- }
+ if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
+ return;
+ }
list<boost::shared_ptr<Bundle> >::iterator i = input_menu_bundles.begin ();
while (i != input_menu_bundles.end() && b->has_same_ports (*i) == false) {
@@ -1065,9 +1095,9 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR
{
using namespace Menu_Helpers;
- if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
- return;
- }
+ if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
+ return;
+ }
list<boost::shared_ptr<Bundle> >::iterator i = output_menu_bundles.begin ();
while (i != output_menu_bundles.end() && b->has_same_ports (*i) == false) {
@@ -1187,6 +1217,7 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
{
uint32_t io_count;
uint32_t io_index;
+ boost::shared_ptr<IO> io;
boost::shared_ptr<Port> port;
vector<string> port_connections;
@@ -1211,30 +1242,70 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
ostringstream tooltip;
char * tooltip_cstr;
- //to avoid confusion, the button caption should only show connections that match the datatype of the track
+ /* To avoid confusion, the button caption only shows connections that match the expected datatype
+ *
+ * First of all, if the user made only connections to a given type, we should use that one since
+ * it is very probably what the user expects. If there are several connections types, then show
+ * audio ones as primary, which matches expectations for both audio tracks with midi control and
+ * synthesisers. This first heuristic can be expressed with these two rules:
+ * A) If there are connected audio ports, consider audio as primary type.
+ * B) Else, if there are connected midi ports, consider midi as primary type.
+ *
+ * If there are no connected ports, then we choose the primary type based on the type of existing
+ * but unconnected ports. Again:
+ * C) If there are audio ports, consider audio as primary type.
+ * D) Else, if there are midi ports, consider midi as primary type. */
+
DataType dt = DataType::AUDIO;
- if ( boost::dynamic_pointer_cast<MidiTrack>(route) != 0 ) {
- dt = DataType::MIDI;
- // avoid further confusion with Midi-tracks that have a synth.
- // Audio-ports may be connected, but button says "Disconnected"
+ bool match = false;
+
+ if (for_input) {
+ io = route->input();
+ } else {
+ io = route->output();
+ }
+
+ io_count = io->n_ports().n_total();
+ for (io_index = 0; io_index < io_count; ++io_index) {
+ port = io->nth (io_index);
+ if (port->connected()) {
+ match = true;
+ if (port->type() == DataType::AUDIO) {
+ /* Rule A) applies no matter the remaining ports */
+ dt = DataType::AUDIO;
+ break;
+ }
+ if (port->type() == DataType::MIDI) {
+ /* Rule B) is a good candidate... */
+ dt = DataType::MIDI;
+ /* ...but continue the loop to check remaining ports for rule A) */
+ }
+ }
+ }
+
+ if (!match) {
+ /* Neither rule A) nor rule B) matched */
+ if ( io->n_ports().n_audio() > 0 ) {
+ /* Rule C */
+ dt = DataType::AUDIO;
+ } else if ( io->n_ports().n_midi() > 0 ) {
+ /* Rule D */
+ dt = DataType::MIDI;
+ }
+ }
+
+ if ( dt == DataType::MIDI ) {
tooltip << _("MIDI ");
}
if (for_input) {
- io_count = route->n_inputs().n_total();
tooltip << string_compose (_("<b>INPUT</b> to %1"), Gtkmm2ext::markup_escape_text (route->name()));
} else {
- io_count = route->n_outputs().n_total();
tooltip << string_compose (_("<b>OUTPUT</b> from %1"), Gtkmm2ext::markup_escape_text (route->name()));
}
-
for (io_index = 0; io_index < io_count; ++io_index) {
- if (for_input) {
- port = route->input()->nth (io_index);
- } else {
- port = route->output()->nth (io_index);
- }
+ port = io->nth (io_index);
port_connections.clear ();
port->get_connections(port_connections);
@@ -1351,17 +1422,20 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
if (for_input) {
set_tooltip (&input_button, tooltip_cstr);
- } else {
+ } else {
set_tooltip (&output_button, tooltip_cstr);
}
+ delete [] tooltip_cstr;
+
if (each_io_has_one_connection) {
if (total_connection_count == ardour_connection_count) {
// all connections are to the same track in ardour
// "ardour:Master/" -> "Master"
string::size_type slash = ardour_track_name.find("/");
if (slash != string::npos) {
- label << ardour_track_name.substr(7, slash - 7);
+ const size_t ppps = RouteUI::program_port_prefix.size (); // "ardour:"
+ label << ardour_track_name.substr (ppps, slash - ppps);
have_label = true;
}
}
@@ -1402,7 +1476,7 @@ void
MixerStrip::update_input_display ()
{
update_io_button (_route, _width, true);
- panners.setup_pan ();
+ panners.setup_pan ();
if (has_audio_outputs ()) {
panners.show_all ();
@@ -1416,8 +1490,8 @@ void
MixerStrip::update_output_display ()
{
update_io_button (_route, _width, false);
- gpm.setup_meters ();
- panners.setup_pan ();
+ gpm.setup_meters ();
+ panners.setup_pan ();
if (has_audio_outputs ()) {
panners.show_all ();
@@ -1442,6 +1516,7 @@ void
MixerStrip::io_changed_proxy ()
{
Glib::signal_idle().connect_once (sigc::mem_fun (*this, &MixerStrip::update_panner_choices));
+ Glib::signal_idle().connect_once (sigc::mem_fun (*this, &MixerStrip::update_trim_control));
}
void
@@ -1464,33 +1539,27 @@ MixerStrip::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost::wea
void
MixerStrip::setup_comment_button ()
{
- switch (_width) {
+ std::string comment = _route->comment();
- case Wide:
- if (_route->comment().empty ()) {
- _comment_button.unset_bg (STATE_NORMAL);
- _comment_button.set_text (_("Comments"));
- } else {
- _comment_button.modify_bg (STATE_NORMAL, color ());
- _comment_button.set_text (_("*Comments*"));
- }
- break;
+ set_tooltip (_comment_button, comment.empty() ? _("Click to add/edit comments") : _route->comment());
- case Narrow:
- if (_route->comment().empty ()) {
- _comment_button.unset_bg (STATE_NORMAL);
- _comment_button.set_text (_("Cmt"));
- } else {
- _comment_button.modify_bg (STATE_NORMAL, color ());
- _comment_button.set_text (_("*Cmt*"));
- }
- break;
+ if (comment.empty ()) {
+ _comment_button.set_name ("generic button");
+ _comment_button.set_text (_width == Wide ? _("Comments") : _("Cmt"));
+ return;
}
- set_tooltip (
- _comment_button, _route->comment().empty() ? _("Click to add/edit comments") : _route->comment()
- );
+ _comment_button.set_name ("comment button");
+ string::size_type pos = comment.find_first_of (" \t\n");
+ if (pos != string::npos) {
+ comment = comment.substr (0, pos);
+ }
+ if (comment.empty()) {
+ _comment_button.set_text (_width == Wide ? _("Comments") : _("Cmt"));
+ } else {
+ _comment_button.set_text (comment);
+ }
}
bool
@@ -1504,9 +1573,9 @@ MixerStrip::select_route_group (GdkEventButton *ev)
PropertyList* plist = new PropertyList();
- plist->add (Properties::gain, true);
- plist->add (Properties::mute, true);
- plist->add (Properties::solo, true);
+ plist->add (Properties::group_gain, true);
+ plist->add (Properties::group_mute, true);
+ plist->add (Properties::group_solo, true);
group_menu = new RouteGroupMenu (_session, plist);
}
@@ -1555,6 +1624,18 @@ MixerStrip::show_passthru_color ()
reset_strip_style ();
}
+
+void
+MixerStrip::help_count_plugins (boost::weak_ptr<Processor> p)
+{
+ boost::shared_ptr<Processor> processor (p.lock ());
+ if (!processor || !processor->display_to_user()) {
+ return;
+ }
+ if (boost::dynamic_pointer_cast<PluginInsert> (processor)) {
+ ++_plugin_insert_cnt;
+ }
+}
void
MixerStrip::build_route_ops_menu ()
{
@@ -1587,8 +1668,22 @@ MixerStrip::build_route_ops_menu ()
i->set_sensitive(! _session->transport_rolling());
i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::set_route_active), !_route->active(), false));
- items.push_back (SeparatorElem());
+ if (!Profile->get_mixbus ()) {
+ items.push_back (SeparatorElem());
+ items.push_back (CheckMenuElem (_("Strict I/O")));
+ i = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
+ i->set_active (_route->strict_io());
+ i->signal_activate().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*_route, &Route::set_strict_io), !_route->strict_io())));
+ }
+
+ _plugin_insert_cnt = 0;
+ _route->foreach_processor (sigc::mem_fun (*this, &MixerStrip::help_count_plugins));
+ if (_plugin_insert_cnt > 0) {
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Pin Connections..."), sigc::mem_fun (*this, &RouteUI::manage_pins)));
+ }
+ items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Adjust Latency..."), sigc::mem_fun (*this, &RouteUI::adjust_latency)));
items.push_back (SeparatorElem());
@@ -1596,11 +1691,6 @@ MixerStrip::build_route_ops_menu ()
denormal_menu_item = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
denormal_menu_item->set_active (_route->denormal_protection());
- if (!Profile->get_sae()) {
- items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog)));
- }
-
if (_route) {
/* note that this relies on selection being shared across editor and
mixer (or global to the backend, in the future), which is the only
@@ -1618,7 +1708,7 @@ MixerStrip::build_route_ops_menu ()
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Duplicate..."), sigc::mem_fun (*this, &RouteUI::duplicate_selected_routes)));
}
-
+
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Remove"), sigc::mem_fun(PublicEditor::instance(), &PublicEditor::remove_tracks)));
}
@@ -1632,7 +1722,7 @@ MixerStrip::name_button_button_press (GdkEventButton* ev)
list_route_operations ();
/* do not allow rename if the track is record-enabled */
- rename_menu_item->set_sensitive (!_route->record_enabled());
+ rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
route_ops_menu->popup (1, ev->time);
return true;
@@ -1648,7 +1738,7 @@ MixerStrip::name_button_button_release (GdkEventButton* ev)
list_route_operations ();
/* do not allow rename if the track is record-enabled */
- rename_menu_item->set_sensitive (!_route->record_enabled());
+ rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
route_ops_menu->popup (1, ev->time);
}
@@ -1662,7 +1752,7 @@ MixerStrip::number_button_button_press (GdkEventButton* ev)
list_route_operations ();
/* do not allow rename if the track is record-enabled */
- rename_menu_item->set_sensitive (!_route->record_enabled());
+ rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
route_ops_menu->popup (1, ev->time);
return true;
@@ -1682,13 +1772,15 @@ void
MixerStrip::set_selected (bool yn)
{
AxisView::set_selected (yn);
- if (_selected) {
+
+ if (selected()) {
global_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
global_frame.set_name ("MixerStripSelectedFrame");
} else {
global_frame.set_shadow_type (Gtk::SHADOW_IN);
global_frame.set_name ("MixerStripFrame");
}
+
global_frame.queue_draw ();
// if (!yn)
@@ -1696,10 +1788,8 @@ MixerStrip::set_selected (bool yn)
}
void
-MixerStrip::property_changed (const PropertyChange& what_changed)
+MixerStrip::route_property_changed (const PropertyChange& what_changed)
{
- RouteUI::property_changed (what_changed);
-
if (what_changed.contains (ARDOUR::Properties::name)) {
name_changed ();
}
@@ -1749,6 +1839,12 @@ MixerStrip::name_button_resized (Gtk::Allocation& alloc)
name_button.set_layout_ellipsize_width (alloc.get_width() * PANGO_SCALE);
}
+void
+MixerStrip::comment_button_resized (Gtk::Allocation& alloc)
+{
+ _comment_button.set_layout_ellipsize_width (alloc.get_width() * PANGO_SCALE);
+}
+
bool
MixerStrip::width_button_pressed (GdkEventButton* ev)
{
@@ -1823,6 +1919,7 @@ MixerStrip::map_frozen ()
} else {
processor_box.set_sensitive (true);
}
+ RouteUI::map_frozen ();
}
void
@@ -2010,12 +2107,13 @@ MixerStrip::drop_send ()
meter_point_button.set_sensitive (true);
mute_button->set_sensitive (true);
solo_button->set_sensitive (true);
- rec_enable_button->set_sensitive (true);
solo_isolated_led->set_sensitive (true);
solo_safe_led->set_sensitive (true);
monitor_input_button->set_sensitive (true);
monitor_disk_button->set_sensitive (true);
_comment_button.set_sensitive (true);
+ RouteUI::check_rec_enable_sensitivity ();
+ set_button_names (); // update solo button visual state
}
void
@@ -2106,7 +2204,7 @@ MixerStrip::set_button_names ()
monitor_section_button->set_text (_("Mon"));
}
- if (_route && _route->solo_safe()) {
+ if (_route && _route->solo_safe_control()->solo_safe()) {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
} else {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -2135,7 +2233,7 @@ MixerStrip::set_button_names ()
monitor_section_button->set_text (S_("Mon|O"));
}
- if (_route && _route->solo_safe()) {
+ if (_route && _route->solo_safe_control()->solo_safe()) {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
} else {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -2227,11 +2325,9 @@ MixerStrip::parameter_changed (string p)
our VisibilityGroup to reflect these changes in our widgets.
*/
_visibility.set_state (UIConfiguration::instance().get_mixer_strip_visibility ());
- }
- else if (p == "track-name-number") {
+ } else if (p == "track-name-number") {
name_changed ();
- }
- else if (p == "use-monitor-bus") {
+ } else if (p == "use-monitor-bus") {
if (monitor_section_button) {
if (mute_button->get_parent()) {
mute_button->get_parent()->remove(*mute_button);
@@ -2249,6 +2345,8 @@ MixerStrip::parameter_changed (string p)
mute_button->show();
}
}
+ } else if (p == "track-name-number") {
+ update_track_number_visibility();
}
}
@@ -2451,3 +2549,45 @@ MixerStrip::set_meter_type (MeterType t)
if (_suspend_menu_callbacks) return;
gpm.set_type (t);
}
+
+void
+MixerStrip::update_track_number_visibility ()
+{
+ DisplaySuspender ds;
+ bool show_label = _session->config.get_track_name_number();
+
+ if (_route && _route->is_master()) {
+ show_label = false;
+ }
+
+ if (show_label) {
+ number_label.show ();
+ // see ArdourButton::on_size_request(), we should probably use a global size-group here instead.
+ // except the width of the number label is subtracted from the name-hbox, so we
+ // need to explictly calculate it anyway until the name-label & entry become ArdourWidgets.
+ int tnw = (2 + std::max(2u, _session->track_number_decimals())) * number_label.char_pixel_width();
+ if (tnw & 1) --tnw;
+ number_label.set_size_request(tnw, -1);
+ number_label.show ();
+ } else {
+ number_label.hide ();
+ }
+}
+
+Gdk::Color
+MixerStrip::color () const
+{
+ return route_color ();
+}
+
+bool
+MixerStrip::marked_for_display () const
+{
+ return !_route->presentation_info().hidden();
+}
+
+bool
+MixerStrip::set_marked_for_display (bool yn)
+{
+ return RouteUI::mark_hidden (!yn);
+}
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index f0aebf0..eb6da17 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -47,6 +47,8 @@
#include "pbd/fastlog.h"
+#include "axis_view.h"
+#include "control_slave_ui.h"
#include "ardour_knob.h"
#include "route_ui.h"
#include "gain_meter.h"
@@ -74,13 +76,20 @@ class MotionController;
class RouteGroupMenu;
class ArdourWindow;
-class MixerStrip : public RouteUI, public Gtk::EventBox
+class MixerStrip : public AxisView, public RouteUI, public Gtk::EventBox
{
public:
MixerStrip (Mixer_UI&, ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>, bool in_mixer = true);
MixerStrip (Mixer_UI&, ARDOUR::Session*, bool in_mixer = true);
~MixerStrip ();
+ std::string name() const;
+ Gdk::Color color () const;
+ bool marked_for_display () const;
+ bool set_marked_for_display (bool);
+
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
+
void set_width_enum (Width, void* owner);
Width get_width_enum () const { return _width; }
void* width_owner () const { return _width_owner; }
@@ -131,8 +140,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void toggle_processors ();
void ab_plugins ();
- void set_selected(bool yn);
- bool is_selected() {return _selected;}
+ void set_selected (bool yn);
static MixerStrip* entered_mixer_strip() { return _entered_mixer_strip; }
@@ -189,6 +197,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void input_button_resized (Gtk::Allocation&);
void output_button_resized (Gtk::Allocation&);
+ void comment_button_resized (Gtk::Allocation&);
ArdourButton* midi_input_enable_button;
Gtk::HBox input_button_box;
@@ -199,6 +208,9 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
bool input_active_button_press (GdkEventButton*);
bool input_active_button_release (GdkEventButton*);
+ void help_count_plugins (boost::weak_ptr<ARDOUR::Processor>);
+ uint32_t _plugin_insert_cnt;
+
gint mark_update_safe ();
guint32 mode_switch_in_progress;
@@ -237,13 +249,11 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
Gtk::MenuItem* rename_menu_item;
void build_send_action_menu ();
- void new_send ();
- void show_send_controls ();
-
PBD::ScopedConnection panstate_connection;
PBD::ScopedConnection panstyle_connection;
void connect_to_pan ();
void update_panner_choices ();
+ void update_trim_control ();
void update_diskstream_display ();
void update_input_display ();
@@ -266,7 +276,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void route_color_changed ();
void show_passthru_color ();
- void property_changed (const PBD::PropertyChange&);
+ void route_property_changed (const PBD::PropertyChange&);
void name_button_resized (Gtk::Allocation&);
void name_changed ();
void update_speed_display ();
@@ -321,6 +331,10 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
PBD::ScopedConnection _level_meter_connection;
std::string meter_point_string (ARDOUR::MeterPoint);
+
+ void update_track_number_visibility ();
+
+ ControlSlaveUI control_slave_ui;
};
#endif /* __ardour_mixer_strip__ */
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index 7200cfd..4c5317a 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -25,25 +25,32 @@
#include <map>
#include <sigc++/bind.h>
+#include <boost/foreach.hpp>
+
#include <gtkmm/accelmap.h>
#include "pbd/convert.h"
+#include "pbd/stacktrace.h"
#include "pbd/unwind.h"
#include <glibmm/threads.h>
#include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/keyboard.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/tearoff.h>
#include <gtkmm2ext/window_title.h>
+#include <gtkmm2ext/doi.h>
#include "ardour/amp.h"
#include "ardour/debug.h"
+#include "ardour/audio_track.h"
#include "ardour/midi_track.h"
#include "ardour/plugin_manager.h"
#include "ardour/route_group.h"
-#include "ardour/route_sorters.h"
#include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
#include "keyboard.h"
#include "mixer_ui.h"
@@ -51,6 +58,7 @@
#include "monitor_section.h"
#include "plugin_selector.h"
#include "public_editor.h"
+#include "mouse_cursors.h"
#include "ardour_ui.h"
#include "prompter.h"
#include "utils.h"
@@ -58,10 +66,12 @@
#include "actions.h"
#include "gui_thread.h"
#include "mixer_group_tabs.h"
+#include "route_sorter.h"
#include "timers.h"
#include "ui_config.h"
+#include "vca_master_strip.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -87,9 +97,7 @@ Mixer_UI::instance ()
}
Mixer_UI::Mixer_UI ()
- : Window (Gtk::WINDOW_TOPLEVEL)
- , VisibilityTracker (*((Gtk::Window*) this))
- , _visible (false)
+ : Tabbable (_content, _("Mixer"))
, no_track_list_redisplay (false)
, in_group_row_change (false)
, track_menu (0)
@@ -102,19 +110,28 @@ Mixer_UI::Mixer_UI ()
, _following_editor_selection (false)
, _maximised (false)
, _show_mixer_list (true)
+ , myactions (X_("mixer"))
{
- /* allow this window to become the key focus window */
- set_flags (CAN_FOCUS);
+ register_actions ();
+ load_bindings ();
+ _content.set_data ("ardour-bindings", bindings);
- Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_order_keys, this), gui_context());
+ PresentationInfo::Change.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_presentation_info, this), gui_context());
scroller.set_can_default (true);
- set_default (scroller);
+ // set_default (scroller);
scroller_base.set_flags (Gtk::CAN_FOCUS);
scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
scroller_base.set_name ("MixerWindow");
scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
+
+ /* set up drag-n-drop */
+ vector<TargetEntry> target_table;
+ target_table.push_back (TargetEntry ("PluginFavoritePtr"));
+ scroller_base.drag_dest_set (target_table);
+ scroller_base.signal_drag_data_received().connect (sigc::mem_fun(*this, &Mixer_UI::scroller_drag_data_received));
+
// add as last item of strip packer
strip_packer.pack_end (scroller_base, true, true);
@@ -131,12 +148,13 @@ Mixer_UI::Mixer_UI ()
group_model = ListStore::create (group_columns);
group_display.set_model (group_model);
- group_display.append_column (_("Group"), group_columns.text);
group_display.append_column (_("Show"), group_columns.visible);
+ group_display.append_column (_("Group"), group_columns.text);
group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
- group_display.get_column (0)->set_expand(true);
- group_display.get_column (1)->set_expand(false);
+ group_display.get_column (0)->set_expand(false);
+ group_display.get_column (1)->set_expand(true);
+ group_display.get_column (1)->set_sizing (Gtk::TREE_VIEW_COLUMN_FIXED);
group_display.set_name ("EditGroupList");
group_display.get_selection()->set_mode (Gtk::SELECTION_SINGLE);
group_display.set_reorderable (true);
@@ -146,13 +164,13 @@ Mixer_UI::Mixer_UI ()
/* name is directly editable */
- CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (0));
+ CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (1));
name_cell->property_editable() = true;
name_cell->signal_edited().connect (sigc::mem_fun (*this, &Mixer_UI::route_group_name_edit));
/* use checkbox for the active column */
- CellRendererToggle* active_cell = dynamic_cast<CellRendererToggle*>(group_display.get_column_cell_renderer (1));
+ CellRendererToggle* active_cell = dynamic_cast<CellRendererToggle*>(group_display.get_column_cell_renderer (0));
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
@@ -194,6 +212,10 @@ Mixer_UI::Mixer_UI ()
group_display_frame.set_shadow_type (Gtk::SHADOW_IN);
group_display_frame.add (group_display_vbox);
+
+ list<TargetEntry> target_list;
+ target_list.push_back (TargetEntry ("PluginPresetPtr"));
+
favorite_plugins_model = PluginTreeStore::create (favorite_plugins_columns);
favorite_plugins_display.set_model (favorite_plugins_model);
favorite_plugins_display.append_column (_("Favorite Plugins"), favorite_plugins_columns.name);
@@ -203,8 +225,10 @@ Mixer_UI::Mixer_UI ()
favorite_plugins_display.set_headers_visible (true);
favorite_plugins_display.set_rules_hint (true);
favorite_plugins_display.set_can_focus (false);
- favorite_plugins_display.add_object_drag (favorite_plugins_columns.plugin.index(), "PluginPresetPtr");
+ favorite_plugins_display.set_tooltip_column (0);
+ favorite_plugins_display.add_object_drag (favorite_plugins_columns.plugin.index(), "PluginFavoritePtr");
favorite_plugins_display.set_drag_column (favorite_plugins_columns.name.index());
+ favorite_plugins_display.add_drop_targets (target_list);
favorite_plugins_display.signal_row_activated().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_activated));
favorite_plugins_display.signal_button_press_event().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_button_press), false);
favorite_plugins_display.signal_drop.connect (sigc::mem_fun (*this, &Mixer_UI::plugin_drop));
@@ -219,46 +243,95 @@ Mixer_UI::Mixer_UI ()
favorite_plugins_frame.set_shadow_type (Gtk::SHADOW_IN);
favorite_plugins_frame.add (favorite_plugins_scroller);
- rhs_pane1.pack1 (favorite_plugins_frame, false, true);
- rhs_pane1.pack2 (track_display_frame);
- rhs_pane2.pack1 (rhs_pane1);
- rhs_pane2.pack2 (group_display_frame);
+ rhs_pane1.add (favorite_plugins_frame);
+ rhs_pane1.add (track_display_frame);
+
+ rhs_pane2.add (rhs_pane1);
+ rhs_pane2.add (group_display_frame);
list_vpacker.pack_start (rhs_pane2, true, true);
- global_hpacker.pack_start (scroller, true, true);
- global_hpacker.pack_start (out_packer, false, false, 0);
+ string vca_text = _("Control Masters");
+ Gtk::HBox* vca_top_padding = manage (new Gtk::HBox);
+ vca_top_padding->set_size_request (-1, 2);
+ vca_vpacker.pack_start (*vca_top_padding, false, false);
- list_hpane.pack1(list_vpacker, false, true);
- list_hpane.pack2(global_hpacker, true, false);
+ vca_label.set_text (vca_text);
+ vca_label_bar.set_size_request (-1, 16); /* must match height in GroupTabs::set_size_request() */
- rhs_pane1.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
- static_cast<Gtk::Paned*> (&rhs_pane1)));
- rhs_pane2.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
- static_cast<Gtk::Paned*> (&rhs_pane2)));
- list_hpane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
- static_cast<Gtk::Paned*> (&list_hpane)));
+ vca_label_bar.set_name (X_("VCALabelBar"));
+ vca_label_bar.add (vca_label);
- global_vpacker.pack_start (list_hpane, true, true);
+ vca_vpacker.pack_start (vca_label_bar, false, false);
- add (global_vpacker);
- set_name ("MixerWindow");
+ vca_scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+ vca_scroller_base.set_name (X_("MixerWindow"));
+ vca_scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::masters_scroller_button_release), false);
+ vca_hpacker.pack_end (vca_scroller_base, true, true);
- update_title ();
+ vca_scroller.add (vca_hpacker);
+ vca_scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC);
+ vca_scroller.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
+
+ vca_vpacker.pack_start (vca_scroller, true, true);
+
+ inner_pane.add (scroller);
+ inner_pane.add (vca_vpacker);
+
+ global_hpacker.pack_start (inner_pane, true, true);
+ global_hpacker.pack_start (out_packer, false, false);
+
+ list_hpane.set_check_divider_position (true);
+ list_hpane.add (list_vpacker);
+ list_hpane.add (global_hpacker);
+
+
+ XMLNode const * settings = ARDOUR_UI::instance()->mixer_settings();
+ XMLProperty const * prop;
+ float fract;
- set_wmclass (X_("ardour_mixer"), PROGRAM_NAME);
+ {
+ LocaleGuard lg;
+
+ if (!settings || ((prop = settings->property ("mixer-rhs-pane1-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+ rhs_pane1.set_divider (0, 0.6f);
+ } else {
+ rhs_pane1.set_divider (0, fract);
+ }
+ if (!settings || ((prop = settings->property ("mixer-rhs-pane2-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+ rhs_pane2.set_divider (0, 0.7f);
+ } else {
+ rhs_pane2.set_divider (0, fract);
+ }
+ if (!settings || ((prop = settings->property ("mixer-list-hpane-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+ list_hpane.set_divider (0, 0.2f);
+ } else {
+ list_hpane.set_divider (0, fract);
+ }
+ if (!settings || ((prop = settings->property ("mixer-inner-pane-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+ inner_pane.set_divider (0, 0.8f);
+ } else {
+ inner_pane.set_divider (0, atof (prop->value()));
+ }
+ }
+
+ rhs_pane1.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down);
+ rhs_pane2.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down);
+ list_hpane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right);
+ inner_pane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right);
- signal_delete_event().connect (sigc::mem_fun (*this, &Mixer_UI::hide_window));
- add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
+ _content.pack_start (list_hpane, true, true);
- signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
+ update_title ();
route_group_display_button_box->show();
route_group_add_button->show();
route_group_remove_button->show();
+ _content.show ();
+ _content.set_name ("MixerWindow");
+
global_hpacker.show();
- global_vpacker.show();
scroller.show();
scroller_base.show();
scroller_hpacker.show();
@@ -274,6 +347,14 @@ Mixer_UI::Mixer_UI ()
rhs_pane1.show();
rhs_pane2.show();
strip_packer.show();
+ inner_pane.show();
+ vca_top_padding->show ();
+ vca_scroller.show();
+ vca_vpacker.show();
+ vca_hpacker.show();
+ vca_label_bar.show();
+ vca_label.show();
+ vca_scroller_base.show();
out_packer.show();
list_hpane.show();
group_display.show();
@@ -281,6 +362,10 @@ Mixer_UI::Mixer_UI ()
MixerStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::remove_strip, this, _1), gui_context());
+ /* handle escape */
+
+ ARDOUR_UI::instance()->Escape.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::escape, this), gui_context());
+
#ifndef DEFER_PLUGIN_SELECTOR_LOAD
_plugin_selector = new PluginSelector (PluginManager::instance ());
#else
@@ -301,151 +386,253 @@ Mixer_UI::~Mixer_UI ()
}
void
+Mixer_UI::escape ()
+{
+ select_none ();
+}
+
+void
Mixer_UI::track_editor_selection ()
{
PublicEditor::instance().get_selection().TracksChanged.connect (sigc::mem_fun (*this, &Mixer_UI::follow_editor_selection));
}
-
-void
-Mixer_UI::ensure_float (Window& win)
+Gtk::Window*
+Mixer_UI::use_own_window (bool and_fill_it)
{
- win.set_transient_for (*this);
+ bool new_window = !own_window();
+
+ Gtk::Window* win = Tabbable::use_own_window (and_fill_it);
+
+
+ if (win && new_window) {
+ win->set_name ("MixerWindow");
+ ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Mixer"), this);
+ win->signal_scroll_event().connect (sigc::mem_fun (*this, &Mixer_UI::on_scroll_event), false);
+ win->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), win));
+ win->set_data ("ardour-bindings", bindings);
+ update_title ();
+ }
+
+ return win;
}
void
Mixer_UI::show_window ()
{
- present ();
- if (!_visible) {
- set_window_pos_and_size ();
+ Tabbable::show_window ();
- /* show/hide group tabs as required */
- parameter_changed ("show-group-tabs");
+ /* show/hide group tabs as required */
+ parameter_changed ("show-group-tabs");
- /* now reset each strips width so the right widgets are shown */
- MixerStrip* ms;
+ /* now reset each strips width so the right widgets are shown */
- TreeModel::Children rows = track_model->children();
- TreeModel::Children::iterator ri;
+ TreeModel::Children rows = track_model->children();
+ TreeModel::Children::iterator ri;
- for (ri = rows.begin(); ri != rows.end(); ++ri) {
- ms = (*ri)[track_columns.strip];
- ms->set_width_enum (ms->get_width_enum (), ms->width_owner());
- /* Fix visibility of mixer strip stuff */
- ms->parameter_changed (X_("mixer-element-visibility"));
+ for (ri = rows.begin(); ri != rows.end(); ++ri) {
+ AxisView* av = (*ri)[stripable_columns.strip];
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (av);
+ if (!ms) {
+ continue;
}
+ ms->set_width_enum (ms->get_width_enum (), ms->width_owner());
+ /* Fix visibility of mixer strip stuff */
+ ms->parameter_changed (X_("mixer-element-visibility"));
}
/* force focus into main area */
scroller_base.grab_focus ();
+}
- _visible = true;
+void
+Mixer_UI::remove_master (VCAMasterStrip* vms)
+{
+ if (_session && _session->deletion_in_progress()) {
+ /* its all being taken care of */
+ return;
+ }
+
+ TreeModel::Children rows = track_model->children();
+ TreeModel::Children::iterator ri;
+
+ for (ri = rows.begin(); ri != rows.end(); ++ri) {
+ if ((*ri)[stripable_columns.strip] == vms) {
+ PBD::Unwinder<bool> uw (_route_deletion_in_progress, true);
+ track_model->erase (ri);
+ break;
+ }
+ }
}
bool
-Mixer_UI::hide_window (GdkEventAny *ev)
+Mixer_UI::masters_scroller_button_release (GdkEventButton* ev)
{
- get_window_pos_and_size ();
+ using namespace Menu_Helpers;
+
+ if (Keyboard::is_context_menu_event (ev)) {
+ ARDOUR_UI::instance()->add_route ();
+ return true;
+ }
+
+ return false;
+}
- _visible = false;
- return just_hide_it(ev, static_cast<Gtk::Window *>(this));
+void
+Mixer_UI::add_masters (VCAList& vlist)
+{
+ StripableList sl;
+
+ for (VCAList::iterator v = vlist.begin(); v != vlist.end(); ++v) {
+ sl.push_back (boost::dynamic_pointer_cast<Stripable> (*v));
+ }
+
+ add_stripables (sl);
}
+void
+Mixer_UI::add_routes (RouteList& rlist)
+{
+ StripableList sl;
+
+ for (RouteList::iterator r = rlist.begin(); r != rlist.end(); ++r) {
+ sl.push_back (*r);
+ }
+
+ add_stripables (sl);
+}
void
-Mixer_UI::add_strips (RouteList& routes)
+Mixer_UI::add_stripables (StripableList& slist)
{
- bool from_scratch = track_model->children().size() == 0;
Gtk::TreeModel::Children::iterator insert_iter = track_model->children().end();
+ bool from_scratch = (track_model->children().size() == 0);
+ uint32_t nroutes = 0;
+
+ slist.sort (StripablePresentationInfoSorter());
for (Gtk::TreeModel::Children::iterator it = track_model->children().begin(); it != track_model->children().end(); ++it) {
- boost::shared_ptr<Route> r = (*it)[track_columns.route];
+ boost::shared_ptr<Stripable> s = (*it)[stripable_columns.stripable];
+
+ if (!s) {
+ continue;
+ }
+
+ nroutes++;
- if (r->order_key() == (routes.front()->order_key() + routes.size())) {
+ if (s->presentation_info().order() == (slist.front()->presentation_info().order() + slist.size())) {
insert_iter = it;
break;
}
}
- if(!from_scratch) {
- _selection.clear_routes ();
- }
-
MixerStrip* strip;
+
try {
- no_track_list_redisplay = true;
+ PBD::Unwinder<bool> uw (no_track_list_redisplay, true);
+
track_display.set_model (Glib::RefPtr<ListStore>());
- for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
- boost::shared_ptr<Route> route = (*x);
+ for (StripableList::iterator s = slist.begin(); s != slist.end(); ++s) {
- if (route->is_auditioner()) {
- continue;
- }
+ boost::shared_ptr<Route> route;
+ boost::shared_ptr<VCA> vca;
- if (route->is_monitor()) {
+ if ((vca = boost::dynamic_pointer_cast<VCA> (*s))) {
- if (!_monitor_section) {
- _monitor_section = new MonitorSection (_session);
+ VCAMasterStrip* vms = new VCAMasterStrip (_session, vca);
- XMLNode* mnode = ARDOUR_UI::instance()->tearoff_settings (X_("monitor-section"));
- if (mnode) {
- _monitor_section->tearoff().set_state (*mnode);
- }
+ TreeModel::Row row = *(track_model->append());
+
+ row[stripable_columns.text] = vca->name();
+ row[stripable_columns.visible] = vms->marked_for_display ();
+ row[stripable_columns.strip] = vms;
+ row[stripable_columns.stripable] = vca;
+
+ vms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::remove_master, this, _1), gui_context());
+
+ } else if ((route = boost::dynamic_pointer_cast<Route> (*s))) {
+
+ if (route->is_auditioner()) {
+ continue;
}
- out_packer.pack_end (_monitor_section->tearoff(), false, false);
- _monitor_section->set_session (_session);
- _monitor_section->tearoff().show_all ();
+ if (route->is_monitor()) {
- _monitor_section->tearoff().Detach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_detached));
- _monitor_section->tearoff().Attach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_attached));
+ if (!_monitor_section) {
+ _monitor_section = new MonitorSection (_session);
- monitor_section_attached ();
+ XMLNode* mnode = ARDOUR_UI::instance()->tearoff_settings (X_("monitor-section"));
+ if (mnode) {
+ _monitor_section->tearoff().set_state (*mnode);
+ }
+ }
- route->DropReferences.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::monitor_section_going_away, this), gui_context());
+ out_packer.pack_end (_monitor_section->tearoff(), false, false);
+ _monitor_section->set_session (_session);
+ _monitor_section->tearoff().show_all ();
- /* no regular strip shown for control out */
+ _monitor_section->tearoff().Detach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_detached));
+ _monitor_section->tearoff().Attach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_attached));
- continue;
- }
+ monitor_section_attached ();
- strip = new MixerStrip (*this, _session, route);
- strips.push_back (strip);
+ route->DropReferences.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::monitor_section_going_away, this), gui_context());
- UIConfiguration::instance().get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
+ /* no regular strip shown for control out */
- if (strip->width_owner() != strip) {
- strip->set_width_enum (_strip_width, this);
- }
+ continue;
+ }
- show_strip (strip);
+ strip = new MixerStrip (*this, _session, route);
+ strips.push_back (strip);
- TreeModel::Row row = *(track_model->insert(insert_iter));
- row[track_columns.text] = route->name();
- row[track_columns.visible] = strip->route()->is_master() ? true : strip->marked_for_display();
- row[track_columns.route] = route;
- row[track_columns.strip] = strip;
+ UIConfiguration::instance().get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
- if (!from_scratch) {
- _selection.add (strip);
- }
+ if (strip->width_owner() != strip) {
+ strip->set_width_enum (_strip_width, this);
+ }
- route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
+ show_strip (strip);
- strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));
- strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
- }
+ if (!route->is_master()) {
+
+ TreeModel::Row row = *(track_model->insert (insert_iter));
+
+ row[stripable_columns.text] = route->name();
+ row[stripable_columns.visible] = strip->marked_for_display();
+ row[stripable_columns.stripable] = route;
+ row[stripable_columns.strip] = strip;
+
+ if (nroutes != 0) {
+ _selection.add (strip);
+ }
+
+ } else {
+
+ out_packer.pack_start (*strip, false, false);
+ strip->set_packed (true);
+ }
+
+ strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));
+ strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
+ }
- } catch (...) {
+ (*s)->presentation_info().PropertyChanged.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::stripable_property_changed, this, _1, boost::weak_ptr<Stripable>(*s)), gui_context());
+ (*s)->PropertyChanged.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::stripable_property_changed, this, _1, boost::weak_ptr<Stripable>(*s)), gui_context());
+ }
+
+ } catch (const std::exception& e) {
+ error << string_compose (_("Error adding GUI elements for new tracks/busses %1"), e.what()) << endmsg;
}
- no_track_list_redisplay = false;
track_display.set_model (track_model);
- sync_order_keys_from_treeview ();
+ if (!from_scratch) {
+ sync_presentation_info_from_treeview ();
+ }
+
redisplay_track_list ();
}
@@ -458,6 +645,16 @@ Mixer_UI::deselect_all_strip_processors ()
}
void
+Mixer_UI::select_strip (MixerStrip& ms, bool add)
+{
+ if (add) {
+ _selection.add (&ms);
+ } else {
+ _selection.set (&ms);
+ }
+}
+
+void
Mixer_UI::select_none ()
{
_selection.clear_routes();
@@ -490,7 +687,7 @@ Mixer_UI::remove_strip (MixerStrip* strip)
}
for (ri = rows.begin(); ri != rows.end(); ++ri) {
- if ((*ri)[track_columns.strip] == strip) {
+ if ((*ri)[stripable_columns.strip] == strip) {
PBD::Unwinder<bool> uw (_route_deletion_in_progress, true);
track_model->erase (ri);
break;
@@ -499,63 +696,7 @@ Mixer_UI::remove_strip (MixerStrip* strip)
}
void
-Mixer_UI::reset_remote_control_ids ()
-{
- if (Config->get_remote_model() == UserOrdered || !_session || _session->deletion_in_progress()) {
- return;
- }
-
- TreeModel::Children rows = track_model->children();
-
- if (rows.empty()) {
- return;
- }
-
- DEBUG_TRACE (DEBUG::OrderKeys, "mixer resets remote control ids after remote model change\n");
-
- TreeModel::Children::iterator ri;
- bool rid_change = false;
- uint32_t rid = 1;
- uint32_t invisible_key = UINT32_MAX;
-
- for (ri = rows.begin(); ri != rows.end(); ++ri) {
-
- /* skip two special values */
-
- if (rid == Route::MasterBusRemoteControlID) {
- rid++;
- }
-
- if (rid == Route::MonitorBusRemoteControlID) {
- rid++;
- }
-
- boost::shared_ptr<Route> route = (*ri)[track_columns.route];
- bool visible = (*ri)[track_columns.visible];
-
- if (!route->is_master() && !route->is_monitor()) {
-
- uint32_t new_rid = (visible ? rid : invisible_key--);
-
- if (new_rid != route->remote_control_id()) {
- route->set_remote_control_id_explicit (new_rid);
- rid_change = true;
- }
-
- if (visible) {
- rid++;
- }
- }
- }
-
- if (rid_change) {
- /* tell the world that we changed the remote control IDs */
- _session->notify_remote_id_change ();
- }
-}
-
-void
-Mixer_UI::sync_order_keys_from_treeview ()
+Mixer_UI::sync_presentation_info_from_treeview ()
{
if (ignore_reorder || !_session || _session->deletion_in_progress()) {
return;
@@ -567,63 +708,56 @@ Mixer_UI::sync_order_keys_from_treeview ()
return;
}
- DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync order keys from model\n");
+ DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync presentation info from treeview\n");
TreeModel::Children::iterator ri;
- bool changed = false;
- bool rid_change = false;
+ bool change = false;
uint32_t order = 0;
- uint32_t rid = 1;
- uint32_t invisible_key = UINT32_MAX;
for (ri = rows.begin(); ri != rows.end(); ++ri) {
- boost::shared_ptr<Route> route = (*ri)[track_columns.route];
- bool visible = (*ri)[track_columns.visible];
-
- uint32_t old_key = route->order_key ();
+ bool visible = (*ri)[stripable_columns.visible];
+ boost::shared_ptr<Stripable> stripable = (*ri)[stripable_columns.stripable];
- if (order != old_key) {
- route->set_order_key (order);
- changed = true;
+ if (!stripable) {
+ continue;
}
- if ((Config->get_remote_model() == MixerOrdered) && !route->is_master() && !route->is_monitor()) {
+ /* Monitor and Auditioner do not get their presentation
+ * info reset here.
+ */
- uint32_t new_rid = (visible ? rid : invisible_key--);
+ if (stripable->is_monitor() || stripable->is_auditioner()) {
+ continue;
+ }
- if (new_rid != route->remote_control_id()) {
- route->set_remote_control_id_explicit (new_rid);
- rid_change = true;
- }
+ /* Master also doesn't get set here but since the editor allows
+ * it to be reordered, we need to preserve its ordering.
+ */
- if (visible) {
- rid++;
- }
+ stripable->presentation_info().set_hidden (!visible);
+ if (order != stripable->presentation_info().order()) {
+ stripable->set_presentation_order (order, false);
+ change = true;
}
++order;
}
- if (changed) {
- /* tell everyone that we changed the mixer sort keys */
- _session->sync_order_keys ();
- }
-
- if (rid_change) {
- /* tell the world that we changed the remote control IDs */
- _session->notify_remote_id_change ();
+ if (change) {
+ DEBUG_TRACE (DEBUG::OrderKeys, "... notify PI change from mixer GUI\n");
+ _session->notify_presentation_info_change ();
}
}
void
-Mixer_UI::sync_treeview_from_order_keys ()
+Mixer_UI::sync_treeview_from_presentation_info ()
{
if (!_session || _session->deletion_in_progress()) {
return;
}
- DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync model from order keys.\n");
+ DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync model from presentation info.\n");
/* we could get here after either a change in the Mixer or Editor sort
* order, but either way, the mixer order keys reflect the intended
@@ -639,30 +773,27 @@ Mixer_UI::sync_treeview_from_order_keys ()
return;
}
- OrderKeySortedRoutes sorted_routes;
+ OrderingKeys sorted;
for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
- boost::shared_ptr<Route> route = (*ri)[track_columns.route];
- sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key ()));
+ boost::shared_ptr<Stripable> stripable = (*ri)[stripable_columns.stripable];
+ sorted.push_back (OrderKeys (old_order, stripable->presentation_info().order()));
}
SortByNewDisplayOrder cmp;
- sort (sorted_routes.begin(), sorted_routes.end(), cmp);
- neworder.assign (sorted_routes.size(), 0);
+ sort (sorted.begin(), sorted.end(), cmp);
+ neworder.assign (sorted.size(), 0);
uint32_t n = 0;
- for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
+ for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) {
neworder[n] = sr->old_display_order;
if (sr->old_display_order != n) {
changed = true;
}
-
- DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("MIXER change order for %1 from %2 to %3\n",
- sr->route->name(), sr->old_display_order, n));
}
if (changed) {
@@ -688,11 +819,11 @@ Mixer_UI::follow_editor_selection ()
_selection.clear_routes ();
for (TrackViewList::iterator i = s.begin(); i != s.end(); ++i) {
- RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
- if (rtav) {
- MixerStrip* ms = strip_by_route (rtav->route());
- if (ms) {
- _selection.add (ms);
+ TimeAxisView* tav = dynamic_cast<TimeAxisView*> (*i);
+ if (tav) {
+ AxisView* axis = axis_by_stripable (tav->stripable());
+ if (axis) {
+ _selection.add (axis);
}
}
}
@@ -703,9 +834,9 @@ Mixer_UI::follow_editor_selection ()
MixerStrip*
-Mixer_UI::strip_by_route (boost::shared_ptr<Route> r)
+Mixer_UI::strip_by_route (boost::shared_ptr<Route> r) const
{
- for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ for (list<MixerStrip *>::const_iterator i = strips.begin(); i != strips.end(); ++i) {
if ((*i)->route() == r) {
return (*i);
}
@@ -714,6 +845,18 @@ Mixer_UI::strip_by_route (boost::shared_ptr<Route> r)
return 0;
}
+AxisView*
+Mixer_UI::axis_by_stripable (boost::shared_ptr<Stripable> s) const
+{
+ for (list<MixerStrip *>::const_iterator i = strips.begin(); i != strips.end(); ++i) {
+ if ((*i)->stripable() == s) {
+ return (*i);
+ }
+ }
+
+ return 0;
+}
+
bool
Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
{
@@ -722,7 +865,7 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
/* primary-click: toggle selection state of strip */
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
_selection.remove (strip);
- } else if (_selection.routes.size() > 1) {
+ } else if (_selection.axes.size() > 1) {
/* de-select others */
_selection.set (strip);
}
@@ -731,53 +874,49 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
_selection.add (strip);
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::RangeSelectModifier)) {
- if (!_selection.selected(strip)) {
-
- /* extend selection */
-
- vector<MixerStrip*> tmp;
- bool accumulate = false;
- bool found_another = false;
-
- tmp.push_back (strip);
-
- for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
- if ((*i) == strip) {
- /* hit clicked strip, start accumulating till we hit the first
- selected strip
- */
- if (accumulate) {
- /* done */
- break;
- } else {
- accumulate = true;
- }
- } else if (_selection.selected (*i)) {
- /* hit selected strip. if currently accumulating others,
- we're done. if not accumulating others, start doing so.
- */
- found_another = true;
- if (accumulate) {
- /* done */
- break;
- } else {
- accumulate = true;
- }
+ /* extend selection */
+
+ vector<MixerStrip*> tmp;
+ bool accumulate = false;
+ bool found_another = false;
+
+ tmp.push_back (strip);
+
+ for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ if ((*i) == strip) {
+ /* hit clicked strip, start accumulating till we hit the first
+ selected strip
+ */
+ if (accumulate) {
+ /* done */
+ break;
} else {
- if (accumulate) {
- tmp.push_back (*i);
- }
+ accumulate = true;
}
- }
-
- if (found_another) {
- for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
- _selection.add (*i);
+ } else if (_selection.selected (*i)) {
+ /* hit selected strip. if currently accumulating others,
+ we're done. if not accumulating others, start doing so.
+ */
+ found_another = true;
+ if (accumulate) {
+ /* done */
+ break;
+ } else {
+ accumulate = true;
}
- } else
- _selection.set (strip); //user wants to start a range selection, but there aren't any others selected yet
+ } else {
+ if (accumulate) {
+ tmp.push_back (*i);
+ }
+ }
}
+ if (found_another) {
+ for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
+ _selection.add (*i);
+ }
+ } else
+ _selection.set (strip); //user wants to start a range selection, but there aren't any others selected yet
} else {
_selection.set (strip);
}
@@ -805,13 +944,13 @@ Mixer_UI::set_session (Session* sess)
refill_favorite_plugins();
XMLNode* node = ARDOUR_UI::instance()->mixer_settings();
- set_state (*node);
+ set_state (*node, 0);
update_title ();
initial_track_display ();
- _session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_strips, this, _1), gui_context());
+ _session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_routes, this, _1), gui_context());
_session->route_group_added.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_route_group, this, _1), gui_context());
_session->route_group_removed.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::route_groups_changed, this), gui_context());
_session->route_groups_reordered.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::route_groups_changed, this), gui_context());
@@ -819,6 +958,8 @@ Mixer_UI::set_session (Session* sess)
_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::update_title, this), gui_context());
_session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::update_title, this), gui_context());
+ _session->vca_manager().VCAAdded.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_masters, this, _1), gui_context());
+
Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::parameter_changed, this, _1), gui_context ());
route_groups_changed ();
@@ -871,13 +1012,12 @@ Mixer_UI::track_visibility_changed (std::string const & path)
TreeIter iter;
if ((iter = track_model->get_iter (path))) {
- MixerStrip* strip = (*iter)[track_columns.strip];
- if (strip) {
- bool visible = (*iter)[track_columns.visible];
- if (strip->set_marked_for_display (!visible)) {
- update_track_visibility ();
- }
+ AxisView* av = (*iter)[stripable_columns.strip];
+ bool visible = (*iter)[stripable_columns.visible];
+
+ if (av->set_marked_for_display (!visible)) {
+ update_track_visibility ();
}
}
}
@@ -892,14 +1032,14 @@ Mixer_UI::update_track_visibility ()
Unwinder<bool> uw (no_track_list_redisplay, true);
for (i = rows.begin(); i != rows.end(); ++i) {
- MixerStrip *strip = (*i)[track_columns.strip];
- (*i)[track_columns.visible] = strip->marked_for_display ();
+ AxisView* av = (*i)[stripable_columns.strip];
+ (*i)[stripable_columns.visible] = av->marked_for_display ();
}
- /* force route order keys catch up with visibility changes
+ /* force presentation catch up with visibility changes
*/
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
redisplay_track_list ();
@@ -913,10 +1053,12 @@ Mixer_UI::show_strip (MixerStrip* ms)
for (i = rows.begin(); i != rows.end(); ++i) {
- MixerStrip* strip = (*i)[track_columns.strip];
+ AxisView* av = (*i)[stripable_columns.strip];
+ MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
if (strip == ms) {
- (*i)[track_columns.visible] = true;
- redisplay_track_list ();
+ (*i)[stripable_columns.visible] = true;
+ av->set_marked_for_display (true);
+ update_track_visibility ();
break;
}
}
@@ -930,10 +1072,12 @@ Mixer_UI::hide_strip (MixerStrip* ms)
for (i = rows.begin(); i != rows.end(); ++i) {
- MixerStrip* strip = (*i)[track_columns.strip];
+ AxisView* av = (*i)[stripable_columns.strip];
+ MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
if (strip == ms) {
- (*i)[track_columns.visible] = false;
- redisplay_track_list ();
+ (*i)[stripable_columns.visible] = false;
+ av->set_marked_for_display (false);
+ update_track_visibility ();
break;
}
}
@@ -956,7 +1100,7 @@ Mixer_UI::stop_updating ()
void
Mixer_UI::fast_update_strips ()
{
- if (is_mapped () && _session) {
+ if (_content.is_mapped () && _session) {
for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
(*i)->fast_update ();
}
@@ -974,10 +1118,10 @@ Mixer_UI::set_all_strips_visibility (bool yn)
for (i = rows.begin(); i != rows.end(); ++i) {
- TreeModel::Row row = (*i);
- MixerStrip* strip = row[track_columns.strip];
+ AxisView* av = (*i)[stripable_columns.strip];
+ MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
- if (strip == 0) {
+ if (!strip) {
continue;
}
@@ -985,7 +1129,7 @@ Mixer_UI::set_all_strips_visibility (bool yn)
continue;
}
- (*i)[track_columns.visible] = yn;
+ (*i)[stripable_columns.visible] = yn;
}
}
@@ -1003,10 +1147,11 @@ Mixer_UI::set_all_audio_midi_visibility (int tracks, bool yn)
Unwinder<bool> uw (no_track_list_redisplay, true);
for (i = rows.begin(); i != rows.end(); ++i) {
- TreeModel::Row row = (*i);
- MixerStrip* strip = row[track_columns.strip];
- if (strip == 0) {
+ AxisView* av = (*i)[stripable_columns.strip];
+ MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
+
+ if (!strip) {
continue;
}
@@ -1019,24 +1164,24 @@ Mixer_UI::set_all_audio_midi_visibility (int tracks, bool yn)
switch (tracks) {
case 0:
- (*i)[track_columns.visible] = yn;
+ (*i)[stripable_columns.visible] = yn;
break;
case 1:
if (at) { /* track */
- (*i)[track_columns.visible] = yn;
+ (*i)[stripable_columns.visible] = yn;
}
break;
case 2:
if (!at && !mt) { /* bus */
- (*i)[track_columns.visible] = yn;
+ (*i)[stripable_columns.visible] = yn;
}
break;
case 3:
if (mt) { /* midi-track */
- (*i)[track_columns.visible] = yn;
+ (*i)[stripable_columns.visible] = yn;
}
break;
}
@@ -1091,12 +1236,11 @@ Mixer_UI::hide_all_miditracks ()
set_all_audio_midi_visibility (3, false);
}
-
void
Mixer_UI::track_list_reorder (const TreeModel::Path&, const TreeModel::iterator&, int* /*new_order*/)
{
DEBUG_TRACE (DEBUG::OrderKeys, "mixer UI treeview reordered\n");
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
}
void
@@ -1110,7 +1254,7 @@ Mixer_UI::track_list_delete (const Gtk::TreeModel::Path&)
*/
DEBUG_TRACE (DEBUG::OrderKeys, "mixer UI treeview row deleted\n");
- sync_order_keys_from_treeview ();
+ sync_presentation_info_from_treeview ();
if (_route_deletion_in_progress) {
redisplay_track_list ();
@@ -1118,86 +1262,153 @@ Mixer_UI::track_list_delete (const Gtk::TreeModel::Path&)
}
void
-Mixer_UI::redisplay_track_list ()
+Mixer_UI::spill_redisplay (boost::shared_ptr<VCA> vca)
{
TreeModel::Children rows = track_model->children();
- TreeModel::Children::iterator i;
-
- if (no_track_list_redisplay) {
- return;
- }
- for (i = rows.begin(); i != rows.end(); ++i) {
+ for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
- MixerStrip* strip = (*i)[track_columns.strip];
+ AxisView* av = (*i)[stripable_columns.strip];
+ MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
- if (strip == 0) {
+ if (!strip) {
/* we're in the middle of changing a row, don't worry */
continue;
}
- bool const visible = (*i)[track_columns.visible];
-
- if (visible) {
- strip->set_gui_property ("visible", true);
-
- if (strip->packed()) {
+ if (!strip->route()) {
+ /* non-route element */
+ continue;
+ }
- if (strip->route()->is_master() || strip->route()->is_monitor()) {
- out_packer.reorder_child (*strip, -1);
+ if (strip->route()->is_master() || strip->route()->is_monitor()) {
+ continue;
+ }
- } else {
- strip_packer.reorder_child (*strip, -1); /* put at end */
- }
+ if (strip->route()->slaved_to (vca)) {
+ if (strip->packed()) {
+ strip_packer.reorder_child (*strip, -1); /* put at end */
} else {
-
- if (strip->route()->is_master() || strip->route()->is_monitor()) {
- out_packer.pack_start (*strip, false, false);
- } else {
- strip_packer.pack_start (*strip, false, false);
- }
+ strip_packer.pack_start (*strip, false, false);
strip->set_packed (true);
}
} else {
- strip->set_gui_property ("visible", false);
-
- if (strip->route()->is_master() || strip->route()->is_monitor()) {
- /* do nothing, these cannot be hidden */
- } else {
- if (strip->packed()) {
- strip_packer.remove (*strip);
- strip->set_packed (false);
- }
+ if (strip->packed()) {
+ strip_packer.remove (*strip);
+ strip->set_packed (false);
}
}
}
-
- _group_tabs->set_dirty ();
}
void
-Mixer_UI::strip_width_changed ()
+Mixer_UI::redisplay_track_list ()
{
- _group_tabs->set_dirty ();
+ if (no_track_list_redisplay) {
+ return;
+ }
+
+ boost::shared_ptr<VCA> sv = spilled_vca.lock ();
+
+ if (sv) {
+ spill_redisplay (sv);
+ return;
+ }
-#ifdef GTKOSX
TreeModel::Children rows = track_model->children();
TreeModel::Children::iterator i;
- long order;
+ uint32_t n_masters = 0;
- for (order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
- MixerStrip* strip = (*i)[track_columns.strip];
+ container_clear (vca_hpacker);
+ vca_hpacker.pack_end (vca_scroller_base, true, true);
- if (strip == 0) {
+ for (i = rows.begin(); i != rows.end(); ++i) {
+
+ AxisView* s = (*i)[stripable_columns.strip];
+ bool const visible = (*i)[stripable_columns.visible];
+ boost::shared_ptr<Stripable> stripable = (*i)[stripable_columns.stripable];
+
+ if (!s) {
+ /* we're in the middle of changing a row, don't worry */
continue;
}
- bool visible = (*i)[track_columns.visible];
+ VCAMasterStrip* vms;
- if (visible) {
+ if ((vms = dynamic_cast<VCAMasterStrip*> (s))) {
+ if (visible) {
+ vca_hpacker.pack_start (*vms, false, false);
+ vms->show ();
+ n_masters++;
+ }
+ continue;
+ }
+
+ MixerStrip* strip = dynamic_cast<MixerStrip*> (s);
+
+ if (!strip) {
+ continue;
+ }
+
+ if (visible) {
+
+ if (strip->packed()) {
+ strip_packer.reorder_child (*strip, -1); /* put at end */
+ } else {
+ strip_packer.pack_start (*strip, false, false);
+ strip->set_packed (true);
+ }
+
+ } else {
+
+ if (stripable->is_master() || stripable->is_monitor()) {
+ /* do nothing, these cannot be hidden */
+ } else {
+ if (strip->packed()) {
+ strip_packer.remove (*strip);
+ strip->set_packed (false);
+ }
+ }
+ }
+ }
+
+ /* update visibility of VCA assign buttons */
+
+ if (n_masters == 0) {
+ UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::remove_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA")));
+ vca_vpacker.hide ();
+ } else {
+ UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::add_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA")));
+ vca_vpacker.show ();
+ }
+
+ _group_tabs->set_dirty ();
+}
+
+void
+Mixer_UI::strip_width_changed ()
+{
+ _group_tabs->set_dirty ();
+
+#ifdef __APPLE__
+ TreeModel::Children rows = track_model->children();
+ TreeModel::Children::iterator i;
+ long order;
+
+ for (order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
+ AxisView* av = (*i)[stripable_columns.strip];
+ MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
+
+ if (strip == 0) {
+ continue;
+ }
+
+ bool visible = (*i)[stripable_columns.visible];
+
+ if (visible) {
strip->queue_draw();
}
}
@@ -1205,25 +1416,50 @@ Mixer_UI::strip_width_changed ()
}
+struct PresentationInfoMixerSorter
+{
+ bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
+ if (a->is_master()) {
+ /* master after everything else */
+ return false;
+ } else if (b->is_master()) {
+ /* everything else before master */
+ return true;
+ }
+ return a->presentation_info().order () < b->presentation_info().order ();
+ }
+};
+
void
Mixer_UI::initial_track_display ()
{
+ StripableList sl;
+
boost::shared_ptr<RouteList> routes = _session->get_routes();
- RouteList copy (*routes);
- ARDOUR::SignalOrderRouteSorter sorter;
- copy.sort (sorter);
+ for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
+ sl.push_back (*r);
+ }
+
+ VCAList vcas = _session->vca_manager().vcas();
+
+ for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ sl.push_back (boost::dynamic_pointer_cast<Stripable> (*v));
+ }
+
+ sl.sort (PresentationInfoMixerSorter());
{
+ /* These are also used inside ::add_stripables() but we need
+ * them here because we're going to clear the track_model also.
+ */
Unwinder<bool> uw1 (no_track_list_redisplay, true);
Unwinder<bool> uw2 (ignore_reorder, true);
track_model->clear ();
- add_strips (copy);
+ add_stripables (sl);
}
- _session->sync_order_keys ();
-
redisplay_track_list ();
}
@@ -1270,20 +1506,35 @@ Mixer_UI::build_track_menu ()
}
void
-Mixer_UI::strip_property_changed (const PropertyChange& what_changed, MixerStrip* mx)
+Mixer_UI::stripable_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Stripable> ws)
{
- if (!what_changed.contains (ARDOUR::Properties::name)) {
+ if (!what_changed.contains (ARDOUR::Properties::hidden) && !what_changed.contains (ARDOUR::Properties::name)) {
return;
}
- ENSURE_GUI_THREAD (*this, &Mixer_UI::strip_name_changed, what_changed, mx)
+ boost::shared_ptr<Stripable> s = ws.lock ();
+
+ if (!s) {
+ return;
+ }
TreeModel::Children rows = track_model->children();
TreeModel::Children::iterator i;
for (i = rows.begin(); i != rows.end(); ++i) {
- if ((*i)[track_columns.strip] == mx) {
- (*i)[track_columns.text] = mx->route()->name();
+ boost::shared_ptr<Stripable> ss = (*i)[stripable_columns.stripable];
+
+ if (s == ss) {
+
+ if (what_changed.contains (ARDOUR::Properties::name)) {
+ (*i)[stripable_columns.text] = s->name();
+ }
+
+ if (what_changed.contains (ARDOUR::Properties::hidden)) {
+ (*i)[stripable_columns.visible] = !s->presentation_info().hidden();
+ redisplay_track_list ();
+ }
+
return;
}
}
@@ -1318,11 +1569,11 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
}
switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) {
- case 0:
+ case 1:
if (Keyboard::is_edit_event (ev)) {
if (group) {
// edit_route_group (group);
-#ifdef GTKOSX
+#ifdef __APPLE__
group_display.queue_draw();
#endif
return true;
@@ -1330,11 +1581,11 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
}
break;
- case 1:
+ case 0:
{
bool visible = (*iter)[group_columns.visible];
(*iter)[group_columns.visible] = !visible;
-#ifdef GTKOSX
+#ifdef __APPLE__
group_display.queue_draw();
#endif
return true;
@@ -1396,9 +1647,7 @@ Mixer_UI::route_groups_changed ()
void
Mixer_UI::new_route_group ()
{
- RouteList rl;
-
- _group_tabs->run_new_group_dialog (rl);
+ _group_tabs->run_new_group_dialog (0, false);
}
void
@@ -1479,15 +1728,10 @@ Mixer_UI::show_mixer_list (bool yn)
{
if (yn) {
list_vpacker.show ();
-
- //if user wants to show the pane, we should make sure that it is wide enough to be visible
- int width = list_hpane.get_position();
- if (width < 40)
- list_hpane.set_position(40);
} else {
list_vpacker.hide ();
}
-
+
_show_mixer_list = yn;
}
@@ -1601,7 +1845,7 @@ Mixer_UI::add_route_group (RouteGroup* group)
if (focus) {
TreeViewColumn* col = group_display.get_column (0);
- CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (0));
+ CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (1));
group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true);
}
@@ -1616,7 +1860,7 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
using namespace Menu_Helpers;
if (Keyboard::is_context_menu_event (ev)) {
- ARDOUR_UI::instance()->add_route (this);
+ ARDOUR_UI::instance()->add_route ();
return true;
}
@@ -1624,29 +1868,48 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
}
void
-Mixer_UI::set_strip_width (Width w, bool save)
+Mixer_UI::scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const Gtk::SelectionData& data, guint info, guint time)
{
- _strip_width = w;
+ printf ("Mixer_UI::scroller_drag_data_received\n");
+ if (data.get_target() != "PluginFavoritePtr") {
+ context->drag_finish (false, false, time);
+ return;
+ }
- for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
- (*i)->set_width_enum (w, save ? (*i)->width_owner() : this);
+ const void * d = data.get_data();
+ const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>* tv = reinterpret_cast<const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>*>(d);
+
+ PluginPresetList nfos;
+ TreeView* source;
+ tv->get_object_drag_data (nfos, &source);
+
+ Route::ProcessorList pl;
+ bool ok = false;
+
+ for (list<PluginPresetPtr>::const_iterator i = nfos.begin(); i != nfos.end(); ++i) {
+ PluginPresetPtr ppp = (*i);
+ PluginInfoPtr pip = ppp->_pip;
+ if (!pip->is_instrument ()) {
+ continue;
+ }
+ ARDOUR_UI::instance()->session_add_midi_track ((RouteGroup*) 0, 1, _("MIDI"), Config->get_strict_io (), pip, ppp->_preset.valid ? &ppp->_preset : 0, PresentationInfo::max_order);
+ ok = true;
}
-}
-void
-Mixer_UI::set_window_pos_and_size ()
-{
- resize (m_width, m_height);
- move (m_root_x, m_root_y);
+ context->drag_finish (ok, false, time);
}
void
-Mixer_UI::get_window_pos_and_size ()
+Mixer_UI::set_strip_width (Width w, bool save)
{
- get_position(m_root_x, m_root_y);
- get_size(m_width, m_height);
+ _strip_width = w;
+
+ for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ (*i)->set_width_enum (w, save ? (*i)->width_owner() : this);
+ }
}
+
struct PluginStateSorter {
public:
bool operator() (PluginInfoPtr a, PluginInfoPtr b) const {
@@ -1670,49 +1933,12 @@ private:
};
int
-Mixer_UI::set_state (const XMLNode& node)
+Mixer_UI::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
- XMLNode* geometry;
-
- m_width = default_width;
- m_height = default_height;
- m_root_x = 1;
- m_root_y = 1;
+ XMLProperty const * prop;
+ LocaleGuard lg;
- if ((geometry = find_named_node (node, "geometry")) != 0) {
-
- XMLProperty* prop;
-
- if ((prop = geometry->property("x_size")) == 0) {
- prop = geometry->property ("x-size");
- }
- if (prop) {
- m_width = atoi(prop->value());
- }
- if ((prop = geometry->property("y_size")) == 0) {
- prop = geometry->property ("y-size");
- }
- if (prop) {
- m_height = atoi(prop->value());
- }
-
- if ((prop = geometry->property ("x_pos")) == 0) {
- prop = geometry->property ("x-pos");
- }
- if (prop) {
- m_root_x = atoi (prop->value());
-
- }
- if ((prop = geometry->property ("y_pos")) == 0) {
- prop = geometry->property ("y-pos");
- }
- if (prop) {
- m_root_y = atoi (prop->value());
- }
- }
-
- set_window_pos_and_size ();
+ Tabbable::set_state (node, version);
if ((prop = node.property ("narrow-strips"))) {
if (string_is_affirmative (prop->value())) {
@@ -1735,8 +1961,7 @@ Mixer_UI::set_state (const XMLNode& node)
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
bool fs = tact && tact->get_active();
if (yn ^ fs) {
- ActionManager::do_action ("Common",
- "ToggleMaximalMixer");
+ ActionManager::do_action ("Common", "ToggleMaximalMixer");
}
}
@@ -1771,142 +1996,49 @@ Mixer_UI::set_state (const XMLNode& node)
favorite_order.sort (cmp);
sync_treeview_from_favorite_order ();
}
-
return 0;
}
XMLNode&
-Mixer_UI::get_state (void)
+Mixer_UI::get_state ()
{
- XMLNode* node = new XMLNode ("Mixer");
-
- if (is_realized()) {
- Glib::RefPtr<Gdk::Window> win = get_window();
+ XMLNode* node = new XMLNode (X_("Mixer"));
+ char buf[128];
+ LocaleGuard lg;
- get_window_pos_and_size ();
+ node->add_child_nocopy (Tabbable::get_state());
- XMLNode* geometry = new XMLNode ("geometry");
- char buf[32];
- snprintf(buf, sizeof(buf), "%d", m_width);
- geometry->add_property(X_("x_size"), string(buf));
- snprintf(buf, sizeof(buf), "%d", m_height);
- geometry->add_property(X_("y_size"), string(buf));
- snprintf(buf, sizeof(buf), "%d", m_root_x);
- geometry->add_property(X_("x_pos"), string(buf));
- snprintf(buf, sizeof(buf), "%d", m_root_y);
- geometry->add_property(X_("y_pos"), string(buf));
-
- // written only for compatibility, they are not used.
- snprintf(buf, sizeof(buf), "%d", 0);
- geometry->add_property(X_("x_off"), string(buf));
- snprintf(buf, sizeof(buf), "%d", 0);
- geometry->add_property(X_("y_off"), string(buf));
-
- snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&rhs_pane1)->gobj()));
- geometry->add_property(X_("mixer_rhs_pane1_pos"), string(buf));
- snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&rhs_pane2)->gobj()));
- geometry->add_property(X_("mixer_rhs_pane2_pos"), string(buf));
- snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&list_hpane)->gobj()));
- geometry->add_property(X_("mixer_list_hpane_pos"), string(buf));
-
- node->add_child_nocopy (*geometry);
- }
+ snprintf(buf,sizeof(buf), "%f", rhs_pane1.get_divider());
+ node->add_property(X_("mixer-rhs-pane1-pos"), string(buf));
+ snprintf(buf,sizeof(buf), "%f", rhs_pane2.get_divider());
+ node->add_property(X_("mixer-rhs_pane2-pos"), string(buf));
+ snprintf(buf,sizeof(buf), "%f", list_hpane.get_divider());
+ node->add_property(X_("mixer-list-hpane-pos"), string(buf));
+ snprintf(buf,sizeof(buf), "%f", inner_pane.get_divider());
+ node->add_property(X_("mixer-inner-pane-pos"), string(buf));
node->add_property ("narrow-strips", _strip_width == Narrow ? "yes" : "no");
-
node->add_property ("show-mixer", _visible ? "yes" : "no");
-
node->add_property ("show-mixer-list", _show_mixer_list ? "yes" : "no");
-
node->add_property ("maximised", _maximised ? "yes" : "no");
store_current_favorite_order ();
XMLNode* plugin_order = new XMLNode ("PluginOrder");
int cnt = 0;
for (PluginInfoList::const_iterator i = favorite_order.begin(); i != favorite_order.end(); ++i, ++cnt) {
- XMLNode* p = new XMLNode ("PluginInfo");
- p->add_property ("sort", cnt);
- p->add_property ("unique-id", (*i)->unique_id);
- if (favorite_ui_state.find ((*i)->unique_id) != favorite_ui_state.end ()) {
- p->add_property ("expanded", favorite_ui_state[(*i)->unique_id]);
- }
- plugin_order->add_child_nocopy (*p);
- ;
+ XMLNode* p = new XMLNode ("PluginInfo");
+ p->add_property ("sort", cnt);
+ p->add_property ("unique-id", (*i)->unique_id);
+ if (favorite_ui_state.find ((*i)->unique_id) != favorite_ui_state.end ()) {
+ p->add_property ("expanded", favorite_ui_state[(*i)->unique_id]);
+ }
+ plugin_order->add_child_nocopy (*p);
}
node->add_child_nocopy (*plugin_order);
+
return *node;
}
-
-void
-Mixer_UI::pane_allocation_handler (Allocation&, Gtk::Paned* which)
-{
- int pos;
- XMLProperty* prop = 0;
- XMLNode* node = ARDOUR_UI::instance()->mixer_settings();
- XMLNode* geometry;
- int height;
- static int32_t done[3] = { 0, 0, 0 };
-
- height = default_height;
-
- if ((geometry = find_named_node (*node, "geometry")) != 0) {
-
- if ((prop = geometry->property ("y_size")) == 0) {
- prop = geometry->property ("y-size");
- }
- if (prop) {
- height = atoi (prop->value());
- }
- }
-
- if (which == static_cast<Gtk::Paned*> (&rhs_pane1)) {
-
- if (done[0]) {
- return;
- }
-
- if (!geometry || (prop = geometry->property("mixer-rhs-pane1-pos")) == 0) {
- pos = height / 3;
- } else {
- pos = atoi (prop->value());
- }
-
- if ((done[0] = GTK_WIDGET(rhs_pane1.gobj())->allocation.height > pos)) {
- rhs_pane1.set_position (pos);
- }
-
- } else if (which == static_cast<Gtk::Paned*> (&rhs_pane2)) {
- if (done[1]) {
- return;
- }
-
- if (!geometry || (prop = geometry->property("mixer-rhs-pane2-pos")) == 0) {
- pos = 2 * height / 3;
- } else {
- pos = atoi (prop->value());
- }
-
- if ((done[1] = GTK_WIDGET(rhs_pane2.gobj())->allocation.height > pos)) {
- rhs_pane2.set_position (pos);
- }
- } else if (which == static_cast<Gtk::Paned*> (&list_hpane)) {
-
- if (done[2]) {
- return;
- }
-
- if (!geometry || (prop = geometry->property("mixer-list-hpane-pos")) == 0) {
- pos = std::max ((float)100, rintf ((float) 125 * UIConfiguration::instance().get_ui_scale()));
- } else {
- pos = max (36, atoi (prop->value ()));
- }
-
- if ((done[2] = GTK_WIDGET(list_hpane.gobj())->allocation.width > pos)) {
- list_hpane.set_position (pos);
- }
- }
-}
void
Mixer_UI::scroll_left ()
{
@@ -1926,44 +2058,6 @@ Mixer_UI::scroll_right ()
}
bool
-Mixer_UI::on_key_press_event (GdkEventKey* ev)
-{
- /* focus widget gets first shot, then bindings, otherwise
- forward to main window
- */
-
- if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
- return true;
- }
-
- KeyboardKey k (ev->state, ev->keyval);
-
- if (bindings.activate (k, Bindings::Press)) {
- return true;
- }
-
- return forward_key_press (ev);
-}
-
-bool
-Mixer_UI::on_key_release_event (GdkEventKey* ev)
-{
- if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
- return true;
- }
-
- KeyboardKey k (ev->state, ev->keyval);
-
- if (bindings.activate (k, Bindings::Release)) {
- return true;
- }
-
- /* don't forward releases */
-
- return true;
-}
-
-bool
Mixer_UI::on_scroll_event (GdkEventScroll* ev)
{
switch (ev->direction) {
@@ -2008,8 +2102,6 @@ Mixer_UI::parameter_changed (string const & p)
for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
(*i)->set_width_enum (s ? Narrow : Wide, this);
}
- } else if (p == "remote-model") {
- reset_remote_control_ids ();
} else if (p == "use-monitor-bus") {
if (_session && !_session->monitor_out()) {
monitor_section_detached ();
@@ -2037,15 +2129,15 @@ Mixer_UI::plugin_selector()
void
Mixer_UI::setup_track_display ()
{
- track_model = ListStore::create (track_columns);
+ track_model = ListStore::create (stripable_columns);
track_display.set_model (track_model);
- track_display.append_column (_("Strips"), track_columns.text);
- track_display.append_column (_("Show"), track_columns.visible);
+ track_display.append_column (_("Show"), stripable_columns.visible);
+ track_display.append_column (_("Strips"), stripable_columns.text);
track_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
track_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
- track_display.get_column (0)->set_expand(true);
- track_display.get_column (1)->set_expand(false);
- track_display.get_column (0)->set_sizing (Gtk::TREE_VIEW_COLUMN_FIXED);
+ track_display.get_column (0)->set_expand(false);
+ track_display.get_column (1)->set_expand(true);
+ track_display.get_column (1)->set_sizing (Gtk::TREE_VIEW_COLUMN_FIXED);
track_display.set_name (X_("EditGroupList"));
track_display.get_selection()->set_mode (Gtk::SELECTION_NONE);
track_display.set_reorderable (true);
@@ -2055,7 +2147,7 @@ Mixer_UI::setup_track_display ()
track_model->signal_row_deleted().connect (sigc::mem_fun (*this, &Mixer_UI::track_list_delete));
track_model->signal_rows_reordered().connect (sigc::mem_fun (*this, &Mixer_UI::track_list_reorder));
- CellRendererToggle* track_list_visible_cell = dynamic_cast<CellRendererToggle*>(track_display.get_column_cell_renderer (1));
+ CellRendererToggle* track_list_visible_cell = dynamic_cast<CellRendererToggle*>(track_display.get_column_cell_renderer (0));
track_list_visible_cell->property_activatable() = true;
track_list_visible_cell->property_radio() = false;
track_list_visible_cell->signal_toggled().connect (sigc::mem_fun (*this, &Mixer_UI::track_visibility_changed));
@@ -2091,13 +2183,16 @@ Mixer_UI::setup_track_display ()
void
Mixer_UI::new_track_or_bus ()
{
- ARDOUR_UI::instance()->add_route (this);
+ ARDOUR_UI::instance()->add_route ();
}
-
void
Mixer_UI::update_title ()
{
+ if (!own_window()) {
+ return;
+ }
+
if (_session) {
string n;
@@ -2114,13 +2209,13 @@ Mixer_UI::update_title ()
WindowTitle title (n);
title += S_("Window|Mixer");
title += Glib::get_application_name ();
- set_title (title.get_string());
+ own_window()->set_title (title.get_string());
} else {
WindowTitle title (S_("Window|Mixer"));
title += Glib::get_application_name ();
- set_title (title.get_string());
+ own_window()->set_title (title.get_string());
}
}
@@ -2130,7 +2225,7 @@ Mixer_UI::strip_by_x (int x)
for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
int x1, x2, y;
- (*i)->translate_coordinates (*this, 0, 0, x1, y);
+ (*i)->translate_coordinates (_content, 0, 0, x1, y);
x2 = x1 + (*i)->get_width();
if (x >= x1 && x <= x2) {
@@ -2142,12 +2237,12 @@ Mixer_UI::strip_by_x (int x)
}
void
-Mixer_UI::set_route_targets_for_operation ()
+Mixer_UI::set_axis_targets_for_operation ()
{
- _route_targets.clear ();
+ _axis_targets.clear ();
if (!_selection.empty()) {
- _route_targets = _selection.routes;
+ _axis_targets = _selection.axes;
return;
}
@@ -2173,13 +2268,13 @@ Mixer_UI::toggle_midi_input_active (bool flip_others)
boost::shared_ptr<RouteList> rl (new RouteList);
bool onoff = false;
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- for (RouteUISelection::iterator r = _route_targets.begin(); r != _route_targets.end(); ++r) {
- boost::shared_ptr<MidiTrack> mt = (*r)->midi_track();
+ for (AxisViewSelection::iterator r = _axis_targets.begin(); r != _axis_targets.end(); ++r) {
+ boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> ((*r)->stripable());
if (mt) {
- rl->push_back ((*r)->route());
+ rl->push_back (mt);
onoff = !mt->input_active();
}
}
@@ -2190,24 +2285,30 @@ Mixer_UI::toggle_midi_input_active (bool flip_others)
void
Mixer_UI::maximise_mixer_space ()
{
- if (_maximised) {
+ if (!own_window()) {
return;
}
- fullscreen ();
+ if (_maximised) {
+ return;
+ }
+ _window->fullscreen ();
_maximised = true;
}
void
Mixer_UI::restore_mixer_space ()
{
- if (!_maximised) {
+ if (!own_window()) {
return;
}
- unfullscreen();
+ if (!_maximised) {
+ return;
+ }
+ own_window()->unfullscreen();
_maximised = false;
}
@@ -2307,6 +2408,7 @@ Mixer_UI::refill_favorite_plugins ()
refiller (plugs, mgr.au_plugin_info ());
#endif
refiller (plugs, mgr.ladspa_plugin_info ());
+ refiller (plugs, mgr.lua_plugin_info ());
store_current_favorite_order ();
@@ -2373,7 +2475,7 @@ Mixer_UI::popup_note_context_menu (GdkEventButton *ev)
Gtk::Menu* m = manage (new Menu);
MenuList& items = m->items ();
- if (_selection.routes.empty()) {
+ if (_selection.axes.empty()) {
items.push_back (MenuElem (_("No Track/Bus is selected.")));
} else {
items.push_back (MenuElem (_("Add at the top"),
@@ -2490,17 +2592,23 @@ Mixer_UI::plugin_row_activated (const TreeModel::Path& path, TreeViewColumn* col
void
Mixer_UI::add_favorite_processor (ARDOUR::PluginPresetPtr ppp, ProcessorPosition pos)
{
- if (!_session || _selection.routes.empty()) {
+ if (!_session || _selection.axes.empty()) {
return;
}
PluginInfoPtr pip = ppp->_pip;
- for (RouteUISelection::iterator i = _selection.routes.begin(); i != _selection.routes.end(); ++i) {
- boost::shared_ptr<ARDOUR::Route> rt = (*i)->route();
- if (!rt) { continue; }
+ for (AxisViewSelection::iterator i = _selection.axes.begin(); i != _selection.axes.end(); ++i) {
+ boost::shared_ptr<ARDOUR::Route> rt = boost::dynamic_pointer_cast<ARDOUR::Route> ((*i)->stripable());
+
+ if (!rt) {
+ continue;
+ }
PluginPtr p = pip->load (*_session);
- if (!p) { continue; }
+
+ if (!p) {
+ continue;
+ }
if (ppp->_preset.valid) {
p->load_preset (ppp->_preset);
@@ -2519,13 +2627,22 @@ Mixer_UI::add_favorite_processor (ARDOUR::PluginPresetPtr ppp, ProcessorPosition
case AddPostFader:
{
int idx = 0;
+ int pos = 0;
for (;;++idx) {
boost::shared_ptr<Processor> np = rt->nth_processor (idx);
- if (!np || boost::dynamic_pointer_cast<Amp> (np)) {
+ if (!np) {
+ break;
+ }
+ if (!np->display_to_user()) {
+ continue;
+ }
+ if (boost::dynamic_pointer_cast<Amp> (np) && // Fader, not Trim
+ boost::dynamic_pointer_cast<Amp> (np)->gain_control()->parameter().type() == GainAutomation) {
break;
}
+ ++pos;
}
- rt->add_processor_by_index (processor, ++idx, &err, Config->get_new_plugins_active ());
+ rt->add_processor_by_index (processor, ++pos, &err, Config->get_new_plugins_active ());
}
break;
case AddBottom:
@@ -2577,3 +2694,262 @@ Mixer_UI::plugin_drop (const Glib::RefPtr<Gdk::DragContext>&, const Gtk::Selecti
manager.set_status (ppp->_pip->type, ppp->_pip->unique_id, status);
manager.save_statuses ();
}
+
+void
+Mixer_UI::do_vca_assign (boost::shared_ptr<VCA> vca)
+{
+ /* call protected MixerActor:: method */
+ vca_assign (vca);
+}
+
+void
+Mixer_UI::do_vca_unassign (boost::shared_ptr<VCA> vca)
+{
+ /* call protected MixerActor:: method */
+ vca_unassign (vca);
+}
+
+void
+Mixer_UI::show_vca_slaves (boost::shared_ptr<VCA> vca)
+{
+ boost::shared_ptr<VCA> v = spilled_vca.lock();
+ if (v != vca) {
+ spilled_vca = vca;
+ show_vca_change (vca); /* EMIT SIGNAL */
+ if (vca) {
+ _group_tabs->hide ();
+ } else {
+ _group_tabs->show ();
+ }
+ redisplay_track_list ();
+ }
+}
+
+bool
+Mixer_UI::showing_vca_slaves_for (boost::shared_ptr<VCA> vca) const
+{
+ return vca == spilled_vca.lock();
+}
+
+void
+Mixer_UI::register_actions ()
+{
+ Glib::RefPtr<ActionGroup> group = myactions.create_action_group (X_("Mixer"));
+
+ myactions.register_action (group, "solo", _("Toggle Solo on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::solo_action));
+ myactions.register_action (group, "mute", _("Toggle Mute on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::mute_action));
+ myactions.register_action (group, "recenable", _("Toggle Rec-enable on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::rec_enable_action));
+ myactions.register_action (group, "increment-gain", _("Decrease Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::step_gain_up_action));
+ myactions.register_action (group, "decrement-gain", _("Increase Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::step_gain_down_action));
+ myactions.register_action (group, "unity-gain", _("Set Gain to 0dB on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::unity_gain_action));
+
+
+ myactions.register_action (group, "copy-processors", _("Copy Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::copy_processors));
+ myactions.register_action (group, "cut-processors", _("Cut Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::cut_processors));
+ myactions.register_action (group, "paste-processors", _("Paste Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::paste_processors));
+ myactions.register_action (group, "delete-processors", _("Delete Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::delete_processors));
+ myactions.register_action (group, "select-all-processors", _("Select All (visible) Processors"), sigc::mem_fun (*this, &Mixer_UI::select_all_processors));
+ myactions.register_action (group, "toggle-processors", _("Toggle Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::toggle_processors));
+ myactions.register_action (group, "ab-plugins", _("Toggle Selected Plugins"), sigc::mem_fun (*this, &Mixer_UI::ab_plugins));
+ myactions.register_action (group, "select-none", _("Deselect all strips and processors"), sigc::mem_fun (*this, &Mixer_UI::select_none));
+
+ myactions.register_action (group, "scroll-left", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &Mixer_UI::scroll_left));
+ myactions.register_action (group, "scroll-right", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &Mixer_UI::scroll_right));
+
+ myactions.register_action (group, "toggle-midi-input-active", _("Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"),
+ sigc::bind (sigc::mem_fun (*this, &Mixer_UI::toggle_midi_input_active), false));
+}
+
+void
+Mixer_UI::load_bindings ()
+{
+ bindings = Bindings::get_bindings (X_("Mixer"), myactions);
+}
+
+template<class T> void
+Mixer_UI::control_action (boost::shared_ptr<T> (Stripable::*get_control)() const)
+{
+ boost::shared_ptr<ControlList> cl (new ControlList);
+ boost::shared_ptr<AutomationControl> ac;
+ bool val = false;
+ bool have_val = false;
+
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ boost::shared_ptr<Stripable> s = r->stripable();
+ if (s) {
+ ac = (s.get()->*get_control)();
+ if (ac) {
+ cl->push_back (ac);
+ if (!have_val) {
+ val = !ac->get_value();
+ have_val = true;
+ }
+ }
+ }
+ }
+
+ _session->set_controls (cl, val, Controllable::UseGroup);
+}
+
+void
+Mixer_UI::solo_action ()
+{
+ control_action (&Stripable::solo_control);
+}
+
+void
+Mixer_UI::mute_action ()
+{
+ control_action (&Stripable::mute_control);
+}
+
+void
+Mixer_UI::rec_enable_action ()
+{
+ control_action (&Stripable::rec_enable_control);
+}
+
+void
+Mixer_UI::step_gain_up_action ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->step_gain_up ();
+ }
+ }
+}
+
+void
+Mixer_UI::step_gain_down_action ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->step_gain_down ();
+ }
+ }
+}
+
+void
+Mixer_UI::unity_gain_action ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ boost::shared_ptr<Stripable> s = r->stripable();
+ if (s) {
+ boost::shared_ptr<AutomationControl> ac = s->gain_control();
+ if (ac) {
+ ac->set_value (1.0, Controllable::UseGroup);
+ }
+ }
+ }
+}
+
+void
+Mixer_UI::copy_processors ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->copy_processors ();
+ }
+ }
+}
+void
+Mixer_UI::cut_processors ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->cut_processors ();
+ }
+ }
+}
+void
+Mixer_UI::paste_processors ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->paste_processors ();
+ }
+ }
+}
+void
+Mixer_UI::select_all_processors ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->select_all_processors ();
+ }
+ }
+}
+void
+Mixer_UI::toggle_processors ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->toggle_processors ();
+ }
+ }
+}
+void
+Mixer_UI::ab_plugins ()
+{
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->ab_plugins ();
+ }
+ }
+}
+
+void
+Mixer_UI::vca_assign (boost::shared_ptr<VCA> vca)
+{
+ set_axis_targets_for_operation ();
+#if 0
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->vca_assign (vca);
+ }
+ }
+#endif
+}
+
+void
+Mixer_UI::vca_unassign (boost::shared_ptr<VCA> vca)
+{
+ set_axis_targets_for_operation ();
+#if 0
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ if (ms) {
+ ms->vca_unassign (vca);
+ }
+ }
+#endif
+}
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index a909228..a85006a 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -28,7 +28,6 @@
#include <gtkmm/label.h>
#include <gtkmm/button.h>
#include <gtkmm/frame.h>
-#include <gtkmm/paned.h>
#include <gtkmm/menu.h>
#include <gtkmm/treeview.h>
#include <gtkmm/liststore.h>
@@ -42,22 +41,27 @@
#include "ardour/plugin.h"
#include "ardour/plugin_manager.h"
-#include "gtkmm2ext/visibility_tracker.h"
+#include <gtkmm2ext/bindings.h>
#include "gtkmm2ext/dndtreeview.h"
+#include <gtkmm2ext/pane.h>
+#include "gtkmm2ext/tabbable.h"
#include "gtkmm2ext/treeutils.h"
#include "enums.h"
-#include "mixer_actor.h"
+#include "route_processor_selection.h"
namespace ARDOUR {
class Route;
class RouteGroup;
+ class VCA;
};
+class AxisView;
class MixerStrip;
class PluginSelector;
class MixerGroupTabs;
class MonitorSection;
+class VCAMasterStrip;
class PluginTreeStore : public Gtk::TreeStore
{
@@ -72,12 +76,15 @@ protected:
virtual bool row_drop_possible_vfunc (const Gtk::TreeModel::Path&, const Gtk::SelectionData&) const;
};
-class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr, public MixerActor, public Gtkmm2ext::VisibilityTracker
+class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
{
public:
static Mixer_UI* instance();
~Mixer_UI();
+ Gtk::Window* use_own_window (bool and_fill_it);
+ void show_window ();
+
void set_session (ARDOUR::Session *);
void track_editor_selection ();
@@ -86,88 +93,99 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
void set_strip_width (Width, bool save = false);
Width get_strip_width () const { return _strip_width; }
- void unselect_strip_in_display (MixerStrip*);
- void select_strip_in_display (MixerStrip*);
-
- XMLNode& get_state (void);
- int set_state (const XMLNode& );
+ XMLNode& get_state ();
+ int set_state (const XMLNode&, int /* version */);
void show_mixer_list (bool yn);
void show_monitor_section (bool);
-
- void show_window ();
- bool hide_window (GdkEventAny *ev);
+
void show_strip (MixerStrip *);
void hide_strip (MixerStrip *);
void maximise_mixer_space();
void restore_mixer_space();
- void ensure_float (Gtk::Window&);
-
MonitorSection* monitor_section() const { return _monitor_section; }
void deselect_all_strip_processors();
void delete_processors();
-
+ void select_strip (MixerStrip&, bool add=false);
void select_none ();
+ bool window_not_visible () const;
+
+ void do_vca_assign (boost::shared_ptr<ARDOUR::VCA>);
+ void do_vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
+ void show_vca_slaves (boost::shared_ptr<ARDOUR::VCA>);
+ bool showing_vca_slaves_for (boost::shared_ptr<ARDOUR::VCA>) const;
+
+ sigc::signal1<void,boost::shared_ptr<ARDOUR::VCA> > show_vca_change;
+
+ RouteProcessorSelection& selection() { return _selection; }
+ void register_actions ();
+
+ void load_bindings ();
+ Gtkmm2ext::Bindings* bindings;
+
protected:
- void set_route_targets_for_operation ();
+ void set_axis_targets_for_operation ();
private:
Mixer_UI ();
- static Mixer_UI* _instance;
-
- bool _visible;
-
- Gtk::HBox global_hpacker;
- Gtk::VBox global_vpacker;
- Gtk::ScrolledWindow scroller;
- Gtk::EventBox scroller_base;
- Gtk::HBox scroller_hpacker;
- Gtk::VBox mixer_scroller_vpacker;
- Gtk::VBox list_vpacker;
- Gtk::Label group_display_button_label;
- Gtk::Button group_display_button;
- Gtk::ScrolledWindow track_display_scroller;
- Gtk::ScrolledWindow group_display_scroller;
- Gtk::ScrolledWindow favorite_plugins_scroller;
- Gtk::VBox group_display_vbox;
- Gtk::Frame track_display_frame;
- Gtk::Frame group_display_frame;
- Gtk::Frame favorite_plugins_frame;
- Gtk::VPaned rhs_pane1;
- Gtk::VPaned rhs_pane2;
- Gtk::HBox strip_packer;
- Gtk::HBox out_packer;
- Gtk::HPaned list_hpane;
+ static Mixer_UI* _instance;
+ Gtk::VBox _content;
+ Gtk::HBox global_hpacker;
+ Gtk::VBox global_vpacker;
+ Gtk::ScrolledWindow scroller;
+ Gtk::EventBox scroller_base;
+ Gtk::HBox scroller_hpacker;
+ Gtk::VBox mixer_scroller_vpacker;
+ Gtk::VBox list_vpacker;
+ Gtk::Label group_display_button_label;
+ Gtk::Button group_display_button;
+ Gtk::ScrolledWindow track_display_scroller;
+ Gtk::ScrolledWindow group_display_scroller;
+ Gtk::ScrolledWindow favorite_plugins_scroller;
+ Gtk::VBox group_display_vbox;
+ Gtk::Frame track_display_frame;
+ Gtk::Frame group_display_frame;
+ Gtk::Frame favorite_plugins_frame;
+ Gtkmm2ext::VPane rhs_pane1;
+ Gtkmm2ext::VPane rhs_pane2;
+ Gtkmm2ext::HPane inner_pane;
+ Gtk::HBox strip_packer;
+ Gtk::ScrolledWindow vca_scroller;
+ Gtk::HBox vca_hpacker;
+ Gtk::VBox vca_vpacker;
+ Gtk::EventBox vca_label_bar;
+ Gtk::Label vca_label;
+ Gtk::EventBox vca_scroller_base;
+ Gtk::HBox out_packer;
+ Gtkmm2ext::HPane list_hpane;
MixerGroupTabs* _group_tabs;
- // for restoring window geometry.
- int m_root_x, m_root_y, m_width, m_height;
-
- void set_window_pos_and_size ();
- void get_window_pos_and_size ();
-
- bool on_key_press_event (GdkEventKey*);
- bool on_key_release_event (GdkEventKey*);
bool on_scroll_event (GdkEventScroll*);
- void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
-
std::list<MixerStrip *> strips;
+ void scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>&, int, int, const Gtk::SelectionData&, guint, guint);
bool strip_scroller_button_release (GdkEventButton*);
+ bool masters_scroller_button_release (GdkEventButton*);
void scroll_left ();
void scroll_right ();
void toggle_midi_input_active (bool flip_others);
- void add_strips (ARDOUR::RouteList&);
+ void add_stripables (ARDOUR::StripableList&);
+
+ void add_routes (ARDOUR::RouteList&);
void remove_strip (MixerStrip *);
- MixerStrip* strip_by_route (boost::shared_ptr<ARDOUR::Route>);
+ void add_masters (ARDOUR::VCAList&);
+ void remove_master (VCAMasterStrip*);
+
+ MixerStrip* strip_by_route (boost::shared_ptr<ARDOUR::Route>) const;
+ AxisView* axis_by_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
void hide_all_strips (bool with_select);
void unselect_all_strips();
@@ -191,6 +209,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
void track_name_changed (MixerStrip *);
void redisplay_track_list ();
+ void spill_redisplay (boost::shared_ptr<ARDOUR::VCA>);
bool no_track_list_redisplay;
bool track_display_button_press (GdkEventButton*);
void strip_width_changed ();
@@ -255,50 +274,50 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
MonitorSection* _monitor_section;
PluginSelector *_plugin_selector;
- void strip_property_changed (const PBD::PropertyChange&, MixerStrip *);
+ void stripable_property_changed (const PBD::PropertyChange& what_changed, boost::weak_ptr<ARDOUR::Stripable> ws);
void route_group_property_changed (ARDOUR::RouteGroup *, const PBD::PropertyChange &);
/* various treeviews */
- struct TrackDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
- TrackDisplayModelColumns () {
- add (text);
- add (visible);
- add (route);
- add (strip);
- }
- Gtk::TreeModelColumn<bool> visible;
- Gtk::TreeModelColumn<std::string> text;
- Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> > route;
- Gtk::TreeModelColumn<MixerStrip*> strip;
+ struct StripableDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
+ StripableDisplayModelColumns () {
+ add (text);
+ add (visible);
+ add (stripable);
+ add (strip);
+ }
+ Gtk::TreeModelColumn<bool> visible;
+ Gtk::TreeModelColumn<std::string> text;
+ Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Stripable> > stripable;
+ Gtk::TreeModelColumn<AxisView*> strip;
};
struct GroupDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
- GroupDisplayModelColumns() {
- add (visible);
- add (text);
- add (group);
- }
- Gtk::TreeModelColumn<bool> visible;
- Gtk::TreeModelColumn<std::string> text;
- Gtk::TreeModelColumn<ARDOUR::RouteGroup*> group;
+ GroupDisplayModelColumns() {
+ add (visible);
+ add (text);
+ add (group);
+ }
+ Gtk::TreeModelColumn<bool> visible;
+ Gtk::TreeModelColumn<std::string> text;
+ Gtk::TreeModelColumn<ARDOUR::RouteGroup*> group;
};
struct PluginsDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
- PluginsDisplayModelColumns() {
- add (name);
- add (plugin);
- }
- Gtk::TreeModelColumn<std::string> name;
- Gtk::TreeModelColumn<ARDOUR::PluginPresetPtr> plugin;
+ PluginsDisplayModelColumns() {
+ add (name);
+ add (plugin);
+ }
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<ARDOUR::PluginPresetPtr> plugin;
};
ARDOUR::PluginInfoList favorite_order;
std::map<std::string, bool> favorite_ui_state;
- TrackDisplayModelColumns track_columns;
- GroupDisplayModelColumns group_columns;
- PluginsDisplayModelColumns favorite_plugins_columns;
+ StripableDisplayModelColumns stripable_columns;
+ GroupDisplayModelColumns group_columns;
+ PluginsDisplayModelColumns favorite_plugins_columns;
Gtk::TreeView track_display;
Gtk::TreeView group_display;
@@ -315,10 +334,8 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
Width _strip_width;
- void sync_order_keys_from_treeview ();
- void sync_treeview_from_order_keys ();
- void reset_remote_control_ids ();
- void reset_order_keys ();
+ void sync_presentation_info_from_treeview ();
+ void sync_treeview_from_presentation_info ();
bool ignore_reorder;
@@ -362,8 +379,32 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
// true if mixer list is visible
bool _show_mixer_list;
-};
-#endif /* __ardour_mixer_ui_h__ */
+ mutable boost::weak_ptr<ARDOUR::VCA> spilled_vca;
+ void escape ();
+ Gtkmm2ext::ActionMap myactions;
+ RouteProcessorSelection _selection;
+ AxisViewSelection _axis_targets;
+
+ void vca_assign (boost::shared_ptr<ARDOUR::VCA>);
+ void vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
+
+ template<class T> void control_action (boost::shared_ptr<T> (ARDOUR::Stripable::*get_control)() const);
+ void solo_action ();
+ void mute_action ();
+ void rec_enable_action ();
+ void step_gain_up_action ();
+ void step_gain_down_action ();
+ void unity_gain_action ();
+
+ void copy_processors ();
+ void cut_processors ();
+ void paste_processors ();
+ void select_all_processors ();
+ void toggle_processors ();
+ void ab_plugins ();
+};
+
+#endif /* __ardour_mixer_ui_h__ */
diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in
deleted file mode 100644
index df7dd6f..0000000
--- a/gtk2_ardour/mnemonic-us.bindings.in
+++ /dev/null
@@ -1,406 +0,0 @@
-; this is a template file processed by tools/fmt-bindings to generate either
-; a gtk accelmap file or a LaTeX key binding cheat sheet.
-;
-; it is the reference for any bindings or cheatsheets
-;
-;
-; FORMAT:
-; $text -> defines cheatsheet title as "text", which may contain LaTeX markup
-;
-; %group text -> defines a binding group called "group" which will have the title "text" on the cheatsheet.
-; may be followed by zero or more lines of descriptive text, which may contain LaTeX markup
-;
-; @group|action|binding|description -> defines an action+binding with description, as a member of a binding group
-; if group starts with '-' it will not be printed in the cheatsheet.
-; if group starts with '+' it will be printed in the cheatsheet no matter what
-; if the group is a mouse binding group, action should contain a ':', and
-; have the binding before the colon, and the target area after it
-
-;; Title
-$ARDOUR Shortcuts \linebreak Mnemonic US-Keypad
-
-;; GROUP DEFINITIONS
-
-%trans Transport \& Recording Control
-
-%sess Session \& File Handling
-
-%edit Basic Editing
-
-%vis Changing What's Visible
-
-%wvis Window Visibility
-
-%eep Editing with Edit Point
-Most edit functions operate on a single "Edit Point". The edit point can be any of: playhead (default), the mouse or an active marker. The choice of Edit Point (by default) also sets the Zoom Focus.
-
-%aep Aligning with the Edit Point
-Align operations move regions so that their start/end/sync point is at the edit point. "Relative" operations
-just align the first region and moves other selected regions to maintain relative positioning.
-
-%epp Edit Point Playback
-
-%movp Moving the Playhead
-A left click in the rulers positions the playhead unless Ardour is recording. You can use {\tt KP$\_$n} to move the
-playhead to the n-th marker.
-
-%rop Region Operations
-
-%edit Edit Range
-There are only a few functions that refer to an "Edit Range". The current edit range is defined using combinations of the possible edit points: Playhead, Marker or Mouse.\par
-\begin{tabular}{lll}
-{\bf Edit Point} & {\bf Active Mark?} & {\bf Edit Range} \\
-Playhead & no & from Playhead to Mouse \\
-Playhead & yes & from Playhead to Active Marker \\
- & & \\
-Mouse & no & from Mouse to Playhead \\
-Mouse & yes & from Mouse to Active Marker \\
- & & \\
-Marker & no & {\it No edit range defined} \\
-Marker & yes & from Active Marker to Mouse
-\end{tabular}
-
-%select Selecting
-
-%ranges Defining Loop, Punch Range and Tempo Changes
-
-%markers Markers \& Locations
-The "move" commands all move the active marker(s). Jump to the first 9 markers using
-the keypad digits 1-9 (requires numlock).
-
-%mmode Mouse Modes
-
-%mouse Mouse Usage
-Right click on most objects and controls displays a context menu
-Shift+Right click deletes most objects.
-OS X users without a 3 button mouse can use {\tt Option+Ctrl+Left} to simulate "Middle" for some purposes.
-Use F1 to step through mouse modes.
-
-%mobject Mouse Object Mode
-This mode provides many different operations on both regions and control points, partially depending on where you click/drag with the mouse. The "body" of a region is the area where the waveform is displayed.
-
-%mzoom Mouse Zoom Mode
-%mops Mouse Ops on Solo/Mute/Rec-enable
-%mopsolo Mouse Ops on Solo Buttons only
-%mopsfader Mouse Ops on Faders \& Plugin Controls
-
-%midi MIDI specific commands
-
-;; END GROUP DEFINITIONS
-
-;; punctuation
-
- at vis|Editor/temporal-zoom-in|equal|zoom in
- at vis|Editor/temporal-zoom-out|minus|zoom out
- at vis|Editor/zoom-to-session|<@TERTIARY@>underscore|zoom to session
- at eep|Editor/edit-cursor-to-previous-region-sync|apostrophe|EP to prev region sync
- at eep|Editor/edit-cursor-to-next-region-sync|semicolon|EP to next region sync
- at eep|Editor/cycle-edit-point|grave|next EP w/o marker
- at eep|Editor/cycle-edit-point-with-marker|<@PRIMARY@>grave|next EP w/marker
-
- at trans|Transport/ToggleRoll|space|toggle roll
- at epp|Editor/PlaySelection|<@SECONDARY@>space|play edit range
- at epp|Editor/play-from-edit-point-and-return|<@PRIMARY@><@TERTIARY@>space|play from EP \& return
- at trans|Transport/ToggleRollMaybe|<@PRIMARY@><@SECONDARY@>space|stop (keep loop/range play)
- at trans|Transport/ToggleRollForgetCapture|<@PRIMARY@>space|stop and destroy
- at trans|Transport/record-roll|<@TERTIARY@>space|start recording
-
- at trans|Editor/add-location-from-playhead|nabla|add marker
- at trans|Editor/remove-location-from-playhead|<@PRIMARY@>nabla|add marker
- at movp|Transport/alternate-GotoStart|Return|to start marker
-
- at trans|Editor/editor-fade-range|slash|fade range selection
- at rop|Region/set-fade-in-length|<@PRIMARY@>slash|set fade in length
-;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>slash|toggle fade in active
- at rop|Region/set-fade-out-length|<@PRIMARY@>backslash|set fade out length
-;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>backslash|toggle fade out active
-
- at eep|Editor/trim-to-previous-region|<@PRIMARY@>j|trim region to end of prev region
- at eep|Editor/trim-to-next-region|<@PRIMARY@>k|trim region to start of next region
-
- at ranges|Editor/set-loop-from-edit-range|bracketright|set loop range from edit range
-
- at ranges|Editor/set-punch-from-edit-range|bracketleft|set punch range from edit range
-
-
-;; Alt+number row: region operations
- at rop|Region/toggle-region-mute|<@SECONDARY@>1|mute/unmute
- at rop|Region/naturalize-region|<@SECONDARY@>2|move to original position
- at rop|Region/normalize-region|<@SECONDARY@>3|normalize
- at rop|Region/reverse-region|<@SECONDARY@>4|reverse
- at rop|Region/quantize-region|<@SECONDARY@>5|quantize MIDI notes \linebreak[4] in selected region(s)
- at rop|Region/boost-region-gain|<@SECONDARY@>6|increase region gain
- at rop|Region/cut-region-gain|<@SECONDARY@>7|reduce region gain
- at rop|Region/pitch-shift-region|<@SECONDARY@>8|transpose
- at rop|Region/lower-region|<@SECONDARY@>9|lower region layer
- at rop|Region/raise-region|<@SECONDARY@>0|raise region layer
-
-;; letters
-;; TOP ROW
-
- at sess|Common/Quit|<@PRIMARY@>q|quit
- at sess|Common/Hide|<@PRIMARY@>h|hide
- at movp|Editor/jump-forward-to-mark|w|to next mark
- at movp|Editor/jump-backward-to-mark|q|to previous mark
-
-;; note that ctrl-w is special and consumed by the keyboard snooper
-
- at select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP
- at rop|Region/export-region|<@PRIMARY@><@SECONDARY@>e|export selected region(s)
- at sess|Main/ExportAudio|<@SECONDARY@>e|export session
- at select|Editor/select-all-after-edit-cursor|<@PRIMARY@><@TERTIARY@>e|select all after EP
- at vis|Editor/show-editor-mixer|<@TERTIARY@>e|toggle editor window mixer
- at wvis|Common/goto-editor|<@SECONDARY@>e|toggle editor window
- at mmode|MouseMode/set-mouse-mode-range|r|range mode
- at edit|Editor/redo|<@PRIMARY@>r|redo
- at trans|Transport/Record|<@TERTIARY@>r|engage record
- at mmode|MouseMode/set-mouse-mode-timefx|t|timefx mode
- at eep|Editor/select-all-tracks|<@PRIMARY@>t|select all tracks
- at mmode|MouseMode/set-mouse-mode-object-range|y|link object/range tools
- at edit|Editor/alternate-redo|<@PRIMARY@>y|redo
- at select|Editor/select-all-between-cursors|<@PRIMARY@>u|all enclosed by edit range
- at select|Editor/select-all-within-cursors|u|all present in edit range
- at eep|Region/insert-region-from-region-list|i|insert from region list
- at select|Editor/invert-selection|<@TERTIARY@>i|invert selection
- at sess|Editor/addExistingAudioFiles|<@PRIMARY@>i|import audio files
- at sess|Editor/toggle-midi-input-active|<@SECONDARY@>i|toggle sel. track MIDI input
- at mmode|MouseMode/set-mouse-mode-object|g|object mode
- at mmode|MouseMode/set-mouse-mode-content|e|content mode
- at sess|Main/Open|<@PRIMARY@>o|open an existing session
- at sess|Main/Recent|<@PRIMARY@><@TERTIARY@>o|open a recent session
- at wvis|Window/toggle-session-options-editor|<@SECONDARY@>o|toggle preferences dialog
- at trans|Editor/set-playhead|p|set playhead position
- at select|Editor/select-all-before-playhead|<@PRIMARY@>p|all before playhead
- at wvis|Window/toggle-rc-options-editor|<@SECONDARY@>p|toggle preferences dialog
- at midi|MIDI/panic|<@PRIMARY@><@SECONDARY@>p|MIDI panic (stop all notes etc)
- at select|Editor/select-all-after-playhead|<@PRIMARY@><@TERTIARY@>p|all after playhead
-
-;; MIDDLE ROW
-
- at aep|Region/align-regions-sync-relative|a|align sync points (relative)
- at select|Editor/select-all-objects|<@PRIMARY@>a|select all objects
- at aep|Region/align-regions-end|<@SECONDARY@>a|align end(s)
- at aep|Region/align-regions-sync|<@TERTIARY@>a|align sync points
- at aep|Region/align-regions-start|<@PRIMARY@><@SECONDARY@>a|align start(s)
- at aep|Region/align-regions-start-relative|<@PRIMARY@><@TERTIARY@>a|align start(s) relative
- at rop|Region/split-region|s|split
- at sess|Common/Save|<@PRIMARY@>s|save session
- at sess|Main/SnapshotStay|<@PRIMARY@><@TERTIARY@>s|snapshot session
- at trans|Editor/track-solo-toggle|<@SECONDARY@>s|toggle track solo status
- at mmode|MouseMode/set-mouse-mode-draw|d|note-draw mode
- at rop|Region/duplicate-region|<@SECONDARY@>d|duplicate region (once)
- at rop|Region/multi-duplicate-region|<@TERTIARY@>d|duplicate region (multi)
- at select|Editor/select-all-in-punch-range|<@PRIMARY@>d|select all in punch range
- at vis|Editor/fit-selection|f|fit selection vertically
- at trans|Editor/toggle-follow-playhead|<@PRIMARY@>f|toggle playhead tracking
- at wvis|Region/show-rhythm-ferret|<@SECONDARY@>f|show rhythm ferret window
- at trans|Transport/ToggleFollowEdits|<@TERTIARY@>f|toggle playhead follows edits
- at wvis|Common/ToggleMaximalEditor|<@PRIMARY@><@SECONDARY@>f|maximise editor space
- at wvis|Common/ToggleMaximalMixer|<@PRIMARY@><@TERTIARY@>f|maximise mixer space
- at mmode|MouseMode/set-mouse-mode-gain|g|region gain mode
- at epp|Region/play-selected-regions|h|play selected region(s)
- at eep|Region/trim-front|j|trim front
- at eep|Region/trim-back|k|trim back
- at wvis|Window/toggle-key-editor|<@SECONDARY@>k|toggle key bindings editor
- at trans|Transport/Loop|l|loop play (the loop range)
- at select|Editor/select-all-in-loop-range|<@PRIMARY@>l|select all in loop range
- at wvis|Window/toggle-locations|<@SECONDARY@>l| toggle locations dialog
-
-;; BOTTOM ROW
-
- at mmode|Editor/zoom-to-selection|z|zoom to selection
- at vis|Editor/zoom-to-selection-both-axes|<@PRIMARY@><@SECONDARY@>z|zoom to selection, x and y
- at edit|Editor/undo|<@PRIMARY@>z|undo
- at edit|Editor/alternate-alternate-redo|<@PRIMARY@><@TERTIARY@>z|redo
- at vis|Editor/toggle-zoom|<@TERTIARY@>z|toggle last 2 zoom states
- at mmode|MouseMode/set-mouse-mode-cut|c|cut mode
- at edit|Editor/editor-cut|<@PRIMARY@>x|cut
- at edit|Editor/editor-copy|<@PRIMARY@>c|copy
- at wvis|Window/toggle-big-clock|<@SECONDARY@>c|toggle big clock
- at -group|Editor/crop<@PRIMARY@><@TERTIARY@>c|crop
- at rop|Region/set-region-sync-position|v|set region sync point
- at edit|Editor/editor-paste|<@PRIMARY@>v|paste
- at edit|Editor/ToggleJadeo|<@SECONDARY@>v|video window
- at -group|Editor/brush-at-mouse|<@PRIMARY@>b|some text
- at wvis|Common/toggle-meterbridge|<@SECONDARY@>b|show meter bridge
- at trans|Editor/track-record-enable-toggle|<@TERTIARY@>b|toggle track rec-enable
- at sess|Main/AddTrackBus|<@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses)
- at wvis|Window/toggle-audio-connection-manager|<@SECONDARY@>n|toggle global audio patchbay
- at sess|Main/New|<@PRIMARY@>n|open a new session
- at wvis|Common/toggle-editor-mixer|<@SECONDARY@>m|rotate editor \& mixer window
- at wvis|Window/toggle-midi-connection-manager|<@SECONDARY@><@TERTIARY@>m|toggle global midi patchbay
-
-;; arrow keys, navigation etc.
-
- at vis|Editor/step-tracks-up|uparrow|scroll up (step)
- at trans|Transport/TransitionToRoll|<@TERTIARY@>uparrow|transition to roll
- at select|Editor/select-prev-route|<@SECONDARY@>uparrow|select previous track/bus
- at vis|Editor/move-selected-tracks-up|<@PRIMARY@>uparrow|move selected tracks up
-
- at vis|Editor/step-tracks-down|downarrow|scroll down (step)
- at trans|Transport/TransitionToReverse|<@TERTIARY@>downarrow|transition to reverse
- at select|Editor/select-next-route|<@SECONDARY@>downarrow|select next track/bus
- at vis|Editor/move-selected-tracks-down|<@PRIMARY@>downarrow|move selected tracks down
-
- at movp|Editor/playhead-to-previous-region-boundary|leftarrow|to previous region edge
-;@movp|Editor/playhead-to-previous-region-boundary-noselection|<@LEVEL4@>leftarrow|to previous edge \linebreak[4] (ignoring selection)
- at movp|Editor/playhead-to-previous-region-sync|<@PRIMARY@><@SECONDARY@>leftarrow|to previous region sync
- at movp|Editor/tab-to-transient-backwards|<@PRIMARY@>leftarrow|to previous transient
- at movp|Editor/nudge-playhead-backward|<@SECONDARY@>leftarrow|nudge backward
- at movp|Editor/playhead-backward-to-grid|<@SECONDARY@><@TERTIARY@>leftarrow|to previous grid point
- at trans|Transport/Rewind|<@TERTIARY@>leftarrow|rewind
- at markers|Editor/selected-marker-to-previous-region-boundary|<@PRIMARY@><@TERTIARY@>leftarrow|move to prev region edge
-
- at movp|Editor/playhead-to-next-region-boundary|rightarrow|to next region edge
-;@movp|Editor/playhead-to-next-region-boundary-noselection|<@LEVEL4@>rightarrow|to next region edge \linebreak[4] (ignoring selection)
- at movp|Editor/playhead-to-next-region-sync|<@PRIMARY@><@SECONDARY@>rightarrow|to next region sync
- at movp|Editor/tab-to-transient-forwards|<@PRIMARY@>rightarrow|to next transient
- at movp|Editor/nudge-playhead-forward|<@SECONDARY@>rightarrow|nudge forwards
- at movp|Editor/playhead-forward-to-grid|<@SECONDARY@><@TERTIARY@>rightarrow|to next grid point
- at trans|Transport/Forward|<@TERTIARY@>rightarrow|fast forward
- at markers|Editor/selected-marker-to-next-region-boundary|<@PRIMARY@><@TERTIARY@>rightarrow|move to next region edge
-
- at vis|Editor/scroll-tracks-down|Page_Down|scroll down (page)
- at vis|Editor/scroll-tracks-up|Page_Up|scroll up (page)
- at movp|Transport/GotoStart|Home|to start marker
- at movp|Transport/GotoEnd|End|to end marker
- at edit|Editor/editor-delete|Delete|delete
- at edit|Editor/alternate-editor-delete|BackSpace|backspace (delete)
-
- at select|Editor/escape|Escape|break drag or deselect all
-
-;; keypad
-
- at rop|Region/nudge-backward|KP_Subtract|nudge backward
- at -group|Editor/nudge-next-backward|<@PRIMARY@>KP_Subtract|some text
-
- at movp|Editor/alternate-jump-forward-to-mark|<@PRIMARY@>KP_Right|to next mark
- at movp|Editor/alternate-jump-backward-to-mark|<@PRIMARY@>KP_Left|to previous mark
-
- at rop|Region/nudge-forward|KP_Add|nudge forward
- at -group|Editor/nudge-next-forward|<@PRIMARY@>KP_Add|some text
-
- at -group|Editor/start-range|comma|some text
- at -group|Editor/finish-range|period|some text
- at -group|Editor/alt-start-range|<@PRIMARY@>KP_Down|set the start of the range selection
- at -group|Editor/alt-finish-range|<@PRIMARY@>KP_Up|set the end of the range selection
- at -group|Editor/start-punch-range|<@PRIMARY@>comma|set the start of the Punch range
- at -group|Editor/finish-punch-range|<@PRIMARY@>period|set the end of the Punch range
- at -group|Editor/start-loop-range|<@SECONDARY@>comma|set the start of the Loop range
- at -group|Editor/finish-loop-range|<@SECONDARY@>period|set the end of the Loop range
-
- at markers|Editor/alternate-add-location-from-playhead|KP_Enter|add mark at playhead
- at markers|Editor/alternate-remove-location-from-playhead|<@PRIMARY@>KP_Enter|add mark at playhead
- at wvis|Transport/focus-on-clock|KP_Divide|focus on main clock
-
- at movp|Transport/numpad-decimal|KP_Decimal|numpad decimal should initiate and finalize a locate-to-marker
- at movp|Transport/alternate-numpad-decimal|KP_Separator|(some keybd layouts have separator instead of decimal)
-
- at movp|Transport/numpad-0|KP_0|some text
- at -group|Transport/numpad-1|KP_1|some text
- at -group|Transport/numpad-2|KP_2|some text
- at -group|Transport/numpad-3|KP_3|some text
- at -group|Transport/numpad-4|KP_4|some text
- at -group|Transport/numpad-5|KP_5|some text
- at -group|Transport/numpad-6|KP_6|some text
- at -group|Transport/numpad-7|KP_7|some text
- at -group|Transport/numpad-8|KP_8|some text
- at -group|Transport/numpad-9|KP_9|some text
-
-;; F-N keys
-
- at -group|Editor/edit-cursor-to-range-start|F1|some text
- at -group|Editor/edit-cursor-to-range-end|F2|some text
- at -group|Editor/pitch-shift-region|F5|some text
-
- at -group|Editor/save-visual-state-1|<@PRIMARY@>F1|some text
- at -group|Editor/save-visual-state-2|<@PRIMARY@>F2|some text
- at -group|Editor/save-visual-state-3|<@PRIMARY@>F3|some text
- at -group|Editor/save-visual-state-4|<@PRIMARY@>F4|some text
- at -group|Editor/save-visual-state-5|<@PRIMARY@>F5|some text
- at -group|Editor/save-visual-state-6|<@PRIMARY@>F6|some text
- at -group|Editor/save-visual-state-7|<@PRIMARY@>F7|some text
- at -group|Editor/save-visual-state-8|<@PRIMARY@>F8|some text
- at -group|Editor/save-visual-state-9|<@PRIMARY@>F9|some text
- at -group|Editor/save-visual-state-10|<@PRIMARY@>F10|some text
- at -group|Editor/save-visual-state-11|<@PRIMARY@>F11|some text
- at -group|Editor/save-visual-state-12|<@PRIMARY@>F12|some text
-
- at -group|Editor/goto-visual-state-1|F1|some text
- at -group|Editor/goto-visual-state-2|F2|some text
- at -group|Editor/goto-visual-state-3|F3|some text
- at -group|Editor/goto-visual-state-4|F4|some text
- at -group|Editor/goto-visual-state-5|F5|some text
- at -group|Editor/goto-visual-state-6|F6|some text
- at -group|Editor/goto-visual-state-7|F7|some text
- at -group|Editor/goto-visual-state-8|F8|some text
- at -group|Editor/goto-visual-state-9|F9|some text
- at -group|Editor/goto-visual-state-10|F10|some text
- at -group|Editor/goto-visual-state-11|F11|some text
- at -group|Editor/goto-visual-state-12|F12|some text
-
-
-;; numbers
-
- at eep|Editor/cycle-zoom-focus|1|cycle to next zoom focus
- at eep|Editor/cycle-snap-mode|2|cycle to next grid snap mode
- at eep|Editor/prev-snap-choice|3|use next grid unit
- at eep|Editor/prev-snap-choice-music-only|<@PRIMARY@>3|use previous grid unit
- at eep|Editor/next-snap-choice|4|use next grid unit
- at eep|Editor/next-snap-choice-music-only|<@PRIMARY@>4|use next musical grid unit
- at trans|Transport/ToggleAutoPlay|5|toggle auto play
- at trans|Transport/ToggleAutoReturn|6|toggle auto return
- at trans|Transport/ToggleClick|7|toggle click (metronome)
- at ranges|Region/set-tempo-from-region|9|set tempo (1 bar) from region(s)
- at ranges|Editor/set-tempo-from-edit-range|0|set tempo (1 bar) from edit range
-
-; mouse stuff
-
- at +mobject|foo|left-click:on body|select
- at +mobject|foo|<@TERTIARY@>left-click:on body|extend selection
- at +mobject|foo|<@PRIMARY@>left-click:on body|add/remove selection
- at +mobject|foo|left-drag:on body|move region(s)
- at +mobject|foo|<@PRIMARY@>left-drag:on body|copy+move region(s)
- at +mobject|foo|<@PRIMARY@>middle-drag:on body|fixed time copy+move
- at +mobject|foo|middle-drag:on body|fixed time move
- at +mobject|foo|<@SECONDARY@><@TERTIARY@>midde:on body|lower region
- at +mobject|foo|<@TERTIARY@>middle:on body|raise region
- at +mobject|foo|<@PRIMARY@>left-drag:in trim bar|slip audio in region
- at +mobject|foo|left-click:in trim bar|set region start
- at +mobject|foo|middle:in trim bar|set region end
- at +mobject|foo|left-drag:near ends of trim bar|adjust region edges
- at +mobject|foo|left-click:in auto track|add control point
- at +mobject|foo|left-drag:on point|move control point
- at +mobject|foo|middle-drag:on point|fixed time adjust
- at +mobject|foo|<@PRIMARY@>left-drag:on point|move point+later points
- at +mobject|foo|<@PRIMARY@>middle-drag:on point|fixed time move
- at +mobject|foo|left-drag:on line|move line segment
- at +mobject|foo|<@PRIMARY@><@SECONDARY@>left-drag:on regions|rubber-band select
- at +mobject|foo|left-drag:in auto track|rubber-band select\linebreak control points
- at +mobject|foo|left-drag:empty space|rubber-band select
-
-; mouse zoom
- at +mzoom|foo|<@PRIMARY@>middle|zoom to session
- at +mzoom|foo|middle-click|zoom out
- at +mzoom|foo|left-click|zoom in
- at +mzoom|foo|left+drag |define the new visible area
-
-; mouse solo etc.
- at +mops|foo|<@PRIMARY@>middle-click|learn MIDI control
- at +mops|foo|<@PRIMARY@><@TERTIARY@>left-click|apply to all tracks/busses
- at +mops|foo|<@PRIMARY@>left-click|apply to group
- at +mops|foo|middle-click|momentary switch
- at +mops|foo|left-click|apply to track or active group
-
-; mouse solo
-
- at +mopsolo|foo|<@PRIMARY@><@SECONDARY@>left-click|exclusive solo
- at +mopsolo|foo|<@TERTIARY@>left-click|temporary latched solo
-
-; mouse fader etc.
-
- at +mopsfader|foo|<@PRIMARY@>middle-click|learn MIDI control
- at +mopsfader|foo|<@TERTIARY@>left-click|reset to default
- at +mopsfader|foo|<@PRIMARY@><@SECONDARY@>left-drag|finest-drag control
- at +mopsfader|foo|<@PRIMARY@>left-drag|fine-drag control
- at +mopsfader|foo|left-drag|adjust
diff --git a/gtk2_ardour/monitor.bindings b/gtk2_ardour/monitor.bindings
new file mode 100644
index 0000000..d7cafff
--- /dev/null
+++ b/gtk2_ardour/monitor.bindings
@@ -0,0 +1,24 @@
+<Bindings name="Monitor Section">
+ <Press>
+ <Binding key="m" action="Monitor/monitor-mono"/>
+ <Binding key="c" action="Monitor/monitor-cut-all"/>
+ <Binding key="d" action="Monitor/monitor-dim-all"/>
+ <Binding key="e" action="Monitor/toggle-exclusive-solo"/>
+ <Binding key="Shift-o" action="Monitor/toggle-mute-overrides-solo"/>
+ <Binding key="b" action="Monitor/toggle-monitor-processor-box"/>
+
+ <Binding key="l" action="Monitor/monitor-cut-0"/>
+ <Binding key="Primary-l" action="Monitor/monitor-solo-0"/>
+ <Binding key="Secondary-l" action="Monitor/monitor-dim-0"/>
+ <Binding key="Tertiary-l" action="Monitor/monitor-invert-0"/>
+
+ <Binding key="r" action="Monitor/monitor-cut-1"/>
+ <Binding key="Primary-r" action="Monitor/monitor-solo-1"/>
+ <Binding key="Secondary-r" action="Monitor/monitor-dim-1"/>
+ <Binding key="Tertiary-r" action="Monitor/monitor-invert-1"/>
+
+ <Binding key="i" action="Solo/solo-use-in-place"/>
+ <Binding key="p" action="Solo/solo-use-pfl"/>
+ <Binding key="a" action="Solo/solo-use-afl"/>
+ </Press>
+</Bindings>
diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc
index d940258..2fcc581 100644
--- a/gtk2_ardour/monitor_section.cc
+++ b/gtk2_ardour/monitor_section.cc
@@ -1,19 +1,19 @@
/*
- Copyright (C) 2012 Paul Davis
+ Copyright (C) 2012 Paul Davis
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
@@ -36,9 +36,11 @@
#include "ardour/monitor_processor.h"
#include "ardour/port.h"
#include "ardour/route.h"
+#include "ardour/solo_isolate_control.h"
#include "ardour/user_bundle.h"
#include "ardour/plugin_manager.h"
+#include "ardour_ui.h"
#include "gui_thread.h"
#include "monitor_section.h"
#include "public_editor.h"
@@ -47,7 +49,7 @@
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -61,11 +63,11 @@ Glib::RefPtr<ActionGroup> MonitorSection::monitor_actions;
#define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
MonitorSection::MonitorSection (Session* s)
- : AxisView (s)
+ : SessionHandlePtr (s)
, RouteUI (s)
, _tearoff (0)
, channel_table_viewport (*channel_table_scroller.get_hadjustment()
- , *channel_table_scroller.get_vadjustment ())
+ , *channel_table_scroller.get_vadjustment ())
, gain_control (0)
, dim_control (0)
, solo_boost_control (0)
@@ -83,6 +85,8 @@ MonitorSection::MonitorSection (Session* s)
, toggle_processorbox_button (ArdourButton::default_elements)
, _inhibit_solo_model_update (false)
, _ui_initialized (false)
+ , myactions (X_("monitor section"))
+ , bindings (0)
{
using namespace Menu_Helpers;
@@ -91,8 +95,10 @@ MonitorSection::MonitorSection (Session* s)
if (!monitor_actions) {
register_actions ();
- } else {
- connect_actions ();
+ load_bindings ();
+ if (bindings) {
+ set_data ("ardour-bindings", bindings);
+ }
}
_plugin_selector = new PluginSelector (PluginManager::instance());
@@ -182,11 +188,10 @@ MonitorSection::MonitorSection (Session* s)
/* Processor Box hide/shos */
toggle_processorbox_button.set_text (_("Processors"));
toggle_processorbox_button.set_name (X_("monitor section processors toggle"));
- set_tooltip (&toggle_processorbox_button, _("Allow to add monitor effect processors"));
+ set_tooltip (&toggle_processorbox_button, _("Allow one to add monitor effect processors"));
- proctoggle = ToggleAction::create ();
+ proctoggle = ActionManager::get_action (X_("Monitor"), X_("toggle-monitor-processor-box"));
toggle_processorbox_button.set_related_action (proctoggle);
- proctoggle->signal_toggled().connect (sigc::mem_fun(*this, &MonitorSection::update_processor_box), false);
/* Knobs */
Label* solo_boost_label;
@@ -390,7 +395,7 @@ MonitorSection::MonitorSection (Session* s)
mono_dim_box->pack_start (mono_button, true, true);
mono_dim_box->pack_end (dim_all_button, true, true);
- // master gain
+ // master gain
Label* spin_label = manage (new Label (_("Monitor")));
VBox* spin_packer = manage (new VBox);
spin_packer->set_spacing (PX_SCALE(2));
@@ -407,7 +412,7 @@ MonitorSection::MonitorSection (Session* s)
lower_packer->pack_start (*mono_dim_box, false, false, PX_SCALE(2));
lower_packer->pack_start (cut_all_button, false, false, PX_SCALE(2));
- // output port select
+ // output port select
VBox* out_packer = manage (new VBox);
out_packer->set_spacing (PX_SCALE(2));
out_packer->pack_start (*output_label, false, false);
@@ -429,6 +434,8 @@ MonitorSection::MonitorSection (Session* s)
hpacker.set_spacing (0);
hpacker.pack_start (vpacker, true, true);
+ add (hpacker);
+
gain_control->show_all ();
gain_display->show_all ();
dim_control->show_all ();
@@ -457,7 +464,11 @@ MonitorSection::MonitorSection (Session* s)
output_button->signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::output_press), false);
output_button->signal_button_release_event().connect (sigc::mem_fun(*this, &MonitorSection::output_release), false);
- _tearoff = new TearOff (hpacker);
+ signal_enter_notify_event().connect (sigc::mem_fun (*this, &MonitorSection::enter_handler));
+ signal_leave_notify_event().connect (sigc::mem_fun (*this, &MonitorSection::leave_handler));
+ set_flags (CAN_FOCUS);
+
+ _tearoff = new TearOff (*this);
if (!UIConfiguration::instance().get_floating_monitor_section()) {
/* if torn off, make this a normal window
@@ -466,7 +477,7 @@ MonitorSection::MonitorSection (Session* s)
_tearoff->tearoff_window().set_type_hint (Gdk::WINDOW_TYPE_HINT_NORMAL);
}
_tearoff->tearoff_window().set_title (X_("Monitor"));
- _tearoff->tearoff_window().signal_key_press_event().connect (sigc::ptr_fun (forward_key_press), false);
+ _tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), (Gtk::Window*) &_tearoff->tearoff_window()), false);
update_output_display ();
update_processor_box ();
@@ -488,26 +499,55 @@ MonitorSection::~MonitorSection ()
_channel_buttons.clear ();
_output_changed_connection.disconnect ();
- delete insert_box;
- delete output_button;
- delete gain_control;
- delete gain_display;
- delete dim_control;
- delete dim_display;
- delete solo_boost_control;
- delete solo_boost_display;
- delete solo_cut_control;
- delete solo_cut_display;
- delete _tearoff;
- delete _output_selector;
- _output_selector = 0;
+ delete insert_box; insert_box = 0;
+ delete output_button; output_button = 0;
+ delete gain_control; gain_control = 0;
+ delete gain_display; gain_display = 0;
+ delete dim_control; dim_control = 0;
+ delete dim_display; dim_display = 0;
+ delete solo_boost_control; solo_boost_control = 0;
+ delete solo_boost_display; solo_boost_display = 0;
+ delete solo_cut_control; solo_cut_control = 0;
+ delete solo_cut_display; solo_cut_display = 0;
+ delete _tearoff; _tearoff = 0;
+ delete _output_selector; _output_selector = 0;
+}
+
+bool
+MonitorSection::enter_handler (GdkEventCrossing* ev)
+{
+ grab_focus ();
+ return false;
}
+bool
+MonitorSection::leave_handler (GdkEventCrossing* ev)
+{
+ switch (ev->detail) {
+ case GDK_NOTIFY_INFERIOR:
+ return false;
+ default:
+ break;
+ }
+
+ /* cancel focus if we're not torn off. With X11 WM's that do
+ * focus-follows-mouse, focus will be taken from us anyway.
+ */
+
+ Widget* top = get_toplevel();
+
+ if (top->is_toplevel() && top != &_tearoff->tearoff_window()) {
+ Window* win = dynamic_cast<Window*> (top);
+ gtk_window_set_focus (win->gobj(), 0);
+ }
+
+ return false;
+}
void
MonitorSection::update_processor_box ()
{
- bool show_processor_box = proctoggle->get_active ();
+ bool show_processor_box = Glib::RefPtr<ToggleAction>::cast_dynamic (proctoggle)->get_active ();
if (count_processors () > 0 && !show_processor_box) {
toggle_processorbox_button.set_name (X_("monitor section processors present"));
@@ -537,7 +577,7 @@ MonitorSection::update_processor_box ()
void
MonitorSection::set_session (Session* s)
{
- AxisView::set_session (s);
+ RouteUI::set_session (s);
_plugin_selector->set_session (_session);
if (_session) {
@@ -852,67 +892,66 @@ MonitorSection::register_actions ()
string action_descr;
Glib::RefPtr<Action> act;
- monitor_actions = ActionGroup::create (X_("Monitor"));
- ActionManager::add_action_group (monitor_actions);
+ monitor_actions = myactions.create_action_group (X_("Monitor"));
- ActionManager::register_toggle_action (monitor_actions, "monitor-mono", "", _("Switch monitor to mono"),
+ myactions.register_toggle_action (monitor_actions, "monitor-mono", _("Switch monitor to mono"),
sigc::mem_fun (*this, &MonitorSection::mono));
- ActionManager::register_toggle_action (monitor_actions, "monitor-cut-all", "", _("Cut monitor"),
+ myactions.register_toggle_action (monitor_actions, "monitor-cut-all", _("Cut monitor"),
sigc::mem_fun (*this, &MonitorSection::cut_all));
- ActionManager::register_toggle_action (monitor_actions, "monitor-dim-all", "", _("Dim monitor"),
+ myactions.register_toggle_action (monitor_actions, "monitor-dim-all", _("Dim monitor"),
sigc::mem_fun (*this, &MonitorSection::dim_all));
- act = ActionManager::register_toggle_action (monitor_actions, "toggle-exclusive-solo", "", _("Toggle exclusive solo mode"),
+ act = myactions.register_toggle_action (monitor_actions, "toggle-exclusive-solo", _("Toggle exclusive solo mode"),
sigc::mem_fun (*this, &MonitorSection::toggle_exclusive_solo));
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
tact->set_active (Config->get_exclusive_solo());
- act = ActionManager::register_toggle_action (monitor_actions, "toggle-mute-overrides-solo", "", _("Toggle mute overrides solo mode"),
+ act = myactions.register_toggle_action (monitor_actions, "toggle-mute-overrides-solo", _("Toggle mute overrides solo mode"),
sigc::mem_fun (*this, &MonitorSection::toggle_mute_overrides_solo));
tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
tact->set_active (Config->get_solo_mute_override());
-
for (uint32_t chn = 0; chn < 16; ++chn) {
action_name = string_compose (X_("monitor-cut-%1"), chn);
action_descr = string_compose (_("Cut monitor channel %1"), chn);
- ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+ myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
sigc::bind (sigc::mem_fun (*this, &MonitorSection::cut_channel), chn));
action_name = string_compose (X_("monitor-dim-%1"), chn);
action_descr = string_compose (_("Dim monitor channel %1"), chn);
- ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+ myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
sigc::bind (sigc::mem_fun (*this, &MonitorSection::dim_channel), chn));
action_name = string_compose (X_("monitor-solo-%1"), chn);
action_descr = string_compose (_("Solo monitor channel %1"), chn);
- ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+ myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
sigc::bind (sigc::mem_fun (*this, &MonitorSection::solo_channel), chn));
action_name = string_compose (X_("monitor-invert-%1"), chn);
action_descr = string_compose (_("Invert monitor channel %1"), chn);
- ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+ myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
sigc::bind (sigc::mem_fun (*this, &MonitorSection::invert_channel), chn));
}
- Glib::RefPtr<ActionGroup> solo_actions = ActionGroup::create (X_("Solo"));
+ Glib::RefPtr<ActionGroup> solo_actions = myactions.create_action_group (X_("Solo"));
RadioAction::Group solo_group;
- ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-in-place", "", _("In-place solo"),
+ myactions.register_radio_action (solo_actions, solo_group, "solo-use-in-place", _("In-place solo"),
sigc::mem_fun (*this, &MonitorSection::solo_use_in_place));
- ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-afl", "", _("After Fade Listen (AFL) solo"),
+ myactions.register_radio_action (solo_actions, solo_group, "solo-use-afl", _("After Fade Listen (AFL) solo"),
sigc::mem_fun (*this, &MonitorSection::solo_use_afl));
- ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-pfl", "", _("Pre Fade Listen (PFL) solo"),
+ myactions.register_radio_action (solo_actions, solo_group, "solo-use-pfl", _("Pre Fade Listen (PFL) solo"),
sigc::mem_fun (*this, &MonitorSection::solo_use_pfl));
- ActionManager::add_action_group (solo_actions);
+ myactions.register_toggle_action (monitor_actions, "toggle-monitor-processor-box", _("Toggle Monitor Section Processor Box"),
+ sigc::mem_fun(*this, &MonitorSection::update_processor_box));
}
void
@@ -1208,7 +1247,7 @@ MonitorSection::cancel_isolate (GdkEventButton*)
{
if (_session) {
boost::shared_ptr<RouteList> rl (_session->get_routes ());
- _session->set_solo_isolated (rl, false, Session::rt_cleanup, Controllable::NoGroup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::solo_isolate_control), 0.0, Controllable::NoGroup);
}
return true;
@@ -1629,6 +1668,12 @@ MonitorSection::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost:
}
void
+MonitorSection::load_bindings ()
+{
+ bindings = Bindings::get_bindings (X_("Monitor Section"), myactions);
+}
+
+void
MonitorSection::help_count_processors (boost::weak_ptr<Processor> p, uint32_t* cnt) const
{
boost::shared_ptr<Processor> processor (p.lock ());
@@ -1656,3 +1701,4 @@ MonitorSection::processors_changed (ARDOUR::RouteProcessorChange)
{
update_processor_box ();
}
+
diff --git a/gtk2_ardour/monitor_section.h b/gtk2_ardour/monitor_section.h
index a0339a7..8a3c23a 100644
--- a/gtk2_ardour/monitor_section.h
+++ b/gtk2_ardour/monitor_section.h
@@ -19,13 +19,14 @@
#include <gtkmm/box.h>
#include <gtkmm/table.h>
+#include <gtkmm/eventbox.h>
#include "gtkmm2ext/bindable_button.h"
+#include "gtkmm2ext/bindings.h"
#include "ardour_button.h"
#include "ardour_knob.h"
#include "ardour_display.h"
-#include "axis_view.h"
#include "level_meter.h"
#include "route_ui.h"
#include "monitor_selector.h"
@@ -38,9 +39,9 @@ namespace Gtkmm2ext {
class TearOff;
}
-class MonitorSection : public RouteUI
+class MonitorSection : public RouteUI, public Gtk::EventBox
{
- public:
+ public:
MonitorSection (ARDOUR::Session*);
~MonitorSection ();
@@ -166,6 +167,8 @@ class MonitorSection : public RouteUI
void update_processor_box ();
+ void route_property_changed (const PBD::PropertyChange&) {}
+
ProcessorBox* insert_box;
PluginSelector* _plugin_selector;
RouteProcessorSelection _rr_selection;
@@ -173,6 +176,14 @@ class MonitorSection : public RouteUI
uint32_t count_processors ();
void processors_changed (ARDOUR::RouteProcessorChange);
- Glib::RefPtr<Gtk::ToggleAction> proctoggle;
+ Glib::RefPtr<Gtk::Action> proctoggle;
bool _ui_initialized;
+
+ private:
+ Gtkmm2ext::ActionMap myactions;
+ Gtkmm2ext::Bindings* bindings;
+
+ void load_bindings ();
+ bool enter_handler (GdkEventCrossing*);
+ bool leave_handler (GdkEventCrossing*);
};
diff --git a/gtk2_ardour/monitor_selector.cc b/gtk2_ardour/monitor_selector.cc
index 5f71a79..0a6d731 100644
--- a/gtk2_ardour/monitor_selector.cc
+++ b/gtk2_ardour/monitor_selector.cc
@@ -33,7 +33,7 @@
#include "monitor_selector.h"
#include "utils.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
diff --git a/gtk2_ardour/mono_panner.cc b/gtk2_ardour/mono_panner.cc
index 0dd54ef..da98fcb 100644
--- a/gtk2_ardour/mono_panner.cc
+++ b/gtk2_ardour/mono_panner.cc
@@ -44,7 +44,7 @@
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/mono_panner_editor.cc b/gtk2_ardour/mono_panner_editor.cc
index 5a9a092..5561a30 100644
--- a/gtk2_ardour/mono_panner_editor.cc
+++ b/gtk2_ardour/mono_panner_editor.cc
@@ -24,7 +24,7 @@
#include "pbd/controllable.h"
#include "mono_panner_editor.h"
#include "mono_panner.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace Gtkmm2ext;
diff --git a/gtk2_ardour/mtest.cc b/gtk2_ardour/mtest.cc
deleted file mode 100644
index 3103a83..0000000
--- a/gtk2_ardour/mtest.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- Copyright (C) 2000-2007 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <vector>
-#include <iostream>
-#include <gtkmm.h>
-#include <gtkmm/accelmap.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkaccelmap.h>
-
-using namespace Gtk;
-using namespace std;
-using namespace Glib;
-
-void
-printit (string txt)
-{
- cout << "This is the " << txt << " item\n";
-}
-
-Glib::RefPtr<Action>
-make_action (Glib::RefPtr<ActionGroup> group, string name, string label, RefPtr<AccelGroup> accels, slot<void> sl, guint key, Gdk::ModifierType mods)
-{
- Glib::RefPtr<Action> act;
-
- act = Action::create (name, label);
- group->add (act, sl);
- AccelMap::add_entry (act->get_accel_path(), key, mods);
-
- act->set_accel_group (accels);
-
- cerr << "action " << name << " has path " << act->get_accel_path() << endl;
-
- return act;
-}
-
-Glib::RefPtr<Action>
-make_action (Glib::RefPtr<ActionGroup> group, string name, string label)
-{
- Glib::RefPtr<Action> act;
-
- act = Action::create (name, label);
- group->add (act);
-
- cerr << "action " << name << " has path " << act->get_accel_path() << endl;
-
- return act;
-}
-
-bool
-lookup_entry (const string accel_path, Gtk::AccelKey& key)
-{
- GtkAccelKey gkey;
- bool known = gtk_accel_map_lookup_entry (accel_path.c_str(), &gkey);
-
- if (known) {
- key = AccelKey (gkey.accel_key, Gdk::ModifierType (gkey.accel_mods));
- } else {
- key = AccelKey (GDK_VoidSymbol, Gdk::ModifierType (0));
- }
-
- return known;
-}
-
-RefPtr<ActionGroup>
-copy_actions (const RefPtr<ActionGroup> src)
-{
- RefPtr<ActionGroup> grp = ActionGroup::create (src->get_name());
-
- ListHandle<RefPtr<Action> > group_actions = src->get_actions();
-
- for (ListHandle<RefPtr<Action> >::iterator a = group_actions.begin(); a != group_actions.end(); ++a) {
- RefPtr<Action> act = Action::create ((*a)->get_name(), (*a)->property_label());
- grp->add (act);
- }
-
- return grp;
-}
-
-int
-main (int argc, char* argv[])
-{
- Main app (argc, argv);
- Window hidden (WINDOW_TOPLEVEL);
- Window window (WINDOW_TOPLEVEL);
- Window other_window (WINDOW_TOPLEVEL);
- Button button ("click me for baz");
- Button other_button ("click me for baz");
- VBox vpacker;
- VBox other_vpacker;
-
- Glib::RefPtr<ActionGroup> actions;
- Glib::RefPtr<ActionGroup> other_actions;
- Glib::RefPtr<ActionGroup> shared_actions;
- Glib::RefPtr<UIManager> uimanager;
- Glib::RefPtr<UIManager> other_uimanager;
- Glib::RefPtr<UIManager> shared_uimanager;
-
- window.set_name ("Editor");
- window.set_title ("Editor");
-
- other_window.set_name ("Other");
- other_window.set_title ("Other");
-
- uimanager = UIManager::create();
- other_uimanager = UIManager::create();
- shared_uimanager = UIManager::create();
-
- actions = ActionGroup::create("MyActions");
- other_actions = ActionGroup::create("OtherActions");
- shared_actions = ActionGroup::create("SharedActions");
-
- uimanager->add_ui_from_file ("mtest.menus");
- other_uimanager->add_ui_from_file ("mtest_other.menus");
-
- // AccelMap::load ("mtest.bindings");
-
- RefPtr<AccelGroup> accels = hidden.get_accel_group();
-
- make_action (actions, "TopMenu", "top");
- make_action (actions, "Foo", "foo", accels, sigc::bind (sigc::ptr_fun (printit), "foo"), GDK_p, Gdk::ModifierType (0));
-
- make_action (other_actions, "OTopMenu", "otop");
- make_action (other_actions, "OFoo", "foo", accels, sigc::bind (sigc::ptr_fun (printit), "o-foo"), GDK_p, Gdk::ModifierType (0));
-
- make_action (shared_actions, "Bar", "bar", accels, sigc::bind (sigc::ptr_fun (printit), "barshared"), GDK_p, Gdk::CONTROL_MASK);
- RefPtr<Action> act = make_action (shared_actions, "Baz", "baz", accels, sigc::bind (sigc::ptr_fun (printit), "baz-shared"), GDK_p, Gdk::SHIFT_MASK);
-
- act->connect_proxy (button);
- act->connect_proxy (other_button);
-
- uimanager->insert_action_group (copy_actions (actions));
- uimanager->insert_action_group (copy_actions (shared_actions));
- other_uimanager->insert_action_group (copy_actions (other_actions));
- other_uimanager->insert_action_group (copy_actions (shared_actions));
-
- other_window.add_accel_group (accels);
- // window.add_accel_group (accels);
-
- Gtk::MenuBar* m;
-
- m = dynamic_cast<MenuBar*>(other_uimanager->get_widget ("/OTop"));
-
- other_vpacker.pack_start (*m);
- other_vpacker.pack_start (other_button);
-
- other_window.add (other_vpacker);
- other_window.show_all ();
-
- m = dynamic_cast<MenuBar*>(uimanager->get_widget ("/Top"));
-
- vpacker.pack_start (*m);
- vpacker.pack_start (button);
-
- window.add (vpacker);
- window.show_all ();
-
- Settings::get_default()->property_gtk_can_change_accels() = true;
-
- AccelMap::save ("mtest.bindings");
-
- app.run ();
-
- return 0;
-}
diff --git a/gtk2_ardour/nag.cc b/gtk2_ardour/nag.cc
index 61a8e1a..d553efd 100644
--- a/gtk2_ardour/nag.cc
+++ b/gtk2_ardour/nag.cc
@@ -30,7 +30,7 @@
#include "ardour/rc_configuration.h"
#include "nag.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
diff --git a/gtk2_ardour/new_plugin_preset_dialog.cc b/gtk2_ardour/new_plugin_preset_dialog.cc
index cc5c4b9..70926f5 100644
--- a/gtk2_ardour/new_plugin_preset_dialog.cc
+++ b/gtk2_ardour/new_plugin_preset_dialog.cc
@@ -20,7 +20,7 @@
#include <gtkmm/stock.h>
#include "new_plugin_preset_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/normalize_dialog.cc b/gtk2_ardour/normalize_dialog.cc
index 9872bcb..85b7b0b 100644
--- a/gtk2_ardour/normalize_dialog.cc
+++ b/gtk2_ardour/normalize_dialog.cc
@@ -23,7 +23,7 @@
#include <gtkmm/stock.h>
#include <gtkmm/progressbar.h>
#include "normalize_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
@@ -46,7 +46,7 @@ NormalizeDialog::NormalizeDialog (bool more_than_one)
_spin->set_value (_last_normalization_value);
_spin->set_activates_default ();
hbox->pack_start (*_spin, false, false);
- hbox->pack_start (*manage (new Label (_("dbFS"))), false, false);
+ hbox->pack_start (*manage (new Label (_("dBFS"))), false, false);
get_vbox()->pack_start (*hbox);
if (more_than_one) {
@@ -95,6 +95,10 @@ NormalizeDialog::target () const
void
NormalizeDialog::update_progress_gui (float p)
{
+ /* Normalization is run inside the GUI thread, so we can directly
+ * update the progress bar when notified about progress.
+ */
+
_progress_bar->set_fraction (p);
}
diff --git a/gtk2_ardour/note.cc b/gtk2_ardour/note.cc
index ea12712..6e1878a 100644
--- a/gtk2_ardour/note.cc
+++ b/gtk2_ardour/note.cc
@@ -98,6 +98,12 @@ Note::hide ()
}
void
+Note::set (ArdourCanvas::Rect rect)
+{
+ _rectangle->set (rect);
+}
+
+void
Note::set_x0 (Coord x0)
{
_rectangle->set_x0 (x0);
diff --git a/gtk2_ardour/note.h b/gtk2_ardour/note.h
index 37d5573..c294962 100644
--- a/gtk2_ardour/note.h
+++ b/gtk2_ardour/note.h
@@ -46,6 +46,7 @@ public:
ArdourCanvas::Coord x1 () const;
ArdourCanvas::Coord y1 () const;
+ void set (ArdourCanvas::Rect);
void set_x0 (ArdourCanvas::Coord);
void set_y0 (ArdourCanvas::Coord);
void set_x1 (ArdourCanvas::Coord);
diff --git a/gtk2_ardour/note_base.cc b/gtk2_ardour/note_base.cc
index 9c47fa7..ff0ec34 100644
--- a/gtk2_ardour/note_base.cc
+++ b/gtk2_ardour/note_base.cc
@@ -119,9 +119,9 @@ NoteBase::on_channel_selection_change(uint16_t selection)
{
// make note change its color if its channel is not marked active
if ( (selection & (1 << _note->channel())) == 0 ) {
- set_fill_color(UIConfiguration::instance().color ("midi note inactive channel"));
- set_outline_color(calculate_outline(UIConfiguration::instance().color ("midi note inactive channel"),
- _selected));
+ const ArdourCanvas::Color inactive_ch = UIConfiguration::instance().color ("midi note inactive channel");
+ set_fill_color(inactive_ch);
+ set_outline_color(calculate_outline(inactive_ch, _selected));
} else {
// set the color according to the notes selection state
set_selected(_selected);
@@ -146,9 +146,11 @@ NoteBase::set_selected(bool selected)
}
_selected = selected;
- set_fill_color (base_color());
- set_outline_color(calculate_outline(base_color(), _selected));
+ const uint32_t base_col = base_color();
+ set_fill_color (base_col);
+
+ set_outline_color(calculate_outline(base_col, _selected));
}
#define SCALE_USHORT_TO_UINT8_T(x) ((x) / 257)
@@ -166,8 +168,8 @@ NoteBase::base_color()
switch (mode) {
case TrackColor:
{
- uint32_t color = _region.midi_stream_view()->get_region_color();
- return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (color, opacity),
+ const uint32_t region_color = _region.midi_stream_view()->get_region_color();
+ return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (region_color, opacity),
UIConfiguration::instance().color ("midi note selected"),
0.5);
}
diff --git a/gtk2_ardour/note_base.h b/gtk2_ardour/note_base.h
index 059aa9d..d55f87c 100644
--- a/gtk2_ardour/note_base.h
+++ b/gtk2_ardour/note_base.h
@@ -23,7 +23,6 @@
#include <boost/shared_ptr.hpp>
#include "canvas/types.h"
-#include "evoral/types.hpp"
#include "rgb_macros.h"
#include "ui_config.h"
@@ -33,6 +32,7 @@ class MidiRegionView;
namespace Evoral {
template<typename T> class Note;
+ class Beats;
}
namespace ArdourCanvas {
diff --git a/gtk2_ardour/note_select_dialog.cc b/gtk2_ardour/note_select_dialog.cc
index 14d45cc..203213e 100644
--- a/gtk2_ardour/note_select_dialog.cc
+++ b/gtk2_ardour/note_select_dialog.cc
@@ -21,7 +21,7 @@
#include "note_select_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
static void
_note_on_event_handler(GtkWidget* /*widget*/, int note, gpointer arg)
diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc
index e963726..9809b05 100644
--- a/gtk2_ardour/option_editor.cc
+++ b/gtk2_ardour/option_editor.cc
@@ -1,19 +1,19 @@
/*
- Copyright (C) 2001-2009 Paul Davis
+ Copyright (C) 2001-2009 Paul Davis
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <algorithm>
@@ -30,12 +30,13 @@
#include "pbd/configuration.h"
#include "pbd/replace_all.h"
+#include "pbd/strsplit.h"
#include "gui_thread.h"
#include "option_editor.h"
#include "public_editor.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -469,26 +470,25 @@ OptionEditorPage::OptionEditorPage (Gtk::Notebook& n, std::string const & t)
* @param o Configuration to edit.
* @param t Title for the dialog.
*/
-OptionEditor::OptionEditor (PBD::Configuration* c, std::string const & t)
- : ArdourWindow (t), _config (c)
+OptionEditor::OptionEditor (PBD::Configuration* c)
+ : _config (c)
+ , option_tree (TreeStore::create (option_columns))
+ , option_treeview (option_tree)
{
using namespace Notebook_Helpers;
- set_default_size (300, 300);
- // set_wmclass (X_("ardour_preferences"), PROGRAM_NAME);
-
- set_name ("Preferences");
- add_events (Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);
-
- set_border_width (4);
-
- add (_notebook);
-
- _notebook.set_show_tabs (true);
+ _notebook.set_show_tabs (false);
_notebook.set_show_border (true);
_notebook.set_name ("OptionsNotebook");
- show_all_children();
+ option_treeview.append_column ("", option_columns.name);
+ option_treeview.set_enable_search(true);
+ option_treeview.set_search_column(0);
+ option_treeview.set_name ("OptionsTreeView");
+ option_treeview.set_headers_visible (false);
+
+ option_treeview.get_selection()->set_mode (Gtk::SELECTION_SINGLE);
+ option_treeview.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &OptionEditor::treeview_row_selected));
/* Watch out for changes to parameters */
_config->ParameterChanged.connect (config_connection, invalidator (*this), boost::bind (&OptionEditor::parameter_changed, this, _1), gui_context());
@@ -519,6 +519,82 @@ OptionEditor::parameter_changed (std::string const & p)
}
}
+void
+OptionEditor::treeview_row_selected ()
+{
+ Glib::RefPtr<Gtk::TreeSelection> selection = option_treeview.get_selection();
+ TreeModel::iterator iter = selection->get_selected();
+ if(iter) {
+ TreeModel::Row row = *iter;
+ Gtk::Widget* w = row[option_columns.widget];
+ if (w) {
+ _notebook.set_current_page (_notebook.page_num (*w));
+ }
+ }
+}
+
+TreeModel::iterator
+OptionEditor::find_path_in_treemodel (std::string const & pn, bool create_missing)
+{
+ /* split page name, which is actually a path, into each component */
+
+ std::vector<std::string> components;
+ split (pn, components, '/');
+
+ /* start with top level children */
+
+ TreeModel::Children children = option_tree->children();
+ TreeModel::iterator iter;
+
+ /* foreach path component ... */
+
+ for (std::vector<std::string>::const_iterator s = components.begin(); s != components.end(); ++s) {
+
+ for (iter = children.begin(); iter != children.end(); ++iter) {
+ TreeModel::Row row = *iter;
+ const std::string row_name = row[option_columns.name];
+ if (row_name == (*s)) {
+ break;
+ }
+ }
+
+ if (iter == children.end()) {
+ /* the current component is missing; bail out or create it */
+ if (!create_missing) {
+ return option_tree->get_iter(TreeModel::Path(""));
+ } else {
+ iter = option_tree->append (children);
+ TreeModel::Row row = *iter;
+ row[option_columns.name] = *s;
+ row[option_columns.widget] = 0;
+ }
+ }
+
+ /* from now on, iter points to a valid row, either the one we found or a new one */
+ /* set children to the row's children to continue searching */
+ children = (*iter)->children ();
+
+ }
+
+ return iter;
+}
+
+void
+OptionEditor::add_path_to_treeview (std::string const & pn, Gtk::Widget& widget)
+{
+ option_treeview.set_model (Glib::RefPtr<TreeStore>());
+
+ TreeModel::iterator row_iter = find_path_in_treemodel(pn, true);
+
+ assert(row_iter);
+
+ TreeModel::Row row = *row_iter;
+ row[option_columns.widget] = &widget;
+
+ option_treeview.set_model (option_tree);
+ option_treeview.expand_all ();
+}
+
/** Add a component to a given page.
* @param pn Page name (will be created if it doesn't already exist)
* @param o Component.
@@ -527,7 +603,10 @@ void
OptionEditor::add_option (std::string const & pn, OptionEditorComponent* o)
{
if (_pages.find (pn) == _pages.end()) {
- _pages[pn] = new OptionEditorPage (_notebook, pn);
+ OptionEditorPage* oep = new OptionEditorPage (_notebook, pn);
+ _pages[pn] = oep;
+
+ add_path_to_treeview (pn, oep->box);
}
OptionEditorPage* p = _pages[pn];
@@ -545,7 +624,9 @@ void
OptionEditor::add_page (std::string const & pn, Gtk::Widget& w)
{
if (_pages.find (pn) == _pages.end()) {
- _pages[pn] = new OptionEditorPage (_notebook, pn);
+ OptionEditorPage* oep = new OptionEditorPage (_notebook, pn);
+ _pages[pn] = oep;
+ add_path_to_treeview (pn, oep->box);
}
OptionEditorPage* p = _pages[pn];
@@ -555,15 +636,12 @@ OptionEditor::add_page (std::string const & pn, Gtk::Widget& w)
void
OptionEditor::set_current_page (string const & p)
{
- int i = 0;
- while (i < _notebook.get_n_pages ()) {
- if (_notebook.get_tab_label_text (*_notebook.get_nth_page (i)) == p) {
- _notebook.set_current_page (i);
- return;
- }
+ TreeModel::iterator row_iter = find_path_in_treemodel(p);
- ++i;
+ if (row_iter) {
+ option_treeview.get_selection()->select(row_iter);
}
+
}
@@ -597,3 +675,33 @@ DirectoryOption::selection_changed ()
{
_set (poor_mans_glob(_file_chooser.get_filename ()));
}
+
+/*--------------------------*/
+
+OptionEditorContainer::OptionEditorContainer (PBD::Configuration* c, string const& str)
+ : OptionEditor (c)
+{
+ set_border_width (4);
+ hpacker.pack_start (treeview(), false, false);
+ hpacker.pack_start (notebook(), true, true);
+ pack_start (hpacker, true, true);
+
+ hpacker.show_all ();
+ show ();
+}
+
+OptionEditorWindow::OptionEditorWindow (PBD::Configuration* c, string const& str)
+ : OptionEditor (c)
+ , ArdourWindow (str)
+{
+ container.set_border_width (4);
+ hpacker.pack_start (treeview(), false, false);
+ hpacker.pack_start (notebook(), true, true);
+
+ container.pack_start (hpacker, true, true);
+
+ hpacker.show_all ();
+ container.show ();
+
+ add (container);
+}
diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h
index 7637061..b5d44d5 100644
--- a/gtk2_ardour/option_editor.h
+++ b/gtk2_ardour/option_editor.h
@@ -25,7 +25,10 @@
#include <gtkmm/comboboxtext.h>
#include <gtkmm/spinbutton.h>
#include <gtkmm/table.h>
+#include <gtkmm/window.h>
+
#include "gtkmm2ext/slider_controller.h"
+
#include "ardour_window.h"
#include "audio_clock.h"
#include "ardour/types.h"
@@ -680,11 +683,11 @@ public:
};
/** The OptionEditor dialog base class */
-class OptionEditor : public ArdourWindow
+class OptionEditor : virtual public sigc::trackable
{
public:
- OptionEditor (PBD::Configuration *, std::string const &);
- ~OptionEditor ();
+ OptionEditor (PBD::Configuration *);
+ virtual ~OptionEditor ();
void add_option (std::string const &, OptionEditorComponent *);
void add_page (std::string const &, Gtk::Widget& page_widget);
@@ -692,19 +695,58 @@ public:
void set_current_page (std::string const &);
protected:
-
virtual void parameter_changed (std::string const &);
PBD::Configuration* _config;
+ Gtk::Notebook& notebook() { return _notebook; }
+ Gtk::TreeView& treeview() { return option_treeview; }
-private:
+ class OptionColumns : public Gtk::TreeModel::ColumnRecord
+ {
+ public:
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<Gtk::Widget*> widget;
- PBD::ScopedConnection config_connection;
+ OptionColumns() {
+ add (name);
+ add (widget);
+ }
+ };
+
+ OptionColumns option_columns;
+ Glib::RefPtr<Gtk::TreeStore> option_tree;
+private:
+ PBD::ScopedConnection config_connection;
Gtk::Notebook _notebook;
+ Gtk::TreeView option_treeview;
std::map<std::string, OptionEditorPage*> _pages;
+
+ void add_path_to_treeview (std::string const &, Gtk::Widget&);
+ Gtk::TreeModel::iterator find_path_in_treemodel (std::string const & pn,
+ bool create_missing = false);
+ void treeview_row_selected ();
};
-#endif /* __gtk_ardour_option_editor_h__ */
+/** The OptionEditor dialog-as-container base class */
+class OptionEditorContainer : public OptionEditor, public Gtk::VBox
+{
+public:
+ OptionEditorContainer (PBD::Configuration *, std::string const &);
+ ~OptionEditorContainer() {}
+private:
+ Gtk::HBox hpacker;
+};
+/** The OptionEditor dialog-as-container base class */
+class OptionEditorWindow : public OptionEditor, public ArdourWindow
+{
+public:
+ OptionEditorWindow (PBD::Configuration *, std::string const &);
+ ~OptionEditorWindow() {}
+private:
+ Gtk::VBox container;
+ Gtk::HBox hpacker;
+};
+#endif /* __gtk_ardour_option_editor_h__ */
diff --git a/gtk2_ardour/opts.cc b/gtk2_ardour/opts.cc
index 4e03983..98e72de 100644
--- a/gtk2_ardour/opts.cc
+++ b/gtk2_ardour/opts.cc
@@ -31,7 +31,7 @@
#include "opts.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
@@ -91,11 +91,6 @@ ARDOUR_COMMAND_LINE::parse_opts (int argc, char *argv[])
const char *optstring = "abBc:C:dD:hHk:E:m:N:nOp:PST:U:vV";
const char *execname = strrchr (argv[0], '/');
- if (getenv ("ARDOUR_SAE")) {
- menus_file = "ardour-sae.menus";
- keybindings_path = "SAE";
- }
-
if (execname == 0) {
execname = argv[0];
} else {
diff --git a/gtk2_ardour/panner2d.cc b/gtk2_ardour/panner2d.cc
index 7b9918b..9697cb3 100644
--- a/gtk2_ardour/panner2d.cc
+++ b/gtk2_ardour/panner2d.cc
@@ -43,7 +43,7 @@
#include "public_editor.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -1013,7 +1013,7 @@ Panner2dWindow::set_width ()
bool
Panner2dWindow::on_key_press_event (GdkEventKey* event)
{
- return relay_key_press (event, &PublicEditor::instance());
+ return relay_key_press (event, this);
}
bool
diff --git a/gtk2_ardour/panner_editor.cc b/gtk2_ardour/panner_editor.cc
index 0a1d9e8..6e04d9f 100644
--- a/gtk2_ardour/panner_editor.cc
+++ b/gtk2_ardour/panner_editor.cc
@@ -18,7 +18,7 @@
*/
#include "panner_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/panner_interface.cc b/gtk2_ardour/panner_interface.cc
index 91c2d17..dcbb364 100644
--- a/gtk2_ardour/panner_interface.cc
+++ b/gtk2_ardour/panner_interface.cc
@@ -23,7 +23,7 @@
#include "panner_interface.h"
#include "panner_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc
index 2df7a81..0818833 100644
--- a/gtk2_ardour/panner_ui.cc
+++ b/gtk2_ardour/panner_ui.cc
@@ -36,7 +36,7 @@
#include "mono_panner.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/patch_change.cc b/gtk2_ardour/patch_change.cc
index c8d003f..4006cbd 100644
--- a/gtk2_ardour/patch_change.cc
+++ b/gtk2_ardour/patch_change.cc
@@ -183,7 +183,7 @@ PatchChange::event_handler (GdkEvent* ev)
}
}
- if (ev->button.button == 3) {
+ if (Gtkmm2ext::Keyboard::is_context_menu_event (&ev->button)) {
if (!_popup_initialized) {
initialize_popup_menus();
_popup_initialized = true;
diff --git a/gtk2_ardour/patch_change_dialog.cc b/gtk2_ardour/patch_change_dialog.cc
index 1c0d824..9bb339f 100644
--- a/gtk2_ardour/patch_change_dialog.cc
+++ b/gtk2_ardour/patch_change_dialog.cc
@@ -33,7 +33,7 @@
#include "patch_change_dialog.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/pingback.cc b/gtk2_ardour/pingback.cc
index bbcd441..43594a6 100644
--- a/gtk2_ardour/pingback.cc
+++ b/gtk2_ardour/pingback.cc
@@ -28,8 +28,6 @@
#include <sys/utsname.h>
#endif
-#include <curl/curl.h>
-
#include "pbd/gstdio_compat.h"
#include <glibmm/miscutils.h>
@@ -39,31 +37,13 @@
#include "ardour/filesystem_paths.h"
#include "ardour/rc_configuration.h"
+#include "ardour_http.h"
#include "pingback.h"
+#include "utils.h"
using std::string;
using namespace ARDOUR;
-static size_t
-curl_write_data (char *bufptr, size_t size, size_t nitems, void *ptr)
-{
- /* we know its a string */
-
- string* sptr = (string*) ptr;
-
- for (size_t i = 0; i < nitems; ++i) {
- for (size_t n = 0; n < size; ++n) {
- if (*bufptr == '\n') {
- break;
- }
-
- (*sptr) += *bufptr++;
- }
- }
-
- return size * nitems;
-}
-
struct ping_call {
std::string version;
std::string announce_path;
@@ -103,19 +83,12 @@ _query_registry (const char *regkey, const char *regval, std::string &rv) {
static void*
_pingback (void *arg)
{
+ ArdourCurl::HttpGet h;
+
ping_call* cm = static_cast<ping_call*> (arg);
- CURL* c;
string return_str;
//initialize curl
- curl_global_init (CURL_GLOBAL_NOTHING);
- c = curl_easy_init ();
-
- curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, curl_write_data);
- curl_easy_setopt (c, CURLOPT_WRITEDATA, &return_str);
- char errbuf[CURL_ERROR_SIZE];
- curl_easy_setopt (c, CURLOPT_ERRORBUFFER, errbuf);
-
string url;
#ifdef __APPLE__
@@ -131,10 +104,10 @@ _pingback (void *arg)
return 0;
}
- char* v = curl_easy_escape (c, cm->version.c_str(), cm->version.length());
+ char* v = h.escape (cm->version.c_str(), cm->version.length());
url += v;
url += '?';
- free (v);
+ h.free (v);
#ifndef PLATFORM_WINDOWS
struct utsname utb;
@@ -148,30 +121,30 @@ _pingback (void *arg)
string s;
char* query;
- query = curl_easy_escape (c, utb.sysname, strlen (utb.sysname));
+ query = h.escape (utb.sysname, strlen (utb.sysname));
s = string_compose ("s=%1", query);
url += s;
url += '&';
- free (query);
+ h.free (query);
- query = curl_easy_escape (c, utb.release, strlen (utb.release));
+ query = h.escape (utb.release, strlen (utb.release));
s = string_compose ("r=%1", query);
url += s;
url += '&';
- free (query);
+ h.free (query);
- query = curl_easy_escape (c, utb.machine, strlen (utb.machine));
+ query = h.escape (utb.machine, strlen (utb.machine));
s = string_compose ("m=%1", query);
url += s;
- free (query);
+ h.free (query);
#else
std::string val;
if (_query_registry("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "ProductName", val)) {
- char* query = curl_easy_escape (c, val.c_str(), strlen (val.c_str()));
+ char* query = h.escape (val.c_str(), strlen (val.c_str()));
url += "r=";
url += query;
url += '&';
- free (query);
+ h.free (query);
} else {
url += "r=&";
}
@@ -182,11 +155,11 @@ _pingback (void *arg)
if (string::npos != cut) {
val = val.substr (0, cut);
}
- char* query = curl_easy_escape (c, val.c_str(), strlen (val.c_str()));
+ char* query = h.escape (val.c_str(), strlen (val.c_str()));
url += "m=";
url += query;
url += '&';
- free (query);
+ h.free (query);
} else {
url += "m=&";
}
@@ -199,20 +172,9 @@ _pingback (void *arg)
#endif /* PLATFORM_WINDOWS */
- curl_easy_setopt (c, CURLOPT_URL, url.c_str());
-
- return_str = "";
-
- if (curl_easy_perform (c) == 0) {
- long http_status;
-
- curl_easy_getinfo (c, CURLINFO_RESPONSE_CODE, &http_status);
-
- if (http_status != 200) {
- std::cerr << "Bad HTTP status" << std::endl;
- return 0;
- }
+ return_str = h.get (url);
+ if (!return_str.empty ()) {
if ( return_str.length() > 140 ) { // like a tweet :)
std::cerr << "Announcement string is too long (probably behind a proxy)." << std::endl;
} else {
@@ -229,10 +191,9 @@ _pingback (void *arg)
}
}
} else {
- std::cerr << "curl failed: " << errbuf << std::endl;
+ std::cerr << "curl failed: " << h.error () << std::endl;
}
- curl_easy_cleanup (c);
delete cm;
return 0;
}
@@ -241,6 +202,13 @@ namespace ARDOUR {
void pingback (const string& version, const string& announce_path)
{
+ if (ARDOUR_UI_UTILS::running_from_source_tree ()) {
+ /* we don't ping under these conditions, because the user is
+ probably just paul or robin :)
+ */
+ return;
+ }
+
ping_call* cm = new ping_call (version, announce_path);
pthread_t thread;
diff --git a/gtk2_ardour/pixmaps/forwardblarrow.xpm b/gtk2_ardour/pixmaps/forwardblarrow.xpm
deleted file mode 100644
index 9088a9f..0000000
--- a/gtk2_ardour/pixmaps/forwardblarrow.xpm
+++ /dev/null
@@ -1,17 +0,0 @@
-/* XPM */
-static const gchar * forwdblarrow_xpm[] = {
-"20 11 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" .. ",
-" .+. ",
-" .++. ",
-" ..............+++. ",
-" .+++++++++++++++++.",
-" ...................",
-" .+++++++++++++++++.",
-" ..............+++. ",
-" .++. ",
-" .+. ",
-" .. "};
diff --git a/gtk2_ardour/pixmaps/h_meter_strip.xpm b/gtk2_ardour/pixmaps/h_meter_strip.xpm
deleted file mode 100644
index b112772..0000000
--- a/gtk2_ardour/pixmaps/h_meter_strip.xpm
+++ /dev/null
@@ -1,195 +0,0 @@
-/* XPM */
-static const gchar *h_meter_strip_xpm[] = {
-"186 5 187 2",
-" c None",
-". c #2BFE00",
-"+ c #2DFE00",
-"@ c #2FFE01",
-"# c #32FE01",
-"$ c #34FE02",
-"% c #36FE02",
-"& c #38FE03",
-"* c #3BFE03",
-"= c #3DFD04",
-"- c #3FFD04",
-"; c #41FD05",
-"> c #44FD05",
-", c #46FD06",
-"' c #48FD06",
-") c #4AFD07",
-"! c #4DFD07",
-"~ c #4FFD08",
-"{ c #51FC08",
-"] c #53FC09",
-"^ c #56FC09",
-"/ c #58FC09",
-"( c #5AFC0A",
-"_ c #5CFC0A",
-": c #5FFC0B",
-"< c #61FC0B",
-"[ c #63FB0C",
-"} c #65FB0C",
-"| c #68FB0D",
-"1 c #6AFB0D",
-"2 c #6CFB0E",
-"3 c #6EFB0E",
-"4 c #71FB0F",
-"5 c #73FB0F",
-"6 c #75FB10",
-"7 c #77FA10",
-"8 c #7AFA11",
-"9 c #7CFA11",
-"0 c #7EFA12",
-"a c #80FA12",
-"b c #83FA12",
-"c c #85FA13",
-"d c #87FA13",
-"e c #89FA14",
-"f c #8CF914",
-"g c #8EF915",
-"h c #90F915",
-"i c #92F916",
-"j c #95F916",
-"k c #97F917",
-"l c #99F917",
-"m c #9BF918",
-"n c #9EF818",
-"o c #A0F819",
-"p c #A2F819",
-"q c #A4F81A",
-"r c #A7F81A",
-"s c #A9F81A",
-"t c #ABF81B",
-"u c #ADF81B",
-"v c #B0F81C",
-"w c #B2F71C",
-"x c #B4F71D",
-"y c #B6F71D",
-"z c #B9F71E",
-"A c #BBF71E",
-"B c #BDF71F",
-"C c #BFF71F",
-"D c #C2F720",
-"E c #C4F720",
-"F c #C6F621",
-"G c #C8F621",
-"H c #CBF622",
-"I c #CDF622",
-"J c #CFF623",
-"K c #D1F623",
-"L c #D4F624",
-"M c #D6F624",
-"N c #D8F524",
-"O c #DAF525",
-"P c #DDF525",
-"Q c #DFF526",
-"R c #E1F526",
-"S c #E3F527",
-"T c #E6F527",
-"U c #E8F528",
-"V c #EAF528",
-"W c #ECF429",
-"X c #EFF429",
-"Y c #F1F42A",
-"Z c #F3F42A",
-"` c #F5F42B",
-" . c #F8F42B",
-".. c #FAF42C",
-"+. c #FCF42C",
-"@. c #FFF42D",
-"#. c #FFF22C",
-"$. c #FFF12B",
-"%. c #FFF02A",
-"&. c #FFEF2A",
-"*. c #FFEE29",
-"=. c #FFED28",
-"-. c #FFEC28",
-";. c #FFEB27",
-">. c #FFE926",
-",. c #FFE826",
-"'. c #FFE725",
-"). c #FFE624",
-"!. c #FFE524",
-"~. c #FFE423",
-"{. c #FFE322",
-"]. c #FFE222",
-"^. c #FFE021",
-"/. c #FFDF20",
-"(. c #FFDE20",
-"_. c #FFDD1F",
-":. c #FFDC1E",
-"<. c #FFDB1E",
-"[. c #FFDA1D",
-"}. c #FFD91C",
-"|. c #FFD71B",
-"1. c #FFD61B",
-"2. c #FFD51A",
-"3. c #FFD419",
-"4. c #FFD319",
-"5. c #FFD218",
-"6. c #FFD117",
-"7. c #FFD017",
-"8. c #FFCF16",
-"9. c #FFCD15",
-"0. c #FFCC15",
-"a. c #FFCB14",
-"b. c #FFCA13",
-"c. c #FFC913",
-"d. c #FFC812",
-"e. c #FFC711",
-"f. c #FFC611",
-"g. c #FFC410",
-"h. c #FFC30F",
-"i. c #FFC20F",
-"j. c #FFC10E",
-"k. c #FFC00D",
-"l. c #FFBF0C",
-"m. c #FFBE0C",
-"n. c #FFBD0B",
-"o. c #FFBB0A",
-"p. c #FFBA0A",
-"q. c #FFB909",
-"r. c #FFB808",
-"s. c #FFB708",
-"t. c #FFB607",
-"u. c #FFB506",
-"v. c #FFB406",
-"w. c #FFB205",
-"x. c #FFB104",
-"y. c #FFB004",
-"z. c #FFAF03",
-"A. c #FFAE02",
-"B. c #FFAD02",
-"C. c #FFAC01",
-"D. c #FFAB00",
-"E. c #FFA900",
-"F. c #F11F00",
-"G. c #F21E00",
-"H. c #F21C00",
-"I. c #F31B00",
-"J. c #F31A00",
-"K. c #F41800",
-"L. c #F41700",
-"M. c #F51600",
-"N. c #F61400",
-"O. c #F61300",
-"P. c #F71100",
-"Q. c #F71000",
-"R. c #F80F00",
-"S. c #F90D00",
-"T. c #F90C00",
-"U. c #FA0B00",
-"V. c #FA0900",
-"W. c #FB0800",
-"X. c #FC0600",
-"Y. c #FC0500",
-"Z. c #FD0400",
-"`. c #FD0200",
-" + c #FE0100",
-".+ c #FE0000",
-"++ c #FF0000",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++"};
diff --git a/gtk2_ardour/pixmaps/hiin.xpm b/gtk2_ardour/pixmaps/hiin.xpm
deleted file mode 100644
index 24c248b..0000000
--- a/gtk2_ardour/pixmaps/hiin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * hiin_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #F6FA2A",
-"+ c #F6F92A",
-" ",
-" ",
-" ",
-" ",
-" .......+ ",
-" ........+ ",
-" ...... ",
-" ..... ",
-" .... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" .. ",
-" ... ",
-" ... ",
-" ... ",
-" ... ",
-" +.+ ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/hiout.xpm b/gtk2_ardour/pixmaps/hiout.xpm
deleted file mode 100644
index 7754594..0000000
--- a/gtk2_ardour/pixmaps/hiout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * hiout_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #F6F92A",
-"+ c #F6FA2A",
-" ",
-" ",
-" ",
-" ",
-" .+++++++ ",
-" .++++++++ ",
-" ++++++ ",
-" +++++ ",
-" ++++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" ++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" .+. ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/hslider00.xpm b/gtk2_ardour/pixmaps/hslider00.xpm
deleted file mode 100644
index 47d40e1..0000000
--- a/gtk2_ardour/pixmaps/hslider00.xpm
+++ /dev/null
@@ -1,179 +0,0 @@
-/* XPM */
-static char * hslider00_xpm[] = {
-"38 19 157 2",
-" c None",
-". c #8B8B8B",
-"+ c #8C8C8C",
-"@ c #949494",
-"# c #3C3C3C",
-"$ c #808080",
-"% c #858585",
-"& c #A7A7A7",
-"* c #B8B8B8",
-"= c #CCCCCC",
-"- c #DBDBDB",
-"; c #DEDEDE",
-"> c #FFFFFF",
-", c #E6E6E6",
-"' c #E5E5E5",
-") c #848484",
-"! c #2A2A2A",
-"~ c #383838",
-"{ c #DFDFDF",
-"] c #E2E2E2",
-"^ c #CBCBCB",
-"/ c #888888",
-"( c #626262",
-"_ c #090909",
-": c #6C6C6C",
-"< c #818181",
-"[ c #A1A1A1",
-"} c #ADADAD",
-"| c #C7C7C7",
-"1 c #D4D4D4",
-"2 c #D9D9D9",
-"3 c #D7D7D7",
-"4 c #D1D1D1",
-"5 c #D2D2D2",
-"6 c #CFCFCF",
-"7 c #DCDCDC",
-"8 c #BBBBBB",
-"9 c #696969",
-"0 c #000000",
-"a c #7C7C7C",
-"b c #D8D8D8",
-"c c #D5D5D5",
-"d c #DADADA",
-"e c #C5C5C5",
-"f c #B1B1B1",
-"g c #666666",
-"h c #515151",
-"i c #797979",
-"j c #A8A8A8",
-"k c #C8C8C8",
-"l c #DDDDDD",
-"m c #CACACA",
-"n c #B9B9B9",
-"o c #BDBDBD",
-"p c #646464",
-"q c #A2A2A2",
-"r c #D0D0D0",
-"s c #C2C2C2",
-"t c #D6D6D6",
-"u c #BEBEBE",
-"v c #A6A6A6",
-"w c #5D5D5D",
-"x c #4A4A4A",
-"y c #5C5C5C",
-"z c #6D6D6D",
-"A c #828282",
-"B c #A3A3A3",
-"C c #D3D3D3",
-"D c #AFAFAF",
-"E c #B6B6B6",
-"F c #CDCDCD",
-"G c #C0C0C0",
-"H c #9B9B9B",
-"I c #535353",
-"J c #3D3D3D",
-"K c #545454",
-"L c #7B7B7B",
-"M c #9E9E9E",
-"N c #E7E7E7",
-"O c #9F9F9F",
-"P c #636363",
-"Q c #BABABA",
-"R c #919191",
-"S c #4C4C4C",
-"T c #4E4E4E",
-"U c #787878",
-"V c #999999",
-"W c #BFBFBF",
-"X c #E8E8E8",
-"Y c #C3C3C3",
-"Z c #989898",
-"` c #C6C6C6",
-" . c #ABABAB",
-".. c #B5B5B5",
-"+. c #8A8A8A",
-"@. c #494949",
-"#. c #595959",
-"$. c #959595",
-"%. c #C4C4C4",
-"&. c #B4B4B4",
-"*. c #616161",
-"=. c #CECECE",
-"-. c #B2B2B2",
-";. c #555555",
-">. c #929292",
-",. c #8D8D8D",
-"'. c #5E5E5E",
-"). c #C9C9C9",
-"!. c #A5A5A5",
-"~. c #8F8F8F",
-"{. c #BCBCBC",
-"]. c #898989",
-"^. c #B3B3B3",
-"/. c #AEAEAE",
-"(. c #B7B7B7",
-"_. c #B0B0B0",
-":. c #A9A9A9",
-"<. c #AAAAAA",
-"[. c #585858",
-"}. c #7F7F7F",
-"|. c #7D7D7D",
-"1. c #565656",
-"2. c #ACACAC",
-"3. c #9C9C9C",
-"4. c #878787",
-"5. c #979797",
-"6. c #505050",
-"7. c #7A7A7A",
-"8. c #8E8E8E",
-"9. c #969696",
-"0. c #6B6B6B",
-"a. c #838383",
-"b. c #A0A0A0",
-"c. c #747474",
-"d. c #757575",
-"e. c #3F3F3F",
-"f. c #727272",
-"g. c #909090",
-"h. c #717171",
-"i. c #484848",
-"j. c #4D4D4D",
-"k. c #707070",
-"l. c #686868",
-"m. c #353535",
-"n. c #656565",
-"o. c #606060",
-"p. c #5B5B5B",
-"q. c #6A6A6A",
-"r. c #5F5F5F",
-"s. c #4B4B4B",
-"t. c #373737",
-"u. c #202020",
-"v. c #131313",
-"w. c #0B0B0B",
-"x. c #060606",
-"y. c #030303",
-"z. c #010101",
-" . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + # ",
-"$ % & * = - ; > > > > > > > , ' > ) ! ~ % > { ; ] > > > > > > > > > ^ / ( _ ",
-": < [ } | 1 - 2 3 3 4 4 5 5 6 7 8 9 0 0 a * b 7 c c 7 d c c - 2 4 e f g h 0 ",
-"g i + j k c l 3 1 1 ^ = m m n l o p 0 0 a n 1 q r r ; s r r t f | u v w x 0 ",
-"y z A B s t ' C l l m 6 ^ ^ & d D p 0 0 a E t q F F 7 q ^ ^ 5 f G 8 H I J 0 ",
-"K p L M G b N 3 - - e ^ | | O b o P 0 0 a * b q ^ ^ - q | | 4 f n Q R S ~ 0 ",
-"T w U V W d X b 2 2 G k Y Y Z b D ( 0 0 a * b q ^ ^ - q ` ` r ...n +.S ~ 0 ",
-"@.#.U $.o - X b 3 3 8 %.W W R 3 &.*.0 0 a ..3 q m m d q ` ` =.& -...% S ~ 0 ",
-"@.;.z >.8 7 X d c c E G Q Q ,.b f '.0 0 a -.c q ).).2 q ` ` = !.D f A S ~ 0 ",
-"@.K z ~.n l X 2 C C f {.&.&.].2 &.w 0 0 a ^.C q k k b q m m = B /.} $ S ~ 0 ",
-"@.K z + (.l { ; 4 4 } .././.% 2 E #.0 0 a _.4 q k k 3 q ).).= B } :.$ S ~ 0 ",
-"@.I z +.E l l 7 r r <.D j j < 2 o [.0 0 a /.6 q | | c q ).).F q } & }.S ~ 0 ",
-"@.I z ].E 7 - 3 6 6 & j q q |.2 E 1.0 0 a 2.= q ` ` 5 q k k F q } & }.S ~ 0 ",
-"@.I z / E - b 5 = = !.[ 3.3.a 2 /.I 0 0 a :.| q s s =.q Y Y m q 2.& }.S ~ 0 ",
-"@.I z 4.E l 7 b k ).@ 5.$.$.L t !.6.0 0 a !.G q o o ).q Q Q e q .j }.S ~ 0 ",
-"@.I z 4.^.5 k Y o ^.~.+.+.+.7./.5. at .0 0 a V [ 3.v v &.8.B B -.q 9.+.0.S ~ 0 ",
-"@.I ( a.3.b.~.a.|.|.7.7.c.% i c.d.e.0 0 a + ~.d.a a ].f.7.7.g.|.i h.P i.~ 0 ",
-"i.j.P ( 0.: : 0.k.: 9 ( w l.p 0.P m.0 0 i.n.g o.P w p.p p.q.'.r.p *.r.p.S 0 ",
-" o.s.t.u.v.w.x.y.z.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "};
diff --git a/gtk2_ardour/pixmaps/hslider01.xpm b/gtk2_ardour/pixmaps/hslider01.xpm
deleted file mode 100644
index 65b51b7..0000000
--- a/gtk2_ardour/pixmaps/hslider01.xpm
+++ /dev/null
@@ -1,25 +0,0 @@
-/* XPM */
-static char * hslider01_xpm[] = {
-"149 20 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-".....................................................................................................................................................",
-".....................................................................................................................................................",
-".....................................................................................................................................................",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/left_arrow.xpm b/gtk2_ardour/pixmaps/left_arrow.xpm
deleted file mode 100644
index 819f19b..0000000
--- a/gtk2_ardour/pixmaps/left_arrow.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * left_arrow_xpm[] = {
-"12 12 7 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"@ c #020202",
-"# c #0B0B0B",
-"$ c #131313",
-"% c #121212",
-" .... ",
-" ..++. ",
-" ..++.. ",
-" ..++.. ",
-" ..++.. ",
-" ..++.. ",
-" ..++ at . ",
-" ..++#. ",
-" ..++$. ",
-" ..++%. ",
-" ..++. ",
-" .... "};
diff --git a/gtk2_ardour/pixmaps/linin.xpm b/gtk2_ardour/pixmaps/linin.xpm
deleted file mode 100644
index 01f7c3b..0000000
--- a/gtk2_ardour/pixmaps/linin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * linin_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #FDFD00",
-"+ c #FEFE00",
-" ",
-" ",
-" ",
-" ",
-" .+. ",
-" +++. ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" +++. ",
-" +++ ",
-" +++ ",
-" +++ ",
-" .+++ ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" .+++ ",
-" .++ ",
-" + ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/linout.xpm b/gtk2_ardour/pixmaps/linout.xpm
deleted file mode 100644
index f38a849..0000000
--- a/gtk2_ardour/pixmaps/linout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * linout_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #FDFD00",
-"+ c #FEFE00",
-" ",
-" ",
-" ",
-" .. ",
-" +++ ",
-" .+++ ",
-" ++++ ",
-" ++++ ",
-" +++. ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" .+++ ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" .. ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/loin.xpm b/gtk2_ardour/pixmaps/loin.xpm
deleted file mode 100644
index 856cf2e..0000000
--- a/gtk2_ardour/pixmaps/loin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * loin_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #F6F92A",
-"+ c #F6FA2A",
-" ",
-" ",
-" .+. ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" ++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" ++++ ",
-" +++++ ",
-" ++++++ ",
-" .++++++++ ",
-" .+++++++ ",
-" ",
-" ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/loop.xpm b/gtk2_ardour/pixmaps/loop.xpm
deleted file mode 100644
index 936c2e8..0000000
--- a/gtk2_ardour/pixmaps/loop.xpm
+++ /dev/null
@@ -1,122 +0,0 @@
-/* XPM */
-static const gchar * loop_xpm[] = {
-"17 25 94 2",
-" c None",
-". c #4C4C4C",
-"+ c #555555",
-"@ c #454545",
-"# c #242424",
-"$ c #5E5E5E",
-"% c #000000",
-"& c #6B6B6B",
-"* c #484848",
-"= c #4E4E4E",
-"- c #6A6A6A",
-"; c #717171",
-"> c #686868",
-", c #838383",
-"' c #888888",
-") c #676767",
-"! c #4A4A4A",
-"~ c #474747",
-"{ c #939393",
-"] c #949494",
-"^ c #9E9E9E",
-"/ c #4B4B4B",
-"( c #A1A1A1",
-"_ c #A0A0A0",
-": c #A5A5A5",
-"< c #B2B2B2",
-"[ c #646464",
-"} c #ADADAD",
-"| c #AAAAAA",
-"1 c #B1B1B1",
-"2 c #494949",
-"3 c #9A9A9A",
-"4 c #A2A2A2",
-"5 c #A7A7A7",
-"6 c #A8A8A8",
-"7 c #C1C1C1",
-"8 c #696969",
-"9 c #656565",
-"0 c #B6B6B6",
-"a c #404040",
-"b c #989898",
-"c c #9D9D9D",
-"d c #999999",
-"e c #A3A3A3",
-"f c #C4C4C4",
-"g c #707070",
-"h c #C2C2C2",
-"i c #9C9C9C",
-"j c #969696",
-"k c #A4A4A4",
-"l c #777777",
-"m c #979797",
-"n c #2F2F2F",
-"o c #A9A9A9",
-"p c #7D7D7D",
-"q c #6D6D6D",
-"r c #959595",
-"s c #AFAFAF",
-"t c #848484",
-"u c #7F7F7F",
-"v c #3B3B3B",
-"w c #9B9B9B",
-"x c #2B2B2B",
-"y c #BFBFBF",
-"z c #B3B3B3",
-"A c #8A8A8A",
-"B c #858585",
-"C c #2E2E2E",
-"D c #C3C3C3",
-"E c #B8B8B8",
-"F c #464646",
-"G c #8E8E8E",
-"H c #898989",
-"I c #8D8D8D",
-"J c #797979",
-"K c #BCBCBC",
-"L c #909090",
-"M c #8C8C8C",
-"N c #2A2A2A",
-"O c #747474",
-"P c #818181",
-"Q c #808080",
-"R c #C6C6C6",
-"S c #C0C0C0",
-"T c #787878",
-"U c #868686",
-"V c #878787",
-"W c #8B8B8B",
-"X c #666666",
-"Y c #BDBDBD",
-"Z c #929292",
-"` c #6C6C6C",
-" . c #505050",
-".. c #C8C8C8",
-" . + ",
-" @ # $ ",
-" @ % @ & ",
-" * % % = - ",
-" * % ; % = > ",
-" * % , ' % = ) ",
-"* ! ! ~ % { ] ^ % / . ! * ~ * + ",
-"~ % % % % ( _ : < % % % % % % % ) ",
-"* % $ [ % } | 1 % 2 3 ^ 4 5 6 % 7 ",
-"* % 8 9 % 0 0 % a b c d c _ e % f ",
-"* % g 8 % h % a b i b j c 4 k % 7 ",
-"* % l g % % . m i j j 3 n o o % 7 ",
-"~ % p l % q d i j r b # % 0 s % 7 ",
-"~ % t u v b w j r d x % % y z % 7 ",
-"~ % A B A b j ] d C % [ % D E % 7 ",
-"F % G H I { ] b C % q J % f K % 7 ",
-"~ % L M G { b N % O P Q % R S % 7 ",
-"+ % % % % % % % T U V W % % % % D ",
-" X 7 D 7 7 Y = % I Z b % 7 7 K 7 ",
-" ` = % ( : % 7 ",
-" 8 = % z % 7 ",
-" X / % % 7 ",
-" X .% .. ",
-" - 9 .. ",
-" q I "};
diff --git a/gtk2_ardour/pixmaps/loout.xpm b/gtk2_ardour/pixmaps/loout.xpm
deleted file mode 100644
index 316de02..0000000
--- a/gtk2_ardour/pixmaps/loout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * loout_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #F6F92A",
-"+ c #F6FA2A",
-" ",
-" ",
-" .. ",
-" ++ ",
-" ++ ",
-" ++ ",
-" ++ ",
-" ++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" ++++ ",
-" +++ ",
-" +++ ",
-" +++ ",
-" ++++ ",
-" +++++ ",
-" ++++++ ",
-" +++++++++. ",
-" ++++++++ ",
-" ++++. ",
-" ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/lr.xpm b/gtk2_ardour/pixmaps/lr.xpm
deleted file mode 100644
index b045c94..0000000
--- a/gtk2_ardour/pixmaps/lr.xpm
+++ /dev/null
@@ -1,16 +0,0 @@
-/* XPM */
-static const gchar * lr_xpm[] = {
-"11 11 2 1",
-" c None",
-". c #cccccc",
-" ",
-" ",
-" . . ",
-" . . ",
-" . . ",
-"...........",
-" . . ",
-" . . ",
-" . . ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/regin.xpm b/gtk2_ardour/pixmaps/regin.xpm
deleted file mode 100644
index f59730d..0000000
--- a/gtk2_ardour/pixmaps/regin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regin_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #FDFD00",
-"+ c #FEFE00",
-" ",
-" ",
-" ",
-" ",
-" .++++. ",
-" .++++++. ",
-" .+++++. ",
-" +++++. ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" .+++ ",
-" +++ ",
-" .++ ",
-" +++ ",
-" .++. ",
-" +++ ",
-" ++. ",
-" ++ ",
-" ++ ",
-" ++ ",
-" .. ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/regin2.xpm b/gtk2_ardour/pixmaps/regin2.xpm
deleted file mode 100644
index 4d7f849..0000000
--- a/gtk2_ardour/pixmaps/regin2.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regin2_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #FDFD00",
-"+ c #FEFE00",
-" ",
-" ",
-" .+. ",
-" +++ ",
-" +++ ",
-" ++. ",
-" .++ ",
-" +++ ",
-" ++. ",
-" .++ ",
-" +++ ",
-" .++. ",
-" +++ ",
-" +++. ",
-" ++++ ",
-" .++++ ",
-" .+++++ ",
-" .++++++. ",
-" .++++++. ",
-" ++++. ",
-" .. ",
-" ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/regout.xpm b/gtk2_ardour/pixmaps/regout.xpm
deleted file mode 100644
index 723a6ac..0000000
--- a/gtk2_ardour/pixmaps/regout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regout_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #FDFD00",
-"+ c #FEFE00",
-" ",
-" ",
-" ",
-" ",
-" .++++. ",
-" .++++++. ",
-" .+++++. ",
-" .+++++ ",
-" ++++ ",
-" ++++ ",
-" ++++ ",
-" +++. ",
-" +++ ",
-" ++. ",
-" +++ ",
-" .++. ",
-" +++ ",
-" .++ ",
-" ++ ",
-" ++ ",
-" ++ ",
-" .. ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/regout2.xpm b/gtk2_ardour/pixmaps/regout2.xpm
deleted file mode 100644
index ddb76df..0000000
--- a/gtk2_ardour/pixmaps/regout2.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regout2_xpm[] = {
-"25 25 3 1",
-" c None",
-". c #FDFD00",
-"+ c #FEFE00",
-" ",
-" ",
-" .+. ",
-" +++ ",
-" +++ ",
-" +++ ",
-" .++ ",
-" ++ ",
-" ++. ",
-" +++ ",
-" .++ ",
-" +++ ",
-" +++ ",
-" .+++ ",
-" ++++ ",
-" ++++ ",
-" +++++. ",
-" .+++++. ",
-" .++++++. ",
-" .+++++ ",
-" .+. ",
-" ",
-" ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/revdblarrow.xpm b/gtk2_ardour/pixmaps/revdblarrow.xpm
deleted file mode 100644
index 35f8b4d..0000000
--- a/gtk2_ardour/pixmaps/revdblarrow.xpm
+++ /dev/null
@@ -1,17 +0,0 @@
-/* XPM */
-static const gchar * revdblarrow_xpm[] = {
-"20 11 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" .. ",
-" .+. ",
-" .++. ",
-" ..............+++. ",
-" .+++++++++++++++++.",
-" ...................",
-" .+++++++++++++++++.",
-" .+++..............",
-" .++. ",
-" .+. ",
-" .. "};
diff --git a/gtk2_ardour/pixmaps/right_arrow.xpm b/gtk2_ardour/pixmaps/right_arrow.xpm
deleted file mode 100644
index 7c77303..0000000
--- a/gtk2_ardour/pixmaps/right_arrow.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * right_arrow_xpm[] = {
-"12 12 7 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"@ c #020202",
-"# c #0B0B0B",
-"$ c #131313",
-"% c #121212",
-" .... ",
-" .++.. ",
-" ..++.. ",
-" ..++.. ",
-" ..++.. ",
-" ..++.. ",
-" . at ++.. ",
-" .#++.. ",
-" .$++.. ",
-" .%++.. ",
-" .++.. ",
-" .... "};
diff --git a/gtk2_ardour/pixmaps/set-next-button.xpm b/gtk2_ardour/pixmaps/set-next-button.xpm
deleted file mode 100644
index ab1a47b..0000000
--- a/gtk2_ardour/pixmaps/set-next-button.xpm
+++ /dev/null
@@ -1,1833 +0,0 @@
-/* XPM */
-static char * set_next_button_xpm[] = {
-"131 34 1796 2",
-" c None",
-". c #526770",
-"+ c #52666E",
-"@ c #4D5F67",
-"# c #495A62",
-"$ c #3C5159",
-"% c #384D56",
-"& c #344954",
-"* c #334853",
-"= c #334852",
-"- c #334750",
-"; c #33474F",
-"> c #33474C",
-", c #33484F",
-"' c #334950",
-") c #33484E",
-"! c #33484D",
-"~ c #33464C",
-"{ c #33464B",
-"] c #33454A",
-"^ c #334349",
-"/ c #334348",
-"( c #334445",
-"_ c #334244",
-": c #334144",
-"< c #304044",
-"[ c #2F4044",
-"} c #2F4145",
-"| c #2F4246",
-"1 c #2F3E44",
-"2 c #2F3F44",
-"3 c #2D3F42",
-"4 c #2C3E42",
-"5 c #2A3C40",
-"6 c #2A3D40",
-"7 c #2B3F40",
-"8 c #2E3E40",
-"9 c #2F3E40",
-"0 c #2C3E40",
-"a c #2B3E40",
-"b c #2A3E40",
-"c c #2A3B40",
-"d c #2A3A40",
-"e c #2A3A41",
-"f c #2A3B41",
-"g c #2A3B3F",
-"h c #2A3A3F",
-"i c #2A383B",
-"j c #2A393B",
-"k c #2A3B3E",
-"l c #2A393C",
-"m c #2A393A",
-"n c #2A383A",
-"o c #28383A",
-"p c #27383A",
-"q c #25393A",
-"r c #25383B",
-"s c #25363C",
-"t c #25343B",
-"u c #25333A",
-"v c #25343A",
-"w c #25353A",
-"x c #25363A",
-"y c #25373A",
-"z c #243538",
-"A c #213133",
-"B c #203032",
-"C c #203031",
-"D c #202E31",
-"E c #1F2D31",
-"F c #1D2D31",
-"G c #1E2E31",
-"H c #202F34",
-"I c #223036",
-"J c #2A3940",
-"K c #314048",
-"L c #48565E",
-"M c #4D5A62",
-"N c #485E63",
-"O c #40575C",
-"P c #2E4247",
-"Q c #26383D",
-"R c #1E3136",
-"S c #1E3036",
-"T c #1F3138",
-"U c #1E3138",
-"V c #1D3138",
-"W c #1F3139",
-"X c #203139",
-"Y c #203035",
-"Z c #202F32",
-"` c #1F2E31",
-" . c #1F2E30",
-".. c #1F2C30",
-"+. c #1E2C30",
-"@. c #1C2C30",
-"#. c #1A2C30",
-"$. c #192C30",
-"%. c #1B2C30",
-"&. c #1B2D2F",
-"*. c #1C2D2E",
-"=. c #1D2C2B",
-"-. c #1B2C2A",
-";. c #192C2A",
-">. c #1A2C2A",
-",. c #1D2C2A",
-"'. c #1E2D2A",
-"). c #1B2C2B",
-"!. c #192C2B",
-"~. c #1B2D2A",
-"{. c #1A2D2A",
-"]. c #1D2D2A",
-"^. c #1B2C2C",
-"/. c #1C2C2D",
-"(. c #202E2F",
-"_. c #1E2D2F",
-":. c #1D2D2F",
-"<. c #1B2B2D",
-"[. c #1A2B2C",
-"}. c #1E2D2D",
-"|. c #1F2C2F",
-"1. c #1E2B2D",
-"2. c #1F2B2C",
-"3. c #202C2A",
-"4. c #202D2B",
-"5. c #202B2B",
-"6. c #202B2A",
-"7. c #1E2B28",
-"8. c #1E2B29",
-"9. c #1D2B2B",
-"0. c #1F2D2E",
-"a. c #1B2A2B",
-"b. c #1A2A2D",
-"c. c #192B2F",
-"d. c #1A2C2C",
-"e. c #192C29",
-"f. c #1C2C2A",
-"g. c #1F2A2A",
-"h. c #1E292A",
-"i. c #1D292A",
-"j. c #1C292A",
-"k. c #1B292A",
-"l. c #1B2A2A",
-"m. c #1A2A2A",
-"n. c #1A2A2B",
-"o. c #19292E",
-"p. c #19292D",
-"q. c #1A292E",
-"r. c #1B292F",
-"s. c #1A2A2C",
-"t. c #1A2B2A",
-"u. c #192C28",
-"v. c #1D2D2C",
-"w. c #1E2E2F",
-"x. c #202E32",
-"y. c #203133",
-"z. c #1F2F32",
-"A. c #1E2E33",
-"B. c #1F2F34",
-"C. c #233338",
-"D. c #35444A",
-"E. c #39474E",
-"F. c #3B4E51",
-"G. c #2C3E41",
-"H. c #203436",
-"I. c #1C3031",
-"J. c #1F3031",
-"K. c #1F3032",
-"L. c #1C3032",
-"M. c #1A3032",
-"N. c #1B3033",
-"O. c #1D3033",
-"P. c #1F2E34",
-"Q. c #1D2C33",
-"R. c #1C282E",
-"S. c #1B262B",
-"T. c #1A262A",
-"U. c #192629",
-"V. c #1A282A",
-"W. c #1D2A2A",
-"X. c #1E2B2A",
-"Y. c #1C2A2A",
-"Z. c #1D2B2A",
-"`. c #1E2B2B",
-" + c #1E2B2F",
-".+ c #1E2B2C",
-"++ c #202D2A",
-"@+ c #212D2A",
-"#+ c #1F2C2A",
-"$+ c #212C2A",
-"%+ c #212B2A",
-"&+ c #212B2B",
-"*+ c #212B2E",
-"=+ c #212B2F",
-"-+ c #202B2F",
-";+ c #202C2E",
-">+ c #212D2C",
-",+ c #212C2E",
-"'+ c #212D2F",
-")+ c #212F2D",
-"!+ c #212F2C",
-"~+ c #212F2B",
-"{+ c #212F29",
-"]+ c #202E29",
-"^+ c #1E2C28",
-"/+ c #1F2D2B",
-"(+ c #212F2E",
-"_+ c #212E2F",
-":+ c #212C2F",
-"<+ c #202C2F",
-"[+ c #1E2C2F",
-"}+ c #1F2E2F",
-"|+ c #202F2F",
-"1+ c #212F2F",
-"2+ c #1F2F2E",
-"3+ c #1E2E2D",
-"4+ c #222F2E",
-"5+ c #24302F",
-"6+ c #222E30",
-"7+ c #202D30",
-"8+ c #1E2D30",
-"9+ c #1E2E30",
-"0+ c #1E2F30",
-"a+ c #212F30",
-"b+ c #232F30",
-"c+ c #272F30",
-"d+ c #262F30",
-"e+ c #242F30",
-"f+ c #223030",
-"g+ c #213030",
-"h+ c #1F3230",
-"i+ c #203230",
-"j+ c #223230",
-"k+ c #23312E",
-"l+ c #24312D",
-"m+ c #25322E",
-"n+ c #26322F",
-"o+ c #23302C",
-"p+ c #1E2C27",
-"q+ c #1C2A28",
-"r+ c #1A2928",
-"s+ c #1A282B",
-"t+ c #1D292E",
-"u+ c #1F2C31",
-"v+ c #253237",
-"w+ c #263539",
-"x+ c #26373A",
-"y+ c #223639",
-"z+ c #213538",
-"A+ c #223338",
-"B+ c #233339",
-"C+ c #26343A",
-"D+ c #213337",
-"E+ c #223438",
-"F+ c #24363A",
-"G+ c #313F44",
-"H+ c #334146",
-"I+ c #314244",
-"J+ c #223435",
-"K+ c #213134",
-"L+ c #203034",
-"M+ c #223336",
-"N+ c #243439",
-"O+ c #243539",
-"P+ c #243639",
-"Q+ c #24353A",
-"R+ c #23343A",
-"S+ c #203136",
-"T+ c #182628",
-"U+ c #19252A",
-"V+ c #1A262B",
-"W+ c #212E33",
-"X+ c #263338",
-"Y+ c #2D3A40",
-"Z+ c #313E43",
-"`+ c #364346",
-" @ c #384548",
-".@ c #394749",
-"+@ c #394649",
-"@@ c #39494A",
-"#@ c #39484A",
-"$@ c #394849",
-"%@ c #39484C",
-"&@ c #39484D",
-"*@ c #39494D",
-"=@ c #394A4D",
-"-@ c #3B4A4D",
-";@ c #3C4A4D",
-">@ c #3D4A4D",
-",@ c #3E4A4D",
-"'@ c #3E4C4D",
-")@ c #3D4C4D",
-"!@ c #3D4B4D",
-"~@ c #3E4B4E",
-"{@ c #3F4B4F",
-"]@ c #414D51",
-"^@ c #414E52",
-"/@ c #414F50",
-"(@ c #415051",
-"_@ c #3F4D50",
-":@ c #3E4C4F",
-"<@ c #404E51",
-"[@ c #414F52",
-"}@ c #415155",
-"|@ c #415055",
-"1@ c #435055",
-"2@ c #455257",
-"3@ c #445257",
-"4@ c #425256",
-"5@ c #435255",
-"6@ c #455255",
-"7@ c #455256",
-"8@ c #455359",
-"9@ c #455259",
-"0@ c #455459",
-"a@ c #45555A",
-"b@ c #45545D",
-"c@ c #45545E",
-"d@ c #45555E",
-"e@ c #45555F",
-"f@ c #465661",
-"g@ c #485762",
-"h@ c #495862",
-"i@ c #4A5862",
-"j@ c #4B5862",
-"k@ c #4D5861",
-"l@ c #4C585E",
-"m@ c #4A585B",
-"n@ c #47585B",
-"o@ c #45585C",
-"p@ c #465960",
-"q@ c #475961",
-"r@ c #4B5A62",
-"s@ c #4C5A62",
-"t@ c #4D5962",
-"u@ c #4D5B62",
-"v@ c #4A595F",
-"w@ c #425356",
-"x@ c #3B4B4F",
-"y@ c #344347",
-"z@ c #273939",
-"A@ c #203332",
-"B@ c #1B2C2D",
-"C@ c #1F3033",
-"D@ c #2B3C42",
-"E@ c #304047",
-"F@ c #35444C",
-"G@ c #2F4347",
-"H@ c #2D4145",
-"I@ c #2E3E45",
-"J@ c #2E3D45",
-"K@ c #2F3D45",
-"L@ c #2E3B43",
-"M@ c #2D3A41",
-"N@ c #2C3B42",
-"O@ c #2D3C44",
-"P@ c #34434B",
-"Q@ c #36444D",
-"R@ c #324548",
-"S@ c #27393C",
-"T@ c #2A383F",
-"U@ c #2B3940",
-"V@ c #2E3D43",
-"W@ c #303F45",
-"X@ c #334149",
-"Y@ c #33424A",
-"Z@ c #33424B",
-"`@ c #29383C",
-" # c #223232",
-".# c #182824",
-"+# c #22302F",
-"@# c #2B3838",
-"## c #434F57",
-"$# c #515C67",
-"%# c #606D7B",
-"&# c #667583",
-"*# c #6C7D8C",
-"=# c #71818E",
-"-# c #748390",
-";# c #728290",
-"># c #718290",
-",# c #718391",
-"'# c #718390",
-")# c #718491",
-"!# c #718592",
-"~# c #718593",
-"{# c #728693",
-"]# c #728792",
-"^# c #768791",
-"/# c #788891",
-"(# c #7A8C93",
-"_# c #7A8B93",
-":# c #7A8993",
-"<# c #798894",
-"[# c #788794",
-"}# c #798996",
-"|# c #798B98",
-"1# c #7A8D9C",
-"2# c #7A8C9C",
-"3# c #7A8B9B",
-"4# c #798997",
-"5# c #788895",
-"6# c #7A8C99",
-"7# c #7B8D9B",
-"8# c #7D8E9D",
-"9# c #7C8D9D",
-"0# c #7A8B9A",
-"a# c #7B8C9D",
-"b# c #7D8D9F",
-"c# c #808FA2",
-"d# c #8192A3",
-"e# c #8193A4",
-"f# c #8293A4",
-"g# c #8292A4",
-"h# c #8394A4",
-"i# c #8395A4",
-"j# c #8697A8",
-"k# c #8393A4",
-"l# c #8192A2",
-"m# c #7F91A0",
-"n# c #8294A3",
-"o# c #8495A5",
-"p# c #8496A7",
-"q# c #8496A8",
-"r# c #8596A8",
-"s# c #8497AA",
-"t# c #8597AA",
-"u# c #8897A9",
-"v# c #8997AA",
-"w# c #8A98AC",
-"x# c #8799AC",
-"y# c #8699AC",
-"z# c #8398AA",
-"A# c #8297A8",
-"B# c #8296A5",
-"C# c #8497A8",
-"D# c #8395A6",
-"E# c #8496A5",
-"F# c #8194A2",
-"G# c #7B909C",
-"H# c #738790",
-"I# c #6B7D85",
-"J# c #4F5F63",
-"K# c #3D4E4E",
-"L# c #203430",
-"M# c #223533",
-"N# c #364449",
-"O# c #3B494F",
-"P# c #404D54",
-"Q# c #3C4D54",
-"R# c #3A4C54",
-"S# c #3A4852",
-"T# c #3A4751",
-"U# c #39464E",
-"V# c #36434B",
-"W# c #324049",
-"X# c #32404A",
-"Y# c #35464E",
-"Z# c #36474F",
-"`# c #3A4C51",
-" $ c #314348",
-".$ c #354249",
-"+$ c #38434B",
-"@$ c #3A474F",
-"#$ c #3D4952",
-"$$ c #404B56",
-"%$ c #404B57",
-"&$ c #404B58",
-"*$ c #3F4C57",
-"=$ c #3C4B52",
-"-$ c #304042",
-";$ c #273736",
-">$ c #192A24",
-",$ c #2E3C39",
-"'$ c #3E4A4A",
-")$ c #5F6974",
-"!$ c #717B8C",
-"~$ c #8795AC",
-"{$ c #8F9FB7",
-"]$ c #95A9C2",
-"^$ c #98AAC3",
-"/$ c #9AABC3",
-"($ c #9AABC2",
-"_$ c #9BACC3",
-":$ c #9DAFC5",
-"<$ c #9EAFC6",
-"[$ c #9EAEC6",
-"}$ c #9EADC6",
-"|$ c #9DADC6",
-"1$ c #9CADC6",
-"2$ c #9AADC5",
-"3$ c #99ADC4",
-"4$ c #99ACC4",
-"5$ c #99ACC3",
-"6$ c #9BAEC3",
-"7$ c #9BAFC4",
-"8$ c #9CB1C8",
-"9$ c #9CB0C8",
-"0$ c #9BAEC7",
-"a$ c #98ABC4",
-"b$ c #97AAC3",
-"c$ c #9BADC6",
-"d$ c #9DAEC8",
-"e$ c #9FB0CB",
-"f$ c #9EAFCB",
-"g$ c #9CADCA",
-"h$ c #9BADC9",
-"i$ c #A0B1CC",
-"j$ c #9EB1CE",
-"k$ c #9DAFCB",
-"l$ c #9BADC8",
-"m$ c #9BACC5",
-"n$ c #9BADC4",
-"o$ c #9BADC5",
-"p$ c #9BADCA",
-"q$ c #9CADC9",
-"r$ c #9DADC8",
-"s$ c #9EAFCA",
-"t$ c #9EB0CB",
-"u$ c #9EAFC9",
-"v$ c #9EAEC8",
-"w$ c #9DACC7",
-"x$ c #9DADC7",
-"y$ c #9EAFC8",
-"z$ c #9FB1C7",
-"A$ c #9FB2C7",
-"B$ c #9FB3C9",
-"C$ c #9EB2C9",
-"D$ c #9BAFC7",
-"E$ c #9AAFC5",
-"F$ c #99AEC3",
-"G$ c #9AB0C6",
-"H$ c #9AB1C8",
-"I$ c #9BB0CA",
-"J$ c #99AEC8",
-"K$ c #98ACC6",
-"L$ c #99AAC3",
-"M$ c #9AABC4",
-"N$ c #99ADC5",
-"O$ c #98ADC5",
-"P$ c #95ABC3",
-"Q$ c #94AAC3",
-"R$ c #94A9C3",
-"S$ c #95A9C3",
-"T$ c #96A9C3",
-"U$ c #98ACC5",
-"V$ c #99ADC6",
-"W$ c #99AEC7",
-"X$ c #9AAFC7",
-"Y$ c #9DB1C6",
-"Z$ c #95A8B9",
-"`$ c #8D9EAB",
-" % c #6D7F85",
-".% c #57696A",
-"+% c #293E39",
-"@% c #273B38",
-"#% c #425259",
-"$% c #485760",
-"%% c #45575F",
-"&% c #44565D",
-"*% c #42515A",
-"=% c #414F59",
-"-% c #404D58",
-";% c #3D4A54",
-">% c #3A4750",
-",% c #384550",
-"'% c #384551",
-")% c #3B4754",
-"!% c #3C4855",
-"~% c #3C4F56",
-"{% c #34484F",
-"]% c #3A4A53",
-"^% c #3E4C56",
-"/% c #425059",
-"(% c #45525B",
-"_% c #49545E",
-":% c #4A555E",
-"<% c #49565E",
-"[% c #45535B",
-"}% c #37454B",
-"|% c #2E3C3E",
-"1% c #202E2B",
-"2% c #394344",
-"3% c #4D5459",
-"4% c #6C7484",
-"5% c #7C869A",
-"6% c #8D9AB2",
-"7% c #909EB7",
-"8% c #919FB9",
-"9% c #8F9DB7",
-"0% c #8E9BB6",
-"a% c #8A9AB5",
-"b% c #8899B4",
-"c% c #8798B4",
-"d% c #8797B4",
-"e% c #8796B4",
-"f% c #8696B4",
-"g% c #8596B4",
-"h% c #8395B4",
-"i% c #8395B3",
-"j% c #8395B1",
-"k% c #8395B2",
-"l% c #8596B0",
-"m% c #8596B1",
-"n% c #8696B2",
-"o% c #8495B0",
-"p% c #8394B0",
-"q% c #8393B0",
-"r% c #8495B4",
-"s% c #8595B4",
-"t% c #8695B4",
-"u% c #8496B0",
-"v% c #8395AB",
-"w% c #8394AB",
-"x% c #8393AB",
-"y% c #8392AB",
-"z% c #8494AC",
-"A% c #8695AE",
-"B% c #8796AF",
-"C% c #8594AE",
-"D% c #8593AD",
-"E% c #8595AE",
-"F% c #8594AC",
-"G% c #8594AB",
-"H% c #8396AB",
-"I% c #8397AB",
-"J% c #8395AD",
-"K% c #8394AE",
-"L% c #8395B0",
-"M% c #8394AF",
-"N% c #8393AD",
-"O% c #8392AC",
-"P% c #8193A9",
-"Q% c #8293A9",
-"R% c #8394A9",
-"S% c #8495A7",
-"T% c #76878E",
-"U% c #68787B",
-"V% c #374844",
-"W% c #324340",
-"X% c #405153",
-"Y% c #45585D",
-"Z% c #4A5D65",
-"`% c #495C63",
-" & c #485B62",
-".& c #485962",
-"+& c #465660",
-"@& c #43535D",
-"#& c #40505A",
-"$& c #3E4D57",
-"%& c #3A4953",
-"&& c #3A4853",
-"*& c #3D4B56",
-"=& c #3E4C57",
-"-& c #44545C",
-";& c #3E4E57",
-">& c #404F59",
-",& c #42515B",
-"'& c #49575E",
-")& c #4A5960",
-"!& c #4A5A62",
-"~& c #4A5B62",
-"{& c #47585E",
-"]& c #303D41",
-"^& c #252E31",
-"/& c #3D464E",
-"(& c #505964",
-"_& c #6B7785",
-":& c #778495",
-"<& c #808EA4",
-"[& c #8290A8",
-"}& c #8390A9",
-"|& c #838FA7",
-"1& c #828EA6",
-"2& c #808CA4",
-"3& c #808DA4",
-"4& c #808FA4",
-"5& c #7D8DA3",
-"6& c #7B8CA2",
-"7& c #7B8DA4",
-"8& c #7B8CA4",
-"9& c #7B8CA3",
-"0& c #7B8DA3",
-"a& c #7C8DA4",
-"b& c #8290A4",
-"c& c #838FA4",
-"d& c #838EA4",
-"e& c #838DA4",
-"f& c #818DA2",
-"g& c #808DA1",
-"h& c #828DA3",
-"i& c #828FA3",
-"j& c #818EA2",
-"k& c #7F8CA0",
-"l& c #7E8CA0",
-"m& c #7F8DA1",
-"n& c #7F8DA2",
-"o& c #7F8EA3",
-"p& c #8090A6",
-"q& c #8090A7",
-"r& c #8090A9",
-"s& c #8090A8",
-"t& c #808FA6",
-"u& c #808FA5",
-"v& c #808EA3",
-"w& c #808DA2",
-"x& c #808CA1",
-"y& c #808EA0",
-"z& c #7F8E9D",
-"A& c #75848D",
-"B& c #69777C",
-"C& c #394647",
-"D& c #344142",
-"E& c #415053",
-"F& c #46585E",
-"G& c #4A5F67",
-"H& c #4A5E67",
-"I& c #4A5D66",
-"J& c #475B61",
-"K& c #42585F",
-"L& c #41545B",
-"M& c #415058",
-"N& c #3D4C54",
-"O& c #3D4B54",
-"P& c #404D56",
-"Q& c #414E57",
-"R& c #45595E",
-"S& c #41545A",
-"T& c #42555B",
-"U& c #43565C",
-"V& c #4A5D64",
-"W& c #4B6067",
-"X& c #4D6068",
-"Y& c #4E6068",
-"Z& c #4E5F67",
-"`& c #37484D",
-" * c #2E3E42",
-".* c #253035",
-"+* c #3D464F",
-"@* c #4F5863",
-"#* c #677684",
-"$* c #738494",
-"%* c #818DA3",
-"&* c #828CA4",
-"** c #7C89A2",
-"=* c #7B8AA2",
-"-* c #7B8AA1",
-";* c #7B8BA2",
-">* c #7B89A1",
-",* c #7B89A0",
-"'* c #7B899F",
-")* c #7B889C",
-"!* c #7B889B",
-"~* c #7B8799",
-"{* c #7B879A",
-"]* c #7C8AA2",
-"^* c #7F8CA2",
-"/* c #808CA2",
-"(* c #818CA2",
-"_* c #7E8C9F",
-":* c #7D8C9E",
-"<* c #7E8D9F",
-"[* c #7D8D9E",
-"}* c #7B8B9C",
-"|* c #7B8C9C",
-"1* c #7D8C9D",
-"2* c #7F8C9F",
-"3* c #808B9F",
-"4* c #808A9F",
-"5* c #7F8B9F",
-"6* c #7C8C9D",
-"7* c #7C8B9D",
-"8* c #7C8A9C",
-"9* c #7B889A",
-"0* c #7B8697",
-"a* c #7B8696",
-"b* c #7B8797",
-"c* c #7B8999",
-"d* c #7B8C9E",
-"e* c #7B8BA0",
-"f* c #7B8BA1",
-"g* c #7B8DA2",
-"h* c #7B8B9F",
-"i* c #7B8A9D",
-"j* c #7B8A9C",
-"k* c #7C8A9D",
-"l* c #7B8B9B",
-"m* c #7B8B99",
-"n* c #74838B",
-"o* c #3C4647",
-"p* c #364142",
-"q* c #3E5053",
-"r* c #45575E",
-"s* c #4A5D67",
-"t* c #4A5D68",
-"u* c #4A5C63",
-"v* c #495962",
-"w* c #45565E",
-"x* c #41535B",
-"y* c #3D4E56",
-"z* c #404E57",
-"A* c #475960",
-"B* c #495E64",
-"C* c #4C616A",
-"D* c #4D616A",
-"E* c #4B5B62",
-"F* c #374849",
-"G* c #2F3F3F",
-"H* c #263336",
-"I* c #39474B",
-"J* c #48575D",
-"K* c #667684",
-"L* c #748495",
-"M* c #7C8B9F",
-"N* c #7D8CA0",
-"O* c #7E8B9F",
-"P* c #7D8B9E",
-"Q* c #7B899C",
-"R* c #7B8B9D",
-"S* c #7B8A9E",
-"T* c #7B8595",
-"U* c #7B8594",
-"V* c #7B8695",
-"W* c #7B8798",
-"X* c #7B8698",
-"Y* c #7B8998",
-"Z* c #7C8999",
-"`* c #7E899A",
-" = c #7C8A9A",
-".= c #7B8B9A",
-"+= c #7B899A",
-"@= c #7B8A9A",
-"#= c #7D8898",
-"$= c #7C8797",
-"%= c #7C8696",
-"&= c #7B8897",
-"*= c #7B899B",
-"== c #7B8D9C",
-"-= c #74828B",
-";= c #3D4647",
-">= c #4A5C67",
-",= c #4A5E69",
-"'= c #4A5F69",
-")= c #4A5F65",
-"!= c #4A5E63",
-"~= c #475860",
-"{= c #44555F",
-"]= c #3E4F57",
-"^= c #3D4D54",
-"/= c #425962",
-"(= c #3C535C",
-"_= c #435760",
-":= c #475A62",
-"<= c #4A6065",
-"[= c #4A6166",
-"}= c #4A6066",
-"|= c #4A5F66",
-"1= c #37494C",
-"2= c #304144",
-"3= c #29383B",
-"4= c #3A484D",
-"5= c #48565C",
-"6= c #647481",
-"7= c #718291",
-"8= c #798A9A",
-"9= c #7A8B9C",
-"0= c #7A899A",
-"a= c #798998",
-"b= c #73828B",
-"c= c #4A5D69",
-"d= c #4A5D62",
-"e= c #485960",
-"f= c #46555F",
-"g= c #3F4F57",
-"h= c #45595F",
-"i= c #40555C",
-"j= c #445960",
-"k= c #475C62",
-"l= c #4B5F65",
-"m= c #4D6066",
-"n= c #4F6169",
-"o= c #4C6067",
-"p= c #4A5D63",
-"q= c #47595E",
-"r= c #3B494E",
-"s= c #344145",
-"t= c #29383A",
-"u= c #3A4A50",
-"v= c #485861",
-"w= c #64737F",
-"x= c #71808D",
-"y= c #7A889A",
-"z= c #7B869C",
-"A= c #7B879C",
-"B= c #8190A2",
-"C= c #8E9EB0",
-"D= c #8E9DAF",
-"E= c #8E9DAE",
-"F= c #8E9DAD",
-"G= c #8E9BAA",
-"H= c #8793A2",
-"I= c #818C9B",
-"J= c #818E9F",
-"K= c #8797A9",
-"L= c #8E9DB0",
-"M= c #8D9DAF",
-"N= c #7B859C",
-"O= c #7A8A98",
-"P= c #69777D",
-"Q= c #3D474D",
-"R= c #364148",
-"S= c #3C4D55",
-"T= c #42555D",
-"U= c #475C63",
-"V= c #495F63",
-"W= c #4A6063",
-"X= c #4A5E62",
-"Y= c #485A60",
-"Z= c #46575F",
-"`= c #3F5159",
-" - c #3D4E57",
-".- c #404E59",
-"+- c #414E5A",
-"@- c #455A5F",
-"#- c #41565C",
-"$- c #455A60",
-"%- c #495E65",
-"&- c #4A6067",
-"*- c #4B616A",
-"=- c #344245",
-"-- c #293A39",
-";- c #3B4C4F",
-">- c #495A61",
-",- c #65727D",
-"'- c #727D8B",
-")- c #7A8598",
-"!- c #7B879B",
-"~- c #7B859B",
-"{- c #A2B2C4",
-"]- c #B6C9D8",
-"^- c #7A899B",
-"/- c #8E9EAF",
-"(- c #A2B2C1",
-"_- c #9BAAB9",
-":- c #7C8796",
-"<- c #7D8897",
-"[- c #818C9C",
-"}- c #7B8596",
-"|- c #9BAABB",
-"1- c #95A4B6",
-"2- c #7B8896",
-"3- c #74828C",
-"4- c #6A777F",
-"5- c #3F494E",
-"6- c #374448",
-"7- c #3D4F55",
-"8- c #42565C",
-"9- c #475B62",
-"0- c #495F62",
-"a- c #4A6163",
-"b- c #4C5F65",
-"c- c #42535B",
-"d- c #40515A",
-"e- c #41505A",
-"f- c #455B5F",
-"g- c #41575C",
-"h- c #455860",
-"i- c #4A616A",
-"j- c #4A5C61",
-"k- c #47585D",
-"l- c #3B484E",
-"m- c #344146",
-"n- c #293A3B",
-"o- c #3C4C50",
-"p- c #4B5A61",
-"q- c #66717D",
-"r- c #727C8B",
-"s- c #7A8397",
-"t- c #7B859A",
-"u- c #95A3B3",
-"v- c #A2B2C3",
-"w- c #8E9CAF",
-"x- c #9BABBB",
-"y- c #798797",
-"z- c #778594",
-"A- c #8D9BAC",
-"B- c #A8B9C9",
-"C- c #A8B9C8",
-"D- c #AFC1D0",
-"E- c #84909F",
-"F- c #7C8695",
-"G- c #9BAABA",
-"H- c #818C9E",
-"I- c #818EA1",
-"J- c #8D9CAC",
-"K- c #8E9CAC",
-"L- c #8E9BAE",
-"M- c #7B8598",
-"N- c #74828E",
-"O- c #6A7781",
-"P- c #3F4A4E",
-"Q- c #394548",
-"R- c #405055",
-"S- c #45565C",
-"T- c #4A5F62",
-"U- c #4C6066",
-"V- c #4B5E65",
-"W- c #41515A",
-"X- c #3A494F",
-"Y- c #485661",
-"Z- c #656F7D",
-"`- c #727B8B",
-" ; c #7A8297",
-".; c #7B849A",
-"+; c #7B8597",
-"@; c #8F9CAB",
-"#; c #8E9BAB",
-"$; c #8E9AAA",
-"%; c #7B8294",
-"&; c #7B8496",
-"*; c #7B8A97",
-"=; c #74828A",
-"-; c #6A777D",
-";; c #394448",
-">; c #4A6062",
-",; c #4A5E64",
-"'; c #41535A",
-"); c #4D6067",
-"!; c #4F616A",
-"~; c #4C6167",
-"{; c #4A6165",
-"]; c #495D63",
-"^; c #3A484E",
-"/; c #334145",
-"(; c #3A484C",
-"_; c #48555B",
-":; c #646F7B",
-"<; c #717B8A",
-"[; c #7A8396",
-"}; c #7B8499",
-"|; c #7B8599",
-"1; c #95A3B2",
-"2; c #7B8494",
-"3; c #8D99AA",
-"4; c #788194",
-"5; c #798694",
-"6; c #73818C",
-"7; c #6A7780",
-"8; c #3F4B4E",
-"9; c #384648",
-"0; c #3F5155",
-"a; c #4A5F63",
-"b; c #485A61",
-"c; c #46585F",
-"d; c #445359",
-"e; c #4A6167",
-"f; c #465D63",
-"g; c #42575E",
-"h; c #36464E",
-"i; c #303F47",
-"j; c #29383E",
-"k; c #38464D",
-"l; c #636D79",
-"m; c #707A88",
-"n; c #798292",
-"o; c #7B8495",
-"p; c #7B8394",
-"q; c #768394",
-"r; c #798494",
-"s; c #74828D",
-"t; c #697881",
-"u; c #3D4D4E",
-"v; c #364748",
-"w; c #3E5155",
-"x; c #4A5E68",
-"y; c #4A5F6A",
-"z; c #4A5E6A",
-"A; c #46595F",
-"B; c #42545A",
-"C; c #425258",
-"D; c #455557",
-"E; c #465557",
-"F; c #37494E",
-"G; c #304147",
-"H; c #626D79",
-"I; c #6F7A88",
-"J; c #788192",
-"K; c #7A8394",
-"L; c #3D4D50",
-"M; c #36474A",
-"N; c #3E5156",
-"O; c #45565D",
-"P; c #4A5D6A",
-"Q; c #465C5F",
-"R; c #42595C",
-"S; c #475A60",
-"T; c #495C62",
-"U; c #4A5E65",
-"V; c #606D79",
-"W; c #6D7988",
-"X; c #748092",
-"Y; c #778294",
-"Z; c #7A8294",
-"`; c #7B8194",
-" > c #74818D",
-".> c #697882",
-"+> c #36474E",
-"@> c #3E5157",
-"#> c #4A5C65",
-"$> c #465C63",
-"%> c #435960",
-"&> c #4A5C62",
-"*> c #4A6169",
-"=> c #475A5E",
-"-> c #455159",
-";> c #5D6C79",
-">> c #6A7888",
-",> c #768092",
-"'> c #798294",
-")> c #788294",
-"!> c #758194",
-"~> c #778194",
-"{> c #798194",
-"]> c #7A8194",
-"^> c #3D4D55",
-"/> c #4A5C64",
-"(> c #42595F",
-"_> c #465A61",
-":> c #485C62",
-"<> c #4A6064",
-"[> c #4A6168",
-"}> c #47595F",
-"|> c #37494F",
-"1> c #304247",
-"2> c #29393D",
-"3> c #35464C",
-"4> c #405159",
-"5> c #5E6C79",
-"6> c #6C7988",
-"7> c #778292",
-"8> c #7A8494",
-"9> c #748194",
-"0> c #748294",
-"a> c #778394",
-"b> c #A2B1C1",
-"c> c #808B9B",
-"d> c #9AAAB9",
-"e> c #7A8594",
-"f> c #A1B1C1",
-"g> c #8B9AAA",
-"h> c #758394",
-"i> c #768494",
-"j> c #778494",
-"k> c #788494",
-"l> c #798393",
-"m> c #788293",
-"n> c #727F8B",
-"o> c #687680",
-"p> c #3F4D55",
-"q> c #39484F",
-"r> c #3F515A",
-"s> c #455761",
-"t> c #4A5C66",
-"u> c #415159",
-"v> c #445458",
-"w> c #41585C",
-"x> c #496062",
-"y> c #4A6164",
-"z> c #47585F",
-"A> c #374A50",
-"B> c #304347",
-"C> c #293C3C",
-"D> c #35484C",
-"E> c #405259",
-"F> c #616D79",
-"G> c #6F7988",
-"H> c #788394",
-"I> c #8391A2",
-"J> c #7D8B9B",
-"K> c #758294",
-"L> c #A0B1C1",
-"M> c #8999AA",
-"N> c #738394",
-"O> c #738294",
-"P> c #758494",
-"Q> c #798594",
-"R> c #768393",
-"S> c #748292",
-"T> c #707E8A",
-"U> c #68757E",
-"V> c #424B52",
-"W> c #3B464E",
-"X> c #3F515C",
-"Y> c #455864",
-"Z> c #475A5F",
-"`> c #374B50",
-" , c #304449",
-"., c #293C40",
-"+, c #36484E",
-"@, c #415259",
-"#, c #738194",
-"$, c #788594",
-"%, c #748393",
-"&, c #748392",
-"*, c #737E8A",
-"=, c #6B757E",
-"-, c #434B52",
-";, c #455964",
-">, c #4A6068",
-",, c #455C5F",
-"', c #41595C",
-"), c #394C52",
-"!, c #32454B",
-"~, c #293C41",
-"{, c #38484E",
-"], c #636C76",
-"^, c #707884",
-"/, c #798192",
-"(, c #768294",
-"_, c #748394",
-":, c #768594",
-"<, c #768493",
-"[, c #788492",
-"}, c #757E8A",
-"|, c #6C757F",
-"1, c #444F54",
-"2, c #3C4950",
-"3, c #40515C",
-"4, c #455963",
-"5, c #4A5F68",
-"6, c #455C64",
-"7, c #415962",
-"8, c #455A62",
-"9, c #3B4C54",
-"0, c #34454C",
-"a, c #778393",
-"b, c #788393",
-"c, c #788493",
-"d, c #758392",
-"e, c #727E8A",
-"f, c #6A757F",
-"g, c #444E54",
-"h, c #3C494F",
-"i, c #405157",
-"j, c #455660",
-"k, c #4A5B67",
-"l, c #465E62",
-"m, c #425A5E",
-"n, c #475C61",
-"o, c #495E62",
-"p, c #4A5F64",
-"q, c #394C55",
-"r, c #33454B",
-"s, c #2C3A3D",
-"t, c #444E52",
-"u, c #616C73",
-"v, c #6E7983",
-"w, c #768191",
-"x, c #778293",
-"y, c #778192",
-"z, c #798293",
-"A, c #7A8293",
-"B, c #798493",
-"C, c #748192",
-"D, c #738192",
-"E, c #738291",
-"F, c #738392",
-"G, c #748492",
-"H, c #758492",
-"I, c #748493",
-"J, c #768293",
-"K, c #758192",
-"L, c #778092",
-"M, c #788092",
-"N, c #788093",
-"O, c #778094",
-"P, c #768094",
-"Q, c #758094",
-"R, c #7A8393",
-"S, c #7A8492",
-"T, c #7B828F",
-"U, c #7A838E",
-"V, c #77848D",
-"W, c #76838E",
-"X, c #75828E",
-"Y, c #75828F",
-"Z, c #75818F",
-"`, c #73838D",
-" ' c #6F7D85",
-".' c #66737C",
-"+' c #394651",
-"@' c #3E5057",
-"#' c #45585E",
-"$' c #4C6267",
-"%' c #4D6269",
-"&' c #465761",
-"*' c #42535D",
-"=' c #41525B",
-"-' c #41545E",
-";' c #41555E",
-">' c #465E63",
-",' c #435A60",
-"'' c #485C61",
-")' c #475B60",
-"!' c #394B52",
-"~' c #324348",
-"{' c #354247",
-"]' c #404B50",
-"^' c #5C6971",
-"/' c #697681",
-"(' c #737F8E",
-"_' c #758191",
-":' c #768194",
-"<' c #798394",
-"[' c #768192",
-"}' c #737F90",
-"|' c #738190",
-"1' c #758193",
-"2' c #738290",
-"3' c #738391",
-"4' c #738191",
-"5' c #73828F",
-"6' c #73838E",
-"7' c #73828E",
-"8' c #73818E",
-"9' c #738193",
-"0' c #738091",
-"a' c #737F8D",
-"b' c #737F8B",
-"c' c #74808C",
-"d' c #74808E",
-"e' c #768093",
-"f' c #767F94",
-"g' c #757E92",
-"h' c #757E94",
-"i' c #757F94",
-"j' c #768292",
-"k' c #768290",
-"l' c #76818B",
-"m' c #76828F",
-"n' c #768392",
-"o' c #768391",
-"p' c #738094",
-"q' c #73828D",
-"r' c #6A7883",
-"s' c #606D77",
-"t' c #3B4651",
-"u' c #36434C",
-"v' c #45575D",
-"w' c #485A63",
-"x' c #465762",
-"y' c #42535E",
-"z' c #41535C",
-"A' c #41565F",
-"B' c #41575F",
-"C' c #495C64",
-"D' c #475962",
-"E' c #485A62",
-"F' c #496069",
-"G' c #455B64",
-"H' c #384A53",
-"I' c #324249",
-"J' c #29373C",
-"K' c #344046",
-"L' c #3D494F",
-"M' c #54646B",
-"N' c #607179",
-"O' c #6F7D88",
-"P' c #72808B",
-"Q' c #73818B",
-"R' c #73808B",
-"S' c #737E8B",
-"T' c #73808D",
-"U' c #727F8A",
-"V' c #707F88",
-"W' c #6F7F88",
-"X' c #6F808C",
-"Y' c #6F818E",
-"Z' c #6F8290",
-"`' c #6F8190",
-" ) c #6F8090",
-".) c #717F8E",
-"+) c #737F8F",
-"@) c #73808C",
-"#) c #737F89",
-"$) c #737F87",
-"%) c #727F87",
-"&) c #707F87",
-"*) c #6F7F89",
-"=) c #6F7F8A",
-"-) c #717F8B",
-";) c #74818C",
-">) c #758091",
-",) c #748091",
-"') c #737E90",
-")) c #717C90",
-"!) c #727C90",
-"~) c #737D91",
-"{) c #737E91",
-"]) c #737F92",
-"^) c #737F91",
-"/) c #727F90",
-"() c #727F8F",
-"_) c #717F8D",
-":) c #738092",
-"<) c #6F7E8C",
-"[) c #6C7C85",
-"}) c #616F77",
-"|) c #57646B",
-"1) c #35424A",
-"2) c #4A6069",
-"3) c #43565F",
-"4) c #43575F",
-"5) c #465D64",
-"6) c #435961",
-"7) c #50616A",
-"8) c #4E616A",
-"9) c #4B606A",
-"0) c #485D67",
-"a) c #3D4F58",
-"b) c #35454D",
-"c) c #2A373D",
-"d) c #2E3A41",
-"e) c #323E45",
-"f) c #4A5760",
-"g) c #57656E",
-"h) c #667681",
-"i) c #6A7A85",
-"j) c #6C7C87",
-"k) c #717E89",
-"l) c #717D89",
-"m) c #717C89",
-"n) c #707C89",
-"o) c #6E7C88",
-"p) c #6E7B87",
-"q) c #707C88",
-"r) c #6D7C89",
-"s) c #6C7C89",
-"t) c #6B7C89",
-"u) c #6B7C88",
-"v) c #6A7C84",
-"w) c #697C88",
-"x) c #697C89",
-"y) c #687C89",
-"z) c #6A7B88",
-"A) c #6B7B87",
-"B) c #6B7B86",
-"C) c #6B7C84",
-"D) c #6B7C83",
-"E) c #6B7C82",
-"F) c #6B7B82",
-"G) c #6B7A81",
-"H) c #6A7B81",
-"I) c #687B82",
-"J) c #697B82",
-"K) c #6C7E82",
-"L) c #6E7F82",
-"M) c #6E7E83",
-"N) c #6A7B83",
-"O) c #697A82",
-"P) c #6A7A82",
-"Q) c #6B7A82",
-"R) c #697A84",
-"S) c #6A7B86",
-"T) c #6E7C89",
-"U) c #6F7D87",
-"V) c #6D7D86",
-"W) c #6A7982",
-"X) c #697680",
-"Y) c #65747D",
-"Z) c #617279",
-"`) c #4D5D66",
-" ! c #42505A",
-".! c #33414A",
-"+! c #45555D",
-"@! c #4B626A",
-"#! c #42535C",
-"$! c #475E62",
-"%! c #435A5E",
-"&! c #495E68",
-"*! c #435660",
-"=! c #334246",
-"-! c #2E3B40",
-";! c #2C373D",
-">! c #35424B",
-",! c #3D4B55",
-"'! c #4F5F69",
-")! c #56666F",
-"!! c #5C6D74",
-"~! c #5F6F77",
-"{! c #617079",
-"]! c #627179",
-"^! c #627079",
-"/! c #607079",
-"(! c #5E7078",
-"_! c #5B6E75",
-":! c #5A6D74",
-"<! c #5A6C72",
-"[! c #5E6E76",
-"}! c #5E7079",
-"|! c #5D7078",
-"1! c #5C6E76",
-"2! c #5C6D75",
-"3! c #5C6F76",
-"4! c #5B6D74",
-"5! c #596D74",
-"6! c #596C74",
-"7! c #5B6B72",
-"8! c #5C6B70",
-"9! c #5C696C",
-"0! c #5C6A6C",
-"a! c #5C6A6D",
-"b! c #5B696F",
-"c! c #5B6870",
-"d! c #596870",
-"e! c #586870",
-"f! c #58696D",
-"g! c #58696B",
-"h! c #59696B",
-"i! c #57696B",
-"j! c #55696B",
-"k! c #54696B",
-"l! c #56696B",
-"m! c #5A696B",
-"n! c #5B696B",
-"o! c #58686C",
-"p! c #57686C",
-"q! c #56696D",
-"r! c #56696A",
-"s! c #546767",
-"t! c #556766",
-"u! c #586766",
-"v! c #576766",
-"w! c #566766",
-"x! c #556665",
-"y! c #556465",
-"z! c #536165",
-"A! c #515E62",
-"B! c #4C5A5C",
-"C! c #3D4E54",
-"D! c #37464E",
-"E! c #3F4A54",
-"F! c #434F5A",
-"G! c #4A606A",
-"H! c #455760",
-"I! c #465861",
-"J! c #455B62",
-"K! c #4D6369",
-"L! c #50656A",
-"M! c #4D646A",
-"N! c #4A646A",
-"O! c #4C6069",
-"P! c #47565D",
-"Q! c #415056",
-"R! c #3D4B50",
-"S! c #39474A",
-"T! c #313E41",
-"U! c #2D3A3D",
-"V! c #2A363A",
-"W! c #2B373B",
-"X! c #2E3A3F",
-"Y! c #303E40",
-"Z! c #314041",
-"`! c #334141",
-" ~ c #334041",
-".~ c #303D3F",
-"+~ c #313E3F",
-"@~ c #334140",
-"#~ c #344041",
-"$~ c #333E41",
-"%~ c #323D40",
-"&~ c #303C3E",
-"*~ c #303B3D",
-"=~ c #303C3F",
-"-~ c #303D40",
-";~ c #30393D",
-">~ c #2F393D",
-",~ c #2E393D",
-"'~ c #2D383C",
-")~ c #2C383B",
-"!~ c #2C393C",
-"~~ c #2C3739",
-"{~ c #2C3639",
-"]~ c #2B3639",
-"^~ c #2A3639",
-"/~ c #293639",
-"(~ c #283639",
-"_~ c #283637",
-":~ c #283635",
-"<~ c #283538",
-"[~ c #283439",
-"}~ c #283437",
-"|~ c #283435",
-"1~ c #283431",
-"2~ c #283331",
-"3~ c #283131",
-"4~ c #283231",
-"5~ c #222D30",
-"6~ c #202B2E",
-"7~ c #263439",
-"8~ c #2D3B40",
-"9~ c #334147",
-"0~ c #394A4F",
-"a~ c #485961",
-"b~ c #4A5A63",
-"c~ c #4D5F69",
-"d~ c #4E606A",
-"e~ c #40575F",
-"f~ c #405760",
-"g~ c #455B63",
-"h~ c #465C64",
-"i~ c #4E646A",
-"j~ c #4A5E66",
-"k~ c #48575F",
-"l~ c #47545C",
-"m~ c #435258",
-"n~ c #404F55",
-"o~ c #3A474D",
-"p~ c #354248",
-"q~ c #26353B",
-"r~ c #223035",
-"s~ c #1D2E30",
-"t~ c #1A2C2D",
-"u~ c #19292B",
-"v~ c #19282A",
-"w~ c #192829",
-"x~ c #202A2B",
-"y~ c #20292B",
-"z~ c #1C282A",
-"A~ c #19292C",
-"B~ c #192A2C",
-"C~ c #1B2B2C",
-"D~ c #19282C",
-"E~ c #18292C",
-"F~ c #182A2B",
-"G~ c #192929",
-"H~ c #18292B",
-"I~ c #18282C",
-"J~ c #18282B",
-"K~ c #18292A",
-"L~ c #192A29",
-"M~ c #1D2A29",
-"N~ c #1C2A29",
-"O~ c #1A2A29",
-"P~ c #1A292A",
-"Q~ c #1B292B",
-"R~ c #1B292C",
-"S~ c #1D2B2F",
-"T~ c #223034",
-"U~ c #2C393E",
-"V~ c #36454A",
-"W~ c #3C4B53",
-"X~ c #3E4E58",
-"Y~ c #455862",
-"Z~ c #4B5D68",
-"`~ c #4F616C",
-" { c #52646F",
-".{ c #546570",
-"+{ c #556570",
-"@{ c #556871",
-"#{ c #536770",
-"${ c #4E646E",
-"%{ c #4D636D",
-"&{ c #4D626D",
-"*{ c #4B606B",
-"={ c #4B616C",
-"-{ c #51676D",
-";{ c #51656B",
-">{ c #51646A",
-",{ c #51646B",
-"'{ c #526671",
-"){ c #526872",
-"!{ c #536972",
-"~{ c #506772",
-"{{ c #4E6672",
-"]{ c #4C6270",
-"^{ c #4B606D",
-"/{ c #485C65",
-"({ c #465961",
-"_{ c #43545C",
-":{ c #3F5057",
-"<{ c #3C4D53",
-"[{ c #37474F",
-"}{ c #34444C",
-"|{ c #2E3F47",
-"1{ c #2B3C43",
-"2{ c #27373D",
-"3{ c #203134",
-"4{ c #1C2D2F",
-"5{ c #192C2D",
-"6{ c #192C2C",
-"7{ c #192B2D",
-"8{ c #192A2E",
-"9{ c #1A2A30",
-"0{ c #1A2A31",
-"a{ c #1B2A31",
-"b{ c #1B2B31",
-"c{ c #1B2C31",
-"d{ c #192C32",
-"e{ c #192B32",
-"f{ c #192A32",
-"g{ c #192932",
-"h{ c #192D30",
-"i{ c #192D32",
-"j{ c #192D31",
-"k{ c #192C31",
-"l{ c #1B2D32",
-"m{ c #1C2D31",
-"n{ c #1D2D30",
-"o{ c #1B2D30",
-"p{ c #1A2D30",
-"q{ c #1D2E32",
-"r{ c #223237",
-"s{ c #24333A",
-"t{ c #28363E",
-"u{ c #2C3A43",
-"v{ c #35434D",
-"w{ c #394851",
-"x{ c #51666F",
-"y{ c #5F737E",
-"z{ c #657682",
-"A{ c #6A7985",
-"B{ c #6A7B89",
-"C{ c #697C8A",
-"D{ c #677988",
-"E{ c #637784",
-"F{ c #5B717D",
-"G{ c #5A6E7A",
-"H{ c #596C78",
-"I{ c #546874",
-"J{ c #526772",
-"K{ c #516572",
-"L{ c #536A74",
-"M{ c #546A74",
-"N{ c #5A6E77",
-"O{ c #5D6F79",
-"P{ c #5F727F",
-"Q{ c #5F7280",
-"R{ c #5F7380",
-"S{ c #5C7280",
-"T{ c #5A7280",
-"U{ c #586F7D",
-"V{ c #576D7B",
-"W{ c #566B75",
-"X{ c #546872",
-"Y{ c #51636D",
-"Z{ c #4C5E67",
-"`{ c #394952",
-" ] c #304149",
-".] c #2C3D44",
-"+] c #293A3F",
-"@] c #28393D",
-"#] c #253638",
-"$] c #253536",
-"%] c #253537",
-"&] c #253539",
-"*] c #25353B",
-"=] c #25373E",
-"-] c #25373C",
-";] c #25373B",
-">] c #25393D",
-",] c #25393E",
-"'] c #25383E",
-")] c #253940",
-"!] c #253941",
-"~] c #253B43",
-"{] c #263B43",
-"]] c #283B43",
-"^] c #293B43",
-"/] c #2A3B43",
-"(] c #2A3C43",
-"_] c #2A3D43",
-":] c #2B3D43",
-"<] c #2C3D43",
-"[] c #2F3F47",
-"}] c #32414B",
-"|] c #33434C",
-"1] c #34454D",
-"2] c #485862",
-"3] c #50636B",
-"4] c #536771",
-"5] c #556A74",
-"6] c #5A6E79",
-"7] c #5B6F7B",
-"8] c #5B6F7C",
-"9] c #5C717D",
-"0] c #5D727E",
-"a] c #5D737F",
-"b] c #5D7380",
-"c] c #5C727F",
-"d] c #5B6F7E",
-"e] c #5C707D",
-"f] c #596C7A",
-"g] c #576978",
-"h] c #536674",
-"i] c #526573",
-". + @ # $ % & * = - ; > > > > > , ' ) ! > ~ ~ { ] ^ / ( _ : < [ [ [ [ } | [ [ 1 1 1 2 2 3 4 5 6 7 8 9 0 a b 6 5 c d c c e f 5 g h i j 5 5 5 5 5 5 5 6 k l j m m m m m m m m n n n n n n n o p q q q q q q r s t u v w w x y y y y y y z A B C D E F F G H I J K L M M ",
-"N O P Q R S T U U V V W X X Y Z ` ...+. at .#.$.#.%.&.*.=.-.;.;.>.,.,.'.).!.~.~.~.{.;.~.].^./.(.(.(._.:.<.[.>.>.-.}.(.|.|.1.2.3.4.4.5.6.7.8.9.0.(./.<.a.b.c.d.>.~.~.>.>.e.-.f.g.g.h.h.h.h.h.i.j.k.k.l.l.l.m.n.o.p.p.q.r.s.t.u.~.v.w. .x.Z B y.y.B Z z.z.A.B.H Y C.D.E.E.",
-"F.G.H.I.J.C K.L.M.N.O.B.P.Q.R.S.T.U.V.V.k.W.X.g.g.Y.Y.Z.X.X.X.X.`.1. +.+X.++++ at +3.X.#+#+$+$+%+%+&+*+=+-+-+|.;+>+>+>+,+'+)+!+~+~+~+{+]+^+/+(+_+_+:+:+:+<+[+}+|+1+1+|+2+3+4+5+6+7+8+8+9+0+0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+m+o+p+q+r+V.s+t+u+v+w+x+y+z+A+B+C+C.D+E+F+G+H+H+",
-"I+J+K+L+M+C.N+O+P+Q+R+S+F T+U+V+W+X+Y+Z+`+ @. at +@.@@@@@#@$@$@$@#@%@%@&@*@=@=@=@-@;@>@,@,@'@'@)@!@>@~@{@]@^@/@/@(@_@:@<@[@}@}@|@|@|@1 at 1@2 at 3@4 at 5@5 at 6@6 at 7@2 at 8@8 at 8@9 at 9@8 at 8@0 at a@a at b@c at d@e at f@g at h@i at j@k at l@m at n@o at p@q at r@s at M t at t@u at v@w at x@y at z@A at B@C at D@E at F@G at H@I at J@K at L@M at N@O at P@Q at Q@",
-"R at S@T at U@V at W@X at Y@Z at Z@K `@ #.#+#@###$#%#&#*#=#-#;#>#,#,#'#>#>#'#'#)#)#)#!#~#~#~#~#~#{#]#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#2#3#0#3#3#a#b#c#d#e#f#f#g#g#f#h#i#j#j#k#l#m#n#o#p#p#p#p#q#r#r#s#t#u#v#w#x#y#z#A#B#C#t#p#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#X at W#X#Y#Z#Z#",
-"`# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$^$/$($($($_$:$<$<$[$}$}$|$1$2$3$4$4$4$4$4$5$5$6$7$8$9$0$a$b$c$d$e$f$g$h$h$e$i$j$k$l$m$_$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$I$I$I$I$I$I$J$K$L$M$o$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%x@#%$%%%&%*%=%-%;%>%,%'%)%!%!%",
-"~%{%]%^%/%(%_%:%:%<%[%}%|%1%2%3%4%5%6%7%8%9%0%a%b%c%c%c%d%d%e%e%e%e%e%f%g%h%h%h%i%j%k%k%l%m%e%n%o%p%q%i%h%r%s%e%e%e%t%t%g%u%v%w%x%y%y%y%x%z%A%B%C%D%x%z%E%F%G%v%v%v%H%I%H%H%v%v%v%v%v%v%v%J%K%q%q%p%L%L%L%M%N%O%y%x%w%P%Q%R%S%o#T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&=&",
-"-&;&>&,&'&)&!&~&~&~&{&&@]&^&/&(&_&:&<&[&}&}&}&|&1&2&3&4&4&4&4&4&4&4&4&5&6&7&7&8&9&6&0&7&7&a&3&3&<&4&4&4&4&3&3&3&<&<&4&4&b&b&c&d&e&e&e&e&e&e&e&e&f&g&h&h&e&e&e&e&e&c&c&i&j&j&k&l&m&n&o&4&4&p&q&r&s&t&u&4&4&v&w&x&x&f&h&e&e&h&y&z&A&B&C&D&E&F&G&H&I&`%J&K&L&M&N&O&P&Q&Q&",
-"R&S&T&U&# V&W&X&Y&Z&~&`& *.*+*@*#*$*l&%*e&e&e&e&&***=*6&6&6&6&6&6&6&6&6&6&7&7&0&6&-*;*9&=*=*=*=*>*,*'*)*!*~*{*)*'*>*=*]*^*/*(*k&_*:*_*f&f&f&<*[*}*}*|*1*2*3*4*3*5*6*7*8*9*~*0*a*b*c*}*a#d*e*f*=*;*g*g*g*7&9&h*i*j*6*9#[*:*k*l*m*n*B&o*p*q*r*s*t*t*V&u*v*w*x*y*N&z*Q&Q&",
-"R&S&r*A*B*W&C*D*D*Y&E*F*G*H*I*J*K*L*M*N*O*O*O*O*P*j*j*Q*Q*Q*Q*Q*Q*Q*Q*i*R*h*h*R*R*j*i*S*Q*Q*!*9*~*a*T*U*U*U*U*U*V*a*0*0*W*W*0*0*0*X*W*Y*Z*`* =.=+=+=@=Z*#=$=%=V*V*V*V*U*U*U*U*U*U*V*&=+=*=Q*Q*Q*Q*j*}*}*d*d*R*}*}*|*==}*j*Q**=c*-=B&;=p*q*r*>=,='=)=!=~&~={=]=^=z*Q&Q&",
-"/=(=_=:=B*<=[=}=|=)=J&1=2=3=4=5=6=7=8=9=}*j*j*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*j*j*j*j*Q*j*j*!*9*W*a*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*a*0*T*T*U*U*U*U*U*U*U*U*U*U*U*U*U*U*T*W*9*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*)*0=a=b=B&;=p*q*r*>=c=c=)=!=d=e=f=g=^=z*Q&Q&",
-"h=i=j=k=l=m=n=o=<=p=q=r=s=t=u=v=w=x=y=Q*j*Q*Q*Q*Q*Q*)*z=z=z=A=)*Q*B=C=C=C=C=Q*Q*B=C=D=D=E=F=G=H=I=G=G=G=G=G=G=G=G=G=G=U*U*U*U*U*U*H=G=H=U*U*U*U*G=G=U*U*I=G=G=G=G=G=G=H=U*G=G=G=I=U*T*J=E=C=K=C=C=C=C=C=C=L=M=L=L=)*)*z=z=N=y=O=-=P=Q=R=S=T=U=V=W=[=<=X=Y=Z=`= -.-+-+-",
-"@-#-$-k=%-&-*-&-)=u*{&r==---;->-,-'-)-!-Q*Q*Q*Q*Q*)*A=~-~-~-N=N={-]-]-]-]-]-Q*^-/-]-]-]-]-]-]-(-G=]-]-]-]-]-]-]-]-]-]-U*U*U*U*U*U*(-]-]-_-U*:-<-]-]-U*U*G=]-]-]-]-]-]-(-U*H=]-]-]-[-}-|-]-1-L=]-]-]-]-]-]-]-]-]-]-A=)*z=N=N=~*2-3-4-5-6-7-8-9-0-a-m=b-d=Y=Z=c-d-e-e-e-",
-"f-g-h-:=%-&-i-&-)=j-k-l-m-n-o-p-q-r-s-t-A=)*Q*Q*)*N=t-}-T*U*T*u-]-]-v-w-L=x-y-z-A-]-]-B-G=G=G=H=I=G=G=G=C-]-]-_-G=G=G=U*U*U*U*U*U*(-]-]-D-E-F-U*]-]-U*U*G=]-]-C-G=G=G=H=U*U*C-]-]-G-H-D-D-!-I-D=E=J-B-]-]-x-K-L-L-~-~-M-M-t-~*Y*N-O-P-Q-R-S-~&T-a-U-V-~&e=Z=c-W-e-e-e-",
-"@-#-$-k=%-W&C*W&)=u*{&r==---X-Y-Z-`- ;.;N=z=A=z=z=N=t-}-T*U*U*(-]-]-G-t-N=+;T*U*G=]-]-(-U*U*U*U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-]-]-]-U*U*]-]-U*U*G=]-]-(-U*U*U*U*U*U*@;]-]-]-C-]-#;0*0*T*T*U*(-]-]-$;%;&;+;t-t-T*U*U*2-*;=;-;5-;;R-S-~&T->;<=,;~&e=Z=c-W-';';';",
-"@-#-$-k=l=);!;~;{;];F&^;/;t=(;_;:;<;[;};N=N=N=~-~-~-|;T*U*U*U*1;]-]-]-D-L-M-}-U*G=]-]-C-G=G=G=U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-]-]-]-_-U*]-]-U*U*G=]-]-C-G=G=G=U*U*U*V*G-]-]-]-_-2;2;2;U*U*U*(-]-]-3;4;[;+;M-M-T*U*U*5;[#6;7;8;9;0;S-~&!=a;!=!=p=b;c;c-*%d;8 at 8@",
-"@-#-$-k=%-&-i-e;{;f;g;h;i;j;k;9 at l;m;n;o;+;M-|;T*U*2;2;p;2;2;U*U*_-]-]-]-]-_-U*U*G=]-]-]-]-]-]-U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-(-]-]-]-H=]-]-U*U*G=]-]-]-]-]-]-U*U*U*U*U*]-]-]-G=U*U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*U*U*s;t;u;v;w;S-~&x;y;z;x;Z% &A;B;C;D;E;E;",
-"@-#-$-k=%-&-i-e;{;p={&F;G;j;k;9 at H;I;J;K;2;U*U*U*U*U*2;%;%;%;2;U*U*G=C-]-]-]-C-U*G=]-]-C-G=G=G=U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=1;]-]-D-]-]-U*U*G=]-]-C-G=G=G=U*U*U*U*I=]-]-]-C-I=U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*U*U*s;t;L;M;N;O;~&t*z;P;t*Z% &A;B;C;D;E;E;",
-"Q;R;S;T;U;&-i-e;{;!=q=F;G;j;k;9 at V;W;X;Y;p;2;U*U*U*U*2;Z;`;`;%;p;U*U*I=_-]-]-]-U*G=]-]-(-U*U*U*U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=I=D-]-]-]-]-U*U*G=]-]-(-U*U*U*U*U*U*U*_-]-]-]-]-1;U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*2;2; >.>^=+>@>O;~&#>s*c=t*Z% &A;B;C;D;E;E;",
-"$>%>b;&>!=<=*>e;{;a;=>F;G;j;k;->;>>>,>'>2;U*U*U*2;Z;)>!>~>{>]>`;p;2;U*U*]-]-]-U*G=]-]-(-U*U*U*U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=U*H=]-]-]-]-U*U*G=]-]-(-U*U*U*U*U*U*G=]-_-G=]-]-]-U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*2;p; >.>^>Z#@>O;~&/>I&c=t*Z% &A;B;C;D;E;E;",
-"$>(>_>:>T-<>[>[>[>,;}>|>1>2>3>4>5>6>7>8>U*U*U*2;K;9>0>q;a>a>K;b>C-b>(-C-]-]-1;U*G=]-]-D-(-(-(-(-U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=U*U*1;]-]-]-U*U*G=]-]-D-(-(-(-(-U*U*D-D-c>8>C-]-]-d>8>U*e>r;f>]-]-g>h>i>j>a>a>j>k>U*l>m>n>o>p>q>r>s>t>Z%,;I&Z%V&b;c;c-u>v>v>v>",
-"f-w>$-k=x>y>[>*>i-V&z>A>B>C>D>E>F>G>,>Y;a>r;U*U*U*e>e>U*U*U*U*(-]-]-]-]-C-1;U*U*G=]-]-]-]-]-]-]-U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=U*U*U*C-]-]-U*U*G=]-]-]-]-]-]-]-U*_-]-d>H>a>I>]-]-]-J>U*k>K>L>]-]-M>N>O>O>O>O>$*P>Q>R>S>T>U>V>W>X>Y>P;U;a;X=X=d=Y=Z=c-W-';';';",
-"f-g-$-k=x>y>[>*>i-,;Z>`> ,.,+,@,F>m;n;K;8>U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*8>8>r;H>K>0>#,#,#,9>9>K>0>#,#,#,#,#,#,O>N>i>$,Q>z-$*%,&,*,=,-,W>X>;,y;>,}=!=X=d=Y=Z=c-W-';';';",
-",,',$-k=x>y>[>*>i-,;Z>),!,~,{,9@],^,/,2;U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*8>8>8>8>8>8>8>8>8>8>8>8>U*U*U*U*U*U*U*U*U*U*U*U*U*8>r;r;(,0>#,#,#,#,#,#,#,#,#,#,#,#,q;q;K>_,N>P>:,z-:,$*<,[,},|,1,2,3,4,5,&-[=!=X=d=Y=Z=c-W-';';';",
-"6,7,8,k=x>y>[>*>i-,;S;9,0,~,{,9@],^,J;'>H>r;e>U*U*U*U*U*U*U*r;H>r;8>U*U*U*U*U*U*U*U*U*U*U*e>H>H>a>(,(,a,a,b,l>8>U*U*r;r;H>H>H>r;r;H>H>H>H>r;8>8>8>8>8>8>8>8>8>8>8>8>r;H>(,K>#,#,#,#,#,#,#,#,#,#,#,#,K>a>e>e>:,_,O>#,#,N>P>U*c,d,e,f,g,h,i,j,k,H&|=p=d=d=Y=Z=c-W-';';';",
-"l,m,n,o,<=[=[>}=p,U;:=q,r,s,Q-t,u,v,w,x,y,z,A,2;U*U*2;%;%;%;]>{>Z;Z;p;A,/,n;n;A,A,p;2;2;B,b,C,D,D,D,D,E,E,F,F,G,H,H,H,H,I,I,N>O>O>#,#,#,#,O>K>(,a>a>x,J,K,L,M,M,M,J;J;J;N,N,{>{>{>{>{>{>{>O,P,Q,O,{>R,S,T,U,V,W,X,Y,Y,Y,Y,Z,N-`, '.'$$+'@'#'!=$'%'G&U;d=b;&'*'='-';';'",
-">','''d=<=}=*>}=<>a;)'!'~'`@{']'^'/'('_':'Y;Y;8>U*r;H>:':':'Y;<'U*U*U*['}'|'|'K,1':'!>!>D,D,2'2'3'3'3'|'|'4'4'4'4'4'4'4'5'5'6'6'6'7'7'8'|'9'#,#,#,9'0'0'}'a'b'b'b'b'b'b'c'd'e'P,f'f'f'f'f'g'g'h'i':'(,q;j'k'l'm'n'o'o'J,!>p'|'q'r's't'u'@'v'd=}=[>5,H&V&w'x'y'z'A'B'B'",
-"C'D'E':>U;W&D*C**-F'G'H'I'J'K'L'M'N'O'P'Q'Q'Q'Q'Q'Q'R'S'b'R'Q'Q'6;8'|'T'b'b'b'b'b'b'U'U'V'W'X'Y'Z'`' ).).)}'}'}'}'}'}'+)T'@)b'b'b'#)#)$)%)&)*)=)-)-)b'b'b'R'Q'Q'Q'Q'Q'Q';) >>),)}'}'}'')')))!)~){)])^)}'/)()_)()}'}'}'')^):)<)[)})|)+$1)i,Y%X=}=[>2)5,Z%w'x'y'z'3)4)4)",
-"5)6) &&>)=o=7)8)D*9)0)a)b)c)d)e)f)g)h)i)j)O'k)l)m)m)m)m)m)m)n)n)o)o)p)q)m)m)n)r)s)t)u)u)v)v)w)x)y)y)y)z)z)A)A)A)A)A)A)B)C)D)E)F)F)G)G)G)G)H)H)H)I)I)J)J)J)K)L)L)L)L)L)L)M)M)C)N)O)P)Q)Q)Q)R)S)s)T)m)U)V)N)J)P)Q)Q)F)F)W)O-X)Y)Z)`) !.!Q at +!E'G&*>@!D*X&Z%w'&'*'#!w*Z=Z=",
-"$!%!''X=<=~;7)8)D*9)&!*!y*=!-!;!>!,!'!)!!!~!{!]!]!{!{!^!^!^!/!(!_!:!<![!{!}!|!1!1!2!2!2!3!3!4!:!5!6!6!7!8!9!9!9!9!9!9!9!0!0!0!0!0!0!0!0!a!b!c!c!d!e!e!e!e!f!g!g!g!g!g!g!h!h!i!j!k!l!h!m!n!o!p!q!q!q!l!r!s!t!u!v!w!x!y!z!A!B!v>C!D!Q at E!F!# t>z;G!*-8)X&U;E'Z=#!#!H!I!I!",
-"B*J!T;p=~;K!L!M!N!@!O!!&P!Q!R!S!T!U!V!W!X!Y!Z!`! ~.~+~@~#~#~$~%~&~&~*~=~]&-~=~;~>~,~'~)~s,!~~~~~{~]~^~^~^~~~~~~~~~~~~~~~^~/~(~(~(~(~(~(~_~:~:~:~:~:~:~:~:~<~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~}~|~1~1~1~2~2~3~3~4~4~4~e+5~6~6+7~8~9~0~7-w*a~b~t>x;c~d~%'~;,;9-j=e~f~g~h~h~",
-"%')=!=!=%'i~L!M!N!>,j~E'k~l~m~n~o~p~J q~r~s~t~u~v~w~k.2.x~y~z~V.w~w~w~u~A~B~B~C~C~^.[.[.A~D~D~D~D~E~E~F~F~G~G~G~G~G~G~G~H~H~I~I~I~I~I~I~J~K~L~L~L~L~L~L~L~u~D~D~D~D~D~D~D~D~D~D~D~D~D~D~D~n.l.M~N~O~L~L~w~w~w~P~m.Q~R~S~T~U~G+V~W~X~;'Y~Z~`~ {.{+{@{#{${%{&{*{y;={={={",
-"-{;{>{,{'{){!{~{{{]{^{/{({_{:{<{[{}{|{1{2{C.3{G 4{5{t~^.).).-.-.!.!.6{7{8{9{0{a{a{a{b{c{d{d{d{e{f{g{g{e{e{h{h{h{h{h{h{h{i{i{d{d{d{d{d{d{d{j{h{h{h{h{h{h{h{k{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{l{m{8+n{o{p{h{h{h{#.q{L+r{s{t{u{v{w{S=*'s>x;x{y{z{A{B{C{D{E{F{G{H{I{J{K{K{K{",
-"L{M{N{O{P{Q{R{S{T{U{V{W{X{Y{Z{# c-]=`{Y# ].]f +]@]y #]$]$]$]%]&]*]s =]-]y y y y y y ;];]>],],]']=]=]=])]!]~]~]~]~]~]~]{]]]^]/]/]/]/]/]/](]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]:]<][]}]|]1]`{;&2]Z{3]4]5]6]7]8]9]0]a]b]a]c]d]e]9]f]g]h]i]i]"};
diff --git a/gtk2_ardour/pixmaps/small-round-button-01.xpm b/gtk2_ardour/pixmaps/small-round-button-01.xpm
deleted file mode 100644
index 871f90c..0000000
--- a/gtk2_ardour/pixmaps/small-round-button-01.xpm
+++ /dev/null
@@ -1,598 +0,0 @@
-/* XPM */
-static char * t_small_round_button_01_xpm[] = {
-"28 30 565 2",
-" c None",
-". c #3C4B52",
-"+ c #465960",
-"@ c #44575D",
-"# c #45565D",
-"$ c #4A5961",
-"% c #3A4B53",
-"& c #39464D",
-"* c #32424A",
-"= c #34464D",
-"- c #36454C",
-"; c #34434C",
-"> c #35464E",
-", c #34444C",
-"' c #34434D",
-") c #35454F",
-"! c #374750",
-"~ c #314248",
-"{ c #34444A",
-"] c #2A343A",
-"^ c #3A454C",
-"/ c #37464F",
-"( c #394850",
-"_ c #3E4F55",
-": c #405157",
-"< c #3E5259",
-"[ c #46585F",
-"} c #41545A",
-"| c #3E5057",
-"1 c #3E4E57",
-"2 c #3E4C56",
-"3 c #39494F",
-"4 c #36434A",
-"5 c #273437",
-"6 c #2F3A41",
-"7 c #394952",
-"8 c #3A4E58",
-"9 c #40525C",
-"0 c #41515A",
-"a c #45555B",
-"b c #42565B",
-"c c #41555A",
-"d c #45575E",
-"e c #43575C",
-"f c #45545E",
-"g c #45525A",
-"h c #42525A",
-"i c #415158",
-"j c #3D4E56",
-"k c #3C4D55",
-"l c #354750",
-"m c #2D3B45",
-"n c #2E3B43",
-"o c #404F58",
-"p c #42545D",
-"q c #43595D",
-"r c #42585B",
-"s c #45545B",
-"t c #414E54",
-"u c #35454E",
-"v c #2E3E44",
-"w c #2A3C42",
-"x c #2F4048",
-"y c #324249",
-"z c #39454B",
-"A c #404D51",
-"B c #425257",
-"C c #43565B",
-"D c #41555B",
-"E c #41505A",
-"F c #394955",
-"G c #2D3943",
-"H c #324147",
-"I c #405259",
-"J c #47565F",
-"K c #46585C",
-"L c #475A5A",
-"M c #3B4D4F",
-"N c #2C3B3D",
-"O c #293B3E",
-"P c #33434A",
-"Q c #394A52",
-"R c #44525B",
-"S c #49565D",
-"T c #364649",
-"U c #2C3D41",
-"V c #2D3E41",
-"W c #394B4F",
-"X c #425659",
-"Y c #465561",
-"Z c #44545F",
-"` c #40515C",
-" . c #303D45",
-".. c #232F33",
-"+. c #43535B",
-"@. c #4A5C62",
-"#. c #4A5B62",
-"$. c #485458",
-"%. c #354144",
-"&. c #223034",
-"*. c #31404A",
-"=. c #506069",
-"-. c #617380",
-";. c #738492",
-">. c #7F8E9C",
-",. c #7D8C9C",
-"'. c #7E8D9C",
-"). c #71828E",
-"!. c #5D6F79",
-"~. c #44555B",
-"{. c #2B3C41",
-"]. c #344548",
-"^. c #43515C",
-"/. c #4A5660",
-"(. c #43555C",
-"_. c #415058",
-":. c #263035",
-"<. c #40535A",
-"[. c #4A5A62",
-"}. c #46555E",
-"|. c #2D393F",
-"1. c #414F5A",
-"2. c #687686",
-"3. c #8293A5",
-"4. c #93A5BC",
-"5. c #9DB1C8",
-"6. c #9CB1C8",
-"7. c #96ABC2",
-"8. c #95ABC3",
-"9. c #98A9C0",
-"0. c #93A5BA",
-"a. c #818E9F",
-"b. c #576570",
-"c. c #35424A",
-"d. c #314144",
-"e. c #42535A",
-"f. c #4A5A61",
-"g. c #495A5F",
-"h. c #405158",
-"i. c #303D42",
-"j. c #485A68",
-"k. c #4A5B5F",
-"l. c #4B5B5D",
-"m. c #334345",
-"n. c #233037",
-"o. c #485660",
-"p. c #6C7B8A",
-"q. c #8A9AB1",
-"r. c #92A1BB",
-"s. c #91A3BB",
-"t. c #8EA0B6",
-"u. c #8799B2",
-"v. c #8597B0",
-"w. c #8598B0",
-"x. c #8C9BB1",
-"y. c #90A0B7",
-"z. c #95A4B9",
-"A. c #8090A4",
-"B. c #5D6C7C",
-"C. c #2D3F3E",
-"D. c #35444C",
-"E. c #4A5860",
-"F. c #4E5D63",
-"G. c #475A61",
-"H. c #2C3A3D",
-"I. c #3C4C52",
-"J. c #4F6271",
-"K. c #4A5E61",
-"L. c #415051",
-"M. c #263437",
-"N. c #334149",
-"O. c #687583",
-"P. c #7F90A1",
-"Q. c #899AAF",
-"R. c #8393AC",
-"S. c #8594AA",
-"T. c #8393A7",
-"U. c #8391A7",
-"V. c #8394AA",
-"W. c #8393A8",
-"X. c #8696AC",
-"Y. c #8496AB",
-"Z. c #7A8DA0",
-"`. c #526264",
-" + c #2A3A3F",
-".+ c #424E53",
-"++ c #4F5D63",
-"@+ c #4D5E62",
-"#+ c #3A4B4D",
-"$+ c #4D5F66",
-"%+ c #4A616A",
-"&+ c #485D5D",
-"*+ c #2E3F3E",
-"=+ c #253238",
-"-+ c #7C8A9B",
-";+ c #8191A2",
-">+ c #8190A4",
-",+ c #8091A5",
-"'+ c #7E8EA3",
-")+ c #7B8DA2",
-"!+ c #7C8DA4",
-"~+ c #808DA4",
-"{+ c #808FA4",
-"]+ c #828EA4",
-"^+ c #8390A4",
-"/+ c #8392A8",
-"(+ c #8392A6",
-"_+ c #76858D",
-":+ c #404E51",
-"<+ c #314245",
-"[+ c #48595F",
-"}+ c #505F6A",
-"|+ c #4A5E64",
-"1+ c #2D363A",
-"2+ c #52626A",
-"3+ c #50646A",
-"4+ c #435656",
-"5+ c #253736",
-"6+ c #364148",
-"7+ c #6D7A8A",
-"8+ c #7C8B9D",
-"9+ c #7B8B9E",
-"0+ c #7C8EA2",
-"a+ c #7C8D9D",
-"b+ c #7B8B9C",
-"c+ c #7B8C9D",
-"d+ c #7B8B9D",
-"e+ c #808EA3",
-"f+ c #7B8AA1",
-"g+ c #7C8BA3",
-"h+ c #808EA4",
-"i+ c #818D9E",
-"j+ c #556668",
-"k+ c #2B3E3B",
-"l+ c #45565A",
-"m+ c #52616A",
-"n+ c #4C6065",
-"o+ c #283336",
-"p+ c #52636A",
-"q+ c #52656A",
-"r+ c #3A504F",
-"s+ c #253437",
-"t+ c #48545E",
-"u+ c #798496",
-"v+ c #7B899D",
-"w+ c #7B899E",
-"x+ c #7B8A9C",
-"y+ c #7A8C9B",
-"z+ c #7A899B",
-"A+ c #7B899C",
-"B+ c #7E8BA3",
-"C+ c #808BA3",
-"D+ c #7D8AA2",
-"E+ c #7E8A9F",
-"F+ c #7E8AA2",
-"G+ c #7C889D",
-"H+ c #6C7B7D",
-"I+ c #32443E",
-"J+ c #3A4C4F",
-"K+ c #4D626A",
-"L+ c #4C6068",
-"M+ c #4F636A",
-"N+ c #50656B",
-"O+ c #52666B",
-"P+ c #3B4B4A",
-"Q+ c #263536",
-"R+ c #516067",
-"S+ c #778698",
-"T+ c #7B889C",
-"U+ c #7B8898",
-"V+ c #73828B",
-"W+ c #394A4F",
-"X+ c #374A4F",
-"Y+ c #50656A",
-"Z+ c #4C6365",
-"`+ c #374844",
-" @ c #263537",
-".@ c #52636E",
-"+@ c #768596",
-"@@ c #7B8595",
-"#@ c #7B859A",
-"$@ c #7A879A",
-"%@ c #79889C",
-"&@ c #7A889C",
-"*@ c #79879C",
-"=@ c #75859A",
-"-@ c #7A8594",
-";@ c #75838C",
-">@ c #3E4E51",
-",@ c #3A4A4F",
-"'@ c #51646A",
-")@ c #4C626A",
-"!@ c #4F6468",
-"~@ c #3B4A48",
-"{@ c #253536",
-"]@ c #52626D",
-"^@ c #768398",
-"/@ c #768294",
-"(@ c #7A8294",
-"_@ c #7B8294",
-":@ c #7B8494",
-"<@ c #7B8696",
-"[@ c #7B8698",
-"}@ c #7B869C",
-"|@ c #78859B",
-"1@ c #7A859C",
-"2@ c #79859A",
-"3@ c #74838B",
-"4@ c #3E4F51",
-"5@ c #3B4C4F",
-"6@ c #52676A",
-"7@ c #52666A",
-"8@ c #3F4F4E",
-"9@ c #253436",
-"0@ c #495863",
-"a@ c #728091",
-"b@ c #778194",
-"c@ c #7B8194",
-"d@ c #7B8594",
-"e@ c #7B8596",
-"f@ c #7B859C",
-"g@ c #7A859B",
-"h@ c #788496",
-"i@ c #7B8499",
-"j@ c #798596",
-"k@ c #6B7B84",
-"l@ c #39484B",
-"m@ c #3F5052",
-"n@ c #52666D",
-"o@ c #52686D",
-"p@ c #54666D",
-"q@ c #435451",
-"r@ c #263736",
-"s@ c #394950",
-"t@ c #70798A",
-"u@ c #788092",
-"v@ c #788194",
-"w@ c #7B8396",
-"x@ c #7B8598",
-"y@ c #7B8599",
-"z@ c #7B849A",
-"A@ c #7A8399",
-"B@ c #7B8498",
-"C@ c #758194",
-"D@ c #758393",
-"E@ c #5E7076",
-"F@ c #334448",
-"G@ c #52656D",
-"H@ c #52676D",
-"I@ c #526973",
-"J@ c #536973",
-"K@ c #475C5B",
-"L@ c #304340",
-"M@ c #2D3B41",
-"N@ c #626D7C",
-"O@ c #717D8D",
-"P@ c #738194",
-"Q@ c #7A849A",
-"R@ c #7A8396",
-"S@ c #7B8394",
-"T@ c #7B859B",
-"U@ c #798194",
-"V@ c #7A8497",
-"W@ c #778191",
-"X@ c #737F88",
-"Y@ c #4C5A5D",
-"Z@ c #304346",
-"`@ c #4B5A62",
-" # c #526673",
-".# c #526972",
-"+# c #2D393A",
-"@# c #526A73",
-"## c #4F6265",
-"$# c #3B4C4D",
-"%# c #2A383B",
-"&# c #6B7787",
-"*# c #737F8F",
-"=# c #737F91",
-"-# c #7A8394",
-";# c #788497",
-"># c #7A8495",
-",# c #738191",
-"'# c #75818F",
-")# c #707D88",
-"!# c #697579",
-"~# c #394947",
-"{# c #374B4A",
-"]# c #4F6165",
-"^# c #526670",
-"/# c #43585D",
-"(# c #536D73",
-"_# c #526771",
-":# c #485861",
-"<# c #324142",
-"[# c #334043",
-"}# c #525F6A",
-"|# c #6B7A84",
-"1# c #737D8B",
-"2# c #737F90",
-"3# c #738090",
-"4# c #738190",
-"5# c #768390",
-"6# c #788390",
-"7# c #73808B",
-"8# c #707E8A",
-"9# c #657580",
-"0# c #48575E",
-"a# c #374647",
-"b# c #4B5D5C",
-"c# c #57696F",
-"d# c #576975",
-"e# c #44565D",
-"f# c #37474E",
-"g# c #536D7A",
-"h# c #52697A",
-"i# c #4F636F",
-"j# c #425351",
-"k# c #2F3E3C",
-"l# c #344148",
-"m# c #505E69",
-"n# c #69747F",
-"o# c #6B7784",
-"p# c #6F7C88",
-"q# c #717D89",
-"r# c #717D8B",
-"s# c #6C7D86",
-"t# c #6C7D89",
-"u# c #6B7C83",
-"v# c #485961",
-"w# c #334150",
-"x# c #435258",
-"y# c #54646A",
-"z# c #596D78",
-"A# c #5A6B7A",
-"B# c #39474E",
-"C# c #526B78",
-"D# c #546C79",
-"E# c #576B72",
-"F# c #4D6062",
-"G# c #384C4D",
-"H# c #29383F",
-"I# c #2E3C46",
-"J# c #4C5960",
-"K# c #636D73",
-"L# c #65757D",
-"M# c #677882",
-"N# c #657982",
-"O# c #687985",
-"P# c #677983",
-"Q# c #69777D",
-"R# c #68757B",
-"S# c #59686D",
-"T# c #3C4E54",
-"U# c #324348",
-"V# c #3A4C59",
-"W# c #52636F",
-"X# c #5A707D",
-"Y# c #586B78",
-"Z# c #35434C",
-"`# c #586E7B",
-" $ c #5A707A",
-".$ c #576A71",
-"+$ c #4E5F65",
-"@$ c #3E4C51",
-"#$ c #2E3C40",
-"$$ c #293637",
-"%$ c #334041",
-"&$ c #435156",
-"*$ c #505E65",
-"=$ c #56666B",
-"-$ c #576A6E",
-";$ c #556567",
-">$ c #4F5B5F",
-",$ c #3C4A4D",
-"'$ c #2D3C44",
-")$ c #314149",
-"!$ c #3E515A",
-"~$ c #4E626C",
-"{$ c #5B6F78",
-"]$ c #5D737B",
-"^$ c #5A727B",
-"/$ c #38464C",
-"($ c #4C5E66",
-"_$ c #5D727C",
-":$ c #5E717D",
-"<$ c #596D75",
-"[$ c #516569",
-"}$ c #455858",
-"|$ c #334343",
-"1$ c #273636",
-"2$ c #233132",
-"3$ c #273334",
-"4$ c #2B3536",
-"5$ c #273536",
-"6$ c #273333",
-"7$ c #273439",
-"8$ c #29373D",
-"9$ c #384550",
-"0$ c #495B66",
-"a$ c #576A73",
-"b$ c #5C717C",
-"c$ c #61737D",
-"d$ c #61757D",
-"e$ c #4B5F66",
-"f$ c #4F5C68",
-"g$ c #627183",
-"h$ c #61727F",
-"i$ c #5E7178",
-"j$ c #556970",
-"k$ c #506266",
-"l$ c #45585B",
-"m$ c #3D4E50",
-"n$ c #384648",
-"o$ c #364246",
-"p$ c #344347",
-"q$ c #3B484A",
-"r$ c #45555D",
-"s$ c #51616A",
-"t$ c #586976",
-"u$ c #5F7280",
-"v$ c #617582",
-"w$ c #637884",
-"x$ c #4F5F6A",
-"y$ c #4F5E6D",
-"z$ c #627787",
-"A$ c #637A87",
-"B$ c #617785",
-"C$ c #627683",
-"D$ c #64747F",
-"E$ c #5E7078",
-"F$ c #5C6D73",
-"G$ c #5F7077",
-"H$ c #5F7178",
-"I$ c #62747B",
-"J$ c #677784",
-"K$ c #6A7B87",
-"L$ c #687B87",
-"M$ c #6A7E8E",
-"N$ c #677B8B",
-"O$ c #6A798B",
-"P$ c #52606C",
-"Q$ c #3D4D52",
-"R$ c #5E7383",
-"S$ c #687A8B",
-"T$ c #6A7D8B",
-"U$ c #6A7C8B",
-"V$ c #677A8A",
-"W$ c #6A7A8A",
-"X$ c #6A7B8B",
-"Y$ c #6A7C8E",
-"Z$ c #6A808E",
-"`$ c #6A7F8B",
-" % c #6A7E8C",
-".% c #6A7E8B",
-"+% c #637683",
-"@% c #404E55",
-"#% c #566672",
-"$% c #60717E",
-"%% c #6A7D8C",
-"&% c #6A8092",
-"*% c #6A8190",
-"=% c #6E8191",
-"-% c #637584",
-";% c #576873",
-">% c #566671",
-" . + @ # $ % ",
-" & * = - ; > , ' ) ! ~ { ",
-" ] ^ / ( _ : < [ } | 1 2 3 / 4 5 ",
-" 6 7 8 9 0 a b c d e f g h i j k l m ",
-" n o p q r s t u v w x y z A B C D E F G ",
-" H I J K L M N O P Q R S g T U V W X Y Z ` . ",
-" ..+. at .#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:. ",
-" <.#.[.}.n |.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h. ",
-" i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H. ",
-" I.J.K.L.M.N.O.P.Q.R.S.T.U.U.V.W.T.X.Y.Z.`. +.+++ at +#+ ",
-" $+%+&+*+=+b.-+;+>+,+'+)+!+~+{+]+{+^+/+(+_+:+<+[+}+|+ ",
-"1+2+3+4+5+6+7+8+9+0+a+b+c+c+c+d+e+f+g+^+h+i+j+k+l+m+n+o+",
-"p+p+q+r+s+t+u+v+w+x+y+z+A+A+A+A+B+C+D+E+F+G+H+I+J+m+K+L+",
-"M+N+O+P+Q+R+S+A+A+A+A+A+A+A+A+A+A+A+A+x+T+U+V+W+X+2+3+%+",
-"q+Y+Z+`+ @. at +@@@@@#@#@$@A+A+A+A+A+%@&@*@=@-@;@>@, at 2+'@)@",
-"q+Y+!@~@{@]@^@/@(@_@:@-@<@[@}@}@}@|@1 at 1@2 at -@3 at 4@5 at 2+q+q+",
-"q+6 at 7@8 at 9@0 at a@b at b@c at c@:@d at e@f at f@g at h@f at f@i at j@k at l@m at 2+q+7@",
-"n at o@p at q@r at s@t at u@v at c@w@@@d at x@y at y@f at z@A at B@C at D@E at F@l+G at n@H@",
-"|.I at J@K at L@M at N@O at P@b at Q@R@(@S@:@d at T@i at U@V at W@X at Y@Z@`@ #.#+#",
-" @#I@##$#%#/.&#*#=#U at C@C at -#:@d@;#>#,#'#)#!#~#{#]#^#I@ ",
-" /#(#_#:#<#[#}#|#1#2#3#4#4#5#6#3#4#7#8#9#0#a#b#c#d#e# ",
-" f#g#h#i#j#k#l#m#n#o#p#q#r#r#r#s#t#u#E at v#w#x#y#z#A#B# ",
-" C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#z#X#Y# ",
-" Z#`# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$^$/$ ",
-" ($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$0$a$b$c$d$e$ ",
-" f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$w$x$ ",
-" y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$ ",
-" Q$R$S$T$U$V$W$W$X$Y$Z$`$ %.%+%@% ",
-" #%$%T$T$T$T$%%&%*%=%-%;% ",
-" >%T$T$T$T$>% "};
diff --git a/gtk2_ardour/pixmaps/small_x.xpm b/gtk2_ardour/pixmaps/small_x.xpm
deleted file mode 100644
index ee8e930..0000000
--- a/gtk2_ardour/pixmaps/small_x.xpm
+++ /dev/null
@@ -1,16 +0,0 @@
-/* XPM */
-static const gchar * small_x_xpm[] = {
-"11 11 2 1",
-" c None",
-". c #cccccc",
-" ",
-" ",
-" . . ",
-" . . ",
-" . . ",
-" . ",
-" . . ",
-" . . ",
-" . . ",
-" ",
-" "};
diff --git a/gtk2_ardour/pixmaps/toggle-button-00.xpm b/gtk2_ardour/pixmaps/toggle-button-00.xpm
deleted file mode 100644
index 7606152..0000000
--- a/gtk2_ardour/pixmaps/toggle-button-00.xpm
+++ /dev/null
@@ -1,354 +0,0 @@
-/* XPM */
-static char * toggle_button_00_xpm[] = {
-"21 22 329 2",
-" c None",
-". c #52646A",
-"+ c #56686E",
-"@ c #506268",
-"# c #4C5E66",
-"$ c #4E626A",
-"% c #52646C",
-"& c #52636A",
-"* c #52636C",
-"= c #52636E",
-"- c #50626C",
-"; c #4E6166",
-"> c #4E5F66",
-", c #4C5D66",
-"' c #4E5E66",
-") c #505F68",
-"! c #52656A",
-"~ c #52676C",
-"{ c #54676C",
-"] c #415156",
-"^ c #2B3A41",
-"/ c #24343D",
-"( c #28363D",
-"_ c #24363D",
-": c #24383D",
-"< c #29363D",
-"[ c #24363F",
-"} c #27363F",
-"| c #27343B",
-"1 c #2D3944",
-"2 c #37464E",
-"3 c #485960",
-"4 c #42545A",
-"5 c #29383F",
-"6 c #2F3C46",
-"7 c #2F4143",
-"8 c #334246",
-"9 c #2F3F46",
-"0 c #314046",
-"a c #354246",
-"b c #313F46",
-"c c #314048",
-"d c #333F48",
-"e c #313F48",
-"f c #33404A",
-"g c #2F3B46",
-"h c #2B393F",
-"i c #3B4A52",
-"j c #394C54",
-"k c #394752",
-"l c #415058",
-"m c #415252",
-"n c #29393F",
-"o c #28383F",
-"p c #28373D",
-"q c #2D383D",
-"r c #2D373D",
-"s c #2D3A3D",
-"t c #2D393D",
-"u c #2B373F",
-"v c #2A373D",
-"w c #283837",
-"x c #283A3D",
-"y c #3B4952",
-"z c #3D4D56",
-"A c #394750",
-"B c #3F5258",
-"C c #44565E",
-"D c #46585E",
-"E c #39474A",
-"F c #3B4B56",
-"G c #4E5A66",
-"H c #525C66",
-"I c #525E6A",
-"J c #52606A",
-"K c #56606A",
-"L c #525E68",
-"M c #48585E",
-"N c #2F3E3D",
-"O c #202F31",
-"P c #2A3B42",
-"Q c #46545E",
-"R c #435260",
-"S c #3D4D58",
-"T c #43575E",
-"U c #4A5A62",
-"V c #4E5B5E",
-"W c #37484E",
-"X c #62707F",
-"Y c #8190A8",
-"Z c #8C9AB4",
-"` c #8E9EB4",
-" . c #8E9EB8",
-".. c #8C9CB4",
-"+. c #8C9EB4",
-"@. c #90A0B8",
-"#. c #90A2B6",
-"$. c #90A0B4",
-"%. c #90A2B0",
-"&. c #627379",
-"*. c #2B363D",
-"=. c #2D3A46",
-"-. c #465766",
-";. c #465762",
-">. c #3F4F5A",
-",. c #465860",
-"'. c #4A5D62",
-"). c #4E6164",
-"!. c #6A7A8E",
-"~. c #92A0BE",
-"{. c #94A2C0",
-"]. c #94A6C4",
-"^. c #94A6C9",
-"/. c #94A4C3",
-"(. c #94A4C0",
-"_. c #96A6C2",
-":. c #96A4C2",
-"<. c #909EB8",
-"[. c #8392A0",
-"}. c #424C54",
-"|. c #2F3F48",
-"1. c #4A5B66",
-"2. c #4A5962",
-"3. c #3F515C",
-"4. c #4A5F62",
-"5. c #4C5F62",
-"6. c #37414A",
-"7. c #68748C",
-"8. c #7F8EAA",
-"9. c #7F8FA8",
-"0. c #7F8EA8",
-"a. c #7F8DA8",
-"b. c #7F8BA6",
-"c. c #7D88A2",
-"d. c #7D8998",
-"e. c #46565E",
-"f. c #2D4048",
-"g. c #3D505A",
-"h. c #465B5E",
-"i. c #4A5F66",
-"j. c #313D4A",
-"k. c #667184",
-"l. c #7B87A2",
-"m. c #7B89A4",
-"n. c #7987A2",
-"o. c #7785A0",
-"p. c #7B879C",
-"q. c #7B88A0",
-"r. c #7B869E",
-"s. c #7B8596",
-"t. c #46565A",
-"u. c #2D3D42",
-"v. c #465B66",
-"w. c #4A5E66",
-"x. c #313C48",
-"y. c #64707F",
-"z. c #79859A",
-"A. c #798598",
-"B. c #738598",
-"C. c #738398",
-"D. c #73849A",
-"E. c #73859C",
-"F. c #75859A",
-"G. c #778798",
-"H. c #77859A",
-"I. c #79849C",
-"J. c #758490",
-"K. c #46585A",
-"L. c #2B3C42",
-"M. c #465A62",
-"N. c #465B62",
-"O. c #4A5C66",
-"P. c #2F3C43",
-"Q. c #606C7D",
-"R. c #778294",
-"S. c #798394",
-"T. c #758394",
-"U. c #738394",
-"V. c #738294",
-"W. c #738194",
-"X. c #738494",
-"Y. c #738396",
-"Z. c #738496",
-"`. c #73818B",
-" + c #263A40",
-".+ c #485B64",
-"++ c #4A5C62",
-"@+ c #3F505A",
-"#+ c #2D3D43",
-"$+ c #5E6C78",
-"%+ c #778094",
-"&+ c #778194",
-"*+ c #738192",
-"=+ c #737E8B",
-"-+ c #283A42",
-";+ c #41505A",
-">+ c #465A5E",
-",+ c #2D3D41",
-"'+ c #5E6B76",
-")+ c #738190",
-"!+ c #737D8B",
-"~+ c #465656",
-"{+ c #2D3B42",
-"]+ c #465A64",
-"^+ c #4A5B62",
-"/+ c #41515A",
-"(+ c #465B64",
-"_+ c #4A5D64",
-":+ c #2D3D3D",
-"<+ c #5C6A74",
-"[+ c #737F8B",
-"}+ c #73808B",
-"|+ c #73808D",
-"1+ c #737F90",
-"2+ c #737F92",
-"3+ c #737F8D",
-"4+ c #6E7D87",
-"5+ c #445256",
-"6+ c #2D3C42",
-"7+ c #465962",
-"8+ c #41525A",
-"9+ c #4A5E62",
-"0+ c #46595E",
-"a+ c #2B3B41",
-"b+ c #5A6A72",
-"c+ c #6C7B87",
-"d+ c #6E7C89",
-"e+ c #6E7B87",
-"f+ c #6C7C89",
-"g+ c #6A7B89",
-"h+ c #6A7987",
-"i+ c #6A7B87",
-"j+ c #687B87",
-"k+ c #6A7A83",
-"l+ c #404A4E",
-"m+ c #2F3D44",
-"n+ c #485A64",
-"o+ c #41545A",
-"p+ c #2D3D46",
-"q+ c #647581",
-"r+ c #647783",
-"s+ c #627583",
-"t+ c #647681",
-"u+ c #62757F",
-"v+ c #60757F",
-"w+ c #64757F",
-"x+ c #62737B",
-"y+ c #334248",
-"z+ c #2F3F44",
-"A+ c #4A5D66",
-"B+ c #485C66",
-"C+ c #2A3D44",
-"D+ c #31414A",
-"E+ c #526268",
-"F+ c #56676E",
-"G+ c #56696E",
-"H+ c #56656E",
-"I+ c #54666E",
-"J+ c #56666C",
-"K+ c #4E5C64",
-"L+ c #374A52",
-"M+ c #4C6068",
-"N+ c #3F525A",
-"O+ c #4A5D6A",
-"P+ c #3D5056",
-"Q+ c #2F3F41",
-"R+ c #273639",
-"S+ c #223133",
-"T+ c #203033",
-"U+ c #203437",
-"V+ c #203335",
-"W+ c #203235",
-"X+ c #223135",
-"Y+ c #2D393F",
-"Z+ c #394B52",
-"`+ c #445862",
-" @ c #4C6268",
-".@ c #41555A",
-"+@ c #465D66",
-"@@ c #485D66",
-"#@ c #4A5F6A",
-"$@ c #3B4D54",
-"%@ c #2D3A42",
-"&@ c #28373E",
-"*@ c #283840",
-"=@ c #26363E",
-"-@ c #24363E",
-";@ c #2B3840",
-">@ c #35454E",
-",@ c #48575E",
-"'@ c #4E606A",
-")@ c #4C606A",
-"!@ c #465C64",
-"~@ c #3D525C",
-"{@ c #4A606A",
-"]@ c #4A616A",
-"^@ c #485B62",
-"/@ c #435660",
-"(@ c #3D4E56",
-"_@ c #3D4C56",
-":@ c #4A5B64",
-"<@ c #4C5F68",
-"[@ c #4A5E68",
-"}@ c #485F68",
-"|@ c #506773",
-"1@ c #526875",
-"2@ c #566A77",
-"3@ c #566975",
-"4@ c #526570",
-"5@ c #4E636C",
-"6@ c #4A5F68",
-"7@ c #546670",
-"8@ c #566A72",
-"9@ c #566B75",
-"0@ c #546973",
-"a@ c #50656E",
-"b@ c #526971",
-"c@ c #526A75",
-"d@ c #546C77",
-"e@ c #566D7B",
-"f@ c #586D7B",
-"g@ c #586C79",
-"h@ c #546A73",
-"i@ c #566B73",
-"j@ c #566C77",
-"k@ c #566D77",
-"l@ c #566B77",
-"m@ c #546777",
-"n@ c #526673",
-". + @ # $ % & * = - ; > , # > > > ' ) ! ~ ",
-"{ ] ^ / ( _ : < [ } < < < < < < < | 1 2 3 ",
-"4 5 6 7 8 9 0 a b b 0 0 0 c d b e f g h i ",
-"j k l m n o ( p q r s s t u v w x y z A k ",
-"B C D E F G H H I I J K J L M N O P Q R S ",
-"T U V W X Y Z ` ...+. at .#.$.%.&.*.=.-.;.>.",
-",.'.).y !.~.{.].^./.(.(._.:.<.[.}.|.1.2.3.",
-";.4.5.6.7.8.9.9.9.0.a.a.9.b.c.d.e.f.1.2.g.",
-"h.i.'.j.k.l.m.m.m.n.o.p.p.q.r.s.t.u.v.2.g.",
-"h.w.1.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.U g.",
-"N.O.1.P.Q.R.S.T.U.V.W.U.X.Y.Z.`.t. +.+++ at +",
-"v.1.M.#+$+%+&+W.V.V.W.W.W.W.*+=+t.-+v.++;+",
-"v.O.>+,+'+%+&+W.W.W.W.W.W.W.)+!+~+{+]+^+/+",
-"(+_+h.:+<+=+[+}+`.|+1+1+1+2+3+4+5+6+7+^+8+",
-"N.9+0+a+b+c+d+e+f+g+h+i+i+d+j+k+l+m+n+++o+",
-"N.'.o+p+% q+r+s+s+t+u+u+u+v+w+x+y+z+A+++8+",
-"N.'.B+C+D+E+F++ G+F+H+H+H+I+J+K+D+L+M+'.N+",
-"N.A+O+P+Q+R+S+T+U+V+W+W+W+X+Y+Z+`+w. @'..@",
-"+@@@#@T $@y+%@&@*@&@=@-@=@;@>@,@'@)@M+!@~@",
-"{@]@]@#@^@/@@+z P+(@z _ at z g./@:@<@'@[@}@M.",
-"|@1 at 2@3 at 4@5@<@i.6 at i.i.i.i.<@'@7 at 8@9 at 3@0 at a@",
-"b at c@d at e@f at g@h at h@i at i@i at i@i at i@i at j@k at l@2 at m@n@"};
diff --git a/gtk2_ardour/pixmaps/toggle-button-01.xpm b/gtk2_ardour/pixmaps/toggle-button-01.xpm
deleted file mode 100644
index e105083..0000000
--- a/gtk2_ardour/pixmaps/toggle-button-01.xpm
+++ /dev/null
@@ -1,365 +0,0 @@
-/* XPM */
-static char * toggle_button_01_xpm[] = {
-"21 22 340 2",
-" c None",
-". c #52646A",
-"+ c #56686E",
-"@ c #506268",
-"# c #4C5E66",
-"$ c #4E626A",
-"% c #52646C",
-"& c #52636A",
-"* c #52636C",
-"= c #52636E",
-"- c #50626C",
-"; c #4E6166",
-"> c #4E5F66",
-", c #4C5D66",
-"' c #4E5E66",
-") c #505F68",
-"! c #52656A",
-"~ c #52676C",
-"{ c #54676C",
-"] c #415156",
-"^ c #2B3A41",
-"/ c #24343D",
-"( c #28363D",
-"_ c #24363D",
-": c #24383D",
-"< c #29363D",
-"[ c #24363F",
-"} c #27363F",
-"| c #27343B",
-"1 c #2D3944",
-"2 c #37464E",
-"3 c #485960",
-"4 c #42545A",
-"5 c #29383F",
-"6 c #2F3C46",
-"7 c #2F4143",
-"8 c #334246",
-"9 c #2F3F46",
-"0 c #314046",
-"a c #354246",
-"b c #313F46",
-"c c #314048",
-"d c #333F48",
-"e c #313F48",
-"f c #33404A",
-"g c #2F3B46",
-"h c #2B393F",
-"i c #3B4A52",
-"j c #394C54",
-"k c #394752",
-"l c #415058",
-"m c #415252",
-"n c #29393F",
-"o c #28383F",
-"p c #28373D",
-"q c #2D383D",
-"r c #2D373D",
-"s c #2D3A3D",
-"t c #2D393D",
-"u c #2B373F",
-"v c #2A373D",
-"w c #283837",
-"x c #283A3D",
-"y c #3B4952",
-"z c #3D4D56",
-"A c #394750",
-"B c #3F5258",
-"C c #44565E",
-"D c #46585E",
-"E c #39474A",
-"F c #3B4B56",
-"G c #4E5A66",
-"H c #525C66",
-"I c #525E6A",
-"J c #52606A",
-"K c #56606A",
-"L c #525E68",
-"M c #48585E",
-"N c #2F3E3D",
-"O c #202F31",
-"P c #2A3B42",
-"Q c #46545E",
-"R c #435260",
-"S c #3D4D58",
-"T c #43575E",
-"U c #4A5A62",
-"V c #4E5B5E",
-"W c #37484E",
-"X c #62707F",
-"Y c #8190A8",
-"Z c #8C9AB4",
-"` c #8E9EB4",
-" . c #8E9EB8",
-".. c #8C9CB4",
-"+. c #8C9EB4",
-"@. c #90A0B8",
-"#. c #90A2B6",
-"$. c #90A0B4",
-"%. c #90A2B0",
-"&. c #627379",
-"*. c #2B363D",
-"=. c #2D3A46",
-"-. c #465766",
-";. c #465762",
-">. c #3F4F5A",
-",. c #465860",
-"'. c #4A5D62",
-"). c #4E6164",
-"!. c #6A7A8E",
-"~. c #92A0BE",
-"{. c #94A2C0",
-"]. c #94A6C4",
-"^. c #94A6C9",
-"/. c #94A4C3",
-"(. c #94A4C0",
-"_. c #96A6C2",
-":. c #96A4C2",
-"<. c #909EB8",
-"[. c #8392A0",
-"}. c #424C54",
-"|. c #2F3F48",
-"1. c #4A5B66",
-"2. c #4A5962",
-"3. c #3F515C",
-"4. c #4A5F62",
-"5. c #4C5F62",
-"6. c #37414A",
-"7. c #68748C",
-"8. c #7F8EAA",
-"9. c #7F8FA8",
-"0. c #7F8EA8",
-"a. c #7F8DA8",
-"b. c #7F8BA6",
-"c. c #7D88A2",
-"d. c #7D8998",
-"e. c #46565E",
-"f. c #2D4048",
-"g. c #3D505A",
-"h. c #465B5E",
-"i. c #4A5F66",
-"j. c #313D4A",
-"k. c #667184",
-"l. c #7B87A2",
-"m. c #7B89A4",
-"n. c #7B88A3",
-"o. c #7B86A0",
-"p. c #7A85A0",
-"q. c #7B879C",
-"r. c #7B88A0",
-"s. c #7B869E",
-"t. c #7B8596",
-"u. c #46565A",
-"v. c #2D3D42",
-"w. c #465B66",
-"x. c #4A5E66",
-"y. c #313C48",
-"z. c #64707F",
-"A. c #79859A",
-"B. c #798598",
-"C. c #748599",
-"D. c #A97E7F",
-"E. c #E7765A",
-"F. c #E67256",
-"G. c #A97B7B",
-"H. c #788799",
-"I. c #77859A",
-"J. c #79849C",
-"K. c #758490",
-"L. c #46585A",
-"M. c #2B3C42",
-"N. c #465A62",
-"O. c #465B62",
-"P. c #4A5C66",
-"Q. c #2F3C43",
-"R. c #606C7D",
-"S. c #778294",
-"T. c #798394",
-"U. c #788498",
-"V. c #E66141",
-"W. c #E45A38",
-"X. c #E46A4C",
-"Y. c #768598",
-"Z. c #738396",
-"`. c #738496",
-" + c #73818B",
-".+ c #263A40",
-"++ c #485B64",
-"@+ c #4A5C62",
-"#+ c #3F505A",
-"$+ c #2D3D43",
-"%+ c #5E6C78",
-"&+ c #778094",
-"*+ c #778194",
-"=+ c #768298",
-"-+ c #E24E2A",
-";+ c #E46547",
-">+ c #738194",
-",+ c #738192",
-"'+ c #737E8B",
-")+ c #283A42",
-"!+ c #41505A",
-"~+ c #465A5E",
-"{+ c #2D3D41",
-"]+ c #5E6B76",
-"^+ c #748195",
-"/+ c #A87A7A",
-"(+ c #A77675",
-"_+ c #738190",
-":+ c #737D8B",
-"<+ c #465656",
-"[+ c #2D3B42",
-"}+ c #465A64",
-"|+ c #4A5B62",
-"1+ c #41515A",
-"2+ c #465B64",
-"3+ c #4A5D64",
-"4+ c #2D3D3D",
-"5+ c #5C6A74",
-"6+ c #737F8B",
-"7+ c #73808B",
-"8+ c #74818D",
-"9+ c #768293",
-"0+ c #768093",
-"a+ c #747F90",
-"b+ c #737F90",
-"c+ c #737F92",
-"d+ c #737F8D",
-"e+ c #6E7D87",
-"f+ c #445256",
-"g+ c #2D3C42",
-"h+ c #465962",
-"i+ c #41525A",
-"j+ c #4A5E62",
-"k+ c #46595E",
-"l+ c #2B3B41",
-"m+ c #5A6A72",
-"n+ c #6C7B87",
-"o+ c #6E7C89",
-"p+ c #6E7B87",
-"q+ c #6C7C89",
-"r+ c #6A7B89",
-"s+ c #6A7987",
-"t+ c #6A7B87",
-"u+ c #687B87",
-"v+ c #6A7A83",
-"w+ c #404A4E",
-"x+ c #2F3D44",
-"y+ c #485A64",
-"z+ c #41545A",
-"A+ c #2D3D46",
-"B+ c #647581",
-"C+ c #647783",
-"D+ c #627583",
-"E+ c #647681",
-"F+ c #62757F",
-"G+ c #60757F",
-"H+ c #64757F",
-"I+ c #62737B",
-"J+ c #334248",
-"K+ c #2F3F44",
-"L+ c #4A5D66",
-"M+ c #485C66",
-"N+ c #2A3D44",
-"O+ c #31414A",
-"P+ c #526268",
-"Q+ c #56676E",
-"R+ c #56696E",
-"S+ c #56656E",
-"T+ c #54666E",
-"U+ c #56666C",
-"V+ c #4E5C64",
-"W+ c #374A52",
-"X+ c #4C6068",
-"Y+ c #3F525A",
-"Z+ c #4A5D6A",
-"`+ c #3D5056",
-" @ c #2F3F41",
-".@ c #273639",
-"+@ c #223133",
-"@@ c #203033",
-"#@ c #203437",
-"$@ c #203335",
-"%@ c #203235",
-"&@ c #223135",
-"*@ c #2D393F",
-"=@ c #394B52",
-"-@ c #445862",
-";@ c #4C6268",
-">@ c #41555A",
-",@ c #465D66",
-"'@ c #485D66",
-")@ c #4A5F6A",
-"!@ c #3B4D54",
-"~@ c #2D3A42",
-"{@ c #28373E",
-"]@ c #283840",
-"^@ c #26363E",
-"/@ c #24363E",
-"(@ c #2B3840",
-"_@ c #35454E",
-":@ c #48575E",
-"<@ c #4E606A",
-"[@ c #4C606A",
-"}@ c #465C64",
-"|@ c #3D525C",
-"1@ c #4A606A",
-"2@ c #4A616A",
-"3@ c #485B62",
-"4@ c #435660",
-"5@ c #3D4E56",
-"6@ c #3D4C56",
-"7@ c #4A5B64",
-"8@ c #4C5F68",
-"9@ c #4A5E68",
-"0@ c #485F68",
-"a@ c #506773",
-"b@ c #526875",
-"c@ c #566A77",
-"d@ c #566975",
-"e@ c #526570",
-"f@ c #4E636C",
-"g@ c #4A5F68",
-"h@ c #546670",
-"i@ c #566A72",
-"j@ c #566B75",
-"k@ c #546973",
-"l@ c #50656E",
-"m@ c #526971",
-"n@ c #526A75",
-"o@ c #546C77",
-"p@ c #566D7B",
-"q@ c #586D7B",
-"r@ c #586C79",
-"s@ c #546A73",
-"t@ c #566B73",
-"u@ c #566C77",
-"v@ c #566D77",
-"w@ c #566B77",
-"x@ c #546777",
-"y@ c #526673",
-". + @ # $ % & * = - ; > , # > > > ' ) ! ~ ",
-"{ ] ^ / ( _ : < [ } < < < < < < < | 1 2 3 ",
-"4 5 6 7 8 9 0 a b b 0 0 0 c d b e f g h i ",
-"j k l m n o ( p q r s s t u v w x y z A k ",
-"B C D E F G H H I I J K J L M N O P Q R S ",
-"T U V W X Y Z ` ...+. at .#.$.%.&.*.=.-.;.>.",
-",.'.).y !.~.{.].^./.(.(._.:.<.[.}.|.1.2.3.",
-";.4.5.6.7.8.9.9.9.0.a.a.9.b.c.d.e.f.1.2.g.",
-"h.i.'.j.k.l.m.m.n.o.p.q.q.r.s.t.u.v.w.2.g.",
-"h.x.1.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.U g.",
-"O.P.1.Q.R.S.T.U.E.V.W.X.Y.Z.`. +u..+++ at +#+",
-"w.1.N.$+%+&+*+=+F.W.-+;+=+>+,+'+u.)+w. at +!+",
-"w.P.~+{+]+&+*+^+/+X.;+(+^+>+_+:+<+[+}+|+1+",
-"2+3+h.4+5+'+6+7+8+9+0+a+b+c+d+e+f+g+h+|+i+",
-"O.j+k+l+m+n+o+p+q+r+s+t+t+o+u+v+w+x+y+ at +z+",
-"O.'.z+A+% B+C+D+D+E+F+F+F+G+H+I+J+K+L+ at +i+",
-"O.'.M+N+O+P+Q++ R+Q+S+S+S+T+U+V+O+W+X+'.Y+",
-"O.L+Z+`+ @. at +@@@#@$@%@%@%@&@*@=@- at x.;@'.>@",
-",@'@)@T !@J+~@{@]@{@^@/@^@(@_@:@<@[@X+}@|@",
-"1 at 2@2@)@3 at 4@#+z `+5 at z 6 at z g.4 at 7@8@<@9 at 0@N.",
-"a at b@c at d@e at f@8 at i.g@i.i.i.i.8@<@h at i@j at d@k at l@",
-"m at n@o at p@q at r@s at s@t at t@t at t@t at t@t at u@v at w@c at x@y@"};
diff --git a/gtk2_ardour/pixmaps/tool_audition.xpm b/gtk2_ardour/pixmaps/tool_audition.xpm
deleted file mode 100644
index d6f2ccd..0000000
--- a/gtk2_ardour/pixmaps/tool_audition.xpm
+++ /dev/null
@@ -1,19 +0,0 @@
-/* XPM */
-static char * tool_audition_xpm[] = {
-"16 12 4 1",
-" c None",
-". c #000000",
-"+ c #ECECEC",
-"@ c #FFFFFF",
-" .. ",
-" .+. . ",
-" .++. . at . ",
-"....+ at +... . at . ",
-".+++@@+.. at . . at .",
-".+@@@@+. . at . . at .",
-".+@@@@+. . at . . at .",
-".+++@@+.. at . . at .",
-"....+ at +... . at . ",
-" .++. . at . ",
-" .+. . ",
-" .. "};
diff --git a/gtk2_ardour/pixmaps/tool_gain.xpm b/gtk2_ardour/pixmaps/tool_gain.xpm
deleted file mode 100644
index 480426f..0000000
--- a/gtk2_ardour/pixmaps/tool_gain.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_gain_xpm[] = {
-"16 12 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"... ",
-".++.. ",
-"...++. ",
-" ..+. ",
-" .+. ",
-" .+. ",
-" .+. ",
-" .+. ",
-" .+.. ",
-" .++.....",
-" ..++++.",
-" ....."};
diff --git a/gtk2_ardour/pixmaps/tool_object.xpm b/gtk2_ardour/pixmaps/tool_object.xpm
deleted file mode 100644
index 3d18ab8..0000000
--- a/gtk2_ardour/pixmaps/tool_object.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_object_xpm[] = {
-"16 12 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" ... ",
-" .+. ",
-" .+. ",
-" .+. ",
-" .+..... ",
-" .+.+.+... ",
-" ...+.+.+.+. ",
-" .+.+++++++. ",
-" .+++++++++. ",
-" ..+++++++.. ",
-" ...+++++. ",
-" .+++++. "};
diff --git a/gtk2_ardour/pixmaps/tool_range.xpm b/gtk2_ardour/pixmaps/tool_range.xpm
deleted file mode 100644
index 75ee865..0000000
--- a/gtk2_ardour/pixmaps/tool_range.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_range_xpm[] = {
-"16 12 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-"... ...",
-".+. .. .. .+.",
-".+. .+. .+. .+.",
-".+..+. .+..+.",
-".+.++......++.+.",
-".++++++++++++++.",
-".+.++......++.+.",
-".+..+. .+..+.",
-".+. .+. .+. .+.",
-".+. .. .. .+.",
-".+. .+.",
-"... ..."};
diff --git a/gtk2_ardour/pixmaps/tool_stretch.xpm b/gtk2_ardour/pixmaps/tool_stretch.xpm
deleted file mode 100644
index 77943cd..0000000
--- a/gtk2_ardour/pixmaps/tool_stretch.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_stretch_xpm[] = {
-"16 12 3 1",
-" c None",
-". c #000000",
-"+ c #FFFFFF",
-" .. .. ",
-" .+. .+. ",
-".++..........++.",
-"++++++++++++++++",
-".++..........++.",
-" .+. .+. ",
-" .. .. ",
-" + + + + ",
-" ++ +++ + + +++ ",
-"++++++++++++++++",
-" ++ + ++ + + ",
-" + + + + "};
diff --git a/gtk2_ardour/pixmaps/tool_zoom.xpm b/gtk2_ardour/pixmaps/tool_zoom.xpm
deleted file mode 100644
index 581363f..0000000
--- a/gtk2_ardour/pixmaps/tool_zoom.xpm
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * tool_zoom_xpm[] = {
-"16 12 14 1",
-" c None",
-". c #000000",
-"+ c #474747",
-"@ c #E7E7E7",
-"# c #F6F6F6",
-"$ c #DCDCDC",
-"% c #FFFFFF",
-"& c #DFDFDF",
-"* c #D7D7D7",
-"= c #D6D6D6",
-"- c #040404",
-"; c #070707",
-"> c #060606",
-", c #050505",
-" ... ",
-" +.@#$.+ ",
-" .%%%%%. ",
-" .&%%%%%*. ",
-" .#%%%%%#. ",
-" .$%%%%%&. ",
-" .%%%%%.+ ",
-" +.*#=... ",
-" ...+... ",
-" -.; ",
-" >.- ",
-" ,. "};
diff --git a/gtk2_ardour/pixmaps/v_meter_strip.xpm b/gtk2_ardour/pixmaps/v_meter_strip.xpm
deleted file mode 100644
index d673c1d..0000000
--- a/gtk2_ardour/pixmaps/v_meter_strip.xpm
+++ /dev/null
@@ -1,483 +0,0 @@
-/* XPM */
-static const gchar * v_meter_strip_xpm[] = {
-"5 250 230 2",
-" c None",
-". c #FE0000",
-"+ c #FF0000",
-"@ c #FE0100",
-"# c #FD0200",
-"$ c #FD0300",
-"% c #FD0400",
-"& c #FC0500",
-"* c #FC0600",
-"= c #FC0700",
-"- c #FB0800",
-"; c #FA0900",
-"> c #FA0A00",
-", c #FA0B00",
-"' c #F90C00",
-") c #F90D00",
-"! c #F80E00",
-"~ c #F80F00",
-"{ c #F71000",
-"] c #F71100",
-"^ c #F61200",
-"/ c #F61300",
-"( c #F61400",
-"_ c #F51600",
-": c #F41700",
-"< c #F41800",
-"[ c #F31A00",
-"} c #F31B00",
-"| c #F21C00",
-"1 c #F21E00",
-"2 c #F11F00",
-"3 c #F54A00",
-"4 c #FFA900",
-"5 c #FFAB00",
-"6 c #FFAC01",
-"7 c #FFAD02",
-"8 c #FFAE02",
-"9 c #FFAF03",
-"0 c #FFB004",
-"a c #FFB104",
-"b c #FFB205",
-"c c #FFB406",
-"d c #FFB506",
-"e c #FFB607",
-"f c #FFB708",
-"g c #FFB808",
-"h c #FFB909",
-"i c #FFBA0A",
-"j c #FFBB0A",
-"k c #FFBC0A",
-"l c #FFBD0B",
-"m c #FFBE0C",
-"n c #FFBF0C",
-"o c #FFC00D",
-"p c #FFC10E",
-"q c #FFC20F",
-"r c #FFC30F",
-"s c #FFC410",
-"t c #FFC511",
-"u c #FFC611",
-"v c #FFC711",
-"w c #FFC812",
-"x c #FFC913",
-"y c #FFCA13",
-"z c #FFCB14",
-"A c #FFCC15",
-"B c #FFCD15",
-"C c #FFCF16",
-"D c #FFD017",
-"E c #FFD117",
-"F c #FFD218",
-"G c #FFD319",
-"H c #FFD419",
-"I c #FFD51A",
-"J c #FFD61B",
-"K c #FFD71B",
-"L c #FFD81C",
-"M c #FFD91C",
-"N c #FFDA1D",
-"O c #FFDB1E",
-"P c #FFDC1E",
-"Q c #FFDD1F",
-"R c #FFDE20",
-"S c #FFDF20",
-"T c #FFE021",
-"U c #FFE222",
-"V c #FFE322",
-"W c #FFE423",
-"X c #FFE524",
-"Y c #FFE624",
-"Z c #FFE725",
-"` c #FFE826",
-" . c #FFE926",
-".. c #FFEA26",
-"+. c #FFEB27",
-"@. c #FFEC28",
-"#. c #FFED28",
-"$. c #FFEE29",
-"%. c #FFEF2A",
-"&. c #FFF02A",
-"*. c #FFF12B",
-"=. c #FFF22C",
-"-. c #FFF32D",
-";. c #FFF42D",
-">. c #FDF42C",
-",. c #FBF42C",
-"'. c #FAF42C",
-"). c #F8F42B",
-"!. c #F6F42B",
-"~. c #F4F42B",
-"{. c #F3F42A",
-"]. c #F1F42A",
-"^. c #F0F429",
-"/. c #EEF429",
-"(. c #ECF429",
-"_. c #EAF528",
-":. c #E9F528",
-"<. c #E7F528",
-"[. c #E5F527",
-"}. c #E3F527",
-"|. c #E2F526",
-"1. c #E0F526",
-"2. c #DFF526",
-"3. c #DDF525",
-"4. c #DBF525",
-"5. c #D9F525",
-"6. c #D8F524",
-"7. c #D6F624",
-"8. c #D5F624",
-"9. c #D3F624",
-"0. c #D1F623",
-"a. c #CFF623",
-"b. c #CEF622",
-"c. c #CCF622",
-"d. c #CBF622",
-"e. c #C9F621",
-"f. c #C7F621",
-"g. c #C5F621",
-"h. c #C4F720",
-"i. c #C2F720",
-"j. c #C0F71F",
-"k. c #BEF71F",
-"l. c #BDF71F",
-"m. c #BBF71E",
-"n. c #BAF71E",
-"o. c #B8F71E",
-"p. c #B6F71D",
-"q. c #B5F71D",
-"r. c #B3F71D",
-"s. c #B2F71C",
-"t. c #B0F81C",
-"u. c #AEF81B",
-"v. c #ACF81B",
-"w. c #ABF81B",
-"x. c #A9F81A",
-"y. c #A8F81A",
-"z. c #A6F81A",
-"A. c #A4F81A",
-"B. c #A2F819",
-"C. c #A1F819",
-"D. c #9FF819",
-"E. c #9EF818",
-"F. c #9BF918",
-"G. c #9AF917",
-"H. c #98F917",
-"I. c #97F917",
-"J. c #95F916",
-"K. c #93F916",
-"L. c #91F916",
-"M. c #90F915",
-"N. c #8EF915",
-"O. c #8DF914",
-"P. c #8BF914",
-"Q. c #89FA14",
-"R. c #87FA13",
-"S. c #86FA13",
-"T. c #84FA13",
-"U. c #83FA12",
-"V. c #81FA12",
-"W. c #7FFA12",
-"X. c #7DFA12",
-"Y. c #7CFA11",
-"Z. c #7AFA11",
-"`. c #78FA10",
-" + c #76FA10",
-".+ c #75FB10",
-"++ c #73FB0F",
-"@+ c #72FB0F",
-"#+ c #70FB0F",
-"$+ c #6EFB0E",
-"%+ c #6DFB0E",
-"&+ c #6BFB0E",
-"*+ c #6AFB0D",
-"=+ c #68FB0D",
-"-+ c #66FB0C",
-";+ c #64FB0C",
-">+ c #63FB0C",
-",+ c #61FC0B",
-"'+ c #60FC0B",
-")+ c #5EFC0B",
-"!+ c #5CFC0A",
-"~+ c #5AFC0A",
-"{+ c #59FC09",
-"]+ c #57FC09",
-"^+ c #56FC09",
-"/+ c #53FC09",
-"(+ c #52FC08",
-"_+ c #50FC08",
-":+ c #4FFD08",
-"<+ c #4DFD07",
-"[+ c #4BFD07",
-"}+ c #49FD07",
-"|+ c #48FD06",
-"1+ c #46FD06",
-"2+ c #45FD05",
-"3+ c #43FD05",
-"4+ c #41FD05",
-"5+ c #3FFD04",
-"6+ c #3EFD04",
-"7+ c #3CFD04",
-"8+ c #3BFE03",
-"9+ c #39FE03",
-"0+ c #37FE02",
-"a+ c #35FE02",
-"b+ c #34FE02",
-"c+ c #32FE01",
-"d+ c #30FE01",
-"e+ c #2EFE01",
-"f+ c #2DFE00",
-"g+ c #2BFE00",
-". . + + + ",
-". . + + + ",
-"@ @ @ @ @ ",
-"# # # # # ",
-"$ $ $ $ $ ",
-"% % % % % ",
-"& & & & & ",
-"* * * * * ",
-"= = = = = ",
-"- - - - - ",
-"; ; ; ; ; ",
-"> > > > > ",
-", , , , , ",
-"' ' ' ' ' ",
-") ) ) ) ) ",
-"! ! ! ! ! ",
-"~ ~ ~ ~ ~ ",
-"{ { { { { ",
-"] ] ] ] ] ",
-"^ ^ ^ ^ ^ ",
-"/ / / / / ",
-"( ( ( ( ( ",
-"_ _ _ _ _ ",
-": : : : : ",
-": : : : : ",
-"< < < < < ",
-"[ [ [ [ [ ",
-"} } } } } ",
-"} } } } } ",
-"| | | | | ",
-"1 1 1 1 1 ",
-"2 2 2 2 2 ",
-"3 3 3 3 3 ",
-"4 4 4 4 4 ",
-"5 5 5 5 5 ",
-"6 6 6 6 6 ",
-"6 6 6 6 6 ",
-"7 7 7 7 7 ",
-"8 8 8 8 8 ",
-"9 9 9 9 9 ",
-"9 9 9 9 9 ",
-"0 0 0 0 0 ",
-"a a a a a ",
-"a a a a a ",
-"b b b b b ",
-"c c c c c ",
-"d d d d d ",
-"d d d d d ",
-"e e e e e ",
-"f f f f f ",
-"g g g g g ",
-"g g g g g ",
-"h h h h h ",
-"i i i i i ",
-"j j j j j ",
-"k k k k k ",
-"l l l l l ",
-"m m m m m ",
-"n n n n n ",
-"n n n n n ",
-"o o o o o ",
-"p p p p p ",
-"q q q q q ",
-"q q q q q ",
-"r r r r r ",
-"s s s s s ",
-"t t t t t ",
-"u u u u u ",
-"v v v v v ",
-"w w w w w ",
-"x x x x x ",
-"x x x x x ",
-"y y y y y ",
-"z z z z z ",
-"A A A A A ",
-"A A A A A ",
-"B B B B B ",
-"C C C C C ",
-"D D D D D ",
-"D D D D D ",
-"E E E E E ",
-"F F F F F ",
-"G G G G G ",
-"G G G G G ",
-"H H H H H ",
-"I I I I I ",
-"I I I I I ",
-"J J J J J ",
-"K K K K K ",
-"L L L L L ",
-"M M M M M ",
-"N N N N N ",
-"O O O O O ",
-"P P P P P ",
-"P P P P P ",
-"Q Q Q Q Q ",
-"R R R R R ",
-"S S S S S ",
-"S S S S S ",
-"T T T T T ",
-"U U U U U ",
-"V V V V V ",
-"V V V V V ",
-"W W W W W ",
-"X X X X X ",
-"Y Y Y Y Y ",
-"Y Y Y Y Y ",
-"Z Z Z Z Z ",
-"` ` ` ` ` ",
-" . . . . .",
-"..........",
-"+.+.+.+.+.",
-"@. at .@. at .@.",
-"#.#.#.#.#.",
-"#.#.#.#.#.",
-"$.$.$.$.$.",
-"%.%.%.%.%.",
-"&.&.&.&.&.",
-"&.&.&.&.&.",
-"*.*.*.*.*.",
-"=.=.=.=.=.",
-"-.-.-.-.-.",
-";.;.;.;.;.",
-";.;.;.;.;.",
-">.>.>.>.>.",
-",.,.,.,.,.",
-"'.'.'.'.'.",
-").).).).).",
-"!.!.!.!.!.",
-"~.~.~.~.~.",
-"{.{.{.{.{.",
-"].].].].].",
-"^.^.^.^.^.",
-"/././././.",
-"(.(.(.(.(.",
-"_._._._._.",
-":.:.:.:.:.",
-"<.<.<.<.<.",
-"[.[.[.[.[.",
-"}.}.}.}.}.",
-"|.|.|.|.|.",
-"1.1.1.1.1.",
-"2.2.2.2.2.",
-"3.3.3.3.3.",
-"4.4.4.4.4.",
-"5.5.5.5.5.",
-"6.6.6.6.6.",
-"7.7.7.7.7.",
-"8.8.8.8.8.",
-"9.9.9.9.9.",
-"0.0.0.0.0.",
-"a.a.a.a.a.",
-"b.b.b.b.b.",
-"c.c.c.c.c.",
-"d.d.d.d.d.",
-"e.e.e.e.e.",
-"f.f.f.f.f.",
-"g.g.g.g.g.",
-"h.h.h.h.h.",
-"i.i.i.i.i.",
-"j.j.j.j.j.",
-"k.k.k.k.k.",
-"l.l.l.l.l.",
-"m.m.m.m.m.",
-"n.n.n.n.n.",
-"o.o.o.o.o.",
-"p.p.p.p.p.",
-"q.q.q.q.q.",
-"r.r.r.r.r.",
-"s.s.s.s.s.",
-"t.t.t.t.t.",
-"u.u.u.u.u.",
-"v.v.v.v.v.",
-"w.w.w.w.w.",
-"x.x.x.x.x.",
-"y.y.y.y.y.",
-"z.z.z.z.z.",
-"A.A.A.A.A.",
-"B.B.B.B.B.",
-"C.C.C.C.C.",
-"D.D.D.D.D.",
-"E.E.E.E.E.",
-"F.F.F.F.F.",
-"G.G.G.G.G.",
-"H.H.H.H.H.",
-"I.I.I.I.I.",
-"J.J.J.J.J.",
-"K.K.K.K.K.",
-"L.L.L.L.L.",
-"M.M.M.M.M.",
-"N.N.N.N.N.",
-"O.O.O.O.O.",
-"P.P.P.P.P.",
-"Q.Q.Q.Q.Q.",
-"R.R.R.R.R.",
-"S.S.S.S.S.",
-"T.T.T.T.T.",
-"U.U.U.U.U.",
-"V.V.V.V.V.",
-"W.W.W.W.W.",
-"X.X.X.X.X.",
-"Y.Y.Y.Y.Y.",
-"Z.Z.Z.Z.Z.",
-"`.`.`.`.`.",
-" + + + + +",
-".+.+.+.+.+",
-"++++++++++",
-"@+ at +@+ at +@+",
-"#+#+#+#+#+",
-"$+$+$+$+$+",
-"%+%+%+%+%+",
-"&+&+&+&+&+",
-"*+*+*+*+*+",
-"=+=+=+=+=+",
-"-+-+-+-+-+",
-";+;+;+;+;+",
-">+>+>+>+>+",
-",+,+,+,+,+",
-"'+'+'+'+'+",
-")+)+)+)+)+",
-"!+!+!+!+!+",
-"~+~+~+~+~+",
-"{+{+{+{+{+",
-"]+]+]+]+]+",
-"^+^+^+^+^+",
-"/+/+/+/+/+",
-"(+(+(+(+(+",
-"_+_+_+_+_+",
-":+:+:+:+:+",
-"<+<+<+<+<+",
-"[+[+[+[+[+",
-"}+}+}+}+}+",
-"|+|+|+|+|+",
-"1+1+1+1+1+",
-"2+2+2+2+2+",
-"3+3+3+3+3+",
-"4+4+4+4+4+",
-"5+5+5+5+5+",
-"6+6+6+6+6+",
-"7+7+7+7+7+",
-"8+8+8+8+8+",
-"9+9+9+9+9+",
-"0+0+0+0+0+",
-"a+a+a+a+a+",
-"b+b+b+b+b+",
-"c+c+c+c+c+",
-"d+d+d+d+d+",
-"e+e+e+e+e+",
-"f+f+f+f+f+",
-"g+g+g+g+g+"};
diff --git a/gtk2_ardour/pixmaps/vslider00.xpm b/gtk2_ardour/pixmaps/vslider00.xpm
deleted file mode 100644
index 2a3687b..0000000
--- a/gtk2_ardour/pixmaps/vslider00.xpm
+++ /dev/null
@@ -1,197 +0,0 @@
-/* XPM */
-static char * vslider00_xpm[] = {
-"16 32 162 2",
-" c None",
-". c #7B7B7B",
-"+ c #6C6C6C",
-"@ c #626262",
-"# c #585858",
-"$ c #505050",
-"% c #4B4B4B",
-"& c #494949",
-"* c #8C8C8C",
-"= c #8E8E8E",
-"- c #858585",
-"; c #787878",
-"> c #6D6D6D",
-", c #666666",
-"' c #616161",
-") c #5C5C5C",
-"! c #5B5B5B",
-"~ c #595959",
-"{ c #555555",
-"] c #959595",
-"^ c #ACACAC",
-"/ c #A0A0A0",
-"( c #949494",
-"_ c #8D8D8D",
-": c #888888",
-"< c #848484",
-"[ c #7E7E7E",
-"} c #7C7C7C",
-"| c #7A7A7A",
-"1 c #797979",
-"2 c #757575",
-"3 c #676767",
-"4 c #474747",
-"5 c #9C9C9C",
-"6 c #C2C2C2",
-"7 c #BDBDBD",
-"8 c #B9B9B9",
-"9 c #B4B4B4",
-"0 c #B1B1B1",
-"a c #AEAEAE",
-"b c #ABABAB",
-"c c #A8A8A8",
-"d c #A6A6A6",
-"e c #A5A5A5",
-"f c #A4A4A4",
-"g c #9A9A9A",
-"h c #323232",
-"i c #9F9F9F",
-"j c #D6D6D6",
-"k c #D2D2D2",
-"l c #D3D3D3",
-"m c #D4D4D4",
-"n c #D5D5D5",
-"o c #D1D1D1",
-"p c #232323",
-"q c #DFDFDF",
-"r c #DBDBDB",
-"s c #E0E0E0",
-"t c #E4E4E4",
-"u c #E6E6E6",
-"v c #E2E2E2",
-"w c #DDDDDD",
-"x c #D8D8D8",
-"y c #AAAAAA",
-"z c #777777",
-"A c #1A1A1A",
-"B c #F3F3F3",
-"C c #D7D7D7",
-"D c #D9D9D9",
-"E c #CDCDCD",
-"F c #737373",
-"G c #151515",
-"H c #F2F2F2",
-"I c #DADADA",
-"J c #D0D0D0",
-"K c #CFCFCF",
-"L c #CBCBCB",
-"M c #C3C3C3",
-"N c #999999",
-"O c #131313",
-"P c #F1F1F1",
-"Q c #CACACA",
-"R c #C6C6C6",
-"S c #C1C1C1",
-"T c #BBBBBB",
-"U c #B8B8B8",
-"V c #B3B3B3",
-"W c #707070",
-"X c #111111",
-"Y c #F0F0F0",
-"Z c #BCBCBC",
-"` c #B6B6B6",
-" . c #AFAFAF",
-".. c #929292",
-"+. c #828282",
-"@. c #6B6B6B",
-"#. c #101010",
-"$. c #CECECE",
-"%. c #C8C8C8",
-"&. c #BEBEBE",
-"*. c #A3A3A3",
-"=. c #9B9B9B",
-"-. c #919191",
-";. c #7F7F7F",
-">. c #0F0F0F",
-",. c #EDEDED",
-"'. c #CCCCCC",
-"). c #C5C5C5",
-"!. c #C0C0C0",
-"~. c #BABABA",
-"{. c #A1A1A1",
-"]. c #B5B5B5",
-"^. c #A2A2A2",
-"/. c #9E9E9E",
-"(. c #979797",
-"_. c #C7C7C7",
-":. c #C4C4C4",
-"<. c #C9C9C9",
-"[. c #8A8A8A",
-"}. c #989898",
-"|. c #7D7D7D",
-"1. c #747474",
-"2. c #6F6F6F",
-"3. c #0B0B0B",
-"4. c #868686",
-"5. c #2C2C2C",
-"6. c #0E0E0E",
-"7. c #0D0D0D",
-"8. c #0C0C0C",
-"9. c #090909",
-"0. c #010101",
-"a. c #878787",
-"b. c #353535",
-"c. c #141414",
-"d. c #020202",
-"e. c #8F8F8F",
-"f. c #8B8B8B",
-"g. c #838383",
-"h. c #606060",
-"i. c #E3E3E3",
-"j. c #727272",
-"k. c #A7A7A7",
-"l. c #DEDEDE",
-"m. c #BFBFBF",
-"n. c #B0B0B0",
-"o. c #6A6A6A",
-"p. c #F4F4F4",
-"q. c #B7B7B7",
-"r. c #696969",
-"s. c #B2B2B2",
-"t. c #6E6E6E",
-"u. c #A9A9A9",
-"v. c #909090",
-"w. c #ADADAD",
-"x. c #646464",
-"y. c #656565",
-"z. c #5A5A5A",
-"A. c #545454",
-"B. c #484848",
-"C. c #404040",
-"D. c #3E3E3E",
-"E. c #0A0A0A",
-" . + @ # $ % % % % % % % % & ",
-"* = - ; > , ' ) ) ! ! ! ! ~ { ~ ",
-"] ^ / ( _ : < [ } . | | 1 2 3 4 ",
-"5 6 7 8 9 0 a b c d e e f g 2 h ",
-"i j k k l m n n n n m m o 9 } p ",
-"/ q r s t u u u v w r x m y z A ",
-"e B C j x x x x D D n o E / F G ",
-"e H j I r D j m k J K L M N F O ",
-"e P o o K Q R S 7 T U V d * W X ",
-"e Y K E Q R S Z ` .c / ..+. at .#.",
-"e P $.L %.M &.U 0 y *.=.-.;., >.",
-"f ,.'.).!.~.9 a c {.=.( * < W #.",
-"{.s E &.]. .y c e ^.i /.(.+.+ #.",
-"*.u L _.%.M :.:.R <._.S V [. at .#.",
-"}./.+.|.;.. | ; z z 1.2.3 # 4 3.",
-"4.5.#.#.#.>.>.>.6.6.6.7.8.3.9.0.",
-"a.b.c.c.c.c.c.c.c.c.c.c.c.c.6.d.",
-"}.*.e.e.e.e.= _ _ * f.[.: g.h.7.",
-"*.i._.)._._.:.6 S &.T ` y ] j.#.",
-"/ w %.].` ` ].9 9 V 0 .k._ @.#.",
-"/ l.K ).M 6 S !.!.m.&.~.n.= o.#.",
-"e P m J E E L Q Q <._.6 ` -.3 >.",
-"e p.D J '.'.L Q <.%.).6 q.] r.>.",
-"e B J T s.0 0 s.V s.s. .f - 3 >.",
-"e H l E %.R R %.<.<.%.S s._ @.#.",
-"e B C k K E '.L L '.'._.T =.t.>.",
-"e B %.` ]. .b u.c k.k.k.e v.r.>.",
-"e Y Q S ~.` s. .w.^ ^ b ^.- o.#.",
-"^.w ~.0 ^ k.^./.=.N }.}.e.2 x.>.",
-"( /.- 1 t.r.3 y.y.x.x.x.' # z.>.",
-"~ 3 A.B.C.D.D.D.D.D.D.D.D.D.% 7.",
-" c.8.E.9.9.9.9.9.9.9.9.9.9.3.d."};
diff --git a/gtk2_ardour/pixmaps/vslider01.xpm b/gtk2_ardour/pixmaps/vslider01.xpm
deleted file mode 100644
index 4afc6d1..0000000
--- a/gtk2_ardour/pixmaps/vslider01.xpm
+++ /dev/null
@@ -1,206 +0,0 @@
-/* XPM */
-static char * vslider01_xpm[] = {
-"3 200 3 1",
-" c None",
-". c #000000",
-"+ c #969393",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+"};
diff --git a/gtk2_ardour/pixmaps/vslider02_rail.xpm b/gtk2_ardour/pixmaps/vslider02_rail.xpm
deleted file mode 100644
index 6a55001..0000000
--- a/gtk2_ardour/pixmaps/vslider02_rail.xpm
+++ /dev/null
@@ -1,207 +0,0 @@
-/* XPM */
-static char * vslider_rail_xpm[] = {
-"3 200 4 1",
-" c None",
-". c #000000",
-", c #424242",
-"+ c #969393",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+"};
diff --git a/gtk2_ardour/pixmaps/vslider02_slider.xpm b/gtk2_ardour/pixmaps/vslider02_slider.xpm
deleted file mode 100644
index b84b00d..0000000
--- a/gtk2_ardour/pixmaps/vslider02_slider.xpm
+++ /dev/null
@@ -1,211 +0,0 @@
-/* XPM */
-static char * vslider02_slider_xpm[] = {
-"15 32 176 2",
-" c None",
-". c #999991",
-"+ c #A1A198",
-"@ c #A0A097",
-"# c #9E9E95",
-"$ c #9D9D94",
-"% c #9C9C93",
-"& c #9A9A92",
-"* c #999990",
-"= c #98988F",
-"- c #96968E",
-"; c #95958D",
-"> c #94948B",
-", c #93938A",
-"' c #919189",
-") c #575751",
-"! c #97978F",
-"~ c #A3A39A",
-"{ c #A0A098",
-"] c #9F9F96",
-"^ c #989890",
-"/ c #81817A",
-"( c #3D3D39",
-"_ c #94948C",
-": c #B0B0A8",
-"< c #C8C8C1",
-"[ c #C7C7C1",
-"} c #C7C7C0",
-"| c #C6C6C0",
-"1 c #C6C6BF",
-"2 c #C5C5BF",
-"3 c #C5C5BE",
-"4 c #C4C4BD",
-"5 c #71716C",
-"6 c #3C3C38",
-"7 c #93938B",
-"8 c #8F8F87",
-"9 c #858580",
-"0 c #85857F",
-"a c #84847F",
-"b c #5C5C58",
-"c c #3C3C39",
-"d c #878781",
-"e c #878782",
-"f c #5A5A56",
-"g c #3D3D3A",
-"h c #94948F",
-"i c #5B5B57",
-"j c #3E3E3A",
-"k c #9F9F9A",
-"l c #A0A09A",
-"m c #5C5C57",
-"n c #3E3E3B",
-"o c #92928A",
-"p c #9B9B93",
-"q c #AAAAA4",
-"r c #AAAAA5",
-"s c #3F3F3B",
-"t c #B3B3AD",
-"u c #B2B2AD",
-"v c #B2B2AC",
-"w c #3F3F3C",
-"x c #929289",
-"y c #9D9D95",
-"z c #BABAB3",
-"A c #BABAB4",
-"B c #B9B9B3",
-"C c #B8B8B2",
-"D c #40403C",
-"E c #9E9E96",
-"F c #C0C0BA",
-"G c #C0C0B9",
-"H c #BFBFB9",
-"I c #BFBFB8",
-"J c #BEBEB8",
-"K c #40403D",
-"L c #909088",
-"M c #C4C4BE",
-"N c #C3C3BD",
-"O c #C3C3BC",
-"P c #C2C2BC",
-"Q c #5B5B56",
-"R c #41413D",
-"S c #878780",
-"T c #A1A19C",
-"U c #A1A19D",
-"V c #A0A09B",
-"W c #4B4B47",
-"X c #8E8E86",
-"Y c #434340",
-"Z c #323232",
-"` c #333333",
-" . c #1D1D1C",
-".. c #8D8D85",
-"+. c #8C8C84",
-"@. c #A7A7A2",
-"#. c #A6A6A1",
-"$. c #A6A6A0",
-"%. c #A5A5A0",
-"&. c #8B8B83",
-"*. c #D1D1CA",
-"=. c #D0D0C9",
-"-. c #CFCFC9",
-";. c #CFCFC8",
-">. c #CECEC7",
-",. c #8A8A82",
-"'. c #D2D2CB",
-"). c #D2D2CA",
-"!. c #898981",
-"~. c #9F9F97",
-"{. c #D0D0C8",
-"]. c #5D5D59",
-"^. c #D1D1C9",
-"/. c #CFCFC7",
-"(. c #5F5F5A",
-"_. c #86867F",
-":. c #CECEC6",
-"<. c #CDCDC6",
-"[. c #CDCDC5",
-"}. c #60605B",
-"|. c #85857D",
-"1. c #A1A199",
-"2. c #CCCCC5",
-"3. c #CCCCC4",
-"4. c #CBCBC4",
-"5. c #CBCBC3",
-"6. c #CACAC3",
-"7. c #62625D",
-"8. c #83837C",
-"9. c #CACAC2",
-"0. c #C9C9C1",
-"a. c #C8C8C0",
-"b. c #C7C7BF",
-"c. c #64645F",
-"d. c #82827B",
-"e. c #A4A49B",
-"f. c #C5C5BD",
-"g. c #C4C4BC",
-"h. c #C3C3BB",
-"i. c #C2C2BA",
-"j. c #C1C1B9",
-"k. c #C0C0B8",
-"l. c #656560",
-"m. c #818179",
-"n. c #A5A59D",
-"o. c #BDBDB5",
-"p. c #BDBDB4",
-"q. c #BCBCB4",
-"r. c #BBBBB3",
-"s. c #BABAB2",
-"t. c #B9B9B1",
-"u. c #B8B8B0",
-"v. c #666661",
-"w. c #7F7F78",
-"x. c #B6B6AE",
-"y. c #B6B6AD",
-"z. c #B5B5AD",
-"A. c #B5B5AC",
-"B. c #B4B4AC",
-"C. c #B3B3AB",
-"D. c #B2B2AB",
-"E. c #B2B2AA",
-"F. c #B1B1A9",
-"G. c #696964",
-"H. c #7D7D76",
-"I. c #BEBEB7",
-"J. c #BDBDB7",
-"K. c #6E6E6A",
-"L. c #7B7B74",
-"M. c #60605A",
-"N. c #50504B",
-"O. c #4D4D49",
-"P. c #6B6B65",
-"Q. c #484844",
-"R. c #454541",
-"S. c #42423E",
-". + @ # $ % & * = - ; > , ' ) ",
-"! ~ { ] # $ % & . ^ ! - ; / ( ",
-"_ : < < [ } } | 1 1 2 3 4 5 6 ",
-"7 8 9 9 9 9 9 9 9 0 0 0 a b c ",
-"7 8 d e e e e e e e e e d f g ",
-"7 ; h h h h h h h h h h h i j ",
-"7 ^ k k l l l l l l k k k m n ",
-"o p q r r r r r r r q q q m s ",
-"o $ t t t t t t t u v v v m w ",
-"x y z A A A A B B B B C C i D ",
-"' E F F F F F F G H H I J i K ",
-"L E M M M M M 4 4 N N O P Q R ",
-"8 E [ [ [ [ [ } } | | 1 2 f R ",
-"8 S T U U U T T T T V V V W R ",
-"X Y Z Z Z Z ` ` Z Z Z Z Z .R ",
-"..Y Z ` ` ` ` ` ` ` ` Z Z .R ",
-"+.S @. at .@. at .#.#.#.#.$.%.%.W R ",
-"&.E *.*.*.*.=.=.=.-.;.;.>.i R ",
-",.] '.'.'.).*.*.*.=.=.;.;.b R ",
-"!.~.'.'.'.'.).*.*.=.=.{.;.].K ",
-"S @ ).*.*.*.*.^.=.{.;./.>.(.D ",
-"_.+ {.{.{.{.;././.>.:.<.[.}.w ",
-"|.1.:.:.:.<.[.[.2.3.4.5.6.7.s ",
-"8.~ 6.9.9.9.0.0.< a.} b.1 c.n ",
-"d.e.f.g.g.g.h.h.i.i.j.j.k.l.j ",
-"m.n.o.p.q.q.r.r.s.s.t.t.u.v.g ",
-"w.e.x.x.y.z.A.B.C.C.D.E.F.G.c ",
-"H.. J J J J J J J J I.J.J.K.6 ",
-"L.M.N.N.N.N.N.N.N.N.N.N.N.O.6 ",
-"P.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.D ",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.S.",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.S."};
diff --git a/gtk2_ardour/pixmaps/vslider_slider_16wide.xpm b/gtk2_ardour/pixmaps/vslider_slider_16wide.xpm
deleted file mode 100644
index 6562442..0000000
--- a/gtk2_ardour/pixmaps/vslider_slider_16wide.xpm
+++ /dev/null
@@ -1,211 +0,0 @@
-/* XPM */
-static const char * vslider_slider_xpm_16wide[] = {
-"16 32 176 2",
-" c None",
-". c #999991",
-"+ c #A1A198",
-"@ c #A0A097",
-"# c #9E9E95",
-"$ c #9D9D94",
-"% c #9C9C93",
-"& c #9A9A92",
-"* c #999990",
-"= c #98988F",
-"- c #96968E",
-"; c #95958D",
-"> c #94948B",
-", c #93938A",
-"' c #919189",
-") c #575751",
-"! c #97978F",
-"~ c #A3A39A",
-"{ c #A0A098",
-"] c #9F9F96",
-"^ c #989890",
-"/ c #81817A",
-"( c #3D3D39",
-"_ c #94948C",
-": c #B0B0A8",
-"< c #C8C8C1",
-"[ c #C7C7C1",
-"} c #C7C7C0",
-"| c #C6C6C0",
-"1 c #C6C6BF",
-"2 c #C5C5BF",
-"3 c #C5C5BE",
-"4 c #C4C4BD",
-"5 c #71716C",
-"6 c #3C3C38",
-"7 c #93938B",
-"8 c #8F8F87",
-"9 c #858580",
-"0 c #85857F",
-"a c #84847F",
-"b c #5C5C58",
-"c c #3C3C39",
-"d c #878781",
-"e c #878782",
-"f c #5A5A56",
-"g c #3D3D3A",
-"h c #94948F",
-"i c #5B5B57",
-"j c #3E3E3A",
-"k c #9F9F9A",
-"l c #A0A09A",
-"m c #5C5C57",
-"n c #3E3E3B",
-"o c #92928A",
-"p c #9B9B93",
-"q c #AAAAA4",
-"r c #AAAAA5",
-"s c #3F3F3B",
-"t c #B3B3AD",
-"u c #B2B2AD",
-"v c #B2B2AC",
-"w c #3F3F3C",
-"x c #929289",
-"y c #9D9D95",
-"z c #BABAB3",
-"A c #BABAB4",
-"B c #B9B9B3",
-"C c #B8B8B2",
-"D c #40403C",
-"E c #9E9E96",
-"F c #C0C0BA",
-"G c #C0C0B9",
-"H c #BFBFB9",
-"I c #BFBFB8",
-"J c #BEBEB8",
-"K c #40403D",
-"L c #909088",
-"M c #C4C4BE",
-"N c #C3C3BD",
-"O c #C3C3BC",
-"P c #C2C2BC",
-"Q c #5B5B56",
-"R c #41413D",
-"S c #878780",
-"T c #A1A19C",
-"U c #A1A19D",
-"V c #A0A09B",
-"W c #4B4B47",
-"X c #8E8E86",
-"Y c #434340",
-"Z c #323232",
-"` c #333333",
-" . c #1D1D1C",
-".. c #8D8D85",
-"+. c #8C8C84",
-"@. c #A7A7A2",
-"#. c #A6A6A1",
-"$. c #A6A6A0",
-"%. c #A5A5A0",
-"&. c #8B8B83",
-"*. c #D1D1CA",
-"=. c #D0D0C9",
-"-. c #CFCFC9",
-";. c #CFCFC8",
-">. c #CECEC7",
-",. c #8A8A82",
-"'. c #D2D2CB",
-"). c #D2D2CA",
-"!. c #898981",
-"~. c #9F9F97",
-"{. c #D0D0C8",
-"]. c #5D5D59",
-"^. c #D1D1C9",
-"/. c #CFCFC7",
-"(. c #5F5F5A",
-"_. c #86867F",
-":. c #CECEC6",
-"<. c #CDCDC6",
-"[. c #CDCDC5",
-"}. c #60605B",
-"|. c #85857D",
-"1. c #A1A199",
-"2. c #CCCCC5",
-"3. c #CCCCC4",
-"4. c #CBCBC4",
-"5. c #CBCBC3",
-"6. c #CACAC3",
-"7. c #62625D",
-"8. c #83837C",
-"9. c #CACAC2",
-"0. c #C9C9C1",
-"a. c #C8C8C0",
-"b. c #C7C7BF",
-"c. c #64645F",
-"d. c #82827B",
-"e. c #A4A49B",
-"f. c #C5C5BD",
-"g. c #C4C4BC",
-"h. c #C3C3BB",
-"i. c #C2C2BA",
-"j. c #C1C1B9",
-"k. c #C0C0B8",
-"l. c #656560",
-"m. c #818179",
-"n. c #A5A59D",
-"o. c #BDBDB5",
-"p. c #BDBDB4",
-"q. c #BCBCB4",
-"r. c #BBBBB3",
-"s. c #BABAB2",
-"t. c #B9B9B1",
-"u. c #B8B8B0",
-"v. c #666661",
-"w. c #7F7F78",
-"x. c #B6B6AE",
-"y. c #B6B6AD",
-"z. c #B5B5AD",
-"A. c #B5B5AC",
-"B. c #B4B4AC",
-"C. c #B3B3AB",
-"D. c #B2B2AB",
-"E. c #B2B2AA",
-"F. c #B1B1A9",
-"G. c #696964",
-"H. c #7D7D76",
-"I. c #BEBEB7",
-"J. c #BDBDB7",
-"K. c #6E6E6A",
-"L. c #7B7B74",
-"M. c #60605A",
-"N. c #50504B",
-"O. c #4D4D49",
-"P. c #6B6B65",
-"Q. c #484844",
-"R. c #454541",
-"S. c #42423E",
-". + @ # $ % & * * = - ; > , ' ) ",
-"! ~ { ] # $ % & & . ^ ! - ; / ( ",
-"_ : < < [ } } | | 1 1 2 3 4 5 6 ",
-"7 8 9 9 9 9 9 9 9 9 0 0 0 a b c ",
-"7 8 d e e e e e e e e e e d f g ",
-"7 ; h h h h h h h h h h h h i j ",
-"7 ^ k k l l l l l l l k k k m n ",
-"o p q r r r r r r r r q q q m s ",
-"o $ t t t t t t t t u v v v m w ",
-"x y z A A A A B B B B B C C i D ",
-"' E F F F F F F F G H H I J i K ",
-"L E M M M M M 4 4 4 N N O P Q R ",
-"8 E [ [ [ [ [ } } } | | 1 2 f R ",
-"8 S T U U U T T T T T V V V W R ",
-"X Y Z Z Z Z ` ` ` Z Z Z Z Z .R ",
-"..Y Z ` ` ` ` ` ` ` ` ` Z Z .R ",
-"+.S @. at .@. at .#.#.#.#.#.$.%.%.W R ",
-"&.E *.*.*.*.=.=.=.=.-.;.;.>.i R ",
-",.] '.'.'.).*.*.*.*.=.=.;.;.b R ",
-"!.~.'.'.'.'.).*.*.*.=.=.{.;.].K ",
-"S @ ).*.*.*.*.^.^.=.{.;./.>.(.D ",
-"_.+ {.{.{.{.;./././.>.:.<.[.}.w ",
-"|.1.:.:.:.<.[.[.[.2.3.4.5.6.7.s ",
-"8.~ 6.9.9.9.0.0.0.< a.} b.1 c.n ",
-"d.e.f.g.g.g.h.h.h.i.i.j.j.k.l.j ",
-"m.n.o.p.q.q.r.r.r.s.s.t.t.u.v.g ",
-"w.e.x.x.y.z.A.B.B.C.C.D.E.F.G.c ",
-"H.. J J J J J J J J J I.J.J.K.6 ",
-"L.M.N.N.N.N.N.N.N.N.N.N.N.N.O.6 ",
-"P.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.D ",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S."};
diff --git a/gtk2_ardour/pixmaps/zoom_full.xpm b/gtk2_ardour/pixmaps/zoom_full.xpm
deleted file mode 100644
index 5564074..0000000
--- a/gtk2_ardour/pixmaps/zoom_full.xpm
+++ /dev/null
@@ -1,30 +0,0 @@
-/* XPM */
-static char * zoom_full_xpm[] = {
-"12 12 15 1",
-" c None",
-". c #000000",
-"+ c #474747",
-"@ c #E7E7E7",
-"# c #F6F6F6",
-"$ c #DCDCDC",
-"% c #ACACAC",
-"& c #FFFFFF",
-"* c #DFDFDF",
-"= c #D7D7D7",
-"- c #D6D6D6",
-"; c #040404",
-"> c #070707",
-", c #060606",
-"' c #050505",
-" ... ",
-" +.@#$.+ ",
-" .%&&&%. ",
-".*..&..=. ",
-".#.&&&.#. ",
-".$..&..*. ",
-" .%&&&%.+ ",
-" +.=#-... ",
-" ...+... ",
-" ;.> ",
-" ,.;",
-" '."};
diff --git a/gtk2_ardour/pixmaps/zoom_in.xpm b/gtk2_ardour/pixmaps/zoom_in.xpm
deleted file mode 100644
index 1f8d4e8..0000000
--- a/gtk2_ardour/pixmaps/zoom_in.xpm
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * zoom_in_xpm[] = {
-"12 12 14 1",
-" c None",
-". c #000000",
-"+ c #474747",
-"@ c #E7E7E7",
-"# c #F6F6F6",
-"$ c #DCDCDC",
-"% c #FFFFFF",
-"& c #DFDFDF",
-"* c #D7D7D7",
-"= c #D6D6D6",
-"- c #040404",
-"; c #070707",
-"> c #060606",
-", c #050505",
-" ... ",
-" +.@#$.+ ",
-" .%%.%%. ",
-".&%%.%%*. ",
-".#.....#. ",
-".$%%.%%&. ",
-" .%%.%%.+ ",
-" +.*#=... ",
-" ...+... ",
-" -.; ",
-" >.-",
-" ,."};
diff --git a/gtk2_ardour/pixmaps/zoom_out.xpm b/gtk2_ardour/pixmaps/zoom_out.xpm
deleted file mode 100644
index ea50d14..0000000
--- a/gtk2_ardour/pixmaps/zoom_out.xpm
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * zoom_out_xpm[] = {
-"12 12 14 1",
-" c None",
-". c #000000",
-"+ c #474747",
-"@ c #E7E7E7",
-"# c #F6F6F6",
-"$ c #DCDCDC",
-"% c #FFFFFF",
-"& c #DFDFDF",
-"* c #D7D7D7",
-"= c #D6D6D6",
-"- c #040404",
-"; c #070707",
-"> c #060606",
-", c #050505",
-" ... ",
-" +.@#$.+ ",
-" .%%%%%. ",
-".&%%%%%*. ",
-".#.....#. ",
-".$%%%%%&. ",
-" .%%%%%.+ ",
-" +.*#=... ",
-" ...+... ",
-" -.; ",
-" >.-",
-" ,."};
diff --git a/gtk2_ardour/playlist_selector.cc b/gtk2_ardour/playlist_selector.cc
index 35a64f3..cc92d5d 100644
--- a/gtk2_ardour/playlist_selector.cc
+++ b/gtk2_ardour/playlist_selector.cc
@@ -31,7 +31,7 @@
#include "route_ui.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/plugin_eq_gui.cc b/gtk2_ardour/plugin_eq_gui.cc
index 1fa5d2d..069f373 100644
--- a/gtk2_ardour/plugin_eq_gui.cc
+++ b/gtk2_ardour/plugin_eq_gui.cc
@@ -18,8 +18,11 @@
*/
+#include <algorithm>
#include <math.h>
+#include <iomanip>
#include <iostream>
+#include <sstream>
#ifdef COMPILER_MSVC
#include <float.h>
@@ -46,7 +49,7 @@
#include "ardour_ui.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -54,6 +57,8 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
: _min_dB(-12.0)
, _max_dB(+12.0)
, _step_dB(3.0)
+ , _buffer_size(0)
+ , _signal_buffer_size(0)
, _impulse_fft(0)
, _signal_input_fft(0)
, _signal_output_fft(0)
@@ -73,8 +78,13 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
_analysis_height = 256.0;
_analysis_area->set_size_request(_analysis_width, _analysis_height);
+ _analysis_area->add_events(Gdk::POINTER_MOTION_MASK | Gdk::LEAVE_NOTIFY_MASK | Gdk::BUTTON_PRESS_MASK);
+
_analysis_area->signal_expose_event().connect( sigc::mem_fun (*this, &PluginEqGui::expose_analysis_area));
_analysis_area->signal_size_allocate().connect( sigc::mem_fun (*this, &PluginEqGui::resize_analysis_area));
+ _analysis_area->signal_motion_notify_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mouseover));
+ _analysis_area->signal_leave_notify_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mouseexit));
+ _analysis_area->signal_button_press_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mousedown));
// dB selection
dBScaleModel = Gtk::ListStore::create(dBColumns);
@@ -115,10 +125,16 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
_phase_button->set_active(true);
_phase_button->signal_toggled().connect( sigc::mem_fun(*this, &PluginEqGui::redraw_scales));
+ // Freq/dB info for mouse over
+ _pointer_info = new Gtk::Label ("", 1, 0.5);
+ _pointer_info->set_size_request(_analysis_width / 4, -1);
+ _pointer_info->set_name("PluginAnalysisInfoLabel");
+
// populate table
- attach( *manage(_analysis_area), 1, 3, 1, 2);
+ attach( *manage(_analysis_area), 1, 4, 1, 2);
attach( *manage(dBSelectBin), 1, 2, 2, 3, Gtk::SHRINK, Gtk::SHRINK);
- attach( *manage(_phase_button), 2, 3, 2, 3, Gtk::SHRINK, Gtk::SHRINK);
+ attach( *manage(_phase_button), 2, 3, 2, 3, Gtk::SHRINK, Gtk::SHRINK);
+ attach( *manage(_pointer_info), 3, 4, 2, 3, Gtk::FILL, Gtk::SHRINK);
}
PluginEqGui::~PluginEqGui()
@@ -239,9 +255,9 @@ PluginEqGui::set_buffer_size(uint32_t size, uint32_t signal_size)
return;
}
- GTKArdour::FFT *tmp1 = _impulse_fft;
- GTKArdour::FFT *tmp2 = _signal_input_fft;
- GTKArdour::FFT *tmp3 = _signal_output_fft;
+ GTKArdour::FFT *tmp1 = _impulse_fft;
+ GTKArdour::FFT *tmp2 = _signal_input_fft;
+ GTKArdour::FFT *tmp3 = _signal_output_fft;
try {
_impulse_fft = new GTKArdour::FFT(size);
@@ -262,15 +278,17 @@ PluginEqGui::set_buffer_size(uint32_t size, uint32_t signal_size)
_buffer_size = size;
_signal_buffer_size = signal_size;
- ARDOUR::ChanCount count = ARDOUR::ChanCount::max (_plugin->get_info()->n_inputs, _plugin->get_info()->n_outputs);
+ // allocate separate in+out buffers, VST cannot process in-place
+ ARDOUR::ChanCount acount (_plugin->get_info()->n_inputs + _plugin->get_info()->n_outputs);
+ ARDOUR::ChanCount ccount = ARDOUR::ChanCount::max (_plugin->get_info()->n_inputs, _plugin->get_info()->n_outputs);
for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) {
- _bufferset.ensure_buffers (*i, count.get (*i), _buffer_size);
- _collect_bufferset.ensure_buffers (*i, count.get (*i), _buffer_size);
+ _bufferset.ensure_buffers (*i, acount.get (*i), _buffer_size);
+ _collect_bufferset.ensure_buffers (*i, ccount.get (*i), _buffer_size);
}
- _bufferset.set_count (count);
- _collect_bufferset.set_count (count);
+ _bufferset.set_count (acount);
+ _collect_bufferset.set_count (ccount);
}
void
@@ -283,6 +301,8 @@ PluginEqGui::resize_analysis_area (Gtk::Allocation& size)
cairo_surface_destroy (_analysis_scale_surface);
_analysis_scale_surface = 0;
}
+
+ _pointer_info->set_size_request(_analysis_width / 4, -1);
}
bool
@@ -300,7 +320,7 @@ PluginEqGui::timeout_callback()
void
PluginEqGui::signal_collect_callback(ARDOUR::BufferSet *in, ARDOUR::BufferSet *out)
{
- ENSURE_GUI_THREAD (*this, &PluginEqGui::signal_collect_callback, in, out)
+ ENSURE_GUI_THREAD (*this, &PluginEqGui::signal_collect_callback, in, out);
_signal_input_fft ->reset();
_signal_output_fft->reset();
@@ -341,9 +361,11 @@ PluginEqGui::run_impulse_analysis()
ARDOUR::ChanMapping in_map(_plugin->get_info()->n_inputs);
ARDOUR::ChanMapping out_map(_plugin->get_info()->n_outputs);
+ // map output buffers after input buffers (no inplace for VST)
+ out_map.offset_to (DataType::AUDIO, inputs);
_plugin->set_block_size (_buffer_size);
- _plugin->connect_and_run(_bufferset, in_map, out_map, _buffer_size, 0);
+ _plugin->connect_and_run(_bufferset, 0, _buffer_size, 1.0, in_map, out_map, _buffer_size, 0);
framecnt_t f = _plugin->signal_latency ();
// Adding user_latency() could be interesting
@@ -361,7 +383,7 @@ PluginEqGui::run_impulse_analysis()
//std::cerr << "0: no latency, copying full buffer, trivial.." << std::endl;
for (uint32_t i = 0; i < outputs; ++i) {
memcpy(_collect_bufferset.get_audio(i).data(),
- _bufferset.get_audio(i).data(), _buffer_size * sizeof(float));
+ _bufferset.get_audio(inputs + i).data(), _buffer_size * sizeof(float));
}
} else {
//int C = 0;
@@ -384,8 +406,8 @@ PluginEqGui::run_impulse_analysis()
//std::cerr << (++C) << ": copying " << length << " frames to _collect_bufferset.get_audio(i)+" << target_offset << " from bufferset at offset " << f << std::endl;
for (uint32_t i = 0; i < outputs; ++i) {
memcpy(_collect_bufferset.get_audio(i).data(target_offset),
- _bufferset.get_audio(i).data() + f,
- length * sizeof(float));
+ _bufferset.get_audio(inputs + i).data() + f,
+ length * sizeof(float));
}
target_offset += length;
@@ -400,9 +422,7 @@ PluginEqGui::run_impulse_analysis()
memset(d, 0, sizeof(ARDOUR::Sample)*_buffer_size);
}
- in_map = ARDOUR::ChanMapping(_plugin->get_info()->n_inputs);
- out_map = ARDOUR::ChanMapping(_plugin->get_info()->n_outputs);
- _plugin->connect_and_run(_bufferset, in_map, out_map, _buffer_size, 0);
+ _plugin->connect_and_run (_bufferset, target_offset, target_offset + _buffer_size, 1.0, in_map, out_map, _buffer_size, 0);
}
} while ( frames_left > 0);
@@ -422,6 +442,47 @@ PluginEqGui::run_impulse_analysis()
ARDOUR_UI::instance()->drop_process_buffers ();
}
+void
+PluginEqGui::update_pointer_info(float x, float y)
+{
+ const int freq = std::max(1, (int) roundf((powf(10, x / _analysis_width * _log_max) - 1) * _samplerate / 2.0 / _log_coeff));
+ const float dB = _max_dB - y / _analysis_height * ( _max_dB - _min_dB );
+ std::stringstream ss;
+ ss << std::fixed;
+ if (freq >= 10000) {
+ ss << std::setprecision (1) << freq / 1000.0 << "kHz";
+ } else if (freq >= 1000) {
+ ss << std::setprecision (2) << freq / 1000.0 << "kHz";
+ } else {
+ ss << std::setprecision (0) << freq << "Hz";
+ }
+ ss << " " << std::setw(5) << std::setprecision (1) << std::showpos << dB;
+ ss << std::setw(0) << "dB";
+ _pointer_info->set_text(ss.str());
+}
+
+bool
+PluginEqGui::analysis_area_mouseover(GdkEventMotion *event)
+{
+ update_pointer_info(event->x, event->y);
+ return true;
+}
+
+bool
+PluginEqGui::analysis_area_mouseexit(GdkEventCrossing *)
+{
+ _pointer_info->set_text("");
+ return true;
+}
+
+bool
+PluginEqGui::analysis_area_mousedown(GdkEventButton *event)
+{
+ update_pointer_info(event->x, event->y);
+ return true;
+}
+
+
bool
PluginEqGui::expose_analysis_area(GdkEventExpose *)
{
@@ -433,16 +494,16 @@ void
PluginEqGui::draw_analysis_scales(cairo_t *ref_cr)
{
// TODO: check whether we need rounding
- _analysis_scale_surface = cairo_surface_create_similar(cairo_get_target(ref_cr),
- CAIRO_CONTENT_COLOR,
- _analysis_width,
- _analysis_height);
+ _analysis_scale_surface = cairo_surface_create_similar (cairo_get_target(ref_cr),
+ CAIRO_CONTENT_COLOR,
+ _analysis_width,
+ _analysis_height);
cairo_t *cr = cairo_create (_analysis_scale_surface);
- cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
- cairo_rectangle(cr, 0.0, 0.0, _analysis_width, _analysis_height);
- cairo_fill(cr);
+ cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
+ cairo_rectangle(cr, 0.0, 0.0, _analysis_width, _analysis_height);
+ cairo_fill(cr);
draw_scales_power(_analysis_area, cr);
@@ -450,8 +511,7 @@ PluginEqGui::draw_analysis_scales(cairo_t *ref_cr)
draw_scales_phase(_analysis_area, cr);
}
- cairo_destroy(cr);
-
+ cairo_destroy(cr);
}
void
@@ -459,13 +519,12 @@ PluginEqGui::redraw_analysis_area()
{
cairo_t *cr;
- cr = gdk_cairo_create(GDK_DRAWABLE(_analysis_area->get_window()->gobj()));
+ cr = gdk_cairo_create(GDK_DRAWABLE(_analysis_area->get_window()->gobj()));
if (_analysis_scale_surface == 0) {
draw_analysis_scales(cr);
}
-
cairo_copy_page(cr);
cairo_set_source_surface(cr, _analysis_scale_surface, 0.0, 0.0);
@@ -479,9 +538,7 @@ PluginEqGui::redraw_analysis_area()
// TODO: make this optional
plot_signal_amplitude_difference(_analysis_area, cr);
- cairo_destroy(cr);
-
-
+ cairo_destroy(cr);
}
#define PHASE_PROPORTION 0.5
@@ -500,7 +557,7 @@ PluginEqGui::draw_scales_phase(Gtk::Widget */*w*/, cairo_t *cr)
y = _analysis_height/2.0 - (float)i*(_analysis_height/8.0)*PHASE_PROPORTION;
- cairo_set_source_rgb(cr, .8, .9, 0.2);
+ cairo_set_source_rgb(cr, .8, .9, 0.2);
if (i == 0) {
snprintf(buf,256, "0\u00b0");
} else {
@@ -514,7 +571,7 @@ PluginEqGui::draw_scales_phase(Gtk::Widget */*w*/, cairo_t *cr)
continue;
- cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
+ cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
cairo_move_to(cr, 0.0, y);
cairo_line_to(cr, _analysis_width, y);
@@ -523,13 +580,13 @@ PluginEqGui::draw_scales_phase(Gtk::Widget */*w*/, cairo_t *cr)
// label
snprintf(buf,256, "-%d\u00b0", (i * 45));
- cairo_set_source_rgb(cr, .8, .9, 0.2);
+ cairo_set_source_rgb(cr, .8, .9, 0.2);
cairo_text_extents(cr, buf, &t_ext);
cairo_move_to(cr, _analysis_width - t_ext.width - t_ext.x_bearing - 2.0, y - extents.descent);
cairo_show_text(cr, buf);
// line
- cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
+ cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
cairo_move_to(cr, 0.0, y);
cairo_line_to(cr, _analysis_width, y);
@@ -550,7 +607,7 @@ PluginEqGui::plot_impulse_phase(Gtk::Widget *w, cairo_t *cr)
// float width = w->get_width();
float height = w->get_height();
- cairo_set_source_rgba(cr, 0.95, 0.3, 0.2, 1.0);
+ cairo_set_source_rgba(cr, 0.95, 0.3, 0.2, 1.0);
for (uint32_t i = 0; i < _impulse_fft->bins()-1; i++) {
// x coordinate of bin i
x = log10f(1.0 + (float)i / (float)_impulse_fft->bins() * _log_coeff) / _log_max;
@@ -750,39 +807,20 @@ PluginEqGui::plot_signal_amplitude_difference(Gtk::Widget *w, cairo_t *cr)
// float width = w->get_width();
float height = w->get_height();
- cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
- cairo_set_line_width (cr, 2.5);
+ cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
+ cairo_set_line_width (cr, 1.5);
for (uint32_t i = 0; i < _signal_input_fft->bins()-1; i++) {
// x coordinate of bin i
x = log10f(1.0 + (float)i / (float)_signal_input_fft->bins() * _log_coeff) / _log_max;
x *= _analysis_width;
- float power_out = power_to_dB(_signal_output_fft->power_at_bin(i));
- float power_in = power_to_dB(_signal_input_fft ->power_at_bin(i));
- float power = power_out - power_in;
-
- // for SaBer
- /*
- double p = 10.0 * log10( 1.0 + (double)_signal_output_fft->power_at_bin(i) - (double)
- - _signal_input_fft ->power_at_bin(i));
- //p *= 1000000.0;
- float power = (float)p;
+ float power_out = _signal_output_fft->power_at_bin (i) + 1e-30;
+ float power_in = _signal_input_fft ->power_at_bin (i) + 1e-30;
+ float power = power_to_dB (power_out / power_in);
- if ( (i % 1000) == 0) {
- std::cerr << i << ": " << power << std::endl;
- }
- */
-
- if (ISINF(power)) {
- if (power < 0) {
- power = _min_dB - 1.0;
- } else {
- power = _max_dB - 1.0;
- }
- } else if (ISNAN(power)) {
- power = _min_dB - 1.0;
- }
+ assert (!ISINF(power));
+ assert (!ISNAN(power));
float yCoeff = ( power - _min_dB) / (_max_dB - _min_dB);
@@ -810,6 +848,4 @@ PluginEqGui::plot_signal_amplitude_difference(Gtk::Widget *w, cairo_t *cr)
}
cairo_stroke(cr);
-
-
}
diff --git a/gtk2_ardour/plugin_eq_gui.h b/gtk2_ardour/plugin_eq_gui.h
index 5743152..384359b 100644
--- a/gtk2_ardour/plugin_eq_gui.h
+++ b/gtk2_ardour/plugin_eq_gui.h
@@ -79,6 +79,11 @@ private:
void plot_signal_amplitude_difference (Gtk::Widget *,cairo_t *);
+ void update_pointer_info(float, float);
+ bool analysis_area_mouseover(GdkEventMotion *);
+ bool analysis_area_mouseexit(GdkEventCrossing *);
+ bool analysis_area_mousedown(GdkEventButton *);
+
// Helpers
bool timeout_callback ();
void redraw_scales ();
@@ -117,6 +122,7 @@ private:
// gui objects
Gtk::DrawingArea *_analysis_area;
cairo_surface_t *_analysis_scale_surface;
+ Gtk::Label *_pointer_info;
// dB scale selection:
class dBSelectionColumns : public Gtk::TreeModel::ColumnRecord
diff --git a/gtk2_ardour/plugin_pin_dialog.cc b/gtk2_ardour/plugin_pin_dialog.cc
new file mode 100644
index 0000000..24a4fec
--- /dev/null
+++ b/gtk2_ardour/plugin_pin_dialog.cc
@@ -0,0 +1,2035 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <boost/algorithm/string.hpp>
+
+#include <gtkmm/table.h>
+#include <gtkmm/frame.h>
+#include <gtkmm/label.h>
+
+#include "pbd/replace_all.h"
+
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/rgb_macros.h"
+
+#include "ardour/amp.h"
+#include "ardour/audioengine.h"
+#include "ardour/pannable.h"
+#include "ardour/plugin.h"
+#include "ardour/port.h"
+#include "ardour/profile.h"
+#include "ardour/send.h"
+#include "ardour/session.h"
+
+#include "plugin_pin_dialog.h"
+#include "gui_thread.h"
+#include "timers.h"
+#include "tooltips.h"
+#include "ui_config.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace std;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+
+PluginPinWidget::PluginPinWidget (boost::shared_ptr<ARDOUR::PluginInsert> pi)
+ : _set_config (_("Manual Config"), ArdourButton::led_default_elements)
+ , _tgl_sidechain (_("Sidechain"), ArdourButton::led_default_elements)
+ , _add_plugin (_("+"))
+ , _del_plugin (_("-"))
+ , _add_input_audio (_("+"))
+ , _del_input_audio (_("-"))
+ , _add_input_midi (_("+"))
+ , _del_input_midi (_("-"))
+ , _add_output_audio (_("+"))
+ , _del_output_audio (_("-"))
+ , _add_output_midi (_("+"))
+ , _del_output_midi (_("-"))
+ , _add_sc_audio (_("Audio"))
+ , _add_sc_midi (_("MIDI"))
+ , _pi (pi)
+ , _pin_box_size (10)
+ , _width (0)
+ , _height (0)
+ , _innerwidth (0)
+ , _margin_x (28)
+ , _margin_y (40)
+ , _min_width (300)
+ , _min_height (200)
+ , _n_inputs (0)
+ , _n_sidechains (0)
+ , _position_valid (false)
+ , _ignore_updates (false)
+ , _sidechain_selector (0)
+ , _dragging (false)
+{
+ assert (pi->owner ()); // Route
+
+ _pi->PluginIoReConfigure.connect (
+ _plugin_connections, invalidator (*this), boost::bind (&PluginPinWidget::queue_idle_update, this), gui_context ()
+ );
+
+ _pi->PluginMapChanged.connect (
+ _plugin_connections, invalidator (*this), boost::bind (&PluginPinWidget::queue_idle_update, this), gui_context ()
+ );
+
+ _pi->PluginConfigChanged.connect (
+ _plugin_connections, invalidator (*this), boost::bind (&PluginPinWidget::queue_idle_update, this), gui_context ()
+ );
+
+ _pin_box_size = 2 * ceil (max (8., 10. * UIConfiguration::instance ().get_ui_scale ()) * .5);
+ _margin_x = 2 * ceil (max (24., 28. * UIConfiguration::instance ().get_ui_scale ()) * .5);
+ _margin_y = 2 * ceil (max (36., 40. * UIConfiguration::instance ().get_ui_scale ()) * .5);
+
+ _tgl_sidechain.set_name ("pinrouting sidechain");
+ _set_config.set_name ("pinrouting custom");
+
+ Menu_Helpers::MenuList& citems = reset_menu.items ();
+ reset_menu.set_name ("ArdourContextMenu");
+ citems.clear ();
+ citems.push_back (Menu_Helpers::MenuElem (_("Reset"), sigc::mem_fun (*this, &PluginPinWidget::reset_mapping)));
+
+ _pm_size_group = SizeGroup::create (SIZE_GROUP_BOTH);
+ _add_plugin.set_tweaks (ArdourButton::Square);
+ _del_plugin.set_tweaks (ArdourButton::Square);
+ if (_pi->plugin (0)->get_info()->reconfigurable_io ()) {
+ _pm_size_group->add_widget (_add_input_audio);
+ _pm_size_group->add_widget (_del_input_audio);
+ _pm_size_group->add_widget (_add_input_midi);
+ _pm_size_group->add_widget (_del_input_midi);
+ } else {
+ _pm_size_group->add_widget (_add_plugin);
+ _pm_size_group->add_widget (_del_plugin);
+ }
+ _pm_size_group->add_widget (_add_output_audio);
+ _pm_size_group->add_widget (_del_output_audio);
+ _pm_size_group->add_widget (_add_output_midi);
+ _pm_size_group->add_widget (_del_output_midi);
+
+ Box* box;
+ Frame *f;
+
+ VBox* tl = manage (new VBox ());
+ tl->set_border_width (2);
+ tl->set_spacing (2);
+
+ VBox* tr = manage (new VBox ());
+ tr->set_border_width (2);
+ tr->set_spacing (2);
+
+ /* left side */
+ tl->pack_start (_set_config, false, false);
+
+ if (_pi->plugin (0)->get_info()->reconfigurable_io ()) {
+ box = manage (new HBox ());
+ box->set_border_width (2);
+ box->pack_start (_add_input_audio, true, false);
+ box->pack_start (_del_input_audio, true, false);
+ f = manage (new Frame ());
+ f->set_label (_("Audio Input Pins"));
+ f->add (*box);
+ tl->pack_start (*f, false, false);
+
+ box = manage (new HBox ());
+ box->set_border_width (2);
+ box->pack_start (_add_input_midi, true, false);
+ box->pack_start (_del_input_midi, true, false);
+ f = manage (new Frame ());
+ f->set_label (_("MIDI Input Pins"));
+ f->add (*box);
+ tl->pack_start (*f, false, false);
+ } else {
+ box = manage (new HBox ());
+ box->set_border_width (2);
+ box->pack_start (_add_plugin, true, false);
+ box->pack_start (_del_plugin, true, false);
+ f = manage (new Frame ());
+ f->set_label (_("Instances"));
+ f->add (*box);
+ tl->pack_start (*f, false, false);
+ }
+
+ box = manage (new HBox ());
+ box->set_border_width (2);
+ box->pack_start (_add_output_audio, true, false);
+ box->pack_start (_del_output_audio, true, false);
+ f = manage (new Frame ());
+ f->set_label (_("Audio Out"));
+ f->add (*box);
+ tl->pack_start (*f, false, false);
+
+ box = manage (new HBox ());
+ box->set_border_width (2);
+ box->pack_start (_add_output_midi, true, false);
+ box->pack_start (_del_output_midi, true, false);
+ f = manage (new Frame ());
+ f->set_label (_("MIDI Out"));
+ f->add (*box);
+ tl->pack_start (*f, false, false);
+
+ tl->pack_start (*manage (new Label ("")), true, true); // invisible separator
+ tl->pack_start (*manage (new HSeparator ()), false, false, 4);
+ _out_presets.disable_scrolling ();
+ ARDOUR_UI_UTILS::set_tooltip (_out_presets, _("Output Presets"));
+ tl->pack_start (_out_presets, false, false);
+
+ /* right side */
+ _sidechain_tbl = manage (new Gtk::Table ());
+ _sidechain_tbl->set_spacings (2);
+
+ tr->pack_start (_tgl_sidechain, false, false);
+ tr->pack_start (*_sidechain_tbl, true, true);
+
+ box = manage (new VBox ());
+ box->set_border_width (2);
+ box->set_spacing (2);
+ box->pack_start (_add_sc_audio, false, false);
+ box->pack_start (_add_sc_midi , false, false);
+ f = manage (new Frame ());
+ f->set_label (_("Add Sidechain Input"));
+ f->add (*box);
+
+ tr->pack_start (*f, false, false);
+
+ /* global packing */
+ HBox* hbox = manage (new HBox ());
+ hbox->set_spacing (4);
+ hbox->pack_start (*tl, false, false);
+ hbox->pack_start (darea, true, true);
+ hbox->pack_start (*tr, false, false);
+
+ pack_start (*hbox, true, true);
+ set_border_width (4);
+ show_all ();
+
+ plugin_reconfigured ();
+
+ darea.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
+ darea.signal_size_request ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_size_request));
+ darea.signal_size_allocate ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_size_allocate));
+ darea.signal_expose_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_expose_event));
+ darea.signal_button_press_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_button_press_event));
+ darea.signal_button_release_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_button_release_event));
+ darea.signal_motion_notify_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_motion_notify_event));
+
+ _tgl_sidechain.signal_clicked.connect (sigc::mem_fun (*this, &PluginPinWidget::toggle_sidechain));
+
+ _set_config.signal_clicked.connect (sigc::mem_fun (*this, &PluginPinWidget::reset_configuration));
+ _add_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_plugin_clicked), true));
+ _del_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_plugin_clicked), false));
+
+ _add_input_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), true, DataType::AUDIO));
+ _del_input_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), false, DataType::AUDIO));
+ _add_input_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), true, DataType::MIDI));
+ _del_input_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), false, DataType::MIDI));
+
+ _add_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), true, DataType::AUDIO));
+ _del_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), false, DataType::AUDIO));
+ _add_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), true, DataType::MIDI));
+ _del_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), false, DataType::MIDI));
+
+ _add_sc_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_sidechain_port), DataType::AUDIO));
+ _add_sc_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_sidechain_port), DataType::MIDI));
+
+ AudioEngine::instance ()->PortConnectedOrDisconnected.connect (
+ _io_connection, invalidator (*this), boost::bind (&PluginPinWidget::port_connected_or_disconnected, this, _1, _3), gui_context ()
+ );
+}
+
+PluginPinWidget::~PluginPinWidget ()
+{
+ delete _sidechain_selector;
+}
+
+void
+PluginPinWidget::set_session (ARDOUR::Session *s)
+{
+ SessionHandlePtr::set_session (s);
+ plugin_reconfigured ();
+}
+
+void
+PluginPinWidget::queue_idle_update ()
+{
+ /* various actions here are directly executed, in the GUI thread,
+ * with the GUI-thread eventually taking the process and processor lock.
+ * "connect gui_context()" will call back immediately and this
+ * signal-handler will run with the locks held.
+ *
+ * This will lead to a crash with calling nth_send() which takes
+ * a processor read-lock while holding a write lock in the same thread.
+ *
+ * decouple update to GUI idle.
+ *
+ * BUT, do delete existing controls here (in case they're affected by
+ * the change and hit by the Timer before idle comes around)
+ */
+ for (list<Control*>::iterator i = _controls.begin (); i != _controls.end (); ++i) {
+ _sidechain_tbl->remove ((*i)->box);
+ delete *i;
+ }
+ _controls.clear ();
+ Glib::signal_idle().connect (sigc::mem_fun(*this, &PluginPinWidget::idle_update));
+}
+
+bool
+PluginPinWidget::idle_update ()
+{
+ plugin_reconfigured ();
+ return false;
+}
+
+
+void
+PluginPinWidget::plugin_reconfigured ()
+{
+ ENSURE_GUI_THREAD (*this, &PluginPinWidget::plugin_reconfigured);
+ if (_ignore_updates) {
+ return;
+ }
+ _n_plugins = _pi->get_count ();
+ _pi->configured_io (_in, _out);
+ _ins = _pi->internal_streams (); // with sidechain
+ _sinks = _pi->natural_input_streams ();
+ _sources = _pi->natural_output_streams ();
+
+
+ _tgl_sidechain.set_active (_pi->has_sidechain ());
+ _add_sc_audio.set_sensitive (_pi->has_sidechain ());
+ _add_sc_midi.set_sensitive (_pi->has_sidechain ());
+
+ if (_pi->custom_cfg ()) {
+ _set_config.set_active (true);
+ _add_plugin.set_sensitive (true);
+ _del_plugin.set_sensitive (_n_plugins > 1);
+ _add_output_audio.set_sensitive (true);
+ _add_output_midi.set_sensitive (true);
+ _del_output_audio.set_sensitive (_out.n_audio () > 0 && _out.n_total () > 1);
+ _del_output_midi.set_sensitive (_out.n_midi () > 0 && _out.n_total () > 1);
+ _add_input_audio.set_sensitive (true);
+ _add_input_midi.set_sensitive (true);
+ _del_input_audio.set_sensitive (_sinks.n_audio () > 0 && _sinks.n_total () > 1);
+ _del_input_midi.set_sensitive (_sinks.n_midi () > 0 && _sinks.n_total () > 1);
+ _out_presets.set_sensitive (false);
+ _out_presets.set_text (_("Manual"));
+ } else {
+ _set_config.set_active (false);
+ _add_plugin.set_sensitive (false);
+ _del_plugin.set_sensitive (false);
+ _add_input_audio.set_sensitive (false);
+ _add_input_midi.set_sensitive (false);
+ _del_input_audio.set_sensitive (false);
+ _del_input_midi.set_sensitive (false);
+ _add_output_audio.set_sensitive (false);
+ _add_output_midi.set_sensitive (false);
+ _del_output_audio.set_sensitive (false);
+ _del_output_midi.set_sensitive (false);
+ _out_presets.set_sensitive (true);
+ refill_output_presets ();
+ }
+
+ if (!_pi->has_sidechain () && _sidechain_selector) {
+ delete _sidechain_selector;
+ _sidechain_selector = 0;
+ }
+
+ refill_sidechain_table ();
+
+ /* update elements */
+
+ _elements.clear ();
+ _hover.reset ();
+ _actor.reset ();
+ _selection.reset ();
+ _drag_dst.reset ();
+ _dragging = false;
+
+ _n_inputs = _n_sidechains = 0;
+
+ for (uint32_t i = 0; i < _ins.n_total (); ++i) {
+ DataType dt = i < _ins.n_midi () ? DataType::MIDI : DataType::AUDIO;
+ uint32_t id = dt == DataType::MIDI ? i : i - _ins.n_midi ();
+ bool sidechain = id >= _in.get (dt) ? true : false;
+ if (sidechain) {
+ ++_n_sidechains;
+ } else {
+ ++_n_inputs;
+ }
+
+ CtrlWidget cw (CtrlWidget ("", Input, dt, id, 0, sidechain));
+ _elements.push_back (cw);
+ }
+
+ for (uint32_t i = 0; i < _out.n_total (); ++i) {
+ int id = (i < _out.n_midi ()) ? i : i - _out.n_midi ();
+ _elements.push_back (CtrlWidget ("", Output, (i < _out.n_midi () ? DataType::MIDI : DataType::AUDIO), id));
+ }
+
+ _in_map.clear ();
+ _out_map.clear ();
+
+ for (uint32_t n = 0; n < _n_plugins; ++n) {
+ boost::shared_ptr<Plugin> plugin = _pi->plugin (n);
+ for (uint32_t i = 0; i < _sinks.n_total (); ++i) {
+ DataType dt (i < _sinks.n_midi () ? DataType::MIDI : DataType::AUDIO);
+ int idx = (dt == DataType::MIDI) ? i : i - _sinks.n_midi ();
+ const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, true, idx));
+ CtrlWidget cw (CtrlWidget (iod.name, Sink, dt, idx, n, iod.is_sidechain));
+ _elements.push_back (cw);
+ }
+ for (uint32_t i = 0; i < _sources.n_total (); ++i) {
+ DataType dt (i < _sources.n_midi () ? DataType::MIDI : DataType::AUDIO);
+ int idx = (dt == DataType::MIDI) ? i : i - _sources.n_midi ();
+ const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, false, idx));
+ _elements.push_back (CtrlWidget (iod.name, Source, dt, idx, n));
+ }
+ _in_map[n] = _pi->input_map (n);
+ _out_map[n] = _pi->output_map (n);
+ }
+ _has_midi_bypass = _pi->has_midi_bypass ();
+ _thru_map = _pi->thru_map ();
+
+ /* cache maps */
+
+ /* calc minimum size */
+ const uint32_t max_ports = std::max (_ins.n_total (), _out.n_total ());
+ const uint32_t max_pins = std::max ((_sinks * _n_plugins).n_total (), (_sources * _n_plugins).n_total ());
+ uint32_t min_width = std::max (25 * max_ports, (uint32_t)(20 + _pin_box_size) * max_pins);
+ min_width = std::max (min_width, (uint32_t)ceilf (_margin_y * .45 * _n_plugins * 16. / 9.)); // 16 : 9 aspect
+ min_width = std::max ((uint32_t)300, min_width);
+
+ min_width = 50 + 10 * ceilf (min_width / 10.f);
+
+ uint32_t min_height = 3.5 * _margin_y + 2 * (_n_sidechains + 1) * _pin_box_size;
+ min_height = std::max ((uint32_t)200, min_height);
+ min_height = 4 * ceilf (min_height / 4.f);
+
+ if (min_width != _min_width || min_height != _min_height) {
+ _min_width = min_width;
+ _min_height = min_height;
+ darea.queue_resize ();
+ }
+
+ _position_valid = false;
+ darea.queue_draw ();
+}
+
+void
+PluginPinWidget::refill_sidechain_table ()
+{
+ Table_Helpers::TableList& kids = _sidechain_tbl->children ();
+ for (Table_Helpers::TableList::iterator i = kids.begin (); i != kids.end ();) {
+ i = kids.erase (i);
+ }
+ _sidechain_tbl->resize (1, 1);
+ for (list<Control*>::iterator i = _controls.begin (); i != _controls.end (); ++i) {
+ delete *i;
+ }
+ _controls.clear ();
+ if (!_pi->has_sidechain () && _sidechain_selector) {
+ return;
+ }
+ boost::shared_ptr<IO> io = _pi->sidechain_input ();
+ if (!io) {
+ return;
+ }
+
+ uint32_t r = 0;
+ PortSet& p (io->ports ());
+ bool can_remove = p.num_ports () > 1;
+ for (PortSet::iterator i = p.begin (DataType::MIDI); i != p.end (DataType::MIDI); ++i) {
+ r += add_port_to_table (*i, r, can_remove);
+ }
+ for (PortSet::iterator i = p.begin (DataType::AUDIO); i != p.end (DataType::AUDIO); ++i) {
+ r += add_port_to_table (*i, r, can_remove);
+ }
+ _sidechain_tbl->show_all ();
+}
+
+void
+PluginPinWidget::refill_output_presets ()
+{
+ using namespace Menu_Helpers;
+ _out_presets.clear_items ();
+
+ bool need_dropdown = _pi->has_output_presets ();
+
+ if (!need_dropdown) {
+ _out_presets.set_sensitive (false);
+ _out_presets.set_text (_("Automatic"));
+ return;
+ }
+
+ _out_presets.AddMenuElem (MenuElem (_("Automatic"), sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::select_output_preset), 0)));
+
+ const uint32_t n_audio = _pi->preset_out ().n_audio ();
+ if (n_audio == 0) {
+ _out_presets.set_text (_("Automatic"));
+ }
+
+ PluginOutputConfiguration ppc (_pi->plugin (0)->possible_output ());
+ if (ppc.find (0) != ppc.end ()) {
+ // anyting goes
+ ppc.clear ();
+ if (n_audio != 0) {
+ ppc.insert (n_audio);
+ }
+ ppc.insert (1);
+ ppc.insert (2);
+ ppc.insert (8);
+ ppc.insert (16);
+ ppc.insert (24);
+ ppc.insert (32);
+ }
+
+ for (PluginOutputConfiguration::const_iterator i = ppc.begin () ; i != ppc.end (); ++i) {
+ assert (*i > 0);
+ std::string tmp;
+ switch (*i) {
+ case 1:
+ tmp = _("Mono");
+ break;
+ case 2:
+ tmp = _("Stereo");
+ break;
+ default:
+ tmp = string_compose (P_("%1 Channel", "%1 Channels", *i), *i);
+ break;
+ }
+ _out_presets.AddMenuElem (MenuElem (tmp, sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::select_output_preset), *i)));
+ if (n_audio == *i) {
+ _out_presets.set_text (tmp);
+ }
+ }
+}
+
+std::string
+PluginPinWidget::port_label (const std::string& portname, bool strip)
+{
+ // compare to MixerStrip::update_io_button()
+ string lpn (PROGRAM_NAME);
+ boost::to_lower (lpn);
+ std::string program_port_prefix = lpn + ":"; // e.g. "ardour:"
+
+ std::string pn = AudioEngine::instance ()->get_pretty_name_by_name (portname);
+ if (!pn.empty ()) {
+ string::size_type slash = pn.find ("/");
+ if (slash != string::npos) {
+ pn = pn.substr (0, slash);
+ }
+ return pn;
+ }
+ std::string label (portname);
+ if (label.find ("system:capture_") == 0) {
+ if (label.empty ()) {
+ label = portname.substr (15);
+ }
+ } else if (label.find ("system:midi_capture_") == 0) {
+ if (label.empty ()) {
+ // "system:midi_capture_123" -> "123"
+ label = "M " + portname.substr (20);
+ }
+ } else if (label.find (program_port_prefix) == 0) {
+ label = label.substr (program_port_prefix.size ());
+ if (strip) {
+ string::size_type slash = label.find ("/");
+ if (slash != string::npos) {
+ label = label.substr (0, slash);
+ }
+ }
+ }
+ return label;
+}
+
+uint32_t
+PluginPinWidget::add_port_to_table (boost::shared_ptr<Port> p, uint32_t r, bool can_remove)
+{
+ std::string lbl;
+ std::string tip = p->name ();
+ std::vector<std::string> cns;
+ bool single_source = true;
+ p->get_connections (cns);
+
+ for (std::vector<std::string>::const_iterator i = cns.begin (); i != cns.end (); ++i) {
+ if (lbl.empty ()) {
+ lbl = port_label (*i, true);
+ continue;
+ }
+ if (port_label (*i, true) != lbl) {
+ lbl = "...";
+ single_source = false;
+ break;
+ }
+ }
+
+ if (cns.size () == 0) {
+ lbl = "-";
+ single_source = false;
+ } else if (cns.size () == 1) {
+ tip += " <- ";
+ lbl = port_label (cns[0], false);
+ } else {
+ tip += " <- ";
+ }
+ replace_all (lbl, "_", " ");
+
+ for (std::vector<std::string>::const_iterator i = cns.begin (); i != cns.end (); ++i) {
+ tip += *i;
+ tip += " ";
+ }
+
+ ArdourButton *pb = manage (new ArdourButton (lbl));
+ pb->set_text_ellipsize (Pango::ELLIPSIZE_MIDDLE);
+ pb->set_layout_ellipsize_width (108 * PANGO_SCALE);
+ ARDOUR_UI_UTILS::set_tooltip (*pb, tip);
+ _sidechain_tbl->attach (*pb, 0, 1, r, r +1 , EXPAND|FILL, SHRINK);
+
+ pb->signal_button_press_event ().connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::sc_input_press), boost::weak_ptr<Port> (p)), false);
+ pb->signal_button_release_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::sc_input_release), false);
+
+ pb = manage (new ArdourButton ("-"));
+ _sidechain_tbl->attach (*pb, 1, 2, r, r + 1, FILL, SHRINK);
+ if (can_remove) {
+ pb->signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::remove_port), boost::weak_ptr<Port> (p)));
+ } else {
+ pb->set_sensitive (false);
+ }
+
+ uint32_t rv = 1;
+
+ if (single_source && _session) {
+ /* check if it's an Ardour Send feeding.. */
+ boost::shared_ptr<ARDOUR::RouteList> routes = _session->get_routes ();
+ for (ARDOUR::RouteList::const_iterator i = routes->begin (); i != routes->end (); ++i) {
+ uint32_t nth = 0;
+ boost::shared_ptr<Processor> proc;
+ /* nth_send () takes a processor read-lock */
+ while ((proc = (*i)->nth_send (nth))) {
+ boost::shared_ptr<IOProcessor> send = boost::dynamic_pointer_cast<IOProcessor> (proc);
+ if (!send || !send->output ()) {
+ ++nth;
+ continue;
+ }
+ if (!send->output ()->connected_to (p->name ())) {
+ ++nth;
+ continue;
+ }
+ /* if processor goes away, we're notified by the port disconnect,
+ * there should be no need to explicily connect to proc->DropReferences
+ */
+ set<Evoral::Parameter> p = proc->what_can_be_automated ();
+ for (set<Evoral::Parameter>::iterator i = p.begin (); i != p.end (); ++i) {
+ Control* c = new Control (proc->automation_control (*i), _("Send"));
+ _controls.push_back (c);
+ ++r; ++rv;
+ _sidechain_tbl->attach (c->box, 0, 2, r, r + 1, EXPAND|FILL, SHRINK);
+ }
+ break;
+ }
+ }
+ }
+ return rv;
+}
+
+void
+PluginPinWidget::update_element_pos ()
+{
+ /* layout sizes */
+ _innerwidth = _width - 2. * _margin_x;
+
+ const double yc = rint (_height * .5);
+ const double bxh2 = rint (_margin_y * .45); // TODO grow?
+ const double bxw = rint ((_innerwidth * .95) / ((_n_plugins) + .2 * (_n_plugins - 1)));
+ const double bxw2 = rint (bxw * .5);
+ const double y_in = _margin_y;
+ const double y_out = _height - _margin_y;
+
+ _bxw2 = bxw2;
+ _bxh2 = bxh2;
+
+ const double dx = _pin_box_size * .5;
+
+ uint32_t sc_cnt = 0;
+ for (CtrlElemList::iterator i = _elements.begin (); i != _elements.end (); ++i) {
+ switch (i->e->ct) {
+ case Input:
+ if (i->e->sc) {
+ i->x = _innerwidth + _margin_x - dx;
+ i->y = y_in + (sc_cnt + .5) * _pin_box_size;
+ i->h = _pin_box_size;
+ i->w = 1.5 * _pin_box_size;
+ ++ sc_cnt;
+ } else {
+ uint32_t idx = i->e->id;
+ if (i->e->dt == DataType::AUDIO) { idx += _in.n_midi (); }
+ i->x = rint ((idx + 1) * _width / (1. + _n_inputs)) - 0.5 - dx;
+ i->w = _pin_box_size;
+ i->h = 1.5 * _pin_box_size;
+ i->y = y_in - i->h;
+ }
+ break;
+ case Output:
+ {
+ uint32_t idx = i->e->id;
+ if (i->e->dt == DataType::AUDIO) { idx += _out.n_midi (); }
+ i->x = rint ((idx + 1) * _width / (1. + _out.n_total ())) - 0.5 - dx;
+ i->y = y_out;
+ i->w = _pin_box_size;
+ i->h = 1.5 * _pin_box_size;
+ }
+ break;
+ case Sink:
+ {
+ uint32_t idx = i->e->id;
+ if (i->e->dt == DataType::AUDIO) { idx += _sinks.n_midi (); }
+ const double x0 = rint ((i->e->ip + .5) * _innerwidth / (double)(_n_plugins)) - .5 - bxw2;
+ i->x = _margin_x + rint (x0 + (idx + 1) * bxw / (1. + _sinks.n_total ())) - .5 - dx;
+ i->y = yc - bxh2 - dx;
+ i->w = _pin_box_size;
+ i->h = _pin_box_size;
+ }
+ break;
+ case Source:
+ {
+ uint32_t idx = i->e->id;
+ if (i->e->dt == DataType::AUDIO) { idx += _sources.n_midi (); }
+ const double x0 = rint ((i->e->ip + .5) * _innerwidth / (double)(_n_plugins)) - .5 - bxw2;
+ i->x = _margin_x + rint (x0 + (idx + 1) * bxw / (1. + _sources.n_total ())) - .5 - dx;
+ i->y = yc + bxh2 - dx;
+ i->w = _pin_box_size;
+ i->h = _pin_box_size;
+ }
+ break;
+ }
+ }
+}
+
+void
+PluginPinWidget::set_color (cairo_t* cr, bool midi)
+{
+ // see also gtk2_ardour/processor_box.cc
+ static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
+ static const uint32_t midi_port_color = 0x960909FF; //Red
+
+ if (midi) {
+ cairo_set_source_rgb (cr,
+ UINT_RGBA_R_FLT (midi_port_color),
+ UINT_RGBA_G_FLT (midi_port_color),
+ UINT_RGBA_B_FLT (midi_port_color));
+ } else {
+ cairo_set_source_rgb (cr,
+ UINT_RGBA_R_FLT (audio_port_color),
+ UINT_RGBA_G_FLT (audio_port_color),
+ UINT_RGBA_B_FLT (audio_port_color));
+ }
+}
+
+void
+PluginPinWidget::draw_io_pin (cairo_t* cr, const CtrlWidget& w)
+{
+ if (w.e->sc) {
+ const double dy = w.h * .5;
+ const double dx = w.w - dy;
+ cairo_move_to (cr, w.x, w.y + dy);
+ cairo_rel_line_to (cr, dy, -dy);
+ cairo_rel_line_to (cr, dx, 0);
+ cairo_rel_line_to (cr, 0, w.h);
+ cairo_rel_line_to (cr, -dx, 0);
+ } else {
+ const double dir = (w.e->ct == Input) ? 1 : -1;
+ const double dx = w.w * .5;
+ const double dy = w.h - dx;
+
+ cairo_move_to (cr, w.x + dx, w.y + ((w.e->ct == Input) ? w.h : 0));
+ cairo_rel_line_to (cr, -dx, -dx * dir);
+ cairo_rel_line_to (cr, 0., -dy * dir);
+ cairo_rel_line_to (cr, 2. * dx, 0.);
+ cairo_rel_line_to (cr, 0., dy * dir);
+ }
+ cairo_close_path (cr);
+
+ cairo_set_line_width (cr, 1.0);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_stroke_preserve (cr);
+
+ set_color (cr, w.e->dt == DataType::MIDI);
+
+ if (w.e->sc) {
+ assert (w.e->ct == Input);
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.4);
+ }
+
+ if (w.e == _selection || w.e == _actor) {
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 0.9, 0.9, 1.0, 0.6);
+ } else if (w.prelight) {
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 0.9, 0.9, 0.9, 0.3);
+ }
+ cairo_fill (cr);
+}
+
+void
+PluginPinWidget::draw_plugin_pin (cairo_t* cr, const CtrlWidget& w)
+{
+ const double dx = w.w * .5;
+ const double dy = w.h * .5;
+
+ cairo_move_to (cr, w.x + dx, w.y);
+ cairo_rel_line_to (cr, -dx, dy);
+ cairo_rel_line_to (cr, dx, dy);
+ cairo_rel_line_to (cr, dx, -dy);
+ cairo_close_path (cr);
+
+ cairo_set_line_width (cr, 1.0);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_stroke_preserve (cr);
+
+ set_color (cr, w.e->dt == DataType::MIDI);
+
+ if (w.e->sc) {
+ assert (w.e->ct == Sink);
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.4);
+ }
+
+ if (w.e == _selection || w.e == _actor) {
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 0.9, 0.9, 1.0, 0.6);
+ } else if (w.prelight) {
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 0.9, 0.9, 0.9, 0.3);
+ }
+ cairo_fill (cr);
+
+ if ((w.prelight || w.e == _selection) && !w.name.empty ()) {
+ int text_width;
+ int text_height;
+ Glib::RefPtr<Pango::Layout> layout;
+ layout = Pango::Layout::create (get_pango_context ());
+ layout->set_text (w.name);
+ layout->get_pixel_size (text_width, text_height);
+
+ rounded_rectangle (cr, w.x + dx - .5 * text_width - 2, w.y - text_height - 2, text_width + 4, text_height + 2, 7);
+ cairo_set_source_rgba (cr, 0, 0, 0, .5);
+ cairo_fill (cr);
+
+ cairo_move_to (cr, w.x + dx - .5 * text_width, w.y - text_height - 1);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+ }
+}
+
+double
+PluginPinWidget::pin_x_pos (uint32_t i, double x0, double width, uint32_t n_total, uint32_t n_midi, bool midi)
+{
+ if (!midi) { i += n_midi; }
+ return rint (x0 + (i + 1) * width / (1. + n_total)) - .5;
+}
+
+const PluginPinWidget::CtrlWidget&
+PluginPinWidget::get_io_ctrl (CtrlType ct, DataType dt, uint32_t id, uint32_t ip) const
+{
+ for (CtrlElemList::const_iterator i = _elements.begin (); i != _elements.end (); ++i) {
+ if (i->e->ct == ct && i->e->dt == dt && i->e->id == id && i->e->ip == ip) {
+ return *i;
+ }
+ }
+ assert (0);
+ fatal << string_compose (_("programming error: %1"),
+ X_("Invalid Plugin I/O Port."))
+ << endmsg;
+ abort (); /*NOTREACHED*/
+ static CtrlWidget screw_old_compilers ("", Input, DataType::NIL, 0);
+ return screw_old_compilers;
+}
+
+void
+PluginPinWidget::edge_coordinates (const CtrlWidget& w, double &x, double &y)
+{
+ switch (w.e->ct) {
+ case Input:
+ if (w.e->sc) {
+ x = w.x;
+ y = w.y + w.h * .5;
+ } else {
+ x = w.x + w.w * .5;
+ y = w.y + w.h;
+ }
+ break;
+ case Output:
+ x = w.x + w.w * .5;
+ y = w.y;
+ break;
+ case Sink:
+ x = w.x + w.w * .5;
+ y = w.y;
+ break;
+ case Source:
+ x = w.x + w.w * .5;
+ y = w.y + w.h;
+ break;
+ }
+}
+
+void
+PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool horiz, bool dashed)
+{
+ const double bz = 2 * _pin_box_size;
+ double bc = (dashed && x0 == x1) ? 1.25 * _pin_box_size : 0;
+ if (x0 > _width * .5) { bc *= -1; }
+
+ cairo_move_to (cr, x0, y0);
+ if (horiz) {
+ cairo_curve_to (cr, x0 - bz, y0 + bc, x1 - bc, y1 - bz, x1, y1);
+ } else {
+ cairo_curve_to (cr, x0 - bc, y0 + bz, x1 - bc, y1 - bz, x1, y1);
+ }
+ cairo_set_line_width (cr, 3.0);
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+ cairo_set_source_rgb (cr, 1, 0, 0);
+ if (dashed) {
+ const double dashes[] = { 5, 7 };
+ cairo_set_dash (cr, dashes, 2, 0);
+ }
+ set_color (cr, midi);
+ cairo_stroke (cr);
+ if (dashed) {
+ cairo_set_dash (cr, 0, 0, 0);
+ }
+}
+
+void
+PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1, bool dashed)
+{
+ double x0, x1, y0, y1;
+ edge_coordinates (w0, x0, y0);
+ edge_coordinates (w1, x1, y1);
+ assert (w0.e->dt == w1.e->dt);
+ draw_connection (cr, x0, x1, y0, y1, w0.e->dt == DataType::MIDI, w0.e->sc, dashed);
+}
+
+
+bool
+PluginPinWidget::darea_expose_event (GdkEventExpose* ev)
+{
+ Gtk::Allocation a = darea.get_allocation ();
+ double const width = a.get_width ();
+ double const height = a.get_height ();
+
+ if (!_position_valid) {
+ _width = width;
+ _height = height;
+ update_element_pos ();
+ _position_valid = true;
+ }
+
+ cairo_t* cr = gdk_cairo_create (darea.get_window ()->gobj ());
+ cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ cairo_clip (cr);
+
+ Gdk::Color const bg = get_style ()->get_bg (STATE_NORMAL);
+ cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ());
+ cairo_rectangle (cr, 0, 0, width, height);
+ cairo_fill (cr);
+
+ const double yc = rint (_height * .5);
+
+ /* processor box */
+ rounded_rectangle (cr, _margin_x, _margin_y - _pin_box_size * .5, _innerwidth, _height - 2 * _margin_y + _pin_box_size, 7);
+ cairo_set_line_width (cr, 1.0);
+ cairo_set_source_rgb (cr, .1, .1, .3);
+ cairo_stroke_preserve (cr);
+ cairo_set_source_rgb (cr, .3, .3, .3);
+ cairo_fill (cr);
+
+ /* labels */
+ Glib::RefPtr<Pango::Layout> layout;
+ layout = Pango::Layout::create (get_pango_context ());
+
+ layout->set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
+ layout->set_width (_height * PANGO_SCALE);
+
+ int text_width;
+ int text_height;
+
+ layout->set_text (_route ()->name ());
+ layout->get_pixel_size (text_width, text_height);
+ cairo_save (cr);
+ cairo_move_to (cr, .5 * (_margin_x - text_height), .5 * (_height + text_width));
+ cairo_rotate (cr, M_PI * -.5);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+ cairo_new_path (cr);
+ cairo_restore (cr);
+
+ layout->set_width ((_innerwidth - 2 * _pin_box_size) * PANGO_SCALE);
+ layout->set_text (_pi->name ());
+ layout->get_pixel_size (text_width, text_height);
+ cairo_move_to (cr, _margin_x + _innerwidth - text_width - _pin_box_size * .5, _height - _margin_y - text_height);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+
+#ifndef NDEBUG
+ if (_pi->signal_latency () > 0 || !_pi->inplace()) {
+ layout->set_width ((_innerwidth - 2 * _pin_box_size) * PANGO_SCALE);
+ if (_pi->signal_latency () > 0 && !_pi->inplace()) {
+ layout->set_text (string_compose (_("Latency %1 spl%2 %3"), _pi->signal_latency (), ", ", _("no-inplace")));
+ } else if (_pi->signal_latency () > 0) {
+ layout->set_text (string_compose (_("Latency %1 spl"), _pi->signal_latency ()));
+ } else {
+ layout->set_text (_("no-inplace"));
+ }
+ layout->get_pixel_size (text_width, text_height);
+ cairo_move_to (cr, _margin_x + _pin_box_size * .5, _margin_y + 2);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+ }
+#endif
+
+ if (_pi->strict_io () && !Profile->get_mixbus ()) {
+ layout->set_text (_("Strict I/O"));
+ layout->get_pixel_size (text_width, text_height);
+ const double sx0 = _margin_x + .5 * (_innerwidth - text_width);
+ const double sy0 = _height - 3 - text_height;
+
+ rounded_rectangle (cr, sx0 - 2, sy0 - 1, text_width + 4, text_height + 2, 7);
+ cairo_set_source_rgba (cr, .4, .3, .1, 1.);
+ cairo_fill (cr);
+
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ cairo_move_to (cr, sx0, sy0);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+ }
+
+ /* draw midi-bypass (behind) */
+ if (_has_midi_bypass) {
+ const CtrlWidget& cw0 = get_io_ctrl (Input, DataType::MIDI, 0);
+ const CtrlWidget& cw1 = get_io_ctrl (Output, DataType::MIDI, 0);
+ draw_connection (cr, cw0, cw1, true);
+ }
+
+ /* thru connections */
+ const ChanMapping::Mappings thru_map (_thru_map.mappings ());
+ for (ChanMapping::Mappings::const_iterator t = thru_map.begin (); t != thru_map.end (); ++t) {
+ for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+ const CtrlWidget& cw0 = get_io_ctrl (Output, t->first, c->first);
+ const CtrlWidget& cw1 = get_io_ctrl (Input, t->first, c->second);
+ if (!(_dragging && cw1.e == _selection && cw0.e == _drag_dst)) {
+ draw_connection (cr, cw1, cw0, true);
+ }
+ }
+ }
+
+ /* plugins & connection wires */
+ for (uint32_t i = 0; i < _n_plugins; ++i) {
+ double x0 = _margin_x + rint ((i + .5) * _innerwidth / (double)(_n_plugins)) - .5;
+
+ /* plugin box */
+ cairo_set_source_rgb (cr, .5, .5, .5);
+ rounded_rectangle (cr, x0 - _bxw2, yc - _bxh2, 2 * _bxw2, 2 * _bxh2, 7);
+ cairo_fill (cr);
+
+ layout->set_width (1.9 * _bxw2 * PANGO_SCALE);
+ layout->set_text (string_compose (_("Instance #%1"), i + 1));
+ layout->get_pixel_size (text_width, text_height);
+ cairo_move_to (cr, x0 - text_width * .5, yc - text_height * .5);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+
+ const ChanMapping::Mappings in_map = _in_map[i].mappings ();
+ const ChanMapping::Mappings out_map = _out_map[i].mappings ();
+
+ for (ChanMapping::Mappings::const_iterator t = in_map.begin (); t != in_map.end (); ++t) {
+ for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+ const CtrlWidget& cw0 = get_io_ctrl (Input, t->first, c->second);
+ const CtrlWidget& cw1 = get_io_ctrl (Sink, t->first, c->first, i);
+ if (!(_dragging && cw0.e == _selection && cw1.e == _drag_dst)) {
+ draw_connection (cr, cw0, cw1);
+ }
+ }
+ }
+
+ for (ChanMapping::Mappings::const_iterator t = out_map.begin (); t != out_map.end (); ++t) {
+ for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+ const CtrlWidget& cw0 = get_io_ctrl (Source, t->first, c->first, i);
+ const CtrlWidget& cw1 = get_io_ctrl (Output, t->first, c->second);
+ if (!(_dragging && cw0.e == _selection && cw1.e == _drag_dst)) {
+ draw_connection (cr, cw0, cw1);
+ }
+ }
+ }
+ }
+
+ /* pins and ports */
+ for (CtrlElemList::const_iterator i = _elements.begin (); i != _elements.end (); ++i) {
+ switch (i->e->ct) {
+ case Input:
+ case Output:
+ draw_io_pin (cr, *i);
+ break;
+ case Sink:
+ case Source:
+ draw_plugin_pin (cr, *i);
+ break;
+ }
+ }
+
+ /* DnD wire */
+ CtrlWidget *drag_src = NULL;
+ if (_dragging) {
+ for (CtrlElemList::iterator i = _elements.begin (); i != _elements.end (); ++i) {
+ if (i->e == _selection ) {
+ drag_src = &(*i);
+ }
+ }
+ }
+
+ if (drag_src) {
+ double x0, y0;
+ if (_selection->ct == Input || _selection->ct == Source) {
+ edge_coordinates (*drag_src, x0, y0);
+ draw_connection (cr, x0, _drag_x, y0, _drag_y,
+ _selection->dt == DataType::MIDI, _selection->sc);
+ } else {
+ edge_coordinates (*drag_src, x0, y0);
+ draw_connection (cr, _drag_x, x0, _drag_y, y0,
+ _selection->dt == DataType::MIDI, _selection->sc);
+ }
+ }
+
+ cairo_destroy (cr);
+ return true;
+}
+
+void
+PluginPinWidget::darea_size_request (Gtk::Requisition* req)
+{
+ req->width = _min_width;
+ req->height = _min_height;
+}
+
+void
+PluginPinWidget::darea_size_allocate (Gtk::Allocation&)
+{
+ _position_valid = false;
+}
+
+bool
+PluginPinWidget::drag_type_matches (const CtrlElem& e)
+{
+ if (!_dragging || !_selection) {
+ return true;
+ }
+ if (_selection->dt != e->dt) {
+ return false;
+ }
+ if (_selection->ct == Input && e->ct == Sink) { return true; }
+ if (_selection->ct == Sink && e->ct == Input) { return true; }
+ if (_selection->ct == Output && e->ct == Source) { return true; }
+ if (_selection->ct == Source && e->ct == Output) { return true; }
+ if (_selection->ct == Input && e->ct == Output) { return true; }
+ if (_selection->ct == Output && e->ct == Input) { return true; }
+ return false;
+}
+
+void
+PluginPinWidget::start_drag (const CtrlElem& e, double x, double y)
+{
+ assert (_selection == e);
+ _drag_dst.reset ();
+ if (e->ct == Sink) {
+ bool valid;
+ const ChanMapping& map (_in_map[e->ip]);
+ uint32_t idx = map.get (e->dt, e->id, &valid);
+ if (valid) {
+ const CtrlWidget& cw = get_io_ctrl (Input, e->dt, idx, 0);
+ _drag_dst = e;
+ _selection = cw.e;
+ }
+ }
+ else if (e->ct == Output) {
+ for (uint32_t i = 0; i < _n_plugins; ++i) {
+ bool valid;
+ const ChanMapping& map (_out_map[i]);
+ uint32_t idx = map.get_src (e->dt, e->id, &valid);
+ if (valid) {
+ const CtrlWidget& cw = get_io_ctrl (Source, e->dt, idx, i);
+ _drag_dst = e;
+ _selection = cw.e;
+ break;
+ }
+ }
+ if (!_drag_dst) {
+ bool valid;
+ const ChanMapping& map (_thru_map);
+ uint32_t idx = map.get (e->dt, e->id, &valid);
+ if (valid) {
+ const CtrlWidget& cw = get_io_ctrl (Input, e->dt, idx, 0);
+ _drag_dst = e;
+ _selection = cw.e;
+ }
+ }
+ }
+ _dragging = true;
+ _drag_x = x;
+ _drag_y = y;
+}
+
+bool
+PluginPinWidget::darea_motion_notify_event (GdkEventMotion* ev)
+{
+ bool changed = false;
+ _hover.reset ();
+ for (CtrlElemList::iterator i = _elements.begin (); i != _elements.end (); ++i) {
+ if (ev->x >= i->x && ev->x <= i->x + i->w
+ && ev->y >= i->y && ev->y <= i->y + i->h
+ && drag_type_matches (i->e))
+ {
+ if (!i->prelight) changed = true;
+ i->prelight = true;
+ _hover = i->e;
+ } else {
+ if (i->prelight) changed = true;
+ i->prelight = false;
+ }
+ }
+ if (_dragging) {
+ _drag_x = ev->x;
+ _drag_y = ev->y;
+ }
+ if (changed || _dragging) {
+ darea.queue_draw ();
+ }
+ return true;
+}
+
+bool
+PluginPinWidget::darea_button_press_event (GdkEventButton* ev)
+{
+ if (ev->type != GDK_BUTTON_PRESS) {
+ return false;
+ }
+
+ switch (ev->button) {
+ case 1:
+ _drag_dst.reset ();
+ if (!_selection || (_selection && !_hover)) {
+ _selection = _hover;
+ _actor.reset ();
+ if (_selection) {
+ start_drag (_selection, ev->x, ev->y);
+ } else {
+ darea.queue_draw ();
+ }
+ } else if (_selection && _hover && _selection != _hover) {
+ if (_selection->dt != _hover->dt) { _actor.reset (); }
+ else if (_selection->ct == Input && _hover->ct == Sink) { _actor = _hover; }
+ else if (_selection->ct == Sink && _hover->ct == Input) { _actor = _hover; }
+ else if (_selection->ct == Output && _hover->ct == Source) { _actor = _hover; }
+ else if (_selection->ct == Source && _hover->ct == Output) { _actor = _hover; }
+ else if (_selection->ct == Input && _hover->ct == Output) { _actor = _hover; }
+ else if (_selection->ct == Output && _hover->ct == Input) { _actor = _hover; }
+ if (!_actor) {
+ _selection = _hover;
+ start_drag (_selection, ev->x, ev->y);
+ } else {
+ darea.queue_draw ();
+ }
+ } else if (_hover) {
+ _selection = _hover;
+ _actor.reset ();
+ start_drag (_selection, ev->x, ev->y);
+ }
+ break;
+ case 3:
+ _drag_dst.reset ();
+ if (_selection != _hover) {
+ _selection = _hover;
+ darea.queue_draw ();
+ }
+ _actor.reset ();
+ break;
+ default:
+ break;
+ }
+
+ return true;
+}
+
+bool
+PluginPinWidget::darea_button_release_event (GdkEventButton* ev)
+{
+ if (_dragging && _selection && _drag_dst && _drag_dst == _hover) {
+ // select click. (or re-connect same)
+ assert (_selection != _hover);
+ _actor.reset ();
+ _dragging = false;
+ _drag_dst.reset ();
+ _selection =_hover;
+ darea.queue_draw ();
+ return true;
+ }
+
+ if (_dragging && _hover && _hover != _selection) {
+ _actor = _hover;
+ }
+
+ if (_hover == _actor && _actor && ev->button == 1) {
+ assert (_selection);
+ assert (_selection->dt == _actor->dt);
+ if (_drag_dst) {
+ assert (_dragging && _selection != _drag_dst);
+ handle_disconnect (_drag_dst, true);
+ }
+ if (_selection->ct == Input && _actor->ct == Sink) {
+ handle_input_action (_actor, _selection);
+ }
+ else if (_selection->ct == Sink && _actor->ct == Input) {
+ handle_input_action (_selection, _actor);
+ }
+ else if (_selection->ct == Output && _actor->ct == Source) {
+ handle_output_action (_actor, _selection);
+ }
+ else if (_selection->ct == Source && _actor->ct == Output) {
+ handle_output_action (_selection, _actor);
+ }
+ else if (_selection->ct == Input && _actor->ct == Output) {
+ handle_thru_action (_actor, _selection);
+ }
+ else if (_selection->ct == Output && _actor->ct == Input) {
+ handle_thru_action (_selection, _actor);
+ }
+ _selection.reset ();
+ } else if (_hover == _selection && _selection && ev->button == 3) {
+ handle_disconnect (_selection);
+ } else if (!_hover && ev->button == 3) {
+ reset_menu.popup (1, ev->time);
+ }
+
+ if (_dragging && _hover != _selection) {
+ _selection.reset ();
+ }
+ _actor.reset ();
+ _dragging = false;
+ _drag_dst.reset ();
+ darea.queue_draw ();
+ return true;
+}
+
+void
+PluginPinWidget::handle_input_action (const CtrlElem &s, const CtrlElem &i)
+{
+ const int pc = s->ip;
+ bool valid;
+ ChanMapping in_map (_pi->input_map (pc));
+ uint32_t idx = in_map.get (s->dt, s->id, &valid);
+
+ if (valid && idx == i->id) {
+ // disconnect
+ if (!_dragging) {
+ in_map.unset (s->dt, s->id);
+ _pi->set_input_map (pc, in_map);
+ } else {
+ plugin_reconfigured ();
+ }
+ }
+ else if (!valid) {
+ // connect
+ in_map.set (s->dt, s->id, i->id);
+ _pi->set_input_map (pc, in_map);
+ }
+ else {
+ // reconnect
+ in_map.unset (s->dt, s->id);
+ in_map.set (s->dt, s->id, i->id);
+ _pi->set_input_map (pc, in_map);
+ }
+}
+
+void
+PluginPinWidget::disconnect_other_outputs (uint32_t skip_pc, DataType dt, uint32_t id)
+{
+ _ignore_updates = true;
+ for (uint32_t n = 0; n < _n_plugins; ++n) {
+ if (n == skip_pc) {
+ continue;
+ }
+ bool valid;
+ ChanMapping n_out_map (_pi->output_map (n));
+ uint32_t idx = n_out_map.get_src (dt, id, &valid);
+ if (valid) {
+ n_out_map.unset (dt, idx);
+ _pi->set_output_map (n, n_out_map);
+ }
+ }
+ _ignore_updates = false;
+}
+
+void
+PluginPinWidget::disconnect_other_thru (DataType dt, uint32_t id)
+{
+ _ignore_updates = true;
+ bool valid;
+ ChanMapping n_thru_map (_pi->thru_map ());
+ n_thru_map.get (dt, id, &valid);
+ if (valid) {
+ n_thru_map.unset (dt, id);
+ _pi->set_thru_map (n_thru_map);
+ }
+ _ignore_updates = false;
+}
+
+void
+PluginPinWidget::handle_output_action (const CtrlElem &s, const CtrlElem &o)
+{
+ const uint32_t pc = s->ip;
+ bool valid;
+ ChanMapping out_map (_pi->output_map (pc));
+ uint32_t idx = out_map.get (s->dt, s->id, &valid);
+
+ if (valid && idx == o->id) {
+ // disconnect
+ if (!_dragging) {
+ out_map.unset (s->dt, s->id);
+ _pi->set_output_map (pc, out_map);
+ } else {
+ plugin_reconfigured ();
+ }
+ }
+ else {
+ // disconnect source
+ disconnect_other_outputs (pc, s->dt, o->id);
+ disconnect_other_thru (s->dt, o->id);
+ out_map = _pi->output_map (pc); // re-read map
+ if (valid) {
+ out_map.unset (s->dt, s->id);
+ }
+ idx = out_map.get_src (s->dt, o->id, &valid);
+ if (valid) {
+ out_map.unset (s->dt, idx);
+ }
+ // connect
+ out_map.set (s->dt, s->id, o->id);
+ _pi->set_output_map (pc, out_map);
+ }
+}
+
+void
+PluginPinWidget::handle_thru_action (const CtrlElem &o, const CtrlElem &i)
+{
+ bool valid;
+ ChanMapping thru_map (_pi->thru_map ());
+ uint32_t idx = thru_map.get (o->dt, o->id, &valid);
+
+ if (valid && idx == i->id) {
+ if (!_dragging) {
+ thru_map.unset (o->dt, o->id);
+ }
+ } else {
+ // disconnect other outputs first
+ disconnect_other_outputs (UINT32_MAX, o->dt, o->id);
+ disconnect_other_thru (o->dt, o->id);
+ thru_map = _pi->thru_map (); // re-read map
+
+ thru_map.set (o->dt, o->id, i->id);
+ }
+ _pi->set_thru_map (thru_map);
+}
+
+bool
+PluginPinWidget::handle_disconnect (const CtrlElem &e, bool no_signal)
+{
+ _ignore_updates = true;
+ bool changed = false;
+ bool valid;
+
+ switch (e->ct) {
+ case Input:
+ {
+ ChanMapping n_thru_map (_pi->thru_map ());
+ for (uint32_t i = 0; i < _sources.n_total (); ++i) {
+ uint32_t idx = n_thru_map.get (e->dt, i, &valid);
+ if (valid && idx == e->id) {
+ n_thru_map.unset (e->dt, i);
+ changed = true;
+ }
+ }
+ if (changed) {
+ _pi->set_thru_map (n_thru_map);
+ }
+ }
+ for (uint32_t n = 0; n < _n_plugins; ++n) {
+ ChanMapping map (_pi->input_map (n));
+ for (uint32_t i = 0; i < _sinks.n_total (); ++i) {
+ uint32_t idx = map.get (e->dt, i, &valid);
+ if (valid && idx == e->id) {
+ map.unset (e->dt, i);
+ changed = true;
+ }
+ }
+ _pi->set_input_map (n, map);
+ }
+ break;
+ case Sink:
+ {
+ ChanMapping map (_pi->input_map (e->ip));
+ map.get (e->dt, e->id, &valid);
+ if (valid) {
+ map.unset (e->dt, e->id);
+ _pi->set_input_map (e->ip, map);
+ changed = true;
+ }
+ }
+ break;
+ case Source:
+ {
+ ChanMapping map (_pi->output_map (e->ip));
+ map.get (e->dt, e->id, &valid);
+ if (valid) {
+ map.unset (e->dt, e->id);
+ _pi->set_output_map (e->ip, map);
+ changed = true;
+ }
+ }
+ break;
+ case Output:
+ for (uint32_t n = 0; n < _n_plugins; ++n) {
+ ChanMapping map (_pi->output_map (n));
+ for (uint32_t i = 0; i < _sources.n_total (); ++i) {
+ uint32_t idx = map.get (e->dt, i, &valid);
+ if (valid && idx == e->id) {
+ map.unset (e->dt, i);
+ changed = true;
+ }
+ }
+ if (changed) {
+ _pi->set_output_map (n, map);
+ }
+ }
+ {
+ ChanMapping n_thru_map (_pi->thru_map ());
+ n_thru_map.get (e->dt, e->id, &valid);
+ if (valid) {
+ n_thru_map.unset (e->dt, e->id);
+ changed = true;
+ _pi->set_thru_map (n_thru_map);
+ }
+ }
+ break;
+ }
+ _ignore_updates = false;
+ if (changed && !no_signal) {
+ plugin_reconfigured ();
+ }
+ return changed;
+}
+
+void
+PluginPinWidget::toggle_sidechain ()
+{
+ if (_session && _session->actively_recording ()) { return; }
+ _route ()->add_remove_sidechain (_pi, !_pi->has_sidechain ());
+}
+
+void
+PluginPinWidget::connect_sidechain ()
+{
+ if (!_session) { return; }
+
+ if (_sidechain_selector == 0) {
+ _sidechain_selector = new IOSelectorWindow (_session, _pi->sidechain_input ());
+ }
+
+ if (_sidechain_selector->is_visible ()) {
+ _sidechain_selector->get_toplevel ()->get_window ()->raise ();
+ } else {
+ _sidechain_selector->present ();
+ }
+}
+
+void
+PluginPinWidget::reset_configuration ()
+{
+ if (_set_config.get_active ()) {
+ _route ()->reset_plugin_insert (_pi);
+ } else {
+ _route ()->customize_plugin_insert (_pi, _n_plugins, _out, _sinks);
+ }
+}
+
+void
+PluginPinWidget::reset_mapping ()
+{
+ _pi->reset_map ();
+}
+
+void
+PluginPinWidget::select_output_preset (uint32_t n_audio)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ ChanCount out (DataType::AUDIO, n_audio);
+ _route ()->plugin_preset_output (_pi, out);
+}
+
+void
+PluginPinWidget::add_remove_plugin_clicked (bool add)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ ChanCount out = _out;
+ ChanCount sinks = _sinks;
+ assert (add || _n_plugins > 0);
+ _route ()->customize_plugin_insert (_pi, _n_plugins + (add ? 1 : -1), out, sinks);
+}
+
+void
+PluginPinWidget::add_remove_port_clicked (bool add, ARDOUR::DataType dt)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ ChanCount out = _out;
+ ChanCount sinks = _sinks;
+ assert (add || out.get (dt) > 0);
+ out.set (dt, out.get (dt) + (add ? 1 : -1));
+ _route ()->customize_plugin_insert (_pi, _n_plugins, out, sinks);
+}
+
+void
+PluginPinWidget::add_remove_inpin_clicked (bool add, ARDOUR::DataType dt)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ ChanCount out = _out;
+ ChanCount sinks = _sinks;
+ assert (add || sinks.get (dt) > 0);
+ sinks.set (dt, sinks.get (dt) + (add ? 1 : -1));
+ _route ()->customize_plugin_insert (_pi, _n_plugins, out, sinks);
+}
+
+void
+PluginPinWidget::add_sidechain_port (DataType dt)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ boost::shared_ptr<IO> io = _pi->sidechain_input ();
+ if (!io) {
+ return;
+ }
+
+ // this triggers a PluginIoReConfigure with process and processor write lock held
+ // from /this/ thread.
+ io->add_port ("", this, dt);
+}
+
+void
+PluginPinWidget::remove_port (boost::weak_ptr<ARDOUR::Port> wp)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ boost::shared_ptr<ARDOUR::Port> p = wp.lock ();
+ boost::shared_ptr<IO> io = _pi->sidechain_input ();
+ if (!io || !p) {
+ return;
+ }
+ io->remove_port (p, this);
+}
+
+void
+PluginPinWidget::disconnect_port (boost::weak_ptr<ARDOUR::Port> wp)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ boost::shared_ptr<ARDOUR::Port> p = wp.lock ();
+ boost::shared_ptr<IO> io = _pi->sidechain_input ();
+ if (!io || !p) {
+ return;
+ }
+ p->disconnect_all ();
+}
+
+void
+PluginPinWidget::connect_port (boost::weak_ptr<ARDOUR::Port> wp0, boost::weak_ptr<ARDOUR::Port> wp1)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ boost::shared_ptr<ARDOUR::Port> p0 = wp0.lock ();
+ boost::shared_ptr<ARDOUR::Port> p1 = wp1.lock ();
+ boost::shared_ptr<IO> io = _pi->sidechain_input ();
+ if (!io || !p0 || !p1) {
+ return;
+ }
+ _ignore_updates = true;
+ p0->disconnect_all ();
+ _ignore_updates = false;
+ p0->connect (p1->name ());
+}
+
+void
+PluginPinWidget::add_send_from (boost::weak_ptr<ARDOUR::Port> wp, boost::weak_ptr<ARDOUR::Route> wr)
+{
+ if (_session && _session->actively_recording ()) { return; }
+ boost::shared_ptr<Port> p = wp.lock ();
+ boost::shared_ptr<Route> r = wr.lock ();
+ boost::shared_ptr<IO> io = _pi->sidechain_input ();
+ if (!p || !r || !io || !_session) {
+ return;
+ }
+
+ boost::shared_ptr<Pannable> sendpan (new Pannable (*_session));
+ boost::shared_ptr<Send> send (new Send (*_session, r->pannable (), r->mute_master ()));
+ const ChanCount& outs (r->amp ()->input_streams ());
+ try {
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance ()->process_lock ());
+ send->output()->ensure_io (outs, false, this);
+ } catch (AudioEngine::PortRegistrationFailure& err) {
+ error << string_compose (_("Cannot set up new send: %1"), err.what ()) << endmsg;
+ return;
+ }
+
+ std::string sendname = send->name ();
+ string::size_type last_letter = sendname.find_last_not_of ("0123456789");
+ if (last_letter != string::npos) {
+ send->output ()->set_pretty_name (string_compose (_("SC %1 (%2)"),
+ r->name (),
+ sendname.substr (last_letter + 1)));
+ }
+
+ _ignore_updates = true;
+ p->disconnect_all ();
+
+ DataType dt = p->type ();
+ PortSet& ps (send->output ()->ports ());
+ for (PortSet::iterator i = ps.begin (dt); i != ps.end (dt); ++i) {
+ p->connect (&(**i));
+ }
+
+ send->set_remove_on_disconnect (true);
+ r->add_processor (send, PreFader);
+ _ignore_updates = false;
+ queue_idle_update ();
+}
+
+bool
+PluginPinWidget::sc_input_release (GdkEventButton *ev)
+{
+ if (_session && _session->actively_recording ()) { return false; }
+ if (ev->button == 3) {
+ connect_sidechain ();
+ }
+ return false;
+}
+
+struct RouteCompareByName {
+ bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+ return a->name ().compare (b->name ()) < 0;
+ }
+};
+
+bool
+PluginPinWidget::sc_input_press (GdkEventButton *ev, boost::weak_ptr<ARDOUR::Port> wp)
+{
+ using namespace Menu_Helpers;
+ if (!_session || _session->actively_recording ()) { return false; }
+ if (!_session->engine ().connected ()) { return false; }
+
+ if (ev->button == 1) {
+ MenuList& citems = input_menu.items ();
+ input_menu.set_name ("ArdourContextMenu");
+ citems.clear ();
+
+ boost::shared_ptr<Port> p = wp.lock ();
+ if (p && p->connected ()) {
+ citems.push_back (MenuElem (_("Disconnect"), sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::disconnect_port), wp)));
+ citems.push_back (SeparatorElem ());
+ }
+
+#if 0
+ // TODO add system inputs, too ?!
+ boost::shared_ptr<ARDOUR::BundleList> b = _session->bundles ();
+ for (ARDOUR::BundleList::iterator i = b->begin(); i != b->end(); ++i) {
+ for (uint32_t j = 0; j < i->nchannels ().n_total (); ++j) {
+ }
+ //maybe_add_bundle_to_input_menu (*i, current);
+ }
+#endif
+
+ boost::shared_ptr<ARDOUR::RouteList> routes = _session->get_routes ();
+ RouteList copy = *routes;
+ copy.sort (RouteCompareByName ());
+ uint32_t added = 0;
+ for (ARDOUR::RouteList::const_iterator i = copy.begin (); i != copy.end (); ++i) {
+ added += maybe_add_route_to_input_menu (*i, p->type (), wp);
+ }
+
+ if (added > 0) {
+ citems.push_back (SeparatorElem ());
+ }
+ citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*this, &PluginPinWidget::connect_sidechain)));
+ input_menu.popup (1, ev->time);
+ }
+ return false;
+}
+
+uint32_t
+PluginPinWidget::maybe_add_route_to_input_menu (boost::shared_ptr<Route> r, DataType dt, boost::weak_ptr<Port> wp)
+{
+ uint32_t added = 0;
+ using namespace Menu_Helpers;
+ if (r->output () == _route ()->output ()) {
+ return added;
+ }
+
+ if (_route ()->feeds_according_to_graph (r)) {
+ return added;
+ }
+
+ MenuList& citems = input_menu.items ();
+
+ /*check if there's already a send.. */
+ bool already_present = false;
+ uint32_t nth = 0;
+ boost::shared_ptr<Processor> proc;
+ /* Note: nth_send () takes a processor read-lock */
+ while ((proc = r->nth_send (nth))) {
+ boost::shared_ptr<IOProcessor> send = boost::dynamic_pointer_cast<IOProcessor> (proc);
+ if (!send || !send->output ()) {
+ ++nth;
+ continue;
+ }
+ if (send->output ()->connected_to (_pi->sidechain_input ())) {
+ // only if (send->remove_on_disconnect ()) ??
+ already_present = true;
+ break;
+ }
+ ++nth;
+ }
+ /* we're going to create the new send pre-fader, so check the route amp's data type. */
+ const ChanCount& rc (r->amp ()->input_streams ());
+ if (!already_present && rc.get (dt) > 0) {
+ citems.push_back (MenuElem (r->name (), sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_send_from), wp, boost::weak_ptr<Route> (r))));
+ ++added;
+ }
+ return added;
+}
+
+void
+PluginPinWidget::port_connected_or_disconnected (boost::weak_ptr<ARDOUR::Port> w0, boost::weak_ptr<ARDOUR::Port> w1)
+{
+ boost::shared_ptr<Port> p0 = w0.lock ();
+ boost::shared_ptr<Port> p1 = w1.lock ();
+
+ boost::shared_ptr<IO> io = _pi->sidechain_input ();
+ if (!io) { return; }
+
+ if (p0 && io->has_port (p0)) {
+ queue_idle_update ();
+ }
+ else if (p1 && io->has_port (p1)) {
+ queue_idle_update ();
+ }
+}
+
+/* lifted from ProcessorEntry::Control */
+PluginPinWidget::Control::Control (boost::shared_ptr<AutomationControl> c, string const & n)
+ : _control (c)
+ , _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain ()), 0, 1, 0.01, 0.1)
+ , _slider (&_adjustment, boost::shared_ptr<PBD::Controllable> (), 0, max (13.f, rintf (13.f * UIConfiguration::instance ().get_ui_scale ())))
+ , _slider_persistant_tooltip (&_slider)
+ , _ignore_ui_adjustment (false)
+ , _name (n)
+{
+ _slider.set_controllable (c);
+ box.set_padding (0, 0, 4, 4);
+
+ _slider.set_name ("ProcessorControlSlider");
+ _slider.set_text (_name);
+
+ box.add (_slider);
+ _slider.show ();
+
+ const ARDOUR::ParameterDescriptor& desc = c->desc ();
+ double const lo = c->internal_to_interface (desc.lower);
+ double const up = c->internal_to_interface (desc.upper);
+ double const normal = c->internal_to_interface (desc.normal);
+ double smallstep = desc.smallstep;
+ double largestep = desc.largestep;
+
+ if (smallstep == 0.0) {
+ smallstep = up / 1000.;
+ } else {
+ smallstep = c->internal_to_interface (desc.lower + smallstep);
+ }
+
+ if (largestep == 0.0) {
+ largestep = up / 40.;
+ } else {
+ largestep = c->internal_to_interface (desc.lower + largestep);
+ }
+
+ _adjustment.set_lower (lo);
+ _adjustment.set_upper (up);
+ _adjustment.set_step_increment (smallstep);
+ _adjustment.set_page_increment (largestep);
+ _slider.set_default_value (normal);
+
+ _adjustment.signal_value_changed ().connect (sigc::mem_fun (*this, &Control::slider_adjusted));
+ // dup. currently timers are used :(
+ //c->Changed.connect (_connection, MISSING_INVALIDATOR, boost::bind (&Control::control_changed, this), gui_context ());
+
+ // yuck, do we really need to do this?
+ // according to c404374 this is only needed for send automation
+ timer_connection = Timers::rapid_connect (sigc::mem_fun (*this, &Control::control_changed));
+
+ control_changed ();
+ set_tooltip ();
+
+ /* We're providing our own PersistentTooltip */
+ set_no_tooltip_whatsoever (_slider);
+}
+
+PluginPinWidget::Control::~Control ()
+{
+ timer_connection.disconnect ();
+}
+
+void
+PluginPinWidget::Control::set_tooltip ()
+{
+ boost::shared_ptr<AutomationControl> c = _control.lock ();
+ if (!c) {
+ return;
+ }
+ char tmp[256];
+ snprintf (tmp, sizeof (tmp), "%s: %.2f", _name.c_str (), c->internal_to_user (c->get_value ()));
+
+ string sm = Gtkmm2ext::markup_escape_text (tmp);
+ _slider_persistant_tooltip.set_tip (sm);
+}
+
+void
+PluginPinWidget::Control::slider_adjusted ()
+{
+ if (_ignore_ui_adjustment) {
+ return;
+ }
+ boost::shared_ptr<AutomationControl> c = _control.lock ();
+ if (!c) {
+ return;
+ }
+ c->set_value ( c->interface_to_internal (_adjustment.get_value ()) , Controllable::NoGroup);
+ set_tooltip ();
+}
+
+
+void
+PluginPinWidget::Control::control_changed ()
+{
+ boost::shared_ptr<AutomationControl> c = _control.lock ();
+ if (!c) {
+ return;
+ }
+
+ _ignore_ui_adjustment = true;
+
+ // as long as rapid timers are used, only update the tooltip
+ // if the value has changed.
+ const double nval = c->internal_to_interface (c->get_value ());
+ if (_adjustment.get_value () != nval) {
+ _adjustment.set_value (nval);
+ set_tooltip ();
+ }
+
+ _ignore_ui_adjustment = false;
+}
+
+
+
+PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
+ : ArdourWindow (string_compose (_("Pin Configuration: %1"), pi->name ()))
+{
+ ppw.push_back (PluginPinWidgetPtr(new PluginPinWidget (pi)));
+ add (*ppw.back());
+}
+
+
+PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::Route> r)
+ : ArdourWindow (string_compose (_("Pin Configuration: %1"), r->name ()))
+ , _route (r)
+{
+ vbox = manage (new VBox ());
+ add (*vbox);
+ vbox->show ();
+
+ _route->foreach_processor (sigc::mem_fun (*this, &PluginPinDialog::add_processor));
+
+ _route->processors_changed.connect (
+ _route_connections, invalidator (*this), boost::bind (&PluginPinDialog::route_processors_changed, this, _1), gui_context()
+ );
+
+ _route->DropReferences.connect (
+ _route_connections, invalidator (*this), boost::bind (&PluginPinDialog::route_going_away, this), gui_context()
+ );
+}
+void
+PluginPinDialog::set_session (ARDOUR::Session *s)
+{
+ SessionHandlePtr::set_session (s);
+ for (PluginPinWidgetList::iterator i = ppw.begin(); i != ppw.end(); ++i) {
+ (*i)->set_session (s);
+ }
+}
+
+void
+PluginPinDialog::route_processors_changed (ARDOUR::RouteProcessorChange)
+{
+ ppw.clear ();
+ remove ();
+ vbox = manage (new VBox ());
+ add (*vbox);
+ vbox->show ();
+ _route->foreach_processor (sigc::mem_fun (*this, &PluginPinDialog::add_processor));
+}
+
+void
+PluginPinDialog::route_going_away ()
+{
+ ppw.clear ();
+ _route.reset ();
+ remove ();
+}
+
+void
+PluginPinDialog::add_processor (boost::weak_ptr<Processor> p)
+{
+ boost::shared_ptr<Processor> proc = p.lock ();
+ if (!proc || !proc->display_to_user ()) {
+ return;
+ }
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (proc);
+ if (pi) {
+ ppw.push_back (PluginPinWidgetPtr(new PluginPinWidget (pi)));
+ vbox->pack_start (*ppw.back());
+ } else {
+ HBox* hbox = manage (new HBox ());
+ hbox->pack_start (*manage (new HSeparator ()));
+ hbox->pack_start (*manage (new Label (proc->display_name ())));
+ hbox->pack_start (*manage (new HSeparator ()));
+ vbox->pack_start (*hbox);
+ hbox->show_all ();
+ }
+}
diff --git a/gtk2_ardour/plugin_pin_dialog.h b/gtk2_ardour/plugin_pin_dialog.h
new file mode 100644
index 0000000..4028607
--- /dev/null
+++ b/gtk2_ardour/plugin_pin_dialog.h
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __gtkardour_plugin_pin_dialog_h__
+#define __gtkardour_plugin_pin_dialog_h__
+
+#include <gtkmm/drawingarea.h>
+
+#include "pbd/stateful.h"
+#include "pbd/signals.h"
+
+#include "ardour/plugin_insert.h"
+#include "ardour/route.h"
+
+#include <gtkmm/box.h>
+
+#include "gtkmm2ext/pixfader.h"
+#include "gtkmm2ext/persistent_tooltip.h"
+#include "gtkmm2ext/slider_controller.h"
+
+#include "ardour_button.h"
+#include "ardour_dropdown.h"
+#include "ardour_window.h"
+#include "io_selector.h"
+
+class PluginPinWidget : public ARDOUR::SessionHandlePtr, public Gtk::VBox
+{
+public:
+ PluginPinWidget (boost::shared_ptr<ARDOUR::PluginInsert>);
+ ~PluginPinWidget ();
+ void set_session (ARDOUR::Session *);
+private:
+ typedef enum {
+ Input,
+ Sink,
+ Source,
+ Output
+ } CtrlType;
+
+ struct _CtrlElem {
+ _CtrlElem (CtrlType c, ARDOUR::DataType d, uint32_t i, uint32_t p, bool s)
+ : ct (c), dt (d), id (i), ip (p), sc (s) {}
+ CtrlType ct;
+ ARDOUR::DataType dt;
+ uint32_t id; // port/pin ID
+ uint32_t ip; // plugin ID (for Sink, Source only);
+ bool sc; // sidechain
+ };
+
+ typedef boost::shared_ptr<_CtrlElem> CtrlElem;
+
+ struct CtrlWidget {
+ CtrlWidget (const std::string& n, CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0, bool sc = false)
+ : name (n), x(0), y(0), w (0), h (0), prelight (false)
+ {
+ e = CtrlElem (new _CtrlElem (ct, dt, id, ip, sc));
+ }
+ std::string name;
+ double x,y;
+ double w,h;
+ bool prelight;
+ CtrlElem e;
+ };
+
+ typedef std::vector<CtrlWidget> CtrlElemList;
+
+ CtrlElem _selection;
+ CtrlElem _actor;
+ CtrlElem _hover;
+ CtrlElemList _elements;
+ CtrlElem _drag_dst;
+
+ /* cache settings for expose */
+ typedef std::map <uint32_t, ARDOUR::ChanMapping> Mappings;
+ Mappings _in_map;
+ Mappings _out_map;
+ ARDOUR::ChanMapping _thru_map;
+ bool _has_midi_bypass;
+
+
+ Gtk::DrawingArea darea;
+ ArdourButton _set_config;
+ ArdourButton _tgl_sidechain;
+ ArdourButton _add_plugin;
+ ArdourButton _del_plugin;
+ ArdourButton _add_input_audio;
+ ArdourButton _del_input_audio;
+ ArdourButton _add_input_midi;
+ ArdourButton _del_input_midi;
+ ArdourButton _add_output_audio;
+ ArdourButton _del_output_audio;
+ ArdourButton _add_output_midi;
+ ArdourButton _del_output_midi;
+ ArdourButton _add_sc_audio;
+ ArdourButton _add_sc_midi;
+
+ ArdourDropdown _out_presets;
+
+ Gtk::Menu reset_menu;
+ Gtk::Menu input_menu;
+ Gtk::Table* _sidechain_tbl;
+ Glib::RefPtr<Gtk::SizeGroup> _pm_size_group;
+
+ void plugin_reconfigured ();
+ void update_element_pos ();
+ void refill_sidechain_table ();
+ void refill_output_presets ();
+
+ void darea_size_request (Gtk::Requisition*);
+ void darea_size_allocate (Gtk::Allocation&);
+ bool darea_expose_event (GdkEventExpose*);
+ bool darea_motion_notify_event (GdkEventMotion*);
+ bool darea_button_press_event (GdkEventButton*);
+ bool darea_button_release_event (GdkEventButton*);
+ bool drag_type_matches (const CtrlElem& ct);
+
+ void start_drag (const CtrlElem&, double, double);
+
+ void draw_io_pin (cairo_t*, const CtrlWidget&);
+ void draw_plugin_pin (cairo_t*, const CtrlWidget&);
+
+ void set_color (cairo_t*, bool);
+ double pin_x_pos (uint32_t, double, double, uint32_t, uint32_t, bool);
+ void draw_connection (cairo_t*, double, double, double, double, bool, bool, bool dashed = false);
+ void draw_connection (cairo_t*, const CtrlWidget&, const CtrlWidget&, bool dashed = false);
+ const CtrlWidget& get_io_ctrl (CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0) const;
+
+ static void edge_coordinates (const CtrlWidget& w, double &x, double &y);
+ static std::string port_label (const std::string&, bool);
+
+ void reset_mapping ();
+ void reset_configuration ();
+ void toggle_sidechain ();
+ void connect_sidechain ();
+ void add_remove_plugin_clicked (bool);
+ void add_remove_port_clicked (bool, ARDOUR::DataType);
+ void add_remove_inpin_clicked (bool, ARDOUR::DataType);
+ void add_sidechain_port (ARDOUR::DataType);
+ void select_output_preset (uint32_t n_audio);
+ void handle_input_action (const CtrlElem &, const CtrlElem &);
+ void handle_output_action (const CtrlElem &, const CtrlElem &);
+ void handle_thru_action (const CtrlElem &, const CtrlElem &);
+ bool handle_disconnect (const CtrlElem &, bool no_signal = false);
+ void disconnect_other_outputs (uint32_t skip_pc, ARDOUR::DataType dt, uint32_t id);
+ void disconnect_other_thru (ARDOUR::DataType dt, uint32_t id);
+ void remove_port (boost::weak_ptr<ARDOUR::Port>);
+ void disconnect_port (boost::weak_ptr<ARDOUR::Port>);
+ void connect_port (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Port>);
+ void add_send_from (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Route>);
+ uint32_t add_port_to_table (boost::shared_ptr<ARDOUR::Port>, uint32_t, bool);
+ uint32_t maybe_add_route_to_input_menu (boost::shared_ptr<ARDOUR::Route>, ARDOUR::DataType, boost::weak_ptr<ARDOUR::Port>);
+ void port_connected_or_disconnected (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Port>);
+
+ bool sc_input_press (GdkEventButton *, boost::weak_ptr<ARDOUR::Port>);
+ bool sc_input_release (GdkEventButton *);
+
+ PBD::ScopedConnectionList _plugin_connections;
+ PBD::ScopedConnection _io_connection;
+ boost::shared_ptr<ARDOUR::PluginInsert> _pi;
+
+ void queue_idle_update ();
+ bool idle_update ();
+
+ uint32_t _n_plugins;
+ ARDOUR::ChanCount _in, _ins, _out;
+ ARDOUR::ChanCount _sinks, _sources;
+
+ double _bxw2, _bxh2;
+ double _pin_box_size;
+ double _width, _height;
+ double _innerwidth, _margin_x, _margin_y;
+ double _min_width;
+ double _min_height;
+ uint32_t _n_inputs;
+ uint32_t _n_sidechains;
+ bool _position_valid;
+ bool _ignore_updates;
+ ARDOUR::Route* _route () { return static_cast<ARDOUR::Route*> (_pi->owner ()); }
+ IOSelectorWindow *_sidechain_selector;
+
+ bool _dragging;
+ double _drag_x, _drag_y;
+
+ class Control: public sigc::trackable {
+ public:
+ Control (boost::shared_ptr<ARDOUR::AutomationControl>, std::string const &);
+ ~Control ();
+ Gtk::Alignment box;
+ private:
+ void slider_adjusted ();
+ void control_changed ();
+ void set_tooltip ();
+
+ boost::weak_ptr<ARDOUR::AutomationControl> _control;
+ Gtk::Adjustment _adjustment;
+ Gtkmm2ext::HSliderController _slider;
+ Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip;
+
+ bool _ignore_ui_adjustment;
+ sigc::connection timer_connection;
+ std::string _name;
+ };
+ std::list<Control*> _controls;
+};
+
+
+class PluginPinDialog : public ArdourWindow
+{
+public:
+ PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert>);
+ PluginPinDialog (boost::shared_ptr<ARDOUR::Route>);
+
+ void set_session (ARDOUR::Session *);
+private:
+ Gtk::VBox *vbox;
+ typedef boost::shared_ptr<PluginPinWidget> PluginPinWidgetPtr;
+ typedef std::vector<PluginPinWidgetPtr> PluginPinWidgetList;
+
+ void route_going_away ();
+ void route_processors_changed (ARDOUR::RouteProcessorChange);
+ void add_processor (boost::weak_ptr<ARDOUR::Processor>);
+
+ boost::shared_ptr<ARDOUR::Route> _route;
+ PluginPinWidgetList ppw;
+ PBD::ScopedConnectionList _route_connections;
+};
+
+#endif
diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc
index 144e17d..3a0fed0 100644
--- a/gtk2_ardour/plugin_selector.cc
+++ b/gtk2_ardour/plugin_selector.cc
@@ -42,7 +42,7 @@
#include "gui_thread.h"
#include "tooltips.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -210,18 +210,29 @@ PluginSelector::PluginSelector (PluginManager& mgr)
filter_frame->show_all ();
+ HBox* side_by_side = manage (new HBox);
+ VBox* right_side = manage (new VBox);
+
table->attach (scroller, 0, 7, 0, 5);
table->attach (*filter_frame, 0, 7, 6, 7, FILL|EXPAND, FILL, 5, 5);
- table->attach(*btn_add, 1, 2, 7, 8, FILL, FILL, 5, 5);
- table->attach(*btn_remove, 5, 6, 7, 8, FILL, FILL, 5, 5);
- table->attach(ascroller, 0, 7, 8, 10);
+ right_side->pack_start (ascroller);
+
+ HBox* add_remove = manage (new HBox);
+ add_remove->pack_start (*btn_add, true, true);
+ add_remove->pack_start (*btn_remove, true, true);
+
+ right_side->pack_start (*add_remove, false, false);
+ right_side->set_size_request (200, -1);
+
+ side_by_side->pack_start (*table);
+ side_by_side->pack_start (*right_side);
add_button (Stock::CLOSE, RESPONSE_CLOSE);
add_button (_("Insert Plugin(s)"), RESPONSE_APPLY);
set_default_response (RESPONSE_APPLY);
set_response_sensitive (RESPONSE_APPLY, false);
- get_vbox()->pack_start (*table);
+ get_vbox()->pack_start (*side_by_side);
table->set_name("PluginSelectorTable");
plugin_display.set_name("PluginSelectorDisplay");
@@ -330,6 +341,9 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
case LXVST:
compstr = X_("LXVST");
break;
+ case Lua:
+ compstr = X_("Lua");
+ break;
}
} else if (mode == _("Author contains")) {
@@ -377,6 +391,7 @@ PluginSelector::refill ()
vst_refiller (filterstr);
lxvst_refiller (filterstr);
au_refiller (filterstr);
+ lua_refiller (filterstr);
in_row_change = false;
}
@@ -400,18 +415,23 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte
string creator = (*i)->creator;
string::size_type pos = 0;
- /* stupid LADSPA creator strings */
+ if ((*i)->type == ARDOUR::LADSPA) {
+ /* stupid LADSPA creator strings */
#ifdef PLATFORM_WINDOWS
- while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
+ while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#else
- while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
+ while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#endif
+ } else {
+ pos = creator.length ();
+ }
// If there were too few characters to create a
// meaningful name, mark this creator as 'Unknown'
- if (creator.length()<2 || pos<3)
+ if (creator.length() < 2 || pos < 3) {
creator = "Unknown";
- else
+ } else{
creator = creator.substr (0, pos);
+ }
newrow[plugin_columns.creator] = creator;
@@ -444,6 +464,12 @@ PluginSelector::ladspa_refiller (const std::string& filterstr)
}
void
+PluginSelector::lua_refiller (const std::string& filterstr)
+{
+ refiller (manager.lua_plugin_info(), filterstr, "Lua");
+}
+
+void
PluginSelector::lv2_refiller (const std::string& filterstr)
{
#ifdef LV2_SUPPORT
@@ -703,6 +729,7 @@ PluginSelector::build_plugin_menu ()
PluginInfoList all_plugs;
all_plugs.insert (all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
+ all_plugs.insert (all_plugs.end(), manager.lua_plugin_info().begin(), manager.lua_plugin_info().end());
#ifdef WINDOWS_VST_SUPPORT
all_plugs.insert (all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
#endif
@@ -780,23 +807,25 @@ PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs)
if (manager.get_status (*i) == PluginManager::Hidden) continue;
string creator = (*i)->creator;
-
- /* stupid LADSPA creator strings */
string::size_type pos = 0;
+
+ if ((*i)->type == ARDOUR::LADSPA) {
+ /* stupid LADSPA creator strings */
#ifdef PLATFORM_WINDOWS
- while (pos < creator.length() && creator[pos]>(-2) && creator[pos]<256 && (isprint (creator[pos]))) ++pos;
+ while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#else
- while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
+ while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#endif
+ } else {
+ pos = creator.length ();
+ }
- // Check to see if we found any invalid characters.
- if (creator.length() != pos) {
- // If there were too few characters to create a
- // meaningful name, mark this creator as 'Unknown'
- if (pos<3)
- creator = "Unknown?";
- else
- creator = creator.substr (0, pos);
+ // If there were too few characters to create a
+ // meaningful name, mark this creator as 'Unknown'
+ if (creator.length() < 2 || pos < 3) {
+ creator = "Unknown";
+ } else{
+ creator = creator.substr (0, pos);
}
SubmenuMap::iterator x;
diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h
index a377d5b..1a7e11b 100644
--- a/gtk2_ardour/plugin_selector.h
+++ b/gtk2_ardour/plugin_selector.h
@@ -123,6 +123,7 @@ class PluginSelector : public ArdourDialog
void vst_refiller (const std::string&);
void lxvst_refiller (const std::string&);
void au_refiller (const std::string&);
+ void lua_refiller (const std::string&);
Gtk::Menu* _plugin_menu;
ARDOUR::PluginManager& manager;
diff --git a/gtk2_ardour/plugin_setup_dialog.cc b/gtk2_ardour/plugin_setup_dialog.cc
new file mode 100644
index 0000000..5feb76a
--- /dev/null
+++ b/gtk2_ardour/plugin_setup_dialog.cc
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtkmm/frame.h>
+#include <gtkmm/label.h>
+
+#include "plugin_setup_dialog.h"
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace Gtk;
+
+PluginSetupDialog::PluginSetupDialog (boost::shared_ptr<ARDOUR::Route> r, boost::shared_ptr<ARDOUR::PluginInsert> pi, ARDOUR::Route::PluginSetupOptions flags)
+ : ArdourDialog (_("Plugin Setup"), true, false)
+ , _route (r)
+ , _pi (pi)
+ , _keep_mapping (_("Copy I/O Map"), ArdourButton::led_default_elements)
+{
+ assert (flags != Route::None);
+
+ Gtk::Table *tbl = manage (new Gtk::Table ());
+ tbl->set_spacings (6);
+ get_vbox()->pack_start (*tbl);
+ int row = 0;
+
+ if (flags & Route::CanReplace) {
+ boost::shared_ptr<Processor> old = _route->the_instrument ();
+ boost::shared_ptr<PluginInsert> opi = boost::dynamic_pointer_cast<PluginInsert> (old);
+ assert (opi);
+
+ opi->configured_io (_cur_inputs, _cur_outputs);
+
+ Gtk::Label* l = manage (new Label (
+ _("An Instrument plugin is already present.")
+ ));
+ tbl->attach (*l, 0, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+
+ l = manage (new Label (_("Replace"), ALIGN_END));
+ tbl->attach (*l, 0, 1, row, row + 1, EXPAND|FILL, SHRINK);
+
+ l = manage (new Label (string_compose ("'%1'", old->name ()), ALIGN_START));
+ tbl->attach (*l, 1, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+
+ l = manage (new Label (_("with"), ALIGN_END));
+ tbl->attach (*l, 0, 1, row, row + 1, EXPAND|FILL, SHRINK);
+
+ l = manage (new Label (string_compose ("'%1'", pi->name ()), ALIGN_START));
+ tbl->attach (*l, 1, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+
+ Box* box = manage (new HBox ());
+ box->set_border_width (2);
+ box->pack_start (_keep_mapping, true, true);
+ Frame* f = manage (new Frame ());
+ f->set_label (_("I/O Pin Mapping"));
+ f->add (*box);
+ tbl->attach (*f, 0, 1, row, row + 1, EXPAND|FILL, SHRINK, 0, 8);
+
+ _keep_mapping.signal_clicked.connect (sigc::mem_fun (*this, &PluginSetupDialog::apply_mapping));
+ add_button ("Replace", 2);
+ } else {
+
+ Gtk::Label *l = manage (new Label (string_compose (
+ _("Configure Plugin '%1'"), pi->name ()
+ )));
+ tbl->attach (*l, 0, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+ }
+
+ if (flags & Route::MultiOut) {
+ setup_output_presets ();
+ Box* box = manage (new HBox ());
+ box->set_border_width (2);
+ box->pack_start (_out_presets, true, true);
+ Frame* f = manage (new Frame ());
+ f->set_label (_("Output Configuration"));
+ f->add (*box);
+ tbl->attach (*f, 1, 2, row, row + 1, EXPAND|FILL, SHRINK, 0, 8);
+ } else {
+ _pi->set_preset_out (_pi->natural_output_streams ());
+ update_sensitivity (_pi->natural_output_streams ().n_audio ());
+ }
+
+ _keep_mapping.set_active (false);
+ apply_mapping ();
+
+ add_button (Stock::ADD, 0);
+ add_button (Stock::CANCEL, 1);
+ set_default_response (0);
+ show_all ();
+}
+
+
+void
+PluginSetupDialog::setup_output_presets ()
+{
+ // compare to PluginPinDialog::refill_output_presets ()
+ using namespace Menu_Helpers;
+ PluginOutputConfiguration ppc (_pi->plugin (0)->possible_output ());
+
+ _out_presets.AddMenuElem (MenuElem (_("Automatic"), sigc::bind (sigc::mem_fun (*this, &PluginSetupDialog::select_output_preset), 0)));
+
+ if (ppc.find (0) != ppc.end ()) {
+ // anyting goes
+ ppc.clear ();
+ ppc.insert (1);
+ ppc.insert (2);
+ ppc.insert (8);
+ ppc.insert (16);
+ ppc.insert (24);
+ ppc.insert (32);
+ if (ppc.find (_cur_outputs.n_audio ()) == ppc.end ()) {
+ ppc.insert (_cur_outputs.n_audio ());
+ }
+ }
+
+ bool have_matching_io = false;
+
+ for (PluginOutputConfiguration::const_iterator i = ppc.begin () ; i != ppc.end (); ++i) {
+ assert (*i > 0);
+ _out_presets.AddMenuElem (MenuElem (preset_label (*i), sigc::bind (sigc::mem_fun (*this, &PluginSetupDialog::select_output_preset), *i)));
+ if (*i == _cur_outputs.n_audio ()) {
+ have_matching_io = true;
+ }
+ }
+
+ if (have_matching_io) {
+ select_output_preset (_cur_outputs.n_audio ());
+ } else {
+ select_output_preset (0);
+ }
+}
+
+void
+PluginSetupDialog::select_output_preset (uint32_t n_audio)
+{
+ _pi->set_preset_out (ChanCount (DataType::AUDIO, n_audio));
+ _out_presets.set_text (preset_label (n_audio));
+ update_sensitivity (n_audio);
+}
+
+void
+PluginSetupDialog::update_sensitivity (uint32_t n_audio)
+{
+ if (_cur_outputs.n_audio () > 0 && _cur_outputs.n_audio () == n_audio) {
+ // TODO check _cur_inputs if not reconfigurable?
+ _keep_mapping.set_sensitive (true);
+ } else {
+ _keep_mapping.set_sensitive (false);
+ }
+}
+
+bool
+PluginSetupDialog::io_match () const
+{
+ if (_cur_outputs.n_audio () > 0 && _cur_outputs.n_audio () == _pi->preset_out ().n_audio ()) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void
+PluginSetupDialog::apply_mapping ()
+{
+ // toggle button
+ _keep_mapping.set_active (!_keep_mapping.get_active ());
+
+ boost::shared_ptr<Processor> old = _route->the_instrument ();
+ boost::shared_ptr<PluginInsert> opi = boost::dynamic_pointer_cast<PluginInsert> (old);
+
+ if (_keep_mapping.get_active () && opi && io_match ()) {
+ _pi->pre_seed (_cur_inputs, _cur_outputs, opi->input_map (0), opi->output_map (0), opi->thru_map ());
+ } else {
+ _pi->pre_seed (ChanCount (), ChanCount (), ChanMapping (), ChanMapping (), ChanMapping());
+ }
+}
+
+std::string
+PluginSetupDialog::preset_label (uint32_t n_audio) const
+{
+ std::string rv;
+ switch (n_audio) {
+ case 0:
+ rv = _("Automatic");
+ break;
+ case 1:
+ rv = _("Mono");
+ break;
+ case 2:
+ rv = _("Stereo");
+ break;
+ default:
+ rv = string_compose (P_("%1 Channel", "%1 Channels", n_audio), n_audio);
+ break;
+ }
+ return rv;
+}
diff --git a/gtk2_ardour/plugin_setup_dialog.h b/gtk2_ardour/plugin_setup_dialog.h
new file mode 100644
index 0000000..b2fc3e7
--- /dev/null
+++ b/gtk2_ardour/plugin_setup_dialog.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __gtkardour_plugin_setup_dialog_h__
+#define __gtkardour_plugin_setup_dialog_h__
+
+#include "ardour/plugin_insert.h"
+#include "ardour/route.h"
+
+#include "ardour_dropdown.h"
+#include "ardour_dialog.h"
+
+class PluginSetupDialog : public ArdourDialog
+{
+public:
+ PluginSetupDialog (boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::PluginInsert>, ARDOUR::Route::PluginSetupOptions);
+
+private:
+ void setup_output_presets ();
+ void update_sensitivity (uint32_t);
+ bool io_match () const;
+
+ void select_output_preset (uint32_t n_audio);
+ void apply_mapping ();
+
+ std::string preset_label (uint32_t) const;
+
+ boost::shared_ptr<ARDOUR::Route> _route;
+ boost::shared_ptr<ARDOUR::PluginInsert> _pi;
+
+ ArdourDropdown _out_presets;
+ ArdourButton _keep_mapping;
+ ARDOUR::ChanCount _cur_inputs;
+ ARDOUR::ChanCount _cur_outputs;
+};
+
+#endif
diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc
index 256a90d..19ea8eb 100644
--- a/gtk2_ardour/plugin_ui.cc
+++ b/gtk2_ardour/plugin_ui.cc
@@ -58,18 +58,20 @@
#endif
#include "ardour_window.h"
+#include "ardour_ui.h"
#include "prompter.h"
#include "plugin_ui.h"
#include "utils.h"
#include "gui_thread.h"
#include "public_editor.h"
+#include "processor_box.h"
#include "keyboard.h"
#include "latency_gui.h"
#include "plugin_eq_gui.h"
#include "new_plugin_preset_dialog.h"
#include "tooltips.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -177,7 +179,7 @@ PluginUIWindow::on_show ()
}
if (_pluginui) {
-#if defined (HAVE_AUDIOUNITS) && defined(GTKOSX)
+#if defined (HAVE_AUDIOUNITS) && defined(__APPLE__)
if (pre_deactivate_x >= 0) {
move (pre_deactivate_x, pre_deactivate_y);
}
@@ -192,7 +194,7 @@ PluginUIWindow::on_show ()
void
PluginUIWindow::on_hide ()
{
-#if defined (HAVE_AUDIOUNITS) && defined(GTKOSX)
+#if defined (HAVE_AUDIOUNITS) && defined(__APPLE__)
get_position (pre_deactivate_x, pre_deactivate_y);
#endif
@@ -292,7 +294,7 @@ PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PluginInsert>)
}
void
-#ifdef GTKOSX
+#ifdef __APPLE__
PluginUIWindow::app_activated (bool yn)
#else
PluginUIWindow::app_activated (bool)
@@ -361,27 +363,26 @@ PluginUIWindow::on_key_press_event (GdkEventKey* event)
}
}
return true;
- } else {
- /* for us to be getting key press events, there really
- MUST be a _pluginui, but just to be safe, check ...
- */
+ }
+ /* for us to be getting key press events, there really
+ MUST be a _pluginui, but just to be safe, check ...
+ */
- if (_pluginui) {
- _pluginui->grab_focus();
- if (_pluginui->non_gtk_gui()) {
- /* pass editor window as the window for the event
- to be handled in, not this one, because there are
- no widgets in this window that we want to have
- key focus.
- */
- return relay_key_press (event, &PublicEditor::instance());
- } else {
- return relay_key_press (event, this);
- }
+ if (_pluginui) {
+ _pluginui->grab_focus();
+ if (_pluginui->non_gtk_gui()) {
+ /* pass main window as the window for the event
+ to be handled in, not this one, because there are
+ no widgets in this window that we want to have
+ key focus.
+ */
+ return relay_key_press (event, &ARDOUR_UI::instance()->main_window());
} else {
- return false;
+ return relay_key_press (event, this);
}
}
+
+ return false;
}
bool
@@ -420,6 +421,7 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
, delete_button (_("Delete"))
, reset_button (_("Reset"))
, bypass_button (ArdourButton::led_default_elements)
+ , pin_management_button (_("Pin Connections...")) // TODO use a shorter label once the string-freeze is over.
, description_expander (_("Description"))
, plugin_analysis_expander (_("Plugin analysis"))
, latency_gui (0)
@@ -433,6 +435,9 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
set_tooltip (save_button, _("Save the current preset"));
set_tooltip (delete_button, _("Delete the current preset"));
set_tooltip (reset_button, _("Reset parameters to default (if no parameters are in automation play mode)"));
+#if 0 // string freeze is over
+ set_tooltip (pin_management_button, _("Show Plugin Pin Management Dialog"));
+#endif
set_tooltip (bypass_button, _("Disable signal processing by the plugin"));
_no_load_preset = 0;
@@ -451,12 +456,14 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
reset_button.set_name ("generic button");
reset_button.signal_clicked.connect (sigc::mem_fun (*this, &PlugUIBase::reset_plugin_parameters));
+ pin_management_button.set_name ("generic button");
+ pin_management_button.signal_clicked.connect (sigc::mem_fun (*this, &PlugUIBase::manage_pins));
insert->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&PlugUIBase::processor_active_changed, this, boost::weak_ptr<Processor>(insert)), gui_context());
bypass_button.set_name ("plugin bypass button");
bypass_button.set_text (_("Bypass"));
- bypass_button.set_active (!pi->active());
+ bypass_button.set_active (!pi->enabled ());
bypass_button.signal_button_release_event().connect (sigc::mem_fun(*this, &PlugUIBase::bypass_button_release), false);
focus_button.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
@@ -550,7 +557,7 @@ PlugUIBase::processor_active_changed (boost::weak_ptr<Processor> weak_p)
boost::shared_ptr<Processor> p (weak_p.lock());
if (p) {
- bypass_button.set_active (!p->active());
+ bypass_button.set_active (!p->enabled ());
}
}
@@ -561,7 +568,7 @@ PlugUIBase::preset_selected (Plugin::PresetRecord preset)
return;
}
if (!preset.label.empty()) {
- plugin->load_preset (preset);
+ insert->load_preset (preset);
} else {
// blank selected = no preset
plugin->clear_preset();
@@ -658,17 +665,24 @@ PlugUIBase::reset_plugin_parameters ()
insert->reset_parameters_to_default ();
}
+void
+PlugUIBase::manage_pins ()
+{
+ PluginPinWindowProxy* proxy = insert->pinmgr_proxy ();
+ if (proxy) {
+ proxy->get (true);
+ proxy->present ();
+ proxy->get ()->raise();
+ }
+}
+
bool
PlugUIBase::bypass_button_release (GdkEventButton*)
{
bool view_says_bypassed = (bypass_button.active_state() != 0);
- if (view_says_bypassed != insert->active()) {
- if (view_says_bypassed) {
- insert->activate ();
- } else {
- insert->deactivate ();
- }
+ if (view_says_bypassed != insert->enabled ()) {
+ insert->enable (view_says_bypassed);
}
return false;
@@ -714,7 +728,19 @@ PlugUIBase::toggle_description()
}
if (!description_expander.get_expanded()) {
+ const int child_height = description_expander.get_child ()->get_height ();
+
description_expander.remove();
+
+ Gtk::Window *toplevel = (Gtk::Window*) description_expander.get_ancestor (GTK_TYPE_WINDOW);
+
+ if (toplevel) {
+ Gtk::Requisition wr;
+ toplevel->get_size (wr.width, wr.height);
+ wr.height -= child_height;
+ toplevel->resize (wr.width, wr.height);
+ }
+
}
}
@@ -729,12 +755,6 @@ PlugUIBase::toggle_plugin_analysis()
eqgui = new PluginEqGui (insert);
}
- Gtk::Window *toplevel = (Gtk::Window*) plugin_analysis_expander.get_ancestor (GTK_TYPE_WINDOW);
-
- if (toplevel) {
- toplevel->get_size (pre_eq_size.width, pre_eq_size.height);
- }
-
plugin_analysis_expander.add (*eqgui);
plugin_analysis_expander.show_all ();
eqgui->start_listening ();
@@ -742,6 +762,7 @@ PlugUIBase::toggle_plugin_analysis()
if (!plugin_analysis_expander.get_expanded()) {
// Hide & remove from expander
+ const int child_height = plugin_analysis_expander.get_child ()->get_height ();
eqgui->hide ();
eqgui->stop_listening ();
@@ -750,7 +771,10 @@ PlugUIBase::toggle_plugin_analysis()
Gtk::Window *toplevel = (Gtk::Window*) plugin_analysis_expander.get_ancestor (GTK_TYPE_WINDOW);
if (toplevel) {
- toplevel->resize (pre_eq_size.width, pre_eq_size.height);
+ Gtk::Requisition wr;
+ toplevel->get_size (wr.width, wr.height);
+ wr.height -= child_height;
+ toplevel->resize (wr.width, wr.height);
}
}
}
diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h
index d2e5e21..046890a 100644
--- a/gtk2_ardour/plugin_ui.h
+++ b/gtk2_ardour/plugin_ui.h
@@ -42,7 +42,6 @@
#include <gtkmm/adjustment.h>
#include <gtkmm/togglebutton.h>
#include <gtkmm/socket.h>
-#include <gtkmm/comboboxtext.h>
#include <gtkmm/socket.h>
#include "ardour/types.h"
@@ -51,6 +50,7 @@
#include "ardour_button.h"
#include "ardour_dropdown.h"
+#include "ardour_spinner.h"
#include "ardour_window.h"
#include "automation_controller.h"
@@ -129,6 +129,8 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
ArdourButton reset_button;
/** a button to bypass the plugin */
ArdourButton bypass_button;
+ /** and self-explaining button :) */
+ ArdourButton pin_management_button;
/** a button to acquire keyboard focus */
Gtk::EventBox focus_button;
/** an expander containing the plugin description */
@@ -152,7 +154,6 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
ArdourWindow* latency_dialog;
PluginEqGui* eqgui;
- Gtk::Requisition pre_eq_size;
Gtk::Image* focus_out_image;
Gtk::Image* focus_in_image;
@@ -163,6 +164,7 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
void save_plugin_setting ();
void delete_plugin_setting ();
void reset_plugin_parameters ();
+ void manage_pins ();
bool focus_toggled(GdkEventButton*);
bool bypass_button_release(GdkEventButton*);
void toggle_description ();
@@ -194,17 +196,8 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
private:
Gtk::VBox main_contents;
-
Gtk::HBox settings_box;
Gtk::HBox hpacker;
-
- Gtk::Table button_table;
- Gtk::Table output_table;
-
- Gtk::ScrolledWindow scroller;
- Gtk::Adjustment hAdjustment;
- Gtk::Adjustment vAdjustment;
- Gtk::Viewport scroller_view;
Gtk::Menu* automation_menu;
gint prefheight;
@@ -229,11 +222,6 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
}
};
- static const int32_t initial_button_rows = 12;
- static const int32_t initial_button_cols = 1;
- static const int32_t initial_output_rows = 1;
- static const int32_t initial_output_cols = 4;
-
/* FIXME: Unify with AutomationController */
struct ControlUI : public Gtk::HBox {
@@ -244,16 +232,19 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
/* input */
- Gtk::ComboBoxText* combo;
boost::shared_ptr<ARDOUR::ScalePoints> scale_points;
- Gtk::ToggleButton* button;
boost::shared_ptr<AutomationController> controller;
- Gtkmm2ext::ClickBox* clickbox;
+
+ ArdourButton automate_button;
Gtk::Label label;
- bool update_pending;
- char ignore_change;
- Gtk::Button automate_button;
+ ArdourDropdown* combo;
+ Gtkmm2ext::ClickBox* clickbox;
Gtk::FileChooserButton* file_button;
+ ArdourSpinner* spin_box;
+
+ bool button;
+ bool update_pending;
+ bool ignore_change;
/* output */
@@ -266,26 +257,35 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
ControlUI (const Evoral::Parameter& param);
~ControlUI ();
+
+ /* layout */
+ Gtk::Table* knobtable;
+ int x0, x1, y0, y1;
};
- std::vector<ControlUI*> input_controls;
+ std::vector<ControlUI*> input_controls; // workaround for preset load
std::vector<ControlUI*> input_controls_with_automation;
std::vector<ControlUI*> output_controls;
+
sigc::connection screen_update_connection;
+
void output_update();
void build ();
+ void automatic_layout (const std::vector<ControlUI *>& control_uis);
+ void custom_layout (const std::vector<ControlUI *>& control_uis);
+
ControlUI* build_control_ui (const Evoral::Parameter& param,
const ARDOUR::ParameterDescriptor& desc,
boost::shared_ptr<ARDOUR::AutomationControl> mcontrol,
float value,
- bool is_input);
+ bool is_input,
+ bool use_knob = false);
void ui_parameter_changed (ControlUI* cui);
- void toggle_parameter_changed (ControlUI* cui);
void update_control_display (ControlUI* cui);
- void control_port_toggled (ControlUI* cui);
- void control_combo_changed (ControlUI* cui);
+ void update_input_displays (); // workaround for preset load
+ void control_combo_changed (ControlUI* cui, float value);
void astate_clicked (ControlUI*);
void automation_state_changed (ControlUI*);
@@ -297,12 +297,12 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
bool integer_printer (char* buf, Gtk::Adjustment &, ControlUI *);
bool midinote_printer(char* buf, Gtk::Adjustment &, ControlUI *);
- void set_property (const ARDOUR::ParameterDescriptor& desc,
- Gtk::FileChooserButton* widget);
- void property_changed (uint32_t key, const ARDOUR::Variant& value);
+ typedef std::map<uint32_t, Gtk::FileChooserButton*> FilePathControls;
+ FilePathControls _filepath_controls;
+ void set_path_property (const ARDOUR::ParameterDescriptor& desc,
+ Gtk::FileChooserButton* widget);
+ void path_property_changed (uint32_t key, const ARDOUR::Variant& value);
- typedef std::map<uint32_t, Gtk::FileChooserButton*> PropertyControls;
- PropertyControls _property_controls;
};
class PluginUIWindow : public ArdourWindow
diff --git a/gtk2_ardour/po/cs.mo b/gtk2_ardour/po/cs.mo
new file mode 100644
index 0000000..02ba552
Binary files /dev/null and b/gtk2_ardour/po/cs.mo differ
diff --git a/gtk2_ardour/po/cs.po b/gtk2_ardour/po/cs.po
index a4cebb1..be1c21d 100644
--- a/gtk2_ardour/po/cs.po
+++ b/gtk2_ardour/po/cs.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk-ardour 0.347.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-09 21:58+0100\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2016-01-17 20:46+0100\n"
"Last-Translator: Pavel Fric <pavelfric at seznam.cz>\n"
"Language-Team: Czech <kde-i18n-doc at kde.org>\n"
@@ -23,270 +23,286 @@ msgstr ""
"X-Poedit-SearchPath-0: gtk2_ardour\n"
#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:128
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:129
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:130
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:131
+#: about.cc:132
msgid "Hans Baier"
msgstr "Hans Baier"
-#: about.cc:132
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:133
+#: about.cc:134
msgid "Sakari Bergen"
msgstr "Sakari Bergen"
-#: about.cc:134
+#: about.cc:135
msgid "Christian Borss"
msgstr "Christian Borss"
-#: about.cc:135
+#: about.cc:136
msgid "Chris Cannam"
msgstr "Chris Cannam"
-#: about.cc:136
+#: about.cc:137
msgid "Jeremy Carter"
msgstr "Jeremy Carter"
-#: about.cc:137
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:138
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:139
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:140
+#: about.cc:141
msgid "André Colomb"
msgstr "André Colomb"
-#: about.cc:141
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:142
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:143
+#: about.cc:144
msgid "John Emmas"
msgstr "John Emmas"
-#: about.cc:144
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:145
+#: about.cc:146
msgid "Dave Flick"
msgstr "Dave Flick"
-#: about.cc:146
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:147
+#: about.cc:148
msgid "Robin Gareus"
msgstr "Robin Gareus"
-#: about.cc:148
+#: about.cc:149
msgid "Nil Geisweiller"
msgstr "Nil Geisweiller"
-#: about.cc:149
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:150
+#: about.cc:151
msgid "Chris Goddard"
msgstr "Chris Goddard"
-#: about.cc:151
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr "J. Abelardo Gutierrez"
-#: about.cc:152
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:153
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:154
+#: about.cc:155
msgid "David Halter"
msgstr "David Halter"
-#: about.cc:155
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:156
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr "Melvin Ray Herr"
-#: about.cc:157
+#: about.cc:158
msgid "Carl Hetherington"
msgstr "Carl Hetherington"
-#: about.cc:158
+#: about.cc:159
msgid "Rob Holland"
msgstr "Rob Holland"
-#: about.cc:159
+#: about.cc:160
msgid "Robert Jordens"
msgstr "Robert Jordens"
-#: about.cc:160
+#: about.cc:161
msgid "Stefan Kersten"
msgstr "Stefan Kersten"
-#: about.cc:161
+#: about.cc:162
msgid "Armand Klenk"
msgstr "Armand Klenk"
-#: about.cc:162
+#: about.cc:163
msgid "Julien de Kozak"
msgstr "Julien de Kozak"
-#: about.cc:163
+#: about.cc:164
msgid "Matt Krai"
msgstr "Matt Krai"
-#: about.cc:164
+#: about.cc:165
msgid "Georg Krause"
msgstr "Georg Krause"
-#: about.cc:165
+#: about.cc:166
msgid "Nick Lanham"
msgstr "Nick Lanham"
-#: about.cc:166
+#: about.cc:167
msgid "Colin Law"
msgstr "Colin Law"
-#: about.cc:167
+#: about.cc:168
msgid "Joshua Leach"
msgstr "Joshua Leach"
-#: about.cc:168
+#: about.cc:169
msgid "Ben Loftis"
msgstr "Ben Loftis"
-#: about.cc:169
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr "Nick Mainsbridge"
-#: about.cc:170
+#: about.cc:171
msgid "Tim Mayberry"
msgstr "Tim Mayberry"
-#: about.cc:171
+#: about.cc:172
msgid "Doug Mclain"
msgstr "Doug Mclain"
-#: about.cc:172
+#: about.cc:173
msgid "Todd Naugle"
msgstr "Todd Naugle"
-#: about.cc:173
+#: about.cc:174
msgid "André Nusser"
msgstr "André Nusser"
-#: about.cc:174
+#: about.cc:175
msgid "Bent Bisballe Nyeng"
msgstr "Bent Bisballe Nyeng"
-#: about.cc:175
+#: about.cc:176
msgid "Jack O'Quin"
msgstr "Jack O'Quin"
-#: about.cc:176
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr "Nimal Ratnayake"
-#: about.cc:177
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr "David Robillard"
-#: about.cc:178
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr "Taybin Rutkin"
-#: about.cc:179
+#: about.cc:183
msgid "Andreas Ruge"
msgstr "Andreas Ruge"
-#: about.cc:180
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr "Sampo Savolainen"
-#: about.cc:181
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr "Rodrigo Severo"
-#: about.cc:182
+#: about.cc:186
msgid "Per Sigmond"
msgstr "Per Sigmond"
-#: about.cc:183
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr "Lincoln Spiteri"
-#: about.cc:184
+#: about.cc:188
msgid "Mike Start"
msgstr "Mike Start"
-#: about.cc:185
+#: about.cc:189
msgid "Mark Stewart"
msgstr "Mark Stewart"
-#: about.cc:186
+#: about.cc:190
msgid "Roland Stigge"
msgstr "Roland Stigge"
-#: about.cc:187
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr "Petter Sundlöf"
-#: about.cc:188
+#: about.cc:192
msgid "Mike Täht"
msgstr "Mike Täht"
-#: about.cc:189
+#: about.cc:193
msgid "Roy Vegard"
msgstr "Roy Vegard"
-#: about.cc:190
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
-#: about.cc:191
+#: about.cc:195
msgid "Damien Zammit"
msgstr "Damien Zammit"
-#: about.cc:192
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr "Grygorii Zharun"
-#: about.cc:197
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -300,7 +316,7 @@ msgstr ""
"\tMartin Blanchard\n"
"\tRomain Arnaud <roming22 at gmail.com>\n"
-#: about.cc:198
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -320,7 +336,7 @@ msgstr ""
"\tRichard Oax <richard at pagliacciempire.de>\n"
"\tRobin Gloster <robin at loc-com.de>\n"
-#: about.cc:205
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -330,7 +346,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:206
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -338,7 +354,7 @@ msgstr ""
"Portugalština:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:207
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -348,7 +364,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:209
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -358,7 +374,7 @@ msgstr ""
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:210
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -368,7 +384,7 @@ msgstr ""
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-#: about.cc:212
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -376,7 +392,7 @@ msgstr ""
"ÅeÄtina:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:213
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -384,7 +400,7 @@ msgstr ""
"Švédština:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:214
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -392,7 +408,7 @@ msgstr ""
"Polština:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:215
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -400,7 +416,7 @@ msgstr ""
"ÄeÅ¡tina:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
-#: about.cc:216
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
@@ -408,7 +424,7 @@ msgstr ""
"Norština:\n"
"\t Eivind ÃdegÃ¥rd\n"
-#: about.cc:217
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -416,49 +432,50 @@ msgstr ""
"ÄÃnÅ¡tina:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-#: about.cc:597
+#: about.cc:601
msgid "Intel 64-bit"
msgstr "Intel 64-bitů"
-#: about.cc:599
+#: about.cc:603
msgid "Intel 32-bit"
msgstr "Intel 32-bitů"
-#: about.cc:601
+#: about.cc:605
msgid "PowerPC 64-bit"
msgstr "PowerPC 64-bitů"
-#: about.cc:603
+#: about.cc:607
msgid "PowerPC 32-bit"
msgstr "PowerPC 32-bitů"
-#: about.cc:605
+#: about.cc:609
msgid "64-bit"
msgstr "64-bitů"
-#: about.cc:607
+#: about.cc:611
msgid "32-bit"
msgstr "32-bitů"
-#: about.cc:615
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr "Autorské právo (C) 1999-2015 Paul Davis\n"
-#: about.cc:619
+#: about.cc:629
msgid "http://ardour.org/"
msgstr "http://www.ardour.org"
-#: about.cc:620
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-"%1%2\n"
-"(Sestaveno na základÄ revize %3)"
-"%4"
-#: about.cc:625
+#: about.cc:635
msgid "Config"
msgstr "NastavenÃ"
@@ -478,108 +495,131 @@ msgstr "%1 soubor s vymezenÃm nabÃdky nenalezen"
msgid "%1 will not work without a valid menu definition file"
msgstr "%1 nebude pracovat bez platného souboru vymezujÃcÃho nabÃdku"
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "PÅidat stopu nebo sbÄrnici"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "NastavenÃ:"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr "Režim nahrávánÃ:"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "Nástroj:"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "Zvukové stopy"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "Stopy MIDI"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "Zvukové a MIDI stopy"
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "SbÄrnice"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:554
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr "PrvnÃ"
-#: add_route_dialog.cc:84 add_route_dialog.cc:558
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
msgid "Before Selection"
msgstr "PÅed výbÄrem"
-#: add_route_dialog.cc:85 add_route_dialog.cc:556
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
msgid "After Selection"
msgstr "Po výbÄru"
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr "PoslednÃ"
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "PÅidat:"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>Volby</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:52
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "Název:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "Skupina:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr "Vložit:"
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:574 engine_dialog.cc:242 rc_option_editor.cc:2257
-#: rc_option_editor.cc:2259 rc_option_editor.cc:2261 rc_option_editor.cc:2279
-#: rc_option_editor.cc:2281 rc_option_editor.cc:2290 rc_option_editor.cc:2292
-#: rc_option_editor.cc:2310 rc_option_editor.cc:2323 rc_option_editor.cc:2326
-#: rc_option_editor.cc:2328 rc_option_editor.cc:2373 rc_option_editor.cc:2375
-#: rc_option_editor.cc:2377 rc_option_editor.cc:2385 rc_option_editor.cc:2393
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2403
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "Zvuk"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:110 engine_dialog.cc:244 missing_file_dialog.cc:60
-#: rc_option_editor.cc:2536 rc_option_editor.cc:2538 rc_option_editor.cc:2548
-#: rc_option_editor.cc:2557 rc_option_editor.cc:2565 rc_option_editor.cc:2573
-#: rc_option_editor.cc:2581 rc_option_editor.cc:2589 rc_option_editor.cc:2591
-#: rc_option_editor.cc:2599 rc_option_editor.cc:2601 rc_option_editor.cc:2609
-#: rc_option_editor.cc:2618 rc_option_editor.cc:2620 rc_option_editor.cc:2628
-#: rc_option_editor.cc:2636 rc_option_editor.cc:2645 rc_option_editor.cc:2654
-#: rc_option_editor.cc:2677
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr "Zvuk + MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "SbÄrnice"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -593,60 +633,61 @@ msgstr ""
"Pokud takový pÅÃdavný modul nemáte v úmyslu použÃvat, potom namÃsto toho "
"použijte normálnà zvukovou nebo MIDI stopu."
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:438
-#: editor_rulers.cc:250 time_axis_view.cc:1383
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Obvyklá"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "Nevrstvená"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Pásek"
-#: add_route_dialog.cc:431 monitor_section.cc:270
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Mono"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "Stereo"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 kanály"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 kanály"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "5 kanálů"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 kanálů"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 kanálů"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "12 kanálů"
-#: add_route_dialog.cc:483 mixer_strip.cc:1920 mixer_strip.cc:2365
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr "VlastnÃ"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "Nová skupina..."
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr "Žádná skupina"
@@ -676,68 +717,60 @@ msgstr ""
msgid "Done"
msgstr "Hotovo"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "Zdroj signálu"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Vybrané rozsahy"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Vybrané oblasti"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Typ zobrazenÃ"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "SlouÄené grafy pro každou stopu"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "SlouÄený grafy vÅ¡ech stop"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Ukázat kmitoÄtový výkonnostnà rozsah"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizovat hodnoty"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
+
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "Okno pro rozbor FFT"
-#: analysis_window.cc:60 editor.cc:1848
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr "Spektrálnà analýza (FFT rozbor)"
-#: analysis_window.cc:67 editor_actions.cc:143 session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Stopa"
-#: analysis_window.cc:68 editor_actions.cc:664 mixer_ui.cc:135
-#: mixer_ui.cc:2040
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "Ukázat"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Znovu zpracovat data"
-#: ardour_button.cc:820
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "TlaÄÃtko nemůže sledovat stav neexistujÃcÃho ovladatelného prvku\n"
-#: ardour_button.cc:1088
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: ardour_ui.cc:174
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
@@ -751,83 +784,130 @@ msgstr ""
"\n"
"(To bude vyžadovat opÄtovné spuÅ¡tÄnà %1.)"
-#: ardour_ui.cc:253 editor_actions.cc:658 region_editor.cc:53
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Poslech"
-#: ardour_ui.cc:254 editor_actions.cc:137 mixer_strip.cc:2115
-#: monitor_section.cc:326 rc_option_editor.cc:2413 route_time_axis.cc:255
-#: route_time_axis.cc:2748
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Sólo"
-#: ardour_ui.cc:255 rc_option_editor.cc:1356
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "ZpÄtná vazba"
-#: ardour_ui.cc:264 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Nastavenà reproduktoru"
-#: ardour_ui.cc:265 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Klávesové zkratky"
-
-#: ardour_ui.cc:266
-msgid "Preferences"
-msgstr "NastavenÃ"
-
-#: ardour_ui.cc:267 ardour_ui.cc:274
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr "PÅidat stopy/sbÄrnice"
-#: ardour_ui.cc:268
+#: ardour_ui.cc:298
msgid "About"
msgstr "O programu"
-#: ardour_ui.cc:269 location_ui.cc:1143 session_option_editor.cc:210
-#: session_option_editor.cc:216 session_option_editor.cc:223
-msgid "Locations"
-msgstr "MÃsta"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
-#: ardour_ui.cc:270 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "Stopy a sbÄrnice"
-#: ardour_ui.cc:271 engine_dialog.cc:73
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr "Nastavenà zvuku/MIDI"
-#: ardour_ui.cc:272
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr "Dialog pro vyvedenà obrazového záznamu"
-#: ardour_ui.cc:273
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "Vlastnosti"
-#: ardour_ui.cc:275 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "Správce balÃků"
-#: ardour_ui.cc:276 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Velký ukazatel Äasu"
-#: ardour_ui.cc:277
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr "Zvuková spojenÃ"
-#: ardour_ui.cc:278
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr "Spojenà MIDI"
-#: ardour_ui.cc:295
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Okno/SmÄÅ¡ovaÄ"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
"Soubory s vaÅ¡Ãm nastavenÃm byly zkopÃrovány. Nynà můžete %1 spustit znovu."
-#: ardour_ui.cc:527
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
@@ -837,7 +917,7 @@ msgstr ""
"\n"
"%1"
-#: ardour_ui.cc:529
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -848,7 +928,7 @@ msgstr ""
"protože %1 nebyl dostateÄnÄ rychlý. Zkuste zvukovou podpůrnou vrstvu\n"
"spustit znovu a sezenà uložte."
-#: ardour_ui.cc:553
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
@@ -856,39 +936,39 @@ msgstr ""
"Vyhledánà pÅÃdavného modulu Audio Unit se nezdaÅilo. Automatické hledánà AU "
"bylo vypnuto. Na dalšà podrobnosti se, prosÃm, podÃvejte v oknÄ se zápisem."
-#: ardour_ui.cc:554
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr "Vyhledánà pÅÃdavného modulu Audio Unit se nezdaÅilo."
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr "Server NSM se neohlásil"
-#: ardour_ui.cc:916
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr "NSM: Neposkytnuto žádné ID klienta"
-#: ardour_ui.cc:923
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr "NSM: NevytvoÅeno žádné sezenÃ"
-#: ardour_ui.cc:946
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr "NSM: Inicializace selhala"
-#: ardour_ui.cc:978
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr "VarovánÃ: volná zkuÅ¡ebnà verze"
-#: ardour_ui.cc:980
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr "PravidelnÄ dávejte penÃze a podpoÅte vývoj %1"
-#: ardour_ui.cc:981
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr "O tomto mi už vÃckrát neÅÃkat"
-#: ardour_ui.cc:983
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -906,15 +986,15 @@ msgstr ""
"\n"
"%4"
-#: ardour_ui.cc:984
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr "Toto je volná zkušebnà verze %1"
-#: ardour_ui.cc:985
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr "Nelze v nà uložit nebo nahrát žádné nastavenà pÅÃdavných modulů"
-#: ardour_ui.cc:986
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
@@ -922,7 +1002,7 @@ msgstr ""
"Pokud nahrajete stávajÃcà sezenà s nastavenÃm pÅÃdavných modulů,\n"
"nepoužijà se a budou ztraceny."
-#: ardour_ui.cc:988 plugin_ui.cc:579
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
@@ -930,19 +1010,19 @@ msgstr ""
"Pro zÃskánà plného pÅÃstupu k aktualizacÃm bez tÄchto omezenÃ\n"
"zvažte, že nás podpoÅÃte pravidelným pÅispÃvánÃm malou Äástkou každý mÄsÃc."
-#: ardour_ui.cc:998
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr "UkonÄit nynÃ"
-#: ardour_ui.cc:999
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr "PokraÄovat pomocà %1"
-#: ardour_ui.cc:1032 startup.cc:348
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 je pÅipraven pro použitÃ"
-#: ardour_ui.cc:1074
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -957,23 +1037,23 @@ msgstr ""
"Můžete se podÃvat na omezenà pro pamÄÅ¥ pomocà pÅÃkazu 'ulimit -l', a obvykle "
"můžete toto nastavenà zmÄnit %2."
-#: ardour_ui.cc:1091
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "Neukazovat toto okno s hlášenÃm znovu"
-#: ardour_ui.cc:1135
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "NeukonÄit"
-#: ardour_ui.cc:1136
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr "Pouze ukonÄit"
-#: ardour_ui.cc:1137 ardour_ui.cc:5009
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "Uložit a ukonÄit"
-#: ardour_ui.cc:1147
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -987,11 +1067,11 @@ msgstr ""
"\n"
"\"Pouze ukonÄit\"."
-#: ardour_ui.cc:1197
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr "Neuložené sezenÃ"
-#: ardour_ui.cc:1218
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -1009,7 +1089,7 @@ msgstr ""
"\n"
"Co chcete dÄlat?"
-#: ardour_ui.cc:1221
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -1027,107 +1107,108 @@ msgstr ""
"\n"
"Co chcete dÄlat?"
-#: ardour_ui.cc:1235
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Otázka"
-#: ardour_ui.cc:1349 ardour_ui.cc:1357
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr "Zvuk: <span foreground=\"red\">žádný</span>"
-#: ardour_ui.cc:1361
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr "Zvuk: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1365
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr "Zvuk: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1383 export_video_dialog.cc:76
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "Soubor:"
-#: ardour_ui.cc:1387
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1390
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1393
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1396 session_option_editor.cc:202
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1399
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1402
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1405 session_option_editor.cc:203
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1408
+#: ardour_ui.cc:1518
msgid "RF64/WAV"
msgstr "RF64/WAV"
-#: ardour_ui.cc:1411
+#: ardour_ui.cc:1521
msgid "MBWF"
msgstr "MBWF"
-#: ardour_ui.cc:1419
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr "32-float"
-#: ardour_ui.cc:1422
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr "24-int"
-#: ardour_ui.cc:1425
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr "16-int"
-#: ardour_ui.cc:1446
+#: ardour_ui.cc:1556
#, c-format
msgid "X: <span foreground=\"%s\">>10K</span>"
msgstr "X: <span foreground=\"%s\">>10K</span>"
-#: ardour_ui.cc:1448
+#: ardour_ui.cc:1558
#, c-format
msgid "X: <span foreground=\"%s\">%u</span>"
msgstr "X: <span foreground=\"%s\">%u</span>"
-#: ardour_ui.cc:1451
+#: ardour_ui.cc:1561
#, c-format
msgid "X: <span foreground=\"%s\">?</span>"
msgstr "X: <span foreground=\"%s\">?</span>"
-#: ardour_ui.cc:1454
+#: ardour_ui.cc:1564
msgid "Audio dropouts. Shift+click to reset"
msgstr "PÅeruÅ¡enà záznamu zvuku. Shift-klepnutà pro vynulovánÃ"
-#: ardour_ui.cc:1467
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr ""
"Digitálnà zpracovánà signálu (DSP): <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1477
+#: ardour_ui.cc:1587
#, c-format
msgid "PkBld: <span foreground=\"%s\">%d</span>"
msgstr "PkBld: <span foreground=\"%s\">%d</span>"
-#: ardour_ui.cc:1499
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1138,29 +1219,29 @@ msgstr ""
"\">%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground="
"\"%s\">%<PRIu32>%%</span>"
-#: ardour_ui.cc:1540
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Disk: <span foreground=\"green\">Neznámý</span>"
-#: ardour_ui.cc:1542
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Disk: <span foreground=\"green\">24 hodin +</span>"
-#: ardour_ui.cc:1560
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "Disk: <span foreground=\"green\">>24 hodin</span>"
-#: ardour_ui.cc:1571
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-#: ardour_ui.cc:1597
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "Äasový kód|ÄK: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1675
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
@@ -1168,55 +1249,61 @@ msgstr ""
"%1 nenà spojen s žádnou podpůrnou vrstvou.\n"
"Za tohoto stavu nenà možné otevÅÃt nebo zavÅÃt sezenÃ."
-#: ardour_ui.cc:1693
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "OtevÅÃt sezenÃ"
-#: ardour_ui.cc:1717 session_dialog.cc:407 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "%1 sezenÃ"
-#: ardour_ui.cc:1748
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr "Stopy můžete pÅidat až teprve tehdy, když bylo sezenà nahráno."
-#: ardour_ui.cc:1756
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "NepodaÅilo se vytvoÅit %1 novou smÃchanou stopu"
msgstr[1] "NepodaÅilo se vytvoÅit %1 nové smÃchané stopy"
-#: ardour_ui.cc:1762 ardour_ui.cc:1823
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Je zde nedostateÄný poÄet dostupných pÅÃpojek na to,\n"
-"aby se dala vytvoÅit nová stopa nebo sbÄrnice.\n"
-"MÄl byste uložit %1, ukonÄit Ardour\n"
-"a spustit znovu s vÄtÅ¡Ãm poÄtem pÅÃpojek."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
-#: ardour_ui.cc:1797
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
"Stopy nebo sbÄrnice můžete pÅidat až teprve tehdy, když bylo sezenà nahráno."
-#: ardour_ui.cc:1806
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "Nelze vytvoÅit %1 novou zvukovou stopu"
msgstr[1] "Nelze vytvoÅit %1 nové zvukové stopy"
-#: ardour_ui.cc:1815
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "NepodaÅilo se vytvoÅit %1 novou zvukovou sbÄrnici"
msgstr[1] "NepodaÅilo se vytvoÅit %1 nové zvukové sbÄrnice"
-#: ardour_ui.cc:1968
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Je zde nedostateÄný poÄet dostupných pÅÃpojek na to,\n"
+"aby se dala vytvoÅit nová stopa nebo sbÄrnice.\n"
+"MÄl byste uložit %1, ukonÄit Ardour\n"
+"a spustit znovu s vÄtÅ¡Ãm poÄtem pÅÃpojek."
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1224,20 +1311,20 @@ msgstr ""
"VytvoÅte, prosÃm, jednu nebo i vÃce stop, pÅedtÃm než se pokusÃte nahrávat.\n"
"Můžete to udÄlat volbou \"PÅidat stopu nebo sbÄrnici\" v nabÃdce pro sezenÃ."
-#: ardour_ui.cc:2359
+#: ardour_ui.cc:2565
#, c-format
msgid "Copied %<PRId64> of %<PRId64>"
msgstr "ZkopÃrováno %<PRId64> z %<PRId64>"
-#: ardour_ui.cc:2413 save_as_dialog.cc:33
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
msgid "Save As"
msgstr "Uložit jako"
-#: ardour_ui.cc:2441
+#: ardour_ui.cc:2647
msgid "Save As failed: %1"
msgstr "NepodaÅilo se uložit jako: %1"
-#: ardour_ui.cc:2463
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1245,35 +1332,35 @@ msgstr ""
"Pro zajiÅ¡tÄnà sluÄitelnosti s různými systémy\n"
"nesmà názvy snÃmků obrazovky obsahovat znak '%1'"
-#: ardour_ui.cc:2477
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "Potvrdit pÅepsánà snÃmku obrazovky"
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2699
msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr "SnÃmek obrazovky s tÃmto názvem již existuje. Chcete jej pÅepsat?"
-#: ardour_ui.cc:2503
-msgid "Save as..."
-msgstr "Uložit jako..."
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
-#: ardour_ui.cc:2504 ardour_ui.cc:2555
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
msgid "New session name"
msgstr "Nový název sezenÃ:"
-#: ardour_ui.cc:2506
+#: ardour_ui.cc:2727
msgid "Take Snapshot"
msgstr "UdÄlat snÃmek"
-#: ardour_ui.cc:2507
+#: ardour_ui.cc:2728
msgid "Name of new snapshot"
msgstr "Název pro nový snÃmek"
-#: ardour_ui.cc:2554
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "PÅejmenovat sezenÃ"
-#: ardour_ui.cc:2569 ardour_ui.cc:3048 ardour_ui.cc:3086
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1281,13 +1368,13 @@ msgstr ""
"Pro zajiÅ¡tÄnà sluÄitelnosti s různými systémy\n"
"nesmà názvy sezenà obsahovat znak '%1'"
-#: ardour_ui.cc:2577
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
"Tento název se již použÃvá jiným adresáÅem/složkou. Zkuste to, prosÃm, znovu."
-#: ardour_ui.cc:2586
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1295,27 +1382,27 @@ msgstr ""
"PÅejmenovánà tohoto sezenà se nezdaÅilo.\n"
"VÄci by v tuto chvÃli mohly být vážnÄ zvorané"
-#: ardour_ui.cc:2702 route_ui.cc:1871
+#: ardour_ui.cc:2923 route_ui.cc:1867
msgid "Confirm Template Overwrite"
msgstr "Potvrdit pÅepsánà pÅedlohy"
-#: ardour_ui.cc:2703 route_ui.cc:1872
+#: ardour_ui.cc:2924 route_ui.cc:1868
msgid "A template already exists with that name. Do you want to overwrite it?"
msgstr "PÅedloha s tÃmto názvem již existuje. Chcete ji pÅepsat?"
-#: ardour_ui.cc:2727
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr "Uložit pÅedlohu"
-#: ardour_ui.cc:2728
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "Název pro pÅedlohu:"
-#: ardour_ui.cc:2729
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-pÅedloha"
-#: ardour_ui.cc:2766
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1325,39 +1412,39 @@ msgstr ""
"%1\n"
"již existuje. Chcete jej otevÅÃt?"
-#: ardour_ui.cc:2776
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "OtevÅÃt stávajÃcà sezenÃ"
-#: ardour_ui.cc:3076
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "V \"%1\" nenà žádné sezenÃ"
-#: ardour_ui.cc:3170
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "PoÄkejte, prosÃm, dokud %1 nenahraje vaÅ¡e sezenÃ"
-#: ardour_ui.cc:3185
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "Chyba v zápisu pÅÃpojky"
-#: ardour_ui.cc:3186
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr "KlepnÄte na tlaÄÃtko ZavÅÃt, abyste to mohli zkusit znovu."
-#: ardour_ui.cc:3205
+#: ardour_ui.cc:3426
msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
msgstr "Projekt \"%1 (snÃmek %2)\" nebyl úspÄÅ¡nÄ nahrán.: %3"
-#: ardour_ui.cc:3211 ardour_ui.cc:3232 ardour_ui.cc:3329 ardour_ui.cc:3338
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "Chyba pÅi nahrávánÃ"
-#: ardour_ui.cc:3226
+#: ardour_ui.cc:3447
msgid "Session \"%1 (snapshot %2)\" did not load successfully"
msgstr "Projekt \"%1 (snÃmek %2)\" nebyl úspÄÅ¡nÄ nahrán."
-#: ardour_ui.cc:3254
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
@@ -1367,19 +1454,19 @@ msgstr ""
"\n"
"Nebudete moci nahrávat nebo ukládat."
-#: ardour_ui.cc:3259
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr "Sezenà pouze pro ÄtenÃ"
-#: ardour_ui.cc:3328
+#: ardour_ui.cc:3547
msgid "Could not create session in \"%1\": %2"
msgstr "NepodaÅilo se vytvoÅit sezenà v \"%1\": %2"
-#: ardour_ui.cc:3337
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "NepodaÅilo se vytvoÅit sezenà v \"%1\""
-#: ardour_ui.cc:3377
+#: ardour_ui.cc:3601
msgid ""
"<b>Just ask and wait for an answer.\n"
"It may take from minutes to hours.</b>"
@@ -1387,12 +1474,11 @@ msgstr ""
"<b>ProstÄ se zeptejte a poÄkejte na odpovÄÄ.\n"
"Může to zabrat minuty ale také hodiny.</b>"
-#: ardour_ui.cc:3379
+#: ardour_ui.cc:3603
msgid "About the Chat"
msgstr "O vedenà rozhovoru"
-#: ardour_ui.cc:3380
-#, fuzzy
+#: ardour_ui.cc:3604
msgid ""
"When you're inside the chat just ask your question and wait for an answer. "
"The chat is occupied by real people with real lives so many of them are "
@@ -1404,16 +1490,16 @@ msgid ""
"someone has answered your question."
msgstr ""
-#: ardour_ui.cc:3499
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "Pro udÄlánà poÅádku nebyly pÅipraveny žádné soubory"
-#: ardour_ui.cc:3503 ardour_ui.cc:3513 ardour_ui.cc:3646 ardour_ui.cc:3653
-#: ardour_ui_ed.cc:104
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "UdÄlat poÅádek"
-#: ardour_ui.cc:3504
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1425,19 +1511,19 @@ msgstr ""
"jsou pravdÄpodobnÄ zaÄlenÄny jeÅ¡tÄ v nÄjakém\n"
"starÅ¡Ãm snÃmku obrazovky jako oblasti."
-#: ardour_ui.cc:3563
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "kilo"
-#: ardour_ui.cc:3566
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "mega"
-#: ardour_ui.cc:3569
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "giga"
-#: ardour_ui.cc:3574
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1451,7 +1537,7 @@ msgstr[1] ""
"NásledujÃcà soubor byl smazán z %2,\n"
"a tÃm se na disku uvolnilo %3 %4 bajtů ukládacÃho prostoru"
-#: ardour_ui.cc:3581
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1489,11 +1575,11 @@ msgstr[1] ""
"\n"
"uvolnà se na disku dalÅ¡Ãch %3 %4 bajtů ukládacÃho prostoru.\n"
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "Jste si jistý, že chcete udÄlat poÅádek?"
-#: ardour_ui.cc:3648
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1505,46 +1591,70 @@ msgstr ""
"Po udÄlánà poÅádku budou vÅ¡echny nepoužÃvané a tudÞ nepotÅebné zvukové "
"soubory pÅesunuty do \"mrtvého\" umÃstÄnÃ."
-#: ardour_ui.cc:3656
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Dialog vÄnovaný dÄlánà poÅádku"
-#: ardour_ui.cc:3686
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr "Uklizené soubory"
-#: ardour_ui.cc:3703
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "smazané soubory"
-#: ardour_ui.cc:3896
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr "Videoserver nebyl spuÅ¡tÄn %1. Požadavek na jeho zastavenà se pÅehlÞÃ."
-#: ardour_ui.cc:3900
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr "Zastavit videoserver"
-#: ardour_ui.cc:3901
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr "Opravdu chcete zastavit videoserver?"
-#: ardour_ui.cc:3904
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr "Ano, zastavit"
-#: ardour_ui.cc:3930
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr "Videoserver je již spuÅ¡tÄn."
-#: ardour_ui.cc:3932
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
"VnÄjšà videoserver je nastaven a je dosažitelný. NespouÅ¡tà se nová instance."
-#: ardour_ui.cc:3940 ardour_ui.cc:4045
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
@@ -1552,48 +1662,48 @@ msgstr ""
"NepodaÅilo se pÅipojit k videoserveru. SpusÅ¥te jej nebo nastavte adresu pro "
"pÅÃstup k nÄmu v NastavenÃ."
-#: ardour_ui.cc:3970
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr "Zadaný koÅen dokumentu (docroot) nenà existujÃcÃm adresáÅem."
-#: ardour_ui.cc:3976 ardour_ui.cc:3982
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr "Daný videoserver nenà spustitelným souborem."
-#: ardour_ui.cc:4016
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr "Nelze spustit videoserver"
-#: ardour_ui.cc:4026
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr "Videoserver byl spuÅ¡tÄn, ale neodpovÃdá na požadavky..."
-#: ardour_ui.cc:4071 editor_audio_import.cc:644
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "\"%\" nelze otevÅÃt"
-#: ardour_ui.cc:4075
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr "Nebyl vybrán žádný videosoubor"
-#: ardour_ui.cc:4171
+#: ardour_ui.cc:4472
msgid "No LTC detected, video will not be aligned."
msgstr "Nebyl zjiÅ¡tÄn žádný LTC. Obrazový záznam nebude zarovnán."
-#: ardour_ui.cc:4177
+#: ardour_ui.cc:4478
msgid "Align video-start to %1 [samples]"
msgstr "Zarovnat zaÄátek obrazového záznamu na %1 [samples]"
-#: ardour_ui.cc:4311
+#: ardour_ui.cc:4654
msgid "xrun"
msgstr "xrun"
-#: ardour_ui.cc:4320
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr ""
"Nahrávánà bylo zastaveno, protože tomu nedostaÄovala rychlost vaÅ¡eho systému."
-#: ardour_ui.cc:4349
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1607,23 +1717,23 @@ msgstr ""
"PÅesnÄji ÅeÄeno nebylo možné dostateÄnÄ rychle zapisovat data\n"
"tak, aby se podaÅilo udržet krok s nahrávánÃm.\n"
-#: ardour_ui.cc:4422
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr "Hledajà se pÅÃdavné moduly"
-#: ardour_ui.cc:4424
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr "ZruÅ¡it hledánà pÅÃdavných modulů"
-#: ardour_ui.cc:4433
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr "Äasový limit pro zastavenÃ"
-#: ardour_ui.cc:4440
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr "Äasový limit pro hledánÃ"
-#: ardour_ui.cc:4484
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1637,11 +1747,11 @@ msgstr ""
"PÅesnÄji ÅeÄeno nebylo možné dostateÄnÄ rychle ÄÃst data\n"
"tak, aby se podaÅilo udržet krok s pÅehrávánÃm.\n"
-#: ardour_ui.cc:4524
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "Obnovenà po havárii"
-#: ardour_ui.cc:4525
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1659,19 +1769,19 @@ msgstr ""
"zvuková data, nebo je odmÃtnout.\n"
"RozhodnÄte se, prosÃm, jak chcete dále pokraÄovat.\n"
-#: ardour_ui.cc:4537
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "OdmÃtnout data"
-#: ardour_ui.cc:4538
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Obnovit data"
-#: ardour_ui.cc:4558
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "Vzorkovacà kmitoÄet neodpovÃdá"
-#: ardour_ui.cc:4559
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1681,15 +1791,24 @@ msgstr ""
"%2 nynà bÄžà na %3 Hz. Pokud toto sezenà nahrajete,\n"
"je možné, že zvuk bude pÅehráván pÅi nesprávném vzorkovacÃm kmitoÄtu.\n"
-#: ardour_ui.cc:4568
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "Projekt nenahrávat"
-#: ardour_ui.cc:4569
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "Projekt pÅesto nahrát"
-#: ardour_ui.cc:4861
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1701,99 +1820,79 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-"%4 Toto je sezenà ze staršà verze %3%5\n"
-"\n"
-"%3 zkopÃroval soubor se starým sezenÃm\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"do\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"Od nynÄjÅ¡ka použÃvejte verzi -2000 starÅ¡Ãmi verzemif %3"
-#: ardour_ui.cc:4978
+#: ardour_ui.cc:5331
msgid "This is a free/demo copy of %1. It has just switched to silent mode."
msgstr "Toto je volná/ukázková verze %1. PrávÄ se pÅepnula do tichého režimu."
-#: ardour_ui.cc:4984
+#: ardour_ui.cc:5337
msgid "%1 is now silent"
msgstr "%1 je nynà nÄmá"
-#: ardour_ui.cc:4986
+#: ardour_ui.cc:5339
msgid ""
"Please consider paying for a copy of %1 - you can pay whatever you want."
msgstr ""
"Zvažte, prosÃm, že za kopii poskytnete penÄžitý pÅÃspÄvek %1 - v libovolné "
"výši."
-#: ardour_ui.cc:4987
+#: ardour_ui.cc:5340
msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
msgstr ""
"JeÅ¡tÄ lepšà by bylo, kdybyste se stal pravidelným pÅispÄvatelem - "
-"podporovatelem. "
-"PÅedplatné zaÄÃná na US$1 na mÄsÃc."
+"podporovatelem. PÅedplatné zaÄÃná na US$1 na mÄsÃc."
-#: ardour_ui.cc:4988
+#: ardour_ui.cc:5341
msgid "Pay for a copy (via the web)"
msgstr "Zaplatit za kopii (pÅes internet)"
-#: ardour_ui.cc:4989
+#: ardour_ui.cc:5342
msgid "Become a subscriber (via the web)"
msgstr "Stát se pravidelným pÅispÄvatelem (pÅes internet)"
-#: ardour_ui.cc:5008
+#: ardour_ui.cc:5361
msgid "Remain silent"
msgstr "Zůstat v tichosti"
-#: ardour_ui.cc:5010
+#: ardour_ui.cc:5363
msgid "Give me more time"
msgstr "ChtÄl bych mÃt vÃc Äasu"
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Uživatelské rozhranÃ: Nelze nastavit editor"
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Uživatelské rozhranÃ: Nelze nastavit smÄÅ¡ovaÄ"
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "Uživatelské rozhranÃ: Nelze nastavit mÄÅÃcà můstek"
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "PÅehrávat od ukazatele polohy pÅehrávánÃ"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Zastavit pÅehrávánÃ"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "Spustit nahrávánÃ"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "PÅehrávat rozsah/výbÄr"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "PÅejÃt na zaÄátek sezenÃ"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "PÅejÃt na konec sezenÃ"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "PÅehrávat rozsah smyÄky"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
@@ -1801,23 +1900,23 @@ msgstr ""
"Nouzové zastavenà MIDI\n"
"Poslat nota vypnuta a nastavit znovu zprávy ovladaÄe na vÅ¡ech kanálech MIDI"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "PÅi zastavenà se vrátit na zaÄátek poslednÃho pÅehrávánÃ"
-#: ardour_ui2.cc:137
+#: ardour_ui2.cc:88
msgid "Playhead follows range selections and edits"
msgstr "Ukazatel polohy následuje výbÄry rozsahu a úpravy"
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Spustit automatické sledovánà vstupu"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Povolit/Zakázat slyÅ¡itelné klapnutÃ"
-#: ardour_ui2.cc:140 monitor_section.cc:125
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1825,7 +1924,7 @@ msgstr ""
"Když je zapnuto, je nÄkterá ze stop pÅehrávána sólovÄ.\n"
"Pro vypnutà sóla klepnÄte."
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
"When active, auditioning is taking place.\n"
"Click to stop the audition"
@@ -1833,11 +1932,11 @@ msgstr ""
"Když je zapnuto, koná se zkušebnà výstup.\n"
"KlepnutÃm se zkuÅ¡ebnà výstup zastavÃ."
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr "Když je zapnuto, hraje se ve smyÄce se zpÄtnou vazbou."
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1851,7 +1950,7 @@ msgstr ""
"potvrdit; úpravy pÅipojit '+' nebo '-' pro zadánà Äasů delta (nárůst "
"promÄnné).\n"
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1865,44 +1964,50 @@ msgstr ""
"potvrdit; úpravy pÅipojit '+' nebo '-' pro zadánà Äasů delta (nárůst "
"promÄnné).\n"
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr "Nastavit vÅ¡echny ukazatele nejvyššÃch hodnot znovu"
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr "Ukázat zápis chyb a potvrdit varovánÃ"
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[CHYBA]:"
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[VAROVÃNÃ]:"
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[INFORMACE]: "
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:430
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Automatický návrat"
-#: ardour_ui2.cc:257 ardour_ui_ed.cc:433
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "Následovat úpravy"
-#: ardour_ui2.cc:704 rc_option_editor.cc:2895
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr "RozhranÃ"
-#: ardour_ui2.cc:721 rc_option_editor.cc:1734 rc_option_editor.cc:1752
-#: rc_option_editor.cc:1755 rc_option_editor.cc:1757 rc_option_editor.cc:1759
-#: rc_option_editor.cc:1767 rc_option_editor.cc:1769 rc_option_editor.cc:1777
-#: rc_option_editor.cc:1785 rc_option_editor.cc:1792 rc_option_editor.cc:1801
-#: rc_option_editor.cc:1803 rc_option_editor.cc:1805 rc_option_editor.cc:1813
-#: rc_option_editor.cc:1815 rc_option_editor.cc:1824
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
#: session_option_editor.cc:342 session_option_editor.cc:344
#: session_option_editor.cc:365 session_option_editor.cc:367
#: session_option_editor.cc:369 session_option_editor.cc:376
@@ -1910,444 +2015,508 @@ msgstr "RozhranÃ"
msgid "Misc"
msgstr "Různé"
-#: ardour_ui_dependents.cc:77
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Nachystat editor"
-#: ardour_ui_dependents.cc:79
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Nachystat smÄÅ¡ovaÄ"
-#: ardour_ui_dependents.cc:85
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Znovu nahrát průbÄh sezenÃ"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Uživatelské rozhranÃ: Nelze nastavit editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Uživatelské rozhranÃ: Nelze nastavit smÄÅ¡ovaÄ"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "Uživatelské rozhranÃ: Nelze nastavit mÄÅÃcà můstek"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "NastavenÃ"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "SmÄÅ¡ovaÄ"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr "NezavÃrat"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "Pouze zavÅÃt"
-#: ardour_ui_dialogs.cc:253
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "Uložit a zavÅÃt"
-#: ardour_ui_dialogs.cc:363
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-"Tato obrazovka nenà dostateÄnÄ velká na to, aby zobrazila okno smÄÅ¡ovaÄe"
-#: ardour_ui_ed.cc:103
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Projekt"
-#: ardour_ui_ed.cc:106 editor_actions.cc:139 editor_regions.cc:119
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "SeÅÃdit"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Volby"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Okno"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "NápovÄda"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Různé klávesové zkratky"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Formát zvukových souborů"
-#: ardour_ui_ed.cc:112
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Typ souboru"
-#: ardour_ui_ed.cc:113 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Vzorkovacà formát"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:2705 rc_option_editor.cc:2717
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Ovládacà prvky"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2375 rc_option_editor.cc:2723
-#: rc_option_editor.cc:2725 rc_option_editor.cc:2735 rc_option_editor.cc:2742
-#: rc_option_editor.cc:2750 rc_option_editor.cc:2762 rc_option_editor.cc:2767
-#: rc_option_editor.cc:2769 rc_option_editor.cc:2774 rc_option_editor.cc:2781
-#: rc_option_editor.cc:2786 rc_option_editor.cc:2795 rc_option_editor.cc:2799
-#: rc_option_editor.cc:2808 rc_option_editor.cc:2816 rc_option_editor.cc:2820
-#: rc_option_editor.cc:2825 rc_option_editor.cc:2832 rc_option_editor.cc:2833
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "PÅÃdavné moduly"
-#: ardour_ui_ed.cc:116 rc_option_editor.cc:2969
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "Ukazatel hladiny"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "MÃra poklesu"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Äas udrženÃ"
-#: ardour_ui_ed.cc:119
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "Zacházenàs neobvyklými vzorky "
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1694
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "Nový..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "OtevÅÃt..."
-#: ardour_ui_ed.cc:126
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Naposledy použité..."
-#: ardour_ui_ed.cc:127 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "ZavÅÃt"
-#: ardour_ui_ed.cc:130
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "PÅidat stopu nebo sbÄrnici..."
-#: ardour_ui_ed.cc:135
+#: ardour_ui_ed.cc:163
msgid "Duplicate Tracks/Busses..."
msgstr "Zdvojit stopy/sbÄrnice..."
-#: ardour_ui_ed.cc:141
+#: ardour_ui_ed.cc:169
msgid "Cancel Solo"
msgstr "Zrušit sólo"
-#: ardour_ui_ed.cc:146
-msgid "Open Video"
-msgstr "OtevÅÃt obrazový záznam"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
-#: ardour_ui_ed.cc:149
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr "Odstranit obrazový záznam"
-#: ardour_ui_ed.cc:152
-msgid "Export to Video File"
-msgstr "Vyvést jako soubor s obrazovým záznamem"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:194
msgid "Snapshot (& keep working on current version) ..."
msgstr "SnÃmek (&pracovat dál na nynÄjšà verzi)..."
-#: ardour_ui_ed.cc:160
+#: ardour_ui_ed.cc:197
msgid "Snapshot (& switch to new version) ..."
msgstr "SnÃmek (&pÅepnout na novou verzi)..."
-#: ardour_ui_ed.cc:164
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "Uložit jako..."
-#: ardour_ui_ed.cc:168 editor_actions.cc:1790 editor_markers.cc:903
-#: editor_snapshots.cc:136 mixer_strip.cc:1580 route_time_axis.cc:1690
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr "PÅejmenovat..."
-#: ardour_ui_ed.cc:172
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Uložit jako pÅedlohu..."
-#: ardour_ui_ed.cc:175
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "Popisná data"
-#: ardour_ui_ed.cc:178
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "Upravit popisná data..."
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "Zavést popisná data..."
-#: ardour_ui_ed.cc:184
+#: ardour_ui_ed.cc:226
msgid "Export to Audio File(s)..."
msgstr "Vyvést jako zvukový soubor(y)..."
-#: ardour_ui_ed.cc:187
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "Vyvést vybranou stopu jako jeden soubor..."
-#: ardour_ui_ed.cc:190 editor_export_audio.cc:66
-#: export_channel_selector.cc:190 export_channel_selector.cc:576
-#: export_dialog.cc:129 export_video_dialog.cc:80
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "Vyvést"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "Odstranit nepoužÃvané zdroje..."
-#: ardour_ui_ed.cc:197
+#: ardour_ui_ed.cc:239
msgid "Reset Peak Files"
msgstr "Vynulovat soubory s nejvyššÃmi hodnotami"
-#: ardour_ui_ed.cc:201
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "Vyprázdnit koš"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "UkonÄit"
-#: ardour_ui_ed.cc:209 automation_time_axis.cc:543 editor_actions.cc:661
-#: editor_markers.cc:902 location_ui.cc:59 plugin_selector.cc:97
-#: route_time_axis.cc:866
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
msgid "Hide"
msgstr "Skrýt"
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "ZvÄtÅ¡it okno editoru"
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr "ZvÄtÅ¡it prostor smÄÅ¡ovaÄe"
-#: ardour_ui_ed.cc:215
-msgid "Show Toolbars"
-msgstr "Ukázat nástrojové panely"
-
-#: ardour_ui_ed.cc:218
+#: ardour_ui_ed.cc:298
msgid "Toggle Mixer List"
msgstr "PÅepnout seznam smÄÅ¡ovaÄů"
-#: ardour_ui_ed.cc:221
+#: ardour_ui_ed.cc:301
msgid "Toggle Monitor Section Visibility"
msgstr "PÅepnout viditelnost sledovacÃho úseku"
-#: ardour_ui_ed.cc:225
+#: ardour_ui_ed.cc:305
msgid "Show more UI preferences"
msgstr "Ukázat vÃce nastavenà rozhranÃ"
-#: ardour_ui_ed.cc:227 mixer_ui.cc:2112 mixer_ui.cc:2118
-msgid "Window|Mixer"
-msgstr "Okno/SmÄÅ¡ovaÄ"
-
-#: ardour_ui_ed.cc:228
-msgid "Toggle Editor+Mixer"
-msgstr "PÅepnout editor a smÄÅ¡ovaÄ"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
-#: ardour_ui_ed.cc:229 meterbridge.cc:216 meterbridge.cc:222
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr "Okno|MÄÅicà můstek"
-#: ardour_ui_ed.cc:231
-msgid "Reattach All Tearoffs"
-msgstr "PÅipojit znovu vÅ¡echna odtrženÃ"
-
-#: ardour_ui_ed.cc:233 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "SledovaÄ MIDI"
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "PovÃdánÃ"
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "NápovÄda|PÅÃruÄka"
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:317
msgid "Manual|Reference"
msgstr "PÅÃruÄka|Odkaz"
-#: ardour_ui_ed.cc:239
+#: ardour_ui_ed.cc:318
msgid "Report a Bug"
msgstr "Nahlásit chybu"
-#: ardour_ui_ed.cc:240
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr "PÅehled podvodů"
-#: ardour_ui_ed.cc:241
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr "Stránky Ardouru"
-#: ardour_ui_ed.cc:242
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr "Vývoj Ardouru"
-#: ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr "Uživatelská fóra"
-#: ardour_ui_ed.cc:244
+#: ardour_ui_ed.cc:323
msgid "How to Report a Bug"
msgstr "Jak nahlásit chybu"
-#: ardour_ui_ed.cc:246 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Uložit"
-#: ardour_ui_ed.cc:254 rc_option_editor.cc:1835 rc_option_editor.cc:1846
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1868 rc_option_editor.cc:1877
-#: rc_option_editor.cc:1890 rc_option_editor.cc:1903 rc_option_editor.cc:1912
-#: rc_option_editor.cc:1922 rc_option_editor.cc:1939 rc_option_editor.cc:1941
-#: rc_option_editor.cc:1950 rc_option_editor.cc:1966 rc_option_editor.cc:1987
-#: rc_option_editor.cc:2005 rc_option_editor.cc:2007 rc_option_editor.cc:2024
-#: rc_option_editor.cc:2027 rc_option_editor.cc:2029 rc_option_editor.cc:2046
-#: rc_option_editor.cc:2057
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "PÅehrávánÃ"
-#: ardour_ui_ed.cc:260 engine_dialog.cc:88
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Zastavit"
-#: ardour_ui_ed.cc:263
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "ProjÞdÄt"
-#: ardour_ui_ed.cc:267 ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Spustit/Zastavit"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "Spustit/PokraÄovat/Zastavit"
-#: ardour_ui_ed.cc:276
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "Zastavit a odmÃtnout zvukový záznam"
-#: ardour_ui_ed.cc:286
+#: ardour_ui_ed.cc:365
msgid "Transition to Roll"
msgstr "PÅechod k pÅehrávánà dopÅedu"
-#: ardour_ui_ed.cc:290
+#: ardour_ui_ed.cc:369
msgid "Transition to Reverse"
msgstr "PÅechod k pÅehrávánà dozadu"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "PÅehrávat rozsah smyÄky"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr "PÅehrát výbÄr"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "PÅehrávat vybranou oblast s pÅetáÄenÃm vpÅed"
-#: ardour_ui_ed.cc:304
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Povolit nahrávánÃ"
-#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:311
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "ZaÄÃt s nahrávánÃm"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "PÅetoÄit zpÄt"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "PÅetoÄit zpÄt (pomalu)"
-#: ardour_ui_ed.cc:321
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "PÅetoÄit zpÄt (rychle)"
-#: ardour_ui_ed.cc:324
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "PÅetoÄit vpÅed"
-#: ardour_ui_ed.cc:327
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "PÅetoÄit vpÅed (pomalu)"
-#: ardour_ui_ed.cc:330
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "PÅetoÄit vpÅed (rychle)"
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "SkoÄit na bod nula"
-#: ardour_ui_ed.cc:336 ardour_ui_ed.cc:339
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "SkoÄit na zaÄátek"
-#: ardour_ui_ed.cc:342
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "SkoÄit na konec"
-#: ardour_ui_ed.cc:345
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr "SkoÄit na pÅesný mÃstnà Äas"
-#: ardour_ui_ed.cc:350 ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr "ÄÃselná klávesnice Desetinná teÄka"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr "ÄÃselná klávesnice 0"
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr "ÄÃselná klávesnice 1"
-#: ardour_ui_ed.cc:362
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr "ÄÃselná klávesnice 2"
-#: ardour_ui_ed.cc:365
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr "ÄÃselná klávesnice 3"
-#: ardour_ui_ed.cc:368
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr "ÄÃselná klávesnice 4"
-#: ardour_ui_ed.cc:371
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr "ÄÃselná klávesnice 5"
-#: ardour_ui_ed.cc:374
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr "ÄÃselná klávesnice 6"
-#: ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr "ÄÃselná klávesnice 7"
-#: ardour_ui_ed.cc:380
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr "ÄÃselná klávesnice 8"
-#: ardour_ui_ed.cc:383
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr "ÄÃselná klávesnice 9"
-#: ardour_ui_ed.cc:387
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "ZaostÅit na ukazatel Äasu"
-#: ardour_ui_ed.cc:391 ardour_ui_ed.cc:400 audio_clock.cc:2116 editor.cc:261
-#: editor_actions.cc:585 editor_actions.cc:594 export_timespan_selector.cc:85
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2355,137 +2524,137 @@ msgstr "ZaostÅit na ukazatel Äasu"
msgid "Timecode"
msgstr "Äasový kód"
-#: ardour_ui_ed.cc:393 ardour_ui_ed.cc:402 editor_actions.cc:583
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Takty a doby"
-#: ardour_ui_ed.cc:395 ardour_ui_ed.cc:404
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minuty a sekundy"
-#: ardour_ui_ed.cc:397 ardour_ui_ed.cc:406 audio_clock.cc:2120 editor.cc:262
-#: editor_actions.cc:584
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Vzorky"
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "ZaÄÃt pÅepis oblasti"
-#: ardour_ui_ed.cc:410 mixer_strip.cc:1903 mixer_strip.cc:2103 route_ui.cc:175
-#: time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "Vstup"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "UkonÄit pÅepis oblasti"
-#: ardour_ui_ed.cc:414 mixer_strip.cc:1915 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "Výstup"
-#: ardour_ui_ed.cc:417
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "PÅepsat oblast"
-#: ardour_ui_ed.cc:418
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "Vstup/Výstup"
-#: ardour_ui_ed.cc:421 rc_option_editor.cc:1801
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Klepnout"
-#: ardour_ui_ed.cc:424
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "Automatický vstup"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Automatické pÅehrávánÃ"
-#: ardour_ui_ed.cc:438
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "SeÅÃdit spuÅ¡tÄnà s obrazovým záznamem"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "ÅÃzenà Äasu"
-#: ardour_ui_ed.cc:442
+#: ardour_ui_ed.cc:521
msgid "Use External Positional Sync Source"
msgstr "PoužÃt vnÄjšà zdroj seÅÃzenà podle polohy"
-#: ardour_ui_ed.cc:447
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr "Spustit nahrávánà stopy %1"
-#: ardour_ui_ed.cc:454
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Procentnà podÃl"
-#: ardour_ui_ed.cc:455 shuttle_control.cc:188
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Polotóny"
-#: ardour_ui_ed.cc:459
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Poslat MTC"
-#: ardour_ui_ed.cc:461
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Poslat MMC"
-#: ardour_ui_ed.cc:463
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "PoužÃt MMC"
-#: ardour_ui_ed.cc:465 rc_option_editor.cc:2594
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "Poslat Äas MIDI"
-#: ardour_ui_ed.cc:467
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr "Poslat zpÄtnou vazbu MIDI"
-#: ardour_ui_ed.cc:473
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Nouzové zastavenÃ"
-#: ardour_ui_ed.cc:567
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr "NástÄnné hodiny"
-#: ardour_ui_ed.cc:569
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr "MÃsto na disku"
-#: ardour_ui_ed.cc:570
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr "Digitálnà zpracovánà signálu (DSP)"
-#: ardour_ui_ed.cc:571
+#: ardour_ui_ed.cc:633
msgid "X-run"
msgstr "X-run"
-#: ardour_ui_ed.cc:572
+#: ardour_ui_ed.cc:634
msgid "Active Peak-file Work"
msgstr "VytvoÅenà souboru s nejvyššÃmi hodnotami v Äinnosti"
-#: ardour_ui_ed.cc:573
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr "Vyrovnávacà pamÄti"
-#: ardour_ui_ed.cc:575
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr "Formát Äasového kódu"
-#: ardour_ui_ed.cc:576
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr "Souborový formát"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2493,133 +2662,136 @@ msgstr ""
"Nenà možné, aby byl JACK použÃván jako zdroj pro seÅÃzenÃ\n"
"když nastavenà vytáhnutÃ/stáhnutà nenà nula."
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "VnitÅnÃ"
-#: ardour_ui_options.cc:509
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "Povolit/Zakázat vnÄjšà seÅÃzenà podle polohy"
-#: ardour_ui_options.cc:511
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
"SeÅÃzenà k JACKovi nenà možné: Je nastaveno vytáhnutÃ/stáhnutà obrazového "
"záznamu"
-#: audio_clock.cc:1051 audio_clock.cc:1070
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "--ÄekajÃcà na vyÅÃzenÃ--"
-#: audio_clock.cc:1122
+#: audio_clock.cc:1128
msgid "SR"
msgstr "SR"
-#: audio_clock.cc:1128 audio_clock.cc:1132
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "Táhnout"
-#: audio_clock.cc:1130
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1286 editor.cc:263 editor_actions.cc:140
-#: editor_actions.cc:577
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Tempo"
-#: audio_clock.cc:1290 editor.cc:264 editor_actions.cc:578
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Druh taktu"
-#: audio_clock.cc:1871 audio_streamview.cc:116 editor_actions.cc:1108
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:469
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "Chyba v programovánÃ: %1"
-#: audio_clock.cc:2004 audio_clock.cc:2032
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "Chyba v programovánÃ: %1 %2"
-#: audio_clock.cc:2118 editor.cc:260 export_timespan_selector.cc:95
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "Takty:Doby"
-#: audio_clock.cc:2119 export_timespan_selector.cc:90
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "Minuty:Sekundy"
-#: audio_clock.cc:2124
+#: audio_clock.cc:2129
msgid "Set from Playhead"
msgstr "PÅevzÃt z ukazatele polohy pÅehrávánÃ"
-#: audio_clock.cc:2125
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr "Ukazatele polohy postavit na tento Äas"
-#: audio_clock.cc:2128
+#: audio_clock.cc:2133
msgid "Copy to clipboard"
msgstr "KopÃrovat do schránky"
-#: audio_region_editor.cc:65 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr "dB"
-#: audio_region_editor.cc:68
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "SÃla hlasitosti v oblasti:"
-#: audio_region_editor.cc:78 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr "dBFS"
-#: audio_region_editor.cc:81
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "Nejvyššà hodnota rozkmitu:"
-#: audio_region_editor.cc:92
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "PoÄÃtá se..."
-#: audio_region_view.cc:1371
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "Upravit kÅivku hlasitosti (pÅidat bod ovládánà zesÃlenÃ)"
-#: automation_controller.cc:292 automation_controller.cc:308
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr "Vybrat notu..."
-#: automation_controller.cc:299
+#: automation_controller.cc:311
msgid "Halve"
msgstr "Zmenšit na polovinu"
-#: automation_controller.cc:302
+#: automation_controller.cc:314
msgid "Double"
msgstr "Zdvojnásobit"
-#: automation_controller.cc:313
+#: automation_controller.cc:325
msgid "Set to %1 beat"
msgid_plural "Set to %1 beats"
msgstr[0] "Nastavit na %1 dobu"
msgstr[1] "Nastavit na %1 doby"
-#: automation_line.cc:285 editor_drag.cc:4255
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "Pohybovat bodem automatizace"
-#: automation_line.cc:881 region_gain_line.cc:75
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "Odstranit bod automatizace"
-#: automation_line.cc:1006
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "NepÅÃpustné automatizaÄnà body budou ponechány stranou: \"%1\""
-#: automation_region_view.cc:193 automation_time_axis.cc:647
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "Vložit bod automatizace"
@@ -2635,59 +2807,59 @@ msgstr "Režim automatizace"
msgid "hide track"
msgstr "Skrýt tuto stopu"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:526
-#: generic_pluginui.cc:820 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr "Automatizace|PÅÃruÄka"
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1928 editor.cc:2006
-#: editor_actions.cc:123 editor_actions.cc:1939 gain_meter.cc:225
-#: generic_pluginui.cc:102 generic_pluginui.cc:529 generic_pluginui.cc:822
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1617 midi_time_axis.cc:1620
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "PÅehrát"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:104
-#: generic_pluginui.cc:532 generic_pluginui.cc:824 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Zapsat"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:106
-#: generic_pluginui.cc:535 generic_pluginui.cc:826 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Dotknout se"
-#: automation_time_axis.cc:404 generic_pluginui.cc:538 meter_patterns.cc:118
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "Vyprázdnit automatizaci"
-#: automation_time_axis.cc:545 rc_option_editor.cc:2770
-#: rc_option_editor.cc:2775 rc_option_editor.cc:2821 rc_option_editor.cc:2826
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "Vyprázdnit"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Stav"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr "Samostatný"
-#: automation_time_axis.cc:598 export_format_dialog.cc:489
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Äárový"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:207
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Režim"
@@ -2703,35 +2875,38 @@ msgstr "Upravit balÃk"
msgid "Direction:"
msgstr "SmÄr:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:949
-#: mixer_strip.cc:168 mixer_strip.cc:382 mixer_strip.cc:2361
-#: rc_option_editor.cc:2944
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "Vstup"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:951 mixer_strip.cc:172 mixer_strip.cc:386
-#: mixer_strip.cc:2364 monitor_section.cc:293 monitor_section.cc:297
-#: rc_option_editor.cc:2948
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "Výstup"
-#: bundle_manager.cc:265 editor.cc:1970 editor_actions.cc:95
-#: editor_actions.cc:105 rc_option_editor.cc:2782 rc_option_editor.cc:2796
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Ãpravy"
-#: bundle_manager.cc:266 editor.cc:5951 editor.cc:5981 editor_actions.cc:346
-#: editor_actions.cc:347 plugin_ui.cc:420 processor_box.cc:2832
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "Smazat"
#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
-#: editor_routes.cc:208 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Název"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Nový"
@@ -2747,6 +2922,39 @@ msgstr "PÅidat kanál"
msgid "Rename Channel"
msgstr "PÅejmenovat kanál"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Obnovit výchozÃ"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "PÅedmÄt"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Barva"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr "PÅedmÄty"
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr "Paleta"
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr "Průhlednost"
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr "Paleta barev"
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr "VytvoÅit nastavenÃ"
@@ -2759,6 +2967,18 @@ msgstr "Ovládacà bod"
msgid "Value"
msgstr "Hodnota"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
#: duplicate_routes_dialog.cc:35
msgid "Duplicate Tracks & Busses"
msgstr "Zdvojit stopy a sbÄrnice"
@@ -2820,595 +3040,601 @@ msgstr "Výška tónu"
msgid "Velocity"
msgstr "SÃla tónu"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "Äas"
-#: edit_note_dialog.cc:98 editor_regions.cc:118
+#: edit_note_dialog.cc:99 editor_regions.cc:162
#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
-#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:108
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr "Délka"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "Upravit notu"
-#: editor.cc:150
+#: editor.cc:160
msgid "CD Frames"
msgstr "SnÃmky CD"
-#: editor.cc:151
+#: editor.cc:161
msgid "TC Frames"
msgstr "SnÃmky TC"
-#: editor.cc:152
+#: editor.cc:162
msgid "TC Seconds"
msgstr "Sekundy TC"
-#: editor.cc:153
+#: editor.cc:163
msgid "TC Minutes"
msgstr "Minuty TC"
-#: editor.cc:154
+#: editor.cc:164
msgid "Seconds"
msgstr "Sekundy"
-#: editor.cc:155
+#: editor.cc:165
msgid "Minutes"
msgstr "Minuty"
-#: editor.cc:156 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "Doby/128"
-#: editor.cc:157 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "Doby/64"
-#: editor.cc:158 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Doby/32"
-#: editor.cc:159
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "Doby/28"
-#: editor.cc:160
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "Doby/24"
-#: editor.cc:161
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "Doby/20"
-#: editor.cc:162 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Doby/16"
-#: editor.cc:163
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "Doby/14"
-#: editor.cc:164
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "Doby/12"
-#: editor.cc:165
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "Doby/10"
-#: editor.cc:166 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Doby/8"
-#: editor.cc:167
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "Doby/7"
-#: editor.cc:168
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "Doby/6"
-#: editor.cc:169
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "Doby/5"
-#: editor.cc:170 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Doby/4"
-#: editor.cc:171 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Doby/3"
-#: editor.cc:172 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Doby/2"
-#: editor.cc:173 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Doby"
-#: editor.cc:174
+#: editor.cc:184
msgid "Bars"
msgstr "Takty"
-#: editor.cc:175
+#: editor.cc:185
msgid "Marks"
msgstr "ZnaÄky"
-#: editor.cc:176
+#: editor.cc:186
msgid "Region starts"
msgstr "ZaÄátek oblasti"
-#: editor.cc:177
+#: editor.cc:187
msgid "Region ends"
msgstr "Konec oblasti"
-#: editor.cc:178
+#: editor.cc:188
msgid "Region syncs"
msgstr "SeÅÃzenà oblasti"
-#: editor.cc:179
+#: editor.cc:189
msgid "Region bounds"
msgstr "Hranice oblasti"
-#: editor.cc:184 editor_actions.cc:526
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "MÅÞka vypnuta"
-#: editor.cc:185 editor_actions.cc:527
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "MÅÞka zapnuta"
-#: editor.cc:186 editor_actions.cc:528
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnetická"
-#: editor.cc:191 editor.cc:209 editor_actions.cc:122 editor_actions.cc:509
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Ukazatel polohy"
-#: editor.cc:192 editor_actions.cc:511
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "ZnaÄka"
-#: editor.cc:193 editor.cc:210 editor_actions.cc:510
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Myš"
-#: editor.cc:198 editor_actions.cc:518
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Vsunout"
-#: editor.cc:199
+#: editor.cc:209
msgid "Splice"
msgstr "Slepit"
-#: editor.cc:200 editor_actions.cc:517
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr "Vlnit"
-#: editor.cc:201 editor_actions.cc:1808 editor_markers.cc:905
-#: editor_rulers.cc:259 location_ui.cc:60
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Zamknout"
-#: editor.cc:206 mono_panner_editor.cc:44
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Vlevo"
-#: editor.cc:207 mono_panner_editor.cc:49
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Vpravo"
-#: editor.cc:208
+#: editor.cc:218
msgid "Center"
msgstr "Na stÅed"
-#: editor.cc:211
+#: editor.cc:221
msgid "Edit point"
msgstr "Pracovnà bod"
-#: editor.cc:217
+#: editor.cc:227
msgid "Mushy"
msgstr "Rušený"
-#: editor.cc:218
+#: editor.cc:228
msgid "Smooth"
msgstr "Plynulý"
-#: editor.cc:219
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "Vyvážená vÃcehlasá smÄs"
-#: editor.cc:220
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "Atonálnà nárazy se stálými tóny"
-#: editor.cc:221
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "Jemná jednokanálová nástrojová hudba"
-#: editor.cc:222
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "Atonálnà samostatné nárazy"
-#: editor.cc:223
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "PÅevzorkovat bez zachovánà výšky tónu"
-#: editor.cc:259
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Min:Sec"
-#: editor.cc:265
+#: editor.cc:325
msgid "Location Markers"
msgstr "ZnaÄky polohy"
-#: editor.cc:266
+#: editor.cc:326
msgid "Range Markers"
msgstr "ZnaÄky rozsahů"
-#: editor.cc:267
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Rozsahy smyÄky/pÅepsánÃ"
-#: editor.cc:268 editor_actions.cc:581
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "ZnaÄky na CD"
-#: editor.cc:269
+#: editor.cc:329
msgid "Video Timeline"
msgstr "Äasová osa obrazového záznamu"
-#: editor.cc:286
+#: editor.cc:386
msgid "mode"
msgstr "Režim"
-#: editor.cc:465 editor_actions.cc:115 editor_actions.cc:580
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "ZnaÄky"
-#: editor.cc:583 rc_option_editor.cc:2393
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Oblasti"
-#: editor.cc:584
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "Stopy & SbÄrnice"
-#: editor.cc:585
+#: editor.cc:655
msgid "Snapshots"
msgstr "SnÃmky obrazovky"
-#: editor.cc:586
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "Skupiny stopy a sbÄrnice"
-#: editor.cc:587
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "Rozsahy a znaÄky"
-#: editor.cc:734 editor.cc:5803 rc_option_editor.cc:2061
-#: rc_option_editor.cc:2075 rc_option_editor.cc:2079 rc_option_editor.cc:2087
-#: rc_option_editor.cc:2095 rc_option_editor.cc:2104 rc_option_editor.cc:2113
-#: rc_option_editor.cc:2121 rc_option_editor.cc:2129 rc_option_editor.cc:2139
-#: rc_option_editor.cc:2141 rc_option_editor.cc:2165 rc_option_editor.cc:2177
-#: rc_option_editor.cc:2188 rc_option_editor.cc:2206 rc_option_editor.cc:2208
-#: rc_option_editor.cc:2211 rc_option_editor.cc:2220 rc_option_editor.cc:2238
-#: rc_option_editor.cc:2250 rc_option_editor.cc:2252
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1348 editor.cc:4786 editor_actions.cc:135 editor_actions.cc:1884
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "SmyÄka"
-#: editor.cc:1354 editor.cc:4813 editor_actions.cc:136 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "PÅepsánÃ"
-#: editor.cc:1466 rc_option_editor.cc:2159
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr "Lineárnà (pro vysoce souvztažný materiál)"
-#: editor.cc:1476 rc_option_editor.cc:2160
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr "NemÄnná sÃla"
-#: editor.cc:1485 rc_option_editor.cc:2161
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "SoumÄrný"
-#: editor.cc:1495 rc_option_editor.cc:2162
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Pomalu"
-#: editor.cc:1504 rc_option_editor.cc:2163 sfdb_ui.cc:1767 sfdb_ui.cc:1878
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Rychle"
-#: editor.cc:1526 editor.cc:1551
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "Zastavit"
-#: editor.cc:1528 editor.cc:1553
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "Spustit"
-#: editor.cc:1654 editor.cc:1662 editor_ops.cc:3855
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Zmrazit"
-#: editor.cc:1658
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "Rozmrazit"
-#: editor.cc:1797
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr "Vybrané oblasti"
-#: editor.cc:1841 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr "PÅehrávat rozsah"
-#: editor.cc:1842 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "PÅehrávat rozsah smyÄky"
-#: editor.cc:1845 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "Najet na rozsah"
-#: editor.cc:1854 editor_actions.cc:383
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "PÅesunout zaÄátek rozsahu na pÅedchozà hranici oblasti"
-#: editor.cc:1861 editor_actions.cc:390
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "PÅesunout zaÄátek rozsahu na dalšà hranici oblasti"
-#: editor.cc:1868 editor_actions.cc:397
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "PÅesunout konec rozsahu na pÅedchozà hranici oblasti"
-#: editor.cc:1875 editor_actions.cc:404
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "PÅesunout konec rozsahu na dalšà hranici oblasti"
-#: editor.cc:1881 editor_actions.cc:134 editor_actions.cc:333
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "RozdÄlit"
-#: editor.cc:1882
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr "PÅevést na oblast v seznamu oblastÃ"
-#: editor.cc:1885 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Vybrat vše v rozsahu"
-#: editor.cc:1888 editor_actions.cc:305
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr "Nastavit smyÄku z výbÄru"
-#: editor.cc:1889 editor_actions.cc:306
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr "Nastavit rozsah pÅepsánà z výbÄru"
-#: editor.cc:1890 editor_actions.cc:307
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr "Nastavit zaÄátek/konec sezenà z výbÄru"
-#: editor.cc:1893
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Vložit znaÄky rozsahu"
-#: editor.cc:1896
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr "Zkrátit oblast na rozsah"
-#: editor.cc:1897 editor_actions.cc:319
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Zdvojit rozsah"
-#: editor.cc:1900
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr "Sjednotit rozsah"
-#: editor.cc:1901
+#: editor.cc:2006
msgid "Consolidate Range with Processing"
msgstr "Sjednotit rozsah se zpracovánÃm"
-#: editor.cc:1902
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr "Vrazit rozsah do seznamu oblastÃ"
-#: editor.cc:1903
+#: editor.cc:2008
msgid "Bounce Range to Region List with Processing"
msgstr "Vrazit rozsah do seznamu oblastà se zpracovánÃm"
-#: editor.cc:1904 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr "Vyvést rozsah..."
-#: editor.cc:1906
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr "Vyvést rozsah obrazového záznamu..."
-#: editor.cc:1922 editor.cc:2004 editor_actions.cc:311
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
msgid "Play from Edit Point"
msgstr "PÅehrávat od pracovnÃho bodu"
-#: editor.cc:1923 editor.cc:2005
+#: editor.cc:2028 editor.cc:2110
msgid "Play from Start"
msgstr "PÅehrávat od zaÄátku"
-#: editor.cc:1924
+#: editor.cc:2029
msgid "Play Region"
msgstr "PÅehrávat oblast"
-#: editor.cc:1926
+#: editor.cc:2031
msgid "Loop Region"
msgstr "PÅehrávat oblast ve smyÄce"
-#: editor.cc:1936 editor.cc:2014
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr "Vybrat vÅ¡e ve stopÄ"
-#: editor.cc:1937 editor.cc:2015 editor_actions.cc:195
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr "Vybrat vÅ¡echny pÅedmÄty"
-#: editor.cc:1938 editor.cc:2016
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr "Obrátit výbÄr ve stopÄ"
-#: editor.cc:1939 editor.cc:2017 editor_actions.cc:198
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr "Obrátit výbÄr"
-#: editor.cc:1941 editor_actions.cc:200
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "Nastavit vybraný rozsah jako rozsah smyÄky"
-#: editor.cc:1942 editor_actions.cc:201
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "Nastavit vybraný rozsah jako rozsah pÅepsánÃ"
-#: editor.cc:1943 editor_actions.cc:202
+#: editor.cc:2048 editor_actions.cc:203
msgid "Set Range to Selected Regions"
msgstr "Nastavit rozsah na vybrané oblasti"
-#: editor.cc:1945 editor.cc:2019 editor_actions.cc:204 editor_actions.cc:205
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Vybrat vÅ¡echny oblasti po pracovnÃm bodÄ"
-#: editor.cc:1946 editor.cc:2020 editor_actions.cc:206 editor_actions.cc:207
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Vybrat vÅ¡echny oblasti pÅed pracovnÃm bodem"
-#: editor.cc:1947 editor.cc:2021
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "Vybrat všechny oblasti po ukazateli polohy"
-#: editor.cc:1948 editor.cc:2022
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "Vybrat vÅ¡echny oblasti pÅed ukazatelem polohy"
-#: editor.cc:1949
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr "Vybrat vÅ¡echny oblasti mezi ukazatelem polohy a pracovnÃm bodem"
-#: editor.cc:1950
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr "Vybrat vÅ¡echny oblasti v rámci ukazatele polohy a pracovnÃm bodem"
-#: editor.cc:1951
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr "Vybrat rozsah mezi ukazatelem polohy a pracovnÃm bodem"
-#: editor.cc:1953 editor.cc:2024 editor_actions.cc:132 editor_actions.cc:133
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Vybrat"
-#: editor.cc:1961 editor.cc:2032 editor_actions.cc:345 processor_box.cc:2828
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "Vyjmout"
-#: editor.cc:1962 editor.cc:2033 editor_actions.cc:349 processor_box.cc:2830
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "KopÃrovat"
-#: editor.cc:1963 editor.cc:2034 editor_actions.cc:350 processor_box.cc:2835
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "Vložit"
-#: editor.cc:1967 editor_actions.cc:92
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Zarovnat"
-#: editor.cc:1968
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Zarovnat pomÄrnÄ"
-#: editor.cc:1975
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "Vložit vybranou oblast"
-#: editor.cc:1976
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr "Vložit stávajÃcà materiál"
-#: editor.cc:1985 editor.cc:2041
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr "PostrÄit celou stopu o krok pozdÄji"
-#: editor.cc:1986 editor.cc:2042
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr "PostrÄit stopu po pracovnÃm bodu o krok pozdÄji"
-#: editor.cc:1987 editor.cc:2043
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr "PostrÄit celou stopu o krok dÅÃve"
-#: editor.cc:1988 editor.cc:2044
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr "PostrÄit stopu po pracovnÃm bodu o krok dÅÃve"
-#: editor.cc:1990 editor.cc:2046
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "PostrÄit"
-#: editor.cc:2261
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
"Ukazatel polohy pÅehrávánà se zápornou hodnotou polohy - pÅehlÞà se (mÃsto "
"toho se použÃvá nula)"
-#: editor.cc:3039 editor.cc:3738 editor.cc:3809 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "Vše"
-#: editor.cc:3239
+#: editor.cc:3280
msgid "Smart Mode (add range functions to Grab Mode)"
msgstr "Chytrý režim (pÅidat dodateÄné funkce rozsahu do režimu chÅapnutÃ)"
-#: editor.cc:3240
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr "Režim chÅapnutà (vybrat/pÅesunout pÅedmÄty)"
-#: editor.cc:3241
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr "Režim vyjmutà (rozdÄlit oblasti)"
-#: editor.cc:3242
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr "Režim rozsahu (vybrat Äasové rozsahy)"
-#: editor.cc:3243
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr "Režim kreslenà (kreslit a upravovat zesÃlenÃ/noty/automatizaci)"
-#: editor.cc:3244
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
"Režim protaženà (protáhnutà Äasu zvuku a oblastà MIDI pÅi zachovánà výšky "
"tónu)"
-#: editor.cc:3245
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr "Režim poslechu (poslouchat oblasti"
-#: editor.cc:3246
+#: editor.cc:3287
msgid "Internal Edit Mode (edit notes and automation points)"
msgstr "Režim vnitÅnÃch úprav (upravovat noty a body automatizace)"
-#: editor.cc:3247
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3416,63 +3642,63 @@ msgstr ""
"Skupiny: klepnout pro zapnutÃ/vypnutÃ\n"
"Klepnutà na souvisejÃcà nabÃdku pro jiné operace"
-#: editor.cc:3248
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr "PostrÄit oblast/výbÄr o krok pozdÄji"
-#: editor.cc:3249
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr "PostrÄit oblast/výbÄr o krok dÅÃve"
-#: editor.cc:3250 editor_actions.cc:270
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "PÅiblÞit"
-#: editor.cc:3251 editor_actions.cc:269
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Oddálit"
-#: editor.cc:3252
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr "Pohled na Äasový úsek"
-#: editor.cc:3253 editor.cc:3760 editor_actions.cc:271
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Pohled na celé sezenÃ"
-#: editor.cc:3254 editor_actions.cc:113 editor_actions.cc:146
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
msgid "Zoom Focus"
msgstr "Pohled na stÅed"
-#: editor.cc:3255
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr "Rozbalit stopy"
-#: editor.cc:3256
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr "Zmenšit stopy"
-#: editor.cc:3257
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr "PoÄet viditelných stop"
-#: editor.cc:3258
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr "Jednotky zapadnutÃ/mÅÞky"
-#: editor.cc:3259
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "Režim zapadnutÃ/mÅÞky"
-#: editor.cc:3260 editor_actions.cc:99
+#: editor.cc:3301 editor_actions.cc:101
msgid "Edit Point"
msgstr "Pracovnà bod"
-#: editor.cc:3261
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Režim úprav"
-#: editor.cc:3262
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3480,124 +3706,124 @@ msgstr ""
"Hodiny postrÄenÃ\n"
"(ÅÃdà vzdálenost použitou k postrÄenà oblastà a výbÄrů)"
-#: editor.cc:3530 editor_actions.cc:321
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr "PÅÃkaz|ZpÄt"
-#: editor.cc:3532
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr "PÅÃkaz|ZpÄt (%1)"
-#: editor.cc:3539 editor_actions.cc:323 editor_actions.cc:324
-#: editor_actions.cc:325
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Znovu"
-#: editor.cc:3542
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Znovu (%1)"
-#: editor.cc:3562 editor.cc:3586 editor_actions.cc:111 editor_actions.cc:1865
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Zdvojit"
-#: editor.cc:3563
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr "PoÄet zdvojenÃ:"
-#: editor.cc:3737 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "VýbÄr"
-#: editor.cc:3740
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr "PÅizpůsobit 1 stopu"
-#: editor.cc:3741
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr "PÅizpůsobit 2 stopy"
-#: editor.cc:3742
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr "PÅizpůsobit 4 stopy"
-#: editor.cc:3743
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr "PÅizpůsobit 8 stop"
-#: editor.cc:3744
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr "PÅizpůsobit 16 stop"
-#: editor.cc:3745
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr "PÅizpůsobit 24 stop"
-#: editor.cc:3746
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr "PÅizpůsobit 32 stop"
-#: editor.cc:3747
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr "PÅizpůsobit 48 stop"
-#: editor.cc:3748
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr "PÅizpůsobit vÅ¡echny stopy"
-#: editor.cc:3749
+#: editor.cc:3786
msgid "Fit Selection"
msgstr "PÅizpůsobit výbÄr"
-#: editor.cc:3751
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr "PÅiblÞit na 10 ms"
-#: editor.cc:3752
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr "PÅiblÞit na 100 ms"
-#: editor.cc:3753
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr "PÅiblÞit na 1 s"
-#: editor.cc:3754
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr "PÅiblÞit na 10 s"
-#: editor.cc:3755
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr "PÅiblÞit na 1 minutu"
-#: editor.cc:3756
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr "PÅiblÞit na 10 minut"
-#: editor.cc:3757
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr "PÅiblÞit na 1 hodinu"
-#: editor.cc:3758
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr "PÅiblÞit na 8 hodin"
-#: editor.cc:3759
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr "PÅiblÞit na 24 hodin"
-#: editor.cc:3761
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr "PÅiblÞit na výbÄr rozsahu/oblasti"
-#: editor.cc:3831
+#: editor.cc:3868
msgid "*"
msgstr "*"
-#: editor.cc:4151
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr "Smazánà seznamu skladeb"
-#: editor.cc:4152
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3608,1330 +3834,1373 @@ msgstr ""
"použÃvány.\n"
"Jestliže se smaže, budou jÃm použÃvané zvukové soubory smazány."
-#: editor.cc:4162
+#: editor.cc:4146
msgid "Delete All Unused"
msgstr "Smazat vÅ¡e nepoužÃvané"
-#: editor.cc:4163
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr "Smazat seznam skladeb"
-#: editor.cc:4164
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr "Ponechat seznam skladeb"
-#: editor.cc:4165
+#: editor.cc:4149
msgid "Keep Remaining"
msgstr "Zachovat zbývajÃcÃ"
-#: editor.cc:4166 editor_audio_import.cc:597 editor_ops.cc:6456
-#: engine_dialog.cc:2909 sfdb_freesound_mootcher.cc:69 processor_box.cc:2596
-#: processor_box.cc:2621
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "Zrušit"
-#: editor.cc:4321
+#: editor.cc:4292
msgid "new playlists"
msgstr "Nový seznam skladeb"
-#: editor.cc:4337
+#: editor.cc:4308
msgid "copy playlists"
msgstr "KopÃrovat seznam skladeb"
-#: editor.cc:4352
+#: editor.cc:4323
msgid "clear playlists"
msgstr "Vyprázdnit seznam skladeb"
-#: editor.cc:5098
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr "PoÄkejte, prosÃm, zatÃmco %1 nahrává vizuálnà data."
-#: editor.cc:5950 editor.cc:5985 editor_markers.cc:985 panner_ui.cc:412
-#: processor_box.cc:2855
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr "Upravit..."
-#: editor.cc:5991 editor_actions.cc:1844
+#: editor.cc:6002 editor_actions.cc:1842
msgid "Transpose..."
msgstr "PÅevést..."
-#: editor.cc:5995 editor_actions.cc:1960
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr "PÅevázat (legato)"
-#: editor.cc:6001 editor_actions.cc:1959
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr "Kvantovat..."
-#: editor.cc:6004 editor_actions.cc:1962
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr "Odstranit pÅekrytà (legato)"
-#: editor.cc:6010 editor_actions.cc:1961
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr "PromÄnit..."
-#: editor_actions.cc:93
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Automaticky spojit"
-#: editor_actions.cc:94
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "ProlÃnánÃ"
-#: editor_actions.cc:96
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "Posunout vybranou znaÄku polohy"
-#: editor_actions.cc:97
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "Vybrat operace s rozsahy"
-#: editor_actions.cc:98
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "Vybrat oblasti"
-#: editor_actions.cc:100
+#: editor_actions.cc:102
msgid "Fade"
msgstr "ZesÃlit/Zeslabit"
-#: editor_actions.cc:101
+#: editor_actions.cc:103
msgid "Latch"
msgstr "Zaklapnout"
-#: editor_actions.cc:102 editor_regions.cc:115 region_editor.cc:48
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "Oblast"
-#: editor_actions.cc:103
+#: editor_actions.cc:105
msgid "Layering"
msgstr "VrstvenÃ"
-#: editor_actions.cc:104 editor_regions.cc:116 stereo_panner_editor.cc:46
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Poloha"
-#: editor_actions.cc:106 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:178
-#: panner_ui.cc:637 route_time_axis.cc:529
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "UstÅihnout"
-#: editor_actions.cc:107 editor_actions.cc:127 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "ZesÃlenà signálu"
-#: editor_actions.cc:108 editor_actions.cc:579
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Rozsahy"
-#: editor_actions.cc:109 editor_actions.cc:1861 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "ProlÃnánÃ"
-#: editor_actions.cc:112
+#: editor_actions.cc:114
msgid "Link"
msgstr "PropojenÃ"
-#: editor_actions.cc:114
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "Ukazatele polohy postavit na znaÄky"
-#: editor_actions.cc:116
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Klesánà ukazatele hladiny"
-#: editor_actions.cc:117
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Drženà ukazatele hladiny"
-#: editor_actions.cc:118 session_option_editor.cc:342
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "Volby pro MIDI"
-#: editor_actions.cc:119
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Různé volby"
-#: editor_actions.cc:120 rc_option_editor.cc:2261 route_group_dialog.cc:54
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "SledovánÃ"
-#: editor_actions.cc:121
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "SouÄasná znaÄka"
-#: editor_actions.cc:124
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Hlavnà údaj o Äase"
-#: editor_actions.cc:125
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "Vytáhnout nahoru/Stáhnout dolů"
-#: editor_actions.cc:126
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Operace s oblastmi"
-#: editor_actions.cc:128 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "PravÃtka se znaÄkami"
-#: editor_actions.cc:129
+#: editor_actions.cc:131
msgid "Views"
msgstr "Pohledy"
-#: editor_actions.cc:130
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "ProjÞdÄt"
-#: editor_actions.cc:131
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Vedlejšà údaj o Äase"
-#: editor_actions.cc:138
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "PodÅÃzené snÃmky"
-#: editor_actions.cc:141
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "Äasový kód FPS"
-#: editor_actions.cc:142 route_time_axis.cc:587
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Výška"
-#: editor_actions.cc:144
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Nástroje"
-#: editor_actions.cc:145
+#: editor_actions.cc:147
msgid "View"
msgstr "Pohled"
-#: editor_actions.cc:147
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "ZvÄtÅ¡enÃ"
-#: editor_actions.cc:153
-msgid "Break drag or deselect all"
-msgstr "PÅeruÅ¡it taženà nebo odznaÄit vÅ¡e"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
-#: editor_actions.cc:158
+#: editor_actions.cc:159
msgid "Session|Lock"
msgstr "Zámek"
-#: editor_actions.cc:160
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Ukázat panel smÄÅ¡ovaÄe"
-#: editor_actions.cc:161
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "Ukázat seznam editoru"
-#: editor_actions.cc:163
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Ukazatele polohy na dalšà hranici oblasti"
-#: editor_actions.cc:164
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr "Ukazatele polohy na dalšà hranici oblasti (žádný výbÄr stopy)"
-#: editor_actions.cc:165
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Ukazatele polohy na pÅedchozà hranici oblasti"
-#: editor_actions.cc:166
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr "Ukazatele polohy na pÅedchozà hranici oblasti (žádný výbÄr stopy)"
-#: editor_actions.cc:168
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Ukazatele polohy na zaÄátek dalšà oblasti"
-#: editor_actions.cc:169
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Ukazatele polohy na konec dalšà oblasti"
-#: editor_actions.cc:170
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Ukazatele polohy na bod zapadnutà dalšà oblasti"
-#: editor_actions.cc:172
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Ukazatele polohy na zaÄátek pÅedchozà oblasti"
-#: editor_actions.cc:173
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Ukazatele polohy na konec pÅedchozà oblasti"
-#: editor_actions.cc:174
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Ukazatele polohy na bod zapadnutà pÅedchozà oblasti"
-#: editor_actions.cc:176
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "Na dalšà hranici oblasti"
-#: editor_actions.cc:177
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "Na dalšà hranici oblasti (žádný výbÄr stopy)"
-#: editor_actions.cc:178
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "Na pÅedchozà hranici oblasti"
-#: editor_actions.cc:179
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "Na pÅedchozà hranici oblasti (žádný výbÄr stopy)"
-#: editor_actions.cc:181
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "Na zaÄátek dalšà oblasti"
-#: editor_actions.cc:182
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "Na konec dalšà oblasti"
-#: editor_actions.cc:183
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "Na bod zapadnutà dalšà oblasti"
-#: editor_actions.cc:185
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "Na zaÄátek pÅedchozà oblasti"
-#: editor_actions.cc:186
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "Na konec pÅedchozà oblasti"
-#: editor_actions.cc:187
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "Na bod zapadnutà pÅedchozà oblasti"
-#: editor_actions.cc:189
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "Na zaÄátek rozsahu výbÄru"
-#: editor_actions.cc:190
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "Na konec rozsahu výbÄru"
-#: editor_actions.cc:192
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Ukazatele polohy na zaÄátek rozsahu výbÄru"
-#: editor_actions.cc:193
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Ukazatele polohy na konec rozsahu výbÄru"
-#: editor_actions.cc:196
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr "Vybrat všechny stopy"
-#: editor_actions.cc:197 export_timespan_selector.cc:59 processor_box.cc:2841
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "OdznaÄit vÅ¡e"
-#: editor_actions.cc:209
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "Vybrat vÅ¡echny pÅekrývajÃcà se oblasti v rozsahu úprav"
-#: editor_actions.cc:210
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "Vybrat vše uvnitŠrozsahu úprav"
-#: editor_actions.cc:212
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "Vybrat rozsah úprav"
-#: editor_actions.cc:214
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Vybrat vÅ¡echny oblasti v rozsahu pÅepsánÃ"
-#: editor_actions.cc:215
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Vybrat vÅ¡echny oblasti uvnitÅ rozsahu smyÄky"
-#: editor_actions.cc:217
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "Vybrat dalšà stopu nebo sbÄrnici"
-#: editor_actions.cc:218
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "Vybrat pÅedchozà stopu nebo sbÄrnici"
-#: editor_actions.cc:220
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "Spustit nahrávánÃ"
-#: editor_actions.cc:222
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr "PÅepnout sólo"
-#: editor_actions.cc:224
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "PÅepnout ztlumenÃ"
-#: editor_actions.cc:226
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "PÅepnout samostatné sólo"
-#: editor_actions.cc:231
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "Uložit pohled %1"
-#: editor_actions.cc:237
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "Vyvolat pohled %1"
-#: editor_actions.cc:243
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "Ukazatele polohy postavit na znaÄku %1"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "SkoÄit na dalšà znaÄku"
-#: editor_actions.cc:249 editor_actions.cc:250
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "SkoÄit na pÅedchozà znaÄku"
-#: editor_actions.cc:252
+#: editor_actions.cc:254
msgid "Set Session Start from Playhead"
msgstr "Nastavit zaÄátek sezenà z polohy ukazatele pÅehrávánÃ"
-#: editor_actions.cc:253
+#: editor_actions.cc:255
msgid "Set Session End from Playhead"
msgstr "Nastavit konec sezenà na ukazatel polohy"
-#: editor_actions.cc:255 editor_actions.cc:256
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "ZÅÃdit znaÄku na ukazateli polohy"
-#: editor_actions.cc:258 editor_actions.cc:259
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr "Odstranit znaÄku pÅi ukazateli polohy"
-#: editor_actions.cc:261
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr "PostrÄit dalšà oblast o krok pozdÄji"
-#: editor_actions.cc:262
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr "PostrÄit dalšà oblast o krok dÅÃve"
-#: editor_actions.cc:264
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "PostrÄit ukazatele polohy o krok vpÅed"
-#: editor_actions.cc:265
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "PostrÄit ukazatele polohy o krok zpÄt"
-#: editor_actions.cc:266
+#: editor_actions.cc:268
msgid "Playhead to Next Grid"
msgstr "Ukazatele polohy k dalšà mÅÞce"
-#: editor_actions.cc:267
+#: editor_actions.cc:269
msgid "Playhead to Previous Grid"
msgstr "Ukazatele polohy k pÅedchozà mÅÞce"
-#: editor_actions.cc:272
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr "PÅiblÞit výbÄr"
-#: editor_actions.cc:273
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "PÅepnout na poslednà pÅiblÞenÃ/oddálenÃ"
-#: editor_actions.cc:275
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "ZvÄtÅ¡it výšku stopy"
-#: editor_actions.cc:276
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "Zmenšit výšku stopy"
-#: editor_actions.cc:278
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "Vybrané stopy posunout nahoru"
-#: editor_actions.cc:280
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "Vybrané stopy posunout dolů"
-#: editor_actions.cc:283
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "ProjÞdÄt stopami nahoru"
-#: editor_actions.cc:285
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "ProjÞdÄt stopami dolů"
-#: editor_actions.cc:287
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "ProjÞdÄt stopami pomalu nahoru"
-#: editor_actions.cc:289
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "ProjÞdÄt stopami pomalu dolů"
-#: editor_actions.cc:292
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "ProjÞdÄt doprava (dozadu)"
-#: editor_actions.cc:293
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "ProjÞdÄt doleva (dopÅedu)"
-#: editor_actions.cc:294
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "VystÅedit ukazatele polohy"
-#: editor_actions.cc:295
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Pracovnà bod umÃstit do stÅedu"
-#: editor_actions.cc:297
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Ukazatele polohy dopÅedu"
-#: editor_actions.cc:298
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Ukazatele polohy dozadu"
-#: editor_actions.cc:300
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "Ukazatele polohy k Äinné znaÄce"
-#: editor_actions.cc:301
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "Posunout Äinnou znaÄku k ukazateli polohy"
-#: editor_actions.cc:303
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr "PoužÃt oblasti skoků"
-#: editor_actions.cc:310
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "PÅehrát vybrané oblasti"
-#: editor_actions.cc:312
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "PÅehrávat od pracovnÃho bodu a znovu"
-#: editor_actions.cc:314
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "PÅehrávat rozsah úprav"
-#: editor_actions.cc:316
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Ukazatele polohy na polohu myši"
-#: editor_actions.cc:317
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Äinnou znaÄku na polohu myÅ¡i"
-#: editor_actions.cc:327
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr "ZpÄt zmÄnu výbÄru"
-#: editor_actions.cc:328
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr "Znovu zmÄnu výbÄru"
-#: editor_actions.cc:330
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "Vyvést zvuk"
-#: editor_actions.cc:331 export_dialog.cc:394
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Vyvést rozsah"
-#: editor_actions.cc:336
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "RozdÄlit na hranicÃch rozsahu pÅepsánÃ"
-#: editor_actions.cc:339
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "RozdÄlit na koncÃch smyÄek"
-#: editor_actions.cc:342 editor_actions.cc:364
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "OÅÃznout"
-#: editor_actions.cc:352
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr "ProlÃnat výbÄr oblasti"
-#: editor_actions.cc:354
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr "Stanovit tempo z rozsah úprav = takt"
-#: editor_actions.cc:356
+#: editor_actions.cc:371
msgid "Log"
msgstr "Zápis"
-#: editor_actions.cc:359 editor_actions.cc:361
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr "PÅesunout k dalÅ¡Ãmu pÅechodu"
-#: editor_actions.cc:360 editor_actions.cc:362
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr "PÅesunout k pÅedchozÃmu pÅechodu"
-#: editor_actions.cc:366 editor_actions.cc:375
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "ZaÄÃt rozsah"
-#: editor_actions.cc:367 editor_actions.cc:376
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "UkonÄit rozsah"
-#: editor_actions.cc:369
+#: editor_actions.cc:387
msgid "Start Punch Range"
msgstr "ZaÄÃt rozsah pÅepsánÃ"
-#: editor_actions.cc:370
+#: editor_actions.cc:388
msgid "Finish Punch Range"
msgstr "UkonÄit rozsah pÅepsánÃ"
-#: editor_actions.cc:372
+#: editor_actions.cc:390
msgid "Start Loop Range"
msgstr "ZaÄÃt rozsah smyÄky"
-#: editor_actions.cc:373
+#: editor_actions.cc:391
msgid "Finish Loop Range"
msgstr "UkonÄit rozsah smyÄky"
-#: editor_actions.cc:408
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Následovat ukazatele polohy"
-#: editor_actions.cc:409
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Odstranit poslednà nahrávku"
-#: editor_actions.cc:411
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "Pevný ukazatel polohy"
-#: editor_actions.cc:413 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Vložit ticho"
-#: editor_actions.cc:415 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
msgid "Remove Time"
msgstr "Odstranit Äas"
-#: editor_actions.cc:420
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "Zapnout/Vypnout stopu"
-#: editor_actions.cc:422 editor_actions.cc:1787 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:134 mixer_strip.cc:1623
-#: route_time_axis.cc:872
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Odstranit"
-#: editor_actions.cc:427
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr "PÅizpůsobit výbÄr (svisle)"
-#: editor_actions.cc:429 time_axis_view.cc:1380
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "NejvÄtÅ¡Ã"
-#: editor_actions.cc:432 time_axis_view.cc:1381
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "VÄtÅ¡Ã"
-#: editor_actions.cc:435 editor_rulers.cc:248 time_axis_view.cc:1382
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Velká"
-#: editor_actions.cc:441 editor_rulers.cc:252 time_axis_view.cc:1384
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "Malá"
-#: editor_actions.cc:445
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr "Zahrát vybrané noty MIDI"
-#: editor_actions.cc:450
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Srovnat pohled na levý okraj"
-#: editor_actions.cc:451
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Srovnat pohled na pravý okraj"
-#: editor_actions.cc:452
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Srovnat pohled na stÅed"
-#: editor_actions.cc:453
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Srovnat pohled na ukazatele polohy"
-#: editor_actions.cc:454
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Srovnat pohled na myš"
-#: editor_actions.cc:455
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Srovnat pohled na bod úprav"
-#: editor_actions.cc:457
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr "Dalšà srovnánà pohledu"
-#: editor_actions.cc:463
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "Chytrý pÅedmÄtový režim"
-#: editor_actions.cc:466
+#: editor_actions.cc:491
msgid "Smart"
msgstr "Chytrý"
-#: editor_actions.cc:469
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Nástroj pro pÅedmÄty"
-#: editor_actions.cc:474
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Nástroj pro rozsahy"
-#: editor_actions.cc:479
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "Nástroj pro kreslenà not"
-#: editor_actions.cc:484
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "Nástroj pro poslech"
-#: editor_actions.cc:489
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "Nástroj pro Äasové úÄinky"
-#: editor_actions.cc:494
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr "Nástroj pro obsah"
-#: editor_actions.cc:500
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr "Nástroj pro vyjÃmánÃ"
-#: editor_actions.cc:506
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr "UdÄlat krok v režimu myÅ¡i"
-#: editor_actions.cc:513
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "ZmÄnit pracovnà bod"
-#: editor_actions.cc:514
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "Stanovit pracovnà bod (vÄetnÄ znaÄky polohy)"
-#: editor_actions.cc:519
+#: editor_actions.cc:544
msgid "EditMode|Lock"
msgstr "Zamknout"
-#: editor_actions.cc:520
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr "PÅepÃnat režim úprav"
-#: editor_actions.cc:522
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "Zapadnout"
-#: editor_actions.cc:523
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Režim zapadnutÃ"
-#: editor_actions.cc:530
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "Režim dalÅ¡Ãho zapadnutÃ"
-#: editor_actions.cc:531
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "VýbÄr dalÅ¡Ãho zapadnutÃ"
-#: editor_actions.cc:532
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr "VýbÄr dalÅ¡Ãho hudebnÃho zapadnutÃ"
-#: editor_actions.cc:533
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr "VýbÄr pÅedchozÃho zapadnutÃ"
-#: editor_actions.cc:534
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr "VýbÄr pÅedchozÃho hudebnÃho zapadnutÃ"
-#: editor_actions.cc:539
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr "Zapadnout do snÃmku CD"
-#: editor_actions.cc:540
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr "Zapadnout do snÃmku Äasového kódu"
-#: editor_actions.cc:541
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr "Zapadnout do sekund Äasového kódu"
-#: editor_actions.cc:542
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr "Zapadnout do minut Äasového kódu"
-#: editor_actions.cc:543
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "Zapadnout do sekund"
-#: editor_actions.cc:544
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "Zapadnout do minut"
-#: editor_actions.cc:546
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr "Zapadnout do stoosmadvacetin"
-#: editor_actions.cc:547
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr "Zapadnout do ÄtyÅiaÅ¡edesátin"
-#: editor_actions.cc:548
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "Zapadnout do tÅiceti sekund"
-#: editor_actions.cc:549
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr "Zapadnout do osmadvacetin"
-#: editor_actions.cc:550
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr "Zapadnout do ÄtyÅiadvacetin"
-#: editor_actions.cc:551
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr "Zapadnout do dvacetin"
-#: editor_actions.cc:552
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "Zapadnout do šestnáctin"
-#: editor_actions.cc:553
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "Zapadnout do Ätrnáctin"
-#: editor_actions.cc:554
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr "Zapadnout do dvanáctin"
-#: editor_actions.cc:555
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "Zapadnout do desetin"
-#: editor_actions.cc:556
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "Zapadnout do osmin"
-#: editor_actions.cc:557
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "Zapadnout do sedmin"
-#: editor_actions.cc:558
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "Zapadnout do šestin"
-#: editor_actions.cc:559
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "Zapadnout do pÄtin"
-#: editor_actions.cc:560
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "Zapadnout do Ätvrtin"
-#: editor_actions.cc:561
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "Zapadnout do tÅetin"
-#: editor_actions.cc:562
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "Zapadnout do polovin"
-#: editor_actions.cc:564
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "Zapadnout do doby"
-#: editor_actions.cc:565
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "Zapadnout do taktu"
-#: editor_actions.cc:566
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "Zapadnout do znaÄky"
-#: editor_actions.cc:567
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "Zapadnout do zaÄátku oblasti"
-#: editor_actions.cc:568
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "Zapadnout do konce oblasti"
-#: editor_actions.cc:569
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr "Zapadnout do bodu zapadnutà oblasti"
-#: editor_actions.cc:570
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "Zapadnout do hranice oblasti"
-#: editor_actions.cc:572
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "Ukázat Äáry znaÄek"
-#: editor_actions.cc:582
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "Oblasti smyÄky/pÅepsánÃ"
-#: editor_actions.cc:586
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Min:Sek"
-#: editor_actions.cc:588 editor_actions.cc:591 editor_rulers.cc:270
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr "Sledovánà obrazového záznamu"
-#: editor_actions.cc:590 rc_option_editor.cc:2720
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr "Obraz"
-#: editor_actions.cc:593
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr "Vždy nahoÅe"
-#: editor_actions.cc:595
+#: editor_actions.cc:620
msgid "Frame number"
msgstr "ÄÃslo snÃmku"
-#: editor_actions.cc:596
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr "Pozadà Äasového kódu"
-#: editor_actions.cc:597
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr "Celá obrazovka"
-#: editor_actions.cc:598
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr "Širokoúhlý formát"
-#: editor_actions.cc:599
+#: editor_actions.cc:624
msgid "Original Size"
msgstr "Původnà velikost"
-#: editor_actions.cc:656
+#: editor_actions.cc:681
msgid "Sort"
msgstr "TÅÃdit"
-#: editor_actions.cc:667 editor_routes.cc:485 mixer_ui.cc:1258
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Ukázat vše"
-#: editor_actions.cc:668
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr "Ukázat automatické oblasti"
-#: editor_actions.cc:670
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Vzestupný"
-#: editor_actions.cc:672
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Sestupný"
-#: editor_actions.cc:675
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Podle názvu oblasti"
-#: editor_actions.cc:677
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Podle délky oblasti"
-#: editor_actions.cc:679
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Podle polohy oblasti"
-#: editor_actions.cc:681
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "Podle Äasové razÃtka oblasti"
-#: editor_actions.cc:683
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Podle zaÄátku oblasti v souboru"
-#: editor_actions.cc:685
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Podle konce oblasti v souboru"
-#: editor_actions.cc:687
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Podle názvu zdrojového souboru"
-#: editor_actions.cc:689
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Podle délky zdrojového souboru"
-#: editor_actions.cc:691
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Podle data vytvoÅenà zdrojového souboru"
-#: editor_actions.cc:693
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Podle souborového systému zdroje"
-#: editor_actions.cc:696
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "Odstranit nepoužÃvané"
-#: editor_actions.cc:698
+#: editor_actions.cc:723
msgid "Import PT session"
msgstr "Zavést sezenà PT"
-#: editor_actions.cc:703 editor_audio_import.cc:282 editor_pt_import.cc:148
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 sfdb_ui.cc:558 editor_videotimeline.cc:91
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Zavést"
-#: editor_actions.cc:706
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "Zavést do seznamu oblastÃ..."
-#: editor_actions.cc:709 session_import_dialog.cc:44
+#: editor_actions.cc:734 session_import_dialog.cc:44
#: session_import_dialog.cc:65
msgid "Import from Session"
msgstr "Zavést ze sezenÃ"
-#: editor_actions.cc:713
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr "VÅ¡echen materiál zkopÃrovat do složky se sezenÃm"
-#: editor_actions.cc:716
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "Ukázat shrnutÃ"
-#: editor_actions.cc:718
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "Ukázat karty se skupinami"
-#: editor_actions.cc:720
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr "Ukázat taktové Äáry"
-#: editor_actions.cc:724
-msgid "Show Logo"
-msgstr "Ukázat logo"
-
-#: editor_actions.cc:728
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr "PÅepnout vstup MIDI pro v editoru vybrané stopy/sbÄrnice"
-#: editor_actions.cc:751
-msgid "Loaded editor bindings from %1"
-msgstr "Nahrané vazby editoru z %1"
-
-#: editor_actions.cc:753
-msgid "Could not find editor.bindings in search path %1"
-msgstr "V prohledávané cestÄ %1 se editor.bindings nalézt nepodaÅilo"
-
-#: editor_actions.cc:1097 editor_actions.cc:1493 editor_actions.cc:1504
-#: editor_actions.cc:1557 editor_actions.cc:1568 editor_actions.cc:1615
-#: editor_actions.cc:1625 editor_regions.cc:1575
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr "Chyba v programovánÃ: %1: %2"
-#: editor_actions.cc:1793
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "Pozvednout"
-#: editor_actions.cc:1796
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Pozvednout zcela nahoru"
-#: editor_actions.cc:1799
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Dát dolů"
-#: editor_actions.cc:1802
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Dát zcela dolů"
-#: editor_actions.cc:1805
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "Posunout na původnà polohu"
-#: editor_actions.cc:1810
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr "Uzamknout k obrazovému záznamu"
-#: editor_actions.cc:1815 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "PÅilepit k taktům a dobám"
-#: editor_actions.cc:1820
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "Odstranit bod zapadnutÃ"
-#: editor_actions.cc:1823 mixer_strip.cc:2102 monitor_section.cc:250
-#: monitor_section.cc:318 route_time_axis.cc:256 route_time_axis.cc:538
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Ztlumit"
-#: editor_actions.cc:1826
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normalizovat..."
-#: editor_actions.cc:1829
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Obrátit"
-#: editor_actions.cc:1832
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "PÅemÄnit na monofonnà oblasti"
-#: editor_actions.cc:1835
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "Zvýšit sÃlu hlasitosti"
-#: editor_actions.cc:1838
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "SnÞit sÃlu hlasitosti"
-#: editor_actions.cc:1841
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "Posun výšky tónu..."
-#: editor_actions.cc:1847
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "Neprůhledný"
-#: editor_actions.cc:1851 editor_regions.cc:120
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Postupné zesÃlenà signálu"
-#: editor_actions.cc:1856 editor_regions.cc:121
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Postupné zeslabenà signálu"
-#: editor_actions.cc:1871
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "VÃcekrát zdvojit..."
-#: editor_actions.cc:1876
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Doplnit stopu"
-#: editor_actions.cc:1880 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "ZÅÃdit oblast smyÄky"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "ZÅÃdit oblast pÅepsánÃ"
-#: editor_actions.cc:1891
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "PÅidat znaÄku jednoho rozsahu"
-#: editor_actions.cc:1896
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "Vložit znaÄku rozsahu na oblast"
-#: editor_actions.cc:1900
+#: editor_actions.cc:1898
msgid "Snap Position to Grid"
msgstr "Zapadnout ukazatele polohy do mÅÞky"
-#: editor_actions.cc:1903
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "ZavÅÃt mezery"
-#: editor_actions.cc:1906
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "Rytmická páska..."
-#: editor_actions.cc:1909
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "Vyvést..."
-#: editor_actions.cc:1915
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "RozdÄlit pod"
-#: editor_actions.cc:1919 editor_actions.cc:1920
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "ZmÄnit délku postupného zesÃlenà signálu"
-#: editor_actions.cc:1921 editor_actions.cc:1922
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "ZmÄnit délku postupného zeslabenà signálu"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "Stanovit tempo z \"oblast = takt\""
-#: editor_actions.cc:1929
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "RozdÄlit oblasti na zaÄátcÃch úderů bicÃch"
-#: editor_actions.cc:1934
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "Editor seznamu..."
-#: editor_actions.cc:1937
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "Vlastnosti..."
-#: editor_actions.cc:1941
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "Vrazit (se zpracovánÃm)"
-#: editor_actions.cc:1942
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "Vrazit (bez zpracovánÃ)"
-#: editor_actions.cc:1943
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "Spojit"
-#: editor_actions.cc:1944
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "ZruÅ¡it spojenÃ"
-#: editor_actions.cc:1946
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "Spektrálnà analýza..."
-#: editor_actions.cc:1948
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Nastavit kÅivku sÃly zvuku znovu"
-#: editor_actions.cc:1950
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "Nastavit sÃlu hlasitosti znovu"
-#: editor_actions.cc:1955
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "Äinná kÅivka sÃly zvuku"
-#: editor_actions.cc:1963 editor_actions.cc:1964
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "Vložit zmÄnu zapojenÃ..."
-#: editor_actions.cc:1965
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr "Odpojit od jiných kopiÃ"
-#: editor_actions.cc:1966
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "Odstranit ticho..."
-#: editor_actions.cc:1967
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Vybrat rozsah oblasti"
-#: editor_actions.cc:1969 editor_actions.cc:1970
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr "PostrÄit o krok pozdÄji"
-#: editor_actions.cc:1971 editor_actions.cc:1972
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr "PostrÄit o krok dÅÃve"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr "Åadit oblasti vedle sebe"
-#: editor_actions.cc:1979
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr "PostrÄit o krok pozdÄji podle odsazenà nahrávánÃ"
-#: editor_actions.cc:1986
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr "PostrÄit o krok dÅÃve podle odsazenà nahrávánÃ"
-#: editor_actions.cc:1990
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "Zkrátit na oblast smyÄky"
-#: editor_actions.cc:1991
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Zkrátit na oblast pÅepsánÃ"
-#: editor_actions.cc:1993
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Zkrátit na pÅedchozÃ"
-#: editor_actions.cc:1994
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Zkrátit na dalÅ¡Ã"
-#: editor_actions.cc:2001
+#: editor_actions.cc:2000
msgid "Insert Region from Region List"
msgstr "Vložit oblast ze seznamu oblastÃ"
-#: editor_actions.cc:2007
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "Nastavit polohu bodu zapadnutà oblasti"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "UmÃstit pÅechod"
-#: editor_actions.cc:2009
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr "RozdÄlit/OddÄlit"
-#: editor_actions.cc:2010
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "ZastÅihnout zaÄátek oblasti na pracovnÃm bodu"
-#: editor_actions.cc:2011
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "ZastÅihnout konec oblasti na pracovnÃm bodu"
-#: editor_actions.cc:2016
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "Zarovnat zaÄátek"
-#: editor_actions.cc:2023
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "Zarovnat zaÄátek pomÄrnÄ"
-#: editor_actions.cc:2027
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "Zarovnat konec"
-#: editor_actions.cc:2032
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "Zarovnat konec pomÄrnÄ"
-#: editor_actions.cc:2039
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "Zarovnat bod zapadnutÃ"
-#: editor_actions.cc:2046
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "Zarovnat bod zapadnutà pomÄrnÄ"
-#: editor_actions.cc:2050 editor_actions.cc:2053
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "Vybrat vrchnÃ..."
@@ -4960,33 +5229,33 @@ msgstr ""
"Projekt již obsahuje zdrojový soubor nazvaný %1. Chcete zavést %2 jako nový "
"soubor nebo jej pÅeskoÄit?"
-#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "ZruÅ¡it zavedenÃ"
-#: editor_audio_import.cc:562
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Editor: Soubor \"%1\" nelze otevÅÃt (%2)"
-#: editor_audio_import.cc:570
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "ZruÅ¡it celé zavedenÃ"
-#: editor_audio_import.cc:571
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Toto nevložit"
-#: editor_audio_import.cc:572
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Vložit vÅ¡e bez ptanÃ"
-#: editor_audio_import.cc:575 editor_audio_import.cc:601
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "Vzorkovacà kmitoÄet"
-#: editor_audio_import.cc:576 editor_audio_import.cc:602
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4995,7 +5264,7 @@ msgstr ""
"Vzorkovacà kmitoÄet tohoto souboru se neshoduje se vzorkovacÃm kmitoÄtem "
"sezenÃ!"
-#: editor_audio_import.cc:598
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "PÅesto vložit"
@@ -5011,11 +5280,11 @@ msgstr "Zavést sezenà PT"
msgid "%1: this is only the directory/folder name, not the filename.\n"
msgstr "%1: Toto je jen název adresáÅe/složky, ne název souboru.\n"
-#: editor_pt_import.cc:131
+#: editor_pt_import.cc:132
msgid "Doesn't seem to be a valid PT session file"
msgstr "Zdá se, že toto nenà platný soubor se sezenÃm PT"
-#: editor_pt_import.cc:135
+#: editor_pt_import.cc:136
msgid ""
"PT v%1 Session @ %2Hz\n"
"\n"
@@ -5033,29 +5302,43 @@ msgstr ""
"\n"
"PokraÄovat..."
-#: editor_canvas_events.cc:1308 editor_drag.cc:1418
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
"NepodaÅilo se vytvoÅit žádnou novou stopu, poté co byla oblast umÃstÄna v "
"oblasti pro upuÅ¡tÄnÃ"
-#: editor_drag.cc:1310
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr "Posunout oblast ve stejném Äase"
-#: editor_drag.cc:2245
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr "Režim vlnÄnà pÅi taženÃ"
-#: editor_drag.cc:2307
+#: editor_drag.cc:2311
msgid "create region"
msgstr "VytvoÅit oblast"
-#: editor_drag.cc:2426 midi_region_view.cc:2834
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr "ZmÄnit velikost not"
-#: editor_drag.cc:2609 editor_drag.cc:2644
+#: editor_drag.cc:2613 editor_drag.cc:2648
msgid ""
"One or more Audio Regions\n"
"are both Locked and\n"
@@ -5067,79 +5350,87 @@ msgstr ""
"k obrazovému záznamu.\n"
"Obrazový záznam nelze pÅesunout."
-#: editor_drag.cc:2679
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr "ZaÄátek obrazového záznamu:"
-#: editor_drag.cc:2681
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr "RozdÃly:"
-#: editor_drag.cc:2703
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr "Posunout obrazový záznam"
-#: editor_drag.cc:3212
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "Pohnout znaÄkou druhu taktu"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "KopÃrovat znaÄku druhu taktu"
-#: editor_drag.cc:3220
-msgid "move meter mark"
-msgstr "Pohnout znaÄkou druhu taktu"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3308
+#: editor_drag.cc:3324
msgid "move tempo mark"
msgstr "Posunout znaÄku tempa"
-#: editor_drag.cc:3345
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "KopÃrovat znaÄku tempa"
-#: editor_drag.cc:3609
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "ZmÄnit délku postupného zesÃlenà signálu"
-#: editor_drag.cc:3734
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "ZmÄnit délku postupného slábnutà signálu"
-#: editor_drag.cc:4110
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "Pohnout znaÄkou"
-#: editor_drag.cc:4373 editor_drag.cc:5694
+#: editor_drag.cc:4506 editor_drag.cc:5833
msgid "automation range move"
msgstr "Pohybovat rozsahem automatizace"
-#: editor_drag.cc:4747
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr "PÅi provádÄnà operace protáhnutà Äasu se vyskytla chyba"
-#: editor_drag.cc:5208
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr "Chyba v programovánÃ: %1"
-#: editor_drag.cc:5277 editor_drag.cc:5287
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr "Nová znaÄka skoku"
-#: editor_drag.cc:5278
+#: editor_drag.cc:5421
msgid "skip"
msgstr "PÅeskoÄit"
-#: editor_drag.cc:5282 location_ui.cc:58
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5283
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr "Nová znaÄka na CD"
-#: editor_drag.cc:5288 editor_route_groups.cc:438 mixer_ui.cc:1593
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "Bez názvu"
-#: editor_drag.cc:5601
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr "Taženà rozsahem automatizace vytvoÅeno pro neplatný typ oblasti"
@@ -5155,7 +5446,7 @@ msgstr "Barva karty skupiny"
msgid "Name of Group"
msgstr "Název skupiny"
-#: editor_route_groups.cc:99 editor_routes.cc:209
+#: editor_route_groups.cc:99 editor_routes.cc:234
msgid "Visible|V"
msgstr "V"
@@ -5187,9 +5478,9 @@ msgstr "Pom"
msgid "Relative Gain Changes?"
msgstr "ZmÄny pomÄrného zesÃlenÃ?"
-#: editor_route_groups.cc:103 editor_regions.cc:124 editor_routes.cc:213
-#: mixer_strip.cc:2131 meter_strip.cc:367 route_time_axis.cc:2750
-#: time_axis_view.cc:1199
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
msgid "Mute|M"
msgstr "Z"
@@ -5197,8 +5488,9 @@ msgstr "Z"
msgid "Sharing Mute?"
msgstr "SdÃlenà ztlumenÃ?"
-#: editor_route_groups.cc:104 editor_routes.cc:214 mixer_strip.cc:2144
-#: meter_strip.cc:375 route_time_axis.cc:2747
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
msgid "Solo|S"
msgstr "S"
@@ -5206,8 +5498,8 @@ msgstr "S"
msgid "Sharing Solo?"
msgstr "SdÃlenà sóla?"
-#: editor_route_groups.cc:105 midi_time_axis.cc:1630 midi_time_axis.cc:1633
-#: midi_time_axis.cc:1636
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Nahr"
@@ -5231,7 +5523,7 @@ msgstr "Výb"
msgid "Sharing Selected/Editing Status?"
msgstr "SdÃlenà stavu vybráno/úpravy?"
-#: editor_route_groups.cc:108 editor_routes.cc:210
+#: editor_route_groups.cc:108 editor_routes.cc:235
msgid "Active|A"
msgstr "Ä"
@@ -5239,13 +5531,13 @@ msgstr "Ä"
msgid "Sharing Active Status?"
msgstr "SdÃlenà Äinného stavu?"
-#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2248
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
"Chyba v programovánÃ: položka plátna znaÄka nemá žádný ukazatel objektu "
@@ -5275,20 +5567,20 @@ msgstr "Konec"
msgid "mark"
msgstr "ZnaÄka"
-#: editor_markers.cc:650 editor_ops.cc:2102 editor_ops.cc:2124
-#: editor_ops.cc:2240 editor_ops.cc:2277 location_ui.cc:1025
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "PÅidat znaÄku"
-#: editor_markers.cc:682 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "Nastavit rozsah smyÄky"
-#: editor_markers.cc:698 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "Nastavit rozsah pÅepsánÃ"
-#: editor_markers.cc:715 editor_ops.cc:4092
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "Rozsah"
@@ -5296,108 +5588,137 @@ msgstr "Rozsah"
msgid "new range marker"
msgstr "Nová znaÄka rozsahu"
-#: editor_markers.cc:751 editor_ops.cc:2208 location_ui.cc:861
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "Odstranit znaÄky"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "Ukazatele polohy postavit sem"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "PÅehrávat od tohoto bodu"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "Posunout znaÄku k ukazateli polohy"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "VytvoÅit rozsah až k dalšà znaÄce"
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr "UmÃstit ke znaÄce"
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr "PÅehrávat od znaÄky"
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr "Nastavit znaÄku od ukazatele polohy"
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr "Nastavit rozsah z výbÄru"
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Skrýt rozsah"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "PÅejmenovat rozsah..."
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Odstranit rozsah"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "RozdÄlit oblasti na hranicÃch rozsahů"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Vybrat rozsah"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Nastavit rozsah pÅepsánÃ"
-#: editor_markers.cc:1407 editor_ops.cc:2057
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Nový název:"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "PÅejmenovat znaÄku"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "PÅejmenovat rozsah"
-#: editor_markers.cc:1419 editor_mouse.cc:2265 processor_box.cc:2370
-#: processor_box.cc:2837 route_time_axis.cc:1112 route_ui.cc:1616
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "PÅejmenovat"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "PÅejmenovat znaÄku"
-#: editor_mixer.cc:91
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
"Tato obrazovka nenà dostateÄnÄ velká na to, aby zobrazila smÄÅ¡ovaÄ editoru"
-#: editor_mouse.cc:1343 editor_mouse.cc:1361 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
"Chyba v programovánÃ: položka plátna znaÄka tempa nemá žádný ukazatel "
"objektu znaÄky!"
-#: editor_mouse.cc:1348 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr "Chyba v programovánÃ: znaÄka pro tempo nenà znaÄkou tempa!"
-#: editor_mouse.cc:1366 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr "Chyba v programovánÃ: znaÄka druhu taktu nenà znaÄkou druhu taktu!"
-#: editor_mouse.cc:2013 editor_mouse.cc:2038 editor_mouse.cc:2051
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
@@ -5405,179 +5726,183 @@ msgstr ""
"Chyba v programovánÃ: položka plátna mÃsto ovládánà nemá žádný ukazatel "
"objektu mÃsta ovládánÃ!"
-#: editor_mouse.cc:2186
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr "UstÅihnout poÄáteÄnà bod"
-#: editor_mouse.cc:2211
+#: editor_mouse.cc:2218
msgid "end point trim"
msgstr "UstÅihnout koncový bod"
-#: editor_mouse.cc:2263
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Název oblasti:"
-#: editor_ops.cc:167
+#: editor_ops.cc:168
msgid "split"
msgstr "RozdÄlit"
-#: editor_ops.cc:341
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "ZmÄnit výbÄr"
-#: editor_ops.cc:383
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "PostrÄit oblasti o krok dopÅedu"
-#: editor_ops.cc:437 editor_ops.cc:528
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "PostrÄit polohu o krok dopÅedu"
-#: editor_ops.cc:468
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "PostrÄit oblasti o krok dozadu"
-#: editor_ops.cc:560
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "PostrÄit o krok dopÅedu"
-#: editor_ops.cc:584
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr "PostrÄit o krok dozadu"
-#: editor_ops.cc:649
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr "Åadit oblasti vedle sebe"
-#: editor_ops.cc:711
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "build_region_boundary_cache byla volána snap_type = %1"
-#: editor_ops.cc:2059
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "Nová znaÄka polohy"
-#: editor_ops.cc:2150 editor_ops.cc:2174
+#: editor_ops.cc:2212 editor_ops.cc:2236
msgid "Set session start"
msgstr "Nastavit zaÄátek sezenÃ"
-#: editor_ops.cc:2240
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "PÅidat znaÄky"
-#: editor_ops.cc:2336
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "Smazat znaÄky"
-#: editor_ops.cc:2351
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "Smazat rozsahy"
-#: editor_ops.cc:2367
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "Smazat polohy"
-#: editor_ops.cc:2430
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "Vložit oblast"
-#: editor_ops.cc:2621
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "Pozvednout oblasti nahoru"
-#: editor_ops.cc:2623
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "Pozvednout oblast nahoru"
-#: editor_ops.cc:2629
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "Pozvednout oblasti úplnÄ nahoru"
-#: editor_ops.cc:2631
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "Pozvednout oblast úplnÄ nahoru"
-#: editor_ops.cc:2637
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "Dát oblasti dolů"
-#: editor_ops.cc:2639 editor_ops.cc:2647
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "Dát oblast dolů"
-#: editor_ops.cc:2645
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "Dát oblasti zcela dolů"
-#: editor_ops.cc:2730
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "PÅejmenovat oblast"
-#: editor_ops.cc:2732 processor_box.cc:2368 route_ui.cc:1614
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr "Nový název:"
-#: editor_ops.cc:3030
+#: editor_ops.cc:3097
msgid "separate"
msgstr "RozdÄlit"
-#: editor_ops.cc:3142
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "RozdÄlit oblast pod"
-#: editor_ops.cc:3294
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "UstÅihnout na výbÄru"
-#: editor_ops.cc:3376
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "UrÄit bod zapadnutÃ"
-#: editor_ops.cc:3400
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "Odstranit bod zapadnutà oblasti"
-#: editor_ops.cc:3422
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "Posunout oblasti na původnà polohu"
-#: editor_ops.cc:3424
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "Posunout oblast na původnà polohu"
-#: editor_ops.cc:3445
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "Zarovnat výbÄr"
-#: editor_ops.cc:3519
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "Zarovnat výbÄr pomÄrnÄ"
-#: editor_ops.cc:3553
+#: editor_ops.cc:3619
msgid "align region"
msgstr "Zarovnat oblast"
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "UstÅihnout vpÅedu"
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "UstÅihnout vzadu"
-#: editor_ops.cc:3634
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "Zkrátit na oblast smyÄky"
-#: editor_ops.cc:3644
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "Zkrátit na oblast pÅepsánÃ"
-#: editor_ops.cc:3766
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "Zkrátit na oblast"
-#: editor_ops.cc:3825
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5589,11 +5914,11 @@ msgstr ""
"Obvykle je to způsobeno pÅÃdavnými moduly, jež vytváÅejà stereo výstup z "
"monofonnÃho vstupu nebo naopak."
-#: editor_ops.cc:3828
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "Nelze zmrazit"
-#: editor_ops.cc:3834
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5608,23 +5933,23 @@ msgstr ""
"\n"
"Zmrazenà jen zpracuje signál až k prvnÃmu poslánÃ/vloženÃ/vrácenÃ."
-#: editor_ops.cc:3838
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "PÅesto zmrazit"
-#: editor_ops.cc:3839
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr "Nemrazit"
-#: editor_ops.cc:3840
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "Omezenà zmraženÃ"
-#: editor_ops.cc:3855
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "ZruÅ¡it zmrazenÃ"
-#: editor_ops.cc:3885
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5637,47 +5962,47 @@ msgstr ""
"\n"
"Můžete to udÄlat bez zpracovánÃ, což je odliÅ¡ná operace."
-#: editor_ops.cc:3889
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr "Nelze vyhodit"
-#: editor_ops.cc:3940
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "Vrazit rozsah"
-#: editor_ops.cc:4007
+#: editor_ops.cc:4074
msgid "delete"
msgstr "Smazat"
-#: editor_ops.cc:4010
+#: editor_ops.cc:4077
msgid "cut"
msgstr "Vyjmout"
-#: editor_ops.cc:4013
+#: editor_ops.cc:4080
msgid "copy"
msgstr "KopÃrovat"
-#: editor_ops.cc:4016
+#: editor_ops.cc:4083
msgid "clear"
msgstr "Vyprázdnit"
-#: editor_ops.cc:4065
+#: editor_ops.cc:4132
msgid "objects"
msgstr "PÅedmÄty"
-#: editor_ops.cc:4275 editor_ops.cc:4360
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "Odstranit oblast"
-#: editor_ops.cc:4787
-msgid "duplicate selection"
-msgstr "Zdvojit výbÄr"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4873
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "PostrÄit stopu"
-#: editor_ops.cc:4900
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5685,156 +6010,156 @@ msgstr ""
"Opravdu chcete zrušit poslednà nahrávku?\n"
"(Toto nelze vrátit zpÄt!)"
-#: editor_ops.cc:4903 editor_ops.cc:7127 editor_regions.cc:466
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Ne, nedÄlat nic."
-#: editor_ops.cc:4904
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Ano, odstranit."
-#: editor_ops.cc:4906
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "ZniÄit poslednà nahrávku"
-#: editor_ops.cc:4982
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "Normalizovat"
-#: editor_ops.cc:5080
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "Obrátit oblasti"
-#: editor_ops.cc:5116
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "Odstranit ticho"
-#: editor_ops.cc:5197
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "Rozdvojit oblast(i)"
-#: editor_ops.cc:5204
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr "NepodaÅilo se zruÅ¡it odkaz %1"
-#: editor_ops.cc:5465
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "Nastavit sÃlu hlasitosti v oblasti znovu"
-#: editor_ops.cc:5523
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr "KÅivka sÃly zvuku v oblasti Äinná"
-#: editor_ops.cc:5548
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "PÅepnout zámek oblasti"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr "PÅepnout zámek obrazového záznamu"
-#: editor_ops.cc:5596
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "Styl zámku oblasti"
-#: editor_ops.cc:5621
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "ZmÄnit neprůhlednost oblasti"
-#: editor_ops.cc:5714
+#: editor_ops.cc:5781
msgid "fade range"
msgstr "ProlÃnat oblast"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "ZmÄnit délku postupného zesÃlenà signálu"
-#: editor_ops.cc:5759
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "ZmÄnit délku postupného zeslabenà signálu"
-#: editor_ops.cc:5824
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "Upravit tvar kÅivky postupného zesÃlenà signálu"
-#: editor_ops.cc:5859
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "Upravit tvar kÅivky postupného zeslabenà signálu"
-#: editor_ops.cc:5895
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "Spustit postupné zesÃlenà signálu"
-#: editor_ops.cc:5929
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "Spustit postupné zeslabenà signálu"
-#: editor_ops.cc:5989
+#: editor_ops.cc:6056
msgid "toggle fade active"
msgstr "Zapnout prolÃnánÃ"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "Nastavit rozsah smyÄky z výbÄru"
-#: editor_ops.cc:6193
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "Nastavit rozsah smyÄky z oblasti"
-#: editor_ops.cc:6212
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "Nastavit rozsah pÅepsánà z výbÄru"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr "Nastavit zaÄátek/konec sezenà z výbÄru"
-#: editor_ops.cc:6272
+#: editor_ops.cc:6344
msgid "set punch start from EP"
msgstr "Nastavit zaÄátek pÅepsánà z pracovnÃho bodu"
-#: editor_ops.cc:6300
+#: editor_ops.cc:6372
msgid "set punch end from EP"
msgstr "Nastavit konec pÅepsánà z pracovnÃho bodu"
-#: editor_ops.cc:6333
+#: editor_ops.cc:6405
msgid "set loop start from EP"
msgstr "Nastavit zaÄátek smyÄky z pracovnÃho bodu"
-#: editor_ops.cc:6361
+#: editor_ops.cc:6433
msgid "set loop end from EP"
msgstr "Nastavit konec smyÄky z pracovnÃho bodu"
-#: editor_ops.cc:6372
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "Nastavit rozsah pÅepsánà z oblasti"
-#: editor_ops.cc:6457
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "PÅidat novou znaÄku"
-#: editor_ops.cc:6458
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "Nastavit celkové tempo"
-#: editor_ops.cc:6461
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "Vymezit jeden takt"
-#: editor_ops.cc:6462
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr "Chcete stanovit celkové tempo, nebo pÅidat novou znaÄku tempa?"
-#: editor_ops.cc:6488
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "Nastavit tempo podle oblasti"
-#: editor_ops.cc:6518
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "RozdÄlit oblasti"
-#: editor_ops.cc:6560
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5846,11 +6171,11 @@ msgstr ""
"do %2 kusů.\n"
"Toto by mohlo trvat velmi dlouho."
-#: editor_ops.cc:6567
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr "Volánà po slÃdilovi!"
-#: editor_ops.cc:6568
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5858,52 +6183,52 @@ msgstr ""
"StisknÄte OK kvůli pokraÄovánà v této operaci rozdÄlenÃ\n"
"nebo se pokuste v oknÄ slÃdilovÄ vyladit rozbor."
-#: editor_ops.cc:6570
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr "StisknÄte OK kvůli pokraÄovánà v této operaci rozdÄlenÃ"
-#: editor_ops.cc:6573
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "NadmÄrné rozdÄlenÃ?"
-#: editor_ops.cc:6725
+#: editor_ops.cc:6800
msgid "place transient"
msgstr "UmÃstit pÅechod"
-#: editor_ops.cc:6760
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "Zapadnout oblasti do mÅÞky"
-#: editor_ops.cc:6799
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr "ZavÅÃt mezery oblastÃ"
-#: editor_ops.cc:6804
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "Délka prolÃnánÃ"
-#: editor_ops.cc:6813 editor_ops.cc:6824 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr "ms"
-#: editor_ops.cc:6815
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr "Délka ustoupenÃ"
-#: editor_ops.cc:6828
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr "OK"
-#: editor_ops.cc:6843
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr "ZavÅÃt mezery oblastÃ"
-#: editor_ops.cc:7085
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "To by byly nepÅÃjemné zprávy..."
-#: editor_ops.cc:7090
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5919,19 +6244,19 @@ msgstr ""
"upravte svůj soubor ardour.rc, kde nastavte volbu\n"
"\"allow-special-bus-removal\" na \"yes\""
-#: editor_ops.cc:7106 route_ui.cc:2009
+#: editor_ops.cc:7181
msgid "track"
msgid_plural "tracks"
msgstr[0] "Stopa"
msgstr[1] "%1 skladby"
-#: editor_ops.cc:7107 route_ui.cc:2009
+#: editor_ops.cc:7182
msgid "bus"
msgid_plural "busses"
msgstr[0] "SbÄrnice"
msgstr[1] "Busse"
-#: editor_ops.cc:7111
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5943,7 +6268,7 @@ msgstr ""
"\n"
"Tento krok nelze vrátit zpÄt, a soubor se sezenÃm bude pÅepsán!"
-#: editor_ops.cc:7116
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5955,7 +6280,7 @@ msgstr ""
"\n"
"Tento krok nelze vrátit zpÄt, a soubor se sezenÃm bude pÅepsán!"
-#: editor_ops.cc:7122
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5965,149 +6290,145 @@ msgstr ""
"\n"
"Tento krok nelze vrátit zpÄt, a soubor se sezenÃm bude pÅepsán"
-#: editor_ops.cc:7129
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "Ano, odstranit."
-#: editor_ops.cc:7131 editor_snapshots.cc:172
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Ano, odstranit."
-#: editor_ops.cc:7136 editor_ops.cc:7138
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "Odstranit %1"
-#: editor_ops.cc:7240 editor_ops.cc:7254 editor_ops.cc:7294 editor_ops.cc:7304
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "Vložit ticho"
-#: editor_ops.cc:7357
+#: editor_ops.cc:7436
msgid "Cannot insert or delete time when in Lock edit."
msgstr "Nelze vložit nebo smazat Äas v režimu zámku úprav."
-#: editor_ops.cc:7377 editor_ops.cc:7389 editor_ops.cc:7462
-msgid "cut time"
-msgstr "Vyjmout Äas"
-
-#: editor_ops.cc:7475
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
msgid "remove time"
msgstr "Odstranit Äas"
-#: editor_ops.cc:7549
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
"Bylo vybráno pÅÃliÅ¡ mnoho stop, než aby se vÅ¡echny veÅ¡ly do nynÄjÅ¡Ãho okna"
-#: editor_ops.cc:7610
+#: editor_ops.cc:7689
msgid "Sel"
msgstr "Výb"
-#: editor_ops.cc:7649
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr "Uložen pohled %u"
-#: editor_ops.cc:7674
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "Ztišit oblasti"
-#: editor_ops.cc:7676
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "Ztišit oblast"
-#: editor_ops.cc:7713
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "Spojit oblasti"
-#: editor_ops.cc:7751
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr "ZruÅ¡it spojenà oblastÃ"
-#: editor_ops.cc:7788
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr "%1: Uzamknuto"
-#: editor_ops.cc:7795
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr "KlepnÄte pro odemknutÃ"
-#: editor_ops.cc:7844
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr "PÅesunujà se vložené soubory do složky se sezenÃm"
-#: editor_regions.cc:115
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr "Název oblasti s poÄtem kanálů v hranatých závorkách []"
-#: editor_regions.cc:116
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "Poloha zaÄátku oblasti"
-#: editor_regions.cc:117 editor_regions.cc:863 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "Konec"
-#: editor_regions.cc:117
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "Poloha konce oblasti"
-#: editor_regions.cc:118
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "Délka oblasti"
-#: editor_regions.cc:119
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr "Poloha seÅizovacÃho bodu oblasti, pomÄrná k zaÄátku oblasti"
-#: editor_regions.cc:120
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
"Délka postupného zesÃlenà signálu oblasti (jednotky: vedlejšà hodiny), (), "
"pokud je zakázáno"
-#: editor_regions.cc:121
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
"Délka postupného zeslabenà signálu oblasti (jednotky: vedlejšà hodiny), (), "
"pokud je zakázáno"
-#: editor_regions.cc:122
+#: editor_regions.cc:166
msgid "Lock|L"
msgstr "Zám"
-#: editor_regions.cc:122
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "Poloha oblasti zamknuta?"
-#: editor_regions.cc:123
+#: editor_regions.cc:167
msgid "Gain|G"
msgstr "Zes"
-#: editor_regions.cc:123
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr "Poloha oblasti pÅilepena k taktům|dobám?"
-#: editor_regions.cc:124
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "Oblast ztlumena?"
-#: editor_regions.cc:125
+#: editor_regions.cc:169
msgid "Opaque|O"
msgstr "Nepr"
-#: editor_regions.cc:125
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr "Oblast neprůhledná (blokuje oblasti pod sebou, aby byly slyšeny)?"
-#: editor_regions.cc:315 editor_regions.cc:320 editor_regions.cc:322
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Skrytý"
-#: editor_regions.cc:395
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr "(CHYBÃ) "
-#: editor_regions.cc:463
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -6115,119 +6436,131 @@ msgstr ""
"Opravdu chcete odstranit nepoužÃvané oblasti?\n"
"(Toto je niÄivé a nelze to vrátit zpÄt)"
-#: editor_regions.cc:467
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "Ano, odstranit."
-#: editor_regions.cc:469
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "Odstranit nepoužÃvané oblasti"
-#: editor_regions.cc:698
+#: editor_regions.cc:735
msgid "EditorRegions::format_position: negative timecode position: %1"
msgstr "EditorRegions::format_position: Záporná poloha Äasového kódu: %1"
-#: editor_regions.cc:828 editor_regions.cc:844 editor_regions.cc:858
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "VÃce"
-#: editor_regions.cc:861 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "Spustit"
-#: editor_regions.cc:879 editor_regions.cc:895
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "VÃce"
-#: editor_regions.cc:964
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "(CHYBÃ) "
-#: editor_routes.cc:184
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr "SS"
-#: editor_routes.cc:208
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "Název stopy/sbÄrnice"
-#: editor_routes.cc:209
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "Stopa/SbÄrnice viditelná?"
-#: editor_routes.cc:210
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "Stopa/SbÄrnice Äinná?"
-#: editor_routes.cc:211
+#: editor_routes.cc:236
msgid "MidiInput|I"
msgstr "MidiInput|I"
-#: editor_routes.cc:211
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "Vstup MIDI povolen"
-#: editor_routes.cc:212
+#: editor_routes.cc:237
msgid "Rec|R"
msgstr "Rec|Nahr"
-#: editor_routes.cc:212
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "Nahrávánà povoleno"
-#: editor_routes.cc:213
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "Ztlumeno"
-#: editor_routes.cc:214
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "Sólo"
-#: editor_routes.cc:215
+#: editor_routes.cc:241
msgid "SoloIso|SI"
msgstr "SoloIso|SamS"
-#: editor_routes.cc:215
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "Samostatné sólo"
-#: editor_routes.cc:216
+#: editor_routes.cc:242
msgid "SoloLock|SS"
msgstr "SoloLock|ZamS"
-#: editor_routes.cc:216
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "ZajiÅ¡tÄné sólo (zamknuto)"
-#: editor_routes.cc:486 mixer_ui.cc:1259
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Skrýt vše"
-#: editor_routes.cc:487 mixer_ui.cc:1260
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Ukázat všechny zvukové stopy"
-#: editor_routes.cc:488 mixer_ui.cc:1261
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Skrýt všechny zvukové stopy"
-#: editor_routes.cc:489 mixer_ui.cc:1262
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Ukázat vÅ¡echny zvukové sbÄrnice"
-#: editor_routes.cc:490 mixer_ui.cc:1263
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Skrýt vÅ¡echny zvukové sbÄrnice"
-#: editor_routes.cc:491 mixer_ui.cc:1264
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "Ukázat všechny MIDI stopy"
-#: editor_routes.cc:492 mixer_ui.cc:1265
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "Skrýt všechny MIDI stopy"
-#: editor_routes.cc:493
+#: editor_routes.cc:557
msgid "Only Show Tracks with Regions Under Playhead"
msgstr "Ukázat jen stopy s oblastmi pod ukazatelem polohy pÅehrávánÃ"
@@ -6271,7 +6604,7 @@ msgstr "Nová znaÄka stopy na CD"
msgid "New Tempo"
msgstr "Vložit zmÄnu rychlosti/tempa..."
-#: editor_rulers.cc:238 tempo_dialog.cc:315
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Nový druh taktu"
@@ -6295,31 +6628,35 @@ msgstr ""
msgid "Remove snapshot"
msgstr "Odstranit snÃmek"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "PÅidat"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "PÅidat znaÄku zmÄny tempa"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "PÅidat"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "PÅidat znaÄku zmÄny taktu"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "Hotovo"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "Nahradit znaÄku zmÄny tempa"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "Odstranit znaÄku zmÄny tempa"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -6334,7 +6671,7 @@ msgstr "Protáhnout/Zmenšit"
msgid "pitch shift"
msgstr "Posun výšky tónu"
-#: editor_timefx.cc:304
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
"Protáhnutà Äasu (timefx) nemohlo být provedeno - PÅi vytváÅenà vlákna doÅ¡lo "
@@ -6352,27 +6689,31 @@ msgstr "Nastavenà zaÅÃzenà MIDI"
msgid "Refresh Devices"
msgstr "Obnovit seznam zaÅÃzenÃ"
-#: engine_dialog.cc:90 engine_dialog.cc:2923
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr "ZmÄÅit"
-#: engine_dialog.cc:91
+#: engine_dialog.cc:92
msgid "Use results"
msgstr "PoužÃt výsledky"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr "ZpÄt na nastavenÃ... (pÅehlÞet výsledky)"
-#: engine_dialog.cc:93
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr "PÅesnÄ nastavit zvuk"
-#: engine_dialog.cc:97
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr "ZpÄt na nastavenÃ"
-#: engine_dialog.cc:118
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
@@ -6382,11 +6723,11 @@ msgstr ""
"\n"
"(Jde tu o chybu pÅekladaÄe/balÃÄkovánÃ/systému a nemÄlo k tomu nikdy dojÃt.)"
-#: engine_dialog.cc:143
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr "Nástroj pro mÄÅenà prodlevy"
-#: engine_dialog.cc:155
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
@@ -6394,97 +6735,97 @@ msgstr ""
"<span weight=\"bold\">StáhnÄte hlasitost svého zvukového zaÅÃzenà na velmi "
"nÃzkou úroveÅ.</span>"
-#: engine_dialog.cc:164
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr "Vyberte nÞe dva kanály a propojte je pomocà kabelu."
-#: engine_dialog.cc:169
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr "Výstupnà kanál"
-#: engine_dialog.cc:177
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr "Vstupnà kanál"
-#: engine_dialog.cc:211
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "Jakmile budou kanály propojeny, klepnÄte na tlaÄÃtko ZmÄÅit."
-#: engine_dialog.cc:218
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr "Až budete spokojeni s výsledky, klepnÄte na tlaÄÃtko PoužÃt výsledky."
-#: engine_dialog.cc:233 engine_dialog.cc:3058 engine_dialog.cc:3068
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr "ZatÃm žádné výsledky mÄÅenÃ"
-#: engine_dialog.cc:243 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Prodleva"
-#: engine_dialog.cc:497
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr "Zvukový systém:"
-#: engine_dialog.cc:540
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "OvladaÄ:"
-#: engine_dialog.cc:547
+#: engine_dialog.cc:571
msgid "Input Device:"
msgstr "Vstupnà zaÅÃzenÃ:"
-#: engine_dialog.cc:551
+#: engine_dialog.cc:575
msgid "Output Device:"
msgstr "Výstupnà zaÅÃzenÃ:"
-#: engine_dialog.cc:558
+#: engine_dialog.cc:582
msgid "Device:"
msgstr "ZaÅÃzenÃ:"
-#: engine_dialog.cc:567 engine_dialog.cc:681 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "Vzorkovacà kmitoÄet:"
-#: engine_dialog.cc:573 engine_dialog.cc:688
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "Velikost vyrovnávacà pamÄti:"
-#: engine_dialog.cc:582
+#: engine_dialog.cc:606
msgid "Periods:"
msgstr "Periody:"
-#: engine_dialog.cc:600
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr "Vstupnà kanály:"
-#: engine_dialog.cc:613
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr "Výstupnà kanály:"
-#: engine_dialog.cc:625
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "Vstupnà prodleva technického vybavenà poÄÃtaÄe:"
-#: engine_dialog.cc:628 engine_dialog.cc:641
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "Vzorky"
-#: engine_dialog.cc:638
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "Výstupnà prodleva technického vybavenà poÄÃtaÄe:"
-#: engine_dialog.cc:649
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr "Systém MIDI:"
-#: engine_dialog.cc:673
+#: engine_dialog.cc:691
msgid ""
"%1 is already running. %2 will connect to it and use the existing settings."
msgstr "%1 již bÄžÃ. %2 se k nÄmu pÅipojà a použije stávajÃcà nastavenÃ."
-#: engine_dialog.cc:726
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
@@ -6494,7 +6835,7 @@ msgstr ""
"\n"
"PÅesné zmÄÅenà prodlevy vyžaduje pracujÃcà rozhranà pro zvuk."
-#: engine_dialog.cc:732
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6505,155 +6846,162 @@ msgstr ""
"PÅesné zmÄÅenà prodlevy vyžaduje obousmÄrný provoz - soubÄžné pÅehrávánà a "
"zachytávánÃ"
-#: engine_dialog.cc:938
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr "ZaÅÃzenà MIDI"
-#: engine_dialog.cc:944
+#: engine_dialog.cc:971
msgid "Device"
msgstr "ZaÅÃzenÃ"
-#: engine_dialog.cc:946
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr "Prodlevy technického vybavenÃ"
-#: engine_dialog.cc:987
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr "PÅesnÄ nastavit"
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr "všechny dostupné kanály"
-#: engine_dialog.cc:1576 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "Vzorek"
-msgstr[1] "vzorky"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 vzorek"
+msgstr[1] "%1 vzorků"
-#: engine_dialog.cc:1640
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr "(%.1f ms)"
-#: engine_dialog.cc:2371
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr "NepodaÅilo se spustit stroj podpůrné vrstvy %1"
-#: engine_dialog.cc:2403
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr "Nelze nastavit ovladaÄ na %1"
-#: engine_dialog.cc:2408
+#: engine_dialog.cc:2450
msgid "Cannot set input device name to %1"
msgstr "Nelze nastavit název vstupnÃho zaÅÃzenà na %1"
-#: engine_dialog.cc:2412
+#: engine_dialog.cc:2454
msgid "Cannot set output device name to %1"
msgstr "Nelze nastavit název výstupnÃho zaÅÃzenà na %1"
-#: engine_dialog.cc:2417
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr "Nelze nastavit název zaÅÃzenà na %1"
-#: engine_dialog.cc:2422
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr "Nelze nastavit vzorkovacà kmitoÄet na %1"
-#: engine_dialog.cc:2426
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr "Nelze nastavit velikost vyrovnávacà pamÄti na %1"
-#: engine_dialog.cc:2430
+#: engine_dialog.cc:2472
msgid "Cannot set periods to %1"
msgstr "Nelze nastavit periody na %1"
-#: engine_dialog.cc:2436
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr "Nelze nastavit vstupnà kanály na %1"
-#: engine_dialog.cc:2440
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr "Nelze nastavit výstupnà kanály na %1"
-#: engine_dialog.cc:2446
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr "Nelze nastavit vstupnà prodlevu na %1"
-#: engine_dialog.cc:2450
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr "Nelze nastavit výstupnà prodlevu na %1"
-#: engine_dialog.cc:2781 engine_dialog.cc:2840
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr "NezjiÅ¡tÄn žádný signál"
-#: engine_dialog.cc:2794 engine_dialog.cc:2848 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "Odpojeno od zvukového stroje"
-#: engine_dialog.cc:2803 engine_dialog.cc:2856
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr "Objevena zpáteÄnà prodleva: "
-#: engine_dialog.cc:2805 engine_dialog.cc:2858
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr "Systémová prodleva: "
-#: engine_dialog.cc:2812
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr "(Chyba pÅi rozpoznávánà signálu)"
-#: engine_dialog.cc:2818
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr "(obráceno - Å¡patné kabelovánÃ)"
-#: engine_dialog.cc:2865
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr "(průmÄrný)"
-#: engine_dialog.cc:2871
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr "(pÅÃliÅ¡ velké chvÄnÃ)"
-#: engine_dialog.cc:2875
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr "(velké chvÄnÃ)"
-#: engine_dialog.cc:2887
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr "PÅekroÄenà Äasu - velký neklid MIDI"
-#: engine_dialog.cc:2903 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "Zjišťuje se..."
-#: engine_dialog.cc:3004
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr "Odpojit od %1"
-#: engine_dialog.cc:3009
+#: engine_dialog.cc:3086
msgid "Running"
msgstr "BÄžÃ"
-#: engine_dialog.cc:3011
+#: engine_dialog.cc:3088
msgid "Connected"
msgstr "PÅipojeno"
-#: engine_dialog.cc:3022
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr "PÅipojit k %1"
-#: engine_dialog.cc:3026 shuttle_control.cc:614
+#: engine_dialog.cc:3103 shuttle_control.cc:655
msgid "Stopped"
msgstr "Zastaveno"
-#: export_channel_selector.cc:51 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Kanály:"
-#: export_channel_selector.cc:52
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "RozdÄlit na monofonnà soubory"
@@ -6661,63 +7009,63 @@ msgstr "RozdÄlit na monofonnà soubory"
msgid "Bus or Track"
msgstr "SbÄrnice nebo stopa"
-#: export_channel_selector.cc:473
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "Obsah oblasti bez slábnutà ani sÃla hlasitost oblasti (kanály: %1)"
-#: export_channel_selector.cc:477
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "Obsah oblasti se slábnutÃm a sÃla hlasitost oblasti (kanály: %1)"
-#: export_channel_selector.cc:481
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr "Výstup stopy (kanály: %1)"
-#: export_channel_selector.cc:550
+#: export_channel_selector.cc:552
msgid "Apply track/bus processing"
msgstr "PoužÃt zpracovánà stopy/sbÄrnice"
-#: export_channel_selector.cc:551
+#: export_channel_selector.cc:553
msgid "Select all tracks"
msgstr "Vybrat všechny stopy"
-#: export_channel_selector.cc:552
+#: export_channel_selector.cc:554
msgid "Select all busses"
msgstr "Vybrat vÅ¡echny sbÄrnice"
-#: export_channel_selector.cc:553
+#: export_channel_selector.cc:555
msgid "Deselect all"
msgstr "OdznaÄit vÅ¡e"
-#: export_channel_selector.cc:587
+#: export_channel_selector.cc:589
msgid "Track name"
msgstr "Název stopy"
-#: export_dialog.cc:46
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
"<span color=\"#ffa755\">NÄkteré již jsoucà soubory budou pÅepsány.</span>"
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr "Vypsat soubory"
-#: export_dialog.cc:156 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr "Souborový formát"
-#: export_dialog.cc:157 export_timespan_selector.cc:371
+#: export_dialog.cc:159 export_timespan_selector.cc:371
#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr "Äasové rozpÄtÃ"
-#: export_dialog.cc:158
+#: export_dialog.cc:160
msgid "Channels"
msgstr "Kanály"
-#: export_dialog.cc:180
+#: export_dialog.cc:182
msgid ""
"Export has been aborted due to an error!\n"
"See the Log for details."
@@ -6725,39 +7073,51 @@ msgstr ""
"Vyvedenà bylo pÅeruÅ¡eno kvůli chybÄ!\n"
"Na podrobnosti se podÃvejte do zápisu."
-#: export_dialog.cc:249
+#: export_dialog.cc:251
msgid "Files that will be overwritten"
msgstr "Soubory, které budou pÅepsány"
-#: export_dialog.cc:294
+#: export_dialog.cc:296
msgid "Export initialization failed: %1"
msgstr "Inicializace vyvedenà se nezdaÅila: %1"
-#: export_dialog.cc:304
+#: export_dialog.cc:306
msgid "Stop Export"
msgstr "Zastavit vyvedenÃ"
-#: export_dialog.cc:325
+#: export_dialog.cc:336
msgid "export"
msgstr "Vyvést"
-#: export_dialog.cc:344
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Vyvádà se '%3' (Äasové rozpÄtà %1 z %2)"
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr "Normalizuje se '%3' (Äasové rozpÄtà %1 z %2)"
-#: export_dialog.cc:348
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Vyvádà se '%3' (Äasové rozpÄtà %1 z %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
-#: export_dialog.cc:371 export_dialog.cc:373
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">Chyba: "
-#: export_dialog.cc:383
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">VarovánÃ: "
-#: export_dialog.cc:385
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6765,19 +7125,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">VarovánÃ: "
-#: export_dialog.cc:409
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr "Vyvést výbÄr"
-#: export_dialog.cc:423
+#: export_dialog.cc:453
msgid "Export Region"
msgstr "Vyvést oblast"
-#: export_dialog.cc:432
+#: export_dialog.cc:462
msgid "Source"
msgstr "Zdroj"
-#: export_dialog.cc:448
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr "Zastavit vyvedenÃ"
@@ -6785,65 +7145,77 @@ msgstr "Zastavit vyvedenÃ"
msgid "Add another format"
msgstr "PÅidat dalšà formát"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Formát"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Poloha"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr "Nahrát na Soundcloud"
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "Žádný formát"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "Formát %1: %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "Å tÃtek:"
-#: export_filename_selector.cc:33 session_dialog.cc:310
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "Název sezenÃ"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "ZmÄna:"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Složka:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
#: video_server_dialog.cc:56 export_video_dialog.cc:77
#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Procházet"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Názvy souborů sestavit z tÄchto souÄástÃ:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
-#: export_filename_selector.cc:208
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
"<small><i>PromiÅte. PrávÄ teÄ nelze ukázat žádný pÅÃklad názvu souboru</i></"
"small>"
-#: export_filename_selector.cc:210
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>NynÄjšà (pÅibližný) název souboru: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
-#: export_filename_selector.cc:246 export_filename_selector.cc:332
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
@@ -6852,111 +7224,167 @@ msgstr ""
"%1: Toto je jen název adresáÅe/složky, ne název souboru.\n"
"Název souboru bude vybrán z informacà nad voliÄem složky."
-#: export_filename_selector.cc:318
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "Vybrat složku pro vyvedenÃ"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "Nový vyvádÄcà profil formátu"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "Upravit vyvádÄcà profil formátu"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "Å tÃtek: "
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalizovat:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Vrchol"
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "UstÅihnout ticho na zaÄátku"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "PÅidat ticho na zaÄátku:"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "UstÅihnout ticho na konci"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "PÅidat ticho na konci:"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-"PÅÃkaz, který se má provést po vyvedenÃ\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "SluÄitelnost"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "Kvalita"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "Kvalita pÅevodu vzorkovacÃho kmitoÄtu:"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "Vloženà šumu do signálu"
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr "VytvoÅit soubor CUE pro okamžité vytvoÅenà disku CD/DVD"
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "VytvoÅit soubor TOC pro okamžité vytvoÅenà disku CD/DVD"
-#: export_format_dialog.cc:72
+#: export_format_dialog.cc:80
msgid "Create chapter mark file for MP4 chapter marks"
msgstr "VytvoÅit soubor se znaÄkou kapitoly pro znaÄky kapitol MP4"
-#: export_format_dialog.cc:74
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "OznaÄit soubor popisnými daty k sezenÃ"
-#: export_format_dialog.cc:474
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "Nejlepšà (sinc)"
-#: export_format_dialog.cc:479
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "StÅednà (sinc)"
-#: export_format_dialog.cc:484
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "Rychlé (sinc)"
-#: export_format_dialog.cc:494
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr "Drženà Åádu nuly"
-#: export_format_dialog.cc:904
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "PÅÃmé volby kódovánÃ"
-#: export_format_dialog.cc:920
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "Volby pro Ogg Vorbis"
-#: export_format_dialog.cc:931
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "Volby pro FLAC"
-#: export_format_dialog.cc:948
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "Volby pro Broadcast Wave"
@@ -6973,18 +7401,189 @@ msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
msgstr ""
-"Vybrané pÅednastavenà nebylo nahráno úspÄÅ¡nÄ!\n"
-"Možná zmiÅuje formát, který byl odstranÄn?"
+"Vybrané pÅednastavenà nebylo nahráno úspÄÅ¡nÄ!\n"
+"Možná zmiÅuje formát, který byl odstranÄn?"
+
+#: export_preset_selector.cc:151
+msgid "Do you really want to remove this preset?"
+msgstr "Opravdu chcete odstranit toto pÅednastavenÃ?"
+
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Formát:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Doba trvánÃ"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr "100"
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Soubor nelze pÅeÄÃst: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Nelze pÅistupovat ke zvukovému souboru: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
-#: export_preset_selector.cc:151
-msgid "Do you really want to remove this preset?"
-msgstr "Opravdu chcete odstranit toto pÅednastavenÃ?"
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr "Ukázat Äasy jako:"
-#: export_timespan_selector.cc:51 processor_box.cc:2839
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr "Vybrat vše"
@@ -7008,90 +7607,94 @@ msgstr "getSoundResourceFile: V souboru XML nenà platný koÅen"
msgid "getSoundResourceFile: root = %1, != response"
msgstr "getSoundResourceFile: koÅen = %1, != odezva"
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2276
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr "%1"
-#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:149 gain_meter.cc:962
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Režim automatizace prolÃnaÄe"
-#: gain_meter.cc:150 gain_meter.cc:963
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Druh automatizace prolÃnaÄe"
-#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:179 panner_ui.cc:641
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr "Abs"
-#: gain_meter.cc:795
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
msgid "M"
msgstr "Z"
-#: gain_meter.cc:798
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "P"
-#: gain_meter.cc:801
+#: gain_meter.cc:822
msgid "T"
msgstr "D"
-#: gain_meter.cc:804
+#: gain_meter.cc:825
msgid "W"
msgstr "Z"
-#: generic_pluginui.cc:85
+#: generic_pluginui.cc:83
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">PÅedvolby</span>"
-#: generic_pluginui.cc:100
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr "RuÄnÃ"
-#: generic_pluginui.cc:109
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr "Vše automatizace"
-#: generic_pluginui.cc:253
-msgid "Switches"
-msgstr "PÅepÃnaÄe"
-
-#: generic_pluginui.cc:263 generic_pluginui.cc:439 processor_box.cc:2817
-msgid "Controls"
-msgstr "OvládánÃ"
-
-#: generic_pluginui.cc:296
+#: generic_pluginui.cc:250
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"Editor pÅÃdavných modulů: NepodaÅilo se vytvoÅit prvek ovládánà pro pÅÃpojku "
"%1"
-#: generic_pluginui.cc:321
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr "Editor pÅÃdavných modulů: Žádné ovládánà pro vlastnost %1"
-#: generic_pluginui.cc:327
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
"Editor pÅÃdavných modulů: NepodaÅilo se vytvoÅit prvek ovládánà pro "
"vlastnost %1"
-#: generic_pluginui.cc:471
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "PÅepÃnaÄe"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "OvládánÃ"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr "MÄÅiÄe"
-#: generic_pluginui.cc:493
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Ovládánà automatického systému"
-#: generic_pluginui.cc:500
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr "RuÄnÄ provádÄné"
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "Správce zvukových spojenÃ"
@@ -7100,8 +7703,9 @@ msgstr "Správce zvukových spojenÃ"
msgid "MIDI Connection Manager"
msgstr "Správce MIDI spojenÃ"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:842
-#: mixer_strip.cc:943 monitor_section.cc:1393 monitor_selector.cc:189
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Odpojit"
@@ -7109,59 +7713,83 @@ msgstr "Odpojit"
msgid "port"
msgstr "PÅÃpojka"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "VýbÄr..."
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "Nahrávánà povoleno..."
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "Sólo..."
-#: group_tabs.cc:321
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "VytvoÅit novou skupinu..."
-#: group_tabs.cc:324
-msgid "Create New Group From"
-msgstr "VytvoÅit novou skupinu z"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
-#: group_tabs.cc:327
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "Upravit skupinu..."
-#: group_tabs.cc:328
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr "Sebrat skupinu"
-#: group_tabs.cc:329
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "Odstranit skupinu"
-#: group_tabs.cc:332
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr "Odstranit sbÄrnici podskupiny"
-#: group_tabs.cc:334
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "PÅidat novou sbÄrnici podskupiny"
-#: group_tabs.cc:336
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr "PÅidat novou pomocnou sbÄrnici (pÅed-prolÃnaÄ)"
-#: group_tabs.cc:337
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr "PÅidat novou pomocnou sbÄrnici (po-prolÃnaÄ)"
-#: group_tabs.cc:343
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr "Povolit všechny skupiny"
-#: group_tabs.cc:344
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "Zakázat všechny skupiny"
@@ -7225,11 +7853,15 @@ msgstr "Odstranit Äas"
msgid "Insert time"
msgstr "Vložit Äas"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "-žádná-"
-#: interthread_progress_window.cc:104
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "Zavádà se soubor: %1 z %2"
@@ -7245,62 +7877,86 @@ msgstr "%1 vstup"
msgid "%1 output"
msgstr "%1 výstup"
-#: keyboard.cc:82
+#: keyboard.cc:93
msgid "your own"
msgstr "VaÅ¡e vlastnÃ"
-#: keyboard.cc:145 keyboard.cc:169
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
"Nebylo nalezeno obvyklé rozloženà klávesnice. Bude složité %1 použÃvat!"
-#: keyboard.cc:148
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
"Soubor \"%1\" pro klávesové zkratky nebyl nalezen. MÃsto toho se bude "
"použÃvat obvyklé rozloženà klávesnice."
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Klávesové zkratky"
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr "Odstranit klávesovou zkratku"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Krok"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Klávesová zkratka"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-"Vyberte nÄjaký krok a následnÄ stisknÄte klávesu(y) \n"
-"kvůli (pÅe)nastavenà klávesové zkratky"
-#: keyeditor.cc:98
+#: keyeditor.cc:109
msgid "Reset Bindings to Defaults"
msgstr "Nastavit zkratky zpÄt na výchozÃ"
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Hlavnà nabÃdka"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "PÅesmÄrovánà nabÃdky"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Krok"
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Editor nabÃdek"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Klávesová zkratka"
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr "Seznam oblasti"
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "NabÃdka zpracovánÃ"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "Vzorek"
#: latency_gui.cc:40
msgid "msec"
@@ -7310,37 +7966,36 @@ msgstr "ms"
msgid "period"
msgstr "ÃdobÃ"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 vzorek"
-msgstr[1] "%1 vzorků"
-
-#: latency_gui.cc:72 panner_ui.cc:411 plugin_ui.cc:421
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Nastavit znovu"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1909
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "Chyba v programovánÃ: %1 (%2)"
-#: location_ui.cc:54 location_ui.cc:56
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "PoužÃt PH"
-#: location_ui.cc:61
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "PÅilepit"
-#: location_ui.cc:89
+#: location_ui.cc:88
msgid "Performer:"
msgstr "ÃÄinkujÃcÃ:"
-#: location_ui.cc:90
+#: location_ui.cc:89
msgid "Composer:"
msgstr "Skladatel:"
-#: location_ui.cc:92
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "PÅedzdůraznÄnÃ"
@@ -7376,43 +8031,153 @@ msgstr "Poloha - klepnutà prostÅednÃm tlaÄÃtkem myÅ¡i pro postavenà se sem
msgid "Set marker time from playhead location"
msgstr "Nastavit Äas znaÄky z mÃsta ukazatele polohy"
-#: location_ui.cc:501
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "Na zaÄátku sezenà nemůžete zÅÃdit žádnou znaÄku na CD"
-#: location_ui.cc:727
+#: location_ui.cc:750
msgid "New Marker"
msgstr "Nová znaÄka"
-#: location_ui.cc:728
+#: location_ui.cc:751
msgid "New Range"
msgstr "Nový rozsah"
-#: location_ui.cc:741
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>Rozsahy smyÄky/pÅepsánÃ</b>"
-#: location_ui.cc:766
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>ZnaÄky (vÄetnÄ rejstÅÃku CD)</b>"
-#: location_ui.cc:801
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>ZnaÄky (vÄetnÄ rozsahů stop CD)</b>"
-#: location_ui.cc:1044
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "PÅidat znaÄku rozsahu"
-#: main.cc:86
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr "%1 se nepodaÅilo se spojit s podpůrnou vrstvou zvuku.."
-#: main.cc:133 main.cc:149
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr "Podpůrná vrstva zvuku (%1) selhala, nebo byla ukonÄena"
-#: main.cc:136
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -7426,11 +8191,11 @@ msgstr ""
"\n"
"KlepnÄte na OK pro ukonÄenà %1."
-#: main.cc:150
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr "%2 byla neoÄekávanÄ a bez oznámenà %1 ukonÄena."
-#: main.cc:245
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
@@ -7438,23 +8203,23 @@ msgstr ""
"\n"
" %1 se nepodaÅilo porozumÄt vaÅ¡emu pÅÃkazovému Åádku "
-#: main.cc:247
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr "PÅi spouÅ¡tÄnà %1 nastala chyba"
-#: main.cc:340
+#: main.cc:344
msgid " (built using "
msgstr " (sestaveno s verzà "
-#: main.cc:343
+#: main.cc:347
msgid " and GCC version "
msgstr " a GCC verze "
-#: main.cc:353
+#: main.cc:357
msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr "Autorské právo (C) 1999-2015 Paul Davis"
-#: main.cc:354
+#: main.cc:358
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -7462,35 +8227,35 @@ msgstr ""
"NÄkteré Äásti: autorské právo (C) Steve Harris, Ari Johnson, Brett Viren, "
"Joel Baker, Robin Gareus"
-#: main.cc:356
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 je poskytován bez NAPROSTO ŽÃDNà ZÃRUKY"
-#: main.cc:357
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr "ani pro vhodnost pro OBCHOD nebo způsobilost pro ZVLÃÅ TNà POUŽÃVÃNÃ."
-#: main.cc:358
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Je to svobodný program a vaÅ¡e pomoc s jeho dalÅ¡Ãm Å¡ÃÅenÃm je vÃtána"
-#: main.cc:359
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr "dokud dbáte na urÄité podmÃnky, které jsou uvedeny v souboru COPYING."
-#: main.cc:364
+#: main.cc:368
msgid "could not initialize %1."
msgstr "NepodaÅilo se zapnout %1."
-#: main.cc:374
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Nelze nainstalovat SIGPIPE, který má na starosti chyby"
-#: main.cc:379
+#: main.cc:385
msgid "Could not complete pre-GUI initialization"
msgstr "NepodaÅilo se dokonÄit zapnutà (pre-GUI)"
-#: main.cc:386
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr "NepodaÅilo se vytvoÅit obrazové uživatelské rozhranà k %1"
@@ -7498,11 +8263,11 @@ msgstr "NepodaÅilo se vytvoÅit obrazové uživatelské rozhranà k %1"
msgid "Display delta to edit cursor"
msgstr "Zobrazit deltu pro úpravu ukazovátka"
-#: main_clock.cc:66 tempo_dialog.cc:54
+#: main_clock.cc:66 tempo_dialog.cc:55
msgid "Edit Tempo"
msgstr "Upravit tempo"
-#: main_clock.cc:67 tempo_dialog.cc:326
+#: main_clock.cc:67 tempo_dialog.cc:429
msgid "Edit Meter"
msgstr "Upravit metrum"
@@ -7519,8 +8284,8 @@ msgid "MarkerText"
msgstr "Text u znaÄky"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:2017
-#: rc_option_editor.cc:2663 sfdb_ui.cc:670
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Žádný"
@@ -7709,83 +8474,79 @@ msgstr "Název pÅÃpojky:"
msgid "MidiPortDialog"
msgstr "Dialog pro pÅÃpojku MIDI"
-#: midi_region_view.cc:849
+#: midi_region_view.cc:859
msgid "channel edit"
msgstr "Ãprava kanálu"
-#: midi_region_view.cc:885
+#: midi_region_view.cc:895
msgid "velocity edit"
msgstr "Ãprava sÃly tónu"
-#: midi_region_view.cc:944
+#: midi_region_view.cc:962
msgid "add note"
msgstr "PÅidat notu"
-#: midi_region_view.cc:1872
+#: midi_region_view.cc:1904
msgid "step add"
msgstr "PÅidánà kroku"
-#: midi_region_view.cc:1966 midi_region_view.cc:1989
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr "ZmÄnit zmÄnu zapojenÃ"
-#: midi_region_view.cc:2025
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr "PÅidat zmÄnu zapojenÃ"
-#: midi_region_view.cc:2047 midi_region_view.cc:2048
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr "PÅesunout zmÄnu zapojenÃ"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr "Smazat zmÄnu zapojenÃ"
-#: midi_region_view.cc:2099
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr "Smazat výbÄr"
-#: midi_region_view.cc:2116
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr "Smazat notu"
-#: midi_region_view.cc:2575
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr "PÅesunout noty"
-#: midi_region_view.cc:3110
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr "ZmÄnit sÃly tónů"
-#: midi_region_view.cc:3176
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr "PÅevést"
-#: midi_region_view.cc:3204
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr "ZmÄnit délky not"
-#: midi_region_view.cc:3280
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr "PostrÄit"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr "ZmÄnit kanál"
-#: midi_region_view.cc:3333
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr "Banka "
-#: midi_region_view.cc:3334
-msgid "Program "
-msgstr "Program "
-
-#: midi_region_view.cc:3335
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr "Kanál "
-#: midi_region_view.cc:3522
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "Vložit"
@@ -7801,108 +8562,108 @@ msgstr "Pokus o zobrazenà oblasti MIDI bez datového modelu"
msgid "failed to create MIDI region"
msgstr "NepodaÅilo se vytvoÅit oblast MIDI"
-#: midi_time_axis.cc:316
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "VnÄjšà zaÅÃzenà MIDI"
-#: midi_time_axis.cc:317
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "Režim vnÄjÅ¡Ãho zaÅÃzenà "
-#: midi_time_axis.cc:325
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr "Kan"
-#: midi_time_axis.cc:327
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr "KlepnÄte pro úpravu nastavenà kanálu"
-#: midi_time_axis.cc:526
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "Ukázat celý rozsah"
-#: midi_time_axis.cc:531
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "UmÃstit obsah"
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "Rozsah noty"
-#: midi_time_axis.cc:536
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "Režim noty"
-#: midi_time_axis.cc:537
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr "VoliÄ kanálů"
-#: midi_time_axis.cc:542
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Barevný režim"
-#: midi_time_axis.cc:601
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr "OhýbaÄ"
-#: midi_time_axis.cc:605
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "Tlak"
-#: midi_time_axis.cc:617
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr "Ovládacà prvky"
-#: midi_time_axis.cc:622
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "Nejsou vybrány žádné kanály MIDI"
-#: midi_time_axis.cc:679 midi_time_axis.cc:808
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "Skrýt všechny kanály"
-#: midi_time_axis.cc:683 midi_time_axis.cc:812
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "Ukázat všechny kanály"
-#: midi_time_axis.cc:694 midi_time_axis.cc:823
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "Kanál %1"
-#: midi_time_axis.cc:949 midi_time_axis.cc:981
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "Ovládacà prvky %1-%2"
-#: midi_time_axis.cc:972 midi_time_axis.cc:975
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr "Ovládacà prvek %1"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "Držený tón"
-#: midi_time_axis.cc:1005
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "BicÃ"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "Barvy mÄÅidel"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "Barvy kanálů"
-#: midi_time_axis.cc:1039
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Barva stopy"
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1620 midi_time_axis.cc:1630
-#: midi_time_axis.cc:1636
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr "vše"
-#: midi_time_axis.cc:1617 midi_time_axis.cc:1633
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr "nÄkterá"
@@ -7918,7 +8679,7 @@ msgstr "Automaticky projÞdÄt"
msgid "Decimal"
msgstr "Desetinný"
-#: midi_tracer.cc:57 rc_option_editor.cc:1355
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "Povoleno"
@@ -7958,7 +8719,8 @@ msgstr "PÅeskoÄit vÅ¡echny chybÄjÃcà soubory"
msgid "Skip this file"
msgstr "PÅeskoÄit tento soubor"
-#: missing_file_dialog.cc:57
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "Zvuk"
@@ -7994,92 +8756,36 @@ msgstr "ChybÄjÃcà pÅÃdavné moduly"
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "PÅepnout sólo u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "PÅepnout ztlumenà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "PÅepnout povolenà nahrávánà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "ZmenÅ¡it zesÃlenà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "ZvÄtÅ¡it zesÃlenà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Nastavit zesÃlenà na 0 dB u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "KopÃrovat vybrané zpracovatele"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Vyjmout vybrané zpracovatele"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Vložit vybrané zpracovatele"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Smazat vybrané zpracovatele"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Vybrat všechny viditelné zpracovatele"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "PÅepnout vybrané zpracovatele"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "PÅepnout vybrané pÅÃdavné moduly"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "OdznaÄit vÅ¡echny proužky a zpracovatele"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "ProjÞdÄt okno se smÄÅ¡ovaÄem doleva"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "PÅepnout vstup MIDI pro ve smÄÅ¡ovaÄi vybrané stopy/sbÄrnice"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Nahrané vazby smÄÅ¡ovaÄe z %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "V prohledávané cestÄ %1 se nepodaÅilo nalézt vazby smÄÅ¡ovaÄe"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
-#: mixer_strip.cc:98 mixer_strip.cc:129
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "PÅed"
-#: mixer_strip.cc:101 mixer_strip.cc:132 mixer_strip.cc:387
-#: mixer_strip.cc:1472 rc_option_editor.cc:2949
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr "Poznámka"
-#: mixer_strip.cc:155
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr "KlepnÄte pro pÅepnutà šÃÅky proužku tohoto smÄÅ¡ovaÄe."
-#: mixer_strip.cc:157
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -8087,327 +8793,398 @@ msgstr ""
"\n"
"%1-%2 klepnutà pro pÅepnutà šÃÅky vÅ¡ech proužků."
-#: mixer_strip.cc:164
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr "Skrýt tento proužek smÄÅ¡ovaÄe"
-#: mixer_strip.cc:175
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr "Vybrat mÄÅicà bod ukazatele hladin"
-#: mixer_strip.cc:191
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr "Samostatné sólo"
-#: mixer_strip.cc:199
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr "Zamknout stav sóla"
-#: mixer_strip.cc:201 mixer_strip.cc:2127
+#: mixer_strip.cc:208 mixer_strip.cc:2217
msgid "SoloLock|Lock"
msgstr "Zámek"
-#: mixer_strip.cc:202 mixer_strip.cc:2126
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr "Sam"
-#: mixer_strip.cc:256
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "Skupina zpracovánÃ"
-#: mixer_strip.cc:266
+#: mixer_strip.cc:275
msgid "Trim: "
msgstr "ZastÅiženÃ:"
-#: mixer_strip.cc:383 rc_option_editor.cc:2945
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr "Obrácenà fáze"
-#: mixer_strip.cc:384 rc_option_editor.cc:2946
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr "Nahrávánà a sledovánÃ"
-#: mixer_strip.cc:385 rc_option_editor.cc:2947
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr "Sólo sam/Zámek"
-#: mixer_strip.cc:509
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
msgid "Show/Hide Monitoring Section"
msgstr "Ukázat/Skrýt sledovacà úsek"
-#: mixer_strip.cc:561
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr "Povolit/Zakázat vstup MIDI"
-#: mixer_strip.cc:728
+#: mixer_strip.cc:749
msgid "Aux"
msgstr "Aux"
-#: mixer_strip.cc:754
+#: mixer_strip.cc:775
msgid "Snd"
msgstr "Posl"
-#: mixer_strip.cc:825 mixer_strip.cc:928 processor_box.cc:2759
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
"Nespojeno se zvukovým strojem - na vstupech/výstupech (I/O) nejsou možné "
"žádné zmÄny"
-#: mixer_strip.cc:882 mixer_strip.cc:984
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr "PÅidat %1 pÅÃpojku"
-#: mixer_strip.cc:889 mixer_strip.cc:991 monitor_section.cc:1429
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr "Spojovacà mÅÞka"
-#: mixer_strip.cc:1220
+#: mixer_strip.cc:1291
msgid "MIDI "
msgstr "MIDI"
-#: mixer_strip.cc:1225
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr "<b>VSTUP</b> do %1"
-#: mixer_strip.cc:1228 monitor_section.cc:1474
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>VÃSTUP</b> z %1"
-#: mixer_strip.cc:1346 monitor_section.cc:1561
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr "Odpojeno"
-#: mixer_strip.cc:1475
-msgid "*Comments*"
-msgstr "*Poznámky*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr "Klepnout pro pÅidánÃ/upravenà poznámek"
-#: mixer_strip.cc:1482
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
msgid "Cmt"
msgstr "Pozn"
-#: mixer_strip.cc:1485
-msgid "*Cmt*"
-msgstr "*Pozn*"
-
-#: mixer_strip.cc:1491
-msgid "Click to add/edit comments"
-msgstr "Klepnout pro pÅidánÃ/upravenà poznámek"
-
-#: mixer_strip.cc:1535
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr "Skup"
-#: mixer_strip.cc:1538
+#: mixer_strip.cc:1599
msgid "~G"
msgstr "~S"
-#: mixer_strip.cc:1567 route_time_axis.cc:573
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Barva..."
-#: mixer_strip.cc:1569 route_time_axis.cc:575
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr "Poznámky..."
-#: mixer_strip.cc:1571 route_time_axis.cc:577
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr "Vstupy..."
-#: mixer_strip.cc:1573 route_time_axis.cc:579
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr "Výstupy..."
-#: mixer_strip.cc:1578
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr "Uložit jako pÅedlohu..."
-#: mixer_strip.cc:1584 route_group_dialog.cc:45 route_time_axis.cc:853
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
msgid "Active"
msgstr "Äinné"
-#: mixer_strip.cc:1592
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr "Upravit prodlevu..."
-#: mixer_strip.cc:1595
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr "Chránit proti neobvyklým hodnotám"
-#: mixer_strip.cc:1601 route_time_axis.cc:592
-msgid "Remote Control ID..."
-msgstr "ID dálkového ovládánÃ..."
-
-#: mixer_strip.cc:1619 route_time_axis.cc:869
+#: mixer_strip.cc:1701 route_time_axis.cc:867
msgid "Duplicate..."
msgstr "Zdvojit"
-#: mixer_strip.cc:1907
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr "PÅed"
-#: mixer_strip.cc:1911
+#: mixer_strip.cc:2000
msgid "Post"
msgstr "Po"
-#: mixer_strip.cc:1927
+#: mixer_strip.cc:2016
msgid "Meter|In"
msgstr "Vstup"
-#: mixer_strip.cc:1931
+#: mixer_strip.cc:2020
msgid "Meter|Pr"
msgstr "PÅ"
-#: mixer_strip.cc:1935
+#: mixer_strip.cc:2024
msgid "Meter|Po"
msgstr "Po"
-#: mixer_strip.cc:1939
+#: mixer_strip.cc:2028
msgid "Meter|O"
msgstr "Výstup"
-#: mixer_strip.cc:1944
+#: mixer_strip.cc:2033
msgid "Meter|C"
msgstr "Z"
-#: mixer_strip.cc:2104 route_ui.cc:181
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr "Disk"
-#: mixer_strip.cc:2106
+#: mixer_strip.cc:2196
msgid "Mon"
msgstr "Sled"
-#: mixer_strip.cc:2119 monitor_section.cc:81
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr "AFL"
-#: mixer_strip.cc:2122 monitor_section.cc:82
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr "PFL"
-#: mixer_strip.cc:2132 meter_strip.cc:387
+#: mixer_strip.cc:2222 meter_strip.cc:385
msgid "MonitorInput|I"
msgstr "Vst"
-#: mixer_strip.cc:2133 meter_strip.cc:388
+#: mixer_strip.cc:2223 meter_strip.cc:386
msgid "MonitorDisk|D"
msgstr "D"
-#: mixer_strip.cc:2135
+#: mixer_strip.cc:2225
msgid "Mon|O"
msgstr "Výst"
-#: mixer_strip.cc:2148 meter_strip.cc:379 route_time_axis.cc:2738
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
msgid "AfterFader|A"
msgstr "Po"
-#: mixer_strip.cc:2151
+#: mixer_strip.cc:2241
msgid "Prefader|P"
msgstr "PÅ"
-#: mixer_strip.cc:2156
+#: mixer_strip.cc:2246
msgid "SoloIso|I"
msgstr "Sam"
-#: mixer_strip.cc:2157
+#: mixer_strip.cc:2247
msgid "SoloLock|L"
msgstr "Zám"
-#: mixer_strip.cc:2362
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "PÅed-prolÃnaÄ"
-#: mixer_strip.cc:2363
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Po-prolÃnaÄ"
-#: mixer_strip.cc:2408 meter_strip.cc:860
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr "ZmÄnit vÅ¡e ve skupinÄ na %1"
-#: mixer_strip.cc:2410 meter_strip.cc:862
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr "ZmÄnit vÅ¡e na %1"
-#: mixer_strip.cc:2412 meter_strip.cc:864
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr "ZmÄnit stejný typ stopy na %1"
-#: mixer_ui.cc:134 route_time_axis.cc:830
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Skupina"
-#: mixer_ui.cc:199
+#: mixer_ui.cc:221
msgid "Favorite Plugins"
msgstr "OblÃbené pÅÃdavné moduly"
-#: mixer_ui.cc:1288
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr ""
"OznaÄenà pro pÅejmenovaný proužek (mixážnà kanál) v seznamu pro zobrazenà "
"stop nelze najÃt!"
-#: mixer_ui.cc:1382
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-vše-"
-#: mixer_ui.cc:2039
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Proužky kanálů"
-#: mixer_ui.cc:2346
+#: mixer_ui.cc:2479
msgid "No Track/Bus is selected."
msgstr "Nebyla vybrána žádná stopa nebo sbÄrnice."
-#: mixer_ui.cc:2348
+#: mixer_ui.cc:2481
msgid "Add at the top"
msgstr "PÅidat nahoÅe"
-#: mixer_ui.cc:2350
+#: mixer_ui.cc:2483
msgid "Add Pre-Fader"
msgstr "PÅidat pÅed-prolÃnaÄ"
-#: mixer_ui.cc:2352
-msgid "Add Post-Fader"
-msgstr "PÅidat po-prolÃnaÄ"
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "PÅidat po-prolÃnaÄ"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "PÅidat na konci"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Odstranit z oblÃbených"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Smazat pÅednastavenÃ"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "PÅepnout sólo u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "PÅepnout ztlumenà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "PÅepnout povolenà nahrávánà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "ZmenÅ¡it zesÃlenà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "ZvÄtÅ¡it zesÃlenà u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Nastavit zesÃlenà na 0 dB u ve smÄÅ¡ovaÄi vybraných stop/sbÄrnic"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "KopÃrovat vybrané zpracovatele"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Vyjmout vybrané zpracovatele"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Vložit vybrané zpracovatele"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Smazat vybrané zpracovatele"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Vybrat všechny viditelné zpracovatele"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "PÅepnout vybrané zpracovatele"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "PÅepnout vybrané pÅÃdavné moduly"
-#: mixer_ui.cc:2354
-msgid "Add at the end"
-msgstr "PÅidat na konci"
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "OdznaÄit vÅ¡echny proužky a zpracovatele"
-#: mixer_ui.cc:2360
-msgid "Remove from favorites"
-msgstr "Odstranit z oblÃbených"
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "ProjÞdÄt okno se smÄÅ¡ovaÄem doleva"
-#: mixer_ui.cc:2364
-msgid "Delete Preset"
-msgstr "Smazat pÅednastavenÃ"
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "PÅepnout vstup MIDI pro ve smÄÅ¡ovaÄi vybrané stopy/sbÄrnice"
-#: meter_strip.cc:161
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr "Nastavit znovu nejvyššà hodnoty"
-#: meter_strip.cc:382 route_time_axis.cc:2742
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
msgid "PreFader|P"
msgstr "PÅ"
-#: meter_strip.cc:896
+#: meter_strip.cc:894
msgid "Variable height"
msgstr "PromÄnlivá výška"
-#: meter_strip.cc:897
+#: meter_strip.cc:895
msgid "Short"
msgstr "Krátká"
-#: meter_strip.cc:898
+#: meter_strip.cc:896
msgid "Tall"
msgstr "Vysoká"
-#: meter_strip.cc:899
+#: meter_strip.cc:897
msgid "Grande"
msgstr "Grande"
-#: meter_strip.cc:900
+#: meter_strip.cc:898
msgid "Venti"
msgstr "Venti"
@@ -8459,19 +9236,19 @@ msgstr "VU"
msgid "SiP"
msgstr "SiP"
-#: monitor_section.cc:109 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "Sólo"
-#: monitor_section.cc:113
+#: monitor_section.cc:117
msgid "Isolated"
msgstr "Samostatné"
-#: monitor_section.cc:117
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr "Zkušebnà výstup"
-#: monitor_section.cc:128
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -8479,7 +9256,7 @@ msgstr ""
"Je-li v Äinnosti, nÄco je sólo-samostatnÄ.\n"
"Pro vypnutà osamostatnÄnà klepnÄte na cokoli."
-#: monitor_section.cc:131
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -8487,32 +9264,32 @@ msgstr ""
"Je-li v Äinnosti, bÄžà poslechu.\n"
"KlepnutÃm se poslech zkuÅ¡ebnÃho výstupu zastavÃ."
-#: monitor_section.cc:148
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr "Ovládacà prvky pro sólo ovlivnà sólo v mÃstÄ"
-#: monitor_section.cc:154
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr "Ovládacà prvky pro sólo pÅepnou poslech po prolÃnaÄi"
-#: monitor_section.cc:160
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr "Ovládacà prvky pro sólo pÅepnou poslech pÅed prolÃnaÄem"
-#: monitor_section.cc:166
+#: monitor_section.cc:170
msgid "Excl. Solo"
msgstr "Výhr. sólo"
-#: monitor_section.cc:168
+#: monitor_section.cc:172
msgid "Exclusive solo means that only 1 solo is active at a time"
msgstr ""
"Výhradnà sólo znamená, že v jednu chvÃli je v Äinnosti pouze jedno sólo"
-#: monitor_section.cc:175
+#: monitor_section.cc:179
msgid "Solo » Mute"
msgstr "Sólo » Ztlumit"
-#: monitor_section.cc:177
+#: monitor_section.cc:181
msgid ""
"If enabled, solo will override mute\n"
"(a soloed & muted track or bus will be audible)"
@@ -8520,40 +9297,40 @@ msgstr ""
"Je-li povoleno, sólo dostane pÅednost pÅed ztlumenÃm\n"
"(bude slyÅ¡itelná samostatná a ztlumená stopa nebo sbÄrnice)"
-#: monitor_section.cc:185
+#: monitor_section.cc:189
msgid "Processors"
msgstr "Zpracovatelé"
-#: monitor_section.cc:187
-msgid "Allow to add monitor effect processors"
-msgstr "Povolit pÅidánà zpracovatele efektů sledovánÃ"
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
-#: monitor_section.cc:203
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr "ZvÄtÅ¡enà zesÃlenà pro samostatné signály (0 dB je normálnÃ)"
-#: monitor_section.cc:207 monitor_section.cc:224 monitor_section.cc:241
-#: monitor_section.cc:286
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
msgid "0 dB"
msgstr "0 dB"
-#: monitor_section.cc:208
+#: monitor_section.cc:211
msgid "3 dB"
msgstr "3 dB"
-#: monitor_section.cc:209
+#: monitor_section.cc:212
msgid "6 dB"
msgstr "6 dB"
-#: monitor_section.cc:210
+#: monitor_section.cc:213
msgid "10 dB"
msgstr "10 dB"
-#: monitor_section.cc:212
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr "Povzbuzenà sóla"
-#: monitor_section.cc:219
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
@@ -8561,99 +9338,103 @@ msgstr ""
"ZmenÅ¡enà zesÃlenà pro nesamostatné signály\n"
"Hodnota nad -inf dB způsobà \"sólo v Äele\""
-#: monitor_section.cc:225 monitor_section.cc:243 monitor_section.cc:288
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
msgid "-6 dB"
msgstr "-6 dB"
-#: monitor_section.cc:226 monitor_section.cc:244 monitor_section.cc:289
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
msgid "-12 dB"
msgstr "-12 dB"
-#: monitor_section.cc:227 monitor_section.cc:245 monitor_section.cc:290
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
msgid "-20 dB"
msgstr "-20 dB"
-#: monitor_section.cc:228
+#: monitor_section.cc:231
msgid "OFF"
msgstr "VYP"
-#: monitor_section.cc:230
+#: monitor_section.cc:233
msgid "SiP Cut"
msgstr "Vyjmutà Sip"
-#: monitor_section.cc:237
+#: monitor_section.cc:240
msgid "Gain reduction to use when dimming monitor outputs"
msgstr "ZmenÅ¡enà zesÃlenà k použità pÅi tlumenà výstupů sledovánÃ"
-#: monitor_section.cc:242 monitor_section.cc:287
+#: monitor_section.cc:245 monitor_section.cc:290
msgid "-3 dB"
msgstr "-3 dB"
-#: monitor_section.cc:247 monitor_section.cc:261 monitor_section.cc:322
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
msgid "Dim"
msgstr "Tlumený"
-#: monitor_section.cc:291
+#: monitor_section.cc:294
msgid "-30 dB"
msgstr "-30 dB"
-#: monitor_section.cc:330
+#: monitor_section.cc:333
msgid "Inv"
msgstr "Inv"
-#: monitor_section.cc:396
+#: monitor_section.cc:399
msgid "Monitor"
msgstr "SledovánÃ"
-#: monitor_section.cc:860
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr "PÅepnout sledovánà na mono"
-#: monitor_section.cc:863
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr "Vyjmout sledovánÃ"
-#: monitor_section.cc:866
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr "Zeslabit sledovánÃ"
-#: monitor_section.cc:869
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr "PÅepnout režim výhradnà sólo"
-#: monitor_section.cc:875
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr "PÅepnout režim ztlumenà potlaÄà sólo"
-#: monitor_section.cc:885
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "Vyjmout kanál pro sledovánà %1"
-#: monitor_section.cc:890
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr "Ztlumit kanál pro sledovánà %1"
-#: monitor_section.cc:895
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr "Sólo pro kanál pro sledovánà %1"
-#: monitor_section.cc:900
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr "Obrátit kanál pro sledovánà %1"
-#: monitor_section.cc:910
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr "Sólo pÅÃmo na mÃstÄ"
-#: monitor_section.cc:912
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr "Sólo poslech po prolÃnánà (AFL)"
-#: monitor_section.cc:914
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr "Sólo poslech pÅed prolÃnánÃm (PFL)"
-#: monitor_section.cc:1376
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
msgid "No session - no I/O changes are possible"
msgstr "Žádné sezenà - na vstupech/výstupech (I/O) nejsou možné žádné zmÄny"
@@ -8779,6 +9560,10 @@ msgstr "Normalizovat oblasti"
msgid "Normalize region"
msgstr "Normalizovat oblast"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalizovat:"
+
#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr "dbFS"
@@ -8835,8 +9620,8 @@ msgstr ""
msgid ""
" -B, --bypass-plugins Bypass all plugins in an existing session\n"
msgstr ""
-" -B, --bypass-plugins PÅemostit vÅ¡echny pÅÃdavné moduly ve stávajÃcÃm "
-"sezenÃ\n"
+" -B, --bypass-plugins PÅemostit vÅ¡echny pÅÃdavné moduly ve "
+"stávajÃcÃm sezenÃ\n"
#: opts.cc:68
msgid ""
@@ -8975,39 +9760,161 @@ msgstr "NepÅidÄlené"
msgid "Imported"
msgstr "Zavedeno"
-#: plugin_eq_gui.cc:83 plugin_eq_gui.cc:107
+#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
msgid "dB scale"
msgstr "Stupnice dB"
-#: plugin_eq_gui.cc:114
+#: plugin_eq_gui.cc:116
msgid "Show phase"
msgstr "Ukázat fázi"
-#: plugin_selector.cc:54 plugin_selector.cc:311
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "Poslat"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Nelze nastavit nové odeslánÃ: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "Název obsahuje"
-#: plugin_selector.cc:55 plugin_selector.cc:315
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "Druh obsahuje"
-#: plugin_selector.cc:56 plugin_selector.cc:313
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr "Skupina obsahuje"
-#: plugin_selector.cc:57 plugin_selector.cc:335
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "Autor obsahuje"
-#: plugin_selector.cc:58 plugin_selector.cc:337
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "SbÃrka obsahuje"
-#: plugin_selector.cc:59 plugin_selector.cc:267 plugin_selector.cc:613
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "Pouze oblÃbené"
-#: plugin_selector.cc:60 plugin_selector.cc:271 plugin_selector.cc:613
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "Pouze skryté"
@@ -9099,16 +10006,16 @@ msgstr "PÅepnout zobrazenà pÅÃdavných modulů s pomocnými prostÅedky (jso
msgid "Filter"
msgstr "Filtr"
-#: plugin_selector.cc:221
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "Vložit pÅÃdavný(é) modul(y)"
-#: plugin_selector.cc:419 plugin_selector.cc:420 plugin_selector.cc:421
-#: plugin_selector.cc:422
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr "PromÄnná"
-#: plugin_selector.cc:572
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -9118,29 +10025,29 @@ msgstr ""
"\n"
"VÃce podrobnostà hledejte a možná najdete v oknÄ se zápisem"
-#: plugin_selector.cc:730
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "OblÃbené"
-#: plugin_selector.cc:732
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "Správce pÅÃdavných modulů..."
-#: plugin_selector.cc:736
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Podle tvůrce"
-#: plugin_selector.cc:739
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Podle skupiny"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr ""
"Pozoruhodné... PÅÃdavné moduly LADSPA nemajà žádné grafické uživatelské "
"rozhranÃ!"
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
@@ -9148,11 +10055,11 @@ msgstr ""
"Neznámý druh pÅÃdavného modulu (UpozornÄnÃ: tato verze %1 nepodporuje žádné "
"pÅÃdavné moduly VST)"
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr "Neznámý druh pÅÃdavného modulu"
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
@@ -9160,7 +10067,7 @@ msgstr ""
"Neznámý druh pÅÃdavného modulu pro editor (UpozornÄnÃ: tato verze %1 "
"nepodporuje linuxové VST)"
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr "create_lv2_editor použÃvaný na ne-LV2 pÅÃdavný modul"
@@ -9207,7 +10114,7 @@ msgstr ""
msgid "Disable signal processing by the plugin"
msgstr "Zakázat zpracovánà signálu pÅÃdavným modulem"
-#: plugin_ui.cc:473 plugin_ui.cc:685
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -9253,11 +10160,11 @@ msgstr ""
msgid "New Preset"
msgstr "Nové pÅednastavenÃ"
-#: plugin_ui.cc:692
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "KlepnÄte pro povolenà obvyklého použÃvánà klávesových zkratek v %1"
-#: plugin_ui.cc:789
+#: plugin_ui.cc:785
msgid "(none)"
msgstr "(žádný)"
@@ -9321,23 +10228,23 @@ msgstr "Výstup hodin MIDI"
msgid "MMC out"
msgstr "Výstup MMC"
-#: port_group.cc:543
+#: port_group.cc:554
msgid ":monitor"
msgstr ":sledovánÃ"
-#: port_group.cc:559
+#: port_group.cc:570
msgid "system:"
msgstr "Systém:"
-#: port_group.cc:560
+#: port_group.cc:571
msgid "alsa_pcm:"
msgstr "alsa_pcm:"
-#: port_group.cc:561
+#: port_group.cc:572
msgid "alsa_midi:"
msgstr "alsa_midi:"
-#: port_group.cc:566
+#: port_group.cc:577
msgid "Scene "
msgstr "Scéna"
@@ -9401,43 +10308,36 @@ msgid "Flip"
msgstr "PÅepnout"
#: port_matrix.cc:732
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+msgid "It is not possible to add a port here."
msgstr ""
-"PÅÃpojku zde nelze pÅidat, protože prvnà procesor ve stopÄ nebo sbÄrnici "
-"nedokáže podporovat nové nastavenÃ."
-#: port_matrix.cc:735
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr "Nelze pÅidat pÅÃpojku"
#: port_matrix.cc:757
-msgid "Port removal not allowed"
-msgstr "OdstranÄnà pÅÃpojky nepovoleno"
+msgid "The last port cannot be removed"
+msgstr ""
-#: port_matrix.cc:758
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
msgstr ""
-"Tuto pÅÃpojku nelze odstranit, protože\n"
-"prvnà pÅÃdavný modul ve stopÄ nebo\n"
-"sbÄrnici nemůže pÅijmout nový poÄet vstupů,\n"
-"nebo má poslednà pÅÃdavný modul vÃce výstupů."
-#: port_matrix.cc:975
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "OdstranÄnà pÅÃpojky nepovoleno"
+
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "Odstranit '%s'"
-#: port_matrix.cc:990
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s vše z '%s'"
-#: port_matrix.cc:1056 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "Kanál"
@@ -9449,19 +10349,15 @@ msgstr "Nejsou zde žádné pÅÃpojky k pÅipojenÃ."
msgid "There are no %1 ports to connect."
msgstr "Nejsou zde žádné %1 pÅÃpojky k pÅipojenÃ."
-#: processor_box.cc:169
-msgid "Send"
-msgstr "Poslat"
-
-#: processor_box.cc:171
+#: processor_box.cc:226
msgid "Return"
msgstr "Enter"
-#: processor_box.cc:239
+#: processor_box.cc:323
msgid "New Favorite Preset for \"%1\""
msgstr "Nové oblÃbené pÅednastavenà \"%1\""
-#: processor_box.cc:414
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
@@ -9469,7 +10365,7 @@ msgstr ""
"\n"
"Tento mono pÅÃdavný modul byl zkopÃrován %1 krát"
-#: processor_box.cc:418
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
@@ -9479,7 +10375,7 @@ msgstr ""
"Klepnout dvakrát pro ukázánà uživatelského rozhranÃ.\n"
"Alt+klepnout dvakrát pro ukázánà jednoduchého uživatelského rozhranÃ.%3"
-#: processor_box.cc:421
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
@@ -9487,7 +10383,7 @@ msgstr ""
"<b>%1</b>\n"
"Klepnout dvakrát pro ukázánà jednoduchého uživatelského rozhranÃ.%2"
-#: processor_box.cc:427
+#: processor_box.cc:514
msgid ""
"<b>%1</b>\n"
"The Plugin is not available on this system\n"
@@ -9497,32 +10393,36 @@ msgstr ""
"PÅÃdavný modul nenà v tomto systému dostupný\n"
"a byl nahrazen zástupným."
-#: processor_box.cc:470
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr "(%1x1) "
-#: processor_box.cc:546
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "Ukázat všechny ovládacà prvky"
-#: processor_box.cc:550
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "Skrýt všechny ovládacà prvky"
-#: processor_box.cc:584
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr "Spojit ovládánà vyvažovaÄe"
-#: processor_box.cc:691
+#: processor_box.cc:859
msgid "on"
msgstr "Zapnuto"
-#: processor_box.cc:691 rc_option_editor.cc:2978 rc_option_editor.cc:2992
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "Vypnuto"
-#: processor_box.cc:1177
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -9530,7 +10430,7 @@ msgstr ""
"Klepnutà pravým tlaÄÃtkem myÅ¡i pro pÅidánÃ/odstranÄnÃ/upravenÃ\n"
"pÅÃdavných modulů, vloženÃ, poslánà a dalÅ¡Ã"
-#: processor_box.cc:1326
+#: processor_box.cc:1966
msgid ""
"Processor Drag/Drop failed. Probably because\n"
"the I/O configuration of the plugins could\n"
@@ -9540,15 +10440,15 @@ msgstr ""
"PravdÄpodobnÄ se neshoduje vstupnÃ/výstupnà nastavenà (I/O)\n"
"pÅÃdavných modulů s nastavenÃm pro tuto stopu."
-#: processor_box.cc:1769 processor_box.cc:2164
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr "NesluÄitelnost pÅÃdavného modulu"
-#: processor_box.cc:1772
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "Pokusil jste se pÅidat pÅÃdavný modul \"%1\" do mÃsta %2.\n"
-#: processor_box.cc:1778
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
@@ -9556,19 +10456,19 @@ msgstr ""
"\n"
"Tento pÅÃdavný modul má:\n"
-#: processor_box.cc:1781
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 vstup MIDI\n"
-msgstr[1] "\t%1 vstupů MIDI"
+msgstr[1] "\t%1 vstupů MIDI\n"
-#: processor_box.cc:1785
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 vstup pro zvuk\n"
-msgstr[1] "\t%1 vstupů pro zvuk"
+msgstr[1] "\t%1 vstupů pro zvuk\n"
-#: processor_box.cc:1788
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -9576,31 +10476,27 @@ msgstr ""
"\n"
"Ale v bodÄ vloženà jsou:\n"
-#: processor_box.cc:1791
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 kanál MIDI\n"
msgstr[1] "\t%1 kanálů MIDI\n"
-#: processor_box.cc:1795
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 kanál pro zvuk\n"
msgstr[1] "\t%1 kanálů pro zvuk\n"
-#: processor_box.cc:1798
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
msgstr ""
"\n"
-"%1 nenà schopen vložit tento pÅÃdavný modul zde."
-
-#: processor_box.cc:1835
-msgid "Cannot set up new send: %1"
-msgstr "Nelze nastavit nové odeslánÃ: %1"
+"%1 nenà schopen vložit tento pÅÃdavný modul zde.\n"
-#: processor_box.cc:2167
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -9610,21 +10506,21 @@ msgstr ""
"pÅeuspoÅádat tÃmto způsobem, protože vstupy a\n"
"výstupy nebudou nepracovat správnÄ."
-#: processor_box.cc:2367
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr "PÅejmenovat procesor"
-#: processor_box.cc:2398
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
"Je nejménÄ 100 I/O (vstupnÃch/výstupnÃch) objektů, které nesou název %1 - "
"název nezmÄnÄn"
-#: processor_box.cc:2536
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr "Vloženà pÅÃdavného modulu se nezdaÅilo"
-#: processor_box.cc:2547
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -9634,7 +10530,7 @@ msgstr ""
"PravdÄpodobnÄ se neshoduje vstupnÃ/výstupnà nastavenà (I/O)\n"
"pÅÃdavných modulů s nastavenÃm pro tuto stopu."
-#: processor_box.cc:2593
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -9642,15 +10538,15 @@ msgstr ""
"Doopravdy chcete odstranit všechny zpracovatele z %1?\n"
"(Toto se pak nedá vrátit zpátky)"
-#: processor_box.cc:2597 processor_box.cc:2622
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Ano, všechny odstranit"
-#: processor_box.cc:2599 processor_box.cc:2624
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr "PÅejmenovat zpracovatele"
-#: processor_box.cc:2614
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9658,7 +10554,7 @@ msgstr ""
"Opravdu chcete odstranit vÅ¡echny zpracovatele pÅed-prolÃnaÄe z %1?\n"
"(Toto se pak nedá vrátit zpátky)"
-#: processor_box.cc:2617
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9666,59 +10562,59 @@ msgstr ""
"Opravdu chcete odstranit vÅ¡echny zpracovatele po-prolÃnaÄe z %1?\n"
"(Toto se pak nedá vrátit zpátky)"
-#: processor_box.cc:2805
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr "Vložit nový pÅÃdavný modul"
-#: processor_box.cc:2808
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Vložit novou vložku"
-#: processor_box.cc:2811
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr "Nové vnÄjšà odeslánÃ..."
-#: processor_box.cc:2815
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr "Vložit nové pomocné odeslánà (Aux)..."
-#: processor_box.cc:2818
+#: processor_box.cc:3654
msgid "Send Options"
msgstr "Volby pro odeslánÃ"
-#: processor_box.cc:2820
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr "Smazat (vše)"
-#: processor_box.cc:2822
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr "Smazat (pÅed-prolÃnaÄ)"
-#: processor_box.cc:2824
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr "Smazat (po-prolÃnaÄ)"
-#: processor_box.cc:2846
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "Zapnout vše"
-#: processor_box.cc:2848
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr "Vypnout vše"
-#: processor_box.cc:2850
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr "PÅÃdavné moduly A/B"
-#: processor_box.cc:2859
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr "Upravit pomocà generických ovládacÃch prvků..."
-#: processor_box.cc:3162
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr "%1: %2 (podle %3)"
-#: processor_box.cc:3164
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr "%1 (od %2)"
@@ -9746,71 +10642,71 @@ msgstr "Banka"
msgid "main grid"
msgstr "Hlavnà mÅÞka"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Kvantovat"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "SÃla"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Swing"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "Práh (tiknutÃ)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr "Zapadnout do zaÄátku noty"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr "Zapadnout do konce noty"
-#: rc_option_editor.cc:81 rc_option_editor.cc:82
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "Procházet..."
-#: rc_option_editor.cc:87
+#: rc_option_editor.cc:89
msgid "Emphasis on first beat:"
msgstr "Důraz na prvnà dobÄ:"
-#: rc_option_editor.cc:93
+#: rc_option_editor.cc:95
msgid "Use default Click:"
msgstr "PoužÃt výchozà zvuk pro klepnutà metronomu:"
-#: rc_option_editor.cc:99
+#: rc_option_editor.cc:101
msgid "Click audio file:"
msgstr "Zvukový soubor pro klepnutà metronomu:"
-#: rc_option_editor.cc:106
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Zvukový soubor pro zdůraznÄnà klepnutà metronomu:"
-#: rc_option_editor.cc:152
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Vybrat zvuk klepnutÃ"
-#: rc_option_editor.cc:175
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Vybrat zvuk pro zdůraznÄnà klepnutÃ"
-#: rc_option_editor.cc:236
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "Omezit historii kroků zpÄt na"
-#: rc_option_editor.cc:237
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "Uložit historii kroků zpÄt"
-#: rc_option_editor.cc:246 rc_option_editor.cc:253
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "PÅÃkazy"
-#: rc_option_editor.cc:376
+#: rc_option_editor.cc:378
msgid ""
"\n"
"Changes to this setting will only persist after your project has been saved."
@@ -9818,232 +10714,237 @@ msgstr ""
"\n"
"ZmÄny tohoto nastavenà budou trvalé jen v pÅÃpadÄ uloženà projektu."
-#: rc_option_editor.cc:387 rc_option_editor.cc:449
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
msgstr "<b>DoporuÄené nastavenÃ: %1 + tlaÄÃtko 3 (pravé tlaÄÃtko myÅ¡i)</b>%2"
-#: rc_option_editor.cc:401
+#: rc_option_editor.cc:403
msgid "Select Keyboard layout:"
msgstr "Vybrat rozvrženà klávesnice:"
-#: rc_option_editor.cc:420
+#: rc_option_editor.cc:422
msgid "When Clicking:"
msgstr "PÅi klepnutÃ:"
-#: rc_option_editor.cc:427
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "Upravit pomocÃ:"
-#: rc_option_editor.cc:433 rc_option_editor.cc:463 rc_option_editor.cc:493
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "s tlaÄÃtkem myÅ¡i"
-#: rc_option_editor.cc:457
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "Odstranit pomocÃ:"
-#: rc_option_editor.cc:479
+#: rc_option_editor.cc:481
msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
msgstr "<b>DoporuÄené nastavenÃ: %1 + tlaÄÃtko 1 (levé tlaÄÃtko myÅ¡i)</b>%2"
-#: rc_option_editor.cc:487
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "Vložit notu pomocÃ:"
-#: rc_option_editor.cc:505
+#: rc_option_editor.cc:507
msgid "When Beginning a Drag:"
msgstr "Na zaÄátku taženà myÅ¡i:"
-#: rc_option_editor.cc:516 rc_option_editor.cc:543 rc_option_editor.cc:576
-#: rc_option_editor.cc:597 rc_option_editor.cc:641 rc_option_editor.cc:674
-#: rc_option_editor.cc:700 rc_option_editor.cc:728 rc_option_editor.cc:757
-#: rc_option_editor.cc:779
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
msgid "<b>Recommended Setting: %1</b>%2"
msgstr "<b>DoporuÄené nastavenÃ: %1</b>%2"
-#: rc_option_editor.cc:530
+#: rc_option_editor.cc:532
msgid "Copy items using:"
msgstr "KopÃrovat položky pomocÃ:"
-#: rc_option_editor.cc:557
+#: rc_option_editor.cc:559
msgid "Constrain drag using:"
msgstr "Omezit taženà myÅ¡i pomocÃ:"
-#: rc_option_editor.cc:565
+#: rc_option_editor.cc:567
msgid "When Beginning a Trim:"
msgstr "Na zaÄátku pÅizpůsobenà (zastÅihnutÃ):"
-#: rc_option_editor.cc:584
+#: rc_option_editor.cc:586
msgid "Trim contents using:"
msgstr "PÅizpůsobit obsah pomocÃ:"
-#: rc_option_editor.cc:605
+#: rc_option_editor.cc:607
msgid "Anchored trim using:"
msgstr "Ukotvené pÅizpůsobenà pomocÃ:"
-#: rc_option_editor.cc:649
+#: rc_option_editor.cc:651
msgid "Resize notes relatively using:"
msgstr "PomÄrná zmÄna notových délek pomocÃ:"
-#: rc_option_editor.cc:658
+#: rc_option_editor.cc:660
msgid "While Dragging:"
msgstr "PÅi taženà myÅ¡i:"
-#: rc_option_editor.cc:682
+#: rc_option_editor.cc:684
msgid "Ignore snap using:"
msgstr "PÅehlÞet zapadnutà pomocÃ:"
-#: rc_option_editor.cc:708
+#: rc_option_editor.cc:710
msgid "Snap relatively using:"
msgstr "PomÄrné zapadnutà pomocÃ:"
-#: rc_option_editor.cc:716
+#: rc_option_editor.cc:718
msgid "While Trimming:"
msgstr "BÄhem pÅizpůsobenÃ:"
-#: rc_option_editor.cc:736
+#: rc_option_editor.cc:738
msgid "Resize overlapped regions using:"
msgstr "ZmÄna délek pÅekrývajÃcÃch se oblastà pomocÃ:"
-#: rc_option_editor.cc:744
+#: rc_option_editor.cc:746
msgid "While Dragging Control Points:"
msgstr "PÅi taženà ovládacÃch bodů myÅ¡Ã:"
-#: rc_option_editor.cc:765
+#: rc_option_editor.cc:767
msgid "Fine adjust using:"
msgstr "Jemné pÅizpůsobenà pomocÃ:"
-#: rc_option_editor.cc:787
+#: rc_option_editor.cc:789
msgid "Push points using:"
msgstr "Narazit body pomocÃ:"
-#: rc_option_editor.cc:1027
+#: rc_option_editor.cc:1029
msgid "GUI and Font scaling:"
msgstr "ZmÄna velikosti rozhranà a pÃsma:"
-#: rc_option_editor.cc:1030
+#: rc_option_editor.cc:1032
msgid "Default"
msgstr "VýchozÃ"
-#: rc_option_editor.cc:1056
+#: rc_option_editor.cc:1058
msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-"PÅizpůsobenà velikosti vyžaduje opÄtovné spuÅ¡tÄnà programu kvůli pÅizpůsobenà "
-"rozvrženÃ."
+"PÅizpůsobenà velikosti vyžaduje opÄtovné spuÅ¡tÄnà programu kvůli "
+"pÅizpůsobenà rozvrženÃ."
-#: rc_option_editor.cc:1098
+#: rc_option_editor.cc:1100
msgid "â"
msgstr "â"
-#: rc_option_editor.cc:1099
+#: rc_option_editor.cc:1101
msgid "30 sec"
msgstr "30 s"
-#: rc_option_editor.cc:1100
+#: rc_option_editor.cc:1102
msgid "1 min"
msgstr "1 min"
-#: rc_option_editor.cc:1101
+#: rc_option_editor.cc:1103
msgid "2 mins"
msgstr "2 minuty"
-#: rc_option_editor.cc:1102
+#: rc_option_editor.cc:1104
msgid "3 mins"
msgstr "3 minuty"
-#: rc_option_editor.cc:1103
+#: rc_option_editor.cc:1105
msgid "4 mins"
msgstr "4 minuty"
-#: rc_option_editor.cc:1104
+#: rc_option_editor.cc:1106
msgid "5 mins"
msgstr "5 minut"
-#: rc_option_editor.cc:1107
+#: rc_option_editor.cc:1109
msgid ""
"Specify the default timeout for plugin instantiation. Plugins that require "
"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
"Zadejte pÅednastavenà pro pÅekroÄenà Äasu pro doloženà pÅÃdavného modulu. "
-"PÅÃdavné moduly, které k nahránà potÅebujà vÃce Äasu, budou "
-"umÃstÄny na Äernou listinu. Hodnota 0 pÅekroÄenà Äasu vypne."
+"PÅÃdavné moduly, které k nahránà potÅebujà vÃce Äasu, budou umÃstÄny na "
+"Äernou listinu. Hodnota 0 pÅekroÄenà Äasu vypne."
-#: rc_option_editor.cc:1109
+#: rc_option_editor.cc:1111
msgid "Scan Time Out:"
msgstr "jak rychle zastavit hledánÃ, pokud nejsou výsledky:"
-#: rc_option_editor.cc:1157
+#: rc_option_editor.cc:1159
msgid "Waveform Clip Level (dBFS):"
msgstr "ÃroveÅ pÅebuzenà průbÄhové kÅivky (dBFS):"
-#: rc_option_editor.cc:1210
+#: rc_option_editor.cc:1212
msgid "Small sessions (4-16 tracks)"
msgstr "Malá sezenà (4-16 stop)"
-#: rc_option_editor.cc:1211
+#: rc_option_editor.cc:1213
msgid "Medium sessions (16-64 tracks)"
msgstr "StÅednà sezenà (16-64 stop)"
-#: rc_option_editor.cc:1212
+#: rc_option_editor.cc:1214
msgid "Large sessions (64+ tracks)"
msgstr "Velká sezenà (64 a vÃce stop)"
-#: rc_option_editor.cc:1213
+#: rc_option_editor.cc:1215
msgid "Custom (set by sliders below)"
msgstr "Vlastnà (nastaveno pomocà posuvnÃků nÞe)"
-#: rc_option_editor.cc:1217 export_video_dialog.cc:167
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
msgid "Preset:"
msgstr "PÅednastavenÃ:"
-#: rc_option_editor.cc:1229
+#: rc_option_editor.cc:1231
msgid "Playback (seconds of buffering):"
msgstr "PÅehrávánà (sekundy ukládánà do vyrovnávacà pamÄti):"
-#: rc_option_editor.cc:1242
+#: rc_option_editor.cc:1244
msgid "Recording (seconds of buffering):"
msgstr "Nahrávánà (sekundy ukládánà do vyrovnávacà pamÄti):"
-#: rc_option_editor.cc:1320
+#: rc_option_editor.cc:1322
msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
"Chyba v programovánÃ: neznámé pÅednastavenà (ÅetÄzec znaků) pro ukládánà do "
"vyrovnávacà pamÄti, index = %1"
-#: rc_option_editor.cc:1352
+#: rc_option_editor.cc:1353
msgid "Control Surface Protocol"
msgstr "Protokol pro ovládacà prvky"
-#: rc_option_editor.cc:1366
+#: rc_option_editor.cc:1367
msgid ""
"Click to edit the settings for selected protocol ( it must be ENABLED "
"first ):"
msgstr ""
-"KlepnÄte pro úpravu nastavenà pro vybraný protokol (nejprve musà být POVOLEN):"
+"KlepnÄte pro úpravu nastavenà pro vybraný protokol (nejprve musà být "
+"POVOLEN):"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1371
msgid "Show Protocol Settings"
msgstr "Ukázat nastavenà protokolu"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1494
msgid "Configuration"
msgstr "NastavenÃ"
-#: rc_option_editor.cc:1546
+#: rc_option_editor.cc:1547
msgid "Show Video Export Info before export"
msgstr ""
"Ukázat pÅed uloženÃm do souboru informace o způsobu vyvedenà obrazového "
"záznamu"
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:1548
msgid "Show Video Server Startup Dialog"
msgstr "Ukázat spouÅ¡tÄcà dialog videoserveru"
-#: rc_option_editor.cc:1548
+#: rc_option_editor.cc:1549
msgid "Advanced Setup (remote video server)"
msgstr "PokroÄilé nastavenà (vzdálený videoserver)"
#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
msgid ""
"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
"- Do not enable this option unless you know what you are doing."
@@ -10051,11 +10952,11 @@ msgstr ""
"<b>Je-li povoleno</b>, můžete urÄit adresu vlastnÃho videoserveru (URL) a "
"koÅen dokumentu (docroot). - Nepovolujte tuto volbu, pokud nevÃte, co dÄláte."
-#: rc_option_editor.cc:1558
+#: rc_option_editor.cc:1567
msgid "Video Server URL:"
msgstr "Adresa videoserveru (URL):"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:1572
msgid ""
"Base URL of the video-server including http prefix. This is usually 'http://"
"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -10065,11 +10966,11 @@ msgstr ""
"je 'http://hostname.example.org:1554/' a výchozà 'http://localhost:1554/', "
"když bÄžà videoserver mÃstnÄ"
-#: rc_option_editor.cc:1565
+#: rc_option_editor.cc:1574
msgid "Video Folder:"
msgstr "Složka s obrazovým záznamem:"
-#: rc_option_editor.cc:1570
+#: rc_option_editor.cc:1579
msgid ""
"Local path to the video-server document-root. Only files below this "
"directory will be accessible by the video-server. If the server run on a "
@@ -10084,7 +10985,7 @@ msgstr ""
"nedostupný. PoužÃvá se pro mÃstnà sledovánà videa a procházenà souborů, když "
"je soubor s videem otevÃrán/pÅidáván."
-#: rc_option_editor.cc:1577
+#: rc_option_editor.cc:1584
msgid ""
"<b>When enabled</b> an information window with details is displayed before "
"the video-export dialog."
@@ -10092,7 +10993,7 @@ msgstr ""
"<b>Je-li povoleno</b>, je pÅed dialogem pro ukládánà obrazového záznamu "
"zobrazeno informaÄnà okno s podrobnostmi."
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:1589
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
@@ -10100,91 +11001,113 @@ msgstr ""
"<b>Je-li povoleno</b>, videoserver nenà nikdy spuÅ¡tÄn automaticky bez "
"potvrzenÃ"
-#: rc_option_editor.cc:1723
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "%1 nastavenÃ"
-#: rc_option_editor.cc:1734
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
msgstr "PoužÃvánà CPU pro DSP"
-#: rc_option_editor.cc:1738
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "Zpracovávánà signálu použÃvá"
-#: rc_option_editor.cc:1743
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "VÅ¡ichni kromÄ jednoho zpracovatele"
-#: rc_option_editor.cc:1744
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "Všichni dostupnà zpracovatelé"
-#: rc_option_editor.cc:1747
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr "%1 zpracovatelé"
-#: rc_option_editor.cc:1750
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr "Toto nastavenà se neprojevÃ, dokud %1 nespustÃte znovu."
-#: rc_option_editor.cc:1755
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "Volby|ZpÄt"
-#: rc_option_editor.cc:1762
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "Potvrdit odstranÄnà poslednà nahrávky"
-#: rc_option_editor.cc:1767
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr "Správa sezenÃ"
-#: rc_option_editor.cc:1772
+#: rc_option_editor.cc:1912
msgid "Make periodic backups of the session file"
msgstr "DÄlat pravidelné zálohy souboru se sezenÃm"
-#: rc_option_editor.cc:1780
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Vždy kopÃrovat zavedené soubory"
-#: rc_option_editor.cc:1787
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr "Výchozà složka pro nová sezenÃ:"
-#: rc_option_editor.cc:1795
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "Nejvyššà poÄet nedávných sezenÃ"
-#: rc_option_editor.cc:1808
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr "ÃroveÅ hlasitosti klepnutÃ"
-#: rc_option_editor.cc:1813 route_time_axis.cc:269 route_time_axis.cc:833
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automatizace"
-#: rc_option_editor.cc:1818
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr "Násobek ztenÄovánà (vÄtšà hodnota => ménÄ dat)"
-#: rc_option_editor.cc:1827
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "Interval pro automatizaci (v milisekundách)"
-#: rc_option_editor.cc:1835
+#: rc_option_editor.cc:1975
msgid "Transport Options"
msgstr "Volby pro pÅehrávánÃ"
-#: rc_option_editor.cc:1841
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "Udržovat zapnuté nahrávánà po zastavenà zapojeno"
-#: rc_option_editor.cc:1850
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr "PÅehrávánà smyÄky je pÅehrávacà režim"
-#: rc_option_editor.cc:1855
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -10198,11 +11121,11 @@ msgstr ""
"<b>Když je zakázáno</b>, tlaÄÃtko pro smyÄku spustà pÅehrávánà ve smyÄce, "
"ale po stisknutà tlaÄÃtka Zastavit dojde ke zruÅ¡enà pÅehrávánà ve smyÄce"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr "Zastavit nahrávánà v pÅÃpadÄ xrun (Äasového rozdÃlu)"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
@@ -10210,15 +11133,15 @@ msgstr ""
"<b>Když je povoleno</b>, %1 zastavà nahrávánÃ, pokud je zjiÅ¡tÄno pÅeteÄenà "
"nebo podteÄenÃ"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "VytvoÅit znaÄky tam, kde se xrun (Äasový rozdÃl) objevÃ"
-#: rc_option_editor.cc:1881
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "Zastavit na konci sezenÃ"
-#: rc_option_editor.cc:1886
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -10231,11 +11154,11 @@ msgstr ""
"\n"
"<b>Když je zakázáno</b> %1 bude pokraÄovat vždy až na konec sezenÃ"
-#: rc_option_editor.cc:1894
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr "DÄlat souvislou smyÄku (nenà možné, když MTC, LTC atd. jsou hlavnÃ)"
-#: rc_option_editor.cc:1899
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -10245,18 +11168,18 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
"<b>Když je povoleno</b>, bude se pÅehrávat ve smyÄce ÄtenÃm vpÅed a na "
-"koncovém bodu "
-"smyÄky se skoÄà zpÄt, ÄÃmž se vyhne novému umÃstÄnà na konci smyÄky.\n"
+"koncovém bodu smyÄky se skoÄà zpÄt, ÄÃmž se vyhne novému umÃstÄnà na konci "
+"smyÄky.\n"
"\n"
"<b>Když je zakázáno</b>, skoÄà se pÅi dosaženà konce smyÄky na zaÄátek "
"smyÄky, když %1 dosáhne konce, což Äasto způsobà slyÅ¡itelné prasknutà nebo "
"zpoždÄnÃ"
-#: rc_option_editor.cc:1907
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr "Zakázat pÅi nahrávánà stav nahrávánà jednotlivé stopy"
-#: rc_option_editor.cc:1911
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
@@ -10264,12 +11187,12 @@ msgstr ""
"<b>Když je povoleno</b>, zabránà vám to v nechtÄném zastavenà nahrávánà "
"urÄitých stop"
-#: rc_option_editor.cc:1916
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr ""
"PÅi pÅetáÄenà rychle dopÅedu a rychle dozadu snÞit hladinu zvuku o 12dB"
-#: rc_option_editor.cc:1920
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
@@ -10277,11 +11200,11 @@ msgstr ""
"Toto omezà nepÅÃjemné zvýšenà vnÃmané hlasitosti, které se vyskytuje u "
"nÄkterého materiálu pÅi pÅetáÄenà vpÅed/zpÄtném chodu"
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:2066
msgid "Preroll"
msgstr "PÅetáÄenà vpÅed"
-#: rc_option_editor.cc:1931
+#: rc_option_editor.cc:2071
msgid ""
"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
"initiated.\n"
@@ -10293,45 +11216,53 @@ msgstr ""
"<b>pÅehrávánà s pÅetáÄenÃm vpÅed</b>.\n"
"\n"
"Pokud je povoleno <b>Následovat úpravy</b>, pÅetáÄenà vpÅed se použÃvá na "
-"polohu ukazatele pÅehrávánÃ, když je vybrána nebo v délce pÅizpůsobena oblast."
+"polohu ukazatele pÅehrávánÃ, když je vybrána nebo v délce pÅizpůsobena "
+"oblast."
-#: rc_option_editor.cc:1933
+#: rc_option_editor.cc:2073
msgid "0 (no pre-roll)"
msgstr "0 (žádné pÅetáÄenÃ)"
-#: rc_option_editor.cc:1934
+#: rc_option_editor.cc:2074
msgid "0.1 second"
msgstr "0,1 sekunda"
-#: rc_option_editor.cc:1935
+#: rc_option_editor.cc:2075
msgid "0.25 second"
msgstr "0,25 sekunda"
-#: rc_option_editor.cc:1936
+#: rc_option_editor.cc:2076
msgid "0.5 second"
msgstr "0,5 sekunda"
-#: rc_option_editor.cc:1937
+#: rc_option_editor.cc:2077
msgid "1.0 second"
msgstr "1,0 sekunda"
-#: rc_option_editor.cc:1938
+#: rc_option_editor.cc:2078
msgid "2.0 seconds"
msgstr "2,0 sekundy"
-#: rc_option_editor.cc:1941
-msgid "Sync/Slave"
-msgstr "Sync/Slave"
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
-#: rc_option_editor.cc:1945
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr "VnÄjšà zdroj Äasového kódu"
-#: rc_option_editor.cc:1954
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr "PÅizpůsobit rychlost snÃmkovánà obrazu vnÄjÅ¡Ãmu Äasovému kódu"
-#: rc_option_editor.cc:1960
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -10355,11 +11286,11 @@ msgstr ""
"ukazatel rychlosti snÃmkovánà v hlavnÃch hodinách zÄervená a %1 bude "
"pÅevádÄt mezi standardem vnÄjÅ¡Ãho Äasového kódu a standardem sezenÃ."
-#: rc_option_editor.cc:1970
+#: rc_option_editor.cc:2110
msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr "Uzamknout seÅizovánà Äasového kódu a hodin (zamezit vyrovnánà posunu))"
-#: rc_option_editor.cc:1976
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
@@ -10371,21 +11302,20 @@ msgid ""
"the timecode sources shares clock sync."
msgstr ""
"<b>Když je povoleno</b>, %1 nikdy nebude pÅehrávat s promÄnlivou rychlostÃ, "
-"když je seÅizován k vnÄjÅ¡Ãmu Äasovému kódu. Uzamknutà seÅizovánà "
-"ukazuje, že vybraný vnÄjšà zdroj Äasového kódu se zvukovým rozhranÃm "
-"sdÃlà seÅizovánà hodin (Black & Burst, Wordclock atd.) "
-"Tato volba vypÃná vyrovnávánà posunu. Rychlost pÅehrávánà je pevnÄ stanovena "
-"na "
-"1,0. Varispeed LTC se pÅehlÞà a zapÅÃÄiÅuje posun.\n"
+"když je seÅizován k vnÄjÅ¡Ãmu Äasovému kódu. Uzamknutà seÅizovánà ukazuje, že "
+"vybraný vnÄjšà zdroj Äasového kódu se zvukovým rozhranÃm sdÃlà seÅizovánà "
+"hodin (Black & Burst, Wordclock atd.) Tato volba vypÃná vyrovnávánà "
+"posunu. Rychlost pÅehrávánà je pevnÄ stanovena na 1,0. Varispeed LTC se "
+"pÅehlÞà a zapÅÃÄiÅuje posun.\n"
"\n"
-"<b>Když je zakázáno</b>, %1 bude vyrovnávat možný posun, nehledÄ na to, "
-"zda zdroje Äasového kódu sdÃlejà seÅizovánà hodin."
+"<b>Když je zakázáno</b>, %1 bude vyrovnávat možný posun, nehledÄ na to, zda "
+"zdroje Äasového kódu sdÃlejà seÅizovánà hodin."
-#: rc_option_editor.cc:1991
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "PevnÄ na 29,9700 snÃmků za sekundu (FPS) namÃsto 30000/1001"
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -10407,27 +11337,27 @@ msgstr ""
"nÄkteÅà výrobci tuto rychlost použÃvajà - i když je to proti specifikaci - "
"protože pÅi variantÄ s 29.97 fps se nevyskytuje žádný posuv Äasového kódu.\n"
-#: rc_option_editor.cc:2007
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr "ÄteÄka LTC"
-#: rc_option_editor.cc:2011
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr "Vstupnà pÅÃpojka LTC"
-#: rc_option_editor.cc:2027
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr "Generátor LTC"
-#: rc_option_editor.cc:2032
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr "Povolit generátor LTC"
-#: rc_option_editor.cc:2039
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr "Poslat LTC, když pÅehrávánà stojÃ"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
@@ -10435,28 +11365,27 @@ msgstr ""
"<b>Když je povoleno</b>, %1 bude pokraÄovat v posÃlánà informacà LTC, i když "
"se ukazatel polohy pÅehrávánà nepohybuje"
-#: rc_option_editor.cc:2051
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr "Hlasitost generátoru LTC"
-#: rc_option_editor.cc:2055
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
"Zadejte nejvyššà hodnotu hlasitosti vytvoÅeného signálu LTC v dbFS. Dobrou "
-"hodnotou pro "
-"kalibrovaný systém EBU je 0dBu ^= -18dbFS"
+"hodnotou pro kalibrovaný systém EBU je 0dBu ^= -18dbFS"
-#: rc_option_editor.cc:2064
+#: rc_option_editor.cc:2204
msgid "Make rubberband selection rectangle snap to the grid"
msgstr "UdÄlat z pružného výbÄru oblasti obdélnÃkové zapadnutà do mÅÞky"
-#: rc_option_editor.cc:2071
+#: rc_option_editor.cc:2211
msgid "Name new markers"
msgstr "Pojmenovat nové znaÄky"
-#: rc_option_editor.cc:2076
+#: rc_option_editor.cc:2216
msgid ""
"If enabled, popup a dialog when a new marker is created to allow its name to "
"be set as it is created.\n"
@@ -10468,401 +11397,411 @@ msgstr ""
"\n"
"ZnaÄky můžete vždy klepnutÃm pravým tlaÄÃtkem myÅ¡i na nÄ pÅejmenovat"
-#: rc_option_editor.cc:2082
+#: rc_option_editor.cc:2222
msgid "Allow dragging of playhead"
msgstr "Povolit taženà ukazatele polohy"
-#: rc_option_editor.cc:2090
-msgid "Show meters on tracks in the editor"
-msgstr "Ukázat mÄÅidla na stopách v editoru"
-
-#: rc_option_editor.cc:2098
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr "Zobrazit hlavnà mÄÅiÄ v nástrojovém pruhu"
-#: rc_option_editor.cc:2107
+#: rc_option_editor.cc:2239
msgid "Show zoom toolbar (if torn off)"
msgstr "Ukázat nástrojový pruh pro zvÄtÅ¡enà (pokud je spuÅ¡tÄn)"
-#: rc_option_editor.cc:2116
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+
+#: rc_option_editor.cc:2256
msgid "Update editor window during drags of the summary"
msgstr "Obnovit okno editoru bÄhem taženà shrnutÃ"
-#: rc_option_editor.cc:2124
+#: rc_option_editor.cc:2264
msgid "Auto-scroll editor window when dragging near its edges"
msgstr "Automaticky projÞdÄt okno editoru pÅi taženà blÃzko jeho okrajů"
-#: rc_option_editor.cc:2132
+#: rc_option_editor.cc:2272
msgid "Show gain envelopes in audio regions"
msgstr "Ukázat obálky zesÃlenà v oblastech zvuku"
-#: rc_option_editor.cc:2133
+#: rc_option_editor.cc:2273
msgid "in all modes"
msgstr "Ve všech režimech"
-#: rc_option_editor.cc:2134
+#: rc_option_editor.cc:2274
msgid "only in Draw and Internal Edit modes"
msgstr "Pouze v režimu kreslenà a vnitÅnÃch úprav"
-#: rc_option_editor.cc:2139
+#: rc_option_editor.cc:2279
msgid "Editor Behavior"
msgstr "Chovánà editoru"
-#: rc_option_editor.cc:2144
+#: rc_option_editor.cc:2284
msgid "Move relevant automation when audio regions are moved"
msgstr ""
"PÅesunout souvisejÃcà automatizaci, když jsou zvukové oblasti pÅesunuty"
-#: rc_option_editor.cc:2151
+#: rc_option_editor.cc:2291
msgid "Default fade shape"
msgstr "Výchozà tvar prolÃnánÃ"
-#: rc_option_editor.cc:2170
+#: rc_option_editor.cc:2310
msgid "Regions in active edit groups are edited together"
msgstr "Oblasti ve skupinách, které se upravujÃ, jsou upravovány spoleÄnÄ"
-#: rc_option_editor.cc:2171
+#: rc_option_editor.cc:2311
msgid "whenever they overlap in time"
msgstr "Vždycky když se ÄasovÄ pÅekrývajÃ"
-#: rc_option_editor.cc:2172
+#: rc_option_editor.cc:2312
msgid "only if they have identical length, position and origin"
msgstr "Jen když majà stejnou délku, polohu a původ"
-#: rc_option_editor.cc:2181
+#: rc_option_editor.cc:2321
msgid "Layering model"
msgstr "Model vrstvenÃ"
-#: rc_option_editor.cc:2186
+#: rc_option_editor.cc:2326
msgid "later is higher"
msgstr "PozdÄjšà je výše"
-#: rc_option_editor.cc:2187
+#: rc_option_editor.cc:2327
msgid "manual layering"
msgstr "RuÄnà vrstvenÃ"
-#: rc_option_editor.cc:2192
+#: rc_option_editor.cc:2332
msgid "After splitting selected regions, select"
msgstr "Po rozdÄlenà vybraných oblastÃ"
-#: rc_option_editor.cc:2197
+#: rc_option_editor.cc:2337
msgid "no regions"
msgstr "nevybrat žádné oblasti"
-#: rc_option_editor.cc:2200
+#: rc_option_editor.cc:2340
msgid "newly-created regions"
msgstr "vybrat novÄ vytvoÅené oblasti"
-#: rc_option_editor.cc:2204
+#: rc_option_editor.cc:2344
msgid "existing selection and newly-created regions"
msgstr "vybrat stávajÃcà oblast a novÄ vytvoÅené oblasti"
-#: rc_option_editor.cc:2208
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
msgid "Waveforms"
msgstr "Tvary vln"
-#: rc_option_editor.cc:2214
+#: rc_option_editor.cc:2354
msgid "Show waveforms in regions"
msgstr "Ukázat průbÄhovou kÅivku v oblastech"
-#: rc_option_editor.cc:2223
+#: rc_option_editor.cc:2363
msgid "Show waveforms for audio while it is being recorded"
msgstr "Ukázat průbÄhové kÅivky zvuku, když je nahráván"
-#: rc_option_editor.cc:2230
+#: rc_option_editor.cc:2370
msgid "Waveform scale"
msgstr "Velikost průbÄhové kÅivky"
-#: rc_option_editor.cc:2235
+#: rc_option_editor.cc:2375
msgid "linear"
msgstr "PÅÃmý"
-#: rc_option_editor.cc:2236
+#: rc_option_editor.cc:2376
msgid "logarithmic"
msgstr "Logaritmický"
-#: rc_option_editor.cc:2242
+#: rc_option_editor.cc:2382
msgid "Waveform shape"
msgstr "Podoba průbÄhové kÅivky"
-#: rc_option_editor.cc:2247
+#: rc_option_editor.cc:2387
msgid "traditional"
msgstr "TradiÄnÃ"
-#: rc_option_editor.cc:2248
+#: rc_option_editor.cc:2388
msgid "rectified"
msgstr "Narovnaná"
-#: rc_option_editor.cc:2257
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr "Ukládánà do vyrovnávacà pamÄti"
-#: rc_option_editor.cc:2265
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr "Sledovánà nahrávánà je spravováno"
-#: rc_option_editor.cc:2271
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr "pÅes ovladaÄ zvuku"
-#: rc_option_editor.cc:2277
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "zvukové technické vybavenÃ"
-#: rc_option_editor.cc:2284
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Režim páskového stroje"
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Spojenà stop a sbÄrnic"
-#: rc_option_editor.cc:2295
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "Automaticky spojit hlavnÃ/sledovacà sbÄrnice"
-#: rc_option_editor.cc:2302
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "Spojit vstupy stop"
-#: rc_option_editor.cc:2307
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "Automaticky s fyzickými vstupy"
-#: rc_option_editor.cc:2308 rc_option_editor.cc:2321
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "RuÄnÄ"
-#: rc_option_editor.cc:2314
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "Spojit výstupy stop a sbÄrnic"
-#: rc_option_editor.cc:2319
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "automaticky s fyzickými výstupy"
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "automaticky s hlavnà sbÄrnicÃ"
-#: rc_option_editor.cc:2326
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr "Neobvyklé hodnoty"
-#: rc_option_editor.cc:2331
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr ""
"PoužÃt pÅedpÄtà pÅÃmého proudu (DC bias) pro ochranu proti neobvyklým "
"hodnotám"
-#: rc_option_editor.cc:2338
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "ÅÃzenà zpracovánÃ"
-#: rc_option_editor.cc:2344
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "Žádné ÅÃzenà zpracovánÃ"
-#: rc_option_editor.cc:2350
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr "PoužÃt ZrudnoutKNule"
-#: rc_option_editor.cc:2357
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "PoužÃt NeobvykléHodnotyJsouNula"
-#: rc_option_editor.cc:2364
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr "PoužÃt ZrudnoutKNule a NeobvykléHodnotyJsouNula"
-#: rc_option_editor.cc:2380
-msgid "Silence plugins when the transport is stopped"
-msgstr "ZtiÅ¡it pÅÃdavné moduly, když je pohyb zastaven "
-
-#: rc_option_editor.cc:2388
-msgid "Make new plugins active"
-msgstr "Uvést nové pÅÃdavné moduly do Äinnosti"
-
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "Povolit automatický rozbor zvuku"
-#: rc_option_editor.cc:2406
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "Zreprodukovat chybÄjÃcà kanály oblasti"
-#: rc_option_editor.cc:2413 rc_option_editor.cc:2422 rc_option_editor.cc:2424
-#: rc_option_editor.cc:2432 rc_option_editor.cc:2440 rc_option_editor.cc:2448
-#: rc_option_editor.cc:2466 rc_option_editor.cc:2478 rc_option_editor.cc:2490
-#: rc_option_editor.cc:2492 rc_option_editor.cc:2494 rc_option_editor.cc:2502
-#: rc_option_editor.cc:2510 rc_option_editor.cc:2518 rc_option_editor.cc:2526
-#: rc_option_editor.cc:2528
-msgid "Solo / mute"
-msgstr "Sólo/Ztlumit"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
-#: rc_option_editor.cc:2417
+#: rc_option_editor.cc:2551
msgid "Solo controls are Listen controls"
msgstr "Ovládacà prvky pro sólo jsou ovládacÃmi prvky pro poslech"
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:2561
msgid "Exclusive solo"
msgstr "Výhradnà sólo"
-#: rc_option_editor.cc:2435
+#: rc_option_editor.cc:2569
msgid "Show solo muting"
msgstr "Sólo ukázat jako onÄmÄlé"
-#: rc_option_editor.cc:2443
+#: rc_option_editor.cc:2577
msgid "Soloing overrides muting"
msgstr "Sólo má pÅednost pÅed ztlumenÃm"
-#: rc_option_editor.cc:2451
+#: rc_option_editor.cc:2585
msgid "Solo-in-place mute cut (dB)"
msgstr "Vyjmutà ztlumenà sóla (dB)"
-#: rc_option_editor.cc:2458
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr "Poloha poslechu"
-#: rc_option_editor.cc:2463
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr "Po-prolÃnaÄ (AFL)"
-#: rc_option_editor.cc:2464
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr "PÅed-prolÃnaÄ (PFL)"
-#: rc_option_editor.cc:2470
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr "PFL signály pÅicházejà z"
-#: rc_option_editor.cc:2475
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr "Zpracovatelé pÅed pÅed-prolÃnaÄe"
-#: rc_option_editor.cc:2476
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr "Zpracovatelé pÅed-prolÃnaÄe ale po pÅed-prolÃnaÄe"
-#: rc_option_editor.cc:2482
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr "AFL signály pÅicházejà z"
-#: rc_option_editor.cc:2487
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr "OkamžitÄ po-prolÃnaÄi"
-#: rc_option_editor.cc:2488
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr "Zpracovatelé po po-prolÃnaÄe (pÅed vyváženÃm)"
-#: rc_option_editor.cc:2492
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "Výchozà volby pro ztlumenà stopy/sbÄrnice"
-#: rc_option_editor.cc:2497
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr "Ztlumenà ovlivnà odeslánà pÅed-prolÃnaÄe"
-#: rc_option_editor.cc:2505
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr "Ztlumenà ovlivnà odeslánà po-prolÃnaÄe"
-#: rc_option_editor.cc:2513
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "Ztlumenà ovlivnà ovládacà výstupy"
-#: rc_option_editor.cc:2521
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "Ztlumenà ovlivnà hlavnà výstupy"
-#: rc_option_editor.cc:2526
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr "Vedenà odeslánÃ"
-#: rc_option_editor.cc:2531
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr "Spojà vyvažovaÄe AUX a vnÄjÅ¡Ãho odeslánà s hlavnÃm vyvažovaÄem"
-#: rc_option_editor.cc:2536
+#: rc_option_editor.cc:2672
msgid "MIDI Preferences"
msgstr "Nastavenà MIDI"
-#: rc_option_editor.cc:2541
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr "Äas Ätenà v pÅedstihu MIDI (sekundy)"
-#: rc_option_editor.cc:2551
+#: rc_option_editor.cc:2687
msgid "Initial program change"
msgstr "PoÄáteÄnà zmÄna programu"
-#: rc_option_editor.cc:2560
+#: rc_option_editor.cc:2696
msgid "Display first MIDI bank/program as 0"
msgstr "Zobrazit prvnà banku/program MIDI jako 0"
-#: rc_option_editor.cc:2568
+#: rc_option_editor.cc:2704
msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
msgstr "Nikdy nezobrazovat periodické zprávy MIDI (MTC, hodiny MIDI)"
-#: rc_option_editor.cc:2576
+#: rc_option_editor.cc:2712
msgid "Sound MIDI notes as they are selected in the editor"
msgstr "Noty MIDI zaznÃvajà pÅi výbÄru v editoru"
-#: rc_option_editor.cc:2584
+#: rc_option_editor.cc:2720
msgid "Send MIDI control feedback"
msgstr "Poslat zpÄtnou vazbu k ovládánà MIDI"
-#: rc_option_editor.cc:2589
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
msgid "MIDI Clock"
msgstr "Hodiny MIDI"
-#: rc_option_editor.cc:2599
+#: rc_option_editor.cc:2735
msgid "MIDI Time Code (MTC)"
msgstr "Äasový kód MIDI (MTC)"
-#: rc_option_editor.cc:2604
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr "Poslat Äasový kód MIDI"
-#: rc_option_editor.cc:2612
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr ""
"Procento kterékoli strany bÄžné rychlosti pohybu k odeslánà Äasového kódu "
"MIDI (MTC)"
-#: rc_option_editor.cc:2618
+#: rc_option_editor.cc:2754
msgid "Midi Machine Control (MMC)"
msgstr "Ovládánà stroje MIDI (MMC)"
-#: rc_option_editor.cc:2623
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "PÅijÃmat pÅÃkazy pro ovládánà stroje MIDI"
-#: rc_option_editor.cc:2631
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
msgstr "Poslat pÅÃkazy pro ovládánà stroje MIDI"
-#: rc_option_editor.cc:2639
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr "ID zaÅÃzenà MMC (ovládánà stroje MIDI) na vstupu"
-#: rc_option_editor.cc:2648
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr "ID zaÅÃzenà MMC (ovládánà stroje MIDI) na výstupu"
-#: rc_option_editor.cc:2654
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr "Poslech MIDI"
-#: rc_option_editor.cc:2658
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr "Syntetizátor pro poslech MIDI (LV2)"
-#: rc_option_editor.cc:2689 rc_option_editor.cc:2699 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr "Uživatelská interakce"
-#: rc_option_editor.cc:2692
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
@@ -10872,35 +11811,23 @@ msgstr ""
" <i>(aby se projevilo, vyžaduje opÄtovné spuÅ¡tÄnà %1)</i>\n"
" <i>(je-li dostupné pro vaÅ¡e jazykové nastavenÃ)</i>"
-#: rc_option_editor.cc:2699
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "Klávesnice"
-#: rc_option_editor.cc:2709
-msgid "Control surface remote ID"
-msgstr "Vzdálené ID pro ovládacà prvky"
-
-#: rc_option_editor.cc:2714
-msgid "assigned by user"
-msgstr "urÄeno uživatelem"
-
-#: rc_option_editor.cc:2715
-msgid "follows order of mixer"
-msgstr "následuje poÅadà ve smÄÅ¡ovaÄi"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Hledat pÅÃdavné moduly"
-#: rc_option_editor.cc:2723
+#: rc_option_editor.cc:2853
msgid "General"
msgstr "Obecné"
-#: rc_option_editor.cc:2726 startup.cc:351
-msgid "Scan for Plugins"
-msgstr "Hledat pÅÃdavné moduly"
-
-#: rc_option_editor.cc:2731
+#: rc_option_editor.cc:2858
msgid "Always Display Plugin Scan Progress"
msgstr "Vždy ukázat postup hledánà pÅÃdavného modulu"
-#: rc_option_editor.cc:2737
+#: rc_option_editor.cc:2864
msgid ""
"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
"for indexing (cache load) and discovery (detect new plugins)"
@@ -10909,15 +11836,44 @@ msgstr ""
"hledánà pÅÃdavného modulu pro rejstÅÃkovánà (nahránà vyrovnávacà pamÄti) a "
"zjišťovánà (zjiÅ¡tÄnà nových pÅÃdavných modulů)"
-#: rc_option_editor.cc:2742
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "ZtiÅ¡it pÅÃdavné moduly, když je pohyb zastaven "
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Uvést nové pÅÃdavné moduly do Äinnosti"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
msgid "VST"
msgstr "VST"
-#: rc_option_editor.cc:2746
+#: rc_option_editor.cc:2892
msgid "Scan for [new] VST Plugins on Application Start"
msgstr "PÅi spuÅ¡tÄnà programu hledat [nové] pÅÃdavné moduly VST"
-#: rc_option_editor.cc:2752
+#: rc_option_editor.cc:2898
msgid ""
"<b>When enabled</b> new VST plugins are searched, tested and added to the "
"cache index on application start. When disabled new plugins will only be "
@@ -10927,11 +11883,11 @@ msgstr ""
"moduly, jsou vyzkouÅ¡eny a pÅidány do rejstÅÃku vyrovnávacà pamÄti. Když je "
"zakázáno, nové pÅÃdavné moduly jsou dostupné jen po ruÄnÄ provedeném hledánÃ."
-#: rc_option_editor.cc:2758
+#: rc_option_editor.cc:2904
msgid "Verbose Plugin Scan"
msgstr "Podrobné hledánà pÅÃdavných modulů"
-#: rc_option_editor.cc:2764
+#: rc_option_editor.cc:2910
msgid ""
"<b>When enabled</b> additional information for every plugin is added to the "
"Log Window."
@@ -10939,35 +11895,39 @@ msgstr ""
"<b>Když je povoleno</b>, jsou do okna se zápisem pro každý pÅÃdavný modul "
"pÅidány dodateÄné informace."
-#: rc_option_editor.cc:2772
+#: rc_option_editor.cc:2918
msgid "VST Cache:"
msgstr "Vyrovnávacà pamÄÅ¥ VST:"
-#: rc_option_editor.cc:2777
+#: rc_option_editor.cc:2923
msgid "VST Blacklist:"
msgstr "Äerná listina VST:"
-#: rc_option_editor.cc:2784
+#: rc_option_editor.cc:2930
msgid "Linux VST Path:"
msgstr "Cesta k VST v Linuxu:"
-#: rc_option_editor.cc:2789 rc_option_editor.cc:2802
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
msgid "Path:"
msgstr "Cesta:"
-#: rc_option_editor.cc:2798
+#: rc_option_editor.cc:2944
msgid "Windows VST Path:"
msgstr "Cesta k VST ve Windows:"
-#: rc_option_editor.cc:2808
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
msgid "Audio Unit"
msgstr "Audio Unit"
-#: rc_option_editor.cc:2812
+#: rc_option_editor.cc:2958
msgid "Scan for AudioUnit Plugins on Application Start"
msgstr "PÅi spuÅ¡tÄnà programu hledat pÅÃdavné moduly Audio Unit"
-#: rc_option_editor.cc:2818
+#: rc_option_editor.cc:2964
msgid ""
"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
"When disabled AU plugins will only be available after triggering a 'Scan' "
@@ -10980,79 +11940,112 @@ msgstr ""
"automatické hledánà Audio Unit. Jakýkoli pád bÄhem zjišťovánà pÅÃdavného "
"modulu je hledánà zakáže."
-#: rc_option_editor.cc:2823
+#: rc_option_editor.cc:2969
msgid "AU Cache:"
msgstr "Vyrovnávacà pamÄÅ¥ AU:"
-#: rc_option_editor.cc:2828
+#: rc_option_editor.cc:2974
msgid "AU Blacklist:"
msgstr "Äerná listina AU:"
-#: rc_option_editor.cc:2832
+#: rc_option_editor.cc:2978
msgid "Plugin GUI"
msgstr "Rozhranà pro pÅÃdavný modul"
-#: rc_option_editor.cc:2836
+#: rc_option_editor.cc:2982
msgid "Automatically open the plugin GUI when adding a new plugin"
msgstr ""
"Automaticky otevÅÃt rozhranà pÅÃdavného modulu pÅi pÅidánà nového pÅÃdavného "
"modulu"
-#: rc_option_editor.cc:2847
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3032
msgid "Disable Graphics Hardware Acceleration (requires restart)"
msgstr "Zakázat hardwarové zrychlenà (vyžaduje opÄtovné spuÅ¡tÄnÃ)"
-#: rc_option_editor.cc:2853
+#: rc_option_editor.cc:3038
msgid ""
"Render large parts of the application user-interface in software, instead of "
"using 2D-graphics acceleration.\n"
"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2854 rc_option_editor.cc:2866 rc_option_editor.cc:2869
-#: rc_option_editor.cc:2878 rc_option_editor.cc:2887 rc_option_editor.cc:2906
-#: rc_option_editor.cc:2922 rc_option_editor.cc:2938 rc_option_editor.cc:2952
-#: rc_option_editor.cc:2961
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
msgid "Preferences|GUI"
msgstr "RozhranÃ"
-#: rc_option_editor.cc:2860
+#: rc_option_editor.cc:3045
msgid "Possibly improve slow graphical performance (requires restart)"
msgstr ""
-"Pokusit se v pÅÃpadÄ pomalého obrazového výkonu o zlepÅ¡enà (vyžaduje opÄtovné "
-"spuÅ¡tÄnÃ)"
+"Pokusit se v pÅÃpadÄ pomalého obrazového výkonu o zlepÅ¡enà (vyžaduje "
+"opÄtovné spuÅ¡tÄnÃ)"
-#: rc_option_editor.cc:2865
+#: rc_option_editor.cc:3050
msgid ""
"Disables hardware gradient rendering on buggy video drivers (\"buggy "
"gradients patch\").\n"
"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2872
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "ObrazovÄ naznaÄovat pÅejetà ukazovátka myÅ¡i nad různými prvky"
-#: rc_option_editor.cc:2881
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr "Ukázat nástrojové rady, když myÅ¡ pÅejede nad prvkem"
-#: rc_option_editor.cc:2890
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
"PoužÃvat v zobrazenà oblastà barevné proužky na zvýraznÄnà názvu (vyžaduje "
"opÄtovné spuÅ¡tÄnÃ)"
-#: rc_option_editor.cc:2898
+#: rc_option_editor.cc:3089
msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
"Obnovit zobrazenà hodin pohybu v snÃmcÃch za sekundu (FPS) každých 100 ms"
-#: rc_option_editor.cc:2913
+#: rc_option_editor.cc:3104
msgid "Waveform image cache size (megabytes)"
msgstr "Velikost vyrovnávacà pamÄti obrázku tvaru vlny (MB)"
-#: rc_option_editor.cc:2921
+#: rc_option_editor.cc:3112
msgid ""
"Increasing the cache size uses more memory to store waveform images, which "
"can improve graphical performance."
@@ -11060,96 +12053,102 @@ msgstr ""
"VÄtšà vyrovnávacà pamÄÅ¥ použÃvá na ukládánà obrázků tvaru vlny vÃce pamÄti, "
"což může vést ke zlepšenà obrazového výkonu."
-#: rc_option_editor.cc:2929
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr "PÅekroÄenà Äasu uzamknutà (sekundy)"
-#: rc_option_editor.cc:2937
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
"Uzamknout rozhranà po tolika sekundách neÄinnosti (nula, aby nikdy nedoÅ¡lo k "
"zamknutÃ)"
-#: rc_option_editor.cc:2954
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr "Proužek smÄÅ¡ovaÄe"
-#: rc_option_editor.cc:2964
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr "PoužÃt úzké proužky ve smÄÅ¡ovaÄi jako výchozÃ"
-#: rc_option_editor.cc:2969 rc_option_editor.cc:2983 rc_option_editor.cc:3000
-#: rc_option_editor.cc:3016 rc_option_editor.cc:3032 rc_option_editor.cc:3046
-#: rc_option_editor.cc:3072 rc_option_editor.cc:3090 rc_option_editor.cc:3101
-#: rc_option_editor.cc:3108 rc_option_editor.cc:3110
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr "NastavenÃ|Ukazatel hladiny"
-#: rc_option_editor.cc:2973
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr "Äas drženà nejvyššà hodnoty"
-#: rc_option_editor.cc:2979
+#: rc_option_editor.cc:3179
msgid "short"
msgstr "Krátký"
-#: rc_option_editor.cc:2980
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr "StÅednÃ"
-#: rc_option_editor.cc:2981
+#: rc_option_editor.cc:3181
msgid "long"
msgstr "Dlouhý"
-#: rc_option_editor.cc:2987
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr "Klesánà DPM"
-#: rc_option_editor.cc:2993
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr "Velmi pomalé [6,6 dB/s]"
-#: rc_option_editor.cc:2994
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "Pomalé [8,6 dB/s] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:2995
+#: rc_option_editor.cc:3195
msgid "moderate [12.0dB/sec] (DIN)"
msgstr "MÃrné [12.0dB/s] (DIN)"
-#: rc_option_editor.cc:2996
+#: rc_option_editor.cc:3196
msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr "StÅednà [13,3 dB/s] (EBU Digi PPM, IRT Digi PPM)"
-#: rc_option_editor.cc:2997
+#: rc_option_editor.cc:3197
msgid "fast [20dB/sec]"
msgstr "Rychlé [20 dB/s]"
-#: rc_option_editor.cc:2998
+#: rc_option_editor.cc:3198
msgid "very fast [32dB/sec]"
msgstr "Velice rychlé [32 dB/s]"
-#: rc_option_editor.cc:3004
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr "ÃroveÅ vyrovnánà mÄÅidla; 0dBu"
-#: rc_option_editor.cc:3009 rc_option_editor.cc:3025
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr "-24 dBFS (SMPTE US: 4dBu = -20dBFS)"
-#: rc_option_editor.cc:3010 rc_option_editor.cc:3026
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr "-20 dBFS (SMPTE RP.0155)"
-#: rc_option_editor.cc:3011 rc_option_editor.cc:3027
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr "-18 dBFS (EBU, BBC)"
-#: rc_option_editor.cc:3012 rc_option_editor.cc:3028
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr "-15 dBFS (DIN)"
-#: rc_option_editor.cc:3014
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -11157,72 +12156,95 @@ msgstr ""
"Nastavit znaÄky mÄÅidla a bod barevného kolena pro dBFS scale DPM, nastavit "
"srovnávacà úroveÅ pro IEC1/Nordic, IEC2 PPM a VU mÄÅidlo."
-#: rc_option_editor.cc:3020
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr "ÃroveÅ vyrovnánà mÄÅidla IEC1/DIN; 0dBu"
-#: rc_option_editor.cc:3030
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr "Srovnávacà úroveÅ pro IEC1/DIN mÄÅidlo."
-#: rc_option_editor.cc:3036
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr "Standardnà mÄÅidlo VU"
-#: rc_option_editor.cc:3041
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr "0VU = -2 dBu (Francie)"
-#: rc_option_editor.cc:3042
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr "0VU = 0 dBu (Severnà Amerika, Austrálie)"
-#: rc_option_editor.cc:3043
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr "0VU = +4 dBu (standardnÃ)"
-#: rc_option_editor.cc:3044
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr "0VU = +8 dBu"
-#: rc_option_editor.cc:3050
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr "Práh pro nejvyššà hodnotu zvuku [dBFS]"
-#: rc_option_editor.cc:3059
+#: rc_option_editor.cc:3259
msgid "Default Meter Type for Master Bus"
msgstr "Výchozà typ mÄÅicÃho ukazatele pro hlavnà sbÄrnici"
-#: rc_option_editor.cc:3077
+#: rc_option_editor.cc:3277
msgid "Default Meter Type for Busses"
msgstr "Výchozà typ mÄÅicÃho ukazatele pro sbÄrnice"
-#: rc_option_editor.cc:3094
+#: rc_option_editor.cc:3294
msgid "Default Meter Type for Tracks"
msgstr "Výchozà typ mÄÅicÃho ukazatele pro stopy"
-#: rc_option_editor.cc:3106
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
"Stanovte úroveÅ zvukového signálu v dbFS, na nÞ a nad nÞ ukazatel nejvyššà "
-"hodnoty "
-"mÄÅidla zÄervená."
+"hodnoty mÄÅidla zÄervená."
-#: rc_option_editor.cc:3113
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr "Styl mÄÅidla LED"
-#: rc_option_editor.cc:3121
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Ukázat mÄÅidla na stopách v editoru"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr "Vzhled"
-#: rc_option_editor.cc:3194
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
msgid "Set Linux VST Search Path"
msgstr "Nastavit cestu k hledánà VST v Linuxu"
-#: rc_option_editor.cc:3208
+#: rc_option_editor.cc:3443
msgid "Set Windows VST Search Path"
msgstr "Nastavit cestu k hledánà VST ve Windows"
@@ -11298,33 +12320,33 @@ msgstr "Stopa:"
msgid "Choose Top Region"
msgstr "Vybrat hornà oblast"
-#: region_view.cc:270
+#: region_view.cc:271
msgid "SilenceText"
msgstr "Text pro ticho"
-#: region_view.cc:285 region_view.cc:304
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "minut"
-#: region_view.cc:288 region_view.cc:307
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "milisekund"
-#: region_view.cc:291 region_view.cc:310
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "sekund"
-#: region_view.cc:294
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] "%1 Äást ticha"
msgstr[1] "%1 Äásti ticha"
-#: region_view.cc:296
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr "nejkratšà = %1 %2"
-#: region_view.cc:313
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -11372,55 +12394,63 @@ msgstr "Kullback-Liebler"
msgid "Modified Kullback-Liebler"
msgstr "Upravený Kullback-Liebler"
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "RozdÄlit oblast"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr "Zapadnout oblasti"
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "PÅizpůsobit oblasti"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "Rytmická páska"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Rozbor dat"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "Funkce rozpoznánÃ"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Mezera spuÅ¡tÄnà (ms)"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:65
-msgid "Threshold"
-msgstr "Práh"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "Prahová hodnota zvuku (dB)"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "Prahová hodnota ticha (dB)"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "Citlivost"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Operace"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "RozdÄlit oblasti (rytmická páska)"
@@ -11444,19 +12474,15 @@ msgstr "Povolenà nahrávánÃ"
msgid "Active state"
msgstr "Zapnuto"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:87
-msgid "Color"
-msgstr "Barva"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr "DialogProSkupinuCest"
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>SdÃlenÃ</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr "Název skupiny nenà jedineÄný. Použijte, prosÃm, jiný název."
@@ -11476,84 +12502,88 @@ msgstr "Výstupy"
msgid "Plugins, Inserts & Sends"
msgstr "PÅÃdavné moduly, vložky & odeslánÃ"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "Položka v seznamu s cestami pro pÅejmenovanou cestu nebyla nalezena!"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "ZpoždÄnà pÅehrávánÃ: %<PRId64> vzorků"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "ŽÃDNà STOPA"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "PÅidat stopu nebo sbÄrnici"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "Nebyla vybrána žádná stopa nebo sbÄrnice"
-#: route_time_axis.cc:105
+#: route_time_axis.cc:104
msgid "RTAV|G"
msgstr "G"
-#: route_time_axis.cc:106
+#: route_time_axis.cc:105
msgid "RTAV|P"
msgstr "P"
-#: route_time_axis.cc:107
+#: route_time_axis.cc:106
msgid "RTAV|A"
msgstr "A"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr "Nahrávat (klepnutà pravým tlaÄÃtkem myÅ¡i pro Ãpravu kroku)"
-#: route_time_axis.cc:187
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Nahrávat"
-#: route_time_axis.cc:257
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "Skupina zpracovánÃ"
-#: route_time_axis.cc:267
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr "Ovládacà prvky MIDI a automatizace"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "Ukázat všechny automatizace"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "Ukázat stávajÃcà automatizace"
-#: route_time_axis.cc:504
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "Skrýt všechny automatizace"
-#: route_time_axis.cc:513
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr "Automatizace procesoru"
-#: route_time_axis.cc:520
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "ProlÃnaÄ"
-#: route_time_axis.cc:547
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "VyváženÃ"
-#: route_time_axis.cc:638
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "PÅekryto"
-#: route_time_axis.cc:644
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "Naskládáno"
-#: route_time_axis.cc:652
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Vrstvy"
@@ -11570,11 +12600,11 @@ msgid "(Currently: Capture Time)"
msgstr "(NynÃ: Äas zachycenÃ)"
#: route_time_axis.cc:741
-msgid "Align with Existing Material"
+msgid "Align With Existing Material"
msgstr "Zarovnat se stávajÃcÃm materiálem"
#: route_time_axis.cc:746
-msgid "Align with Capture Time"
+msgid "Align With Capture Time"
msgstr "Zarovnat s Äasem nahrávky"
#: route_time_axis.cc:751
@@ -11597,189 +12627,193 @@ msgstr "Nevrstvený režim"
msgid "Record Mode"
msgstr "Režim nahrávánÃ"
-#: route_time_axis.cc:811 route_time_axis.cc:1806
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Seznam skladeb"
-#: route_time_axis.cc:1109
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "PÅejmenovat seznam skladeb"
-#: route_time_axis.cc:1110
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "Nový název pro seznam skladeb:"
-#: route_time_axis.cc:1195
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "Seznam skladeb nové kopie"
-#: route_time_axis.cc:1196 route_time_axis.cc:1249
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "Název pro nový seznam skladeb:"
-#: route_time_axis.cc:1248
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "Nový seznam skladeb"
-#: route_time_axis.cc:1452
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "Nemůžete vytvoÅit stopu s tÃmto názvem, protože je zamluvený pro %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
-#: route_time_axis.cc:1695
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "Nová kopie..."
-#: route_time_axis.cc:1699
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "Nový zábÄr"
-#: route_time_axis.cc:1700
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "KopÃrovat zábÄr"
-#: route_time_axis.cc:1705
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Smazat vybrané"
-#: route_time_axis.cc:1708
+#: route_time_axis.cc:1697
msgid "Select from All..."
msgstr "Vybrat ze všeho..."
-#: route_time_axis.cc:1796
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr "VzÃt: %1.%2"
-#: route_time_axis.cc:2202 selection.cc:1009 selection.cc:1063
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "Chyba v programovánÃ:"
-#: route_time_axis.cc:2622
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr "Podložky"
-#: route_time_axis.cc:2625
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "Odstranit \"%1\""
-#: route_time_axis.cc:2675 route_time_axis.cc:2712
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
"Chyba v programovánÃ: dvojice vodÃtek odkazujÃcà na podložku jsou "
"nesluÄitelné!"
-#: route_time_axis.cc:2739
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr "Poslech po-prolÃnaÄi (AFL)"
-#: route_time_axis.cc:2743
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr "Poslech pÅed-prolÃnaÄem (PFL)"
-#: route_ui.cc:153
+#: route_ui.cc:165
msgid "Mute this track"
msgstr "Ztlumit tuto stopu"
-#: route_ui.cc:157
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr "Ztlumit ostatnà stopy (nesólové)"
-#: route_ui.cc:163
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr "Spustit nahrávánà do této stopy"
-#: route_ui.cc:171
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr "Proužky smÄÅ¡ovaÄe ukazujà odeslánà do této sbÄrnice"
-#: route_ui.cc:176
+#: route_ui.cc:188
msgid "Monitor input"
msgstr "Sledovat vstup"
-#: route_ui.cc:182
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr "Sledovat pÅehrávánÃ"
-#: route_ui.cc:691
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr "Nespojeno se zvukovým strojem - nelze zaÄÃt s nahrávánÃm"
-#: route_ui.cc:890
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr "Zápis kroku"
-#: route_ui.cc:963
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr "PÅiÅadit vÅ¡echny stopy (pÅed-prolÃnaÄ)"
-#: route_ui.cc:967
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr "PÅiÅadit vÅ¡echny stopy a sbÄrnice (pÅed-prolÃnaÄ)"
-#: route_ui.cc:971
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr "PÅiÅadit vÅ¡echny stopy (po-prolÃnaÄ)"
-#: route_ui.cc:975
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr "PÅiÅadit vÅ¡echny stopy a sbÄrnice (po-prolÃnaÄ)"
-#: route_ui.cc:979
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr "PÅiÅadit vybrané stopy (pÅed-prolÃnaÄ)"
-#: route_ui.cc:983
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr "PÅiÅadit vybrané stopy a sbÄrnice (pÅed-prolÃnaÄ)"
-#: route_ui.cc:986
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr "PÅiÅadit vybrané stopy (po-prolÃnaÄ)"
-#: route_ui.cc:990
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr "PÅiÅadit vybrané stopy a sbÄrnice (po-prolÃnaÄ)"
-#: route_ui.cc:993
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr "KopÃrovat zesÃlenà stop/sbÄrnic do odeslánÃ"
-#: route_ui.cc:994
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr "Nastavit zesÃlenà odeslánà na -inf."
-#: route_ui.cc:995
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr "Nastavit zesÃlenà odeslánà na 0dB"
-#: route_ui.cc:1314
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr "Samostatné sólo"
-#: route_ui.cc:1321
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr "ZajiÅ¡tÄné sólo"
-#: route_ui.cc:1343
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr "Odeslánà pÅed-prolÃnaÄe"
-#: route_ui.cc:1349
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr "Odeslánà po-prolÃnaÄe"
-#: route_ui.cc:1355
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "Ovládacà výstupy"
-#: route_ui.cc:1361
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "Hlavnà výstupy"
-#: route_ui.cc:1527
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr "VýbÄr barvy"
-#: route_ui.cc:1592
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -11787,100 +12821,51 @@ msgstr ""
"Od použità dvojteÄky (':') se odrazuje v názvech stop a sbÄrnic.\n"
"Chcete použÃt tento nový název?"
-#: route_ui.cc:1596
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr "PoužÃt nový název"
-#: route_ui.cc:1597
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr "Upravit název znovu"
-#: route_ui.cc:1610
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "PÅejmenovat stopu"
-#: route_ui.cc:1612
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr "PÅejmenovat sbÄrnici"
-#: route_ui.cc:1680
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": editor poznámek"
-#: route_ui.cc:1852
+#: route_ui.cc:1848
msgid " latency"
msgstr " Prodleva"
-#: route_ui.cc:1892
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr "Nelze vytvoÅit adresáŠ%1 pro pÅedlohu cesty"
-#: route_ui.cc:1898
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr "Uložit jako pÅedlohu"
-#: route_ui.cc:1899
+#: route_ui.cc:1895
msgid "Template name:"
msgstr "Název pÅedlohy:"
-#: route_ui.cc:1976
-msgid "Remote Control ID"
-msgstr "ID dálkového ovládánÃ"
-
-#: route_ui.cc:1986
-msgid "Remote control ID:"
-msgstr "ID dálkového ovládánÃ:"
-
-#: route_ui.cc:2000
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-"ID dálkového ovládánà %1 je: %2\n"
-"\n"
-"\n"
-"ID dálkového ovládánà %3 nelze zmÄnit."
-
-#: route_ui.cc:2004
-msgid "the master bus"
-msgstr "Hlavnà sbÄrnice"
-
-#: route_ui.cc:2004
-msgid "the monitor bus"
-msgstr "Sledovacà sbÄrnice"
-
-#: route_ui.cc:2006
+#: route_ui.cc:2019
msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
msgstr ""
-"ID dálkového ovládánà %5 je: %2\n"
-"\n"
-"\n"
-"ID dálkového ovládánà jsou v souÄasnosti urÄeny poÅadÃm stopy/sbÄrnice v %6\n"
-"\n"
-"\n"
-"%3Použijte kartu Uživatelská interakce v oknÄ pro nastavenÃ, pokud to chcete "
-"zmÄnit%4"
-#: route_ui.cc:2063
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
msgstr ""
-"Klepnutà levým tlaÄÃtkem myÅ¡i pro obrácenà (otoÄenà fáze) kanálu %1 této "
-"stopy. Klepnutà pravým tlaÄÃtkem myÅ¡i pro ukázánà nabÃdky."
-
-#: route_ui.cc:2065
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "KlepnÄte pro ukázánà kanálů pro obrácenà (otoÄenà fáze)"
#: save_as_dialog.cc:34
msgid "Switch to newly-saved version"
@@ -11918,6 +12903,30 @@ msgstr "KlepnÄte pro pÅidánà nového umÃstÄnÃ"
msgid "the session folder"
msgstr "Složka se sezenÃm"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr "Poslat "
@@ -11930,7 +12939,7 @@ msgstr "ZÅÃzenà sezenÃ"
msgid "Advanced options ..."
msgstr "PokroÄilé volby..."
-#: session_dialog.cc:163 session_dialog.cc:394
+#: session_dialog.cc:163 session_dialog.cc:397
msgid "Recent Sessions"
msgstr "Naposledy otevÅená sezenÃ"
@@ -11950,99 +12959,99 @@ msgstr "Naposledy zmÄnÄno"
msgid "New Session"
msgstr "Nové sezenÃ"
-#: session_dialog.cc:376
+#: session_dialog.cc:379
msgid "Check the website for more..."
msgstr "NajÃt vÃce na internetových stránkách..."
-#: session_dialog.cc:379
+#: session_dialog.cc:382
msgid "Click to open the program website in your web browser"
msgstr "Klepnout pro otevÅenà stránek programu v prohlÞeÄi"
-#: session_dialog.cc:401
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "Vybrat soubor se sezenÃm"
-#: session_dialog.cc:414
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr "Jiná sezenÃ"
-#: session_dialog.cc:421
+#: session_dialog.cc:424
msgid "Safe Mode: Disable all Plugins"
msgstr "BezpeÄný režim: Zakázat vÅ¡echny pÅÃdavné moduly"
-#: session_dialog.cc:451
+#: session_dialog.cc:454
msgid "Open"
msgstr "OtevÅÃt"
-#: session_dialog.cc:518
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Název sezenÃ:"
-#: session_dialog.cc:540
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "Složku se sezenÃm vytvoÅit v:"
-#: session_dialog.cc:561
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "Vybrat složku pro sezenÃ"
-#: session_dialog.cc:588
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "PoužÃt tuto pÅedlohu"
-#: session_dialog.cc:591
+#: session_dialog.cc:594
msgid "no template"
msgstr "Žádná pÅedloha"
-#: session_dialog.cc:743 session_dialog.cc:790
+#: session_dialog.cc:746 session_dialog.cc:793
msgid "32-bit float"
msgstr "32 bitů float"
-#: session_dialog.cc:746 session_dialog.cc:793
+#: session_dialog.cc:749 session_dialog.cc:796
msgid "24-bit"
msgstr "24 bitů"
-#: session_dialog.cc:749 session_dialog.cc:796
+#: session_dialog.cc:752 session_dialog.cc:799
msgid "16-bit"
msgstr "16 bitů"
-#: session_dialog.cc:874 session_dialog.cc:875 session_dialog.cc:876
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "kanály"
-#: session_dialog.cc:890
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>SbÄrnice</b>"
-#: session_dialog.cc:891
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>Vstupy</b>"
-#: session_dialog.cc:892
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>Výstupy</b>"
-#: session_dialog.cc:900
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "VytvoÅit hlavnà sbÄrnici"
-#: session_dialog.cc:910
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "Automaticky spojit s fyzickými vstupy"
-#: session_dialog.cc:917 session_dialog.cc:976
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "PoužÃt pouze"
-#: session_dialog.cc:970
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "Automaticky spojit výstupy"
-#: session_dialog.cc:992
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "s hlavnà sbÄrnicÃ"
-#: session_dialog.cc:1002
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "s fyzickými výstupy"
@@ -12068,191 +13077,191 @@ msgstr "Zavést ze sezenÃ"
msgid "This will select all elements of this type!"
msgstr "TÃmto dojde k výbÄru vÅ¡ech prvků tohoto typu!"
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr "Kontrolnà ÄÃslice EAN OK"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr "Chyba kontrolnà ÄÃslice EAN"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr "oÄekáváno"
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr "Chyba v délce EAN"
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Pole"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "Hodnoty (nynÄjšà hodnota nahoÅe)"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "Uživatel"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr "E-mail"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr "Stránky"
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr "Organizace"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr "ZemÄ"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "Název"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "Režim stopy"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "Podnázev"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr "SeskupenÃ"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "UmÄlec"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "Žánr"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "Poznámka"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "Autorské právo"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "Album"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Rok"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "VýtvarnÃk alba"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "Celkový poÄet stop"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "Podnázev disku"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "ÄÃslo disku"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "Celkový poÄet disků"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "SbÃrka"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr "ISRC"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr "Äárový kód EAN"
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "Lidé"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "TextaÅ"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "Skladatel"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "Dirigent"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "Remixer"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "Aranžér"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "Inženýr"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "Výrobce"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "SmÄÅ¡ovaÄ DJ"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "Popisná data|SmÄÅ¡ovaÄ"
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr "Å kola"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr "UÄitel"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr "PÅednáška"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "Upravit popisná data k sezenÃ"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "Zavést popisná data k sezenÃ"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr "Vybrat sezenÃ, z nÄhož se popisná data majà zavést"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "Tento soubor se sezenÃm se nepodaÅilo pÅeÄÃst!"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -12260,7 +13269,7 @@ msgstr ""
"Soubor se sezenÃm neobsahoval popisná data!\n"
"Je možné, že je to starý formát sezen�"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr "Zavést vše z:"
@@ -12478,6 +13487,11 @@ msgstr "WAVE-64"
msgid "RF64 (WAV compatible)"
msgstr "RF64 (kompatibilnàs WAV)"
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
#: session_option_editor.cc:210
msgid "File locations"
msgstr "UmÃstÄnà souborů"
@@ -12671,26 +13685,14 @@ msgstr "<b>Informace o zvukovém souboru</b>"
msgid "Timestamp:"
msgstr "Äasové razÃtko:"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Formát:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:658
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "ZnaÄky:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Soubor nelze pÅeÄÃst: %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr "<b>Informace o souboru MIDI</b>"
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Nelze pÅistupovat ke zvukovému souboru: "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr "Okno zvukových souborů: Nelze rozebrat ÅetÄzec znaků: "
@@ -12727,149 +13729,149 @@ msgstr "Cesty"
msgid "Search Tags"
msgstr "Hledat znaÄky"
-#: sfdb_ui.cc:663
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "TÅÃdit:"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "NejdelÅ¡Ã"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "NejkratÅ¡Ã"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "NejnovÄjÅ¡Ã"
-#: sfdb_ui.cc:674
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "NejstarÅ¡Ã"
-#: sfdb_ui.cc:675
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "NejvÃce stahované"
-#: sfdb_ui.cc:676
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "NejménÄ stahované"
-#: sfdb_ui.cc:677
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr "Nejvýše hodnocené"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr "NejnÞe hodnocené"
-#: sfdb_ui.cc:683
+#: sfdb_ui.cc:684
msgid "More"
msgstr "VÃce"
-#: sfdb_ui.cc:687
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr "Podobné"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:700
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:700 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr "Souborový název"
-#: sfdb_ui.cc:702
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "Doba trvánÃ"
-#: sfdb_ui.cc:703
+#: sfdb_ui.cc:704
msgid "Size"
msgstr "Velikost"
-#: sfdb_ui.cc:704
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr "Vzorkovacà kmitoÄet"
-#: sfdb_ui.cc:705
+#: sfdb_ui.cc:706
msgid "License"
msgstr "Licence"
-#: sfdb_ui.cc:723
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "Hledat volné zvuky"
-#: sfdb_ui.cc:739
+#: sfdb_ui.cc:741
msgid "Press to import selected files"
msgstr "StisknÄte pro zavedenà vybraných souborů"
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr "StisknÄte pro zavÅenà tohoto okna bez zavedenà jakýchkoli souborů"
-#: sfdb_ui.cc:935
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "ProhlÞeÄ zvukových souborů: Nelze rozebrat ÅetÄzec znaků:"
-#: sfdb_ui.cc:1135
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] "Dostupná %1 dalšà strana ze sta výsledků"
msgstr[1] "Dostupné %1 dalšà strany ze sta výsledků"
-#: sfdb_ui.cc:1140
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr "Nejsou dostupné žádné dalšà výsledky"
-#: sfdb_ui.cc:1204
+#: sfdb_ui.cc:1206
msgid "B"
msgstr "B"
-#: sfdb_ui.cc:1206
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr "kB "
-#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr "MB"
-#: sfdb_ui.cc:1212
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr "GB"
-#: sfdb_ui.cc:1429 sfdb_ui.cc:1734 sfdb_ui.cc:1795 sfdb_ui.cc:1813
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "Jedna stopa na soubor"
-#: sfdb_ui.cc:1432 sfdb_ui.cc:1796 sfdb_ui.cc:1814
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "Jedna stopa na kanál"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1798 sfdb_ui.cc:1815
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr "Soubory seÅadit vedle sebe"
-#: sfdb_ui.cc:1443 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "Všechny soubory do jedné stopy"
-#: sfdb_ui.cc:1444 sfdb_ui.cc:1797
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "SlouÄit soubory"
-#: sfdb_ui.cc:1450 sfdb_ui.cc:1800
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "Jedna oblast na soubor"
-#: sfdb_ui.cc:1453 sfdb_ui.cc:1801
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "Jedna oblast na kanál"
-#: sfdb_ui.cc:1458 sfdb_ui.cc:1802 sfdb_ui.cc:1816
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "Všechny soubory v jedné oblasti"
-#: sfdb_ui.cc:1525
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -12877,102 +13879,102 @@ msgstr ""
"Jeden nebo vÃce vybraných souborů\n"
"nemůže být použito %1"
-#: sfdb_ui.cc:1669
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "ZkopÃrovat soubory do sezenÃ"
-#: sfdb_ui.cc:1688 sfdb_ui.cc:1856
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr "Äasové razÃtko souboru"
-#: sfdb_ui.cc:1689 sfdb_ui.cc:1858
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "Pracovnà bod"
-#: sfdb_ui.cc:1690 sfdb_ui.cc:1860
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "Ukazatel polohy"
-#: sfdb_ui.cc:1691
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "ZaÄátek sezenÃ"
-#: sfdb_ui.cc:1697
+#: sfdb_ui.cc:1695
msgid "<b>Add files ...</b>"
msgstr "<b>PÅidat soubory...</b>"
-#: sfdb_ui.cc:1709
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr "<b>Vložit v</b>"
-#: sfdb_ui.cc:1722
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr "<b>PÅiÅazenÃ</b>"
-#: sfdb_ui.cc:1740
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr "<b>Kvalita pÅevodu</b>"
-#: sfdb_ui.cc:1752
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr "<b>Nástroj</b>"
-#: sfdb_ui.cc:1764 sfdb_ui.cc:1872
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "NejlepÅ¡Ã"
-#: sfdb_ui.cc:1765 sfdb_ui.cc:1874
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "Dobrá"
-#: sfdb_ui.cc:1766 sfdb_ui.cc:1876
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "Rychlý pÅevod"
-#: sfdb_ui.cc:1768
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Co nejrychleji"
-#: shuttle_control.cc:57
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
"Rychlost pÅehrávánà (klepnutà pravým tlaÄÃtkem myÅ¡i pro vyvolánà nabÃdky "
"voleb)"
-#: shuttle_control.cc:184
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr "Procento"
-#: shuttle_control.cc:192
+#: shuttle_control.cc:209
msgid "Units"
msgstr "Jednotky"
-#: shuttle_control.cc:198 shuttle_control.cc:633
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr "Pero"
-#: shuttle_control.cc:202 shuttle_control.cc:636
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr "Kolo"
-#: shuttle_control.cc:236
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "Nejvyššà rychlost"
-#: shuttle_control.cc:239
+#: shuttle_control.cc:256
msgid "Reset to 100%"
msgstr "Nastavit znovu na 100 %"
-#: shuttle_control.cc:592
+#: shuttle_control.cc:633
msgid "Playing"
msgstr "PÅehrává se"
-#: shuttle_control.cc:607
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d půltóny"
-#: shuttle_control.cc:609
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d půltóny"
@@ -13001,7 +14003,7 @@ msgstr "UdÄlat soubory stahovatelné"
msgid "%1: %2 of %3 bytes uploaded"
msgstr "%1: Nahráno %2 z %3 bytů"
-#: splash.cc:75
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "Nahrává se %1..."
@@ -13017,7 +14019,7 @@ msgstr "Odstranit reproduktor"
msgid "Azimuth:"
msgstr "Azimut:"
-#: startup.cc:70
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
@@ -13026,11 +14028,11 @@ msgstr ""
"pro zvuk.\n"
"%1 ve sledovánà NEBUDE hrát žádnou úlohu"
-#: startup.cc:72
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr "Požádat %1 o pÅehrávánà materiálu, už když je nahráván"
-#: startup.cc:145
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -13047,15 +14049,15 @@ msgstr ""
"PÅedtÃm než program zaÄnete použÃvat, je tu jen nÄkolik vÄcÃ, které je tÅeba "
"nastavit.</span>"
-#: startup.cc:171
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "VÃtejte v %1u"
-#: startup.cc:194
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Výchozà složka pro sezenà programu %1"
-#: startup.cc:200
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -13071,11 +14073,11 @@ msgstr ""
"\n"
"<i>(Nová sezenà můžete dát kamkoli. Toto je jen výchozà nastavenÃ)</i>"
-#: startup.cc:223
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Výchozà složka pro nová sezenÃ"
-#: startup.cc:244
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -13090,26 +14092,24 @@ msgid ""
msgstr ""
"PÅi nahrávánà nástrojů nebo hlasů pravdÄpodobnÄ chcete poslouchat\n"
"signál, a také jej nahrávat. Tomu se ÅÃká sledovánÃ. Jsou různé způsoby,\n"
-"jak to dÄlat v závislosti na tom, jaké máte vybavenÃ, a na nastavenà "
-"tohoto\n"
+"jak to dÄlat v závislosti na tom, jaké máte vybavenÃ, a na nastavenà tohoto\n"
"vybavenÃ. Dva nejbÄžnÄjšà jsou pÅedstaveny zde.\n"
"Zvolte, prosÃm, který z nich je pro vaÅ¡e nastavenà správný.\n"
"\n"
"<i>(Toto nastavenà můžete kdykoli prostÅednictvÃm dialogu pro nastavenà "
-"zmÄnit)</"
-"i>\n"
+"zmÄnit)</i>\n"
"\n"
"<i>Pokud nevÃte, o Äem to je, prostÄ pÅijmÄte výchozà nastavenÃ.</i>"
-#: startup.cc:265
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "Volby pro sledovánÃ"
-#: startup.cc:288
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "PoužÃt hlavnà sbÄrnici pÅÃmo"
-#: startup.cc:290
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -13117,11 +14117,11 @@ msgstr ""
"Spojit hlavnà sbÄrnici pÅÃmo s výstupy vaÅ¡eho technického vybavenÃ. To je "
"vhodnÄjšà pro jednoduché použitÃ."
-#: startup.cc:299
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "PoužÃt dodateÄnou sbÄrnici pro sledovánÃ"
-#: startup.cc:302
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -13130,7 +14130,7 @@ msgstr ""
"vybavenÃ\n"
"pro vÄtšà dohled nad sledovánÃm bez ovlivnÄnà mÃchánÃ."
-#: startup.cc:324
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -13143,46 +14143,42 @@ msgstr ""
"\n"
"<i>Pokud nevÃte, o Äem to je, prostÄ pÅijmÄte výchozà nastavenÃ.</i>"
-#: startup.cc:335
+#: startup.cc:336
msgid "Monitor Section"
msgstr "Äást pro sledovánÃ"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr "Zápis kroku: %1"
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">doba"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">takt"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ">EP"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr "Držet"
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr "Pomlka"
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr "g-pomlka"
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr "ZpÄt"
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr "Nastavit délku noty na celou notu"
@@ -13291,11 +14287,11 @@ msgstr "Vložit zprávu o zmÄnÄ banky"
msgid "Insert a program change message"
msgstr "Vložit zprávu o zmÄnÄ programu"
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr "PÅesunout polohu vloženà zpÄt podle délky noty"
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr "PÅesunout polohu vloženà k pracovnÃmu bodu"
@@ -13307,230 +14303,230 @@ msgstr "1/Nota"
msgid "Octave"
msgstr "Oktáva"
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr "Vložit notu A"
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr "Vložit notu Ais"
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr "Vložit notu H"
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr "Vložit notu C"
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr "Vložit notu Cis"
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr "Vložit notu D"
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr "Vložit notu Dis"
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr "Vložit notu E"
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr "Vložit notu F"
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr "Vložit notu Fis"
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr "Vložit notu G"
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr "Vložit notu Gis"
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr "Vložit pomlku o délce noty"
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr "Vložit pomlku o délce zapadnutÃ"
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr "PÅesunout se k dalšà oktávÄ"
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr "PÅesunout se k délce dalšà noty"
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr "PÅesunout se k délce pÅedchozà noty"
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "ZvÄtÅ¡it délku noty"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "Zmenšit délku noty"
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr "PÅesunout se k sÃle tónu dalšà noty"
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr "PÅesunout se k sÃle tónu pÅedchozà noty"
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr "ZvÄtÅ¡it sÃlu tónu noty"
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr "ZmenÅ¡it sÃlu tónu noty"
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "PÅejÃt na prvnà oktávu"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "PÅejÃt na druhou oktávu"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "PÅejÃt na tÅetà oktávu"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "PÅejÃt na Ätvrtou oktávu"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "PÅejÃt na pátou oktávu"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "PÅejÃt na Å¡estou oktávu"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "PÅejÃt na sedmou oktávu"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "PÅejÃt na osmou oktávu"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "PÅejÃt na devátou oktávu"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "PÅejÃt na desátou oktávu"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "PÅejÃt na jedenáctou oktávu"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "PÅepnout trojité noty"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "PÅepnout zápis akordu"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Držet vybrané noty podle délky noty"
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr "Nastavit délku noty na celou"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr "Nastavit délku noty na 1/2"
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr "Nastavit délku noty na 1/3"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr "Nastavit délku noty na 1/4"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr "Nastavit délku noty na 1/8"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr "Nastavit délku noty na 1/16"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr "Nastavit délku noty na 1/32"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr "Nastavit délku noty na 1/64"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr "Nastavit sÃlu tónu noty na pianississimo"
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr "Nastavit sÃlu tónu noty na pianissimo"
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr "Nastavit sÃlu tónu noty na piano"
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr "Nastavit sÃlu tónu noty na mezzo piano"
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr "Nastavit sÃlu tónu noty na mezzo forte"
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr "Nastavit sÃlu tónu noty na forte"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr "Nastavit sÃlu tónu noty na fortississimo"
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "PÅepnout trojité noty"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr "Žádné teÄkované noty"
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr "PÅepnuté teÄkované noty"
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr "PÅepnuté dvojitÄ teÄkované noty"
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr "PÅepnuté trojitÄ teÄkované noty"
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "PÅepnout zápis akordu"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Držet vybrané noty podle délky noty"
-
#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
@@ -13552,6 +14548,10 @@ msgstr "Å ÃÅka"
msgid "Strip Silence"
msgstr "Odstranit ticho"
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Práh"
+
#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr "Nejmenšà délka"
@@ -13564,164 +14564,173 @@ msgstr "Délka postupného zesÃlenà signálu"
msgid "Analyzing"
msgstr "Rozbor"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "Takt:"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "Doba:"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr "Nota rytmu"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr "Vypleskat tempo"
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
-#: tempo_dialog.cc:344
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "Celá"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
-#: tempo_dialog.cc:346
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "Sekunda"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
-#: tempo_dialog.cc:348
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "TÅetina"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
-#: tempo_dialog.cc:350
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "Ätvrtina"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
-#: tempo_dialog.cc:352
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "Osmina"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
-#: tempo_dialog.cc:354
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "Šestnáctina"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "DvaatÅicetina"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
-#: tempo_dialog.cc:358
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "ÄtyÅiaÅ¡edesátina"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
-#: tempo_dialog.cc:360
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "Stoosmadvacetina"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Dob za minutu:"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr "Tempo zaÄÃná na"
-#: tempo_dialog.cc:254
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr "Nesrozumitelný typ noty rytmu (%1)"
-#: tempo_dialog.cc:375
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "Hodnota noty:"
-#: tempo_dialog.cc:376
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Dob na takt:"
-#: tempo_dialog.cc:390
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr "Metrum zaÄÃná na taktu:"
-#: tempo_dialog.cc:503
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
msgstr "Nesrozumitelný typ noty metra (%1)"
-#: theme_manager.cc:61
-msgid "Dark Theme"
-msgstr "Tmavý motiv"
-
-#: theme_manager.cc:62
-msgid "Light Theme"
-msgstr "SvÄtlý motiv"
-
-#: theme_manager.cc:63
-msgid "Restore Defaults"
-msgstr "Obnovit výchozÃ"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
-#: theme_manager.cc:64
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr "Kreslit plochá tlaÄÃtka"
-#: theme_manager.cc:65
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr "TlaÄÃtko hlásÃcà pÅipravenost k nahrávánà bliká"
-#: theme_manager.cc:66
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Obarvit oblasti barvou jejich stopy"
-#: theme_manager.cc:67
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr "Ukázat pÅebuzenà průbÄhové kÅivky"
-#: theme_manager.cc:69
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr "Hloubka barevného pÅechodu průbÄhové kÅivky"
-#: theme_manager.cc:71
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr "Hloubka barevného pÅechodu prvku Äasové osy"
-#: theme_manager.cc:72
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr "Všechna plovoucà okna jsou dialogy"
-#: theme_manager.cc:73
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr "Krátkodobá okna sledujà hlavnà okno."
-#: theme_manager.cc:74
+#: theme_manager.cc:63
msgid "Float detached monitor-section window"
msgstr "Plovoucà spuÅ¡tÄné okno sledovacÃho úseku"
-#: theme_manager.cc:75
+#: theme_manager.cc:64
msgid "Icon Set"
msgstr "Sada ikon"
-#: theme_manager.cc:84
-msgid "Object"
-msgstr "PÅedmÄt"
-
-#: theme_manager.cc:162
-msgid "Items"
-msgstr "PÅedmÄty"
-
-#: theme_manager.cc:163
-msgid "Palette"
-msgstr "Paleta"
-
-#: theme_manager.cc:164
-msgid "Transparency"
-msgstr "Průhlednost"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -13733,7 +14742,7 @@ msgstr ""
"To může u nÄkterých správců oken pomoci. Aby se to projevilo, je potÅeba %1 "
"spustit znovu"
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
@@ -13742,21 +14751,17 @@ msgstr ""
"Krátkodobá okna sledujà pÅi zmÄnÄ mezi editorem a smÄÅ¡ovaÄem hlavnà okno.\n"
"Aby se toto nastavenà projevilo, je potÅeba opÄtovné spuÅ¡tÄnà %1"
-#: theme_manager.cc:202
+#: theme_manager.cc:139
msgid ""
"When detaching the monitoring section, mark it as \"Utility\" window to stay "
"in front.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-"PÅi odpojenà sledovacÃho úseku jej, aby zůstalo v popÅedÃ, "
-"oznaÄit jako okno pomocných prostÅedků."
-"ZmÄna této volby vyžaduje k projevenà se opÄtovné spuÅ¡tÄnÃ"
-
-#: theme_manager.cc:643
-msgid "Color Palette"
-msgstr "Paleta barev"
+"PÅi odpojenà sledovacÃho úseku jej, aby zůstalo v popÅedÃ, oznaÄit jako okno "
+"pomocných prostÅedků.ZmÄna této volby vyžaduje k projevenà se opÄtovné "
+"spuÅ¡tÄnÃ"
-#: time_axis_view.cc:150
+#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr "Název stopy/sbÄrnice (pro úpravy dvakrát klepnout)"
@@ -13766,71 +14771,71 @@ msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] "Nová doba trvánà %1 snÃmků je mimo dovolenou oblast %2"
msgstr[1] "Nová doba trvánà %1 snÃmků je mimo dovolenou oblast pro %2"
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Rychlé ale ošklivé"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "PÅeskoÄit vyhlazovánÃ"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Obsah:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr "ZmenÅ¡it Äasové zkreslenÃ"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr "Zachovat složky rozhodujÃcà o barvÄ zvuku (formanty)"
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr "Okno TimeFX"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr "Posun výšky tónu zvuku"
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr "Protáhnutà Äasu zvuku"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "Oktávy:"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "Půltóny:"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr "Centy:"
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr "Äas|Posun"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr "TlaÄÃtko TimeFX"
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "Protáhnout/Zmenšit"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr "<b>Postup</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "ZaÄÃt s nahrávánÃm na zaÄátku oblasti pÅepsánÃ"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Zastavit nahrávánà na konci oblasti pÅepsánÃ"
@@ -13898,108 +14903,140 @@ msgstr "PÅevést MIDI"
msgid "Transpose"
msgstr "PÅevést"
-#: ui_config.cc:230 ui_config.cc:368
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr "Nahrává se soubor s nastavenÃm výchozÃho uživatelského rozhranà %1"
-#: ui_config.cc:233 ui_config.cc:371
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
"Nelze pÅeÄÃst soubor s nastavenÃm výchozÃho uživatelského rozhranà \"%1\""
-#: ui_config.cc:236 ui_config.cc:376
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
"Soubor s nastavenÃm výchozÃho uživatelského rozhranà \"%1\" nemohl být "
"nahrán."
-#: ui_config.cc:244
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr "NepodaÅilo se najÃt výchozà soubor s nastavenÃm rozhranà %1"
-#: ui_config.cc:287
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr "Nahrává se soubor s barvou '%1"
-#: ui_config.cc:290
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr "Nelze pÅeÄÃst soubor s barvou \"%1\""
-#: ui_config.cc:295
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr "Soubor s barvou \"%1\" se nepodaÅilo nahrát."
-#: ui_config.cc:301
-msgid "Color file %1 not found"
-msgstr "Soubor s barvou \"%1\" nebyl nalezen"
-
-#: ui_config.cc:350 ui_config.cc:429
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr "Soubor s barvou \"%1\" nebyl neuložen"
-#: ui_config.cc:385
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr "Nahrává se soubor s nastavenÃm výchozÃho uživatelského rozhranà %1"
-#: ui_config.cc:388
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr ""
"Nelze pÅeÄÃst soubor s nastavenÃm výchozÃho uživatelského rozhranà \"%1\""
-#: ui_config.cc:393
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
"Soubor s nastavenÃm výchozÃho uživatelského rozhranà \"%1\" nemohl být "
"nahrán."
-#: ui_config.cc:401
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
"NepodaÅilo se najÃt žádný soubor s nastavenÃm výchozÃho uživatelského "
"rozhranÃ, plátno bude vypadat rozbitÄ."
-#: ui_config.cc:419
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr "Soubor s nastavenÃm %1 nebyl uložen"
-#: ui_config.cc:660
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr "Barva %1 nenalezena"
-#: ui_config.cc:730
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
"Soubor se stylem uživatelského rozhranà %1 nelze ve vyhledávacà cestÄ najÃt "
"%2. %3 bude vypadat divnÄ."
-#: utils.cc:114 utils.cc:157
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "Chybná XPM hlaviÄka %1"
-#: utils.cc:574
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr "Nelze najÃt soubor XPM pro %1"
-#: utils.cc:594 utils.cc:624 utils.cc:638
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr "VýchozÃ"
-#: utils.cc:639
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr "Ikona \"%1\" nenalezena pro sadu ikon \"%2\", návrat na výchozÃ"
-#: utils.cc:646
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr "Nelze najÃt obrázek s ikonou pro %1 pomocà %2"
-#: utils.cc:663 utils.cc:679
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr "bÄhem nahrávánà ikony s názvem %1 byla zachycena výjimka"
-#: utils.cc:939
+#: utils.cc:818
msgid "Overwrite"
msgstr "PÅepsat"
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "Ä"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr "Nastavit stopu s obrazovým záznamem"
@@ -14046,6 +15083,22 @@ msgstr "RejstÅÃk videoserveru"
msgid " %1 fps"
msgstr " %1 FPS"
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
@@ -14101,7 +15154,7 @@ msgstr ""
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr "Program pro sledovánà obrazu 'xjadeo' nelze spustit"
-#: video_timeline.cc:770
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
@@ -14109,7 +15162,7 @@ msgstr ""
"Program pro sledovánà obrazu 'xjadeo' je pÅÃliÅ¡ starý. Nainstalujte, prosÃm, "
"xjadeo ve verzi 0.7.7 nebo novÄjÅ¡Ã. http://xjadeo.sf.net/"
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr "Sledovánà obrazového záznamu: Soubor nenalezen."
@@ -14168,8 +15221,8 @@ msgid ""
"ffmpeg installation was not found. Video Import is not possible. See the Log "
"window for more information."
msgstr ""
-"V tomto systému se nepodaÅilo najÃt žádnou instalaci ffmpeg. "
-"ZavádÄnà obrazových záznamů nenÃ, dokud tyto nástroje nenainstalujete, možné. "
+"V tomto systému se nepodaÅilo najÃt žádnou instalaci ffmpeg. ZavádÄnà "
+"obrazových záznamů nenÃ, dokud tyto nástroje nenainstalujete, možné. "
"PodÃvejte se na okno se zápisem na dalšà informace."
#: transcode_video_dialog.cc:120
@@ -14184,10 +15237,6 @@ msgstr ""
msgid "FPS:"
msgstr "SnÃmků za sekundu (FPS):"
-#: transcode_video_dialog.cc:139
-msgid "Duration:"
-msgstr "Doba trvánÃ"
-
#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr "Kodek:"
@@ -14405,8 +15454,8 @@ msgid ""
"ffmpeg installation was not found. Video Export is not possible. See the Log "
"window for more information."
msgstr ""
-"V tomto systému se nepodaÅilo najÃt žádnou instalaci ffmpeg. "
-"VyvádÄnà obrazových záznamů nenÃ, dokud tyto nástroje nenainstalujete, možné. "
+"V tomto systému se nepodaÅilo najÃt žádnou instalaci ffmpeg. VyvádÄnà "
+"obrazových záznamů nenÃ, dokud tyto nástroje nenainstalujete, možné. "
"PodÃvejte se na okno se zápisem na dalšà informace."
#: export_video_dialog.cc:126
@@ -14458,16 +15507,16 @@ msgid "Audio Samplerate:"
msgstr "Vzorkovacà kmitoÄet zvuku:"
#: export_video_dialog.cc:215 export_video_dialog.cc:223
-#: export_video_dialog.cc:801 export_video_dialog.cc:804
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr "(výchozà pro formát)"
#: export_video_dialog.cc:233 export_video_dialog.cc:244
-#: export_video_dialog.cc:808 export_video_dialog.cc:817
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr "(výchozÃ)"
-#: export_video_dialog.cc:245 export_video_dialog.cc:811
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr "(zachovat)"
@@ -14483,19 +15532,19 @@ msgstr "od zaÄátku obrazového záznamu po konec obrazového záznamu"
msgid "Selected range"
msgstr "Vybraný rozsah"
-#: export_video_dialog.cc:560
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr "Normalizovámà zvuku"
-#: export_video_dialog.cc:564
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr "VyvádÄnà zvuku"
-#: export_video_dialog.cc:619
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr "Vyvádà se zvuk..."
-#: export_video_dialog.cc:676
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
@@ -14503,39 +15552,39 @@ msgstr ""
"Vyvedenà obrazového záznamu: Nelze se dotázat na dobu trvánà souboru s "
"obrazovým záznamem. MÃsto toho se použÃvá doba trvánà z Äasové osy"
-#: export_video_dialog.cc:706
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr "Vyvést obrazový záznam: Rozsah k vyvedenà nezahrnuje obrazový záznam."
-#: export_video_dialog.cc:719
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
"Vyvedenà obrazového záznamu: Žádné hlavnà výstupnà pÅÃpojky k pÅipojenà pro "
"vyvedenà zvuku"
-#: export_video_dialog.cc:761
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr "Kóduje se obrazový záznam..."
-#: export_video_dialog.cc:781
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
"Vyvedenà obrazového záznamu: Vstupnà soubor s obrazovým záznamem nelze "
"pÅeÄÃst."
-#: export_video_dialog.cc:887
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr "PÅekódovává se obrazový záznam... Průchod 1/2"
-#: export_video_dialog.cc:899
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr "PÅekódovává se obrazový záznam... Průchod 2/2"
-#: export_video_dialog.cc:1002
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr "PÅekódovánà se nezdaÅilo."
-#: export_video_dialog.cc:1238 export_video_dialog.cc:1258
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr "Uložit vyvedený soubor s obrazovým záznamem"
@@ -14567,6 +15616,259 @@ msgstr ""
#~ msgid ""
#~ "%1%2\n"
+#~ "(built from revision %3)\n"
+#~ "%4"
+#~ msgstr ""
+#~ "%1%2\n"
+#~ "(Sestaveno na základÄ revize %3)%4"
+
+#~ msgid "Busses"
+#~ msgstr "SbÄrnice"
+
+#~ msgid "Display model"
+#~ msgstr "Typ zobrazenÃ"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "SlouÄené grafy pro každou stopu"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "SlouÄený grafy vÅ¡ech stop"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalizovat hodnoty"
+
+#~ msgid "Locations"
+#~ msgstr "MÃsta"
+
+#~ msgid "Save as..."
+#~ msgstr "Uložit jako..."
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4 Toto je sezenà ze staršà verze %3%5\n"
+#~ "\n"
+#~ "%3 zkopÃroval soubor se starým sezenÃm\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "do\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "Od nynÄjÅ¡ka použÃvejte verzi -2000 starÅ¡Ãmi verzemif %3"
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr ""
+#~ "Tato obrazovka nenà dostateÄnÄ velká na to, aby zobrazila okno smÄÅ¡ovaÄe"
+
+#~ msgid "Open Video"
+#~ msgstr "OtevÅÃt obrazový záznam"
+
+#~ msgid "Export to Video File"
+#~ msgstr "Vyvést jako soubor s obrazovým záznamem"
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Ukázat nástrojové panely"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "PÅepnout editor a smÄÅ¡ovaÄ"
+
+#~ msgid "Reattach All Tearoffs"
+#~ msgstr "PÅipojit znovu vÅ¡echna odtrženÃ"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "PÅeruÅ¡it taženà nebo odznaÄit vÅ¡e"
+
+#~ msgid "Show Logo"
+#~ msgstr "Ukázat logo"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "Nahrané vazby editoru z %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr "V prohledávané cestÄ %1 se editor.bindings nalézt nepodaÅilo"
+
+#~ msgid "duplicate selection"
+#~ msgstr "Zdvojit výbÄr"
+
+#~ msgid "cut time"
+#~ msgstr "Vyjmout Äas"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>Názvy souborů sestavit z tÄchto souÄástÃ:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>NynÄjšà (pÅibližný) název souboru: \"%1\"</i></small>"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "PÅÃkaz, který se má provést po vyvedenÃ\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+
+#~ msgid "Create New Group From"
+#~ msgstr "VytvoÅit novou skupinu z"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Vyberte nÄjaký krok a následnÄ stisknÄte klávesu(y) \n"
+#~ "kvůli (pÅe)nastavenà klávesové zkratky"
+
+#~ msgid "Main_menu"
+#~ msgstr "Hlavnà nabÃdka"
+
+#~ msgid "redirectmenu"
+#~ msgstr "PÅesmÄrovánà nabÃdky"
+
+#~ msgid "Editor_menus"
+#~ msgstr "Editor nabÃdek"
+
+#~ msgid "ProcessorMenu"
+#~ msgstr "NabÃdka zpracovánÃ"
+
+#~ msgid "Program "
+#~ msgstr "Program "
+
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "Nahrané vazby smÄÅ¡ovaÄe z %1"
+
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "V prohledávané cestÄ %1 se nepodaÅilo nalézt vazby smÄÅ¡ovaÄe"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Poznámky*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Pozn*"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID dálkového ovládánÃ..."
+
+#~ msgid "Allow to add monitor effect processors"
+#~ msgstr "Povolit pÅidánà zpracovatele efektů sledovánÃ"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "PÅÃpojku zde nelze pÅidat, protože prvnà procesor ve stopÄ nebo sbÄrnici "
+#~ "nedokáže podporovat nové nastavenÃ."
+
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "Tuto pÅÃpojku nelze odstranit, protože\n"
+#~ "prvnà pÅÃdavný modul ve stopÄ nebo\n"
+#~ "sbÄrnici nemůže pÅijmout nový poÄet vstupů,\n"
+#~ "nebo má poslednà pÅÃdavný modul vÃce výstupů."
+
+#~ msgid "Sync/Slave"
+#~ msgstr "Sync/Slave"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Sólo/Ztlumit"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Vzdálené ID pro ovládacà prvky"
+
+#~ msgid "assigned by user"
+#~ msgstr "urÄeno uživatelem"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "následuje poÅadà ve smÄÅ¡ovaÄi"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Mezera spuÅ¡tÄnà (ms)"
+
+#~ msgid "Align with Existing Material"
+#~ msgstr "Zarovnat se stávajÃcÃm materiálem"
+
+#~ msgid "Align with Capture Time"
+#~ msgstr "Zarovnat s Äasem nahrávky"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr "Nemůžete vytvoÅit stopu s tÃmto názvem, protože je zamluvený pro %1"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID dálkového ovládánÃ"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID dálkového ovládánÃ:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "ID dálkového ovládánà %1 je: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "ID dálkového ovládánà %3 nelze zmÄnit."
+
+#~ msgid "the master bus"
+#~ msgstr "Hlavnà sbÄrnice"
+
+#~ msgid "the monitor bus"
+#~ msgstr "Sledovacà sbÄrnice"
+
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "ID dálkového ovládánà %5 je: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "ID dálkového ovládánà jsou v souÄasnosti urÄeny poÅadÃm stopy/sbÄrnice v "
+#~ "%6\n"
+#~ "\n"
+#~ "\n"
+#~ "%3Použijte kartu Uživatelská interakce v oknÄ pro nastavenÃ, pokud to "
+#~ "chcete zmÄnit%4"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track. Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Klepnutà levým tlaÄÃtkem myÅ¡i pro obrácenà (otoÄenà fáze) kanálu %1 této "
+#~ "stopy. Klepnutà pravým tlaÄÃtkem myÅ¡i pro ukázánà nabÃdky."
+
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr "KlepnÄte pro ukázánà kanálů pro obrácenà (otoÄenà fáze)"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Tmavý motiv"
+
+#~ msgid "Light Theme"
+#~ msgstr "SvÄtlý motiv"
+
+#~ msgid "Contents:"
+#~ msgstr "Obsah:"
+
+#~ msgid "Color file %1 not found"
+#~ msgstr "Soubor s barvou \"%1\" nebyl nalezen"
+
+#~ msgid ""
+#~ "%1%2\n"
#~ "(built from revision %3)"
#~ msgstr ""
#~ "%1%2\n"
@@ -14683,9 +15985,6 @@ msgstr ""
#~ msgid "Insert Region From Region List"
#~ msgstr "Vložit oblast ze seznamu oblastÃ"
-#~ msgid "V"
-#~ msgstr "V"
-
#~ msgid "group|G"
#~ msgstr "Skupina|Sk"
@@ -14731,18 +16030,12 @@ msgstr ""
#~ msgid "O"
#~ msgstr "Nep"
-#~ msgid "A"
-#~ msgstr "Ä"
-
#~ msgid "I"
#~ msgstr "Vst"
#~ msgid "R"
#~ msgstr "N"
-#~ msgid "S"
-#~ msgstr "S"
-
#~ msgid "SI"
#~ msgstr "SamS"
@@ -14789,12 +16082,6 @@ msgstr ""
#~ msgid "C"
#~ msgstr "C"
-#~ msgid "D"
-#~ msgstr "D"
-
-#~ msgid "Peak"
-#~ msgstr "Vrchol"
-
#~ msgid "K20"
#~ msgstr "K20"
@@ -14924,12 +16211,6 @@ msgstr ""
#~ msgid "fastest [70dB/sec]"
#~ msgstr "Nejrychlejšà [70 dB/s]"
-#~ msgid "Align With Existing Material"
-#~ msgstr "Zarovnat se stávajÃcÃm materiálem"
-
-#~ msgid "Align With Capture Time"
-#~ msgstr "Zarovnat s Äasem nahrávky"
-
#~ msgid "Select From All..."
#~ msgstr "Vybrat ze všeho..."
@@ -16130,9 +17411,6 @@ msgstr ""
#~ msgid "80"
#~ msgstr "80"
-#~ msgid "100"
-#~ msgstr "100"
-
#~ msgid "gTortnam"
#~ msgstr "gTortnam"
@@ -16317,9 +17595,6 @@ msgstr ""
#~ msgid "Toolbars when Maximised"
#~ msgstr "Nástrojové pruhy pÅi zvÄtÅ¡enÃ"
-#~ msgid "Mixer"
-#~ msgstr "SmÄÅ¡ovaÄ"
-
#~ msgid "Show All Crossfades"
#~ msgstr "Ukázat vÅ¡echna prolÃnánÃ"
diff --git a/gtk2_ardour/po/de.mo b/gtk2_ardour/po/de.mo
new file mode 100644
index 0000000..d6071f9
Binary files /dev/null and b/gtk2_ardour/po/de.mo differ
diff --git a/gtk2_ardour/po/de.po b/gtk2_ardour/po/de.po
index eb333b0..1239503 100644
--- a/gtk2_ardour/po/de.po
+++ b/gtk2_ardour/po/de.po
@@ -4,290 +4,306 @@
#
#
# Karsten Petersen <kapet at kapet.de>, 2003.
-# Edgar Aichinger <edgar.aichinger at aon.at>, 2008, 2012, 2013, 2014, 2015.
+# Edgar Aichinger <edgar.aichinger at aon.at>, 2008, 2012, 2013, 2014, 2015, 2016.
# Benjamin Scherrer <benjamin at wagnerbrutal.de>, 2015.
msgid ""
msgstr ""
"Project-Id-Version: gtk-ardour 0.347.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-23 09:42+0100\n"
-"PO-Revision-Date: 2015-12-23 12:23+0100\n"
-"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
+"POT-Creation-Date: 2016-08-06 14:10+0200\n"
+"PO-Revision-Date: 2016-08-06 15:26+0100\n"
+"Last-Translator: Edgar Aichinger <edgar.aichinger at aon.at>\n"
"Language-Team: German <ardour-dev at lists.ardour.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
"X-Poedit-Basepath: ../../\n"
"X-Poedit-SearchPath-0: gtk2_ardour\n"
#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:128
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:129
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:130
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:131
+#: about.cc:132
msgid "Hans Baier"
msgstr "Hans Baier"
-#: about.cc:132
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:133
+#: about.cc:134
msgid "Sakari Bergen"
msgstr "Sakari Bergen"
-#: about.cc:134
+#: about.cc:135
msgid "Christian Borss"
msgstr "Christian Borss"
-#: about.cc:135
+#: about.cc:136
msgid "Chris Cannam"
msgstr "Chris Cannam"
-#: about.cc:136
+#: about.cc:137
msgid "Jeremy Carter"
msgstr "Jeremy Carter"
-#: about.cc:137
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:138
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:139
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:140
+#: about.cc:141
msgid "André Colomb"
msgstr "André Colomb"
-#: about.cc:141
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:142
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:143
+#: about.cc:144
msgid "John Emmas"
msgstr "John Emmas"
-#: about.cc:144
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:145
+#: about.cc:146
msgid "Dave Flick"
msgstr "Dave Flick"
-#: about.cc:146
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:147
+#: about.cc:148
msgid "Robin Gareus"
msgstr "Robin Gareus"
-#: about.cc:148
+#: about.cc:149
msgid "Nil Geisweiller"
msgstr "Nil Geisweiller"
-#: about.cc:149
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:150
+#: about.cc:151
msgid "Chris Goddard"
msgstr "Chris Goddard"
-#: about.cc:151
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr "J. Abelardo Gutierrez"
-#: about.cc:152
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:153
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:154
+#: about.cc:155
msgid "David Halter"
msgstr "David Halter"
-#: about.cc:155
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:156
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr "Melvin Ray Herr"
-#: about.cc:157
+#: about.cc:158
msgid "Carl Hetherington"
msgstr "Carl Hetherington"
-#: about.cc:158
+#: about.cc:159
msgid "Rob Holland"
msgstr "Rob Holland"
-#: about.cc:159
+#: about.cc:160
msgid "Robert Jordens"
msgstr "Robert Jordens"
-#: about.cc:160
+#: about.cc:161
msgid "Stefan Kersten"
msgstr "Stefan Kersten"
-#: about.cc:161
+#: about.cc:162
msgid "Armand Klenk"
msgstr "Armand Klenk"
-#: about.cc:162
+#: about.cc:163
msgid "Julien de Kozak"
msgstr "Julien de Kozak"
-#: about.cc:163
+#: about.cc:164
msgid "Matt Krai"
msgstr "Matt Krai"
-#: about.cc:164
+#: about.cc:165
msgid "Georg Krause"
msgstr "Georg Krause"
-#: about.cc:165
+#: about.cc:166
msgid "Nick Lanham"
msgstr "Nick Lanham"
-#: about.cc:166
+#: about.cc:167
msgid "Colin Law"
msgstr "Colin Law"
-#: about.cc:167
+#: about.cc:168
msgid "Joshua Leach"
msgstr "Joshua Leach"
-#: about.cc:168
+#: about.cc:169
msgid "Ben Loftis"
msgstr "Ben Loftis"
-#: about.cc:169
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr "Nick Mainsbridge"
-#: about.cc:170
+#: about.cc:171
msgid "Tim Mayberry"
msgstr "Tim Mayberry"
-#: about.cc:171
+#: about.cc:172
msgid "Doug Mclain"
msgstr "Doug Mclain"
-#: about.cc:172
+#: about.cc:173
msgid "Todd Naugle"
msgstr "Todd Naugle"
-#: about.cc:173
+#: about.cc:174
msgid "André Nusser"
msgstr "André Nusser"
-#: about.cc:174
+#: about.cc:175
msgid "Bent Bisballe Nyeng"
msgstr "Bent Bisballe Nyeng"
-#: about.cc:175
+#: about.cc:176
msgid "Jack O'Quin"
msgstr "Jack O'Quin"
-#: about.cc:176
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr "Nimal Ratnayake"
-#: about.cc:177
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
msgid "David Robillard"
msgstr "David Robillard"
-#: about.cc:178
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr "Taybin Rutkin"
-#: about.cc:179
+#: about.cc:183
msgid "Andreas Ruge"
msgstr "Andreas Ruge"
-#: about.cc:180
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr "Sampo Savolainen"
-#: about.cc:181
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr "Rodrigo Severo"
-#: about.cc:182
+#: about.cc:186
msgid "Per Sigmond"
msgstr "Per Sigmond"
-#: about.cc:183
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr "Lincoln Spiteri"
-#: about.cc:184
+#: about.cc:188
msgid "Mike Start"
msgstr "Mike Start"
-#: about.cc:185
+#: about.cc:189
msgid "Mark Stewart"
msgstr "Mark Stewart"
-#: about.cc:186
+#: about.cc:190
msgid "Roland Stigge"
msgstr "Roland Stigge"
-#: about.cc:187
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr "Petter Sundlöf"
-#: about.cc:188
+#: about.cc:192
msgid "Mike Täht"
msgstr "Mike Täht"
-#: about.cc:189
+#: about.cc:193
msgid "Roy Vegard"
msgstr "Roy Vegard"
-#: about.cc:190
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
-#: about.cc:191
+#: about.cc:195
msgid "Damien Zammit"
msgstr "Damien Zammit"
-#: about.cc:192
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr "Grygorii Zharun"
-#: about.cc:197
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -301,7 +317,7 @@ msgstr ""
"\tMartin Blanchard\n"
"\tRomain Arnaud <roming22 at gmail.com>\n"
-#: about.cc:198
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -321,7 +337,7 @@ msgstr ""
"\tRichard Oax <richard at pagliacciempire.de>\n"
"\tRobin Gloster <robin at loc-com.de>\n"
-#: about.cc:205
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -331,7 +347,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:206
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -339,7 +355,7 @@ msgstr ""
"Portugiesisch:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:207
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -349,7 +365,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:209
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -359,7 +375,7 @@ msgstr ""
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:210
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -369,7 +385,7 @@ msgstr ""
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-#: about.cc:212
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -377,7 +393,7 @@ msgstr ""
"Griechisch:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:213
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -385,7 +401,7 @@ msgstr ""
"Schwedisch:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:214
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -393,7 +409,7 @@ msgstr ""
"Polnisch:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:215
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -401,7 +417,7 @@ msgstr ""
"Tschechisch:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
-#: about.cc:216
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
@@ -409,7 +425,7 @@ msgstr ""
"Norwegisch:\n"
"\t Eivind ÃdegÃ¥rd\n"
-#: about.cc:217
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -417,49 +433,53 @@ msgstr ""
"Chinesisch:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-#: about.cc:597
+#: about.cc:601
msgid "Intel 64-bit"
msgstr "Intel 64-bit"
-#: about.cc:599
+#: about.cc:603
msgid "Intel 32-bit"
msgstr "Intel 32-bit"
-#: about.cc:601
+#: about.cc:605
msgid "PowerPC 64-bit"
msgstr "PowerPC 64-bit"
-#: about.cc:603
+#: about.cc:607
msgid "PowerPC 32-bit"
msgstr "PowerPC 32-bit"
-#: about.cc:605
+#: about.cc:609
msgid "64-bit"
msgstr "64-bit"
-#: about.cc:607
+#: about.cc:611
msgid "32-bit"
msgstr "32-bit"
-#: about.cc:615
+#: about.cc:619
+msgid " - debug"
+msgstr " - debug"
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr "Copyright (C) 1999-2015 Paul Davis\n"
-#: about.cc:619
+#: about.cc:629
msgid "http://ardour.org/"
msgstr "http://ardour.org/"
-#: about.cc:620
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
msgstr ""
"%1%2\n"
-"(erzeugt aus Revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
-#: about.cc:625
+#: about.cc:635
msgid "Config"
msgstr "Konfiguration"
@@ -479,108 +499,134 @@ msgstr "Konnte die %1 Menü-Definitionsdatei nicht finden"
msgid "%1 will not work without a valid menu definition file"
msgstr "%1 wird ohne gültige Menüdefinitions-Datei nicht funktionieren"
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Spur/Bus hinzufügen"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "Füge Spur/Bus/VCA hinzu"
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "Kanaleinstellungen:"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr "Aufnahmemodus:"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "Instrument:"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "Audiospuren"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "Midispuren"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "Audio+MIDI-Spuren"
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Audiobusse"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "Audio Busse"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "MIDI Busse"
-#: add_route_dialog.cc:83 add_route_dialog.cc:554
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "VCA Masters"
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr "Zuerst"
-#: add_route_dialog.cc:84 add_route_dialog.cc:558
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
msgid "Before Selection"
msgstr "Vor Auswahl"
-#: add_route_dialog.cc:85 add_route_dialog.cc:556
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
msgid "After Selection"
msgstr "Nach Auswahl"
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr "Zuletzt"
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "Flexibles E/A"
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "Striktes E/A"
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "Erstelle:"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>Optionen</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:52
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "Name:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "Gruppe:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr "Insert:"
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:574 engine_dialog.cc:242 rc_option_editor.cc:2257
-#: rc_option_editor.cc:2259 rc_option_editor.cc:2261 rc_option_editor.cc:2279
-#: rc_option_editor.cc:2281 rc_option_editor.cc:2290 rc_option_editor.cc:2292
-#: rc_option_editor.cc:2310 rc_option_editor.cc:2323 rc_option_editor.cc:2326
-#: rc_option_editor.cc:2328 rc_option_editor.cc:2373 rc_option_editor.cc:2375
-#: rc_option_editor.cc:2377 rc_option_editor.cc:2385 rc_option_editor.cc:2393
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2403
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Ausgangsports:"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"Wenn striktes E/A aktiviert ist, werden Effektprozessoren die Kanalzahl "
+"einer Spur nicht verändern. Die Anzahl an Ausgängen wird immer der Anzahl an "
+"Eingängen entsprechen."
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "Audio"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:110 engine_dialog.cc:244 missing_file_dialog.cc:60
-#: rc_option_editor.cc:2536 rc_option_editor.cc:2538 rc_option_editor.cc:2548
-#: rc_option_editor.cc:2557 rc_option_editor.cc:2565 rc_option_editor.cc:2573
-#: rc_option_editor.cc:2581 rc_option_editor.cc:2589 rc_option_editor.cc:2591
-#: rc_option_editor.cc:2599 rc_option_editor.cc:2601 rc_option_editor.cc:2609
-#: rc_option_editor.cc:2618 rc_option_editor.cc:2620 rc_option_editor.cc:2628
-#: rc_option_editor.cc:2636 rc_option_editor.cc:2645 rc_option_editor.cc:2654
-#: rc_option_editor.cc:2677
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr "Audio+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "Bus"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -594,60 +640,61 @@ msgstr ""
"Falls Sie nicht vorhaben, so ein Plugin zu benutzen, verwenden Sie "
"stattdessen eine normale Audio- oder MIDI-Spur"
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:438
-#: editor_rulers.cc:250 time_axis_view.cc:1383
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1294
msgid "Normal"
msgstr "Normal"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "Non Layered"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Band"
-#: add_route_dialog.cc:431 monitor_section.cc:264
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Mono"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "Stereo"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 Kanäle"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 Kanäle"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "5 Kanäle"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 Kanäle"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 Kanäle"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "12 Kanäle"
-#: add_route_dialog.cc:483 mixer_strip.cc:1918 mixer_strip.cc:2351
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
msgid "Custom"
msgstr "Benutzerdefiniert"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "Neue Gruppe..."
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr "Keine Gruppe"
@@ -677,70 +724,70 @@ msgstr ""
msgid "Done"
msgstr "Fertig"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "Signalquelle"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Ausgewählte Bereiche"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Ausgewählte Regionen"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Anzeigetyp"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Graphen für jede Spur einzeln"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Graphen aller Spuren zusammenfassen"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Leistungsspektrum anzeigen"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalisieren"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr "Passe dB-Bereich ein"
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr "Proportionales Spektrum, -18dB"
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "FFT-Analysefenster"
-#: analysis_window.cc:60 editor.cc:1848
+#: analysis_window.cc:54 editor.cc:1954
msgid "Spectral Analysis"
msgstr "FFT-Analyse"
-#: analysis_window.cc:67 editor_actions.cc:143 session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Spur"
-#: analysis_window.cc:68 editor_actions.cc:664 mixer_ui.cc:135
-#: mixer_ui.cc:2035
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "Anzeigen"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Daten erneut analysieren"
-#: ardour_button.cc:820
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr ""
"Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht "
"verfolgen\n"
-#: ardour_button.cc:1088
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: ardour_ui.cc:174
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr "HTTP Anforderung fehlgeschlagen: (%1) %2"
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr "HTTP Anforderungsstatus: %1"
+
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
@@ -754,83 +801,155 @@ msgstr ""
"\n"
"(Dies erfordert einen Neustart von %1.)"
-#: ardour_ui.cc:253 editor_actions.cc:658 region_editor.cc:53
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Vorhören"
-#: ardour_ui.cc:254 editor_actions.cc:137 mixer_strip.cc:2101
-#: monitor_section.cc:321 rc_option_editor.cc:2413 route_time_axis.cc:255
-#: route_time_axis.cc:2748
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Solo"
-#: ardour_ui.cc:255 rc_option_editor.cc:1356
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "Feedback"
-#: ardour_ui.cc:264 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Lautsprechereinstellung"
-#: ardour_ui.cc:265 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Tastaturkürzel"
-
-#: ardour_ui.cc:266
-msgid "Preferences"
-msgstr "Globale Einstellungen"
-
-#: ardour_ui.cc:267 ardour_ui.cc:274
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr "Spuren/Busse hinzufügen"
-#: ardour_ui.cc:268
+#: ardour_ui.cc:298
msgid "About"
msgstr "Ãber..."
-#: ardour_ui.cc:269 location_ui.cc:1143 session_option_editor.cc:210
-#: session_option_editor.cc:216 session_option_editor.cc:223
-msgid "Locations"
-msgstr "Dateiorte"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "Positionen"
-#: ardour_ui.cc:270 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "Spuren/Busse"
-#: ardour_ui.cc:271 engine_dialog.cc:73
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr "Audio/MIDI Einstellungen"
-#: ardour_ui.cc:272
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr "Videoexport-Dialog"
-#: ardour_ui.cc:273
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "Skript Manager"
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "Projekteinstellungen"
-#: ardour_ui.cc:275 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "Video hinzufügen"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "Bundle Manager"
-#: ardour_ui.cc:276 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "GroÃe Zeitanzeige"
-#: ardour_ui.cc:277
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr "Audio-Verbindungen"
-#: ardour_ui.cc:278
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr "MIDI-Verbindungen"
-#: ardour_ui.cc:295
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "Kürzel-Verwaltung"
+
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr "Editor"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Mixer"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Einstellungen"
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
"Ihre Konfigurationsdateien wurden kopiert. Sie können jetzt %1 neu starten."
-#: ardour_ui.cc:527
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr "Pre-Release Warnung"
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+"<b>Willkommen zu diesem Pre-Release Build von %1 %2</b>\n"
+"\n"
+"Bis diese Version als zur Veröffentlichung geeignet angesehen werden kann,\n"
+"wird weiter an etlichen Problemen, Bugs sowie allgemeinen Verbesserungen\n"
+"des Arbeitsflusses gearbeitet. Daher an dieser Stelle ein paar Richtlinien:\n"
+"\n"
+"1) Bitte benutzen Sie diese Software <b>NICHT</b> in der Erwartung, dass sie "
+"stabil oder zuverlässig ist\n"
+" obwohl sie das (abhängig von Ihrer Arbeitsweeise) sein mag.\n"
+"2) Bitte warten Sie auf hilfreiche Dokumentation der neuen Features.\n"
+"3) <b>Bitte nutzen Sie NICHT das Forum, um Probleme zu melden</b>.\n"
+"4) Bitte <b>NUTZEN</b> Sie den Bugtracker auf http://tracker.ardour.org/, um "
+"Probleme zu melden\n"
+" wobei Sie unbedingt die Produktversionsnummer 5.0-pre eintragen sollten.\n"
+"5) Bitte <b>NUTZEN</b> Sie die ardour-users Mailingliste, um Ideen zu "
+"diskutieren und Kommentare abzugeben.\n"
+"6) Bitte <b>NUTZEN</b> Sie unseren IRC-Kanal für Live-Diskussionen zu %1 %2. "
+"Sie\n"
+" können direkt aus dem Programm über den Menüpunkt Hilfe->Chat dorthin "
+"gelangen.\n"
+"\n"
+"Vollständige Information zu allen oben genannten Punkten finden Sie auf "
+"der Supportseite unter\n"
+"\n"
+" http://ardour.org/support\n"
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
@@ -840,7 +959,7 @@ msgstr ""
"\n"
"%1"
-#: ardour_ui.cc:529
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -852,7 +971,7 @@ msgstr ""
"war. Sie sollten versuchen, das Audiobackend \n"
"neu zu starten und das Projekt zu speichern."
-#: ardour_ui.cc:553
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
@@ -860,39 +979,39 @@ msgstr ""
"Audio Unit Plugin Scan fehlgeschlagen. Automatische AU Scans wurden "
"deaktiviert. Weitere Einzelheiten finden Sie im Logfenster."
-#: ardour_ui.cc:554
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr "Audio Unit Plugin Scan fehlgeschlagen:"
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr "Der NSM Server hat sich nicht angemeldet"
-#: ardour_ui.cc:916
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr "NSM: keine Client-ID verfügbar"
-#: ardour_ui.cc:923
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr "NSM: kein Projekt erzeugt"
-#: ardour_ui.cc:946
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
-msgstr "NSM: Initialisierung gescheitert"
+msgstr "NSM: Initialisierung fehlgeschlagen"
-#: ardour_ui.cc:978
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr "Demoversionswarnung"
-#: ardour_ui.cc:980
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr "%1 abonnieren und die Entwicklung unterstützen"
-#: ardour_ui.cc:981
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr "Nicht noch einmal warnen"
-#: ardour_ui.cc:983
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -910,15 +1029,15 @@ msgstr ""
"\n"
"%4"
-#: ardour_ui.cc:984
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr "Dies ist eine freie Demoversion von %1"
-#: ardour_ui.cc:985
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr "Sie kann keine Plugin-Einstellungen speichern oder laden"
-#: ardour_ui.cc:986
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
@@ -926,7 +1045,7 @@ msgstr ""
"Wenn Sie ein existierendes Projekt mit Plugin-Einstellungen laden, werden "
"diese nicht benutzt und beim Speichern verloren gehen."
-#: ardour_ui.cc:988 plugin_ui.cc:579
+#: ardour_ui.cc:1093 plugin_ui.cc:586
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
@@ -935,19 +1054,19 @@ msgstr ""
"Sie, uns durch ein Abonnement mit einem geringen monatlichen Betrag zu "
"unterstützen."
-#: ardour_ui.cc:998
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr "Jetzt beenden"
-#: ardour_ui.cc:999
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr "%1 weiterhin benutzen"
-#: ardour_ui.cc:1032 startup.cc:348
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 ist nun bereit"
-#: ardour_ui.cc:1074
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -962,23 +1081,23 @@ msgstr ""
"Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise "
"in %2 verändern."
-#: ardour_ui.cc:1091
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "Diese Meldung nicht erneut anzeigen"
-#: ardour_ui.cc:1135
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "Abbrechen"
-#: ardour_ui.cc:1136
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr "Beenden ohne zu speichern"
-#: ardour_ui.cc:1137 ardour_ui.cc:5008
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "Speichern und beenden"
-#: ardour_ui.cc:1147
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -992,11 +1111,11 @@ msgstr ""
"\n"
"\"Trotzdem beenden\"."
-#: ardour_ui.cc:1197
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr "Nicht gespeichertes Projekt"
-#: ardour_ui.cc:1218
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -1014,7 +1133,7 @@ msgstr ""
"\n"
"Wie wollen Sie vorgehen?"
-#: ardour_ui.cc:1221
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -1032,106 +1151,107 @@ msgstr ""
"\n"
"Wie wollen Sie vorgehen?"
-#: ardour_ui.cc:1235
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Frage"
-#: ardour_ui.cc:1349 ardour_ui.cc:1357
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr "Audio: <span foreground=\"red\">Kein</span>"
-#: ardour_ui.cc:1361
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1365
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1383 export_video_dialog.cc:76
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "Datei:"
-#: ardour_ui.cc:1387
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1390
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1393
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1396 session_option_editor.cc:202
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1399
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1402
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1405 session_option_editor.cc:203
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1408
+#: ardour_ui.cc:1518
msgid "RF64/WAV"
msgstr "RF64/WAV"
-#: ardour_ui.cc:1411
+#: ardour_ui.cc:1521
msgid "MBWF"
msgstr "MBWF"
-#: ardour_ui.cc:1419
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr "32-float"
-#: ardour_ui.cc:1422
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr "24-int"
-#: ardour_ui.cc:1425
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr "16-int"
-#: ardour_ui.cc:1446
+#: ardour_ui.cc:1556
#, c-format
msgid "X: <span foreground=\"%s\">>10K</span>"
msgstr "X: <span foreground=\"%s\">>10K</span>"
-#: ardour_ui.cc:1448
+#: ardour_ui.cc:1558
#, c-format
msgid "X: <span foreground=\"%s\">%u</span>"
msgstr "X: <span foreground=\"%s\">%u</span>"
-#: ardour_ui.cc:1451
+#: ardour_ui.cc:1561
#, c-format
msgid "X: <span foreground=\"%s\">?</span>"
msgstr "X: <span foreground=\"%s\">?</span>"
-#: ardour_ui.cc:1454
+#: ardour_ui.cc:1564
msgid "Audio dropouts. Shift+click to reset"
msgstr "Audio Dropouts. Zum Zurücksetzen Shift+Klick"
-#: ardour_ui.cc:1467
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1477
+#: ardour_ui.cc:1587
#, c-format
msgid "PkBld: <span foreground=\"%s\">%d</span>"
msgstr "PkBld: <span foreground=\"%s\">%d</span>"
-#: ardour_ui.cc:1499
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1142,29 +1262,29 @@ msgstr ""
"%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
"%<PRIu32>%%</span>"
-#: ardour_ui.cc:1540
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Disk: <span foreground=\"green\">Unbekannt</span>"
-#: ardour_ui.cc:1542
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Disk: <span foreground=\"green\">24h+</span>"
-#: ardour_ui.cc:1560
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "Disk: <span foreground=\"green\">>24 h</span>"
-#: ardour_ui.cc:1571
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-#: ardour_ui.cc:1597
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "TC: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1675
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
@@ -1172,56 +1292,62 @@ msgstr ""
"%1 ist derzeit mit keinem Audiobackend verbunden.\n"
"Daher können keine Projekte geöffnet oder geschlossen werden."
-#: ardour_ui.cc:1693
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Projekt öffnen"
-#: ardour_ui.cc:1717 session_dialog.cc:407 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "%1 Projekte"
-#: ardour_ui.cc:1748
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr ""
"Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde."
-#: ardour_ui.cc:1756
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "konnte %1 neue Audio+MIDI-Spur nicht erstellen"
msgstr[1] "konnte %1 neue Audio+MIDI-Spuren nicht erstellen"
-#: ardour_ui.cc:1762 ardour_ui.cc:1823
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Es sind nicht genügend Ports verfügbar,\n"
-"um neue Spuren oder Busse zu erzeugen.\n"
-"Sie sollten %1 sichern, beenden und\n"
-" mit mehr Ports neustarten."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "konnte %1 MIDI-Bus nicht erzeugen"
+msgstr[1] "konnte %1 MIDI-Busse nicht erzeugen"
-#: ardour_ui.cc:1797
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
"Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde."
-#: ardour_ui.cc:1806
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "konnte %1 neue Audiospur nicht erstellen."
msgstr[1] "konnte %1 neue Audiospuren nicht erstellen."
-#: ardour_ui.cc:1815
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "konnte %1 neuen Audiobus nicht erstellen"
msgstr[1] "konnte %1 neue Audiobusse nicht erstellen"
-#: ardour_ui.cc:1968
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Es sind nicht genügend Ports verfügbar,\n"
+"um neue Spuren oder Busse zu erzeugen.\n"
+"Sie sollten %1 sichern, beenden und\n"
+" mit mehr Ports neustarten."
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1230,20 +1356,20 @@ msgstr ""
"eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n"
"im Menüpunkt Projekt."
-#: ardour_ui.cc:2359
+#: ardour_ui.cc:2565
#, c-format
msgid "Copied %<PRId64> of %<PRId64>"
msgstr "%<PRId64> von %<PRId64> kopiert"
-#: ardour_ui.cc:2413 save_as_dialog.cc:33
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
msgid "Save As"
msgstr "Speichern unter"
-#: ardour_ui.cc:2441
+#: ardour_ui.cc:2647
msgid "Save As failed: %1"
msgstr "Sichern unter fehlgeschlagen: %1"
-#: ardour_ui.cc:2463
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1251,37 +1377,37 @@ msgstr ""
"Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
"dürfen Namen von Schnappschüssen kein '%1'-Zeichen enthalten"
-#: ardour_ui.cc:2477
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "Ãberschreiben des Schnappschusses bestätigen"
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2699
msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
"Ein Schnappschuss mit diesem Namen existiert bereits Wollen Sie sie "
"überschreiben?"
-#: ardour_ui.cc:2503
-msgid "Save as..."
-msgstr "Speichern unter..."
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "Schnappschuss und umschalten"
-#: ardour_ui.cc:2504 ardour_ui.cc:2553
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
msgid "New session name"
msgstr "Neuer Projektname"
-#: ardour_ui.cc:2506
+#: ardour_ui.cc:2727
msgid "Take Snapshot"
msgstr "Schnappschuss machen"
-#: ardour_ui.cc:2507
+#: ardour_ui.cc:2728
msgid "Name of new snapshot"
msgstr "Name für neuen Schnappschuss"
-#: ardour_ui.cc:2552
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "Projekt umbenennen"
-#: ardour_ui.cc:2567 ardour_ui.cc:3047 ardour_ui.cc:3085
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1289,14 +1415,14 @@ msgstr ""
"Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
"dürfen Projektnamen kein '%1'-Zeichen enthalten"
-#: ardour_ui.cc:2575
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
"Dieser Name wird schon von einem anderen Verzeichnis/Ordner benutzt. Bitte "
"versuchen Sie einen anderen Namen."
-#: ardour_ui.cc:2584
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1304,28 +1430,28 @@ msgstr ""
"Das Umbenennen des Projekts ist fehlgeschlagen.\n"
"Dies könnte auf schwerwiegende Probleme hinweisen."
-#: ardour_ui.cc:2700 route_ui.cc:1871
+#: ardour_ui.cc:2923 route_ui.cc:1871
msgid "Confirm Template Overwrite"
msgstr "Bestätige Ãberschreiben der Vorlage"
-#: ardour_ui.cc:2701 route_ui.cc:1872
+#: ardour_ui.cc:2924 route_ui.cc:1872
msgid "A template already exists with that name. Do you want to overwrite it?"
msgstr ""
"Eine Vorlage mit diesem Namen existiert bereits Wollen Sie sie überschreiben?"
-#: ardour_ui.cc:2725
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr "Als Vorlage Speichern"
-#: ardour_ui.cc:2726
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "Name für Vorlage"
-#: ardour_ui.cc:2727
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-Vorlage"
-#: ardour_ui.cc:2764
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1335,39 +1461,39 @@ msgstr ""
"%1\n"
"existiert bereits. Wollen Sie es öffnen?"
-#: ardour_ui.cc:2774
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "Vorhandenes Projekt öffnen"
-#: ardour_ui.cc:3075
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "Es gibt kein Projekt in: \"%1\""
-#: ardour_ui.cc:3169
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "Bitte warten Sie, während %1 das Projekt lädt"
-#: ardour_ui.cc:3184
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "Fehler bei der Registrierung von Ports"
-#: ardour_ui.cc:3185
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr "Klicken Sie auf SchlieÃen, um es erneut zu versuchen."
-#: ardour_ui.cc:3204
+#: ardour_ui.cc:3426
msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden: %3"
-#: ardour_ui.cc:3210 ardour_ui.cc:3231 ardour_ui.cc:3328 ardour_ui.cc:3337
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "Fehler beim Laden"
-#: ardour_ui.cc:3225
+#: ardour_ui.cc:3447
msgid "Session \"%1 (snapshot %2)\" did not load successfully"
msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden."
-#: ardour_ui.cc:3253
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
@@ -1377,19 +1503,19 @@ msgstr ""
"\n"
"Aufnehmen oder Speichern wird nicht möglich sein."
-#: ardour_ui.cc:3258
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr "Schreibgeschütztes Projekt"
-#: ardour_ui.cc:3327
+#: ardour_ui.cc:3547
msgid "Could not create session in \"%1\": %2"
msgstr "Konnte Projekt in \"%1\" nicht erstellen: %2"
-#: ardour_ui.cc:3336
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "Konnte kein Projekt in \"%1\" anlegen"
-#: ardour_ui.cc:3376
+#: ardour_ui.cc:3601
msgid ""
"<b>Just ask and wait for an answer.\n"
"It may take from minutes to hours.</b>"
@@ -1397,11 +1523,11 @@ msgstr ""
"<b>Stellen Sie Ihre Frage und warten auf Antwort.\n"
"Es kann ein paar Minuten, aber vielleicht auch Stunden dauern.</b>"
-#: ardour_ui.cc:3378
+#: ardour_ui.cc:3603
msgid "About the Chat"
msgstr "Ãber den Chat"
-#: ardour_ui.cc:3379
+#: ardour_ui.cc:3604
msgid ""
"When you're inside the chat just ask your question and wait for an answer. "
"The chat is occupied by real people with real lives so many of them are "
@@ -1421,16 +1547,16 @@ msgstr ""
"Lassen Sie einfach Ihr Chatfenster geöffnet und schauen gelegentlich nach, "
"bis jemand auf Ihre Fragen geantwortet hat."
-#: ardour_ui.cc:3498
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "Keine Audiodateien zum Aufräumen vorhanden"
-#: ardour_ui.cc:3502 ardour_ui.cc:3512 ardour_ui.cc:3645 ardour_ui.cc:3652
-#: ardour_ui_ed.cc:104
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "Aufräumen"
-#: ardour_ui.cc:3503
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1442,19 +1568,19 @@ msgstr ""
"sind sie wahrscheinlich noch in einem\n"
"älteren Schnappschuss als Region eingebunden."
-#: ardour_ui.cc:3562
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "kilo"
-#: ardour_ui.cc:3565
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "mega"
-#: ardour_ui.cc:3568
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "giga"
-#: ardour_ui.cc:3573
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1468,7 +1594,7 @@ msgstr[1] ""
"Die folgenden %1 Dateien wurden von %2\n"
"gelöscht und gaben %3 %4bytes Speicherplatz frei"
-#: ardour_ui.cc:3580
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1506,11 +1632,11 @@ msgstr[1] ""
"\n"
"%3 %4bytes Speicherplatz freigegeben werden.\n"
-#: ardour_ui.cc:3640
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "Wollen Sie wirklich aufräumen?"
-#: ardour_ui.cc:3647
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1522,41 +1648,65 @@ msgstr ""
"Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead "
"sounds\" Ordner verschoben."
-#: ardour_ui.cc:3655
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Aufräumdialog"
-#: ardour_ui.cc:3685
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr "Aufgeräumte Dateien"
-#: ardour_ui.cc:3702
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "gelöschte Datei"
-#: ardour_ui.cc:3895
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "Kann Projektskript '%1' nicht lesen: %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr "Skript-Parameter setzen"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "Projektskript '%1' - Instantiierung fehlgeschlagen: %2"
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "Laden des Projektskripts '%1' fehlgeschlagen: %2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "In diesem Projekt sind keine aktiven Luaskripte vorhanden."
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "Entfernen des Projektskripts '%1' fehlgeschlagen: %2"
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
"Der Video-Server wurde nicht von %1 gestartet. Die Aufforderung ihn zu "
"beenden wird ignoriert."
-#: ardour_ui.cc:3899
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr "Video-Server anhalten"
-#: ardour_ui.cc:3900
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr "Wollen Sie den Video-Server wirklich anhalten?"
-#: ardour_ui.cc:3903
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr "Ja, anhalten."
-#: ardour_ui.cc:3929
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr "Der Video-Server läuft bereits"
-#: ardour_ui.cc:3931
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
@@ -1564,7 +1714,7 @@ msgstr ""
"Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es "
"wird keine neue Instanz gestartet."
-#: ardour_ui.cc:3939 ardour_ui.cc:4044
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
@@ -1573,48 +1723,48 @@ msgstr ""
"ihn vorher starten oder die URL für den Zugriff in den Einstellungen "
"anpassen."
-#: ardour_ui.cc:3969
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
-#: ardour_ui.cc:3975 ardour_ui.cc:3981
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
-#: ardour_ui.cc:4015
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr "Kann den Videoserver nicht starten "
-#: ardour_ui.cc:4025
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..."
-#: ardour_ui.cc:4070 editor_audio_import.cc:644
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "Konnte %1 nicht öffnen"
-#: ardour_ui.cc:4074
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr "Es wurde keine Videodatei ausgewählt."
-#: ardour_ui.cc:4170
+#: ardour_ui.cc:4472
msgid "No LTC detected, video will not be aligned."
msgstr "Kein LTC entdeckt, Video wird nicht ausgerichtet."
-#: ardour_ui.cc:4176
+#: ardour_ui.cc:4478
msgid "Align video-start to %1 [samples]"
msgstr "Richte Video auf %1 [samples] aus"
-#: ardour_ui.cc:4310
+#: ardour_ui.cc:4654
msgid "xrun"
msgstr "xrun"
-#: ardour_ui.cc:4319
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr ""
"Die Aufnahme wurde gestoppt, da Ihr System nicht schnell genug folgen konnte."
-#: ardour_ui.cc:4348
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1628,23 +1778,23 @@ msgstr ""
"Die Daten konnten nicht schnell genug geschrieben\n"
"werden, um die Aufnahme fortzuführen.\n"
-#: ardour_ui.cc:4421
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr "Suche nach Plugins"
-#: ardour_ui.cc:4423
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr "Plugin-Suche abbrechen"
-#: ardour_ui.cc:4432
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr "Stopp-Timeout"
-#: ardour_ui.cc:4439
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr "Such-Timeout"
-#: ardour_ui.cc:4483
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1658,11 +1808,11 @@ msgstr ""
"Die Daten konnten nicht schnell genug gelesen\n"
"werden, um die Wiedergabe aufrechtzuerhalten.\n"
-#: ardour_ui.cc:4523
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "Absturz-Wiederherstellung"
-#: ardour_ui.cc:4524
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1680,19 +1830,19 @@ msgstr ""
"für Sie wiederherstellen oder sie verwerfen.\n"
"Bitte entscheiden Sie, wie Sie vorgehen möchten.\n"
-#: ardour_ui.cc:4536
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Daten verwerfen"
-#: ardour_ui.cc:4537
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Daten wiederherstellen"
-#: ardour_ui.cc:4557
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "Samplerate passt nicht"
-#: ardour_ui.cc:4558
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1703,15 +1853,29 @@ msgstr ""
"%2 läuft derzeit mit %3 Hz. Wenn Sie dieses Projekt laden, \n"
"wird Ihr Audiomaterial mit der falschen Samplerate abgespielt.\n"
-#: ardour_ui.cc:4567
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "Projekt nicht laden"
-#: ardour_ui.cc:4568
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "Projekt trotzdem laden"
-#: ardour_ui.cc:4860
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"Dieses Projekt wurde mit einer Samplerate von %1 Hz erzeugt,\n"
+"aber %2 läuft momentan mit %3 Hz. \n"
+"Audio wird mit der falschen Samplerate aufgenommen und abgespielt.\n"
+"Konfigurieren Sie die Audioengine in\n"
+"Menü > Fenster > Audio/MIDI-Setup neu."
+
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1723,100 +1887,91 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-"%4Dies ist ein Projekt, das mit einer älteren Version von %3 erstellt wurde"
-"%5\n"
+"%4Dieses Projekt wurde mit einer älteren Version von %3%5 erstellt\n"
"\n"
-"%3 hat die alte Projektdatei\n"
+"%3 hat die Projektdatei\n"
"\n"
"%6%1%7\n"
"\n"
"nach\n"
"\n"
-"%6%2%7 kopiert.\n"
+"%6%2%7 kopiert\n"
"\n"
-"Benutzen Sie von nun an die -2000 Version mit älteren Versionen von %3"
+"Benutzen Sie ab jetzt die Backup-Kopie mit älteren %3 Versionen"
-#: ardour_ui.cc:4977
+#: ardour_ui.cc:5331
msgid "This is a free/demo copy of %1. It has just switched to silent mode."
msgstr ""
"Dies ist eine freie Demoversion von %1. Sie hat sich gerade stummgeschaltet."
-#: ardour_ui.cc:4983
+#: ardour_ui.cc:5337
msgid "%1 is now silent"
msgstr "%1 ist nun stumm"
-#: ardour_ui.cc:4985
+#: ardour_ui.cc:5339
msgid ""
"Please consider paying for a copy of %1 - you can pay whatever you want."
msgstr ""
"Bitte ziehen Sie in Erwägung, für eine Kopie von %1 einen Geldbetrag - in "
"beliebiger Höhe - zu zahlen."
-#: ardour_ui.cc:4986
+#: ardour_ui.cc:5340
msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
msgstr ""
"Besser noch, werden Sie ein Abonnent - Abonnements beginnen bei US$1 pro "
"Monat."
-#: ardour_ui.cc:4987
+#: ardour_ui.cc:5341
msgid "Pay for a copy (via the web)"
msgstr "Für eine Kopie zahlen (über das WWW)"
-#: ardour_ui.cc:4988
+#: ardour_ui.cc:5342
msgid "Become a subscriber (via the web)"
msgstr "Abonnent werden (über das Web)"
-#: ardour_ui.cc:5007
+#: ardour_ui.cc:5361
msgid "Remain silent"
msgstr "Stumm bleiben"
-#: ardour_ui.cc:5009
+#: ardour_ui.cc:5363
msgid "Give me more time"
msgstr "Ich möchte mehr Zeit haben"
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Der Editor konnte nicht initialisiert werden."
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Der Mixer konnte nicht initialisiert werden."
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "UI: konnte Meterbridge nicht einrichten."
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr "Globale Tastenzuordnungen fehlen"
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Wiedergabe ab Positionszeiger"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Wiedergabe anhalten"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "Aufnahmestatus umschalten"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Bereich/Auswahl wiedergeben"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Zum Anfang des Projekts springen"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Zum Ende des Projekts springen"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Schleife wiedergeben"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
@@ -1825,23 +1980,23 @@ msgstr ""
"Schalte auf allen Midikanälen die Notensignale aus und setzte alle MIDI-"
"Controller zurück"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "Bei Stopp zum letzten Wiedergabepunkt springen"
-#: ardour_ui2.cc:137
+#: ardour_ui2.cc:88
msgid "Playhead follows range selections and edits"
msgstr "Positionszeiger folgt Auswahl und Bearbeitungen"
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Automatisches Input Monitoring aktivieren"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Aktiviert/Deaktiviert Klick"
-#: ardour_ui2.cc:140 monitor_section.cc:124
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1849,7 +2004,7 @@ msgstr ""
"Wenn aktiv, ist etwas auf Solo geschalten.\n"
"Klick schaltet Solo überall aus."
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
"When active, auditioning is taking place.\n"
"Click to stop the audition"
@@ -1857,11 +2012,11 @@ msgstr ""
"Wenn aktiv, wird vorgehört.\n"
"Klicken, um das Vorhören zu beenden"
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife."
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1875,7 +2030,7 @@ msgstr ""
"<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
"einzugeben.\n"
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1889,489 +2044,557 @@ msgstr ""
"<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
"einzugeben.\n"
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr "Alle Spitzenwertanzeigen zurücksetzen"
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr "Zeige Fehlermeldungen und bestätige Warnungen"
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[FEHLER]:"
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[WARNUNG]:"
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[INFO]: "
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:430
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Auto Return"
-#: ardour_ui2.cc:257 ardour_ui_ed.cc:433
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "Folge Bearbeitungen"
-#: ardour_ui2.cc:704 rc_option_editor.cc:2895
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+"Ziehen Sie diesen Tab auf die Arbeitsfläche, um %1 in einem eigenen Fenster "
+"anzuzeigen\n"
+"\n"
+"Um das Fenster wieder anzuheften, benutzen Sie die den Menüeintrag Fenster > "
+"Anheften"
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr "GUI"
-#: ardour_ui2.cc:721 rc_option_editor.cc:1734 rc_option_editor.cc:1752
-#: rc_option_editor.cc:1755 rc_option_editor.cc:1757 rc_option_editor.cc:1759
-#: rc_option_editor.cc:1767 rc_option_editor.cc:1769 rc_option_editor.cc:1777
-#: rc_option_editor.cc:1785 rc_option_editor.cc:1792 rc_option_editor.cc:1801
-#: rc_option_editor.cc:1803 rc_option_editor.cc:1805 rc_option_editor.cc:1813
-#: rc_option_editor.cc:1815 rc_option_editor.cc:1824
-#: session_option_editor.cc:342 session_option_editor.cc:344
-#: session_option_editor.cc:365 session_option_editor.cc:367
-#: session_option_editor.cc:369 session_option_editor.cc:376
-#: session_option_editor.cc:383 session_option_editor.cc:387
-msgid "Misc"
-msgstr "Allgemein"
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "Allgemein/Klick"
-#: ardour_ui_dependents.cc:77
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Editor laden"
-#: ardour_ui_dependents.cc:79
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Mixer laden"
-#: ardour_ui_dependents.cc:85
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Projekt-Aktionsverlauf laden"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Der Editor konnte nicht initialisiert werden."
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Der Mixer konnte nicht initialisiert werden."
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UI: konnte Meterbridge nicht einrichten."
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr "UI: kann Luafenster nicht einrichten"
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "Globale Einstellungen"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Mixer"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr "Abbrechen"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "Ohne speichern schlieÃen"
-#: ardour_ui_dialogs.cc:253
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "Speichern und schlieÃen"
-#: ardour_ui_dialogs.cc:363
-msgid "This screen is not tall enough to display the mixer window"
-msgstr ""
-"Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr "Escape"
-#: ardour_ui_ed.cc:103
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Projekt"
-#: ardour_ui_ed.cc:106 editor_actions.cc:139 editor_regions.cc:119
-#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Sync"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Optionen"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Fenster"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "Ablösen"
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Hilfe"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Verschiedenes"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Audio-Dateiformat"
-#: ardour_ui_ed.cc:112
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Dateiformat"
-#: ardour_ui_ed.cc:113 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Sampleformat"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:2705 rc_option_editor.cc:2717
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Eingabegeräte / Controller"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2375 rc_option_editor.cc:2723
-#: rc_option_editor.cc:2725 rc_option_editor.cc:2735 rc_option_editor.cc:2742
-#: rc_option_editor.cc:2750 rc_option_editor.cc:2762 rc_option_editor.cc:2767
-#: rc_option_editor.cc:2769 rc_option_editor.cc:2774 rc_option_editor.cc:2781
-#: rc_option_editor.cc:2786 rc_option_editor.cc:2795 rc_option_editor.cc:2799
-#: rc_option_editor.cc:2808 rc_option_editor.cc:2816 rc_option_editor.cc:2820
-#: rc_option_editor.cc:2825 rc_option_editor.cc:2832 rc_option_editor.cc:2833
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
msgid "Plugins"
msgstr "Plugins"
-#: ardour_ui_ed.cc:116 rc_option_editor.cc:2969
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
msgid "Metering"
msgstr "Pegelanzeige"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "Abfall der Pegelanzeige"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Pegelanzeige halten"
-#: ardour_ui_ed.cc:119
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "Umgang mit Denormals"
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1694
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "Neu..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "Ãffnen..."
-#: ardour_ui_ed.cc:126
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Zuletzt verwendet..."
-#: ardour_ui_ed.cc:127 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "SchlieÃen"
-#: ardour_ui_ed.cc:130
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "Spur/Bus hinzufügen..."
-#: ardour_ui_ed.cc:135
+#: ardour_ui_ed.cc:163
msgid "Duplicate Tracks/Busses..."
msgstr "Spuren/Busse duplizieren..."
-#: ardour_ui_ed.cc:141
+#: ardour_ui_ed.cc:169
msgid "Cancel Solo"
msgstr "Solo abbrechen"
-#: ardour_ui_ed.cc:146
-msgid "Open Video"
-msgstr "Video öffnen"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "Skripte "
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "Lua-Skript hinzufügen..."
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "Lua-Skript entfernen"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "Video öffnen..."
-#: ardour_ui_ed.cc:149
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr "Video entfernen"
-#: ardour_ui_ed.cc:152
-msgid "Export to Video File"
-msgstr "Exportiere Video-Datei"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "Videodatei exportieren"
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:194
msgid "Snapshot (& keep working on current version) ..."
msgstr "Schnappschuss (& an dieser Version weiterarbeiten)..."
-#: ardour_ui_ed.cc:160
+#: ardour_ui_ed.cc:197
msgid "Snapshot (& switch to new version) ..."
msgstr "Schnappschuss (& zur neuen Version wechseln) ..."
-#: ardour_ui_ed.cc:164
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr "Schneller Schnappschuss (& an aktueller Version weiterarbeiten) ..."
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr "Schneller Schnappschuss (& zu neuer Version wechseln) ..."
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "Speichern unter..."
-#: ardour_ui_ed.cc:168 editor_actions.cc:1790 editor_markers.cc:903
-#: editor_snapshots.cc:136 mixer_strip.cc:1578 route_time_axis.cc:1690
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
msgid "Rename..."
msgstr "Umbenennen..."
-#: ardour_ui_ed.cc:172
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Als Vorlage Speichern..."
-#: ardour_ui_ed.cc:175
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "Metadaten"
-#: ardour_ui_ed.cc:178
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "Metadaten bearbeiten..."
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "Metadaten importieren..."
-#: ardour_ui_ed.cc:184
+#: ardour_ui_ed.cc:226
msgid "Export to Audio File(s)..."
msgstr "Exportiere Audio-Datei(en)..."
-#: ardour_ui_ed.cc:187
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "Stems exportieren..."
-#: ardour_ui_ed.cc:190 editor_export_audio.cc:66
-#: export_channel_selector.cc:190 export_channel_selector.cc:576
-#: export_dialog.cc:129 export_video_dialog.cc:80
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:136
+#: export_video_dialog.cc:80
msgid "Export"
msgstr "Exportieren"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "Nicht benutzte Dateien entfernen..."
-#: ardour_ui_ed.cc:197
+#: ardour_ui_ed.cc:239
msgid "Reset Peak Files"
msgstr "Peakdateien zurücksetzen"
-#: ardour_ui_ed.cc:201
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "Müll leeren"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Beenden"
-#: ardour_ui_ed.cc:209 automation_time_axis.cc:543 editor_actions.cc:661
-#: editor_markers.cc:902 location_ui.cc:59 plugin_selector.cc:95
-#: route_time_axis.cc:866
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
msgid "Hide"
msgstr "Verbergen"
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "Anheften"
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "Ãndern"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "Voriger Tab"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "Nächster Tab"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "Editor & Mixer umschalten"
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Editor maximieren"
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr "Mixerfenster maximieren"
-#: ardour_ui_ed.cc:215
-msgid "Show Toolbars"
-msgstr "Zeige Werkzeugleisten"
-
-#: ardour_ui_ed.cc:218
+#: ardour_ui_ed.cc:298
msgid "Toggle Mixer List"
msgstr "Mixerliste umschalten"
-#: ardour_ui_ed.cc:221
+#: ardour_ui_ed.cc:301
msgid "Toggle Monitor Section Visibility"
msgstr "Sichtbarkeit der Monitorsektion umschalten"
-#: ardour_ui_ed.cc:225
+#: ardour_ui_ed.cc:305
msgid "Show more UI preferences"
msgstr "Mehr UI-Einstellungen anzeigen"
-#: ardour_ui_ed.cc:227 mixer_ui.cc:2107 mixer_ui.cc:2113
-msgid "Window|Mixer"
-msgstr "Mixer"
-
-#: ardour_ui_ed.cc:228
-msgid "Toggle Editor+Mixer"
-msgstr "Editor+Mixer umschalten"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "Skripte"
-#: ardour_ui_ed.cc:229 meterbridge.cc:216 meterbridge.cc:222
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr "Meterbridge"
-#: ardour_ui_ed.cc:231
-msgid "Reattach All Tearoffs"
-msgstr "Alle AbreiÃmenüs wieder anheften"
-
-#: ardour_ui_ed.cc:233 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "Midisignale verfolgen"
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "Chat"
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "Handbuch"
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:317
msgid "Manual|Reference"
msgstr "Handbuch|Referenz"
-#: ardour_ui_ed.cc:239
+#: ardour_ui_ed.cc:318
msgid "Report a Bug"
msgstr "Einen Fehler melden"
-#: ardour_ui_ed.cc:240
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr "Cheat Sheet"
-#: ardour_ui_ed.cc:241
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr "Ardour Website"
-#: ardour_ui_ed.cc:242
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr "Ardour Entwicklung"
-#: ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr "Userforen"
-#: ardour_ui_ed.cc:244
+#: ardour_ui_ed.cc:323
msgid "How to Report a Bug"
msgstr "Wie man einen Fehler meldet"
-#: ardour_ui_ed.cc:246 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:420
msgid "Save"
msgstr "Speichern"
-#: ardour_ui_ed.cc:254 rc_option_editor.cc:1835 rc_option_editor.cc:1846
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1868 rc_option_editor.cc:1877
-#: rc_option_editor.cc:1890 rc_option_editor.cc:1903 rc_option_editor.cc:1912
-#: rc_option_editor.cc:1922 rc_option_editor.cc:1939 rc_option_editor.cc:1941
-#: rc_option_editor.cc:1950 rc_option_editor.cc:1966 rc_option_editor.cc:1987
-#: rc_option_editor.cc:2005 rc_option_editor.cc:2007 rc_option_editor.cc:2024
-#: rc_option_editor.cc:2027 rc_option_editor.cc:2029 rc_option_editor.cc:2046
-#: rc_option_editor.cc:2057
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Transport"
-#: ardour_ui_ed.cc:260 engine_dialog.cc:88
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Stopp"
-#: ardour_ui_ed.cc:263
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "Wiedergabe"
-#: ardour_ui_ed.cc:267 ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Start/Stopp"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "Start/Stopp"
-#: ardour_ui_ed.cc:276
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "Stopp + Aufnahme verwerfen"
-#: ardour_ui_ed.cc:286
+#: ardour_ui_ed.cc:365
msgid "Transition to Roll"
msgstr "Ãbergang zu Wiedergabe"
-#: ardour_ui_ed.cc:290
+#: ardour_ui_ed.cc:369
msgid "Transition to Reverse"
msgstr "Ãbergang zu rückwärtiger Wiedergabe"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Schleife wiedergeben"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr "Auswahl abspielen"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben"
-#: ardour_ui_ed.cc:304
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Aufnahme aktivieren"
-#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:311
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "Aufnahme starten"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "Rückwärts (beschleunigen)"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "Rückwärts (langsam)"
-#: ardour_ui_ed.cc:321
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "Rückwärts (schnell)"
-#: ardour_ui_ed.cc:324
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "Vorwärts (beschleunigen)"
-#: ardour_ui_ed.cc:327
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "Vorwärts (langsam)"
-#: ardour_ui_ed.cc:330
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "Vorwärts (schnell)"
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "Zum Nullpunkt springen"
-#: ardour_ui_ed.cc:336 ardour_ui_ed.cc:339
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Zum Anfang springen"
-#: ardour_ui_ed.cc:342
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "Zum Ende springen"
-#: ardour_ui_ed.cc:345
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr "Zur lokalen Uhrzeit springen"
-#: ardour_ui_ed.cc:350 ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr "Nummernblock Dezimalpunkt"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr "Nummernblock 0"
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr "Nummernblock 1"
-#: ardour_ui_ed.cc:362
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr "Nummernblock 2"
-#: ardour_ui_ed.cc:365
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr "Nummernblock 3"
-#: ardour_ui_ed.cc:368
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr "Nummernblock 4"
-#: ardour_ui_ed.cc:371
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr "Nummernblock 5"
-#: ardour_ui_ed.cc:374
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr "Nummernblock 6"
-#: ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr "Nummernblock 7"
-#: ardour_ui_ed.cc:380
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr "Nummernblock 8"
-#: ardour_ui_ed.cc:383
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr "Nummernblock 9"
-#: ardour_ui_ed.cc:387
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "Fokus auf Zeitanzeige setzen"
-#: ardour_ui_ed.cc:391 ardour_ui_ed.cc:400 audio_clock.cc:2116 editor.cc:261
-#: editor_actions.cc:585 editor_actions.cc:594 export_timespan_selector.cc:85
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2379,137 +2602,137 @@ msgstr "Fokus auf Zeitanzeige setzen"
msgid "Timecode"
msgstr "Timecode"
-#: ardour_ui_ed.cc:393 ardour_ui_ed.cc:402 editor_actions.cc:583
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Takte & Schläge"
-#: ardour_ui_ed.cc:395 ardour_ui_ed.cc:404
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minuten & Sekunden"
-#: ardour_ui_ed.cc:397 ardour_ui_ed.cc:406 audio_clock.cc:2120 editor.cc:262
-#: editor_actions.cc:584
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Samples"
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "Punch In"
-#: ardour_ui_ed.cc:410 mixer_strip.cc:1901 mixer_strip.cc:2089 route_ui.cc:175
-#: time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:191
+#: time_info_box.cc:110
msgid "In"
msgstr "In"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "Punch Out"
-#: ardour_ui_ed.cc:414 mixer_strip.cc:1913 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
msgid "Out"
msgstr "Out"
-#: ardour_ui_ed.cc:417
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "Punch In/Out"
-#: ardour_ui_ed.cc:418
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "In/Out"
-#: ardour_ui_ed.cc:421 rc_option_editor.cc:1801
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Klick"
-#: ardour_ui_ed.cc:424
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "Auto Input"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Auto Play"
-#: ardour_ui_ed.cc:438
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "Start mit Video synchronisieren"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "Time Master"
-#: ardour_ui_ed.cc:442
+#: ardour_ui_ed.cc:521
msgid "Use External Positional Sync Source"
msgstr "Benutze Externe Synchronisationsquelle"
-#: ardour_ui_ed.cc:447
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr "Aufnahmebereitschaft auf Spur %1 umschalten"
-#: ardour_ui_ed.cc:454
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Prozent"
-#: ardour_ui_ed.cc:455 shuttle_control.cc:188
+#: ardour_ui_ed.cc:534 shuttle_control.cc:206
msgid "Semitones"
msgstr "Halbtöne"
-#: ardour_ui_ed.cc:459
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "MTC senden"
-#: ardour_ui_ed.cc:461
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "MMC senden"
-#: ardour_ui_ed.cc:463
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Benutze MMC"
-#: ardour_ui_ed.cc:465 rc_option_editor.cc:2594
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "MIDI Clock senden"
-#: ardour_ui_ed.cc:467
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr "MIDI Feedback senden"
-#: ardour_ui_ed.cc:473
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Panic"
-#: ardour_ui_ed.cc:567
+#: ardour_ui_ed.cc:618
msgid "Wall Clock"
msgstr "Uhrzeit"
-#: ardour_ui_ed.cc:569
+#: ardour_ui_ed.cc:620
msgid "Disk Space"
msgstr "Speicherplatz"
-#: ardour_ui_ed.cc:570
+#: ardour_ui_ed.cc:621
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:571
+#: ardour_ui_ed.cc:622
msgid "X-run"
msgstr "X-run"
-#: ardour_ui_ed.cc:572
+#: ardour_ui_ed.cc:623
msgid "Active Peak-file Work"
msgstr "Peakdatei-Erstellung aktiv"
-#: ardour_ui_ed.cc:573
+#: ardour_ui_ed.cc:624
msgid "Buffers"
msgstr "Puffer"
-#: ardour_ui_ed.cc:575
+#: ardour_ui_ed.cc:626
msgid "Timecode Format"
msgstr "Timecode-Format"
-#: ardour_ui_ed.cc:576
+#: ardour_ui_ed.cc:627
msgid "File Format"
msgstr "Dateiformat"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2517,131 +2740,135 @@ msgstr ""
"Es ist nicht möglich, JACK als Synchronisationsquelle zu verwenden,\n"
"wenn die Pull-up/down Einstellung nicht 0 ist."
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "Intern"
-#: ardour_ui_options.cc:509
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "Aktiviere/Deaktiviere externe Positionssynchronisierung"
-#: ardour_ui_options.cc:511
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr "Synchronisation ist nicht möglich: Video pull-up/down ist aktiviert"
-#: audio_clock.cc:1051 audio_clock.cc:1070
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "--wartend--"
-#: audio_clock.cc:1122
+#: audio_clock.cc:1128
msgid "SR"
msgstr "SR"
-#: audio_clock.cc:1128 audio_clock.cc:1132
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "Ziehen"
-#: audio_clock.cc:1130
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1286 editor.cc:263 editor_actions.cc:140
-#: editor_actions.cc:577
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Tempo"
-#: audio_clock.cc:1290 editor.cc:264 editor_actions.cc:578
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Taktart"
-#: audio_clock.cc:1871 audio_streamview.cc:116 editor_actions.cc:1108
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:469
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "Programmierfehler: %1"
-#: audio_clock.cc:2004 audio_clock.cc:2032
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "Programmierfehler: %1 %2"
-#: audio_clock.cc:2118 editor.cc:260 export_timespan_selector.cc:95
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
msgid "Bars:Beats"
msgstr "Takte:Schläge"
-#: audio_clock.cc:2119 export_timespan_selector.cc:90
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
msgid "Minutes:Seconds"
msgstr "Minuten:Sekunden"
-#: audio_clock.cc:2124
+#: audio_clock.cc:2129
msgid "Set from Playhead"
msgstr "Vom Wiedergabezeiger übernehmen"
-#: audio_clock.cc:2125
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr "Positionszeiger hierhin setzen"
-#: audio_clock.cc:2128
+#: audio_clock.cc:2133
msgid "Copy to clipboard"
msgstr "In die Zwischenablage kopieren"
-#: audio_region_editor.cc:65 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr "dB"
-#: audio_region_editor.cc:68
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "Regionen-Lautstärke:"
-#: audio_region_editor.cc:78 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
msgid "dBFS"
msgstr "dBFS"
-#: audio_region_editor.cc:81
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "Spitzenamplitude"
-#: audio_region_editor.cc:92
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "Berechne..."
-#: audio_region_view.cc:1371
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "Lautstärkekurve bearbeiten"
-#: automation_controller.cc:290 automation_controller.cc:306
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr "Note selektieren..."
-#: automation_controller.cc:297
+#: automation_controller.cc:311
msgid "Halve"
msgstr "Halbiere"
-#: automation_controller.cc:300
+#: automation_controller.cc:314
msgid "Double"
msgstr "Verdopple"
-#: automation_controller.cc:311
+#: automation_controller.cc:325
msgid "Set to %1 beat"
msgid_plural "Set to %1 beats"
msgstr[0] "Setze auf %1 Schlag"
msgstr[1] "Setze auf %1 Schläge"
-#: automation_line.cc:285 editor_drag.cc:4255
+#: automation_line.cc:292 editor_drag.cc:4387
msgid "automation event move"
msgstr "Automationspunkt bewegen"
-#: automation_line.cc:881 region_gain_line.cc:75
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "Automationspunkt entfernen"
-#: automation_line.cc:1006
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "Unzulässige Automationspunkte werden ignoriert: \"%1\""
-#: automation_region_view.cc:193 automation_time_axis.cc:647
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "Automationspunkt einfügen"
@@ -2659,59 +2886,59 @@ msgstr "Automationsmodus"
msgid "hide track"
msgstr "Diese Spur verbergen"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:526
-#: generic_pluginui.cc:820 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:601
+#: generic_pluginui.cc:948 panner_ui.cc:151
msgid "Automation|Manual"
msgstr "Manuell"
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1928 editor.cc:2006
-#: editor_actions.cc:123 editor_actions.cc:1939 gain_meter.cc:225
-#: generic_pluginui.cc:102 generic_pluginui.cc:529 generic_pluginui.cc:822
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1617 midi_time_axis.cc:1620
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2034 editor.cc:2112
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:101 generic_pluginui.cc:604 generic_pluginui.cc:950
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Wiedergabe"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:104
-#: generic_pluginui.cc:532 generic_pluginui.cc:824 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:103
+#: generic_pluginui.cc:607 generic_pluginui.cc:952 panner_ui.cc:157
msgid "Write"
msgstr "Schreiben"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:106
-#: generic_pluginui.cc:535 generic_pluginui.cc:826 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:105
+#: generic_pluginui.cc:610 generic_pluginui.cc:954 panner_ui.cc:160
msgid "Touch"
msgstr "Ãndern"
-#: automation_time_axis.cc:404 generic_pluginui.cc:538 meter_patterns.cc:118
+#: automation_time_axis.cc:406 generic_pluginui.cc:613 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "Automation zurücksetzen"
-#: automation_time_axis.cc:545 rc_option_editor.cc:2770
-#: rc_option_editor.cc:2775 rc_option_editor.cc:2821 rc_option_editor.cc:2826
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
msgid "Clear"
msgstr "Leeren"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Automationssmodus"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr "Diskret"
-#: automation_time_axis.cc:598 export_format_dialog.cc:489
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Linear"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:207
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:225
msgid "Mode"
msgstr "Modus"
@@ -2727,35 +2954,38 @@ msgstr "Bundle editieren"
msgid "Direction:"
msgstr "Richtung:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:949
-#: mixer_strip.cc:168 mixer_strip.cc:382 mixer_strip.cc:2347
-#: rc_option_editor.cc:2944
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
msgid "Input"
msgstr "Eingang"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:951 mixer_strip.cc:172 mixer_strip.cc:386
-#: mixer_strip.cc:2350 monitor_section.cc:288 monitor_section.cc:292
-#: rc_option_editor.cc:2948
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
msgid "Output"
msgstr "Ausgang"
-#: bundle_manager.cc:265 editor.cc:1970 editor_actions.cc:95
-#: editor_actions.cc:105 rc_option_editor.cc:2782 rc_option_editor.cc:2796
+#: bundle_manager.cc:265 editor.cc:2076 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
msgid "Edit"
msgstr "Bearbeiten"
-#: bundle_manager.cc:266 editor.cc:5948 editor.cc:5978 editor_actions.cc:346
-#: editor_actions.cc:347 plugin_ui.cc:420 processor_box.cc:2723
+#: bundle_manager.cc:266 editor.cc:5963 editor.cc:5993 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:421
+#: processor_box.cc:3681 processor_box.cc:3683
msgid "Delete"
msgstr "Löschen"
#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
-#: editor_routes.cc:208 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Name"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Neu"
@@ -2771,6 +3001,38 @@ msgstr "Kanal hinzufügen"
msgid "Rename Channel"
msgstr "Kanal umbenennen"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Standards wiederherstellen"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Farbthema"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "Objekt"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "Farbe"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "Objekte"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "Palette"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "Transparenz"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "Farbpalette"
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr "Build Configuration"
@@ -2783,6 +3045,18 @@ msgstr "Automationspunkt"
msgid "Value"
msgstr "Wert"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr "Kontroll-Master"
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr "-vca-"
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr "Alle Zuweisungen aufheben"
+
#: duplicate_routes_dialog.cc:35
msgid "Duplicate Tracks & Busses"
msgstr "Spuren und Busse duplizieren"
@@ -2844,596 +3118,602 @@ msgstr "Tonhöhe"
msgid "Velocity"
msgstr "Velocity"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "Zeitpunkt"
-#: edit_note_dialog.cc:98 editor_regions.cc:118
-#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
-#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:415
+#: export_timespan_selector.cc:506 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
msgid "Length"
msgstr "Länge"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "Note bearbeiten"
-#: editor.cc:150
+#: editor.cc:160
msgid "CD Frames"
msgstr "CD-Frames"
-#: editor.cc:151
+#: editor.cc:161
msgid "TC Frames"
msgstr "TC Frames"
-#: editor.cc:152
+#: editor.cc:162
msgid "TC Seconds"
msgstr "TC Sekunden"
-#: editor.cc:153
+#: editor.cc:163
msgid "TC Minutes"
msgstr "TC Minuten"
-#: editor.cc:154
+#: editor.cc:164
msgid "Seconds"
msgstr "Sekunden"
-#: editor.cc:155
+#: editor.cc:165
msgid "Minutes"
msgstr "Minuten"
-#: editor.cc:156 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "Schläge/128"
-#: editor.cc:157 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "Schläge/64"
-#: editor.cc:158 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Schläge/32"
-#: editor.cc:159
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "Schläge/28"
-#: editor.cc:160
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "Schläge/24"
-#: editor.cc:161
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "Schläge/20"
-#: editor.cc:162 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Schläge/16"
-#: editor.cc:163
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "Schläge/14"
-#: editor.cc:164
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "Schläge/12"
-#: editor.cc:165
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "Schläge/10"
-#: editor.cc:166 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Schläge/8"
-#: editor.cc:167
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "Schläge/7"
-#: editor.cc:168
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "Schläge/6"
-#: editor.cc:169
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "Schläge/5"
-#: editor.cc:170 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Schläge/4"
-#: editor.cc:171 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Schläge/3"
-#: editor.cc:172 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Schläge/2"
-#: editor.cc:173 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Schläge"
-#: editor.cc:174
+#: editor.cc:184
msgid "Bars"
msgstr "Takte"
-#: editor.cc:175
+#: editor.cc:185
msgid "Marks"
msgstr "Marker"
-#: editor.cc:176
+#: editor.cc:186
msgid "Region starts"
msgstr "Regionen-Anfang"
-#: editor.cc:177
+#: editor.cc:187
msgid "Region ends"
msgstr "Regionen-Ende"
-#: editor.cc:178
+#: editor.cc:188
msgid "Region syncs"
msgstr "Regionen-Sync"
-#: editor.cc:179
+#: editor.cc:189
msgid "Region bounds"
msgstr "Regionengrenzen"
-#: editor.cc:184 editor_actions.cc:526
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "Raster aus"
-#: editor.cc:185 editor_actions.cc:527
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Einrasten"
-#: editor.cc:186 editor_actions.cc:528
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnetisch"
-#: editor.cc:191 editor.cc:209 editor_actions.cc:122 editor_actions.cc:509
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Positionszeiger"
-#: editor.cc:192 editor_actions.cc:511
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Marker"
-#: editor.cc:193 editor.cc:210 editor_actions.cc:510
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Maus"
-#: editor.cc:198 editor_actions.cc:518
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Slide"
-#: editor.cc:199
+#: editor.cc:209
msgid "Splice"
msgstr "Splice"
-#: editor.cc:200 editor_actions.cc:517
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr "Ripple"
-#: editor.cc:201 editor_actions.cc:1808 editor_markers.cc:905
-#: editor_rulers.cc:259 location_ui.cc:60
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Lock"
-#: editor.cc:206 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Links"
-#: editor.cc:207 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Rechts"
-#: editor.cc:208
+#: editor.cc:218
msgid "Center"
msgstr "Mitte"
-#: editor.cc:211
+#: editor.cc:221
msgid "Edit point"
msgstr "Arbeitspunkt"
-#: editor.cc:217
+#: editor.cc:227
msgid "Mushy"
msgstr "Matschig"
-#: editor.cc:218
+#: editor.cc:228
msgid "Smooth"
msgstr "Klar"
-#: editor.cc:219
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "Ausgewogene multitimbrale Mischung"
-#: editor.cc:220
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "Ungestimmte Perkussion mit stabilen Tönen"
-#: editor.cc:221
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "Klare monophone Instrumentalmusik"
-#: editor.cc:222
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "Ungestimmte Perkussion (solo)"
-#: editor.cc:223
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "Resampeln, ohne die Tonhöhe zu erhalten"
-#: editor.cc:259
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Min:Sek"
-#: editor.cc:265
+#: editor.cc:325
msgid "Location Markers"
msgstr "Positionsmarker"
-#: editor.cc:266
+#: editor.cc:326
msgid "Range Markers"
msgstr "Bereiche"
-#: editor.cc:267
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Schleifen/Punchbereiche"
-#: editor.cc:268 editor_actions.cc:581
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "CD-Marker"
-#: editor.cc:269
+#: editor.cc:329
msgid "Video Timeline"
msgstr "Video Zeitleiste"
-#: editor.cc:286
+#: editor.cc:386
msgid "mode"
msgstr "Modus"
-#: editor.cc:465 editor_actions.cc:115 editor_actions.cc:580
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "Marker"
-#: editor.cc:583 rc_option_editor.cc:2393
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Regionen"
-#: editor.cc:584
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "Spuren & Busse"
-#: editor.cc:585
+#: editor.cc:655
msgid "Snapshots"
msgstr "Schnappschüsse"
-#: editor.cc:586
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "Spuren & Bus-Gruppen"
-#: editor.cc:587
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "Bereiche & Marker"
-#: editor.cc:734 editor.cc:5800 rc_option_editor.cc:2061
-#: rc_option_editor.cc:2075 rc_option_editor.cc:2079 rc_option_editor.cc:2087
-#: rc_option_editor.cc:2095 rc_option_editor.cc:2104 rc_option_editor.cc:2113
-#: rc_option_editor.cc:2121 rc_option_editor.cc:2129 rc_option_editor.cc:2139
-#: rc_option_editor.cc:2141 rc_option_editor.cc:2165 rc_option_editor.cc:2177
-#: rc_option_editor.cc:2188 rc_option_editor.cc:2206 rc_option_editor.cc:2208
-#: rc_option_editor.cc:2211 rc_option_editor.cc:2220 rc_option_editor.cc:2238
-#: rc_option_editor.cc:2250 rc_option_editor.cc:2252
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1348 editor.cc:4783 editor_actions.cc:135 editor_actions.cc:1884
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Schleife"
-#: editor.cc:1354 editor.cc:4810 editor_actions.cc:136 time_info_box.cc:68
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Punch"
-#: editor.cc:1466 rc_option_editor.cc:2159
+#: editor.cc:1475 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr "Linear (für stark korreliertes Material)"
-#: editor.cc:1476 rc_option_editor.cc:2160
+#: editor.cc:1485 rc_option_editor.cc:2300
msgid "Constant power"
msgstr "Konstante Energie"
-#: editor.cc:1485 rc_option_editor.cc:2161
+#: editor.cc:1494 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "Symmetrisch"
-#: editor.cc:1495 rc_option_editor.cc:2162
+#: editor.cc:1504 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Langsam"
-#: editor.cc:1504 rc_option_editor.cc:2163 sfdb_ui.cc:1767 sfdb_ui.cc:1878
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Schnell"
-#: editor.cc:1526 editor.cc:1551
+#: editor.cc:1535 editor.cc:1560
msgid "Deactivate"
msgstr "Deaktivieren"
-#: editor.cc:1528 editor.cc:1553
+#: editor.cc:1537 editor.cc:1562
msgid "Activate"
msgstr "Aktivieren"
-#: editor.cc:1654 editor.cc:1662 editor_ops.cc:3855
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
msgid "Freeze"
msgstr "Einfrieren"
-#: editor.cc:1658
+#: editor.cc:1667
msgid "Unfreeze"
msgstr "Auftauen"
-#: editor.cc:1797
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr "Loudness-Analyse der Region"
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr "Audio Report/Analyse"
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr "Loudness-Analyse des Bereiches"
+
+#: editor.cc:1902
msgid "Selected Regions"
msgstr "Ausgewählte Regionen"
-#: editor.cc:1841 editor_markers.cc:940
+#: editor.cc:1946 editor_markers.cc:945
msgid "Play Range"
msgstr "Bereich wiedergeben"
-#: editor.cc:1842 editor_markers.cc:943
+#: editor.cc:1947 editor_markers.cc:948
msgid "Loop Range"
msgstr "Bereich in Schleife wiedergeben"
-#: editor.cc:1845 editor_markers.cc:950
+#: editor.cc:1950 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "Auf Bereich zoomen"
-#: editor.cc:1854 editor_actions.cc:383
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr "Loudness-Analyse"
+
+#: editor.cc:1960 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "Anfang des Bereiches zur vorherigen Regiongrenze verschieben"
-#: editor.cc:1861 editor_actions.cc:390
+#: editor.cc:1967 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "Anfang des Bereiches zur nächsten Regiongrenze verschieben"
-#: editor.cc:1868 editor_actions.cc:397
+#: editor.cc:1974 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "Ende des Bereiches zur vorherigen Regiongrenze verschieben"
-#: editor.cc:1875 editor_actions.cc:404
+#: editor.cc:1981 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "Ende des Bereiches zur nächsten Regiongrenze verschieben"
-#: editor.cc:1881 editor_actions.cc:134 editor_actions.cc:333
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "Teilen"
-#: editor.cc:1882
+#: editor.cc:1988
msgid "Convert to Region in Region List"
msgstr "In Region umwanden (in Regionenliste hinzufügen)"
-#: editor.cc:1885 editor_markers.cc:970
+#: editor.cc:1991 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Alles im Bereich auswählen"
-#: editor.cc:1888 editor_actions.cc:305
+#: editor.cc:1994 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr "Schleife aus Auswahl bilden"
-#: editor.cc:1889 editor_actions.cc:306
+#: editor.cc:1995 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr "Punch aus Auswahl bilden"
-#: editor.cc:1890 editor_actions.cc:307
+#: editor.cc:1996 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr "Projektstart/ende auf Auswahl setzen"
-#: editor.cc:1893
+#: editor.cc:1999
msgid "Add Range Markers"
msgstr "Bereichsmarker einfügen"
-#: editor.cc:1896
+#: editor.cc:2002
msgid "Crop Region to Range"
msgstr "Region auf Bereich kürzen"
-#: editor.cc:1897 editor_actions.cc:319
+#: editor.cc:2003 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Bereich duplizieren"
-#: editor.cc:1900
+#: editor.cc:2006
msgid "Consolidate Range"
msgstr "Bereich als neue Region pre-Mixer"
-#: editor.cc:1901
+#: editor.cc:2007
msgid "Consolidate Range with Processing"
msgstr "Bereich zu neuer Region (mit Signalverarbeitung)"
-#: editor.cc:1902
+#: editor.cc:2008
msgid "Bounce Range to Region List"
msgstr "Auswahl zur Regionenliste bouncen"
-#: editor.cc:1903
+#: editor.cc:2009
msgid "Bounce Range to Region List with Processing"
msgstr "Bereich zur Regionenliste bouncen (mit Signalverarbeitung)"
-#: editor.cc:1904 editor_markers.cc:953
+#: editor.cc:2010 editor_markers.cc:956
msgid "Export Range..."
msgstr "Bereich exportieren..."
-#: editor.cc:1906
+#: editor.cc:2012
msgid "Export Video Range..."
msgstr "Videobereich exportieren..."
-#: editor.cc:1922 editor.cc:2004 editor_actions.cc:311
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
msgid "Play from Edit Point"
msgstr "Wiedergabe ab Arbeitspunkt"
-#: editor.cc:1923 editor.cc:2005
+#: editor.cc:2029 editor.cc:2111
msgid "Play from Start"
msgstr "Wiedergabe ab Beginn"
-#: editor.cc:1924
+#: editor.cc:2030
msgid "Play Region"
msgstr "Region wiedergeben"
-#: editor.cc:1926
+#: editor.cc:2032
msgid "Loop Region"
msgstr "Region in Schleife wiedergeben"
-#: editor.cc:1936 editor.cc:2014
+#: editor.cc:2042 editor.cc:2120
msgid "Select All in Track"
msgstr "Alles in der Spur auswählen"
-#: editor.cc:1937 editor.cc:2015 editor_actions.cc:195
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
msgid "Select All Objects"
msgstr "Alle Objekte auswählen"
-#: editor.cc:1938 editor.cc:2016
+#: editor.cc:2044 editor.cc:2122
msgid "Invert Selection in Track"
msgstr "Auswahl in der Spur umkehren"
-#: editor.cc:1939 editor.cc:2017 editor_actions.cc:198
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
msgid "Invert Selection"
msgstr "Auswahl umkehren"
-#: editor.cc:1941 editor_actions.cc:200
+#: editor.cc:2047 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "Bereich als Schleife auswählen"
-#: editor.cc:1942 editor_actions.cc:201
+#: editor.cc:2048 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "Bereich als Punchbereich"
-#: editor.cc:1943 editor_actions.cc:202
+#: editor.cc:2049 editor_actions.cc:203
msgid "Set Range to Selected Regions"
msgstr "Bereich auf ausgewählte Regionen setzen"
-#: editor.cc:1945 editor.cc:2019 editor_actions.cc:204 editor_actions.cc:205
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Alle Regionen nach dem Arbeitspunkt auswählen"
-#: editor.cc:1946 editor.cc:2020 editor_actions.cc:206 editor_actions.cc:207
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Alle Regionen vor dem Arbeitspunkt auswählen"
-#: editor.cc:1947 editor.cc:2021
+#: editor.cc:2053 editor.cc:2127
msgid "Select All After Playhead"
msgstr "Alle Regionen nach dem Positionszeiger auswählen"
-#: editor.cc:1948 editor.cc:2022
+#: editor.cc:2054 editor.cc:2128
msgid "Select All Before Playhead"
msgstr "Alle Regionen vor dem Positionszeiger auswählen"
-#: editor.cc:1949
+#: editor.cc:2055
msgid "Select All Between Playhead and Edit Point"
msgstr "Alle zwischen Positionszeiger und Arbeitspunkt auswählen"
-#: editor.cc:1950
+#: editor.cc:2056
msgid "Select All Within Playhead and Edit Point"
msgstr "Alles zwischen Positionszeiger und Arbeitspunkt auswählen"
-#: editor.cc:1951
+#: editor.cc:2057
msgid "Select Range Between Playhead and Edit Point"
msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus"
-#: editor.cc:1953 editor.cc:2024 editor_actions.cc:132 editor_actions.cc:133
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Auswahl"
-#: editor.cc:1961 editor.cc:2032 editor_actions.cc:345 processor_box.cc:2719
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
msgid "Cut"
msgstr "Ausschneiden"
-#: editor.cc:1962 editor.cc:2033 editor_actions.cc:349 processor_box.cc:2721
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
msgid "Copy"
msgstr "Kopieren"
-#: editor.cc:1963 editor.cc:2034 editor_actions.cc:350 processor_box.cc:2726
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
msgid "Paste"
msgstr "Einfügen"
-#: editor.cc:1967 editor_actions.cc:92
+#: editor.cc:2073 editor_actions.cc:94
msgid "Align"
msgstr "Ausrichten"
-#: editor.cc:1968
+#: editor.cc:2074
msgid "Align Relative"
msgstr "Relativ ausrichten"
-#: editor.cc:1975
+#: editor.cc:2081
msgid "Insert Selected Region"
msgstr "Ausgewählte Region einfügen"
-#: editor.cc:1976
+#: editor.cc:2082
msgid "Insert Existing Media"
msgstr "Vorhandenes Material importieren"
-#: editor.cc:1985 editor.cc:2041
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Entire Track Later"
msgstr "Gesamte Spur schrittweise nach hinten"
-#: editor.cc:1986 editor.cc:2042
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Track After Edit Point Later"
msgstr "Spur nach Arbeitspunkt schrittweise nach hinten"
-#: editor.cc:1987 editor.cc:2043
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Entire Track Earlier"
msgstr "Gesamte Spur schrittweise nach vorne"
-#: editor.cc:1988 editor.cc:2044
+#: editor.cc:2094 editor.cc:2150
msgid "Nudge Track After Edit Point Earlier"
msgstr "Spur nach Arbeitspunkt schrittweise nach vorne"
-#: editor.cc:1990 editor.cc:2046
+#: editor.cc:2096 editor.cc:2152
msgid "Nudge"
msgstr "Verschieben"
-#: editor.cc:2261
+#: editor.cc:2354
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
"Positionzeiger mit negativer Position - ignoriert (benutze stattdessen Null)"
-#: editor.cc:3039 editor.cc:3738 editor.cc:3809 midi_channel_selector.cc:157
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "Alle"
-#: editor.cc:3239
+#: editor.cc:3281
msgid "Smart Mode (add range functions to Grab Mode)"
msgstr "Smart-Modus (zusätzliche Bereichsfunktionen im Greifmodus)"
-#: editor.cc:3240
+#: editor.cc:3282
msgid "Grab Mode (select/move objects)"
msgstr "Greifmodus (Objekte auswählen/bewegen)"
-#: editor.cc:3241
+#: editor.cc:3283
msgid "Cut Mode (split regions)"
msgstr "Schneidemodus (Regionen teilen)"
-#: editor.cc:3242
+#: editor.cc:3284
msgid "Range Mode (select time ranges)"
msgstr "Bereichsmodus (Zeitbereiche auswählen)"
-#: editor.cc:3243
+#: editor.cc:3285
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr "Zeichenmodus (zeichne und editiere Lautstärken/Noten/Automationen)"
-#: editor.cc:3244
+#: editor.cc:3286
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
"Streckmodus (Audio- und MIDI-Regionen zeitstrecken, ohne die Tonhöhe zu "
"ändern)"
-#: editor.cc:3245
+#: editor.cc:3287
msgid "Audition Mode (listen to regions)"
msgstr "Vorhörmodus (Regionen anhören)"
-#: editor.cc:3246
+#: editor.cc:3288
msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
"Interner Bearbeitungsmodus (Noten und Automationspunkte innerhalb der "
"Regionen editieren)"
-#: editor.cc:3247
+#: editor.cc:3289
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3441,63 +3721,63 @@ msgstr ""
"Gruppen: Klicken zum (De)aktivieren\n"
"Rechtsklick für Optionen"
-#: editor.cc:3248
+#: editor.cc:3290
msgid "Nudge Region/Selection Later"
msgstr "Region/Auswahl schrittweise nach hinten"
-#: editor.cc:3249
+#: editor.cc:3291
msgid "Nudge Region/Selection Earlier"
msgstr "Region/Auswahl schrittweise nach vorne"
-#: editor.cc:3250 editor_actions.cc:270
+#: editor.cc:3292 editor_actions.cc:272
msgid "Zoom In"
msgstr "VergröÃern"
-#: editor.cc:3251 editor_actions.cc:269
+#: editor.cc:3293 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Verkleinern"
-#: editor.cc:3252
+#: editor.cc:3294
msgid "Zoom to Time Scale"
msgstr "Zu einer Zeitspanne zoomen"
-#: editor.cc:3253 editor.cc:3760 editor_actions.cc:271
+#: editor.cc:3295 editor.cc:3798 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Auf ganzes Projekt zoomen"
-#: editor.cc:3254 editor_actions.cc:113 editor_actions.cc:146
+#: editor.cc:3296 editor_actions.cc:115 editor_actions.cc:148
msgid "Zoom Focus"
msgstr "Zoom Fokus"
-#: editor.cc:3255
+#: editor.cc:3297
msgid "Expand Tracks"
msgstr "Spuren vergröÃern"
-#: editor.cc:3256
+#: editor.cc:3298
msgid "Shrink Tracks"
msgstr "Spuren verkleinern"
-#: editor.cc:3257
+#: editor.cc:3299
msgid "Number of visible tracks"
msgstr "Anzahl der sichtbaren Spuren"
-#: editor.cc:3258
+#: editor.cc:3300
msgid "Snap/Grid Units"
msgstr "Rastereinheiten"
-#: editor.cc:3259
+#: editor.cc:3301
msgid "Snap/Grid Mode"
msgstr "Einrastmodus"
-#: editor.cc:3260 editor_actions.cc:99
+#: editor.cc:3302 editor_actions.cc:101
msgid "Edit Point"
msgstr "Arbeitspunkt"
-#: editor.cc:3261
+#: editor.cc:3303
msgid "Edit Mode"
msgstr "Bearbeitungsmodus"
-#: editor.cc:3262
+#: editor.cc:3304
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3506,124 +3786,124 @@ msgstr ""
"(bestimmt den Abstand für das schrittweise Verschieben von Regionen und "
"Bereichen)"
-#: editor.cc:3530 editor_actions.cc:321
+#: editor.cc:3572 editor_actions.cc:335
msgid "Command|Undo"
msgstr "Rückgängig"
-#: editor.cc:3532
+#: editor.cc:3574
msgid "Command|Undo (%1)"
msgstr "Rückgängig (%1)"
-#: editor.cc:3539 editor_actions.cc:323 editor_actions.cc:324
-#: editor_actions.cc:325
+#: editor.cc:3581 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Wiederherstellen"
-#: editor.cc:3542
+#: editor.cc:3584
msgid "Redo (%1)"
msgstr "Wiederherstellen (%1)"
-#: editor.cc:3562 editor.cc:3586 editor_actions.cc:111 editor_actions.cc:1865
+#: editor.cc:3604 editor.cc:3628 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Duplizieren"
-#: editor.cc:3563
+#: editor.cc:3605
msgid "Number of duplications:"
msgstr "Anzahl der Duplikate:"
-#: editor.cc:3737 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3775 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "Auswahl"
-#: editor.cc:3740
+#: editor.cc:3778
msgid "Fit 1 track"
msgstr "1 Spur einpassen"
-#: editor.cc:3741
+#: editor.cc:3779
msgid "Fit 2 tracks"
msgstr "2 Spuren einpassen"
-#: editor.cc:3742
+#: editor.cc:3780
msgid "Fit 4 tracks"
msgstr "4 Spuren einpassen"
-#: editor.cc:3743
+#: editor.cc:3781
msgid "Fit 8 tracks"
msgstr "8 Spuren einpassen"
-#: editor.cc:3744
+#: editor.cc:3782
msgid "Fit 16 tracks"
msgstr "16 Spuren einpassen"
-#: editor.cc:3745
+#: editor.cc:3783
msgid "Fit 24 tracks"
msgstr "24 Spuren einpassen"
-#: editor.cc:3746
+#: editor.cc:3784
msgid "Fit 32 tracks"
msgstr "32 Spuren einpassen"
-#: editor.cc:3747
+#: editor.cc:3785
msgid "Fit 48 tracks"
msgstr "48 Spuren einpassen"
-#: editor.cc:3748
+#: editor.cc:3786
msgid "Fit All tracks"
msgstr "Alle Spuren einpassen"
-#: editor.cc:3749
+#: editor.cc:3787
msgid "Fit Selection"
msgstr "Passe Auswahl ein"
-#: editor.cc:3751
+#: editor.cc:3789 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr "Zoome auf 10 ms"
-#: editor.cc:3752
+#: editor.cc:3790 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr "Zoome auf 100 ms"
-#: editor.cc:3753
+#: editor.cc:3791 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr "Zoome auf 1 Sek."
-#: editor.cc:3754
+#: editor.cc:3792 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr "Zoome auf 10 Sek."
-#: editor.cc:3755
+#: editor.cc:3793 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr "Zoome auf 1 Min."
-#: editor.cc:3756
+#: editor.cc:3794 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr "Zoome auf 10 Min."
-#: editor.cc:3757
+#: editor.cc:3795
msgid "Zoom to 1 hour"
msgstr "Zoome auf 1 Stunde"
-#: editor.cc:3758
+#: editor.cc:3796
msgid "Zoom to 8 hours"
msgstr "Zoome auf 8 Stunden"
-#: editor.cc:3759
+#: editor.cc:3797
msgid "Zoom to 24 hours"
msgstr "Zoome auf 24 Stunden"
-#: editor.cc:3761
+#: editor.cc:3799
msgid "Zoom to Range/Region Selection"
msgstr "Zoome auf Bereichs-/Regionenauswahl"
-#: editor.cc:3831
+#: editor.cc:3869
msgid "*"
msgstr "*"
-#: editor.cc:4151
+#: editor.cc:4136
msgid "Playlist Deletion"
msgstr "Löschen von Wiedergabelisten"
-#: editor.cc:4152
+#: editor.cc:4137
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3635,1330 +3915,1373 @@ msgstr ""
"Falls sie gelöscht wird, werden die ausschlieÃlich von ihr verwendeten "
"Audiodateien gelöscht."
-#: editor.cc:4162
+#: editor.cc:4147
msgid "Delete All Unused"
msgstr "Alle unbenutzten löschen"
-#: editor.cc:4163
+#: editor.cc:4148
msgid "Delete Playlist"
msgstr "Wiedergabeliste löschen"
-#: editor.cc:4164
+#: editor.cc:4149
msgid "Keep Playlist"
msgstr "Wiedergabeliste behalten"
-#: editor.cc:4165
+#: editor.cc:4150
msgid "Keep Remaining"
msgstr "Ãbrige behalten"
-#: editor.cc:4166 editor_audio_import.cc:597 editor_ops.cc:6456
-#: engine_dialog.cc:2909 sfdb_freesound_mootcher.cc:69 processor_box.cc:2487
-#: processor_box.cc:2512
+#: editor.cc:4151 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
msgid "Cancel"
msgstr "Abbrechen"
-#: editor.cc:4318
+#: editor.cc:4293
msgid "new playlists"
msgstr "Neue Wiedergabelisten"
-#: editor.cc:4334
+#: editor.cc:4309
msgid "copy playlists"
msgstr "Wiedergabelisten kopieren"
-#: editor.cc:4349
+#: editor.cc:4324
msgid "clear playlists"
msgstr "Wiedergabelisten zurücksetzen"
-#: editor.cc:5095
+#: editor.cc:5049
msgid "Please wait while %1 loads visual data."
msgstr "Bitte warten Sie, während %1 die Daten zur Anzeige des Projekts lädt."
-#: editor.cc:5947 editor.cc:5982 editor_markers.cc:985 panner_ui.cc:412
-#: processor_box.cc:2746
+#: editor.cc:5812 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr "Die Zuordnung von #%1 aufheben"
+
+#: editor.cc:5813 editor_actions.cc:481
+msgid "no action bound"
+msgstr "keine Aktion zugeordnet"
+
+#: editor.cc:5962 editor.cc:5997 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
msgid "Edit..."
msgstr "Bearbeiten..."
-#: editor.cc:5988 editor_actions.cc:1844
+#: editor.cc:6003 editor_actions.cc:1842
msgid "Transpose..."
msgstr "Transponieren..."
-#: editor.cc:5992 editor_actions.cc:1960
+#: editor.cc:6007 editor_actions.cc:1959
msgid "Legatize"
msgstr "überbinden (Legato)"
-#: editor.cc:5998 editor_actions.cc:1959
+#: editor.cc:6013 editor_actions.cc:1958
msgid "Quantize..."
msgstr "Quantisieren.."
-#: editor.cc:6001 editor_actions.cc:1962
+#: editor.cc:6016 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr "Ãberlappung entfernen (Legato)"
-#: editor.cc:6007 editor_actions.cc:1961
+#: editor.cc:6022 editor_actions.cc:1960
msgid "Transform..."
msgstr "Transformiere..."
-#: editor_actions.cc:93
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Automatisch verbinden"
-#: editor_actions.cc:94
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "Crossfades"
-#: editor_actions.cc:96
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "Ausgewählten Positionsmarker verschieben"
-#: editor_actions.cc:97
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "Bereichs"
-#: editor_actions.cc:98
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "Region auswählen"
-#: editor_actions.cc:100
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Fade"
-#: editor_actions.cc:101
+#: editor_actions.cc:103
msgid "Latch"
msgstr "Latch"
-#: editor_actions.cc:102 editor_regions.cc:115 region_editor.cc:48
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "Region"
-#: editor_actions.cc:103
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Layering"
-#: editor_actions.cc:104 editor_regions.cc:116 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Position"
-#: editor_actions.cc:106 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:178
-#: panner_ui.cc:637 route_time_axis.cc:529
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Anpassen"
-#: editor_actions.cc:107 editor_actions.cc:127 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "Lautstärke"
-#: editor_actions.cc:108 editor_actions.cc:579
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Bereiche"
-#: editor_actions.cc:109 editor_actions.cc:1861 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "Fades"
-#: editor_actions.cc:112
+#: editor_actions.cc:114
msgid "Link"
msgstr "Verknüpfen"
-#: editor_actions.cc:114
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "Positionszeiger zu Marker setzen"
-#: editor_actions.cc:116
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Abfall der Pegelanzeigen"
-#: editor_actions.cc:117
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Pegelanzeige halten"
-#: editor_actions.cc:118 session_option_editor.cc:342
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "MIDI Optionen"
-#: editor_actions.cc:119
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Sonstiges"
-#: editor_actions.cc:120 rc_option_editor.cc:2261 route_group_dialog.cc:54
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Monitoring"
-#: editor_actions.cc:121
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "Aktiver Marker"
-#: editor_actions.cc:124
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Erste Zeitanzeige"
-#: editor_actions.cc:125
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "Pull-Up / Pull-Down"
-#: editor_actions.cc:126
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Region(en)"
-#: editor_actions.cc:128 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Markierungsleisten"
-#: editor_actions.cc:129
+#: editor_actions.cc:131
msgid "Views"
msgstr "Ansichten"
-#: editor_actions.cc:130
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "Scrollen"
-#: editor_actions.cc:131
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Zweite Zeitanzeige"
-#: editor_actions.cc:138
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "Subframes"
-#: editor_actions.cc:141
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "Timecode FPS"
-#: editor_actions.cc:142 route_time_axis.cc:587
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Höhe"
-#: editor_actions.cc:144
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Werkzeuge"
-#: editor_actions.cc:145
+#: editor_actions.cc:147
msgid "View"
msgstr "Ansicht"
-#: editor_actions.cc:147
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "Zoom"
-#: editor_actions.cc:153
-msgid "Break drag or deselect all"
-msgstr "Ziehen abbrechen oder alles deselektieren"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "geskriptete Aktionen"
-#: editor_actions.cc:158
+#: editor_actions.cc:159
msgid "Session|Lock"
msgstr "Sperren"
-#: editor_actions.cc:160
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Mixer-Panel zeigen"
-#: editor_actions.cc:161
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "Seitenleiste anzeigen"
-#: editor_actions.cc:163
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Positionszeiger zur nächsten Regiongrenze"
-#: editor_actions.cc:164
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr "Positionszeiger zur nächsten Regiongrenze (ohne Spurauswahl)"
-#: editor_actions.cc:165
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Positionszeiger zur vorherigen Regiongrenze"
-#: editor_actions.cc:166
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr "Positionszeiger zur vorherigen Regiongrenze (ohne Spurauswahl)"
-#: editor_actions.cc:168
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Positionszeiger zum Anfang der nächsten Region"
-#: editor_actions.cc:169
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Positionszeiger zum Ende der nächsten Region"
-#: editor_actions.cc:170
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Positionszeiger zum Einrastpunkt der nächsten Region"
-#: editor_actions.cc:172
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Positionszeiger zum Anfang der vorherigen Region"
-#: editor_actions.cc:173
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Positionszeiger zum Ende der vorherigen Region"
-#: editor_actions.cc:174
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Positionszeiger zum Einrastpunkt der vorherigen Region"
-#: editor_actions.cc:176
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "Zur nächsten Regiongrenze"
-#: editor_actions.cc:177
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "Zur nächsten Regiongrenze (ohne Spurauswahl)"
-#: editor_actions.cc:178
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "Zur vorherigen Regiongrenze"
-#: editor_actions.cc:179
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "Zur vorherigen Regiongrenze (ohne Spurauswahl)"
-#: editor_actions.cc:181
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "Zum nächsten Regionen-Anfang"
-#: editor_actions.cc:182
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "Zum nächsten Regionen-Ende"
-#: editor_actions.cc:183
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "Zum nächsten Regionen-Synchronisationspunkt"
-#: editor_actions.cc:185
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "Zum vorherigen Anfang einer Region"
-#: editor_actions.cc:186
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "Zum vorherigen Ende einer Region"
-#: editor_actions.cc:187
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "Zum vorherigen Synchronisationspunkt einer Region"
-#: editor_actions.cc:189
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "Zum Anfang des Auswahlbereichs"
-#: editor_actions.cc:190
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "Zum Ende des Auswahlbereichs"
-#: editor_actions.cc:192
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Positionszeiger zum Anfang des Auswahlbereichs"
-#: editor_actions.cc:193
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Positionszeiger zum Ende des Auswahlbereichs"
-#: editor_actions.cc:196
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr "Alle Spuren auswählen"
-#: editor_actions.cc:197 export_timespan_selector.cc:59 processor_box.cc:2732
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
msgid "Deselect All"
msgstr "Nichts auswählen"
-#: editor_actions.cc:209
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "Alle Regionen des Bearbeitungsbereichs auswählen "
-#: editor_actions.cc:210
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "Alles inerhalb des Bearbeitungsbereichs auswählen"
-#: editor_actions.cc:212
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "Editierbereich auswählen"
-#: editor_actions.cc:214
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Alle Regionen im Punchbereich auswählen"
-#: editor_actions.cc:215
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Alle Regionen innerhalb der Schleife auswählen"
-#: editor_actions.cc:217
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "Nächste Spur/Bus auswählen"
-#: editor_actions.cc:218
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "Vorherige Spur/Bus auswählen"
-#: editor_actions.cc:220
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "Aufnahmebereitschaft umschalten"
-#: editor_actions.cc:222
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr "Solo umschalten"
-#: editor_actions.cc:224
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "Mute umschalten"
-#: editor_actions.cc:226
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "Isoliertes Solo umschalten"
-#: editor_actions.cc:231
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "Ansicht %1 speichern"
-#: editor_actions.cc:237
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "Ansicht %1 aufrufen"
-#: editor_actions.cc:243
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "Positionszeiger zu Marker %1 setzen"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "Zu nächstem Marker springen"
-#: editor_actions.cc:249 editor_actions.cc:250
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "Zur vorherigen Marker springen"
-#: editor_actions.cc:252
+#: editor_actions.cc:254
msgid "Set Session Start from Playhead"
msgstr "Projektbeginn auf Positionszeiger setzen"
-#: editor_actions.cc:253
+#: editor_actions.cc:255
msgid "Set Session End from Playhead"
msgstr "Projektende auf Positionszeiger setzen"
-#: editor_actions.cc:255 editor_actions.cc:256
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "Marker am Positionszeiger setzen"
-#: editor_actions.cc:258 editor_actions.cc:259
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr "Marker beim Positionszeiger entfernen"
-#: editor_actions.cc:261
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr "Nächste Region schrittweise nach hinten"
-#: editor_actions.cc:262
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr "Nächste Region schrittweise nach vorne"
-#: editor_actions.cc:264
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "Positionszeiger vorwärts"
-#: editor_actions.cc:265
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "Positionszeiger rückwärts"
-#: editor_actions.cc:266
+#: editor_actions.cc:268
msgid "Playhead to Next Grid"
msgstr "Positionszeiger zum nächsten Rasterpunkt"
-#: editor_actions.cc:267
+#: editor_actions.cc:269
msgid "Playhead to Previous Grid"
msgstr "Positionszeiger zum vorherigen Rasterpunkt"
-#: editor_actions.cc:272
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr "Zoome zu Auswahl"
-#: editor_actions.cc:273
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "Zoomstatus umschalten"
-#: editor_actions.cc:275
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "Spurhöhe vergröÃern"
-#: editor_actions.cc:276
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "Spurhöhe verkleinern"
-#: editor_actions.cc:278
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "Passe 1 Spur ein"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "Passe 2 Spuren ein"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "Passe 4 Spuren ein"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "Passe 8 Spuren ein"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "Passe 16 Spuren ein"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "Passe 32 Spuren ein"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "Passe alle Spuren ein"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr "Zoome auf 5 Minuten"
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "Ausgewählte Spuren nach oben verschieben"
-#: editor_actions.cc:280
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "Ausgewählte Spuren nach unten verschieben"
-#: editor_actions.cc:283
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "Spuren nach oben scrollen"
-#: editor_actions.cc:285
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "Spuren nach unten scrollen"
-#: editor_actions.cc:287
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "Spuren langsam nach oben scrollen"
-#: editor_actions.cc:289
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "Spuren langsam nach unten scrollen"
-#: editor_actions.cc:292
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "Nach rechts scrollen"
-#: editor_actions.cc:293
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "Nach links scrollen"
-#: editor_actions.cc:294
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Positionszeiger zentrieren"
-#: editor_actions.cc:295
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Arbeitspunkt zentrieren"
-#: editor_actions.cc:297
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Positionszeiger vorwärts"
-#: editor_actions.cc:298
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Positionszeiger rückwärts"
-#: editor_actions.cc:300
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "Positionszeiger zur aktiven Markierung"
-#: editor_actions.cc:301
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "Aktiven Marker zum Positionszeiger verschieben"
-#: editor_actions.cc:303
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr "Benutze Sprungbereiche"
-#: editor_actions.cc:310
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "Ausgewählte Regionen wiedergeben"
-#: editor_actions.cc:312
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "Wiedergabe ab Arbeitspunkt & Zurück"
-#: editor_actions.cc:314
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "Editierbereich wiedergeben"
-#: editor_actions.cc:316
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Positionszeiger zur Mausposition"
-#: editor_actions.cc:317
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Aktiven Marker zur Mausposition"
-#: editor_actions.cc:327
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr "Auswahländerung rückgängig machen"
-#: editor_actions.cc:328
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr "Auswahländerung wiederherstellen"
-#: editor_actions.cc:330
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "Audio exportieren"
-#: editor_actions.cc:331 export_dialog.cc:394
+#: editor_actions.cc:345 export_dialog.cc:476
msgid "Export Range"
msgstr "Bereich exportieren"
-#: editor_actions.cc:336
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "an Punch-Bereichsgrenzen teilen"
-#: editor_actions.cc:339
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "an Schleifengrenzen teilen"
-#: editor_actions.cc:342 editor_actions.cc:364
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "Auf Bereich zuschneiden"
-#: editor_actions.cc:352
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr "Bereichsauswahl faden"
-#: editor_actions.cc:354
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr "Editierbereich = Taktlänge setzen"
-#: editor_actions.cc:356
+#: editor_actions.cc:371
msgid "Log"
msgstr "Log"
-#: editor_actions.cc:359 editor_actions.cc:361
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr "Zum nächsten Transienten bewegen"
-#: editor_actions.cc:360 editor_actions.cc:362
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr "Zum vorigen Transienten bewegen"
-#: editor_actions.cc:366 editor_actions.cc:375
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "Bereich bei Wiedergabezeiger beginnen lassen"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "Bereich bei Wiedergabezeiger enden lassen"
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Bereich beginnen"
-#: editor_actions.cc:367 editor_actions.cc:376
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "Bereich beenden"
-#: editor_actions.cc:369
+#: editor_actions.cc:387
msgid "Start Punch Range"
msgstr "Beginne Punchbereich"
-#: editor_actions.cc:370
+#: editor_actions.cc:388
msgid "Finish Punch Range"
msgstr "Beende Punchbereich"
-#: editor_actions.cc:372
+#: editor_actions.cc:390
msgid "Start Loop Range"
msgstr "Beginne Schleifenbereich"
-#: editor_actions.cc:373
+#: editor_actions.cc:391
msgid "Finish Loop Range"
msgstr "Beende Schleifenbereich"
-#: editor_actions.cc:408
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Positionszeiger folgen"
-#: editor_actions.cc:409
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Letzte Aufnahme entfernen"
-#: editor_actions.cc:411
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "stehender Positionszeiger"
-#: editor_actions.cc:413 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Stille Einfügen"
-#: editor_actions.cc:415 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
msgid "Remove Time"
msgstr "Zeit entfernen"
-#: editor_actions.cc:420
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "Spur De/Aktivieren"
-#: editor_actions.cc:422 editor_actions.cc:1787 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:134 mixer_strip.cc:1621
-#: route_time_axis.cc:872
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Löschen"
-#: editor_actions.cc:427
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr "Auswahl einpassen (vertikal)"
-#: editor_actions.cc:429 time_axis_view.cc:1380
+#: editor_actions.cc:447 time_axis_view.cc:1291
msgid "Largest"
msgstr "Am gröÃten"
-#: editor_actions.cc:432 time_axis_view.cc:1381
+#: editor_actions.cc:450 time_axis_view.cc:1292
msgid "Larger"
msgstr "GröÃer"
-#: editor_actions.cc:435 editor_rulers.cc:248 time_axis_view.cc:1382
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1293
msgid "Large"
msgstr "GroÃ"
-#: editor_actions.cc:441 editor_rulers.cc:252 time_axis_view.cc:1384
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1295
msgid "Small"
msgstr "Klein"
-#: editor_actions.cc:445
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr "ausgewählte Noten abspielen"
-#: editor_actions.cc:450
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Am linken Rand ausrichten"
-#: editor_actions.cc:451
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Am rechten Rand ausrichten"
-#: editor_actions.cc:452
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Zentriert ausrichten"
-#: editor_actions.cc:453
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Am Positionszeiger ausrichten"
-#: editor_actions.cc:454
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Zoom Fokus zur Maus"
-#: editor_actions.cc:455
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Zoom Fokus zu Arbeitspunkt"
-#: editor_actions.cc:457
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr "Zoom FokusNächster "
-#: editor_actions.cc:463
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "Smarter Objektmodus"
-#: editor_actions.cc:466
+#: editor_actions.cc:491
msgid "Smart"
msgstr "Smart"
-#: editor_actions.cc:469
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Objektwerkzeug"
-#: editor_actions.cc:474
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Bereich-Werkzeug (Range)"
-#: editor_actions.cc:479
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "Noten-Malwerkzeug"
-#: editor_actions.cc:484
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "Vorhör-Werkzeug"
-#: editor_actions.cc:489
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "TimeFX-Werkzeug"
-#: editor_actions.cc:494
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr "Inhaltswerkzeug"
-#: editor_actions.cc:500
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr "Schneidewerkzeug"
-#: editor_actions.cc:506
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr "Schritt-Mausmodus"
-#: editor_actions.cc:513
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "Arbeitspunkt ändern"
-#: editor_actions.cc:514
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "Arbeitspunkt ändern (auch auf Marker wechseln)"
-#: editor_actions.cc:519
+#: editor_actions.cc:544
msgid "EditMode|Lock"
msgstr "Sperren"
-#: editor_actions.cc:520
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr "Bearbeitungsmodus weiterschalten"
-#: editor_actions.cc:522
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "Einrasten"
-#: editor_actions.cc:523
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Einrastmodus"
-#: editor_actions.cc:530
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "Nächster Einrastmodus"
-#: editor_actions.cc:531
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "Nächste Einrastmöglichkeit"
-#: editor_actions.cc:532
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr "Nächster Einrastmöglichkeit (musikalisch)"
-#: editor_actions.cc:533
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr "Vorige Einrastmöglichkeit"
-#: editor_actions.cc:534
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr " Vorige Einrastmöglichkeit (musikalisch)"
-#: editor_actions.cc:539
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr "An CD-Frames einrasten"
-#: editor_actions.cc:540
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr "An Timecode-Frames einrasten"
-#: editor_actions.cc:541
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr "An Timecode-Sekunden einrasten"
-#: editor_actions.cc:542
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr "An Timecode-Minuten einrasten"
-#: editor_actions.cc:543
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "An Sekunden einrasten"
-#: editor_actions.cc:544
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "An Minuten einrasten"
-#: editor_actions.cc:546
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr "An Schläge/28 einrasten"
-#: editor_actions.cc:547
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr "An Schläge/128 einrasten"
-#: editor_actions.cc:548
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "An Schläge/32 einrasten"
-#: editor_actions.cc:549
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr "An Schläge/28 einrasten"
-#: editor_actions.cc:550
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr "An Schläge/24 einrasten"
-#: editor_actions.cc:551
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr "An Schläge/20 einrasten"
-#: editor_actions.cc:552
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "An Schläge/16 einrasten"
-#: editor_actions.cc:553
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "An Schläge/14 einrasten"
-#: editor_actions.cc:554
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr "An Schläge/12 einrasten"
-#: editor_actions.cc:555
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "An Schläge/10 einrasten"
-#: editor_actions.cc:556
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "An Schläge/8 einrasten"
-#: editor_actions.cc:557
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "An Schläge/7 einrasten"
-#: editor_actions.cc:558
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "An Schläge/6 einrasten"
-#: editor_actions.cc:559
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "An Schläge/5 einrasten"
-#: editor_actions.cc:560
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "An Schläge/4 einrasten"
-#: editor_actions.cc:561
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "An Triolen einrasten"
-#: editor_actions.cc:562
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "An Schläge/2 einrasten"
-#: editor_actions.cc:564
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "An Schlägen einrasten"
-#: editor_actions.cc:565
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "An Takten einrasten"
-#: editor_actions.cc:566
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "An Markern einrasten"
-#: editor_actions.cc:567
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "An Regionenanfang einrasten"
-#: editor_actions.cc:568
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "An Regionenende einrasten"
-#: editor_actions.cc:569
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr "An Regionen-Synchronisationspunkt einrasten"
-#: editor_actions.cc:570
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "An Regionengrenzen einrasten"
-#: editor_actions.cc:572
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "Markerlinien anzeigen"
-#: editor_actions.cc:582
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "Schleifen/Punchbereiche"
-#: editor_actions.cc:586
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Min:Sek"
-#: editor_actions.cc:588 editor_actions.cc:591 editor_rulers.cc:270
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr "Videomonitor"
-#: editor_actions.cc:590 rc_option_editor.cc:2720
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr "Video"
-#: editor_actions.cc:593
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr "Immer oben"
-#: editor_actions.cc:595
+#: editor_actions.cc:620
msgid "Frame number"
msgstr "Framenummer"
-#: editor_actions.cc:596
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr "Timecode-Hintergrund"
-#: editor_actions.cc:597
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr "Vollbild"
-#: editor_actions.cc:598
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr "Letterbox"
-#: editor_actions.cc:599
+#: editor_actions.cc:624
msgid "Original Size"
msgstr "OriginalgröÃe"
-#: editor_actions.cc:656
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Sortieren"
-#: editor_actions.cc:667 editor_routes.cc:485 mixer_ui.cc:1259
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Alles anzeigen"
-#: editor_actions.cc:668
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr "Automatische Regionen anzeigen"
-#: editor_actions.cc:670
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "aufsteigend"
-#: editor_actions.cc:672
+#: editor_actions.cc:697
msgid "Descending"
msgstr "absteigend"
-#: editor_actions.cc:675
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "nach Name der Region"
-#: editor_actions.cc:677
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "nach Länge der Region"
-#: editor_actions.cc:679
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "nach Position der Region"
-#: editor_actions.cc:681
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "nach Zeitstempel der Region"
-#: editor_actions.cc:683
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "nach Anfang der Region in der Datei"
-#: editor_actions.cc:685
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "nach Ende der Region in der Datei"
-#: editor_actions.cc:687
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "nach Namen der Quelldatei"
-#: editor_actions.cc:689
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "nach Länge der Quelldatei"
-#: editor_actions.cc:691
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "nach Erstellungsdatum der Quelldatei"
-#: editor_actions.cc:693
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "nach Dateisystem der Quelle"
-#: editor_actions.cc:696
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "Ungenutzte entfernen"
-#: editor_actions.cc:698
+#: editor_actions.cc:723
msgid "Import PT session"
msgstr "PT Projekt importieren"
-#: editor_actions.cc:703 editor_audio_import.cc:282 editor_pt_import.cc:148
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 sfdb_ui.cc:558 editor_videotimeline.cc:91
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importieren"
-#: editor_actions.cc:706
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "In Regionenliste importieren"
-#: editor_actions.cc:709 session_import_dialog.cc:44
+#: editor_actions.cc:734 session_import_dialog.cc:44
#: session_import_dialog.cc:65
msgid "Import from Session"
msgstr "Aus Projekt importieren"
-#: editor_actions.cc:713
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr "Alle Medien in Projektordner kopieren"
-#: editor_actions.cc:716
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "Projektübersicht anzeigen"
-#: editor_actions.cc:718
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "Gruppierungsleiste anzeigen"
-#: editor_actions.cc:720
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr "Zeige Taktlinien"
-#: editor_actions.cc:724
-msgid "Show Logo"
-msgstr "Zeige Logo"
-
-#: editor_actions.cc:728
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr "MIDI Eingang für im Editor ausgewählte Spuren/Busse de/aktivieren"
-#: editor_actions.cc:751
-msgid "Loaded editor bindings from %1"
-msgstr "Editor-Tastenkürzel aus %1 geladen"
-
-#: editor_actions.cc:753
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Konnte editor.bindings im Suchpfad %1 nicht finden"
-
-#: editor_actions.cc:1097 editor_actions.cc:1493 editor_actions.cc:1504
-#: editor_actions.cc:1557 editor_actions.cc:1568 editor_actions.cc:1615
-#: editor_actions.cc:1625 editor_regions.cc:1574
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1714
msgid "programming error: %1: %2"
msgstr "Programmierfehler: %1: %2"
-#: editor_actions.cc:1793
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "Nach oben"
-#: editor_actions.cc:1796
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Ganz nach oben"
-#: editor_actions.cc:1799
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Nach unten"
-#: editor_actions.cc:1802
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Ganz nach unten"
-#: editor_actions.cc:1805
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "Zur Ursprungsposition verschieben"
-#: editor_actions.cc:1810
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr "an Video koppeln"
-#: editor_actions.cc:1815 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "An Takte und Schläge binden"
-#: editor_actions.cc:1820
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "Synchronisationspunkt entfernen"
-#: editor_actions.cc:1823 mixer_strip.cc:2088 monitor_section.cc:243
-#: monitor_section.cc:313 route_time_axis.cc:256 route_time_axis.cc:538
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Mute"
-#: editor_actions.cc:1826
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normalisieren..."
-#: editor_actions.cc:1829
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Umkehren"
-#: editor_actions.cc:1832
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "In Mono-Regionen umwandeln"
-#: editor_actions.cc:1835
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "Lautstärke erhöhen"
-#: editor_actions.cc:1838
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "Lautstärke reduzieren"
-#: editor_actions.cc:1841
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "Tonhöhe ändern..."
-#: editor_actions.cc:1847
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "Deckend"
-#: editor_actions.cc:1851 editor_regions.cc:120
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Fade In"
-#: editor_actions.cc:1856 editor_regions.cc:121
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Fade Out"
-#: editor_actions.cc:1871
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "Mehrfach duplizieren..."
-#: editor_actions.cc:1876
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Spur auffüllen"
-#: editor_actions.cc:1880 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Schleife erstellen"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "Punchbereich erstellen"
-#: editor_actions.cc:1891
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "Einzelnen Bereichsmarker einfügen"
-#: editor_actions.cc:1896
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "Einen Bereichsmarker pro Region einfügen"
-#: editor_actions.cc:1900
+#: editor_actions.cc:1898
msgid "Snap Position to Grid"
msgstr "Positionszeiger einrasten"
-#: editor_actions.cc:1903
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "Lücken schlieÃen"
-#: editor_actions.cc:1906
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "Rhythm Ferret..."
-#: editor_actions.cc:1909
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "Exportieren..."
-#: editor_actions.cc:1915
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "Bereich unter aktueller Region entfernen"
-#: editor_actions.cc:1919 editor_actions.cc:1920
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "Fade-In bis Positionszeiger"
-#: editor_actions.cc:1921 editor_actions.cc:1922
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "Fade-Out ab Positionszeiger"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "Regionlänge = Taktlänge setzen"
-#: editor_actions.cc:1929
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "Regionen an perkussiven Schlägen teilen"
-#: editor_actions.cc:1934
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "Eventlisteneditor..."
-#: editor_actions.cc:1937
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "Eigenschaften..."
-#: editor_actions.cc:1941
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "Bounce (mit Signalverarbeitung)"
-#: editor_actions.cc:1942
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "Bounce (ohne Signalverarbeitung)"
-#: editor_actions.cc:1943
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "Verbinden (combine)"
-#: editor_actions.cc:1944
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "Trennen (uncombine)"
-#: editor_actions.cc:1946
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Lautheitsanalyse..."
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "FFT-Analyse"
-#: editor_actions.cc:1948
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Lautstärkekurve zurücksetzen"
-#: editor_actions.cc:1950
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "Lautstärke zurücksetzen"
-#: editor_actions.cc:1955
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "Lautstärkekurve ist aktiv"
-#: editor_actions.cc:1963 editor_actions.cc:1964
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "Patch Change einfügen..."
-#: editor_actions.cc:1965
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr "Von anderen Kopien entkoppeln"
-#: editor_actions.cc:1966
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "Stille entfernen..."
-#: editor_actions.cc:1967
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Bereich auswählen"
-#: editor_actions.cc:1969 editor_actions.cc:1970
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr "Schritt nach hinten"
-#: editor_actions.cc:1971 editor_actions.cc:1972
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr "Schritt nach vorne"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr "Regionen aneinanderreihen"
-#: editor_actions.cc:1979
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr "Schritt nach hinten um Aufnahme-Offset"
-#: editor_actions.cc:1986
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr "Schritt nach vorne um Aufnahme-Offset"
-#: editor_actions.cc:1990
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "Auf Schleife kürzen"
-#: editor_actions.cc:1991
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Auf Punchbereich kürzen"
-#: editor_actions.cc:1993
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Zur vorherigen Region aufschlieÃen"
-#: editor_actions.cc:1994
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Zur nächsten Region aufschlieÃen"
-#: editor_actions.cc:2001
+#: editor_actions.cc:2000
msgid "Insert Region from Region List"
msgstr "Region aus Regionenliste einfügen"
-#: editor_actions.cc:2007
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "Synchronisationspunkt setzen"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "Transienten setzen"
-#: editor_actions.cc:2009
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr "Teilen/Auftrennen"
-#: editor_actions.cc:2010
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "Anfang der Region am Arbeitspunkt abschneiden"
-#: editor_actions.cc:2011
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "Ende der Region am Arbeitspunkt abschneiden"
-#: editor_actions.cc:2016
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "Anfang ausrichten"
-#: editor_actions.cc:2023
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "Anfang relativ ausrichten"
-#: editor_actions.cc:2027
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "Ende ausrichten"
-#: editor_actions.cc:2032
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "Ende relativ ausrichten"
-#: editor_actions.cc:2039
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "Synchronisationspunkt ausrichten"
-#: editor_actions.cc:2046
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "Synchronisationspunkt relativ ausrichten"
-#: editor_actions.cc:2050 editor_actions.cc:2053
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "Oberste Region auswählen..."
@@ -4987,33 +5310,33 @@ msgstr ""
"Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %2 als neue "
"Quelle importieren, oder überspringen?"
-#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Importieren Abbrechen"
-#: editor_audio_import.cc:562
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Editor: kann die Datei \"%1\" nicht öffnen (%2)"
-#: editor_audio_import.cc:570
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Importieren Abbrechen"
-#: editor_audio_import.cc:571
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Nicht einbetten"
-#: editor_audio_import.cc:572
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Alle Importieren ohne nachzufragen"
-#: editor_audio_import.cc:575 editor_audio_import.cc:601
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "Samplerate"
-#: editor_audio_import.cc:576 editor_audio_import.cc:602
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -5022,7 +5345,7 @@ msgstr ""
"Die Samplerate dieser Audiodatei unterscheidet sich von der Samplerate "
"dieses Projekts."
-#: editor_audio_import.cc:598
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Trotzdem importieren"
@@ -5037,13 +5360,13 @@ msgstr "PT Projekt importieren"
#: editor_pt_import.cc:97
msgid "%1: this is only the directory/folder name, not the filename.\n"
-msgstr "%1: dies ist nur der Verzeichnisname, nicht der Dateiname."
+msgstr "%1: dies ist nur der Verzeichnisname, nicht der Dateiname.\n"
-#: editor_pt_import.cc:131
+#: editor_pt_import.cc:132
msgid "Doesn't seem to be a valid PT session file"
msgstr "Scheint keine gültige PT Projektdatei zu sein"
-#: editor_pt_import.cc:135
+#: editor_pt_import.cc:136
msgid ""
"PT v%1 Session @ %2Hz\n"
"\n"
@@ -5061,29 +5384,45 @@ msgstr ""
"\n"
"Fortfahren..."
-#: editor_canvas_events.cc:1308 editor_drag.cc:1418
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+"Konnte eine oder mehrere Audiodateien nicht laden, versuche aber weiterhin "
+"den Import."
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr "Erfolg! Import sollte bald abgeschlossen sein."
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr "PTImport: UINT_MAX Routen? unmöglich!"
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
"Konnte keine neue Spur erzeugen, nachdem die Region in der Drop Zone "
"platziert wurde"
-#: editor_drag.cc:1310
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr "Region zeitgleich verschieben"
-#: editor_drag.cc:2245
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr "Wellenmodus-Ziehen"
-#: editor_drag.cc:2307
+#: editor_drag.cc:2311
msgid "create region"
msgstr "Region erzeugen"
-#: editor_drag.cc:2426 midi_region_view.cc:2834
+#: editor_drag.cc:2430 midi_region_view.cc:2857
msgid "resize notes"
msgstr "Notenlänge ändern"
-#: editor_drag.cc:2609 editor_drag.cc:2644
+#: editor_drag.cc:2613 editor_drag.cc:2648
msgid ""
"One or more Audio Regions\n"
"are both Locked and\n"
@@ -5095,79 +5434,87 @@ msgstr ""
"an das Video gekoppelt.\n"
"Das Video kann nicht bewegt werden."
-#: editor_drag.cc:2679
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr "Videostart"
-#: editor_drag.cc:2681
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr "Diff:"
-#: editor_drag.cc:2703
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr "Bewege Video"
-#: editor_drag.cc:3212
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr "Taktwechsel bewegen"
+
+#: editor_drag.cc:3178
msgid "copy meter mark"
msgstr "Taktmarker kopieren"
-#: editor_drag.cc:3220
-msgid "move meter mark"
-msgstr "Taktwechsel bewegen"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr "inaktiv"
-#: editor_drag.cc:3308
+#: editor_drag.cc:3323
msgid "move tempo mark"
msgstr "Tempowechsel bewegen"
-#: editor_drag.cc:3345
+#: editor_drag.cc:3330
msgid "copy tempo mark"
msgstr "Tempomarker kopieren"
-#: editor_drag.cc:3609
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr "Tempo dehnen"
+
+#: editor_drag.cc:3735
msgid "change fade in length"
msgstr "Ãndere Fade-In Länge"
-#: editor_drag.cc:3734
+#: editor_drag.cc:3860
msgid "change fade out length"
msgstr "Fade-Out verändern"
-#: editor_drag.cc:4110
+#: editor_drag.cc:4238
msgid "move marker"
msgstr "Marker bewegen"
-#: editor_drag.cc:4373 editor_drag.cc:5694
+#: editor_drag.cc:4505 editor_drag.cc:5832
msgid "automation range move"
msgstr "Automationsbereich bewegen"
-#: editor_drag.cc:4747
+#: editor_drag.cc:4889
msgid "An error occurred while executing time stretch operation"
msgstr "Beim Ausführen der Timestretch-Operation trat ein Fehler auf"
-#: editor_drag.cc:5208
+#: editor_drag.cc:5350
msgid "programming_error: %1"
msgstr "Programmierfehler: %1"
-#: editor_drag.cc:5277 editor_drag.cc:5287
+#: editor_drag.cc:5419 editor_drag.cc:5429
msgid "new skip marker"
msgstr "neuer Sprungmarker"
-#: editor_drag.cc:5278
+#: editor_drag.cc:5420
msgid "skip"
msgstr "Sprung"
-#: editor_drag.cc:5282 location_ui.cc:58
+#: editor_drag.cc:5424 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5283
+#: editor_drag.cc:5425
msgid "new CD marker"
msgstr "neuer CD Marker"
-#: editor_drag.cc:5288 editor_route_groups.cc:438 mixer_ui.cc:1594
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "unbenannt"
-#: editor_drag.cc:5601
+#: editor_drag.cc:5739
msgid "Automation range drag created for invalid region type"
msgstr "Automationsbereichs-Ziehen für ungültigen Regionstyp erzeugt"
@@ -5183,7 +5530,7 @@ msgstr "Farbe des Gruppen-Reiters"
msgid "Name of Group"
msgstr "Gruppenname"
-#: editor_route_groups.cc:99 editor_routes.cc:209
+#: editor_route_groups.cc:99 editor_routes.cc:234
msgid "Visible|V"
msgstr "V"
@@ -5215,9 +5562,9 @@ msgstr "Rel"
msgid "Relative Gain Changes?"
msgstr "Relative Lautstärke-Ãnderungen"
-#: editor_route_groups.cc:103 editor_regions.cc:124 editor_routes.cc:213
-#: mixer_strip.cc:2117 meter_strip.cc:367 route_time_axis.cc:2750
-#: time_axis_view.cc:1199
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
msgid "Mute|M"
msgstr "M"
@@ -5225,8 +5572,9 @@ msgstr "M"
msgid "Sharing Mute?"
msgstr "Stummschaltung teilen?"
-#: editor_route_groups.cc:104 editor_routes.cc:214 mixer_strip.cc:2130
-#: meter_strip.cc:375 route_time_axis.cc:2747
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
msgid "Solo|S"
msgstr "S"
@@ -5234,8 +5582,8 @@ msgstr "S"
msgid "Sharing Solo?"
msgstr "Solo teilen?"
-#: editor_route_groups.cc:105 midi_time_axis.cc:1630 midi_time_axis.cc:1633
-#: midi_time_axis.cc:1636
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Rec"
@@ -5259,7 +5607,7 @@ msgstr "Sel"
msgid "Sharing Selected/Editing Status?"
msgstr "Auswahl-/Editierzustand teilen?"
-#: editor_route_groups.cc:108 editor_routes.cc:210
+#: editor_route_groups.cc:108 editor_routes.cc:235
msgid "Active|A"
msgstr "A"
@@ -5267,13 +5615,13 @@ msgstr "A"
msgid "Sharing Active Status?"
msgstr "Einschaltzustand teilen?"
-#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2248
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr "Programmierfehler: marker canvas item has no marker object pointer!"
@@ -5281,7 +5629,7 @@ msgstr "Programmierfehler: marker canvas item has no marker object pointer!"
msgid "Confirm MIDI File Overwrite"
msgstr "Bestätige das Ãberschreiben der MIDI-Datei"
-#: editor_export_audio.cc:115 utils_videotl.cc:73
+#: editor_export_audio.cc:115 utils_videotl.cc:75
msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr ""
"Eine Datei mit diesem Namen existiert bereits. Wollen Sie sie überschreiben?"
@@ -5302,20 +5650,20 @@ msgstr "Ende"
msgid "mark"
msgstr "Marker"
-#: editor_markers.cc:650 editor_ops.cc:2102 editor_ops.cc:2124
-#: editor_ops.cc:2240 editor_ops.cc:2277 location_ui.cc:1025
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "Marker hinzufügen"
-#: editor_markers.cc:682 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "Loopbereich festlegen"
-#: editor_markers.cc:698 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "Punchbereich festlegen"
-#: editor_markers.cc:715 editor_ops.cc:4092
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "Bereich"
@@ -5323,107 +5671,136 @@ msgstr "Bereich"
msgid "new range marker"
msgstr "Neuer Bereich"
-#: editor_markers.cc:751 editor_ops.cc:2208 location_ui.cc:861
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "Marker entfernen"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "Hierhin setzen"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "Wiedergabe ab hier"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "Marker zum Positionszeiger verschieben"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "Bereich bis zum nächsten Marker erstellen"
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr "Positionszeiger zu Marker setzen"
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr "Wiedergabe ab Marker"
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr "Marker beim Positionszeiger erzeugen"
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr "Bereich aus Auswahl bilden"
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Bereich verbergen"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "Bereich umbenennen..."
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Bereich entfernen"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Regionen an Bereichsgrenzen teilen"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Bereich auswählen"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr "Ãndere zu Verlaufend"
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr "Ãndere zu Konstant"
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr "Binde an Musik"
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr "Binde an Audio"
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Punchbereich erstellen"
-#: editor_markers.cc:1407 editor_ops.cc:2057
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr "ändere Bindungsart des Metrums"
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr "ändere Bindungsart des Tempos"
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr "ändere Tempo-Typ"
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Neuer Name: "
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "Marker umbenennen"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "Bereich umbenennen"
-#: editor_markers.cc:1419 editor_mouse.cc:2265 processor_box.cc:2261
-#: processor_box.cc:2728 route_time_axis.cc:1112 route_ui.cc:1616
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1641
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Umbenennen"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "Marker umbenennen"
-#: editor_mixer.cc:91
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
"Dieser Bildschirm ist nicht hoch genug, um den Editor-Mixer darzustellen"
-#: editor_mouse.cc:1343 editor_mouse.cc:1361 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
"Programmierfehler: tempo marker canvas item has no marker object pointer!"
-#: editor_mouse.cc:1348 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr "Programmierfehler: marker for tempo is not a tempo marker!"
-#: editor_mouse.cc:1366 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr "Programmierfehler: marker for meter is not a meter marker!"
-#: editor_mouse.cc:2013 editor_mouse.cc:2038 editor_mouse.cc:2051
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
@@ -5431,179 +5808,183 @@ msgstr ""
"Programmierfehler: control point canvas item has no control point object "
"pointer!"
-#: editor_mouse.cc:2186
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "Note(n) bearbeiten"
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr "Startpunkt ändern"
-#: editor_mouse.cc:2211
+#: editor_mouse.cc:2218
msgid "end point trim"
msgstr "Endpunkt ändern"
-#: editor_mouse.cc:2263
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Name für Region:"
-#: editor_ops.cc:167
+#: editor_ops.cc:168
msgid "split"
msgstr "teile"
-#: editor_ops.cc:341
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "Auswahl ändern"
-#: editor_ops.cc:383
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "Regionen Schritt vorwärts"
-#: editor_ops.cc:437 editor_ops.cc:528
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "Position Schritt vorwärts"
-#: editor_ops.cc:468
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "Regionen Schritt nach hinten"
-#: editor_ops.cc:560
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "Schritt vorwärts"
-#: editor_ops.cc:584
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr "Schritt nach hinten"
-#: editor_ops.cc:649
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr "Regionen aneinanderreihen"
-#: editor_ops.cc:711
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "build_region_boundary_cache wurde mit snap_type = %1 aufgerufen"
-#: editor_ops.cc:2059
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "Neuer Positionsmarker"
-#: editor_ops.cc:2150 editor_ops.cc:2174
+#: editor_ops.cc:2212 editor_ops.cc:2236
msgid "Set session start"
msgstr "Projektstart setzen"
-#: editor_ops.cc:2240
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "Marker hinzufügen"
-#: editor_ops.cc:2336
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "Marker zurücksetzen"
-#: editor_ops.cc:2351
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "Bereiche zurücksetzen"
-#: editor_ops.cc:2367
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "Positionen zurücksetzen"
-#: editor_ops.cc:2430
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "Region einfügen"
-#: editor_ops.cc:2621
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "Regionen weiter nach oben"
-#: editor_ops.cc:2623
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "Region weiter nach oben"
-#: editor_ops.cc:2629
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "Regionen ganz nach oben"
-#: editor_ops.cc:2631
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "Region ganz nach oben"
-#: editor_ops.cc:2637
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "Regionen weiter nach unten"
-#: editor_ops.cc:2639 editor_ops.cc:2647
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "Region weiter nach unten"
-#: editor_ops.cc:2645
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "Regionen ganz nach unten"
-#: editor_ops.cc:2730
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "Region umbenennen"
-#: editor_ops.cc:2732 processor_box.cc:2259 route_ui.cc:1614
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1639
msgid "New name:"
msgstr "Neuer Name: "
-#: editor_ops.cc:3030
+#: editor_ops.cc:3097
msgid "separate"
msgstr "Teilen"
-#: editor_ops.cc:3142
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "Bereich unter aktueller Region entfernen"
-#: editor_ops.cc:3294
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "Auf Auswahl kürzen"
-#: editor_ops.cc:3376
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "Einrastpunkt definieren"
-#: editor_ops.cc:3400
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "Synchronisationspunkt löschen"
-#: editor_ops.cc:3422
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "Regionen zu ihrer Ursprungsposition verschieben"
-#: editor_ops.cc:3424
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "Region zu ihrer Ursprungsposition verschieben"
-#: editor_ops.cc:3445
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "Auswahl ausrichten"
-#: editor_ops.cc:3519
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "Auswahl relativ ausrichten"
-#: editor_ops.cc:3553
+#: editor_ops.cc:3619
msgid "align region"
msgstr "Region ausrichten"
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "vorne abschneiden"
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "hinten Abschneiden"
-#: editor_ops.cc:3634
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "Auf Schleife kürzen"
-#: editor_ops.cc:3644
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "Auf Punchbereich kürzen"
-#: editor_ops.cc:3766
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "Auf Region kürzen"
-#: editor_ops.cc:3825
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5615,11 +5996,11 @@ msgstr ""
"Typischerweise wird dies durch ein Plugin verursacht, das Stereo aus einer "
"Monoquelle oder umgekehrt erzeugt."
-#: editor_ops.cc:3828
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "Einfrieren nicht möglich"
-#: editor_ops.cc:3834
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5633,23 +6014,23 @@ msgstr ""
"\n"
"Einfrieren wird das Signal nur bis zum ersten Send/Insert/Return verarbeiten."
-#: editor_ops.cc:3838
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "Trotzdem einfrieren"
-#: editor_ops.cc:3839
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr "Nicht einfrieren"
-#: editor_ops.cc:3840
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "Einfrier-Grenzen"
-#: editor_ops.cc:3855
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Einfrieren abbrechen"
-#: editor_ops.cc:3885
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5664,47 +6045,47 @@ msgstr ""
"Sie können dies ohne Signalverarbeitung tun, das ist aber eine andere "
"Operation."
-#: editor_ops.cc:3889
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr "Kann nicht bouncen"
-#: editor_ops.cc:3940
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "Bereich bouncen"
-#: editor_ops.cc:4007
+#: editor_ops.cc:4074
msgid "delete"
msgstr "Löschen"
-#: editor_ops.cc:4010
+#: editor_ops.cc:4077
msgid "cut"
msgstr "Ausschneiden"
-#: editor_ops.cc:4013
+#: editor_ops.cc:4080
msgid "copy"
msgstr "Kopieren"
-#: editor_ops.cc:4016
+#: editor_ops.cc:4083
msgid "clear"
msgstr "Leeren"
-#: editor_ops.cc:4065
+#: editor_ops.cc:4132
msgid "objects"
msgstr "Objekte"
-#: editor_ops.cc:4275 editor_ops.cc:4360
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "Region(en) löschen"
-#: editor_ops.cc:4787
-msgid "duplicate selection"
-msgstr "Auswahl duplizieren"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr "Bereichsauswahl duplizieren"
-#: editor_ops.cc:4873
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "Spur verschieben"
-#: editor_ops.cc:4900
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5712,157 +6093,157 @@ msgstr ""
"Wollen Sie wirklich die letzte Aufnahme rückgängig machen?\n"
"(Dies ist destruktiv und kann nicht rückgängig gemacht werden!)"
-#: editor_ops.cc:4903 editor_ops.cc:7127 editor_regions.cc:465
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Nein, nichts machen."
-#: editor_ops.cc:4904
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Ja, entfernen."
-#: editor_ops.cc:4906
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "Lösche letzte Aufnahme"
-#: editor_ops.cc:4982
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "Normalisieren"
-#: editor_ops.cc:5080
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "Regionen umkehren"
-#: editor_ops.cc:5116
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "Stille entfernen"
-#: editor_ops.cc:5197
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "Region(en) abzweigen"
-#: editor_ops.cc:5204
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr "Konnte die Bindung von %1 nicht lösen"
-#: editor_ops.cc:5465
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "Lautstärkekurve zurücksetzen"
-#: editor_ops.cc:5523
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr "Lautstärkekurve aktiv"
-#: editor_ops.cc:5548
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "Regionensperre umschalten"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr "Videosperre umschalten"
-#: editor_ops.cc:5596
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "Art der Regionensperre"
-#: editor_ops.cc:5621
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "Regionen-Deckkraft ändern"
-#: editor_ops.cc:5714
+#: editor_ops.cc:5781
msgid "fade range"
msgstr "Bereich faden"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "Ãndere Fade-In Länge"
-#: editor_ops.cc:5759
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "Ãndere Fade-Out Länge"
-#: editor_ops.cc:5824
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "Fade-In Kurve bearbeiten"
-#: editor_ops.cc:5859
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "Fade-Out Kurve ändern"
-#: editor_ops.cc:5895
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "Fade-In aktivieren"
-#: editor_ops.cc:5929
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "Fade-Out aktivieren"
-#: editor_ops.cc:5989
+#: editor_ops.cc:6056
msgid "toggle fade active"
msgstr "Fade umschalten"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "Schleife aus Auswahl erstellen"
-#: editor_ops.cc:6193
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "Schleife aus Region erstellen"
-#: editor_ops.cc:6212
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "Punchbereich aus Auswahl erstellen"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr "Projektstart/ende auf Auswahl setzen"
-#: editor_ops.cc:6272
+#: editor_ops.cc:6344
msgid "set punch start from EP"
msgstr "Punchbeginn von Arbeitspunkt"
-#: editor_ops.cc:6300
+#: editor_ops.cc:6372
msgid "set punch end from EP"
msgstr "Punchende von Arbeitspunkt"
-#: editor_ops.cc:6333
+#: editor_ops.cc:6405
msgid "set loop start from EP"
msgstr "Schleifenbeginn von Arbeitspunkt"
-#: editor_ops.cc:6361
+#: editor_ops.cc:6433
msgid "set loop end from EP"
msgstr "Schleifenende von Arbeitspunkt"
-#: editor_ops.cc:6372
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "Punchbereich aus Region erstellen"
-#: editor_ops.cc:6457
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "Marker hinzufügen"
-#: editor_ops.cc:6458
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "Globales tempo setzen"
-#: editor_ops.cc:6461
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "Einen Takt definieren"
-#: editor_ops.cc:6462
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
"Möchten Sie das globale Tempo ändern oder einen neuen Tempo-Marker setzen?"
-#: editor_ops.cc:6488
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "Tempo anhand von Region setzen"
-#: editor_ops.cc:6518
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "Region teilen (Split)"
-#: editor_ops.cc:6560
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5872,11 +6253,11 @@ msgstr ""
"Sie versuchen %1 in %2 Teile zu teilen.\n"
"Das könnte sehr lange dauern."
-#: editor_ops.cc:6567
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr "Call for the Ferret!"
-#: editor_ops.cc:6568
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5884,52 +6265,52 @@ msgstr ""
"Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren\n"
"oder versuchen sie im Ferret-Fenster die Analyse zu verbessern."
-#: editor_ops.cc:6570
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr "Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren"
-#: editor_ops.cc:6573
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "ÃbermäÃige Aufteilung?"
-#: editor_ops.cc:6725
+#: editor_ops.cc:6800
msgid "place transient"
msgstr "Transienten platzieren"
-#: editor_ops.cc:6760
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "Regionen an Raster einrasten"
-#: editor_ops.cc:6799
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr "Regionenlücken schlieÃen"
-#: editor_ops.cc:6804
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "Länge des Crossfades"
-#: editor_ops.cc:6813 editor_ops.cc:6824 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr "ms"
-#: editor_ops.cc:6815
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr "Ãffnungslänge vorne"
-#: editor_ops.cc:6828
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr "Ok"
-#: editor_ops.cc:6843
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr "SchlieÃe Lücken zwischen Regionen"
-#: editor_ops.cc:7085
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "Lieber nicht!"
-#: editor_ops.cc:7090
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5945,19 +6326,19 @@ msgstr ""
"bearbeitet werden. \"allow-special-bus-removal\" muss\n"
"dazu auf \"yes\" gesetzt werden."
-#: editor_ops.cc:7106 route_ui.cc:2009
+#: editor_ops.cc:7181
msgid "track"
msgid_plural "tracks"
msgstr[0] "Spur"
msgstr[1] "Spuren"
-#: editor_ops.cc:7107 route_ui.cc:2009
+#: editor_ops.cc:7182
msgid "bus"
msgid_plural "busses"
msgstr[0] "Bus"
msgstr[1] "Busse"
-#: editor_ops.cc:7111
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5970,7 +6351,7 @@ msgstr ""
"Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
"überschrieben werden!"
-#: editor_ops.cc:7116
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5983,7 +6364,7 @@ msgstr ""
"Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
"überschrieben werden!"
-#: editor_ops.cc:7122
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5994,145 +6375,141 @@ msgstr ""
"Diese Aktion kann nicht rückgängig gemacht werden, und die Projektdatei wird "
"überschrieben werden"
-#: editor_ops.cc:7129
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "Ja, entfernen."
-#: editor_ops.cc:7131 editor_snapshots.cc:172
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Ja, entfernen."
-#: editor_ops.cc:7136 editor_ops.cc:7138
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "Entferne %1"
-#: editor_ops.cc:7240 editor_ops.cc:7254 editor_ops.cc:7294 editor_ops.cc:7304
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "Stille einfügen"
-#: editor_ops.cc:7357
+#: editor_ops.cc:7436
msgid "Cannot insert or delete time when in Lock edit."
msgstr "Kann im Sperr-Bearbeitungsmodus keine Zeit einfügen oder löschen"
-#: editor_ops.cc:7377 editor_ops.cc:7389 editor_ops.cc:7462
-msgid "cut time"
-msgstr "Zeit ausschneiden"
-
-#: editor_ops.cc:7475
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
msgid "remove time"
msgstr "Zeit entfernen"
-#: editor_ops.cc:7549
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr "Es gibt zu viele Spuren, sie in das aktuelle Fenster zu einzupassen"
-#: editor_ops.cc:7610
+#: editor_ops.cc:7689
msgid "Sel"
msgstr "Sel"
-#: editor_ops.cc:7649
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr "Ansicht %u gespeichert"
-#: editor_ops.cc:7674
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "Regionen stummschalten"
-#: editor_ops.cc:7676
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "Region stummschalten"
-#: editor_ops.cc:7713
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "Regionen verbinden (combine)"
-#: editor_ops.cc:7751
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr "Regionen trennen (uncombine)"
-#: editor_ops.cc:7788
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr "%1: Gesperrt"
-#: editor_ops.cc:7795
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr "Klicken, um Sperre aufzuheben"
-#: editor_ops.cc:7844
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr "Verschiebe eingebettete Dateien in den Projektordner"
-#: editor_regions.cc:115
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr "Name der Region, mit Kanalzahl in []"
-#: editor_regions.cc:116
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "Position des Regionen-Anfangs"
-#: editor_regions.cc:117 editor_regions.cc:862 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "Ende"
-#: editor_regions.cc:117
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "Position des Regionen-Endes"
-#: editor_regions.cc:118
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "Länge der Region"
-#: editor_regions.cc:119
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
"Position des Regionen-Synchronisationspunktes, relativ zu Regionenanfang"
-#: editor_regions.cc:120
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr "Länge des Einblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
-#: editor_regions.cc:121
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr "Länge des Ausblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
-#: editor_regions.cc:122
+#: editor_regions.cc:166
msgid "Lock|L"
msgstr "L"
-#: editor_regions.cc:122
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "Position der Region gesperrt?"
-#: editor_regions.cc:123
+#: editor_regions.cc:167
msgid "Gain|G"
msgstr "G"
-#: editor_regions.cc:123
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr "Regionenposition an Takt und Schäge gebunden?"
-#: editor_regions.cc:124
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "Region stummgeschaltet?"
-#: editor_regions.cc:125
+#: editor_regions.cc:169
msgid "Opaque|O"
msgstr "O"
-#: editor_regions.cc:125
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr "Region deckend (hindert darunterliegende Regionen, gehört zu werden)?"
-#: editor_regions.cc:314 editor_regions.cc:319 editor_regions.cc:321
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Versteckt"
-#: editor_regions.cc:394
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr "(FEHLT)"
-#: editor_regions.cc:462
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -6140,119 +6517,131 @@ msgstr ""
"Wollen Sie ungenutzte Regionen wirklich entfernen?\n"
"(Dies ist destruktiv und kann nicht rückgängig gemacht werden)"
-#: editor_regions.cc:466
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "Ja, entfernen."
-#: editor_regions.cc:468
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "Ungenutzte Regionen entfernen"
-#: editor_regions.cc:697
+#: editor_regions.cc:735
msgid "EditorRegions::format_position: negative timecode position: %1"
msgstr "EditorRegions::format_position: Negative Timecode Position: %1"
-#: editor_regions.cc:827 editor_regions.cc:843 editor_regions.cc:857
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "Viele"
-#: editor_regions.cc:860 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "Start"
-#: editor_regions.cc:878 editor_regions.cc:894
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "Viele"
-#: editor_regions.cc:963
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "FEHLT"
-#: editor_routes.cc:184
+#: editor_routes.cc:126
+msgid "RS"
+msgstr "RS"
+
+#: editor_routes.cc:208
msgid "SS"
msgstr "SS"
-#: editor_routes.cc:208
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "Spur/Busname"
-#: editor_routes.cc:209
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "Spuren/Busse sichtbar?"
-#: editor_routes.cc:210
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "Spur/Bus aktiv?"
-#: editor_routes.cc:211
+#: editor_routes.cc:236
msgid "MidiInput|I"
msgstr "I"
-#: editor_routes.cc:211
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "MIDI Eingänge aktiv"
-#: editor_routes.cc:212
+#: editor_routes.cc:237
msgid "Rec|R"
msgstr "R"
-#: editor_routes.cc:212
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "Aufnahme bereit"
-#: editor_routes.cc:213
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr "RS"
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr "Record Safe"
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "Stumm"
-#: editor_routes.cc:214
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "Solo ein"
-#: editor_routes.cc:215
+#: editor_routes.cc:241
msgid "SoloIso|SI"
msgstr "SI"
-#: editor_routes.cc:215
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "Isoliertes Solo"
-#: editor_routes.cc:216
+#: editor_routes.cc:242
msgid "SoloLock|SS"
msgstr "SS"
-#: editor_routes.cc:216
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "Solo Safe (gesperrt)"
-#: editor_routes.cc:486 mixer_ui.cc:1260
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Alle verbergen"
-#: editor_routes.cc:487 mixer_ui.cc:1261
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Zeige alle Audiospuren"
-#: editor_routes.cc:488 mixer_ui.cc:1262
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Verberge alle Audiospuren"
-#: editor_routes.cc:489 mixer_ui.cc:1263
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Zeige alle Audiobusse"
-#: editor_routes.cc:490 mixer_ui.cc:1264
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Verberge alle Audiobusse"
-#: editor_routes.cc:491 mixer_ui.cc:1265
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "Zeige alle MIDI-Spuren"
-#: editor_routes.cc:492 mixer_ui.cc:1266
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "Verberge alle MIDI-Spuren"
-#: editor_routes.cc:493
+#: editor_routes.cc:557
msgid "Only Show Tracks with Regions Under Playhead"
msgstr "Nur Spuren mit Regionen unter dem Positionszeiger anzeigen"
@@ -6296,7 +6685,7 @@ msgstr "Neuer CD-Track Marker"
msgid "New Tempo"
msgstr "Tempowechsel einfügen..."
-#: editor_rulers.cc:238 tempo_dialog.cc:315
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Taktwechsel einfügen..."
@@ -6320,31 +6709,35 @@ msgstr ""
msgid "Remove snapshot"
msgstr "Schnappschuss entfernen"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "Hinzufügen"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "Tempowechsel einfügen"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "Hinzufügen"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "Taktwechsel einfügen"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "Fertig"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "ersetze Metrum-Marker"
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "Tempowechsel ersetzen"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "Tempowechsel entfernen"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -6358,7 +6751,7 @@ msgstr "strecken/stauchen"
msgid "pitch shift"
msgstr "pitch-shift"
-#: editor_timefx.cc:304
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
"Time-Stretch konnte nicht gestartet werden - Fehler beim erstellen des "
@@ -6376,27 +6769,31 @@ msgstr "MIDI Geräteeinstellungen"
msgid "Refresh Devices"
msgstr "Geräteliste auffrischen"
-#: engine_dialog.cc:90 engine_dialog.cc:2923
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr "Gepuffertes E/A benutzen"
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr "Messen"
-#: engine_dialog.cc:91
+#: engine_dialog.cc:92
msgid "Use results"
msgstr "Benutze Ergebnisse"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr "Zurücksetzen ... (Resultate ignorieren)"
-#: engine_dialog.cc:93
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
-msgstr "AUdio kalibrieren"
+msgstr "Audio kalibrieren"
-#: engine_dialog.cc:97
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr "Zurück zu Einstellungen"
-#: engine_dialog.cc:118
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
@@ -6406,11 +6803,11 @@ msgstr ""
"\n"
"(Das ist ein Kompilier-/Paket-/Systemfehler und sollte nie passieren.)"
-#: engine_dialog.cc:143
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
-msgstr "LatenzmeÃwerkzeug"
+msgstr "Latenzmesswerkzeug"
-#: engine_dialog.cc:155
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
@@ -6418,111 +6815,111 @@ msgstr ""
"<span weight=\"bold\">Drehen Sie die Lautstärke Ihrer Audioanlage sehr leise."
"</span>"
-#: engine_dialog.cc:164
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr "Wählen Sie unten zwei Kanäle aus und verbinden sie mit einem Kabel."
-#: engine_dialog.cc:169
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr "Ausgangskanal"
-#: engine_dialog.cc:177
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr "Eingangskanal"
-#: engine_dialog.cc:211
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "Wenn die Kanäle verbunden sind, klicken Sie den \"Messen\"-Knopf."
-#: engine_dialog.cc:218
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
"Wenn Sie mit dem Resultat zufrieden sind, klicken Sie den Knopf \"Benutze "
"Ergebnisse\"."
-#: engine_dialog.cc:233 engine_dialog.cc:3058 engine_dialog.cc:3068
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr "Noch keine Messergebnisse"
-#: engine_dialog.cc:243 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Latenz"
-#: engine_dialog.cc:497
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr "Audiosystem:"
-#: engine_dialog.cc:540
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "Treiber:"
-#: engine_dialog.cc:547
+#: engine_dialog.cc:571
msgid "Input Device:"
msgstr "Eingangsgerät:"
-#: engine_dialog.cc:551
+#: engine_dialog.cc:575
msgid "Output Device:"
msgstr "Ausgangsgerät:"
-#: engine_dialog.cc:558
+#: engine_dialog.cc:582
msgid "Device:"
msgstr "Gerät:"
-#: engine_dialog.cc:567 engine_dialog.cc:681 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "Samplerate:"
-#: engine_dialog.cc:573 engine_dialog.cc:688
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "PuffergröÃe"
-#: engine_dialog.cc:582
+#: engine_dialog.cc:606
msgid "Periods:"
msgstr "Perioden:"
-#: engine_dialog.cc:600
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr "Eingangskanäle:"
-#: engine_dialog.cc:613
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr "Ausgangskanäle:"
-#: engine_dialog.cc:625
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "Hardware Eingangslatenz (Samples)"
-#: engine_dialog.cc:628 engine_dialog.cc:641
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "Samples"
-#: engine_dialog.cc:638
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "Hardware Ausgangslatenz (Samples)"
-#: engine_dialog.cc:649
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr "MIDI System:"
-#: engine_dialog.cc:673
+#: engine_dialog.cc:691
msgid ""
"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
"%1 läuft bereits. %2 wird zu ihm verbinden und die existierenden "
"Einstellungen übernehmen."
-#: engine_dialog.cc:726
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-"Das Starten oder Verbinden mit der Audio-Engine ist fehlgeschlagen.\n"
+"Das Starten oder Verbinden mit der Audioengine ist fehlgeschlagen.\n"
"\n"
"Latenzkalibrierung erfordert ein funktionierendes Audio-Interface."
-#: engine_dialog.cc:732
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6534,155 +6931,164 @@ msgstr ""
"Latenzkalibrierung verlangt Duplexbetrieb (gleichzeitig Aufnahme und "
"Wiedergabe)"
-#: engine_dialog.cc:938
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr "MIDI Geräte"
-#: engine_dialog.cc:944
+#: engine_dialog.cc:971
msgid "Device"
msgstr "Gerät"
-#: engine_dialog.cc:946
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr "Hardware-Latenzen"
-#: engine_dialog.cc:987
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr "Kalibrieren"
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr "alle verfügbaren Kanäle"
-#: engine_dialog.cc:1576 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "Sample"
-msgstr[1] "Samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 Sample"
+msgstr[1] "%1 Samples"
-#: engine_dialog.cc:1640
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr "(%.1f ms)"
-#: engine_dialog.cc:2371
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
-msgstr "Konnte Backend Engine %1 nicht starten"
+msgstr "Konnte Backend-Engine %1 nicht starten"
-#: engine_dialog.cc:2403
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr "Kann Treiber nicht auf %1 setzen"
-#: engine_dialog.cc:2408
+#: engine_dialog.cc:2450
msgid "Cannot set input device name to %1"
msgstr "Kann Namen des Eingangsgeräts nicht auf %1 setzen"
-#: engine_dialog.cc:2412
+#: engine_dialog.cc:2454
msgid "Cannot set output device name to %1"
msgstr "Kann Namen des Ausgangsgeräts nicht auf %1 setzen"
-#: engine_dialog.cc:2417
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr "Kann Gerät nicht auf %1 setzen"
-#: engine_dialog.cc:2422
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr "Kann Samplerate nicht auf %1 setzen"
-#: engine_dialog.cc:2426
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr "Kann BuffergröÃe nicht auf %1 setzen"
-#: engine_dialog.cc:2430
+#: engine_dialog.cc:2472
msgid "Cannot set periods to %1"
msgstr "Kann Perioden nicht auf %1 setzen"
-#: engine_dialog.cc:2436
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr "Kann Eingangskanäle nicht auf %1 setzen"
-#: engine_dialog.cc:2440
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr "Kann Ausgangskanäle nicht auf %1 setzen"
-#: engine_dialog.cc:2446
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr "Kann Eingangslatenz nicht auf %1 setzen"
-#: engine_dialog.cc:2450
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr "Kann Ausgangslatenz nicht auf %1 setzen"
-#: engine_dialog.cc:2781 engine_dialog.cc:2840
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr "Kein Signal erkannt"
-#: engine_dialog.cc:2794 engine_dialog.cc:2848 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+"Eingangssignal is > -3dBFS. Verringern Sie den Signalpegel (E/A-Lautstärken) "
+"am Audio Interface."
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
-msgstr "Von Audio-Engine getrennt"
+msgstr "Von Audioengine getrennt"
-#: engine_dialog.cc:2803 engine_dialog.cc:2856
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr "Entdeckte Roundtrip-Latenz:"
-#: engine_dialog.cc:2805 engine_dialog.cc:2858
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr "Systemische Latenz:"
-#: engine_dialog.cc:2812
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr "(Fehler bei der Signalerkennung)"
-#: engine_dialog.cc:2818
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr "(invertiert - schlechte Verkabelung)"
-#: engine_dialog.cc:2865
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr "(durchschnittlich)"
-#: engine_dialog.cc:2871
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr "(zu viel Jitter)"
-#: engine_dialog.cc:2875
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr "(viel Jitter)"
-#: engine_dialog.cc:2887
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr "Timeout - viel MIDI Jitter."
-#: engine_dialog.cc:2903 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "Messe..."
-#: engine_dialog.cc:3004
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr "Trenne von %1"
-#: engine_dialog.cc:3009
+#: engine_dialog.cc:3086
msgid "Running"
msgstr "Läuft"
-#: engine_dialog.cc:3011
+#: engine_dialog.cc:3088
msgid "Connected"
msgstr "Verbunden"
-#: engine_dialog.cc:3022
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr "Verbinde zu %1"
-#: engine_dialog.cc:3026 shuttle_control.cc:614
+#: engine_dialog.cc:3103 shuttle_control.cc:663
msgid "Stopped"
msgstr "Gestoppt"
-#: export_channel_selector.cc:51 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Kanäle:"
-#: export_channel_selector.cc:52
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "In Monodateien aufteilen"
@@ -6690,39 +7096,39 @@ msgstr "In Monodateien aufteilen"
msgid "Bus or Track"
msgstr "Bus oder Spur"
-#: export_channel_selector.cc:473
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "Regioneninhalt ohne Fades und Regionenlautstärke (Kanäle: %1)"
-#: export_channel_selector.cc:477
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "Regioneninhalt mit Fades und Regionenlautstärke (Kanäle: %1)"
-#: export_channel_selector.cc:481
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr "Spurausgang (%1 Kanäle)"
-#: export_channel_selector.cc:550
+#: export_channel_selector.cc:552
msgid "Apply track/bus processing"
msgstr "Signalverarbeitung der Spur/des Busses anwenden"
-#: export_channel_selector.cc:551
+#: export_channel_selector.cc:553
msgid "Select all tracks"
msgstr "Alle Spuren auswählen"
-#: export_channel_selector.cc:552
+#: export_channel_selector.cc:554
msgid "Select all busses"
msgstr "Alle Busse auswählen"
-#: export_channel_selector.cc:553
+#: export_channel_selector.cc:555
msgid "Deselect all"
msgstr "Alles deselektieren"
-#: export_channel_selector.cc:587
+#: export_channel_selector.cc:589
msgid "Track name"
msgstr "Spurname"
-#: export_dialog.cc:46
+#: export_dialog.cc:49
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
@@ -6730,24 +7136,24 @@ msgstr ""
"<span color=\"#ffa755\">Einige existierende Dateien werden überschrieben "
"werden.</span>"
-#: export_dialog.cc:47
+#: export_dialog.cc:50
msgid "List files"
msgstr "Dateien auflisten"
-#: export_dialog.cc:156 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
msgid "File format"
msgstr "Dateiformat"
-#: export_dialog.cc:157 export_timespan_selector.cc:371
-#: export_timespan_selector.cc:433
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
msgid "Time Span"
msgstr "Zeitspanne"
-#: export_dialog.cc:158
+#: export_dialog.cc:165
msgid "Channels"
msgstr "Kanäle"
-#: export_dialog.cc:180
+#: export_dialog.cc:187
msgid ""
"Export has been aborted due to an error!\n"
"See the Log for details."
@@ -6755,39 +7161,55 @@ msgstr ""
"Das Exportieren wurde aufgrund eines Fehlers abgebrochen!\n"
"Details dazu stehen in der Log."
-#: export_dialog.cc:249
+#: export_dialog.cc:298
msgid "Files that will be overwritten"
msgstr "Dateien, die überschrieben werden"
-#: export_dialog.cc:294
+#: export_dialog.cc:343
msgid "Export initialization failed: %1"
-msgstr "Exportinitialisierung gescheitert: %1"
+msgstr "Exportinitialisierung fehlgeschlagen: %1"
-#: export_dialog.cc:304
+#: export_dialog.cc:353
msgid "Stop Export"
msgstr "Export Abbrechen"
-#: export_dialog.cc:325
+#: export_dialog.cc:383
msgid "export"
msgstr "Exportieren"
-#: export_dialog.cc:344
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Exportiere '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:407
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr "Normalisiere '%3' (Zeitspanne %1 von %2)"
-#: export_dialog.cc:348
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Exportiere '%3' (Zeitspanne %1 von %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr "Kodiere '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "Tagge '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "Lade '%3' (Zeitspanne %1 von %2) hoch"
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr "Führe Post-Export Befehl für '%1' aus"
-#: export_dialog.cc:371 export_dialog.cc:373
+#: export_dialog.cc:453 export_dialog.cc:455
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">Fehler: "
-#: export_dialog.cc:383
+#: export_dialog.cc:465
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">Warnung: "
-#: export_dialog.cc:385
+#: export_dialog.cc:467
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6795,19 +7217,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">Warnung: "
-#: export_dialog.cc:409
+#: export_dialog.cc:491
msgid "Export Selection"
msgstr "Auswahl exportieren"
-#: export_dialog.cc:423
+#: export_dialog.cc:505
msgid "Export Region"
msgstr "Region exportieren"
-#: export_dialog.cc:432
+#: export_dialog.cc:514
msgid "Source"
msgstr "Quelle"
-#: export_dialog.cc:448
+#: export_dialog.cc:530
msgid "Stem Export"
msgstr "Stem Export"
@@ -6815,65 +7237,77 @@ msgstr "Stem Export"
msgid "Add another format"
msgstr "Ein weiteres Format hinzuzufügen"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Format"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Ort"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr "Zu Soundcloud hochladen"
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "Analysiere exportiertes Audio"
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "Kein Format!"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "Format: %1: %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "Name:"
-#: export_filename_selector.cc:33 session_dialog.cc:310
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "Projektname"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "Name der Zeitspanne"
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "Revision:"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Ordner:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
#: video_server_dialog.cc:56 export_video_dialog.cc:77
#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Durchsuchen"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Dateiname(n) aus diesen Bestandteilen erzeugen:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "Verzeichnis öffnen"
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "Baue Dateinamen aus diesen Komponenten:"
-#: export_filename_selector.cc:208
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
"<small><i>Leider kann zur Zeit kein Dateinamen-Beispiel gezeigt werden</i></"
"small>"
-#: export_filename_selector.cc:210
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Momentaner (ungefährer) Dateiname: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>Derzeitiger (ungefährer) Dateiname</i>: \"%1\""
-#: export_filename_selector.cc:246 export_filename_selector.cc:332
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
@@ -6883,111 +7317,196 @@ msgstr ""
"Der Dateiname wird aus den Informationen über der "
"Verzeichnisauswahlgeneriert."
-#: export_filename_selector.cc:318
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr "%1: Dies ist kein gültiges Verzeichnis."
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "Wähle den Exportordner"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "Neues Exportformat-Profil"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "Exportformat-Profil bearbeiten"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "Name:"
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalisieren auf:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normalisiere:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Peak"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr "Loudness"
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr "Loudness"
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr "dBTP"
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "Stille am Anfang abschneiden"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "Füge Stille am Anfang hinzu:"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "Stille am Ende abschneiden"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "Füge Stille am Ende hinzu:"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
"Kommando, das nach dem Export ausgeführt werden soll\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=Dateipfad, %d=Verzeichnis, %b=basename, siehe auch den Tooltip für "
+"weitere):"
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "Kompatibilität"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "Qualität"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "Qualität bei Konvertierung der Samplerate:"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "Dithering"
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr "Schreibe CUE-Datei für Disk-at-once CD/DVD Erzeugung"
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "Schreibe TOC-Datei für Disk-at-once CD/DVD Erzeugung"
-#: export_format_dialog.cc:72
+#: export_format_dialog.cc:80
msgid "Create chapter mark file for MP4 chapter marks"
msgstr "Erzeuge Kapitelmarkierungsdatei für MP4 Kapitelmarkierungen"
-#: export_format_dialog.cc:74
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "Datei mit den Metadaten des Projekt taggen"
-#: export_format_dialog.cc:474
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr "^"
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+"Normalisiere auf EBU-R128 LUFS Ziellautheit, ohne das angegebene True-Peak "
+"Limit zu überschreiten. EBU-R128 Normalisierung ist nur für Mono- und "
+"Stereoziele verfügbar, True-Peak funktioniert für jede Kanalanzahl."
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a Künstlername\n"
+"%b Basename der Datei\n"
+"%c Copyright\n"
+"%d Datei-Verzeichnis\n"
+"%f Voller absoluter Pfad der Datei\n"
+"%l Texter\n"
+"%n Projektname\n"
+"%o Dirigent\n"
+"%t Titel\n"
+"%z Organisation\n"
+"%A Album\n"
+"%C Kommentar\n"
+"%E Ingenieur\n"
+"%G Genre\n"
+"%L Gesamtspurzahl\n"
+"%M Mischer\n"
+"%N Name der Zeitspanne\n"
+"%O Komponist\n"
+"%P Produzent\n"
+"%S Disc-Untertitel\n"
+"%T Spurnummer\n"
+"%Y Jahr\n"
+"%Z Land"
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "Beste (sinc)"
-#: export_format_dialog.cc:479
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "Mittel (sinc)"
-#: export_format_dialog.cc:484
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "Schnellste (sinc)"
-#: export_format_dialog.cc:494
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr "Halteglied nullter Ordnung (ZOH)"
-#: export_format_dialog.cc:904
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "Optionen für lineare Codierung"
-#: export_format_dialog.cc:920
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "Ogg Vorbis Optionen"
-#: export_format_dialog.cc:931
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "FLAC Optionen"
-#: export_format_dialog.cc:948
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "Broadcast Wave Optionen"
@@ -7011,19 +7530,202 @@ msgstr ""
msgid "Do you really want to remove this preset?"
msgstr "Wollen Sie dieses Preset wirklich entfernen?"
-#: export_timespan_selector.cc:44
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "Export-Report/Analyse"
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr "%1 Hz"
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Dauer:"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Timecode:"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "Fehler:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr "(zu kurze Zeitspanne zum Integrieren)"
+
+#: export_report.cc:222
+msgid "-888"
+msgstr "-888"
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr "Peak:"
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr "%1 dBFS"
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr "True Peak:"
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr "%1 dBTP"
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "Normalisierungsverstärkung:"
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr "+888.88 dB"
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr "Integrierte Lautheit:"
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr "%1 LUFS"
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "Lautheitsbereich:"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr "%1 LU"
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr "100"
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr "00:00:00.000"
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr "0|A8"
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr "%1 dB"
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+"Nicht\n"
+"Verfügbar"
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+"LUFS\n"
+"(kurz)"
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr "Multiplizität"
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr "Logarithmisch|Lg"
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr "Rektifiziert|Rf"
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr "Logarithmisch"
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr "Rektifiziert"
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr "Hz"
+
+#: export_report.cc:755
+msgid "500"
+msgstr "500"
+
+#: export_report.cc:756
+msgid "1K"
+msgstr "1K"
+
+#: export_report.cc:757
+msgid "5K"
+msgstr "5K"
+
+#: export_report.cc:758
+msgid "10K"
+msgstr "10K"
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr "Schreibe Bild der Exportanalyse: %1"
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Konnte Datei nicht lesen: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Konnte auf Audiodatei nicht zugreifen: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr "-36"
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr "-18"
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr "-9"
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr "-3"
+
+#: export_timespan_selector.cc:45
msgid "Show Times as:"
msgstr "Zeitanzeige:"
-#: export_timespan_selector.cc:51 processor_box.cc:2730
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr "Echtzeit-Export"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
msgid "Select All"
msgstr "Alles auswählen"
-#: export_timespan_selector.cc:220 transform_dialog.cc:93
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
msgid " to "
msgstr " bis"
-#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr "RT"
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
msgid "Range"
msgstr "Bereiche"
@@ -7039,86 +7741,90 @@ msgstr "getSoundResourceFile: Keine gültige Wurzel in der XML-Datei"
msgid "getSoundResourceFile: root = %1, != response"
msgstr "getSoundResourceFile: Wurzel = %1, != Antwort"
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2276
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr "%1"
-#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:149 gain_meter.cc:962
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Fader Automationsmodus"
-#: gain_meter.cc:150 gain_meter.cc:963
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Fader-Automationstyp"
-#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:179 panner_ui.cc:641
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr "Abs"
-#: gain_meter.cc:795
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
msgid "M"
msgstr "M"
-#: gain_meter.cc:798
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "P"
-#: gain_meter.cc:801
+#: gain_meter.cc:822
msgid "T"
msgstr "T"
-#: gain_meter.cc:804
+#: gain_meter.cc:825
msgid "W"
msgstr "W"
-#: generic_pluginui.cc:85
+#: generic_pluginui.cc:83
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Voreinstellungen</span>"
-#: generic_pluginui.cc:100
+#: generic_pluginui.cc:99 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr "Manuell"
-#: generic_pluginui.cc:109
+#: generic_pluginui.cc:108
msgid "All Automation"
msgstr "Alle Automation"
-#: generic_pluginui.cc:253
-msgid "Switches"
-msgstr "Schalter"
-
-#: generic_pluginui.cc:263 generic_pluginui.cc:439 processor_box.cc:2708
-msgid "Controls"
-msgstr "Steuerelemente"
-
-#: generic_pluginui.cc:296
+#: generic_pluginui.cc:259
msgid "Plugin Editor: could not build control element for port %1"
msgstr "Plugin Editor: konnte kein Steuerelement für Port %1 erzeugen"
-#: generic_pluginui.cc:321
+#: generic_pluginui.cc:290
msgid "Plugin Editor: no control for property %1"
msgstr "Plugin Editor: kein Regler für Eigenschaft %1"
-#: generic_pluginui.cc:327
+#: generic_pluginui.cc:296
msgid "Plugin Editor: could not build control element for property %1"
msgstr "Plugin Editor: konnte kein Kontrollelement für Eigenschaft %1 erzeugen"
-#: generic_pluginui.cc:471
+#: generic_pluginui.cc:370
+msgid "Switches"
+msgstr "Schalter"
+
+#: generic_pluginui.cc:380 generic_pluginui.cc:486 processor_box.cc:3665
+msgid "Controls"
+msgstr "Steuerelemente"
+
+#: generic_pluginui.cc:521
msgid "Meters"
msgstr "Pegelanzeigen"
-#: generic_pluginui.cc:493
+#: generic_pluginui.cc:559
msgid "Automation control"
msgstr "Automation"
-#: generic_pluginui.cc:500
+#: generic_pluginui.cc:566
msgid "Mgnual"
msgstr "Mgnuell"
+#: generic_pluginui.cc:831
+msgid "This control cannot be automated"
+msgstr "Dieses Kontrollelement kann nicht automatisiert werden"
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "Audio Verbindungsmanager"
@@ -7127,8 +7833,9 @@ msgstr "Audio Verbindungsmanager"
msgid "MIDI Connection Manager"
msgstr "Midi Verbindungsmanager"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:840
-#: mixer_strip.cc:941 monitor_section.cc:1306 monitor_selector.cc:189
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Trenne"
@@ -7136,59 +7843,83 @@ msgstr "Trenne"
msgid "port"
msgstr "Port"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "Ausgewählten Spuren"
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "Spuren, deren Aufnahme aktiviert ist"
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "Solo-Spuren/Busse"
-#: group_tabs.cc:321
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "Erzeuge neue Gruppe aus..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "Erzeuge neue Gruppe mit Master aus..."
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "Neue Gruppe erzeugen ..."
-#: group_tabs.cc:324
-msgid "Create New Group From"
-msgstr "Neue Gruppe erzeugen aus"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "Erzeuge neue Gruppe mit Kontroll-Master..."
-#: group_tabs.cc:327
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "Gruppe bearbeiten..."
-#: group_tabs.cc:328
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr "Gruppe sammeln"
-#: group_tabs.cc:329
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "Gruppe entfernen"
-#: group_tabs.cc:332
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr "Weise Gruppe an Kontroll-Master zu..."
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr "Subgruppen-Bus entfernen"
-#: group_tabs.cc:334
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "Subgruppen-Bus hinzufügen"
-#: group_tabs.cc:336
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr "Aux-Send zur Subgruppe hinzufügen (Pre-Fader)"
-#: group_tabs.cc:337
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr "Aux-Send zur Subgruppe hinzufügen (Post-Fader)"
-#: group_tabs.cc:343
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr "Weise Auswahl an Kontroll-Master zu..."
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr "Weise Aufnahmebereitschaft an Kontroll-Master zu..."
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr "Weise Solostatus an Kontroll-Master zu..."
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr "Alle Gruppen aktivieren"
-#: group_tabs.cc:344
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "Alle Gruppen deaktivieren"
@@ -7252,11 +7983,17 @@ msgstr "Zeit entfernen"
msgid "Insert time"
msgstr "Stille einfügen"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+"Ungültige oder Null-Zeitdauer eingegeben. Bitte geben Sie eine gültige Dauer "
+"an."
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "-keine-"
-#: interthread_progress_window.cc:104
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "Importiere Datei: %1 von %2"
@@ -7272,63 +8009,90 @@ msgstr "%1 Eingang"
msgid "%1 output"
msgstr "%1 Ausgang"
-#: keyboard.cc:82
+#: keyboard.cc:93
msgid "your own"
msgstr "Eigenes"
-#: keyboard.cc:145 keyboard.cc:169
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
"Keine Tastatur-Standardbelegung gefunden - %1 wird sich schwer bedienen "
"lassen!"
-#: keyboard.cc:148
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
"Die Datei \"%1\" für Tastaturkürzel wurde nicht gefunden. Stattdessen wird "
"die Standard-Belegung verwendet."
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "Lade Tastenzuordnungen vin %1"
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr "Kollision bei Tastenzuordnung"
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+"Diese Tastenfolge ist schon in Verwendung. Bitte entfernen Sie erst die "
+"andere Zuordnung."
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Tastaturkürzel"
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr "Tastenkürzel entfernen"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Aktion"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "Suche..."
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Tastenkürzel"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr "Drucken"
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr "Klicke, um Suchstring zurückzusetzen"
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-"Wählen Sie eine Aktion und drücken Sie dann die Taste(n) \n"
-"um das Tastaturkürzel zu setzen"
+"Um ein Tastenkürzel zu löschen, wählen Sie eine Aktion aus und klicken dann "
+"hier:"
-#: keyeditor.cc:98
+#: keyeditor.cc:109
msgid "Reset Bindings to Defaults"
msgstr "Setze Kürzel auf Vorgabewerte zurück"
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Hauptmenü"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "Umleitungsmenü"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Aktion"
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Editor-Menü"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Tastenkürzel"
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr "Regionenliste"
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "Prozessor-Menü"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr "Konnte temporäre Datei zum Drucken der Kürzel nicht öffnen (%1)"
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr "Konnte Kürzel nicht in Datei (%1) speichern"
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr "Sample"
#: latency_gui.cc:40
msgid "msec"
@@ -7338,37 +8102,35 @@ msgstr "ms"
msgid "period"
msgstr "Periode"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 Sample"
-msgstr[1] "%1 Samples"
-
-#: latency_gui.cc:72 panner_ui.cc:411 plugin_ui.cc:421
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:422
msgid "Reset"
msgstr "Reset"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1909
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "Programmierfehler: %1 (%2)"
-#: location_ui.cc:54 location_ui.cc:56
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "zu PZ"
-#: location_ui.cc:61
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "Gehe zu"
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "Bindung"
-#: location_ui.cc:89
+#: location_ui.cc:88
msgid "Performer:"
msgstr "Performer:"
-#: location_ui.cc:90
+#: location_ui.cc:89
msgid "Composer:"
msgstr "Komponist:"
-#: location_ui.cc:92
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "Präemphase"
@@ -7404,43 +8166,160 @@ msgstr "Position - Mittelklick, um hierher zu positionieren"
msgid "Set marker time from playhead location"
msgstr "Markerposition auf Positionszeiger setzen"
-#: location_ui.cc:501
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "Sie können keinen CD-Marker am Anfang des Projekts erstellen"
-#: location_ui.cc:727
+#: location_ui.cc:750
msgid "New Marker"
msgstr "Neuer Marker"
-#: location_ui.cc:728
+#: location_ui.cc:751
msgid "New Range"
msgstr "Neuer Bereich"
-#: location_ui.cc:741
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>Schleifen/Punchbereiche</b>"
-#: location_ui.cc:766
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>Marker (auch CD-Index)</b>"
-#: location_ui.cc:801
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>Bereiche (auch CD-Track-Bereichen)</b>"
-#: location_ui.cc:1044
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "Bereich hinzufügen"
-#: main.cc:86
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr "Hinzufügen/Setzen"
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr "Aufruf"
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr "Neuer Haken"
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "Signal(e)"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "Aktion %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr "Zuordnung aufheben"
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "Kann Skript '%1' nicht lesen: %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "Starten"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "Ausgabe löschen"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr "Rückgängig machen"
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr "Editor-Puffer auswählen"
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr "LuaException: %1"
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "Gelöscht %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr "Konnte %1 nicht löschen"
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+"Fehlender Skript-Kopfbereich. \n"
+"Das Skript benötigt eine '{ardour}' Informationstabelle und eine `factory` "
+"Funktion."
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr "Skript lässt sich nicht kompilieren."
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr "Ungültiger oder"
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+"Ungültiger Skripttyp.\n"
+"Gültige Typen sind 'EditorAction' und 'Snippet'."
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "Als %1 gespeichert"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "Fehler beim Speichern der Datei: %1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+"Ein Skript mit diesem Namen existiert bereits.\n"
+"Verwenden Sie einen anderen Namen im Deskriptor."
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr "Zwischenspeicher %1"
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "Aktion: '%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr "Schnipsel: %1"
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "Speichern unter"
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr "%1 konnte nicht zum Audiobackend verbinden."
-#: main.cc:133 main.cc:149
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr "Das Audiobackend (%1) funktioniert nicht oder wurde beendet"
-#: main.cc:136
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -7455,11 +8334,11 @@ msgstr ""
"\n"
"Klicke OK, um %1 zu verlassen."
-#: main.cc:150
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr "%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet "
-#: main.cc:245
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
@@ -7467,23 +8346,23 @@ msgstr ""
"\n"
" %1 konnte Ihre Kommandozeile nicht verstehen "
-#: main.cc:247
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr "Während des Programmstarts von %1 ist ein Fehler aufgetreten"
-#: main.cc:340
+#: main.cc:350
msgid " (built using "
msgstr " (kompiliert mit Version "
-#: main.cc:343
+#: main.cc:353
msgid " and GCC version "
msgstr " und GCC Version"
-#: main.cc:353
+#: main.cc:363
msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr "Copyright (C) 1999-2015 Paul Davis"
-#: main.cc:354
+#: main.cc:364
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -7491,38 +8370,38 @@ msgstr ""
"Einige Teile Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
-#: main.cc:356
+#: main.cc:366
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 wird Ihnen ohne jegliche Gewährleistung"
-#: main.cc:357
+#: main.cc:367
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
"für allgemeine oder spezielle Gebrauchstauglichkeit zur Verfügung gestellt."
-#: main.cc:358
+#: main.cc:368
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Dies ist freie Software, die Sie gerne weitergeben dürfen,"
-#: main.cc:359
+#: main.cc:369
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"solange Sie sich an die Bedingungen, die in der Datei COPYING aufgeführt "
"sind, halten."
-#: main.cc:364
+#: main.cc:374
msgid "could not initialize %1."
msgstr "Konnte %1 nicht initialisieren."
-#: main.cc:374
+#: main.cc:384
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Kann die SIGPIPE Fehlerbehandlung nicht installieren"
-#: main.cc:379
+#: main.cc:391
msgid "Could not complete pre-GUI initialization"
msgstr "Konnte Initialisierung (pre-GUI) nicht abschlieÃen"
-#: main.cc:386
+#: main.cc:398
msgid "could not create %1 GUI"
msgstr "konnte das %1 GUI nicht erstellen"
@@ -7530,11 +8409,11 @@ msgstr "konnte das %1 GUI nicht erstellen"
msgid "Display delta to edit cursor"
msgstr "Zeige Abstand zu Arbeitspunkt"
-#: main_clock.cc:66 tempo_dialog.cc:54
+#: main_clock.cc:66 tempo_dialog.cc:55
msgid "Edit Tempo"
msgstr "Tempo bearbeiten"
-#: main_clock.cc:67 tempo_dialog.cc:326
+#: main_clock.cc:67 tempo_dialog.cc:429
msgid "Edit Meter"
msgstr "Taktart bearbeiten"
@@ -7551,8 +8430,8 @@ msgid "MarkerText"
msgstr "MarkerText"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:2017
-#: rc_option_editor.cc:2663 sfdb_ui.cc:670
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Kein"
@@ -7743,83 +8622,79 @@ msgstr "Portname:"
msgid "MidiPortDialog"
msgstr "MidiPortDialog"
-#: midi_region_view.cc:849
+#: midi_region_view.cc:855
msgid "channel edit"
msgstr "Kanal editieren"
-#: midi_region_view.cc:885
+#: midi_region_view.cc:891
msgid "velocity edit"
msgstr "Velocity bearbeiten"
-#: midi_region_view.cc:944
+#: midi_region_view.cc:958
msgid "add note"
msgstr "Note hinzufügen"
-#: midi_region_view.cc:1872
+#: midi_region_view.cc:1902
msgid "step add"
msgstr "Schritt hinzufügen"
-#: midi_region_view.cc:1966 midi_region_view.cc:1989
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
msgid "alter patch change"
msgstr "Patch Change ändern"
-#: midi_region_view.cc:2025
+#: midi_region_view.cc:2055
msgid "add patch change"
msgstr "Patch Change hinzufügen"
-#: midi_region_view.cc:2047 midi_region_view.cc:2048
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
msgid "move patch change"
msgstr "Patch Change verschieben"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
msgid "delete patch change"
msgstr "Patch Change löschen"
-#: midi_region_view.cc:2099
+#: midi_region_view.cc:2129
msgid "delete selection"
msgstr "Auswahl löschen"
-#: midi_region_view.cc:2116
+#: midi_region_view.cc:2146
msgid "delete note"
msgstr "Note löschen"
-#: midi_region_view.cc:2575
+#: midi_region_view.cc:2587
msgid "move notes"
msgstr "Noten verschieben"
-#: midi_region_view.cc:3110
+#: midi_region_view.cc:3137
msgid "change velocities"
msgstr "Velocity ändern"
-#: midi_region_view.cc:3176
+#: midi_region_view.cc:3203
msgid "transpose"
msgstr "Transponieren"
-#: midi_region_view.cc:3204
+#: midi_region_view.cc:3231
msgid "change note lengths"
msgstr "Notenlänge ändern"
-#: midi_region_view.cc:3280
+#: midi_region_view.cc:3307
msgid "nudge"
msgstr "Verschieben"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3322
msgid "change channel"
msgstr "Kanal ändern"
-#: midi_region_view.cc:3333
+#: midi_region_view.cc:3370
msgid "Bank "
msgstr "Bank"
-#: midi_region_view.cc:3334
-msgid "Program "
-msgstr "Programm"
-
-#: midi_region_view.cc:3335
+#: midi_region_view.cc:3372
msgid "Channel "
msgstr "Kanal"
-#: midi_region_view.cc:3522
+#: midi_region_view.cc:3559
msgid "paste"
msgstr "Einfügen"
@@ -7835,108 +8710,108 @@ msgstr "versuche, eine MIDI Region ohne Datenmodell darzustellen"
msgid "failed to create MIDI region"
msgstr "konnte MIDI-Region nicht erzeugen"
-#: midi_time_axis.cc:316
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "Externes MIDI-Gerät"
-#: midi_time_axis.cc:317
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "Modus Externes Gerät"
-#: midi_time_axis.cc:325
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr "Chns"
-#: midi_time_axis.cc:327
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr "Klicke, um Kanaleinstellungen zu bearbeiten"
-#: midi_time_axis.cc:526
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "Ganzen Bereich anzeigen"
-#: midi_time_axis.cc:531
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "Auf Inhalt anpassen"
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "Notenbereich"
-#: midi_time_axis.cc:536
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "Noten-Modus"
-#: midi_time_axis.cc:537
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr "Kanalauswahl"
-#: midi_time_axis.cc:542
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Farbmodus"
-#: midi_time_axis.cc:601
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr "Bender"
-#: midi_time_axis.cc:605
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "Druckdaten"
-#: midi_time_axis.cc:617
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr "Controller"
-#: midi_time_axis.cc:622
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "Keine MIDI-Kanäle ausgewählt"
-#: midi_time_axis.cc:679 midi_time_axis.cc:808
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "Alle Kanäle verbergen"
-#: midi_time_axis.cc:683 midi_time_axis.cc:812
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "Alle Kanäle anzeigen"
-#: midi_time_axis.cc:694 midi_time_axis.cc:823
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "Kanal %1"
-#: midi_time_axis.cc:949 midi_time_axis.cc:981
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "Controller %1-%2"
-#: midi_time_axis.cc:972 midi_time_axis.cc:975
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr "Controller %1"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "Sustain"
-#: midi_time_axis.cc:1005
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "Perkussiv"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "Nach Lautstärke"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "Kanalfarben"
-#: midi_time_axis.cc:1039
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Spurfarbe"
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1620 midi_time_axis.cc:1630
-#: midi_time_axis.cc:1636
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr "alle"
-#: midi_time_axis.cc:1617 midi_time_axis.cc:1633
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr "einige"
@@ -7952,7 +8827,7 @@ msgstr "Auto-Scroll"
msgid "Decimal"
msgstr "Dezimal"
-#: midi_tracer.cc:57 rc_option_editor.cc:1355
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "Aktiviert"
@@ -7992,7 +8867,8 @@ msgstr "Alle fehlenden Dateien überspringen"
msgid "Skip this file"
msgstr "Diese Datei überspringen"
-#: missing_file_dialog.cc:57
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "Audio"
@@ -8028,92 +8904,45 @@ msgstr "Fehlende Plugins"
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Im Mixer ausgewählte Spuren/Busse auf Solo schalten"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Stummschaltung der im Mixer ausgewählten Spuren/Busse ändern"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Aufnahmebereitschaft auf im Mixer ausgewählten Spuren ändern"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse reduzieren"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse erhöhen"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse auf 0dB setzen"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Ausgewählte Prozessoren kopieren"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Ausgewählte Prozessoren ausschneiden"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Ausgewählte Prozessoren einfügen"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Ausgewählte Prozessoren löschen"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Alle (sichtbaren) Prozessoren auswählen"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Ausgewählte Prozessoren umschalten"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Ausgewählte Plugins umschalten "
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "Alle Kanalzüge und Prozessoren deselektieren"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Mixerfenster nach links scrollen"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "MIDI Eingang für im Mixer ausgewählte Spuren/Busse de/aktivieren"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Mixer-Tastenkürzel aus %1 geladen"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
+"Folgende Plugins dieses Projekts können auf diesem System nicht gefunden "
+"werden:\n"
+"\n"
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Konnte mixer.bindings im Suchpfad %1 nicht finden"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+"\n"
+"Diese Plugins werden durch inaktive Platzhalter ersetzt.\n"
+"Es wird empfohlen, die fehlenden Plugins zu installieren und das Projekt neu "
+"zu laden.\n"
+"(Ãberprüfen Sie auch die Blacklist, Fenster > Log und Globale Einstellungen "
+"> Plugins)"
-#: mixer_strip.cc:98 mixer_strip.cc:129
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "Pre"
-#: mixer_strip.cc:101 mixer_strip.cc:132 mixer_strip.cc:387
-#: mixer_strip.cc:1470 rc_option_editor.cc:2949
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1548
+#: mixer_strip.cc:1559 rc_option_editor.cc:3147
msgid "Comments"
msgstr "Kommentare"
-#: mixer_strip.cc:155
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr "Klicken Sie, um die Breite dieses Kanalzuges umzuschalten"
-#: mixer_strip.cc:157
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -8121,298 +8950,397 @@ msgstr ""
"\n"
"%1-%2-Klicken Sie, um die Breite aller Kanalzüge umzuschalten."
-#: mixer_strip.cc:164
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr "Diesen Kanalzug verbergen"
-#: mixer_strip.cc:175
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr "Abgreifpunkt der Pegelanzeige auswählen"
-#: mixer_strip.cc:191
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr "Solo isolieren"
-#: mixer_strip.cc:199
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr "Solostatus sperren"
-#: mixer_strip.cc:201 mixer_strip.cc:2113
+#: mixer_strip.cc:208 mixer_strip.cc:2225
msgid "SoloLock|Lock"
msgstr "Lock"
-#: mixer_strip.cc:202 mixer_strip.cc:2112
+#: mixer_strip.cc:209 mixer_strip.cc:2224
msgid "Iso"
msgstr "Iso"
-#: mixer_strip.cc:256
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "Bearbeitungsgruppe"
-#: mixer_strip.cc:266
+#: mixer_strip.cc:275
msgid "Trim: "
msgstr "Anpassen: "
-#: mixer_strip.cc:383 rc_option_editor.cc:2945
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
msgid "Phase Invert"
msgstr "Phaseninvertierung"
-#: mixer_strip.cc:384 rc_option_editor.cc:2946
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
msgid "Record & Monitor"
msgstr "Aufnahme & Monitor..."
-#: mixer_strip.cc:385 rc_option_editor.cc:2947
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
msgid "Solo Iso / Lock"
msgstr "Solo Iso / Sperre"
-#: mixer_strip.cc:507
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr "VCA Zuweisungen"
+
+#: mixer_strip.cc:545
msgid "Show/Hide Monitoring Section"
msgstr "Zeige/Verstecke Monitorsektion"
-#: mixer_strip.cc:559
+#: mixer_strip.cc:590
msgid "Enable/Disable MIDI input"
msgstr "Aktiviert/Deaktiviert MIDI Input"
-#: mixer_strip.cc:726
+#: mixer_strip.cc:756
msgid "Aux"
msgstr "Aux"
-#: mixer_strip.cc:752
+#: mixer_strip.cc:782
msgid "Snd"
msgstr "Snd"
-#: mixer_strip.cc:823 mixer_strip.cc:926 processor_box.cc:2650
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
"Nicht mit Audioengine verbunden - es sind keine Ãnderungen an Ein-/Ausgängen "
"möglich"
-#: mixer_strip.cc:880 mixer_strip.cc:982
+#: mixer_strip.cc:911 mixer_strip.cc:1014
msgid "Add %1 port"
msgstr "%1-Port hinzufügen"
-#: mixer_strip.cc:887 mixer_strip.cc:989 monitor_section.cc:1342
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr "Verbindungsraster"
-#: mixer_strip.cc:1218
+#: mixer_strip.cc:1298
msgid "MIDI "
msgstr "MIDI"
-#: mixer_strip.cc:1223
+#: mixer_strip.cc:1302
msgid "<b>INPUT</b> to %1"
msgstr "<b>EINGANG</b> zu %1"
-#: mixer_strip.cc:1226 monitor_section.cc:1387
+#: mixer_strip.cc:1304 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>AUSGANG</b> von %1"
-#: mixer_strip.cc:1344 monitor_section.cc:1474
+#: mixer_strip.cc:1417 monitor_section.cc:1598
msgid "Disconnected"
msgstr "Getrennt"
-#: mixer_strip.cc:1473
-msgid "*Comments*"
-msgstr "*Kommentare*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr "Hier klicken, um einen Kommentar hinzuzufügen"
-#: mixer_strip.cc:1480
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
msgid "Cmt"
msgstr "Kmt"
-#: mixer_strip.cc:1483
-msgid "*Cmt*"
-msgstr "*Kmt*"
-
-#: mixer_strip.cc:1489
-msgid "Click to add/edit comments"
-msgstr "Hier klicken, um einen Kommentar hinzuzufügen"
-
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1604
msgid "Grp"
msgstr "Grp"
-#: mixer_strip.cc:1536
+#: mixer_strip.cc:1607
msgid "~G"
msgstr "~G"
-#: mixer_strip.cc:1565 route_time_axis.cc:573
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Farbe..."
-#: mixer_strip.cc:1567 route_time_axis.cc:575
+#: mixer_strip.cc:1650 route_time_axis.cc:587
msgid "Comments..."
msgstr "Kommentare"
-#: mixer_strip.cc:1569 route_time_axis.cc:577
+#: mixer_strip.cc:1652 route_time_axis.cc:589
msgid "Inputs..."
msgstr "Eingänge..."
-#: mixer_strip.cc:1571 route_time_axis.cc:579
+#: mixer_strip.cc:1654 route_time_axis.cc:591
msgid "Outputs..."
msgstr "Ausgänge..."
-#: mixer_strip.cc:1576
+#: mixer_strip.cc:1659
msgid "Save As Template..."
msgstr "Als Vorlage Speichern..."
-#: mixer_strip.cc:1582 route_group_dialog.cc:45 route_time_axis.cc:853
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
msgid "Active"
msgstr "Aktiv"
-#: mixer_strip.cc:1590
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "Striktes E/A"
+
+#: mixer_strip.cc:1683 plugin_ui.cc:424 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "Pin-Verbindungen..."
+
+#: mixer_strip.cc:1687
msgid "Adjust Latency..."
msgstr "Latenz einstellen..."
-#: mixer_strip.cc:1593
+#: mixer_strip.cc:1690
msgid "Protect Against Denormals"
msgstr "Schütze vor Denormals"
-#: mixer_strip.cc:1599 route_time_axis.cc:592
-msgid "Remote Control ID..."
-msgstr "ID für Fernsteuerung..."
-
-#: mixer_strip.cc:1617 route_time_axis.cc:869
+#: mixer_strip.cc:1709 route_time_axis.cc:867
msgid "Duplicate..."
msgstr "Duplizieren..."
-#: mixer_strip.cc:1905
+#: mixer_strip.cc:2004
msgid "Pre"
msgstr "Pre"
-#: mixer_strip.cc:1909
+#: mixer_strip.cc:2008
msgid "Post"
msgstr "Post"
-#: mixer_strip.cc:1925
+#: mixer_strip.cc:2024
msgid "Meter|In"
msgstr "In"
-#: mixer_strip.cc:1929
+#: mixer_strip.cc:2028
msgid "Meter|Pr"
msgstr "Pr"
-#: mixer_strip.cc:1933
+#: mixer_strip.cc:2032
msgid "Meter|Po"
msgstr "Po"
-#: mixer_strip.cc:1937
+#: mixer_strip.cc:2036
msgid "Meter|O"
msgstr "O"
-#: mixer_strip.cc:1942
+#: mixer_strip.cc:2041
msgid "Meter|C"
msgstr "C"
-#: mixer_strip.cc:2090 route_ui.cc:181
+#: mixer_strip.cc:2202 route_ui.cc:197
msgid "Disk"
msgstr "Disk"
-#: mixer_strip.cc:2092
+#: mixer_strip.cc:2204
msgid "Mon"
msgstr "Mon"
-#: mixer_strip.cc:2105 monitor_section.cc:80
+#: mixer_strip.cc:2217 monitor_section.cc:81
msgid "AFL"
msgstr "AFL"
-#: mixer_strip.cc:2108 monitor_section.cc:81
+#: mixer_strip.cc:2220 monitor_section.cc:82
msgid "PFL"
msgstr "PFL"
-#: mixer_strip.cc:2118 meter_strip.cc:387
+#: mixer_strip.cc:2230 meter_strip.cc:385
msgid "MonitorInput|I"
msgstr "I"
-#: mixer_strip.cc:2119 meter_strip.cc:388
+#: mixer_strip.cc:2231 meter_strip.cc:386
msgid "MonitorDisk|D"
msgstr "D"
-#: mixer_strip.cc:2121
+#: mixer_strip.cc:2233
msgid "Mon|O"
msgstr "O"
-#: mixer_strip.cc:2134 meter_strip.cc:379 route_time_axis.cc:2738
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
msgid "AfterFader|A"
msgstr "A"
-#: mixer_strip.cc:2137
+#: mixer_strip.cc:2249
msgid "Prefader|P"
msgstr "P"
-#: mixer_strip.cc:2142
+#: mixer_strip.cc:2254
msgid "SoloIso|I"
msgstr "I"
-#: mixer_strip.cc:2143
+#: mixer_strip.cc:2255
msgid "SoloLock|L"
msgstr "L"
-#: mixer_strip.cc:2348
+#: mixer_strip.cc:2460
msgid "Pre Fader"
msgstr "Pre Fader"
-#: mixer_strip.cc:2349
+#: mixer_strip.cc:2461
msgid "Post Fader"
msgstr "Post Fader"
-#: mixer_strip.cc:2394 meter_strip.cc:860
+#: mixer_strip.cc:2506 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr "Alle in Gruppe zu %1 ändern"
-#: mixer_strip.cc:2396 meter_strip.cc:862
+#: mixer_strip.cc:2508 meter_strip.cc:860
msgid "Change all to %1"
msgstr "Alle zu %1 ändern"
-#: mixer_strip.cc:2398 meter_strip.cc:864
+#: mixer_strip.cc:2510 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr "Gleichen Spurtyp zu %1 ändern"
-#: mixer_ui.cc:134 route_time_axis.cc:830
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Gruppe"
-#: mixer_ui.cc:199
+#: mixer_ui.cc:221
msgid "Favorite Plugins"
msgstr "Plugin-Favoriten"
-#: mixer_ui.cc:1289
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr "Fehler beim Hinzufügen von GUI-Elementen für neue Spuren/Busse %1"
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr ""
"Konnte Bezeichnung für umbenannten Kanalzug nicht in der Spurliste finden!"
-#: mixer_ui.cc:1383
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-alle-"
-#: mixer_ui.cc:2034
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Kanalzüge"
-#: meter_strip.cc:161
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr "Kein(e) Spur/Bus selektiert"
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "Am Anfang hinzufügen"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "Vor dem Fader hinzufügen"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "Nach dem Fader hinzufügen"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "Am Ende hinzufügen"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Von Favoriten entfernen"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Preset löschen"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Im Mixer ausgewählte Spuren/Busse auf Solo schalten"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Stummschaltung der im Mixer ausgewählten Spuren/Busse ändern"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "Aufnahmebereitschaft auf im Mixer ausgewählten Spuren ändern"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse reduzieren"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse erhöhen"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse auf 0dB setzen"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Ausgewählte Prozessoren kopieren"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Ausgewählte Prozessoren ausschneiden"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Ausgewählte Prozessoren einfügen"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Ausgewählte Prozessoren löschen"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Alle (sichtbaren) Prozessoren auswählen"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Ausgewählte Prozessoren umschalten"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Ausgewählte Plugins umschalten "
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Alle Kanalzüge und Prozessoren deselektieren"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Mixerfenster nach links scrollen"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "MIDI Eingang für im Mixer ausgewählte Spuren/Busse de/aktivieren"
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr "Peaks zurücksetzen"
-#: meter_strip.cc:382 route_time_axis.cc:2742
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
msgid "PreFader|P"
msgstr "P"
-#: meter_strip.cc:896
+#: meter_strip.cc:894
msgid "Variable height"
msgstr "Variable Höhe"
-#: meter_strip.cc:897
+#: meter_strip.cc:895
msgid "Short"
msgstr "Short"
-#: meter_strip.cc:898
+#: meter_strip.cc:896
msgid "Tall"
msgstr "Tall"
-#: meter_strip.cc:899
+#: meter_strip.cc:897
msgid "Grande"
msgstr "Grande"
-#: meter_strip.cc:900
+#: meter_strip.cc:898
msgid "Venti"
msgstr "Venti"
@@ -8460,23 +9388,23 @@ msgstr "K12/RMS"
msgid "VU"
msgstr "VU"
-#: monitor_section.cc:79
+#: monitor_section.cc:80
msgid "SiP"
msgstr "SiP"
-#: monitor_section.cc:108 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "Soloing"
-#: monitor_section.cc:112
+#: monitor_section.cc:117
msgid "Isolated"
msgstr "Isoliert"
-#: monitor_section.cc:116
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr "Vorhören"
-#: monitor_section.cc:127
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -8484,7 +9412,7 @@ msgstr ""
"Wenn aktiv, ist etwas auf isoliertes Solo geschalten.\n"
"Klick, schaltet isoliertes Solo überall aus."
-#: monitor_section.cc:130
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -8492,32 +9420,32 @@ msgstr ""
"Wird beim Vorhören aktiv.\n"
"Klicken stoppt das Vorhören."
-#: monitor_section.cc:147
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr "Solo-Kontrollelemente beeinflussen solo-in-place"
-#: monitor_section.cc:153
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr "Solo-Kontrollelemente schalten AFL um"
-#: monitor_section.cc:159
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr "Solo-Kontrollelemente schalten PFL um"
-#: monitor_section.cc:165
+#: monitor_section.cc:170
msgid "Excl. Solo"
msgstr "Exkl. Solo"
-#: monitor_section.cc:167
+#: monitor_section.cc:172
msgid "Exclusive solo means that only 1 solo is active at a time"
msgstr ""
"Exklusives Solo bedeutet, daà nur ein Solo zu einem Zeitpunkt aktiv ist"
-#: monitor_section.cc:174
+#: monitor_section.cc:179
msgid "Solo » Mute"
msgstr "Solo » Mute"
-#: monitor_section.cc:176
+#: monitor_section.cc:181
msgid ""
"If enabled, solo will override mute\n"
"(a soloed & muted track or bus will be audible)"
@@ -8525,32 +9453,40 @@ msgstr ""
"Wenn aktiviert, hat Solo Priorität über Mute\n"
"(eine Spur mit aktiviertem Mute & Solo ist hörbar)"
-#: monitor_section.cc:194
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr "Prozessoren"
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr "Effektprozessoren in der Monitorsektion erlauben"
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr "Erhöhung der Lautstärke für Solosignale (0dB ist üblich)"
-#: monitor_section.cc:199 monitor_section.cc:216 monitor_section.cc:234
-#: monitor_section.cc:281
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
msgid "0 dB"
msgstr "0 dB"
-#: monitor_section.cc:200
+#: monitor_section.cc:211
msgid "3 dB"
msgstr "3 dB"
-#: monitor_section.cc:201
+#: monitor_section.cc:212
msgid "6 dB"
msgstr "6 dB"
-#: monitor_section.cc:202
+#: monitor_section.cc:213
msgid "10 dB"
msgstr "10 dB"
-#: monitor_section.cc:204
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr "Solo Boost"
-#: monitor_section.cc:211
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
@@ -8558,99 +9494,103 @@ msgstr ""
"Reduzierung der Lautstärke für Signale, die nicht Solo geschalten sind.\n"
"Ein Wert über -inf dB bedeutet \"solo-in-front\""
-#: monitor_section.cc:217 monitor_section.cc:236 monitor_section.cc:283
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
msgid "-6 dB"
msgstr "-6 dB"
-#: monitor_section.cc:218 monitor_section.cc:237 monitor_section.cc:284
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
msgid "-12 dB"
msgstr "-12 dB"
-#: monitor_section.cc:219 monitor_section.cc:238 monitor_section.cc:285
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
msgid "-20 dB"
msgstr "-20 dB"
-#: monitor_section.cc:220
+#: monitor_section.cc:231
msgid "OFF"
msgstr "OFF"
-#: monitor_section.cc:222
+#: monitor_section.cc:233
msgid "SiP Cut"
msgstr "SiP Cut"
-#: monitor_section.cc:229
+#: monitor_section.cc:240
msgid "Gain reduction to use when dimming monitor outputs"
msgstr "Lautstärkereduzierung beim Abschwächen der Monitorausgänge"
-#: monitor_section.cc:235 monitor_section.cc:282
+#: monitor_section.cc:245 monitor_section.cc:290
msgid "-3 dB"
msgstr "-3 dB"
-#: monitor_section.cc:240 monitor_section.cc:255 monitor_section.cc:317
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
msgid "Dim"
msgstr "Dim"
-#: monitor_section.cc:286
+#: monitor_section.cc:294
msgid "-30 dB"
msgstr "-30 dB"
-#: monitor_section.cc:325
+#: monitor_section.cc:333
msgid "Inv"
msgstr "Inv"
-#: monitor_section.cc:387
+#: monitor_section.cc:399 port_group.cc:552
msgid "Monitor"
msgstr "Monitor"
-#: monitor_section.cc:825
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr "Monitor auf Mono schalten"
-#: monitor_section.cc:828
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr "Monitor stummschalten"
-#: monitor_section.cc:831
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr "Monitor abschwächen"
-#: monitor_section.cc:834
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr "Exklusives Solo umschalten"
-#: monitor_section.cc:840
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr "Mute-Status hat höhere Priorität als Solo-Modus"
-#: monitor_section.cc:852
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "Monitorkanal %1 stummschalten"
-#: monitor_section.cc:857
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr "Monitorkanal %1 abschwächen"
-#: monitor_section.cc:862
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr "Monitorkanal %1 Solo"
-#: monitor_section.cc:867
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr "Invertiere Monitorkanal %1"
-#: monitor_section.cc:877
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr "In-Place Solo"
-#: monitor_section.cc:879
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr "Solo nach Fader (AFL) abhören"
-#: monitor_section.cc:881
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr "Solo vor Fader (PFL) abhören"
-#: monitor_section.cc:1289
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr "Prozessorbox der Monitorsektion de/aktivieren"
+
+#: monitor_section.cc:1413
msgid "No session - no I/O changes are possible"
msgstr "Kein Projekt - es sind keine Ãnderungen an Ein-/Ausgängen möglich"
@@ -8658,31 +9598,29 @@ msgstr "Kein Projekt - es sind keine Ãnderungen an Ein-/Ausgängen möglich"
msgid "Monitor output selector"
msgstr "Auswahl des Monitorausgangs"
-#: mono_panner.cc:103 stereo_panner.cc:113
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr "überbrückt"
-#: mono_panner.cc:117
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr "L:%3d R:%3d"
-#: mono_panner.cc:201 panner2d.cc:276 stereo_panner.cc:250
-#: stereo_panner.cc:273
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
msgid "Panner|L"
msgstr "L"
-#: mono_panner.cc:218 panner2d.cc:277 stereo_panner.cc:248
-#: stereo_panner.cc:275
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
msgid "Panner|R"
msgstr "R"
-#: mono_panner_editor.cc:33
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr "Mono Panner"
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
msgid "%"
msgstr "%"
@@ -8760,10 +9698,6 @@ msgstr ""
"passieren. Die weitere Entwicklung hängt allerdings von einem stabilen\n"
"und verlässlichen Einkommen ab. Danke, dass Sie Ardour verwenden!"
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Neues Preset"
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr "Ersetze vorhandenes Preset mit diesem Namen"
@@ -8772,6 +9706,10 @@ msgstr "Ersetze vorhandenes Preset mit diesem Namen"
msgid "Name of new preset"
msgstr "Name für neues Preset"
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr "Nur neuer Favorit"
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "Regionen normalisieren"
@@ -8780,9 +9718,9 @@ msgstr "Regionen normalisieren"
msgid "Normalize region"
msgstr "Region normalisieren"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
-msgid "dbFS"
-msgstr "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalisieren auf:"
#: normalize_dialog.cc:56
msgid "Normalize each region using its own peak value"
@@ -8908,13 +9846,13 @@ msgstr " -C, --curvetest filename Curve algorithm debugger\n"
#: opts.cc:82
msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-" -k, --keybindings dateiname Dateiname für die Tastaturbelegungen"
+" -k, --keybindings dateiname Dateiname für die Tastaturbelegungen\n"
#: panner2d.cc:896
msgid "Panner (2D)"
msgstr "Panner (2D)"
-#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:465
msgid "Bypass"
msgstr "Bypass"
@@ -8970,39 +9908,161 @@ msgstr "nicht zugewiesen"
msgid "Imported"
msgstr "Importierte"
-#: plugin_eq_gui.cc:83 plugin_eq_gui.cc:107
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
msgid "dB scale"
msgstr "dB Skala"
-#: plugin_eq_gui.cc:114
+#: plugin_eq_gui.cc:124
msgid "Show phase"
msgstr "Zeige Phase"
-#: plugin_selector.cc:54 plugin_selector.cc:304
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "Manuelle Konfiguration"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr "Sidechain"
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr "-"
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr "Audio-Eingangspins"
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr "MIDI Eingangspins"
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr "zences"
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr "Audio Ausgang"
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr "MIDI Ausgang"
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr "Ausgangspresets"
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr "Sidechain-Eingang hinzufügen"
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "Automatisch"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 Kanal"
+msgstr[1] "%1 Kanäle"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "Send"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr "Latenz %1 spl%2 %3"
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr "kein-inplace"
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr "Latenz %1 spl"
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr "Instanz #%1"
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr "Kann keinen neuen Send erstellen: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr "SC %1 (%2)"
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "Pin Konfiguration: %1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "Plugin-Einrichtung"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr "Kopiere E/A-Zuordnung"
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr "Es ist bereits ein Instrumentenplugin vorhanden."
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr "Ersetzen"
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr "mit"
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr "E/A-Pin Zuordnung"
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr "Konfiguriere Plugin '%1'"
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "Ausgangskonfiguration"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "Name enthält"
-#: plugin_selector.cc:55 plugin_selector.cc:308
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "Typ enthält"
-#: plugin_selector.cc:56 plugin_selector.cc:306
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr "Kategorie enthält"
-#: plugin_selector.cc:57 plugin_selector.cc:328
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "Autor enthält"
-#: plugin_selector.cc:58 plugin_selector.cc:330
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "Katalog enthält"
-#: plugin_selector.cc:59 plugin_selector.cc:260 plugin_selector.cc:606
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "nur Favoriten"
-#: plugin_selector.cc:60 plugin_selector.cc:264 plugin_selector.cc:606
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "Nur versteckte"
@@ -9010,100 +10070,100 @@ msgstr "Nur versteckte"
msgid "Plugin Manager"
msgstr "Alle Plugins ..."
-#: plugin_selector.cc:94
+#: plugin_selector.cc:96
msgid "Fav"
msgstr "Fav"
-#: plugin_selector.cc:96
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr "Verfügbare Plugins"
-#: plugin_selector.cc:97
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Typ"
-#: plugin_selector.cc:98
+#: plugin_selector.cc:100
msgid "Category"
msgstr "Kategorie"
-#: plugin_selector.cc:99
+#: plugin_selector.cc:101
msgid "Creator"
msgstr "Ersteller"
-#: plugin_selector.cc:100
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr "# Audio In"
-#: plugin_selector.cc:101
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr "# Audio Out"
-#: plugin_selector.cc:102
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr "# MIDI In"
-#: plugin_selector.cc:103
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr "# MIDI Out"
-#: plugin_selector.cc:125
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "Plugins, die verbunden werden"
-#: plugin_selector.cc:138
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Plugin zur Effektliste hinzufügen"
-#: plugin_selector.cc:142
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Plugin aus der Effektliste entfernen"
-#: plugin_selector.cc:154
+#: plugin_selector.cc:161
msgid "Show Hidden"
msgstr "Verborgene anzeigen"
-#: plugin_selector.cc:156
+#: plugin_selector.cc:163
msgid "Include hidden plugins in list."
msgstr "Verborhene Plugins in Liste einbeziehen."
-#: plugin_selector.cc:159
+#: plugin_selector.cc:166
msgid "Instruments"
msgstr "Instrumente"
-#: plugin_selector.cc:161
+#: plugin_selector.cc:168
msgid "Cycle display of instrument plugins (if any)."
msgstr "Anzeige von Instrumenten-Plugins umschalten (falls vorhanden)."
-#: plugin_selector.cc:164
+#: plugin_selector.cc:171
msgid "Analyzers"
msgstr "Analyzer"
-#: plugin_selector.cc:166
+#: plugin_selector.cc:173
msgid "Cycle display of analysis plugins (if any)."
msgstr "Anzeige von Analyse-Plugins umschalten (falls vorhanden)."
-#: plugin_selector.cc:169
+#: plugin_selector.cc:176
msgid "Utils"
msgstr "Hilfsmittel"
-#: plugin_selector.cc:171
+#: plugin_selector.cc:178
msgid "Cycle display of utility plugins (if any)."
msgstr "Anzeige von Utility-Plugins umschalten (falls vorhanden)."
-#: plugin_selector.cc:201
+#: plugin_selector.cc:208
msgid "Filter"
msgstr "Filter"
-#: plugin_selector.cc:214
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "Plugin(s) einfügen"
-#: plugin_selector.cc:412 plugin_selector.cc:413 plugin_selector.cc:414
-#: plugin_selector.cc:415
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr "variabel"
-#: plugin_selector.cc:565
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -9113,27 +10173,27 @@ msgstr ""
"\n"
"Im Logfenster befinden sich möglicherweise mehr Informationen"
-#: plugin_selector.cc:723
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "Favoriten"
-#: plugin_selector.cc:725
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "Plugin Manager..."
-#: plugin_selector.cc:729
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Nach Urheber"
-#: plugin_selector.cc:732
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Nach Kategorie"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:115
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!"
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:124 plugin_ui.cc:229
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
@@ -9141,11 +10201,11 @@ msgstr ""
"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
"unterstützt keine VST-Plugins)"
-#: plugin_ui.cc:125
+#: plugin_ui.cc:127
msgid "unknown type of editor-supplying plugin"
msgstr "Unbekannter Plugintyp"
-#: plugin_ui.cc:257
+#: plugin_ui.cc:259
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
@@ -9153,23 +10213,23 @@ msgstr ""
"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
"unterstützt keine linuxVST-Plugins)"
-#: plugin_ui.cc:329
+#: plugin_ui.cc:331
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr "create_lv2_editor auf nicht-LV2-Plugin angewandt"
-#: plugin_ui.cc:418
+#: plugin_ui.cc:419
msgid "Add"
msgstr "Hinzufügen"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:425
msgid "Description"
msgstr "Beschreibung"
-#: plugin_ui.cc:424
+#: plugin_ui.cc:426
msgid "Plugin analysis"
msgstr "Pluginanalyse"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:433
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
@@ -9177,30 +10237,34 @@ msgstr ""
"Presets (falls existent) für dieses Plugin\n"
"(Hersteller- und Benutzerpresets)"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:434
msgid "Save a new preset"
msgstr "Neues Preset speichern"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:435
msgid "Save the current preset"
msgstr "Momentanes Preset speichern"
-#: plugin_ui.cc:434
+#: plugin_ui.cc:436
msgid "Delete the current preset"
msgstr "Lösche das aktuelle Preset"
-#: plugin_ui.cc:435
+#: plugin_ui.cc:437
msgid ""
"Reset parameters to default (if no parameters are in automation play mode)"
msgstr ""
"Parameter auf Vorgabewert zurücksetzen (falls keine Parameter im Automations-"
"Wiedergabemodus sind)"
-#: plugin_ui.cc:436
+#: plugin_ui.cc:439
+msgid "Show Plugin Pin Management Dialog"
+msgstr "Plugin Pin-Management Dialog anzeigen"
+
+#: plugin_ui.cc:441
msgid "Disable signal processing by the plugin"
msgstr "Deaktiviere die Signalverarbeitung des Plugins"
-#: plugin_ui.cc:473 plugin_ui.cc:685
+#: plugin_ui.cc:480 plugin_ui.cc:699
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -9208,25 +10272,25 @@ msgstr ""
"Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als "
"Tastenkürzel verwenden würde"
-#: plugin_ui.cc:474
+#: plugin_ui.cc:481
msgid "Click to enable/disable this plugin"
msgstr "Klicke, um dieses Plugin zu ein/auszuschalten"
-#: plugin_ui.cc:517
+#: plugin_ui.cc:524
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "Latenz (%1 Sample)"
msgstr[1] "Latenz (%1 Samples)"
-#: plugin_ui.cc:519
+#: plugin_ui.cc:526
msgid "latency (%1 ms)"
msgstr "Latenz (%1 ms)"
-#: plugin_ui.cc:530
+#: plugin_ui.cc:537
msgid "Edit Latency"
msgstr "Latenz bearbeiten"
-#: plugin_ui.cc:576
+#: plugin_ui.cc:583
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -9234,7 +10298,7 @@ msgstr ""
"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
"Sie, für eine Vollversion zu zahlen"
-#: plugin_ui.cc:584
+#: plugin_ui.cc:591
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
@@ -9242,11 +10306,15 @@ msgstr ""
"Pluginpresets werden von dieser Ausgabe des Programms nicht unterstützt, "
"weitere Informationen sind im Logfenster zu finden."
-#: plugin_ui.cc:692
+#: plugin_ui.cc:599
+msgid "New Preset"
+msgstr "Neues Preset"
+
+#: plugin_ui.cc:706
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "Klicke, um die normale Verwendung von %1 Tastaturkürzeln zu aktivieren"
-#: plugin_ui.cc:789
+#: plugin_ui.cc:813
msgid "(none)"
msgstr "(kein)"
@@ -9270,63 +10338,47 @@ msgstr "%1 Sonstige"
msgid "Other"
msgstr "Andere"
-#: port_group.cc:434 port_group.cc:435
+#: port_group.cc:435 port_group.cc:436
msgid "LTC Out"
msgstr "LTC Out"
-#: port_group.cc:438 port_group.cc:439
+#: port_group.cc:439 port_group.cc:440
msgid "LTC In"
msgstr "LTC In"
-#: port_group.cc:473
+#: port_group.cc:474
msgid "MTC in"
msgstr "MTC in"
-#: port_group.cc:476
+#: port_group.cc:477
msgid "MIDI control in"
msgstr "MIDI control in"
-#: port_group.cc:479
+#: port_group.cc:480
msgid "MIDI clock in"
msgstr "MIDI clock in"
-#: port_group.cc:482
+#: port_group.cc:483
msgid "MMC in"
msgstr "MMC in"
-#: port_group.cc:486
+#: port_group.cc:487
msgid "MTC out"
msgstr "MTC out"
-#: port_group.cc:489
+#: port_group.cc:490
msgid "MIDI control out"
msgstr "MIDI control out"
-#: port_group.cc:492
+#: port_group.cc:493
msgid "MIDI clock out"
msgstr "MIDI clock out"
-#: port_group.cc:495
+#: port_group.cc:496
msgid "MMC out"
msgstr "MMC out"
-#: port_group.cc:543
-msgid ":monitor"
-msgstr ":monitor"
-
-#: port_group.cc:559
-msgid "system:"
-msgstr "system:"
-
-#: port_group.cc:560
-msgid "alsa_pcm:"
-msgstr "alsa_pcm:"
-
-#: port_group.cc:561
-msgid "alsa_midi:"
-msgstr "alsa_midi:"
-
-#: port_group.cc:566
+#: port_group.cc:579
msgid "Scene "
msgstr "Szene"
@@ -9390,43 +10442,36 @@ msgid "Flip"
msgstr "Drehen"
#: port_matrix.cc:732
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
-msgstr ""
-"Hier kann kein Port hinzugefügt werden, da der erste Prozessor der Spur/des "
-"Busses die neue Portanzahl nicht unterstützt."
+msgid "It is not possible to add a port here."
+msgstr "Hier kann kein Port hinzugefügt werden."
-#: port_matrix.cc:735
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr "Kann Port nicht hinzufügen"
#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "Der letzte Port kann nicht entfernt werden"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "Dieser Port kann nicht entfernt werden."
+
+#: port_matrix.cc:765
msgid "Port removal not allowed"
msgstr "Entfernen des Ports nicht erlaubt"
-#: port_matrix.cc:758
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"Dieser Port kann nicht entfernt werden.\n"
-"Entweder kann das erste Plugin auf der Spur oder dem Bus \n"
-"die neue Anzahl an Eingängen nicht verarbeiten, oder das \n"
-"letzte Plugin hat mehr Ausgänge."
-
-#: port_matrix.cc:975
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "Lösche '%s'"
-#: port_matrix.cc:990
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s alle von '%s'"
-#: port_matrix.cc:1056 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "Kanal"
@@ -9438,15 +10483,15 @@ msgstr "Es gibt keine Ports, zu denen verbunden werden kann."
msgid "There are no %1 ports to connect."
msgstr "Es gibt keine %1 Ports, zu denen verbunden werden kann."
-#: processor_box.cc:162
-msgid "Send"
-msgstr "Send"
-
-#: processor_box.cc:164
+#: processor_box.cc:226
msgid "Return"
msgstr "Return"
-#: processor_box.cc:353
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr "Neuer Vorzugspreset für \"%1\""
+
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
@@ -9454,7 +10499,7 @@ msgstr ""
"\n"
"Dieses Mono-Plugin wurde %1 mal repliziert."
-#: processor_box.cc:357
+#: processor_box.cc:505 processor_box.cc:1528
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
@@ -9464,7 +10509,7 @@ msgstr ""
"Doppelklick, um GUI zu zeigen.\n"
"%2+Doppelklick , um einfaches GUI zu zeigen.%3"
-#: processor_box.cc:360
+#: processor_box.cc:508 processor_box.cc:1531
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
@@ -9472,7 +10517,7 @@ msgstr ""
"<b>%1</b>\n"
"Doppelklick, um einfaches GUI zu zeigen.%2"
-#: processor_box.cc:366
+#: processor_box.cc:514
msgid ""
"<b>%1</b>\n"
"The Plugin is not available on this system\n"
@@ -9482,32 +10527,36 @@ msgstr ""
"Das Plugin ist auf diesem System nicht verfügbar\n"
"und wurde durch einen Platzhalter ersetzt."
-#: processor_box.cc:409
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr "(%1x1) "
-#: processor_box.cc:485
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr "Inline Anzeige"
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "Alle Regler zeigen"
-#: processor_box.cc:489
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "Alle Regler verbergen"
-#: processor_box.cc:523
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr "Panner-Elemente verknüpfen"
-#: processor_box.cc:630
+#: processor_box.cc:859
msgid "on"
msgstr "an"
-#: processor_box.cc:630 rc_option_editor.cc:2978 rc_option_editor.cc:2992
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
msgid "off"
msgstr "Aus"
-#: processor_box.cc:1100
+#: processor_box.cc:1819
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -9515,25 +10564,25 @@ msgstr ""
"Rechtsklick, um Plugins, Inserts, Sends etc.\n"
"hinzuzufügen/zu editieren/zu löschen"
-#: processor_box.cc:1202
+#: processor_box.cc:1968
msgid ""
-"Adding the given processor(s) failed probably,\n"
-"because the I/O configuration of the plugins could\n"
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
"not match the configuration of this track."
msgstr ""
-"Das Hinzufügen des gegebenen Prozessors ist vermutlich misslungen,\n"
-"da die E/A-Konfiguration der Plugins nicht der Konfiguration dieser \n"
-"Spur angepasst werden konnte."
+"Drag/drop des Prozessors gescheitert. Vermutlich\n"
+"weil die E/A Konfiguration der Plugins nicht mit der\n"
+"dieser Spur übereinstimmt."
-#: processor_box.cc:1669 processor_box.cc:2055
+#: processor_box.cc:2455 processor_box.cc:2998
msgid "Plugin Incompatibility"
msgstr "Plugin-Inkompatibilität"
-#: processor_box.cc:1672
+#: processor_box.cc:2458
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "Sie haben versucht, das Plugin \"%1\" im Einschub %2 hinzuzufügen.\n"
-#: processor_box.cc:1678
+#: processor_box.cc:2464
msgid ""
"\n"
"This plugin has:\n"
@@ -9541,19 +10590,19 @@ msgstr ""
"\n"
"Dieses Plugin hat:\n"
-#: processor_box.cc:1681
+#: processor_box.cc:2467
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 MIDI Eingang\n"
msgstr[1] "\t%1 MIDI Eingänge\n"
-#: processor_box.cc:1685
+#: processor_box.cc:2471
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 Audio-Eingang\n"
msgstr[1] "\t%1 Audio-Eingänge\n"
-#: processor_box.cc:1688
+#: processor_box.cc:2474
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -9561,19 +10610,19 @@ msgstr ""
"\n"
"aber am Einfügepunkt gibt es:\n"
-#: processor_box.cc:1691
+#: processor_box.cc:2477
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 MIDI-Kanal\n"
msgstr[1] "\t%1 MIDI-Kanäle\n"
-#: processor_box.cc:1695
+#: processor_box.cc:2481
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 Audio-Kanal\n"
msgstr[1] "\t%1 Audio-Kanäle\n"
-#: processor_box.cc:1698
+#: processor_box.cc:2484
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -9581,11 +10630,7 @@ msgstr ""
"\n"
"%1 kann dieses Plugin hier nicht einfügen.\n"
-#: processor_box.cc:1735
-msgid "Cannot set up new send: %1"
-msgstr "Kann keinen neuen Send erstellen: %1"
-
-#: processor_box.cc:2058
+#: processor_box.cc:3001
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -9595,21 +10640,21 @@ msgstr ""
"nicht auf diese Weise verändern, sonst würden\n"
"die Ein-/Ausgänge nicht mehr richtig funktionieren."
-#: processor_box.cc:2258
+#: processor_box.cc:3201
msgid "Rename Processor"
msgstr "Prozessor umbenennen"
-#: processor_box.cc:2289
+#: processor_box.cc:3232
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
"Es gibt mindestens 100 E/A-Objekte mit einem Namen wie %1 - Name nicht "
"geändert"
-#: processor_box.cc:2427
+#: processor_box.cc:3383
msgid "plugin insert constructor failed"
-msgstr "Einfügen des Plugins gescheitert"
+msgstr "Einfügen des Plugins fehlgeschlagen"
-#: processor_box.cc:2438
+#: processor_box.cc:3394
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -9619,7 +10664,7 @@ msgstr ""
"kopieren, vermutlich weil die E/A Konfiguration der Plugins\n"
"nicht mit der dieser Spur übereinstimmt."
-#: processor_box.cc:2484
+#: processor_box.cc:3440
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -9627,15 +10672,15 @@ msgstr ""
"Wollen Sie wirklich alle Prozessoren von %1 entfernen?\n"
"(Dies kann nicht rückgängig gemacht werden)"
-#: processor_box.cc:2488 processor_box.cc:2513
+#: processor_box.cc:3444 processor_box.cc:3469
msgid "Yes, remove them all"
msgstr "Ja, alle löschen"
-#: processor_box.cc:2490 processor_box.cc:2515
+#: processor_box.cc:3446 processor_box.cc:3471
msgid "Remove processors"
msgstr "Prozessoren entfernen"
-#: processor_box.cc:2505
+#: processor_box.cc:3461
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9643,7 +10688,7 @@ msgstr ""
"Wollen Sie wirklich alle Pre-Fader-Prozessoren von %1 entfernen?\n"
"(Dies kann nicht rückgängig gemacht werden)"
-#: processor_box.cc:2508
+#: processor_box.cc:3464
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9651,59 +10696,59 @@ msgstr ""
"Wollen Sie wirklich alle Post-Fader-Prozessoren von %1 entfernen?\n"
"(Dies kann nicht rückgängig gemacht werden)"
-#: processor_box.cc:2696
+#: processor_box.cc:3653
msgid "New Plugin"
msgstr "Plugin einfügen"
-#: processor_box.cc:2699
+#: processor_box.cc:3656
msgid "New Insert"
msgstr "Insert einfügen"
-#: processor_box.cc:2702
+#: processor_box.cc:3659
msgid "New External Send ..."
msgstr "Neuer externer Send..."
-#: processor_box.cc:2706
+#: processor_box.cc:3663
msgid "New Aux Send ..."
msgstr "Neuer Aux-Send..."
-#: processor_box.cc:2709
+#: processor_box.cc:3666
msgid "Send Options"
msgstr "Send Optionen"
-#: processor_box.cc:2711
+#: processor_box.cc:3668
msgid "Clear (all)"
msgstr "Leeren (alle)"
-#: processor_box.cc:2713
+#: processor_box.cc:3670
msgid "Clear (pre-fader)"
msgstr "Leeren (Pre-Fader)"
-#: processor_box.cc:2715
+#: processor_box.cc:3672
msgid "Clear (post-fader)"
msgstr "Leeren (Post-Fader)"
-#: processor_box.cc:2737
+#: processor_box.cc:3702
msgid "Activate All"
msgstr "Alle aktivieren"
-#: processor_box.cc:2739
+#: processor_box.cc:3704
msgid "Deactivate All"
msgstr "Alle deaktivieren"
-#: processor_box.cc:2741
+#: processor_box.cc:3706
msgid "A/B Plugins"
msgstr "A/B Plugins"
-#: processor_box.cc:2750
+#: processor_box.cc:3719
msgid "Edit with generic controls..."
msgstr "Mit einfachen Kontrollelementen editieren..."
-#: processor_box.cc:3053
+#: processor_box.cc:4051
msgid "%1: %2 (by %3)"
msgstr "%1: %2 (von %3)"
-#: processor_box.cc:3055
+#: processor_box.cc:4053
msgid "%1 (by %2)"
msgstr "%1 (von %2)"
@@ -9731,71 +10776,71 @@ msgstr "Bank"
msgid "main grid"
msgstr "Hauptraster"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Quantisieren"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "Stärke"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Swing"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "Threshold (ticks)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr "Notenanfang einrasten an"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr "Notenende einrasten an"
-#: rc_option_editor.cc:81 rc_option_editor.cc:82
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "Durchsuchen..."
-#: rc_option_editor.cc:87
+#: rc_option_editor.cc:89
msgid "Emphasis on first beat:"
msgstr "Betonung auf erstem Schlag:"
-#: rc_option_editor.cc:93
+#: rc_option_editor.cc:95
msgid "Use default Click:"
msgstr "Benutze voreingestellten Klick:"
-#: rc_option_editor.cc:99
+#: rc_option_editor.cc:101
msgid "Click audio file:"
msgstr "Audiodatei für Klick"
-#: rc_option_editor.cc:106
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Audiodatei für Klick-Betonung"
-#: rc_option_editor.cc:152
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Click auswählen"
-#: rc_option_editor.cc:175
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Click-Betonung auswählen"
-#: rc_option_editor.cc:236
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "Limitiere Aktionsliste auf"
-#: rc_option_editor.cc:237
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "Speichere Aktionsliste von"
-#: rc_option_editor.cc:246 rc_option_editor.cc:253
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "Aktionen"
-#: rc_option_editor.cc:376
+#: rc_option_editor.cc:378
msgid ""
"\n"
"Changes to this setting will only persist after your project has been saved."
@@ -9804,148 +10849,148 @@ msgstr ""
"Ãnderungen dieser Einstellung werden nur durch Speichern des Projekts "
"dauerhaft übernommen."
-#: rc_option_editor.cc:387 rc_option_editor.cc:449
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
msgstr "<b>Empfohlene Einstellung: %1 + Taste 3 (rechte Maustaste)</b>%2"
-#: rc_option_editor.cc:401
+#: rc_option_editor.cc:403
msgid "Select Keyboard layout:"
msgstr "Tastaturlayout wählen:"
-#: rc_option_editor.cc:420
+#: rc_option_editor.cc:422
msgid "When Clicking:"
msgstr "Bei Klick:"
-#: rc_option_editor.cc:427
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "Bearbeiten mit:"
-#: rc_option_editor.cc:433 rc_option_editor.cc:463 rc_option_editor.cc:493
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ Maustaste"
-#: rc_option_editor.cc:457
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "Entfernen mit:"
-#: rc_option_editor.cc:479
+#: rc_option_editor.cc:481
msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
msgstr "<b>Empfohlene Einstellung: %1 + Taste 1 (linke Maustaste)</b>%2"
-#: rc_option_editor.cc:487
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "Note einfügen:"
-#: rc_option_editor.cc:505
+#: rc_option_editor.cc:507
msgid "When Beginning a Drag:"
msgstr "Bei Mauszieh-Beginn:"
-#: rc_option_editor.cc:516 rc_option_editor.cc:543 rc_option_editor.cc:576
-#: rc_option_editor.cc:597 rc_option_editor.cc:641 rc_option_editor.cc:674
-#: rc_option_editor.cc:700 rc_option_editor.cc:728 rc_option_editor.cc:757
-#: rc_option_editor.cc:779
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
msgid "<b>Recommended Setting: %1</b>%2"
msgstr "<b>Empfohlene Einstellung: %1</b>%2"
-#: rc_option_editor.cc:530
+#: rc_option_editor.cc:532
msgid "Copy items using:"
msgstr "Kopiere Objekte mittels:"
-#: rc_option_editor.cc:557
+#: rc_option_editor.cc:559
msgid "Constrain drag using:"
msgstr "Beschränke Mausziehen mittels:"
-#: rc_option_editor.cc:565
+#: rc_option_editor.cc:567
msgid "When Beginning a Trim:"
msgstr "Bei Beginn einer Anpassung (Trim):"
-#: rc_option_editor.cc:584
+#: rc_option_editor.cc:586
msgid "Trim contents using:"
msgstr "Inhalte anpassen mittels:"
-#: rc_option_editor.cc:605
+#: rc_option_editor.cc:607
msgid "Anchored trim using:"
msgstr "Verankertes Anpassen mittels:"
-#: rc_option_editor.cc:649
+#: rc_option_editor.cc:651
msgid "Resize notes relatively using:"
msgstr "Relative Notenlängenänderung mittels:"
-#: rc_option_editor.cc:658
+#: rc_option_editor.cc:660
msgid "While Dragging:"
msgstr "Währens Mausziehens:"
-#: rc_option_editor.cc:682
+#: rc_option_editor.cc:684
msgid "Ignore snap using:"
msgstr "Einrasten ignorieren mittels:"
-#: rc_option_editor.cc:708
+#: rc_option_editor.cc:710
msgid "Snap relatively using:"
msgstr "Relativ Einrasten mittels:"
-#: rc_option_editor.cc:716
+#: rc_option_editor.cc:718
msgid "While Trimming:"
msgstr "Während des Anpassens:"
-#: rc_option_editor.cc:736
+#: rc_option_editor.cc:738
msgid "Resize overlapped regions using:"
msgstr "Längenänderung überlappender Regionen mittels:"
-#: rc_option_editor.cc:744
+#: rc_option_editor.cc:746
msgid "While Dragging Control Points:"
msgstr "Beim Mausziehen von Kontrollpunkten:"
-#: rc_option_editor.cc:765
+#: rc_option_editor.cc:767
msgid "Fine adjust using:"
msgstr "Feinjustierung mittels:"
-#: rc_option_editor.cc:787
+#: rc_option_editor.cc:789
msgid "Push points using:"
msgstr "Punkte \"stoÃen\" mittels:"
-#: rc_option_editor.cc:1027
+#: rc_option_editor.cc:1029
msgid "GUI and Font scaling:"
msgstr "GUI- und Zeichensatzskalierung:"
-#: rc_option_editor.cc:1030
+#: rc_option_editor.cc:1032
msgid "Default"
msgstr "Voreinstellung"
-#: rc_option_editor.cc:1056
-msgid "Adjusting the scale require an application restart to re-layout."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-"Ãnderungen an der Skalierung verlangen einen Neustart des Programms, um das "
-"Layout anzupassen."
+"Ein Verändern der Skalierung erfordert einen Neustart der Applikation, um "
+"das Layout neu auszurichten."
-#: rc_option_editor.cc:1098
+#: rc_option_editor.cc:1100
msgid "â"
msgstr "â"
-#: rc_option_editor.cc:1099
+#: rc_option_editor.cc:1101
msgid "30 sec"
msgstr "30 sec"
-#: rc_option_editor.cc:1100
+#: rc_option_editor.cc:1102
msgid "1 min"
msgstr "1 min"
-#: rc_option_editor.cc:1101
+#: rc_option_editor.cc:1103
msgid "2 mins"
msgstr "2 mins"
-#: rc_option_editor.cc:1102
+#: rc_option_editor.cc:1104
msgid "3 mins"
msgstr "3 mins"
-#: rc_option_editor.cc:1103
+#: rc_option_editor.cc:1105
msgid "4 mins"
msgstr "4 mins"
-#: rc_option_editor.cc:1104
+#: rc_option_editor.cc:1106
msgid "5 mins"
msgstr "5 mins"
-#: rc_option_editor.cc:1107
+#: rc_option_editor.cc:1109
msgid ""
"Specify the default timeout for plugin instantiation. Plugins that require "
"more time to load will be blacklisted. A value of 0 disables the timeout."
@@ -9954,53 +10999,53 @@ msgstr ""
"an. Plugins, die mehr Zeit benötigen, um zu laden, werden auf die schwarze "
"Liste gesetzt. Ein Wert von 0 deaktiviert das Timeout."
-#: rc_option_editor.cc:1109
+#: rc_option_editor.cc:1111
msgid "Scan Time Out:"
msgstr "Scan-Timeout:"
-#: rc_option_editor.cc:1157
+#: rc_option_editor.cc:1159
msgid "Waveform Clip Level (dBFS):"
msgstr "Wellenform Clipping-Wert (dBFS):"
-#: rc_option_editor.cc:1210
+#: rc_option_editor.cc:1212
msgid "Small sessions (4-16 tracks)"
msgstr "Kleine Projekte (4-16 Spuren)"
-#: rc_option_editor.cc:1211
+#: rc_option_editor.cc:1213
msgid "Medium sessions (16-64 tracks)"
msgstr "Mittlere Projekte (16 - 64 Spuren)"
-#: rc_option_editor.cc:1212
+#: rc_option_editor.cc:1214
msgid "Large sessions (64+ tracks)"
msgstr "GroÃe Projekte (64+ Spuren)"
-#: rc_option_editor.cc:1213
+#: rc_option_editor.cc:1215
msgid "Custom (set by sliders below)"
msgstr "Benutzerdefiniert (setze über untere Schieberegler)"
-#: rc_option_editor.cc:1217 export_video_dialog.cc:167
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
msgid "Preset:"
msgstr "Preset:"
-#: rc_option_editor.cc:1229
+#: rc_option_editor.cc:1231
msgid "Playback (seconds of buffering):"
msgstr "Wiedergabe (gepufferte Sekunden):"
-#: rc_option_editor.cc:1242
+#: rc_option_editor.cc:1244
msgid "Recording (seconds of buffering):"
msgstr "Aufnahme (gepufferte Sekunden):"
-#: rc_option_editor.cc:1320
+#: rc_option_editor.cc:1322
msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
"Programmierfehler: unbekannte Zeichenkette für Puffer-Voreinstellung, index "
"= %1"
-#: rc_option_editor.cc:1352
+#: rc_option_editor.cc:1353
msgid "Control Surface Protocol"
msgstr "Eingabegeräteprotokoll"
-#: rc_option_editor.cc:1366
+#: rc_option_editor.cc:1367
msgid ""
"Click to edit the settings for selected protocol ( it must be ENABLED "
"first ):"
@@ -10008,27 +11053,31 @@ msgstr ""
"Klicken, um die Einstellungen für das gewählte Protokoll zu bearbeiten (erst "
"muss es AKTIVIERT werden):"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1371
msgid "Show Protocol Settings"
msgstr "Protokolleinstellungen anzeigen"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1494
msgid "Configuration"
msgstr "Konfiguration"
-#: rc_option_editor.cc:1546
+#: rc_option_editor.cc:1547
msgid "Show Video Export Info before export"
msgstr "Zeige Video-Exportinformationen vor dem Exportieren"
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:1548
msgid "Show Video Server Startup Dialog"
msgstr "Zeige den Videoserver-Startdialog"
-#: rc_option_editor.cc:1548
+#: rc_option_editor.cc:1549
msgid "Advanced Setup (remote video server)"
msgstr "Ausführliche Einrichtung (entfernter Videoserver)"
#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "Video Server"
+
+#: rc_option_editor.cc:1565
msgid ""
"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
"- Do not enable this option unless you know what you are doing."
@@ -10037,11 +11086,11 @@ msgstr ""
"für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie "
"wissen, was Sie tun."
-#: rc_option_editor.cc:1558
+#: rc_option_editor.cc:1567
msgid "Video Server URL:"
msgstr "Videoserver URL:"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:1572
msgid ""
"Base URL of the video-server including http prefix. This is usually 'http://"
"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -10051,11 +11100,11 @@ msgstr ""
"hostname.example.org:1554/' und ist auf 'http://localhost:1554/' "
"voreingestellt, wenn der Videoserver lokal läuft"
-#: rc_option_editor.cc:1565
+#: rc_option_editor.cc:1574
msgid "Video Folder:"
msgstr "Videoordner:"
-#: rc_option_editor.cc:1570
+#: rc_option_editor.cc:1579
msgid ""
"Local path to the video-server document-root. Only files below this "
"directory will be accessible by the video-server. If the server run on a "
@@ -10070,7 +11119,7 @@ msgstr ""
"werden, falls es nicht zugänglich ist. Wird für den lokalen Videomonitor und "
"die Dateisuche beim Ãffnen/Hinzufügen einer Videodatei benutzt."
-#: rc_option_editor.cc:1577
+#: rc_option_editor.cc:1584
msgid ""
"<b>When enabled</b> an information window with details is displayed before "
"the video-export dialog."
@@ -10078,98 +11127,131 @@ msgstr ""
"<b>Wenn aktiviert</b> , wird vor dem Videoexport-Dialog ein "
"Informationsfenster mit Details angezeigt."
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:1589
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
msgstr ""
"<b>Wenn aktiviert</b>, wird der Videoserver nie ohne Bestätigung gestartet"
-#: rc_option_editor.cc:1723
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+"Benutzerdefinierter Pfad zum Videomonitor (%1) - für Vorgabewert leer lassen:"
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+"Benutzerdefinierter Pfad für das Videomonitor-Programm, Anderung erfordert "
+"einen Neustart."
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr "Videomonitor-Programm festlegen"
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr "Spalte %1"
+
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "%1 Einstellungen"
-#: rc_option_editor.cc:1734
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr "Allgemein"
+
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
msgstr "DSP CPU Nutzung"
-#: rc_option_editor.cc:1738
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "Die Signalverarbeitung verwendet"
-#: rc_option_editor.cc:1743
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "Alle auÃer einem Prozessor"
-#: rc_option_editor.cc:1744
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "Alle verfügbaren Prozessoren"
-#: rc_option_editor.cc:1747
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr "%1 Prozessoren"
-#: rc_option_editor.cc:1750
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr "Diese Einstellung wird erst nach einem Neustart von %1 wirksam."
-#: rc_option_editor.cc:1755
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "Undo"
-#: rc_option_editor.cc:1762
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "Verwerfen der letzten Aufnahme bestätigen"
-#: rc_option_editor.cc:1767
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr "Projektmanagement:"
-#: rc_option_editor.cc:1772
+#: rc_option_editor.cc:1912
msgid "Make periodic backups of the session file"
msgstr "Erstelle regelmäÃig Backups der Projektdatei"
-#: rc_option_editor.cc:1780
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Importierte Dateien immer kopieren"
-#: rc_option_editor.cc:1787
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr "Standardordner für neue Projekte"
-#: rc_option_editor.cc:1795
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "Maximale Anzahl kürzlich geöffneter Projekte"
-#: rc_option_editor.cc:1808
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr "Lautstärke für Klick"
-#: rc_option_editor.cc:1813 route_time_axis.cc:269 route_time_axis.cc:833
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automationen"
-#: rc_option_editor.cc:1818
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr "Ausdünnungsfaktor (gröÃerer Wert => weniger Daten)"
-#: rc_option_editor.cc:1827
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "MeÃintervall für Automation (Millisekunden)"
-#: rc_option_editor.cc:1835
+#: rc_option_editor.cc:1975
msgid "Transport Options"
msgstr "Transport Optionen"
-#: rc_option_editor.cc:1841
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "Aufnahme bleibt nach Stopp aktiviert"
-#: rc_option_editor.cc:1850
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr "Schleifenwiedergabe ist ein Transportmodus"
-#: rc_option_editor.cc:1855
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -10183,11 +11265,11 @@ msgstr ""
"<b>Wenn deaktiviert</b>, startet die Schleifen-Schaltfläche die Wiedergabe, "
"ein späteres \"Stop\" beendet aber die Wiedergabe als Schleife"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr "Aufnahme bei xrun stoppen"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
@@ -10195,15 +11277,15 @@ msgstr ""
"<b>Wenn aktiviert</b>, wird %1 Aufnahmen bei Auftreten von Over- oder "
"Underruns abbrechen"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "Bei xrun Marker erzeugen"
-#: rc_option_editor.cc:1881
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "Am Ende des Projektes anhalten"
-#: rc_option_editor.cc:1886
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -10216,11 +11298,11 @@ msgstr ""
"\n"
"<b>Wenn deaktiviert</b> , wird %1 am Ende des Projektes immer weiterlaufen"
-#: rc_option_editor.cc:1894
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr "Nahtlose Schleifen (nicht möglich, wenn an MTC, LTC o.ä. gekoppelt)"
-#: rc_option_editor.cc:1899
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -10237,11 +11319,11 @@ msgstr ""
"der Schleife springen, was oft einen hörbaren Klick oder kurze Verzögerung "
"verursacht"
-#: rc_option_editor.cc:1907
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr "Während der Aufnahme Aufnahmestatus einzelner Spuren sperren"
-#: rc_option_editor.cc:1911
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
@@ -10249,11 +11331,11 @@ msgstr ""
"<b>Wenn aktiviert</b> , hindert Sie dies daran, während eines "
"Aufnahmevorgangs unabsichtlich bei einzelnen Spuren die Aufnahme zu beenden"
-#: rc_option_editor.cc:1916
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "Beim Spulen Pegel um 12dB absenken"
-#: rc_option_editor.cc:1920
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
@@ -10261,11 +11343,11 @@ msgstr ""
"Dies wird die unangenehme Steigerung der wahrgenommenen Lautstärke "
"verringern, die bei manchem Material bei Vor/Rücklauf auftritt"
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:2066
msgid "Preroll"
msgstr "Vorlauf"
-#: rc_option_editor.cc:1931
+#: rc_option_editor.cc:2071
msgid ""
"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
"initiated.\n"
@@ -10280,43 +11362,50 @@ msgstr ""
"Wiedergabeposition angewandt, wenn eine Region ausgewählt oder in der Länge "
"angepasst wird."
-#: rc_option_editor.cc:1933
+#: rc_option_editor.cc:2073
msgid "0 (no pre-roll)"
msgstr "0 (kein Vorlauf)"
-#: rc_option_editor.cc:1934
+#: rc_option_editor.cc:2074
msgid "0.1 second"
msgstr "0.1 Sekunden"
-#: rc_option_editor.cc:1935
+#: rc_option_editor.cc:2075
msgid "0.25 second"
msgstr "0.25 Sekunden"
-#: rc_option_editor.cc:1936
+#: rc_option_editor.cc:2076
msgid "0.5 second"
msgstr "0.5 Sekunden"
-#: rc_option_editor.cc:1937
+#: rc_option_editor.cc:2077
msgid "1.0 second"
msgstr "1.25 Sekunden"
-#: rc_option_editor.cc:1938
+#: rc_option_editor.cc:2078
msgid "2.0 seconds"
msgstr "2.0 Sekunden"
-#: rc_option_editor.cc:1941
-msgid "Sync/Slave"
-msgstr "Sync/Slave"
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "Transport/Sync"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "Synchronisations- und Slave-Optionen"
-#: rc_option_editor.cc:1945
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr "Externe Timecode-Quelle"
-#: rc_option_editor.cc:1954
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr "Videoframerate des Projekts an externen Timecode anpassen"
-#: rc_option_editor.cc:1960
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -10340,12 +11429,12 @@ msgstr ""
"und %1 wird zwischen den Standards der externen Quelle und des Projektes "
"konvertieren."
-#: rc_option_editor.cc:1970
+#: rc_option_editor.cc:2110
msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
"Starre Synchronisation von Timecode und Uhr (unterbinde Driftkompensation)"
-#: rc_option_editor.cc:1976
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
@@ -10366,11 +11455,11 @@ msgstr ""
"<b>Wenn deaktiviert</b>, wird %1 potentiellen Drift kompensieren, "
"ungeachtet, ob die Timecodequellen Clock Sync teilen."
-#: rc_option_editor.cc:1991
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "Fest auf 29.9700 fps statt 30000/1001"
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -10393,27 +11482,27 @@ msgstr ""
"widersprechend -, da bei der Variante mit exakt 29.97 fps kein Timecode-"
"Drift auftritt.\n"
-#: rc_option_editor.cc:2007
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr "LTC-Leser"
-#: rc_option_editor.cc:2011
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr "LTC Eingangsport"
-#: rc_option_editor.cc:2027
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr "LTC-Generator"
-#: rc_option_editor.cc:2032
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr "LTC-Generator aktivieren"
-#: rc_option_editor.cc:2039
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr "LTC senden, während Transport stillsteht"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
@@ -10421,27 +11510,27 @@ msgstr ""
"<b>Wenn aktiviert</b>, wird %1 weiterhin LTC-Information senden, sogar wenn "
"der Transport (Positionszeiger) stillsteht"
-#: rc_option_editor.cc:2051
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr "LTC-Generator-Lautstärke"
-#: rc_option_editor.cc:2055
+#: rc_option_editor.cc:2195
msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is 0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is 0dBu ^= -18dBFS in an EBU calibrated system"
msgstr ""
"Geben Sie den Spitzenwert des erzeugten LTC-Signals in dbFS an. Ein guter "
"Wert für ein EBU-kalibriertes System ist 0dBu ^= -18dbFS"
-#: rc_option_editor.cc:2064
+#: rc_option_editor.cc:2204
msgid "Make rubberband selection rectangle snap to the grid"
msgstr "Gummiband-Auswahl an Raster ausrichten"
-#: rc_option_editor.cc:2071
+#: rc_option_editor.cc:2211
msgid "Name new markers"
msgstr "Neue Marker benennen"
-#: rc_option_editor.cc:2076
+#: rc_option_editor.cc:2216
msgid ""
"If enabled, popup a dialog when a new marker is created to allow its name to "
"be set as it is created.\n"
@@ -10453,399 +11542,411 @@ msgstr ""
"\n"
"Marker können jederzeit per Rechtsklick umbenannt werden"
-#: rc_option_editor.cc:2082
+#: rc_option_editor.cc:2222
msgid "Allow dragging of playhead"
msgstr "Erlaube Ziehen des Positionszeigers"
-#: rc_option_editor.cc:2090
-msgid "Show meters on tracks in the editor"
-msgstr "Aktiviere Pegelanzeigen im Editor"
-
-#: rc_option_editor.cc:2098
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr "Master-Pegelanzeige in der Werkzeugleiste anzeigen"
-#: rc_option_editor.cc:2107
+#: rc_option_editor.cc:2239
msgid "Show zoom toolbar (if torn off)"
msgstr "Zoom-Toolbar zeigen (falls abgelöst)"
-#: rc_option_editor.cc:2116
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+"Mauszeigerposition immer als Zoom-Fokus benutzen, wenn per Mausrad gezoomt "
+"wird"
+
+#: rc_option_editor.cc:2256
msgid "Update editor window during drags of the summary"
msgstr ""
"Aktualisiere das Editorfenster, während die Projektübersicht verändert wird"
-#: rc_option_editor.cc:2124
+#: rc_option_editor.cc:2264
msgid "Auto-scroll editor window when dragging near its edges"
msgstr "Bei Mausziehen nahe den Rändern das Editorfenster automatisch scrollen"
-#: rc_option_editor.cc:2132
+#: rc_option_editor.cc:2272
msgid "Show gain envelopes in audio regions"
msgstr "Zeige Lautstärkekurven in Regionen an"
-#: rc_option_editor.cc:2133
+#: rc_option_editor.cc:2273
msgid "in all modes"
msgstr "in allen Modi"
-#: rc_option_editor.cc:2134
+#: rc_option_editor.cc:2274
msgid "only in Draw and Internal Edit modes"
msgstr "nur in Zeichen- und internem Bearbeitungsmodus"
-#: rc_option_editor.cc:2139
+#: rc_option_editor.cc:2279
msgid "Editor Behavior"
msgstr "Editor-Verhalten"
-#: rc_option_editor.cc:2144
+#: rc_option_editor.cc:2284
msgid "Move relevant automation when audio regions are moved"
msgstr "Verschiebe relevante Automationen mit Region"
-#: rc_option_editor.cc:2151
+#: rc_option_editor.cc:2291
msgid "Default fade shape"
msgstr "Voreingestellte Fade-Art"
-#: rc_option_editor.cc:2170
+#: rc_option_editor.cc:2310
msgid "Regions in active edit groups are edited together"
msgstr "Regionen der aktiven Bearbeitungsgruppen werden gemeinsam bearbeitet"
-#: rc_option_editor.cc:2171
+#: rc_option_editor.cc:2311
msgid "whenever they overlap in time"
msgstr "immer, wenn sie sich auf der Zeitachse überlappen"
-#: rc_option_editor.cc:2172
+#: rc_option_editor.cc:2312
msgid "only if they have identical length, position and origin"
msgstr "nur bei identischer Länge, Position und Herkunft"
-#: rc_option_editor.cc:2181
+#: rc_option_editor.cc:2321
msgid "Layering model"
msgstr "Layering-Modell"
-#: rc_option_editor.cc:2186
+#: rc_option_editor.cc:2326
msgid "later is higher"
msgstr "später ist höher"
-#: rc_option_editor.cc:2187
+#: rc_option_editor.cc:2327
msgid "manual layering"
msgstr "manuelles Layering"
-#: rc_option_editor.cc:2192
+#: rc_option_editor.cc:2332
msgid "After splitting selected regions, select"
msgstr "Nach dem Teilen"
-#: rc_option_editor.cc:2197
+#: rc_option_editor.cc:2337
msgid "no regions"
msgstr "keine Regionen"
-#: rc_option_editor.cc:2200
+#: rc_option_editor.cc:2340
msgid "newly-created regions"
msgstr "neu erzeugte Regionen"
-#: rc_option_editor.cc:2204
+#: rc_option_editor.cc:2344
msgid "existing selection and newly-created regions"
msgstr "existierende Auswahl und neu erzeugte Regionen"
-#: rc_option_editor.cc:2208
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr "Editor/Wellenformen"
+
+#: rc_option_editor.cc:2348
msgid "Waveforms"
msgstr "Wellenformen"
-#: rc_option_editor.cc:2214
+#: rc_option_editor.cc:2354
msgid "Show waveforms in regions"
msgstr "Zeige Wellenformen in Regionen"
-#: rc_option_editor.cc:2223
+#: rc_option_editor.cc:2363
msgid "Show waveforms for audio while it is being recorded"
msgstr "Zeige bei Aufnahmen die Wellenformen des aufgenommenen Audiomaterials"
-#: rc_option_editor.cc:2230
+#: rc_option_editor.cc:2370
msgid "Waveform scale"
msgstr "Wellenformskalierung"
-#: rc_option_editor.cc:2235
+#: rc_option_editor.cc:2375
msgid "linear"
msgstr "Linear"
-#: rc_option_editor.cc:2236
+#: rc_option_editor.cc:2376
msgid "logarithmic"
msgstr "Logarithmisch"
-#: rc_option_editor.cc:2242
+#: rc_option_editor.cc:2382
msgid "Waveform shape"
msgstr "Wellenform Anzeigeart"
-#: rc_option_editor.cc:2247
+#: rc_option_editor.cc:2387
msgid "traditional"
msgstr "Traditionell"
-#: rc_option_editor.cc:2248
+#: rc_option_editor.cc:2388
msgid "rectified"
-msgstr "Rectified"
+msgstr "Rektifiziert"
-#: rc_option_editor.cc:2257
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr "Pufferung"
-#: rc_option_editor.cc:2265
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr "Aufnahmemonitoring wird verwaltet von"
-#: rc_option_editor.cc:2271
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr "via Audiotreiber"
-#: rc_option_editor.cc:2277
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "Audiohardware"
-#: rc_option_editor.cc:2284
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Bandmaschinen-Modus"
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Verbindung von Spuren und Bussen"
-#: rc_option_editor.cc:2295
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "Master/Monitor-Busse automatisch verbinden"
-#: rc_option_editor.cc:2302
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "Verbinde Spureingänge"
-#: rc_option_editor.cc:2307
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "automatisch mit Audioeingängen"
-#: rc_option_editor.cc:2308 rc_option_editor.cc:2321
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "manuell"
-#: rc_option_editor.cc:2314
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "Verbinde Spur- und Busausgänge"
-#: rc_option_editor.cc:2319
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "automatisch mit Audioausgängen"
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "automatisch mit dem Master-Bus"
-#: rc_option_editor.cc:2326
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "Benutze 'striktes E/A' für neue Spuren oder Busse"
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr "Denormals"
-#: rc_option_editor.cc:2331
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr "Nutze DC bias als Schutz vor Denormals"
-#: rc_option_editor.cc:2338
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "Umgang des Prozessors mit Denormals"
-#: rc_option_editor.cc:2344
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "nicht behandeln"
-#: rc_option_editor.cc:2350
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr "Benutze FlushToZero"
-#: rc_option_editor.cc:2357
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "Benutze DenormalsAreZero"
-#: rc_option_editor.cc:2364
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr "Benutze FlushToZero & DenormalsAreZero"
-#: rc_option_editor.cc:2380
-msgid "Silence plugins when the transport is stopped"
-msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist."
-
-#: rc_option_editor.cc:2388
-msgid "Make new plugins active"
-msgstr "Neue Plugins sind aktiv"
-
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "Audiodaten automatisch analysieren"
-#: rc_option_editor.cc:2406
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "Fehlende Kanäle in Regionen durch Kopien ersetzen"
-#: rc_option_editor.cc:2413 rc_option_editor.cc:2422 rc_option_editor.cc:2424
-#: rc_option_editor.cc:2432 rc_option_editor.cc:2440 rc_option_editor.cc:2448
-#: rc_option_editor.cc:2466 rc_option_editor.cc:2478 rc_option_editor.cc:2490
-#: rc_option_editor.cc:2492 rc_option_editor.cc:2494 rc_option_editor.cc:2502
-#: rc_option_editor.cc:2510 rc_option_editor.cc:2518 rc_option_editor.cc:2526
-#: rc_option_editor.cc:2528
-msgid "Solo / mute"
-msgstr "Solo / Mute"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "Solo & Mute"
-#: rc_option_editor.cc:2417
+#: rc_option_editor.cc:2551
msgid "Solo controls are Listen controls"
msgstr "Solo-Schalter arbeiten als AFL/PFL"
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:2561
msgid "Exclusive solo"
msgstr "Exclusives Solo"
-#: rc_option_editor.cc:2435
+#: rc_option_editor.cc:2569
msgid "Show solo muting"
msgstr "Solo auf anderen Kanälen als Mute anzeigen"
-#: rc_option_editor.cc:2443
+#: rc_option_editor.cc:2577
msgid "Soloing overrides muting"
msgstr "Solo ist trotz Mute hörbar"
-#: rc_option_editor.cc:2451
+#: rc_option_editor.cc:2585
msgid "Solo-in-place mute cut (dB)"
msgstr "Solo-in-Place Mute Dämpfung (dB)"
-#: rc_option_editor.cc:2458
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr "Abhörpunkt"
-#: rc_option_editor.cc:2463
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr "After-Fader (AFL)"
-#: rc_option_editor.cc:2464
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr "Pre-Fader (PFL)"
-#: rc_option_editor.cc:2470
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr "Abgreifpunkt der PFL Signale"
-#: rc_option_editor.cc:2475
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr "Vor den Pre-Fader Prozessoren"
-#: rc_option_editor.cc:2476
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr "Pre-Fader, aber nach den Prozessoren"
-#: rc_option_editor.cc:2482
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr "Abgreifpunkt der AFL Signale"
-#: rc_option_editor.cc:2487
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr "Direkt nach dem Fader"
-#: rc_option_editor.cc:2488
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr "Nach den Post-Fader Prozessoren (vor Pan)"
-#: rc_option_editor.cc:2492
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "Standardeinstellungen für Mute von Spuren / Bussen"
-#: rc_option_editor.cc:2497
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr "Mute schaltet Pre-Fader Sends stumm"
-#: rc_option_editor.cc:2505
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr "Mute schaltet Post-Fader Sends stumm"
-#: rc_option_editor.cc:2513
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "Mute schaltet Abhörausgänge stumm"
-#: rc_option_editor.cc:2521
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "Mute schaltet Hauptausgänge stumm"
-#: rc_option_editor.cc:2526
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr "Send Routing"
-#: rc_option_editor.cc:2531
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr "Verknüpfe Aux- und External-Send-Panner mit Hauptpanner"
+msgstr "Verknüpfe standardmäÃig Aux- und External-Send-Panner mit Hauptpanner"
-#: rc_option_editor.cc:2536
+#: rc_option_editor.cc:2672
msgid "MIDI Preferences"
msgstr "MIDI Einstellungen"
-#: rc_option_editor.cc:2541
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr "MIDI read-ahead Zeit (Sekunden)"
-#: rc_option_editor.cc:2551
+#: rc_option_editor.cc:2687
msgid "Initial program change"
msgstr "Erstmaliger Programmwechsel"
-#: rc_option_editor.cc:2560
+#: rc_option_editor.cc:2696
msgid "Display first MIDI bank/program as 0"
msgstr "Erste(s) MIDI Bank/Programm als 0 anzeigen"
-#: rc_option_editor.cc:2568
+#: rc_option_editor.cc:2704
msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
msgstr "Periodische MIDI Nachrichten nie anzeigen (MTC, MIDI Clock)"
-#: rc_option_editor.cc:2576
+#: rc_option_editor.cc:2712
msgid "Sound MIDI notes as they are selected in the editor"
msgstr "MIDI Noten ertönen bei Auswahl im Editor"
-#: rc_option_editor.cc:2584
+#: rc_option_editor.cc:2720
msgid "Send MIDI control feedback"
msgstr "MIDI Control Feedback senden"
-#: rc_option_editor.cc:2589
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/Sync"
+
+#: rc_option_editor.cc:2725
msgid "MIDI Clock"
msgstr "MIDI Clock"
-#: rc_option_editor.cc:2599
+#: rc_option_editor.cc:2735
msgid "MIDI Time Code (MTC)"
msgstr "MIDI Time Code (MTC)"
-#: rc_option_editor.cc:2604
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr "Sende MIDI Time Code"
-#: rc_option_editor.cc:2612
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr ""
"Prozentzahl beiderseits der normalen Transportgeschwindigkeit, bis zu der "
"MTC übertragen wird"
-#: rc_option_editor.cc:2618
+#: rc_option_editor.cc:2754
msgid "Midi Machine Control (MMC)"
msgstr "Midi Machine Control (MMC)"
-#: rc_option_editor.cc:2623
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "MIDI Machine Control Commands empfangen"
-#: rc_option_editor.cc:2631
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
msgstr "MIDI Machine Control Commands senden"
-#: rc_option_editor.cc:2639
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr "ID des eingehenden MMC-Geräts"
-#: rc_option_editor.cc:2648
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr "ID des ausgehenden MMC-Geräts"
-#: rc_option_editor.cc:2654
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr "Midi vorhören"
-#: rc_option_editor.cc:2658
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr "Midi Vorhör-Synth (LV2)"
-#: rc_option_editor.cc:2689 rc_option_editor.cc:2699 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr "Benutzerinteraktion"
-#: rc_option_editor.cc:2692
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
@@ -10855,35 +11956,24 @@ msgstr ""
" <i>(erfordert Neustart von %1)</i>\n"
" <i>(falls für Ihre gewünschte Sprache verfügbar)</i>"
-#: rc_option_editor.cc:2699
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "Tastatur"
-#: rc_option_editor.cc:2709
-msgid "Control surface remote ID"
-msgstr "Remote ID des Eingabegeräts"
-
-#: rc_option_editor.cc:2714
-msgid "assigned by user"
-msgstr "vom Benutzer festgelegt"
-
-#: rc_option_editor.cc:2715
-msgid "follows order of mixer"
-msgstr "folgt Reihenfolge im Mixer"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Scanne nach Plugins"
-#: rc_option_editor.cc:2723
+#: rc_option_editor.cc:2853
msgid "General"
msgstr "Allgemein"
-#: rc_option_editor.cc:2726 startup.cc:351
-msgid "Scan for Plugins"
-msgstr "Scanne nach Plugins"
-
-#: rc_option_editor.cc:2731
+#: rc_option_editor.cc:2858
msgid "Always Display Plugin Scan Progress"
msgstr "Plugin Scan-Fortschritt immer anzeigen"
-#: rc_option_editor.cc:2737
+#: rc_option_editor.cc:2864
msgid ""
"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
"for indexing (cache load) and discovery (detect new plugins)"
@@ -10892,15 +11982,52 @@ msgstr ""
"Fortschritt, Indizierung(Laden des Cache) und Entdeckung (neue Plugins "
"finden) anzuzeigen"
-#: rc_option_editor.cc:2742
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist."
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+"<b>Wenn aktiviert</b>, werden Plugins bei Transportstopp zurückgesetzt. Wenn "
+"nicht aktiviert, bleiben Plugins bei Transportstopp unverändert.\n"
+"\n"
+"Dies betrifft hauptsächlich Plugins mit einer \"Fahne\" wie z. B. Hall."
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Neue Plugins sind aktiv"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+"<b>Wenn aktiviert</b>, werden Plugins beim Hinzufügen zu Spuren/ Bussen "
+"aktiv geschalten. Wenn nicht aktiviert, bleiben Plugins beim Hinzufügen zu "
+"Spuren/Bussen inaktiv"
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "Plugins/VST"
+
+#: rc_option_editor.cc:2888
msgid "VST"
msgstr "VST"
-#: rc_option_editor.cc:2746
+#: rc_option_editor.cc:2895
msgid "Scan for [new] VST Plugins on Application Start"
msgstr "Bei Programmstart nach [neuen] VST Plugins scannen"
-#: rc_option_editor.cc:2752
+#: rc_option_editor.cc:2901
msgid ""
"<b>When enabled</b> new VST plugins are searched, tested and added to the "
"cache index on application start. When disabled new plugins will only be "
@@ -10910,11 +12037,11 @@ msgstr ""
"getestet und dem Cache-Index hinzugefügt. Wenn deaktiviert, werden neue "
"Plugins nur nach einem manuellen Scan verfügbar sein"
-#: rc_option_editor.cc:2758
+#: rc_option_editor.cc:2907
msgid "Verbose Plugin Scan"
msgstr "Gesprächiger Plugin-Scan"
-#: rc_option_editor.cc:2764
+#: rc_option_editor.cc:2913
msgid ""
"<b>When enabled</b> additional information for every plugin is added to the "
"Log Window."
@@ -10922,35 +12049,40 @@ msgstr ""
"<b>Wenn aktiviert</b>, wird zusätzliche Information für jedes Plugin ins "
"Logfenster geschrieben."
-#: rc_option_editor.cc:2772
+#: rc_option_editor.cc:2921
msgid "VST Cache:"
msgstr "VST Cache:"
-#: rc_option_editor.cc:2777
+#: rc_option_editor.cc:2926
msgid "VST Blacklist:"
msgstr "VST Schwarzliste:"
-#: rc_option_editor.cc:2784
+#: rc_option_editor.cc:2933
msgid "Linux VST Path:"
msgstr "Linux VST Pfad:"
-#: rc_option_editor.cc:2789 rc_option_editor.cc:2802
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
msgid "Path:"
msgstr "Pfad:"
-#: rc_option_editor.cc:2798
+#: rc_option_editor.cc:2947
msgid "Windows VST Path:"
msgstr "Windows VST Pfad:"
-#: rc_option_editor.cc:2808
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "Plugins/Audio Unit"
+
+#: rc_option_editor.cc:2958
msgid "Audio Unit"
msgstr "Audio Unit"
-#: rc_option_editor.cc:2812
+#: rc_option_editor.cc:2965
msgid "Scan for AudioUnit Plugins on Application Start"
msgstr "Bei Programmstart nach AudioUnit Plugins scannen"
-#: rc_option_editor.cc:2818
+#: rc_option_editor.cc:2971
msgid ""
"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
"When disabled AU plugins will only be available after triggering a 'Scan' "
@@ -10963,27 +12095,59 @@ msgstr ""
"Scans aktivieren, ein Crash während der Pluginentdeckung wird sie "
"deaktivieren."
-#: rc_option_editor.cc:2823
+#: rc_option_editor.cc:2976
msgid "AU Cache:"
msgstr "AU Cache:"
-#: rc_option_editor.cc:2828
+#: rc_option_editor.cc:2981
msgid "AU Blacklist:"
msgstr "AU Schwarzliste:"
-#: rc_option_editor.cc:2832
+#: rc_option_editor.cc:2985
msgid "Plugin GUI"
msgstr "Plugin GUI"
-#: rc_option_editor.cc:2836
+#: rc_option_editor.cc:2989
msgid "Automatically open the plugin GUI when adding a new plugin"
msgstr "Bei Hinzufügen eines neuen Plugins dessen GUI automatisch öffnen"
-#: rc_option_editor.cc:2847
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "StandardmäÃig Plugin-Inline-Display in Mixerstrip anzeigen"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+"Das Plugin-GUI nicht automatisch öffnen, wenn das Plugin einen Inline-"
+"Display-Modus bietet"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "Instrument"
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "Nachfragen, ob ein vorhandenes Instrumentenplugin ersetzt werden soll"
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr "Instrumentenplugins beim Einfügen interaktiv konfigurieren"
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+"<b>Wenn aktiviert</b>, erscheint ein Dialog zur Auswahl einer Instrumenten-"
+"Kanalkonfiguration, bevor ein Mehrkanalplugin hinzugefügt wird."
+
+#: rc_option_editor.cc:3039
msgid "Disable Graphics Hardware Acceleration (requires restart)"
msgstr "Deaktiviere Grafik-Hardwarebeschleunigung (benötigt Neustart)"
-#: rc_option_editor.cc:2853
+#: rc_option_editor.cc:3045
msgid ""
"Render large parts of the application user-interface in software, instead of "
"using 2D-graphics acceleration.\n"
@@ -10993,19 +12157,20 @@ msgstr ""
"2D-Grafik-Beschleunigung zu verwenden.\n"
"Dies erfordert einen Neustart von %1, um Auswirkung zu zeigen"
-#: rc_option_editor.cc:2854 rc_option_editor.cc:2866 rc_option_editor.cc:2869
-#: rc_option_editor.cc:2878 rc_option_editor.cc:2887 rc_option_editor.cc:2906
-#: rc_option_editor.cc:2922 rc_option_editor.cc:2938 rc_option_editor.cc:2952
-#: rc_option_editor.cc:2961
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
msgid "Preferences|GUI"
msgstr "GUI"
-#: rc_option_editor.cc:2860
+#: rc_option_editor.cc:3052
msgid "Possibly improve slow graphical performance (requires restart)"
msgstr ""
"Versuche, langsame Grafikperformance zu verbessern (erfordert Neustart)"
-#: rc_option_editor.cc:2865
+#: rc_option_editor.cc:3057
msgid ""
"Disables hardware gradient rendering on buggy video drivers (\"buggy "
"gradients patch\").\n"
@@ -11015,29 +12180,33 @@ msgstr ""
"Videotreibern (\"buggy gradients patch\").\n"
"Diese Einstellung wird erst nach einem Neustart von %1 wirksam"
-#: rc_option_editor.cc:2872
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr "Benutze Ansichtsinformationen des Fenstermanagers/Desktops"
+
+#: rc_option_editor.cc:3072
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "Mouseover-Effekt über verschiedenen Anzeigen"
-#: rc_option_editor.cc:2881
+#: rc_option_editor.cc:3080
msgid "Show tooltips if mouse hovers over a control"
msgstr "Zeige Tooltips, wenn die Maus über einem Element schwebt"
-#: rc_option_editor.cc:2890
+#: rc_option_editor.cc:3088
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
"Verwende Farbbalken zur Namenshervorhebung in der Regionendarstellung "
"(erfordert Neustart)"
-#: rc_option_editor.cc:2898
+#: rc_option_editor.cc:3096
msgid "Update transport clock display at FPS instead of every 100ms"
msgstr "Auffrischen der Transport-Uhranzeige in FPS statt alle 100 ms"
-#: rc_option_editor.cc:2913
+#: rc_option_editor.cc:3111
msgid "Waveform image cache size (megabytes)"
msgstr "Wellenformbild CachegröÃe (Megabyte)"
-#: rc_option_editor.cc:2921
+#: rc_option_editor.cc:3119
msgid ""
"Increasing the cache size uses more memory to store waveform images, which "
"can improve graphical performance."
@@ -11045,94 +12214,100 @@ msgstr ""
"Ein gröÃerer Cache benutzt mehr RAM-Speicher, was die Grafikperformance "
"verbessern kann."
-#: rc_option_editor.cc:2929
+#: rc_option_editor.cc:3127
msgid "Lock timeout (seconds)"
msgstr "Sperr-Timeout (Sekunden)"
-#: rc_option_editor.cc:2937
+#: rc_option_editor.cc:3135
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr "Sperre GUI nach so vielen untätigen Sekunden (null, um nie zu sperren)"
-#: rc_option_editor.cc:2954
+#: rc_option_editor.cc:3153
msgid "Mixer Strip"
msgstr "Anzeige im Kanalzug"
-#: rc_option_editor.cc:2964
+#: rc_option_editor.cc:3163
msgid "Use narrow strips in the mixer by default"
msgstr "StandardmäÃig schmale Kanalzüge verwenden"
-#: rc_option_editor.cc:2969 rc_option_editor.cc:2983 rc_option_editor.cc:3000
-#: rc_option_editor.cc:3016 rc_option_editor.cc:3032 rc_option_editor.cc:3046
-#: rc_option_editor.cc:3072 rc_option_editor.cc:3090 rc_option_editor.cc:3101
-#: rc_option_editor.cc:3108 rc_option_editor.cc:3110
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr "Sichtbarkeit der Action Script-Schaltfläche"
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
msgid "Preferences|Metering"
msgstr "Pegelanzeige"
-#: rc_option_editor.cc:2973
+#: rc_option_editor.cc:3180
msgid "Peak hold time"
msgstr "Haltezeit für Spitzenwert"
-#: rc_option_editor.cc:2979
+#: rc_option_editor.cc:3186
msgid "short"
msgstr "Kurz"
-#: rc_option_editor.cc:2980
+#: rc_option_editor.cc:3187
msgid "medium"
msgstr "Mittel"
-#: rc_option_editor.cc:2981
+#: rc_option_editor.cc:3188
msgid "long"
msgstr "Lange"
-#: rc_option_editor.cc:2987
+#: rc_option_editor.cc:3194
msgid "DPM fall-off"
msgstr "Abfall der digitalen Pegelanzeige"
-#: rc_option_editor.cc:2993
+#: rc_option_editor.cc:3200
msgid "slowest [6.6dB/sec]"
msgstr "am langsamsten [6.6dB/sec]"
-#: rc_option_editor.cc:2994
+#: rc_option_editor.cc:3201
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:2995
+#: rc_option_editor.cc:3202
msgid "moderate [12.0dB/sec] (DIN)"
msgstr "moderat [12.0dB/sec] (DIN)"
-#: rc_option_editor.cc:2996
+#: rc_option_editor.cc:3203
msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr "mittel [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-#: rc_option_editor.cc:2997
+#: rc_option_editor.cc:3204
msgid "fast [20dB/sec]"
msgstr "schnell [20dB/sec]"
-#: rc_option_editor.cc:2998
+#: rc_option_editor.cc:3205
msgid "very fast [32dB/sec]"
msgstr "sehr schnell [32dB/sec]"
-#: rc_option_editor.cc:3004
+#: rc_option_editor.cc:3211
msgid "Meter line-up level; 0dBu"
msgstr "Ausrichtung der Pegelanzeige; 0dBu"
-#: rc_option_editor.cc:3009 rc_option_editor.cc:3025
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-#: rc_option_editor.cc:3010 rc_option_editor.cc:3026
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
msgid "-20dBFS (SMPTE RP.0155)"
msgstr "-20dBFS (SMPTE RP.0155)"
-#: rc_option_editor.cc:3011 rc_option_editor.cc:3027
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
msgid "-18dBFS (EBU, BBC)"
msgstr "-18dBFS (EBU, BBC)"
-#: rc_option_editor.cc:3012 rc_option_editor.cc:3028
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
msgid "-15dBFS (DIN)"
msgstr "-15dBFS (DIN)"
-#: rc_option_editor.cc:3014
+#: rc_option_editor.cc:3221
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -11140,71 +12315,95 @@ msgstr ""
"Konfiguriere Skalierung und Farbschwellwert für DPM mit dBFS-Skala, "
"setzeReferenzpegel für IEC1/Nordisch, IEC2 PPM und VU Pegelanzeigen."
-#: rc_option_editor.cc:3020
+#: rc_option_editor.cc:3227
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu"
-#: rc_option_editor.cc:3030
+#: rc_option_editor.cc:3237
msgid "Reference level for IEC1/DIN meter."
msgstr "Referenzpegel für IEC1/DIN Pegelanzeige."
-#: rc_option_editor.cc:3036
+#: rc_option_editor.cc:3243
msgid "VU Meter standard"
msgstr "Standard für VU-Pegelanzeige"
-#: rc_option_editor.cc:3041
+#: rc_option_editor.cc:3248
msgid "0VU = -2dBu (France)"
msgstr "0VU = -2dBu (Frankreich)"
-#: rc_option_editor.cc:3042
+#: rc_option_editor.cc:3249
msgid "0VU = 0dBu (North America, Australia)"
msgstr "0VU = 0dBu (Nordamerika, Australien)"
-#: rc_option_editor.cc:3043
+#: rc_option_editor.cc:3250
msgid "0VU = +4dBu (standard)"
msgstr "0VU = +4dBu (Standard)"
-#: rc_option_editor.cc:3044
+#: rc_option_editor.cc:3251
msgid "0VU = +8dBu"
msgstr "0VU = +8dBu"
-#: rc_option_editor.cc:3050
+#: rc_option_editor.cc:3257
msgid "Peak threshold [dBFS]"
msgstr "Schwelle für Spitzenwert [dBFS]"
-#: rc_option_editor.cc:3059
+#: rc_option_editor.cc:3266
msgid "Default Meter Type for Master Bus"
msgstr "Voreingestellter Metertyp für Masterbus"
-#: rc_option_editor.cc:3077
+#: rc_option_editor.cc:3284
msgid "Default Meter Type for Busses"
msgstr "Voreingestellter Metertyp für Busse"
-#: rc_option_editor.cc:3094
+#: rc_option_editor.cc:3301
msgid "Default Meter Type for Tracks"
msgstr "Voreingestellter Metertyp für Spuren"
-#: rc_option_editor.cc:3106
+#: rc_option_editor.cc:3313
msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
"Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder "
-"Ãberschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt"
+"Ãberschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt."
-#: rc_option_editor.cc:3113
+#: rc_option_editor.cc:3320
msgid "LED meter style"
msgstr "Pegelanzeigen im LED-Stil"
-#: rc_option_editor.cc:3121
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "Editor-Pegelanzeige"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "Aktiviere Pegelanzeigen im Editor"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr "Im Spurkopf Pegelanzeige auf höchstens Stereo beschränken"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr "Post-Export Analyse"
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "Loudness-Analyse als Bilddatei sichern"
+
+#: rc_option_editor.cc:3356
msgid "Theme"
msgstr "Thema"
-#: rc_option_editor.cc:3193
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "Thema/Farben"
+
+#: rc_option_editor.cc:3436
msgid "Set Linux VST Search Path"
msgstr "Linux VST Suchpfad setzen"
-#: rc_option_editor.cc:3207
+#: rc_option_editor.cc:3450
msgid "Set Windows VST Search Path"
msgstr "Windows VST Suchpfad setzen"
@@ -11216,7 +12415,7 @@ msgstr "Diese Region vorhören"
msgid "Position:"
msgstr "Position:"
-#: region_editor.cc:92 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
msgid "End:"
msgstr "Ende:"
@@ -11280,33 +12479,33 @@ msgstr "Spur:"
msgid "Choose Top Region"
msgstr "Oberste Region auswählen"
-#: region_view.cc:270
+#: region_view.cc:271
msgid "SilenceText"
msgstr "StilleText"
-#: region_view.cc:285 region_view.cc:304
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "Minuten"
-#: region_view.cc:288 region_view.cc:307
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "ms"
-#: region_view.cc:291 region_view.cc:310
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "s"
-#: region_view.cc:294
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] "%1 stilles Segment"
msgstr[1] "%1 stille Segmente"
-#: region_view.cc:296
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr "kürzestes = %1 %2"
-#: region_view.cc:313
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -11354,55 +12553,63 @@ msgstr "Kullback-Liebler"
msgid "Modified Kullback-Liebler"
msgstr "Modified Kullback-Liebler"
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "Spektraler Fluss"
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "Region teilen"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr "Regionen einrasten"
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "Region angleichen"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "Rhythm Ferret"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Daten analysieren"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "Erkennungsfunktion"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Mindestauslöseabstand"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:65
-msgid "Threshold"
-msgstr "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr "Auslöseabstand (postproc)"
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "Schwelle für Spitzenwert"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "Silence threshold"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr "Min. Zeit zwischen Onsets"
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "Empfindlichkeit"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr "Schwellwert für Schnittposition"
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Aktionen"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "Regionen teilen (rhythm ferret)"
@@ -11426,19 +12633,15 @@ msgstr "Aufnahmestatus"
msgid "Active state"
msgstr "Aktiv-Status"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:87
-msgid "Color"
-msgstr "Farbe"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr "Bearbeitungsgruppendialog"
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>Geteilte Funktionen</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
"Der Gruppenname ist nicht einzigartig. Bitte benutzen Sie einen anderen "
@@ -11460,92 +12663,96 @@ msgstr "Ausgänge"
msgid "Plugins, Inserts & Sends"
msgstr "Plugins, Inserts & Sends"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr ""
"Konnte Bezeichnung für umbenannten Verbindung nicht in der Liste der "
"Verbindungen finden!"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "Wiedergabeverzögerung: %<PRId64> Samples"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "KEINE SPUR"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Spur/Bus hinzufügen"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "Keine Spuren oder Busse ausgewählt"
-#: route_time_axis.cc:105
+#: route_time_axis.cc:104
msgid "RTAV|G"
msgstr "G"
-#: route_time_axis.cc:106
+#: route_time_axis.cc:105
msgid "RTAV|P"
msgstr "P"
-#: route_time_axis.cc:107
+#: route_time_axis.cc:106
msgid "RTAV|A"
msgstr "A"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr "Aufnahme (Rechtsklick für Step Entry)"
-#: route_time_axis.cc:187
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Aufnahme"
-#: route_time_axis.cc:257
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "Bearbeitungsgruppe"
-#: route_time_axis.cc:267
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr "MIDI-Controller und Automation"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "Alle Automationen anzeigen"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "Genutzte Automationen zeigen"
-#: route_time_axis.cc:504
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "Alle Automationen verbergen"
-#: route_time_axis.cc:513
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr "Prozessorautomation"
-#: route_time_axis.cc:520
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Fader"
-#: route_time_axis.cc:547
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Pan"
-#: route_time_axis.cc:638
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "Overlaid"
-#: route_time_axis.cc:644
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "Stacked"
-#: route_time_axis.cc:652
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Layers"
#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
-msgstr "Automatisch (auf den I/O Verbindungen basierend)"
+msgstr "Automatisch (auf den E/A Verbindungen basierend)"
#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
@@ -11556,11 +12763,11 @@ msgid "(Currently: Capture Time)"
msgstr "(Momentan: An Aufnahmezeit ausrichten)"
#: route_time_axis.cc:741
-msgid "Align with Existing Material"
+msgid "Align With Existing Material"
msgstr "An existierendem Material ausrichten"
#: route_time_axis.cc:746
-msgid "Align with Capture Time"
+msgid "Align With Capture Time"
msgstr "An Aufnahmezeit ausrichten"
#: route_time_axis.cc:751
@@ -11583,188 +12790,191 @@ msgstr "Non-Layered Mode"
msgid "Record Mode"
msgstr "Aufnahmemodus"
-#: route_time_axis.cc:811 route_time_axis.cc:1806
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Wiedergabeliste"
-#: route_time_axis.cc:1109
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "Wiedergabeliste umbenennen"
-#: route_time_axis.cc:1110
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "Neuer Name für Wiedergabeliste:"
-#: route_time_axis.cc:1195
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "Neue Kopie der Wiedergabeliste"
-#: route_time_axis.cc:1196 route_time_axis.cc:1249
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "Name für die neue Wiedergabeliste:"
-#: route_time_axis.cc:1248
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "Neue Wiedergabeliste"
-#: route_time_axis.cc:1452
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr ""
-"Sie können keine Spur mit einem Namen erstellen, der für %1 reserviert ist."
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr "Der Name \"%1\" ist für %2 reserviert"
-#: route_time_axis.cc:1695
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "Neue Kopie..."
-#: route_time_axis.cc:1699
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "Neuer Take"
-#: route_time_axis.cc:1700
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "Take kopieren"
-#: route_time_axis.cc:1705
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Aktuelle leeren"
-#: route_time_axis.cc:1708
+#: route_time_axis.cc:1697
msgid "Select from All..."
msgstr "Aus allen auswählen..."
-#: route_time_axis.cc:1796
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr "Take: %1.%2"
-#: route_time_axis.cc:2202 selection.cc:1009 selection.cc:1063
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "Programmierfehler:"
-#: route_time_axis.cc:2622
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr "Darunterliegende"
-#: route_time_axis.cc:2625
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "Lösche \"%1\""
-#: route_time_axis.cc:2675 route_time_axis.cc:2712
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr "programming error: underlay reference pointer pairs are inconsistent!"
-#: route_time_axis.cc:2739
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr "After-Fader (AFL)"
-#: route_time_axis.cc:2743
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr "Pre-Fader (PFL)"
-#: route_ui.cc:153
+#: route_ui.cc:169
msgid "Mute this track"
msgstr "Diese Spur stummschalten"
-#: route_ui.cc:157
+#: route_ui.cc:173
msgid "Mute other (non-soloed) tracks"
msgstr "Andere (nicht Solo-)Spuren stummschalten"
-#: route_ui.cc:163
+#: route_ui.cc:179
msgid "Enable recording on this track"
msgstr "Aktiviere die Aufnahme auf dieser Spur"
-#: route_ui.cc:171
+#: route_ui.cc:187
msgid "make mixer strips show sends to this bus"
msgstr "Kanalzüge zeigen Sends zu diesem Bus"
-#: route_ui.cc:176
+#: route_ui.cc:192
msgid "Monitor input"
msgstr "Eingang abhören"
-#: route_ui.cc:182
+#: route_ui.cc:198
msgid "Monitor playback"
msgstr "Vorhandenes Material abhören"
-#: route_ui.cc:691
+#: route_ui.cc:710
msgid "Not connected to AudioEngine - cannot engage record"
-msgstr "Nicht mit Audio-Engine verbunden - Aufnahme nicht möglich"
+msgstr "Nicht mit Audioengine verbunden - Aufnahme nicht möglich"
-#: route_ui.cc:890
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr "Rec-Safe"
+
+#: route_ui.cc:892
msgid "Step Entry"
msgstr "Eingabemodus (Step Entry)"
-#: route_ui.cc:963
+#: route_ui.cc:991
msgid "Assign all tracks (prefader)"
msgstr "Alle Audiospuren zuweisen (Pre-Fader)"
-#: route_ui.cc:967
+#: route_ui.cc:995
msgid "Assign all tracks and buses (prefader)"
msgstr "Alle Audiospuren und Busse zuweisen (Pre-Fader)"
-#: route_ui.cc:971
+#: route_ui.cc:999
msgid "Assign all tracks (postfader)"
msgstr "Alle Audiospuren zuweisen (Post-Fader)"
-#: route_ui.cc:975
+#: route_ui.cc:1003
msgid "Assign all tracks and buses (postfader)"
msgstr "Alle Audiospuren und Busse zuweisen (Post-Fader)"
-#: route_ui.cc:979
+#: route_ui.cc:1007
msgid "Assign selected tracks (prefader)"
msgstr "Ausgewählte Audiospuren zuweisen (Pre-Fader)"
-#: route_ui.cc:983
+#: route_ui.cc:1011
msgid "Assign selected tracks and buses (prefader)"
msgstr "Ausgewählte Audiospuren und Busse zuweisen (Pre-Fader)"
-#: route_ui.cc:986
+#: route_ui.cc:1014
msgid "Assign selected tracks (postfader)"
msgstr "Ausgewählte Audiospuren zuweisen (Post-Fader)"
-#: route_ui.cc:990
+#: route_ui.cc:1018
msgid "Assign selected tracks and buses (postfader)"
msgstr "Ausgewählte Audiospuren und Busse zuweisen (Post-Fader)"
-#: route_ui.cc:993
+#: route_ui.cc:1021
msgid "Copy track/bus gains to sends"
msgstr "Lautstärken der Spuren/Busse auf ihre Sends kopieren"
-#: route_ui.cc:994
+#: route_ui.cc:1022
msgid "Set sends gain to -inf"
msgstr "Setze Sends-Lautstärken to -inf"
-#: route_ui.cc:995
+#: route_ui.cc:1023
msgid "Set sends gain to 0dB"
msgstr "Setze Sends-Lautstärken to 0dB"
-#: route_ui.cc:1314
+#: route_ui.cc:1361
msgid "Solo Isolate"
msgstr "Isoliertes Solo"
-#: route_ui.cc:1321
+#: route_ui.cc:1368
msgid "Solo Safe"
msgstr "Solo sperren"
-#: route_ui.cc:1343
+#: route_ui.cc:1390
msgid "Pre Fader Sends"
msgstr "Pre-Fader Sends"
-#: route_ui.cc:1349
+#: route_ui.cc:1396
msgid "Post Fader Sends"
msgstr "Post-Fader Sends"
-#: route_ui.cc:1355
+#: route_ui.cc:1402
msgid "Control Outs"
msgstr "Vorhörausgang"
-#: route_ui.cc:1361
+#: route_ui.cc:1408
msgid "Main Outs"
msgstr "Hauptausgänge"
-#: route_ui.cc:1527
+#: route_ui.cc:1575
msgid "Color Selection"
msgstr "Farbauswahl"
-#: route_ui.cc:1592
+#: route_ui.cc:1617
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -11773,23 +12983,23 @@ msgstr ""
"wird nicht empfohlen.\n"
"Wollen Sie diesen neuen Namen verwenden?"
-#: route_ui.cc:1596
+#: route_ui.cc:1621
msgid "Use the new name"
msgstr "Neuen Namen verwenden"
-#: route_ui.cc:1597
+#: route_ui.cc:1622
msgid "Re-edit the name"
msgstr "Namen bearbeiten"
-#: route_ui.cc:1610
+#: route_ui.cc:1635
msgid "Rename Track"
msgstr "Spur umbenennen"
-#: route_ui.cc:1612
+#: route_ui.cc:1637
msgid "Rename Bus"
msgstr "Bus umbenennen"
-#: route_ui.cc:1680
+#: route_ui.cc:1697
msgid ": comment editor"
msgstr ": Kommentare bearbeiten"
@@ -11809,65 +13019,18 @@ msgstr "Als Vorlage speichern"
msgid "Template name:"
msgstr "Name der Vorlage:"
-#: route_ui.cc:1976
-msgid "Remote Control ID"
-msgstr "ID für Fernsteuerung"
-
-#: route_ui.cc:1986
-msgid "Remote control ID:"
-msgstr "ID für Fernsteuerung:"
-
-#: route_ui.cc:2000
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-"Die Fernbedienungs-ID von %1 ist: %2\n"
-"\n"
-"\n"
-"Die Fernbedienungs-ID von %3 kann nicht geändert werden."
-
-#: route_ui.cc:2004
-msgid "the master bus"
-msgstr "der Master-Bus"
-
-#: route_ui.cc:2004
-msgid "the monitor bus"
-msgstr "der Monitor-Bus"
-
-#: route_ui.cc:2006
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
-msgstr ""
-"Die Fernbedienungs-ID von %5 ist: %2\n"
-"\n"
-"\n"
-"Fernbedienungs-IDs werden zur Zeit durch die Reihenfolge der Spuren/Busse in "
-"%6 bestimmt.\n"
-"\n"
-"%3Benutzen Sie den Reiter GUI im Fenster \"Einstellungen\", um dies zu ändern"
-"%4"
-
-#: route_ui.cc:2063
+#: route_ui.cc:2023
msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
msgstr ""
-"Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt das "
-"Menü."
+"Linksklick, um die Polarität von Kanal %1 dieser Spur zu invertieren. "
+"Rechtsklick zeigt das Menü."
-#: route_ui.cc:2065
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: route_ui.cc:2025
+msgid "Click to show a menu of channels to invert polarity"
msgstr ""
-"Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen"
+"Klicken, um ein Menü zum Invertieren der Polarität von Kanälen anzuzeigen"
#: save_as_dialog.cc:34
msgid "Switch to newly-saved version"
@@ -11905,6 +13068,30 @@ msgstr "Hier klicken, um einen Pfad hinzuzufügen"
msgid "the session folder"
msgstr "Projektordner"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>Type :</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr "<b>Autor:</b>"
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr "<b>Beschreibung:</b>"
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr "Wähle zu entfernendes Skript aus"
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>Name:</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>Instanz-Parameter</b>"
+
#: send_ui.cc:134
msgid "Send "
msgstr "Send "
@@ -11917,7 +13104,7 @@ msgstr "Projekteinrichtung"
msgid "Advanced options ..."
msgstr "Erweiterte Einstellungen..."
-#: session_dialog.cc:163 session_dialog.cc:394
+#: session_dialog.cc:163 session_dialog.cc:397
msgid "Recent Sessions"
msgstr "Zuletzt verwendete Projekte"
@@ -11937,99 +13124,99 @@ msgstr "Zuletzt geändert"
msgid "New Session"
msgstr "Neues Projekt"
-#: session_dialog.cc:376
+#: session_dialog.cc:379
msgid "Check the website for more..."
msgstr "Informieren Sie sich auf der Webseite weiter..."
-#: session_dialog.cc:379
+#: session_dialog.cc:382
msgid "Click to open the program website in your web browser"
msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen"
-#: session_dialog.cc:401
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "Projektdatei auswählen"
-#: session_dialog.cc:414
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr "Andere Projekte"
-#: session_dialog.cc:421
+#: session_dialog.cc:424
msgid "Safe Mode: Disable all Plugins"
msgstr "Abgesicherter Modus: Alle Plugins abschalten"
-#: session_dialog.cc:451
+#: session_dialog.cc:454
msgid "Open"
msgstr "Ãffnen"
-#: session_dialog.cc:518
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Projektname:"
-#: session_dialog.cc:540
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "Ort des Projektverzeichnisses:"
-#: session_dialog.cc:561
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "Ordner für Projekt wählen"
-#: session_dialog.cc:588
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "Diese Vorlage verwenden"
-#: session_dialog.cc:591
+#: session_dialog.cc:594
msgid "no template"
msgstr "keine Vorlage"
-#: session_dialog.cc:743 session_dialog.cc:790
+#: session_dialog.cc:746 session_dialog.cc:793
msgid "32-bit float"
msgstr "32-bit float"
-#: session_dialog.cc:746 session_dialog.cc:793
+#: session_dialog.cc:749 session_dialog.cc:796
msgid "24-bit"
msgstr "24-bit"
-#: session_dialog.cc:749 session_dialog.cc:796
+#: session_dialog.cc:752 session_dialog.cc:799
msgid "16-bit"
msgstr "16-bit"
-#: session_dialog.cc:874 session_dialog.cc:875 session_dialog.cc:876
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "Kanäle"
-#: session_dialog.cc:890
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>Busse</b>"
-#: session_dialog.cc:891
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>Eingänge</b>"
-#: session_dialog.cc:892
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>Ausgänge</b>"
-#: session_dialog.cc:900
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "Master-Bus erstellen"
-#: session_dialog.cc:910
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "Automatisch mit Audioeingängen verbinden"
-#: session_dialog.cc:917 session_dialog.cc:976
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "Benutze nur"
-#: session_dialog.cc:970
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "Ausgänge automatisch verbinden"
-#: session_dialog.cc:992
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "... mit dem Master-Bus"
-#: session_dialog.cc:1002
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "... mit den Audioausgängen"
@@ -12054,191 +13241,191 @@ msgstr "Aus Projekt importieren"
msgid "This will select all elements of this type!"
msgstr "Dies wird alle Elemente dieses Typs auswählen!"
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr "EAN Prüfziffer OK"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr "EAN Prüfziffernfehler"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr "erwartet"
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr "EAN Längenfehler"
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Feld"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "Werte (aktueller oben)"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "Benutzer"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr "E-Mail"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr "Web"
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr "Organisation"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr "Land"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "Titel"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "Liednummer"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "Untertitel"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr "Gruppierung"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "Künstler"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "Genre"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "Kommentar"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "Copyright"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "Album"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Jahr"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "Albumkünstler"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "Spuranzahl"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "CD-Untertitel"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "CD-Nummer"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "CDs insgesamt"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "Compilation"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr "ISRC"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr "EAN Strichcode"
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "Mitwirkenden"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "Texter"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "Komponist"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "Leiter"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "Remixer"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "Arranger"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "Bearbeiter"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "Produzent"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "DJ Mixer"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "Mixer"
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr "Schule"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr "Lehrender"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr "Kurs"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "Projekt-Metadaten bearbeiten"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "Projekt-Metadaten importieren"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr "Wählen Sie das Projekt, aus dem Metadaten importiert werden sollen"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "Diese Projektdatei konnte nicht gelesen werden!"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -12246,7 +13433,7 @@ msgstr ""
"Das Projekt enthält keine Metadaten!\n"
"Eventuell ein altes Projektformat?"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr "Alles importieren von:"
@@ -12467,6 +13654,11 @@ msgstr "WAVE-64"
msgid "RF64 (WAV compatible)"
msgstr "RF64 (WAV kompatibel)"
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr "Dateiorte"
+
#: session_option_editor.cc:210
msgid "File locations"
msgstr "Dateipfade"
@@ -12662,26 +13854,14 @@ msgstr "<b>Eigenschaften der Audiodatei</b>"
msgid "Timestamp:"
msgstr "Zeitstempel:"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:658
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "Stichworte:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Konnte Datei nicht lesen: %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr "<b>Midi Datei Information</b>"
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Konnte auf Audiodatei nicht zugreifen: "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr "SoundFileBox: Konnte Zeichenkette nicht zerlegen: "
@@ -12702,11 +13882,11 @@ msgstr "Audiodateien"
msgid "MIDI files"
msgstr "MIDI-Dateien"
-#: sfdb_ui.cc:590 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
msgid "All files"
msgstr "Alle Dateien"
-#: sfdb_ui.cc:609 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
msgid "Browse Files"
msgstr "Durchsuchen"
@@ -12718,150 +13898,150 @@ msgstr "Pfade"
msgid "Search Tags"
msgstr "Stichwortsuche"
-#: sfdb_ui.cc:663
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "Sortierung:"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "Längste"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "Kürzeste"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "Neueste"
-#: sfdb_ui.cc:674
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "Ãltestes"
-#: sfdb_ui.cc:675
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "Am häufigsten heruntergeladen"
-#: sfdb_ui.cc:676
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "Am seltensten heruntergeladen"
-#: sfdb_ui.cc:677
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr "Bestbewertetes"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr "Am schlechtesten bewertetes"
-#: sfdb_ui.cc:683
+#: sfdb_ui.cc:684
msgid "More"
msgstr "Mehr"
-#: sfdb_ui.cc:687
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr "Ãhnlich"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:700
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:700 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
msgid "Filename"
msgstr "Dateiname"
-#: sfdb_ui.cc:702
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "Dauer"
-#: sfdb_ui.cc:703
+#: sfdb_ui.cc:704
msgid "Size"
msgstr "GröÃe"
-#: sfdb_ui.cc:704
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr "Samplerate"
-#: sfdb_ui.cc:705
+#: sfdb_ui.cc:706
msgid "License"
msgstr "Lizenz"
-#: sfdb_ui.cc:723
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "Freesound durchsuchen"
-#: sfdb_ui.cc:739
+#: sfdb_ui.cc:741
msgid "Press to import selected files"
msgstr "Drücken Sie, um die gewählten Dateien zu importieren"
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
"Drücken Sie hier, um dieses Fenster zu schlieÃen, ohne Dateien zu importieren"
-#: sfdb_ui.cc:935
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "SoundFileBrowser: Konnte Zeichenkete nicht zerlegen:"
-#: sfdb_ui.cc:1135
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] "%1 weitere Seite von 100 Ergebnissen verfügbar"
msgstr[1] "%1 weitere Seiten von 100 Ergebnissen verfügbar"
-#: sfdb_ui.cc:1140
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr "Keine weiteren Ergebnisse verfügbar"
-#: sfdb_ui.cc:1204
+#: sfdb_ui.cc:1206
msgid "B"
msgstr "B"
-#: sfdb_ui.cc:1206
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr "kB"
-#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr "MB"
-#: sfdb_ui.cc:1212
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr "GB"
-#: sfdb_ui.cc:1429 sfdb_ui.cc:1734 sfdb_ui.cc:1795 sfdb_ui.cc:1813
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "eine Spur pro Datei"
-#: sfdb_ui.cc:1432 sfdb_ui.cc:1796 sfdb_ui.cc:1814
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "eine Spur pro Kanal"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1798 sfdb_ui.cc:1815
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr "Dateien aneinanderreihen"
-#: sfdb_ui.cc:1443 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "Alle Dateien in eine Spur"
-#: sfdb_ui.cc:1444 sfdb_ui.cc:1797
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "Dateien zusammenfügen"
-#: sfdb_ui.cc:1450 sfdb_ui.cc:1800
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "eine Region pro Datei"
-#: sfdb_ui.cc:1453 sfdb_ui.cc:1801
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "eine Region pro Kanal"
-#: sfdb_ui.cc:1458 sfdb_ui.cc:1802 sfdb_ui.cc:1816
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "alle Dateien in einer Region"
-#: sfdb_ui.cc:1525
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -12869,100 +14049,100 @@ msgstr ""
"Eine oder mehrere der ausgewählten Dateien\n"
"können von %1 nicht verwendet werden"
-#: sfdb_ui.cc:1669
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "Kopiere Dateien in Projekt"
-#: sfdb_ui.cc:1688 sfdb_ui.cc:1856
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr "Zeitstempel"
-#: sfdb_ui.cc:1689 sfdb_ui.cc:1858
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "Arbeitspunkt"
-#: sfdb_ui.cc:1690 sfdb_ui.cc:1860
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "Positionszeiger"
-#: sfdb_ui.cc:1691
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "Projektanfang"
-#: sfdb_ui.cc:1697
+#: sfdb_ui.cc:1695
msgid "<b>Add files ...</b>"
msgstr "<b>Dateien hinzufügen ...</b>"
-#: sfdb_ui.cc:1709
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr "<b>Einfügen bei</b>"
-#: sfdb_ui.cc:1722
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr "<b>Zuordnung</b>"
-#: sfdb_ui.cc:1740
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr "<b>Konvertierungsqualität:</b>"
-#: sfdb_ui.cc:1752
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr "<b>Instrument</b>"
-#: sfdb_ui.cc:1764 sfdb_ui.cc:1872
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "bestmöglich"
-#: sfdb_ui.cc:1765 sfdb_ui.cc:1874
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "gut"
-#: sfdb_ui.cc:1766 sfdb_ui.cc:1876
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "schnell"
-#: sfdb_ui.cc:1768
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Schnellstmöglich"
-#: shuttle_control.cc:57
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr "Abspielgeschwindigkeit (Rechtsklick für Optionen)"
-#: shuttle_control.cc:184
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
msgid "Percent"
msgstr "Prozent"
-#: shuttle_control.cc:192
+#: shuttle_control.cc:210
msgid "Units"
msgstr "Einheiten"
-#: shuttle_control.cc:198 shuttle_control.cc:633
+#: shuttle_control.cc:216 shuttle_control.cc:679
msgid "Sprung"
msgstr "Feder"
-#: shuttle_control.cc:202 shuttle_control.cc:636
+#: shuttle_control.cc:220 shuttle_control.cc:682
msgid "Wheel"
msgstr "Drehrad"
-#: shuttle_control.cc:236
+#: shuttle_control.cc:254
msgid "Maximum speed"
msgstr "Max. Geschwindigkeit"
-#: shuttle_control.cc:239
+#: shuttle_control.cc:257
msgid "Reset to 100%"
msgstr "Auf 100% zurücksetzen"
-#: shuttle_control.cc:592
+#: shuttle_control.cc:641
msgid "Playing"
msgstr "Wiedergabe"
-#: shuttle_control.cc:607
+#: shuttle_control.cc:656
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d Halbtöne"
-#: shuttle_control.cc:609
+#: shuttle_control.cc:658
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d Halbtöne"
@@ -12991,7 +14171,7 @@ msgstr "Dateien herunterladbar machen"
msgid "%1: %2 of %3 bytes uploaded"
msgstr "%1: %2 von %3 bytes hochgeladen"
-#: splash.cc:75
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "%1 startet ..."
@@ -13007,7 +14187,7 @@ msgstr "Lautsprecher entfernen"
msgid "Azimuth:"
msgstr "Azimut:"
-#: startup.cc:70
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
@@ -13015,11 +14195,11 @@ msgstr ""
"Verwende einen externen Mixer oder den Hardwaremixer der Audiohardware.\n"
"%1 wird das Monitoring NICHT übernehmen."
-#: startup.cc:72
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr "%1 soll laufende Aufnahmen wiedergeben"
-#: startup.cc:145
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -13036,15 +14216,15 @@ msgstr ""
"Es gibt ein paar Dinge, die vor dem ersten Programmstart konfiguriert werden "
"müssen.</span>"
-#: startup.cc:171
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "Willkommen bei %1"
-#: startup.cc:194
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Standardordner für %1 Projekte"
-#: startup.cc:200
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -13061,11 +14241,11 @@ msgstr ""
"<i>(Neue Projekte können überall abgespeichert werden, dies ist nur die "
"Vorgabe)</i>"
-#: startup.cc:223
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Standardordner für neue Projekte"
-#: startup.cc:244
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -13090,15 +14270,15 @@ msgstr ""
"\n"
"<i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
-#: startup.cc:265
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "Auswahl des Monitoring"
-#: startup.cc:288
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "Nutze den Master-Bus direkt"
-#: startup.cc:290
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -13106,11 +14286,11 @@ msgstr ""
"Verbinde den Master-Bus direkt mit den Audioausgängen. Wird für einfache "
"Anwendungen empfohlen."
-#: startup.cc:299
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "Nutze einen zusätzlichen Monitor-Bus"
-#: startup.cc:302
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -13118,7 +14298,7 @@ msgstr ""
"Nutze einen Monitor-Bus zwischen Master-Bus und Audioausgängen, um mehr\n"
"Möglichkeiten für das Monitoring zu bekommen, ohne den Mix zu beeinflussen."
-#: startup.cc:324
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -13132,46 +14312,42 @@ msgstr ""
"\n"
"</i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
-#: startup.cc:335
+#: startup.cc:336
msgid "Monitor Section"
msgstr "Monitorsektion"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr "Eingabemodus (Step Entry): %1"
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">Schlag"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">Takt"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ">AP"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr "Sustain"
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr "Pause"
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr "R-Pause"
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr "zurück"
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr "Notenwert auf ganze Note setzen"
@@ -13280,11 +14456,11 @@ msgstr "MIDI Bank Change einfügen"
msgid "Insert a program change message"
msgstr "MIDI Program Change einfügen"
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr "Um einen Notenwert zurück gehen"
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr "Eingabepunkt zum Arbeitspunkt verschieben"
@@ -13296,244 +14472,244 @@ msgstr "1/Note"
msgid "Octave"
msgstr "Oktave"
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr "Note A Einfügen"
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr "Ais einfügen"
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr "Note H Einfügen"
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr "Note C Einfügen"
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr "Cis einfügen"
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr "Note D Einfügen"
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr "Dis einfügen"
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr "Note E Einfügen"
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr "Note F Einfügen"
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr "Fis einfügen"
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr "Note G Einfügen"
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr "Gis einfügen"
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr "Eine Pause einfügen"
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr "Eine Pause in der Länge einer Rastereinheit einfügen"
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr "Zu nächster Oktave gehen"
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr "Zu nächster Notenlänge gehen"
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr "Zu voriger Notenlänge gehen"
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "Notenwert verlängern"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "Notenwert kürzen"
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr "Zu nächster Velocity gehen"
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr "Zu voriger Velocity gehen"
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr "Velocity erhöhen"
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr "Velocity verringern"
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "Zur 1. Oktave wechseln"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "Zur 2. Oktave wechseln"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "Zur 3. Oktave wechseln"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "Zur 4. Oktave wechseln"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "Zur 5. Oktave wechseln"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "Zur 6. Oktave wechseln"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "Zur 7. Oktave wechseln"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "Zur 8. Oktave wechseln"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "Zur 9. Oktave wechseln"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "Zur 10. Oktave wechseln"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "Zur 11. Oktave wechseln"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Triolen an/aus"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Akkordeingabe umschalten"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Ausgewählte Noten ertönen über Notenlänge"
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr "Notenwert auf ganze Note setzen"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr "Notenwert auf halbe Note setzen"
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr "Notenwert auf drittel Note setzen"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr "Notenwert auf Viertelnote setzen"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr "Notenwert auf Achtelnote setzen"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr "Notenwert auf Sechzehntelnote setzen"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr "Notenwert auf ZweiunddreiÃigstelnote setzen"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr "Notenwert auf Vierundsechzigstelnote setzen"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr "Lautstärke (velocity) auf pianississimo setzen"
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr "Lautstärke (velocity) auf pianissimo setzen"
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr "Lautstärke (velocity) auf piano setzen"
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr "Lautstärke (velocity) auf mezzo-piano setzen"
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr "Lautstärke (velocity) auf mezzo-forte setzen"
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr "Lautstärke (velocity) auf forte setzen"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr "Lautstärke (velocity) auf fortississimo setzen"
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Triolen an/aus"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr "Keine punktierten Noten"
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr "Punktierte Noten an/aus"
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr "Doppelt punktierte Noten an/aus"
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr "Punktierte Triolen an/aus"
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Akkordeingabe umschalten"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Ausgewählte Noten ertönen über Notenlänge"
-
-#: stereo_panner.cc:127
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr "L:%3d R:%3d Breite:%d%%"
-#: stereo_panner.cc:270
+#: stereo_panner.cc:272
msgid "Panner|M"
msgstr "M"
-#: stereo_panner_editor.cc:35
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr "Stereo Panner"
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr "Breite"
@@ -13541,6 +14717,10 @@ msgstr "Breite"
msgid "Strip Silence"
msgstr "Stille entfernen"
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Threshold"
+
#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr "Mindestlänge"
@@ -13549,168 +14729,177 @@ msgstr "Mindestlänge"
msgid "Fade length"
msgstr "Fade-Länge"
-#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:295
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
msgid "Analyzing"
msgstr "Analysiere"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "Takt:"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "Schlag:"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr "Pulsnote"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr "Tempo tappen"
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
-#: tempo_dialog.cc:344
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "Ganze"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
-#: tempo_dialog.cc:346
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "Halbe"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
-#: tempo_dialog.cc:348
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "Drittel"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
-#: tempo_dialog.cc:350
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "Viertel"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
-#: tempo_dialog.cc:352
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "Achtel"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
-#: tempo_dialog.cc:354
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "Sechzehntel"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "Zweiunddreissigstel"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
-#: tempo_dialog.cc:358
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "Vierundsechzigstelnote"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
-#: tempo_dialog.cc:360
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "Hundertachtundzwanzigstelnote"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "verlaufend"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "konstant"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "Musik"
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Schläge pro Minute:"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr "Tempo beginnt bei"
-#: tempo_dialog.cc:254
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "Sperrstil:"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "Tempotyp:"
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr "Unverständlicher Puls-Notentyp (%1)"
-#: tempo_dialog.cc:375
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr "unverständlicher Tempotyp (%1)"
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr "unverständlicher Sperrstil (%1)"
+
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "Notenwert:"
-#: tempo_dialog.cc:376
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "Sperrstil:"
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Schläge pro Takt:"
-#: tempo_dialog.cc:390
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr "Taktart beginnt bei Takt:"
-#: tempo_dialog.cc:503
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
msgstr "Unverständlicher Signatur-Notentyp (%1)"
-#: theme_manager.cc:61
-msgid "Dark Theme"
-msgstr "Dunkles Thema"
-
-#: theme_manager.cc:62
-msgid "Light Theme"
-msgstr "Helles Thema"
-
-#: theme_manager.cc:63
-msgid "Restore Defaults"
-msgstr "Standards wiederherstellen"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr "unverständlicher Sperrstil für Metrum (%1)"
-#: theme_manager.cc:64
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr "Zeichne \"flache\" Schaltflächen"
-#: theme_manager.cc:65
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr "Aufnahmebereitschaftsknopf blinkt"
-#: theme_manager.cc:66
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Färbe Regionen in der Spurfarbe ein"
-#: theme_manager.cc:67
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr "Clipping der Wellenform anzeigen"
-#: theme_manager.cc:69
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr "Farbverlaufs-Intensität der Wellenform"
-#: theme_manager.cc:71
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr "Farbverlaufs-Intensität von Zeitleisten-Objekten "
-#: theme_manager.cc:72
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr "Alle schwebenden Fenster sind Dialoge"
-#: theme_manager.cc:73
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr "Transientenfenster folgt Hauptfenster"
-#: theme_manager.cc:74
+#: theme_manager.cc:63
msgid "Float detached monitor-section window"
msgstr "Abgelöstes Monitorsektionfenster schwebend"
-#: theme_manager.cc:75
+#: theme_manager.cc:64
msgid "Icon Set"
msgstr "Icon-Satz"
-#: theme_manager.cc:84
-msgid "Object"
-msgstr "Objekt"
-
-#: theme_manager.cc:162
-msgid "Items"
-msgstr "Objekte"
-
-#: theme_manager.cc:163
-msgid "Palette"
-msgstr "Palette"
-
-#: theme_manager.cc:164
-msgid "Transparency"
-msgstr "Transparenz"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -13722,7 +14911,7 @@ msgstr ""
"Dies kann bei einigen Fenstermanagern helfen. Sie müssen %1 starten, um "
"diese Option zu aktivieren"
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
@@ -13732,21 +14921,17 @@ msgstr ""
"Vordergrund-Fenster.\n"
"Dies erfordert einen Neustart von %1."
-#: theme_manager.cc:202
+#: theme_manager.cc:139
msgid ""
"When detaching the monitoring section, mark it as \"Utility\" window to stay "
"in front.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-"Beim Ablösen der Monitorsektion als \"Utility\"fenster markieren, damit es im "
-"Vordergrund bleibt.\n"
+"Beim Ablösen der Monitorsektion als \"Utility\"fenster markieren, damit es "
+"im Vordergrund bleibt.\n"
"Dies erfordert einen Neustart von %1"
-#: theme_manager.cc:643
-msgid "Color Palette"
-msgstr "Farbpalette"
-
-#: time_axis_view.cc:150
+#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr "Spur-/Busname (Doppelklick zum Bearbeiten)"
@@ -13756,71 +14941,71 @@ msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] "neue Dauer %1 Frame ist auÃerhalb des erlaubten Bereichs für %2"
msgstr[1] "neue Dauer %1 Frames ist auÃerhalb des erlaubten Bereichs für %2"
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Schnell, aber hässlich"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Ãberspringe Anti-Aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Inhalt:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr "Inhalt"
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr "zeitliche Verzerrung minimieren"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr "Formanten beibehalten"
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr "TimeFXDialog"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr "Tonhöhe ändern"
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr "Time Stretch Audio"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "Oktaven:"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "Halbtöne:"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr "Cents:"
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr "Tonhöhe ändern"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr "TimeFXButton"
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "Strecken/Stauchen"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr "<b>Fortschritt</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Aufnahme am Anfang des Punchbereichs starten"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Aufnahme am Ende des Punchbereichs beenden"
@@ -13889,154 +15074,202 @@ msgstr "MIDI Transponieren"
msgid "Transpose"
msgstr "Transponieren"
-#: ui_config.cc:230 ui_config.cc:368
+#: ui_config.cc:234 ui_config.cc:422
msgid "Loading default ui configuration file %1"
msgstr "lade voreingestellte UI-Konfigurationsdatei %1"
-#: ui_config.cc:233 ui_config.cc:371
+#: ui_config.cc:237 ui_config.cc:425
msgid "cannot read default ui configuration file \"%1\""
msgstr "Kann die voreingestellte UI-Konfigurationsdatei \"%1\" nicht lesen"
-#: ui_config.cc:236 ui_config.cc:376
+#: ui_config.cc:240 ui_config.cc:430
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
"Die voreingestellte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
"werden."
-#: ui_config.cc:244
+#: ui_config.cc:248
msgid "Could not find default UI configuration file %1"
msgstr "Konnte UI-Konfigurationsdatei für Voreinstellungen %1 nicht finden"
-#: ui_config.cc:287
+#: ui_config.cc:289
msgid "Loading color file %1"
msgstr "Lade Farbdatei %1"
-#: ui_config.cc:290
+#: ui_config.cc:292
msgid "cannot read color file \"%1\""
msgstr "kann Farbdatei \"%1\" nicht lesen"
-#: ui_config.cc:295
+#: ui_config.cc:297
msgid "color file \"%1\" not loaded successfully."
msgstr "Farbdatei \"%1\" konnte nicht geladen werden."
-#: ui_config.cc:301
-msgid "Color file %1 not found"
-msgstr "Farbdatei %1 nicht gefunden"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr "Farbdatei für %1 unter %2 nicht gefunden"
-#: ui_config.cc:350 ui_config.cc:429
+#: ui_config.cc:403 ui_config.cc:486
msgid "Color file %1 not saved"
msgstr "Farbdatei %1 nicght gespeichert"
-#: ui_config.cc:385
+#: ui_config.cc:439
msgid "Loading user ui configuration file %1"
msgstr "Lade benutzerdefinierte UI-Konfigurationsdatei %1"
-#: ui_config.cc:388
+#: ui_config.cc:442
msgid "cannot read ui configuration file \"%1\""
msgstr "kann die UI-Konfigurationsdatei \"%1\" nicht lesen"
-#: ui_config.cc:393
+#: ui_config.cc:447
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
"Die benutzerdefinierte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
"werden."
-#: ui_config.cc:401
+#: ui_config.cc:455
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
"Konnte keine UI-Konfigurationsdatei finden, die Arbeitsfläche wird nicht "
"korrekt dargestellt werden."
-#: ui_config.cc:419
+#: ui_config.cc:476
msgid "Config file %1 not saved"
msgstr "Konfigurationsdatei %1 nicht gespeichert"
-#: ui_config.cc:660
+#: ui_config.cc:720
msgid "Color %1 not found"
msgstr "Farbe %1 nicht gefunden"
-#: ui_config.cc:730
+#: ui_config.cc:790
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
"Kann den UI-Stil Datei %1 im Suchpfad %2 nicht finden. %3 wird merkwürdig "
"aussehen"
-#: utils.cc:114 utils.cc:157
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "Fehlerhafter XPM Header %1"
-#: utils.cc:574
+#: utils.cc:365
msgid "cannot find XPM file for %1"
msgstr "Konnte XPM-Datei für %1 nicht finden"
-#: utils.cc:594 utils.cc:624 utils.cc:638
+#: utils.cc:418 utils.cc:448 utils.cc:468
msgid "default"
msgstr "voreingestellt"
-#: utils.cc:639
+#: utils.cc:469
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
"Icon \"%1\" wurde im Icon-Satz \"%2\" nicht gefunden, greife auf "
"Voreinstellung zurück"
-#: utils.cc:646
+#: utils.cc:476
msgid "cannot find icon image for %1 using %2"
msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden"
-#: utils.cc:663 utils.cc:679
+#: utils.cc:493 utils.cc:509
msgid "Caught exception while loading icon named %1"
msgstr ""
"Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf"
-#: utils.cc:939
+#: utils.cc:759
msgid "Overwrite"
msgstr "Ãberschreiben"
-#: add_video_dialog.cc:54
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "Solo Slaves"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr "Mute Slaves"
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "diesen VCA-Kanalzug verstecken"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "Klicken, um nur Slaves anzuzeigen"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr "Alle Slaves lösen"
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "Klicken, um normalen Mixer anzuzeigen"
+
+#: add_video_dialog.cc:55
msgid "Set Video Track"
msgstr "Videospur-Einstellungen"
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
msgid "Open Video Monitor Window"
msgstr "Videomonitorfenster öffnen"
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
msgid "Adjust Session Framerate to Match Video Framerate"
msgstr "Projekt-Framerate an Video-Framerate anpassen"
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
msgid "Reload docroot"
msgstr "docroot neu laden"
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
msgid "Video files"
msgstr "Videodateien"
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
msgid "<b>Video Information</b>"
msgstr "<b>Videoinformationen</b>"
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
msgid "Start:"
msgstr "Start:"
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
msgid "Frame rate:"
msgstr "Framerate:"
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
msgid "Aspect Ratio:"
msgstr "Seitenverhältnis:"
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
msgid "VideoServerIndex"
msgstr "VideoServerIndex"
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
msgid " %1 fps"
msgstr " %1 fps"
-#: video_timeline.cc:472
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr "Alle Slave-Zuweisungen aufheben"
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "Nur Slaves anzeigen"
+
+#: video_timeline.cc:473
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
@@ -14045,7 +15278,7 @@ msgstr ""
"den Videoserver lesbar? Ist die docroot passend eingestellt? Ist die Datei "
"tatsächlich eine Videodatei?"
-#: video_timeline.cc:510
+#: video_timeline.cc:511
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
@@ -14053,7 +15286,7 @@ msgstr ""
"Setzen der Projektframerate fehlgeschlagen: '%1' hat keine entsprechende "
"Einstellungsoption in %2."
-#: video_timeline.cc:518
+#: video_timeline.cc:519
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
@@ -14061,7 +15294,7 @@ msgstr ""
"Framerate der Videodatei entspricht nicht der Framerate des Timecodes im %1-"
"Projekt: '%2' vs. '%3'"
-#: video_timeline.cc:591
+#: video_timeline.cc:592
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
@@ -14071,7 +15304,7 @@ msgstr ""
"Das bedeutet üblicherweise, dass der Videoserver nicht von %1 gestartet "
"wurde und einen anderen Dokumenten-Wurzelpfad verwendet."
-#: video_timeline.cc:728
+#: video_timeline.cc:729
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -14088,11 +15321,11 @@ msgstr ""
"\n"
"Siehe auch http://manual.ardour.org/video-timeline/setup/"
-#: video_timeline.cc:743
+#: video_timeline.cc:744
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr "Videomonitor 'xjadeo' kann nicht gestartet werden."
-#: video_timeline.cc:770
+#: video_timeline.cc:776
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
@@ -14100,7 +15333,7 @@ msgstr ""
"Videomonitor 'xjadeo' ist zu alt. Bitte installieren Sie xjadeo in Version "
"0.7.7 oder höher. http://xjadeo.sf.net/"
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr "Videomonitor: Datei nicht gefunden."
@@ -14129,11 +15362,10 @@ msgstr ""
"ebenfalls mit dem Videoserver auf http://x42.github.com/harvid/ erhältlich.\n"
"\n"
"Wichtig: Die Dateien müssen in $PATH installiert werden und nach "
-"ffmpeg_harvid "
-"und ffprobe_harvid umbenannt werden.\n"
+"ffmpeg_harvid und ffprobe_harvid umbenannt werden.\n"
"Falls Sie eine geeignete ffmpeg-Installation auf Ihrem System haben, "
-"empfehlen wir, symbolische Verknüpfungen von ffmpeg auf ffmpeg_harvid und von "
-"ffprobe auf ffprobe_harvid zu erzeugen.\n"
+"empfehlen wir, symbolische Verknüpfungen von ffmpeg auf ffmpeg_harvid und "
+"von ffprobe auf ffprobe_harvid zu erzeugen.\n"
"\n"
"Sehen Sie auch http://manual.ardour.org/video-timeline/setup/"
@@ -14175,8 +15407,7 @@ msgid ""
"window for more information."
msgstr ""
"Keine ffmpeg-Installation gefunden. Videoimport ist nicht möglich. Sehen Sie "
-"im "
-"Logfenster nach weiteren Informationen."
+"im Logfenster nach weiteren Informationen."
#: transcode_video_dialog.cc:120
msgid ""
@@ -14191,10 +15422,6 @@ msgstr ""
msgid "FPS:"
msgstr "FPS:"
-#: transcode_video_dialog.cc:139
-msgid "Duration:"
-msgstr "Dauer:"
-
#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr "Codec:"
@@ -14258,7 +15485,7 @@ msgstr "Extrahiere Audio..."
#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
-msgstr "Extrahieren des Audio gescheitert."
+msgstr "Extrahieren des Audio fehlgeschlagen."
#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
@@ -14266,7 +15493,7 @@ msgstr "Transkodiere Video.."
#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
-msgstr "Transkodieren gescheitert"
+msgstr "Transkodieren fehlgeschlagen."
#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
@@ -14331,11 +15558,11 @@ msgstr "Setze Video-Serverpfad"
msgid "Server docroot"
msgstr "Server-docroot"
-#: utils_videotl.cc:61
+#: utils_videotl.cc:63
msgid "Destination is outside Video Server's docroot. "
msgstr "Ziel ist ausserhalb der docroot des Videoservers."
-#: utils_videotl.cc:62
+#: utils_videotl.cc:64
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
@@ -14344,15 +15571,15 @@ msgstr ""
"Videoservers. Die Datei wird für den Videoserver nicht lesbar sein. Wollen "
"Sie wirklich fortfahren?"
-#: utils_videotl.cc:65
+#: utils_videotl.cc:67
msgid "Continue"
msgstr "Fortfahren"
-#: utils_videotl.cc:72
+#: utils_videotl.cc:74
msgid "Confirm Overwrite"
msgstr "Bestätige das Ãberschreiben"
-#: utils_videotl.cc:82 utils_videotl.cc:98
+#: utils_videotl.cc:84 utils_videotl.cc:100
msgid "Cannot create video folder \"%1\" (%2)"
msgstr "Kann Videoordner \"%1\" nicht erstellen (%2)"
@@ -14410,8 +15637,7 @@ msgid ""
"window for more information."
msgstr ""
"Keine ffmpeg-Installation gefunden. Videoexport ist nicht möglich. Sehen Sie "
-"im "
-"Logfenster nach weiteren Informationen."
+"im Logfenster nach weiteren Informationen."
#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
@@ -14462,16 +15688,16 @@ msgid "Audio Samplerate:"
msgstr "Audiosamplerate:"
#: export_video_dialog.cc:215 export_video_dialog.cc:223
-#: export_video_dialog.cc:801 export_video_dialog.cc:804
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr "(Voreinstellung für Format)"
#: export_video_dialog.cc:233 export_video_dialog.cc:244
-#: export_video_dialog.cc:808 export_video_dialog.cc:817
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr "(Voreinstellung)"
-#: export_video_dialog.cc:245 export_video_dialog.cc:811
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr "(beibehalten)"
@@ -14487,19 +15713,19 @@ msgstr "von Videostart bis Videoende"
msgid "Selected range"
msgstr "Ausgewählter Bereich"
-#: export_video_dialog.cc:560
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr "Audio normalisieren"
-#: export_video_dialog.cc:564
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr "Exportiere Audio"
-#: export_video_dialog.cc:619
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr "Exportiere Audio..."
-#: export_video_dialog.cc:676
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
@@ -14507,37 +15733,37 @@ msgstr ""
"Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende "
"statt dessen die Dauer aus der Zeitleiste."
-#: export_video_dialog.cc:706
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr "Video Export: Exportbereich enthält kein Video."
-#: export_video_dialog.cc:719
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
"Exportiere Video: Keine Master-Ausgangsports zum Verbinden für den "
"Audioexport"
-#: export_video_dialog.cc:761
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr "Enkodiere Video..."
-#: export_video_dialog.cc:781
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden."
-#: export_video_dialog.cc:887
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr "Kodiere Video.. Durchgang 1/2"
-#: export_video_dialog.cc:899
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr "Kodiere Video.. Durchgang 2/2"
-#: export_video_dialog.cc:1002
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr "Transkodieren fehlgeschlagen."
-#: export_video_dialog.cc:1238 export_video_dialog.cc:1258
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr "Sichere exportierte Videodatei"
@@ -14577,3 +15803,177 @@ msgstr ""
"\n"
"Handbuch im Browser öffnen? "
+#~ msgid "dbFS"
+#~ msgstr "dbFS"
+
+#~ msgid ":monitor"
+#~ msgstr ":monitor"
+
+#~ msgid "system:"
+#~ msgstr "system:"
+
+#~ msgid "alsa_pcm:"
+#~ msgstr "alsa_pcm:"
+
+#~ msgid "alsa_midi:"
+#~ msgstr "alsa_midi:"
+
+#~ msgid ""
+#~ "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
+#~ "is 0dBu ^= -18dbFS in an EBU calibrated system"
+#~ msgstr ""
+#~ "Geben Sie den Spitzenwert des erzeugten LTC-Signals in dbFS an. Ein guter "
+#~ "Wert für ein EBU-kalibriertes System ist 0dBu ^= -18dbFS"
+
+#~ msgid ""
+#~ "Specify the audio signal level in dbFS at and above which the meter-peak "
+#~ "indicator will flash red."
+#~ msgstr ""
+#~ "Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder "
+#~ "Ãberschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt"
+
+#~ msgid "Display model"
+#~ msgstr "Anzeigetyp"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Graphen für jede Spur einzeln"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Graphen aller Spuren zusammenfassen"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalisieren"
+
+#~ msgid "Locations"
+#~ msgstr "Dateiorte"
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4Dies ist ein Projekt, das mit einer älteren Version von %3 erstellt "
+#~ "wurde%5\n"
+#~ "\n"
+#~ "%3 hat die alte Projektdatei\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "nach\n"
+#~ "\n"
+#~ "%6%2%7 kopiert.\n"
+#~ "\n"
+#~ "Benutzen Sie von nun an die -2000 Version mit älteren Versionen von %3"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Ziehen abbrechen oder alles deselektieren"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "Kommando, das nach dem Export ausgeführt werden soll\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Neue Gruppe erzeugen aus"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Wählen Sie eine Aktion und drücken Sie dann die Taste(n) \n"
+#~ "um das Tastaturkürzel zu setzen"
+
+#~ msgid "Program "
+#~ msgstr "Programm"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Kommentare*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Kmt*"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID für Fernsteuerung..."
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Remote ID des Eingabegeräts"
+
+#~ msgid "assigned by user"
+#~ msgstr "vom Benutzer festgelegt"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "folgt Reihenfolge im Mixer"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Sie können keine Spur mit einem Namen erstellen, der für %1 reserviert "
+#~ "ist."
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID für Fernsteuerung"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID für Fernsteuerung:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "Die Fernbedienungs-ID von %1 ist: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Die Fernbedienungs-ID von %3 kann nicht geändert werden."
+
+#~ msgid "the master bus"
+#~ msgstr "der Master-Bus"
+
+#~ msgid "the monitor bus"
+#~ msgstr "der Monitor-Bus"
+
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "Die Fernbedienungs-ID von %5 ist: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Fernbedienungs-IDs werden zur Zeit durch die Reihenfolge der Spuren/Busse "
+#~ "in %6 bestimmt.\n"
+#~ "\n"
+#~ "%3Benutzen Sie den Reiter GUI im Fenster \"Einstellungen\", um dies zu "
+#~ "ändern%4"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track. Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt "
+#~ "das Menü."
+
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr ""
+#~ "Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Dunkles Thema"
+
+#~ msgid "Light Theme"
+#~ msgstr "Helles Thema"
+
+#~ msgid "Color file %1 not found"
+#~ msgstr "Farbdatei %1 nicht gefunden"
diff --git a/gtk2_ardour/po/el.mo b/gtk2_ardour/po/el.mo
new file mode 100644
index 0000000..bd41b8f
Binary files /dev/null and b/gtk2_ardour/po/el.mo differ
diff --git a/gtk2_ardour/po/el.po b/gtk2_ardour/po/el.po
index 329a1e0..af4cb5c 100644
--- a/gtk2_ardour/po/el.po
+++ b/gtk2_ardour/po/el.po
@@ -7,264 +7,296 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk-ardour 0.347.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2007-04-11 02:27+0200\n"
"Last-Translator: Klearchos Gourgourinis <muadib at in.gr>\n"
"Language-Team: Hellenic\n"
-"Language: \n"
+"Language: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr ""
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr ""
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr ""
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr ""
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr ""
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr ""
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr ""
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr ""
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr ""
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr ""
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr ""
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr ""
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr ""
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr ""
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr ""
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr ""
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr ""
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr ""
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr ""
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr ""
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr ""
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr ""
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr ""
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr ""
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr ""
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr ""
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr ""
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr ""
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr ""
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr ""
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr ""
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr ""
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr ""
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr ""
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr ""
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr ""
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr ""
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr ""
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr ""
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr ""
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr ""
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr ""
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr ""
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr ""
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr ""
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr ""
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr ""
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr ""
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -273,7 +305,7 @@ msgid ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
msgstr ""
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -285,210 +317,264 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
msgstr ""
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
msgstr ""
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
msgstr ""
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
msgstr ""
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
msgstr ""
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
msgstr ""
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
msgstr ""
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
msgstr ""
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
msgstr ""
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr ""
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr ""
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr ""
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr ""
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr ""
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr ""
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr ""
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr ""
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr ""
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
msgstr ""
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr ""
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr ""
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr ""
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr ""
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr ""
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr ""
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr ""
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr ""
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -497,60 +583,61 @@ msgid ""
"track instead."
msgstr ""
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "ÎανονικÏ"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr ""
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr ""
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr ""
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr ""
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr ""
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr ""
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr ""
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr ""
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr ""
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr ""
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr ""
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr ""
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr ""
@@ -558,177 +645,215 @@ msgstr ""
msgid "Ambiguous File"
msgstr ""
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
"Please select the path that you want to get the file from."
msgstr ""
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr ""
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr ""
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr ""
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr ""
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr ""
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
msgstr ""
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:49
+msgid "Fit dB range"
msgstr ""
-#: analysis_window.cc:55
-msgid "Normalize values"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr ""
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr ""
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Îανάλι"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr ""
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr ""
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr ""
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "ÎκÏÏαÏη"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "ΣÏλο"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr ""
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr ""
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr ""
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "ΠληÏοÏοÏίεÏ"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "ΤοÏοθεÏίεÏ"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr ""
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr ""
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr ""
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr ""
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr ""
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Îεγάλο ÏÏολÏγιον"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr ""
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -736,45 +861,45 @@ msgid ""
"the audio backend and save the session."
msgstr ""
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr ""
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -785,39 +910,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr ""
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr ""
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -826,23 +951,23 @@ msgid ""
"controlled by %2"
msgstr ""
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr ""
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr ""
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr ""
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr ""
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -851,11 +976,11 @@ msgid ""
"\"Just quit\" option."
msgstr ""
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr ""
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -866,7 +991,7 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -877,74 +1002,107 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Î¥ÏοβολÎαÏ"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr ""
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr ""
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr ""
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr ""
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr ""
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr ""
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr ""
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr ""
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr ""
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr ""
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr ""
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr ""
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr ""
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -952,215 +1110,263 @@ msgid ""
"\">%<PRIu32>%%</span>"
msgstr ""
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr ""
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr ""
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr ""
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr ""
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr ""
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Î ÏÏÏÏαÏÎµÏ ÏÏ
νεδÏίεÏ"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Îνοιγμα ΣÏ
νεδÏίαÏ"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr ""
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr "Îεν γίνεÏαι να ÏÏοÏÏεθεί κανάλι ÏÏÏÎ¯Ï Î®Î´Î· ÏοÏÏÏμÎνη ÏÏ
νεδÏία."
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
msgstr ""
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
msgstr ""
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
msgstr ""
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr ""
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
msgstr ""
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr ""
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
msgstr ""
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr ""
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr ""
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-ÏÏοÏÏÎδιο"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
"already exists. Do you want to open it?"
msgstr ""
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr ""
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr ""
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr ""
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr ""
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr ""
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "ΠΣÏ
νεδÏία \"%1 (ÏÏιγμιÏÏÏ
Ïο %2)\" δεν ÏοÏÏÏθηκε εÏιÏÏ
ÏÏÏ"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr ""
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "ΠΣÏ
νεδÏία \"%1 (ÏÏιγμιÏÏÏ
Ïο %2)\" δεν ÏοÏÏÏθηκε εÏιÏÏ
ÏÏÏ"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr ""
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr ""
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr ""
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1173,19 +1379,19 @@ msgstr ""
"ÏÏειάζονÏαι κάÏοια αÏÏεία ÏοÏ
δεν\n"
"ÏÏηÏιμοÏοιοÏνÏαι αλλοÏ."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr ""
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr ""
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr ""
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1195,7 +1401,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1217,90 +1423,126 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr ""
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
"Clean-up will move all unused files to a \"dead\" location."
msgstr ""
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr ""
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr ""
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "διαγÏαμμÎνα αÏÏεία"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr ""
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr ""
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr ""
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr ""
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr ""
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr ""
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "δεν μÏÏÏεÏα να Î±Î½Î¿Î¯Î¾Ï Ïο %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr ""
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr "η ÎγγÏαÏή διεκÏÏη διÏÏι Ïο ÏÏÏÏημά δεν μÏοÏοÏÏε να ανÏαÏεξÎλθει."
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1309,23 +1551,23 @@ msgid ""
"quickly enough to keep up with recording.\n"
msgstr ""
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr ""
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr ""
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1334,11 +1576,11 @@ msgid ""
"quickly enough to keep up with playback.\n"
msgstr ""
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr ""
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1349,42 +1591,43 @@ msgid ""
"what you would like to do.\n"
msgstr ""
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "ÎιαγÏαÏή ÏÏ
ÏÏν δεδομÎνÏν"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "ÎνάκληÏη αÏÏ 'κÏαÏάÏιÏμα'"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr ""
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
"audio may be played at the wrong sample rate.\n"
msgstr ""
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr ""
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr ""
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1396,88 +1639,113 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI: Î 'editor' δεν μÏοÏεί να εγεÏθεί"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "UI: ο μίκÏÎ·Ï Î´ÎµÎ½ μÏοÏεί να εγεÏθεί"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "ÎναÏαÏ/γή αÏÏ Ïον ÎναÏαÏαγÏγÎα"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "ÎιακοÏή ÎναÏαÏ/γήÏ"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr ""
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "ÎναÏαÏ/γή διαÏÏήμαÏοÏ/εÏιλογήÏ"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "ÎÏÏή ÏÎ·Ï ÏÏ
νεδÏίαÏ"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "ΤÎÎ»Î¿Ï ÏοÏ
ÏÏ
νεδÏίαÏ"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "ÎÏαναληÏÏική αναÏαÏ/γή διαÏÏήμαÏοÏ"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
msgstr ""
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "ÎÏιÏÏÏοÏή ÏÏην ÏελεÏ
Ïαία θεÏη μεÏα αÏο ÏαÏÏη"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Î ÏοÏοÏή ÏÏο input monitoring"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "ÎÏÏη/ΠαÏÏη μεÏÏονÏμοÏ
"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
msgstr ""
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr ""
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1485,7 +1753,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1493,450 +1761,559 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr ""
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr ""
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr ""
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr ""
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr ""
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr ""
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "ÎιάÏοÏα"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr ""
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr ""
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr ""
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI: Î 'editor' δεν μÏοÏεί να εγεÏθεί"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UI: ο μίκÏÎ·Ï Î´ÎµÎ½ μÏοÏεί να εγεÏθεί"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr ""
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr ""
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr ""
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "ΣÏ
νεδÏία"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Sync"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "ÎÏιλογÎÏ"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr ""
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Îοήθεια!"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr ""
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr ""
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr ""
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr ""
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "ÎÏιÏÎ¬Î½ÎµÎ¹ÎµÏ ÎµÎ»ÎγÏοÏ
"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Plugins"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "ÎÎÏÏηÏη"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr ""
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr ""
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr ""
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr ""
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr ""
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr ""
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "ÎλείÏιμο"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr ""
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr ""
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr ""
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr ""
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "ÎÏοθήκεÏ
Ïη ÏÏοÏÏεδίοÏ
..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr ""
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr ""
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "ÎξαγÏγή"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr ""
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr ""
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "ÎξοδοÏ"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "ÎÏÏÏιμο"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "ÎεγιÏÏοÏοίηÏη ÏÏÏοÏ
για Ïον Editor"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr ""
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
msgstr ""
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
msgstr ""
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
msgstr ""
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr ""
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr ""
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr ""
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr ""
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
msgstr ""
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr ""
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr ""
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr ""
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "ÎÏοθήκεÏ
Ïη"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr ""
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "ΠαÏÏη"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr ""
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr ""
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr ""
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr ""
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr ""
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr ""
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr ""
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "ÎνεÏγοÏοίηÏη ÎγγÏαÏήÏ"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr ""
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr ""
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr ""
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr ""
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr ""
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr ""
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr ""
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr ""
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Πήγαινε ÏÏην ÎÏÏή"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr ""
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr ""
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1944,257 +2321,274 @@ msgstr ""
msgid "Timecode"
msgstr ""
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr ""
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr ""
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr ""
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr ""
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr ""
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr ""
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr ""
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr ""
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr ""
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "ÎεÏÏονÏμοÏ"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr ""
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr ""
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr ""
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr ""
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr ""
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "ΠοÏοÏÏÏ"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "ÎμιÏÏνια"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "ÎÏοÏÏολή MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "ÎÏοÏÏολή MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr ""
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr ""
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr ""
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr ""
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr ""
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr ""
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr ""
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr ""
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr ""
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
msgstr ""
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "ÎÏÏÏεÏικÏ"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr ""
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr ""
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr ""
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr ""
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr ""
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "ΧÏÏνοÏ"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "ÎεÏÏηÏήÏ"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: %1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr ""
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "ÎÏάÏεÏ:ÎÏÏÏοι"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "ÎεÏÏά:ÎεÏÏεÏα"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr ""
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr ""
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr ""
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr ""
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr ""
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr ""
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "Î ÏοÏθεÏη ÏημείοÏ
ελÎγÏοÏ
gain"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr ""
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "μεÏακίνηÏη ÏÏ
μβάνÏÎ¿Ï Î±Ï
ÏομαÏιÏμοÏ"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "αÏαλοιÏή ÏημείοÏ
ελÎγÏοÏ
"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr ""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr ""
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2206,63 +2600,59 @@ msgstr "ÎαÏάÏÏαÏη αÏ
ÏομαÏιÏμοÏ"
msgid "hide track"
msgstr "αÏÏκÏÏ
Ïη καναλιοÏ"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr ""
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "ÎναÏαÏ/γή"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "ÎÏάÏε"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Îγγιγμα"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "εκκαθάÏιÏη αÏ
ÏομαÏιÏμοÏ"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "ÎÏÏÏιμο"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "ÎκκαθάÏιÏη"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "ÎαÏάÏÏαÏη"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr ""
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "ÎÏαμμικÏ"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "ÎειÏοÏ
Ïγία"
@@ -2278,35 +2668,38 @@ msgstr ""
msgid "Direction:"
msgstr ""
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr ""
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr ""
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "ÎÏεξεÏγαÏία"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr ""
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr ""
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "ÎÎο"
@@ -2322,6 +2715,39 @@ msgstr ""
msgid "Rename Channel"
msgstr ""
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr ""
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "ΧÏÏμα"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr ""
@@ -2334,6 +2760,42 @@ msgstr ""
msgid "Value"
msgstr "Îξία"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr ""
@@ -2371,2060 +2833,2155 @@ msgstr ""
msgid "Velocity"
msgstr ""
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr ""
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr ""
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr ""
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr ""
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "ÎεÏ
ÏεÏÏλεÏÏα"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "ÎεÏÏά"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr ""
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr ""
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "ÎÏÏÏοι/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr ""
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr ""
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr ""
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "ÎÏÏÏοι/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr ""
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr ""
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr ""
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "ÎÏÏÏοι/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr ""
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr ""
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr ""
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "ÎÏÏÏοι/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "ÎÏÏÏοι/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr ""
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "ÎÏÏÏοι"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "ÎÏάÏεÏ"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "ΣÏίγμαÏα"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "ÎÏÏÎÏ Î ÎµÏιοÏÏν"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "ΤÎλη ΠεÏιοÏÏν"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "ΣÏ
γÏÏονιÏμÏÏ Î ÎµÏιοÏÏν"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "ÎÏια ÏεÏιοÏÏν"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr ""
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr ""
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "ÎαγνηÏικÏ"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr ""
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "ΣÏίγμα"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr ""
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "ÎλίÏθηÏη"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Splice"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "ÎλείδÏμα"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "ÎÏιÏÏεÏÏ"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "ÎεξιÏ"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "ÎÎνÏÏο"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr ""
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr ""
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr ""
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr ""
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr ""
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr ""
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr ""
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr ""
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "ÎεÏÏά:ÎÎÏ
ÏεÏα"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "ΣÏίγμαÏα ΤοÏοθεÏίαÏ"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "ΣÏίγμαÏα διαÏÏημάÏÏν"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "ÎιαÏÏήμαÏα Loop/Punch"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr ""
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "λειÏοÏ
Ïγία"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr ""
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "ΠεÏιοÏÎÏ"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr ""
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "ΣÏιγμιÏÏÏ
Ïα"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr ""
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr ""
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Loop"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Punch"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr ""
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr ""
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr ""
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "ÎÏγÏ"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "ΤαÏÏ"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "ÎÏενεÏγοÏοίηÏη"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "ÎνεÏγοÏοίηÏη"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "ΠάγÏμα"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "ÎεÏάγÏμα"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr ""
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr ""
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr ""
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr ""
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr ""
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr ""
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr ""
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr ""
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr ""
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr ""
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "ÎÏιλογή ÏλÏν ÏÏο διάÏÏημα"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr ""
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr ""
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Î ÏÏÏθεÏη ΣÏιγμάÏÏν ÎιαÏÏήμαÏοÏ"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr ""
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "ÎνÏιγÏαÏή διαÏÏήμαÏοÏ"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr ""
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr ""
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr ""
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr ""
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "Loop ΠεÏιοÏήÏ"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr ""
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr ""
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr ""
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr ""
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr ""
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr ""
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr ""
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr ""
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "ÎÏιλογή ÏλÏν μεÏά Ïην playhead"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "ÎÏιλογή ÏλÏν ÏÏιν Ïην playhead"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr ""
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "ÎÏιλογή"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "ÎοÏή"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "ÎνÏιγÏαÏή"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "ÎÏικÏλληÏη"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "ÎÏ
θÏ
γÏάμμιÏη"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "ÎÏ
θÏ
γÏάμμιÏη ÏÏεÏικÏν"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "ÎιÏαγÏγή εÏιλεγμÎÎ½Î·Ï ÏεÏιοÏήÏ"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr ""
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr ""
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr ""
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr ""
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr ""
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "ÎÏξη"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr ""
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr ""
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr ""
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr ""
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr ""
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr ""
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
msgstr ""
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr ""
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr ""
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr ""
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr ""
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr ""
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr ""
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "ÎÏÏίαÏη Zoom"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr ""
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr ""
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr ""
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr ""
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr ""
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "ÎειÏοÏ
Ïγία ÎÏεξ/ÏίαÏ"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
msgstr ""
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr ""
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr ""
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Redo"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Redo (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "ÎνÏιγÏαÏή"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr ""
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr ""
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr ""
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr ""
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr ""
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr ""
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr ""
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr ""
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr ""
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr ""
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr ""
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr ""
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr ""
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr ""
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr ""
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr ""
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr ""
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr ""
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr ""
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr ""
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr ""
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr ""
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr ""
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
"If it is deleted, audio files used by it alone will be cleaned."
msgstr ""
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr ""
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr ""
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "ÎκÏÏÏÏη"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "νÎÎµÏ playlists"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "ÎνÏιγÏαÏή playlists"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "εκκαθάÏιÏη playlists"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr ""
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr ""
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr ""
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr ""
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr ""
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "ÎÏ
ÏÏμαÏηΣÏνδεÏη"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr ""
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr ""
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr ""
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr ""
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr ""
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr ""
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr ""
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "ΣÏÏÏμαÏοÏοίηÏη"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "ÎÎÏη"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "ÎÏοÏÏάθμιÏη"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr ""
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr ""
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr ""
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr ""
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "ÎÏÏίαÏη Zoom"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr ""
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr ""
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "ΠαÏÏη ÎεÏÏηÏή"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr ""
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr ""
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr ""
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr ""
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr ""
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr ""
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "ÎνÎÏÎ³ÎµÎ¹ÎµÏ Î ÎµÏιοÏÏν"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr ""
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr ""
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr ""
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr ""
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr ""
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr ""
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "ÎÏοÏ"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "ÎÏγαλεία"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "ÎÏη"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr ""
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Îνάδειξη ÎίκÏη ÏοÏ
Editor"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr ""
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr ""
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Playhead ÏÏην εÏÏμενη Region Start"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Playhead ÏÏην εÏÏμενη Region End"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Playhead ÏÏην εÏÏμενη Region Sync"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Playhead ÏÏην ÏÏοηγοÏμενη Region Start"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Playhead ÏÏην ÏÏοηγοÏμενη Region End"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Playhead ÏÏην ÏÏοηγοÏμενη Region Sync"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr ""
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr ""
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr ""
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr ""
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr ""
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr ""
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr ""
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr ""
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr ""
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Playhead ÏÏην ÎÏÏή ÎιαÏÏήμαÏοÏ"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Î playhead ÏÏο ÏÎÎ»Î¿Ï ÏοÏ
διαÏÏήμαÏοÏ"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr ""
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "ÎÏοεÏιλογή ÏλÏν"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr ""
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr ""
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr ""
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "ÎÏιλογή ÏλÏν μÎÏα ÏÏο punch ÏÏιο"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr ""
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr ""
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr ""
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr ""
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr ""
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr ""
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr ""
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr ""
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr ""
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr ""
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr ""
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr ""
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr ""
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr ""
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr ""
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr ""
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr ""
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr ""
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr ""
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr ""
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr ""
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr ""
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr ""
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr ""
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "ÎÏλιÏη ÎαναλιÏν εÏάνÏ"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "ÎÏλιÏη ÎαναλιÏν ÎάÏÏ"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "ÎεÏακίνηÏη ÎαναλιÏν εÏάνÏ"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "ÎεÏάθεÏη ÎαναλιÏν κάÏÏ"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "ÎÏλιÏη ÏίÏÏ"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "ÎÏλιÏη εμÏÏÏÏ"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Playhead ÏÏο κÎνÏÏο"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr ""
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Playhead εμÏÏÏÏ"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Playhead ÏίÏÏ"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr ""
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr ""
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr ""
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr ""
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr ""
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr ""
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr ""
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr ""
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr ""
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr ""
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "ÎξαγÏγή διαÏÏήμαÏοÏ"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr ""
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr ""
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr ""
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr ""
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr ""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr ""
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr ""
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "ÎναÏκÏήÏιο διάÏÏημα"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "ÎλοκλήÏÏÏη ÎιαÏÏήμαÏοÏ"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "ÎκολοÏ
θÏνÏÎ±Ï Ïην playhead"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr ""
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr ""
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr ""
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr ""
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "ÎÏαλοιÏή"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr ""
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "ÎÎγιÏÏο"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "ÎεγαλÏÏεÏο"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Îεγάλο"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "ÎικÏÏ"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr ""
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "ÎÏÏίαÏη Zoom αÏιÏÏεÏά"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "ÎÏÏίαÏη Zoom δεξιά"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "ÎÏÏίαÏη Zoom κÎνÏÏο"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "ÎÏÏίαÏη Zoom ÏÏην playhead"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr ""
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr ""
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr ""
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr ""
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr ""
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "ÎÏγαλείο Object"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "ÎÏγαλείο ÎιαÏÏήμαÏοÏ"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr ""
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr ""
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr ""
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr ""
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr ""
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr ""
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr ""
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr ""
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr ""
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "ÎειÏοÏ
Ïγία ÎλξεÏÏ"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr ""
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr ""
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr ""
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr ""
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr ""
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr ""
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr ""
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr ""
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr ""
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr ""
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr ""
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr ""
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr ""
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr ""
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr ""
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr ""
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr ""
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr ""
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr ""
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr ""
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr ""
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr ""
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr ""
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr ""
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr ""
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr ""
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr ""
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr ""
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr ""
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr ""
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr ""
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr ""
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr ""
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr ""
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr ""
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr ""
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr ""
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr ""
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr ""
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr ""
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "ΤαξινÏμηÏη"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "ÎμÏάνιÏη ÎλÏν"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr ""
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "ÎÏξοÏ
Ïα"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "ΦθίνοÏ
Ïα"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Îε Îνομα ΠεÏιοÏήÏ"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Îε ÎÎÎ³ÎµÎ¸Î¿Ï Î ÎµÏιοÏήÏ"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Îε ÎÎÏη ΠεÏιοÏήÏ"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "Îε ΧÏονο-ÏÏάμÏα ΠεÏιοÏήÏ"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Îε ÎÏÏή-ÏÏο-αÏÏείο ÏÎ·Ï Î ÎµÏιοÏήÏ"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Îε ΤÎλοÏ-ÏÏο -αÏÏείο ÏÎ·Ï Î ÎµÏιοÏήÏ"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Îε Îνομα ÎÏÏείοÏ
ΠηγήÏ"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Îε ÎÎÎ³ÎµÎ¸Î¿Ï ÎÏÏείοÏ
ΠηγήÏ"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Îε Îμ/νία ÎÏÏείοÏ
ΠηγήÏ"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Îε Filesystem ΠηγήÏ"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr ""
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "ÎιÏαγÏγή"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr ""
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr ""
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr ""
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr ""
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr ""
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr ""
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr ""
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr ""
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "ÎαÏÏÏεÏο"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr ""
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr ""
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr ""
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr ""
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Σιγή"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr ""
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "ÎνÏιÏÏÏοÏή"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr ""
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr ""
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr ""
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr ""
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr ""
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Fade In"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Fade Out"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr ""
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "ÎÏμÏÏη καναλιοÏ"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "ÎÎÏη Loop ÎιαÏÏήμαÏοÏ"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr ""
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr ""
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr ""
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr ""
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr ""
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr ""
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr ""
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr ""
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr ""
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr ""
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr ""
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr ""
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr ""
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr ""
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr ""
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr ""
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr ""
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr ""
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr ""
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr ""
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr ""
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr ""
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr ""
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr ""
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr ""
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr ""
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr ""
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr ""
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr ""
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr ""
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr ""
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr ""
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr ""
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr ""
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr ""
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr ""
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr ""
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr ""
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr ""
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr ""
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr ""
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr ""
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr ""
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr ""
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr ""
@@ -4448,32 +5005,33 @@ msgid ""
"%2 as a new source, or skip it?"
msgstr ""
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "ÎκÏÏÏÏη ÎιÏαγÏγήÏ"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Editor: δεν γίνεÏαι να ανοίξει Ïο αÏÏείο \"%1\",(%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "ÎκÏÏÏÏη ÏÎ»Î·Ï ÏÎ·Ï ÎιÏαγÏγήÏ"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Îη Ïο εμÏÏ
ÏεÏÏειÏ"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr ""
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr ""
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4482,209 +5040,278 @@ msgstr ""
"Î ÏÏ
θμÏÏ Î´ÎµÎ¹Î³Î¼Î±ÏοληÏÎ¯Î±Ï Î±Ï
ÏÎ¿Ï ÏοÏ
αÏÏείοÏ
δεν ÏαιÏιάζει με αÏ
ÏÏν ÏÎ·Ï "
"ÏÏ
νεδÏίαÏ!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "ÎμÏÏÏεÏ
ÏÎ Ïο οÏÏÏÏ Î® άλλÏÏ"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr ""
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr ""
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "μεÏακίνηÏη ÏÏίγμαÏÎ¿Ï Î¼ÎµÏÏηÏή"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "ανÏιγÏαÏή ÏÏίγμαÏÎ¿Ï Î¼ÎµÏÏηÏή"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "μεÏακίνηÏη ÏÏίγμαÏÎ¿Ï Î¼ÎµÏÏηÏή"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "μεÏακίνηÏη ÏÏίγμαÏÎ¿Ï tempo"
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "ανÏιγÏαÏή ÏÏίγμαÏÎ¿Ï tempo"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "μεÏακίνηÏη ÏÏίγμαÏÎ¿Ï tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "αλλαγή μήκοÏ
Ï fade in"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "αλλαγή μήκοÏ
Ï fade out"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "μεÏακίνηÏη ÏÏίγμαÏοÏ"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr ""
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr ""
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr ""
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "ΧÏÏÎ¯Ï Ïνομα"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr ""
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr ""
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
msgstr ""
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr ""
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
msgstr ""
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr ""
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr ""
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr ""
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr ""
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr ""
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr ""
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr ""
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
msgstr ""
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr ""
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr ""
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
"ΣÏάλμα ÏÏογÏαμμαÏιÏμοÏ: ο ÎºÎ±Î¼Î²Î¬Ï ÏÏιγμάÏÏν δεν ÎÏει δείκÏη ανÏικειμÎνοÏ
"
"ÏÏιγμάÏÏν!"
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr ""
#: editor_group_tabs.cc:176
@@ -4699,130 +5326,163 @@ msgstr ""
msgid "end"
msgstr ""
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "ÏÏÏÏθεÏη ÏÏίγμαÏοÏ"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "ÎÎÏη loop διαÏÏήμαÏοÏ"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "θÎÏη punch διαÏÏήμαÏοÏ"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr ""
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "νÎο ÏÏίγμα διαÏÏήμαÏοÏ"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "αÏαλοιÏή ÏÏίγμαÏοÏ"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr ""
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr ""
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr ""
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr ""
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr ""
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr ""
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr ""
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr ""
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "ÎÏÏκÏÏ
Ïη ÎιαÏÏήμαÏοÏ"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr ""
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "ÎÏαλοιÏή ÎιαÏÏήμαÏοÏ"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "ÎιαÏÏÏιÏμÏÏ ÏεÏιοÏÏν ÏÏο διάÏÏημα"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr ""
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "ÎÎÏη Punch ÎιαÏÏήμαÏοÏ"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr ""
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "ÎεÏονομαÏία ΣÏίγμαÏοÏ"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "ÎεÏονομαÏία ÎιαÏÏήμαÏοÏ"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "ÎεÏονομαÏία"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "μεÏονομαÏία ÏÏίγμαÏοÏ"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
"ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: ο ÎºÎ±Î¼Î²Î¬Ï ÏÏÎ¯Î¾Î·Ï ÏοÏ
tempo δεν ÎÏει δείκÏη "
"ανÏικειμÎνοÏ
ÏÏιγμάÏÏν!"
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr ""
"ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: Ïο ÏÏίγμα για Ïο tempo δεν είναι ÏÏιγμα για tempo!"
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr ""
"ΣÏάλμα ÏÏογÏαμμαÏιÏμοÏ: Ïο ÏÏίγμα για Ïο μÎÏÏο δεν είναι ÏÏίγμα μÎÏÏοÏ
!"
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
@@ -4830,175 +5490,183 @@ msgstr ""
"ΣÏάλμα Î ÏογÏαμμαÏιÏμοÏ: ο ÎºÎ±Î¼Î²Î¬Ï ÏοÏ
ÏημείοÏ
ελÎγÏοÏ
δεν ÎÏει δείκÏη "
"αναÏοÏάÏ!"
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr ""
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "ΤÎÎ»Î¿Ï ÏημείοÏ
ιÏοÏÏαθμίÏεÏÏ"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Îνομα για ÏεÏιοÏή:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "διαÏÏÏιÏμÏÏ"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr ""
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr ""
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr ""
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr ""
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "νÏξη εμÏÏÏÏ"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr ""
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "build_region_boundary_cache εκλήθη με snap_type = %1"
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr ""
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr ""
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "εκκαθάÏιÏη ÏÏιγμάÏÏν"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "διαγÏαÏή διαÏÏημάÏÏν"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "διαγÏαÏή ÏοÏοθεÏιÏν"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "ÏÏοÏθήκη ÏεÏιοÏήÏ"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr ""
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr ""
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr ""
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr ""
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr ""
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr ""
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr ""
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr ""
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr ""
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "διαÏÏÏιÏμÏÏ"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr ""
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "ιÏοÏÏάθμιÏη ÏÏÎ¿Ï Ïα εÏιλεγμÎνα"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr ""
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr ""
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr ""
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr ""
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "εÏ
θÏ
γÏάμμιÏη εÏιλογήÏ"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "εÏ
θÏ
γÏάμμιÏη εÏÎ¹Î»Î¿Î³Î®Ï (ÏÏεÏική)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "εÏ
θÏ
γÏάμμιÏη ÏεÏιοÏήÏ"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr ""
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr ""
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr ""
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr ""
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5006,11 +5674,11 @@ msgid ""
"input or vice versa."
msgstr ""
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr ""
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5019,23 +5687,23 @@ msgid ""
"Freezing will only process the signal as far as the first send/insert/return."
msgstr ""
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr ""
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr ""
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr ""
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "ÎκÏÏÏÏη ÏαγÏμαÏοÏ"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5044,47 +5712,47 @@ msgid ""
"You can do this without processing, which is a different operation."
msgstr ""
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr ""
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "αναÏήδηÏη διαÏÏήμαÏο"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr ""
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "κοÏή"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "ανÏιγÏαÏή"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "εκκαθάÏιÏη"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr ""
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "αÏαλοιÏή ÏεÏιοÏήÏ"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "ανÏιγÏαÏή εÏιλογήÏ"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "νÏξη καναλιοÏ"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5092,136 +5760,156 @@ msgstr ""
"ΣÏ'αλήθεια θÎλεÏε να καÏαÏÏÏÎÏεÏε Ïην ÏελεÏ
Ïαία λήÏη?\n"
"(Î ÏÏάξη είναâι καÏαÏÏÏεÏÏική και δεν γίνεÏαι εÏαναÏοÏά ÏηÏ)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "ÎÏι, να μην γίνει ÏίÏοÏα."
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Îαι, να καÏαÏÏÏαÏεί."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr ""
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "εξομάλÏ
νÏη"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "ανÏιÏÏÏοÏή ÏεÏιοÏÏν"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr ""
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr ""
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr ""
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr ""
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr ""
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr ""
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr ""
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr ""
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr ""
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr ""
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr ""
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr ""
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr ""
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr ""
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr ""
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr ""
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr ""
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr ""
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr ""
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr ""
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr ""
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr ""
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr ""
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr ""
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5229,62 +5917,62 @@ msgid ""
"This could take a long time."
msgstr ""
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr ""
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
msgstr ""
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr ""
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr ""
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr ""
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr ""
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr ""
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr ""
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr ""
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr ""
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr ""
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr ""
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr ""
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5294,23 +5982,19 @@ msgid ""
"\"allow-special-bus-removal\" option to be \"yes\""
msgstr ""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5318,7 +6002,7 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5326,358 +6010,371 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
"This action cannot be undone, and the session file will be overwritten"
msgstr ""
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr ""
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Îαι, αÏάλοιÏε Ïο."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr ""
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr ""
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr ""
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr ""
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "Ïιγή ÏεÏιοÏήÏ"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr ""
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr ""
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr ""
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr ""
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr ""
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr ""
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr ""
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr ""
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr ""
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr ""
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr ""
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr ""
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr ""
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "ÎÏÏ
μμÎνο"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr ""
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
msgstr ""
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr ""
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr ""
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr ""
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr ""
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr ""
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr ""
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr ""
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr ""
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr ""
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr ""
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr ""
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr ""
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
msgstr ""
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
msgstr ""
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr ""
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr ""
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr ""
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "ÎÏÏκÏÏ
Ïη ÏλÏν"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Îνάδειξη ÏλÏν ÏÏν Audio ÎαναλιÏν"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "ÎÏÏκÏÏ
Ïη ÏλÏν ÏÏν Audio ÎαναλιÏν"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Îνάδειξη ÏλÏν ÏÏν Audio διαÏλÏν"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "ÎÏÏκÏÏ
Ïη ÏλÏν ÏÏν Audio διαÏλÏν"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr ""
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr ""
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "ÎÎο ÏÏίγμα θÎÏεÏÏ"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "ÎκκαθάÏιÏη ÏλÏν ÏÏν θÎÏεÏν"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr ""
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr ""
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "ÎκκαθάÏιÏη ÏλÏν ÏÏν διαÏÏημάÏÏν"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr ""
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr ""
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "ÎÎÎ¿Ï Î§ÏÏνοÏ"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "ÎÎο μÎÏÏο"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr ""
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr ""
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
msgstr ""
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr ""
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "ÏÏÏÏθεÏη"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "ÏÏÏÏθεÏη ÏÏίγμαÏÎ¿Ï ÏÏÏνοÏ
"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "ÏÏÏÏθεÏη"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "ÏÏÏÏθεÏη ÏÏίγμαÏÎ¿Ï Î¼ÎÏÏοÏ
"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "Îγινε"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "ανÏικαÏάÏÏαÏη ÏÏίγμαÏÎ¿Ï ÏÏÏνοÏ
"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "αÏαλοιÏή ÏÏίγμαÏÎ¿Ï ÏÏÏνοÏ
"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5688,329 +6385,382 @@ msgstr ""
msgid "stretch/shrink"
msgstr ""
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr ""
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr ""
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr ""
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr ""
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr ""
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr ""
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr ""
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr ""
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr ""
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr ""
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr ""
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr ""
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr ""
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr ""
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr ""
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr ""
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr ""
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr ""
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr ""
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr ""
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr ""
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr ""
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr ""
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr ""
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr ""
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr ""
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
"Latency calibration requires playback and capture"
msgstr ""
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr ""
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr ""
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr ""
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr ""
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr ""
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
msgstr[0] ""
msgstr[1] ""
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr ""
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr ""
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "ÎνεÏγÏ"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
msgstr ""
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr ""
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr ""
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr ""
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
msgstr ""
-#: export_dialog.cc:46
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
+
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr ""
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr ""
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr ""
@@ -6036,45 +6786,57 @@ msgstr ""
msgid "Stop Export"
msgstr "ΠαÏÏη ÎξαγÏγήÏ"
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr ""
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr ""
-#: export_dialog.cc:385
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:387
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr ""
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr ""
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr ""
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr ""
@@ -6082,172 +6844,246 @@ msgstr ""
msgid "Add another format"
msgstr ""
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr ""
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "ΤοÏοθεÏία"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr ""
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr ""
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr ""
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr ""
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
msgstr ""
#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr ""
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "ÎναζήÏηÏη"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr ""
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
msgstr ""
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
+#: export_format_dialog.cc:43
+msgid "Peak"
msgstr ""
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
+#: export_format_dialog.cc:44
+msgid "Loudness"
msgstr ""
#: export_format_dialog.cc:50
-msgid "Trim silence at end"
+msgid "LUFS"
msgstr ""
#: export_format_dialog.cc:51
-msgid "Add silence at end:"
+msgid "dBTP"
msgstr ""
#: export_format_dialog.cc:54
+msgid "Trim silence at start"
+msgstr ""
+
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
+msgstr ""
+
+#: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr ""
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr ""
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr ""
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr ""
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr ""
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr ""
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr ""
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr ""
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr ""
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr ""
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr ""
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr ""
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6255,29 +7091,200 @@ msgstr ""
msgid "Preset"
msgstr ""
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
msgstr ""
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Îεν γινÏÏαν να διαβαÏÏεί Ïο αÏÏείο: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Îεν γινÏÏαν να διαβαÏÏεί Ïο soundfile: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr ""
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr "ÎÏιλογή ÏλÏν"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
msgid "Range"
msgstr ""
@@ -6293,36 +7300,39 @@ msgstr ""
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "ÎειÏοÏ
Ïγία αÏ
ÏομαÏιÏÎ¼Î¿Ï Fader"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "ΤÏÏÎ¿Ï Î±Ï
ÏομαÏιÏÎ¼Î¿Ï Fader"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr ""
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr ""
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr ""
@@ -6330,47 +7340,51 @@ msgstr ""
msgid "<span size=\"large\">Presets</span>"
msgstr ""
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr ""
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr ""
#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Î Î¯Î½Î±ÎºÎ±Ï ÎλÎγÏοÏ
"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"ÎÏεξεÏγαÏÏÎ®Ï Plugin: δεν μÏÏÏεÏα να κÏίÏÏ ÏÏοιÏείο ελÎγÏοÏ
για Ïη θÏÏα %1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr ""
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Î Î¯Î½Î±ÎºÎ±Ï ÎλÎγÏοÏ
"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr ""
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr ""
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr ""
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr ""
@@ -6379,126 +7393,163 @@ msgstr ""
msgid "MIDI Connection Manager"
msgstr ""
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "ÎÏοÏÏνδεÏη"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "θÏÏα"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr ""
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr ""
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr ""
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr ""
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr ""
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr ""
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr ""
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr ""
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr ""
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr ""
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr ""
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr ""
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr ""
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr ""
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr ""
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr ""
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr ""
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr ""
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr ""
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr ""
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr ""
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr ""
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr ""
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr ""
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr ""
@@ -6506,64 +7557,89 @@ msgstr ""
msgid "I/O selector"
msgstr ""
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1 είÏοδοÏ"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1 ÎξοδοÏ"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr ""
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr ""
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:80
+msgid "Search..."
msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:82
+msgid "Print"
msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:228
+msgid "Shortcut"
msgstr ""
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr ""
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
msgstr ""
#: latency_gui.cc:40
@@ -6574,109 +7650,218 @@ msgstr ""
msgid "period"
msgstr ""
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr ""
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr ""
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr ""
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr ""
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr ""
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr ""
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr ""
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr ""
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr ""
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr ""
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr ""
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr ""
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr ""
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr ""
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr ""
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr ""
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr ""
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr ""
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr ""
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr ""
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr ""
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "ÏÏÏÏθεÏη ÏÏίγμαÏÎ¿Ï Î´Î¹Î±ÏÏήμαÏοÏ"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr ""
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr ""
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6685,80 +7870,100 @@ msgid ""
"Click OK to exit %1."
msgstr ""
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr ""
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:344
msgid " (built using "
msgstr ""
-#: main.cc:313
+#: main.cc:347
msgid " and GCC version "
msgstr ""
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr ""
-#: main.cc:324
+#: main.cc:358
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
msgstr ""
-#: main.cc:326
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr ""
-#: main.cc:327
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
-#: main.cc:328
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
"Το ÏαÏÏν είναι ελεÏθεÏο λογιÏμικÏ, είÏÏε ελεÏθεÏοι να Ïο εÏαναδιανείμεÏε "
-#: main.cc:329
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"Ï
ÏÏ Î¿ÏιÏμÎνοÏ
Ï ÏÏοÏ
Ï, αναÏÏÎξÏε ÏÏον κÏδικα για ÏοÏ
Ï ÏÏοÏ
Ï\n"
" ανÏιγÏαÏήÏ."
-#: main.cc:334
+#: main.cc:368
msgid "could not initialize %1."
msgstr ""
-#: main.cc:344
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr ""
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr ""
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr ""
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
msgid "MarkerText"
msgstr "ÎείμενοΣÏίγμαÏοÏ"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "ÎÏ
δÎν"
@@ -6839,11 +8044,11 @@ msgstr ""
msgid "Click to force all MIDI channel messages to channel %1"
msgstr ""
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr ""
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr ""
@@ -6955,192 +8160,188 @@ msgstr ""
msgid "velocity edit"
msgstr ""
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr ""
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr ""
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr ""
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr ""
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr ""
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr ""
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr ""
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr ""
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr ""
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr ""
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr ""
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr ""
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr ""
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr ""
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr ""
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr ""
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "εÏικÏλληÏη"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr ""
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr ""
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr ""
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr ""
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr ""
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr ""
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr ""
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr ""
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr ""
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr ""
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr ""
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr ""
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr ""
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr ""
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr ""
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr ""
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr ""
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr ""
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr ""
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr ""
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr ""
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr ""
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7156,7 +8357,7 @@ msgstr ""
msgid "Decimal"
msgstr ""
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr ""
@@ -7172,35 +8373,36 @@ msgstr ""
msgid "New velocity"
msgstr ""
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr ""
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr ""
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr ""
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr ""
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr ""
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr ""
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7212,7 +8414,7 @@ msgid ""
"\n"
msgstr ""
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr ""
@@ -7220,516 +8422,706 @@ msgstr ""
msgid "Missing Plugins"
msgstr ""
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "ÏÏο"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr ""
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr ""
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
msgstr ""
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr ""
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr ""
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr ""
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr ""
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr ""
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr ""
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr ""
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr ""
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr ""
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr ""
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr ""
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr ""
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr ""
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*ΣÏÏλια*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
msgstr ""
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
+msgid "Cmt"
msgstr ""
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Îλίκ για Î ÏÏÏθεÏη/ÎÏεξεÏγαÏία ΣÏολίÏν"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr ""
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr "~G"
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr ""
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr ""
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr ""
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr ""
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr ""
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "ÎνεÏγÏ"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr ""
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr ""
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
msgstr ""
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr ""
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr ""
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr ""
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "Î Ïο Fader"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "ÎεÏά Fader"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr ""
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr "ÎίÏÏα αναδείξεÏÏ ÎºÎ±Î½Î±Î»Î¹Ïν για μεÏονομαÏμÎνο διάδÏομο δεν εÏ
ÏÎθη!"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-Ïλα-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "ÎιάδÏομοι"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr ""
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr ""
-#: meter_strip.cc:884
+#: meter_strip.cc:895
msgid "Short"
msgstr ""
-#: meter_strip.cc:885
+#: meter_strip.cc:896
msgid "Tall"
msgstr ""
-#: meter_strip.cc:886
+#: meter_strip.cc:897
msgid "Grande"
msgstr ""
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr ""
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr ""
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr ""
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr ""
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr ""
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
msgstr ""
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
msgstr ""
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr ""
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr ""
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr ""
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr ""
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr ""
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
msgstr ""
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
msgstr ""
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
msgstr ""
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
msgstr ""
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
msgstr ""
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
msgstr ""
-#: monitor_section.cc:323
+#: monitor_section.cc:399
msgid "Monitor"
msgstr ""
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr ""
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr ""
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr ""
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr ""
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr ""
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr ""
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr ""
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr ""
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr ""
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr ""
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr ""
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -7784,10 +9176,6 @@ msgid ""
"relies on a stable, sustainable income stream. Thanks for using Ardour!"
msgstr ""
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr ""
@@ -7796,6 +9184,10 @@ msgstr ""
msgid "Name of new preset"
msgstr ""
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr ""
@@ -7804,7 +9196,11 @@ msgstr ""
msgid "Normalize region"
msgstr ""
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr "dbFS"
@@ -7824,103 +9220,106 @@ msgstr "ÎξομάλÏ
νÏη"
msgid "Select Note"
msgstr ""
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "ΧÏήÏη: "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr ""
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr ""
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr ""
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr ""
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr ""
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr ""
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr ""
@@ -7932,6 +9331,22 @@ msgstr "ÎειÏοÏ
Ïγία αÏ
ÏομαÏιÏÎ¼Î¿Ï Pan"
msgid "Pan automation type"
msgstr "ΤÏÏÎ¿Ï Î±Ï
ÏομαÏιÏÎ¼Î¿Ï Pan"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr ""
@@ -7964,143 +9379,297 @@ msgstr ""
msgid "Show phase"
msgstr ""
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr ""
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr ""
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr ""
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr ""
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr ""
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr ""
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr ""
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr ""
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr ""
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr ""
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "ΤÏÏÏÏη"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr ""
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr ""
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr ""
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr ""
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr ""
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr ""
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr ""
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Î ÏÏÏθεÏη plugin ÏÏη λίÏÏα ÏÏν εÏÏÎ"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "ÎÏαλοιÏή plugin αÏÏ Ïη λίÏÏα ÏÏν εÏÏÎ"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "ÎνανÎÏÏη διαθÎÏιμÏν plugins"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr ""
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
"See the Log window for more details (maybe)"
msgstr ""
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr ""
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr ""
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr ""
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr ""
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr ""
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr ""
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8108,146 +9677,167 @@ msgstr ""
msgid "Add"
msgstr "Î ÏÏÏθεÏη"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr ""
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr ""
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr ""
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr ""
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr ""
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr ""
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
msgstr ""
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr ""
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] ""
msgstr[1] ""
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr ""
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr ""
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr ""
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
msgstr ""
#: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
msgstr ""
#: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
msgstr ""
#: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
msgstr ""
#: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
msgid "Other"
msgstr ""
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr ""
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr ""
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr ""
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr ""
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr ""
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr ""
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr ""
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr ""
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr ""
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr ""
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ""
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr ""
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
msgstr ""
#: port_insert_ui.cc:39
@@ -8270,77 +9860,76 @@ msgstr ""
msgid "Port Insert "
msgstr ""
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr ""
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr ""
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr ""
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr ""
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr ""
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr ""
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr ""
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr ""
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr ""
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr ""
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr ""
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr ""
@@ -8352,223 +9941,237 @@ msgstr ""
msgid "There are no %1 ports to connect."
msgstr ""
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr ""
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr ""
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr ""
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "εκÏÏÏ"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
msgstr ""
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr ""
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr ""
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
msgstr ""
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
msgstr ""
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
msgstr ""
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
"outputs will not work correctly."
msgstr ""
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr ""
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr ""
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
"could not match the configuration of this track."
msgstr ""
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Îαι, αÏάλοιÏÎ Ïα Ïλα"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr ""
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr ""
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "ÎÎο Î ÏοÏθήκη"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr ""
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr ""
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr ""
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr ""
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr ""
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "ÎνεÏγοÏοίηÏη ÏλÏν"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr ""
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr ""
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr ""
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr ""
@@ -8596,345 +10199,444 @@ msgstr ""
msgid "main grid"
msgstr ""
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr ""
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr ""
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr ""
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr ""
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr ""
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr ""
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
msgstr ""
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
msgstr ""
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr ""
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "ÎÏιλογή ÎεÏÏονÏμοÏ
"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "ÎÏιλογή ÎμÏαÏÎ·Ï ÎεÏÏονÏμοÏ
"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr ""
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr ""
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr ""
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr ""
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ κοÏ
μÏί"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr ""
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr ""
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
msgstr ""
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
msgstr ""
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
msgstr ""
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
msgstr ""
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
msgstr ""
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
msgstr ""
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
msgstr ""
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
msgstr ""
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
msgstr ""
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
msgstr ""
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "â"
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
msgstr ""
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
msgstr ""
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
msgstr ""
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
msgstr ""
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
msgstr ""
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
msgstr ""
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
msgstr ""
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr ""
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr ""
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr ""
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr ""
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr ""
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
msgstr ""
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
msgstr ""
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr ""
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr ""
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr ""
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr ""
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "ÎÏ
ÏομαÏιÏμÏÏ"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr ""
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr ""
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr ""
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -8943,25 +10645,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr ""
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr ""
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr ""
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -8970,11 +10672,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -8984,39 +10686,83 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr ""
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr ""
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr ""
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9030,27 +10776,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9063,659 +10809,926 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr ""
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr ""
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr ""
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
msgstr ""
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
msgstr ""
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
msgstr ""
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
msgstr ""
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
msgstr ""
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
msgstr ""
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
msgstr ""
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
msgstr ""
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
msgstr ""
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "γÏαμμική"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
msgstr ""
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
msgstr ""
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
msgstr ""
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
msgstr ""
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
msgstr ""
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
msgstr ""
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
msgstr ""
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "γÏαμμική"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr ""
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr ""
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr ""
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr ""
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr ""
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr ""
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr ""
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr ""
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr ""
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr ""
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr ""
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr ""
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr ""
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr ""
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr ""
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr ""
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr ""
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
msgstr ""
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
msgstr ""
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
msgstr ""
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
msgstr ""
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
msgstr ""
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
msgstr ""
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
msgstr ""
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr ""
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr ""
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr ""
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr ""
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr ""
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr ""
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr ""
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr ""
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr ""
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr ""
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr ""
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr ""
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr ""
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr ""
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+" <i>(requires a restart of %1 to take effect)</i>\n"
+" <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
msgstr ""
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
msgstr ""
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
msgstr ""
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
msgstr ""
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
msgstr ""
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
msgstr ""
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
msgstr ""
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
msgstr ""
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
msgstr ""
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
msgstr ""
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
msgstr ""
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
msgstr ""
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
msgstr ""
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3023
msgid ""
-"Use translations of %1 messages\n"
-" <i>(requires a restart of %1 to take effect)</i>\n"
-" <i>(if available for your language preferences)</i>"
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
msgstr ""
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr ""
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr ""
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr ""
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr ""
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr ""
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr ""
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr ""
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "ακÏÏαÏη ÏÎ·Ï ÏεÏιοÏήÏ"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr ""
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr "ΤÎλοÏ:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr ""
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr ""
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr ""
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr ""
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr ""
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr ""
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr ""
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr ""
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr ""
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr ""
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr ""
@@ -9735,33 +11748,33 @@ msgstr ""
msgid "Choose Top Region"
msgstr ""
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr ""
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr ""
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr ""
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] ""
msgstr[1] ""
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr ""
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -9807,55 +11820,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr ""
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr ""
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr ""
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr ""
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr ""
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr ""
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr ""
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr ""
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr ""
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr ""
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr ""
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr ""
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr ""
@@ -9879,19 +11900,15 @@ msgstr ""
msgid "Active state"
msgstr ""
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "ΧÏÏμα"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr ""
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr ""
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
@@ -9911,404 +11928,389 @@ msgstr "Îξοδοι"
msgid "Plugins, Inserts & Sends"
msgstr ""
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "ΠλίÏÏα Î±Î½Î¬Î´ÎµÎ¹Î¾Î·Ï Î´Î¹Î±Î´ÏομÏν για μεÏονομαÏμÎνη διαδÏομή δεν εÏ
ÏÎθη!"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr ""
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "ÎανÎνα κανάλι"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr ""
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr ""
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "ÎγγÏαÏή"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr ""
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr ""
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr ""
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr ""
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr ""
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr ""
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr ""
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr ""
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr ""
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr ""
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr ""
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr ""
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr ""
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr ""
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr ""
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr ""
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr ""
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr ""
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr ""
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr ""
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Playlist"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr ""
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr ""
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr ""
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr ""
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr ""
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr ""
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr ""
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr ""
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "ÎκκαθάÏιÏη ÏÏÎÏονÏοÏ"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr ""
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: "
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr ""
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr ""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr ""
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr ""
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr ""
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr ""
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr ""
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr ""
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr ""
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr ""
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr ""
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr ""
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr ""
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr ""
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr ""
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr ""
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr ""
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr ""
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr ""
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "Control Outs"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "Main Outs"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr ""
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
msgstr ""
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr ""
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr ""
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "ÎεÏονομαÏία ÎαναλιοÏ"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr ""
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": εÏεξεÏγαÏÏÎ®Ï ÏÏολίÏν"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr ""
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr ""
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr ""
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr ""
-#: route_ui.cc:1959
-msgid "Remote Control ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
msgstr ""
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
msgstr ""
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
msgstr ""
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
msgstr ""
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
msgstr ""
#: search_path_option.cc:35
@@ -10323,126 +12325,158 @@ msgstr ""
msgid "the session folder"
msgstr ""
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr ""
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr ""
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr ""
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "ÎÎα ÏÏ
νεδÏία"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Î ÏÏÏÏαÏÎµÏ ÏÏ
νεδÏίεÏ"
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
msgstr ""
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
msgstr ""
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "ÎÎα ÏÏ
νεδÏία"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
msgstr ""
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr ""
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr ""
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr ""
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr ""
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr ""
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr ""
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr ""
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr ""
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "κανάλια"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr ""
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr ""
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr ""
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr ""
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr ""
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr ""
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr ""
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr ""
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr ""
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr ""
@@ -10463,197 +12497,197 @@ msgstr ""
msgid "This will select all elements of this type!"
msgstr ""
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Πεδίο"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr ""
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr ""
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr ""
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr ""
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr ""
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr ""
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr ""
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr ""
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr ""
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr ""
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr ""
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr ""
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr ""
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr ""
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr ""
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr ""
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr ""
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr ""
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr ""
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr ""
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr ""
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr ""
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr ""
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr ""
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr ""
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr ""
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr ""
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr ""
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr ""
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr ""
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr ""
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr ""
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr ""
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr ""
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr ""
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr ""
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr ""
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr ""
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
msgstr ""
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr ""
@@ -10800,209 +12834,230 @@ msgid "Destructive crossfade length"
msgstr ""
#: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
msgstr ""
#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr ""
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr ""
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr ""
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr ""
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr ""
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr ""
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr ""
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr ""
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr ""
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr ""
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr ""
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr ""
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr ""
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr ""
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr ""
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr ""
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr ""
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr ""
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr ""
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr ""
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr ""
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr ""
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr ""
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr ""
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr ""
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr ""
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr ""
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr ""
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr ""
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr ""
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr ""
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr ""
@@ -11038,26 +13093,14 @@ msgstr ""
msgid "Timestamp:"
msgstr ""
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr ""
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Îεν γινÏÏαν να διαβαÏÏεί Ïο αÏÏείο: %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr ""
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Îεν γινÏÏαν να διαβαÏÏεί Ïο soundfile: "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr ""
@@ -11066,284 +13109,280 @@ msgstr ""
msgid "Search"
msgstr ""
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr ""
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr ""
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr ""
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr ""
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr ""
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "ÎονοÏάÏια"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr ""
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr ""
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr ""
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr ""
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr ""
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr ""
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr ""
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr ""
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr ""
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr ""
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr ""
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr ""
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr ""
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr ""
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr ""
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr ""
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr ""
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
msgstr ""
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr ""
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr ""
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr ""
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr ""
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr ""
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr ""
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr ""
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr ""
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr ""
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
msgstr ""
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr ""
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr ""
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr ""
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr ""
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr ""
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr ""
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr ""
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr ""
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr ""
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr ""
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr ""
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "ΤαÏÏÏαÏο"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr ""
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr ""
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr "ÎλαÏμα"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr "ΤÏοÏÏÏ"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "μÎγιÏÏη ÏαÏÏÏηÏα"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr ""
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr ""
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ""
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11368,7 +13407,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr ""
@@ -11384,17 +13423,17 @@ msgstr ""
msgid "Azimuth:"
msgstr ""
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr ""
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11404,15 +13443,15 @@ msgid ""
"program.</span> "
msgstr ""
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr ""
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr ""
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11422,11 +13461,11 @@ msgid ""
"<i>(You can put new sessions anywhere, this is just a default)</i>"
msgstr ""
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr ""
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11440,31 +13479,31 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr ""
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr ""
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
msgstr ""
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr ""
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
msgstr ""
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11472,46 +13511,42 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr ""
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ""
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ""
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ""
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr ""
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr ""
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr ""
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr ""
@@ -11620,11 +13655,11 @@ msgstr ""
msgid "Insert a program change message"
msgstr ""
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr ""
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr ""
@@ -11636,240 +13671,244 @@ msgstr ""
msgid "Octave"
msgstr ""
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr ""
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr ""
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr ""
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr ""
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr ""
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr ""
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr ""
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr ""
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr ""
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr ""
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr ""
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr ""
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr ""
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr ""
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr ""
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr ""
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr ""
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr ""
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr ""
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr ""
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr ""
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr ""
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr ""
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr ""
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr ""
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr ""
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr ""
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr ""
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr ""
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr ""
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr ""
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr ""
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr ""
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr ""
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr ""
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr ""
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr ""
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr ""
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr ""
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr ""
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr ""
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr ""
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr ""
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr ""
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr ""
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr ""
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr ""
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr ""
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr ""
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr ""
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr ""
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr ""
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr ""
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr ""
@@ -11877,176 +13916,189 @@ msgstr ""
msgid "Strip Silence"
msgstr ""
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr ""
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr ""
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr ""
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr ""
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr ""
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr ""
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr ""
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr ""
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr ""
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr ""
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr ""
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr ""
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr ""
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr ""
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr ""
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr ""
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
msgstr ""
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
msgstr ""
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
msgstr ""
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
msgstr ""
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
msgstr ""
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
msgstr ""
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
msgstr ""
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr ""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr ""
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr ""
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12054,92 +14106,95 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] ""
msgstr[1] ""
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "ÎÏήγοÏο αλλά ÎÏÏημο"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "ΠαÏάκαμÏη Anti-aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr ""
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr ""
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr ""
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr ""
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr ""
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr ""
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr ""
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr ""
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr ""
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr ""
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr ""
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr ""
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "ÎναÏξη εγγÏαÏÎ®Ï ÏÏην αÏÏή αÏ
Ïο-εναÏÏθεÏηÏ"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Îήξη εγγÏαÏÎ®Ï ÏÏο ÏÎÎ»Î¿Ï Î±Ï
Ïο-εναÏÏθεÏηÏ"
@@ -12207,94 +14262,130 @@ msgstr ""
msgid "Transpose"
msgstr ""
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr ""
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:177
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr ""
-#: ui_config.cc:222
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr ""
-#: ui_config.cc:227
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr ""
-#: ui_config.cc:317
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr ""
-#: ui_config.cc:320
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:325
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:333
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
-#: ui_config.cc:351
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr ""
-#: ui_config.cc:592
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr ""
-#: ui_config.cc:662
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "εÏÏαλμÎÎ½Î¿Ï XPM header %1"
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr ""
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr ""
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr ""
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr ""
@@ -12339,32 +14430,48 @@ msgstr ""
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12374,25 +14481,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12414,7 +14521,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12423,10 +14530,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12436,9 +14547,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12447,83 +14557,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12543,7 +14653,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12553,239 +14663,230 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr ""
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr ""
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr ""
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr ""
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr ""
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr ""
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr ""
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr ""
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr ""
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr ""
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr ""
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr ""
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr ""
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr ""
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr ""
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr ""
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr ""
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr ""
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr ""
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr ""
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr ""
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr ""
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr ""
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr ""
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr ""
@@ -12803,13 +14904,37 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+#~ msgid "Locations"
+#~ msgstr "ΤοÏοθεÏίεÏ"
+
+#~ msgid "End point trim"
+#~ msgstr "ΤÎÎ»Î¿Ï ÏημείοÏ
ιÏοÏÏαθμίÏεÏÏ"
+
+#~ msgid "duplicate selection"
+#~ msgstr "ανÏιγÏαÏή εÏιλογήÏ"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "*Comments*"
+#~ msgstr "*ΣÏÏλια*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Îλίκ για Î ÏÏÏθεÏη/ÎÏεξεÏγαÏία ΣÏολίÏν"
+
+#~ msgid "Update available plugins"
+#~ msgstr "ÎνανÎÏÏη διαθÎÏιμÏν plugins"
+
#~ msgid "Gain Tool"
#~ msgstr "ÎÏγαλείο Gain"
diff --git a/gtk2_ardour/po/en_GB.mo b/gtk2_ardour/po/en_GB.mo
new file mode 100644
index 0000000..37332da
Binary files /dev/null and b/gtk2_ardour/po/en_GB.mo differ
diff --git a/gtk2_ardour/po/en_GB.po b/gtk2_ardour/po/en_GB.po
index 87b6b8c..5e55265 100644
--- a/gtk2_ardour/po/en_GB.po
+++ b/gtk2_ardour/po/en_GB.po
@@ -5,271 +5,302 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-02 18:25+0100\n"
-"PO-Revision-Date: 2015-03-21 14:07+0100\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-07-24 16:09+0100\n"
"Last-Translator: Colin Fletcher <colin.m.fletcher at googlemail.com>\n"
"Language-Team: UK English <colin.m.fletcher at googlemail.com>\n"
-"Language: English (UK)\n"
+"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-"X-Poedit-Language: English\n"
-"X-Poedit-Country: UNITED KINGDOM\n"
-"X-Poedit-SourceCharset: utf-8\n"
-"X-Poedit-Basepath: ~/src/ardour2/3.0/gtk2_ardour/\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-Basepath: ~/src/ardour2/3.0/gtk2_ardour\n"
+"X-Generator: Poedit 1.8.8\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr ""
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr ""
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr ""
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr ""
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr ""
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr ""
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr ""
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr ""
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr ""
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr ""
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr ""
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr ""
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr ""
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr ""
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr ""
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr ""
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr ""
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr ""
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr ""
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr ""
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr ""
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr ""
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr ""
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr ""
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr ""
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr ""
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr ""
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr ""
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr ""
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr ""
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr ""
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr ""
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr ""
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr ""
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr ""
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr ""
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr ""
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr ""
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr ""
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr ""
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr ""
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr ""
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr ""
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr ""
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr ""
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr ""
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr ""
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr ""
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -278,7 +309,7 @@ msgid ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
msgstr ""
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -290,210 +321,264 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
msgstr ""
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
msgstr ""
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
msgstr ""
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
msgstr ""
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
msgstr ""
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
msgstr ""
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
msgstr ""
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
msgstr ""
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
msgstr ""
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr ""
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr ""
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr ""
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr ""
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr ""
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr ""
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr ""
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr ""
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr ""
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
msgstr ""
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr ""
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr ""
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr ""
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr ""
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr ""
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr ""
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr ""
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr ""
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr ""
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -502,60 +587,61 @@ msgid ""
"track instead."
msgstr ""
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr ""
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr ""
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr ""
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr ""
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr ""
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr ""
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr ""
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr ""
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr ""
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr ""
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr ""
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr ""
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr ""
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr ""
@@ -563,177 +649,215 @@ msgstr ""
msgid "Ambiguous File"
msgstr ""
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
"Please select the path that you want to get the file from."
msgstr ""
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr ""
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr ""
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr ""
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr ""
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
msgstr ""
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:49
+msgid "Fit dB range"
msgstr ""
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
msgstr ""
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalise values"
-
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr ""
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr ""
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr ""
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr ""
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Re-analyse data"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr ""
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr ""
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr ""
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr ""
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr ""
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr ""
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr ""
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
msgstr ""
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr ""
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr ""
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr "Video Export Dialogue"
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr ""
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr ""
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr ""
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr ""
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -741,45 +865,45 @@ msgid ""
"the audio backend and save the session."
msgstr ""
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr ""
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -790,39 +914,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr ""
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr ""
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -831,23 +955,23 @@ msgid ""
"controlled by %2"
msgstr ""
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr ""
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr ""
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr ""
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr ""
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -856,11 +980,11 @@ msgid ""
"\"Just quit\" option."
msgstr ""
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr ""
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -871,7 +995,7 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -882,74 +1006,107 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr ""
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr ""
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr ""
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr ""
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr ""
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr ""
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr ""
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr ""
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr ""
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr ""
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr ""
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr ""
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr ""
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr ""
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -957,215 +1114,263 @@ msgid ""
"\">%<PRIu32>%%</span>"
msgstr ""
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr ""
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr ""
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr ""
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr ""
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr ""
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr ""
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr ""
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr ""
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr ""
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
-msgstr ""
-
-#: ardour_ui.cc:2376
-msgid "Save as..."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
msgstr ""
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
msgstr ""
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
+
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr ""
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
msgstr ""
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr ""
-#: ardour_ui.cc:2470 ardour_ui.cc:2884 ardour_ui.cc:2922
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
msgstr ""
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr ""
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr ""
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr ""
-#: ardour_ui.cc:2641
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
"already exists. Do you want to open it?"
msgstr ""
-#: ardour_ui.cc:2651
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr ""
-#: ardour_ui.cc:2912
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr ""
-#: ardour_ui.cc:3004
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr ""
-#: ardour_ui.cc:3019
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr ""
-#: ardour_ui.cc:3020
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr ""
-#: ardour_ui.cc:3041
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
msgstr ""
-#: ardour_ui.cc:3047
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr ""
-#: ardour_ui.cc:3066
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr ""
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3071
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3137
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr ""
-#: ardour_ui.cc:3286
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr ""
-#: ardour_ui.cc:3290 ardour_ui.cc:3300 ardour_ui.cc:3433 ardour_ui.cc:3440
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr ""
-#: ardour_ui.cc:3291
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1173,19 +1378,19 @@ msgid ""
"require some unused files to continue to exist."
msgstr ""
-#: ardour_ui.cc:3350
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr ""
-#: ardour_ui.cc:3353
+#: ardour_ui.cc:3790
msgid "mega"
msgstr ""
-#: ardour_ui.cc:3356
+#: ardour_ui.cc:3793
msgid "giga"
msgstr ""
-#: ardour_ui.cc:3361
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1195,7 +1400,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3368
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1217,90 +1422,126 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3428
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr ""
-#: ardour_ui.cc:3435
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
"Clean-up will move all unused files to a \"dead\" location."
msgstr ""
-#: ardour_ui.cc:3443
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr ""
-#: ardour_ui.cc:3473
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr ""
-#: ardour_ui.cc:3490
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr ""
-#: ardour_ui.cc:3635
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
-#: ardour_ui.cc:3639
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr ""
-#: ardour_ui.cc:3640
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr ""
-#: ardour_ui.cc:3643
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr ""
-#: ardour_ui.cc:3669
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr ""
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
-#: ardour_ui.cc:3679 ardour_ui.cc:3784
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3709
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3715 ardour_ui.cc:3721
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3755
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr ""
-#: ardour_ui.cc:3765
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr ""
-#: ardour_ui.cc:3810 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr ""
-#: ardour_ui.cc:3814
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr ""
-#: ardour_ui.cc:4012
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr ""
-#: ardour_ui.cc:4041
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1309,23 +1550,23 @@ msgid ""
"quickly enough to keep up with recording.\n"
msgstr ""
-#: ardour_ui.cc:4111
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr ""
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr ""
-#: ardour_ui.cc:4122
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4129
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4172
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1334,11 +1575,11 @@ msgid ""
"quickly enough to keep up with playback.\n"
msgstr ""
-#: ardour_ui.cc:4212
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr ""
-#: ardour_ui.cc:4213
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1349,42 +1590,43 @@ msgid ""
"what you would like to do.\n"
msgstr ""
-#: ardour_ui.cc:4225
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr ""
-#: ardour_ui.cc:4226
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr ""
-#: ardour_ui.cc:4246
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr ""
-#: ardour_ui.cc:4247
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
"audio may be played at the wrong sample rate.\n"
msgstr ""
-#: ardour_ui.cc:4256
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr ""
-#: ardour_ui.cc:4257
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr ""
-#: ardour_ui.cc:4284
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4301 ardour_ui.cc:4304
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
-#: ardour_ui.cc:4588
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1396,88 +1638,113 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr ""
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr ""
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr ""
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr ""
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr ""
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr ""
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr ""
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
msgstr ""
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr ""
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr ""
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr ""
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
msgstr ""
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr ""
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1485,7 +1752,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1493,450 +1760,559 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr ""
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr ""
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr ""
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr ""
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr ""
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr ""
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr ""
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr ""
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr ""
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr ""
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr ""
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr ""
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr ""
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr ""
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr ""
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr ""
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr ""
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr ""
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr ""
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr ""
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr ""
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr ""
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr ""
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr ""
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr ""
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr ""
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr ""
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr ""
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr ""
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr ""
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr ""
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr ""
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr ""
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr ""
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr ""
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr ""
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr ""
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr ""
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr ""
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr ""
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:131
+#: export_video_dialog.cc:80
msgid "Export"
msgstr ""
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr ""
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr ""
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr ""
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr ""
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr ""
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr ""
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
msgstr ""
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
msgstr ""
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
msgstr ""
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr ""
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr ""
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr ""
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr ""
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
msgstr ""
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr ""
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr ""
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr ""
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr ""
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr ""
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr ""
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr ""
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr ""
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr ""
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr ""
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr ""
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr ""
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr ""
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr ""
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr ""
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr ""
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr ""
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr ""
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr ""
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr ""
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr ""
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr ""
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr ""
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr ""
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr ""
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1944,257 +2320,274 @@ msgstr ""
msgid "Timecode"
msgstr ""
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr ""
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr ""
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr ""
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr ""
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:164 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr ""
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr ""
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr ""
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr ""
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr ""
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr ""
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr ""
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr ""
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr ""
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr ""
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr ""
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr ""
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr ""
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr ""
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr ""
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr ""
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr ""
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr ""
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr ""
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr ""
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr ""
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr ""
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr ""
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr ""
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
msgstr ""
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr ""
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr ""
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr ""
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr ""
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr ""
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr ""
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr ""
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr ""
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr ""
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr ""
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr ""
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr ""
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr ""
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr ""
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr ""
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr ""
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr ""
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr ""
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr ""
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr ""
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr ""
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr ""
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr ""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr ""
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2206,63 +2599,59 @@ msgstr ""
msgid "hide track"
msgstr ""
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr ""
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr ""
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr ""
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr ""
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr ""
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr ""
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr ""
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr ""
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr ""
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr ""
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr ""
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr ""
@@ -2278,35 +2667,38 @@ msgstr ""
msgid "Direction:"
msgstr ""
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr ""
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr ""
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr ""
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr ""
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr ""
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr ""
@@ -2322,6 +2714,38 @@ msgstr ""
msgid "Rename Channel"
msgstr ""
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Colour Theme"
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr ""
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "Colour"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr "Colour Palette"
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr ""
@@ -2334,6 +2758,42 @@ msgstr ""
msgid "Value"
msgstr ""
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr ""
@@ -2371,2060 +2831,2155 @@ msgstr ""
msgid "Velocity"
msgstr ""
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr ""
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:375
+#: export_timespan_selector.cc:437 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
msgid "Length"
msgstr ""
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr ""
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr ""
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr ""
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr ""
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr ""
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr ""
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr ""
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr ""
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr ""
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr ""
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr ""
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr ""
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr ""
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr ""
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr ""
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr ""
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr ""
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr ""
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr ""
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr ""
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr ""
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr ""
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr ""
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr ""
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr ""
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr ""
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr ""
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr ""
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr ""
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr ""
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr ""
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr ""
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr ""
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr ""
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr ""
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr ""
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr ""
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr ""
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr ""
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Centre"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr ""
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr ""
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr ""
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr ""
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr ""
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr ""
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr ""
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr ""
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr ""
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr ""
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr ""
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr ""
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr ""
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr ""
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr ""
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr ""
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr ""
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr ""
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr ""
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr ""
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr ""
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr ""
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr ""
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr ""
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr ""
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr ""
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr ""
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr ""
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr ""
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr ""
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr ""
-#: editor.cc:1780
-msgid "Selected Regions"
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
msgstr ""
-#: editor.cc:1816 editor_markers.cc:940
-msgid "Play Range"
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
msgstr ""
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
+msgid "Selected Regions"
+msgstr ""
+
+#: editor.cc:1945 editor_markers.cc:945
+msgid "Play Range"
+msgstr ""
+
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr ""
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr ""
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr ""
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr ""
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr ""
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr ""
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr ""
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr ""
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr ""
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr ""
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr ""
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr ""
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr ""
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr ""
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr ""
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr ""
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr ""
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr ""
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr ""
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr ""
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr ""
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr ""
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr ""
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr ""
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr ""
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr ""
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr ""
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr ""
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr ""
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr ""
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr ""
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr ""
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr ""
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr ""
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr ""
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr ""
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr ""
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr ""
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr ""
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr ""
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr ""
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr ""
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr ""
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr ""
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr ""
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr ""
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr ""
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr ""
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr ""
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
msgstr ""
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr ""
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr ""
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr ""
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr ""
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr ""
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
msgstr ""
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr ""
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr ""
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr ""
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr ""
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr ""
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr ""
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
msgstr ""
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr ""
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr ""
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr ""
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr ""
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr ""
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr ""
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr ""
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr ""
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr ""
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr ""
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr ""
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr ""
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr ""
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr ""
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr ""
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr ""
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr ""
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr ""
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr ""
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr ""
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr ""
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr ""
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr ""
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr ""
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr ""
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr ""
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr ""
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr ""
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
"If it is deleted, audio files used by it alone will be cleaned."
msgstr ""
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr ""
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr ""
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr ""
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr ""
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr ""
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr ""
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr ""
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr ""
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr "Quantise..."
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr ""
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr ""
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr ""
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr ""
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr ""
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr ""
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr ""
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr ""
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr ""
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr ""
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr ""
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr ""
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr ""
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr ""
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr ""
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr ""
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr ""
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr ""
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr ""
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr ""
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr ""
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr ""
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr ""
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr ""
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr ""
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr ""
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr ""
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr ""
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr ""
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr ""
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr ""
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr ""
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr ""
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr ""
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr ""
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr ""
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr ""
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr ""
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr ""
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr ""
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr ""
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr ""
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr ""
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr ""
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr ""
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr ""
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr ""
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr ""
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr ""
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr ""
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr ""
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr ""
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr ""
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr ""
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr ""
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr ""
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr ""
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr ""
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr ""
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr ""
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr ""
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr ""
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr ""
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr ""
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr ""
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr ""
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr ""
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr ""
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr ""
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr ""
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr ""
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr ""
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr ""
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr ""
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr ""
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr ""
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr ""
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr ""
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr ""
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr ""
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr ""
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr ""
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr ""
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr ""
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr ""
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr ""
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr ""
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr ""
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr ""
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr ""
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr ""
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr ""
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr ""
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr ""
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Centre Playhead"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Centre Edit Point"
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr ""
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr ""
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr ""
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr ""
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr ""
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr ""
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr ""
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr ""
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr ""
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr ""
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr ""
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr ""
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr ""
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr ""
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr ""
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr ""
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr ""
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr ""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr ""
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr ""
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr ""
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr ""
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr ""
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr ""
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr ""
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr ""
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr ""
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr ""
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr ""
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr ""
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr ""
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr ""
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr ""
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr ""
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr ""
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr ""
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Zoom Focus Centre"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr ""
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr ""
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr ""
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr ""
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr ""
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr ""
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr ""
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr ""
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr ""
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr ""
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr ""
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr ""
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr ""
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr ""
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr ""
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr ""
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr ""
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr ""
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr ""
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr ""
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr ""
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr ""
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr ""
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr ""
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr ""
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr ""
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr ""
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr ""
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
-msgstr ""
+msgstr "Snap to Hemidemisemiquaver"
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "Snap to demisemiquavers"
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr ""
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr ""
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr ""
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "Snap to semiquavers"
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr ""
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr ""
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr ""
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "Snap to quavers"
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr ""
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr ""
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr ""
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "Snap to crotchets"
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr ""
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "Snap to minims"
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr ""
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr ""
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr ""
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr ""
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr ""
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr ""
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr ""
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr ""
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr ""
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr ""
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr ""
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr ""
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr ""
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr ""
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr ""
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr ""
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr ""
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr ""
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr ""
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr ""
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr ""
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr ""
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr ""
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr ""
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr ""
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr ""
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr ""
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr ""
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr ""
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr ""
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr ""
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr ""
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr ""
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr ""
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr ""
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr "Show Bar Lines"
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr ""
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr ""
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr ""
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr ""
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr ""
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr ""
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr ""
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr ""
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr ""
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normalise..."
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr ""
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr ""
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr ""
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr ""
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr ""
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr ""
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr ""
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr ""
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr ""
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr ""
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr ""
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr ""
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr ""
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr ""
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr ""
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr ""
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr ""
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr ""
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr ""
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr ""
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr ""
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr ""
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr ""
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr ""
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr ""
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr ""
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr ""
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr ""
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr ""
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr ""
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr ""
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr ""
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr ""
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr ""
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr ""
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr ""
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr ""
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr ""
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr ""
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr ""
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr ""
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr ""
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr ""
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr ""
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr ""
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr ""
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr ""
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr ""
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr ""
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr ""
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr ""
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr ""
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr ""
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr ""
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr ""
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr ""
@@ -4448,238 +5003,308 @@ msgid ""
"%2 as a new source, or skip it?"
msgstr ""
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr ""
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr ""
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr ""
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr ""
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr ""
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr ""
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
msgstr ""
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr ""
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr ""
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr ""
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr ""
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr ""
-#: editor_drag.cc:3054
-msgid "move meter mark"
+#: editor_drag.cc:3279
+msgid "inactive"
msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr ""
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr ""
-#: editor_drag.cc:3185
-msgid "move tempo mark"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr ""
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr ""
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr ""
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr ""
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr ""
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr ""
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr ""
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr ""
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr "Group Tab Colour"
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr ""
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
msgstr ""
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr ""
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
msgstr ""
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr ""
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr ""
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr ""
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr ""
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr ""
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr ""
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr ""
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
msgstr ""
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr ""
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr ""
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr ""
#: editor_group_tabs.cc:176
@@ -4694,300 +5319,341 @@ msgstr ""
msgid "end"
msgstr ""
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr ""
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr ""
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr ""
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr ""
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr ""
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr ""
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr ""
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr ""
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr ""
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr ""
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr ""
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr ""
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr ""
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr ""
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr ""
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr ""
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr ""
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr ""
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr ""
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr ""
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr ""
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr ""
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr ""
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1630
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr ""
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr ""
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr ""
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr ""
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
msgstr ""
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr ""
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr ""
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr ""
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr ""
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr ""
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr ""
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr ""
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr ""
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr ""
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr ""
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr ""
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr ""
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr ""
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr ""
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr ""
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr ""
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr ""
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr ""
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr ""
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr ""
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr ""
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr ""
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr ""
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr ""
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1628
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr ""
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr ""
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr ""
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr ""
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr ""
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr ""
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr ""
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr ""
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr ""
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr ""
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr ""
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr ""
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr ""
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr ""
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -4995,11 +5661,11 @@ msgid ""
"input or vice versa."
msgstr ""
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr ""
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5008,23 +5674,23 @@ msgid ""
"Freezing will only process the signal as far as the first send/insert/return."
msgstr ""
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr ""
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr ""
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr ""
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr ""
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5033,182 +5699,202 @@ msgid ""
"You can do this without processing, which is a different operation."
msgstr ""
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr ""
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr ""
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr ""
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr ""
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr ""
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr ""
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr ""
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr ""
-#: editor_ops.cc:4719
-msgid "duplicate selection"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr ""
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
msgstr ""
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1571
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr ""
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr ""
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr ""
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "normalise"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr ""
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr ""
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr ""
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr ""
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr ""
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr ""
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr ""
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr ""
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr ""
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr ""
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr ""
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr ""
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr ""
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr ""
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr ""
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr ""
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr ""
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr ""
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr ""
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr ""
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr ""
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr ""
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr ""
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr ""
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr ""
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5216,11 +5902,11 @@ msgid ""
"This could take a long time."
msgstr ""
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr ""
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5228,52 +5914,52 @@ msgstr ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialogue to tune the analysis"
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr ""
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr ""
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr ""
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr ""
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr ""
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr ""
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr ""
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr ""
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr ""
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr ""
-#: editor_ops.cc:6786 route_ui.cc:1545
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr ""
-#: editor_ops.cc:6791 route_ui.cc:1550
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5283,23 +5969,19 @@ msgid ""
"\"allow-special-bus-removal\" option to be \"yes\""
msgstr ""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1994
+#: editor_ops.cc:7181
msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6817 route_ui.cc:1994
+#: editor_ops.cc:7182
msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5307,7 +5989,7 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5315,358 +5997,371 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
"This action cannot be undone, and the session file will be overwritten"
msgstr ""
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr ""
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1572
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr ""
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr ""
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr ""
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr ""
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr ""
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr ""
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr ""
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr ""
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr ""
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr ""
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr ""
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr ""
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr ""
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr ""
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr ""
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr ""
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr ""
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:363 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr ""
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr ""
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr ""
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr ""
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
msgstr ""
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr ""
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr ""
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr ""
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr ""
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr ""
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr ""
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr ""
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr ""
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr ""
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:375
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr ""
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:383
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr ""
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr ""
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
msgstr ""
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:371
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
msgstr ""
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr ""
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr ""
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr ""
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr ""
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr ""
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr ""
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr ""
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr ""
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr ""
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr ""
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr ""
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr ""
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr ""
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr ""
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr ""
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr ""
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr ""
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr ""
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr ""
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr ""
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr ""
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
msgstr ""
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr ""
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
+#: editor_tempodisplay.cc:318
+msgid "add tempo mark"
msgstr ""
-#: editor_tempodisplay.cc:215
-msgid "add tempo mark"
+#: editor_tempodisplay.cc:343
+msgid "add"
msgstr ""
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr ""
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr ""
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr ""
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr ""
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5675,329 +6370,382 @@ msgstr ""
msgid "stretch/shrink"
msgstr ""
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr ""
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr ""
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr ""
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr ""
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr ""
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr ""
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr ""
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr ""
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr ""
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr ""
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr ""
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr ""
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr ""
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr ""
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr ""
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr ""
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr ""
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr ""
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr ""
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr ""
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr ""
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr ""
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr ""
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr ""
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr ""
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr ""
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
"Latency calibration requires playback and capture"
msgstr ""
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr ""
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr ""
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr ""
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr ""
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr ""
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
msgstr[0] ""
msgstr[1] ""
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr ""
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr ""
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
msgstr ""
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
msgstr ""
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr ""
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr ""
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr ""
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
msgstr ""
-#: export_dialog.cc:46
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr ""
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr ""
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr ""
@@ -6023,45 +6771,57 @@ msgstr "Export initialisation failed: %1"
msgid "Stop Export"
msgstr ""
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr ""
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr "Normalising '%3' (timespan %1 of %2)"
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr ""
-#: export_dialog.cc:385
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:387
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr ""
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr ""
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr ""
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr ""
@@ -6069,172 +6829,249 @@ msgstr ""
msgid "Add another format"
msgstr ""
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr ""
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr ""
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "Analyse Exported Audio"
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr ""
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr ""
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr ""
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr ""
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
msgstr ""
#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr ""
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr ""
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr ""
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalise to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normalise:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr ""
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr ""
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr ""
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr ""
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr ""
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr ""
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr ""
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr ""
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:73
-msgid "Tag file with session's metadata"
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
msgstr ""
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:82
+msgid "Tag file with session's metadata"
+msgstr ""
+
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+"Normalise to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalisation is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr ""
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr ""
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr ""
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr ""
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr ""
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr ""
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr ""
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6242,29 +7079,200 @@ msgstr ""
msgid "Preset"
msgstr ""
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
msgstr ""
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr ""
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr ""
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr ""
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr ""
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
msgid "Range"
msgstr ""
@@ -6280,36 +7288,39 @@ msgstr ""
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr ""
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr ""
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr ""
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:378 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr ""
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr ""
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr ""
@@ -6317,46 +7328,50 @@ msgstr ""
msgid "<span size=\"large\">Presets</span>"
msgstr ""
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr ""
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr ""
#: generic_pluginui.cc:250
-msgid "Switches"
+msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
+#: generic_pluginui.cc:282
+msgid "Plugin Editor: no control for property %1"
msgstr ""
-#: generic_pluginui.cc:293
-msgid "Plugin Editor: could not build control element for port %1"
+#: generic_pluginui.cc:288
+msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:318
-msgid "Plugin Editor: no control for property %1"
+#: generic_pluginui.cc:359
+msgid "Switches"
msgstr ""
-#: generic_pluginui.cc:324
-msgid "Plugin Editor: could not build control element for property %1"
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr ""
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr ""
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr ""
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr ""
@@ -6365,126 +7380,163 @@ msgstr ""
msgid "MIDI Connection Manager"
msgstr ""
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr ""
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr ""
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr ""
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr ""
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr ""
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr ""
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr ""
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr ""
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr ""
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr ""
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr ""
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr ""
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr ""
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr ""
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr ""
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr ""
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr ""
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr ""
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr ""
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr ""
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr ""
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr ""
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr ""
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr ""
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr ""
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr ""
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr ""
@@ -6492,64 +7544,89 @@ msgstr ""
msgid "I/O selector"
msgstr ""
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr ""
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr ""
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr ""
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr ""
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:80
+msgid "Search..."
msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:82
+msgid "Print"
msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:228
+msgid "Shortcut"
msgstr ""
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr ""
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
msgstr ""
#: latency_gui.cc:40
@@ -6560,109 +7637,217 @@ msgstr ""
msgid "period"
msgstr ""
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:421
msgid "Reset"
msgstr ""
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr ""
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr ""
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr ""
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr ""
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr ""
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr ""
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr ""
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr ""
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr ""
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr ""
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr ""
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr ""
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr ""
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr ""
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr ""
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr ""
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr ""
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr ""
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr ""
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr ""
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr ""
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr ""
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr ""
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6671,77 +7856,97 @@ msgid ""
"Click OK to exit %1."
msgstr ""
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr ""
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:344
msgid " (built using "
msgstr ""
-#: main.cc:313
+#: main.cc:347
msgid " and GCC version "
msgstr ""
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr ""
-#: main.cc:324
+#: main.cc:358
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
msgstr ""
-#: main.cc:326
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr ""
-#: main.cc:327
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
-#: main.cc:328
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
-#: main.cc:329
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
-#: main.cc:334
+#: main.cc:368
msgid "could not initialize %1."
msgstr "could not initialise %1."
-#: main.cc:344
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr ""
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr ""
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr ""
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
msgid "MarkerText"
msgstr ""
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr ""
@@ -6822,11 +8027,11 @@ msgstr ""
msgid "Click to force all MIDI channel messages to channel %1"
msgstr ""
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr ""
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr ""
@@ -6938,192 +8143,188 @@ msgstr ""
msgid "velocity edit"
msgstr ""
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr ""
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr ""
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr ""
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr ""
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr ""
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr ""
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr ""
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr ""
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr ""
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr ""
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr ""
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr ""
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr ""
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr ""
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr ""
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr ""
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr ""
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr ""
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr ""
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr ""
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr ""
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr ""
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr ""
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr ""
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Colour Mode"
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr ""
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr ""
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr ""
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr ""
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr ""
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr ""
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr ""
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr ""
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr ""
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr ""
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr ""
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "Meter Colours"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "Channel Colours"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Track Colour"
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7139,7 +8340,7 @@ msgstr ""
msgid "Decimal"
msgstr ""
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr ""
@@ -7155,35 +8356,36 @@ msgstr ""
msgid "New velocity"
msgstr ""
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr ""
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr ""
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr ""
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr ""
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr ""
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr ""
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7195,7 +8397,7 @@ msgid ""
"\n"
msgstr ""
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr ""
@@ -7203,516 +8405,704 @@ msgstr ""
msgid "Missing Plugins"
msgstr ""
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr ""
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:100 mixer_strip.cc:133
+msgid "pre"
msgstr ""
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1540
+#: mixer_strip.cc:1551 rc_option_editor.cc:3140
+msgid "Comments"
msgstr ""
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:160
+msgid "Click to toggle the width of this mixer strip."
msgstr ""
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:162
+msgid ""
+"\n"
+"%1-%2-click to toggle the width of all strips."
msgstr ""
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr ""
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr ""
-
-#: mixer_strip.cc:96 mixer_strip.cc:125
-msgid "pre"
-msgstr ""
-
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
-msgid "Comments"
-msgstr ""
-
-#: mixer_strip.cc:149
-msgid "Click to toggle the width of this mixer strip."
-msgstr ""
-
-#: mixer_strip.cc:151
-msgid ""
-"\n"
-"%1-%2-click to toggle the width of all strips."
-msgstr ""
-
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr ""
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr ""
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr ""
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr ""
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr ""
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr ""
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr ""
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr ""
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr ""
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr ""
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr ""
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr ""
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr ""
-#: mixer_strip.cc:1413
-msgid "*Comments*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
msgstr ""
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
msgid "Cmt"
msgstr ""
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr ""
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr ""
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr ""
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr ""
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Colour..."
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr ""
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr ""
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr ""
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr ""
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr ""
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr ""
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr ""
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
msgstr ""
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:170
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr ""
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr ""
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr ""
-#: mixer_strip.cc:2034 meter_strip.cc:384
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr ""
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr ""
-#: mixer_strip.cc:2286 meter_strip.cc:851
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:853
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:855
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr ""
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr ""
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr ""
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr ""
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr ""
-#: meter_strip.cc:887
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr ""
-#: meter_strip.cc:888
+#: meter_strip.cc:895
msgid "Short"
msgstr ""
-#: meter_strip.cc:889
+#: meter_strip.cc:896
msgid "Tall"
msgstr ""
-#: meter_strip.cc:890
+#: meter_strip.cc:897
msgid "Grande"
msgstr ""
-#: meter_strip.cc:891
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr ""
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr ""
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr ""
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr ""
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr ""
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
msgstr ""
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
msgstr ""
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr ""
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr ""
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr ""
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr ""
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr ""
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
msgstr ""
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
msgstr ""
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
msgstr ""
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
msgstr ""
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
msgstr ""
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
msgstr ""
-#: monitor_section.cc:323
+#: monitor_section.cc:399
msgid "Monitor"
msgstr ""
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr ""
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr ""
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr ""
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr ""
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr ""
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr ""
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr ""
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr ""
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr ""
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr ""
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr ""
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -7767,10 +9157,6 @@ msgid ""
"relies on a stable, sustainable income stream. Thanks for using Ardour!"
msgstr ""
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr ""
@@ -7779,6 +9165,10 @@ msgstr ""
msgid "Name of new preset"
msgstr ""
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "Normalise regions"
@@ -7787,7 +9177,11 @@ msgstr "Normalise regions"
msgid "Normalize region"
msgstr "Normalise region"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalise to:"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr ""
@@ -7807,103 +9201,106 @@ msgstr "Normalise"
msgid "Select Note"
msgstr ""
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr ""
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr ""
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr ""
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr ""
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr ""
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr ""
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr ""
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr ""
@@ -7915,6 +9312,22 @@ msgstr ""
msgid "Pan automation type"
msgstr ""
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr ""
@@ -7947,143 +9360,297 @@ msgstr ""
msgid "Show phase"
msgstr ""
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr ""
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr ""
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr ""
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr ""
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr ""
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "Favourites only"
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr ""
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr ""
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr ""
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr ""
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr ""
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr ""
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr ""
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr ""
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr ""
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr ""
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr ""
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr ""
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr ""
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr ""
-#: plugin_selector.cc:135
-msgid "Update available plugins"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr "Analysers"
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr ""
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
"See the Log window for more details (maybe)"
msgstr ""
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "Favourites"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr ""
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr ""
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr ""
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr ""
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr ""
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8091,146 +9658,167 @@ msgstr ""
msgid "Add"
msgstr ""
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr ""
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr ""
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr ""
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr ""
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr ""
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr ""
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
msgstr ""
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr ""
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] ""
msgstr[1] ""
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr ""
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr ""
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr ""
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
msgstr ""
#: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
msgstr ""
#: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
msgstr ""
#: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
msgstr ""
#: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
msgid "Other"
msgstr ""
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr ""
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr ""
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr ""
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr ""
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr ""
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr ""
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr ""
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr ""
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr ""
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr ""
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ""
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr ""
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
msgstr ""
#: port_insert_ui.cc:39
@@ -8253,77 +9841,76 @@ msgstr ""
msgid "Port Insert "
msgstr ""
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr ""
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr ""
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr ""
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr ""
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr ""
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr ""
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr ""
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr ""
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr ""
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr ""
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr ""
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr ""
@@ -8335,223 +9922,237 @@ msgstr ""
msgid "There are no %1 ports to connect."
msgstr ""
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr ""
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr ""
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr ""
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr ""
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
msgstr ""
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr ""
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr ""
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
msgstr ""
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
msgstr ""
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
msgstr ""
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
"outputs will not work correctly."
msgstr ""
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr ""
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr ""
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
"could not match the configuration of this track."
msgstr ""
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr ""
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr ""
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr ""
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr ""
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr ""
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr ""
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr ""
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr ""
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr ""
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr ""
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr ""
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr ""
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr ""
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr ""
@@ -8579,347 +10180,446 @@ msgstr ""
msgid "main grid"
msgstr ""
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Quantise"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr ""
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr ""
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr ""
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr ""
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr ""
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
msgstr ""
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
msgstr ""
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr ""
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr ""
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr ""
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr ""
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr ""
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr ""
-#: rc_option_editor.cc:325
-msgid "Edit using:"
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
msgstr ""
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
-msgid "+ button"
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
msgstr ""
-#: rc_option_editor.cc:351
-msgid "Delete using:"
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
msgstr ""
-#: rc_option_editor.cc:378
-msgid "Insert note using:"
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
msgstr ""
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:429
+msgid "Edit using:"
msgstr ""
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
+msgid "+ button"
msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:459
+msgid "Delete using:"
msgstr ""
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:489
+msgid "Insert note using:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
msgstr ""
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
msgstr ""
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
msgstr ""
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
-msgstr "Show Video Server Startup Dialogue"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
msgstr ""
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
msgstr ""
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
msgstr ""
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
msgstr ""
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
msgstr ""
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
msgstr ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialogue."
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1032
+msgid "Default"
msgstr ""
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1100
+msgid "â"
msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
msgstr ""
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1109
msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
msgstr ""
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-#: rc_option_editor.cc:1319
-msgid "all available processors"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-#: rc_option_editor.cc:1322
-msgid "%1 processors"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
msgstr ""
-#: rc_option_editor.cc:1325
-msgid "This setting will only take effect when %1 is restarted."
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
msgstr ""
-#: rc_option_editor.cc:1330
-msgid "Options|Undo"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr "Show Video Server Startup Dialogue"
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
msgstr ""
-#: rc_option_editor.cc:1337
-msgid "Verify removal of last capture"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
msgstr ""
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
msgstr ""
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialogue."
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr ""
+
+#: rc_option_editor.cc:1887
+msgid "%1 processors"
+msgstr ""
+
+#: rc_option_editor.cc:1890
+msgid "This setting will only take effect when %1 is restarted."
+msgstr ""
+
+#: rc_option_editor.cc:1895
+msgid "Options|Undo"
+msgstr ""
+
+#: rc_option_editor.cc:1902
+msgid "Verify removal of last capture"
+msgstr ""
+
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr ""
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr ""
+
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr ""
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr ""
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr ""
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr ""
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr ""
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr ""
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr ""
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr ""
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -8928,25 +10628,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr ""
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr ""
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr ""
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -8955,11 +10655,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -8969,39 +10669,83 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr ""
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr ""
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr ""
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9015,27 +10759,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9057,559 +10801,782 @@ msgstr ""
"vendors use that rate - despite it being against the specs - because the "
"variant of using exactly 29.97 fps has zero timecode drift.\n"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr ""
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr ""
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr ""
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
msgstr ""
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
msgstr ""
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
msgstr ""
+"If enabled, pop up a dialogue when a new marker is created to allow its name "
+"to be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
msgstr ""
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
msgstr ""
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
msgstr ""
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
msgstr ""
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
msgstr ""
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
msgstr ""
-#: rc_option_editor.cc:1714
-msgid "linear"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
msgstr ""
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
msgstr ""
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
msgstr ""
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
msgstr ""
-"If enabled, pop up a dialogue when a new marker is created to allow its name "
-"to be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
msgstr ""
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
msgstr ""
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
msgstr ""
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
msgstr ""
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr ""
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr ""
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr ""
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr ""
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr ""
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr ""
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr ""
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr ""
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr ""
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr ""
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr ""
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr ""
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr ""
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr ""
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr ""
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr ""
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr ""
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr ""
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr ""
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
msgstr ""
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
msgstr ""
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
msgstr ""
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
msgstr ""
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
msgstr ""
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
msgstr ""
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
msgstr ""
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr ""
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr ""
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr ""
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr ""
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr ""
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr ""
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr ""
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr ""
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr ""
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr ""
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr ""
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr ""
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr ""
-#: rc_option_editor.cc:2079
-msgid "Link panners of Aux and External Sends with main panner by default"
+#: rc_option_editor.cc:2666
+msgid "Link panners of Aux and External Sends with main panner by default"
+msgstr ""
+
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
+msgid "MIDI read-ahead time (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+" <i>(requires a restart of %1 to take effect)</i>\n"
+" <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
msgstr ""
-#: rc_option_editor.cc:2087
-msgid "MIDI read-ahead time (seconds)"
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
msgstr ""
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
msgstr ""
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
msgstr ""
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
msgstr ""
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
msgstr ""
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
msgstr ""
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
msgstr ""
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
msgstr ""
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
msgstr ""
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
msgstr ""
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
msgstr ""
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
msgstr ""
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
msgstr ""
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
msgstr ""
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3023
msgid ""
-"Use translations of %1 messages\n"
-" <i>(requires a restart of %1 to take effect)</i>\n"
-" <i>(if available for your language preferences)</i>"
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
msgstr ""
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr ""
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr ""
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr ""
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr ""
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr ""
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr ""
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -9617,105 +11584,149 @@ msgstr ""
"Configure meter-marks and colour-knee point for dBFS scale DPM, set "
"reference level for IEC1/Nordic, IEC2 PPM and VU meter."
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr ""
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr "Theme/Colours"
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr ""
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr ""
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr ""
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr ""
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr ""
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr ""
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr ""
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr ""
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr ""
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr ""
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr ""
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr ""
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr ""
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr ""
@@ -9735,33 +11746,33 @@ msgstr ""
msgid "Choose Top Region"
msgstr ""
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr ""
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr ""
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr ""
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] ""
msgstr[1] ""
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr ""
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -9807,55 +11818,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr ""
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr ""
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr ""
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr ""
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr ""
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Analyse"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr ""
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr ""
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr ""
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr ""
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr ""
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr ""
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr ""
@@ -9879,19 +11898,15 @@ msgstr ""
msgid "Active state"
msgstr ""
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Colour"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr ""
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr ""
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
@@ -9911,404 +11926,389 @@ msgstr ""
msgid "Plugins, Inserts & Sends"
msgstr ""
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr ""
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr ""
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr ""
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr ""
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr ""
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr ""
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr ""
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr ""
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr ""
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr ""
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr ""
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr ""
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr ""
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr ""
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr ""
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr ""
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr ""
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr ""
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr ""
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr ""
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr ""
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr ""
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr ""
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr ""
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr ""
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr ""
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr ""
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr ""
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr ""
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr ""
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr ""
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr ""
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr ""
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr ""
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr ""
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr ""
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr ""
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr ""
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr ""
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr ""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr ""
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr ""
-#: route_ui.cc:142
+#: route_ui.cc:165
msgid "Mute this track"
msgstr ""
-#: route_ui.cc:146
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr ""
-#: route_ui.cc:152
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr ""
-#: route_ui.cc:160
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr ""
-#: route_ui.cc:165
+#: route_ui.cc:188
msgid "Monitor input"
msgstr ""
-#: route_ui.cc:171
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr ""
-#: route_ui.cc:678
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:877
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:950
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr ""
-#: route_ui.cc:954
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:958
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr ""
-#: route_ui.cc:962
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:966
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr ""
-#: route_ui.cc:970
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:973
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr ""
-#: route_ui.cc:977
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:980
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr ""
-#: route_ui.cc:981
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr ""
-#: route_ui.cc:982
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr ""
-#: route_ui.cc:1302
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr ""
-#: route_ui.cc:1309
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr ""
-#: route_ui.cc:1331
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1337
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1343
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr ""
-#: route_ui.cc:1349
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr ""
-#: route_ui.cc:1481
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr "Colour Selection"
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1568
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1578
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1606
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
msgstr ""
-#: route_ui.cc:1610
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr ""
-#: route_ui.cc:1611
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr ""
-#: route_ui.cc:1624
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr ""
-#: route_ui.cc:1626
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr ""
-#: route_ui.cc:1694
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ""
-#: route_ui.cc:1860
+#: route_ui.cc:1848
msgid " latency"
msgstr ""
-#: route_ui.cc:1873
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr ""
-#: route_ui.cc:1879
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr ""
-#: route_ui.cc:1880
+#: route_ui.cc:1895
msgid "Template name:"
msgstr ""
-#: route_ui.cc:1961
-msgid "Remote Control ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
msgstr ""
-#: route_ui.cc:1971
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
msgstr ""
-#: route_ui.cc:1985
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-#: route_ui.cc:1989
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
msgstr ""
-#: route_ui.cc:1989
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
msgstr ""
-#: route_ui.cc:1991
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2048
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-#: route_ui.cc:2050
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
msgstr ""
#: search_path_option.cc:35
@@ -10323,126 +12323,158 @@ msgstr ""
msgid "the session folder"
msgstr ""
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr ""
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr ""
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr ""
-#: session_dialog.cc:263
-msgid "New Session"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
msgstr ""
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
msgstr ""
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
msgstr ""
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr ""
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
msgstr ""
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr ""
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr ""
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr ""
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr ""
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr ""
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr ""
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr ""
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr ""
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr ""
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr ""
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr ""
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr ""
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr ""
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr ""
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr ""
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr ""
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr ""
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr ""
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr ""
@@ -10463,197 +12495,197 @@ msgstr ""
msgid "This will select all elements of this type!"
msgstr ""
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr ""
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr ""
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr ""
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr ""
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr ""
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr ""
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr ""
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr ""
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr ""
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr ""
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr ""
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr ""
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr ""
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr ""
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr ""
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr ""
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr ""
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr ""
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr ""
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr ""
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr ""
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr ""
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr ""
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr ""
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr ""
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr ""
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr ""
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr ""
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr ""
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr ""
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr ""
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr ""
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr ""
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr ""
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr ""
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr ""
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr ""
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr ""
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr ""
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
msgstr ""
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr ""
@@ -10800,209 +12832,230 @@ msgid "Destructive crossfade length"
msgstr ""
#: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
msgstr ""
#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr ""
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr ""
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr ""
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr ""
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr ""
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr ""
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr ""
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr ""
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr ""
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr ""
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr ""
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr ""
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr ""
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr ""
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr ""
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr ""
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr ""
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr ""
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr ""
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr ""
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr ""
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr ""
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr ""
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr ""
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr ""
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr ""
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr ""
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr ""
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr ""
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr ""
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr ""
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr ""
@@ -11038,26 +13091,14 @@ msgstr ""
msgid "Timestamp:"
msgstr ""
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr ""
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr ""
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr ""
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr ""
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr "SoundFileBox: Could not tokenise string: "
@@ -11066,284 +13107,280 @@ msgstr "SoundFileBox: Could not tokenise string: "
msgid "Search"
msgstr ""
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr ""
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr ""
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr ""
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr ""
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr ""
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr ""
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr ""
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr ""
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr ""
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr ""
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr ""
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr ""
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr ""
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr ""
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr ""
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr ""
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr ""
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr ""
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr ""
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr ""
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr ""
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr "Licence"
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr ""
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
msgstr ""
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "SoundFileBrowser: Could not tokenise string: "
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr ""
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr ""
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr ""
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr ""
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr ""
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr ""
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr ""
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr ""
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
msgstr ""
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr ""
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr ""
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr ""
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr ""
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr ""
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr ""
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr ""
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr ""
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr ""
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr ""
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr ""
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr ""
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr ""
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr ""
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr ""
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr ""
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr ""
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr ""
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr ""
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ""
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11368,7 +13405,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr ""
@@ -11384,17 +13421,17 @@ msgstr ""
msgid "Azimuth:"
msgstr ""
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr ""
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11404,15 +13441,15 @@ msgid ""
"program.</span> "
msgstr ""
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr ""
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr ""
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11422,11 +13459,11 @@ msgid ""
"<i>(You can put new sessions anywhere, this is just a default)</i>"
msgstr ""
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr ""
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11450,31 +13487,31 @@ msgstr ""
"\n"
"<i>If you do not understand what this is about, just accept the default.</i>"
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr ""
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr ""
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
msgstr ""
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr ""
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
msgstr ""
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11486,46 +13523,42 @@ msgstr ""
"\n"
"<i>If you do not understand what this is about, just accept the default.</i>"
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr ""
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ""
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ""
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ""
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr ""
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr ""
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr ""
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr "Set note length to a semibreve"
@@ -11634,11 +13667,11 @@ msgstr ""
msgid "Insert a program change message"
msgstr ""
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr ""
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr ""
@@ -11650,240 +13683,244 @@ msgstr ""
msgid "Octave"
msgstr ""
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr ""
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr ""
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr ""
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr ""
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr ""
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr ""
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr ""
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr ""
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr ""
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr ""
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr ""
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr ""
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr ""
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr ""
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr ""
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr ""
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr ""
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr ""
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr ""
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr ""
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr ""
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr ""
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr ""
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr ""
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr ""
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr ""
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr ""
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr ""
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr ""
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr ""
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr ""
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr ""
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr ""
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr "Set Note Length to semibreve"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr "Set Note Length to minim"
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr "Set Note Length to minim triplet"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr "Set Note Length to crotchet"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr "Set Note Length to quaver"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr "Set Note Length to semiquaver"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr "Set Note Length to demisemiquaver"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr "Set Note Length to hemidemisemiquaver"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr ""
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr ""
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr ""
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr ""
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr ""
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr ""
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr ""
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr ""
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr ""
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr ""
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr ""
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr ""
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr ""
@@ -11891,176 +13928,189 @@ msgstr ""
msgid "Strip Silence"
msgstr ""
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr ""
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr ""
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr ""
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr ""
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr ""
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "semibreve"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "minim"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "minim triplet"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "crotchet"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "quaver"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "semiquaver"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "demisemiquaver"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "hemidemisemiquaver"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "semihemidemisemiquaver"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr ""
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr ""
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
msgstr ""
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
msgstr ""
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
msgstr ""
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
msgstr ""
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
msgstr ""
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
msgstr ""
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
msgstr ""
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr ""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Colour regions using their track's colour"
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr "Waveforms colour gradient depth"
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr "All floating windows are dialogues"
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr ""
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12072,92 +14122,95 @@ msgstr ""
"This may help with some window managers. This requires a restart of %1 to "
"take effect"
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "Colour Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] ""
msgstr[1] ""
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr ""
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr ""
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr "Minimise time distortion"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr ""
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr ""
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr ""
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr ""
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr ""
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr ""
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr ""
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr ""
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr ""
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr ""
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr ""
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr ""
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr ""
@@ -12225,94 +14278,130 @@ msgstr ""
msgid "Transpose"
msgstr ""
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr ""
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:177
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr "Colour file for %1 not found along %2"
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr "Loading colour file %1"
-#: ui_config.cc:222
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr "cannot read colour file \"%1\""
-#: ui_config.cc:227
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr "colour file \"%1\" not loaded successfully."
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "Colour file %1 not found"
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr "Colour file %1 not saved"
-#: ui_config.cc:317
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr ""
-#: ui_config.cc:320
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:325
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:333
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
-#: ui_config.cc:351
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr ""
-#: ui_config.cc:592
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr "Colour %1 not found"
-#: ui_config.cc:662
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr ""
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr ""
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr ""
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr ""
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr ""
@@ -12357,32 +14446,48 @@ msgstr ""
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12392,25 +14497,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12432,7 +14537,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12441,10 +14546,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12454,9 +14563,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12465,83 +14573,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12561,7 +14669,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr "Don't show this dialogue again. (Reset in Edit->Preferences)."
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12571,197 +14679,188 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr ""
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr ""
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr ""
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr ""
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr "Normalise Audio"
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr ""
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr "Codec Optimisations:"
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr ""
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr ""
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr ""
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr ""
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr ""
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr ""
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr ""
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr ""
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr ""
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:824
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr ""
-#: export_video_dialog.cc:573
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr "Normalising audio"
-#: export_video_dialog.cc:577
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr ""
@@ -12821,12 +14920,29 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+"%1 does not include commercial licences for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
+"Video encoding is a non-trivial task with many details.\n"
+"\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
+"\n"
+"Open Manual in Browser? "
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalise values"
+
+#~ msgid "Color file %1 not found"
+#~ msgstr "Colour file %1 not found"
#~ msgid "Show Measures"
#~ msgstr "Show Bar Lines"
diff --git a/gtk2_ardour/po/es.mo b/gtk2_ardour/po/es.mo
new file mode 100644
index 0000000..535629e
Binary files /dev/null and b/gtk2_ardour/po/es.mo differ
diff --git a/gtk2_ardour/po/es.po b/gtk2_ardour/po/es.po
index d0f6f39..8771dca 100644
--- a/gtk2_ardour/po/es.po
+++ b/gtk2_ardour/po/es.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk2_ardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2015-03-16 19:51+0100\n"
+"POT-Creation-Date: 2016-07-25 23:52+0200\n"
+"PO-Revision-Date: 2016-07-27 21:44+0100\n"
"Last-Translator: Pablo Fernández <pablo.fbus at gmail.com>\n"
"Language-Team: \n"
"Language: es\n"
@@ -14,255 +14,287 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n>1;\n"
"X-Generator: Poedit 1.5.4\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr "Hans Baier"
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr "Sakari Bergen"
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr "Christian Borss"
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr "Chris Cannam"
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr "Jeremy Carter"
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr "André Colomb"
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
-msgstr ""
+msgstr "John Emmas"
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr "Dave Flick"
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr "Robin Gareus"
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr "Nil Geisweiller"
+
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr "Chris Goddard"
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr "J. Abelardo Gutierrez"
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr "David Halter"
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr "Melvin Ray Herr"
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr "Carl Hetherington"
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr "Rob Holland"
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr "Robert Jordens"
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr "Stefan Kersten"
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr "Armand Klenk"
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr "Julien de Kozak"
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr "Matt Krai"
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
-msgstr ""
+msgstr "Georg Krause"
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr "Nick Lanham"
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr "Colin Law"
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr "Joshua Leach"
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr "Ben Loftis"
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr "Nick Mainsbridge"
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr "Tim Mayberry"
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr "Doug Mclain"
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
-msgstr ""
+msgstr "Todd Naugle"
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr "André Nusser"
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr "Bent Bisballe Nyeng"
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr "Jack O'Quin"
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr "Nimal Ratnayake"
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
msgid "David Robillard"
msgstr "David Robillard"
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr "Taybin Rutkin"
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr "Andreas Ruge"
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr "Sampo Savolainen"
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr "Rodrigo Severo"
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr "Per Sigmond"
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr "Lincoln Spiteri"
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr "Mike Start"
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr "Mark Stewart"
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr "Roland Stigge"
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr "Petter Sundlöf"
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr "Mike Täht"
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr "Roy Vegard"
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr "Damien Zammit"
+
+#: about.cc:196
msgid "Grygorii Zharun"
-msgstr ""
+msgstr "Grygorii Zharun"
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -276,7 +308,7 @@ msgstr ""
"\tMartin Blanchard\n"
"\tRomain Arnaud <roming22 at gmail.com>\n"
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -296,7 +328,7 @@ msgstr ""
"\tRichard Oax <richard at pagliacciempire.de>\n"
"\tRobin Gloster <robin at loc-com.de>\n"
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -306,7 +338,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -314,7 +346,7 @@ msgstr ""
"Portugués:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -324,7 +356,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -334,7 +366,7 @@ msgstr ""
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -344,7 +376,7 @@ msgstr ""
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -352,7 +384,7 @@ msgstr ""
"Griego:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -360,7 +392,7 @@ msgstr ""
"Sueco:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -368,7 +400,7 @@ msgstr ""
"Polaco:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -376,7 +408,7 @@ msgstr ""
"Checo:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
@@ -384,7 +416,7 @@ msgstr ""
"Noruego:\n"
"\t Eivind ÃdegÃ¥rd\n"
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -392,143 +424,200 @@ msgstr ""
"Chino:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr "Intel 64-bit"
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr "Intel 32-bit"
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr "PowerPC 64-bit"
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr "PowerPC 32-bit"
+
+#: about.cc:609
+msgid "64-bit"
+msgstr "64-bit"
+
+#: about.cc:611
+msgid "32-bit"
+msgstr "32-bit"
+
+#: about.cc:619
+msgid " - debug"
+msgstr " - debug"
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr "Copyright (C) 1999-2015 Paul Davis\n"
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr "http://ardour.org/"
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
"%1%2\n"
-"(compilado a partir de revisión %3)"
+"(rev %3)\n"
+"%4%5"
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr "Config"
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr "Cargando menús desde %1"
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr "badly formatted menu definition file: %1"
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr "%1 archivo de definición de menú no encontrado"
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr "%1 will not work without a valid menu definition file"
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Añadir pista o bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "Añadir Pista/Bus/VCA"
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "Configuración:"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
-msgstr "Modo de grabación:"
+msgstr "Modo grabación:"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "Instrumento:"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "Pistas de audio"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "Pistas MIDI"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "Pistas de audio+MIDI"
-# es correcto utilizar 'buses' en español? -> al parecer sÃ, desde hace poc. Chequear: http://buscon.rae.es/draeI/SrvltObtenerHtml?IDLEMA=12558&NEDIC=Si
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Buses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "Buses de audio"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "Buses MIDI"
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "Masters VCA"
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
-msgstr ""
+msgstr "Primero"
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
-msgstr ""
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "Antes de selección"
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr ""
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "Después de selección"
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
-msgstr ""
+msgstr "Ãltimo"
+
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "E/S flexible"
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "E/S estricto"
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "Añadir:"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>Opciones</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "Nombre:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "Grupo:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
+msgstr "Insertar:"
+
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Puertos de salida:"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
msgstr ""
+"Si E/S estricto está habilitado, los procesadores de efectos no modificarán "
+"el número de canales de una pista. El número de canales de salida siempre "
+"coincidirá con el número de canales de entrada."
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "Audio"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr "Audio+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "Bus"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -541,60 +630,61 @@ msgstr ""
"\n"
"Si no vas a usar un plugin de este tipo, usa una pista normal audio o MIDI."
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Normal"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "Sin capas"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Cinta"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Mono"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "Estéreo"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 Canales"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 Canales"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "5 Canales"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 Canales"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 Canales"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "12 Canales"
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr "Personalizado"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "Nuevo grupo..."
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr "Sin grupo"
@@ -602,7 +692,7 @@ msgstr "Sin grupo"
msgid "Ambiguous File"
msgstr "Archivo ambiguo"
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
@@ -610,7 +700,7 @@ msgstr ""
"%1 ha encontrado el archivo <i>%2</i> en los siguientes lugares:\n"
"\n"
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
@@ -620,212 +710,260 @@ msgstr ""
"\n"
"Por favor, selecciona la ruta del archivo deseado."
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr "Hecho"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "Origen de señal"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Rangos seleccionados"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Regiones seleccionadas"
-# (de la ventana de FFT)
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Modelo de visualización"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Gráficos compuestos para cada pista"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Gráfico compuesto de todas las pistas"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Mostrar rango de potencia de frecuencias"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizar valores"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr "Ajusta rango dB"
-#: analysis_window.cc:59
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr "Proportional Spectrum, -18dB"
+
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "Ventana de análisis FFT"
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1954
msgid "Spectral Analysis"
msgstr "Análisis espectral"
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Pista"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "Mostrar"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Re-analizar datos"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "el botón no puede observar el estado de un controlable no existente\n"
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
+"%1 %2.x ha descubierto archivos de configuración de %1 %3.x.\n"
+"\n"
+"Quieres que estos archivos se copien y se usen para %1 %2.x?\n"
+"\n"
+"(Es necesario reiniciar %1.)"
# en realidad no existe este término en el español...
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Escucha"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Solo"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "Realimentación"
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Configuración de altavoces"
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Combinaciones de teclas"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Preferencias"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr "Añadir Pistas/Buses"
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "Acerca de"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
msgstr "Posiciones"
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "Pistas y buses"
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
-msgstr "Audio/MIDI Setup"
+msgstr "Configuración Audio/MIDI"
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr "Diálogo de exportación de video"
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "Gestor de scripts"
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "Propiedades"
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "Añadir Video"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "Gestor de conjuntos de conexiones"
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Reloj grande"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
-msgstr ""
+msgstr "Conexiones Audio"
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
+msgstr "Conexiones MIDI"
+
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr "Editor"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Mezclador"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Preferencias"
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
+msgstr "Se copiaron tus archivos de configuración. Ahora puedes reiniciar %1."
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
+"El motor de audio se paró debido a:\n"
+"\n"
+"%1"
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
"was not fast enough. Try to restart\n"
"the audio backend and save the session."
msgstr ""
+"El motor de audio se paró o desconectó a %1\n"
+"porque %1 no fue lo bastante rápido.\n"
+"Prueba a reiniciar el motor de audio y salvar la sesión."
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
-msgstr ""
+msgstr "SuscrÃbete y apoya el desarrollo de %1"
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
-msgstr ""
+msgstr "No vuelvas a hacerme esta advertencia"
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -835,40 +973,47 @@ msgid ""
"\n"
"%4"
msgstr ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
-msgstr ""
+msgstr "Salir ahora"
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
-msgstr ""
+msgstr "Seguir usando %1"
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 está preparado para su uso"
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -881,23 +1026,23 @@ msgstr ""
"\n"
"Puedes comprobar este lÃmite con 'ulimit -l' y normalmente se establece en %2"
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "No volver a mostrar esta ventana"
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "No salir"
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr "Salir sin guardar"
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "Guardar y salir"
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -911,11 +1056,11 @@ msgstr ""
"\n"
"\"Salir sin guardar\"."
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr "Sesión no guardada"
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -933,7 +1078,7 @@ msgstr ""
"\n"
"¿Qué deseas hacer?"
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -951,74 +1096,107 @@ msgstr ""
"\n"
"¿Qué deseas hacer?"
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Prompter"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
-msgstr ""
+msgstr "Audio: <span foreground=\"red\">none</span>"
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "Archivo:"
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr "RF64/WAV"
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr "32-float"
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr "24-int"
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr "16-int"
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr "X: <span foreground=\"%s\">>10K</span>"
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr "X: <span foreground=\"%s\">%u</span>"
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr "X: <span foreground=\"%s\">?</span>"
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr "PkBld: <span foreground=\"%s\">%d</span>"
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1029,83 +1207,84 @@ msgstr ""
"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
"\">%<PRIu32>%%</span>"
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Disco: <span foreground=\"green\">Desconocido</span>"
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Disco: <span foreground=\"green\">24hrs+</span>"
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "Disco: <span foreground=\"green\">>24 hrs</span>"
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Disco: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "TC: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sesiones recientes"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Abrir sesión"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "sesiones %1"
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr "No puedes añadir pistas ni buses sin una sesión cargada."
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "no se pudo crear %1 nueva pista mezclada"
msgstr[1] "no se pudieron crear %1 nuevas pistas mezcladas"
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "no se pudo crear %1 nuevo bus MIDI"
+msgstr[1] "no se pudieron crear %1 nuevos buses MIDI"
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr "No puedes añadir pistas ni buses sin una sesión cargada."
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "no se pudo crear %1 nueva pista de audio"
msgstr[1] "no se pudieron crear %1 nuevas pistas de audio"
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "no se pudo crear %1 nuevo bus de audio"
msgstr[1] "no se pudieron crear %1 nuevos buses de audio"
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1113,23 +1292,20 @@ msgstr ""
"Por favor, añade al menos 1 pista antes de intentar grabar\n"
"Lo puedes hacer con la opción \"Añadir pista o bus\" del menú: Sesión."
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "Guardar como..."
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nuevo nombre de sesión"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Guardar captura de sesión"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Guardar como"
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Nombre de captura de sesión"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr "Guardar como falló: %1"
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1137,23 +1313,35 @@ msgstr ""
"Para asegurar la compatibilidad entre varios sistemas, los\n"
"nombres de captura de sesión no pueden contener el carácter '%1'"
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "Confirmar reescritura de captura de sesión"
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr "Ya existe una captura de sesión con ese nombre. ¿Quieres reescribirla?"
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Reescribir"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "Captura de sesión y cambio"
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nuevo nombre de sesión"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Guardar captura de sesión"
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Nombre de captura de sesión"
+
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "Renombrar sesión"
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1161,14 +1349,14 @@ msgstr ""
"Para asegurar la compatibilidad entre varios sistemas,\n"
"los nombres de sesión no pueden contener el carácter '%1'"
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
"Ese nombre ya está en uso por otro directorio o carpeta. Por favor, "
"inténtalo otra vez."
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1176,20 +1364,28 @@ msgstr ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1871
+msgid "Confirm Template Overwrite"
+msgstr "Confirmar reescritura de plantilla"
+
+#: ardour_ui.cc:2924 route_ui.cc:1872
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr "Ya existe una plantilla con ese nombre. ¿Quieres reescribirla?"
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr "Guardar plantilla"
# se refiere a la sesión, no al Mezclador
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "Nombre de plantilla:"
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-plantilla"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1199,59 +1395,89 @@ msgstr ""
"%1\n"
"ya existe. ¿Quieres abrirla?"
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "Abrir sesión existente"
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "No hay ninguna sesión existente en \"%1\""
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "Por favor, espera a que %1 cargue tu sesión"
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "Error de Registro de Puertos"
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
-msgstr "Pulsa el botón Cerrar para volver a intentarlo"
+msgstr "Pulsa el botón Cerrar para volver a intentarlo."
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "No se pudo cargar la sesión \"%1 (captura %2)\" "
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr "La sesión \"%1 (captura %2)\" no se cargó con éxito: %3"
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "Error al cargar"
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "No se pudo cargar la sesión \"%1 (captura %2)\" "
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr "No se pudo crear la sesión en \"%1\": %2"
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "No se pudo crear la sesión en \"%1\""
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "No habÃa ningún archivo preparado para purgar"
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "Purgar"
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1262,21 +1488,21 @@ msgstr ""
"Ãstas todavÃa pueden incluir regiones que hacen que algunos\n"
"archivos no utilizados continúen existiendo."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "kilo"
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "mega"
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "giga"
# debà adaptar para que al completarse con los parámetros el mensaje tuviera sentido en español
# (quedaba mal por los plurales y la ambigüedad was=fue/estuvo)
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1292,7 +1518,7 @@ msgstr[1] ""
# debà adaptar para que al completarse con los parámetros el mensaje tuviera sentido en español
# (quedaba mal por los plurales y la ambigüedad was=fue/estuvo)
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1330,11 +1556,11 @@ msgstr[1] ""
"\n"
"liberará %3 %4bytes de espacio en disco.\n"
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "¿Estás seguro de que quieres purgar?"
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1344,40 +1570,64 @@ msgstr ""
"TODA la información del historial deshacer/rehacer se perderá.\n"
"Purgar moverá todos los archivos no usados a la carpeta \"dead\"."
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Purgar"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr "Archivos purgados"
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "archivo eliminado"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "No se pudo leer el script de sesión '%1': %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
"%1 no ha lanzado el servidor de video. Se ignora la petición de parada."
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr "Detener el servidor de video"
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr "¿De verdad quieres detener el servidor de video?"
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr "SÃ, páralo."
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr "El servidor de video ya está en marcha"
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
@@ -1385,41 +1635,55 @@ msgstr ""
"Se ha encontrado un servidor de video externo accesible. No se arranca otra "
"instancia."
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
+"No pudo conectar al servidor de video. Arráncalo o configura su URL de "
+"acceso en las Preferencias."
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr "No se ha podido lanzar el servidor de video"
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr "El video server ha iniciado pero no responde a peticiones..."
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "no se pudo abrir %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr "no hay archivo de video seleccionado"
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr "xrun"
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr "Se detuvo la grabación porque el sistema se sobrecargó."
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1433,23 +1697,23 @@ msgstr ""
"En concreto, la velocidad de escritura de datos en el disco\n"
"no fue lo bastante alta como para permitir la grabación.\n"
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
-msgstr ""
+msgstr "Buscando plugins"
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
-msgstr ""
+msgstr "Cancelar búsqueda de plugins"
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1463,11 +1727,11 @@ msgstr ""
"En concreto, la velocidad de lectura de datos desde el disco\n"
"no fue lo bastante alta como para permitir la reproducción.\n"
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "Recuperación del crash"
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1485,45 +1749,51 @@ msgstr ""
"o puede ignorarlo. Por favor, decide qué\n"
"deseas hacer.\n"
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Ignorar información del crash"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Recuperar del crash"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "Discrepancia de frecuencia de muestreo"
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
"audio may be played at the wrong sample rate.\n"
msgstr ""
-"Esta sesión fue creada con una frecuencia de muestreo de %1 Hz\n"
+"Esta sesión fue creada con una tasa de muestreo de %1 Hz\n"
"pero %2 está ejecutándose actualmente a %3 Hz. Si cargas la sesión\n"
-"puede que el audio se reproduzca a una frecuencia de muestreo incorrecta.\n"
+"puede que el audio se reproduzca con una tasa de muestreo incorrecta.\n"
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "No cargar sesión"
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "Cargar sesión de todas formas"
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
+"Esta sesión fue creada con una tasa de muestreo de %1 Hz\n"
+"pero %2 está ejecutándose actualmente a %3 Hz.\n"
+"El audio se capturará y reproducirá con una tasa de muestreo incorrecta.\n"
+"Reconfigura el motor de audio en\n"
+"Menú > Ventana > Configuración Audio/Midi "
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1535,50 +1805,75 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "interfaz de usuario: no se pudo configurar el editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "interfaz de usuario: no se pudo configurar el mezclador"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr "%1 está silenciado"
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr "Permanecer silenciado"
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Reproducir desde cursor"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Detener reproducción"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "Activar/Desactivar grabación"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Reproducir rango/selección"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Ir a inicio de sesión"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Ir a fin de sesión"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Reproducir rango de bucle"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
@@ -1586,23 +1881,23 @@ msgstr ""
"Pánico MIDI\n"
"Enviar nota off y resetear mensajes de control en todos los canales MIDI"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "Al detenerse, volver al último inicio de reproducción"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr "El cursor sigue a las selecciones de rango y edición"
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Monitorización sensible de entradas"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Activar/Desactivar claqueta"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1610,19 +1905,19 @@ msgstr ""
"Si está activado, algo está en solo.\n"
"Pulsa para desactivar todos los solos"
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-"Si está activado, se está produciendo escucha\n"
+"Si está activado, se está produciendo escucha.\n"
"Pulsa para detener la escucha"
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr "Cuando está activo, existe un bucle de realimentación."
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1630,7 +1925,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1638,455 +1933,567 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[ERROR]: "
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[AVISO]: "
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[INFO]: "
# he cambiado desde Auto Volver. Qudaba un poco raro y auto return se entiende mejor
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Auto Return"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "Seguir Edits"
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
-msgid "GUI"
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
msgstr ""
+"Arrastra esta pestaña hacia el escritorio para mostrar el %1 en su propia "
+"ventana\n"
+"\n"
+"Para recolocar la ventana en su sitio, usa Ventana > %1 > Acoplar"
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:638
+msgid "GUI"
+msgstr "GUI"
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "Misc"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Configurar Editor"
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Configurar Mezclador"
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Recargar historial de sesión"
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "interfaz de usuario: no se pudo configurar el editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "interfaz de usuario: no se pudo configurar el mezclador"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Mezclador"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr "No cerrar"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "Cerrar"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "Guardar y cerrar"
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-"Esta pantalla no es lo bastante alta para mostrar la ventana del mezclador"
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Sesión"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Sinc"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Opciones"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Ventana"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "Desacoplar"
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Ayuda"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Atajos varios"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
-msgstr "Formato archivo de audio"
+msgstr "Formato de archivo de audio"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Tipo de archivo"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Formato de muestra"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Superficies de control"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Plugins"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "Medidores"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "Tasa de decaimiento"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Tiempo de persistencia"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "Manejo de denormals"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "Nueva..."
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "Abrir..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Recientes..."
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Cerrar"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "Añadir pista o bus..."
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "Abrir video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "Duplicar Pistas/Buses..."
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr "Cancelar solo"
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "Scripts"
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "Añadir script Lua"
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "Borrar script Lua"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "Abrir video..."
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr "Borrar video"
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "Exportar a archivo de video"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "Exportar a archivo de video..."
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "Captura de sesión (y seguir trabajando en la versión actual) ..."
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Captura de sesión..."
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr "Captura de sesión (y cambiar a nueva versión) ..."
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "Guardar como..."
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr "Renombrar..."
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Guardar plantilla..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "Metadatos"
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "Editar metadatos..."
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "Importar metadatos..."
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
msgstr "Exportar a archivo(s) de audio..."
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "Stem export..."
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "Exportar"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "Purgar archivos no usados..."
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "Vaciar papelera"
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Salir"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Ocultar"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "Acoplar"
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "Cambio"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "Pestaña anterior"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "Siguiente pestaña"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "Conmutar Editor y Mezclador"
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Maximizar Editor"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr "Maximizar Mezclador"
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Mostrar barras de herramientas"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr "Conmutar lista de Mezclador"
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr "Conmutar visibilidad de sección de monitorización"
-#: ardour_ui_ed.cc:198
+#: ardour_ui_ed.cc:305
msgid "Show more UI preferences"
msgstr "Mostrar más preferencias de la IU"
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Mezclador"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "Mostrar Mezclador"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "Scripts"
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
-msgstr ""
+msgstr "Meterbridge"
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "Reintegrar las barras dispersas"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "Rastreador MIDI"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "Chat"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "Manual"
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
msgstr "Referencia"
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr ""
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr "Report a Bug"
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr ""
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr "Desarrollo de Ardour"
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr "Foros de usuarios"
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Guardar"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Transporte"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Stop"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "Roll"
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Comenzar/Detener"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "Comenzar/Continuar/Detener"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "Detener y destruir captura"
# it's not literal, but it's what it does
# translating to "rollo" or "rodar" doesn't make much sense in spanish
# am I missing something?
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
msgstr "Transición hacia delante"
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
msgstr "Transición hacia atrás"
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Reproducir rango de bucle"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr "Reproducir selección"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "Reproducir selección con Preroll"
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Activar grabación"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "Iniciar grabación"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "Rebobinar"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "Rebobinar (Lento)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "Rebobinar (Rápido)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "Adelante"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "Adelante (Lento)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "Adelante (Rápido)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "Ir a cero"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Ir a inicio"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "Ir a fin"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
-msgstr "Ir a hora actual"
+msgstr "Ir a reloj "
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "Enfocar en reloj"
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2094,126 +2501,138 @@ msgstr "Enfocar en reloj"
msgid "Timecode"
msgstr "Timecode"
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Compases y pulsos"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minutos y segundos"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Muestras"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "Pinchar"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "Entrada"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "Despinchar"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "Salida"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "Pinchazo"
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "In/Out"
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Claqueta"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "Auto Entrada"
# Reproducir Auto is too big
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Auto Play"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "Sincronizar inicio a video"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "Maestro"
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr "Usar sincronización de posición externa"
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr "Activar/Desactivar grabación en pista %1"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Porcentaje"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Semitonos"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Enviar MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Enviar MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Usar MMC"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "Enviar MIDI Clock"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr "Enviar MIDI feedback"
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Pánico"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:618
msgid "Wall Clock"
msgstr "Hora actual"
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:620
msgid "Disk Space"
msgstr "Espacio en disco"
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:621
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr "X-run"
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:624
msgid "Buffers"
msgstr "Buffers"
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:626
msgid "Timecode Format"
msgstr "Formato de timecode"
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:627
msgid "File Format"
-msgstr "Formato archivo"
+msgstr "Formato de archivo"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2221,133 +2640,138 @@ msgstr ""
"No es posible usar JACK como fuente de sincronización\n"
"cuando la configuración de pull up/down no es cero."
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "Interno"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "Activar/Desactivar sincronización de posición externa"
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr "No es posible sincronizar a JACK: video pull up/down está establecido"
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "--pendiente--"
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr "SR"
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "Pull"
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Tempo"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Métrica"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "programming error: %1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "programming error: %1: %2"
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
msgid "Bars:Beats"
msgstr "Compases:Pulsos"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
msgid "Minutes:Seconds"
msgstr "Minutos:Segundos"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr "Establecer según cursor"
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr "Posicionar aquÃ"
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr "dB"
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "Ganancia de región:"
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr "dBFS"
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "Amplitud de pico:"
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "Calculando..."
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "añadir punto de control ganancia"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr "Seleccionar nota..."
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] "Ajustar a %1 pulso"
+msgstr[1] "Ajustar a %1 pulsos"
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4387
msgid "automation event move"
msgstr "mover evento de automatización"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "mover rango de automatización"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "eliminar punto de control"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "Ignorando puntos inválidos de AutomationLine \"%1\""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "añadir evento de automatización"
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2359,63 +2783,59 @@ msgstr "estado de automatización"
msgid "hide track"
msgstr "ocultar pista"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr "Manual"
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Reproducir"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Escribir"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Tocar"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "limpiar automatización"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Ocultar"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "Limpiar"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Estado"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr "Discreto"
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Lineal"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Modo"
@@ -2431,35 +2851,38 @@ msgstr "Editar conjunto"
msgid "Direction:"
msgstr "Dirección:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "Entrada"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "Salida"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Editar"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "Eliminar"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Nombre"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Nueva"
@@ -2475,6 +2898,39 @@ msgstr "Añadir canal"
msgid "Rename Channel"
msgstr "Renombrar canal"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Restablecer lo predeterminado"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Tema de color"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "Objeto"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Color"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "Transparencia"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "Paleta de color"
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr "Configuración compilada"
@@ -2487,6 +2943,42 @@ msgstr "Punto de control"
msgid "Value"
msgstr "Valor"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr "Desasignar todos"
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr "Duplicar pistas y buses"
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr "Copiar listas de reproducción"
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr "Nuevas listas de reproducción (vacÃas)"
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr "Compartir listas de reproducción"
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr "Nota"
@@ -2524,596 +3016,603 @@ msgstr "Tono"
msgid "Velocity"
msgstr "Intensidad"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "Tiempo"
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr "Duración"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "editar nota"
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "Cuadros CD"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Segundos"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minutos"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "Pulsos/128"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "Pulsos/64"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Pulsos/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "Pulsos/28"
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "Pulsos/24"
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "Pulsos/20"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Pulsos/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "Pulsos/14"
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "Pulsos/12"
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "Pulsos/10"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Pulsos/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "Pulsos/7"
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "Pulsos/6"
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "Pulsos/5"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Pulsos/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Pulsos/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Pulsos/2"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Pulsos"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Compases"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Marcas"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "Inicios región"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Finales región"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "SincronÃas región"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Bordes región"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "No rejilla"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Rejilla"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Imán"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Cursor"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Marca"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Ratón"
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Deslizar"
# seguro?
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Reunir"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr "Rizado"
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Bloquear"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Izquierda"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Derecha"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Centro"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr "Punto de edición"
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr "Mushy"
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr "Suave"
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "Mezcla multitÃmbrica balanceada"
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "Percusión no tonal con notas estables"
# "brillante" es un término común al menos en mi zona, quizás haya otras sugerencias
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "Instrumental monofónico brillante"
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "Percusión no tonal"
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "Resamplear sin mantener el tono"
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Mins:Segs"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Marcas de posición"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Marcas de rango"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Rangos de bucle/pinchazo"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "Marcas de CD"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "modo"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "Marcas"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Regiones"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "Pistas y buses"
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "Capturas de sesión"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "Grupos de pistas y buses"
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "Rangos y marcas"
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Bucle"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Pinchazo"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1475 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr "Linear (for highly correlated material)"
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1485 rc_option_editor.cc:2300
msgid "Constant power"
-msgstr "Constant power"
+msgstr "Potencia constante"
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1494 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "Symmetric"
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1504 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Lenta"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Rápida"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1535 editor.cc:1560
msgid "Deactivate"
msgstr "Desactivar"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1537 editor.cc:1562
msgid "Activate"
msgstr "Activar"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
msgid "Freeze"
msgstr "Congelar"
-#: editor.cc:1641
+#: editor.cc:1667
msgid "Unfreeze"
msgstr "Descongelar"
-#: editor.cc:1780
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr "Análisis de loudness de región"
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1902
msgid "Selected Regions"
msgstr "Regiones seleccionadas"
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1946 editor_markers.cc:945
msgid "Play Range"
msgstr "Reproducir rango"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1947 editor_markers.cc:948
msgid "Loop Range"
msgstr "Reproducir rango en bucle"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1950 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "Zoom a rango"
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr "Análisis de loudness"
+
+#: editor.cc:1960 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "Mover inicio de rango a borde de región anterior"
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1967 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "Mover inicio de rango a borde de región siguiente"
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1974 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "Mover final de rango a borde de región anterior"
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1981 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "Mover final de rango a borde de región siguiente"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "Separar"
-#: editor.cc:1857
+#: editor.cc:1988
msgid "Convert to Region in Region List"
msgstr "Convertir a región en lista de regiones"
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1991 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Seleccionar todo en rango"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1994 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr "Definir bucle según selección"
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1995 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr "Definir pinchazo según selección"
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1996 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr "Definir Inicio y Fin de sesión según selección"
-#: editor.cc:1868
+#: editor.cc:1999
msgid "Add Range Markers"
msgstr "Insertar marcas de rango"
-#: editor.cc:1871
+#: editor.cc:2002
msgid "Crop Region to Range"
msgstr "Recortar región a rango"
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Rellenar rango con región"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2003 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Duplicar rango"
-#: editor.cc:1876
+#: editor.cc:2006
msgid "Consolidate Range"
msgstr "Consolidar rango"
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2007
+msgid "Consolidate Range with Processing"
msgstr "Consolidar rango con procesado"
-#: editor.cc:1878
+#: editor.cc:2008
msgid "Bounce Range to Region List"
msgstr "Rebotar rango a lista de regiones"
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2009
+msgid "Bounce Range to Region List with Processing"
msgstr "Rebotar rango a lista de regiones con procesado"
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2010 editor_markers.cc:956
msgid "Export Range..."
msgstr "Exportar rango..."
-#: editor.cc:1882
+#: editor.cc:2012
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
+msgid "Play from Edit Point"
msgstr "Reproducir desde punto de edición"
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2029 editor.cc:2111
+msgid "Play from Start"
msgstr "Reproducir desde el principio"
-#: editor.cc:1900
+#: editor.cc:2030
msgid "Play Region"
msgstr "Reproducir región"
-#: editor.cc:1902
+#: editor.cc:2032
msgid "Loop Region"
msgstr "Reproducir región en bucle"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2042 editor.cc:2120
msgid "Select All in Track"
msgstr "Seleccionar todo en la pista"
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
msgid "Select All Objects"
msgstr "Seleccionar todos los objetos"
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2044 editor.cc:2122
msgid "Invert Selection in Track"
msgstr "Invertir selección en la pista"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
msgid "Invert Selection"
msgstr "Invertir selección"
-#: editor.cc:1917
+#: editor.cc:2047 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "Definir rango como bucle"
-#: editor.cc:1918
+#: editor.cc:2048 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "Definir rango como rango de pinchazo"
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2049 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr "Definir rango según selección"
+
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Seleccionar todo desde punto de edición"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Seleccionar todo hasta punto de edición"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2053 editor.cc:2127
msgid "Select All After Playhead"
msgstr "Seleccionar todo desde cursor"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2054 editor.cc:2128
msgid "Select All Before Playhead"
msgstr "Seleccionar todo hasta cursor"
-#: editor.cc:1924
+#: editor.cc:2055
msgid "Select All Between Playhead and Edit Point"
msgstr "Seleccionar todo entre cursor y punto de edición"
# Qué diferencia hay entre :
# - Between playhead and edit point
# - Within playhead and edit point
-#: editor.cc:1925
+#: editor.cc:2056
msgid "Select All Within Playhead and Edit Point"
msgstr "Seleccionar todo dentro de cursor y punto de edición"
-#: editor.cc:1926
+#: editor.cc:2057
msgid "Select Range Between Playhead and Edit Point"
msgstr "Seleccionar rango entre cursor y punto de edición"
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Seleccionar"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
msgid "Cut"
msgstr "Cortar"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
msgid "Copy"
msgstr "Copiar"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
msgid "Paste"
msgstr "Pegar"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2073 editor_actions.cc:94
msgid "Align"
msgstr "Alinear"
-#: editor.cc:1943
+#: editor.cc:2074
msgid "Align Relative"
msgstr "Alinear relativamente"
-#: editor.cc:1950
+#: editor.cc:2081
msgid "Insert Selected Region"
msgstr "Insertar región seleccionada"
-#: editor.cc:1951
+#: editor.cc:2082
msgid "Insert Existing Media"
msgstr "Insertar medios existentes"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Entire Track Later"
msgstr "Atrasar toda la pista"
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Track After Edit Point Later"
msgstr "Atrasar pista desde punto de edición"
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Entire Track Earlier"
msgstr "Adelantar toda la pista"
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2094 editor.cc:2150
msgid "Nudge Track After Edit Point Earlier"
msgstr "Adelantar pista desde punto de edición"
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2096 editor.cc:2152
msgid "Nudge"
msgstr "Empujar"
-#: editor.cc:2235
+#: editor.cc:2354
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
-msgstr "Todas"
+msgstr "Todos"
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3281
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr "Modo smart (añade funciones de rango al modo atrapar)"
-#: editor.cc:3211
+#: editor.cc:3282
msgid "Grab Mode (select/move objects)"
msgstr "Modo atrapar (seleccionar/mover objetos)"
-#: editor.cc:3212
+#: editor.cc:3283
msgid "Cut Mode (split regions)"
-msgstr "Modo cortar (separar regiones)"
+msgstr "Modo recortar (separar regiones)"
-#: editor.cc:3213
+#: editor.cc:3284
msgid "Range Mode (select time ranges)"
msgstr "Modo rango (seleccionar rangos de tiempo)"
-#: editor.cc:3214
+#: editor.cc:3285
msgid "Draw Mode (draw and edit gain/notes/automation)"
-msgstr ""
+msgstr "Modo dibujo (dibujar y editar ganancia/notas/automatización)"
-#: editor.cc:3215
+#: editor.cc:3286
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
+"Modo estirar (cambio de tempo de regiones audio y midi, manteniendo el tono)"
-#: editor.cc:3216
+#: editor.cc:3287
msgid "Audition Mode (listen to regions)"
msgstr "Modo audición (escuchar regiones)"
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr ""
+#: editor.cc:3288
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr "Modo edición interna (editar notas y puntos de automatización)"
-#: editor.cc:3218
+#: editor.cc:3289
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3121,59 +3620,63 @@ msgstr ""
"Grupos: clic para (des)activar\n"
"Contexto-clic para otras operaciones"
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr "Atrasar región o selección"
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr "Adelantar región o selección"
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "Acercar"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Alejar"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Ajustar zoom a sesión"
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
msgstr "Foco del zoom"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr "Expandir pistas"
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr "Encoger pistas"
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr "Número de pistas visibles"
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr "Unidades de ajuste a rejilla"
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "Modo de ajuste a rejilla"
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Punto de edición"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Modo de edición"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3182,124 +3685,124 @@ msgstr ""
"(define el tiempo determinado para adelantar y atrasar regiones y "
"selecciones)"
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr "Deshacer"
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr "Deshacer (%1)"
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Rehacer"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Rehacer (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Duplicar"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr "Cantidad de copias:"
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "Selección"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr "Poner 1 pista"
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr "Poner 2 pistas"
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr "Poner 4 pistas"
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr "Poner 8 pistas"
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr "Poner 16 pistas"
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr "Poner 24 pistas"
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr "Poner 32 pistas"
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr "Poner 48 pistas"
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr "Poner todas las pistas"
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr "Ajustar selección"
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr "Zoom a 10 ms"
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr "Zoom a 100 ms"
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr "Zoom a 1 seg"
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr "Zoom a 10 seg"
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr "Zoom a 1 min"
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr "Zoom a 10 min"
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr "Zoom a 1 hora"
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr "Zoom a 8 horas"
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr "Zoom a 24 horas"
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr "Zoom a selección de rango o región"
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr "*"
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr "Borrado de lista de reproducción"
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3309,1298 +3812,1385 @@ msgstr ""
"Si la conservas, sus archivos de audio no se purgarán.\n"
"Si la eliminas, se purgarán sólo los archivos de audio que use ésta."
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr "Eliminar todo lo no usado"
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr "Eliminar lista de reproducción"
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr "Conservar lista de reproducción"
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
-msgid "Cancel"
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
+msgid "Cancel"
msgstr "Cancelar"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "nuevas listas de reproducción"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "copiar listas de reproducción"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "limpiar listas de reproducción"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr "Por favor, espera a que %1 cargue datos visuales."
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr "Editar..."
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Transponer..."
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr "Legato"
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr "Cuantificar..."
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr "Eiminar solapamiento"
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr "Transformar..."
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Autoconectar"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "Fundidos cruzados"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "Mover marca seleccionada"
# chequear en contexto
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "Seleccionar operaciones de rango"
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "Seleccionar regiones"
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Punto de edición"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Fundido"
# no encuentro de dónde es esta cadena
# Está en la ventana "combinaciones de teclas". pero no sé qué hace
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr "Latch"
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "Región"
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Superposición"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Posición"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Recortar"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "Ganancia"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Rangos"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "Fundidos"
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr "Enlace"
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Foco del zoom"
-
# chequear en contexto
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "Localizar a marcas"
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Tasa de decaimiento"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Retención"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "Opciones MIDI"
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Opciones misceláneas"
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Monitorización"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "Marca activa"
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Reloj primario"
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "Pullup / Pulldown"
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Operaciones de región"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Reglas"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr "Vistas"
# podrÃa ser "desplazar", chequear contexto
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "Desplazamiento"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Reloj secundario"
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "Subcuadros"
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "Timecode fps"
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Altura"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Herramientas"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "Ver"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "Zoom"
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Interrumpir arrastre o deseleccionar todo"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "Acciones con script"
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr "Bloquear"
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Mostrar Mezclador en Editor"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "Mostrar lista de Editor"
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Cursor a borde de región siguiente"
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr "Cursor a borde de región siguiente (sin selección de pista)"
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Cursor a borde de región anterior"
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr "Cursor a borde de región anterior (sin selección de pista)"
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Cursor a inicio de región siguiente"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Cursor a fin de región siguiente"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Cursor a punto de sincronÃa siguiente"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Cursor a inicio de región anterior"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Cursor a fin de región anterior"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Cursor a punto de sincronÃa anterior"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "A borde de región siguiente"
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "A borde de región siguiente (sin selección de pista)"
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "A borde de región anterior"
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "A borde de región anterior (sin selección de pista)"
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "A inicio de región siguiente"
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "A fin de región siguiente"
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "A sincronÃa de región siguiente"
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "A inicio de región anterior"
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "A fin de región anterior"
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "A sincronÃa de región anterior"
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "A inicio de rango"
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "A fin de rango"
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Cursor a inicio de rango"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Cursor a final de rango"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr "Seleccionar todas las pistas"
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "Deseleccionar todo"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "Seleccionar todo lo solapado al rango de edición"
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "Seleccionar todo dentro de rango de edición"
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "Seleccionar rango de edición"
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Seleccionar todo en rango de pinchazo"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Seleccionar todo dentro de rango de bucle"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "Seleccionar pista o bus siguiente"
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "Seleccionar pista o bus anterior"
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "Activar/Desactivar grabación"
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr "Conmutar solo"
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "Conmutar mudo"
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "Conmutar solo aislado"
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "Guardar vista %1"
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "Ir a vista %1"
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "Localizar a marca %1"
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "Saltar a marca siguiente"
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "Saltar a marca anterior"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr "Definir Inicio de sesión según cursor"
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr "Definir Fin de sesión según cursor"
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "Añadir marca en cursor"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr "Borrar marca en cursor"
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr "Atrasar a cercano"
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr "Adelantar a cercano"
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "Empujar cursor adelante"
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "Empujar cursor atrás"
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr "Cursor a rejilla siguiente"
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr "Cursor a rejilla anterior"
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr "Zoom a selección"
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "Cambiar estado de zoom"
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "Aumentar altura de pista"
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "Disminuir altura de pista"
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "Poner 1 pista"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "Poner 2 pistas"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "Poner 4 pistas"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "Poner 8 pistas"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "Poner 16 pistas"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "Poner 32 pistas"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "Poner todas las pistas"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr "Zoom a 5 min"
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "Subir las pistas seleccionadas"
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "Bajar las pistas seleccionadas"
# Esto estaba traducido como "desplazar pistas hacia arriba" pero no estaba bien. La clave del sentido original la da la palabra "scroll". Es un desplazamiento de visualización en el editor para ver las pistas de más arriba o de más abajo. NO estamos desplazando pistas.
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "Desplazarse hacia arriba"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "Desplazarse hacia abajo"
# No lo encuentro en el Editor pero supongo que es lo mismo que Scroll Tracks up/down, sólo que poco a poco, no de forma brusca como hace el scroll. Lo dejo sin traducir, pues sospecho que la traducción era incorrecta y no sé dónde está ni cómo traducirlo
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "Step Tracks Up"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "Step Tracks Down"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "Desplazarse hacia atrás"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "Desplazarse hacia delante"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Centrar cursor"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Centrar punto de edición"
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Cursor hacia delante"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Cursor hacia atrás"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "Cursor a marca activa"
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "Marca activa a cursor"
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "Reproducir regiones seleccionadas"
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "Reproducir desde punto de edición y retornar"
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "Reproducir rango de edición"
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Cursor a ratón"
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Marca activa a ratón"
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr "Deshacer cambio de selección"
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr "Rehacer cambio de selección"
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "Exportar audio"
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Exportar rango"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "Separar usando rango de pinchazo"
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "Separar usando rango de bucle"
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "Recortar"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr "Atenuar selección de rango"
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr "Definir tempo según \"rango de edición = compás\""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr "Log"
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr "Mover a siguiente transitorio"
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr "Mover a transitorio previo"
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "Inicio de rango según cursor"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "Fin de rango según cursor"
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Comenzar rango"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "Terminar rango"
-#: editor_actions.cc:394
+# rango de pinchado? ok?
+# traduzco por pinchazo, no suena muy bien. consultar
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr "Inicio de rango de pinchazo"
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr "Fin de rango de pinchazo"
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr "Inicio de rango de bucle"
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr "Fin de rango de bucle"
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Seguir al cursor"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Borrar última captura"
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "Cursor estático"
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Insertar tiempo"
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr "Borrar tiempo"
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "Activar/Desactivar pista"
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Eliminar"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr "Ajustar selección (vertical)"
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "Máxima"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "Muy grande"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Grande"
# aquà creo que el original deberÃa decir "smallest" por coherencia (son las alturas de pista). me tomo la libertad de corregir
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "MÃnima"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr "Sound Selected MIDI Notes"
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Foco de zoom a la izquierda"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Foco de zoom a la derecha"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Foco de zoom al centro"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Foco de zoom al cursor"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Foco de zoom al ratón"
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Foco de zoom al punto de edición"
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr "Siguiente foco del zoom"
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "Modo de objeto smart"
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr "Smart"
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Herramienta de Objeto"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Herramienta de Rango"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "Herramienta de dibujado de notas"
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "Herramienta de escucha"
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "Herramienta de Efectos de tiempo"
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr "Herramienta de contenidos"
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr "Step Mouse Mode"
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "Cambiar punto de edición"
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "Cambiar punto de edición incluyendo marca"
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr "Bloqueo"
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
-msgstr ""
+msgstr "Modo de edición cÃclica"
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "Ajustar a"
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Modo de ajuste"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "Siguiente modo de ajuste"
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "Siguiente elección de ajuste"
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr "Siguiente selección de ajuste musical"
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr "Elección de ajuste anterior"
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr "Selección de ajuste musical anterior"
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr "Ajustar a cuadros CD"
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr "Ajustar a muestras Timecode"
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr "Ajustar a segundos Timecode"
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr "Ajustar a minutos Timecode"
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "Ajustar a segundos"
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "Ajustar a minutos"
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr "Ajustar a pulsos/128"
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr "Ajustar a pulsos/64"
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "Ajustar a pulsos/32"
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr "Ajustar a pulsos/28"
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr "Ajustar a pulsos/24"
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr "Ajustar a pulsos/20"
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "Ajustar a pulsos/16"
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "Ajustar a pulsos/14"
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr "Ajustar a pulsos/12"
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "Ajustar a pulsos/10"
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "Ajustar a pulsos/8"
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "Ajustar a pulsos/7"
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "Ajustar a pulsos/6"
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "Ajustar a pulsos/5"
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "Ajustar a pulsos/4"
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "Ajustar a pulsos/3"
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "Ajustar a pulsos/2"
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "Ajustar a pulsos"
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "Ajustar a compases"
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "Ajustar a marcas"
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "Ajustar a inicios de región"
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "Ajustar a finales de región"
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr "Ajustar a sincronÃas de región"
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "Ajustar a bordes de región"
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "Mostrar lÃneas de marca"
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "Bucle/Pinchazo"
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Mins:Segs"
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr ""
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr ""
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr ""
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr ""
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Ordenar"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Mostrar todo"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr "Mostrar regiones automáticas"
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Ascendente"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Descendente"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Por nombre de región"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Por duración de región"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Por posición de región"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "Por timestamp de región"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Por inicio de región en archivo"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Por fin de región en archivo"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Por nombre de archivo"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Por duración de archivo"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Por fecha de creación"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Por sistema de archivos"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "Eliminar no usados"
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr "Importar sesión PT"
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importar"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "Importar a lista de regiones..."
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
-msgstr "Exportar desde sesión"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
+msgstr "Importar desde sesión"
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "Mostrar resumen"
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "Mostrar pestañas de grupos"
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr "Mostrar lÃneas de compás"
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Mostrar logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
"Conmutar \"Entrada MIDI activa\" para pistas y buses seleccionadas para "
"edición"
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "Cargando editor de combinaciones de teclas desde %1"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Could not find editor.bindings in search path %1"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr "programming error: %1: %2"
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "Levantar"
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Levantar a capa superior"
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Bajar"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Bajar a capa inferior"
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "Mover a posición original"
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "Adherir a compases y pulsos"
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "Eliminar sincronÃa"
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Mudo"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normalizar..."
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Al revés"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "Crear regiones mono"
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "Amplificar ganancia"
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "Reducir ganancia"
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "Cambiar tono..."
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Transponer..."
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "Opaca"
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Fundido de entrada"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Fundido de salida"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "Duplicado múltiple..."
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Llenar pista"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Crear rango de bucle"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "Establecer pinchazo"
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "Añadir marca de rango simple"
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "Añadir marca de rango por región"
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr "Ajustar posición a rejilla"
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "Cerrar huecos"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "Rhythm Ferret..."
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "Exportar..."
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "Separar debajo"
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "Definir duración de fundido de entrada"
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "Definir duración de fundido de salida"
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "Definir tempo según \"región = compás\""
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "Separar en inicios de percusión"
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "Editor de lista de eventos..."
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "Propiedades..."
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "Rebotar (con procesado)"
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "Rebotar (sin procesado)"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "Combinar"
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "Descombinar"
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Análisis de loudness..."
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "Análisis espectral..."
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Restablecer envolvente"
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "Restablecer ganancia"
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "Envolvente activa"
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "Insertar cambio de patch..."
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr "Desligar de otras copias"
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "Quitar silencio..."
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Establecer selección de rango"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr "Atrasar"
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr "Adelantar"
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr "Atrasar por compensación de captura"
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr "Adelantar por compensación de captura"
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "Recortar a bucle"
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Recortar a pinchazo"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Recortar a anterior"
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Recortar a siguiente"
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
msgstr "Insertar región desde lista de regiones"
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "Establecer posición de sincronÃa"
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "Colocar transitorio"
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr "Separar"
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "Recortar inicio en punto de edición"
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "Recortar final en punto de edición"
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "Alinear inicio"
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "Alinear inicio relativo"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "Alinear final"
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "Alinear final relativo"
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "Alinear sincronÃa"
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "Alinear sincronÃa relativo"
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "Elegir superior..."
@@ -4629,32 +5219,33 @@ msgstr ""
"La sesión ya contiene un archivo llamado %1. ¿Deseas importar %2 como un "
"nuevo archivo u omitirlo?"
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Cancelar Importación"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Editor: no se pudo abrir el archivo \"%1\", (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Cancelar importación completa"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "No embeber"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Embeber todos sin preguntas"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "Frec. de muestreo"
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4662,209 +5253,278 @@ msgstr ""
"%1\n"
"¡La frecuencia de muestreo de este archivo es diferente a la de la sesión!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Embeber de todas formas"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr "No puedes importar una sesión PT hasta tener una sesión cargada."
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr "Importar sesión PT"
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
# No estoy seguro si queda bien, pero tampoco suena tan mal
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr "Arrastre de región en tiempo fijado"
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr "crear región"
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
msgid "resize notes"
msgstr "redimensionar notas"
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
-msgid "copy meter mark"
-msgstr "copiar marca de métrica"
-
-#: editor_drag.cc:3054
+#: editor_drag.cc:3177
msgid "move meter mark"
msgstr "mover marca de métrica"
-#: editor_drag.cc:3177
-msgid "copy tempo mark"
-msgstr "copiar marca de tempo"
+#: editor_drag.cc:3179
+msgid "copy meter mark"
+msgstr "copiar marca de métrica"
+
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr "Inactivo"
-#: editor_drag.cc:3185
+#: editor_drag.cc:3324
msgid "move tempo mark"
msgstr "mover marca de tempo"
-#: editor_drag.cc:3412
+#: editor_drag.cc:3331
+msgid "copy tempo mark"
+msgstr "copiar marca de tempo"
+
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "cambiar duración del fundido de entrada"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "cambiar duración del fundido de salida"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "mover marca"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "mover rango de automatización"
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr "Ocurrió un error al ejecutar la operación de cambio de tempo"
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr "programming_error: %1"
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr "nueva marca de CD"
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "sin nombre"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr "Col"
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr "Color de grupo"
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr "Nombre de grupo"
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
msgstr "V"
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr "¿El grupo es visible?"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr "On"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
-msgstr "Está activado el grupo?"
+msgstr "¿Está activado el grupo?"
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "Grupo|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr "G"
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
-msgstr "Comparte ganancia?"
+msgstr "¿Comparte ganancia?"
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "Relativa|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr "Rel"
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr "¿Cambios de ganancia relativos?"
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "mudo|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
+msgid "Mute|M"
+msgstr "M"
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
-msgstr "Comparte mudo?"
+msgstr "¿Comparte mudo?"
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr "S"
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
-msgstr "Comparte solo?"
+msgstr "¿Comparte solo?"
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Grb"
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
-msgstr "Comparte estado de habilitado para grabación?"
+msgstr "¿Comparte estado de habilitado para grabación?"
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "Monitorización|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr "Mon"
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr "¿Opción de compartir monitorización?"
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "selection/Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr "Sel"
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr "Sharing Selected/Editing Status?"
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "Activa|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr "A"
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr "Comparte estado de activo?"
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr "programming error: marker canvas item has no marker object pointer!"
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "¡El fichero existe!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr "Confirmar reescritura de archivo MIDI"
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Sobreescribir archivo existente"
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr "Ya existe un archivo con el mismo nombre. ¿Quieres sobreescribirlo?"
#: editor_group_tabs.cc:176
msgid "Fit to Window"
@@ -4878,132 +5538,165 @@ msgstr "inicio"
msgid "end"
msgstr "fin"
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "añadir marca"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "crear rango de bucle"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "crear rango de pinchazo"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "rango"
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "nueva marca de rango"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "eliminar marca"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "Posicionar aquÃ"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "Reproducir desde aquÃ"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "Mover marca hasta cursor"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "Crear rango hasta marca siguiente"
# chequear en contexto
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr "Localizar a marca"
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr "Reproducir desde marca"
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr "Fijar marca en cursor"
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr "Definir rango según selección"
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Ocultar rango"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "Renombrar rango..."
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Eliminar rango"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Separar regiones en rango"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Seleccionar rango"
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr "Hacer constante"
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr "Bloquear a música"
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr "Bloquear a audio"
+
# rango de pinchado? ok?
# traduzco por pinchazo, no suena muy bien. consultar
-#: editor_markers.cc:1001
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Crear rango de pinchazo"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr "cambiar estilo de bloqueo de métrica"
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr "cambiar estilo de bloqueo de tempo"
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr "cambiar tipo de tempo"
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Nuevo Nombre:"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "Renombrar marca"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "Renombrar rango"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Renombrar"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "renombrar marca"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
"Esta pantalla no es lo bastante alta para mostrar el mezclador en la ventana "
"del Editor"
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
"programming error: tempo marker canvas item has no marker object pointer!"
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr "programming error: marker for tempo is not a tempo marker!"
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr "programming error: marker for meter is not a meter marker!"
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
@@ -5011,175 +5704,183 @@ msgstr ""
"programming error: control point canvas item has no control point object "
"pointer!"
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "editar nota(s)"
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr "recortar inicio"
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "recortar final"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Nombre de región:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "separar"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "modificar selección"
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "empujar regiones adelante"
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "empujar posición adelante"
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "empujar regiones atrás"
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "empujar adelante"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr "empujar atrás"
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "build_region_boundary_cache called with snap_type = %1"
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "Nueva marca de posición"
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr "Establecer inicio de sesión"
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "añadir marcas"
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "borrar marcas"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "borrar rangos"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "borrar posiciones"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "insertar región"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "levantar regiones"
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "levantar región"
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "levantar regiones a capa superior"
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "levantar región a capa superior"
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "bajar regiones"
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "bajar región"
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "bajar regiones a capa inferior"
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "Renombrar región"
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr "Nuevo nombre: "
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "separar"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "separar regiones bajo"
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "recortar según selección"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "definir punto de sincronÃa"
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "eliminar sincronÃa de región"
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "mover regiones a posición original"
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "mover región a posición original"
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "alinear selección"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "alinear selección (relativo)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "alinear región"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "recortar inicio"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "recortar final"
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "recortar a bucle"
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "recortar a pinchazo"
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "recortar a región"
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5191,11 +5892,11 @@ msgstr ""
"TÃpicamente, esto es causado por plugins que generan salida estéreo desde "
"entrada mono o viceversa."
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "No se puede congelar"
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5210,23 +5911,23 @@ msgstr ""
"\n"
"Congelarla sólo procesará la señal hasta el primer envÃo/inserción/retorno."
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "Congelar de todas formas"
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr "No congelar"
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "LÃmites de congelado"
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Cancelar congelado"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5240,50 +5941,50 @@ msgstr ""
"\n"
"Puedes hacer esto sin procesado, lo cual es una operación diferente."
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr "No se puede rebotar"
# ¿cómo traducir 'bounce'?
# lo he visto en otros softwares como 'rebotar' pero ¿realmente se utiliza ese término en el español?
# Creo que es mejor rebotar, aunque suene un poco raro, que dejarlo en bounce.
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "rebotar rango"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr "eliminar"
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "cortar"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "copiar"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "limpiar"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr ""
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "eliminar región"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplicar selección"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr "duplicar selección de rango"
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "empujar pista"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5291,136 +5992,156 @@ msgstr ""
"¿De verdad quieres borrar la última captura?\n"
"(Es una acción destructiva que no podrás deshacer)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "No, no hagas nada"
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "SÃ, eliminar"
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "Destruir última captura"
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "normalizar"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "al revés"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "quitar silencio"
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "Ramificar región(es)"
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "restablecer ganancia de región"
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr "envolvente de ganancia de región activa"
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "conmutar bloqueo de región"
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr "Bloqueo de video"
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "estilo de bloqueo de región"
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "cambiar opacidad de región"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr "rango de atenuación"
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "definir duración del fundido de entrada"
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "definir duración del fundido de salida"
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "ajustar curva de fundido de entrada"
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "ajustar curva de fundido de salida"
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "activar fundido de entrada"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "activar fundido de salida"
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr "conmutar fundido activo"
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "crear rango de bucle desde selección"
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "crear rango de bucle desde región"
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "crear rango de pinchazo desde selección"
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
-msgstr ""
+msgstr "Definir Inicio y Fin de sesión según selección"
+
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr "Definir inicio de pinchazo desde EP"
-#: editor_ops.cc:6066
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr "Definir fin de pinchazo desde EP"
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr "Definir inicio de bucle desde EP"
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr "Definir fin de bucle desde EP"
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "crear rango de pinchazo desde región"
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "Añadir marca nueva"
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "Definir tempo global"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "Definir un compás"
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr "¿Quieres definir el tempo global o añadir una nueva marca de tempo?"
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "definir tempo a partir de región"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "separar regiones"
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5433,11 +6154,11 @@ msgstr ""
"Esto puede llevar un buen rato."
# ok?
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr "¡Llamada al Ferret!"
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5445,52 +6166,52 @@ msgstr ""
"Pulsa OK para continuar con esta operación de separación\n"
"o ajusta el análisis en la ventana de Rhythm Ferret"
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr "Pulsa OK para continuar con esta operación de separación"
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "¿Excesivas divisiones?"
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr "place transient"
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "ajustar regiones a rejilla"
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr "Cerrar huecos de regiones"
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "Duración de fundido cruzado"
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr "ms"
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr "Duración de pull-back"
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr "Ok"
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr "cerrar huecos de regiones"
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "That would be bad news ...."
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5506,24 +6227,19 @@ msgstr ""
"edita tu archivo ardour.rc para establecer la\n"
"opción \"allow-special-bus-removal\" a \"yes\""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "pistas"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
msgid "track"
-msgstr "pista"
+msgid_plural "tracks"
+msgstr[0] "pista"
+msgstr[1] "pistas"
-# es correcto utilizar 'buses' en español? -> al parecer sÃ, desde hace poc. Chequear: http://buscon.rae.es/draeI/SrvltObtenerHtml?IDLEMA=12558&NEDIC=Si
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "buses"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
msgid "bus"
-msgstr "bus"
+msgid_plural "busses"
+msgstr[0] "bus"
+msgstr[1] "buses"
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5532,11 +6248,11 @@ msgid ""
msgstr ""
"¿De verdad deseas eliminar %1 %2 y %3 %4?\n"
"(Puedes perder también las listas de reproducción\n"
-"asociadas con %2)\n"
+"asociadas con la %2)\n"
"\n"
"¡Esta acción no se puede deshacer y sobrescribirá el archivo de sesión!"
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5545,11 +6261,11 @@ msgid ""
msgstr ""
"¿De verdad deseas eliminar %1 %2?\n"
"(Puedes perder también las listas de reproducción\n"
-"asociadas con %2)\n"
+"asociadas con la %2)\n"
"\n"
"¡Esta acción no se puede deshacer y sobrescribirá el archivo de sesión!"
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5559,139 +6275,140 @@ msgstr ""
"\n"
"Esta acción no se puede deshacer y sobrescribirá el archivo de sesión"
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "SÃ, elimÃnalas."
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "SÃ, elimÃnala"
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "Eliminar %1"
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "insertar tiempo"
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr "eliminar tiempo"
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr "Hay demasiadas pistas para encajar en la ventana actual"
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr "Vista %u guardada"
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "enmudecer regiones"
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "enmudecer región"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "combinar regiones"
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr "Descombinar regiones"
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
-msgstr ""
+msgstr "%1: Bloqueado"
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
-msgstr ""
+msgstr "Pulsa para desbloquear"
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
-msgstr "Region name, with number of channels in []'s"
+msgstr "Nombre de región, con número de canales en []"
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "Posición de inicio de región"
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "Fin"
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "Posición de fin de región"
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "Duración de la región"
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr "Position of region sync point, relative to start of the region"
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr "Length of region fade-in (units: secondary clock), () if disabled"
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr "B"
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "¿Posición de región bloqueada?"
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr "G"
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
-msgstr "Region position glued to Bars|Beats time?"
-
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
+msgstr ""
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "¿Región silenciada?"
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
msgstr "O"
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr "Región opaca (provoca que las regiones inferiores no se escuchen)"
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Oculto"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr "(AUSENTE) "
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -5699,179 +6416,187 @@ msgstr ""
"¿De verdad quieres borrar las regiones no usadas?\n"
"(Es una acción destructiva que no podrás deshacer)"
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "SÃ, eliminar."
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "Eliminar regiones no usadas"
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "Mult."
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "Inicio"
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "Múltiple"
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "AUSENTE "
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr "RS"
+
+#: editor_routes.cc:208
msgid "SS"
msgstr "SS"
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "Nombre de Pista/Bus"
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "¿Pista/Bus visible?"
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "¿Pista/Bus activa/o?"
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
msgstr "I"
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "Entrada MIDI habilitada"
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
msgstr "R"
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "Grabación habilitada"
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr "RS"
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "En mudo"
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "En solo"
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
msgstr "SI"
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "Solo aislado"
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr "SS"
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "Solo seguro (bloqueado)"
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Ocultar todo"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Mostrar todas las pistas de audio"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Ocultar todas las pistas de audio"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Mostrar todos los buses de audio"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Ocultar todos los buses de audio"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "Mostrar todas las pistas MIDI"
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "Ocultar todas las pistas MIDI"
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Mostrar pistas con regiones bajo cursor"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr "Mostrar sólo las pistas con regiones bajo el cursor"
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Nueva marca de posición"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "Limpiar todas las posiciones"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr "Mostrar posiciones"
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr "Nuevo rango"
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "Limpiar todos los rangos"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr "Mostrar rangos"
#: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "Crear rango de bucle"
+msgid "New Loop range"
+msgstr "Nuevo rango de bucle"
#: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "Crear rango de pinchazo"
+msgid "New Punch range"
+msgstr "Nuevo rango de pinchazo"
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr "Nueva marca de pista de CD"
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Nuevo tempo"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Nueva métrica"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr "Renombrar captura de sesión"
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr "Nuevo nombre de captura"
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
@@ -5879,35 +6604,39 @@ msgstr ""
"¿De verdad deseas eliminar la captura \"%1\" ?\n"
"(no podrás deshacer esta acción)"
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr "Eliminar captura de sesión"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "añadir"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "añadir marca de tempo"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "añadir"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "añadir marca de métrica"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "listo"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "reemplazar marca de métrica"
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "reemplazar marca de tempo"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "eliminar marca de tempo"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5917,54 +6646,62 @@ msgstr ""
msgid "stretch/shrink"
msgstr "estirar/contraer"
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr "cambiar tono"
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr "timefx cannot be started - thread creation error"
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr ""
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr "Configurar dispositivo MIDI"
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr "Medir"
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr "Usar resultados"
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr "Volver a configuración (ignorar resultados)"
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr "Calibrar audio"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr "Volver a configuración"
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr "Herramienta de medición de latencia"
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
@@ -5972,89 +6709,98 @@ msgstr ""
"<span weight=\"bold\">Disminuye el volumen de tu equipo de audio hasta un "
"nivel muy bajo.</span>"
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr "Selecciona dos canales y conéctalos por medio de un cable"
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr "Canal de salida"
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr "Canal de entrada"
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "Cuando hayas conectado los canales, pulsa el botón \"Medir\"."
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
"Si estás conforme con los resultados, pulsa el botón \"Usar resultados\"."
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr "Aún no hay resultados de la medición"
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Latencia"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr "Sistema de audio:"
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "Driver:"
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "Dispositivo de Entrada:"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "Dispositivo de salida:"
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr "Dispositivo:"
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "Frec. de muestreo:"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "Tamaño del buffer:"
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "Periodos:"
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr "Canales de entrada:"
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr "Canales de salida:"
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "Latencia de entrada del hardware:"
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "muestras"
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "Latencia de salida del hardware:"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
-msgstr ""
+msgstr "Sistema MIDI:"
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-"El backend de audio de %1 se ha configurado y arrancado externamente.\n"
-"Esto limita el control que tienes sobre éste."
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
@@ -6064,7 +6810,7 @@ msgstr ""
"\n"
"La calibración de latencia requiere una interfaz de audio operativa."
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6074,193 +6820,226 @@ msgstr ""
"\n"
"La calibración de latencia requiere ambas reproducción y captura"
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr "Dispositivos MIDI"
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr "Dispositivo"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr "Latencias de hardware"
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr "Calibrar"
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr "Todos los canales disponibles"
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "muestra"
-msgstr[1] "muestra"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 muestra"
+msgstr[1] "%1 muestras"
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr "No se pudo establecer el nombre de dispositivo de entrada a %1"
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr "No se pudo establecer el nombre de dispositivo de salida a %1"
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr "No se pudieron establecer los periodos a %1"
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "Desconectado del motor de audio"
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "Detectando..."
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Activo"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr "Conectado"
+
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "Inactivo"
+#: engine_dialog.cc:3103 shuttle_control.cc:663
+msgid "Stopped"
+msgstr "Parado"
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Canales:"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "Dividir a archivos mono"
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr "Bus o pista"
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "Contenidos de región sin fundidos ni ganancia de región (canales: %1)"
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "Contenidos de región con fundidos y ganancia de región (canales: %1)"
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr "Salida de pista (canales: %1)"
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr ""
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr "Seleccionar todas las pistas"
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr "Seleccionar todos los buses"
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr "Deseleccionar todo"
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr "Nombre de pista"
-#: export_dialog.cc:46
+#: export_dialog.cc:49
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
"<span color=\"#ffa755\">Algunos archivos existentes se sobrescribirán</span>"
-#: export_dialog.cc:47
+#: export_dialog.cc:50
msgid "List files"
msgstr "Listar archivos"
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
msgid "File format"
msgstr "Formato de archivo"
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
msgid "Time Span"
msgstr "Intervalos"
-#: export_dialog.cc:160
+#: export_dialog.cc:165
msgid "Channels"
msgstr "Canales"
-#: export_dialog.cc:182
+#: export_dialog.cc:187
msgid ""
"Export has been aborted due to an error!\n"
"See the Log for details."
@@ -6268,39 +7047,55 @@ msgstr ""
"¡La exportación se ha estropeado debido a un error!\n"
"Para más información ver el log."
-#: export_dialog.cc:251
+#: export_dialog.cc:298
msgid "Files that will be overwritten"
msgstr "Archivos que se sobrescribirán"
-#: export_dialog.cc:296
+#: export_dialog.cc:343
msgid "Export initialization failed: %1"
msgstr ""
-#: export_dialog.cc:306
+#: export_dialog.cc:353
msgid "Stop Export"
msgstr "Cancelar Exportación"
-#: export_dialog.cc:327
+#: export_dialog.cc:383
msgid "export"
msgstr "exportar"
-#: export_dialog.cc:346
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Exportando '%3' (timespan %1 de %2)"
+
+#: export_dialog.cc:407
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr "Normalizando '%3' (timespan %1 de %2)"
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Exportando '%3' (timespan %1 de %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr "Codificando '%3' (timespan %1 de %2)"
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "Etiquetando '%3' (timespan %1 de %2)"
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "Subiendo '%3' (timespan %1 de %2)"
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:453 export_dialog.cc:455
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">Error: "
-#: export_dialog.cc:385
+#: export_dialog.cc:465
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">Aviso: "
-#: export_dialog.cc:387
+#: export_dialog.cc:467
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6308,19 +7103,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">Aviso "
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr "Exportar selección"
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr "Exportar región"
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr "Origen"
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr "Exportar tipo stem"
@@ -6328,174 +7123,248 @@ msgstr "Exportar tipo stem"
msgid "Add another format"
msgstr "Añadir otro formato"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Formato"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Posición"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "Analizar audio exportado"
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "¡Sin formato!"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "Formato %1: %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "Etiqueta:"
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "Nombre de sesión"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "Nombre de timespan"
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "Revisión:"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Carpeta:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Explorar"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Nombrar los archivos según:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "Abrir carpeta"
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "Construir el nombre de archivo según estos componentes:"
+
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
"<small><i>En este momento no se puede mostrar un ejemplo de nombre de "
"archivo</i></small>"
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Nombre de archivo resultante: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>Nombre de archivo actual (aproximado)</i>: \"%1\""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "Elije carpeta para exportaciones"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "Nuevo perfil de formato de exportación"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "Editar perfil de formato de exportación"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "Etiqueta: "
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalizar a:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normalizar:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "Recortar silencio en inicio"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "Añadir silencio en inicio:"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "Recortar silencio en final"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "Añadir silencio al final:"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "Compatibilidad"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "Calidad"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "Calidad de conversión de frecuencia de muestreo:"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "Dithering"
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr "Crear archivo CUE para creación de CD/DVD disk-at-once"
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "Crear archivo TOC para creación de CD/DVD disk-at-once"
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "Archivo de etiquetas con metadatos de sesión"
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "\\u2227"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "Mejor (sinc)"
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "Media (sinc)"
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "Rápida (sinc)"
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "Opciones de codificación lineal"
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "Opciones Ogg Vorbis"
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "Opciones FLAC"
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "Opciones de Broadcast Wave"
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6503,7 +7372,7 @@ msgstr ""
msgid "Preset"
msgstr "Preset"
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
@@ -6511,68 +7380,252 @@ msgstr ""
"¡El preset seleccionado no se cargó correctamente!\n"
"¿Quizás se refiere a un formato que ha sido eliminado?"
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
-msgstr "Mostrar los tiempos como:"
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "Exportar informe/análisis"
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "Seleccionar todo"
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Formato:"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
-msgstr " a "
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
-msgstr "Rango"
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Duración"
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Timecode:"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "Error:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
msgstr ""
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
+#: export_report.cc:222
+msgid "-888"
msgstr ""
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr "%1 dBFS"
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
-msgstr "-inf"
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
-msgstr "Modo de automatización de fader"
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "Ganancia de normalización:"
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
-msgstr "Tipo de automatización de fader"
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
-msgstr "Abs"
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "Rango de loudness:"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr "A8"
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+"No\n"
+"Disponible"
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr "Multiplicidad"
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr "Lg"
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr "Rf"
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr "Escala logarÃtimica"
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr "Rectificada"
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "No se pudo leer el archivo %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "No se pudo acceder al archivo de audio: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr "Mostrar los tiempos como:"
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr "Exportar en realtime"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr "Seleccionar todo"
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr " a "
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr "RT"
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr "Rango"
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr "-inf"
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr "Modo de automatización de fader"
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr "Tipo de automatización de fader"
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr "Abs"
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "P"
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr "T"
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr "W"
@@ -6580,49 +7633,53 @@ msgstr "W"
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Presets</span>"
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr "Manual"
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr "Toda automatización"
#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "Conmutadores"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Controles"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"Editor de plugin: no se pudo crear el elemento de control para el puerto %1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr "Editor de plugin: no hay control para propiedad %1"
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
"Editor de plugin: no se pudo crear el elemento de control para la propiedad "
"%1"
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "Conmutadores"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Controles"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr "Medidores"
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Control de la automatización"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr "Manual"
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "Gestor de conexiones de audio"
@@ -6631,112 +7688,141 @@ msgstr "Gestor de conexiones de audio"
msgid "MIDI Connection Manager"
msgstr "Gestor de conexiones MIDI"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Desconectar"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "puerto"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "Selección..."
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "Habilitado para grabación..."
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "En solo..."
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "Crear nuevo grupo según..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "Crear nuevo grupo con Máster según..."
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "Crear nuevo grupo..."
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr ""
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "Crear nuevo grupo con control Master según..."
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "Editar grupo..."
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr ""
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "Eiminar grupo"
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr "Eliminar bus de subgrupo"
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "Añadir nuebo bus de subgrupo"
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr "Añadir nuevo bus auxiliar (pre-fader)"
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr "Añadir nuevo bus auxiliar (post-fader)"
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr ""
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "Desactivar todos los grupos"
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr "Tiempo a eliminar"
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr "Tiempo a insertar:"
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr "Las regiones intersectadas deberÃan:"
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr "mantenerse en posición"
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr "moverse"
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr "separarse"
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Insertar tiempo en todas las listas de reproducción de la pista"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr "Aplicar a todas las listas de reproducción de la pista"
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr "Mover regiones adheridas"
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr "Mover marcas"
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr "Mover marcas adheridas"
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr "Mover marcas bloqueadas"
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
@@ -6744,15 +7830,23 @@ msgstr ""
"Mover cambios de tempo y métrica\n"
"<i>(puede provocar problemas en el mapa de tempo)</i>"
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr "Borrar tiempo"
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr "Insertar tiempo"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "-ninguno-"
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "Importando fichero: %1 de %2"
@@ -6760,70 +7854,95 @@ msgstr "Importando fichero: %1 de %2"
msgid "I/O selector"
msgstr "Selector de E/S"
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1 entrada"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1 salida"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr "la tuya propia"
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
"No se encontraron las combinaciones de teclas predeterminadas - ¡%1 será "
"difÃcil de usar!"
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
"No se pudo encontrar el archivo de combinaciones de teclas \"%1\". Se usarán "
"las combinaciones de teclas predeterminadas."
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "Eliminar atajo"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "Cargando atajos de teclado desde %1"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Acción"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Atajo de teclado"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Combinaciones de teclas"
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "Selecciona una acción y pulsa la/s tecla/s para (r)establecer su atajo"
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Eliminar atajo"
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "Buscar..."
+
+#: keyeditor.cc:82
+msgid "Print"
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
msgstr ""
-#: keyeditor.cc:269
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Acción"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Atajo de teclado"
+
+#: keyeditor.cc:370
msgid "RegionList"
msgstr ""
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
msgstr ""
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr "muestra"
+
#: latency_gui.cc:40
msgid "msec"
msgstr "msec"
@@ -6832,109 +7951,218 @@ msgstr "msec"
msgid "period"
msgstr "periodo"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 muestra"
-msgstr[1] "%1 muestras"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Restablecer"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "programming error: %1 (%2)"
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "Usar cursor"
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "Ir a"
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "Adherir"
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr ""
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr "Compositor:"
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "Pre-énfasis"
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr "Eliminar este rango"
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr ""
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr ""
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr "Establecer inicio de rango en posición de cursor"
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr "Establecer fin de rango en posición de cursor"
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr "Eliminar esta marca"
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr ""
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr "Establecer tiempo de marca en posición de cursor"
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "No puedes colocar una marca de CD al inicio de la sesión"
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr "Nueva marca"
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr "Nuevo rango"
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>Rangos de bucle/pinchazo</b>"
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>Marcas (incluyendo Ãndice de CD)</b>"
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>Rangos (incluyendo rangos de pistas de CD)</b>"
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "añadir marca de rango"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "Señal(es)"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "Acción %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "No se pudo leer script '%1': %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "Ejecutar"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "Limpiar salida"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "Eliminado %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "Guardado como %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "Error guardando archivo: %1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "Acción: '%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "Guardar como"
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr ""
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr ""
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6943,33 +8171,33 @@ msgid ""
"Click OK to exit %1."
msgstr ""
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr ""
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:350
msgid " (built using "
msgstr " (compilado usando "
-#: main.cc:313
+#: main.cc:353
msgid " and GCC version "
msgstr " y versión de GCC "
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr "Copyright (C) 1999-2015 Paul Davis"
-#: main.cc:324
+#: main.cc:364
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -6977,48 +8205,68 @@ msgstr ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
-#: main.cc:326
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 viene SIN GARANTÃA DE NINGUNA CLASE"
-#: main.cc:327
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
"incluidas de comerciabilidad o adecuación para un propósito determinado"
-#: main.cc:328
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Esto es software libre. Puedes distribuirlo "
-#: main.cc:329
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"bajo ciertas condiciones; lee el código para conocer las condiciones de "
"copia."
-#: main.cc:334
+#: main.cc:368
msgid "could not initialize %1."
msgstr "no se pudo inicializar %1."
-#: main.cc:344
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Cannot xinstall SIGPIPE error handler"
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr "could not create %1 GUI"
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr "Mostrar diferencia al punto de edición"
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "Editar tempo"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "Editar métrica"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr "Insertar cambio de tempo"
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr "Insertar cambio de métrica"
+
+#: marker.cc:280
msgid "MarkerText"
msgstr "MarkerText"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Ninguno"
@@ -7033,79 +8281,80 @@ msgstr "Forzar"
#: midi_channel_selector.cc:328 midi_channel_selector.cc:370
msgid "MIDI Channel Control"
-msgstr ""
+msgstr "Control de canales MIDI"
#: midi_channel_selector.cc:330
msgid "Playback all channels"
-msgstr ""
+msgstr "Reproducir todos los canales"
#: midi_channel_selector.cc:331
msgid "Play only selected channels"
-msgstr ""
+msgstr "Reproducir sólo los canales seleccionados"
#: midi_channel_selector.cc:332
msgid "Use a single fixed channel for all playback"
-msgstr ""
+msgstr "Usar un canal determinado para la reproducción"
#: midi_channel_selector.cc:333
msgid "Record all channels"
-msgstr ""
+msgstr "Grabar en todos los canales"
#: midi_channel_selector.cc:334
msgid "Record only selected channels"
-msgstr ""
+msgstr "Grabar sólo en los canales seleccionados"
#: midi_channel_selector.cc:335
msgid "Force all channels to 1 channel"
-msgstr ""
+msgstr "Forzar todos los canales a un único canal"
#: midi_channel_selector.cc:376
msgid "Inbound"
-msgstr ""
+msgstr "Entrada"
#: midi_channel_selector.cc:396
msgid "Click to enable recording all channels"
-msgstr ""
+msgstr "Pulsa para habilitar la grabación en todos los canales"
#: midi_channel_selector.cc:401
msgid "Click to disable recording all channels"
-msgstr ""
+msgstr "Pulsa para deshabilitar la grabación en todos los canales"
#: midi_channel_selector.cc:406
msgid "Click to invert currently selected recording channels"
-msgstr ""
+msgstr "Pulsa para invertir la selección actual de canales para grabación"
#: midi_channel_selector.cc:413
msgid "Playback"
-msgstr ""
+msgstr "Reproducción"
#: midi_channel_selector.cc:432
msgid "Click to enable playback of all channels"
-msgstr ""
+msgstr "Pulsa para habilitar la reproducción de todos los canales"
#: midi_channel_selector.cc:437
msgid "Click to disable playback of all channels"
-msgstr ""
+msgstr "Pulsa para deshabilitar la reproducción de todos lo canales"
#: midi_channel_selector.cc:442
msgid "Click to invert current selected playback channels"
msgstr ""
+"Pulsa para invertir la selección actual de los canales para reproducción"
#: midi_channel_selector.cc:620
msgid "Click to toggle playback of channel %1"
-msgstr ""
+msgstr "Pulsa para conmutar reproducción del canal %1"
#: midi_channel_selector.cc:628
msgid "Click to force all MIDI channel messages to channel %1"
-msgstr ""
+msgstr "Pulsa para forzar todos los canales MIDI al canal %1"
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
-msgstr ""
+msgstr "Pulsa para conmutar grabación de canal %1"
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
-msgstr ""
+msgstr "Pulsa para forzar todos los canales de grabación a %1"
#: midi_export_dialog.cc:35
msgid "Export MIDI: %1"
@@ -7215,192 +8464,188 @@ msgstr "edición de canal"
msgid "velocity edit"
msgstr "editar intensidad"
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr "añadir nota"
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr ""
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr "modificar cambio de patch"
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr "añadir cambio de patch"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr "mover cambio de patch"
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr "eliminar cambio de patch"
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr "eliminar selección"
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr "eliminar nota"
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr "mover notas"
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr "cambiar intensidades"
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr "transportar"
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr "cambiar duración de notas"
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr "empujar"
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr "cambiar canal"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr "Banco"
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "Programa"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr "Canal"
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "pegar"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "Dispositivo MIDI externo"
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "Modo de dispositivo externo"
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
-msgstr ""
+msgstr "Pulsa para editar los ajustes de canales"
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "Mostrar rango completo"
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "Ajustar contenidos"
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "Rango de notas"
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "Modo de notas"
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Modo color"
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr "Bender"
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "Presión"
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr "Controladores"
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "No hay canales MIDI seleccionados"
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "Ocultar todos los canales"
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "Mostrar todos los canales"
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "Canal %1"
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "Controladores %1-%2"
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr "Controlador %1"
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "Sostenido"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "Percusivo"
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "Colores de medidor"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "Colores de canal"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Color de pista"
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7417,7 +8662,7 @@ msgstr "Auto-Scroll"
msgid "Decimal"
msgstr "Decimal"
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "Habilitado"
@@ -7433,35 +8678,36 @@ msgstr "Puerto:"
msgid "New velocity"
msgstr "Nueva intensidad"
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr "Seleccionar una carpeta para buscar"
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr "Añade la carpeta seleccionada a la ruta de búsqueda y prueba otra vez"
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr "Dejar de cargar esta sesión"
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr "Omitir todos los archivos ausentes"
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr "Omitir este archivo"
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "audio"
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7481,7 +8727,7 @@ msgstr ""
"<tt>%4</tt>\n"
"\n"
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr "Pulsa para elegir una carpeta adicional"
@@ -7489,98 +8735,40 @@ msgstr "Pulsa para elegir una carpeta adicional"
msgid "Missing Plugins"
msgstr "Plugins ausentes"
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Conmutar solo en pistas/buses seleccionadas en Mezclador"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Conmutar mudo en pistas/buses seleccionadas en Mezclador"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-"Activar/Desactivar grabación en pistas/buses seleccionadas en Mezclador"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Copiar procesadores seleccionados"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Cortar procesadores seleccionados"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Pegar procesadores seleccionados"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Eliminar procesadores seleccionados"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Seleccionar todos los procesadores (visibles)"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Conmutar procesadores seleccionados"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Conmutar plugins seleccionados"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-"Conmutar Entrada MIDI activa para pistas/buses seleccionadas en Mezclador"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr ""
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "pre"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr "Comentarios"
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr "Conmutar anchura de este canal de mezcla."
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -7588,287 +8776,460 @@ msgstr ""
"\n"
"%1-%2-clic para conmutar la anchura de todos los canales."
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr "Ocultar este canal del mezclador"
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr "Selección de punto de medición"
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr "Solo aislado"
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr "Bloquear estado de solo"
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr "Lock"
+
+#: mixer_strip.cc:209 mixer_strip.cc:2224
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "Grupo de mezcla"
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr "Recortar:"
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr "Inversión de fase"
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr "Grabar y monitorizar"
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr "Solo Iso / Lock"
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr "Mostrar/Ocultar sección de monitorización"
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr "Activar/Desactivar entrada MIDI"
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr "Aux"
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr "Snd"
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
-msgstr ""
+msgstr "Añadir %1 puertos"
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr "MIDI "
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr "<b>ENTRADA</b> a %1"
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>SALIDA</b> desde %1"
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr "Desconectado"
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Comentarios*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr "Pulsa para añadir o editar comentarios"
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
msgid "Cmt"
msgstr "Cmt"
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr ""
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Clicar para añadir o editar comentarios"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr "Grp"
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr "~G"
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Color..."
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr "Notas..."
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr ""
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr ""
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr "Guardar como plantilla..."
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Activo"
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "E/S estricto"
+
+#: mixer_strip.cc:1683 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "Pin Connections..."
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr "Ajustar latencia..."
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr "Proteger contra denormals"
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "ID de control remoto..."
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "Duplicar..."
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr "Disco"
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr "Mon"
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr "AFL"
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr "PFL"
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr "Mon|O"
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "Pre-Fader"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Post-Fader"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Grupo"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "Plugins favoritos"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr ""
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-todos-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Canales"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr "No hay pista o bus seleccionado."
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "Añadir arriba del todo"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "Añadir pre-Fader"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "Añadir post-Fader"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "Añadir al final"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Eliminar de favoritos"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Eliminar preset"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Conmutar solo en pistas/buses seleccionadas en Mezclador"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Conmutar mudo en pistas/buses seleccionadas en Mezclador"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+"Activar/Desactivar grabación en pistas/buses seleccionadas en Mezclador"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Copiar procesadores seleccionados"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Cortar procesadores seleccionados"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Pegar procesadores seleccionados"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Eliminar procesadores seleccionados"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Seleccionar todos los procesadores (visibles)"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Conmutar procesadores seleccionados"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Conmutar plugins seleccionados"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Deselect all strips and processors"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+"Conmutar Entrada MIDI activa para pistas/buses seleccionadas en Mezclador"
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr ""
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr ""
-#: meter_strip.cc:884
+#: meter_strip.cc:895
msgid "Short"
msgstr ""
-#: meter_strip.cc:885
+#: meter_strip.cc:896
msgid "Tall"
msgstr ""
-#: meter_strip.cc:886
+#: meter_strip.cc:897
msgid "Grande"
msgstr ""
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr ""
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr "SiP"
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "Solos"
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr ""
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr ""
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -7876,7 +9237,7 @@ msgstr ""
"Cuando está activo, algo está en solo aislado.\n"
"Pulsa para que nada esté aislado"
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -7884,133 +9245,208 @@ msgstr ""
"Si está activado, se está produciendo escucha.\n"
"Pulsa para detener la escucha"
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr "Los controles de solo afectan solo-in-situ"
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr "Los controles de solo conmutan escucha-post-fader"
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr "Los controles de solo conmutan escucha-pre-fader"
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+"Solo exclusivo significa que solamente 1 solo está activo en un momento dado"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Si está habilitado, el solo tendrá preferencia sobre el mudo\n"
+"(una pista o bus en solo y mudo al mismo tiempo será audible)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr "Procesadores"
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr "Incremento de ganancia para señales en solo (0dB es normal)"
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr ""
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
-#: monitor_section.cc:196
-msgid "SiP Cut"
-msgstr "Cortar SiP"
-
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
msgstr ""
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
-msgstr "Dim"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
msgstr ""
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:231
+msgid "OFF"
msgstr ""
-"Solo exclusivo significa que solamente 1 solo está activo en un momento dado"
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:233
+msgid "SiP Cut"
+msgstr "Cortar SiP"
+
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
msgstr ""
-"Si está habilitado, el solo tendrá preferencia sobre el mudo\n"
-"(una pista o bus en solo y mudo al mismo tiempo será audible)"
-#: monitor_section.cc:323
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr "Dim"
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr "-30 dB"
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr "Inv"
+
+#: monitor_section.cc:399
msgid "Monitor"
msgstr "Monitorizar"
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr "Cambiar monitor a mono"
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr "Cortar monitor"
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr "Atenuar monitor"
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr "Activar/desactivar modo de solo exclusivo"
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr "Mudo anula solo"
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "Cortar canal de monitorización %1"
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr "Atenuar canal de monitorización %1"
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr "Poner en solo canal de monitorización %1"
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr "Invertir canal de monitorización %1"
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr "Escucha Post-fader (AFL) solo"
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr "Escucha pre-fader (PFL) solo"
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr "Toggle Monitor Section Processor Box"
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
# Aquà estaaba panorámica, pero pan se entiende perfectamente y es mucho más corto
-#: mono_panner_editor.cc:33
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
-msgstr "Paner mono"
+msgstr "Pan mono"
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -8084,10 +9520,6 @@ msgstr ""
"de Ardour depende de un flujo de ingresos estable y sostenible.\n"
"¡Gracias por usar Ardour!"
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nuevo preset"
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr "Reemplazar el preset existente con este nombre"
@@ -8096,6 +9528,10 @@ msgstr "Reemplazar el preset existente con este nombre"
msgid "Name of new preset"
msgstr "Nombre del nuevo preset"
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "Normalizar regiones"
@@ -8104,9 +9540,9 @@ msgstr "Normalizar regiones"
msgid "Normalize region"
msgstr "Normalizar región"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalizar a:"
#: normalize_dialog.cc:56
msgid "Normalize each region using its own peak value"
@@ -8124,90 +9560,97 @@ msgstr "Normalizar"
msgid "Select Note"
msgstr "Seleccionar nota"
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Uso: "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr " [SESSION_NAME] Nombre de sesión a cargar\n"
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
" -v, --version Muestra información acerca de la versión\n"
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr " -h, --help Muestra este mensaje\n"
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
" -b, --bindings Muestra todos los atajos de teclado posibles\n"
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+" -B, --bypass-plugins Baipasar todos los plugins en una sesión "
+"existente\n"
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
" -d, --disable-plugins Desactivar todos los plugins de una sesión "
"existente\n"
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr " -n, --no-splash No mostrar pantalla inicial\n"
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr " -m, --menus file Usar \"file\" para definir menús\n"
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
" -N, --new session-name Crear una sesión nueva desde la lÃnea de "
"comandos\n"
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
" -O, --no-hw-optimizations Desactivar las optimizaciones especÃficas "
"de h/w\n"
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
# no sé realmente qué significa
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
" -S, --sync Dibujar la interfaz gráfica de usuario "
"sincrónicamente\n"
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr " -V, --novst No usar soporte VST\n"
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
@@ -8215,28 +9658,26 @@ msgstr ""
" -E, --save <file> Carga la sesión especificada, la guarda a "
"<file> y después sale\n"
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr " -C, --curvetest filename Debugger del algoritmo de la curva\n"
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
" -k, --keybindings filename Nombre del archivo de combinaciones de "
-"teclas a cargar (predeterminado: ~/.ardour3/ardour.bindings)\n"
+"teclas a cargar\n"
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr "Paner (2D)"
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "Puentear"
# Aquà estaaba panorámica, pero pan se entiende perfectamente y es mucho más corto
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr "Paner"
@@ -8248,8 +9689,24 @@ msgstr "Modo de automatización de panorámica"
msgid "Pan automation type"
msgstr "Tipo de automatización de panorámica"
-#: playlist_selector.cc:43
-msgid "Playlists"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
+#: playlist_selector.cc:43
+msgid "Playlists"
msgstr "Listas de reproducción"
#: playlist_selector.cc:54
@@ -8272,108 +9729,262 @@ msgstr "no asignado"
msgid "Imported"
msgstr "Importado"
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
msgid "dB scale"
msgstr "escala dB"
-#: plugin_eq_gui.cc:116
+#: plugin_eq_gui.cc:124
msgid "Show phase"
msgstr "Mostrar fase"
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "Configuración manual"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "Automatic"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 Canal"
+msgstr[1] "%1 Canales"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "No se pudo configurar el nuevo envÃo: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "Pin Configuration: %1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "Configuración de plugin"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "Configuración de salida"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "El nombre contiene"
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "El tipo contiene"
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr "La categorÃa contiene"
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "El autor contiene"
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "La biblioteca contiene"
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "Sólo favoritos"
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "Sólo ocultos"
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr "Administrador de plugins"
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr "Fav"
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr "Plugins disponibles"
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Tipo"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr "CategorÃa"
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr "Creador"
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr "# Audio In"
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr "# Audio Out"
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr "# MIDI In"
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr "# MIDI Out"
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "Plugins que se conectarán"
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Añadir plugin a la lista de efectos"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Eliminar plugin de la lista de efectos"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Actualizar plugins disponibles"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr "Mostrar oculto"
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr "Instrumentos"
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr "Analizadores"
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "Insertar plugin/s"
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -8383,27 +9994,27 @@ msgstr ""
"\n"
"Ver la ventana de mensajes para más detalles"
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "Favoritos"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "Administrador de plugins..."
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Por autor"
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Por categorÃa"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "¿Cómo? ¡Los plugins LADSPA no tienen editores!"
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
@@ -8411,11 +10022,11 @@ msgstr ""
"Tipo desconocido de plugin con editor propio (nota: no hay soporte para VST "
"en esta versión de %1)"
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr "Tipo desconocido de plugin con editor propio "
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
@@ -8423,7 +10034,7 @@ msgstr ""
"Tipo desconocido de plugin con editor propio (nota: no hay soporte linuxVST "
"en esta versión de %1)"
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8431,37 +10042,42 @@ msgstr ""
msgid "Add"
msgstr "Añadir"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr "Descripción"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr "Análisis de plugin"
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr "Guadar un preset nuevo"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr ""
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr ""
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr ""
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -8469,110 +10085,126 @@ msgstr ""
"Pulsa para permitir que el plugin reciba eventos de teclado que %1 usarÃa "
"normalmente como atajos de teclado"
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr "Pulsa para activar/desactivar este plugin"
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "latencia (%1 muestra)"
msgstr[1] "latencia (%1 muestras)"
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr "latencia (%1 ms)"
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr "Editar latencia"
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nuevo preset"
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "Pulsa para permitir el uso normal de los atajos de teclado de %1"
-#: port_group.cc:337
+#: plugin_ui.cc:795
+msgid "(none)"
+msgstr "(ninguno)"
+
+#: port_group.cc:338
msgid "%1 Busses"
msgstr "Buses %1"
-#: port_group.cc:338
+#: port_group.cc:339
msgid "%1 Tracks"
msgstr "Pistas %1"
-#: port_group.cc:339
+#: port_group.cc:340
msgid "Hardware"
msgstr "Hardware"
-#: port_group.cc:340
+#: port_group.cc:341
msgid "%1 Misc"
msgstr "Ardour misc"
-#: port_group.cc:341
+#: port_group.cc:342
msgid "Other"
msgstr "Otro"
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr ""
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr ""
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr "Entrada MTC"
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr "Entrada control MIDI"
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr "Entrada reloj MIDI"
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr "Entrada MMC"
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr "Salida MTC"
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr "Salida control MIDI"
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr "Salida reloj MIDI"
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr "Salida MMC"
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ":monitor"
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr ""
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
msgstr ""
#: port_insert_ui.cc:39
@@ -8595,79 +10227,76 @@ msgstr "No se ha detectado señal"
msgid "Port Insert "
msgstr "Inserción puerto"
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr "<b>OrÃgenes</b>"
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr "<b>Destinos</b>"
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr "Añadir %s %s"
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr "Renombrar '%s'..."
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr "Eliminar todo"
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr "%s todos"
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Buscar otra vez"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr "Mostrar puertos individuales"
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-"No es posible añadir un puerto aquÃ, pues el primer procesador de la pista o "
-"bus no puede soportar la nueva configuración."
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr ""
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "Eliminación de puertos no permitida"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "Eliminación de puertos no permitida"
+
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "Eliminar '%s'"
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s todo desde '%s'"
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "canal"
@@ -8679,59 +10308,70 @@ msgstr "No hay puertos para conectar."
msgid "There are no %1 ports to connect."
msgstr "No hay %1 puertos para conectar."
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "Mostrar todos los controles"
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "Ocultar todos los controles"
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr "on"
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "apagado"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -8739,15 +10379,25 @@ msgstr ""
"Botón derecho para añadir/eliminar/editar\n"
"plugins, inserciones, envÃos y más"
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+"Processor Drag/Drop failed. Probablemente porque\n"
+"la configuración de E/S de los plugins no concuerda\n"
+"con la configuración de E/S de la pista."
+
+#: processor_box.cc:2455 processor_box.cc:2998
msgid "Plugin Incompatibility"
msgstr "Incompatiblidad de plugin"
-#: processor_box.cc:1432
+#: processor_box.cc:2458
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "Intentaste añadir el plugin \"%1\" en el slot %2.\n"
-#: processor_box.cc:1438
+#: processor_box.cc:2464
msgid ""
"\n"
"This plugin has:\n"
@@ -8755,19 +10405,19 @@ msgstr ""
"\n"
"Este plugin tiene:\n"
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 entrada MIDI\n"
msgstr[1] "\t%1 entradas MIDI\n"
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 entrada audio\n"
msgstr[1] "\t%1 entradas audio\n"
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -8775,19 +10425,19 @@ msgstr ""
"\n"
"Pero en el punto de inserción hay:\n"
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 canal MIDI\n"
msgstr[1] "\t%1 canales MIDI\n"
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 canal audio\n"
msgstr[1] "\t%1 canales audio\n"
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -8795,11 +10445,7 @@ msgstr ""
"\n"
"%1 es incapaz de insertar este plugin aquÃ.\n"
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "No se pudo configurar el nuevo envÃo: %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -8809,19 +10455,19 @@ msgstr ""
"de ese modo porque las entradas y salidas no\n"
"funcionarán correctamente."
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr "Renombrar procesador"
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr ""
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -8832,7 +10478,7 @@ msgstr ""
"configuración de E/S de los plugins no concuerda\n"
"con la configuración de esta pista."
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -8840,15 +10486,15 @@ msgstr ""
"¿De verdad deseas eliminar todos los procesadores de %1? \n"
"(esto no se puede deshacer)"
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "SÃ, eliminar todos"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr "Eliminar procesadores"
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -8856,7 +10502,7 @@ msgstr ""
"¿De verdad deseas eliminar todos los procesadores pre-fader de %1?\n"
"(esto no se puede deshacer)"
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
@@ -8864,61 +10510,61 @@ msgstr ""
"¿De verdad deseas eliminar todos los procesadores post-fader de %1?\n"
"(esto no se puede deshacer)"
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr "Nuevo plugin"
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Nueva inserción"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr "Nuevo envÃo externo..."
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr "Nuevo envÃo auxiliar..."
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr "Limpiar (todos)"
# es correcto el término 'resetear'?
# He cambiado tipo de compás y compás, cuando tiene este significado, por métrica
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr "Limpiar (pre-fader)"
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr "Limpiar (post-fader)"
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "Activar todos"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr "Desactivar todos"
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr "Plugins A/B"
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr "%1: %2 (a %3)"
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr ""
@@ -8948,153 +10594,319 @@ msgstr "Banco"
msgid "main grid"
msgstr "rejilla principal"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Cuantificar"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "Fuerza"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Swing"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "Umbral (ticks)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr "Ajustar principio de nota"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr "Ajustar final de nota"
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Archivo de audio de claqueta:"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "Explorar..."
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr "Ãnfasis en el primer golpe:"
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr "Usar claqueta predeterminada:"
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Archivo de audio de claqueta:"
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Archivo de audio de claqueta acentuada:"
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Elige claqueta"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Elige claqueta acentuada"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "Limitar historial de deshacer a"
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
-msgstr "Guardar historial de deshacer de"
+msgstr "Guardar historial de deshacer para"
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "comandos"
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr "Seleccionar disposición de teclado:"
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr "Al hacer clic:"
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "Editar usando:"
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ botón"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "Eliminar usando:"
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "Insertar nota usando:"
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr "Cuando se empieza a arrastrar:"
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr "<b>Configuración recomendada: %1</b>%2"
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr "Copiar elementos usando:"
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr "Cuando se comienza a recortar:"
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr "Recortar contenidos usando:"
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr "Recorte anclado usando:"
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr "Redimensionar notas relativamente usando:"
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr "Mientras se arrastra:"
+
+#: rc_option_editor.cc:684
msgid "Ignore snap using:"
msgstr "Ignorar ajuste usando:"
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Disposición de teclado:"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr "Ajustar relativamente usando:"
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr "Mientras se recorta:"
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Escalado de tipografÃa:"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr "Redimensionar regiones superpuestas usando:"
-#: rc_option_editor.cc:547
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr "Mientras se arrastran puntos de control:"
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr "Ajuste fino usando:"
+
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr "Empujar puntos usando:"
+
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr "Escalado de interfaz gráfica y tipografÃa:"
+
+#: rc_option_editor.cc:1032
msgid "Default"
msgstr "Predeterminado"
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr "Ajustar la escala requiere reiniciar la aplicación."
+
+#: rc_option_editor.cc:1100
+msgid "\\u221e"
+msgstr ""
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr ""
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr ""
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:614
+#: rc_option_editor.cc:1159
msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:666
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr "Sesiones pequeñas (4-16 pistas)"
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "Preset:"
+
+#: rc_option_editor.cc:1231
msgid "Playback (seconds of buffering):"
-msgstr "Reproducción (segundos de buffering)"
+msgstr "Reproducción (segundos de buffering):"
-#: rc_option_editor.cc:679
+#: rc_option_editor.cc:1244
msgid "Recording (seconds of buffering):"
msgstr "Grabación (segundos de buffering)"
-#: rc_option_editor.cc:737
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-"Doble clic en un nombre para editar ajustes para un protocolo habilitado"
+"Pulsa para editar la configuración del protocolo seleccionado (debe estar "
+"habilitado):"
-#: rc_option_editor.cc:903
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr "Mostrar ajustes de protocolo"
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr "Configuración:"
+
+#: rc_option_editor.cc:1547
msgid "Show Video Export Info before export"
msgstr "Mostrar información antes de exportar"
-#: rc_option_editor.cc:904
+#: rc_option_editor.cc:1548
msgid "Show Video Server Startup Dialog"
msgstr "Mostrar diálogo de arranque de servidor de video"
-#: rc_option_editor.cc:905
+#: rc_option_editor.cc:1549
msgid "Advanced Setup (remote video server)"
msgstr "Configuración avanzada (servidor de video remoto)"
-#: rc_option_editor.cc:913
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "Servidor de video"
+
+#: rc_option_editor.cc:1565
msgid ""
"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
"- Do not enable this option unless you know what you are doing."
msgstr ""
-#: rc_option_editor.cc:915
+#: rc_option_editor.cc:1567
msgid "Video Server URL:"
msgstr "URL del servidor de video:"
-#: rc_option_editor.cc:920
+#: rc_option_editor.cc:1572
msgid ""
"Base URL of the video-server including http prefix. This is usually 'http://"
"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
"the video-server is running locally"
msgstr ""
-#: rc_option_editor.cc:922
+#: rc_option_editor.cc:1574
msgid "Video Folder:"
msgstr "Carpeta de videos:"
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1579
msgid ""
"Local path to the video-server document-root. Only files below this "
"directory will be accessible by the video-server. If the server run on a "
@@ -9103,191 +10915,125 @@ msgid ""
"monitor and file-browsing when opening/adding a video file."
msgstr ""
-#: rc_option_editor.cc:934
+#: rc_option_editor.cc:1584
msgid ""
"<b>When enabled</b> an information window with details is displayed before "
"the video-export dialog."
msgstr ""
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1589
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr "Mostrar siempre progreso de escaneo de plugins"
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr "Buscar plugins VST al arrancar la aplicación "
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr "Busca plugins AudioUnit al arrancar la aplicación "
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "General"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "Escanear plugins"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
-#: rc_option_editor.cc:1048
+#: rc_option_editor.cc:1610
msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
msgstr ""
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr "Tiempo restante [decisegundos]"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr "VST"
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr "Preferencias de %1"
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "Limpiar caché de plugins VST"
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr "Uso de DSP CPU"
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "Limpiar lista negra de plugins VST"
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr "Usos de procesado de señal"
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
-msgstr ""
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr "todos los procesadores menos uno"
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr ""
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr "todos los procesadores disponibles"
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr ""
+#: rc_option_editor.cc:1887
+msgid "%1 processors"
+msgstr "%1 procesador(es)"
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "Audio Unit"
-
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
-msgstr ""
-
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "Limpiar caché de plugins AU"
-
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "Limpiar lista negra de plugins AU"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
-msgstr "Establecer ruta de búsqueda de plugins Windows VST"
-
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
-msgstr "Establecer ruta de búsqueda de plugins Linux VST"
-
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
-msgstr "Preferencias de %1"
-
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
-msgstr "Uso de DSP CPU"
-
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
-msgstr "Usos de procesado de señal"
-
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
-msgstr "todos los procesadores menos uno"
-
-#: rc_option_editor.cc:1319
-msgid "all available processors"
-msgstr "todos los procesadores disponibles"
-
-#: rc_option_editor.cc:1322
-msgid "%1 processors"
-msgstr "%1 procesadores"
-
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
-msgstr "Esta configuración sólo tendrá efecto cuando %1 sea reiniciado"
+msgstr "Esta configuración sólo tendrá efecto después de reiniciar %1."
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "Opciones de deshacer"
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "Verificar borrado de última captura"
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Hacer copias de seguridad periódicas del archivo de sesión"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr "Gestión de sesiones"
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Hacer copias de seguridad periódicas del archivo de sesión"
+
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Copiar siempre archivos importados"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr "Carpeta predeterminada para sesiones nuevas:"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "Número máximo de sesiones recientes"
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "Misc/Claqueta"
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr "Nivel de ganancia de claqueta"
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automatización"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr "Factor de adelgazamiento (mayor valor => menos datos)"
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "Intervalo de sampleado de automatización (milisegundos)"
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr "Opciones de transporte"
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "Mantener la grabación preparada al detener"
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -9295,12 +11041,17 @@ msgid ""
"<b>When disabled</b> the loop button starts playing the loop, but stop then "
"cancels loop playback"
msgstr ""
+"<b>Si está habilitado</b> se reproduce el bucle sin parar aunque el botón de "
+"bucle no inicia la reproducción\n"
+"\n"
+"<b>Si está deshabilitado</b> el botón de bucle inicia la reproducción del "
+"rango de bucle pero se para al finalizar éste."
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr "Detener grabación al detectar xrun"
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
@@ -9308,15 +11059,15 @@ msgstr ""
"Si está <b>habilitado</b> %1 dejará de grabar si el motor de audio detecta "
"un x-run"
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "Crear marca en posición de xrun"
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "Parar en el fin de sesión"
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -9330,11 +11081,11 @@ msgstr ""
"Si está <b>deshabilitado</b> %1 seguirá adelante al alcanzar la marca de fin "
"de sesión, en todo caso"
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -9350,11 +11101,11 @@ msgstr ""
"<b>When disabled</b> looping is done by locating back to the start of the "
"loop when %1 reaches the end which will often cause a small click or delay"
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr "Impedir desactivación de grabación por pista con el transporte activo"
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
@@ -9362,11 +11113,11 @@ msgstr ""
"<b>Si está activado</b> impedirá que se desactive la grabación de pistas "
"especÃficas durante una toma"
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "Reducir ganancia 12db en avance rápido y rebobinado"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
@@ -9374,19 +11125,64 @@ msgstr ""
"Esto reduce el desagradable incremento de volumen percibido que ocurre a "
"veces al rebobinar o acelerar"
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+# podrÃa ser "desplazar", chequear contexto
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "Transporte/Sync"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "Opciones de sincronización y esclavos"
+
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr "Origen de timecode externo"
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9400,27 +11196,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9433,669 +11229,946 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr ""
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr "Generador LTC "
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr "Habilitar generador LTC"
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr ""
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Hacer que el rectángulo de selección elástica se ajuste a rejilla"
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "Mover automatización relevante al desplazar regiones de audio"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Nombrar marcas nuevas"
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Mostrar medidores en pistas en Editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+"Si está activo, cada vez que se crea una marca aparece una ventanita para "
+"nombrar la marca\n"
+"\n"
+"(Las marcas se pueden renombrar en cualquier momento, por medio del clic "
+"derecho)"
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr "Permitir arrastrado de cursor"
+
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
+msgstr "Mostrar medidor máster en la barra de herramientas"
+
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
+msgstr "Mostrar barra de herramientas de zoom"
+
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
+"Usar siempre la posición del ratón como foco del zoom cuando se hace zoom "
+"con la rueda del ratón "
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr "Actualizar la ventana del editor durante arrastres del resumen"
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
+"Auto-scroll en la ventana del editor cuando se arrastra hacia cerca de sus "
+"bordes"
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr "Mostrar envolventes de ganancia en regiones de audio"
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr "en todos los modos"
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr "sólo en modos de dibujo y ediciones internas"
+
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr "Comportamiento del Editor"
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "Mover automatización relevante al desplazar regiones de audio"
+
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr "Forma de fundido predeterminada"
-#: rc_option_editor.cc:1672
+#: rc_option_editor.cc:2310
msgid "Regions in active edit groups are edited together"
msgstr "Las regiones en los grupos de edición activos se editan juntas"
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:2311
msgid "whenever they overlap in time"
msgstr "cuando se solapan en el tiempo"
-#: rc_option_editor.cc:1674
+#: rc_option_editor.cc:2312
msgid "only if they have identical length, position and origin"
msgstr "sólo si tienen la misma duración, posición y origen"
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Hacer que el rectángulo de selección elástica se ajuste a rejilla"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr "Modelo de superposición"
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Mostrar formas de onda en regiones"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr "El más reciente arriba"
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
-msgstr "Mostrar envolventes de ganancia en regiones de audio"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr "superposición manual"
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "en todos los modos"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr "Tras separar regiones seleccionadas, seleccionar"
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr "Ninguna región"
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr "Regiones recién creadas"
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr "Regiones existentes y regiones recién creadas"
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr "Formas de onda"
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Mostrar formas de onda en regiones"
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "sólo en el modo de ganancia de región"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Mostrar formas de onda al grabar audio"
-#: rc_option_editor.cc:1709
+#: rc_option_editor.cc:2370
msgid "Waveform scale"
msgstr "Escala de forma de onda"
-#: rc_option_editor.cc:1714
+#: rc_option_editor.cc:2375
msgid "linear"
msgstr "lineal"
-#: rc_option_editor.cc:1715
+#: rc_option_editor.cc:2376
msgid "logarithmic"
msgstr "logarÃtmica"
-#: rc_option_editor.cc:1721
+#: rc_option_editor.cc:2382
msgid "Waveform shape"
msgstr "Forma de onda"
# en realidad no existe este término en el español...
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:2387
msgid "traditional"
msgstr "tradicional"
-#: rc_option_editor.cc:1727
+#: rc_option_editor.cc:2388
msgid "rectified"
msgstr "rectificada"
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Mostrar formas de onda al grabar audio"
-
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Mostrar barra de herramientas de zoom"
-
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "Actualizar la ventana del editor durante arrastres del resumen"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "Sincronizar selección en Editor y Mezclador"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Nombrar marcas nuevas"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-msgstr ""
-"Si está activo, cada vez que se crea una marca aparece una ventanita para "
-"nombrar la marca\n"
-"\n"
-"(Las marcas se pueden renombrar en cualquier momento, por medio del clic "
-"derecho)"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr ""
-"Auto-scroll en la ventana del editor cuando se arrastra hacia cerca de sus "
-"bordes"
-
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr ""
-
-#: rc_option_editor.cc:1791
-msgid "no regions"
-msgstr ""
-
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr "Buffering"
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr "Monitorización de la grabación manejado por"
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "hardware de audio"
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Modo magnetófono"
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Conexión de pistas y buses"
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "Autoconectar buses master/monitor"
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "Conectar a entradas de pista"
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "automáticamente a entradas fÃsicas"
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "manualmente"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "Conectar salidas de pista y bus"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "automáticamente a salidas fÃsicas"
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "automáticamente al bus master"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "Usar 'E/S estricto' para pistas y buses nuevos"
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr "Denormals"
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr "Usar DC bias para proteger contra denormals"
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "Manejo de procesador"
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "ningún manejo de procesador"
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr "usar FlushToZero"
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "usar DenormalsAreZero"
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr "usar FlushToZero y DenormalsAreZero"
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "Silenciar plugins cuando el transporte esté parado"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Nuevos plugins inician activados"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "Activar análisis automático de audio"
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "Duplicar canales de región ausentes"
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / mudo"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "Solo y mudo"
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "Corte de solo / mudo (dB)"
-
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
msgid "Solo controls are Listen controls"
msgstr "Los controles de solo son controles de escucha"
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Solo exclusivo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Mostrar mudos de solo"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo invalida mudo"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr "Corte de solo / mudo (dB)"
+
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr "Posición de escucha"
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr "Post-fader (AFL) "
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr "pre-fader (PFL)"
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr "Las señales PFL vienen desde"
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr "antes de procesadores pre-fader"
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr "pre-fader pero después de procesadores pre-fader"
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr "Las señales AFL vienen desde"
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr "inmediatamente post-fader"
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr "después de procesadores post-fader (antes de pan)"
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Solo exclusivo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Mostrar mudos de solo"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo invalida mudo"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "Opciones predeterminadas para mudo de pista o bus"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr "Mudo afecta envÃos pre-fader"
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr "Mudo afecta envÃos post-fader"
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "Mudo afecta a salidas de control"
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "Mudo afecta a salidas principales"
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
-msgstr ""
+msgstr "Ruteado de envÃos"
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
+"Enlazar panorámicas de envÃos auxiliares y externos con el panorámico "
+"principal de forma predeterminada"
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr "Preferencias MIDI"
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr ""
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "Cambio de programa inicial"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "Mostrar el primer banco o programa MIDI como 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "No mostrar mensajes MIDI periódicos (MTC, MIDI Clock)"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr "Las notas MIDI suenan al ser seleccionadas"
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "Enviar feedback de control MIDI"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/Sync"
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr "MIDI Clock"
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr "MIDI Time Code (MTC)"
+
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr "Enviar MIDI Time Code"
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr ""
"Pocentaje a cada lado de la velocidad normal de transporte para transmitir "
"MTC"
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr "Midi Machine Control (MMC)"
+
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "Obedecer comandos de MIDI Machine Control"
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
msgstr "Enviar comandos de MIDI Machine Control"
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "Enviar feedback de control MIDI"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr "ID del dispositivo MMC de entrada"
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr "ID del dispositivo MMC de salida"
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "Cambio de programa inicial"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "Mostrar el primer banco o programa MIDi como 0"
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "No mostrar mensajes MIDI periódicos (MTC, MIDI Clock)"
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "Las notas MIDI suenan al ser seleccionadas"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr ""
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr "Interacción con el usuario"
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
" <i>(if available for your language preferences)</i>"
msgstr ""
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "Teclado"
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "ID remota de superficies de control"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Escanear plugins"
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "asignado por usuario"
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr "General"
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr "Mostrar siempre el progreso de escaneado de plugins"
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Silenciar plugins cuando el transporte está parado"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Los plugins nuevos inician activados"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "Plugins/VST"
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr "VST"
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr "Buscar plugins VST al arrancar la aplicación "
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr "VST Cache:"
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr "VST Blacklist:"
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr "Ruta:"
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "Plugins/Audio Unit"
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr "Audio Unit"
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr "Busca plugins AudioUnit al arrancar la aplicación "
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr "AU Cache:"
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr "AU Blacklist:"
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr "Plugin GUI"
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+"Abrir el interfaz del plugin automáticamente cuando se añade un nuevo plugin"
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "Mostrar el display en lÃnea del plugin de forma predeterminada"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+"No abrir el interfaz del plugin automáticamente cuando éste tiene display en "
+"lÃnea"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "Instrumento"
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "Preguntar para reemplazar plugin de instrumento existente"
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+"Configurar los plugins de instrumentos de forma interactiva al insertarlo"
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr "Deshabilitar aceleración gráfica por hardware (requiere reiniciar)"
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
+msgid "Preferences|GUI"
+msgstr ""
+
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "según orden de Mezclador"
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3072
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "Resaltar controles al pasar sobre éstos el puntero del ratón"
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3080
msgid "Show tooltips if mouse hovers over a control"
msgstr "Mostrar descripciones emergentes al colocar el ratón sobre un control"
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3088
msgid "Use name highlight bars in region displays (requires a restart)"
+msgstr "Usar barras de resaltado para el nombre de región (requiere reiniciar)"
+
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
+msgstr "Actualizar el reloj según FPS, en lugar de cada 100 ms"
+
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3127
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3135
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3153
msgid "Mixer Strip"
msgstr "Canal de Mezclador"
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3163
msgid "Use narrow strips in the mixer by default"
msgstr "Usar canales de mezcla estrechos de forma predeterminada"
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3180
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3186
msgid "short"
msgstr "corto"
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3187
msgid "medium"
msgstr "medio"
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3188
msgid "long"
msgstr "largo"
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3194
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3200
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3201
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3211
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3221
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3227
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3237
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3243
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3248
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3249
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3250
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3251
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3257
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr "Tipo de medidor determinado para buses"
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3313
msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3320
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "Medidores de Editor"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "Mostrar medidores en pistas en Editor"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr "Mostrar como mucho medidores estéreo en la cabecera de pista"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "Mostrar el análisis de loudness como archivo de imagen"
+
+#: rc_option_editor.cc:3356
msgid "Theme"
msgstr "Tema"
-#: region_editor.cc:79
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "Tema/Colores"
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr "Establecer ruta de búsqueda de plugins Linux VST"
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr "Establecer ruta de búsqueda de plugins Windows VST"
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "Escuchar esta región"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr "Posición:"
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr "Fin:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr "Duración:"
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr "Punto de sincronÃa (relativa a región):"
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr "Punto sincronÃa (absoluto):"
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr "Inicio de archivo:"
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr "OrÃgenes:"
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr "Origen:"
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr "Región '%1'"
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr "cambiar posición del inicio de región"
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr "cambiar posición del final de región"
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr "cambiar duración de región "
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr "cambiar punto de sincronÃa de región"
@@ -10115,33 +12188,33 @@ msgstr "Pista:"
msgid "Choose Top Region"
msgstr "Elegir región Superior"
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "minutos"
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "msecs"
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "segundos"
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] "%1 segmento silenciado"
msgstr[1] "%1 segmentos silenciados"
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr "el más corto = %1 %2"
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -10189,55 +12262,63 @@ msgstr "Kullback-Liebler"
msgid "Modified Kullback-Liebler"
msgstr "Kullback-Liebler modificado"
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "Flujo espectral"
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "Separar región"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr "Ajustar regiones"
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "Conformar regiones"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "Rhythm Ferret"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Analizar"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "Función de detección"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
msgstr ""
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Umbral"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "Umbral de pico"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "Umbral de silencio"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "Sensibilidad"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Operación"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "separar regiones (rhythm ferret)"
@@ -10259,21 +12340,17 @@ msgstr "Activar grabación"
#: route_group_dialog.cc:52
msgid "Active state"
-msgstr "EStado activo"
-
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Color"
+msgstr "Estado activo"
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr "RouteGroupDialog"
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>Compartir</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
@@ -10293,329 +12370,318 @@ msgstr "Salidas"
msgid "Plugins, Inserts & Sends"
msgstr "Plugins, inserciones y envÃos"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "route display list item for renamed route not found!"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "Retardo de reproducción: %<PRId64> muestras"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "NINGUNA PISTA"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Añadir pista o bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "No hay pista o bus seleccionado"
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr "Grabar (Clic derecho para step edit)"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Grabar"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "Grupo de ruteado"
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr "Controladores y automatización MIDI"
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "Mostrar toda automatización"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "Mostrar automatización existente"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "Ocultar toda automatización"
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
# Problema: Atenuador no entra. Esto tiene que entrar en la automatización de la pista, en el Editor. Fader se entiende muy bien y entra mejor.
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Fader"
# Aquà estaba panorámica, pero pan se entiende perfectamente y es mucho más corto
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Pan"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "Superpuestas"
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "Apiladas"
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Capas"
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr "Automática (basada en conexiones de E/S)"
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr "(Actualmente: Material existente)"
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr "(Actualmente: Tiempo de captura)"
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr "Alinear con material existente"
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr "Alinear con tiempo de captura"
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "Alineación"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr "Modo normal"
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr "Modo cinta"
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr "Modo sin capas"
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr "Modo de grabación"
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Lista de Reproducción"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "Renombrar lista de reproducción"
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "Nuevo nombre para lista de reproducción"
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "Nueva copia de lista de reproducción"
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "Nombre para nueva lista de reproducción:"
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "Nueva lista de reproducción"
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "No puedes crear una pista con ese nombre pues está reservado para %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "Nueva copia..."
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "Nueva toma"
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "Copiar toma"
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Borrar actual"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr "Selecciona de todos...."
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr ""
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "programming error: "
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr "Underlays"
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "Eliminar \"%1\""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr "programming error: underlay reference pointer pairs are inconsistent!"
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr "Escucha Post-fader (AFL) "
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr "Escucha pre-fader (PFL)"
-#: route_ui.cc:140
+#: route_ui.cc:169
msgid "Mute this track"
msgstr "Enmudecer esta pista"
-#: route_ui.cc:144
+#: route_ui.cc:173
msgid "Mute other (non-soloed) tracks"
msgstr "Enmudecer resto de pistas (que no estén en solo)"
-#: route_ui.cc:150
+#: route_ui.cc:179
msgid "Enable recording on this track"
msgstr "Activar la grabación en esta pista"
-#: route_ui.cc:158
+#: route_ui.cc:187
msgid "make mixer strips show sends to this bus"
msgstr "hacer que los canales del mezclador muestren envÃos a este bus"
-#: route_ui.cc:163
+#: route_ui.cc:192
msgid "Monitor input"
msgstr "Monitorizar entrada"
-#: route_ui.cc:169
+#: route_ui.cc:198
msgid "Monitor playback"
msgstr "Monitorizar reproducción"
-#: route_ui.cc:676
+#: route_ui.cc:710
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:875
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:892
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:948
+#: route_ui.cc:991
msgid "Assign all tracks (prefader)"
msgstr "Asignar todas las pistas (prefader)"
-#: route_ui.cc:952
+#: route_ui.cc:995
msgid "Assign all tracks and buses (prefader)"
msgstr "Asignar todas las pistas y buses (prefader)"
-#: route_ui.cc:956
+#: route_ui.cc:999
msgid "Assign all tracks (postfader)"
msgstr "Asignar todas las pistas (postfader)"
-#: route_ui.cc:960
+#: route_ui.cc:1003
msgid "Assign all tracks and buses (postfader)"
msgstr "Asignar todas las pistas y buses (postfader)"
-#: route_ui.cc:964
+#: route_ui.cc:1007
msgid "Assign selected tracks (prefader)"
msgstr "Assignar pistas seleccionadas (prefader)"
-#: route_ui.cc:968
+#: route_ui.cc:1011
msgid "Assign selected tracks and buses (prefader)"
msgstr "Assignar pistas y buses seleccionados (prefader)"
-#: route_ui.cc:971
+#: route_ui.cc:1014
msgid "Assign selected tracks (postfader)"
msgstr "Assignar pistas seleccionadas (postfader)"
-#: route_ui.cc:975
+#: route_ui.cc:1018
msgid "Assign selected tracks and buses (postfader)"
msgstr "Assignar pistas y buses seleccionados (postfader)"
-#: route_ui.cc:978
+#: route_ui.cc:1021
msgid "Copy track/bus gains to sends"
msgstr "Copiar ganancias de pista/bus a envÃos"
-#: route_ui.cc:979
+#: route_ui.cc:1022
msgid "Set sends gain to -inf"
msgstr "Establecer ganancia de envÃos a -inf"
-#: route_ui.cc:980
+#: route_ui.cc:1023
msgid "Set sends gain to 0dB"
msgstr "Establecer ganancia de envÃos a 0dB"
-#: route_ui.cc:1300
+#: route_ui.cc:1361
msgid "Solo Isolate"
msgstr "Aislar solo"
-#: route_ui.cc:1307
+#: route_ui.cc:1368
msgid "Solo Safe"
msgstr "Solo seguro"
-#: route_ui.cc:1329
+#: route_ui.cc:1390
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1335
+#: route_ui.cc:1396
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1341
+#: route_ui.cc:1402
msgid "Control Outs"
msgstr "Salidas de control"
-#: route_ui.cc:1347
+#: route_ui.cc:1408
msgid "Main Outs"
msgstr "Salidas principales"
-#: route_ui.cc:1479
+#: route_ui.cc:1575
msgid "Color Selection"
msgstr "Selección de color"
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"¿De verdad deseas eliminar la pista \"%1\" ?\n"
-"\n"
-"Puedes perder también la lista de reproducción usada por esta pista.\n"
-"\n"
-"(Esta acción no se puede deshacer y sobrescribirá el archivo de sesión)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"¿De verdad deseas eliminar el bus \"%1\" ?\n"
-"(Esta acción no se puede deshacer y el archivo de sesión se reescribirá)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Eliminar pista"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Eliminar bus"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1617
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -10624,88 +12690,77 @@ msgstr ""
"buses.\n"
"¿Quieres usar este nombre?"
-#: route_ui.cc:1608
+#: route_ui.cc:1621
msgid "Use the new name"
msgstr "Usar el nuevo nombre"
-#: route_ui.cc:1609
+#: route_ui.cc:1622
msgid "Re-edit the name"
msgstr ""
-#: route_ui.cc:1622
+#: route_ui.cc:1635
msgid "Rename Track"
msgstr "Renombrar pista"
-#: route_ui.cc:1624
+#: route_ui.cc:1637
msgid "Rename Bus"
msgstr "Renombrar bus"
-#: route_ui.cc:1692
+#: route_ui.cc:1697
msgid ": comment editor"
msgstr ": editor de notas"
-#: route_ui.cc:1858
+#: route_ui.cc:1852
msgid " latency"
msgstr "latencia"
-#: route_ui.cc:1871
+#: route_ui.cc:1892
msgid "Cannot create route template directory %1"
msgstr "Cannot create route template directory %1"
-#: route_ui.cc:1877
+#: route_ui.cc:1898
msgid "Save As Template"
msgstr "Guardar como plantilla"
-#: route_ui.cc:1878
+#: route_ui.cc:1899
msgid "Template name:"
msgstr "Nombre de plantilla :"
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID de control remoto"
-
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "ID de control remoto:"
-
-#: route_ui.cc:1983
+#: route_ui.cc:2023
msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
msgstr ""
+"Clic izquierdo para invertir polaridad de canal %1 de esta pista. Clic "
+"derecho para mostrar menú."
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "el bus master"
+#: route_ui.cc:2025
+msgid "Click to show a menu of channels to invert polarity"
+msgstr "Pulsa para mostrar un menú de canales para invertir su polaridad"
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "el bus de monitorización"
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr "Cambiar a versión recién salvada"
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
-msgstr ""
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr "Copiar medios a nueva sesión"
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
-msgstr ""
-"Clic izquierdo para invertir (inversión de fase) canal %1 de esta pista. "
-"Clic derecho para mostrar menú."
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr "Copiar medios externos a nueva sesión"
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr ""
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr "La sesión recién salvada deberÃa estar vacÃa"
+
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr "Guardar como nombre de sesión"
+
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr "Carpeta padre"
#: search_path_option.cc:35
msgid "Select folder to search for media"
@@ -10713,132 +12768,164 @@ msgstr "Seleccionar carpeta para buscar archivos"
#: search_path_option.cc:44
msgid "Click to add a new location"
-msgstr "Clicar para añadir nueva localización"
+msgstr "Pulsa para añadir nueva localización"
#: search_path_option.cc:51
msgid "the session folder"
msgstr "el archivo de sesión"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>Tipo:</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr "<b>Autor:</b>"
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr "<b>Descripción:</b>"
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>Nombre:</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>Parámetros de instancia</b>"
+
#: send_ui.cc:134
msgid "Send "
msgstr "Enviar "
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr "Configuración de sesión"
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr "Opciones avanzadas ..."
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sesiones recientes"
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr "Tasa de muestreo"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr "Resolución de archivo"
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr "Ãltimo cambio"
+
+#: session_dialog.cc:338
msgid "New Session"
msgstr "Nueva sesión"
-#: session_dialog.cc:301
+#: session_dialog.cc:379
msgid "Check the website for more..."
msgstr "Busca más en el portal de internet..."
-#: session_dialog.cc:304
+#: session_dialog.cc:382
msgid "Click to open the program website in your web browser"
-msgstr "Clica para abrir el portal del programa en el navegador de internet"
-
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "Tasa de muestreo"
+msgstr "Pulsa para abrir el portal del programa en el navegador de internet"
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "Formato de disco"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "Seleccionar archivo de sesión"
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr "Otras sesiones"
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr "Modo seguro: Deshabilita todos los plugins"
+
+#: session_dialog.cc:454
msgid "Open"
msgstr "Abrir"
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Nombre de sesión:"
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "Crear carpeta de sesión en :"
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "Seleccionar carpeta para sesión"
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "Usar esta plantilla"
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr "sin plantilla"
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr "32-bit float"
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr "24-bit"
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr "16-bit"
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "canales"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>Buses</b>"
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>Entradas</b>"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>Salidas</b>"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "Crear bus master"
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "Conectar a entradas fÃsicas automáticamente"
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "Usar sólo"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "Conectar salidas automáticamente"
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "...al bus master"
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "...a salidas fÃsicas"
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importar desde sesión"
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr "Elementos"
@@ -10859,191 +12946,191 @@ msgstr "Importar desde sesión"
msgid "This will select all elements of this type!"
msgstr ""
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr ""
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "Valores (valor actual arriba)"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "Usuario"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr ""
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr ""
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr "Organización"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr "PaÃs"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "TÃtulo"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "Número de pista"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "SubtÃtulo"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr ""
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "Artista"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "Género"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "Comentario"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "Copyright"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "Ãlbum"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Año"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "Artista del álbum"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "Número total de pistas"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "SubtÃtulo del disco"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "Número de disco"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "Número total de discos"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "Recopilatorio"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr "ISRC"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "Personas"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "Letrista"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "Compositor"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "Director"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "Mezclador"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "Arreglista"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "Ingeniero"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "Productor"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "Mezclador DJ"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "Mezclador"
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr "Escuela"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr "Profesor"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr "Curso"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "Editar metadatos de sesión"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "Importar metadatos de sesión"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr "Elegir sesión para importar metadatos"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "¡Este archivo de sesión no se pudo leer!"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -11051,7 +13138,7 @@ msgstr ""
"¡El archivo de sesión no contenÃa metadatos!\n"
"¿Quizás fuera un formato de sesión antiguo?"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr "Importar todos desde:"
@@ -11200,165 +13287,186 @@ msgid "Destructive crossfade length"
msgstr "Duración del fundido cruzado destructivo"
#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
msgid "Region fades active"
msgstr "Fundidos de región activos"
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr "Fundidos de región visibles"
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr "Archivos"
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
-msgstr "Formato archivo de audio"
+msgstr "Formato de archivo de audio"
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr "Formato de muestra"
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr "Coma flotante 32-bit"
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr "Entero 24-bit"
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr "Entero 16-bit"
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr "Tipo de archivo"
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr "Broadcast WAVE (4GB size limit)"
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr "Broadcast RF64"
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr "WAVE-64"
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr "Archivos|Localizaciones"
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr "Localizaciones de archivos"
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr "Buscar archivos de audio en:"
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr "Buscar archivos MIDI en:"
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr "Nombres de archivo"
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr "Nombrado de archivos"
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr "Prefijo número de pista"
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr "Añade el número de pista actual al nombre de archivo guardado."
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr "Prefijo número de toma"
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr "Añade el número de toma actual al nombre de archivo guardado."
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr "Número de toma"
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
"La monitorización de entrada de pista sigue automáticamente el estado del "
"transporte (\"auto-entrada\")"
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr "Usar sección de monitorización en esta sesión"
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr "Mostrar pistas MIDI"
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr "Mostrar buses"
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr "Incluir bus master"
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr "Las copias de regiones MIDI son independientes"
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
@@ -11366,47 +13474,47 @@ msgstr ""
"PolÃtica de manejo de notas superpuestas\n"
"en el mismo canal MIDI"
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr "no permitirlas nunca"
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr "no hacer nada especial"
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr "reemplazar cualquier nota superpuesta existente"
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr "acortar la nota existente superpuesta"
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr "acortar la nueva nota superpuesta"
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr "reemplazar ambas notas superpuestas con una única nota"
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr "Adherir a compases y pulsos"
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr "Adherir marcadores nuevos a compases y pulsos"
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr "Adherir regiones nuevas a compases y pulsos"
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr "Predeterminados"
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr "Usa esta configuración como la predeterminada"
@@ -11442,26 +13550,14 @@ msgstr "<b>Información del archivo de sonido</b>"
msgid "Timestamp:"
msgstr "Timestamp:"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Formato:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "Etiquetas:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "No se pudo leer el archivo %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr ""
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "No se pudo acceder al archivo de audio: "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr "SoundFileBox: Could not tokenize string: "
@@ -11470,181 +13566,177 @@ msgstr "SoundFileBox: Could not tokenize string: "
msgid "Search"
msgstr "Buscar"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr "Archivos de audio y MIDI"
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr "Archivos de audio"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr "Archivos MIDI"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
msgid "All files"
msgstr "Todos los archivos"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
msgid "Browse Files"
msgstr "Explorar archivos"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "Rutas"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr "Buscar etiquetas"
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "Corto:"
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "El más largo"
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "El más corto"
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "El más nuevo"
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "El más antiguo"
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "El más descargado"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "El menos descargado"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr "El puntuado más alto"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr "El puntuado más bajo"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
msgid "Filename"
msgstr "Nombre de archivo"
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "Duración"
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr "Tamaño"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr "Frec. de muestreo"
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr "Licencia"
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "Buscar en Freesound"
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr "Pulsar para importar los archivos seleccionados"
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "SoundFileBrowser: Could not tokenize string: "
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr "B"
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr "kB"
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr "MB"
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr "GB"
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "1 pista por archivo"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "1 pista por canal"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr "secuenciar archivos"
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "todos los archivos en una pista"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "fusionar archivos"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "una región por archivo"
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "una región por canal"
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "todos los archivos en una región"
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -11652,109 +13744,109 @@ msgstr ""
"Uno o más de los archivos seleccionados\n"
"no puede ser usado por %1"
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr ""
"Copiar archivos\n"
"a la sesión"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr "timestamp de archivo"
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "punto de edición"
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "cursor"
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "inicio de sesión"
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
-msgstr "<b>Añadir archivos como...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr "<b>Añadir archivos...</b>"
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr "<b>Insertar en</b>"
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr "<b>Mapeado</b>"
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr "<b>Calidad de conversión</b>"
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr "<b>Instrumento</b>"
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "La mejor"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "Buena"
# Quick=Veloz
# Fast=Rápida
# if not, you get two "rápida" entries in the combo
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "Veloz"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "RapidÃsima"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr "Control de velocidad de shuttle (click contextual para opciones)"
-#: shuttle_control.cc:174
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
msgid "Percent"
msgstr "Porcentaje"
-#: shuttle_control.cc:182
+#: shuttle_control.cc:210
msgid "Units"
msgstr "Unidades"
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:216 shuttle_control.cc:679
msgid "Sprung"
msgstr "Muelle"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:220 shuttle_control.cc:682
msgid "Wheel"
msgstr "Rueda"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:254
msgid "Maximum speed"
msgstr "Velocidad máxima"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:257
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:641
msgid "Playing"
msgstr "Reproduciendo"
-#: shuttle_control.cc:583
+#: shuttle_control.cc:656
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d semitonos"
-#: shuttle_control.cc:585
+#: shuttle_control.cc:658
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d semitonos"
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Parado"
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11779,7 +13871,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "Cargando %1 ..."
@@ -11795,7 +13887,7 @@ msgstr "Eliminar altavoz"
msgid "Azimuth:"
msgstr "Azimut:"
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
@@ -11803,11 +13895,11 @@ msgstr ""
"Usar un mezclador externo o el mezclador hardware de tu interfaz de audio.\n"
"%1 no tomará parte en la monitorización"
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr "Pedir a %1 que reproduzca el material al tiempo que se graba"
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11825,15 +13917,15 @@ msgstr ""
"Hay unas pocas cosas que hace falta configurar antes de que empieces\n"
"a usar el programa.</span>"
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "Bienvenido a %1"
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Carpeta predeterminada para sesiones de %1"
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11850,11 +13942,11 @@ msgstr ""
"<i>(Puedes poner las nuevas sesiones en cualquier carpeta, esto sólo elige "
"la predeterminada)</i>"
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Carpeta predeterminada para sesiones nuevas"
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11879,15 +13971,15 @@ msgstr ""
"<i>Si no entiendes lo que quiere decir esto, acepta la opción predeterminada."
"</i>"
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "Opciones de monitorización"
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "Usar directamente el bus Master"
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -11895,11 +13987,11 @@ msgstr ""
"Conectar el bus Master directamente a tus salidas de hardware.Preferible "
"para uso simple."
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "Usar un bus de monitorización adicional"
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -11908,7 +14000,7 @@ msgstr ""
"hardware \n"
"para mayor control de la monitorización, sin afectar a la mezcla."
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11922,46 +14014,42 @@ msgstr ""
"\n"
"<i>En caso de duda, acepta la opción predeterminada.</i>"
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr "Sección de monitorización"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">pulso"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">compás"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ">EP"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr "sostenido"
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr "silencio"
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr "atrás"
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr "Establecer duración de nota a redonda"
@@ -12070,11 +14158,11 @@ msgstr "Insertar mensaje de cambio de banco"
msgid "Insert a program change message"
msgstr "Insertar mensaje de cambio de programa"
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr "Atrasar posición de inserción a duración de nota"
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr "Mover posición de inserción a punto de edición"
@@ -12086,240 +14174,245 @@ msgstr "1/Nota"
msgid "Octave"
msgstr "Octava"
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr "Insertar nota A"
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr "Insertar nota A sostenido"
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr "Insertar nota B"
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr "Insertar nota C"
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr "Insertar nota C sostenido"
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr "Insertar nota D"
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr "Insertar nota D sostenido"
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr "Insertar nota E"
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr "Insertar nota F"
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr "Insertar nota F sostenido"
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr "Insertar nota G"
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr "Insertar nota G sostenido"
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr "Insertar un silencio con duración de nota"
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr "Insertar un silencio con duración de ajuste"
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr "Mover a siguiente octava"
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr "Mover a duración de nota siguiente"
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr "Mover a duración de nota anterior"
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "Aumentar duración de nota"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "Disminuir duración de nota"
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr "Mover a intesidad de nota siguiente"
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr "Mover a intesidad de nota anterior"
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr "Aumentar intensidad de nota"
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr "Disminuir intensidad de nota"
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "Cambiar a la primera octava"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "Cambiar a la segunda octava"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "Cambiar a la tercera octava"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "Cambiar a la cuarta octava"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "Cambiar a la quinta octava"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "Cambiar a la sexta octava"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "Cambiar a la séptima octava"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "Cambiar a la octava octava"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "Cambiar a la novena octava"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "Cambiar a la décima octava"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "Cambiar a la décimoprimera octava"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Notas triples"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Entrada de acordes"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Mantener notas seleccionadas a duración de nota"
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr "Establecer duración de nota a entera"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr "Establecer duración de nota a 1/2"
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr "Establecer duración de nota a 1/3"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr "Establecer duración de nota a 1/4"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr "Establecer duración de nota a 1/8"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr "Establecer duración de nota a 1/16"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr "Establecer duración de nota a 1/32"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr "Establecer duración de nota a 1/64"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr "Establecer intensidad de nota a pianississimo"
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr "Establecer intensidad de nota a pianissimo"
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr "Establecer intensidad de nota a piano"
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr "Establecer intensidad de nota a mezzo-piano"
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr "Establecer intensidad de nota a mezzo-forte"
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr "Establecer intensidad de nota a forte"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr "Establecer intensidad de nota a fortississimo"
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Notas triples"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr "Sin notas con puntillo"
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr "Notas con puntillo"
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr "Notas con doble puntillo"
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr "Notas con triple puntillo"
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Entrada de acordes"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Mantener notas seleccionadas a duración de nota"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+# Aquà estaba panorámica, pero pan se entiende perfectamente y es mucho más corto
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr "Paner|M"
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr "Paner estéreo"
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr "Anchura"
@@ -12327,178 +14420,191 @@ msgstr "Anchura"
msgid "Strip Silence"
msgstr "Quitar silencio"
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Umbral"
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr "Duración mÃnima"
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr "Duración de fundido"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr "Analizando"
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "compás:"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "pulso:"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr "Duración de nota"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Editar tempo"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "redonda"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "blanca"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "tercera"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "negra"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "corchea"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "semicorchea"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "fusa"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "semifusa"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "semi-semifusa"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "con rampa"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "constante"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "Música"
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Pulsos por minuto:"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr "El tempo comienza en"
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "Estilo de bloqueo:"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "Tipo de tempo:"
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
-msgstr "duración de nota incomprensible (%1)"
+msgstr "duración de nota no aplicable (%1)"
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Editar métrica"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr "tipo de tempo no aplicable (%1)"
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr "Estilo de bloqueo no aplicable (%1)"
# hace referencia al tipo de nota (corchea, semicorchea, etc...)
# (aparece en la ventana de configuración de compás: pulsos por compás, etc...)
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "Valor de nota:"
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "Estilo de bloqueo:"
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Pulsos por compás:"
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr "Métrica comienza en compás:"
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
-msgstr "tipo de métrica incomprensible (%1)"
-
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Tema oscuro"
+msgstr "tipo de métrica no aplicable (%1)"
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Tema claro"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr "Estilo de bloqueo de métrica no aplicable (%1)"
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Restablecer lo predeterminado"
-
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr "Mostrar botones \"planos\""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Colorear regiones con el color de su pista"
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr "Mostrar clipping en la onda"
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr "Gradiente de color de las ondas"
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr "Gradiente de color de la lÃnea de tiempo"
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objeto"
-
-#: theme_manager.cc:163
-msgid "Items"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr "Transparencia"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12506,92 +14612,95 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "Paleta de color"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr "Nombre de pista/bus (doble clic para editar)"
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] "La nueva duración de %1 cuadro está fuera de lÃmites para %2"
msgstr[1] "La nueva duración de %1 cuadros está fuera de lÃmites para %2"
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Rápido pero feo"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Omitir anti-aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Contenidos:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr "Contenidos"
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr "Minimizar distorsión temporal"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr "Conservar formantes"
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr "TimeFXDialog"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr "Cambiar tono de audio"
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr "Estirar tiempo de audio"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "Octavas:"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "Semitonos:"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr "Cents:"
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr "Tiempo|Shift"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr "TimeFXButton"
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "Estirar/Contraer"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr "<b>Progreso</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Iniciar grabación al iniciar pinchazo"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Detener grabación al despinchar"
@@ -12659,177 +14768,229 @@ msgstr "Transportar MIDI"
msgid "Transpose"
msgstr "Transportar"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:422
msgid "Loading default ui configuration file %1"
msgstr ""
"Cargando el archivo de configuración de interfaz de usuario predeterminado %1"
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:425
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
"no se pudo leer el archivo de configuración de interfaz de usuario "
"predeterminado \"%1\"."
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:430
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
"el archivo de configuración de interfaz de usuario predeterminado \"%1\" no "
"pudo cargar."
-#: ui_config.cc:177
+#: ui_config.cc:248
msgid "Could not find default UI configuration file %1"
msgstr ""
"No se encontró el archivo de configuración de interfaz de usuario "
"predeterminado %1"
-#: ui_config.cc:219
+#: ui_config.cc:289
msgid "Loading color file %1"
msgstr "Cargando el archivo de color %1"
-#: ui_config.cc:222
+#: ui_config.cc:292
msgid "cannot read color file \"%1\""
msgstr "no se pudo leer el archivo de color \"%1\"."
-#: ui_config.cc:227
+#: ui_config.cc:297
msgid "color file \"%1\" not loaded successfully."
msgstr "el archivo de color \"%1\" no se pudo cargar."
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "No se encontró el archivo de color %1"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr ""
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:403 ui_config.cc:486
msgid "Color file %1 not saved"
msgstr "No se guardó el archivo de color %1."
-#: ui_config.cc:317
+#: ui_config.cc:439
msgid "Loading user ui configuration file %1"
msgstr "Cargando el archivo de configuración de interfaz de usuario %1"
-#: ui_config.cc:320
+#: ui_config.cc:442
msgid "cannot read ui configuration file \"%1\""
msgstr ""
"no se pudo leer el archivo de configuración de interfaz de usuario \"%1\"."
-#: ui_config.cc:325
+#: ui_config.cc:447
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
"el archivo de configuración de interfaz de usuario \"%1\" no se pudo cargar."
-#: ui_config.cc:333
+#: ui_config.cc:455
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
"no se puedo encontrar ningún archivo de configuración de interfaz de usuario "
"\"%1\""
-#: ui_config.cc:351
+#: ui_config.cc:476
msgid "Config file %1 not saved"
msgstr "No se guardó el archivo de configuración %1."
-#: ui_config.cc:592
+#: ui_config.cc:720
msgid "Color %1 not found"
msgstr "Color %1 no encontrado"
-#: ui_config.cc:662
+#: ui_config.cc:790
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
"No se pudo encontrar el archivo de estilo de interfaz de usuario %1 en la "
"ruta de búsqueda %2. %3 tendrá un aspecto extraño"
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "Encabezado XPM erróneo %1."
-#: utils.cc:577
+#: utils.cc:365
msgid "cannot find XPM file for %1"
msgstr "No se pudo encontrar el archivo XPM para %1."
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:418 utils.cc:448 utils.cc:468
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:469
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:476
msgid "cannot find icon image for %1 using %2"
msgstr "No se pudo encontrar la imagen del icono para %1 usando %2"
-#: utils.cc:666 utils.cc:682
+#: utils.cc:493 utils.cc:509
msgid "Caught exception while loading icon named %1"
msgstr "Caught exception while loading icon named %1"
-#: add_video_dialog.cc:54
+#: utils.cc:759
+msgid "Overwrite"
+msgstr "Reescribir"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "Esclavos solo"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "Ocultar este canal VCA"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "Pulsa para mostrar sólo los esclavos"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "Pulsa para mostrar mezclador normal"
+
+#: add_video_dialog.cc:55
msgid "Set Video Track"
msgstr ""
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
msgid "Open Video Monitor Window"
msgstr ""
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
msgid "Adjust Session Framerate to Match Video Framerate"
msgstr "Ajustar el framerate de la sesión para igualarlo al del video"
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
msgid "Reload docroot"
msgstr "Recargar docroot"
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
msgid "Video files"
msgstr "Archivos de video"
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
msgid "<b>Video Information</b>"
msgstr "<b>Información de video</b>"
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
msgid "Start:"
msgstr "Inicio:"
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
msgid "Frame rate:"
msgstr "Frame rate:"
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
msgid "Aspect Ratio:"
msgstr "Relación de aspecto"
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
msgid "VideoServerIndex"
msgstr ""
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "Mostrar sólo esclavos"
+
+#: video_timeline.cc:473
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:511
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:519
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:592
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:729
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12839,25 +15000,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:744
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:776
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12879,7 +15040,7 @@ msgstr ""
msgid "Output File:"
msgstr "Archivo de salida:"
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr "Cancelar"
@@ -12888,12 +15049,16 @@ msgid "Height = "
msgstr "Altura = "
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
-msgstr ""
+msgstr "Modo depuración: Imprime los comandos y salidas de ffmpeg a stdout."
#: transcode_video_dialog.cc:107
msgid "<b>File Information</b>"
@@ -12901,12 +15066,11 @@ msgstr "<b>Información de archivo</b>"
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
-"No se han encontrado ejecutables de ffprobe o ffmpeg. No es posible importar "
-"video sin instalarlos. Ver la ventana de log para más información"
+"ffmpeg no encontrado. Imposible importar video. Ver la ventana de mensajes "
+"para más información."
#: transcode_video_dialog.cc:120
msgid ""
@@ -12914,83 +15078,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr "FPS:"
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr "Duración"
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr "Codec:"
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr "GeometrÃa:"
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr "??"
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr "<b>Importar configuración</b>"
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr "No importar imagen de video (sólo audio)"
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr "No importar video"
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr "Escalar video: Anchura = "
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr "Anchura original"
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr "Extraer audio"
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr "No presenta pista de audio"
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr "No extraer audio"
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr "Extrayendo audio..."
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr "Falló la extracción de audio."
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr "Transcoding Video.."
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr "Transcoding Failed."
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -13011,7 +15175,7 @@ msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
"No vuelvas a mostrar este diálogo (resetear en Edición -> Preferencias)"
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -13021,239 +15185,232 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:63
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:64
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:67
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:74
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr "Existe un archivo con el mismo nombre. ¿Quieres sobreescribirlo?"
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:84 utils_videotl.cc:100
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr "Exportar archivo de video"
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr "Video:"
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr "Escalar video (Ancho x Alto)"
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr "Retener aspecto"
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr "Establecer relación de aspecto:"
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr "Normalizar audio"
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr "Encoding de 2 pasadas"
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr "Optimización de códecs:"
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr "Incluir metadatos de sesión"
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
+"ffmpeg no encontrado. Imposible exportar video. Ver la ventana de mensajes "
+"para más información."
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr "<b>Entrada de video:</b>"
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr "Audio:"
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr "Bus master"
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr "<b>Configuraciones:</b>"
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr "Rango:"
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Preset:"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr "Códec de video:"
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr "Video KBit/s:"
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr "Códec de audio:"
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr "Audio KBit/s:"
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr "Predeterminado"
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr "desde el inicio hasta el final del video"
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr "Rango seleccionado"
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr "Normalizando audio"
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr "Exportando audio"
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr "Exportando audio..."
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr "Encoding video..."
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr ""
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr ""
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr ""
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr "Guardar archivo de video exportado"
@@ -13273,190 +15430,20 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
-#~ msgid "Editor Selection"
-#~ msgstr "Selección Editor"
-
-#~ msgid "Mixer Selection"
-#~ msgstr "Selección Mezclador"
-
-#~ msgid "Insert at:"
-#~ msgstr "Insertar en:"
-
-#~ msgid "Errors"
-#~ msgstr "Errores"
-
#~ msgid ""
-#~ "Could not connect to the Video Server. Start it or configure its access "
-#~ "URL in Edit -> Preferences."
+#~ "%1%2\n"
+#~ "(built from revision %3)"
#~ msgstr ""
-#~ "No se ha podido conectar al servidor de video. Arráncalo o configura su "
-#~ "URL de acceso en el menú: Editar -> Preferencias"
-
-#~ msgid "Select Note Press"
-#~ msgstr "Seleccionar presión"
-
-#~ msgid "rubberband selection"
-#~ msgstr "selección elástica"
-
-#~ msgid "Set Selected Track"
-#~ msgstr "Poner la pista seleccionada"
-
-#~ msgid "set selected regions"
-#~ msgstr "establecer regiones seleccionadas"
-
-#~ msgid "select all"
-#~ msgstr "seleccionar todo"
-
-#~ msgid "select all within"
-#~ msgstr "seleccionar todo dentro"
-
-#~ msgid "set selection from range"
-#~ msgstr "nueva selección desde rango"
-
-#~ msgid "select all from range"
-#~ msgstr "seleccionar todo desde rango"
-
-#~ msgid "select all from punch"
-#~ msgstr "seleccionar todo desde pinchazo"
-
-#~ msgid "select all from loop"
-#~ msgstr "seleccionar todo desde bucle"
-
-#~ msgid "select all after cursor"
-#~ msgstr "seleccionar todo desde el cursor"
-
-#~ msgid "select all before cursor"
-#~ msgstr "seleccionar todo hasta el cursor"
-
-#~ msgid "select all after edit"
-#~ msgstr "seleccionar todo desde el punto de edición"
-
-#~ msgid "select all before edit"
-#~ msgstr "seleccionar todo hasta el punto de edición"
-
-#~ msgid "Select Range Between"
-#~ msgstr "Seleccionar rango entre"
-
-#~ msgid "MIDI System"
-#~ msgstr "Sistema MIDI"
-
-#~ msgid "%u samples"
-#~ msgstr "%u muestras"
-
-#~ msgid "Mouse Selection Change"
-#~ msgstr "Cambio de selección de ratón"
-
-#~ msgid "Select Adjacent Note"
-#~ msgstr "Seleccionar nota adyacente"
-
-#~ msgid "Set Note Selection"
-#~ msgstr "Establecer selección de nota"
-
-#~ msgid "Add Note Selection"
-#~ msgstr "Añadir selección de nota"
-
-#~ msgid "Extend Note Selection"
-#~ msgstr "Extender selección de nota"
-
-#~ msgid "Toggle Note Selection"
-#~ msgstr "Conmutar selección de nota"
-
-#~ msgid "This is a BETA RELEASE"
-#~ msgstr "Esta es una edición BETA"
-
-#~ msgid "Track mode:"
-#~ msgstr "Modo de pista:"
-
-#~ msgid "Theme Manager"
-#~ msgstr "Gestor de temas"
-
-#~ msgid "Play Selected Range"
-#~ msgstr "Reproducir rango seleccionado"
-
-#~ msgid "Convert to Region In-Place"
-#~ msgstr "Convertir a región in situ"
-
-#~ msgid "Set Loop from Range"
-#~ msgstr "Crear bucle en rango"
-
-#~ msgid "Set Punch from Range"
-#~ msgstr "Crear pinchazo en rango"
-
-#~ msgid "Draw/Edit MIDI Notes"
-#~ msgstr "Dibujar/Editar notas MIDI"
-
-#~ msgid "Draw Region Gain"
-#~ msgstr "Dibujar ganancia de región"
-
-#~ msgid "Stretch/Shrink Regions and MIDI Notes"
-#~ msgstr "Estirar/Encoger regiones y notas MIDI"
-
-#~ msgid "Listen to Specific Regions"
-#~ msgstr "Escuchar regiones especÃficas"
-
-#~ msgid "Note Level Editing"
-#~ msgstr "Edición de notas"
-
-#~ msgid "Fit Selected tracks"
-#~ msgstr "Poner las pistas seleccionadas"
-
-#~ msgid "Zoom to Region"
-#~ msgstr "Zoom a región"
-
-#~ msgid "Zoom to Region (Width and Height)"
-#~ msgstr "Zoom a región (ancho y alto)"
-
-#~ msgid "Set Loop from Edit Range"
-#~ msgstr "Definir bucle según rango de edición"
-
-#~ msgid "Set Punch from Edit Range"
-#~ msgstr "Definir pinchazo según rango de edición"
-
-#~ msgid "Move Earlier to Transient"
-#~ msgstr "Mover adelante a transitorio"
-
-#~ msgid "Gain Tool"
-#~ msgstr "Herramienta de Ganancia"
-
-#~ msgid "Zoom Tool"
-#~ msgstr "Herramienta de Zoom"
-
-#~ msgid "Edit MIDI"
-#~ msgstr "Editar MIDI"
-
-#~ msgid "Show Measures"
-#~ msgstr "Mostrar compases"
-
-#~ msgid "Split"
-#~ msgstr "Separar"
-
-#~ msgid " range"
-#~ msgstr "rango"
-
-#~ msgid "set loop range from edit range"
-#~ msgstr "crear rango de bucle desde rango de edición"
-
-#~ msgid "set punch range from edit range"
-#~ msgstr "crear rango de pinchazo desde rango de edición"
-
-#~ msgid "External timecode is sync locked"
-#~ msgstr "Timecode externo bloqueado en sincronÃa"
-
-#~ msgid "missing RGBA style for \"%1\""
-#~ msgstr "No se encuentra el estilo RGBA para \"%1\"."
-
-#~ msgid "<b>Output:</b>"
-#~ msgstr "<b>Salida:</b>"
-
-#~ msgid "badly formatted UI definition file: %1"
-#~ msgstr "archivo de definición de interfaz de usuario mal formateado: %1"
+#~ "%1%2\n"
+#~ "(compilado a partir de revisión %3)"
-#~ msgid "%1 will not work without a valid ardour.menus file"
-#~ msgstr "%1 no funcionará sin un archivo ardour.menus válido"
diff --git a/gtk2_ardour/po/fr.mo b/gtk2_ardour/po/fr.mo
new file mode 100644
index 0000000..5594576
Binary files /dev/null and b/gtk2_ardour/po/fr.mo differ
diff --git a/gtk2_ardour/po/fr.po b/gtk2_ardour/po/fr.po
index 9e4dc7a..611adff 100644
--- a/gtk2_ardour/po/fr.po
+++ b/gtk2_ardour/po/fr.po
@@ -8,274 +8,308 @@
# Romain Arnaud <roming22 at gmail.com>, 2011, 2013.
# Fred Rech <f.rech at yahoo.fr>, 2014.
# Raphaël Doursenaud <rdoursenaud at free.fr>, 2015.
+# Edouard <edwsaintesprit at hotmail.com>, 2016.
+# Rivaud Julien <frnchfrgg at free.fr>, 2016.
msgid ""
msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2015-03-28 20:56+0100\n"
-"Last-Translator: Raphaël Doursenaud <rdoursenaud at free.fr>\n"
+"POT-Creation-Date: 2016-07-29 20:52+0200\n"
+"PO-Revision-Date: 2016-07-14 02:04+0200\n"
+"Last-Translator: Rivaud Julien <frnchfrgg at free.fr>, 2016\n"
"Language-Team: \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 1.7.4\n"
+"X-Generator: Poedit 1.8.8\n"
"X-Poedit-SourceCharset: UTF-8\n"
-"X-Poedit-Basepath: ../\n"
+"X-Poedit-Basepath: ..\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr "Hans Baier"
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr "Sakari Bergen"
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr "Christian Borss"
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr "Chris Cannam"
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
-msgstr ""
+msgstr "Jeremy Carter"
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr "André Colomb"
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
-msgstr ""
+msgstr "John Emmas"
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr "Dave Flick"
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr "Robin Gareus"
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr "Nil Geisweiller"
+
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr "Chris Goddard"
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr "J. Abelardo Gutierrez"
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr "David Halter"
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr "Melvin Ray Herr"
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr "Carl Hetherington"
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr "Rob Holland"
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr "Robert Jordens"
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr "Stefan Kersten"
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr "Armand Klenk"
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr "Julien de Kozak"
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr "Matt Krai"
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
-msgstr ""
+msgstr "Georg Krause"
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr "Nick Lanham"
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr "Colin Law"
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr "Joshua Leach"
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr "Ben Loftis"
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr "Nick Mainsbridge"
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr "Tim Mayberry"
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr "Doug Mclain"
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
-msgstr ""
+msgstr "Todd Naugle"
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr "André Nusser"
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr "Bent Bisballe Nyeng"
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr "Jack O'Quin"
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr "Nimal Ratnayake"
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
msgid "David Robillard"
msgstr "David Robillard"
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr "Taybin Rutkin"
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr "Andreas Ruge"
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr "Sampo Savolainen"
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr "Rodrigo Severo"
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr "Per Sigmond"
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr "Lincoln Spiteri"
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr "Mike Start"
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr "Mark Stewart"
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr "Roland Stigge"
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr "Petter Sundlöf"
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr "Mike Täht"
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr "Roy Vegard"
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr "Damien Zammit"
+
+#: about.cc:196
msgid "Grygorii Zharun"
-msgstr ""
+msgstr "Grygorii Zharun"
# I thought it's the right way to add my name to the translators list ?
# Oh, by the way, have contacted Romain, the last translator, and he says "no problem you can edit the po files, have done my best, it's your turn now!"
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -290,7 +324,7 @@ msgstr ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
"\tRaphaël Doursenaud <rdoursenaud at free.fr>\n"
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -310,7 +344,7 @@ msgstr ""
"\tRichard Oax <richard at pagliacciempire.de>\n"
"\tRobin Gloster <robin at loc-com.de>\n"
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -320,7 +354,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -328,7 +362,7 @@ msgstr ""
"Portugais :\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -338,7 +372,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -348,7 +382,7 @@ msgstr ""
"\tAlex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -358,7 +392,7 @@ msgstr ""
"\tIgor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -366,7 +400,7 @@ msgstr ""
"Grec :\n"
"\tKlearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -374,7 +408,7 @@ msgstr ""
"Suédois :\n"
"\tPetter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -382,7 +416,7 @@ msgstr ""
"Polonais :\n"
"\tPiotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -390,7 +424,7 @@ msgstr ""
"Tchèque :\n"
"\tPavel Fric <pavelfric at seznam.cz>\n"
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
@@ -398,7 +432,7 @@ msgstr ""
"Norvégien :\n"
"\tEivind ÃdegÃ¥rd\n"
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -406,146 +440,201 @@ msgstr ""
"Chinois :\n"
"\tRui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-#: about.cc:591
-#, fuzzy
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr "Intel 64 bits"
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr "Intel 32 bits"
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr "Power PC 64 bits"
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr "Power PC 32 bits"
+
+#: about.cc:609
+msgid "64-bit"
+msgstr "64 bits"
+
+#: about.cc:611
+msgid "32-bit"
+msgstr "32 bits"
+
+#: about.cc:619
+msgid " - debug"
+msgstr " - debug"
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
-msgstr "Copyright © 1999-2013 Paul Davis\n"
+msgstr "Copyright © 1999-2015 Paul Davis\n"
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
-msgstr "http://ardour.org"
+msgstr "http://ardour.org/"
-#: about.cc:596
-#, fuzzy
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-"%1\n"
-"(compilé de la révision %2)"
+"%1%2\n"
+"(rev %3)\n"
+"%4%5"
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr "Configuration"
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr "Chargement des menus depuis %1"
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr "fichier de définition de menu mal formé : %1"
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr "fichier de définition de menu introuvable : %1"
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr "%1 ne fonctionnera pas sans un fichier de définition de menu valide"
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Ajouter une piste ou un bus"
+#: add_route_dialog.cc:58
+#, fuzzy
+msgid "Add Track/Bus/VCA"
+msgstr "Ajouter un(e) Piste/Bus/VCA"
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "Configuration :"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
-msgstr "Mode d'enregistrement"
+msgstr "Mode d'enregistrement :"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "Instrument :"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "Pistes audio"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "Pistes MIDI"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "Pistes Audio+MIDI"
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Bus"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "Bus Audio"
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
-#, fuzzy
-msgid "First"
-msgstr "bas de la première page"
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "Bus MIDI"
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr ""
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
+msgid "First"
+msgstr "Au début"
+
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "Avant la sélection"
+
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "Après la sélection"
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
-msgstr ""
+msgstr "Ã la fin"
+
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "E/S flexibles"
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "E/S strictes"
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "Ajouter :"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>Options</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "Nom :"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "Groupe :"
-#: add_route_dialog.cc:162
-#, fuzzy
+#: add_route_dialog.cc:161
msgid "Insert:"
-msgstr "Insérer :"
-
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+msgstr "Insérer :"
+
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Ports de sortie :"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"Si le mode « E/S strictes » est actif, les processeurs d'effets ne "
+"modifieront pas le nombre de canaux des pistes. Le nombre de canaux en "
+"sortie correspondra au nombre de canaux en entrée."
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "Audio"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr "Audio+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "Bus"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -559,60 +648,61 @@ msgstr ""
"Si vous n'envisagez pas d'utiliser un tel greffon, utilisez plutôt une piste "
"normale audio ou MIDI."
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Normal"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "Non empilé"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Bande"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Mono"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "Stéréo"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 canaux"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 canaux"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "3 canaux"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 canaux"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 canaux"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "12 canaux"
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr "Personnalisée"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "Nouveau groupeâ¦"
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr "Aucun groupe"
@@ -620,7 +710,7 @@ msgstr "Aucun groupe"
msgid "Ambiguous File"
msgstr "Fichier indeterminé"
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
@@ -628,7 +718,7 @@ msgstr ""
"%1 a trouvé le fichier <i>%2</i> aux emplacements suivants :\n"
"\n"
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
@@ -638,158 +728,240 @@ msgstr ""
"\n"
"Sélectionnez le chemin du fichier à ouvrir."
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr "Fini"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "Source du signal"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Intervalles sélectionnés"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Régions sélectionnées"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Modèle d'affichage"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Graphs composite pour chaque piste"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Graph composite de toutes les pistes"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Afficher la gamme d'intensité fréquentielle"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normaliser"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "Fenêtre d'analyse FFT"
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr "Analyse du spectre"
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Piste"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "Afficher"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Réanalyser les données"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "Le bouton ne peut pas surveiller un élement Controllable inexistant\n"
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: ardour_ui.cc:164
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
+"%1 %2.x a détecté des fichiers de configuration appartenant à %1 %3.x\n"
+"\n"
+"Voulez-vous copier cette configuration pour l'utiliser avec %1 %2.x ?\n"
+"\n"
+"(Cette action nécessite de redémarrer %1)"
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Ãcoute"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Solo"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "Retour"
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Positionnement des haut-parleurs"
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Raccourcis clavier"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Préférences"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr "Ajouter Pistes/Bus"
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "Ã propos"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Repères et intervalles"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "Positions"
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "Pistes et Bus"
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr "Réglages Audio/MIDI"
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
-msgstr ""
+msgstr "Fenêtre d'export vidéo"
+
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "Gestionnaire de scripts"
-#: ardour_ui.cc:228
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "Propriétés"
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
#, fuzzy
msgid "Bundle Manager"
-msgstr "Gestionnaire de Groupes"
+msgstr "Gestion des Groupes"
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Grande horloge"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr "Connexions Audio"
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr "Connexions MIDI"
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "Ãditeur de raccourcis"
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr "Ãditeur"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Console de mixage"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Préférences"
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
+"Les fichiers de configuration ont été copiés. Vous pouvez maintenant "
+"redémarrer %1."
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr "Avertissement: version préliminaire"
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+"<b>Bienvenue dans cette pré-version du logiciel %1 %2</b>\n"
+"\n"
+"Il y a encore plusieurs problèmes et bogues à résoudre,\n"
+"ainsi que des améliorations générales du flux de travaux, avant que ce "
+"logiciel\n"
+"soit en version stable. Quelques indications:\n"
+"\n"
+"1) N'utilisez <b>PAS</b> ce programme en attendant de lui qu'il soit stable "
+"ou fiable\n"
+" bien qu'il puisse l'être en fonction de votre flux organisationnel.\n"
+"2) Attendez patiemment que la documentation des nouvelles fonctionnalités "
+"soit écrite.\n"
+"3) <b>N'utilisez PAS les forums sur ardour.org pour rapporter les problèmes</"
+"b>.\n"
+"4) <b>Utilisez</b> s'il vous plait le système de suivi de problèmes situé à "
+"http://tracker.ardour.org/\n"
+" pour rapporter les soucis en prenant soin de spécifier la version 5.0-"
+"pre.\n"
+"5) <b>Utilisez</b> s'il vous plait la liste de diffusion ardour-users pour "
+"discuter de vos idées\n"
+" et faire des commentaires.\n"
+"6) <b>Rejoignez-nous</b> sur IRC pour discuter en temps-réel de %1 %2. Vous "
+"pouvez vous y\n"
+" rendre directement depuis le menu Aide->Salon de discussion (anglais).\n"
+"\n"
+"Des informations complètes à propos de tout ce qui précèdent sont "
+"disponibles sur la page de support\n"
+"\n"
+" http://ardour.org/support\n"
-#: ardour_ui.cc:481
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
@@ -799,7 +971,7 @@ msgstr ""
"\n"
"%1"
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -812,46 +984,47 @@ msgstr ""
"relancer le moteur audio et de\n"
"sauvegarder la session."
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
+"La recherche de greffons Audio Unit a échoué. La recherche automatique d'AU a "
+"été désactivée. Référez vous à la fenêtre de log pour plus de détails."
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
-msgstr ""
+msgstr "La recherche de greffons Audio Unit a échoué :"
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr "Le serveur NSM ne s'est pas annoncé"
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr "NSMÂ : pas d'ID client fourni"
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr "NSM : pas de session créée"
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr "NSM : échec d'initialisation"
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
-msgstr ""
+msgstr "Avertissement: version de démonstration gratuite"
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
-msgstr ""
+msgstr "Abonnez-vous et soutenez le développement de %1"
-#: ardour_ui.cc:903
-#, fuzzy
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr "Ne plus me poser la question"
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -861,40 +1034,51 @@ msgid ""
"\n"
"%4"
msgstr ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
-msgstr ""
+msgstr "Ceci est une version de démonstration gratuite du logiciel %1."
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
-msgstr ""
+msgstr "Elle ne récupèrera NI ne sauvegardera aucun réglage des greffons"
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
+"Si vous ouvrez une session existante avec des réglages de greffons\n"
+"ils ne seront pas utilisés et seront perdus."
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
+"Pour avoir un accès complet aux mises à jours n'ayant pas cette limitation\n"
+"vous pouvez devenir un abonné pour un faible cout mensuel."
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
-msgstr ""
+msgstr "Quitter maintenant"
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
-msgstr ""
+msgstr "Continuer à utiliser %1"
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 est prêt à être utilisé."
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -902,30 +1086,30 @@ msgid ""
"You can view the memory limit with 'ulimit -l', and it is normally "
"controlled by %2"
msgstr ""
-"ATTENTION : votre système a une limite maximum pour le verrouillage mémoire. "
-"Cela peut entraîner %1 à manquer de mémoire avant l'épuisement de la mémoire "
-"système.\n"
+"ATTENTION : votre système limite la quantité maximum qu'une application peut "
+"bloquer. Cela peut entraîner %1 à manquer de mémoire avant l'épuisement de "
+"la mémoire système.\n"
"\n"
"Vous pouvez consulter la limite mémoire avec 'ulimit -l' et elle est "
"habituellement contrôlée par %2."
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "Ne plus afficher cette fenêtre"
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "Ne pas quitter"
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr "Quitter sans sauvegarder"
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "Sauvegarder et quitter"
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -939,11 +1123,11 @@ msgstr ""
"\n"
"cliquez sur le bouton « Quitter sans sauvegarder »."
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr "Session non sauvegardée"
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -961,7 +1145,7 @@ msgstr ""
"\n"
"Que voulez-vous faire ?"
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -978,112 +1162,140 @@ msgstr ""
"\n"
"Que voulez-vous faire ?"
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Question"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr "Audio : <span foreground=\"red\">aucun</span>"
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr "Audio : <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr "Audio : <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "Fichiers :"
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr "RF64/WAV"
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr "MBWF"
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr "32-flottant"
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr "24-entier"
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr "16-entier"
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
#, c-format
-msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-msgstr "DSPÂ : <span foreground=\"%s\">%5.1f%%</span>"
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1558
#, c-format
-msgid ""
-"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
-"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
-"\">%<PRIu32>%%</span>"
+msgid "X: <span foreground=\"%s\">%u</span>"
msgstr ""
-"Tampons : <span foreground=\"green\">l :</span><span foreground=\"%s\">"
-"%<PRIu32>%%</span> <span foreground=\"green\">e :</span><span foreground=\"%s"
-"\">%<PRIu32>%%</span>"
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
+#, c-format
+msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
+msgstr "DSPÂ : <span foreground=\"%s\">%5.1f%%</span>"
+
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
+#, c-format
+msgid ""
+"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
+msgstr ""
+"Tampons : <span foreground=\"green\">l :</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">e :</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
+
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Disque : <span foreground=\"green\">Inconnu</span>"
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Disque : <span foreground=\"green\">+24h</span>"
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "Disque : <span foreground=\"green\">> 24h</span>"
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Disque : <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "TCÂ : <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sessions récentes"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
@@ -1091,55 +1303,61 @@ msgstr ""
"%1 n'est connecté à aucun moteur audio.\n"
"Aucune session ne peut être ouverte ni fermée dans ces conditions."
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Ouvrir une session"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "Sessions %1"
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr "Vous ne pouvez pas ajouter une piste sans avoir ouvert une session."
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
-msgstr[0] "impossible de créer %1 nouvelle piste mélangée"
-msgstr[1] "impossible de créer %1 nouvelles pistes mélangées"
+msgstr[0] "impossible de créer %1 nouvelle piste hybride"
+msgstr[1] "impossible de créer %1 nouvelles pistes hybrides"
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Il n'y a pas suffisamment de ports disponibles\n"
-"pour créer une nouvelle piste ou bus.\n"
-"Vous devriez sauvegarder %1, quitter et\n"
-"redémarrer avec plus de ports."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "impossible de créer %1 nouveau bus MIDI"
+msgstr[1] "impossible de créer %1 nouveaux bus MIDI"
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
"Vous ne pouvez pas ajouter une piste ou un bus sans avoir ouvert une session."
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "impossible de créer %1 nouvelle piste audio"
-msgstr[1] "impossible de créer %1 nouvelles pistes audios"
+msgstr[1] "impossible de créer %1 nouvelles pistes audio"
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
-msgstr[0] "impossible de créer %1 nouveau bus"
-msgstr[1] "impossible de créer %1 nouveaux bus"
+msgstr[0] "impossible de créer %1 nouveau bus audio"
+msgstr[1] "impossible de créer %1 nouveaux bus audio"
+
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Il n'y a pas suffisamment de ports disponibles\n"
+"pour créer une nouvelle piste ou bus.\n"
+"Vous devriez sauvegarder %1, quitter et\n"
+"redémarrer avec plus de ports."
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1147,23 +1365,20 @@ msgstr ""
"Créez au moins une piste avant d'enregistrer.\n"
"Allez dans le menu Session, et choisissez « Ajouter piste ou bus »."
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "Sauvegarder sousâ¦"
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nom de la nouvelle session :"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr "%<PRId64> de %<PRId64> copié(s)"
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Prendre un cliché"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Sauvegarder sous"
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Nom du nouveau cliché"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr "Ãchec de la sauvegarde : %1"
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1172,23 +1387,35 @@ msgstr ""
"systèmes, les noms de cliché ne peuvent pas\n"
"utiliser le caractère '%1' "
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "Confirmer l'écrasement du cliché"
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
-msgstr "Un cliché de ce nom existe déjà . Voulez-vous l'écraser ?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr "Un cliché avec ce nom existe déjà . Voulez-vous l'écraser ?"
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Ãcraser"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "Basculer sur un nouveau cliché"
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nom de la nouvelle session :"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Prendre un cliché"
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Nom du nouveau cliché"
+
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "Renommer la session"
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1196,12 +1423,12 @@ msgstr ""
"Afin d'assurer la compatibilité sur différents systèmes\n"
"les noms de sessions ne peuvent pas comporter le caractère '%1'"
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr "Un fichier ou un répertoire utilise déjà ce nom. Essayez autre chose."
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1209,19 +1436,27 @@ msgstr ""
"Le renommage de la session a échoué.\n"
"Il est possible que les données soient à présent corrompues."
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr "Confirmation d'écrasement du modèle"
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr "Un modèle avec ce nom existe déjà . Voulez-vous l'écraser ?"
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr "Sauvegarder comme modèle"
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "Nom du modèle :"
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-modèle"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1231,35 +1466,39 @@ msgstr ""
"%1\n"
"existe déjà . Voulez-vous l'ouvrir ?"
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "Ouvrir une session"
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "Aucune session n'existe dans « %1 »"
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "Patientez pendant que %1 ouvre la session"
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "Erreur de référencement du port"
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr "Cliquez sur le bouton « Fermer » pour réessayer."
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "La session « %1 (cliché %2) » ne s'est pas chargée correctement"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr "La session « %1 (cliché %2) » n'a pas été chargée correctement: %3"
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "Erreur de chargement"
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "La session « %1 (cliché %2) » ne s'est pas chargée correctement"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
@@ -1269,24 +1508,61 @@ msgstr ""
"\n"
"Vous ne pourrez pas enregistrer ni sauvegarder."
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr "Session en lecture-seule"
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr "Impossible de créer une session dans « %1 »: %2"
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "Impossible de créer une session dans « %1 »"
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+"<b>Posez votre question tout simplement et attendez une réponse\n"
+"Cela peut prendre de quelques minutes à plusieurs heures.</b>"
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr "à propos de la discussion instantanée"
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+"Dans la discussion instantanée, posez tout simplement votre question et "
+"attendez une réponse. Vous êtes en discussion avec de vraies personnes ayant "
+"leur vie donc beaucoup d'entre eux sont passifs en ligne et peuvent ne pas "
+"lire votre question avant plusieurs minutes ou plusieurs heures.\n"
+"Soyez donc patient s'il vous plait et attendez une réponse.\n"
+"\n"
+"Vous devriez laisser la fenêtre de discussion ouverte et y jeter "
+"régulièrement un coup d'Åil jusqu'à ce que quelqu'un ait répondu à votre "
+"question."
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "Aucun fichier à nettoyer"
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "Nettoyer"
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1298,19 +1574,19 @@ msgstr ""
"Ceux-ci pourraient contenir des régions requérant\n"
"certains fichiers audio inutilisés pour exister."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "kilo"
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "mega"
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "giga"
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1324,7 +1600,7 @@ msgstr[1] ""
"Les %1 fichiers suivants ont été éffacés de %2,\n"
"libérant %3 %4octets d'espace disque."
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1360,11 +1636,11 @@ msgstr[1] ""
"<span face=\"mono\">Session -> Nettoyer -> Vider la corbeille</span>\n"
"libérera %3 %4octets d'espace-disque supplémentaire.\n"
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "Voulez-vous vraiment lancer le nettoyage ?"
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1374,41 +1650,65 @@ msgstr ""
"TOUTES les opérations d'annulation seront perdues.\n"
"Les fichiers audio inutilisés seront déplacés dans un dossier « dead »."
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Fenêtre de nettoyage"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr "Fichiers nettoyés"
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "fichier effacé"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "Impossible de lire le script de session « %1 »: %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr "Définir les paramètres du script"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "Ãchec de création d'une instance du script de session « %1 »: %2"
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "Ãchec du chargement du script de session « %1 »: %2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "Il n'y a aucun script de session Lua actif dans cette session"
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "Le retrait du script de session « %1 » a échoué : %2"
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
"Le serveur vidéo n'a pas été lancé par %1. La demande pour l'arrêter est "
"ignorée."
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr "Arrêter le Serveur-Vidéo"
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr "Voulez-vous vraiment arrêter le serveur vidéo ?"
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr "Oui, l'arrêter"
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
-msgstr "Le serveur vidéo est déjà démarré"
+msgstr "Le serveur vidéo est déjà démarré."
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
@@ -1416,44 +1716,57 @@ msgstr ""
"Un Serveur-Vidéo est configuré et peut être accessible. Une nouvelle "
"instance ne sera pas démarrée."
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
+"Impossible de se connecter au serveur vidéo. Démarrez-le ou configurez son "
+"URL d'accès dans les Préférences."
-# Should we translate docroot?
-#: ardour_ui.cc:3711
-#, fuzzy
+# docroot = documents root
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
-msgstr "Le répertoire-racine spéficié n'existe pas."
+msgstr "Le répertoire-racine spécifié n'existe pas."
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr "Le serveur vidéo indiqué n'est pas un fichier exécutable."
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr "Impossible de lancer le serveur vidéo"
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr "Le serveur vidéo a été démarré mais ne répond pas aux requêtesâ¦"
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "impossible d'ouvrir %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr "pas de fichier vidéo sélectionné"
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr ""
"L'enregistrement s'est arrêté car votre système n'était pas assez rapide."
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1467,24 +1780,24 @@ msgstr ""
"L'enregistrement a généré un débit de\n"
"données trop important pour le disque.\n"
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr "Recherche de greffons"
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr "Annuler la recherche de greffons"
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
#, fuzzy
msgid "Stop Timeout"
msgstr "Délai d'expiration de la recherche"
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr "Délai d'expiration de la recherche"
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1498,11 +1811,11 @@ msgstr ""
"La lecture a généré un débit de données\n"
"trop important pour le disque.\n"
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "Récupération après un crash"
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1519,19 +1832,19 @@ msgstr ""
"%1 peut récupérer ou ignorer les données\n"
"de l'enregistrement. Que voulez-vous faire ?\n"
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Ignorer les données"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Récupérer les données"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "Mauvais taux d'échantillonnage"
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1541,23 +1854,29 @@ msgstr ""
"mais %2 tourne actuellement à %3 Hz. Si vous chargez cette session,\n"
"l'audio pourra être lu avec une mauvaise fréquence d'echantillonnage.\n"
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "Ne pas charger la session"
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "Charger quand-même la session"
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "Déconnection du moteur Audio/MIDI impossible"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "Reconnection au moteur Audio/MIDI impossible"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"Cette session a été crée avec un taux d'échantillonnage de %1 Hz,\n"
+"mais %2 tourne actuellement à %3 Hz.\n"
+"L'audio sera enregistré et lu avec une mauvaise fréquence\n"
+"d'échantillonnage. Reconfigurez le moteur audio en utilisant\n"
+"le menu Fenêtre > Réglages Audio/MIDI"
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1569,62 +1888,75 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-"%4Session issue d'une ancienne version de %3%5\n"
-"\n"
-"%3 a copié l'ancien fichier de session\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"vers\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"Ã partir de maintenant, utilisez la version -2000 avec d'anciennes versions "
-"de %3"
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI : impossible de configurer l'éditeur"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "UIÂ : impossible de configurer la console"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "UIÂ : impossible de configurer le bandeau de mesure"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Lire depuis la tête de lecture"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Stopper la lecture"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "Armer/désarmer l'enregistrement"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Lire l'intervalle/la sélection"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Aller au début de la session"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Aller à la fin de la session"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Lire l'intervalle de boucle"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
@@ -1633,23 +1965,23 @@ msgstr ""
"Envoyer messages « note off » et « reset controller » sur tous les canaux "
"MIDI"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "Revenir en début de lecture lors de l'arrêt"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "La tête de lecture suit les intervalles de sélection et les éditions"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Monitoring d'entrée automatique"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Activer/désactiver le métronome"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1657,19 +1989,17 @@ msgstr ""
"Actif lorsque quelque chose est en solo\n"
"Cliquer pour désactiver tous les solos."
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-"Actif lorsqu'une écoute est en cours\n"
-"Cliquer pour stopper l'écoute."
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr "Actif lorsqu'une boucle de larsen est détectée."
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1683,7 +2013,7 @@ msgstr ""
"<tt>Esc</tt> : annule ; <tt>Entrée</tt> : confirme ; ajouter « + » ou « - » "
"pour entrer un delta temporel.\n"
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1696,455 +2026,553 @@ msgstr ""
"<tt>Esc</tt> annule; <tt>Entrée</tt> : confirme; Ajouter '+' ou '-' pourque "
"la valeur s'ajoute (ou s'enlève) de la valeur originelle.\n"
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr "Réinitialiser tous les indicateurs de crête"
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
-msgstr ""
+msgstr "Afficher le journal d'erreurs et prendre en compte les avertissements"
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[ERREUR]Â : "
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[AVERTISSEMENT]Â : "
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[INFORMATION]Â : "
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Retour automatique"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "Suivre éditions"
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
-msgstr "IHM"
-
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
-msgid "Misc"
-msgstr "Divers"
+msgstr "Interface graphique"
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Ãditeur de configuration"
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Réglages de la Console"
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Recharger l'historique de la session"
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI : impossible de configurer l'éditeur"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UIÂ : impossible de configurer la console"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UIÂ : impossible de configurer le bandeau de mesure"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Préférences"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Ãditeur"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr "Ne pas fermer"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "Fermer"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "Sauvegarder et fermer"
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-"Cet écran n'est pas assez haut pour afficher la fenêtre de la console de "
-"mixage"
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Session"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Synchro"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Options"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Fenêtres"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "Détacher"
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Aide"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Raccourcis divers"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Format de fichiers audio"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "fichier"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Ãchantillon"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Surfaces de contrôle"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Greffons"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "Mesure"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "Taux de chute"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Temps de maintien"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "Gestion des dénormaux"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "Nouvelleâ¦"
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "Ouvrirâ¦"
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Récentesâ¦"
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Fermer"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "Ajouter une piste ou un busâ¦"
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "Ouvrir vidéo"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "Dupliquer les pistes/bus..."
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr "Enlever vidéo"
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "Exporter vers un fichier vidéoâ¦"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Prendre un clichéâ¦"
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "Sauvegarder sousâ¦"
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr "Renommer.."
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Sauvegarder comme modèleâ¦"
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "Meta-données"
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "Ãditer les méta-donnéesâ¦"
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "Importer les méta-données"
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Exporter vers fichier(s) audioâ¦"
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "Export de fragmentsâ¦"
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:131
+#: export_video_dialog.cc:80
msgid "Export"
msgstr "Exporter"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "Nettoyer les sources inutiliséesâ¦"
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "Vider la corbeille"
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Quitter"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Cacher"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Maximiser l'espace d'édition"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr "Maximiser l'espace de mixage"
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Afficher les barres d'outils"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr ""
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
-#: ardour_ui_ed.cc:198
+#: ardour_ui_ed.cc:305
msgid "Show more UI preferences"
msgstr "Afficher plus de préférences d'interface graphique"
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Console de mixage"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "Basculer Ãditeur+Console de mixage"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr "Bandeau de mesure"
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "Activité MIDI"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "Salon de discussion (anglais)"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "Manuel"
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Référence"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
-#: ardour_ui_ed.cc:212
-#, fuzzy
-msgid "Report A Bug"
-msgstr "Rapporter un &bogue..."
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
-msgstr ""
+msgstr "Liste des raccourcis"
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
-msgstr ""
+msgstr "Site web d'Ardour"
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
-msgstr ""
+msgstr "Développement d'Ardour"
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
-msgstr ""
+msgstr "Forums utilisateurs"
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
# Utilisation de sauvegarder pour éviter la confusion avec enregistrer que l'on réserve au son.
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Sauvegarder"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Commandes"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Arrêter"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "« Roll »"
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Lecture/arrêt"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "Lecture/continuer/arrêt"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
-msgstr "Arrêt avec destruction du dernier enregistrement"
+msgstr "Arrêter et détruire le dernier enregistrement"
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Lecture avant"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Lecture arrière"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Lire l'intervalle de boucle"
-#: ardour_ui_ed.cc:270
-#, fuzzy
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
-msgstr "Lire la sélection avec compte à rebours"
+msgstr "Lire la sélection"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "Lire la sélection avec compte à rebours"
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Armer l'enregistrement"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "Démarrer l'enregistrement"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "Rembobiner"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "Rembobiner (lent)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "Rembobiner (rapide)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "Avance rapide"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "Avancer (lent)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "Avancer (rapide)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "Aller à zéro"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Aller au début"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "Aller à la fin"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr "Aller à la toute fin"
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
-msgstr "Décimale du pavé numérique"
+msgstr "Point du pavé numérique"
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr "0 du pavé numérique"
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr "1 du pavé numérique"
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr "2 du pavé numérique"
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr "3 du pavé numérique"
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr "4 du pavé numérique"
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr "5 du pavé numérique"
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr "6 du pavé numérique"
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr "7 du pavé numérique"
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr "8 du pavé numérique"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr "9 du pavé numérique"
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "Focus sur l'horloge"
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2152,125 +2580,137 @@ msgstr "Focus sur l'horloge"
msgid "Timecode"
msgstr "« Timecode »"
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Mesures|Temps"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minutes:Secondes"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Ãchantillons"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "« Punch » entrée"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "Entrée"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "« Punch » sortie"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "Sortie"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "« Punch »"
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "Entrée/Sortie"
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Métronome"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "Ãcoute automatique"
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Lecture automatique"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "Synchroniser le démarrage avec la vidéo"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "Horloge maître"
-#: ardour_ui_ed.cc:420
-msgid "Toggle Record Enable Track %1"
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
+msgid "Toggle Record Enable Track %1"
msgstr "Armer la piste %1"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
-msgstr "pourcentage"
+msgstr "Pourcentage"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Demi-tons"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Envoi MTC (Midi Time Code)"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Envoi MMC (Midi Machine Control)"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Réception MMC (Midi Machine Control)"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "Envoyer l'horloge MIDI"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr "Envoyer les réponses MIDI"
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Panique"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr "Grande horloge"
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr "Espace disque"
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr "Tampons"
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr "Format du « Timecode »"
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr "Format de fichier"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2278,141 +2718,143 @@ msgstr ""
"Le paramètre « pullup/pulldown » doit être à zéro pour\n"
"utiliser JACK en tant que source de synchronisation."
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "Interne"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "Activer/désactiver la synchronisation positionnelle externe"
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
"Impossible de synchroniser avec JACK : le « pullup/pulldown » vidéo est "
"activé"
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "--en attente--"
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr "FE"
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "« Pull »"
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Tempo"
# L'abréviation est nécessaire, sinon l'affichage est tronqué dans l'horloge
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Sig."
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "erreur de programmation: %1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "erreur de programmation: %1 %2"
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "Mesures|Temps"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "Minutes : Secondes"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "Régler à la tête de lecture"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr "Se placer ici"
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr "dB"
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "Gain de la région"
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr "dBFS"
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "Amplitude crête :"
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "Calcul en coursâ¦"
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "ajout d'un point de contrôle de gain"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
-msgstr ""
+msgstr "Sélectionner une note..."
-#: automation_controller.cc:293
-#, fuzzy
+#: automation_controller.cc:311
msgid "Halve"
-msgstr "Diviser par deux les durées dans la sélection."
+msgstr "Diviser par deux"
-#: automation_controller.cc:296
-#, fuzzy
+#: automation_controller.cc:314
msgid "Double"
-msgstr "Double"
+msgstr "Doubler"
-#: automation_controller.cc:307
-#, fuzzy
-msgid "Set to %1 beat(s)"
-msgstr "Impossible de régler le pilote sur %1"
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "déplacement d'événement d'automation"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "déplacement d'intervalle d'automation"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "retrait de point de contrôle"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "Les points illégaux sur la ligne d'automation « %1 » sont ignorés"
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "ajouter un événement d'automation à "
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
-msgstr ""
+msgstr "Impossible d'afficher la zone d'automation pour un contrôle sans liste"
#: automation_time_axis.cc:163
msgid "automation state"
@@ -2422,64 +2864,60 @@ msgstr "état de l'automation"
msgid "hide track"
msgstr "cacher la piste"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr "Manuel"
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Lire"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Ãcrire"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Reprendre"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "effacer l'automation"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Cacher"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "Effacer"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Ãtat"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
#, fuzzy
msgid "Discrete"
-msgstr "Discret"
+msgstr "Discontinu"
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Linéaire"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Mode"
@@ -2487,47 +2925,46 @@ msgstr "Mode"
msgid "Disassociate"
msgstr "Désassocier"
-# We can do better
#: bundle_manager.cc:186
-#, fuzzy
msgid "Edit Bundle"
-msgstr "Editer le groupe"
+msgstr "Ãditer le groupe"
-# Sens?
#: bundle_manager.cc:201
-#, fuzzy
msgid "Direction:"
-msgstr "Direction :"
+msgstr "Sens :"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "Entrée"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "Sortie"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Ãdition"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "Supprimer"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Nom"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Nouveau"
@@ -2544,6 +2981,38 @@ msgstr "Ajouter un canal"
msgid "Rename Channel"
msgstr "Renommer le canal"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Restaurer la configuration par défaut"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objet"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "Couleur"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr "Ãléments"
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr "Palette"
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr "Transparence"
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr "Palette de couleurs"
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr "Configuration de compilation"
@@ -2556,6 +3025,42 @@ msgstr "Point de contrôle"
msgid "Value"
msgstr "Valeur"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr "Note"
@@ -2593,663 +3098,666 @@ msgstr "Hauteur"
msgid "Velocity"
msgstr "Vélocité"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "Temps"
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:375
+#: export_timespan_selector.cc:437 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
msgid "Length"
msgstr "Durée"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "éditer la note"
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "Trames de CD"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr "Trames de TC"
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr "Secondes de TC"
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr "Minutes de TC"
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Secondes"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minutes"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "128ème de temps"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "64ème de temps"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "32ème de temps"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "28ème de temps"
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "24ème de temps"
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "20ème de temps"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "16ème de temps"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "14ème de temps"
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "12ème de temps"
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "10ème de temps"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "8ème de temps"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "7ème de temps"
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "6ème de temps"
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "5ème de temps"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Quart de temps"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Tiers de temps"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Demi temps"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Temps"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Mesures"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Repères"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "Débuts de régions"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Fins de régions"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "Synchros de régions"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Limites de régions"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "Pas de grille"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Grille"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnétique"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Tête de lecture"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Repère"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Souris"
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Glissant"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Collant"
-# Contexte?
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
#, fuzzy
msgid "Ripple"
-msgstr "Ondulation"
+msgstr "Propagation"
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Verrouillé"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Gauche"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Droite"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Centre"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr "Point d'édition"
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr "En bouillie"
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr "Lisse"
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "Mélange polyphonique équilibré"
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "Percussion atonale à sons stables"
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "Instrumental monophonique précis"
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "Percussion solo atonale"
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "Rééchantillonage avec modification de la tonalité"
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Mins:Secs"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Repères de position"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Repères d'intervalle"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Intervalles boucle/« punch »"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "Repères de CD"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr "« Timeline » vidéo"
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "mode"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "Repères"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Régions"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "Pistes et bus"
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "Clichés"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "Groupes de pistes et bus"
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "Intervalles et repères"
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Ãditeur"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Boucle"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "« Punch »"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
-msgstr "Linéaire (pour matériaux fortement corrélé)"
+msgstr "Linéaire (pour matériau fortement corrélé)"
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr "Puissance constante"
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "Symétrique"
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Lent"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Rapide"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "Désactiver"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "Activer"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Bloquer"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "Débloquer"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr "régions sélectionnées"
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr "Lire l'intervalle"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "Boucler sur l'intervalle"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "Zoomer sur l'intervalle"
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "Déplacer le début de l'intervalle à la bordure de la région précédente"
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "Déplacer le début de l'intervalle à la bordure de la région suivante"
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "Déplacer la fin de l'intervalle à la bordure de la région précédente"
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "Déplacer la fin de l'intervalle à la bordure de la région suivante"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "Séparer"
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr "Convertir en région (vers la liste des régions)"
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Sélectionner tout dans l'intervalle"
-#: editor.cc:1863 editor_actions.cc:297
-#, fuzzy
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
-msgstr "Régler l'intervalle de boucle sur la sélection"
+msgstr "Convertir la sélection en marqueurs de début et fin de boucle"
-#: editor.cc:1864 editor_actions.cc:298
-#, fuzzy
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
-msgstr "Régler l'intervalle de « punch » sur la sélection"
+msgstr "Convertir la sélection en marqueurs de début et fin de « punch »"
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
-msgstr ""
+msgstr "Convertir la sélection en marqueurs de début et fin de session"
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Ajouter des repères d'intervalle"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr "Rogner la région à l'intervalle"
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Remplir l'intervalle avec la région"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Dupliquer l'intervalle"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr "Consolider l'intervalle"
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "Consolider l'intervalle avec traitement"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
+msgstr ""
# Jargon
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr "« Bouncer » l'intervalle vers la liste des régions"
-# Jargon
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "« Bouncer » l'intervalle vers la liste des régions avec traitement"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr "Exporter l'intervalleâ¦"
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr "Exporter l'intervalle vidéoâ¦"
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Lire au point d'édition"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Lire depuis le début"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr "Lire la région"
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "Lire la région en boucle"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr "Sélectionner tout dans la piste"
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr "Sélectionner tous les objets"
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr "Inverser la sélection dans la piste"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr "Inverser la sélection"
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "Régler l'intervalle sur l'intervalle de boucle"
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "Régler l'intervalle sur l'intervalle de « punch »"
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Tout après le point d'édition"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Tout avant le point d'édition"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "Tout après la tête de lecture"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "Tout avant la tête de lecture"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr "Sélectionner tout entre la tête de lecture et le point d'édition"
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr "Tout sélectionner entre la tête de lecture et le point d'édition"
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr "Sélectionner l'intervalle entre la tête et le point d'édition"
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Sélectionner"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "Couper"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "Copier"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "Coller"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Aligner"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Aligner relativement"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "Insérer la région sélectionnée"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr "Insérer des fichiers audio externes"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr "Décaler toute la piste vers la droite"
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr "Décaler la piste vers la droite après le point d'édition"
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr "Décaler toute la piste vers la gauche"
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr "Décaler la piste vers la gauche après le point d'édition"
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "Décaler"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
+"Valeur de position de tête de lecture négative - ignorée (placée à zéro)"
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "Tout"
-#: editor.cc:3210
-#, fuzzy
-msgid "Smart Mode (add Range functions to Grab mode)"
-msgstr "Mode Smart (ajoute des fonctions d'intervalle au mode Object)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
+msgstr ""
-#: editor.cc:3211
-#, fuzzy
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
-msgstr "Mode Objet (sélectionner/déplacer des objets)"
+msgstr "Mode Attraper (sélectionner/déplacer des objets)"
-#: editor.cc:3212
-#, fuzzy
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
-msgstr "Mode découpage (séparation des régions)"
+msgstr "Mode Couper (séparation des régions)"
-#: editor.cc:3213
-#, fuzzy
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
-msgstr "Mode Intervalles (sélectionner/déplacer des Intervalles)"
+msgstr "Mode Intervalle (sélectionner/déplacer des Intervalles)"
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
-msgstr ""
+msgstr "Mode Dessin (dessiner et modifier le gain, les notes, l'automation)"
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
+"Mode Ãtirement (modifie la durée des régions audio et midi en préservant la "
+"tonalité)"
-#: editor.cc:3216
-#, fuzzy
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
-msgstr "Ãcouter des Régions spécifiques"
+msgstr "Mode Ãcoute (écouter des régions spécifiques)"
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr ""
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr "Mode Ãdition interne (éditer les notes et les points d'automation)"
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
msgstr ""
"Groupes : cliquer pour (dés)activer\n"
-"un groupe.\n"
-"Clic droit pour les autres options."
+"Clic droit pour les autres options"
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr "Décaler la région/sélection vers la droite"
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr "Décaler la région/sélection vers la gauche"
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "Zoom avant"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Zoom arrière"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr "Zoomer à l'échelle de temps"
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Montrer toute la session"
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
msgstr "Zoomer sur"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr "Agrandir la taille des pistes"
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr "Réduire la taille des pistes"
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr "Nombre de pistes visibles"
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr "Unités d'alignement/grille"
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "Mode d'alignement/grille"
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Point d'édition"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Mode d'édition"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3257,125 +3765,124 @@ msgstr ""
"Horloge de décalage\n"
"(contrôle la distance utilisée pour pousser les régions et les sélections)"
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr "Annuler"
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr "Annuler (%1)"
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Refaire"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Refaire (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Dupliquer"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr "Nombre de duplications :"
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "Sélection"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr "Ajuster pour 1 piste"
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr "Ajuster pour 2 pistes"
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr "Ajuster pour 4 pistes"
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr "Ajuster pour 8 pistes"
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr "Ajuster pour 16 pistes"
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr "Ajuster pour 24 pistes"
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr "Ajuster pour 32 pistes"
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr "Ajuster pour 48 pistes"
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr "Ajuster pour toutes les pistes"
-#: editor.cc:3718
-#, fuzzy
+#: editor.cc:3786
msgid "Fit Selection"
-msgstr "Ajuster à la fenêtre"
+msgstr "Ajuster à la sélection"
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr "Zoomer sur 10 ms"
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr "Zoomer sur 100 ms"
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr "Zoomer sur 1 s"
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr "Zoomer sur 10 s"
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr "Zoomer sur 1 mn"
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr "Zoomer sur 10 mn"
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr "Zoomer sur 1 h"
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr "Zoomer sur 8 h"
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr "Zoomer sur 24Â h"
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr "Zoomer sur l'intervalle / la région sélectionnée"
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr "*"
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr "Suppression de la liste de lecture"
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3385,1302 +3892,1380 @@ msgstr ""
"Si vous la conservez, aucun fichier audio qu'elle utilise ne sera nettoyé.\n"
"Si vous l'effacez, les fichiers audio qu'elle seule utilise seront nettoyés."
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr "Supprimer la liste de lecture"
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr "Garder la liste de lecture"
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "Annuler"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "nouvelles listes de lecture"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "copier les listes de lecture"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "effacer les listes de lecture"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr "Patienter pendant que %1 charge les données graphiques."
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr "Ãditerâ¦"
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Transposerâ¦"
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
-msgstr ""
+msgstr "Ligaturer"
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr "Quantifierâ¦"
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
-msgstr ""
+msgstr "Supprimer le recouvrement"
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
-msgstr ""
+msgstr "Transformer..."
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Connexions automatiques"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "Fondus enchaînés"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "Déplacer le repère sélectionné"
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "Opérations sur intervalle de sélection"
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "Sélection de régions"
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Point d'édition"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Fondu"
# Context?
-#: editor_actions.cc:100
-#, fuzzy
+#: editor_actions.cc:103
msgid "Latch"
-msgstr "Loquet"
+msgstr "Verrouillage"
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "Régions"
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Empilement des régions"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Position"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Rogner"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "Gain"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Intervalles"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "Fondus"
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr "Lien"
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoomer sur"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "Déplacer aux repères"
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Taux de chute du bargraphe"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Maintien de la crête de bargraphe"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "Options MIDI"
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Autres options"
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Ãcoute de contrôle"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "Repère actif"
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Horloge principale"
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "Pullup / Pulldown"
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Opérations sur les régions"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Grille"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr "Vues"
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "Défilement"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Horloge secondaire"
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "Sous-trames"
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "Trames/s « timecode »"
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Hauteur"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Outils"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "Affichage"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "Zoom"
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Arrêter le déplacement ou tout désélectionner"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr "Verrouiller"
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Afficher la tranche de mixage"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "Afficher les listes d'édition"
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Tête de lecture à la bordure de région suivante"
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr ""
"Tête de lecture à la bordure de région suivante (Pas de sélection de piste)"
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Tête de lecture à la bordure de région précédente"
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr ""
"Tête de lecture à la bordure de région précédente (Pas de sélection de piste)"
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
-msgstr "début de la région suivante"
+msgstr "Tête de lecture au début de la région suivante"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
-msgstr "Fin de la région suivante"
+msgstr "Tête de lecture à la fin de la région suivante"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
-msgstr "Tête de lecture au point de synchronisation de région suivant"
+msgstr "Tête de lecture au point de synchronisation de la région suivante"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
-msgstr "début de la région précédente"
+msgstr "Tête de lecture au début de la région précédente"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
-msgstr "fin de la région précédente"
+msgstr "Tête de lecture à la fin de la région précédente"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
-msgstr "Tête de lecture au point de synchronisation de région précédent"
+msgstr "Tête de lecture au point de synchronisation de la région précédente"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "à la bordure de région suivante"
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "à la bordure de région suivante (Pas de sélection de piste)"
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "à la bordure de région précédente"
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "à la bordure de région précédente (Pas de sélection de piste)"
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "Au début de région suivant"
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "à la fin de région suivante"
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "Au point de synchronisation de région suivant"
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "Au début de région précédent"
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "à la fin de région précédente"
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "Au point de synchronisation de région précédent"
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "Au début de l'intervalle"
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "Ã la fin de l'intervalle"
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "De la tête de lecture au début de l'intervalle"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "De la tête de lecture à la fin de l'intervalle"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr "Sélectionner toutes les pistes"
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "Désélectionner tout"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "Sélectionner tout ce qui chevauche l'intervalle d'édition"
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "Tout sélectionner à l'intérieur de l'intervalle d'édition"
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "Sélectionner l'intervalle d'édition"
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Tout sélectionner dans l'intervalle de « punch »"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Tout sélectionner dans l'intervalle de boucle"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "Sélectionner piste ou bus suivant"
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "Sélectionner piste ou bus précédent"
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "Armer/désarmer l'enregistrement"
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr "Basculer Solo"
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "Basculer Muet"
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "Basculer Solo Isolé"
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "Sauvegarder la vue %1"
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "Charger la vue %1"
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "Se placer au repère %1"
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "Sauter au repère suivant"
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "Sauter au repère précédent"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "Créer un repère à la tête de lecture"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr "Enlever le repère à la tête de lecture"
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr "Décaler le suivant vers la droite"
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr "Décaler le suivant vers la gauche"
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "Décaler la tête de lecture vers la droite"
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "Décaler la tête de lecture vers la gauche"
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "Tête de lecture à la grille suivante"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "Tête de lecture à la grille précédente"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
-msgstr ""
+msgstr "Zoom sur la sélection"
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "Commuter l'état du zoom"
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "Augmenter la hauteur de la piste"
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "Diminuer la hauteur de la piste"
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "Déplacer vers le haut"
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "Déplacer vers le bas"
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "Monter d'une page"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "Descendre d'une page"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "Défiler vers le haut"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "Défiler vers le bas"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "Défiler en arrière"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "Défiler en avant"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Centrer sur la tête de lecture"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Centrer le point d'édition"
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Suivre la tête de lecture"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Tête de lecture en arrière"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "Déplacer la tête de lecture au repère actif"
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "Déplacer le repère actif à la tête de lecture"
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
-msgstr ""
+msgstr "Utiliser les sauts de plage"
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "Lire les régions sélectionnées"
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "Lire au point d'édition et revenir"
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "Lire l'intervalle d'édition"
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Placer sur le curseur d'édition"
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Déplacer le repère actif à la position de la souris"
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
-msgstr ""
+msgstr "Annuler la modification de sélection"
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
-msgstr ""
+msgstr "Refaire la modification de sélection"
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "Exporter Audio"
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Exporter l'intervalle"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "Séparer suivant l'intervalle de « punch »"
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "Séparer suivant l'intervalle de boucle"
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "Découper"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr "Fondu sur l'intervalle sélectionné"
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr "Régler le tempo sur intervalle d'édition = mesure"
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr "Journal"
-#: editor_actions.cc:351 editor_actions.cc:353
-#, fuzzy
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
-msgstr "Aller au prochain début de Région (Pistes sélectionnées)"
+msgstr "Aller à la prochaine transitoire"
-#: editor_actions.cc:352 editor_actions.cc:354
-#, fuzzy
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
-msgstr "Aller au prochain début de Région (Pistes sélectionnées)"
+msgstr "Aller à la transitoire précédente"
+
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Démarrer un intervalle"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "Terminer un intervalle"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Suivre la tête de lecture"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Détruire le dernier enregistrement"
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "Tête de lecture stationnaire"
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Insérer temps"
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "Activer/désactiver"
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Supprimer"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
-msgstr ""
+msgstr "Ajuster à la sélection (verticale)"
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "Ãnorme"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "Très Grand"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Grand"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "Petit"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr "Jouer les notes MIDI sélectionnées"
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Zoomer sur la gauche"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Zoomer sur la droite"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Zoomer au centre"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Zoomer sur la tête de lecture"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Zoomer sur la souris"
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Zoomer sur le point d'édition"
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr "Option suivante pour Zoomer sur"
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "Mode objet intelligent"
-#: editor_actions.cc:450
-#, fuzzy
+#: editor_actions.cc:491
msgid "Smart"
msgstr "Intelligent"
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Outil d'objet"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Outil d'intervalle"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "Outil de dessin de note"
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "Outil d'écoute"
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "Outil de transformation temporelle"
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
-msgstr ""
+msgstr "Outil Contenu"
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr "Outil de découpe"
# Mieux?
-#: editor_actions.cc:490
+#: editor_actions.cc:531
#, fuzzy
msgid "Step Mouse Mode"
msgstr "Mode Pas-Ã -pas"
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "Changer le point d'édition"
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "Changer le point d'édition y compris le repère"
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr "Changer le mode d'édition"
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "Aligner sur"
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Mode d'alignement"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "Mode d'alignement suivant"
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "Choix d'alignement suivant"
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr "Choix d'alignement musical suivant"
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr "Choix d'alignement précédent"
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr "Choix d'alignement musical précédent"
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
-msgstr "Aligner sur la trame CD"
+msgstr "Aimanter à la trame CD"
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
-msgstr "Aligner sur la trame de « timecode »"
+msgstr "Aimanter à la trame de « timecode »"
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
-msgstr "Aligner sur les secondes de « timecode »"
+msgstr "Aimanter aux secondes de « timecode »"
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
-msgstr "Aligner sur les minutes de « timecode »"
+msgstr "Aimanter aux minutes de « timecode »"
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
-msgstr "Aligner sur les secondes"
+msgstr "Aimanter aux secondes"
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
-msgstr "Aligner sur les minutes"
+msgstr "Aimanter aux minutes"
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
-msgstr "Aligner aux quintuple croches"
+msgstr "Aimanter au 28ème de temps"
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
-msgstr "Aligner sur un 64ème de temps"
+msgstr "Aimanter au 46ème de temps"
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
-msgstr "Aligner sur 30 secondes"
+msgstr "Aimanter toutes les 30 secondes"
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
-msgstr "Aligner sur un 28ème de temps"
+msgstr "Aimanter au 28ème de temps"
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
-msgstr "Aligner sur un 24ème de temps"
+msgstr "Aimanter au 24ème de temps"
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
-msgstr "Aligner sur un 20ème de temps"
+msgstr "Aimanter au 20ème de temps"
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
-msgstr "Aligner sur un 16ème de temps"
+msgstr "Aimanter au 16ème de temps"
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
-msgstr "Aligner sur un 14ème de temps"
+msgstr "Aimanter au 14ème de temps"
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
-msgstr "Aligner sur un 12ème de temps"
+msgstr "Aimanter au 12ème de temps"
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
-msgstr "Aligner sur un 10ème de temps"
+msgstr "Aimanter au 10ème de temps"
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
-msgstr "Aligner sur un 8ème de temps"
+msgstr "Aimanter au 8ème de temps"
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
-msgstr "Aligner sur un 7ème de temps"
+msgstr "Aimanter au 7ème de temps"
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
-msgstr "Aligner sur un 6ème de temps"
+msgstr "Aimanter au 6ème de temps"
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
-msgstr "Aligner sur un 5ème de temps"
+msgstr "Aimanter au 5ème de temps"
# Pas plutôt la noire ?
-#: editor_actions.cc:544
-#, fuzzy
+#: editor_actions.cc:585
msgid "Snap to Quarters"
-msgstr "un quart de temps"
+msgstr "Aimanter au quart de temps"
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
-msgstr "Aligner sur un triolet"
+msgstr "Aimanter au tiers de temps"
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
-msgstr "Aligner sur un demi temps"
+msgstr "Aimanter au demi temps"
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
-msgstr "Aligner sur un temps"
+msgstr "Aimanter au temps"
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
-msgstr "Aligner sur les mesures"
+msgstr "Aimanter à la mesure"
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
-msgstr "Aligner sur les repères"
+msgstr "Aimanter aux repères"
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
-msgstr "Aligner sur un début de région"
+msgstr "Aimanter au début de région"
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
-msgstr "Aligner sur fin de région"
+msgstr "Aimanter à la fin de région"
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
-msgstr "Aligner sur synchro de région"
+msgstr "Aimanter aux synchros de région"
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
-msgstr "Aligner sur limite de région"
+msgstr "Aimanter aux limites de région"
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "Afficher les barres de repères"
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "Boucle/« Punch »"
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Min:Sec"
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr "Moniteur vidéo"
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr "Vidéo"
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr "Toujours au dessus"
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr "Numéro de trame"
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr "« Timecode » en arrière-plan"
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr "Plein écran"
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr "« Letterbox »"
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr "Taille originale"
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Trier"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Tout montrer"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr "Afficher les régions automatiques"
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "croissant"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "décroissant"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "par nom de région"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "par longueur de région"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "par position de région"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
-msgstr "par date de région"
+msgstr "par horodatage de région"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "par début de région (dans le fichier)"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "par fin de région (dans le fichier)"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "par nom de fichier source"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "par longueur de fichier source"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "par date de création du fichier source"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "par système de fichier source"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "Supprimer les régions inutilisées"
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr "Importer une région PT"
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importer"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "Importer dans la liste des régionsâ¦"
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr "Importer depuis une session"
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr "Déplacer tous les médias dans le dossier de session"
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "Afficher le résumé"
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "Afficher les onglets de groupes"
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
-msgstr ""
+msgstr "Afficher les barres de mesure"
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Afficher le logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
"Basculer l'entrée MIDI active pour les pistes/bus sélectionnés dans l'éditeur"
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "Raccourcis d'éditeur chargés depuis %1"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-"Impossible de trouver « editor.bindings » dans le chemin de recherche %1"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr "erreur de programmation: %1: %2"
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "Envoyer vers l'avant"
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Envoyer à l'avant"
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Envoyer vers l'arrière"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Envoyer à l'arrière"
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "Remettre à sa position d'origine"
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr "Verrouiller sur la vidéo"
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "Coller aux mesures|temps"
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "Supprimer le point de synchro"
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Muet"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normaliserâ¦"
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Inverser"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "Créer des régions mono"
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "Augmenter le gain"
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "Couper le gain"
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "Pitch shiftâ¦"
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Transposerâ¦"
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "Opaque"
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Type de fondu entrant"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Type de fondu sortant"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "Multi-dupliquerâ¦"
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Remplir la piste"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Régler l'intervalle de boucle"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "Régler « punch »"
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "Ajouter un seul repère d'intervalle"
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "Ajouter un repère d'intervalle par région"
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr "Aligner la position sur la grille"
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "Combler les écarts"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "Fureteur de rythmeâ¦"
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "Exporterâ¦"
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "Séparer dessous"
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "Définir la durée de montée"
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "Définir la durée de descente"
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "Régler le tempo sur région = mesure"
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "Scinder aux attaques de percussion"
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "Ãditeur en listeâ¦"
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "Propriétésâ¦"
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "« Bouncer » (avec traitement)"
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "« Bouncer » (sans traitement)"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "Joindre"
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "Disjoindre"
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "Analyse spectraleâ¦"
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Réinitialiser l'enveloppe"
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "Réinitialiser le gain"
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "Enveloppe active"
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "Insérer un changement de patchâ¦"
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr "Délier des autres copies"
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "Supprimer le silenceâ¦"
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Régler l'intervalle de sélection"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr "Décaler vers la droite"
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr "Décaler vers la gauche"
-#: editor_actions.cc:1955
-#, fuzzy
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr "Séquencer les régions"
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr "Décaler vers la droite en fonction du décalage d'enregistrement"
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr "Décaler vers la gauche en fonction du décalage d'enregistrement"
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "Rogner aux repères de boucle"
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Rogner aux points de « punch »"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Rogner aux précédent"
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Rogner jusqu'au suivant"
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Insérer région depuis la liste des régions"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "Régler la position de synchronisation"
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "Placer transitoire"
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
-msgstr ""
+msgstr "Découper/Séparer"
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "Rogner du début au point d'édition"
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "Rogner de la fin au point d'édition"
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "Aligner le début"
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "Aligner le début relativement"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "Aligner la fin"
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "Aligner la fin relativement"
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "Aligner le point de synchronisation"
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "Aligner le point de synchronisation relativement"
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "Choisir le dessusâ¦"
@@ -4710,32 +5295,33 @@ msgstr ""
"La session contient déjà le fichier source %1. Voulez-vous importer %2 comme "
"un nouveau fichier source, ou l'ignorer ?"
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Annuler l'importation"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Ãditeur : impossible d'ouvrir le fichier « %1 » (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Annuler toute l'importation"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Ne pas le lier"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Lier tout sans poser de question"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "Ãchantillonnage"
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4744,216 +5330,283 @@ msgstr ""
"La fréquence d'échantillonnage de ce fichier audio ne correspond pas à celle "
"de la session !"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Lier quand même"
-# drop zone?
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
-#, fuzzy
-msgid "Could not create new track after region placed in the drop zone"
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
msgstr ""
-"Impossible de créer une nouvelle piste à partir d'une région placée dans la "
-"zone de suppression"
-#: editor_drag.cc:1266
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
+msgid "Could not create new track after region placed in the drop zone"
+msgstr "Impossible de créer une nouvelle piste à partir de la région placée "
+"dans la zone cible"
+
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr "Déplacement vertical de région"
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
+msgstr "Déplacement avec propagation"
+
+#: editor_drag.cc:2311
+msgid "create region"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2430 midi_region_view.cc:2859
#, fuzzy
msgid "resize notes"
msgstr "Redimensionner les notes"
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr "Début vidéo :"
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr "Différence :"
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr "Déplacer vidéo"
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "déplacer le repère de signature"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "copier le repère de signature"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "déplacer le repère de signature"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "déplacer le repère de tempo"
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "copier le repère de tempo"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "déplacer le repère de tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "modifier la durée de montée"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "modifier la durée de descente"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "déplacer le repère"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "déplacement d'intervalle d'automation"
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr "Une erreur est survenue pendant l'opération d'étirement temporel"
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
-msgstr "%1 : erreur de programmation"
+msgstr "%1Â : erreur de programmation"
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
-msgstr ""
+msgstr "nouveau marqueur de saut"
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
-msgstr ""
+msgstr "saut"
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
-msgstr ""
+msgstr "nouveau marqueur de CD"
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "(sans nom)"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
-msgstr ""
+msgstr "Zone d'automation créée pour un type de région invalide"
# Short for color
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr "Coul."
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr "Couleur de l'onglet du groupe"
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr "Nom du groupe"
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
msgstr "V"
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
-msgstr "Groupe est visible ?"
+msgstr "Groupe visible ?"
# Active
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr "Act."
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr "Groupe activé ?"
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
msgstr "G"
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr "Partager gain ?"
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "Rel."
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr "Rel"
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
-msgstr "Changements de gain relatifs"
+msgstr "Changements de gain relatifs ?"
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr "M"
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr "Partager muet ?"
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr "S"
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr "Partager solo ?"
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Enreg."
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr "Partager l'armement ?"
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "Mon."
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr "Mon"
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr "Partager le choix d'écoute ?"
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "Sél."
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr "Sel"
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr "Partager le statut de sélection/édition ?"
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
msgstr "A"
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr "Partager le statut d'activation ?"
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
-#, fuzzy
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
-msgstr "programming error : marker canvas item has no marker object pointer!"
+msgstr ""
+"erreur de programmation : l'élément de marqueur de canvas n'a pas de "
+"pointeur d'objet marqueur !"
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "Le fichier existe !"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr "Confirmer l'écrasement du fichier MIDI"
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Ãcraser le fichier existant"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr "Un fichier du même nom existe déjà . Voulez-vous l'écraser ?"
#: editor_group_tabs.cc:176
msgid "Fit to Window"
@@ -4967,309 +5620,343 @@ msgstr "début"
msgid "end"
msgstr "fin"
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr "repère"
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "ajouter un repère"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "définir l'intervalle de boucle"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "définir l'intervalle de « punch »"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "intervalle"
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "nouveau repère d'intervalle"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "supprimer le repère"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "Se placer ici"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "Lire à partir d'ici"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "Déplacer le repère à tête de lecture"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "Créer un intervalle jusqu'au repère suivant"
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr "Déplacer au repère"
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr "Lire depuis le repère"
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr "Placer le repère sur la tête de lecture"
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr "Régler l'intervalle sur la sélection"
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Cacher l'intervalle"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "Renommer l'intervalleâ¦"
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Supprimer l'intervalle"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Séparer les régions dans l'intervalle"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Intervalle de sélection"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Intervalle de « Punch »"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Nouveau nom :"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "Renommer le repère"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "Renommer l'intervalle"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Renommer"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "renommer le repère"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
"Cet écran n'est pas assez haut pour afficher la tranche de mixage de "
"l'éditeur"
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
-#, fuzzy
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
-"programming error: tempo marker canvas item has no marker object pointer!"
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
-#, fuzzy
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
-msgstr "programming error: marker for tempo is not a tempo marker!"
+msgstr ""
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
-#, fuzzy
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
-msgstr "programming error: marker for meter is not a meter marker!"
+msgstr ""
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
-#, fuzzy
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
msgstr ""
-"programming error: control point canvas item has no control point object "
-"pointer!"
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "édition de notes"
+
+#: editor_mouse.cc:2193
msgid "start point trim"
-msgstr "Rogner le début"
+msgstr "rogner le début"
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Rogner la fin"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr "rogner la fin"
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Nom de la région :"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "scinder"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "altérer la sélection"
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "décaler les régions vers la droite"
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "décaler l'emplacement vers la droite"
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "décaler les régions vers la gauche"
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "décaler vers la droite"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr "décaler vers la gauche"
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr "séquencer les régions"
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "build_region_boundary_cache appelé avec snap_type = %1"
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "Nouveau repère de position"
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "ajouter des repères"
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "effacer les repères"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "effacer les intervalles"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "effacer les repères temporels"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "insertion de région"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "remonter les régions"
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "remonter la région"
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "remonter les régions tout en haut"
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "remonter la région tout en haut"
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "descendre les régions"
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "descendre la région"
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "descendre les régions tout en bas"
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "renommer la région"
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr "Nouveau nom :"
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "séparer"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "séparer la région dessous"
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "rogner à la sélection"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "placer le point de synchro"
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "supprimer la synchro de région"
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "déplacer les régions à leur position d'origine"
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "replacer la région à sa position initiale"
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "aligner la sélection"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "aligner la sélection (relatif)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "aligner la région"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "Rogner en avant"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "Rogner en arrière"
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "rogner à la boucle"
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "rogner au punch"
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "rogner autour de la région"
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5281,11 +5968,11 @@ msgstr ""
"Ceci est typiquement causé par des greffons qui génèrent une sortie stéréo à "
"partir d'une entrée mono ou vice-versa."
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "Impossible de geler"
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5301,24 +5988,23 @@ msgstr ""
"Geler cette piste affectera ce cheminement à partir du premier départ/"
"insertion."
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "Geler quand même"
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr "Ne pas geler"
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "Limites du gel"
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Annuler le gel"
-#: editor_ops.cc:3854
-#, fuzzy
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5326,53 +6012,52 @@ msgid ""
"\n"
"You can do this without processing, which is a different operation."
msgstr ""
-"Opération impossible: le traitement du signal sur une ou plusieurs Pistes va "
-"créer une ou plusieurs Régions avec plus de canaux que la ou les Pistes ont "
-"d'entrées.\n"
+"Opération impossible: le traitement du signal va obliger au moins une piste "
+"à contenir une région ayant plus de canaux que la piste a d'entrées.\n"
"\n"
"Vous pouvez faire cela sans traitement, ce qui est une opération différente."
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr "Impossible de « bouncer »"
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "« bouncer » l'intervalle"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr "effacer"
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "couper"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "copier"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "effacer"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr "objets"
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "supprimer la région"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "dupliquer la sélection"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "décaler la piste"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5380,138 +6065,158 @@ msgstr ""
"Voulez-vous vraiment supprimer le dernier enregistrement ?\n"
"(Cette opération est destructive et ne pourra pas être annulée)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Non, ne rien faire."
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Oui, la détruire."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "Supprimer la dernière capture"
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "normaliser"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "inverser les régions"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "supprimer le silence"
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "Séparer région(s)"
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr "Impossible de délier %1"
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "réinitialiser le gain"
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr "enveloppe de gain de la région active"
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "verrouiller/déverrouiller la région"
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr "Basculer le verrou vidéo"
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "type de verrouillage de la région"
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "changer l'opacité de la région"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
#, fuzzy
msgid "fade range"
msgstr "intervalle de fondu"
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "définir la durée de montée"
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "définir la durée de descente"
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "définir la forme de la montée"
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "définir la forme de la descente"
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "active la montée"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "active la descente"
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "régler l'intervalle de boucle sur la sélection"
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "régler l'intervalle de boucle sur la région"
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "régler l'intervalle de « punch » sur la sélection"
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
+msgstr "Définir le début et la fin de la session depuis la sélection "
+
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "régler l'intervalle de « punch » sur la région"
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "Ajouter un nouveau repère"
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "Définir le tempo global"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "Définir une mesure"
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
"Voulez-vous définir le tempo global ou ajouter un nouveau repère de tempo ?"
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "Définir le tempo depuis la région"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "scinder les régions"
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5523,11 +6228,11 @@ msgstr ""
"en %2 parties.\n"
"Cela peut prendre un certain temps."
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr "Appeler le Fureteur !"
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5535,53 +6240,53 @@ msgstr ""
"Appuyer sur OK pour poursuivre cette séparation\n"
"ou « Demander au Fureteur » pour affiner l'analyse"
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr "Appuyer sur OK pour éxécuter la séparation"
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "Trop de séparations ?"
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr "placer transitoire"
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "aligner les régions sur la grille"
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr "Combler les écarts de région"
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "Longueur du fondu enchaîné"
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr "ms"
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
#, fuzzy
msgid "Pull-back length"
msgstr "Durée du retrait"
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr "Ok"
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr "combler les écarts de région"
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "Mauvaise nouvelleâ¦"
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5596,23 +6301,19 @@ msgstr ""
"Si vous voulez vraiment le faire, éditez le fichier ardour.rc\n"
"et passez l'option « allow-special-bus-removal » à « yes »"
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "pistes"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
msgid "track"
-msgstr "piste"
+msgid_plural "tracks"
+msgstr[0] "piste"
+msgstr[1] "pistes"
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "bus"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
msgid "bus"
-msgstr "bus"
+msgid_plural "busses"
+msgstr[0] "bus"
+msgstr[1] "bus"
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5625,7 +6326,7 @@ msgstr ""
"Le fichier de session sera écrasé et cette action ne pourra pas être "
"annulée !"
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5638,8 +6339,7 @@ msgstr ""
"Le fichier de session sera écrasé et tette action ne pourra pas être "
"annulée !"
-#: editor_ops.cc:6833
-#, fuzzy
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5647,148 +6347,149 @@ msgid ""
msgstr ""
"Voulez-vous vraiment supprimer %1 %2Â ?\n"
"\n"
-"Le fichier de session sera écrasé et tette action ne pourra pas être "
+"Le fichier de session sera écrasé et cette action ne pourra pas être "
"annulée !"
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "Oui, supprimer."
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Oui, supprimer."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "Supprimer %1"
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "insérer temps"
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr "La fenêtre courante ne peux pas afficher toutes les pistes"
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr "Sél"
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr "Vue %u sauvegardée"
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "rendre les régions muettes"
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "rendre la région muette"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "joindre les régions"
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr "disjoindre les régions"
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr "%1 : verrouillé"
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr "Cliquer pour déverrouiller"
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr "Déplacer les fichiers embarqués dans le dossier de session"
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr "Nom de région avec nombre de canaux entre crochets"
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "Position de début de la région"
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "Fin"
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "Position de la fin de la région"
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "Longueur de la région"
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
"Position du point de synchronisation de la région relativement au début de "
"la région"
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
"Longueur du fondu d'entrée de la région (unités : horloge secondaire), () si "
"désactivé"
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
"Longueur du fondu de sortie de la région (unités : horloge secondaire), () "
"si désactivé"
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
msgstr "L"
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "Position de la région verrouillée ?"
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr "G"
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr "Position de la région collée au temps des Mesures|Temps ?"
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "Région muette ?"
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
msgstr "O"
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr "Région opaque (empêche les régions en dessous d'être entendues) ?"
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Caché"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr " (MANQUANT)"
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -5796,180 +6497,188 @@ msgstr ""
"Voulez-vous vraiment supprimer les régions non-utilisées ?\n"
"(Cette opération est destructive et ne pourra pas être annulée)"
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "Oui, supprimer."
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "Supprimer les régions non-utilisées"
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr "EditorRegions::format_position: la position a un timecode négatif: %1"
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "Mult."
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "Début"
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "Multiple"
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "(MANQUANT)"
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr "SS"
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "Nom de piste/bus"
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "Piste/bus visible ?"
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "Piste/bus actif ?"
-# Short for Input
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "E"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr "I"
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "Entrée MIDI activée"
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "Enregistrement armé"
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr "Protégé contre l'enregistrement"
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "Muet"
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "Solo"
-#: editor_routes.cc:213
-msgid "SI"
-msgstr "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "Solo isolé"
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "Bloquer le solo"
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Tout cacher"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Afficher toutes les pistes audio"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Cacher toutes les pistes audio"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Afficher tous les bus"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Cacher tous les bus"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "Afficher toutes les pistes MIDI"
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "Cacher toutes les pistes MIDI"
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Afficher les pistes ayant une région sous la tête de lecture"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
+"Ne montrer que les pistes ayant des régions au niveau de la tête de lecture"
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Nouveau repère temporel"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "Supprimer tous les repères temporels"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr "Réafficher les repères temporels"
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr "Nouvel intervalle"
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "Supprimer tous les intervalles"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr "Ré-afficher les intervalles masqués"
#: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr ""
+msgid "New Loop range"
+msgstr "Nouvel intervalle de bouclage"
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr "Nouveau repère de piste de CD"
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Nouveau tempo"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Nouvelle signature"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr "Renommer le cliché"
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr "Nouveau nom du cliché"
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
@@ -5977,82 +6686,92 @@ msgstr ""
"Voulez-vous vraiment supprimer le cliché « %1 » ?\n"
"(Cette action ne pourra pas être annulée)"
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr "Supprimer le cliché"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "ajouter"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "ajouter un changement de tempo"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "ajouter"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "ajouter un changement de signature"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "terminé"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "remplacer le changement de signature"
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "remplacer le changement de tempo"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "supprimer le changement de tempo"
-#: editor_tempodisplay.cc:370
-#, fuzzy
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
-"programming error: meter marker canvas item has no marker object pointer!"
#: editor_timefx.cc:68
msgid "stretch/shrink"
msgstr "étirer/contracter"
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
-msgstr "pitch shift"
+msgstr "modifier la tonalité"
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr "impossible de démarrer timefx : erreur de création de thread"
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr "Panneau de contrôle des appareils"
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr "Configuration des appareils MIDI"
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr "Utiliser des E/S avec tampon"
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr "Mesurer"
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr "Utiliser les résultats"
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr "Retour aux réglages⦠(ignorer les résultats)"
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr "Calibrer l'audio"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr "Retour aux réglages"
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
@@ -6063,11 +6782,11 @@ msgstr ""
"(C'est une erreur système/d'empaquetage/de compilation. Cela ne devrait "
"jamais se produire.)"
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr "Outil de mesure de latence"
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
@@ -6075,91 +6794,101 @@ msgstr ""
"<span weight=\"bold\">Réglez le volume sur votre équipement audio à très "
"faible niveau.</span>"
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
"Choisissez deux canaux ci-dessous et connectez-les à l'aide d'un câble."
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr "Canal de sortie"
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr "Canal d'entrée"
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "Une fois les canaux connectés, cliquez sur le bouton « Mesurer »."
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
"Lorsque vous êtes satisfait des résultats, cliquez sur le bouton « Utiliser "
"les résultats »."
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr "Aucun résultat de mesure pour le moment"
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Latence"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr "Système audio :"
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "Pilote :"
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "Périphérique d'entrée :"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "Périphérique de sortie :"
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr "Appareil :"
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "Fréquence d'échantillonnage :"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "Taille du tampon :"
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "Périodes :"
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr "Canaux d'entrée :"
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr "Canaux de sortie :"
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "Latence matérielle en entrée :"
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "échantillons"
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "Latence matérielle en sortie :"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
-msgstr ""
+msgstr "Système MIDI :"
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-"Le moteur audio %1 a été configuré et démarré extérieurement.\n"
-"Cela limite votre contrôle."
+"%1 est déjà lancé. %2 va s'y connecter en utilisant les réglages existants."
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
@@ -6169,7 +6898,7 @@ msgstr ""
"\n"
"La calibration de latence nécessite une interface audio fonctionnelle."
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6180,185 +6909,218 @@ msgstr ""
"\n"
"La calibration de latence nécessite lecture et enregistrement."
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr "Appareils MIDI"
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr "Interface audio"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr "Latences matérielles"
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr "Calibrer"
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr "tous les canaux disponibles"
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "échantillons"
-msgstr[1] "échantillons"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 échantillon"
+msgstr[1] "%1 échantillons"
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
-msgstr ""
+msgstr "(%.1f ms)"
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr "Impossible de démarrer le moteur %1"
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr "Impossible de régler le pilote sur %1"
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr "Impossible de nommer l'appareil %1"
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr "Impossible de régler la fréquence dâéchantillonnage sur %1"
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr "Impossible de régler la taille du tampon à %1"
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr "Impossible de régler le nombre de périodes sur %1"
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr "Impossible de régler les canaux d'entrée sur %1"
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr "Impossible de régler les canaux de sortie sur %1"
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr "Impossible de régler la latence d'entrée sur %1"
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr "Impossible de régler la latence de sortie sur %1"
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr "Aucun signal détecté"
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "Non connecté au moteur audio"
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr "Latence aller-retour détectée : "
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr "Latence systémique : "
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr "(erreur de détection du signal)"
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr "(inversé â mauvais branchements)"
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr "(moyenne)"
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr "(gigue trop importante)"
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr "(gigue importante)"
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr "Délai dépassé â gigue MIDI importante."
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "Détectionâ¦"
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr "Déconnecter de %1"
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Actif"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr "En fonctionnement"
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr "Connecté"
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr "Connecter à %1"
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr ""
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Arrêt"
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Canaux :"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "Scinder en fichiers mono"
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr "Piste ou Bus"
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "Contenu de région sans fondus ni gain (canaux : %1)"
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "Contenu de région avec fondu et gain (canaux : %1)"
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr "Sortie de piste (canaux : %1)"
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "Exporter le contenu de la région"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "Exporter la sortie de piste"
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
-#: export_dialog.cc:46
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
"<span color=\"#ffa755\">Des fichiers existants vont être écrasés.</span>"
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr "Liste des fichiers"
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr "Format de fichier"
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr "Période"
@@ -6386,27 +7148,43 @@ msgstr "Ãchec de l'initialisation de l'exportation : %1"
msgid "Stop Export"
msgstr "Arrêter l'exportation"
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr "Exporter"
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Exportation de « %3 » (période %1 sur %2)"
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
-msgstr "Normalisation de « %3 » (période %1 de %2)"
+msgstr "Normalisation de « %3 » (période %1 sur %2)"
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Exportation de « %3 » (période %1 de %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "Ãtiquetage de « %3 » (période %1 sur %2)"
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "Téléversement de « %3 » (période %1 sur %2)"
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">Erreur : "
-#: export_dialog.cc:385
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">Avertissement : "
-#: export_dialog.cc:387
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6414,19 +7192,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">Avertissement : "
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr "Exporter la selection"
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr "Exporter la région"
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr "Source"
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr "Export fragment"
@@ -6434,65 +7212,77 @@ msgstr "Export fragment"
msgid "Add another format"
msgstr "Ajouter un autre format"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Format"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Emplacement"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr "Envoyer sur Soundcloud"
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "Aucun format !"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "Format %1Â : %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "Libellé :"
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "Nom de la session"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "Révision :"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Dossier :"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Parcourir"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Créer le(s) nom(s) de fichier(s) à partir de ces composants :</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
-"<small><i>Désolé, aucun exemple de noe de fichier ne peut être montré pour "
+"<small><i>Désolé, aucun exemple de nom de fichier ne peut être montré pour "
"le moment</i></small>"
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Nom de fichier (approximatif) actuel : « %1 »</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
@@ -6502,112 +7292,195 @@ msgstr ""
"Le nom du fichier sera choisi à partir des informations juste au dessus de "
"sélecteur de dossier."
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "Choisir le dossier d'export"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "Nouveau profil de format d'export"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "Ãdition du profil de format d'export"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "Libellé : "
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normaliser à  :"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normaliser :"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Crête"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "Couper le silence du début"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "Ajouter du silence au début :"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "Couper le silence de fin"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "Ajouter du silence à la fin :"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-"Commande à lancer après l'export\n"
-"(%f = chemin complet et nom de fichier, %d = répertoire, %b = nom de base) :"
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "Compatibilité"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "Qualité"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "Qualité du ré-échantillonage :"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "Interpolation"
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr "Créer un fichier CUE pour la création de CD / DVD"
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "Créer un fichier TOC pour la création de CD / DVD"
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "Taguer le fichier avec les méta-données de session"
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a Nom de l'artiste\n"
+"%b Nom du fichier\n"
+"%c Copyright\n"
+"%d Répertoire du fichier\n"
+"%f Chemin absolu complet du fichier\n"
+"%l Parolier\n"
+"%n Nom de la session\n"
+"%o Chef d'orchestre\n"
+"%t Titre\n"
+"%z Organisation\n"
+"%A Album\n"
+"%C Commentaire\n"
+"%E Ingénieur\n"
+"%G Genre\n"
+"%L Nombre total de pistes\n"
+"%M Mixeur\n"
+"%N Nom de la période\n"
+"%O Compositeur\n"
+"%P Producteur\n"
+"%S Sous-titre du disque\n"
+"%T Numéro de piste\n"
+"%Y Année\n"
+"%Z Pays"
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "Meilleure (sinc)"
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "Moyenne (sinc)"
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "Rapide (sinc)"
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
#, fuzzy
msgid "Zero order hold"
msgstr "Interpolation répétitive (ZOH)"
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "Options pour l'encodage linéaire"
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "Options Ogg Vorbis"
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "Options FLAC"
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "Option Broadcast Wave"
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr "Voulez-vous vraiment enlever le format ?"
@@ -6615,7 +7488,7 @@ msgstr "Voulez-vous vraiment enlever le format ?"
msgid "Preset"
msgstr "Préréglage"
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
@@ -6623,23 +7496,203 @@ msgstr ""
"Le préréglage n'a pas pu être chargé !\n"
"Peut-être qu'il fait référence à un format qui a été supprimé ?"
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr "Voulez-vous vraiment enlever ce préréglage ?"
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format :"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr "%1 Hz"
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+#, fuzzy
+msgid "Duration:"
+msgstr "Durée :"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Impossible de lire le fichier « %1 » (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Impossible d'accéder au fichier audio : "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr "Temps exprimés en :"
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr ""
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
msgid "Select All"
msgstr "Sélectionner tout"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr " Ã "
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
msgid "Range"
msgstr "Intervalle"
@@ -6656,36 +7709,39 @@ msgstr "getSoundResourceFile: Aucune racine valide dans le fichier xml"
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr "%1"
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Mode d'automation du gain"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Type d'automation du gain"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr "abs"
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "P"
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr "T"
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr "W"
@@ -6693,52 +7749,57 @@ msgstr "W"
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Réglages prédéfinis</span>"
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
#, fuzzy
msgid "Manual"
msgstr "Manuel"
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
#, fuzzy
msgid "All Automation"
msgstr "Afficher toute l'automation"
-# ?
#: generic_pluginui.cc:250
-#, fuzzy
-msgid "Switches"
-msgstr "Commutateurs"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Contrôles"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"Ãditeur de greffon : impossible de construire l'élément de contrôle pour le "
"port %1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
-msgstr ""
+msgstr "Editeur de greffon : pas de contrôleur pour la propriété %1"
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
+"Editeur de greffon : impossible de créer le contrôleur pour la propriété %1"
-#: generic_pluginui.cc:468
-msgid "Meters"
-msgstr "Signatures"
+# ?
+#: generic_pluginui.cc:359
+#, fuzzy
+msgid "Switches"
+msgstr "Commutateurs"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Contrôles"
+
+#: generic_pluginui.cc:510
+msgid "Meters"
+msgstr "Indicateurs"
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Contrôle d'automation"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr "Manuel"
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "Gestionnaire de connexion audio"
@@ -6747,131 +7808,166 @@ msgstr "Gestionnaire de connexion audio"
msgid "MIDI Connection Manager"
msgstr "Gestion des connexions MIDI"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Déconnecter"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "port"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "Sélectionnéesâ¦"
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "Arméesâ¦"
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "En soloâ¦"
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "Créer un nouveau groupe à partir de..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "Créer un nouveau groupeâ¦"
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "Créer un nouveau groupe à partir de"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "Ãditer le groupeâ¦"
# à l'air de changer la couleurâ¦
-#: group_tabs.cc:325
-#, fuzzy
+#: group_tabs.cc:356
msgid "Collect Group"
-msgstr "Former un Groupe"
+msgstr "Réunir dans un groupe"
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "Enlever le groupe"
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr "Enlever le bus sous-groupe"
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "Ajouter un sous-groupe de bus"
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr "Ajouter un nouveau bus auxiliaire (pre-fader)"
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr "Ajouter un nouveau bus auxiliaire (post-fader)"
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr "Activer tous les groupes"
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "Désactiver tous les groupes"
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr "Temps à insérer :"
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr "Les régions ayant une intersection devraient :"
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr "rester en place"
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
-msgstr "être bougées"
+msgstr "être déplacées"
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr "être séparées"
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Insérer du temps sur toutes les playlists de la piste"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr "Déplacer les régions collées"
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr "Déplacer les repères"
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr "Déplacer les repères collés"
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr "Déplacer les repères verrouillés"
-#: insert_time_dialog.cc:83
-#, fuzzy
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
"Changer le tempo et le rythme\n"
-"<i>(cela peut causer une table de Tempo bizarre)</i>"
+"<i>(cela peut causer une table de tempo bizarre)</i>"
+
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr "Insérer temps"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "aucun"
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "Import du fichier : %1 sur %2"
@@ -6879,77 +7975,96 @@ msgstr "Import du fichier : %1 sur %2"
msgid "I/O selector"
msgstr "Sélecteur E/S"
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "Entrée %1"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "sortie %1"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr "votre propre"
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
"Raccourcis clavier par défaut introuvables - Il sera difficile d'utiliser "
"%1Â !"
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
"Fichier de raccourcis clavier « %1 » non trouvé. Utilisation des raccourcis "
"par défaut."
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Raccourcis clavier"
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr "Supprimer le raccourci"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Action"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Raccourci"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-"Sélectionnez une action, puis appuyez sur la touche pour définir le raccourci"
-# Only Keyboard or also control surfaces ?
-#: keyeditor.cc:98
-#, fuzzy
-msgid "Reset Bindings to Defaults"
-msgstr "Réinitialiser les raccourcis claviers par défaut"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr ""
-#: keyeditor.cc:263
-#, fuzzy
-msgid "Main_menu"
-msgstr "Menu_Principal"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr "Réinitialiser les raccourcis par défaut"
-#: keyeditor.cc:265
-#, fuzzy
-msgid "redirectmenu"
-msgstr "menuredirigé"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Action"
-#: keyeditor.cc:267
-#, fuzzy
-msgid "Editor_menus"
-msgstr "Menus_Ãditeur"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Raccourci"
-#: keyeditor.cc:269
+#: keyeditor.cc:370
#, fuzzy
msgid "RegionList"
msgstr "ListeDeRégion"
-#: keyeditor.cc:271
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
#, fuzzy
-msgid "ProcessorMenu"
-msgstr "MenuProcesseur"
+msgid "sample"
+msgstr "échantillon"
#: latency_gui.cc:40
msgid "msec"
@@ -6959,109 +8074,217 @@ msgstr "ms"
msgid "period"
msgstr "période"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 échantillon"
-msgstr[1] "%1 échantillons"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:421
msgid "Reset"
msgstr "Réinitialiser"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "programming error : %1 (%2)"
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "Utiliser TDL"
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "Aller à "
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "Coller"
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr "Exécutant :"
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr "Compositeur :"
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "Pré-accentuation"
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr "Supprimer cet intervalle"
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr "Temps de début â clic du milieu pour se positionner ici"
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr "Temps de fin â clic du milieu pour se positionner ici"
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr "Régler le début de l'intervalle à la position de la tête de lecture"
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr "Régler la fin de l'intervalle à la position de la tête de lecture"
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr "Supprimer ce repère"
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr "Position â clic du milieu pou se positionner ici"
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr "Placer le repère en fonction de la position de la tête de lecture"
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "Vous ne pouvez pas mettre un repère de CD au début de la session"
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr "Nouveau repère"
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr "Nouvel intervalle"
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>Intervalles de boucle et « punch »</b>"
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>Repères (Y compris index de CD)</b>"
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>Intervalles (Y compris intervalles de piste CD)</b>"
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "ajouter un repère d'intervalle"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr "%1 ne peut pas se connecter au moteur audio."
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr "Le moteur audio (%1) n'a pas fonctionné ou s'est arrêté"
-#: main.cc:110
+#: main.cc:138
#, fuzzy
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
@@ -7070,40 +8293,41 @@ msgid ""
"\n"
"Click OK to exit %1."
msgstr ""
-"%2 fermé de manière inattendue, sans rien notifier à %1.\n"
+"%2 s'est terminé de manière inattendue, sans rien notifier à %1.\n"
"\n"
-"Ceci pourrait venir d'erreur ou mauvaise configuration dans %2.\n"
+"Ceci pourrait venir d'une erreur ou d'une mauvaise configuration dans %2.\n"
"\n"
-"Cliquer sur OK pour fermer %1."
+"Cliquer OK pour fermer %1."
-#: main.cc:124
-#, fuzzy
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
-msgstr "%2 fermé de manière inattendue, et sans rien notifier à %1."
+msgstr "%2 s'est terminé de manière inattendue, et sans rien notifier à %1."
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
+"\n"
+" %1 n'a pas pu interpréter votre ligne de commande "
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
-msgstr ""
+msgstr "Une erreur a été rencontrée au lancement de %1"
-#: main.cc:310
+#: main.cc:346
msgid " (built using "
msgstr " (construit avec "
-#: main.cc:313
+#: main.cc:349
msgid " and GCC version "
msgstr " et GCC version "
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Copyright © 1999-2012 Paul Davis"
+#: main.cc:359
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr "Copyright © 1999-2015 Paul Davis"
-#: main.cc:324
+#: main.cc:360
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -7111,48 +8335,67 @@ msgstr ""
"Pour certaines parties, Copyright © Steve Harris, Ari Johnson, Brett Viren, "
"Joel Baker, Robin Gareus"
-#: main.cc:326
+#: main.cc:362
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 est distribué sans AUCUNE GARANTIE"
-#: main.cc:327
+#: main.cc:363
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-msgstr "pas même de COMMERCIALISATION ou d'ADÃQUATION à UN BUT PARTICULIER."
+msgstr "pas même de COMMERCIABILISATION ou d'ADÃQUATION à UN BUT PARTICULIER."
-#: main.cc:328
+#: main.cc:364
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Ceci est un logiciel libre, et vous êtes encouragé à le distribuer "
-#: main.cc:329
+#: main.cc:365
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"sous certaines conditions ; voir le fichier source pour les conditions de "
"distribution."
-#: main.cc:334
+#: main.cc:370
msgid "could not initialize %1."
msgstr "impossible d'initialiser %1."
-#: main.cc:344
+#: main.cc:380
msgid "Cannot xinstall SIGPIPE error handler"
+msgstr "Impossible d'installer le gestionnaire d'erreurs SIGPIPE"
+
+#: main.cc:387
+msgid "Could not complete pre-GUI initialization"
msgstr ""
-#: main.cc:351
-#, fuzzy
+#: main.cc:394
msgid "could not create %1 GUI"
-msgstr "IHM %1 impossible à créer"
+msgstr "Impossible de créer l'interface de %1"
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr "Afficher le delta par rapport au curseur d'édition"
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "Ãdition du tempo"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "Ãditer signature"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr "Insérer un changement de tempo"
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr "Insérer un changement de signature"
+
+#: marker.cc:280
msgid "MarkerText"
msgstr "MarkerText"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Aucun"
@@ -7193,10 +8436,10 @@ msgstr "Enregistrer seulement les canaux sélectionnés"
msgid "Force all channels to 1 channel"
msgstr "Forcer tous les canaux sur 1 canal"
-# context is missing, translation says something like "entering"
+# context: midi selector dialog (Inbound/Playback)
#: midi_channel_selector.cc:376
msgid "Inbound"
-msgstr "Entrant"
+msgstr "Entrée"
#: midi_channel_selector.cc:396
msgid "Click to enable recording all channels"
@@ -7235,11 +8478,11 @@ msgstr "Cliquer pour basculer la lecture du canal %1"
msgid "Click to force all MIDI channel messages to channel %1"
msgstr "Cliquer pour forcer tous les message des canaux MIDI vers le canal %1"
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr "Cliquer pour basculer l'enregistrement du canal %1"
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr "Cliquer pour forcer tous les canaux enregistrés à %1"
@@ -7351,199 +8594,195 @@ msgstr "éditer le canal"
msgid "velocity edit"
msgstr "éditer la vélocité"
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr "ajouter une note"
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
#, fuzzy
msgid "step add"
msgstr "Ajouter Pas-Ã -pas"
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
#, fuzzy
msgid "alter patch change"
msgstr "Modifier le changement de patch"
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
#, fuzzy
msgid "add patch change"
msgstr "Ajouter le changement de patch"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
#, fuzzy
msgid "move patch change"
msgstr "Déplacer le changement de patch"
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
#, fuzzy
msgid "delete patch change"
msgstr "Effacer le changement de patch"
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr "supprimer la sélection"
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr "supprimer la note"
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr "déplacer les notes"
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
#, fuzzy
msgid "change velocities"
msgstr "Changer les vélocités"
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr "transposer"
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr "modifier la durée de la note"
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr "décaler"
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr "changer le canal"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr "Banque"
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "Programme"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr "Canal"
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "coller"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
-msgstr ""
+msgstr "Tentative de création de région MIDI sans source"
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
-msgstr ""
+msgstr "Tentative de création de région MIDI sans modèle"
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr "Echec lors de la création de la région MIDI"
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "Appareil MIDI externe"
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "Mode appareil externe"
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr "Canx"
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr "Clique pour éditer les réglage du canal"
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "Afficher l'ensemble de l'intervalle"
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "Au contenu"
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "Intervalle de note"
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "Mode note"
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr "Sélecteur de canal"
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Mode couleur"
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
#, fuzzy
msgid "Bender"
msgstr "Tirer la note"
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "Pression"
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr "Contrôleurs"
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "Aucun canal MIDI sélectionné"
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "Cacher tous les canaux"
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "Afficher tous les canaux"
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "Canal %1"
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "Contrôleurs %1-%2"
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr "Contrôleur %1"
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "Longue"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "Percussive"
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "Couleurs du bargraphe"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "Couleur du canal"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Couleur de la piste"
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr "tout"
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr "certains"
@@ -7559,7 +8798,7 @@ msgstr "Défilement automatique"
msgid "Decimal"
msgstr "Décimal"
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "Activé"
@@ -7575,36 +8814,36 @@ msgstr "Port :"
msgid "New velocity"
msgstr "Nouvelle vélocité"
-#: missing_file_dialog.cc:35
-#, fuzzy
+#: missing_file_dialog.cc:36
msgid "Missing File"
-msgstr "Fichier manquant !"
+msgstr "Fichier manquant"
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr "Choisir le dossier pour la recherche"
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr "Ajouter le dossier aux chemins de recherche, et essayer à nouveau"
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr "Arrêter le chargement de la session"
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr "Ignorer tous les fichiers manquants"
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr "Ignorer ce fichier"
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "audio"
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7624,7 +8863,7 @@ msgstr ""
"<tt>%4</tt>\n"
"\n"
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr "Cliquez pour choisir un dossier supplémentaire"
@@ -7632,112 +8871,40 @@ msgstr "Cliquez pour choisir un dossier supplémentaire"
msgid "Missing Plugins"
msgstr "Greffons manquants"
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-#, fuzzy
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Basculer Solo sur les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:56
-#, fuzzy
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Basculer Muet sur les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:57
-#, fuzzy
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Basculer Enreg-Armé les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:58
-#, fuzzy
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Baisser le gain pour les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:59
-#, fuzzy
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Augmenter le gain pour les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:60
-#, fuzzy
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Gain à 0dB pour les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:63
-#, fuzzy
-msgid "Copy Selected Processors"
-msgstr "Copier les traitements sélectionnés"
-
-#: mixer_actor.cc:64
-#, fuzzy
-msgid "Cut Selected Processors"
-msgstr "Enlever les traitements sélectionnés"
-
-#: mixer_actor.cc:65
-#, fuzzy
-msgid "Paste Selected Processors"
-msgstr "Coller les traitements sélectionnés"
-
-#: mixer_actor.cc:66
-#, fuzzy
-msgid "Delete Selected Processors"
-msgstr "Enlever les traitements sélectionnés"
-
-#: mixer_actor.cc:67
-#, fuzzy
-msgid "Select All (visible) Processors"
-msgstr "Sélectionner tous les traitements (visibles)"
-
-#: mixer_actor.cc:68
-#, fuzzy
-msgid "Toggle Selected Processors"
-msgstr "Basculer les traitements sélectionnés"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Activer/désactiver le greffon sélectionné"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:72 mixer_actor.cc:73
-#, fuzzy
-msgid "Scroll Mixer Window to the left"
-msgstr "Défiler vers la gauche de la Console"
-
-#: mixer_actor.cc:75
-#, fuzzy
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Pour les Pistes/Bus sélectionnés-Console, activer l'entrée MIDI"
-
-#: mixer_actor.cc:90
-#, fuzzy
-msgid "Loaded mixer bindings from %1"
-msgstr "Réglages de Console chargées depuis %1"
-
-#: mixer_actor.cc:92
-#, fuzzy
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Réglages de Console introuvables dans %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "pré"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1540
+#: mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr "Commentaires"
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr "Cliquer pour changer la largeur de la tranche de mixage."
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -7745,315 +8912,483 @@ msgstr ""
"\n"
"%1-%2-clic pour basculer la largueur de toutes les tranches."
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr "Cacher cette tranche de mixage"
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr "Cliquer pour choisir le point de mesure"
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr "Isoler le Solo"
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr "Verrouiller le statut Solo"
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr "Verr."
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr "Iso."
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "Groupe de mixage"
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
#, fuzzy
msgid "Phase Invert"
msgstr "Inverseur de phase"
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
-#, fuzzy
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
-msgstr ": moniteur"
+msgstr "Enregistrement & monitoring"
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
#, fuzzy
msgid "Solo Iso / Lock"
msgstr "Iso. / ver. solo"
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr "Afficher/Cacher la section d'écoute de contrôle"
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr "Activer/désactiver l'entrée MIDI"
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
#, fuzzy
msgid "Aux"
msgstr ""
"Départs\n"
"Aux"
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
#, fuzzy
msgid "Snd"
msgstr "Dép"
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
#, fuzzy
msgid "Not connected to audio engine - no I/O changes are possible"
-msgstr "Déconnecté du moteur Audio: pas de changement E/S possible"
+msgstr "Déconnecté du moteur Audio : pas de modification d'E/S possible"
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
-msgstr ""
+msgstr "Ajouter un port %1"
-#: mixer_strip.cc:840 mixer_strip.cc:942
-#, fuzzy
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
-msgstr "Routine des départs"
+msgstr "Grille de routage"
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr "MIDI "
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr "<b>ENTRÃE</b> vers %1"
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>SORTIE</b> depuis %1"
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr "Déconnecté"
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Commentaires*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
msgid "Cmt"
msgstr "Cmt"
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Cmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Cliquer pour ajouter ou modifier les commentaires"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr "Grp"
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr "~G"
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Couleurâ¦"
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr "Commentairesâ¦"
-#: mixer_strip.cc:1509 route_time_axis.cc:565
-#, fuzzy
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
-msgstr "Entrées"
+msgstr "Entrées..."
-#: mixer_strip.cc:1511 route_time_axis.cc:567
-#, fuzzy
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
-msgstr "Sorties"
+msgstr "Sorties..."
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr "Sauvegarder comme modèleâ¦"
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Actif"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "E/S strictes"
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr "Ajuster les connexions"
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr "Ajuster la latenceâ¦"
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr "Protèger contre les dénormalisations"
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "ID de télécommandeâ¦"
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "Dupliquer..."
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
#, fuzzy
msgid "Pre"
msgstr "pré"
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
#, fuzzy
msgid "Post"
msgstr "Post"
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
msgstr ""
-#: mixer_strip.cc:1860
-#, fuzzy
-msgid "C"
-msgstr "Ajouter un do"
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
+msgstr ""
+
+#: mixer_strip.cc:2028
+msgid "Meter|O"
+msgstr ""
+
+#: mixer_strip.cc:2033
+msgid "Meter|C"
+msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr "Disque"
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr "AFL"
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr "PFL"
-# Short for Device Output
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "S"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
-#: mixer_strip.cc:2241
-msgid "Pre Fader"
-msgstr "Pré-atténuation"
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
+
+#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
+msgid "Pre Fader"
+msgstr "Pré-atténuation"
+
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Post-atténuation"
-#: mixer_strip.cc:2286 meter_strip.cc:847
-#, fuzzy
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
-msgstr "Tout dans le groupe en %1"
+msgstr "Changer tout dans le groupe en %1"
-#: mixer_strip.cc:2288 meter_strip.cc:849
-#, fuzzy
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
-msgstr "Tout en %1"
+msgstr "Changer tout en %1"
-#: mixer_strip.cc:2290 meter_strip.cc:851
-#, fuzzy
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
-msgstr "Toutes les Pistes du même type en %1"
+msgstr "Toutes les pistes du même type en %1"
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Groupe"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "Greffons favoris"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr ""
"élément de liste d'affichage de piste introuvable pour la tranche renommée !"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-tout-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Tranches"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "Ajouter au début"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "Ajouter pré-atténuation"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "Ajouter après atténuation"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "Ajouter à la fin"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Retirer des favoris"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Supprimer le préréglage"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Basculer Solo sur les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Basculer Muet sur les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "(Dés)armer l'enregistrement des Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Baisser le gain pour les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Augmenter le gain pour les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Gain à 0dB pour les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2747
+#, fuzzy
+msgid "Copy Selected Processors"
+msgstr "Copier les traitements sélectionnés"
+
+#: mixer_ui.cc:2748
+#, fuzzy
+msgid "Cut Selected Processors"
+msgstr "Couper les traitements sélectionnés"
+
+#: mixer_ui.cc:2749
+#, fuzzy
+msgid "Paste Selected Processors"
+msgstr "Coller les traitements sélectionnés"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Supprimer les traitements sélectionnés"
+
+#: mixer_ui.cc:2751
+#, fuzzy
+msgid "Select All (visible) Processors"
+msgstr "Sélectionner tous les traitements (visibles)"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "(Dés)Activer les traitements sélectionnés"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Activer/désactiver le greffon sélectionné"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Désélectionner toutes les tranches et traitements"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+#, fuzzy
+msgid "Scroll Mixer Window to the left"
+msgstr "Défiler vers la gauche de la Console"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+"Activer l'entrée MIDI des Pistes/Bus sélectionnés dans la console, activer "
+"l'entrée MIDI"
+
+#: meter_strip.cc:160
msgid "Reset Peak"
+msgstr "Réinitialiser crête"
+
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
msgstr ""
-#: meter_strip.cc:883
+#: meter_strip.cc:894
#, fuzzy
msgid "Variable height"
msgstr "Hauteur variable"
-#: meter_strip.cc:884
+#: meter_strip.cc:895
#, fuzzy
msgid "Short"
msgstr "Petit"
-#: meter_strip.cc:885
+#: meter_strip.cc:896
#, fuzzy
msgid "Tall"
msgstr "Moyen"
-#: meter_strip.cc:886
+#: meter_strip.cc:897
#, fuzzy
msgid "Grande"
msgstr "Grand"
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-#, fuzzy
-msgid "Peak"
-msgstr "Pic"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
#, fuzzy
msgid "RMS + Peak"
msgstr "RMS + Crête"
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
#, fuzzy
msgid "IEC1/DIN"
msgstr "Niveau ligne IEC1/DIN, 0 dBu "
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
#, fuzzy
msgid "IEC1/Nordic"
msgstr "IEC1/Nordique"
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
-msgstr ""
+msgstr "VU"
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr "SiP"
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "Solo"
-#: monitor_section.cc:100
+#: monitor_section.cc:117
#, fuzzy
msgid "Isolated"
msgstr "Isolé"
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr "Ãcoute"
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -8061,7 +9396,7 @@ msgstr ""
"Actif lorsque quelque chose est isolé par un solo\n"
"Cliquez pour désactiver tous les solos."
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -8069,158 +9404,219 @@ msgstr ""
"Actif lorsqu'une écoute est en cours\n"
"Cliquez pour stopper l'écoute."
-#: monitor_section.cc:134
+#: monitor_section.cc:152
#, fuzzy
msgid "Solo controls affect solo-in-place"
msgstr "Les controles de Solo affectent le Solo-en-place"
-#: monitor_section.cc:140
+#: monitor_section.cc:158
#, fuzzy
msgid "Solo controls toggle after-fader-listen"
msgstr "Les contrôles de Solo sont Post-Fader"
-#: monitor_section.cc:146
+#: monitor_section.cc:164
#, fuzzy
msgid "Solo controls toggle pre-fader-listen"
msgstr "Les contrôles de Solo sont Pré-Fader"
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+#, fuzzy
+msgid "Excl. Solo"
+msgstr "Solo exclusif"
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "Solo exclusif veut dire qu'un seul solo peut être actif à la fois"
+
+#: monitor_section.cc:179
#, fuzzy
+msgid "Solo » Mute"
+msgstr "Solo » Muet"
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Si actif, le mode solo prend le pas sur le mode muet (une piste muette et en "
+"solo sera audible)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
-msgstr "Volume des signaux en mode solo (0dB est normal)"
+msgstr "Augmentation du gain pour les signaux solo (0dB est normal)"
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr "0 dB"
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr "3 dB"
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr "6 dB"
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr "10 dB"
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr "Gain Solo"
-#: monitor_section.cc:185
-#, fuzzy
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
"Baisse de gain des signaux non-solo\n"
-"Une valeur supérieure à -infini cause \"solo-devant\""
+"Une valeur supérieure à -infini crée un \"solo-mise en avant\""
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr "-6 dB"
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr "-12 dB"
-#: monitor_section.cc:196
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr "-20 dB"
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
#, fuzzy
msgid "SiP Cut"
msgstr "Réduction SeP"
-#: monitor_section.cc:211
-#, fuzzy
+#: monitor_section.cc:240
msgid "Gain reduction to use when dimming monitor outputs"
-msgstr "Réduction de volume (Dim) pour les sorties Monitor"
+msgstr "Réduction de gain pour l'atténuation (Dim) des sorties de monitoring"
+
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr "-3 dB"
-#: monitor_section.cc:225 monitor_section.cc:283
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
#, fuzzy
msgid "Dim"
msgstr "Dim"
-#: monitor_section.cc:235
-#, fuzzy
-msgid "Excl. Solo"
-msgstr "Solo exclusif"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "Solo exclusif veut dire qu'un seul solo peut être actif à la fois"
-
-#: monitor_section.cc:244
-#, fuzzy
-msgid "Solo » Mute"
-msgstr "Solo » Muet"
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr "-30 dB"
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:333
+msgid "Inv"
msgstr ""
-"Si actif, le mode solo prend le pas sur le mode muet (une piste muette et en "
-"solo sera audible)"
-#: monitor_section.cc:323
-#, fuzzy
+#: monitor_section.cc:399
msgid "Monitor"
-msgstr ": moniteur"
+msgstr "Monitoring"
-#: monitor_section.cc:744
-#, fuzzy
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr "Ecoute Mono"
-#: monitor_section.cc:747
-#, fuzzy
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr "Couper l'écoute"
-#: monitor_section.cc:750
-#, fuzzy
+#: monitor_section.cc:903
msgid "Dim monitor"
-msgstr "Dim écoute"
+msgstr "Atténuer l'écoute"
-#: monitor_section.cc:753
-#, fuzzy
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
-msgstr "Basculer mode Solo en exclusif"
+msgstr "Basculer mode Solo exclusif"
-#: monitor_section.cc:759
-#, fuzzy
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
-msgstr "Basculer le mode Solo remplace Muet"
+msgstr "(Dés)Activer le mode muet prioritaire sur solo"
-#: monitor_section.cc:771
-#, fuzzy
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "Canal d'écoute %1 muet"
-#: monitor_section.cc:776
+#: monitor_section.cc:926
#, fuzzy
msgid "Dim monitor channel %1"
-msgstr "Dim écoute canal %1"
+msgstr "Atténuer le canal de monitoring %1"
-#: monitor_section.cc:781
+#: monitor_section.cc:931
#, fuzzy
msgid "Solo monitor channel %1"
-msgstr "Solo écoute canal %1"
+msgstr "Solo sur canal de monitoring %1"
-#: monitor_section.cc:786
-#, fuzzy
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
-msgstr "Inverser la phase du canal %1"
+msgstr "Inverser la phase du canal de monitoring %1"
-#: monitor_section.cc:796
+#: monitor_section.cc:946
#, fuzzy
msgid "In-place solo"
msgstr "Solo-en-Place"
-#: monitor_section.cc:798
+#: monitor_section.cc:948
#, fuzzy
msgid "After Fade Listen (AFL) solo"
msgstr "Solo Après Fader (AFL)"
-#: monitor_section.cc:800
+#: monitor_section.cc:950
#, fuzzy
msgid "Pre Fade Listen (PFL) solo"
msgstr "Solo Pré Fader (PFL)"
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
#, fuzzy
msgid "bypassed"
msgstr "Désactivé"
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr "GÂ : %3d DÂ : %3d"
-#: mono_panner_editor.cc:33
-#, fuzzy
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
+msgid "Panner|L"
+msgstr "G"
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
+msgid "Panner|R"
+msgstr "D"
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
-msgstr "Pan. Mono"
+msgstr "Balance Mono"
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
msgid "%"
msgstr "%"
@@ -8298,10 +9694,6 @@ msgstr ""
"d'Ardour est dépendant du revenu généré par les dons, qui doit être stable\n"
"et permanent. Merci d'utiliser Ardour !"
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nouveau préréglage"
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr "Ãcraser le préréglage avec ce nom"
@@ -8310,6 +9702,10 @@ msgstr "Ãcraser le préréglage avec ce nom"
msgid "Name of new preset"
msgstr "Nom du nouveau préréglage :"
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "Normaliser les régions"
@@ -8318,19 +9714,17 @@ msgstr "Normaliser les régions"
msgid "Normalize region"
msgstr "Normaliser la région"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr "dBFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normaliser à  :"
#: normalize_dialog.cc:56
-#, fuzzy
msgid "Normalize each region using its own peak value"
-msgstr "Normaliser chaque Région selon son propre pic de niveau"
+msgstr "Normaliser chaque Région selon son propre niveau de crête"
#: normalize_dialog.cc:58
-#, fuzzy
msgid "Normalize each region using the peak value of all regions"
-msgstr "Normaliser chaque Région selon le pic de niveau de toutes"
+msgstr "Normaliser chaque Région selon le niveau de crête global"
#: normalize_dialog.cc:73
msgid "Normalize"
@@ -8338,38 +9732,45 @@ msgstr "Normaliser"
#: note_select_dialog.cc:33
msgid "Select Note"
-msgstr ""
+msgstr "Sélectionner une note"
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Utilisation : "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr " [nomsession] Nom de la session à charger\n"
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
" -v, --version Affiche les informations de version\n"
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr " -h, --help Affiche ce message\n"
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr " -a, --no-announcements Ne pas chercher d'annonces sur le site\n"
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
"u -b, --bindings Affiche tous les noms de raccourcis "
"clavier possibles\n"
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+" -B, --bypass-plugins Court-circuiter tous les greffons d'une "
+"session existante\n"
+
+#: opts.cc:68
#, fuzzy
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
@@ -8378,14 +9779,14 @@ msgstr ""
" -c, --name <name> Utiliser un nom de client personnalisé, ardour "
"par défaut\n"
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
" -d, --disable-plugins Désactive tous les greffons d'une session "
"existante\n"
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
@@ -8393,47 +9794,46 @@ msgstr ""
" -D, --debug <options> Définir les drapeaux de débogage. Utiliser « -"
"D list » pour avoir les options disponibles\n"
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
" -n, --no-splash Ne pas afficher l'écran de démarrage\n"
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
" -m, --menus fichier Utiliser « fichier » pour définir les "
"menus\n"
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
" -N, --new nomsession Créer une nouvelle session depuis la "
"ligne de commande\n"
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-" -O, --no-hw-optimizations Désactiver les optimisations matérielles "
+" -O, --no-hw-optimizations Désactiver les optimisations matérielles "
"spécifiques\n"
-#: opts.cc:70
-#, fuzzy
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
-msgstr " -P, --no-connect-ports Sans port connecté au démarrage\n"
+msgstr " -P, --no-connect-ports Ne connecter aucun port au démarrage\n"
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
" -S, --sync\t Dessiner l'interface graphique en mode "
"synchrone\n"
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr ""
" -V, --novst Désactiver la prise en charge des VST\n"
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
@@ -8441,28 +9841,23 @@ msgstr ""
" -E, --save <fichier> Charger la session, la sauvegarder dans "
"« fichier » puis quitter\n"
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr " -C, --curvetest nomfichier Débogueur d'algorithme de courbe\n"
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-" -k, --keybindings nomfichier Nom du fichier des raccourcis claviers "
-"à charger (par défaut ~/.ardour3/ardour.bindings)\n"
-#: panner2d.cc:854
-#, fuzzy
+#: panner2d.cc:896
msgid "Panner (2D)"
-msgstr "Panoramique (2D)"
+msgstr "Balance (2D)"
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "Court-circuiter"
-#: panner2d.cc:862
+#: panner2d.cc:904
#, fuzzy
msgid "Panner"
msgstr "Panoramique"
@@ -8475,6 +9870,22 @@ msgstr "Mode d'automation du panoramique"
msgid "Pan automation type"
msgstr "Type d'automation de panoramique"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr "Listes de lecture"
@@ -8508,102 +9919,257 @@ msgstr "Ãchelle en dB"
msgid "Show phase"
msgstr "Afficher la phase"
-#: plugin_selector.cc:53 plugin_selector.cc:229
-msgid "Name contains"
-msgstr "Le nom contient"
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
-#: plugin_selector.cc:54 plugin_selector.cc:233
-msgid "Type contains"
-msgstr "Le type contient"
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
-#: plugin_selector.cc:55 plugin_selector.cc:231
-msgid "Category contains"
-msgstr "La catégorie contient"
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
-#: plugin_selector.cc:56 plugin_selector.cc:253
-msgid "Author contains"
-msgstr "Le nom de l'auteur contient"
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
-#: plugin_selector.cc:57 plugin_selector.cc:255
-msgid "Library contains"
-msgstr "La bibliothèque contient"
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
-msgid "Favorites only"
-msgstr "Seulement les favoris"
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
-#, fuzzy
-msgid "Hidden only"
-msgstr "Seulement les cachés"
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
-#: plugin_selector.cc:64
-msgid "Plugin Manager"
-msgstr "Gestionnaire de greffons"
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
-#: plugin_selector.cc:85
-msgid "Fav"
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
msgstr ""
-#: plugin_selector.cc:87
-msgid "Available Plugins"
-msgstr "Greffons disponibles"
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
-#: plugin_selector.cc:88
-msgid "Type"
-msgstr "Type"
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
-#: plugin_selector.cc:89
-msgid "Category"
-msgstr "Catégorie"
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
-#: plugin_selector.cc:90
-msgid "Creator"
-msgstr "Créateur"
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
-#: plugin_selector.cc:91
-msgid "# Audio In"
-msgstr "# Entrée audio"
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+#, fuzzy
+msgid "Send"
+msgstr "Départ"
-#: plugin_selector.cc:92
-msgid "# Audio Out"
-msgstr "# Sortie audio"
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
-#: plugin_selector.cc:93
-msgid "# MIDI In"
-msgstr "# Entrée MIDI"
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
-#: plugin_selector.cc:94
-msgid "# MIDI Out"
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Impossible de configurer le nouveau départ : %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
+msgid "Name contains"
+msgstr "Le nom contient"
+
+#: plugin_selector.cc:55 plugin_selector.cc:326
+msgid "Type contains"
+msgstr "Le type contient"
+
+#: plugin_selector.cc:56 plugin_selector.cc:324
+msgid "Category contains"
+msgstr "La catégorie contient"
+
+#: plugin_selector.cc:57 plugin_selector.cc:349
+msgid "Author contains"
+msgstr "Le nom de l'auteur contient"
+
+#: plugin_selector.cc:58 plugin_selector.cc:351
+msgid "Library contains"
+msgstr "La bibliothèque contient"
+
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
+msgid "Favorites only"
+msgstr "Seulement les favoris"
+
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
+#, fuzzy
+msgid "Hidden only"
+msgstr "Seulement les cachés"
+
+#: plugin_selector.cc:65
+msgid "Plugin Manager"
+msgstr "Gestionnaire de greffons"
+
+#: plugin_selector.cc:96
+msgid "Fav"
+msgstr "Fav"
+
+#: plugin_selector.cc:98
+msgid "Available Plugins"
+msgstr "Greffons disponibles"
+
+#: plugin_selector.cc:99
+msgid "Type"
+msgstr "Type"
+
+#: plugin_selector.cc:100
+msgid "Category"
+msgstr "Catégorie"
+
+#: plugin_selector.cc:101
+msgid "Creator"
+msgstr "Créateur"
+
+#: plugin_selector.cc:102
+msgid "# Audio In"
+msgstr "# Entrée audio"
+
+#: plugin_selector.cc:103
+msgid "# Audio Out"
+msgstr "# Sortie audio"
+
+#: plugin_selector.cc:104
+msgid "# MIDI In"
+msgstr "# Entrée MIDI"
+
+#: plugin_selector.cc:105
+msgid "# MIDI Out"
msgstr "# Sortie MIDI"
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "Greffons à connecter"
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Ajouter un greffon à la liste"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Retirer un greffon de la liste"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Rafraîchir les greffons disponibles"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "Insérer des greffons"
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
#, fuzzy
msgid "variable"
msgstr "Variable"
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -8613,92 +10179,92 @@ msgstr ""
"\n"
"Plus de détails dans la fenêtre de Journal (peut-être)"
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "Favoris"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "Gestionnaire de greffonâ¦"
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Par créateur"
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Par catégorie"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "Hein ? Les greffons LADSPA n'ont pas d'éditeur !"
-#: plugin_ui.cc:122 plugin_ui.cc:227
-#, fuzzy
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-"Type d'Ãditeur de plugin inconnu (note: VST non supporté dans cette version "
-"d'%1)"
+"type inconnu de greffon fournissant un éditeur (note: VST non supporté dans "
+"cette version d'%1)"
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
-msgstr "type inconnu pour le greffon fournissant un éditeur"
+msgstr "type inconnu de greffon fournissant un éditeur"
-#: plugin_ui.cc:257
-#, fuzzy
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-"type d'Ãditeur de plugin inconnu (note: LinuxVST non supporté dans cette "
-"version d'%1)"
+"type inconnu de greffon fournissant un éditeur (note: LinuxVST non supporté "
+"dans cette version d'%1)"
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
-msgstr "create_lv2_editor est appelé sur un greffon non LV2"
+msgstr "create_lv2_editor appelé sur un greffon non LV2"
#: plugin_ui.cc:418
msgid "Add"
msgstr "Ajouter"
-#: plugin_ui.cc:422
-#, fuzzy
+#: plugin_ui.cc:423
msgid "Description"
msgstr "Description"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr "Analyse du greffon"
-#: plugin_ui.cc:430
-#, fuzzy
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-"Présets (éventuels) pour ce plugin\n"
+"Préréglages (éventuels) pour ce plugin\n"
"(d'usine et d'utilisateur)"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr "Sauvegarder nouveau préréglage"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr "Sauvegarder le préréglage actuel"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr "Effacer le préréglage actuel"
-#: plugin_ui.cc:434
-#, fuzzy
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr "Désactiver le traitement du signal par le plugin"
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -8706,114 +10272,115 @@ msgstr ""
"Cliquez pour autoriser le greffon à recevoir des événements que %1 considère "
"habituellement comme des raccourcis"
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr "Cliquer pour activer/désactiver ce greffon"
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "latence (%1 sample)"
msgstr[1] "latence (%1 samples)"
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr "latence (%1 ms)"
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
-msgstr "Editer la latence"
+msgstr "Modifier la latence"
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-"Les préréglages de plugins ne sont pas pris en charge par cette version de "
+"Les préréglages de greffons ne sont pas pris en charge par cette version de "
"%1. Envisagez d'acheter une version complète."
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
+"Les préréglages des greffons ne sont pas pris en charge par cette version, "
+"consultez la fenêtre Journal pour plus d'informations."
+
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nouveau préréglage"
-#: plugin_ui.cc:670
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "Cliquer pour utiliser normalement les raccourcis claviers de %1"
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
msgid "%1 Busses"
msgstr "Bus %1"
-#: port_group.cc:338
+#: port_group.cc:339
msgid "%1 Tracks"
msgstr "Pistes %1"
-#: port_group.cc:339
+#: port_group.cc:340
msgid "Hardware"
msgstr "Matériel"
-#: port_group.cc:340
+#: port_group.cc:341
msgid "%1 Misc"
msgstr "Divers %1"
-#: port_group.cc:341
+#: port_group.cc:342
msgid "Other"
msgstr "Autre"
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr "Sortie LTC"
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr "Entrée LTC"
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr "Entrée MTC"
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr "Réception des contrôles MIDI"
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr "Entrée de l'horloge MIDI"
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr "Entrée MMC"
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr "Sortie MTC"
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr "Envoi des contrôles MIDI"
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr "Sortie de l'horloge MIDI"
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr "Sortie MMC"
-#: port_group.cc:532
-#, fuzzy
-msgid ":monitor"
-msgstr ": moniteur"
-
-#: port_group.cc:544
-msgid "system:"
-msgstr "système :"
-
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr "alsa_pcm"
+#: port_group.cc:579
+msgid "Scene "
+msgstr ""
#: port_insert_ui.cc:39
msgid "Measure Latency"
@@ -8832,91 +10399,79 @@ msgid "No signal detected"
msgstr "Aucun signal détecté"
#: port_insert_ui.cc:165
-#, fuzzy
msgid "Port Insert "
-msgstr "Insertion du port "
+msgstr "Insertion de port "
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr "<b>Sources</b>"
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr "<b>Destinations</b>"
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr "Ajouter %s %s"
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr "Renommer « %s »â¦"
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr "Tout supprimer"
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr "Tout %s"
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Rafraîchir"
-#: port_matrix.cc:529
-#, fuzzy
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr "Afficher les ports individuels"
-#: port_matrix.cc:535
-#, fuzzy
+#: port_matrix.cc:545
msgid "Flip"
-msgstr "Bascule"
+msgstr "Inverser"
-#: port_matrix.cc:722
-#, fuzzy
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
-msgstr ""
-"Impossible d'ajouter un port, le premier traitement de la Piste ou Bus n'est "
-"pas compatible avec la nouvelle configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
+msgstr "Impossible d'ajouter un port ici"
-#: port_matrix.cc:725
-#, fuzzy
+#: port_matrix.cc:733
msgid "Cannot add port"
-msgstr "Ajout de port impossible"
+msgstr "Impossible d'ajouter un port"
+
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "Le dernier port ne peut pas être supprimé"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "Ce port ne peut pas être supprimé"
-#: port_matrix.cc:747
+#: port_matrix.cc:765
msgid "Port removal not allowed"
msgstr "Suppression de port non permise"
-#: port_matrix.cc:748
-#, fuzzy
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"Retirer ce port est impossible.\n"
-"Soit le premier plugin de la Piste (Bus) ne peut gérer le \n"
-"nouveau nombre d'entrées, soit le dernier à plus de sorties."
-
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "Enlever '%s'"
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "Tout %s depuis '%s'"
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "canal"
@@ -8928,37 +10483,34 @@ msgstr "Il n'y a aucun port à connecter."
msgid "There are no %1 ports to connect."
msgstr "Il n'y a aucun port %1 Ã connecter."
-#: processor_box.cc:150
-#, fuzzy
-msgid "Send"
-msgstr "Départ"
-
-#: processor_box.cc:152
+#: processor_box.cc:226
#, fuzzy
msgid "Return"
msgstr "Retour"
-#: processor_box.cc:310
-#, fuzzy
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr ""
+
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
"\n"
-"Ce plugin mono a été dupliqué %1 fois."
+"Ce greffon mono a été reproduit %1 fois."
-#: processor_box.cc:314
-#, fuzzy
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
"<b>%1</b>\n"
"Double-clic pour afficher l'interface.\n"
-"Alt+Double-clic pour afficher l'interface générique. %2"
+"%2 + double-clic pour afficher l'interface générique. %3"
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
#, fuzzy
msgid ""
"<b>%1</b>\n"
@@ -8967,33 +10519,43 @@ msgstr ""
"<b>%1</b>\n"
"Double-clic pour afficher l'interface générique. %2"
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
-msgstr ""
+msgstr "(%1x1) "
+
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr "Affichage intégré"
-#: processor_box.cc:437
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "Afficher les contrôles"
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "Cacher tous les contrôles"
-#: processor_box.cc:475
-#, fuzzy
+#: processor_box.cc:752
msgid "Link panner controls"
-msgstr "Lier les contrôles de pan."
+msgstr "Lier les contrôles de panoramique"
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr "allumé"
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
-msgstr "sans"
+msgstr "éteint"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -9001,15 +10563,22 @@ msgstr ""
"Clic-droit pour ajouter/enlever/modifier\n"
"greffons/départs/insertions etc."
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr "Incompatibilité du greffon"
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "Vous avez essayé d'ajouter le greffon « %1 » dans l'emplacement %2.\n"
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
@@ -9017,19 +10586,19 @@ msgstr ""
"\n"
"Ce greffon possède :\n"
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 entrée MIDI\n"
msgstr[1] "\t%1 entrées MIDI\n"
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 entrée audio\n"
msgstr[1] "\t%1 entrées audio\n"
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -9037,19 +10606,19 @@ msgstr ""
"\n"
"mais au point d'insertion, il y a :\n"
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 canal MIDI\n"
msgstr[1] "\t%1 canaux MIDI\n"
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 canal audio\n"
msgstr[1] "\t%1 canaux audio\n"
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -9057,11 +10626,7 @@ msgstr ""
"\n"
"%1 est incapable d'insérer ce greffon ici.\n"
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "Impossible de configurer le nouveau départ : %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -9071,30 +10636,31 @@ msgstr ""
"de cette façon, car les entrées et sorties\n"
"ne fonctionneraient pas correctement."
-#: processor_box.cc:1991
+#: processor_box.cc:3189
+#, fuzzy
msgid "Rename Processor"
msgstr "Renommer le traitement"
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr "Au moins 100 objets E/S avec un nom comme %1 - nom inchangé"
-#: processor_box.cc:2159
+#: processor_box.cc:3371
#, fuzzy
msgid "plugin insert constructor failed"
-msgstr "Impossible d'insérer ce plugin"
+msgstr "Impossible d'insérer ce greffon"
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
"could not match the configuration of this track."
msgstr ""
"La copie du jeu de traitements du presse-papier a échoué,\n"
-"probablement car la configuration E/S des plugins\n"
+"probablement car la configuration E/S des greffons\n"
"ne correspond pas à la configuration de cette Piste."
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -9102,15 +10668,15 @@ msgstr ""
"Voulez-vous vraiment enlever tous les traitements de %1 ?\n"
"(ceci ne pourra pas être annulé)"
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Oui, tout enlever"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr "Enlever les traitements"
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9118,7 +10684,7 @@ msgstr ""
"Voulez-vous vraiment enlever tous les traitements pré-fader de %1 ?\n"
"(ceci ne pourra pas être annulé)"
-#: processor_box.cc:2240
+#: processor_box.cc:3452
#, fuzzy
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
@@ -9127,60 +10693,60 @@ msgstr ""
"Voulez vous vraiment enlever tous les traitements post-fader d'%1 ?\n"
"(ceci ne pourra pas être annulé)"
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr "Nouveau greffon"
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Nouvelle insertion"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr "Nouveau départ externeâ¦"
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr "Nouveau départ auxilliaireâ¦"
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr "Options du départ"
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr "Supprimer (tout)"
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr "Supprimer (pré-fader)"
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr "Supprimer (post-fader)"
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "Activer tout"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr "Tout désactiver"
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr "AÂ /Â B greffons"
-# if it's for showing the LV2 generic GUI, translation is correct !
-#: processor_box.cc:2486
+# It is for showing the LV2 generic GUI, so translation is correct.
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr "Editer avec l'interface générique..."
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr "%1Â : %2 (par %3)"
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr "%1 (par %2)"
@@ -9211,380 +10777,479 @@ msgstr "Banque"
msgid "main grid"
msgstr "grille principale"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Quantiser"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
#, fuzzy
msgid "Strength"
msgstr "Intensité"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Swing"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "Seuil (clics)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr "Aligner le début de note"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr "Aligner la fin de note"
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Fichier son du clic :"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "Parcourirâ¦"
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Fichier son du clic :"
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Fichier son du clic accentué :"
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Choix du clic"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Choix du clic accentué"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "Limiter la taille de l'historique d'annulation à "
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "Sauvegarder l'historique d'annulation de"
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "commandes"
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "Ãditer avec :"
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
#, fuzzy
msgid "+ button"
msgstr "+ bouton"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "Effacer avec :"
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "Insérer une note avec :"
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
-msgstr "Ignorer l'alignement avec :"
-
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Agencement du clavier :"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Ãchelle des polices :"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
-#: rc_option_editor.cc:547
-#, fuzzy
-msgid "Default"
-msgstr "Par défaut"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "Lecture (tampon en secondes)Â :"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "Enregistrement (tampon en secondes)Â :"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
-#: rc_option_editor.cc:737
-#, fuzzy
-msgid "Control Surface Protocol"
-msgstr "Protocole de la Surface de Contrôle"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "Double cliquer sur un nom pour configurer un protocole activé"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
-#: rc_option_editor.cc:903
-#, fuzzy
-msgid "Show Video Export Info before export"
-msgstr "Afficher les Infos d'Export Vidéo avant l'Export"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
+msgstr "Ignorer l'aimantation avec :"
-#: rc_option_editor.cc:904
-#, fuzzy
-msgid "Show Video Server Startup Dialog"
-msgstr "Options de Démarrage du Serveur Vidéo"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
-#: rc_option_editor.cc:905
-#, fuzzy
-msgid "Advanced Setup (remote video server)"
-msgstr "Options Avancées (serveur vidéo distant)"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
-#: rc_option_editor.cc:913
-#, fuzzy
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
-"<b>Si actif</b> vous pouvez spécifier l'URL du serveur vidéo et le "
-"répertoire racine. Activez cette option seulement si vous savez ce que vous "
-"faites !"
-#: rc_option_editor.cc:915
-#, fuzzy
-msgid "Video Server URL:"
-msgstr "URL du Serveur Vidéo :"
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr ""
-#: rc_option_editor.cc:920
-#, fuzzy
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-"URL du serveur vidéo, incluant un préfixe http. C'est généralement 'http://"
-"serveur.exemple.org:1554/' et par défaut 'http://localhost:1554/' quand le "
-"serveur vidéo tourne localement."
-#: rc_option_editor.cc:922
-#, fuzzy
-msgid "Video Folder:"
-msgstr "Répertoire Vidéo :"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
-#: rc_option_editor.cc:927
-#, fuzzy
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
msgstr ""
-"Chemin local vers le répertoire-racine du serveur vidéo. Seuls les fichiers "
-"de ce répertoire seront accessibles au serveur vidéo. Si le serveur tourne "
-"sur une machine distante, le chemin doit viser un répertoire réseau inclus "
-"dans le répertoire-racine et monté. Ne pas renseigner le chemin si il est "
-"indisponible. Ce chemin est utilisé pour le Monitoring vidéo local, et "
-"l'exploration lors de l'ouverture/ajout de fichiers vidéo."
-#: rc_option_editor.cc:934
-#, fuzzy
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1032
+msgid "Default"
+msgstr "Par défaut"
+
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-"<b>Si actif</b> les détails de l'export vidéo seront affichés avant la boite "
-"de dialogue de l'export."
-#: rc_option_editor.cc:939
-#, fuzzy
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "â"
msgstr ""
-"<b>Si actif</b> le serveur vidéo sera toujours lancé APRES confirmation."
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
msgstr ""
-#: rc_option_editor.cc:1035
-#, fuzzy
-msgid "General"
-msgstr "Général"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "Rechercher des greffons"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr ""
+
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
+msgstr "Niveau d'écrêtage des formes d'ondes (dBFS) :"
+
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "Préréglage :"
+
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr "Lecture (tampon en secondes)Â :"
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr "Enregistrement (tampon en secondes)Â :"
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
-#: rc_option_editor.cc:1065
+#: rc_option_editor.cc:1353
#, fuzzy
-msgid "VST"
+msgid "Control Surface Protocol"
+msgstr "Protocole de la Surface de Contrôle"
+
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr ""
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-"Type d'Ãditeur de plugin inconnu (note: VST non supporté dans cette version "
-"d'%1)"
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr "Afficher les Infos d'Export Vidéo avant l'export"
+
+#: rc_option_editor.cc:1548
+#, fuzzy
+msgid "Show Video Server Startup Dialog"
+msgstr "Options de Démarrage du Serveur Vidéo"
+
+#: rc_option_editor.cc:1549
+#, fuzzy
+msgid "Advanced Setup (remote video server)"
+msgstr "Options Avancées (serveur vidéo distant)"
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
msgstr ""
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1565
+#, fuzzy
msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
msgstr ""
+"<b>Si actif</b> vous pouvez spécifier l'URL du serveur vidéo et le "
+"répertoire racine. Activez cette option seulement si vous savez ce que vous "
+"faites !"
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1567
+#, fuzzy
+msgid "Video Server URL:"
+msgstr "URL du Serveur Vidéo :"
+
+#: rc_option_editor.cc:1572
+#, fuzzy
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
msgstr ""
+"URL du serveur vidéo, incluant un préfixe http. C'est généralement 'http://"
+"serveur.exemple.org:1554/' et par défaut 'http://localhost:1554/' quand le "
+"serveur vidéo tourne localement."
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1574
+#, fuzzy
+msgid "Video Folder:"
+msgstr "Répertoire Vidéo :"
+
+#: rc_option_editor.cc:1579
+#, fuzzy
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
msgstr ""
+"Chemin local vers le répertoire-racine du serveur vidéo. Seuls les fichiers "
+"contenus dans ce répertoire seront accessibles au serveur vidéo. Si le "
+"serveur tourne sur une machine distante, le chemin doit viser un répertoire "
+"réseau inclus dans le répertoire-racine et monté ou laissé vide s'il est "
+"indisponible. Ce chemin est utilisé pour le monitoring vidéo local, et "
+"l'exploration lors de l'ouverture/ajout de fichiers vidéo."
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
msgstr ""
+"<b>Si actif</b> une fenêtre d'informations détaillées sera affichée avant la "
+"boite de dialogue de l'export vidéo."
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1589
+#, fuzzy
msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
msgstr ""
+"<b>Si actif</b> le serveur vidéo sera toujours lancé APRES confirmation."
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
msgstr ""
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "Préférences de %1"
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr "Divers"
+
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
-msgstr "Utilisation du Processeur/Traitements"
+msgstr "Utilisation processeur par les traitements audio"
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "Le traitement du signal utilise"
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "tous les processeurs sauf un"
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "tous les processeurs disponibles"
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr "%1 processeurs"
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr "Cette option ne sera prise en compte qu'après un redémarrage de %1."
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "Annuler"
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "Confirmer la destruction du dernier enregistrement"
-#: rc_option_editor.cc:1345
+#: rc_option_editor.cc:1907
+msgid "Session Management"
+msgstr "Gestion de la session"
+
+#: rc_option_editor.cc:1912
msgid "Make periodic backups of the session file"
msgstr "Faire des sauvegardes périodiques du fichier de session"
-#: rc_option_editor.cc:1350
-#, fuzzy
-msgid "Session Management"
-msgstr "Gestionnaire de Session"
-
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Toujours copier les fichiers importés dans la session"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr "Répertoire par défaut des nouvelles sessions :"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "Nombre maximum de sessions récentes"
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1948
#, fuzzy
msgid "Click gain level"
msgstr "Niveau du Clic "
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automation"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr "Facteur d'espacement (plus => moins de données)"
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "Intervalle de prise d'automation (ms)"
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "Rester en enregistrement à l'arrêt"
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
-msgstr ""
+msgstr "Le bouton Boucle est un mode de lecture"
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -9592,13 +11257,18 @@ msgid ""
"<b>When disabled</b> the loop button starts playing the loop, but stop then "
"cancels loop playback"
msgstr ""
+"<b>Si actif</b>, le bouton Boucle ne démarre pas la lecture mais force la "
+"lecture à se limiter à la boucle\n"
+"\n"
+"<b>Si inactif</b>, le bouton Boucle lance la lecture de la boucle, et Stop "
+"annule la lecture en boucle"
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
#, fuzzy
msgid "Stop recording when an xrun occurs"
msgstr "Stopper l'enregistrement si un xrun survient"
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
#, fuzzy
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
@@ -9607,15 +11277,15 @@ msgstr ""
"<b>Si actif</b> %1 stoppera l'enregistrement si le moteur Audio détecte un "
"problème de débit (xrun)"
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "Créer un repère lors des désynchronisations (xrun)"
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "Arrêter à la fin de la session"
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
#, fuzzy
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
@@ -9624,19 +11294,18 @@ msgid ""
"<b>When disabled</b> %1 will continue to roll past the session end marker at "
"all times"
msgstr ""
-"<b>Si actif</b> quand %1 <b>n'enregistre pas</b>, le Transport est stoppé au "
+"<b>Si actif</b> quand %1 <b>n'enregistre pas</b>, la lecture s'arrête au "
"repère de fin de session\n"
"\n"
-"<b>Si inactif</b> %1 ne stoppera jamais le Transport au repère de fin de "
-"session"
+"<b>Si inactif</b> %1 continuera toujours la lecture au delà du repère de fin "
+"de session"
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
#, fuzzy
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr "Boucle sans transition audible (impossible si esclave MTC, LTC, etc)"
-#: rc_option_editor.cc:1472
-#, fuzzy
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -9645,53 +11314,96 @@ msgid ""
"<b>When disabled</b> looping is done by locating back to the start of the "
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-"<b>Si actif</b> la lecture en boucle sera lancée entre les points de boucle, "
-"sans qu'il soit nécessaire de relocaliser le Transport à la fin de la "
-"boucle.\n"
+"<b>Si actif</b> la lecture en boucle sera anticipée et englobera le point de "
+"bouclage, sans qu'il soit nécessaire de relocaliser le transport à la fin de "
+"la boucle.\n"
"\n"
-"<b>Si inactif</b> la boucle est réalisée en se repositionnant au début quand "
-"%1 atteint la fin, ce qui peut souvent causer un léger clic ou délai."
+"<b>Si inactif</b> la boucle est réalisée en se repositionnant au début de la "
+"boucle quand %1 atteint la fin, ce qui peut souvent causer un léger clic ou "
+"délai."
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr "Désactiver le désarmement des piste pendant l'enregistrement"
-#: rc_option_editor.cc:1484
-#, fuzzy
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
"<b>Si activé<b> évitera de stopper accidentellement l'enregistrement de "
-"Pistes spécifiques pendant une prise"
+"pistes spécifiques pendant une prise"
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "-12 dB de gain pendant le déplacement rapide avant/arrière"
-#: rc_option_editor.cc:1493
-#, fuzzy
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-"Ceci va réduire la désagréable augmentation du volume perçu lors du "
-"déplacement rapide avant/arrière dans certains types d'Audio"
+"Réduit la l'augmentation désagréable du volume perçu lors du déplacement "
+"rapide avant/arrière dans certains types d'audio"
+
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "Synchronisé/Esclave"
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr "Source de « timecode » externe"
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
#, fuzzy
msgid "Match session video frame rate to external timecode"
msgstr "Synchroniser le taux d'images/sec. de la session au timecode externe"
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
#, fuzzy
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
@@ -9716,28 +11428,28 @@ msgstr ""
"principale, l'indicateur img/sec clignotera en rouge, et %1 synchronisera "
"les 2 sources."
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
#, fuzzy
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "Bloquer à 29.9700 img/sec plutot que 30000/1001"
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
#, fuzzy
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
@@ -9760,32 +11472,32 @@ msgstr ""
"constructeurs l'utilisent -malgré son opposition aux spécifications- car "
"utiliser 29.97 img/sec n'induit aucun décalage de Timecode.\n"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
#, fuzzy
msgid "LTC Reader"
msgstr "Lecteur LTC"
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
#, fuzzy
msgid "LTC incoming port"
msgstr "Port d'entrée LTC "
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
#, fuzzy
msgid "LTC Generator"
msgstr "Générateur LTC"
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
#, fuzzy
msgid "Enable LTC generator"
msgstr "Activer le générateur LTC"
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
#, fuzzy
msgid "Send LTC while stopped"
msgstr "Envoyer LTC à l'arrêt"
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
@@ -9793,431 +11505,466 @@ msgstr ""
"<b>Activé</b> %1 continuera à envoyer l'info LTC même quand le transport (la "
"tête de lecture) n'est pas en mouvement"
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
#, fuzzy
msgid "LTC generator level"
msgstr "Niveau du générateur LTC "
-#: rc_option_editor.cc:1610
-#, fuzzy
+#: rc_option_editor.cc:2195
msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is 0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is 0dBu ^= -18dBFS in an EBU calibrated system"
msgstr ""
-"Spécifie le volume de pic du signal LTC généré en dB FS. Dans un système "
-"étalonné en EBU (UER), une bonne valeur est : 0dBu >= -18 dB FS"
+"Spécifie le volume de crête du signal LTC généré en dB FS. Dans un système "
+"étalonné en EBU (UER), une bonne valeur est : 0dBu >= -18 dB FS"
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Aimanter la sélection élastique à la grille"
+
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Nommer les nouveaux repères"
+
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
msgstr ""
+"Si actif, demander un nom à la création de tout nouveau repère.\n"
+"Vous pouvez toujours renommer les repères par clic-droit"
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr "Autoriser l'entraînement de la tête de lecture"
+
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
+msgstr "Vu-mètre master affiché dans la barre d'outils"
+
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-"Déplacer les automations appropriées lors du déplacement des regions audio"
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Bargraphe de la Piste affiché dans l'Ãditeur"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2256
#, fuzzy
-msgid "Display master-meter in the toolbar"
-msgstr "Bargraphe du Master affiché dans la barre d'outils"
+msgid "Update editor window during drags of the summary"
+msgstr ""
+"Mettre à jour l'affichage de la fenêtre de l'Ãditeur pendant le cliqué-"
+"glissé du résumé"
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr ""
+"Défilement automatique de l'éditeur pendant un cliquer-glisser près de ses "
+"bords"
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr "Afficher les enveloppes de gain dans les régions audio "
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr "dans tous les modes"
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr ""
-#: rc_option_editor.cc:1653
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr ""
+"Déplacer les automations appropriées lors du déplacement des regions audio"
+
+#: rc_option_editor.cc:2291
#, fuzzy
msgid "Default fade shape"
msgstr "définir la forme du fade-out"
-#: rc_option_editor.cc:1672
+#: rc_option_editor.cc:2310
msgid "Regions in active edit groups are edited together"
msgstr "Les Régions en groupes d'édition actifs sont modifiées ensemble "
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:2311
msgid "whenever they overlap in time"
msgstr "si elles se chevauchent"
-#: rc_option_editor.cc:1674
+#: rc_option_editor.cc:2312
msgid "only if they have identical length, position and origin"
msgstr "seulement si durée, position et origine sont identiques"
-#: rc_option_editor.cc:1684
-#, fuzzy
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Le rectangle de sélection élastique \"colle\" à la grille"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Afficher l'enveloppe sonore dans les régions"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr ""
-#: rc_option_editor.cc:1700
-#, fuzzy
-msgid "Show gain envelopes in audio regions"
-msgstr "Afficher les enveloppes de gain des Régions Audio "
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "dans tous les modes"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr "Après la découpe de régions sélectionnées, sélectionner"
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr "aucune région"
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr "les régions nouvellement créées"
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr "la sélection en cours et les régions nouvellement créées"
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Afficher l'enveloppe sonore dans les régions"
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "seulement en mode gain de Région"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Afficher l'enveloppe Audio pendant son enregistrement"
-#: rc_option_editor.cc:1709
+#: rc_option_editor.cc:2370
msgid "Waveform scale"
msgstr "Ãchelle de l'enveloppe "
-#: rc_option_editor.cc:1714
+#: rc_option_editor.cc:2375
msgid "linear"
msgstr "linéaire"
-#: rc_option_editor.cc:1715
+#: rc_option_editor.cc:2376
msgid "logarithmic"
msgstr "logarithmique"
-#: rc_option_editor.cc:1721
+#: rc_option_editor.cc:2382
msgid "Waveform shape"
msgstr "Forme de l'enveloppe "
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:2387
msgid "traditional"
msgstr "traditionnelle"
-#: rc_option_editor.cc:1727
+#: rc_option_editor.cc:2388
msgid "rectified"
msgstr "redressée"
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Afficher l'enveloppe Audio pendant son enregistrement"
+#: rc_option_editor.cc:2397
+msgid "Buffering"
+msgstr "Mise en tampon"
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Afficher la barre d'outil Zoom"
+#: rc_option_editor.cc:2405
+msgid "Record monitoring handled by"
+msgstr "Monitoring de l'enregistrement géré par"
-#: rc_option_editor.cc:1752
-#, fuzzy
-msgid "Update editor window during drags of the summary"
-msgstr ""
-"Mettre à jour l'affichage de la fenêtre de l'Ãditeur pendant le cliqué-"
-"glissé du résumé"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "Sélection des pistes identique entre éditeur et mixage"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Nommer les nouveaux repères"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-msgstr ""
-"Si actif, demander un nom à la création de tout nouveau repère.\n"
-"Vous pouvez toujours renommer les repères par clic-droit"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr ""
-"Défilement automatique de l'éditeur pendant un cliquer-glisser près de ses "
-"bords"
-
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr ""
-
-#: rc_option_editor.cc:1791
-#, fuzzy
-msgid "no regions"
-msgstr "Régions"
-
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1805
-msgid "Buffering"
-msgstr "Mise en tampon"
-
-#: rc_option_editor.cc:1813
-msgid "Record monitoring handled by"
-msgstr "Monitoring de l'enregistrement géré par"
-
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
#, fuzzy
msgid "via Audio Driver"
msgstr "via le pilote Audio"
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
-msgstr "le matériel audio"
+msgstr "matériel audio"
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Mode magnétophone"
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Connexion des pistes et bus"
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "Connexion automatique du bus général et des bus de monitoring"
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "Connecter les entrées des pistes"
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "automatiquement aux entrées matérielles"
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "manuellement"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "Connecter les sorties des pistes et des bus"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "automatiquement aux sorties matérielles"
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "automatiquement au bus général"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "Utiliser les E/S strictes pour les nouveaux bus et pistes"
+
+#: rc_option_editor.cc:2478
#, fuzzy
msgid "Denormals"
msgstr "Dénormalisations"
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
#, fuzzy
msgid "Use DC bias to protect against denormals"
msgstr "Utiliser un courant polarisé pour éviter les dénormalisations"
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "Gestion du traitement"
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "pas de gestion du traitement"
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
#, fuzzy
msgid "use FlushToZero"
msgstr "mettre à zéro (les valeurs inférieures au plus petit détail)"
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "Utiliser DenormalsAreZero"
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
#, fuzzy
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
"mettre à zéro (les valeurs inférieures au plus petit détail ou dénormalisées)"
-#: rc_option_editor.cc:1926
-#, fuzzy
-msgid "Silence plugins when the transport is stopped"
-msgstr "Plugins silencieux à l'arrêt"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Activer les nouveaux greffons"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "Activer l'analyse automatique de l'audio"
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "Dupliquer les canaux manquants dans la région"
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / muet"
-
-#: rc_option_editor.cc:1964
-#, fuzzy
-msgid "Solo-in-place mute cut (dB)"
-msgstr "Diminution (en dB) des Pistes NON solo-en-place "
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
#, fuzzy
msgid "Solo controls are Listen controls"
msgstr "Les contrôles de solos sont des contrôles d'écoute"
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Solo exclusif"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Afficher les sourdines de solo"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo surplante Muet"
+
+#: rc_option_editor.cc:2585
+#, fuzzy
+msgid "Solo-in-place mute cut (dB)"
+msgstr "Diminution (en dB) des Pistes NON solo-en-place "
+
+#: rc_option_editor.cc:2592
#, fuzzy
msgid "Listen Position"
msgstr "Position d'écoute "
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
#, fuzzy
msgid "after-fader (AFL)"
msgstr "post-fader (AFL)"
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
#, fuzzy
msgid "pre-fader (PFL)"
msgstr "pré-fader (PFL)"
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr "Les signaux PFL sont prélevés"
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr "avant les traitements pré-fader"
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr "après les traitements pré-fader"
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr "Les signaux AFL sont prélevés "
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr "immédiatement post-fader"
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr "après les traitements post-fader (avant panoramique)"
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Solo exclusif"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Afficher les sourdines de solo"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo surplante Muet"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "Options de silencieux par défaut des pistes/bus"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr "Muet affecte les départs pré-fader"
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr "Muet affecte les départs post-fader"
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "Muet affecte les sorties de contrôle"
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "Muet affecte les sorties principales"
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
#, fuzzy
msgid "Send Routing"
msgstr "Routine des départs"
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
#, fuzzy
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
"Lier par défaut les panoramiques de départs auxiliaires et extérieurs au "
"panoramique de la Piste (du Bus)"
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
+msgstr "Temps d'avance sur lecture du MIDI (secondes)"
+
+#: rc_option_editor.cc:2687
+#, fuzzy
+msgid "Initial program change"
+msgstr "Modifier le programme initial (IPC) "
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "Afficher le premier programme/banque MIDI comme 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "Ne jamais afficher les messages MIDI périodiques (MTC, MIDI Clock)"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr "Jouer les notes MIDI lorsqu'elles sont sélectionnées dans l'éditeur"
+
+#: rc_option_editor.cc:2720
+#, fuzzy
+msgid "Send MIDI control feedback"
+msgstr "Envoyer les retours d'infos de contrôle MIDI"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
msgstr ""
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr "Envoyer MTC (Midi Time Code)"
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
#, fuzzy
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr ""
"Pourcentage +/- de la vitesse normale du Transport à transmettre en MTC "
"(CTM) "
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "Obéir aux commandes MMC (MIDI Machine Control)"
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
msgstr "Envoyer les commandes MMC (MIDI Machine Control)"
-#: rc_option_editor.cc:2138
-#, fuzzy
-msgid "Send MIDI control feedback"
-msgstr "Envoyer les retours d'infos de contrôle MIDI"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr "identifiant de l'appareil MMC en entrée"
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr "identifiant de l'appareil MMC en sortie"
-#: rc_option_editor.cc:2164
-#, fuzzy
-msgid "Initial program change"
-msgstr "Modifier le programme initial (IPC) "
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "Afficher le premier programme/banque MIDI comme 0"
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "Ne jamais afficher les messages MIDI périodiques (MTC, MIDI Clock)"
-
-#: rc_option_editor.cc:2189
-#, fuzzy
-msgid "Sound MIDI notes as they are selected"
-msgstr "Jouer les notes MIDI à leur sélection"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
#, fuzzy
msgid "Midi Audition"
msgstr "Ecoute MIDI"
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
#, fuzzy
msgid "Midi Audition Synth (LV2)"
msgstr "Synthé d'écoute MIDI (LV2) "
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr "Interaction utilisateur"
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
#, fuzzy
msgid ""
"Use translations of %1 messages\n"
@@ -10228,277 +11975,507 @@ msgstr ""
" <i>(actif après un redémarrage d'%1)</i>\n"
" <i>(si disponible pour vos préférences de langue)</i>"
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "Clavier"
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "Identifiant de la surface de contrôle distante "
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Rechercher des greffons"
+
+#: rc_option_editor.cc:2853
+#, fuzzy
+msgid "General"
+msgstr "Général"
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr "Toujours afficher la progression de la recherche de greffons"
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+"<b>Si actif</b>, une fenêtre pop-up montre la progression de la recherche de "
+"nouveaux greffons et de leur indexation."
+
+#: rc_option_editor.cc:2869
+#, fuzzy
+msgid "Silence plugins when the transport is stopped"
+msgstr "Greffons silencieux à l'arrêt"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Activer les nouveaux greffons"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr "VST"
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr "Rechercher les nouveaux greffons VST au démarrage de l'application"
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+"<b>Si actif</b> les nouveaux greffons VST sont recherchés, testés et ajoutés "
+"à la liste au démarrage de l'application. Si inactif, les nouveaux greffons "
+"ne seront disponibles qu'après un déclenchement manuel de recherche"
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr "Dossier Linux VST :"
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr "Dossier Windows VST :"
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr "Audio Unit"
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+"Rechercher les nouveaux greffons AudioUnit au démarrage de l'application"
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+"<b>Si actif</b> les nouveaux greffons AudioUnit sont recherchés au démarrage "
+"de l'application. Si inactif, les nouveaux greffons ne seront disponibles "
+"qu'après un déclenchement manuel de recherche. La première recherche réussie "
+"active le scan automatique des AU, tandis qu'un crash pendant la recherche "
+"le désactive."
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "assigné manuellement"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "suit l'ordonnancement de la Console"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
msgid "Preferences|GUI"
msgstr "Interface graphique"
-# widget is not translated else than "gadget" in french. have choosen the french word for "tool"
-#: rc_option_editor.cc:2272
-#, fuzzy
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-"Changer l'aspect du pointeur lors du survol des différents outils par la "
-"souris"
+"Mettre en valeur visuellement certains contrôles lorsqu'ils sont survolés "
+"par la souris"
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
-msgstr "Afficher des infobulles quand la souris survole une contrôle"
+msgstr "Afficher des infobulles quand la souris survole un contrôle"
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
+"Afficher des barres de noms dans l'affichage des régions (nécessite un "
+"redémarrage)"
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
-msgid "Lock timeout (seconds)"
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
+msgid "Lock timeout (seconds)"
+msgstr "Délai de temporisation du verrouillage (secondes)"
+
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
+"Verrouille l'interface graphique après ce nombre de secondes (zéro pour ne "
+"jamais vérouiller)"
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
#, fuzzy
msgid "Mixer Strip"
msgstr "Tranche de Console"
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr "Utiliser des tranches de console étroites par défaut"
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr "Mesure"
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
#, fuzzy
msgid "Peak hold time"
msgstr "Durée de maintien du pic "
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr "court"
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
#, fuzzy
msgid "medium"
msgstr "moyen"
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr "long"
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
#, fuzzy
msgid "DPM fall-off"
msgstr "Chute du pic "
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
#, fuzzy
msgid "slowest [6.6dB/sec]"
msgstr "le plus lent [6.6dB/sec]"
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
#, fuzzy
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "lent [8.6dB/sec] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:2377
-#, fuzzy
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "moins lent [12.0dB/sec] (DIN)"
-
-#: rc_option_editor.cc:2378
-#, fuzzy
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "modéré [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-
-#: rc_option_editor.cc:2379
-#, fuzzy
-msgid "medium [20dB/sec]"
-msgstr "moyen [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr ""
-#: rc_option_editor.cc:2380
-#, fuzzy
-msgid "fast [32dB/sec]"
-msgstr "rapide [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr ""
-#: rc_option_editor.cc:2381
-#, fuzzy
-msgid "faster [46dB/sec]"
-msgstr "plus rapide [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
+msgstr ""
-#: rc_option_editor.cc:2382
-#, fuzzy
-msgid "fastest [70dB/sec]"
-msgstr "le plus rapide [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
+msgstr ""
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
#, fuzzy
msgid "Meter line-up level; 0dBu"
msgstr "Niveau ligne, 0 dBu "
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-msgstr ""
+msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
-msgstr ""
+msgstr "-20dBFS (SMPTE RP.0155)"
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
-msgstr ""
+msgstr "-18dBFS (EBU, BBC)"
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
-msgstr ""
+msgstr "-15dBFS (DIN)"
-#: rc_option_editor.cc:2398
-#, fuzzy
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-"Configurer les bargraphes : zones de changement de couleur (échelle dB FS) "
-"et niveaux de réference des différents types de modulomètre."
+"Configurer les échelle et zones de changement de couleur pour le modulomètre "
+"dBFS, et le niveau de référence pour les modulomètres IEC1/Nordic, IEC2 PPM "
+"et VU-mètre."
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
#, fuzzy
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr "Niveau ligne IEC1/DIN, 0 dBu "
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
#, fuzzy
msgid "Reference level for IEC1/DIN meter."
msgstr "Niveau de référence des bargraphes IEC1/DIN."
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
#, fuzzy
msgid "VU Meter standard"
msgstr "VU-Mètre standard "
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
-msgstr ""
+msgstr "0VU = -2dBu (France)"
-#: rc_option_editor.cc:2426
-#, fuzzy
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
-msgstr "0VU = 0dBu (Amerique du Nord, Australie)"
+msgstr "0VU = 0dBu (Amérique du Nord, Australie)"
-#: rc_option_editor.cc:2427
-#, fuzzy
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
-msgstr "0VU = 0dBu (Amerique du Nord, Australie)"
+msgstr "0VU = +4dBu (standard)"
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
-msgstr ""
+msgstr "0VU = +8dBu"
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
#, fuzzy
msgid "Peak threshold [dBFS]"
msgstr "Seuil du pic [dB FS] "
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
#, fuzzy
msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
"Spécifie le niveau du signal Audio (en dB FS) à partir duquel l'indicateur "
"de pic clignote en rouge."
-#: rc_option_editor.cc:2449
-#, fuzzy
+#: rc_option_editor.cc:3313
msgid "LED meter style"
-msgstr "Affichage en mode LED"
+msgstr "Style d'afficheur LED"
-#: rc_option_editor.cc:2457
-#, fuzzy
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Bargraphe de la Piste affiché dans l'Ãditeur"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
-msgstr "Modèles de Thème"
+msgstr "Thème"
+
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr "Couleurs"
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr "Indique le dossier de recherche des VST Linus"
-#: region_editor.cc:79
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr "Indique le dossier de recherche des VST Windows"
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "écouter cette région"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr "Position :"
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr "Fin :"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr "Durée :"
-#: region_editor.cc:94
+#: region_editor.cc:96
#, fuzzy
msgid "Sync point (relative to region):"
-msgstr "Point de synchro (relatif/Région) :"
+msgstr "Point de synchro (relatif/Région) :"
-#: region_editor.cc:96
+#: region_editor.cc:98
#, fuzzy
msgid "Sync point (absolute):"
-msgstr "Point de synchro (absolu) :"
+msgstr "Point de synchro (absolu)Â :"
-#: region_editor.cc:98
+#: region_editor.cc:100
#, fuzzy
msgid "File start:"
-msgstr "Début du fichier :"
+msgstr "Début du fichier :"
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr "Sources :"
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr "Source :"
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr "Région '%1'"
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr "changer le début de la région"
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr "changer la fin de la région"
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr "changer la longueur de la région"
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
#, fuzzy
msgid "change region sync point"
msgstr "Modifier le point de synchro de la Région"
@@ -10524,35 +12501,35 @@ msgstr "Choisir la Région audible"
# not sure why no space between the words, or if it doesn't need to be translate ?
# PLUS, translation says "hide the text"
-#: region_view.cc:277
+#: region_view.cc:271
#, fuzzy
msgid "SilenceText"
msgstr "CacherLeTexte"
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "minutes"
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "ms"
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "secondes"
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] "%1 segment silencieux"
msgstr[1] "%1 segments silencieux"
-#: region_view.cc:303
+#: region_view.cc:297
#, fuzzy
msgid "shortest = %1 %2"
msgstr "le plus court = %1 %2"
-#: region_view.cc:320
+#: region_view.cc:314
#, fuzzy
msgid ""
"\n"
@@ -10574,14 +12551,12 @@ msgid "Note Onset"
msgstr "Début de note"
#: rhythm_ferret.cc:54
-#, fuzzy
msgid "Energy Based"
-msgstr "Basé sur l'Amplitude du Signal"
+msgstr "Basé sur l'énergie"
#: rhythm_ferret.cc:55
-#, fuzzy
msgid "Spectral Difference"
-msgstr "Différence Spectrale"
+msgstr "Différence spectrale"
#: rhythm_ferret.cc:56
#, fuzzy
@@ -10590,10 +12565,9 @@ msgstr "Contenu Hautes Fréquences"
#: rhythm_ferret.cc:57
msgid "Complex Domain"
-msgstr ""
+msgstr "Domaine complexe"
#: rhythm_ferret.cc:58
-#, fuzzy
msgid "Phase Deviation"
msgstr "Déviation de Phase"
@@ -10607,55 +12581,63 @@ msgstr "Kullback-Liebler"
msgid "Modified Kullback-Liebler"
msgstr "Kullback-Liebler modifié"
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "Scinder la région"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr "Aligner régions"
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "Conformer les régions au tempo"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "Fureteur de rythme"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Analyser"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "Fonction de détection"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Ãcart déclenchant"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Seuil"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "Seuil de pic"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "Seuil de silence"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "Sensibilité"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Opération"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "scinder les régions (fureteur de rythme)"
@@ -10675,28 +12657,24 @@ msgstr "Muet"
msgid "Record enable"
msgstr "Armement"
-# translation assumes that this chain is for a popup to explain that button under mouse is the active state (it could also been a command to active some state and in this case we better translate "activer")
+# This string is for the New Group Dialog and is one of the properties that can be shared among the group.
#: route_group_dialog.cc:52
msgid "Active state"
msgstr "Ãtat actif"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Couleur"
-
# not sure why no space between the words, or if it doesn't need to be translate ?
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
#, fuzzy
msgid "RouteGroupDialog"
msgstr "RoutineDesGroupes"
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>Partage</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
-msgstr ""
+msgstr "Le nom du groupe existe déjà . Choisissez un autre nom."
#: route_params_ui.cc:84
msgid "Tracks/Busses"
@@ -10714,352 +12692,325 @@ msgstr "Sorties"
msgid "Plugins, Inserts & Sends"
msgstr "Greffons, départs et retours"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr ""
"élément de liste d'affichage de route pour la route renommée introuvable !"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "Retard de lecture : %<PRId64> échantillons"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "PAS DE PISTE"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Ajouter une piste ou un bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "Aucune piste ou bus sélectionné"
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
#, fuzzy
msgid "Record (Right-click for Step Edit)"
msgstr "Enregistrement (clic droit: pas-Ã -pas)"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Enregistrement"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "Groupe"
-#: route_time_axis.cc:264
-#, fuzzy
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
-msgstr "Automation et Controleurs MIDI"
+msgstr "Automation et contrôleurs MIDI"
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "Afficher toute l'automation"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "Afficher l'automation existante"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "Cacher toute l'automation"
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
#, fuzzy
msgid "Processor automation"
msgstr "Automation du traitement"
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Atténuateur"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Panoramique"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "Recouvertes"
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "Empilées"
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Couches"
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr "Automatique (Ã partir des connections d'EÂ /Â S)"
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr "(Actuellement : matériaux existant)"
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr "(Actuellement : horodatage d'enregistrement)"
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr "Aligner avec le matériaux existant"
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr "Aligner avec l'horodatage d'enregistrement"
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "Alignement"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr "Mode normal"
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr "Mode Magnéto"
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr "Mode sans empilement"
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
-msgstr ""
+msgstr "Mode enregistrement"
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Liste de lecture"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "Renommer la liste de lecture"
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "Nouveau nom de la liste de lecture :"
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "Nouvelle copie de la liste de lecture"
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "Nom de la nouvelle liste de lecture :"
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "Nouvelle liste de lecture"
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "Vous ne pouvez pas créer une piste avec ce nom, il est réservé pour %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "Nouvelle copieâ¦"
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "Nouvelle prise"
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "Copier la prise"
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Effacer actuelle"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "Choisir depuis toutesâ¦"
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr "Prise : %1.%2"
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "erreur de programmation: "
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr "Sous-couches"
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "Supprimer « %1 »"
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
#, fuzzy
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr "programming error: underlay reference pointer pairs are inconsistent!"
-#: route_time_axis.cc:2702
-#, fuzzy
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
-msgstr "Ecoute Après Fader (AFL)"
+msgstr "Ãcoute Après Fader (AFL)"
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
#, fuzzy
msgid "Pre-fade listen (PFL)"
msgstr "Ecoute Pré Fader (PFL)"
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr "Rendre la piste muette"
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr "Rendre les autres pistes (non-solo) muettes"
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr "Armer l'enregistrement sur cette piste"
-#: route_ui.cc:158
+#: route_ui.cc:183
#, fuzzy
msgid "make mixer strips show sends to this bus"
msgstr ""
"Les tranches de Console montrent les départs vers ce Bus (au lieu de leur "
"fader)"
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr "Ãcoute d'entrée"
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr "Ãcoute de lecture"
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
-msgstr ""
+msgstr "Non connecté au moteur audio - impossible d'activer l'enregistrement"
+
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr "Protégé contre l'enregistrement"
-#: route_ui.cc:875
+#: route_ui.cc:888
#, fuzzy
msgid "Step Entry"
msgstr "Pas-Ã -pas"
-#: route_ui.cc:948
-#, fuzzy
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
-msgstr "Assigner toutes les Pistes (pré-fader)"
+msgstr "Assigner toutes les pistes (pré-fader)"
-#: route_ui.cc:952
-#, fuzzy
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
-msgstr "Assigner toutes les Pistes et Bus (pré-fader)"
+msgstr "Assigner toutes les pistes et bus (pré-fader)"
-#: route_ui.cc:956
-#, fuzzy
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
-msgstr "Assigner toutes les Pistes (post-fader)"
+msgstr "Assigner toutes les pistes (post-fader)"
-#: route_ui.cc:960
-#, fuzzy
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
-msgstr "Assigner toutes les Pistes et Bus (post-fader)"
+msgstr "Assigner toutes les pistes et bus (post-fader)"
-#: route_ui.cc:964
-#, fuzzy
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
-msgstr "Assigner les Pistes sélectionnées (pré-fader)"
+msgstr "Assigner les pistes sélectionnées (pré-fader)"
-#: route_ui.cc:968
-#, fuzzy
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
-msgstr "Assigner les Pistes et Bus sélectionnés (pré-fader)"
+msgstr "Assigner les pistes et bus sélectionnés (pré-fader)"
-#: route_ui.cc:971
-#, fuzzy
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
-msgstr "Assigner les Pistes sélectionnées (post-fader)"
+msgstr "Assigner les pistes sélectionnées (post-fader)"
-#: route_ui.cc:975
-#, fuzzy
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
-msgstr "Assigner les Pistes et Bus sélectionnés (post-fader)"
+msgstr "Assigner les pistes et bus sélectionnés (post-fader)"
-#: route_ui.cc:978
-#, fuzzy
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
-msgstr "Assigner le gain de Piste/Bus aux départs"
+msgstr "Appliquer le gain de piste/bus aux départs"
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr "Régler le gain des départs à -inf"
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr "Régler le gain des départs à 0dB"
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr "Isoler le solo"
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr "Solo verrouillé"
-#: route_ui.cc:1329
-#, fuzzy
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr "Départs Pré-Fader"
-#: route_ui.cc:1335
-#, fuzzy
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr "Départs Post-Fader"
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "Sorties de contrôle"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "Sorties principales"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr "Sélection de Couleur"
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Voulez-vous vraiment supprimer la piste « %1 » ?\n"
-"\n"
-"Vous pourrez aussi perdre la liste de lecture utilisée par cette piste.\n"
-"\n"
-"(Cette action ne pourra pas être annulée, et le fichier de session sera "
-"écrasé)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Voulez-vous vraiment supprimer le bus « %1 » ?\n"
-"\n"
-"Le fichier de session sera écrasé et cette action ne pourra pas être "
-"annulée !"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Supprimer la piste"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Supprimer le bus"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -11068,108 +13019,78 @@ msgstr ""
"des bus.\n"
"Voulez-vous tout de même utiliser ce nom ?"
-#: route_ui.cc:1608
+#: route_ui.cc:1617
#, fuzzy
msgid "Use the new name"
msgstr "Utiliser le nouveau nom"
-#: route_ui.cc:1609
+#: route_ui.cc:1618
#, fuzzy
msgid "Re-edit the name"
msgstr "Renommer encore"
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "Renommer la piste"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr "Renommer le bus"
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": éditeur de commentaires"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr " latence"
-#: route_ui.cc:1871
+#: route_ui.cc:1888
#, fuzzy
msgid "Cannot create route template directory %1"
msgstr "Impossible de créer le répertoire modèle de Routine %1"
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr "Sauvegarder comme modèle"
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr "Nom du modèle :"
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "Identifiant de contrôleur distant"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "Identifiant de contrôleur distant :"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
-#: route_ui.cc:1983
-#, fuzzy
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-"L'ID MIDI du controleur %1 est: %2\n"
-"\n"
-"\n"
-"L'ID MIDI du controleur %3 ne peut être changée."
-#: route_ui.cc:1987
-#, fuzzy
-msgid "the master bus"
-msgstr "Le Bus Master"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr ""
-#: route_ui.cc:1987
-#, fuzzy
-msgid "the monitor bus"
-msgstr "Le Bus de Monitoring"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr ""
-#: route_ui.cc:1989
-#, fuzzy
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-"L'ID du controleur distant de %5 est : %2\n"
-"\n"
-"\n"
-"Les ID de controleurs distants sont déterminées par l'ordonnancement Pistes/"
-"Bus dans Ardour.\n"
-"\n"
-"%3Pour changer cela, aller dans la fenetre Préférences puis dans l'onglet "
-"Interaction Utlisateur%4"
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-"Clic gauche pour inverser la phase du canal %1 de cette piste. Clic droit "
-"pour afficher le menu."
-#: route_ui.cc:2048
-#, fuzzy
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "Cliquer affiche le menu des canaux pour l'inversion de phase"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr ""
#: search_path_option.cc:35
msgid "Select folder to search for media"
@@ -11183,131 +13104,161 @@ msgstr "Cliquer pour ajouter un nouvel emplacement"
msgid "the session folder"
msgstr "Le dossier de la session"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr "Départ "
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr "Réglages de Session"
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr "Options avancéesâ¦"
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessions récentes"
+
+#: session_dialog.cc:311
+#, fuzzy
+msgid "Sample Rate"
+msgstr "Taux d'échantillonage"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr ""
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
msgid "New Session"
msgstr "Nouvelle session"
-#: session_dialog.cc:301
+#: session_dialog.cc:379
#, fuzzy
msgid "Check the website for more..."
msgstr "Visiter le site web pour plus de détails..."
-#: session_dialog.cc:304
+#: session_dialog.cc:382
#, fuzzy
msgid "Click to open the program website in your web browser"
msgstr "Ouvrir le site du programme dans votre navigateur"
-#: session_dialog.cc:324
-#, fuzzy
-msgid "Sample Rate"
-msgstr "Taux d'échantillonage"
-
-# If chain doesn't say "formatting the disk" but "format OF the disk", translation is ok
-#: session_dialog.cc:325
-#, fuzzy
-msgid "Disk Format"
-msgstr "Format du Disque"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "Choisir un fichier de session"
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr "Autres sessions"
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr "Ouvrir"
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Nom de la session :"
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "Créer le dossier de session dans :"
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "Choisir le dossier de session"
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "Utiliser le modèle"
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr "Pas de modèle"
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 bit flottant"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr "flottant 32 bits"
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr "24 bits"
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr "16 bits"
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "canaux"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>Bus</b>"
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>Entrées</b>"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>Sorties</b>"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "Bus de sortie principal à "
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "Connecter automatiquement les entrées matérielles"
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "Utiliser seulement"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "Connecter automatiquement les sorties"
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "⦠au bus général"
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "⦠aux sorties matérielles"
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importer depuis une session"
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr "Ãlements"
@@ -11330,199 +13281,198 @@ msgstr "Import depuis la session"
msgid "This will select all elements of this type!"
msgstr "Tous les éléments de ce type seront sélectionnés !"
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
-msgstr ""
+msgstr "Clé de contrôle EAN correcte"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
-msgstr ""
+msgstr "Clé de contrôle EAN incorrecte"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
-msgstr ""
+msgstr "attendu"
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
-msgstr ""
+msgstr "Erreur de longueur EAN"
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
-msgstr "champ"
+msgstr "Champ"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "Valeurs (valeur actuelle au dessus)"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "Utilisateur"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr "Email"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr "Web"
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
#, fuzzy
msgid "Organization"
msgstr "Organisation"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
#, fuzzy
msgid "Country"
msgstr "Pays"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "Titre"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "Numéro de la piste"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "Sous-titre"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
#, fuzzy
msgid "Grouping"
msgstr "Groupe"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "Artiste"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "Genre"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "Commentaire"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "Droits d'auteur"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "Album"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Année"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "Artiste de l'album"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "Nombre de morceaux"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "Sous-titre du disque"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "Numéro du disque"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "Nombre de disques"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "Compilation"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr "ISRC"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
-msgstr ""
+msgstr "Code-barre EAN"
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "Participants"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "Auteur"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "Compositeur"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "Chef d'orchestre"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "Remixeur"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "Arrangeur"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "Ingénieur du son"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "Producteur"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "DJ Mixeur"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "Mixeur"
-#: session_metadata_dialog.cc:783
-#, fuzzy
+#: session_metadata_dialog.cc:786
msgid "School"
-msgstr "Ecole"
+msgstr "Ãcole"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
#, fuzzy
msgid "Instructor"
msgstr "Instructeur"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
#, fuzzy
msgid "Course"
msgstr "Cours"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "Ãditer les méta-données de la session"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "Importer les méta-données de session"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr ""
"Choisir la session à partir de laquelle les méta-données doivent être "
"importées"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "Ce fichier de session n'a pu être lu !"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -11530,7 +13480,7 @@ msgstr ""
"Le fichier de session ne contient pas de méta-données !\n"
"Le format de cette session est peut-être ancien ?"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr "Tout importer depuis :"
@@ -11548,7 +13498,7 @@ msgstr "Trames par secondes de « timecode »"
#: session_option_editor.cc:50
msgid "23.976"
-msgstr "23.976"
+msgstr "23,976"
#: session_option_editor.cc:51
msgid "24"
@@ -11556,7 +13506,7 @@ msgstr "24"
#: session_option_editor.cc:52
msgid "24.975"
-msgstr "24.975"
+msgstr "24,975"
#: session_option_editor.cc:53
msgid "25"
@@ -11564,11 +13514,11 @@ msgstr "25"
#: session_option_editor.cc:54
msgid "29.97"
-msgstr "29.97"
+msgstr "29,97"
#: session_option_editor.cc:55
msgid "29.97 drop"
-msgstr "29.97 drop"
+msgstr ""
#: session_option_editor.cc:56
msgid "30"
@@ -11576,11 +13526,11 @@ msgstr "30"
#: session_option_editor.cc:57
msgid "30 drop"
-msgstr "30 drop"
+msgstr ""
#: session_option_editor.cc:58
msgid "59.94"
-msgstr "59.94"
+msgstr "59,94"
#: session_option_editor.cc:59
msgid "60"
@@ -11592,19 +13542,19 @@ msgstr "Pullup/pulldown "
#: session_option_editor.cc:70
msgid "4.1667 + 0.1%"
-msgstr "4.1667 + 0.1%"
+msgstr "4,1667 + 0,1%"
#: session_option_editor.cc:71
msgid "4.1667"
-msgstr "4.1667"
+msgstr "4,1667"
#: session_option_editor.cc:72
msgid "4.1667 - 0.1%"
-msgstr "4.1667 - 0.1%"
+msgstr "4,1667 - 0.1%"
#: session_option_editor.cc:73
msgid "0.1"
-msgstr "0.1"
+msgstr "0,1"
#: session_option_editor.cc:74
msgid "none"
@@ -11612,34 +13562,35 @@ msgstr "aucun"
#: session_option_editor.cc:75
msgid "-0.1"
-msgstr "-0.1"
+msgstr "-0,1"
#: session_option_editor.cc:76
msgid "-4.1667 + 0.1%"
-msgstr "-4.1667 + 0.1%"
+msgstr "-4,1667 + 0,1%"
#: session_option_editor.cc:77
msgid "-4.1667"
-msgstr "-4.1667"
+msgstr "-4,1667"
#: session_option_editor.cc:78
msgid "-4.1667 - 0.1%"
-msgstr "-4.1667 - 0.1%"
+msgstr "-4,1667 - 0,1%"
#: session_option_editor.cc:84
-#, fuzzy
msgid ""
"Use Video File's FPS Instead of Timecode Value for Timeline and Video "
"Monitor."
msgstr ""
-"Utiliser le débit du fichier vidéo (à la place du Timecode) pour la Timeline "
-"et le Monitoring Vidéo."
+"Utiliser le débit du fichier vidéo au lieu du timecode pour la timeline et "
+"le Monitoring Vidéo."
#: session_option_editor.cc:91
msgid ""
"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
"sync)."
msgstr ""
+"Appliquer les pulldown/pullup à la timeline vidéo et au moniteur vidéo (sauf "
+"en cas d'utilisation de JACK-sync)"
# Chaîne suivie d'un « : » d'où l'espace insécable en fin
#: session_option_editor.cc:96
@@ -11679,232 +13630,248 @@ msgstr ""
#: session_option_editor.cc:136
msgid "destructive-xfade-seconds"
-msgstr ""
+msgstr "Secondes-de-fondu-destructif"
#: session_option_editor.cc:137
msgid "Destructive crossfade length"
msgstr "Durée du fondu destructif "
#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
msgid "Region fades active"
msgstr "Fondus des régions actifs"
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr "Fondus des régions visibles"
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr "Médias"
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr "Format de fichier audio"
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr "Ãchantillonnage "
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr "32 bits à virgule flottante"
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr "24 bits à entiers signés"
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr "16 bits à entiers signés"
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr "Type de fichier"
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr "WAVE-64"
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr "Emplacement des fichiers"
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr "Chercher les fichiers audio dans :"
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr "Chercher les fichiers MIDI dans :"
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
-msgstr ""
+msgstr "Noms de fichiers"
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
-msgstr ""
+msgstr "Dénomination de fichier"
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
-msgstr ""
+msgstr "Préfixer avec le numéro de piste"
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
+"Ajoute le numéro de piste en cours au début du nom du fichier enregistré."
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
-msgstr ""
+msgstr "Préfixer le nom de la prise"
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
-msgstr ""
+msgstr "Ajoute le nom de la prise au début du nom de fichier enregistré."
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
-msgstr ""
+msgstr "Nom de prise"
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
"L'écoute d'entrée des pistes suit automatiquement l'état du transport "
"(« auto-input »)"
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr "Utiliser une section d'écoute dans cette session"
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr "Bandeau de mesure"
-#: session_option_editor.cc:257
-#, fuzzy
+#: session_option_editor.cc:278
msgid "Route Display"
-msgstr "Affichage"
+msgstr "Affichage du routage"
-#: session_option_editor.cc:261
-#, fuzzy
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr "Afficher les Pistes MIDI"
-#: session_option_editor.cc:268
-#, fuzzy
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr "Afficher les Bus"
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
#, fuzzy
msgid "Include Master Bus"
msgstr "Inclure le Bus Master"
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
#, fuzzy
msgid "Button Area"
msgstr "Zone de Boutons"
-#: session_option_editor.cc:284
-#, fuzzy
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
-msgstr "Bouton Armer-Enregistrement"
+msgstr "Bouton d'armement d'enregistrement"
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
#, fuzzy
msgid "Mute Button"
msgstr "Bouton Muet"
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
#, fuzzy
msgid "Solo Button"
msgstr "Bouton Solo"
-#: session_option_editor.cc:305
-#, fuzzy
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
-msgstr "Boutons de Monitoring"
+msgstr "Boutons de monitoring"
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
#, fuzzy
msgid "Name Labels"
msgstr "Etiquettes de noms"
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
#, fuzzy
msgid "Track Name"
msgstr "Nom de la Piste"
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr "Les copies de région MIDI sont indépendantes"
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr "Règle de gestion du recouvrement de notes sur le même canal MIDI "
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr "interdire"
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr "ne rien faire"
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr "remplacer par la nouvelle note"
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr "raccourcir la note recouverte"
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr "raccourcir la nouvelle note"
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr "fusionner les notes"
-#: session_option_editor.cc:346
-#, fuzzy
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr "Coller aux mesures et temps"
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr "Coller les nouveaux repères aux mesures|temps"
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr "Coller les nouvelles régions aux mesures|temps"
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr "Par défaut"
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
-msgstr ""
+msgstr "Utiliser ces paramètres par défaut"
#: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
msgid "as new tracks"
@@ -11939,27 +13906,15 @@ msgstr "<b>Informations sur le fichier audio</b>"
msgid "Timestamp:"
msgstr "Horodatage :"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format :"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "Ãtiquettes :"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Impossible de lire le fichier « %1 » (%2)."
-
#: sfdb_ui.cc:297
#, fuzzy
msgid "<b>Midi File Information</b>"
msgstr "<b>Infos du Fichier Midi</b>"
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Impossible d'accéder au fichier audio : "
-
#: sfdb_ui.cc:530
#, fuzzy
msgid "SoundFileBox: Could not tokenize string: "
@@ -11969,190 +13924,183 @@ msgstr "SoundFileBox: Could not tokenize string: "
msgid "Search"
msgstr "Recherche"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr "Fichiers audio et MIDI"
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr "Audio"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr "Fichiers MIDI"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr "Tous les fichiers"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr "Parcourir les Fichiers"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "Chemins"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr "Recherche de tags"
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "Trier :"
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "Les plus longs"
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "Les plus courts"
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "Les plus récents"
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "Les plus anciens"
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "Les plus téléchargés"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "Les moins téléchargés"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr "Les mieux notés"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr "Les moins bien notés"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
#, fuzzy
msgid "More"
msgstr "Plus"
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
#, fuzzy
msgid "Similar"
msgstr "Similaire"
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr "Nom du fichier"
-#: sfdb_ui.cc:697
-#, fuzzy
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "Durée"
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
#, fuzzy
msgid "Size"
msgstr "Taille"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr "Taux d'échantillonnage"
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
#, fuzzy
msgid "License"
msgstr "Licence"
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "Rechercher sur Freesound"
-#: sfdb_ui.cc:738
-#, fuzzy
-msgid "Press to import selected files and close this window"
-msgstr "Importer les fichiers sélectionnés et fermer cette fenêtre"
-
-#: sfdb_ui.cc:739
-#, fuzzy
-msgid "Press to import selected files and leave this window open"
-msgstr "Importer les fichiers sélectionnés et laisser cette fenêtre ouverte"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr ""
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr "Cliquez pour fermer cette fenêtre sans importer de fichiers"
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
#, fuzzy
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "SoundFileBrowser: Could not tokenize string: "
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] "Encore %1 page de 100 résultats disponible"
msgstr[1] "Encore %1 pages de 100 résultats disponibles"
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
#, fuzzy
msgid "No more results available"
msgstr "Pas de résultat supplémentaire"
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr "B"
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr "kB"
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr "MB"
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr "GB"
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "une piste par fichier"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "une piste par canal"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr "fichiers séquencés"
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "tous les fichiers dans une piste"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "fusionner les fichiers"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "une région par fichier"
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "une région par voie"
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "tout dans une région"
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -12160,134 +14108,132 @@ msgstr ""
"Au moins un des fichiers sélectionnés\n"
"ne peut pas être utilisé par %1"
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "Copier les fichiers dans la session"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
-msgstr "Ã l'horodatage du fichier"
+msgstr "horodatage du fichier"
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "au point d'édition"
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "à la Tête de Lecture"
-#: sfdb_ui.cc:1685
-#, fuzzy
+#: sfdb_ui.cc:1689
msgid "session start"
-msgstr "au début de la session"
+msgstr "début de la session"
-#: sfdb_ui.cc:1691
-#, fuzzy
-msgid "<b>Add files as ...</b>"
-msgstr "<b>Ajouter les fichiers...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr "<b>Insérer</b>"
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
#, fuzzy
msgid "<b>Mapping</b>"
msgstr "<b>Routine</b>"
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr "<b>Qualité de la conversion</b>"
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
-msgstr ""
+msgstr "<b>Instrument</b>"
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "Excellente"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "Bonne"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "Rapide"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Très rapide"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr "Variateur de vitesse (clic droit pour les options)"
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr "Pourcentages"
# The plural is a mistake. Only one choice is available.
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr "Unité"
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr "Ressort"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr "Molette"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "Vitesse maximale"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
#, fuzzy
msgid "Playing"
msgstr "Lecture"
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d demi-tons"
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d demi-tons"
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Arrêt"
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
-msgstr ""
+msgstr "E-mail utilisateur"
#: soundcloud_export_selector.cc:45
msgid "Password"
-msgstr ""
+msgstr "Mot de passe"
#: soundcloud_export_selector.cc:46
msgid "Make files public"
-msgstr ""
+msgstr "Rendre les fichiers publics"
#: soundcloud_export_selector.cc:47
msgid "Open uploaded files in browser"
-msgstr ""
+msgstr "Ouvrir les fichiers téléversés dans le navigateur"
#: soundcloud_export_selector.cc:48
msgid "Make files downloadable"
-msgstr ""
+msgstr "Rendre les fichiers téléchargeables"
#: soundcloud_export_selector.cc:107
msgid "%1: %2 of %3 bytes uploaded"
-msgstr ""
+msgstr "%1: %2 sur %3 octets téléversés"
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "Chargement de %1â¦"
@@ -12303,7 +14249,7 @@ msgstr "Supprimer le haut-parleur"
msgid "Azimuth:"
msgstr "Azimuth :"
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
@@ -12311,11 +14257,11 @@ msgstr ""
"Utiliser une console de mixage externe ou celle de l'interface audio.\n"
"(%1 ne jouera AUCUN rôle dans le monitoring)"
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr "Demander à %1 de diffuser le signal pendant l'enregistrement"
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -12331,15 +14277,15 @@ msgstr ""
"\n"
"Nous allons configurer le logiciel avant que vous ne l'utilisiez.</span> "
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
-msgstr "Bienvenue dans Ardour"
+msgstr "Bienvenue dans %1"
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Dossier par défaut des sessions %1"
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -12356,11 +14302,11 @@ msgstr ""
"<i>(Vous pourrez créer des sessions n'importe où, c'est juste une valeur par "
"défaut)</i>"
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Dossier par défaut des nouvelles sessions"
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -12376,23 +14322,24 @@ msgstr ""
"Lors de l'enregistrement des instruments ou des voix, vous voudrez\n"
"certainement entendre le signal simultanément à son enregistrement. Ceci\n"
"est appelé le \"monitoring\".\n"
-"Il existe différentes manières de le faire, selon le matériel et sa"
-"configuration. Les deux manières les plus courantes sont présentées ici.\n"
+"Il existe différentes manières de le faire, selon le matériel et "
+"saconfiguration. Les deux manières les plus courantes sont présentées ici.\n"
"Veuillez en choisir une convenant à votre configuration.\n"
"\n"
-"<i>(Ce choix peut être modifié à tout moment, dans le dialogue des Préférences)</i>\n"
+"<i>(Ce choix peut être modifié à tout moment, dans le dialogue des "
+"Préférences)</i>\n"
"\n"
"<i>Si vous ne savez pas quoi choisir, conservez l'option par défaut.</i>"
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "Choix du monitoring"
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "Utiliser directement le bus principal (le \"master\")"
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -12400,11 +14347,11 @@ msgstr ""
"Connecter le bus principal directement aux sorties matérielles. Cette "
"configuration est préférable pour une utilisation simple."
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "Utiliser un bus de monitoring supplémentaire"
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -12413,8 +14360,7 @@ msgstr ""
"sorties matérielles pour un plus grand contrôle de l'écoute monitoring\n"
"sans affecter le mixage."
-#: startup.cc:321
-#, fuzzy
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -12422,88 +14368,84 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
"<i>Ceci peut être changé à tout moment dans le dialogue de Préférences.\n"
-"Vous pouvez aussi ajouter ou retirer la section d'écoute de toute session.</"
-"i>\n"
+"Vous pouvez aussi ajouter ou retirer la tranche de monitoring de toute "
+"session.</i>\n"
"\n"
"<i>Si vous ne voyez pas de quoi il s'agit, acceptez le choix par défaut.</i>"
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr "Section Monitoring"
-#: step_entry.cc:60
+#: step_entry.cc:59
#, fuzzy
msgid "Step Entry: %1"
-msgstr "Pas-Ã -pas : %1"
+msgstr "Pas-à -pas : %1"
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">temps"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">mesure"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
-msgstr ""
+msgstr ">EP"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
-msgstr ""
+msgstr "tenue"
-#: step_entry.cc:69
+#: step_entry.cc:68
#, fuzzy
msgid "rest"
msgstr "Silence"
-#: step_entry.cc:70
+#: step_entry.cc:69
#, fuzzy
msgid "g-rest"
msgstr "G"
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr "retour"
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
#: step_entry.cc:191
#, fuzzy
msgid "Set note length to a whole note"
-msgstr "Durée de la note : blanche"
+msgstr "Durée de la note : blanche"
#: step_entry.cc:192
#, fuzzy
msgid "Set note length to a half note"
-msgstr "Durée de la note : noire"
+msgstr "Durée de la note : noire"
#: step_entry.cc:193
#, fuzzy
msgid "Set note length to a quarter note"
-msgstr "Durée de la note : croche"
+msgstr "Durée de la note : croche"
#: step_entry.cc:194
#, fuzzy
msgid "Set note length to a eighth note"
-msgstr "Durée de la note : double croche"
+msgstr "Durée de la note : double croche"
#: step_entry.cc:195
#, fuzzy
msgid "Set note length to a sixteenth note"
-msgstr "Durée de la note : triple croche"
+msgstr "Durée de la note : triple croche"
#: step_entry.cc:196
#, fuzzy
msgid "Set note length to a thirty-second note"
-msgstr "Durée de la note : quadruple croche"
+msgstr "Durée de la note : quadruple croche"
#: step_entry.cc:197
#, fuzzy
msgid "Set note length to a sixty-fourth note"
-msgstr "Durée de la note : quintuple croche"
+msgstr "Durée de la note : quintuple croche"
#: step_entry.cc:276
msgid "Set volume (velocity) to pianississimo"
@@ -12530,13 +14472,12 @@ msgid "Set volume (velocity) to forte"
msgstr "Définir le volume (vélocité) à forte"
#: step_entry.cc:282
-#, fuzzy
msgid "Set volume (velocity) to fortissimo"
msgstr "Définir le volume (vélocité) à fortissimo"
#: step_entry.cc:283
msgid "Set volume (velocity) to fortississimo"
-msgstr ""
+msgstr "Définir le volume (vélocité) à fortississimo"
#: step_entry.cc:331
msgid "Stack inserted notes to form a chord"
@@ -12545,7 +14486,7 @@ msgstr "Empiler les notes pour former un accord"
#: step_entry.cc:332
#, fuzzy
msgid "Extend selected notes by note length"
-msgstr "Notes sélectionnées : étendre à la durée de note"
+msgstr "Notes sélectionnées : étendre à la durée de note"
#: step_entry.cc:333
#, fuzzy
@@ -12553,19 +14494,16 @@ msgid "Use undotted note lengths"
msgstr "Note non pointée"
#: step_entry.cc:334
-#, fuzzy
msgid "Use dotted (* 1.5) note lengths"
-msgstr "Note pointée (durée X 1,5)"
+msgstr "Note pointée (durée à 1,5)"
#: step_entry.cc:335
-#, fuzzy
msgid "Use double-dotted (* 1.75) note lengths"
-msgstr "Note double-pointée (durée X 1,75)"
+msgstr "Note double-pointée (durée à 1,75)"
#: step_entry.cc:336
-#, fuzzy
msgid "Use triple-dotted (* 1.875) note lengths"
-msgstr "Note triple-pointée (durée X 7/8)"
+msgstr "Note triple-pointée (durée à 7/8)"
#: step_entry.cc:337
#, fuzzy
@@ -12593,12 +14531,12 @@ msgstr "Ajouter un message de changement de banque"
msgid "Insert a program change message"
msgstr "Ajouter un message de changement de programme"
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
#, fuzzy
msgid "Move Insert Position Back by Note Length"
msgstr "Reculer la position d'insertion d'une durée de Note"
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr "Déplacer le point d'insertion au point d'édition"
@@ -12610,266 +14548,264 @@ msgstr "1Â /Â Note"
msgid "Octave"
msgstr "Octave"
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr "Insérer un la"
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr "Insérer un la dièse"
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr "Insérer un si"
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr "Insérer un do"
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr "Insérer un do dièse"
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr "Insérer un ré"
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr "Insérer un ré dièse"
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr "Insérer un mi"
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr "Insérer un fa"
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr "Insérer un fa dièse"
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr "Insérer un sol"
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr "Insérer un sol dièse"
-#: step_entry.cc:611
+#: step_entry.cc:605
#, fuzzy
msgid "Insert a Note-length Rest"
msgstr "Insérer un silence (durée de Note)"
-#: step_entry.cc:612
-#, fuzzy
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
-msgstr "Insérer un silence (durée de Note)"
+msgstr "Insérer un silence (durée d'aimantation)"
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr "Déplacer au prochain octave"
-#: step_entry.cc:617
+#: step_entry.cc:611
#, fuzzy
msgid "Move to Next Note Length"
-msgstr "A la prochaine durée de note"
+msgstr "Aller à la prochaine durée de note"
-#: step_entry.cc:618
-#, fuzzy
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
-msgstr "A la précédente durée de note"
+msgstr "Aller à la précédente durée de note"
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "Augmenter la durée de la note"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "Diminuer la durée de la note"
-#: step_entry.cc:623
-#, fuzzy
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
-msgstr "A la prochaine vélocité de note"
+msgstr "Aller à la prochaine vélocité de note"
-#: step_entry.cc:624
-#, fuzzy
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
-msgstr "A la précédente vélocité de note"
+msgstr "Aller à la précédente vélocité de note"
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr "Augmenter la vélocité de la note"
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr "Diminuer la vélocité de la note"
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "Passer à la 1re octave"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "Passer à la 2e octave"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "Passer à la 3e octave"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "Passer à la 4e octave"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "Passer à la 5e octave"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "Passer à la 6e octave"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "Passer à la 7e octave"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "Passer à la 8e octave"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "Passer à la 9e octave"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "Passer à la 10e octave"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "Passer à la 11e octave"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Activer/désactiver les triolets"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "(Dés)Activer la saisie d'accords"
+
+#: step_entry.cc:640
+#, fuzzy
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Prolonger les notes sélectionnées de la durée de note"
+
+#: step_entry.cc:650
#, fuzzy
msgid "Set Note Length to Whole"
-msgstr "Durée de la note : Entière"
+msgstr "Durée de la note : Entière"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
-msgstr "Durée de la note : 1/2"
+msgstr "Durée de la note : 1/2"
-#: step_entry.cc:648
+#: step_entry.cc:654
#, fuzzy
msgid "Set Note Length to 1/3"
-msgstr "Durée de la note : 1/3"
+msgstr "Durée de la note : 1/3"
-#: step_entry.cc:650
+#: step_entry.cc:656
#, fuzzy
msgid "Set Note Length to 1/4"
-msgstr "Durée de la note : 1/4"
+msgstr "Durée de la note : 1/4"
-#: step_entry.cc:652
+#: step_entry.cc:658
#, fuzzy
msgid "Set Note Length to 1/8"
-msgstr "Durée de la note : 1/8"
+msgstr "Durée de la note : 1/8"
-#: step_entry.cc:654
+#: step_entry.cc:660
#, fuzzy
msgid "Set Note Length to 1/16"
-msgstr "Durée de la note : 1/16"
+msgstr "Durée de la note : 1/16"
-#: step_entry.cc:656
+#: step_entry.cc:662
#, fuzzy
msgid "Set Note Length to 1/32"
-msgstr "Durée de la note : 1/32"
+msgstr "Durée de la note : 1/32"
-#: step_entry.cc:658
+#: step_entry.cc:664
#, fuzzy
msgid "Set Note Length to 1/64"
-msgstr "Durée de la note : 1/64"
+msgstr "Durée de la note : 1/64"
-#: step_entry.cc:663
+#: step_entry.cc:669
#, fuzzy
msgid "Set Note Velocity to Pianississimo"
-msgstr "Vélocité de la note : Pianississimo"
+msgstr "Vélocité de la note : Pianississimo"
-#: step_entry.cc:665
+#: step_entry.cc:671
#, fuzzy
msgid "Set Note Velocity to Pianissimo"
-msgstr "Vélocité de la note : Pianissimo"
+msgstr "Vélocité de la note : Pianissimo"
-#: step_entry.cc:667
+#: step_entry.cc:673
#, fuzzy
msgid "Set Note Velocity to Piano"
-msgstr "Vélocité de la note : Piano"
+msgstr "Vélocité de la note : Piano"
-#: step_entry.cc:669
+#: step_entry.cc:675
#, fuzzy
msgid "Set Note Velocity to Mezzo-Piano"
-msgstr "Vélocité de la note : Mezzo-Piano"
+msgstr "Vélocité de la note : Mezzo-Piano"
-#: step_entry.cc:671
+#: step_entry.cc:677
#, fuzzy
msgid "Set Note Velocity to Mezzo-Forte"
-msgstr "Vélocité de la note : Mezzo-Forte"
+msgstr "Vélocité de la note : Mezzo-Forte"
-#: step_entry.cc:673
+#: step_entry.cc:679
#, fuzzy
msgid "Set Note Velocity to Forte"
-msgstr "Vélocité de la note : Forte"
+msgstr "Vélocité de la note : Forte"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
#, fuzzy
msgid "Set Note Velocity to Fortississimo"
-msgstr "Vélocité de la note : Fortississimo"
-
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
+msgstr "Vélocité de la note : Fortississimo"
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr "Pas de notes pointées"
-#: step_entry.cc:686
+#: step_entry.cc:689
#, fuzzy
msgid "Toggled Dotted Notes"
msgstr "Notes Pointées"
-#: step_entry.cc:688
+#: step_entry.cc:690
#, fuzzy
msgid "Toggled Double-Dotted Notes"
msgstr "Notes Double-pointées"
-#: step_entry.cc:690
+#: step_entry.cc:691
#, fuzzy
msgid "Toggled Triple-Dotted Notes"
msgstr "Notes Triple-pointées"
-#: step_entry.cc:693
-#, fuzzy
-msgid "Toggle Chord Entry"
-msgstr "Basculer en entrée d'accord"
-
-#: step_entry.cc:695
-#, fuzzy
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Prolonger les notes sélectionnées de la durée de note"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr "G : %3d D : %3d Stéréo : %d%%"
-#: stereo_panner_editor.cc:35
-#, fuzzy
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
-msgstr "Panoramique stéréo"
+msgstr "Balance stéréo"
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
#, fuzzy
msgid "Width"
msgstr "Largeur"
@@ -12879,180 +14815,193 @@ msgstr "Largeur"
msgid "Strip Silence"
msgstr "Enlever le silence"
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Seuil"
+
+#: strip_silence_dialog.cc:76
#, fuzzy
msgid "Minimum length"
msgstr "Durée minimum"
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
#, fuzzy
msgid "Fade length"
msgstr "Durée du fondu"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "Mesure :"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "Temps :"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
#, fuzzy
msgid "Pulse note"
msgstr "Note percussive"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
-msgstr ""
-
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Ãdition du tempo"
+msgstr "Battre le tempo"
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "Ronde"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "Blanche"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "Noire pointée"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "Noire"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "Croche "
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "Double croche"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "Triple croche"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "Quadruple croche"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "Quintuple croche"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Battements par minute :"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr "Le tempo démarre à "
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
+msgstr "type de rythmique incompréhensible (%1) "
+
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Ãditer signature"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "Valeur de note :"
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Temps par mesure :"
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr "La signature commence à la mesure :"
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
-msgstr ""
-
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Thème sombre"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Thème clair"
+msgstr "type de signature incompréhensible (%1)"
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Restaurer la configuration par défaut"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr "Afficher des boutons « plats »"
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
-msgstr ""
+msgstr "Faire clignoter les boutons d'armement d'enregistrement"
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Appliquer la couleur de la piste aux régions"
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
-msgstr ""
+msgstr "Montrer lâécrêtage des formes d'ondes"
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
-msgstr ""
+msgstr "Profondeur de dégradé des couleurs de formes d'ondes"
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
-msgstr ""
+msgstr "Profondeur de dégradé des éléments de la timeline"
-#: theme_manager.cc:76
+#: theme_manager.cc:61
#, fuzzy
msgid "All floating windows are dialogs"
msgstr "Les fenêtres flottantes sont des boites de dialogues."
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
-msgstr ""
-
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objet"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
+msgstr "les fenêtres des transitoires suivent la fenêtre au premier plan."
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr ""
+#: theme_manager.cc:64
+msgid "Icon Set"
+msgstr "Jeu d'icônes"
-#: theme_manager.cc:195
+#: theme_manager.cc:132
#, fuzzy
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
@@ -13065,94 +15014,100 @@ msgstr ""
"Cela peut aider certains gestionnaires de fenetres (WM), et nécessite un "
"redémarrage d'%1 pour prendre effet."
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
+"Impose aux fenêtres de dialogue de suivre la fenêtre au premier plan "
+"lors du basculement entre l'éditeur et le mixeur.\n"
+"Nécessite un redémarrage de %1"
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr "Nom piste/bus (double cliquer pour éditer)"
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] "la nouvelle durée d'%1 trame est hors limites pour %2"
msgstr[1] "la nouvelle durée de %1 trames est hors limites pour %2"
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "rapide, basse qualité"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Pas d'anti-crénelage"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Contenu :"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
#, fuzzy
msgid "Minimize time distortion"
msgstr "Minimiser la distorsion temporelle"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
-msgstr ""
+msgstr "Préserver les formants"
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
#, fuzzy
msgid "TimeFXDialog"
msgstr "TimeFXDialog"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr "Décalage de tonalité audio"
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr "Ãtirer/contracter audio"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "Octaves :"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "Demi-tons :"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr "Cents :"
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr "Décaler"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr "TimeFXButton"
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "Ãtirer/contracter"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr "<b>Avancement</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Démarrer l'enregistrement au punch-in"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Stopper l'enregistrement au punch-out"
@@ -13163,32 +15118,31 @@ msgstr "programming error: request for non-existent audio range (%1)!"
#: transform_dialog.cc:39
msgid "this note's"
-msgstr ""
+msgstr "celui de cette note"
#: transform_dialog.cc:40
-#, fuzzy
msgid "the previous note's"
-msgstr "A la précédente durée de note"
+msgstr "Celui de la note précédente"
#: transform_dialog.cc:41
msgid "this note's index"
-msgstr ""
+msgstr "index de cette note"
#: transform_dialog.cc:42
msgid "the number of notes"
-msgstr ""
+msgstr "le nombre de notes"
#: transform_dialog.cc:43
msgid "exactly"
-msgstr ""
+msgstr "exactement"
#: transform_dialog.cc:44
msgid "a random number from"
-msgstr ""
+msgstr "un nombre aléatoire de"
#: transform_dialog.cc:55
msgid "equal steps from"
-msgstr ""
+msgstr "des pas égaux de"
#: transform_dialog.cc:58
#, fuzzy
@@ -13196,27 +15150,25 @@ msgid "note number"
msgstr "numéro de note"
#: transform_dialog.cc:59
-#, fuzzy
msgid "velocity"
-msgstr "Vélocité"
+msgstr "vélocité"
#: transform_dialog.cc:60
msgid "start time"
-msgstr ""
+msgstr "temps de début"
#: transform_dialog.cc:61
-#, fuzzy
msgid "length"
-msgstr "Durée"
+msgstr "durée"
#: transform_dialog.cc:82 transform_dialog.cc:113
msgid "Transform"
-msgstr ""
+msgstr "Transformer"
#: transform_dialog.cc:91
#, fuzzy
msgid "Set "
-msgstr "Créer une boucle à partir de l'intervalle"
+msgstr "Créer"
#: transpose_dialog.cc:30
msgid "Transpose MIDI"
@@ -13226,111 +15178,147 @@ msgstr "Transposer le MIDI"
msgid "Transpose"
msgstr "Transposer"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:417
msgid "Loading default ui configuration file %1"
msgstr ""
"Chargement du fichier de style par défaut (%1) pour l'interface graphique"
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:420
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
"impossible de lire le fichier de configuration d'interface graphique par "
"défaut « %1 »"
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:425
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
"le fichier par défaut (%1) pour la configuration de l'interface graphique "
"n'a pas pu être chargé correctement."
-#: ui_config.cc:177
+#: ui_config.cc:248
#, fuzzy
msgid "Could not find default UI configuration file %1"
msgstr ""
"Chargement du fichier de style par défaut (%1) pour l'interface graphique"
-#: ui_config.cc:219
+#: ui_config.cc:289
msgid "Loading color file %1"
-msgstr ""
+msgstr "Chargement du fichier de couleur %1"
-#: ui_config.cc:222
+#: ui_config.cc:341
msgid "cannot read color file \"%1\""
-msgstr ""
+msgstr "impossible de lire le fichier de couleur \"%1\""
-#: ui_config.cc:227
+#: ui_config.cc:346
msgid "color file \"%1\" not loaded successfully."
-msgstr ""
+msgstr "le fichier de couleur \"%1\" n'a pas été chargé correctement"
-#: ui_config.cc:233
-msgid "Color file %1 not found"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
msgstr ""
-#: ui_config.cc:282 ui_config.cc:361
-#, fuzzy
+#: ui_config.cc:403 ui_config.cc:486
msgid "Color file %1 not saved"
-msgstr "Fichier de configuration %1 non sauvegardé"
+msgstr "Fichier de couleur %1 non sauvegardé"
-#: ui_config.cc:317
+#: ui_config.cc:434
msgid "Loading user ui configuration file %1"
msgstr ""
"Chargement du fichier utilisateur de la configuration de l'interface "
"graphique %1"
-#: ui_config.cc:320
+#: ui_config.cc:437
msgid "cannot read ui configuration file \"%1\""
msgstr ""
"impossible de lire le fichier (%1) pour la configuration de l'interface "
"graphique"
-#: ui_config.cc:325
+#: ui_config.cc:442
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
"le fichier utilisateur de configuration de l'interface graphique « %1 » n'a "
"pas pu être chargé correctement."
-#: ui_config.cc:333
+#: ui_config.cc:450
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
"aucun fichier de configuration de l'interface graphique n'a éte trouvé.\n"
"Elle aura l'air étrange."
-#: ui_config.cc:351
+#: ui_config.cc:471
msgid "Config file %1 not saved"
msgstr "Fichier de configuration %1 non sauvegardé"
-#: ui_config.cc:592
-#, fuzzy
+#: ui_config.cc:716
msgid "Color %1 not found"
-msgstr "Préset de plugin %1 non trouvé"
+msgstr "Couleur %1 introuvable"
-#: ui_config.cc:662
+#: ui_config.cc:786
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
"Impossible de trouver le fichier de style « %1 » dans « %2 ». L'interface de "
"%3 sera étrange."
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "mauvais entête XPM %1"
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr "impossible de trouver le fichier XMP pour %1"
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr "par défaut"
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
+"L'icône \"%1\" est introuvable dans le jeu d'icônes \"%2\", icône par défaut "
+"utilisée"
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr "Impossible de trouver l'icône pour %1 avec %2"
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
+msgstr "Exception rencontrée lors du chargement de l'icône %1"
+
+#: utils.cc:818
+msgid "Overwrite"
+msgstr "Ãcraser"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
msgstr ""
#: add_video_dialog.cc:54
@@ -13354,14 +15342,12 @@ msgid "Reload docroot"
msgstr "Recharger le répertoire-racine"
#: add_video_dialog.cc:120
-#, fuzzy
msgid "Video files"
msgstr "Fichiers vidéo"
#: add_video_dialog.cc:149
-#, fuzzy
msgid "<b>Video Information</b>"
-msgstr "<b>Infos de la vidéo</b>"
+msgstr "<b>Informations vidéo</b>"
#: add_video_dialog.cc:152
#, fuzzy
@@ -13380,13 +15366,30 @@ msgstr "Format de l'image :"
#: add_video_dialog.cc:244
msgid "VideoServerIndex"
-msgstr ""
+msgstr "Index de serveur vidéo"
#: add_video_dialog.cc:675
msgid " %1 fps"
+msgstr " %1 ips"
+
+# Short for Device Output
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "S"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
#, fuzzy
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
@@ -13396,36 +15399,36 @@ msgstr ""
"il lire le fichier ? Le répertoire-racine convient-il ? Est-ce un fichier "
"vidéo ?"
-#: video_timeline.cc:506
+#: video_timeline.cc:510
#, fuzzy
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-"Echec du réglage de débit (Img/sec) : '%1' n' a aucune option correspondante "
+"Echec du réglage de débit (Img/sec) : '%1' n' a aucune option correspondante "
"dans %2."
-#: video_timeline.cc:514
+#: video_timeline.cc:518
#, fuzzy
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
"Le débit Img/sec du fichier vidéo ne correspond pas à celui du Timecode de "
-"la session : '%2' versus '%3'"
+"la session : '%2' versus '%3'"
-#: video_timeline.cc:587
+#: video_timeline.cc:591
#, fuzzy
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-"Incompatibilité du répertoire-racine. %1 : '%2', serveur-vidéo : '%3'. En "
+"Incompatibilité du répertoire-racine. %1 : '%2', serveur-vidéo : '%3'. En "
"général, ça signale un démarrage hors-Ardour du serveur-vidéo, et "
"l'utilisation d'un répertoire-racine différent."
-#: video_timeline.cc:724
+#: video_timeline.cc:728
#, fuzzy
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
@@ -13435,34 +15438,35 @@ msgid ""
"\n"
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-"Le moniteur vidéo 'xjadeo' est introuvable. Merci d'installer : http://"
+"Le moniteur vidéo 'xjadeo' est introuvable. Merci d'installer : http://"
"xjadeo.sf.net/ (Spécifier le chemin vers xjadeo est possible en réglant les "
"variables d'environnement de XJREMOTE. Cela doit désigner une application "
"compatible avec l'interface de télécommande de xjadeo -xjremote-).\n"
"\n"
"voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
-msgstr ""
+msgstr "Le moniteur vidéo 'xjadeo' n'a pas pu être démarré."
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
+"Le moniteur vidéo 'xjadeo' est trop ancien. Installez xjadeo version 0.7.7 "
+"ou ultérieur. http://xjadeo.sf.net/"
-#: video_monitor.cc:285
+#: video_monitor.cc:283
#, fuzzy
msgid "Video Monitor: File Not Found."
msgstr "Moniteur Vidéo : Fichier Non Trouvé."
#: transcode_ffmpeg.cc:56
-#, fuzzy
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -13475,21 +15479,6 @@ msgid ""
"\n"
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-"Pas de paquet ffprobe ou ffmpeg sur votre système.\n"
-"L'import/export Vidéo est impossible sans installer ces outils.\n"
-"%1 nécessite ffmpeg et ffprobe, fournis par ffmpeg.org, version 1.1 ou plus "
-"récente.\n"
-"\n"
-"Ces outils sont inclus dans la version %1 d'ardour.org et aussi disponibles "
-"avec le serveur-vidéo à http://x42.github.com/harvid/\n"
-"\n"
-"Important : les fichiers sont à installer dans $PATH et à nommer "
-"ffmpeg_harvid et ffprobe_harvid.\n"
-"Si votre système inclut déjà les paquets concernés, nous vous recommandons "
-"la création de liens symboliques de ffmpeg à ffmpeg_harvid et de ffprobe à "
-"ffprobe_harvid.\n"
-"\n"
-"voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
#: transcode_video_dialog.cc:56
#, fuzzy
@@ -13497,44 +15486,40 @@ msgid "Transcode/Import Video File "
msgstr "Transcodage/Import du fichier vidéo "
#: transcode_video_dialog.cc:58
-#, fuzzy
msgid "Output File:"
msgstr "Fichier de sortie :"
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
-#, fuzzy
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
-msgstr "Abandon"
+msgstr "Annuler"
#: transcode_video_dialog.cc:63
msgid "Height = "
msgstr "Hauteur = "
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
#, fuzzy
msgid "Manual Override"
msgstr "Commande manuelle auxiliaire"
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
#, fuzzy
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr "Mode Débug: commande ffmpeg et sortie vers stdout."
#: transcode_video_dialog.cc:107
-#, fuzzy
msgid "<b>File Information</b>"
-msgstr "<b>Infos du fichier</b>"
+msgstr "<b>Informations du fichier</b>"
#: transcode_video_dialog.cc:113
-#, fuzzy
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
-"Les éxécutables ffprobe ou ffmpeg ne sont pas disponibles. L'import Vidéo "
-"est impossible sans installer ces outils. Vous trouverez plus d'infos dans "
-"la fenêtre de Log."
#: transcode_video_dialog.cc:120
#, fuzzy
@@ -13545,102 +15530,96 @@ msgstr ""
"Infos-fichier illisibles. Probablement '%1' n'est pas un fichier vidéo, ou "
"le codec / format n'est pas supporté."
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
#, fuzzy
msgid "FPS:"
-msgstr "IPS :"
+msgstr "IPSÂ :"
-#: transcode_video_dialog.cc:136
-#, fuzzy
-msgid "Duration:"
-msgstr "Durée :"
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
#, fuzzy
msgid "Codec:"
-msgstr "Codec :"
+msgstr "Codec :"
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
#, fuzzy
msgid "Geometry:"
-msgstr "Géométrie :"
+msgstr "Géométrie :"
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
-msgstr ""
+msgstr "??"
-#: transcode_video_dialog.cc:176
-#, fuzzy
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
-msgstr "<b>Importer Réglages</b>"
+msgstr "<b>Paramètres d'import</b>"
-#: transcode_video_dialog.cc:181
-#, fuzzy
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-"Référence d'emplacement actuel (seulement les fichiers déjà transcodés)"
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
#, fuzzy
msgid "Import/Transcode Video to Session"
msgstr "Importer/transcoder vidéo vers session"
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
#, fuzzy
msgid "Do Not Import Video (Audio Import Only)"
msgstr "Importer seulement l'Audio (pas la vidéo)"
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
#, fuzzy
msgid "Scale Video: Width = "
-msgstr "Format vidéo : Largeur = "
+msgstr "Format vidéo : Largeur = "
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
#, fuzzy
msgid "Original Width"
msgstr "Largeur originelle"
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
#, fuzzy
msgid "Bitrate (KBit/s):"
-msgstr "Taux (KBits/sec) :"
+msgstr "Taux (KBits/sec)Â :"
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
#, fuzzy
msgid "Extract Audio:"
-msgstr "Extraire l'Audio :"
+msgstr "Extraire l'Audio :"
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
#, fuzzy
msgid "No Audio Track Present"
msgstr "Aucune Piste Audio"
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
#, fuzzy
msgid "Do Not Extract Audio"
msgstr "Ne pas extraire l'Audio"
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
#, fuzzy
msgid "Extracting Audio.."
msgstr "Extraction Audio.."
-#: transcode_video_dialog.cc:353
-#, fuzzy
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
-msgstr "Echec de l'extraction Audio."
+msgstr "Ãchec de l'extraction audio."
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
#, fuzzy
msgid "Transcoding Video.."
msgstr "Transcodage Vidéo.."
-#: transcode_video_dialog.cc:413
-#, fuzzy
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
-msgstr "Echec du Transcodage."
+msgstr "Ãchec du Transcodage."
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr "Sauvegarder le fichier vidéo transcodé"
@@ -13650,9 +15629,8 @@ msgid "Launch Video Server"
msgstr "Lancer le Serveur Vidéo"
#: video_server_dialog.cc:53
-#, fuzzy
msgid "Server Executable:"
-msgstr "Exécutable du Serveur :"
+msgstr "Exécutable du serveur :"
#: video_server_dialog.cc:55
#, fuzzy
@@ -13664,7 +15642,7 @@ msgstr "Répertoire-racine du Serveur:"
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr "Ne plus afficher ce message. (Rà Z dans Edition -> Préférences)."
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
#, fuzzy
msgid ""
"The external video server 'harvid' can not be found.\n"
@@ -13681,49 +15659,46 @@ msgstr ""
"\n"
"voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
-#: video_server_dialog.cc:129
-#, fuzzy
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr "Adresse d'écoute :"
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
#, fuzzy
msgid "Listen Port:"
msgstr "Port d'écoute :"
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
#, fuzzy
msgid "Cache Size:"
msgstr "Taille du cache :"
-#: video_server_dialog.cc:145
-#, fuzzy
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-"%1 s'appuie sur un Serveur Vidéo externe pour la timeline vidéo.\n"
+"%1 utilise un Serveur Vidéo externe pour la timeline vidéo.\n"
"Le serveur configuré dans Edition -> Préférences -> Vidéo n'est pas "
"accessible.\n"
-"Voulez vous qu'%1 lance 'harvid' sur cette machine?"
+"Voulez vous qu'%1 lance 'harvid' sur cette machine ?"
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
#, fuzzy
msgid "Set Video Server Executable"
msgstr "Réglages du programme de Serveur Vidéo"
-#: video_server_dialog.cc:209
-#, fuzzy
+#: video_server_dialog.cc:206
msgid "Server docroot"
-msgstr "Dossier-racine du Serveur"
+msgstr "Dossier-racine du serveur"
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
#, fuzzy
msgid "Destination is outside Video Server's docroot. "
msgstr "L'emplacement n'est pas dans le dossier-vidéo-racine."
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
#, fuzzy
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
@@ -13732,194 +15707,172 @@ msgstr ""
"Le fichier va être sauvegardé hors du dossier Serveur Vidéo racine. Le "
"Serveur Vidéo ne pourra pas le lire. Voulez vous vraiment continuer ?"
-#: utils_videotl.cc:64
-#, fuzzy
+#: utils_videotl.cc:65
msgid "Continue"
msgstr "Continuer"
-#: utils_videotl.cc:70
-#, fuzzy
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr "Confirmer l'écrasement"
-#: utils_videotl.cc:71
-#, fuzzy
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr "Un fichier existant porte déjà ce nom. Voulez vous l'écraser ?"
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
-#, fuzzy
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
-msgstr "Création du dossier vidéo \"%1\" impossible (%2)"
+msgstr "Impossible de créer le dossier vidéo \"%1\" (%2)"
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
#, fuzzy
msgid "Export Video File "
msgstr "Export du fichier vidéo"
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
#, fuzzy
msgid "Video:"
-msgstr "Vidéo :"
+msgstr "Vidéo :"
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
#, fuzzy
msgid "Scale Video (W x H):"
msgstr "Taille de vidéo (L x H)"
-#: export_video_dialog.cc:88
-#, fuzzy
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
-msgstr "Format de l'image :"
+msgstr "Conserver l'aspect"
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
#, fuzzy
msgid "Set Aspect Ratio:"
msgstr "Régler le ratio d'aspect :"
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
#, fuzzy
msgid "Normalize Audio"
msgstr "Normaliser l'Audio"
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
#, fuzzy
msgid "2 Pass Encoding"
msgstr "Encodage à 2 passes"
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
#, fuzzy
msgid "Codec Optimizations:"
-msgstr "Optimisations du Codec :"
+msgstr "Optimisations du Codec :"
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
#, fuzzy
msgid "Deinterlace"
msgstr "Désinterlacer"
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
#, fuzzy
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr "Choisir [2] B-frames (MPEG 2 ou 4 seulement)"
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
#, fuzzy
msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr "Ecraser FPS (le défaut est d'aligner sur le fichier vidéo d'entrée) :"
+msgstr "Ecraser FPS (le défaut est d'aligner sur le fichier vidéo d'entrée) :"
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
#, fuzzy
msgid "Include Session Metadata"
msgstr "Inclure les métadonnées de la session"
-#: export_video_dialog.cc:119
-#, fuzzy
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-"Pas de paquet ffprobe ou ffmpeg sur votre système. L'exportation Vidéo est "
-"impossible sans installer ces outils. Plus d'infos dans la fenêtre de Log."
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
-msgstr ""
+msgstr "<b>Sortie :</b>(l'extension de fichier détermine le format)"
-#: export_video_dialog.cc:140
-#, fuzzy
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
-msgstr "<b>Entrée :</b>"
+msgstr "<b>Entrée vidéo :</b>"
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr "Audio :"
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
#, fuzzy
msgid "Master Bus"
msgstr "Bus Master"
-#: export_video_dialog.cc:158
-#, fuzzy
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr "du début à la fin de la session %1"
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr "<b>Réglages :</b>"
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr "Intervalle :"
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Préréglage :"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr "Codec vidée :"
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr "Débit vidéo (kb / s) :"
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr "Codec audio :"
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr "Débit audio (kb / s)"
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr "Fréquence d'échantillonnage audio :"
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
-#, fuzzy
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
-msgstr "Format de sortie par défaut"
+msgstr "(format de sortie par défaut)"
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
-#, fuzzy
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr "(par défaut)"
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
-msgstr ""
+msgstr "(conserver)"
-#: export_video_dialog.cc:348
-#, fuzzy
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr "de 00:00:00:00 à la fin de la vidéo"
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
#, fuzzy
msgid "from the video's start to the video's end"
msgstr "du début à la fin de la vidéo"
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr "Intervalle sélectionné"
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr "Normaliser audio"
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr "Exporter audio"
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr "Exporter audioâ¦"
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
@@ -13927,37 +15880,37 @@ msgstr ""
"Export vidéo : impossible de récupérer la durée du fichier vidéo, "
"utilisation de la durée de la « timeline »."
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr "Export vidéo : l'intervalle d'export ne contient pas de vidéo."
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
"Export vidéo : aucun port de sortie principal auquel se connecter pour "
"l'export audio"
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr "Encodage vidéoâ¦"
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr "Export vidéo : le fichier vidéo d'entrée ne peut être lu."
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr "Encodage vidéo⦠Passe 1 / 2"
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr "Encodage vidéo⦠Passe 2 / 2"
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr "Ãchec du transcodage."
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr "Sauvegarder le fichier vidéo exporté"
@@ -13975,20 +15928,628 @@ msgid "<b>Video Export Info</b>"
msgstr "<b>Informations d'export vidéo</b>"
#: export_video_infobox.cc:51
-#, fuzzy
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
-"L'encodage Vidéo est une tâche complexe avec de nombreux détails\n"
-"\n"
-"Merci de consulter le manuel à %1/video-timeline/operations/#export "
-"(anglais).\n"
-"\n"
-"Ouvrir le manuel en ligne ? "
+
+#, fuzzy
+#~ msgid ""
+#~ "%1%2\n"
+#~ "(built from revision %3)"
+#~ msgstr ""
+#~ "%1\n"
+#~ "(compilé de la révision %2)"
+
+#~ msgid "Busses"
+#~ msgstr "Bus"
+
+#~ msgid "Display model"
+#~ msgstr "Modèle d'affichage"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Graphs composite pour chaque piste"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Graph composite de toutes les pistes"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normaliser"
+
+#~ msgid "Locations"
+#~ msgstr "Repères et intervalles"
+
+#~ msgid "Save as..."
+#~ msgstr "Sauvegarder sousâ¦"
+
+#~ msgid ""
+#~ "A snapshot already exists with that name. Do you want to overwrite it?"
+#~ msgstr "Un cliché de ce nom existe déjà . Voulez-vous l'écraser ?"
+
+#~ msgid "Could not disconnect from Audio/MIDI engine"
+#~ msgstr "Déconnection du moteur Audio/MIDI impossible"
+
+#~ msgid "Could not reconnect to the Audio/MIDI engine"
+#~ msgstr "Reconnection au moteur Audio/MIDI impossible"
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4Session issue d'une ancienne version de %3%5\n"
+#~ "\n"
+#~ "%3 a copié l'ancien fichier de session\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "vers\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "Ã partir de maintenant, utilisez la version -2000 avec d'anciennes "
+#~ "versions de %3"
+
+#~ msgid "Playhead follows Range Selections and Edits"
+#~ msgstr ""
+#~ "La tête de lecture suit les intervalles de sélection et les éditions"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Actif lorsqu'une écoute est en cours\n"
+#~ "Cliquer pour stopper l'écoute."
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr ""
+#~ "Cet écran n'est pas assez haut pour afficher la fenêtre de la console de "
+#~ "mixage"
+
+#~ msgid "Open Video"
+#~ msgstr "Ouvrir vidéo"
+
+#~ msgid "Export To Video File"
+#~ msgstr "Exporter vers un fichier vidéoâ¦"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Prendre un clichéâ¦"
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Exporter vers fichier(s) audioâ¦"
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Afficher les barres d'outils"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "Basculer Ãditeur+Console de mixage"
+
+#~ msgid "Reference"
+#~ msgstr "Référence"
+
+#, fuzzy
+#~ msgid "Report A Bug"
+#~ msgstr "Rapporter un &bogue..."
+
+#~ msgid "Transition To Roll"
+#~ msgstr "Lecture avant"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "Lecture arrière"
+
+#~ msgid "Set From Playhead"
+#~ msgstr "Régler à la tête de lecture"
+
+#, fuzzy
+#~ msgid "Set to %1 beat(s)"
+#~ msgstr "Impossible de régler le pilote sur %1"
+
+#~ msgid "Fill Range with Region"
+#~ msgstr "Remplir l'intervalle avec la région"
+
+#~ msgid "Consolidate Range With Processing"
+#~ msgstr "Consolider l'intervalle avec traitement"
+
+# Jargon
+#~ msgid "Bounce Range to Region List With Processing"
+#~ msgstr "« Bouncer » l'intervalle vers la liste des régions avec traitement"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Lire au point d'édition"
+
+#~ msgid "Play From Start"
+#~ msgstr "Lire depuis le début"
+
+#, fuzzy
+#~ msgid "Smart Mode (add Range functions to Grab mode)"
+#~ msgstr "Mode Smart (ajoute des fonctions d'intervalle au mode Object)"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoomer sur"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Arrêter le déplacement ou tout désélectionner"
+
+#~ msgid "Playhead To Next Grid"
+#~ msgstr "Tête de lecture à la grille suivante"
+
+#~ msgid "Playhead To Previous Grid"
+#~ msgstr "Tête de lecture à la grille précédente"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importer depuis une session"
+
+#~ msgid "Show Logo"
+#~ msgstr "Afficher le logo"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "Raccourcis d'éditeur chargés depuis %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr ""
+#~ "Impossible de trouver « editor.bindings » dans le chemin de recherche %1"
+
+#~ msgid "Snap Position To Grid"
+#~ msgstr "Aligner la position sur la grille"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Insérer région depuis la liste des régions"
+
+#~ msgid "group|G"
+#~ msgstr "G"
+
+#~ msgid "relative|Rel"
+#~ msgstr "Rel."
+
+#~ msgid "mute|M"
+#~ msgstr "M"
+
+#~ msgid "solo|S"
+#~ msgstr "S"
+
+#~ msgid "monitoring|Mon"
+#~ msgstr "Mon."
+
+#~ msgid "selection|Sel"
+#~ msgstr "Sél."
+
+#~ msgid "active|A"
+#~ msgstr "A"
+
+#~ msgid "File Exists!"
+#~ msgstr "Le fichier existe !"
+
+#~ msgid "Overwrite Existing File"
+#~ msgstr "Ãcraser le fichier existant"
+
+#~ msgid "End point trim"
+#~ msgstr "Rogner la fin"
+
+#~ msgid "duplicate selection"
+#~ msgstr "dupliquer la sélection"
+
+#~ msgid "tracks"
+#~ msgstr "pistes"
+
+#~ msgid "busses"
+#~ msgstr "bus"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "G"
+#~ msgstr "G"
+
+#~ msgid "O"
+#~ msgstr "O"
+
+# Short for Input
+#~ msgid "I"
+#~ msgstr "E"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "SI"
+#~ msgstr "SI"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Afficher les pistes ayant une région sous la tête de lecture"
+
+#~ msgid ""
+#~ "The %1 audio backend was configured and started externally.\n"
+#~ "This limits your control over it."
+#~ msgstr ""
+#~ "Le moteur audio %1 a été configuré et démarré extérieurement.\n"
+#~ "Cela limite votre contrôle."
+
+#~ msgid "Export region contents"
+#~ msgstr "Exporter le contenu de la région"
+
+#~ msgid "Export track output"
+#~ msgstr "Exporter la sortie de piste"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr ""
+#~ "<i>Créer le(s) nom(s) de fichier(s) à partir de ces composants :</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>Nom de fichier (approximatif) actuel : « %1 »</i></small>"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "Commande à lancer après l'export\n"
+#~ "(%f = chemin complet et nom de fichier, %d = répertoire, %b = nom de "
+#~ "base)Â :"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Créer un nouveau groupe à partir de"
+
+#~ msgid "Insert time on all the track's playlists"
+#~ msgstr "Insérer du temps sur toutes les playlists de la piste"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Sélectionnez une action, puis appuyez sur la touche pour définir le "
+#~ "raccourci"
+
+#, fuzzy
+#~ msgid "Main_menu"
+#~ msgstr "Menu_Principal"
+
+#~ msgid "Program "
+#~ msgstr "Programme"
+
+#, fuzzy
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "Réglages de Console chargées depuis %1"
+
+#, fuzzy
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "Réglages de Console introuvables dans %1"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Commentaires*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Cmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Cliquer pour ajouter ou modifier les commentaires"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID de télécommandeâ¦"
+
+#, fuzzy
+#~ msgid "C"
+#~ msgstr "Ajouter un do"
+
+#~ msgid ""
+#~ " -k, --keybindings filename Name of key bindings to load (default is ~/."
+#~ "ardour3/ardour.bindings)\n"
+#~ msgstr ""
+#~ " -k, --keybindings nomfichier Nom du fichier des raccourcis "
+#~ "claviers à charger (par défaut ~/.ardour3/ardour.bindings)\n"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Rafraîchir les greffons disponibles"
+
+#~ msgid "alsa_pcm"
+#~ msgstr "alsa_pcm"
+
+#, fuzzy
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Impossible d'ajouter un port, le premier traitement de la Piste ou Bus "
+#~ "n'est pas compatible avec la nouvelle configuration."
+
+#, fuzzy
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "Retirer ce port est impossible.\n"
+#~ "Soit le premier plugin de la Piste (Bus) ne peut gérer le \n"
+#~ "nouveau nombre d'entrées, soit le dernier à plus de sorties."
+
+#, fuzzy
+#~ msgid ""
+#~ "<b>%1</b>\n"
+#~ "Double-click to show GUI.\n"
+#~ "Alt+double-click to show generic GUI.%2"
+#~ msgstr ""
+#~ "<b>%1</b>\n"
+#~ "Double-clic pour afficher l'interface.\n"
+#~ "Alt+Double-clic pour afficher l'interface générique. %2"
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Agencement du clavier :"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Ãchelle des polices :"
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr "Double cliquer sur un nom pour configurer un protocole activé"
+
+#~ msgid "Sync/Slave"
+#~ msgstr "Synchronisé/Esclave"
+
+#~ msgid "only in region gain mode"
+#~ msgstr "seulement en mode gain de Région"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Afficher la barre d'outil Zoom"
+
+#~ msgid "Synchronise editor and mixer selection"
+#~ msgstr "Sélection des pistes identique entre éditeur et mixage"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / muet"
+
+#, fuzzy
+#~ msgid "Sound MIDI notes as they are selected"
+#~ msgstr "Jouer les notes MIDI à leur sélection"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Identifiant de la surface de contrôle distante "
+
+#~ msgid "assigned by user"
+#~ msgstr "assigné manuellement"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "suit l'ordonnancement de la Console"
+
+#, fuzzy
+#~ msgid "slowish [12.0dB/sec] (DIN)"
+#~ msgstr "moins lent [12.0dB/sec] (DIN)"
+
+#, fuzzy
+#~ msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#~ msgstr "modéré [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+
+#, fuzzy
+#~ msgid "medium [20dB/sec]"
+#~ msgstr "moyen [20dB/sec]"
+
+#, fuzzy
+#~ msgid "fast [32dB/sec]"
+#~ msgstr "rapide [32dB/sec]"
+
+#, fuzzy
+#~ msgid "faster [46dB/sec]"
+#~ msgstr "plus rapide [46dB/sec]"
+
+#, fuzzy
+#~ msgid "fastest [70dB/sec]"
+#~ msgstr "le plus rapide [70dB/sec]"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Ãcart déclenchant"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Vous ne pouvez pas créer une piste avec ce nom, il est réservé pour %1"
+
+#~ msgid "Select From All..."
+#~ msgstr "Choisir depuis toutesâ¦"
+
+#~ msgid ""
+#~ "Do you really want to remove track \"%1\" ?\n"
+#~ "\n"
+#~ "You may also lose the playlist used by this track.\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Voulez-vous vraiment supprimer la piste « %1 » ?\n"
+#~ "\n"
+#~ "Vous pourrez aussi perdre la liste de lecture utilisée par cette piste.\n"
+#~ "\n"
+#~ "(Cette action ne pourra pas être annulée, et le fichier de session sera "
+#~ "écrasé)"
+
+#~ msgid ""
+#~ "Do you really want to remove bus \"%1\" ?\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Voulez-vous vraiment supprimer le bus « %1 » ?\n"
+#~ "\n"
+#~ "Le fichier de session sera écrasé et cette action ne pourra pas être "
+#~ "annulée !"
+
+#~ msgid "Remove track"
+#~ msgstr "Supprimer la piste"
+
+#~ msgid "Remove bus"
+#~ msgstr "Supprimer le bus"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "Identifiant de contrôleur distant"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "Identifiant de contrôleur distant :"
+
+#, fuzzy
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "L'ID MIDI du controleur %1 est: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "L'ID MIDI du controleur %3 ne peut être changée."
+
+#, fuzzy
+#~ msgid "the master bus"
+#~ msgstr "Le Bus Master"
+
+#, fuzzy
+#~ msgid "the monitor bus"
+#~ msgstr "Le Bus de Monitoring"
+
+#, fuzzy
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "L'ID du controleur distant de %5 est : %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Les ID de controleurs distants sont déterminées par l'ordonnancement "
+#~ "Pistes/Bus dans Ardour.\n"
+#~ "\n"
+#~ "%3Pour changer cela, aller dans la fenetre Préférences puis dans l'onglet "
+#~ "Interaction Utlisateur%4"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track. Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Clic gauche pour inverser la phase du canal %1 de cette piste. Clic droit "
+#~ "pour afficher le menu."
+
+#, fuzzy
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr "Cliquer affiche le menu des canaux pour l'inversion de phase"
+
+# If chain doesn't say "formatting the disk" but "format OF the disk", translation is ok
+#, fuzzy
+#~ msgid "Disk Format"
+#~ msgstr "Format du Disque"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bit flottant"
+
+#~ msgid "24 bit"
+#~ msgstr "24 bit"
+
+#~ msgid "16 bit"
+#~ msgstr "16 bit"
+
+#~ msgid "Broadcast WAVE"
+#~ msgstr "Broadcast WAVE"
+
+#~ msgid "WAVE"
+#~ msgstr "WAVE"
+
+#, fuzzy
+#~ msgid "Press to import selected files and close this window"
+#~ msgstr "Importer les fichiers sélectionnés et fermer cette fenêtre"
+
+#, fuzzy
+#~ msgid "Press to import selected files and leave this window open"
+#~ msgstr "Importer les fichiers sélectionnés et laisser cette fenêtre ouverte"
+
+#, fuzzy
+#~ msgid "<b>Add files as ...</b>"
+#~ msgstr "<b>Ajouter les fichiers...</b>"
+
+#~ msgid "Contents:"
+#~ msgstr "Contenu :"
+
+#, fuzzy
+#~ msgid ""
+#~ "No ffprobe or ffmpeg executables could be found on this system.\n"
+#~ "Video import and export is not possible until you install those tools.\n"
+#~ "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+#~ "\n"
+#~ "The tools are included with the %1 releases from ardour.org and also "
+#~ "available with the video-server at http://x42.github.com/harvid/\n"
+#~ "\n"
+#~ "Important: the files need to be installed in $PATH and named "
+#~ "ffmpeg_harvid and ffprobe_harvid.\n"
+#~ "If you already have a suitable ffmpeg installation on your system, we "
+#~ "recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
+#~ "ffprobe to ffprobe_harvid.\n"
+#~ "\n"
+#~ "see also http://manual.ardour.org/video-timeline/setup/"
+#~ msgstr ""
+#~ "Pas de paquet ffprobe ou ffmpeg sur votre système.\n"
+#~ "L'import/export Vidéo est impossible sans installer ces outils.\n"
+#~ "%1 nécessite ffmpeg et ffprobe, fournis par ffmpeg.org, version 1.1 ou "
+#~ "plus récente.\n"
+#~ "\n"
+#~ "Ces outils sont inclus dans la version %1 d'ardour.org et aussi "
+#~ "disponibles avec le serveur-vidéo à http://x42.github.com/harvid/\n"
+#~ "\n"
+#~ "Important : les fichiers sont à installer dans $PATH et à nommer "
+#~ "ffmpeg_harvid et ffprobe_harvid.\n"
+#~ "Si votre système inclut déjà les paquets concernés, nous vous "
+#~ "recommandons la création de liens symboliques de ffmpeg à ffmpeg_harvid "
+#~ "et de ffprobe à ffprobe_harvid.\n"
+#~ "\n"
+#~ "voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
+
+#, fuzzy
+#~ msgid ""
+#~ "No ffprobe or ffmpeg executables could be found on this system. Video "
+#~ "Import is not possible until you install those tools. See the Log window "
+#~ "for more information."
+#~ msgstr ""
+#~ "Les éxécutables ffprobe ou ffmpeg ne sont pas disponibles. L'import Vidéo "
+#~ "est impossible sans installer ces outils. Vous trouverez plus d'infos "
+#~ "dans la fenêtre de Log."
+
+#, fuzzy
+#~ msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#~ msgstr ""
+#~ "Référence d'emplacement actuel (seulement les fichiers déjà transcodés)"
+
+#, fuzzy
+#~ msgid ""
+#~ "A file with the same name already exists. Do you want to overwrite it?"
+#~ msgstr "Un fichier existant porte déjà ce nom. Voulez vous l'écraser ?"
+
+#, fuzzy
+#~ msgid ""
+#~ "No ffprobe or ffmpeg executables could be found on this system. Video "
+#~ "Export is not possible until you install those tools. See the Log window "
+#~ "for more information."
+#~ msgstr ""
+#~ "Pas de paquet ffprobe ou ffmpeg sur votre système. L'exportation Vidéo "
+#~ "est impossible sans installer ces outils. Plus d'infos dans la fenêtre de "
+#~ "Log."
+
+#, fuzzy
+#~ msgid ""
+#~ "Video encoding is a non-trivial task with many details.\n"
+#~ "\n"
+#~ "Please see the manual at %1/video-timeline/operations/#export.\n"
+#~ "\n"
+#~ "Open Manual in Browser? "
+#~ msgstr ""
+#~ "L'encodage Vidéo est une tâche complexe avec de nombreux détails\n"
+#~ "\n"
+#~ "Merci de consulter le manuel à %1/video-timeline/operations/#export "
+#~ "(anglais).\n"
+#~ "\n"
+#~ "Ouvrir le manuel en ligne ? "
#~ msgid ""
#~ "Could not connect to the Video Server. Start it or configure its access "
diff --git a/gtk2_ardour/po/it.mo b/gtk2_ardour/po/it.mo
new file mode 100644
index 0000000..7b4018e
Binary files /dev/null and b/gtk2_ardour/po/it.mo differ
diff --git a/gtk2_ardour/po/it.po b/gtk2_ardour/po/it.po
index 02c2202..7302980 100644
--- a/gtk2_ardour/po/it.po
+++ b/gtk2_ardour/po/it.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ardour 0.354.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2015-03-22 20:52+0100\n"
"Last-Translator: Raffaele Morelli <raffaele.morelli at gmail.com>\n"
"Language-Team: Italiano <>\n"
@@ -19,255 +19,287 @@ msgstr ""
"X-Generator: Gtranslator 2.91.6\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr "Hans Baier"
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr "Sakari Bergen"
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr "Christian Borss"
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr "Chris Cannam"
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr "Jeremy Carter"
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr "André Colomb"
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr "John Emmas"
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr "Dave Flick"
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr "Robin Gareus"
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr "Chris Goddard"
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr "J. Abelardo Gutierrez"
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr "David Halter"
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr ""
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr ""
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr ""
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr ""
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr ""
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr ""
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr ""
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr ""
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr ""
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr ""
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr ""
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr ""
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr ""
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr ""
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr ""
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr ""
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr ""
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr ""
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr ""
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr ""
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr ""
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr ""
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr ""
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -276,7 +308,7 @@ msgid ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
msgstr ""
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -288,216 +320,268 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
msgstr ""
"Italiano:\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>"
+"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
msgstr ""
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
msgstr ""
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
msgstr ""
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
msgstr ""
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
msgstr ""
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
msgstr ""
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
msgstr ""
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
msgstr ""
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr "http://ardour.org/"
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-"%1%2\n"
-"(compilato dalla revisione %3)"
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr "Configurazione "
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr "Inizializzazione menù da %1"
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr "file delle definizioni non formattato correttamente"
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr "%1 file di definizione del menù mancante"
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
"%1 non funzionerà correttamente senza un file valido per la definizione del "
"menù"
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Aggiungi Traccia/Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "Configurazione:"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr "Modalità registrazione:"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "Strumento:"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "Tracce audio"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "Tracce MIDI"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "Tracce Audio+MIDI"
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
msgstr ""
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "Aggiungi:"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "Opzioni"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "Nome:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "Gruppo:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr ""
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "Audio"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr "Audio+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "Bus"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -511,60 +595,61 @@ msgstr ""
"Se non hai intenzione di utilizzare questo tipo di plugin allora utilizza "
"delle normali tracce audio o midi."
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Normale"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "Non stratificato"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Nastro"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Mono"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "Stereo"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 canali"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 canali"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "5 canali"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 canali"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 canali"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "12 canli"
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr "Personalizzato"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "Nuovo Gruppo"
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr "Nessun Gruppo"
@@ -572,7 +657,7 @@ msgstr "Nessun Gruppo"
msgid "Ambiguous File"
msgstr "File ambiguo"
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
@@ -580,7 +665,7 @@ msgstr ""
"%1 ha trovato il file <i>%2</i> nelle seguenti posizioni:\n"
"\n"
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
@@ -589,157 +674,195 @@ msgstr ""
"\n"
"Selezionare il percorso dal quale si vuole importare il file."
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr "Fatto"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "Segnale sorgente"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Range selezionati"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Regioni selezionate"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Modello di visualizzazione"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Grafico composito per ogni traccia"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Grafico composito per tutte le tracce"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Mostra l'intervallo di potenza delle frequenze"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizza i valori"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "Finestra di analisi FFT "
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr "Analisi Spettrale"
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Traccia"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "Mostra"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Esegui di nuovo l'analisi"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "il pulsante non riesce a vedere lo stato di Controllable inesistenti\n"
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Ascolto"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Solo"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "Feedback"
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Configurazione altoparlanti"
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Scorciatoie da tastiera"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Preferenze"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr "Aggiungi Tracce/Bus"
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "Circa"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Posizioni"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "Tracce e Bus"
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr "Impostazioni Audio/MIDI"
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr "Dialogo esportazione video"
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "Proprietà "
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "Gestore dei raggruppamenti"
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Orologio grande"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr "Connessioni Audio"
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr "Connessioni MIDI"
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Finestra|Mixer"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
@@ -749,7 +872,7 @@ msgstr ""
"\n"
"%1"
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -761,45 +884,45 @@ msgstr ""
"non era abbastanza veloce. Prova a riavviare il finale audio\n"
"e salvare la sessione."
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr "Nessuna notifica dal server NSM"
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr "NSM: non è stato fornito nessun ID dal client"
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr "NSM: non è stata creata una sessione"
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr "NSM: inizializzazione fallita"
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr ""
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -810,39 +933,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr ""
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 è pronto."
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -856,23 +979,23 @@ msgstr ""
"Puoi controllare il limite massimo di memoria usando 'ulimit -l', "
"normalmente gestito da %2"
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "Non mostrare di nuovo"
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "Non uscire"
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr "Esci e basta"
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "Salva ed esci"
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -886,11 +1009,11 @@ msgstr ""
"\n"
"\"Esci e basta\""
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr "Sessione non salvata"
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -908,7 +1031,7 @@ msgstr ""
"\n"
"Cosa vuoi fare?"
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -926,74 +1049,107 @@ msgstr ""
"\n"
"Cosa vuoi fare?"
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Suggeritore"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr "Audio: <span foreground=\"red\">nessuno</span>"
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "File:"
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr "32-float"
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr "24-int"
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr "16-int"
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1004,34 +1160,29 @@ msgstr ""
"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
"\">%<PRIu32>%%</span>"
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Disco: <span foreground=\"green\">Sconosciuto</span>"
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Disco: <span foreground=\"green\">24hrs</span>"
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "Disco: <span foreground=\"green\">>24 hrs</span>"
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Disco: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "Timecode|TC: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sessioni recenti"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
@@ -1039,57 +1190,63 @@ msgstr ""
"%1 non è connesso al finale audio.\n"
"Non puoi aprire o chiudere una sessione in queste condizioni"
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Apri sessione"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "sessioni %1"
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr ""
"Non si può aggiungere una traccia senza prima aver caricato una sessione."
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "non sono riuscito a creare la nuova traccia missata %1 "
msgstr[1] "non sono riuscito a creare le nuove tracce missate %1"
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Le porte disponibili sono insufficenti\n"
-"per creare una nuova traccia o bus.\n"
-"Dovresti prima salvare %1, uscire e\n"
-"riavviare con più porte."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
"Non si può aggiungere una traccia o un bus senza prima aver caricato una "
"sessione."
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "impossibile creare la nuova traccia audio %1"
msgstr[1] "impossibile creare le nuove tracce audio %1"
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "impossibile creare il nuovo bus audio %1"
msgstr[1] "impossibile creare i nuovi bus audio %1"
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Le porte disponibili sono insufficenti\n"
+"per creare una nuova traccia o bus.\n"
+"Dovresti prima salvare %1, uscire e\n"
+"riavviare con più porte."
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1098,23 +1255,20 @@ msgstr ""
"Puoi farlo attraverso l'opzione \"Aggiungi traccia o bus\" nel menù di "
"Sessione."
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "Salva come..."
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nome della nuova sessione"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Crea istantanea"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Nome della nuova istantanea"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1122,23 +1276,35 @@ msgstr ""
"Per assicurare la compatibilità tra sistemi\n"
"i nomi delle istantanee non devono contenere il carattere '%1'"
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "Conferma sovrascrittura istantanea"
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
-msgstr "Esiste già un'istantanea con questo nome. Vuoi sovrascriverla?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Sovrascrivi"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nome della nuova sessione"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Crea istantanea"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Nome della nuova istantanea"
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "Rinomina la sessione"
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1146,12 +1312,12 @@ msgstr ""
"Per assicurare la compatibilità tra sistemi\n"
"i nomi delle istantanee non devono contenere il carattere '%1'"
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr "Questo nome è già utilizzato in un'altra cartella. Prova di nuovo."
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1159,19 +1325,27 @@ msgstr ""
"Errore nel rinominare la sessione.\n"
"A questo punto le cose potrebbero essere veramente incasinate."
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr "Salva Modello"
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "Nome per il modello:"
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-modello"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1181,35 +1355,39 @@ msgstr ""
"%1\n"
"esiste già . Vuoi aprirla?"
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "Apri una sessione"
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "Sessione inesistente in %1"
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "Attendi mentre %1 carca la sessione"
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "Errore nella registrazione di porta"
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr "Clicca su 'Chiudi' per provare di nuovo"
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "La sessione \"%1 (istantanea %2)\" non è stata caricata correttamente"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "Errore di caricamento"
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "La sessione \"%1 (istantanea %2)\" non è stata caricata correttamente"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
@@ -1219,24 +1397,50 @@ msgstr ""
"\n"
"Sarai impossibilitato a registrare o salvare."
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr "Sessione in sola lettura"
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "Impossibile caricare la sessione \"%1\""
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "Nessun file da pulire"
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "Pulisci"
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1248,19 +1452,19 @@ msgstr ""
"Ci possono essere ancora istantanee con regioni\n"
"che necessitano di questi file."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "kilo"
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "mega"
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "giga"
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1274,7 +1478,7 @@ msgstr[1] ""
"I fil che seguono sono stati eliminati da %2,\n"
"liberando %3 %4bytes di spazio su disco."
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1312,11 +1516,11 @@ msgstr[1] ""
"\n"
"verranno liberati %3 %4bytes di spazio su disco.\n"
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "Siete sicuri di voler ripulire?"
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1328,41 +1532,65 @@ msgstr ""
"La pulizia sposterà tutti i file inutilizzati \n"
"in una posizione \"morta\"."
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "DialogoRipulitura"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr "File ripuliti"
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "File eliminato"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
"Il server video non è stato avviato da %1. La richiesta di interruzione "
"viene ignorata."
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr "Ferma il server video"
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr "Vuoi veramente interrompere il server video?"
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr "Sì, interrompi"
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr "Il server video è già stato avviato."
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
@@ -1370,41 +1598,53 @@ msgstr ""
"Un server video esterno è configurato è può essere attivato. Non avvio una "
"nuova istanza."
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr "La docroot specificata è una directory inesistente."
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr "Il server video specificato non è un file eseguibile."
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr "Non riesco ad avviare il server video"
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr "Il server video è stato avviato ma non risponde alle richieste..."
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "impossibile aprire %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr "nessuno file video selezionato"
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr "La registazione è stata interrotta perche' il sistema non ha retto"
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1416,23 +1656,23 @@ msgstr ""
"Nello specifico, non riesce a scrivere i dati \n"
"con la velocità necessaria per le registrazioni.\n"
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr "Alla ricerca di plugins"
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr "Interruzione della ricerca di plugin"
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1444,11 +1684,11 @@ msgstr ""
"Nello specifico, non riesce a scrivere i dati \n"
"con la velocità necessaria per le registrazioni.\n"
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "Recupero dal crash"
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1465,19 +1705,19 @@ msgstr ""
"%1 può recuperare l'audio registrato per te \n"
"oppure ignorarlo. Scegli cosa vuoi fare.\n"
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Ignora i dati del crash"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Recupero dai dati di crash"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "Frequenza di campionamento discrepante"
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1488,23 +1728,24 @@ msgstr ""
"%2 è stato avviato a %3 Hz. Se carichi questa sessione l'audio\n"
"potrà essere riprodotto alla frequenza di campionamento errata.\n"
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "Non caricare la sessione"
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "Apri comunque la sessione"
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "Impossibile disconnettersi dal motore Audio/MIDI"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "Impossibile riconnettersi al motore Audio/MIDI"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1516,62 +1757,75 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-"%4 Questa è una sessione di una versione precedente di %3%5\n"
-"\n"
-"%3 ha copiato il vecchio file di sessione\n"
-"\n"
-"%6%1%7 \n"
-"\n"
-"su\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"Da questo momento in poi utilizza la versione -2000 con vecchie versioni di "
-"%3"
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI: impossibile avviare l'editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "IU: impossibile avviare il mixer"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "UI: impossibile impostare meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Suona dalla testina"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Interrompi la riproduzione"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "Attiva/disattiva registrazione"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Suona intervallo/selezione"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Vai all'inizio della sessione"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Vai alla fine della sessione"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Suona l'intervallo di ciclo"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
@@ -1579,23 +1833,23 @@ msgstr ""
"MIDI Panic\n"
"Invio dei messaggi di note off e reset su tutti i canali MIDI"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "Ritorna al punto d'inizio una volta fermato"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "La testina segue le selezioni di intervalli e gli edit"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Controlla accuratamente le entrate"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Abilita/Disabilita il click audio"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1603,19 +1857,17 @@ msgstr ""
"Quando è attivo, qualcosa è in solo.\n"
"Clicca per ripristinare tutto."
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-"Quando è attivo, qualcosa è in ascolto\n"
-"Clicca per ripristinare."
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr "Se attivo c'è un feedback loop."
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1629,7 +1881,7 @@ msgstr ""
"<tt>Entra</tt>: conferma; utilizza un postfisso con un '+' o '-' per "
"inserire il delta dei tempi.\n"
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1637,451 +1889,559 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr "Resetta tutti gli indicatori di picco"
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[ERRORE]:"
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[ATTENZIONE]:"
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[INFO]"
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Auto ritorno"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "Segui le modifiche"
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr "GUI"
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "Varie"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Prepara l'editor"
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Prepara il mixer"
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Ricarica lo storico di sessione"
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI: impossibile avviare l'editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "IU: impossibile avviare il mixer"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UI: impossibile impostare meterbridge"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Preferenze"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr "Non uscire"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "Chiudi e basta"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "Salva ed esci"
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-"Questo schermo non è sufficentemente alto per mostrare la finestra del mixer"
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Sessione"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Sincronizza"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Opzioni"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Finestra"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Aiuto"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Scorciatoie varie"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Formato del file audio"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Tipo file"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Formato di campionamento"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Piattaforme di comando"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Plugins"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "Misurazione"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "Tempo di caduta"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Tempo di tenuta"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "Gestione delle denormalizzazioni"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "Nuovo..."
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "Apri..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Recenti..."
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Chiudi"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "Aggiungi traccia o bus..."
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "Apri video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr "Rimuovi video"
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "Esporta in un file video"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Istantanea..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "Salva con nome..."
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr "Rinomina..."
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Salva Modello..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "Metadati"
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "Modifica metadati..."
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "Importa metadati..."
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Esporta la sessione come file audio..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "Esportazione Stem"
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "Esporta"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "Pulisci sorgenti inutilizzate..."
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "Svuota il cestino"
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Esci"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Nascondi"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Massimizza l'area dell'editor"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr "Massimizza l'area del mixer"
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Mostra le barre degli strumenti"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr ""
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
-#: ardour_ui_ed.cc:198
+#: ardour_ui_ed.cc:305
msgid "Show more UI preferences"
msgstr "Mostra più preferenze per la UI"
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Finestra|Mixer"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "Attiva/disattiva Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr "Finestra|Meterbridge"
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "Ricongiungi tutti gli strappi"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "Tracciatore MIDI"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "Chat"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "Aiuto|Manuale"
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Riferimenti"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr "Segnala un bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr "Sito web Ardour"
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr "Sviluppo di Ardour"
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr "Forum utenti"
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr "Come segnalare un bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Salva"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Trasporto"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Ferma"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "Lancia"
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Avvia/Ferma"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "Avvia/Continua/Ferma"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "Ferma e interrompi la registrazione"
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Riproduci l'intervallo di ciclo"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr "Suona la selezione"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "Suona la selezione con Preroll"
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Abilita la registrazione"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "Inizia la registrazione"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "Indietro"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "Indietro (lento)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "Indietro (veloce)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "Avanti"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "Avanti (lento)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "Avanti (veloce)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "Vai allo zero"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Vai all'inizio"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "Vai alla fine"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr "Decimale del tastierino numerico"
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr "Tastierino numerico 0"
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr "Tastierino numerico 1"
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr "Tastierino numerico 2"
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr "Tastierino numerico 3"
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr "Tastierino numerico 4"
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr "Tastierino numerico 5"
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr "Tastierino numerico 6"
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr "Tastierino numerico 7"
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr "Tastierino numerico 8"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr "Tastierino numerico 9"
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "Messa a fuoco sull'orologio"
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2089,125 +2449,137 @@ msgstr "Messa a fuoco sull'orologio"
msgid "Timecode"
msgstr ""
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Battute e battiti"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minuti e secondi"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Campioni"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "Punch in"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "Ingresso"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "Punch out"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "Uscita"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr ""
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "Ingresso/Uscita"
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Metronomo"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr ""
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Riproduci automaticamente"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "Sincronizza l'inizio con il video"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "Tempo principale"
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr "Attiva/disattiva la registrazione sulla traccia %1"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Percentuale"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Semitoni"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Invia MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Invia MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Usa MMC"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "Invia il clock MIDI"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr "Invia un feedback MIDI"
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Panico"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr "Orologio"
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr "Spazio su disco"
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr "Buffers"
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr ""
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr "Formato del file"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2215,134 +2587,139 @@ msgstr ""
"Impossibile utilizzare JACK come sorgente di sincronizzazione\n"
"se le impostazioni di \"pull up/down\" non sono uguali a zero."
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "Interno"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "Abilita/Disabilita la sincronia esterna"
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
"Impossibile sincronizzazione con JACK: è impostato video \"pull up/down\""
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "--in corso--"
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr "SR"
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "Tira"
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Tempo"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Suddivisione"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "Errore di programmazione: %1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "errore di programmazione: %1 %2"
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "Battute:Battiti"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "Minuti:Secondi"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "Imposta dalla testina"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr "Posizionati su questo tempo"
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr "dB"
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "Guadagno della regione:"
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr "dBFS"
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "Ampiezza di picco:"
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "Calcolo..."
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "Aggiungi un punto di controllo del guadagno"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr "Seleziona nota..."
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr "Dimezza"
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr "Raddoppia"
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr "Imposta a %1 battito/i"
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "sposta evento automazione"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "sposta intervallo automazione"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "Rimuovi il punto di controllo"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "Sto ignorando i punti incogruenti su AutomationLine \"%1\""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "Aggiungi evento di automazione"
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
"impossibile mostrare la regione di automazione per un controllo senza lista"
@@ -2355,63 +2732,59 @@ msgstr "Stato dell'automazione"
msgid "hide track"
msgstr "Nascondi traccia"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr "Automazione|Manuale"
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Suona"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Scrivi"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Tocco"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "pulisci l'automazione"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Nascondi"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "Pulisci"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Stato"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr "Discreto"
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Lineare"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Modo"
@@ -2427,35 +2800,38 @@ msgstr "Modifica il raggruppamento"
msgid "Direction:"
msgstr "Direzione:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "Ingresso"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "Uscita"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Modifica"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "Elimina"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Nome"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Nuovo"
@@ -2471,18 +2847,87 @@ msgstr "Aggiungi canale"
msgid "Rename Channel"
msgstr "Rinomina canale"
-#: configinfo.cc:28
-msgid "Build Configuration"
-msgstr "Configura"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Ripristina i valori base"
-#: control_point_dialog.cc:33
-msgid "Control point"
-msgstr "Punto di controllo"
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
-#: control_point_dialog.cc:45
-msgid "Value"
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "oggetto"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Colore"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
+#: configinfo.cc:28
+msgid "Build Configuration"
+msgstr "Configura"
+
+#: control_point_dialog.cc:33
+msgid "Control point"
+msgstr "Punto di controllo"
+
+#: control_point_dialog.cc:45
+msgid "Value"
msgstr "Valore"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr "Nota"
@@ -2520,599 +2965,601 @@ msgstr "Intonazione"
msgid "Velocity"
msgstr "Pressione"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "Tempo"
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr "Durata"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "modifca la nota"
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "CD Frames"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr "TC Secondi"
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr "TC Minuti"
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Secondi"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minuti"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "Battiti/128"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "Battiti/64"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Battiti/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "Battiti/28"
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "Battiti/24"
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "Battiti/20"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Battiti/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "Battiti/14"
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "Battiti/12"
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "Battiti/10"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Battiti/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "Battiti/7"
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "Battiti/6"
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "Battiti/5"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Battiti/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Battiti/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Battiti/2"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Battiti"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Battute"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Marcatori"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "Inizio regione"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Fine regione"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "Sync delle regioni"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Confini regione"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "Nessuna griglia"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Griglia"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnetico"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Testina"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Marcatore"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Mouse"
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Scorri"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Unisci"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Blocca"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Sinistra"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Destra"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Centro"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr "Punto di modifica"
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr ""
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr "Dolce"
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "Miscela multi timbrica equilibrata"
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr ""
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr ""
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr ""
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "Ricampiona senza conservare l'intonazione"
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Minuti:Secondi"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Marcatori di posizione"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Marcatori di intervallo"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Intervalli di Ciclo/Punch"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "Marcatori CD"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr "Timeline video"
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "modo"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "Marcatori"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Regioni"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "Tracce e Bus"
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "Istantanee"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "Tracce & Gruppi"
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "Intervalli & marcatori"
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Ciclo"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Punch"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr "Lineare (per materiale altamente correlato)"
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr "Energia costante"
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "Simmetrico"
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Lento"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Veloce"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "Disattiva"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "Attiva"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Congela"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "Scongela"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr "Regioni selezionate"
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr "Riproduci l'intervallo"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "Cicla l'intervallo"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "Zoom sull'intervallo"
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "Sposta l'inizio intervallo alla regione precedente"
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "Sposta l'inizio intervallo alla regione successiva"
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "Sposta la fine intervallo alla regione precedente"
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "Sposta la fine intervallo alla prossima regione"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "Separa"
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr "Converti in regione nella lista delle regioni"
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Seleziona tutto nell'intervallo"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr "Imposta il ciclo dalla selezione"
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr "Imposta l'inizio/fine sessione dalla selezione"
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Aggiungi marcatori di intervallo"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr "Rifila la regione in base all'intervallo"
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Riempi intervallo con la regione"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Duplica intervallo"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr "Consolida l'intervallo"
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "Consolida l'intervallo processando i dati"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
+msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr "Fissa l'intervallo nella lista regioni"
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "Fissa l'intervallo nella lista regioni elaborandolo"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr "Esporta l'intervallo..."
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr "Esporta l'intervallo video..."
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Suona dal punto di modifica"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Riproduci dall'inizio"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr "Riproduci la regione"
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "Regione in ciclo"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr "Seleziona tutto nella traccia"
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr "Seleziona tutti gli oggetti"
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr "Inverti la selezione nella traccia"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr "Inverti selezione"
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "Imposta l'intervallo come ciclo"
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "Imposta l'intervallo come intervallo di punch"
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Seleziona tutto dopo il punto di modifica"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Seleziona tutto prima del punto di modifica"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "Seleziona tutto dopo la testina"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "Seleziona tutto prima della testina"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr "Seleziona tutto tra la testina ed il punto di modifica"
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr "Seleziona tutto tra testina e punto di modifca"
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr "Seleziona l'intervallo tra la testina ed il punto di modifica"
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Seleziona"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "Taglia"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "Copia"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "Incolla"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Allinea"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Allinea Realtivo"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "Inserisci la regione selezionata"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr "Inserisci media"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr ""
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr ""
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr ""
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr ""
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "Trascina"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
"La posizione della testina è stata memorizziata con un valore negativo - "
"ignorata (viene utilizzato lo zero)"
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "Tutto"
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-"Modalità intelligente (aggiunge le funzioni di intervallo alla modalità di "
-"aggancio)"
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr "Modalità aggancio (seleziona/muove gli oggetti)"
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr "Modalità taglio (divide le regioni)"
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr "Modalità intervallo (seleziona intervalli di tempo)"
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr "Modalità disegno (disegna e modifica il guadagno/note/automazione)"
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
"Modalità allungamento (allunga in base al tempo le regioni audio e midi "
"mantenendo l'intonazione)"
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr "Modalità ascolto (ascolta le regioni)"
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-"Modalità di modifica interna (modifica le note e le curve di guadagno "
-"all'interno delle regioni)"
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3120,182 +3567,186 @@ msgstr ""
"Gruppi: clicca per disattivare\n"
"Click di contesto per il resto delle operazioni"
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr ""
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr ""
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "Zoom avanti"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Zoom indietro"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Zoom sulla sessione"
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
msgstr "Zoom"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr "Espandi tracce"
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr "Restringi le tracce"
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr "Numero di tracce visibili"
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr "Aggancia/Griglia"
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "Aggancia/Modalità griglia"
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Punto di modifica"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Modalità di modifica"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
msgstr ""
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr "Comando|Annulla"
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr "Comando|Annulla (%1)"
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Ripristina"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Ripristina (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Duplica"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr "Numero di duplicazioni:"
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "Selezione"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr "Adatta 1 traccia"
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr "Adatta 2 tracce"
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr "Adatta 4 tracce"
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr "Adatta 8 tracce"
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr "Adatta 16 tracce"
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr "Adatta 24 tracce"
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr "Adatta 32 tracce"
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr "Adatta 48 tracce"
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr "Adatta tutte le tracce"
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr "Adatta selezione"
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr "Zoom a 10 ms"
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr "Zoom a 100 ms"
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr "Zoom a 1 sec"
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr "Zoom a 10 sec"
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr "Zoom a 1 min"
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr "Zoom a 10 min"
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr "Zoom a 1 ora"
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr "Zoom a 8 ore"
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr "Zoom a 24 ore"
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr "Zoom sull'intervallo/regione selezionato/a"
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr "*"
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr "Eliminazione playlist"
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3305,1293 +3756,1378 @@ msgstr ""
"Se viene mantenuta i file audio associati non saranno puliti.\n"
"Se viene eliminata, soltanto i file audio da essa utilizzati saranno puliti."
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr "Elimina la playlist"
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr "Mantieni la playlist"
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "Cancella"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "nuove playlist"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "copia le playlist"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "cancella le playlist"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr "Attendi mentre %1 carica i dati per la visualizzazione"
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr "Modifica..."
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Trasponi..."
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr "Quantizza"
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr "Rimuove sovrapposizioni"
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr "Trasforma..."
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Connetti automaticamente"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "Dissolvenze incrociate"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "Muovi il marcatore selezionato"
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "Seleziona le operazioni di intervallo"
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "Seleziona regioni"
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Punto di modifica"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Dissolvi"
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr "Chiavistello (?)"
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "Regione"
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Strato"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Percorso"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Spunta"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "Guadagno"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Intervalli"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "Dissolvenze"
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr "Collega"
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoom"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "Posizionati sui marcatori"
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Caduta del meter"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Tenuta del misuratore"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "Opzioni MIDI"
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Opzioni varie"
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Controllo"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "Marcatore"
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Orologio principale"
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "Tira su / Tira giù"
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Operazioni sulle regioni"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Righelli"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr "Viste"
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "Scorrimento"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Orologio secondario"
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr ""
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr ""
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Altezza"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Strumenti"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "Vista"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "Zoom"
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Interrompi il trascinamento o deseleziona tutto"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Mostra il Mixer dell'editor"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "Mostra la lista dell'editor"
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Sposta la testina al prossimo limite di regione"
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr ""
"Sposta la testina al prossimo limite di regione (nessuna selezione della "
"traccia)"
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Sposta la testina al limite di regione precedente"
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr ""
"Sposta la testina al limite di regione precedente (nessuna selezione della "
"traccia)"
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Sposta la testina all'inizio della prossima regione"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Sposta la testina alla fine della prossima regione"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Sposta la testina al punto di sincronizzazione della prossima regione"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Sposta la testina all'inizio della regione precedente"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Sposta la testina alla fine della regione precedente"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Sposta la testina al punto di sincronizzazine della regione precedente"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "Al prossimo limite di regione"
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "Al prossimo limite di regione (nessuna selezione della traccia)"
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "Al precedente limite di regione"
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "Al termine della regione precedente (Nessuna selezione traccia)"
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "All'inizio della prossima regione"
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "Alla fine della prossima regione"
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "Sincronizzare alla prossima regione"
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "All'inizio della regione precedente"
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "Alla fine della regione precedente"
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "Sincronizzare alla regione precedente"
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "All'inizio dell'intervallo"
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "Alla fine dell'intervallo"
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Sposta la testina all'inizio dell'intervallo"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Sposta la testina alla fine dell'intervallo"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr "Seleziona tutte le tracce"
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "Deseleziona tutto"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "Seleziona tutti gli intervalli sovrapposti"
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "Seleziona tutto nell'intervallo"
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "Seleziona l'intervallo"
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Seleziona tutto nll'intervallo di Punch"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Seleziona tutto nell'intervallo di ciclo"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "Seleziona la prossima traccia o bus"
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "Seleziona la traccia o il bus precedente"
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "Attiva/disattiva la registrazione"
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr "Attiva/disattiva solo"
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "Attiva/disattiva muto"
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "Attiva/disattiva solo isolato"
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "Salva la vista %1"
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "Vai alla vista %1"
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "Posizionati sul marcatore %1"
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "Vai al prossimo marcatore"
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "Vai al marcatore precedente"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "Aggiungi marcatore in corrispondenza della testina"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr "Rimuovi il marcatore in corrispondenza della testina"
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr ""
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr ""
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "Avanza la testina"
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "Indietreggia la testina"
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "Testina alla prossima griglia"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "Testina alla griglia precedente"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr "Zoomm sulla selezione"
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "Attiva/disattiva lo stato di zoom"
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "Aumenta l'ampiezza della traccia"
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "Restringi l'altezza della traccia"
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "Muovi in alto le tracce selezionate"
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "Muovi in basso le tracce selezionate"
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "Scorri le tracce verso l'alto"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "Scorri le tracce verso il basso"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "Sposta le tracce verso l'alto"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "Sposta le tracce verso il basso"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "Scorri all'indietro"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "Scorri in avanti"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Centra testina"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Centra il punto di modifica"
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Testina in avanti"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Testina indietro"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "Testina sul marcatore attivo"
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "Marcatore sulla testina"
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr "Utilizza il salto degli intervalli"
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "Esegui le regioni selezionate"
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "Riproduci dal punto di modifica e ritorna"
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "Suona l'intervallo"
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Testina sul mouse"
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Marcatore attivo sul mouse"
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr "Annulla cambio di selezione"
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr "Ripeti cambio di selezione"
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "Esporta l'audio"
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Esporta l'intervallo"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "Separa usando l'intervallo di punch"
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "Separa usando l'intervallo di ciclo"
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "Rifila"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr "Dissolvi l'intervallo selezionato"
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr ""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr "Messaggio"
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr "Spostati al prossimo transiente"
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr "Spostati al transiente precedente"
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Inizio intervallo"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "Fine intervallo"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Segui la testina"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Rimuovi l'ultima registrazione"
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "Testina stazionaria"
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Inserisci tempo"
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "Attiva/disattiva"
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Rimuovi"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr "Adatta selezione (verticale)"
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "Ampissimo"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "Ampio"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Più ampio"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "Piccolo"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr "Suona le note MIDI selezionate"
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Zoom a sinistra"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Zoom a destra"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Zoom centrato"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Zoom sulla testina"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Zoom sul mouse"
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Zoom sul punto di modifica"
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr ""
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "Modalità oggetto intelligente"
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr "Intelligente"
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Strumento oggetto"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Strumento intervallo"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "Strumento per disegnare le note"
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "Strumento ascolto"
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr ""
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr "Strumento contenuto"
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr "Strumento taglio"
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr ""
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "Cambia il punto di modifica"
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr ""
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr "Modalità modifica del ciclo"
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "Allinea a"
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Modalita' di Allineamento"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr ""
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr ""
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr ""
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr ""
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr ""
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr ""
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr ""
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "Allinea ai secondi"
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "Allinea ai minuti"
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr "Allinea a 1/128"
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr "Allinea a 1/64"
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "Allinea ai trentesimi di secondo"
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr "Allinea a un 1/28"
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr "Allinea a un 1/24"
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr "Allinea a un 1/20"
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "Allinea a un 1/16"
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "Allinea a un 1/14"
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr "Allinea a un 1/12"
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "Allinea a 1/10"
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "Allinea a 1/8"
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "Allinea a 1/7"
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "Allinea a 1/6"
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "Allinea a 1/5"
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "Allinea a 1/4"
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "Allinea a 1/3"
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "Allinea a 1/2"
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "Allinea al battito"
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "Allinea alla battuta"
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "Allinea al marcatore"
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "Allinea all'inizio regione"
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "Allinea a fine regione"
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr ""
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "Allinea al limite della regione"
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "Mostra le linee dei marcatori"
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "Ciclo/Punch"
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Min:Sec"
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr "Monitor video"
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr "Video"
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr "Sempre in primo piano"
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr "Numero del frame"
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr "Schermo intero"
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr "Dimensioni originali"
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Ordina"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Mostra Tutto"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr ""
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Ascendente"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Discendente"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Per Nome di Regione"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Per durata della Regione"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Per Posizione della Regione"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "Per Data di Regione"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Per inizio regione nel file"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Per Fine di Regione nel file"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Per Nome di sorgente del file"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Per durata del file sorgente"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Per Data di creazione di sorgente del file"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Per Filesystem di sorgente"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "Rimuovi inutilizzati"
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importa"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "Importa nella lista delle regioni..."
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr "Importa da una sessione"
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr "Sposta tutte le sorgenti nella cartella della sessione"
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "Mostra un riepilogo"
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "Mostra i gruppi"
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr "Mostra le linee della misura"
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Mostra il logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
"Attiva/disattiva l'input MIDI per le tracce/bus selezionate nell'editor"
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr "Errore di programmazione: %1: %2"
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "Alza"
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Porta in cima"
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Abbassa"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Porta in fondo"
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "Spostati alla posizione iniziale"
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr "Aggancia al video"
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "Aggancia a battute e battiti"
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "Rimuove la sincronia"
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Muto"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normalizza..."
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Inverti"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "Rendi le regioni mono"
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "Aumenta guadagno"
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "Riduci guadagno"
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "Cambia tono..."
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Trasponi..."
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "Opaco"
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Dissolvenza in entrata"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Dissolvenza in uscita"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "Multi-Duplica"
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Riempi Traccia"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Imposta l'intervallo di loop"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "Imposta Punch"
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "Aggiungi un marcatore singolo"
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "Aggiungi un marcatore di intervallo per la regione"
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
-msgstr "Allinea la posizione alla griglia"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
+msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "Chiudi gli spazi"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "Analisi ritmica..."
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "Esporta..."
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "Separa sotto"
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "Imposta la durata della dissolvenza in entrata"
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "Durata della dissolvenza in uscita"
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "Imposta il tempo dalla regione = Battuta"
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "Dividi in corrispondenza della percussione"
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "Modifica il catalogo..."
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "Proprietà ..."
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "Fissa (elaborando)"
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "Fissa (senza elaborare)"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "Unisci"
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "Separa"
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "Analisi spettrale"
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Azzera inviluppo"
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "Azzera guadagno"
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "Inviluppo attivo/passiv"
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "Inserisci cambio di patch"
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr "Sgancia dalle altre copie"
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "Rimuovi silenzio"
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Imposta intervallo di selezione"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr ""
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr ""
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr ""
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr ""
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "Ritaglia in base al ciclo"
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Ritaglia in base al punch"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Ritaglia al precedente"
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Ritaglia al successivo"
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Inserisci regione dal catalogo delle regioni"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "Imposta la posizione di sincronizzazione"
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr ""
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr "Dividi/separa"
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr ""
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr ""
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "Allinea inizio"
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr ""
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "Allinea fine"
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr ""
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr ""
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr ""
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "Scegli la prima..."
@@ -4620,32 +5156,33 @@ msgstr ""
"La sessione contiene già un file chiamato %1. Vuoi importare %2 come nuova "
"sorgente o passare oltre?"
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Annullare l'importazione"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Editor: non posso aprire il file \"%1\", (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Annulla tutta l'importazione"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Non inludere"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Includi tutto senza domande"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "Frequenza di campionamento"
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4653,208 +5190,277 @@ msgstr ""
"%1\n"
"Il sample rate del file audio non corrisponde a quello della sessione!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Includi comunque"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr ""
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr "ridimensiona note"
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr "Inizio video:"
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr "Diff:"
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr "Sposta video"
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "Muovi il meter mark"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "Copia il meter mark"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "Muovi il meter mark"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "Muovi il marcatore di tempo"
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "Copia il marcatore di tempo"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "Muovi il marcatore di tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "cambia la durata della dissolvenza in entrata"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "cambia la durata della dissolvenza in uscita"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "Muovi marcatore"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "sposta intervallo automazione"
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr "C'è stato un errore durante l'esecuzione di 'time stretch'"
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr "errore_di_programmazione: %1"
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr "nuovo marcatore di salto"
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr "salta"
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr "nuovo marcatore di CD"
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "senza nome"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr "Col"
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr "Colore del gruppo"
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr "Nome del gruppo"
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr ""
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr "Gruppo visibile?"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr "Attivo"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr "Gruppo attivato?"
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "gruppo|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr ""
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr "Condivisione volume?"
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "relativo|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr "Cambi di volume relativi?"
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "muto|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
+msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr "Condivisione muto?"
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr "Condivisione solo?"
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Reg"
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr "Condivisione stato di registrazione?"
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "monitoraggio|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr "Condivisione scelta monitoraggio?"
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "selezione|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr ""
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr "Condivisione stato selezione/modifica?"
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "attivo|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr "Condivisione stato attivo?"
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "Il file esiste!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Sovrascrivo file esistente"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr ""
#: editor_group_tabs.cc:176
msgid "Fit to Window"
@@ -4868,300 +5474,341 @@ msgstr "inizio"
msgid "end"
msgstr "fine"
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "aggiungi marcatore"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "imposta l'intervallo di ciclo"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "imposta l'intervallo di punch"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "intervallo"
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "nuovo marcatore di intervallo"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "rimuovi marcatore"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "Posizionati qui"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "Suona da qui"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "Sposta marcatore alla testina"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "Crea intervallo fino al prossimo marcatore"
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr "Posiziona sul marcatore"
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr "Suona dal marcatore"
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr "Imposta il marcatore dalla testina"
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr "Imposta l'intervallo dalla selezione"
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Nascondi intervallo"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "Rinomina intervallo..."
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Rimuovi intervallo"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Separa le regioni nell'intervallo"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Separa l'intervallo"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Imposta l'intervallo di Punch"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Nuovo nome: "
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "Rinomina marcatore"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "Rinomina intervallo"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Rinomina"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "Rinomina marcatore"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr "Questo schermo non è alto abbastanza per mostrare il mixer del'editor"
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr ""
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr ""
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
msgstr ""
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr ""
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Nome per la Regione:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "dividi"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "modifica la selezione"
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "sposta regioni in avanti"
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "sposta posizine in avanti"
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "sposta regioni indietro"
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr ""
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr ""
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr ""
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "Nuovo marcatore di posizione"
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "aggiungi marcatore"
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "azzera i marcatori"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "azzera gli intervalli"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "azzera le posizioni"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "inserisci regione"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "alza regioni"
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "alza regione"
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "alza le regioni fino in cima"
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "alza la regione fino in cima"
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "abbassa le regioni"
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "abbassa la regione"
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "abbassa le regioni fino in fondo"
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "Rinomina regione"
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr "Nuovo nome: "
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "separa"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "separa la regione sottostante"
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "ritaglia in base alla selezione"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "imposta il punto di sincronizzazione"
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "Rimuovi il sync della regione"
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "sposta le regioni alla posizione originale"
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "sposta la regione alla posizione originale"
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "allinea selezione"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "allinea selezione (relativo)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "allinea la regione"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr ""
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "ritaglia in base al ciclo"
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "ritaglia in base al punch"
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "ritaglia in base alla regione"
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5173,11 +5820,11 @@ msgstr ""
"Tipicamente ciò accade a causa dei plugin che producon un output stereo da "
"input mono o vice versa."
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "Non posso congelare"
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5193,23 +5840,23 @@ msgstr ""
"Il congelamento avrà effetto solo sul segnale della prima mandata/insert/"
"ritorno. "
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "Congela comunque"
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr "Non congelare"
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "Congela i limiti"
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Annulla congelamento"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5222,47 +5869,47 @@ msgstr ""
"\n"
"Puoi farlo senza elaborare, che è una operazione diversa."
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr "Non posso elaborare"
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "elabora intervallo"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr "elimina"
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "taglia"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "copia"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "pulisci"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr "oggetti"
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "Rimuovi la regione"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplica selezione"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr ""
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5270,137 +5917,157 @@ msgstr ""
"Si vuole realmente rimuovere l'ultima registrazione?\n"
"(questa azione non potrà essere annullata)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "No, non fare niente."
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Si, rimuovi."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "Distruggi l'ultima registrazione"
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "Normalizza"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "fai il Reverse della regione"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "elimina silenzio"
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "Dividi regione/i"
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr "Non posso scollegare %1"
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "Ripristina il gain della regione"
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr ""
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "Attiva/disattiva il blocco della regione"
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr "Attiva/disattiva il blocco video"
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "stile del blocco della regione"
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "cambia l'opacità della regione"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr "dissolvi intervallo"
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "Imposta la durata della dissolvenza in entrata"
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "durata della dissolvenza in uscita"
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "durata della dissolvenza in entrata"
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "forma della dissolvenza in uscita"
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "attiva dissolvenza in entrata"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "attiva dissolvenza in uscita"
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "intervallo di ciclo dalla selezione"
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "imposta l'intervallo di ciclo dalla in base alla regione"
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "imposta intervallo di punch dalla selezione"
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "imposta intervallo di punch dalla regione"
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "Aggiungi marcatore"
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "Imposta il tempo globalmente"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "Definisce una battuta"
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
"Vuoi impostare il tempo globale o aggiungere un nuovo marcatore di tempo?"
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "imposta il tempo in base alla regione"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "dividi regioni"
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5412,11 +6079,11 @@ msgstr ""
"in %2 pezzi.\n"
"Questa operazione può richiedere parecchio tempo."
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr ""
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5424,52 +6091,52 @@ msgstr ""
"Premi OK per continuare con questa operazione\n"
"oppure chiedi al Ferret di affinare l'analisi."
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr "Premi OK per continuare con questa operazione di separazione."
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "Separazione esagerata?"
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr ""
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "allinea le regioni alla griglia"
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr "Chiudi i vuoti della regione"
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "Durata della dissolvenza incrociata"
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr "ms"
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr ""
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr "Ok"
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr "Riempi gli intervalli della regione"
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "Ci sarebbero cattive notizie..."
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5485,23 +6152,21 @@ msgstr ""
"modifica il tuo file ardour.rc ed imposta \n"
"l'opzione \"allow-special-bus-removal\" su \"yes\""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "Tracce"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
+#, fuzzy
msgid "track"
-msgstr "traccia"
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "Bus"
+msgid_plural "tracks"
+msgstr[0] "traccia"
+msgstr[1] "traccia"
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
+#, fuzzy
msgid "bus"
-msgstr "bus"
+msgid_plural "busses"
+msgstr[0] "bus"
+msgstr[1] "bus"
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5514,7 +6179,7 @@ msgstr ""
"Questa operazione non può essere annullata e il file della sessione sarà "
"sovrascritto!"
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5527,7 +6192,7 @@ msgstr ""
"Questa operazione non può essere annullata e il file della sessione sarà "
"sovrascritto!"
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5538,146 +6203,147 @@ msgstr ""
"Questa operazione non può essere annullata e il file della sessione verrà "
"sovrascritto"
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "Si, rimuovi."
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Si, rimuovi."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "Rimuovi %1"
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "Inserisci tempo"
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
"Ci sono troppe tracce per essere contenute tutte nella finestra corrente."
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr "Sel"
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr "Salvata la vista %u"
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "Metti in \"mute\" le regioni"
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "Metti in \"mute\" la regione"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "unisci le regioni"
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr "separa le regioni"
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr "%1: bloccato"
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr "Clicca per sbloccare"
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr "Sposta in file inclusi nella cartella della sessione"
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr "Nome regione, con numero di canali in []'s"
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "Posizione dell'inizio della regione"
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "Fine"
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "Posizione della fine della regione"
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "Lunghezza della regione"
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
"Lunghezza della dissolvenza in entrata (unità : orologio secondario), () se "
"disabilitato"
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
"Lunghezza della dissolvenza in uscita (units: orologio secondario), () se "
"disabilitato"
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "Posizione della regione bloccata?"
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr "Posizione della regione incollata a battiti|battute?"
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "Mutare la regione?"
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr ""
"Opacizza regione (impedisce anche alle regioni sottostanti di essere "
"ascoltate)?"
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Nascosto"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr "(MANCANTE)"
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -5685,179 +6351,187 @@ msgstr ""
"Vuoi veramente rimuovere le regioni inutilizzate?\n"
"(Questa azione non può essere annullata)"
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "Si, rimuovi."
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "Rimuovi le regioni inutilizzate"
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "Mult."
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "Inizio"
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "Multipli"
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "MANCANTE"
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr "SS"
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "Nome traccia/bus"
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "Traccia/bus visibile?"
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "Traccia/bus attiva?"
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "Ingresso MIDI abilitato"
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "Registrazione abilitata"
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "Muta"
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "In solo"
-#: editor_routes.cc:213
-msgid "SI"
-msgstr "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "Solo isolato"
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "Solo (bloccata)"
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Nascondi tutto"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Mostra tutte le tracce audio"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Nascondi tutte le tracce audio"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Mostra tutti i Bus Audio"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Nascondi tutti i Bus Audio"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "Mostra tutte le tracce MIDI"
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "Nascondi tutte le tracce MIDI"
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Mostra le tracce che hanno regioni sotto la testina"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Marcatore di nuova posizione"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "Pulisci tutte le posizioni"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr "Scopri le posizioni"
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr "Nuovo intervallo"
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "Pulisci tutti gli intervalli"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr "Scopri gli intervalli"
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr "Nuovo marcatore di traccia CD"
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Nuovo tempo"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Nuovo Meter"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr "Rinomina istantanea"
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr "Nuovo nome dell'istantanea"
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
@@ -5865,35 +6539,39 @@ msgstr ""
"Vuoi veramente rimuovere l'istantanea \"%1\" ?\n"
"(questa azione non potrà essere annullata)"
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr "Rimuovi l'istantanea"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "aggiungi"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "agggiungi marcatore di tempo"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "aggiungi"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "agggiungi marcatore di misurazione"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "fatto"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "sostituisci il marcatore di tempo"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "Rimuovi marcatore di tempo"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5902,43 +6580,51 @@ msgstr ""
msgid "stretch/shrink"
msgstr "allunga/restringi"
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr "sposta l'intonazione"
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr "Pannello di controllo del dispositivo"
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr "Impostazioni del dispositivo midi"
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr "Misura"
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr "Utilizza i risultati"
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr "Torna alle impostazioni ... (ignora i risultati)"
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr "Calibra audio"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr "Torna alle impostazioni"
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
@@ -5949,100 +6635,109 @@ msgstr ""
"(Questo è un errore di compilazione/pacchettizzazione/sistema. Non dovrebbe "
"mai accadere.)"
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr "Misura della latenza"
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr "<span weight=\"bold\">Abbassa il volume ad un livello minimo.</span>"
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr "Seleziona due canali qui sotto e connettili utilizzando un cavo."
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr "Canale di uscita"
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr "Canale di ingresso"
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "Quando i canali saranno collegati clicca il pulsante \"Misura\"."
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
"Quando sei soddisfatto dei risultati clicca il pulsante \"Utilizza i "
"risultati\"."
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr "Ancora nessun risulato della misura"
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Latenza"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr "Sistema audio:"
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "Driver:"
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr "Dispositivo:"
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "Frequenza di campionamento"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "Dimenzione buffer:"
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr "Canali di ingresso:"
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr "Canali di uscita:"
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "Latenza in ingresso:"
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "campioni"
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "Latenza in uscita:"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr ""
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-"Il finale audio di %1 è stato configurato ed avviato dall'esterno.\n"
-"Questo limita il tuo controllo su di esso."
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
@@ -6052,7 +6747,7 @@ msgstr ""
"\n"
"La calibrazione della latenza richiede una interfaccia audio funzionante."
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6063,169 +6758,202 @@ msgstr ""
"\n"
"La calibrazione della latenza richiede entrambe."
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr "Dispositivi MIDI"
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr "Dispositivo"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr "Latenze dell'hardware"
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr "Calibra"
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr "tutti i canali disponibili"
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "campione"
-msgstr[1] "campione"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 campione"
+msgstr[1] "%1 campioni"
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr "(%.1f ms)"
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr "Impossibile avviare il finale audio %1"
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr "Impossibile impostare il driver a %1"
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr "Impossibile impostare il nome del dispositivo a %1"
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr "Impossibile impostare la frequenza di campionamento a %1"
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr "Impossibile impostare la dimensione del buffer a %1"
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr "Impossibile impostare i canali di ingresso a %1"
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr "Impossibile impostare i canali di output a %1"
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr "Impossibile impostere la latenza in ingresso a %1"
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr "Impossibile impostare la latenza in uscita a %1"
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr "Nessun segnale rilevato"
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "Disconnesso dal motore audio"
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr "Rilevata latenza a/r:"
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr "Latenza sistemica:"
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr "(errore nella rilevazione del segnale)"
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr "(invertito - cattivo cablaggio)"
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "Rilevamento..."
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr "Disconnesso da %1"
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Attivo"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr "Connetti a %1"
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "Inattivo"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Fermato"
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Canali"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "Dividi in file mono"
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr "Bus o traccia"
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "La regione non contiene dissolvenze né guadagno (canali: %1)"
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "La regione contiene dissolvenze e guadagno (canali: %1)"
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr "Uscita traccia (canali: %1)"
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "Esporta i contenuti della regione"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "Esporta la traccia"
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
-#: export_dialog.cc:46
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
@@ -6233,16 +6961,16 @@ msgstr ""
"<span color=\"#ffa755\">Alcuni file preesistenti verranno sovrascritti.</"
"span>"
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr "Elenca i file"
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr "Formato del file"
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr "Arco di tempo"
@@ -6270,27 +6998,39 @@ msgstr "Inizializzazione dell'esportazione fallita: %1"
msgid "Stop Export"
msgstr "Ferma esportazione"
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr "esportazione"
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Esportazione '%3' (intervallo %1 di %2)"
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr "Normalizzazione '%3' (intervallo %1 di %2)"
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Esportazione '%3' (intervallo %1 di %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">Errore: "
-#: export_dialog.cc:385
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">Attenzione: "
-#: export_dialog.cc:387
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6298,19 +7038,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">Attenzione: "
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr "Esporta selezione"
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr "Esporta regione"
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr "Sorgente"
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr "Esportazione Stem"
@@ -6318,65 +7058,77 @@ msgstr "Esportazione Stem"
msgid "Add another format"
msgstr "Aggiungi un altro formato"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Formato"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Posizione"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr "Carica su SoundCloud"
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "Nessun formato!"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "Formato %1: %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "Etichetta:"
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "Nome della sessione"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "Revisione"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Cartella:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Sfoglia"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Preparo il/i nome/i a partire da queste componenti:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
"<small><i>Spiacente, non è possibile mostrare un esempio di nome in questo "
"momento</i></small>"
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Nome file (approssimativo): \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
@@ -6386,112 +7138,171 @@ msgstr ""
"Il nome del file verrà scelto dalle informazioni immediatamente sopra il "
"selettore della cartella."
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "Scegli la directory di esportazione"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "Nuovo profilo per il formato di esportazione"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "Modifica profilo per il formato di esportazione"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "Etichetta:"
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalizza a:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Picco"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "Rimuovi il silenzio all'inizio"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "Aggiungi silenzio all'inizio:"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "Rimuovi il silenzio alla fine"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "Aggiungi silenzio alla fine:"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-"Comando per lanciare la post esportazione\n"
-"(%f=percorso completo & nome del file, %d=directory, %b=nome senza "
-"estensione):"
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "Compatibilità "
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "Qualità "
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "Qualità di conversione della frequenza di campionamento:"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "Dithering"
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr "Crea il file CUE per la creazione del CD/DVD in modalità disk-at-once"
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "Crea il file TOC per la creazione del CD/DVD disk-at-once"
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "tag file con i metadati della sessione"
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "Migliore (sinc)"
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "Media (sinc)"
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "Veloce (sinc)"
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "Opzioni di codifica lineare"
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "Opzioni Ogg Vorbis"
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "Opzioni FLAC"
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "Opzioni di trasmissione"
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr "Vuoi veramente rimuovere il formato?"
@@ -6499,7 +7310,7 @@ msgstr "Vuoi veramente rimuovere il formato?"
msgid "Preset"
msgstr "Preimpostazione"
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
@@ -6507,23 +7318,194 @@ msgstr ""
"Il preset selezionato non è stato caricato correttamente!\n"
"Forse fa riferimento ad un formato che è stato rimosso?"
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr "Vuoi veramente rimuovere questa preimpostazione?"
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Formato:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Editor: impossibile aprire il file %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Impossibile accedere al file audio"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr "Mostra tempo come:"
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr "Seleziona tutto"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr "a"
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
msgid "Range"
msgstr "Intervallo"
@@ -6539,36 +7521,39 @@ msgstr ""
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr "%1"
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Modalità di automazione fader"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Tipo di automazione fader"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr "Abs"
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "P"
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr "T"
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr "W"
@@ -6576,47 +7561,51 @@ msgstr "W"
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Presets</span>"
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr "Manuale"
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr "Tutte le automazioni"
#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "Interruttori"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Controlli"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"Plugin Editor: impossibile creare elemento di controllo per la porta %1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr "Editor del plugin: nessuna proprietà di controllo per %1"
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "Interruttori"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Controlli"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr "Meters"
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Controllo automazione"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr "Manuale"
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "Gestore delle connessioni audio"
@@ -6625,126 +7614,163 @@ msgstr "Gestore delle connessioni audio"
msgid "MIDI Connection Manager"
msgstr "Gestore delle connessionio MIDI"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Disconnetti"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "entrata"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "Selezione..."
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "Registrazione abilitata"
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "In solo..."
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "Crea nuovo gruppo ..."
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "Crea nuovo gruppo da"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "Modifica gruppo..."
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr "Raccogli gruppo"
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "Rimuovi gruppo"
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr ""
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "Aggiungi un nuovo bus sottogruppo"
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr "Aggiungi un nuovo bus ausiliario (pre-fader)"
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr "Aggiungi un bus ausiliario (post-fader)"
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr "Abilita tutti i gruppi"
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "Disabilita tutti i gruppi"
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr "Tempo da inserire:"
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr "Le regioni con intersezione dovrebbero:"
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr "resta in posizione"
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr "sposta"
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr "diviso"
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Inserisci il tempo su tutte le tracce della scaletta"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr "Sposta regioni incollate"
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr "Muovi i marcatori"
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr "Sposta i marcatori incollati"
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr "Sposta i marcatori bloccati"
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr "Inserisci tempo"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "-nessuno-"
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "Importazione file: %1 di %2"
@@ -6752,181 +7778,314 @@ msgstr "Importazione file: %1 di %2"
msgid "I/O selector"
msgstr "Selettore I/O"
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "entrata %1"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "uscita %1"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr "il tuo"
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr "Scorciatoie base non disponibili - %1 sarà difficile da utilizzare"
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
"Il file \"%1\" delle scorciatoie da tastiera non disponibile. Verranno usate "
"le scorciatoie di base"
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "Rimuovi scorciatoia"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Azione"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Scorciatoia"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Scorciatoie da tastiera"
+
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Rimuovi scorciatoia"
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:80
+msgid "Search..."
msgstr ""
-"Selezion un'azione, poi premi il tasto(i) per ripristinare o impostare la "
-"relativa scorciatoia"
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:82
+msgid "Print"
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Menù_principale"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
msgstr ""
-#: keyeditor.cc:269
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Azione"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Scorciatoia"
+
+#: keyeditor.cc:370
msgid "RegionList"
msgstr "CatalogoRegioni"
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
msgstr ""
-#: latency_gui.cc:40
-msgid "msec"
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "campione"
+
+#: latency_gui.cc:40
+msgid "msec"
msgstr "ms"
#: latency_gui.cc:41
msgid "period"
msgstr "periodo"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 campione"
-msgstr[1] "%1 campioni"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Azzera"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "Errore di programmazione: %1 (%2)"
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "Utilizza PH"
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "Colla"
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr "Esecutore:"
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr "Compositore:"
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "Pre-enfasi"
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr "Rimuovi questo intervallo"
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr "Tempo d'inizio - clicca con il centrale per posizionarti qui"
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr "Tempo di fine - clicca con il centrale per posizionarti qui"
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr "Imposta l'inizio intervallo dalla posizione della testina"
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr "Imposta la fine dell'intervallo dalla posizione della testina"
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr "Rimuovi questo marcatore"
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr "Posizione - clicca con il centrale per posizionarti qui"
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr "Imposta il marcatore di tempo dalla posizione della testina"
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "Impossibile inserire un marcatore CD all'inizio della sessione"
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr "Nuovo marcatore"
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr "Nuovo Intervallo"
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "Intervalli di Ciclo/Punch"
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>Marcatori (inclusi gli indici CD)</b>"
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>Intervalli (inclusi gli intervalli traccia CD)</b>"
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "agggiungi marcatore di intervallo"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr "%1 non è riuscito a connettersi al finale audio."
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr "Il finale audio (%1) è stato terminato"
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6940,33 +8099,33 @@ msgstr ""
"\n"
"Clicca OK per uscire da %1."
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr "%2 è uscito inaspettatamente e senza notificare %1."
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:344
msgid " (built using "
msgstr "(compilato usando "
-#: main.cc:313
+#: main.cc:347
msgid " and GCC version "
msgstr " e la versione di GCC "
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Tutti i diritti (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
-#: main.cc:324
+#: main.cc:358
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -6974,47 +8133,67 @@ msgstr ""
"Alcune parti Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
-#: main.cc:326
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 è fornito SENZA ALCUNA GARANZIA"
-#: main.cc:327
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr "neanche per la COMMERCIALIZZAZIONE o PER SCOPI PARTICOLARI."
-#: main.cc:328
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Questo è software libero e siete i benvenuti se volete redistribuirlo "
-#: main.cc:329
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"sotto determinate condizioni; leggere i sorgenti per le condizioni relative "
"alla copia."
-#: main.cc:334
+#: main.cc:368
msgid "could not initialize %1."
msgstr "Impossibile inizializzare %1."
-#: main.cc:344
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Impossibile installare il gestore degli errori SIGPIPE "
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr "impossibile creare la GUI per %1"
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr ""
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
msgid "MarkerText"
msgstr ""
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Nessuna"
@@ -7095,11 +8274,11 @@ msgstr "Clicca per attivare/disattivare la riproduzione per il canale %1"
msgid "Click to force all MIDI channel messages to channel %1"
msgstr "Clicca per forzare tutti i messaggi di canale MIDI al canale %1 "
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr "Clicca per attivare/disattivare la registrazione del canale %1"
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr "Clicca per forzare tutti canali di registrazione sull'%1"
@@ -7211,192 +8390,188 @@ msgstr "modifica canale"
msgid "velocity edit"
msgstr "modifica velocity"
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr "aggiungi nota"
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr "aggiungi passo"
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr ""
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr ""
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr ""
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr ""
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr "cancella selezione"
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr "Elimina nota"
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr "muovi note"
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr "cambia le velocità "
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr "trasponi"
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr "cambia le durate"
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr ""
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr "cambia canale"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr "Banco"
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "Programma"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr "Canale"
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "Incolla"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr "tenta di mostrare le regioni MIDI senza sorgente"
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr "tenta di mostrare le regioni MIDI senza modello"
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr "errore nel crare la regione MIDI"
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "Dispositivo MIDI esterno"
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "Modalità dispositivo esterno"
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr "Chns"
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr "Clicca per modificare le impostazioni del canale"
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "Mostra tutto l'intervallo"
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "Adatta i contenuti"
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "Intervallo di nota"
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "Modalità nota"
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr "Selettore dei canali"
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Modalità colore"
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr ""
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "Pressione"
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr "Controller"
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "Nessun canale MIDI selezionato"
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "Nascondi tutti i canali"
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "Mostra tutti i canali"
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "Canale %1"
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "Controller %1-%2"
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr "Controller %1"
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "Sostenuto"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "Percussivo"
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "Colori del meter"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "Colore canale"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Colore traccia"
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr "tutti"
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr "alcuni"
@@ -7412,7 +8587,7 @@ msgstr "Auto scorrimento"
msgid "Decimal"
msgstr "Decimale"
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "Abilitato"
@@ -7428,36 +8603,37 @@ msgstr "Porta:"
msgid "New velocity"
msgstr "Nuova velocity"
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr "File mancante"
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr "Scegli una cartella da cercare"
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr ""
"Aggiungere la cartella prescelta al percorso di ricerca e provare di nuovo."
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr "Blocca il caricamento della sessione"
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr "Salta tutti i file mancanti"
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr "Salta questo file"
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "audio"
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7477,7 +8653,7 @@ msgstr ""
"<tt>%4</tt>\n"
"\n"
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr "Clicca per scegliere un'altra cartella"
@@ -7485,98 +8661,41 @@ msgstr "Clicca per scegliere un'altra cartella"
msgid "Missing Plugins"
msgstr "Plugin mancanti"
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr "Ok"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Attiva/disattiva il Solo sulle tracce/bus del mixer selezionate/i"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Attiva/disattiva il Muto sulle tracce/bus del mixer selezionate/i"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-"Attiva/disattiva abilita registrazione sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Diminuisci il Guadagno sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Aumenta il Guadagno sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Imposta il Guadagno a 0dB sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Copia i processori selezionati"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Taglia i processori selezionati"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Incolla i processori selezionati"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Elimina i processori selezionati"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Seleziona tutti i processori visibili"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Attiva/disattiva i processori selezionati"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Attiva/disattiva i plugin selezionati"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Scorri la finestra del mixer verso sinistra"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Attiva/disattiva l'input MIDI per le tracce/bus selezionate sul mixer"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "pre"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr "Commenti"
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr ""
"Clicca per attivare/disattivare la larghezza di questa linguetta del mixer"
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -7584,288 +8703,460 @@ msgstr ""
"\n"
"%1-%2-clicca per attivare/disattivare la larghezza di tutte le linguette."
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr "Nascondi questa linguetta del mixer"
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr ""
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr "Solo isolato"
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr "Blocca lo stato di solo"
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr "Iso"
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "Missa il gruppo"
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr "Inverti la fase"
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr "Registrazione & monitoraggio"
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr "Abilita/disabilita ingresso MIDI"
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr "Ausiliario"
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr "Snd"
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
"Non connesso al motore audio - non è possibile alcun cambiamento in I/O "
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr "Griglia di routing"
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr "<b>INGRESSO</b> a %1"
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>USCITA</b> da %1"
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr "Disconnesso"
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Commenti*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
msgid "Cmt"
msgstr "Cmt"
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Cmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Clicca per aggiungere/modificare commenti"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr "Grp"
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr "~G"
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Colore..."
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr "Commenti..."
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr "Ingressi..."
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr "Uscite..."
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr "Salva come modello..."
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Attivo"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr "Regola la latenza..."
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr "Protezione dalla denormalizzazione"
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "ID del controllo remoto..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr "Pre"
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr "Post"
-#: mixer_strip.cc:1847
-msgid "Pr"
-msgstr "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
+msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
-msgstr "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
+msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
-msgstr "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
+msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr "Disco"
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr "AFL"
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr "PFL"
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "Pre Fader"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Post Fader"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr "Cambia tutto nel gruppo a %1"
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr "Cambia tutto a %1"
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr "Cambia lo stesso tipo di traccia a %1"
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Gruppo"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr ""
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-tutto-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Linguette"
-#: meter_strip.cc:157
-msgid "Reset Peak"
-msgstr "Resetta picco"
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
-#: meter_strip.cc:883
-msgid "Variable height"
-msgstr "Altezza variabile"
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
-#: meter_strip.cc:884
-msgid "Short"
-msgstr "Corto"
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
-#: meter_strip.cc:885
-msgid "Tall"
-msgstr "Lungo"
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
-#: meter_strip.cc:886
-msgid "Grande"
-msgstr "Grande"
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
-#: meter_strip.cc:887
-msgid "Venti"
-msgstr "Venti"
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "Picco"
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
-#: meter_patterns.cc:85
-msgid "RMS + Peak"
-msgstr "RMS + Picco"
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Attiva/disattiva il Solo sulle tracce/bus del mixer selezionate/i"
-#: meter_patterns.cc:88
-msgid "IEC1/DIN"
-msgstr "IEC1/DIN"
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Attiva/disattiva il Muto sulle tracce/bus del mixer selezionate/i"
-#: meter_patterns.cc:91
-msgid "IEC1/Nordic"
-msgstr "IEC1/Nordic"
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+"Attiva/disattiva abilita registrazione sulle tracce/bus selezionate del mixer"
-#: meter_patterns.cc:94
-msgid "IEC2/BBC"
-msgstr "IEC2/BBC"
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Diminuisci il Guadagno sulle tracce/bus selezionate del mixer"
-#: meter_patterns.cc:97
-msgid "IEC2/EBU"
-msgstr "IEC2/EBU"
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Aumenta il Guadagno sulle tracce/bus selezionate del mixer"
-#: meter_patterns.cc:100
-msgid "K20"
-msgstr "K20"
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Imposta il Guadagno a 0dB sulle tracce/bus selezionate del mixer"
-#: meter_patterns.cc:103
-msgid "K14"
-msgstr "K14"
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Copia i processori selezionati"
-#: meter_patterns.cc:106
-msgid "K12"
-msgstr "K12"
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Taglia i processori selezionati"
-#: meter_patterns.cc:109
-msgid "VU"
-msgstr "VU"
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Incolla i processori selezionati"
-#: monitor_section.cc:69
-msgid "SiP"
-msgstr "SiP"
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Elimina i processori selezionati"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Seleziona tutti i processori visibili"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Attiva/disattiva i processori selezionati"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Attiva/disattiva i plugin selezionati"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Scorri la finestra del mixer verso sinistra"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "Attiva/disattiva l'input MIDI per le tracce/bus selezionate sul mixer"
+
+#: meter_strip.cc:160
+msgid "Reset Peak"
+msgstr "Resetta picco"
+
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
+msgid "Variable height"
+msgstr "Altezza variabile"
+
+#: meter_strip.cc:895
+msgid "Short"
+msgstr "Corto"
+
+#: meter_strip.cc:896
+msgid "Tall"
+msgstr "Lungo"
+
+#: meter_strip.cc:897
+msgid "Grande"
+msgstr "Grande"
+
+#: meter_strip.cc:898
+msgid "Venti"
+msgstr "Venti"
+
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
+msgid "RMS + Peak"
+msgstr "RMS + Picco"
+
+#: meter_patterns.cc:93
+msgid "IEC1/DIN"
+msgstr "IEC1/DIN"
+
+#: meter_patterns.cc:96
+msgid "IEC1/Nordic"
+msgstr "IEC1/Nordic"
+
+#: meter_patterns.cc:99
+msgid "IEC2/BBC"
+msgstr "IEC2/BBC"
+
+#: meter_patterns.cc:102
+msgid "IEC2/EBU"
+msgstr "IEC2/EBU"
+
+#: meter_patterns.cc:105
+msgid "K20/RMS"
+msgstr ""
+
+#: meter_patterns.cc:108
+msgid "K14/RMS"
+msgstr ""
+
+#: meter_patterns.cc:111
+msgid "K12/RMS"
+msgstr ""
+
+#: meter_patterns.cc:114
+msgid "VU"
+msgstr "VU"
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:80
+msgid "SiP"
+msgstr "SiP"
+
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "In solo"
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr "Isolato"
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr "In ascolto"
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -7873,7 +9164,7 @@ msgstr ""
"Se attivo, qualcosa è in solo-isolato.\n"
"Clicca per ripristinare tutto"
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -7881,27 +9172,72 @@ msgstr ""
"Se attivo, qualcosa è in ascolto.\n"
"Clicca per ripristinare"
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr "I controlli di solo influenzano il solo-in-place"
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr "Interruttore per i controlli del Solo in modalità ascolto after-fader"
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr "Interruttore per il controllo del solo in modalità ascolto pre-fader"
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr "Solo esclusivo"
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "Solo esclusivo vuol dire che soltanto un solo per volta è attivo"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr "Solo » Muto"
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Se abilitato, solo avrà la precedenza sul muto\n"
+"(una traccia o un bus in solo e muto sarà udibile)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr "Aumento di guadagno per i segnali in solo (0dB è la norma)"
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr "Spingi solo"
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
@@ -7909,106 +9245,136 @@ msgstr ""
"Riduzione di guadagno per i segnali non in solo\n"
"Un valore sopra -inf dB ottiene il \"solo-in-front\""
-#: monitor_section.cc:196
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
msgid "SiP Cut"
msgstr "Taglio SiP"
-#: monitor_section.cc:211
+#: monitor_section.cc:240
msgid "Gain reduction to use when dimming monitor outputs"
msgstr ""
"Riduzione di guadagno da utilizzare per affievolire le uscite del monitor"
-#: monitor_section.cc:225 monitor_section.cc:283
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
msgid "Dim"
msgstr "Affievolisci"
-#: monitor_section.cc:235
-msgid "Excl. Solo"
-msgstr "Solo esclusivo"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "Solo esclusivo vuol dire che soltanto un solo per volta è attivo"
-
-#: monitor_section.cc:244
-msgid "Solo » Mute"
-msgstr "Solo » Muto"
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:333
+msgid "Inv"
msgstr ""
-"Se abilitato, solo avrà la precedenza sul muto\n"
-"(una traccia o un bus in solo e muto sarà udibile)"
-#: monitor_section.cc:323
+#: monitor_section.cc:399
msgid "Monitor"
msgstr "Monitora"
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr "Passa al monitor mono"
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr "Taglia il monitor"
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr "Affievolisci il monitor"
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr "Attiva/disattiva modalità solo esclusivo"
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "Taglia il canale monitor %1"
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr "Affievolisci il canale monitor %1"
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr "Solo il canale monitor %1"
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr "Inverti il canale monitor %1"
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr "Solo in-place"
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr "Solo in ascolto post fader (AFL)"
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr "Solo in ascolto pre fader (PFL)"
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr "bypassato"
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr "L:%3d R:%3d"
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr ""
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr "%"
@@ -8089,10 +9455,6 @@ msgstr ""
"di Ardour fa affidamento su un costante flusso di denaro. \n"
"Grazie per utilizzare Ardour!"
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nuovo preset"
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr "Sostituisci il preset esistente con questo"
@@ -8101,6 +9463,10 @@ msgstr "Sostituisci il preset esistente con questo"
msgid "Name of new preset"
msgstr "Nome del nuovo preset"
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "Normalizza regioni"
@@ -8109,7 +9475,11 @@ msgstr "Normalizza regioni"
msgid "Normalize region"
msgstr "Normalizza regione"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalizza a:"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr "dbFS"
@@ -8129,106 +9499,109 @@ msgstr "Normalizza"
msgid "Select Note"
msgstr "Seleziona nota"
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Utilizzo: "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr " [nome sessione] Nome della sessione da caricare\n"
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr " -v, --versione Mostra info sulla versione\n"
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr " -h, --help Mostra questo messaggio\n"
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
" -d, --disable-plugins Disabilita tutti i plugin in una sessione "
"esistente\n"
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
" [nome sessione] Crea una sessione dalla riga di comando\n"
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr " -n, --no-splash Non usare il supporto VST\n"
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr ""
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr ""
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "Bipassa"
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr ""
@@ -8240,6 +9613,22 @@ msgstr "Modalita' automazione pan"
msgid "Pan automation type"
msgstr "Tipo di automazione pan"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr "Playlists"
@@ -8272,100 +9661,254 @@ msgstr "scala dB"
msgid "Show phase"
msgstr "Mostra la fase"
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "Mandata"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Impossibile prepare la nuova mandata: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "Il nome contiene"
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "Il tipo contiene"
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr "Categoria contiene"
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "Autore contiene"
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "Libreria contiene"
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "Solo favoriti"
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "Solo nascosto"
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr "Gestore dei plugin"
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr "Fav"
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr "Plugin disponibili"
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Tipo"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr "Categoria"
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr "Creatore"
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr "# Ingresso audio"
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr "# Uscita audio"
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr "# Ingresso MIDI"
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr "# Uscita MIDI"
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "Plugin da connettere"
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Aggiungi un plugin alla lista degli effetti"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Rimuovi un plugin dalla lista degli effetti"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Aggiorna i plugin disponibili"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
-#: plugin_selector.cc:172
-msgid "Insert Plugin(s)"
-msgstr "Inserisci plugin(s)"
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
-msgid "variable"
-msgstr "variabile"
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
+
+#: plugin_selector.cc:232
+msgid "Insert Plugin(s)"
+msgstr "Inserisci plugin(s)"
+
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
+msgid "variable"
+msgstr "variabile"
+
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -8375,43 +9918,43 @@ msgstr ""
"\n"
"Controlla la finestra dei Log per ulteriori dettagli (forse)"
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "Favoriti"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "Gestore dei plugin..."
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Per creatore"
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Per categoria"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "Cosa? I plugin LADSPA non hanno editor?"
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr ""
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8419,15 +9962,15 @@ msgstr ""
msgid "Add"
msgstr "Aggiungi"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr "Descrizione"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr "Analisi plugin"
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
@@ -8435,23 +9978,28 @@ msgstr ""
"Preimpostazioni (se presenti) per questo plugin\n"
"(Sia utente che di fabbrica)"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr "Salva una nuova preimpostazione"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr "Salva la preimpostazione corrente"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr "Cancella la preimpostazione corrente"
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr "Disabilita l'elaborazione del segnale da parte del plugin"
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -8459,25 +10007,25 @@ msgstr ""
"Clicca per consentire al plugin di ricevere eventi dalla tastiera che "
"normalmente %1 userebbe come una scorciatoia"
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr "Clicca per abilitare/disabilitare questo plugin"
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "latenza (%1 campione)"
msgstr[1] "latenza (%1 campioni)"
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr "latenza (%1 ms)"
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr "Modifica latenza"
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -8486,87 +10034,103 @@ msgstr ""
"Prendi in considerazione una sottoscrizione in denaro per la versione "
"completa"
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nuovo preset"
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "Clicca per consentire il normale utilizzo delle scorciatoie di %1"
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
msgid "%1 Busses"
msgstr "%1 Bus"
-#: port_group.cc:338
+#: port_group.cc:339
msgid "%1 Tracks"
msgstr "%1 Tracce"
-#: port_group.cc:339
+#: port_group.cc:340
msgid "Hardware"
msgstr ""
-#: port_group.cc:340
+#: port_group.cc:341
msgid "%1 Misc"
msgstr "%1 Misc"
-#: port_group.cc:341
+#: port_group.cc:342
msgid "Other"
msgstr "Altro"
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr "Uscita LTC "
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr "Ingresso LTC"
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr "Ingresso MTC"
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr "Controllo ingresso MIDI"
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr "Ingresso orologio MIDI"
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr "Ingresso MMC"
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr "Uscita MTC"
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr "Uscita controllo MIDI"
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr "Uscita controllo MIDI"
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr "Uscita MMC"
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ":controllo"
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr "systema:"
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
+msgstr ""
#: port_insert_ui.cc:39
msgid "Measure Latency"
@@ -8588,82 +10152,76 @@ msgstr "Nessun segnale rilevato"
msgid "Port Insert "
msgstr ""
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr "<b>Sorgenti</b>"
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr "<b>Destinazioni</b>"
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr "Aggiungi %s %s"
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr "Rinomina '%s'..."
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr "Rimuovi tutto"
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr "%s tutti"
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Aggiorna"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr "Mostra porte individuali"
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-"Non è possibile aggiungere una porta qui perché il primo processore nella "
-"traccia o bus non supporta la nuova configurazione."
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr "Non posso aggiungere la porta"
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "La rimozione delle porte non è consentita"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
msgstr ""
-"Questa porta non può essere rimossa.\n"
-"O il primo plugin nella traccia o bus non può accettare \n"
-"i nuovi ingressi o l'ultimo plugin ha più uscite."
-#: port_matrix.cc:965
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "La rimozione delle porte non è consentita"
+
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "Rimuovi '%s'"
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s tutti da '%s'"
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "canali"
@@ -8675,15 +10233,15 @@ msgstr "Non ci sono porte cui connettersi."
msgid "There are no %1 ports to connect."
msgstr "Non ci sono porte %1 cui connettersi."
-#: processor_box.cc:150
-msgid "Send"
-msgstr "Mandata"
-
-#: processor_box.cc:152
+#: processor_box.cc:226
msgid "Return"
msgstr "Ritorno"
-#: processor_box.cc:310
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr ""
+
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
@@ -8691,17 +10249,14 @@ msgstr ""
"\n"
"Questo plugin mono è stato replicato %1 volte."
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-"<b>%1</b>\n"
-"Doppio click per mostrare la GUI.\n"
-"Alt+doppio-clic per mostrare la GUI generica.%2"
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
@@ -8709,32 +10264,43 @@ msgstr ""
"<b>%1</b>\n"
"Doppio-clic per mostrare la GUI generica.%2"
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr "(%1x1)"
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "Mostra tutti i controlli"
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "Nascondi tutti i controlli"
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr "acceso"
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "spento"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -8742,15 +10308,22 @@ msgstr ""
"Clic-destro per inserire/rimuovere/modificare\n"
"i plugin, mandate, innesti e altro"
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr "Incompatibilità del plugin"
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "Hai tentato di aggiungere il plugin \"%1\" nella posizione %2.\n"
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
@@ -8758,19 +10331,19 @@ msgstr ""
"\n"
"Questo plugin ha:\n"
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 ingresso MIDI\n"
msgstr[1] "\t%1 ingressi MIDI\n"
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 ingresso audio\n"
msgstr[1] "\t%1 ingressi audio\n"
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -8778,19 +10351,19 @@ msgstr ""
"\n"
"ma in corrispondenza del punto di inserimento ci sono:\n"
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 canale MIDI\n"
msgstr[1] "\t%1 canali MIDI\n"
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 canale audio\n"
msgstr[1] "\t%1 canali audio\n"
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -8798,11 +10371,7 @@ msgstr ""
"\n"
"%1 non può inserire qui questo plugin.\n"
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "Impossibile prepare la nuova mandata: %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -8812,20 +10381,20 @@ msgstr ""
"in questa maniera perché gli ingressi e le uscite\n"
"non funzionerebbero correttamente."
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr "Rinomina processore"
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
"Esistono almeno 100 oggetti I/O con un nome simile a %1 - nome non cambiato"
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr "il costruttore dell'innesto per il plugin ha fallito"
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -8835,7 +10404,7 @@ msgstr ""
"probabilmente perché la configurazione I/O dei plugin\n"
"non combacia con la configurazione di questa traccia."
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -8843,15 +10412,15 @@ msgstr ""
"Veramente vuoi rimuovere tutti i processori da %1?\n"
"(questa operazione non può essere annullata)"
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Si, rimuovi tutto"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr "Rimuovi processori"
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -8859,7 +10428,7 @@ msgstr ""
"Veramente vuoi rimuovere tutti i processori pre-fader da %1?\n"
"(questa operazione non può essere annullata)"
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
@@ -8867,59 +10436,59 @@ msgstr ""
"Veramente vuoi rimuovere tutti i processori post-fader da %1?\n"
"(questa operazione non può essere annullata)"
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr "Nuovo plugin"
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Nuovo insert"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr "Nuova mandata esterna..."
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr "Nuova mandata ausiliaria..."
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr "Opzioni della mandata"
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr "Pulisci (tutto)"
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr "Pulisci (pre-fader)"
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr "Pulisci (post-fader)"
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "Attiva tutto"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr "Disattiva tutto"
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr "Plugin A/B"
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr "Modifica attraverso i controlli generici..."
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr "%1: %2 (per %3)"
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr "%1 (di %2)"
@@ -8947,135 +10516,296 @@ msgstr "Banco"
msgid "main grid"
msgstr "griglia principale"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Quantizza"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "Forza"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Swing"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "Soglia (ticks)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr ""
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr ""
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "File audio (click):"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "Sfoglia..."
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "File audio (click):"
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Pecorso del file di enfasi click"
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Scegli click"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Usa come enfasi del click"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "Limita lo storico degli annullamenti a"
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "Salva lo storico degli annullamenti di"
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "comandi"
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "Modifica usando:"
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ pulsante"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "Elimina usando:"
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "Inserisci nota usando:"
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr ""
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
msgid "Ignore snap using:"
msgstr ""
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Disposizione della tastiera:"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Scala del carattere"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr ""
-#: rc_option_editor.cc:547
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr ""
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr ""
+
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
+
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr ""
+
+#: rc_option_editor.cc:1032
msgid "Default"
msgstr "Default"
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr ""
+
+#: rc_option_editor.cc:1100
+msgid "â"
+msgstr ""
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr ""
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr ""
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-"I cambiamenti principali nell scala del fonto richiedono il riavvio "
-"dell'applicazione."
-#: rc_option_editor.cc:614
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr ""
+
+#: rc_option_editor.cc:1159
msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:666
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "Preimpostazione:"
+
+#: rc_option_editor.cc:1231
msgid "Playback (seconds of buffering):"
msgstr "Riproduzione (secondi di buffering)"
-#: rc_option_editor.cc:679
+#: rc_option_editor.cc:1244
msgid "Recording (seconds of buffering):"
msgstr "Registrazione (secondi di buffering)"
-#: rc_option_editor.cc:737
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr ""
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-"Doppio click su un nome per modificare le impostazioni di un protocollo "
-"abilitato"
-#: rc_option_editor.cc:903
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
msgid "Show Video Export Info before export"
msgstr "Mostra le informazioni di esportazione video prima di esportare"
-#: rc_option_editor.cc:904
+#: rc_option_editor.cc:1548
msgid "Show Video Server Startup Dialog"
msgstr "Mostra la finestra di dialogo delle informazioni del server video"
-#: rc_option_editor.cc:905
+#: rc_option_editor.cc:1549
msgid "Advanced Setup (remote video server)"
msgstr "Impostazioni avanzate (server video remoto)"
-#: rc_option_editor.cc:913
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
msgid ""
"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
"- Do not enable this option unless you know what you are doing."
@@ -9084,11 +10814,11 @@ msgstr ""
"personalizzato ed una docroot. - Non abilitare questa opzione se non sai "
"cosa stai facendo."
-#: rc_option_editor.cc:915
+#: rc_option_editor.cc:1567
msgid "Video Server URL:"
msgstr "URL del server video:"
-#: rc_option_editor.cc:920
+#: rc_option_editor.cc:1572
msgid ""
"Base URL of the video-server including http prefix. This is usually 'http://"
"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -9098,11 +10828,11 @@ msgstr ""
"'http://hostname.example.org:1554/' e di default è 'http://localhost:1554/' "
"se il server video è locale"
-#: rc_option_editor.cc:922
+#: rc_option_editor.cc:1574
msgid "Video Folder:"
msgstr "Cartella video:"
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1579
msgid ""
"Local path to the video-server document-root. Only files below this "
"directory will be accessible by the video-server. If the server run on a "
@@ -9117,7 +10847,7 @@ msgstr ""
"per il monitoraggio video locale e per la navigazione dei file durante "
"l'apertura/aggiunta di un file video."
-#: rc_option_editor.cc:934
+#: rc_option_editor.cc:1584
msgid ""
"<b>When enabled</b> an information window with details is displayed before "
"the video-export dialog."
@@ -9125,7 +10855,7 @@ msgstr ""
"<b>Se abilitata</b> una finestra di dialogo informativa contenente i "
"dettagli viene mostrata prima della finestra di esportazione video."
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1589
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
@@ -9133,179 +10863,113 @@ msgstr ""
"<b>Se abilitata</b> il server video non viene mai lanciato automaticamente "
"senza conferma"
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr ""
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr ""
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr ""
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "Generale"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "Ricerca dei plugin"
-
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
-msgstr ""
-
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
-msgstr ""
-
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr ""
-
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr "VST"
-
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "Pulisci la cache VST"
-
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "Pulisci la lista nera VST"
-
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr "Path VST Linux:"
-
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr "Percorso VST Windows"
-
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "Unità audio"
-
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1610
msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "Pulisci la cache AU"
-
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "Pulisci la lista nera AU"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
msgstr ""
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "Preferenze %1"
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
msgstr "Utilizzo DSP CPU "
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "Elaborazione del segnale utilizza"
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "tutti i processori tranne uno"
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "tutti i processori disponibili"
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr "%1 processori"
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr "Questa impostazione avrà effetto quando %1 verrà riavviato."
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "Opzioni|Undo"
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "Verifica la rimozione dell'ultima cattura"
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Fai periodicamente un backup del file di sessione"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr "Gestione delle sessione"
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Fai periodicamente un backup del file di sessione"
+
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Copia sempre i file importati"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr "Cartella di default per le nuove sessioni:"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "Numero massimo per le sessioni recenti:"
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr "Livello di guadagno del click"
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automazione"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr ""
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "Intervallo di campionamento dell'automazione (millisecondi)"
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "Mantieni la registrazione abilitata dopo lo stop"
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -9314,25 +10978,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr "Ferma la registrazione in caso di xrun"
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "Crea marcatori in corrispondenza di ogni xrun"
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "Fermati alla fine della sessione"
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -9341,11 +11005,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -9355,39 +11019,83 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr ""
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "Riduci il segnale di 12dB in avanzamento/riavvolgimento rapido"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr ""
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9401,27 +11109,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9434,594 +11142,829 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr "Lettore LTC"
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr ""
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr ""
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
msgstr ""
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Assegna un nome ai nuovi marcatori"
+
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
msgstr ""
-"Sposta le automazioni rilevanti quando le regioni audio vengono spostate"
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Mostra i meter sulle tracce nell'editor"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
msgstr ""
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Mostra le onde nelle regioni"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr ""
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
msgstr ""
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
msgstr ""
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
msgstr ""
+"Sposta le automazioni rilevanti quando le regioni audio vengono spostate"
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
msgstr ""
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "lineare"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "logaritmico"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
+msgstr ""
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
msgstr ""
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Mostra le onde durante la registrazione audio"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Mostra la barra dello zoom"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Assegna un nome ai nuovi marcatori"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
msgstr ""
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
msgstr ""
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Mostra le onde nelle regioni"
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Mostra le onde durante la registrazione audio"
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
msgstr ""
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "lineare"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr "logaritmico"
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
msgstr ""
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2387
+msgid "traditional"
msgstr ""
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2388
+msgid "rectified"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr ""
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr "Controllo della registrazione da parte di"
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "hardware audio"
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Modalità nastro"
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Connessione di tracce e bus"
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "Connetti automaticamente i bus master/monitor"
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "Connetti ingressi della traccia"
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "automaticamente agli ingressi fisici"
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "manualmente"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "Connetti le uscite della traccia e del bus"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "automaticamente alle uscite fisiche"
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "automaticamente al bus master"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr ""
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr ""
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "Gestione processore"
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "nessuna gestione processore"
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr ""
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
+msgstr "Abilita l'analisi automatica dell'audio"
+
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
msgstr ""
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Attiva i nuovi plugin"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
-msgstr "Abilita l'analisi automatica dell'audio"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
+msgstr "I controlli di solo sono controlli di ascolto"
+
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Solo esclusivo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr ""
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr ""
+
+#: rc_option_editor.cc:2592
+msgid "Listen Position"
+msgstr ""
+
+#: rc_option_editor.cc:2597
+msgid "after-fader (AFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2598
+msgid "pre-fader (PFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2604
+msgid "PFL signals come from"
+msgstr "i segnali PFL provengono da"
+
+#: rc_option_editor.cc:2609
+msgid "before pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2610
+msgid "pre-fader but after pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2616
+msgid "AFL signals come from"
+msgstr "I segnali AFL provengono da"
+
+#: rc_option_editor.cc:2621
+msgid "immediately post-fader"
+msgstr ""
+
+#: rc_option_editor.cc:2622
+msgid "after post-fader processors (before pan)"
+msgstr ""
+
+#: rc_option_editor.cc:2626
+msgid "Default track / bus muting options"
+msgstr "Opzioni di </i>mute</i> base per Tracce/Bus"
+
+#: rc_option_editor.cc:2631
+msgid "Mute affects pre-fader sends"
+msgstr "Mute agisce sulle mandate pre-fader"
+
+#: rc_option_editor.cc:2639
+msgid "Mute affects post-fader sends"
+msgstr "Mute agisce sulle mandate post-fader"
+
+#: rc_option_editor.cc:2647
+msgid "Mute affects control outputs"
+msgstr "Mute agisce sulle uscite"
+
+#: rc_option_editor.cc:2655
+msgid "Mute affects main outputs"
+msgstr "Mute agisce sulle uscite principali"
+
+#: rc_option_editor.cc:2662
+msgid "Send Routing"
+msgstr ""
+
+#: rc_option_editor.cc:2666
+msgid "Link panners of Aux and External Sends with main panner by default"
+msgstr ""
+
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
+msgid "MIDI read-ahead time (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+" <i>(requires a restart of %1 to take effect)</i>\n"
+" <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr "Tastiera"
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
-msgstr ""
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Ricerca dei plugin"
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / mute"
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr "Generale"
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
msgstr ""
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
-msgstr "I controlli di solo sono controlli di ascolto"
-
-#: rc_option_editor.cc:1980
-msgid "Listen Position"
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
msgstr ""
-#: rc_option_editor.cc:1985
-msgid "after-fader (AFL)"
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
msgstr ""
-#: rc_option_editor.cc:1986
-msgid "pre-fader (PFL)"
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
msgstr ""
-#: rc_option_editor.cc:1992
-msgid "PFL signals come from"
-msgstr "i segnali PFL provengono da"
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Attiva i nuovi plugin"
-#: rc_option_editor.cc:1997
-msgid "before pre-fader processors"
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
msgstr ""
-#: rc_option_editor.cc:1998
-msgid "pre-fader but after pre-fader processors"
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
msgstr ""
-#: rc_option_editor.cc:2004
-msgid "AFL signals come from"
-msgstr "I segnali AFL provengono da"
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr "VST"
-#: rc_option_editor.cc:2009
-msgid "immediately post-fader"
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
msgstr ""
-#: rc_option_editor.cc:2010
-msgid "after post-fader processors (before pan)"
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
msgstr ""
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Solo esclusivo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
msgstr ""
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
msgstr ""
-#: rc_option_editor.cc:2040
-msgid "Default track / bus muting options"
-msgstr "Opzioni di </i>mute</i> base per Tracce/Bus"
-
-#: rc_option_editor.cc:2045
-msgid "Mute affects pre-fader sends"
-msgstr "Mute agisce sulle mandate pre-fader"
-
-#: rc_option_editor.cc:2053
-msgid "Mute affects post-fader sends"
-msgstr "Mute agisce sulle mandate post-fader"
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
-#: rc_option_editor.cc:2061
-msgid "Mute affects control outputs"
-msgstr "Mute agisce sulle uscite"
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
-#: rc_option_editor.cc:2069
-msgid "Mute affects main outputs"
-msgstr "Mute agisce sulle uscite principali"
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr "Path VST Linux:"
-#: rc_option_editor.cc:2074
-msgid "Send Routing"
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
msgstr ""
-#: rc_option_editor.cc:2079
-msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr ""
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr "Percorso VST Windows"
-#: rc_option_editor.cc:2087
-msgid "MIDI read-ahead time (seconds)"
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
msgstr ""
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
-msgstr ""
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr "Unità audio"
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
msgstr ""
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
msgstr ""
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
msgstr ""
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
msgstr ""
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
msgstr ""
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
msgstr ""
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
msgstr ""
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
msgstr ""
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
msgstr ""
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
msgstr ""
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
msgstr ""
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3038
msgid ""
-"Use translations of %1 messages\n"
-" <i>(requires a restart of %1 to take effect)</i>\n"
-" <i>(if available for your language preferences)</i>"
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
-msgstr "Tastiera"
-
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "ID della piattaforma di controllo"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
+msgstr "Preferenze|GUI"
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "assegnato dall'utente"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "segue l'ordine del mixer"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
-msgstr "Preferenze|GUI"
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr ""
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr "Linguetta del mixer"
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr "Utilizza linguette del mixer strette di default."
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr "breve"
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr "medio"
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr "lungo"
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr "il più lento [6.6dB/sec]"
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "lento [8.6dB/sec] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "moderato [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
-msgstr "medio [20dB/sec]"
-
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
-msgstr "veloce [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr "più veloce [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
+msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr "massima velocità [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
+msgstr ""
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr "-20dBFS (SMPTE RP.0155)"
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr "-18dBFS (EBU, BBC)"
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr "-15dBFS (DIN)"
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr "0VU = -2dBu (France)"
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr "0VU = 0dBu (Nord America, Australia)"
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr "0VU = +4dBu (standard)"
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr "0VU = +8dBu"
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr "Soglia di picco [dBFS]"
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
@@ -10029,67 +11972,99 @@ msgstr ""
"Indica il livello di segnale in dbFS superato il quale il meter di picco "
"lampeggerà in rosso."
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Mostra i meter sulle tracce nell'editor"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr "Tema"
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "fai l'audition di questa regione"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr "Posizione:"
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr "Fine:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr "Durata:"
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr "Punto di sincronia (relativo alla regione)"
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr "Punto di sincronia (assoluto):"
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr "Inizio file:"
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr "Sorgenti:"
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr "Sorgente:"
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr "Regione '%1'"
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr "cambia la posizione di inizio regione"
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr "cambia la posizione di fine regione"
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr "cambia la durata della regione"
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr "cambia il punto di sincroniza della regione"
@@ -10109,33 +12084,33 @@ msgstr "Traccia:"
msgid "Choose Top Region"
msgstr "Scegli la regione in cima"
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "minuti"
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "msec"
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "secondi"
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] ""
msgstr[1] ""
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr "più corto = %1 %2"
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -10181,55 +12156,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr ""
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "Separa la regione"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr ""
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "Conforma regioni"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "Analizzatore ritmico"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Analizza"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr ""
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
msgstr ""
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Soglia"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "Soglia di picco"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "Soglia del silenzio"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "Sensibilità "
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Operazione"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "dividi regioni (rhythm ferret)"
@@ -10253,19 +12236,15 @@ msgstr "Attiva registrazione"
msgid "Active state"
msgstr "Stato attivo"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Colore"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr ""
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>Condivisione</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr "Il nome del gruppo non è unico. Per favore utilizza un nome diverso."
@@ -10285,332 +12264,317 @@ msgstr "Uscite"
msgid "Plugins, Inserts & Sends"
msgstr "Plugin, inserts & mandate"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr ""
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "Ritardo di riproduzione: %<PRId64> campioni"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "NESSUNA TRACCIA"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Aggiungi Traccia/Bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "Nessuna traccia o bus selezionati"
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr "Registrazione (clicca col destro per la modifica passo passo)"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Registra"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr ""
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr "Controller MIDI e automazione"
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "Mostra tutte le automazioni"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "Mostra le automazioni esistenti"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "Nascondi tutte le automazioni"
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr "Automazione del processore"
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Fader"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Panorama"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr ""
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr ""
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Livelli"
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr "Automatico (basato sulle connessioni I/O)"
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr ""
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr ""
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr ""
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr ""
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "Allineamnento"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr "Normale"
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr "Nastro"
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr ""
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr "Modalità registrazione"
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Scaletta"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "Rinomina playlist"
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "Nuovo nome per la playlist:"
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "Copia playlist"
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "Nome per la nuova playlist:"
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "Nuova playlist"
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-"Non si può creare una traccia con questo nome perché è riservato per %1"
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "Nuova copia..."
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "Nuova ripresa"
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "Copia ripresa"
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Pulisci Corrente"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "Seleziona tutto da..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr "Ripresa: %1.%2"
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "errore di programmazione: "
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr ""
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "Rimuovi \"%1\""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr ""
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr ""
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr "Muta questa traccia"
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr "Muta le altre (non in solo) tracce"
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr "Abilita la registrazione"
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr ""
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr "Monitora ingresso"
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr "Monitora la riproduzione"
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
"Non connesso al motore audio - non posso intraprendere la registrazione"
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr "Assegna tutte le tracce (pre fader)"
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr "Assegna tutte le tracce e i bus (pre fader)"
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr "Assegna tutte le tracce (post fader)"
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr "Assegna tutte le tracce e bus (post fader)"
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr "Assegna le tracce selezionate (pre fader)"
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr "Assegna le tracce selezionate e i bus (pre fader)"
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr "Assegna le tracce selezionate (post fader)"
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr "Assegna le tracce selezionate e i bus (post fader)"
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr "Copia il guadagno della traccia/bus sulle mandate"
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr "Imposta il volume delle manda su -inf"
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr "Imposta il volume delle mandate a 0dB"
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr "Solo isolato"
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr ""
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr "Mandate pre fader"
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr "Mandate post fader"
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "Uscite di Controllo"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "Uscite Principali"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr "Scelta colore"
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Si vuole veramente rimuovere la traccia \"%1\" ?\n"
-"\n"
-"Perderete anche la playlist associata a questa traccia.\n"
-"\n"
-"(questa azione non potrà essere annullata ed il file di sessione verrà "
-"sovrascritto)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Si vuole veramente rimuovere il bus \"%1\" ?\n"
-"\n"
-"(questa azione non potrà essere annullata ed il file di sessione verrà "
-"sovrascritto)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Rimuovi traccia"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Rimuovi bus"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -10619,89 +12583,74 @@ msgstr ""
"bus.\n"
"Vuoi utilizzare questo nuovo nome?"
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr "Utilizza il nuovo nome"
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr "Ri-modifica il nome"
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "Rinomina traccia"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr "Rinomina bus"
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": editor del commento"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr " latenza"
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr ""
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr "Salva come modello"
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr "Nome del modello:"
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID del controllo remoto"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "ID del controllo remoto:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-"L'ID del controllo remoto di %1 è: %2\n"
-"\n"
-"\n"
-"L'ID del controllo remoto di %3 non può essere modificato."
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
msgstr ""
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
msgstr ""
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
msgstr ""
#: search_path_option.cc:35
@@ -10716,126 +12665,158 @@ msgstr "Clicca per aggiungere una nuova posizione"
msgid "the session folder"
msgstr "la cartella di sessione"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr "Mandata"
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr "Impostazioni della sessione"
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr "Impostazioni avanzate..."
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessioni recenti"
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr "Frequenza di campionamento"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr ""
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
msgid "New Session"
msgstr "Nuova sessione"
-#: session_dialog.cc:301
+#: session_dialog.cc:379
msgid "Check the website for more..."
msgstr "Controlla il sito web per altro..."
-#: session_dialog.cc:304
+#: session_dialog.cc:382
msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "Frequenza di campionamento"
-
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "Formato disco"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "Seleziona un file sessione"
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr "Altre sessioni"
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr "Apri"
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Nome della sessione:"
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "Crea cartella di sessione in: "
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "Seleziona una cartella per la sessione"
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "Usa questo modello"
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr "nessun modello"
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "canali"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>Bus</b>"
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>Ingressi</b>"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>Uscite</b>"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "Crea un master bus"
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "Connetti automaticamente agli ingressi fisici"
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "Usa soltanto"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "Connetti automaticamente le uscite"
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "... al bus Master"
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "... alle uscite fisiche."
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importa da una sessione"
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr "Elementi"
@@ -10858,191 +12839,191 @@ msgstr "Importa da una sessione"
msgid "This will select all elements of this type!"
msgstr "Questo selezionerà tutti gli elementi di questo tipo!"
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Campo"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "Valori"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "Utente"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr "Email"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr "Web"
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr "Organizzazione"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr "Stato"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "Titolo"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "Numero traccia"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "Sottotitolo"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr "Raggruppamento"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "Artista"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "Genere"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "Commento"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "Diritti"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "Album"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Anno"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "Album Artista"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "Tracce totali"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "Sottotitolo disco"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "Numero disco"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "Dischi totali"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "Compilation"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr "ISRC"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "Persone"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "Testi"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "Compositore"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "Conduttore"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "Remissaggio"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "Arrangiatore"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "Ingegnere"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "Produttore"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "DJ Mixer"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "Metadati|Mixer"
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr "Scuola"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr "Istruttore"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr "Corso"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "Modifica i metadati della sessione"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "Importa i metadati di una sessione"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr "Scegli la sessione da cui importare i metadati"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "Impossibile leggere questo file di sessione"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -11050,7 +13031,7 @@ msgstr ""
"Questo file di sessione non conteneva metadati!\n"
"Forse è un vecchio formato di sessione?"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr "Importa tutto da:"
@@ -11197,214 +13178,235 @@ msgid "Destructive crossfade length"
msgstr "Dissolvenza distruttiva"
#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
msgid "Region fades active"
msgstr "Attiva dissolvenze della regione"
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr "Visualizza dissolvenze della regione"
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr "Media"
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr "Formato file audio"
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr "Formato campionamento"
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr "32-bit virgola mobile"
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr "24-bit intero"
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr "16-bit intero"
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr "Tipo file"
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr "Posizioni dei file"
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr "Cerca file audio in:"
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr "Cerca file MIDI in:"
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr "Nomi file"
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr "Denominazione file"
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr "Prefisso numeri di traccia"
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
"Aggiunge il numero di traccia attuale all'inizio del nome file della "
"registrazione."
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr "Prefisso nome della ripresa"
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr "Aggiunge il nome della ripresa all'inizio del nome file registrato"
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr "Nome ripresa"
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
"Il monitoraggio dell'ingresso traccia segue automaticamente lo stato del "
"trasporto (\"ingresso-automatico\")"
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr "Utilizza la sezione di monitoraggio in questa sessione"
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr "Mostra le tracce MIDI"
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr "Mostra i bus"
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr "Includi il bus principale"
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr "Pulsante di abilitazione registrazione"
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr "Pulsante per il muto"
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr "Pulsante del solo"
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr "Pulsanti monitoraggio"
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr "Etichette dei nomi"
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr "Nome traccia"
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr "Le copie delle regioni MIDI sono indipendenti"
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr ""
"Politiche di gestione delle note in soprapposizione sullo stesso canale MIDI"
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr "non consentire mai"
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr "non fare nulla in particolare"
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr "sostituisci ogni nota sovrapposta"
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr "accorcia le note in sovrapposizione esistenti"
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr "accorcia la nuova nota in sovrapposizione"
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr "sostituisci entrambe le note in sovrapposizione con una singola nota"
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr "Incolla a battiti e battute"
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr "Incolla i nuovi marcatori a battiti e battute"
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr "Incolla le nuove regioni a battiti e battute"
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr "Utilizza le impostazioni come default"
@@ -11440,26 +13442,14 @@ msgstr "<b>Info sul file audio</b>"
msgid "Timestamp:"
msgstr ""
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Formato:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr ""
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Editor: impossibile aprire il file %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr "<b>Informazioni del file MIDI</b>"
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Impossibile accedere al file audio"
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr ""
@@ -11468,181 +13458,177 @@ msgstr ""
msgid "Search"
msgstr "Cerca"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr "File audio e MIDI"
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr "File audio"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr "File MIDI"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr "Tutti i file"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr "Cerca nei file"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "Percorsi"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr ""
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "Ordina:"
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "Più lunga"
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "Più corta"
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "Più recente"
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "Meno recente"
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "Più scaricata"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "Scaricata per ultima"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr ""
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr ""
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr "Più"
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr "Simile"
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr "Nome file"
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "Durata"
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr "Grandezza"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr ""
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr "Licenza"
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "Cerca su freesound"
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
msgstr ""
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr ""
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "una traccia per file"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "una traccia per canale"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr ""
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "tutti i file in una traccia"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "Unisci i file"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "una regione per file"
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "una regione per canale"
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "tutti i file in una regione"
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -11650,104 +13636,104 @@ msgstr ""
"Uno o alcuni dei file selezionati\n"
"non possono essere utilizzati da %1"
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "Copia i file nella sessione"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr ""
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr ""
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "testina"
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "inizio sessione"
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr ""
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr ""
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr ""
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "Migliore"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "Buona"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "Veloce"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Velocissimo"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr "Percentuale"
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr ""
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr ""
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr ""
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "Velocità massima"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr ""
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr ""
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ""
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Fermato"
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11772,7 +13758,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "%1 si sta avviando..."
@@ -11788,17 +13774,17 @@ msgstr "Rimuovi altoparlante"
msgid "Azimuth:"
msgstr ""
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr ""
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11808,15 +13794,15 @@ msgid ""
"program.</span> "
msgstr ""
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "Benvenuti in %1"
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Cartella base per le sessioni %1"
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11834,11 +13820,11 @@ msgstr ""
"<i>(Potrete memorizzare le sessioni dove volete, questo è solo un valore "
"implicito)</i>"
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Cartella base per le nuove sessioni"
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11852,25 +13838,25 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "Scelte di controllo"
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "Utilizza un Master bus direttamente"
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
msgstr ""
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "Utilizza un bus Monitor aggiuntivo"
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -11878,7 +13864,7 @@ msgstr ""
"Usa un bus Monitor tra il bus Master e le uscite fisiche\n"
"per avere un controllo maggiore senza influire sul mixaggio."
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11886,46 +13872,42 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr "Sezione di controllo"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">battito"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">battuta"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ">EP"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr ""
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr ""
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr ""
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr "Imposta la durata della nota ad una nota"
@@ -12034,11 +14016,11 @@ msgstr ""
msgid "Insert a program change message"
msgstr ""
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr ""
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr ""
@@ -12050,240 +14032,244 @@ msgstr ""
msgid "Octave"
msgstr ""
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr ""
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr ""
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr ""
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr ""
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr ""
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr ""
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr ""
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr ""
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr ""
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr ""
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr ""
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr ""
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr ""
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr ""
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr ""
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr ""
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "Aumenta la durata della nota"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "Diminuisci la durata della nota"
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr ""
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr ""
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr ""
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr ""
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "Passa alla 1a ottava"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "Passa alla 2a ottava"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "Passa alla 3a ottava"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "Passa alla 4a ottava"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "Passa alla 5a ottava"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "Passa alla 6a ottava"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "Passa alla 7a ottava"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "Passa alla 8a ottava"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "Passa alla 9a ottava"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "Passa alla 10a ottava"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "Passa alla 11a ottava"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Attiva/disattiva le note terzinate"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr ""
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr ""
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr "Durata della nota a 1/3"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr "Durata della nota a 1/4"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr "Durata della nota a 1/8"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr "Durata della nota a 1/16"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr "Durata della nota a 1/32"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr "Durata della nota a 1/64"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr ""
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr ""
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr ""
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr ""
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr "Imposta la nota su <i>mf</i>"
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr "Imposta la nota su <i>f</i>"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr "Imposta la nota su <i>fff</i>"
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Attiva/disattiva le note terzinate"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr ""
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr "Attiva/disattiva note puntate"
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr ""
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr ""
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr ""
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr ""
@@ -12291,176 +14277,189 @@ msgstr ""
msgid "Strip Silence"
msgstr "Rimuovi silenzio"
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Soglia"
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr "Durata minima"
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr "Durata delle dissolvenza"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "battuta:"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "battito:"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr ""
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr ""
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr ""
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr ""
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr ""
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr ""
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr ""
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr ""
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr ""
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr ""
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Battiti al minuto"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr ""
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
msgstr ""
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr ""
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Battiti per battuta:"
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr ""
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
msgstr ""
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Tema scuro"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Tema luminoso"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Ripristina i valori base"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr ""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Colora le regioni utilizzando il colore della traccia di appartenenza"
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
-msgid "All floating windows are dialogs"
-msgstr ""
-
-#: theme_manager.cc:77
-msgid "Transient windows follow front window."
-msgstr ""
-
-#: theme_manager.cc:78
-msgid "Icon Set"
+#: theme_manager.cc:61
+msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "oggetto"
-
-#: theme_manager.cc:163
-msgid "Items"
+#: theme_manager.cc:62
+msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12468,92 +14467,95 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] ""
msgstr[1] ""
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Rapido ma inaccurato"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Salta l'Anti-aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Contenuti:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr ""
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr ""
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr ""
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr ""
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr ""
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "Ottave:"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "Semitoni:"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr ""
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr ""
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr ""
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr ""
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr ""
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Comincia a registrare al'inizio dell'auto-punch"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Ferma la registrazione alla fine dell'auto-punch"
@@ -12621,102 +14623,138 @@ msgstr "Trasponi MIDI"
msgid "Transpose"
msgstr "Trasponi"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr "Carico il file di configurazione base per %1"
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr "impossibile leggere il file di configurazione base \"%1\""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
"il file di configurazione base \"%1\" dell'interfaccia\n"
"utente non è stato caricato."
-#: ui_config.cc:177
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr ""
-#: ui_config.cc:222
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr ""
-#: ui_config.cc:227
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr ""
-#: ui_config.cc:317
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr "Carico il file di configurazione dell'interfaccia utente %1"
-#: ui_config.cc:320
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:325
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
"il file di configurazione \"%1\" dell'interfaccia utente non è stato "
"caricato."
-#: ui_config.cc:333
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
"non sono riuscito a trovare alcun file di configurazione, l'interfacca avrà "
"dei problemi."
-#: ui_config.cc:351
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr "Il file di configurazione %1 non è stato salvato."
-#: ui_config.cc:592
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr ""
-#: ui_config.cc:662
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
"Impossibilitato a trovare il file dello stile interfaccia utente %1 \n"
"nel percorso di ricerca %2. %3 sembra anomalo"
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr ""
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr "non riesco a trovare un file XPM per %1"
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr ""
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr ""
+#: utils.cc:818
+msgid "Overwrite"
+msgstr "Sovrascrivi"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr ""
@@ -12761,32 +14799,48 @@ msgstr ""
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12796,25 +14850,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12836,7 +14890,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12845,10 +14899,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12858,9 +14916,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12869,83 +14926,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12965,7 +15022,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12975,239 +15032,230 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
msgstr "Non posso creare la cartella del video \"%1\" (%2)"
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr "Esporta file video"
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr "Video:"
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr "Scala video (W x H):"
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr "Imposta il rapporto di aspetto:"
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr "Normalizza audio"
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr "Codifica a 2 passaggi"
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr "Ottimizzazione codec:"
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr "Deinterlaccia"
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr "<b>Uscita:</b> (l'estensione del file definisce il formato)"
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr "<b>Ingresso video:</b>"
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr "Audio:"
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr "Bus principale"
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr "<b>Impostazioni:</b>"
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr "Intervallo:"
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Preimpostazione:"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr "Codec video:"
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr "Video KBit/s:"
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr "Codec audio:"
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr "KBit/s audio:"
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr "Frequenza campionameto audio:"
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr "Seleziona intervallo"
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr ""
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr "Esportazione audio"
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr "Esportazione audio..."
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr "Codifica video..."
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr "Esporta video: non riesco a leggere il file video in ingresso."
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr "Codifica video... passaggio 1/2"
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr "Codifica video... passaggio 2/2"
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr "Transcodifica fallita."
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr ""
@@ -13225,13 +15273,482 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+#~ msgid ""
+#~ "%1%2\n"
+#~ "(built from revision %3)"
+#~ msgstr ""
+#~ "%1%2\n"
+#~ "(compilato dalla revisione %3)"
+
+#~ msgid "Busses"
+#~ msgstr "Busses"
+
+#~ msgid "Display model"
+#~ msgstr "Modello di visualizzazione"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Grafico composito per ogni traccia"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Grafico composito per tutte le tracce"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalizza i valori"
+
+#~ msgid "Locations"
+#~ msgstr "Posizioni"
+
+#~ msgid "Save as..."
+#~ msgstr "Salva come..."
+
+#~ msgid ""
+#~ "A snapshot already exists with that name. Do you want to overwrite it?"
+#~ msgstr "Esiste già un'istantanea con questo nome. Vuoi sovrascriverla?"
+
+#~ msgid "Could not disconnect from Audio/MIDI engine"
+#~ msgstr "Impossibile disconnettersi dal motore Audio/MIDI"
+
+#~ msgid "Could not reconnect to the Audio/MIDI engine"
+#~ msgstr "Impossibile riconnettersi al motore Audio/MIDI"
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4 Questa è una sessione di una versione precedente di %3%5\n"
+#~ "\n"
+#~ "%3 ha copiato il vecchio file di sessione\n"
+#~ "\n"
+#~ "%6%1%7 \n"
+#~ "\n"
+#~ "su\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "Da questo momento in poi utilizza la versione -2000 con vecchie versioni "
+#~ "di %3"
+
+#~ msgid "Playhead follows Range Selections and Edits"
+#~ msgstr "La testina segue le selezioni di intervalli e gli edit"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Quando è attivo, qualcosa è in ascolto\n"
+#~ "Clicca per ripristinare."
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr ""
+#~ "Questo schermo non è sufficentemente alto per mostrare la finestra del "
+#~ "mixer"
+
+#~ msgid "Open Video"
+#~ msgstr "Apri video"
+
+#~ msgid "Export To Video File"
+#~ msgstr "Esporta in un file video"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Istantanea..."
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Esporta la sessione come file audio..."
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Mostra le barre degli strumenti"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "Attiva/disattiva Editor+Mixer"
+
+#~ msgid "Reattach All Tearoffs"
+#~ msgstr "Ricongiungi tutti gli strappi"
+
+#~ msgid "Reference"
+#~ msgstr "Riferimenti"
+
+#~ msgid "Report A Bug"
+#~ msgstr "Segnala un bug"
+
+#~ msgid "How to report a bug"
+#~ msgstr "Come segnalare un bug"
+
+#~ msgid "Set From Playhead"
+#~ msgstr "Imposta dalla testina"
+
+#~ msgid "Set to %1 beat(s)"
+#~ msgstr "Imposta a %1 battito/i"
+
+#~ msgid "Fill Range with Region"
+#~ msgstr "Riempi intervallo con la regione"
+
+#~ msgid "Consolidate Range With Processing"
+#~ msgstr "Consolida l'intervallo processando i dati"
+
+#~ msgid "Bounce Range to Region List With Processing"
+#~ msgstr "Fissa l'intervallo nella lista regioni elaborandolo"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Suona dal punto di modifica"
+
+#~ msgid "Play From Start"
+#~ msgstr "Riproduci dall'inizio"
+
+#~ msgid "Smart Mode (add Range functions to Grab mode)"
+#~ msgstr ""
+#~ "Modalità intelligente (aggiunge le funzioni di intervallo alla modalità "
+#~ "di aggancio)"
+
+#~ msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#~ msgstr ""
+#~ "Modalità di modifica interna (modifica le note e le curve di guadagno "
+#~ "all'interno delle regioni)"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoom"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Interrompi il trascinamento o deseleziona tutto"
+
+#~ msgid "Playhead To Next Grid"
+#~ msgstr "Testina alla prossima griglia"
+
+#~ msgid "Playhead To Previous Grid"
+#~ msgstr "Testina alla griglia precedente"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importa da una sessione"
+
+#~ msgid "Show Logo"
+#~ msgstr "Mostra il logo"
+
+#~ msgid "Snap Position To Grid"
+#~ msgstr "Allinea la posizione alla griglia"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Inserisci regione dal catalogo delle regioni"
+
+#~ msgid "group|G"
+#~ msgstr "gruppo|G"
+
+#~ msgid "relative|Rel"
+#~ msgstr "relativo|Rel"
+
+#~ msgid "mute|M"
+#~ msgstr "muto|M"
+
+#~ msgid "solo|S"
+#~ msgstr "solo|S"
+
+#~ msgid "monitoring|Mon"
+#~ msgstr "monitoraggio|Mon"
+
+#~ msgid "selection|Sel"
+#~ msgstr "selezione|Sel"
+
+#~ msgid "active|A"
+#~ msgstr "attivo|A"
+
+#~ msgid "File Exists!"
+#~ msgstr "Il file esiste!"
+
+#~ msgid "Overwrite Existing File"
+#~ msgstr "Sovrascrivo file esistente"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplica selezione"
+
+#~ msgid "tracks"
+#~ msgstr "Tracce"
+
+#~ msgid "busses"
+#~ msgstr "Bus"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "G"
+#~ msgstr "G"
+
+#~ msgid "O"
+#~ msgstr "O"
+
+#~ msgid "I"
+#~ msgstr "I"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "SI"
+#~ msgstr "SI"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Mostra le tracce che hanno regioni sotto la testina"
+
+#~ msgid ""
+#~ "The %1 audio backend was configured and started externally.\n"
+#~ "This limits your control over it."
+#~ msgstr ""
+#~ "Il finale audio di %1 è stato configurato ed avviato dall'esterno.\n"
+#~ "Questo limita il tuo controllo su di esso."
+
+#~ msgid "Inactive"
+#~ msgstr "Inattivo"
+
+#~ msgid "Export region contents"
+#~ msgstr "Esporta i contenuti della regione"
+
+#~ msgid "Export track output"
+#~ msgstr "Esporta la traccia"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>Preparo il/i nome/i a partire da queste componenti:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>Nome file (approssimativo): \"%1\"</i></small>"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "Comando per lanciare la post esportazione\n"
+#~ "(%f=percorso completo & nome del file, %d=directory, %b=nome senza "
+#~ "estensione):"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Crea nuovo gruppo da"
+
+#~ msgid "Insert time on all the track's playlists"
+#~ msgstr "Inserisci il tempo su tutte le tracce della scaletta"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Selezion un'azione, poi premi il tasto(i) per ripristinare o impostare la "
+#~ "relativa scorciatoia"
+
+#~ msgid "Main_menu"
+#~ msgstr "Menù_principale"
+
+#~ msgid "Copyright (C) 1999-2012 Paul Davis"
+#~ msgstr "Tutti i diritti (C) 1999-2012 Paul Davis"
+
+#~ msgid "Program "
+#~ msgstr "Programma"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Commenti*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Cmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Clicca per aggiungere/modificare commenti"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID del controllo remoto..."
+
+#~ msgid "Pr"
+#~ msgstr "Pr"
+
+#~ msgid "Po"
+#~ msgstr "Po"
+
+#~ msgid "C"
+#~ msgstr "C"
+
+#~ msgid "K20"
+#~ msgstr "K20"
+
+#~ msgid "K14"
+#~ msgstr "K14"
+
+#~ msgid "K12"
+#~ msgstr "K12"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Aggiorna i plugin disponibili"
+
+#~ msgid "alsa_pcm"
+#~ msgstr "alsa_pcm"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Non è possibile aggiungere una porta qui perché il primo processore nella "
+#~ "traccia o bus non supporta la nuova configurazione."
+
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "Questa porta non può essere rimossa.\n"
+#~ "O il primo plugin nella traccia o bus non può accettare \n"
+#~ "i nuovi ingressi o l'ultimo plugin ha più uscite."
+
+#~ msgid ""
+#~ "<b>%1</b>\n"
+#~ "Double-click to show GUI.\n"
+#~ "Alt+double-click to show generic GUI.%2"
+#~ msgstr ""
+#~ "<b>%1</b>\n"
+#~ "Doppio click per mostrare la GUI.\n"
+#~ "Alt+doppio-clic per mostrare la GUI generica.%2"
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Disposizione della tastiera:"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Scala del carattere"
+
+#~ msgid ""
+#~ "Major font-scale changes require an application restart to re-layout."
+#~ msgstr ""
+#~ "I cambiamenti principali nell scala del fonto richiedono il riavvio "
+#~ "dell'applicazione."
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr ""
+#~ "Doppio click su un nome per modificare le impostazioni di un protocollo "
+#~ "abilitato"
+
+#~ msgid "Clear VST Cache"
+#~ msgstr "Pulisci la cache VST"
+
+#~ msgid "Clear VST Blacklist"
+#~ msgstr "Pulisci la lista nera VST"
+
+#~ msgid "Clear AU Cache"
+#~ msgstr "Pulisci la cache AU"
+
+#~ msgid "Clear AU Blacklist"
+#~ msgstr "Pulisci la lista nera AU"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Mostra la barra dello zoom"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / mute"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "ID della piattaforma di controllo"
+
+#~ msgid "assigned by user"
+#~ msgstr "assegnato dall'utente"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "segue l'ordine del mixer"
+
+#~ msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#~ msgstr "moderato [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+
+#~ msgid "medium [20dB/sec]"
+#~ msgstr "medio [20dB/sec]"
+
+#~ msgid "fast [32dB/sec]"
+#~ msgstr "veloce [32dB/sec]"
+
+#~ msgid "faster [46dB/sec]"
+#~ msgstr "più veloce [46dB/sec]"
+
+#~ msgid "fastest [70dB/sec]"
+#~ msgstr "massima velocità [70dB/sec]"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Non si può creare una traccia con questo nome perché è riservato per %1"
+
+#~ msgid "Select From All..."
+#~ msgstr "Seleziona tutto da..."
+
+#~ msgid ""
+#~ "Do you really want to remove track \"%1\" ?\n"
+#~ "\n"
+#~ "You may also lose the playlist used by this track.\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Si vuole veramente rimuovere la traccia \"%1\" ?\n"
+#~ "\n"
+#~ "Perderete anche la playlist associata a questa traccia.\n"
+#~ "\n"
+#~ "(questa azione non potrà essere annullata ed il file di sessione verrà "
+#~ "sovrascritto)"
+
+#~ msgid ""
+#~ "Do you really want to remove bus \"%1\" ?\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Si vuole veramente rimuovere il bus \"%1\" ?\n"
+#~ "\n"
+#~ "(questa azione non potrà essere annullata ed il file di sessione verrà "
+#~ "sovrascritto)"
+
+#~ msgid "Remove track"
+#~ msgstr "Rimuovi traccia"
+
+#~ msgid "Remove bus"
+#~ msgstr "Rimuovi bus"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID del controllo remoto"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID del controllo remoto:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "L'ID del controllo remoto di %1 è: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "L'ID del controllo remoto di %3 non può essere modificato."
+
+#~ msgid "Disk Format"
+#~ msgstr "Formato disco"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bit float"
+
+#~ msgid "24 bit"
+#~ msgstr "24 bit"
+
+#~ msgid "16 bit"
+#~ msgstr "16 bit"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Tema scuro"
+
+#~ msgid "Light Theme"
+#~ msgstr "Tema luminoso"
+
+#~ msgid "Contents:"
+#~ msgstr "Contenuti:"
+
#~ msgid "Editor Selection"
#~ msgstr "Selezione editor"
diff --git a/gtk2_ardour/po/nn.mo b/gtk2_ardour/po/nn.mo
new file mode 100644
index 0000000..65a0831
Binary files /dev/null and b/gtk2_ardour/po/nn.mo differ
diff --git a/gtk2_ardour/po/nn.po b/gtk2_ardour/po/nn.po
index 52ae6eb..72b4856 100644
--- a/gtk2_ardour/po/nn.po
+++ b/gtk2_ardour/po/nn.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk2_ardour 3.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2013-01-05 14:48+0100\n"
"Last-Translator: Eivind ÃdegÃ¥rd <meinmycell-lists at yahoo.no>\n"
"Language-Team: <i18n-nn at lister.ping.uio.no>\n"
-"Language: \n"
+"Language: Norwegian Nynorsk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -19,255 +19,287 @@ msgstr ""
"X-Poedit-Country: NORWAY\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr "Hans Baier"
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr "Sakari Bergen"
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr "Chris Cannam"
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr "André Colomb"
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr "Dave Flick"
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr "Robin Gareus"
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr "Chris Goddard"
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr "J. Abelardo Gutierrez"
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr "David Halter"
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr "Melvin Ray Herr"
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr "Carl Hetherington"
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr "Rob Holland"
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr "Robert Jordens"
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr "Stefan Kersten"
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr "Armand Klenk"
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr "Matt Krai"
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr "Nick Lanham"
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr "Colin Law"
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr "Joshua Leach"
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr "Ben Loftis"
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr "Nick Mainsbridge"
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr "Tim Mayberry"
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr "Doug Mclain"
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr "Jack O'Quin"
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr "Nimal Ratnayake"
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr "David Robillard"
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr "Taybin Rutkin"
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr "Andreas Ruge"
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr "Sampo Savolainen"
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr "Rodrigo Severo"
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr "Per Sigmond"
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr "Lincoln Spiteri"
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr "Mike Start"
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr "Mark Stewart"
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr "Roland Stigge"
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr "Petter Sundlöf"
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr "Mike Täht"
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr "Roy Vegard"
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -281,7 +313,7 @@ msgstr ""
"\tMartin Blanchard\n"
"\tRomain Arnaud <roming22 at gmail.com>\n"
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -293,7 +325,7 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -303,7 +335,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -311,7 +343,7 @@ msgstr ""
"Portugisisk:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -321,7 +353,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -331,7 +363,7 @@ msgstr ""
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -341,7 +373,7 @@ msgstr ""
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -349,7 +381,7 @@ msgstr ""
"Gresk:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -357,7 +389,7 @@ msgstr ""
"Svensk:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -365,7 +397,7 @@ msgstr ""
"Polsk:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -373,7 +405,7 @@ msgstr ""
"Tsjekkisk:\n"
"\t Pavel Frich <pavelfric at seznam.cz>\n"
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
@@ -381,7 +413,7 @@ msgstr ""
"Norsk:\n"
"\t Eivind ÃdegÃ¥rd <post at frilyd.tk>\n"
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -389,140 +421,194 @@ msgstr ""
"Kinesisk:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr "http://ardour.org/"
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr "Oppsett"
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr "Lastar menyar frå %1"
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr ""
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr "Fann ikkje menydefinisjonsfila til %1"
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Legg til spor eller buss"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "Innstillingar:"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr ""
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "Instrument:"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "Lydspor"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "MIDI-spor"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "Lyd+MIDI-spor"
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Bussar"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
msgstr ""
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "Legg til:"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>Val</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "Namn:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "Gruppe:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr ""
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "Lyd"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr "Lyd+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "Buss"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -536,60 +622,61 @@ msgstr ""
"Viss du ikkje planlegg å bruka slike utvidingar, bør du bruka eit vanleg "
"lyd- eller MIDI-spor i staden."
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Normal"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "Ikkje lagdelt"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Band"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Mono"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "Stereo"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 kanalar"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 kanalar"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "5 kanalar"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 kanalar"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 kanalar"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "12 kanalar"
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr "Eigen"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "Ny gruppe..."
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr "Inga gruppe"
@@ -597,13 +684,13 @@ msgstr "Inga gruppe"
msgid "Ambiguous File"
msgstr "Tvitydig fil"
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
@@ -613,164 +700,202 @@ msgstr ""
"\n"
"Vel kva stig du vil henta fila frå."
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr "Ferdig"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "Signalkjelde"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Valde område"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Valde bolkar"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Visingsmodell"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Samansette grafar for kvart spor"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Samansett graf for alle spor"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Vis frekvensstyrkeområde"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normaliser verdiar"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "FFT-analyserute"
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr "Spektrumanalyse"
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Spor"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "Vis"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Analyser data på nytt"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "knappen kan ikkje overvaka status for ikkje-eksisterande kontroll\n"
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Lytt"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Solo"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "Tilbakeføring"
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Høgtalaroppsett"
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Snøggtastar"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Innstillingar"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr ""
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "Om"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Stader"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "Spor og bussar"
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr ""
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr ""
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "Eigenskapar"
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "Bundelordnar"
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Stor klokke"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr ""
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Vindauga|miksar"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -778,45 +903,45 @@ msgid ""
"the audio backend and save the session."
msgstr ""
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr ""
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -827,39 +952,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr ""
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 er klar til bruk"
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -873,23 +998,23 @@ msgstr ""
"Du kan finna ut kva minnegrensa er med 'ulimit -l'. Minnegrensa er vanlegvis "
"kontrollert av %2"
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "Ikkje vis denne ruta att"
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "Ikkje avslutt"
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr "Berre avslutt"
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "Lagra og avslutt"
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -903,11 +1028,11 @@ msgstr ""
"\n"
"\"Berre avslutt\"-alternativet."
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr "Ulagra økt"
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -925,7 +1050,7 @@ msgstr ""
"\n"
"Kva vil du gjera?"
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -943,74 +1068,107 @@ msgstr ""
"\n"
"Kva vil du gjera?"
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Spørsmål"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr ""
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "Fil:"
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr "32-flyt"
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr "24-heiltal"
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr "16-heiltal"
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1021,87 +1179,88 @@ msgstr ""
"%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
"%<PRIu32>%%</span>"
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Disk: <span foreground=\"green\">Ukjent</span>"
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Disk: <span foreground=\"green\">24t+</span>"
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "Disk: <span foreground=\"green\">>24t</span>"
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Disk: <span foreground=\"%s\">%02dt:%02dm:%02ds</span>"
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "Tidskode|TC: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Siste øktene"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Opna økt"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "%1 økter"
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr ""
"Du kan ikkje leggja til eit spor eller ein buss når du ikkje har ei økt "
"innlasta."
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "greidde ikkje laga %1 nye miksa spor"
msgstr[1] "ugreidde ikkje laga %1 nye miksa spor"
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
"Du kan ikkje leggja til eit spor eller ein buss når du ikkje har ei økt "
"innlasta."
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "greidde ikkje laga nytt lydspor"
msgstr[1] "greidde ikkje laga %1 nye lydspor"
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "greidde ikkje laga ny lydbuss"
msgstr[1] "greidde ikkje laga %1 nye lydbussar"
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1109,23 +1268,20 @@ msgstr ""
"Lag eitt eller fleire spor før du prøver å ta opp.\n"
"Du kan gjera det med «Legg til spor eller buss» i økt-menyen."
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
msgstr ""
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nytt øktnamn"
-
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Ta snøggbilete"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Namn på det nye snøggbiletet"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1133,23 +1289,35 @@ msgstr ""
"For å tryggja kompatibiliteten med ymse system,\n"
"kan ikkje namn på snøggbilete innehalda teiknet '%1'"
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "Stadfest at du vil skriva over snøggbilete"
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
-msgstr "Dette snøggbiletet finst frå før. Vil du skriva over det?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Skriv over"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nytt øktnamn"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Ta snøggbilete"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Namn på det nye snøggbiletet"
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "Døyp om økt"
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1157,12 +1325,12 @@ msgstr ""
"For å tryggja kompatibiliteten med ymse system,\n"
"kan ikkje namn på økter innehalda teiknet '%1'"
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr "Dette namnet er alt i bruk på ei anna mappe. Prøv på nytt."
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1170,19 +1338,27 @@ msgstr ""
"Fekk ikkje til å døypa om denne økta.\n"
"Her kan det vera noko skikkeleg rot."
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr "Lagra mal"
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "Namn på malen:"
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-mal"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1192,59 +1368,89 @@ msgstr ""
"%1,\n"
"finst frå før. Vil du opna henne?"
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "Opna økt"
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "Det finst inga økt i \"%1\""
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "Vent medan %1 lastar økta di"
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "Feil ved portregistrering"
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr "Klikk på Lukk for å prøva att."
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Ãkta \"%1 (snøggbilete %2)\" vart ikkje lasta"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "Feil ved lasting"
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Ãkta \"%1 (snøggbilete %2)\" vart ikkje lasta"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "Greidde ikkje laga økt i \"%1\""
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "Ingen filer var klare for rydding"
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "Opprydding"
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1256,19 +1462,19 @@ msgstr ""
"Det kan hende dei inneheld bolkar\n"
"som treng ubrukte lydfiler for å eksistera."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "kilo"
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "mega"
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "giga"
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1278,7 +1484,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1300,11 +1506,11 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "Er du sikker på at du vil rydda opp?"
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1314,79 +1520,115 @@ msgstr ""
"ALL angra- og gjer om-informasjon blir sletta om du ryddar.\n"
"Etter opprydding blir alle ubrukte lydfiler flytte til ei \"daudlyd\"-mappe."
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Ryddedialog"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr "Rydda filer"
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "sletta fil"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr ""
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr ""
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr ""
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr ""
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr ""
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr ""
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "greidde ikkje opna %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr ""
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr "Opptaket stoppa fordi datamaskina di ikkje greidde å henga med."
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1400,23 +1642,23 @@ msgstr ""
"Det tyder at harddisksystemet ditt ikkje\n"
"greidde lagra raskt nok til å ta opp.\n"
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr ""
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr ""
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1430,11 +1672,11 @@ msgstr ""
"Det tyder at harddisksystemet ditt ikkje\n"
"greidde lesa raskt nok til å spela av.\n"
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "Gjenoppretting etter krasj"
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1445,19 +1687,19 @@ msgid ""
"what you would like to do.\n"
msgstr ""
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Sjå bort frå krasjdata"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Hent fram att etter krasj"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "Punktfrekvensen passar ikkje"
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1467,23 +1709,24 @@ msgstr ""
"%2 køyrer på %3 Hz nett no. Viss du lastar denne økta,\n"
"kan det henda lyden blir spelt med feil punktfrekvens.\n"
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "Ikkje last økta"
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "Last økta likevel"
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1495,73 +1738,98 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Grensesnitt: Greier ikkje setja opp redigeringa"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Grensesnitt: Greier ikkje setja opp miksaren"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Spel frå spelehovudet"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Stopp avspelinga"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "Skru på/av opptak"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Spel område/utval"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Gå til starten av økta"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Gå til slutten av økta"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Spel lykkje-området"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
msgstr ""
"MIDI-panikknSend note av og nullstill kontrollmeldingar på alle MIDI-kanalar"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "GÃ¥ til der du sist byrja avspeling"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "Spelehovudet fylgjer områdeval og redigeringar"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Fornuftig inngangslytting"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Slå på/av lydklikk"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1569,19 +1837,17 @@ msgstr ""
"NÃ¥r knappen er trykt inn, er noko i solo.\n"
"Klikk for å slå av solo på alt."
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-"Når knappen er trykt inn, blir noko lytta på.\n"
-"Klikk for å slå av lyttinga."
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr "Når denne er på, er det ei rundgangssløyfe."
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1589,7 +1855,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1597,450 +1863,559 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[FEIL]:"
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[Ã
TVARING]:"
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[INFO]:"
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Autoretur"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "Fylg endringar"
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr "Brukarflate"
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "Ymse"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Set opp redigeringa"
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Set opp miksaren"
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Oppdater øktliste"
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Grensesnitt: Greier ikkje setja opp redigeringa"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Grensesnitt: Greier ikkje setja opp miksaren"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Innstillingar"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Redigering"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr "Ikkje lukk"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "Berre lukk"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "Lagra og lukk"
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "Denne skjermen er ikkje høg nok til å visa miksarvindauga"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr ""
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Ãkt"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Synk"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Val"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Vindauge"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Hjelp"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Ymse snarvegar"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Lydfilformat"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Filtype"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Punktformat"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Kontrollflater"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Utvidingar"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "Nivåmåling"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "Slepprate"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Haldetid"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "Handtering av unormale hendingar"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "Ny..."
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "Opna..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Siste..."
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Lukk"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "Legg til spor eller buss..."
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr ""
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Snøggbilete..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "Lagra som..."
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr "Døyp om..."
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Lagra mal..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "Metadata"
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "Endra metadata..."
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "Importer metadata..."
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Eksporter økta til lydfil(er)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "Staveksport..."
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "Eksporter"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "Rydd bort ubrukte kjelder..."
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "Tøm søppelkorga"
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Avslutt"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Gøym"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Gje redigeringa mest plass"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr ""
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Vis verktylinene"
-
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
msgstr ""
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Vindauga|miksar"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
-msgid "Window|Meterbridge"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
+msgid "Window|Meterbridge"
msgstr ""
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "MIDI-sporar"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "Prat"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "Hjelp|Rettleiing"
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Referanse"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr ""
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr ""
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr ""
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Lagre"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Speling"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Stopp"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "Rull"
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Start/stopp"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "Start/hald fram/stopp"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "Stopp og gløym opptaket"
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Overgang til rulling"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Overgang til baklengs"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Spel lykkje-området"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr ""
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "Spel utvalet m/førrull"
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Skru på opptak"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "Start opptak"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "Spol bakover"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "Spol sakte bakover"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "Spol fort bakover"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "Framover"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "Spol sakte framover"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "Spol fort framover"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "GÃ¥ til null"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "GÃ¥ til starten"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "GÃ¥ til slutten"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr "GÃ¥ til Veggur"
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "Fokuser på klokka"
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2048,125 +2423,137 @@ msgstr "Fokuser på klokka"
msgid "Timecode"
msgstr "Tidskode"
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Takter og taktslag"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minutt og sekund"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Punktprøver"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "Slå inn"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "Inn"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "Slå ut"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "Ut"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "Slå inn og ut"
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "Inn/ut"
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Klikk"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "Autoinngang"
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Autospel"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "Synk oppstart til video"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "Hovudklokke"
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr "Skru på/av opptak for spor %1"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Prosent"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Halvtonar"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Send MTC (Midi Time Code)"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Send MMC (Midi Machine Control)"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Bruk MMC (Midi Machine Control)"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "Send MIDI-klokke"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr "Send MIDI-svar"
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Panikk"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr "Veggur"
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr "Diskplass"
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr "Bufrar"
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr "Tidskodeformat"
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr "Filformat"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2174,133 +2561,138 @@ msgstr ""
"Du kan ikkje bruka JACK som synkkjelde\n"
"når ned- og opptrekk-instillinga ikkje er null."
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "Intern"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "Skru på/av ekstern posisjonssynk"
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr "Ikkje mogleg å synka til JACK: opp- og nedtrekk for video er fastsett"
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "--ventar--"
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr "SR"
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "Dra"
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Tempo"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Taktart"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "Programmeringsfeil: %1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "programmeringsfeil: %1 %2"
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "Takter:Taktslag"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "Minutt:sekund"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "Set ut frå spelehovudet"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr "GÃ¥ hit"
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr "dB"
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "Bolkvolum:"
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr "duFS"
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "Toppvolum:"
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "Reknar..."
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "legg til volumkontrollpunkt"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr ""
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "flytt automasjonspunkt"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "flytt automasjonsområde"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "fjern kontrollpunkt"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "Ser bort frå ulovlege punkt på Automasjonslinja \"%1\""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "legg til ei automasjonshending"
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2312,63 +2704,59 @@ msgstr "automasjonstilstand"
msgid "hide track"
msgstr "gøym spor"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr "Automasjon|Manuell"
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Spel"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Skriv"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Rør"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "tøm automasjon"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Gøym"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "Tøm"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Tilstand"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr "Diskret"
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Rettlinja"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Modus"
@@ -2384,35 +2772,38 @@ msgstr "Endra bundelen"
msgid "Direction:"
msgstr "Retning:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "Inngang"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "Utgang"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Rediger"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "Slett"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Namn"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Ny"
@@ -2428,6 +2819,39 @@ msgstr "Legg til kanal"
msgid "Rename Channel"
msgstr "Døyp om kanalen"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Nullstill til standard"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objekt"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Farge"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr "Byggjeoppsett"
@@ -2440,9 +2864,45 @@ msgstr "Kontrollpunkt"
msgid "Value"
msgstr "Verdi"
-#: edit_note_dialog.cc:42
-msgid "Note"
-msgstr "Note"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
+#: edit_note_dialog.cc:42
+msgid "Note"
+msgstr "Note"
#: edit_note_dialog.cc:45
msgid "Set selected notes to this channel"
@@ -2477,591 +2937,597 @@ msgstr "Tonehøgd"
msgid "Velocity"
msgstr "Fart"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "Tid"
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr "Lengd"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "endra noten"
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "CD-rammer"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Sekund"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minutt"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "Slag/128"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "Slag/64"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Slag/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "Slag/28"
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "Slag/24"
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "Slag/20"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Slag/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "Slag/14"
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "Slag/12"
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "Slag/10"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Slag/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "Slag/7"
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "Slag/6"
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "Slag/5"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Slag/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Slag/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Slag/2"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Slag"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Takter"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Merke"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "Bolk-startar"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Bolk-endar"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "Bolk-synkar"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Bolkgrenser"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "Ikkje vis rutenett"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Rutenett"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnetisk"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Spelehovudet"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Markør"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Mus"
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Gli"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Spleis"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "LÃ¥s"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Venstre"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Høgre"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Midten"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr "Redigeringspunkt"
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr "Grumsut"
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr "Jamn"
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "Balansert fleirklangblanding"
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "Jamne perkusjonsnotar utan tonehøgd"
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "Skarp instrumental i mono"
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "Jamne perkusjonsnotar utan tonehøgd"
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "Omkod punktfrekvens utan å halda på tonehøgd"
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Min:Sek"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Stadmarkørar"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Områdemarkørar"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Lykkje-/innslagsområde"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "CD-markørar"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "modus"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "Markørar"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Bolkar"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "Spor og bussar"
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "Snøggbilete"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "Spor- og bussgrupper"
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "Område og merke"
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Redigering"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Spel i lykkje"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Slå inn/ut"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr "Lineært (for særs nivårett materiale)"
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr ""
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "Symmetrisk"
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Sakte"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Fort"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "Slå av"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "Slå på"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Frys"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "U-frys"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr "Valde bolkar"
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr "Spel området"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "Spel området i lykkje"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "Zoom til området"
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "Flytt områdestarten til førre bolkgrense"
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "Flytt områdestarten til neste bolkgrense"
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "Flytt områdeslutten til førre bolkgrense"
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "Flytt områdeslutten til neste bolkgrense"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "Skil"
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr "Gjer om til bolk i bolklista"
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Vel alt innan området"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr ""
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr ""
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Legg til områdemarkørar"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr "Skjer bolken til området"
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Fyll området med bolken"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Klon området"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr "Sikra området"
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "Sikra området med prosessering"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
+msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr "Miks ned området til bolkliste"
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "Miks ned området til bolkliste med prosessering"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr "Eksporter området..."
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Spel frå redigeringspunktet"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Spel frå starten"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr "Spel bolken"
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "Spel bolken i lykkje"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr "Vel heile sporet"
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr ""
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr "Omvend valet i sporet"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr "Omvend utvalet"
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "Gjer lykkje-området til eige område"
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "Gjer innslagsområdet til eige område"
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Vel alt etter redigeringspunktet"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Vel alt før redigeringspunktet"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "Vel alt etter spelehovudet"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "Vel alt før spelehovudet"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr "Vel alt mellom spelehovudet og redigeringspunktet"
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr "Vel alt innanfor spelehovudet og redigeringspunktet"
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr "Vel område mellom spelehovudet og redigeringspunktet"
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Vel"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "Klypp ut"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "Kopier"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "Lim inn"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Juster"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Juster relativt"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "Set inn den valde bolken"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr "Set inn eksisterande media"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr "Skubb heile sporet seinare"
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr "Skubb sporet etter redigeringspunktet seinare"
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr "Skubb heile sporet tidlegare"
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr "Skubb sporet etter redigeringspunktet tidlegare"
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "Skubb"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "Alt"
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr ""
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr ""
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr ""
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr ""
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr ""
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3069,59 +3535,63 @@ msgstr ""
"Grupper: klikk for å skru av/på\n"
"Kontekst-klikk for andre handlingar"
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr "Skubb bolken/markeringa seinare"
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr "Skubb bolken/markeringa tidlegare"
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "Zoom inn"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Zoom ut"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Zoom til heile økta"
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
msgstr "Zoom-fokus"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr "Utvid spor"
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr "Krymp spor"
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr ""
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr "Feste- og rutenetteiningar"
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "Feste- og rutenettmodus"
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Redigeringspunkt"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Endringsmodus"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3129,124 +3599,124 @@ msgstr ""
"Skubbeklokke\n"
"(kontrollerer avstanden som blir brukt til å skubba område og utval)"
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr "Kommando|Angra"
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr "Kommando|Angra (%1)"
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Gjer omatt"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Gjer omatt (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Klon"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr "Kor mange klonar:"
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "Utval"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr ""
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr ""
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr ""
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr ""
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr ""
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr ""
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr ""
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr ""
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr ""
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr ""
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr ""
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr ""
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr ""
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr ""
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr ""
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr ""
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr ""
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr ""
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr ""
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr ""
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr "Slett spelelister"
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3256,1288 +3726,1373 @@ msgstr ""
"Om du let henne vera, blir ingen lydfiler derifrå rydda bort.\n"
"Om du slettar henne, vil alle lydfiler derifrå bli rydda bort."
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr "Slett speleliste"
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr "Ha speleliste"
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "Avbryt"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "nye spelelister"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "kopier spelelister"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "tøm spelelister"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr "Vent medan %1 lastar visuelle data"
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr "Endra..."
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Transponer..."
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr "Gitterfordel..."
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr ""
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr ""
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Automatisk tilkopling"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "Krysstoningar"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "Flytt den valde markøren"
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "Vel områdehandlingar"
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "Vel bolkar"
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Redigeringspunkt"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Ton ut"
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr "Lask"
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "Bolk"
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Lag"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Posisjon"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Skjer til"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "Innvolum"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Område"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "Toningar"
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr "Lenkje"
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoom-fokus"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "Gå til markørar"
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Slepp nivåtoppar"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Hald nivåtoppar"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "MIDI-oppsett"
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Ymse val"
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Lytting"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "Aktivt merke"
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Primærklokke"
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "Dra opp/dra ned"
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Bolkhandlingar"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Linjalar"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr "Visingar"
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "Rull"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Sekundærklokke"
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "Underruter"
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "Tidskode-RPS"
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Høgd"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Verktøy"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "Vis"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "Zoom"
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Bryt og dra eller vel ingen"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Vis redigeringsmiksar"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "Vis redigeringslista"
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Spelehovudet til neste bolkgrense"
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr "Spelehovudet til neste bolkgrense (ikkje vel spor)"
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Spelehovudet til førre bolkgrense"
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr "Spelehovudet til førre bolkgrense (ikkje vel spor)"
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Spelehovudet til neste bolkstart"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Spelehovudet til neste bolk"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Spelehovudet til neste bolksynk"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Spelehovudet til førre bolkstart"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Spelehovudet til førre bolkslutt"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Spelehovudet til førre bolksynk"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "Til neste bolkgrense"
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "Til neste bolkgrense (ikkje vel spor)"
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "Til førre bolkgrense"
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "til førre bolkgrense (ingen valde spor)"
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "Til neste bolkstart"
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "Til neste bolkslutt"
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "Til neste bolksynk"
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "Til førre bolkstart"
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "Til førre bolkslutt"
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "Til førre bolksynk"
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "Til starten på området"
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "Til slutten av området"
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Spelehovudet til starten på området"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Spelehovudet til slutten av området"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr ""
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "Fjern markering"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "Vel alt som overlappar redigeringsområdet"
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "Vel alt i redigeringsområdet"
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "Vel redigeringsområdet"
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Vel alt i innslagsområdet"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Vel alt i lykkje-området"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "Vel neste spor eller buss"
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "Vel førre spor eller buss"
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "Skru på/av opptak"
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr "Solo av/på"
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "Demping av/på"
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "Isolert solo av/på"
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "Lagra vising %1"
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "GÃ¥ til vising %1"
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "GÃ¥ til merke %1"
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "Hopp til neste merke"
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "Hopp til førre merke"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "Legg til merke ved spelehovudet"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr ""
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr "Skubb neste seinare"
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr "Skubb neste tidlegare"
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "Skubb spelehovudet framover"
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "Skubb spelehovudet bakover"
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "Spelehovudet til neste gitter"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "Spelehovudet til førre gitter"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr ""
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "Endre zoom-tilstand"
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "Utvid sporhøgd"
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "Krymp sporhøgd"
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "Flytt dei valde spora opp"
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "Flytt dei valde spora"
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "Rull spor opp"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "Rull spor ned"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "GÃ¥ spor opp"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "GÃ¥ spor ned"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "Rull bakover"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "Rull framover"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Spelehovudet i midten"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Midtstill redigeringspunktet"
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Spelehovudet framover"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Spelehovudet bakover"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "Spelehovudet til det aktive merket"
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "Aktivt merke til spelehovudet"
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "Spel dei valde bolkane"
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "Spel frå redigeringspunktet og gå attende"
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "Spel redigeringsområdet"
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Spelehovudet til musa"
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Aktiv markør til musa"
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr ""
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr ""
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "Eksporter lyd"
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Eksporter området"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "Gjer innslagsområdet til eige område"
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "Gjer lykkje-området til eige område"
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "Skjer til"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr ""
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr "Set tempoet ut frå at redigeringsområdet = ei takt"
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr "Logg"
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr ""
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Start området"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "Lag slutt på området"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Fylg spelehovudet"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Fjern siste opptaket "
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "Fast spelehovud"
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Set inn tid"
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "Slå av/på"
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Fjern"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr ""
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "Størst"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "Større"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Stor"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "Liten"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr "Lytt på dei valde MIDI-notane"
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Zoomfokus: venstre"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Zoomfokus: høgre"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Zoomfokus: midten"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Zoomfokus: spelehovudet"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Fokus følgjer musa"
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Zoomfokus på redigeringspunktet"
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr "Neste zoom-fokus"
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "Smart objektmodus"
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr "Smart"
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Objektverkty"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Områdeverkty"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "Noteteikningsverkty"
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "Lytteverkty"
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "Tidseffektverkty"
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr ""
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr "Stegmusemodus"
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "Endra redigeringspunkt"
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "Endra redigeringspunktet, med markør"
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr ""
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "Fest til"
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Festemodus"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "Neste festemodus"
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "Neste festeval"
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr "Neste musikalsk festing-val"
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr "Neste musikalsk festing-val"
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr "Førre musikalsk fest-val"
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr "Fest til CD-ramme"
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr "Fest til tidskoderamme"
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr "Fest til tidskodesekund"
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr "Fest til tidskodeminutt"
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "Fest til sekund"
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "Fest til minutt"
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr "Fest til 128-deler"
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr "Fest til 64-deler"
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "Fest til halvminutt"
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr "Fest til tjue åttendeler"
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr "Fest til tjue fjerdedeler"
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr "Fest til tjuandedeler"
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "Fest til sekstendel"
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "Fest til fjortendel"
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr "Fest til tolvtedelar"
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "Fest til tiandedeler"
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "Fest til åttendeler"
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "Fest til sjuandedeler"
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "Fest til sjettedeler"
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "Fest til femtedeler"
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "Fest til fjerdedeler"
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "Fest til tredjedeler"
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "Fest til halve"
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "Fest til taktslag"
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "Fest til takt"
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "Fest til merke"
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "Fest til starten av bolken"
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "Fest til slutten av bolken"
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr "Fest til synkpunktet for bolken"
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "Fest til bolkgrensa"
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "Vis markørliner"
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "Lykkje/innslag"
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Min:sek"
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr ""
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr ""
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr ""
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr ""
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Sorter"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Vis alle"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr "Vis automatiske bolkar"
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Stigande"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Fallande"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Etter bolknamn"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Etter bolklengd"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Etter bolkplassering"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "Etter tidsstemplet på bolken"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Etter bolkstarten i fila"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Etter bolkslutten i fila"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Etter namn på kjeldefila"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Etter lengd på kjeldefila"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Etter datoen kjeldefila vart oppretta"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Etter kjeldefilsystemet"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "Fjern ubrukte"
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importer"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "Importer til bolklista..."
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr "Importer frå økt"
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "Vis samandrag"
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "Vis gruppefaner"
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr ""
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Vis logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr "Skru på/av aktiv MIDI-inngang for redigeringsvalde spor/bussar"
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "Lastar redigerinsbindingar frå %1"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Fann ikkje editor.bindings i søkjestigen %1"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr "Programmeringsfeil: %1: %2"
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "Hev"
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Hev til toppen"
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Lægste"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Senk til botnen"
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "Flytt til opphavleg plass"
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "Lim til takter og taktslag"
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "Fjern synk"
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Demp"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normaliser..."
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Baklengs"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "Lag mono-bolkar"
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "Auk volumet"
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "Mink volumet"
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "Endra tonehøgd..."
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Transponer..."
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "Heildekkjande"
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Ton inn"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Ton ut"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "Multi-kopier..."
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Fyll sporet"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Set lykkje-område"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "Set innslag"
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "Legg til einskild områdemarkør"
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "Legg til områdemarkør per bolk"
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
-msgstr "Fest posisjonen til gitteret"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
+msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "Steng gap"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "Rytmefinnar..."
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "Eksporter..."
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "Skil under"
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "Endre inntoningslengd"
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "Endre uttoningslengd"
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "Set tempoet ut frå at bolken = ei takt"
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "Del opp bolkane der perkusjonen kjem inn"
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "Listeredigering..."
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "Eigenskapar..."
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "Miks ned området (med signalhandsaming)"
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "Nedmiks (utan signalhandsaming)"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "Kombiner"
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "Løys opp"
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "Spektrumanalyse..."
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Nullstill omhylling"
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "Nullstill volum"
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "Omhylling på"
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "Set inn koplingsendring..."
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr "Fjern lenkjer frå andre kopiar"
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "Skjer bort stille..."
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Definer områdeval"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr "Skubb seinare"
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr "Skubb tidlegare"
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr "Skubb seinare etter innspelingsforskuvinga"
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr "Skubb tidlegare etter innspelingsforskuvinga"
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "Skjer til lykkja"
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Skjer til innslaget"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Skjer til førre"
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Skjer til neste"
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Set inn bolk frå lista"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "Set synkposisjon"
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "Plasser signaltopp"
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr ""
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "Skjer til starten ved redigeringspunktet"
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "Skjer til slutten ved redigeringspunktet"
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "Juster starten"
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "Juster starten relativt"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "Juster slutten"
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "Juster slutten relativt"
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "Juster synk"
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "Juster synken relativt"
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "Vel topp..."
@@ -4566,32 +5121,33 @@ msgstr ""
"Denne økta bruker alt ei kjeldefil som heiter %1. Vil du importera %2 som ny "
"fil, eller hoppa over ho?"
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Avbryt import"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Redigering: Kan ikkje opna fila \"%1\" (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Avbryt heile importen"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Ikkje set inn"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Set inn alle utan å spørja"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "Punktfrekvens"
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4599,208 +5155,277 @@ msgstr ""
"%1\n"
"Denne lydfila har ikkje same punktfrekvens som økta du arbeider med!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Set inn likevel"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr "fast tid-bolkflytting"
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr "endra notestorleik"
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "flytt taktartmerke"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "kopier taktartmerke"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "flytt taktartmerke"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "flytt tempomerke"
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "kopier tempomerke"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "flytt tempomerke"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "endra inntoningslengd"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "endra uttoningslengd"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "flytt markør"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "flytt automasjonsområde"
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr "Feil med tidsstrekkinga"
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr "programming_error: %1"
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr ""
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "utan namn"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr "Farge"
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr "Farge på gruppefane"
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr "Namn på gruppa"
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr ""
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr "Er gruppa synleg?"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr "PÃ¥"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr "Er gruppa på?"
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "Gruppe|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr ""
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr "Deler volum?"
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "Relativt|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr "Relative volumendringar?"
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "Demp|D"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
+msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr "Deler demping?"
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "Solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr "Deler solo?"
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Ta opp"
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr "Deler opptaksstatus?"
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "Lytting|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr "Deler monitorval?"
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "Utval|Val"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr ""
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr "Deler vald/redigeringsstatus?"
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "aktiv|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr "Deler aktiv-status?"
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr "Programmeringsfeil: markørpalettobjekt har ingen merkeobjektpeikar!"
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "Fila eksisterer!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Skriv over eksisterande fil"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr ""
#: editor_group_tabs.cc:176
msgid "Fit to Window"
@@ -4814,128 +5439,161 @@ msgstr "start"
msgid "end"
msgstr "slutt"
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "legg til merke"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "set lykkje-område"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "set innslagsområde"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "område"
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "nytt områdemerke"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "fjern markør"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "GÃ¥ hit"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "Spel herifrå"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "Flytt merket til spelehovudet"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "Lag område til neste markør"
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr ""
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr ""
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr ""
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr ""
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Gøym området"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "Døyp om området..."
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Fjern området"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Skil bolkane i omådet"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Vel område"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Set innslagsområde"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Nytt namn:"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "Døyp om merke"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "Døyp om området"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Døyp om"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "døyp om markør"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr "Denne skjermen er ikkje høg nok til å visa redigeringsmiksaren"
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
"Programmeringsfeil: objektet på tempomarkørpaletten har ingen "
"tempomarkørpeikar!"
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr "Programmeringsfeil: markøren for tempo er ikkje ingen tempomarkør!"
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr "Programmeringsfeil: taktartmarkøren er ikkje ein taktartmarkør!"
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
@@ -4943,175 +5601,183 @@ msgstr ""
"Programmeringsfeil: objektet på kontrollpunktpaletten har ingen "
"kontrollpunktpeikar!"
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr "skjer startpunkt"
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Skjer sluttpunkt"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Namn på bolken:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "del"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "endra utval"
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "skubb bolkane framover"
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "skubb staden framover"
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "skubb bolkane bakover"
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "skubb framover"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr "skubb bakover"
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "build_region_boundary_cache oppkalla med snap_type = %1"
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "Ny stadmarkør"
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "legg til markørar"
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "tøm markørar"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "tøm område"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "tøm stader"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "set inn bolk"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "hev bolkane"
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "hev bolken"
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "hev bolkane til øvste laget"
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "hev bolken til øvste laget"
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "senk bolkane"
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "senk bolken"
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "senk bolkane til botnlaget"
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "Døyp om bolken"
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr "Nytt namn:"
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "skil"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "skil bolken under"
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "skjer til utvalet"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "Set synk-punkt"
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "fjern bolksynk"
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "flytt bolkane til opphavleg plassering"
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "flytt bolken til opphavleg plassering"
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "juster utval"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "juster utval (relativt)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "juster bolken"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "skjer til framme"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "skjer til bak"
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "skjer til lykkja"
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "skjer til innslaget"
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "skjer til bolken"
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5123,11 +5789,11 @@ msgstr ""
"Dette kjem vanlegvis av utvidingar som lagar stereo-utsignal frå mono-"
"innsignal, eller omvendt."
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "Kan ikkje frysa"
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5142,23 +5808,23 @@ msgstr ""
"Viss du frys det, vil du berre påverka signalet til fyrste send/retur/"
"innsmett."
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "Frys likevel"
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr "Ikkje frys"
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "Frysgrenser"
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Avbryt frysing"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5167,47 +5833,47 @@ msgid ""
"You can do this without processing, which is a different operation."
msgstr ""
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr "Kan ikkje miksa ned"
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "miks ned område"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr "slett"
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "klypp"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "kopier"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "tøm"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr ""
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "fjern bolken"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "klon utvalet"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "skubb spor"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5215,138 +5881,158 @@ msgstr ""
"Vil du verkeleg øydeleggja siste innspelinga?\n"
"(Dette er endeleg og kan ikkje angrast)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Nei, ikkje gjer noko."
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Ja, øydelegg det."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "Fjern siste opptak"
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "normaliser"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "vend bolkane"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "skjer bort stille"
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "Del opp bolk(ane)"
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "rensk bolk-innvolum"
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr "bolkomhyllinga på"
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "skru på bolklås"
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr ""
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "type bolklås"
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "endra bolkgjennomsikt"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr ""
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "endra inntoningslengd"
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "endra uttoningslengd"
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "endra inntoningsform"
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "endra uttoningsform"
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "skru på inntoning"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "skru på uttoning"
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "set lykkjeområde frå utvalet"
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "set lykkjeområde frå bolken"
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "set innslagsområde frå utvalet"
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "set innslagsområdet frå bolken"
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "Legg til markør"
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "Set tempo for heile prosjektet"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "Definer ei takt"
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
"Vil du setja tempoet for heile prosjektet, eller leggja til ein ny "
"tempomarkør?"
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "set tempo ut frå bolken"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "del opp bolkane"
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5358,11 +6044,11 @@ msgstr ""
"i %2 deler.\n"
"Dette kan ta lang tid."
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr "Rop på rytmefinnaren!"
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5370,52 +6056,52 @@ msgstr ""
"Klikk OK for å halda fram med denne oppdelinga,\n"
"eller spør Finnaren om å finstilla analysen."
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr "Klikk OK for å halda fram med oppdelinga"
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "Overdriv delinga?"
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr "plasser signaltopp"
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "fest bolkane til gitteret"
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr "Steng gap mellom bolkane"
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "Krysstoningslengd"
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr "ms"
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr "Skyv tilbake-lengd"
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr "Ok"
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr "steng gap mellom bolkane"
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "Det ville vore dårleg nytt..."
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5431,23 +6117,21 @@ msgstr ""
"redigerer du ardour.rc-fila, og set\n"
"\"allow-special-bus-removal\"-valet til \"yes\""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "spor"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
+#, fuzzy
msgid "track"
-msgstr "spor"
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "bussar"
+msgid_plural "tracks"
+msgstr[0] "spor"
+msgstr[1] "spor"
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
+#, fuzzy
msgid "bus"
-msgstr "buss"
+msgid_plural "busses"
+msgstr[0] "buss"
+msgstr[1] "buss"
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5459,7 +6143,7 @@ msgstr ""
"\n"
"Du kan ikkje angra dette, og øktfila vil bli overskriven!"
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5471,147 +6155,148 @@ msgstr ""
"\n"
"Du kan ikkje angra dette, og øktfila vil bli overskriven!"
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
"This action cannot be undone, and the session file will be overwritten"
msgstr ""
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "Ja, slett dei."
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Ja, slett det."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "Fjern %1"
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "set inn tid"
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr "Det er for mange spor til at dei passar i denne ruta"
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr "Lagra vising %u"
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "demp bolkane"
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "demp bolken"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "kombiner bolkar"
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr "løys opp bolkar"
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr ""
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr ""
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr "Bolknamn, med tal på kanalar i [hakeparentesar]"
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "Kvar bolken startar"
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "Slutt"
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "Kvar bolken sluttar"
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "Lengda på bolken"
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr "Plassering for bolk-synkpunktet, relativt til bolkstarten"
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
"Lengd på inntoninga på bolken (eining: sekundærklokke), () viss avskrudd"
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "V"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "Er bolkplasseringa låst?"
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr "Er bolkplasseringa limt til takter|taktslag-tida?"
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "Er bolken dempa?"
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr "Er bolken gjennomsiktig? (Det hindrar at du høyrer bolkar under han.)"
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Gøymt"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr " (MANGLAR) "
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -5619,179 +6304,187 @@ msgstr ""
"Vil du verkeleg fjerna ubrukte bolkar?\n"
"(Dette er endeleg og kan ikkje angrast)"
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "Ja, slett"
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "Fjern ubrukte bolkar"
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "Dobl."
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "Start"
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "Mangedoble"
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "MANGLAR"
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr "SS"
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "Namn på spor/buss"
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "Er sporet/bussen synleg?"
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "Er sporet/bussen aktiv?"
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "MIDI-inngang skrudd på"
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "Opptak skrudd på"
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "Dempa"
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "Solo"
-#: editor_routes.cc:213
-msgid "SI"
-msgstr "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "Isolert solo"
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "Solo-sikker (låst)"
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Gøym alle"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Vis alle lydpsor"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Gøym alle lydspor"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Vis alle bussar"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Gøym alle bussar"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "Vis alle midipsor"
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "Gøym alle midispor"
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Vis spor med bolkar under spelehovudet"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Ny stadmarkør"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "Tøm alle stader"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr "Vis stader"
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr "Nytt område"
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "Tøm alle område"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr "Vis område"
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr "Ny CD-spormarkør"
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Nytt tempo"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Ny taktart"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr "Døyp om snøggbilete"
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr "Namn på det nye snøggbiletet:"
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
@@ -5799,35 +6492,39 @@ msgstr ""
"Vil du verkeleg fjerna snøggbiletet \"%1\"?\n"
"Du kan ikkje angra."
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr "Fjern snøggbilete"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "legg til"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "legg til tempomerke"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "legg til"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "legg til taktartsmerke"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "ferdig"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "byt ut tempomerke"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "fjern tempomerke"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5837,315 +6534,367 @@ msgstr ""
msgid "stretch/shrink"
msgstr "strekk/krymp"
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr "endra tonehøgd"
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr "greidde ikkje starta tidsstrekk - trådstartingsfeil"
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr ""
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr ""
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr ""
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr ""
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr ""
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr ""
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr ""
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr ""
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr ""
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr ""
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr ""
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr ""
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr ""
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Treigskap"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr ""
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "Drivar:"
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr ""
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "Punktfrekvens:"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "Bufferstorleik:"
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr ""
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr ""
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "Treigskap for maskinvare-inngangar:"
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "punkt"
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "Treigskap for maskinvare-utgangar:"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr ""
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
"Latency calibration requires playback and capture"
msgstr ""
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr ""
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr "Eining"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr ""
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr ""
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr ""
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "punkt"
-msgstr[1] "punkt"
-
-#: engine_dialog.cc:1090
-#, c-format
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 punkt"
+msgstr[1] "%1 punkt"
+
+#: engine_dialog.cc:1662
+#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "Ikkje tilkopla lydmotoren"
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "Lyttar etter signal..."
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Aktiv"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
-#: engine_dialog.cc:2185
-msgid "Connect to %1"
+#: engine_dialog.cc:3088
+msgid "Connected"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3099
+msgid "Connect to %1"
msgstr ""
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Stoppa"
+
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Kanalar:"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "Del opp til monofiler"
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr "Buss eller spor"
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "Bolkinnhald utan toningar eller bolkvolum (kanalar: %1)"
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "Bolkinnhald med toningar og bolkvolum (kanalar: %1)"
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr "Sporutgang (kanalar: %1)"
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
msgstr ""
-#: export_dialog.cc:46
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
@@ -6153,16 +6902,16 @@ msgstr ""
"<span color=\"#ffa755\">Dette skriv over nokre filer som finst frå før.</"
"span>"
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr "List opp filer"
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr "Filformat"
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr "Tidsomfang"
@@ -6190,27 +6939,39 @@ msgstr ""
msgid "Stop Export"
msgstr "Avbryt eksport"
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr "Eksporter"
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Eksporterer '%3' (tidsomfang %1 av %2)"
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr "Normaliserer '%3' (tidsomfang %1 av %2)"
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Eksporterer '%3' (tidsomfang %1 av %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">Feil: "
-#: export_dialog.cc:385
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">Ã
tvaring: "
-#: export_dialog.cc:387
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6218,19 +6979,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">Ã
tvaring: "
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr "Eksporter utvalet"
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr "Eksporter bolken"
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr "Kjelde"
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr "Staveksport"
@@ -6238,64 +6999,76 @@ msgstr "Staveksport"
msgid "Add another format"
msgstr "Legg til eit anna format"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Format"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Stad"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "Ikkje noko format!"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "Format %1: %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "Merke:"
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "Ãktnamn"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "Utgåve:"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Mappe:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Bla gjennom"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Lag filnamn av desse byggeklossane:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
"<small><i>Me kan diverre ikkje visa noko døme på filnamn no</i></small>"
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>(Omtrentleg) filnamn: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
@@ -6304,109 +7077,171 @@ msgstr ""
"%1: dette er berre namnet på katalogen/mappa, ikkje på fila.\n"
"Filnamnet vel du ut frå informasjonen rett over mappevalet."
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "Vel eksportmappe"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "Ny eksportformatprofil"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "Endra eksportformatprofilen"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "Merke:"
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normaliser til:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "Skjer bort stille på starten"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "Legg til stille på starten:"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "Skjer bort stille på slutten"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "Legg til stille på slutten:"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "Samspel"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "Kvalitet"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "Konverteringskvalitet:"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "Utjamning"
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr "Lag CUE-fil for å laga DAO-CD-ar eller DVD-ar"
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "Lag TOC-fil for å laga DAO-CD-ar eller DVD-ar"
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "Merk fila med metadata frå økta"
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "Best (sinc)"
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "Middels (sinc)"
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "Rask (sinc)"
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr "Hald nullorden"
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "Val for lineær omkoding"
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "Val for Ogg Vorbis"
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "Val for FLAC"
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "Val for kringkastingsformat"
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6414,7 +7249,7 @@ msgstr ""
msgid "Preset"
msgstr "Ferdigoppsett"
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
@@ -6422,23 +7257,194 @@ msgstr ""
"Greidde ikkje lasta dei valde ferdigoppsetta!\n"
"Kan henda dei viser til eit format som har vorte fjerna?"
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Greidde ikkje lesa fil: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Fekk ikkje tilgang til lydfil: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr "Vis tider som:"
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr "Vel alt"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr "til"
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
msgid "Range"
msgstr "Område"
@@ -6454,36 +7460,39 @@ msgstr ""
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr "-ê"
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Volumautomasjonsmodus"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Automasjonstype for volum"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr "Abs"
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "S"
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr "T"
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr "W"
@@ -6491,46 +7500,50 @@ msgstr "W"
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Ferdiginnstillingar</span>"
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr ""
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr ""
#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "Brytarar"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Kontrollar"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr "Utviding: greidde ikkje byggja kontrollelement for porten %1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr ""
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "Brytarar"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Kontrollar"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr "Mælarar"
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Automasjonskontroll"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr "Mgnual"
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "Lydtilkoplingar"
@@ -6539,112 +7552,141 @@ msgstr "Lydtilkoplingar"
msgid "MIDI Connection Manager"
msgstr "MIDI-tilkoplingar"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Kopla frå"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "port"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "Utval..."
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "Opptak på..."
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "Solo..."
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "Lag ny gruppe..."
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "Lag ny gruppe frå"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "Rediger gruppe..."
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr "Samla gruppa"
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "Fjern gruppa"
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr "Fjern subgruppe-buss"
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "Legg til subgruppe-buss"
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr "Legg til ny aux-buss (før volum)"
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr "Legg til aux-buss (etter volum)"
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr "Skru på alle grupper"
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "Slå av alle gruppene"
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr "Tid å setja inn:"
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr "Innskorne bolkar skal:"
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr "bli på plass"
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr "flytt"
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr "bli delt"
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Set inn tid på alle spelelistene til sporet"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr "Flytt limte bolkar"
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr "Flytt markørar"
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr "Flytt limte markørar"
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr "Flytt låste markørar"
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
@@ -6652,15 +7694,23 @@ msgstr ""
"Flytt tempo- og taktskifte\n"
"<i>(kan gje merkelege utslag i tempokartet)</i>"
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr "Set inn tid"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "-ingen-"
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "Importerer fil: %1 av %2"
@@ -6668,66 +7718,91 @@ msgstr "Importerer fil: %1 av %2"
msgid "I/O selector"
msgstr "I/U-veljar"
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1-inngang"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1-utgang"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr "din eigen"
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr "Fann ingen standardsnøggtastar. Då blir det ikkje lett å bruka %1!"
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr "Fann ikkje snøggtastfila \"%1\". Bruker standardsnøggtastar i staden."
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Snøggtastar"
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr "Alternativ snøggtast:"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Handling"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Snarveg"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-"Vel ei handling. Så trykkjer du tasten/tastane som skal utføra handlinga."
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Hovud_meny"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "omdirigeringsmeny"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Handling"
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Redigerings_menyar"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Snarveg"
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr "Bolkliste"
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "Prosessormeny"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "punkt"
#: latency_gui.cc:40
msgid "msec"
@@ -6737,144 +7812,253 @@ msgstr "msek"
msgid "period"
msgstr "periode"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 punkt"
-msgstr[1] "%1 punkt"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Nullstill"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "Programmeringsfeil: %1 (%2)"
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "Bruk PH"
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "Lim"
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr "Utøvar:"
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr "Komponist:"
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "Før-framheving for CD"
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr "Fjern dette området"
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr "Starttid - midtklikk for å gå hit"
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr "Sluttid - midtklikk for å gå hit"
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr "Set områdestart ved spelehovudet"
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr "Set områdeslutt ved spelehovudet"
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr "Fjern denne markøren"
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr "Posisjon - midtklikk for å gå hit"
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr "Set markørtid ved spelehovudet"
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "Du kan ikkje leggja ein CD-markør på starten av økta"
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr "Nytt merke"
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr "Nytt område"
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>Lykkje-/innslagsområde</b>"
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>Markørar (inkl. CD-indeks)</b>"
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>Bolkar (inkl. CD-sporbolkar)</b>"
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "legg til områdemarkørar"
-#: main.cc:82
-msgid "%1 could not connect to the audio backend."
+#: lua_script_manager.cc:31
+msgid "Add/Set"
msgstr ""
-#: main.cc:107 main.cc:123
-msgid "The audio backend (%1) has failed, or terminated"
+#: lua_script_manager.cc:34
+msgid "Call"
msgstr ""
-#: main.cc:110
-msgid ""
-"%2 exited unexpectedly, and without notifying %1.\n"
-"\n"
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
+msgid "%1 could not connect to the audio backend."
+msgstr ""
+
+#: main.cc:135 main.cc:151
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr ""
+
+#: main.cc:138
+msgid ""
+"%2 exited unexpectedly, and without notifying %1.\n"
+"\n"
"This could be due to misconfiguration or to an error inside %2.\n"
"\n"
"Click OK to exit %1."
msgstr ""
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr ""
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:344
msgid " (built using "
msgstr " (bygd med "
-#: main.cc:313
+#: main.cc:347
msgid " and GCC version "
msgstr " og GCC-version "
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
-#: main.cc:324
+#: main.cc:358
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -6882,48 +8066,68 @@ msgstr ""
"Nokre deler (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, Robin "
"Gareus"
-#: main.cc:326
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 har ABSOLUTT INGEN GARANTI"
-#: main.cc:327
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
"mogleik for sal eller bruk til eit spesielt føremål er heller ikkje "
"garantert."
-#: main.cc:328
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Dette er gratis programvare, og du må gjerne gje henne vidare"
-#: main.cc:329
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"på visse vilkår, sjå kjeldekoden for kopierings- og vidareformidlingsvilkår. "
-#: main.cc:334
+#: main.cc:368
msgid "could not initialize %1."
msgstr "greidde ikkje starta %1."
-#: main.cc:344
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Kan ikkje xinstallera SIGPIPE-feilhandterar"
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr ""
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr "Vis delta til redigeringspunktet"
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "Endra tempo"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "Endra taktart"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
msgid "MarkerText"
msgstr "MarkørTekst"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Ingen"
@@ -7004,11 +8208,11 @@ msgstr ""
msgid "Click to force all MIDI channel messages to channel %1"
msgstr ""
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr ""
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr ""
@@ -7120,192 +8324,188 @@ msgstr "kanalredigering"
msgid "velocity edit"
msgstr "anslagsendring"
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr "legg til note"
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr "steg legg til"
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr "endra koplingsendring"
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr "legg til koplingsendring"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr "flytt koplingsendring"
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr "slett koplingsendring"
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr "slett markeringa"
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr "slett note"
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr "flytt notane"
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr "vel fart"
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr "transponer"
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr "endra notelengder"
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr "skubb"
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr "endra kanal"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr ""
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr ""
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "lim inn"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "Ekstern MIDI-eining"
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "Modus for ekstern eining"
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr ""
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "Vis heile området"
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "Pass til innhaldet"
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "Noteområde"
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "Notemodus"
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Fargemodus"
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr "Bendar"
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "Trykk"
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr "Kontrollarar"
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "Ingen MIDI-kanalar er valde"
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "Gøym alle kanalar"
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "Vis alle kanalar"
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "Kanal %1"
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "Kontrollarar %1-%2"
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr ""
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "Uthalden"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "Perkussiv"
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "Mælarfarger"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "Kanalfarger"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Sporfarge"
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7321,7 +8521,7 @@ msgstr "Auto-rull"
msgid "Decimal"
msgstr "Desimal"
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "PÃ¥"
@@ -7337,35 +8537,36 @@ msgstr "Port:"
msgid "New velocity"
msgstr "Nytt anslag"
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr "Vel ei mappe å søkja gjennom"
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr "Legg til den mappa du har valt til søkjestigen, og prøv att"
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr "Ikkje last økta"
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr "Hopp over manglande filer"
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr "Hopp over denne fila"
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "lyd"
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7385,7 +8586,7 @@ msgstr ""
"<tt>%4</tt>\n"
"\n"
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr "Klikk for å velja ei mappe til"
@@ -7393,96 +8594,40 @@ msgstr "Klikk for å velja ei mappe til"
msgid "Missing Plugins"
msgstr "Manglande utvidingar"
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Skru på solo på miksar-valde spor/bussar"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Skru på/av demping på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Skru på/av opptak på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Minsk volum på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Auk volum på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Set volumet til 0dB på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Kopier dei valde signalprosessane"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Klypp ut dei valde signalprosessane"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Lim inn dei valde signalprosessane"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Slett dei valde signalprosessane"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Vel alle (synlege) signalprosessar"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Skru av/på dei valde signalprosessane"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Skru av/på dei valde utvidingane"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Rull miksarvindauga til venstre"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Skru på/av aktiv MIDI-inngang for miksarvalde spor/bussar"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Lasta miksarbindingar frå %1"
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Fann ikkje mixer.bindings i søkjestigen %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "før"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr "Kommentarar"
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr "Klikk for å endra breidd på denne miksarstripa."
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -7490,287 +8635,458 @@ msgstr ""
"\n"
"%1-%2-klikk for å endra breidda på alle stripene."
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr "Gøym denne miksarstripa"
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr "Klikk for å velja mælepunkt"
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr "Isoler solo"
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr "LÃ¥s solostatus"
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "Miksgruppe"
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr "Polaritetsvending"
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr ""
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr "Slå på/av MIDI-inngang"
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr ""
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr "Snd"
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr "<b>INNGANG</b> til %1"
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>UTGANG</b> frå %1"
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr "Fråkopla"
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Kommentarar*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
msgid "Cmt"
msgstr "Kmt"
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Kmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Klikk for å leggja til/redigera kommentarar"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr "Grp"
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr "~G"
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Farge..."
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr "Merknader â¦"
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr ""
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr ""
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr "Lagra som mal..."
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Aktiv"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr "Juster treigskap..."
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr "Vern mot unormalar"
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "Fjernstyrings-ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr "Disk"
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr "EL"
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr "FL"
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "Før volumkontroll"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Etter volumkontroll"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Gruppe"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr "fann ikkje sporvisingslisteobjekt for omdøypt stripe!"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-alle-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Striper"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Skru på solo på miksar-valde spor/bussar"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Skru på/av demping på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "Skru på/av opptak på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Minsk volum på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Auk volum på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Set volumet til 0dB på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Kopier dei valde signalprosessane"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Klypp ut dei valde signalprosessane"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Lim inn dei valde signalprosessane"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Slett dei valde signalprosessane"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Vel alle (synlege) signalprosessar"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Skru av/på dei valde signalprosessane"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Skru av/på dei valde utvidingane"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Rull miksarvindauga til venstre"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "Skru på/av aktiv MIDI-inngang for miksarvalde spor/bussar"
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr ""
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr ""
-#: meter_strip.cc:884
+#: meter_strip.cc:895
msgid "Short"
msgstr ""
-#: meter_strip.cc:885
+#: meter_strip.cc:896
msgid "Tall"
msgstr ""
-#: meter_strip.cc:886
+#: meter_strip.cc:897
msgid "Grande"
msgstr ""
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr ""
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr "Spp"
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "Solo"
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr ""
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr ""
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -7778,7 +9094,7 @@ msgstr ""
"NÃ¥r knappen er trykt inn, er noko solo-isolert.\n"
"Klikk for å av-isolera alt."
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -7786,27 +9102,72 @@ msgstr ""
"Når knappen er trykt inn, blir noko lytta på.\n"
"Klikk for å slå av lyttinga."
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr "Solo-kontrollar styrer solo-på-plass"
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr "Solo-kontrollar styrer etterlytting"
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr "Solo-kontrollar styrer førlytting"
-#: monitor_section.cc:156
-msgid "Gain increase for soloed signals (0dB is normal)"
-msgstr "Volumauke for solo-signal (0dB er vanleg)"
-
#: monitor_section.cc:170
-msgid "Solo Boost"
-msgstr "Solo-volumauke"
-
-#: monitor_section.cc:185
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "Eksklusiv solo tyder at berre 1 solo om gongen er aktiv"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Når skrudd på, vil solo overstyra demping\n"
+"(eit dempa solospor eller -buss vil høyrast)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
+msgid "Gain increase for soloed signals (0dB is normal)"
+msgstr "Volumauke for solo-signal (0dB er vanleg)"
+
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
+msgid "Solo Boost"
+msgstr "Solo-volumauke"
+
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
@@ -7814,105 +9175,135 @@ msgstr ""
"Volumreduksjon for signal som ikkje er solo\n"
"Verdiar over -inf dB gjev «solo-i-front»"
-#: monitor_section.cc:196
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
msgid "SiP Cut"
msgstr "Spp-kutt"
-#: monitor_section.cc:211
+#: monitor_section.cc:240
msgid "Gain reduction to use when dimming monitor outputs"
msgstr "Volumreduksjon når me dimmar monitorutgangane"
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
-msgstr "Dim"
-
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
msgstr ""
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "Eksklusiv solo tyder at berre 1 solo om gongen er aktiv"
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr "Dim"
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:294
+msgid "-30 dB"
msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:333
+msgid "Inv"
msgstr ""
-"Når skrudd på, vil solo overstyra demping\n"
-"(eit dempa solospor eller -buss vil høyrast)"
-#: monitor_section.cc:323
+#: monitor_section.cc:399
msgid "Monitor"
msgstr "Lytting"
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr ""
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr ""
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr ""
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr ""
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "Kutt lytting kan %1"
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr "Dim lytting kan %1"
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr "Solo lytting kan %1"
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr "Snu lytting kan %1"
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr ""
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr ""
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr "Monopanorering"
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr "%"
@@ -7988,10 +9379,6 @@ msgstr ""
"fram med\n"
"Ã¥ laga Ardour utan stabile inntekter. Takk for at du bruker Ardour!"
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nytt ferdigoppsett"
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr "Byt ut eksisterande ferdigoppsett med dette namnet"
@@ -8000,6 +9387,10 @@ msgstr "Byt ut eksisterande ferdigoppsett med dette namnet"
msgid "Name of new preset"
msgstr "Namn på det nye ferdigoppsettet"
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "Normaliser bolkane"
@@ -8008,7 +9399,11 @@ msgstr "Normaliser bolkane"
msgid "Normalize region"
msgstr "Normaliser bolken"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normaliser til:"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr "dbFS"
@@ -8028,45 +9423,50 @@ msgstr "Normaliser"
msgid "Select Note"
msgstr ""
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Bruk: "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr " [ÃKTNAMN] Namn pÃ¥ økta du vil lasta\n"
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr " -v, --version Vis versionsinformasjon\n"
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr " -h, --help Vis denne meldinga\n"
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
" -b, --bindings Vis alle moglege tastekombinasjonar\n"
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr " -d, --disable-plugins Skru av alle utvidingar i ei økt\n"
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
@@ -8074,65 +9474,61 @@ msgstr ""
" -D, --debug <val> Set avlusingsflagg. Bruk \"-D list\" for å sjå kva "
"val som finst\n"
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr " -n, --no-splash Ikkje vis oppstartsbiletet\n"
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr " -m, --menus file Bruk \"fil\" for Ardour-menyar\n"
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr " -N, --new session-name Lag ei ny økt frå kommandolinja\n"
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
" -O, --no-hw-optimizations Ikkje bruk spesialinnstillingar for "
"maskinvara di\n"
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr " -S, --sync\t Teikne brukarflata synkront \n"
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr " -V, --novst Slå av VST-støtta\n"
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
" -E, --save <fil> Last økta, lagra ho til <file> og avslutt\n"
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr " -C, --curvetest filename Kurvealgoritme-avlusing\n"
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-" -k, --keybindings-filename Namn på snøggtastfil som skal lastast "
-"(standard er ~/.ardour3/ardour.bindings)\n"
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr "Panorering (2D)"
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "Forbikopla"
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr "Panorering"
@@ -8144,6 +9540,22 @@ msgstr "pan-automasjonsmodus"
msgid "Pan automation type"
msgstr "pan-automasjonstype"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr "Spelelister"
@@ -8176,100 +9588,254 @@ msgstr "db-skala"
msgid "Show phase"
msgstr "Vis fase"
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Greier ikkje setja opp ny send: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "Namnet inneheld"
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "Typen inneheld"
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr "Kategorien inneheld"
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "Opphavsperson inneheld"
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "Biblioteket inneheld"
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "Berre favorittar"
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "Berre gøymt"
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr "Ordna utvidingar"
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr "Fav"
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr "Tilgjengelege utvidingar"
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Type"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr "Kategori"
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr "Opphavsperson"
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr "# Lyd inn"
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr "# Lyd ut"
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr "# MIDI inn"
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr "# MIDI ut"
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "Utvidingar som skal koplast til"
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Legg ei utviding til effektlista"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Fjern ei utviding frå effektlista"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Oppdater utvidingar"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "Set inn utviding(ar)"
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr "variabel"
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -8279,43 +9845,43 @@ msgstr ""
"\n"
"Sjå i loggruta etter (kanskje) fleire opplysingar"
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "Favorittar"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "Ordna utvidingar..."
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Etter opphavsperson"
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Etter kategori"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "Hm? LADSPA-utvidingar har ikkje redigering!"
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr "ukjent redigerbar utvidingstype"
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr "create_lv2_editor oppkalla på ikkje-LV2-utviding"
@@ -8323,15 +9889,15 @@ msgstr "create_lv2_editor oppkalla på ikkje-LV2-utviding"
msgid "Add"
msgstr "Legg til"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr "Skildring"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr "Analyse av programutvidingar"
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
@@ -8339,23 +9905,28 @@ msgstr ""
"Førehandsoppsett (viss dei finst) for utvidinga\n"
"(Både frå produsent og brukarar)"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr "Lagra nytt ferdigoppsett"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr "Lagra ferdigoppsettet"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr "Slett dette ferdigoppsett"
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr "Skru av signalhandsaminga åt utvidinga"
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -8363,111 +9934,127 @@ msgstr ""
"Klikk for å gje utvidinga lov til å ta imot tastetrykk som %1 vanlegvis "
"bruker som snøggtastar"
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr "Klikk for å skru av/på denne utvidinga"
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "utreigskap (%1 punkt)"
msgstr[1] "treigskap (%1 punkt)"
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr "treigskap (%1 ms)"
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr "Endra treigskap"
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nytt ferdigoppsett"
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "Klikk for å bruka snøggtastane som vanleg i %1"
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
msgid "%1 Busses"
msgstr "%1 bussar"
-#: port_group.cc:338
+#: port_group.cc:339
msgid "%1 Tracks"
msgstr "%1 spor"
-#: port_group.cc:339
+#: port_group.cc:340
msgid "Hardware"
msgstr "Maskinvare"
-#: port_group.cc:340
+#: port_group.cc:341
msgid "%1 Misc"
msgstr "%1 ymse"
-#: port_group.cc:341
+#: port_group.cc:342
msgid "Other"
msgstr "Anna"
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr "LTC ut"
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr "LTC inn"
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr "MTC inn"
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr "MIDI-kontroll inn"
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr "MIDI-klokke inn"
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr "MMC inn"
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr "MTC ut"
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr "MIDI-kontroll ut"
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr "MIDI-klokke ut"
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr "MMC ut"
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ":lytting"
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr "system:"
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
+msgstr ""
#: port_insert_ui.cc:39
msgid "Measure Latency"
@@ -8489,79 +10076,76 @@ msgstr "Fann ikkje noko signal"
msgid "Port Insert "
msgstr "Portinnstikk"
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr "<b>Kjelder</b>"
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr "<b>MÃ¥l</b>"
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr "Legg til %s %s"
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr "Døyp om '%s'..."
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr "Fjern alt"
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr "%s alt"
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Oppdater"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr "Vis individuelle portart"
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr "Flipp"
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-"Du kan ikkje leggja til ein port her, fordi den fyrste signalprosessen på "
-"sporet eller bussen ikkje godtek det nye oppsettet."
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr "Kan ikkje leggja til port"
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "Ikkje lov å fjerna portar"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "Ikkje lov å fjerna portar"
+
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "Fjern '%s'"
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s alt frå '%s'"
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "kanal"
@@ -8573,59 +10157,70 @@ msgstr "Ingen portar å kopla til."
msgid "There are no %1 ports to connect."
msgstr "Ingen %1-portar å kopla til."
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "Vis alle kontrollar"
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "Gøym alle kontrollar"
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr "på"
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "av"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -8633,15 +10228,22 @@ msgstr ""
"Høgreklikk for å leggja til/fjerna/redigera\n"
"utvidingar, innstikk, send og meir"
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr "Utvidinga samsvarar ikkje"
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "Du prøvde å leggja til utvidinga \"%1\" i skuffen %2.\n"
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
@@ -8649,19 +10251,19 @@ msgstr ""
"\n"
"Denne utvidinga har:\n"
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 MIDI-inngang\n"
msgstr[1] "\t%1 MIDI-inngangar\n"
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 lydinngang\n"
msgstr[1] "\t%1 lydinngangar\n"
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -8669,19 +10271,19 @@ msgstr ""
"\n"
"men på innsetingspunktet er det:\n"
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 MIDI-kanal\n"
msgstr[1] "\t%1 MIDI-kanalar\n"
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 lydkanal\n"
msgstr[1] "\t%1 lydkanalar\n"
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -8689,11 +10291,7 @@ msgstr ""
"\n"
"%1 greier ikkje setja inn utvidinga her.\n"
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "Greier ikkje setja opp ny send: %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -8703,19 +10301,19 @@ msgstr ""
"signal-omdirigeringar, fordi inn- og utgangane\n"
"ikkje verkar skikkeleg då."
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr "Døyp om handsaming"
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr "Det finst minst 100 IU-objekt med namn som %1 - namnet er ikkje endra"
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr "greidde ikkje laga instikkpunkt for utvidinga"
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -8725,7 +10323,7 @@ msgstr ""
"tavla, truleg fordi I/U-oppsettet for utvidingane\n"
"ikkje passar med oppsettet for dette sporet."
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -8733,15 +10331,15 @@ msgstr ""
"Vil du verkeleg fjerna alle handsamingar frå %1?\n"
"(Du kan ikkje angra)"
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Ja, slett alle"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr "Fjern handsamingar"
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -8749,7 +10347,7 @@ msgstr ""
"Vil du verkeleg fjerna alle før-dempar-handsamingar frå %1?\n"
"(Du kan ikkje angra)"
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
@@ -8757,59 +10355,59 @@ msgstr ""
"Vil du verkeleg fjerna alle før-dempar-handsamingar frå %1?\n"
"(Du kan ikkje angra)"
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr "Ny utviding"
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Nytt innstikk"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr "Ny ekstern send..."
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr "Ny aux-send..."
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr "Tøm (alt)"
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr "Fjern (før-dempar)"
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr "Fjern (etter-dempar)"
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "Slå på alle"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr "Slå av alle"
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr "A/B programutvidingar"
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr "%1: %2 (av %3)"
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr ""
@@ -8837,346 +10435,444 @@ msgstr "Bank"
msgid "main grid"
msgstr "hovudgitter"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Gitterfordel"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "Styrke"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Swing"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "Terskel (tikk)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr "Fest notestarten"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr "Fest noteslutten"
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Klikk-lydfil:"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "Bla gjennom..."
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Klikk-lydfil:"
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Trykklegging-lydfil:"
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Vel klikk"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Vel trykklegging for klikk"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "Ãvre grense for angrelogg er"
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "Lagra angreloggen for"
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "kommandoar"
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "Rediger med:"
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ museknapp"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "Slett med:"
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "Set inn note med:"
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr ""
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
msgid "Ignore snap using:"
msgstr "Sjå bort frå festing med:"
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Tastaturutforming:"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Skriftskalering:"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "Avspeling (sekund bufring):"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "Opptak (sekund bufring):"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr ""
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:1032
+msgid "Default"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-"Dobbelklikk på eit namn for å redigera innstillingane for ein aktiv protokoll"
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:1100
+msgid "â"
msgstr ""
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:1103
+msgid "2 mins"
msgstr ""
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
msgstr ""
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
msgstr ""
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1109
msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
msgstr ""
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr "Avspeling (sekund bufring):"
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr "Opptak (sekund bufring):"
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1367
msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
msgstr ""
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr ""
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
msgstr ""
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1565
msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
msgstr ""
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
msgstr ""
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
msgstr ""
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1579
msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
msgstr ""
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "Innstillingar for %1"
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
msgstr "DSP-prosessorbruk"
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "Signalhandsaminga brukar"
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "alt bortsett frå ei signalhandsaming"
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "alle tilgjengelege signalhandsamingar"
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr "%1 signalhandsamingar"
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr "Dette vil fyrst verka når du startar %s på nytt att."
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "Val|Angra"
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "Stadfest når du vil fjerna siste opptak"
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Tryggingskopier økta med jamne mellomrom"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr "Ãkthandtering"
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Tryggingskopier økta med jamne mellomrom"
+
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Kopier alltid importerte filer"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr "Standardmappe for nye økter:"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "Største tal på samtidige økter"
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr "Klikkvolum"
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automasjon"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr "Tynningsfaktor (høgare verdi => mindre data)"
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "Tid mellom automasjonspunkt (i millisekund)"
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "Hald opptaksstatusen på ved stopp"
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -9185,25 +10881,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr "Stopp opptak ved xrun-hendingar"
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "Lag markørar ved xrun-hendingar"
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "Stopp ved slutten av økta"
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -9212,11 +10908,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -9226,11 +10922,11 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr "Ikkje tillat å skru av opptaksstatusen per spor under avspeling"
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
@@ -9238,11 +10934,11 @@ msgstr ""
"<b>Når dette er på</b>, vil du ikkje kunna slå av opptak for bestemte spor "
"ved eit uhell medan du tek opp"
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "12dB demping ved spoling"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
@@ -9250,19 +10946,63 @@ msgstr ""
"Dette reduserer den ubehagelege auken i oppfatta volum som kjem når du "
"spolar framover eller bakover gjennom nokre typar lyd"
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "Synk/slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr "Ekstern tidskodekjelde"
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr "Tilpass raten for videorammene i denne økta til ekstern tidskode"
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9276,27 +11016,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "LÃ¥s til 29,9700 fps i staden for 30000/1001"
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9309,37 +11049,37 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr "LTC-lesar"
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr "Innkomande LTC-port"
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr "LTC-generator"
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr "Skru på LTC-generator"
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr "LTC-generatornivå"
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
@@ -9347,627 +11087,894 @@ msgstr ""
"Gjev toppvolumet til dei genererte LTC-signala i dbFS. Ein bra verdi er "
"0dBu ^= -18dbFS i eit EBU-kalibrert system"
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr ""
-
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "Flytt relevant automasjon saman med lydbolkane"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Få gummistrikkval-rektangelet til å festa til gitteret"
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Vis mælarar på spor i redigeringa"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Døyp nye markørar"
-#: rc_option_editor.cc:1646
-msgid "Display master-meter in the toolbar"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
msgstr ""
+"VIss dette er på, vil det koma eit oppsprettvindauga når du lagar ein "
+"markør, slik at du kan gje han namn medan du lagar han.\n"
+"\n"
+"Du kan alltid døypa om markørar ved å høgreklikka på dei."
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Få gummistrikkval-rektangelet til å festa til gitteret"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr "Oppdater redigeringsvindauga når du dreg samandraget"
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Vis bylgjeformer i bolkane"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr "Autorull redigeringsvindauga når du dreg nær kantane"
-#: rc_option_editor.cc:1700
+#: rc_option_editor.cc:2272
msgid "Show gain envelopes in audio regions"
msgstr "Vis lydomhylling i lydbolkane"
-#: rc_option_editor.cc:1701
+#: rc_option_editor.cc:2273
msgid "in all modes"
msgstr "i alle modi"
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "berre i bolkvolum-modus"
-
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
-msgstr "Bylgjeskala"
-
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "rettlinja"
-
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "logaritmisk"
-
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
-msgstr "Bylgjeform"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr ""
-#: rc_option_editor.cc:1726
-msgid "traditional"
-msgstr "tradisjonell"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
-msgstr "innretta"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "Flytt relevant automasjon saman med lydbolkane"
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Vis bylgjeformer ved opptak"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Vis zoom-verktylina"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "Oppdater redigeringsvindauga når du dreg samandraget"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
+msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "Samkøyr redigeringa og miksarvalet"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
+msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Døyp nye markørar"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-"VIss dette er på, vil det koma eit oppsprettvindauga når du lagar ein "
-"markør, slik at du kan gje han namn medan du lagar han.\n"
-"\n"
-"Du kan alltid døypa om markørar ved å høgreklikka på dei."
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr "Autorull redigeringsvindauga når du dreg nær kantane"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
-#: rc_option_editor.cc:1786
+#: rc_option_editor.cc:2332
msgid "After splitting selected regions, select"
msgstr ""
-#: rc_option_editor.cc:1791
+#: rc_option_editor.cc:2337
msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1794
+#: rc_option_editor.cc:2340
msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1798
+#: rc_option_editor.cc:2344
msgid "existing selection and newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Vis bylgjeformer i bolkane"
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Vis bylgjeformer ved opptak"
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
+msgstr "Bylgjeskala"
+
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "rettlinja"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr "logaritmisk"
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr "Bylgjeform"
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr "tradisjonell"
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr "innretta"
+
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr "Bufring"
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr "Opptakslyttinga blir handtert av"
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "lydmaskinvare"
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Bandopptakarmodus"
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Tilkopling av spor og bussar"
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "Kopla til master- og lyttebussane automatisk"
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "Kopla sporinngangane"
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "automatisk til fysiske inngangar"
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "manuelt"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "Kopla til spor- og bussutgangar"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "automatisk til fysiske inngangar"
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "automatisk til masterbussen"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr "Unormalar"
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr "Bruk likestraumsbias for å verna mot unormalar"
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "Prosessorhandtering"
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "inga prosessorhandtering"
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr "bruk SpylTilNull"
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "bruk UnormalarErNull"
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr "bruk SpylTilNull og UnormalarErNull"
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "Demp lyden frå utvidingar ved stopp"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Gjer nye utvidingar aktive"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "Skru på automatisk analyse av lyd"
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "Kopier manglande bolk-kanalar"
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / demp"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "Demping for solo-på-plass (dB)"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
msgid "Solo controls are Listen controls"
msgstr "Solo-kontrollar er lyttekontrollar"
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Eksklusiv solo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Vis solodemping"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo overstyrer demping"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr "Demping for solo-på-plass (dB)"
+
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr "Lytteposisjon"
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr "etterlytting (AFL)"
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr "førlytting (PFL)"
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr "Førlyttingssignal kjem frå "
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr "før før-volum-handsamingar"
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr "før-volum, men etter før-volum-signalhandsaming"
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr "AFL-signal kjem frå "
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr "rett etter volum"
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
-msgstr "etter etter-volum-signalprosessar (før panorering)"
-
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Eksklusiv solo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Vis solodemping"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo overstyrer demping"
+msgstr "etter etter-volum-signalprosessar (før panorering)"
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "Standard spor- og bussdempeval"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr "Demping verkar på send før volum"
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr "Demping verkar på send etter volum"
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "Demping påverkar kontrollutgangane"
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "Demping verkar på hovudutgangar"
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr ""
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr ""
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "Tidleg programendring"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "Vis fyrste MIDI-bank/program som 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "Aldri vis periodiske MIDI-meldingar (MTC, MIDI-klokke)"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "Send MIDI-kontrollsvar"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr "Send MIDI-tidskode"
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr "Prosentdel til kvar side av normal transportfart for å senda MTC"
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "Lyd MIDI-maskinkontrollkommandoar"
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
msgstr "Send MIDI-maskinkontrollkommandoar"
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "Send MIDI-kontrollsvar"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr "ID for innkomande MMC-eining"
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr "ID for utgåande MMC-eining"
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "Tidleg programendring"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "Vis fyrste MIDI-bank/program som 0"
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "Aldri vis periodiske MIDI-meldingar (MTC, MIDI-klokke)"
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "Lytt på MIDI-notar medan du vel dei"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr ""
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr "Brukarsamhandling"
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
" <i>(if available for your language preferences)</i>"
msgstr ""
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "Tastatur"
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "Fjernstyrings-ID for kontrollflate"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Demp lyden frå utvidingar ved stopp"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Gjer nye utvidingar aktive"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "fastsett av brukaren"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "fylgjer miksaren"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
msgid "Preferences|GUI"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "Vis musepeikaren grafisk når han er over ulike småprogram"
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr "Vis verktøytips når peikaren er over ein kontroll"
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr "Miksarstripe"
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr "Bruk smale miksarstriper i miksaren som standard"
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr "kort"
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr "middels"
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr "lenge"
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Vis mælarar på spor i redigeringa"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr ""
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "lytt på denne bolken"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr "Posisjon:"
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr "Slutt:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr "Lengd:"
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr "Synkpunkt (relativt plassert til bolken):"
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr "Synkpunkt (absolutt):"
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr "Filstart:"
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr "Kjelder:"
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr "Kjelde:"
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr "Bolk '%1'"
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr "endre bolkstartposisjon"
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr "endre boksluttposisjon"
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr "endre bolklengd"
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr "endre bolksynkposisjon"
@@ -9987,33 +11994,33 @@ msgstr "Spor:"
msgid "Choose Top Region"
msgstr "Vel toppbolk"
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr "StilleTekst"
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "minutt"
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "msek"
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "sek"
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] "%1 stille segment"
msgstr[1] "%1 stille segment"
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr "stuttast = %1 %2"
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -10061,55 +12068,63 @@ msgstr "Kullback-Liebler"
msgid "Modified Kullback-Liebler"
msgstr "Modifisert Kullback-Liebler"
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "Del bolken"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr "Fest bolkar"
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "Einsrett bolkar"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "Rytmefinnar"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Analyser"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "Leitefunksjon"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Brytargap"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Dørstokk"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "Toppterskel"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "Stille-terskel (dB)"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "Følsemd"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Handling"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "del opp bolkane (finn rytmar)"
@@ -10133,19 +12148,15 @@ msgstr "Skru på/av opptak"
msgid "Active state"
msgstr "Aktiv status"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Farge"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr "Rutegruppedialog"
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>Deler</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
@@ -10165,330 +12176,317 @@ msgstr "Utgangar"
msgid "Plugins, Inserts & Sends"
msgstr "Utvidingar, innstikk og send"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "fann ikkje rutevisingslisteobjekt for omdøypt rute!"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "Avspelingsseinking: %<PRId64> punkt"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "IKKJE NOKO SPOR"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Legg til spor eller buss"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "Ingen spor eller bussar valde"
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr "Ta opp (høgreklikk for stegredigering)"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Ta opp"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "Rut gruppe"
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr "MIDI-kontrollar og -automasjon"
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "Vis all automasjon"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "Vis gjeldande automasjon"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "Gøym all automasjon"
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Volum"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Panorering"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "Overlagt"
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "Stabla"
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Lag"
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr "Automatisk (basert på I/U-tilkoplingar)"
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr "(No: eksisterande materiale)"
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr "(No: opptakstidspunkt)"
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr "Juster til eksisterande materiale"
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr "Juster til innspelingstid"
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "Justering"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr "Normalmodus"
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr "Bandmodus"
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr "Ikkje lagdelt modus"
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr ""
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Speleliste"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "Døyp om spelelista"
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "Nytt namn på spelelista:"
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "Ny spelelistekopi"
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "Namn på den nye spelelista:"
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "Ny speleliste"
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-"Du kan ikkje laga eit spor med det namnet, fordi det er halde att for %1"
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "Ny kopi..."
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "Nytt tak"
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "Kopier tak"
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Tøm gjeldande"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "Vel frå alt..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr "Tak: %1.%2"
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "programmeringsfeil: "
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr "Underlag"
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "Fjern \"%1\""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
"Programmeringsfeil: underlags-tilvisingspeikarpar er ikkje samanhengande!"
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr "Etterlytting (AFL)"
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr "Førlytting (PFL)"
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr "Demp dette sporet"
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr "Demp alle andre (ikkje-solo) spor"
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr "Gjer klar til opptak på dette sporet"
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr "få miksarstripene til å visa send for denne bussen"
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr "Lytt på inngangen"
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr "Lytt på avspelinga"
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr "Steginnskriving"
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr "Tildel alle spor (før volum)"
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr "Tildel alle spor og bussar (førvolum)"
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr "Tildel alle spor (etter volum)"
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr "Tildel alle spor og bussar (ettervolum)"
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr "Tildel dei valde spora (førvolum)"
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr "Tildel dei valde spora og bussane (førvolum)"
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr "Tildel dei valde spora (ettervolum)"
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr "Tildel dei valde spora og bussane (ettervolum)"
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr "Kopier spor-/bussvolum til send"
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr "Set sendvolum til -inf"
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr "Set sendvolum til 0dB"
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr "Isoler solo"
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr "Solo-sikker"
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "Kontrollutgangar"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "Hovudutgangar"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr "Fargeval"
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Vil du verkeleg sletta sporet \"%1\"?\n"
-"\n"
-"Det kan hende du mistar spelelister for sporet òg.\n"
-"\n"
-"(Du kan ikkje angra dette, og øktfila vil bli overskriven)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Vil du verkeleg sletta bussen \"%1\"?\n"
-"\n"
-"(Du kan ikkje angra, og øktfila vil bli overskriven!)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Fjern spor"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Fjern buss"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -10496,92 +12494,75 @@ msgstr ""
"Me rår ikkje til at du bruker kolon (':') i namn på spor og bussar.\n"
"Vil du bruka dette nye namnet?"
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr "Bruk det nye namnet"
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr "Endra namnet på nytt"
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "Døyp om spor"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr "Døyp om bussen"
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": rediger kommentarar"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr "treigskap"
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr "Greier ikkje laga malmappa for ruter %1"
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr "Lagra som mal"
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr "Namn på malen :"
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "Fjernstyrings-ID"
-
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "Fjernstyrings-ID:"
-
-#: route_ui.cc:1983
+#: route_ui.cc:2019
msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
+
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
+
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-"Fjernkontroll-IDen for %1 er: %2\n"
-"\n"
-"\n"
-"Du kan ikkje endra fjernkontroll-IDen for %3."
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "hovudbussen"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr ""
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "lyttebussen"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr ""
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-"Venstreklikk for å fasevenda kanal %1 på dette sporet. Høgreklikk for å sjå "
-"menyen."
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "Klikk for å visa ein meny over kanalar å invertera (fasevenda)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr ""
#: search_path_option.cc:35
msgid "Select folder to search for media"
@@ -10595,126 +12576,158 @@ msgstr "Klikk for å leggja til ein ny stad"
msgid "the session folder"
msgstr "øktmappa"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr "Send"
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr ""
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr ""
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Ny økt"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Siste øktene"
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
msgstr ""
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
msgstr ""
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Ny økt"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
msgstr ""
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "Vel øktfil"
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr ""
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr "Opna"
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Namn på økta:"
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "Lag øktmappa i :"
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "Vel mappe for økta"
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "Bruk denne malen"
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr "ingen mal"
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "kanalar"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>Bussar</b>"
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>Ingangar</b>"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>Utgangar</b>"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "Lag hovudbuss"
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "Kopla automatisk til fysiske inngangar"
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "Bruk berre"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "Kopla utgangane automatisk"
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "... til hovudbussen"
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "... til fysiske utgangar"
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importer frå økt"
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr "Element"
@@ -10735,191 +12748,191 @@ msgstr "Importer frå økt"
msgid "This will select all elements of this type!"
msgstr "Du vel alle element av dette slaget!"
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Felt"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "Verdiar (noverande på toppen)"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "Brukar"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr "Epost"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr "Nett"
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr "Organisasjon"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr "Land"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "Tittel"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "Spor nummer"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "Undertittel"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr "Gruppering"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "Artist"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "Sjanger"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "Kommentar"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "Copyright"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "Album"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Ã
r"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "Albumartist"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "Spor i alt"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "Undertittel på plata"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "Platenummer"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "Plater totalt"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "Samling"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr "ISRC"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "Folk"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "Tekstforfattar"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "Komponist"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "Dirigent"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "Remiksar"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "Arrangør"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "Teknikar"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "Produsent"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "DJ-miksar"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "Metadata|Miksar"
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr "Skule"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr "Dirigent"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr "Kurs/linje"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "Endra metadata for økta"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "Importer økt-metadata"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr "Vel økt å importera metadata frå"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "Greidde ikkje lesa denne øktfila!"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -10927,7 +12940,7 @@ msgstr ""
"Denne øktfila inneheld ikkje metadata!\n"
"Kan henda ho er i eit gamalt øktformat?"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr "Importer alt frå:"
@@ -11077,164 +13090,185 @@ msgid "Destructive crossfade length"
msgstr "Destruktiv overtoningslengd"
#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
msgid "Region fades active"
msgstr "Bolktoningar på"
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr "Bolktoningane er synlege"
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr "Media"
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr "Lydfilformat"
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr "Punktformat"
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr "32-bit flytpunkt"
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr "24-bit heiltal"
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr "16-bit heiltal"
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr "Filtype"
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "Kringkast-WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr "WAVE-64"
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr "Filplasseringar"
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr "Søk etter lydfiler i:"
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr "Sjå etter MIDI-filer i:"
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr ""
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr ""
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr ""
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr ""
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr ""
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
"Lytting til sporinnngangen fylgjer automatisk transportstatus («autoinngang»)"
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr "Bruk lytteavdelinga i denne økta"
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr ""
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr ""
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr ""
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr "MIDI-bolkkopiar er uavhengige"
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
@@ -11242,47 +13276,47 @@ msgstr ""
"Framgangsmåte for å handtera overlappande\n"
"notar på same MIDI-kanal"
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr "ikkje tillat"
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr "ikkje gjer noko spesielt"
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr "byt ut alle overlappande notar"
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr "kort ned den overlappa noten"
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr "kort ned den overlappa nye noten"
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr "byt ut båe dei overlappa med ein enkelt note"
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr "Lim til takter og taktslag"
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr "Lim nye markørar til takter og taktslag"
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr "Lim nye bolkar til takter og taktslag"
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr ""
@@ -11318,26 +13352,14 @@ msgstr "<b>Lydfilinformasjon</b>"
msgid "Timestamp:"
msgstr "Tidsstempel:"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "Knaggar:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Greidde ikkje lesa fil: %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr ""
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Fekk ikkje tilgang til lydfil: "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr "SoundFileBox: Greidde ikkje laga teikn av strengen: "
@@ -11346,181 +13368,177 @@ msgstr "SoundFileBox: Greidde ikkje laga teikn av strengen: "
msgid "Search"
msgstr "Søk"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr "Lyd- og MIDI-filer"
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr "Lydfiler"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr "MIDI-filer"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr "Alle filer"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr "Bla gjennom filer"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "Stigar"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr "Søk i knaggar"
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "Sorter:"
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "Lengst"
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "Kortast"
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "Nyast"
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "Eldste"
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "Mest nedlasta"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "Minst nedlasta"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr "Høgst vurderte"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr "LÃ¥gast vurderte"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr "Filnamn"
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "Lengd"
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr "Storleik"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr "Punktfrekvens"
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr "Lisens"
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "Søk på Freesound"
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr "Trykk for å importera filene og lukka dette vindauga"
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr "Press for å importera filene og la dette vindauga vera ope"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr ""
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr "Press for å lukka dette vindauga utan å importera nokon filer"
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "SoundFileBrowser: Greidde ikkje laga teikn av strengen: "
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr "B"
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr "kB"
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr "MB"
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr "GB"
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "Eitt spor per fil"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "Eitt spor per kanal"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr "sekvensfiler"
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "alle filene i eitt spor"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "flett filer"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "ein bolk per fil"
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "ein bolk for kvar kanal"
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "alle filene i ein bolk"
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -11528,104 +13546,104 @@ msgstr ""
"%1 kan ikkje bruka\n"
"ei eller fleire av desse filene"
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "Kopier filer til økta"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr "filtidsstempel"
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "redigeringspunkt"
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "spelehovud"
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "øktstart"
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
-msgstr "<b>Legg til filer som ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr "<b>Set inn ved</b>"
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr "<b>Punktlegging</b>"
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr "<b>Omkodingskvalitet</b>"
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "Best"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "God"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "Snøgg"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Fortast"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr "Fartsjustering (kontekst-klikk for val)"
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr "Prosent"
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr "Einingar"
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr "Fjør"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr "Hjul"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "Maksfart"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr "Spelar av"
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d halvtonar"
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d halvtonar"
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Stoppa"
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11650,7 +13668,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "%1 startar..."
@@ -11666,17 +13684,17 @@ msgstr "Fjern høgtalar"
msgid "Azimuth:"
msgstr "Asimut:"
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr "Be %1 om å spela det som blir teke opp"
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11692,15 +13710,15 @@ msgstr ""
"\n"
"Me må gjera nokre val før du byrjar å bruka programmet.</span>"
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "Velkomen til %1"
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Standardmappa for %1-økter"
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11716,11 +13734,11 @@ msgstr ""
"\n"
"<i>(Du kan lagra prosjekt kvar som helst, dette er berre standardvalet)</i>"
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Standardmappe for nye økter"
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11740,15 +13758,15 @@ msgstr ""
"\n"
"<i>(Du kan endra dette i Innstillingar-ruta seinare)</i>"
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "Lyttingsval"
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "Bruk hovudbuss direkte"
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -11756,11 +13774,11 @@ msgstr ""
"Kopla hovudbussen direkte til maskinvareutgangane. Best for grunnleggande "
"bruk."
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "Bruk eigen lyttebuss i tillegg"
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -11768,7 +13786,7 @@ msgstr ""
"Bruk ein lyttebuss mellom hovudbussen og maskinvareutgangane\n"
"for å ha betre kontroll med lyttinga utan å påverka miksen."
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11781,46 +13799,42 @@ msgstr ""
"\n"
"<i>Viss du ikkje skjønar kva dette er til, kan du bruka standardvala.</i>"
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr "Lytteavdeling"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr "Steginnlegging: %1"
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">slag"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">takt"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ">EP"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr "klanglengd"
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr "pause"
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr "g-pause"
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr "tilbake"
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr "Bruk heilnote som notelengd"
@@ -11929,11 +13943,11 @@ msgstr "Set inn bankendringsmelding"
msgid "Insert a program change message"
msgstr "Set inn ei programendringsmelding"
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr "Flytt Set inn-posisjonen bakover med ei notelengd"
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr "Flytt Set inn-posisjonen til redigeringspunktet"
@@ -11945,240 +13959,244 @@ msgstr "1/note"
msgid "Octave"
msgstr "Oktav"
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr "Set inn note A"
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr "Set inn aiss"
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr "Set inn note H"
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr "Set inn note C"
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr "Set inn ciss"
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr "Set inn note D"
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr "Set inn diss"
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr "Set inn note E"
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr "Set inn note F"
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr "Set inn fiss"
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr "Set inn note G"
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr "Set inn giss"
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr "Set inn pause på ei notelengd"
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr "Set inn pause på ei festelengd"
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr "Flytt til neste oktav"
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr "Flytt til neste notelengd"
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr "Flytt til førre notelengd"
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "Auk notelengd"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "Kort ned notelengd"
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr "Flytt til neste notevolum"
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr "Flytt til førre notevolum"
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr "Auk notevolum"
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr "Mink notevolum"
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "Byt til fyrste oktaven"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "Byt til andre oktaven"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "Byt til tredje oktaven"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "Byt til fjerde oktaven"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "Byt til femte oktaven"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "Byt til sjette oktaven"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "Byt til sjuande oktaven"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "Byt til åttande oktaven"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "Byt til niande oktaven"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "Byt til tiande oktaven"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "Byt til ellevte oktaven"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Skru på triolar"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Skru på akkordskriving"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Hald desse notane i notelengda"
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr "Bruk heilnote som notelengd"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr "Set notelengda til 1/2"
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr "Set notelengda til 1/3"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr "Set notelengda til 1/4"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr "Set notelengda til 1/8"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr "Bruk 1/16 som notelengd"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr "Bruk 1/32 som notelengd"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr "Bruk 1/64 som notelengd"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr "Bruk piano pianissimo som notevolum"
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr "Bruk pianissimo som notevolum"
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr "Bruk piano som notevolum"
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr "Bruk mezzo piano som notevolum"
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr "Bruk mezzo forte som notevolum"
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr "Bruk forte som notevolum"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr "Bruk forte fortissimo som notevolum"
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Skru på triolar"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr "Ingen punkteringar"
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr "Skru på punkteringar"
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr "Skru på dobbelpunkteringar"
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr "Skru på trippelpunkteringar"
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Skru på akkordskriving"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Hald desse notane i notelengda"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr "Stereopanorering"
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr "Breidd"
@@ -12186,176 +14204,189 @@ msgstr "Breidd"
msgid "Strip Silence"
msgstr "Skjer bort stille"
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Dørstokk"
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr "Minstelengd"
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr "Toningslengd"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "takt:"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "slag:"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr "Pulsnote"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Endra tempo"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "heil"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "andre"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "tredjedel"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "fjerdedel"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "Ã¥ttendel"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "sekstendel"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "toogtredvedel"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "sekstifiredel"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "hundreogtjueåttedel"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Slag per minutt:"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr "Tempoet byrjar på"
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr "uforståeleg pulsnotetype (%1)"
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Endra taktart"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "Noteverdi:"
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Slag per takt:"
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr "Taktarten byrjar ved takt:"
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
msgstr "uforståeleg taktartnotetype (%1)"
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Mørk bunad"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Lys bunad"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Nullstill til standard"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr "Teikna «flate» knappar"
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Fargelegg bolkar med sporfarga"
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objekt"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12363,92 +14394,95 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] "lengda no, %1 ramme, er utanfor rekkjevidda for %2"
msgstr[1] "lengda no, %1 rammer, er utanfor rekkjevidda for %2"
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Fort og gale"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Hopp over anti-alias"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Innhald:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr "Mink tidsforvrenging"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr "Behald formantar"
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr "TidsFXdialog"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr "Endra tonehøgd på lydmaterialet"
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr "Tidsstrekk lydmaterialet"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "Oktavar:"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "Halvtonar:"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr "Cent:"
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr "Tid|Forskyv"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr "TidsFXknapp"
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "Strekk/krymp"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr "<b>Framgang</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Ta opp frå auto-innslagspunktet"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Stopp opptak ved slutten av innslagsområdet"
@@ -12516,94 +14550,130 @@ msgstr "Transponer MIDI"
msgid "Transpose"
msgstr "Transponer"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr "Lastar standard brukarflatefil %1"
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr "greier ikkje lesa standardbrukarflatefila \"%1\""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr "standardbrukarflatefila \"%1\" vart ikkje lasta."
-#: ui_config.cc:177
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr ""
-#: ui_config.cc:222
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr ""
-#: ui_config.cc:227
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr ""
-#: ui_config.cc:317
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr "Lastar eigenvald brukarflatefil %1"
-#: ui_config.cc:320
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr "greier ikkje lesa brukarflatefila \"%1\""
-#: ui_config.cc:325
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr "den eigenvalde brukarflatefila \"%1\" vart ikkje lasta."
-#: ui_config.cc:333
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr "finn inga grensesnitt-oppsettsfil, lerretet vil verka øydelagt."
-#: ui_config.cc:351
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr "Oppsettsfila %1 vart ikkje lagra"
-#: ui_config.cc:592
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr ""
-#: ui_config.cc:662
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr "Finn ikkje brukarflatefila %1 i søkjestigen %2. %3 vil sjå rar ut"
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "Feil med XPM-tittellinja %1"
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr "greier ikkje finna XPM-fil for %1"
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr "greier ikkje finna ikonbilete for %1 ved bruk av %2"
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr "Fekk unntak når me lasta ikonet %1"
+#: utils.cc:818
+msgid "Overwrite"
+msgstr "Skriv over"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr ""
@@ -12648,32 +14718,48 @@ msgstr ""
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12683,25 +14769,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12723,7 +14809,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12732,10 +14818,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12745,9 +14835,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12756,83 +14845,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12852,7 +14941,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12862,239 +14951,230 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr ""
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr ""
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr ""
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr ""
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr ""
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr ""
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr ""
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr ""
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr ""
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr ""
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr ""
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr ""
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr ""
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr ""
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr ""
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr ""
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr ""
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr ""
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr ""
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr ""
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr ""
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr ""
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr ""
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr ""
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr ""
@@ -13112,13 +15192,379 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+#~ msgid "Busses"
+#~ msgstr "Bussar"
+
+#~ msgid "Display model"
+#~ msgstr "Visingsmodell"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Samansette grafar for kvart spor"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Samansett graf for alle spor"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normaliser verdiar"
+
+#~ msgid "Locations"
+#~ msgstr "Stader"
+
+#~ msgid ""
+#~ "A snapshot already exists with that name. Do you want to overwrite it?"
+#~ msgstr "Dette snøggbiletet finst frå før. Vil du skriva over det?"
+
+#~ msgid "Playhead follows Range Selections and Edits"
+#~ msgstr "Spelehovudet fylgjer områdeval og redigeringar"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Når knappen er trykt inn, blir noko lytta på.\n"
+#~ "Klikk for å slå av lyttinga."
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr "Denne skjermen er ikkje høg nok til å visa miksarvindauga"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Snøggbilete..."
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Eksporter økta til lydfil(er)..."
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Vis verktylinene"
+
+#~ msgid "Reference"
+#~ msgstr "Referanse"
+
+#~ msgid "Transition To Roll"
+#~ msgstr "Overgang til rulling"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "Overgang til baklengs"
+
+#~ msgid "Set From Playhead"
+#~ msgstr "Set ut frå spelehovudet"
+
+#~ msgid "Fill Range with Region"
+#~ msgstr "Fyll området med bolken"
+
+#~ msgid "Consolidate Range With Processing"
+#~ msgstr "Sikra området med prosessering"
+
+#~ msgid "Bounce Range to Region List With Processing"
+#~ msgstr "Miks ned området til bolkliste med prosessering"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Spel frå redigeringspunktet"
+
+#~ msgid "Play From Start"
+#~ msgstr "Spel frå starten"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoom-fokus"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Bryt og dra eller vel ingen"
+
+#~ msgid "Playhead To Next Grid"
+#~ msgstr "Spelehovudet til neste gitter"
+
+#~ msgid "Playhead To Previous Grid"
+#~ msgstr "Spelehovudet til førre gitter"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importer frå økt"
+
+#~ msgid "Show Logo"
+#~ msgstr "Vis logo"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "Lastar redigerinsbindingar frå %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr "Fann ikkje editor.bindings i søkjestigen %1"
+
+#~ msgid "Snap Position To Grid"
+#~ msgstr "Fest posisjonen til gitteret"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Set inn bolk frå lista"
+
+#~ msgid "group|G"
+#~ msgstr "Gruppe|G"
+
+#~ msgid "relative|Rel"
+#~ msgstr "Relativt|Rel"
+
+#~ msgid "mute|M"
+#~ msgstr "Demp|D"
+
+#~ msgid "solo|S"
+#~ msgstr "Solo|S"
+
+#~ msgid "monitoring|Mon"
+#~ msgstr "Lytting|Mon"
+
+#~ msgid "selection|Sel"
+#~ msgstr "Utval|Val"
+
+#~ msgid "active|A"
+#~ msgstr "aktiv|A"
+
+#~ msgid "File Exists!"
+#~ msgstr "Fila eksisterer!"
+
+#~ msgid "Overwrite Existing File"
+#~ msgstr "Skriv over eksisterande fil"
+
+#~ msgid "End point trim"
+#~ msgstr "Skjer sluttpunkt"
+
+#~ msgid "duplicate selection"
+#~ msgstr "klon utvalet"
+
+#~ msgid "tracks"
+#~ msgstr "spor"
+
+#~ msgid "busses"
+#~ msgstr "bussar"
+
+#~ msgid "L"
+#~ msgstr "V"
+
+#~ msgid "G"
+#~ msgstr "G"
+
+#~ msgid "O"
+#~ msgstr "O"
+
+#~ msgid "I"
+#~ msgstr "I"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "SI"
+#~ msgstr "SI"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Vis spor med bolkar under spelehovudet"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>Lag filnamn av desse byggeklossane:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>(Omtrentleg) filnamn: \"%1\"</i></small>"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Lag ny gruppe frå"
+
+#~ msgid "Insert time on all the track's playlists"
+#~ msgstr "Set inn tid på alle spelelistene til sporet"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Vel ei handling. Så trykkjer du tasten/tastane som skal utføra handlinga."
+
+#~ msgid "Main_menu"
+#~ msgstr "Hovud_meny"
+
+#~ msgid "redirectmenu"
+#~ msgstr "omdirigeringsmeny"
+
+#~ msgid "Editor_menus"
+#~ msgstr "Redigerings_menyar"
+
+#~ msgid "ProcessorMenu"
+#~ msgstr "Prosessormeny"
+
+#~ msgid "Copyright (C) 1999-2012 Paul Davis"
+#~ msgstr "Copyright (C) 1999-2012 Paul Davis"
+
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "Lasta miksarbindingar frå %1"
+
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "Fann ikkje mixer.bindings i søkjestigen %1"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Kommentarar*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Kmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Klikk for å leggja til/redigera kommentarar"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "Fjernstyrings-ID..."
+
+#~ msgid ""
+#~ " -k, --keybindings filename Name of key bindings to load (default is ~/."
+#~ "ardour3/ardour.bindings)\n"
+#~ msgstr ""
+#~ " -k, --keybindings-filename Namn på snøggtastfil som skal lastast "
+#~ "(standard er ~/.ardour3/ardour.bindings)\n"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Oppdater utvidingar"
+
+#~ msgid "alsa_pcm"
+#~ msgstr "alsa_pcm"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Du kan ikkje leggja til ein port her, fordi den fyrste signalprosessen på "
+#~ "sporet eller bussen ikkje godtek det nye oppsettet."
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Tastaturutforming:"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Skriftskalering:"
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr ""
+#~ "Dobbelklikk på eit namn for å redigera innstillingane for ein aktiv "
+#~ "protokoll"
+
+#~ msgid "Sync/Slave"
+#~ msgstr "Synk/slave"
+
+#~ msgid "only in region gain mode"
+#~ msgstr "berre i bolkvolum-modus"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Vis zoom-verktylina"
+
+#~ msgid "Synchronise editor and mixer selection"
+#~ msgstr "Samkøyr redigeringa og miksarvalet"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / demp"
+
+#~ msgid "Sound MIDI notes as they are selected"
+#~ msgstr "Lytt på MIDI-notar medan du vel dei"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Fjernstyrings-ID for kontrollflate"
+
+#~ msgid "assigned by user"
+#~ msgstr "fastsett av brukaren"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "fylgjer miksaren"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Brytargap"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Du kan ikkje laga eit spor med det namnet, fordi det er halde att for %1"
+
+#~ msgid "Select From All..."
+#~ msgstr "Vel frå alt..."
+
+#~ msgid ""
+#~ "Do you really want to remove track \"%1\" ?\n"
+#~ "\n"
+#~ "You may also lose the playlist used by this track.\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Vil du verkeleg sletta sporet \"%1\"?\n"
+#~ "\n"
+#~ "Det kan hende du mistar spelelister for sporet òg.\n"
+#~ "\n"
+#~ "(Du kan ikkje angra dette, og øktfila vil bli overskriven)"
+
+#~ msgid ""
+#~ "Do you really want to remove bus \"%1\" ?\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Vil du verkeleg sletta bussen \"%1\"?\n"
+#~ "\n"
+#~ "(Du kan ikkje angra, og øktfila vil bli overskriven!)"
+
+#~ msgid "Remove track"
+#~ msgstr "Fjern spor"
+
+#~ msgid "Remove bus"
+#~ msgstr "Fjern buss"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "Fjernstyrings-ID"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "Fjernstyrings-ID:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "Fjernkontroll-IDen for %1 er: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Du kan ikkje endra fjernkontroll-IDen for %3."
+
+#~ msgid "the master bus"
+#~ msgstr "hovudbussen"
+
+#~ msgid "the monitor bus"
+#~ msgstr "lyttebussen"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track. Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Venstreklikk for å fasevenda kanal %1 på dette sporet. Høgreklikk for å "
+#~ "sjå menyen."
+
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr "Klikk for å visa ein meny over kanalar å invertera (fasevenda)"
+
+#~ msgid "Broadcast WAVE"
+#~ msgstr "Kringkast-WAVE"
+
+#~ msgid "WAVE"
+#~ msgstr "WAVE"
+
+#~ msgid "Press to import selected files and close this window"
+#~ msgstr "Trykk for å importera filene og lukka dette vindauga"
+
+#~ msgid "Press to import selected files and leave this window open"
+#~ msgstr "Press for å importera filene og la dette vindauga vera ope"
+
+#~ msgid "<b>Add files as ...</b>"
+#~ msgstr "<b>Legg til filer som ...</b>"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Mørk bunad"
+
+#~ msgid "Light Theme"
+#~ msgstr "Lys bunad"
+
+#~ msgid "Contents:"
+#~ msgstr "Innhald:"
+
#~ msgid ""
#~ "%1\n"
#~ "(built from revision %2)"
diff --git a/gtk2_ardour/po/pl.mo b/gtk2_ardour/po/pl.mo
new file mode 100644
index 0000000..414d3a0
Binary files /dev/null and b/gtk2_ardour/po/pl.mo differ
diff --git a/gtk2_ardour/po/pl.po b/gtk2_ardour/po/pl.po
index 8aede27..9d2a9a7 100644
--- a/gtk2_ardour/po/pl.po
+++ b/gtk2_ardour/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk2_ardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2008-04-10 10:47+0100\n"
"Last-Translator: Piotr Zaryk <pzaryk at gmail.com>\n"
"Language-Team: Polish <pzaryk at gmail.com>\n"
@@ -20,255 +20,287 @@ msgstr ""
"X-Poedit-Language: Polish\n"
"X-Poedit-Country: POLAND\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr ""
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr ""
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr ""
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr ""
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr ""
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr ""
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr ""
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr ""
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr ""
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr "Carl Hetherington"
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr "Rob Holland"
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr "Robert Jordens"
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr "Stefan Kersten"
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr "Armand Klenk"
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr "Matt Krai"
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr "Colin Law"
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr "Joshua Leach"
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr "Ben Loftis"
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr "Nick Mainsbridge"
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr "Tim Mayberry"
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr "Doug Mclain"
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr "Jack O'Quin"
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr "Nimal Ratnayake"
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr "David Robillard"
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr "Taybin Rutkin"
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr "Sampo Savolainen"
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr "Per Sigmond"
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr "Mark Stewart"
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr "Roland Stigge"
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr "Petter Sundlöf"
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr "Mike Täht"
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -277,7 +309,7 @@ msgid ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
msgstr ""
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -289,14 +321,14 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
msgstr ""
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -304,7 +336,7 @@ msgstr ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -314,21 +346,21 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
msgstr ""
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
msgstr ""
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -336,170 +368,224 @@ msgstr ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
msgstr ""
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
msgstr ""
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
msgstr ""
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr ""
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr ""
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr ""
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr ""
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr ""
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr ""
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr ""
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr ""
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr ""
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
msgstr ""
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr ""
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr ""
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr ""
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr ""
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr ""
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr ""
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr ""
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr ""
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -508,60 +594,61 @@ msgid ""
"track instead."
msgstr ""
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Normalny"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr ""
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "TaÅma"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Mono"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "Stereo"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr ""
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr ""
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr ""
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr ""
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr ""
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr ""
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr ""
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr ""
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr ""
@@ -569,177 +656,215 @@ msgstr ""
msgid "Ambiguous File"
msgstr ""
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
"Please select the path that you want to get the file from."
msgstr ""
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr ""
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "ŹródÅo sygnaÅu"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Zaznaczone zakresy"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Zaznaczone obszary"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Tryb wyÅwietlania"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
msgstr ""
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:49
+msgid "Fit dB range"
msgstr ""
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
msgstr ""
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizacja wartoÅci"
-
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "Okno analizy FFT"
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr "Analiza spektrum"
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Åcieżka"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "WyÅwietl"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Analizuj ponownie"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr ""
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "OdsÅuch"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Solo"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "SprzÄżenie zwrotne"
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr ""
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Preferencje"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr ""
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "O programie"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "PoÅożenia"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr ""
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr ""
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr ""
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr ""
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr ""
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Duży zegar"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr ""
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -747,45 +872,45 @@ msgid ""
"the audio backend and save the session."
msgstr ""
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr ""
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -796,39 +921,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr ""
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr ""
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -837,23 +962,23 @@ msgid ""
"controlled by %2"
msgstr ""
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "Nie pokazuj tego okna wiÄcej"
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr ""
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr ""
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr ""
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -862,11 +987,11 @@ msgid ""
"\"Just quit\" option."
msgstr ""
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr ""
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -877,7 +1002,7 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -888,74 +1013,107 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Prompter"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr ""
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr ""
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr ""
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr ""
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr ""
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr ""
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr ""
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr ""
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr ""
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr ""
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr ""
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr ""
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -963,159 +1121,178 @@ msgid ""
"\">%<PRIu32>%%</span>"
msgstr ""
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr ""
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr ""
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr ""
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr ""
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr ""
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Poprzednie sesje"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Otwieranie sesji"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr ""
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr ""
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr "Nie możesz dodaÄ Åcieżki lub szyny bez otwierania sesji."
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
-msgstr ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
msgstr ""
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
msgstr ""
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr ""
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
msgstr ""
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr ""
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
msgstr ""
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr ""
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr ""
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-szablon"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1125,59 +1302,89 @@ msgstr ""
"%1\n"
"już istnieje. OtworzyÄ jÄ
?"
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr ""
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr ""
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr ""
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr ""
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr ""
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Sesja \"%1 (zrzut %2)\" nie zostaÅa zaÅadowana poprawnie"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "BÅÄ
d wczytywania"
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Sesja \"%1 (zrzut %2)\" nie zostaÅa zaÅadowana poprawnie"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "Nie udaÅo siÄ utworzyÄ sesji w \"%1\""
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr ""
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr ""
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1189,19 +1396,19 @@ msgstr ""
"WciÄ
ż mogÄ
zawieraÄ obszary\n"
"wymagajÄ
ce obecnoÅci nieużywanych plików."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr ""
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr ""
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr ""
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1212,7 +1419,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1235,90 +1442,126 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr ""
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
"Clean-up will move all unused files to a \"dead\" location."
msgstr ""
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Okno dialogowe czyszczenia"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr ""
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "usuniÄty plik"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr ""
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr ""
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr ""
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr ""
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr ""
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr ""
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "nie można otworzyÄ %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr ""
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr ""
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1327,23 +1570,23 @@ msgid ""
"quickly enough to keep up with recording.\n"
msgstr ""
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr ""
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr ""
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1352,11 +1595,11 @@ msgid ""
"quickly enough to keep up with playback.\n"
msgstr ""
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr ""
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1367,42 +1610,43 @@ msgid ""
"what you would like to do.\n"
msgstr ""
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Ignorowanie dane z awarii"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "PrzywrÃ³Ä dane z awarii"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "BÅÄdna czÄstotliwoÅÄ próbkowania"
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
"audio may be played at the wrong sample rate.\n"
msgstr ""
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "Nie Åaduj sesji"
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "ZaÅaduj sesjÄ mimo to"
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1414,72 +1658,97 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI: nie można ustawiÄ edytora"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "UI: nie można ustawiÄ miksera"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Odtwórz od poÅożenia gÅowicy"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Zatrzymaj odtwarzanie"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr ""
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Odtwórz zakres/zaznaczenie"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Przejdź do poczÄ
tku sesji"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Przejdź do koÅca sesji"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Zakres pÄtli"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
msgstr ""
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "PowrÃ³Ä do poczÄ
tku ostatniego odtwarzania przy zatrzymaniu"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr ""
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "WÅÄ
cz/wyÅÄ
cz metronom"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1487,19 +1756,17 @@ msgstr ""
"Gdy aktywne, gdzieÅ wÅÄ
czone jest solo.\n"
"Kliknij by wyÅÄ
czyÄ solo wszÄdzie."
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-"Gdy aktywne, odsÅuchiwanie jest wÅÄ
czone\n"
-"Kliknij, by zatrzymaÄ odsÅuchiwanie."
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr ""
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1507,7 +1774,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1515,450 +1782,559 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[BÅAD]: "
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[OSTRZEŻENIE]: "
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[INFORMACJA]: "
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Autopowracanie"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr ""
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr ""
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "Różne"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Ustawianie edytora"
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Ustawianie miksera"
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Wczytywanie historii sesji"
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI: nie można ustawiÄ edytora"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UI: nie można ustawiÄ miksera"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Preferencje"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Edytor"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr ""
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr ""
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr ""
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Sesja"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Synchronizacja"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Opcje"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Okno"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Pomoc"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Skróty"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Format pliku dźwiÄkowego"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Format pliku"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Format próbkowania"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "UrzÄ
dzenia sterujÄ
ce"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Wtyczki"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "Ustawienia metrum"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr ""
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Czas przytrzymania"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "ObsÅuga liczb zdenormalizowanych"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr ""
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr ""
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr ""
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Zamknij"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr ""
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr ""
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr ""
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr ""
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Zapisz szablon"
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr ""
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr ""
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "Eksportuj"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr ""
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr ""
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "ZakoÅcz"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Ukryj"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Maksymalizacja edytora"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr ""
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
msgstr ""
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
msgstr ""
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
msgstr ""
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr ""
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr ""
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr ""
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr ""
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
msgstr ""
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr ""
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr ""
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr ""
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Zapisz"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Nagrywanie i odtwarzanie"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Zatrzymaj"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr ""
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Uruchom/Zatrzymaj"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr ""
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr ""
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Do przodu"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Od tyÅu"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Odtwórz zakres pÄtli"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr ""
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr ""
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "WÅÄ
cz nagrywanie"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "Rozpocznij nagrywanie"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "PrzewiÅ do tyÅu"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "PrzewiÅ do tyÅu (powoli)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "PrzewiÅ do tyÅu (szybko)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "PrzewiÅ do przodu"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "PrzewiÅ do przodu (powoli)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "PrzewiÅ do przodu (szybko)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "Do punktu zerowego"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Do poczÄ
tku"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "Do koÅca"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr ""
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1966,257 +2342,275 @@ msgstr ""
msgid "Timecode"
msgstr "Zegar"
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Takty i uderzenia"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minuty i Sekundy"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Próbki"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "WejÅcie przeÅÄ
cznika"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "WejÅcie"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "WyjÅcie przeÅÄ
cznika"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "WyjÅcie"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "We/wy przeÅÄ
cznika"
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr ""
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Metronom"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "WejÅcie dźwiÄku"
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Autoodtwarzanie"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr ""
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr ""
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr ""
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Procenty"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "PóÅtony"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "WysyÅanie MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "WysyÅanie MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Używanie MMC"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr ""
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr ""
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr ""
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr ""
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr ""
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr ""
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr ""
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr ""
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
msgstr ""
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr ""
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr ""
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr ""
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr ""
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr ""
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr ""
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Tempo"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Metrum"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "bÅÄ
d programowania: %1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "bÅÄ
d programowania: %1 %2"
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "Takty:Uderzenia"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "Minuty i sekundy"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr ""
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr ""
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr ""
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr ""
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr ""
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr ""
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "dodaj punkt kontrolny wzmocnienia"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr ""
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "przesuÅ zdarzenie automatyki"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "usuÅ punkt kontrolny"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr ""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr ""
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2228,63 +2622,59 @@ msgstr "stan automatyki"
msgid "hide track"
msgstr "ukryj ÅcieżkÄ"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr ""
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Odtwórz"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Zapisz"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Dotyk"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "wyczyÅÄ automatyzacjÄ"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Ukryj"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "WyczyÅÄ"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Stan"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr ""
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Liniowy"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Tryb"
@@ -2300,35 +2690,38 @@ msgstr ""
msgid "Direction:"
msgstr ""
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "WejÅcie"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "WyjÅcie"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Edycja"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "UsuÅ"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Nazwa"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Utwórz"
@@ -2344,6 +2737,39 @@ msgstr ""
msgid "Rename Channel"
msgstr ""
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Obiekt"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Kolor"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr ""
@@ -2356,6 +2782,42 @@ msgstr ""
msgid "Value"
msgstr ""
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr ""
@@ -2393,2060 +2855,2155 @@ msgstr ""
msgid "Velocity"
msgstr ""
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr ""
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr ""
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr ""
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "Klatki CD"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Sekundy"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minuty"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr ""
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr ""
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Uderzenia/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr ""
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr ""
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr ""
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Uderzenia/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr ""
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr ""
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr ""
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Uderzenia/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr ""
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr ""
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr ""
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Uderzenia/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Uderzenia/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr ""
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Uderzenia"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Takty"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Znaczniki"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "PoczÄ
tek obszaru"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Koniec obszaru"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "Synchronizacja obszaru"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Granice obszaru"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "Bez siatki"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Siatka"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "PrzyciÄ
ganie"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "GÅowica"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Znacznik"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Wskaźnik myszy"
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Ålizg"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Klocek"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Zablokuj"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Lewa"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Prawa"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Årodek"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr "Punkt edycji"
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr ""
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr "PÅynnie"
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr ""
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr ""
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr ""
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr ""
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr ""
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "min:s"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Znaczniki poÅożenia"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Znaczniki zakresu"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Zakresy pÄtli/przeÅÄ
cznika"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "Znaczniki CD"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "tryb"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "Znaczniki"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Obszar"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr ""
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "Zrzuty"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr ""
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr ""
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Edytor"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "PÄtla"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "PrzeÅÄ
cznik"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr ""
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr ""
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr ""
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Wolno"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Szybko"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "WyÅÄ
cz"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "WÅÄ
cz"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Zamroź"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "Odmroź"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr ""
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr "Odtwórz zakres"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "ZapÄtl zakres"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr ""
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr ""
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr ""
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr ""
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr ""
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "Oddziel"
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr ""
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Wszystko w zakresie"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr ""
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr ""
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Dodaj znaczniki zakresu"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr ""
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Duplikuj"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr ""
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr ""
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr ""
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Od punktu edycji"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr ""
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "ZapÄtl obszar"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr ""
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr ""
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr ""
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr "OdwrÃ³Ä zaznaczenie"
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr ""
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr ""
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Wszystko za punktem edycji"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Wszystko przed punktem edycji"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "Wszystko za gÅowicÄ
"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "Wszystko przed gÅowicÄ
"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr ""
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Zaznacz"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "Wytnij"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "Skopiuj"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "Wklej"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Wyrównaj"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Wyrównaj relatywnie"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "Wstaw zaznaczony obszar"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr ""
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr ""
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr ""
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr ""
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr ""
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "Pchnij"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr ""
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr ""
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr ""
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr ""
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr ""
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr ""
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
msgstr ""
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr ""
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr ""
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "PowiÄksz"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Pomniejsz"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Dopasuj do sesji"
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
msgstr "PowiÄkszanie do"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr ""
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr ""
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr ""
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr ""
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "Tryb przyciÄ
gania"
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Punkt edycji"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr ""
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
msgstr ""
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr ""
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr ""
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Powtórz"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Powtórz (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Powiel"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr ""
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "Zaznaczenie"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr ""
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr ""
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr ""
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr ""
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr ""
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr ""
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr ""
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr ""
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr ""
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr ""
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr ""
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr ""
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr ""
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr ""
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr ""
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr ""
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr ""
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr ""
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr ""
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr ""
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr ""
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
"If it is deleted, audio files used by it alone will be cleaned."
msgstr ""
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr ""
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr ""
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "Anuluj"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "nowe listy odtwarzania"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "skopiuj listy odtwarzania"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "wyczyÅÄ listy odtwarzania"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr ""
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr ""
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr ""
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr ""
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr ""
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Automatyczne ÅÄ
czenie"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "PrzejÅcia krzyżowe"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "PrzenieÅ znacznik"
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "Operacje na zakresach"
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "Zaznacz obszary"
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Punkt edycji"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "PrzejÅcia"
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr ""
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "Obszar"
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Warstwy"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Pozycja"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Przytnij"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "Wzmocnienie"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Zakresy"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr ""
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr "ÅÄ
cze"
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "PowiÄkszanie do"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr ""
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Zmniejszanie metrum"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Przytrzymanie metrum"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr ""
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Różne"
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Monitorowanie"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "Wskaźnik"
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Zegar podstawowy"
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr ""
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Operacje na obszarach"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Linijki"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr ""
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "Przewijanie"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Zegar dodatkowy"
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "Podklatki"
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "Klatek na sekundÄ licznika czasu"
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Rozmiar"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "NarzÄdzia"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "Widok"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "PowiÄkszenie"
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Mikser obok edytora"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr ""
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Do granicy nastÄpnego obszaru"
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Do granicy poprzedniego obszaru"
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Do poczÄ
tku nastÄpnego obszaru"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Do koÅca nastÄpnego obszaru"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Do nastÄpnej synchronizacji obszaru"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Do poczÄ
tku poprzedniego obszaru"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Do koÅca poprzedniego obszaru"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Do poprzedniej synchronizacji obszaru"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr ""
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr ""
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr ""
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr ""
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr ""
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr ""
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr ""
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr ""
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr ""
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "GÅowica do poczÄ
tku zakresu"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "GÅowica do koÅca zakresu"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr ""
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "Nic"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr ""
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr ""
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr ""
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Wszystko w zakresie przeÅÄ
cznika"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Wszystko w zakresie pÄtli"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr ""
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr ""
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr ""
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr ""
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr ""
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr ""
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr ""
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr ""
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr ""
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr ""
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr ""
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "Dodaj znacznik w poÅożeniu gÅowicy"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr ""
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr ""
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr ""
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "Do przodu"
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "Do tyÅu"
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr ""
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr ""
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr ""
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr ""
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr ""
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr ""
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "PrzewiÅ Åcieżki do góry"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "PrzewiÅ Åcieżki na dóÅ"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "PrzesuÅ Åcieżki w górÄ"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "PrzesuÅ Åcieżki w dóÅ"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "PrzewiÅ do tyÅu"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "PrzewiÅ do przodu"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "WyÅrodkuj"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr ""
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "GÅowica do przodu"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "GÅowica do tyÅu"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr ""
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr ""
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr ""
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr ""
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "Zaznaczenie"
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Do kursora myszy"
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Do kursora myszy"
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr ""
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr ""
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr ""
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Eksport zakresu"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr ""
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr ""
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "Przytnij"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr ""
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr ""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr ""
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr ""
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Rozpocznij zakres"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "ZakoÅcz zakres"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "PodÄ
żanie za gÅowicÄ
"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "UsuÅ ostatnie nagranie"
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr ""
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Czas wstawienia"
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "PrzeÅÄ
cz aktywnoÅÄ"
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "UsuÅ"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr ""
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "NajwiÄkszy"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "WiÄkszy"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Duży"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "MaÅy"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr ""
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Do lewej"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Do prawej"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Do Årodka"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Do gÅowicy"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Do kursora myszy"
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr ""
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr ""
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr ""
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr ""
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "NarzÄdzie obiektów"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "NarzÄdzie zakresów"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr ""
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr ""
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr ""
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr ""
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr ""
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr ""
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr ""
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr ""
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr ""
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Tryb przyciÄ
gania"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr ""
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr ""
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr ""
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr ""
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr ""
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr ""
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr ""
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr ""
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr ""
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr ""
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr ""
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr ""
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr ""
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr ""
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr ""
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr ""
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr ""
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr ""
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr ""
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr ""
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr ""
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr ""
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr ""
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr ""
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr ""
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr ""
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr ""
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr ""
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr ""
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr ""
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr ""
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr ""
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr ""
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr ""
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "PÄtla/przeÅÄ
cznik"
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Minuty i sekundy"
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr ""
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr ""
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr ""
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr ""
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Sortuj"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "WyÅwietl wszystko"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr ""
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "RosnÄ
co"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "MalejÄ
co"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "WedÅug nazwy obszaru"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "WedÅug dÅugoÅci obszaru"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "WedÅug pozycji obszaru"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "WedÅug timestamp obszaru"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "WedÅug poczÄ
tku obszaru w pliku"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "WedÅug koÅca obszaru w pliku"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "WedÅug nazwy pliku źrodÅowego"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "WedÅug dÅugoÅci pliku źródÅowego"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "WedÅug daty utworzenia pliku źródÅowego"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "WedÅug systemu plików źródÅa"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr ""
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importuj"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr ""
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr ""
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr ""
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr ""
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr ""
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "WyÅwietlanie logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr "bÅÄ
d programowania: %1: %2"
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr ""
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr ""
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr ""
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr ""
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr ""
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr ""
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr ""
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Wyciszenie"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr ""
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "OdwróÄ"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr ""
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr ""
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr ""
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr ""
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "MÄtna"
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Stopniowe wzmocnienie"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Stopniowe wyciszenie"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr ""
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "WypeÅnij ÅcieżkÄ"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Ustaw zakres pÄtli"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr ""
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr ""
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr ""
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr ""
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr ""
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr ""
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr ""
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "ZmieÅ dÅugoÅÄ stopniowego wzmocnienia"
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "ZmieÅ dÅugoÅÄ stopniowego wyciszenia"
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr ""
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr ""
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr ""
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr ""
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr ""
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr ""
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr ""
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr ""
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr ""
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Resetuj obwiedniÄ"
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr ""
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "WÅÄ
cz obwiedniÄ"
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr ""
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr ""
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr ""
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Ustaw zakres zaznaczenia"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr ""
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr ""
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr ""
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr ""
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr ""
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr ""
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr ""
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr ""
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr ""
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr ""
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr ""
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr ""
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr ""
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr ""
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr ""
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr ""
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr ""
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr ""
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr ""
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr ""
@@ -4472,32 +5029,33 @@ msgid ""
"%2 as a new source, or skip it?"
msgstr ""
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Anuluj import"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Edytor: nie można otworzyÄ pliku \"%1\", (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Anuluj caÅy import"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Nie osadzaj tego"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Osadź wszystko bez zadawania pytaÅ"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr ""
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4506,207 +5064,276 @@ msgstr ""
"CzÄstotliwoÅÄ próbkowania tego pliku nie odpowiada czÄstotliwoÅci "
"próbkowania sesji!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Osadź mimo to"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr ""
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr ""
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "przesuÅ oznaczenie metrum"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "skopiuj oznaczenie metrum"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "przesuÅ oznaczenie metrum"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "przesuÅ znacznik tempa"
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "kopiuj znacznik tempa"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "przesuÅ znacznik tempa"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "zmieÅ dÅugoÅÄ stopniowego wzmocnienia"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr ""
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "przesuÅ znacznik"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr ""
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr ""
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr ""
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "bez nazwy"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr ""
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr ""
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
msgstr ""
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr ""
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
msgstr ""
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr ""
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr ""
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr ""
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr ""
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Nagr"
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr ""
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr ""
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
msgstr ""
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr ""
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr ""
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr ""
#: editor_group_tabs.cc:176
@@ -4721,300 +5348,341 @@ msgstr ""
msgid "end"
msgstr ""
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "dodaj znacznik"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "ustaw zakres pÄtli"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "ustaw zakres przeÅÄ
cznika"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr ""
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "nowy znacznik zakresu"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "usuÅ znacznik"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr ""
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr ""
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "PrzesuÅ znacznik do gÅowicy"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr ""
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr ""
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr ""
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr ""
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr ""
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Ukryj zakres"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr ""
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "UsuÅ zakres"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Oddziel obszar w zakresie"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Zaznacz zakres"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Ustaw zakres przeÅÄ
cznika"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Nazwa:"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "ZmieÅ nazwÄ znacznika"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "ZmieÅ nazwÄ zakresu"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "ZmieÅ nazwÄ"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "zmieÅ nazwÄ znacznika"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr ""
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr ""
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
msgstr ""
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr ""
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Punkt koÅcowy przyciÄcia"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Nazwa obszaru:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "podziel"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr ""
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "pchnij obszary do przodu"
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "pchnij pozycjÄ do przodu"
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "pchnij obszar do tyÅu"
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "pchnij do przodu"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr ""
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr ""
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr ""
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr ""
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "wyczyÅÄ znaczniki"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "wyczyÅÄ zakresy"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "wyczyÅÄ poÅożenia"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "wstaw obszar"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr ""
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr ""
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr ""
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr ""
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr ""
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr ""
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr ""
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "ZmieÅ nazwÄ obszaru"
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr "Nazwa:"
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "oddziel"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr ""
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "przytnij do zaznaczenia"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "ustaw punkt synchronizacji"
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr ""
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr ""
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr ""
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr ""
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr ""
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "przytnij przód"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "przytnij tyÅ"
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "przytnij do pÄtli"
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "przytnij do przeÅÄ
cznika"
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr ""
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5022,11 +5690,11 @@ msgid ""
"input or vice versa."
msgstr ""
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr ""
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5035,23 +5703,23 @@ msgid ""
"Freezing will only process the signal as far as the first send/insert/return."
msgstr ""
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr ""
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr ""
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr ""
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Anuluj zamrożenie"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5060,47 +5728,47 @@ msgid ""
"You can do this without processing, which is a different operation."
msgstr ""
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr ""
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "zgraj zakres"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr ""
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "wytnij"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "skopiuj"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "wyczyÅÄ"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr ""
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "usuÅ obszar"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplikuj zaznaczenie"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "pchnij ÅcieżkÄ"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5108,136 +5776,156 @@ msgstr ""
"Na pewno usunÄ
Ä ostatnie nagranie?\n"
"(Ta operacja nie może zostaÄ cofniÄta)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Nie usuwaj niczego"
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Tak, usuÅ go."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr ""
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "normalizuj"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "odwrÃ³Ä obszary"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr ""
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr ""
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "zresetuj wzmocnienie obszaru"
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr ""
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr ""
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr ""
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr ""
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr ""
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr ""
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "zmieÅ dÅugoÅÄ stopniowego wzmocnienia"
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "zmieÅ dÅugoÅÄ stopniowego wyciszenia"
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "ustaw ksztaÅt stopniowego wzmocnienia"
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "ustaw ksztaÅt stopniowego wyciszenia"
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "wÅÄ
cz stopniowe wzmocnienie"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "wÅÄ
cz stopniowe wyciszenie"
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "ustaw zakres pÄtli w miejscu zaznaczenia"
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "ustaw zakres pÄtli w obszarze"
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "ustaw zakres przeÅÄ
cznika w miejscu zaznaczenia"
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "ustaw zakres przeÅÄ
cznika w obszarze"
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "Dodaj nowy znacznik"
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "Ustaw ogólne tempo"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr ""
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "Ustaw tempo dla obszaru"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "podziel obszary"
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5245,62 +5933,62 @@ msgid ""
"This could take a long time."
msgstr ""
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr ""
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
msgstr ""
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr ""
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr ""
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr ""
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr ""
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr ""
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr ""
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr ""
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr ""
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr ""
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr ""
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr ""
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5310,23 +5998,23 @@ msgid ""
"\"allow-special-bus-removal\" option to be \"yes\""
msgstr ""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "Åcieżki"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
+#, fuzzy
msgid "track"
-msgstr "Åcieżka"
+msgid_plural "tracks"
+msgstr[0] "Åcieżka"
+msgstr[1] "Åcieżka"
+msgstr[2] "Åcieżka"
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "szyny"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
+#, fuzzy
msgid "bus"
-msgstr "szyna"
+msgid_plural "busses"
+msgstr[0] "szyna"
+msgstr[1] "szyna"
+msgstr[2] "szyna"
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5334,7 +6022,7 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5342,358 +6030,371 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
"This action cannot be undone, and the session file will be overwritten"
msgstr ""
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "Tak, usuÅ je."
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Tak, usuÅ."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr ""
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "wstaw czas"
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr ""
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr ""
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "wycisz obszar"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr ""
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr ""
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr ""
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr ""
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr ""
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr ""
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr ""
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr ""
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr ""
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr ""
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr ""
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr ""
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr ""
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Ukryte"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr ""
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
msgstr ""
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr ""
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr ""
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr ""
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr ""
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr ""
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr ""
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr ""
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr ""
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr ""
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr ""
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr ""
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr ""
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
msgstr ""
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
msgstr ""
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr ""
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr ""
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr ""
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Ukryj wszystko"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "WyÅwietl wszystkie Åcieżki audio"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Ukryj wszystkie Åcieżki audio"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "WyÅwietl wszystkie szyny audio"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Ukryj wszystkie szyny audio"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr ""
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr ""
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Nowy znacznik poÅożenia"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "WyczyÅÄ wszystkie poÅożenia"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr "WyÅwietl poÅożenia"
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr ""
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "WyczyÅÄ wszystkie zakresy"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr "WyÅwietl zakresy"
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr "Nowy znacznik zakresu (Åcieżka CD)"
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Nowe tempo"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Nowe metrum"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr ""
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr "Nazwa zrzutu"
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
msgstr ""
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr ""
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "dodaj"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "dodaj znacznik tempa"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "dodaj"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "dodaj oznaczenie metrum"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "ukoÅczono"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "zamieÅ znacznik tempa"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "usuÅ znacznik tempa"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5702,330 +6403,383 @@ msgstr ""
msgid "stretch/shrink"
msgstr ""
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr ""
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr ""
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr ""
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr ""
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr ""
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr ""
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr ""
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr ""
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr ""
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr ""
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr ""
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr ""
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr ""
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr ""
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Opóźnienie"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr ""
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr ""
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr ""
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "CzÄstotliwoÅÄ próbkowania:"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr ""
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr ""
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr ""
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr ""
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr ""
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr ""
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr ""
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
"Latency calibration requires playback and capture"
msgstr ""
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr ""
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr "UrzÄ
dzenie"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr ""
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr ""
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr ""
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr ""
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr ""
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Aktywne"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
msgstr ""
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "KanaÅy:"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr ""
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr ""
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
msgstr ""
-#: export_dialog.cc:46
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr ""
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr ""
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr ""
@@ -6051,45 +6805,57 @@ msgstr ""
msgid "Stop Export"
msgstr "Zatrzymaj eksport"
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr ""
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr ""
-#: export_dialog.cc:385
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:387
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr ""
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr "Eksportuj obszar"
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr ""
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr ""
@@ -6097,172 +6863,246 @@ msgstr ""
msgid "Add another format"
msgstr ""
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Format"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "PoÅożenie"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr ""
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr ""
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr ""
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr ""
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
msgstr ""
#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr ""
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "PrzeglÄ
daj"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr ""
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
msgstr ""
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
+#: export_format_dialog.cc:43
+msgid "Peak"
msgstr ""
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
+#: export_format_dialog.cc:44
+msgid "Loudness"
msgstr ""
#: export_format_dialog.cc:50
-msgid "Trim silence at end"
+msgid "LUFS"
msgstr ""
#: export_format_dialog.cc:51
-msgid "Add silence at end:"
+msgid "dBTP"
msgstr ""
#: export_format_dialog.cc:54
-msgid ""
-"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+msgid "Trim silence at start"
msgstr ""
-#: export_format_dialog.cc:57
-msgid "Compatibility"
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
msgstr ""
#: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
+msgid ""
+"Command to run post-export\n"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
+msgstr ""
+
+#: export_format_dialog.cc:65
+msgid "Compatibility"
+msgstr ""
+
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr ""
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr ""
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr ""
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr ""
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr ""
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr ""
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr ""
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr ""
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr ""
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr ""
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr ""
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6270,29 +7110,200 @@ msgstr ""
msgid "Preset"
msgstr ""
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
msgstr ""
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Nie można odczytaÄ pliku: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Nie można uzyskaÄ dostÄpu do pliku:"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr ""
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr "Wszystko"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
msgid "Range"
msgstr ""
@@ -6308,36 +7319,39 @@ msgstr ""
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr ""
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Tryb automatyzacji wzmocnienia"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Rodzaj automatyzacji wzmocnienia"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr ""
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr ""
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr ""
@@ -6345,46 +7359,50 @@ msgstr ""
msgid "<span size=\"large\">Presets</span>"
msgstr ""
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr ""
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr ""
#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Sterowanie"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr ""
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Sterowanie"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr ""
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Kontrola automatyzacji"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr ""
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr ""
@@ -6393,126 +7411,163 @@ msgstr ""
msgid "MIDI Connection Manager"
msgstr ""
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "RozÅÄ
cz"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr ""
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr ""
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr ""
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr ""
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr ""
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr ""
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr ""
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr ""
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr ""
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr ""
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr ""
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr ""
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr ""
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr ""
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr ""
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr ""
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr ""
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr ""
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr ""
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr ""
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr ""
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr ""
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr ""
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr ""
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr ""
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr ""
@@ -6520,64 +7575,89 @@ msgstr ""
msgid "I/O selector"
msgstr ""
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1 wejÅcie"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1 wyjÅcie"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr "wÅasny"
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr "UsuŠskrót"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "CzynnoÅÄ"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Skrót"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "CzynnoÅÄ"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Skrót"
+
+#: keyeditor.cc:370
+msgid "RegionList"
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
msgstr ""
-#: keyeditor.cc:269
-msgid "RegionList"
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
msgstr ""
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: latency_gui.cc:39
+msgid "sample"
msgstr ""
#: latency_gui.cc:40
@@ -6588,110 +7668,218 @@ msgstr ""
msgid "period"
msgstr ""
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Zresetuj"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr ""
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr ""
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr ""
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr ""
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr ""
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "Przed naciskiem"
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr ""
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr ""
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr ""
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr ""
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr ""
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr ""
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr ""
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr ""
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr ""
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr ""
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr ""
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr ""
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr ""
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr ""
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "dodaj znacznik zakresu"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr ""
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr ""
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6700,78 +7888,98 @@ msgid ""
"Click OK to exit %1."
msgstr ""
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr ""
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:344
msgid " (built using "
msgstr " (skompilowany przy użyciu "
-#: main.cc:313
+#: main.cc:347
msgid " and GCC version "
msgstr " oraz GCC w wesji "
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr ""
-#: main.cc:324
+#: main.cc:358
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
msgstr ""
-#: main.cc:326
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr ""
-#: main.cc:327
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
-#: main.cc:328
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr "To jest oprogramowanie darmowe i możesz je rozpowszechniaÄ"
-#: main.cc:329
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"na ÅciÅle okreÅlonych zasadach; zobacz plik COPYING by dowiedzieÄ siÄ wiÄcej."
-#: main.cc:334
+#: main.cc:368
msgid "could not initialize %1."
msgstr ""
-#: main.cc:344
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr ""
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr ""
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr ""
-#: marker.cc:273
-msgid "MarkerText"
-msgstr "Tekst znacznika"
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
-#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
+msgid "MarkerText"
+msgstr "Tekst znacznika"
+
+#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Brak"
@@ -6852,11 +8060,11 @@ msgstr ""
msgid "Click to force all MIDI channel messages to channel %1"
msgstr ""
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr ""
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr ""
@@ -6968,192 +8176,188 @@ msgstr ""
msgid "velocity edit"
msgstr ""
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr ""
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr ""
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr ""
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr ""
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr ""
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr ""
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr ""
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr ""
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr ""
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr ""
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr ""
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr ""
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr ""
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr ""
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr ""
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr ""
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "wklej"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr ""
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr ""
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr ""
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr ""
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr ""
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr ""
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr ""
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr ""
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr ""
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr ""
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr ""
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr ""
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr ""
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr ""
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr ""
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr ""
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr ""
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr ""
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr ""
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr ""
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr ""
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr ""
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7169,7 +8373,7 @@ msgstr ""
msgid "Decimal"
msgstr ""
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr ""
@@ -7185,35 +8389,36 @@ msgstr ""
msgid "New velocity"
msgstr ""
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr ""
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr ""
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr ""
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr ""
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr ""
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr ""
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7225,7 +8430,7 @@ msgid ""
"\n"
msgstr ""
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr ""
@@ -7233,516 +8438,706 @@ msgstr ""
msgid "Missing Plugins"
msgstr ""
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "przed"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr ""
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr ""
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
msgstr ""
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr ""
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr ""
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr ""
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr ""
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr ""
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr ""
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr ""
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr ""
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr ""
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr ""
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr ""
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr ""
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr ""
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Komentarze*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
msgstr ""
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
+msgid "Cmt"
msgstr ""
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Kliknij by dodaÄ/edytowaÄ komentarze"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr ""
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr ""
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr ""
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr ""
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr ""
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr ""
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr ""
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Aktywne"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr ""
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr ""
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
msgstr ""
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr ""
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr ""
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr ""
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "Przed potencjometrem"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Za potencjometrem"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Grupa"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr ""
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-wszystko-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Pas"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr ""
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr ""
-#: meter_strip.cc:884
+#: meter_strip.cc:895
msgid "Short"
msgstr ""
-#: meter_strip.cc:885
+#: meter_strip.cc:896
msgid "Tall"
msgstr ""
-#: meter_strip.cc:886
+#: meter_strip.cc:897
msgid "Grande"
msgstr ""
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr ""
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr ""
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr ""
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr ""
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr ""
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
msgstr ""
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
msgstr ""
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr ""
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr ""
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr ""
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr ""
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr ""
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
msgstr ""
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
msgstr ""
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
msgstr ""
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
msgstr ""
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
msgstr ""
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
msgstr ""
-#: monitor_section.cc:323
+#: monitor_section.cc:399
msgid "Monitor"
msgstr ""
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr ""
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr ""
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr ""
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr ""
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr ""
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr ""
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr ""
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr ""
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr ""
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr ""
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr ""
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -7797,10 +9192,6 @@ msgid ""
"relies on a stable, sustainable income stream. Thanks for using Ardour!"
msgstr ""
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr ""
@@ -7809,6 +9200,10 @@ msgstr ""
msgid "Name of new preset"
msgstr ""
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr ""
@@ -7817,7 +9212,11 @@ msgstr ""
msgid "Normalize region"
msgstr ""
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr ""
@@ -7837,103 +9236,106 @@ msgstr "Normalizuj"
msgid "Select Note"
msgstr ""
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Użycie:"
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr ""
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr ""
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr ""
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr ""
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr ""
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "PomiÅ"
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr ""
@@ -7945,6 +9347,22 @@ msgstr "Tryb automatyzacji panoramy"
msgid "Pan automation type"
msgstr "Rodzaj automatyzacji panoramy"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr "Listy odtwarzania"
@@ -7977,143 +9395,298 @@ msgstr ""
msgid "Show phase"
msgstr ""
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "Nazwa zawiera"
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "Rodzaj zawiera"
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr ""
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "Autor zawiera"
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "Biblioteka zawiera"
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr ""
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr ""
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr ""
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr ""
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr "DostÄpne wtyczki"
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Rodzaj"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr "Kategoria"
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr "Kreator"
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr ""
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr ""
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr ""
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr ""
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "Wtyczki do podÅÄ
czenia"
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Dodaj wtyczke do listy efektów"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "UsuÅ wtyczkÄ z listy efektów"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "OdÅwież listÄ dostÄpnych wtyczek"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "Wstaw wtyczkÄ"
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
"See the Log window for more details (maybe)"
msgstr ""
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr ""
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr ""
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr ""
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr ""
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr ""
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr ""
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8121,147 +9694,168 @@ msgstr ""
msgid "Add"
msgstr "Dodaj"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr ""
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr ""
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr ""
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr ""
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr ""
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr ""
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
msgstr ""
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr ""
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr ""
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr ""
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr ""
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
msgstr ""
#: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
msgstr ""
#: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
msgstr ""
#: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
msgstr ""
#: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
msgid "Other"
msgstr ""
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr ""
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr ""
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr ""
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr ""
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr ""
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr ""
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr ""
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr ""
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr ""
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr ""
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ""
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr ""
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
msgstr ""
#: port_insert_ui.cc:39
@@ -8284,77 +9878,76 @@ msgstr ""
msgid "Port Insert "
msgstr ""
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr ""
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr ""
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr ""
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr ""
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr ""
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr ""
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Skanuj ponownie"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr ""
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr ""
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr ""
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr ""
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr ""
@@ -8366,227 +9959,241 @@ msgstr ""
msgid "There are no %1 ports to connect."
msgstr ""
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr ""
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr ""
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr ""
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "wyÅ"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
msgstr ""
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr ""
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr ""
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
msgstr ""
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
msgstr ""
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
msgstr ""
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
"outputs will not work correctly."
msgstr ""
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr ""
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr ""
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
"could not match the configuration of this track."
msgstr ""
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Tak, usuÅ je wszystkie"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr ""
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr ""
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Nowy przysyÅ"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr ""
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr ""
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr ""
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr ""
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr ""
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "WÅÄ
cz wszystko"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr ""
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr ""
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr ""
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr ""
@@ -8614,345 +10221,444 @@ msgstr ""
msgid "main grid"
msgstr ""
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr ""
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr ""
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr ""
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr ""
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr ""
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr ""
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
msgstr ""
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
msgstr ""
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr ""
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Wybór dźwiÄku"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Wybór dźwiÄku akcentowanego uderzenia"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr ""
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr ""
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr ""
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr ""
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "i przycisk:"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr ""
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr ""
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
msgstr ""
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
msgstr ""
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
msgstr ""
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
msgstr ""
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
msgstr ""
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
msgstr ""
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
msgstr ""
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
msgstr ""
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
msgstr ""
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
msgstr ""
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "â"
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
msgstr ""
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
msgstr ""
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
msgstr ""
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr ""
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr ""
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
msgstr ""
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr ""
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
msgstr ""
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr ""
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr ""
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr ""
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr ""
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr ""
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr ""
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr ""
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
msgstr ""
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
msgstr ""
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Kopiowanie importowanych plików"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr ""
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr ""
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr ""
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automatyka"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr ""
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr ""
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr ""
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -8961,25 +10667,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr ""
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr ""
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr ""
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -8988,11 +10694,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -9002,39 +10708,83 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr ""
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr ""
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr ""
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9048,27 +10798,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9081,659 +10831,926 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr ""
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr ""
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr ""
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
msgstr ""
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
msgstr ""
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
msgstr ""
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
msgstr ""
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
msgstr ""
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
msgstr ""
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
msgstr ""
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
msgstr ""
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
msgstr ""
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linearna"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
msgstr ""
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
msgstr ""
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
msgstr ""
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
msgstr ""
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
msgstr ""
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
msgstr ""
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
msgstr ""
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linearna"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr ""
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr ""
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr ""
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr ""
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr ""
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr ""
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr ""
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr ""
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr ""
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr ""
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr ""
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr ""
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr ""
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr ""
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr ""
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr ""
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr ""
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
msgstr ""
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
msgstr ""
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
msgstr ""
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
msgstr ""
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
msgstr ""
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "WyÅwietlanie wyciszania solo"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
msgstr ""
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
msgstr ""
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr ""
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr ""
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr ""
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr ""
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr ""
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr ""
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr ""
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "WyÅwietlanie wyciszania solo"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr ""
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr ""
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr ""
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr ""
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr ""
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr ""
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr ""
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr ""
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr ""
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
msgstr ""
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
msgstr ""
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
msgstr ""
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr ""
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr ""
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
msgstr ""
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
msgstr ""
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+" <i>(requires a restart of %1 to take effect)</i>\n"
+" <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
msgstr ""
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
msgstr ""
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
msgstr ""
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
msgstr ""
-#: rc_option_editor.cc:2232
-msgid ""
-"Use translations of %1 messages\n"
-" <i>(requires a restart of %1 to take effect)</i>\n"
-" <i>(if available for your language preferences)</i>"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr ""
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr ""
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr ""
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr ""
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr ""
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr ""
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr ""
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "przesÅuchaj ten obszar"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr ""
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr ""
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr "DÅugoÅÄ:"
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr ""
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr ""
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr ""
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr ""
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr ""
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr ""
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr "zmieÅ pozycjÄ poczÄ
tkowÄ
obszaru"
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr "zmieÅ pozycjÄ koÅcowÄ
obszaru"
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr "zmieÅ dÅugoÅÄ obszaru"
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr ""
@@ -9753,34 +11770,34 @@ msgstr ""
msgid "Choose Top Region"
msgstr ""
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr ""
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr ""
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr ""
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr ""
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -9826,55 +11843,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr ""
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr ""
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr ""
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr ""
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr ""
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Analizuj"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr ""
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
msgstr ""
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "WartoÅÄ progowa"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr ""
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr ""
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "CzuÅoÅÄ"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Operacja"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr ""
@@ -9898,19 +11923,15 @@ msgstr ""
msgid "Active state"
msgstr ""
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Kolor"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr ""
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr ""
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
@@ -9930,404 +11951,389 @@ msgstr "WyjÅcia"
msgid "Plugins, Inserts & Sends"
msgstr ""
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr ""
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr ""
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "BRAK ÅCIEÅ»KI"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr ""
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr ""
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Nagrywanie"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr ""
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr ""
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr ""
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr ""
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr ""
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Wzmocnienie"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Panorama"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr ""
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr ""
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr ""
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr ""
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr ""
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr ""
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr ""
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr ""
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "Wyrównanie"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr ""
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr ""
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr ""
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr ""
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Lista odtwarzania"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr ""
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr ""
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr ""
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr ""
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr ""
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr ""
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr ""
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr ""
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "WyczyÅÄ aktualnÄ
"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr ""
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "bÅÄ
d programowania:"
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr ""
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr ""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr ""
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr ""
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr ""
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr ""
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr ""
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr ""
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr ""
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr ""
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr ""
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr ""
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr ""
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr ""
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr ""
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr ""
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr ""
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr ""
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr ""
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr ""
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "GÅówne wyjÅcia"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr ""
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
msgstr ""
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr ""
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr ""
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "ZmieÅ nazwÄ Åcieżki"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr ""
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": edytor komentarzy"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr ""
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr ""
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr ""
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr ""
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID zdalnego sterowania"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
msgstr ""
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
msgstr ""
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
msgstr ""
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
msgstr ""
#: search_path_option.cc:35
@@ -10342,126 +12348,158 @@ msgstr ""
msgid "the session folder"
msgstr ""
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr ""
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr ""
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr ""
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Nowa Sesja"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Poprzednie sesje"
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
msgstr ""
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
msgstr ""
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Nowa Sesja"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
msgstr ""
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr ""
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr ""
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr ""
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr ""
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr ""
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr ""
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr ""
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr ""
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr " "
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>Szyny</b>"
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>WejÅcia</b>"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>WyjÅcia</b>"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr ""
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr ""
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "IloÅÄ używanych kanaÅów:"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr ""
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr ""
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr ""
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr ""
@@ -10482,197 +12520,197 @@ msgstr ""
msgid "This will select all elements of this type!"
msgstr ""
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr ""
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr ""
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr ""
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr ""
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr ""
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr ""
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr ""
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr ""
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr ""
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr ""
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr ""
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr ""
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr ""
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr ""
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr ""
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr ""
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr ""
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr ""
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr ""
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr ""
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr ""
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr ""
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr ""
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr ""
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr ""
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr ""
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr ""
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr ""
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr ""
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr ""
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr ""
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr ""
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr ""
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr ""
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr ""
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr ""
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr ""
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr ""
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr ""
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
msgstr ""
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr ""
@@ -10819,209 +12857,230 @@ msgid "Destructive crossfade length"
msgstr ""
#: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
msgstr ""
#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr ""
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr ""
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr ""
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr ""
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr ""
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr ""
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr ""
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr ""
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr ""
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr ""
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr ""
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr ""
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr ""
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr ""
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr ""
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr ""
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr ""
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr ""
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr ""
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr ""
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr ""
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr ""
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr ""
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr ""
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr ""
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr ""
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr ""
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr ""
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr ""
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr ""
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr ""
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr ""
@@ -11057,25 +13116,13 @@ msgstr ""
msgid "Timestamp:"
msgstr ""
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "Etykiety:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Nie można odczytaÄ pliku: %1 (%2)."
-
#: sfdb_ui.cc:297
-msgid "<b>Midi File Information</b>"
-msgstr ""
-
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Nie można uzyskaÄ dostÄpu do pliku:"
+msgid "<b>Midi File Information</b>"
+msgstr ""
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
@@ -11085,285 +13132,281 @@ msgstr ""
msgid "Search"
msgstr "Szukaj"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr ""
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr "Pliki dźwiÄkowe"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr ""
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr "Wszystkie pliki"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr "PrzeglÄ
danie plików"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "Åcieżki"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr "Wyszukiwanie etykiet"
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr ""
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr ""
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr ""
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr ""
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr ""
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr ""
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr ""
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr ""
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr ""
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr ""
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr ""
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr ""
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr ""
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr ""
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr ""
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr ""
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
msgstr ""
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr ""
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "jedna Åcieżka na plik"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "jedna Åcieżka na kanaÅ"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr ""
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr ""
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "poÅÄ
cz pliki"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr ""
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr ""
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr ""
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
msgstr ""
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "Skopiuj pliki do sesji"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr ""
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr ""
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr ""
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr ""
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr ""
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr ""
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr ""
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "Najlepsza"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "Dobra"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "Szybka"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Najszybciej"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr ""
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr ""
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr ""
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr ""
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "Maksymalna prÄdkoÅÄ"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr ""
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr ""
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ""
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11388,7 +13431,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr ""
@@ -11404,17 +13447,17 @@ msgstr ""
msgid "Azimuth:"
msgstr ""
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr ""
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11424,15 +13467,15 @@ msgid ""
"program.</span> "
msgstr ""
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr ""
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr ""
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11442,11 +13485,11 @@ msgid ""
"<i>(You can put new sessions anywhere, this is just a default)</i>"
msgstr ""
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr ""
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11460,31 +13503,31 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr ""
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr ""
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
msgstr ""
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr ""
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
msgstr ""
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11492,46 +13535,42 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr ""
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ""
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ""
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ""
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr ""
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr ""
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr ""
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr ""
@@ -11640,11 +13679,11 @@ msgstr ""
msgid "Insert a program change message"
msgstr ""
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr ""
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr ""
@@ -11656,240 +13695,244 @@ msgstr ""
msgid "Octave"
msgstr ""
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr ""
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr ""
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr ""
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr ""
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr ""
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr ""
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr ""
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr ""
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr ""
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr ""
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr ""
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr ""
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr ""
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr ""
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr ""
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr ""
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr ""
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr ""
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr ""
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr ""
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr ""
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr ""
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr ""
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr ""
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr ""
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr ""
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr ""
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr ""
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr ""
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr ""
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr ""
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr ""
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr ""
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr ""
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr ""
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr ""
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr ""
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr ""
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr ""
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr ""
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr ""
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr ""
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr ""
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr ""
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr ""
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr ""
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr ""
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr ""
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr ""
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr ""
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr ""
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr ""
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr ""
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr ""
@@ -11897,176 +13940,189 @@ msgstr ""
msgid "Strip Silence"
msgstr ""
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "WartoÅÄ progowa"
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr ""
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr ""
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr ""
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr ""
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr ""
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr ""
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr ""
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr ""
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr ""
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr ""
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr ""
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr ""
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr ""
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr ""
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr ""
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr ""
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
msgstr ""
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
msgstr ""
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
msgstr ""
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
msgstr ""
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
msgstr ""
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
msgstr ""
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
msgstr ""
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr ""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr ""
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Obiekt"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12074,93 +14130,96 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Szybko i niedokÅadnie"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "PomiÅ anti-aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "ZawartoÅÄ:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr ""
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr ""
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr "Okno rozciÄ
gania w czasie"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr ""
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr ""
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr ""
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr ""
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr ""
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr ""
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr ""
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "RozciÄ
gnij/skurcz"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr ""
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Rozpocznij nagrywanie przy napotkaniu przeÅÄ
cznika"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Zatrzymaj nagrywanie na koÅcu przeÅÄ
cznika"
@@ -12228,94 +14287,130 @@ msgstr ""
msgid "Transpose"
msgstr "Transponuj"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr ""
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:177
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr ""
-#: ui_config.cc:222
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr ""
-#: ui_config.cc:227
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr ""
-#: ui_config.cc:317
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr ""
-#: ui_config.cc:320
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:325
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:333
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
-#: ui_config.cc:351
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr ""
-#: ui_config.cc:592
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr ""
-#: ui_config.cc:662
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr ""
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr ""
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr ""
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr ""
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr ""
@@ -12360,32 +14455,48 @@ msgstr ""
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12395,25 +14506,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12435,7 +14546,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12444,10 +14555,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12457,9 +14572,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12468,83 +14582,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12564,7 +14678,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12574,239 +14688,230 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr ""
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr ""
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr ""
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr ""
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr ""
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr ""
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr ""
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr ""
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr ""
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr ""
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr ""
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr ""
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr ""
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr ""
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr ""
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr ""
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr ""
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr ""
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr ""
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr ""
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr ""
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr ""
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr ""
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr ""
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr ""
@@ -12824,13 +14929,74 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+#~ msgid "Display model"
+#~ msgstr "Tryb wyÅwietlania"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalizacja wartoÅci"
+
+#~ msgid "Locations"
+#~ msgstr "PoÅożenia"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Gdy aktywne, odsÅuchiwanie jest wÅÄ
czone\n"
+#~ "Kliknij, by zatrzymaÄ odsÅuchiwanie."
+
+#~ msgid "Transition To Roll"
+#~ msgstr "Do przodu"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "Od tyÅu"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Od punktu edycji"
+
+#~ msgid "Zoom focus"
+#~ msgstr "PowiÄkszanie do"
+
+#~ msgid "Show Logo"
+#~ msgstr "WyÅwietlanie logo"
+
+#~ msgid "End point trim"
+#~ msgstr "Punkt koÅcowy przyciÄcia"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplikuj zaznaczenie"
+
+#~ msgid "tracks"
+#~ msgstr "Åcieżki"
+
+#~ msgid "busses"
+#~ msgstr "szyny"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Komentarze*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Kliknij by dodaÄ/edytowaÄ komentarze"
+
+#~ msgid "Update available plugins"
+#~ msgstr "OdÅwież listÄ dostÄpnych wtyczek"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID zdalnego sterowania"
+
+#~ msgid "Contents:"
+#~ msgstr "ZawartoÅÄ:"
+
#~ msgid ""
#~ "%1\n"
#~ "(built from revision %2)"
diff --git a/gtk2_ardour/po/pt.mo b/gtk2_ardour/po/pt.mo
new file mode 100644
index 0000000..5899c9d
Binary files /dev/null and b/gtk2_ardour/po/pt.mo differ
diff --git a/gtk2_ardour/po/pt.po b/gtk2_ardour/po/pt.po
index b57407c..2cd933b 100644
--- a/gtk2_ardour/po/pt.po
+++ b/gtk2_ardour/po/pt.po
@@ -4,270 +4,303 @@
# Authors: Alexander Franca <alexander at nautae.eti.br>
# Chris Ross <chris.ross at tebibyte.org>
# Leandro Marco <leandromarco at gmail.com>
-#
+# Marcelo Teles <mteles84 at gmail.com>
#
msgid ""
msgstr ""
"Project-Id-Version: ardour 0.688.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-24 21:43-0300\n"
"PO-Revision-Date: 2005-08-15 21:50-0000\n"
"Last-Translator: Chris Ross, Alexander Franca & Leandro Marco\n"
"Language-Team: Portuguese\n"
-"Language: \n"
+"Language: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
-#: about.cc:125
+#: about.cc:128
msgid "Brian Ahr"
msgstr ""
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr ""
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr ""
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr ""
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr ""
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr ""
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr ""
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr ""
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr ""
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr ""
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr ""
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr ""
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr ""
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr ""
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr ""
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr ""
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr ""
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr ""
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr ""
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr ""
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr ""
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr ""
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr ""
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr ""
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr ""
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr ""
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr ""
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr ""
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr ""
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr ""
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr ""
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr ""
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr ""
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr ""
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr ""
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr ""
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr ""
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr ""
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr ""
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr ""
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr ""
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr ""
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr ""
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr ""
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr ""
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr ""
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr ""
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr ""
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -276,7 +309,7 @@ msgid ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
msgstr ""
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -288,210 +321,264 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
msgstr ""
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
msgstr ""
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
msgstr ""
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
msgstr ""
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
msgstr ""
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
msgstr ""
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
msgstr ""
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
msgstr ""
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
msgstr ""
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr ""
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr ""
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr ""
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr ""
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr ""
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr ""
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "Adicionar Trilha/Bus/VCA"
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
-msgstr ""
+msgstr "Configuração"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
-msgstr ""
+msgstr "Modo de Gravação"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
-msgstr ""
+msgstr "Instrumento"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
-msgstr ""
+msgstr "Trilhas de Ãudio"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
-msgstr ""
+msgstr "Trilhas de MIDI"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
+msgstr "Trilhas de Ãudio+MIDI"
+
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
msgstr ""
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "Antes da Seleção"
+
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "Depois da Seleção"
+
+#: add_route_dialog.cc:88
+msgid "Last"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
msgstr ""
-#: add_route_dialog.cc:86
-msgid "Last"
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:108
msgid "Add:"
-msgstr ""
+msgstr "Adicionar:"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
-msgstr ""
+msgstr "<b>Opções</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
-msgstr ""
+msgstr "Nome:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
-msgstr ""
+msgstr "Grupo:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
-msgstr ""
+msgstr "Inserir:"
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
-msgid "Audio"
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Portas de SaÃda"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
msgstr ""
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
+msgid "Audio"
+msgstr "Ãudio"
+
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
-msgstr ""
+msgstr "Ãudio+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr ""
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -500,60 +587,61 @@ msgid ""
"track instead."
msgstr ""
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Normal"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr ""
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr ""
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr ""
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr ""
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr ""
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr ""
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr ""
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr ""
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr ""
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr ""
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
msgid "Custom"
msgstr ""
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
-msgstr ""
+msgstr "Novo Grupo..."
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr ""
@@ -561,177 +649,223 @@ msgstr ""
msgid "Ambiguous File"
msgstr ""
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
"Please select the path that you want to get the file from."
msgstr ""
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
-msgstr ""
+msgstr "Pronto"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
-msgstr ""
+msgstr "Fonte de Sinal"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
-msgstr ""
+msgstr "Intervalos selecionados"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
-msgstr ""
-
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr ""
+msgstr "Regiões selecionadas"
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
msgstr ""
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:49
+msgid "Fit dB range"
msgstr ""
-#: analysis_window.cc:55
-msgid "Normalize values"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr ""
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr ""
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Trilha"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
-msgstr ""
+msgstr "Mostrar"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
-msgstr ""
+msgstr "Re-analisar dados"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr ""
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: ardour_ui.cc:164
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Audição"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Solo"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr ""
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
-msgstr ""
-
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
+msgstr "Configuração de Autofalantes"
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
-msgstr ""
+msgstr "Adicionar Trilhas/Bus"
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "Sobre"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Localizações"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "Intervalos|Localizações"
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
-msgstr ""
+msgstr "Trilhas e Bus"
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
-msgstr ""
+msgstr "Configuração de Ãudio/MIDI"
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr ""
-#: ardour_ui.cc:228
-msgid "Properties"
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
msgstr ""
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:304
+msgid "Properties"
+msgstr "Propriedades"
+
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "Adicionar VÃdeo"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr ""
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Metrônomo"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
-msgstr ""
+msgstr "Conexões de Ãudio"
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
+msgstr "Conexões MIDI"
+
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr "Editor"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Mesa de Som"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Preferências"
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -739,45 +873,45 @@ msgid ""
"the audio backend and save the session."
msgstr ""
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
-msgstr ""
+msgstr "Ignorar este aviso futuramente"
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -788,39 +922,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
-msgstr ""
+msgstr "Sair agora"
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr ""
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -829,23 +963,23 @@ msgid ""
"controlled by %2"
msgstr ""
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
-msgstr ""
+msgstr "Não mostrar esta janela novamente"
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
-msgstr ""
+msgstr "Não sair"
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
-msgstr ""
+msgstr "Apenas sair"
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
-msgstr ""
+msgstr "Salvar e sair"
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -854,11 +988,11 @@ msgid ""
"\"Just quit\" option."
msgstr ""
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
-msgstr ""
+msgstr "Sessão Não Salva"
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -868,8 +1002,14 @@ msgid ""
"\n"
"What do you want to do?"
msgstr ""
+"A sessão \"%1\" não foi salva.\n"
+"\n"
+"Qualquer alteração feita agora\n"
+"será perdida se não salvar.\n"
+"\n"
+"O que você deseja fazer?"
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -879,75 +1019,115 @@ msgid ""
"\n"
"What do you want to do?"
msgstr ""
+"The snapshot \"%1\"\n"
+"não foi salvo.\n"
+"\n"
+"Qualquer alteração feita agora\n"
+"será perdida se não salvar.\n"
+"\n"
+"O que você deseja fazer?"
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr ""
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
-msgstr ""
+msgstr "Ãudio: <span foreground=\"red\">none</span>"
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Ãudio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Ãudio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
-msgstr ""
+msgstr "Arquivo:"
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr ""
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr ""
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr ""
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr ""
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr ""
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr ""
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr ""
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr ""
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr ""
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr ""
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr ""
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -955,216 +1135,264 @@ msgid ""
"\">%<PRIu32>%%</span>"
msgstr ""
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr ""
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr ""
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr ""
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr ""
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
-msgstr ""
-
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr ""
+msgstr "Tempo|TC: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr ""
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr ""
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr ""
"Você não pode adicionar uma trilha se uma sessão não estiver carregada."
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
msgstr ""
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
msgstr ""
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr ""
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Salvar como"
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr ""
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
msgstr ""
-#: ardour_ui.cc:2455
-msgid "Rename Session"
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nome da nova sessão"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
msgstr ""
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
+msgid "Rename Session"
+msgstr "Renomear Sessão"
+
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
msgstr ""
-#: ardour_ui.cc:2602
-msgid "Save Template"
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
msgstr ""
-#: ardour_ui.cc:2603
-msgid "Name for template:"
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
msgstr ""
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2948
+msgid "Save Template"
+msgstr "Salvar Esquema"
+
+#: ardour_ui.cc:2949
+msgid "Name for template:"
+msgstr "Nome para o esquema:"
+
+#: ardour_ui.cc:2950
msgid "-template"
-msgstr "-esquema/template"
+msgstr "-esquema"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
"already exists. Do you want to open it?"
msgstr ""
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
-msgstr ""
+msgstr "Abrir Sessão Existente"
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr ""
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr ""
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr ""
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
+msgstr "Clique no botão Fechar para tentar novamente"
+
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
msgstr ""
-#: ardour_ui.cc:3043
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
+msgid "Loading Error"
+msgstr "Erro de carregamento"
+
+#: ardour_ui.cc:3447
msgid "Session \"%1 (snapshot %2)\" did not load successfully"
msgstr "A sessão \"%1 (instantâneo %2)\" não pôde ser carregada"
-#: ardour_ui.cc:3049
-msgid "Loading Error"
-msgstr ""
-
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr ""
-#: ardour_ui.cc:3288
-msgid "No files were ready for clean-up"
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
msgstr ""
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
-msgid "Clean-up"
+#: ardour_ui.cc:3603
+msgid "About the Chat"
msgstr ""
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
+msgid "No files were ready for clean-up"
+msgstr "Não havia arquivos prontos para limpeza"
+
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
+msgid "Clean-up"
+msgstr "Limpeza"
+
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1172,19 +1400,19 @@ msgid ""
"require some unused files to continue to exist."
msgstr ""
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr ""
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr ""
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr ""
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1194,7 +1422,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1216,90 +1444,126 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr ""
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
"Clean-up will move all unused files to a \"dead\" location."
msgstr ""
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Limpar"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr ""
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "arquivo removido"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr ""
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr ""
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr ""
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr ""
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr ""
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr ""
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "não foi possÃvel abrir %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr ""
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr "A gravação foi encerrada porque seu sistema não consegue acompanhar"
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1308,23 +1572,23 @@ msgid ""
"quickly enough to keep up with recording.\n"
msgstr ""
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
-msgstr ""
+msgstr "Procurando plugins"
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr ""
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1333,11 +1597,11 @@ msgid ""
"quickly enough to keep up with playback.\n"
msgstr ""
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr ""
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1348,42 +1612,43 @@ msgid ""
"what you would like to do.\n"
msgstr ""
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr ""
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr ""
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr ""
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
"audio may be played at the wrong sample rate.\n"
msgstr ""
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr ""
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr ""
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1395,88 +1660,113 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "não foi possÃvel iniciar o editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "não foi possÃvel iniciar o mixer"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Reproduzir a partir do inÃcio"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Parar reprodução"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr ""
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Reproduzir intervalo/seleção"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Ir para o inÃcio da sessão"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Ir para o fim da sessão"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Reproduzir intervalo"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
msgstr ""
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "Ir para o inÃcio da última reprodução quando parar"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "SensÃvel à monitoração na entrada"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Habilitar/desabilitar metrônomo"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
msgstr ""
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr ""
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1484,7 +1774,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1492,708 +1782,835 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
-msgstr ""
+msgstr "[ERRO]: "
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
-msgstr ""
+msgstr "[AVISO]: "
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
-msgstr ""
+msgstr "[INFORMAÃÃO]: "
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
-msgstr ""
+msgstr "Retorno Automático"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
+msgstr "Seguir Edições"
+
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
msgstr ""
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr ""
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "Miscelânea"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
-msgstr ""
+msgstr "Configurar Editor"
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
-msgstr ""
+msgstr "Configurar Mesa de Som"
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
+msgstr "Recarregar Histórico da Sessão"
+
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "não foi possÃvel iniciar o editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "não foi possÃvel iniciar a mesa"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
msgstr ""
-#: ardour_ui_dialogs.cc:250
-msgid "Don't close"
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
msgstr ""
-#: ardour_ui_dialogs.cc:251
-msgid "Just close"
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "Preferências"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Mesa de Som"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
msgstr ""
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:263
+msgid "Don't close"
+msgstr "Não fechar"
+
+#: ardour_ui_dialogs.cc:264
+msgid "Just close"
+msgstr "Apenas Fechar"
+
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
-msgstr ""
+msgstr "Salvar e fechar"
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Sessão"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Sincronia"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
-msgstr ""
+msgstr "Opções"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
+msgstr "Janela"
+
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
msgstr ""
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:138
msgid "Help"
-msgstr ""
+msgstr "Ajuda"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr ""
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
-msgstr ""
+msgstr "Formato do Arquivo de Ãudio"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
-msgstr ""
+msgstr "Tipo de Arquivo"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr ""
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr ""
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
msgid "Plugins"
msgstr "Entradas"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
msgid "Metering"
msgstr ""
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr ""
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr ""
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr ""
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
-msgstr ""
+msgstr "Novo..."
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
-msgstr ""
+msgstr "Abrir..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
-msgstr ""
+msgstr "Recente..."
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Fechar"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
-msgstr ""
+msgstr "Adicionar Trilha ou Bus"
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "Duplicar Trilha/Bus"
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
msgstr ""
-#: ardour_ui_ed.cc:137
-msgid "Remove Video"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "Abrir VÃdeo"
+
+#: ardour_ui_ed.cc:187
+msgid "Remove Video"
+msgstr "Remover VÃdeo"
+
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "Exportar Arquivo de VÃdeo"
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "Snapshot (& continuar trabalhando nesta versão) ..."
+
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr "Snapshot (& mudar para nova versão) ..."
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr "Snapshot rápido (& continuar trabalhando nesta versão) ..."
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr "Snapshot rápido (& mudar para nova versão) ..."
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
-msgstr ""
+msgstr "Salvar como..."
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
msgid "Rename..."
-msgstr ""
+msgstr "Renomear"
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Salvar Esquema..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
-msgstr ""
+msgstr "Metadados"
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
-msgstr ""
+msgstr "Editar Metadados"
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
-msgstr ""
+msgstr "Importar Metadados"
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr ""
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr "Exportar Arquivo(s) de Ãudio..."
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr ""
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:136 export_video_dialog.cc:80
msgid "Export"
msgstr "Exportar"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr ""
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr ""
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Sair"
-#: ardour_ui_ed.cc:192
-msgid "Maximise Editor Space"
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Ocultar"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
msgstr ""
-#: ardour_ui_ed.cc:193
-msgid "Maximise Mixer Space"
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "Alterar"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
msgstr ""
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
msgstr ""
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "Alternar entre Editor e Mesa"
+
+#: ardour_ui_ed.cc:294
+msgid "Maximise Editor Space"
+msgstr "Maximizar Espaço do Editor"
+
+#: ardour_ui_ed.cc:295
+msgid "Maximise Mixer Space"
+msgstr "Maximizar Espaço da Mesa"
+
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
msgstr ""
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
msgstr ""
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
-msgid "Window|Meterbridge"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
+msgid "Window|Meterbridge"
msgstr ""
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr ""
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
-msgstr ""
+msgstr "Bate-papo (IRC)"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
-msgstr ""
+msgstr "Tutorial"
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr ""
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr "Manual de Referência"
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr ""
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr "Relatar uma Falha"
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
-msgstr ""
+msgstr "Ardour na Web"
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
-msgstr ""
+msgstr "Desenvolvimento do Ardour"
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
-msgstr ""
+msgstr "Fóruns de Usuários"
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr ""
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr "Como Relatar uma Falha"
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Salvar"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
-msgstr ""
+msgstr "Operação"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Parar"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr ""
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
-msgstr ""
+msgstr "Iniciar/Parar"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
-msgstr ""
+msgstr "Iniciar/Continuar/Parar"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr ""
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr ""
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr ""
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr ""
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
-msgstr ""
+msgstr "Armar para Gravação"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
-msgstr ""
+msgstr "Iniciar Gravação"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
-msgstr ""
+msgstr "Rebobinar"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
-msgstr ""
+msgstr "Rebobinar (Lento)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
-msgstr ""
+msgstr "Rebobinar (Rápido)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
-msgstr ""
+msgstr "Avançar"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
-msgstr ""
+msgstr "Avançar (Lento)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
-msgstr ""
+msgstr "Avançar (Rápido)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
-msgstr ""
+msgstr "Ir para o Ponto Zero"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
-msgstr ""
+msgstr "Ir para o Começo"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
-msgstr ""
+msgstr "Ir para o Fim"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr ""
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
#: session_option_editor.cc:124 session_option_editor.cc:126
msgid "Timecode"
-msgstr ""
+msgstr "Tempo"
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
-msgstr ""
+msgstr "Compasso & Batimentos"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
-msgstr ""
+msgstr "Minutos & Segundos"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
-msgstr ""
+msgstr "Amostras"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr ""
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "Entrada"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr ""
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
msgid "Out"
-msgstr "SaÃdas"
+msgstr "SaÃda"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr ""
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
-msgstr ""
+msgstr "Entrada/SaÃda"
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Metrônomo"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
-msgstr ""
+msgstr "Input Automático"
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
-msgstr ""
+msgstr "Reprodução Automática"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr ""
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr ""
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr ""
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Percentual"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Semitons"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Enviar MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Enviar MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr ""
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr ""
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr ""
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
-msgstr ""
+msgstr "Pânico"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:618
msgid "Wall Clock"
-msgstr ""
+msgstr "Relógio"
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:620
msgid "Disk Space"
-msgstr ""
+msgstr "Espaço no Disco"
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:621
msgid "DSP"
msgstr ""
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:624
msgid "Buffers"
msgstr ""
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:626
msgid "Timecode Format"
msgstr ""
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:627
msgid "File Format"
msgstr ""
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
msgstr ""
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
-msgstr ""
+msgstr "Interno"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr ""
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr ""
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr ""
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr ""
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr ""
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
-msgstr "Tempo"
+msgstr "BPM"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
-msgstr "VU (medidor volumétrico)"
-
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+msgstr "VU"
+
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr ""
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr ""
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
msgid "Bars:Beats"
msgstr "Compassos:Batimentos"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
msgid "Minutes:Seconds"
msgstr "Minutos:Segundos"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr ""
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr "Copiar para Ãrea de Transferência"
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr ""
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr ""
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
msgid "dBFS"
msgstr ""
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr ""
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
-msgstr ""
+msgstr "Calculando..."
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr ""
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr ""
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4387
msgid "automation event move"
msgstr "mover evento de automação"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "Remover ponto de controlo"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr ""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr ""
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2205,63 +2622,59 @@ msgstr "estado do automação"
msgid "hide track"
msgstr "ocultar esta trilha"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr ""
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Reproduzir"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr ""
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr ""
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr ""
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "limpar automação"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Ocultar"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
msgid "Clear"
msgstr "Limpar"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Estado"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr ""
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Linear"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Modo"
@@ -2277,35 +2690,38 @@ msgstr ""
msgid "Direction:"
msgstr ""
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
msgid "Input"
-msgstr ""
+msgstr "Entrada"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
msgid "Output"
-msgstr ""
+msgstr "SaÃda"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
msgid "Edit"
msgstr "Editar"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3681 processor_box.cc:3683
msgid "Delete"
msgstr "Apagar"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
-msgstr ""
+msgstr "Nome"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Novo"
@@ -2319,6 +2735,39 @@ msgstr ""
#: bundle_manager.cc:425
msgid "Rename Channel"
+msgstr "Renomear Canal"
+
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Restaurar padrão"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "Objeto"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Cor"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "Itens"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "Paleta"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "Transparência"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
msgstr ""
#: configinfo.cc:28
@@ -2333,6 +2782,42 @@ msgstr ""
msgid "Value"
msgstr "Valor"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr "Duplicar Trilhas e Bus"
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr ""
@@ -2360,7 +2845,7 @@ msgstr ""
#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
#: step_entry.cc:394
msgid "Channel"
-msgstr ""
+msgstr "Canal"
#: edit_note_dialog.cc:68
msgid "Pitch"
@@ -2370,2061 +2855,2156 @@ msgstr ""
msgid "Velocity"
msgstr ""
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
-msgstr ""
+msgstr "Tempo"
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:415 export_timespan_selector.cc:506
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
-msgstr ""
+msgstr "Duração"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
-msgstr ""
+msgstr "editar nota"
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "Quadros de CD"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Segundos"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minutos"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
-msgstr ""
+msgstr "Batimento128"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
-msgstr ""
+msgstr "Batimento/64"
# ## msgstr "SaÃdas Principais"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
-msgstr "Batimentos/32"
+msgstr "Batimento/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr ""
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
-msgstr ""
+msgstr "Batimento/24"
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
-msgstr ""
+msgstr "Batimento/20"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
-msgstr "Batimentos/16"
+msgstr "Batimento/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
-msgstr ""
+msgstr "Batimento/14"
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
-msgstr ""
+msgstr "Batimento/12"
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
-msgstr ""
+msgstr "Batimento/10"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
-msgstr "Batimentos/8"
+msgstr "Batimento/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
-msgstr ""
+msgstr "Batimento/7"
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
-msgstr ""
+msgstr "Batimento/6"
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
-msgstr ""
+msgstr "Batimento/5"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
-msgstr "Batimentos/4"
+msgstr "Batimento/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
-msgstr "Batimentos/3"
+msgstr "Batimento/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
-msgstr ""
+msgstr "Batimento/2"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Batimentos"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Compassos"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Marcas"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "Começo de regiões"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Fim de regiões"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "Sincronizações de região"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Divisas de região"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
-msgstr ""
+msgstr "Sem Grade"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
-msgstr ""
+msgstr "Grade"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnético"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "InÃcio"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Marca"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr ""
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Deslizar"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Reunir"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Trancar"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Esquerdo"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Direito"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Centro"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr ""
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr ""
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr ""
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr ""
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr ""
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr ""
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr ""
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr ""
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Mins:Segs"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Marcas de Localização"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Marcas de Intervalos"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Intervalos Loop/Insersão"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
-msgstr ""
+msgstr "Marcadores de CD"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "modo"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
-msgstr ""
+msgstr "Marcadores"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
-msgstr ""
+msgstr "Regiões"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
-msgstr ""
+msgstr "Trilhas & Bus"
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
-msgstr "Capturas"
+msgstr ""
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
-msgstr ""
+msgstr "Grupos de Trilhas e Bus"
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
-msgstr ""
-
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
+msgstr "Intervalos e Marcadores"
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Ciclo"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Inserção"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr ""
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr ""
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr ""
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Devegar"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Rapido"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "Desativar"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "Ativar"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Congelar"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "Descongelar"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr ""
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr ""
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr ""
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr ""
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr ""
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr ""
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr ""
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr ""
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
-msgstr ""
+msgstr "Separar"
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr ""
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr ""
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr ""
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr ""
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
-msgstr ""
+msgstr "Adicionar Marcadores para Intervalo"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
-msgstr ""
+msgstr "Cortar Região para Intervalo"
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr ""
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr ""
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr ""
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr ""
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr ""
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr "Reproduzir do Ponto de Edição"
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr ""
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr "Reproduzir do InÃcio"
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
-msgstr ""
+msgstr "Reproduzir Região"
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "Região de loop"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr ""
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr ""
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
-msgstr ""
+msgstr "Inverter Seleção na Trilha"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
-msgstr ""
+msgstr "Inverter Seleção"
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr ""
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr ""
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr ""
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr ""
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr ""
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr ""
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr ""
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Selecionar"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3677
msgid "Cut"
msgstr "Cortar"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3679
msgid "Copy"
msgstr "Copiar"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3691
msgid "Paste"
msgstr "Colar"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Alinhamento"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Alinhamento Relativo"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
-msgstr ""
+msgstr "Inserir Região Selecionada"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
-msgstr ""
+msgstr "Importar MÃdia"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr ""
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr ""
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr ""
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr ""
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "Retocar"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr ""
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr ""
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr ""
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr ""
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr ""
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr ""
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
msgstr ""
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr ""
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr ""
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
-msgstr ""
+msgstr "Ampliar"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
-msgstr ""
+msgstr "Reduzir"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr ""
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr ""
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "Foco de Zoom"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
-msgstr ""
+msgstr "Expandir Trilhas"
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
-msgstr ""
+msgstr "Encolher Trilhas"
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
-msgstr ""
+msgstr "Número de trilhas visÃveis"
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr ""
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr ""
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Ponto de Edição"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Modo de edição"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
msgstr ""
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
-msgstr ""
+msgstr "Desfazer"
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
-msgstr ""
+msgstr "Desfazer (%1)"
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Refazer"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Refazer (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Duplicar"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr ""
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
-msgstr ""
+msgstr "Seleção"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr ""
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr ""
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr ""
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr ""
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr ""
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr ""
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr ""
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr ""
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr ""
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr ""
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr ""
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr ""
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr ""
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr ""
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr ""
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr ""
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr ""
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr ""
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr ""
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr ""
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr ""
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
"If it is deleted, audio files used by it alone will be cleaned."
msgstr ""
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr ""
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr ""
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
msgid "Cancel"
msgstr "Cancelar"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr ""
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr ""
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr ""
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr ""
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
msgid "Edit..."
msgstr ""
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr ""
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr ""
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr ""
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr ""
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr ""
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr ""
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr ""
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr ""
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Fade"
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr ""
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
-msgstr ""
+msgstr "Região"
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
-msgstr ""
+msgstr "Disposição"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
-msgstr ""
+msgstr "Posição"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Cortar"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
-msgstr ""
+msgstr "Ganho"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
-msgstr ""
+msgstr "Intervalos"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr ""
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr ""
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Foco de Zoom"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr ""
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr ""
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr ""
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
-msgstr ""
+msgstr "Opções MIDI"
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr ""
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr ""
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr ""
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr ""
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr ""
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
-msgstr ""
+msgstr "Operações de Região"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
-msgstr ""
+msgstr "Réguas"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
-msgstr ""
+msgstr "Visualizações"
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
-msgstr ""
+msgstr "Rolagem"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr ""
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr ""
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr ""
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Altura"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr ""
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
-msgstr ""
+msgstr "Visualizar"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr ""
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr ""
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr ""
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr ""
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr ""
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr ""
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr ""
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr ""
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr ""
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr ""
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr ""
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr ""
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr ""
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr ""
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr ""
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr ""
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr ""
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr ""
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr ""
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr ""
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr ""
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr ""
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
msgid "Deselect All"
msgstr ""
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr ""
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr ""
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr ""
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr ""
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr ""
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr ""
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr ""
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr ""
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr ""
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr ""
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr ""
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr ""
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr ""
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr ""
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr ""
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr ""
-#: editor_actions.cc:247 editor_actions.cc:248
-msgid "Add Mark from Playhead"
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
+msgid "Add Mark from Playhead"
msgstr ""
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr ""
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr ""
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr ""
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr ""
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr ""
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
-msgstr ""
+msgstr "Zoom para Seleção"
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr ""
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr ""
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr ""
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr ""
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr ""
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr ""
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr ""
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr ""
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr ""
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr ""
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr ""
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr ""
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr ""
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr ""
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr ""
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr ""
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr ""
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr ""
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr ""
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr ""
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr ""
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr ""
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr ""
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr ""
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr ""
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:476
msgid "Export Range"
msgstr ""
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr ""
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr ""
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
-msgstr ""
+msgstr "Cortar"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr ""
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr ""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr ""
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr ""
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr ""
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr ""
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr ""
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr ""
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr ""
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr ""
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr ""
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Remover"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr ""
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "Enorme"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "Maior"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Grande"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "Pequeno"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr ""
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr ""
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr ""
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr ""
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr ""
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr ""
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr ""
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr ""
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr ""
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr ""
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr ""
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr ""
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr ""
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr ""
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr ""
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr ""
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr ""
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr ""
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr ""
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr ""
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr ""
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Modo de Ajuste"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr ""
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr ""
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr ""
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr ""
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr ""
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr ""
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr ""
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr ""
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr ""
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr ""
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr ""
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr ""
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr ""
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr ""
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr ""
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr ""
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr ""
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr ""
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr ""
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr ""
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr ""
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr ""
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr ""
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr ""
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr ""
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr ""
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr ""
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr ""
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr ""
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr ""
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr ""
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr ""
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr ""
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr ""
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr ""
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr ""
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
-msgstr ""
+msgstr "Monitor de VÃdeo"
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
-msgstr ""
+msgstr "VÃdeo"
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
-msgstr ""
+msgstr "Sempre VisÃvel"
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
-msgstr ""
+msgstr "Tela Cheia"
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr ""
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Mostrar Tudo"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr ""
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Ascendente"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Descendente"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Por Nome da Região"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Por Tamanho da Região"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Por Posição da Região"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
-msgstr "Por tempo data/hora da Região"
+msgstr "Por Fuso Horário da Região"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Por posição inicial da Região no arquivo"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Por posição final da Região no arquivo"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Por nome original do arquivo"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Por tamanho do arquivo original"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Por data de criação do arquivo original"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Por sistema de arquivos original"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr ""
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importar"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr ""
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr ""
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr ""
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr ""
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr ""
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1708
msgid "programming error: %1: %2"
msgstr ""
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr ""
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr ""
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr ""
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr ""
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr ""
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr ""
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr ""
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Mutar"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr ""
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Inverter horizontalmente"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr ""
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr ""
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr ""
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr ""
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr ""
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Fade In"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Fade Out"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr ""
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Preencher Trilha"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Marcar um intervalo de loop"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr ""
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr ""
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr ""
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr ""
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr ""
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
-msgstr ""
+msgstr "Exportar"
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr ""
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr ""
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr ""
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr ""
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr ""
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr ""
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
-msgstr ""
+msgstr "Propriedades"
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr ""
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr ""
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr ""
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr ""
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Análise de Volume"
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
-msgstr ""
+msgstr "Análise Espectral"
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr ""
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr ""
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr ""
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr ""
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr ""
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr ""
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr ""
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr ""
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr ""
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr ""
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr ""
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr ""
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr ""
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr ""
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr ""
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr ""
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr ""
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
-msgstr ""
+msgstr "Dividir/Separar"
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr ""
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr ""
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr ""
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr ""
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
-msgstr ""
+msgstr "Alinhas Fim"
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr ""
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr ""
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr ""
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr ""
@@ -4448,238 +5028,308 @@ msgid ""
"%2 as a new source, or skip it?"
msgstr ""
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Cancelar importação"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr ""
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr ""
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr ""
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr ""
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
-msgstr ""
+msgstr "Taxa de Amostragem"
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
msgstr ""
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr ""
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr ""
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
msgid "resize notes"
msgstr ""
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr ""
+
+#: editor_drag.cc:3178
msgid "copy meter mark"
msgstr ""
-#: editor_drag.cc:3054
-msgid "move meter mark"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr ""
+
+#: editor_drag.cc:3323
+msgid "move tempo mark"
msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3330
msgid "copy tempo mark"
msgstr ""
-#: editor_drag.cc:3185
-msgid "move tempo mark"
+#: editor_drag.cc:3461
+msgid "dilate tempo"
msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3735
msgid "change fade in length"
msgstr ""
-#: editor_drag.cc:3526
+#: editor_drag.cc:3860
msgid "change fade out length"
msgstr ""
-#: editor_drag.cc:3880
+#: editor_drag.cc:4238
msgid "move marker"
msgstr ""
-#: editor_drag.cc:4490
+#: editor_drag.cc:4505 editor_drag.cc:5832
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4889
msgid "An error occurred while executing time stretch operation"
msgstr ""
-#: editor_drag.cc:4947
+#: editor_drag.cc:5350
msgid "programming_error: %1"
msgstr ""
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5419 editor_drag.cc:5429
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5420
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5424 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5022
+#: editor_drag.cc:5425
msgid "new CD marker"
msgstr ""
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr ""
-#: editor_drag.cc:5309
+#: editor_drag.cc:5739
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr ""
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
-msgstr ""
+msgstr "Nome do Grupo"
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr ""
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr "VisÃvel|V"
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
-msgstr ""
+msgstr "Grupo é visÃvel?"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
-msgstr ""
+msgstr "Ligado"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
-msgstr ""
+msgstr "Grupo está ativado?"
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr ""
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr "Grupo|G"
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
-msgstr ""
+msgstr "Ganho compartilhado?"
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr ""
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr ""
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr ""
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr ""
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr ""
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr ""
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr ""
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr "Seleção|Sel"
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr ""
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr ""
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr ""
#: editor_group_tabs.cc:176
@@ -4688,306 +5338,347 @@ msgstr ""
#: editor_markers.cc:139
msgid "start"
-msgstr ""
+msgstr "inÃcio"
#: editor_markers.cc:140
msgid "end"
-msgstr ""
+msgstr "fim"
+
+#: editor_markers.cc:645
+msgid "mark"
+msgstr "marca"
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "adicionar marca"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr ""
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr ""
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr ""
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr ""
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "remover marca"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr ""
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
-msgstr ""
+msgstr "Reproduzir daqui"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr ""
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr ""
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr ""
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr ""
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr ""
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr ""
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr ""
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr ""
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr ""
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr ""
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr ""
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Fazer intervalo de inserção"
-#: editor_markers.cc:1407 editor_ops.cc:2040
-msgid "New Name:"
+#: editor_markers.cc:1391
+msgid "change meter lock style"
msgstr ""
-#: editor_markers.cc:1410
-msgid "Rename Mark"
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
msgstr ""
-#: editor_markers.cc:1412
+#: editor_markers.cc:1509 editor_ops.cc:2119
+msgid "New Name:"
+msgstr "Novo Nome"
+
+#: editor_markers.cc:1512
+msgid "Rename Mark"
+msgstr "Renomear Marca"
+
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr ""
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Renomear"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr ""
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr ""
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr ""
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
msgstr ""
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr ""
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Nome para a região:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr ""
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr ""
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr ""
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr ""
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr ""
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr ""
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr ""
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr ""
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr ""
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr ""
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "limpar marcas"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "limpar intervalos"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "limpar localizações"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr ""
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr ""
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr ""
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr ""
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr ""
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr ""
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr ""
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr ""
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr ""
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1635
msgid "New name:"
msgstr ""
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr ""
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr ""
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr ""
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr ""
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr ""
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr ""
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr ""
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr ""
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr ""
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr ""
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr ""
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr ""
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr ""
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -4995,11 +5686,11 @@ msgid ""
"input or vice versa."
msgstr ""
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr ""
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5008,23 +5699,23 @@ msgid ""
"Freezing will only process the signal as far as the first send/insert/return."
msgstr ""
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr ""
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr ""
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr ""
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr ""
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5033,47 +5724,47 @@ msgid ""
"You can do this without processing, which is a different operation."
msgstr ""
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr ""
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr ""
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr ""
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "cortar"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "copiar"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "limpar"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
-msgstr ""
+msgstr "Objetos"
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
-msgstr ""
+msgstr "remover região"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr ""
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5081,136 +5772,156 @@ msgstr ""
"Você quer realmente remover definitivamente a última captura?\n"
"(Isto não poderá ser desfeito)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Não, não faça nada."
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
-msgstr "Sim, remova definitivamente isto."
+msgstr "Sim, remover definitivamente."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr ""
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
-msgstr ""
+msgstr "Normalizar"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "inverter horizontalmente as regiões"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr ""
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr ""
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr ""
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr ""
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr ""
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr ""
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr ""
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr ""
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr ""
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr ""
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr ""
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr ""
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr ""
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr ""
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr ""
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr ""
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr ""
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr ""
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr ""
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr ""
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr ""
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr ""
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr ""
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr ""
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5218,62 +5929,62 @@ msgid ""
"This could take a long time."
msgstr ""
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr ""
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
msgstr ""
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr ""
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr ""
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr ""
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr ""
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr ""
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr ""
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr ""
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr ""
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr ""
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr ""
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr ""
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5283,23 +5994,19 @@ msgid ""
"\"allow-special-bus-removal\" option to be \"yes\""
msgstr ""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] "trilha"
+msgstr[1] "trilhas"
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5307,7 +6014,7 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5315,358 +6022,371 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
"This action cannot be undone, and the session file will be overwritten"
msgstr ""
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr ""
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Sim, remova isto."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr ""
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr ""
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr ""
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr ""
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr ""
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr ""
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr ""
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr ""
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr ""
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr ""
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr ""
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
-msgstr ""
+msgstr "Fim"
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr ""
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr ""
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr ""
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr ""
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr ""
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr ""
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Oculto"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr ""
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
msgstr ""
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
-msgstr ""
+msgstr "Sim, remover."
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr ""
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr ""
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
-msgstr ""
+msgstr "InÃcio"
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr ""
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr ""
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr ""
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
-msgstr ""
+msgstr "Nome da Trilha/Bus"
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
-msgstr ""
-
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
+msgstr "Trilha/Bus VisÃvel ?"
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
-msgstr ""
+msgstr "Trilha/Bus ativa ?"
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr ""
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
+msgstr "Armado para Gravação"
+
+#: editor_routes.cc:238
+msgid "Rec|RS"
msgstr ""
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Record Safe"
msgstr ""
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:239
+msgid "Muted"
msgstr ""
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr ""
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr ""
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr ""
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Ocultar Tudo"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
-msgstr ""
+msgstr "Mostrar Todas as Trilhas de Ãudio"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
-msgstr ""
+msgstr "Ocultar Todas as Trilhas de Ãudio"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr ""
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr ""
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
-msgstr ""
+msgstr "Mostrar Todas as Trilhas MIDI"
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
-msgstr ""
+msgstr "Mostrar Todas as Trilhas MIDI"
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Nova marca de localização"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "Apagar todas as localizações"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr ""
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr ""
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "Remover todos os intervalos"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr ""
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr ""
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Novo Andamento"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
-msgstr "Novo Meter"
+msgstr ""
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
-msgstr ""
+msgstr "Renomear Snapshot"
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
-msgstr ""
+msgstr "Novo nome de snapshot"
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
msgstr ""
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
-msgstr ""
+msgstr "Remover snapshot"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
+#: editor_tempodisplay.cc:318
+msgid "add tempo mark"
+msgstr "adicionar marcação de tempo"
+
+#: editor_tempodisplay.cc:343
msgid "add"
msgstr "adicionar"
-#: editor_tempodisplay.cc:215
-msgid "add tempo mark"
-msgstr ""
-
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr ""
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "pronto"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr ""
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr ""
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5675,393 +6395,462 @@ msgstr ""
msgid "stretch/shrink"
msgstr ""
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr ""
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
-msgstr ""
+msgstr "Painel de Controle do Dispositivo"
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
+msgstr "Configuração Dispositivo MIDI"
+
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
msgstr ""
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr ""
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr ""
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr ""
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
-msgstr ""
+msgstr "Calibrar Ãudio"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr ""
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr ""
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr ""
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
-msgstr ""
+msgstr "Canal de SaÃda"
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
-msgstr ""
+msgstr "Canal de Entrada"
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr ""
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr ""
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
-msgstr ""
+msgstr "Latência"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
-msgstr ""
+msgstr "Sistema de Ãudio:"
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr ""
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "Dispositivo de Entrada:"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "Dispositivo de SaÃda:"
+
+#: engine_dialog.cc:582
msgid "Device:"
-msgstr ""
+msgstr "Dispositivo:"
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
-msgstr ""
+msgstr "Taxa de Amostragem:"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
-msgstr ""
+msgstr "Tamanho do Buffer:"
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "PerÃodos:"
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
-msgstr ""
+msgstr "Canais de Entrada:"
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
-msgstr ""
+msgstr "Canais de SaÃda:"
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
-msgstr ""
+msgstr "Latência de Entrada do Hardware:"
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
-msgstr ""
+msgstr "Amostras"
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
-msgstr ""
+msgstr "Latência de SaÃda do Hardware:"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
-msgstr ""
+msgstr "Sistema MIDI:"
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
"Latency calibration requires playback and capture"
msgstr ""
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
-msgstr ""
+msgstr "Dispositivos MIDI"
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
-msgstr ""
+msgstr "Dispositivo"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
-msgstr ""
+msgstr "Latências de Hardware"
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
-msgstr ""
+msgstr "Calibrar"
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr ""
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
msgstr[0] ""
msgstr[1] ""
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr ""
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr ""
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Ativar"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
-#: engine_dialog.cc:2185
-msgid "Connect to %1"
+#: engine_dialog.cc:3088
+msgid "Connected"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3099
+msgid "Connect to %1"
msgstr ""
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Parado"
+
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr ""
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr ""
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr ""
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
msgstr ""
-#: export_dialog.cc:46
+#: export_dialog.cc:49
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
-#: export_dialog.cc:47
+#: export_dialog.cc:50
msgid "List files"
msgstr ""
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
msgid "File format"
msgstr ""
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
msgid "Time Span"
msgstr ""
-#: export_dialog.cc:160
+#: export_dialog.cc:165
msgid "Channels"
msgstr ""
-#: export_dialog.cc:182
+#: export_dialog.cc:187
msgid ""
"Export has been aborted due to an error!\n"
"See the Log for details."
msgstr ""
-#: export_dialog.cc:251
+#: export_dialog.cc:298
msgid "Files that will be overwritten"
msgstr ""
-#: export_dialog.cc:296
+#: export_dialog.cc:343
msgid "Export initialization failed: %1"
msgstr ""
-#: export_dialog.cc:306
+#: export_dialog.cc:353
msgid "Stop Export"
msgstr "Cancelar Exportação"
-#: export_dialog.cc:327
+#: export_dialog.cc:383
msgid "export"
msgstr ""
-#: export_dialog.cc:346
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:407
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:453 export_dialog.cc:455
msgid "<span color=\"#ffa755\">Error: "
msgstr ""
-#: export_dialog.cc:385
+#: export_dialog.cc:465
msgid "<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:387
+#: export_dialog.cc:467
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:411
+#: export_dialog.cc:491
msgid "Export Selection"
-msgstr ""
+msgstr "Exportar Seleção"
-#: export_dialog.cc:425
+#: export_dialog.cc:505
msgid "Export Region"
-msgstr ""
+msgstr "Exportar Região"
-#: export_dialog.cc:434
+#: export_dialog.cc:514
msgid "Source"
msgstr ""
-#: export_dialog.cc:450
+#: export_dialog.cc:530
msgid "Stem Export"
msgstr ""
@@ -6069,172 +6858,246 @@ msgstr ""
msgid "Add another format"
msgstr ""
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr ""
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Localização"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
-msgid "No format!"
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
msgstr ""
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:286
+msgid "No format!"
+msgstr "Sem formato!"
+
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr ""
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
-msgstr ""
+msgstr "Rótulo"
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
-msgstr ""
+msgstr "Nome da Sessão"
-#: export_filename_selector.cc:34
-msgid "Revision:"
-msgstr ""
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "Indicador de Data"
#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr "Revisão:"
+
+#: export_filename_selector.cc:38
msgid "Folder:"
-msgstr ""
+msgstr "Diretório:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Localizar"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "Abrir Diretório"
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr ""
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr ""
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr ""
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr ""
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr ""
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr ""
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr ""
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr ""
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr ""
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr ""
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "\\u2227"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr ""
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr ""
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr ""
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr ""
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr ""
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr ""
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr ""
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6242,123 +7105,309 @@ msgstr ""
msgid "Preset"
msgstr ""
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
msgstr ""
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
+#: export_report.cc:56
+msgid "Export Report/Analysis"
msgstr ""
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "Selecionar Tudo"
-
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
msgstr ""
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Duração"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Tempo"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "Erro:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
msgstr ""
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
+#: export_report.cc:222
+msgid "-888"
msgstr ""
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
msgstr ""
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
msgstr ""
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
msgstr ""
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
+#: export_report.cc:232
+msgid "+888.88 dB"
msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
-msgid "P"
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
msgstr ""
-#: gain_meter.cc:799 panner_ui.cc:609
-msgid "T"
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
msgstr ""
-#: gain_meter.cc:802 panner_ui.cc:612
-msgid "W"
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
msgstr ""
-#: generic_pluginui.cc:83
-msgid "<span size=\"large\">Presets</span>"
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
msgstr ""
-#: generic_pluginui.cc:97
-msgid "Manual"
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
msgstr ""
-#: generic_pluginui.cc:106
-msgid "All Automation"
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
msgstr ""
-#: generic_pluginui.cc:250
-msgid "Switches"
+#: export_report.cc:288
+msgid "0|A8"
msgstr ""
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
+#: export_report.cc:394
+msgid "%1 dB"
msgstr ""
-#: generic_pluginui.cc:293
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Não foi possÃvel ler o arquivo: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "não foi possÃvel acessar arquivo de áudio"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr ""
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr ""
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr "Selecionar Tudo"
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr ""
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr ""
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr ""
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr ""
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr ""
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
+msgid "P"
+msgstr ""
+
+#: gain_meter.cc:822
+msgid "T"
+msgstr ""
+
+#: gain_meter.cc:825
+msgid "W"
+msgstr ""
+
+#: generic_pluginui.cc:83
+msgid "<span size=\"large\">Presets</span>"
+msgstr ""
+
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
+msgid "Manual"
+msgstr ""
+
+#: generic_pluginui.cc:107
+msgid "All Automation"
+msgstr ""
+
+#: generic_pluginui.cc:250
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"Plugin Editor: não foi possÃvel construir elemento de controle para a porta "
"%1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr ""
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3665
+msgid "Controls"
+msgstr ""
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr ""
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr ""
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr ""
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr ""
@@ -6367,126 +7416,163 @@ msgstr ""
msgid "MIDI Connection Manager"
msgstr ""
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Desconectar"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "porta"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
-msgstr ""
+msgstr "Seleção..."
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
-msgstr ""
+msgstr "Gravação Ativada"
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr ""
-#: group_tabs.cc:320
-msgid "Create New Group ..."
+#: group_tabs.cc:316
+msgid "Create New Group From..."
msgstr ""
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
msgstr ""
-#: group_tabs.cc:324
-msgid "Edit Group..."
+#: group_tabs.cc:344
+msgid "Create New Group ..."
+msgstr "Criar Novo Grupo"
+
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
msgstr ""
-#: group_tabs.cc:325
+#: group_tabs.cc:355
+msgid "Edit Group..."
+msgstr "Editar Grupo"
+
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr ""
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
+msgstr "Remover Grupo"
+
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
msgstr ""
-#: group_tabs.cc:329
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr ""
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr ""
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr ""
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr ""
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr ""
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr ""
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr ""
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr ""
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr ""
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
-msgstr ""
+msgstr "mover"
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr ""
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr ""
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr ""
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr ""
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr ""
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr ""
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr ""
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr ""
@@ -6494,64 +7580,89 @@ msgstr ""
msgid "I/O selector"
msgstr ""
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1 entrada"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1 saÃda"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr ""
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
-#: keyeditor.cc:54
-msgid "Remove shortcut"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
msgstr ""
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:77
+msgid "Key Bindings"
msgstr ""
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
-msgstr ""
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Remover Atalho"
+
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "Procurar..."
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr "Imprimir"
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
msgstr ""
-#: keyeditor.cc:269
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Ação"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Atalho"
+
+#: keyeditor.cc:370
msgid "RegionList"
msgstr ""
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
msgstr ""
#: latency_gui.cc:40
@@ -6562,109 +7673,218 @@ msgstr ""
msgid "period"
msgstr ""
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Reiniciar"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr ""
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr ""
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr ""
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr ""
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr ""
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr ""
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr ""
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr ""
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr ""
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr ""
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr ""
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr ""
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr ""
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr ""
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr ""
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr ""
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr ""
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr ""
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr ""
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr ""
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "adicionar marca de intervalo"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "Salvo como %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "Salvar Como"
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr ""
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr ""
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6673,77 +7893,97 @@ msgid ""
"Click OK to exit %1."
msgstr ""
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr ""
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:350
msgid " (built using "
msgstr ""
-#: main.cc:313
+#: main.cc:353
msgid " and GCC version "
msgstr ""
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr ""
-#: main.cc:324
+#: main.cc:364
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
msgstr ""
-#: main.cc:326
+#: main.cc:366
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr ""
-#: main.cc:327
+#: main.cc:367
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
-#: main.cc:328
+#: main.cc:368
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Isto é um Software Livre. Fique à vontade para redistribuÃ-lo "
-#: main.cc:329
+#: main.cc:369
msgid "under certain conditions; see the source for copying conditions."
msgstr "com algumas condições; veja o fonte para mais detalhes"
-#: main.cc:334
+#: main.cc:374
msgid "could not initialize %1."
msgstr ""
-#: main.cc:344
+#: main.cc:384
msgid "Cannot xinstall SIGPIPE error handler"
msgstr ""
-#: main.cc:351
+#: main.cc:391
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:398
msgid "could not create %1 GUI"
msgstr ""
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr ""
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
msgid "MarkerText"
msgstr ""
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Nenhum"
@@ -6824,11 +8064,11 @@ msgstr ""
msgid "Click to force all MIDI channel messages to channel %1"
msgstr ""
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr ""
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr ""
@@ -6932,200 +8172,196 @@ msgstr ""
msgid "MidiPortDialog"
msgstr ""
-#: midi_region_view.cc:859
+#: midi_region_view.cc:855
msgid "channel edit"
msgstr ""
-#: midi_region_view.cc:895
+#: midi_region_view.cc:891
msgid "velocity edit"
msgstr ""
-#: midi_region_view.cc:954
+#: midi_region_view.cc:958
msgid "add note"
msgstr ""
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1902
msgid "step add"
msgstr ""
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
msgid "alter patch change"
msgstr ""
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2055
msgid "add patch change"
msgstr ""
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
msgid "move patch change"
msgstr ""
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
msgid "delete patch change"
msgstr ""
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2129
msgid "delete selection"
-msgstr ""
+msgstr "remover seleção"
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2146
msgid "delete note"
-msgstr ""
+msgstr "remover nota"
#: midi_region_view.cc:2587
msgid "move notes"
-msgstr ""
+msgstr "mover notas"
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3137
msgid "change velocities"
msgstr ""
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3203
msgid "transpose"
msgstr ""
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3231
msgid "change note lengths"
msgstr ""
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3307
msgid "nudge"
msgstr ""
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3322
msgid "change channel"
msgstr ""
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3370
msgid "Bank "
msgstr ""
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3372
msgid "Channel "
msgstr ""
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3559
msgid "paste"
msgstr ""
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr ""
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr ""
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr ""
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr ""
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr ""
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr ""
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr ""
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr ""
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr ""
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr ""
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr ""
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr ""
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr ""
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr ""
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr ""
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr ""
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr ""
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr ""
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr ""
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr ""
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr ""
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr ""
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7141,7 +8377,7 @@ msgstr ""
msgid "Decimal"
msgstr ""
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr ""
@@ -7157,35 +8393,36 @@ msgstr ""
msgid "New velocity"
msgstr ""
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr ""
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr ""
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr ""
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr ""
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr ""
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr ""
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7197,7 +8434,7 @@ msgid ""
"\n"
msgstr ""
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr ""
@@ -7205,516 +8442,706 @@ msgstr ""
msgid "Missing Plugins"
msgstr ""
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr "OK"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr ""
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr ""
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1548 mixer_strip.cc:1559 rc_option_editor.cc:3147
msgid "Comments"
-msgstr ""
+msgstr "Comentários"
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr ""
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
msgstr ""
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr ""
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr ""
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr ""
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr ""
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2224
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
+msgstr "Mixar Grupo"
+
+#: mixer_strip.cc:275
+msgid "Trim: "
msgstr ""
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
msgid "Phase Invert"
msgstr ""
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
msgid "Record & Monitor"
msgstr ""
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:545
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:590
msgid "Enable/Disable MIDI input"
msgstr ""
-#: mixer_strip.cc:688
+#: mixer_strip.cc:756
msgid "Aux"
msgstr ""
-#: mixer_strip.cc:710
+#: mixer_strip.cc:782
msgid "Snd"
msgstr ""
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:911 mixer_strip.cc:1014
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
-msgid "<b>INPUT</b> to %1"
+#: mixer_strip.cc:1298
+msgid "MIDI "
msgstr ""
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1302
+msgid "<b>INPUT</b> to %1"
+msgstr "<b>ENTRADA</b> PARA %1"
+
+#: mixer_strip.cc:1304 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
-msgstr ""
+msgstr "<b>SAÃDA</b> DE %1"
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1417 monitor_section.cc:1598
msgid "Disconnected"
-msgstr ""
+msgstr "Desconectado"
-#: mixer_strip.cc:1413
-msgid "*Comments*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
msgstr ""
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
msgid "Cmt"
msgstr ""
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr ""
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr ""
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1604
msgid "Grp"
msgstr ""
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1607
msgid "~G"
msgstr ""
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
-msgstr ""
+msgstr "Cor..."
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1650 route_time_axis.cc:587
msgid "Comments..."
-msgstr ""
+msgstr "Comentários..."
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1652 route_time_axis.cc:589
msgid "Inputs..."
-msgstr ""
+msgstr "Entradas..."
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1654 route_time_axis.cc:591
msgid "Outputs..."
-msgstr ""
+msgstr "SaÃdas..."
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1659
msgid "Save As Template..."
+msgstr "Salvar como Esquema..."
+
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Ativar"
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
msgstr ""
-#: mixer_strip.cc:1530
-msgid "Adjust Latency..."
+#: mixer_strip.cc:1683 processor_box.cc:3710
+msgid "Pin Connections..."
msgstr ""
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1687
+msgid "Adjust Latency..."
+msgstr "Ajustar Latência"
+
+#: mixer_strip.cc:1690
msgid "Protect Against Denormals"
msgstr ""
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr ""
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "Duplicar..."
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:2004
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2008
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2024
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2028
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2032
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2036
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2041
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2202 route_ui.cc:193
msgid "Disk"
msgstr ""
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2217 monitor_section.cc:81
msgid "AFL"
msgstr ""
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2220 monitor_section.cc:82
msgid "PFL"
msgstr ""
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2230 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2231 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
+
+#: mixer_strip.cc:2249
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2254
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2255
+msgid "SoloLock|L"
msgstr ""
-#: mixer_strip.cc:2241
+#: mixer_strip.cc:2460
msgid "Pre Fader"
msgstr "Pré Fade"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2461
msgid "Post Fader"
msgstr "Pós Fade"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2506 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2508 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2510 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
+msgstr "Grupo"
+
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "Plugins Favoritos"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
msgstr ""
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr "não foi encontrada qualquer trilha para o painel de mixer"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-tudo-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Painéis"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr ""
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr ""
-#: meter_strip.cc:884
+#: meter_strip.cc:895
msgid "Short"
msgstr ""
-#: meter_strip.cc:885
+#: meter_strip.cc:896
msgid "Tall"
msgstr ""
-#: meter_strip.cc:886
+#: meter_strip.cc:897
msgid "Grande"
msgstr ""
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr ""
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr ""
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr ""
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr ""
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr ""
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
msgstr ""
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
msgstr ""
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr ""
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr ""
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr ""
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr ""
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr ""
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
msgstr ""
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
msgstr ""
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
msgstr ""
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
msgstr ""
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
msgstr ""
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
msgstr ""
-#: monitor_section.cc:323
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr ""
+
+#: monitor_section.cc:399
msgid "Monitor"
msgstr ""
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr ""
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr ""
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr ""
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr ""
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr ""
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr ""
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr ""
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr ""
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr ""
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr ""
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr ""
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -7769,10 +9196,6 @@ msgid ""
"relies on a stable, sustainable income stream. Thanks for using Ardour!"
msgstr ""
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr ""
@@ -7781,6 +9204,10 @@ msgstr ""
msgid "Name of new preset"
msgstr ""
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr ""
@@ -7789,8 +9216,8 @@ msgstr ""
msgid "Normalize region"
msgstr ""
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
msgstr ""
#: normalize_dialog.cc:56
@@ -7809,103 +9236,106 @@ msgstr "Normalizar"
msgid "Select Note"
msgstr ""
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Usual: "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr ""
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr ""
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr ""
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr ""
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr ""
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "Ignorar"
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr ""
@@ -7917,6 +9347,22 @@ msgstr "modo automático de pan"
msgid "Pan automation type"
msgstr "Tipo do pan automático"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr ""
@@ -7942,151 +9388,305 @@ msgstr ""
msgid "Imported"
msgstr ""
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
msgid "dB scale"
msgstr ""
-#: plugin_eq_gui.cc:116
+#: plugin_eq_gui.cc:124
msgid "Show phase"
msgstr ""
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr ""
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr ""
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr ""
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr ""
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr ""
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr ""
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr ""
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr ""
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr ""
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr ""
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Tipo"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr ""
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr ""
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr ""
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr ""
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr ""
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr ""
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr ""
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Adicionar plugin na lista de efeitos"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Remover plugin da lista de efeitos"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Atualizar plugins disponÃveis"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr ""
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
"See the Log window for more details (maybe)"
msgstr ""
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr ""
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr ""
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr ""
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr ""
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr ""
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr ""
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8094,146 +9694,167 @@ msgstr ""
msgid "Add"
msgstr "Adicionar"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr ""
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr ""
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr ""
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr ""
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr ""
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr ""
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
msgstr ""
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr ""
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] ""
msgstr[1] ""
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr ""
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr ""
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr ""
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:795
+msgid "(none)"
msgstr ""
#: port_group.cc:338
-msgid "%1 Tracks"
-msgstr ""
+msgid "%1 Busses"
+msgstr "%1 Bus"
#: port_group.cc:339
+msgid "%1 Tracks"
+msgstr "%1 Trilhas"
+
+#: port_group.cc:340
msgid "Hardware"
msgstr ""
-#: port_group.cc:340
+#: port_group.cc:341
msgid "%1 Misc"
msgstr ""
-#: port_group.cc:341
+#: port_group.cc:342
msgid "Other"
msgstr ""
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:435 port_group.cc:436
msgid "LTC Out"
msgstr ""
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:439 port_group.cc:440
msgid "LTC In"
msgstr ""
-#: port_group.cc:463
+#: port_group.cc:474
msgid "MTC in"
msgstr ""
-#: port_group.cc:466
+#: port_group.cc:477
msgid "MIDI control in"
msgstr ""
-#: port_group.cc:469
+#: port_group.cc:480
msgid "MIDI clock in"
msgstr ""
-#: port_group.cc:472
+#: port_group.cc:483
msgid "MMC in"
msgstr ""
-#: port_group.cc:476
+#: port_group.cc:487
msgid "MTC out"
msgstr ""
-#: port_group.cc:479
+#: port_group.cc:490
msgid "MIDI control out"
msgstr ""
-#: port_group.cc:482
+#: port_group.cc:493
msgid "MIDI clock out"
msgstr ""
-#: port_group.cc:485
+#: port_group.cc:496
msgid "MMC out"
msgstr ""
-#: port_group.cc:532
+#: port_group.cc:555
msgid ":monitor"
msgstr ""
-#: port_group.cc:544
+#: port_group.cc:571
msgid "system:"
msgstr ""
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:572
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:573
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:578
+msgid "Scene "
msgstr ""
#: port_insert_ui.cc:39
@@ -8256,77 +9877,76 @@ msgstr ""
msgid "Port Insert "
msgstr ""
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr ""
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr ""
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr ""
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr ""
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr ""
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr ""
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Rescanear"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr ""
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr ""
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr ""
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr ""
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr ""
@@ -8338,223 +9958,239 @@ msgstr ""
msgid "There are no %1 ports to connect."
msgstr ""
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1528
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1531
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr ""
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr ""
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr ""
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
msgid "off"
msgstr "desligado"
-#: processor_box.cc:957
+#: processor_box.cc:1819
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
msgstr ""
+"Clique com o botão direito para adicionar, remover\n"
+"ou editar plugins, inserts, sends e mais..."
+
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:2455 processor_box.cc:2998
msgid "Plugin Incompatibility"
msgstr ""
-#: processor_box.cc:1432
+#: processor_box.cc:2458
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr ""
-#: processor_box.cc:1438
+#: processor_box.cc:2464
msgid ""
"\n"
"This plugin has:\n"
msgstr ""
-#: processor_box.cc:1441
+#: processor_box.cc:2467
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1445
+#: processor_box.cc:2471
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1448
+#: processor_box.cc:2474
msgid ""
"\n"
"but at the insertion point, there are:\n"
msgstr ""
-#: processor_box.cc:1451
+#: processor_box.cc:2477
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1455
+#: processor_box.cc:2481
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1458
+#: processor_box.cc:2484
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
msgstr ""
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:3001
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
"outputs will not work correctly."
msgstr ""
-#: processor_box.cc:1991
+#: processor_box.cc:3201
msgid "Rename Processor"
msgstr ""
-#: processor_box.cc:2022
+#: processor_box.cc:3232
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
-#: processor_box.cc:2159
+#: processor_box.cc:3383
msgid "plugin insert constructor failed"
msgstr ""
-#: processor_box.cc:2170
+#: processor_box.cc:3394
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
"could not match the configuration of this track."
msgstr ""
-#: processor_box.cc:2216
+#: processor_box.cc:3440
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3444 processor_box.cc:3469
msgid "Yes, remove them all"
msgstr ""
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3446 processor_box.cc:3471
msgid "Remove processors"
msgstr ""
-#: processor_box.cc:2237
+#: processor_box.cc:3461
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2240
+#: processor_box.cc:3464
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2428
+#: processor_box.cc:3653
msgid "New Plugin"
-msgstr ""
+msgstr "Novo Plugin"
-#: processor_box.cc:2431
+#: processor_box.cc:3656
msgid "New Insert"
-msgstr ""
+msgstr "Novo Insert"
-#: processor_box.cc:2434
+#: processor_box.cc:3659
msgid "New External Send ..."
-msgstr ""
+msgstr "Novo Send Externo"
-#: processor_box.cc:2438
+#: processor_box.cc:3663
msgid "New Aux Send ..."
-msgstr ""
+msgstr "Novo Send Auxiliar"
-#: processor_box.cc:2441
+#: processor_box.cc:3666
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3668
msgid "Clear (all)"
-msgstr ""
+msgstr "Limpar (Tudo)"
-#: processor_box.cc:2445
+#: processor_box.cc:3670
msgid "Clear (pre-fader)"
-msgstr ""
+msgstr "Limpar (pre-fader)"
-#: processor_box.cc:2447
+#: processor_box.cc:3672
msgid "Clear (post-fader)"
-msgstr ""
+msgstr "Limpar (pós-fader_"
-#: processor_box.cc:2473
+#: processor_box.cc:3702
msgid "Activate All"
-msgstr ""
+msgstr "Ativar Tudo"
-#: processor_box.cc:2475
+#: processor_box.cc:3704
msgid "Deactivate All"
-msgstr ""
+msgstr "Desativar Tudo"
-#: processor_box.cc:2477
+#: processor_box.cc:3706
msgid "A/B Plugins"
msgstr ""
-#: processor_box.cc:2486
+#: processor_box.cc:3719
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4051
msgid "%1: %2 (by %3)"
msgstr ""
-#: processor_box.cc:2791
+#: processor_box.cc:4053
msgid "%1 (by %2)"
msgstr ""
@@ -8582,345 +10218,444 @@ msgstr ""
msgid "main grid"
msgstr ""
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr ""
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr ""
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr ""
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr ""
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr ""
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr ""
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
msgstr ""
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
msgstr ""
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr ""
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr ""
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr ""
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr ""
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr ""
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr ""
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr ""
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ button"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr ""
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr ""
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
msgstr ""
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
msgstr ""
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
msgstr ""
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
msgstr ""
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
msgstr ""
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
msgstr ""
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
msgstr ""
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
msgstr ""
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
msgstr ""
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
msgstr ""
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "\\u221e"
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
msgstr ""
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
msgstr ""
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
msgstr ""
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
msgstr ""
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
msgstr ""
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
msgstr ""
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
msgstr ""
-#: rc_option_editor.cc:1319
-msgid "all available processors"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
msgstr ""
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr ""
+
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr ""
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr ""
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
-msgstr ""
+msgstr "Opções|Desfazer"
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr ""
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
msgstr ""
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
msgstr ""
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr ""
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr ""
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr ""
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr ""
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automação"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr ""
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr ""
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr "Opções de Operação"
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr ""
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -8929,25 +10664,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr ""
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr ""
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr ""
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -8956,11 +10691,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -8970,39 +10705,83 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr ""
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr ""
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "Operação/Sincronização"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr ""
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9016,27 +10795,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9049,659 +10828,929 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr ""
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr ""
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr ""
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is 0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is 0dBu ^= -18dBFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
msgstr ""
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
msgstr ""
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
msgstr ""
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
msgstr ""
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
msgstr ""
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
msgstr ""
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
msgstr ""
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
msgstr ""
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
msgstr ""
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linear"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
msgstr ""
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
msgstr ""
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
msgstr ""
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
msgstr ""
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
msgstr ""
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
msgstr ""
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
msgstr ""
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linear"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr ""
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr ""
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr ""
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr ""
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr ""
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr ""
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr ""
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr ""
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr ""
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr ""
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr ""
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr ""
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr ""
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr ""
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr ""
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr ""
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr ""
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr ""
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
msgstr ""
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
msgstr ""
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
msgstr ""
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
msgstr ""
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
msgstr ""
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
msgstr ""
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
msgstr ""
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr ""
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr ""
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr ""
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr ""
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr ""
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr ""
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr ""
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr ""
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr ""
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr ""
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr ""
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr ""
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr ""
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr ""
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
msgstr ""
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
msgstr ""
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
msgstr ""
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
msgstr ""
-#: rc_option_editor.cc:2138
+#: rc_option_editor.cc:2720
msgid "Send MIDI control feedback"
msgstr ""
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
msgstr ""
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
msgstr ""
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
msgstr ""
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
msgstr ""
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
msgstr ""
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
msgstr ""
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr ""
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr ""
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
" <i>(if available for your language preferences)</i>"
msgstr ""
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr ""
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:2853
+msgid "General"
msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
msgid "Preferences|GUI"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3072
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3080
msgid "Show tooltips if mouse hovers over a control"
msgstr ""
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3088
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3127
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3135
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3153
msgid "Mixer Strip"
msgstr ""
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3163
msgid "Use narrow strips in the mixer by default"
msgstr ""
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3180
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3186
msgid "short"
msgstr ""
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3187
msgid "medium"
msgstr ""
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3188
msgid "long"
msgstr ""
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3194
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3200
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3201
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3211
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3221
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3227
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3237
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3243
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3248
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3249
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3250
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3251
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3257
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3313
msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3320
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3356
msgid "Theme"
msgstr ""
-#: region_editor.cc:79
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "ouvir esta região"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr ""
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
msgid "End:"
msgstr "Final:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr ""
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr ""
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr ""
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr ""
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr ""
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr ""
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr ""
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr ""
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr ""
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr ""
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr ""
@@ -9721,33 +11770,33 @@ msgstr ""
msgid "Choose Top Region"
msgstr ""
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr ""
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr ""
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr ""
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] ""
msgstr[1] ""
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr ""
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -9793,55 +11842,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr ""
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr ""
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr ""
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr ""
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr ""
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr ""
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr ""
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
msgstr ""
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr ""
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr ""
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr ""
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr ""
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr ""
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr ""
@@ -9865,25 +11922,21 @@ msgstr ""
msgid "Active state"
msgstr ""
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Cor"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr ""
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr ""
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
#: route_params_ui.cc:84
msgid "Tracks/Busses"
-msgstr ""
+msgstr "Trilhas / Bus"
#: route_params_ui.cc:103
msgid "Inputs"
@@ -9897,404 +11950,389 @@ msgstr "SaÃdas"
msgid "Plugins, Inserts & Sends"
msgstr ""
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "não foi encontrada qualquer elemento para encaminhamento"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
-msgstr ""
+msgstr "Atraso de Playback: %<PRId64> amostras"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "NENHUMA TRILHA"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Adicionar Trilha ou Bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
+msgstr "Nenhuma Trilha ou Bus Selecionado(a)"
+
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
msgstr ""
-#: route_time_axis.cc:181
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr ""
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
-msgstr "Gravar"
+msgstr "Armar para Gravação"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
-msgstr ""
+msgstr "Grupo de roteamento"
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr ""
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr ""
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr ""
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr ""
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr ""
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr ""
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr ""
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr ""
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr ""
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr ""
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr ""
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr ""
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr ""
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr ""
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr ""
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr ""
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr ""
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr ""
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr ""
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Lista de reprodução"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr ""
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr ""
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr ""
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr ""
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr ""
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr ""
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr ""
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr ""
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Limpar Atual"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr ""
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr ""
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr ""
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr ""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr ""
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr ""
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
-msgstr ""
+msgstr "Mutar essa trilha"
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
-msgstr ""
+msgstr "Mutar outras trilhas (sem solo)"
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
-msgstr ""
+msgstr "Permitir gravação nesta trilha"
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr ""
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr ""
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr ""
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr ""
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr ""
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr ""
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr ""
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr ""
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr ""
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr ""
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr ""
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr ""
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "Controle de SaÃdas"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "SaÃdas Principais"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr ""
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
msgstr ""
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr ""
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr ""
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr ""
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr ""
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ""
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr ""
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr ""
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr ""
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr ""
-#: route_ui.cc:1959
-msgid "Remote Control ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
msgstr ""
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
msgstr ""
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
msgstr ""
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
msgstr ""
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
msgstr ""
#: search_path_option.cc:35
@@ -10309,125 +12347,157 @@ msgstr ""
msgid "the session folder"
msgstr ""
-#: send_ui.cc:134
-msgid "Send "
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
msgstr ""
-#: session_dialog.cc:61
-msgid "Session Setup"
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
msgstr ""
-#: session_dialog.cc:66
-msgid "Advanced options ..."
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
msgstr ""
-#: session_dialog.cc:263
-msgid "New Session"
+#: script_selector.cc:131
+msgid "Select Script to unload"
msgstr ""
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
msgstr ""
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
msgstr ""
-#: session_dialog.cc:324
+#: send_ui.cc:134
+msgid "Send "
+msgstr ""
+
+#: session_dialog.cc:71
+msgid "Session Setup"
+msgstr "Configurar Sessão"
+
+#: session_dialog.cc:76
+msgid "Advanced options ..."
+msgstr "Opções Avançadas"
+
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessões Recentes"
+
+#: session_dialog.cc:311
msgid "Sample Rate"
+msgstr "Amostragem"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr "Resolução"
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr "Ãltima Modificação"
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Nova Sessão"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
msgstr ""
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
-msgstr ""
+msgstr "Selecionar Sessão"
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
-msgstr ""
+msgstr "Outras Sessões"
+
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr "Modo de Segurança: Desabilitar todos os plugins"
-#: session_dialog.cc:384
+#: session_dialog.cc:454
msgid "Open"
-msgstr ""
+msgstr "Abrir"
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
-msgstr ""
+msgstr "Nome da Sessão"
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
-msgstr ""
+msgstr "Criar diretório da sessão em:"
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr ""
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr ""
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr ""
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
-msgstr ""
+msgstr "canais"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr ""
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
-msgstr ""
+msgstr "Entradas"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
-msgstr ""
+msgstr "SaÃdas"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
-msgstr ""
+msgstr "Criar Bus Mestre"
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
-msgstr ""
+msgstr "Conectar entradas fÃsicas automaticamente"
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
-msgstr ""
+msgstr "Usar somente"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
-msgstr ""
+msgstr "Conectar saÃdas automaticamente"
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
-msgstr ""
+msgstr "... para o bus mestre"
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
-msgstr ""
-
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
+msgstr "... para saÃdas fÃsicas"
#: session_import_dialog.cc:74
msgid "Elements"
@@ -10449,197 +12519,197 @@ msgstr ""
msgid "This will select all elements of this type!"
msgstr ""
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Campo"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr ""
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
-msgstr ""
+msgstr "Usuário"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
-msgstr ""
+msgstr "e-mail"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr ""
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
-msgstr ""
+msgstr "Organização"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
-msgstr ""
+msgstr "PaÃs"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
-msgstr ""
+msgstr "TÃtulo"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
-msgstr ""
+msgstr "Número da faixa"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
-msgstr ""
+msgstr "SubtÃtulo"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
-msgstr ""
+msgstr "Agrupamento"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
-msgstr ""
+msgstr "Artista"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
-msgstr ""
+msgstr "Gênero"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
-msgstr ""
+msgstr "Comentários"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
-msgstr ""
+msgstr "Direitos Autorais"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
-msgstr ""
+msgstr "Ãlbum"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
-msgstr ""
+msgstr "Ano"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
-msgstr ""
+msgstr "Artista do Ãlbum"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
-msgstr ""
+msgstr "Total de Faixas"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
-msgstr ""
+msgstr "SubsÃtulo do Disco"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
-msgstr ""
+msgstr "Número do Disco"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr ""
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
-msgstr ""
+msgstr "Compilação"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr ""
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr ""
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
-msgstr ""
+msgstr "Letrista"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
-msgstr ""
+msgstr "Compositor"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr ""
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr ""
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
-msgstr ""
+msgstr "Arranjador"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
-msgstr ""
+msgstr "Engenheiro de Ãudio"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
-msgstr ""
+msgstr "Produtor"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr ""
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr ""
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr ""
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr ""
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr ""
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr ""
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr ""
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr ""
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr ""
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
msgstr ""
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr ""
@@ -10786,209 +12856,230 @@ msgid "Destructive crossfade length"
msgstr ""
#: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
msgstr ""
#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr ""
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr ""
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr ""
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr ""
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr ""
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr ""
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr ""
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr ""
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr ""
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr ""
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr ""
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr ""
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr ""
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr ""
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr ""
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr ""
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr ""
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
-msgstr ""
+msgstr "Mostrador de Volume"
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
-msgstr ""
+msgstr "Exibir Roteamento"
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
-msgstr ""
+msgstr "Mostrar Trilhas MIDI"
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr ""
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr ""
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr ""
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr ""
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr ""
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr ""
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr ""
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr ""
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr ""
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr ""
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr ""
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr ""
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr ""
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr ""
@@ -11024,26 +13115,14 @@ msgstr ""
msgid "Timestamp:"
msgstr ""
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr ""
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Não foi possÃvel ler o arquivo: %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr ""
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "não foi possÃvel acessar arquivo de áudio"
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr ""
@@ -11052,284 +13131,280 @@ msgstr ""
msgid "Search"
msgstr ""
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr ""
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr ""
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr ""
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
msgid "All files"
msgstr ""
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
msgid "Browse Files"
msgstr ""
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr ""
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr ""
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr ""
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr ""
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr ""
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr ""
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr ""
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr ""
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr ""
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr ""
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr ""
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr ""
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
msgid "Filename"
msgstr ""
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr ""
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr ""
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr ""
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr ""
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr ""
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
msgstr ""
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr ""
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr ""
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr ""
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr ""
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr ""
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr ""
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr ""
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr ""
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr ""
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
msgstr ""
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr ""
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr ""
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr ""
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr ""
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr ""
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr ""
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr ""
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr ""
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr ""
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr ""
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr ""
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Rapidamente"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr ""
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr ""
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr "Retornável"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr "Fixo"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr ""
-#: shuttle_control.cc:568
-msgid "Playing"
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
msgstr ""
-#: shuttle_control.cc:583
+#: shuttle_control.cc:633
+msgid "Playing"
+msgstr "Reproduzindo"
+
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr ""
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ""
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11354,7 +13429,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr ""
@@ -11370,17 +13445,17 @@ msgstr ""
msgid "Azimuth:"
msgstr ""
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr ""
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11390,15 +13465,15 @@ msgid ""
"program.</span> "
msgstr ""
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
-msgstr ""
+msgstr "Bem-vindo ao %1"
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
-msgstr ""
+msgstr "Diretório padrão para %1 sessões"
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11408,11 +13483,11 @@ msgid ""
"<i>(You can put new sessions anywhere, this is just a default)</i>"
msgstr ""
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr ""
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11426,31 +13501,31 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr ""
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr ""
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
msgstr ""
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr ""
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
msgstr ""
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11458,46 +13533,42 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr ""
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ""
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ""
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ""
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr ""
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr ""
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr ""
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr ""
@@ -11606,11 +13677,11 @@ msgstr ""
msgid "Insert a program change message"
msgstr ""
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr ""
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr ""
@@ -11622,240 +13693,244 @@ msgstr ""
msgid "Octave"
msgstr ""
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr ""
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr ""
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr ""
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr ""
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr ""
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr ""
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr ""
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr ""
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr ""
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr ""
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr ""
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr ""
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr ""
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr ""
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr ""
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr ""
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr ""
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr ""
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr ""
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr ""
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr ""
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr ""
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr ""
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr ""
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr ""
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr ""
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr ""
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr ""
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr ""
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr ""
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr ""
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr ""
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr ""
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr ""
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr ""
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr ""
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr ""
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr ""
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr ""
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr ""
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr ""
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr ""
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr ""
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr ""
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr ""
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr ""
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr ""
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr ""
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr ""
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr ""
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr ""
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr ""
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr ""
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr ""
@@ -11863,176 +13938,189 @@ msgstr ""
msgid "Strip Silence"
msgstr ""
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr ""
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr ""
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr ""
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr ""
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr ""
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr ""
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr ""
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr ""
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr ""
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr ""
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr ""
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr ""
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr ""
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr ""
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr ""
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr ""
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
msgstr ""
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
msgstr ""
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
msgstr ""
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
msgstr ""
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
msgstr ""
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
msgstr ""
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
msgstr ""
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr ""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr ""
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr ""
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12040,92 +14128,95 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] ""
msgstr[1] ""
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Rápido mas Feio"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Pular Anti-aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr ""
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr ""
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr ""
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr ""
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr ""
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr ""
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr ""
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr ""
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr ""
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr ""
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr ""
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
-msgstr ""
+msgstr "<b>Progresso</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Iniciar gravação no inÃcio do ponto-automático"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Parar gravação no final do ponto-automático"
@@ -12193,164 +14284,216 @@ msgstr ""
msgid "Transpose"
msgstr ""
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:422
msgid "Loading default ui configuration file %1"
msgstr ""
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:425
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:430
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:177
+#: ui_config.cc:248
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:289
msgid "Loading color file %1"
msgstr ""
-#: ui_config.cc:222
+#: ui_config.cc:292
msgid "cannot read color file \"%1\""
msgstr ""
-#: ui_config.cc:227
+#: ui_config.cc:297
msgid "color file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:233
-msgid "Color file %1 not found"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
msgstr ""
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:403 ui_config.cc:486
msgid "Color file %1 not saved"
msgstr ""
-#: ui_config.cc:317
+#: ui_config.cc:439
msgid "Loading user ui configuration file %1"
msgstr ""
-#: ui_config.cc:320
+#: ui_config.cc:442
msgid "cannot read ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:325
+#: ui_config.cc:447
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:333
+#: ui_config.cc:455
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
-#: ui_config.cc:351
+#: ui_config.cc:476
msgid "Config file %1 not saved"
msgstr ""
-#: ui_config.cc:592
+#: ui_config.cc:720
msgid "Color %1 not found"
msgstr ""
-#: ui_config.cc:662
+#: ui_config.cc:790
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr ""
-#: utils.cc:577
+#: utils.cc:365
msgid "cannot find XPM file for %1"
msgstr ""
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:418 utils.cc:448 utils.cc:468
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:469
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:476
msgid "cannot find icon image for %1 using %2"
msgstr ""
-#: utils.cc:666 utils.cc:682
+#: utils.cc:493 utils.cc:509
msgid "Caught exception while loading icon named %1"
msgstr ""
-#: add_video_dialog.cc:54
+#: utils.cc:759
+msgid "Overwrite"
+msgstr "Sobrescrever"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
+#: add_video_dialog.cc:55
msgid "Set Video Track"
msgstr ""
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
msgid "Open Video Monitor Window"
msgstr ""
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
msgid "Adjust Session Framerate to Match Video Framerate"
msgstr ""
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
msgid "Reload docroot"
msgstr ""
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
msgid "Video files"
msgstr ""
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
msgid "<b>Video Information</b>"
msgstr ""
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
msgid "Start:"
-msgstr ""
+msgstr "InÃcio:"
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
msgid "Frame rate:"
msgstr ""
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
msgid "Aspect Ratio:"
-msgstr ""
+msgstr "Proporção da Tela"
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
msgid "VideoServerIndex"
msgstr ""
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:473
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:511
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:519
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:592
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:729
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12360,25 +14503,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:744
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:776
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12400,7 +14543,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12409,10 +14552,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12422,9 +14569,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12433,83 +14579,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12529,7 +14675,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12539,239 +14685,230 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:63
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:64
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:67
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:74
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:84 utils_videotl.cc:100
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr ""
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr ""
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr ""
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr ""
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr ""
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr ""
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr ""
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr ""
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr ""
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr ""
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr ""
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr ""
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr ""
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr ""
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr ""
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr ""
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr ""
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr ""
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr ""
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr ""
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr ""
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr ""
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr ""
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr ""
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr ""
@@ -12789,13 +14926,22 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+#~ msgid "Locations"
+#~ msgstr "Localizações"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Atualizar plugins disponÃveis"
+
#~ msgid "Split"
#~ msgstr "Separar"
diff --git a/gtk2_ardour/po/pt_PT.mo b/gtk2_ardour/po/pt_PT.mo
new file mode 100644
index 0000000..15c695d
Binary files /dev/null and b/gtk2_ardour/po/pt_PT.mo differ
diff --git a/gtk2_ardour/po/pt_PT.po b/gtk2_ardour/po/pt_PT.po
index 52bb55a..9703792 100644
--- a/gtk2_ardour/po/pt_PT.po
+++ b/gtk2_ardour/po/pt_PT.po
@@ -7,264 +7,296 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk2_ardour rev.1702\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2007-04-15 19:00+0100\n"
"Last-Translator: Rui Nuno Capela <rncbc at rncbc.org>\n"
"Language-Team: Portuguese\n"
-"Language: \n"
+"Language: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr ""
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr ""
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr ""
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr ""
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr ""
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr ""
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr ""
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr ""
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr ""
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr ""
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr ""
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr ""
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr ""
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr ""
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr ""
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr ""
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr ""
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr ""
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr ""
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr ""
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr ""
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr ""
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr ""
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr ""
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr ""
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr ""
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr ""
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr ""
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr ""
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr ""
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr ""
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr ""
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr ""
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr ""
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr ""
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr ""
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr ""
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr ""
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr ""
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr ""
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr ""
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr ""
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr ""
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr ""
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr ""
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr ""
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr ""
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr ""
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -273,7 +305,7 @@ msgid ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
msgstr ""
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -285,210 +317,264 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
msgstr ""
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
msgstr ""
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
msgstr ""
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
msgstr ""
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
msgstr ""
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
msgstr ""
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
msgstr ""
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
msgstr ""
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
msgstr ""
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr ""
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr ""
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr ""
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr ""
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr ""
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr ""
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr ""
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr ""
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr ""
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
msgstr ""
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr ""
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr ""
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr ""
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr ""
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr ""
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr ""
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr ""
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr ""
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr ""
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -497,60 +583,61 @@ msgid ""
"track instead."
msgstr ""
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "Normal"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr ""
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Fita"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr ""
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr ""
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr ""
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr ""
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr ""
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr ""
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr ""
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr ""
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr ""
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr ""
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr ""
@@ -558,177 +645,215 @@ msgstr ""
msgid "Ambiguous File"
msgstr ""
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
"Please select the path that you want to get the file from."
msgstr ""
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr ""
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr ""
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr ""
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr ""
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr ""
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
msgstr ""
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:49
+msgid "Fit dB range"
msgstr ""
-#: analysis_window.cc:55
-msgid "Normalize values"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr ""
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr ""
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Faixa"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr ""
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr ""
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr ""
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Audição"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr ""
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr ""
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr ""
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr ""
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "Acerca de"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Localizações"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr ""
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr ""
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr ""
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr ""
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr ""
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Cronómetro principal"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr ""
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -736,45 +861,45 @@ msgid ""
"the audio backend and save the session."
msgstr ""
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr ""
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -785,39 +910,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr ""
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr ""
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -826,23 +951,23 @@ msgid ""
"controlled by %2"
msgstr ""
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr ""
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr ""
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr ""
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr ""
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -851,11 +976,11 @@ msgid ""
"\"Just quit\" option."
msgstr ""
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr ""
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -866,7 +991,7 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -877,74 +1002,107 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Alerta"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr ""
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr ""
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr ""
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr ""
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr ""
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr ""
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr ""
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr ""
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr ""
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr ""
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr ""
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr ""
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr ""
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -952,217 +1110,265 @@ msgid ""
"\">%<PRIu32>%%</span>"
msgstr ""
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr ""
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr ""
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr ""
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr ""
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr ""
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sessões recentes"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Abrir sessão"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr ""
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr ""
"Não é possÃvel acrescentar uma faixa sem que haja uma sessão esteja "
"carregada."
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
msgstr ""
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
msgstr ""
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
msgstr ""
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr ""
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
msgstr ""
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr ""
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
msgstr ""
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr ""
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr ""
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-modelo"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
"already exists. Do you want to open it?"
msgstr ""
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr ""
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr ""
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr ""
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr ""
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr ""
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Não foi possÃvel carregar a sessão \"%1 (captura %2)\" com sucesso"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr ""
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Não foi possÃvel carregar a sessão \"%1 (captura %2)\" com sucesso"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr ""
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr ""
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr ""
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1174,19 +1380,19 @@ msgstr ""
"Estas podem ainda incluir regiões que necessitem\n"
"da existência de alguns ficheiros já em desuso."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr ""
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr ""
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr ""
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1196,7 +1402,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1218,92 +1424,128 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr ""
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
"Clean-up will move all unused files to a \"dead\" location."
msgstr ""
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr ""
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr ""
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "ficheiro eliminado"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr ""
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr ""
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr ""
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr ""
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr ""
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr ""
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "não foi possÃvel abrir %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr ""
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr ""
"A gravação foi interrompida porque o seu sistema não foi capaz de a "
"acompanhar adequadamente."
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1312,23 +1554,23 @@ msgid ""
"quickly enough to keep up with recording.\n"
msgstr ""
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr ""
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr ""
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1337,11 +1579,11 @@ msgid ""
"quickly enough to keep up with playback.\n"
msgstr ""
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr ""
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1352,42 +1594,43 @@ msgid ""
"what you would like to do.\n"
msgstr ""
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Ignorar"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Recuperar"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr ""
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
"audio may be played at the wrong sample rate.\n"
msgstr ""
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr ""
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr ""
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1399,88 +1642,113 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Não foi possÃvel iniciar o painel de edição"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Não foi posivel iniciar o painel de mistura"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Reproduzir desde o cursor de reprodução"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Parar reprodução"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr ""
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Reproduzir selecção"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Ir para o inÃcio da sessão"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Ir para o final da sessão"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Reproduzir intervalo cÃclico"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
msgstr ""
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "Ir para a última posição inicial do cursor de reprodução quando parar"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Seja sensÃvel acerca da monitorização de entradas"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Ligar/Desligar o metrónomo"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
msgstr ""
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr ""
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1488,7 +1756,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1496,450 +1764,559 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr ""
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr ""
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr ""
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr ""
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr ""
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr ""
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "Miscelânea"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr ""
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr ""
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr ""
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Não foi possÃvel iniciar o painel de edição"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Não foi posivel iniciar o painel de mistura"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr ""
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr ""
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr ""
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "Sessão"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Sincronia"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Opções"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr ""
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Ajuda"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr ""
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Formato de ficheiro audio"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Tipo de ficheiro"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Formato de amostra"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Mesas de controlo"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Efeitos/plug-ins"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "VUÃmetro"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr ""
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Tempo de persistência"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr ""
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr ""
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr ""
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr ""
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Fechar"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr ""
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr ""
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr ""
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr ""
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Guardar modelo..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr ""
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr ""
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr ""
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "Exportar"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr ""
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr ""
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Sair"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Esconder"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Maximizar o painel de edição"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr ""
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
msgstr ""
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
msgstr ""
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
msgstr ""
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr ""
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr ""
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr ""
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr ""
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
msgstr ""
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr ""
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr ""
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr ""
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Guardar"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Transporte"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Parar"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "Rolar"
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Iniciar/Parar"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr ""
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr ""
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Reproduzir intervalo cÃclico"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr ""
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr ""
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Gravar"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr ""
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "Rebobinar"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "Rebobinar (devagar)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "Rebobinar (rápido)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "Avançar"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "Avançar (devagar)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "Avançar (rápido)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "Ir para o zero"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Ir para o inÃcio"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "Ir para o final"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr ""
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1947,257 +2324,274 @@ msgstr ""
msgid "Timecode"
msgstr ""
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr ""
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr ""
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr ""
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr ""
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "Entrada"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr ""
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "SaÃda"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr ""
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr ""
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Metrónomo"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr ""
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr ""
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr ""
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr ""
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr ""
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Percentagem"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Semi-tons"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Enviar MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Enviar MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Usar MMC"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr ""
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr ""
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr ""
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr ""
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr ""
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr ""
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr ""
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr ""
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
msgstr ""
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "Interno"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr ""
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr ""
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr ""
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr ""
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr ""
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr ""
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "VUÃmetro"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr ""
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr ""
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "Comp:Bat"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "Mins:Segs"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr ""
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr ""
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr ""
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr ""
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr ""
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr ""
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "acrescentar ponto de controlo"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr ""
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "mover evento de automatização"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "remover ponto de controlo"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr ""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr ""
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2209,63 +2603,59 @@ msgstr "estado de automatização"
msgid "hide track"
msgstr "esconder faixa"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr ""
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Reprodução"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Escrita"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Tocar"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr ""
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "apagar automatizações"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Esconder"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "Apagar"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Estado"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr ""
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr ""
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Modo"
@@ -2281,35 +2671,38 @@ msgstr ""
msgid "Direction:"
msgstr ""
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "Entradas"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "SaÃda"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Editar"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "Eliminar"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Nome"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Novo"
@@ -2325,6 +2718,39 @@ msgstr ""
msgid "Rename Channel"
msgstr ""
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objecto"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Cor"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr ""
@@ -2337,6 +2763,42 @@ msgstr ""
msgid "Value"
msgstr "Valor"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr ""
@@ -2374,2060 +2836,2155 @@ msgstr ""
msgid "Velocity"
msgstr ""
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr ""
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr ""
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr ""
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "Quadros CD"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Segundos"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minutos"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr ""
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr ""
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Batimentos/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr ""
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr ""
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr ""
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Batimentos/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr ""
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr ""
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr ""
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Batimentos/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr ""
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr ""
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr ""
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Batimentos/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Batimentos/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr ""
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Batimentos"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Compassos"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Marcadores"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "InÃcios de região"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Finais de região"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "Sincronismos de região"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Extremos de região"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr ""
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr ""
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnético"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Cursor de reprodução"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Marcador"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr ""
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Deslizar"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Reunir"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Bloquear"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Esquerda"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Direita"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Centro"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr ""
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr ""
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr ""
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr ""
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr ""
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr ""
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr ""
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr ""
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Mins:Segs"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Marcadores de localização"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Marcadores de intervalo"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Ciclos/inserção"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr ""
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "modo"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr ""
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Regiões"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr ""
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "Capturas"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr ""
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr ""
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Ciclo"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Inserção"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr ""
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr ""
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr ""
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Lento"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Rápido"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "Desactivar"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "Activar"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Congelar"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "Descongelar"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr ""
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr ""
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "Intervalo cÃclico"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr ""
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr ""
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr ""
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr ""
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr ""
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr ""
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr ""
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Seleccionar tudo no intervalo"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr ""
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr ""
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Acrescentar marcadores de intervalo"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr ""
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Duplicar intervalo"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr ""
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr ""
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr ""
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr ""
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "Reproduzir região em ciclo"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr ""
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr ""
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr ""
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr ""
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr ""
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr ""
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr ""
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr ""
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "Seleccionar tudo após o cursor de reprodução"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "Seleccionar tudo antes do cursor de reprodução"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr ""
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr ""
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Seleccionar"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "Cortar"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "Copiar"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "Colar"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Alinhar"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Alinhar relativamente"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "Inserir regiões seleccionadas"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr ""
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr ""
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr ""
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr ""
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr ""
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "Retocar"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr ""
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr ""
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr ""
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr ""
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr ""
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr ""
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
msgstr ""
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr ""
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr ""
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "Zoom (+)"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Zoom (-)"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Zoom (sessão)"
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr ""
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "Zoom (focagem)"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr ""
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr ""
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr ""
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr ""
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr ""
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Modo de edição"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
msgstr ""
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr ""
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr ""
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Refazer"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Refazer (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Duplicar"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr ""
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr ""
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr ""
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr ""
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr ""
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr ""
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr ""
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr ""
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr ""
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr ""
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr ""
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr ""
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr ""
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr ""
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr ""
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr ""
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr ""
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr ""
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr ""
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr ""
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr ""
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr ""
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr ""
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
"If it is deleted, audio files used by it alone will be cleaned."
msgstr ""
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr ""
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr ""
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "Cancelar"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "nova lista de reprodução"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "copiar lista de reprodução"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "apagar lista de reprodução"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr ""
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr ""
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr ""
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr ""
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr ""
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Auto-ligar"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "Desvanecimentos cruzados"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr ""
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr ""
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr ""
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Desvanecimento"
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr ""
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr ""
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Nivelar"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Posição"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Cortar"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr ""
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr ""
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr ""
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr ""
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoom (focagem)"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr ""
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "VUÃmetro (decaimento)"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "VUÃmetro (persistência)"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr ""
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr ""
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Monitorização"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr ""
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr ""
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr ""
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Operações em regiões"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr ""
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr ""
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr ""
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr ""
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr ""
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr ""
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Altura"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Ferramentas"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "Ver"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr ""
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Mostrar painel de mistura"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr ""
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr ""
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Reprodução ao inÃcio da próxima região"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Reprodução ao final da próxima região"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Reprodução sÃncrona com a próxima região"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Reprodução ao inÃcio da região anterior"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Reprodução ao final da região anterior"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Reprodução sincronizada com a região anterior"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr ""
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr ""
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr ""
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr ""
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr ""
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr ""
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr ""
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr ""
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr ""
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr ""
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Reprodução no inÃcio do intervalo"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Reprodução no final do intervalo"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr ""
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "Seleccionar nenhum"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr ""
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr ""
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr ""
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Seleccionar tudo no intervalo de inserção"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Seleccionar tudo no intervalo de ciclo"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr ""
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr ""
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr ""
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr ""
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr ""
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr ""
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr ""
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr ""
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr ""
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr ""
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr ""
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr ""
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr ""
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr ""
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr ""
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr ""
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr ""
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr ""
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr ""
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr ""
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr ""
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr ""
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr ""
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "Rolar faixas p/cima"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "Rolar faixas p/baixo"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "Passar faixas p/cima"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "Passar faixas p/baixo"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "Rolar p/trás"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "Rolar p/frente"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Centrar cursor de reprodução"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr ""
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Cursor de reprodução p/frente"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Cursor de reprodução p/trás"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr ""
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr ""
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr ""
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr ""
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr ""
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr ""
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr ""
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr ""
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr ""
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr ""
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Exportar intervalo"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr ""
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr ""
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr ""
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr ""
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr ""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr ""
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr ""
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Iniciar intervalo"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "Finalizar intervalo"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Seguir o cursor de reprodução"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Remover a última captura"
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr ""
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr ""
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr ""
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Remover"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr ""
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "Enorme"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "Maior"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Grande"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "Pequeno"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr ""
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Zoom (focagem/esquerda)"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Zoom (focagem/direita)"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Zoom (focagem/centro)"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Zoom (focagem/reprodução)"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr ""
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr ""
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr ""
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr ""
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr ""
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Ferramenta/objecto"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Ferramenta/intervalo"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr ""
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr ""
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr ""
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr ""
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr ""
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr ""
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr ""
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr ""
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr ""
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Modo de ajuste"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr ""
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr ""
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr ""
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr ""
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr ""
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr ""
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr ""
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr ""
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr ""
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr ""
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr ""
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr ""
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr ""
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr ""
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr ""
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr ""
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr ""
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr ""
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr ""
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr ""
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr ""
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr ""
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr ""
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr ""
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr ""
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr ""
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr ""
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr ""
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr ""
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr ""
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr ""
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr ""
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr ""
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr ""
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr ""
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr ""
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr ""
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr ""
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr ""
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr ""
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Ordenar"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Mostrar tudo"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr ""
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Crescente"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Decrescente"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Por nome de região"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Por comprimento de região"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Por posição de região"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "Por instante de região"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Por posição inicial da região no ficheiro"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Por posição final da região no ficheiro"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Por nome do ficheiro original"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Por comprimento do ficheiro original"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Por data de criação do ficheiro original"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Por sistema de ficheiros original"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr ""
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importar"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr ""
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr ""
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr ""
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr ""
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr ""
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
msgid "programming error: %1: %2"
msgstr ""
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr ""
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr ""
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Inferior"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr ""
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr ""
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr ""
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr ""
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Mudo"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr ""
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Inverter"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr ""
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr ""
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr ""
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr ""
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr ""
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Evanescimento"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Desvanecimento"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr ""
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Preencher faixa"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Estabelecer intervalo cÃclico"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr ""
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr ""
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr ""
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr ""
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr ""
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr ""
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr ""
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr ""
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr ""
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr ""
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr ""
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr ""
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr ""
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr ""
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr ""
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr ""
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr ""
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr ""
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr ""
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr ""
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr ""
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr ""
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr ""
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr ""
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr ""
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr ""
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr ""
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr ""
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr ""
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr ""
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr ""
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr ""
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr ""
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr ""
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr ""
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr ""
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr ""
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr ""
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr ""
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr ""
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr ""
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr ""
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr ""
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr ""
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr ""
@@ -4452,32 +5009,33 @@ msgid ""
"%2 as a new source, or skip it?"
msgstr ""
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Cancelar importação"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Editor: não foi possÃvel abrir o ficheiro \"%1\", (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Cancelar importação inteira"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Não acrescentar"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Acrescentar sem qualquer questão"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr ""
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4485,207 +5043,276 @@ msgstr ""
"%1\n"
"A frequência de amostragem deste ficheiro audio não é igual à de sessão!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Acrescentar de qualquer forma"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr ""
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr ""
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "mover marccador métrico"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "copiar marcador métrico"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "mover marccador métrico"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "mover marcador de tempo"
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "copiar marcador de tempo"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "mover marcador de tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "alterar duração de evanescimento"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "alterar duração de desvanecimento"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "mover marcador"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr ""
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr ""
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr ""
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr ""
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "sem nome"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr ""
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr ""
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
msgstr ""
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr ""
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
msgstr ""
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr ""
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr ""
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr ""
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr ""
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr ""
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr ""
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr ""
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
msgstr ""
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr ""
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr ""
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr ""
#: editor_group_tabs.cc:176
@@ -4700,300 +5327,341 @@ msgstr ""
msgid "end"
msgstr ""
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "acrescentar marcador"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "estabelcer intervalo cÃclico"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "estabelecer intervalo de inserção"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr ""
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "novo marcador de região"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "remover marcador"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr ""
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr ""
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr ""
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr ""
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr ""
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr ""
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr ""
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr ""
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Esconder intervalo"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr ""
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Remover intervalo"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Separar regiões no intervalo"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr ""
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Estabelecer intervalo de inserção"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Novo nome: "
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "Renomear marcador"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "Renomear intervalo"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Renomear"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "remover marcador"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr ""
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr ""
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
msgstr ""
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr ""
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Ponto final de corte"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Nome para a região:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "separar"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr ""
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr ""
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr ""
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr ""
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "retocar p/frente"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr ""
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr ""
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr ""
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr ""
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "apagar marcadores"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "apagar intervalos"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "apagar localizações"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "inserir região"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr ""
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr ""
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr ""
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr ""
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr ""
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr ""
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr ""
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr ""
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr ""
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "separar"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr ""
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "cortar pela selecção"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr ""
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr ""
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr ""
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr ""
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "alinhar selecção"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "alinhar selecção (relativamente)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "alinhar região"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr ""
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr ""
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr ""
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr ""
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5001,11 +5669,11 @@ msgid ""
"input or vice versa."
msgstr ""
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr ""
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5014,23 +5682,23 @@ msgid ""
"Freezing will only process the signal as far as the first send/insert/return."
msgstr ""
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr ""
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr ""
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr ""
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Cancelar congelamento"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5039,47 +5707,47 @@ msgid ""
"You can do this without processing, which is a different operation."
msgstr ""
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr ""
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "regravar região"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr ""
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "corte"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "cópia"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "apagar"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr ""
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "remover região"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplicar selecção"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "retocar faixa"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5087,136 +5755,156 @@ msgstr ""
"Deseja realmente eliminar a última captura?\n"
"(esta operação é destrutiva e não pode ser desfeita)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Não, não fazer nada."
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Sim, elimine-a."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr ""
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "normalizar"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "inverter regiões"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr ""
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr ""
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr ""
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr ""
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr ""
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr ""
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr ""
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr ""
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr ""
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr ""
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr ""
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr ""
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr ""
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr ""
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr ""
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr ""
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr ""
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr ""
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr ""
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr ""
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr ""
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr ""
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr ""
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr ""
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5224,62 +5912,62 @@ msgid ""
"This could take a long time."
msgstr ""
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr ""
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
msgstr ""
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr ""
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr ""
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr ""
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr ""
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr ""
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr ""
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr ""
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr ""
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr ""
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr ""
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr ""
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5289,23 +5977,19 @@ msgid ""
"\"allow-special-bus-removal\" option to be \"yes\""
msgstr ""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5313,7 +5997,7 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5321,358 +6005,371 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
"This action cannot be undone, and the session file will be overwritten"
msgstr ""
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr ""
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Sim, remover."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr ""
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr ""
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr ""
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr ""
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "emudecer região"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr ""
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr ""
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr ""
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr ""
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr ""
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr ""
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr ""
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr ""
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr ""
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr ""
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr ""
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr ""
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr ""
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Escondida"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr ""
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
msgstr ""
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr ""
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr ""
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr ""
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr ""
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr ""
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr ""
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr ""
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr ""
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr ""
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr ""
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "E"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr ""
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr ""
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
msgstr ""
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
msgstr ""
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr ""
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr ""
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr ""
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Esconder tudo"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Mostrar todos as faixas audio"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Esconder todos as faixas audio"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Mostrar todos os barramentos audio"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Esconder todos os barramentos audio"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr ""
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr ""
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Novo marcador de localização"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "Apagar todas as localizações"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr ""
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr ""
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "Apagar todos os intervalos"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr ""
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr ""
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Novo tempo"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Novo VUÃmetro"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr ""
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr ""
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
msgstr ""
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr ""
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "acrescentar"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "acrescentar marcador de tempo"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "acrescentar"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "acrescentar marcador métrico"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "pronto"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "substituir marcador de tempo"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "remover marcador de tempo"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5681,329 +6378,382 @@ msgstr ""
msgid "stretch/shrink"
msgstr ""
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr ""
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr ""
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr ""
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr ""
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr ""
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr ""
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr ""
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr ""
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr ""
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr ""
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr ""
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr ""
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr ""
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr ""
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Latência"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr ""
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr ""
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr ""
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr ""
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr ""
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr ""
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr ""
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr ""
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr ""
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr ""
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr ""
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
"Latency calibration requires playback and capture"
msgstr ""
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr ""
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr ""
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr ""
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr ""
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr ""
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
msgstr[0] ""
msgstr[1] ""
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr ""
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr ""
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Activo"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
msgstr ""
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr ""
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr ""
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr ""
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
msgstr ""
-#: export_dialog.cc:46
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
+
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr ""
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr ""
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr ""
@@ -6029,45 +6779,57 @@ msgstr ""
msgid "Stop Export"
msgstr "Cancelar exportação"
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr ""
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:401 export_dialog.cc:403
msgid "<span color=\"#ffa755\">Error: "
msgstr ""
-#: export_dialog.cc:385
+#: export_dialog.cc:413
msgid "<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:387
+#: export_dialog.cc:415
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr ""
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr ""
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr ""
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr ""
@@ -6075,172 +6837,246 @@ msgstr ""
msgid "Add another format"
msgstr ""
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "Formato"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Localização"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr ""
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr ""
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr ""
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr ""
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
msgstr ""
#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr ""
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Pesquisar"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr ""
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
msgstr ""
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
+#: export_format_dialog.cc:43
+msgid "Peak"
msgstr ""
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
+#: export_format_dialog.cc:44
+msgid "Loudness"
msgstr ""
#: export_format_dialog.cc:50
-msgid "Trim silence at end"
+msgid "LUFS"
msgstr ""
#: export_format_dialog.cc:51
-msgid "Add silence at end:"
+msgid "dBTP"
msgstr ""
#: export_format_dialog.cc:54
+msgid "Trim silence at start"
+msgstr ""
+
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
+msgstr ""
+
+#: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr ""
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr ""
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr ""
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr ""
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr ""
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr ""
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr ""
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr ""
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr ""
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr ""
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr ""
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr ""
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6248,29 +7084,200 @@ msgstr ""
msgid "Preset"
msgstr ""
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
msgstr ""
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Não foi possÃvel ler o ficheiro: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Não foi possÃvel aceder ao ficheiros audio: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr ""
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr "Seleccionar tudo"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
msgid "Range"
msgstr ""
@@ -6286,36 +7293,39 @@ msgstr ""
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr ""
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Modo de automatizaçã"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Tipo de automatização"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr ""
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr ""
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr ""
@@ -6323,48 +7333,52 @@ msgstr ""
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Parametrizações</span>"
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr ""
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr ""
#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Controlos"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"Editor de efeitos/plug-ins: não foi possÃvel criar elemento de controlo para "
"%1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr ""
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Controlos"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr ""
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Controlo de automatização"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr ""
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr ""
@@ -6373,126 +7387,163 @@ msgstr ""
msgid "MIDI Connection Manager"
msgstr ""
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Desligar"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "porto"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr ""
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr ""
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr ""
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr ""
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr ""
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr ""
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr ""
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr ""
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr ""
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr ""
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr ""
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr ""
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr ""
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr ""
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr ""
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr ""
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr ""
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr ""
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr ""
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr ""
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr ""
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr ""
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr ""
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr ""
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr ""
@@ -6500,64 +7551,89 @@ msgstr ""
msgid "I/O selector"
msgstr ""
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1 entrada"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1 saÃda"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr ""
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr ""
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:80
+msgid "Search..."
msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:82
+msgid "Print"
msgstr ""
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:228
+msgid "Shortcut"
msgstr ""
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr ""
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
msgstr ""
#: latency_gui.cc:40
@@ -6568,109 +7644,218 @@ msgstr ""
msgid "period"
msgstr ""
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Reiniciar"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr ""
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr ""
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr ""
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr ""
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr ""
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "Pré-êmfase"
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr ""
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr ""
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr ""
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr ""
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr ""
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr ""
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr ""
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr ""
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr ""
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr ""
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr ""
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr ""
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr ""
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr ""
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "acrescentar marcador de região"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr ""
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr ""
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6679,79 +7864,99 @@ msgid ""
"Click OK to exit %1."
msgstr ""
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr ""
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
msgstr ""
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr ""
-#: main.cc:310
+#: main.cc:344
msgid " (built using "
msgstr " (compilado "
-#: main.cc:313
+#: main.cc:347
msgid " and GCC version "
msgstr " e versão GCC "
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr ""
-#: main.cc:324
+#: main.cc:358
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
msgstr ""
-#: main.cc:326
+#: main.cc:360
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr ""
-#: main.cc:327
+#: main.cc:361
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr "nem mesmo para COMERCIALIZAÃÃO ou INDICADO PARA UM FIM PARTICULAR."
-#: main.cc:328
+#: main.cc:362
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Sendo software livre, é permitida e até encorajada a sua distribuição "
-#: main.cc:329
+#: main.cc:363
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"desde que sejam respeitadas algumas condições; para mais informações, por "
"favor leia o ficheiro COPYING."
-#: main.cc:334
+#: main.cc:368
msgid "could not initialize %1."
msgstr ""
-#: main.cc:344
+#: main.cc:378
msgid "Cannot xinstall SIGPIPE error handler"
msgstr ""
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
msgid "could not create %1 GUI"
msgstr ""
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr ""
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
msgid "MarkerText"
msgstr "Marcadores"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Nenhum"
@@ -6832,11 +8037,11 @@ msgstr ""
msgid "Click to force all MIDI channel messages to channel %1"
msgstr ""
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr ""
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr ""
@@ -6948,192 +8153,188 @@ msgstr ""
msgid "velocity edit"
msgstr ""
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr ""
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr ""
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr ""
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr ""
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr ""
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr ""
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr ""
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr ""
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr ""
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr ""
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr ""
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr ""
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr ""
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr ""
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr ""
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr ""
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "colar"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr ""
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr ""
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr ""
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr ""
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr ""
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr ""
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr ""
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr ""
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr ""
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr ""
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr ""
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr ""
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr ""
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr ""
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr ""
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr ""
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr ""
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr ""
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr ""
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr ""
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr ""
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr ""
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7149,7 +8350,7 @@ msgstr ""
msgid "Decimal"
msgstr ""
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr ""
@@ -7165,35 +8366,36 @@ msgstr ""
msgid "New velocity"
msgstr ""
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr ""
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr ""
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr ""
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr ""
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr ""
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr ""
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7205,7 +8407,7 @@ msgid ""
"\n"
msgstr ""
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr ""
@@ -7213,516 +8415,706 @@ msgstr ""
msgid "Missing Plugins"
msgstr ""
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr ""
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr ""
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr ""
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr ""
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
msgstr ""
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr ""
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr ""
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr ""
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr ""
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr ""
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr ""
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr ""
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr ""
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr ""
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr ""
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr ""
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr ""
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr ""
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Comentários*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
msgstr ""
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
+msgid "Cmt"
msgstr ""
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Clicar para acrescentar/editar comentários"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr ""
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr ""
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr ""
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr ""
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr ""
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr ""
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr ""
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Activo"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr ""
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr ""
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
msgstr ""
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr ""
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr ""
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr ""
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "Pré-atenuador"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Pós-atenuador"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Grupo"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr "não foi encontrada qualquer faixa para o painel de mistura"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-tudo-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Painéis"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr ""
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr ""
-#: meter_strip.cc:884
+#: meter_strip.cc:895
msgid "Short"
msgstr ""
-#: meter_strip.cc:885
+#: meter_strip.cc:896
msgid "Tall"
msgstr ""
-#: meter_strip.cc:886
+#: meter_strip.cc:897
msgid "Grande"
msgstr ""
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
msgstr ""
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr ""
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr ""
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr ""
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr ""
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr ""
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
msgstr ""
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
msgstr ""
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr ""
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr ""
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr ""
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr ""
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr ""
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
msgstr ""
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
msgstr ""
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
msgstr ""
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
msgstr ""
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
msgstr ""
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
msgstr ""
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
msgstr ""
-#: monitor_section.cc:323
+#: monitor_section.cc:399
msgid "Monitor"
msgstr ""
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr ""
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr ""
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr ""
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr ""
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr ""
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr ""
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr ""
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr ""
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr ""
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr ""
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr ""
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -7777,10 +9169,6 @@ msgid ""
"relies on a stable, sustainable income stream. Thanks for using Ardour!"
msgstr ""
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr ""
@@ -7789,6 +9177,10 @@ msgstr ""
msgid "Name of new preset"
msgstr ""
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr ""
@@ -7797,7 +9189,11 @@ msgstr ""
msgid "Normalize region"
msgstr ""
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr ""
@@ -7817,103 +9213,106 @@ msgstr "Normalizar"
msgid "Select Note"
msgstr ""
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Uso: "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr ""
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr ""
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr ""
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr ""
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr ""
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "Ignorar"
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr ""
@@ -7925,6 +9324,22 @@ msgstr "Modo de automatização de panorâmica"
msgid "Pan automation type"
msgstr "Tipo de automatização de panorâmica"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr ""
@@ -7957,143 +9372,297 @@ msgstr ""
msgid "Show phase"
msgstr ""
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr ""
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr ""
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr ""
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr ""
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr ""
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr ""
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr ""
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr ""
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr ""
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr ""
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Tipo"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr ""
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr ""
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr ""
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr ""
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr ""
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr ""
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr ""
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Acrescentar à lista de efeitos/plug-ins"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Remover da lista de efeitos/plug-ins"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Actualizar efeitos/plug-ins disponÃveis"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr ""
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
"See the Log window for more details (maybe)"
msgstr ""
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr ""
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr ""
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr ""
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr ""
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr ""
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr ""
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8101,146 +9670,167 @@ msgstr ""
msgid "Add"
msgstr "Acrescentar"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr ""
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr ""
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr ""
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr ""
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr ""
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr ""
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
msgstr ""
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr ""
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] ""
msgstr[1] ""
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr ""
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr ""
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr ""
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
msgstr ""
#: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
msgstr ""
#: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
msgstr ""
#: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
msgstr ""
#: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
msgid "Other"
msgstr ""
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr ""
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr ""
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr ""
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr ""
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr ""
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr ""
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr ""
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr ""
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr ""
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr ""
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ""
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr ""
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
msgstr ""
#: port_insert_ui.cc:39
@@ -8263,77 +9853,76 @@ msgstr ""
msgid "Port Insert "
msgstr ""
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr ""
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr ""
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr ""
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr ""
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr ""
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr ""
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Refrescar"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr ""
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr ""
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr ""
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr ""
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr ""
@@ -8345,223 +9934,237 @@ msgstr ""
msgid "There are no %1 ports to connect."
msgstr ""
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr ""
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr ""
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr ""
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "desligado"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
msgstr ""
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr ""
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr ""
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
msgstr ""
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
msgstr ""
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
msgstr ""
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
"outputs will not work correctly."
msgstr ""
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr ""
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr ""
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
"could not match the configuration of this track."
msgstr ""
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Sim, remover todos"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr ""
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr ""
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Nova inserção"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr ""
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr ""
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr ""
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr ""
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr ""
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "Activar tudo"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr ""
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr ""
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr ""
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr ""
@@ -8589,345 +10192,444 @@ msgstr ""
msgid "main grid"
msgstr ""
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr ""
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr ""
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr ""
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr ""
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr ""
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr ""
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
msgstr ""
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
msgstr ""
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr ""
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Metrónomo"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Usar metrónomo acentuado"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr ""
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr ""
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr ""
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr ""
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ botão"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr ""
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr ""
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
msgstr ""
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
msgstr ""
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
msgstr ""
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
msgstr ""
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
msgstr ""
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
msgstr ""
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
msgstr ""
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
msgstr ""
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
msgstr ""
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
msgstr ""
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
msgstr ""
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "â"
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
msgstr ""
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
msgstr ""
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
msgstr ""
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
msgstr ""
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
msgstr ""
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
msgstr ""
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
msgstr ""
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
msgstr ""
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr ""
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr ""
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr ""
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr ""
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr ""
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
msgstr ""
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
msgstr ""
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr ""
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr ""
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr ""
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr ""
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automatização"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr ""
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr ""
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr ""
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -8936,25 +10638,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr ""
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr ""
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr ""
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -8963,11 +10665,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -8977,39 +10679,83 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr ""
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr ""
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr ""
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9023,27 +10769,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9056,659 +10802,926 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr ""
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr ""
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr ""
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
msgstr ""
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
msgstr ""
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
msgstr ""
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
msgstr ""
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
msgstr ""
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
msgstr ""
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
msgstr ""
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
msgstr ""
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
msgstr ""
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linear"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
msgstr ""
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
msgstr ""
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
msgstr ""
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
msgstr ""
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
msgstr ""
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
msgstr ""
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
msgstr ""
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linear"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr ""
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr ""
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr ""
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr ""
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr ""
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr ""
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr ""
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr ""
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr ""
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr ""
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr ""
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr ""
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr ""
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr ""
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr ""
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr ""
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr ""
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
msgstr ""
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
msgstr ""
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
msgstr ""
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
msgstr ""
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
msgstr ""
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
msgstr ""
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
msgstr ""
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr ""
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr ""
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr ""
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr ""
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr ""
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr ""
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr ""
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr ""
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr ""
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr ""
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr ""
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr ""
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr ""
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr ""
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr ""
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr ""
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+" <i>(requires a restart of %1 to take effect)</i>\n"
+" <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
msgstr ""
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
msgstr ""
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
msgstr ""
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
msgstr ""
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
msgstr ""
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
msgstr ""
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
msgstr ""
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
msgstr ""
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
msgstr ""
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
msgstr ""
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
msgstr ""
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
msgstr ""
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3023
msgid ""
-"Use translations of %1 messages\n"
-" <i>(requires a restart of %1 to take effect)</i>\n"
-" <i>(if available for your language preferences)</i>"
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
msgstr ""
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr ""
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr ""
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr ""
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr ""
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr ""
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr ""
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr ""
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "ouvir esta região"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr ""
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr "Final:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr ""
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr ""
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr ""
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr ""
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr ""
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr ""
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr ""
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr ""
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr ""
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr ""
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr ""
@@ -9728,33 +11741,33 @@ msgstr ""
msgid "Choose Top Region"
msgstr ""
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr ""
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr ""
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr ""
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] ""
msgstr[1] ""
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr ""
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -9800,55 +11813,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr ""
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr ""
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr ""
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr ""
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr ""
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr ""
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr ""
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr ""
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr ""
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr ""
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr ""
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr ""
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr ""
@@ -9872,19 +11893,15 @@ msgstr ""
msgid "Active state"
msgstr ""
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Cor"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr ""
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr ""
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
@@ -9904,404 +11921,389 @@ msgstr "SaÃdas"
msgid "Plugins, Inserts & Sends"
msgstr ""
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "não foi encontrado qualquer encaminhamento"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr ""
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "Nenhuma faixa"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr ""
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr ""
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Gravar"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr ""
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr ""
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr ""
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr ""
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr ""
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Desvanecimento"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Panorama"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr ""
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr ""
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr ""
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr ""
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr ""
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr ""
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr ""
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr ""
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "Alinhamento"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr ""
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr ""
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr ""
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr ""
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Lista de reprodução"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr ""
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr ""
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr ""
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr ""
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr ""
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr ""
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr ""
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr ""
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Apagar actual"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr ""
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr ""
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr ""
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr ""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr ""
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr ""
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr ""
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr ""
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr ""
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr ""
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr ""
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr ""
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr ""
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr ""
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr ""
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr ""
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr ""
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr ""
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr ""
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr ""
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr ""
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "SaÃdas de controlo"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "SaÃdas principais"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr ""
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
msgstr ""
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr ""
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr ""
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "Renomear faixa"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr ""
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": editor de comentários"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr ""
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr ""
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr ""
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr ""
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID controlo remoto"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
msgstr ""
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
msgstr ""
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
msgstr ""
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
msgstr ""
#: search_path_option.cc:35
@@ -10316,126 +12318,158 @@ msgstr ""
msgid "the session folder"
msgstr ""
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr ""
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr ""
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr ""
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Nova sessão"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessões recentes"
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
msgstr ""
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
msgstr ""
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Nova sessão"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
msgstr ""
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr ""
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr ""
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr ""
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr ""
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr ""
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr ""
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr ""
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr ""
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "canais"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr ""
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr ""
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr ""
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr ""
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr ""
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr ""
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr ""
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr ""
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr ""
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr ""
@@ -10456,197 +12490,197 @@ msgstr ""
msgid "This will select all elements of this type!"
msgstr ""
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Campo"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr ""
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr ""
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr ""
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr ""
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr ""
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr ""
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr ""
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr ""
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr ""
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr ""
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr ""
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr ""
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr ""
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr ""
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr ""
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr ""
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr ""
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr ""
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr ""
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr ""
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr ""
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr ""
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr ""
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr ""
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr ""
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr ""
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr ""
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr ""
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr ""
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr ""
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr ""
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr ""
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr ""
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr ""
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr ""
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr ""
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr ""
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr ""
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr ""
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
msgstr ""
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr ""
@@ -10793,209 +12827,230 @@ msgid "Destructive crossfade length"
msgstr ""
#: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
msgstr ""
#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr ""
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr ""
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr ""
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr ""
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr ""
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr ""
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr ""
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr ""
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr ""
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr ""
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr ""
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr ""
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr ""
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr ""
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr ""
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr ""
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr ""
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr ""
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr ""
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr ""
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr ""
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr ""
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr ""
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr ""
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr ""
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr ""
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr ""
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr ""
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr ""
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr ""
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr ""
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr ""
@@ -11031,26 +13086,14 @@ msgstr ""
msgid "Timestamp:"
msgstr ""
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr ""
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Não foi possÃvel ler o ficheiro: %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr ""
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Não foi possÃvel aceder ao ficheiros audio: "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr ""
@@ -11059,284 +13102,280 @@ msgstr ""
msgid "Search"
msgstr ""
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr ""
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr ""
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr ""
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr ""
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr ""
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "Directórios"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr ""
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr ""
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr ""
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr ""
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr ""
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr ""
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr ""
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr ""
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr ""
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr ""
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr ""
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr ""
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr ""
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr ""
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr ""
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr ""
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr ""
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
msgstr ""
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr ""
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr ""
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr ""
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr ""
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr ""
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr ""
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr ""
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr ""
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr ""
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
msgstr ""
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr ""
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr ""
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr ""
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr ""
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr ""
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr ""
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr ""
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr ""
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr ""
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr ""
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr ""
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Mais rápido"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr ""
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr ""
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr "Salto"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr "Roda"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "Velocidade máxima"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr ""
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr ""
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ""
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11361,7 +13400,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr ""
@@ -11377,17 +13416,17 @@ msgstr ""
msgid "Azimuth:"
msgstr ""
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr ""
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11397,15 +13436,15 @@ msgid ""
"program.</span> "
msgstr ""
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr ""
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr ""
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11415,11 +13454,11 @@ msgid ""
"<i>(You can put new sessions anywhere, this is just a default)</i>"
msgstr ""
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr ""
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11433,31 +13472,31 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr ""
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr ""
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
msgstr ""
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr ""
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
msgstr ""
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11465,46 +13504,42 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr ""
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ""
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ""
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ""
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr ""
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr ""
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr ""
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr ""
@@ -11613,11 +13648,11 @@ msgstr ""
msgid "Insert a program change message"
msgstr ""
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr ""
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr ""
@@ -11629,240 +13664,244 @@ msgstr ""
msgid "Octave"
msgstr ""
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr ""
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr ""
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr ""
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr ""
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr ""
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr ""
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr ""
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr ""
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr ""
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr ""
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr ""
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr ""
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr ""
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr ""
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr ""
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr ""
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr ""
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr ""
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr ""
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr ""
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr ""
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr ""
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr ""
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr ""
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr ""
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr ""
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr ""
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr ""
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr ""
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr ""
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr ""
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr ""
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr ""
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr ""
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr ""
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr ""
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr ""
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr ""
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr ""
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr ""
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr ""
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr ""
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr ""
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr ""
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr ""
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr ""
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr ""
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr ""
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr ""
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr ""
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr ""
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr ""
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr ""
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr ""
@@ -11870,176 +13909,189 @@ msgstr ""
msgid "Strip Silence"
msgstr ""
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr ""
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr ""
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr ""
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr ""
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr ""
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr ""
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr ""
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr ""
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr ""
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr ""
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr ""
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr ""
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr ""
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr ""
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr ""
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr ""
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
msgstr ""
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
msgstr ""
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
msgstr ""
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
msgstr ""
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
msgstr ""
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
msgstr ""
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
msgstr ""
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr ""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr ""
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objecto"
-
-#: theme_manager.cc:163
-msgid "Items"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:164
-msgid "Palette"
-msgstr ""
-
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12047,92 +14099,95 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] ""
msgstr[1] ""
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Rápido e feio"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Ignorar anti-aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr ""
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr ""
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr ""
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr ""
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr ""
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr ""
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr ""
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr ""
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr ""
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr ""
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr ""
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr ""
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Iniciar gravação na posição inicial de inserção automática"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Parar gravação na posição final de inserção automática"
@@ -12200,94 +14255,130 @@ msgstr ""
msgid "Transpose"
msgstr ""
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr ""
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:177
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr ""
-#: ui_config.cc:222
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr ""
-#: ui_config.cc:227
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr ""
-#: ui_config.cc:317
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr ""
-#: ui_config.cc:320
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:325
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:333
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
-#: ui_config.cc:351
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr ""
-#: ui_config.cc:592
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr ""
-#: ui_config.cc:662
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr ""
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr ""
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr ""
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr ""
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr ""
@@ -12332,32 +14423,48 @@ msgstr ""
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12367,25 +14474,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12407,7 +14514,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12416,10 +14523,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12429,9 +14540,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12440,83 +14550,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12536,7 +14646,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12546,239 +14656,230 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr ""
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr ""
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr ""
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr ""
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr ""
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr ""
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr ""
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr ""
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr ""
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr ""
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr ""
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr ""
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr ""
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr ""
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr ""
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr ""
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr ""
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr ""
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr ""
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr ""
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr ""
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr ""
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr ""
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr ""
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr ""
@@ -12796,13 +14897,40 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+#~ msgid "Locations"
+#~ msgstr "Localizações"
+
+#~ msgid "End point trim"
+#~ msgstr "Ponto final de corte"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplicar selecção"
+
+#~ msgid "I"
+#~ msgstr "E"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Comentários*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Clicar para acrescentar/editar comentários"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Actualizar efeitos/plug-ins disponÃveis"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID controlo remoto"
+
#~ msgid "Gain Tool"
#~ msgstr "Ferramenta/ganho"
diff --git a/gtk2_ardour/po/ru.mo b/gtk2_ardour/po/ru.mo
new file mode 100644
index 0000000..14eaaf3
Binary files /dev/null and b/gtk2_ardour/po/ru.mo differ
diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po
index 1593470..3a542d4 100644
--- a/gtk2_ardour/po/ru.po
+++ b/gtk2_ardour/po/ru.po
@@ -3,15 +3,15 @@
# This file is distributed under the same license as the gtk-ardour package.
#
# Igor Blinov pitstop at nm.ru, 2004.
-# ÐлекÑÐ°Ð½Ð´Ñ ÐолÑÑов <ag1455 at mail.ru>, 2014, 2015.
-# Alexandre Prokoudine <alexandre.prokoudine at gmail.com>, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016.
+# ÐлекÑÐ°Ð½Ð´Ñ ÐолÑÑов <ag1455 at mail.ru>, 2014-2016
+# Alexandre Prokoudine <alexandre.prokoudine at gmail.com>, 2006-2016, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: Ardour 4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 03:46+0300\n"
-"PO-Revision-Date: 2016-01-07 04:01+0300\n"
+"POT-Creation-Date: 2016-08-08 21:13+0300\n"
+"PO-Revision-Date: 2016-08-09 00:59+0300\n"
"Last-Translator: Alexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
"Language-Team: ÑÑÑÑкий <>\n"
"Language: ru\n"
@@ -24,270 +24,286 @@ msgstr ""
"%100>=20) ? 1: 2);\n"
#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr "Brian Ahr"
-#: about.cc:128
+#: about.cc:129
msgid "John Anderson"
msgstr "John Anderson"
-#: about.cc:129
+#: about.cc:130
msgid "Marcus Andersson"
msgstr "Marcus Andersson"
-#: about.cc:130
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr "Nedko Arnaudov"
-#: about.cc:131
+#: about.cc:132
msgid "Hans Baier"
msgstr "Hans Baier"
-#: about.cc:132
+#: about.cc:133
msgid "Ben Bell"
msgstr "Ben Bell"
-#: about.cc:133
+#: about.cc:134
msgid "Sakari Bergen"
msgstr "Sakari Bergen"
-#: about.cc:134
+#: about.cc:135
msgid "Christian Borss"
msgstr "Christian Borss"
-#: about.cc:135
+#: about.cc:136
msgid "Chris Cannam"
msgstr "Chris Cannam"
-#: about.cc:136
+#: about.cc:137
msgid "Jeremy Carter"
msgstr "Jeremy Carter"
-#: about.cc:137
+#: about.cc:138
msgid "Jesse Chappell"
msgstr "Jesse Chappell"
-#: about.cc:138
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr "Thomas Charbonnel"
-#: about.cc:139
+#: about.cc:140
msgid "Sam Chessman"
msgstr "Sam Chessman"
-#: about.cc:140
+#: about.cc:141
msgid "André Colomb"
msgstr "André Colomb"
-#: about.cc:141
+#: about.cc:142
msgid "Paul Davis"
msgstr "Paul Davis"
-#: about.cc:142
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr "Gerard van Dongen"
-#: about.cc:143
+#: about.cc:144
msgid "John Emmas"
msgstr "John Emmas"
-#: about.cc:144
+#: about.cc:145
msgid "Colin Fletcher"
msgstr "Colin Fletcher"
-#: about.cc:145
+#: about.cc:146
msgid "Dave Flick"
msgstr "Dave Flick"
-#: about.cc:146
+#: about.cc:147
msgid "Hans Fugal"
msgstr "Hans Fugal"
-#: about.cc:147
+#: about.cc:148
msgid "Robin Gareus"
msgstr "Robin Gareus"
-#: about.cc:148
+#: about.cc:149
msgid "Nil Geisweiller"
msgstr "Nil Geisweiller"
-#: about.cc:149
+#: about.cc:150
msgid "Christopher George"
msgstr "Christopher George"
-#: about.cc:150
+#: about.cc:151
msgid "Chris Goddard"
msgstr "Chris Goddard"
-#: about.cc:151
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr "J. Abelardo Gutierrez"
-#: about.cc:152
+#: about.cc:153
msgid "Jeremy Hall"
msgstr "Jeremy Hall"
-#: about.cc:153
+#: about.cc:154
msgid "Audun Halland"
msgstr "Audun Halland"
-#: about.cc:154
+#: about.cc:155
msgid "David Halter"
msgstr "David Halter"
-#: about.cc:155
+#: about.cc:156
msgid "Steve Harris"
msgstr "Steve Harris"
-#: about.cc:156
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr "Melvin Ray Herr"
-#: about.cc:157
+#: about.cc:158
msgid "Carl Hetherington"
msgstr "Carl Hetherington"
-#: about.cc:158
+#: about.cc:159
msgid "Rob Holland"
msgstr "Rob Holland"
-#: about.cc:159
+#: about.cc:160
msgid "Robert Jordens"
msgstr "Robert Jordens"
-#: about.cc:160
+#: about.cc:161
msgid "Stefan Kersten"
msgstr "Stefan Kersten"
-#: about.cc:161
+#: about.cc:162
msgid "Armand Klenk"
msgstr "Armand Klenk"
-#: about.cc:162
+#: about.cc:163
msgid "Julien de Kozak"
msgstr "Julien de Kozak"
-#: about.cc:163
+#: about.cc:164
msgid "Matt Krai"
msgstr "Matt Krai"
-#: about.cc:164
+#: about.cc:165
msgid "Georg Krause"
msgstr "Georg Krause"
-#: about.cc:165
+#: about.cc:166
msgid "Nick Lanham"
msgstr "Nick Lanham"
-#: about.cc:166
+#: about.cc:167
msgid "Colin Law"
msgstr "Colin Law"
-#: about.cc:167
+#: about.cc:168
msgid "Joshua Leach"
msgstr "Joshua Leach"
-#: about.cc:168
+#: about.cc:169
msgid "Ben Loftis"
msgstr "Ben Loftis"
-#: about.cc:169
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr "Nick Mainsbridge"
-#: about.cc:170
+#: about.cc:171
msgid "Tim Mayberry"
msgstr "Tim Mayberry"
-#: about.cc:171
+#: about.cc:172
msgid "Doug Mclain"
msgstr "Doug Mclain"
-#: about.cc:172
+#: about.cc:173
msgid "Todd Naugle"
msgstr "Todd Naugle"
-#: about.cc:173
+#: about.cc:174
msgid "André Nusser"
msgstr "André Nusser"
-#: about.cc:174
+#: about.cc:175
msgid "Bent Bisballe Nyeng"
msgstr "Bent Bisballe Nyeng"
-#: about.cc:175
+#: about.cc:176
msgid "Jack O'Quin"
msgstr "Jack O'Quin"
-#: about.cc:176
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr "Nimal Ratnayake"
-#: about.cc:177
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
msgid "David Robillard"
msgstr "David Robillard"
-#: about.cc:178
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr "Taybin Rutkin"
-#: about.cc:179
+#: about.cc:183
msgid "Andreas Ruge"
msgstr "Andreas Ruge"
-#: about.cc:180
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr "Sampo Savolainen"
-#: about.cc:181
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr "Rodrigo Severo"
-#: about.cc:182
+#: about.cc:186
msgid "Per Sigmond"
msgstr "Per Sigmond"
-#: about.cc:183
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr "Lincoln Spiteri"
-#: about.cc:184
+#: about.cc:188
msgid "Mike Start"
msgstr "Mike Start"
-#: about.cc:185
+#: about.cc:189
msgid "Mark Stewart"
msgstr "Mark Stewart"
-#: about.cc:186
+#: about.cc:190
msgid "Roland Stigge"
msgstr "Roland Stigge"
-#: about.cc:187
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr "Petter Sundlöf"
-#: about.cc:188
+#: about.cc:192
msgid "Mike Täht"
msgstr "Mike Täht"
-#: about.cc:189
+#: about.cc:193
msgid "Roy Vegard"
msgstr "Roy Vegard"
-#: about.cc:190
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr "Thorsten Wilms"
-#: about.cc:191
+#: about.cc:195
msgid "Damien Zammit"
msgstr "Damien Zammit"
-#: about.cc:192
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr "Grygorii Zharun"
-#: about.cc:197
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -301,7 +317,7 @@ msgstr ""
"\tMartin Blanchard\n"
"\tRomain Arnaud <roming22 at gmail.com>\n"
-#: about.cc:198
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -321,7 +337,7 @@ msgstr ""
"\tRichard Oax <richard at pagliacciempire.de>\n"
"\tRobin Gloster <robin at loc-com.de>\n"
-#: about.cc:205
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -331,7 +347,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:206
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -339,7 +355,7 @@ msgstr ""
"ÐоÑÑÑгалÑÑкий:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:207
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -349,7 +365,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:209
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -359,7 +375,7 @@ msgstr ""
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:210
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -368,9 +384,9 @@ msgstr ""
"Ð ÑÑÑкий:\n"
"\tÐгоÑÑ Ðлинов <pitstop at nm.ru>\n"
"\tÐлекÑÐ°Ð½Ð´Ñ ÐÑокÑдин <alexandre.prokoudine at gmail.com>\n"
-"\tÐлекÑÐ°Ð½Ð´Ñ ÐолÑÑов <ag1455 at mail.ru>"
+"\tÐлекÑÐ°Ð½Ð´Ñ ÐолÑÑов <ag1455 at mail.ru>\n"
-#: about.cc:212
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -378,7 +394,7 @@ msgstr ""
"ÐÑеÑеÑкий:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:213
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -386,7 +402,7 @@ msgstr ""
"ШведÑкий:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:214
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -394,7 +410,7 @@ msgstr ""
"ÐолÑÑкий:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:215
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -402,7 +418,7 @@ msgstr ""
"ЧеÑÑкий:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
-#: about.cc:216
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
@@ -410,7 +426,7 @@ msgstr ""
"ÐоÑвежÑкий:\n"
"\t Eivind ÃdegÃ¥rd\n"
-#: about.cc:217
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -418,49 +434,53 @@ msgstr ""
"ÐиÑайÑкий:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-#: about.cc:597
+#: about.cc:601
msgid "Intel 64-bit"
msgstr "Intel 64-bit"
-#: about.cc:599
+#: about.cc:603
msgid "Intel 32-bit"
msgstr "Intel 32-bit"
-#: about.cc:601
+#: about.cc:605
msgid "PowerPC 64-bit"
msgstr "PowerPC 64-bit"
-#: about.cc:603
+#: about.cc:607
msgid "PowerPC 32-bit"
msgstr "PowerPC 32-bit"
-#: about.cc:605
+#: about.cc:609
msgid "64-bit"
msgstr "64-bit"
-#: about.cc:607
+#: about.cc:611
msgid "32-bit"
msgstr "32-bit"
-#: about.cc:615
+#: about.cc:619
+msgid " - debug"
+msgstr " - оÑладка"
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr "ÐвÑоÑÑкие пÑава (C) 1999-2015 Paul Davis\n"
-#: about.cc:619
+#: about.cc:629
msgid "http://ardour.org/"
msgstr "http://ardour.org/"
-#: about.cc:620
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
msgstr ""
"%1%2\n"
-"(ÑобÑано из ÑедакÑии %3)\n"
-"%4"
+"(ÑедакÑÐ¸Ñ %3)\n"
+"%4%5"
-#: about.cc:625
+#: about.cc:635
msgid "Config"
msgstr "ÐонÑигÑÑаÑÐ¸Ñ ÑбоÑки"
@@ -480,108 +500,134 @@ msgstr "Файл опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÐ½Ñ %1 не найден"
msgid "%1 will not work without a valid menu definition file"
msgstr "%1 не бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð±ÐµÐ· пÑавилÑного Ð¼ÐµÐ½Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñайла"
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "ÐобавиÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð¸Ð»Ð¸ ÑинÑ"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "ÐобавиÑÑ Ð´Ð¾Ñожки/ÑинÑ/VCA"
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "ÐонÑигÑÑаÑиÑ:"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr "Режим запиÑи:"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "ÐнÑÑÑÑменÑ:"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "ÐвÑковÑе доÑожки"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "MIDI-доÑожки"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "СмеÑаннÑе доÑожки (ÐвÑк+MIDI)"
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "ШинÑ"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "ÐÑдиоÑинÑ"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "MIDI-ÑинÑ"
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "VCA-маÑÑеÑ"
-#: add_route_dialog.cc:83 add_route_dialog.cc:554
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr "РнаÑало"
-#: add_route_dialog.cc:84 add_route_dialog.cc:558
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
msgid "Before Selection"
msgstr "ÐеÑед вÑделеннÑм"
-#: add_route_dialog.cc:85 add_route_dialog.cc:556
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
msgid "After Selection"
msgstr "ÐоÑле вÑделенного"
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr "РконеÑ"
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "Ðибкий I/O"
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "СÑÑогий I/O"
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "ÐобавиÑÑ:"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>ÐаÑамеÑÑÑ</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:52
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "ÐмÑ:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "ÐÑÑппа:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr "ÐÑÑавиÑÑ:"
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:574 engine_dialog.cc:242 rc_option_editor.cc:2257
-#: rc_option_editor.cc:2259 rc_option_editor.cc:2261 rc_option_editor.cc:2279
-#: rc_option_editor.cc:2281 rc_option_editor.cc:2290 rc_option_editor.cc:2292
-#: rc_option_editor.cc:2310 rc_option_editor.cc:2323 rc_option_editor.cc:2326
-#: rc_option_editor.cc:2328 rc_option_editor.cc:2373 rc_option_editor.cc:2375
-#: rc_option_editor.cc:2377 rc_option_editor.cc:2385 rc_option_editor.cc:2393
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2403
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "ÐоÑÑÑ Ð²ÑÑ
ода:"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"С вклÑÑеннÑм ÑÑÑогим I/O ÑÑÑекÑ-пÑоÑеÑÑоÑÑ Ð½Ðµ бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÑиÑло каналов в "
+"доÑожке. ÐолиÑеÑÑво вÑÑ
однÑÑ
каналов вÑегда бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑÐ²Ñ "
+"вÑ
однÑÑ
каналов."
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "ÐÑдио"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:110 engine_dialog.cc:244 missing_file_dialog.cc:60
-#: rc_option_editor.cc:2536 rc_option_editor.cc:2538 rc_option_editor.cc:2548
-#: rc_option_editor.cc:2557 rc_option_editor.cc:2565 rc_option_editor.cc:2573
-#: rc_option_editor.cc:2581 rc_option_editor.cc:2589 rc_option_editor.cc:2591
-#: rc_option_editor.cc:2599 rc_option_editor.cc:2601 rc_option_editor.cc:2609
-#: rc_option_editor.cc:2618 rc_option_editor.cc:2620 rc_option_editor.cc:2628
-#: rc_option_editor.cc:2636 rc_option_editor.cc:2645 rc_option_editor.cc:2654
-#: rc_option_editor.cc:2677
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr "MIDI"
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr "ÐÑдио+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "Шина"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -596,60 +642,61 @@ msgstr ""
"ÐÑли Ð²Ñ Ð½Ðµ ÑобиÑаеÑеÑÑ Ð¸ÑполÑзоваÑÑ Ñакие плагинÑ, иÑполÑзÑйÑе обÑÑнÑе "
"звÑковÑе и MIDI-доÑожки."
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:438
-#: editor_rulers.cc:250 time_axis_view.cc:1383
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1294
msgid "Normal"
msgstr "ÐбÑÑнÑй"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "ÐеÑÑлойнÑй"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "ÐлÑноÑнÑй"
-#: add_route_dialog.cc:431 monitor_section.cc:272
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "Ðоно"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "СÑеÑео"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 канала"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 канала"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "5 каналов"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 каналов"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 каналов"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "3 канала"
-#: add_route_dialog.cc:483 mixer_strip.cc:1918 mixer_strip.cc:2351
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
msgid "Custom"
msgstr "Ðа заказ"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "СоздаÑÑ Ð³ÑÑппÑ..."
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr "ÐÐµÑ Ð³ÑÑппÑ"
@@ -679,67 +726,68 @@ msgstr ""
msgid "Done"
msgstr "ÐоÑово"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "ÐÑÑоÑник Ñигнала"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "ÐÑбÑаннÑе вÑделениÑ"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "ÐÑделеннÑе облаÑÑи"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "ÐÐ¾Ð´ÐµÐ»Ñ Ð¾ÑобÑажениÑ"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "СоÑÑавной гÑаÑик Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ доÑожки"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "СоÑÑавной гÑаÑик Ð´Ð»Ñ Ð²ÑеÑ
доÑожек"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Ðоказ диапазона ÑаÑÑоÑной моÑноÑÑи"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "ÐоÑмиÑоваÑÑ Ð·Ð½Ð°ÑениÑ"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "СпекÑÑалÑнÑй анализ"
-#: analysis_window.cc:60 editor.cc:1848
+#: analysis_window.cc:54 editor.cc:1954
msgid "Spectral Analysis"
msgstr "СпекÑÑалÑнÑй анализ"
-#: analysis_window.cc:67 editor_actions.cc:143 session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "ÐоÑожка"
-#: analysis_window.cc:68 editor_actions.cc:664 mixer_ui.cc:135 mixer_ui.cc:2040
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "ÐоказаÑÑ"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "ÐовÑоÑно пÑоанализиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе"
-#: ardour_button.cc:820
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "Ðнопка не Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑоÑÑоÑние неÑÑÑеÑÑвÑÑÑего ÑпÑавлÑемого\n"
-#: ardour_button.cc:1088
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: ardour_ui.cc:174
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
@@ -751,84 +799,153 @@ msgstr ""
"\n"
"ÐÑ Ñ
оÑиÑе, ÑÑÐ¾Ð±Ñ %1 %2.x иÑполÑзовал ÑÑи наÑÑÑойки?\n"
"\n"
-"(%1 пÑидÑÑÑÑ Ð¿ÐµÑезапÑÑÑиÑÑ.)\n"
+"(%1 пÑидÑÑÑÑ Ð¿ÐµÑезапÑÑÑиÑÑ.)"
-#: ardour_ui.cc:253 editor_actions.cc:658 region_editor.cc:53
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "ÐонÑÑолÑ"
-#: ardour_ui.cc:254 editor_actions.cc:137 mixer_strip.cc:2101
-#: monitor_section.cc:328 rc_option_editor.cc:2413 route_time_axis.cc:255
-#: route_time_axis.cc:2748
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "Соло"
-#: ardour_ui.cc:255 rc_option_editor.cc:1356
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "ÐÑклик"
-#: ardour_ui.cc:264 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "ÐонÑигÑÑаÑÐ¸Ñ Ð³ÑомкоговоÑиÑелей"
-#: ardour_ui.cc:265 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "ÐлавиаÑÑÑнÑе комбинаÑии"
-
-#: ardour_ui.cc:266
-msgid "Preferences"
-msgstr "ÐаÑамеÑÑÑ"
-
-#: ardour_ui.cc:267 ardour_ui.cc:274
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr "ÐобавиÑÑ Ð´Ð¾Ñожки/ÑинÑ"
-#: ardour_ui.cc:268
+#: ardour_ui.cc:298
msgid "About"
msgstr "РпÑогÑамме"
-#: ardour_ui.cc:269 location_ui.cc:1143 session_option_editor.cc:210
-#: session_option_editor.cc:216 session_option_editor.cc:223
-msgid "Locations"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
msgstr "ÐозиÑии"
-#: ardour_ui.cc:270 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "ÐоÑожки и ÑинÑ"
-#: ardour_ui.cc:271 engine_dialog.cc:73
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr "ÐаÑÑÑойка звÑка и MIDI"
-#: ardour_ui.cc:272
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr "Ðиалог ÑкÑпоÑÑа видео"
-#: ardour_ui.cc:273
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "УпÑавление ÑкÑипÑами"
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "СвойÑÑва"
-#: ardour_ui.cc:275 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "ÐобавиÑÑ Ð²Ð¸Ð´ÐµÐ¾"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "УпÑавление пакеÑами"
-#: ardour_ui.cc:276 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "ÐолÑÑой ÑÑÑÑÑик"
-#: ardour_ui.cc:277
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr "ÐвÑковÑе ÑоединениÑ"
-#: ardour_ui.cc:278
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr "Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ MIDI"
-#: ardour_ui.cc:295
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "РедакÑÐ¾Ñ ÐºÐ»Ð°Ð²Ð¸Ð°ÑÑÑнÑÑ
комбинаÑий"
+
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr "РедакÑоÑ"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "ÐикÑеÑ"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "ÐаÑамеÑÑÑ"
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr "ÐаÑи ÑÐ°Ð¹Ð»Ñ Ñ Ð½Ð°ÑÑÑойками ÑкопиÑованÑ. Ðожно пеÑезапÑÑÑиÑÑ %1."
-#: ardour_ui.cc:527
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+"<b>ÐеÑед вами ÐÐТÐ-веÑÑÐ¸Ñ %1 %2</b>\n"
+"\n"
+"ÐеÑÑÐ¸Ñ Ð´Ð»Ñ Linux Ñже вÑпÑÑена, но за оÑÑÑÑÑÑвием доÑÑаÑоÑного колиÑеÑÑва\n"
+"ÑеÑÑиÑовÑиков веÑÑÐ¸Ñ Ð´Ð»Ñ OS X ÑвлÑеÑÑÑ Ð±ÐµÑой. ÐÑÑÑда â неÑколÑко ÑовеÑов:\n"
+"\n"
+"1) ÐожалÑйÑÑа, <b>ÐÐ</b> иÑполÑзÑйÑе пÑогÑÐ°Ð¼Ð¼Ñ Ð² надежде на Ñо, ÑÑо она\n"
+" доÑÑаÑоÑно ÑÑабилÑна Ð´Ð»Ñ Ð¿Ð¾Ð²Ñедневного иÑполÑзованиÑ, Ñ
оÑÑ Ð´Ð»Ñ ÐºÐ¾Ð³Ð¾-Ñо\n"
+" ÑÑо и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñак.\n"
+"2) <b>ÐожалÑйÑÑа, ÐРиÑполÑзÑйÑе ÑоÑÑм на ardour.org Ð´Ð»Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± "
+"оÑибкаÑ
</b>.\n"
+"3) ÐожалÑйÑÑа, <b>ÐСÐÐÐЬÐУÐТÐ</b> ÑÑÐµÐºÐµÑ Ð½Ð° http://tracker.ardour.org/ длÑ\n"
+" ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибкаÑ
, не забÑв ÑказаÑÑ, ÑÑо они оÑноÑÑÑÑÑ Ðº 5.0-pre.\n"
+"4) ÐожалÑйÑÑа, <b>ÐÐШÐТÐ</b> в ÑпиÑок ÑаÑÑÑлки ardour-users Ñвои "
+"комменÑаÑии\n"
+" и идеи каÑаÑелÑно новой веÑÑии.\n"
+"5) ÐожалÑйÑÑа, <b>ÐСÐÐÐЬÐУÐТÐ</b> Ð½Ð°Ñ ÐºÐ°Ð½Ð°Ð» IRC Ð´Ð»Ñ Ð¾Ð±ÑÑÐ¶Ð´ÐµÐ½Ð¸Ñ ardour3\n"
+" Ñ ÑазÑабоÑÑиками пÑогÑÐ°Ð¼Ð¼Ñ Ð² Ñежиме ÑеалÑного вÑемени. ÐÑ Ð¼Ð¾Ð¶ÐµÑе\n"
+" ÑделаÑÑ ÑÑо, вÑбÑав в главном Ð¼ÐµÐ½Ñ Ð¿ÑÐ½ÐºÑ Â«Ð¡Ð¿Ñавка > ÐообÑаÑÑÑÑ».\n"
+"\n"
+"Ðолее подÑобнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð±Ð¾ вÑÑм ÑÑом можно полÑÑиÑÑ Ð½Ð° ÑÑÑаниÑе\n"
+"\n"
+" http://ardour.org/support\n"
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
@@ -838,7 +955,7 @@ msgstr ""
"\n"
"%1"
-#: ardour_ui.cc:529
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -850,7 +967,7 @@ msgstr ""
"ÑабоÑал недоÑÑаÑоÑно бÑÑÑÑо. ÐопÑобÑйÑе Ñнова\n"
"запÑÑÑиÑÑ Ð¿Ð¾Ð´ÑиÑÑÐµÐ¼Ñ Ð¸ ÑоÑ
ÑаниÑÑ ÑеÑÑиÑ."
-#: ardour_ui.cc:553
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
@@ -858,39 +975,39 @@ msgstr ""
"Ðе ÑдалоÑÑ Ð¿ÑоÑканиÑоваÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Audio Unit. ÐвÑомаÑиÑеÑкое ÑканиÑование AU "
"вÑклÑÑено. ÐодÑобноÑÑи ÑÐºÐ°Ð·Ð°Ð½Ñ Ð² окне жÑÑнала."
-#: ardour_ui.cc:554
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr "Ðе ÑдалоÑÑ Ð¿ÑоÑканиÑоваÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Audio Unit:"
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr "СеÑÐ²ÐµÑ NSM не обÑÑвлÑл о Ñебе"
-#: ardour_ui.cc:916
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr "NSM: не пÑедоÑÑавлен ни один ID-клиенÑ"
-#: ardour_ui.cc:923
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr "NSM: Ð½ÐµÑ Ñозданной ÑеÑÑии"
-#: ardour_ui.cc:946
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr "NSM: Ñбой иниÑиализаÑии"
-#: ardour_ui.cc:978
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr "ÐÑедÑпÑеждение демовеÑÑии"
-#: ardour_ui.cc:980
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr "ÐодпиÑаÑÑÑÑ Ð¸ поддеÑжаÑÑ ÑазÑабоÑÐºÑ %1"
-#: ardour_ui.cc:981
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr "ÐолÑÑе не пÑедÑпÑеждаÑÑ"
-#: ardour_ui.cc:983
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -908,15 +1025,15 @@ msgstr ""
"\n"
"%4"
-#: ardour_ui.cc:984
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr "ÐÑо демонÑÑÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ %1"
-#: ardour_ui.cc:985
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr "Ðна не ÑоÑ
ÑанÑÐµÑ Ð¸ не воÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿Ð°ÑамеÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²."
-#: ardour_ui.cc:986
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
@@ -924,7 +1041,7 @@ msgstr ""
"ÐÑли Ð²Ñ Ð·Ð°Ð³ÑÑзиÑе ÑÑÑеÑÑвÑÑÑÑÑ ÑеÑÑиÑ, вÑе ÑобÑÑвеннÑе \n"
"паÑамеÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð² бÑдÑÑ ÑбÑоÑÐµÐ½Ñ Ð¸ поÑеÑÑÐ½Ñ Ð¿Ñи ÑоÑ
Ñанении."
-#: ardour_ui.cc:988 plugin_ui.cc:579
+#: ardour_ui.cc:1093 plugin_ui.cc:586
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
@@ -932,19 +1049,19 @@ msgstr ""
"ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾Ð»Ð½Ñй доÑÑÑп к обновлениÑм без огÑаниÑений,\n"
"необÑ
одима ежемеÑÑÑÐ½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка по низкой Ñене."
-#: ardour_ui.cc:998
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr "ÐÑйÑи"
-#: ardour_ui.cc:999
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr "ÐÑодолжиÑÑ ÑабоÑÑ"
-#: ardour_ui.cc:1032 startup.cc:348
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 гоÑов к ÑабоÑе"
-#: ardour_ui.cc:1074
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -959,23 +1076,23 @@ msgstr ""
"ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑзнаÑÑ ÑÑÑановленнÑй пÑедел пÑи помоÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ 'ulimit -l'. ÐбÑÑно "
"ÑÑо конÑÑолиÑÑеÑÑÑ Ð² %2."
-#: ardour_ui.cc:1091
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "ÐолÑÑе не показÑваÑÑ ÑÑо окно"
-#: ardour_ui.cc:1135
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "Ðе вÑÑ
одиÑÑ"
-#: ardour_ui.cc:1136
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr "ÐÑоÑÑо вÑйÑи"
-#: ardour_ui.cc:1137 ardour_ui.cc:5010
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "СоÑ
ÑаниÑÑ Ð¸ вÑйÑи"
-#: ardour_ui.cc:1147
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -990,11 +1107,11 @@ msgstr ""
"\n"
"«ÐÑоÑÑо вÑйÑи»."
-#: ardour_ui.cc:1197
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr "СеÑÑÐ¸Ñ Ð½Ðµ ÑоÑ
Ñанена"
-#: ardour_ui.cc:1218
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -1012,7 +1129,7 @@ msgstr ""
"\n"
"ЧÑо Ð²Ñ Ñ
оÑиÑе ÑделаÑÑ?"
-#: ardour_ui.cc:1221
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -1030,106 +1147,107 @@ msgstr ""
"\n"
"ЧÑо Ð²Ñ Ñ
оÑиÑе ÑделаÑÑ?"
-#: ardour_ui.cc:1235
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "СÑÑлеÑ"
-#: ardour_ui.cc:1349 ardour_ui.cc:1357
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr "ÐвÑк: <span foreground=\"red\">неÑ</span>"
-#: ardour_ui.cc:1361
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr "ÐвÑк: <span foreground=\"green\">%.1f ÐÐÑ / %4.1f мÑ</span>"
-#: ardour_ui.cc:1365
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr "ÐвÑк: <span foreground=\"green\">%<PRId64> ÐÐÑ / %4.1f мÑ</span>"
-#: ardour_ui.cc:1383 export_video_dialog.cc:76
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "Файл:"
-#: ardour_ui.cc:1387
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1390
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1393
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1396 session_option_editor.cc:202
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1399
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1402
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1405 session_option_editor.cc:203
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1408
+#: ardour_ui.cc:1518
msgid "RF64/WAV"
msgstr "RF64/WAV"
-#: ardour_ui.cc:1411
+#: ardour_ui.cc:1521
msgid "MBWF"
msgstr "MBWF"
-#: ardour_ui.cc:1419
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr "32-float"
-#: ardour_ui.cc:1422
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr "24-int"
-#: ardour_ui.cc:1425
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr "16-int"
-#: ardour_ui.cc:1446
+#: ardour_ui.cc:1556
#, c-format
msgid "X: <span foreground=\"%s\">>10K</span>"
msgstr ""
-#: ardour_ui.cc:1448
+#: ardour_ui.cc:1558
#, c-format
msgid "X: <span foreground=\"%s\">%u</span>"
msgstr "X: <span foreground=\"%s\">%u</span>"
-#: ardour_ui.cc:1451
+#: ardour_ui.cc:1561
#, c-format
msgid "X: <span foreground=\"%s\">?</span>"
msgstr "X: <span foreground=\"%s\">?</span>"
-#: ardour_ui.cc:1454
+#: ardour_ui.cc:1564
msgid "Audio dropouts. Shift+click to reset"
msgstr ""
-#: ardour_ui.cc:1467
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr "ЦÐ: <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1477
+#: ardour_ui.cc:1587
#, c-format
msgid "PkBld: <span foreground=\"%s\">%d</span>"
msgstr ""
-#: ardour_ui.cc:1499
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1140,29 +1258,29 @@ msgstr ""
"%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
"%<PRIu32>%%</span>"
-#: ardour_ui.cc:1540
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Ðа диÑке: <span foreground=\"green\">неизвеÑÑно</span>"
-#: ardour_ui.cc:1542
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Ðа диÑке: <span foreground=\"green\">24Ñ+</span>"
-#: ardour_ui.cc:1560
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr "Ðа диÑке: <span foreground=\"green\">>24Ñ</span>"
-#: ardour_ui.cc:1571
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Ðа диÑке: <span foreground=\"%s\">%02dÑ:%02dм:%02dÑ</span>"
-#: ardour_ui.cc:1597
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "ТÐ: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1675
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
@@ -1170,56 +1288,63 @@ msgstr ""
"%1 не Ñоединен Ñ ÐºÐ°ÐºÐ¾Ð¹-либо звÑковой подÑиÑÑемой.\n"
"ÐÑкÑÑÑие и закÑÑÑие ÑеÑÑий невозможно."
-#: ardour_ui.cc:1693
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "ÐÑкÑÑÑÑ ÑеÑÑиÑ"
-#: ardour_ui.cc:1717 session_dialog.cc:407 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "CеанÑÑ %1"
-#: ardour_ui.cc:1748
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
msgstr "ÐÑ Ð½Ðµ можеÑе добавиÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð±ÐµÐ· загÑÑженной ÑеÑÑии."
-#: ardour_ui.cc:1756
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
-msgstr[0] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 новÑÑ ÑмеÑаннÑÑ Ð´Ð¾ÑожкÑ"
-msgstr[1] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 новÑÑ
ÑмеÑаннÑÑ
доÑожки"
-msgstr[2] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 новÑÑ
ÑмеÑаннÑÑ
доÑожек"
-
-#: ardour_ui.cc:1762 ardour_ui.cc:1823
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"ÐедоÑÑаÑоÑно доÑÑÑпнÑÑ
поÑÑов Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ доÑожки или ÑинÑ.\n"
-"Ðам необÑ
одимо ÑоÑ
ÑаниÑÑ %1 и \n"
-"пеÑезапÑÑÑиÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом поÑÑов."
-
-#: ardour_ui.cc:1797
+msgstr[0] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 ÑмеÑаннÑÑ Ð´Ð¾ÑожкÑ"
+msgstr[1] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 ÑмеÑаннÑÑ
доÑожки"
+msgstr[2] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 ÑмеÑаннÑÑ
доÑожек"
+
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 MIDI-ÑинÑ"
+msgstr[1] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 MIDI-ÑинÑ"
+msgstr[2] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 MIDI-Ñин"
+
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr "ÐÑ Ð½Ðµ можеÑе добавиÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð¸Ð»Ð¸ ÑÐ¸Ð½Ñ Ð±ÐµÐ· оÑкÑÑÑой ÑеÑÑии."
-#: ardour_ui.cc:1806
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 новÑÑ Ð·Ð²ÑковÑÑ Ð´Ð¾ÑожкÑ"
msgstr[1] "Ðе ÑдалоÑÑ ÑоздаÑÑ %2 новÑÑ
звÑковÑÑ
доÑожки"
msgstr[2] "Ðе ÑдалоÑÑ ÑоздаÑÑ %2 новÑÑ
звÑковÑÑ
доÑожек"
-#: ardour_ui.cc:1815
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 новÑÑ Ð·Ð²ÑковÑÑ ÑинÑ"
msgstr[1] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 новÑÑ
звÑковÑÑ
ÑинÑ"
msgstr[2] "Ðе ÑдалоÑÑ ÑоздаÑÑ %1 новÑÑ
звÑковÑÑ
Ñин"
-#: ardour_ui.cc:1968
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"ÐедоÑÑаÑоÑно доÑÑÑпнÑÑ
поÑÑов Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ доÑожки или ÑинÑ.\n"
+"Ðам необÑ
одимо ÑоÑ
ÑаниÑÑ %1 и \n"
+"пеÑезапÑÑÑиÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом поÑÑов."
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1228,20 +1353,20 @@ msgstr ""
"как пÑÑаÑÑÑÑ ÑÑо-либо запиÑаÑÑ.\n"
"ÐÑполÑзÑйÑе Ð¼ÐµÐ½Ñ Â«Ð¡ÐµÑÑÐ¸Ñ > ÐобавиÑÑ Ð´Ð¾ÑожкÑ/ÑинÑ»."
-#: ardour_ui.cc:2359
+#: ardour_ui.cc:2565
#, c-format
msgid "Copied %<PRId64> of %<PRId64>"
msgstr "СкопиÑовано %<PRId64> из %<PRId64>"
-#: ardour_ui.cc:2413 save_as_dialog.cc:33
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
msgid "Save As"
msgstr "СоÑ
ÑаниÑÑ ÐºÐ°Ðº"
-#: ardour_ui.cc:2441
+#: ardour_ui.cc:2647
msgid "Save As failed: %1"
msgstr "Ðе ÑдалоÑÑ ÑоÑ
ÑаниÑÑ Ð¿Ð¾Ð´ дÑÑгим именем: %1"
-#: ardour_ui.cc:2463
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1249,35 +1374,35 @@ msgstr ""
"ÐÐ»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑовмеÑÑимоÑÑи Ñ ÑазлиÑнÑми ÑиÑÑемами\n"
"Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñнимков не могÑÑ ÑодеÑжаÑÑ Ñимвол '%1'."
-#: ardour_ui.cc:2477
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "ÐодÑвеÑдиÑе пеÑезапиÑÑ Ñнимка"
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2699
msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr "Снимок Ñ Ñаким названием Ñже ÑÑÑеÑÑвÑеÑ. ÐеÑезапиÑаÑÑ ÐµÐ³Ð¾?"
-#: ardour_ui.cc:2503
-msgid "Save as..."
-msgstr "СоÑ
ÑаниÑÑ ÐºÐ°Ðº..."
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
-#: ardour_ui.cc:2504 ardour_ui.cc:2555
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
msgid "New session name"
msgstr "Ðовое название ÑеÑÑии"
-#: ardour_ui.cc:2506
+#: ardour_ui.cc:2727
msgid "Take Snapshot"
msgstr "СоздаÑÑ Ñнимок"
-#: ardour_ui.cc:2507
+#: ardour_ui.cc:2728
msgid "Name of new snapshot"
msgstr "Ðазвание нового Ñнимка"
-#: ardour_ui.cc:2554
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "ÐеÑеименоваÑÑ ÑеÑÑиÑ"
-#: ardour_ui.cc:2569 ardour_ui.cc:3049 ardour_ui.cc:3087
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1285,12 +1410,12 @@ msgstr ""
"ÐÐ»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑовмеÑÑимоÑÑи Ñ ÑазлиÑнÑми ÑиÑÑемами\n"
"Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑеÑÑий не могÑÑ ÑодеÑжаÑÑ Ñимвол '%1'."
-#: ardour_ui.cc:2577
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr "Ðапка Ñ Ñаким названием Ñже еÑÑÑ. УкажиÑе дÑÑгое."
-#: ardour_ui.cc:2586
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1298,27 +1423,27 @@ msgstr ""
"Ðе ÑдалоÑÑ Ð¿ÐµÑеименоваÑÑ ÑÑÑ ÑеÑÑиÑ.\n"
"ÐÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑенÑ, оÑÐµÐ½Ñ Ð¿Ð»Ð¾Ñ
о."
-#: ardour_ui.cc:2702 route_ui.cc:1871
+#: ardour_ui.cc:2923 route_ui.cc:1871
msgid "Confirm Template Overwrite"
msgstr "ÐодÑвеÑдиÑе пеÑезапиÑÑ Ñаблона"
-#: ardour_ui.cc:2703 route_ui.cc:1872
+#: ardour_ui.cc:2924 route_ui.cc:1872
msgid "A template already exists with that name. Do you want to overwrite it?"
msgstr "Шаблон Ñ Ñаким названием Ñже ÑÑÑеÑÑвÑеÑ. ÐеÑезапиÑаÑÑ ÐµÐ³Ð¾?"
-#: ardour_ui.cc:2727
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr "СоÑ
ÑаниÑÑ Ñаблон"
-#: ardour_ui.cc:2728
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "Ðазвание Ñаблона:"
-#: ardour_ui.cc:2729
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-Ñаблон"
-#: ardour_ui.cc:2766
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
@@ -1328,39 +1453,39 @@ msgstr ""
"%1\n"
"Ñже ÑÑÑеÑÑвÑеÑ. ÐÑкÑÑÑÑ ÐµÑ?"
-#: ardour_ui.cc:2776
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "ÐÑкÑÑÑÑ ÑÑÑеÑÑвÑÑÑÑÑ ÑеÑÑÑ"
-#: ardour_ui.cc:3077
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "Ðо адÑеÑÑ \"%1\" не ÑÑÑеÑÑвÑÑÑей ÑеÑÑии"
-#: ardour_ui.cc:3171
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "ÐождиÑеÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð·Ð°Ð³ÑÑзки ÑеÑÑии в %1"
-#: ardour_ui.cc:3186
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "ÐÑибка ÑегиÑÑÑаÑии поÑÑа"
-#: ardour_ui.cc:3187
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr "ЩелкниÑе ÐºÐ½Ð¾Ð¿ÐºÑ Â«ÐакÑÑÑÑ» Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑа к пÑедÑдÑÑÐµÐ¼Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ñ."
-#: ardour_ui.cc:3206
+#: ardour_ui.cc:3426
msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
msgstr "Ðе ÑдалоÑÑ ÑÑпеÑно загÑÑзиÑÑ ÑÐµÐ°Ð½Ñ \"%1 (Ñнимок %2)\": %3"
-#: ardour_ui.cc:3212 ardour_ui.cc:3233 ardour_ui.cc:3330 ardour_ui.cc:3339
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "ÐÑибка пÑи загÑÑзке"
-#: ardour_ui.cc:3227
+#: ardour_ui.cc:3447
msgid "Session \"%1 (snapshot %2)\" did not load successfully"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ ÑеÑÑÐ¸Ñ \"%1 (Ñнимок %2)\""
-#: ardour_ui.cc:3255
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
@@ -1370,19 +1495,19 @@ msgstr ""
"\n"
"ÐÑ Ð½Ðµ ÑможеÑе запиÑÑваÑÑ Ð¸Ð»Ð¸ ÑоÑ
ÑанÑÑÑ."
-#: ardour_ui.cc:3260
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr "СеÑÑÐ¸Ñ Ð² Ñежиме ÑÑениÑ"
-#: ardour_ui.cc:3329
+#: ardour_ui.cc:3547
msgid "Could not create session in \"%1\": %2"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ ÑеÑÑÐ¸Ñ Ð² \"%1\": %2"
-#: ardour_ui.cc:3338
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ ÑеÑÑÐ¸Ñ Â«%1»"
-#: ardour_ui.cc:3378
+#: ardour_ui.cc:3601
msgid ""
"<b>Just ask and wait for an answer.\n"
"It may take from minutes to hours.</b>"
@@ -1390,11 +1515,11 @@ msgstr ""
"<b>ÐÑоÑÑо ÑпÑоÑиÑе и ÑеÑпеливо подождиÑе оÑвеÑа.\n"
"ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½ÑÑÑ Ð¾Ñ Ð½ÐµÑколÑкиÑ
минÑÑ Ð´Ð¾ паÑÑ ÑаÑов.</b>"
-#: ardour_ui.cc:3380
+#: ardour_ui.cc:3603
msgid "About the Chat"
msgstr "Ð ÑаÑе"
-#: ardour_ui.cc:3381
+#: ardour_ui.cc:3604
msgid ""
"When you're inside the chat just ask your question and wait for an answer. "
"The chat is occupied by real people with real lives so many of them are "
@@ -1413,16 +1538,16 @@ msgstr ""
"ÐÑÑавÑÑе окно ÑаÑа оÑкÑÑÑÑм и пеÑиодиÑеÑки заглÑдÑвайÑе ÑÑда, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ, "
"не оÑвеÑил ли вам кÑо."
-#: ardour_ui.cc:3500
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "ÐÐµÑ Ð³Ð¾ÑовÑÑ
к ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð²ÑковÑÑ
Ñайлов"
-#: ardour_ui.cc:3504 ardour_ui.cc:3514 ardour_ui.cc:3647 ardour_ui.cc:3654
-#: ardour_ui_ed.cc:104
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "ÐÑиÑÑиÑÑ"
-#: ardour_ui.cc:3505
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1434,19 +1559,19 @@ msgstr ""
"Ðни могÑÑ Ð²ÐºÐ»ÑÑаÑÑ Ð¾Ð±Ð»Ð°ÑÑи, коÑоÑÑм\n"
"нÑÐ¶Ð½Ñ Ð½ÐµÐ¸ÑполÑзÑемÑе ÑайлÑ."
-#: ardour_ui.cc:3564
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "Ðило"
-#: ardour_ui.cc:3567
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "Ðега"
-#: ardour_ui.cc:3570
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "Ðига"
-#: ardour_ui.cc:3575
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1466,7 +1591,7 @@ msgstr[2] ""
"оÑвободив пÑи ÑÑом %3 %4байÑ\n"
"диÑкового пÑоÑÑÑанÑÑва."
-#: ardour_ui.cc:3582
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1513,11 +1638,11 @@ msgstr[2] ""
"\n"
"дополниÑелÑно оÑÐ²Ð¾Ð±Ð¾Ð´Ð¸Ñ %3 %4Ð±Ð°Ð¹Ñ Ð´Ð¸Ñкового пÑоÑÑÑанÑÑва.\n"
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "ÐÑ ÑвеÑенÑ, ÑÑо Ñ
оÑиÑе вÑполниÑÑ Ð¾ÑиÑÑкÑ?"
-#: ardour_ui.cc:3649
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1528,39 +1653,63 @@ msgstr ""
"неиÑполÑзÑемÑе звÑковÑе ÑайлÑ\n"
"бÑдÑÑ Ð¿ÐµÑемеÑÐµÐ½Ñ Ð² «меÑÑвÑÑ» зонÑ."
-#: ardour_ui.cc:3657
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "ÐÑиÑÑка"
-#: ardour_ui.cc:3687
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr "ÐÑиÑеннÑе ÑайлÑ"
-#: ardour_ui.cc:3704
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "УдалÑн Ñайл"
-#: ardour_ui.cc:3897
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "Ðевозможно пÑоÑиÑаÑÑ ÑкÑÐ¸Ð¿Ñ ÑеанÑа '%1': %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr "УÑÑановиÑÑ Ð¿Ð°ÑамеÑÑÑ ÑкÑипÑа"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "Ðе ÑдалоÑÑ Ð¸Ð½Ð¸ÑиализоваÑÑ ÑкÑÐ¸Ð¿Ñ ÑеанÑа '%1': %2"
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ ÑкÑÐ¸Ð¿Ñ ÑеанÑа '%1': %2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "Ð ÑÑой ÑеÑÑии Ð½ÐµÑ Ð°ÐºÑивнÑÑ
ÑкÑипÑов ÑеÑÑии."
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "Удаление ÑÑенаÑÐ¸Ñ ÑеÑÑии '%1' законÑилаÑÑ Ð½ÐµÑдаÑей: %2"
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr "ÐидеоÑеÑÐ²ÐµÑ Ð½Ðµ бÑл запÑÑен %1. ÐапÑÐ¾Ñ ÐµÐ³Ð¾ оÑÑановки игноÑиÑÑеÑÑÑ."
-#: ardour_ui.cc:3901
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr "ÐÑÑановиÑÑ Ð²Ð¸Ð´ÐµÐ¾ÑеÑвеÑ"
-#: ardour_ui.cc:3902
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr "ÐÑ Ð´ÐµÐ¹ÑÑвиÑелÑно Ñ
оÑиÑе оÑÑановиÑÑ Ð²Ð¸Ð´ÐµÐ¾ÑеÑвеÑ?"
-#: ardour_ui.cc:3905
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr "Ðа, оÑÑановиÑÑ"
-#: ardour_ui.cc:3931
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr "ÐидеоÑеÑÐ²ÐµÑ Ñже запÑÑен."
-#: ardour_ui.cc:3933
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
@@ -1568,7 +1717,7 @@ msgstr ""
"ÐнеÑний видеоÑеÑÐ²ÐµÑ Ð½Ð°ÑÑÑоен и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾ÑÑÑпен, не наÑÐ¸Ð½Ð°Ñ Ð½Ð¾Ð²Ñй "
"ÑкземплÑÑ."
-#: ardour_ui.cc:3941 ardour_ui.cc:4046
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
@@ -1576,47 +1725,47 @@ msgstr ""
"Ðе ÑдалоÑÑ ÑоединиÑÑÑÑ Ñ Ð²Ð¸Ð´ÐµÐ¾ÑеÑвеÑом. ÐапÑÑÑиÑе его, либо ÑкажиÑе URL "
"доÑÑÑпа к Ð½ÐµÐ¼Ñ Ð² диалоге паÑамеÑÑов пÑогÑаммÑ."
-#: ardour_ui.cc:3971
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr "Указан DOC-коÑÐµÐ½Ñ Ð½Ðµ ÑÑÑеÑÑвÑÑÑего каÑалога."
-#: ardour_ui.cc:3977 ardour_ui.cc:3983
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr "ÐаннÑй видеоÑеÑÐ²ÐµÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð¸ÑполнÑемÑм Ñайлом."
-#: ardour_ui.cc:4017
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð²Ð¸Ð´ÐµÐ¾ÑеÑвеÑ"
-#: ardour_ui.cc:4027
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr "ÐидеоÑеÑÐ²ÐµÑ Ð·Ð°Ð¿ÑÑен, но не оÑкликаеÑÑÑ."
-#: ardour_ui.cc:4072 editor_audio_import.cc:644
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ %1"
-#: ardour_ui.cc:4076
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr "Ðе вÑбÑан видеоÑайл"
-#: ardour_ui.cc:4172
+#: ardour_ui.cc:4472
msgid "No LTC detected, video will not be aligned."
msgstr ""
-#: ardour_ui.cc:4178
+#: ardour_ui.cc:4478
msgid "Align video-start to %1 [samples]"
msgstr ""
-#: ardour_ui.cc:4312
+#: ardour_ui.cc:4654
msgid "xrun"
msgstr ""
-#: ardour_ui.cc:4321
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr "ÐапиÑÑ Ð¾ÑÑановлена из-за недоÑÑаÑоÑного бÑÑÑÑодейÑÑÐ²Ð¸Ñ ÑиÑÑемÑ"
-#: ardour_ui.cc:4350
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1630,23 +1779,23 @@ msgstr ""
"Ð ÑаÑÑноÑÑи ей не ÑдалоÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð´Ð°Ð½Ð½Ñе на диÑк\n"
"доÑÑаÑоÑно бÑÑÑÑо Ð´Ð»Ñ ÑикÑаÑии заÑ
ваÑеннÑÑ
даннÑÑ
.\n"
-#: ardour_ui.cc:4423
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr "СканиÑование плагинов"
-#: ardour_ui.cc:4425
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr "ÐÑмениÑÑ ÑканиÑование плагинов"
-#: ardour_ui.cc:4434
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr "Тайм-аÑÑ Ð¾ÑÑановки"
-#: ardour_ui.cc:4441
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr "Тайм-аÑÑ ÑканиÑованиÑ"
-#: ardour_ui.cc:4485
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1660,11 +1809,11 @@ msgstr ""
"Ð ÑаÑÑноÑÑи ей не ÑдалоÑÑ Ð¿ÑоÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе\n"
"Ñ Ð´Ð¸Ñка доÑÑаÑоÑно бÑÑÑÑо Ð´Ð»Ñ Ð²Ð¾ÑпÑоизведениÑ.\n"
-#: ardour_ui.cc:4525
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "ÐоÑÑÑановление даннÑÑ
"
-#: ardour_ui.cc:4526
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1680,19 +1829,19 @@ msgstr ""
"%1 Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾ÑÑÑановиÑÑ Ð·Ð°Ð¿Ð¸ÑаннÑе даннÑе,\n"
"либо пÑоигноÑиÑоваÑÑ Ð¸Ñ
. ÐÑимиÑе ÑеÑение.\n"
-#: ardour_ui.cc:4538
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "ÐÑоигноÑиÑоваÑÑ"
-#: ardour_ui.cc:4539
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "ÐоÑÑÑановиÑÑ Ð´Ð°Ð½Ð½Ñе"
-#: ardour_ui.cc:4559
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "ÐеÑовпадение ÑаÑÑÐ¾Ñ ÑÑмплиÑованиÑ"
-#: ardour_ui.cc:4560
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1704,15 +1853,28 @@ msgstr ""
"ÐÑли Ð²Ñ Ð·Ð°Ð³ÑÑзиÑе ÑÑÑ ÑеÑÑиÑ, звÑковÑе даннÑе могÑÑ Ð±ÑÑÑ\n"
"воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ñ Ñ Ð½ÐµÐºÐ¾ÑÑекÑной ÑаÑÑоÑой ÑÑмплиÑованиÑ.\n"
-#: ardour_ui.cc:4569
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "Ðе загÑÑжаÑÑ ÑеÑÑиÑ"
-#: ardour_ui.cc:4570
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "ÐÑе Ñавно загÑÑзиÑÑ"
-#: ardour_ui.cc:4862
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"ÐÑа ÑеÑÑÐ¸Ñ Ð±Ñла Ñоздана Ñ ÑаÑÑоÑой диÑкÑеÑизаÑии %1 ÐÑ, но\n"
+"%2 в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑабоÑÐ°ÐµÑ Ð½Ð° %3 ÐÑ.\n"
+"ÐвÑк бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñан и воÑпÑоизведен c непÑавилÑной ÑаÑÑоÑой диÑкÑеÑизаÑии.\n"
+"ÐаÑÑÑойÑе звÑковой движок ÑеÑез «ÐÐµÐ½Ñ > Ðкно > ÐаÑÑÑойка ÐÑдио/MIDI»."
+
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1724,7 +1886,7 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
"%4ÐÑа ÑеÑÑÐ¸Ñ Ð¾Ñ Ð±Ð¾Ð»ÐµÐµ ÑÑаÑой веÑÑии %3%5\n"
"\n"
@@ -1736,84 +1898,76 @@ msgstr ""
"\n"
"%6%2%7\n"
"\n"
-"ÐÑнÑне, иÑполÑзÑйÑе 2-Ñ
веÑÑии Ñо ÑÑаÑÑми ÑеÑÑиÑми %3"
+"С ÑÑого моменÑа оÑкÑÑвайÑе аÑÑ
ивнÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÑолÑко в более ÑанниÑ
веÑÑиÑÑ
%3."
-#: ardour_ui.cc:4979
+#: ardour_ui.cc:5331
msgid "This is a free/demo copy of %1. It has just switched to silent mode."
msgstr ""
"ÐемонÑÑÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ %1 ÑолÑко ÑÑо пеÑеклÑÑилаÑÑ Ð² беззвÑÑнÑй Ñежим."
-#: ardour_ui.cc:4985
+#: ardour_ui.cc:5337
msgid "%1 is now silent"
msgstr "%1 пеÑеклÑÑилÑÑ Ð² беззвÑÑнÑй Ñежим"
-#: ardour_ui.cc:4987
+#: ardour_ui.cc:5339
msgid ""
"Please consider paying for a copy of %1 - you can pay whatever you want."
msgstr ""
"Ðозможно, Ð²Ñ Ñ
оÑиÑе заплаÑиÑÑ Ð·Ð° ÐºÐ¾Ð¿Ð¸Ñ %1 â ÑÐµÐ½Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ñами."
-#: ardour_ui.cc:4988
+#: ardour_ui.cc:5340
msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
msgstr "ÐÑ Ñакже можеÑе вÑбÑаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÑ (Ð¾Ñ US$1 в меÑÑÑ)."
-#: ardour_ui.cc:4989
+#: ardour_ui.cc:5341
msgid "Pay for a copy (via the web)"
msgstr "ÐаплаÑиÑÑ Ð¾Ð´Ð¸Ð½ Ñаз"
-#: ardour_ui.cc:4990
+#: ardour_ui.cc:5342
msgid "Become a subscriber (via the web)"
msgstr "СÑаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиком"
-#: ardour_ui.cc:5009
+#: ardour_ui.cc:5361
msgid "Remain silent"
msgstr "ÐÑÑавиÑÑ Ð±ÐµÐ·Ð·Ð²ÑÑнÑм"
-#: ardour_ui.cc:5011
+#: ardour_ui.cc:5363
msgid "Give me more time"
msgstr "ÐайÑе еÑÑ Ð¿Ð¾ÑабоÑаÑÑ"
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "ÐнÑеÑÑейÑ: не ÑдалоÑÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ ÑедакÑоÑ"
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "ÐнÑеÑÑейÑ: не ÑдалоÑÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ Ð¼Ð¸ÐºÑеÑ"
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "ÐнÑеÑÑейÑ: не ÑдалоÑÑ Ð½Ð°ÑÑÑоиÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов"
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr "ÐлобалÑнÑе клавиаÑÑÑнÑе комбинаÑии оÑÑÑÑÑÑвÑÑÑ"
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "ÐоÑпÑоизвеÑÑи Ð¾Ñ ÑказаÑелÑ"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "СÑоп"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "ÐеÑеклÑÑиÑÑ Ð³Ð¾ÑовноÑÑÑ Ðº запиÑи"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "ÐоÑпÑоизвеÑÑи вÑделение"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "РнаÑало ÑеÑÑии"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "Ð ÐºÐ¾Ð½ÐµÑ ÑеÑÑии"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "ÐоÑпÑоизвеÑÑи вÑделение в пеÑле"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
@@ -1821,23 +1975,23 @@ msgstr ""
"MIDI паника\n"
"ÐÑпÑавлено ÑообÑение off и ÑбÑоÑа ÑообÑений конÑÑолеÑа на вÑеÑ
MIDI каналаÑ
"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "ÐеÑнÑÑÑÑÑ Ðº ÑоÑке наÑала воÑпÑоизведениÑ"
-#: ardour_ui2.cc:137
+#: ardour_ui2.cc:88
msgid "Playhead follows range selections and edits"
msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "ÐÑдÑÑе ÑазÑÐ¼Ð½Ñ Ð½Ð°ÑÑÑÑ Ð²Ñ
одного мониÑоÑинга"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "ÐклÑÑиÑÑ Ð¸Ð»Ð¸ вÑклÑÑиÑÑ Ð¼ÐµÑÑоном"
-#: ardour_ui2.cc:140 monitor_section.cc:127
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1845,17 +1999,19 @@ msgstr ""
"ÐклÑÑено, еÑли какие-Ñо доÑожки ÑолиÑÑÑÑ.\n"
"ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ ÑнÑÑÑ ÑолиÑование везде."
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
+"Ðогда акÑивно, вÑполнÑеÑÑÑ Ð¿ÑоÑлÑÑивание.\n"
+"ÐажмиÑе Ð´Ð»Ñ Ð¾ÑÑановки пÑоÑлÑÑиваниÑ."
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr "ÐклÑÑена, когда еÑÑÑ Ð¿ÐµÑÐ»Ñ Ð¾Ñклика (feedback loop)"
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1868,7 +2024,7 @@ msgstr ""
"ÐÑÑмой ввод: <tt>Esc</tt>: оÑмена; <tt>Enter</tt>: подÑвеÑждение; поÑÑÑÐ¸ÐºÑ "
"'+' или '-' Ð²Ð²Ð¾Ð´Ð¸Ñ ÑазниÑÑ Ð²Ð¾ вÑемени.\n"
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1881,488 +2037,552 @@ msgstr ""
"ÐÑÑмой ввод: <tt>Esc</tt>: оÑмена; <tt>Enter</tt>: подÑвеÑждение; поÑÑÑÐ¸ÐºÑ "
"'+' или '-' Ð²Ð²Ð¾Ð´Ð¸Ñ ÑазниÑÑ Ð²Ð¾ вÑемени.\n"
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr "СбÑоÑиÑÑ Ð²Ñе пиковÑе знаÑениÑ"
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr "ÐоказаÑÑ Ð¶ÑÑнал оÑибок и пÑедÑпÑеждений"
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr "[ÐШÐÐÐÐ]: "
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr "[ÐÐ ÐÐУÐÐ ÐÐÐÐÐÐÐ]:"
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr "[СÐÐ ÐÐÐÐ]:"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:430
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "ÐвÑовозвÑаÑ"
-#: ardour_ui2.cc:257 ardour_ui_ed.cc:433
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "СледоваÑÑ Ð¿Ñавкам"
-#: ardour_ui2.cc:704 rc_option_editor.cc:2895
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr "ÐнÑеÑÑейÑ"
-#: ardour_ui2.cc:721 rc_option_editor.cc:1734 rc_option_editor.cc:1752
-#: rc_option_editor.cc:1755 rc_option_editor.cc:1757 rc_option_editor.cc:1759
-#: rc_option_editor.cc:1767 rc_option_editor.cc:1769 rc_option_editor.cc:1777
-#: rc_option_editor.cc:1785 rc_option_editor.cc:1792 rc_option_editor.cc:1801
-#: rc_option_editor.cc:1803 rc_option_editor.cc:1805 rc_option_editor.cc:1813
-#: rc_option_editor.cc:1815 rc_option_editor.cc:1824
-#: session_option_editor.cc:342 session_option_editor.cc:344
-#: session_option_editor.cc:365 session_option_editor.cc:367
-#: session_option_editor.cc:369 session_option_editor.cc:376
-#: session_option_editor.cc:383 session_option_editor.cc:387
-msgid "Misc"
-msgstr "ÐÑоÑее"
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "ÐÑоÑее/ÐеÑÑоном"
-#: ardour_ui_dependents.cc:77
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "ÐаÑÑÑойка ÑедакÑоÑа"
-#: ardour_ui_dependents.cc:79
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "ÐаÑÑÑойка микÑеÑа"
-#: ardour_ui_dependents.cc:85
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "ÐовÑоÑÐ½Ð°Ñ Ð·Ð°Ð³ÑÑзка иÑÑоÑии ÑеÑÑий"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "ÐнÑеÑÑейÑ: не ÑдалоÑÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ ÑедакÑоÑ"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "ÐнÑеÑÑейÑ: не ÑдалоÑÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ Ð¼Ð¸ÐºÑеÑ"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "ÐнÑеÑÑейÑ: не ÑдалоÑÑ Ð½Ð°ÑÑÑоиÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "ÐаÑамеÑÑÑ"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "ÐикÑеÑ"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "РедакÑоÑ"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr "Ðе закÑÑваÑÑ"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "ÐÑоÑÑо закÑÑÑÑ"
-#: ardour_ui_dialogs.cc:253
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "СоÑ
ÑаниÑÑ Ð¸ закÑÑÑÑ"
-#: ardour_ui_dialogs.cc:363
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "ÐкÑан недоÑÑаÑоÑно вÑÑок, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð¾ÐºÐ½Ð¾ микÑеÑа"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr ""
-#: ardour_ui_ed.cc:103
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "СеÑÑиÑ"
-#: ardour_ui_ed.cc:106 editor_actions.cc:139 editor_regions.cc:119
-#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "СинÑ
ÑонизаÑиÑ"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "ÐаÑамеÑÑÑ"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Ðкна"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "ÐÑкÑепиÑÑ"
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "СпÑавка"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "ÐÑоÑие дейÑÑвиÑ"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "ФоÑÐ¼Ð°Ñ Ð·Ð²ÑковÑÑ
Ñайлов"
-#: ardour_ui_ed.cc:112
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Тип Ñайла"
-#: ardour_ui_ed.cc:113 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "ФоÑÐ¼Ð°Ñ ÑÑмпла"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:2705 rc_option_editor.cc:2717
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "УÑÑÑойÑÑва ÑпÑавлениÑ"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2375 rc_option_editor.cc:2723
-#: rc_option_editor.cc:2725 rc_option_editor.cc:2735 rc_option_editor.cc:2742
-#: rc_option_editor.cc:2750 rc_option_editor.cc:2762 rc_option_editor.cc:2767
-#: rc_option_editor.cc:2769 rc_option_editor.cc:2774 rc_option_editor.cc:2781
-#: rc_option_editor.cc:2786 rc_option_editor.cc:2795 rc_option_editor.cc:2799
-#: rc_option_editor.cc:2808 rc_option_editor.cc:2816 rc_option_editor.cc:2820
-#: rc_option_editor.cc:2825 rc_option_editor.cc:2832 rc_option_editor.cc:2833
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
msgid "Plugins"
msgstr "ÐлагинÑ"
-#: ardour_ui_ed.cc:116 rc_option_editor.cc:2969
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
msgid "Metering"
msgstr "ÐндикаÑоÑÑ"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "ЧаÑÑоÑа Ñпада"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "ÐÑÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑжки"
-#: ardour_ui_ed.cc:119
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "ÐбÑабоÑка оÑклонений"
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1694
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "СоздаÑÑ..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "ÐÑкÑÑÑÑ..."
-#: ardour_ui_ed.cc:126
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Ðедавние ÑеÑÑии..."
-#: ardour_ui_ed.cc:127 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "ÐакÑÑÑÑ"
-#: ardour_ui_ed.cc:130
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "ÐобавиÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð¸Ð»Ð¸ ÑинÑ..."
-#: ardour_ui_ed.cc:135
+#: ardour_ui_ed.cc:163
msgid "Duplicate Tracks/Busses..."
msgstr "СоздаÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ доÑожек и Ñин..."
-#: ardour_ui_ed.cc:141
+#: ardour_ui_ed.cc:169
msgid "Cancel Solo"
-msgstr ""
+msgstr "ÐÑмениÑÑ Ñоло"
-#: ardour_ui_ed.cc:146
-msgid "Open Video"
-msgstr "ÐобавиÑÑ Ð²Ð¸Ð´ÐµÐ¾"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "СкÑипÑÑ"
-#: ardour_ui_ed.cc:149
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "ÐобавиÑÑ ÑкÑÐ¸Ð¿Ñ Ð½Ð° Lua..."
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "УдалиÑÑ ÑкÑÐ¸Ð¿Ñ Lua"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "ÐÑкÑÑÑÑ Ð²Ð¸Ð´ÐµÐ¾..."
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr "УдалиÑÑ Ð²Ð¸Ð´ÐµÐ¾"
-#: ardour_ui_ed.cc:152
-msgid "Export to Video File"
-msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð² видеоÑайл"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð²Ð¸Ð´ÐµÐ¾Ñайл..."
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:194
msgid "Snapshot (& keep working on current version) ..."
msgstr "СделаÑÑ Ñнимок и ÑабоÑаÑÑ Ñ ÑекÑÑей веÑÑией..."
-#: ardour_ui_ed.cc:160
+#: ardour_ui_ed.cc:197
msgid "Snapshot (& switch to new version) ..."
msgstr "СделаÑÑ Ñнимок и пеÑейÑи к новой веÑÑии..."
-#: ardour_ui_ed.cc:164
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "СоÑ
ÑаниÑÑ ÐºÐ°Ðº..."
-#: ardour_ui_ed.cc:168 editor_actions.cc:1790 editor_markers.cc:903
-#: editor_snapshots.cc:136 mixer_strip.cc:1578 route_time_axis.cc:1690
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
msgid "Rename..."
msgstr "ÐеÑеименоваÑÑ..."
-#: ardour_ui_ed.cc:172
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "СоÑ
ÑаниÑÑ Ñаблон..."
-#: ardour_ui_ed.cc:175
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "ÐеÑаданнÑе"
-#: ardour_ui_ed.cc:178
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "ÐзмениÑÑ Ð¼ÐµÑаданнÑе..."
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "ÐмпоÑÑиÑоваÑÑ Ð¼ÐµÑаданнÑе..."
-#: ardour_ui_ed.cc:184
+#: ardour_ui_ed.cc:226
msgid "Export to Audio File(s)..."
msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð² звÑковÑе ÑайлÑ..."
-#: ardour_ui_ed.cc:187
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "ÐаждÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð² Ñвой Ñайл..."
-#: ardour_ui_ed.cc:190 editor_export_audio.cc:66 export_channel_selector.cc:190
-#: export_channel_selector.cc:576 export_dialog.cc:129
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:136
#: export_video_dialog.cc:80
msgid "Export"
msgstr "ÐкÑпоÑÑиÑоваÑÑ"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "ÐÑиÑÑиÑÑ Ð½ÐµÐ¸ÑполÑзÑемÑе иÑÑоÑники..."
-#: ardour_ui_ed.cc:197
+#: ardour_ui_ed.cc:239
msgid "Reset Peak Files"
msgstr ""
-#: ardour_ui_ed.cc:201
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "ÐÑиÑÑиÑÑ ÐºÐ¾ÑзинÑ"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "ÐÑÑ
од"
-#: ardour_ui_ed.cc:209 automation_time_axis.cc:543 editor_actions.cc:661
-#: editor_markers.cc:902 location_ui.cc:59 plugin_selector.cc:97
-#: route_time_axis.cc:866
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
msgid "Hide"
msgstr "СкÑÑÑÑ"
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "ÐÑикÑепиÑÑ"
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "ÐзмениÑÑ"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "ÐÑедÑдÑÑÐ°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "СледÑÑÑÐ°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑедакÑоÑом и микÑеÑом"
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "РедакÑÐ¾Ñ Ð½Ð° полнÑй ÑкÑан"
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr "РазвеÑнÑÑÑ Ð¾ÐºÐ½Ð¾ микÑеÑа"
-#: ardour_ui_ed.cc:215
-msgid "Show Toolbars"
-msgstr "ÐоказÑваÑÑ Ð¿Ð°Ð½ÐµÐ»Ð¸"
-
-#: ardour_ui_ed.cc:218
+#: ardour_ui_ed.cc:298
msgid "Toggle Mixer List"
-msgstr ""
+msgstr "ÐоказÑваÑÑ Ð±Ð¾ÐºÐ¾Ð²ÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð¼Ð¸ÐºÑеÑа"
-#: ardour_ui_ed.cc:221
+#: ardour_ui_ed.cc:301
msgid "Toggle Monitor Section Visibility"
msgstr "ÐеÑеклÑÑиÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ ÑекÑии мониÑоÑинга"
-#: ardour_ui_ed.cc:225
+#: ardour_ui_ed.cc:305
msgid "Show more UI preferences"
msgstr "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе пÑедÑÑÑановок UI"
-#: ardour_ui_ed.cc:227 mixer_ui.cc:2112 mixer_ui.cc:2118
-msgid "Window|Mixer"
-msgstr "ÐикÑеÑ"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "СкÑипÑÑ"
-#: ardour_ui_ed.cc:228
-msgid "Toggle Editor+Mixer"
-msgstr "РедакÑÐ¾Ñ Ð¸Ð»Ð¸ микÑÐµÑ Ð½Ð° пеÑеднем плане"
-
-#: ardour_ui_ed.cc:229 meterbridge.cc:216 meterbridge.cc:222
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr "ÐÐ°Ð½ÐµÐ»Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов"
-#: ardour_ui_ed.cc:231
-msgid "Reattach All Tearoffs"
-msgstr "Ðаново пÑикÑепиÑÑ ÑазÑÑвÑ"
-
-#: ardour_ui_ed.cc:233 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "ÐÑÑнал MIDI-ÑобÑÑий"
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "ÐообÑаÑÑÑÑ"
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "СпÑавка"
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:317
msgid "Manual|Reference"
-msgstr ""
+msgstr "СпÑавка"
-#: ardour_ui_ed.cc:239
+#: ardour_ui_ed.cc:318
msgid "Report a Bug"
msgstr "СообÑиÑÑ Ð¾Ð± оÑибке"
-#: ardour_ui_ed.cc:240
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr "ШпаÑгалка"
-#: ardour_ui_ed.cc:241
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr "Ð¡Ð°Ð¹Ñ Ardour"
-#: ardour_ui_ed.cc:242
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr "РазÑабоÑка Ardour"
-#: ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr "ФоÑÑÐ¼Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей"
-#: ardour_ui_ed.cc:244
+#: ardour_ui_ed.cc:323
msgid "How to Report a Bug"
msgstr "Ðак ÑообÑиÑÑ Ð¾Ð± оÑибке"
-#: ardour_ui_ed.cc:246 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:420
msgid "Save"
msgstr "СоÑ
ÑаниÑÑ"
-#: ardour_ui_ed.cc:254 rc_option_editor.cc:1835 rc_option_editor.cc:1846
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1868 rc_option_editor.cc:1877
-#: rc_option_editor.cc:1890 rc_option_editor.cc:1903 rc_option_editor.cc:1912
-#: rc_option_editor.cc:1922 rc_option_editor.cc:1939 rc_option_editor.cc:1941
-#: rc_option_editor.cc:1950 rc_option_editor.cc:1966 rc_option_editor.cc:1987
-#: rc_option_editor.cc:2005 rc_option_editor.cc:2007 rc_option_editor.cc:2024
-#: rc_option_editor.cc:2027 rc_option_editor.cc:2029 rc_option_editor.cc:2046
-#: rc_option_editor.cc:2057
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "ТÑанÑпоÑÑ"
-#: ardour_ui_ed.cc:260 engine_dialog.cc:88
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "СÑоп"
-#: ardour_ui_ed.cc:263
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "ÐеÑевеÑнÑÑÑ"
-#: ardour_ui_ed.cc:267 ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "СÑаÑÑ/СÑоп"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "СÑаÑÑ/ÐÑодолжиÑÑ/СÑоп"
-#: ardour_ui_ed.cc:276
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "ÐÑÑановиÑÑÑÑ Ð¸ забÑÑÑ Ð·Ð°Ñ
ваÑ"
-#: ardour_ui_ed.cc:286
+#: ardour_ui_ed.cc:365
msgid "Transition to Roll"
-msgstr ""
+msgstr "ÐеÑейÑи к пÑокÑÑÑке"
-#: ardour_ui_ed.cc:290
+#: ardour_ui_ed.cc:369
msgid "Transition to Reverse"
-msgstr ""
+msgstr "ÐеÑейÑи к ÑевеÑÑÑ"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "ÐоÑпÑоизвеÑÑи пеÑлÑ"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr "ÐоÑпÑоизводиÑÑ Ð²Ñделение"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "ÐгÑаÑÑ Ð²ÑбÑаннÑй w/Preroll"
-#: ardour_ui_ed.cc:304
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "РазÑеÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ"
-#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:311
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "ÐаÑаÑÑ Ð·Ð°Ð¿Ð¸ÑÑ"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "ÐеÑемоÑаÑÑ Ð½Ð°Ð·Ð°Ð´"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "ÐеÑемоÑаÑÑ Ð½Ð°Ð·Ð°Ð´ (медленно)"
-#: ardour_ui_ed.cc:321
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "ÐеÑемоÑаÑÑ Ð½Ð°Ð·Ð°Ð´ (бÑÑÑÑо)"
-#: ardour_ui_ed.cc:324
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "ÐеÑемоÑаÑÑ Ð²Ð¿ÐµÑÑд"
-#: ardour_ui_ed.cc:327
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "ÐеÑемоÑаÑÑ Ð²Ð¿ÐµÑÑд (медленно)"
-#: ardour_ui_ed.cc:330
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "ÐеÑемоÑаÑÑ Ð²Ð¿ÐµÑÑд (бÑÑÑÑо)"
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "РнÑлевой оÑмеÑке"
-#: ardour_ui_ed.cc:336 ardour_ui_ed.cc:339
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "РнаÑалÑ"
-#: ardour_ui_ed.cc:342
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "РконеÑ"
-#: ardour_ui_ed.cc:345
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr "Ð ÑекÑÑÐµÐ¼Ñ Ð²Ñемени"
-#: ardour_ui_ed.cc:350 ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr "ÐеÑÑÑиÑнÑй ÑазделиÑÐµÐ»Ñ Ð½Ð° ÑиÑÑовой клавиаÑÑÑе"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr "Numpad 0"
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr "Numpad 1"
-#: ardour_ui_ed.cc:362
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr "Numpad 2"
-#: ardour_ui_ed.cc:365
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr "Numpad 3"
-#: ardour_ui_ed.cc:368
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr "Numpad 3"
-#: ardour_ui_ed.cc:371
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr "Numpad 5"
-#: ardour_ui_ed.cc:374
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr "Numpad 6"
-#: ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr "Numpad 7"
-#: ardour_ui_ed.cc:380
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr "Numpad 8"
-#: ardour_ui_ed.cc:383
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr "Numpad 9"
-#: ardour_ui_ed.cc:387
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "ÐзмениÑÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÑÑнÑÑ"
-#: ardour_ui_ed.cc:391 ardour_ui_ed.cc:400 audio_clock.cc:2116 editor.cc:261
-#: editor_actions.cc:585 editor_actions.cc:594 export_timespan_selector.cc:85
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2370,137 +2590,137 @@ msgstr "ÐзмениÑÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÑÑнÑÑ"
msgid "Timecode"
msgstr "Тайм-код"
-#: ardour_ui_ed.cc:393 ardour_ui_ed.cc:402 editor_actions.cc:583
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "ТакÑÑ Ð¸ доли"
-#: ardour_ui_ed.cc:395 ardour_ui_ed.cc:404
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "ÐинÑÑÑ Ð¸ ÑекÑндÑ"
-#: ardour_ui_ed.cc:397 ardour_ui_ed.cc:406 audio_clock.cc:2120 editor.cc:262
-#: editor_actions.cc:584
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "СÑмплÑ"
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "ÐаÑало вÑезки"
-#: ardour_ui_ed.cc:410 mixer_strip.cc:1901 mixer_strip.cc:2089 route_ui.cc:175
-#: time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:191
+#: time_info_box.cc:110
msgid "In"
msgstr "ÐÑ
од"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "ÐÐ¾Ð½ÐµÑ Ð²Ñезки"
-#: ardour_ui_ed.cc:414 mixer_strip.cc:1913 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
msgid "Out"
msgstr "ÐÑÑ
од"
-#: ardour_ui_ed.cc:417
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "ÐÑезка"
-#: ardour_ui_ed.cc:418
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "ÐÑ
/ÐÑÑ
"
-#: ardour_ui_ed.cc:421 rc_option_editor.cc:1801
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "ÐеÑÑоном"
-#: ardour_ui_ed.cc:424
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "ÐвÑовÑ
од"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "ÐвÑовоÑпÑ."
-#: ardour_ui_ed.cc:438
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "СинÑ
ÑонизиÑоваÑÑ Ð½Ð°Ñало Ñ Ð²Ð¸Ð´ÐµÐ¾"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "ÐедÑÑий вÑемени"
-#: ardour_ui_ed.cc:442
+#: ardour_ui_ed.cc:521
msgid "Use External Positional Sync Source"
-msgstr ""
+msgstr "ÐÑполÑзоваÑÑ Ð²Ð½ÐµÑний иÑÑоÑник позиÑионной ÑинÑ
ÑонизаÑии"
-#: ardour_ui_ed.cc:447
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr "ÐеÑеклÑÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑваемоÑÑÑ Ð´Ð¾Ñожки %1"
-#: ardour_ui_ed.cc:454
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "ÐÑоÑенÑÑ"
-#: ardour_ui_ed.cc:455 shuttle_control.cc:188
+#: ardour_ui_ed.cc:534 shuttle_control.cc:206
msgid "Semitones"
msgstr "ÐолÑÑона"
-#: ardour_ui_ed.cc:459
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "ÐеÑедаваÑÑ MTC"
-#: ardour_ui_ed.cc:461
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "ÐеÑедаваÑÑ MMC"
-#: ardour_ui_ed.cc:463
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "ÐÑполÑзоваÑÑ MMC"
-#: ardour_ui_ed.cc:465 rc_option_editor.cc:2594
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "ÐÑпÑавлÑÑÑ MIDI Clock"
-#: ardour_ui_ed.cc:467
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr "ÐÑпÑавлÑÑÑ MIDI Feedback"
-#: ardour_ui_ed.cc:473
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Ðаника"
-#: ardour_ui_ed.cc:567
+#: ardour_ui_ed.cc:618
msgid "Wall Clock"
msgstr "ТекÑÑее вÑемÑ"
-#: ardour_ui_ed.cc:569
+#: ardour_ui_ed.cc:620
msgid "Disk Space"
msgstr "ÐиÑк. пÑоÑÑÑанÑÑво"
-#: ardour_ui_ed.cc:570
+#: ardour_ui_ed.cc:621
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:571
+#: ardour_ui_ed.cc:622
msgid "X-run"
msgstr ""
-#: ardour_ui_ed.cc:572
+#: ardour_ui_ed.cc:623
msgid "Active Peak-file Work"
msgstr ""
-#: ardour_ui_ed.cc:573
+#: ardour_ui_ed.cc:624
msgid "Buffers"
msgstr "ÐÑÑеÑÑ"
-#: ardour_ui_ed.cc:575
+#: ardour_ui_ed.cc:626
msgid "Timecode Format"
msgstr "ФоÑÐ¼Ð°Ñ Ñайм-кода"
-#: ardour_ui_ed.cc:576
+#: ardour_ui_ed.cc:627
msgid "File Format"
msgstr "ФоÑÐ¼Ð°Ñ Ñайлов"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2508,133 +2728,137 @@ msgstr ""
"Ðе возможно иÑполÑзоваÑÑ JACK, как ÑинÑ
ÑонизаÑÐ¾Ñ Ð¸ÑÑоÑника,\n"
"когда ÑÑÑановки ÑаÑÑÑжки ввеÑÑ
/вниз не ÑÐ°Ð²Ð½Ñ Ð½ÑлÑ."
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "ÐнÑÑÑ. ÑинÑ
ÑонизаÑиÑ"
-#: ardour_ui_options.cc:509
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "ÐклÑÑиÑÑ Ð¸Ð»Ð¸ вÑклÑÑиÑÑ Ð²Ð½ÐµÑнÑÑ ÑинÑ
ÑонизаÑÐ¸Ñ Ð¿Ð¾Ð·Ð¸ÑиониÑованиÑ"
-#: ardour_ui_options.cc:511
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
"СинÑ
ÑонизаÑÐ¸Ñ Ñ JACK не возможна: ÑÑÑановлена ÑаÑÑÑжка видео ввеÑÑ
/вниз"
-#: audio_clock.cc:1051 audio_clock.cc:1070
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "--в ожидании--"
-#: audio_clock.cc:1122
+#: audio_clock.cc:1128
msgid "SR"
msgstr "SR"
-#: audio_clock.cc:1128 audio_clock.cc:1132
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "ÐодÑÑгивание"
-#: audio_clock.cc:1130
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr "%+.4f%%"
-#: audio_clock.cc:1286 editor.cc:263 editor_actions.cc:140
-#: editor_actions.cc:577
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "Темп"
-#: audio_clock.cc:1290 editor.cc:264 editor_actions.cc:578
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "РазмеÑ"
-#: audio_clock.cc:1871 audio_streamview.cc:116 editor_actions.cc:1108
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:469
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr "ÐÑибка в пÑогÑамме: %1"
-#: audio_clock.cc:2004 audio_clock.cc:2032
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "ÐÑибка в пÑогÑамме: %1 %2"
-#: audio_clock.cc:2118 editor.cc:260 export_timespan_selector.cc:95
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
msgid "Bars:Beats"
msgstr "ТакÑÑ : Ðоли"
-#: audio_clock.cc:2119 export_timespan_selector.cc:90
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
msgid "Minutes:Seconds"
-msgstr "ÐинÑÑÑ : СекÑндÑ"
+msgstr "ÐинÑÑÑ:СекÑндÑ"
-#: audio_clock.cc:2124
+#: audio_clock.cc:2129
msgid "Set from Playhead"
-msgstr ""
+msgstr "Ðо ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
-#: audio_clock.cc:2125
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr "ÐеÑейÑи к ÑÑой позиÑии"
-#: audio_clock.cc:2128
+#: audio_clock.cc:2133
msgid "Copy to clipboard"
msgstr "СкопиÑоваÑÑ Ð² бÑÑÐµÑ Ð¾Ð±Ð¼ÐµÐ½Ð°"
-#: audio_region_editor.cc:65 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr "Ðб"
-#: audio_region_editor.cc:68
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "УÑиление облаÑÑи:"
-#: audio_region_editor.cc:78 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
msgid "dBFS"
msgstr "dBFS"
-#: audio_region_editor.cc:81
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "ÐÐ¸ÐºÐ¾Ð²Ð°Ñ Ð°Ð¼Ð¿Ð»Ð¸ÑÑда:"
-#: audio_region_editor.cc:92
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "ÐÑоизводиÑÑÑ Ð²ÑÑиÑление..."
-#: audio_region_view.cc:1371
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "Ðобавление ÑоÑки конÑÑÐ¾Ð»Ñ ÑÑилениÑ"
-#: automation_controller.cc:292 automation_controller.cc:308
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr "ÐÑбÑаÑÑ Ð½Ð¾ÑÑ..."
-#: automation_controller.cc:299
+#: automation_controller.cc:311
msgid "Halve"
msgstr "Ðоловина"
-#: automation_controller.cc:302
+#: automation_controller.cc:314
msgid "Double"
msgstr "Ðвойной"
-#: automation_controller.cc:313
+#: automation_controller.cc:325
msgid "Set to %1 beat"
msgid_plural "Set to %1 beats"
msgstr[0] "СделаÑÑ ÑавнÑм %1 ÑдаÑÑ"
msgstr[1] "СделаÑÑ ÑавнÑм %1 ÑдаÑам"
msgstr[2] "СделаÑÑ ÑавнÑм %1 ÑдаÑам"
-#: automation_line.cc:285 editor_drag.cc:4255
+#: automation_line.cc:292 editor_drag.cc:4387
msgid "automation event move"
msgstr "СмеÑение ÑобÑÑÐ¸Ñ Ð°Ð²ÑомаÑизаÑии"
-#: automation_line.cc:881 region_gain_line.cc:75
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "Удаление конÑÑолÑной ÑоÑки"
-#: automation_line.cc:1006
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr "ÐгноÑиÑование некоÑÑеÑкнÑÑ
ÑоÑек на линии авÑомаÑизаÑии \"%1\""
-#: automation_region_view.cc:193 automation_time_axis.cc:647
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "Ðовое ÑобÑÑие авÑомаÑизаÑии"
@@ -2650,59 +2874,59 @@ msgstr "СоÑÑоÑние авÑомаÑизаÑии"
msgid "hide track"
msgstr "СкÑÑÑÑ Ð´Ð¾ÑожкÑ"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:526
-#: generic_pluginui.cc:820 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:601
+#: generic_pluginui.cc:949 panner_ui.cc:151
msgid "Automation|Manual"
msgstr "ÐÑÑÑнÑÑ"
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1928 editor.cc:2006
-#: editor_actions.cc:123 editor_actions.cc:1939 gain_meter.cc:225
-#: generic_pluginui.cc:102 generic_pluginui.cc:529 generic_pluginui.cc:822
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1617 midi_time_axis.cc:1620
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2034 editor.cc:2112
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:101 generic_pluginui.cc:604 generic_pluginui.cc:951
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "ÐÑоигÑÑвание"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:104
-#: generic_pluginui.cc:532 generic_pluginui.cc:824 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:103
+#: generic_pluginui.cc:607 generic_pluginui.cc:953 panner_ui.cc:157
msgid "Write"
msgstr "ÐапиÑÑ"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:106
-#: generic_pluginui.cc:535 generic_pluginui.cc:826 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:105
+#: generic_pluginui.cc:610 generic_pluginui.cc:955 panner_ui.cc:160
msgid "Touch"
msgstr "ÐаÑание"
-#: automation_time_axis.cc:404 generic_pluginui.cc:538 meter_patterns.cc:118
+#: automation_time_axis.cc:406 generic_pluginui.cc:613 meter_patterns.cc:118
msgid "???"
msgstr "???"
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "ÐÑиÑÑиÑÑ Ð°Ð²ÑомаÑизаÑиÑ"
-#: automation_time_axis.cc:545 rc_option_editor.cc:2770
-#: rc_option_editor.cc:2775 rc_option_editor.cc:2821 rc_option_editor.cc:2826
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
msgid "Clear"
msgstr "ÐÑиÑÑиÑÑ"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "СоÑÑоÑние"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr "ÐиÑкÑеÑнÑй"
-#: automation_time_axis.cc:598 export_format_dialog.cc:489
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "ÐинейнаÑ"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:207
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:225
msgid "Mode"
msgstr "Режим"
@@ -2718,35 +2942,38 @@ msgstr "Ðзменение пакеÑа"
msgid "Direction:"
msgstr "ÐапÑавление:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:949
-#: mixer_strip.cc:168 mixer_strip.cc:382 mixer_strip.cc:2347
-#: rc_option_editor.cc:2944
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
msgid "Input"
msgstr "ÐÑ
од"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:951 mixer_strip.cc:172 mixer_strip.cc:386
-#: mixer_strip.cc:2350 monitor_section.cc:295 monitor_section.cc:299
-#: rc_option_editor.cc:2948
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
msgid "Output"
msgstr "ÐÑÑ
од"
-#: bundle_manager.cc:265 editor.cc:1970 editor_actions.cc:95
-#: editor_actions.cc:105 rc_option_editor.cc:2782 rc_option_editor.cc:2796
+#: bundle_manager.cc:265 editor.cc:2076 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
msgid "Edit"
msgstr "ÐÑавка"
-#: bundle_manager.cc:266 editor.cc:5948 editor.cc:5978 editor_actions.cc:346
-#: editor_actions.cc:347 plugin_ui.cc:420 processor_box.cc:2832
+#: bundle_manager.cc:266 editor.cc:5963 editor.cc:5993 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:421
+#: processor_box.cc:3681 processor_box.cc:3683
msgid "Delete"
msgstr "УдалиÑÑ"
#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
-#: editor_routes.cc:208 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "ÐмÑ"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "СоздаÑÑ"
@@ -2762,6 +2989,38 @@ msgstr "ÐобавиÑÑ ÐºÐ°Ð½Ð°Ð»"
msgid "Rename Channel"
msgstr "ÐеÑеименоваÑÑ ÐºÐ°Ð½Ð°Ð»"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "ÐоÑÑÑановиÑÑ Ð¸ÑÑ
однÑе знаÑениÑ"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Тема ÑвеÑового оÑоÑмлениÑ"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "ÐбÑекÑ"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "ЦвеÑ"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "ÐлеменÑÑ"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "ÐалиÑÑа"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "ÐÑозÑаÑноÑÑÑ"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "ЦвеÑÐ¾Ð²Ð°Ñ Ð¿Ð°Ð»Ð¸ÑÑа"
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr "ÐонÑигÑÑаÑÐ¸Ñ ÑбоÑки"
@@ -2774,6 +3033,19 @@ msgstr "ÐонÑÑолÑÐ½Ð°Ñ ÑоÑка"
msgid "Value"
msgstr "ÐнаÑение"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr "ÐедÑÑие каналÑ"
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+#, fuzzy
+msgid "Unassign All"
+msgstr "Ðе назнаÑен"
+
#: duplicate_routes_dialog.cc:35
msgid "Duplicate Tracks & Busses"
msgstr "СоздаÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ доÑожек и Ñин"
@@ -2835,593 +3107,599 @@ msgstr "ÐÑÑоÑа Ñона"
msgid "Velocity"
msgstr "Сила нажаÑиÑ"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "ÐÑемÑ"
-#: edit_note_dialog.cc:98 editor_regions.cc:118 export_timespan_selector.cc:375
-#: export_timespan_selector.cc:437 location_ui.cc:322 midi_list_editor.cc:115
-#: time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:415
+#: export_timespan_selector.cc:506 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
msgid "Length"
msgstr "ÐлиÑелÑноÑÑÑ"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "ÐÑавка ноÑÑ"
-#: editor.cc:150
+#: editor.cc:160
msgid "CD Frames"
msgstr "ÐÑбоÑки CD"
-#: editor.cc:151
+#: editor.cc:161
msgid "TC Frames"
msgstr "TC кадÑÑ"
-#: editor.cc:152
+#: editor.cc:162
msgid "TC Seconds"
msgstr "TC ÑекÑндÑ"
-#: editor.cc:153
+#: editor.cc:163
msgid "TC Minutes"
msgstr "TC минÑÑÑ"
-#: editor.cc:154
+#: editor.cc:164
msgid "Seconds"
msgstr "СекÑндÑ"
-#: editor.cc:155
+#: editor.cc:165
msgid "Minutes"
msgstr "ÐинÑÑÑ"
-#: editor.cc:156 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "Ðоли/128"
-#: editor.cc:157 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "Ðоли/64"
-#: editor.cc:158 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Ðоли/32"
-#: editor.cc:159
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "Ðоли/28"
-#: editor.cc:160
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "Ðоли/24"
-#: editor.cc:161
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "Ðоли/20"
-#: editor.cc:162 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Ðоли/16"
-#: editor.cc:163
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "Ðоли/14"
-#: editor.cc:164
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "Ðоли/12"
-#: editor.cc:165
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "Ðоли/10"
-#: editor.cc:166 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Ðоли/8"
-#: editor.cc:167
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "Ðоли/7"
-#: editor.cc:168
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "Ðоли/6"
-#: editor.cc:169
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "Ðоли/5"
-#: editor.cc:170 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Ðоли/4"
-#: editor.cc:171 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Ðоли/3"
-#: editor.cc:172 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Ðоли/2"
-#: editor.cc:173 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Ðоли"
-#: editor.cc:174
+#: editor.cc:184
msgid "Bars"
msgstr "ТакÑÑ"
-#: editor.cc:175
+#: editor.cc:185
msgid "Marks"
msgstr "ÐаÑкеÑÑ"
-#: editor.cc:176
+#: editor.cc:186
msgid "Region starts"
msgstr "ÐаÑала облаÑÑей"
-#: editor.cc:177
+#: editor.cc:187
msgid "Region ends"
msgstr "ÐонÑÑ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor.cc:178
+#: editor.cc:188
msgid "Region syncs"
msgstr "СинÑ
Ñ. облаÑÑей"
-#: editor.cc:179
+#: editor.cc:189
msgid "Region bounds"
msgstr "ÐÑаниÑÑ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor.cc:184 editor_actions.cc:526
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "Ðез ÑеÑки"
-#: editor.cc:185 editor_actions.cc:527
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Ðо ÑеÑке"
-#: editor.cc:186 editor_actions.cc:528
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "ÐагниÑ"
-#: editor.cc:191 editor.cc:209 editor_actions.cc:122 editor_actions.cc:509
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "УказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
-#: editor.cc:192 editor_actions.cc:511
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "ÐаÑкеÑ"
-#: editor.cc:193 editor.cc:210 editor_actions.cc:510
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "ÐÑÑÑ"
-#: editor.cc:198 editor_actions.cc:518
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Слайд"
-#: editor.cc:199
+#: editor.cc:209
msgid "Splice"
msgstr "СÑÑковка"
-#: editor.cc:200 editor_actions.cc:517
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr "Ð ÑбÑ"
-#: editor.cc:201 editor_actions.cc:1808 editor_markers.cc:905
-#: editor_rulers.cc:259 location_ui.cc:60
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "Ðлок"
-#: editor.cc:206 mono_panner_editor.cc:44
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Ðлево"
-#: editor.cc:207 mono_panner_editor.cc:49
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "ÐпÑаво"
-#: editor.cc:208
+#: editor.cc:218
msgid "Center"
msgstr "Ðо ÑенÑÑÑ"
-#: editor.cc:211
+#: editor.cc:221
msgid "Edit point"
msgstr "ÐÑÑÑÐ¾Ñ ÑедакÑоÑа"
-#: editor.cc:217
+#: editor.cc:227
msgid "Mushy"
msgstr "ÐÑгкое"
-#: editor.cc:218
+#: editor.cc:228
msgid "Smooth"
msgstr "Сглаживание"
-#: editor.cc:219
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "СбаланÑиÑованнÑй многоÑембÑалÑнÑй микÑ"
-#: editor.cc:220
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "ÐеÑкÑÑÑионное Ñоло без коÑÑекÑии вÑÑоÑÑ Ñона Ñ Ð²ÑделÑÑÑимиÑÑ Ð½Ð¾Ñами"
-#: editor.cc:221
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "ЧиÑÑое моноÑониÑеÑкое инÑÑÑÑменÑалÑное Ñоло"
-#: editor.cc:222
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "ÐеÑкÑÑÑионное Ñоло без коÑÑекÑии вÑÑоÑÑ Ñона"
-#: editor.cc:223
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "РеÑÑмплиÑоваÑÑ, не ÑоÑ
ÑанÑÑ Ð²ÑÑоÑÑ Ñона"
-#: editor.cc:259
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "ÐинÑÑÑ:СекÑндÑ"
-#: editor.cc:265
+#: editor.cc:325
msgid "Location Markers"
msgstr "ÐаÑкеÑÑ Ð¿Ð¾Ð·Ð¸Ñий"
-#: editor.cc:266
+#: editor.cc:326
msgid "Range Markers"
msgstr "ÐаÑкеÑÑ Ð²Ñделений"
-#: editor.cc:267
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "ÐÐ¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð¿ÐµÑелÑ/вÑезок"
-#: editor.cc:268 editor_actions.cc:581
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "ÐаÑкеÑÑ CD"
-#: editor.cc:269
+#: editor.cc:329
msgid "Video Timeline"
msgstr "Ðидеолинейка"
-#: editor.cc:286
+#: editor.cc:386
msgid "mode"
msgstr "Режим"
-#: editor.cc:465 editor_actions.cc:115 editor_actions.cc:580
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "ÐаÑкеÑÑ"
-#: editor.cc:583 rc_option_editor.cc:2393
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "ÐблаÑÑи"
-#: editor.cc:584
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "ÐоÑожки и ÑинÑ"
-#: editor.cc:585
+#: editor.cc:655
msgid "Snapshots"
msgstr "Снимки"
-#: editor.cc:586
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "ÐÑÑÐ¿Ð¿Ñ Ð´Ð¾Ñожек и Ñин"
-#: editor.cc:587
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "ÐблаÑÑи и маÑкеÑÑ"
-#: editor.cc:734 editor.cc:5800 rc_option_editor.cc:2061
-#: rc_option_editor.cc:2075 rc_option_editor.cc:2079 rc_option_editor.cc:2087
-#: rc_option_editor.cc:2095 rc_option_editor.cc:2104 rc_option_editor.cc:2113
-#: rc_option_editor.cc:2121 rc_option_editor.cc:2129 rc_option_editor.cc:2139
-#: rc_option_editor.cc:2141 rc_option_editor.cc:2165 rc_option_editor.cc:2177
-#: rc_option_editor.cc:2188 rc_option_editor.cc:2206 rc_option_editor.cc:2208
-#: rc_option_editor.cc:2211 rc_option_editor.cc:2220 rc_option_editor.cc:2238
-#: rc_option_editor.cc:2250 rc_option_editor.cc:2252
-msgid "Editor"
-msgstr "РедакÑоÑ"
-
-#: editor.cc:1348 editor.cc:4783 editor_actions.cc:135 editor_actions.cc:1884
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "ÐеÑлÑ"
-#: editor.cc:1354 editor.cc:4810 editor_actions.cc:136 time_info_box.cc:68
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "ÐÑезка"
-#: editor.cc:1466 rc_option_editor.cc:2159
+#: editor.cc:1475 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr "Ðинейно (Ð´Ð»Ñ ÑÑ
ожего маÑеÑиала)"
-#: editor.cc:1476 rc_option_editor.cc:2160
+#: editor.cc:1485 rc_option_editor.cc:2300
msgid "Constant power"
msgstr "С поÑÑоÑнной Ñилой"
-#: editor.cc:1485 rc_option_editor.cc:2161
+#: editor.cc:1494 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "СиммеÑÑиÑно"
-#: editor.cc:1495 rc_option_editor.cc:2162
+#: editor.cc:1504 rc_option_editor.cc:2302
msgid "Slow"
msgstr "Ðедленно"
-#: editor.cc:1504 rc_option_editor.cc:2163 sfdb_ui.cc:1767 sfdb_ui.cc:1878
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "ÐÑÑÑÑо"
-#: editor.cc:1526 editor.cc:1551
+#: editor.cc:1535 editor.cc:1560
msgid "Deactivate"
msgstr "ÐеакÑивиÑоваÑÑ"
-#: editor.cc:1528 editor.cc:1553
+#: editor.cc:1537 editor.cc:1562
msgid "Activate"
msgstr "ÐкÑивиÑоваÑÑ"
-#: editor.cc:1654 editor.cc:1662 editor_ops.cc:3855
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
msgid "Freeze"
msgstr "ÐамоÑозиÑÑ"
-#: editor.cc:1658
+#: editor.cc:1667
msgid "Unfreeze"
msgstr "РазмоÑозиÑÑ"
-#: editor.cc:1797
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr "Ðнализ гÑомкоÑÑи облаÑÑи"
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr "Ðнализ звÑка"
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr "Ðнализ гÑомкоÑÑи вÑделениÑ"
+
+#: editor.cc:1902
msgid "Selected Regions"
msgstr "ÐÑделеннÑе облаÑÑи"
-#: editor.cc:1841 editor_markers.cc:940
+#: editor.cc:1946 editor_markers.cc:945
msgid "Play Range"
msgstr "ÐоÑпÑоизвеÑÑи вÑделение"
-#: editor.cc:1842 editor_markers.cc:943
+#: editor.cc:1947 editor_markers.cc:948
msgid "Loop Range"
msgstr "СоздаÑÑ Ð¿ÐµÑÐ»Ñ Ð¸Ð· вÑделениÑ"
-#: editor.cc:1845 editor_markers.cc:950
+#: editor.cc:1950 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "ÐаÑÑÑабиÑоваÑÑ Ð² вÑделение"
-#: editor.cc:1854 editor_actions.cc:383
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr "Ðнализ гÑомкоÑÑи"
+
+#: editor.cc:1960 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "ÐеÑемеÑÑиÑÑ Ð½Ð°Ñало вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ðº гÑаниÑе пÑедÑдÑÑей облаÑÑи"
-#: editor.cc:1861 editor_actions.cc:390
+#: editor.cc:1967 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "ÐеÑемеÑÑиÑÑ Ð½Ð°Ñало вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ðº гÑаниÑе ÑледÑÑÑей облаÑÑи"
-#: editor.cc:1868 editor_actions.cc:397
+#: editor.cc:1974 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "ÐеÑемеÑÑиÑÑ ÐºÐ¾Ð½ÐµÑ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ðº гÑаниÑе пÑедÑдÑÑей облаÑÑи"
-#: editor.cc:1875 editor_actions.cc:404
+#: editor.cc:1981 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "ÐеÑемеÑÑиÑÑ ÐºÐ¾Ð½ÐµÑ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ðº гÑаниÑе ÑледÑÑÑей облаÑÑи"
-#: editor.cc:1881 editor_actions.cc:134 editor_actions.cc:333
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "РазделиÑÑ"
-#: editor.cc:1882
+#: editor.cc:1988
msgid "Convert to Region in Region List"
msgstr "ÐÑеобÑазоваÑÑ Ð² облаÑÑÑ Ð² ÑпиÑке облаÑÑей"
-#: editor.cc:1885 editor_markers.cc:970
+#: editor.cc:1991 editor_markers.cc:973
msgid "Select All in Range"
msgstr "ÐÑбÑаÑÑ Ð²ÑÑ Ð² вÑделении"
-#: editor.cc:1888 editor_actions.cc:305
+#: editor.cc:1994 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr "СоздаÑÑ Ð¿ÐµÑÐ»Ñ Ð¸Ð· вÑделениÑ"
-#: editor.cc:1889 editor_actions.cc:306
+#: editor.cc:1995 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr "СоздаÑÑ Ð²ÑÐµÐ·ÐºÑ Ð¸Ð· вÑделениÑ"
-#: editor.cc:1890 editor_actions.cc:307
+#: editor.cc:1996 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr "ÐадаÑÑ Ð½Ð°Ñало и ÐºÐ¾Ð½ÐµÑ Ð¿Ð¾ вÑделениÑ"
-#: editor.cc:1893
+#: editor.cc:1999
msgid "Add Range Markers"
msgstr "ÐобавиÑÑ Ð¼Ð°ÑкеÑÑ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor.cc:1896
+#: editor.cc:2002
msgid "Crop Region to Range"
msgstr "ÐбÑезаÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð¾ вÑделениÑ"
-#: editor.cc:1897 editor_actions.cc:319
+#: editor.cc:2003 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "ÐÑодÑблиÑоваÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
-#: editor.cc:1900
+#: editor.cc:2006
msgid "Consolidate Range"
msgstr "ÐбÑединиÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
-#: editor.cc:1901
+#: editor.cc:2007
msgid "Consolidate Range with Processing"
-msgstr ""
+msgstr "0бÑединиÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ñ Ð¿Ð¾ÑÑобÑабоÑкой"
-#: editor.cc:1902
+#: editor.cc:2008
msgid "Bounce Range to Region List"
msgstr "СвеÑÑи диапазон в ÑпиÑок облаÑÑей"
-#: editor.cc:1903
+#: editor.cc:2009
msgid "Bounce Range to Region List with Processing"
msgstr ""
-#: editor.cc:1904 editor_markers.cc:953
+#: editor.cc:2010 editor_markers.cc:956
msgid "Export Range..."
msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð²Ñделениеâ¦"
-#: editor.cc:1906
+#: editor.cc:2012
msgid "Export Video Range..."
msgstr "ÐкÑпоÑÑиÑоваÑÑ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð²Ð¸Ð´ÐµÐ¾..."
-#: editor.cc:1922 editor.cc:2004 editor_actions.cc:311
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
msgid "Play from Edit Point"
msgstr "ÐоÑпÑоизвеÑÑи Ð¾Ñ ÑоÑки ÑедакÑиÑованиÑ"
-#: editor.cc:1923 editor.cc:2005
+#: editor.cc:2029 editor.cc:2111
msgid "Play from Start"
msgstr "ÐоÑпÑоизвеÑÑи Ð¾Ñ Ð½Ð°Ñала"
-#: editor.cc:1924
+#: editor.cc:2030
msgid "Play Region"
msgstr "ÐоÑпÑоизвеÑÑи облаÑÑÑ"
-#: editor.cc:1926
+#: editor.cc:2032
msgid "Loop Region"
msgstr "СоздаÑÑ Ð¿ÐµÑÐ»Ñ Ð¸Ð· облаÑÑи"
-#: editor.cc:1936 editor.cc:2014
+#: editor.cc:2042 editor.cc:2120
msgid "Select All in Track"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð½Ð° доÑожке"
-#: editor.cc:1937 editor.cc:2015 editor_actions.cc:195
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
msgid "Select All Objects"
msgstr "ÐÑделиÑÑ Ð²Ñе обÑекÑÑ"
-#: editor.cc:1938 editor.cc:2016
+#: editor.cc:2044 editor.cc:2122
msgid "Invert Selection in Track"
msgstr "ÐбÑаÑиÑÑ Ð²Ñделение на доÑожке"
-#: editor.cc:1939 editor.cc:2017 editor_actions.cc:198
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
msgid "Invert Selection"
msgstr "ÐбÑаÑиÑÑ Ð²Ñделение"
-#: editor.cc:1941 editor_actions.cc:200
+#: editor.cc:2047 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "УÑÑановиÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ по Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð¿ÐµÑли"
-#: editor.cc:1942 editor_actions.cc:201
+#: editor.cc:2048 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "УÑÑановиÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ по Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð²Ñезки"
-#: editor.cc:1943 editor_actions.cc:202
+#: editor.cc:2049 editor_actions.cc:203
msgid "Set Range to Selected Regions"
-msgstr ""
+msgstr "УÑÑановиÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ по вÑбÑаннÑм облаÑÑÑм"
-#: editor.cc:1945 editor.cc:2019 editor_actions.cc:204 editor_actions.cc:205
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð¿Ð¾Ñле кÑÑÑоÑа ÑедакÑоÑа"
-#: editor.cc:1946 editor.cc:2020 editor_actions.cc:206 editor_actions.cc:207
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð´Ð¾ кÑÑÑоÑа ÑедакÑоÑа"
-#: editor.cc:1947 editor.cc:2021
+#: editor.cc:2053 editor.cc:2127
msgid "Select All After Playhead"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð¿Ð¾Ñле ÑказаÑелÑ"
-#: editor.cc:1948 editor.cc:2022
+#: editor.cc:2054 editor.cc:2128
msgid "Select All Before Playhead"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð´Ð¾ ÑказаÑелÑ"
-#: editor.cc:1949
+#: editor.cc:2055
msgid "Select All Between Playhead and Edit Point"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑказаÑелем и кÑÑÑоÑом ÑедакÑоÑа"
-#: editor.cc:1950
+#: editor.cc:2056
msgid "Select All Within Playhead and Edit Point"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑказаÑелем и ÑоÑкой ÑедакÑиÑованиÑ"
-#: editor.cc:1951
+#: editor.cc:2057
msgid "Select Range Between Playhead and Edit Point"
msgstr "СоздаÑÑ Ð²Ñделение Ð¼ÐµÐ¶Ð´Ñ ÑказаÑелем и кÑÑÑоÑом ÑедакÑоÑа"
-#: editor.cc:1953 editor.cc:2024 editor_actions.cc:132 editor_actions.cc:133
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "ÐÑделиÑÑ"
-#: editor.cc:1961 editor.cc:2032 editor_actions.cc:345 processor_box.cc:2828
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
msgid "Cut"
msgstr "ÐÑÑезаÑÑ"
-#: editor.cc:1962 editor.cc:2033 editor_actions.cc:349 processor_box.cc:2830
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
msgid "Copy"
msgstr "ÐопиÑоваÑÑ"
-#: editor.cc:1963 editor.cc:2034 editor_actions.cc:350 processor_box.cc:2835
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
msgid "Paste"
msgstr "ÐÑÑавиÑÑ"
-#: editor.cc:1967 editor_actions.cc:92
+#: editor.cc:2073 editor_actions.cc:94
msgid "Align"
msgstr "ÐÑÑовнÑÑÑ"
-#: editor.cc:1968
+#: editor.cc:2074
msgid "Align Relative"
msgstr "ÐÑÑовнÑÑÑ Ð¾ÑноÑиÑелÑно"
-#: editor.cc:1975
+#: editor.cc:2081
msgid "Insert Selected Region"
msgstr "ÐÑÑавиÑÑ Ð²ÑделеннÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ"
-#: editor.cc:1976
+#: editor.cc:2082
msgid "Insert Existing Media"
msgstr "ÐÑÑавиÑÑ ÑÑÑеÑÑвÑÑÑие даннÑе"
-#: editor.cc:1985 editor.cc:2041
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Entire Track Later"
msgstr "ТолкнÑÑÑ Ð²ÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð²Ð¿ÐµÑÑд"
-#: editor.cc:1986 editor.cc:2042
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Track After Edit Point Later"
msgstr "ТолкнÑÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð²Ð¿ÐµÑÑд поÑле кÑÑÑоÑа ÑедакÑоÑа"
-#: editor.cc:1987 editor.cc:2043
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Entire Track Earlier"
msgstr "ТолкнÑÑÑ Ð²ÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð½Ð°Ð·Ð°Ð´"
-#: editor.cc:1988 editor.cc:2044
+#: editor.cc:2094 editor.cc:2150
msgid "Nudge Track After Edit Point Earlier"
msgstr "ТолкнÑÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð½Ð°Ð·Ð°Ð´ поÑле кÑÑÑоÑа ÑедакÑоÑа"
-#: editor.cc:1990 editor.cc:2046
+#: editor.cc:2096 editor.cc:2152
msgid "Nudge"
msgstr "ТолкнÑÑÑ"
-#: editor.cc:2261
+#: editor.cc:2354
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
"ÐозиÑÐ¸Ñ ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑоÑ
Ñанена Ñ Ð½ÐµÐ³Ð°ÑивнÑм знаÑением и бÑÐ´ÐµÑ "
"пÑоигноÑиÑована. ÐмеÑÑо Ð½ÐµÑ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзовано наÑало ÑеанÑа."
-#: editor.cc:3039 editor.cc:3738 editor.cc:3809 midi_channel_selector.cc:157
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "ÐÑе"
-#: editor.cc:3239
+#: editor.cc:3281
msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3240
+#: editor.cc:3282
msgid "Grab Mode (select/move objects)"
msgstr "ÐаÑ
Ð²Ð°Ñ (вÑделение и пеÑемеÑение обÑекÑов)"
-#: editor.cc:3241
+#: editor.cc:3283
msgid "Cut Mode (split regions)"
msgstr "ÐаÑезка (Ñазделение облаÑÑей)"
-#: editor.cc:3242
+#: editor.cc:3284
msgid "Range Mode (select time ranges)"
msgstr "ÐÐ¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ (вÑделение диапазонов вÑемени)"
-#: editor.cc:3243
+#: editor.cc:3285
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr "РиÑование (ÑиÑование и пÑавка ÑÑилениÑ, Ð½Ð¾Ñ Ð¸ авÑомаÑизаÑии)"
-#: editor.cc:3244
+#: editor.cc:3286
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr "РаÑÑÑгивание (аÑдио и MIDI во вÑемени Ñ ÑоÑ
Ñанением вÑÑоÑÑ Ñона)"
-#: editor.cc:3245
+#: editor.cc:3287
msgid "Audition Mode (listen to regions)"
msgstr "ÐÑоÑлÑÑивание (облаÑÑей)"
-#: editor.cc:3246
+#: editor.cc:3288
msgid "Internal Edit Mode (edit notes and automation points)"
msgstr "ÐÑавка ÑодеÑжимого облаÑÑей (пÑавка Ð½Ð¾Ñ Ð¸ ÑоÑек авÑомаÑизаÑии)"
-#: editor.cc:3247
+#: editor.cc:3289
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3429,63 +3707,63 @@ msgstr ""
"ÐÑÑппÑ: ÑÑлкниÑе Ð´Ð»Ñ (де)акÑиваÑии\n"
"ЩелÑок дÑÑгой клавиÑей вÑзÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÑекÑÑное менÑ"
-#: editor.cc:3248
+#: editor.cc:3290
msgid "Nudge Region/Selection Later"
msgstr "ТолкнÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð»Ð¸ вÑделение впеÑÑд"
-#: editor.cc:3249
+#: editor.cc:3291
msgid "Nudge Region/Selection Earlier"
msgstr "ТолкнÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð»Ð¸ вÑделение назад"
-#: editor.cc:3250 editor_actions.cc:270
+#: editor.cc:3292 editor_actions.cc:272
msgid "Zoom In"
msgstr "УвелиÑиÑÑ"
-#: editor.cc:3251 editor_actions.cc:269
+#: editor.cc:3293 editor_actions.cc:271
msgid "Zoom Out"
msgstr "УменÑÑиÑÑ"
-#: editor.cc:3252
+#: editor.cc:3294
msgid "Zoom to Time Scale"
msgstr "УвелиÑиÑÑ Ð´Ð¾ ÑÐºÐ°Ð»Ñ Ð²Ñемени"
-#: editor.cc:3253 editor.cc:3760 editor_actions.cc:271
+#: editor.cc:3295 editor.cc:3798 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "ÐоказаÑÑ Ð²ÑÑ"
-#: editor.cc:3254 editor_actions.cc:113 editor_actions.cc:146
+#: editor.cc:3296 editor_actions.cc:115 editor_actions.cc:148
msgid "Zoom Focus"
msgstr "ФокÑÑ Ð¿Ñи маÑÑÑабиÑовании"
-#: editor.cc:3255
+#: editor.cc:3297
msgid "Expand Tracks"
msgstr "УвелиÑиÑÑ Ð´Ð¾Ñожки по вÑÑоÑе"
-#: editor.cc:3256
+#: editor.cc:3298
msgid "Shrink Tracks"
msgstr "УменÑÑиÑÑ Ð´Ð¾Ñожки по вÑÑоÑе"
-#: editor.cc:3257
+#: editor.cc:3299
msgid "Number of visible tracks"
msgstr "ÐолиÑеÑÑво видимÑÑ
доÑожек"
-#: editor.cc:3258
+#: editor.cc:3300
msgid "Snap/Grid Units"
msgstr "ÐдиниÑа пÑивÑзки/ÑеÑки"
-#: editor.cc:3259
+#: editor.cc:3301
msgid "Snap/Grid Mode"
msgstr "Режим пÑивÑзки/ÑеÑки"
-#: editor.cc:3260 editor_actions.cc:99
+#: editor.cc:3302 editor_actions.cc:101
msgid "Edit Point"
msgstr "ТоÑка ÑедакÑиÑованиÑ"
-#: editor.cc:3261
+#: editor.cc:3303
msgid "Edit Mode"
msgstr "Режим ÑедакÑиÑованиÑ"
-#: editor.cc:3262
+#: editor.cc:3304
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3493,124 +3771,124 @@ msgstr ""
"Сдвиг ÑаÑов\n"
"(ÑаÑÑÑоÑние, на коÑоÑое подÑолкнÑÑÑ Ð¾Ð±Ð»Ð°ÑÑи и вÑделениÑ)"
-#: editor.cc:3530 editor_actions.cc:321
+#: editor.cc:3572 editor_actions.cc:335
msgid "Command|Undo"
msgstr "ÐÑмениÑÑ"
-#: editor.cc:3532
+#: editor.cc:3574
msgid "Command|Undo (%1)"
msgstr "ÐÑмениÑÑ (%1)"
-#: editor.cc:3539 editor_actions.cc:323 editor_actions.cc:324
-#: editor_actions.cc:325
+#: editor.cc:3581 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "ÐеÑнÑÑÑ"
-#: editor.cc:3542
+#: editor.cc:3584
msgid "Redo (%1)"
msgstr "ÐеÑнÑÑÑ (%1)"
-#: editor.cc:3562 editor.cc:3586 editor_actions.cc:111 editor_actions.cc:1865
+#: editor.cc:3604 editor.cc:3628 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "ÐÑодÑблиÑоваÑÑ"
-#: editor.cc:3563
+#: editor.cc:3605
msgid "Number of duplications:"
msgstr "ÐолиÑеÑÑво копий:"
-#: editor.cc:3737 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3775 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "ÐÑделение"
-#: editor.cc:3740
+#: editor.cc:3778
msgid "Fit 1 track"
msgstr "УмеÑÑиÑÑ 1 доÑожкÑ"
-#: editor.cc:3741
+#: editor.cc:3779
msgid "Fit 2 tracks"
msgstr "УмеÑÑиÑÑ 2 доÑожки"
-#: editor.cc:3742
+#: editor.cc:3780
msgid "Fit 4 tracks"
msgstr "УмеÑÑиÑÑ 4 доÑожки"
-#: editor.cc:3743
+#: editor.cc:3781
msgid "Fit 8 tracks"
msgstr "УмеÑÑиÑÑ 8 доÑожек"
-#: editor.cc:3744
+#: editor.cc:3782
msgid "Fit 16 tracks"
msgstr "УмеÑÑиÑÑ 16 доÑожек"
-#: editor.cc:3745
+#: editor.cc:3783
msgid "Fit 24 tracks"
msgstr "УмеÑÑиÑÑ 24 доÑожки"
-#: editor.cc:3746
+#: editor.cc:3784
msgid "Fit 32 tracks"
msgstr "УмеÑÑиÑÑ 32 доÑожки"
-#: editor.cc:3747
+#: editor.cc:3785
msgid "Fit 48 tracks"
msgstr "УмеÑÑиÑÑ 48 доÑожек"
-#: editor.cc:3748
+#: editor.cc:3786
msgid "Fit All tracks"
msgstr "УмеÑÑиÑÑ Ð²Ñе доÑожки"
-#: editor.cc:3749
+#: editor.cc:3787
msgid "Fit Selection"
msgstr "УмеÑÑиÑÑ Ð²Ñделение"
-#: editor.cc:3751
+#: editor.cc:3789 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 10 мÑ"
-#: editor.cc:3752
+#: editor.cc:3790 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 100 мÑ"
-#: editor.cc:3753
+#: editor.cc:3791 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 1 Ñек"
-#: editor.cc:3754
+#: editor.cc:3792 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 10 Ñек"
-#: editor.cc:3755
+#: editor.cc:3793 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 1 мин"
-#: editor.cc:3756
+#: editor.cc:3794 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 10 мин"
-#: editor.cc:3757
+#: editor.cc:3795
msgid "Zoom to 1 hour"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 1 ÑаÑа"
-#: editor.cc:3758
+#: editor.cc:3796
msgid "Zoom to 8 hours"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 8 ÑаÑ"
-#: editor.cc:3759
+#: editor.cc:3797
msgid "Zoom to 24 hours"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ 24 ÑаÑ"
-#: editor.cc:3761
+#: editor.cc:3799
msgid "Zoom to Range/Region Selection"
msgstr "ÐÑмаÑÑÑабиÑоваÑÑ Ð´Ð¾ вÑбÑанного диапазона/облаÑÑи"
-#: editor.cc:3831
+#: editor.cc:3869
msgid "*"
msgstr "*"
-#: editor.cc:4151
+#: editor.cc:4136
msgid "Playlist Deletion"
msgstr "Удаление ÑпиÑка воÑпÑоизведениÑ"
-#: editor.cc:4152
+#: editor.cc:4137
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3620,1330 +3898,1373 @@ msgstr ""
"ÐÑли его оÑÑавиÑÑ, ÑвÑзаннÑе звÑковÑе ÑÐ°Ð¹Ð»Ñ Ð½Ðµ бÑдÑÑ Ð¿Ð¾Ð´ÑиÑенÑ.\n"
"ÐÑли его ÑдалиÑÑ, бÑдÑÑ Ð¿Ð¾Ð´ÑиÑÐµÐ½Ñ Ð¸ ÑвÑзаннÑе звÑковÑе ÑайлÑ."
-#: editor.cc:4162
+#: editor.cc:4147
msgid "Delete All Unused"
msgstr "УдалиÑÑ Ð²Ñе неиÑполÑзÑемÑе"
-#: editor.cc:4163
+#: editor.cc:4148
msgid "Delete Playlist"
msgstr "УдалиÑÑ ÑпиÑок"
-#: editor.cc:4164
+#: editor.cc:4149
msgid "Keep Playlist"
msgstr "СоÑ
ÑаниÑÑ ÑпиÑок"
-#: editor.cc:4165
+#: editor.cc:4150
msgid "Keep Remaining"
msgstr ""
-#: editor.cc:4166 editor_audio_import.cc:597 editor_ops.cc:6456
-#: engine_dialog.cc:2909 sfdb_freesound_mootcher.cc:69 processor_box.cc:2596
-#: processor_box.cc:2621
+#: editor.cc:4151 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
msgid "Cancel"
msgstr "ÐÑмена"
-#: editor.cc:4318
+#: editor.cc:4293
msgid "new playlists"
msgstr "СоздаÑÑ ÑпиÑки воÑпÑоизведениÑ"
-#: editor.cc:4334
+#: editor.cc:4309
msgid "copy playlists"
msgstr "СкопиÑоваÑÑ ÑпиÑки воÑпÑоизведениÑ"
-#: editor.cc:4349
+#: editor.cc:4324
msgid "clear playlists"
msgstr "ÐÑиÑÑиÑÑ ÑпиÑки воÑпÑоизведениÑ"
-#: editor.cc:5095
+#: editor.cc:5049
msgid "Please wait while %1 loads visual data."
msgstr "ÐождиÑеÑÑ Ð·Ð°Ð³ÑÑзки визÑалÑнÑÑ
даннÑÑ
в %1."
-#: editor.cc:5947 editor.cc:5982 editor_markers.cc:985 panner_ui.cc:412
-#: processor_box.cc:2855
+#: editor.cc:5812 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5813 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5962 editor.cc:5997 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
msgid "Edit..."
msgstr "ÐзмениÑÑ"
-#: editor.cc:5988 editor_actions.cc:1844
+#: editor.cc:6003 editor_actions.cc:1842
msgid "Transpose..."
msgstr "ТÑанÑпозиÑиÑâ¦"
-#: editor.cc:5992 editor_actions.cc:1960
+#: editor.cc:6007 editor_actions.cc:1959
msgid "Legatize"
msgstr "ÐобавиÑÑ Ð»ÐµÐ³Ð°Ñо"
-#: editor.cc:5998 editor_actions.cc:1959
+#: editor.cc:6013 editor_actions.cc:1958
msgid "Quantize..."
msgstr "ÐванÑование..."
-#: editor.cc:6001 editor_actions.cc:1962
+#: editor.cc:6016 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr "УбÑаÑÑ Ð¿ÐµÑекÑÑÑие"
-#: editor.cc:6007 editor_actions.cc:1961
+#: editor.cc:6022 editor_actions.cc:1960
msgid "Transform..."
msgstr "ÐÑеобÑазоваÑÑ..."
-#: editor_actions.cc:93
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "ÐвÑоÑоединение"
-#: editor_actions.cc:94
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "ÐÑоÑÑÑейдÑ"
-#: editor_actions.cc:96
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "ÐеÑемеÑÑиÑÑ Ð²ÑделеннÑй маÑкеÑ"
-#: editor_actions.cc:97
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "ÐÑÐ±Ð¾Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° Ñиклов"
-#: editor_actions.cc:98
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "ÐÑÐ±Ð¾Ñ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor_actions.cc:100
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Фейд"
-#: editor_actions.cc:101
+#: editor_actions.cc:103
msgid "Latch"
msgstr "ÐапиÑание"
-#: editor_actions.cc:102 editor_regions.cc:115 region_editor.cc:48
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "ÐблаÑÑÑ"
-#: editor_actions.cc:103
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Слои"
-#: editor_actions.cc:104 editor_regions.cc:116 stereo_panner_editor.cc:46
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "Ðоложение"
-#: editor_actions.cc:106 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:178
-#: panner_ui.cc:637 route_time_axis.cc:529
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "ÐбÑезаÑÑ"
-#: editor_actions.cc:107 editor_actions.cc:127 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "УÑиление"
-#: editor_actions.cc:108 editor_actions.cc:579
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "ÐÑделениÑ"
-#: editor_actions.cc:109 editor_actions.cc:1861 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "ФейдÑ"
-#: editor_actions.cc:112
+#: editor_actions.cc:114
msgid "Link"
msgstr "СвÑзÑ"
-#: editor_actions.cc:114
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "ÐеÑейÑи к маÑкеÑам"
-#: editor_actions.cc:116
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Спад индикаÑоÑа"
-#: editor_actions.cc:117
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "ÐадеÑжка индикаÑоÑа"
-#: editor_actions.cc:118 session_option_editor.cc:342
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "ÐаÑамеÑÑÑ MIDI"
-#: editor_actions.cc:119
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "ÐÑоÑие паÑамеÑÑÑ"
-#: editor_actions.cc:120 rc_option_editor.cc:2261 route_group_dialog.cc:54
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "ÐониÑоÑинг"
-#: editor_actions.cc:121
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "ÐкÑивнÑй маÑкеÑ"
-#: editor_actions.cc:124
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "ÐÑновной ÑÑÑÑÑик"
-#: editor_actions.cc:125
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "ÐвеÑÑ
/вниз"
-#: editor_actions.cc:126
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "ÐейÑÑÐ²Ð¸Ñ Ñ Ð¾Ð±Ð»Ð°ÑÑÑми"
-#: editor_actions.cc:128 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Ðинейки"
-#: editor_actions.cc:129
+#: editor_actions.cc:131
msgid "Views"
msgstr "ÐидÑ"
-#: editor_actions.cc:130
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "ÐÑокÑÑÑка"
-#: editor_actions.cc:131
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "ÐополниÑелÑнÑй ÑÑÑÑÑик"
-#: editor_actions.cc:138
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "ÐодвÑбоÑки"
-#: editor_actions.cc:141
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "СкоÑоÑÑÑ (FPS) Ñайм-кода"
-#: editor_actions.cc:142 route_time_axis.cc:587
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "ÐÑÑоÑа"
-#: editor_actions.cc:144
+#: editor_actions.cc:146
msgid "Tools"
msgstr "ÐнÑÑÑÑменÑÑ"
-#: editor_actions.cc:145
+#: editor_actions.cc:147
msgid "View"
msgstr "Ðид"
-#: editor_actions.cc:147
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "ÐаÑÑÑаб"
-#: editor_actions.cc:153
-msgid "Break drag or deselect all"
-msgstr "ÐÑеÑваÑÑ Ð¿ÐµÑеÑаÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ оÑмениÑÑ Ð²Ñе"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "ÐаÑкÑипÑованнÑе дейÑÑвиÑ"
-#: editor_actions.cc:158
+#: editor_actions.cc:159
msgid "Session|Lock"
msgstr "ÐаблокиÑоваÑÑ"
-#: editor_actions.cc:160
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "ÐоказÑваÑÑ Ð¼Ð¸ÐºÑÐµÑ ÑедакÑоÑа"
-#: editor_actions.cc:161
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "ÐоказÑваÑÑ ÑпиÑок ÑедакÑиÑованиÑ"
-#: editor_actions.cc:163
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Ð ÑледÑÑÑей гÑаниÑе облаÑÑи"
-#: editor_actions.cc:164
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr "Ð ÑледÑÑÑей гÑаниÑе облаÑÑи (без вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñожки)"
-#: editor_actions.cc:165
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "РпÑедÑдÑÑей гÑаниÑе облаÑÑи"
-#: editor_actions.cc:166
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr "РпÑедÑдÑÑей гÑаниÑе облаÑÑи (без вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñожки)"
-#: editor_actions.cc:168
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "РнаÑÐ°Ð»Ñ ÑледÑÑÑей облаÑÑи"
-#: editor_actions.cc:169
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "РконÑÑ ÑледÑÑÑей облаÑÑи"
-#: editor_actions.cc:170
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Ð ÑледÑÑÑÐµÐ¼Ñ ÑинÑ
ÑонизаÑоÑÑ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor_actions.cc:172
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "РнаÑÐ°Ð»Ñ Ð¿ÑедÑдÑÑей облаÑÑи"
-#: editor_actions.cc:173
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "РконÑÑ Ð¿ÑедÑдÑÑей облаÑÑи"
-#: editor_actions.cc:174
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "РпÑедÑдÑÑÐµÐ¼Ñ ÑинÑ
ÑонизаÑоÑÑ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor_actions.cc:176
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "Ð ÑледÑÑÑей гÑаниÑе облаÑÑи"
-#: editor_actions.cc:177
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "Ð ÑледÑÑÑей гÑаниÑе облаÑÑи (без вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñожки)"
-#: editor_actions.cc:178
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "РпÑедÑдÑÑей гÑаниÑе облаÑÑи"
-#: editor_actions.cc:179
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "РпÑедÑдÑÑей гÑаниÑе облаÑÑи (без вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñожки)"
-#: editor_actions.cc:181
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "РнаÑÐ°Ð»Ñ ÑледÑÑÑей облаÑÑи"
-#: editor_actions.cc:182
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "РконÑÑ ÑледÑÑÑей облаÑÑи"
-#: editor_actions.cc:183
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "Ð ÑледÑÑÑÐµÐ¼Ñ ÑинÑ
ÑонизаÑоÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:185
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "РнаÑÐ°Ð»Ñ Ð¿ÑедÑдÑÑей облаÑÑи"
-#: editor_actions.cc:186
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "РконÑÑ Ð¿ÑедÑдÑÑей облаÑÑи"
-#: editor_actions.cc:187
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "РпÑедÑдÑÑÐµÐ¼Ñ ÑинÑ
ÑонизаÑоÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:189
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "РнаÑÐ°Ð»Ñ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:190
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "РконÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:192
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
-msgstr "РнаÑÐ°Ð»Ñ Ð¾Ð±Ð»Ð°ÑÑи"
+msgstr "РнаÑÐ°Ð»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°"
-#: editor_actions.cc:193
+#: editor_actions.cc:194
msgid "Playhead to Range End"
-msgstr "РконÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
+msgstr "РконÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°"
-#: editor_actions.cc:196
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr "ÐÑбÑаÑÑ Ð²Ñе доÑожки"
-#: editor_actions.cc:197 export_timespan_selector.cc:59 processor_box.cc:2841
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
msgid "Deselect All"
msgstr "СнÑÑÑ Ð²Ñе вÑделениÑ"
-#: editor_actions.cc:209
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð¿ÐµÑеÑекаÑÑÑÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ñавки"
-#: editor_actions.cc:210
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð²Ð½ÑÑÑи облаÑÑи пÑавки"
-#: editor_actions.cc:212
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "ÐÑделиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ñавки"
-#: editor_actions.cc:214
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "ÐÑделиÑÑ Ð²Ñе в облаÑÑи вÑезки"
-#: editor_actions.cc:215
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "ÐÑделиÑÑ Ð²ÑÑ Ð² заколÑÑованной облаÑÑи"
-#: editor_actions.cc:217
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "ÐÑбÑаÑÑ ÑледÑÑÑÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð¸Ð»Ð¸ ÑинÑ"
-#: editor_actions.cc:218
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "ÐÑбÑаÑÑ Ð¿ÑедÑдÑÑÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð¸Ð»Ð¸ ÑинÑ"
-#: editor_actions.cc:220
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "ÐеÑеклÑÑиÑÑ Ð³Ð¾ÑовноÑÑÑ Ðº запиÑи"
-#: editor_actions.cc:222
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr "ÐеÑеклÑÑиÑÑ Ñоло"
-#: editor_actions.cc:224
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "ÐеÑеклÑÑиÑÑ Ð¿ÑиглÑÑение"
-#: editor_actions.cc:226
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "ÐеÑеклÑÑиÑÑ Ð¸Ð·Ð¾Ð»Ð¸Ñование ÑолиÑованиÑ"
-#: editor_actions.cc:231
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "СоÑ
ÑаниÑÑ Ð²Ð¸Ð´ %1"
-#: editor_actions.cc:237
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "ÐеÑейÑи к Ð²Ð¸Ð´Ñ %1"
-#: editor_actions.cc:243
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "ÐеÑейÑи к маÑкеÑÑ %1"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "Ð ÑледÑÑÑÐµÐ¼Ñ Ð¼Ð°ÑкеÑÑ"
-#: editor_actions.cc:249 editor_actions.cc:250
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "РпÑедÑдÑÑÐµÐ¼Ñ Ð¼Ð°ÑкеÑÑ"
-#: editor_actions.cc:252
+#: editor_actions.cc:254
msgid "Set Session Start from Playhead"
-msgstr ""
+msgstr "ÐаÑало ÑеÑÑии по ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
-#: editor_actions.cc:253
+#: editor_actions.cc:255
msgid "Set Session End from Playhead"
-msgstr ""
+msgstr "ÐÐ¾Ð½ÐµÑ ÑеÑÑии по ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
-#: editor_actions.cc:255 editor_actions.cc:256
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "ÐобавиÑÑ Ð¼Ð°ÑÐºÐµÑ Ð¿Ð¾ ÑказаÑелÑ"
-#: editor_actions.cc:258 editor_actions.cc:259
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
-msgstr "УдалиÑÑ Ð¼Ð°ÑÐºÐµÑ Ð²Ð¾ÑпÑоизведениÑ"
+msgstr "УдалиÑÑ Ð¼Ð°ÑÐºÐµÑ Ð¿Ð¾ ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
-#: editor_actions.cc:261
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr "Сдвиг ÑледÑÑÑего позже"
-#: editor_actions.cc:262
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr "Сдвиг ÑледÑÑÑего ÑанÑÑе"
-#: editor_actions.cc:264
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "ТолкнÑÑÑ ÑказаÑÐµÐ»Ñ Ð²Ð¿ÐµÑÑд"
-#: editor_actions.cc:265
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "ТолкнÑÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð°Ð·Ð°Ð´"
-#: editor_actions.cc:266
+#: editor_actions.cc:268
msgid "Playhead to Next Grid"
-msgstr ""
+msgstr "УказаÑÐµÐ»Ñ Ðº ÑледÑÑÑей ÑеÑке"
-#: editor_actions.cc:267
+#: editor_actions.cc:269
msgid "Playhead to Previous Grid"
-msgstr ""
+msgstr "УказаÑÐµÐ»Ñ Ðº пÑедÑдÑÑей ÑеÑке"
-#: editor_actions.cc:272
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr "ÐаÑÑÑабиÑоваÑÑ Ð´Ð¾ вÑделениÑ"
-#: editor_actions.cc:273
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "ÐеÑеклÑÑиÑÑ ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð°ÑÑÑаба"
-#: editor_actions.cc:275
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "УвелиÑиÑÑ Ð²ÑÑоÑÑ Ð´Ð¾Ñожки"
-#: editor_actions.cc:276
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "УменÑÑиÑÑ Ð²ÑÑоÑÑ Ð´Ð¾Ñожки"
-#: editor_actions.cc:278
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "УмеÑÑиÑÑ 1 доÑожкÑ"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "УмеÑÑиÑÑ 2 доÑожки"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "УмеÑÑиÑÑ 4 доÑожки"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "УмеÑÑиÑÑ 8 доÑожек"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "УмеÑÑиÑÑ 16 доÑожек"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "УмеÑÑиÑÑ 32 доÑожки"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "УмеÑÑиÑÑ Ð²Ñе доÑожки"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "ÐоднÑÑÑ Ð²ÑбÑаннÑе доÑожки"
-#: editor_actions.cc:280
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "ÐпÑÑÑиÑÑ Ð²ÑбÑаннÑе доÑожки"
-#: editor_actions.cc:283
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "ÐÑокÑÑÑиÑÑ Ð´Ð¾Ñожки ввеÑÑ
"
-#: editor_actions.cc:285
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "ÐÑокÑÑÑиÑÑ Ð´Ð¾Ñожки вниз"
-#: editor_actions.cc:287
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "ÐеÑейÑи на доÑÐ¾Ð¶ÐºÑ Ð²ÑÑе"
-#: editor_actions.cc:289
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "ÐеÑейÑи на доÑÐ¾Ð¶ÐºÑ Ð½Ð¸Ð¶Ðµ"
-#: editor_actions.cc:292
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "ÐÑокÑÑÑиÑÑ Ð½Ð°Ð·Ð°Ð´"
-#: editor_actions.cc:293
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "ÐÑокÑÑÑиÑÑ Ð²Ð¿ÐµÑÑд"
-#: editor_actions.cc:294
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "УказаÑÐµÐ»Ñ Ð¿Ð¾ ÑенÑÑÑ"
-#: editor_actions.cc:295
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "ЦенÑÑиÑоваÑÑ ÑоÑÐºÑ ÑедакÑиÑованиÑ"
-#: editor_actions.cc:297
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "УказаÑÐµÐ»Ñ Ð²Ð¿ÐµÑÑд"
-#: editor_actions.cc:298
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "УказаÑÐµÐ»Ñ Ð½Ð°Ð·Ð°Ð´"
-#: editor_actions.cc:300
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "УказаÑÐµÐ»Ñ Ðº акÑÐ¸Ð²Ð½Ð¾Ð¼Ñ Ð¼Ð°ÑкеÑÑ"
-#: editor_actions.cc:301
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
-msgstr "ÐкÑивнÑй маÑÐºÐµÑ Ðº ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
+msgstr "ÐкÑивнÑй маÑÐºÐµÑ Ðº ÑказаÑелÑ"
-#: editor_actions.cc:303
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr "ÐÑп. пÑопÑÑк диапазонов"
-#: editor_actions.cc:310
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "ÐоÑпÑоизвеÑÑи вÑбÑаннÑе облаÑÑи"
-#: editor_actions.cc:312
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "ÐоÑпÑоизвеÑÑи Ð¾Ñ ÐºÑÑÑоÑа ÑедакÑоÑа и веÑнÑÑÑÑÑ"
-#: editor_actions.cc:314
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "ÐоÑпÑоизвеÑÑи изменÑемое вÑделение"
-#: editor_actions.cc:316
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "УказаÑÐµÐ»Ñ Ðº кÑÑÑоÑÑ Ð¼ÑÑи"
-#: editor_actions.cc:317
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "ÐкÑивнÑй маÑÐºÐµÑ Ðº ÑказаÑÐµÐ»Ñ Ð¼ÑÑи"
-#: editor_actions.cc:327
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr "ÐÑмениÑÑ ÑÐ¼ÐµÐ½Ñ Ð²ÑделениÑ"
-#: editor_actions.cc:328
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr "ÐовÑоÑиÑÑ ÑÐ¼ÐµÐ½Ñ Ð²ÑделениÑ"
-#: editor_actions.cc:330
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð·Ð²Ñк"
-#: editor_actions.cc:331 export_dialog.cc:394
+#: editor_actions.cc:345 export_dialog.cc:476
msgid "Export Range"
msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ"
-#: editor_actions.cc:336
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "РазделиÑÑ Ð¿Ð¾ вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²Ñезки"
-#: editor_actions.cc:339
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "РазделиÑÑ Ð¿Ð¾ вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÐµÑли"
-#: editor_actions.cc:342 editor_actions.cc:364
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "ÐбÑезаÑÑ"
-#: editor_actions.cc:352
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr "Ðиапазон поÑвлениÑ"
-#: editor_actions.cc:354
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr "УÑÑановиÑÑ Ñемп, ÑÑиÑÐ°Ñ ÑÑо диапазон ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ = ÑакÑ"
-#: editor_actions.cc:356
+#: editor_actions.cc:371
msgid "Log"
msgstr "ÐÑÑнал"
-#: editor_actions.cc:359 editor_actions.cc:361
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr "ÐеÑейÑи к ÑледÑÑÑей пеÑеменной"
-#: editor_actions.cc:360 editor_actions.cc:362
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr "ÐеÑейÑи к пÑедÑдÑÑей пеÑеменной"
-#: editor_actions.cc:366 editor_actions.cc:375
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "ÐаÑаÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ð¾Ñ ÑказаÑелÑ"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "ÐаконÑиÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ по ÑказаÑелÑ"
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "ÐаÑаÑÑ Ð²Ñделение"
-#: editor_actions.cc:367 editor_actions.cc:376
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "ÐаконÑиÑÑ Ð²Ñделение"
-#: editor_actions.cc:369
+#: editor_actions.cc:387
msgid "Start Punch Range"
msgstr "ÐаÑаÑÑ Ð²ÑезкÑ"
-#: editor_actions.cc:370
+#: editor_actions.cc:388
msgid "Finish Punch Range"
msgstr "ÐакÑÑÑÑ Ð²ÑезкÑ"
-#: editor_actions.cc:372
+#: editor_actions.cc:390
msgid "Start Loop Range"
msgstr "ÐаÑаÑÑ Ð¿ÐµÑлÑ"
-#: editor_actions.cc:373
+#: editor_actions.cc:391
msgid "Finish Loop Range"
msgstr "ÐакÑÑÑÑ Ð¿ÐµÑлÑ"
-#: editor_actions.cc:408
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "СледоваÑÑ Ð·Ð° ÑказаÑелем"
-#: editor_actions.cc:409
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "УдалиÑÑ Ð¿Ð¾ÑледнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ"
-#: editor_actions.cc:411
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "ÐеподвижнÑй ÑказаÑелÑ"
-#: editor_actions.cc:413 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "ÐÑÑавиÑÑ Ð¿ÑомежÑÑок вÑемени"
-#: editor_actions.cc:415 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
msgid "Remove Time"
-msgstr ""
+msgstr "УдалиÑÑ Ð¿ÑомежÑÑок вÑемени"
-#: editor_actions.cc:420
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "ÐеÑеклÑÑиÑÑ Ð°ÐºÑивноÑÑÑ"
-#: editor_actions.cc:422 editor_actions.cc:1787 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:134 mixer_strip.cc:1621
-#: route_time_axis.cc:872
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "УдалиÑÑ"
-#: editor_actions.cc:427
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr "УмеÑÑиÑÑ Ð²Ñделение по веÑÑикали"
-#: editor_actions.cc:429 time_axis_view.cc:1380
+#: editor_actions.cc:447 time_axis_view.cc:1291
msgid "Largest"
msgstr "ÐгÑомнаÑ"
-#: editor_actions.cc:432 time_axis_view.cc:1381
+#: editor_actions.cc:450 time_axis_view.cc:1292
msgid "Larger"
msgstr "ÐолÑÑе"
-#: editor_actions.cc:435 editor_rulers.cc:248 time_axis_view.cc:1382
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1293
msgid "Large"
msgstr "ÐолÑÑаÑ"
-#: editor_actions.cc:441 editor_rulers.cc:252 time_axis_view.cc:1384
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1295
msgid "Small"
msgstr "ÐаленÑкаÑ"
-#: editor_actions.cc:445
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr "ÐоÑпÑоизводиÑÑ Ð²ÑделÑемÑе MIDI-ноÑÑ"
-#: editor_actions.cc:450
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Ðлево"
-#: editor_actions.cc:451
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "ÐпÑаво"
-#: editor_actions.cc:452
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Ðо ÑенÑÑÑ"
-#: editor_actions.cc:453
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Ðо ÑказаÑелÑ"
-#: editor_actions.cc:454
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Ðо кÑÑÑоÑÑ Ð¼ÑÑи"
-#: editor_actions.cc:455
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Ðо ÑоÑке ÑедакÑиÑованиÑ"
-#: editor_actions.cc:457
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr "СледÑÑÑий ваÑÐ¸Ð°Ð½Ñ ÑокÑÑа"
-#: editor_actions.cc:463
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "УнивеÑÑалÑнÑй Ñежим"
-#: editor_actions.cc:466
+#: editor_actions.cc:491
msgid "Smart"
msgstr "УнивеÑÑалÑнÑй"
-#: editor_actions.cc:469
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "ÐбÑекÑ"
-#: editor_actions.cc:474
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "ÐÑделение"
-#: editor_actions.cc:479
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "ÐнÑÑÑÑÐ¼ÐµÐ½Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ñ"
-#: editor_actions.cc:484
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "ÐнÑÑÑÑÐ¼ÐµÐ½Ñ Ð¿ÑоÑлÑÑиваниÑ"
-#: editor_actions.cc:489
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "РаÑÑÑжение во вÑемени"
-#: editor_actions.cc:494
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr "ÐÑавка ÑодеÑжимого"
-#: editor_actions.cc:500
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr "ÐнÑÑÑÑÐ¼ÐµÐ½Ñ Ð¾Ð±Ñезки"
-#: editor_actions.cc:506
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr "Режим Ñага мÑÑи"
-#: editor_actions.cc:513
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "ÐзмениÑÑ ÑоÑÐºÑ ÑедакÑиÑованиÑ"
-#: editor_actions.cc:514
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "ÐзмениÑÑ ÑоÑÐºÑ ÑедакÑиÑованиÑ, вклÑÑÐ°Ñ Ð¼Ð°ÑкеÑ"
-#: editor_actions.cc:519
+#: editor_actions.cc:544
msgid "EditMode|Lock"
msgstr "Ðлок"
-#: editor_actions.cc:520
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr "ЦиклиÑеÑки менÑÑÑ Ñежим ÑедакÑиÑованиÑ"
-#: editor_actions.cc:522
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "ÐÑивÑзка"
-#: editor_actions.cc:523
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Режим пÑивÑзки"
-#: editor_actions.cc:530
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "СледÑÑÑий Ñежим пÑивÑзки"
-#: editor_actions.cc:531
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "СледÑÑÑий вÑÐ±Ð¾Ñ Ð¿ÑивÑзки"
-#: editor_actions.cc:532
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr "СледÑÑÑий ваÑÐ¸Ð°Ð½Ñ Ð¿ÑивÑзки (ÑакÑÑ, доли)"
-#: editor_actions.cc:533
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr "ÐÑедÑдÑÑий ваÑÐ¸Ð°Ð½Ñ Ð¿ÑивÑзки"
-#: editor_actions.cc:534
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr "ÐÑедÑдÑÑий ваÑÐ¸Ð°Ð½Ñ Ð¿ÑивÑзки (ÑакÑÑ, доли)"
-#: editor_actions.cc:539
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr "РвÑбоÑкам CD"
-#: editor_actions.cc:540
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr "РкадÑам Ñаймкода"
-#: editor_actions.cc:541
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr "Ð ÑекÑндам Ñаймкода"
-#: editor_actions.cc:542
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr "РминÑÑам Ñаймкода"
-#: editor_actions.cc:543
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "Ð ÑекÑндам"
-#: editor_actions.cc:544
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "РминÑÑам"
-#: editor_actions.cc:546
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr "Ð 1/28"
-#: editor_actions.cc:547
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr "Ð 1/24"
-#: editor_actions.cc:548
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "Ð 30 ÑекÑндам"
-#: editor_actions.cc:549
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr "Ð 1/28"
-#: editor_actions.cc:550
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr "Ð 1/24"
-#: editor_actions.cc:551
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr "Ð 1/20"
-#: editor_actions.cc:552
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "Ð 1/16"
-#: editor_actions.cc:553
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "Ð 1/14"
-#: editor_actions.cc:554
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr "Ð 1/12"
-#: editor_actions.cc:555
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "Ð 1/10"
-#: editor_actions.cc:556
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "Ð 1/8"
-#: editor_actions.cc:557
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "Ð 1/7"
-#: editor_actions.cc:558
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "Ð 1/6"
-#: editor_actions.cc:559
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "Ð 1/5"
-#: editor_actions.cc:560
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "Ð 1/4"
-#: editor_actions.cc:561
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "Ð 1/3"
-#: editor_actions.cc:562
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "Ð 1/2"
-#: editor_actions.cc:564
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "РдолÑм"
-#: editor_actions.cc:565
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "Ð ÑакÑам"
-#: editor_actions.cc:566
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "РмаÑкеÑам"
-#: editor_actions.cc:567
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "РнаÑалам облаÑÑей"
-#: editor_actions.cc:568
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "РконÑам облаÑÑей"
-#: editor_actions.cc:569
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr "Ð ÑинÑ
ÑонизаÑоÑам облаÑÑей"
-#: editor_actions.cc:570
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "РгÑаниÑам облаÑÑей"
-#: editor_actions.cc:572
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "ÐоказÑваÑÑ Ð»Ð¸Ð½Ð¸Ð¸ маÑкеÑов"
-#: editor_actions.cc:582
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "ÐеÑли/ÐÑезки"
-#: editor_actions.cc:586
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Ðин:С"
-#: editor_actions.cc:588 editor_actions.cc:591 editor_rulers.cc:270
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr "ÐидеомониÑоÑ"
-#: editor_actions.cc:590 rc_option_editor.cc:2720
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr "Ðидео"
-#: editor_actions.cc:593
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr "ÐÑегда ÑвеÑÑ
Ñ"
-#: editor_actions.cc:595
+#: editor_actions.cc:620
msgid "Frame number"
msgstr "ÐÐ¾Ð¼ÐµÑ ÐºÐ°Ð´Ñа"
-#: editor_actions.cc:596
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr "Фон Ñайм-кода"
-#: editor_actions.cc:597
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr "Ðо веÑÑ ÑкÑан"
-#: editor_actions.cc:598
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr "УмеÑÑиÑÑ Ð² окно"
-#: editor_actions.cc:599
+#: editor_actions.cc:624
msgid "Original Size"
msgstr "ÐÑÑ
однÑй ÑазмеÑ"
-#: editor_actions.cc:656
+#: editor_actions.cc:681
msgid "Sort"
msgstr "СоÑÑиÑоваÑÑ"
-#: editor_actions.cc:667 editor_routes.cc:485 mixer_ui.cc:1258
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "ÐоказаÑÑ Ð²ÑÑ"
-#: editor_actions.cc:668
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr "ÐоказаÑÑ Ð°Ð²ÑомаÑ. облаÑÑи"
-#: editor_actions.cc:670
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Ðо возÑаÑÑаниÑ"
-#: editor_actions.cc:672
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Ðо ÑбÑваниÑ"
-#: editor_actions.cc:675
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "Ðо имени облаÑÑи"
-#: editor_actions.cc:677
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "Ðо длиÑелÑноÑÑи облаÑÑи"
-#: editor_actions.cc:679
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "Ðо ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:681
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "Ðо вÑемени ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:683
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "Ðо наÑÐ°Ð»Ñ Ð¾Ð±Ð»Ð°ÑÑи в Ñайле"
-#: editor_actions.cc:685
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "Ðо конÑÑ Ð¾Ð±Ð»Ð°ÑÑи в Ñайле"
-#: editor_actions.cc:687
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "Ðо имени иÑÑ
одного Ñайла"
-#: editor_actions.cc:689
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "Ðо длиÑелÑноÑÑи иÑÑ
одного Ñайла"
-#: editor_actions.cc:691
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "Ðо даÑе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ÑÑ
одного Ñайла"
-#: editor_actions.cc:693
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "Ðо иÑÑ
одной Ñайловой ÑиÑÑеме"
-#: editor_actions.cc:696
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "Удаление неиÑполÑзÑемÑÑ
"
-#: editor_actions.cc:698
+#: editor_actions.cc:723
msgid "Import PT session"
msgstr "ÐмпоÑÑиÑоваÑÑ ÑеÑÑÐ¸Ñ PT"
-#: editor_actions.cc:703 editor_audio_import.cc:282 editor_pt_import.cc:148
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 sfdb_ui.cc:558 editor_videotimeline.cc:91
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "ÐмпоÑÑиÑоваÑÑ"
-#: editor_actions.cc:706
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "ÐмпоÑÑиÑоваÑÑ Ð² ÑпиÑок облаÑÑейâ¦"
-#: editor_actions.cc:709 session_import_dialog.cc:44
+#: editor_actions.cc:734 session_import_dialog.cc:44
#: session_import_dialog.cc:65
msgid "Import from Session"
msgstr "ÐмпоÑÑиÑоваÑÑ Ð¸Ð· ÑеÑÑии"
-#: editor_actions.cc:713
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr "ÐанеÑÑи вÑе медиа в Ð¿Ð°Ð¿ÐºÑ ÑеÑÑии"
-#: editor_actions.cc:716
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "ÐоказÑваÑÑ ÑводкÑ"
-#: editor_actions.cc:718
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "ÐоказÑваÑÑ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ гÑÑпп"
-#: editor_actions.cc:720
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr "ÐоказÑваÑÑ Ð»Ð¸Ð½Ð¸Ð¸ ÑакÑов и долей"
-#: editor_actions.cc:724
-msgid "Show Logo"
-msgstr "ÐоказаÑÑ Ð»Ð¾Ð³Ð¾Ñип"
-
-#: editor_actions.cc:728
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr "ÐеÑеклÑÑиÑÑ Ð°ÐºÑивнÑй вÑ
од MIDI Ð´Ð»Ñ ÑедакÑоÑа вÑбÑаннÑÑ
доÑожек/Ñин"
-#: editor_actions.cc:751
-msgid "Loaded editor bindings from %1"
-msgstr "ÐагÑÑженнÑй ÑедакÑÐ¾Ñ Ð¿ÑивÑзки Ð¾Ñ %1"
-
-#: editor_actions.cc:753
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Ðе ÑдалоÑÑ Ð½Ð°Ð¹Ñи ÑедакÑÐ¾Ñ Ð¿ÑивÑзок в пÑÑи поиÑка %1"
-
-#: editor_actions.cc:1097 editor_actions.cc:1493 editor_actions.cc:1504
-#: editor_actions.cc:1557 editor_actions.cc:1568 editor_actions.cc:1615
-#: editor_actions.cc:1625 editor_regions.cc:1575
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1714
msgid "programming error: %1: %2"
msgstr "ÐÑибка в пÑогÑамме: %1: %2"
-#: editor_actions.cc:1793
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "ÐоднÑÑÑ"
-#: editor_actions.cc:1796
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Ðа ÑамÑй веÑÑ
"
-#: editor_actions.cc:1799
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "ÐпÑÑÑиÑÑ"
-#: editor_actions.cc:1802
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Ð ÑамÑй низ"
-#: editor_actions.cc:1805
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "РиÑÑ
одной позиÑии"
-#: editor_actions.cc:1810
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr "ÐÑикÑепиÑÑ Ðº видео"
-#: editor_actions.cc:1815 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "ÐÑикÑепиÑÑ Ðº ÑакÑам и долÑм"
-#: editor_actions.cc:1820
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "УдалиÑÑ ÑинÑ
ÑонизаÑоÑ"
-#: editor_actions.cc:1823 mixer_strip.cc:2088 monitor_section.cc:252
-#: monitor_section.cc:320 route_time_axis.cc:256 route_time_axis.cc:538
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "ÐолÑа"
-#: editor_actions.cc:1826
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "ÐоÑмиÑоваÑÑ Ñигнал..."
-#: editor_actions.cc:1829
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "РазвеÑнÑÑÑ"
-#: editor_actions.cc:1832
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "СоздаÑÑ Ð¼Ð¾Ð½Ð¾-облаÑÑи"
-#: editor_actions.cc:1835
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "ÐовÑÑиÑÑ Ð³ÑомкоÑÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:1838
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "ÐонизиÑÑ Ð³ÑомкоÑÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:1841
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "СмениÑÑ Ð²ÑÑоÑÑ Ñонаâ¦"
-#: editor_actions.cc:1847
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "ÐепÑозÑаÑно"
-#: editor_actions.cc:1851 editor_regions.cc:120
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "ÐаÑаÑÑание"
-#: editor_actions.cc:1856 editor_regions.cc:121
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "ÐаÑÑÑ
ание"
-#: editor_actions.cc:1871
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "ÐÑодÑблиÑоваÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑно..."
-#: editor_actions.cc:1876
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "ÐаполниÑÑ Ð´Ð¾ÑожкÑ"
-#: editor_actions.cc:1880 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "УÑÑановиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿ÐµÑли"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "УÑÑановиÑÑ Ð²ÑезкÑ"
-#: editor_actions.cc:1891
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "ÐобавиÑÑ Ð¼Ð°ÑÐºÐµÑ ÑекÑÑей облаÑÑи"
-#: editor_actions.cc:1896
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "ÐобавиÑÑ Ð¿Ð¾ маÑкеÑÑ Ð½Ð° каждÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ"
-#: editor_actions.cc:1900
+#: editor_actions.cc:1898
msgid "Snap Position to Grid"
-msgstr ""
+msgstr "ÐÑивÑзÑваÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ðº ÑеÑке"
-#: editor_actions.cc:1903
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "ÐакÑÑÑÑ Ð¸Ð½ÑеÑвалÑ"
-#: editor_actions.cc:1906
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "РиÑмиÑеÑкий Ñ
оÑÑк..."
-#: editor_actions.cc:1909
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "ÐкÑпоÑÑиÑоваÑÑ..."
-#: editor_actions.cc:1915
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "РазделиÑÑ Ð¿Ð¾Ð´"
-#: editor_actions.cc:1919 editor_actions.cc:1920
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð½Ð°ÑаÑÑаниÑ"
-#: editor_actions.cc:1921 editor_actions.cc:1922
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð·Ð°ÑÑÑ
аниÑ"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "УÑÑановиÑÑ Ñемп, ÑÑиÑÐ°Ñ ÑÑо облаÑÑÑ = ÑакÑ"
-#: editor_actions.cc:1929
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "РазделиÑÑ Ð¿Ð¾ аÑакам пеÑкÑÑÑии"
-#: editor_actions.cc:1934
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "РедакÑÐ¾Ñ ÑпиÑка ÑобÑÑий"
-#: editor_actions.cc:1937
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "СвойÑÑва..."
-#: editor_actions.cc:1941
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "СвеÑÑи (Ñ Ð¾Ð±ÑабоÑкой)"
-#: editor_actions.cc:1942
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "СвеÑÑи (без обÑабоÑки)"
-#: editor_actions.cc:1943
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "ÐбÑединиÑÑ"
-#: editor_actions.cc:1944
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "СнÑÑÑ Ð¾Ð±Ñединение"
-#: editor_actions.cc:1946
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Ðнализ гÑомкоÑÑи..."
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "СпекÑÑалÑнÑй анализ..."
-#: editor_actions.cc:1948
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "СбÑоÑиÑÑ Ð¾Ð³Ð¸Ð±Ð°ÑÑÑÑ"
-#: editor_actions.cc:1950
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "СбÑоÑиÑÑ ÑÑиление"
-#: editor_actions.cc:1955
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "ÐгибаÑÑÐ°Ñ Ð°ÐºÑивна"
-#: editor_actions.cc:1963 editor_actions.cc:1964
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "ÐÑÑавиÑÑ ÑÐ¼ÐµÐ½Ñ Ð¿ÑогÑаммÑ..."
-#: editor_actions.cc:1965
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr "ÐÑÑоединиÑÑ Ð¾Ñ Ð´ÑÑгиÑ
копий"
-#: editor_actions.cc:1966
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "ÐÑÑезаÑÑ ÑиÑинÑ..."
-#: editor_actions.cc:1967
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "СоздаÑÑ Ð²Ñделение из облаÑÑи"
-#: editor_actions.cc:1969 editor_actions.cc:1970
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr "ТолкнÑÑÑ Ð²Ð¿ÐµÑÑд"
-#: editor_actions.cc:1971 editor_actions.cc:1972
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr "ТолкнÑÑÑ Ð½Ð°Ð·Ð°Ð´"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr "ÐÑÑÑÑоиÑÑ Ð¾Ð±Ð»Ð°ÑÑи вÑÑÑк"
-#: editor_actions.cc:1979
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr "ТолкнÑÑÑ Ð²Ð¿ÐµÑÑд на ÑмеÑение заÑ
ваÑа"
-#: editor_actions.cc:1986
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr "ТолкнÑÑÑ Ð½Ð°Ð·Ð°Ð´ на ÑмеÑение заÑ
ваÑа"
-#: editor_actions.cc:1990
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "РпеÑлÑ"
-#: editor_actions.cc:1991
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Ðо вÑезкÑ"
-#: editor_actions.cc:1993
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Ðо пÑедÑдÑÑей облаÑÑи"
-#: editor_actions.cc:1994
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Ðо ÑледÑÑÑей облаÑÑи"
-#: editor_actions.cc:2001
+#: editor_actions.cc:2000
msgid "Insert Region from Region List"
-msgstr ""
+msgstr "ÐÑÑавиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð· ÑпиÑка облаÑÑей"
-#: editor_actions.cc:2007
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "УÑÑановиÑÑ ÑинÑ
ÑонизаÑÐ¾Ñ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "ÐеÑÑо пеÑеÑ
однÑÑ
"
-#: editor_actions.cc:2009
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr "РазбиÑÑ"
-#: editor_actions.cc:2010
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "ÐаÑало по кÑÑÑоÑÑ ÑедакÑоÑа"
-#: editor_actions.cc:2011
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "ÐÐ¾Ð½ÐµÑ Ð¿Ð¾ кÑÑÑоÑÑ ÑедакÑоÑа"
-#: editor_actions.cc:2016
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "ÐÑÑовнÑÑÑ Ð½Ð°Ñала облаÑÑей"
-#: editor_actions.cc:2023
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "ÐÑÑовнÑÑÑ Ð¾ÑноÑиÑелÑно наÑал облаÑÑей"
-#: editor_actions.cc:2027
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "ÐÑÑовнÑÑÑ ÐºÐ¾Ð½ÑÑ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor_actions.cc:2032
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "ÐÑÑовнÑÑÑ Ð¾ÑноÑиÑелÑно конÑов облаÑÑей"
-#: editor_actions.cc:2039
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "ÐÑÑовнÑÑÑ Ð¿Ð¾ ÑинÑ
ÑонизаÑоÑам облаÑÑей"
-#: editor_actions.cc:2046
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "ÐÑÑовнÑÑÑ Ð¾ÑноÑиÑелÑно ÑинÑ
ÑонизаÑоÑов облаÑÑей"
-#: editor_actions.cc:2050 editor_actions.cc:2053
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "ÐÑбÑаÑÑ Ð²ÐµÑÑ
нÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ..."
@@ -4971,33 +5292,33 @@ msgstr ""
"Ð ÑÑой ÑеÑÑии Ñже еÑÑÑ Ð¸ÑÑ
однÑй Ñайл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ %1. ÐÑ Ñ
оÑиÑе импоÑÑиÑоваÑÑ %2 "
"как новÑй иÑÑоÑник или пÑопÑÑÑиÑÑ ÐµÐ³Ð¾?"
-#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "ÐÑмениÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑ"
-#: editor_audio_import.cc:562
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "РедакÑоÑ: не ÑдаÑÑÑÑ Ð¾ÑкÑÑÑÑ Ñайл \"%1\", (%2)"
-#: editor_audio_import.cc:570
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "ÐÑмениÑÑ Ð²ÐµÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑ"
-#: editor_audio_import.cc:571
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Ðе вÑÑÑаиваÑÑ"
-#: editor_audio_import.cc:572
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "ÐÑÑÑоиÑÑ Ð±ÐµÐ· лиÑниÑ
вопÑоÑов"
-#: editor_audio_import.cc:575 editor_audio_import.cc:601
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "ЧаÑÑоÑа ÑÑмплиÑованиÑ"
-#: editor_audio_import.cc:576 editor_audio_import.cc:602
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -5006,27 +5327,27 @@ msgstr ""
"ÐÑбÑаннÑй звÑковой Ñайл Ð¸Ð¼ÐµÐµÑ ÑаÑÑоÑÑ ÑÑмплиÑованиÑ,\n"
"оÑлиÑнÑÑ Ð¾Ñ ÑаÑÑоÑÑ Ð°ÐºÑивной ÑеÑÑии!"
-#: editor_audio_import.cc:598
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "ÐÑÑ Ñавно вÑÑÑоиÑÑ"
#: editor_pt_import.cc:81
msgid "You can't import a PT session until you have a session loaded."
-msgstr ""
+msgstr "ÐÑ Ð½Ðµ можеÑе импоÑÑиÑоваÑÑ ÑеÑÑÐ¸Ñ ProTools, пока ÑеÑÑÐ¸Ñ Ð½Ðµ загÑÑжена."
#: editor_pt_import.cc:86
msgid "Import PT Session"
-msgstr "ÐмпоÑÑиÑоваÑÑ ÑеÑÑÐ¸Ñ PT"
+msgstr "ÐмпоÑÑиÑоваÑÑ ÑеÑÑÐ¸Ñ ProTools"
#: editor_pt_import.cc:97
msgid "%1: this is only the directory/folder name, not the filename.\n"
msgstr "%1: ÑÑо лиÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ папки или каÑалога, а не Ð¸Ð¼Ñ Ñайла.\n"
-#: editor_pt_import.cc:131
+#: editor_pt_import.cc:132
msgid "Doesn't seem to be a valid PT session file"
msgstr "ÐÑÐ¾Ñ Ñайл не поÑ
ож на коÑÑекÑнÑй Ñайл ÑеанÑа PT"
-#: editor_pt_import.cc:135
+#: editor_pt_import.cc:136
msgid ""
"PT v%1 Session @ %2Hz\n"
"\n"
@@ -5044,28 +5365,44 @@ msgstr ""
"\n"
"ÐÑодолжиÑÑ..."
-#: editor_canvas_events.cc:1308 editor_drag.cc:1418
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+"Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко звÑковÑÑ
Ñайлов,но попÑÑка импоÑÑа "
+"пÑодолжена."
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr "УÑпеÑно! ÐмпоÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑкоÑо завеÑÑиÑÑÑÑ."
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
"Ðе ÑдалоÑÑ ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð¿Ð¾Ñле облаÑÑи, помеÑÑнной в ÑабоÑÑÑ Ð·Ð¾Ð½Ñ"
-#: editor_drag.cc:1310
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr "ФикÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿ÐµÑеÑаÑкиваниÑ"
-#: editor_drag.cc:2245
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr "ÐеÑеÑаÑкивание ÑÑби"
-#: editor_drag.cc:2307
+#: editor_drag.cc:2311
msgid "create region"
-msgstr ""
+msgstr "Ñоздание облаÑÑи"
-#: editor_drag.cc:2426 midi_region_view.cc:2834
+#: editor_drag.cc:2430 midi_region_view.cc:2857
msgid "resize notes"
msgstr "Смена ÑазмеÑа ноÑÑ"
-#: editor_drag.cc:2609 editor_drag.cc:2644
+#: editor_drag.cc:2613 editor_drag.cc:2648
msgid ""
"One or more Audio Regions\n"
"are both Locked and\n"
@@ -5073,79 +5410,87 @@ msgid ""
"The video cannot me moved."
msgstr ""
-#: editor_drag.cc:2679
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr "ÐаÑало видеоÑайла"
-#: editor_drag.cc:2681
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr "РазниÑа:"
-#: editor_drag.cc:2703
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr "ÐеÑемеÑÑиÑÑ Ð²Ð¸Ð´ÐµÐ¾"
-#: editor_drag.cc:3212
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr "ÐеÑемеÑÑиÑÑ Ð¼Ð°ÑÐºÐµÑ ÑÑеÑÑика"
+
+#: editor_drag.cc:3178
msgid "copy meter mark"
msgstr "СкопиÑоваÑÑ Ð¼Ð°ÑÐºÐµÑ ÑÑеÑÑика"
-#: editor_drag.cc:3220
-msgid "move meter mark"
-msgstr "ÐеÑемеÑÑиÑÑ Ð¼Ð°ÑÐºÐµÑ ÑÑеÑÑика"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3308
+#: editor_drag.cc:3323
msgid "move tempo mark"
msgstr "ÐеÑемеÑÑиÑÑ Ð¼Ð°ÑÐºÐµÑ Ñемпа"
-#: editor_drag.cc:3345
+#: editor_drag.cc:3330
msgid "copy tempo mark"
msgstr "СкопиÑоваÑÑ Ð¼Ð°ÑÐºÐµÑ Ñемпа"
-#: editor_drag.cc:3609
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3735
msgid "change fade in length"
msgstr "Смена длиÑелÑноÑÑи Ñейда наÑаÑÑаниÑ"
-#: editor_drag.cc:3734
+#: editor_drag.cc:3860
msgid "change fade out length"
msgstr "Смена длиÑелÑноÑÑи Ñейда заÑÑÑ
аниÑ"
-#: editor_drag.cc:4110
+#: editor_drag.cc:4238
msgid "move marker"
msgstr "СмеÑение маÑкеÑа"
-#: editor_drag.cc:4373 editor_drag.cc:5694
+#: editor_drag.cc:4505 editor_drag.cc:5832
msgid "automation range move"
msgstr "СмеÑение вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð°Ð²ÑомаÑизаÑии"
-#: editor_drag.cc:4747
+#: editor_drag.cc:4889
msgid "An error occurred while executing time stretch operation"
msgstr "ÐÑоизоÑла оÑибка пÑи вÑполнении опеÑаÑии ÑаÑÑÑÐ¶ÐµÐ½Ð¸Ñ Ð²Ñемени"
-#: editor_drag.cc:5208
+#: editor_drag.cc:5350
msgid "programming_error: %1"
msgstr "ÐÑибка в пÑогÑамме: %1"
-#: editor_drag.cc:5277 editor_drag.cc:5287
+#: editor_drag.cc:5419 editor_drag.cc:5429
msgid "new skip marker"
msgstr "ÐовÑй маÑÐºÐµÑ Ð¿ÑопÑÑка"
-#: editor_drag.cc:5278
+#: editor_drag.cc:5420
msgid "skip"
msgstr "ÐÑопÑÑÑиÑÑ"
-#: editor_drag.cc:5282 location_ui.cc:58
+#: editor_drag.cc:5424 location_ui.cc:60
msgid "CD"
msgstr "CD"
-#: editor_drag.cc:5283
+#: editor_drag.cc:5425
msgid "new CD marker"
msgstr "ÐовÑй CD маÑкеÑ"
-#: editor_drag.cc:5288 editor_route_groups.cc:438 mixer_ui.cc:1593
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "ÐезÑмÑннÑй"
-#: editor_drag.cc:5601
+#: editor_drag.cc:5739
msgid "Automation range drag created for invalid region type"
msgstr ""
"ÐеÑеÑаÑкивание облаÑÑи авÑомаÑизаÑии пÑедпÑинÑÑо Ð´Ð»Ñ Ð½ÐµÐ¿ÑавилÑного Ñипа "
@@ -5163,7 +5508,7 @@ msgstr "Ð¦Ð²ÐµÑ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ гÑÑппÑ"
msgid "Name of Group"
msgstr "Ðазвание гÑÑппÑ"
-#: editor_route_groups.cc:99 editor_routes.cc:209
+#: editor_route_groups.cc:99 editor_routes.cc:234
msgid "Visible|V"
msgstr "Ð"
@@ -5195,9 +5540,9 @@ msgstr "ÐÑн."
msgid "Relative Gain Changes?"
msgstr "ÐÑноÑиÑелÑÐ½Ñ Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑилении"
-#: editor_route_groups.cc:103 editor_regions.cc:124 editor_routes.cc:213
-#: mixer_strip.cc:2117 meter_strip.cc:367 route_time_axis.cc:2750
-#: time_axis_view.cc:1199
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
msgid "Mute|M"
msgstr "Ð"
@@ -5205,8 +5550,9 @@ msgstr "Ð"
msgid "Sharing Mute?"
msgstr "РазделÑеÑÑÑ Ð»Ð¸ пÑиглÑÑение"
-#: editor_route_groups.cc:104 editor_routes.cc:214 mixer_strip.cc:2130
-#: meter_strip.cc:375 route_time_axis.cc:2747
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
msgid "Solo|S"
msgstr "С"
@@ -5214,8 +5560,8 @@ msgstr "С"
msgid "Sharing Solo?"
msgstr "РазделÑеÑÑÑ Ð»Ð¸ ÑолиÑование"
-#: editor_route_groups.cc:105 midi_time_axis.cc:1630 midi_time_axis.cc:1633
-#: midi_time_axis.cc:1636
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Ðап"
@@ -5239,7 +5585,7 @@ msgstr "ÐÑд."
msgid "Sharing Selected/Editing Status?"
msgstr "РазделÑÑÑ ÑÑаÑÑÑ Ð²ÑделенноÑÑи"
-#: editor_route_groups.cc:108 editor_routes.cc:210
+#: editor_route_groups.cc:108 editor_routes.cc:235
msgid "Active|A"
msgstr "Ð"
@@ -5247,13 +5593,13 @@ msgstr "Ð"
msgid "Sharing Active Status?"
msgstr "РазделÑеÑÑÑ Ð»Ð¸ акÑивнÑй ÑÑаÑÑÑ"
-#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2248
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr "ÐÑибка в пÑогÑамме: marker canvas item has no marker object pointer!"
@@ -5261,7 +5607,7 @@ msgstr "ÐÑибка в пÑогÑамме: marker canvas item has no marker obj
msgid "Confirm MIDI File Overwrite"
msgstr "ÐодÑвеÑдиÑÑ Ð¿ÐµÑезапиÑÑ Ñайла MIDI"
-#: editor_export_audio.cc:115 utils_videotl.cc:73
+#: editor_export_audio.cc:115 utils_videotl.cc:75
msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr "Файл Ñ Ñаким именем Ñже ÑÑÑеÑÑвÑеÑ. ÐеÑезапиÑаÑÑ ÐµÐ³Ð¾?"
@@ -5281,20 +5627,20 @@ msgstr "ÐонеÑ"
msgid "mark"
msgstr ""
-#: editor_markers.cc:650 editor_ops.cc:2102 editor_ops.cc:2124
-#: editor_ops.cc:2240 editor_ops.cc:2277 location_ui.cc:1025
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "Ðобавка маÑкеÑа"
-#: editor_markers.cc:682 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "СоздаÑÑ Ð¿ÐµÑÐ»Ñ Ð¸Ð· облаÑÑи"
-#: editor_markers.cc:698 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "Создание вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²Ñезки"
-#: editor_markers.cc:715 editor_ops.cc:4092
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "диапазон"
@@ -5302,106 +5648,135 @@ msgstr "диапазон"
msgid "new range marker"
msgstr "ÐовÑй маÑÐºÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°"
-#: editor_markers.cc:751 editor_ops.cc:2208 location_ui.cc:861
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "Удаление маÑкеÑа"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "ÐеÑемеÑÑиÑÑ ÑÑда ÑказаÑелÑ"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "ÐоÑпÑоизвеÑÑи оÑÑÑда"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "ÐаÑÐºÐµÑ Ðº ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "СоздаÑÑ Ð²Ñделение до Ñлед. маÑкеÑа"
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr "ÐеÑейÑи к маÑкеÑÑ"
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr "ÐоÑпÑоизвеÑÑи Ð¾Ñ Ð¼Ð°ÑкеÑа"
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr "УÑÑановиÑÑ Ð¼Ð°ÑÐºÐµÑ Ð¿Ð¾ ÑказаÑелÑ"
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr "УÑÑановиÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ по вÑделениÑ"
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "СкÑÑÑÑ Ð²Ñделение"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "ÐеÑеименоваÑÑ Ð¾Ð±Ð»Ð°ÑÑÑâ¦"
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "УдалиÑÑ Ð²Ñделение"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "РазделиÑÑ Ð¾Ð±Ð»Ð°ÑÑи в вÑделении"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "ÐÑбÑаÑÑ Ð²Ñделение"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "УÑÑановиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ñезки"
-#: editor_markers.cc:1407 editor_ops.cc:2057
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Ðовое название:"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "ÐеÑеименоваÑÑ Ð¼Ð°ÑкеÑ"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "ÐеÑеименоваÑÑ Ð²Ñделение"
-#: editor_markers.cc:1419 editor_mouse.cc:2265 processor_box.cc:2370
-#: processor_box.cc:2837 route_time_axis.cc:1112 route_ui.cc:1616
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1641
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "ÐеÑеименоваÑÑ"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "ÐеÑеименование маÑкеÑа"
-#: editor_mixer.cc:91
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr "ÐкÑан недоÑÑаÑоÑно вÑÑок, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð¾ÐºÐ½Ð¾ ÑедакÑоÑа"
-#: editor_mouse.cc:1343 editor_mouse.cc:1361 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
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:1348 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr "ÐÑибка в пÑогÑамме: marker for tempo is not a tempo marker!"
-#: editor_mouse.cc:1366 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr "ÐÑибка в пÑогÑамме: маÑÐºÐµÑ ÑазмеÑа ÑаковÑм не ÑвлÑеÑÑÑ!"
-#: editor_mouse.cc:2013 editor_mouse.cc:2038 editor_mouse.cc:2051
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
@@ -5409,179 +5784,184 @@ msgstr ""
"оÑибка в пÑогÑамме: Ñ ÐºÐ¾Ð½ÑÑ. ÑоÑки пÑнкÑа ÑобÑÑÐ¸Ñ Ð½ÐµÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑоÑкой "
"обÑекÑаÑказаÑелÑ!"
-#: editor_mouse.cc:2186
+#: editor_mouse.cc:2085
+#, fuzzy
+msgid "edit note(s)"
+msgstr "ÐÑавка ноÑÑ"
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr "ÐбÑезка наÑалÑной ÑоÑки"
-#: editor_mouse.cc:2211
+#: editor_mouse.cc:2218
msgid "end point trim"
msgstr ""
-#: editor_mouse.cc:2263
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Ðазвание облаÑÑи: "
-#: editor_ops.cc:167
+#: editor_ops.cc:168
msgid "split"
msgstr "Разделение"
-#: editor_ops.cc:341
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "Ðзменение вÑделениÑ"
-#: editor_ops.cc:383
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "ТолÑок облаÑÑей впеÑед"
-#: editor_ops.cc:437 editor_ops.cc:528
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "ТолÑок позиÑии впеÑед"
-#: editor_ops.cc:468
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "ТолÑок облаÑÑей назад"
-#: editor_ops.cc:560
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "ТолÑок впеÑед"
-#: editor_ops.cc:584
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr "ТолÑок назад"
-#: editor_ops.cc:649
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr "вÑÑÑÑаивание облаÑÑей вÑÑÑк"
-#: editor_ops.cc:711
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "ФÑнкÑÐ¸Ñ build_region_boundary_cache вÑзвана Ñ snap_type = %1"
-#: editor_ops.cc:2059
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "ÐовÑй маÑÐºÐµÑ Ð¿Ð¾Ð·Ð¸Ñии"
-#: editor_ops.cc:2150 editor_ops.cc:2174
+#: editor_ops.cc:2212 editor_ops.cc:2236
msgid "Set session start"
-msgstr ""
+msgstr "УÑÑановиÑÑ Ð½Ð°Ñало ÑеÑÑии"
-#: editor_ops.cc:2240
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "Ðобавка маÑкеÑа"
-#: editor_ops.cc:2336
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "ÐÑиÑÑка маÑкеÑов"
-#: editor_ops.cc:2351
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "ÐÑиÑÑка диапазонов"
-#: editor_ops.cc:2367
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "ÐÑиÑÑка позиÑий"
-#: editor_ops.cc:2430
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "ÐÑÑавка облаÑÑи"
-#: editor_ops.cc:2621
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "ÐоднÑÑие облаÑÑей"
-#: editor_ops.cc:2623
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "ÐоднÑÑие облаÑÑи"
-#: editor_ops.cc:2629
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "ÐоднÑÑие облаÑÑей навеÑÑ
"
-#: editor_ops.cc:2631
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "ÐоднÑÑие облаÑÑи навеÑÑ
"
-#: editor_ops.cc:2637
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "ÐпÑÑкание облаÑÑей"
-#: editor_ops.cc:2639 editor_ops.cc:2647
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "ÐпÑÑкание облаÑÑи"
-#: editor_ops.cc:2645
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "ÐпÑÑкание облаÑÑей вниз"
-#: editor_ops.cc:2730
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "ÐеÑеименоваÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ..."
-#: editor_ops.cc:2732 processor_box.cc:2368 route_ui.cc:1614
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1639
msgid "New name:"
msgstr "Ðовое название:"
-#: editor_ops.cc:3030
+#: editor_ops.cc:3097
msgid "separate"
msgstr "Ñазделение"
-#: editor_ops.cc:3142
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "Ñазделение облаÑÑи под кÑÑÑоÑом"
-#: editor_ops.cc:3294
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "ÐбÑезание по вÑделениÑ"
-#: editor_ops.cc:3376
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "УÑÑановка ÑоÑки ÑинÑ
ÑонизаÑии"
-#: editor_ops.cc:3400
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "Удаление ÑинÑ
ÑонизаÑоÑа облаÑÑи"
-#: editor_ops.cc:3422
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "ÐеÑемеÑение облаÑÑей в иÑÑ
однÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑ"
-#: editor_ops.cc:3424
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "ÐеÑемеÑение облаÑÑи в иÑÑ
однÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑ"
-#: editor_ops.cc:3445
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "ÐÑÑавнивание вÑделениÑ"
-#: editor_ops.cc:3519
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "ÐÑÑавнивание вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ (оÑноÑиÑелÑное)"
-#: editor_ops.cc:3553
+#: editor_ops.cc:3619
msgid "align region"
msgstr "ÐÑÑавнивание облаÑÑи"
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "ÐбÑезка впеÑеди"
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "ÐбÑезка Ñзади"
-#: editor_ops.cc:3634
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "ÐбÑезка в пеÑлÑ"
-#: editor_ops.cc:3644
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "ÐбÑезка во вÑезкÑ"
-#: editor_ops.cc:3766
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "ÐбÑезка в облаÑÑÑ"
-#: editor_ops.cc:3825
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5593,11 +5973,11 @@ msgstr ""
"ÐÑо, как пÑавило, вÑзвано плагинами, коÑоÑÑе генеÑиÑÑÑÑ Ð²ÑÑ
одной "
"ÑÑеÑеоÑигнал из моновÑ
ода или наобоÑоÑ."
-#: editor_ops.cc:3828
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "Ðевозможно замоÑозиÑÑ"
-#: editor_ops.cc:3834
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5613,23 +5993,23 @@ msgstr ""
"ÐамоÑаживание бÑÐ´ÐµÑ ÑолÑко обÑабаÑÑваÑÑ Ñигнал как пеÑвÑй поÑÑл/вÑÑавкÑ/"
"возвÑаÑ."
-#: editor_ops.cc:3838
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "ÐÑÑ Ñавно замоÑозиÑÑ"
-#: editor_ops.cc:3839
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr "Ðе замоÑаживаÑÑ"
-#: editor_ops.cc:3840
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "ÐÑÐµÐ´ÐµÐ»Ñ Ð·Ð°Ð¼Ð¾Ñозки"
-#: editor_ops.cc:3855
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "ÐÑмениÑÑ Ð·Ð°Ð¼Ð¾Ñаживание"
-#: editor_ops.cc:3885
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5643,47 +6023,47 @@ msgstr ""
"\n"
"ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ ÑÑо без обÑабоÑки, и ÑÑо Ñже дÑÑÐ³Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ."
-#: editor_ops.cc:3889
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr "Ðевозможно вÑполниÑÑ Ñведение"
-#: editor_ops.cc:3940
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "Сведение облаÑÑи"
-#: editor_ops.cc:4007
+#: editor_ops.cc:4074
msgid "delete"
msgstr "Удаление"
-#: editor_ops.cc:4010
+#: editor_ops.cc:4077
msgid "cut"
msgstr "ÐÑÑезаÑÑ"
-#: editor_ops.cc:4013
+#: editor_ops.cc:4080
msgid "copy"
msgstr "ÐопиÑоваÑÑ"
-#: editor_ops.cc:4016
+#: editor_ops.cc:4083
msgid "clear"
msgstr "ÐÑиÑÑиÑÑ"
-#: editor_ops.cc:4065
+#: editor_ops.cc:4132
msgid "objects"
msgstr "обÑекÑÑ"
-#: editor_ops.cc:4275 editor_ops.cc:4360
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "Удаление облаÑÑи"
-#: editor_ops.cc:4787
-msgid "duplicate selection"
-msgstr "ÐÑблиÑование вÑделениÑ"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4873
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "СмеÑение доÑожки"
-#: editor_ops.cc:4900
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5691,156 +6071,156 @@ msgstr ""
"ÐоÑледнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð±ÑÐ´ÐµÑ Ñдалена. ÐÑ ÑвеÑенÑ?\n"
"(оÑмена опеÑаÑии невозможна)"
-#: editor_ops.cc:4903 editor_ops.cc:7127 editor_regions.cc:466
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "ÐеÑ"
-#: editor_ops.cc:4904
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Ðа"
-#: editor_ops.cc:4906
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "УниÑÑожение поÑледней запиÑи"
-#: editor_ops.cc:4982
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "ÐоÑмализаÑиÑ"
-#: editor_ops.cc:5080
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "РазвоÑÐ¾Ñ Ð¾Ð±Ð»Ð°ÑÑей"
-#: editor_ops.cc:5116
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "Удаление ÑиÑинÑ"
-#: editor_ops.cc:5197
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "ÐÑвеÑвление облаÑÑей"
-#: editor_ops.cc:5204
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr "Ðе ÑдалоÑÑ Ð¾ÑÑоединиÑÑ %1"
-#: editor_ops.cc:5465
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr "СбÑÐ¾Ñ ÑÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_ops.cc:5523
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr "ÐгибаÑÑÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑи акÑивна"
-#: editor_ops.cc:5548
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "ÐеÑеклÑÑение блокиÑовки облаÑÑи"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr "ÐеÑеклÑÑиÑÑ Ð²Ð¸Ð´ÐµÐ¾Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ"
-#: editor_ops.cc:5596
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "СпоÑоб блокиÑовки облаÑÑи"
-#: editor_ops.cc:5621
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "Смена пÑозÑаÑноÑÑи облаÑÑи"
-#: editor_ops.cc:5714
+#: editor_ops.cc:5781
msgid "fade range"
msgstr "Ðиапазон Ñейда"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "УÑÑановка Ð´Ð»Ð¸Ð½Ñ Ñейда наÑаÑÑаниÑ"
-#: editor_ops.cc:5759
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "УÑÑановка Ð´Ð»Ð¸Ð½Ñ Ñейда заÑÑÑ
аниÑ"
-#: editor_ops.cc:5824
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "УÑÑановка ÑоÑÐ¼Ñ Ñейда наÑаÑÑаниÑ"
-#: editor_ops.cc:5859
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "УÑÑановка ÑоÑÐ¼Ñ Ñейда заÑÑÑ
аниÑ"
-#: editor_ops.cc:5895
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "УÑÑановка акÑивноÑÑи Ñейда наÑаÑÑаниÑ"
-#: editor_ops.cc:5929
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr "УÑÑановка акÑивноÑÑи Ñейда заÑÑÑ
аниÑ"
-#: editor_ops.cc:5989
+#: editor_ops.cc:6056
msgid "toggle fade active"
-msgstr ""
+msgstr "пеÑеклÑÑение акÑивноÑÑи Ñейда"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "УÑÑановка пеÑли из вÑделениÑ"
-#: editor_ops.cc:6193
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "УÑÑановка пеÑли из облаÑÑи"
-#: editor_ops.cc:6212
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "УÑÑановка вÑезки из вÑделениÑ"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr "УÑÑановка наÑала/конÑа ÑеÑÑии из вÑделениÑ"
-#: editor_ops.cc:6272
+#: editor_ops.cc:6344
msgid "set punch start from EP"
msgstr ""
-#: editor_ops.cc:6300
+#: editor_ops.cc:6372
msgid "set punch end from EP"
msgstr ""
-#: editor_ops.cc:6333
+#: editor_ops.cc:6405
msgid "set loop start from EP"
msgstr ""
-#: editor_ops.cc:6361
+#: editor_ops.cc:6433
msgid "set loop end from EP"
msgstr ""
-#: editor_ops.cc:6372
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "УÑÑановка вÑезки из облаÑÑи"
-#: editor_ops.cc:6457
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "СоздаÑÑ Ð¼Ð°ÑкеÑ"
-#: editor_ops.cc:6458
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "УÑÑановиÑÑ Ð¾Ð±Ñий Ñемп"
-#: editor_ops.cc:6461
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "ÐпÑеделение ÑакÑа"
-#: editor_ops.cc:6462
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr "ÐÑ Ñ
оÑиÑе ÑÑÑановиÑÑ Ð¾Ð±Ñий Ñемп или добавиÑÑ Ð½Ð¾Ð²Ñй маÑÐºÐµÑ Ñемпа?"
-#: editor_ops.cc:6488
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "УÑÑановка Ñемпа из облаÑÑи"
-#: editor_ops.cc:6518
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "Разделение вÑделений"
-#: editor_ops.cc:6560
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5852,11 +6232,11 @@ msgstr ""
"на %2 ÑаÑÑей.\n"
"ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½ÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ вÑемени."
-#: editor_ops.cc:6567
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr "(?)ÐÑизваÑÑ Ð¤ÐµÑÑе!"
-#: editor_ops.cc:6568
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
@@ -5864,52 +6244,52 @@ msgstr ""
"ÐажмиÑе OK Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑазделениÑ\n"
"или попÑоÑиÑе ХоÑÑка ÑкоÑÑекÑиÑоваÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·."
-#: editor_ops.cc:6570
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr "ÐажмиÑе OK Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑазделениÑ"
-#: editor_ops.cc:6573
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "ÐаÑÑовое Ñазделение?"
-#: editor_ops.cc:6725
+#: editor_ops.cc:6800
msgid "place transient"
msgstr "РазмеÑÑиÑÑ Ð¿ÐµÑеÑ
однÑе"
-#: editor_ops.cc:6760
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "пÑивÑзка облаÑÑей к ÑеÑке"
-#: editor_ops.cc:6799
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr "ÐакÑÑÑие инÑеÑвалов Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±Ð»Ð°ÑÑÑми"
-#: editor_ops.cc:6804
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "ÐлиÑелÑноÑÑÑ ÐºÑоÑÑÑейда"
-#: editor_ops.cc:6813 editor_ops.cc:6824 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr "мÑ"
-#: editor_ops.cc:6815
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr "РаÑÑÑжка Ð´Ð»Ð¸Ð½Ñ Ð½Ð°Ð·Ð°Ð´"
-#: editor_ops.cc:6828
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr "ÐÐ"
-#: editor_ops.cc:6843
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr "ÑÑÑÑанение пÑобелов облаÑÑи"
-#: editor_ops.cc:7085
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "ÐÑо бÑло Ð±Ñ Ð¿Ð»Ð¾Ñ
ой новоÑÑÑÑ..."
-#: editor_ops.cc:7090
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5925,21 +6305,21 @@ msgstr ""
"подобнÑе веÑи, в Ñайле ardour.rc измениÑе знаÑение паÑамеÑÑа\n"
"\"allow-special-bus-removal\" на \"yes\""
-#: editor_ops.cc:7106 route_ui.cc:2009
+#: editor_ops.cc:7181
msgid "track"
msgid_plural "tracks"
msgstr[0] "доÑожка"
msgstr[1] "доÑожки"
msgstr[2] "доÑожек"
-#: editor_ops.cc:7107 route_ui.cc:2009
+#: editor_ops.cc:7182
msgid "bus"
msgid_plural "busses"
msgstr[0] "Ñина"
msgstr[1] "ÑинÑ"
msgstr[2] "Ñин"
-#: editor_ops.cc:7111
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5951,7 +6331,7 @@ msgstr ""
"\n"
"ÐÑо дейÑÑвие невозможно оÑмениÑÑ, Ñайл ÑеÑÑии бÑÐ´ÐµÑ Ð¿ÐµÑезапиÑан."
-#: editor_ops.cc:7116
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5963,7 +6343,7 @@ msgstr ""
"\n"
"ÐÑо дейÑÑвие невозможно оÑмениÑÑ, Ñайл ÑеÑÑии бÑÐ´ÐµÑ Ð¿ÐµÑезапиÑан."
-#: editor_ops.cc:7122
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5973,144 +6353,140 @@ msgstr ""
"\n"
"ÐÑо дейÑÑвие не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ñменено и Ñайл ÑеÑÑии бÑдÑÑ Ð¿ÐµÑезапиÑан"
-#: editor_ops.cc:7129
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "Ðа, ÑдалиÑÑ Ð¸Ñ
."
-#: editor_ops.cc:7131 editor_snapshots.cc:172
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Ðа, ÑдалиÑÑ"
-#: editor_ops.cc:7136 editor_ops.cc:7138
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "УдалиÑÑ %1"
-#: editor_ops.cc:7240 editor_ops.cc:7254 editor_ops.cc:7294 editor_ops.cc:7304
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "ÐÑÑавка вÑемени"
-#: editor_ops.cc:7357
+#: editor_ops.cc:7436
msgid "Cannot insert or delete time when in Lock edit."
msgstr ""
-#: editor_ops.cc:7377 editor_ops.cc:7389 editor_ops.cc:7462
-msgid "cut time"
-msgstr ""
-
-#: editor_ops.cc:7475
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
msgid "remove time"
msgstr ""
-#: editor_ops.cc:7549
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr "Такое колиÑеÑÑво доÑожек в окне не помеÑÑиÑÑÑ"
-#: editor_ops.cc:7610
+#: editor_ops.cc:7689
msgid "Sel"
msgstr "ÐÑб."
-#: editor_ops.cc:7649
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr "СоÑ
ÑаненнÑй вид %u"
-#: editor_ops.cc:7674
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "ÐÑиглÑÑение облаÑÑей"
-#: editor_ops.cc:7676
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "ÐÑиглÑÑение облаÑÑи"
-#: editor_ops.cc:7713
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "ÐбÑединение облаÑÑей"
-#: editor_ops.cc:7751
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr "РазÑединение облаÑÑей"
-#: editor_ops.cc:7788
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr "%1: заблокиÑовано"
-#: editor_ops.cc:7795
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr "СнÑÑÑ Ð·Ð°Ð¼Ð¾Ðº"
-#: editor_ops.cc:7844
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr "ÐеÑемеÑение вÑÑÑоеннÑÑ
Ñайлов в папке ÑеÑÑии"
-#: editor_regions.cc:115
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr "Ðазвание Ñегиона Ñ ÑиÑлом каналов в []'Ñ"
-#: editor_regions.cc:116
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "Ðоложение наÑала облаÑÑи"
-#: editor_regions.cc:117 editor_regions.cc:863 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "ÐонеÑ"
-#: editor_regions.cc:117
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "Ðоложение конÑа облаÑÑи"
-#: editor_regions.cc:118
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "ÐлиÑелÑноÑÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: editor_regions.cc:119
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr "Ðоложение ÑоÑки облаÑÑи ÑинÑ
ÑонизаÑии оÑноÑиÑелÑно наÑала Ñегиона"
-#: editor_regions.cc:120
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr "Ðлина облаÑÑи наÑаÑÑÐ°Ð½Ð¸Ñ (единиÑÑ: вÑоÑой ÑÑÑÑÑик), (), еÑли оÑклÑÑен"
-#: editor_regions.cc:121
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr "Ðлина облаÑÑи заÑÑÑ
Ð°Ð½Ð¸Ñ (единиÑÑ: вÑоÑой ÑÑÑÑÑик), (), еÑли оÑклÑÑенÑ"
-#: editor_regions.cc:122
+#: editor_regions.cc:166
msgid "Lock|L"
msgstr "Ð"
-#: editor_regions.cc:122
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "ÐозиÑÐ¸Ñ Ð¾Ð±Ð»Ð°ÑÑи заблокиÑована?"
-#: editor_regions.cc:123
+#: editor_regions.cc:167
msgid "Gain|G"
msgstr "У"
-#: editor_regions.cc:123
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr "ÐÑиклеиÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ñегиона к вÑемени ÐаÑ|ÐиÑ?"
-#: editor_regions.cc:124
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "ÐблаÑÑÑ Ð¿ÑиглÑÑена?"
-#: editor_regions.cc:125
+#: editor_regions.cc:169
msgid "Opaque|O"
msgstr "Ð"
-#: editor_regions.cc:125
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr "ÐепÑозÑаÑноÑÑÑ Ñегиона (блоки Ñегионов под ним ÑлÑÑимÑ)?"
-#: editor_regions.cc:315 editor_regions.cc:320 editor_regions.cc:322
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "СкÑÑÑÑй"
-#: editor_regions.cc:395
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr "(ÐТСУТСТÐУÐТ) "
-#: editor_regions.cc:463
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -6118,121 +6494,133 @@ msgstr ""
"ÐÑ Ð´ÐµÐ¹ÑÑвиÑелÑно Ñ
оÑиÑе ÑдалиÑÑ Ð½ÐµÐ¸ÑполÑзÑемÑе облаÑÑи?\n"
"ÐÑмениÑÑ ÑÑо дейÑÑвие бÑÐ´ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾."
-#: editor_regions.cc:467
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "Ðа, ÑдалиÑÑ"
-#: editor_regions.cc:469
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "УдалиÑÑ Ð½ÐµÐ¸ÑполÑзÑемÑе облаÑÑи"
-#: editor_regions.cc:698
+#: editor_regions.cc:735
msgid "EditorRegions::format_position: negative timecode position: %1"
-msgstr ""
+msgstr "EditorRegions::format_position: негаÑÐ¸Ð²Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ñайм-кода: %1"
-#: editor_regions.cc:828 editor_regions.cc:844 editor_regions.cc:858
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "ÐеÑк."
-#: editor_regions.cc:861 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "ÐаÑало"
-#: editor_regions.cc:879 editor_regions.cc:895
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "ÐеÑколÑко"
-#: editor_regions.cc:964
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "(ÐТСУТСТÐУÐТ) "
-#: editor_routes.cc:184
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr "СС"
-#: editor_routes.cc:208
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "Ðазвание доÑожи/ÑинÑ"
-#: editor_routes.cc:209
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "ÐоÑожка или Ñина видима?"
-#: editor_routes.cc:210
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "ÐоÑожка или Ñина акÑивна?"
-#: editor_routes.cc:211
+#: editor_routes.cc:236
msgid "MidiInput|I"
msgstr "ÐÑ
"
-#: editor_routes.cc:211
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "ÐÑ
од MIDI вклÑÑен"
-#: editor_routes.cc:212
+#: editor_routes.cc:237
msgid "Rec|R"
msgstr "Ð"
-#: editor_routes.cc:212
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "ÐоÑовноÑÑÑ Ðº запиÑи"
-#: editor_routes.cc:213
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "ÐÑигл."
-#: editor_routes.cc:214
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "СолиÑ."
-#: editor_routes.cc:215
+#: editor_routes.cc:241
msgid "SoloIso|SI"
msgstr "ÐС"
-#: editor_routes.cc:215
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "ÐзолиÑование Ñоло"
-#: editor_routes.cc:216
+#: editor_routes.cc:242
msgid "SoloLock|SS"
msgstr "ÐС"
-#: editor_routes.cc:216
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "СоÑ
Ñ. Ñоло (закÑÑÑ)"
-#: editor_routes.cc:486 mixer_ui.cc:1259
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "СкÑÑÑÑ Ð²ÑÑ"
-#: editor_routes.cc:487 mixer_ui.cc:1260
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "ÐоказаÑÑ Ð²Ñе звÑковÑе доÑожки"
-#: editor_routes.cc:488 mixer_ui.cc:1261
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "СкÑÑÑÑ Ð²Ñе звÑковÑе доÑожки"
-#: editor_routes.cc:489 mixer_ui.cc:1262
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "ÐоказаÑÑ Ð²Ñе звÑковÑе ÑинÑ"
-#: editor_routes.cc:490 mixer_ui.cc:1263
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "СкÑÑÑÑ Ð²Ñе звÑковÑе ÑинÑ"
-#: editor_routes.cc:491 mixer_ui.cc:1264
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "ÐоказаÑÑ Ð²Ñе MIDI-доÑожки"
-#: editor_routes.cc:492 mixer_ui.cc:1265
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "СкÑÑÑÑ Ð²Ñе MIDI-доÑожки"
-#: editor_routes.cc:493
+#: editor_routes.cc:557
msgid "Only Show Tracks with Regions Under Playhead"
-msgstr ""
+msgstr "ÐоказÑваÑÑ ÑолÑко доÑожки Ñ Ð¾Ð±Ð»Ð°ÑÑÑми под ÑказаÑелем"
#: editor_rulers.cc:212
msgid "New location marker"
@@ -6274,7 +6662,7 @@ msgstr "СоздаÑÑ Ð¼Ð°ÑÐºÐµÑ Ð´Ð¾Ñожки CD"
msgid "New Tempo"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾Ð²Ñй Ñемп"
-#: editor_rulers.cc:238 tempo_dialog.cc:315
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾Ð²Ñй ÑазмеÑ"
@@ -6298,31 +6686,35 @@ msgstr ""
msgid "Remove snapshot"
msgstr "УдалиÑÑ Ñнимок"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "ÐобавиÑÑ"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "Ðобавка маÑÐºÐµÑ Ñемпа"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "ÐобавиÑÑ"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "Ðобавка маÑкеÑа ÑазмеÑа"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "ÐоÑово"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "Ðамена маÑкеÑа Ñемпа"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "Удаление маÑкеÑа Ñемпа"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -6336,7 +6728,7 @@ msgstr "РаÑÑÑнÑÑÑ Ð¸Ð»Ð¸ ÑжаÑÑ"
msgid "pitch shift"
msgstr "Смена вÑÑоÑÑ Ñона"
-#: editor_timefx.cc:304
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr "Timefx не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑÑен, оÑибка пÑи Ñоздании поÑока"
@@ -6352,27 +6744,31 @@ msgstr "ÐаÑÑÑойка MIDI-ÑÑÑÑойÑÑва"
msgid "Refresh Devices"
msgstr "ÐбновиÑÑ ÑпиÑок ÑÑÑÑойÑÑв"
-#: engine_dialog.cc:90 engine_dialog.cc:2923
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr "ÐзмеÑиÑÑ"
-#: engine_dialog.cc:91
+#: engine_dialog.cc:92
msgid "Use results"
msgstr "ÐÑполÑзоваÑÑ ÑезÑлÑÑаÑÑ"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr "ÐакÑÑÑÑ Ð¸ не иÑполÑзоваÑÑ"
-#: engine_dialog.cc:93
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr "ÐалибÑовка аÑдио"
-#: engine_dialog.cc:97
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr "ÐозвÑÐ°Ñ Ðº наÑÑÑойкам"
-#: engine_dialog.cc:118
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
@@ -6382,11 +6778,11 @@ msgstr ""
"\n"
"(ÐÑо оÑибка ÑбоÑки/Ñпаковки/ÑиÑÑемÑ, она никогда не должна пÑоиÑÑ
одиÑÑ.)"
-#: engine_dialog.cc:143
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr "ТеÑÑиÑование задеÑжки оÑклика"
-#: engine_dialog.cc:155
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
@@ -6394,98 +6790,99 @@ msgstr ""
"<span weight=\"bold\">УбеÑиÑе гÑомкоÑÑÑ Ð²ÑÑ
ода ваÑей звÑковой каÑÑÑ Ð´Ð¾ "
"минимÑма </span>"
-#: engine_dialog.cc:164
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr "ÐÑбеÑиÑе два канала ниже и ÑоединиÑÑ Ð¸Ñ
Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ°Ð±ÐµÐ»Ñ"
-#: engine_dialog.cc:169
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr "Ðанал вÑÑ
ода"
-#: engine_dialog.cc:177
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr "Ðанал вÑ
ода"
-#: engine_dialog.cc:211
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "Соединив каналÑ, нажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ Â«ÐзмеÑиÑÑ»."
-#: engine_dialog.cc:218
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
"ÐÑли ÑезÑлÑÑÐ°Ñ Ð²Ð°Ñ ÑÑÑÑаиваеÑ, нажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ Â«ÐÑполÑзоваÑÑ ÑезÑлÑÑаÑÑ»."
-#: engine_dialog.cc:233 engine_dialog.cc:3058 engine_dialog.cc:3068
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr "Ðока Ð½ÐµÑ ÑезÑлÑÑаÑов измеÑениÑ"
-#: engine_dialog.cc:243 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "ÐадеÑжка оÑклика"
-#: engine_dialog.cc:497
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr "ÐвÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´ÑиÑÑема:"
-#: engine_dialog.cc:540
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "ÐÑайвеÑ:"
-#: engine_dialog.cc:547
+#: engine_dialog.cc:571
msgid "Input Device:"
msgstr "УÑÑÑойÑÑво запиÑи:"
-#: engine_dialog.cc:551
+#: engine_dialog.cc:575
msgid "Output Device:"
msgstr "УÑÑÑойÑÑво вÑвода:"
-#: engine_dialog.cc:558
+#: engine_dialog.cc:582
msgid "Device:"
msgstr "УÑÑÑойÑÑво:"
-#: engine_dialog.cc:567 engine_dialog.cc:681 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "ЧаÑÑоÑа ÑÑмплиÑованиÑ:"
-#: engine_dialog.cc:573 engine_dialog.cc:688
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "Ð Ð°Ð·Ð¼ÐµÑ Ð±ÑÑеÑа:"
-#: engine_dialog.cc:582
+#: engine_dialog.cc:606
msgid "Periods:"
msgstr "ÐеÑиодов:"
-#: engine_dialog.cc:600
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr "Ðаналов вÑ
ода:"
-#: engine_dialog.cc:613
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr "Ðаналов вÑÑ
ода:"
-#: engine_dialog.cc:625
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "ÐадеÑжка аппаÑаÑнÑÑ
вÑ
одов:"
-#: engine_dialog.cc:628 engine_dialog.cc:641
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "ÑÑмплов"
-#: engine_dialog.cc:638
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "ÐадеÑжка аппаÑаÑнÑÑ
вÑÑ
одов:"
-#: engine_dialog.cc:649
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr "ÐодÑиÑÑема MIDI:"
-#: engine_dialog.cc:673
+#: engine_dialog.cc:691
msgid ""
"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
+"%1 Ñже запÑÑен. %2 бÑÐ´ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑен к немÑ, иÑполÑзÑÑ ÑÑÑеÑÑвÑÑÑие наÑÑÑойки."
-#: engine_dialog.cc:726
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
@@ -6495,7 +6892,7 @@ msgstr ""
"\n"
"ÐалибÑовка задеÑжки ÑÑебÑÐµÑ ÑабоÑий аÑдиоинÑеÑÑейÑ."
-#: engine_dialog.cc:732
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6505,156 +6902,163 @@ msgstr ""
"\n"
"ÐалибÑовка задеÑжки ÑÑебÑÐµÑ Ð²Ð¾ÑпÑоизведение и заÑ
ваÑ"
-#: engine_dialog.cc:938
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr "MIDI ÑÑÑÑойÑÑва"
-#: engine_dialog.cc:944
+#: engine_dialog.cc:971
msgid "Device"
msgstr "УÑÑÑойÑÑво"
-#: engine_dialog.cc:946
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr "ÐппаÑаÑнÑе задеÑжки"
-#: engine_dialog.cc:987
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr "ÐалибÑовка"
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr "ÐÑе доÑÑÑпнÑе каналÑ"
-#: engine_dialog.cc:1576 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "ÑÑмпл"
-msgstr[1] "ÑÑмпла"
-msgstr[2] "ÑÑмплов"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 ÑÑмпл"
+msgstr[1] "%1 ÑÑмпла"
+msgstr[2] "%1 ÑÑмплов"
-#: engine_dialog.cc:1640
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr "(%.1f мÑ)"
-#: engine_dialog.cc:2371
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð´Ð²Ð¸Ð¶Ð¾Ðº бекенда %1"
-#: engine_dialog.cc:2403
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr "Ðевозможно иÑполÑзоваÑÑ %1 в каÑеÑÑве дÑайвеÑа."
-#: engine_dialog.cc:2408
+#: engine_dialog.cc:2450
msgid "Cannot set input device name to %1"
msgstr ""
-#: engine_dialog.cc:2412
+#: engine_dialog.cc:2454
msgid "Cannot set output device name to %1"
msgstr ""
-#: engine_dialog.cc:2417
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr "Ðевозможно %1 в имени ÑÑÑÑойÑÑва."
-#: engine_dialog.cc:2422
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr "Ðевозможно иÑполÑзоваÑÑ %1 в ÑаÑÑоÑÑ ÑÑмплиÑованиÑ."
-#: engine_dialog.cc:2426
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr "Ðевозможно иÑполÑзоваÑÑ %1 в ÑазмеÑа бÑÑеÑа."
-#: engine_dialog.cc:2430
+#: engine_dialog.cc:2472
msgid "Cannot set periods to %1"
msgstr ""
-#: engine_dialog.cc:2436
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr "Ðе ÑдаеÑÑÑ ÑÑÑановиÑÑ Ð²Ñ
однÑе ÐºÐ°Ð½Ð°Ð»Ñ Ð² %1"
-#: engine_dialog.cc:2440
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr "Ðе ÑдаеÑÑÑ ÑÑÑановиÑÑ Ð²ÑÑ
однÑе ÐºÐ°Ð½Ð°Ð»Ñ Ð² %1"
-#: engine_dialog.cc:2446
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr "Ðе ÑдаеÑÑÑ ÑÑÑановиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð²Ñ
ода в %1"
-#: engine_dialog.cc:2450
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr "Ðе ÑдаеÑÑÑ ÑÑÑановиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð²ÑÑ
ода в %1"
-#: engine_dialog.cc:2781 engine_dialog.cc:2840
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr "Сигнал не обнаÑÑжен"
-#: engine_dialog.cc:2794 engine_dialog.cc:2848 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "ÐÑполнено оÑÑоединение Ð¾Ñ Ð·Ð²Ñкового движка"
-#: engine_dialog.cc:2803 engine_dialog.cc:2856
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr "ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑледÑÑÑие задеÑжки:"
-#: engine_dialog.cc:2805 engine_dialog.cc:2858
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr "СиÑÑÐµÐ¼Ð½Ð°Ñ Ð·Ð°Ð´ÐµÑжка:"
-#: engine_dialog.cc:2812
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr "(оÑибка обнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ñигнала)"
-#: engine_dialog.cc:2818
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr "(инвеÑÑиÑовано - плоÑ
Ð°Ñ Ð¿Ñоводка)"
-#: engine_dialog.cc:2865
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr "(ÑÑÑеднение)"
-#: engine_dialog.cc:2871
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr "(ÑлиÑком болÑÑое дÑожание)"
-#: engine_dialog.cc:2875
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr "(болÑÑое дÑожание)"
-#: engine_dialog.cc:2887
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr "Тайм-аÑÑ - болÑÑой MIDI джиÑÑеÑ."
-#: engine_dialog.cc:2903 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "ÐÑполнÑеÑÑÑ Ð¾Ð¿Ñеделение..."
-#: engine_dialog.cc:3004
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr "ÐÑÑоединиÑÑ Ð¾Ñ %1"
-#: engine_dialog.cc:3009
+#: engine_dialog.cc:3086
msgid "Running"
-msgstr ""
+msgstr "РабоÑаеÑ"
-#: engine_dialog.cc:3011
+#: engine_dialog.cc:3088
msgid "Connected"
-msgstr ""
+msgstr "Соединено"
-#: engine_dialog.cc:3022
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr "СоединиÑÑ Ñ %1"
-#: engine_dialog.cc:3026 shuttle_control.cc:614
+#: engine_dialog.cc:3103 shuttle_control.cc:663
msgid "Stopped"
msgstr "ÐÑÑановлено"
-#: export_channel_selector.cc:51 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Ðаналов:"
-#: export_channel_selector.cc:52
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "РазделиÑÑ Ð½Ð° моноÑониÑеÑкие ÑайлÑ"
@@ -6662,39 +7066,39 @@ msgstr "РазделиÑÑ Ð½Ð° моноÑониÑеÑкие ÑайлÑ"
msgid "Bus or Track"
msgstr "Шина или доÑожка"
-#: export_channel_selector.cc:473
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr "СодеÑжание облаÑÑи без Ñейдов и ÑÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑи (каналов: %1)"
-#: export_channel_selector.cc:477
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr "СодеÑжание облаÑÑи Ñ Ñейдами и ÑÑилением облаÑÑи (каналов: %1)"
-#: export_channel_selector.cc:481
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr "ÐÑÑ
од доÑожки (каналов: %1)"
-#: export_channel_selector.cc:550
+#: export_channel_selector.cc:552
msgid "Apply track/bus processing"
msgstr "ÐÑимениÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð² доÑожкаÑ
и ÑинаÑ
"
-#: export_channel_selector.cc:551
+#: export_channel_selector.cc:553
msgid "Select all tracks"
msgstr "ÐÑбÑаÑÑ Ð²Ñе доÑожки"
-#: export_channel_selector.cc:552
+#: export_channel_selector.cc:554
msgid "Select all busses"
msgstr "ÐÑбÑаÑÑ Ð²Ñе ÑинÑ"
-#: export_channel_selector.cc:553
+#: export_channel_selector.cc:555
msgid "Deselect all"
msgstr "СнÑÑÑ Ð²Ñделение"
-#: export_channel_selector.cc:587
+#: export_channel_selector.cc:589
msgid "Track name"
msgstr "Ðазвание доÑожки"
-#: export_dialog.cc:46
+#: export_dialog.cc:49
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
@@ -6702,24 +7106,24 @@ msgstr ""
"<span color=\"#ffa755\">ÐекоÑоÑÑе Ñже ÑÑÑеÑÑвÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð±ÑдÑÑ Ð¿ÐµÑезапиÑанÑ."
"</span>"
-#: export_dialog.cc:47
+#: export_dialog.cc:50
msgid "List files"
msgstr "СпиÑок Ñайлов"
-#: export_dialog.cc:156 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
msgid "File format"
msgstr "ФоÑмаÑ"
-#: export_dialog.cc:157 export_timespan_selector.cc:371
-#: export_timespan_selector.cc:433
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
msgid "Time Span"
msgstr "ÐÑÑезок вÑемени"
-#: export_dialog.cc:158
+#: export_dialog.cc:165
msgid "Channels"
msgstr "ÐаналÑ"
-#: export_dialog.cc:180
+#: export_dialog.cc:187
msgid ""
"Export has been aborted due to an error!\n"
"See the Log for details."
@@ -6727,39 +7131,56 @@ msgstr ""
"ÐкÑпоÑÑ Ð±Ñл пÑеÑван из-за оÑибки!\n"
"См. вÑвод Ð´Ð»Ñ Ð´ÐµÑалей."
-#: export_dialog.cc:249
+#: export_dialog.cc:298
msgid "Files that will be overwritten"
msgstr "Ð¤Ð°Ð¹Ð»Ñ Ð±ÑдÑÑ Ð¿ÐµÑезапиÑанÑ"
-#: export_dialog.cc:294
+#: export_dialog.cc:343
msgid "Export initialization failed: %1"
msgstr "Сбой иниÑиализаÑии ÑкÑпоÑÑа: %1"
-#: export_dialog.cc:304
+#: export_dialog.cc:353
msgid "Stop Export"
msgstr "ÐÑÑановиÑÑ ÑкÑпоÑÑ"
-#: export_dialog.cc:325
+#: export_dialog.cc:383
msgid "export"
msgstr "ÐкÑпоÑÑ"
-#: export_dialog.cc:344
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "ÐкÑпоÑÑиÑÑеÑÑÑ '%3' (оÑÑезок вÑемени %1 из %2)"
+
+#: export_dialog.cc:407
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr "ÐÑполнÑеÑÑÑ Ð½Ð¾ÑмиÑовка '%3' (вÑеменной оÑÑезок %1 из %2)"
-#: export_dialog.cc:348
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:412
+#, fuzzy
+msgid "Encoding '%3' (timespan %1 of %2)"
msgstr "ÐкÑпоÑÑиÑÑеÑÑÑ '%3' (оÑÑезок вÑемени %1 из %2)"
-#: export_dialog.cc:371 export_dialog.cc:373
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:453 export_dialog.cc:455
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">ÐÑибка: "
-#: export_dialog.cc:383
+#: export_dialog.cc:465
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">ÐÑедÑпÑеждение: "
-#: export_dialog.cc:385
+#: export_dialog.cc:467
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6767,19 +7188,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">ÐÑедÑпÑеждение: "
-#: export_dialog.cc:409
+#: export_dialog.cc:491
msgid "Export Selection"
msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð²Ñделение"
-#: export_dialog.cc:423
+#: export_dialog.cc:505
msgid "Export Region"
msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ"
-#: export_dialog.cc:432
+#: export_dialog.cc:514
msgid "Source"
msgstr "ÐÑÑоÑник"
-#: export_dialog.cc:448
+#: export_dialog.cc:530
msgid "Stem Export"
msgstr "ÐкÑпоÑÑиÑоваÑÑ ÐºÐ°Ð¶Ð´ÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð² Ñвой Ñайл"
@@ -6787,177 +7208,271 @@ msgstr "ÐкÑпоÑÑиÑоваÑÑ ÐºÐ°Ð¶Ð´ÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð² Ñвой Ñ
msgid "Add another format"
msgstr "ÐобавиÑÑ Ð´ÑÑгой ÑоÑмаÑ"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "ФоÑмаÑ"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "РаÑположение"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
-msgstr "ÐагÑÑзка на Soundcloud"
+msgstr "ÐагÑÑзиÑÑ Ð½Ð° Soundcloud"
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "ÐÑоанализиÑоваÑÑ ÑкÑпоÑÑиÑованнÑе даннÑе"
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "ФоÑÐ¼Ð°Ñ Ð½Ðµ вÑбÑан!"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "ФоÑÐ¼Ð°Ñ %1: %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "ÐеÑка:"
-#: export_filename_selector.cc:33 session_dialog.cc:310
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "Ðазвание ÑеÑÑии"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "ÐÑÑезок вÑемени"
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "РедакÑиÑ:"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Ðапка:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
#: video_server_dialog.cc:56 export_video_dialog.cc:77
#: export_video_dialog.cc:79
msgid "Browse"
msgstr "УказаÑÑ"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>СÑоÑмиÑоваÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñайлов из ÑледÑÑÑиÑ
компоненÑов:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "ÐÑкÑÑÑÑ Ð¿Ð°Ð¿ÐºÑ"
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "СобÑаÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñайлов из ÑледÑÑÑиÑ
ÑоÑÑавнÑÑ
ÑаÑÑей:"
-#: export_filename_selector.cc:208
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
"<small><i>ÐзвиниÑе, показаÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸ Ñайла ÑейÑÐ°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾</i></small>"
-#: export_filename_selector.cc:210
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>ТекÑÑее пÑедполагаемое Ð¸Ð¼Ñ Ñайла: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>ТекÑÑее (пÑиблизиÑелÑное) Ð¸Ð¼Ñ Ñайла</i>: \"%1\""
-#: export_filename_selector.cc:246 export_filename_selector.cc:332
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
"%1: ÑÑо ÑолÑко Ð¸Ð¼Ñ ÐºÐ°Ñалога/папки, но не Ð¸Ð¼Ñ Ñайла. \n"
-"ÐÐ¼Ñ Ñайла бÑÐ´ÐµÑ Ð²ÑбÑано из инÑоÑмаÑии ÑÑÑÑ Ð²ÑÑе папки СелекÑоÑ."
+"ÐÐ¼Ñ Ñайла бÑÐ´ÐµÑ Ð²ÑбÑано из инÑоÑмаÑии ÑÑÑÑ Ð²ÑÑе вÑбоÑÑика папки."
-#: export_filename_selector.cc:318
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr "%1: некоÑÑекÑное Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ или каÑалога"
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "ÐÑбеÑиÑе Ð¿Ð°Ð¿ÐºÑ Ð´Ð»Ñ ÑкÑпоÑÑа даннÑÑ
"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "СоздаÑÑ Ð¿ÑоÑÐ¸Ð»Ñ ÑоÑмаÑа ÑкÑпоÑÑа"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "ÐзмениÑÑ Ð¿ÑоÑÐ¸Ð»Ñ ÑоÑмаÑа ÑкÑпоÑÑа"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
-msgstr "Ðазвание:"
+msgstr "Ðазвание: "
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "ÐоÑмиÑоваÑÑ Ð´Ð¾:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "ÐоÑмиÑовка:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Ðиковое знаÑение"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr "ÐÑомкоÑÑÑ"
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr "LUFS"
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr "dBTP"
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "ÐÑÑезаÑÑ ÑиÑÐ¸Ð½Ñ Ð² наÑале"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "ÐобавиÑÑ ÑиÑÐ¸Ð½Ñ Ð² наÑало:"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "ÐÑÑезаÑÑ ÑиÑÐ¸Ð½Ñ Ð² наÑале"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "ÐобавиÑÑ ÑиÑÐ¸Ð½Ñ Ð² конеÑ:"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
+#, fuzzy
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
"Ðоманда Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка поÑле ÑкÑпоÑÑа\n"
"(%f=полнÑй пÑÑÑ Ð¸ Ð¸Ð¼Ñ Ñайла, %d=каÑалог, %b=базовое имÑ):"
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "СовмеÑÑимоÑÑÑ"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "ÐаÑеÑÑво"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "ÐаÑеÑÑво пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑаÑÑоÑÑ ÑÑмплиÑованиÑ:"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "ÐодмеÑивание ÑÑма"
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr "ÐапиÑаÑÑ Ñайл CUE Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ CD/DVD"
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr "ÐапиÑаÑÑ Ñайл TOC Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ CD/DVD"
-#: export_format_dialog.cc:72
+#: export_format_dialog.cc:80
msgid "Create chapter mark file for MP4 chapter marks"
msgstr ""
-#: export_format_dialog.cc:74
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "ÐобавиÑÑ Ð² Ñайла меÑаданнÑе ÑеÑÑии"
-#: export_format_dialog.cc:474
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr "â§"
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a ÐÐ¼Ñ Ð¸ÑполниÑелÑ\n"
+"%b Ðазовое Ð¸Ð¼Ñ Ñайла\n"
+"%c ÐвÑоÑÑкие пÑава\n"
+"%d ÐаÑалог Ñайла\n"
+"%f ÐолнÑй абÑолÑÑнÑй пÑÑÑ Ðº ÑайлÑ\n"
+"%l ÐвÑÐ¾Ñ Ð»Ð¸Ð±ÑеÑÑо/ÑекÑÑа пеÑни\n"
+"%n ÐÐ¼Ñ ÑеÑÑии\n"
+"%o ÐиÑижÑÑ\n"
+"%t Ðазвание\n"
+"%z ÐÑганизаÑиÑ\n"
+"%A ÐлÑбом\n"
+"%C ÐомменÑаÑий\n"
+"%E ÐÐ½Ð¶ÐµÐ½ÐµÑ Ð¿Ð¾ звÑкÑ\n"
+"%G ÐанÑ\n"
+"%L ÐбÑее ÑиÑло доÑожек\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "ÐаилÑÑÑее (sinc)"
-#: export_format_dialog.cc:479
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "СÑеднее (sinc)"
-#: export_format_dialog.cc:484
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "ÐÑÑÑÑо (sinc)"
-#: export_format_dialog.cc:494
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr "ÐÑлевой поÑÑдок ÑдеÑжаниÑ"
-#: export_format_dialog.cc:904
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "ÐаÑамеÑÑÑ Ð»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ð³Ð¾ кодиÑованиÑ"
-#: export_format_dialog.cc:920
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "ÐаÑамеÑÑÑ Ogg Vorbis"
-#: export_format_dialog.cc:931
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "ÐаÑамеÑÑÑ FLAC"
-#: export_format_dialog.cc:948
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "ÐаÑамеÑÑÑ Broadcast Wave"
@@ -6981,19 +7496,200 @@ msgstr ""
msgid "Do you really want to remove this preset?"
msgstr "ÐÑ Ð´ÐµÐ¹ÑÑвиÑелÑно Ñ
оÑиÑе ÑдалиÑÑ ÑÑÐ¾Ñ Ð¿ÑоÑилÑ?"
-#: export_timespan_selector.cc:44
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "Ðнализ ÑкÑпоÑÑиÑованнÑÑ
Ñайлов"
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "ФоÑмаÑ:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr "%1 ÐÑ"
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "ÐлиÑелÑноÑÑÑ:"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Тайм-код:"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "ÐÑибка:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr "Ðик по ÑÑмплам:"
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr "%1 dBFS"
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr "Ðик Ð¼ÐµÐ¶Ð´Ñ ÑÑмплами:"
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr "%1 dBTP"
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "УÑиление пÑи ноÑмиÑовке:"
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr "+888.88 Ðб"
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr "СÑеднÑÑ Ð³ÑомкоÑÑÑ:"
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr "%1 LUFS"
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "Ðиапазон гÑомкоÑÑи:"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr "%1 LU"
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr "100"
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr "00:00:00.000"
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr "%1 Ðб"
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr "Ðг"
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr "ÐÑ"
+
+#: export_report.cc:755
+msgid "500"
+msgstr "500"
+
+#: export_report.cc:756
+msgid "1K"
+msgstr "1Ð"
+
+#: export_report.cc:757
+msgid "5K"
+msgstr "5Ð"
+
+#: export_report.cc:758
+msgid "10K"
+msgstr "10Ð"
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr "ÐапиÑÑваеÑÑÑ Ð¸Ð·Ð¾Ð±Ñажение анализа: %1."
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Ðе ÑдалоÑÑ Ð¿ÑоÑиÑаÑÑ Ñайл: %1 (%2)"
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Файл недоÑÑÑпен: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr "-36"
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr "-18"
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr "-9"
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr "-3"
+
+#: export_timespan_selector.cc:45
msgid "Show Times as:"
msgstr "ÐоказаÑÑ Ð²ÑÐµÐ¼Ñ ÐºÐ°Ðº:"
-#: export_timespan_selector.cc:51 processor_box.cc:2839
+#: export_timespan_selector.cc:46
+#, fuzzy
+msgid "Realtime Export"
+msgstr "ÐкÑпоÑÑиÑоваÑÑ ÐºÐ°Ð¶Ð´ÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð² Ñвой Ñайл"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
msgid "Select All"
msgstr "ÐÑделиÑÑ Ð²ÑÑ"
-#: export_timespan_selector.cc:220 transform_dialog.cc:93
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
msgid " to "
msgstr " до "
-#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+#, fuzzy
+msgid "RT"
+msgstr "Ð"
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
msgid "Range"
msgstr "Ðиапазон"
@@ -7009,87 +7705,92 @@ msgstr "getSoundResourceFile: ÐÐµÑ Ð¿ÑавилÑного коÑÐ½Ñ Ð² Ñай
msgid "getSoundResourceFile: root = %1, != response"
msgstr "getSoundResourceFile: коÑÐµÐ½Ñ = %1, != оÑвеÑ"
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2276
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr "%1"
-#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:149 gain_meter.cc:962
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Режим авÑомаÑизаÑии ÑейдеÑа"
-#: gain_meter.cc:150 gain_meter.cc:963
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Тип авÑомаÑизаÑии ÑейдеÑа"
-#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:179 panner_ui.cc:641
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr "ÐбÑ"
-#: gain_meter.cc:795
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
msgid "M"
msgstr "Ð"
-#: gain_meter.cc:798
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "Сп"
-#: gain_meter.cc:801
+#: gain_meter.cc:822
msgid "T"
msgstr "Ð"
-#: gain_meter.cc:804
+#: gain_meter.cc:825
msgid "W"
msgstr "Ð"
-#: generic_pluginui.cc:85
+#: generic_pluginui.cc:83
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">ÐÑоÑили</span>"
-#: generic_pluginui.cc:100
+#: generic_pluginui.cc:99 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr "ÐÑÑÑнÑÑ"
-#: generic_pluginui.cc:109
+#: generic_pluginui.cc:108
msgid "All Automation"
msgstr "ÐÑÑ Ð°Ð²ÑомаÑизаÑиÑ"
-#: generic_pluginui.cc:253
-msgid "Switches"
-msgstr "ÐеÑеклÑÑаÑели"
-
-#: generic_pluginui.cc:263 generic_pluginui.cc:439 processor_box.cc:2817
-msgid "Controls"
-msgstr "УпÑавление"
-
-#: generic_pluginui.cc:296
+#: generic_pluginui.cc:259
msgid "Plugin Editor: could not build control element for port %1"
msgstr "РедакÑÐ¾Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²: невозможно ÑоздаÑÑ ÑпÑавлÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð¿Ð¾ÑÑа %1"
-#: generic_pluginui.cc:321
+#: generic_pluginui.cc:290
msgid "Plugin Editor: no control for property %1"
msgstr "РедакÑÐ¾Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²: Ð½ÐµÑ ÑегÑлÑÑоÑа Ð´Ð»Ñ ÑвойÑÑва %1"
-#: generic_pluginui.cc:327
+#: generic_pluginui.cc:296
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
"РедаÑÐºÐ¾Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°: не ÑдалоÑÑ ÑоздаÑÑ ÐºÐ¾Ð½ÑÑолÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ ÑвойÑÑва %1"
-#: generic_pluginui.cc:471
+#: generic_pluginui.cc:370
+msgid "Switches"
+msgstr "ÐеÑеклÑÑаÑели"
+
+#: generic_pluginui.cc:380 generic_pluginui.cc:486 processor_box.cc:3665
+msgid "Controls"
+msgstr "УпÑавление"
+
+#: generic_pluginui.cc:521
msgid "Meters"
msgstr "ÐндикаÑоÑÑ ÑÑовнÑ"
-#: generic_pluginui.cc:493
+#: generic_pluginui.cc:559
msgid "Automation control"
msgstr "ÐонÑÑÐ¾Ð»Ñ Ð°Ð²ÑомаÑизаÑии"
-#: generic_pluginui.cc:500
+#: generic_pluginui.cc:566
msgid "Mgnual"
msgstr "Mgnual"
+#: generic_pluginui.cc:831
+#, fuzzy
+msgid "This control cannot be automated"
+msgstr "ÐÑÐ¾Ñ Ð¿Ð¾ÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдалÑн."
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "УпÑавление звÑковÑми ÑоединениÑми"
@@ -7098,8 +7799,9 @@ msgstr "УпÑавление звÑковÑми ÑоединениÑми"
msgid "MIDI Connection Manager"
msgstr "УпÑавление MIDI-ÑоединениÑми"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:840
-#: mixer_strip.cc:941 monitor_section.cc:1341 monitor_selector.cc:189
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "ÐÑÑоединиÑÑ"
@@ -7107,59 +7809,83 @@ msgstr "ÐÑÑоединиÑÑ"
msgid "port"
msgstr "поÑÑ"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "ÐÑделениÑ..."
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "ÐоÑовÑÑ
к запиÑи..."
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "СолиÑÑÑÑиÑ
..."
-#: group_tabs.cc:321
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "СоздаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¸Ð·..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "СоздаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ñ Ð²ÐµÐ´ÑÑим каналом из..."
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "СоздаÑÑ Ð³ÑÑппÑ..."
-#: group_tabs.cc:324
-msgid "Create New Group From"
-msgstr "СоздаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¸Ð·"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "СоздаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ñ Ð²ÐµÐ´ÑÑим каналом из..."
-#: group_tabs.cc:327
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "ÐзмениÑÑ Ð³ÑÑппÑ..."
-#: group_tabs.cc:328
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr "СобÑаÑÑ Ð³ÑÑппÑ"
-#: group_tabs.cc:329
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "УдалиÑÑ Ð³ÑÑппÑ"
-#: group_tabs.cc:332
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr "ÐазнаÑиÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð²ÐµÐ´ÑÑÐµÐ¼Ñ ÐºÐ°Ð½Ð°Ð»Ñ..."
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr "УдалиÑÑ ÑÐ¸Ð½Ñ Ð¿Ð¾Ð´Ð³ÑÑппÑ"
-#: group_tabs.cc:334
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "ÐобавиÑÑ Ð½Ð¾Ð²ÑÑ ÑÐ¸Ð½Ñ Ð¿Ð¾Ð´Ð³ÑÑппÑ"
-#: group_tabs.cc:336
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr "ÐобавиÑÑ Ð½Ð¾Ð²ÑÑ Ð²Ð½ÐµÑнÑÑ ÑÐ¸Ð½Ñ (до ÑейдеÑа)"
-#: group_tabs.cc:337
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr "ÐобавиÑÑ Ð½Ð¾Ð²ÑÑ Ð²Ð½ÐµÑнÑÑ ÑÐ¸Ð½Ñ (поÑле ÑейдеÑа)"
-#: group_tabs.cc:343
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr "ÐазнаÑиÑÑ Ð²Ñделение ведÑÑÐµÐ¼Ñ ÐºÐ°Ð½Ð°Ð»Ñ..."
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr "ÐазнаÑиÑÑ Ð³Ð¾ÑовÑе к запиÑи ведÑÑÐµÐ¼Ñ ÐºÐ°Ð½Ð°Ð»Ñ..."
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr "ÐазнаÑиÑÑ ÑолиÑÑÑÑие ведÑÑÐµÐ¼Ñ ÐºÐ°Ð½Ð°Ð»Ñ..."
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr "ÐклÑÑиÑÑ Ð²Ñе гÑÑппÑ"
-#: group_tabs.cc:344
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "ÐÑклÑÑиÑÑ Ð²Ñе гÑÑппÑ"
@@ -7223,11 +7949,15 @@ msgstr ""
msgid "Insert time"
msgstr "ÐÑÑавиÑÑ"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "-неÑ-"
-#: interthread_progress_window.cc:104
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "ÐмпоÑÑиÑÑеÑÑÑ Ñайл: %1 из %2"
@@ -7243,58 +7973,87 @@ msgstr "%1 вÑ
од"
msgid "%1 output"
msgstr "%1 вÑÑ
од"
-#: keyboard.cc:82
+#: keyboard.cc:93
msgid "your own"
msgstr "ÐÐ°Ñ ÑобÑ."
-#: keyboard.cc:145 keyboard.cc:169
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
"ÐонÑигÑÑаÑÐ¸Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñий ÐºÐ»Ð°Ð²Ð¸Ñ Ð½ÐµÐ´Ð¾ÑÑÑпна - ÑабоÑаÑÑ Ñ %1 бÑÐ´ÐµÑ Ð½ÐµÐ¿ÑоÑÑо!"
-#: keyboard.cc:148
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr "Файл пÑивÑзки ÐºÐ»Ð°Ð²Ð¸Ñ \"%1\" не найден. ÐÑп. пÑивÑзки по ÑмолÑаниÑ"
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "ÐагÑÑзка комбинаÑий ÐºÐ»Ð°Ð²Ð¸Ñ Ð¸Ð· %1"
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr "ÐонÑÐ»Ð¸ÐºÑ ÐºÐ»Ð°Ð²Ð¸Ð°ÑÑÑнÑÑ
комбинаÑий"
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+"ÐÑо ÑоÑеÑание ÐºÐ»Ð°Ð²Ð¸Ñ Ñже иÑполÑзÑеÑÑÑ. СнаÑала ÑдалиÑе ÑÑÑеÑÑвÑÑÑÑÑ "
+"комбинаÑиÑ."
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "ÐлавиаÑÑÑнÑе комбинаÑии"
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr "УдалиÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°ÑиÑ"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "ÐейÑÑвие"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "ÐÑкаÑÑ..."
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "ÐомбинаÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr "ÐажмиÑе Ð´Ð»Ñ ÑбÑоÑа ÑÑÑоки поиÑка"
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "ÐÑбеÑиÑе дейÑÑвие и нажмиÑе комбинаÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr ""
-#: keyeditor.cc:98
+#: keyeditor.cc:109
msgid "Reset Bindings to Defaults"
msgstr "ÐеÑнÑÑÑ Ð¸ÑÑ
однÑе клавиаÑÑÑнÑе комбинаÑии"
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Ðлавное менÑ"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "ÐÐµÐ½Ñ Ð¿ÐµÑенапÑавлениÑ"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "ÐейÑÑвие"
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "РедакÑÐ¾Ñ Ð¼ÐµÐ½Ñ"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "ÐомбинаÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ"
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr "СпиÑок облаÑÑей"
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "ÐÐµÐ½Ñ Ð¾Ð±ÑабоÑÑика"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+#, fuzzy
+msgid "Could not save bindings to file (%1)"
+msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð´Ð²Ð¸Ð¶Ð¾Ðº бекенда %1"
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "ÑÑмпл"
#: latency_gui.cc:40
msgid "msec"
@@ -7304,38 +8063,35 @@ msgstr "мÑ"
msgid "period"
msgstr "ÐеÑиод"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 ÑÑмпл"
-msgstr[1] "%1 ÑÑмпла"
-msgstr[2] "%1 ÑÑмплов"
-
-#: latency_gui.cc:72 panner_ui.cc:411 plugin_ui.cc:421
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:422
msgid "Reset"
msgstr "СбÑоÑиÑÑ"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1909
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "ÐÑибка в пÑогÑамме: %1 (%2)"
-#: location_ui.cc:54 location_ui.cc:56
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "Ðо ÑказаÑелÑ"
-#: location_ui.cc:61
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "ÐеÑейÑи"
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "ÐÑиклеиÑÑ"
-#: location_ui.cc:89
+#: location_ui.cc:88
msgid "Performer:"
msgstr "ÐÑполниÑелÑ:"
-#: location_ui.cc:90
+#: location_ui.cc:89
msgid "Composer:"
msgstr "ÐомпозиÑоÑ:"
-#: location_ui.cc:92
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "ÐÑед. акÑенÑ"
@@ -7371,43 +8127,153 @@ msgstr "ÐозиÑÐ¸Ñ - ÑÑедний клик, ÑÑÐ¾Ð±Ñ ÑазмеÑÑиÑ
msgid "Set marker time from playhead location"
msgstr "УÑÑановиÑÑ Ð¼Ð°ÑÐºÐµÑ Ð²Ñемени по меÑÑÑ Ð²Ð¾ÑпÑоизведениÑ"
-#: location_ui.cc:501
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "РазмеÑение маÑкеÑа CD в наÑале ÑеÑÑии невозможно"
-#: location_ui.cc:727
+#: location_ui.cc:750
msgid "New Marker"
msgstr "СоздаÑÑ Ð¼Ð°ÑкеÑ"
-#: location_ui.cc:728
+#: location_ui.cc:751
msgid "New Range"
msgstr "СоздаÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½"
-#: location_ui.cc:741
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>ÐÐ¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð¿ÐµÑелÑ/вÑезок</b>"
-#: location_ui.cc:766
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>ÐаÑкеÑÑ (вклÑÑÐ°Ñ Ð¸Ð½Ð´ÐµÐºÑ CD)</b>"
-#: location_ui.cc:801
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>ÐÐ¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ (вклÑÑÐ°Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð´Ð¾Ñожек CD)</b>"
-#: location_ui.cc:1044
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "Ðобавка маÑкеÑа вÑделениÑ"
-#: main.cc:86
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr "ÐобавиÑÑ/УÑÑановиÑÑ"
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr "ÐÑзов"
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "СигналÑ"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "ÐейÑÑвие %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "Ðе ÑдалоÑÑ Ð¿ÑоÑиÑаÑÑ ÑкÑÐ¸Ð¿Ñ '%1': %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "ÐÑполниÑÑ"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "ÐÑиÑÑиÑÑ Ð²Ñвод"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr "ÐеÑнÑÑÑ"
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "УдалÑн %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr "Ðе ÑдалоÑÑ ÑдалиÑÑ %1"
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr "Ðе ÑдалоÑÑ ÑкомпилиÑоваÑÑ ÑкÑипÑ."
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr "ÐекоÑÑекÑно или оÑÑÑÑÑÑвÑÐµÑ Ð¸Ð¼Ñ Ð¸Ð»Ð¸ Ñип ÑкÑипÑа."
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "СоÑ
Ñанено как %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "ÐÑибка пÑи ÑоÑ
Ñанении Ñайла: %1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "ÐейÑÑвие: '%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr "ФÑагменÑ: %1"
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "СоÑ
ÑаниÑÑ ÐºÐ°Ðº"
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
msgstr "%1 не ÑдалоÑÑ ÑоединиÑÑÑÑ Ñо звÑковой подÑиÑÑемой."
-#: main.cc:133 main.cc:149
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr "ÐÑибка аÑдиодвижка (%1), либо он бÑл оÑÑановлен"
-#: main.cc:136
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -7422,11 +8288,11 @@ msgstr ""
"\n"
"ÐажмиÑе OK, ÑÑÐ¾Ð±Ñ Ð²ÑйÑи из %1."
-#: main.cc:150
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
msgstr "%2 вÑÑел неожиданно и без ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ %1."
-#: main.cc:245
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
@@ -7434,23 +8300,23 @@ msgstr ""
"\n"
" %1 не ÑдалоÑÑ ÑазобÑаÑÑ Ð¿ÐµÑеданнÑе вами аÑгÑменÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки "
-#: main.cc:247
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr "ÐÑоизоÑла оÑибка пÑи запÑÑке %1"
-#: main.cc:340
+#: main.cc:350
msgid " (built using "
msgstr " (ÑобÑан, иÑполÑзÑÑ "
-#: main.cc:343
+#: main.cc:353
msgid " and GCC version "
msgstr ", пÑи помоÑи GCC веÑÑии "
-#: main.cc:353
+#: main.cc:363
msgid "Copyright (C) 1999-2015 Paul Davis"
msgstr "ÐвÑоÑÑкие пÑава (C) 1999-2015 Paul Davis"
-#: main.cc:354
+#: main.cc:364
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -7458,35 +8324,35 @@ msgstr ""
"ЧаÑÑиÑнÑе авÑоÑÑкие пÑава © Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
-#: main.cc:356
+#: main.cc:366
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 ÑаÑпÑоÑÑÑанÑеÑÑÑ ÐÐÐÐ ÐСЯÐÐÐ¥ ÐÐÐ ÐÐТÐÐ"
-#: main.cc:357
+#: main.cc:367
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr "Ðаже не Ð´Ð»Ñ ÐÐÐÐÐРЦÐРили ÐÐ ÐÐÐÐÐÐСТРРÐÐÐÐÐ ÐТÐЫРЦÐÐЯÐ."
-#: main.cc:358
+#: main.cc:368
msgid "This is free software, and you are welcome to redistribute it "
msgstr "ÐÑо Ñвободное пÑогÑаммное обеÑпеÑение, ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑаÑпÑоÑÑÑанÑÑÑ ÐµÐ³Ð¾"
-#: main.cc:359
+#: main.cc:369
msgid "under certain conditions; see the source for copying conditions."
msgstr "Ðа опÑеделÑннÑÑ
ÑÑловиÑÑ
; подÑобнее об ÑÑом ÑиÑайÑе в Ñайле COPYING."
-#: main.cc:364
+#: main.cc:374
msgid "could not initialize %1."
msgstr "Ðе ÑдалоÑÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ %1."
-#: main.cc:374
+#: main.cc:384
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Сбой ÑÑÑановки обÑабоÑÑика оÑибок SIGPIPE"
-#: main.cc:379
+#: main.cc:391
msgid "Could not complete pre-GUI initialization"
msgstr ""
-#: main.cc:386
+#: main.cc:398
msgid "could not create %1 GUI"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ Ð³ÑаÑиÑеÑкий инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ %1"
@@ -7494,11 +8360,11 @@ msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ Ð³ÑаÑиÑеÑкий инÑеÑÑе
msgid "Display delta to edit cursor"
msgstr "ÐоказÑваÑÑ ÑазниÑÑ Ñ ÐºÑÑÑоÑом ÑедакÑоÑа"
-#: main_clock.cc:66 tempo_dialog.cc:54
+#: main_clock.cc:66 tempo_dialog.cc:55
msgid "Edit Tempo"
msgstr "ÐзмениÑÑ Ñемп"
-#: main_clock.cc:67 tempo_dialog.cc:326
+#: main_clock.cc:67 tempo_dialog.cc:429
msgid "Edit Meter"
msgstr "ÐзмениÑÑ ÑазмеÑ"
@@ -7515,8 +8381,8 @@ msgid "MarkerText"
msgstr ""
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:2017
-#: rc_option_editor.cc:2663 sfdb_ui.cc:670
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "ÐеÑ"
@@ -7705,83 +8571,79 @@ msgstr "Ðазвание поÑÑа:"
msgid "MidiPortDialog"
msgstr "MidiPortDialog"
-#: midi_region_view.cc:849
+#: midi_region_view.cc:855
msgid "channel edit"
msgstr "ÐÑавка канала"
-#: midi_region_view.cc:885
+#: midi_region_view.cc:891
msgid "velocity edit"
msgstr "ÐÑавка ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑиÑ"
-#: midi_region_view.cc:944
+#: midi_region_view.cc:958
msgid "add note"
msgstr "Ðобавка ноÑÑ"
-#: midi_region_view.cc:1872
+#: midi_region_view.cc:1902
msgid "step add"
msgstr "ÐобавиÑÑ Ñаг"
-#: midi_region_view.cc:1966 midi_region_view.cc:1989
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
msgid "alter patch change"
msgstr "Смена Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°ÑÑа"
-#: midi_region_view.cc:2025
+#: midi_region_view.cc:2055
msgid "add patch change"
msgstr "Ðобавка ÑÐ¼ÐµÐ½Ñ Ð¿ÑогÑаммÑ"
-#: midi_region_view.cc:2047 midi_region_view.cc:2048
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
msgid "move patch change"
msgstr "ÐеÑемеÑение ÑÐ¼ÐµÐ½Ñ Ð¿ÑогÑаммÑ"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
msgid "delete patch change"
msgstr "Удаление ÑÐ¼ÐµÐ½Ñ Ð¿ÑогÑаммÑ"
-#: midi_region_view.cc:2099
+#: midi_region_view.cc:2129
msgid "delete selection"
msgstr "Удаление вÑделениÑ"
-#: midi_region_view.cc:2116
+#: midi_region_view.cc:2146
msgid "delete note"
msgstr "Удаление ноÑÑ"
-#: midi_region_view.cc:2575
+#: midi_region_view.cc:2587
msgid "move notes"
msgstr "ÐеÑемеÑение ноÑÑ"
-#: midi_region_view.cc:3110
+#: midi_region_view.cc:3137
msgid "change velocities"
msgstr "Смена ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑиÑ"
-#: midi_region_view.cc:3176
+#: midi_region_view.cc:3203
msgid "transpose"
msgstr "ТÑанÑпозиÑиÑ"
-#: midi_region_view.cc:3204
+#: midi_region_view.cc:3231
msgid "change note lengths"
msgstr "Смена длиÑелÑноÑÑи ноÑ"
-#: midi_region_view.cc:3280
+#: midi_region_view.cc:3307
msgid "nudge"
msgstr "ТолÑок"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3322
msgid "change channel"
msgstr "Смена канала"
-#: midi_region_view.cc:3333
+#: midi_region_view.cc:3370
msgid "Bank "
msgstr "Ðанк"
-#: midi_region_view.cc:3334
-msgid "Program "
-msgstr "ÐÑогÑамма"
-
-#: midi_region_view.cc:3335
+#: midi_region_view.cc:3372
msgid "Channel "
msgstr "Ðанал"
-#: midi_region_view.cc:3522
+#: midi_region_view.cc:3559
msgid "paste"
msgstr "ÐÑÑавка"
@@ -7797,108 +8659,108 @@ msgstr "пÑÑаÑÑÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ MIDI-облаÑÑÑ Ð±ÐµÐ· модел
msgid "failed to create MIDI region"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ MIDI-облаÑÑÑ"
-#: midi_time_axis.cc:316
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "ÐнеÑнее MIDI-ÑÑÑÑойÑÑво"
-#: midi_time_axis.cc:317
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "Режим внеÑнего ÑÑÑÑойÑÑва"
-#: midi_time_axis.cc:325
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr "Ðнл"
-#: midi_time_axis.cc:327
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr "ЩÑлкниÑе Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов каналов"
-#: midi_time_axis.cc:526
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "ÐоказаÑÑ Ð²Ñе окÑавÑ"
-#: midi_time_axis.cc:531
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "УмеÑÑиÑÑ ÑодеÑжимое"
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "ÐоÑнÑй диапазон"
-#: midi_time_axis.cc:536
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "Режим пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ñ"
-#: midi_time_axis.cc:537
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr "ÐÑÐ±Ð¾Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð²"
-#: midi_time_axis.cc:542
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "Режим ÑаÑкÑаÑиваниÑ"
-#: midi_time_axis.cc:601
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr "ÐÑÑоÑа Ñона"
-#: midi_time_axis.cc:605
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "Сила нажаÑиÑ"
-#: midi_time_axis.cc:617
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr "ÐонÑÑоллеÑÑ"
-#: midi_time_axis.cc:622
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "ÐÐµÑ Ð²ÑбÑаннÑÑ
каналов MIDI"
-#: midi_time_axis.cc:679 midi_time_axis.cc:808
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "СкÑÑÑÑ Ð²Ñе каналÑ"
-#: midi_time_axis.cc:683 midi_time_axis.cc:812
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "ÐоказаÑÑ Ð²Ñе каналÑ"
-#: midi_time_axis.cc:694 midi_time_axis.cc:823
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "Ðанал %1"
-#: midi_time_axis.cc:949 midi_time_axis.cc:981
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "ÐонÑÑоллеÑÑ %1-%2"
-#: midi_time_axis.cc:972 midi_time_axis.cc:975
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr "ÐонÑÑÐ¾Ð»Ð»ÐµÑ %1"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "Ð¥ÑомаÑиÑеÑкие"
-#: midi_time_axis.cc:1005
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "ÐеÑкÑÑÑиÑ"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "ЦвеÑа ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑиÑ"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr "ЦвеÑа канала"
-#: midi_time_axis.cc:1039
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "Ð¦Ð²ÐµÑ Ð´Ð¾Ñожки"
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1620 midi_time_axis.cc:1630
-#: midi_time_axis.cc:1636
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr "ÐÑе"
-#: midi_time_axis.cc:1617 midi_time_axis.cc:1633
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr "Ðе вÑе"
@@ -7914,7 +8776,7 @@ msgstr "ÐвÑопÑокÑÑÑка"
msgid "Decimal"
msgstr "ÐеÑÑÑиÑнÑй"
-#: midi_tracer.cc:57 rc_option_editor.cc:1355
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "ÐклÑÑено"
@@ -7954,7 +8816,8 @@ msgstr "ÐÑопÑÑÑиÑÑ Ð²Ñе оÑÑÑÑÑÑвÑÑÑие ÑайлÑ"
msgid "Skip this file"
msgstr "ÐÑопÑÑÑиÑÑ ÑÑÐ¾Ñ Ñайл"
-#: missing_file_dialog.cc:57
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "ÐвÑковой"
@@ -7982,100 +8845,51 @@ msgstr ""
msgid "Click to choose an additional folder"
msgstr "ÐÑбеÑиÑе дополниÑелÑнÑÑ Ð¿Ð°Ð¿ÐºÑ:"
-#: missing_plugin_dialog.cc:29
-msgid "Missing Plugins"
-msgstr "ÐÑÑÑÑÑÑвÑÑÑие плагинÑ"
-
-#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
-msgid "OK"
-msgstr "ÐÐ"
-
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "ÐеÑеклÑÑиÑÑ Ñоло в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "ÐеÑекл. глÑÑение в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "ÐеÑекл. иÑполÑзоание запиÑи в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "УменÑÑиÑÑ ÑÑиление в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "УвелиÑиÑÑ ÑÑиление в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "УÑÑановиÑÑ ÑÑиление на 0 ÑÑиление в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "СкопиÑоваÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "ÐÑÑезаÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "ÐÑÑавиÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "УдалиÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "ÐÑбÑаÑÑ Ð²Ñе (видимÑе) обÑабоÑÑики"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "ÐеÑеклÑÑиÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "ÐеÑеклÑÑиÑÑ Ð²ÑбÑаннÑе плагинÑ"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "СнÑÑÑ Ð²Ñделение Ñ Ð¿Ð¾Ð»Ð¾Ñ Ð¸ обÑабоÑÑиков"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "СпиÑок окон микÑеÑа влево"
+#: missing_plugin_dialog.cc:29
+msgid "Missing Plugins"
+msgstr "ÐÑÑÑÑÑÑвÑÑÑие плагинÑ"
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "ÐеÑеклÑÑиÑÑ Ð°ÐºÑивнÑй MIDIвÑ
од в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
+msgid "OK"
+msgstr "ÐÐ"
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "ÐагÑÑженнÑе пÑивÑзки микÑеÑа Ð¾Ñ %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
+"Ð ÑÑой ÑеÑÑии иÑполÑзÑÑÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ, коÑоÑÑе ÑейÑÐ°Ñ Ð¾ÑÑÑÑÑÑвÑÑÑ Ð² ÑиÑÑеме:\n"
+"\n"
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Ðе ÑдалоÑÑ Ð½Ð°Ð¹Ñи пÑивÑзки микÑеÑа в пÑÑи поиÑка %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+"\n"
+"Ðа меÑÑо ÑÑиÑ
плагинов вÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð½ÐµÐ°ÐºÑивнÑе заглÑÑки.\n"
+"РекомендÑеÑÑÑ ÑÑÑановиÑÑ Ð¾ÑÑÑÑÑÑвÑÑÑие Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Ð¸ заново загÑÑзиÑÑ ÑеÑÑиÑ.\n"
+"ÐÑоме Ñого, пÑовеÑÑÑе ÑÑÑнÑй ÑпиÑок, диалоги \"Ðкна > ÐÑÑнал\" и \n"
+"\"ÐÑавка > ÐаÑамеÑÑÑ > ÐлагинÑ\"."
-#: mixer_strip.cc:98 mixer_strip.cc:129
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "Ðо"
-#: mixer_strip.cc:101 mixer_strip.cc:132 mixer_strip.cc:387 mixer_strip.cc:1470
-#: rc_option_editor.cc:2949
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1548
+#: mixer_strip.cc:1559 rc_option_editor.cc:3147
msgid "Comments"
msgstr "ÐомменÑаÑии"
-#: mixer_strip.cc:155
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr "ЩÑлкниÑе Ð´Ð»Ñ Ð¿ÐµÑеклÑÑÐµÐ½Ð¸Ñ ÑиÑÐ¸Ð½Ñ Ð¿Ð¾Ð»Ð¾Ñки микÑеÑа"
-#: mixer_strip.cc:157
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
@@ -8083,325 +8897,396 @@ msgstr ""
"\n"
"%1-%2-ÑелÑок Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑиÑÐ¸Ð½Ñ Ð²ÑеÑ
полоÑ."
-#: mixer_strip.cc:164
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr "СкÑÑÑÑ Ð¿Ð¾Ð»Ð¾ÑÐºÑ Ð¼Ð¸ÐºÑеÑа"
-#: mixer_strip.cc:175
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr "ЩÑлкниÑе Ð´Ð»Ñ Ð²ÑбоÑа ÑоÑки замеÑа"
-#: mixer_strip.cc:191
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr "ÐзолиÑоваÑÑ Ñоло"
-#: mixer_strip.cc:199
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr "СÑаÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки ÑолиÑованиÑ"
-#: mixer_strip.cc:201 mixer_strip.cc:2113
+#: mixer_strip.cc:208 mixer_strip.cc:2225
msgid "SoloLock|Lock"
msgstr "Ðлок"
-#: mixer_strip.cc:202 mixer_strip.cc:2112
+#: mixer_strip.cc:209 mixer_strip.cc:2224
msgid "Iso"
msgstr "Ðзо."
-#: mixer_strip.cc:256
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "ÐÑÑппа микÑа"
-#: mixer_strip.cc:266
+#: mixer_strip.cc:275
msgid "Trim: "
msgstr "УÑиление: "
-#: mixer_strip.cc:383 rc_option_editor.cc:2945
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
msgid "Phase Invert"
msgstr "ÐнвеÑÑÐ¸Ñ ÑазÑ"
-#: mixer_strip.cc:384 rc_option_editor.cc:2946
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
msgid "Record & Monitor"
msgstr "ÐапиÑÑ Ð¸ мониÑоÑ"
-#: mixer_strip.cc:385 rc_option_editor.cc:2947
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
msgid "Solo Iso / Lock"
msgstr "Соло Iso / Ðлок"
-#: mixer_strip.cc:507
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr "ÐÑивÑзка к VCA"
+
+#: mixer_strip.cc:545
msgid "Show/Hide Monitoring Section"
msgstr "ÐоказаÑÑ Ð¸Ð»Ð¸ ÑкÑÑÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð¼Ð¾Ð½Ð¸ÑоÑинга"
-#: mixer_strip.cc:559
+#: mixer_strip.cc:590
msgid "Enable/Disable MIDI input"
msgstr "ÐклÑÑиÑÑ Ð¸Ð»Ð¸ вÑклÑÑиÑÑ MIDI-вÑ
од"
-#: mixer_strip.cc:726
+#: mixer_strip.cc:756
msgid "Aux"
msgstr "ÐÑÑ
"
-#: mixer_strip.cc:752
+#: mixer_strip.cc:782
msgid "Snd"
msgstr "ÐÑл"
-#: mixer_strip.cc:823 mixer_strip.cc:926 processor_box.cc:2759
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
"ÐÐµÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñо звÑковой подÑиÑÑемой, лÑбÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñ
ода-вÑÑ
ода "
"невозможнÑ."
-#: mixer_strip.cc:880 mixer_strip.cc:982
+#: mixer_strip.cc:911 mixer_strip.cc:1014
msgid "Add %1 port"
msgstr "ÐобавиÑÑ %1-поÑÑ"
-#: mixer_strip.cc:887 mixer_strip.cc:989 monitor_section.cc:1377
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr "ÐаÑÑиÑа маÑÑÑÑÑизаÑии"
-#: mixer_strip.cc:1218
+#: mixer_strip.cc:1298
msgid "MIDI "
msgstr "MIDI "
-#: mixer_strip.cc:1223
+#: mixer_strip.cc:1302
msgid "<b>INPUT</b> to %1"
msgstr "<b>ÐÐ¥ÐÐ</b> в %1"
-#: mixer_strip.cc:1226 monitor_section.cc:1422
+#: mixer_strip.cc:1304 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>ÐЫХÐÐ</b> из %1"
-#: mixer_strip.cc:1344 monitor_section.cc:1509
+#: mixer_strip.cc:1417 monitor_section.cc:1598
msgid "Disconnected"
msgstr "ÐÐµÑ ÑоединениÑ"
-#: mixer_strip.cc:1473
-msgid "*Comments*"
-msgstr "*ÐмÑ*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr "ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¸Ð»Ð¸ измениÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑий"
-#: mixer_strip.cc:1480
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
msgid "Cmt"
msgstr "ÐмÑ"
-#: mixer_strip.cc:1483
-msgid "*Cmt*"
-msgstr "*ÐмÑ*"
-
-#: mixer_strip.cc:1489
-msgid "Click to add/edit comments"
-msgstr "ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¸Ð»Ð¸ измениÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑий"
-
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1604
msgid "Grp"
msgstr "ÐÑп"
-#: mixer_strip.cc:1536
+#: mixer_strip.cc:1607
msgid "~G"
msgstr "нÐÑ"
-#: mixer_strip.cc:1565 route_time_axis.cc:573
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "ЦвеÑ..."
-#: mixer_strip.cc:1567 route_time_axis.cc:575
+#: mixer_strip.cc:1650 route_time_axis.cc:587
msgid "Comments..."
msgstr "ÐомменÑаÑии..."
-#: mixer_strip.cc:1569 route_time_axis.cc:577
+#: mixer_strip.cc:1652 route_time_axis.cc:589
msgid "Inputs..."
msgstr "ÐÑ
одÑ..."
-#: mixer_strip.cc:1571 route_time_axis.cc:579
+#: mixer_strip.cc:1654 route_time_axis.cc:591
msgid "Outputs..."
msgstr "ÐÑÑ
одÑ..."
-#: mixer_strip.cc:1576
+#: mixer_strip.cc:1659
msgid "Save As Template..."
msgstr "СоÑ
ÑаниÑÑ ÐºÐ°Ðº Ñаблон..."
-#: mixer_strip.cc:1582 route_group_dialog.cc:45 route_time_axis.cc:853
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
msgid "Active"
msgstr "ÐкÑивно"
-#: mixer_strip.cc:1590
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "СÑÑогий ввод/вÑвод"
+
+#: mixer_strip.cc:1683 plugin_ui.cc:424 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "ÐоÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°..."
+
+#: mixer_strip.cc:1687
msgid "Adjust Latency..."
msgstr "СкоÑÑекÑиÑоваÑÑ Ð·Ð°Ð´ÐµÑжкÑ..."
-#: mixer_strip.cc:1593
+#: mixer_strip.cc:1690
msgid "Protect Against Denormals"
msgstr "ÐаÑиÑаÑÑ Ð¾Ñ Ð¾Ñклонений"
-#: mixer_strip.cc:1599 route_time_axis.cc:592
-msgid "Remote Control ID..."
-msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ..."
-
-#: mixer_strip.cc:1617 route_time_axis.cc:869
+#: mixer_strip.cc:1709 route_time_axis.cc:867
msgid "Duplicate..."
msgstr "ÐÑодÑблиÑоваÑÑ..."
-#: mixer_strip.cc:1905
+#: mixer_strip.cc:2004
msgid "Pre"
msgstr "Ðо"
-#: mixer_strip.cc:1909
+#: mixer_strip.cc:2008
msgid "Post"
msgstr "ÐоÑле"
-#: mixer_strip.cc:1925
+#: mixer_strip.cc:2024
msgid "Meter|In"
msgstr "ÐÑ
"
-#: mixer_strip.cc:1929
+#: mixer_strip.cc:2028
msgid "Meter|Pr"
msgstr "ÐÑд"
-#: mixer_strip.cc:1933
+#: mixer_strip.cc:2032
msgid "Meter|Po"
msgstr "ÐÑл"
-#: mixer_strip.cc:1937
+#: mixer_strip.cc:2036
msgid "Meter|O"
msgstr "ÐÑÑ
"
-#: mixer_strip.cc:1942
+#: mixer_strip.cc:2041
msgid "Meter|C"
msgstr "Ð"
-#: mixer_strip.cc:2090 route_ui.cc:181
+#: mixer_strip.cc:2202 route_ui.cc:197
msgid "Disk"
msgstr "ÐиÑк"
-#: mixer_strip.cc:2092
+#: mixer_strip.cc:2204
msgid "Mon"
msgstr ""
-#: mixer_strip.cc:2105 monitor_section.cc:81
+#: mixer_strip.cc:2217 monitor_section.cc:81
msgid "AFL"
msgstr "AFL"
-#: mixer_strip.cc:2108 monitor_section.cc:82
+#: mixer_strip.cc:2220 monitor_section.cc:82
msgid "PFL"
msgstr "PFL"
-#: mixer_strip.cc:2118 meter_strip.cc:387
+#: mixer_strip.cc:2230 meter_strip.cc:385
msgid "MonitorInput|I"
msgstr "ÐÑ
"
-#: mixer_strip.cc:2119 meter_strip.cc:388
+#: mixer_strip.cc:2231 meter_strip.cc:386
msgid "MonitorDisk|D"
msgstr "Ð"
-#: mixer_strip.cc:2121
+#: mixer_strip.cc:2233
msgid "Mon|O"
msgstr ""
-#: mixer_strip.cc:2134 meter_strip.cc:379 route_time_axis.cc:2738
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
msgid "AfterFader|A"
msgstr "Ð"
-#: mixer_strip.cc:2137
+#: mixer_strip.cc:2249
msgid "Prefader|P"
msgstr "Ð"
-#: mixer_strip.cc:2142
+#: mixer_strip.cc:2254
msgid "SoloIso|I"
msgstr "Ð"
-#: mixer_strip.cc:2143
+#: mixer_strip.cc:2255
msgid "SoloLock|L"
msgstr "Ð"
-#: mixer_strip.cc:2348
+#: mixer_strip.cc:2460
msgid "Pre Fader"
msgstr "ÐÑедÑейдеÑ"
-#: mixer_strip.cc:2349
+#: mixer_strip.cc:2461
msgid "Post Fader"
msgstr "ÐоÑлеÑейдеÑ"
-#: mixer_strip.cc:2394 meter_strip.cc:860
+#: mixer_strip.cc:2506 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr "ÐоменÑÑÑ Ð²Ñе в гÑÑппе на %1"
-#: mixer_strip.cc:2396 meter_strip.cc:862
+#: mixer_strip.cc:2508 meter_strip.cc:860
msgid "Change all to %1"
msgstr "ÐоменÑÑÑ Ð²Ñе на %1"
-#: mixer_strip.cc:2398 meter_strip.cc:864
+#: mixer_strip.cc:2510 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr "ÐоменÑÑÑ Ð´Ð¾Ñожки одного Ñипа на %1"
-#: mixer_ui.cc:134 route_time_axis.cc:830
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "ÐÑÑппа"
-#: mixer_ui.cc:199
+#: mixer_ui.cc:221
msgid "Favorite Plugins"
msgstr "ÐзбÑаннÑе плагинÑ"
-#: mixer_ui.cc:1288
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr "ÐÑибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑлеменÑов UI в новÑе доÑожки/ÑÐ¸Ð½Ñ %1"
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr "ÐÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка Ð´Ð»Ñ Ð¿ÐµÑеименованного канала микÑеÑа не найден!"
-#: mixer_ui.cc:1382
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-вÑе-"
-#: mixer_ui.cc:2039
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "ÐаналÑ"
-#: mixer_ui.cc:2346
+#: mixer_ui.cc:2479
msgid "No Track/Bus is selected."
-msgstr ""
+msgstr "ÐÐµÑ Ð²ÑбÑаннÑÑ
доÑожек/Ñин"
-#: mixer_ui.cc:2348
+#: mixer_ui.cc:2481
msgid "Add at the top"
msgstr "ÐобавиÑÑ Ð² наÑало"
-#: mixer_ui.cc:2350
+#: mixer_ui.cc:2483
msgid "Add Pre-Fader"
msgstr "ÐобавиÑÑ Ð¿ÐµÑед ÑейдеÑом"
-#: mixer_ui.cc:2352
+#: mixer_ui.cc:2485
msgid "Add Post-Fader"
msgstr "ÐобавиÑÑ Ð¿Ð¾Ñле ÑейдеÑа"
-#: mixer_ui.cc:2354
+#: mixer_ui.cc:2487
msgid "Add at the end"
msgstr "ÐобавиÑÑ Ð² конеÑ"
-#: mixer_ui.cc:2360
+#: mixer_ui.cc:2493
msgid "Remove from favorites"
msgstr "УдалиÑÑ Ð¸Ð· избÑаннÑÑ
"
-#: mixer_ui.cc:2364
+#: mixer_ui.cc:2499
msgid "Delete Preset"
msgstr "УдалиÑÑ Ð¿ÑедÑÑÑановкÑ"
-#: meter_strip.cc:161
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "ÐеÑеклÑÑиÑÑ Ñоло в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "ÐеÑекл. глÑÑение в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "ÐеÑекл. иÑполÑзоание запиÑи в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "УменÑÑиÑÑ ÑÑиление в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "УвелиÑиÑÑ ÑÑиление в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "УÑÑановиÑÑ ÑÑиление на 0 ÑÑиление в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "СкопиÑоваÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "ÐÑÑезаÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "ÐÑÑавиÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "УдалиÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "ÐÑбÑаÑÑ Ð²Ñе (видимÑе) обÑабоÑÑики"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "ÐеÑеклÑÑиÑÑ Ð²ÑбÑаннÑе обÑабоÑÑики"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "ÐеÑеклÑÑиÑÑ Ð²ÑбÑаннÑе плагинÑ"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "СнÑÑÑ Ð²Ñделение Ñ Ð¿Ð¾Ð»Ð¾Ñ Ð¸ обÑабоÑÑиков"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "СпиÑок окон микÑеÑа влево"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "ÐеÑеклÑÑиÑÑ Ð°ÐºÑивнÑй MIDIвÑ
од в вÑбÑаннÑÑ
в микÑеÑе доÑожкаÑ
/ÑинаÑ
"
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr "СбÑÐ¾Ñ Ð¿Ð¸Ðº"
-#: meter_strip.cc:382 route_time_axis.cc:2742
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
msgid "PreFader|P"
msgstr "Ð"
-#: meter_strip.cc:896
+#: meter_strip.cc:894
msgid "Variable height"
msgstr "ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²ÑÑоÑа"
-#: meter_strip.cc:897
+#: meter_strip.cc:895
msgid "Short"
msgstr "ÐоÑоÑкий"
-#: meter_strip.cc:898
+#: meter_strip.cc:896
msgid "Tall"
msgstr "ÐÑÑокий"
-#: meter_strip.cc:899
+#: meter_strip.cc:897
msgid "Grande"
msgstr "Grande"
-#: meter_strip.cc:900
+#: meter_strip.cc:898
msgid "Venti"
msgstr "Venti"
@@ -8453,19 +9338,19 @@ msgstr "VU"
msgid "SiP"
msgstr "SiP"
-#: monitor_section.cc:111 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "СолиÑование"
-#: monitor_section.cc:115
+#: monitor_section.cc:117
msgid "Isolated"
msgstr "ÐзолиÑовано"
-#: monitor_section.cc:119
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr "ÐÑоÑлÑÑивание"
-#: monitor_section.cc:130
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -8473,7 +9358,7 @@ msgstr ""
"ÐÑли акÑивно, Ñо ÑÑо-Ñо бÑÐ´ÐµÑ Ñоло-изолиÑовано.\n"
"ÐажмиÑе, ÑÑÐ¾Ð±Ñ Ð´Ðµ-изолиÑоваÑÑ Ð²Ñе"
-#: monitor_section.cc:133
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
@@ -8481,31 +9366,31 @@ msgstr ""
"ÐÑли вклÑÑено, вÑполнÑеÑÑÑ Ð¿ÑоÑлÑÑивание.\n"
"ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð¿ÑекÑаÑиÑÑ ÐµÐ³Ð¾."
-#: monitor_section.cc:150
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr "УпÑавление ÑолиÑованием заÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ ÑолиÑование на меÑÑе"
-#: monitor_section.cc:156
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
msgstr "УпÑавление ÑолиÑованием пеÑеклÑÑÐ°ÐµÑ Ð¿Ð¾ÑлеÑейдеÑное пÑоÑлÑÑивание"
-#: monitor_section.cc:162
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
msgstr "УпÑавление ÑолиÑованием пеÑеклÑÑÐ°ÐµÑ Ð¿ÑедÑейдеÑное пÑоÑлÑÑивание"
-#: monitor_section.cc:168
+#: monitor_section.cc:170
msgid "Excl. Solo"
msgstr "ÐкÑкл. Ñоло"
-#: monitor_section.cc:170
+#: monitor_section.cc:172
msgid "Exclusive solo means that only 1 solo is active at a time"
msgstr "ÐдновÑеменно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð°ÐºÑивнÑм ÑолÑко одно Ñоло"
-#: monitor_section.cc:177
+#: monitor_section.cc:179
msgid "Solo » Mute"
msgstr "Соло » ÐÑкл"
-#: monitor_section.cc:179
+#: monitor_section.cc:181
msgid ""
"If enabled, solo will override mute\n"
"(a soloed & muted track or bus will be audible)"
@@ -8513,40 +9398,40 @@ msgstr ""
"ÐÑли вклÑÑено, Ñо Ñоло Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ Ð¿ÑиглÑÑение\n"
"(Ñоло и пÑиглÑÑÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñожка/Ñина бÑдÑÑ ÑлÑÑнÑ)"
-#: monitor_section.cc:187
+#: monitor_section.cc:189
msgid "Processors"
msgstr "ÐбÑабоÑÑики"
-#: monitor_section.cc:189
-msgid "Allow to add monitor effect processors"
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
msgstr ""
-#: monitor_section.cc:205
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr "УÑиление ÑолиÑÑемого Ñигнала (0dB ÑвлÑеÑÑÑ Ð½Ð¾Ñмой)"
-#: monitor_section.cc:209 monitor_section.cc:226 monitor_section.cc:243
-#: monitor_section.cc:288
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
msgid "0 dB"
msgstr "0 Ðб"
-#: monitor_section.cc:210
+#: monitor_section.cc:211
msgid "3 dB"
msgstr "3 Ðб"
-#: monitor_section.cc:211
+#: monitor_section.cc:212
msgid "6 dB"
msgstr "6 Ðб"
-#: monitor_section.cc:212
+#: monitor_section.cc:213
msgid "10 dB"
msgstr "10 Ðб"
-#: monitor_section.cc:214
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr "УÑиление Ñоло"
-#: monitor_section.cc:221
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
@@ -8554,99 +9439,103 @@ msgstr ""
"Снижение ÑÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ-ÑолиÑованнÑÑ
Ñигналов \n"
"ÐнаÑение вÑÑе -Ð¸Ð½Ñ Ð´Ð Ð²ÑзÑÐ²Ð°ÐµÑ \"solo-in-front\""
-#: monitor_section.cc:227 monitor_section.cc:245 monitor_section.cc:290
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
msgid "-6 dB"
msgstr "-6 Ðб"
-#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
msgid "-12 dB"
msgstr "-12 Ðб"
-#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
msgid "-20 dB"
msgstr "-20 Ðб"
-#: monitor_section.cc:230
+#: monitor_section.cc:231
msgid "OFF"
msgstr "ÐЫÐÐ"
-#: monitor_section.cc:232
+#: monitor_section.cc:233
msgid "SiP Cut"
msgstr "SiP ÐбÑ."
-#: monitor_section.cc:239
+#: monitor_section.cc:240
msgid "Gain reduction to use when dimming monitor outputs"
msgstr "Снижение ÑÑÐ¸Ð»ÐµÐ½ÐµÐ¸Ñ Ð´Ð»Ñ Ð¸Ñп. пÑи заÑемнении мониÑоÑов вÑÑ
одов"
-#: monitor_section.cc:244 monitor_section.cc:289
+#: monitor_section.cc:245 monitor_section.cc:290
msgid "-3 dB"
msgstr "-3 Ðб"
-#: monitor_section.cc:249 monitor_section.cc:263 monitor_section.cc:324
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
msgid "Dim"
msgstr "ТиÑе"
-#: monitor_section.cc:293
+#: monitor_section.cc:294
msgid "-30 dB"
msgstr "-30 Ðб"
-#: monitor_section.cc:332
+#: monitor_section.cc:333
msgid "Inv"
msgstr "Ðнв."
-#: monitor_section.cc:398
+#: monitor_section.cc:399 port_group.cc:552
msgid "Monitor"
msgstr "ÐониÑоÑ"
-#: monitor_section.cc:862
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr "ÐеÑеклÑÑиÑÑ Ð¼Ð¾Ð½Ð¸ÑоÑинг в моноÑониÑеÑкий Ñежим"
-#: monitor_section.cc:865
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr "ÐÑклÑÑиÑÑ Ð¼Ð¾Ð½Ð¸ÑоÑинг"
-#: monitor_section.cc:868
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr "ÐÑиглÑÑиÑÑ Ð¼Ð¾Ð½Ð¸ÑоÑинг"
-#: monitor_section.cc:871
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr "ÐеÑеклÑÑиÑÑ ÑкÑклÑзивное ÑолиÑование"
-#: monitor_section.cc:877
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr "ÐеÑеклÑÑение глÑÑÐµÐ½Ð¸Ñ Ð¿ÐµÑекÑÑÐ²Ð°ÐµÑ Ñоло-Ñежим"
-#: monitor_section.cc:887
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "ÐÑÑезаÑÑ ÐºÐ°Ð½Ð°Ð» %1 мониÑоÑинга"
-#: monitor_section.cc:892
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr "ÐÑиглÑÑиÑÑ ÐºÐ°Ð½Ð°Ð» %1 мониÑоÑинга"
-#: monitor_section.cc:897
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr "СолиÑоваÑÑ ÐºÐ°Ð½Ð°Ð»Ð¾Ð¼ %1 мониÑоÑинга"
-#: monitor_section.cc:902
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr "ÐнвеÑÑиÑоваÑÑ ÐºÐ°Ð½Ð°Ð» %1 мониÑоÑинга"
-#: monitor_section.cc:912
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr "Ðа меÑÑе Ñоло"
-#: monitor_section.cc:914
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr "ÐÑоÑлÑÑивание ÑолиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñле ÑейдеÑа (AFL)"
-#: monitor_section.cc:916
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr "ÐÑоÑлÑÑивание ÑолиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾ ÑейдеÑа (PFL)"
-#: monitor_section.cc:1324
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
msgid "No session - no I/O changes are possible"
msgstr ""
@@ -8773,9 +9662,9 @@ msgstr "ÐоÑмиÑовка облаÑÑей"
msgid "Normalize region"
msgstr "ÐоÑмиÑовка облаÑÑи"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
-msgid "dbFS"
-msgstr "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "ÐоÑмиÑоваÑÑ Ð´Ð¾:"
#: normalize_dialog.cc:56
msgid "Normalize each region using its own peak value"
@@ -8906,7 +9795,7 @@ msgstr ""
msgid "Panner (2D)"
msgstr "ÐаноÑамиÑование (2D)"
-#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:465
msgid "Bypass"
msgstr "ÐбÑ
од"
@@ -8962,39 +9851,162 @@ msgstr "Ðе назнаÑен"
msgid "Imported"
msgstr "ÐмпоÑÑиÑовано"
-#: plugin_eq_gui.cc:83 plugin_eq_gui.cc:107
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
msgid "dB scale"
msgstr "ÐаÑÑÑаб в Ðб"
-#: plugin_eq_gui.cc:114
+#: plugin_eq_gui.cc:124
msgid "Show phase"
msgstr "ÐоказÑваÑÑ ÑазÑ"
-#: plugin_selector.cc:54 plugin_selector.cc:311
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "ÐаÑÑÑойка вÑÑÑнÑÑ"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr "ÐÐ¾ÐºÐ¾Ð²Ð°Ñ ÑепÑ"
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr "MIDI-поÑÑÑ Ð²Ñ
ода"
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr "ÐкземплÑÑÑ"
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr "ÐÑдиовÑÑ
од"
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr "MIDI-вÑÑ
од"
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr "ÐÑедÑÑÑановки вÑÑ
ода"
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr "ÐобавиÑÑ Ð²Ñ
од боковой Ñепи"
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "ÐвÑомаÑиÑеÑки"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 канал"
+msgstr[1] "%1 канала"
+msgstr[2] "%1 каналов"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "ÐоÑлаÑÑ"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr "ÐкземплÑÑ #%1"
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr "Ðевозможно наÑÑÑоиÑÑ Ð½Ð¾Ð²Ñй поÑÑл: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr "ÐЦ %1 (%2)"
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "ÐоÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°: %1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "ÐаÑÑÑойка плагина"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr "СкопиÑоваÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð²Ñ
ода-вÑÑ
ода"
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr "ÐиÑÑÑалÑнÑй инÑÑÑÑÐ¼ÐµÐ½Ñ Ñже добавлен."
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr "ÐамениÑÑ"
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr "на"
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr "ÐонÑигÑÑаÑÐ¸Ñ Ð¿Ð¾ÑÑов плагина"
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr "ÐаÑÑÑоиÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½ '%1'"
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "ÐаÑÑÑойка вÑÑ
ода"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "Ðазвание ÑодеÑжиÑ"
-#: plugin_selector.cc:55 plugin_selector.cc:315
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "Тип ÑодеÑжиÑ"
-#: plugin_selector.cc:56 plugin_selector.cc:313
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr "Ðазвание каÑегоÑии ÑодеÑжиÑ"
-#: plugin_selector.cc:57 plugin_selector.cc:335
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "ÐÐ¼Ñ Ð°Ð²ÑоÑа ÑодеÑжиÑ"
-#: plugin_selector.cc:58 plugin_selector.cc:337
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "ÐиблиоÑека ÑодеÑжиÑ"
-#: plugin_selector.cc:59 plugin_selector.cc:267 plugin_selector.cc:613
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "ТолÑко лÑбимÑе"
-#: plugin_selector.cc:60 plugin_selector.cc:271 plugin_selector.cc:613
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "ТолÑко ÑкÑÑÑÑе"
@@ -9086,16 +10098,16 @@ msgstr ""
msgid "Filter"
msgstr "ФилÑÑÑ"
-#: plugin_selector.cc:221
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "ÐÑÑавиÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ"
-#: plugin_selector.cc:419 plugin_selector.cc:420 plugin_selector.cc:421
-#: plugin_selector.cc:422
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr "ÐеÑеменнаÑ"
-#: plugin_selector.cc:572
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -9105,38 +10117,38 @@ msgstr ""
"\n"
"СмоÑÑеÑÑ Ð¾ÐºÐ½Ð¾ оÑÑÑÑа Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑей инÑоÑмаÑии (возможно)"
-#: plugin_selector.cc:730
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "ÐзбÑаннÑе"
-#: plugin_selector.cc:732
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "УпÑавление плагинами..."
-#: plugin_selector.cc:736
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Ðо ÑоздаÑелÑ"
-#: plugin_selector.cc:739
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Ðо каÑегоÑии"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:115
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "У плагинов LADSPA Ð½ÐµÑ ÑобÑÑвенного инÑеÑÑейÑа."
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:124 plugin_ui.cc:229
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
"ÐеизвеÑÑнÑй Ñип ÑедакÑоÑа плагина (пÑимеÑание: Ð½ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжки VST в веÑÑии %1)"
-#: plugin_ui.cc:125
+#: plugin_ui.cc:127
msgid "unknown type of editor-supplying plugin"
msgstr "неизвеÑÑнÑй Ñип ÑедакÑоÑа плагина"
-#: plugin_ui.cc:257
+#: plugin_ui.cc:259
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
@@ -9144,23 +10156,23 @@ msgstr ""
"ÐеизвеÑÑнÑй Ñип ÑедакÑоÑа плагина (пÑимеÑание: Ð½ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжки linuxVST в ÑÑой "
"веÑÑии %1)"
-#: plugin_ui.cc:329
+#: plugin_ui.cc:331
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr "РедакÑÐ¾Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ lv2, назÑваемÑй не-LV2 плагин"
-#: plugin_ui.cc:418
+#: plugin_ui.cc:419
msgid "Add"
msgstr "ÐобавиÑÑ"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:425
msgid "Description"
msgstr "ÐпиÑание"
-#: plugin_ui.cc:424
+#: plugin_ui.cc:426
msgid "Plugin analysis"
msgstr "ЧаÑÑоÑнÑй анализ плагина"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:433
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
@@ -9168,28 +10180,32 @@ msgstr ""
"ÐÑе доÑÑÑпнÑе пÑоÑили ÑÑого плагина,\n"
"как «заводÑкие», Ñак и ÑобÑÑвеннÑе"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:434
msgid "Save a new preset"
msgstr "СоÑ
ÑаниÑÑ Ð½Ð¾Ð²Ñй пÑоÑилÑ"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:435
msgid "Save the current preset"
msgstr "СоÑ
ÑаниÑÑ ÑекÑÑий пÑоÑилÑ"
-#: plugin_ui.cc:434
+#: plugin_ui.cc:436
msgid "Delete the current preset"
msgstr "УдалиÑÑ ÑекÑÑий пÑоÑилÑ"
-#: plugin_ui.cc:435
+#: plugin_ui.cc:437
msgid ""
"Reset parameters to default (if no parameters are in automation play mode)"
msgstr ""
-#: plugin_ui.cc:436
+#: plugin_ui.cc:439
+msgid "Show Plugin Pin Management Dialog"
+msgstr "ÐоказаÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³ наÑÑÑойки поÑÑов плагина"
+
+#: plugin_ui.cc:441
msgid "Disable signal processing by the plugin"
msgstr "ÐÑклÑÑиÑÑ Ð¾Ð±ÑабоÑÐºÑ Ñигнала ÑÑим плагином"
-#: plugin_ui.cc:473 plugin_ui.cc:685
+#: plugin_ui.cc:480 plugin_ui.cc:699
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -9197,26 +10213,26 @@ msgstr ""
"ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ ÑазÑеÑиÑÑ ÑÑÐ¾Ð¼Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Ð¿Ð¾Ð»ÑÑаÑÑ ÐºÐ»Ð°Ð²Ð¸Ð°ÑÑÑнÑе ÑобÑÑиÑ, "
"коÑоÑÑе %1 обÑÑно иÑполÑзÑÐµÑ ÐºÐ°Ðº гоÑÑÑие клавиÑи"
-#: plugin_ui.cc:474
+#: plugin_ui.cc:481
msgid "Click to enable/disable this plugin"
msgstr "ЩелкниÑе, ÑÑÐ¾Ð±Ñ Ð²ÐºÐ»ÑÑиÑÑ Ð¸Ð»Ð¸ оÑклÑÑиÑÑ ÑÑÐ¾Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½"
-#: plugin_ui.cc:517
+#: plugin_ui.cc:524
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "ÐадеÑжка (%1 ÑÑмпл)"
msgstr[1] "ÐадеÑжка (%1 ÑÑмпла)"
msgstr[2] "ÐадеÑжка (%1 ÑÑмплов)"
-#: plugin_ui.cc:519
+#: plugin_ui.cc:526
msgid "latency (%1 ms)"
msgstr "ÐадеÑжка (%1 мÑ)"
-#: plugin_ui.cc:530
+#: plugin_ui.cc:537
msgid "Edit Latency"
msgstr "ÐзмениÑÑ Ð·Ð°Ð´ÐµÑжкÑ"
-#: plugin_ui.cc:576
+#: plugin_ui.cc:583
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -9224,7 +10240,7 @@ msgstr ""
"ÐÑеÑеÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð² не поддеÑживаÑÑÑÑ Ð² ÑÑой ÑбоÑке %1. РаÑÑмоÑÑиÑе оплаÑÑ Ð·Ð° "
"полнÑÑ Ð²ÐµÑÑиÑ"
-#: plugin_ui.cc:584
+#: plugin_ui.cc:591
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
@@ -9232,16 +10248,16 @@ msgstr ""
"Ð ÑÑой ÑбоÑке Ð½ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑедÑÑÑановок плагинов. См. подÑобнее в окне "
"жÑÑнала."
-#: plugin_ui.cc:592
+#: plugin_ui.cc:599
msgid "New Preset"
msgstr "СоздаÑÑ Ð¿ÑоÑилÑ"
-#: plugin_ui.cc:692
+#: plugin_ui.cc:706
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr ""
"ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑеклÑÑиÑÑÑÑ Ð½Ð° обÑÑное иÑполÑзование гоÑÑÑиÑ
ÐºÐ»Ð°Ð²Ð¸Ñ %1"
-#: plugin_ui.cc:789
+#: plugin_ui.cc:813
msgid "(none)"
msgstr "(неÑ)"
@@ -9265,63 +10281,47 @@ msgstr "ÐÑоÑее"
msgid "Other"
msgstr "ÐÑоÑее"
-#: port_group.cc:434 port_group.cc:435
+#: port_group.cc:435 port_group.cc:436
msgid "LTC Out"
msgstr "LTC Out"
-#: port_group.cc:438 port_group.cc:439
+#: port_group.cc:439 port_group.cc:440
msgid "LTC In"
msgstr "LTC In"
-#: port_group.cc:473
+#: port_group.cc:474
msgid "MTC in"
msgstr "MTC in"
-#: port_group.cc:476
+#: port_group.cc:477
msgid "MIDI control in"
msgstr "MIDI control in"
-#: port_group.cc:479
+#: port_group.cc:480
msgid "MIDI clock in"
msgstr "MIDI clock in"
-#: port_group.cc:482
+#: port_group.cc:483
msgid "MMC in"
msgstr "MMC in"
-#: port_group.cc:486
+#: port_group.cc:487
msgid "MTC out"
msgstr "MTC out"
-#: port_group.cc:489
+#: port_group.cc:490
msgid "MIDI control out"
msgstr "MIDI control out"
-#: port_group.cc:492
+#: port_group.cc:493
msgid "MIDI clock out"
msgstr "MIDI clock out"
-#: port_group.cc:495
+#: port_group.cc:496
msgid "MMC out"
msgstr "MMC out"
-#: port_group.cc:543
-msgid ":monitor"
-msgstr ": мониÑоÑ"
-
-#: port_group.cc:559
-msgid "system:"
-msgstr "СиÑÑема:"
-
-#: port_group.cc:560
-msgid "alsa_pcm:"
-msgstr "alsa_pcm:"
-
-#: port_group.cc:561
-msgid "alsa_midi:"
-msgstr "alsa_midi:"
-
-#: port_group.cc:566
+#: port_group.cc:579
msgid "Scene "
msgstr "СÑена"
@@ -9385,42 +10385,36 @@ msgid "Flip"
msgstr "ÐовеÑнÑÑÑ Ð¼Ð°ÑÑиÑÑ"
#: port_matrix.cc:732
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+msgid "It is not possible to add a port here."
msgstr ""
-"Ðевозможно добавиÑÑ ÑÑда поÑÑ, поÑколÑÐºÑ Ð¿ÐµÑвÑй обÑабоÑÑик доÑожки или ÑÐ¸Ð½Ñ "
-"не Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð½Ð¾Ð²ÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ."
-#: port_matrix.cc:735
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr "Ðевозможно добавиÑÑ Ð¿Ð¾ÑÑ"
#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "ÐоÑледний поÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдалÑн"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "ÐÑÐ¾Ñ Ð¿Ð¾ÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдалÑн."
+
+#: port_matrix.cc:765
msgid "Port removal not allowed"
msgstr "Удаление поÑÑов не ÑазÑеÑено"
-#: port_matrix.cc:758
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"ÐÑÐ¾Ñ Ð¿Ð¾ÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдален.\n"
-"Ðибо пеÑвÑй плагин в доÑожке или Ñине не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑÑÑ Ð½Ð¾Ð²Ð¾Ðµ\n"
-"колиÑеÑÑво вÑ
одов, либо Ñ Ð¿Ð¾Ñледнего плагина болÑÑе вÑÑ
одов."
-
-#: port_matrix.cc:975
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "УдалиÑÑ '%s'"
-#: port_matrix.cc:990
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s вÑе из '%s'"
-#: port_matrix.cc:1056 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "Ðанал"
@@ -9432,19 +10426,15 @@ msgstr "ÐÐµÑ Ð´Ð¾ÑÑÑпнÑÑ
поÑÑов."
msgid "There are no %1 ports to connect."
msgstr "ÐÐµÑ ÑоединÑемÑÑ
поÑÑов %1."
-#: processor_box.cc:169
-msgid "Send"
-msgstr "ÐоÑлаÑÑ"
-
-#: processor_box.cc:171
+#: processor_box.cc:226
msgid "Return"
msgstr "ÐозвÑаÑ"
-#: processor_box.cc:239
+#: processor_box.cc:323
msgid "New Favorite Preset for \"%1\""
msgstr "ÐÐ¾Ð²Ð°Ñ Ð¸Ð·Ð±ÑÐ°Ð½Ð½Ð°Ñ Ð¿ÑедÑÑÑановка Ð´Ð»Ñ \"%1\""
-#: processor_box.cc:414
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
@@ -9452,7 +10442,7 @@ msgstr ""
"\n"
"ÐÑÐ¾Ñ Ð¼Ð¾Ð½Ð¾Ð¿Ð»Ð°Ð³Ð¸Ð½ бÑл копиÑован %1 Ñаз."
-#: processor_box.cc:418
+#: processor_box.cc:505 processor_box.cc:1528
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
@@ -9462,7 +10452,7 @@ msgstr ""
"Ðвойной ÑелÑок оÑкÑÑÐ²Ð°ÐµÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°.\n"
"%2+двойной ÑелÑок оÑкÑÑÐ²Ð°ÐµÑ ÑиÑÑемÑй Ñ
оÑÑом инÑеÑÑейÑ.%3"
-#: processor_box.cc:421
+#: processor_box.cc:508 processor_box.cc:1531
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
@@ -9470,7 +10460,7 @@ msgstr ""
"<b>%1</b>\n"
"Ðвойной ÑелÑок, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð¾Ð±Ñий GUI.%2"
-#: processor_box.cc:427
+#: processor_box.cc:514
msgid ""
"<b>%1</b>\n"
"The Plugin is not available on this system\n"
@@ -9480,32 +10470,36 @@ msgstr ""
"ÐÑÐ¾Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½ недоÑÑÑпен в \n"
"ÑиÑÑеме и заменÑн на заглÑÑкÑ."
-#: processor_box.cc:470
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr "(%1x1) "
-#: processor_box.cc:546
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "ÐоказаÑÑ Ð²Ñе ÑегÑлÑÑоÑÑ"
-#: processor_box.cc:550
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "СкÑÑÑÑ Ð²Ñе ÑегÑлÑÑоÑÑ"
-#: processor_box.cc:584
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr "СвÑзаÑÑ ÑегÑлÑÑоÑÑ Ð¿Ð°Ð½Ð¾ÑамиÑованиÑ"
-#: processor_box.cc:691
+#: processor_box.cc:859
msgid "on"
msgstr "Ðкл"
-#: processor_box.cc:691 rc_option_editor.cc:2978 rc_option_editor.cc:2992
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
msgid "off"
msgstr "ÐÑкл"
-#: processor_box.cc:1177
+#: processor_box.cc:1819
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
@@ -9513,22 +10507,22 @@ msgstr ""
"ЩелÑком пÑавой клавиÑей мÑÑи можно добавлÑÑÑ, \n"
"изменÑÑÑ Ð¸ ÑдалÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ, поÑÑлÑ, возвÑаÑÑ Ð¸ пÑ."
-#: processor_box.cc:1326
+#: processor_box.cc:1968
msgid ""
"Processor Drag/Drop failed. Probably because\n"
"the I/O configuration of the plugins could\n"
"not match the configuration of this track."
msgstr ""
-#: processor_box.cc:1769 processor_box.cc:2164
+#: processor_box.cc:2455 processor_box.cc:2998
msgid "Plugin Incompatibility"
msgstr "ÐеÑовмеÑÑимоÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²"
-#: processor_box.cc:1772
+#: processor_box.cc:2458
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "ÐÑ Ð¿ÑÑалиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½ \"%1\" в ÑÐ»Ð¾Ñ %2.\n"
-#: processor_box.cc:1778
+#: processor_box.cc:2464
msgid ""
"\n"
"This plugin has:\n"
@@ -9536,21 +10530,21 @@ msgstr ""
"\n"
"У ÑÑого плагина:\n"
-#: processor_box.cc:1781
+#: processor_box.cc:2467
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 MIDI-вÑ
од\n"
msgstr[1] "\t%1 MIDI-вÑ
ода\n"
msgstr[2] "\t%1 MIDI-вÑ
одов\n"
-#: processor_box.cc:1785
+#: processor_box.cc:2471
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 звÑковой вÑ
од\n"
msgstr[1] "\t%1 звÑковÑÑ
вÑ
ода\n"
msgstr[2] "\t%1 звÑковÑÑ
вÑ
одов\n"
-#: processor_box.cc:1788
+#: processor_box.cc:2474
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -9558,21 +10552,21 @@ msgstr ""
"\n"
"но в ÑоÑке вÑÑавки ÑейÑаÑ:\n"
-#: processor_box.cc:1791
+#: processor_box.cc:2477
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 MIDI-канал\n"
msgstr[1] "\t%1 MIDI-канала\n"
msgstr[2] "\t%1 MIDI-каналов\n"
-#: processor_box.cc:1795
+#: processor_box.cc:2481
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 звÑковой канал\n"
msgstr[1] "\t%1 звÑковÑÑ
канала\n"
msgstr[2] "\t%1 звÑковÑÑ
каналов\n"
-#: processor_box.cc:1798
+#: processor_box.cc:2484
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -9580,11 +10574,7 @@ msgstr ""
"\n"
"%1 не Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑавиÑÑ ÑÑда ÑÑÐ¾Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½.\n"
-#: processor_box.cc:1835
-msgid "Cannot set up new send: %1"
-msgstr "Ðевозможно наÑÑÑоиÑÑ Ð½Ð¾Ð²Ñй поÑÑл: %1"
-
-#: processor_box.cc:2167
+#: processor_box.cc:3001
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
@@ -9594,20 +10584,20 @@ msgstr ""
"поÑÑÐ»Ñ Ð¸ возвÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñм обÑазом, поÑколÑÐºÑ \n"
"вÑ
Ð¾Ð´Ñ Ð¸ вÑÑ
Ð¾Ð´Ñ Ð¿ÐµÑеÑÑанÑÑ ÐºÐ¾ÑÑекÑно ÑабоÑаÑÑ."
-#: processor_box.cc:2367
+#: processor_box.cc:3201
msgid "Rename Processor"
msgstr "ÐеÑеименоваÑÑ Ð¾Ð±ÑабоÑÑик"
-#: processor_box.cc:2398
+#: processor_box.cc:3232
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
"СÑÑеÑÑвÑÐµÑ Ð¿Ð¾ кÑайней меÑе 100 обÑекÑов IO Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, как %1 - Ð¸Ð¼Ñ Ð½Ðµ изменено"
-#: processor_box.cc:2536
+#: processor_box.cc:3383
msgid "plugin insert constructor failed"
msgstr "Сбой конÑÑÑÑкÑоÑа вÑÑавки плагина"
-#: processor_box.cc:2547
+#: processor_box.cc:3394
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -9617,7 +10607,7 @@ msgstr ""
"бÑÑÐµÑ Ð¾Ð±Ð¼ÐµÐ½Ð°. ÐеÑоÑÑно, конÑигÑÑаÑÐ¸Ñ Ð²Ñ
ода и вÑÑ
ода\n"
"плагинов не Ñовпала Ñ ÐºÐ¾Ð½ÑигÑÑаÑией ÑÑой доÑожки."
-#: processor_box.cc:2593
+#: processor_box.cc:3440
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -9626,15 +10616,15 @@ msgstr ""
"обÑабоÑÑики из \"%1\" ?\n"
"(оÑмена невозможна)"
-#: processor_box.cc:2597 processor_box.cc:2622
+#: processor_box.cc:3444 processor_box.cc:3469
msgid "Yes, remove them all"
msgstr "Ðа, ÑдалиÑÑ Ð¸Ñ
вÑе"
-#: processor_box.cc:2599 processor_box.cc:2624
+#: processor_box.cc:3446 processor_box.cc:3471
msgid "Remove processors"
msgstr "УдалиÑÑ Ð¾Ð±ÑабоÑÑики"
-#: processor_box.cc:2614
+#: processor_box.cc:3461
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9643,7 +10633,7 @@ msgstr ""
"пÑедÑейдеÑнÑе обÑабоÑÑики из \"%1\" ?\n"
"(оÑмена невозможна)"
-#: processor_box.cc:2617
+#: processor_box.cc:3464
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
@@ -9652,59 +10642,59 @@ msgstr ""
"поÑлеÑейдеÑнÑе обÑабоÑÑики из \"%1\" ?\n"
"(оÑмена невозможна)"
-#: processor_box.cc:2805
+#: processor_box.cc:3653
msgid "New Plugin"
msgstr "ÐобавиÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½"
-#: processor_box.cc:2808
+#: processor_box.cc:3656
msgid "New Insert"
msgstr "ÐобавиÑÑ Ð²Ð¾Ð·Ð²ÑаÑ"
-#: processor_box.cc:2811
+#: processor_box.cc:3659
msgid "New External Send ..."
msgstr "ÐобавиÑÑ Ð²Ð½ÐµÑний поÑÑл Ñ Ð¿Ð¾ÑÑом JACK..."
-#: processor_box.cc:2815
+#: processor_box.cc:3663
msgid "New Aux Send ..."
msgstr "ÐобавиÑÑ Ð²Ð½ÐµÑний поÑÑл без поÑÑа JACK..."
-#: processor_box.cc:2818
+#: processor_box.cc:3666
msgid "Send Options"
msgstr "ÐаÑамеÑÑÑ Ð¾ÑпÑавки"
-#: processor_box.cc:2820
+#: processor_box.cc:3668
msgid "Clear (all)"
msgstr "ÐÑиÑÑиÑÑ (вÑÑ)"
-#: processor_box.cc:2822
+#: processor_box.cc:3670
msgid "Clear (pre-fader)"
msgstr "ÐÑиÑÑиÑÑ (до ÑейдеÑа)"
-#: processor_box.cc:2824
+#: processor_box.cc:3672
msgid "Clear (post-fader)"
msgstr "ÐÑиÑÑиÑÑ (поÑле ÑейдеÑа)"
-#: processor_box.cc:2846
+#: processor_box.cc:3702
msgid "Activate All"
msgstr "ÐкÑивиÑоваÑÑ Ð²Ñе"
-#: processor_box.cc:2848
+#: processor_box.cc:3704
msgid "Deactivate All"
msgstr "ÐеакÑивиÑоваÑÑ Ð²Ñе"
-#: processor_box.cc:2850
+#: processor_box.cc:3706
msgid "A/B Plugins"
msgstr "ÐÑклÑÑиÑÑ Ð²Ñе"
-#: processor_box.cc:2859
+#: processor_box.cc:3719
msgid "Edit with generic controls..."
msgstr "ÐзмениÑÑ Ñ Ð¸Ð½ÑеÑÑейÑом Ñ
оÑÑа..."
-#: processor_box.cc:3162
+#: processor_box.cc:4051
msgid "%1: %2 (by %3)"
msgstr "%1: %2 (авÑÐ¾Ñ â %3)"
-#: processor_box.cc:3164
+#: processor_box.cc:4053
msgid "%1 (by %2)"
msgstr "%1 (на %2)"
@@ -9732,292 +10722,296 @@ msgstr "Ðанк"
msgid "main grid"
msgstr "ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑеÑка"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "ÐванÑование"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "Сила"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Свинг"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "ÐоÑог (в ÑикаÑ
)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr "ÐаÑало пÑивÑзки ноÑÑ"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr "ÐÐ¾Ð½ÐµÑ Ð¿ÑивÑзки ноÑÑ"
-#: rc_option_editor.cc:81 rc_option_editor.cc:82
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "ÐÑоÑмоÑÑ..."
-#: rc_option_editor.cc:87
+#: rc_option_editor.cc:89
msgid "Emphasis on first beat:"
msgstr "УÑиление на пеÑвой доле:"
-#: rc_option_editor.cc:93
+#: rc_option_editor.cc:95
msgid "Use default Click:"
msgstr "ÐÑполÑзоваÑÑ Ð¾Ð±ÑÑнÑй ÑелÑок:"
-#: rc_option_editor.cc:99
+#: rc_option_editor.cc:101
msgid "Click audio file:"
msgstr "Файл ÑелÑка доли:"
-#: rc_option_editor.cc:106
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Файл ÑелÑка ÑилÑной доли:"
-#: rc_option_editor.cc:152
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "ÐÑбеÑиÑе ÑелÑок меÑÑонома"
-#: rc_option_editor.cc:175
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "ÐÑбеÑиÑе акÑенÑиÑÑÑÑий ÑелÑок меÑÑонома"
-#: rc_option_editor.cc:236
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "ÐгÑаниÑиваÑÑ Ð¸ÑÑоÑÐ¸Ñ Ð´ÐµÐ¹ÑÑвий"
-#: rc_option_editor.cc:237
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "ÐгÑаниÑиваÑÑ ÑоÑ
Ñанение иÑÑоÑии дейÑÑвий"
-#: rc_option_editor.cc:246 rc_option_editor.cc:253
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "командами"
-#: rc_option_editor.cc:376
+#: rc_option_editor.cc:378
msgid ""
"\n"
"Changes to this setting will only persist after your project has been saved."
msgstr ""
-#: rc_option_editor.cc:387 rc_option_editor.cc:449
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
msgstr "<b>РекомендÑеÑÑÑ: %1 + клавиÑа 3 (пÑÐ°Ð²Ð°Ñ ÐºÐ»Ð°Ð²Ð¸Ñа мÑÑи)</b>%2"
-#: rc_option_editor.cc:401
+#: rc_option_editor.cc:403
msgid "Select Keyboard layout:"
msgstr "РаÑкладка клавиаÑÑÑÑ:"
-#: rc_option_editor.cc:420
+#: rc_option_editor.cc:422
msgid "When Clicking:"
msgstr "ÐÑи ÑелÑке:"
-#: rc_option_editor.cc:427
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "РедакÑиÑоваÑÑ Ñ:"
-#: rc_option_editor.cc:433 rc_option_editor.cc:463 rc_option_editor.cc:493
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ клавиÑа"
-#: rc_option_editor.cc:457
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "УдалÑÑÑ Ñ:"
-#: rc_option_editor.cc:479
+#: rc_option_editor.cc:481
msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
msgstr "<b>РекомендÑеÑÑÑ: %1 + клавиÑа 1 (Ð»ÐµÐ²Ð°Ñ ÐºÐ»Ð°Ð²Ð¸Ñа мÑÑи)</b>%2"
-#: rc_option_editor.cc:487
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "ÐÑÑавлÑÑÑ Ð½Ð¾ÑÑ Ñ:"
-#: rc_option_editor.cc:505
+#: rc_option_editor.cc:507
msgid "When Beginning a Drag:"
msgstr "РнаÑале пеÑеÑаÑкиваниÑ:"
-#: rc_option_editor.cc:516 rc_option_editor.cc:543 rc_option_editor.cc:576
-#: rc_option_editor.cc:597 rc_option_editor.cc:641 rc_option_editor.cc:674
-#: rc_option_editor.cc:700 rc_option_editor.cc:728 rc_option_editor.cc:757
-#: rc_option_editor.cc:779
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
msgid "<b>Recommended Setting: %1</b>%2"
msgstr "<b>РекомендÑеÑÑÑ: %1</b>%2"
-#: rc_option_editor.cc:530
+#: rc_option_editor.cc:532
msgid "Copy items using:"
msgstr "ÐопиÑоваÑÑ Ð¾Ð±ÑекÑÑ Ñ:"
-#: rc_option_editor.cc:557
+#: rc_option_editor.cc:559
msgid "Constrain drag using:"
msgstr "ÐгÑаниÑиÑÑ Ð¿ÐµÑемеÑение Ñ:"
-#: rc_option_editor.cc:565
+#: rc_option_editor.cc:567
msgid "When Beginning a Trim:"
-msgstr ""
+msgstr "РнаÑале обÑезки:"
-#: rc_option_editor.cc:584
+#: rc_option_editor.cc:586
msgid "Trim contents using:"
msgstr ""
-#: rc_option_editor.cc:605
+#: rc_option_editor.cc:607
msgid "Anchored trim using:"
msgstr ""
-#: rc_option_editor.cc:649
+#: rc_option_editor.cc:651
msgid "Resize notes relatively using:"
msgstr ""
-#: rc_option_editor.cc:658
+#: rc_option_editor.cc:660
msgid "While Dragging:"
msgstr "ÐÑи пеÑеÑаÑкивании:"
-#: rc_option_editor.cc:682
+#: rc_option_editor.cc:684
msgid "Ignore snap using:"
msgstr "ÐгноÑиÑоваÑÑ Ð¿ÑивÑÐ·ÐºÑ Ñ:"
-#: rc_option_editor.cc:708
+#: rc_option_editor.cc:710
msgid "Snap relatively using:"
msgstr ""
-#: rc_option_editor.cc:716
+#: rc_option_editor.cc:718
msgid "While Trimming:"
-msgstr ""
+msgstr "ÐÑи обÑезке:"
-#: rc_option_editor.cc:736
+#: rc_option_editor.cc:738
msgid "Resize overlapped regions using:"
msgstr ""
-#: rc_option_editor.cc:744
+#: rc_option_editor.cc:746
msgid "While Dragging Control Points:"
msgstr "ÐÑи пеÑеÑаÑкивании конÑÑолÑнÑÑ
ÑоÑек:"
-#: rc_option_editor.cc:765
+#: rc_option_editor.cc:767
msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:787
+#: rc_option_editor.cc:789
msgid "Push points using:"
msgstr ""
-#: rc_option_editor.cc:1027
+#: rc_option_editor.cc:1029
msgid "GUI and Font scaling:"
msgstr "ÐаÑÑÑаб инÑеÑÑейÑа и ÑÑиÑÑа:"
-#: rc_option_editor.cc:1030
+#: rc_option_editor.cc:1032
msgid "Default"
msgstr "Ðо ÑмолÑаниÑ"
-#: rc_option_editor.cc:1056
+#: rc_option_editor.cc:1058
msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-#: rc_option_editor.cc:1098
+#: rc_option_editor.cc:1100
msgid "â"
msgstr "â"
-#: rc_option_editor.cc:1099
+#: rc_option_editor.cc:1101
msgid "30 sec"
msgstr "30 Ñ"
-#: rc_option_editor.cc:1100
+#: rc_option_editor.cc:1102
msgid "1 min"
msgstr "1 мин"
-#: rc_option_editor.cc:1101
+#: rc_option_editor.cc:1103
msgid "2 mins"
msgstr "2 мин"
-#: rc_option_editor.cc:1102
+#: rc_option_editor.cc:1104
msgid "3 mins"
msgstr "3 мин"
-#: rc_option_editor.cc:1103
+#: rc_option_editor.cc:1105
msgid "4 mins"
msgstr "4 мин"
-#: rc_option_editor.cc:1104
+#: rc_option_editor.cc:1106
msgid "5 mins"
msgstr "5 мин"
-#: rc_option_editor.cc:1107
+#: rc_option_editor.cc:1109
msgid ""
"Specify the default timeout for plugin instantiation. Plugins that require "
"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:1109
+#: rc_option_editor.cc:1111
msgid "Scan Time Out:"
msgstr "Ðак бÑÑÑÑо пÑекÑаÑиÑÑ ÑканиÑование, еÑли Ð½ÐµÑ ÑезÑлÑÑаÑов:"
-#: rc_option_editor.cc:1157
+#: rc_option_editor.cc:1159
msgid "Waveform Clip Level (dBFS):"
msgstr "УÑÐ¾Ð²ÐµÐ½Ñ Ð¾Ð±Ñезки волновой ÑоÑÐ¼Ñ (dBFS):"
-#: rc_option_editor.cc:1210
+#: rc_option_editor.cc:1212
msgid "Small sessions (4-16 tracks)"
msgstr "ÐеболÑÑие ÑеÑÑии (4â16 доÑожек)"
-#: rc_option_editor.cc:1211
+#: rc_option_editor.cc:1213
msgid "Medium sessions (16-64 tracks)"
msgstr "СÑедние ÑеÑÑии (16â64 доÑожек)"
-#: rc_option_editor.cc:1212
+#: rc_option_editor.cc:1214
msgid "Large sessions (64+ tracks)"
msgstr "ÐолÑÑие ÑеÑÑии (Ð¾Ñ 64 доÑожек и болÑÑе)"
-#: rc_option_editor.cc:1213
+#: rc_option_editor.cc:1215
msgid "Custom (set by sliders below)"
msgstr ""
-#: rc_option_editor.cc:1217 export_video_dialog.cc:167
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
msgid "Preset:"
msgstr "ÐÑоÑилÑ:"
-#: rc_option_editor.cc:1229
+#: rc_option_editor.cc:1231
msgid "Playback (seconds of buffering):"
msgstr "ÐоÑпÑоизведение (в ÑекÑндаÑ
бÑÑеÑизаÑии):"
-#: rc_option_editor.cc:1242
+#: rc_option_editor.cc:1244
msgid "Recording (seconds of buffering):"
msgstr "ÐапиÑÑ (в ÑекÑндаÑ
бÑÑеÑизаÑии):"
-#: rc_option_editor.cc:1320
+#: rc_option_editor.cc:1322
msgid "programming error: unknown buffering preset string, index = %1"
msgstr ""
-#: rc_option_editor.cc:1352
+#: rc_option_editor.cc:1353
msgid "Control Surface Protocol"
msgstr "УÑÑÑойÑÑва ÑпÑавлениÑ"
-#: rc_option_editor.cc:1366
+#: rc_option_editor.cc:1367
msgid ""
"Click to edit the settings for selected protocol ( it must be ENABLED "
"first ):"
msgstr "ÐажмиÑе Ð´Ð»Ñ Ð½Ð°ÑÑÑойки ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (пÑоÑокол должен бÑÑÑ Ð²ÐºÐ»ÑÑен):"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1371
msgid "Show Protocol Settings"
msgstr "ÐоказаÑÑ Ð¿Ð°ÑамеÑÑÑ Ð¿ÑоÑокола"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1494
msgid "Configuration"
msgstr "ÐаÑÑÑойка"
-#: rc_option_editor.cc:1546
+#: rc_option_editor.cc:1547
msgid "Show Video Export Info before export"
msgstr "ÐоказÑваÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³ Ñо ÑпÑавкой об ÑкÑпоÑÑе видео"
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:1548
msgid "Show Video Server Startup Dialog"
msgstr "ÐоказÑваÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³ Ñ Ð¿Ð°ÑамеÑÑами видеоÑеÑвеÑа"
-#: rc_option_editor.cc:1548
+#: rc_option_editor.cc:1549
msgid "Advanced Setup (remote video server)"
msgstr "ÐополниÑелÑнÑе паÑамеÑÑÑ ÑдалÑнного видеоÑеÑвеÑа"
#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "ÐидеоÑеÑвеÑ"
+
+#: rc_option_editor.cc:1565
msgid ""
"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
"- Do not enable this option unless you know what you are doing."
@@ -10026,11 +11020,11 @@ msgstr ""
"коÑневой каÑалог даннÑÑ
. Ðе иÑполÑзÑйÑе ÑÑÑ ÑÑнкÑиÑ, еÑли ÑоÑно не знаеÑе, "
"ÑÑо делаеÑе."
-#: rc_option_editor.cc:1558
+#: rc_option_editor.cc:1567
msgid "Video Server URL:"
msgstr "URL видеоÑеÑвеÑа:"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:1572
msgid ""
"Base URL of the video-server including http prefix. This is usually 'http://"
"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -10040,11 +11034,11 @@ msgstr ""
"example.org: 1554/' и по ÑмолÑÐ°Ð½Ð¸Ñ 'http://localhost:1554/', когда "
"видеоÑеÑÐ²ÐµÑ ÑабоÑÐ°ÐµÑ Ð»Ð¾ÐºÐ°Ð»Ñно"
-#: rc_option_editor.cc:1565
+#: rc_option_editor.cc:1574
msgid "Video Folder:"
msgstr "Ðапка Ñ Ð²Ð¸Ð´ÐµÐ¾:"
-#: rc_option_editor.cc:1570
+#: rc_option_editor.cc:1579
msgid ""
"Local path to the video-server document-root. Only files below this "
"directory will be accessible by the video-server. If the server run on a "
@@ -10059,7 +11053,7 @@ msgstr ""
"иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¼ÐµÑÑного видео - пÑоÑмоÑÑа и вÑбоÑа Ñайлов пÑи оÑкÑÑÑии/"
"добавлении видеоÑайла."
-#: rc_option_editor.cc:1577
+#: rc_option_editor.cc:1584
msgid ""
"<b>When enabled</b> an information window with details is displayed before "
"the video-export dialog."
@@ -10067,7 +11061,7 @@ msgstr ""
"<b>Ðогда вклÑÑено,</b> пеÑед ÑкÑпоÑÑом видео показÑваеÑÑÑ Ð¾ÐºÐ½Ð¾ Ñо ÑпÑавоÑной "
"инÑоÑмаÑией"
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:1589
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
@@ -10075,91 +11069,123 @@ msgstr ""
"<b>ÐÑли вклÑÑено,</b> видеоÑеÑÐ²ÐµÑ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° авÑомаÑиÑеÑки не запÑÑкаеÑÑÑ Ð±ÐµÐ· "
"подÑвеÑждениÑ"
-#: rc_option_editor.cc:1723
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+"ÐÑÑгой каÑалог Ñ Ð¿Ñиложением видеомониÑоÑинга (%1) â не заполнÑÑÑ, еÑли вÑÑ "
+"и Ñак ÑабоÑаеÑ:"
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr "СÑÐ¾Ð»Ð±ÐµÑ %1"
+
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "ÐаÑамеÑÑÑ %1"
-#: rc_option_editor.cc:1734
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr "ÐÑоÑее"
+
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
msgstr "ÐÑполÑзование ЦÐ"
-#: rc_option_editor.cc:1738
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "ÐÑи обÑабоÑке иÑполÑзÑÑÑÑÑ"
-#: rc_option_editor.cc:1743
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "ÐÑе пÑоÑеÑÑоÑÑ ÐºÑоме одного"
-#: rc_option_editor.cc:1744
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "ÐÑе доÑÑÑпнÑе пÑоÑеÑÑоÑÑ"
-#: rc_option_editor.cc:1747
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr "%1 пÑоÑеÑÑоÑа"
-#: rc_option_editor.cc:1750
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr "ÐÑо изменение вÑÑÑÐ¿Ð¸Ñ Ð² ÑÐ¸Ð»Ñ Ð¿Ñи ÑледÑÑÑем запÑÑке %1."
-#: rc_option_editor.cc:1755
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "ÐÑÑоÑÐ¸Ñ Ð´ÐµÐ¹ÑÑвий"
-#: rc_option_editor.cc:1762
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "ÐÑовеÑÑÑÑ Ñдаление поÑледней запиÑи"
-#: rc_option_editor.cc:1767
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr "УпÑавление ÑеÑÑиÑми"
-#: rc_option_editor.cc:1772
+#: rc_option_editor.cc:1912
msgid "Make periodic backups of the session file"
msgstr "ÐеÑиодиÑеÑки ÑоздаваÑÑ ÑезеÑвнÑе копии Ñайла ÑеÑÑии"
-#: rc_option_editor.cc:1780
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "ÐÑегда копиÑоваÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑемÑе ÑайлÑ"
-#: rc_option_editor.cc:1787
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr "Ðапка Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ
ÑеÑÑий по ÑмолÑаниÑ:"
-#: rc_option_editor.cc:1795
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "ÐакÑималÑное ÑиÑло недавниÑ
ÑеÑÑий"
-#: rc_option_editor.cc:1808
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr "УÑÐ¾Ð²ÐµÐ½Ñ ÑелÑка меÑÑонома"
-#: rc_option_editor.cc:1813 route_time_axis.cc:269 route_time_axis.cc:833
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "ÐвÑомаÑизаÑиÑ"
-#: rc_option_editor.cc:1818
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr "ФакÑÐ¾Ñ ÑÐ°Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ (болÑÑее знаÑение => менÑÑе даннÑÑ
)"
-#: rc_option_editor.cc:1827
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "ÐнÑеÑвал ÑÑмплиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²ÑомаÑизаÑии (мÑ)"
-#: rc_option_editor.cc:1835
+#: rc_option_editor.cc:1975
msgid "Transport Options"
msgstr "ÐаÑамеÑÑÑ ÑÑанÑпоÑÑа"
-#: rc_option_editor.cc:1841
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "ÐоÑовноÑÑÑ Ðº запиÑи ÑоÑ
ÑанÑеÑÑÑ Ð¿Ð¾Ñле оÑÑановки"
-#: rc_option_editor.cc:1850
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr "ÐеÑÐ»Ñ Ð²Ð¾ÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ°Ðº Ñежим ÑÑанÑпоÑÑа"
-#: rc_option_editor.cc:1855
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -10173,11 +11199,11 @@ msgstr ""
"<b>Ðогда вÑклÑÑено,</b> кнопка пеÑли запÑÑÐºÐ°ÐµÑ Ð²Ð¾ÑпÑоизведение, но пÑи "
"оÑÑановке Ñежим ÑиклиÑеÑкого воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ÑклÑÑаеÑÑÑ."
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr "ÐÑÑанавливаÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¿Ñи ÑаÑÑинÑ
ÑонизаÑии"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
@@ -10185,15 +11211,15 @@ msgstr ""
"<b>Ðогда вклÑÑено,</b> %1 оÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑ, еÑли звÑковÑм движком обнаÑÑжено "
"пеÑеполнение или опÑÑÑоÑение бÑÑеÑа"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "СоздаваÑÑ Ð¼Ð°ÑкеÑÑ Ð² ÑоÑкаÑ
ÑаÑÑинÑ
ÑонизаÑии"
-#: rc_option_editor.cc:1881
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "ÐÑÑанавливаÑÑÑÑ Ð² конÑе ÑеÑÑии"
-#: rc_option_editor.cc:1886
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -10206,13 +11232,13 @@ msgstr ""
"\n"
"<b>Ðогда вÑклÑÑено</b>, %1 бÑÐ´ÐµÑ Ð²Ð¾ÑпÑоизводиÑÑ Ð´Ð°Ð»ÑÑе маÑкеÑа конÑа ÑеÑÑии."
-#: rc_option_editor.cc:1894
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
"ÐеÑÑовное ÑиклиÑеÑкое воÑпÑоизведение (невозможно, когда Ardour ведом по "
"MTC, LTC и Ñ.д.)"
-#: rc_option_editor.cc:1899
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -10229,11 +11255,11 @@ msgstr ""
"обÑаÑно в наÑало Ñикла, когда %1 доÑÑÐ¸Ð³Ð°ÐµÑ ÐºÐ¾Ð½Ñа, ÑÑо бÑÐ´ÐµÑ ÑаÑÑо пÑиводиÑÑ "
"к неболÑÑим ÑелÑкам или задеÑжке."
-#: rc_option_editor.cc:1907
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr "СделаÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм оÑклÑÑение гоÑовноÑÑи к запиÑи пÑи заÑ
ваÑе"
-#: rc_option_editor.cc:1911
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
@@ -10241,11 +11267,11 @@ msgstr ""
"<b>ÐÑли вклÑÑено</b>, Ð²Ñ Ð½Ðµ ÑможеÑе неÑаÑнно вÑклÑÑиÑÑ Ð³Ð¾ÑовноÑÑÑ Ðº запиÑи "
"во вÑÐµÐ¼Ñ Ð·Ð°Ñ
ваÑа Ñигнала"
-#: rc_option_editor.cc:1916
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "ÐÑиглÑÑение гÑомкоÑÑи на 12Ðб пÑи пеÑемоÑке"
-#: rc_option_editor.cc:1920
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
@@ -10253,11 +11279,11 @@ msgstr ""
"ÐÑи пеÑемоÑке воÑпÑинимаемое на ÑлÑÑ
Ñезкое ÑвелиÑение гÑомкоÑÑи бÑÐ´ÐµÑ "
"нивелиÑовано"
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:2066
msgid "Preroll"
msgstr ""
-#: rc_option_editor.cc:1931
+#: rc_option_editor.cc:2071
msgid ""
"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
"initiated.\n"
@@ -10266,43 +11292,50 @@ msgid ""
"position when a region is selected or trimmed."
msgstr ""
-#: rc_option_editor.cc:1933
+#: rc_option_editor.cc:2073
msgid "0 (no pre-roll)"
msgstr ""
-#: rc_option_editor.cc:1934
+#: rc_option_editor.cc:2074
msgid "0.1 second"
msgstr "0,1 Ñ"
-#: rc_option_editor.cc:1935
+#: rc_option_editor.cc:2075
msgid "0.25 second"
msgstr "0,25 Ñ"
-#: rc_option_editor.cc:1936
+#: rc_option_editor.cc:2076
msgid "0.5 second"
msgstr "0,5 Ñ"
-#: rc_option_editor.cc:1937
+#: rc_option_editor.cc:2077
msgid "1.0 second"
msgstr "1 Ñ"
-#: rc_option_editor.cc:1938
+#: rc_option_editor.cc:2078
msgid "2.0 seconds"
msgstr "2 Ñ"
-#: rc_option_editor.cc:1941
-msgid "Sync/Slave"
-msgstr "СинÑ
ÑонизаÑÐ¸Ñ Ð¸ ведомÑй Ñежим"
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "ТÑанÑпоÑÑ/СинÑ
ÑонизаÑиÑ"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "СинÑ
ÑонизаÑÐ¸Ñ Ð¸ паÑамеÑÑÑ Ð²ÐµÐ´Ð¾Ð¼Ð¾Ð³Ð¾ Ñежима"
-#: rc_option_editor.cc:1945
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr "ÐнеÑний иÑÑоÑник ÑинÑ
ÑоÑигнала"
-#: rc_option_editor.cc:1954
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr "ÐдапÑиÑоваÑÑ ÑаÑÑоÑÑ ÐºÐ°Ð´Ñов видео в ÑеÑÑии к внеÑÐ½ÐµÐ¼Ñ Ñайм-кодÑ"
-#: rc_option_editor.cc:1960
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -10325,11 +11358,11 @@ msgstr ""
"ÑÑого индикаÑÐ¾Ñ ÑаÑÑоÑÑ ÐºÐ°Ð´Ñов в оÑновном ÑÑÑÑÑике бÑÐ´ÐµÑ Ð¼ÐµÑÑаÑÑ ÐºÑаÑнÑм, а "
"%1 бÑÐ´ÐµÑ ÐºÐ¾Ð½Ð²ÐµÑÑиÑоваÑÑ Ð²Ð½ÐµÑний Ñайм-код в Ñайм-код ÑеÑÑии."
-#: rc_option_editor.cc:1970
+#: rc_option_editor.cc:2110
msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr "ÐÑивÑзаÑÑ Ñайм-код к ÑаÑам (оÑклÑÑиÑÑ ÐºÐ¾Ð¼Ð¿ÐµÐ½ÑаÑÐ¸Ñ ÑмеÑениÑ)"
-#: rc_option_editor.cc:1976
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
@@ -10350,11 +11383,11 @@ msgstr ""
"<b>Ðогда вÑклÑÑено,</b> %1 компенÑиÑÑÐµÑ Ð¿Ð¾ÑенÑиалÑное ÑмеÑение вне "
"завиÑимоÑÑи Ð¾Ñ Ñого, ÑазделÑÐµÑ Ð»Ð¸ иÑÑоÑник Ñайм-кода ÑинÑ
ÑонизаÑÐ¸Ñ ÑаÑов."
-#: rc_option_editor.cc:1991
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "ÐÑинÑдиÑелÑно иÑполÑзоваÑÑ 29,9700 к/Ñ Ð²Ð¼ÐµÑÑо 30000/1001"
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -10377,27 +11410,27 @@ msgstr ""
"неÑмоÑÑÑ Ð½Ð° ÐµÑ Ð¿ÑоÑивоÑеÑие ÑпеÑиÑикаÑии, поÑÐ¾Ð¼Ñ ÑÑо иÑполÑзование именно "
"29,97 кадÑов в ÑекÑÐ½Ð´Ñ Ð¸Ð¼ÐµÐµÑ Ð½Ñлевое ÑмеÑение Ñайм-кода.\n"
-#: rc_option_editor.cc:2007
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr "ЧÑение LTC"
-#: rc_option_editor.cc:2011
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr "ÐоÑÑ ÑÑÐµÐ½Ð¸Ñ LTC"
-#: rc_option_editor.cc:2027
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr "ÐенеÑаÑÐ¾Ñ LTC"
-#: rc_option_editor.cc:2032
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr "ÐклÑÑиÑÑ Ð³ÐµÐ½ÐµÑаÑÐ¾Ñ LTC"
-#: rc_option_editor.cc:2039
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr "ÐÑпÑавлÑÑÑ LTC в оÑÑановленном ÑоÑÑоÑнии"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
@@ -10405,27 +11438,28 @@ msgstr ""
"<b>Ðогда вклÑÑено,</b> %1 пÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ Ð¿ÐµÑедаваÑÑ LTC даже когда ÑÑанÑпоÑÑ "
"(воÑпÑоизведение) не движеÑÑÑ"
-#: rc_option_editor.cc:2051
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr "УÑÐ¾Ð²ÐµÐ½Ñ Ð³ÐµÐ½ÐµÑаÑоÑа LTC"
-#: rc_option_editor.cc:2055
+#: rc_option_editor.cc:2195
+#, fuzzy
msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is 0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is 0dBu ^= -18dBFS in an EBU calibrated system"
msgstr ""
"УкажиÑе пиковÑÑ Ð³ÑомкоÑÑÑ Ð³ÐµÐ½ÐµÑиÑÑемого Ñигнала LTC в dbFS. ХоÑоÑее каÑеÑÑво "
"ÑÑо 0dBu ^ =-18dbFS в вÑÑеÑказанной EBU калибÑованной ÑиÑÑеме"
-#: rc_option_editor.cc:2064
+#: rc_option_editor.cc:2204
msgid "Make rubberband selection rectangle snap to the grid"
msgstr "ÐÑÑмоÑголÑное вÑделение пÑивÑзÑваеÑÑÑ Ðº ÑеÑке"
-#: rc_option_editor.cc:2071
+#: rc_option_editor.cc:2211
msgid "Name new markers"
msgstr "СпÑаÑиваÑÑ Ð¾Ð± имени каждого нового маÑкеÑа"
-#: rc_option_editor.cc:2076
+#: rc_option_editor.cc:2216
msgid ""
"If enabled, popup a dialog when a new marker is created to allow its name to "
"be set as it is created.\n"
@@ -10438,397 +11472,407 @@ msgstr ""
"ÐÑ Ð²Ñегда можеÑе позднее пеÑеименоваÑÑ Ð¼Ð°ÑкеÑÑ, ÑелкнÑв по ним пÑавой "
"кнопкой мÑÑи."
-#: rc_option_editor.cc:2082
+#: rc_option_editor.cc:2222
msgid "Allow dragging of playhead"
msgstr "РазÑеÑиÑÑ Ð¿ÐµÑеÑаÑкивание ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑоизведениÑ"
-#: rc_option_editor.cc:2090
-msgid "Show meters on tracks in the editor"
-msgstr "ÐоказÑваÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑÑ Ð³ÑомкоÑÑи в доÑожкаÑ
"
-
-#: rc_option_editor.cc:2098
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr "ÐоказÑваÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑÐ¾Ñ Ð³ÑомкоÑÑи маÑÑеÑ-ÑÐ¸Ð½Ñ Ð² панели"
-#: rc_option_editor.cc:2107
+#: rc_option_editor.cc:2239
msgid "Show zoom toolbar (if torn off)"
msgstr "ÐоказÑваÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð¼Ð°ÑÑÑаба (еÑли она оÑкÑеплена)"
-#: rc_option_editor.cc:2116
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+
+#: rc_option_editor.cc:2256
msgid "Update editor window during drags of the summary"
msgstr "ÐбновлÑÑÑ Ð¾ÐºÐ½Ð¾ ÑедакÑоÑа пÑи изменениÑÑ
в панели Ñводки"
-#: rc_option_editor.cc:2124
+#: rc_option_editor.cc:2264
msgid "Auto-scroll editor window when dragging near its edges"
msgstr ""
"ÐвÑомаÑиÑеÑки пÑокÑÑÑиваÑÑ Ð¾ÐºÐ½Ð¾ ÑедакÑоÑа пÑи пеÑеÑаÑкивании близко к кÑаÑм"
-#: rc_option_editor.cc:2132
+#: rc_option_editor.cc:2272
msgid "Show gain envelopes in audio regions"
msgstr "ÐоказÑваÑÑ Ð¾Ð³Ð¸Ð±Ð°ÑÑие ÑÑилениÑ"
-#: rc_option_editor.cc:2133
+#: rc_option_editor.cc:2273
msgid "in all modes"
msgstr "Ðо вÑеÑ
ÑежимаÑ
"
-#: rc_option_editor.cc:2134
+#: rc_option_editor.cc:2274
msgid "only in Draw and Internal Edit modes"
msgstr "ТолÑко в ÑежимаÑ
ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ пÑавки ÑодеÑжимого"
-#: rc_option_editor.cc:2139
+#: rc_option_editor.cc:2279
msgid "Editor Behavior"
msgstr "Ðоведение ÑедакÑоÑа"
-#: rc_option_editor.cc:2144
+#: rc_option_editor.cc:2284
msgid "Move relevant automation when audio regions are moved"
msgstr "ÐеÑемеÑаÑÑ Ð°Ð²ÑомаÑизаÑÐ¸Ñ Ð²Ð¼ÐµÑÑе Ñ Ð¾Ð±Ð»Ð°ÑÑÑми"
-#: rc_option_editor.cc:2151
+#: rc_option_editor.cc:2291
msgid "Default fade shape"
msgstr "ФоÑма Ñейда по ÑмолÑаниÑ"
-#: rc_option_editor.cc:2170
+#: rc_option_editor.cc:2310
msgid "Regions in active edit groups are edited together"
msgstr "ÐблаÑÑи в акÑивнÑÑ
ÑедакÑиÑÑемÑÑ
гÑÑппаÑ
менÑÑÑÑÑ Ð²Ð¼ÐµÑÑе"
-#: rc_option_editor.cc:2171
+#: rc_option_editor.cc:2311
msgid "whenever they overlap in time"
msgstr "Ðогда пеÑеÑекаÑÑÑÑ Ð¿Ð¾ вÑемени"
-#: rc_option_editor.cc:2172
+#: rc_option_editor.cc:2312
msgid "only if they have identical length, position and origin"
msgstr "ÐÑи одинаковой длиÑелÑноÑÑи, позиÑии и пÑоиÑÑ
ождении"
-#: rc_option_editor.cc:2181
+#: rc_option_editor.cc:2321
msgid "Layering model"
msgstr "СпоÑоб наÑлаиваниÑ"
-#: rc_option_editor.cc:2186
+#: rc_option_editor.cc:2326
msgid "later is higher"
msgstr "Ðолее поздние â ÑвеÑÑ
Ñ"
-#: rc_option_editor.cc:2187
+#: rc_option_editor.cc:2327
msgid "manual layering"
msgstr "ÐаÑлаивание вÑÑÑнÑÑ"
-#: rc_option_editor.cc:2192
+#: rc_option_editor.cc:2332
msgid "After splitting selected regions, select"
msgstr "ÐоÑле ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÑбÑаннÑÑ
облаÑÑей вÑбиÑаÑÑ"
-#: rc_option_editor.cc:2197
+#: rc_option_editor.cc:2337
msgid "no regions"
msgstr "Ðе вÑбиÑаÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: rc_option_editor.cc:2200
+#: rc_option_editor.cc:2340
msgid "newly-created regions"
msgstr "ТолÑко ÑÑо ÑозданнÑе облаÑÑи"
-#: rc_option_editor.cc:2204
+#: rc_option_editor.cc:2344
msgid "existing selection and newly-created regions"
msgstr "Ðак вÑбÑаннÑе Ñанее, Ñак и ÑолÑко ÑÑо ÑозданнÑе облаÑÑи"
-#: rc_option_editor.cc:2208
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr "РедакÑоÑ/ÐÐ¾Ð»Ð½Ð¾Ð²Ð°Ñ ÑоÑма"
+
+#: rc_option_editor.cc:2348
msgid "Waveforms"
msgstr "ÐÐ¾Ð»Ð½Ð¾Ð²Ð°Ñ ÑоÑма Ñигнала"
-#: rc_option_editor.cc:2214
+#: rc_option_editor.cc:2354
msgid "Show waveforms in regions"
msgstr "ÐоказÑваÑÑ ÑоÑÐ¼Ñ Ñигнала в облаÑÑÑÑ
"
-#: rc_option_editor.cc:2223
+#: rc_option_editor.cc:2363
msgid "Show waveforms for audio while it is being recorded"
msgstr "ÐоказÑваÑÑ ÑоÑÐ¼Ñ Ð·Ð°Ð¿Ð¸ÑÑваемого Ñигнала пÑи заÑ
ваÑе"
-#: rc_option_editor.cc:2230
+#: rc_option_editor.cc:2370
msgid "Waveform scale"
msgstr "ÐаÑÑÑаб Ñигнала"
-#: rc_option_editor.cc:2235
+#: rc_option_editor.cc:2375
msgid "linear"
msgstr "ÐинейнÑй"
-#: rc_option_editor.cc:2236
+#: rc_option_editor.cc:2376
msgid "logarithmic"
msgstr "ÐогаÑиÑмиÑеÑкий"
-#: rc_option_editor.cc:2242
+#: rc_option_editor.cc:2382
msgid "Waveform shape"
msgstr "ФоÑма Ñигнала"
-#: rc_option_editor.cc:2247
+#: rc_option_editor.cc:2387
msgid "traditional"
msgstr "ÐбÑÑнаÑ"
-#: rc_option_editor.cc:2248
+#: rc_option_editor.cc:2388
msgid "rectified"
msgstr "ÐÑ Ð½Ð¸Ð·Ð°"
-#: rc_option_editor.cc:2257
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr "ÐÑÑеÑизаÑиÑ"
-#: rc_option_editor.cc:2265
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr "ÐониÑоÑинг запиÑи вÑполнÑеÑÑÑ"
-#: rc_option_editor.cc:2271
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr "ЧеÑез аÑдиодÑайвеÑ"
-#: rc_option_editor.cc:2277
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "ÐппаÑаÑнÑм обеÑпеÑением"
-#: rc_option_editor.cc:2284
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Режим плÑноÑного магниÑоÑона"
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Соединение доÑожек и Ñин"
-#: rc_option_editor.cc:2295
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "ÐвÑомаÑиÑеÑки ÑоединÑÑÑ ÑÐ¸Ð½Ñ master/monitor"
-#: rc_option_editor.cc:2302
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "СоединÑÑÑ Ð²Ñ
Ð¾Ð´Ñ Ð´Ð¾Ñожек"
-#: rc_option_editor.cc:2307
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "ÐвÑомаÑиÑеÑки Ñ ÑизиÑеÑкими вÑ
одами"
-#: rc_option_editor.cc:2308 rc_option_editor.cc:2321
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "ÐÑÑÑнÑÑ"
-#: rc_option_editor.cc:2314
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "СоединÑÑÑ Ð²ÑÑ
Ð¾Ð´Ñ Ð´Ð¾Ñожек и Ñин"
-#: rc_option_editor.cc:2319
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "ÐвÑомаÑиÑеÑки Ñ ÑизиÑеÑкими вÑÑ
одами"
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "ÐвÑомаÑиÑеÑки Ñ Ð¾Ð±Ñей Ñиной"
-#: rc_option_editor.cc:2326
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr "ÐÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ñигнала"
-#: rc_option_editor.cc:2331
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr "ÐÑполÑзоваÑÑ ÑмеÑение Ð´Ð»Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ Ð´ÐµÐ½Ð¾ÑмализаÑии"
-#: rc_option_editor.cc:2338
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "ЧÑо делаÑÑ Ñ Ð¾Ð±ÑабоÑÑиками"
-#: rc_option_editor.cc:2344
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "ÐиÑего не делаÑÑ"
-#: rc_option_editor.cc:2350
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr "ÐÑполÑзоваÑÑ FlushToZero"
-#: rc_option_editor.cc:2357
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "ÐÑполÑзоваÑÑ DenormalsAreZero"
-#: rc_option_editor.cc:2364
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr "ÐÑполÑзоваÑÑ FlushToZero и DenormalsAreZero"
-#: rc_option_editor.cc:2380
-msgid "Silence plugins when the transport is stopped"
-msgstr "ÐÑиглÑÑаÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Ð¿Ñи оÑÑановке ÑÑанÑпоÑÑа"
-
-#: rc_option_editor.cc:2388
-msgid "Make new plugins active"
-msgstr "ÐелаÑÑ Ð½Ð¾Ð²Ñе Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Ð°ÐºÑивнÑми"
-
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "ÐклÑÑиÑÑ Ð°Ð²ÑомаÑиÑеÑкий анализ звÑка"
-#: rc_option_editor.cc:2406
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "ÐоÑÑоздаваÑÑ Ð¾ÑÑÑÑÑÑвÑÑÑие ÐºÐ°Ð½Ð°Ð»Ñ Ð¾Ð±Ð»Ð°ÑÑи"
-#: rc_option_editor.cc:2413 rc_option_editor.cc:2422 rc_option_editor.cc:2424
-#: rc_option_editor.cc:2432 rc_option_editor.cc:2440 rc_option_editor.cc:2448
-#: rc_option_editor.cc:2466 rc_option_editor.cc:2478 rc_option_editor.cc:2490
-#: rc_option_editor.cc:2492 rc_option_editor.cc:2494 rc_option_editor.cc:2502
-#: rc_option_editor.cc:2510 rc_option_editor.cc:2518 rc_option_editor.cc:2526
-#: rc_option_editor.cc:2528
-msgid "Solo / mute"
-msgstr "Соло/ÐÑиглÑÑение"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "СолиÑование и пÑиглÑÑение"
-#: rc_option_editor.cc:2417
+#: rc_option_editor.cc:2551
msgid "Solo controls are Listen controls"
msgstr "УпÑавление ÑолиÑованием ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº ÑпÑавление пÑоÑлÑÑиванием"
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:2561
msgid "Exclusive solo"
msgstr "ÐкÑклÑзивное ÑолиÑование"
-#: rc_option_editor.cc:2435
+#: rc_option_editor.cc:2569
msgid "Show solo muting"
msgstr "ÐоказÑваÑÑ Ð¿ÑиглÑÑение пÑи ÑолиÑовании"
-#: rc_option_editor.cc:2443
+#: rc_option_editor.cc:2577
msgid "Soloing overrides muting"
msgstr "СолиÑование пÑиоÑиÑеÑнее пÑиглÑÑениÑ"
-#: rc_option_editor.cc:2451
+#: rc_option_editor.cc:2585
msgid "Solo-in-place mute cut (dB)"
msgstr "ÐÑиглÑÑение Ñигнала пÑи ÑолиÑовании (dB)"
-#: rc_option_editor.cc:2458
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr "Ðоложение пÑоÑлÑÑиваниÑ"
-#: rc_option_editor.cc:2463
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr "ÐоÑле ÑейдеÑа (AFL)"
-#: rc_option_editor.cc:2464
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr "Ðо ÑейдеÑа (PFL)"
-#: rc_option_editor.cc:2470
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr "ÐÑÑоÑник Ñигнала PFL"
-#: rc_option_editor.cc:2475
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr "Ðо поÑлеÑейдеÑнÑÑ
обÑабоÑÑиков"
-#: rc_option_editor.cc:2476
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr "Ðо ÑейдеÑа, но поÑле пÑедÑейдеÑнÑÑ
обÑабоÑÑиков"
-#: rc_option_editor.cc:2482
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr "ÐÑÑоÑник Ñигнала AFL"
-#: rc_option_editor.cc:2487
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr "СÑÐ°Ð·Ñ Ð¿Ð¾Ñле ÑейдеÑа"
-#: rc_option_editor.cc:2488
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr "Ðа поÑлеÑейдеÑнÑми обÑабоÑÑиками и до паноÑамиÑованиÑ"
-#: rc_option_editor.cc:2492
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "ÐÑиглÑÑение доÑожек и Ñин по ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð°ÑÑагиваеÑ"
-#: rc_option_editor.cc:2497
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr "ÐÑедÑейдеÑнÑе поÑÑлÑ"
-#: rc_option_editor.cc:2505
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr "ÐоÑлеÑейдеÑнÑе поÑÑлÑ"
-#: rc_option_editor.cc:2513
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "ÐÑÑ
Ð¾Ð´Ñ Ð¼Ð¾Ð½Ð¸ÑоÑинга"
-#: rc_option_editor.cc:2521
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "ÐÑновнÑе вÑÑ
одÑ"
-#: rc_option_editor.cc:2526
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr "ÐаÑÑÑÑÑизаÑÐ¸Ñ Ð¿Ð¾ÑÑлов"
-#: rc_option_editor.cc:2531
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr "Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑвÑзÑваÑÑ Ð²Ð½ÐµÑние поÑÑÐ»Ñ Ñ Ð¾ÑновнÑм ÑегÑлÑÑоÑом паноÑамÑ"
-#: rc_option_editor.cc:2536
+#: rc_option_editor.cc:2672
msgid "MIDI Preferences"
msgstr "ÐаÑамеÑÑÑ MIDI"
-#: rc_option_editor.cc:2541
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr "ЧÑение MIDI Ñ ÑпÑеждением (в ÑекÑндаÑ
)"
-#: rc_option_editor.cc:2551
+#: rc_option_editor.cc:2687
msgid "Initial program change"
msgstr "ÐÑÑ
Ð¾Ð´Ð½Ð°Ñ Ñмена пÑогÑаммÑ"
-#: rc_option_editor.cc:2560
+#: rc_option_editor.cc:2696
msgid "Display first MIDI bank/program as 0"
msgstr "ÐоказÑваÑÑ Ð¿ÐµÑвÑй банк/пÑогÑÐ°Ð¼Ð¼Ñ MIDI как 0"
-#: rc_option_editor.cc:2568
+#: rc_option_editor.cc:2704
msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
msgstr "Ðикогда не показÑваÑÑ Ð¿ÐµÑиодиÑеÑкие ÑообÑÐµÐ½Ð¸Ñ MIDI (MTC, MIDI Clock)"
-#: rc_option_editor.cc:2576
+#: rc_option_editor.cc:2712
msgid "Sound MIDI notes as they are selected in the editor"
msgstr "ÐоÑпÑоизводиÑÑ Ð²ÑбиÑаемÑе в ÑедакÑоÑе ноÑÑ MIDI"
-#: rc_option_editor.cc:2584
+#: rc_option_editor.cc:2720
msgid "Send MIDI control feedback"
msgstr "ÐÑпÑавлÑÑÑ Ð¾Ñклик на конÑÑолÑнÑе ÑобÑÑÐ¸Ñ MIDI"
-#: rc_option_editor.cc:2589
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/СинÑ
ÑонизаÑиÑ"
+
+#: rc_option_editor.cc:2725
msgid "MIDI Clock"
msgstr "MIDI Clock"
-#: rc_option_editor.cc:2599
+#: rc_option_editor.cc:2735
msgid "MIDI Time Code (MTC)"
-msgstr "Там-код MIDI (MTC)"
+msgstr "Тайм-код MIDI (MTC)"
-#: rc_option_editor.cc:2604
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr "ÐеÑедаваÑÑ MIDI Time Code"
-#: rc_option_editor.cc:2612
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr "ÐÑоÑÐµÐ½Ñ Ð¿Ð¾ обе ÑÑоÑÐ¾Ð½Ñ Ð¾Ñ Ð½Ð¾ÑмалÑной ÑÑанÑп. ÑкоÑоÑÑи Ð´Ð»Ñ Ð¿ÐµÑедаÑи MTC"
-#: rc_option_editor.cc:2618
+#: rc_option_editor.cc:2754
msgid "Midi Machine Control (MMC)"
msgstr "Midi Machine Control (MMC)"
-#: rc_option_editor.cc:2623
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "ÐÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ MIDI Machine Control"
-#: rc_option_editor.cc:2631
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
msgstr "ÐÑпÑавлÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ MIDI Machine Control"
-#: rc_option_editor.cc:2639
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr "ÐденÑиÑикаÑÐ¾Ñ Ð²Ñ
одÑÑего ÑÑÑÑойÑÑва MMC"
-#: rc_option_editor.cc:2648
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr "ÐденÑиÑикаÑÐ¾Ñ Ð²ÑÑ
одÑÑего ÑÑÑÑойÑÑва MMC"
-#: rc_option_editor.cc:2654
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr "ÐÑоÑлÑÑивание MIDI"
-#: rc_option_editor.cc:2658
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr "ÐнÑÑÑÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð¿ÑоÑлÑÑÐ¸Ð²Ð°Ð½Ð¸Ñ MIDI (LV2)"
-#: rc_option_editor.cc:2689 rc_option_editor.cc:2699 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr "ÐзаимодейÑÑвие Ñ Ð¿Ð¾Ð»ÑзоваÑелем"
-#: rc_option_editor.cc:2692
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
@@ -10838,35 +11882,24 @@ msgstr ""
" <i>(вÑÑÑÐ¿Ð°ÐµÑ Ð² ÑÐ¸Ð»Ñ Ð¿Ð¾Ñле пеÑезапÑÑка %1)</i>\n"
" <i>(еÑли локализаÑÐ¸Ñ Ð´Ð»Ñ Ð²Ð°Ñего ÑзÑка доÑÑÑпна)</i>"
-#: rc_option_editor.cc:2699
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "ÐлавиаÑÑÑа"
-#: rc_option_editor.cc:2709
-msgid "Control surface remote ID"
-msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ"
-
-#: rc_option_editor.cc:2714
-msgid "assigned by user"
-msgstr "ÐазнаÑеннÑе полÑзоваÑелем"
-
-#: rc_option_editor.cc:2715
-msgid "follows order of mixer"
-msgstr "СледÑÑÑ Ð¿Ð¾ÑÑÐ´ÐºÑ Ð¼Ð¸ÐºÑеÑа"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr "ÐÑоÑканиÑоваÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ"
-#: rc_option_editor.cc:2723
+#: rc_option_editor.cc:2853
msgid "General"
msgstr "Ðлавное"
-#: rc_option_editor.cc:2726 startup.cc:351
-msgid "Scan for Plugins"
-msgstr "ÐÑоÑканиÑоваÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ"
-
-#: rc_option_editor.cc:2731
+#: rc_option_editor.cc:2858
msgid "Always Display Plugin Scan Progress"
msgstr "ÐÑегда показÑваÑÑ Ð¿ÑогÑеÑÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²"
-#: rc_option_editor.cc:2737
+#: rc_option_editor.cc:2864
msgid ""
"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
"for indexing (cache load) and discovery (detect new plugins)"
@@ -10874,15 +11907,45 @@ msgstr ""
"<b>Ðогда вклÑÑено,</b> вÑплÑваÑÑее окно показÑÐ²Ð°ÐµÑ Ð¿ÑогÑеÑÑ Ð¿Ð¾Ð¸Ñка и "
"индекÑаÑии звÑковÑÑ
плагинов в ÑиÑÑеме"
-#: rc_option_editor.cc:2742
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "ÐÑиглÑÑаÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Ð¿Ñи оÑÑановке ÑÑанÑпоÑÑа"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "ÐелаÑÑ Ð½Ð¾Ð²Ñе Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ Ð°ÐºÑивнÑми"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "ÐлагинÑ/VST"
+
+#: rc_option_editor.cc:2888
msgid "VST"
msgstr "VST"
-#: rc_option_editor.cc:2746
+#: rc_option_editor.cc:2895
msgid "Scan for [new] VST Plugins on Application Start"
msgstr "ÐÑкаÑÑ Ð½Ð¾Ð²Ñе Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ VST пÑи запÑÑке пÑиложениÑ"
-#: rc_option_editor.cc:2752
+#: rc_option_editor.cc:2901
msgid ""
"<b>When enabled</b> new VST plugins are searched, tested and added to the "
"cache index on application start. When disabled new plugins will only be "
@@ -10892,11 +11955,11 @@ msgstr ""
"ÑеÑÑиÑование и добавление новÑÑ
плагинов VST в Ð¸Ð½Ð´ÐµÐºÑ ÐºÑÑа. Ðогда оÑклÑÑено, "
"новÑе Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ ÑÑановÑÑÑÑ Ð´Ð¾ÑÑÑпнÑми лиÑÑ Ð¿Ð¾Ñле запÑÑка ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑÑÑнÑÑ."
-#: rc_option_editor.cc:2758
+#: rc_option_editor.cc:2907
msgid "Verbose Plugin Scan"
-msgstr ""
+msgstr "ÐодÑобное ÑканиÑование плагинов"
-#: rc_option_editor.cc:2764
+#: rc_option_editor.cc:2913
msgid ""
"<b>When enabled</b> additional information for every plugin is added to the "
"Log Window."
@@ -10904,35 +11967,40 @@ msgstr ""
"<b>ÐÑли вклÑÑено</b>, дополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ каждом плагине вÑводиÑÑÑ Ð² "
"окно жÑÑнала."
-#: rc_option_editor.cc:2772
+#: rc_option_editor.cc:2921
msgid "VST Cache:"
msgstr "ÐÑÑ VST:"
-#: rc_option_editor.cc:2777
+#: rc_option_editor.cc:2926
msgid "VST Blacklist:"
msgstr "ЧÑÑнÑй ÑпиÑок VST:"
-#: rc_option_editor.cc:2784
+#: rc_option_editor.cc:2933
msgid "Linux VST Path:"
msgstr "РазмеÑение Linux VST:"
-#: rc_option_editor.cc:2789 rc_option_editor.cc:2802
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
msgid "Path:"
msgstr "РаÑположение:"
-#: rc_option_editor.cc:2798
+#: rc_option_editor.cc:2947
msgid "Windows VST Path:"
msgstr "РазмеÑение Windows VST:"
-#: rc_option_editor.cc:2808
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "ÐлагинÑ/Audio Unit"
+
+#: rc_option_editor.cc:2958
msgid "Audio Unit"
msgstr "Audio Unit"
-#: rc_option_editor.cc:2812
+#: rc_option_editor.cc:2965
msgid "Scan for AudioUnit Plugins on Application Start"
msgstr "ÐÑкаÑÑ Ð½Ð¾Ð²Ñе Ð¿Ð»Ð°Ð³Ð¸Ð½Ñ AudioUnit пÑи запÑÑке пÑиложениÑ"
-#: rc_option_editor.cc:2818
+#: rc_option_editor.cc:2971
msgid ""
"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
"When disabled AU plugins will only be available after triggering a 'Scan' "
@@ -10945,167 +12013,208 @@ msgstr ""
"вклÑÑено авÑомаÑиÑеÑкое ÑканиÑование плагинов AU. ÐÑи лÑбом падении "
"пÑогÑÐ°Ð¼Ð¼Ñ Ð²Ð¾ вÑÐµÐ¼Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑкое ÑканиÑование бÑÐ´ÐµÑ Ð¾ÑклÑÑено."
-#: rc_option_editor.cc:2823
+#: rc_option_editor.cc:2976
msgid "AU Cache:"
msgstr "ÐÑÑ AU:"
-#: rc_option_editor.cc:2828
+#: rc_option_editor.cc:2981
msgid "AU Blacklist:"
msgstr "ЧÑÑнÑй ÑпиÑок AU:"
-#: rc_option_editor.cc:2832
+#: rc_option_editor.cc:2985
msgid "Plugin GUI"
msgstr "ÐнÑеÑÑÐµÐ¹Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²"
-#: rc_option_editor.cc:2836
+#: rc_option_editor.cc:2989
msgid "Automatically open the plugin GUI when adding a new plugin"
msgstr "ÐвÑомаÑиÑеÑки оÑкÑÑваÑÑ Ð¾ÐºÐ½Ð¾ плагина поÑле его добавлениÑ"
-#: rc_option_editor.cc:2847
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "ÐоказÑваÑÑ Ð²ÑÑÑаиваемÑй инÑеÑÑÐµÐ¹Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð² в микÑеÑе по ÑмолÑаниÑ"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+"Ðе оÑкÑÑваÑÑ GUI плагина авÑомаÑиÑеÑки, еÑли Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° еÑÑÑ Ð²ÑÑÑаиваемÑй "
+"инÑеÑÑейÑ"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "ÐиÑÑÑалÑнÑе инÑÑÑÑменÑÑ"
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "СпÑаÑиваÑÑ Ð¾ замене Ñже добавленного плагина виÑÑÑалÑного инÑÑÑÑменÑа"
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr "ÐапÑаÑиваÑÑ Ð¿Ð°ÑамеÑÑÑ Ð²Ð¸ÑÑÑалÑнÑÑ
инÑÑÑÑменÑов на возвÑаÑе"
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
msgid "Disable Graphics Hardware Acceleration (requires restart)"
msgstr "ÐÑклÑÑиÑÑ Ð°Ð¿Ð¿Ð°ÑаÑное ÑÑкоÑение гÑаÑики (ÑÑебÑÐµÑ Ð¿ÐµÑезапÑÑка)"
-#: rc_option_editor.cc:2853
+#: rc_option_editor.cc:3045
msgid ""
"Render large parts of the application user-interface in software, instead of "
"using 2D-graphics acceleration.\n"
"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2854 rc_option_editor.cc:2866 rc_option_editor.cc:2869
-#: rc_option_editor.cc:2878 rc_option_editor.cc:2887 rc_option_editor.cc:2906
-#: rc_option_editor.cc:2922 rc_option_editor.cc:2938 rc_option_editor.cc:2952
-#: rc_option_editor.cc:2961
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
msgid "Preferences|GUI"
msgstr "ÐнÑеÑÑейÑ"
-#: rc_option_editor.cc:2860
+#: rc_option_editor.cc:3052
msgid "Possibly improve slow graphical performance (requires restart)"
msgstr ""
-#: rc_option_editor.cc:2865
+#: rc_option_editor.cc:3057
msgid ""
"Disables hardware gradient rendering on buggy video drivers (\"buggy "
"gradients patch\").\n"
"This requires restarting %1 before having an effect"
msgstr ""
-#: rc_option_editor.cc:2872
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3072
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "ÐодÑвеÑиваÑÑ ÑлеменÑÑ Ð¸Ð½ÑеÑÑейÑа под ÑказаÑелем мÑÑи"
-#: rc_option_editor.cc:2881
+#: rc_option_editor.cc:3080
msgid "Show tooltips if mouse hovers over a control"
msgstr "ÐоказÑваÑÑ Ð²ÑплÑваÑÑие подÑказки к ÑлеменÑам инÑеÑÑейÑа"
-#: rc_option_editor.cc:2890
+#: rc_option_editor.cc:3088
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr "ÐодÑвеÑиваÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑей (ÑÑебÑÐµÑ Ð¿ÐµÑезапÑÑка)"
-#: rc_option_editor.cc:2898
+#: rc_option_editor.cc:3096
msgid "Update transport clock display at FPS instead of every 100ms"
msgstr "ÐбновлÑÑÑ ÑÑÑÑÑик ÑÑанÑпоÑÑа по FPS, а не каждÑе 100 мÑ"
-#: rc_option_editor.cc:2913
+#: rc_option_editor.cc:3111
msgid "Waveform image cache size (megabytes)"
msgstr "Ð Ð°Ð·Ð¼ÐµÑ ÐºÑÑа Ð´Ð»Ñ Ð³ÑаÑики волновой ÑоÑÐ¼Ñ (ÐÐ)"
-#: rc_option_editor.cc:2921
+#: rc_option_editor.cc:3119
msgid ""
"Increasing the cache size uses more memory to store waveform images, which "
"can improve graphical performance."
msgstr ""
-#: rc_option_editor.cc:2929
+#: rc_option_editor.cc:3127
msgid "Lock timeout (seconds)"
msgstr "Тайм-аÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки (ÑекÑндÑ)"
-#: rc_option_editor.cc:2937
+#: rc_option_editor.cc:3135
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
"ÐлокиÑовка GUI поÑле ÑÑого колиÑеÑÑва ÑекÑнд пÑоÑÑоÑ\n"
"(0 - никогда не блокиÑоваÑÑ)"
-#: rc_option_editor.cc:2954
+#: rc_option_editor.cc:3153
msgid "Mixer Strip"
msgstr "ÐолоÑа микÑеÑа"
-#: rc_option_editor.cc:2964
+#: rc_option_editor.cc:3163
msgid "Use narrow strips in the mixer by default"
msgstr "ÐÑполÑзоваÑÑ Ñонкие полоÑки в микÑеÑе по ÑмолÑаниÑ"
-#: rc_option_editor.cc:2969 rc_option_editor.cc:2983 rc_option_editor.cc:3000
-#: rc_option_editor.cc:3016 rc_option_editor.cc:3032 rc_option_editor.cc:3046
-#: rc_option_editor.cc:3072 rc_option_editor.cc:3090 rc_option_editor.cc:3101
-#: rc_option_editor.cc:3108 rc_option_editor.cc:3110
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
msgid "Preferences|Metering"
msgstr "ÐамеÑ"
-#: rc_option_editor.cc:2973
+#: rc_option_editor.cc:3180
msgid "Peak hold time"
msgstr "УдеÑживание пика"
-#: rc_option_editor.cc:2979
+#: rc_option_editor.cc:3186
msgid "short"
msgstr "ÐоÑоÑкое"
-#: rc_option_editor.cc:2980
+#: rc_option_editor.cc:3187
msgid "medium"
msgstr "СÑеднее"
-#: rc_option_editor.cc:2981
+#: rc_option_editor.cc:3188
msgid "long"
msgstr "Ðолгое"
-#: rc_option_editor.cc:2987
+#: rc_option_editor.cc:3194
msgid "DPM fall-off"
msgstr "СкоÑоÑÑÑ ÑпаданиÑ"
-#: rc_option_editor.cc:2993
+#: rc_option_editor.cc:3200
msgid "slowest [6.6dB/sec]"
msgstr "Самое медленное [6,6 Ðб/Ñ]"
-#: rc_option_editor.cc:2994
+#: rc_option_editor.cc:3201
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "Ðедленное [8,6 Ðб/Ñ] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:2995
+#: rc_option_editor.cc:3202
msgid "moderate [12.0dB/sec] (DIN)"
msgstr "УмеÑенное [12 Ðб/Ñ] (DIN)"
-#: rc_option_editor.cc:2996
+#: rc_option_editor.cc:3203
msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr "СÑеднее [13,3 Ðб/Ñ] (EBU Digi PPM, IRT Digi PPM)"
-#: rc_option_editor.cc:2997
+#: rc_option_editor.cc:3204
msgid "fast [20dB/sec]"
msgstr "ÐÑÑÑÑое [20 Ðб/Ñ]"
-#: rc_option_editor.cc:2998
+#: rc_option_editor.cc:3205
msgid "very fast [32dB/sec]"
msgstr "ÐÑÐµÐ½Ñ Ð±ÑÑÑÑое [32 Ðб/Ñ]"
-#: rc_option_editor.cc:3004
+#: rc_option_editor.cc:3211
msgid "Meter line-up level; 0dBu"
msgstr "ТоÑка вÑÑÐ°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа; 0dBu"
-#: rc_option_editor.cc:3009 rc_option_editor.cc:3025
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-#: rc_option_editor.cc:3010 rc_option_editor.cc:3026
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
msgid "-20dBFS (SMPTE RP.0155)"
msgstr "-20dBFS (SMPTE RP.0155)"
-#: rc_option_editor.cc:3011 rc_option_editor.cc:3027
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
msgid "-18dBFS (EBU, BBC)"
msgstr "-18dBFS (EBU, BBC)"
-#: rc_option_editor.cc:3012 rc_option_editor.cc:3028
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
msgid "-15dBFS (DIN)"
msgstr "-15dBFS (DIN)"
-#: rc_option_editor.cc:3014
+#: rc_option_editor.cc:3221
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -11113,71 +12222,97 @@ msgstr ""
"ÐаÑÑÑойка измеÑ. маÑкеÑов и ÑвеÑа ÑоÑки Ñзла Ð´Ð»Ñ dBFS маÑÑÑабиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÐºÐ°Ð»Ñ "
"DPM, ÑÑÑановка ÑÑалонного ÑÑÐ¾Ð²Ð½Ñ Ð´Ð»Ñ IEC1/Nordic, PPM и VU-меÑÑа."
-#: rc_option_editor.cc:3020
+#: rc_option_editor.cc:3227
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr "ТоÑка вÑÑÐ°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа IEC1/DIN; 0dBu"
-#: rc_option_editor.cc:3030
+#: rc_option_editor.cc:3237
msgid "Reference level for IEC1/DIN meter."
msgstr "РеÑеÑенÑнÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа IEC1/DIN"
-#: rc_option_editor.cc:3036
+#: rc_option_editor.cc:3243
msgid "VU Meter standard"
msgstr "СÑандаÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа VU"
-#: rc_option_editor.cc:3041
+#: rc_option_editor.cc:3248
msgid "0VU = -2dBu (France)"
msgstr "0VU = -2dBu (ФÑанÑиÑ)"
-#: rc_option_editor.cc:3042
+#: rc_option_editor.cc:3249
msgid "0VU = 0dBu (North America, Australia)"
msgstr "0VU = 0dBu (СевеÑÐ½Ð°Ñ ÐмеÑика, ÐвÑÑÑалиÑ)"
-#: rc_option_editor.cc:3043
+#: rc_option_editor.cc:3250
msgid "0VU = +4dBu (standard)"
msgstr "0VU = +4dBu (ÑÑандаÑÑ)"
-#: rc_option_editor.cc:3044
+#: rc_option_editor.cc:3251
msgid "0VU = +8dBu"
msgstr "0VU = +8dBu"
-#: rc_option_editor.cc:3050
+#: rc_option_editor.cc:3257
msgid "Peak threshold [dBFS]"
msgstr "ÐоÑог пика (dbFS)"
-#: rc_option_editor.cc:3059
+#: rc_option_editor.cc:3266
msgid "Default Meter Type for Master Bus"
msgstr "Тип индикаÑоÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¼Ð°ÑÑеÑ-ÑинÑ"
-#: rc_option_editor.cc:3077
+#: rc_option_editor.cc:3284
msgid "Default Meter Type for Busses"
msgstr "Тип индикаÑоÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñин"
-#: rc_option_editor.cc:3094
+#: rc_option_editor.cc:3301
msgid "Default Meter Type for Tracks"
msgstr "Тип индикаÑоÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾Ñожек"
-#: rc_option_editor.cc:3106
+#: rc_option_editor.cc:3313
+#, fuzzy
msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
"УкажиÑе в dbFS номиналÑнÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð·Ð²Ñкового Ñигнала и пикового, когда "
"индикаÑÐ¾Ñ Ð¼Ð¸Ð³Ð°ÐµÑ ÐºÑаÑнÑм ÑвеÑом."
-#: rc_option_editor.cc:3113
+#: rc_option_editor.cc:3320
msgid "LED meter style"
msgstr "ÐндикаÑÐ¾Ñ Ð² ÑÑиле LED"
-#: rc_option_editor.cc:3121
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "ÐндикаÑоÑÑ Ð² ÑедакÑоÑе"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "ÐоказÑваÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑÑ Ð³ÑомкоÑÑи в доÑожкаÑ
"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+"ÐоказÑваÑÑ Ð² боковой панели ÑедакÑоÑа индикаÑÐ¾Ñ Ð½Ðµ более Ñем двÑÑ
каналов"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr "Ðнализ поÑле ÑкÑпоÑÑа"
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "СоÑ
ÑаниÑÑ Ð³ÑаÑик гÑомкоÑÑи как изобÑажение"
+
+#: rc_option_editor.cc:3356
msgid "Theme"
msgstr "Тема"
-#: rc_option_editor.cc:3194
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "Тема/ЦвеÑа"
+
+#: rc_option_editor.cc:3436
msgid "Set Linux VST Search Path"
msgstr "УÑÑановка пÑÑи поиÑка Linux VST"
-#: rc_option_editor.cc:3208
+#: rc_option_editor.cc:3450
msgid "Set Windows VST Search Path"
msgstr "УÑÑановка пÑÑи поиÑка Windows VST"
@@ -11189,7 +12324,7 @@ msgstr "ÐÑоÑлÑÑивание облаÑÑи"
msgid "Position:"
msgstr "ÐозиÑиÑ:"
-#: region_editor.cc:92 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
msgid "End:"
msgstr "ÐонеÑ:"
@@ -11253,34 +12388,34 @@ msgstr "ÐоÑожка:"
msgid "Choose Top Region"
msgstr "ÐÑбÑаÑÑ Ð²ÐµÑÑ
нÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ"
-#: region_view.cc:270
+#: region_view.cc:271
msgid "SilenceText"
msgstr "ТекÑÑ Ð±ÐµÐ· Ñведений"
-#: region_view.cc:285 region_view.cc:304
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "минÑÑ"
-#: region_view.cc:288 region_view.cc:307
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "мÑ"
-#: region_view.cc:291 region_view.cc:310
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "Ñ"
-#: region_view.cc:294
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] "%1 ÑиÑ
ий ÑегменÑ"
msgstr[1] "%1 ÑиÑ
иÑ
ÑегменÑа"
msgstr[2] "%1 ÑиÑ
иÑ
ÑегменÑов"
-#: region_view.cc:296
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr "кÑаÑÑайÑий = %1 %2"
-#: region_view.cc:313
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -11328,55 +12463,63 @@ msgstr "ÐÑлбека-ÐиблеÑа"
msgid "Modified Kullback-Liebler"
msgstr "ÐзменÑÐ½Ð½Ð°Ñ ÐÑлбека-ÐиблеÑа"
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "СпекÑÑалÑÐ½Ð°Ñ Ð¿ÐµÑеменÑивоÑÑÑ"
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "РазделиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr "ÐÑиклеиÑÑ Ð¾Ð±Ð»Ð°ÑÑи к ÑеÑке"
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "СоглаÑоваÑÑ Ð¾Ð±Ð»Ð°ÑÑи"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "РиÑмиÑеÑкий Ñ
оÑÑк"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "ÐÑоанализиÑоваÑÑ"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "ФÑнкÑÐ¸Ñ Ð¾Ð¿ÑеделениÑ"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "ÐнÑеÑвал ÑÑиггеÑа"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:65
-msgid "Threshold"
-msgstr "ÐоÑог"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "ÐоÑог пика"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "ÐоÑог ÑиÑинÑ"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "ЧÑвÑÑвиÑелÑноÑÑÑ"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "ÐейÑÑвие"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "Разделение облаÑÑей (ÑиÑм Ferret)"
@@ -11400,19 +12543,15 @@ msgstr "ÐоÑовноÑÑÑ Ðº запиÑи"
msgid "Active state"
msgstr "ÐкÑивное ÑоÑÑоÑние"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:87
-msgid "Color"
-msgstr "ЦвеÑ"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr "RouteGroupDialog"
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>РазделÑÑÑÑÑ:</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr "Ðазвание гÑÑÐ¿Ð¿Ñ Ð½Ðµ ÑвлÑеÑÑÑ ÑникалÑнÑм. ÐÑполÑзÑйÑе дÑÑгое имÑ."
@@ -11432,84 +12571,88 @@ msgstr "ÐÑÑ
одÑ"
msgid "Plugins, Inserts & Sends"
msgstr "ÐлагинÑ, возвÑаÑÑ Ð¸ поÑÑлÑ"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "ÐаÑÑÑÑÑ Ð²Ñвода ÑпиÑка пÑнкÑов Ð´Ð»Ñ Ð¿ÐµÑеименованного маÑÑÑÑÑа не найден!"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "ÐадеÑжка воÑпÑоизведениÑ: %<PRId64> ÑÑмплов"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "ÐÐТ ÐÐÐ ÐÐÐÐ"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "ÐобавиÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ð¸Ð»Ð¸ ÑинÑ"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "ÐÐµÑ Ð²ÑбÑаннÑÑ
доÑожек или Ñин"
-#: route_time_axis.cc:105
+#: route_time_axis.cc:104
msgid "RTAV|G"
msgstr "Ð"
-#: route_time_axis.cc:106
+#: route_time_axis.cc:105
msgid "RTAV|P"
msgstr "Ð"
-#: route_time_axis.cc:107
+#: route_time_axis.cc:106
msgid "RTAV|A"
msgstr "Ð"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr "ÐапиÑÑ (пÑÐ°Ð²Ð°Ñ ÐºÐ»Ð°Ð²Ð¸Ñа мÑÑи акÑивиÑÑÐµÑ Ð¿Ð¾ÑаговÑй ввод)"
-#: route_time_axis.cc:187
+#: route_time_axis.cc:197
msgid "Record"
msgstr "ÐапиÑÑ"
-#: route_time_axis.cc:257
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "ÐÑÑппа маÑÑÑÑÑизаÑии"
-#: route_time_axis.cc:267
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr "MIDI-конÑÑоллеÑÑ Ð¸ авÑомаÑизаÑиÑ"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "ÐоказаÑÑ Ð²ÑÑ Ð°Ð²ÑомаÑизаÑиÑ"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "ÐоказаÑÑ ÑÑÑеÑÑвÑÑÑÑÑ Ð°Ð²ÑомаÑизаÑиÑ"
-#: route_time_axis.cc:504
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "СкÑÑÑÑ Ð²ÑÑ Ð°Ð²ÑомаÑизаÑиÑ"
-#: route_time_axis.cc:513
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr "ÐвÑомаÑизаÑÐ¸Ñ Ð¾Ð±ÑабоÑÑика"
-#: route_time_axis.cc:520
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "ФейдеÑ"
-#: route_time_axis.cc:547
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "ÐаноÑама"
-#: route_time_axis.cc:638
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "ÐеÑекÑÑваÑÑ Ð´ÑÑг дÑÑга"
-#: route_time_axis.cc:644
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "Ð ÑÑопке"
-#: route_time_axis.cc:652
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Слои"
@@ -11526,12 +12669,12 @@ msgid "(Currently: Capture Time)"
msgstr "(СейÑаÑ: по вÑемени заÑ
ваÑа)"
#: route_time_axis.cc:741
-msgid "Align with Existing Material"
-msgstr ""
+msgid "Align With Existing Material"
+msgstr "С запиÑаннÑм маÑеÑиалом"
#: route_time_axis.cc:746
-msgid "Align with Capture Time"
-msgstr ""
+msgid "Align With Capture Time"
+msgstr "Ðо вÑемени заÑ
ваÑа"
#: route_time_axis.cc:751
msgid "Alignment"
@@ -11553,188 +12696,191 @@ msgstr "ÐеÑÑлойнÑй Ñежим"
msgid "Record Mode"
msgstr "Режим запиÑи"
-#: route_time_axis.cc:811 route_time_axis.cc:1806
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "СпиÑок"
-#: route_time_axis.cc:1109
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "ÐеÑеименоваÑÑ ÑпиÑок воÑпÑоизведениÑ"
-#: route_time_axis.cc:1110
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "Ðовое название ÑпиÑка воÑпÑоизведениÑ:"
-#: route_time_axis.cc:1195
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑпиÑка воÑпÑоизведениÑ"
-#: route_time_axis.cc:1196 route_time_axis.cc:1249
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "Ðазвание нового ÑпиÑка воÑпÑоизведениÑ:"
-#: route_time_axis.cc:1248
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "ÐовÑй ÑпиÑок воÑпÑоизведениÑ"
-#: route_time_axis.cc:1452
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-"ÐÑ Ð½Ðµ можеÑе добавиÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼, коÑоÑое заÑезеÑвиÑовано Ð´Ð»Ñ %1"
-#: route_time_axis.cc:1695
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "СоздаÑÑ ÐºÐ¾Ð¿Ð¸Ñ..."
-#: route_time_axis.cc:1699
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "ÐовÑй дÑблÑ"
-#: route_time_axis.cc:1700
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "СкопиÑоваÑÑ Ð´ÑблÑ"
-#: route_time_axis.cc:1705
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "ÐÑиÑÑиÑÑ ÑекÑÑий"
-#: route_time_axis.cc:1708
+#: route_time_axis.cc:1697
msgid "Select from All..."
msgstr ""
-#: route_time_axis.cc:1796
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr "ÐÑблÑ: %1.%2"
-#: route_time_axis.cc:2202 selection.cc:1009 selection.cc:1063
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "ÐÑибка в пÑогÑамме: "
-#: route_time_axis.cc:2622
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr "ÐодÑлойка"
-#: route_time_axis.cc:2625
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "УдалиÑÑ Â«%1»"
-#: route_time_axis.cc:2675 route_time_axis.cc:2712
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr "ÐÑибка в пÑогÑамме: паÑÑ Ð¿Ð¾Ð´Ð»Ð¾Ð¶ÐºÐ° и ÑказаÑÐµÐ»Ñ ÑÑÑлки неÑовмеÑÑимÑ!"
-#: route_time_axis.cc:2739
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr "ÐÑоÑлÑÑивание поÑле ÑейдеÑа (AFL)"
-#: route_time_axis.cc:2743
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr "ÐÑоÑлÑÑивание до ÑейдеÑа (PFL)"
-#: route_ui.cc:153
+#: route_ui.cc:169
msgid "Mute this track"
msgstr "ÐÑиглÑÑиÑÑ ÑÑÑ Ð´Ð¾ÑожкÑ"
-#: route_ui.cc:157
+#: route_ui.cc:173
msgid "Mute other (non-soloed) tracks"
msgstr "ÐÑиглÑÑиÑÑ Ð´ÑÑгие (не ÑолиÑÑÑÑие) доÑожки"
-#: route_ui.cc:163
+#: route_ui.cc:179
msgid "Enable recording on this track"
msgstr "ÐклÑÑиÑÑ Ð³Ð¾ÑовноÑÑÑ Ðº запиÑи ÑÑой доÑожки"
-#: route_ui.cc:171
+#: route_ui.cc:187
msgid "make mixer strips show sends to this bus"
msgstr "ÐоказÑваÑÑ Ð² полоÑкаÑ
микÑеÑа поÑÑÐ»Ñ Ðº ÑÑой Ñине"
-#: route_ui.cc:176
+#: route_ui.cc:192
msgid "Monitor input"
msgstr "ÐониÑоÑинг вÑ
ода"
-#: route_ui.cc:182
+#: route_ui.cc:198
msgid "Monitor playback"
msgstr "ÐониÑоÑинг воÑпÑоизведениÑ"
-#: route_ui.cc:691
+#: route_ui.cc:710
msgid "Not connected to AudioEngine - cannot engage record"
msgstr "Ðе подклÑÑено к AudioEngine. ÐелÑÐ·Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑ."
-#: route_ui.cc:890
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:892
msgid "Step Entry"
msgstr "ÐоÑаговÑй ввод"
-#: route_ui.cc:963
+#: route_ui.cc:991
msgid "Assign all tracks (prefader)"
msgstr "ÐазнаÑиÑÑ Ð²Ñем доÑожкам (до ÑейдеÑа)"
-#: route_ui.cc:967
+#: route_ui.cc:995
msgid "Assign all tracks and buses (prefader)"
msgstr "ÐазнаÑиÑÑ Ð²Ñем доÑожкам и Ñинам (до ÑейдеÑа)"
-#: route_ui.cc:971
+#: route_ui.cc:999
msgid "Assign all tracks (postfader)"
msgstr "ÐазнаÑиÑÑ Ð²Ñем доÑожкам (поÑле ÑейдеÑа)"
-#: route_ui.cc:975
+#: route_ui.cc:1003
msgid "Assign all tracks and buses (postfader)"
msgstr "ÐазнаÑиÑÑ Ð²Ñем доÑожкам и Ñинам (поÑле ÑейдеÑа)"
-#: route_ui.cc:979
+#: route_ui.cc:1007
msgid "Assign selected tracks (prefader)"
msgstr "ÐазнаÑиÑÑ Ð²ÑбÑаннÑм доÑожкам (до ÑейдеÑа)"
-#: route_ui.cc:983
+#: route_ui.cc:1011
msgid "Assign selected tracks and buses (prefader)"
msgstr "ÐазнаÑиÑÑ Ð²ÑбÑаннÑм доÑожкам и Ñинам (до ÑейдеÑа)"
-#: route_ui.cc:986
+#: route_ui.cc:1014
msgid "Assign selected tracks (postfader)"
msgstr "ÐазнаÑиÑÑ Ð²ÑбÑаннÑм доÑожкам (поÑле ÑейдеÑа)"
-#: route_ui.cc:990
+#: route_ui.cc:1018
msgid "Assign selected tracks and buses (postfader)"
msgstr "ÐазнаÑиÑÑ Ð²ÑбÑаннÑм доÑожкам и Ñинам (поÑле ÑейдеÑа)"
-#: route_ui.cc:993
+#: route_ui.cc:1021
msgid "Copy track/bus gains to sends"
msgstr "СкопиÑоваÑÑ ÑейдеÑÑ Ð´Ð¾Ñожки/ÑÐ¸Ð½Ñ Ð² поÑÑлÑ"
-#: route_ui.cc:994
+#: route_ui.cc:1022
msgid "Set sends gain to -inf"
msgstr "УÑÑановка поÑÑÐ»Ð°ÐµÑ ÑÑиление на -inf"
-#: route_ui.cc:995
+#: route_ui.cc:1023
msgid "Set sends gain to 0dB"
msgstr "УÑÑановка поÑÑÐ»Ð°ÐµÑ ÑÑиление на 0dB"
-#: route_ui.cc:1314
+#: route_ui.cc:1361
msgid "Solo Isolate"
msgstr "ÐзолиÑоваÑÑ Ñоло"
-#: route_ui.cc:1321
+#: route_ui.cc:1368
msgid "Solo Safe"
msgstr "ÐлокиÑовка ÑолиÑованиÑ"
-#: route_ui.cc:1343
+#: route_ui.cc:1390
msgid "Pre Fader Sends"
msgstr "ÐоÑÑлки пÑеÑейдеÑа"
-#: route_ui.cc:1349
+#: route_ui.cc:1396
msgid "Post Fader Sends"
msgstr "ÐоÑÑлки поÑÑÑейдеÑа"
-#: route_ui.cc:1355
+#: route_ui.cc:1402
msgid "Control Outs"
msgstr "ÐонÑÑолÑнÑе вÑÑ
одÑ"
-#: route_ui.cc:1361
+#: route_ui.cc:1408
msgid "Main Outs"
msgstr "ÐлавнÑе вÑÑ
одÑ"
-#: route_ui.cc:1527
+#: route_ui.cc:1575
msgid "Color Selection"
msgstr "ÐÑÐ±Ð¾Ñ ÑвеÑа"
-#: route_ui.cc:1592
+#: route_ui.cc:1617
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
@@ -11742,23 +12888,23 @@ msgstr ""
"ÐÑполÑзование двоеÑоÑÐ¸Ñ Ð² названиÑÑ
доÑожек и Ñин не пооÑÑÑеÑÑÑ.\n"
"ÐÑ ÑоÑно Ñ
оÑиÑе оÑÑавиÑÑ Ð´Ð²Ð¾ÐµÑоÑие?"
-#: route_ui.cc:1596
+#: route_ui.cc:1621
msgid "Use the new name"
msgstr "ÐÑполÑзоваÑÑ Ð½Ð¾Ð²Ð¾Ðµ имÑ"
-#: route_ui.cc:1597
+#: route_ui.cc:1622
msgid "Re-edit the name"
msgstr "ÐовÑоÑно измениÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ"
-#: route_ui.cc:1610
+#: route_ui.cc:1635
msgid "Rename Track"
msgstr "ÐеÑеименование доÑожки"
-#: route_ui.cc:1612
+#: route_ui.cc:1637
msgid "Rename Bus"
msgstr "ÐеÑеименование ÑинÑ"
-#: route_ui.cc:1680
+#: route_ui.cc:1697
msgid ": comment editor"
msgstr ": РедакÑÐ¾Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑиев"
@@ -11778,63 +12924,18 @@ msgstr "СоÑ
ÑаниÑÑ ÐºÐ°Ðº Ñаблон"
msgid "Template name:"
msgstr "Ðазвание Ñаблона:"
-#: route_ui.cc:1976
-msgid "Remote Control ID"
-msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ"
-
-#: route_ui.cc:1986
-msgid "Remote control ID:"
-msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ:"
-
-#: route_ui.cc:2000
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-"ID Ð´Ð»Ñ ÑдалÑнного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ %1: %2\n"
-"\n"
-"\n"
-"%3 не Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´ÑÑгой ID."
-
-#: route_ui.cc:2004
-msgid "the master bus"
-msgstr "ÐаÑÑеÑ-Ñина"
-
-#: route_ui.cc:2004
-msgid "the monitor bus"
-msgstr "Шина мониÑоÑинга"
-
-#: route_ui.cc:2006
+#: route_ui.cc:2023
+#, fuzzy
msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
-msgstr ""
-"ID диÑÑанÑионного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ %5 ÑÑо: %2\n"
-"\n"
-"\n"
-"ÐденÑиÑикаÑоÑÑ Ð´Ð¸ÑÑанÑионного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ "
-"поÑÑдком доÑожки/ÑÐ¸Ð½Ñ Ð² %6.\n"
-"\n"
-"%3ÐÑполÑзÑйÑе Ð²ÐºÐ»Ð°Ð´ÐºÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкой инÑеÑакÑии окна УÑÑановки, еÑли Ð²Ñ "
-"Ñ
оÑиÑе измениÑÑ ÑÑо %4"
-
-#: route_ui.cc:2063
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
msgstr ""
"ЩелÑком левой клавиÑи мÑÑи инвеÑÑиÑÑеÑÑÑ (инвеÑÑÐ¸Ñ ÑазÑ) \n"
"канал %1 ÑÑой доÑожки. Ðо пÑавой клавиÑе вÑзÑваеÑÑÑ Ð¼ÐµÐ½Ñ."
-#: route_ui.cc:2065
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: route_ui.cc:2025
+#, fuzzy
+msgid "Click to show a menu of channels to invert polarity"
msgstr "ÐликниÑе Ð´Ð»Ñ Ð¿Ñоказа Ð¼ÐµÐ½Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² Ð´Ð»Ñ Ð¸Ð½Ð²ÐµÑÑии (ÑевеÑÑ ÑазÑ)"
#: save_as_dialog.cc:34
@@ -11873,6 +12974,30 @@ msgstr "ЩÑлкниÑе Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑаÑполо
msgid "the session folder"
msgstr "Рпапке ÑеÑÑии"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>Тип:</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>Ðазвание:</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>ÐаÑамеÑÑÑ ÑкземплÑÑа</b>"
+
#: send_ui.cc:134
msgid "Send "
msgstr "ÐоÑÑл"
@@ -11885,7 +13010,7 @@ msgstr "ÐаÑÑÑойка ÑеÑÑии"
msgid "Advanced options ..."
msgstr "ÐополниÑелÑнÑе паÑамеÑÑÑ"
-#: session_dialog.cc:163 session_dialog.cc:394
+#: session_dialog.cc:163 session_dialog.cc:397
msgid "Recent Sessions"
msgstr "Ðедавние ÑеÑÑии"
@@ -11905,99 +13030,99 @@ msgstr "ÐаÑа модиÑикаÑии"
msgid "New Session"
msgstr "СоздаÑÑ ÑеÑÑиÑ"
-#: session_dialog.cc:376
+#: session_dialog.cc:379
msgid "Check the website for more..."
msgstr "ÐÑовеÑÑÑе веб-ÑÐ°Ð¹Ñ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ..."
-#: session_dialog.cc:379
+#: session_dialog.cc:382
msgid "Click to open the program website in your web browser"
msgstr "ÐажмиÑе, ÑÑÐ¾Ð±Ñ Ð¾ÑкÑÑÑÑ Ð²ÐµÐ±-ÑÐ°Ð¹Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð² веб-бÑаÑзеÑе"
-#: session_dialog.cc:401
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "ÐÑбеÑиÑе Ñайл ÑеÑÑии"
-#: session_dialog.cc:414
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr "ÐÑÑгие ÑеÑÑии"
-#: session_dialog.cc:421
+#: session_dialog.cc:424
msgid "Safe Mode: Disable all Plugins"
msgstr "ÐезопаÑнÑй Ñежим: оÑклÑÑиÑÑ Ð²Ñе плагинÑ"
-#: session_dialog.cc:451
+#: session_dialog.cc:454
msgid "Open"
msgstr "ÐÑкÑÑÑÑ"
-#: session_dialog.cc:518
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Ðазвание ÑеÑÑии:"
-#: session_dialog.cc:540
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "СоздаÑÑ Ð¿Ð°Ð¿ÐºÑ ÑеÑÑии в:"
-#: session_dialog.cc:561
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "ÐÑбеÑиÑе Ð¿Ð°Ð¿ÐºÑ Ð´Ð»Ñ ÑеÑÑии"
-#: session_dialog.cc:588
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "ÐÑполÑзоваÑÑ ÑÑÐ¾Ñ Ñаблон"
-#: session_dialog.cc:591
+#: session_dialog.cc:594
msgid "no template"
msgstr "Ðез Ñаблона"
-#: session_dialog.cc:743 session_dialog.cc:790
+#: session_dialog.cc:746 session_dialog.cc:793
msgid "32-bit float"
msgstr "32-bit float"
-#: session_dialog.cc:746 session_dialog.cc:793
+#: session_dialog.cc:749 session_dialog.cc:796
msgid "24-bit"
msgstr "24-bit"
-#: session_dialog.cc:749 session_dialog.cc:796
+#: session_dialog.cc:752 session_dialog.cc:799
msgid "16-bit"
msgstr "16-bit"
-#: session_dialog.cc:874 session_dialog.cc:875 session_dialog.cc:876
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "канал(-ов)"
-#: session_dialog.cc:890
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>ШинÑ</b>"
-#: session_dialog.cc:891
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>ÐÑ
одÑ</b>"
-#: session_dialog.cc:892
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>ÐÑÑ
одÑ</b>"
-#: session_dialog.cc:900
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "СоздаÑÑ Ð¼Ð°ÑÑеÑ-ÑинÑ"
-#: session_dialog.cc:910
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "ÐвÑомаÑиÑеÑки подклÑÑиÑÑ Ðº ÑизиÑеÑким вÑ
одам"
-#: session_dialog.cc:917 session_dialog.cc:976
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "ÐÑполÑзоваÑÑ ÑолÑко"
-#: session_dialog.cc:970
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "ÐвÑомаÑиÑеÑки подклÑÑиÑÑ Ð²ÑÑ
одÑ"
-#: session_dialog.cc:992
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "... к маÑÑеÑ-Ñине"
-#: session_dialog.cc:1002
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "... к ÑизиÑеÑким вÑÑ
одам"
@@ -12021,191 +13146,191 @@ msgstr "ÐмпоÑÑиÑоваÑÑ Ð¸Ð· ÑеÑÑии"
msgid "This will select all elements of this type!"
msgstr "ÐÑдÑÑ Ð²ÑбÑÐ°Ð½Ñ Ð²Ñе ÑлеменÑÑ ÑÑого Ñипа!"
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr "ÐÑовеÑка EAN ÑÑпеÑно пÑойдена"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr "ÐÑибка пÑи пÑовеÑке EAN"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr "ожидалоÑÑ"
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr "ÐÑибка в длине ÑÑÑиÑ
-кода EAN"
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Ðоле"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "ÐнаÑÐµÐ½Ð¸Ñ (ÑекÑÑее Ââ ÑвеÑÑ
Ñ)"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "ÐолÑзоваÑелÑ"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr "Ðл. поÑÑа"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr "Ðеб-ÑайÑ"
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr "ÐÑганизаÑиÑ"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr "СÑÑана"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "Ðазвание"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "ÐÐ¾Ð¼ÐµÑ Ð´Ð¾Ñожки"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "Ðодзаголовок"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr "ÐÑÑппиÑование"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "ÐÑполниÑелÑ"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "ÐанÑ"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "ÐомменÑаÑий"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "ÐвÑоÑÑкие пÑава"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "ÐлÑбом"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Ðод"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "ÐÑполниÑÐµÐ»Ñ Ð°Ð»Ñбома"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "ÐÑего доÑожек"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "Ðодзаголовок диÑка"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "ÐÐ¾Ð¼ÐµÑ Ð´Ð¸Ñка"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "ÐÑего диÑков"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "СбоÑник"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr "ISRC"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr "ШÑÑиÑ
-код EAN"
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "ÐÑди"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "ÐвÑÐ¾Ñ Ñлов"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "ÐомпозиÑоÑ"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "ÐиÑижеÑ"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "ÐвÑÐ¾Ñ ÑемикÑа"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "ÐÑанжиÑовÑик"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "ÐвÑкоинженеÑ"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "ÐÑодÑÑеÑ"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "Ðиджей"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "ÐвÑкоопеÑаÑоÑ"
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr "ÐбÑÑение"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr "ÐнÑÑÑÑкÑоÑ"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr "ÐÑÑÑ"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "ÐеÑаданнÑе ÑеÑÑии"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "ÐмпоÑÑиÑоваÑÑ Ð¼ÐµÑаданнÑе ÑеÑÑии"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr "ÐÑбеÑиÑе ÑеÑÑиÑ, из коÑоÑой бÑдÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¼ÐµÑаданнÑе"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "Ðе ÑдалоÑÑ Ð¿ÑоÑиÑаÑÑ Ñайл ÑеÑÑии!"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -12213,7 +13338,7 @@ msgstr ""
"Ð ÑÑом Ñайле ÑеÑÑии Ð½ÐµÑ Ð¼ÐµÑаданнÑÑ
!\n"
"Ðозможно, ÑÑо Ñайл в ÑÑаÑом ÑоÑмаÑе?"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr "ÐмпоÑÑиÑоваÑÑ Ð²Ñе из:"
@@ -12431,6 +13556,12 @@ msgstr "WAVE-64"
msgid "RF64 (WAV compatible)"
msgstr "RF64 (ÑовмеÑÑим Ñ WAV)"
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+#, fuzzy
+msgid "Files|Locations"
+msgstr "РаÑположение Ñайлов"
+
#: session_option_editor.cc:210
msgid "File locations"
msgstr "РаÑположение Ñайлов"
@@ -12625,26 +13756,14 @@ msgstr "<b>ÐнÑоÑмаÑÐ¸Ñ Ð¾ Ñайле</b>"
msgid "Timestamp:"
msgstr "ÐÑмеÑка вÑемени:"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "ФоÑмаÑ:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:658
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "ÐеÑки:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Ðе ÑдалоÑÑ Ð¿ÑоÑиÑаÑÑ Ñайл: %1 (%2)"
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr "<b>Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ MIDI Ñайле<b>"
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Файл недоÑÑÑпен: "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr "SoundFileBox: Ðе ÑдалоÑÑ ÑазмеÑиÑÑ ÑÑÑокÑ: "
@@ -12665,11 +13784,11 @@ msgstr "ÐвÑковÑе ÑайлÑ"
msgid "MIDI files"
msgstr "Ð¤Ð°Ð¹Ð»Ñ MIDI"
-#: sfdb_ui.cc:590 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
msgid "All files"
msgstr "ÐÑе ÑайлÑ"
-#: sfdb_ui.cc:609 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
msgid "Browse Files"
msgstr "ÐÐ±Ð·Ð¾Ñ Ñайлов"
@@ -12681,150 +13800,150 @@ msgstr "РаÑположениÑ"
msgid "Search Tags"
msgstr "ÐоиÑк по меÑкам"
-#: sfdb_ui.cc:663
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "ÐÑиÑеÑий ÑоÑÑиÑовки:"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "Ðолее длиннÑе"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "Ðолее коÑоÑкие"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "Ðолее новÑе"
-#: sfdb_ui.cc:674
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "Ðолее ÑÑаÑÑе"
-#: sfdb_ui.cc:675
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "ЧаÑе ÑкаÑиваемÑе"
-#: sfdb_ui.cc:676
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "Реже ÑкаÑиваемÑе"
-#: sfdb_ui.cc:677
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr "ÐÑÑе оÑенÑннÑе"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr "Ðиже оÑенÑннÑе"
-#: sfdb_ui.cc:683
+#: sfdb_ui.cc:684
msgid "More"
msgstr "ÐÑÑ"
-#: sfdb_ui.cc:687
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr "ÐÑбликаÑ"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:700
msgid "ID"
msgstr "ID"
-#: sfdb_ui.cc:700 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
msgid "Filename"
msgstr "ÐÐ¼Ñ Ñайла"
-#: sfdb_ui.cc:702
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "ÐлиÑелÑноÑÑÑ"
-#: sfdb_ui.cc:703
+#: sfdb_ui.cc:704
msgid "Size"
msgstr "РазмеÑ"
-#: sfdb_ui.cc:704
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr "ЧаÑÑоÑа ÑÑмплиÑованиÑ"
-#: sfdb_ui.cc:705
+#: sfdb_ui.cc:706
msgid "License"
msgstr "ÐиÑензиÑ"
-#: sfdb_ui.cc:723
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "ÐоиÑк по Freesound"
-#: sfdb_ui.cc:739
+#: sfdb_ui.cc:741
msgid "Press to import selected files"
msgstr "ÐажмиÑе Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾ÑÑа вÑбÑаннÑÑ
Ñайлов"
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr "ÐажмиÑе, ÑÑÐ¾Ð±Ñ Ð·Ð°ÐºÑÑÑÑ ÑÑо окно, ниÑего не импоÑÑиÑÑÑ"
-#: sfdb_ui.cc:935
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr "SoundFileBrowser: Ðе ÑдалоÑÑ ÑазмеÑиÑÑ ÑÑÑокÑ:"
-#: sfdb_ui.cc:1135
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] "ÐÑÑ %1 ÑÑÑаниÑа из 100 доÑÑÑпнÑÑ
"
msgstr[1] "ÐÑÑ %1 ÑÑÑаниÑÑ Ð¸Ð· 100 доÑÑÑпнÑÑ
"
msgstr[2] "ÐÑÑ %1 ÑÑÑÐ°Ð½Ð¸Ñ Ð¸Ð· 100 доÑÑÑпнÑÑ
"
-#: sfdb_ui.cc:1140
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr "ÐолÑÑе ÑезÑлÑÑаÑов неÑ"
-#: sfdb_ui.cc:1204
+#: sfdb_ui.cc:1206
msgid "B"
msgstr "Ð"
-#: sfdb_ui.cc:1206
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr "ÐÐ"
-#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr "ÐÐ"
-#: sfdb_ui.cc:1212
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr "ÐÐ"
-#: sfdb_ui.cc:1429 sfdb_ui.cc:1734 sfdb_ui.cc:1795 sfdb_ui.cc:1813
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "Ðдна доÑожка на Ñайл"
-#: sfdb_ui.cc:1432 sfdb_ui.cc:1796 sfdb_ui.cc:1814
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "Ðдна доÑожка на канал"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1798 sfdb_ui.cc:1815
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr "Ð¤Ð°Ð¹Ð»Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи"
-#: sfdb_ui.cc:1443 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "ÐÑе ÑÐ°Ð¹Ð»Ñ Ð² Ð¾Ð´Ð½Ñ Ð´Ð¾ÑожкÑ"
-#: sfdb_ui.cc:1444 sfdb_ui.cc:1797
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "ÐбÑединиÑÑ ÑайлÑ"
-#: sfdb_ui.cc:1450 sfdb_ui.cc:1800
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "Ðдна облаÑÑÑ Ð½Ð° Ñайл"
-#: sfdb_ui.cc:1453 sfdb_ui.cc:1801
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "Ðдна облаÑÑÑ Ð½Ð° канал"
-#: sfdb_ui.cc:1458 sfdb_ui.cc:1802 sfdb_ui.cc:1816
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "ÐÑе ÑÐ°Ð¹Ð»Ñ Ð² одной облаÑÑи"
-#: sfdb_ui.cc:1525
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -12832,100 +13951,100 @@ msgstr ""
"Ðдин или более вÑбÑаннÑÑ
Ñайлов\n"
"не могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð² %1"
-#: sfdb_ui.cc:1669
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "СкопиÑоваÑÑ ÑÐ°Ð¹Ð»Ñ Ð² ÑеÑÑиÑ"
-#: sfdb_ui.cc:1688 sfdb_ui.cc:1856
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr "Ðо оÑмеÑке вÑемени Ñайла"
-#: sfdb_ui.cc:1689 sfdb_ui.cc:1858
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "Ðо кÑÑÑоÑÑ ÑедакÑоÑа"
-#: sfdb_ui.cc:1690 sfdb_ui.cc:1860
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "Ðо ÑказаÑÐµÐ»Ñ Ð²Ð¾ÑпÑ."
-#: sfdb_ui.cc:1691
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "РнаÑало ÑеÑÑии"
-#: sfdb_ui.cc:1697
+#: sfdb_ui.cc:1695
msgid "<b>Add files ...</b>"
msgstr "<b>ÐобавиÑÑ ÑайлÑ...</b>"
-#: sfdb_ui.cc:1709
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr "<b>ÐÑда вÑÑавиÑÑ</b>"
-#: sfdb_ui.cc:1722
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr "<b>СпоÑоб вÑÑавки</b>"
-#: sfdb_ui.cc:1740
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr "<b>ÐаÑеÑÑво пÑеобÑазованиÑ:</b>"
-#: sfdb_ui.cc:1752
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr "<b>ÐнÑÑÑÑменÑ</b>"
-#: sfdb_ui.cc:1764 sfdb_ui.cc:1872
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "ÐаилÑÑÑее"
-#: sfdb_ui.cc:1765 sfdb_ui.cc:1874
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "ХоÑоÑее"
-#: sfdb_ui.cc:1766 sfdb_ui.cc:1876
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "ÐÑÑÑÑое"
-#: sfdb_ui.cc:1768
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "ÐÑÑÑÑее вÑего"
-#: shuttle_control.cc:57
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr "ÐонÑÑÐ¾Ð»Ñ ÑкоÑоÑÑи воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ (паÑамеÑÑÑ â в конÑекÑÑном менÑ)"
-#: shuttle_control.cc:184
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
msgid "Percent"
msgstr "ÐÑоÑенÑÑ"
-#: shuttle_control.cc:192
+#: shuttle_control.cc:210
msgid "Units"
msgstr "ÐдиниÑа измеÑениÑ"
-#: shuttle_control.cc:198 shuttle_control.cc:633
+#: shuttle_control.cc:216 shuttle_control.cc:679
msgid "Sprung"
msgstr "ÐÑÑжок"
-#: shuttle_control.cc:202 shuttle_control.cc:636
+#: shuttle_control.cc:220 shuttle_control.cc:682
msgid "Wheel"
msgstr "ÐеÑеÑ
од"
-#: shuttle_control.cc:236
+#: shuttle_control.cc:254
msgid "Maximum speed"
msgstr "ÐакÑ. ÑкоÑоÑÑÑ"
-#: shuttle_control.cc:239
+#: shuttle_control.cc:257
msgid "Reset to 100%"
msgstr "ÐеÑнÑÑÑÑÑ Ðº 100%"
-#: shuttle_control.cc:592
+#: shuttle_control.cc:641
msgid "Playing"
msgstr "ÐоÑпÑоизведение"
-#: shuttle_control.cc:607
+#: shuttle_control.cc:656
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d полÑÑон"
-#: shuttle_control.cc:609
+#: shuttle_control.cc:658
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d полÑÑон"
@@ -12954,7 +14073,7 @@ msgstr "СделаÑÑ ÑÐ°Ð¹Ð»Ñ ÑкаÑиваемÑми"
msgid "%1: %2 of %3 bytes uploaded"
msgstr "%1: %2 из %3 Ð±Ð°Ð¹Ñ Ð·Ð°Ð³ÑÑжено"
-#: splash.cc:75
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "ÐагÑÑжаеÑÑÑ %1..."
@@ -12970,7 +14089,7 @@ msgstr "УдалиÑÑ Ð³ÑомкоговоÑиÑелÑ"
msgid "Azimuth:"
msgstr "ÐзимÑÑ:"
-#: startup.cc:70
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
@@ -12978,11 +14097,11 @@ msgstr ""
"ÐÑполÑзоваÑÑ Ð²Ð½ÐµÑний микÑÐµÑ Ð¸Ð»Ð¸ микÑÐµÑ Ð·Ð²Ñкового инÑеÑÑейÑа.\n"
"%1 никак не бÑÐ´ÐµÑ ÑÑаÑÑвоваÑÑ Ð² мониÑоÑинге."
-#: startup.cc:72
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr "ÐаÑÑ %1 воÑпÑоизводиÑÑ Ð¼Ð°ÑеÑиал пÑи его запиÑи"
-#: startup.cc:145
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -12999,15 +14118,15 @@ msgstr ""
"\n"
"ÐеÑед наÑалом ÑабоÑÑ Ñ Ð¿ÑогÑаммой необÑ
одимо кое-ÑÑо наÑÑÑоиÑÑ.</span>"
-#: startup.cc:171
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "ÐÑивеÑÑÑвÑем Ð²Ð°Ñ Ð² %1"
-#: startup.cc:194
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Ðапка Ð´Ð»Ñ ÑеÑÑий %1 по ÑмолÑаниÑ"
-#: startup.cc:200
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -13025,11 +14144,11 @@ msgstr ""
"<i>(СоÑ
ÑанÑÑÑ ÑеÑÑии можно бÑÐ´ÐµÑ Ð³Ð´Ðµ Ñгодно, пÑоÑÑо ÑказаннаÑ\n"
"папка бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ)</i>"
-#: startup.cc:223
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Ðапка Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ
ÑеÑÑий по ÑмолÑаниÑ"
-#: startup.cc:244
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -13054,15 +14173,15 @@ msgstr ""
"<i>ÐÑли Ð²Ñ Ð½Ðµ понимаеÑе ÑмÑÑл ÑÑого паÑамеÑÑа, пÑоÑÑо иÑполÑзÑйÑе \n"
"пÑедлагаемÑй по ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ð°ÑианÑ.</i>"
-#: startup.cc:265
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "СпоÑоб мониÑоÑинга"
-#: startup.cc:288
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "ÐÑполÑзоваÑÑ Ð¼Ð°ÑÑеÑ-ÑÐ¸Ð½Ñ Ð½Ð°Ð¿ÑÑмÑÑ"
-#: startup.cc:290
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -13070,11 +14189,11 @@ msgstr ""
"СоединиÑÑ Ð¼Ð°ÑÑеÑ-ÑÐ¸Ð½Ñ Ð½Ð°Ð¿ÑÑмÑÑ Ñ Ð²ÑÑ
одами звÑкового инÑеÑÑейÑа.\n"
"ÐÑедпоÑÑиÑелÑно Ð´Ð»Ñ Ð¿ÑоÑÑого иÑполÑзованиÑ."
-#: startup.cc:299
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "ÐÑполÑзоваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÐ¸Ð½Ñ Ð¼Ð¾Ð½Ð¸ÑоÑинга"
-#: startup.cc:302
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -13082,7 +14201,7 @@ msgstr ""
"ÐÑполÑзоваÑÑ ÑÐ¸Ð½Ñ Ð¼Ð¾Ð½Ð¸ÑоÑинга Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð°ÑÑеÑ-Ñиной и вÑÑ
одами \n"
"звÑкового инÑеÑÑейÑа Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ конÑÑÐ¾Ð»Ñ Ð±ÐµÐ· вмеÑаÑелÑÑÑва в микÑ."
-#: startup.cc:324
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -13095,45 +14214,41 @@ msgstr ""
"<i>ÐÑли Ð²Ñ Ð½Ðµ понимаеÑе ÑмÑÑл ÑÑого паÑамеÑÑа, пÑоÑÑо иÑполÑзÑйÑе\n"
"пÑедлагаемое по ÑмолÑаниÑ.</i>"
-#: startup.cc:335
+#: startup.cc:336
msgid "Monitor Section"
msgstr "СекÑÐ¸Ñ Ð¼Ð¾Ð½Ð¸ÑоÑа"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr "ÐоÑаговÑй ввод: %1"
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">долÑ"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">ÑакÑ"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ">ТР"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr "ÐодÑвеÑждаÑÑ"
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr "ÐаÑза"
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr "g-паÑза"
-#: step_entry.cc:71
-msgid "back"
-msgstr "Ðазад"
-
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
+#: step_entry.cc:70
+msgid "back"
+msgstr "Ðазад"
#: step_entry.cc:191
msgid "Set note length to a whole note"
@@ -13243,11 +14358,11 @@ msgstr "ÐÑÑавиÑÑ ÑÐ¼ÐµÐ½Ñ Ð±Ð°Ð½ÐºÐ°"
msgid "Insert a program change message"
msgstr "ÐÑÑавиÑÑ ÑÐ¼ÐµÐ½Ñ Ð¿ÑогÑаммÑ"
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr "ÐеÑемеÑÑиÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° назад на длиÑелÑноÑÑÑ Ð½Ð¾ÑÑ"
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr "ÐеÑемеÑÑиÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° к ÑоÑке ÑедакÑиÑованиÑ"
@@ -13259,230 +14374,230 @@ msgstr "1/ÐоÑа"
msgid "Octave"
msgstr "ÐкÑава"
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ð»Ñ"
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ð»Ñ-диез"
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ñи"
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ð´Ð¾"
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ð´Ð¾-диез"
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ñе"
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ñе-диез"
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ð¼Ð¸"
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ñа"
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ Ñа-диез"
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ ÑолÑ"
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr "ÐÑÑавиÑÑ Ð½Ð¾ÑÑ ÑолÑ-диез"
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr "ÐÑÑавиÑÑ Ð¿Ð°ÑÐ·Ñ Ð´Ð»Ð¸Ð½Ð¾Ð¹ в ноÑÑ"
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr "ÐÑÑавиÑÑ Ð¿Ð°ÑÐ·Ñ Ð´Ð»Ð¸Ð½Ð¾Ð¹ в заÑ
ваÑенное"
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr "ÐеÑейÑи к ÑледÑÑÑей окÑаве"
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr "ÐеÑейÑи к ÑледÑÑÑей длиÑелÑноÑÑи ноÑ"
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr "ÐеÑейÑи к пÑедÑдÑÑей длиÑелÑноÑÑи ноÑ"
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "УвелиÑиÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð½Ð¾ÑÑ"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "УменÑÑиÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð½Ð¾ÑÑ"
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr "ÐеÑейÑи к ÑледÑÑÑей Ñиле нажаÑиÑ"
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr "ÐеÑейÑи к пÑедÑдÑÑей Ñиле нажаÑиÑ"
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr "УвелиÑиÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð´Ð»Ñ Ð½Ð¾ÑÑ"
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr "УменÑÑиÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð´Ð»Ñ Ð½Ð¾ÑÑ"
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 1-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 2-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 3-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 4-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 5-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 6-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 7-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 8-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 9-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 10-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "ÐеÑеклÑÑиÑÑÑÑ Ð½Ð° 11-Ñ Ð¾ÐºÑавÑ"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "ÐеÑекл. ÑÑойнÑÑ
ноÑ"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "ÐеÑеклÑÑиÑÑ Ð²Ð²Ð¾Ð´ аккоÑдов"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "ÐÑдеÑживаÑÑ Ð²ÑбÑаннÑе ноÑÑ Ð¿Ð¾ длине"
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной Ñелой ноÑе"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной 1/2"
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной 1/3"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной 1/4"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной 1/8"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной 1/16"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной 1/32"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr "УÑÑановиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð½Ð¾ÑÑ Ñавной 1/64"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr "ÐоменÑÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð½Ð¾ÑÑ Ð½Ð° пиано-пианиÑÑимо"
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr "ÐоменÑÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð½Ð¾ÑÑ Ð½Ð° пианиÑÑимо"
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr "ÐоменÑÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð½Ð¾ÑÑ Ð½Ð° пиано"
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr "ÐоменÑÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð½Ð¾ÑÑ Ð½Ð° меÑÑо-пиано"
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr "ÐоменÑÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð½Ð¾ÑÑ Ð½Ð° меÑÑо-ÑоÑÑе"
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr "ÐоменÑÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð½Ð¾ÑÑ Ð½Ð° ÑоÑÑе"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr "ÐоменÑÑÑ ÑÐ¸Ð»Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ Ð½Ð¾ÑÑ Ð½Ð° ÑоÑÑе-ÑоÑÑиÑÑимо"
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "ÐеÑекл. ÑÑойнÑÑ
ноÑ"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr "ÐÐµÑ Ð¿ÑнкÑиÑнÑÑ
ноÑ"
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr "ÐодклÑÑеннÑе пÑнкÑиÑнÑе ноÑÑ"
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr "ÐодклÑÑеннÑе двойнÑе пÑнкÑиÑнÑе ноÑÑ"
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr "ÐодклÑÑеннÑе ÑÑойнÑе пÑнкÑиÑнÑе ноÑÑ"
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "ÐеÑеклÑÑиÑÑ Ð²Ð²Ð¾Ð´ аккоÑдов"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "ÐÑдеÑживаÑÑ Ð²ÑбÑаннÑе ноÑÑ Ð¿Ð¾ длине"
-
#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
@@ -13504,6 +14619,10 @@ msgstr "ШиÑина"
msgid "Strip Silence"
msgstr "ÐÑÑезаÑÑ ÑиÑинÑ"
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "ÐоÑог"
+
#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr "ÐинималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°"
@@ -13516,164 +14635,173 @@ msgstr "Ðлина Ñейда"
msgid "Analyzing"
msgstr "ÐÑполнÑеÑÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "в ÑакÑе:"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "в доле:"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr "ÐÑлÑÑиÑÑÑÑÐ°Ñ Ð½Ð¾Ñа"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr "TAP вÑемÑ"
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
-#: tempo_dialog.cc:344
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "ÑелаÑ"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
-#: tempo_dialog.cc:346
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "1/2"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
-#: tempo_dialog.cc:348
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "1/3"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
-#: tempo_dialog.cc:350
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "1/4"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
-#: tempo_dialog.cc:352
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "1/8"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
-#: tempo_dialog.cc:354
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "1/16"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "1/32"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
-#: tempo_dialog.cc:358
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "1/64"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
-#: tempo_dialog.cc:360
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "1/128"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "Ðлавно менÑÑÑийÑÑ"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "ÐоÑÑоÑннÑй"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "ÐÑзÑкалÑнÑй"
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Ðолей в минÑÑÑ:"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr "Темп наÑинаеÑÑÑ"
-#: tempo_dialog.cc:254
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "СÑÐ¸Ð»Ñ Ð¿ÑивÑзки:"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "Тип Ñемпа:"
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr "непонÑÑнÑй Ñип пÑлÑÑиÑÑÑÑей ноÑÑ (%1)"
-#: tempo_dialog.cc:375
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "ÐнаÑение ноÑÑ: "
-#: tempo_dialog.cc:376
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "СÑÐ¸Ð»Ñ Ð¿ÑивÑзки:"
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Ðолей на ÑакÑ:"
-#: tempo_dialog.cc:390
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr "Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð°ÑинаеÑÑÑ Ð² ÑакÑе:"
-#: tempo_dialog.cc:503
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
msgstr "непонÑÑнÑй Ñип ноÑного ÑиÑма (%1)"
-#: theme_manager.cc:61
-msgid "Dark Theme"
-msgstr "ТÑÐ¼Ð½Ð°Ñ Ñема"
-
-#: theme_manager.cc:62
-msgid "Light Theme"
-msgstr "СвеÑÐ»Ð°Ñ Ñема"
-
-#: theme_manager.cc:63
-msgid "Restore Defaults"
-msgstr "ÐоÑÑÑановиÑÑ Ð¸ÑÑ
однÑе знаÑениÑ"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
-#: theme_manager.cc:64
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr "РиÑоваÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ плоÑкими"
-#: theme_manager.cc:65
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr "ÐигаÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ°Ð¼Ð¸ гоÑовноÑÑи к запиÑи"
-#: theme_manager.cc:66
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "РаÑкÑаÑиваÑÑ Ð¾Ð±Ð»Ð°ÑÑи ÑвеÑом доÑожки"
-#: theme_manager.cc:67
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr "ÐоказÑваÑÑ ÐºÐ»Ð¸Ð¿Ð¿Ð¸Ð½Ð³ волновой ÑоÑмÑ"
-#: theme_manager.cc:69
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr "ÐлÑбина гÑадиенÑа волновой ÑоÑÐ¼Ñ Ñигнала"
-#: theme_manager.cc:71
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr "ÐлÑбина гÑадиенÑа обÑекÑов на Ñаймлайне"
-#: theme_manager.cc:72
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr "ÐÑе плаваÑÑие окна ÑвлÑÑÑÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð°Ð¼Ð¸"
-#: theme_manager.cc:73
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr "ÐÑеменнÑе окна ÑледÑÑÑ Ð·Ð° полÑÑаÑÑим ÑокÑÑ Ð¾ÑновнÑм окном"
-#: theme_manager.cc:74
+#: theme_manager.cc:63
msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:64
msgid "Icon Set"
msgstr "ÐÐ°Ð±Ð¾Ñ Ð·Ð½Ð°Ñков:"
-#: theme_manager.cc:84
-msgid "Object"
-msgstr "ÐбÑекÑ"
-
-#: theme_manager.cc:162
-msgid "Items"
-msgstr "ÐлеменÑÑ"
-
-#: theme_manager.cc:163
-msgid "Palette"
-msgstr "ÐалиÑÑа"
-
-#: theme_manager.cc:164
-msgid "Transparency"
-msgstr "ÐÑозÑаÑноÑÑÑ"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -13684,7 +14812,7 @@ msgstr ""
"ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ñ Ð½ÐµÐºÐ¾ÑоÑÑми оконнÑми менеджеÑами.\n"
"ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑÑÑпÑÑ Ð² ÑÐ¸Ð»Ñ Ð¿Ð¾Ñле пеÑезапÑÑка %1."
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
@@ -13694,18 +14822,14 @@ msgstr ""
"пÑи пеÑеклÑÑении Ð¼ÐµÐ¶Ð´Ñ ÑедакÑоÑом и микÑеÑом.\n"
"ÐÑо изменение вÑÑÑÐ¿Ð¸Ñ Ð² ÑÐ¸Ð»Ñ Ð¿Ð¾Ñле пеÑезапÑÑка %1."
-#: theme_manager.cc:202
+#: theme_manager.cc:139
msgid ""
"When detaching the monitoring section, mark it as \"Utility\" window to stay "
"in front.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:643
-msgid "Color Palette"
-msgstr "ЦвеÑÐ¾Ð²Ð°Ñ Ð¿Ð°Ð»Ð¸ÑÑа"
-
-#: time_axis_view.cc:150
+#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr "ÐÐ¼Ñ Ð´Ð¾Ñожки/ÑÐ¸Ð½Ñ (двойной клик Ð´Ð»Ñ ÑедакÑиÑованиÑ)"
@@ -13716,71 +14840,71 @@ msgstr[0] "ÐÐ¾Ð²Ð°Ñ Ð´Ð»Ð¸ÑелÑноÑÑÑ ÑазмеÑом %1 ÐºÐ°Ð´Ñ Ð½Ð°
msgstr[1] "ÐÐ¾Ð²Ð°Ñ Ð´Ð»Ð¸ÑелÑноÑÑÑ ÑазмеÑом %1 кадÑа наÑ
одиÑÑÑ Ð·Ð° пÑеделами %2"
msgstr[2] "ÐÐ¾Ð²Ð°Ñ Ð´Ð»Ð¸ÑелÑноÑÑÑ ÑазмеÑом %1 кадÑов наÑ
одиÑÑÑ Ð·Ð° пÑеделами %2"
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "ÐÑÑÑÑо и гÑÑбо"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Ðез ÑилÑÑÑаÑии"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "СодеÑжиÑ:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr "ÐинимизиÑоваÑÑ Ð¸ÑкажениÑ"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr "СоÑ
ÑаниÑÑ ÑоÑманÑÑ"
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr "TimeFXDialog"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr "Смена вÑÑоÑÑ Ñона"
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr "РаÑÑÑгивание во вÑемени"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "ÐкÑавÑ:"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "ÐолÑÑона:"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr "СоÑÑе:"
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr "Сдвиг"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr "TimeFXButton"
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "ÐзмениÑÑ"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr "<b>ÐÑогÑеÑÑ</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "ÐаÑаÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ñ Ð½Ð°Ñала авÑовÑезки"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "ÐÑÑановиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² конÑе авÑовÑезки"
@@ -13848,146 +14972,195 @@ msgstr "ТÑанÑпониÑоваÑÑ MIDI"
msgid "Transpose"
msgstr "ТÑанÑпониÑоваÑÑ"
-#: ui_config.cc:230 ui_config.cc:368
+#: ui_config.cc:234 ui_config.cc:422
msgid "Loading default ui configuration file %1"
msgstr "ÐагÑÑзка Ñайла конÑигÑÑаÑии UI по ÑмолÑÐ°Ð½Ð¸Ñ %1"
-#: ui_config.cc:233 ui_config.cc:371
+#: ui_config.cc:237 ui_config.cc:425
msgid "cannot read default ui configuration file \"%1\""
msgstr "Ðевозможно пÑоÑиÑаÑÑ Ð¾Ñновной Ñайл конÑигÑÑаÑии инÑеÑÑейÑа \"%1\""
-#: ui_config.cc:236 ui_config.cc:376
+#: ui_config.cc:240 ui_config.cc:430
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr "ÐÑновной Ñайл конÑигÑÑаÑии инÑеÑÑейÑа \"%1\" не бÑл ÑÑпеÑно загÑÑжен"
-#: ui_config.cc:244
+#: ui_config.cc:248
msgid "Could not find default UI configuration file %1"
msgstr "Ðе ÑдалоÑÑ Ð½Ð°Ð¹Ñи конÑигÑÑаÑионнÑй Ñайл %1 Ð´Ð»Ñ Ð¸Ð½ÑеÑÑейÑа"
-#: ui_config.cc:287
+#: ui_config.cc:289
msgid "Loading color file %1"
msgstr "ÐагÑÑжаеÑÑÑ Ñайл %1 Ñ Ð¾Ð¿Ð¸Ñанием ÑвеÑовой ÑÑ
емÑ"
-#: ui_config.cc:290
+#: ui_config.cc:292
msgid "cannot read color file \"%1\""
msgstr "Ðевозможно пÑоÑиÑаÑÑ Ñайл %1 Ñ Ð¾Ð¿Ð¸Ñанием ÑвеÑовой ÑÑ
емÑ"
-#: ui_config.cc:295
+#: ui_config.cc:297
msgid "color file \"%1\" not loaded successfully."
msgstr "Файл %1 Ñ Ð¾Ð¿Ð¸Ñанием ÑвеÑовой ÑÑ
ÐµÐ¼Ñ Ð½Ðµ бÑл ÑÑпеÑно загÑÑжен."
-#: ui_config.cc:301
-msgid "Color file %1 not found"
+#: ui_config.cc:325
+#, fuzzy
+msgid "Color file for %1 not found along %2"
msgstr "Файл %1 Ñ Ð¾Ð¿Ð¸Ñанием ÑвеÑовой ÑÑ
ÐµÐ¼Ñ Ð½Ðµ найден"
-#: ui_config.cc:350 ui_config.cc:429
+#: ui_config.cc:403 ui_config.cc:486
msgid "Color file %1 not saved"
msgstr "Файл %1 Ñ Ð¾Ð¿Ð¸Ñанием ÑвеÑовой ÑÑ
ÐµÐ¼Ñ Ð½Ðµ ÑоÑ
ÑанÑн"
-#: ui_config.cc:385
+#: ui_config.cc:439
msgid "Loading user ui configuration file %1"
msgstr "ÐагÑÑзка Ñайла полÑзоваÑелÑÑкой конÑигÑÑаÑии UI %1"
-#: ui_config.cc:388
+#: ui_config.cc:442
msgid "cannot read ui configuration file \"%1\""
msgstr "Ðевозможно пÑоÑиÑаÑÑ Ñайл конÑигÑÑаÑии UI \"%1\""
-#: ui_config.cc:393
+#: ui_config.cc:447
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr "ÐонÑигÑÑаÑÐ¸Ñ UI инÑеÑÑейÑа Ñайлa \"%1\" не загÑÑжена ÑÑпеÑно."
-#: ui_config.cc:401
+#: ui_config.cc:455
msgid "could not find any ui configuration file, canvas will look broken."
msgstr "Ðевозможно найÑи Ñайл конÑигÑÑаÑии UI, ÑÑо бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÑломанÑм."
-#: ui_config.cc:419
+#: ui_config.cc:476
msgid "Config file %1 not saved"
msgstr "ÐонÑигÑÑаÑионнÑй Ñайл %1 не ÑоÑ
ÑанÑн"
-#: ui_config.cc:660
+#: ui_config.cc:720
msgid "Color %1 not found"
msgstr "Ð¦Ð²ÐµÑ %1 не обнаÑÑжен"
-#: ui_config.cc:730
+#: ui_config.cc:790
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
"Ðе ÑдаеÑÑÑ Ð½Ð°Ð¹Ñи Ñайл ÑÑилей полÑзоваÑелÑÑкого инÑеÑÑейÑа %1 в пÑÑи поиÑка "
"%2. % 3 бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÑÑÑанно"
-#: utils.cc:114 utils.cc:157
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "ÐлоÑ
ой заголовок XPM %1"
-#: utils.cc:574
+#: utils.cc:365
msgid "cannot find XPM file for %1"
msgstr "Ðевозможно найÑи Ñайл XPM Ð´Ð»Ñ %1"
-#: utils.cc:594 utils.cc:624 utils.cc:638
+#: utils.cc:418 utils.cc:448 utils.cc:468
msgid "default"
msgstr "по ÑмолÑаниÑ"
-#: utils.cc:639
+#: utils.cc:469
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
"знаÑок \"%1\" не найден Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñа \"%2\", возвÑÐ°Ñ Ðº ÑÑÑановкам по ÑмолÑаниÑ"
-#: utils.cc:646
+#: utils.cc:476
msgid "cannot find icon image for %1 using %2"
msgstr "Ðевозможно найÑи Ñайл знаÑка Ð´Ð»Ñ %1 Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ %2"
-#: utils.cc:663 utils.cc:679
+#: utils.cc:493 utils.cc:509
msgid "Caught exception while loading icon named %1"
msgstr "ÐолÑÑено иÑклÑÑение пÑи загÑÑзке знаÑка Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ %1"
-#: utils.cc:939
+#: utils.cc:759
msgid "Overwrite"
msgstr "ÐеÑезапиÑаÑÑ"
-#: add_video_dialog.cc:54
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "СделаÑÑ Ð²ÐµÐ´Ð¾Ð¼Ñе ÑолиÑÑÑÑими"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr "ÐÑиглÑÑиÑÑ Ð²ÐµÐ´Ð¾Ð¼Ñе"
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "СкÑÑÑÑ ÑÑÐ¾Ñ ÐºÐ°Ð½Ð°Ð» VCA"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ ÑолÑко ведомÑе каналÑ"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "C"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr "ÐÑÑоединиÑÑ Ð²Ñе ведомÑе"
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð¾Ð±ÑÑнÑй микÑеÑ"
+
+#: add_video_dialog.cc:55
msgid "Set Video Track"
msgstr "УÑÑановка видеодоÑожки"
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
msgid "Open Video Monitor Window"
msgstr "ÐÑкÑÑÑÑ Ð¾ÐºÐ½Ð¾ видеомониÑоÑа"
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
msgid "Adjust Session Framerate to Match Video Framerate"
msgstr "ÐодогнаÑÑ ÑаÑÑоÑÑ ÐºÐ°Ð´Ñов ÑеÑÑии к ÑаÑÑоÑе кадÑов видео"
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
msgid "Reload docroot"
msgstr "ÐеÑезагÑÑзка коÑÐ½Ñ ÐºÐ°Ñалога Ñ Ð´Ð°Ð½Ð½Ñми"
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
msgid "Video files"
msgstr "ÐидеоÑайлÑ"
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
msgid "<b>Video Information</b>"
msgstr "<b>ÐнÑоÑмаÑÐ¸Ñ Ð¾ видеоÑайле</b>"
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
msgid "Start:"
msgstr "ÐаÑало:"
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
msgid "Frame rate:"
msgstr "ЧаÑÑоÑа кадÑов::"
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
msgid "Aspect Ratio:"
msgstr "СооÑноÑение ÑÑоÑон:"
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
msgid "VideoServerIndex"
msgstr "ÐÐ½Ð´ÐµÐºÑ Ð²Ð¸Ð´ÐµÐ¾ÑеÑвеÑа"
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
msgid " %1 fps"
msgstr " %1 к/Ñ"
-#: video_timeline.cc:472
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "ÐиÑк"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr "ÐÑÑоединиÑÑ Ð²Ñе ведомÑе"
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "ÐоказÑваÑÑ ÑолÑко ведомÑе"
+
+#: video_timeline.cc:473
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
@@ -13995,7 +15168,7 @@ msgstr ""
"Ð Ð°Ð·Ð±Ð¾Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð²Ð¸Ð´ÐµÐ¾Ñайл не ÑдалÑÑ. РабоÑÐ°ÐµÑ Ð»Ð¸ видеоÑеÑвеÑ? ÐоÑÑÑпен ли "
"Ñайл Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ñ Ð²Ð¸Ð´ÐµÐ¾ÑеÑвеÑа? Ð¡Ð¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð»Ð¸ docroot? ÐÑо видеоÑайл?"
-#: video_timeline.cc:510
+#: video_timeline.cc:511
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
@@ -14003,7 +15176,7 @@ msgstr ""
"Ðе ÑдалоÑÑ ÑÑÑановиÑÑ ÑаÑоÑÑ ÐºÐ°Ð´Ñов ÑеÑÑии: '%1' не Ð¸Ð¼ÐµÐµÑ ÑооÑвеÑÑÑвÑÑÑей "
"опÑии наÑÑÑойки в %2."
-#: video_timeline.cc:518
+#: video_timeline.cc:519
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
@@ -14011,7 +15184,7 @@ msgstr ""
"ЧаÑÑоÑа кадÑов видеоÑайла не Ñавна ÑаÑÑоÑе кадÑов Ñаймкода ÑеÑÑии %1: '%2' "
"пÑоÑив '%3'"
-#: video_timeline.cc:591
+#: video_timeline.cc:592
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
@@ -14021,7 +15194,7 @@ msgstr ""
"видеоÑеÑвеÑ: '%3'. Ðак пÑавило, ÑÑо ознаÑаеÑ, ÑÑо видеоÑеÑÐ²ÐµÑ Ð½Ðµ бÑл запÑÑен "
"Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ardour и иÑполÑзÑеÑÑÑ Ð´ÑÑгие ÑазлиÑнÑе коÑневÑе докÑменÑÑ."
-#: video_timeline.cc:728
+#: video_timeline.cc:729
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -14037,11 +15210,11 @@ msgstr ""
"\n"
"См. Ñак же: http://manual.ardour.org/video-timeline/setup/"
-#: video_timeline.cc:743
+#: video_timeline.cc:744
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr "ÐидеомониÑÐ¾Ñ 'xjadeo' не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑÑен."
-#: video_timeline.cc:770
+#: video_timeline.cc:776
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
@@ -14049,7 +15222,7 @@ msgstr ""
"ÐидеомониÑÐ¾Ñ 'xjadeo' ÑлиÑком ÑÑаÑ. ÐожалÑйÑÑа, ÑÑÑановиÑе xjadeo веÑÑÐ¸Ñ "
"0.7.7 или более позднÑÑ. http://xjadeo.sf.net/"
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr "ÐидеомониÑоÑ: Ñайл не найден"
@@ -14121,10 +15294,6 @@ msgstr ""
msgid "FPS:"
msgstr "Ñ/Ñ:"
-#: transcode_video_dialog.cc:139
-msgid "Duration:"
-msgstr "ÐлиÑелÑноÑÑÑ:"
-
#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr "Ðодек:"
@@ -14264,12 +15433,12 @@ msgstr "УÑÑановиÑÑ Ð²Ð¸Ð´ÐµÐ¾ÑеÑÐ²ÐµÑ Ð¸ÑполнÑемÑм"
msgid "Server docroot"
msgstr "ÐоÑÐ½ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° докÑменÑов видеоÑеÑвеÑа"
-#: utils_videotl.cc:61
+#: utils_videotl.cc:63
msgid "Destination is outside Video Server's docroot. "
msgstr ""
"ÐапÑавление наÑ
одиÑÑÑ Ð·Ð° пÑеделами коÑневой папки докÑменÑов видеоÑеÑвеÑа."
-#: utils_videotl.cc:62
+#: utils_videotl.cc:64
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
@@ -14278,15 +15447,15 @@ msgstr ""
"видеоÑеÑвеÑа. Файл бÑÐ´ÐµÑ Ð½ÐµÐ´Ð¾ÑÑÑпен на видеоÑеÑвеÑе. ÐÑ Ð²Ñе еÑе Ñ
оÑиÑе "
"пÑодолжиÑÑ?"
-#: utils_videotl.cc:65
+#: utils_videotl.cc:67
msgid "Continue"
msgstr "ÐалÑÑе"
-#: utils_videotl.cc:72
+#: utils_videotl.cc:74
msgid "Confirm Overwrite"
msgstr "ÐодÑвеÑдиÑе пеÑезапиÑÑ"
-#: utils_videotl.cc:82 utils_videotl.cc:98
+#: utils_videotl.cc:84 utils_videotl.cc:100
msgid "Cannot create video folder \"%1\" (%2)"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ Ð¿Ð°Ð¿ÐºÑ Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾: \"%1\" (%2)"
@@ -14393,16 +15562,16 @@ msgid "Audio Samplerate:"
msgstr "ЧаÑÑоÑа ÑÑмплиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð²Ñка:"
#: export_video_dialog.cc:215 export_video_dialog.cc:223
-#: export_video_dialog.cc:801 export_video_dialog.cc:804
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr "(по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð½ÑейнеÑа)"
#: export_video_dialog.cc:233 export_video_dialog.cc:244
-#: export_video_dialog.cc:808 export_video_dialog.cc:817
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr "(по ÑмолÑаниÑ)"
-#: export_video_dialog.cc:245 export_video_dialog.cc:811
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr "(иÑÑ
однаÑ)"
@@ -14418,19 +15587,19 @@ msgstr "Ð¾Ñ Ð½Ð°Ñала до конÑа видео"
msgid "Selected range"
msgstr "ÐÑбÑаннÑй диапазон"
-#: export_video_dialog.cc:560
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr "ÐÑполнÑеÑÑÑ Ð½Ð¾ÑмиÑовка звÑка"
-#: export_video_dialog.cc:564
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr "ÐкÑпоÑÑ Ð·Ð²Ñка"
-#: export_video_dialog.cc:619
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr "ÐкÑпоÑÑиÑÑеÑÑÑ Ð·Ð²Ñк..."
-#: export_video_dialog.cc:676
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
@@ -14438,36 +15607,36 @@ msgstr ""
"ÐкÑпоÑÑ Ð²Ð¸Ð´ÐµÐ¾: невозможно запÑоÑиÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð²Ð¸Ð´ÐµÐ¾Ñайла, вмеÑÑо Ð½ÐµÑ "
"иÑполÑзÑеÑÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð¿ÑоекÑа."
-#: export_video_dialog.cc:706
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr "ÐкÑпоÑÑ Ð²Ð¸Ð´ÐµÐ¾: ÑкÑпоÑÑнÑй диапазон не ÑодеÑÐ¶Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾."
-#: export_video_dialog.cc:719
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
"ÐкÑпоÑÑ Ð²Ð¸Ð´ÐµÐ¾: Ð½ÐµÑ ÑоединÑемÑÑ
поÑÑов вÑÑ
ода маÑÑеÑ-ÑÐ¸Ð½Ñ Ð´Ð»Ñ ÑкÑпоÑÑа звÑка"
-#: export_video_dialog.cc:761
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr "ÐодиÑÑеÑÑÑ Ð²Ð¸Ð´ÐµÐ¾..."
-#: export_video_dialog.cc:781
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr "ÐкÑпоÑÑ Ð²Ð¸Ð´ÐµÐ¾: не ÑдалоÑÑ Ð¿ÑоÑиÑаÑÑ Ð¸ÑполÑзÑемÑй видеоÑайл"
-#: export_video_dialog.cc:887
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr "ÐÑполнÑеÑÑÑ ÐºÐ¾Ð´Ð¸Ñование видео. ÐÑоÑ
од 1/2."
-#: export_video_dialog.cc:899
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr "ÐÑполнÑеÑÑÑ ÐºÐ¾Ð´Ð¸Ñование видео. ÐÑоÑ
од 2/2."
-#: export_video_dialog.cc:1002
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr "Ðе ÑдалоÑÑ Ð²ÑполниÑÑ Ð¿ÐµÑекодиÑовкÑ."
-#: export_video_dialog.cc:1238 export_video_dialog.cc:1258
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr "СоÑ
ÑаниÑÑ ÑкÑпоÑÑиÑованнÑй видеоÑайл"
@@ -14495,6 +15664,208 @@ msgid ""
"Open Manual in Browser? "
msgstr ""
+#~ msgid "Break drag or deselect all"
+#~ msgstr "ÐÑеÑваÑÑ Ð¿ÐµÑеÑаÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ оÑмениÑÑ Ð²Ñе"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr "ÐÑбеÑиÑе дейÑÑвие и нажмиÑе комбинаÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾"
+
+#~ msgid "Program "
+#~ msgstr "ÐÑогÑамма"
+
+#~ msgid "*Comments*"
+#~ msgstr "*ÐмÑ*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*ÐмÑ*"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ..."
+
+#~ msgid "dbFS"
+#~ msgstr "dbFS"
+
+#~ msgid ":monitor"
+#~ msgstr ": мониÑоÑ"
+
+#~ msgid "system:"
+#~ msgstr "СиÑÑема:"
+
+#~ msgid "alsa_pcm:"
+#~ msgstr "alsa_pcm:"
+
+#~ msgid "alsa_midi:"
+#~ msgstr "alsa_midi:"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ"
+
+#~ msgid "assigned by user"
+#~ msgstr "ÐазнаÑеннÑе полÑзоваÑелем"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "СледÑÑÑ Ð¿Ð¾ÑÑÐ´ÐºÑ Ð¼Ð¸ÐºÑеÑа"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "ÐÑ Ð½Ðµ можеÑе добавиÑÑ Ð´Ð¾ÑÐ¾Ð¶ÐºÑ Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼, коÑоÑое заÑезеÑвиÑовано Ð´Ð»Ñ %1"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑавлениÑ:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "ID Ð´Ð»Ñ ÑдалÑнного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ %1: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "%3 не Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´ÑÑгой ID."
+
+#~ msgid "the master bus"
+#~ msgstr "ÐаÑÑеÑ-Ñина"
+
+#~ msgid "the monitor bus"
+#~ msgstr "Шина мониÑоÑинга"
+
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "ID диÑÑанÑионного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ %5 ÑÑо: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "ÐденÑиÑикаÑоÑÑ Ð´Ð¸ÑÑанÑионного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ "
+#~ "поÑÑдком доÑожки/ÑÐ¸Ð½Ñ Ð² %6.\n"
+#~ "\n"
+#~ "%3ÐÑполÑзÑйÑе Ð²ÐºÐ»Ð°Ð´ÐºÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкой инÑеÑакÑии окна УÑÑановки, еÑли "
+#~ "Ð²Ñ Ñ
оÑиÑе измениÑÑ ÑÑо %4"
+
+#~ msgid "Dark Theme"
+#~ msgstr "ТÑÐ¼Ð½Ð°Ñ Ñема"
+
+#~ msgid "Light Theme"
+#~ msgstr "СвеÑÐ»Ð°Ñ Ñема"
+
+#~ msgid "Display model"
+#~ msgstr "ÐÐ¾Ð´ÐµÐ»Ñ Ð¾ÑобÑажениÑ"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "СоÑÑавной гÑаÑик Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ доÑожки"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "СоÑÑавной гÑаÑик Ð´Ð»Ñ Ð²ÑеÑ
доÑожек"
+
+#~ msgid "Normalize values"
+#~ msgstr "ÐоÑмиÑоваÑÑ Ð·Ð½Ð°ÑениÑ"
+
+#~ msgid "Open Video"
+#~ msgstr "ÐобавиÑÑ Ð²Ð¸Ð´ÐµÐ¾"
+
+#~ msgid "Export to Video File"
+#~ msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð² видеоÑайл"
+
+#~ msgid "Add Lua Script"
+#~ msgstr "ÐобавиÑÑ ÑкÑÐ¸Ð¿Ñ Lua"
+
+#~ msgid "Save as..."
+#~ msgstr "СоÑ
ÑаниÑÑ ÐºÐ°Ðº..."
+
+#~ msgid "Trigger gap"
+#~ msgstr "ÐнÑеÑвал ÑÑиггеÑа"
+
+#~ msgid ""
+#~ "%1%2\n"
+#~ "(built from revision %3)\n"
+#~ "%4"
+#~ msgstr ""
+#~ "%1%2\n"
+#~ "(ÑобÑано из ÑедакÑии %3)\n"
+#~ "%4"
+
+#~ msgid "Busses"
+#~ msgstr "ШинÑ"
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr "ÐкÑан недоÑÑаÑоÑно вÑÑок, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð¾ÐºÐ½Ð¾ микÑеÑа"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "РедакÑÐ¾Ñ Ð¸Ð»Ð¸ микÑÐµÑ Ð½Ð° пеÑеднем плане"
+
+#~ msgid "Reattach All Tearoffs"
+#~ msgstr "Ðаново пÑикÑепиÑÑ ÑазÑÑвÑ"
+
+#~ msgid "Show Logo"
+#~ msgstr "ÐоказаÑÑ Ð»Ð¾Ð³Ð¾Ñип"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "ÐагÑÑженнÑй ÑедакÑÐ¾Ñ Ð¿ÑивÑзки Ð¾Ñ %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr "Ðе ÑдалоÑÑ Ð½Ð°Ð¹Ñи ÑедакÑÐ¾Ñ Ð¿ÑивÑзок в пÑÑи поиÑка %1"
+
+#~ msgid "duplicate selection"
+#~ msgstr "ÐÑблиÑование вÑделениÑ"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>СÑоÑмиÑоваÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñайлов из ÑледÑÑÑиÑ
компоненÑов:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>ТекÑÑее пÑедполагаемое Ð¸Ð¼Ñ Ñайла: \"%1\"</i></small>"
+
+#~ msgid "Main_menu"
+#~ msgstr "Ðлавное менÑ"
+
+#~ msgid "redirectmenu"
+#~ msgstr "ÐÐµÐ½Ñ Ð¿ÐµÑенапÑавлениÑ"
+
+#~ msgid "Editor_menus"
+#~ msgstr "РедакÑÐ¾Ñ Ð¼ÐµÐ½Ñ"
+
+#~ msgid "ProcessorMenu"
+#~ msgstr "ÐÐµÐ½Ñ Ð¾Ð±ÑабоÑÑика"
+
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "ÐагÑÑженнÑе пÑивÑзки микÑеÑа Ð¾Ñ %1"
+
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "Ðе ÑдалоÑÑ Ð½Ð°Ð¹Ñи пÑивÑзки микÑеÑа в пÑÑи поиÑка %1"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Ðевозможно добавиÑÑ ÑÑда поÑÑ, поÑколÑÐºÑ Ð¿ÐµÑвÑй обÑабоÑÑик доÑожки или "
+#~ "ÑÐ¸Ð½Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð½Ð¾Ð²ÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ."
+
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "ÐÑÐ¾Ñ Ð¿Ð¾ÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдален.\n"
+#~ "Ðибо пеÑвÑй плагин в доÑожке или Ñине не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑÑÑ Ð½Ð¾Ð²Ð¾Ðµ\n"
+#~ "колиÑеÑÑво вÑ
одов, либо Ñ Ð¿Ð¾Ñледнего плагина болÑÑе вÑÑ
одов."
+
+#~ msgid "Sync/Slave"
+#~ msgstr "СинÑ
ÑонизаÑÐ¸Ñ Ð¸ ведомÑй Ñежим"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Соло/ÐÑиглÑÑение"
+
+#~ msgid "Contents:"
+#~ msgstr "СодеÑжиÑ:"
+
#~ msgid "Adjusting the scale require an application restart to re-layout."
#~ msgstr "ÐоÑле коÑÑекÑии маÑÑÑаба необÑ
одимо пеÑезапÑÑÑиÑÑ Ð¿Ñиложение"
@@ -14715,12 +16086,6 @@ msgstr ""
#~ msgid "update transport clock display at FPS instead of every 100ms"
#~ msgstr "ÐбновлÑÑÑ ÑаÑÑ ÑÑанÑпоÑÑа по FPS, а не каждÑе 100 мÑ"
-#~ msgid "Align With Existing Material"
-#~ msgstr "С запиÑаннÑм маÑеÑиалом"
-
-#~ msgid "Align With Capture Time"
-#~ msgstr "Ðо вÑемени заÑ
ваÑа"
-
#~ msgid "Select From All..."
#~ msgstr "ÐÑбÑаÑÑ Ð¸Ð· вÑеÑ
..."
@@ -14774,9 +16139,6 @@ msgstr ""
#~ msgid "Export track output"
#~ msgstr "ÐкÑпоÑÑиÑоваÑÑ Ð²ÑÑ
Ð¾Ð´Ñ Ð´Ð¾Ñожки"
-#~ msgid "Peak"
-#~ msgstr "Ðиковое знаÑение"
-
#~ msgid "K20"
#~ msgstr "K20"
@@ -14896,9 +16258,6 @@ msgstr ""
#~ msgid "Remove bus"
#~ msgstr "Удаление ÑинÑ"
-#~ msgid "V"
-#~ msgstr "V"
-
#~ msgid "group|G"
#~ msgstr "ÐÑ"
@@ -14929,18 +16288,12 @@ msgstr ""
#~ msgid "O"
#~ msgstr "O"
-#~ msgid "A"
-#~ msgstr "A"
-
#~ msgid "I"
#~ msgstr "ÐÑ
од"
#~ msgid "R"
#~ msgstr "R"
-#~ msgid "S"
-#~ msgstr "C"
-
#~ msgid "SI"
#~ msgstr "SI"
@@ -14953,9 +16306,6 @@ msgstr ""
#~ msgid "C"
#~ msgstr "C"
-#~ msgid "D"
-#~ msgstr "ÐиÑк"
-
#~ msgid "Sync lock timecode to clock - Disable drift compensation."
#~ msgstr "ÐÑивÑзаÑÑ Ñайм-код к ÑаÑам (оÑклÑÑиÑÑ ÐºÐ¾Ð¼Ð¿ÐµÐ½ÑаÑÐ¸Ñ ÑмеÑениÑ)"
@@ -15015,56 +16365,6 @@ msgstr ""
#~ msgid "%u samples"
#~ msgstr "%u ÑÑмплов"
-#~ msgid ""
-#~ "<b>Welcome to this BETA release of Ardour %1</b>\n"
-#~ "\n"
-#~ "Ardour %1 has been released for Linux but because of the lack of "
-#~ "testers,\n"
-#~ "it is still at the beta stage on OS X. So, a few guidelines:\n"
-#~ "\n"
-#~ "1) Please do <b>NOT</b> use this software with the expectation that it is "
-#~ "stable or reliable\n"
-#~ " though it may be so, depending on your workflow.\n"
-#~ "2) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
-#~ "3) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
-#~ "report issues\n"
-#~ " making sure to note the product version number as %1-beta.\n"
-#~ "4) Please <b>DO</b> use the ardour-users mailing list to discuss ideas "
-#~ "and pass on comments.\n"
-#~ "5) Please <b>DO</b> join us on IRC for real time discussions about "
-#~ "ardour3. You\n"
-#~ " can get there directly from Ardour via the Help->Chat menu option.\n"
-#~ "\n"
-#~ "Full information on all the above can be found on the support page at\n"
-#~ "\n"
-#~ " http://ardour.org/support\n"
-#~ msgstr ""
-#~ "<b>ÐеÑед вами ÐÐТÐ-веÑÑÐ¸Ñ Ardour %1</b>\n"
-#~ "\n"
-#~ "ÐеÑÑÐ¸Ñ Ð´Ð»Ñ Linux Ñже вÑпÑÑена, но за оÑÑÑÑÑÑвием доÑÑаÑоÑного колиÑеÑÑва\n"
-#~ "ÑеÑÑиÑовÑиков веÑÑÐ¸Ñ Ð´Ð»Ñ OS X ÑвлÑеÑÑÑ Ð±ÐµÑой. ÐÑÑÑда â неÑколÑко "
-#~ "ÑовеÑов:\n"
-#~ "\n"
-#~ "1) ÐожалÑйÑÑа, <b>ÐÐ</b> иÑполÑзÑйÑе пÑогÑÐ°Ð¼Ð¼Ñ Ð² надежде на Ñо, ÑÑо она\n"
-#~ " доÑÑаÑоÑно ÑÑабилÑна Ð´Ð»Ñ Ð¿Ð¾Ð²Ñедневного иÑполÑзованиÑ, Ñ
оÑÑ Ð´Ð»Ñ ÐºÐ¾Ð³Ð¾-"
-#~ "Ñо\n"
-#~ " ÑÑо и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñак.\n"
-#~ "2) <b>ÐожалÑйÑÑа, ÐРиÑполÑзÑйÑе ÑоÑÑм на ardour.org Ð´Ð»Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± "
-#~ "оÑибкаÑ
</b>.\n"
-#~ "3) ÐожалÑйÑÑа, <b>ÐСÐÐÐЬÐУÐТÐ</b> ÑÑÐµÐºÐµÑ Ð½Ð° http://tracker.ardour.org/ "
-#~ "длÑ\n"
-#~ " ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибкаÑ
, не забÑв ÑказаÑÑ, ÑÑо они оÑноÑÑÑÑÑ Ðº 3.0-beta.\n"
-#~ "4) ÐожалÑйÑÑа, <b>ÐÐШÐТÐ</b> в ÑпиÑок ÑаÑÑÑлки ardour-users Ñвои "
-#~ "комменÑаÑии\n"
-#~ " и идеи каÑаÑелÑно новой веÑÑии.\n"
-#~ "5) ÐожалÑйÑÑа, <b>ÐСÐÐÐЬÐУÐТÐ</b> Ð½Ð°Ñ ÐºÐ°Ð½Ð°Ð» IRC Ð´Ð»Ñ Ð¾Ð±ÑÑÐ¶Ð´ÐµÐ½Ð¸Ñ ardour3\n"
-#~ " Ñ ÑазÑабоÑÑиками пÑогÑÐ°Ð¼Ð¼Ñ Ð² Ñежиме ÑеалÑного вÑемени. ÐÑ Ð¼Ð¾Ð¶ÐµÑе\n"
-#~ " ÑделаÑÑ ÑÑо, вÑбÑав в главном Ð¼ÐµÐ½Ñ Ð¿ÑÐ½ÐºÑ Â«Ð¡Ð¿Ñавка > ÐообÑаÑÑÑÑ».\n"
-#~ "\n"
-#~ "Ðолее подÑобнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð±Ð¾ вÑÑм ÑÑом можно полÑÑиÑÑ Ð½Ð° ÑÑÑаниÑе\n"
-#~ "\n"
-#~ " http://ardour.org/support\n"
-
#~ msgid "This is a BETA RELEASE"
#~ msgstr "ÐÑо ÐÐТÐ-веÑÑÐ¸Ñ Ð¿ÑогÑаммÑ"
diff --git a/gtk2_ardour/po/sv.mo b/gtk2_ardour/po/sv.mo
new file mode 100644
index 0000000..8f207b5
Binary files /dev/null and b/gtk2_ardour/po/sv.mo differ
diff --git a/gtk2_ardour/po/sv.po b/gtk2_ardour/po/sv.po
index 833d087..939f158 100644
--- a/gtk2_ardour/po/sv.po
+++ b/gtk2_ardour/po/sv.po
@@ -7,264 +7,297 @@ msgid ""
msgstr ""
"Project-Id-Version: ardour-gtk 1.0.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2006-06-26 23:57+GMT+1\n"
"Last-Translator: Petter Sundlöf <petter.sundlof at findus.dhs.org>\n"
"Language-Team: Svenska <sv at li.org>\n"
-"Language: \n"
+"Language: Swedish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr ""
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr ""
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr ""
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr ""
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr ""
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr ""
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr ""
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr ""
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr ""
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr ""
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr ""
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr ""
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr ""
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr ""
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr ""
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr ""
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr ""
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr ""
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr ""
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr ""
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr ""
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr ""
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr ""
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr ""
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr ""
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr ""
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr ""
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr ""
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr ""
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr ""
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr ""
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr ""
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr ""
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr ""
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr ""
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr ""
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr ""
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr ""
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr ""
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr ""
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr ""
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr ""
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr ""
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr ""
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr ""
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr ""
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr ""
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr ""
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -273,7 +306,7 @@ msgid ""
"\tRomain Arnaud <roming22 at gmail.com>\n"
msgstr ""
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -285,210 +318,264 @@ msgid ""
"\tRobin Gloster <robin at loc-com.de>\n"
msgstr ""
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
msgstr ""
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
msgstr ""
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
msgstr ""
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
msgstr ""
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
msgstr ""
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
msgstr ""
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
msgstr ""
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
msgstr ""
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
msgstr ""
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr ""
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr ""
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr ""
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
msgstr ""
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr ""
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
msgstr ""
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr ""
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Lägg till spår eller buss"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
msgstr "Konfiguration:"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr ""
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr ""
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "Ljudspår"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr ""
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
msgstr ""
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr ""
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
msgstr ""
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
msgstr ""
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr ""
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "Lägg till"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>Alternativ</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "Namn:"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "Grupp:"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr ""
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "Ljudspår"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
msgstr ""
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
msgstr ""
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr ""
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
"both audio and MIDI input data\n"
@@ -497,60 +584,61 @@ msgid ""
"track instead."
msgstr ""
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr ""
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "Ej lagerläge"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "Band"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr ""
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr ""
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "3 kanaler"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "4 kanaler"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "5 kanaler"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "6 kanaler"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "8 kanaler"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "12 kanaler"
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
msgid "Custom"
msgstr "Manuellt"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr ""
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
msgstr ""
@@ -558,177 +646,215 @@ msgstr ""
msgid "Ambiguous File"
msgstr ""
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
"Please select the path that you want to get the file from."
msgstr ""
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr ""
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "Signalkälla"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
msgstr "Valda omfång"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
msgstr "Valda regioner"
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Visningsmodell"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Sammansatt graf för varje spår"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Sammansatt graf för alla spår"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "Visa frekvenskraftsomfång"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalisera värden"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
msgstr "FFT-analysfönster"
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr "Spektralanalys"
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "Spår"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "Visa"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "Ã
teranalysera data"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr ""
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "Avlyssna"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr ""
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "Gensvar"
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr ""
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Kortkommandon"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Inställningar"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr ""
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "Om"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Platser"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "Spår och bussar"
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr ""
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr ""
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "Egenskaper"
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "Buntar"
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
msgstr "Stor klocka"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr ""
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
msgstr ""
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
msgstr ""
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
"%1"
msgstr ""
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -736,45 +862,45 @@ msgid ""
"the audio backend and save the session."
msgstr ""
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
"Please see the log window for further details."
msgstr ""
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr ""
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
msgstr ""
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
msgstr ""
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
msgstr ""
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
msgstr ""
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr ""
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
msgstr ""
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr ""
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -785,39 +911,39 @@ msgid ""
"%4"
msgstr ""
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
msgstr ""
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr ""
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
msgstr ""
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr ""
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr ""
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr ""
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -826,23 +952,23 @@ msgid ""
"controlled by %2"
msgstr ""
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr ""
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr ""
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
msgstr ""
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr ""
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -851,11 +977,11 @@ msgid ""
"\"Just quit\" option."
msgstr ""
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
msgstr ""
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -866,7 +992,7 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -877,74 +1003,107 @@ msgid ""
"What do you want to do?"
msgstr ""
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "Fråga"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr ""
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
msgstr ""
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr ""
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr ""
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr ""
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr ""
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr ""
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr ""
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr ""
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr ""
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
msgid "32-float"
msgstr ""
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
msgid "24-int"
msgstr ""
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
msgid "16-int"
msgstr ""
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr ""
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -952,215 +1111,263 @@ msgid ""
"\">%<PRIu32>%%</span>"
msgstr ""
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr ""
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr ""
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
msgstr ""
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr ""
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr ""
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Tidigare Sessioner"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "Ãppna session"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr ""
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
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:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
msgstr ""
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
msgstr ""
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
msgstr ""
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Gör ögonblickskopia"
-
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Namnge ny ögonblickskopia"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr ""
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
msgstr ""
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Gör ögonblickskopia"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Namnge ny ögonblickskopia"
+
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr ""
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
msgstr ""
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
msgstr ""
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
msgid "Save Template"
msgstr ""
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr ""
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-mall"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
"already exists. Do you want to open it?"
msgstr ""
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr ""
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr ""
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr ""
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr ""
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
msgstr ""
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Session \"%1 (ögonblickskopia %2)\" kunde inte laddas"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr ""
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Session \"%1 (ögonblickskopia %2)\" kunde inte laddas"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
"You will not be able to record or save."
msgstr ""
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr ""
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr ""
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr ""
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr ""
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1171,19 +1378,19 @@ msgstr ""
"ögonblickskopior. Dessa kan använda regioner som\n"
"använder oanvända filer för att kunna fungera."
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr ""
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr ""
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr ""
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1193,7 +1400,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1215,90 +1422,126 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr ""
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
"Clean-up will move all unused files to a \"dead\" location."
msgstr ""
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "Rensadialog"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
msgstr ""
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
msgstr "raderad fil"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
msgstr ""
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr ""
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr ""
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr ""
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr ""
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
msgstr ""
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Preferences."
msgstr ""
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
msgstr ""
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr ""
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr ""
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
msgstr ""
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
msgstr "kunde inte öppna %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr ""
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
msgstr "Inspelningen stoppades eftersom ditt system inte kunde hänga med."
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1307,23 +1550,23 @@ msgid ""
"quickly enough to keep up with recording.\n"
msgstr ""
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr ""
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr ""
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr ""
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr ""
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1332,11 +1575,11 @@ msgid ""
"quickly enough to keep up with playback.\n"
msgstr ""
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr ""
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1347,42 +1590,43 @@ msgid ""
"what you would like to do.\n"
msgstr ""
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "Ignorera kraschdata"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "Ã
terhämta från krasch"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr ""
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
"audio may be played at the wrong sample rate.\n"
msgstr ""
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr ""
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr ""
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
msgstr ""
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1394,72 +1638,97 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Gränssnitt: kan ej konfigurera editorn"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Gränssnitt: kan inte konfigurera mixern"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
msgstr ""
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "Spela från startmarkören"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "Stanna uppspelning"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "Växla inspelningläge"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "Spela omfång/markering"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "Gå till början av sessionen"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "GÃ¥ till slutet av sessionen"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "Spela loop-omfång"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
msgstr ""
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "Ã
tervänd till senaste startmarkörpunkten vid stopp"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr ""
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "Rimlig inljudsmedhörning"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "Slå på/av audio-klick"
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
@@ -1467,19 +1736,17 @@ msgstr ""
"I aktivt läge är valda kanaler i sololäge.\n"
"Klicka för att stänga av"
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-"I aktivt läge avlyssnas något\n"
-"Klicka för att stoppa avlyssningen"
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
msgstr ""
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1487,7 +1754,7 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
"+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1495,450 +1762,559 @@ msgid ""
"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr ""
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr ""
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
msgstr ""
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
msgstr ""
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
msgstr ""
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "Autoåtervänd"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr ""
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
msgid "GUI"
msgstr ""
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "Diverse"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "Förbereder redigeraren..."
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "Förbereder mixern..."
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
msgstr "Laddar sessionshistoriken..."
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Gränssnitt: kan ej konfigurera editorn"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Gränssnitt: kan inte konfigurera mixern"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Inställningar"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Redigerare"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
msgstr ""
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr ""
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr ""
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
msgstr ""
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr ""
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Synk."
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "Inställningar"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "Fönster"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "Hjälp"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
msgstr "Diverse kortkommandon"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "Ljudfilsformat"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "Filtyp"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
msgstr "Samplingsformat"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "Kontrollytor"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
msgid "Plugins"
msgstr "Insticksprogram"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
msgid "Metering"
msgstr "Nivåmätning"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr ""
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "Hållningslängd"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
msgstr "Denormal-hantering"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "Ny..."
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "Ãppna..."
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "Tidigare..."
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "Stäng"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "Lägg till spår eller buss..."
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
msgstr ""
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr ""
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
msgstr ""
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Ãgonblickskopia..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "Spara som..."
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
msgid "Rename..."
msgstr "Byt namn..."
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "Spara mall..."
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr ""
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "Redigera metadata..."
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "Importera metadata..."
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Exportera till ljudfil(er)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr ""
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
msgid "Export"
msgstr "Exportera"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr ""
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "Töm papperskorgen"
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "Avsluta"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Göm"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "Helskärmsläge"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr ""
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
msgstr ""
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
msgstr ""
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
msgstr ""
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
msgstr ""
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr ""
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
msgstr "MIDI-spårare"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "Chatt"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr ""
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Referens"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr ""
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr ""
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr ""
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr ""
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
msgstr ""
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "Spara"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "Uppspelning"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "Stopp"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr ""
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "Start/Stopp"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "Start/Fortsätt/Stopp"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "Stoppa och glöm inspelning"
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "ÃvergÃ¥ng till Rullning"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "ÃvergÃ¥ng till Motsatt riktning"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "Spela loop-omfång"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr ""
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr ""
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "Tillåt inspelning"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
msgstr "Börja inspelning"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "Bakåtspolning"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "Bakåtspolning (långsam)"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "Bakåtspolning (snabb)"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "Framåtspolning"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "Framåtspolning (långsam)"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "Framåtspolning (snabb)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
msgstr "GÃ¥ till noll"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
msgstr "Gå till början"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
msgstr "GÃ¥ till slutet"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
msgstr "Gå till väggklocka"
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr ""
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr ""
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr ""
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr ""
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr ""
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr ""
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr ""
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr ""
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr ""
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr ""
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr ""
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "Fokus på klockan"
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1946,257 +2322,274 @@ msgstr "Fokus på klockan"
msgid "Timecode"
msgstr "Tidskod"
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "Takter & slag"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
msgstr "Minuter & sekunder"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
msgstr "Samplingar"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "Inslag"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr ""
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "Utslag"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
msgid "Out"
msgstr "Ut"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "Inslag/utslag"
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr ""
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
msgstr "Klick"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "Autoinljud"
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "Autospela"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr ""
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "Huvudklocka"
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr ""
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "Procent"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "Halvtoner"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
msgstr "Skicka MTC"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
msgstr "Skicka MMC"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
msgstr "Använd MMC"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
msgstr "Skicka MIDI-klocka"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
msgstr ""
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "Panik!"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
msgid "Wall Clock"
msgstr ""
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
msgid "Disk Space"
msgstr ""
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
msgid "DSP"
msgstr ""
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
msgid "Buffers"
msgstr ""
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
msgid "Timecode Format"
msgstr ""
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
msgid "File Format"
msgstr ""
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
msgstr ""
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "Intern"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "Välj extern positionssynkronisering"
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
msgstr ""
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr ""
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr ""
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr ""
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
msgstr ""
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr ""
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "Taktart"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
msgstr ""
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr ""
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
msgid "Bars:Beats"
msgstr "Takt:Slag"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
msgid "Minutes:Seconds"
msgstr "Minuter:Sekunder"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr ""
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
msgstr ""
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
msgstr ""
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "Regionens volym:"
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
msgid "dBFS"
msgstr ""
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "Toppamplitud:"
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "Räknar ut..."
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "lägg till volymkontrollspunkt"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr ""
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr ""
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr ""
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
msgid "automation event move"
msgstr "automatiseringshändelse: förflyttning"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "ta bort kontrollpunkt"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
msgstr ""
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr ""
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
msgstr ""
@@ -2208,63 +2601,59 @@ msgstr "automatiseringstillstånd"
msgid "hide track"
msgstr "dölj spår"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
msgstr ""
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
#: panner_ui.cc:154
msgid "Play"
msgstr "Uppspelning"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
msgstr "Skriv"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
msgstr "Beröring"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
msgstr ""
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "rensa automatisering"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Göm"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
msgid "Clear"
msgstr "Rensa"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
msgstr "Tillstånd"
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr ""
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "Linjär"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "Visningsläge"
@@ -2280,35 +2669,38 @@ msgstr "Redigera bunt"
msgid "Direction:"
msgstr "Riktning:"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
msgid "Input"
msgstr "Ingång"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
msgid "Output"
msgstr "Utgång"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
msgid "Edit"
msgstr "Redigera"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
msgid "Delete"
msgstr "Radera"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "Namn"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "Ny"
@@ -2324,6 +2716,39 @@ msgstr ""
msgid "Rename Channel"
msgstr "Byt namn på kanal"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Nollställ"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objekt"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Färg"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr ""
@@ -2336,6 +2761,42 @@ msgstr ""
msgid "Value"
msgstr "Värde"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
#: edit_note_dialog.cc:42
msgid "Note"
msgstr ""
@@ -2373,2064 +2834,2159 @@ msgstr ""
msgid "Velocity"
msgstr ""
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr ""
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
msgid "Length"
msgstr "Längd"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr ""
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "CD-frames"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
msgstr ""
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
msgstr ""
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
msgstr ""
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "Sekunder"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "Minuter"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
msgstr "Slag/128"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
msgstr "Slag/64"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
msgstr "Slag/32"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
msgstr "Slag/28"
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
msgstr "Slag/24"
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
msgstr "Slag/20"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
msgstr "Slag/16"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
msgstr "Slag/14"
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
msgstr "Slag/12"
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
msgstr "Slag/10"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
msgstr "Slag/8"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
msgstr "Slag/7"
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
msgstr "Slag/6"
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
msgstr "Slag/5"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
msgstr "Slag/4"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
msgstr "Slag/3"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
msgstr "Slag/2"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "Slag"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "Takter"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "Markörer"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
msgstr "Region börjar"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
msgstr "Region slutar"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "Region synkar"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "Region gränsar"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "Inget rutnät"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "Rutnät"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "Magnetisk"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "Startmarkören"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "Markör"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "Mus"
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "Glid"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "Skarv"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr ""
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "LÃ¥s"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "Vänster"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "Höger"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "Mitten"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr "redigeringspunkten"
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr "Mossig"
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr "Mjuk"
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "Balanserad flerröstig mix"
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "Ej tonhöjdsändrat slagverk med stabila noter"
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "Skarpt monofoniskt"
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "EJ tonhöjdsändrat soloslagverk"
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr ""
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "Min:Sek"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "Platsmarkörer"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "Omfångsmarkörer"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
msgstr "Loop-/inslagsmarkörer"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "CD-markörer"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr ""
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "läge"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "Markörer"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "Regioner"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "Spår & bussar"
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "Ãgonblickskopior"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr ""
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "Omfång & markörer"
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Redigerare"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "Loop"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "Inslag"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr ""
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr ""
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr ""
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "LÃ¥ngsam"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "Snabb"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
msgstr "Avaktivera"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "Aktivera"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "Frys"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
msgstr "Ofrys"
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
msgid "Selected Regions"
msgstr "Markerade regioner"
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr "Spela omfång"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "Loopa omfång"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr ""
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr ""
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr ""
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr ""
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr ""
# msgid "Locate to Mark"
# msgstr "Flytta startmarkören till platsmarkör"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "Separera"
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
msgstr ""
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "Markera allt i omfånget"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr ""
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr ""
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr ""
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "Lägg till omfångsmarkörer"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
msgstr ""
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "Duplicera omfång"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr ""
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
msgstr ""
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
msgstr ""
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
msgstr ""
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr ""
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr ""
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Spela från redigeringspunkten"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Spela från starten"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr "Spela region"
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "Loopa region"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr "Välj allt i spåret"
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr ""
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
msgstr "Invertera markeringen i spåret"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr "Invertera"
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
msgstr "Ställ in omfång till loop-omfånget"
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
msgstr "Ställ in omfång till inslagsomfånget"
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "Markera allt efter redigeringspunkten"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
msgstr "Markera allt före redigeringspunkten"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "Markera allt efter startmarkören"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "Markera allt innan startmarkören"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr "Markera allt mellan startmarkören och redigeringspunkten"
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr "Markera allt inom startmarkör och redigeringspunkten"
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr "Markera omfång mellan startmarkören och redigeringspunkten"
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "Markera"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
msgid "Cut"
msgstr "Klipp ut"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
msgid "Copy"
msgstr "Kopiera"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
msgid "Paste"
msgstr "Klistra in"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "Justera"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "Justera relativt"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "Infoga vald region"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr "Infoga existerande media"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr ""
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr ""
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr ""
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr ""
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "Knuffa"
-#: editor.cc:2235
+#: editor.cc:2353
msgid ""
"Playhead position stored with a negative value - ignored (use zero instead)"
msgstr ""
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "Alla"
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr ""
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr ""
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr ""
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr ""
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr ""
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr ""
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr ""
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr ""
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
msgstr ""
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr ""
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr ""
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
msgstr "Zooma in"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
msgstr "Zooma ut"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr ""
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "Zooma in/ut till hela sessionen"
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr "Zoom-fokus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "Zoomfokus"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr "Expandera spår"
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr "Krymp spår"
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
msgstr ""
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
msgstr "Fästläge/rutnätsenheter"
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "Fästläge/rutnätsläge"
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Redigeringspunkten"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "Redigeringsläge"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
msgstr ""
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr ""
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr ""
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "Gör om"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "Gör om (%1)"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "Duplicera"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
msgstr ""
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "Markering"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
msgstr ""
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr ""
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr ""
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr ""
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr ""
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr ""
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr ""
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr ""
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr ""
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr ""
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
msgstr ""
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
msgstr ""
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
msgstr ""
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
msgstr ""
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
msgstr ""
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
msgstr ""
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
msgstr ""
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
msgstr ""
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
msgstr ""
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr ""
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr ""
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
"If it is deleted, audio files used by it alone will be cleaned."
msgstr ""
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr ""
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr ""
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
msgid "Cancel"
msgstr "Avbryt"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "nya spellistor"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "kopiera spellistor"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "rensa spellistor"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
msgstr ""
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
msgid "Edit..."
msgstr "Redigera..."
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
msgstr ""
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr ""
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr ""
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr ""
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "Automatisk anslutning"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
msgstr "Ãvertoningar"
# msgid "Delete"
# msgstr "Radera"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "Flytta vald platsmarkör"
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr ""
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr ""
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Redigeringspunkten"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "Tona"
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
msgstr ""
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr ""
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "Lager"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr ""
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "Beskär"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "Volym"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "Omfång"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "Ãvertoningar"
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr ""
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoomfokus"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr ""
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "Nivåmätarnedfall"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "Nivåmätartopphållning"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr ""
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "Diverse inställningar"
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "Medhörning"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
msgstr "Aktiv markör"
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "Primär klocka"
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
msgstr "Uppåtdrag / Nedåtdrag"
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "Regionsåtgärder"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "Tidslinjevisning"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr "Visningslägen"
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "Skrollning"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "Sekundär klocka"
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "Underrutor"
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
msgstr "Tidskod-FPS"
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "Höjd"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "Verktyg"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "Visa"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr ""
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Avbryt dragmanöver eller välj ingenting"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "Visa redigeringsmixer"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "Visa redigeringspanel"
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "Startmarkören till nästa regiongränsen"
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr "Startmarkören till nästa regiongräns (ingen spårmarkering)"
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "Startmarkören till föregående regiongränsen"
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr "Startmarkören till tidigare regiongränsen (inget spårval)"
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "Startmarkören till nästa regionstart"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "Startmarkören till nästa regionslut"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "Startmarkören till nästa regionsynk.-punkten"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "Startmarkören till föregående regionstarten"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "Startmarkören till föregående regionslutet"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "Startmarkören till föregående regionsynk.-punkten"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "Till nästa regiongränsen"
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "Till nästa regiongräns (inget spårval)"
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "Till förra regiongränsen"
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr ""
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr ""
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr ""
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "Till nästa regionsynk."
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "Till förra regionstart"
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr ""
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr ""
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr ""
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr ""
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "Startmarkören till omfångstarten"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "Startmarkören till omfångslutet"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr ""
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
msgid "Deselect All"
msgstr "Avmarkera allt"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "Välj allt som överlappar redigeringsomfånget"
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "Välj allt inom redigeringsomfånget"
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "Välj redigeringsomfång"
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "Markera allt i inslagsomfånget"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "Markera allt i loop-omfånget"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "Välj nästa spår eller buss"
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "Välj föregående spår eller buss"
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "Växla tillåt inspelning"
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
msgstr ""
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr ""
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr ""
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "Spara vy %1"
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "GÃ¥ till vy %1"
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "Hoppa till markör %1"
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr ""
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr ""
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
msgstr "Lägg till markör utifrån startmarkören"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr ""
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr ""
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr ""
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "Knuffa startmarkören framåt"
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "Knuffa startmarkören bakåt"
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr ""
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr ""
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr ""
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "Växla zoomtillstånd"
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr ""
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr ""
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "Flytta valda spår uppåt"
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "Flytta valda spår neråt"
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "Skrolla spår uppåt"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "Skrolla spår ner"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "Stega spår uppåt"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "Stega spår neråt"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "Skrolla bakåt"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "Skrolla framåt"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
msgstr "Centrera startmarkören"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
msgstr "Redigeringspunktens mitt"
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "Startmarkören framåt"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "Startmarkören bakåt"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "Startmarkören till aktiv markör"
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "Aktiv markör till startmarkören"
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
msgstr ""
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr ""
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr ""
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "Spela redigeringsomfånget"
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "Startmarkören till mus"
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "Aktiv markör till musen"
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
msgstr ""
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
msgstr ""
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr ""
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
msgid "Export Range"
msgstr "Exportera omfång"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "Separera utifrån in-/utslagsomfånget"
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "Separera utifrån loopomfånget"
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "Beskär"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
msgstr ""
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
msgstr ""
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr "Logg"
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr ""
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr ""
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "Börja omfång"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "Avsluta omfång"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "Följ startmarkören"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "Ta bort senaste inspelningen"
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "Stationär startmarkör"
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "Infoga tid"
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "Växla aktiv"
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "Ta bort"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
msgstr ""
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "Störst"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "Stor"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "Större"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "Liten"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
msgstr ""
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "Zoomfokus: vänster"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "Zoomfokus: höger"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "Zoomfokus: center"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "Zoomfokus: startmarkören"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "Zoomfokus: mus"
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "Zoomfokus: redigeringspunkten"
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr ""
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr ""
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr ""
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "Objektverktyg"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "Omfångsverktyg"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr ""
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr ""
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "TidsFX-verktyg"
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr ""
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
msgstr ""
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr "Stega musläge"
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "Ãndra redigeringspunkt"
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "Ãndra redigeringspunkt samt markör"
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr ""
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "Fäst mot"
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "Fästläge"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "Nästa fästläge"
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "Nästa fästlägealternativ"
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr ""
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr ""
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr "CD-rutor"
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr "Tidskod"
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr "Tidskod: sekunder"
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr "Tidskod: minuter"
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "Sekunder"
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "Minuter"
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr ""
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr ""
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "Trettio sekunder"
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr ""
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr ""
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr ""
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "Sextondelar"
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "Fjortondelar"
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr ""
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "Tiondelar"
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "Ã
ttondelar"
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "Sjundedelar"
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "Sjättedelar"
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "Femtedelar"
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "Fjärdedelar"
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "Tredjedelar"
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "Halvsteg"
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "Slag"
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "Takt"
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "Markör"
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "Regionstart"
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "Regionslut"
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr "Regionsynk."
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "Regiongräns"
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "Visa vertikala markörlinjer"
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "Loop-/inslagsmarkörer"
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "Min:sek"
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr ""
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr ""
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr ""
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr ""
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr ""
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr ""
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
msgstr ""
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr ""
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "Sortera"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "Visa Alla"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
msgstr "Visa automatiska regioner"
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "Stigande"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "Fallande"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "utifrån Regionens namn"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "utifrån Regionens längd"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "utifrån Regionens position"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "utifrån Regionens tidstämpel"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "utifrån Regionens start i filen"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "utifrån Regionens slut i filen"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "utifrån Källfilens namn"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "utifrån Källfilens längd"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "utifrån Källfilens skapelsedatum"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "utifrån Källfilsystemet"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr ""
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "Importera"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "Importera till regionslistan..."
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
-msgstr "Importera från session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
+msgstr ""
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr ""
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "Visa sammanfattande vy"
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "Visa grupptabbar"
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr ""
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
msgstr ""
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
+msgid "programming error: %1: %2"
msgstr ""
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
-msgid "programming error: %1: %2"
-msgstr ""
-
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "Högre"
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "Placera överst"
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "Lägre"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "Placera underst"
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "Flytta till ursprunglig position"
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr ""
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "Klistra mot takt & slag"
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "Ta bort synk."
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "Tysta"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "Normalisera..."
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "Motsatt riktning"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "Skapa monoregioner"
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "Ãka volym"
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "Sänk volym"
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr ""
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "Ogenomskinlig"
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "Tona In"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "Tona Ut"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "Multiduplicera..."
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "Fyll spåret"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "Sätt loop-omfång här"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "Ställ in inslag"
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr ""
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr ""
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr ""
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "Stäng luckor"
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr ""
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
msgstr "Exportera..."
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "Separera under"
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "Välj intoningslängd"
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "Välj uttoningslängd"
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "Sätt tempo från region = takt"
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "Dela vid perkussiva anslag"
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "Listredigerare..."
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "Egenskaper..."
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr ""
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr ""
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "Kombinera"
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
msgstr "Okombinera"
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "Spektralanalys..."
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "Nollställ konvolut"
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr ""
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "Konvolut aktivt"
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "Infoga patchändring..."
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
msgstr ""
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "Klipp ut tystnad..."
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "Definiera omfångsmarkering"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr ""
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr ""
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr ""
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr ""
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr ""
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "Beskär till loop"
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "Beskär till inslag"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "Beskär till föregående"
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "Beskär till nästa"
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Infoga region från regionlistan"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "Ställ in synk.-position"
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "Placera transient"
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr ""
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "Beskär början vid redigeringspunkten"
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "Beskär slutet vid redigeringspunkten"
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "Justera början"
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "Juster början relativt"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "Justera slutet"
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "Justa slutet relativt"
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "Justera synk."
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "Justera synk. relativt"
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr ""
@@ -4454,32 +5010,33 @@ msgid ""
"%2 as a new source, or skip it?"
msgstr ""
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "Avbryt importering"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
msgstr "Redigerare: kan inte öppna filen \"%1\" (%2)"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "Avbryt hela importen"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "Infoga inte"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
msgstr "Infoga alla"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr ""
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4487,207 +5044,276 @@ msgstr ""
"%1\n"
"Denna ljudfils samplingsfrekvens matchar inte sessionens!"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "Infoga ändå"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr ""
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr ""
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr ""
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
msgid "resize notes"
msgstr ""
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
msgid "Video Start:"
msgstr ""
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr ""
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr ""
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "flytta taktartsmarkör"
+
+#: editor_drag.cc:3179
msgid "copy meter mark"
msgstr "kopiera taktartsmarkör"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "flytta taktartsmarkör"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "flytta tempomarkör"
+
+#: editor_drag.cc:3331
msgid "copy tempo mark"
msgstr "kopiera tempomarkör"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "flytta tempomarkör"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
msgid "change fade in length"
msgstr "ändra intoningslängd"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
msgid "change fade out length"
msgstr "ändra uttoningslängd"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
msgid "move marker"
msgstr "flytta markör"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
msgid "An error occurred while executing time stretch operation"
msgstr ""
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
msgid "programming_error: %1"
msgstr ""
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
msgid "new skip marker"
msgstr ""
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
msgid "skip"
msgstr ""
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
msgid "CD"
msgstr ""
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
msgid "new CD marker"
msgstr ""
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "namnlös"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
msgid "Automation range drag created for invalid region type"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr ""
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr ""
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr ""
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
msgstr ""
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr ""
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr ""
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
msgstr ""
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr ""
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
msgstr ""
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr ""
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr ""
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr ""
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr ""
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr ""
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "Spela in"
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
msgstr ""
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
msgstr ""
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr ""
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
msgstr ""
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr ""
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
msgstr ""
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr ""
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
msgstr ""
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
msgstr ""
#: editor_group_tabs.cc:176
@@ -4702,300 +5328,341 @@ msgstr ""
msgid "end"
msgstr ""
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr ""
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
msgstr "ställ in loop-omfång"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "ställ in inslagsomfång"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "omfång"
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "ny omfångsmarkör"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "ta bort markör"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr ""
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr ""
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "Flytta markör till startmarkören"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr ""
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr ""
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr ""
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr ""
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr ""
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "Göm omfång"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr ""
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "Ta bort omfång"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "Separera regioner i omfånget"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "Markera omfång"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "Sätt inslagsomfång här"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "Nytt namn:"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "Byt namn på markör"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "Byt namn på omfång"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "Döp om"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "byt namn på markör"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr ""
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
msgid ""
"programming error: tempo marker canvas item has no marker object pointer!"
msgstr ""
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr ""
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr ""
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
"programming error: control point canvas item has no control point object "
"pointer!"
msgstr ""
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr ""
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Beskär slutpunkt"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
msgstr "Namnge region:"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "dela"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr ""
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr ""
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr ""
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr ""
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "knuffa framåt"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr ""
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr ""
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr ""
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr ""
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr ""
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
msgstr "rensa markörer"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "rensa omfång"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "rensa platser"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "infoga region"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr ""
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr ""
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr ""
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr ""
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr ""
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr ""
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr ""
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "Byt namn på region"
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
msgid "New name:"
msgstr "Nytt namn:"
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "separera"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr ""
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
msgstr "beskär till markeringen"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr ""
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr ""
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr ""
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr ""
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
msgstr "justera markering"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
msgstr "justera markering (relativt)"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "justera region"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr ""
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr ""
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr ""
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr ""
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr ""
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
"This track/bus cannot be frozen because the signal adds or loses channels "
"before reaching the outputs.\n"
@@ -5003,11 +5670,11 @@ msgid ""
"input or vice versa."
msgstr ""
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr ""
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5016,23 +5683,23 @@ msgid ""
"Freezing will only process the signal as far as the first send/insert/return."
msgstr ""
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr ""
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
msgstr ""
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr ""
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "Avbryt frysning"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
"You can't perform this operation because the processing of the signal will "
"cause one or more of the tracks to end up with a region with more channels "
@@ -5041,47 +5708,47 @@ msgid ""
"You can do this without processing, which is a different operation."
msgstr ""
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
msgstr ""
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "omfång till disk"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr ""
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "klipp ut"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "kopiera"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "Rensa"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr ""
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
msgstr "ta bort region"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplicera markering"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "knuffa spår"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5089,136 +5756,156 @@ msgstr ""
"Vill du verkligen radera den senaste inspelningen?\n"
"(Detta är en destruktiv handling och kan ej ångras)"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "Nej, gör ingenting."
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "Ja, radera den."
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr ""
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "normalisera"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "regioner till motsatt riktning"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr ""
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr ""
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
msgstr ""
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
msgstr ""
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr ""
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr ""
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr ""
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr ""
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr ""
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr ""
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr ""
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr ""
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr ""
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr ""
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr ""
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
msgstr ""
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr ""
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr ""
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr ""
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr ""
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr ""
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr ""
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr ""
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr ""
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
msgstr ""
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr ""
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr ""
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5226,62 +5913,62 @@ msgid ""
"This could take a long time."
msgstr ""
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr ""
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
msgstr ""
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
msgstr ""
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr ""
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr ""
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr ""
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
msgstr ""
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr ""
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
msgstr ""
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr ""
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
msgstr ""
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
msgstr ""
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr ""
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5291,23 +5978,19 @@ msgid ""
"\"allow-special-bus-removal\" option to be \"yes\""
msgstr ""
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "spår"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "buss(ar)"
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5315,7 +5998,7 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5323,358 +6006,371 @@ msgid ""
"This action cannot be undone, and the session file will be overwritten!"
msgstr ""
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
"This action cannot be undone, and the session file will be overwritten"
msgstr ""
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr ""
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "Ja, ta bort den."
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr ""
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr ""
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
msgstr ""
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr ""
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
msgstr ""
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr ""
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "tysta region"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr ""
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
msgstr ""
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr ""
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
msgstr ""
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr ""
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
msgstr ""
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr ""
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "Slut"
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr ""
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr ""
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr ""
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr ""
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "V"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr ""
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
msgstr ""
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr ""
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr ""
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr "A"
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr ""
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "Dold"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr ""
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
msgstr ""
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr ""
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr ""
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr ""
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr ""
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr ""
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr ""
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr ""
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr ""
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr ""
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr ""
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
msgstr ""
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr ""
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "H"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr ""
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
msgstr ""
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
msgstr ""
-#: editor_routes.cc:212
+#: editor_routes.cc:239
+msgid "Muted"
+msgstr ""
+
+#: editor_routes.cc:240
msgid "Soloed"
msgstr ""
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
msgstr ""
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr ""
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr ""
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "Dölj Alla"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "Visa alla spår"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "Dölj alla spår"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "Visa alla bussar"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "Dölj alla bussar"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
msgstr "Visa alla MIDI-spår"
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
msgstr "Göm alla MIDI-spår"
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Visa spår med regioner under startmarkören"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "Ny platsmarkör"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "Rensa alla platsmarkörer"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
msgstr "Visa platsmarkörer"
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr ""
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "Rensa alla omfång"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
msgstr "Visa omfång"
#: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
msgstr ""
#: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
msgstr ""
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr "Ny CD-spårsmarkör"
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
msgstr "Nytt tempo"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
msgstr "Ny taktart"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr ""
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr ""
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
msgstr ""
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr ""
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "lägg till"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "lägg till tempomarkör"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "lägg till"
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "lägg till taktartsmarkör"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "klar"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "ersätt tempomarkör"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "ta bort tempomarkör"
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
msgid ""
"programming error: meter marker canvas item has no marker object pointer!"
msgstr ""
@@ -5683,330 +6379,382 @@ msgstr ""
msgid "stretch/shrink"
msgstr ""
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr ""
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr ""
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr ""
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr ""
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr ""
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr ""
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr ""
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr ""
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr ""
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr ""
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
"low level.</span>"
msgstr ""
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
msgstr ""
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr ""
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr ""
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr ""
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr ""
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr ""
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "Fördröjning"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr ""
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "Drivrutin:"
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr ""
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "Samplingsfrekvens:"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "Buffertstorlek:"
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr ""
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr ""
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "Hårdvarans ingångsfördröjning"
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
msgstr "samplingar"
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "Hårdvarans utgångsfördröjning"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr ""
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
msgstr ""
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
"Latency calibration requires a working audio interface."
msgstr ""
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
"Latency calibration requires playback and capture"
msgstr ""
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr ""
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr "Enhet"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr ""
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr ""
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr ""
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "sampling"
-msgstr[1] "sampling"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] ""
+msgstr[1] ""
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
msgstr ""
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr ""
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr ""
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr ""
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr ""
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr ""
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr ""
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr ""
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr ""
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr ""
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr ""
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr ""
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr ""
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr ""
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr ""
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr ""
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr ""
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
msgstr ""
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr ""
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr ""
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr ""
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr ""
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Aktiv"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
+
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr ""
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
msgstr ""
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "Kanaler:"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "Dela upp i monofiler"
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr ""
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
msgstr ""
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
msgstr ""
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
msgstr ""
-#: export_dialog.cc:46
+#: export_dialog.cc:48
msgid ""
"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
"span>"
msgstr ""
-#: export_dialog.cc:47
+#: export_dialog.cc:49
msgid "List files"
msgstr ""
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
msgid "File format"
msgstr ""
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
msgid "Time Span"
msgstr "Tidsspann"
@@ -6032,45 +6780,57 @@ msgstr ""
msgid "Stop Export"
msgstr "Avbryt Export"
-#: export_dialog.cc:327
+#: export_dialog.cc:336
msgid "export"
msgstr ""
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
msgid "Normalizing '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:373 export_dialog.cc:375
-msgid "<span color=\"#ffa755\">Error: "
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
msgstr ""
-#: export_dialog.cc:385
-msgid "<span color=\"#ffa755\">Warning: "
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
msgstr ""
-#: export_dialog.cc:387
-msgid ""
+#: export_dialog.cc:401 export_dialog.cc:403
+msgid "<span color=\"#ffa755\">Error: "
+msgstr ""
+
+#: export_dialog.cc:413
+msgid "<span color=\"#ffa755\">Warning: "
+msgstr ""
+
+#: export_dialog.cc:415
+msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
msgstr ""
-#: export_dialog.cc:411
+#: export_dialog.cc:439
msgid "Export Selection"
msgstr ""
-#: export_dialog.cc:425
+#: export_dialog.cc:453
msgid "Export Region"
msgstr ""
-#: export_dialog.cc:434
+#: export_dialog.cc:462
msgid "Source"
msgstr ""
-#: export_dialog.cc:450
+#: export_dialog.cc:478
msgid "Stem Export"
msgstr ""
@@ -6078,172 +6838,246 @@ msgstr ""
msgid "Add another format"
msgstr ""
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr ""
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "Plats"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr ""
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr ""
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr ""
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr ""
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr ""
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
msgstr ""
#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "Mapp:"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "Bläddra"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
msgstr ""
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
+
+#: export_filename_selector.cc:217
msgid ""
"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
msgstr ""
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
msgstr ""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
"The filename will be chosen from the information just above the folder "
"selector."
msgstr ""
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr ""
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "Etikett: "
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalisera till"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "Beskär tystnad i början"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "Lägg till tystnad i början:"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "Beskär tystnad i slutet"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "Lägg till tystnad i slutet:"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "Kompatibilitet"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "Kvalitet"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr ""
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr ""
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
msgstr ""
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr ""
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr ""
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr ""
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr ""
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr ""
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr ""
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr ""
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr ""
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr ""
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
msgstr ""
@@ -6251,29 +7085,200 @@ msgstr ""
msgid "Preset"
msgstr ""
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
msgstr ""
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr ""
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Kunde inte läsa fil: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Dela kanaler"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
msgid "Show Times as:"
msgstr "Visa tider som:"
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
msgid "Select All"
msgstr "Markera allt"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
msgid " to "
msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
msgid "Range"
msgstr "Omfång"
@@ -6289,36 +7294,39 @@ msgstr ""
msgid "getSoundResourceFile: root = %1, != response"
msgstr ""
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
msgid "%1"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
msgid "-inf"
msgstr ""
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
msgid "Fader automation mode"
msgstr "Automatiseringsläge för reglage"
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
msgid "Fader automation type"
msgstr "Automatiseringstyp för reglage"
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
msgid "Abs"
msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
msgid "P"
msgstr "U"
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
msgid "T"
msgstr "B"
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
msgid "W"
msgstr "S"
@@ -6326,47 +7334,51 @@ msgstr "S"
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Förinställningar</span>"
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
msgid "Manual"
msgstr ""
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
msgid "All Automation"
msgstr ""
#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Kontroller"
-
-#: generic_pluginui.cc:293
msgid "Plugin Editor: could not build control element for port %1"
msgstr ""
"Insticksprogramsredigerare: kunde inte bygga kontrollelement för port%1"
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
msgid "Plugin Editor: no control for property %1"
msgstr ""
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
msgid "Plugin Editor: could not build control element for property %1"
msgstr ""
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Kontroller"
+
+#: generic_pluginui.cc:510
msgid "Meters"
msgstr ""
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
msgid "Automation control"
msgstr "Automatiseringskontroll"
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
msgid "Mgnual"
msgstr ""
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
msgstr "Ljudspårsanslutningar"
@@ -6375,126 +7387,163 @@ msgstr "Ljudspårsanslutningar"
msgid "MIDI Connection Manager"
msgstr "MIDI-spåranslutningar"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
msgstr "Koppla från"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr ""
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "Markering..."
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
msgstr "Inspelningsläge"
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
msgstr "Solad..."
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr ""
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
msgstr ""
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr ""
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr ""
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr ""
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr ""
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr ""
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
msgstr ""
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
msgstr ""
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr ""
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr ""
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr ""
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr ""
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr ""
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr ""
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr ""
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
msgstr ""
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr ""
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr ""
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr ""
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr ""
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr ""
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr ""
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr ""
@@ -6502,66 +7551,92 @@ msgstr ""
msgid "I/O selector"
msgstr ""
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1-ingång"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1-utgång"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr "egen"
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr ""
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr ""
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "Ta bort kortkommando"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Händelse"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Kortkommando"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Kortkommandon"
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "Välj en händelse och tryck tangentkombinationen du vill använda"
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Ta bort kortkommando"
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:80
+msgid "Search..."
msgstr ""
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:82
+msgid "Print"
msgstr ""
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
msgstr ""
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
msgstr ""
-#: keyeditor.cc:269
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr ""
+
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Händelse"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Kortkommando"
+
+#: keyeditor.cc:370
msgid "RegionList"
msgstr ""
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
msgstr ""
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "sample"
+
#: latency_gui.cc:40
msgid "msec"
msgstr "msek"
@@ -6570,188 +7645,317 @@ msgstr "msek"
msgid "period"
msgstr ""
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
msgid "Reset"
msgstr "Nollställ"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr ""
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "Använd SM"
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "Klistra"
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr ""
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr ""
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr ""
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr ""
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
msgstr ""
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
msgstr ""
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr ""
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr ""
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr ""
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
msgstr ""
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr ""
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr ""
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr "Ny markör"
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr "Nytt omfång"
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>Loop-/inslagsomfång</b>"
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>Markörer (inkl CD-index)</b>"
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>Omfång (inkl CD-spårsomfång)</b>"
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "lägg till omfångsmarkör"
-#: main.cc:82
-msgid "%1 could not connect to the audio backend."
+#: lua_script_manager.cc:31
+msgid "Add/Set"
msgstr ""
-#: main.cc:107 main.cc:123
-msgid "The audio backend (%1) has failed, or terminated"
+#: lua_script_manager.cc:34
+msgid "Call"
msgstr ""
-#: main.cc:110
-msgid ""
-"%2 exited unexpectedly, and without notifying %1.\n"
-"\n"
-"This could be due to misconfiguration or to an error inside %2.\n"
-"\n"
-"Click OK to exit %1."
+#: lua_script_manager.cc:35
+msgid "New Hook"
msgstr ""
-#: main.cc:124
-msgid "%2 exited unexpectedly, and without notifying %1."
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
msgstr ""
-#: main.cc:219
-msgid ""
-"\n"
-" %1 could not understand your command line "
+#: lua_script_manager.cc:127
+msgid "Action %1"
msgstr ""
-#: main.cc:221
-msgid "An error was encountered while launching %1"
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
msgstr ""
-#: main.cc:310
-msgid " (built using "
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
msgstr ""
-#: main.cc:313
-msgid " and GCC version "
-msgstr " och GCC version "
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: luawindow.cc:98
+msgid "Clear Output"
msgstr ""
-#: main.cc:324
-msgid ""
-"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
-"Baker, Robin Gareus"
+#: luawindow.cc:102
+msgid "Revert"
msgstr ""
-#: main.cc:326
-msgid "%1 comes with ABSOLUTELY NO WARRANTY"
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
msgstr ""
-#: main.cc:327
-msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
msgstr ""
-#: main.cc:328
-msgid "This is free software, and you are welcome to redistribute it "
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
msgstr ""
-#: main.cc:329
-msgid "under certain conditions; see the source for copying conditions."
+#: luawindow.cc:342
+msgid "Deleted %1"
msgstr ""
-#: main.cc:334
-msgid "could not initialize %1."
+#: luawindow.cc:345
+msgid "Failed to delete %1"
msgstr ""
-#: main.cc:344
-msgid "Cannot xinstall SIGPIPE error handler"
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
msgstr ""
-#: main.cc:351
-msgid "could not create %1 GUI"
+#: luawindow.cc:416
+msgid "Script fails to compile."
msgstr ""
-#: main_clock.cc:52
-msgid "Display delta to edit cursor"
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
msgstr ""
-#: marker.cc:273
-msgid "MarkerText"
-msgstr "MarkörText"
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
-#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
+msgid "%1 could not connect to the audio backend."
+msgstr ""
+
+#: main.cc:135 main.cc:151
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr ""
+
+#: main.cc:138
+msgid ""
+"%2 exited unexpectedly, and without notifying %1.\n"
+"\n"
+"This could be due to misconfiguration or to an error inside %2.\n"
+"\n"
+"Click OK to exit %1."
+msgstr ""
+
+#: main.cc:152
+msgid "%2 exited unexpectedly, and without notifying %1."
+msgstr ""
+
+#: main.cc:247
+msgid ""
+"\n"
+" %1 could not understand your command line "
+msgstr ""
+
+#: main.cc:249
+msgid "An error was encountered while launching %1"
+msgstr ""
+
+#: main.cc:344
+msgid " (built using "
+msgstr ""
+
+#: main.cc:347
+msgid " and GCC version "
+msgstr " och GCC version "
+
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
+
+#: main.cc:358
+msgid ""
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
+msgstr ""
+
+#: main.cc:360
+msgid "%1 comes with ABSOLUTELY NO WARRANTY"
+msgstr ""
+
+#: main.cc:361
+msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: main.cc:362
+msgid "This is free software, and you are welcome to redistribute it "
+msgstr ""
+
+#: main.cc:363
+msgid "under certain conditions; see the source for copying conditions."
+msgstr ""
+
+#: main.cc:368
+msgid "could not initialize %1."
+msgstr ""
+
+#: main.cc:378
+msgid "Cannot xinstall SIGPIPE error handler"
+msgstr ""
+
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
+msgid "could not create %1 GUI"
+msgstr ""
+
+#: main_clock.cc:51
+msgid "Display delta to edit cursor"
+msgstr ""
+
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
+msgid "MarkerText"
+msgstr "MarkörText"
+
+#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "Ingen"
@@ -6832,11 +8036,11 @@ msgstr ""
msgid "Click to force all MIDI channel messages to channel %1"
msgstr ""
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr ""
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr ""
@@ -6948,192 +8152,188 @@ msgstr ""
msgid "velocity edit"
msgstr ""
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
msgid "add note"
msgstr ""
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
msgid "step add"
msgstr ""
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
msgid "alter patch change"
msgstr ""
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
msgid "add patch change"
msgstr ""
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
msgid "move patch change"
msgstr ""
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
msgid "delete patch change"
msgstr ""
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
msgid "delete selection"
msgstr ""
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
msgid "delete note"
msgstr ""
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
msgid "move notes"
msgstr ""
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
msgid "change velocities"
msgstr ""
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
msgid "transpose"
msgstr ""
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
msgid "change note lengths"
msgstr ""
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
msgid "nudge"
msgstr ""
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
msgid "change channel"
msgstr ""
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
msgid "Bank "
msgstr ""
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
msgid "Channel "
msgstr ""
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
msgid "paste"
msgstr "klistra"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr ""
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr ""
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr ""
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr ""
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr ""
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr ""
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr ""
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "Visa hela omfånget"
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "Anpassa innehållet"
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr ""
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr ""
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr ""
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr ""
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr ""
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr ""
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
msgstr ""
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr ""
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr ""
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr ""
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr ""
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr ""
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr ""
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr ""
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr ""
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr ""
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
msgstr ""
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr ""
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr ""
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr ""
@@ -7149,7 +8349,7 @@ msgstr ""
msgid "Decimal"
msgstr ""
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "Aktiverad"
@@ -7165,35 +8365,36 @@ msgstr ""
msgid "New velocity"
msgstr ""
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
msgstr ""
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr ""
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr ""
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr ""
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr ""
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr ""
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "ljud"
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7205,7 +8406,7 @@ msgid ""
"\n"
msgstr ""
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr ""
@@ -7213,516 +8414,706 @@ msgstr ""
msgid "Missing Plugins"
msgstr ""
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
msgstr ""
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
msgstr ""
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
msgid "pre"
msgstr "pre"
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
msgid "Comments"
msgstr ""
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
msgid "Click to toggle the width of this mixer strip."
msgstr ""
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
msgid ""
"\n"
"%1-%2-click to toggle the width of all strips."
msgstr ""
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
msgid "Hide this mixer strip"
msgstr ""
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
msgid "Click to select metering point"
msgstr ""
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
msgid "Isolate Solo"
msgstr ""
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
msgid "Lock Solo Status"
msgstr ""
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
msgid "Iso"
msgstr ""
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "Mixgrupp"
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
msgid "Phase Invert"
msgstr ""
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
msgid "Record & Monitor"
msgstr ""
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
msgid "Solo Iso / Lock"
msgstr ""
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
msgid "Enable/Disable MIDI input"
msgstr ""
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
msgid "Aux"
msgstr ""
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
msgid "Snd"
msgstr ""
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
msgid "Add %1 port"
msgstr ""
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr ""
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
msgid "<b>INPUT</b> to %1"
msgstr ""
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr ""
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
msgid "Disconnected"
msgstr ""
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Kommentarer"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
msgid "Cmt"
msgstr "Kmt"
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Kmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Klicka för att lägga till/redigera kommentarer"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
msgid "Grp"
msgstr ""
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
msgid "~G"
msgstr ""
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "Färg..."
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
msgid "Comments..."
msgstr ""
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
msgid "Inputs..."
msgstr ""
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
msgid "Outputs..."
msgstr ""
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
msgid "Save As Template..."
msgstr "Spara som spårmall..."
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Aktiv"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
msgid "Adjust Latency..."
msgstr "Justera fördröjning..."
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
msgid "Protect Against Denormals"
msgstr "Skydda mot denormals"
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "Fjärr-ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
msgid "Pre"
msgstr ""
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
msgid "Post"
msgstr ""
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
msgstr ""
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
msgstr ""
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
msgstr ""
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
msgid "Disk"
msgstr ""
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
msgid "AFL"
msgstr ""
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
msgid "PFL"
msgstr ""
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
msgstr ""
#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
msgid "Pre Fader"
msgstr "Före-nivåreglage"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
msgid "Post Fader"
msgstr "Efter-nivåreglage"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr ""
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
msgid "Change all to %1"
msgstr ""
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr ""
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "Grupp"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr "hittade inte spårvisningslisteobjekt för omdöpt remsor!"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
msgstr "-alla-"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "Remsor"
-#: meter_strip.cc:157
-msgid "Reset Peak"
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
msgstr ""
-#: meter_strip.cc:883
-msgid "Variable height"
+#: mixer_ui.cc:2481
+msgid "Add at the top"
msgstr ""
-#: meter_strip.cc:884
-msgid "Short"
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
msgstr ""
-#: meter_strip.cc:885
-msgid "Tall"
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
msgstr ""
-#: meter_strip.cc:886
-msgid "Grande"
+#: mixer_ui.cc:2487
+msgid "Add at the end"
msgstr ""
-#: meter_strip.cc:887
-msgid "Venti"
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
msgstr ""
-#: meter_patterns.cc:82
-msgid "Peak"
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
msgstr ""
-#: meter_patterns.cc:85
-msgid "RMS + Peak"
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
msgstr ""
-#: meter_patterns.cc:88
-msgid "IEC1/DIN"
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
msgstr ""
-#: meter_patterns.cc:91
-msgid "IEC1/Nordic"
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
msgstr ""
-#: meter_patterns.cc:94
-msgid "IEC2/BBC"
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
msgstr ""
-#: meter_patterns.cc:97
-msgid "IEC2/EBU"
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
msgstr ""
-#: meter_patterns.cc:109
-msgid "VU"
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
msgstr ""
-#: monitor_section.cc:69
-msgid "SiP"
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
msgstr ""
-#: monitor_section.cc:96 route_group_dialog.cc:49
-msgid "Soloing"
-msgstr "Sololäge"
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
-#: monitor_section.cc:100
-msgid "Isolated"
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
msgstr ""
-#: monitor_section.cc:104
-msgid "Auditioning"
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
msgstr ""
-#: monitor_section.cc:114
-msgid ""
-"When active, something is solo-isolated.\n"
-"Click to de-isolate everything"
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
msgstr ""
-#: monitor_section.cc:117
-msgid ""
-"When active, auditioning is active.\n"
-"Click to stop the audition"
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
msgstr ""
-#: monitor_section.cc:134
-msgid "Solo controls affect solo-in-place"
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
msgstr ""
-#: monitor_section.cc:140
-msgid "Solo controls toggle after-fader-listen"
+#: meter_strip.cc:160
+msgid "Reset Peak"
msgstr ""
-#: monitor_section.cc:146
-msgid "Solo controls toggle pre-fader-listen"
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
msgstr ""
-#: monitor_section.cc:156
-msgid "Gain increase for soloed signals (0dB is normal)"
+#: meter_strip.cc:894
+msgid "Variable height"
msgstr ""
-#: monitor_section.cc:170
-msgid "Solo Boost"
+#: meter_strip.cc:895
+msgid "Short"
msgstr ""
-#: monitor_section.cc:185
-msgid ""
-"Gain reduction non-soloed signals\n"
-"A value above -inf dB causes \"solo-in-front\""
+#: meter_strip.cc:896
+msgid "Tall"
msgstr ""
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: meter_strip.cc:897
+msgid "Grande"
msgstr ""
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: meter_strip.cc:898
+msgid "Venti"
msgstr ""
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
+msgid "RMS + Peak"
+msgstr ""
+
+#: meter_patterns.cc:93
+msgid "IEC1/DIN"
+msgstr ""
+
+#: meter_patterns.cc:96
+msgid "IEC1/Nordic"
+msgstr ""
+
+#: meter_patterns.cc:99
+msgid "IEC2/BBC"
+msgstr ""
+
+#: meter_patterns.cc:102
+msgid "IEC2/EBU"
+msgstr ""
+
+#: meter_patterns.cc:105
+msgid "K20/RMS"
+msgstr ""
+
+#: meter_patterns.cc:108
+msgid "K14/RMS"
+msgstr ""
+
+#: meter_patterns.cc:111
+msgid "K12/RMS"
+msgstr ""
+
+#: meter_patterns.cc:114
+msgid "VU"
+msgstr ""
+
+#: monitor_section.cc:80
+msgid "SiP"
msgstr ""
-#: monitor_section.cc:235
+#: monitor_section.cc:113 route_group_dialog.cc:49
+msgid "Soloing"
+msgstr "Sololäge"
+
+#: monitor_section.cc:117
+msgid "Isolated"
+msgstr ""
+
+#: monitor_section.cc:121
+msgid "Auditioning"
+msgstr ""
+
+#: monitor_section.cc:132
+msgid ""
+"When active, something is solo-isolated.\n"
+"Click to de-isolate everything"
+msgstr ""
+
+#: monitor_section.cc:135
+msgid ""
+"When active, auditioning is active.\n"
+"Click to stop the audition"
+msgstr ""
+
+#: monitor_section.cc:152
+msgid "Solo controls affect solo-in-place"
+msgstr ""
+
+#: monitor_section.cc:158
+msgid "Solo controls toggle after-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:164
+msgid "Solo controls toggle pre-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:170
msgid "Excl. Solo"
msgstr ""
-#: monitor_section.cc:237
+#: monitor_section.cc:172
msgid "Exclusive solo means that only 1 solo is active at a time"
msgstr ""
-#: monitor_section.cc:244
+#: monitor_section.cc:179
msgid "Solo » Mute"
msgstr ""
-#: monitor_section.cc:246
+#: monitor_section.cc:181
msgid ""
"If enabled, solo will override mute\n"
"(a soloed & muted track or bus will be audible)"
msgstr ""
-#: monitor_section.cc:323
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
+msgid "Gain increase for soloed signals (0dB is normal)"
+msgstr ""
+
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
+msgid "Solo Boost"
+msgstr ""
+
+#: monitor_section.cc:222
+msgid ""
+"Gain reduction non-soloed signals\n"
+"A value above -inf dB causes \"solo-in-front\""
+msgstr ""
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
+msgid "SiP Cut"
+msgstr ""
+
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
+msgstr ""
+
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr ""
+
+#: monitor_section.cc:399
msgid "Monitor"
msgstr ""
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr ""
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr ""
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr ""
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr ""
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr ""
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr ""
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr ""
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr ""
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr ""
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr ""
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
msgstr ""
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
msgstr ""
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
msgstr ""
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr ""
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
msgstr ""
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -7777,10 +9168,6 @@ msgid ""
"relies on a stable, sustainable income stream. Thanks for using Ardour!"
msgstr ""
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Ny förinställning"
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr "Ersätt existerande förinställning med samma namn"
@@ -7789,6 +9176,10 @@ msgstr "Ersätt existerande förinställning med samma namn"
msgid "Name of new preset"
msgstr "Namnge ny förinställning"
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "Normalisera regioner"
@@ -7797,7 +9188,11 @@ msgstr "Normalisera regioner"
msgid "Normalize region"
msgstr "Normalisera region"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalisera till"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
msgid "dbFS"
msgstr ""
@@ -7817,103 +9212,106 @@ msgstr "Normalisera"
msgid "Select Note"
msgstr ""
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "Användning: "
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr ""
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr ""
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr ""
-#: opts.cc:61
+#: opts.cc:65
msgid ""
" -a, --no-announcements Do not contact website for announcements\n"
msgstr ""
-#: opts.cc:62
+#: opts.cc:66
msgid ""
" -b, --bindings Print all possible keyboard binding names\n"
msgstr ""
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-#: opts.cc:64
+#: opts.cc:69
msgid ""
" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr ""
-#: opts.cc:65
+#: opts.cc:70
msgid ""
" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
"available options\n"
msgstr ""
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr ""
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr ""
-#: opts.cc:68
+#: opts.cc:73
msgid ""
" -N, --new session-name Create a new session from the command line\n"
msgstr ""
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr ""
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
msgstr ""
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr ""
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr ""
-#: opts.cc:75
+#: opts.cc:80
msgid ""
" -E, --save <file> Load the specified session, save it to <file> "
"and then quit\n"
msgstr ""
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr ""
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
msgstr ""
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
msgstr "Förbigå"
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
msgstr "Panorerare"
@@ -7925,6 +9323,22 @@ msgstr "panoreringsautomatiseringsläge"
msgid "Pan automation type"
msgstr "panoreringsuatomtiseringstyp"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
#: playlist_selector.cc:43
msgid "Playlists"
msgstr ""
@@ -7957,143 +9371,297 @@ msgstr "dB-skala"
msgid "Show phase"
msgstr "Visa fas"
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "Namn innehåller"
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "Typ innehåller"
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
msgstr "Kategori innehåller"
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "Upphovsperson innehåller"
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "Bibliotek innehåller"
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
msgstr "Endast favoriter"
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "Endast dolda"
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr "Insticksprogram"
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
msgstr ""
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr "Tillgängliga insticksprogram"
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "Typ"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr "Kategori"
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr "Upphovsman"
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr ""
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr ""
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr ""
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr ""
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "Insticksprogram att ansluta"
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "Lägg till ett insticksprogram till effektlistan"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "Ta bort ett insticksprogram från effektlistan"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Uppdatera tillgängliga insticksprogram"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "Infoga"
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr ""
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
"See the Log window for more details (maybe)"
msgstr ""
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
msgstr "Favoriter"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "Insticksprogram..."
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
msgstr "Upphovsman"
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
msgstr "Kategori"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr ""
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr ""
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
msgstr ""
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr ""
@@ -8101,37 +9669,42 @@ msgstr ""
msgid "Add"
msgstr "Lägg till"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr ""
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr "Analys av insticksprogram"
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
msgstr ""
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr ""
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr ""
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr ""
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr ""
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -8139,110 +9712,126 @@ msgstr ""
"Tryck här för att tillåta att insticksprogrammet mottar tangentbordsgenvägar "
"som %1 vanligtvis skulle använda"
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr "Tryck för att slå på/av insticksprogrammet"
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] ""
msgstr[1] ""
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr "fördröjning (%1 msek)"
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr "Ställ in fördröjning"
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr ""
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Ny förinställning"
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "Tryck här för att återställa normala tangentbordsgenvägar"
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
msgid "%1 Busses"
msgstr "%1-bussar"
-#: port_group.cc:338
+#: port_group.cc:339
msgid "%1 Tracks"
msgstr "%1-spår"
-#: port_group.cc:339
+#: port_group.cc:340
msgid "Hardware"
msgstr "HÃ¥rdvara"
-#: port_group.cc:340
+#: port_group.cc:341
msgid "%1 Misc"
msgstr ""
-#: port_group.cc:341
+#: port_group.cc:342
msgid "Other"
msgstr ""
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
msgid "LTC Out"
msgstr ""
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
msgid "LTC In"
msgstr ""
-#: port_group.cc:463
+#: port_group.cc:473
msgid "MTC in"
msgstr ""
-#: port_group.cc:466
+#: port_group.cc:476
msgid "MIDI control in"
msgstr ""
-#: port_group.cc:469
+#: port_group.cc:479
msgid "MIDI clock in"
msgstr ""
-#: port_group.cc:472
+#: port_group.cc:482
msgid "MMC in"
msgstr ""
-#: port_group.cc:476
+#: port_group.cc:486
msgid "MTC out"
msgstr ""
-#: port_group.cc:479
+#: port_group.cc:489
msgid "MIDI control out"
msgstr ""
-#: port_group.cc:482
+#: port_group.cc:492
msgid "MIDI clock out"
msgstr ""
-#: port_group.cc:485
+#: port_group.cc:495
msgid "MMC out"
msgstr ""
-#: port_group.cc:532
+#: port_group.cc:554
msgid ":monitor"
msgstr ""
-#: port_group.cc:544
+#: port_group.cc:570
msgid "system:"
msgstr ""
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
msgstr ""
#: port_insert_ui.cc:39
@@ -8265,78 +9854,77 @@ msgstr ""
msgid "Port Insert "
msgstr ""
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
msgstr "<b>Källor</b>"
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
msgstr "<b>Destinationer</b>"
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr "Lägg till %s-%s"
#
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr "Byt namn på '%s'..."
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr "Ta bort alla"
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr ""
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "Uppdatera"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr "Visa enskilda portar"
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr ""
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
msgstr ""
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr ""
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
msgstr ""
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
msgstr ""
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "Ta bort '%s'"
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s alla från '%s'"
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "kanal"
@@ -8348,223 +9936,237 @@ msgstr ""
msgid "There are no %1 ports to connect."
msgstr ""
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
msgstr ""
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
msgstr ""
-#: processor_box.cc:310
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
msgstr ""
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
msgstr ""
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr ""
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr ""
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
msgstr ""
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr ""
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
msgid "off"
msgstr "av"
-#: processor_box.cc:957
+#: processor_box.cc:1817
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
msgstr ""
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
msgid "Plugin Incompatibility"
msgstr ""
-#: processor_box.cc:1432
+#: processor_box.cc:2446
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr ""
-#: processor_box.cc:1438
+#: processor_box.cc:2452
msgid ""
"\n"
"This plugin has:\n"
msgstr ""
-#: processor_box.cc:1441
+#: processor_box.cc:2455
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1445
+#: processor_box.cc:2459
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1448
+#: processor_box.cc:2462
msgid ""
"\n"
"but at the insertion point, there are:\n"
msgstr ""
-#: processor_box.cc:1451
+#: processor_box.cc:2465
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1455
+#: processor_box.cc:2469
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] ""
msgstr[1] ""
-#: processor_box.cc:1458
+#: processor_box.cc:2472
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
msgstr ""
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
"outputs will not work correctly."
msgstr ""
-#: processor_box.cc:1991
+#: processor_box.cc:3189
msgid "Rename Processor"
msgstr ""
-#: processor_box.cc:2022
+#: processor_box.cc:3220
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr ""
-#: processor_box.cc:2159
+#: processor_box.cc:3371
msgid "plugin insert constructor failed"
msgstr ""
-#: processor_box.cc:2170
+#: processor_box.cc:3382
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
"could not match the configuration of this track."
msgstr ""
-#: processor_box.cc:2216
+#: processor_box.cc:3428
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
msgid "Yes, remove them all"
msgstr "Ja, ta bort alla"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
msgid "Remove processors"
msgstr ""
-#: processor_box.cc:2237
+#: processor_box.cc:3449
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2240
+#: processor_box.cc:3452
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-#: processor_box.cc:2428
+#: processor_box.cc:3641
msgid "New Plugin"
msgstr "Nytt insticksprogram"
-#: processor_box.cc:2431
+#: processor_box.cc:3644
msgid "New Insert"
msgstr "Ny Anslutningspunkt"
-#: processor_box.cc:2434
+#: processor_box.cc:3647
msgid "New External Send ..."
msgstr ""
-#: processor_box.cc:2438
+#: processor_box.cc:3651
msgid "New Aux Send ..."
msgstr "Ny auxilliär sänd..."
-#: processor_box.cc:2441
+#: processor_box.cc:3654
msgid "Send Options"
msgstr ""
-#: processor_box.cc:2443
+#: processor_box.cc:3656
msgid "Clear (all)"
msgstr "Rensa (alla)"
-#: processor_box.cc:2445
+#: processor_box.cc:3658
msgid "Clear (pre-fader)"
msgstr "Rensa (förreglage)"
-#: processor_box.cc:2447
+#: processor_box.cc:3660
msgid "Clear (post-fader)"
msgstr "Rensa (efterreglage)"
-#: processor_box.cc:2473
+#: processor_box.cc:3690
msgid "Activate All"
msgstr "Aktivera alla"
-#: processor_box.cc:2475
+#: processor_box.cc:3692
msgid "Deactivate All"
msgstr ""
-#: processor_box.cc:2477
+#: processor_box.cc:3694
msgid "A/B Plugins"
msgstr "A/B:a insticksprogram"
-#: processor_box.cc:2486
+#: processor_box.cc:3707
msgid "Edit with generic controls..."
msgstr ""
-#: processor_box.cc:2789
+#: processor_box.cc:4039
msgid "%1: %2 (by %3)"
msgstr ""
-#: processor_box.cc:2791
+#: processor_box.cc:4041
msgid "%1 (by %2)"
msgstr ""
@@ -8592,345 +10194,444 @@ msgstr ""
msgid "main grid"
msgstr "rutnät"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
msgstr "Kvantisera"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "Styrka"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "Sving"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "Tröskel (ticks)"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
msgstr "Fäst notstart mot"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
msgstr "Fäst notslut mot"
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Klickljudfil"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "Bläddra..."
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Klickljudfil"
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "Betoning:"
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "Markera klick"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "Markera klickbetoning"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "Begränsa ångrahistoriken till"
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "Spara ångrahistorik för"
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "kommandon"
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "Redigera med:"
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+ musknapp"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "Radera med:"
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr ""
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
msgstr ""
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Tangentbordslayout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Typsnittskalning"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
msgstr ""
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
msgstr ""
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
msgstr ""
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "Uppspelning (sekunder buffert):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "Inspelning (sekunder buffert):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
+msgstr ""
+
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
msgstr ""
#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "Dubbleklicka aktiverad kontrollytas namn för inställningar"
+msgid "While Dragging Control Points:"
+msgstr ""
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
msgstr ""
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
msgstr ""
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
msgstr ""
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:1032
+msgid "Default"
msgstr ""
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
msgstr ""
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:1100
+msgid "â"
msgstr ""
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
msgstr ""
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1102
+msgid "1 min"
msgstr ""
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
msgstr ""
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1109
msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
msgstr ""
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
msgstr ""
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
msgstr ""
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
msgstr ""
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
msgstr ""
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
msgstr ""
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr ""
+
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr "Uppspelning (sekunder buffert):"
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr "Inspelning (sekunder buffert):"
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
msgstr ""
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1367
msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
msgstr ""
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
msgstr ""
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
msgstr ""
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
msgstr ""
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
msgstr ""
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1565
msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
msgstr ""
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
msgstr ""
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
msgstr ""
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
msgstr ""
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1579
msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
msgstr ""
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
msgstr ""
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
msgstr ""
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
msgstr ""
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
msgstr ""
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "%1-inställningar"
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
msgstr "DSP CPU-användning"
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "Signalprocessering använder"
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "alla förutom en processor"
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "alla tillgängliga processorer"
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
msgstr "%1 processor(er)"
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr ""
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr ""
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "Bekräfta borttagning av senaste inspelningen"
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Gör periodiska säkerhetskopior"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr ""
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Gör periodiska säkerhetskopior"
+
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "Kopiera alltid importerade filer"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
msgstr ""
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr ""
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr ""
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "Automatisering"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
msgstr ""
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr ""
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "Behåll inspelningsläge på vid stopp"
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr ""
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
"<b>When enabled</b> the loop button does not start playback but forces "
"playback to always play the loop\n"
@@ -8939,25 +10640,25 @@ msgid ""
"cancels loop playback"
msgstr ""
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
msgstr "Stoppa inspelningen när en xrun inträffar"
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
msgstr ""
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "Skapa en markör där en xrun inträffar"
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "Stoppa vid slutet av sessionen"
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -8966,11 +10667,11 @@ msgid ""
"all times"
msgstr ""
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
msgstr ""
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -8980,39 +10681,83 @@ msgid ""
"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
msgstr "Omöjliggör spårspecifik inspelningslägesändring i rullande läge"
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
msgstr ""
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "12dB volymreduktion för snabbspolning"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
msgstr ""
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
msgstr ""
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr ""
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr ""
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9026,27 +10771,27 @@ msgid ""
"external timecode standard and the session standard."
msgstr ""
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
msgstr ""
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
"<b>When enabled</b> %1 will never varispeed when slaved to external "
"timecode. Sync Lock indicates that the selected external timecode source "
"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
"interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
"the timecode sources shares clock sync."
msgstr ""
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr ""
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9059,659 +10804,926 @@ msgid ""
"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
msgstr ""
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
msgstr ""
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
msgstr ""
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
msgstr ""
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
msgstr ""
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
msgstr ""
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
msgstr ""
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
msgstr ""
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr ""
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Gummibandsmarkeringen fäster mot rutnätet"
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "Flytta automation tillsammans med regioner"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Namnge nya markörer"
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Visa nivåmätning vid spåren i redigeraren"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
-#: rc_option_editor.cc:1646
-msgid "Display master-meter in the toolbar"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
msgstr ""
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
msgstr ""
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
msgstr ""
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
msgstr ""
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
msgstr ""
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Gummibandsmarkeringen fäster mot rutnätet"
-
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Visa vågformer i regioner"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr ""
-#: rc_option_editor.cc:1700
+#: rc_option_editor.cc:2272
msgid "Show gain envelopes in audio regions"
msgstr ""
-#: rc_option_editor.cc:1701
+#: rc_option_editor.cc:2273
msgid "in all modes"
msgstr ""
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
msgstr ""
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
-msgstr "VÃ¥gformsskala"
-
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linjär"
-
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "logaritmisk"
-
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
-msgstr "VÃ¥gformsutseende"
-
-#: rc_option_editor.cc:1726
-msgid "traditional"
-msgstr "traditionell"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
-#: rc_option_editor.cc:1727
-msgid "rectified"
-msgstr "korrigerad"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "Flytta automation tillsammans med regioner"
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Visa vågformer vid inspelning"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr ""
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Visa zoom-verktygsraden"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
msgstr ""
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
msgstr ""
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Namnge nya markörer"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
msgstr ""
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
msgstr ""
-#: rc_option_editor.cc:1786
+#: rc_option_editor.cc:2332
msgid "After splitting selected regions, select"
msgstr ""
-#: rc_option_editor.cc:1791
+#: rc_option_editor.cc:2337
msgid "no regions"
msgstr ""
-#: rc_option_editor.cc:1794
+#: rc_option_editor.cc:2340
msgid "newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1798
+#: rc_option_editor.cc:2344
msgid "existing selection and newly-created regions"
msgstr ""
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Visa vågformer i regioner"
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Visa vågformer vid inspelning"
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
+msgstr "VÃ¥gformsskala"
+
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linjär"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr "logaritmisk"
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr "VÃ¥gformsutseende"
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr "traditionell"
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr "korrigerad"
+
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr "Buffertar"
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr ""
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr ""
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "ljudhårdvaran"
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "Bandmaskingläge"
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "Spår- och bussanslutning"
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "Anslut master/medhörningsbussar automatiskt"
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "Anslut spåringångar"
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "automatiskt till fysiska ingångar"
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "manuellt"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "Anslut spår- och bussutgångar"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "automatiskt till fysiska utgångar"
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "automatiskt till master-bussen"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr ""
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
msgstr "Använd DC-bias för att skydda mot denormals"
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "Processorhantering"
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "ingen processorhantering"
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr "använd FlushToZero"
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "använd DenormalsAreZero"
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr ""
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr ""
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Aktivera nya insticksprogram automatiskt"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "Analysera ljudfiler automatiskt"
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "Ã
terskapa saknade regioners kanaler"
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / tysta"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
msgstr ""
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
msgid "Solo controls are Listen controls"
msgstr "Solokontroller är avlyssningskontroller"
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Avskild solo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Visa solotystning"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo åsidosätter tystning"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr ""
+
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr "Avlyssningsposition"
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
msgstr ""
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
msgstr ""
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
msgstr "PFL-signaler kommer från"
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
msgstr "innan för-nivåreglageprocessorer"
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
msgstr "för-nivåreglage men efter för-nivåreglageprocessorer"
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
msgstr "AFL-signaler kommer från"
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
msgstr ""
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
msgstr ""
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Avskild solo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Visa solotystning"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo åsidosätter tystning"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "Standardinställningar för spår-/busstystning"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
msgstr "Tystning påverkar för-reglagesändningar"
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
msgstr "Tystning påverkar efter-reglagesändningar"
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "Tystning påverkar kontrollutgångar"
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "Tystning påverkar huvudutgångarna"
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
msgstr ""
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
msgstr ""
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr ""
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "Initiell programändring"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "Skicka MIDI-kontrollgensvar"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
msgstr "Skicka MIDI-tidskod"
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr ""
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "Lyd MIDI Machine Control-kommandon"
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
msgstr "Skicka MIDI Machine Control-kommandon"
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "Skicka MIDI-kontrollgensvar"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
msgstr "Inkommande MMC-enhets-ID"
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
msgstr "Utgående MMC-enhets-ID"
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "Initiell programändring"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr ""
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr ""
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr ""
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr ""
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr ""
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr ""
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
" <i>(if available for your language preferences)</i>"
msgstr ""
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "Tangentbord"
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "Kontrollytans fjärr-ID"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Aktivera nya insticksprogram automatiskt"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "användardefinierat"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "följer mixerns ordning"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
msgid "Preferences|GUI"
msgstr ""
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr ""
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
msgid "Show tooltips if mouse hovers over a control"
msgstr ""
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr ""
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr ""
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
msgid "Lock timeout (seconds)"
msgstr ""
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr ""
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
msgid "Mixer Strip"
msgstr ""
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
msgid "Use narrow strips in the mixer by default"
msgstr ""
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
msgid "Preferences|Metering"
msgstr ""
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
msgid "Peak hold time"
msgstr ""
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
msgid "short"
msgstr "kort"
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
msgid "medium"
msgstr ""
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
msgid "long"
msgstr "lång"
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
msgid "DPM fall-off"
msgstr ""
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
msgid "slowest [6.6dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr ""
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
msgstr ""
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr ""
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
msgstr ""
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
msgid "Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr ""
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
msgid "-20dBFS (SMPTE RP.0155)"
msgstr ""
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
msgid "-18dBFS (EBU, BBC)"
msgstr ""
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
msgid "-15dBFS (DIN)"
msgstr ""
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr ""
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
msgid "Reference level for IEC1/DIN meter."
msgstr ""
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
msgid "VU Meter standard"
msgstr ""
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
msgid "0VU = -2dBu (France)"
msgstr ""
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
msgid "0VU = 0dBu (North America, Australia)"
msgstr ""
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
msgid "0VU = +4dBu (standard)"
msgstr ""
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
msgid "Peak threshold [dBFS]"
msgstr ""
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
msgstr ""
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
msgid "LED meter style"
msgstr ""
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Visa nivåmätning vid spåren i redigeraren"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
msgid "Theme"
msgstr ""
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "avlyssna denna region"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr ""
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
msgid "End:"
msgstr "Slut:"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr "Längd:"
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr "Synk.-punkt (relativt mot region):"
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
msgstr "Synk.-punkt (absolut):"
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr "Fil börjar:"
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
msgstr "Källor:"
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
msgstr "Källa:"
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr ""
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr ""
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr ""
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr ""
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr ""
@@ -9731,33 +11743,33 @@ msgstr ""
msgid "Choose Top Region"
msgstr ""
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr ""
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr ""
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "msek"
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr ""
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] ""
msgstr[1] ""
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr ""
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -9803,55 +11815,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr ""
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "Dela region"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr ""
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr ""
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr ""
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "Analysera"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "Upptäcktsfunktion"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Utlösningsglapp"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Tröskel"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "Topptröskel"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "Tystnadströskel"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "Känslighet"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "Hantering"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr ""
@@ -9875,19 +11895,15 @@ msgstr "Inspelningsläge"
msgid "Active state"
msgstr ""
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Färg"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr ""
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>Gemensamt</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr ""
@@ -9907,406 +11923,389 @@ msgstr "Utgångar"
msgid "Plugins, Inserts & Sends"
msgstr "Insticksprogram, anslutningspunkter & sändningar"
-#: route_params_ui.cc:209
+#: 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:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
msgstr "Uppspelningsfördröjning: %<PRId64> samplingar"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "INGET SPÃ
R"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Lägg till spår eller buss"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "Inget spår eller buss vald"
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr ""
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "Spela in"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "Ruttgrupp"
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr ""
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "Visa all automatisering"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "Visa existerande automatisering"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "Göm all automatisering"
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr ""
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
msgstr "Volym"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
msgstr "Panorering"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "Ãverlappande"
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "I trappa"
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "Lager"
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr ""
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr ""
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr ""
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
msgstr "Efter existerande material"
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
msgstr "Efter inspelningstiden"
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "Justera"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr "Normalt"
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr "Bandläge"
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr "Ej i lager"
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr ""
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "Spellista"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr ""
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr ""
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr ""
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr ""
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr ""
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
msgstr ""
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "Ny kopia..."
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr ""
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr ""
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "Rensa aktuell"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr ""
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr ""
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "programmeringsfel: "
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr ""
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr ""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr ""
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
msgstr ""
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
msgstr ""
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr "Tysta detta spår"
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
msgstr "Tysta andra (icke-solade) spår"
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr ""
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
msgstr ""
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr ""
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr ""
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
msgstr ""
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr ""
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
msgstr ""
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
msgstr ""
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
msgstr ""
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
msgstr ""
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
msgstr ""
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
msgstr ""
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
msgstr ""
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
msgstr ""
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
msgstr ""
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr ""
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr ""
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
msgstr ""
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
msgstr ""
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "Kontrollutgångar"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "Huvudutgångar"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr "Färgval"
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
msgstr ""
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr ""
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr ""
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "Döp om spår"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr "Byt namn på buss"
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr ": kommentar"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr "-fördröjning"
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr ""
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr "Spara som spårmall"
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr "Namn på spårmall:"
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "Fjärrstyrnings-ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "Fjärr-ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
msgstr ""
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
msgstr ""
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
msgstr ""
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
msgstr ""
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
msgstr ""
-"Vänsterklicka för att invertera (fasinvers) kanal %1 i detta spår. "
-"Högerklicka för att visa menyn"
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
msgstr ""
#: search_path_option.cc:35
@@ -10321,126 +12320,158 @@ msgstr ""
msgid "the session folder"
msgstr ""
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
#: send_ui.cc:134
msgid "Send "
msgstr ""
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
msgstr ""
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr ""
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Ny session"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Tidigare Sessioner"
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
msgstr ""
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
msgstr ""
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Ny session"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
msgstr ""
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
msgstr ""
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "Välj sessionsfil"
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr ""
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
msgid "Open"
msgstr "Ãppna"
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "Sessionens namn:"
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
msgstr "Skapa sessionsmappen i:"
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "Välj mapp för sessionen"
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "Använd denna mall"
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr "ingen mall"
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr ""
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
msgstr ""
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
msgstr ""
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "kanaler"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>Bussar</b>"
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>Ingångar</b>"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>Utgångar</b>"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "Skapa master-buss"
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr ""
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "Använd endast"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "Anslut automatiskt utgångar"
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "...till master-bussen"
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "...till fysiska utgångar"
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr "Beståndsdelar"
@@ -10461,197 +12492,197 @@ msgstr ""
msgid "This will select all elements of this type!"
msgstr "Detta väljer alla beståndsdelar av denna typen!"
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
msgstr ""
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr ""
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
msgstr ""
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "Fält"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "Värden (aktuellt värde längst upp)"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr ""
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr ""
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr ""
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr ""
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr ""
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "Titel"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "Spårnummer"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "Undertitel"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr "Gruppering"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr ""
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr ""
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "Kommentar"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "Upphovsrätt"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr ""
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "Ã
r"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "Albumartist"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "Totalt antal spår"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "Skivans undertitel"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "Skivans nummer"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "Total antal skivor"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "Samling"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
msgstr ""
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
msgstr ""
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "Människor"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "Textförfattare"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "Kompositör"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "Dirigent"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "Remixare"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "Arrangör"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "Ljudtekniker"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "Producent"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "DJ-mixer"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr ""
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr ""
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
msgstr ""
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr ""
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
msgstr "Redigera sessionens metadata"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "Importa sessionsmetadata"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr ""
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr ""
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
msgstr ""
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
msgstr ""
@@ -10798,209 +12829,230 @@ msgid "Destructive crossfade length"
msgstr "Destruktiv övertonings längd"
#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
msgid "Region fades active"
msgstr "Regiontoningar aktiva"
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr "Regiontoningar synliga"
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr ""
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr "Ljudfilsformat"
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
msgstr "Sampleformat"
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
msgstr ""
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
msgstr ""
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
msgstr ""
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr "Filtyp"
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
msgstr ""
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
msgstr ""
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr "Filplatser"
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr "Sök efter ljudfiler i:"
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr "Sök efter MIDI-filer i:"
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr ""
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
msgstr ""
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr ""
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
msgid ""
"Adds the current track number to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr ""
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr ""
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr ""
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
msgid ""
"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr ""
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
msgstr ""
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr ""
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr ""
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr ""
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr ""
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr ""
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr ""
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr ""
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr ""
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr ""
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr ""
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr ""
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr ""
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr ""
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr ""
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr "tillåter inte"
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr "gör inget särskilt"
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr "ersätt existerande överlappande not"
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr "förkorta den existerande överlappande not"
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
msgstr "förkorta den nya överlappande noten"
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
msgstr "ersätt båda överlappande noter med en enstaka not"
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr ""
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr ""
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr ""
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr ""
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr ""
@@ -11036,26 +13088,14 @@ msgstr ""
msgid "Timestamp:"
msgstr ""
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "Taggar:"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Kunde inte läsa fil: %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr ""
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Dela kanaler"
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
msgstr ""
@@ -11064,284 +13104,280 @@ msgstr ""
msgid "Search"
msgstr "Sök"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr ""
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr "Ljudfiler"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr "MIDI-filer"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
msgid "All files"
msgstr "Alla filer"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
msgid "Browse Files"
msgstr "Bläddra"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "Sökvägar"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr "Sök taggar"
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr ""
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr ""
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr ""
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr ""
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr ""
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr ""
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr ""
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr ""
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr ""
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr ""
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr ""
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr ""
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
msgid "Filename"
msgstr ""
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr ""
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
msgstr ""
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr ""
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr ""
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
msgstr "Sök i Freesound"
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
msgstr ""
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
msgstr ""
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
msgstr ""
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] ""
msgstr[1] ""
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr ""
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "ett spår per fil"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr ""
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr ""
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr ""
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr ""
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr ""
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr ""
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr ""
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
msgstr ""
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "Kopiera filer till sessionen"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr "filens timestamp"
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "redigeringspunkten"
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "startmarkören"
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "sessionens start"
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr ""
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr ""
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr ""
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr ""
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr ""
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "Bäst"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "Bra"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "Snabb"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "Snabbast"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr ""
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr ""
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr "Enheter"
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr ""
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr ""
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "Maxhastighet"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr ""
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr ""
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ""
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr ""
@@ -11366,7 +13402,7 @@ msgstr ""
msgid "%1: %2 of %3 bytes uploaded"
msgstr ""
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr ""
@@ -11382,17 +13418,17 @@ msgstr ""
msgid "Azimuth:"
msgstr ""
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr ""
-#: startup.cc:142
+#: startup.cc:146
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11402,15 +13438,15 @@ msgid ""
"program.</span> "
msgstr ""
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "Välkommen till %1"
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "Standardplatsen för %1-sessioner"
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11427,11 +13463,11 @@ msgstr ""
"<i>(Du kan så klart placera sessioner var du vill, detta är bara "
"stanardplatsen)</i>"
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "Standardplats för nya sessioner"
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11445,25 +13481,25 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
msgstr "Medhörningsalternativ"
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "Använd master-bussen"
-#: startup.cc:287
+#: startup.cc:291
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
msgstr ""
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "Använd en ytterligare medhörningsbuss"
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -11471,7 +13507,7 @@ msgstr ""
"Använd en medhörningsbuss mellan mater-bussen och hårdvaruutgångarna för \n"
"större kontroll av medhörning, utan att påverka mixen."
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11479,44 +13515,40 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
msgstr "Medhörningssektion"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr ""
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ""
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ""
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ""
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr ""
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr ""
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr ""
-#: step_entry.cc:71
-msgid "back"
-msgstr ""
-
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
+#: step_entry.cc:70
+msgid "back"
msgstr ""
#: step_entry.cc:191
@@ -11627,11 +13659,11 @@ msgstr ""
msgid "Insert a program change message"
msgstr ""
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr ""
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr ""
@@ -11643,240 +13675,244 @@ msgstr ""
msgid "Octave"
msgstr ""
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
msgstr ""
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
msgstr ""
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
msgstr ""
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
msgstr ""
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
msgstr ""
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
msgstr ""
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
msgstr ""
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
msgstr ""
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
msgstr ""
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
msgstr ""
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr ""
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
msgstr ""
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr ""
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr ""
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr ""
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr ""
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr ""
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr ""
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr ""
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr ""
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr ""
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr ""
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr ""
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr ""
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr ""
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr ""
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr ""
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr ""
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr ""
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr ""
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr ""
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr ""
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr ""
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
msgstr ""
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
msgstr ""
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
msgstr ""
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
msgstr ""
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
msgstr ""
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
msgstr ""
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
msgstr ""
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
msgstr ""
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr ""
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr ""
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr ""
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr ""
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr ""
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr ""
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr ""
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr ""
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr ""
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr ""
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr ""
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr ""
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
msgstr ""
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr ""
@@ -11884,176 +13920,189 @@ msgstr ""
msgid "Strip Silence"
msgstr ""
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Tröskel"
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr ""
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr ""
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr ""
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr ""
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr ""
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr ""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr ""
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr ""
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr ""
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr ""
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr ""
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr ""
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr ""
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr ""
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr ""
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "Slag per minut:"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr ""
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr ""
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
msgstr ""
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "Notvärde:"
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "Slag per takt:"
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr ""
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
msgstr ""
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Mörkt tema"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Ljust tema"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Nollställ"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr ""
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
msgstr ""
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "Färglägg regioner med spårets färg"
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr ""
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr ""
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr ""
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr ""
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr ""
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objekt"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
msgstr ""
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
"\" for some.\n"
@@ -12061,92 +14110,95 @@ msgid ""
"take effect"
msgstr ""
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
"Make transient windows follow the front window when toggling between the "
"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
msgstr ""
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr ""
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] ""
msgstr[1] ""
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
msgstr "Snabbt men fult"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "Hoppa över Anti-aliasing"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Innehåll"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr ""
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr ""
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr ""
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr ""
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr ""
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr ""
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr ""
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr ""
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr ""
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr ""
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "Förläng/Förkorta"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr ""
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "Starta inspelning vid autoinslagsstart"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "Stanna inspelning vid autoinslagsslut"
@@ -12214,94 +14266,130 @@ msgstr ""
msgid "Transpose"
msgstr "Transponera"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
msgid "Loading default ui configuration file %1"
msgstr ""
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
msgid "cannot read default ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:177
+#: ui_config.cc:247
msgid "Could not find default UI configuration file %1"
msgstr ""
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
msgid "Loading color file %1"
msgstr ""
-#: ui_config.cc:222
+#: ui_config.cc:340
msgid "cannot read color file \"%1\""
msgstr ""
-#: ui_config.cc:227
+#: ui_config.cc:345
msgid "color file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
msgid "Color file %1 not saved"
msgstr ""
-#: ui_config.cc:317
+#: ui_config.cc:433
msgid "Loading user ui configuration file %1"
msgstr ""
-#: ui_config.cc:320
+#: ui_config.cc:436
msgid "cannot read ui configuration file \"%1\""
msgstr ""
-#: ui_config.cc:325
+#: ui_config.cc:441
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr ""
-#: ui_config.cc:333
+#: ui_config.cc:449
msgid "could not find any ui configuration file, canvas will look broken."
msgstr ""
-#: ui_config.cc:351
+#: ui_config.cc:470
msgid "Config file %1 not saved"
msgstr ""
-#: ui_config.cc:592
+#: ui_config.cc:715
msgid "Color %1 not found"
msgstr ""
-#: ui_config.cc:662
+#: ui_config.cc:785
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr ""
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr ""
-#: utils.cc:577
+#: utils.cc:424
msgid "cannot find XPM file for %1"
msgstr ""
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
msgid "default"
msgstr ""
-#: utils.cc:642
+#: utils.cc:528
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr ""
-#: utils.cc:649
+#: utils.cc:535
msgid "cannot find icon image for %1 using %2"
msgstr ""
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
msgid "Caught exception while loading icon named %1"
msgstr ""
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
#: add_video_dialog.cc:54
msgid "Set Video Track"
msgstr ""
@@ -12346,32 +14434,48 @@ msgstr ""
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
msgid ""
"Parsing video file info failed. Is the Video Server running? Is the file "
"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-#: video_timeline.cc:506
+#: video_timeline.cc:510
msgid ""
"Failed to set session-framerate: '%1' does not have a corresponding option "
"setting in %2."
msgstr ""
-#: video_timeline.cc:514
+#: video_timeline.cc:518
msgid ""
"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
"vs '%3'"
msgstr ""
-#: video_timeline.cc:587
+#: video_timeline.cc:591
msgid ""
"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
"means that the video server was not started by %1 and uses a different "
"document-root."
msgstr ""
-#: video_timeline.cc:724
+#: video_timeline.cc:728
msgid ""
"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12381,25 +14485,25 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_timeline.cc:739
+#: video_timeline.cc:743
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr ""
-#: video_timeline.cc:766
+#: video_timeline.cc:775
msgid ""
"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
"later. http://xjadeo.sf.net/"
msgstr ""
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr ""
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
"The tools are included with the %1 releases from ardour.org and also "
"available with the video-server at http://x42.github.com/harvid/\n"
@@ -12421,7 +14525,7 @@ msgstr ""
msgid "Output File:"
msgstr ""
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr ""
@@ -12430,10 +14534,14 @@ msgid "Height = "
msgstr ""
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr ""
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr ""
@@ -12443,9 +14551,8 @@ msgstr ""
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
#: transcode_video_dialog.cc:120
@@ -12454,83 +14561,83 @@ msgid ""
"unsupported video codec or format."
msgstr ""
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
msgstr ""
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr ""
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr ""
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr ""
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr ""
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr ""
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr ""
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr ""
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr ""
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr ""
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr ""
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr ""
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr ""
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr ""
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr ""
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr ""
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr ""
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr ""
@@ -12550,7 +14657,7 @@ msgstr ""
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr ""
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
"The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12560,239 +14667,230 @@ msgid ""
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr ""
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr ""
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr ""
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
"Do you want %1 to launch 'harvid' on this machine?"
msgstr ""
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr ""
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr ""
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
msgid "Destination is outside Video Server's docroot. "
msgstr ""
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
msgid ""
"The destination file path is outside of the Video Server's docroot. The file "
"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
msgid "Continue"
msgstr ""
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
msgid "Confirm Overwrite"
msgstr ""
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
msgid "Cannot create video folder \"%1\" (%2)"
msgstr ""
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr ""
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr ""
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr ""
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr ""
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr ""
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr ""
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr ""
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr ""
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr ""
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr ""
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
msgstr ""
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr ""
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
msgstr ""
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr ""
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr ""
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr ""
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr ""
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr ""
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
msgstr ""
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr ""
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
msgstr ""
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr ""
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr ""
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr ""
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr ""
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr ""
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr ""
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr ""
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr ""
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr ""
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr ""
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
msgstr ""
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr ""
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr ""
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
msgstr ""
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr ""
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr ""
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
msgstr ""
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr ""
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr ""
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr ""
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr ""
@@ -12810,13 +14908,162 @@ msgstr ""
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+#~ msgid "Display model"
+#~ msgstr "Visningsmodell"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Sammansatt graf för varje spår"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Sammansatt graf för alla spår"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalisera värden"
+
+#~ msgid "Locations"
+#~ msgstr "Platser"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "I aktivt läge avlyssnas något\n"
+#~ "Klicka för att stoppa avlyssningen"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Ãgonblickskopia..."
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Exportera till ljudfil(er)..."
+
+#~ msgid "Reference"
+#~ msgstr "Referens"
+
+#~ msgid "Transition To Roll"
+#~ msgstr "ÃvergÃ¥ng till Rullning"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "ÃvergÃ¥ng till Motsatt riktning"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Spela från redigeringspunkten"
+
+#~ msgid "Play From Start"
+#~ msgstr "Spela från starten"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoom-fokus"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Avbryt dragmanöver eller välj ingenting"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importera från session"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Infoga region från regionlistan"
+
+#~ msgid "End point trim"
+#~ msgstr "Beskär slutpunkt"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplicera markering"
+
+#~ msgid "tracks"
+#~ msgstr "spår"
+
+#~ msgid "busses"
+#~ msgstr "buss(ar)"
+
+#~ msgid "L"
+#~ msgstr "V"
+
+#~ msgid "O"
+#~ msgstr "A"
+
+#~ msgid "R"
+#~ msgstr "H"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Visa spår med regioner under startmarkören"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr "Välj en händelse och tryck tangentkombinationen du vill använda"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Kommentarer"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Kmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Klicka för att lägga till/redigera kommentarer"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "Fjärr-ID..."
+
+#~ msgid "Update available plugins"
+#~ msgstr "Uppdatera tillgängliga insticksprogram"
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Tangentbordslayout:"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Typsnittskalning"
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr "Dubbleklicka aktiverad kontrollytas namn för inställningar"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Visa zoom-verktygsraden"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / tysta"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Kontrollytans fjärr-ID"
+
+#~ msgid "assigned by user"
+#~ msgstr "användardefinierat"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "följer mixerns ordning"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Utlösningsglapp"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "Fjärrstyrnings-ID"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "Fjärr-ID:"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track. Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Vänsterklicka för att invertera (fasinvers) kanal %1 i detta spår. "
+#~ "Högerklicka för att visa menyn"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Mörkt tema"
+
+#~ msgid "Light Theme"
+#~ msgstr "Ljust tema"
+
+#~ msgid "Contents:"
+#~ msgstr "Innehåll"
+
#~ msgid ""
#~ "%1\n"
#~ "(built from revision %2)"
diff --git a/gtk2_ardour/po/zh.mo b/gtk2_ardour/po/zh.mo
new file mode 100644
index 0000000..2e3ac3f
Binary files /dev/null and b/gtk2_ardour/po/zh.mo differ
diff --git a/gtk2_ardour/po/zh.po b/gtk2_ardour/po/zh.po
index 32fb0c3..8b21cf0 100644
--- a/gtk2_ardour/po/zh.po
+++ b/gtk2_ardour/po/zh.po
@@ -1,275 +1,304 @@
-# Copyright (C) YEAR Free Software Foundation, Inc.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-# ä¸åé±¼ YQ-YSY at 163.com å®æç¿»è¯äº 2015-12-09 å¨ Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn> çåºç¡ä¸
-#
+# ä¸åé±¼ <YQ-YSY at 163.com> ç¿»è¯äº 2016-07-29
msgid ""
msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2016-01-04 23:21+0800\n"
-"Last-Translator: Rui-huai Zhang <zrhzrh>\n"
-"Language-Team: zrhzrh <zrhzrh at mail.ustc.edu.cn>\n"
-"Language: zh_CN\n"
+"POT-Creation-Date: 2016-07-25 22:30+0800\n"
+"PO-Revision-Date: 2016-07-28 22:22+0800\n"
+"Last-Translator: \n"
+"Language-Team: ä¸åé±¼ YQ-YSY at 163.com\n"
+"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
-"X-Poedit-Basepath: ../..\n"
-"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 1.8.4\n"
-"X-Poedit-SearchPath-0: gtk2_ardour\n"
+"X-Generator: Poedit 1.8.7.1\n"
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
msgid "Brian Ahr"
msgstr ""
-#: about.cc:126
+#: about.cc:129
msgid "John Anderson"
msgstr ""
-#: about.cc:127
+#: about.cc:130
msgid "Marcus Andersson"
msgstr ""
-#: about.cc:128
+#: about.cc:131
msgid "Nedko Arnaudov"
msgstr ""
-#: about.cc:129
+#: about.cc:132
msgid "Hans Baier"
msgstr ""
-#: about.cc:130
+#: about.cc:133
msgid "Ben Bell"
msgstr ""
-#: about.cc:131
+#: about.cc:134
msgid "Sakari Bergen"
msgstr ""
-#: about.cc:132
+#: about.cc:135
msgid "Christian Borss"
msgstr ""
-#: about.cc:133
+#: about.cc:136
msgid "Chris Cannam"
msgstr ""
-#: about.cc:134
+#: about.cc:137
msgid "Jeremy Carter"
msgstr ""
-#: about.cc:135
+#: about.cc:138
msgid "Jesse Chappell"
msgstr ""
-#: about.cc:136
+#: about.cc:139
msgid "Thomas Charbonnel"
msgstr ""
-#: about.cc:137
+#: about.cc:140
msgid "Sam Chessman"
msgstr ""
-#: about.cc:138
+#: about.cc:141
msgid "André Colomb"
msgstr ""
-#: about.cc:139
+#: about.cc:142
msgid "Paul Davis"
msgstr ""
-#: about.cc:140
+#: about.cc:143
msgid "Gerard van Dongen"
msgstr ""
-#: about.cc:141
+#: about.cc:144
msgid "John Emmas"
msgstr ""
-#: about.cc:142
+#: about.cc:145
msgid "Colin Fletcher"
msgstr ""
-#: about.cc:143
+#: about.cc:146
msgid "Dave Flick"
msgstr ""
-#: about.cc:144
+#: about.cc:147
msgid "Hans Fugal"
msgstr ""
-#: about.cc:145
+#: about.cc:148
msgid "Robin Gareus"
msgstr ""
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
msgid "Christopher George"
msgstr ""
-#: about.cc:147
+#: about.cc:151
msgid "Chris Goddard"
msgstr ""
-#: about.cc:148
+#: about.cc:152
msgid "J. Abelardo Gutierrez"
msgstr ""
-#: about.cc:149
+#: about.cc:153
msgid "Jeremy Hall"
msgstr ""
-#: about.cc:150
+#: about.cc:154
msgid "Audun Halland"
msgstr ""
-#: about.cc:151
+#: about.cc:155
msgid "David Halter"
msgstr ""
-#: about.cc:152
+#: about.cc:156
msgid "Steve Harris"
msgstr ""
-#: about.cc:153
+#: about.cc:157
msgid "Melvin Ray Herr"
msgstr ""
-#: about.cc:154
+#: about.cc:158
msgid "Carl Hetherington"
msgstr ""
-#: about.cc:155
+#: about.cc:159
msgid "Rob Holland"
msgstr ""
-#: about.cc:156
+#: about.cc:160
msgid "Robert Jordens"
msgstr ""
-#: about.cc:157
+#: about.cc:161
msgid "Stefan Kersten"
msgstr ""
-#: about.cc:158
+#: about.cc:162
msgid "Armand Klenk"
msgstr ""
-#: about.cc:159
+#: about.cc:163
msgid "Julien de Kozak"
msgstr ""
-#: about.cc:160
+#: about.cc:164
msgid "Matt Krai"
msgstr ""
-#: about.cc:161
+#: about.cc:165
msgid "Georg Krause"
msgstr ""
-#: about.cc:162
+#: about.cc:166
msgid "Nick Lanham"
msgstr ""
-#: about.cc:163
+#: about.cc:167
msgid "Colin Law"
msgstr ""
-#: about.cc:164
+#: about.cc:168
msgid "Joshua Leach"
msgstr ""
-#: about.cc:165
+#: about.cc:169
msgid "Ben Loftis"
msgstr ""
-#: about.cc:166
+#: about.cc:170
msgid "Nick Mainsbridge"
msgstr ""
-#: about.cc:167
+#: about.cc:171
msgid "Tim Mayberry"
msgstr ""
-#: about.cc:168
+#: about.cc:172
msgid "Doug Mclain"
msgstr ""
-#: about.cc:169
+#: about.cc:173
msgid "Todd Naugle"
msgstr ""
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
msgid "Jack O'Quin"
msgstr ""
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
msgid "Nimal Ratnayake"
msgstr ""
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
msgid "David Robillard"
msgstr ""
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
msgid "Taybin Rutkin"
msgstr ""
-#: about.cc:174
+#: about.cc:183
msgid "Andreas Ruge"
msgstr ""
-#: about.cc:175
+#: about.cc:184
msgid "Sampo Savolainen"
msgstr ""
-#: about.cc:176
+#: about.cc:185
msgid "Rodrigo Severo"
msgstr ""
-#: about.cc:177
+#: about.cc:186
msgid "Per Sigmond"
msgstr ""
-#: about.cc:178
+#: about.cc:187
msgid "Lincoln Spiteri"
msgstr ""
-#: about.cc:179
+#: about.cc:188
msgid "Mike Start"
msgstr ""
-#: about.cc:180
+#: about.cc:189
msgid "Mark Stewart"
msgstr ""
-#: about.cc:181
+#: about.cc:190
msgid "Roland Stigge"
msgstr ""
-#: about.cc:182
+#: about.cc:191
msgid "Petter Sundlöf"
msgstr ""
-#: about.cc:183
+#: about.cc:192
msgid "Mike Täht"
msgstr ""
-#: about.cc:184
+#: about.cc:193
msgid "Roy Vegard"
msgstr ""
-#: about.cc:185
+#: about.cc:194
msgid "Thorsten Wilms"
msgstr ""
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
msgid "Grygorii Zharun"
msgstr ""
-#: about.cc:191
+#: about.cc:201
msgid ""
"French:\n"
"\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -283,7 +312,7 @@ msgstr ""
"\tMartin Blanchard\n"
"\tRomain Arnaud <roming22 at gmail.com>\n"
-#: about.cc:192
+#: about.cc:202
msgid ""
"German:\n"
"\tKarsten Petersen <kapet at kapet.de>\n"
@@ -303,7 +332,7 @@ msgstr ""
"\tRichard Oax <richard at pagliacciempire.de>\n"
"\tRobin Gloster <robin at loc-com.de>\n"
-#: about.cc:199
+#: about.cc:209
msgid ""
"Italian:\n"
"\tFilippo Pappalardo <filippo at email.it>\n"
@@ -313,7 +342,7 @@ msgstr ""
"\tFilippo Pappalardo <filippo at email.it>\n"
"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-#: about.cc:200
+#: about.cc:210
msgid ""
"Portuguese:\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -321,7 +350,7 @@ msgstr ""
"è¡èçè¯ï¼\n"
"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-#: about.cc:201
+#: about.cc:211
msgid ""
"Brazilian Portuguese:\n"
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -331,7 +360,7 @@ msgstr ""
"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
"\tChris Ross <chris at tebibyte.org>\n"
-#: about.cc:203
+#: about.cc:213
msgid ""
"Spanish:\n"
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -341,7 +370,7 @@ msgstr ""
"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-#: about.cc:204
+#: about.cc:214
msgid ""
"Russian:\n"
"\t Igor Blinov <pitstop at nm.ru>\n"
@@ -351,7 +380,7 @@ msgstr ""
"\t Igor Blinov <pitstop at nm.ru>\n"
"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-#: about.cc:206
+#: about.cc:216
msgid ""
"Greek:\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -359,7 +388,7 @@ msgstr ""
"å¸è
è¯ï¼\n"
"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-#: about.cc:207
+#: about.cc:217
msgid ""
"Swedish:\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -367,7 +396,7 @@ msgstr ""
"çå
¸è¯ï¼\n"
"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-#: about.cc:208
+#: about.cc:218
msgid ""
"Polish:\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -375,7 +404,7 @@ msgstr ""
"æ³¢å
°è¯ï¼\n"
"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-#: about.cc:209
+#: about.cc:219
msgid ""
"Czech:\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -383,239 +412,296 @@ msgstr ""
"æ·å
è¯ï¼\n"
"\t Pavel Fric <pavelfric at seznam.cz>\n"
-#: about.cc:210
+#: about.cc:220
msgid ""
"Norwegian:\n"
"\t Eivind ÃdegÃ¥rd\n"
msgstr ""
-"æªå¨è¯ï¼\n"
+"æªå¨è¯\n"
"\t Eivind ÃdegÃ¥rd\n"
-#: about.cc:211
+#: about.cc:221
msgid ""
"Chinese:\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
msgstr ""
"æ±è¯ï¼\n"
"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
+"\t ä¸åé±¼ YQ-YSY <yq-ysy at 163.com>\n"
+
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr "è±ç¹å° 64ä½"
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr "è±ç¹å° 32ä½"
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr "强åçµè 64ä½"
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr "强åçµè 32ä½"
-#: about.cc:591
+#: about.cc:609
+msgid "64-bit"
+msgstr "64ä½"
+
+#: about.cc:611
+msgid "32-bit"
+msgstr "32ä½"
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
msgid "Copyright (C) 1999-2015 Paul Davis\n"
msgstr "çæææ (C) 1999-2015 Paul Davis\n"
-#: about.cc:595
+#: about.cc:629
msgid "http://ardour.org/"
msgstr ""
-#: about.cc:596
+#: about.cc:630
msgid ""
"%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
msgstr ""
-"%1%2\n"
-"(修订èªçæ¬ %3)"
-#: about.cc:600
+#: about.cc:635
msgid "Config"
msgstr "é
ç½®"
-#: actions.cc:85
+#: actions.cc:83
msgid "Loading menus from %1"
-msgstr "æ£å¨è½½å
¥èå %1"
+msgstr "æ£å¨ä» %1 è½½å
¥èå"
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
msgid "badly formatted menu definition file: %1"
msgstr "带æéè¯¯æ ¼å¼çèåå®ä¹æä»¶ï¼ %1"
-#: actions.cc:91
+#: actions.cc:89
msgid "%1 menu definition file not found"
-msgstr "%1 èåå®ä¹æä»¶æªæ¾å°"
+msgstr "æ¾ä¸å° %1 èåå®ä¹æä»¶"
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
msgid "%1 will not work without a valid menu definition file"
msgstr "缺失ææçèåå®ä¹æä»¶å°å¯¼è´ %1 æ æ³å·¥ä½ã"
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "æ·»å é³è½¨ææ»çº¿"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
msgid "Configuration:"
-msgstr "é
ç½®:"
+msgstr "é
ç½®ï¼"
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
msgid "Record Mode:"
msgstr "å½å¶æ¨¡å¼ï¼"
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
msgid "Instrument:"
msgstr "ä¹å¨ï¼"
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
msgid "Audio Tracks"
msgstr "é³é¢è½¨é"
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
msgid "MIDI Tracks"
msgstr "MIDI 轨é"
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
msgid "Audio+MIDI Tracks"
msgstr "é³é¢+MIDI 轨é"
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "æ»çº¿"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "é³é¢æ»çº¿"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "MIDI æ»çº¿"
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+# åæ§æ¾å¤§å¨ Voltage Controlled Amplifier
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "VCA æä½å°"
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
msgid "First"
msgstr "èµ·å§ç¹"
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
-msgstr "å¨ç¼è¾å¨å·²éæ©é¨åä¹å"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "已鿩é¨åä¹å"
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr "卿··é³å¨å·²éæ©é¨åä¹å"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "已鿩é¨åä¹å"
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
msgid "Last"
msgstr "ç»æç¹"
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "å¼¹æ§-è¾å
¥/è¾åº"
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "精确-è¾å
¥/è¾åº"
+
+#: add_route_dialog.cc:108
msgid "Add:"
msgstr "æ·»å ï¼"
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
msgid "<b>Options</b>"
msgstr "<b>é项</b>"
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
msgid "Name:"
msgstr "åç§°ï¼"
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
msgid "Group:"
msgstr "åç»ï¼"
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
msgid "Insert:"
msgstr "æå
¥ï¼"
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "è¾åºç«¯å£ï¼"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"精确-è¾å
¥/è¾åºå¯ç¨åï¼ç¹æå¤çå¨å°ä¸ä¼æ¹å¨å¨ä¸ä¸ªé³è½¨ä¸ç声鿰éãè¾åºå£°éç"
+"æ°éå°æ»æ¯ä¸è¾å
¥å£°éçæ°éç¸å¹é
ã"
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
msgid "Audio"
msgstr "é³é¢"
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
msgid "MIDI"
-msgstr "MIDI"
+msgstr ""
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
msgid "Audio+MIDI"
-msgstr "Audio+MIDI"
+msgstr "é³é¢+MIDI"
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
msgid "Bus"
msgstr "æ»çº¿"
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
msgid ""
-"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use both "
-"audio and MIDI input data\n"
+"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
+"both audio and MIDI input data\n"
"\n"
-"If you do not plan to use such a plugin, then use a normal audio or MIDI track "
-"instead."
+"If you do not plan to use such a plugin, then use a normal audio or MIDI "
+"track instead."
msgstr ""
"é³é¢+MIDI 轨éå·²ç»åå¤å°±ç»ª ï¼<b>ä½ä»
éäº</b> 使ç¨é³é¢åMIDIè¾å
¥æ°æ®çæä»¶ã\n"
"\n"
"妿æ¨ä¸æç®ä½¿ç¨è¿æ ·ä¸ä¸ªæä»¶ï¼é£ä¹è¯·ä½¿ç¨æ®éçé³é¢æMIDI轨éä½ä¸ºæ¿ä»£ã"
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
msgid "Normal"
msgstr "æ®é"
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
msgid "Non Layered"
msgstr "ä¸åå±ç"
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
msgid "Tape"
msgstr "ç£å¸¦"
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
msgid "Mono"
msgstr "å声é"
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
msgid "Stereo"
msgstr "å声éç«ä½å£°"
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
msgid "3 Channel"
msgstr "ä¸å£°é"
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
msgid "4 Channel"
msgstr "å声é"
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
msgid "5 Channel"
msgstr "äºå£°é"
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
msgid "6 Channel"
msgstr "å
声é"
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
msgid "8 Channel"
msgstr "å
«å£°é"
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
msgid "12 Channel"
msgstr "åäºå£°é"
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
msgid "Custom"
msgstr "èªå®ä¹"
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
msgid "New Group..."
msgstr "æ°å»ºç¾¤ç»â¦"
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
msgid "No Group"
-msgstr "没æç¾¤ç»"
+msgstr "æ 群ç»"
#: ambiguous_file_dialog.cc:30
msgid "Ambiguous File"
msgstr "模ç³çæä»¶"
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
msgid ""
"%1 has found the file <i>%2</i> in the following places:\n"
"\n"
msgstr ""
-"%1 被åç°ä½äºæä»¶ <i>%2</i> ç以ä¸ä½ç½®ï¼\n"
+"%1 åç°æä»¶ <i>%2</i> ä½äºä»¥ä¸ä½ç½®ï¼\n"
"\n"
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
msgid ""
"\n"
"\n"
@@ -625,160 +711,230 @@ msgstr ""
"\n"
"è¯·éæ©æ¨æ³è·åçæä»¶æå¨çè·¯å¾ã"
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
msgid "Done"
msgstr "宿"
-#: analysis_window.cc:46
+#: analysis_window.cc:45
msgid "Signal source"
msgstr "ä¿¡å·æº"
-#: analysis_window.cc:47
+#: analysis_window.cc:46
msgid "Selected ranges"
-msgstr "éæ©èå´"
+msgstr "已鿩çèå´"
-#: analysis_window.cc:48
+#: analysis_window.cc:47
msgid "Selected regions"
-msgstr "éæ©åºå"
-
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "æ¾ç¤ºæ¨¡å¼"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "æ¯ä¸ªé³è½¨çåæå¾"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "ææé³è½¨çåæå¾"
+msgstr "已鿩çåºå"
-#: analysis_window.cc:54
+#: analysis_window.cc:48
msgid "Show frequency power range"
msgstr "æ¾ç¤ºé¢ççåçèå´"
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "è§èåæ°å¼"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr "éé
åè´èå´"
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr "æ¯éé¢è°± -18dB"
-#: analysis_window.cc:59
+#: analysis_window.cc:53
msgid "FFT analysis window"
-msgstr "FFT å¿«éå
ç«å¶åæ¢åæè§çª"
+msgstr "FFTï¼å¿«éå
ç«å¶åæ¢ï¼åæè§çª"
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
msgid "Spectral Analysis"
msgstr "é¢è°±åæ"
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
msgid "Track"
msgstr "é³è½¨"
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131 mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
msgid "Show"
msgstr "æ¾ç¤º"
-#: analysis_window.cc:135
+#: analysis_window.cc:107
msgid "Re-analyze data"
msgstr "éæ°åææ°æ®"
-#: ardour_button.cc:887
+#: ardour_button.cc:876
msgid "button cannot watch state of non-existing Controllable\n"
msgstr "æé®æ æ³æ¾ç¤ºä¸åå¨çææ§ç¶æ\n"
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+# è¶
ææ¬ä¼ è¾åè®®ï¼Hyper Text Transport Protocolï¼
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr "HTTP请æ±å¤±è´¥ï¼(%1) %2"
-#: ardour_ui.cc:164
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr "HTTP请æ±ç¶æï¼%1"
+
+#: ardour_ui.cc:198
msgid ""
"%1 %2.x has discovered configuration files from %1 %3.x.\n"
"\n"
-"Would you like to copy the relevant files before starting to use the program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
"\n"
"(This will require you to restart %1.)"
msgstr ""
"%1 %2.x åç°é
ç½®æä»¶æ¥æºäº %1 %3.x.\n"
"\n"
-"å¨å¯ç¨è¿ä¸ªç¨åºåï¼æ¨æç®å¤å¶å
³èæä»¶åï¼\n"
+"æ¨æç®å¤å¶è¿äºæä»¶å¹¶æä¾ç» %1 %2.x 使ç¨åï¼\n"
"\n"
"ï¼è¿å°éè¦ä½ éæ°å¯å¨ %1.ï¼"
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
msgid "Audition"
msgstr "çå¬"
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
msgid "Solo"
msgstr "ç¬å¥"
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
msgid "Feedback"
msgstr "åé¦"
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "æ¬å£°å¨é
ç½®"
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "æé®ç»å®"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "é¦é项"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
msgid "Add Tracks/Busses"
msgstr "æ·»å é³è½¨/æ»çº¿"
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
msgid "About"
msgstr "å
³äº"
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "ä½ç½®"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "èå´|ä½ç½®"
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
msgid "Tracks and Busses"
msgstr "é³è½¨åæ»çº¿"
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
msgid "Audio/MIDI Setup"
msgstr "é³é¢/MIDI设置"
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
msgid "Video Export Dialog"
msgstr "è§é¢å¯¼åºå¯¹è¯æ¡"
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "èæ¬ç®¡çå¨"
+
+#: ardour_ui.cc:304
msgid "Properties"
msgstr "屿§"
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "æ·»å è§é¢"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
msgid "Bundle Manager"
msgstr "å
裹管çå¨"
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
msgid "Big Clock"
-msgstr "Big Clock 大计æ¶å¨"
+msgstr "大计æ¶å¨"
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
msgid "Audio Connections"
msgstr "é³é¢è¿æ¥"
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
msgid "MIDI Connections"
-msgstr "MIDI è¿æ¥"
+msgstr "MIDIè¿æ¥"
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "ç»å®ç¼è¾å¨"
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr "çªå£|ç¼è¾å¨"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "çªå£|æ··é³å¨"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "çªå£|é¦é项"
+
+#: ardour_ui.cc:330
msgid "Your configuration files were copied. You can now restart %1."
-msgstr "æ¨çé
ç½®æä»¶å·²ç»å¤ä»½å®æãç°å¨å¯ä»¥éæ°å¯å¨ %1 ã"
+msgstr ""
+"Your configuration files were copied. æ¨çé
ç½®æä»¶å·²ç»å¤ä»½å®æãYou can now "
+"restart %1. æ¨ç°å¨å¯ä»¥éæ°å¯å¨ %1 ã"
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr "é¢åå¸è¦å"
-#: ardour_ui.cc:481
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+" though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+" making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+" can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+" http://ardour.org/support\n"
+msgstr ""
+"<b>欢è¿ä½¿ç¨é¢åå¸çæ¬ %1 %2</b>\n"
+"\n"
+"è¿ä¸ªçæ¬ä¹è®¸ä»æå å¤é®é¢åæ
ééè¦å®åï¼\n"
+"诸å¦å¨æ£å¼åå¸ä¹å对éç¨å·¥ä½æµç¨çæ¹è¿ã\n"
+"以䏿¯ä¸äºä½¿ç¨æåï¼\n"
+"\n"
+"1) ä½¿ç¨æ¬è½¯ä»¶æ¶è¯· <b>ä¸è¦</b> è¿äºææè¿ä¸ªçæ¬å¾ç¨³å®æå¾å¯é ã\n"
+" è½ç¶å®æå¯è½ä¼å´©æºï¼ä½è¿åå³äºæ¨ç工使µã\n"
+"2) 请èå¿çååå¸å
³äºæ°åè½çä»ç»ã\n"
+"3) <b>请ä¸è¦ä½¿ç¨ ardour.org çè®ºåæ¥æ¥åé误æ
éã</b>.\n"
+"4) <b>请使ç¨</b> ä½äº http://tracker.ardour.org/ çæ
éè¿½è¸ªå¨æ¥åé误æ
éã\n"
+" è®°ä½ï¼è¯·ç¡®è®¤äº§åçæ¬æ¯ 5.0-preã\n"
+"5) <b>请使ç¨</b> ardour-users ç¨æ·é®ä»¶å表æ¥åå¸å»ºè®®ä»¥åå表è¯è®ºã\n"
+"6) <b>请使ç¨</b> IRC è天室å å
¥æä»¬çå
³äº %1 %2 ç宿¶è®¨è®ºåºã\n"
+" æ¨å¯ä»¥éè¿ç¨åºèåé项éçâå¸®å© -> è天âç´æ¥è®¿é®å°ã\n"
+"\n"
+"è¿ææ´å¤çæ¯æä¿¡æ¯ï¼è¯·è®¿é®ç½é¡µï¼\n"
+"\n"
+" http://ardour.org/support\n"
+
+#: ardour_ui.cc:613
msgid ""
"The audio backend was shutdown because:\n"
"\n"
@@ -788,7 +944,7 @@ msgstr ""
"\n"
"%1"
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
msgid ""
"The audio backend has either been shutdown or it\n"
"disconnected %1 because %1\n"
@@ -797,49 +953,48 @@ msgid ""
msgstr ""
"é³é¢å端è¦ä¹å·²ç»å
³éï¼\n"
"è¦ä¹å®ä¸ %1 失å»äºè¿æ¥ï¼\n"
-"å 为 %1ä¸å¤å¿«ã\n"
+"å 为 %1 ä¸å¤å¿«ã\n"
"请å°è¯éæ°å¯å¨é³é¢å端并ä¿åä¼è¯ã"
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
msgid ""
-"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. Please see "
-"the log window for further details."
-msgstr "é³é¢åå
æä»¶æ«æå¤±è´¥ãèªå¨ AU æ«æå·²è¢«ç¦ç¨ã详æ
请åé
æ¥å¿çªå£ã"
+"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
+"Please see the log window for further details."
+msgstr "é³é¢åå
æä»¶æ«æå¤±è´¥ãèªå¨é³é¢åå
æ«æå·²è¢«ç¦ç¨ã详æ
请åé
æ¥å¿çªå£ã"
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
msgid "Audio Unit Plugin Scan Failed:"
msgstr "é³é¢åå
æä»¶æ«æå¤±è´¥ï¼"
-# NSM (network service manager)
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
msgid "NSM server did not announce itself"
-msgstr "NSMæå¡å¨æ²¡æè¡¨æèº«ä»½"
+msgstr "NSMï¼ç½ç»æå¡ç®¡çï¼æå¡å¨æ²¡æè¡¨æèº«ä»½"
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
msgid "NSM: no client ID provided"
-msgstr "NSMï¼æ²¡ææä¾å®¢æ·æºè¯å«å·"
+msgstr "NSMï¼ç½ç»æå¡ç®¡çï¼: 没ææä¾å®¢æ·æºè¯å«å·"
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
msgid "NSM: no session created"
-msgstr "NSMï¼æ²¡æå·²å建çä¼è¯"
+msgstr "NSMï¼ç½ç»æå¡ç®¡çï¼ï¼æ²¡æå·²å建çä¼è¯"
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
msgid "NSM: initialization failed"
-msgstr "NSMï¼åå§å失败"
+msgstr "NSMï¼ç½ç»æå¡ç®¡çï¼ï¼åå§å失败"
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
msgid "Free/Demo Version Warning"
msgstr "å
è´¹/æ¼ç¤ºçæ¬çè¦å"
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
msgid "Subscribe and support development of %1"
-msgstr "订é
忝æåå± %1"
+msgstr "宿æ´å©åèµå©åå± %1"
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
msgid "Don't warn me about this again"
msgstr "ä¸åæéæè¿ä¸ª"
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
msgid ""
"<span weight=\"bold\" size=\"large\">%1</span>\n"
"\n"
@@ -849,23 +1004,16 @@ msgid ""
"\n"
"%4"
msgstr ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
msgid "This is a free/demo version of %1"
-msgstr "è¿æ¯ä¸ä¸ªå
è´¹/æ¼ç¤ºçæ¬ %1"
+msgstr "è¿æ¯ %1 çä¸ä¸ªå
è´¹/æ¼ç¤ºçæ¬"
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
msgid "It will not restore OR save any plugin settings"
msgstr "å®ä¸ä¼æ¢å¤æä¿åä»»ä½æä»¶è®¾ç½®"
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
msgid ""
"If you load an existing session with plugin settings\n"
"they will not be used and will be lost."
@@ -873,55 +1021,56 @@ msgstr ""
"妿æ¨è½½å
¥ä¸ä¸ªå¸¦ææä»¶è®¾ç½®çå·²åå¨çä¼è¯\n"
"å®ä»¬å°ä¸ä¼è¢«éç¨å¹¶å°ä¼è¢«ä¸¢å¤±ã"
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
msgid ""
"To get full access to updates without this limitation\n"
"consider becoming a subscriber for a low cost every month."
msgstr ""
-"为äºä¸åè¿ä¸ªéå¶å°å级èå¾å°å®æ´ä½¿ç¨æï¼\n"
-"请èèä»¥æ¯ææä½çææ¬èæä¸ºä¸ä¸ªç¨æ·ã"
+"为äºè½å¤ä¸åè¿ä¸ªéå¶å°å级èå¾å°å®æ´ä½¿ç¨æï¼\n"
+"请èèä»¥æ¯ææä½çè±è´¹èæä¸ºä¸ä¸ªå®ææ´å©è
ã"
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
msgid "Quit now"
msgstr "ç«å³éåº"
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
msgid "Continue using %1"
msgstr "ç»§ç»ä½¿ç¨ %1"
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
msgid "%1 is ready for use"
msgstr "%1 åå¤å°±ç»ª"
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
msgid ""
-"WARNING: Your system has a limit for maximum amount of locked memory. This might "
-"cause %1 to run out of memory before your system runs out of memory. \n"
+"WARNING: Your system has a limit for maximum amount of locked memory. This "
+"might cause %1 to run out of memory before your system runs out of memory. \n"
"\n"
-"You can view the memory limit with 'ulimit -l', and it is normally controlled by %2"
+"You can view the memory limit with 'ulimit -l', and it is normally "
+"controlled by %2"
msgstr ""
-"è¦åï¼æ¨çç³»ç»æå¯¹äºéå®å
åçæå¤§æ°ééå¶ãè¿å¯è½ä¼å¨æ¨çç³»ç»èå°½å
åä¹åï¼é¦å
导"
-"è´ %1 æ å
åå¯ç¨ã\n"
+"è¦åï¼æ¨çç³»ç»æå¯¹äºéå®å
åçæå¤§æ°ééå¶ãè¿å¯è½ä¼å¨æ¨çç³»ç»èå°½å
åä¹åï¼"
+"é¦å
å¯¼è´ %1 æ å
åå¯ç¨ã\n"
"\n"
"æ¨å¯ä»¥ä½¿ç¨âulimit -lâå½ä»¤æ¥æ¥çå
åéå¶ï¼é常å®ç± %2 æ¥æ§å¶ã"
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
msgid "Do not show this window again"
msgstr "ä¸åæ¾ç¤ºæ¤çªå£"
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
msgid "Don't quit"
msgstr "ä¸éåº"
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
msgid "Just quit"
-msgstr "ä¸ä¿åèéåº"
+msgstr "åªç®¡éåº"
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
msgid "Save and quit"
msgstr "ä¿åå¹¶éåº"
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -933,13 +1082,13 @@ msgstr ""
"\n"
"妿æ¨ä»æç®éåºï¼\n"
"\n"
-"请å¯ç¨âä¸ä¿åèéåºâé项ã"
+"请使ç¨âåªç®¡éåºâé项ã"
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
msgid "Unsaved Session"
-msgstr " å°æªä¿åçä¼è¯"
+msgstr " æªä¿åçä¼è¯"
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -949,14 +1098,14 @@ msgid ""
"\n"
"What do you want to do?"
msgstr ""
-"æ¤ä¼è¯ \"%1\" å°æªä¿å.\n"
+"æ¤ä¼è¯ \"%1\" å°æªä¿åã\n"
"\n"
-"åææä½çä¿®æ¹å°ä¼ä¸¢å¤±\n"
+"åææä½çä»»ä½ä¿®æ¹é½å°ä¼ä¸¢å¤±ï¼\n"
"é¤éæ¨ä¿åå®ã\n"
"\n"
"æ¨æç®å¦ä½åï¼"
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -968,117 +1117,145 @@ msgid ""
msgstr ""
"æ¤å¿«ç
§ \"%1\" å°æªä¿åã\n"
"\n"
-"åææä½çä¿®æ¹å°ä¼ä¸¢å¤±\n"
+"åææä½çä»»ä½ä¿®æ¹é½å°ä¼ä¸¢å¤±ï¼\n"
"é¤éæ¨ä¿åå®ã\n"
"\n"
"æ¨æç®å¦ä½åï¼"
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
msgid "Prompter"
msgstr "æè¯æº"
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
msgid "Audio: <span foreground=\"red\">none</span>"
msgstr "é³é¢ï¼<span foreground=\"red\">æ </span>"
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
#, c-format
msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr "é³é¢ï¼ <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
+msgstr "é³é¢ï¼<span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
#, c-format
msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr "é³é¢ï¼<span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
+msgstr "é³é¢ï¼ <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
msgid "File:"
msgstr "æä»¶ï¼"
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
msgid "BWF"
msgstr ""
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
msgid "WAV"
msgstr ""
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
msgid "WAV64"
msgstr ""
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
msgid "CAF"
msgstr ""
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
msgid "AIFF"
msgstr ""
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
msgid "iXML"
msgstr ""
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
msgid "RF64"
msgstr ""
-#: ardour_ui.cc:1333
-msgid "32-float"
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
msgstr ""
-#: ardour_ui.cc:1336
-msgid "24-int"
+#: ardour_ui.cc:1521
+msgid "MBWF"
msgstr ""
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1529
+msgid "32-float"
+msgstr "32-æµ®ç¹"
+
+#: ardour_ui.cc:1532
+msgid "24-int"
+msgstr "24-æ´æ°"
+
+#: ardour_ui.cc:1535
msgid "16-int"
+msgstr "16-æ´æ°"
+
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
msgstr ""
-# DSP æ°åä¿¡å·å¤çå¨ï¼Digital Signal Processorï¼
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr "é³é¢æ¼°æºãæ Shift+ç¹å»éç½®"
+
+#: ardour_ui.cc:1577
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-msgstr "æ°åä¿¡å·å¤çå¨ï¼ <span foreground=\"%s\">%5.1f%%</span>"
+msgstr "DSPï¼æ°åä¿¡å·å¤çå¨ï¼ï¼ <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
#, c-format
msgid ""
-"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
+"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
msgstr ""
-"ç¼å²åºï¼ <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
+"ç¼å²åºï¼ <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "硬çï¼ <span foreground=\"green\">Unknown</span>"
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
-msgstr "硬çï¼<span foreground=\"green\">24hrs+</span>"
+msgstr "硬çï¼<span foreground=\"green\">24å°æ¶+</span>"
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
-msgstr "硬çï¼<span foreground=\"green\">>24 hrs</span>"
+msgstr "硬çï¼<span foreground=\"green\">>24å°æ¶</span>"
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-msgstr "硬çï¼<span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
+msgstr "硬çï¼<span foreground=\"%s\">%02då°æ¶:%02då:%02dç§</span>"
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "æ¶é´ç |TCï¼<span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318 session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "æè¿çä¼è¯"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
msgid ""
"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
@@ -1086,51 +1263,56 @@ msgstr ""
"%1 没æè¿æ¥å°ä»»ä½é³é¢å端ã\n"
"å¨è¿ç§æ
åµä¸æ¨ä¸è½æå¼æå
³éä¼è¯"
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
msgid "Open Session"
msgstr "æå¼ä¼è¯"
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
msgid "%1 sessions"
msgstr "%1 ä¼è¯"
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
msgid "You cannot add a track without a session already loaded."
-msgstr "卿²¡æä»»ä½ä¸ä¸ªä¼è¯è¢«è½½å
¥ä¹åï¼æ¨ä¸è½æ·»å é³è½¨ã"
+msgstr "å¨ä¼è¯è¢«è½½å
¥ä¹åï¼æ¨ä¸è½æ·»å é³è½¨ã"
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "æ æ³å建 %1 æ°çæ··é³è½¨é"
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"没æè¶³å¤å¯ç¨ç端å£\n"
-"å»å建ä¸ä¸ªæ°çé³è½¨ææ»çº¿ã\n"
-"æ¨åºå½ä¿å %1ï¼\n"
-"éåºå¹¶ä¸å¸¦çæ´å¤ç端å£éæ°å¯å¨ã"
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "æ æ³å建 %1 æ° MIDI æ»çº¿"
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
msgid "You cannot add a track or bus without a session already loaded."
-msgstr "卿²¡æä»»ä½ä¸ä¸ªä¼è¯è¢«è½½å
¥ä¹åï¼æ¨ä¸è½æ·»å é³è½¨ææ»çº¿ã"
+msgstr "å¨ä¼è¯è¢«è½½å
¥ä¹åï¼æ¨ä¸è½æ·»å é³è½¨ææ»çº¿ã"
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "æ æ³å建 %1 æ°çé³é¢è½¨é"
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "æ æ³å建 %1 æ°çé³é¢æ»çº¿"
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"没æè¶³å¤å¯ç¨ç端å£\n"
+"å»å建ä¸ä¸ªæ°çé³è½¨ææ»çº¿ã\n"
+"æ¨åºå½ä¿å %1ï¼\n"
+"éåºå¹¶ä¸å¸¦çæ´å¤ç端å£éæ°å¯å¨ã"
+
+#: ardour_ui.cc:2164
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1138,59 +1320,69 @@ msgstr ""
"å¨å½å¶ä¹å请å
åå»ºä¸æ¡æå¤æ¡é³è½¨ã\n"
"æ¨å¯ä»¥ä½¿ç¨ä¼è¯èåä¸çâæ·»å é³è½¨ææ»çº¿âé项æ¥å®ç°ã"
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "å¦å为â¦"
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "æ°å»ºå¿«ç
§çåç§°"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr "%<PRId64> ç %<PRId64> å·²å¤å¶"
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "çæå¿«ç
§"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "å¦å为"
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "æ°å»ºå¿«ç
§çåç§°"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr "Save As failed: %1 å¦å已失败ï¼%1"
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
msgstr ""
"为äºç¡®ä¿å¨ä¸åç³»ç»é´çå
¼å®¹æ§\n"
-"å¿«ç
§åç§°ä¸è½å
å«' % 1 'å符"
+"å¿«ç
§åç§°ä¸è½å
å« '%1' å符"
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
msgid "Confirm Snapshot Overwrite"
msgstr "ç¡®å®è¦çå¿«ç
§"
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
-msgstr "å·²åå¨ç¸ååç§°çå¿«ç
§ãæ¨æç®è¦çå®ï¼"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr "å·²åå¨ä¸ä¸ªç¸ååç§°çå¿«ç
§ãæ¨æç®è¦çå®ï¼"
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "è¦ç"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "å¿«ç
§å忢"
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "æ°å»ºä¼è¯çåç§°"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "çæå¿«ç
§"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "æ°å»ºå¿«ç
§çåç§°"
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
msgid "Rename Session"
msgstr "éå½åä¼è¯"
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
msgstr ""
"为äºç¡®ä¿å¨ä¸åç³»ç»é´çå
¼å®¹æ§\n"
-"ä¼è¯åç§°ä¸è½å
å«' % 1 'å符"
+"ä¼è¯åç§°ä¸è½å
å« '%1' å符"
-#: ardour_ui.cc:2478
-msgid "That name is already in use by another directory/folder. Please try again."
-msgstr "æ¤å称已被å¦ä¸ä¸ªç®å½/æä»¶å¤¹ä½¿ç¨ã 请åå°è¯å¦ä¸ä¸ªã"
+#: ardour_ui.cc:2798
+msgid ""
+"That name is already in use by another directory/folder. Please try again."
+msgstr "æ¤å称已被å¦ä¸ä¸ªç®å½/æä»¶å¤¹ä½¿ç¨ã请åå°è¯å¦ä¸ä¸ªã"
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1198,57 +1390,69 @@ msgstr ""
"éå½åä¼è¯å¤±è´¥.\n"
"ä»ç°å¨å¼å§äºæ
ççå°ä¼åå¾å¾éº»ç¦ã"
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr "确认è¦ç模æ¿"
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr "å·²åå¨ä¸ä¸ªç¸ååç§°çæ¨¡æ¿ãæ¨æç®è¦çå®ï¼"
+
+#: ardour_ui.cc:2948
msgid "Save Template"
-msgstr "ä¿å模æ¿..."
+msgstr "ä¿å模æ¿"
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
msgid "Name for template:"
msgstr "模æ¿å:"
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
msgid "-template"
msgstr "-模æ¿"
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
msgid ""
"This session\n"
"%1\n"
"already exists. Do you want to open it?"
msgstr ""
-"ä¼è¯\n"
+"æ¤ä¼è¯\n"
"%1\n"
-"å·²åå¨ãæ¯å¦ æå¼å®ï¼"
+"å·²åå¨ãæ¨æ¯å¦æç®æå¼å®ï¼"
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
msgid "Open Existing Session"
msgstr "æå¼å·²åå¨çä¼è¯"
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
msgid "There is no existing session at \"%1\""
msgstr "å¨ \"%1\" 没æä¼è¯æä»¶"
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
msgid "Please wait while %1 loads your session"
msgstr "请çå¾
%1 è½½å
¥æ¨çä¼è¯"
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
msgid "Port Registration Error"
msgstr "ç«¯å£æ³¨åé误"
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
msgid "Click the Close button to try again."
-msgstr "请åå»å
³éæé®ï¼åå°è¯ä¸é"
+msgstr "请åå»å
³éæé®ï¼åå°è¯ä¸éã"
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "ä¼è¯ \"%1 (å¿«ç
§ %2)\" è½½å
¥å¤±è´¥"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr "ä¼è¯ \"%1ï¼å¿«ç
§ %2ï¼\" è½½å
¥å¤±è´¥ï¼%3"
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
msgid "Loading Error"
msgstr "è½½å
¥é误"
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "ä¼è¯ \"%1ï¼å¿«ç
§ %2ï¼\" è½½å
¥å¤±è´¥"
+
+#: ardour_ui.cc:3475
msgid ""
"This session has been opened in read-only mode.\n"
"\n"
@@ -1258,24 +1462,59 @@ msgstr ""
"\n"
"æ¨ä¸è½å½å¶æè
ä¿åã"
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
msgid "Read-only Session"
msgstr "åªè¯»ä¼è¯"
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr "å¨ \"%1\" éæ æ³å建ä¼è¯ï¼%2"
+
+#: ardour_ui.cc:3556
msgid "Could not create session in \"%1\""
msgstr "å¨ \"%1\" æ æ³å建ä¼è¯"
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+"<b>åªç®¡æé®å¹¶çå¾
åçã\n"
+"è¿ä¹è®¸è¦è±å åéå°å å°æ¶ä¸çã</b>"
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr "å
³äºè天"
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+"彿¨è¿å
¥è天室åï¼åªéæåºæ¨çé®é¢ç¶åçå¾
åçå³å¯ãè天室éçäººé½æ¯çå®çæ´»"
+"åå¨çç人ï¼å æ¤ä»ä»¬ä¸ç许å¤äººä¸ä¸å®å¸¸å¸¸å¨çº¿ï¼ ä½ä»ä»¬æè¿ææ©é½å°ä¼çå°æ¨çé®"
+"é¢ã\n"
+"请èå¿çå¾
åçã\n"
+"\n"
+"æ¨å¯ä»¥å¼çè¿ä¸ªè天çªå£å»åå
¶å®äºæ
ï¼ç¶åæ¶ä¸æ¶åæ¥ççæ¯å¦æäººåçäºæ¨çé®"
+"é¢ã"
+
+#: ardour_ui.cc:3723
msgid "No files were ready for clean-up"
msgstr "没æå¯ä»¥æ¸
空çæä»¶"
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
msgid "Clean-up"
msgstr "æ¸
空"
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1284,22 +1523,22 @@ msgid ""
msgstr ""
"å¦æè¿æ
åµçèµ·æ¥æç¹å¼å¸¸ï¼\n"
"è¯·æ£æ¥ä»»ä½å·²åå¨çå¿«ç
§ã\n"
-"å®ä»¬ä¹è®¸ä»å
æ¬ææäºèå´\n"
-" éè¦ç»§ç»ä¿çæäºæªä½¿ç¨çæä»¶ã"
+"å®ä»¬ä¹è®¸ä»å
æ¬æé£äº\n"
+"éè¦ç»§ç»ä¿çæäºæªä½¿ç¨æä»¶çåºåã"
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
msgid "kilo"
msgstr "å"
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
msgid "mega"
msgstr "å
ï¼ç¾ä¸ï¼"
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
msgid "giga"
msgstr "å亿ï¼åå
ï¼"
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1310,7 +1549,7 @@ msgstr[0] ""
"ä»¥ä¸ %1 æä»¶è¢«ä» %2 å é¤ï¼\n"
"éæ¾ %3 %4 åèçç£ç空é´"
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1331,96 +1570,140 @@ msgid_plural ""
"will release an additional %3 %4bytes of disk space.\n"
msgstr[0] ""
"ä»¥ä¸ %1 æä»¶æªè¢«ä½¿ç¨\n"
-"å¹¶ä¸è¢«ç§»å¨å°ï¼ %2 \n"
+"å¹¶ä¸å·²è¢«ç§»å¨å°ï¼ %2 \n"
+"\n"
+"After a restart of %5 å¨éæ°å¯å¨ %5 ä¹å\n"
+"\n"
+"<span face=\"mono\">Session ä¼è¯ -> Clean-up æ¸
é¤ -> Flush Wastebasket æ¸
空å"
+"æ¶ç«</span>\n"
"\n"
+"will release an additional %3 %4bytes of disk space. å°ä¼éæ¾é¢å¤ç %3 %4 å"
+"è硬ç空é´ã\n"
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
msgid "Are you sure you want to clean-up?"
msgstr "æ¨ç¡®è®¤è¦æ¸
空ï¼"
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
"Clean-up will move all unused files to a \"dead\" location."
msgstr ""
-"æ¸
ç©ºæ¯æ¯çæ§çæä½ã\n"
+"æ¸
空æ¯ç ´åæ§çæä½ã\n"
"å¦æä½ æ¸
空äº, ææçæ¤é/éåä¿¡æ¯å°ä¼ä¸¢å¤±ã\n"
"æ¸
空å°ä¼ææææªä½¿ç¨è¿çæä»¶ç§»å¨å° \"æ»äº¡\" ä½ç½®ã"
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
msgid "CleanupDialog"
msgstr "æ¸
ç©ºå¯¹è¯æ¡"
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
msgid "Cleaned Files"
-msgstr "æ¸
餿件"
+msgstr "å·²æ¸
é¤çæä»¶"
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
msgid "deleted file"
-msgstr "å 餿件"
+msgstr "å·²å é¤çæä»¶"
+
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "æ æ³è¯»åä¼è¯èæ¬ '%1': %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr "è®¾ç½®èæ¬é¦é项"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "ä¼è¯èæ¬ '%1' å®ä¾åå¤±è´¥ï¼ %2"
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "è½½å
¥ä¼è¯èæ¬ '%1' 失败ï¼%2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "卿¬ä¼è¯ä¸æ²¡ææ´»å¨ç Lua ä¼è¯èæ¬åç°"
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "ä¼è¯èæ¬ '%1' ç§»é¤å¤±è´¥ï¼%2"
+
+#: ardour_ui.cc:4197
msgid "Video-Server was not launched by %1. The request to stop it is ignored."
-msgstr "è§é¢æå¡å¨æªè¢« %1 触åã请æ±åæ¢è§é¢æå¡å¨çè¦æ±è¢«å¿½ç¥ã"
+msgstr "è§é¢æå¡å¨æªè¢« %1 触åã请æ±åæ¢è§é¢æå¡å¨çè¦æ±å·²è¢«å¿½ç¥ã"
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
msgid "Stop Video-Server"
msgstr "忢è§é¢æå¡å¨"
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
msgid "Do you really want to stop the Video Server?"
msgstr "æ¨ççæç®åæ¢è§é¢æå¡å¨ï¼"
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
msgid "Yes, Stop It"
msgstr "æ¯çï¼åæ¢å®"
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
msgid "The Video Server is already started."
msgstr "è§é¢æå¡å¨å·²ç»å¯å¨ã"
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
msgid ""
-"An external Video Server is configured and can be reached. Not starting a new "
-"instance."
-msgstr "ä¸ä¸ªå¤é¨è§é¢æå¡å¨å·²ç»é
ç½®ä¸å¯ä»¥å®ç°ãå°æªå¯å¨ä¸ä¸ªæ°çå®ä¾ã"
+"An external Video Server is configured and can be reached. Not starting a "
+"new instance."
+msgstr "ä¸ä¸ªå¤é¨è§é¢æå¡å¨å·²ç»é
ç½®ä¸å¯ä»¥è®¿é®å°ãå°æªå¯å¨ä¸ä¸ªæ°çå®ä¾ã"
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
msgid ""
-"Could not connect to the Video Server. Start it or configure its access URL in "
-"Preferences."
-msgstr "æ æ³è¿æ¥å°è§é¢æå¡å¨ã请å¯å¨æè
é
ç½®è§é¢æå¡å¨ç访é®URLç½åé¦é项ã"
+"Could not connect to the Video Server. Start it or configure its access URL "
+"in Preferences."
+msgstr ""
+"æ æ³è¿æ¥å°è§é¢æå¡å¨ã请å¯å¨è§é¢æå¡å¨æè
é
ç½®è§é¢æå¡å¨é¦é项éç访é®ç½åã"
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
msgid "Specified docroot is not an existing directory."
-msgstr "æå®çææ¡£æ ¹ç®å½ä¸åå¨ã"
+msgstr "æå®çææ¡£æ ¹ä¸æ¯ä¸ä¸ªå·²åå¨çç®å½ã"
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
msgid "Given Video Server is not an executable file."
msgstr "ç»å®çè§é¢æå¡å¨ä¸æ¯ä¸ä¸ªå¯æ§è¡æä»¶ã"
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
msgid "Cannot launch the video-server"
msgstr "æ æ³å¯å¨è§é¢æå¡å¨"
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
msgid "Video-server was started but does not respond to requests..."
-msgstr "è§é¢æå¡å¨å·²ç»å¯å¨ä½æ²¡æååºè¯·æ±â¦â¦"
+msgstr "è§é¢æå¡å¨å·²ç»å¯å¨ä½æ²¡æååºè¯·æ±â¦"
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
msgid "could not open %1"
-msgstr "æ æ³æå¼%1"
+msgstr "æ æ³æå¼ %1"
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
msgid "no video-file selected"
msgstr "å°æªéæ©è§é¢æä»¶"
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr "æ£æµä¸å° LTCï¼çºµåæ¶é´ç ï¼ï¼è§é¢å°æ æ³å¯¹é½ã"
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr "对é½è§é¢èµ·ç¹å° %1 [æ ·æ¬]"
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
msgid "Recording was stopped because your system could not keep up."
-msgstr "ç±äºæ¨çç³»ç»æ æ³ç»§ç»å·¥ä½å¯¼è´å½å¶åæ¢ã"
+msgstr "å½å¶åæ¢ï¼å 为æ¨çç³»ç»æ æ³æç»è·è¿ã"
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1434,23 +1717,23 @@ msgstr ""
"ç¡®åå°è¯´ï¼å¤±è´¥çåå æ¯ç¡¬ççåå
¥é度\n"
"ä¸è¶³ä»¥æç»è·ä¸å½å¶çé度ã\n"
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
msgid "Scanning for plugins"
msgstr "æ£å¨æ«ææä»¶"
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
msgid "Cancel plugin scan"
msgstr "åæ¶æä»¶æ«æ"
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
msgid "Stop Timeout"
msgstr "忢è¶
æ¶"
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
msgid "Scan Timeout"
msgstr "æ«æè¶
æ¶"
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1464,11 +1747,11 @@ msgstr ""
"ç¡®åå°è¯´ï¼å¤±è´¥çåå æ¯ç¡¬çç读åé度\n"
"ä¸è¶³ä»¥æç»è·ä¸åæ¾çé度ã\n"
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
msgid "Crash Recovery"
msgstr "å´©æºæ¢å¤"
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1479,26 +1762,26 @@ msgid ""
"what you would like to do.\n"
msgstr ""
"æ¬ä¼è¯ä¼¼ä¹æ¯ä¸ç´å¤å¨\n"
-"å½å¶ç䏿®µï¼å½ %1 æ¶\n"
-"æè
å¨è®¡ç®æºå
³éæ¶ã\n"
+"å½å¶ç䏿®µï¼\n"
+"å½ %1 æè
è®¡ç®æºå
³éæ¶ã\n"
"\n"
" %1 å¯ä»¥ä¸ºæ¨æ¢å¤ä»»ä½å·²æè·çé³é¢ï¼\n"
"æè
忽ç¥å®ã\n"
-"请确认æ¨çå³å®ã\n"
+"è¯·ç¡®è®¤æ¨æç®åä»ä¹ã\n"
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
msgid "Ignore crash data"
msgstr "忽ç¥å´©æºçæ°æ®"
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
msgid "Recover from crash"
msgstr "æ¢å¤å°å´©æºå"
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
msgid "Sample Rate Mismatch"
msgstr "éæ ·çä¸å¹é
"
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1508,23 +1791,29 @@ msgstr ""
"使¯ %2 ç®åè¿è¡å¨ %3 Hzã妿æ¨å è½½è¿ä¸ªä¼è¯ï¼\n"
"é³é¢å¯è½ä¼å¤å¨é误çéæ ·ç䏿æ¾ã\n"
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
msgid "Do not load session"
msgstr "ä¸è¦è½½å
¥ä¼è¯"
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
msgid "Load session anyway"
msgstr "åªç®¡è½½å
¥ä¼è¯"
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "æ æ³ä»é³é¢/MIDI弿ä¸åæ¶è¿æ¥"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "æ æ³éæ°è¿æ¥å°é³é¢/MIDI弿"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"æ¬ä¼è¯åå»ºäº %1 Hz çéæ ·çï¼\n"
+"ä½ %2 å½åè¿è¡äº %3 Hzã\n"
+"é³é¢å°è¢«å½å¶ååæ¾äºé误çéæ ·çã\n"
+"éæ°é
ç½®é³é¢å¼æè¯·ç¹å»èå\n"
+"èå > çªå£ > é³é¢/Midi设置"
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1536,61 +1825,86 @@ msgid ""
"\n"
"%6%2%7\n"
"\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
msgstr ""
-"%4 è¿æ¯ä¸ä¸ªæ¥æºäº %3%5 æ§çæ¬çä¼è¯\n"
+"%4è¿æ¯ä¸ªæ¥èª %3%5 æ§çæ¬çä¼è¯\n"
"\n"
-"%3 å·²ç»è¢«å¤å¶å°æ§çä¼è¯æä»¶\n"
+"%3 å·²ç»å¤å¶æ§ä¼è¯æä»¶\n"
"\n"
"%6%1%7\n"
"\n"
-"to\n"
+"å°\n"
"\n"
"%6%2%7\n"
"\n"
-"ä»ç°å¨å¼å§ï¼ä½¿ç¨è¿å¸¦æ§ç %3 ç -2000 çæ¬"
+"ä»ç°å¨å¼å§ï¼ä½¿ç¨ %3 çæ§çæ¬å¤ä»½å¯æ¬"
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "ç¨æ·çé¢ï¼æ æ³è®¾ç½®ç¼è¾å¨"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr "è¿æ¯ %1 çä¸ä¸ªå
è´¹/æ¼ç¤ºå¯æ¬ãå®ä»
è½åæ¢å°æ 声模å¼ã"
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "ç¨æ·çé¢ï¼æ æ³è®¾ç½®æ··é³å¨"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr "%1 ç°å¨æ 声"
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "ç¨æ·çé¢ï¼æ æ³è®¾ç½®èææ¡¥æ¥"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr "请èè为 %1 ä»è´¹è´ä¹°ä¸ä¸ªå¯æ¬ - æ¨å¯ä»¥æ¯ä»ä»»æéé¢ã"
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr "æå¥½æ¯æä¸ºå®æèµå©è
- æç®çèµ·ç¹æ¯æ¯ä¸ªæä¸ç¾å
ã"
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr "ä»è´¹è´ä¹°ä¸ä¸ªå¯æ¬ï¼éè¿ç½ç»ï¼"
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr "æä¸ºå®æèµå©è
ï¼éè¿ç½ç»ï¼"
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr "ä¿ææ 声"
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr "ç»ææ´å¤çæ¶é´"
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr "缺失å
¨å±æé®ç»å®"
+
+#: ardour_ui2.cc:79
msgid "Play from playhead"
msgstr "仿éå¼å§ææ¾"
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
msgid "Stop playback"
msgstr "忢忾"
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
msgid "Toggle record"
msgstr "忢å½å¶"
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
msgid "Play range/selection"
msgstr "ææ¾èå´/已鿩é¨å"
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
msgid "Go to start of session"
msgstr "转è³ä¼è¯èµ·ç¹"
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
msgid "Go to end of session"
msgstr "转è³ä¼è¯ç»ç¹"
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
msgid "Play loop range"
msgstr "ææ¾å¾ªç¯èå´"
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
msgid ""
"MIDI Panic\n"
"Send note off and reset controller messages on all MIDI channels"
@@ -1598,511 +1912,622 @@ msgstr ""
"MIDI ç»æ¢\n"
"åéé³ç¬¦å
³éåå¤ä½æ§å¶å¨ä¿¡æ¯å°ææ MIDI éé"
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
msgid "Return to last playback start when stopped"
msgstr "å½åæ¢æ¶è¿åè³æå䏿¬¡åæ¾çèµ·ç¹"
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
msgstr "æéè·éèå´å·²éæ©é¨åå¹¶ç¼è¾"
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
msgid "Be sensible about input monitoring"
msgstr "ç¡®ä¿æ¸
æ°çè¾å
¥çæ§"
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
msgid "Enable/Disable audio click"
msgstr "å¯ç¨/ç¦ç¨é³é¢è¯å«å£°ï¼èæå¨ï¼ "
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
msgid ""
"When active, something is soloed.\n"
"Click to de-solo everything"
msgstr ""
"å¯ç¨æ¶ï¼ä»
ç¬å¥æé¨åã\n"
-"Click to de-solo everything ç¹å»å
¨é¨ä¸ç¬å¥"
+"ç¹å»å
¨é¨ä¸ç¬å¥"
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
"Click to stop the audition"
msgstr ""
-"å½å¯ç¨æ¶çå¬å¼å§.\n"
-"ç¹å»åæ¢çå¬."
+"å¯ç¨æ¶ï¼çå¬å°±ç»ªã\n"
+"ç¹å»åæ¢çå¬"
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
msgid "When active, there is a feedback loop."
-msgstr "å¯ç¨æ¶ï¼æä¸ä¸ªåé¦åè·¯ã"
+msgstr "å¯ç¨æ¶ï¼è¿æ¯ä¸ä¸ªåé¦å¾ªç¯ã"
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
msgid ""
-"<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a "
-"digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
+"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-"<b>主计æ¶å¨</b>å³é®ç¹å»è®¾ç½®æ¾ç¤ºæ¨¡å¼ãç¹å»å³å¯ç¼è¾ï¼ç¹å»+æå¨æ°åæè
é¼ æ æ¾å¨æ°åä¸"
-"颿»å¨æ»è½®å³å¯ä¿®æ¹æ°åã\n"
-"ææ¬ç¼è¾ï¼ä»å³å°å·¦è¦ç <tt>Esc é®</tt>ï¼åæ¶ï¼ <tt>å车é®</tt>ï¼ç¡®è®¤ï¼ç¼è¾åå "
-"ä¸â+âå·æè
â-âå·å³å¯è¿å
¥ä¸ä¸çº§æ¶é´\n"
+"<b>主计æ¶å¨</b>å³é®ç¹å»è®¾ç½®æ¾ç¤ºæ¨¡å¼ãç¹å»å³å¯ç¼è¾ï¼ç¹å»+æå¨æ°åæè
é¼ æ æ¾å¨"
+"æ°åä¸é¢æ»å¨æ»è½®å³å¯ä¿®æ¹æ°åã\n"
+"ææ¬ç¼è¾ï¼ä»å³å°å·¦è¦ç <tt>Esc é®</tt>ï¼åæ¶ï¼ <tt>å车é®</tt>ï¼ç¡®è®¤ï¼ç¼è¾å"
+"å ä¸â+âå·æè
â-âå·å³å¯è¿å
¥ä¸ä¸çº§æ¶é´ã\n"
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
msgid ""
-"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag "
-"a digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
+"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
msgstr ""
-"<b>第äºè®¡æ¶å¨</b>å³é®ç¹å»è®¾ç½®æ¾ç¤ºæ¨¡å¼ãç¹å»å³å¯ç¼è¾ï¼ç¹å»+æå¨æ°åæè
é¼ æ æ¾å¨æ°å"
-"ä¸é¢æ»å¨æ»è½®å³å¯ä¿®æ¹æ°åã\n"
-"ææ¬ç¼è¾ï¼ä»å³å°å·¦è¦ç <tt>Esc é®</tt>ï¼åæ¶ï¼ <tt>å车é®</tt>ï¼ç¡®è®¤ï¼ç¼è¾åå "
-"ä¸â+âå·æè
â-âå·å³å¯è¿å
¥ä¸ä¸çº§æ¶é´\n"
+"<b>第äºè®¡æ¶å¨</b>å³é®ç¹å»è®¾ç½®æ¾ç¤ºæ¨¡å¼ãç¹å»å³å¯ç¼è¾ï¼ç¹å»+æå¨æ°åæè
é¼ æ æ¾"
+"卿°åä¸é¢æ»å¨æ»è½®å³å¯ä¿®æ¹æ°åã\n"
+"ææ¬ç¼è¾ï¼ä»å³å°å·¦è¦ç <tt>Esc é®</tt>ï¼åæ¶ï¼ <tt>å车é®</tt>ï¼ç¡®è®¤ï¼ç¼è¾å"
+"å ä¸â+âå·æè
â-âå·å³å¯è¿å
¥ä¸ä¸çº§æ¶é´ã\n"
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
msgid "Reset All Peak Indicators"
msgstr "éç½®ææå³°å¼ææ "
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
msgid "Show Error Log and acknowledge warnings"
msgstr "æ¾ç¤ºé误æ¥å¿å¹¶ç¡®è®¤è¦æ¥"
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
msgid "[ERROR]: "
-msgstr "ãé误ãï¼"
+msgstr "[é误]ï¼"
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
msgid "[WARNING]: "
-msgstr "ãè¦åãï¼"
+msgstr "[è¦å]ï¼"
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
msgid "[INFO]: "
-msgstr "ãä¿¡æ¯ãï¼"
+msgstr "[ä¿¡æ¯]ï¼"
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
msgid "Auto Return"
msgstr "èªå¨è¿å"
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
msgid "Follow Edits"
msgstr "è·éç¼è¾"
-# GUI - Graphical User Interface
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+"ææ½è¿ä¸ªæ ç¾é¡µå°æ¡é¢å³å¯è®© %1 以ç¬ç«çªå£æ¾ç¤º\n"
+"\n"
+"è¥è¦æçªå£æ¾ååä½ï¼ä½¿ç¨èåæ ç çªå£ > %1 > éå èåæä½"
+
+#: ardour_ui2.cc:638
msgid "GUI"
-msgstr "å¾å½¢ç¨æ·çé¢"
-
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399 session_option_editor.cc:321
-#: session_option_editor.cc:323 session_option_editor.cc:344
-#: session_option_editor.cc:346 session_option_editor.cc:348
-#: session_option_editor.cc:355 session_option_editor.cc:362
-#: session_option_editor.cc:366
+msgstr "GUIï¼å¾å½¢ç¨æ·çé¢ï¼"
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
msgid "Misc"
msgstr "æé¡¹"
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
msgid "Setup Editor"
msgstr "设置ç¼è¾å¨"
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
msgid "Setup Mixer"
msgstr "设置混é³å¨"
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
msgid "Reload Session History"
-msgstr "éæ°è£
æä¼è¯åå²"
+msgstr "éæ°è½½å
¥ä¼è¯åå²"
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UIï¼ç¨æ·çé¢ï¼ï¼æ æ³è®¾ç½®ç¼è¾å¨"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UIï¼ç¨æ·çé¢ï¼ï¼æ æ³è®¾ç½®æ··é³å¨"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UIï¼ç¨æ·çé¢ï¼ï¼æ æ³è®¾ç½®èææ¡¥æ¥"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr "UIï¼ç¨æ·çé¢ï¼ï¼æ æ³è®¾ç½® lua çªå£"
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "é¦é项"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "æ··é³å¨"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "ç¼è¾å¨"
+
+#: ardour_ui_dialogs.cc:263
msgid "Don't close"
-msgstr "请å¿å
³é"
+msgstr "ä¸å
³é"
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
msgid "Just close"
msgstr "åªç®¡å
³é"
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
msgid "Save and close"
msgstr "ä¿åå¹¶å
³é"
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "è¿ä¸ªå±å¹çé«åº¦ä¸è¶³ä»¥æ¾ç¤ºæ··é³å¨çªå£"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr "åæ¶"
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
msgid "Session"
msgstr "ä¼è¯"
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116 port_group.cc:458
-#: session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "忥"
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
msgid "Options"
msgstr "é项"
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
msgid "Window"
msgstr "çªå£"
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "å离"
+
+#: ardour_ui_ed.cc:138
msgid "Help"
msgstr "帮å©"
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
msgid "Misc. Shortcuts"
-msgstr "æé¡¹ã å¿«æ·é®"
+msgstr "æé¡¹. å¿«æ·é®"
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
msgid "Audio File Format"
msgstr "é³é¢æä»¶æ ¼å¼"
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
msgid "File Type"
msgstr "æä»¶ç±»å"
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
msgid "Sample Format"
-msgstr "éæ ·æ ¼å¼"
+msgstr "æ ·æ¬æ ¼å¼"
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
msgid "Control Surfaces"
msgstr "æ§å¶é¢"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
msgid "Plugins"
msgstr "æä»¶"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
msgid "Metering"
-msgstr "èæ"
+msgstr "计é"
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
msgid "Fall Off Rate"
msgstr "è¡°åç"
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
msgid "Hold Time"
msgstr "æç»æ¶é´"
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
msgid "Denormal Handling"
-msgstr "é常è§å¤ç"
+msgstr "é常è§å¤çä¸"
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
msgid "New..."
msgstr "æ°å»ºâ¦"
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
msgid "Open..."
msgstr "æå¼â¦"
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
msgid "Recent..."
msgstr "æè¿çâ¦"
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
msgid "Close"
msgstr "å
³é"
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
msgid "Add Track or Bus..."
msgstr "æ·»å é³è½¨ææ»çº¿â¦"
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "æå¼è§é¢"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "å¤å¶é³è½¨ææ»çº¿â¦"
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr "åæ¶ç¬å¥"
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "ä¼è¯|èæ¬"
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "æ·»å Lua èæ¬â¦"
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "ç§»é¤ Lua èæ¬"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "æå¼è§é¢â¦"
+
+#: ardour_ui_ed.cc:187
msgid "Remove Video"
msgstr "ç§»é¤è§é¢"
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "导åºä¸ºè§é¢æä»¶"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "导åºå°è§é¢æä»¶â¦"
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "å¿«ç
§ï¼å¹¶ä¸ç»§ç»å¨å½åçæ¬å·¥ä½ï¼â¦"
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "å¿«ç
§â¦"
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr "å¿«ç
§ï¼å¹¶ä¸åæ¢å°æ°çæ¬ï¼â¦"
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr "å¿«éå¿«ç
§ (å¹¶ä¿æå·¥ä½å¨å½åçæ¬)â¦"
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr "å¿«éå¿«ç
§ï¼å¹¶ä¸åæ¢å°æ°çæ¬ï¼â¦"
+
+#: ardour_ui_ed.cc:207
msgid "Save As..."
msgstr "å¦å为â¦"
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
msgid "Rename..."
msgstr "éå½åâ¦"
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
msgid "Save Template..."
msgstr "ä¿å模æ¿â¦"
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
msgid "Metadata"
msgstr "å
æ°æ®"
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
msgid "Edit Metadata..."
msgstr "ç¼è¾å
æ°æ®â¦"
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
msgid "Import Metadata..."
msgstr "导å
¥å
æ°æ®â¦"
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
msgstr "导åºä¸ºé³é¢æä»¶â¦"
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
msgid "Stem export..."
msgstr "主ä½å¯¼åºâ¦"
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:136
+#: export_video_dialog.cc:80
msgid "Export"
msgstr "导åº"
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
msgid "Clean-up Unused Sources..."
msgstr "æ¸
空æªä½¿ç¨çæºâ¦"
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr "éç½®å³°å¼æä»¶"
+
+#: ardour_ui_ed.cc:243
msgid "Flush Wastebasket"
msgstr "æ¸
ç©ºåæ¶ç«"
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
msgid "Quit"
msgstr "éåº"
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "éè"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "éå "
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "æ¹å"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "ä¸ä¸ä¸ªæ ç¾é¡µ"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "ä¸ä¸ä¸ªæ ç¾é¡µ"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "忢ç¼è¾å¨åæ··é³å¨"
+
+#: ardour_ui_ed.cc:294
msgid "Maximise Editor Space"
msgstr "æå¤§åç¼è¾å¨ç©ºé´"
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
msgid "Maximise Mixer Space"
msgstr "æå¤§åæ··é³å¨ç©ºé´"
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "æ¾ç¤ºå·¥å
·æ "
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr "åæ¢æ··é³å¨å表"
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
-msgstr "æ¾ç¤ºæ´å¤ç¨æ·çé¢é¦é项"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr "Toggle Monitor Section Visibility åæ¢çæ§é¨åå¯è§"
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "çªå£|æ··é³å¨"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
+msgstr "æ¾ç¤ºæ´å¤UIï¼ç¨æ·çé¢ï¼é¦é项"
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "忢ç¼è¾å¨+æ··é³å¨"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "çªå£|èæ¬"
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
msgid "Window|Meterbridge"
msgstr "çªå£|èææ¡¥æ¥"
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "éæ°éå ææççæ®µ"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
msgid "MIDI Tracer"
-msgstr "MIDI é³è½¨"
+msgstr "MIDI 追踪å¨"
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
msgid "Chat"
msgstr "è天"
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
msgid "Help|Manual"
msgstr "帮å©|æå"
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "åè"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr "æå|åè"
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr "æ¥åæ
é"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr "æ¥åä¸ä¸ªæ
é"
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
msgid "Cheat Sheet"
msgstr "å¤å¿å½"
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
msgid "Ardour Website"
msgstr "Ardour å®ç½"
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
msgid "Ardour Development"
msgstr "Ardour å¼å "
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
msgid "User Forums"
msgstr "ç¨æ·è®ºå"
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr "å¦ä½æ¥åæ
é"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr "å¦ä½æ¥åä¸ä¸ªæ
é"
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
msgid "Save"
msgstr "ä¿å"
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
msgid "Transport"
msgstr "æé"
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
msgid "Stop"
msgstr "忢"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
msgid "Roll"
msgstr "æ»å¨"
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
msgid "Start/Stop"
msgstr "å¼å§/忢"
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
msgid "Start/Continue/Stop"
msgstr "å¼å§/ç»§ç»/忢"
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
msgid "Stop and Forget Capture"
msgstr "æåå¹¶ä¸åºå¼å·²æè·å
容"
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
msgstr "è¿æ¸¡å°æ»å¨"
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
msgstr "è¿æ¸¡å°åå"
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
msgid "Play Loop Range"
msgstr "å¾ªç¯ææ¾èå´"
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
msgid "Play Selection"
msgstr "ææ¾å·²éæ©é¨å"
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
msgid "Play Selection w/Preroll"
msgstr "ææ¾å·²éæ©é¨å颿»"
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
msgid "Enable Record"
msgstr "å¯ç¨å½å¶"
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
msgid "Start Recording"
-msgstr "å¼å§å½å¶"
+msgstr "å¼å§å½å¶ä¸"
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
msgid "Rewind"
msgstr "å带"
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
msgid "Rewind (Slow)"
msgstr "åå¸¦ï¼æ
¢éï¼"
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
msgid "Rewind (Fast)"
msgstr "å带ï¼å¿«éï¼"
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
msgid "Forward"
msgstr "å¿«è¿"
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
msgid "Forward (Slow)"
msgstr "å¿«è¿ï¼æ
¢éï¼"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
msgid "Forward (Fast)"
msgstr "å¿«è¿ï¼å¿«éï¼"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
msgid "Go to Zero"
-msgstr "转å°é¶ç¹"
+msgstr "转è³é¶ç¹"
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
msgid "Go to Start"
-msgstr "转å°èµ·å§ä½ç½®"
+msgstr "转è³èµ·ç¹"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
msgid "Go to End"
-msgstr "è½¬å°æ«å°¾ä½ç½®"
+msgstr "转è³ç»ç¹"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
msgid "Go to Wall Clock"
-msgstr "转å°è®¡æ¶ç¹"
+msgstr "转è³è®¡æ¶ç¹"
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
msgid "Numpad Decimal"
msgstr "æ°åé®çåè¿å¶"
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
msgid "Numpad 0"
msgstr "æ°åé®ç 0"
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
msgid "Numpad 1"
msgstr "æ°åé®ç 1"
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
msgid "Numpad 2"
msgstr "æ°åé®ç 2"
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
msgid "Numpad 3"
msgstr "æ°åé®ç 3"
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
msgid "Numpad 4"
msgstr "æ°åé®ç 4"
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
msgid "Numpad 5"
msgstr "æ°åé®ç 5"
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
msgid "Numpad 6"
msgstr "æ°åé®ç 6"
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
msgid "Numpad 7"
msgstr "æ°åé®ç 7"
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
msgid "Numpad 8"
msgstr "æ°åé®ç 8"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
msgid "Numpad 9"
msgstr "æ°åé®ç 9"
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
msgid "Focus On Clock"
msgstr "èç¦äºè®¡æ¶å¨"
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
#: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2110,125 +2535,137 @@ msgstr "èç¦äºè®¡æ¶å¨"
msgid "Timecode"
msgstr "æ¶é´ç "
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
msgid "Bars & Beats"
msgstr "å°è & æå"
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
msgid "Minutes & Seconds"
-msgstr "å&ç§"
+msgstr "å & ç§"
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
msgid "Samples"
-msgstr "éæ ·"
+msgstr "æ ·æ¬"
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
msgid "Punch In"
msgstr "åå
¥"
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843 mixer_strip.cc:2007
-#: route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:187
+#: time_info_box.cc:110
msgid "In"
msgstr "å
¥"
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
msgid "Punch Out"
msgstr "ååº"
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
msgid "Out"
msgstr "åº"
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
msgid "Punch In/Out"
msgstr "åå
¥/ååº"
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
msgid "In/Out"
msgstr "å
¥/åº"
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
msgid "Click"
-msgstr "ç¹å»"
+msgstr "è¯å«å£°ï¼èæå¨ï¼"
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
msgid "Auto Input"
msgstr "èªå¨è¾å
¥"
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
msgid "Auto Play"
msgstr "èªå¨ææ¾"
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
msgid "Sync Startup to Video"
msgstr "忥å¯å¨å°è§é¢"
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
msgid "Time Master"
msgstr "计æ¶å¨ä¸»æ§"
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr "使ç¨å¤é¨ä½ç½®åæ¥æº"
+
+#: ardour_ui_ed.cc:526
msgid "Toggle Record Enable Track %1"
msgstr "忢å½å¶å¯ç¨é³è½¨ %1"
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
msgid "Percentage"
msgstr "ç¾åæ¯"
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
msgid "Semitones"
msgstr "åé³"
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
msgid "Send MTC"
-msgstr "åéMTC"
+msgstr "åé端 MTCï¼MIDIæ¶é´ç ï¼"
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
msgid "Send MMC"
-msgstr "åéMMC"
+msgstr "åé端 MMCï¼MIDIæ¶é´æ§å¶ï¼"
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
msgid "Use MMC"
-msgstr "使ç¨MMC"
+msgstr "使ç¨ï¼MIDIæ¶é´æ§å¶ï¼"
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
msgid "Send MIDI Clock"
-msgstr "åéMIDI计æ¶å¨"
+msgstr "åé端 MIDI 计æ¶å¨"
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
msgid "Send MIDI Feedback"
-msgstr "åéMIDIåé¦"
+msgstr "åé端 MIDI åé¦"
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
msgid "Panic"
msgstr "ç»æ¢"
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:618
msgid "Wall Clock"
msgstr "计æ¶ç¹"
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:620
msgid "Disk Space"
msgstr "硬ç空é´"
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:621
msgid "DSP"
-msgstr "æ°åä¿¡å·å¤ç"
+msgstr "DSPï¼æ°åä¿¡å·å¤çï¼"
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr "X-runï¼X-è¿è¡ï¼"
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr "æ¿æ´»å³°å¼æä»¶å·¥ä½"
+
+#: ardour_ui_ed.cc:624
msgid "Buffers"
msgstr "ç¼å²"
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:626
msgid "Timecode Format"
-msgstr " æ¶é´ç æ ¼å¼"
+msgstr "æ¶é´ç æ ¼å¼"
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:627
msgid "File Format"
msgstr "æä»¶æ ¼å¼"
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
msgid ""
"It is not possible to use JACK as the the sync source\n"
"when the pull up/down setting is non-zero."
@@ -2236,133 +2673,142 @@ msgstr ""
"彿å¨ä¸/ä¸ç设置为éé¶æ¶ï¼\n"
"ä¸å¯è½ä½¿ç¨JACKä½ä¸ºåæ¥æºã"
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
msgid "Internal"
msgstr "å
é¨ç"
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
msgid "Enable/Disable external positional sync"
msgstr "å¯ç¨/ç¦ç¨å¤é¨ä½ç½®åæ¥"
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
msgid "Sync to JACK is not possible: video pull up/down is set"
-msgstr "ä¸å¯è½åæ¥JACKï¼è§é¢æå¨ä¸/ä¸å½å设置"
+msgstr "ä¸å¯è½åæ¥JACKï¼å·²è®¾ç½®è§é¢æå¨ä¸/ä¸"
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
msgid "--pending--"
msgstr "âæç½®â"
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
msgid "SR"
msgstr ""
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
msgid "Pull"
msgstr "æå¨"
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
#, c-format
msgid "%+.4f%%"
-msgstr "%+.4f%%"
+msgstr ""
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139 editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
msgid "Tempo"
msgstr "èå¥"
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
msgid "Meter"
msgstr "èæ"
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845 streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
msgid "programming error: %1"
-msgstr "ç¨åºé误: %1"
+msgstr "ç¨åºé误ï¼%1"
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
msgid "programming error: %1 %2"
msgstr "ç¨åºé误ï¼%1 %2"
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
msgid "Bars:Beats"
msgstr "å°è:æå"
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
msgid "Minutes:Seconds"
msgstr "å:ç§"
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
msgstr "仿é设置"
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
msgid "Locate to This Time"
-msgstr "æ¾ç½®æ¤æ¶é´"
+msgstr "æ¾ç½®å¨æ¬æ¶é´"
+
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr "å¤å¶å°åªè´´æ¿"
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
msgid "dB"
-msgstr ""
+msgstr "dBï¼åè´ï¼"
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
msgid "Region gain:"
msgstr "åºåå¢çï¼"
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
msgid "dBFS"
-msgstr ""
+msgstr "dBFSï¼åè´æ¯å¹
ï¼"
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
msgid "Peak amplitude:"
msgstr "å³°å¼å¹
度ï¼"
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
msgid "Calculating..."
msgstr "计ç®ä¸â¦"
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
msgid "add gain control point"
msgstr "æ·»å å¢çæ§å¶ç¹"
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
msgid "Select Note..."
msgstr "éæ©é³ç¬¦â¦"
-#: automation_controller.cc:293
+#: automation_controller.cc:311
msgid "Halve"
msgstr "åå"
-#: automation_controller.cc:296
+#: automation_controller.cc:314
msgid "Double"
msgstr "å å"
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr "设为 %1 æ"
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] "设置为 %1 æ"
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4387
msgid "automation event move"
msgstr "èªå¨åäºä»¶ç§»å¨"
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "èªå¨åèå´ç§»å¨"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
msgid "remove control point"
msgstr "ç§»é¤æ§å¶ç¹"
-#: automation_line.cc:1003
+#: automation_line.cc:1013
msgid "Ignoring illegal points on AutomationLine \"%1\""
-msgstr "忽ç¥èªå¨å线路ä¸çéæ³ç¹ï¼â %1 â"
+msgstr ""
+"Ignoring illegal points on AutomationLine \"%1\" 忽ç¥èªå¨å线路ä¸çéæ³"
+"ç¹ï¼â%1â"
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
msgid "add automation event"
msgstr "æ·»å èªå¨åäºä»¶"
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
msgid "unable to display automation region for control without list"
-msgstr "æ æ³æ¾ç¤ºæ²¡æå表çèªå¨ååºåæ§å¶"
+msgstr "æ æ³ä¸ºæ²¡æåè¡¨çæ§å¶æ¾ç¤ºèªå¨ååºå"
#: automation_time_axis.cc:163
msgid "automation state"
@@ -2372,62 +2818,59 @@ msgstr "èªå¨åç¶æ"
msgid "hide track"
msgstr "éèé³è½¨"
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
msgid "Automation|Manual"
-msgstr "èªå¨å | æå"
-
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981 editor_actions.cc:122
-#: editor_actions.cc:1920 gain_meter.cc:223 generic_pluginui.cc:99
-#: generic_pluginui.cc:526 generic_pluginui.cc:819 midi_time_axis.cc:1606
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1612 panner_ui.cc:154
+msgstr "èªå¨å|æå¨"
+
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
+#: panner_ui.cc:154
msgid "Play"
msgstr "ææ¾"
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
msgid "Write"
-msgstr "åå
¥"
+msgstr "ç¼å"
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
msgid "Touch"
-msgstr "触碰"
+msgstr "æ¹å¨"
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
msgid "???"
-msgstr "???"
+msgstr ""
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
msgid "clear automation"
msgstr "æ¸
é¤èªå¨å"
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "éè"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
msgid "Clear"
msgstr "æ¸
é¤"
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
msgid "State"
-msgstr "ç¶æ"
+msgstr "ç¶æ\" \""
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
msgid "Discrete"
msgstr "离æ£"
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
msgid "Linear"
msgstr "线æ§"
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
msgid "Mode"
msgstr "模å¼"
@@ -2443,35 +2886,38 @@ msgstr "ç¼è¾å
裹"
msgid "Direction:"
msgstr "æ¹åï¼"
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
msgid "Input"
msgstr "è¾å
¥"
#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371 mixer_strip.cc:2243
-#: rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
msgid "Output"
msgstr "è¾åº"
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94 editor_actions.cc:104
-#: rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
msgid "Edit"
msgstr "ç¼è¾"
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3681 processor_box.cc:3683
msgid "Delete"
msgstr "å é¤"
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
msgid "Name"
msgstr "åç§°"
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
msgid "New"
msgstr "æ°å»º"
@@ -2487,6 +2933,38 @@ msgstr "æ·»å 声é"
msgid "Rename Channel"
msgstr "éå½å声é"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "éç½®æ¢å¤é»è®¤å¼"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "é¢è²ä¸»é¢"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "对象ç©ä½"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "é¢è²"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "æ¡ç®"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "è°è²æ¿"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "éæåº¦"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "颿è°è²æ¿"
+
#: configinfo.cc:28
msgid "Build Configuration"
msgstr "å建é
ç½®"
@@ -2497,7 +2975,43 @@ msgstr "æ§å¶ç¹"
#: control_point_dialog.cc:45
msgid "Value"
-msgstr "å¼"
+msgstr "æ°å¼"
+
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr "æ§å¶æä½å°"
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr "æ¤éæå®å
¨é¨"
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr "å¤å¶é³è½¨åæ»çº¿"
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr "å¤å¶ææ¾å表"
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr "å建æ°çï¼ç©ºï¼ææ¾å表"
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr "åäº«ææ¾å表"
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr "å¤å¶æ¯ä¸ªé³è½¨/æ»çº¿ä¸ºè¿ä¸ªæ°åçåæ°ï¼"
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr "ä¸ä¸ªæè
æ´å¤çé³è½¨/æ»çº¿æ æ³è¢«å¤å¶"
#: edit_note_dialog.cc:42
msgid "Note"
@@ -2505,28 +3019,28 @@ msgstr "é³ç¬¦"
#: edit_note_dialog.cc:45
msgid "Set selected notes to this channel"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬å£°é"
+msgstr "设置已éä¸çé³ç¬¦è³æ¬å£°"
#: edit_note_dialog.cc:46
msgid "Set selected notes to this pitch"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬é³é«"
+msgstr "设置已éä¸çé³ç¬¦è³æ¬é³é«"
#: edit_note_dialog.cc:47
msgid "Set selected notes to this velocity"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬å度"
+msgstr "设置已éä¸çé³ç¬¦è³æ¬å度"
#: edit_note_dialog.cc:49
msgid "Set selected notes to this time"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬æ¶é´"
+msgstr "设置已éä¸çé³ç¬¦è³æ¬æ¶é´"
#: edit_note_dialog.cc:51
msgid "Set selected notes to this length"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬é¿åº¦"
+msgstr "设置已éä¸çé³ç¬¦è³æ¬é¿åº¦"
#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
#: step_entry.cc:394
msgid "Channel"
-msgstr "é³è½¨"
+msgstr "声é"
#: edit_note_dialog.cc:68
msgid "Pitch"
@@ -2536,590 +3050,597 @@ msgstr "é³é«"
msgid "Velocity"
msgstr "å度"
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
msgid "Time"
msgstr "æ¶é´"
-#: edit_note_dialog.cc:98 editor_regions.cc:115 export_timespan_selector.cc:378
-#: export_timespan_selector.cc:440 location_ui.cc:320 midi_list_editor.cc:115
-#: time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:415
+#: export_timespan_selector.cc:506 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
msgid "Length"
msgstr "é¿åº¦"
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
msgid "edit note"
msgstr "ç¼è¾é³ç¬¦"
-#: editor.cc:147
+#: editor.cc:160
msgid "CD Frames"
msgstr "CD æ¡æ¶"
-#: editor.cc:148
+#: editor.cc:161
msgid "TC Frames"
-msgstr "TC æ¡æ¶"
+msgstr "TCï¼æ¶é´ç ï¼æ¡æ¶"
-#: editor.cc:149
+#: editor.cc:162
msgid "TC Seconds"
-msgstr "TC ç§"
+msgstr "TCï¼æ¶é´ç ï¼ç§"
-#: editor.cc:150
+#: editor.cc:163
msgid "TC Minutes"
-msgstr "TC å"
+msgstr "TCï¼æ¶é´ç ï¼å"
-#: editor.cc:151
+#: editor.cc:164
msgid "Seconds"
msgstr "ç§"
-#: editor.cc:152
+#: editor.cc:165
msgid "Minutes"
msgstr "å"
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
msgid "Beats/128"
-msgstr "128æ"
+msgstr "æ¯æ128å"
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
msgid "Beats/64"
-msgstr "64æ"
+msgstr "æ¯æ64å"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
msgid "Beats/32"
-msgstr "32æ"
+msgstr "æ¯æ32å"
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
msgid "Beats/28"
-msgstr "28æ"
+msgstr "æ¯æ28å"
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
msgid "Beats/24"
-msgstr "24æ"
+msgstr "æ¯æ24å"
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
msgid "Beats/20"
-msgstr "20æ"
+msgstr "æ¯æ20å"
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
msgid "Beats/16"
-msgstr "16æ"
+msgstr "æ¯æ16å"
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
msgid "Beats/14"
-msgstr "14æ"
+msgstr "æ¯æ14å"
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
msgid "Beats/12"
-msgstr "12æ"
+msgstr "æ¯æ12å"
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
msgid "Beats/10"
-msgstr "10æ"
+msgstr "æ¯æ10å"
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
msgid "Beats/8"
-msgstr "8æ"
+msgstr "æ¯æ8å"
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
msgid "Beats/7"
-msgstr "7æ"
+msgstr "æ¯æ7å"
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
msgid "Beats/6"
-msgstr "6æ"
+msgstr "æ¯æ6å"
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
msgid "Beats/5"
-msgstr "5æ"
+msgstr "æ¯æ5å"
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
msgid "Beats/4"
-msgstr "4æ"
+msgstr "æ¯æ4å"
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
msgid "Beats/3"
-msgstr "3æ"
+msgstr "æ¯æ3å"
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
msgid "Beats/2"
-msgstr "2æ"
+msgstr "æ¯æ2å"
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
msgid "Beats"
msgstr "1æ"
-#: editor.cc:171
+#: editor.cc:184
msgid "Bars"
msgstr "å°è"
-#: editor.cc:172
+#: editor.cc:185
msgid "Marks"
msgstr "æ è®°"
-#: editor.cc:173
+#: editor.cc:186
msgid "Region starts"
-msgstr "åºåå¼å§"
+msgstr "åºåèµ·ç¹"
-#: editor.cc:174
+#: editor.cc:187
msgid "Region ends"
-msgstr "åºåç»æ"
+msgstr "åºåç»ç¹"
-#: editor.cc:175
+#: editor.cc:188
msgid "Region syncs"
msgstr "åºå忥"
-#: editor.cc:176
+#: editor.cc:189
msgid "Region bounds"
msgstr "åºåè¾¹ç"
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
msgid "No Grid"
msgstr "æ ç½æ ¼"
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
msgid "Grid"
msgstr "ç½æ ¼"
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
msgid "Magnetic"
msgstr "ç£æ§å¸é"
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
msgid "Playhead"
msgstr "æé"
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
msgid "Marker"
msgstr "æ è®°"
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
msgid "Mouse"
msgstr "é¼ æ "
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
msgid "Slide"
msgstr "æ»è¡"
-#: editor.cc:196
+#: editor.cc:209
msgid "Splice"
msgstr "æ¼æ¥"
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
msgid "Ripple"
msgstr "波纹"
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503 editor_actions.cc:1789
-#: editor_markers.cc:905 editor_rulers.cc:260 location_ui.cc:58 mixer_strip.cc:195
-#: mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
msgid "Lock"
msgstr "éå®"
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
msgid "Left"
msgstr "å·¦"
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
msgid "Right"
msgstr "å³"
-#: editor.cc:205
+#: editor.cc:218
msgid "Center"
msgstr "ä¸"
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
msgid "Edit point"
msgstr "ç¼è¾ç¹"
-#: editor.cc:214
+#: editor.cc:227
msgid "Mushy"
msgstr "模ç³"
-#: editor.cc:215
+#: editor.cc:228
msgid "Smooth"
msgstr "å¹³æ»"
-#: editor.cc:216
+#: editor.cc:229
msgid "Balanced multitimbral mixture"
msgstr "平衡çå¤éé³è²æ··åä¹"
-#: editor.cc:217
+#: editor.cc:230
msgid "Unpitched percussion with stable notes"
msgstr "带æç¨³å®é³ç¬¦çæªå®é³é«æå»ä¹"
-#: editor.cc:218
+#: editor.cc:231
msgid "Crisp monophonic instrumental"
msgstr "欢快çå声è°ä¹å¨"
-#: editor.cc:219
+#: editor.cc:232
msgid "Unpitched solo percussion"
msgstr "æªå®é³é«çç¬å¥æå»ä¹"
-#: editor.cc:220
+#: editor.cc:233
msgid "Resample without preserving pitch"
msgstr "ä¸ä¿æé³é«çéæ°éæ ·"
-#: editor.cc:256
+#: editor.cc:319
msgid "Mins:Secs"
msgstr "å:ç§"
-#: editor.cc:262
+#: editor.cc:325
msgid "Location Markers"
msgstr "ä½ç½®æ è®°"
-#: editor.cc:263
+#: editor.cc:326
msgid "Range Markers"
msgstr "èå´æ è®°"
-#: editor.cc:264
+#: editor.cc:327
msgid "Loop/Punch Ranges"
-msgstr "å¾ªç¯ / 忢èå´"
+msgstr "循ç¯/忢èå´"
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
msgid "CD Markers"
msgstr "CDæ è®°"
-#: editor.cc:266
+#: editor.cc:329
msgid "Video Timeline"
msgstr "è§é¢æ¶é´çº¿"
-#: editor.cc:283
+#: editor.cc:386
msgid "mode"
msgstr "模å¼"
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
msgid "Markers"
msgstr "æ è®°"
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
msgid "Regions"
msgstr "åºå"
-#: editor.cc:578
+#: editor.cc:654
msgid "Tracks & Busses"
msgstr "é³è½¨ & æ»çº¿"
-#: editor.cc:579
+#: editor.cc:655
msgid "Snapshots"
msgstr "å¿«ç
§"
-#: editor.cc:580
+#: editor.cc:656
msgid "Track & Bus Groups"
msgstr "é³è½¨ & æ»çº¿åç»"
-#: editor.cc:581
+#: editor.cc:657
msgid "Ranges & Marks"
msgstr "èå´ & æ è®°"
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619 rc_option_editor.cc:1627
-#: rc_option_editor.cc:1635 rc_option_editor.cc:1643 rc_option_editor.cc:1667
-#: rc_option_editor.cc:1679 rc_option_editor.cc:1681 rc_option_editor.cc:1689
-#: rc_option_editor.cc:1697 rc_option_editor.cc:1717 rc_option_editor.cc:1729
-#: rc_option_editor.cc:1731 rc_option_editor.cc:1733 rc_option_editor.cc:1741
-#: rc_option_editor.cc:1749 rc_option_editor.cc:1757 rc_option_editor.cc:1772
-#: rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "ç¼è¾å¨"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
msgid "Loop"
msgstr "循ç¯"
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
msgid "Punch"
msgstr "忢"
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
msgid "Linear (for highly correlated material)"
msgstr "线æ§ï¼é«åº¦ç¸å
³çææï¼"
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
msgid "Constant power"
msgstr "æå®åç"
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
msgid "Symmetric"
msgstr "对称"
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
msgid "Slow"
msgstr "æ
¢"
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
msgid "Fast"
msgstr "å¿«"
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
msgid "Deactivate"
-msgstr "åæ¶æ¿æ´»"
+msgstr "æ¤éæ¿æ´»"
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
msgid "Activate"
msgstr "æ¿æ´»"
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
msgid "Freeze"
msgstr "å»ç»"
-#: editor.cc:1641
+#: editor.cc:1666
msgid "Unfreeze"
-msgstr "åæ¶å»ç»"
+msgstr "æ¤éå»ç»"
+
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr "åºåå度åæ"
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr "é³é¢æ¥å/åæ"
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr "èå´å度åæ"
-#: editor.cc:1780
+#: editor.cc:1901
msgid "Selected Regions"
msgstr "已鿩çåºå"
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
msgid "Play Range"
msgstr "ææ¾èå´"
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
msgid "Loop Range"
msgstr "循ç¯èå´"
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
msgid "Zoom to Range"
msgstr "缩æ¾è³æ´ä¸ªèå´"
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr "å度åæ"
+
+#: editor.cc:1959 editor_actions.cc:401
msgid "Move Range Start to Previous Region Boundary"
msgstr "ç§»å¨èå´èµ·ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
msgid "Move Range Start to Next Region Boundary"
msgstr "ç§»å¨èå´èµ·ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
msgid "Move Range End to Previous Region Boundary"
msgstr "ç§»å¨èå´ç»ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
msgid "Move Range End to Next Region Boundary"
msgstr "ç§»å¨èå´ç»ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
msgid "Separate"
msgstr "å离"
-#: editor.cc:1857
+#: editor.cc:1987
msgid "Convert to Region in Region List"
-msgstr "å¨åºåå表转æ¢è³åºå"
+msgstr "转æ¢è³åºåå表ä¸çåºå"
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
msgid "Select All in Range"
msgstr "å¨èå´å
å
¨é"
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
msgid "Set Loop from Selection"
msgstr "ä»å·²éæ©é¨å设置循ç¯"
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
msgid "Set Punch from Selection"
msgstr "ä»å·²éæ©é¨åè®¾ç½®åæ¢"
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
msgid "Set Session Start/End from Selection"
msgstr "ä»å·²éæ©é¨å设置ä¼è¯èµ·ç¹/ç»ç¹"
-#: editor.cc:1868
+#: editor.cc:1998
msgid "Add Range Markers"
msgstr "æ·»å èå´æ è®°"
-#: editor.cc:1871
+#: editor.cc:2001
msgid "Crop Region to Range"
-msgstr "è£åªåºåå°èå´"
-
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "ç¨åºåå¡«å
èå´"
+msgstr "è£åªåºåè³èå´"
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
msgid "Duplicate Range"
msgstr "å¤å¶èå´"
-#: editor.cc:1876
+#: editor.cc:2005
msgid "Consolidate Range"
msgstr "åå¹¶èå´"
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
msgstr "åå¹¶èå´å¹¶å¤ç"
-#: editor.cc:1878
+#: editor.cc:2007
msgid "Bounce Range to Region List"
-msgstr "欢跳弹å¥èå´å°åºåå表"
+msgstr "欢跳弹å¥èå´è³åºåå表"
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "欢跳弹å¥èå´å°åºåå表并å¤ç"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr "欢跳弹å¥èå´è³åºåå表并å¤ç"
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
msgid "Export Range..."
msgstr "导åºèå´â¦"
-#: editor.cc:1882
+#: editor.cc:2011
msgid "Export Video Range..."
msgstr "导åºè§é¢èå´â¦"
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
msgstr "ä»ç¼è¾ç¹ææ¾"
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
msgstr "ä»èµ·ç¹ææ¾"
-#: editor.cc:1900
+#: editor.cc:2029
msgid "Play Region"
msgstr "ææ¾åºå"
-#: editor.cc:1902
+#: editor.cc:2031
msgid "Loop Region"
msgstr "循ç¯åºå"
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
msgid "Select All in Track"
msgstr "å¨é³è½¨ä¸å
¨éææ"
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
msgid "Select All Objects"
msgstr "å
¨éææå¯¹è±¡ç©ä½"
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
msgid "Invert Selection in Track"
-msgstr "å¨é³è½¨åé"
+msgstr "åéé³è½¨éç已鿩é¨å"
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
msgid "Invert Selection"
msgstr "åé"
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
msgid "Set Range to Loop Range"
-msgstr "设置èå´å°å¾ªç¯èå´"
+msgstr "设置èå´è³å¾ªç¯èå´"
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
msgid "Set Range to Punch Range"
-msgstr "设置èå´å°åæ¢åºé´"
+msgstr "设置èå´è³åæ¢èå´"
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr "设置èå´è³å·²éä¸åºå"
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
msgid "Select All After Edit Point"
msgstr "å
¨éç¼è¾ç¹åææ"
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
msgid "Select All Before Edit Point"
-msgstr "å
¨éç¼è¾åææ"
+msgstr "å
¨éç¼è¾ç¹åææ"
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
msgid "Select All After Playhead"
msgstr "å
¨éæéåææ"
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
msgid "Select All Before Playhead"
msgstr "å
¨éæéåææ"
-#: editor.cc:1924
+#: editor.cc:2054
msgid "Select All Between Playhead and Edit Point"
msgstr "å
¨éæéåç¼è¾ç¹ä¹é´ææ"
-#: editor.cc:1925
+#: editor.cc:2055
msgid "Select All Within Playhead and Edit Point"
msgstr "å
¨éæéåç¼è¾ç¹å
鍿æ"
-#: editor.cc:1926
+#: editor.cc:2056
msgid "Select Range Between Playhead and Edit Point"
msgstr "éæ©æéåç¼è¾ç¹ä¹é´èå´"
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
msgid "Select"
msgstr "éæ©"
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3677
msgid "Cut"
msgstr "åªå"
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3679
msgid "Copy"
msgstr "å¤å¶"
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3691
msgid "Paste"
msgstr "ç²è´´"
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
msgid "Align"
msgstr "对é½"
-#: editor.cc:1943
+#: editor.cc:2073
msgid "Align Relative"
msgstr "对é½ç¸å
³"
-#: editor.cc:1950
+#: editor.cc:2080
msgid "Insert Selected Region"
msgstr "æå
¥å·²éæ©çåºå"
-#: editor.cc:1951
+#: editor.cc:2081
msgid "Insert Existing Media"
msgstr "æå
¥å·²åå¨çåªä½"
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
msgid "Nudge Entire Track Later"
msgstr "ååå¾®è°æ´ä¸ªé³è½¨"
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
msgid "Nudge Track After Edit Point Later"
msgstr "ååå¾®è°ç¼è¾ç¹ä»¥åçé³è½¨"
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
msgid "Nudge Entire Track Earlier"
msgstr "ååå¾®è°æ´ä¸ªé³è½¨"
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
msgid "Nudge Track After Edit Point Earlier"
msgstr "ååå¾®è°ç¼è¾ç¹ä»¥åçé³è½¨"
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
msgid "Nudge"
msgstr "å¾®è°"
-#: editor.cc:2235
-msgid "Playhead position stored with a negative value - ignored (use zero instead)"
-msgstr "æéä½ç½®åå¨ä¸ºä¸ä¸ªè´å¼ââ忽ç¥ï¼ç¨é¶ä»£æ¿ï¼"
+#: editor.cc:2353
+msgid ""
+"Playhead position stored with a negative value - ignored (use zero instead)"
+msgstr "æéä½ç½®åå¨ä¸ºä¸ä¸ªè´å¼ââ已忽ç¥ï¼ç¨é¶ä»£æ¿ï¼"
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
msgid "All"
msgstr "ææ"
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
msgstr "æºè½æ¨¡å¼ï¼æ·»å èå´åè½å°æå模å¼ï¼"
-#: editor.cc:3211
+#: editor.cc:3281
msgid "Grab Mode (select/move objects)"
msgstr "æå模å¼ï¼éæ©/ç§»å¨å¯¹è±¡ç©ä½ï¼"
-#: editor.cc:3212
+#: editor.cc:3282
msgid "Cut Mode (split regions)"
msgstr "å岿¨¡å¼ï¼æååºåï¼"
-#: editor.cc:3213
+#: editor.cc:3283
msgid "Range Mode (select time ranges)"
msgstr "èå´æ¨¡å¼ï¼éæ©æ¶é´èå´ï¼"
-#: editor.cc:3214
+#: editor.cc:3284
msgid "Draw Mode (draw and edit gain/notes/automation)"
msgstr "æç»æ¨¡å¼ï¼æç»åç¼è¾å¢ç/é³ç¬¦/èªå¨åï¼"
-#: editor.cc:3215
+#: editor.cc:3285
msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
msgstr "延伸模å¼ï¼æ¶é´å»¶ä¼¸é³é¢åMIDIåºåï¼ä¿æé³é«ï¼"
-#: editor.cc:3216
+#: editor.cc:3286
msgid "Audition Mode (listen to regions)"
msgstr "ç嬿¨¡å¼ï¼è¯å¬åºåï¼"
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
msgstr "å
é¨ç¼è¾æ¨¡å¼ï¼å¨åºåå
ç¼è¾é³ç¬¦åå¢çæ²çº¿ï¼"
-#: editor.cc:3218
+#: editor.cc:3288
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3127,59 +3648,63 @@ msgstr ""
"åç»ï¼ç¹å»ï¼ä¸ï¼å¯ç¨\n"
"å³é®ç¹å»å
¶å®æä½"
-#: editor.cc:3219
+#: editor.cc:3289
msgid "Nudge Region/Selection Later"
msgstr "ååå¾®è°åºå/已鿩é¨å"
-#: editor.cc:3220
+#: editor.cc:3290
msgid "Nudge Region/Selection Earlier"
msgstr "ååå¾®è°åºå/已鿩é¨å"
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
msgid "Zoom In"
-msgstr "æ¾å¤§"
+msgstr "æ¨è¿æ¾å¤§"
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
msgid "Zoom Out"
-msgstr "缩å°"
+msgstr "æè¿ç¼©å°"
-#: editor.cc:3223
+#: editor.cc:3293
msgid "Zoom to Time Scale"
msgstr "缩æ¾è³æ¶é´æ¯ä¾"
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
msgid "Zoom to Session"
msgstr "缩æ¾è³æ´ä¸ªä¼è¯"
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
msgstr "缩æ¾ç¦ç¹"
-#: editor.cc:3226
+#: editor.cc:3296
msgid "Expand Tracks"
msgstr "æ©å±é³è½¨"
-#: editor.cc:3227
+#: editor.cc:3297
msgid "Shrink Tracks"
msgstr "æ¶ç¼©é³è½¨"
-#: editor.cc:3228
+#: editor.cc:3298
msgid "Number of visible tracks"
-msgstr "å¯è§é³è½¨æ°é"
+msgstr "å¯è§é³è½¨çæ°é"
-#: editor.cc:3229
+#: editor.cc:3299
msgid "Snap/Grid Units"
-msgstr "å¸é/ç½æ ¼åä½"
+msgstr "å¸é/ç½æ ¼åå
"
-#: editor.cc:3230
+#: editor.cc:3300
msgid "Snap/Grid Mode"
msgstr "å¸é/ç½æ ¼æ¨¡å¼"
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "ç¼è¾ç¹"
+
+#: editor.cc:3302
msgid "Edit Mode"
msgstr "ç¼è¾æ¨¡å¼"
-#: editor.cc:3233
+#: editor.cc:3303
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3187,123 +3712,124 @@ msgstr ""
"å¾®è°è®¡æ¶å¨\n"
"ï¼ä½¿ç¨å¾®è°åºåå已鿩é¨åæ¥æ§å¶è·ç¦»ï¼"
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
msgid "Command|Undo"
msgstr "å½ä»¤|æ¤é"
-#: editor.cc:3503
+#: editor.cc:3573
msgid "Command|Undo (%1)"
msgstr "å½ä»¤|æ¤éï¼%1ï¼"
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316 editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
msgid "Redo"
msgstr "éå"
-#: editor.cc:3512
+#: editor.cc:3583
msgid "Redo (%1)"
msgstr "éåï¼%1ï¼"
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
msgid "Duplicate"
msgstr "å¤å¶"
-#: editor.cc:3532
+#: editor.cc:3604
msgid "Number of duplications:"
-msgstr "å¤å¶æ°éï¼"
+msgstr "å¤å¶çæ°éï¼"
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
msgid "Selection"
msgstr "已鿩é¨å"
-#: editor.cc:3709
+#: editor.cc:3777
msgid "Fit 1 track"
-msgstr "å¹é
é³è½¨"
+msgstr "å¹é
1é³è½¨"
-#: editor.cc:3710
+#: editor.cc:3778
msgid "Fit 2 tracks"
msgstr "å¹é
2é³è½¨"
-#: editor.cc:3711
+#: editor.cc:3779
msgid "Fit 4 tracks"
msgstr "å¹é
4é³è½¨"
-#: editor.cc:3712
+#: editor.cc:3780
msgid "Fit 8 tracks"
msgstr "å¹é
8é³è½¨"
-#: editor.cc:3713
+#: editor.cc:3781
msgid "Fit 16 tracks"
msgstr "å¹é
16é³è½¨"
-#: editor.cc:3714
+#: editor.cc:3782
msgid "Fit 24 tracks"
msgstr "å¹é
24é³è½¨"
-#: editor.cc:3715
+#: editor.cc:3783
msgid "Fit 32 tracks"
msgstr "å¹é
32é³è½¨"
-#: editor.cc:3716
+#: editor.cc:3784
msgid "Fit 48 tracks"
msgstr "å¹é
48é³è½¨"
-#: editor.cc:3717
+#: editor.cc:3785
msgid "Fit All tracks"
msgstr "å¹é
ææé³è½¨"
-#: editor.cc:3718
+#: editor.cc:3786
msgid "Fit Selection"
msgstr "å¹é
已鿩é¨å"
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
msgid "Zoom to 10 ms"
-msgstr "缩æ¾è³ 10 毫ç§"
+msgstr "缩æ¾è³10毫ç§"
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
msgid "Zoom to 100 ms"
-msgstr "缩æ¾è³ 100 毫ç§"
+msgstr "缩æ¾è³100毫ç§"
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
msgid "Zoom to 1 sec"
-msgstr "缩æ¾è³ 1 ç§"
+msgstr "缩æ¾è³1ç§"
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
msgid "Zoom to 10 sec"
-msgstr "缩æ¾è³ 10 ç§"
+msgstr "缩æ¾è³10ç§"
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
msgid "Zoom to 1 min"
-msgstr "缩æ¾è³ 1 åé"
+msgstr "缩æ¾è³1åé"
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
msgid "Zoom to 10 min"
-msgstr "缩æ¾è³ 10 åé"
+msgstr "缩æ¾è³10åé"
-#: editor.cc:3726
+#: editor.cc:3794
msgid "Zoom to 1 hour"
-msgstr "缩æ¾è³ 1 å°æ¶"
+msgstr "缩æ¾è³1å°æ¶"
-#: editor.cc:3727
+#: editor.cc:3795
msgid "Zoom to 8 hours"
-msgstr "缩æ¾è³ 8 å°æ¶"
+msgstr "缩æ¾è³8å°æ¶"
-#: editor.cc:3728
+#: editor.cc:3796
msgid "Zoom to 24 hours"
-msgstr "缩æ¾è³ 24 å°æ¶"
+msgstr "缩æ¾è³24å°æ¶"
-#: editor.cc:3730
+#: editor.cc:3798
msgid "Zoom to Range/Region Selection"
msgstr "缩æ¾è³èå´/åºå已鿩é¨å"
-#: editor.cc:3800
+#: editor.cc:3868
msgid "*"
msgstr ""
-#: editor.cc:4120
+#: editor.cc:4135
msgid "Playlist Deletion"
msgstr "ææ¾å表å é¤é¨å"
-#: editor.cc:4121
+#: editor.cc:4136
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3313,1295 +3839,1380 @@ msgstr ""
"妿ä¿çå®ï¼å®çé³é¢æä»¶å°ä¸ä¼è¢«æ¸
é¤ã\n"
"妿å é¤å®ï¼å®åç¬ä½¿ç¨è¿çé³é¢æä»¶å°ä¼è¢«æ¸
é¤ã"
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr "å é¤æææªä½¿ç¨ç"
+
+#: editor.cc:4147
msgid "Delete Playlist"
msgstr "å 餿æ¾å表"
-#: editor.cc:4132
+#: editor.cc:4148
msgid "Keep Playlist"
msgstr "ä¿çææ¾å表"
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr "ä¿çå©ä½ç"
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
msgid "Cancel"
msgstr "åæ¶"
-#: editor.cc:4275
+#: editor.cc:4292
msgid "new playlists"
msgstr "æ°å»ºææ¾å表"
-#: editor.cc:4291
+#: editor.cc:4308
msgid "copy playlists"
msgstr "å¤å¶ææ¾å表"
-#: editor.cc:4306
+#: editor.cc:4323
msgid "clear playlists"
msgstr "æ¸
餿æ¾å表"
-#: editor.cc:5046
+#: editor.cc:5048
msgid "Please wait while %1 loads visual data."
-msgstr "请çå %1 è½½å
¥å¯è§æ°æ®ã"
+msgstr "请çå %1 è½½å
¥å¯è§æ°æ®"
+
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr "å¤ä½ #%1"
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr "没æå¨ä½ç»å®"
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
msgid "Edit..."
msgstr "ç¼è¾â¦"
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "åè°â¦"
+
+#: editor.cc:6006 editor_actions.cc:1959
msgid "Legatize"
-msgstr " åæ³å"
+msgstr "åæ³å"
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
msgid "Quantize..."
msgstr "éåâ¦"
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
msgid "Remove Overlap"
msgstr "ç§»é¤éå "
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
msgid "Transform..."
msgstr "忢â¦"
-#: editor_actions.cc:92
+#: editor_actions.cc:95
msgid "Autoconnect"
msgstr "èªå¨è¿æ¥"
-#: editor_actions.cc:93
+#: editor_actions.cc:96
msgid "Crossfades"
-msgstr "æ·¡å
¥æ·¡åºï¼äº¤åæ·¡åï¼"
+msgstr "äº¤åæ·¡åï¼æ·¡å
¥æ·¡åºï¼"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
msgid "Move Selected Marker"
msgstr "ç§»å¨å·²éæ©çæ è®°"
-#: editor_actions.cc:96
+#: editor_actions.cc:99
msgid "Select Range Operations"
msgstr "éæ©èå´æä½"
-#: editor_actions.cc:97
+#: editor_actions.cc:100
msgid "Select Regions"
msgstr "éæ©åºå"
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "ç¼è¾ç¹"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
msgid "Fade"
msgstr "æ·¡å"
-#: editor_actions.cc:100
+#: editor_actions.cc:103
msgid "Latch"
-msgstr "çé"
+msgstr "æé"
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
msgid "Region"
msgstr "åºå"
-#: editor_actions.cc:102
+#: editor_actions.cc:105
msgid "Layering"
msgstr "åå±"
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
msgid "Position"
msgstr "ä½ç½®"
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
msgid "Trim"
msgstr "ä¿®åª"
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
msgid "Gain"
msgstr "å¢ç"
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
msgid "Ranges"
msgstr "èå´"
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
msgid "Fades"
msgstr "æ·¡å"
-#: editor_actions.cc:111
+#: editor_actions.cc:114
msgid "Link"
msgstr "龿¥"
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "缩æ¾ç¦ç¹"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
msgid "Locate to Markers"
msgstr "å®ä½å°æ è®°"
-#: editor_actions.cc:115
+#: editor_actions.cc:118
msgid "Meter falloff"
msgstr "èæè¡°å"
-#: editor_actions.cc:116
+#: editor_actions.cc:119
msgid "Meter hold"
msgstr "èæä¿æ"
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
msgid "MIDI Options"
msgstr "MIDIé项"
-#: editor_actions.cc:118
+#: editor_actions.cc:121
msgid "Misc Options"
msgstr "å
¶å®é项"
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
msgid "Monitoring"
msgstr "çæ§ä¸"
-#: editor_actions.cc:120
+#: editor_actions.cc:123
msgid "Active Mark"
-msgstr "å¯ç¨æ è®°"
+msgstr "æ¿æ´»æ è®°"
-#: editor_actions.cc:123
+#: editor_actions.cc:126
msgid "Primary Clock"
msgstr "主计æ¶å¨"
-#: editor_actions.cc:124
+#: editor_actions.cc:127
msgid "Pullup / Pulldown"
-msgstr "å䏿å¨/å䏿å¨"
+msgstr "åä¸æå¨ / å䏿å¨"
-#: editor_actions.cc:125
+#: editor_actions.cc:128
msgid "Region operations"
msgstr "åºåæä½"
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
msgid "Rulers"
msgstr "æ å°º"
-#: editor_actions.cc:128
+#: editor_actions.cc:131
msgid "Views"
msgstr "è§å¾"
-#: editor_actions.cc:129
+#: editor_actions.cc:132
msgid "Scroll"
msgstr "æ»å¨"
-#: editor_actions.cc:130
+#: editor_actions.cc:133
msgid "Secondary Clock"
msgstr "第äºè®¡æ¶å¨"
-#: editor_actions.cc:137
+#: editor_actions.cc:140
msgid "Subframes"
msgstr "åæ¡æ¶"
-#: editor_actions.cc:140
+#: editor_actions.cc:143
msgid "Timecode fps"
-msgstr "æ¶é´ç FPS"
+msgstr "æ¶é´ç fpsï¼å¸§æ¯ç§ï¼"
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
msgid "Height"
msgstr "é«åº¦"
-#: editor_actions.cc:143
+#: editor_actions.cc:146
msgid "Tools"
msgstr "å·¥å
·"
-#: editor_actions.cc:144
+#: editor_actions.cc:147
msgid "View"
msgstr "è§å¾"
-#: editor_actions.cc:146
+#: editor_actions.cc:149
msgid "Zoom"
msgstr "缩æ¾"
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "ç»æ¢ææ½æåæ¶éæ©ææ"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "èæ¬åçè¡ä¸º"
#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr "ä¼è¯|éå®"
+
+#: editor_actions.cc:161
msgid "Show Editor Mixer"
msgstr "æ¾ç¤ºç¼è¾å¨æ··é³å¨"
-#: editor_actions.cc:160
+#: editor_actions.cc:162
msgid "Show Editor List"
msgstr "æ¾ç¤ºç¼è¾å¨å表"
-#: editor_actions.cc:162
+#: editor_actions.cc:164
msgid "Playhead to Next Region Boundary"
msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor_actions.cc:163
+#: editor_actions.cc:165
msgid "Playhead to Next Region Boundary (No Track Selection)"
msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-#: editor_actions.cc:164
+#: editor_actions.cc:166
msgid "Playhead to Previous Region Boundary"
msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor_actions.cc:165
+#: editor_actions.cc:167
msgid "Playhead to Previous Region Boundary (No Track Selection)"
msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-#: editor_actions.cc:167
+#: editor_actions.cc:169
msgid "Playhead to Next Region Start"
msgstr "æéå°ä¸ä¸ä¸ªåºåèµ·ç¹"
-#: editor_actions.cc:168
+#: editor_actions.cc:170
msgid "Playhead to Next Region End"
msgstr "æéå°ä¸ä¸ä¸ªåºåç»ç¹"
-#: editor_actions.cc:169
+#: editor_actions.cc:171
msgid "Playhead to Next Region Sync"
msgstr "ææ¾å¤´å°ä¸ä¸ä¸ªåºå忥"
-#: editor_actions.cc:171
+#: editor_actions.cc:173
msgid "Playhead to Previous Region Start"
msgstr "æéå°ä¸ä¸ä¸ªåºåèµ·ç¹"
-#: editor_actions.cc:172
+#: editor_actions.cc:174
msgid "Playhead to Previous Region End"
msgstr "æéå°ä¸ä¸ä¸ªåºåç»ç¹"
-#: editor_actions.cc:173
+#: editor_actions.cc:175
msgid "Playhead to Previous Region Sync"
msgstr "æéå°ä¸ä¸ä¸ªåºå忥"
-#: editor_actions.cc:175
+#: editor_actions.cc:177
msgid "To Next Region Boundary"
msgstr "å°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor_actions.cc:176
+#: editor_actions.cc:178
msgid "To Next Region Boundary (No Track Selection)"
msgstr "å°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-#: editor_actions.cc:177
+#: editor_actions.cc:179
msgid "To Previous Region Boundary"
msgstr "å°ä¸ä¸ä¸ªåºåè¾¹ç"
-#: editor_actions.cc:178
+#: editor_actions.cc:180
msgid "To Previous Region Boundary (No Track Selection)"
msgstr "å°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-#: editor_actions.cc:180
+#: editor_actions.cc:182
msgid "To Next Region Start"
msgstr "å°ä¸ä¸ä¸ªåºåèµ·ç¹"
-#: editor_actions.cc:181
+#: editor_actions.cc:183
msgid "To Next Region End"
msgstr "å°ä¸ä¸ä¸ªåºåç»ç¹"
-#: editor_actions.cc:182
+#: editor_actions.cc:184
msgid "To Next Region Sync"
msgstr "å°ä¸ä¸ä¸ªåºå忥"
-#: editor_actions.cc:184
+#: editor_actions.cc:186
msgid "To Previous Region Start"
msgstr "å°ä¸ä¸ä¸ªåºåèµ·ç¹"
-#: editor_actions.cc:185
+#: editor_actions.cc:187
msgid "To Previous Region End"
msgstr "å°ä¸ä¸ä¸ªåºåç»ç¹"
-#: editor_actions.cc:186
+#: editor_actions.cc:188
msgid "To Previous Region Sync"
msgstr "å°ä¸ä¸ä¸ªåºå忥"
-#: editor_actions.cc:188
+#: editor_actions.cc:190
msgid "To Range Start"
msgstr "å°èå´èµ·ç¹"
-#: editor_actions.cc:189
+#: editor_actions.cc:191
msgid "To Range End"
msgstr "å°èå´ç»ç¹"
-#: editor_actions.cc:191
+#: editor_actions.cc:193
msgid "Playhead to Range Start"
msgstr "æéå°èå´èµ·ç¹"
-#: editor_actions.cc:192
+#: editor_actions.cc:194
msgid "Playhead to Range End"
msgstr "æéå°èå´ç»ç¹"
-#: editor_actions.cc:195
+#: editor_actions.cc:197
msgid "Select All Tracks"
msgstr "éæ©ææé³è½¨"
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
msgid "Deselect All"
msgstr "åéææ"
-#: editor_actions.cc:204
+#: editor_actions.cc:210
msgid "Select All Overlapping Edit Range"
msgstr "éæ©ææéå çç¼è¾èå´"
-#: editor_actions.cc:205
+#: editor_actions.cc:211
msgid "Select All Inside Edit Range"
msgstr "éæ©ææå
é¨çç¼è¾èå´"
-#: editor_actions.cc:207
+#: editor_actions.cc:213
msgid "Select Edit Range"
msgstr "éæ©ç¼è¾èå´"
-#: editor_actions.cc:209
+#: editor_actions.cc:215
msgid "Select All in Punch Range"
msgstr "éæ©ææå¨åæ¢èå´å
ç"
-#: editor_actions.cc:210
+#: editor_actions.cc:216
msgid "Select All in Loop Range"
msgstr "éæ©ææå¨å¾ªç¯èå´å
ç"
-#: editor_actions.cc:212
+#: editor_actions.cc:218
msgid "Select Next Track or Bus"
msgstr "éæ©ä¸ä¸ä¸ªé³è½¨ææ»çº¿"
-#: editor_actions.cc:213
+#: editor_actions.cc:219
msgid "Select Previous Track or Bus"
msgstr "éæ©ä¸ä¸ä¸ªé³è½¨ææ»çº¿"
-#: editor_actions.cc:215
+#: editor_actions.cc:221
msgid "Toggle Record Enable"
msgstr "忢å½å¶å¯ç¨"
-#: editor_actions.cc:217
+#: editor_actions.cc:223
msgid "Toggle Solo"
-msgstr "åç¬å¥"
+msgstr "忢ç¬å¥"
-#: editor_actions.cc:219
+#: editor_actions.cc:225
msgid "Toggle Mute"
msgstr "忢éé³"
-#: editor_actions.cc:221
+#: editor_actions.cc:227
msgid "Toggle Solo Isolate"
msgstr "忢ç¬å¥é离"
-#: editor_actions.cc:226
+#: editor_actions.cc:232
msgid "Save View %1"
msgstr "ä¿åè§å¾ %1"
-#: editor_actions.cc:232
+#: editor_actions.cc:238
msgid "Go to View %1"
msgstr "跳转å°è§å¾ %1"
-#: editor_actions.cc:238
+#: editor_actions.cc:244
msgid "Locate to Mark %1"
msgstr "å®ä½å°æ è®° %1"
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
msgid "Jump to Next Mark"
msgstr "è·³å°ä¸ä¸ä¸ªæ è®°"
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
msgid "Jump to Previous Mark"
msgstr "è·³å°ä¸ä¸ä¸ªæ è®°"
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr "仿éå¤è®¾ç½®ä¼è¯èµ·ç¹"
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr "仿éå¤è®¾ç½®ä¼è¯ç»ç¹"
+
+#: editor_actions.cc:257 editor_actions.cc:258
msgid "Add Mark from Playhead"
-msgstr "仿éèµ·æ·»å æ è®°"
+msgstr "仿é夿·»å æ è®°"
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
msgid "Remove Mark at Playhead"
msgstr "ç§»é¤æéå¤çæ è®°"
-#: editor_actions.cc:253
+#: editor_actions.cc:263
msgid "Nudge Next Later"
msgstr "ååå¾®è°ä¸ä¸ä¸ª"
-#: editor_actions.cc:254
+#: editor_actions.cc:264
msgid "Nudge Next Earlier"
msgstr "ååå¾®è°ä¸ä¸ä¸ª"
-#: editor_actions.cc:256
+#: editor_actions.cc:266
msgid "Nudge Playhead Forward"
msgstr "å¾®è°æéåè¿"
-#: editor_actions.cc:257
+#: editor_actions.cc:267
msgid "Nudge Playhead Backward"
msgstr "å¾®è°æéåé"
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
msgstr "æé转å°ä¸ä¸ä¸ªç½æ ¼"
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
msgstr "æé转å°ä¸ä¸ä¸ªç½æ ¼"
-#: editor_actions.cc:264
+#: editor_actions.cc:274
msgid "Zoom to Selection"
msgstr "缩æ¾è³å·²éæ©é¨å"
-#: editor_actions.cc:265
+#: editor_actions.cc:275
msgid "Toggle Zoom State"
msgstr "åæ¢ç¼©æ¾ç¶æ"
-#: editor_actions.cc:267
+#: editor_actions.cc:277
msgid "Expand Track Height"
msgstr "æ©å±é³è½¨é«åº¦"
-#: editor_actions.cc:268
+#: editor_actions.cc:278
msgid "Shrink Track Height"
msgstr "æ¶ç¼©æ©å±é³è½¨é«åº¦"
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "å¹é
1é³è½¨"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "å¹é
2é³è½¨"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "å¹é
4é³è½¨"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "å¹é
8é³è½¨"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "å¹é
16é³è½¨"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "å¹é
32é³è½¨"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "å¹é
ææé³è½¨"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr "缩æ¾è³5åé"
+
+#: editor_actions.cc:296
msgid "Move Selected Tracks Up"
msgstr "åä¸ç§»å¨å·²éä¸é³è½¨"
-#: editor_actions.cc:272
+#: editor_actions.cc:298
msgid "Move Selected Tracks Down"
msgstr "åä¸ç§»å¨å·²éä¸é³è½¨"
-#: editor_actions.cc:275
+#: editor_actions.cc:301
msgid "Scroll Tracks Up"
msgstr "å䏿»å¨é³è½¨"
-#: editor_actions.cc:277
+#: editor_actions.cc:302
msgid "Scroll Tracks Down"
msgstr "å䏿»å¨é³è½¨"
-#: editor_actions.cc:279
+#: editor_actions.cc:303
msgid "Step Tracks Up"
msgstr "å䏿¥è¿é³è½¨"
-#: editor_actions.cc:281
+#: editor_actions.cc:304
msgid "Step Tracks Down"
msgstr "å䏿¥è¿é³è½¨"
-#: editor_actions.cc:284
+#: editor_actions.cc:306
msgid "Scroll Backward"
msgstr "ååæ»å¨"
-#: editor_actions.cc:285
+#: editor_actions.cc:307
msgid "Scroll Forward"
msgstr "ååæ»å¨"
-#: editor_actions.cc:286
+#: editor_actions.cc:308
msgid "Center Playhead"
-msgstr "æéç½®ä¸"
+msgstr "æéå±
ä¸"
-#: editor_actions.cc:287
+#: editor_actions.cc:309
msgid "Center Edit Point"
-msgstr "ç¼è¾ç¹ç½®ä¸"
+msgstr "ç¼è¾ç¹å±
ä¸"
-#: editor_actions.cc:289
+#: editor_actions.cc:311
msgid "Playhead Forward"
msgstr "æéåè¿"
-#: editor_actions.cc:290
+#: editor_actions.cc:312
msgid "Playhead Backward"
msgstr "æéåé"
-#: editor_actions.cc:292
+#: editor_actions.cc:314
msgid "Playhead to Active Mark"
msgstr "æéè·³è½¬å°æ¿æ´»çæ è®°å¤"
-#: editor_actions.cc:293
+#: editor_actions.cc:315
msgid "Active Mark to Playhead"
msgstr "æ¿æ´»çæ è®°è·³è½¬å°æéå¤"
-#: editor_actions.cc:295
+#: editor_actions.cc:317
msgid "Use Skip Ranges"
-msgstr "使ç¨ä¸è¿ç»çèå´"
+msgstr "使ç¨è·³è·çèå´"
-#: editor_actions.cc:302
+#: editor_actions.cc:324
msgid "Play Selected Regions"
msgstr "ææ¾å·²éä¸çåºå"
-#: editor_actions.cc:304
+#: editor_actions.cc:326
msgid "Play from Edit Point and Return"
msgstr "ä»ç¼è¾ç¹ææ¾å¹¶è¿å"
-#: editor_actions.cc:306
+#: editor_actions.cc:328
msgid "Play Edit Range"
msgstr "ææ¾ç¼è¾èå´"
-#: editor_actions.cc:308
+#: editor_actions.cc:330
msgid "Playhead to Mouse"
msgstr "æé跳转å°é¼ æ å¤"
-#: editor_actions.cc:309
+#: editor_actions.cc:331
msgid "Active Marker to Mouse"
msgstr "æ¿æ´»çæ 记跳转å°é¼ æ å¤"
-#: editor_actions.cc:319
+#: editor_actions.cc:341
msgid "Undo Selection Change"
-msgstr "æ¤éå·²éä¸é¨åçæ¹å¨"
+msgstr "æ¤é已鿩é¨åçæ¹å¨"
-#: editor_actions.cc:320
+#: editor_actions.cc:342
msgid "Redo Selection Change"
-msgstr "éåå·²éä¸é¨åçæ¹å¨"
+msgstr "éå已鿩é¨åçæ¹å¨"
-#: editor_actions.cc:322
+#: editor_actions.cc:344
msgid "Export Audio"
msgstr "导åºé³é¢"
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:476
msgid "Export Range"
msgstr "导åºèå´"
-#: editor_actions.cc:328
+#: editor_actions.cc:350
msgid "Separate Using Punch Range"
msgstr "使ç¨åæ¢èå´å离"
-#: editor_actions.cc:331
+#: editor_actions.cc:353
msgid "Separate Using Loop Range"
msgstr "使ç¨å¾ªç¯èå´å离"
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
msgid "Crop"
msgstr "åªè£"
-#: editor_actions.cc:344
+#: editor_actions.cc:366
msgid "Fade Range Selection"
-msgstr "æ·¡åèå´å·²éä¸é¨å"
+msgstr "æ·¡åèå´å·²éæ©é¨å"
-#: editor_actions.cc:346
+#: editor_actions.cc:368
msgid "Set Tempo from Edit Range = Bar"
-msgstr "ä»ç¼è¾èå´è®¾ç½®èå¥ = å°è"
+msgstr "ä»ç¼è¾èå´è®¾ç½®èå¥=å°è"
-#: editor_actions.cc:348
+#: editor_actions.cc:371
msgid "Log"
msgstr "æ¥å¿"
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
msgid "Move to Next Transient"
msgstr "ç§»å¨å°ä¸ä¸ä¸ªè¿æ¸¡"
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
msgid "Move to Previous Transient"
msgstr "ç§»å¨å°ä¸ä¸ä¸ªè¿æ¸¡"
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "仿éå¤å¼å§èå´"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "仿éå¤ç»æèå´"
+
+#: editor_actions.cc:384 editor_actions.cc:393
msgid "Start Range"
msgstr "å¼å§èå´"
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
msgid "Finish Range"
msgstr "ç»æèå´"
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr "å¼å§åæ¢èå´"
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr "ç»æåæ¢èå´"
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr "å¼å§å¾ªç¯èå´"
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr "ç»æå¾ªç¯èå´"
+
+#: editor_actions.cc:426
msgid "Follow Playhead"
msgstr "è·éæé"
-#: editor_actions.cc:395
+#: editor_actions.cc:427
msgid "Remove Last Capture"
msgstr "ç§»é¤å·²æè·å
容"
-#: editor_actions.cc:397
+#: editor_actions.cc:429
msgid "Stationary Playhead"
msgstr "åºå®æé"
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
msgid "Insert Time"
msgstr "æå
¥æ¶é´"
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr "ç§»é¤æ¶é´"
+
+#: editor_actions.cc:438
msgid "Toggle Active"
msgstr "åæ¢æ¿æ´»"
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
msgid "Remove"
msgstr "ç§»é¤"
-#: editor_actions.cc:411
+#: editor_actions.cc:445
msgid "Fit Selection (Vertical)"
-msgstr " å¹é
已鿩é¨åï¼åç´ï¼"
+msgstr "å¹é
已鿩é¨åï¼åç´ï¼"
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
msgid "Largest"
msgstr "æå¤§ç"
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
msgid "Larger"
msgstr "æ´å¤§ç"
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
msgid "Large"
msgstr "大"
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
msgid "Small"
msgstr "å°"
-#: editor_actions.cc:429
+#: editor_actions.cc:463
msgid "Sound Selected MIDI Notes"
-msgstr "声é³å·²éæ©é¨åMIDIé³ç¬¦"
+msgstr "声é³å·²éæ©MIDIé³ç¬¦"
-#: editor_actions.cc:434
+#: editor_actions.cc:468
msgid "Zoom Focus Left"
msgstr "以左侧为ç¦ç¹ç¼©æ¾"
-#: editor_actions.cc:435
+#: editor_actions.cc:469
msgid "Zoom Focus Right"
msgstr "以å³ä¾§ä¸ºç¦ç¹ç¼©æ¾"
-#: editor_actions.cc:436
+#: editor_actions.cc:470
msgid "Zoom Focus Center"
msgstr "以ä¸å¤®ä¸ºç¦ç¹ç¼©æ¾"
-#: editor_actions.cc:437
+#: editor_actions.cc:471
msgid "Zoom Focus Playhead"
msgstr "以æé为ç¦ç¹ç¼©æ¾"
-#: editor_actions.cc:438
+#: editor_actions.cc:472
msgid "Zoom Focus Mouse"
msgstr "ä»¥é¼ æ 为ç¦ç¹ç¼©æ¾"
-#: editor_actions.cc:439
+#: editor_actions.cc:473
msgid "Zoom Focus Edit Point"
msgstr "以ç¼è¾ç¹ä¸ºç¦ç¹ç¼©æ¾"
-#: editor_actions.cc:441
+#: editor_actions.cc:475
msgid "Next Zoom Focus"
msgstr "ä¸ä¸ä¸ªç¼©æ¾ç¦ç¹"
-#: editor_actions.cc:447
+#: editor_actions.cc:488
msgid "Smart Object Mode"
msgstr "æºè½å¯¹è±¡ç©ä½æ¨¡å¼"
-#: editor_actions.cc:450
+#: editor_actions.cc:491
msgid "Smart"
msgstr "æºè½"
-#: editor_actions.cc:453
+#: editor_actions.cc:494
msgid "Object Tool"
msgstr "对象ç©ä½å·¥å
·"
-#: editor_actions.cc:458
+#: editor_actions.cc:499
msgid "Range Tool"
msgstr "èå´å·¥å
·"
-#: editor_actions.cc:463
+#: editor_actions.cc:504
msgid "Note Drawing Tool"
msgstr "é³ç¬¦æç»å·¥å
·"
-#: editor_actions.cc:468
+#: editor_actions.cc:509
msgid "Audition Tool"
msgstr "çå¬å·¥å
·"
-#: editor_actions.cc:473
+#: editor_actions.cc:514
msgid "Time FX Tool"
msgstr "æ¶é´ç¹æå·¥å
·"
-#: editor_actions.cc:478
+#: editor_actions.cc:519
msgid "Content Tool"
msgstr "å
容工å
·"
-#: editor_actions.cc:484
+#: editor_actions.cc:525
msgid "Cut Tool"
-msgstr " åå²å·¥å
·"
+msgstr "åå²å·¥å
·"
-#: editor_actions.cc:490
+#: editor_actions.cc:531
msgid "Step Mouse Mode"
msgstr "æ¥è¿é¼ æ æ¨¡å¼"
-#: editor_actions.cc:497
+#: editor_actions.cc:538
msgid "Change Edit Point"
msgstr "æ¹åç¼è¾ç¹"
-#: editor_actions.cc:498
+#: editor_actions.cc:539
msgid "Change Edit Point Including Marker"
msgstr "æ¹åç¼è¾ç¹å
æ¬æ è®°"
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr "ç¼è¾æ¨¡å¼|éå®"
+
+#: editor_actions.cc:545
msgid "Cycle Edit Mode"
msgstr "循ç¯ç¼è¾æ¨¡å¼"
-#: editor_actions.cc:506
+#: editor_actions.cc:547
msgid "Snap to"
msgstr "å¸éå°"
-#: editor_actions.cc:507
+#: editor_actions.cc:548
msgid "Snap Mode"
msgstr "å¸é模å¼"
-#: editor_actions.cc:514
+#: editor_actions.cc:555
msgid "Next Snap Mode"
msgstr "ä¸ä¸ä¸ªå¸é模å¼"
-#: editor_actions.cc:515
+#: editor_actions.cc:556
msgid "Next Snap Choice"
msgstr "ä¸ä¸ä¸ªå¸ééæ©"
-#: editor_actions.cc:516
+#: editor_actions.cc:557
msgid "Next Musical Snap Choice"
msgstr "ä¸ä¸ä¸ªé
ä¹çå¸ééæ©"
-#: editor_actions.cc:517
+#: editor_actions.cc:558
msgid "Previous Snap Choice"
msgstr "ä¸ä¸ä¸ªå¸ééæ©"
-#: editor_actions.cc:518
+#: editor_actions.cc:559
msgid "Previous Musical Snap Choice"
msgstr "ä¸ä¸ä¸ªé
ä¹çå¸ééæ©"
-#: editor_actions.cc:523
+#: editor_actions.cc:564
msgid "Snap to CD Frame"
msgstr "å¸éå°CDæ¡æ¶"
-#: editor_actions.cc:524
+#: editor_actions.cc:565
msgid "Snap to Timecode Frame"
msgstr "å¸éå°æ¶é´ç æ¡æ¶"
-#: editor_actions.cc:525
+#: editor_actions.cc:566
msgid "Snap to Timecode Seconds"
msgstr "å¸éå°æ¶é´ç ç§"
-#: editor_actions.cc:526
+#: editor_actions.cc:567
msgid "Snap to Timecode Minutes"
msgstr "å¸éå°æ¶é´ç å"
-#: editor_actions.cc:527
+#: editor_actions.cc:568
msgid "Snap to Seconds"
msgstr "å¸éå°ç§"
-#: editor_actions.cc:528
+#: editor_actions.cc:569
msgid "Snap to Minutes"
msgstr "å¸éå°å"
-#: editor_actions.cc:530
+#: editor_actions.cc:571
msgid "Snap to One Twenty Eighths"
msgstr "å¸éå°ä¸ç¾äºåå
«åä¹ä¸"
-#: editor_actions.cc:531
+#: editor_actions.cc:572
msgid "Snap to Sixty Fourths"
msgstr "å¸éå°å
åååä¹ä¸"
-#: editor_actions.cc:532
+#: editor_actions.cc:573
msgid "Snap to Thirty Seconds"
msgstr "å¸éå°ä¸åäºåä¹ä¸"
-#: editor_actions.cc:533
+#: editor_actions.cc:574
msgid "Snap to Twenty Eighths"
msgstr "å¸éå°äºåå
«åä¹ä¸"
-#: editor_actions.cc:534
+#: editor_actions.cc:575
msgid "Snap to Twenty Fourths"
msgstr "å¸éå°äºåååä¹ä¸"
-#: editor_actions.cc:535
+#: editor_actions.cc:576
msgid "Snap to Twentieths"
msgstr "å¸éå°äºååä¹ä¸"
-#: editor_actions.cc:536
+#: editor_actions.cc:577
msgid "Snap to Sixteenths"
msgstr "å¸éå°åå
åä¹ä¸"
-#: editor_actions.cc:537
+#: editor_actions.cc:578
msgid "Snap to Fourteenths"
msgstr "å¸éå°åååä¹ä¸"
-#: editor_actions.cc:538
+#: editor_actions.cc:579
msgid "Snap to Twelfths"
msgstr "å¸éå°åäºåä¹ä¸"
-#: editor_actions.cc:539
+#: editor_actions.cc:580
msgid "Snap to Tenths"
msgstr "å¸éå°ååä¹ä¸"
-#: editor_actions.cc:540
+#: editor_actions.cc:581
msgid "Snap to Eighths"
msgstr "å¸éå°å
«åä¹ä¸"
-#: editor_actions.cc:541
+#: editor_actions.cc:582
msgid "Snap to Sevenths"
msgstr "å¸éå°ä¸åä¹ä¸"
-#: editor_actions.cc:542
+#: editor_actions.cc:583
msgid "Snap to Sixths"
msgstr "å¸éå°å
åä¹ä¸"
-#: editor_actions.cc:543
+#: editor_actions.cc:584
msgid "Snap to Fifths"
msgstr "å¸éå°äºåä¹ä¸"
-#: editor_actions.cc:544
+#: editor_actions.cc:585
msgid "Snap to Quarters"
msgstr "å¸éå°ååä¹ä¸"
-#: editor_actions.cc:545
+#: editor_actions.cc:586
msgid "Snap to Thirds"
msgstr "å¸éå°ä¸åä¹ä¸"
-#: editor_actions.cc:546
+#: editor_actions.cc:587
msgid "Snap to Halves"
msgstr "å¸éå°äºåä¹ä¸"
-#: editor_actions.cc:548
+#: editor_actions.cc:589
msgid "Snap to Beat"
msgstr "å¸éå°æå"
-#: editor_actions.cc:549
+#: editor_actions.cc:590
msgid "Snap to Bar"
msgstr "å¸éå°å°è"
-#: editor_actions.cc:550
+#: editor_actions.cc:591
msgid "Snap to Mark"
msgstr "å¸éå°æ è®°"
-#: editor_actions.cc:551
+#: editor_actions.cc:592
msgid "Snap to Region Start"
msgstr "å¸éå°åºåèµ·ç¹"
-#: editor_actions.cc:552
+#: editor_actions.cc:593
msgid "Snap to Region End"
msgstr "å¸éå°åºåç»ç¹"
-#: editor_actions.cc:553
+#: editor_actions.cc:594
msgid "Snap to Region Sync"
msgstr "å¸éå°åºå忥"
-#: editor_actions.cc:554
+#: editor_actions.cc:595
msgid "Snap to Region Boundary"
msgstr "å¸éå°åºåè¾¹ç"
-#: editor_actions.cc:556
+#: editor_actions.cc:597
msgid "Show Marker Lines"
msgstr "æ¾ç¤ºæ 记线æ¡"
-#: editor_actions.cc:566
+#: editor_actions.cc:607
msgid "Loop/Punch"
msgstr "循ç¯/忢"
-#: editor_actions.cc:570
+#: editor_actions.cc:611
msgid "Min:Sec"
msgstr "åï¼ç§"
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
msgid "Video Monitor"
msgstr "è§é¢çæ§"
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
msgid "Video"
msgstr "è§é¢"
-#: editor_actions.cc:577
+#: editor_actions.cc:618
msgid "Always on Top"
msgstr "æ»æ¯ç½®é¡¶"
-#: editor_actions.cc:579
+#: editor_actions.cc:620
msgid "Frame number"
msgstr "帧å·ç "
-#: editor_actions.cc:580
+#: editor_actions.cc:621
msgid "Timecode Background"
msgstr "æ¶é´ç èæ¯"
-#: editor_actions.cc:581
+#: editor_actions.cc:622
msgid "Fullscreen"
msgstr "å
¨å±"
-#: editor_actions.cc:582
+#: editor_actions.cc:623
msgid "Letterbox"
-msgstr "宽é¶å¹å¼"
+msgstr "宽è§å¹"
-#: editor_actions.cc:583
+#: editor_actions.cc:624
msgid "Original Size"
msgstr "åå§å°ºå¯¸"
-#: editor_actions.cc:640
+#: editor_actions.cc:681
msgid "Sort"
msgstr "æåº"
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
msgid "Show All"
msgstr "æ¾ç¤ºææ"
-#: editor_actions.cc:652
+#: editor_actions.cc:693
msgid "Show Automatic Regions"
-msgstr "æ¾ç¤ºèªå¨çåºå"
+msgstr "æ¾ç¤ºèªå¨ååºå"
-#: editor_actions.cc:654
+#: editor_actions.cc:695
msgid "Ascending"
msgstr "ååº"
-#: editor_actions.cc:656
+#: editor_actions.cc:697
msgid "Descending"
msgstr "éåº"
-#: editor_actions.cc:659
+#: editor_actions.cc:700
msgid "By Region Name"
msgstr "以åºååç§°"
-#: editor_actions.cc:661
+#: editor_actions.cc:702
msgid "By Region Length"
msgstr "以åºåé¿åº¦"
-#: editor_actions.cc:663
+#: editor_actions.cc:704
msgid "By Region Position"
msgstr "以åºåä½ç½®"
-#: editor_actions.cc:665
+#: editor_actions.cc:706
msgid "By Region Timestamp"
msgstr "以åºåæ¶é´æ³"
-#: editor_actions.cc:667
+#: editor_actions.cc:708
msgid "By Region Start in File"
msgstr "以æä»¶å
çåºåèµ·ç¹"
-#: editor_actions.cc:669
+#: editor_actions.cc:710
msgid "By Region End in File"
msgstr "以æä»¶å
çåºåç»ç¹"
-#: editor_actions.cc:671
+#: editor_actions.cc:712
msgid "By Source File Name"
msgstr "ä»¥æºæä»¶åç§°"
-#: editor_actions.cc:673
+#: editor_actions.cc:714
msgid "By Source File Length"
msgstr "ä»¥æºæä»¶é¿åº¦"
-#: editor_actions.cc:675
+#: editor_actions.cc:716
msgid "By Source File Creation Date"
msgstr "ä»¥æºæä»¶åå»ºæ¥æ"
-#: editor_actions.cc:677
+#: editor_actions.cc:718
msgid "By Source Filesystem"
msgstr "ä»¥æºæä»¶ç³»ç»"
-#: editor_actions.cc:680
+#: editor_actions.cc:721
msgid "Remove Unused"
msgstr "ç§»é¤æªä½¿ç¨ç"
-#: editor_actions.cc:684 editor_audio_import.cc:282 session_import_dialog.cc:75
-#: session_import_dialog.cc:95 session_metadata_dialog.cc:418
-#: editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr "导å
¥ PT ä¼è¯"
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
msgid "Import"
msgstr "导å
¥"
-#: editor_actions.cc:687
+#: editor_actions.cc:731
msgid "Import to Region List..."
msgstr "导å
¥å°åºåå表â¦"
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
msgstr "ä»ä¼è¯å¯¼å
¥"
-#: editor_actions.cc:694
+#: editor_actions.cc:738
msgid "Bring all media into session folder"
msgstr "å°ææåªä½å¼å
¥ä¼è¯æä»¶å¤¹"
-#: editor_actions.cc:697
+#: editor_actions.cc:741
msgid "Show Summary"
msgstr "æ¾ç¤ºæè¦"
-#: editor_actions.cc:699
+#: editor_actions.cc:743
msgid "Show Group Tabs"
msgstr "æ¾ç¤ºç¾¤ç»æ ç¾é¡µ"
-#: editor_actions.cc:701
+#: editor_actions.cc:745
msgid "Show Measure Lines"
msgstr "æ¾ç¤ºæµé线"
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "æ¾ç¤ºåæ "
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
-msgstr "忢æ¯å¦ä¸ºç¼è¾å¨ä¸å·²éæ©çé³è½¨/æ»çº¿æ¿æ´»MIDIè¾å
¥"
+msgstr "为ç¼è¾å¨ä¸å·²éæ©çé³è½¨/æ»çº¿åæ¢MIDIè¾å
¥æ¿æ´»"
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "å·²ä» %1 è½½å
¥ç¼è¾å¨ç»å®"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "å¨æç´¢è·¯å¾ %1 æ¾ä¸å°ç¼è¾å¨ç»å®"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1708
msgid "programming error: %1: %2"
msgstr "ç¨åºéè¯¯ï¼ %1: %2"
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
msgid "Raise"
msgstr "æå"
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
msgid "Raise to Top"
msgstr "æåå°é¡¶é¨"
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
msgid "Lower"
msgstr "æ²é"
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
msgid "Lower to Bottom"
msgstr "æ²éå°åºé¨"
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
msgid "Move to Original Position"
msgstr "ç§»å¨å°åå§ä½ç½®"
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
msgid "Lock to Video"
msgstr "éå®å°è§é¢"
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
msgid "Glue to Bars and Beats"
msgstr "ç²è¿å°å°èåæå"
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
msgid "Remove Sync"
msgstr "ç§»é¤åæ¥"
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
msgid "Mute"
msgstr "éé³"
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
msgid "Normalize..."
msgstr "è§èåâ¦"
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
msgid "Reverse"
msgstr "å转"
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
msgid "Make Mono Regions"
msgstr "设为å声éåºå"
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
msgid "Boost Gain"
msgstr "æ¾å¤§å¢ç"
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
msgid "Cut Gain"
msgstr "åå°å¢ç"
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
msgid "Pitch Shift..."
msgstr "é³é«æ¿æ¢â¦"
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "åè°â¦"
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
msgid "Opaque"
msgstr "模ç³åº¦"
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
msgid "Fade In"
msgstr "æ·¡å
¥"
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
msgid "Fade Out"
msgstr "æ·¡åº"
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
msgid "Multi-Duplicate..."
msgstr "å¤ä¸ªå¯æ¬â¦"
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
msgid "Fill Track"
msgstr "å¡«å
é³è½¨"
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
msgid "Set Loop Range"
msgstr "设置循ç¯èå´"
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
msgid "Set Punch"
msgstr "è®¾ç½®åæ¢"
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
msgid "Add Single Range Marker"
msgstr "æ·»å å个èå´æ è®°"
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
msgid "Add Range Marker Per Region"
msgstr "为æ¯ä¸ªåºåæ·»å èå´æ è®°"
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
msgstr "å¸éä½ç½®å°ç½æ ¼"
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
msgid "Close Gaps"
msgstr "å°éé´é"
# ä½¿ç¨æ¹æ³ http://linuxaudioblog.com/?tag=rhythm-ferret
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
msgid "Rhythm Ferret..."
msgstr "è奿¢æµâ¦"
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
msgid "Export..."
-msgstr "导åº..."
+msgstr "导åºâ¦"
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
msgid "Separate Under"
msgstr "å离ä½äº"
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
msgid "Set Fade In Length"
msgstr "设置淡å
¥é¿åº¦"
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
msgid "Set Fade Out Length"
msgstr "设置淡åºé¿åº¦"
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
msgid "Set Tempo from Region = Bar"
msgstr "ä»åºå设置èå¥=å°è"
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
msgid "Split at Percussion Onsets"
msgstr "卿å»ä¹å»å夿å"
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
msgid "List Editor..."
msgstr "å表ç¼è¾å¨â¦"
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
msgid "Properties..."
msgstr "屿§â¦"
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
msgid "Bounce (with processing)"
msgstr "欢跳弹å¥ï¼å¹¶å¤çï¼"
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
msgid "Bounce (without processing)"
msgstr "欢跳弹å¥ï¼ä¸å¤çï¼"
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
msgid "Combine"
msgstr "æ´å"
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
msgid "Uncombine"
-msgstr "䏿´å"
+msgstr "æ¤éæ´å"
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "å度åæâ¦"
+
+#: editor_actions.cc:1945
msgid "Spectral Analysis..."
msgstr "é¢è°±åæâ¦"
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
msgid "Reset Envelope"
msgstr "éç½®å°è£
"
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
msgid "Reset Gain"
msgstr "éç½®å¢ç"
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
msgid "Envelope Active"
msgstr "å°è£
æ¿æ´»"
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
msgid "Insert Patch Change..."
msgstr "æå
¥ååé³è²â¦"
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
msgid "Unlink from other copies"
-msgstr "è§£é¤é¾æ¥å
¶å®æ·è´"
+msgstr "æ¤é龿¥å
¶å®æ·è´"
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
msgid "Strip Silence..."
msgstr "çæ®µæ 声â¦"
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
msgid "Set Range Selection"
msgstr "设置èå´å·²éæ©é¨å"
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
msgid "Nudge Later"
msgstr "ååå¾®è°"
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
msgid "Nudge Earlier"
msgstr "ååå¾®è°"
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
msgid "Sequence Regions"
msgstr "åºååºå"
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
msgid "Nudge Later by Capture Offset"
msgstr "以æè·é¨ååç§»ååå¾®è°"
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
msgid "Nudge Earlier by Capture Offset"
msgstr "以æè·é¨ååç§»ååå¾®è°"
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
msgid "Trim to Loop"
msgstr "ä¿®åªå°å¾ªç¯"
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
msgid "Trim to Punch"
msgstr "ä¿®åªå°åæ¢"
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
msgid "Trim to Previous"
msgstr "ä¿®åªå°ä¸ä¸ä¸ª"
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
msgid "Trim to Next"
msgstr "ä¿®åªå°ä¸ä¸ä¸ª"
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
msgstr "ä»åºåå表æå
¥åºå"
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
msgid "Set Sync Position"
msgstr "è®¾ç½®åæ¥ä½ç½®"
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
msgid "Place Transient"
msgstr "æ¾ç½®è¿æ¸¡"
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
msgid "Split/Separate"
msgstr "æå/å离"
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
msgid "Trim Start at Edit Point"
msgstr "å¨ç¼è¾ç¹ä¿®åªèµ·ç¹"
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
msgid "Trim End at Edit Point"
msgstr "å¨ç¼è¾ç¹ä¿®åªç»ç¹"
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
msgid "Align Start"
msgstr "对é½èµ·ç¹"
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
msgid "Align Start Relative"
msgstr "对é½èµ·ç¹ç¸å
³"
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
msgid "Align End"
msgstr "对é½ç»ç¹"
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
msgid "Align End Relative"
msgstr "对é½ç»ç¹ç¸å
³"
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
msgid "Align Sync"
msgstr "对é½åæ¥"
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
msgid "Align Sync Relative"
msgstr "对é½åæ¥ç¸å
³"
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
msgid "Choose Top..."
msgstr "鿩顶é¨â¦"
#: editor_audio_import.cc:77 editor_audio_import.cc:99
msgid "You can't import or embed an audiofile until you have a session loaded."
-msgstr "æ æ³å¯¼å
¥åµå
¥ççé³é¢æä»¶,ï¼é¤éæ¨å·²ç»è½½å
¥ä¸ä¸ªä¼è¯æä»¶ã"
+msgstr "æ¨æ æ³å¯¼å
¥æè
åµå
¥ä¸ä¸ªé³é¢æä»¶ï¼é¤éæ¨å·²ç»è½½å
¥ä¸ä¸ªä¼è¯æä»¶ã"
#: editor_audio_import.cc:83 editor_audio_import.cc:127
msgid "Add Existing Media"
@@ -4609,43 +5220,47 @@ msgstr "æ·»å å·²åå¨çåªä½"
#: editor_audio_import.cc:175
msgid ""
-"The session already contains a source file named %1. Do you want to import %1 as "
-"a new file, or skip it?"
+"The session already contains a source file named %1. Do you want to import "
+"%1 as a new file, or skip it?"
msgstr ""
-"æ¤ä¼è¯å·²ç»åå¨ä¸ä¸ªå为 %1 çæºæä»¶ãæ¨æ³æ %1 ä½ä¸ºä¸ä¸ªæ°æä»¶å¯¼å
¥è¿æ¥,ï¼æè
è·³è¿å®ï¼"
+"æ¤ä¼è¯å·²ç»åå¨ä¸ä¸ªå为 %1 çæºæä»¶ãæ¨æ³æ %1 ä½ä¸ºä¸ä¸ªæ°æä»¶å¯¼å
¥è¿æ¥ï¼æè
è·³"
+"è¿å®ï¼"
#: editor_audio_import.cc:177
msgid ""
-"The session already contains a source file named %1. Do you want to import %2 as "
-"a new source, or skip it?"
+"The session already contains a source file named %1. Do you want to import "
+"%2 as a new source, or skip it?"
msgstr ""
-"æ¤ä¼è¯å·²ç»åå¨ä¸ä¸ªå为 %1 çæºæä»¶ãæ¨æ³æ %2 ä½ä¸ºä¸ä¸ªæ°çæºå¯¼å
¥è¿æ¥,ï¼æè
è·³è¿å®ï¼"
+"æ¤ä¼è¯å·²ç»åå¨ä¸ä¸ªå为 %1 çæºæä»¶ãæ¨æ³æ %2 ä½ä¸ºä¸ä¸ªæ°çæºå¯¼å
¥è¿æ¥ï¼æè
è·³"
+"è¿å®ï¼"
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
msgid "Cancel Import"
msgstr "忶坼å
¥"
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
msgid "Editor: cannot open file \"%1\", (%2)"
-msgstr "ç¼è¾å¨: æ æ³æå¼æä»¶ \"%1\", (%2)"
+msgstr "ç¼è¾å¨: æ æ³æå¼æä»¶ \"%1\"ï¼ï¼%2ï¼"
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
msgid "Cancel entire import"
msgstr "åæ¶æ´ä½å¯¼å
¥"
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
msgid "Don't embed it"
msgstr "ä¸åµå
¥å®"
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
msgid "Embed all without questions"
-msgstr "åµå
¥ææï¼ä¸å¿
询é®"
+msgstr "å
¨é¨åµå
¥ï¼ä¸å¿
询é®"
-#: editor_audio_import.cc:572 editor_audio_import.cc:598 export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
msgid "Sample rate"
msgstr "éæ ·ç"
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
msgid ""
"%1\n"
"This audiofile's sample rate doesn't match the session sample rate!"
@@ -4653,208 +5268,288 @@ msgstr ""
"%1\n"
"æ¤é³é¢æä»¶çéæ ·çä¸ä¼è¯çéæ ·çä¸å¹é
ï¼"
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
msgid "Embed it anyway"
msgstr "åªç®¡åµå
¥å®"
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr "æ¨æ æ³å¯¼å
¥ä¸ä¸ª PT ä¼è¯ï¼é¤éæ¨å·²è½½å
¥æä¸ä¸ªä¼è¯ã"
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr "导å
¥ PT ä¼è¯"
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr "%1ï¼è¿ä»
ä»
æ¯ç®å½/æä»¶å¤¹åç§°ï¼ä¸æ¯æä»¶åç§°\n"
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr "似乿²¡æä¸ä¸ªææç PT ä¼è¯æä»¶"
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+"PT v%1 ä¼è¯ @ %2Hz\n"
+"\n"
+"%3 é³é¢æä»¶\n"
+"%4 åºå\n"
+"%5 æ¿æ´»çåºå\n"
+"\n"
+"ç»§ç»â¦"
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr "è½½å
¥ä¸ä¸ªæå¤ä¸ªé³é¢æä»¶å¤±è´¥ï¼ä½ä»å¨ç»§ç»å°è¯å¯¼å
¥ä¸ã"
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr " æåï¼å¯¼å
¥å°å¾å¿«å®æã"
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr "PT导å
¥ï¼UINT_MAXè·¯ç±ï¼ä¸å¯è½ï¼"
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
msgid "Could not create new track after region placed in the drop zone"
msgstr "åºå被æ¾ç½®å¨è½éåºåï¼æ æ³å建æ°é³è½¨"
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
msgid "fixed time region drag"
msgstr "å·²å®åçæ¶é´åºåææ½"
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
msgid "Ripple drag"
msgstr "æ³¢çº¹ææ½"
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr "å建åºå"
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
msgid "resize notes"
msgstr "é设é³ç¬¦å¤§å°"
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+"ä¸ä¸ªææ´å¤é³é¢åºå\n"
+"é½è¢«éå®\n"
+"å¹¶ä¸éå®å°è§é¢ã\n"
+"è§é¢æ æ³è¢«ç§»å¨ã"
+
+#: editor_drag.cc:2683
msgid "Video Start:"
-msgstr "è§é¢èµ·ç¹ï¼"
+msgstr "è§é¢èµ·ç¹"
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
msgid "Diff:"
msgstr "å·®å«ï¼"
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
msgid "Move Video"
msgstr "ç§»å¨è§é¢"
-#: editor_drag.cc:3046
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr "ç§»å¨èææ è®°"
+
+#: editor_drag.cc:3178
msgid "copy meter mark"
msgstr "å¤å¶èææ è®°"
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "ç§»å¨èææ è®°"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr "éæ¿æ´»ç"
-#: editor_drag.cc:3177
+#: editor_drag.cc:3323
+msgid "move tempo mark"
+msgstr "ç§»å¨è奿 è®°"
+
+#: editor_drag.cc:3330
msgid "copy tempo mark"
msgstr "å¤å¶è奿 è®°"
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "ç§»å¨è奿 è®°"
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr "æ©å±èå¥"
-#: editor_drag.cc:3412
+#: editor_drag.cc:3735
msgid "change fade in length"
-msgstr "æ¹åæ¸å
¥é¿åº¦"
+msgstr "æ¹åæ·¡å
¥é¿åº¦"
-#: editor_drag.cc:3526
+#: editor_drag.cc:3860
msgid "change fade out length"
-msgstr "æ¹åæ¸åºé¿åº¦"
+msgstr "æ¹åæ·¡åºé¿åº¦"
-#: editor_drag.cc:3880
+#: editor_drag.cc:4238
msgid "move marker"
msgstr "ç§»å¨æ è®°"
-#: editor_drag.cc:4490
+#: editor_drag.cc:4505 editor_drag.cc:5832
+msgid "automation range move"
+msgstr "èªå¨åèå´ç§»å¨"
+
+#: editor_drag.cc:4889
msgid "An error occurred while executing time stretch operation"
msgstr "彿§è¡æ¶é´å»¶ä¼¸æä½æ¶åºç°é误"
-#: editor_drag.cc:4947
+#: editor_drag.cc:5350
msgid "programming_error: %1"
msgstr "ç¨åºé误ï¼%1"
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5419 editor_drag.cc:5429
msgid "new skip marker"
msgstr "æ°å»ºè·³è·æ è®°"
-#: editor_drag.cc:5017
+#: editor_drag.cc:5420
msgid "skip"
msgstr "è·³è·"
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5424 location_ui.cc:60
msgid "CD"
msgstr ""
-#: editor_drag.cc:5022
+#: editor_drag.cc:5425
msgid "new CD marker"
msgstr "æ°å»ºCDæ è®°"
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
msgid "unnamed"
msgstr "æªå½åç"
-#: editor_drag.cc:5309
+#: editor_drag.cc:5739
msgid "Automation range drag created for invalid region type"
msgstr "ä¸ºæ æçåºåç±»åå·²å建èªå¨èå´ææ½"
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Col"
msgstr "å"
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
msgid "Group Tab Color"
msgstr "åç»æ ç¾é¡µé¢è²"
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
msgid "Name of Group"
msgstr "åç»åç§°"
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr ""
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr "å¯è§|V"
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
msgid "Group is visible?"
msgstr "åç»æ¯å¦å¯è§ï¼"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "On"
msgstr "å¼å¯"
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
msgid "Group is enabled?"
msgstr "åç»æ¯å¦å¯ç¨ï¼"
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
msgstr "åç»|G"
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
msgid "Sharing Gain?"
msgstr "å享å¢çï¼"
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
msgstr "ç¸å
³|Rel"
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
msgid "Relative Gain Changes?"
msgstr "ç¸å
³å¢çæ¹åï¼"
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
msgstr "éé³|M"
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
msgid "Sharing Mute?"
msgstr "å享éé³ï¼"
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
msgstr "ç¬å¥|S"
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
msgid "Sharing Solo?"
msgstr "å享ç¬å¥ï¼"
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
msgid "Rec"
msgstr "å½å¶"
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
msgid "Sharing Record-enable Status?"
-msgstr "å享éé³ï¼"
+msgstr "å享å¯å½å¶ç¶æï¼"
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
msgstr "çæ§|Mon"
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
msgid "Sharing Monitoring Choice?"
msgstr "åäº«çæ§éæ©ï¼"
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
msgstr "已鿩é¨å|Sel"
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
msgid "Sharing Selected/Editing Status?"
msgstr "åäº«å·²éæ©/ç¼è¾ç¶æï¼"
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "æ¿æ´»"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr "æ¿æ´»|A"
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
msgid "Sharing Active Status?"
msgstr "åäº«æ¿æ´»ç¶æï¼"
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
msgid "programming error: marker canvas item has no marker object pointer!"
msgstr "ç¨åºéè¯¯ï¼æ è®°ç颿¡ç®æ²¡ææ 记对象ç©ä½æç¤ºï¼"
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "æä»¶å·²åå¨ï¼"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr "确认 MIDI æä»¶è¦ç"
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "è¦çå·²å卿件"
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr "å·²ç»æä¸ä¸ªç¸ååç§°çæä»¶åå¨ãæ¨æ¯å¦æç®è¦çå®ï¼"
#: editor_group_tabs.cc:176
msgid "Fit to Window"
@@ -4862,318 +5557,361 @@ msgstr "å¹é
éåçªå£"
#: editor_markers.cc:139
msgid "start"
-msgstr "start"
+msgstr "èµ·ç¹"
#: editor_markers.cc:140
msgid "end"
msgstr "ç»ç¹"
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107 editor_ops.cc:2164
-#: editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr "æ è®°"
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
msgid "add marker"
msgstr "æ·»å æ è®°"
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
msgid "set loop range"
-msgstr "è®¾ç½®åæ¢èå´"
+msgstr "设置循ç¯èå´"
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
msgid "set punch range"
msgstr "è®¾ç½®åæ¢èå´"
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
msgid "range"
msgstr "èå´"
-#: editor_markers.cc:725
+#: editor_markers.cc:718
msgid "new range marker"
msgstr "æ°å»ºèå´æ è®°"
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
msgid "remove marker"
msgstr "ç§»é¤æ è®°"
-#: editor_markers.cc:894
+#: editor_markers.cc:899
msgid "Locate to Here"
msgstr "å®ä½å°æ¤å¤"
-#: editor_markers.cc:895
+#: editor_markers.cc:900
msgid "Play from Here"
msgstr "仿¤å¤å¼å§ææ¾"
-#: editor_markers.cc:896
+#: editor_markers.cc:901
msgid "Move Mark to Playhead"
msgstr "ç§»å¨æ è®°å°æé"
-#: editor_markers.cc:900
+#: editor_markers.cc:905
msgid "Create Range to Next Marker"
msgstr "å建èå´å°ä¸ä¸ä¸ªæ è®°"
-#: editor_markers.cc:941
+#: editor_markers.cc:946
msgid "Locate to Marker"
msgstr "å®ä½å°æ è®°"
-#: editor_markers.cc:942
+#: editor_markers.cc:947
msgid "Play from Marker"
msgstr "仿 è®°å¼å§ææ¾"
-#: editor_markers.cc:945
+#: editor_markers.cc:950
msgid "Set Marker from Playhead"
msgstr "仿é起设置æ è®°"
-#: editor_markers.cc:947
+#: editor_markers.cc:951
msgid "Set Range from Selection"
msgstr "ä»å·²éæ©é¨å起设置èå´"
-#: editor_markers.cc:957
+#: editor_markers.cc:960
msgid "Hide Range"
msgstr "éèèå´"
-#: editor_markers.cc:958
+#: editor_markers.cc:961
msgid "Rename Range..."
msgstr "éå½åèå´â¦"
-#: editor_markers.cc:962
+#: editor_markers.cc:965
msgid "Remove Range"
msgstr "ç§»é¤èå´"
-#: editor_markers.cc:969
+#: editor_markers.cc:972
msgid "Separate Regions in Range"
msgstr "å¨èå´ä¸å离åºå"
-#: editor_markers.cc:972
+#: editor_markers.cc:974
msgid "Select Range"
msgstr "éæ©èå´"
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr "å½¢ææ¸å"
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr "å½¢ææé"
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr "éå®å°é³ä¹"
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr "éå®å°é³é¢"
+
+#: editor_markers.cc:1034
msgid "Set Punch Range"
msgstr "è®¾ç½®åæ¢èå´"
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr "æ¹åèæéå®ç±»å"
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr "æ¹åèå¥éå®ç±»å"
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr "æ¹åèå¥ç±»å"
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
msgid "New Name:"
msgstr "æ°åç§°ï¼"
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
msgid "Rename Mark"
msgstr "éå½åæ è®°"
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
msgid "Rename Range"
msgstr "éå½åèå´"
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
msgid "Rename"
msgstr "éå½å"
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
msgid "rename marker"
msgstr "éå½åæ è®°"
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
msgid "This screen is not tall enough to display the editor mixer"
msgstr "å±å¹é«åº¦ä¸è¶³ä»¥æ¾ç¤ºç¼è¾å¨ææ··é³å¨"
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
-msgid "programming error: tempo marker canvas item has no marker object pointer!"
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
+msgid ""
+"programming error: tempo marker canvas item has no marker object pointer!"
msgstr "ç¨åºé误ï¼è奿 è®°ç颿¡ç®æ²¡ææ 记对象ç©ä½æç¤ºï¼"
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
msgid "programming error: marker for tempo is not a tempo marker!"
msgstr "ç¨åºé误ï¼èå¥ä¸çæ è®°ä¸æ¯ä¸ä¸ªè奿 è®°ï¼"
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
msgid "programming error: marker for meter is not a meter marker!"
msgstr "ç¨åºé误ï¼èæä¸çæ è®°ä¸æ¯ä¸ä¸ªèææ è®°ï¼"
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
msgid ""
-"programming error: control point canvas item has no control point object pointer!"
+"programming error: control point canvas item has no control point object "
+"pointer!"
msgstr "ç¨åºéè¯¯ï¼æ§å¶ç¹ç颿¡ç®æ²¡ææ§å¶ç¹å¯¹è±¡ç©ä½æç¤ºï¼"
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "ç¼è¾é³ç¬¦"
+
+#: editor_mouse.cc:2193
msgid "start point trim"
msgstr "èµ·ç¹ä¿®åª"
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
msgstr "ç»ç¹ä¿®åª"
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
msgid "Name for region:"
-msgstr "åºååï¼"
+msgstr "åºååç§°ï¼"
-#: editor_ops.cc:165
+#: editor_ops.cc:168
msgid "split"
msgstr "æå"
-#: editor_ops.cc:339
+#: editor_ops.cc:342
msgid "alter selection"
msgstr "æ´æ¹å·²éæ©é¨å"
-#: editor_ops.cc:381
+#: editor_ops.cc:384
msgid "nudge regions forward"
msgstr "ååå¾®è°åºå"
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
msgid "nudge location forward"
msgstr "ååå¾®è°ä½ç½®"
-#: editor_ops.cc:462
+#: editor_ops.cc:472
msgid "nudge regions backward"
msgstr "ååå¾®è°åºå"
-#: editor_ops.cc:551
+#: editor_ops.cc:567
msgid "nudge forward"
msgstr "ååå¾®è°"
-#: editor_ops.cc:575
+#: editor_ops.cc:591
msgid "nudge backward"
msgstr "ååå¾®è°"
-#: editor_ops.cc:618
+#: editor_ops.cc:656
msgid "sequence regions"
msgstr "åºååºå"
-#: editor_ops.cc:694
+#: editor_ops.cc:718
msgid "build_region_boundary_cache called with snap_type = %1"
msgstr "æå»ºåºåè¾¹çç¼åè°ç¨å¸éç±»å = %1"
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
msgid "New Location Marker"
msgstr "æ°å»ºä½ç½®æ è®°"
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr "设置ä¼è¯èµ·ç¹"
+
+#: editor_ops.cc:2304
msgid "add markers"
msgstr "æ·»å æ è®°"
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
msgid "clear markers"
-msgstr "æ¸
é¤è¡¨å·±"
+msgstr "æ¸
餿 è®°"
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
msgid "clear ranges"
msgstr "æ¸
é¤èå´"
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
msgid "clear locations"
msgstr "æ¸
é¤ä½ç½®"
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
msgid "insert region"
msgstr "æå
¥åºå"
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
msgid "raise regions"
msgstr "æååºå"
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
msgid "raise region"
msgstr "æååºå"
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
msgid "raise regions to top"
msgstr "æååºåå°é¡¶é¨"
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
msgid "raise region to top"
msgstr "æååºåå°é¡¶é¨"
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
msgid "lower regions"
msgstr "æ²éåºå"
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
msgid "lower region"
msgstr "æ²éåºå"
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
msgid "lower regions to bottom"
msgstr "æ²éåºåå°åºé¨"
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
msgid "Rename Region"
msgstr "éå½ååºå"
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1635
msgid "New name:"
msgstr "æ°åç§°ï¼"
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
msgid "separate"
msgstr "å离"
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
msgid "separate region under"
msgstr "å离åºåä½äº"
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
msgid "trim to selection"
-msgstr "ä¿®åªå°å·²éä¸é¨å"
+msgstr "ä¿®åªå°å·²éæ©é¨å"
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
msgid "set sync point"
msgstr "è®¾ç½®åæ¥ç¹"
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
msgid "remove region sync"
msgstr "ç§»é¤åºå忥"
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
msgid "move regions to original position"
msgstr "ç§»å¨åºåå°åå§ä½ç½®"
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
msgid "move region to original position"
msgstr "ç§»å¨åºåå°åå§ä½ç½®"
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
msgid "align selection"
-msgstr "对é½å·²éä¸é¨å"
+msgstr "对é½å·²éæ©é¨å"
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
msgid "align selection (relative)"
-msgstr "对é½å·²éä¸é¨åï¼ç¸å
³ï¼"
+msgstr "对é½å·²éæ©é¨åï¼ç¸å
³ï¼"
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
msgid "align region"
msgstr "对é½åºå"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim front"
msgstr "ä¿®åªåé¨"
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
msgid "trim back"
msgstr "ä¿®åªåé¨"
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
msgid "trim to loop"
msgstr "ä¿®åªå°å¾ªç¯"
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
msgid "trim to punch"
msgstr "ä¿®åªå°åæ¢"
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
msgid "trim to region"
msgstr "ä¿®åªå°åºå"
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
msgid ""
-"This track/bus cannot be frozen because the signal adds or loses channels before "
-"reaching the outputs.\n"
-"This is typically caused by plugins that generate stereo output from mono input or "
-"vice versa."
+"This track/bus cannot be frozen because the signal adds or loses channels "
+"before reaching the outputs.\n"
+"This is typically caused by plugins that generate stereo output from mono "
+"input or vice versa."
msgstr ""
"è¿ä¸ªé³è½¨/æ»çº¿ä¸è½è¢«å»ç»ï¼å 为å¨ä¿¡å·å°è¾¾è¾åºåæ·»å æä¸¢å¤±äºå£°éã\n"
"è¿é常æ¯ç±äºä»å声éè¾å
¥çæç«ä½å£°è¾åºï¼åä¹äº¦ç¶ï¼çæä»¶å¼èµ·çã"
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
msgid "Cannot freeze"
msgstr "æ æ³å»ç»"
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
msgid ""
"<b>%1</b>\n"
"\n"
@@ -5181,82 +5919,82 @@ msgid ""
"\n"
"Freezing will only process the signal as far as the first send/insert/return."
msgstr ""
-"<b>%1</b>\n"
+"\"\"<b>%1</b>\n"
"\n"
-"è¿ä¸ªé³è½¨è³å°æä¸ä¸ªåé/æå
¥/è¿åä½ä¸ºå®çä¿¡å·æµçä¸é¨åã\n"
+"è¿ä¸ªé³è½¨è³å°æä¸ä¸ªåé端/æå
¥/è¿åä½ä¸ºå®çä¿¡å·æµçä¸é¨åã\n"
"\n"
-"å»ç»å°åªä¼å¤çå°ä¿¡å·ç第ä¸ä¸ªåé/æå
¥/è¿å为æ¢ã"
+"å»ç»å°åªä¼å¤çå°ä¿¡å·ç第ä¸ä¸ªåé端/æå
¥/è¿å为æ¢ã"
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
msgid "Freeze anyway"
msgstr "åªç®¡å»ç»"
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
msgid "Don't freeze"
-msgstr "ä¸è¦å»ç»"
+msgstr "ä¸å»ç»"
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
msgid "Freeze Limits"
msgstr "å»ç»éå¶"
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
msgid "Cancel Freeze"
msgstr "åæ¶å»ç»"
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
msgid ""
-"You can't perform this operation because the processing of the signal will cause "
-"one or more of the tracks to end up with a region with more channels than this "
-"track has inputs.\n"
+"You can't perform this operation because the processing of the signal will "
+"cause one or more of the tracks to end up with a region with more channels "
+"than this track has inputs.\n"
"\n"
"You can do this without processing, which is a different operation."
msgstr ""
-"æ¨ä¸è½æ§è¡æ¤æä½ï¼å 为信å·çå¤çå°å¯¼è´ä¸ä¸ªæå¤ä¸ªé³è½¨ä»¥å¸¦çå¤ä¸ªå£°éçåºåç»æï¼èä¸"
-"æ¯ä»¥è¿ä¸ªé³è½¨æ¥æçè¾å
¥å£°éç»æã\n"
+"æ¨ä¸è½æ§è¡æ¤æä½ï¼å 为信å·çå¤çå°å¯¼è´ä¸ä¸ªæå¤ä¸ªé³è½¨ä»¥å¸¦çå¤ä¸ªå£°éçåºåç»"
+"æï¼è䏿¯ä»¥è¿ä¸ªé³è½¨æ¥æçè¾å
¥å£°éç»æã\n"
"\n"
"æ¨å¯ä»¥ä¸åä»»ä½å¤çï¼è¿æ¯ä¸ä¸ªä¸åçæä½ã"
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
msgid "Cannot bounce"
-msgstr "ä¸è½æ¬¢è·³å¼¹å¥"
+msgstr "æ æ³æ¬¢è·³å¼¹å¥"
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
msgid "bounce range"
msgstr "欢跳弹å¥èå´"
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
msgid "delete"
msgstr "å é¤"
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
msgid "cut"
msgstr "åªå"
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
msgid "copy"
msgstr "å¤å¶"
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
msgid "clear"
msgstr "æ¸
é¤"
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
msgid "objects"
msgstr "对象ç©ä½"
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
msgid "remove region"
-msgstr "å é¤åºé´"
+msgstr "ç§»é¤åºå"
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "å¤å¶å·²éæ©é¨å"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr "å¤å¶èå´å·²éæ©é¨å"
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
msgid "nudge track"
msgstr "å¾®è°é³è½¨"
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
msgid ""
"Do you really want to destroy the last capture?\n"
"(This is destructive and cannot be undone)"
@@ -5264,136 +6002,156 @@ msgstr ""
"æ¨æ¯å¦ç¡®å®è¦éæ¯æåå·²æè·å
容ï¼\n"
"ï¼è¿ä¸ªæä½æç ´åæ§ä¸ä¸è½æ¤éï¼ï¼"
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
msgid "No, do nothing."
msgstr "å¦ï¼ ä»ä¹é½ä¸åã"
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
msgid "Yes, destroy it."
msgstr "æ¯ï¼éæ¯å®ã"
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
msgid "Destroy last capture"
msgstr "鿝æåæè·çé¨å"
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
msgid "normalize"
msgstr "è§èå"
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
msgid "reverse regions"
msgstr "å转åºå"
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
msgid "strip silence"
msgstr "çæ®µæ 声"
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
msgid "Fork Region(s)"
msgstr "åè§£åºå"
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
msgid "Could not unlink %1"
-msgstr "æ æ³è§£é¤é¾æ¥ %1"
+msgstr "æ æ³æ¤é龿¥ %1"
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
msgid "reset region gain"
-msgstr "é设åºåå¢ç"
+msgstr "éç½®åºåå¢ç"
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
msgid "region gain envelope active"
msgstr "åºåå¢çå°è£
æ¿æ´»"
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
msgid "toggle region lock"
msgstr "忢åºåéå®"
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
msgid "Toggle Video Lock"
msgstr "忢è§é¢éå®"
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
msgid "region lock style"
msgstr "åºåéå®é£æ ¼"
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
msgid "change region opacity"
msgstr "æ¹ååºåçæ¨¡ç³åº¦"
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
msgid "fade range"
msgstr "æ·¡åèå´"
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
msgid "set fade in length"
msgstr "设置淡å
¥é¿åº¦"
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
msgid "set fade out length"
msgstr "设置淡åºé¿åº¦"
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
msgid "set fade in shape"
msgstr "设置淡å
¥å½¢ç¶"
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
msgid "set fade out shape"
msgstr "设置淡åºå½¢ç¶"
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
msgid "set fade in active"
msgstr "设置淡å
¥å¯ç¨"
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
msgid "set fade out active"
-msgstr "设置淡åºé¿åº¦"
+msgstr "设置淡åºå¯ç¨"
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr "åæ¢æ·¡åå¯ç¨"
+
+#: editor_ops.cc:6249
msgid "set loop range from selection"
msgstr "ä»å·²éæ©é¨å设置循ç¯èå´"
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
msgid "set loop range from region"
msgstr "ä»åºå设置循ç¯èå´"
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
msgid "set punch range from selection"
msgstr "ä»å·²éæ©é¨åè®¾ç½®åæ¢èå´"
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
msgid "set session start/end from selection"
msgstr "ä»å·²éæ©é¨å设置ä¼è¯èµ·ç¹/ç»ç¹"
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr "ä» EP è®¾ç½®åæ¢èµ·ç¹"
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr "ä» EP è®¾ç½®åæ¢ç»ç¹"
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr "ä» EP 设置循ç¯èµ·ç¹"
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr "ä» EP 设置循ç¯ç»ç¹"
+
+#: editor_ops.cc:6444
msgid "set punch range from region"
msgstr "ä»åºåè®¾ç½®åæ¢èå´"
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
msgid "Add new marker"
msgstr "æ·»å æ°æ è®°"
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
msgid "Set global tempo"
msgstr "设置å
¨å±èå¥"
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
msgid "Define one bar"
msgstr "å®ä¹ä¸ä¸ªå°è"
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
msgid "Do you want to set the global tempo or add a new tempo marker?"
-msgstr "æ¨æ¯å¦è¦è®¾ç½®å
¨å±è奿è
æ·»å ä¸ä¸ªæ°çè奿 ç¾ï¼"
+msgstr "æ¨æ¯å¦è¦è®¾ç½®å
¨å±è奿è
æ·»å ä¸ä¸ªæ°çè奿 å¿ï¼"
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
msgid "set tempo from region"
msgstr "ä»åºå设置èå¥"
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
msgid "split regions"
msgstr "æååºå"
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
msgid ""
"You are about to split\n"
"%1\n"
@@ -5405,64 +6163,64 @@ msgstr ""
" æä¸º %2 é¨åã\n"
"è¿éè¦ä¸äºæ¶é´ã"
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
msgid "Call for the Ferret!"
msgstr "è°ç¨æ¢æµï¼"
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
msgid ""
"Press OK to continue with this split operation\n"
"or ask the Ferret dialog to tune the analysis"
msgstr ""
-"æOKç»§ç»æåæä½\n"
+"æä¸âç¡®å®âç»§ç»æ¬æ¬¡æåæä½\n"
"æè
è¯·æ±æ¢æµå¯¹è¯æ¡è¿è¡ä¼ååæ"
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
msgid "Press OK to continue with this split operation"
-msgstr "æOKç»§ç»æåæä½"
+msgstr "æä¸âç¡®å®âç»§ç»æ¬æ¬¡æåæä½"
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
msgid "Excessive split?"
msgstr "è¿å¤çæåï¼"
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
msgid "place transient"
msgstr "æ¾ç½®è¿æ¸¡"
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
msgid "snap regions to grid"
msgstr "å¸éåºåå°ç½æ ¼"
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
msgid "Close Region Gaps"
-msgstr "å
³éåºå空缺"
+msgstr "å°éåºåé´é"
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
msgid "Crossfade length"
msgstr "äº¤åæ·¡åé¿åº¦"
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
msgid "ms"
-msgstr ""
+msgstr "msï¼æ¯«ç§ï¼"
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
msgid "Pull-back length"
msgstr "æ¤åé¿åº¦"
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
msgid "Ok"
-msgstr ""
+msgstr "ç¡®å®"
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
msgid "close region gaps"
-msgstr "å
³éåºå空缺"
+msgstr "å°éåºåé´é"
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
msgid "That would be bad news ...."
msgstr "è¿å°æ¯ä¸ªåæ¶æ¯â¦"
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
msgid ""
"Removing the master or monitor bus is such a bad idea\n"
"that %1 is not going to allow it.\n"
@@ -5478,23 +6236,17 @@ msgstr ""
"ç¼è¾æ¨ç ardour.rc æä»¶\n"
"æ\"allow-special-bus-removal\" é项设为 \"yes\" "
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "é³è½¨"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
msgid "track"
-msgstr "é³è½¨"
+msgid_plural "tracks"
+msgstr[0] "track(s) é³è½¨"
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "æ»çº¿"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
msgid "bus"
-msgstr "æ»çº¿"
+msgid_plural "busses"
+msgstr[0] "bus(ses) æ»çº¿"
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
msgid ""
"Do you really want to remove %1 %2 and %3 %4?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5504,10 +6256,10 @@ msgstr ""
"æ¨æ¯å¦ç¡®å®ç§»é¤ %1 %2 å %3 %4 ï¼\n"
"ï¼æ¨ä¹å¯è½ä¼ä¸¢å¤±ä¸ %2 ç¸å
³çææ¾å表ï¼\n"
"\n"
-"æ¤æä½ä¸å¯æ¤éï¼ è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼ï¼æ¨ä¹å¯è½ä¼ä¸¢å¤±ä¸ %2 ç¸å
³çææ¾å"
-"表ï¼"
+"æ¤æä½ä¸å¯æ¤éï¼ è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼ï¼æ¨ä¹å¯è½ä¼ä¸¢å¤±ä¸ %2 ç¸å
³çæ"
+"æ¾å表ï¼"
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
msgid ""
"Do you really want to remove %1 %2?\n"
"(You may also lose the playlists associated with the %2)\n"
@@ -5519,7 +6271,7 @@ msgstr ""
"\n"
"æ¤æä½ä¸å¯æ¤éï¼ è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼"
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
msgid ""
"Do you really want to remove %1 %2?\n"
"\n"
@@ -5529,139 +6281,140 @@ msgstr ""
"\n"
"æ¤æä½ä¸å¯æ¤éï¼ è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦ç"
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
msgid "Yes, remove them."
msgstr "æ¯çï¼ç§»é¤å®ä»¬ã"
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
msgid "Yes, remove it."
msgstr "æ¯çï¼ç§»é¤å®ã"
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
msgid "Remove %1"
msgstr "ç§»é¤ %1"
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
msgid "insert time"
msgstr "æå
¥æ¶é´"
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr "å½éå®ç¼è¾æ¶ï¼æ æ³æå
¥æå 餿¶é´ã"
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr "ç§»é¤æ¶é´"
+
+#: editor_ops.cc:7628
msgid "There are too many tracks to fit in the current window"
-msgstr "é³è½¨å¤ªå¤ä»¥è³äºæ æ³å¹é
å½åçªå£ã"
+msgstr "é³è½¨å¤ªå¤ä»¥è³äºæ æ³å¹é
å½åçªå£"
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
msgid "Sel"
msgstr "éæ©"
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
#, c-format
msgid "Saved view %u"
-msgstr "ä¿åè§å¾ %u"
+msgstr "åè§å¾ %u"
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
msgid "mute regions"
msgstr "éé³åºå"
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
msgid "mute region"
msgstr "éé³åºå"
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
msgid "combine regions"
msgstr "æ´ååºå"
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
msgid "uncombine regions"
-msgstr "è§£é¤æ´ååºå"
+msgstr "æ¤éæ´ååºå"
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
msgid "%1: Locked"
msgstr "%1: éå®"
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
msgid "Click to unlock"
-msgstr "ç¹å»è§£é¤éå®"
+msgstr "ç¹å»æ¤ééå®"
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
msgid "Moving embedded files into session folder"
msgstr "ç§»å¨å·²åµå
¥çæä»¶å°ä¼è¯æä»¶å¤¹"
-#: editor_regions.cc:112
+#: editor_regions.cc:159
msgid "Region name, with number of channels in []'s"
-msgstr "åºååï¼å¨ [ ] æ¹æ¬å·å
é带声éç¼å·"
+msgstr "åºååç§°ï¼å¨ [] æ¹æ¬å·å
é带声éç¼å·"
-#: editor_regions.cc:113
+#: editor_regions.cc:160
msgid "Position of start of region"
msgstr "åºåèµ·ç¹çä½ç½®"
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
msgid "End"
msgstr "ç»ç¹"
-#: editor_regions.cc:114
+#: editor_regions.cc:161
msgid "Position of end of region"
msgstr "åºåç»ç¹çä½ç½®"
-#: editor_regions.cc:115
+#: editor_regions.cc:162
msgid "Length of the region"
msgstr "åºåçé¿åº¦"
-#: editor_regions.cc:116
+#: editor_regions.cc:163
msgid "Position of region sync point, relative to start of the region"
msgstr "åºå忥ç¹çä½ç½®ï¼ä¸åºåèµ·ç¹ç¸å
³"
-#: editor_regions.cc:117
+#: editor_regions.cc:164
msgid "Length of region fade-in (units: secondary clock), () if disabled"
msgstr "åºåæ·¡å
¥çé¿åº¦ï¼å¦ææ ææ¶ï¼å ä¸åä½ï¼ç§è®¡æ¶å¨ï¼"
-#: editor_regions.cc:118
+#: editor_regions.cc:165
msgid "Length of region fade-out (units: secondary clock), () if disabled"
msgstr "åºåæ·¡åºçé¿åº¦ï¼å¦ææ ææ¶ï¼å ä¸åä½ï¼ç§è®¡æ¶å¨ï¼"
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203 panner2d.cc:240
-#: stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr ""
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr "éå®|L"
-#: editor_regions.cc:119
+#: editor_regions.cc:166
msgid "Region position locked?"
msgstr "åºåä½ç½®éå®ï¼"
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr ""
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr "å¢ç|G"
-#: editor_regions.cc:120
+#: editor_regions.cc:167
msgid "Region position glued to Bars|Beats time?"
msgstr "åºåä½ç½®ç²è¿å°å°è|æåæ¶é´ï¼"
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793 mixer_strip.cc:2032
-#: meter_strip.cc:359 panner_ui.cc:603 route_time_axis.cc:2713 stereo_panner.cc:271
-#: time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
msgid "Region muted?"
msgstr "åºåéé³ï¼"
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr ""
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr "模ç³|O"
-#: editor_regions.cc:122
+#: editor_regions.cc:169
msgid "Region opaque (blocks regions below it from being heard)?"
msgstr "åºå模ç³ï¼ä»åºåå以ä¸çé¨åèµ·å¯ä»¥è¢«å¬è§ï¼?"
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
msgid "Hidden"
msgstr "éè"
-#: editor_regions.cc:391
+#: editor_regions.cc:432
msgid "(MISSING) "
msgstr "ï¼ç¼ºå¤±ï¼"
-#: editor_regions.cc:459
+#: editor_regions.cc:500
msgid ""
"Do you really want to remove unused regions?\n"
"(This is destructive and cannot be undone)"
@@ -5669,178 +6422,187 @@ msgstr ""
"æ¨ççæç®ç§»é¤æªä½¿ç¨çåºåï¼\n"
"ï¼è¿æ¯ç ´åæ§ç䏿 æ³æ¤éï¼"
-#: editor_regions.cc:463
+#: editor_regions.cc:504
msgid "Yes, remove."
msgstr "æ¯çï¼ç§»é¤ã"
-#: editor_regions.cc:465
+#: editor_regions.cc:506
msgid "Remove unused regions"
msgstr "ç§»é¤æªä½¿ç¨çåºå"
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr "ç¼è¾å¨åºå::æ ¼å¼_ä½ç½®: æ¶é´ç ä½ç½®è´å¼: %1"
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
msgid "Mult."
msgstr "å¤"
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
msgid "Start"
msgstr "èµ·ç¹"
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
msgid "Multiple"
msgstr "å¤ä¸ª"
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
msgid "MISSING "
msgstr "缺失"
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
msgid "SS"
msgstr ""
-#: editor_routes.cc:206
+#: editor_routes.cc:233
msgid "Track/Bus Name"
msgstr "é³è½¨/æ»çº¿åç§°"
-#: editor_routes.cc:207
+#: editor_routes.cc:234
msgid "Track/Bus visible ?"
msgstr "é³è½¨/æ»çº¿å¯è§ï¼"
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
msgid "Track/Bus active ?"
msgstr "é³è½¨/æ»çº¿å¯ç¨ï¼"
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054 meter_strip.cc:379
-msgid "I"
-msgstr ""
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr "Midi è¾å
¥|I"
-#: editor_routes.cc:209
+#: editor_routes.cc:236
msgid "MIDI input enabled"
msgstr "MIDIè¾å
¥å·²å¯ç¨"
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241 stereo_panner.cc:249
-#: stereo_panner.cc:276
-msgid "R"
-msgstr ""
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr "å½å¶|R"
-#: editor_routes.cc:210
+#: editor_routes.cc:237
msgid "Record enabled"
msgstr "å½å¶å·²å¯ç¨"
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr "å½å¶| RS"
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr "å½å¶å®å
¨"
+
+#: editor_routes.cc:239
msgid "Muted"
msgstr "å·²éé³"
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr ""
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
msgid "Soloed"
msgstr "å·²ç¬å¥"
-#: editor_routes.cc:213
-msgid "SI"
-msgstr ""
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr "ç¬å¥é离|SI"
-#: editor_routes.cc:213
+#: editor_routes.cc:241
msgid "Solo Isolated"
msgstr "ç¬å¥å·²é离"
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr "ç¬å¥éå®|SS"
+
+#: editor_routes.cc:242
msgid "Solo Safe (Locked)"
msgstr "ç¬å¥å®å
¨ï¼éå®ï¼"
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
msgid "Hide All"
msgstr "éèææ"
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
msgid "Show All Audio Tracks"
msgstr "æ¾ç¤ºææé³é¢è½¨é"
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
msgid "Hide All Audio Tracks"
msgstr "éèææé³é¢è½¨é"
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
msgid "Show All Audio Busses"
msgstr "æ¾ç¤ºææé³é¢æ»çº¿"
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
msgid "Hide All Audio Busses"
msgstr "éèææé³é¢æ»çº¿"
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
msgid "Show All Midi Tracks"
-msgstr "æ¾ç¤ºææMIDI轨"
+msgstr "æ¾ç¤ºææMIDI轨é"
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
msgid "Hide All Midi Tracks"
-msgstr "éèææMIDI轨"
+msgstr "éèææMIDI轨é"
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "æ¾ç¤ºæéåé¢åºåç轨é"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr "ä»
æ¾ç¤ºæéåé¢å¸¦åºåç轨é"
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
msgid "New location marker"
msgstr "æ°å»ºä½ç½®æ è®°"
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
msgid "Clear all locations"
msgstr "æ¸
餿æä½ç½®"
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
msgid "Unhide locations"
-msgstr "åæ¶éèä½ç½®"
+msgstr "æ¤ééèä½ç½®"
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
msgid "New range"
msgstr "æ°å»ºèå´"
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
msgid "Clear all ranges"
msgstr "æ¸
餿æèå´"
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
msgid "Unhide ranges"
-msgstr "åæ¶éèèå´"
+msgstr "æ¤ééèèå´"
#: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "设为循ç¯èå´"
+msgid "New Loop range"
+msgstr "æ°å»ºå¾ªç¯èå´"
#: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "è®¾ä¸ºåæ¢èå´"
+msgid "New Punch range"
+msgstr "æ°å»ºåæ¢èå´"
#: editor_rulers.cc:230
msgid "New CD track marker"
msgstr "æ°å»ºCDé³è½¨æ ç¾"
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
msgid "New Tempo"
-msgstr "æ°èå¥"
+msgstr "æ°å»ºèå¥"
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
msgid "New Meter"
-msgstr "æ°èæ"
+msgstr "æ°å»ºèæ"
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
msgid "Rename Snapshot"
msgstr "éå½åå¿«ç
§"
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
msgid "New name of snapshot"
msgstr "å¿«ç
§çæ°åç§°"
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
msgid ""
"Do you really want to remove snapshot \"%1\" ?\n"
"(which cannot be undone)"
@@ -5848,180 +6610,202 @@ msgstr ""
"æ¨æ¯å¦ç¡®å®ç§»é¤å¿«ç
§ \"%1\"ï¼\n"
"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
msgid "Remove snapshot"
msgstr "ç§»é¤å¿«ç
§"
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "æ·»å "
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
msgid "add tempo mark"
msgstr "æ·»å è奿 è®°"
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "æ·»å "
+
+#: editor_tempodisplay.cc:362
msgid "add meter mark"
msgstr "æ·»å èææ è®°"
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
msgid "done"
msgstr "宿"
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "æ¿æ¢èææ è®°"
+
+#: editor_tempodisplay.cc:454
msgid "replace tempo mark"
msgstr "æ¿æ¢è奿 è®°"
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
msgid "remove tempo mark"
msgstr "ç§»é¤è奿 è®°"
-#: editor_tempodisplay.cc:370
-msgid "programming error: meter marker canvas item has no marker object pointer!"
+#: editor_tempodisplay.cc:502
+msgid ""
+"programming error: meter marker canvas item has no marker object pointer!"
msgstr "ç¨åºé误ï¼èææ è®°ç颿¡ç®æ²¡ææ 记对象ç©ä½æç¤ºï¼"
#: editor_timefx.cc:68
msgid "stretch/shrink"
msgstr "延伸/æ¶ç¼©"
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
msgid "pitch shift"
msgstr "é³é«æ¿æ¢"
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
msgid "timefx cannot be started - thread creation error"
msgstr "é´ç¹ææ æ³å¯å¨ - 线ç¨å建é误"
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
msgid "Device Control Panel"
msgstr "è®¾å¤æ§å¶é¢æ¿"
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
msgid "Midi Device Setup"
msgstr "MIDI设å¤è®¾ç½®"
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr "å·æ°è®¾å¤"
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr "使ç¨å·²ç¼å²çè¾å
¥/è¾åº"
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
msgid "Measure"
msgstr "æµé"
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
msgid "Use results"
msgstr "使ç¨ç»æ"
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
msgid "Back to settings ... (ignore results)"
msgstr "åå°è®¾ç½®â¦ï¼å¿½ç¥ç»æï¼"
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
msgid "Calibrate Audio"
msgstr "æ ¡æ£é³é¢"
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
msgid "Back to settings"
msgstr "åå°è®¾ç½®"
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
msgid ""
"No audio/MIDI backends detected. %1 cannot run\n"
"\n"
"(This is a build/packaging/system error. It should never happen.)"
msgstr ""
-"æªæ£æµå°é³é¢/MIDIå端ã %1 æ æ³è¿è¡\n"
+"æªæ£æµå°é³é¢/MIDIå端ã%1 æ æ³è¿è¡\n"
"\n"
"ï¼è¿æ¯ä¸ä¸ªæå»º/å
è£
/ç³»ç»é误ãå®åºè¯¥æ°¸è¿ä¸ä¼åçãï¼"
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
msgid "Latency Measurement Tool"
msgstr "å»¶è¿æµéå·¥å
·"
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
msgid ""
-"<span weight=\"bold\">Turn down the volume on your audio equipment to a very low "
-"level.</span>"
+"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
+"low level.</span>"
msgstr "<span weight=\"bold\">è°ä½æ¨çé³é¢è®¾å¤é³éå°ä¸ä¸ªé常ä½çæ°´å¹³ã</span>"
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
msgid "Select two channels below and connect them using a cable."
-msgstr "éæ©ä¸é¢ä¸¤ä¸ªå£°éå¹¶å使ç¨çº¿æ¡è¿æ¥å®ä»¬ã"
+msgstr "éæ©ä¸é¢ä¸¤ä¸ªå£°éå¹¶ä¸ä½¿ç¨çº¿æ¡è¿æ¥å®ä»¬ã"
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
msgid "Output channel"
msgstr "è¾åºå£°é"
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
msgid "Input channel"
msgstr "è¾å
¥å£°é"
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
msgid "Once the channels are connected, click the \"Measure\" button."
msgstr "䏿¦å£°éå·²è¿æ¥å¥½ï¼åå»âæµéâæé®ã"
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
msgid "When satisfied with the results, click the \"Use results\" button."
msgstr "妿å¾å°äºä»¤äººæ»¡æçç»æï¼è¯·ç¹å»â使ç¨ç»æâæé®ã"
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
msgid "No measurement results yet"
msgstr "è¿æ²¡ææµéç»æ"
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
msgid "Latency"
msgstr "å»¶è¿"
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
msgid "Audio System:"
msgstr "é³é¢ç³»ç»ï¼"
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
msgid "Driver:"
msgstr "驱å¨ï¼"
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "è¾å
¥è®¾å¤ï¼"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "è¾åºè®¾å¤ï¼"
+
+#: engine_dialog.cc:582
msgid "Device:"
msgstr "设å¤ï¼"
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
msgid "Sample rate:"
msgstr "éæ ·çï¼"
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
msgid "Buffer size:"
msgstr "ç¼å²åºå¤§å°ï¼"
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "卿ï¼"
+
+#: engine_dialog.cc:624
msgid "Input Channels:"
msgstr "è¾å
¥å£°éï¼"
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
msgid "Output Channels:"
msgstr "è¾åºå£°éï¼"
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
msgid "Hardware input latency:"
msgstr "硬件è¾å
¥å»¶è¿ï¼"
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
msgid "samples"
-msgstr "éæ ·"
+msgstr "æ ·æ¬"
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
msgid "Hardware output latency:"
msgstr "硬件è¾åºå»¶è¿ï¼"
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
msgid "MIDI System:"
msgstr "MIDIç³»ç»ï¼"
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
-msgstr ""
-"é³é¢å端已é
置并已å¨å¤é¨å¯å¨ã\n"
-"è¿éå¶äºæ¨å¯¹å®çæ§å¶åã"
+"%1 is already running. %2 will connect to it and use the existing settings."
+msgstr "%1 å·²ç»å¨è¿è¡ä¸ã%2 å°ä¼è¿æ¥å°å®å¹¶ä¸ä½¿ç¨å·²åå¨ç设置ã"
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
msgid ""
"Failed to start or connect to audio-engine.\n"
"\n"
@@ -6031,7 +6815,7 @@ msgstr ""
"\n"
"å»¶è¿æ ¡åéè¦æä¸ä¸ªé³é¢æ¥å£å¨å·¥ä½ã"
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
msgid ""
"Your selected audio configuration is playback- or capture-only.\n"
"\n"
@@ -6041,229 +6825,282 @@ msgstr ""
"\n"
"å»¶è¿æ ¡åéè¦åæ¾åææ"
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
msgid "MIDI Devices"
msgstr "MIDI 设å¤"
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
msgid "Device"
msgstr "设å¤"
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
msgid "Hardware Latencies"
msgstr "硬件延è¿"
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
msgid "Calibrate"
msgstr "æ ¡æ£"
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
msgid "all available channels"
msgstr "ææå¯ç¨ç声é"
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "éæ ·"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 æ ·æ¬"
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
#, c-format
msgid "(%.1f ms)"
-msgstr ""
+msgstr "ï¼%.1f ms 毫ç§ï¼"
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
msgid "Could not start backend engine %1"
msgstr "æ æ³å¯å¨åç«¯å¼æ %1"
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
msgid "Cannot set driver to %1"
msgstr "æ æ³è®¾ç½®é©±å¨å° %1"
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr "æ æ³è®¾ç½®è¾å
¥è®¾å¤åç§°å° %1"
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr "æ æ³è®¾ç½®è¾åºè®¾å¤åç§°å° %1"
+
+#: engine_dialog.cc:2459
msgid "Cannot set device name to %1"
msgstr "æ æ³è®¾ç½®è®¾å¤åç§°å° %1"
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
msgid "Cannot set sample rate to %1"
msgstr "æ æ³è®¾ç½®éæ ·çå° %1"
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
msgid "Cannot set buffer size to %1"
msgstr "æ æ³è®¾ç½®ç¼å²åºå¤§å°å° %1"
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr "æ æ³è®¾ç½®å¨æå° %1"
+
+#: engine_dialog.cc:2478
msgid "Cannot set input channels to %1"
msgstr "æ æ³è®¾ç½®è¾å
¥å£°éå° %1"
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
msgid "Cannot set output channels to %1"
msgstr "æ æ³è®¾ç½®è¾åºå£°éå° %1"
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
msgid "Cannot set input latency to %1"
msgstr "æ æ³è®¾ç½®è¾å
¥å»¶è¿å° %1"
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
msgid "Cannot set output latency to %1"
msgstr "æ æ³è®¾ç½®è¾åºå»¶è¿å° %1"
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
msgid "No signal detected "
msgstr "æªæ£æµå°ä¿¡å·"
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+"è¾å
¥ä¿¡å· > -3 dBFS åè´æ¯å¹
ãå¨é³é¢çé¢ä¸è¾ä½çä¿¡å·çµå¹³ï¼è¾åºå¢çï¼è¾å
¥å¢"
+"çï¼ ã"
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
#: port_insert_ui.cc:98
msgid "Disconnected from audio engine"
msgstr "ä¸é³é¢å¼æå·²æå¼è¿æ¥"
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
msgid "Detected roundtrip latency: "
msgstr "æ£æµå°å¾è¿å»¶è¿ï¼"
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
msgid "Systemic latency: "
msgstr "ç³»ç»å»¶è¿ï¼"
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
msgid "(signal detection error)"
msgstr "ï¼ä¿¡å·æ£æµé误ï¼"
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
msgid "(inverted - bad wiring)"
msgstr "ï¼åå - æåæ¥çº¿ï¼"
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
msgid "(averaging)"
msgstr "ï¼å¹³åï¼"
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
msgid "(too large jitter)"
-msgstr "ï¼æ¯å¹
è¿å¤§ï¼"
+msgstr "ï¼è¿å¤§æ¯å¹
ï¼"
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
msgid "(large jitter)"
msgstr "ï¼å¤§æ¯å¹
ï¼"
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
msgid "Timeout - large MIDI jitter."
msgstr "è¶
æ¶ - 大MIDIæ¯å¹
ã"
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
msgid "Detecting ..."
msgstr "æ£æµä¸â¦"
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
msgid "Disconnect from %1"
msgstr "ä¸ %1 失å»è¿æ¥"
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "æ¿æ´»"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr "è¿è¡ä¸"
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr "å·²è¿æ¥"
+
+#: engine_dialog.cc:3099
msgid "Connect to %1"
msgstr "è¿æ¥å° %1"
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "æªæ¿æ´»"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "已忢"
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
msgid "Channels:"
msgstr "声éï¼"
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
msgid "Split to mono files"
msgstr "æåå°å声éæä»¶"
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
msgid "Bus or Track"
msgstr "æ»çº¿æé³è½¨"
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
msgid "Region contents without fades nor region gain (channels: %1)"
-msgstr "åºåå
å®¹æ²¡ææ·¡å乿²¡æåºåå¢çï¼å£°éï¼ %1ï¼"
+msgstr "åºåå
å®¹æ²¡ææ·¡å乿²¡æåºåå¢çï¼å£°éï¼%1ï¼"
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
msgid "Region contents with fades and region gain (channels: %1)"
-msgstr "åºåå
å®¹å¸¦ææ·¡åååºåå¢çï¼å£°éï¼ %1ï¼"
+msgstr "åºåå
å®¹å¸¦ææ·¡åååºåå¢çï¼å£°éï¼%1ï¼"
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
msgid "Track output (channels: %1)"
-msgstr "é³è½¨è¾åº ï¼å£°éï¼ %1ï¼"
+msgstr "é³è½¨è¾åºï¼å£°éï¼%1ï¼"
+
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr "åºç¨é³è½¨/æ»çº¿å¤ç"
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "导åºåºåå
容"
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr "éæ©å
¨é¨é³è½¨"
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "导åºé³è½¨è¾åº"
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr "éæ©å
¨é¨æ»çº¿"
-#: export_dialog.cc:46
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr "å
¨é¨ä¸é"
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr "é³è½¨åç§°"
+
+#: export_dialog.cc:49
msgid ""
-"<span color=\"#ffa755\">Some already existing files will be overwritten.</span>"
-msgstr "<span color=\"#ffa755\">ä¸äºå·²åå¨çæä»¶å°ä¼è¢«åå
¥è¦çã</span>"
+"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
+"span>"
+msgstr "<span color=\"#ffa755\">ä¸äºå·²åå¨çæä»¶å°ä¼è¢«åå
¥è¦çã</span>\" \""
-#: export_dialog.cc:47
+#: export_dialog.cc:50
msgid "List files"
msgstr "å表æä»¶"
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
msgid "File format"
msgstr "æä»¶æ ¼å¼"
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
msgid "Time Span"
msgstr "æ¶é´è·¨åº¦"
-#: export_dialog.cc:160
+#: export_dialog.cc:165
msgid "Channels"
msgstr "声é"
-#: export_dialog.cc:182
+#: export_dialog.cc:187
msgid ""
"Export has been aborted due to an error!\n"
"See the Log for details."
msgstr ""
"å¯¼åºæå¤ä¸æ¢ï¼å 为æä¸ªé误ï¼\n"
-"详æ
è¯·è§æ¥å¿ã"
+"详æ
请åé
æ¥å¿ã"
-#: export_dialog.cc:251
+#: export_dialog.cc:298
msgid "Files that will be overwritten"
-msgstr "å°ä¼è¢«è¢«åå
¥è¦ççæä»¶"
+msgstr "å°ä¼è¢«åå
¥è¦ççæä»¶"
-#: export_dialog.cc:296
+#: export_dialog.cc:343
msgid "Export initialization failed: %1"
-msgstr "导åºåå§åå¤±è´¥ï¼ %1"
+msgstr "导åºåå§å失败ï¼%1"
-#: export_dialog.cc:306
+#: export_dialog.cc:353
msgid "Stop Export"
-msgstr "Stop Export 忢坼åº"
+msgstr "忢坼åº"
-#: export_dialog.cc:327
+#: export_dialog.cc:383
msgid "export"
msgstr "导åº"
-#: export_dialog.cc:346
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "æ£å¨å¯¼åº '%3' ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
+
+#: export_dialog.cc:407
msgid "Normalizing '%3' (timespan %1 of %2)"
-msgstr "è§èå '%3' ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
+msgstr "æ£å¨è§èå '%3'ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "å¯¼åº '%3' ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr "æ£å¨ç¼ç '%3'ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "æ£å¨æ 注 '%3' ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "æ£å¨ä¸ä¼ '%3' ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr "æ£å¨ä¸º '%1' è¿è¡å置导åºå½ä»¤"
+
+#: export_dialog.cc:453 export_dialog.cc:455
msgid "<span color=\"#ffa755\">Error: "
msgstr "<span color=\"#ffa755\">é误ï¼"
-#: export_dialog.cc:385
+#: export_dialog.cc:465
msgid "<span color=\"#ffa755\">Warning: "
msgstr "<span color=\"#ffa755\">è¦åï¼"
-#: export_dialog.cc:387
+#: export_dialog.cc:467
msgid ""
"\n"
"<span color=\"#ffa755\">Warning: "
@@ -6271,19 +7108,19 @@ msgstr ""
"\n"
"<span color=\"#ffa755\">è¦åï¼"
-#: export_dialog.cc:411
+#: export_dialog.cc:491
msgid "Export Selection"
msgstr "导åºå·²éæ©é¨å"
-#: export_dialog.cc:425
+#: export_dialog.cc:505
msgid "Export Region"
msgstr "导åºåºå"
-#: export_dialog.cc:434
+#: export_dialog.cc:514
msgid "Source"
-msgstr "æº"
+msgstr "æ¥æº"
-#: export_dialog.cc:450
+#: export_dialog.cc:530
msgid "Stem Export"
msgstr "éå导åº"
@@ -6291,183 +7128,286 @@ msgstr "éå导åº"
msgid "Add another format"
msgstr "æ·»å å¦ä¸ä¸ªæ ¼å¼"
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
msgid "Format"
msgstr "æ ¼å¼"
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
msgid "Location"
msgstr "ä½ç½®"
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
msgid "Upload to Soundcloud"
msgstr "ä¸ä¼ å°Soundcloud"
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "åæå·²å¯¼åºçé³é¢"
+
+#: export_file_notebook.cc:286
msgid "No format!"
msgstr "䏿 ¼å¼åï¼"
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
msgid "Format %1: %2"
msgstr "æ ¼å¼å %1: %2"
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
msgid "Label:"
msgstr "æ ç¾ï¼"
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
msgid "Session Name"
msgstr "ä¼è¯åç§°"
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "æ¶é´è·¨åº¦åç§°"
+
+#: export_filename_selector.cc:36
msgid "Revision:"
msgstr "ä¿®è®¢çæ¬ï¼"
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
msgid "Folder:"
msgstr "æä»¶å¤¹ï¼"
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
-#: transcode_video_dialog.cc:59 video_server_dialog.cc:54 video_server_dialog.cc:56
-#: export_video_dialog.cc:81 export_video_dialog.cc:83
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
+#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
msgid "Browse"
msgstr "æµè§"
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>ä»è¿äºç»ä»¶æå»ºæä»¶åï¼</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "æå¼æä»¶å¤¹"
-#: export_filename_selector.cc:212
-msgid "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
-msgstr "<small><i>对ä¸èµ·ï¼ç®å没æä¾åæä»¶åå¯ä»¥æ¾ç¤º</i></small>"
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "ä»è¿äºç»ä»¶æå»ºæä»¶åï¼"
+
+#: export_filename_selector.cc:217
+msgid ""
+"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
+msgstr "<small><i>对ä¸èµ·ï¼ç®åæ²¡ææ ·æ¬æä»¶åå¯ä¾æ¾ç¤º</i></small>"
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>å½åï¼è¿ä¼¼ï¼æä»¶åï¼ â%1â</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>å½åï¼è¿ä¼¼ï¼æä»¶å</i>ï¼ \"%1\""
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
msgid ""
"%1: this is only the directory/folder name, not the filename.\n"
-"The filename will be chosen from the information just above the folder selector."
+"The filename will be chosen from the information just above the folder "
+"selector."
msgstr ""
"%1ï¼è¿ä»
æ¯ç®å½/æä»¶å¤¹åç§°ï¼ä¸æ¯æä»¶å\n"
"å°ä¼ä»åæä¸é¢çæä»¶éæ©å¨ä¿¡æ¯ééåºæä»¶åã"
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr "%1è¿ä¸æ¯ä¸ä¸ªææçç®å½/æä»¶å¤¹ã"
+
+#: export_filename_selector.cc:388
msgid "Choose export folder"
msgstr "éæ©å¯¼åºæä»¶å¤¹"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "New Export Format Profile"
msgstr "æ°å»ºå¯¼åºæ ¼å¼é
ç½®æä»¶"
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
msgid "Edit Export Format Profile"
msgstr "ç¼è¾å¯¼åºæ ¼å¼é
ç½®æä»¶"
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
msgid "Label: "
msgstr "æ ç¾ï¼"
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "è§èåå°ï¼"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "è§èåï¼"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "å³°å¼"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr "å度"
+
+# LUFSï¼æ¬§æ´²å¹¿æèç (EBU) æå®çå度åä½
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+# dBTPæå¤§çå³°å¼çµå¹³
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
msgid "Trim silence at start"
msgstr "å¨èµ·ç¹ä¿®åªæ 声"
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
msgid "Add silence at start:"
msgstr "å¨èµ·ç¹æ·»å æ 声ï¼"
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
msgid "Trim silence at end"
msgstr "å¨ç»ç¹ä¿®åªæ 声"
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
msgid "Add silence at end:"
msgstr "å¨ç»ç¹æ·»å æ 声ï¼"
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
msgid ""
"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
msgstr ""
-"è¿è¡åç½®-导åºçå½ä»¤\n"
-"ï¼%f=宿´è·¯å¾åæä»¶åï¼%d=ç®å½ï¼%b=åºæ¬åç§°ï¼ï¼"
+"è¿è¡å置导åºçå½ä»¤\n"
+"ï¼%f=æä»¶è·¯å¾ï¼%d=ç®å½ï¼%b=åºæ¬åç§°,ï¼æ´å¤ä¿¡æ¯è¯·åé
å·¥å
·æç¤ºï¼ï¼"
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
msgid "Compatibility"
msgstr "å
¼å®¹æ§"
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
msgid "Quality"
msgstr "è´¨é"
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
msgid "Sample rate conversion quality:"
msgstr "éæ ·ç转æ¢è´¨éï¼"
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
msgid "Dithering"
msgstr "æå¨"
-# CUE cuesheet æ¯æå
çæ åï¼éåï¼è¾
婿件æç§°æ è®°æä»¶
-#: export_format_dialog.cc:70
+# CUE cuesheet æ¯æå
çæ åï¼éåï¼è¾
婿件æç§°æ è®°æä»¶
+#: export_format_dialog.cc:78
msgid "Create CUE file for disk-at-once CD/DVD creation"
-msgstr "为åå»ºä¸æ¬¡æ§CD/DVDå
çèå建CUEæä»¶"
+msgstr "为åå»ºä¸æ¬¡æ§CD/DVDå
çèå建 CUEï¼å
çæ åè¾
å©ï¼æä»¶"
-# ç®å½æ°æ® (Table of Content,TOC)
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
msgid "Create TOC file for disk-at-once CD/DVD creation"
-msgstr "为åå»ºä¸æ¬¡æ§CD/DVDå
çèå建TOCæä»¶"
+msgstr "为åå»ºä¸æ¬¡æ§CD/DVDå
çèå建 TOCï¼ç®å½æ°æ®ï¼æä»¶"
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr "为 MP4 ç« èæ è®°åå»ºç« èæ è®°"
+
+#: export_format_dialog.cc:82
msgid "Tag file with session's metadata"
msgstr "ä¼è¯å
æ°æ®çæ ç¾æä»¶"
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "â§"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+"è§èå为EBU-R128 LUFS ç®æ å度没æè¶
åºç»å®ççå®å³°å¼éå¶ãEBU-R128 è§èåä»
å¯"
+"ç¨äºç¬å¥åç«ä½å£°ç®æ ï¼çå®å³°å¼éç¨äºä»»ä½å£°éå¸å±ã"
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a èºæ¯å®¶åå\n"
+"%b æä»¶çåºæ¬åç§°\n"
+"%c çæ\n"
+"%d æä»¶çç®å½\n"
+"%f æä»¶ç宿´ç»å¯¹è·¯å¾\n"
+"%l æè¯ä½è
\n"
+"%n ä¼è¯åç§°\n"
+"%o ææ¥å®¶\n"
+"%t æ é¢\n"
+"%z ç»ç»\n"
+"%A ä¸è¾\n"
+"%C 注é\n"
+"%E å·¥ç¨å¸\n"
+"%G æµæ´¾\n"
+"%L è½¨éæ°æ»è®¡\n"
+"%M æ··é³å¸\n"
+"%N æ¶é´è·¨åº¦åç§°\n"
+"%O 使²å®¶\n"
+"%P å¶ä½äºº\n"
+"%S ç¢ç坿 é¢\n"
+"%T è½¨éæ°é\n"
+"%Y 年份\n"
+"%Z å½å®¶"
+
+#: export_format_dialog.cc:537
msgid "Best (sinc)"
msgstr "æä½³ï¼sincï¼"
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
msgid "Medium (sinc)"
msgstr "ä¸çï¼sincï¼"
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
msgid "Fast (sinc)"
msgstr "å¿«éï¼sincï¼"
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
msgid "Zero order hold"
msgstr "é¶é¶ä¿æ"
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
msgid "Linear encoding options"
msgstr "线æ§ç¼ç é项"
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
msgid "Ogg Vorbis options"
msgstr "Ogg Vorbis é项"
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
msgid "FLAC options"
msgstr "FLAC é项"
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
msgid "Broadcast Wave options"
msgstr "广æWaveé项"
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
msgid "Do you really want to remove the format?"
-msgstr "æ¨æ¯å¦ççè¦ç§»é¤è¿ä¸ªæ ¼å¼ï¼"
+msgstr "æ¨æ¯å¦ççæç®ç§»é¤è¿ä¸ªæ ¼å¼ï¼"
#: export_preset_selector.cc:28
msgid "Preset"
msgstr "é¢è®¾"
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
msgid ""
"The selected preset did not load successfully!\n"
"Perhaps it references a format that has been removed?"
@@ -6475,245 +7415,472 @@ msgstr ""
"被éä¸çé¢è®¾è½½å
¥å¤±è´¥ï¼\n"
"ä¹è®¸å®å¼ç¨äºä¸ä¸ªå·²è¢«å é¤çæ ¼å¼ï¼"
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
msgid "Do you really want to remove this preset?"
msgstr "æ¨æ¯å¦ççè¦ç§»é¤è¿ä¸ªé¢è®¾ï¼"
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
-msgstr "æ¾ç¤ºæ¶é´ä¸ºï¼"
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "å¯¼åºæ¥å/åæ"
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "éæ©ææ"
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "æ ¼å¼ï¼"
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
-msgstr "å°"
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
-msgstr "èå´"
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "é³é¿ï¼"
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
-msgstr "åæé误 %1 (%2)"
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "æ¶é´ç ï¼"
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
-msgstr "è·å声é³èµæºæä»¶ï¼å¨ xml æä»¶éæ²¡ææ£ç¡®çæ ¹"
+#: export_report.cc:185
+msgid "Error:"
+msgstr "é误ï¼"
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
-msgstr "è·å声é³èµæºæä»¶ï¼æ ¹ = %1, ! = ååº"
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr "ï¼éææ¶é´å¤ªçï¼"
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
+#: export_report.cc:222
+msgid "-888"
msgstr ""
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr "å³°å¼ï¼"
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
msgstr ""
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
-msgstr "æ·¡åå¨èªå¨æ¨¡å¼"
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr "çå®å³°å¼ï¼"
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
-msgstr "æ·¡åå¨èªå¨ç±»å"
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "è§èåå¢çï¼"
+
+#: export_report.cc:232
+msgid "+888.88 dB"
msgstr ""
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
-msgid "P"
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr "å·²éæçå度ï¼"
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
msgstr ""
-#: gain_meter.cc:799 panner_ui.cc:609
-msgid "T"
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "å度èå´ï¼"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
msgstr ""
-#: gain_meter.cc:802 panner_ui.cc:612
-msgid "W"
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
msgstr ""
-#: generic_pluginui.cc:83
-msgid "<span size=\"large\">Presets</span>"
-msgstr "<span size=\"large\">é¢è®¾</span>"
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
-#: generic_pluginui.cc:97
-msgid "Manual"
-msgstr "æå"
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
-#: generic_pluginui.cc:106
-msgid "All Automation"
-msgstr "å
¨é¨èªå¨å"
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
-#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "转æ¢"
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+"ä¸\n"
+"å¯ç¨"
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "æ§å¶"
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+"LUFS\n"
+"ï¼çï¼"
-#: generic_pluginui.cc:293
-msgid "Plugin Editor: could not build control element for port %1"
-msgstr "æä»¶ç¼è¾å¨ï¼æ æ³ä¸ºç«¯å£ %1 å»ºç«æ§å¶å
ç´ "
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr "å¤é"
-#: generic_pluginui.cc:318
-msgid "Plugin Editor: no control for property %1"
-msgstr "æä»¶ç¼è¾å¨ï¼æ æ³æ§å¶ %1 屿§"
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr " å¯¹æ°æ å°º|Lg"
-#: generic_pluginui.cc:324
-msgid "Plugin Editor: could not build control element for property %1"
-msgstr "æä»¶ç¼è¾å¨ï¼æ æ³ä¸º %1 屿§å»ºç«æ§å¶å
ç´ "
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr "å·²ç«æ£ç|Rf"
-#: generic_pluginui.cc:468
-msgid "Meters"
-msgstr "èæ"
+#: export_report.cc:605
+msgid "Logscale"
+msgstr " 对æ°å度"
-#: generic_pluginui.cc:490
-msgid "Automation control"
-msgstr "èªå¨æ§å¶"
+#: export_report.cc:606
+msgid "Rectified"
+msgstr "å·²ç«æ£"
-#: generic_pluginui.cc:497
-msgid "Mgnual"
+#: export_report.cc:738
+msgid "Hz"
msgstr ""
-#: global_port_matrix.cc:158
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr "æ£å¨åå
¥å¯¼åºåææ åï¼%1ã"
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "æ æ³è¯»åæä»¶ï¼ %1 (%2)ã"
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "æ æ³è®¿é®å£°é³æä»¶ï¼"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr "æ¾ç¤ºæ¶é´ä¸ºï¼"
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr "宿¶å¯¼åº"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr "éæ©ææ"
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr "å°"
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr "èå´"
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr "åæé误 %1 (%2)"
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr "è·å声é³èµæºæä»¶ï¼å¨ xml æä»¶éæ²¡ææ£ç¡®çæ ¹"
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr "è·å声é³èµæºæä»¶ï¼æ ¹ = %1, ! = ååº"
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr ""
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr "æ·¡åå¨èªå¨æ¨¡å¼"
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr "æ·¡åå¨èªå¨ç±»å"
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr ""
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
+msgid "P"
+msgstr ""
+
+#: gain_meter.cc:822
+msgid "T"
+msgstr ""
+
+#: gain_meter.cc:825
+msgid "W"
+msgstr ""
+
+#: generic_pluginui.cc:83
+msgid "<span size=\"large\">Presets</span>"
+msgstr "<span size=\"large\">é¢è®¾</span>"
+
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
+msgid "Manual"
+msgstr "æå¨"
+
+#: generic_pluginui.cc:107
+msgid "All Automation"
+msgstr "å
¨é¨èªå¨å"
+
+#: generic_pluginui.cc:250
+msgid "Plugin Editor: could not build control element for port %1"
+msgstr "æä»¶ç¼è¾å¨ï¼æ æ³ä¸ºç«¯å£ %1 å»ºç«æ§å¶å
ç´ "
+
+#: generic_pluginui.cc:282
+msgid "Plugin Editor: no control for property %1"
+msgstr "æä»¶ç¼è¾å¨ï¼æ æ³æ§å¶ %1 屿§"
+
+#: generic_pluginui.cc:288
+msgid "Plugin Editor: could not build control element for property %1"
+msgstr "æä»¶ç¼è¾å¨ï¼æ æ³ä¸º %1 屿§å»ºç«æ§å¶å
ç´ "
+
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "转æ¢"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3665
+msgid "Controls"
+msgstr "æ§å¶"
+
+#: generic_pluginui.cc:510
+msgid "Meters"
+msgstr "èæ"
+
+#: generic_pluginui.cc:548
+msgid "Automation control"
+msgstr "èªå¨åæ§å¶"
+
+#: generic_pluginui.cc:555
+msgid "Mgnual"
+msgstr ""
+
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr "è¿ä¸ªæ§å¶ä¸è½è¢«èªå¨åã"
+
+#: global_port_matrix.cc:158
msgid "Audio Connection Manager"
-msgstr "é³é¢è¿ç»ç®¡çå¨"
+msgstr "é³é¢è¿æ¥ç®¡çå¨"
#: global_port_matrix.cc:161
msgid "MIDI Connection Manager"
msgstr "MIDIè¿æ¥ç®¡çå¨"
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
msgid "Disconnect"
-msgstr "åæ¶è¿æ¥"
+msgstr "æ¤éè¿æ¥"
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
msgid "port"
msgstr "端å£"
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
msgid "Selection..."
msgstr "已鿩é¨åâ¦"
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
msgid "Record Enabled..."
-msgstr "å¯ç¨å½å¶â¦"
+msgstr "å·²å¯ç¨å½å¶â¦"
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
msgid "Soloed..."
-msgstr "ç¬å¥â¦"
+msgstr "å·²ç¬å¥â¦"
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "å建æ°åç»æ¥èªäºâ¦"
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "å建带æä½å°çæ°åç»æ¥èªäºâ¦"
+
+#: group_tabs.cc:344
msgid "Create New Group ..."
msgstr "å建æ°çåç»â¦"
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "å建æ°çåç»æ¥èªäº"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "å建带æ§å¶æä½å°çæ°åç»â¦"
-#: group_tabs.cc:324
+#: group_tabs.cc:355
msgid "Edit Group..."
msgstr "ç¼è¾åç»â¦"
-#: group_tabs.cc:325
+#: group_tabs.cc:356
msgid "Collect Group"
msgstr "æ¶éåç»"
-#: group_tabs.cc:326
+#: group_tabs.cc:357
msgid "Remove Group"
msgstr "ç§»é¤åç»"
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr "æå®åç»å°æ§å¶æä½å°â¦"
+
+#: group_tabs.cc:374
msgid "Remove Subgroup Bus"
msgstr "ç§»é¤æ¬¡çº§åç»æ»çº¿"
-#: group_tabs.cc:331
+#: group_tabs.cc:376
msgid "Add New Subgroup Bus"
msgstr "æ·»å æ°ç次级åç»æ»çº¿"
-#: group_tabs.cc:333
+#: group_tabs.cc:378
msgid "Add New Aux Bus (pre-fader)"
-msgstr "æ·»å æ°çè¾
婿»çº¿ï¼å置淡åï¼"
+msgstr "æ·»å æ°çè¾
婿»çº¿ï¼åç½®äºæ·¡åå¨ï¼"
-#: group_tabs.cc:334
+#: group_tabs.cc:379
msgid "Add New Aux Bus (post-fader)"
-msgstr "æ·»å æ°çè¾
婿»çº¿ï¼å置淡åï¼"
+msgstr "æ·»å æ°çè¾
婿»çº¿ï¼åç½®äºæ·¡åå¨ï¼"
+
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr "æå®å·²éæ©é¨åå°æ§å¶æä½å°â¦"
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr "æå®å½å¶å·²å¯ç¨å°æ§å¶æä½å°â¦"
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr "æå®å·²ç¬å¥å°æ§å¶æä½å°â¦"
-#: group_tabs.cc:340
+#: group_tabs.cc:429
msgid "Enable All Groups"
msgstr "å¯ç¨ææåç»"
-#: group_tabs.cc:341
+#: group_tabs.cc:430
msgid "Disable All Groups"
msgstr "ç¦ç¨ææåç»"
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr "è¦ç§»é¤çæ¶é´ä½ç½®ï¼"
+
+#: insert_remove_time_dialog.cc:52
msgid "Time to insert:"
msgstr "è¦æå
¥çæ¶é´ä½ç½®ï¼"
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
msgid "Intersected regions should:"
msgstr "ç¸äº¤çåºååºè¯¥ï¼"
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
msgid "stay in position"
msgstr "åçå¨åä½"
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
msgid "move"
msgstr "ç§»å¨"
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
msgid "be split"
msgstr "æå"
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "卿æçé³è½¨ææ¾åè¡¨ä¸æå
¥æ¶é´"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr "åºç¨å°ææé³è½¨çææ¾å表"
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
msgid "Move glued regions"
msgstr "ç§»å¨è¢«ç²è¿çåºå"
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
msgid "Move markers"
msgstr "ç§»å¨æ è®°"
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
msgid "Move glued markers"
msgstr "ç§»å¨è¢«ç²è¿çæ è®°"
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
msgid "Move locked markers"
msgstr "ç§»å¨è¢«éå®çæ è®°"
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
msgid ""
"Move tempo and meter changes\n"
"<i>(may cause oddities in the tempo map)</i>"
msgstr ""
"ç§»å¨èå¥åèæåå\n"
-"ï¼ä¹è®¸ä¼å¨èå¥å¾ä¸å¼åå¼å¸¸ï¼"
+"<i>ï¼ä¹è®¸ä¼å¨è奿 å°ä¸å¼åå¼å¸¸ï¼</i>"
+
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr "ç§»é¤æ¶é´"
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
msgid "Insert time"
msgstr "æå
¥æ¶é´"
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr "æè¾å
¥çé³é¿æ ææä¸ºé¶ã请è¾å
¥ä¸ä¸ªææçé³é¿"
+
+#: instrument_selector.cc:92
msgid "-none-"
msgstr "â æ â"
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
msgid "Importing file: %1 of %2"
msgstr "导å
¥æä»¶ï¼ %2 ç %1"
@@ -6721,65 +7888,90 @@ msgstr "导å
¥æä»¶ï¼ %2 ç %1"
msgid "I/O selector"
msgstr "è¾å
¥/è¾åºéæ©å¨"
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
msgid "%1 input"
msgstr "%1 è¾å
¥"
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
msgid "%1 output"
msgstr "%1 è¾åº"
-#: keyboard.cc:70
+#: keyboard.cc:93
msgid "your own"
msgstr "æ¨èªå·±ç"
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
msgid "Default keybindings not found - %1 will be hard to use!"
msgstr "æ¾ä¸å°é»è®¤çæé®ç»å®ââ %1 å°å¾é¾ä½¿ç¨ï¼"
-#: keyboard.cc:136
+#: keyboard.cc:160
msgid "Key bindings file \"%1\" not found. Default bindings used instead"
msgstr "æ¾ä¸å°æé®ç»å®æä»¶ \"%1\"ã使ç¨é»è®¤ç»å®æ¿ä»£ã"
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "æ£å¨ä» %1 è½½å
¥æé®ç»å®"
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr "æé®ç»å®å²çª"
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr "该æé®åºåå·²ç»è¢«ç»å®è¿äºã请å
ç§»é¤å
¶å®ç»å®ã"
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "æé®ç»å®"
+
+#: keyeditor.cc:78
msgid "Remove shortcut"
msgstr "ç§»é¤å¿«æ·é®"
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "æä½"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "æç´¢â¦"
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "å¿«æ·é®"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr "æå°"
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "éæ©ä¸ä¸ªæä½ï¼ç¶åæä¸æé®æ¥ï¼éæ°ï¼è®¾ç½®å¿«æ·é®"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr "ç¹å»éç½®æç´¢å符串"
-#: keyeditor.cc:98
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr "è¦ç§»é¤ä¸ä¸ªå¿«æ·é®è¯·éæ©ä¸ä¸ªå¨ä½ç¶åæä¸è¿ä¸ªï¼"
+
+#: keyeditor.cc:109
msgid "Reset Bindings to Defaults"
msgstr "é置为é»è®¤ç»å®"
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "主èå"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "éå®åèå"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "æä½"
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "ç¼è¾å¨èå"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "å¿«æ·é®"
-#: keyeditor.cc:269
+#: keyeditor.cc:370
msgid "RegionList"
msgstr "åºåå表"
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "å¤çå¨èå"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr "æ æ³æå¼ä¸´æ¶æä»¶ç¨æ¥æå°ç»å® (%1)"
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr "æ æ³ä¿åç»å®å°æä»¶ (%1)"
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr "æ ·æ¬"
#: latency_gui.cc:40
msgid "msec"
@@ -6789,108 +7981,223 @@ msgstr "毫ç§"
msgid "period"
msgstr "卿"
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 éæ ·"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:421
msgid "Reset"
msgstr "é¢è®¾"
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
msgid "programming error: %1 (%2)"
msgstr "ç¨åºéè¯¯ï¼ %1 (%2)"
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
msgid "Use PH"
msgstr "ä½¿ç¨ PH"
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "è·³å°"
+
+#: location_ui.cc:63
msgid "Glue"
msgstr "ç²è¿"
-#: location_ui.cc:87
+#: location_ui.cc:88
msgid "Performer:"
msgstr "æ¼å¥è
ï¼"
-#: location_ui.cc:88
+#: location_ui.cc:89
msgid "Composer:"
msgstr "使²å®¶ï¼"
-#: location_ui.cc:90
+#: location_ui.cc:91
msgid "Pre-Emphasis"
msgstr "é¢å é"
-#: location_ui.cc:317
+#: location_ui.cc:319
msgid "Remove this range"
msgstr "ç§»é¤è¿ä¸ªèå´"
-#: location_ui.cc:318
+#: location_ui.cc:320
msgid "Start time - middle click to locate here"
-msgstr "èµ·ç¹æ¶é´ââé¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
+msgstr "èµ·ç¹æ¶é´ ââ é¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
-#: location_ui.cc:319
+#: location_ui.cc:321
msgid "End time - middle click to locate here"
-msgstr "ç»ç¹æ¶é´ââé¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
+msgstr "ç»ç¹æ¶é´ ââ é¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
-#: location_ui.cc:322
+#: location_ui.cc:324
msgid "Set range start from playhead location"
msgstr "仿éä½ç½®è®¾ç½®èå´èµ·ç¹"
-#: location_ui.cc:323
+#: location_ui.cc:325
msgid "Set range end from playhead location"
msgstr "仿éä½ç½®è®¾ç½®èå´ç»ç¹"
-#: location_ui.cc:327
+#: location_ui.cc:329
msgid "Remove this marker"
msgstr "ç§»é¤è¿ä¸ªæ è®°"
-#: location_ui.cc:328
+#: location_ui.cc:330
msgid "Position - middle click to locate here"
-msgstr "ä½ç½®ââé¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
+msgstr "ä½ç½® ââ é¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
-#: location_ui.cc:330
+#: location_ui.cc:332
msgid "Set marker time from playhead location"
msgstr "仿éä½ç½®è®¾ç½®æ è®°æ¶é´"
-#: location_ui.cc:499
+#: location_ui.cc:524
msgid "You cannot put a CD marker at the start of the session"
msgstr "æ¨ä¸è½å¨ä¼è¯èµ·ç¹å¤æ¾ç½®CDæ è®°"
-#: location_ui.cc:725
+#: location_ui.cc:750
msgid "New Marker"
msgstr "æ°å»ºæ è®°"
-#: location_ui.cc:726
+#: location_ui.cc:751
msgid "New Range"
msgstr "æ°å»ºèå´"
-#: location_ui.cc:739
+#: location_ui.cc:764
msgid "<b>Loop/Punch Ranges</b>"
msgstr "<b>循ç¯/忢èå´</b>"
-#: location_ui.cc:764
+#: location_ui.cc:790
msgid "<b>Markers (Including CD Index)</b>"
msgstr "<b>æ è®°ï¼å
æ¬CDç´¢å¼ï¼</b>"
-#: location_ui.cc:799
+#: location_ui.cc:825
msgid "<b>Ranges (Including CD Track Ranges)</b>"
msgstr "<b>èå´ï¼å
æ¬CDé³è½¨èå´ï¼</b>"
-#: location_ui.cc:1042
+#: location_ui.cc:1068
msgid "add range marker"
msgstr "æ·»å èå´æ è®°"
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr "æ·»å /设置"
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr "è°ç¨"
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr "æ°å»ºçµå¼é©"
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "ä¿¡å·"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "å¨ä½ %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr "å¤ä½"
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "æ æ³è¯»åèæ¬ '%1': %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "è¿è¡"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "æ¸
é¤è¾åº"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr "éç½®"
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr "éæ©ç¼è¾å¨ç¼å²"
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "çªå£|Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr "Luaé¤å¤ï¼%1"
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "å é¤ %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr "å é¤ %1 失败"
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+"ç¼ºå¤±èæ¬æä»¶å¤´ã\n"
+"èæ¬è¦æ±ä¸ä¸ª '{ardour}' ä¿¡æ¯è¡¨ä»¥åä¸ä¸ª 'factory' 彿°ã"
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr "èæ¬ç¼è¯å¤±è´¥ã"
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr "æ ææè
ç¼ºå¤±èæ¬åç§°æè
èæ¬ç±»åã"
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+"æ æçèæ¬ç±»åã\n"
+"ææçç±»åæ¯ 'EditorAction' 以å 'Snippet'ã"
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "ä¿å为 %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "ä¿åæä»¶åºéï¼%1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+"带æç»å®åç§° '%1' çèæ¬å·²ç»åå¨ã\n"
+"è¯·å¨æè¿°ä¸ä½¿ç¨ä¸ä¸ªä¸åçåç§°ã"
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr "æåç¼å² %1"
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "å¨ä½ï¼'%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr "çæ®µï¼%1"
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "å¦å为"
+
+#: main.cc:88
msgid "%1 could not connect to the audio backend."
-msgstr "%1æ æ³è¿æ¥å°é³é¢å端ã"
+msgstr "%1 æ æ³è¿æ¥å°é³é¢å端ã"
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
msgid "The audio backend (%1) has failed, or terminated"
msgstr "é³é¢å端ï¼%1ï¼å¤±ææè
䏿¢ã"
-#: main.cc:110
+#: main.cc:138
msgid ""
"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
@@ -6901,13 +8208,13 @@ msgstr ""
"%2 æå¤éåºï¼ä¸æ²¡æéç¥ %1 ã\n"
"\n"
"è¿å¯è½æ¯ç±äºé误é
ç½®æè
å®åå°é误 %2 å
é¨é误ã\n"
-"ç¹å» OK éåº %1ã"
+"ç¹å»âç¡®å®âéåº %1ã"
-#: main.cc:124
+#: main.cc:152
msgid "%2 exited unexpectedly, and without notifying %1."
-msgstr "%2 exited unexpectedly, and without notifying %1."
+msgstr "%2 æå¤éåºï¼ä¸æ²¡æéç¥ %1 ã"
-#: main.cc:219
+#: main.cc:247
msgid ""
"\n"
" %1 could not understand your command line "
@@ -6915,68 +8222,88 @@ msgstr ""
"\n"
" %1 æ æ³è¯å«æ¨çå½ä»¤è¡ "
-#: main.cc:221
+#: main.cc:249
msgid "An error was encountered while launching %1"
msgstr "å¯å¨ %1 æ¶éå°ä¸ä¸ªæå¤é误"
-#: main.cc:310
+#: main.cc:350
msgid " (built using "
msgstr "ï¼æå»ºä½¿ç¨ "
-#: main.cc:313
+#: main.cc:353
msgid " and GCC version "
-msgstr "å GCC çæ¬ "
+msgstr " å GCC çæ¬ "
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr " çæ (C) 1999-2012 Paul Davis"
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr "çæ (C) 1999-2012 Paul Davis"
-#: main.cc:324
+#: main.cc:364
msgid ""
-"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, "
-"Robin Gareus"
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
msgstr ""
"é¨åçæ (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, Robin Gareus"
-#: main.cc:326
+#: main.cc:366
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 ç»å¯¹ä¸é另任使
ä¿"
-#: main.cc:327
+#: main.cc:367
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-msgstr " çè³ä¸å
æ¬å¯é宿§è´¨åéç¨äºä»»ä½ç¹å®ç®ççä¿è¯ã"
+msgstr "çè³ä¸å
æ¬å¯é宿§è´¨åéç¨äºä»»ä½ç¹å®ç®ççä¿è¯ã"
-#: main.cc:328
+#: main.cc:368
msgid "This is free software, and you are welcome to redistribute it "
msgstr "è¿æ¯èªç±è½¯ä»¶ï¼ä¸æ¬¢è¿æ¨ååæ¨å¹¿å®ï¼"
-#: main.cc:329
+#: main.cc:369
msgid "under certain conditions; see the source for copying conditions."
msgstr "å¨ä¸å®æ¡ä»¶ä¸ï¼è¯·åé
å¤å¶åè®®çæºæä»¶ã"
-#: main.cc:334
+#: main.cc:374
msgid "could not initialize %1."
msgstr "æ æ³åå§å %1 ã"
-#: main.cc:344
+#: main.cc:384
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "æ æ³å®è£
å¸è½½ SIGPIPE é误å¤çç¨åº"
-#: main.cc:351
+#: main.cc:391
+msgid "Could not complete pre-GUI initialization"
+msgstr "æ æ³å®æå
导-ç¨æ·å¾å½¢çé¢åå§å"
+
+#: main.cc:398
msgid "could not create %1 GUI"
msgstr "æ æ³å建 %1 å¾å½¢ç¨æ·çé¢"
-#: main_clock.cc:52
+#: main_clock.cc:51
msgid "Display delta to edit cursor"
msgstr "æ¾ç¤ºæ¬¡çº§ä»¥ç¼è¾æ¸¸æ "
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "ç¼è¾èå¥"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "ç¼è¾èæ"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr "æå
¥èå¥åæ¢"
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr "æå
¥èæåæ¢"
+
+#: marker.cc:280
msgid "MarkerText"
msgstr "æ è®°ææ¬"
#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573 rc_option_editor.cc:2203
-#: sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
msgid "None"
msgstr "æ "
@@ -7015,7 +8342,7 @@ msgstr "ä»
å½å¶å·²éä¸ç声é"
#: midi_channel_selector.cc:335
msgid "Force all channels to 1 channel"
-msgstr "å¼ºå¶ææå£°é为 1 声é"
+msgstr "å¼ºå¶ææå£°éå° 1 声é"
#: midi_channel_selector.cc:376
msgid "Inbound"
@@ -7055,19 +8382,19 @@ msgstr "ç¹å»åæ¢åæ¾å£°é %1"
#: midi_channel_selector.cc:628
msgid "Click to force all MIDI channel messages to channel %1"
-msgstr "ç¹å»å¼ºå¶ææMIDI声éåéä¿¡æ¯å°å£°é %1"
+msgstr "å»å¼ºå¶ææMIDI声éåéä¿¡æ¯å°å£°é %1"
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
msgid "Click to toggle recording of channel %1"
msgstr "ç¹å»åæ¢å½å¶å£°é %1"
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
msgid "Click to force all recorded channels to %1"
msgstr "ç¹å»å¼ºå¶ææå·²å½å¶å£°éå° %1"
#: midi_export_dialog.cc:35
msgid "Export MIDI: %1"
-msgstr "导åºMIDIï¼ %1"
+msgstr "导åºMIDIï¼%1"
#: midi_list_editor.cc:56
msgid "Whole"
@@ -7103,7 +8430,7 @@ msgstr "å
åååä¹ä¸"
#: midi_list_editor.cc:106
msgid "Num"
-msgstr "æ°å¼"
+msgstr "ç¼å·"
#: midi_list_editor.cc:108
msgid "Vel"
@@ -7139,19 +8466,19 @@ msgstr "å é¤é³ç¬¦ï¼ä»å表ä¸ï¼"
#: midi_list_editor.cc:602
msgid "change note channel"
-msgstr "忢é³ç¬¦å£°é"
+msgstr "æ¹åé³ç¬¦å£°é"
#: midi_list_editor.cc:610
msgid "change note number"
-msgstr "忢é³ç¬¦ç¼å·"
+msgstr "æ¹åé³ç¬¦ç¼å·"
#: midi_list_editor.cc:620
msgid "change note velocity"
-msgstr "忢é³ç¬¦å度"
+msgstr "æ¹åé³ç¬¦å度"
#: midi_list_editor.cc:690
msgid "change note length"
-msgstr "忢é³ç¬¦é¿åº¦"
+msgstr "æ¹åé³ç¬¦é¿åº¦"
#: midi_port_dialog.cc:39
msgid "Add MIDI Port"
@@ -7165,43 +8492,43 @@ msgstr "端å£åç§°ï¼"
msgid "MidiPortDialog"
msgstr "MIDI端å£å¯¹è¯æ¡"
-#: midi_region_view.cc:859
+#: midi_region_view.cc:855
msgid "channel edit"
msgstr "声éç¼è¾"
-#: midi_region_view.cc:895
+#: midi_region_view.cc:891
msgid "velocity edit"
msgstr "å度ç¼è¾"
-#: midi_region_view.cc:954
+#: midi_region_view.cc:958
msgid "add note"
msgstr "æ·»å é³ç¬¦"
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1902
msgid "step add"
msgstr "æ¥è¿æ·»å "
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
msgid "alter patch change"
msgstr "æ´æ¹é³è²åæ¢"
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2055
msgid "add patch change"
msgstr "æ·»å é³è²åæ¢"
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
msgid "move patch change"
msgstr "ç§»å¨é³è²åæ¢"
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
msgid "delete patch change"
msgstr "å é¤é³è²åæ¢"
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2129
msgid "delete selection"
msgstr "å é¤å·²éåé¨å"
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2146
msgid "delete note"
msgstr "å é¤é³ç¬¦"
@@ -7209,162 +8536,158 @@ msgstr "å é¤é³ç¬¦"
msgid "move notes"
msgstr "ç§»å¨é³ç¬¦"
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3137
msgid "change velocities"
msgstr "æ¹åå度"
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3203
msgid "transpose"
msgstr "åè°"
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3231
msgid "change note lengths"
msgstr "æ¹åé³ç¬¦é¿åº¦"
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3307
msgid "nudge"
msgstr "å¾®è°"
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3322
msgid "change channel"
msgstr "æ¹å声é"
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3370
msgid "Bank "
msgstr "åº"
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "ç¨åº"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3372
msgid "Channel "
msgstr "声é"
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3559
msgid "paste"
msgstr "ç²è´´"
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
msgid "attempt to display MIDI region with no source"
msgstr "å°è¯æ¾ç¤ºæ æ¥æºç MIDI åºå"
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
msgid "attempt to display MIDI region with no model"
msgstr "å°è¯æ¾ç¤ºæ 模å¼ç MIDI åºå"
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
msgid "failed to create MIDI region"
msgstr "å建 MIDI åºå失败"
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
msgid "External MIDI Device"
msgstr "å¤é¨ MIDI 设å¤"
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
msgid "External Device Mode"
msgstr "å¤é¨è®¾å¤æ¨¡å¼"
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
msgid "Chns"
msgstr "声é"
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
msgid "Click to edit channel settings"
msgstr "ç¹å»ç¼è¾å£°é设置"
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
msgid "Show Full Range"
msgstr "æ¾ç¤ºå
¨é¨èå´"
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
msgid "Fit Contents"
msgstr "å¹é
å
容"
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
msgid "Note Range"
msgstr "é³ç¬¦èå´"
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
msgid "Note Mode"
msgstr "é³ç¬¦æ¨¡å¼"
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
msgid "Channel Selector"
msgstr "声ééæ©å¨"
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
msgid "Color Mode"
msgstr "é¢è²æ¨¡å¼"
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
msgid "Bender"
msgstr "æ»é³å¨"
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
msgid "Pressure"
msgstr "åå"
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
msgid "Controllers"
-msgstr "æ§å¶å¨ "
+msgstr "æ§å¶å¨"
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
msgid "No MIDI Channels selected"
msgstr "æªéæ© MIDI 声é"
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
msgid "Hide all channels"
msgstr "éèææå£°é"
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
msgid "Show all channels"
msgstr "æ¾ç¤ºææå£°é"
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
msgid "Channel %1"
msgstr "声é %1"
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
msgid "Controllers %1-%2"
msgstr "æ§å¶å¨ %1-%2"
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
msgid "Controller %1"
msgstr "æ§å¶å¨ %1"
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
msgid "Sustained"
msgstr "æç»"
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
msgid "Percussive"
msgstr "æ²å»"
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
msgid "Meter Colors"
msgstr "èæé¢è²"
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
msgid "Channel Colors"
-msgstr " 声éé¢è²"
+msgstr "声éé¢è²"
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
msgid "Track Color"
msgstr "é³è½¨é¢è²"
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
msgid "all"
msgstr "ææ"
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
msgid "some"
msgstr "ä¸äº"
#: midi_tracer.cc:48
msgid "Line history: "
-msgstr "线æ¡åå²ï¼"
+msgstr "线æ¡ç段åå²ï¼"
#: midi_tracer.cc:55
msgid "Auto-Scroll"
@@ -7374,7 +8697,7 @@ msgstr "èªå¨æ»å¨"
msgid "Decimal"
msgstr "åè¿å¶"
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
msgid "Enabled"
msgstr "å¯ç¨"
@@ -7390,35 +8713,36 @@ msgstr "端å£ï¼"
msgid "New velocity"
msgstr "æ°å»ºå度"
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
msgid "Missing File"
-msgstr "缺失æä»¶"
+msgstr "缺失çæä»¶"
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
msgid "Select a folder to search"
msgstr "éæ©ä¸ä¸ªè¦æç´¢çæä»¶å¤¹"
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
msgid "Add chosen folder to search path, and try again"
msgstr "请添å 已鿩çæä»¶å¤¹å°æç´¢è·¯å¾ï¼ç¶ååè¯ä¸æ¬¡"
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
msgid "Stop loading this session"
msgstr "åæ¢è½½å
¥æ¤ä¼è¯"
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
msgid "Skip all missing files"
msgstr "è·³è¿ææç¼ºå¤±çæä»¶"
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
msgid "Skip this file"
msgstr "è·³è¿è¿ä¸ªæä»¶"
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
msgid "audio"
msgstr "é³é¢"
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
msgid ""
"%1 cannot find the %2 file\n"
"\n"
@@ -7438,394 +8762,515 @@ msgstr ""
"<tt>%4</tt>\n"
"\n"
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
msgid "Click to choose an additional folder"
msgstr "ç¹å»éæ©ä¸ä¸ªé¢å¤çæä»¶å¤¹"
#: missing_plugin_dialog.cc:29
msgid "Missing Plugins"
-msgstr "缺失æä»¶"
+msgstr "缺失çæä»¶"
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
msgid "OK"
+msgstr "ç¡®å®"
+
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
msgstr ""
+"æ¬ä¼è¯å
å«ä¸åæ æ³å¨æ¬ç³»ç»æ¾å°çæä»¶ï¼\n"
+"\n"
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢ç¬å¥"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+"\n"
+"é£äºæä»¶å°è¢«æ¿ä»£ä¸ºéæ¿æ´»çå ä½ç¬¦ã\n"
+"建议æ¨å®è£
缺失çæä»¶å¹¶éæ°å è½½ä¼è¯\n"
+"ï¼ä¹åºè¯¥æ£æ¥é»ååï¼çªå£ > æ¥å¿ 以å é¦é项 > æä»¶ï¼"
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢éé³"
+#: mixer_strip.cc:100 mixer_strip.cc:133
+msgid "pre"
+msgstr "åç½®"
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢å¯å½å¶"
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1548
+#: mixer_strip.cc:1559 rc_option_editor.cc:3147
+msgid "Comments"
+msgstr "注é"
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åå°å¢ç"
+#: mixer_strip.cc:160
+msgid "Click to toggle the width of this mixer strip."
+msgstr "ç¹å»åæ¢æ¤æ··é³å¨ç段ç宽度ã"
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸å 大å¢ç"
+#: mixer_strip.cc:162
+msgid ""
+"\n"
+"%1-%2-click to toggle the width of all strips."
+msgstr ""
+"\n"
+"%1-%2 ââ ç¹å»åæ¢ææç段ç宽度ã"
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸è®¾ç½®å¢ç为 0dB"
+#: mixer_strip.cc:171
+msgid "Hide this mixer strip"
+msgstr "éèæ¤æ··é³å¨ç段"
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "å¤å¶å·²éä¸çå¤çå¨"
+#: mixer_strip.cc:182
+msgid "Click to select metering point"
+msgstr "ç¹å»éæ©è®¡éç¹"
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "åªåå·²éä¸çå¤çå¨"
+#: mixer_strip.cc:198
+msgid "Isolate Solo"
+msgstr "é离ç¬å¥"
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "ç²è´´å·²éä¸çå¤çå¨"
+#: mixer_strip.cc:206
+msgid "Lock Solo Status"
+msgstr "éå®ç¬å¥ç¶æ"
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "å é¤å·²éä¸çå¤çå¨"
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr "ç¬å¥éå®|éå®"
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "éæ©ææï¼å¯è§çï¼å¤çå¨"
+#: mixer_strip.cc:209 mixer_strip.cc:2224
+msgid "Iso"
+msgstr "é离"
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "忢已éä¸çå¤çå¨"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "忢已éä¸çæä»¶"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "ä¸é䏿æç段åå¤çå¨"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "æ»å¨æ··é³å¨çªå£å°å·¦ä¾§"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "为混é³å¨å·²éä¸çé³è½¨/æ»çº¿æ¿æ´»åæ¢ MIDI è¾å
¥"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "ä» %1 è½½å
¥æ··é³å¨ç»å®"
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "å¨æç´¢è·¯å¾ %1 æ¾ä¸å°æ··é³å¨ç»å®"
-
-#: mixer_strip.cc:96 mixer_strip.cc:125
-msgid "pre"
-msgstr "é¢å
"
-
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
-msgid "Comments"
-msgstr "注é"
-
-#: mixer_strip.cc:149
-msgid "Click to toggle the width of this mixer strip."
-msgstr "ç¹å»åæ¢æ¤æ··é³å¨ç段ç宽度ã"
-
-#: mixer_strip.cc:151
-msgid ""
-"\n"
-"%1-%2-click to toggle the width of all strips."
-msgstr ""
-"\n"
-"%1-%2-ç¹å»åæ¢ææç段ç宽度ã"
-
-#: mixer_strip.cc:158
-msgid "Hide this mixer strip"
-msgstr "éèæ¤æ··é³å¨ç段"
-
-#: mixer_strip.cc:169
-msgid "Click to select metering point"
-msgstr "ç¹å»éæ©èæç¹"
-
-#: mixer_strip.cc:185
-msgid "Isolate Solo"
-msgstr "é离ç¬å¥"
-
-#: mixer_strip.cc:193
-msgid "Lock Solo Status"
-msgstr "éå®ç¬å¥ç¶æ"
-
-#: mixer_strip.cc:196 mixer_strip.cc:2027
-msgid "Iso"
-msgstr "é离"
-
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
msgid "Mix group"
msgstr "æ··ååç»"
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr "ä¿®åªï¼"
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
msgid "Phase Invert"
msgstr "ç¸ä½å转"
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
msgid "Record & Monitor"
msgstr "å½å¶åçæ§"
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
msgid "Solo Iso / Lock"
-msgstr "ç¬å¥é离/éå®"
+msgstr "ç¬å¥é离 / éå®"
+
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr "VCA æå®"
+
+#: mixer_strip.cc:545
+msgid "Show/Hide Monitoring Section"
+msgstr "æ¾ç¤º/éèçæ§ä¸çé¨å"
-#: mixer_strip.cc:524
+#: mixer_strip.cc:590
msgid "Enable/Disable MIDI input"
-msgstr "å¯ç¨/ç¦ç¨ MIDI è¾å
¥"
+msgstr "ç¨/ç¦ç¨ MIDI è¾å
¥"
-#: mixer_strip.cc:688
+#: mixer_strip.cc:756
msgid "Aux"
msgstr "è¾
å©"
-#: mixer_strip.cc:710
+#: mixer_strip.cc:782
msgid "Snd"
msgstr "声é³"
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
msgid "Not connected to audio engine - no I/O changes are possible"
-msgstr "æªè¿æ¥å°é³é¢å¼æââä¸å¯è½æ¹åè¾å
¥/è¾åº"
+msgstr "æªè¿æ¥å°é³é¢å¼æ ââ ä¸å¯è½æ¹åè¾å
¥/è¾åº"
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:911 mixer_strip.cc:1014
msgid "Add %1 port"
msgstr "æ·»å %1 端å£"
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
msgid "Routing Grid"
msgstr "è·¯ç±ç½æ ¼"
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1298
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1302
msgid "<b>INPUT</b> to %1"
msgstr "<b>è¾å
¥</b> å° %1"
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1304 monitor_section.cc:1511
msgid "<b>OUTPUT</b> from %1"
msgstr "<b>è¾åº</b> æ¥èª %1"
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1417 monitor_section.cc:1598
msgid "Disconnected"
msgstr "失å»è¿æ¥"
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*注é*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr "ç¹å»æ·»å /ç¼è¾æ³¨é"
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
msgid "Cmt"
msgstr "注é"
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*注é*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "ç¹å»æ·»å /ç¼è¾æ³¨é"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1604
msgid "Grp"
msgstr "åç»"
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1607
msgid "~G"
-msgstr "~G"
+msgstr ""
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
msgid "Color..."
msgstr "é¢è²â¦"
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1650 route_time_axis.cc:587
msgid "Comments..."
msgstr "注éâ¦"
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1652 route_time_axis.cc:589
msgid "Inputs..."
msgstr "è¾å
¥â¦"
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1654 route_time_axis.cc:591
msgid "Outputs..."
msgstr "è¾åºâ¦"
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1659
msgid "Save As Template..."
-msgstr "ä¿å为模æ¿..."
+msgstr "ä¿å为模æ¿â¦"
+
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "æ¿æ´»"
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "精确è¾å
¥/è¾åº"
+
+#: mixer_strip.cc:1683 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "æ¥å£è¿æ¥â¦"
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1687
msgid "Adjust Latency..."
-msgstr "è°æ´å»¶è¿..."
+msgstr "è°æ´å»¶è¿â¦"
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1690
msgid "Protect Against Denormals"
-msgstr "鲿¢å¼å¸¸è¿å"
+msgstr "鲿¢è¿èéè§æ ¼åæ°"
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "è¿ç¨æ§å¶ IDâ¦"
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "å¤å¶â¦"
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:2004
msgid "Pre"
-msgstr "é¢å
"
+msgstr "åç½®"
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2008
msgid "Post"
msgstr "åç½®"
-#: mixer_strip.cc:1847
-msgid "Pr"
-msgstr "é¢å
"
+#: mixer_strip.cc:2024
+msgid "Meter|In"
+msgstr "èæ|å
¥"
-#: mixer_strip.cc:1851
-msgid "Po"
-msgstr "åç½®"
+#: mixer_strip.cc:2028
+msgid "Meter|Pr"
+msgstr "èæ|é¢å
"
-#: mixer_strip.cc:1860
-msgid "C"
-msgstr ""
+#: mixer_strip.cc:2032
+msgid "Meter|Po"
+msgstr "èæ|åç½®"
+
+#: mixer_strip.cc:2036
+msgid "Meter|O"
+msgstr "èæ|O"
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2041
+msgid "Meter|C"
+msgstr "èæ|C"
+
+#: mixer_strip.cc:2202 route_ui.cc:193
msgid "Disk"
msgstr "硬ç"
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr "çæ§"
+
# AFL - Aside Fade Listen. è¡°ååçå¬
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2217 monitor_section.cc:81
msgid "AFL"
-msgstr "å置淡åè¯å¬"
+msgstr "åç½®äºæ·¡åå¨è¯å¬"
# PFL Pre-Fader-Listenè¡°ååçå¬
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2220 monitor_section.cc:82
msgid "PFL"
-msgstr "å置淡åè¯å¬"
+msgstr "åç½®äºæ·¡åå¨è¯å¬"
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr ""
+#: mixer_strip.cc:2230 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr "çæ§å¨è¾å
¥|I"
+
+#: mixer_strip.cc:2231 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr "çæ§å¨ç¡¬ç|D"
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr "çæ§|O"
+
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr "åç½®äºæ·¡åå¨|A"
+
+#: mixer_strip.cc:2249
+msgid "Prefader|P"
+msgstr "åç½®äºæ·¡åå¨|P"
+
+#: mixer_strip.cc:2254
+msgid "SoloIso|I"
+msgstr "ç¬å¥é离|I"
+
+#: mixer_strip.cc:2255
+msgid "SoloLock|L"
+msgstr "ç¬å¥éå®|L"
-#: mixer_strip.cc:2241
+#: mixer_strip.cc:2460
msgid "Pre Fader"
-msgstr "å置淡å"
+msgstr "åç½®äºæ·¡åå¨"
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2461
msgid "Post Fader"
-msgstr "å置淡å"
+msgstr "åç½®äºæ·¡åå¨"
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2506 meter_strip.cc:858
msgid "Change all in Group to %1"
msgstr "æ¹ååç»éææçå° %1"
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2508 meter_strip.cc:860
msgid "Change all to %1"
msgstr "æ¹åææçå° %1"
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2510 meter_strip.cc:862
msgid "Change same track-type to %1"
msgstr "æ¹åç¸å轨éç±»åçå° %1"
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
msgid "Group"
msgstr "åç»"
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "æåç±çæä»¶"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr "为é³è½¨/æ»çº¿ %1 æ·»å GUIï¼å¾å½¢ç¨æ·çé¢ï¼å
ç´ æ¶åºé"
+
+#: mixer_ui.cc:1542
msgid "track display list item for renamed strip not found!"
msgstr "æªæ¾å°é³è½¨æ¾ç¤ºå表çéå½åçæ®µæ¡ç®ï¼"
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
msgid "-all-"
-msgstr "âææâ"
+msgstr "â ææ â"
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
msgid "Strips"
msgstr "çæ®µ"
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr "å°æªéæ©é³è½¨/æ»çº¿ã"
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "æ·»å å¨é¡¶é¨"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "æ·»å åç½®äºæ·¡åå¨"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "æ·»å åç½®äºæ·¡åå¨"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "æ·»å å¨å°¾é¨"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "仿åç±ä¸ç§»é¤"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "å é¤é¢ç½®"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢ç¬å¥"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢éé³"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢å¯å½å¶"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åå°å¢ç"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸å 大å¢ç\" \""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸è®¾ç½®å¢ç为 0dB"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "å¤å¶å·²éä¸çå¤çå¨"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "åªåå·²éä¸çå¤çå¨"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "ç²è´´å·²éä¸çå¤çå¨"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "å é¤å·²éä¸çå¤çå¨"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "éæ©ææï¼å¯è§çï¼å¤çå¨"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "忢已éä¸çå¤çå¨"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "忢已éä¸çæä»¶"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "ä¸é䏿æç段åå¤çå¨"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "æ»å¨æ··é³å¨çªå£å°å·¦ä¾§"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "为混é³å¨å·²éä¸çé³è½¨/æ»çº¿æ¿æ´»åæ¢ MIDI è¾å
¥"
+
+#: meter_strip.cc:160
msgid "Reset Peak"
msgstr "é置峰å¼"
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr "åç½®äºæ·¡åå¨|P"
+
+#: meter_strip.cc:894
msgid "Variable height"
msgstr "åéé«åº¦"
-#: meter_strip.cc:884
+#: meter_strip.cc:895
msgid "Short"
-msgstr "çå°ç"
+msgstr "çå°"
-#: meter_strip.cc:885
+#: meter_strip.cc:896
msgid "Tall"
-msgstr "é«å¤§ç"
+msgstr "é«å¤§"
-#: meter_strip.cc:886
+#: meter_strip.cc:897
msgid "Grande"
-msgstr ""
+msgstr "åºå¤§"
-#: meter_strip.cc:887
+#: meter_strip.cc:898
msgid "Venti"
-msgstr ""
+msgstr "å®å¤§"
-#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "å³°å¼"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr "å³°å¼ï¼+6dBFSï¼"
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr "å³°å¼ï¼0dBFSï¼"
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
msgid "RMS + Peak"
msgstr "åæ¹æ ¹ + å³°å¼"
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
msgid "IEC1/DIN"
msgstr ""
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
msgid "IEC1/Nordic"
msgstr ""
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
msgid "IEC2/BBC"
msgstr ""
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
msgid "IEC2/EBU"
msgstr ""
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
msgstr ""
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
msgstr ""
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
msgstr ""
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
msgid "VU"
msgstr ""
-#: monitor_section.cc:69
+#: monitor_section.cc:80
msgid "SiP"
msgstr ""
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
msgid "Soloing"
msgstr "ç¬å¥ä¸"
-#: monitor_section.cc:100
+#: monitor_section.cc:117
msgid "Isolated"
msgstr "å·²é离"
-#: monitor_section.cc:104
+#: monitor_section.cc:121
msgid "Auditioning"
msgstr "çå¬ä¸"
-#: monitor_section.cc:114
+#: monitor_section.cc:132
msgid ""
"When active, something is solo-isolated.\n"
"Click to de-isolate everything"
@@ -7833,141 +9278,214 @@ msgstr ""
"å¯ç¨æ¶ï¼æäºè¢«ç¬å¥é离ã\n"
"ç¹å»è§£é¤ææçé离"
-#: monitor_section.cc:117
+#: monitor_section.cc:135
msgid ""
"When active, auditioning is active.\n"
"Click to stop the audition"
msgstr ""
"å¯ç¨æ¶ï¼ç嬿¿æ´»ã\n"
-"ç¹å»åæ¢çå¬."
+"ç¹å»åæ¢çå¬"
-#: monitor_section.cc:134
+#: monitor_section.cc:152
msgid "Solo controls affect solo-in-place"
msgstr "ç¬å¥æ§å¶å½±åç¬å¥å
¥ä½"
-#: monitor_section.cc:140
+#: monitor_section.cc:158
msgid "Solo controls toggle after-fader-listen"
-msgstr "ç¬å¥æ§å¶åæ¢å置淡åè¯å¬"
+msgstr "ç¬å¥æ§å¶åæ¢åç½®äºæ·¡åå¨è¯å¬"
-#: monitor_section.cc:146
+#: monitor_section.cc:164
msgid "Solo controls toggle pre-fader-listen"
-msgstr "ç¬å¥æ§å¶åæ¢å置淡åè¯å¬"
+msgstr "ç¬å¥æ§å¶åæ¢åç½®äºæ·¡åå¨è¯å¬"
+
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr "ä¸å±ç¬å¥"
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "ä¸å±ç¬å¥æå³çå¨å䏿¶é´ä»
æä¸ä¸ªç¬å¥æ¯æ¿æ´»ç"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr "ç¬å¥ » éé³"
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"妿å¯ç¨ï¼ç¬å¥å°è¦çéé³\n"
+"ï¼ä¸ä¸ªç¬å¥ä¸éé³çé³è½¨ææ»çº¿å°æä¸ºå¯å¬è§ï¼"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr "å¤çå¨"
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr "å
许ä¸ä¸ªä»¥æ·»å çæ§ææå¤çå¨"
-#: monitor_section.cc:156
+#: monitor_section.cc:206
msgid "Gain increase for soloed signals (0dB is normal)"
msgstr "为ç¬å¥ä¿¡å·å 大å¢çï¼æ£å¸¸å¼ä¸º 0dBï¼"
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
msgid "Solo Boost"
msgstr "ç¬å¥æå"
-#: monitor_section.cc:185
+#: monitor_section.cc:222
msgid ""
"Gain reduction non-soloed signals\n"
"A value above -inf dB causes \"solo-in-front\""
msgstr ""
"å¢çåå°éç¬å¥ä¿¡å·\n"
-"ä¸ä¸ªæ°å¼é«äº -inf dB å¼èµ·âç¬å¥å¨åâ"
+"ä¸ä¸ªæ°å¼é«äº -inf dB å¼èµ·âç¬å¥å¨åâ"
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr "å
³é"
-#: monitor_section.cc:196
+#: monitor_section.cc:233
msgid "SiP Cut"
msgstr "SiP åªå"
-#: monitor_section.cc:211
+#: monitor_section.cc:240
msgid "Gain reduction to use when dimming monitor outputs"
msgstr "å½åå¼±çæ§è¾åºæ¶ï¼åå°å¢çç使ç¨"
-#: monitor_section.cc:225 monitor_section.cc:283
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
msgid "Dim"
msgstr "åå¼±"
-#: monitor_section.cc:235
-msgid "Excl. Solo"
-msgstr "æç¬å¥æé¤å¨å¤"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "ä¸å±ç¬å¥æå³çå¨å䏿¶é´ä»
æä¸ä¸ªç¬å¥æ¯æ¿æ´»ç"
-
-#: monitor_section.cc:244
-msgid "Solo » Mute"
-msgstr "ç¬å¥ » éé³"
-
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:294
+msgid "-30 dB"
msgstr ""
-"妿å¯ç¨ï¼ç¬å¥å°è¦çéé³\n"
-"ï¼ä¸ä¸ªç¬å¥ä¸éé³çé³è½¨ææ»çº¿å°æä¸ºå¯å¬è§ï¼"
-#: monitor_section.cc:323
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr "å转"
+
+#: monitor_section.cc:399
msgid "Monitor"
msgstr "çæ§"
-#: monitor_section.cc:744
+#: monitor_section.cc:897
msgid "Switch monitor to mono"
msgstr "转æ¢çæ§å°å声é"
-#: monitor_section.cc:747
+#: monitor_section.cc:900
msgid "Cut monitor"
msgstr "åªåçæ§"
-#: monitor_section.cc:750
+#: monitor_section.cc:903
msgid "Dim monitor"
msgstr "åå¼±çæ§"
-#: monitor_section.cc:753
+#: monitor_section.cc:906
msgid "Toggle exclusive solo mode"
msgstr "忢ä¸å±çç¬å¥æ¨¡å¼"
-#: monitor_section.cc:759
+#: monitor_section.cc:912
msgid "Toggle mute overrides solo mode"
msgstr "忢éé³è¦çç¬å¥æ¨¡å¼"
-#: monitor_section.cc:771
+#: monitor_section.cc:921
msgid "Cut monitor channel %1"
msgstr "åªåçæ§å£°é %1"
-#: monitor_section.cc:776
+#: monitor_section.cc:926
msgid "Dim monitor channel %1"
msgstr "åå¼±çæ§å£°é %1"
-#: monitor_section.cc:781
+#: monitor_section.cc:931
msgid "Solo monitor channel %1"
msgstr "ç¬å¥çæ§å£°é %1"
-#: monitor_section.cc:786
+#: monitor_section.cc:936
msgid "Invert monitor channel %1"
msgstr "åè½¬çæ§å£°é %1"
-#: monitor_section.cc:796
+#: monitor_section.cc:946
msgid "In-place solo"
msgstr "å
¥ä½ç¬å¥"
-#: monitor_section.cc:798
+#: monitor_section.cc:948
msgid "After Fade Listen (AFL) solo"
-msgstr "è¡°ååçå¬ï¼AFLï¼ç¬å¥"
+msgstr "åç½®äºæ·¡åå¨è¯å¬ï¼AFLï¼ç¬å¥"
-#: monitor_section.cc:800
+#: monitor_section.cc:950
msgid "Pre Fade Listen (PFL) solo"
-msgstr "è¡°ååçå¬ï¼PFLï¼ç¬å¥"
+msgstr "åç½®äºæ·¡åå¨è¯å¬ï¼PFLï¼ç¬å¥"
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr "åæ¢çæ§é¨åå¤ç卿¡"
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr "æ ä¼è¯ ââ ä¸å¯è½æ¹åè¾å
¥/è¾åº"
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr "çæ§è¾åºéæ©å¨"
+
+#: mono_panner.cc:105 stereo_panner.cc:115
msgid "bypassed"
-msgstr "æ¯è·¯"
+msgstr "ç¥è¿"
-#: mono_panner.cc:123
+#: mono_panner.cc:119
#, c-format
msgid "L:%3d R:%3d"
msgstr "å·¦ï¼%3d å³ï¼%3d"
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
+msgid "Panner|L"
+msgstr "声ç¸å¨|å·¦"
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
+msgid "Panner|R"
+msgstr "声ç¸å¨|å³"
+
+#: mono_panner_editor.cc:35
msgid "Mono Panner"
-msgstr "å声é颿¿"
+msgstr "å声é声ç¸å¨"
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49 stereo_panner_editor.cc:46
-#: stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
msgid "%"
msgstr ""
@@ -8000,7 +9518,8 @@ msgid ""
"Congratulations on your session export.\n"
"\n"
"It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
-"to bother you again about this - I'm working on improving our subscriber system\n"
+"to bother you again about this - I'm working on improving our subscriber "
+"system\n"
"so that I don't have to keep annoying you with this message.\n"
"\n"
"If you're not a subscriber, perhaps you might consider supporting my work\n"
@@ -8023,9 +9542,11 @@ msgstr ""
msgid ""
"Congratulations on your session export.\n"
"\n"
-"I hope you find Ardour a useful tool. I'd like to ask you to consider supporting\n"
+"I hope you find Ardour a useful tool. I'd like to ask you to consider "
+"supporting\n"
"its development with either a one-time donation or subscription. Nothing\n"
-"will happen if you choose not to do so. However Ardour's continuing development\n"
+"will happen if you choose not to do so. However Ardour's continuing "
+"development\n"
"relies on a stable, sustainable income stream. Thanks for using Ardour!"
msgstr ""
"æåï¼ä½ çä¼è¯å·²å¯¼åºã\n"
@@ -8035,10 +9556,6 @@ msgstr ""
"ä¸ç®¡ææ ·ï¼ Ardouråç»çå¼åéè¦ä¸ä¸ªç¨³å®ãæç»çèµéæ¥æºã\n"
"æè°¢ä½¿ç¨Ardourï¼"
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "æ°å»ºé¢è®¾"
-
#: new_plugin_preset_dialog.cc:30
msgid "Replace existing preset with this name"
msgstr "ç¨è¿ä¸ªåç§°æ¿ä»£å·²åå¨çé¢è®¾"
@@ -8047,6 +9564,10 @@ msgstr "ç¨è¿ä¸ªåç§°æ¿ä»£å·²åå¨çé¢è®¾"
msgid "Name of new preset"
msgstr "æ°å»ºé¢è®¾çåç§°"
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr "ä»
æ°å»ºæåç±ç"
+
#: normalize_dialog.cc:34
msgid "Normalize regions"
msgstr "è§èååºå"
@@ -8055,17 +9576,17 @@ msgstr "è§èååºå"
msgid "Normalize region"
msgstr "è§èååºå"
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr ""
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "è§èåå°ï¼"
#: normalize_dialog.cc:56
msgid "Normalize each region using its own peak value"
-msgstr "ç¨æ¯ä¸ªåºåå®èªå·±ç峰弿°å¼è§èåæ¯ä¸ªåºå"
+msgstr "ä½¿ç¨æ¯ä¸ªåºåå®èªå·±ç峰弿°å¼è§èåæ¯ä¸ªåºå"
#: normalize_dialog.cc:58
msgid "Normalize each region using the peak value of all regions"
-msgstr "ç¨ææåºåç峰弿°å¼è§èåæ¯ä¸ªåºå"
+msgstr "ä½¿ç¨ææåºåç峰弿°å¼è§èåæ¯ä¸ªåºå"
#: normalize_dialog.cc:73
msgid "Normalize"
@@ -8075,113 +9596,138 @@ msgstr "è§èå"
msgid "Select Note"
msgstr "éæ©é³ç¬¦"
-#: opts.cc:57
+#: opts.cc:61
msgid "Usage: "
msgstr "ç¨æ³ï¼"
-#: opts.cc:58
+#: opts.cc:62
msgid " [SESSION_NAME] Name of session to load\n"
msgstr " [SESSION_NAME] è¦è½½å
¥çä¼è¯çåç§°\n"
-#: opts.cc:59
+#: opts.cc:63
msgid " -v, --version Show version information\n"
msgstr " -v, --version æ¾ç¤ºçæ¬ä¿¡æ¯\n"
-#: opts.cc:60
+#: opts.cc:64
msgid " -h, --help Print this message\n"
msgstr " -h, --help æå°æ¬ä¿¡æ¯\n"
-#: opts.cc:61
-msgid " -a, --no-announcements Do not contact website for announcements\n"
+#: opts.cc:65
+msgid ""
+" -a, --no-announcements Do not contact website for announcements\n"
msgstr " -a, --no-announcements ä¸èç³»ç½ç«å
Œ\n"
-#: opts.cc:62
-msgid " -b, --bindings Print all possible keyboard binding names\n"
+#: opts.cc:66
+msgid ""
+" -b, --bindings Print all possible keyboard binding names\n"
msgstr " -b, --bindings æå°ææå¯è½çé®çç»å®åç§°\n"
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+" -B, --bypass-plugins Bypass all plugins in an existing session\n"
+msgstr " -B, --bypass-plugins ç¥è¿å¨å·²åå¨ä¼è¯ä¸çæææä»¶\n"
+
+#: opts.cc:68
msgid ""
" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
-msgstr " -c, --name <name> 使ç¨ä¸ä¸ªç¹å®çå端客æ·åç§°ï¼é»è®¤æ¯ardour\n"
+msgstr ""
+" -c, --name <name> 使ç¨ä¸ä¸ªç¹å®çå端客æ·åç§°ï¼é»è®¤æ¯ardour\n"
-#: opts.cc:64
-msgid " -d, --disable-plugins Disable all plugins in an existing session\n"
+#: opts.cc:69
+msgid ""
+" -d, --disable-plugins Disable all plugins in an existing session\n"
msgstr " -d, --disable-plugins å¨ä¸ä¸ªå·²åå¨çä¼è¯ä¸ç¦ç¨æææä»¶\n"
-#: opts.cc:65
+#: opts.cc:70
msgid ""
-" -D, --debug <options> Set debug flags. Use \"-D list\" to see available "
-"options\n"
+" -D, --debug <options> Set debug flags. Use \"-D list\" to see "
+"available options\n"
msgstr ""
" -D, --debug <options> 设置è°è¯æ å¿. ä½¿ç¨ \"-D list\" æ¾ç¤ºå¯ç¨çé项\n"
-#: opts.cc:66
+#: opts.cc:71
msgid " -n, --no-splash Do not show splash screen\n"
msgstr " -n, --no-splash 䏿¾ç¤ºéªå±\n"
-#: opts.cc:67
+#: opts.cc:72
msgid " -m, --menus file Use \"file\" to define menus\n"
msgstr " -m, --menus file ä½¿ç¨ \"file\" ï¼æä»¶ï¼æ¥å®ä¹èå\n"
-#: opts.cc:68
-msgid " -N, --new session-name Create a new session from the command line\n"
+#: opts.cc:73
+msgid ""
+" -N, --new session-name Create a new session from the command line\n"
msgstr " -N, --new session-name ä»å½ä»¤è¡å建ä¸ä¸ªæ°çä¼è¯\n"
-#: opts.cc:69
+#: opts.cc:74
msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
msgstr " -O, --no-hw-optimizations ç¦ç¨ h/w ç¹æ®çä¼å\n"
-#: opts.cc:70
+#: opts.cc:75
msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
-msgstr " -P, --no-connect-ports å¨å¯å¨æ¶ä¸è¿æ¥ä»»ä½ç«¯å£ \n"
+msgstr " -P, --no-connect-ports å¨å¯å¨æ¶ä¸è¿æ¥ä»»ä½ç«¯å£\n"
-#: opts.cc:71
+#: opts.cc:76
msgid " -S, --sync Draw the gui synchronously \n"
msgstr " -S, --sync 忥ç»å¶ç¨æ·å¾å½¢çé¢ \n"
-#: opts.cc:73
+#: opts.cc:78
msgid " -V, --novst Do not use VST support\n"
msgstr " -V, --novst ä¸ä½¿ç¨VSTæ¯æ\n"
-#: opts.cc:75
+#: opts.cc:80
msgid ""
-" -E, --save <file> Load the specified session, save it to <file> and "
-"then quit\n"
+" -E, --save <file> Load the specified session, save it to <file> "
+"and then quit\n"
msgstr ""
-" -E, --save <file> è½½å
¥æå®çä¼è¯ï¼ ä¿åå®å¨ <file æä»¶> ä¸å¹¶éåº\n"
+" -E, --save <file> è½½å
¥æå®çä¼è¯ï¼ ä¿åå®å¨ <file æä»¶> ä¸å¹¶é"
+"åº\n"
-#: opts.cc:76
+#: opts.cc:81
msgid " -C, --curvetest filename Curve algorithm debugger\n"
msgstr " -C, --curvetest filename æ²çº¿ç®æ³è°è¯å¨\n"
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/.ardour3/"
-"ardour.bindings)\n"
+#: opts.cc:82
+msgid " -k, --keybindings filename Name of key bindings to load\n"
msgstr ""
" -k, --keybindings æä»¶å è¦è½½å
¥çæé®ç»å®åç§°ï¼é»è®¤æ¯ ~/.ardour3/ardour."
"bindingsï¼\n"
-#: panner2d.cc:854
+#: panner2d.cc:896
msgid "Panner (2D)"
-msgstr "颿¿ï¼2Dï¼"
+msgstr "声ç¸å¨ï¼2Dï¼"
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
msgid "Bypass"
-msgstr "æ¯è·¯"
+msgstr "ç¥è¿"
-#: panner2d.cc:862
+#: panner2d.cc:904
msgid "Panner"
-msgstr "颿¿"
+msgstr "声ç¸å¨"
#: panner_ui.cc:72
msgid "Pan automation mode"
-msgstr "çéèªå¨æ¨¡å¼"
+msgstr "声ç¸èªå¨æ¨¡å¼"
#: panner_ui.cc:73
msgid "Pan automation type"
-msgstr "çéèªå¨ç±»å"
+msgstr "声ç¸èªå¨ç±»å"
+
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr "æå¨|M"
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr "ææ¾|P"
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr "æ¹å¨|T"
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr "ç¼å|W"
#: playlist_selector.cc:43
msgid "Playlists"
@@ -8201,114 +9747,267 @@ msgstr "å
¶ä»é³è½¨"
#: playlist_selector.cc:139
msgid "unassigned"
-msgstr "æªæå®"
+msgstr "æ¤éå·²æå®"
#: playlist_selector.cc:194
msgid "Imported"
msgstr "已导å
¥"
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
msgid "dB scale"
msgstr "dB æ¯ä¾"
-#: plugin_eq_gui.cc:116
+#: plugin_eq_gui.cc:124
msgid "Show phase"
msgstr "æ¾ç¤ºç¸ä½"
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "æå¨è®¾å®"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr "è¾¹é¾çµè·¯"
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr "é³é¢è¾å
¥æ¥å£"
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr "MIDI è¾å
¥æ¥å£"
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr "å®ä¾"
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr "é³é¢è¾åº"
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr "MIDI è¾åº"
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr "è¾åºé¢è®¾"
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr "æ·»å è¾¹é¾çµè·¯è¾å
¥"
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "èªå¨å"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 声é"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "åé端"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr "å»¶è¿ %1 spl%2 %3"
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr "éåæå¨å°"
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr "å»¶è¿ %1 spl"
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr "å®ä¾ #%1"
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr "æ æ³å»ºç«æ°çåéç«¯ï¼ %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "æ¥å£é
ç½®ï¼%1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "æä»¶è®¾ç½®"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr "å¤å¶è¾å
¥/è¾åºæ å°å¾"
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr "ä¸ä¸ªä¹å¨æä»¶å·²åå¤å°±ç»ªã"
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr "æ¿æ¢"
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr "é带"
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr "è¾å
¥/è¾åºæ¥å£æ å°"
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr "é
ç½®æä»¶ '%1'"
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "è¾åºé
ç½®"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
msgid "Name contains"
msgstr "åç§°å
å«"
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
msgid "Type contains"
msgstr "ç±»åå
å«"
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
msgid "Category contains"
-msgstr "ç±»åå
å«"
+msgstr "ç±»å«å
å«"
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
msgid "Author contains"
msgstr "ä½è
å
å«"
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
msgid "Library contains"
msgstr "åºå
å«"
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
msgid "Favorites only"
-msgstr "ä»
æ¶è"
+msgstr "ä»
æåç±ç"
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
msgid "Hidden only"
msgstr "ä»
éè"
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
msgid "Plugin Manager"
msgstr "æä»¶ç®¡ç"
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
msgid "Fav"
-msgstr "æ¶è"
+msgstr "æåç±ç"
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
msgid "Available Plugins"
msgstr "å¯ç¨æä»¶"
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
msgid "Type"
msgstr "ç±»å"
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
msgid "Category"
msgstr "ç±»å«"
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
msgid "Creator"
msgstr "å建è
"
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
msgid "# Audio In"
msgstr "# é³é¢è¾å
¥"
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
msgid "# Audio Out"
msgstr "# é³é¢è¾åº"
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
msgid "# MIDI In"
msgstr "# MIDIè¾å
¥"
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
msgid "# MIDI Out"
msgstr "# MIDIè¾åº"
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
msgid "Plugins to be connected"
msgstr "è¢«è¿æ¥çæä»¶"
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
msgid "Add a plugin to the effect list"
msgstr "æ·»å ä¸ä¸ªæä»¶å°ææå表"
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
msgid "Remove a plugin from the effect list"
msgstr "仿æå表ä¸ç§»é¤ä¸ä¸ªæä»¶"
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "æ´æ°å¯ç¨æä»¶"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr "æ¾ç¤ºå·²éèç"
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr "å
æ¬å表ä¸éèçæä»¶ã"
-#: plugin_selector.cc:172
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr "ä¹å¨"
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr "å¾ªç¯æ¾ç¤ºä¹å¨æä»¶ï¼å¦ææçè¯ï¼ã"
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr "åæä»ª"
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr "å¾ªç¯æ¾ç¤ºåæä»ªæä»¶ï¼å¦ææçè¯ï¼ã"
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr "å·¥å
·"
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr "å¾ªç¯æ¾ç¤ºå·¥å
·æä»¶ï¼å¦ææçè¯ï¼ã"
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr "滤é"
+
+#: plugin_selector.cc:232
msgid "Insert Plugin(s)"
msgstr "æå
¥æä»¶"
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
msgid "variable"
msgstr "åé"
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
msgid ""
"The plugin \"%1\" could not be loaded\n"
"\n"
@@ -8318,43 +10017,43 @@ msgstr ""
"\n"
"æ´å¤çä¿¡æ¯ï¼ä¹è®¸å¯ä»¥ï¼åé
æ¥å¿çªå£"
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
msgid "Favorites"
-msgstr "æ¶è"
+msgstr "æåç±ç"
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
msgid "Plugin Manager..."
msgstr "æä»¶ç®¡çå¨â¦"
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
msgid "By Creator"
-msgstr "æ ¹æ®å建è
"
+msgstr "æå建è
"
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
msgid "By Category"
-msgstr "æ ¹æ®ç±»å«"
+msgstr "æç±»å«"
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "å¢ï¼LADSPAæä»¶æ²¡æç¼è¾å¨ï¼"
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
msgid ""
-"unknown type of editor-supplying plugin (note: no VST support in this version of "
-"%1)"
+"unknown type of editor-supplying plugin (note: no VST support in this "
+"version of %1)"
msgstr "æªç¥çç¼è¾å¨åºç¨æä»¶ç±»åï¼æ³¨æï¼å¨è¿ä¸ª %1 çæ¬æ VST æ¯æï¼"
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr "æªç¥çç¼è¾å¨åºç¨æä»¶ç±»å"
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
msgid ""
-"unknown type of editor-supplying plugin (note: no linuxVST support in this version "
-"of %1)"
+"unknown type of editor-supplying plugin (note: no linuxVST support in this "
+"version of %1)"
msgstr "æªç¥çç¼è¾å¨åºç¨æä»¶ç±»åï¼æ³¨æï¼å¨è¿ä¸ª %1 çæ¬æ linuxVST æ¯æï¼"
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr "å建_lv2_ç¼è¾å¨è°ç¨ non-LV2 æä»¶"
@@ -8362,15 +10061,15 @@ msgstr "å建_lv2_ç¼è¾å¨è°ç¨ non-LV2 æä»¶"
msgid "Add"
msgstr "æ·»å "
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
msgid "Description"
msgstr "说æ"
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
msgid "Plugin analysis"
msgstr "æä»¶åæ"
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
@@ -8378,140 +10077,162 @@ msgstr ""
"é¢è®¾è¿ä¸ªæä»¶ï¼å¦ææçè¯ï¼\n"
"ï¼å
æ¬åºå设置åç¨æ·å建ç设置ï¼"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
msgid "Save a new preset"
msgstr "ä¿åä¸ä¸ªæ°çé¢è®¾"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
msgid "Save the current preset"
msgstr "ä¿åå½åé¢è®¾"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
msgid "Delete the current preset"
msgstr "å é¤å½åé¢è®¾"
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr "åæ°é置为é»è®¤ï¼å¦ææ²¡æåæ°å¤å¨èªå¨å模å¼ï¼"
+
+#: plugin_ui.cc:436
msgid "Disable signal processing by the plugin"
msgstr "ææä»¶ç¦ç¨ä¿¡å·å¤ç"
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
msgid ""
-"Click to allow the plugin to receive keyboard events that %1 would normally use as "
-"a shortcut"
+"Click to allow the plugin to receive keyboard events that %1 would normally "
+"use as a shortcut"
msgstr "åå»å
è®¸æ¤æä»¶æ¥åé®çäºä»¶ï¼ä»¥ä¾¿ %1 å¯ä»¥æ£å¸¸å°ä½ä¸ºä¸ä¸ªå¿«æ·é®ä½¿ç¨"
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
msgid "Click to enable/disable this plugin"
msgstr "åå»å¯ç¨/ç¦ç¨æ¤æä»¶"
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
-msgstr[0] "å»¶è¿ï¼%1 éæ ·ï¼"
+msgstr[0] "å»¶è¿ï¼%1 æ ·æ¬ï¼"
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
msgid "latency (%1 ms)"
msgstr "å»¶è¿ï¼%1 毫ç§ï¼"
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
msgid "Edit Latency"
msgstr "ç¼è¾å»¶è¿"
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
msgid ""
-"Plugin presets are not supported in this build of %1. Consider paying for a full "
-"version"
-msgstr "æä»¶é¢è®¾å¨æ¬ä¸ª %1 æå»ºä¸ä¸æ¯æã请èèä¸ºå®æ´çæ¬ä»"
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr "æä»¶é¢è®¾å¨æ¬ä¸ª %1 æå»ºä¸ä¸æ¯æã请èèä¸ºå®æ´çæ¬ä»è´¹"
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
msgid ""
"Plugin presets are not supported in this build, see the Log window for more "
"information."
msgstr "æä»¶é¢è®¾å¨æ¬æå»ºä¸ä¸æ¯æï¼æ´å¤ä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "æ°å»ºé¢è®¾"
+
+#: plugin_ui.cc:688
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "åå»å
许æ£å¸¸ä½¿ç¨ %1 é®çå¿«æ·é®"
-#: port_group.cc:337
+#: plugin_ui.cc:795
+msgid "(none)"
+msgstr "ï¼æ ï¼"
+
+#: port_group.cc:338
msgid "%1 Busses"
msgstr "%1 æ»çº¿"
-#: port_group.cc:338
+#: port_group.cc:339
msgid "%1 Tracks"
msgstr "%1 é³è½¨"
-#: port_group.cc:339
+#: port_group.cc:340
msgid "Hardware"
msgstr "硬件"
-#: port_group.cc:340
+#: port_group.cc:341
msgid "%1 Misc"
msgstr "%1 æé¡¹"
-#: port_group.cc:341
+#: port_group.cc:342
msgid "Other"
msgstr "å
¶å®"
-#: port_group.cc:432 port_group.cc:433
+# çºµåæ¶é´ç ï¼LTCï¼Longitidinal time codeï¼
+#: port_group.cc:435 port_group.cc:436
msgid "LTC Out"
-msgstr "LTC è¾åº"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼è¾åº"
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:439 port_group.cc:440
msgid "LTC In"
-msgstr "LTC è¾å
¥"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼è¾å
¥"
-#: port_group.cc:463
+#: port_group.cc:474
msgid "MTC in"
-msgstr "MTC è¾å
¥"
+msgstr "MTCï¼MIDIæ¶é´ç ï¼è¾å
¥"
-#: port_group.cc:466
+#: port_group.cc:477
msgid "MIDI control in"
msgstr "MIDI æ§å¶è¾å
¥"
-#: port_group.cc:469
+#: port_group.cc:480
msgid "MIDI clock in"
msgstr "MIDI 计æ¶å¨è¾å
¥"
-#: port_group.cc:472
+#: port_group.cc:483
msgid "MMC in"
-msgstr "MMC è¾å
¥"
+msgstr "MMCï¼MIDIæ¶é´æ§å¶ï¼è¾å
¥"
-#: port_group.cc:476
+#: port_group.cc:487
msgid "MTC out"
-msgstr "MTC è¾åº"
+msgstr "MTCï¼MIDIæ¶é´ç ï¼è¾åº"
-#: port_group.cc:479
+#: port_group.cc:490
msgid "MIDI control out"
msgstr "MIDI æ§å¶è¾åº"
-#: port_group.cc:482
+#: port_group.cc:493
msgid "MIDI clock out"
msgstr "MIDI 计æ¶å¨è¾åº"
-#: port_group.cc:485
+#: port_group.cc:496
msgid "MMC out"
-msgstr "MMC è¾åº"
+msgstr "MMCï¼MIDIæ¶é´æ§å¶ï¼è¾åº"
-#: port_group.cc:532
+#: port_group.cc:555
msgid ":monitor"
msgstr "ï¼çæ§"
-#: port_group.cc:544
+#: port_group.cc:571
msgid "system:"
msgstr "ç³»ç»ï¼"
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:572
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:573
+msgid "alsa_midi:"
msgstr ""
+#: port_group.cc:578
+msgid "Scene "
+msgstr "åºæ¯"
+
#: port_insert_ui.cc:39
msgid "Measure Latency"
msgstr "æµéå»¶è¿"
#: port_insert_ui.cc:50
msgid "Send/Output"
-msgstr "åé/è¾åº"
+msgstr "åé端/è¾åº"
#: port_insert_ui.cc:51
msgid "Return/Input"
@@ -8525,80 +10246,76 @@ msgstr "æªæ£æµå°ä¿¡å·"
msgid "Port Insert "
msgstr "ç«¯å£æå
¥"
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
msgid "<b>Sources</b>"
-msgstr "<b>æº</b>"
+msgstr "<b>æ¥æº</b>"
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
msgid "<b>Destinations</b>"
-msgstr "<b>ç®çå°</b>"
+msgstr "<b>ç®æ </b>"
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
#, c-format
msgid "Add %s %s"
msgstr "æ·»å %s %s"
-#: port_matrix.cc:456
+#: port_matrix.cc:466
#, c-format
msgid "Rename '%s'..."
msgstr "éå½å '%s'..."
-#: port_matrix.cc:472
+#: port_matrix.cc:482
msgid "Remove all"
msgstr "ç§»é¤ææ"
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
#, c-format
msgid "%s all"
msgstr "%s ææ"
-#: port_matrix.cc:527
+#: port_matrix.cc:537
msgid "Rescan"
msgstr "éæ°æ«æ"
-#: port_matrix.cc:529
+#: port_matrix.cc:539
msgid "Show individual ports"
msgstr "æ¾ç¤ºå个端å£"
-#: port_matrix.cc:535
+#: port_matrix.cc:545
msgid "Flip"
msgstr "轻弹"
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track or buss "
-"cannot support the new configuration."
-msgstr "ä¸å¯è½å¨æ¤æ·»å ä¸ä¸ªç«¯å£ï¼ä½ä¸ºå¨é³è½¨ææ»çº¿éç第ä¸ä¸ªå¤ç卿 æ³æ¯ææ°çé
ç½®ã"
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
+msgstr "ä¸å¯è½å¨è¿éæ·»å ä¸ä¸ªç«¯å£ã"
-#: port_matrix.cc:725
+#: port_matrix.cc:733
msgid "Cannot add port"
msgstr "æ æ³æ·»å 端å£"
-#: port_matrix.cc:747
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "æåç端å£ä¸è½è¢«ç§»é¤"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "è¿ä¸ªç«¯å£ä¸è½è¢«ç§»é¤ã"
+
+#: port_matrix.cc:765
msgid "Port removal not allowed"
msgstr "ä¸å
许移é¤ç«¯å£"
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"该端å£ä¸è½è¢«ç§»é¤ã\n"
-"ä¸è®ºæ¯æ°çè¾å
¥å·ç æè
æåä¸ä¸ªæä»¶ææ´å¤çè¾åºï¼\n"
-"å¨é³è½¨ææ»çº¿éç第ä¸ä¸ªæä»¶é½æ æ³æ¥åã"
-
-#: port_matrix.cc:965
+#: port_matrix.cc:981
#, c-format
msgid "Remove '%s'"
msgstr "ç§»é¤ '%s'"
-#: port_matrix.cc:980
+#: port_matrix.cc:996
#, c-format
msgid "%s all from '%s'"
msgstr "%s æææ¥èªäº '%s'"
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
msgid "channel"
msgstr "声é"
@@ -8608,17 +10325,17 @@ msgstr "没æç«¯å£å¯è¿æ¥ã"
#: port_matrix_body.cc:84
msgid "There are no %1 ports to connect."
-msgstr "没æ %1 端å£å¯è¿æ¥."
+msgstr "没æ %1 端å£å¯è¿æ¥ã"
-#: processor_box.cc:150
-msgid "Send"
-msgstr "åé"
-
-#: processor_box.cc:152
+#: processor_box.cc:226
msgid "Return"
msgstr "è¿å"
-#: processor_box.cc:310
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr "为 \"%1\" æ°å»ºæåç±çé¢è®¾"
+
+#: processor_box.cc:501
msgid ""
"\n"
"This mono plugin has been replicated %1 times."
@@ -8626,17 +10343,17 @@ msgstr ""
"\n"
"è¿ä¸ªå声éæä»¶å·²ç»è¢«å¤å¶äº %1 次ã"
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1528
msgid ""
"<b>%1</b>\n"
"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
msgstr ""
"<b>%1</b>\n"
"å廿¾ç¤ºå¾å½¢ç¨æ·çé¢ã\n"
-"Alt+å廿¾ç¤ºéç¨å¾å½¢ç¨æ·çé¢ã%2"
+"%2+å廿¾ç¤ºéç¨å¾å½¢ç¨æ·çé¢ã%3"
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1531
msgid ""
"<b>%1</b>\n"
"Double-click to show generic GUI.%2"
@@ -8644,48 +10361,72 @@ msgstr ""
"<b>%1</b>\n"
"å廿¾ç¤ºéç¨å¾å½¢ç¨æ·çé¢ã%2"
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+"<b>%1</b>\n"
+"æä»¶å¨æ¬ç³»ç»ä¸ä¸å¯ç¨\n"
+"å¹¶ä¸å·²ç»è¢«ä¸ä¸ªå ä½ç¬¦åè代ä¹ã"
+
+#: processor_box.cc:600
#, c-format
msgid "(%1x1) "
msgstr ""
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr "å
èæ¾ç¤º"
+
+#: processor_box.cc:703
msgid "Show All Controls"
msgstr "æ¾ç¤ºæææ§å¶"
-#: processor_box.cc:441
+#: processor_box.cc:707
msgid "Hide All Controls"
msgstr "éèæææ§å¶"
-#: processor_box.cc:475
+#: processor_box.cc:752
msgid "Link panner controls"
-msgstr "龿¥é¢æ¿æ§å¶"
+msgstr "龿¥å£°ç¸å¨æ§å¶"
-#: processor_box.cc:575
+#: processor_box.cc:859
msgid "on"
msgstr "å¼å¯"
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
msgid "off"
msgstr "å
³é"
-#: processor_box.cc:957
+#: processor_box.cc:1819
msgid ""
"Right-click to add/remove/edit\n"
"plugins,inserts,sends and more"
msgstr ""
"å³é®ç¹å»æ·»å /ç§»é¤/ç¼è¾\n"
-"æä»¶ãæå
¥ãåé以忴å¤"
+"æä»¶ãæå
¥ãåéç«¯ä»¥åæ´å¤"
+
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+"å¤ç卿/æ¾å¤±è´¥ã\n"
+"å¯è½æ¯å 为æä»¶çè¾å
¥/è¾åºé
ç½®\n"
+"æ æ³å¹é
è¿æ¡é³è½¨çé
ç½®ã"
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:2455 processor_box.cc:2998
msgid "Plugin Incompatibility"
msgstr "æä»¶ä¸å
¼å®¹"
-#: processor_box.cc:1432
+#: processor_box.cc:2458
msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
msgstr "æ¨è¯å¾å¨ç©ºä½ %2 䏿·»å æä»¶ \"%1\" ã\n"
-#: processor_box.cc:1438
+#: processor_box.cc:2464
msgid ""
"\n"
"This plugin has:\n"
@@ -8693,17 +10434,17 @@ msgstr ""
"\n"
"æ¤æä»¶æï¼\n"
-#: processor_box.cc:1441
+#: processor_box.cc:2467
msgid "\t%1 MIDI input\n"
msgid_plural "\t%1 MIDI inputs\n"
msgstr[0] "\t%1 MIDI è¾å
¥\n"
-#: processor_box.cc:1445
+#: processor_box.cc:2471
msgid "\t%1 audio input\n"
msgid_plural "\t%1 audio inputs\n"
msgstr[0] "\t%1 é³é¢è¾åº\n"
-#: processor_box.cc:1448
+#: processor_box.cc:2474
msgid ""
"\n"
"but at the insertion point, there are:\n"
@@ -8711,17 +10452,17 @@ msgstr ""
"\n"
"ä½å¨æå
¥ç¹é£éæï¼\n"
-#: processor_box.cc:1451
+#: processor_box.cc:2477
msgid "\t%1 MIDI channel\n"
msgid_plural "\t%1 MIDI channels\n"
msgstr[0] "\t%1 MIDI 声é\n"
-#: processor_box.cc:1455
+#: processor_box.cc:2481
msgid "\t%1 audio channel\n"
msgid_plural "\t%1 audio channels\n"
msgstr[0] "\t%1 é³é¢å£°é\n"
-#: processor_box.cc:1458
+#: processor_box.cc:2484
msgid ""
"\n"
"%1 is unable to insert this plugin here.\n"
@@ -8729,33 +10470,29 @@ msgstr ""
"\n"
"%1 æ æ³å¨æ¤å¤å次æå
¥æä»¶.\n"
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "æ æ³å»ºç«æ°çåéï¼ %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:3001
msgid ""
"You cannot reorder these plugins/sends/inserts\n"
"in that way because the inputs and\n"
"outputs will not work correctly."
msgstr ""
"æ¨ä¸è½ä»¥è¿ç§æ¹å¼\n"
-"è¦æ±è¿äºæä»¶/åé/æå
¥\n"
+"è¦æ±è¿äºæä»¶/åé端/æå
¥\n"
"å 为è¾å
¥åè¾åºå°æ æ³æ£ç¡®å·¥ä½ã"
-#: processor_box.cc:1991
+#: processor_box.cc:3201
msgid "Rename Processor"
msgstr "éå½åå¤çå¨"
-#: processor_box.cc:2022
+#: processor_box.cc:3232
msgid "At least 100 IO objects exist with a name like %1 - name not changed"
msgstr "è³å°æ100个è¾å
¥è¾åºå¯¹è±¡ç©ä½åå¨çå %1è¿æ ·çåç§°ââåç§°æ²¡ææ¹å"
-#: processor_box.cc:2159
+#: processor_box.cc:3383
msgid "plugin insert constructor failed"
msgstr "æä»¶æå
¥æé 彿°å¤±è´¥"
-#: processor_box.cc:2170
+#: processor_box.cc:3394
msgid ""
"Copying the set of processors on the clipboard failed,\n"
"probably because the I/O configuration of the plugins\n"
@@ -8765,7 +10502,7 @@ msgstr ""
"å¯è½æ¯å 为æä»¶çè¾å
¥/è¾åºé
ç½®\n"
"æ æ³å¹é
è¿æ¡é³è½¨çé
ç½®ã"
-#: processor_box.cc:2216
+#: processor_box.cc:3440
msgid ""
"Do you really want to remove all processors from %1?\n"
"(this cannot be undone)"
@@ -8773,83 +10510,83 @@ msgstr ""
"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçå¤çå¨ï¼\n"
"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3444 processor_box.cc:3469
msgid "Yes, remove them all"
msgstr "æ¯çï¼å
¨é¨ç§»é¤å®ä»¬"
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3446 processor_box.cc:3471
msgid "Remove processors"
msgstr "ç§»é¤å¤çå¨"
-#: processor_box.cc:2237
+#: processor_box.cc:3461
msgid ""
"Do you really want to remove all pre-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçå置淡åå¤çå¨ï¼\n"
+"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçåç½®äºæ·¡åå¨å¤çå¨ï¼\n"
"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-#: processor_box.cc:2240
+#: processor_box.cc:3464
msgid ""
"Do you really want to remove all post-fader processors from %1?\n"
"(this cannot be undone)"
msgstr ""
-"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçå置淡åå¤çå¨ï¼\n"
+"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçåç½®äºæ·¡åå¨å¤çå¨ï¼\n"
"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-#: processor_box.cc:2428
+#: processor_box.cc:3653
msgid "New Plugin"
msgstr "æ°å»ºæä»¶"
-#: processor_box.cc:2431
+#: processor_box.cc:3656
msgid "New Insert"
msgstr "æ°å»ºæå
¥"
-#: processor_box.cc:2434
+#: processor_box.cc:3659
msgid "New External Send ..."
-msgstr "æ°å»ºå¤é¨åéâ¦"
+msgstr "æ°å»ºå¤é¨åé端â¦"
-#: processor_box.cc:2438
+#: processor_box.cc:3663
msgid "New Aux Send ..."
-msgstr "æ°å»ºè¾
å©åé"
+msgstr "æ°å»ºè¾
å©åé端â¦"
-#: processor_box.cc:2441
+#: processor_box.cc:3666
msgid "Send Options"
-msgstr "åéé项"
+msgstr "åé端é项"
-#: processor_box.cc:2443
+#: processor_box.cc:3668
msgid "Clear (all)"
msgstr "æ¸
é¤ï¼ææï¼"
-#: processor_box.cc:2445
+#: processor_box.cc:3670
msgid "Clear (pre-fader)"
-msgstr "æ¸
é¤ï¼å置淡åï¼"
+msgstr "æ¸
é¤ï¼åç½®äºæ·¡åå¨ï¼"
-#: processor_box.cc:2447
+#: processor_box.cc:3672
msgid "Clear (post-fader)"
-msgstr "æ¸
é¤ï¼å置淡åï¼"
+msgstr "æ¸
é¤ï¼åç½®äºæ·¡åå¨ï¼"
-#: processor_box.cc:2473
+#: processor_box.cc:3702
msgid "Activate All"
msgstr "æ¿æ´»ææ"
-#: processor_box.cc:2475
+#: processor_box.cc:3704
msgid "Deactivate All"
msgstr "䏿¿æ´»ææ"
-#: processor_box.cc:2477
+#: processor_box.cc:3706
msgid "A/B Plugins"
msgstr "A/B æä»¶"
-#: processor_box.cc:2486
+#: processor_box.cc:3719
msgid "Edit with generic controls..."
msgstr "以éç¨æ§å¶ç¼è¾â¦"
-#: processor_box.cc:2789
+#: processor_box.cc:4051
msgid "%1: %2 (by %3)"
msgstr "%1: %2ï¼éè¿ %3ï¼"
-#: processor_box.cc:2791
+#: processor_box.cc:4053
msgid "%1 (by %2)"
msgstr "%1ï¼éè¿ %2ï¼"
@@ -8877,363 +10614,458 @@ msgstr "åº"
msgid "main grid"
msgstr "主è¦ç½æ ¼"
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
msgid "Quantize"
-msgstr "æ°å转æ¢"
+msgstr "éå"
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
msgid "Strength"
msgstr "强度"
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
msgid "Swing"
msgstr "æå¨"
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
msgid "Threshold (ticks)"
msgstr "临çå¼ï¼è¯å«å£°ï¼"
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
msgid "Snap note start"
-msgstr "对é½é³ç¬¦èµ·ç¹"
+msgstr "å¸éé³ç¬¦èµ·ç¹"
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
msgid "Snap note end"
-msgstr "对é½é³ç¬¦ç»ç¹"
-
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "åå»é³é¢æä»¶ï¼"
+msgstr "å¸éé³ç¬¦ç»ç¹"
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
msgid "Browse..."
msgstr "æµè§â¦"
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr "å éç¬¬ä¸æï¼"
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr "使ç¨é»è®¤è¯å«å£°ï¼"
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "ç¹å»é³é¢æä»¶ï¼"
+
+#: rc_option_editor.cc:108
msgid "Click emphasis audio file:"
msgstr "ç¹å»å éé³é¢æä»¶ï¼"
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
msgid "Choose Click"
msgstr "éæ©ç¹å»"
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
msgid "Choose Click Emphasis"
msgstr "éæ©ç¹å»å é"
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
msgid "Limit undo history to"
msgstr "éå¶æ¤éåå²å°"
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
msgid "Save undo history of"
msgstr "ä¿åæ¤éåå²"
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
msgid "commands"
msgstr "å½ä»¤"
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+"\n"
+"æ¤å¤è®¾ç½®çæ¹åå°ä¼ä»
æç»å°æ¨ç项ç®è¢«ä¿å为æ¢ã"
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr "<b>æ¨è设置ï¼%1 + æé® 3 ï¼é¼ æ å³é®ï¼</b>%2"
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr "éæ©é®çå¸å±ï¼"
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr "å½ç¹å»æ¶ï¼"
+
+#: rc_option_editor.cc:429
msgid "Edit using:"
msgstr "ç¼è¾ä½¿ç¨ï¼"
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
msgid "+ button"
msgstr "+æé®"
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
msgid "Delete using:"
msgstr "å é¤ä½¿ç¨ï¼"
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr "<b>æ¨è设置ï¼%1 + æé® 1 ï¼é¼ æ å·¦é®ï¼</b>%2"
+
+#: rc_option_editor.cc:489
msgid "Insert note using:"
msgstr "æå
¥é³ç¬¦ä½¿ç¨ï¼"
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr "å½å¼å§ä¸ä¸ªææ½æ¶ï¼"
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr "<b>æ¨è设置ï¼%1</b>%2"
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr "å¤å¶é¡¹ç®ä½¿ç¨ï¼"
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr "çº¦æææ½ä½¿ç¨ï¼"
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr "å½å¼å§ä¸ä¸ªä¿®åªï¼"
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr "ä¿®åªå
容使ç¨ï¼"
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr "éå®ä¿®åªä½¿ç¨ï¼"
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr "è°æ´é³ç¬¦ç¸å¯¹å¤§å°ä½¿ç¨ï¼"
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr "卿æ½è¿ç¨ä¸ï¼"
+
+#: rc_option_editor.cc:684
msgid "Ignore snap using:"
-msgstr "忽ç¥é³ç¬¦ä½¿ç¨ï¼"
+msgstr "忽ç¥å¸é使ç¨ï¼"
+
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr "ç¸å¯¹å¸é使ç¨ï¼"
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr "å¨ä¿®åªæ¶ï¼"
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr "è°æ´éå åºåç大å°ä½¿ç¨ï¼"
+
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr "å¨ææ½æ§å¶ç¹æ¶ï¼"
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr "ç»å¾®è°æ´ä½¿ç¨ï¼"
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "é®çå¸å±ï¼"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr "æ¨å¨ç¹ä½¿ç¨ï¼"
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "åä½ç¼©æ¾ï¼"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr "ç¨æ·å¾å½¢çé¢ååä½ç¼©æ¾ï¼"
-#: rc_option_editor.cc:547
+#: rc_option_editor.cc:1032
msgid "Default"
msgstr "é»è®¤"
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
-msgstr "éè¦çåä½ç¼©æ¾ååè¦æ±åºç¨ç¨åºéæ°å¯å¨ä»¥ä¾¿äºéæ°å¸å±ã"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr "è°æ´ç¼©æ¾éè¦ä¸ä¸ªåºç¨ç¨åºéå¯ä»¥ä¾¿éæ°å¸å±ã"
+
+#: rc_option_editor.cc:1100
+msgid "â"
+msgstr "âï¼æ ç©·ï¼"
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr "30 ç§"
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr "1 å"
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr "2 å"
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr "3 å"
-#: rc_option_editor.cc:614
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr "4 å"
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr "5 å"
+
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+"为æä»¶å®ä¾åæå®é»è®¤è¶
æ¶ãéè¦æ´å¤æ¶é´è½½å
¥çæä»¶å°ä¼è¢«åå
¥é»ååãæ°å¼ 0 ç¦ç¨"
+"è¶
æ¶ã"
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr "æ«æè¶
æ¶ï¼"
+
+#: rc_option_editor.cc:1159
msgid "Waveform Clip Level (dBFS):"
msgstr "æ³¢å½¢æªæ³¢çµå¹³ï¼dBFSï¼ï¼"
-#: rc_option_editor.cc:666
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr "å°åä¼è¯ï¼4-16 é³è½¨ï¼"
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr "ä¸åä¼è¯ï¼16 - 64 é³è½¨ï¼"
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr "大åä¼è¯ï¼64+ é³è½¨ï¼"
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr "å®å¶ï¼ä½¿ç¨ä¸æ¹çæ»å设置ï¼"
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "é¢è®¾ï¼"
+
+#: rc_option_editor.cc:1231
msgid "Playback (seconds of buffering):"
msgstr "åæ¾ï¼ç¼å²çç§æ°ï¼ï¼"
-#: rc_option_editor.cc:679
+#: rc_option_editor.cc:1244
msgid "Recording (seconds of buffering):"
msgstr "å½å¶ï¼ç¼å²çç§æ°ï¼ï¼"
-#: rc_option_editor.cc:737
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr "ç¨åºéè¯¯ï¼æªç¥çç¼å²é¢è®¾å符串ï¼ç´¢å¼ = %1"
+
+#: rc_option_editor.cc:1353
msgid "Control Surface Protocol"
msgstr "æ§å¶é¢åè®®"
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "åå»å称以便ç¼è¾å·²å¯ç¨åè®®ç设置"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr "ç¹å»ä¸ºå·²éä¸çåè®®ç¼è¾è®¾ç½®ï¼å®å¿
é¡»æ¯é¦å
被å¯ç¨çï¼ï¼"
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr "æ¾ç¤ºå议设置"
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr "é
ç½®"
-#: rc_option_editor.cc:903
+#: rc_option_editor.cc:1547
msgid "Show Video Export Info before export"
msgstr "导åºåæ¾ç¤ºè§é¢å¯¼åºä¿¡æ¯"
-#: rc_option_editor.cc:904
+#: rc_option_editor.cc:1548
msgid "Show Video Server Startup Dialog"
msgstr "æ¾ç¤ºè§é¢æå¡å¯å¨å¯¹è¯æ¡"
-#: rc_option_editor.cc:905
+#: rc_option_editor.cc:1549
msgid "Advanced Setup (remote video server)"
msgstr "é«çº§è®¾ç½®ï¼è¿ç¨è§é¢æå¡ï¼"
-#: rc_option_editor.cc:913
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "è§é¢æå¡å¨"
+
+#: rc_option_editor.cc:1565
msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. - Do "
-"not enable this option unless you know what you are doing."
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
msgstr ""
-"<b>å¯ç¨æ¶</b> æ¨å¯ä»¥æå®ä¸ä¸ªå®å¶çè§é¢æå¡å¨ç½ååææ¡£æ ¹ãââä¸è¦å¯ç¨è¯¥é项ï¼é¤éæ¨"
-"ç¥éæ¨æ£å¨åä»ä¹ã"
+"<b>å¯ç¨æ¶</b> æ¨å¯ä»¥æå®ä¸ä¸ªå®å¶çè§é¢æå¡å¨ç½ååææ¡£æ ¹ãââ ä¸è¦å¯ç¨è¯¥é项ï¼"
+"é¤éæ¨ç¥éæ¨æ£å¨åä»ä¹ã"
-#: rc_option_editor.cc:915
+#: rc_option_editor.cc:1567
msgid "Video Server URL:"
msgstr "è§é¢æå¡å¨ç½åï¼"
-#: rc_option_editor.cc:920
+#: rc_option_editor.cc:1572
msgid ""
"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the "
-"video-server is running locally"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
msgstr ""
-"åºäºç½åçè§é¢æå¡å
æ¬ http åç¼ãå½è§é¢æå¡å¨æ¯è¿è¡å¨æ¬å°æ¶ï¼è¿ç½åéå¸¸æ¯ âhttp://"
-"hostname.example.org:1554/â 以åé»è®¤æ¯ âhttp://localhost:1554/â ã"
+"åºäºç½åçè§é¢æå¡å
æ¬ http åç¼ãå½è§é¢æå¡å¨æ¯è¿è¡å¨æ¬å°æ¶ï¼è¿ç½åéå¸¸æ¯ "
+"âhttp://hostname.example.org:1554/â 以åé»è®¤æ¯ âhttp://localhost:1554/â ã"
-#: rc_option_editor.cc:922
+#: rc_option_editor.cc:1574
msgid "Video Folder:"
msgstr "è§é¢æä»¶å¤¹ï¼"
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1579
msgid ""
-"Local path to the video-server document-root. Only files below this directory will "
-"be accessible by the video-server. If the server run on a remote host, it should "
-"point to a network mounted folder of the server's docroot or be left empty if it "
-"is unvailable. It is used for the local video-monitor and file-browsing when "
-"opening/adding a video file."
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
msgstr ""
-"è§é¢æå¡å¨ææ¡£æ ¹çæ¬å°è·¯å¾ãè§é¢æå¡å¨ä»
访é®è¿ä¸ªç®å½ä¸çæä»¶ã妿æå¡å¨è¿è¡å¨è¿ç¨"
-"主æºä¸ï¼å®å°æåæå¡å¨ææ¡£æ ¹çä¸ä¸ªç½ç»æè½½æä»¶å¤¹ï¼æè
妿å®ä¸å¯ç¨å°±çç空ç½ãè¿æ¯"
-"ç¨äºå¨æå¼/æ·»å ä¸ä¸ªè§é¢æä»¶æ¶çæ¬å°è§é¢çæ§ä»¥åæä»¶æµè§ã"
+"è§é¢æå¡å¨ææ¡£æ ¹çæ¬å°è·¯å¾ãè§é¢æå¡å¨ä»
访é®è¿ä¸ªç®å½ä¸çæä»¶ã妿æå¡å¨è¿è¡"
+"å¨è¿ç¨ä¸»æºä¸ï¼å®å°æåæå¡å¨ææ¡£æ ¹çä¸ä¸ªç½ç»æè½½æä»¶å¤¹ï¼æè
妿å®ä¸å¯ç¨å°±ç"
+"ç空ç½ãè¿æ¯ç¨äºå¨æå¼/æ·»å ä¸ä¸ªè§é¢æä»¶æ¶çæ¬å°è§é¢çæ§ä»¥åæä»¶æµè§ã"
-#: rc_option_editor.cc:934
+#: rc_option_editor.cc:1584
msgid ""
-"<b>When enabled</b> an information window with details is displayed before the "
-"video-export dialog."
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
msgstr "<b>å¯ç¨æ¶</b> å¨è§é¢è¾åºå¯¹è¯æ¡åæ¾ç¤ºä¸ä¸ªç»èä¿¡æ¯çªå£ã"
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1589
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
msgstr "<b>å¯ç¨æ¶</b> è§é¢æå¡å¨å¨æ²¡æå¾å°ç¡®è®¤åä¸ä¼èªå¨å¯å¨ã"
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr "æ»æ¯æ¾ç¤ºæä»¶æ«æç¨åº"
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr "å¨åºç¨èµ·ç¹æ«æ [æ°] VST æä»¶"
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr "å¨åºç¨èµ·ç¹æ«æé³é¢å使件"
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "éç¨"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "æ«ææä»¶"
-
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed for "
-"indexing (cache load) and discovery (detect new plugins)"
-msgstr ""
-"<b>å¯ç¨æ¶</b> ä¸ä¸ªå¼¹åºçªå£æ¾ç¤ºæä»¶æ«æç¨åºï¼ä»¥å±ç¤ºç´¢å¼ï¼ç¼åè½½å
¥ï¼ååç°ï¼æ¢æµæ°æ"
-"ä»¶ï¼ã"
-
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. Plugins that "
-"require more time to load will be blacklisted. A value of 0 disables the timeout."
-msgstr ""
-"æä»¶å®ä¾åæå®çé»è®¤è¶
æ¶å¨ 1/10 以å
ãéè¦æ´å¤æ¶é´è½½å
¥çæä»¶å°è¢«åå
¥é»ååãæ°å¼ä¸º "
-"0 åç¦ç¨è¶
æ¶ã"
-
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr "æ«æè¶
æ¶ [ååä¹ä¸ç§]"
-
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr ""
-
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "æ¸
é¤ VST ç¼å"
-
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "æ¸
é¤ VST é»åå"
-
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the cache "
-"index on application start. When disabled new plugins will only be available after "
-"triggering a 'Scan' manually"
-msgstr ""
-"<b>å¯ç¨æ¶</b> æ°ç VST æä»¶è¢«æç´¢ãæµè¯ä»¥åæ·»å å°åºç¨èµ·ç¹çç¼åç´¢å¼ä¸ãå½ç¦ç¨æ°æä»¶"
-"æ¶ï¼ä»
卿å¨è§¦åâæ«æâæ¶å¯ç¨ã"
-
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr "Linux VST è·¯å¾ï¼"
-
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr "Windows VST è·¯å¾ï¼"
-
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "é³é¢åä½"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr "å®å¶è§é¢çæ§ï¼%1ï¼è·¯å¾ââ空ç½å使ç¨é»è®¤è®¾ç½®ï¼"
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1610
msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. When "
-"disabled AU plugins will only be available after triggering a 'Scan' manually. The "
-"first successful scan will enable AU auto-scan, Any crash during plugin discovery "
-"will disable it."
-msgstr ""
-"<b>å¯ç¨æ¶</b> é³é¢åä½æä»¶è¢«åºç¨èµ·ç¹åç°ãå½ç¦ç¨é³é¢å使件æ¶ï¼ä»
卿å¨è§¦åâæ«"
-"æâæ¶å¯ç¨ãç¬¬ä¸æ¬¡æåçæ«æå°å¯ç¨é³é¢åä½èªå¨æ«æï¼è¥æä»¶åç°ä»»ä½å´©æºçæ
åµé½å°ç¦ç¨"
-"èªå¨æ«æã"
-
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "æ¸
é¤é³é¢åä½ç¼å"
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr "设置ä¸ä¸ªå®å¶çè·¯å¾ä»¥æå坿§è¡çè§é¢çæ§ãæ´æ¹æ¬é¡¹éè¦éå¯ã"
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "æ¸
é¤é³é¢åä½é»åå"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
-msgstr "设置 Windows VST æç´¢è·¯å¾"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr "è®¾ç½®å¯æ§è¡çè§é¢çæ§"
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
-msgstr "设置 Linux VST æç´¢è·¯å¾"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr "å %1"
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
msgid "%1 Preferences"
msgstr "%1 é¦é项"
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
msgid "DSP CPU Utilization"
-msgstr "DSP ç CPU å©ç¨ç"
+msgstr "DSPï¼æ°åä¿¡å·å¤çå¨ï¼CPU使ç¨ç"
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
msgid "Signal processing uses"
msgstr "ä¿¡å·å¤ç使ç¨"
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
msgid "all but one processor"
msgstr "é¤äºä¸ä¸ªå¤çå¨å¤ææç"
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
msgid "all available processors"
msgstr "ææå¯ç¨çå¤çå¨"
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
msgid "%1 processors"
-msgstr "ï¼
1 å¤çå¨"
+msgstr "%1 å¤çå¨"
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
msgid "This setting will only take effect when %1 is restarted."
msgstr "该设置å°ä»
ä»
å¨ %1 éæ°å¯å¨æ¶èµ·ä½ç¨"
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
msgid "Options|Undo"
msgstr "é项|æ¤é"
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
msgid "Verify removal of last capture"
msgstr "ç¡®è®¤ç§»é¤æåçæè·é¨å"
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "宿å¤ä»½ä¼è¯æä»¶"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
msgid "Session Management"
msgstr "ä¼è¯ç®¡ç"
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "宿å¤ä»½ä¼è¯æä»¶"
+
+#: rc_option_editor.cc:1920
msgid "Always copy imported files"
msgstr "æ»æ¯å¤å¶å¯¼å
¥çæä»¶"
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
msgid "Default folder for new sessions:"
-msgstr "æ°ä¼è¯çé»è®¤æä»¶å¤¹ï¼"
+msgstr "æ°ä¼è¯çé»è®¤æä»¶å¤¹"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
msgid "Maximum number of recent sessions"
msgstr "å½åä¼è¯çæå¤§æ°é"
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "æé¡¹/è¯å«å£°"
+
+#: rc_option_editor.cc:1948
msgid "Click gain level"
msgstr "ç¹å»å¢ççµå¹³"
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
msgid "Automation"
msgstr "èªå¨å"
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
msgid "Thinning factor (larger value => less data)"
-msgstr " ç¨éåæ°ï¼è¾å¤§çæ°å¼ => è¾å°çæ°æ®ï¼"
+msgstr "ç¨éåæ°ï¼è¾å¤§çæ°å¼ => è¾å°çæ°æ®ï¼"
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
msgid "Automation sampling interval (milliseconds)"
msgstr "èªå¨åæ ·æ¬é´éï¼æ¯«ç§ï¼"
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr "æéé项"
+
+#: rc_option_editor.cc:1981
msgid "Keep record-enable engaged on stop"
msgstr "忢æ¶ï¼ä¿æå¯ç¨çå½å¶ä»å¨å¯ç¨ä¸"
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
msgid "Play loop is a transport mode"
msgstr "ææ¾å¾ªç¯æ¯ä¸ä¸ªæé模å¼"
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
msgid ""
-"<b>When enabled</b> the loop button does not start playback but forces playback to "
-"always play the loop\n"
+"<b>When enabled</b> the loop button does not start playback but forces "
+"playback to always play the loop\n"
"\n"
"<b>When disabled</b> the loop button starts playing the loop, but stop then "
"cancels loop playback"
@@ -9242,565 +11074,661 @@ msgstr ""
"\n"
"<b>ç¦ç¨æ¶</b> å¾ªç¯æé®å¯å¨ææ¾å¾ªç¯ï¼ä½åæ¢ä¹åæ¶å¾ªç¯åæ¾"
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
msgid "Stop recording when an xrun occurs"
-msgstr "å¨xè¿è¡åºç°æ¶åæ¢å½å¶"
+msgstr "å¨xrunåºç°æ¶åæ¢å½å¶"
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
msgid ""
-"<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by "
-"the audio engine"
+"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
+"detected by the audio engine"
msgstr "<b>å¯ç¨æ¶</b> 妿é³é¢å¼ææ£æµå°ä¸ä¸ªè¶
è½½æè
æ¬ è½½è¿è¡ %1 å°åæ¢å½å¶"
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
msgid "Create markers where xruns occur"
msgstr "å¨xè¿è¡åºç°æ¶å建æ è®°"
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
msgid "Stop at the end of the session"
msgstr "å¨ä¼è¯ç»ç¹åæ¢"
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
msgid ""
-"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the transport when "
-"it reaches the current session end marker\n"
+"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
+"transport when it reaches the current session end marker\n"
"\n"
-"<b>When disabled</b> %1 will continue to roll past the session end marker at all "
-"times"
+"<b>When disabled</b> %1 will continue to roll past the session end marker at "
+"all times"
msgstr ""
-"<b>å¯ç¨æ¶</b> 妿 %1 æ¯ <b>éå½å¶ä¸</b>ï¼å½å®è¾¾å°å½åä¼è¯çç»ç¹æ è®°æ¶å®å°åæ¢æ"
-"é\n"
+"<b>å¯ç¨æ¶</b> 妿 %1 æ¯ <b>éå½å¶ä¸</b>ï¼å½å®è¾¾å°å½åä¼è¯çç»ç¹æ è®°æ¶å®å°å"
+"æ¢æé\n"
"\n"
"<b>ç¦ç¨æ¶</b> %1 å°ç»§ç»ä¸ç´æ»å¨è¿è¡å°ä¼è¯ç»ç¹æ è®°"
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
-msgstr "åæ ç¼å¾ªç¯ï¼å½ä»å±äº MTCï¼LTC è¯¸å¦æ¤ç±»æ¶ä¸å¯è½å®ç°ï¼"
+msgstr ""
+"åæ ç¼å¾ªç¯ï¼å½ä»å±äº MTCï¼LTC âMIDIæ¶é´ç ï¼çºµåæ¶é´ç âè¯¸å¦æ¤ç±»æ¶ä¸å¯è½å®ç°ï¼"
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
msgid ""
-"<b>When enabled</b> this will loop by reading ahead and wrapping around at the "
-"loop point, preventing any need to do a transport locate at the end of the loop\n"
+"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
+"the loop point, preventing any need to do a transport locate at the end of "
+"the loop\n"
"\n"
-"<b>When disabled</b> looping is done by locating back to the start of the loop "
-"when %1 reaches the end which will often cause a small click or delay"
+"<b>When disabled</b> looping is done by locating back to the start of the "
+"loop when %1 reaches the end which will often cause a small click or delay"
msgstr ""
-"<b>å¯ç¨æ¶</b>è¿å°éè¿é¢å
è¯»åæ¥å¾ªç¯å¹¶ä¸å¨å¾ªç¯ç¹å´ç»ï¼é²æ¢ä»»ä½éè¦ææéå®ä½å¨å¾ªç¯ç"
-"ç»ç¹çæ
åµ\n"
+"<b>å¯ç¨æ¶</b>è¿å°éè¿é¢å
è¯»åæ¥å¾ªç¯å¹¶ä¸å¨å¾ªç¯ç¹å´ç»ï¼é²æ¢ä»»ä½éè¦ææéå®ä½å¨"
+"循ç¯çç»ç¹çæ
åµ\n"
"\n"
-"<b>ç¦ç¨æ¶</b> å½ %1 å°è¾¾ä¼ç»å¸¸å¼èµ·ä¸ä¸ªè½»å¾®è¯å«å£°æå»¶è¿çç»ç¹æ¶ï¼éè¿å®ä½åå°å¾ªç¯ç"
-"èµ·ç¹èå®æå¾ªç¯"
+"<b>ç¦ç¨æ¶</b> å½ %1 å°è¾¾ä¼ç»å¸¸å¼èµ·ä¸ä¸ªè½»å¾®è¯å«å£°æå»¶è¿çç»ç¹æ¶ï¼éè¿å®ä½åå°"
+"循ç¯çèµ·ç¹èå®æå¾ªç¯"
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
msgid "Disable per-track record disarm while rolling"
-msgstr "彿»å¨æ¶ç¦ç¨é¢å
é³è½¨å½å¶è§£é¤"
+msgstr "彿»å¨æ¶ç¦ç¨é¢å
é³è½¨å½å¶è§£é¤é¢å¤"
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
msgid ""
-"<b>When enabled</b> this will prevent you from accidentally stopping specific "
-"tracks recording during a take"
+"<b>When enabled</b> this will prevent you from accidentally stopping "
+"specific tracks recording during a take"
msgstr "<b>å¯ç¨æ¶</b> è¿å°é²æ¢æ¨å¨è¿è¿ç¨ä¸æå¤åæ¢æå®çé³è½¨å½å¶"
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "å¿«è¿ååå¸¦æ¶æ 12dB çå¢çåå°"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
+msgid ""
+"This will reduce the unpleasant increase in perceived volume that occurs "
+"when fast-forwarding or rewinding through some kinds of audio"
+msgstr ""
+"å½å¿«è¿æå带éè¿æäºé³é¢ç±»åæ¶ï¼è¿å°åå°ä»¤äººæå°ä¸éç坿ç¥é³éå¢å çç°å"
+
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr "颿»"
+
+#: rc_option_editor.cc:2071
msgid ""
-"This will reduce the unpleasant increase in perceived volume that occurs when fast-"
-"forwarding or rewinding through some kinds of audio"
-msgstr "å½å¿«è¿æå带éè¿æäºé³é¢ç±»åæ¶ï¼è¿å°åå°ä»¤äººæå°ä¸éç坿ç¥é³éå¢å çç°å"
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+"å½<b>带ç颿»ææ¾</b>æ¶ï¼è¦åºç¨ç颿»æ°éï¼ç§ï¼ä¼è¢«å¯å¨ã\n"
+"\n"
+"妿<b>éåçç¼è¾</b>被å¯ç¨ï¼å½ä¸ä¸ªåºå被éä¸æè¢«ä¿®åªæ¶ï¼é¢æ»ä¼è¢«åºç¨å°æéä½"
+"ç½®ã"
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr "0ï¼æ 颿»ï¼"
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr "0.1 ç§"
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr "0.25 ç§"
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr "0.5 ç§"
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr "1.0 ç§"
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr "2.0 ç§"
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "æé/忥"
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "忥/ä»å±"
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "忥åä»å±é项"
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
msgid "External timecode source"
msgstr "å¤é¨æ¶é´ç æº"
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
msgid "Match session video frame rate to external timecode"
msgstr "å¹é
ä¼è¯è§é¢å¸§çå°å¤é¨æ¶é´ç "
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
msgid ""
-"This option controls the value of the video frame rate <i>while chasing</i> an "
-"external timecode source.\n"
+"This option controls the value of the video frame rate <i>while chasing</i> "
+"an external timecode source.\n"
"\n"
-"<b>When enabled</b> the session video frame rate will be changed to match that of "
-"the selected external timecode source.\n"
+"<b>When enabled</b> the session video frame rate will be changed to match "
+"that of the selected external timecode source.\n"
"\n"
-"<b>When disabled</b> the session video frame rate will not be changed to match "
-"that of the selected external timecode source.Instead the frame rate indication in "
-"the main clock will flash red and %1 will convert between the external timecode "
-"standard and the session standard."
+"<b>When disabled</b> the session video frame rate will not be changed to "
+"match that of the selected external timecode source.Instead the frame rate "
+"indication in the main clock will flash red and %1 will convert between the "
+"external timecode standard and the session standard."
msgstr ""
"è¿ä¸ªé项æ§å¶è§é¢å¸§ççæ°å¼<i>å½è¿½é</i>ä¸ä¸ªå¤é¨æ¶é´ç æºæ¶\n"
"\n"
"<b>å¯ç¨æ¶</b> ä¼è¯è§é¢å¸§çå°è¢«æ¹å为å¹é
å°å·²éä¸çå¤é¨æ¶é´ç æºã\n"
"\n"
-"<b>ç¦ç¨æ¶</b> ä¼è¯è§é¢å¸§çå°ä¸ä¼è¢«æ¹å为å¹é
å°å·²éä¸çå¤é¨æ¶é´ç æºãåè代ä¹çæ¯ï¼"
-"帧çå¨ä¸»è®¡æ¶å¨éçæç¤ºå°å¨è½¬æ¢å¤é¨æ¶é´ä»£ç æ ååä¼è¯æ å两è
é´è½¬æ¢ã"
+"<b>ç¦ç¨æ¶</b> ä¼è¯è§é¢å¸§çå°ä¸ä¼è¢«æ¹å为å¹é
å°å·²éä¸çå¤é¨æ¶é´ç æºãåè代ä¹"
+"çæ¯ï¼å¸§çå¨ä¸»è®¡æ¶å¨éçæç¤ºå°å¨è½¬æ¢å¤é¨æ¶é´ä»£ç æ ååä¼è¯æ å两è
é´è½¬æ¢ã"
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
-msgstr "忥æ¶é´ä»£ç å°è®¡æ¶å¨ââç¦ç¨æ¼ç§»è¡¥å¿ã"
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
+msgstr "忥æ¶é´ä»£ç å°è®¡æ¶å¨ï¼ç¦ç¨æ¼ç§»è¡¥å¿ï¼"
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
msgid ""
-"<b>When enabled</b> %1 will never varispeed when slaved to external timecode. Sync "
-"Lock indicates that the selected external timecode source shares clock-sync (Black "
-"& Burst, Wordclock, etc) with the audio interface. This option disables drift "
-"compensation. The transport speed is fixed at 1.0.Varispeed LTC will be ignored "
-"and cause drift.\n"
+"<b>When enabled</b> %1 will never varispeed when slaved to external "
+"timecode. Sync Lock indicates that the selected external timecode source "
+"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
+"interface. This option disables drift compensation. The transport speed is "
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
"\n"
-"<b>When disabled</b> %1 will compensate for potential drift, regardless if the "
-"timecode sources shares clock sync."
+"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
+"the timecode sources shares clock sync."
msgstr ""
-"<b>å¯ç¨æ¶</b> å¨ä»å±äºå¤é¨æ¶é´ç æ¶ %1 å°ä¸ä¼åéã忥éå®è¡¨æå·²éä¸çå¤é¨æ¶é´ç æº"
-"ä¸é³é¢çé¢å
±äº«è®¡æ¶å¨åæ¥ï¼ Black & Burstï¼ Wordclockï¼ççï¼ãè¿ä¸ªé项ç¦ç¨æ¼ç§»"
-"è¡¥å¿ãæéé度被修æ£äº 1.0.Varispeed LTC å°è¢«å¿½ç¥ä¸å¼èµ·æ¼ç§»ã\n"
+"<b>å¯ç¨æ¶</b> å¨ä»å±äºå¤é¨æ¶é´ç æ¶ %1 å°ä¸ä¼åéã忥éå®è¡¨æå·²éä¸çå¤é¨æ¶"
+"é´ç æºä¸é³é¢çé¢å
±äº«è®¡æ¶å¨åæ¥ï¼ Black & Burstï¼ Wordclockï¼ççï¼ãè¿ä¸ª"
+"é项ç¦ç¨æ¼ç§»è¡¥å¿ãæéé度被修æ£äº 1.0ã Varispeed LTC ï¼çºµåæ¶é´ç ï¼å°è¢«å¿½ç¥"
+"ä¸å¼èµ·æ¼ç§»ã\n"
"\n"
"<b>ç¦ç¨æ¶</b> %1 å°è¡¥å¿æ½å¨çæ¼ç§»ï¼ä¸è®ºæ¶é´ç æºæ¯å¦å
±äº«æ¶é´åæ¥ã"
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "éå®å° 29.9700 fps 以æ¿ä»£ 30000/1001"
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
-"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions that "
-"drop-frame timecode has an accumulated error of -86ms over a 24-hour period.\n"
-"Drop-frame timecode would compensate exactly for a NTSC color frame rate of 30 * "
-"0.9990 (ie 29.970000). That is not the actual rate. However, some vendors use that "
-"rate - despite it being against the specs - because the variant of using exactly "
-"29.97 fps has zero timecode drift.\n"
+"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions "
+"that drop-frame timecode has an accumulated error of -86ms over a 24-hour "
+"period.\n"
+"Drop-frame timecode would compensate exactly for a NTSC color frame rate of "
+"30 * 0.9990 (ie 29.970000). That is not the actual rate. However, some "
+"vendors use that rate - despite it being against the specs - because the "
+"variant of using exactly 29.97 fps has zero timecode drift.\n"
msgstr ""
"<b>å¯ç¨æ¶</b> å¤é¨æ¶é´ç æºè¢«åå®ä½¿ç¨ 29.97 fps 以æ¿ä»£ 30000/1001 ã\n"
-"SMPTE 12M-1999 æå® 29.97df 为 30000/1001 ãè¿ä¸æ¥çè§èæå°ä¸¢å¸§æ¶é´ç æä¸ä¸ªå¨ 24 "
-"å°æ¶å
-86ms ç累积é误ã\n"
-"丢帧æ¶é´ç å°å®å
¨è¡¥å¿ 30 * 0.9990 ï¼ie 29.970000ï¼ç NTSC è²å½©å¸§çãé£ä¸æ¯å®é
帧çã"
-"ç¶èï¼æäºåå使ç¨è¿å¸§çââ尽管å®è¿èè§èââå 为使ç¨å®é
29.97 fps çæ¶é´ç æ¼ç§»åå"
-"为 0 ã\n"
+"SMPTE 12M-1999 æå® 29.97df 为 30000/1001 ãè¿ä¸æ¥çè§èæå°ä¸¢å¸§æ¶é´ç æä¸ä¸ª"
+"å¨ 24 å°æ¶å
-86ms ç累积é误ã\n"
+"丢帧æ¶é´ç å°å®å
¨è¡¥å¿ 30 * 0.9990 ï¼ie 29.970000ï¼ç NTSC è²å½©å¸§çãé£ä¸æ¯å®é
"
+"帧çãç¶èï¼æäºåå使ç¨è¿å¸§çââ尽管å®è¿èè§èââå 为使ç¨å®é
29.97 fps çæ¶é´"
+"ç æ¼ç§»åå为 0 ã\n"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
msgid "LTC Reader"
-msgstr "LTC é
读å¨"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼é
读å¨"
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
msgid "LTC incoming port"
-msgstr "LTC 导å
¥ç«¯å£"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼å¯¼å
¥ç«¯å£"
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
msgid "LTC Generator"
-msgstr "LTC çæå¨"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼çæå¨"
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
msgid "Enable LTC generator"
-msgstr "å¯ç¨ LTC çæå¨"
+msgstr "å¯ç¨ LTCï¼çºµåæ¶é´ç ï¼çæå¨"
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
msgid "Send LTC while stopped"
-msgstr "忢æ¶åé LTC "
+msgstr "忢æ¶åé LTCï¼çºµåæ¶é´ç ï¼"
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
-msgstr "<b>å¯ç¨æ¶</b> %1 å°ç»§ç»åé LTC ä¿¡æ¯ï¼å³ä½¿å½æéï¼æéï¼ä¸åç§»å¨"
+msgstr ""
+"<b>å¯ç¨æ¶</b> %1 å°ç»§ç»åé LTCï¼çºµåæ¶é´ç ï¼ä¿¡æ¯ï¼å³ä½¿å½æéï¼æéï¼ä¸åç§»å¨"
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
msgid "LTC generator level"
-msgstr "LTC çæå¨çµå¹³"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼çæå¨çµå¹³"
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value is 0dBu "
-"^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is 0dBu ^= -18dBFS in an EBU calibrated system"
msgstr ""
-"以 dbFS æå®çæ LTC ä¿¡å·é³éçå³°å¼ãå»ºè®®çæ°å¼æ¯ 0dBu ^= -18dbFS å¨ä¸ä¸ª EBU æ ¡åç³»"
-"ç»é"
+"以 dBFS æå®çæç LTCï¼çºµåæ¶é´ç ï¼ä¿¡å·å³°å¼é³éãå¨ä¸ä¸ª EBU æ ¡æ£è¿çç³»ç»éè¾"
+"å¥½çæ°å¼æ¯ 0dBu ^= -18dBFS"
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr "å
è®¸ææ½æé"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "使橡ç®å¸¦å·²éæ©é¨åç©å½¢å¸éå°ç½æ ¼"
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "å½é³é¢åºåç§»å¨æ¶ï¼ä¹ç§»å¨ç¸å
³çèªå¨å"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "å½åæ°æ ç¾"
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "å¨ç¼è¾å¨çé³è½¨ä¸æ¾ç¤ºèæ"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+"妿å¯ç¨ï¼å½å建ä¸ä¸ªæ°æ è®°æ¶ä¼å¼¹åºä¸ä¸ªå¯¹è¯æ¡ï¼å
许为å建å®è设置å®çåç§°ã\n"
+"\n"
+"æ¨æ»æ¯å¯ä»¥éè¿å³é®åå»å®ä»¬æ¥éå½åæ å¿"
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr "å
è®¸ææ½æé"
+
+#: rc_option_editor.cc:2230
msgid "Display master-meter in the toolbar"
msgstr "å¨å·¥å
·æ éæ¾ç¤ºä¸»æ§èæ"
-#: rc_option_editor.cc:1653
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
+msgstr "æ¾ç¤ºç¼©æ¾å·¥å
·æ ï¼å¦ææè£ï¼"
+
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr "å½ç¼©æ¾ä½¿ç¨é¼ æ æ»è½®æ¶ï¼å§ç»ä½¿ç¨é¼ æ æéä½ç½®ä½ä¸ºç¼©æ¾ç¦ç¹"
+
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr "å½ææ½æè¦æ¶ï¼æ´æ°ç¼è¾å¨çªå£"
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr "彿å¨è¾¹ç¼éè¿æ¶ï¼èªå¨æ»å¨ç¼è¾å¨çªå£"
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr "å¨é³é¢åºåå
æ¾ç¤ºå¢çå°è£
"
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr "å¨æææ¨¡å¼å
"
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr "ä»
卿ç»åå
é¨ç¼è¾æ¨¡å¼å
"
+
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr "ç¼è¾å¨è¡ä¸º"
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "å½é³é¢åºåç§»å¨æ¶ï¼ä¹ç§»å¨ç¸å
³çèªå¨å"
+
+#: rc_option_editor.cc:2291
msgid "Default fade shape"
msgstr "é»è®¤æ·¡åå½¢ç¶"
-#: rc_option_editor.cc:1672
+#: rc_option_editor.cc:2310
msgid "Regions in active edit groups are edited together"
msgstr "åºåä½äºæ¿æ´»ç¼è¾çåç»éä¼è¢«å½¼æ¤ç¼è¾"
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:2311
msgid "whenever they overlap in time"
msgstr "ä¸è®ºä½æ¶é½åæ¶éå å®ä»¬"
-#: rc_option_editor.cc:1674
+#: rc_option_editor.cc:2312
msgid "only if they have identical length, position and origin"
msgstr "ä»
å¨å½å®ä»¬æ¥æå®å
¨ç¸åçé¿åº¦ãä½ç½®ååç¹æ¶"
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "使橡ç®å¸¦å·²éæ©é¨åç©å½¢å¸éå°ç½æ ¼å¯¹é½"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr "å屿¨¡å"
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "å¨åºåå
æ¾ç¤ºæ³¢å½¢"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr "åæ¥çæ´é«"
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
-msgstr "å¨é³é¢åºåå
æ¾ç¤ºå¢çå°è£
"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr "æå¨åå±"
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "å¨æææ¨¡å¼å
"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr "卿åå·²éä¸åºåä¹åï¼éæ©"
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr "æ åºå"
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr "æ°å建çåºå"
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr "å·²åå¨ç已鿩é¨ååæ°å建çåºå"
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr "ç¼è¾å¨/波形"
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr "波形"
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "å¨åºåå
æ¾ç¤ºæ³¢å½¢"
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "ä»
å¨åºåå¢ç模å¼å
"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "å¨é³é¢åºåå
æ¾ç¤ºå¢çå°è£
"
-#: rc_option_editor.cc:1709
+#: rc_option_editor.cc:2370
msgid "Waveform scale"
msgstr "波形æ¯ä¾"
-#: rc_option_editor.cc:1714
+#: rc_option_editor.cc:2375
msgid "linear"
msgstr "线æ§"
-#: rc_option_editor.cc:1715
+#: rc_option_editor.cc:2376
msgid "logarithmic"
msgstr "对æ°"
-#: rc_option_editor.cc:1721
+#: rc_option_editor.cc:2382
msgid "Waveform shape"
msgstr "波形形ç¶"
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:2387
msgid "traditional"
msgstr "ä¼ ç»ç"
-#: rc_option_editor.cc:1727
+#: rc_option_editor.cc:2388
msgid "rectified"
msgstr "å·²ç«æ£ç"
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "å¨é³é¢è¢«å½å¶æ¶æ¾ç¤ºå®ç波形"
-
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "æ¾ç¤ºç¼©æ¾å·¥å
·æ "
-
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "å½ææ½æè¦æ¶ï¼æ´æ°ç¼è¾å¨çªå£"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "忥ç¼è¾å¨åæ··é³å¨å·²éä¸é¨å"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "å½åæ°æ ç¾"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to be "
-"set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-msgstr ""
-"妿å¯ç¨ï¼å½å建ä¸ä¸ªæ°æ è®°æ¶ä¼å¼¹åºä¸ä¸ªå¯¹è¯æ¡ï¼å
许为å建å®è设置å®çåç§°ã\n"
-"\n"
-"æ¨æ»æ¯å¯ä»¥éè¿å³é®åå»å®ä»¬æ¥éå½åæ å¿"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr "彿å¨è¾¹ç¼éè¿æ¶ï¼èªå¨æ»å¨ç¼è¾å¨çªå£"
-
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr "卿åå·²éä¸åºåä¹åï¼éæ©"
-
-#: rc_option_editor.cc:1791
-msgid "no regions"
-msgstr "æ åºå"
-
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr "æ°å建çåºå"
-
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr "å·²åå¨çå·²éä¸é¨ååæ°å建çåºå"
-
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
msgid "Buffering"
msgstr "ç¼å²ä¸"
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
msgid "Record monitoring handled by"
msgstr "å½å¶çæ§çå¤çæ¯éè¿"
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
msgid "via Audio Driver"
msgstr "via é³é¢é©±å¨"
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
msgid "audio hardware"
msgstr "é³é¢ç¡¬ä»¶"
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
msgid "Tape machine mode"
msgstr "ç£å¸¦æºå¨æ¨¡å¼"
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
msgid "Connection of tracks and busses"
msgstr "é³è½¨åæ»çº¿çè¿æ¥"
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
msgid "Auto-connect master/monitor busses"
msgstr "èªå¨è¿æ¥ä¸»æ§/çæ§æ»çº¿"
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
msgid "Connect track inputs"
msgstr "è¿æ¥é³è½¨è¾å
¥"
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
msgid "automatically to physical inputs"
msgstr "èªå¨åç©çè¾å
¥"
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
msgid "manually"
msgstr "æå¨"
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
msgid "Connect track and bus outputs"
msgstr "è¿æ¥é³è½¨åæ»çº¿è¾åº"
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
msgid "automatically to physical outputs"
msgstr "èªå¨åç©çè¾åº"
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
msgid "automatically to master bus"
msgstr "èªå¨åä¸»æ§æ»çº¿"
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "为æ°çè½¨éææ»çº¿ä½¿ç¨â精确è¾å
¥/è¾åºâ"
+
+#: rc_option_editor.cc:2478
msgid "Denormals"
msgstr "å¼å¸¸"
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
msgid "Use DC bias to protect against denormals"
-msgstr "使ç¨ç´æµååé对å¼å¸¸é²æ¤"
+msgstr "ä½¿ç¨ DC biasï¼ç´æµååï¼é对å¼å¸¸é²æ¤"
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
msgid "Processor handling"
msgstr "å¤çå¨å¤ç"
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
msgid "no processor handling"
msgstr "æ å¤çå¨å¤ç"
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
msgid "use FlushToZero"
msgstr "使ç¨é½å¹³ä¸ºé¶"
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
msgid "use DenormalsAreZero"
msgstr "使ç¨å¼å¸¸é½å¹³ä¸ºé¶"
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
msgid "use FlushToZero and DenormalsAreZero"
msgstr "使ç¨é½å¹³ä¸ºé¶åå¼å¸¸é½å¹³ä¸ºé¶"
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "彿éåæ¢æ¶æä»¶ä¹æ 声"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "å¯ç¨æ°æä»¶"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
msgid "Enable automatic analysis of audio"
msgstr "å¯ç¨é³é¢èªå¨åæ"
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
msgid "Replicate missing region channels"
msgstr "å¤å¶ç¼ºå¤±çåºå声é"
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "ç¬å¥ / éé³"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "éå½çç¬å¥ååéé³ï¼dBï¼"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "ç¬å¥åéé³"
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
msgid "Solo controls are Listen controls"
msgstr "åç¬æ§å¶å³æ¯è¯å¬æ§å¶"
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "ä¸å±ç¬å¥"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "æ¾ç¤ºç¬å¥éé³"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "ç¬å¥è¦çéé³"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr "éå½çç¬å¥ååéé³ï¼dBï¼"
+
+#: rc_option_editor.cc:2592
msgid "Listen Position"
msgstr "è¯å¬ä½ç½®"
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
msgid "after-fader (AFL)"
-msgstr "å置淡åï¼AFLï¼"
+msgstr "åç½®äºæ·¡åå¨ï¼AFL åç½®äºæ·¡åå¨è¯å¬ï¼"
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
msgid "pre-fader (PFL)"
-msgstr "å置淡åï¼PFLï¼"
+msgstr "åç½®äºæ·¡åå¨ï¼PFL åç½®äºæ·¡åå¨è¯å¬ï¼"
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
msgid "PFL signals come from"
-msgstr "å置淡åä¿¡å·æ¥èª"
+msgstr "PFLï¼åç½®äºæ·¡åå¨è¯å¬ï¼ä¿¡å·æ¥èª"
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
msgid "before pre-fader processors"
-msgstr "å¨å置淡åå¤çå¨ä¹å"
+msgstr "å¨åç½®äºæ·¡åå¨å¤çå¨ä¹å"
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
msgid "pre-fader but after pre-fader processors"
-msgstr "å置淡åä½å¨å置淡åå¤çå¨ä¹å"
+msgstr "åç½®äºæ·¡åå¨ä½å¨åç½®äºæ·¡åå¨å¤çå¨ä¹å"
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
msgid "AFL signals come from"
-msgstr "å置淡åä¿¡å·æ¥èªäº"
+msgstr "AFLï¼åç½®äºæ·¡åå¨è¯å¬ï¼ä¿¡å·æ¥èªäº"
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
msgid "immediately post-fader"
-msgstr "ç«å³å置淡å"
+msgstr "ç«å³åç½®äºæ·¡åå¨"
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
msgid "after post-fader processors (before pan)"
-msgstr "å置淡åå¤çå¨ä¹åï¼å¹³ç§»ä¹åï¼"
-
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "ä¸å±ç¬å¥"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "æ¾ç¤ºç¬å¥éé³"
+msgstr "åç½®äºæ·¡åå¨å¤çå¨ä¹åï¼å£°ç¸ä¹åï¼"
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "ç¬å¥è¦çéé³"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
msgid "Default track / bus muting options"
msgstr "é»è®¤é³è½¨ / æ»çº¿éé³é项"
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
msgid "Mute affects pre-fader sends"
-msgstr "é鳿æå置淡ååé"
+msgstr "é鳿æåç½®äºæ·¡åå¨åé端"
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
msgid "Mute affects post-fader sends"
-msgstr "é鳿æå置淡ååé"
+msgstr "é鳿æåç½®äºæ·¡åå¨åé端"
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
msgid "Mute affects control outputs"
msgstr "éé³æææ§å¶è¾åº"
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
msgid "Mute affects main outputs"
msgstr "é鳿æä¸»è¦è¾åº"
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
msgid "Send Routing"
-msgstr "åéè·¯ç±"
+msgstr "åé端路ç±"
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr "龿¥è¾
å©åå¤é¨åé颿¿åé»è®¤ç主è¦é¢æ¿"
+msgstr "龿¥å¸¦æé»è®¤ä¸»è¦å£°ç¸å¨è¾
å©åå¤é¨åé端ç声ç¸å¨"
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr "MIDI é¦é项"
+
+#: rc_option_editor.cc:2677
msgid "MIDI read-ahead time (seconds)"
msgstr "MIDI é¢å
è¯»åæ¶é´ï¼ç§ï¼"
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "åå§ç¨åºæ¹å"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "æ¾ç¤ºç¬¬ä¸ä¸ª MIDI åº/ç¨åºä¸º 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "ä¸åæ¾ç¤ºå®æ MIDI ä¿¡æ¯ï¼MTC MIDIæ¶é´ç , MIDI 计æ¶å¨ï¼"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr "ä¸åæ¾ç¤ºå®æ MIDI ä¿¡æ¯ï¼MTC âé³ä¹è®¾å¤æ°åæ¥å£æ¶é´ç â, MIDI 计æ¶å¨ï¼"
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "åé端 MIDI æ§å¶åé¦"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/忥"
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr "MIDI 计æ¶å¨"
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr "MIDI æ¶é´ç ï¼MTCï¼"
+
+#: rc_option_editor.cc:2740
msgid "Send MIDI Time Code"
-msgstr "åé MIDI æ¶é´ç "
+msgstr "åé端 MIDI æ¶é´ç "
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
msgid "Percentage either side of normal transport speed to transmit MTC"
-msgstr "æ£å¸¸æéé度ä¸ä¼ è¾ MTC ä¹é´çç¾åæ¯"
+msgstr "æ£å¸¸æéé度ä¸ä¼ è¾ MTCï¼MIDI æ¶é´ç ï¼ä¹é´çç¾åæ¯"
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr "Midi æºå¨æ§å¶ï¼MMCï¼"
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2759
msgid "Obey MIDI Machine Control commands"
msgstr "éµå® MIDI æºå¨æ§å¶å½ä»¤"
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
msgid "Send MIDI Machine Control commands"
-msgstr "åé MIDI æºå¨æ§å¶å½ä»¤"
+msgstr "åé端 MIDI æºå¨æ§å¶å½ä»¤"
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "åé MIDI æ§å¶åé¦"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
msgid "Inbound MMC device ID"
-msgstr "è¿åºç MMC è®¾å¤ ID"
+msgstr "è¿åºç MMCï¼Midi æºå¨æ§å¶ï¼è®¾å¤ ID"
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
msgid "Outbound MMC device ID"
-msgstr "åºåºç MMC è®¾å¤ ID"
-
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "åå§ç¨åºæ¹å"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "æ¾ç¤ºç¬¬ä¸ä¸ª MIDI åº/ç¨åºä¸º 0"
+msgstr "åºåºç MMCï¼Midi æºå¨æ§å¶ï¼è®¾å¤ ID"
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "ä¸åæ¾ç¤ºå®æ MIDI ä¿¡æ¯ï¼MTC, MIDI 计æ¶å¨ï¼"
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "å½ MIDI é³ç¬¦è¢«é䏿¶ååºå£°é³"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
msgid "Midi Audition"
msgstr "Midi çå¬"
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
msgid "Midi Audition Synth (LV2)"
msgstr "Midi çå¬åæï¼LV2ï¼"
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
msgid "User interaction"
msgstr "ç¨æ·äº¤äº"
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
@@ -9810,245 +11738,491 @@ msgstr ""
" <i>ï¼è¦æ±éå¯ %1 以çæï¼</i>\n"
" <i>ï¼å¦ææ¨çè¯è¨é¦é项å¯ç¨ï¼</i>"
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
msgid "Keyboard"
msgstr "é®ç"
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "æ§å¶é¢è¿ç¨ ID"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr "æ«ææä»¶"
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr "éç¨"
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr "æ»æ¯æ¾ç¤ºæä»¶æ«æç¨åº"
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+"<b>å¯ç¨æ¶</b> ä¸ä¸ªå¼¹åºçªå£æ¾ç¤ºæä»¶æ«æç¨åºï¼ä»¥å±ç¤ºç´¢å¼ï¼ç¼åè½½å
¥ï¼ååç°ï¼æ¢"
+"æµæ°æä»¶ï¼ã"
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "彿éåæ¢æ¶æä»¶ä¹æ 声"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+"<b>å½å¯ç¨æ¶</b> 卿é忢æ¶ï¼æä»¶å°è¢«éç½®ã 卿é忢æ¶ï¼è¢«ç¦ç¨çæä»¶æ¶å°ä¿"
+"æä¸åã\n"
+"\n"
+"è¿ä¸»è¦ä¼å½±åå°å¸¦æä¸ä¸ªâå°å°¾å·´âçæä»¶ï¼è¯¸å¦æ··åå¨ã"
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "å¯ç¨æ°æä»¶"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+"<b>å½å¯ç¨æ¶</b> å½æä»¶è¢«æ·»å å°é³è½¨/æ»çº¿æ¶ï¼æä»¶å°è¢«æ¿æ´»ãå½ç¦ç¨æä»¶æ¶ï¼æ·»å å°"
+"é³è½¨/æ»çº¿çæä»¶å°ä¿æéæ´»å¨ç¶æã"
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "æä»¶/VST"
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr "å¨åºç¨èµ·ç¹æ«æ [æ°] VST æä»¶"
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+"<b>å¯ç¨æ¶</b> æ°ç VST æä»¶è¢«æç´¢ãæµè¯ä»¥åæ·»å å°åºç¨èµ·ç¹çç¼åç´¢å¼ä¸ãå½ç¦ç¨"
+"æ°æä»¶æ¶ï¼ä»
卿å¨è§¦åâæ«æâæ¶å¯ç¨ã"
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr "åé¿çæä»¶æ«æ"
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr "<b>å¯ç¨æ¶</b>æ¯ä¸ªæä»¶é¢å¤çä¿¡æ¯ä¼è¢«æ·»å å°æ¥å¿çªå£ã"
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr "VST ç¼åï¼"
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr "VST é»ååï¼"
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr "Linux VST è·¯å¾ï¼"
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr "è·¯å¾ï¼"
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr "Windows VST è·¯å¾ï¼"
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "æä»¶/é³é¢åå
"
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr "é³é¢åå
"
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr "å¨åºç¨èµ·ç¹æ«æé³é¢å使件"
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+"<b>å¯ç¨æ¶</b> é³é¢åä½æä»¶è¢«åºç¨èµ·ç¹åç°ãå½ç¦ç¨é³é¢å使件æ¶ï¼ä»
卿å¨è§¦"
+"åâæ«æâæ¶å¯ç¨ãç¬¬ä¸æ¬¡æåçæ«æå°å¯ç¨é³é¢åä½èªå¨æ«æï¼è¥æä»¶åç°ä»»ä½å´©æºç"
+"æ
åµé½å°ç¦ç¨èªå¨æ«æã"
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr "AU ç¼åï¼"
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr "AU é»ååï¼"
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr "æä»¶ç¨æ·å¾å½¢çé¢"
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr "æ·»å æ°çæä»¶æ¶èªå¨æå¼æä»¶ç¨æ·å¾å½¢çé¢"
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "卿··é³å¨å·¥å
·æ ä¸é»è®¤æ¾ç¤ºæä»¶å
èæ¾ç¤º"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr "彿件æä¸ä¸ªå
èæ¾ç¤ºæ¨¡å¼æ¶ï¼ä¸è¦èªå¨æå¼æä»¶ GUIï¼å¾å½¢ç¨æ·çé¢ï¼"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "ä¹å¨"
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "ç±ç¨æ·æå®"
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "é®è¯¢æ¯å¦æ¿æ¢å·²åå¨çä¹å¨æä»¶"
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "æ··é³å¨æå¦ä¸æåº"
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr "æå
¥æ¶äº¤äºå¼é
ç½®ä¹å¨æä»¶"
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+"<b>å½å¯ç¨æ¶</b>æ¾ç¤ºä¸ä¸ªå¯¹è¯æ¡ä»¥ä¾¿äºå¨æ·»å ä¸ä¸ªå¤å声éæä»¶åéæ©ä¹å¨å£°éé
ç½®ã"
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr "ç¦æ¢å¾å½¢ç¡¬ä»¶å éï¼éè¦éæ°å¯å¨ï¼"
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+"å¨è½¯ä»¶ä¸æ¸²æå¤§é¨ååºç¨ç¨åºç¨æ·çé¢ï¼è䏿¯ä½¿ç¨2Då¾å½¢å éã\n"
+"å¨çæåéè¦éæ°å¯å¨ %1"
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
msgid "Preferences|GUI"
msgstr "é¦é项|å¾å½¢ç¨æ·çé¢"
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr "å¯è½æé«ç¼æ
¢çå¾å½¢æ§è½ï¼éè¦éæ°å¯å¨ï¼"
+
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+"å¨æç¼ºé·çè§é¢é©±å¨ä¸ç¦ç¨ç¡¬ä»¶æ¢¯åº¦æ¸²æ (\"ç¼ºé·æ¢¯åº¦è¡¥ä¸\").\n"
+"å¨çæåéè¦éæ°å¯å¨ %1"
+
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr "使ç¨çªå£ç®¡çå¨/æ¡é¢å¯è§åä¿¡æ¯"
+
+#: rc_option_editor.cc:3072
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "彿¬åå¨åç§å°é¨ä»¶ä¸é¢æ¶æ¾ç¤ºé¼ æ æé"
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3080
msgid "Show tooltips if mouse hovers over a control"
msgstr "å¦æé¼ æ æ¬åå¨ä¸ä¸ªæ§ä»¶ä¸é¢æ¶æ¾ç¤ºå·¥å
·æç¤º"
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3088
msgid "Use name highlight bars in region displays (requires a restart)"
msgstr "å¨åºåæ¾ç¤ºä¸ä½¿ç¨åç§°çªåºæ¾ç¤ºæ ï¼éè¦éæ°å¯å¨ï¼"
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
msgstr "以 FPS æ¿ä»£æ¯ 100ms æ´æ°æé计æ¶å¨æ¾ç¤º"
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
+msgstr "波形å¾åç¼å尺寸ï¼å
åèï¼"
+
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr "å¢å ç¼å大å°ä¼ä½¿ç¨æ´å¤çå
忥å卿³¢å½¢å¾åï¼å¯ä»¥æé«å¾å½¢æ§è½ã"
+
+#: rc_option_editor.cc:3127
msgid "Lock timeout (seconds)"
msgstr "éå®è¶
æ¶ï¼ç§ï¼"
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3135
msgid "Lock GUI after this many idle seconds (zero to never lock)"
msgstr "å¨ç©ºé²è¿ä¹å¤ç§ä¹åéå®å¾å½¢ç¨æ·çé¢ï¼é¶åæ°¸ä¸éå®ï¼"
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3153
msgid "Mixer Strip"
-msgstr "æ··é³å¨æ "
+msgstr "æ··é³å¨å·¥å
·æ "
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3163
msgid "Use narrow strips in the mixer by default"
-msgstr "é»è®¤å¨æ··é³å¨é使ç¨ç»é¿æ "
-
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+msgstr "é»è®¤å¨æ··é³å¨é使ç¨ç»é¿æ¡å·¥å
·æ "
+
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr "å¨ä½èæ¬æé®å¯è§"
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
msgid "Preferences|Metering"
-msgstr "é¦é项|èæ"
+msgstr "é¦é项|计é"
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3180
msgid "Peak hold time"
msgstr "å³°å¼åçæ¶é´"
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3186
msgid "short"
msgstr "ç"
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3187
msgid "medium"
msgstr "ä¸"
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3188
msgid "long"
msgstr "é¿"
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3194
msgid "DPM fall-off"
msgstr "DPM è¡°å"
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3200
msgid "slowest [6.6dB/sec]"
msgstr "ææ
¢ [6.6dB/sec]"
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3201
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "æ
¢ [8.6dB/sec] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "ç¨æ
¢ [12.0dB/sec] (DIN)"
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "ç¨³å¥ [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr "ç¨³å¥ [12.0dB/sec] (DIN)"
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
-msgstr "ä¸ç [20dB/sec]"
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr "ä¸ç [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
-msgstr "å¿« [32dB/sec]"
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
+msgstr "å¿« [20dB/sec]"
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr "è¾å¿« [46dB/sec]"
-
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr "æå¿« [70dB/sec]"
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
+msgstr "å¾å¿« [32dB/sec]"
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3211
msgid "Meter line-up level; 0dBu"
-msgstr "èææéçµå¹³ï¼0dBu"
+msgstr "计éæéçµå¹³ï¼0dBu"
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-msgstr ""
+msgstr "-24dBFSï¼é³è§é¢åæ¥ç ç¾å½ï¼4dBu = -20dBFSï¼"
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
msgid "-20dBFS (SMPTE RP.0155)"
-msgstr ""
+msgstr "-20dBFSï¼é³è§é¢åæ¥ç RP.0155ï¼"
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
msgid "-18dBFS (EBU, BBC)"
-msgstr ""
+msgstr "-18dBFSï¼æ¬§æ´²å¹¿æèçï¼è±å½å¹¿æå
¬å¸ï¼"
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
msgid "-15dBFS (DIN)"
-msgstr ""
+msgstr "-15dBFSï¼å¾·å½å·¥ä¸æ åï¼"
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3221
msgid ""
-"Configure meter-marks and color-knee point for dBFS scale DPM, set reference level "
-"for IEC1/Nordic, IEC2 PPM and VU meter."
+"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
+"level for IEC1/Nordic, IEC2 PPM and VU meter."
msgstr ""
-"é
ç½®èææ å¿å转è§é¢è²ç¹ç¨äº dBFS ç¼©æ¾ DPMï¼ä¸º IEC1/NordicãIEC2 PPM å VU èæè®¾ç½®"
-"åèçµå¹³ã"
+"é
ç½®èææ å¿å转è§é¢è²ç¹ç¨äº dBFS ç¼©æ¾ DPMï¼ä¸º IEC1/NordicãIEC2 PPM å VU è"
+"æè®¾ç½®åèçµå¹³ã"
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3227
msgid "IEC1/DIN Meter line-up level; 0dBu"
-msgstr "IEC1/DIN èææéçµå¹³ï¼0dBu"
+msgstr "IEC1/DIN 计éæéçµå¹³ï¼0dBu"
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3237
msgid "Reference level for IEC1/DIN meter."
-msgstr "IEC1/DIN èæåèçµå¹³ã"
+msgstr "IEC1/DIN 计éåèçµå¹³ã"
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3243
msgid "VU Meter standard"
-msgstr "VU èææ å"
+msgstr "VU è®¡éæ å"
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3248
msgid "0VU = -2dBu (France)"
msgstr "0VU = -2dBu ï¼æ³å½ï¼"
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3249
msgid "0VU = 0dBu (North America, Australia)"
msgstr "0VU = 0dBu ï¼åç¾ï¼æ¾³æ´²ï¼"
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3250
msgid "0VU = +4dBu (standard)"
msgstr "0VU = +4dBu ï¼æ åï¼"
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3251
msgid "0VU = +8dBu"
msgstr ""
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3257
msgid "Peak threshold [dBFS]"
msgstr "å³°å¼ä¸´çå¼ [dBFS]"
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr "ä¸»æ§æ»çº¿çé»è®¤èæç±»å"
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr "æ»çº¿çé»è®¤èæç±»å"
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr "é³è½¨çé»è®¤èæç±»å"
+
+#: rc_option_editor.cc:3313
msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak indicator "
-"will flash red."
-msgstr "以 dbFS æå®é³é¢ä¿¡å·çµå¹³ï¼è¾¾å°ä»¥åè¶
è¿èæå³°æ¶ï¼å¼æç¤ºå¨å°éªç红ç¯ã"
+"Specify the audio signal level in dBFS at and above which the meter-peak "
+"indicator will flash red."
+msgstr "以 dBFS æå®é³é¢ä¿¡å·çµå¹³ï¼é«äºè®¡é峰弿æ å°éªç红è²ã"
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3320
msgid "LED meter style"
-msgstr "LED èæç±»å"
+msgstr "LED 计éç±»å"
+
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "ç¼è¾å¨èæ"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "å¨ç¼è¾å¨çé³è½¨ä¸æ¾ç¤ºèæ"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr "å¨é³è½¨å¤´é¨æ¾ç¤ºå¤§é¨åç«ä½å£°èæ"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr "å置导åºåæ"
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "ä¿åå度åæä¸ºå¾åæä»¶"
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3356
msgid "Theme"
msgstr "主é¢"
-#: region_editor.cc:79
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "主é¢/é¢è²"
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr "设置 Linux VST æç´¢è·¯å¾"
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr "设置 Windows VST æç´¢è·¯å¾"
+
+#: region_editor.cc:81
msgid "audition this region"
msgstr "ç嬿¤åºå"
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
msgid "Position:"
msgstr "ä½ç½®ï¼"
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
msgid "End:"
msgstr "ç»ç¹ï¼"
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
msgid "Length:"
msgstr "é¿åº¦ï¼"
-#: region_editor.cc:94
+#: region_editor.cc:96
msgid "Sync point (relative to region):"
msgstr "忥ç¹ï¼ç¸å¯¹äºåºåï¼ï¼"
-#: region_editor.cc:96
+#: region_editor.cc:98
msgid "Sync point (absolute):"
-msgstr "忥ç¹ï¼ç»å¯¹ï¼ï¼"
+msgstr "忥ç¹ï¼ç»å¯¹ï¼"
-#: region_editor.cc:98
+#: region_editor.cc:100
msgid "File start:"
msgstr "æä»¶èµ·ç¹ï¼"
-#: region_editor.cc:102
+#: region_editor.cc:104
msgid "Sources:"
-msgstr "æºï¼"
+msgstr "æ¥æºï¼"
-#: region_editor.cc:104
+#: region_editor.cc:106
msgid "Source:"
-msgstr "æºï¼"
+msgstr "æ¥æºï¼"
-#: region_editor.cc:166
+#: region_editor.cc:168
msgid "Region '%1'"
msgstr "åºå '%1'"
-#: region_editor.cc:273
+#: region_editor.cc:279
msgid "change region start position"
msgstr "æ¹ååºåèµ·ç¹ä½ç½®"
-#: region_editor.cc:289
+#: region_editor.cc:299
msgid "change region end position"
msgstr "æ¹ååºåç»ç¹ä½ç½®"
-#: region_editor.cc:309
+#: region_editor.cc:322
msgid "change region length"
msgstr "æ¹ååºåé¿åº¦"
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
msgid "change region sync point"
msgstr "æ¹ååºå忥ç¹"
@@ -10068,32 +12242,32 @@ msgstr "é³è½¨ï¼"
msgid "Choose Top Region"
msgstr "鿩顶é¨åºå"
-#: region_view.cc:277
+#: region_view.cc:271
msgid "SilenceText"
msgstr "æ å£°ææ¬"
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
msgid "minutes"
msgstr "åé"
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
msgid "msecs"
msgstr "毫ç§"
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
msgid "secs"
msgstr "ç§"
-#: region_view.cc:301
+#: region_view.cc:295
msgid "%1 silent segment"
msgid_plural "%1 silent segments"
msgstr[0] "%1 æ å£°çæ®µ"
-#: region_view.cc:303
+#: region_view.cc:297
msgid "shortest = %1 %2"
msgstr "æç = %1 %2"
-#: region_view.cc:320
+#: region_view.cc:314
msgid ""
"\n"
" (shortest audible segment = %1 %2)"
@@ -10141,55 +12315,63 @@ msgstr ""
msgid "Modified Kullback-Liebler"
msgstr "æ¹è¯ç Kullback-Liebler"
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "é¢è°±æµé"
+
+#: rhythm_ferret.cc:68
msgid "Split region"
msgstr "æååºå"
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
msgid "Snap regions"
msgstr "å¸éåºå"
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
msgid "Conform regions"
msgstr "éåºåºå"
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
msgid "Rhythm Ferret"
msgstr "è奿¢æµ"
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
msgid "Analyze"
msgstr "åæ"
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
msgid "Detection function"
msgstr "æ£æµåè½"
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "触åé´é"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr "触åå¨é´éï¼åæå¤çï¼"
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "临çå¼"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
msgid "Peak threshold"
msgstr "å³°å¼ä¸´çå¼"
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
msgid "Silence threshold"
msgstr "æ 声临çå¼"
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr "æå°å
å¨å¯å¨æ¶é´"
+
+#: rhythm_ferret.cc:148
msgid "Sensitivity"
msgstr "çµæåº¦"
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr "åªå Pos 临çå¼"
+
+#: rhythm_ferret.cc:157
msgid "Operation"
msgstr "æä½"
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
msgid "split regions (rhythm ferret)"
msgstr "æååºåï¼è奿¢æµï¼"
@@ -10213,19 +12395,15 @@ msgstr "å¯ç¨å½å¶"
msgid "Active state"
msgstr "æ¿æ´»ç¶æ"
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "é¢è²"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
msgid "RouteGroupDialog"
msgstr "è·¯ç±åç»å¯¹è¯æ¡"
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
msgid "<b>Sharing</b>"
msgstr "<b>å
±äº«ä¸</b>"
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
msgid "The group name is not unique. Please use a different name."
msgstr "åç»åç§°æéå¤ã请使ç¨å¦ä¸ä¸ªåç§°ã"
@@ -10243,427 +12421,394 @@ msgstr "è¾åº"
#: route_params_ui.cc:105
msgid "Plugins, Inserts & Sends"
-msgstr "æä»¶ï¼æå
¥ååé"
+msgstr "æä»¶ï¼æå
¥ååé端"
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
msgid "route display list item for renamed route not found!"
msgstr "æªæ¾å°å·²éå½åè·¯ç±çè·¯ç±æ¾ç¤ºå表æ¡ç®ï¼"
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
#, c-format
msgid "Playback delay: %<PRId64> samples"
-msgstr "忾延è¿ï¼ %<PRId64> éæ ·"
+msgstr "忾延è¿ï¼ %<PRId64> æ ·æ¬"
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
msgid "NO TRACK"
msgstr "没æé³è½¨"
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "æ·»å é³è½¨ææ»çº¿"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
msgid "No Track or Bus Selected"
msgstr "没æé³è½¨ææ»çº¿è¢«éä¸"
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
msgid "Record (Right-click for Step Edit)"
msgstr "å½å¶ï¼å³é®ç¹å»æ¥è¿ç¼è¾ï¼"
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
msgid "Record"
msgstr "å½å¶"
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
msgid "Route Group"
msgstr "è·¯ç±åç»"
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
msgid "MIDI Controllers and Automation"
msgstr "MIDI æ§å¶å¨åèªå¨å"
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
msgid "Show All Automation"
msgstr "æ¾ç¤ºææçèªå¨å"
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
msgid "Show Existing Automation"
msgstr "æ¾ç¤ºå·²æçèªå¨å"
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
msgid "Hide All Automation"
msgstr "éèææèªå¨å"
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
msgid "Processor automation"
msgstr "å¤çå¨èªå¨å"
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
msgid "Fader"
-msgstr "æ·¡å"
+msgstr "æ·¡åå¨"
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
msgid "Pan"
-msgstr "平移"
+msgstr "声ç¸"
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
msgid "Overlaid"
msgstr "éå "
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
msgid "Stacked"
msgstr "å æ "
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
msgid "Layers"
msgstr "å±"
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
msgid "Automatic (based on I/O connections)"
msgstr "èªå¨çï¼åºäºè¾å
¥/è¾åºè¿æ¥ï¼"
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
msgid "(Currently: Existing Material)"
msgstr "ï¼å½åï¼ç°æææï¼"
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
msgid "(Currently: Capture Time)"
msgstr "ï¼å½åï¼æè·æ¶é´ï¼"
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
msgid "Align With Existing Material"
-msgstr "ä¸ç°æææå¯¹é½"
+msgstr "对é½å·²åå¨çææ"
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
msgid "Align With Capture Time"
-msgstr "ä¸æè·æ¶é´å¯¹é½"
+msgstr "å¯¹é½æè·æ¶é´"
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
msgid "Alignment"
msgstr "对é½"
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
msgid "Normal Mode"
msgstr "æ£å¸¸æ¨¡å¼"
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
msgid "Tape Mode"
msgstr "ç£å¸¦æ¨¡å¼"
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
msgid "Non-Layered Mode"
msgstr "ä¸å屿¨¡å¼"
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
msgid "Record Mode"
msgstr "å½å¶æ¨¡å¼"
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
msgid "Playlist"
msgstr "ææ¾å表"
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
msgid "Rename Playlist"
msgstr "éå½åææ¾å表"
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
msgid "New name for playlist:"
msgstr "ææ¾åè¡¨çæ°åç§°ï¼"
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
msgid "New Copy Playlist"
msgstr "æ°å»ºææ¾å表æ·è´"
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
msgid "Name for new playlist:"
msgstr "æ°ææ¾å表åç§°ï¼"
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
msgid "New Playlist"
msgstr "æ°å»ºææ¾å表"
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "æ æ³ä»¥æ¤åç§°å建é³è½¨ï¼å 为å®è¢« %1 ä¿ç使ç¨"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr "åç§° \"%1\" å·²ç»è¢«é¢çç» %2"
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
msgid "New Copy..."
msgstr "æ°å»ºæ·è´â¦"
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
msgid "New Take"
msgstr "æ°å»ºç£å¸¦"
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
msgid "Copy Take"
msgstr "æ·è´ç£å¸¦"
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
msgid "Clear Current"
msgstr "æ¸
é¤å½å"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
msgstr "éæ©ææâ¦"
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
msgid "Take: %1.%2"
msgstr "ç£å¸¦ï¼%1.%2"
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
msgid "programming error: "
msgstr "ç¨åºé误ï¼"
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
msgid "Underlays"
msgstr "åºå±"
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
msgid "Remove \"%1\""
msgstr "ç§»é¤ \"%1\""
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
msgid "programming error: underlay reference pointer pairs are inconsistent!"
msgstr "ç¨åºé误ï¼åºå±åèæéæé
ä¸ä¸è´ï¼"
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
msgid "After-fade listen (AFL)"
-msgstr "å置淡åè¯å¬ï¼AFLï¼"
+msgstr "åç½®äºæ·¡åå¨è¯å¬ï¼AFLï¼"
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
msgid "Pre-fade listen (PFL)"
-msgstr "å置淡åè¯å¬ï¼PFLï¼"
+msgstr "åç½®äºæ·¡åå¨è¯å¬ï¼PFLï¼"
-#: route_ui.cc:140
+#: route_ui.cc:165
msgid "Mute this track"
msgstr "é鳿¤é³è½¨"
-#: route_ui.cc:144
+#: route_ui.cc:169
msgid "Mute other (non-soloed) tracks"
-msgstr "éé³å
¶å®ï¼éç¬å¥ï¼é³è½¨"
+msgstr "éé³å
¶å®ï¼éå·²ç¬å¥ï¼é³è½¨"
-#: route_ui.cc:150
+#: route_ui.cc:175
msgid "Enable recording on this track"
msgstr "卿¤é³è½¨å¯ç¨å½å¶"
-#: route_ui.cc:158
+#: route_ui.cc:183
msgid "make mixer strips show sends to this bus"
-msgstr "让混é³å¨æ æ¾ç¤ºåéå°è¯¥æ»çº¿"
+msgstr "让混é³å¨æ æ¾ç¤ºåé端å°è¯¥æ»çº¿"
-#: route_ui.cc:163
+#: route_ui.cc:188
msgid "Monitor input"
msgstr "çæ§è¾å
¥"
-#: route_ui.cc:169
+#: route_ui.cc:194
msgid "Monitor playback"
msgstr "çæ§åæ¾"
-#: route_ui.cc:676
+#: route_ui.cc:706
msgid "Not connected to AudioEngine - cannot engage record"
-msgstr "æªè¿æ¥å°é³é¢å¼æââæ æ³ä»äºå½å¶"
+msgstr "æªè¿æ¥å°é³é¢å¼æ ââ æ æ³ä»äºå½å¶"
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr "å½å¶-å®å
¨"
+
+#: route_ui.cc:888
msgid "Step Entry"
msgstr "æ¥è¿å
¥å£"
-#: route_ui.cc:948
+#: route_ui.cc:987
msgid "Assign all tracks (prefader)"
-msgstr "æå®ææé³è½¨ï¼å置淡åï¼"
+msgstr "æå®ææé³è½¨ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:952
+#: route_ui.cc:991
msgid "Assign all tracks and buses (prefader)"
-msgstr "æå®ææé³è½¨åæ»çº¿ï¼å置淡åï¼"
+msgstr "æå®ææé³è½¨åæ»çº¿ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:956
+#: route_ui.cc:995
msgid "Assign all tracks (postfader)"
-msgstr "æå®ææé³è½¨ï¼å置淡åï¼"
+msgstr "æå®ææé³è½¨ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:960
+#: route_ui.cc:999
msgid "Assign all tracks and buses (postfader)"
-msgstr "æå®ææé³è½¨åæ»çº¿ï¼å置淡åï¼"
+msgstr "æå®ææé³è½¨åæ»çº¿ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:964
+#: route_ui.cc:1003
msgid "Assign selected tracks (prefader)"
-msgstr "æå®å·²éä¸çé³è½¨ï¼å置淡åï¼"
+msgstr "æå®å·²éä¸çé³è½¨ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:968
+#: route_ui.cc:1007
msgid "Assign selected tracks and buses (prefader)"
-msgstr "æå®å·²éä¸çé³è½¨åæ»çº¿ï¼å置淡åï¼"
+msgstr "æå®å·²éä¸çé³è½¨åæ»çº¿ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:971
+#: route_ui.cc:1010
msgid "Assign selected tracks (postfader)"
-msgstr "æå®å·²éä¸çé³è½¨ï¼å置淡åï¼"
+msgstr "æå®å·²éä¸çé³è½¨ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:975
+#: route_ui.cc:1014
msgid "Assign selected tracks and buses (postfader)"
-msgstr "æå®å·²éä¸çé³è½¨åæ»çº¿ï¼å置淡åï¼"
+msgstr "æå®å·²éä¸çé³è½¨åæ»çº¿ï¼åç½®äºæ·¡åå¨ï¼"
-#: route_ui.cc:978
+#: route_ui.cc:1017
msgid "Copy track/bus gains to sends"
-msgstr "å¤å¶é³è½¨/æ»çº¿å¢çå°åé"
+msgstr "å¤å¶é³è½¨/æ»çº¿å¢çå°åé端"
-#: route_ui.cc:979
+#: route_ui.cc:1018
msgid "Set sends gain to -inf"
-msgstr "设置åéå¢çå° -inf"
+msgstr "设置åé端å¢çå° -inf"
-#: route_ui.cc:980
+#: route_ui.cc:1019
msgid "Set sends gain to 0dB"
-msgstr "设置åéå¢çå° 0dB"
+msgstr "设置åé端å¢çå° 0dB"
-#: route_ui.cc:1300
+#: route_ui.cc:1357
msgid "Solo Isolate"
msgstr "ç¬å¥é离"
-#: route_ui.cc:1307
+#: route_ui.cc:1364
msgid "Solo Safe"
msgstr "ç¬å¥å®å
¨"
-#: route_ui.cc:1329
+#: route_ui.cc:1386
msgid "Pre Fader Sends"
-msgstr "å置淡ååé"
+msgstr "åç½®äºæ·¡åå¨åé端"
-#: route_ui.cc:1335
+#: route_ui.cc:1392
msgid "Post Fader Sends"
-msgstr "å置淡ååé"
+msgstr "åç½®äºæ·¡åå¨åé端"
-#: route_ui.cc:1341
+#: route_ui.cc:1398
msgid "Control Outs"
msgstr "æ§å¶è¾åº"
-#: route_ui.cc:1347
+#: route_ui.cc:1404
msgid "Main Outs"
msgstr "主è¦è¾åº"
-#: route_ui.cc:1479
+#: route_ui.cc:1571
msgid "Color Selection"
msgstr "é¢è²å·²éæ©é¨å"
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"æ¨æ¯å¦ççè¦ç§»é¤é³è½¨ \"%1\"ï¼\n"
-"\n"
-"æ¨ä¹å¯è½ä¼å¤±å»ä½¿ç¨æ¤é³è½¨ä½¿ç¨çææ¾å表ã\n"
-"\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"æ¨æ¯å¦ççè¦ç§»é¤æ»çº¿\"%1\" ï¼\n"
-"\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "ç§»é¤é³è½¨"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "ç§»é¤æ»çº¿"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
msgid ""
"The use of colons (':') is discouraged in track and bus names.\n"
"Do you want to use this new name?"
msgstr ""
-"建议ä¸è¦å¨é³è½¨åæ»çº¿åç§°ä¸ä½¿ç¨åå·ï¼â : âï¼ã\n"
-"æ¨æ¯å¦ç¡®å®ä½¿ç¨è¿ä¸ªæ°åç§°ï¼"
+"建议ä¸è¦å¨é³è½¨åæ»çº¿åç§°ä¸ä½¿ç¨åå·ï¼â:âï¼ã\n"
+"æ¨æ¯å¦æç®ä½¿ç¨è¿ä¸ªæ°åç§°ï¼"
-#: route_ui.cc:1608
+#: route_ui.cc:1617
msgid "Use the new name"
msgstr "ä½¿ç¨æ°åç§°"
-#: route_ui.cc:1609
+#: route_ui.cc:1618
msgid "Re-edit the name"
msgstr "éæ°ç¼è¾åç§°"
-#: route_ui.cc:1622
+#: route_ui.cc:1631
msgid "Rename Track"
msgstr "éå½åé³è½¨"
-#: route_ui.cc:1624
+#: route_ui.cc:1633
msgid "Rename Bus"
msgstr "éå½åæ»çº¿"
-#: route_ui.cc:1692
+#: route_ui.cc:1693
msgid ": comment editor"
msgstr "ï¼æ³¨éç¼è¾å¨"
-#: route_ui.cc:1858
+#: route_ui.cc:1848
msgid " latency"
msgstr "å»¶è¿"
-#: route_ui.cc:1871
+#: route_ui.cc:1888
msgid "Cannot create route template directory %1"
msgstr "æ æ³åå»ºè·¯ç±æ¨¡æ¿ç®å½ %1"
-#: route_ui.cc:1877
+#: route_ui.cc:1894
msgid "Save As Template"
msgstr "å¦å为模æ¿"
-#: route_ui.cc:1878
+#: route_ui.cc:1895
msgid "Template name:"
msgstr "模æ¿åç§°ï¼"
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ç§»é¤æ§å¶ ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr "å·¦é®ç¹å»ä»¥å转è¿é³è½¨ç声é %1 ç两æãå³é®ç¹å»æ¾ç¤ºèåã"
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "ç§»é¤æ§å¶ IDï¼"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr "ç¹å»æ¾ç¤ºå转两æç声éèå"
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-" %1 çè¿ç¨æ§å¶ ID æ¯ï¼%2\n"
-"\n"
-"\n"
-"%3 çè¿ç¨æ§å¶ ID æ æ³æ¹åã"
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr "忢尿°ä¿åççæ¬"
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "ä¸»æ§æ»çº¿"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr "å¤å¶åªä½å°æ°ä¼è¯"
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "çæ§æ»çº¿"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr "å¤å¶å¤é¨åªä½å°æ°ä¼è¯"
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to change this"
-"%4"
-msgstr ""
-"%5 çè¿ç¨æ§å¶ ID æ¯ï¼%2\n"
-"\n"
-"\n"
-"è¿ç¨æ§å¶ IDs æ¯ç±å½åé³è½¨/æ»çº¿å¨ %6 éçæåºæå³å®çã\n"
-"\n"
-"å¦ææ¨æ³æ¹å %4ï¼%3 使ç¨é¦é项çªå£çç¨æ·äº¤äºé项å¡"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr "æ°ä¿åçä¼è¯åºè¯¥æ¯ç©ºç"
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click to "
-"show menu."
-msgstr "å·¦é®ç¹å»å转ï¼ç¸ä½å转ï¼è¯¥é³è½¨ç声é %1 ãå³é®ç¹å»æ¾ç¤ºèåã"
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr "å¦å为ä¼è¯çåç§°"
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "ç¹å»æ¾ç¤ºå£°éå转ï¼ç¸ä½å转ï¼èå"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr "ç¶ç®å½/æä»¶å¤¹"
#: search_path_option.cc:35
msgid "Select folder to search for media"
@@ -10677,126 +12822,158 @@ msgstr "ç¹å»æ·»å ä¸ä¸ªæ°ä½ç½®"
msgid "the session folder"
msgstr "ä¼è¯æä»¶å¤¹"
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>ç±»åï¼</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr "<b>ä½è
ï¼</b>"
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr "<b>说æï¼</b>"
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr "éæ©èæ¬ä¸ä¼ "
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>åç§°ï¼</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>å®ä¾åæ°</b>"
+
#: send_ui.cc:134
msgid "Send "
-msgstr "åé"
+msgstr "åé端 "
-#: session_dialog.cc:61
+#: session_dialog.cc:71
msgid "Session Setup"
-msgstr "åé设置"
+msgstr "ä¼è¯è®¾ç½®"
-#: session_dialog.cc:66
+#: session_dialog.cc:76
msgid "Advanced options ..."
msgstr "é«çº§é项â¦"
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "æè¿çä¼è¯"
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr "éæ ·ç"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr "æä»¶å辨ç"
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr "䏿¬¡ä¿®æ¹ç"
+
+#: session_dialog.cc:338
msgid "New Session"
msgstr "æ°å»ºä¼è¯"
-#: session_dialog.cc:301
+#: session_dialog.cc:379
msgid "Check the website for more..."
-msgstr "æ¥è¯¢ç½ç«ä»¥å¾å°æ´å¤â¦"
+msgstr "æ¥è¯¢ç½ç«ä»¥è·åæ´å¤â¦"
-#: session_dialog.cc:304
+#: session_dialog.cc:382
msgid "Click to open the program website in your web browser"
msgstr "ç¹å»ä»¥ä¾¿å¨æ¨çç½é¡µæµè§å¨æå¼ç¨åºç½ç«"
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "éæ ·ç"
-
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "ç¡¬çæ ¼å¼å"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
msgid "Select session file"
msgstr "éæ©ä¼è¯æä»¶"
-#: session_dialog.cc:358
+#: session_dialog.cc:417
msgid "Other Sessions"
msgstr "å
¶å®ä¼è¯"
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr "å®å
¨æ¨¡å¼ï¼ç¦ç¨å
¨é¨æä»¶"
+
+#: session_dialog.cc:454
msgid "Open"
msgstr "æå¼"
-#: session_dialog.cc:451
+#: session_dialog.cc:521
msgid "Session name:"
msgstr "ä¼è¯åç§°ï¼"
-#: session_dialog.cc:473
+#: session_dialog.cc:543
msgid "Create session folder in:"
-msgstr "å建ä¼è¯æä»¶å¤¹å¨ï¼"
+msgstr "å建ä¼è¯æä»¶å¤¹ä½äºï¼"
-#: session_dialog.cc:496
+#: session_dialog.cc:564
msgid "Select folder for session"
msgstr "为ä¼è¯éæ©æä»¶å¤¹"
-#: session_dialog.cc:525
+#: session_dialog.cc:591
msgid "Use this template"
msgstr "ä½¿ç¨æ¤æ¨¡æ¿"
-#: session_dialog.cc:528
+#: session_dialog.cc:594
msgid "no template"
msgstr "æ²¡ææ¨¡æ¿"
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
msgstr "32 使µ®ç¹"
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 ä½"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr "24ä½"
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 ä½"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr "16ä½"
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
msgid "channels"
msgstr "声é"
-#: session_dialog.cc:763
+#: session_dialog.cc:893
msgid "<b>Busses</b>"
msgstr "<b>æ»çº¿</b>"
-#: session_dialog.cc:764
+#: session_dialog.cc:894
msgid "<b>Inputs</b>"
msgstr "<b>è¾å
¥</b>"
-#: session_dialog.cc:765
+#: session_dialog.cc:895
msgid "<b>Outputs</b>"
msgstr "<b>è¾åº</b>"
-#: session_dialog.cc:773
+#: session_dialog.cc:903
msgid "Create master bus"
msgstr "åå»ºä¸»æ§æ»çº¿"
-#: session_dialog.cc:783
+#: session_dialog.cc:913
msgid "Automatically connect to physical inputs"
msgstr "èªå¨è¿æ¥å°ç©çè¾å
¥"
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
msgid "Use only"
msgstr "ä»
使ç¨"
-#: session_dialog.cc:843
+#: session_dialog.cc:973
msgid "Automatically connect outputs"
msgstr "èªå¨è¿æ¥å°è¾åº"
-#: session_dialog.cc:865
+#: session_dialog.cc:995
msgid "... to master bus"
msgstr "â¦å°ä¸»æ§æ»çº¿"
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
msgid "... to physical outputs"
msgstr "â¦å°ç©çè¾åº"
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "ä»ä¼è¯å¯¼å
¥"
-
#: session_import_dialog.cc:74
msgid "Elements"
msgstr "å
ç´ "
@@ -10817,191 +12994,192 @@ msgstr "ä»ä¼è¯å¯¼å
¥"
msgid "This will select all elements of this type!"
msgstr "è¿å°éæ©æ¤ç±»åçææå
ç´ ï¼"
-#: session_metadata_dialog.cc:285
+# EAN å½é
æ¡å½¢ç ï¼International Article Numberï¼
+#: session_metadata_dialog.cc:288
msgid "EAN Check digit OK"
-msgstr "EAN æ ¡éªæ°ä½æ£å¸¸"
+msgstr "EANï¼æ¡å½¢ç ï¼æ ¡éªæ°ä½æ£å¸¸"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "EAN Check digit error"
-msgstr "EAN æ ¡éªæ°ä½åºé"
+msgstr "EANï¼æ¡å½¢ç ï¼æ ¡éªæ°ä½åºé"
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
msgid "expected"
msgstr "ææ"
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
msgid "EAN Length error"
-msgstr "EAN é¿åº¦é误"
+msgstr "EANï¼æ¡å½¢ç ï¼é¿åº¦é误"
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
msgid "Field"
msgstr "åæ®µ"
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
msgid "Values (current value on top)"
msgstr "æ°å¼ï¼å½åæ°å¼ä½äºé¡¶é¨ï¼"
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
msgid "User"
msgstr "ç¨æ·"
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
msgid "Email"
msgstr "çµåé®ä»¶"
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
msgid "Web"
msgstr "ç½ç«"
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
msgid "Organization"
msgstr "ç»ç»"
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
msgid "Country"
msgstr "å½å®¶"
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
msgid "Title"
msgstr "æ é¢"
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
msgid "Track Number"
msgstr "é³è½¨åºå·"
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
msgid "Subtitle"
msgstr "坿 é¢"
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
msgid "Grouping"
msgstr "ç»å"
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
msgid "Artist"
msgstr "èºæ¯å®¶"
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
msgid "Genre"
msgstr "æµæ´¾"
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
msgid "Comment"
msgstr "注é"
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
msgid "Copyright"
msgstr "çæ"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
msgid "Album"
msgstr "ä¸è¾"
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
msgid "Year"
msgstr "年份"
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
msgid "Album Artist"
msgstr "ä¸è¾èºæ¯å®¶"
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
msgid "Total Tracks"
msgstr "é³è½¨æ»æ°"
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
msgid "Disc Subtitle"
msgstr "å
ç坿 é¢"
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
msgid "Disc Number"
msgstr "å
çç¼å·"
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
msgid "Total Discs"
msgstr "å
çæ»æ°"
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
msgid "Compilation"
msgstr "ç¼çº"
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
msgid "ISRC"
-msgstr "ISRC å½é
æ åé³åå¶åç¼ç "
+msgstr "ISRCï¼å½é
æ åé³åå¶åç¼ç ï¼"
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
msgid "EAN barcode"
-msgstr "EAN æ¡å½¢ç "
+msgstr "EAN å½é
æ¡å½¢ç "
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
msgid "People"
msgstr "æ°æ"
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
msgid "Lyricist"
msgstr "ä½è¯"
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
msgid "Composer"
msgstr "使²å®¶"
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
msgid "Conductor"
msgstr "ææ¥å®¶"
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
msgid "Remixer"
msgstr "æ··é³å¸"
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
msgid "Arranger"
msgstr "ç¼æ²è
"
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
msgid "Engineer"
msgstr "å·¥ç¨å¸"
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
msgid "Producer"
msgstr "å¶ç人"
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
msgid "DJ Mixer"
msgstr "DJ æ··é³å¨"
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
msgid "Metadata|Mixer"
msgstr "å
æ°æ®|æ··é³å¨"
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
msgid "School"
msgstr "颿 ¡"
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
msgid "Instructor"
-msgstr "æå¯¼å"
+msgstr "导å¸"
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
msgid "Course"
msgstr "è¿ç¨"
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
msgid "Edit Session Metadata"
-msgstr "æ è®°ä¼è¯å
æ°æ®"
+msgstr "ç¼è¾ä¼è¯å
æ°æ®"
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
msgid "Import session metadata"
msgstr "导å
¥ä¼è¯å
æ°æ®"
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
msgid "Choose session to import metadata from"
msgstr "鿩坼å
¥å
æ°æ®çæ¥æºä¼è¯"
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
msgid "This session file could not be read!"
msgstr "æ¤ä¼è¯æä»¶æ æ³è¯»åï¼"
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
msgid ""
"The session file didn't contain metadata!\n"
"Maybe this is an old session format?"
@@ -11009,13 +13187,13 @@ msgstr ""
"æ¤ä¼è¯æä»¶ä¸å
å«å
æ°æ®ï¼\n"
"ä¹è®¸è¿æ¯ä¸ä¸ªæ§çä¼è¯æ ¼å¼ï¼"
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
msgid "Import all from:"
-msgstr "导å
¥ææä»ï¼"
+msgstr "导å
¥æææ¥èªäºï¼"
#: session_option_editor.cc:32
msgid "Session Properties"
-msgstr "ä¼è¯å±æ§ "
+msgstr "ä¼è¯å±æ§"
#: session_option_editor.cc:41
msgid "Timecode Settings"
@@ -11107,13 +13285,15 @@ msgstr ""
#: session_option_editor.cc:84
msgid ""
-"Use Video File's FPS Instead of Timecode Value for Timeline and Video Monitor."
-msgstr "为æ¶é´çº¿åè§é¢çæ§ä½¿ç¨è§é¢æä»¶ç FPS æ¿ä»£æ¶é´ç æ°å¼ã"
+"Use Video File's FPS Instead of Timecode Value for Timeline and Video "
+"Monitor."
+msgstr "为æ¶é´çº¿åè§é¢çæ§ä½¿ç¨è§é¢æä»¶ç FPSï¼å¸§çï¼æ¿ä»£æ¶é´ç æ°å¼ã"
#: session_option_editor.cc:91
msgid ""
-"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-sync)."
-msgstr "åºç¨ä¸æ/䏿å°è§é¢æ¶é´çº¿åè§é¢çæ§ï¼é¤éä½¿ç¨ JACK-忥ï¼"
+"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
+"sync)."
+msgstr "åºç¨ä¸æ/䏿å°è§é¢æ¶é´çº¿åè§é¢çæ§ï¼é¤éä½¿ç¨ JACK-忥ï¼ã"
#: session_option_editor.cc:96
msgid "Ext Timecode Offsets"
@@ -11125,234 +13305,260 @@ msgstr "ä»å±æ¶é´ç åç§»"
#: session_option_editor.cc:107
msgid "The specified offset is added to the received timecode (MTC or LTC)."
-msgstr "æå®çå移已被添å å°å·²æ¥æ¶çæ¶é´ç ï¼MTC æ LTCï¼ã"
+msgstr ""
+"æå®çå移已被添å å°å·²æ¥æ¶çæ¶é´ç ï¼MTC âæ¶é´ç âæ LTC âçºµåæ¶é´ç âï¼ã"
#: session_option_editor.cc:113
msgid "Timecode Generator offset"
msgstr "æ¶é´ç çæå¨åç§»"
#: session_option_editor.cc:120
-msgid "Specify an offset which is added to the generated timecode (so far only LTC)."
-msgstr "æå®ä¸ä¸ªå·²è¢«æ·»å å°éç¨æ¶é´ç çåç§»ï¼è¿ä»ä¸ºæ¢ä»
æ LTCï¼ã"
+msgid ""
+"Specify an offset which is added to the generated timecode (so far only LTC)."
+msgstr "æå®ä¸ä¸ªå·²è¢«æ·»å å°éç¨æ¶é´ç çåç§»ï¼è¿ä»ä¸ºæ¢ä»
æ LTC âçºµåæ¶é´ç âï¼ã"
#: session_option_editor.cc:124
msgid "JACK Transport/Time Settings"
msgstr "JACK æé/æ¶é´è®¾ç½®"
#: session_option_editor.cc:128
-msgid "%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
+msgid ""
+"%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
msgstr "%1 æ¯ JACK æ¶é´ä¸»æ§ï¼æä¾å°è|æå|è¯å«å£°ä»¥åå
¶å®ä¿¡æ¯ç» JACKï¼"
#: session_option_editor.cc:136
msgid "destructive-xfade-seconds"
-msgstr "鿝åç½®å置淡åç§æ°"
+msgstr "鿝xfadeï¼åç½®åç½®äºæ·¡åå¨ï¼ç§æ°"
#: session_option_editor.cc:137
msgid "Destructive crossfade length"
msgstr "éæ¯äº¤åæ·¡åé¿åº¦"
#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr "æéå¯å¨å忢æ¶ä¸ååºæé®é³"
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr "çæ§ç¶ææ¹åæ¶ä¸ååºæé®é³"
+
+#: session_option_editor.cc:160
msgid "Region fades active"
msgstr "åºåæ·¡åæ¿æ´»"
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
msgid "Region fades visible"
msgstr "åºåæ·¡åå¯è§"
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
msgid "Media"
msgstr "åªä½"
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
msgid "Audio file format"
msgstr "é³é¢æä»¶æ ¼å¼"
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
msgid "Sample format"
-msgstr "éæ ·æ ¼å¼"
+msgstr "æ ·æ¬æ ¼å¼"
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
msgid "32-bit floating point"
-msgstr "32 使µ®ç¹"
+msgstr "32使µ®ç¹"
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
msgid "24-bit integer"
-msgstr "24 使´æ°"
+msgstr "24使´æ°"
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
msgid "16-bit integer"
-msgstr "16 使´æ°"
+msgstr "16使´æ°"
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
msgid "File type"
msgstr "æä»¶ç±»å"
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "广æ WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr "广æ WAVEï¼4GB 大å°éå¶ï¼"
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr ""
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr "广æ RF64"
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr "WAVEï¼4GB 大å°éå¶ï¼"
+
+#: session_option_editor.cc:201
msgid "WAVE-64"
msgstr ""
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr "RF64ï¼WAV å
¼å®¹ï¼"
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr "æä»¶|ä½ç½®"
+
+#: session_option_editor.cc:210
msgid "File locations"
msgstr "æä»¶ä½ç½®"
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
msgid "Search for audio files in:"
msgstr "æç´¢é³é¢æä»¶äºï¼"
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
msgid "Search for MIDI files in:"
msgstr "æç´¢ MIDI æä»¶äºï¼"
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
msgid "Filenames"
msgstr "æä»¶å"
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
msgid "File Naming"
-msgstr "æä»¶å½å"
+msgstr "æä»¶å½åä¸"
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
msgid "Prefix Track number"
msgstr "é³è½¨ç¼å·åç¼"
-#: session_option_editor.cc:217
-msgid "Adds the current track number to the beginning of the recorded file name."
+#: session_option_editor.cc:238
+msgid ""
+"Adds the current track number to the beginning of the recorded file name."
msgstr "æ·»å å½åé³è½¨ç¼å·å°å·²å½å¶æä»¶åçå端ã"
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
msgid "Prefix Take Name"
msgstr "ç£å¸¦åç§°åç¼"
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
msgid "Adds the Take Name to the beginning of the recorded file name."
msgstr "æ·»å ç£å¸¦åç§°å°å·²å½å¶æä»¶åçå端ã"
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
msgid "Take Name"
msgstr "ç£å¸¦åç§°"
-#: session_option_editor.cc:245
-msgid "Track Input Monitoring automatically follows transport state (\"auto-input\")"
+#: session_option_editor.cc:266
+msgid ""
+"Track Input Monitoring automatically follows transport state (\"auto-input\")"
msgstr "é³è½¨è¾å
¥çæ§èªå¨åè·éæéç¶æï¼âèªå¨è¾å
¥âï¼"
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
msgid "Use monitor section in this session"
-msgstr "å¨è¯¥ä¼è¯ä¸ä½¿ç¨ççæ§é¢"
-
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+msgstr "å¨è¯¥ä¼è¯ä¸ä½¿ç¨ççæ§é¨å"
+
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
msgid "Meterbridge"
msgstr "èææ¡¥æ¥"
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
msgid "Route Display"
msgstr "è·¯ç±æ¾ç¤º"
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
msgid "Show Midi Tracks"
msgstr "æ¾ç¤º MIDI é³è½¨"
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
msgid "Show Busses"
msgstr "æ¾ç¤ºæ»çº¿"
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
msgid "Include Master Bus"
msgstr "å
æ¬ä¸»æ§æ»çº¿"
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
msgid "Button Area"
msgstr "æé®åºå"
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
msgid "Rec-enable Button"
msgstr "å¯å½å¶æé®"
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
msgid "Mute Button"
msgstr "é鳿é®"
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
msgid "Solo Button"
msgstr "ç¬å¥æé®"
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
msgid "Monitor Buttons"
msgstr "çæ§æé®"
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
msgid "Name Labels"
msgstr "åç§°æ ç¾"
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
msgid "Track Name"
msgstr "é³è½¨åç§°"
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
msgid "MIDI region copies are independent"
msgstr "MIDI åºåæ·è´ä¸å约æ"
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
msgid ""
"Policy for handling overlapping notes\n"
" on the same MIDI channel"
msgstr "å¤çä½äºåä¸ä¸ª MIDI 声éä¸çéå é³ç¬¦ççç¥"
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
msgid "never allow them"
msgstr "ä»ä¸å
许å®ä»¬"
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
msgid "don't do anything in particular"
msgstr "ä¸åä»»ä½ç¹æ®å¤ç"
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
msgid "replace any overlapped existing note"
msgstr "æ¿æ¢ææå·²åå¨çéå é³ç¬¦"
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
msgid "shorten the overlapped existing note"
msgstr "缩çå·²åå¨çéå é³ç¬¦"
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
msgid "shorten the overlapping new note"
-msgstr "缩çå·²åå¨çæ°é³ç¬¦"
+msgstr "缩çéå çæ°é³ç¬¦"
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
msgid "replace both overlapping notes with a single note"
-msgstr "æéå çé³ç¬¦æ¿æ¢ä¸ºä¸ä¸ªå个é³ç¬¦"
+msgstr "æéå çé³ç¬¦æ¿æ¢ä¸ºä¸ä¸ªåç¬é³ç¬¦"
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
msgid "Glue to bars and beats"
msgstr "ç²è¿å°å°èåæå"
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
msgid "Glue new markers to bars and beats"
msgstr "ç²è¿æ°çæ è®°å°å°èåæå"
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
msgid "Glue new regions to bars and beats"
msgstr "ç²è¿æ°çåºåå°å°èåæå"
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
msgid "Defaults"
msgstr "é»è®¤"
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
msgid "Use these settings as defaults"
msgstr "使ç¨è¿äºè®¾ç½®ä½ä¸ºé»è®¤"
@@ -11382,214 +13588,198 @@ msgstr "èªå¨ææ¾"
#: sfdb_ui.cc:135 sfdb_ui.cc:324
msgid "<b>Sound File Information</b>"
-msgstr "<b>å£°é³æä»¶ä¿¡æ¯</b>"
+msgstr "<b>å£°é³æä»¶ä¿¡æ¯</b"
#: sfdb_ui.cc:147
msgid "Timestamp:"
msgstr "æ¶é´æ³ï¼"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "æ ¼å¼ï¼"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
msgid "Tags:"
msgstr "æ ç¾ï¼"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "æ æ³è¯»åæä»¶ï¼ %1 (%2)."
-
#: sfdb_ui.cc:297
msgid "<b>Midi File Information</b>"
msgstr "<b>Midi æä»¶ä¿¡æ¯</b>"
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "æ æ³è®¿é®å£°é³æä»¶ï¼ "
-
#: sfdb_ui.cc:530
msgid "SoundFileBox: Could not tokenize string: "
-msgstr "声鳿件çï¼æ æ³ä»¤çååç¬¦ä¸²ï¼ "
+msgstr "声鳿件çï¼æ æ³ä»¤çåå符串ï¼"
#: sfdb_ui.cc:550 sfdb_ui.cc:552
msgid "Search"
msgstr "æç´¢"
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
msgid "Audio and MIDI files"
msgstr "é³é¢å MIDI æä»¶"
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
msgid "Audio files"
msgstr "é³é¢æä»¶"
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
msgid "MIDI files"
msgstr "MIDI æä»¶"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
msgid "All files"
msgstr "æææä»¶"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
msgid "Browse Files"
msgstr "æµè§æä»¶"
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
msgid "Paths"
msgstr "è·¯å¾"
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
msgid "Search Tags"
msgstr "æç´¢æ ç¾"
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
msgid "Sort:"
msgstr "æåºï¼"
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
msgid "Longest"
msgstr "æé¿"
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
msgid "Shortest"
msgstr "æç"
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
msgid "Newest"
msgstr "ææ°"
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
msgid "Oldest"
msgstr "ææ§"
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
msgid "Most downloaded"
msgstr "æå¤ä¸è½½"
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
msgid "Least downloaded"
msgstr "ææ°ä¸è½½"
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
msgid "Highest rated"
msgstr "æé«è¯ä»·"
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
msgid "Lowest rated"
msgstr "æä½è¯ä»·"
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
msgid "More"
msgstr "æ´å¤"
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
msgid "Similar"
msgstr "类似ç"
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
msgid "ID"
msgstr ""
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
msgid "Filename"
msgstr "æä»¶å"
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
msgid "Duration"
msgstr "é³é¿"
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
msgid "Size"
-msgstr "尺寸"
+msgstr "尺寸大å°"
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
msgid "Samplerate"
msgstr "éæ ·ç"
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
msgid "License"
msgstr "许å¯è¯"
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
msgid "Search Freesound"
-msgstr "æç´¢èªç±å£°é³"
+msgstr "æç´¢ Freesoundï¼èªç±å£°é³ï¼"
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr "æä¸æå
¥å·²éä¸çæä»¶å¹¶ä¸å
³éæ¤çªå£"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr "æä¸æå
¥å·²éä¸çæä»¶"
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr "æä¸æå
¥å·²éä¸çæä»¶å¹¶ä¸ä¿çæ¤çªå£"
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
msgid "Press to close this window without importing any files"
-msgstr "æä¸å
³éæ¤çªå£å¹¶ä¸ä¸æå
¥ä»»ä½æä»¶"
+msgstr "æä¸å
³éæ¤çªå£å¹¶ä¸ä¸å¯¼å
¥ä»»ä½æä»¶"
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
msgid "SoundFileBrowser: Could not tokenize string: "
-msgstr "声鳿件æµè§å¨ï¼æ æ³ä»¤çååç¬¦ä¸²ï¼ "
+msgstr "声鳿件æµè§å¨ï¼æ æ³ä»¤çåå符串ï¼"
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
msgid "%1 more page of 100 results available"
msgid_plural "%1 more pages of 100 results available"
msgstr[0] "%1 æ 100 å¤é¡µç»æå¯ç¨"
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
msgid "No more results available"
msgstr "æ æ´å¤ç»æå¯ç¨"
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
msgid "B"
msgstr ""
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
msgid "kB"
msgstr ""
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
msgid "MB"
msgstr ""
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
msgid "GB"
msgstr ""
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
msgid "one track per file"
msgstr "æ¯ä¸ªæä»¶ä¸ä¸ªé³è½¨"
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
msgid "one track per channel"
msgstr "æ¯ä¸ªå£°éä¸ä¸ªé³è½¨"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
msgid "sequence files"
msgstr "åºåæä»¶"
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
msgid "all files in one track"
msgstr "æææä»¶å¨ä¸ä¸ªé³è½¨ä¸"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
msgid "merge files"
msgstr "åå¹¶æä»¶"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
msgid "one region per file"
msgstr "æ¯ä¸ªæä»¶ä¸ä¸ªåºå"
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
msgid "one region per channel"
msgstr "æ¯ä¸ªå£°éä¸ä¸ªåºå"
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
msgid "all files in one region"
msgstr "æææä»¶å¨ä¸ä¸ªåºåé"
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
msgid ""
"One or more of the selected files\n"
"cannot be used by %1"
@@ -11597,104 +13787,104 @@ msgstr ""
"ä¸ä¸ªæå¤ä¸ªå·²éä¸çæä»¶\n"
"ä¸è½è¢«ç¨äº %1"
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
msgid "Copy files to session"
msgstr "å¤å¶æä»¶å°ä¼è¯"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
msgid "file timestamp"
msgstr "æä»¶æ¶é´æ³"
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
msgid "edit point"
msgstr "ç¼è¾ç¹"
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
msgid "playhead"
msgstr "æé"
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
msgid "session start"
msgstr "ä¼è¯èµ·ç¹"
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
msgstr "<b>æ·»å æä»¶ä¸ºâ¦</b>"
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
msgid "<b>Insert at</b>"
msgstr "<b>æå
¥äº</b>"
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
msgid "<b>Mapping</b>"
msgstr "<b>æ å°</b>"
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
msgid "<b>Conversion quality</b>"
msgstr "<b>转æ¢è´¨é</b>"
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
msgid "<b>Instrument</b>"
msgstr "<b>ä¹å¨</b>"
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
msgid "Best"
msgstr "æä½³"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
msgid "Good"
msgstr "好"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
msgid "Quick"
msgstr "å¿«"
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
msgid "Fastest"
msgstr "æå¿«"
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
msgid "Shuttle speed control (Context-click for options)"
msgstr "å¾å¤é度æ§å¶ï¼å³é®ç¹å»æ¥çæ´å¤é项ï¼"
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
msgid "Percent"
msgstr "ç¾åæ¯"
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
msgid "Units"
msgstr "åä½"
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
msgid "Sprung"
msgstr "å¼¹å¨"
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
msgid "Wheel"
msgstr "轮转"
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
msgid "Maximum speed"
msgstr "æå¤§é度"
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr "éç½®å° 100%"
+
+#: shuttle_control.cc:633
msgid "Playing"
msgstr "ææ¾ä¸"
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
#, c-format
msgid "<<< %+d semitones"
msgstr "<<< %+d åé³"
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
#, c-format
msgid ">>> %+d semitones"
msgstr ">>> %+d åé³"
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "已忢"
-
#: soundcloud_export_selector.cc:44
msgid "User Email"
msgstr "ç¨æ·çµåä¿¡ç®±"
@@ -11705,7 +13895,7 @@ msgstr "å¯ç "
#: soundcloud_export_selector.cc:46
msgid "Make files public"
-msgstr "æä»¶å
¬å¼"
+msgstr "å
¬å¼æä»¶"
#: soundcloud_export_selector.cc:47
msgid "Open uploaded files in browser"
@@ -11719,7 +13909,7 @@ msgstr "æä»¶å¯ä¸è½½"
msgid "%1: %2 of %3 bytes uploaded"
msgstr "%1: %2 ç %3 åèå·²ä¸ä¼ "
-#: splash.cc:73
+#: splash.cc:78
msgid "%1 loading ..."
msgstr "%1 è½½å
¥ä¸â¦"
@@ -11735,41 +13925,42 @@ msgstr "ç§»é¤æ¬å£°å¨"
msgid "Azimuth:"
msgstr "æ¹ä½è§ï¼"
-#: startup.cc:67
+#: startup.cc:71
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
msgstr ""
"使ç¨ä¸ä¸ªå¤é¨æ··é³å¨ææ¨çé³é¢æ¥å£ç¡¬ä»¶æ··é³å¨ã\n"
-"%1 å°ä¸ä¼åºç°å¨çæ§ä¸"
+"%1 å¨çæ§ä¸å°ä¸ä¼èµ·ä½ç¨"
-#: startup.cc:69
+#: startup.cc:73
msgid "Ask %1 to play back material as it is being recorded"
msgstr "å½ %1 被å½å¶æ¶è¯·æ±å
¶åæ¾ææ"
-#: startup.cc:142
+#: startup.cc:146
msgid ""
-"<span size=\"larger\">%1 is a digital audio workstation. You can use it to record, "
-"edit and mix multi-track audio. You can produce your own CDs, mix video "
-"soundtracks, or experiment with new ideas about music and sound. \n"
+"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
+"record, edit and mix multi-track audio. You can produce your own CDs, mix "
+"video soundtracks, or experiment with new ideas about music and sound. \n"
"\n"
"There are a few things that need to be configured before you start using the "
"program.</span> "
msgstr ""
-"<span size=\"larger\">%1 æ¯ä¸ä¸ªæ°åé³é¢å·¥ä½ç«ãæ¨å¯ä»¥ç¨å®å½å¶ãç¼è¾å¹¶æ··åå¤å£°éé³"
-"é¢ãæ¨å¯ä»¥åä½èªå·±çCDå
çãæ··åè§é¢é³è½¨ãæè
è¯éªä¸é³ä¹å声鳿å
³çæ°æ³æ³ã\n"
+"<span size=\"larger\">%1 æ¯ä¸ä¸ªæ°åé³é¢å·¥ä½ç«ãæ¨å¯ä»¥ç¨å®å½å¶ãç¼è¾å¹¶æ··åå¤å£°"
+"éé³é¢ãæ¨å¯ä»¥åä½èªå·±çCDå
çãæ··åè§é¢é³è½¨ãæè
è¯éªä¸é³ä¹å声鳿å
³çæ°æ³"
+"æ³ã\n"
"\n"
"卿¨å¼å§ä½¿ç¨è¿ä¸ªç¨åºä¹åï¼éè¦å®æä¸äºé
ç½®ã</span> "
-#: startup.cc:168
+#: startup.cc:172
msgid "Welcome to %1"
msgstr "欢è¿ä½¿ç¨ %1"
-#: startup.cc:191
+#: startup.cc:195
msgid "Default folder for %1 sessions"
msgstr "ä¼è¯ %1 çé»è®¤æä»¶å¤¹"
-#: startup.cc:197
+#: startup.cc:201
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11785,11 +13976,11 @@ msgstr ""
"\n"
"<i>ï¼æ¨å¯ä»¥ææ°çä¼è¯åæ¾å¨ä»»ä½ä½ç½®ï¼è¿éåªæ¯é»è®¤æä»¶å¤¹ï¼</i>"
-#: startup.cc:220
+#: startup.cc:224
msgid "Default folder for new sessions"
msgstr "æ°ä¼è¯çé»è®¤æä»¶å¤¹"
-#: startup.cc:241
+#: startup.cc:245
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11797,7 +13988,8 @@ msgid ""
"configuration of that equipment. The two most common are presented here.\n"
"Please choose whichever one is right for your setup.\n"
"\n"
-"<i>(You can change this preference at any time, via the Preferences dialog)</i>\n"
+"<i>(You can change this preference at any time, via the Preferences dialog)</"
+"i>\n"
"\n"
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
@@ -11811,25 +14003,25 @@ msgstr ""
"\n"
"<i>妿æ¨ä¸å¤§äºè§£è¿æ¹é¢çä¿¡æ¯ï¼ä¿æé»è®¤å³å¯ã</i>"
-#: startup.cc:262
+#: startup.cc:266
msgid "Monitoring Choices"
-msgstr "çæ§éæ©"
+msgstr "çæ§ä¸éæ©"
-#: startup.cc:285
+#: startup.cc:289
msgid "Use a Master bus directly"
msgstr "ç´æ¥ä½¿ç¨ä¸»æ§æ»çº¿"
-#: startup.cc:287
+#: startup.cc:291
msgid ""
-"Connect the Master bus directly to your hardware outputs. This is preferable for "
-"simple usage."
+"Connect the Master bus directly to your hardware outputs. This is preferable "
+"for simple usage."
msgstr "ç´æ¥è¿æ¥ä¸»æ§æ»çº¿å°æ¨ç硬件è¾åºãè¿å¯è½æ´ç®åæç¨ã"
-#: startup.cc:296
+#: startup.cc:300
msgid "Use an additional Monitor bus"
msgstr "使ç¨ä¸ä¸ªé¢å¤ççæ§æ»çº¿"
-#: startup.cc:299
+#: startup.cc:303
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -11837,7 +14029,7 @@ msgstr ""
"å¨ä¸»æ§æ»çº¿å硬件è¾å
¥ä¹é´ä½¿ç¨ä¸ä¸ªçæ§æ»çº¿\n"
"çæ§æ¶å¯æ´å¥½çæ§å¶ï¼ä¸ä¼å½±åæ··é³ã"
-#: startup.cc:321
+#: startup.cc:325
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11845,50 +14037,46 @@ msgid ""
"<i>If you do not understand what this is about, just accept the default.</i>"
msgstr ""
"<i>æ¨å¯ä»¥å¨ä»»ä½æ¶åæ¹åè¿ä¸ªé¦é项ï¼å°±å¨é¦éé¡¹å¯¹è¯æ¡éã\n"
-"æ¨ä¹å¯ä»¥æ·»å çæ§é¢å°ä»»ä½ä¼è¯ï¼æçä»ä»»ä½ä¼è¯ç§»é¤çæ§é¢ã</i>\n"
+"æ¨ä¹å¯ä»¥æ·»å çæ§é¨åå°ä»»ä½ä¼è¯ï¼æçä»ä»»ä½ä¼è¯ç§»é¤çæ§é¢ã</i>\n"
"\n"
"<i>妿æ¨ä¸å¤§äºè§£è¿æ¹é¢çä¿¡æ¯ï¼ä¿æé»è®¤å³å¯ã</i>"
-#: startup.cc:332
+#: startup.cc:336
msgid "Monitor Section"
-msgstr "çæ§é¢"
+msgstr "çæ§é¨å"
-#: step_entry.cc:60
+#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr "æ¥è¿å
¥å£ï¼%1"
-#: step_entry.cc:65
+#: step_entry.cc:64
msgid ">beat"
msgstr ">æå"
-#: step_entry.cc:66
+#: step_entry.cc:65
msgid ">bar"
msgstr ">å°è"
-#: step_entry.cc:67
+#: step_entry.cc:66
msgid ">EP"
msgstr ">éæ ·"
-#: step_entry.cc:68
+#: step_entry.cc:67
msgid "sustain"
msgstr "æç»"
-#: step_entry.cc:69
+#: step_entry.cc:68
msgid "rest"
msgstr "伿¢"
-#: step_entry.cc:70
+#: step_entry.cc:69
msgid "g-rest"
msgstr "g-伿¢"
-#: step_entry.cc:71
+#: step_entry.cc:70
msgid "back"
msgstr "åé"
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
#: step_entry.cc:191
msgid "Set note length to a whole note"
msgstr "设置é³ç¬¦é¿åº¦ä¸ºå
¨é³ç¬¦"
@@ -11997,11 +14185,11 @@ msgstr "æå
¥ä¸ä¸ªåºåæ¢ä¿¡æ¯"
msgid "Insert a program change message"
msgstr "æå
¥ä¸ä¸ªç¨å¼åæ¢ä¿¡æ¯"
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
msgid "Move Insert Position Back by Note Length"
msgstr "æé³ç¬¦é¿åº¦ååç§»å¨æå
¥ä½ç½®"
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
msgid "Move Insert Position to Edit Point"
msgstr "ç§»å¨æå
¥ä½ç½®å°ç¼è¾ä½ç½®"
@@ -12013,240 +14201,244 @@ msgstr "1/é³ç¬¦"
msgid "Octave"
msgstr "å
«åº¦"
-#: step_entry.cc:598
+#: step_entry.cc:592
msgid "Insert Note A"
-msgstr "æå
¥é³ç¬¦A"
+msgstr "æå
¥é³ç¬¦ A"
-#: step_entry.cc:599
+#: step_entry.cc:593
msgid "Insert Note A-sharp"
-msgstr "æå
¥é³ç¬¦A#"
+msgstr "æå
¥é³ç¬¦ A#"
-#: step_entry.cc:600
+#: step_entry.cc:594
msgid "Insert Note B"
-msgstr "æå
¥é³ç¬¦B"
+msgstr "æå
¥é³ç¬¦ B"
-#: step_entry.cc:601
+#: step_entry.cc:595
msgid "Insert Note C"
-msgstr "æå
¥é³ç¬¦C"
+msgstr "æå
¥é³ç¬¦ C"
-#: step_entry.cc:602
+#: step_entry.cc:596
msgid "Insert Note C-sharp"
-msgstr "æå
¥é³ç¬¦C#"
+msgstr "æå
¥é³ç¬¦ C#"
-#: step_entry.cc:603
+#: step_entry.cc:597
msgid "Insert Note D"
-msgstr "æå
¥é³ç¬¦D"
+msgstr "æå
¥é³ç¬¦ D"
-#: step_entry.cc:604
+#: step_entry.cc:598
msgid "Insert Note D-sharp"
-msgstr "æå
¥é³ç¬¦D#"
+msgstr "æå
¥é³ç¬¦ D#"
-#: step_entry.cc:605
+#: step_entry.cc:599
msgid "Insert Note E"
-msgstr "æå
¥é³ç¬¦E"
+msgstr "æå
¥é³ç¬¦ E"
-#: step_entry.cc:606
+#: step_entry.cc:600
msgid "Insert Note F"
-msgstr "æå
¥é³ç¬¦F"
+msgstr "æå
¥é³ç¬¦ F"
-#: step_entry.cc:607
+#: step_entry.cc:601
msgid "Insert Note F-sharp"
-msgstr "æå
¥é³ç¬¦F#"
+msgstr "æå
¥é³ç¬¦ F#"
-#: step_entry.cc:608
+#: step_entry.cc:602
msgid "Insert Note G"
msgstr "æå
¥é³ç¬¦G"
-#: step_entry.cc:609
+#: step_entry.cc:603
msgid "Insert Note G-sharp"
-msgstr "æå
¥é³ç¬¦G#"
+msgstr "æå
¥é³ç¬¦ G#"
-#: step_entry.cc:611
+#: step_entry.cc:605
msgid "Insert a Note-length Rest"
msgstr "æå
¥ä¸ä¸ªå
¨ä¼æ¢ç¬¦"
-#: step_entry.cc:612
+#: step_entry.cc:606
msgid "Insert a Snap-length Rest"
msgstr "æå
¥ä¸ä¸ªå¸éé¿åº¦ç伿¢ç¬¦"
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
msgid "Move to next octave"
msgstr "ç§»å¨å°ä¸ä¸ä¸ªå
«åº¦"
-#: step_entry.cc:617
+#: step_entry.cc:611
msgid "Move to Next Note Length"
msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦é¿åº¦"
-#: step_entry.cc:618
+#: step_entry.cc:612
msgid "Move to Previous Note Length"
msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦é¿åº¦"
-#: step_entry.cc:620
+#: step_entry.cc:614
msgid "Increase Note Length"
msgstr "å¢å é³ç¬¦é¿åº¦"
-#: step_entry.cc:621
+#: step_entry.cc:615
msgid "Decrease Note Length"
msgstr "åå°é³ç¬¦é¿åº¦"
-#: step_entry.cc:623
+#: step_entry.cc:617
msgid "Move to Next Note Velocity"
msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦å度"
-#: step_entry.cc:624
+#: step_entry.cc:618
msgid "Move to Previous Note Velocity"
msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦å度"
-#: step_entry.cc:626
+#: step_entry.cc:620
msgid "Increase Note Velocity"
msgstr "å¢å é³ç¬¦å度"
-#: step_entry.cc:627
+#: step_entry.cc:621
msgid "Decrease Note Velocity"
msgstr "åå°é³ç¬¦å度"
-#: step_entry.cc:629
+#: step_entry.cc:623
msgid "Switch to the 1st octave"
msgstr "忢å°ç¬¬ä¸ä¸ªå
«åº¦"
-#: step_entry.cc:630
+#: step_entry.cc:624
msgid "Switch to the 2nd octave"
msgstr "忢å°ç¬¬äºä¸ªå
«åº¦"
-#: step_entry.cc:631
+#: step_entry.cc:625
msgid "Switch to the 3rd octave"
msgstr "忢å°ç¬¬ä¸ä¸ªå
«åº¦"
-#: step_entry.cc:632
+#: step_entry.cc:626
msgid "Switch to the 4th octave"
msgstr "忢å°ç¬¬å个å
«åº¦"
-#: step_entry.cc:633
+#: step_entry.cc:627
msgid "Switch to the 5th octave"
msgstr "忢å°ç¬¬äºä¸ªå
«åº¦"
-#: step_entry.cc:634
+#: step_entry.cc:628
msgid "Switch to the 6th octave"
msgstr "忢å°ç¬¬å
个å
«åº¦"
-#: step_entry.cc:635
+#: step_entry.cc:629
msgid "Switch to the 7th octave"
msgstr "忢å°ç¬¬ä¸ä¸ªå
«åº¦"
-#: step_entry.cc:636
+#: step_entry.cc:630
msgid "Switch to the 8th octave"
msgstr "忢å°ç¬¬å
«ä¸ªå
«åº¦"
-#: step_entry.cc:637
+#: step_entry.cc:631
msgid "Switch to the 9th octave"
msgstr "忢å°ç¬¬ä¹ä¸ªå
«åº¦"
-#: step_entry.cc:638
+#: step_entry.cc:632
msgid "Switch to the 10th octave"
msgstr "忢å°ç¬¬å个å
«åº¦"
-#: step_entry.cc:639
+#: step_entry.cc:633
msgid "Switch to the 11th octave"
msgstr "忢å°ç¬¬åä¸ä¸ªå
«åº¦"
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "忢ä¸åé³ç¬¦"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "忢å弦å
¥å£"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "éè¿é³ç¬¦é¿åº¦æç»å·²éæ©çé³ç¬¦"
+
+#: step_entry.cc:650
msgid "Set Note Length to Whole"
-msgstr "设置为å
¨é³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºå
¨é³ç¬¦"
-#: step_entry.cc:646
+#: step_entry.cc:652
msgid "Set Note Length to 1/2"
-msgstr "设置为äºåé³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºäºåé³ç¬¦"
-#: step_entry.cc:648
+#: step_entry.cc:654
msgid "Set Note Length to 1/3"
-msgstr "设置为ä¸åé³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºä¸åé³ç¬¦"
-#: step_entry.cc:650
+#: step_entry.cc:656
msgid "Set Note Length to 1/4"
-msgstr "设置为ååé³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºååé³ç¬¦"
-#: step_entry.cc:652
+#: step_entry.cc:658
msgid "Set Note Length to 1/8"
-msgstr "设置为å
«åé³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºå
«åé³ç¬¦"
-#: step_entry.cc:654
+#: step_entry.cc:660
msgid "Set Note Length to 1/16"
-msgstr "设置为åå
åé³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºåå
åé³ç¬¦"
-#: step_entry.cc:656
+#: step_entry.cc:662
msgid "Set Note Length to 1/32"
-msgstr "设置为ä¸åäºåé³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºä¸åäºåé³ç¬¦"
-#: step_entry.cc:658
+#: step_entry.cc:664
msgid "Set Note Length to 1/64"
-msgstr "设置为å
åååé³ç¬¦"
+msgstr "设置é³ç¬¦é¿åº¦ä¸ºå
åååé³ç¬¦"
-#: step_entry.cc:663
+#: step_entry.cc:669
msgid "Set Note Velocity to Pianississimo"
msgstr "设置é³ç¬¦å度为æå¼±é³"
-#: step_entry.cc:665
+#: step_entry.cc:671
msgid "Set Note Velocity to Pianissimo"
msgstr "设置é³ç¬¦å度为æå¼±é³"
-#: step_entry.cc:667
+#: step_entry.cc:673
msgid "Set Note Velocity to Piano"
msgstr "设置é³ç¬¦å度为弱é³"
-#: step_entry.cc:669
+#: step_entry.cc:675
msgid "Set Note Velocity to Mezzo-Piano"
msgstr "设置é³ç¬¦å度为ä¸å¼±é³"
-#: step_entry.cc:671
+#: step_entry.cc:677
msgid "Set Note Velocity to Mezzo-Forte"
msgstr "设置é³ç¬¦å度为ä¸å¼ºé³"
-#: step_entry.cc:673
+#: step_entry.cc:679
msgid "Set Note Velocity to Forte"
msgstr "设置é³ç¬¦å度为强é³"
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
msgid "Set Note Velocity to Fortississimo"
msgstr "设置é³ç¬¦å度为æå¼ºé³"
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "忢ä¸åé³ç¬¦"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
msgid "No Dotted Notes"
msgstr "æ 带ç¹é³ç¬¦"
-#: step_entry.cc:686
+#: step_entry.cc:689
msgid "Toggled Dotted Notes"
msgstr "忢另ç¹é³ç¬¦"
-#: step_entry.cc:688
+#: step_entry.cc:690
msgid "Toggled Double-Dotted Notes"
msgstr "忢另åç¹é³ç¬¦"
-#: step_entry.cc:690
+#: step_entry.cc:691
msgid "Toggled Triple-Dotted Notes"
msgstr "忢另ä¸ç¹é³ç¬¦"
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "忢å弦å
¥å£"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "éè¿é³ç¬¦é¿åº¦æç»å·²éæ©çé³ç¬¦"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
#, c-format
msgid "L:%3d R:%3d Width:%d%%"
msgstr "å·¦ï¼%3d å³ï¼%3d 宽度ï¼%d%%"
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr "声ç¸å¨|M"
+
+#: stereo_panner_editor.cc:37
msgid "Stereo Panner"
-msgstr "ç«ä½å£°é¢æ¿"
+msgstr "ç«ä½å£°å£°ç¸å¨"
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
msgid "Width"
msgstr "宽度"
@@ -12254,263 +14446,290 @@ msgstr "宽度"
msgid "Strip Silence"
msgstr "çæ®µæ 声"
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "临çå¼"
+
+#: strip_silence_dialog.cc:76
msgid "Minimum length"
msgstr "æå°é¿åº¦"
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
msgid "Fade length"
msgstr "æ·¡åé¿åº¦"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr "åæä¸"
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
msgid "bar:"
msgstr "å°èï¼"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
msgid "beat:"
msgstr "æåï¼"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
msgid "Pulse note"
msgstr "èå²é³ç¬¦"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
msgid "Tap tempo"
msgstr "èæèå¥"
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "ç¼è¾èå¥"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324 tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
msgid "whole"
msgstr "å
¨"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326 tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
msgid "second"
msgstr "äºåä¹ä¸"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328 tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
msgid "third"
msgstr "ä¸åä¹ä¸"
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330 tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
msgid "quarter"
msgstr "ååä¹ä¸"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332 tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
msgid "eighth"
msgstr "å
«åä¹ä¸"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334 tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
msgid "sixteenth"
msgstr "åå
åä¹ä¸"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336 tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
msgid "thirty-second"
msgstr "ä¸åäºåä¹ä¸"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338 tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
msgid "sixty-fourth"
msgstr "å
åååä¹ä¸"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340 tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
msgid "one-hundred-twenty-eighth"
msgstr "ä¸ç¾äºåå
«åä¹ä¸"
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "æ¸å"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "æé"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "é³ä¹"
+
+#: tempo_dialog.cc:161
msgid "Beats per minute:"
msgstr "æ¯åéæåæ°ï¼"
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
msgid "Tempo begins at"
msgstr "èå¥å¼å§ä½äº"
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "éå®ç±»åï¼"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "èå¥ç±»åï¼"
+
+#: tempo_dialog.cc:321
msgid "incomprehensible pulse note type (%1)"
msgstr "ä¸å¯çè§£çèå²é³ç¬¦ç±»åï¼%1ï¼"
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "ç¼è¾èæ"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr "ä¸å¯çè§£çèå¥ç±»å (%1)"
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr "ä¸å¯çè§£çéå®ç±»å (%1)"
+
+#: tempo_dialog.cc:498
msgid "Note value:"
msgstr "é³ç¬¦å¼ï¼"
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "éå®ç±»åï¼"
+
+#: tempo_dialog.cc:500
msgid "Beats per bar:"
msgstr "æ¯å°èæåæ°ï¼"
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
msgid "Meter begins at bar:"
msgstr "èæå¼å§ä½äºå°èï¼"
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
msgid "incomprehensible meter note type (%1)"
msgstr "ä¸å¯çè§£çèæé³ç¬¦ç±»åï¼%1ï¼"
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "æ·±æä¸»é¢"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr "ä¸å¯çè§£çèæéå®ç±»å (%1)"
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "æäº®ä¸»é¢"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "éç½®æ¢å¤é»è®¤å¼"
-
-#: theme_manager.cc:68
+#: theme_manager.cc:53
msgid "Draw \"flat\" buttons"
msgstr "æç»âéè°âæé®"
-#: theme_manager.cc:69
+#: theme_manager.cc:54
msgid "Blink Rec-Arm buttons"
-msgstr "éªå
å½å¶èæé®"
+msgstr "éªäº®å½å¶é¢å¤æé®"
-#: theme_manager.cc:70
+#: theme_manager.cc:55
msgid "Color regions using their track's color"
msgstr "使ç¨åºåçé³è½¨é¢è²ä½ä¸ºåºåè²"
-#: theme_manager.cc:71
+#: theme_manager.cc:56
msgid "Show waveform clipping"
msgstr "æ¾ç¤ºæ³¢å½¢æªæ³¢"
-#: theme_manager.cc:73
+#: theme_manager.cc:58
msgid "Waveforms color gradient depth"
msgstr "波形é¢è²æ¢¯åº¦æ·±åº¦"
-#: theme_manager.cc:75
+#: theme_manager.cc:60
msgid "Timeline item gradient depth"
msgstr "æ¶é´çº¿æ¡ç®æ¢¯åº¦æ·±åº¦"
-#: theme_manager.cc:76
+#: theme_manager.cc:61
msgid "All floating windows are dialogs"
msgstr "æææµ®å¨çªå£é½æ¯å¯¹è¯æ¡"
-#: theme_manager.cc:77
+#: theme_manager.cc:62
msgid "Transient windows follow front window."
msgstr "临æ¶çªå£è·éåæ¹çªå£ã"
-#: theme_manager.cc:78
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
+msgstr "æµ®å¨åç¦»çæ§é¨åçªå£"
+
+#: theme_manager.cc:64
msgid "Icon Set"
msgstr "徿 é"
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "对象ç©ä½"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr "æ¡ç®"
-
-#: theme_manager.cc:164
-msgid "Palette"
-msgstr "è°è²æ¿"
-
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr "éæåº¦"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
msgid ""
-"Mark all floating windows to be type \"Dialog\" rather than using \"Utility\" for "
-"some.\n"
-"This may help with some window managers. This requires a restart of %1 to take "
-"effect"
+"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
+"\" for some.\n"
+"This may help with some window managers. This requires a restart of %1 to "
+"take effect"
msgstr ""
"æ è®°ææçªå£ç±»å为âå¯¹è¯æ¡âï¼è䏿¯ææäºçªå£æ 记为âå·¥å
·âã\n"
"è¿ä¹è®¸å¯¹äºæäºçªå£ç®¡çææå¸®å©ãè¿éè¦éæ°å¯å¨ %1以çæã"
-#: theme_manager.cc:199
+#: theme_manager.cc:136
msgid ""
-"Make transient windows follow the front window when toggling between the editor "
-"and mixer.\n"
+"Make transient windows follow the front window when toggling between the "
+"editor and mixer.\n"
"This requires a restart of %1 to take effect"
msgstr ""
"å¨ç¼è¾å¨åæ··é³å¨ä¹é´åæ¢æ¶ï¼è®©ä¸´æ¶çªå£è·éåæ¹çªå£ã\n"
-"è¿éè¦éæ°å¯å¨ %1以çæã"
+"è¿éè¦éæ°å¯å¨ %1 以çæã"
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "颿è°è²æ¿"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
+"åç¦»çæ§é¨åæ¶ï¼æ è®°å®ä¸º \"å·¥å
·\"çªå£å¹¶æ¾å¨åé¢ã \n"
+"éè¦éæ°å¯å¨ %1 以çæ"
#: time_axis_view.cc:148
msgid "Track/Bus name (double click to edit)"
msgstr "é³è½¨/æ»çº¿åç§°ï¼åå»å³å¯ç¼è¾ï¼"
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
msgid "new duration %1 frame is out of bounds for %2"
msgid_plural "new duration of %1 frames is out of bounds for %2"
msgstr[0] "æ°çé³é¿ %1 帧è¶
åºäº %2 çè¾¹ç"
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
msgid "Quick but Ugly"
-msgstr "å¿«éï¼ä½ä¸ä¼ç¾ï¼"
+msgstr "å¿«éä½ä¸ä¼ç¾"
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
msgid "Skip Anti-aliasing"
msgstr "è·³è¿èªå¨å¯¹é½"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "å
容ï¼"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr "å
容"
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
msgid "Minimize time distortion"
msgstr "åå°æ¶é´ææ²"
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
msgid "Preserve Formants"
msgstr "ä¿æå
±æ¯å³°"
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
msgid "TimeFXDialog"
msgstr "æ¶é´ç¹æå¯¹è¯æ¡"
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
msgid "Pitch Shift Audio"
msgstr "é³é«æ¿æ¢é³é¢"
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
msgid "Time Stretch Audio"
msgstr "æ¶é´å»¶ä¼¸é³é¢"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
msgid "Octaves:"
msgstr "å
«åº¦ï¼"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
msgid "Semitones:"
msgstr "åé³ï¼"
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
msgid "Cents:"
msgstr "é³åï¼"
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
msgid "Time|Shift"
msgstr "æ¶é´|æ¿æ¢"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
msgid "TimeFXButton"
msgstr "æ¶é´ç¹ææé®"
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
msgid "Stretch/Shrink"
msgstr "延伸/æ¶ç¼©"
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
msgid "<b>Progress</b>"
msgstr "<b>è¿ç¨</b>"
-#: time_info_box.cc:124
+#: time_info_box.cc:118
msgid "Start recording at auto-punch start"
msgstr "å¨èªå¨åæ¢èµ·ç¹å¼å§å½å¶"
-#: time_info_box.cc:125
+#: time_info_box.cc:119
msgid "Stop recording at auto-punch end"
msgstr "å¨èªå¨åæ¢ç»ç¹åæ¢å½å¶"
@@ -12532,7 +14751,7 @@ msgstr "è¿ä¸ªé³ç¬¦çç´¢å¼"
#: transform_dialog.cc:42
msgid "the number of notes"
-msgstr "é³ç¬¦çæ°ç®"
+msgstr "é³ç¬¦çç¼å·"
#: transform_dialog.cc:43
msgid "exactly"
@@ -12578,224 +14797,278 @@ msgstr "åè° MIDI"
msgid "Transpose"
msgstr "åè°"
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:422
msgid "Loading default ui configuration file %1"
msgstr "è½½å
¥é»è®¤ç¨æ·çé¢é
ç½®æä»¶ %1"
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:425
msgid "cannot read default ui configuration file \"%1\""
msgstr "æ æ³è¯»åé»è®¤ç¨æ·çé¢é
ç½®æä»¶ \"%1\""
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:430
msgid "default ui configuration file \"%1\" not loaded successfully."
msgstr "é»è®¤ç¨æ·çé¢é
ç½®æä»¶ \"%1\" è½½å
¥ä¸æåã"
-#: ui_config.cc:177
+#: ui_config.cc:248
msgid "Could not find default UI configuration file %1"
msgstr "æ æ³æ¾å°é»è®¤ç¨æ·çé¢é
ç½®æä»¶\"%1\""
-#: ui_config.cc:219
+#: ui_config.cc:289
msgid "Loading color file %1"
msgstr "è½½å
¥é¢è²æä»¶ %1"
-#: ui_config.cc:222
+#: ui_config.cc:292
msgid "cannot read color file \"%1\""
-msgstr "æ æ³è¯»åé¢è²æä»¶ %1"
+msgstr "æ æ³è¯»åé¢è²æä»¶ %"
-#: ui_config.cc:227
+#: ui_config.cc:297
msgid "color file \"%1\" not loaded successfully."
-msgstr "é¢è²æä»¶ %1è½½å
¥ä¸æå"
+msgstr "é¢è²æä»¶ %1 è½½å
¥ä¸æåã"
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "æ¾ä¸å°é¢è²æä»¶ %1"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr "沿ç %2 æ¾ä¸å°ç¨äº %1 çé¢è²æä»¶"
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:403 ui_config.cc:486
msgid "Color file %1 not saved"
msgstr "å°æªä¿åé¢è²æä»¶ %1"
-#: ui_config.cc:317
+#: ui_config.cc:439
msgid "Loading user ui configuration file %1"
msgstr "è½½å
¥ç¨æ·çé¢é
ç½®æä»¶ %1"
-#: ui_config.cc:320
+#: ui_config.cc:442
msgid "cannot read ui configuration file \"%1\""
msgstr "æ æ³è¯»åç¨æ·çé¢é
ç½®æä»¶ \"%1\""
-#: ui_config.cc:325
+#: ui_config.cc:447
msgid "user ui configuration file \"%1\" not loaded successfully."
msgstr "ç¨æ·çç¨æ·çé¢é
ç½®æä»¶ \"%1\" è½½å
¥ä¸æåã"
-#: ui_config.cc:333
+#: ui_config.cc:455
msgid "could not find any ui configuration file, canvas will look broken."
msgstr "æ¾ä¸å°ä»»ä½ç¨æ·çé¢é
ç½®æä»¶ï¼çé¢çèµ·æ¥å°ä¸å¤§ç¾è§ã"
-#: ui_config.cc:351
+#: ui_config.cc:476
msgid "Config file %1 not saved"
msgstr "å°æªä¿åé
ç½®æä»¶ %1"
-#: ui_config.cc:592
+#: ui_config.cc:720
msgid "Color %1 not found"
msgstr "æ¾ä¸å°é¢è² %1"
-#: ui_config.cc:662
+#: ui_config.cc:790
msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
msgstr "å¨æç´¢è·¯å¾ %2 䏿¾ä¸å°ç¨æ·ç颿 ·å¼æä»¶ %1ã%3 çèµ·æ¥å°ä¸å¤§ç¾è§ã"
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
msgid "bad XPM header %1"
msgstr "æåç XPM æ¥å¤´ %1"
-#: utils.cc:577
+#: utils.cc:365
msgid "cannot find XPM file for %1"
msgstr "æ¾ä¸å° XPM æä»¶æä¾ç» %1"
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:418 utils.cc:448 utils.cc:468
msgid "default"
msgstr "é»è®¤"
-#: utils.cc:642
+#: utils.cc:469
msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
msgstr "æ¾ä¸å°å¾æ \"%1\" æä¾ç»å¾æ é \"%2\"ï¼éåé»è®¤ç¶æ"
-#: utils.cc:649
+#: utils.cc:476
msgid "cannot find icon image for %1 using %2"
msgstr "æ¾ä¸å°å¾æ å¾åæä¾ç» %1 ä½¿ç¨ %2"
-#: utils.cc:666 utils.cc:682
+#: utils.cc:493 utils.cc:509
msgid "Caught exception while loading icon named %1"
msgstr "è½½å
¥å½å为 %1 ç徿 æ¶éå°å¼å¸¸"
-#: add_video_dialog.cc:54
+#: utils.cc:759
+msgid "Overwrite"
+msgstr "è¦çåå
¥"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "ç¬å¥ä»å±"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr "éé³ä»å±"
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "éèè¿ä¸ª VCA çæ®µ"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "ç¹å»ä»
æ¾ç¤ºä»å±"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr "丢å¼å
¨é¨ä»å±"
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "ç¹å»æ¾ç¤ºæ®éæ··é³å¨"
+
+#: add_video_dialog.cc:55
msgid "Set Video Track"
msgstr "设置è§é¢è½¨é"
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
msgid "Open Video Monitor Window"
msgstr "æå¼è§é¢çæ§çªå£"
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
msgid "Adjust Session Framerate to Match Video Framerate"
msgstr "è°æ´ä¼è¯å¸§çå¹é
è§é¢å¸§ç"
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
msgid "Reload docroot"
msgstr "éæ°è½½å
¥ææ¡£æ ¹"
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
msgid "Video files"
msgstr "è§é¢æä»¶"
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
msgid "<b>Video Information</b>"
msgstr "<b>è§é¢ä¿¡æ¯</b>"
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
msgid "Start:"
msgstr "èµ·ç¹ï¼"
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
msgid "Frame rate:"
msgstr "帧çï¼"
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
msgid "Aspect Ratio:"
msgstr "é¿å®½æ¯ï¼"
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
msgid "VideoServerIndex"
msgstr "è§é¢æå¡ç´¢å¼"
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
msgid " %1 fps"
msgstr ""
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr "䏿å®å
¨é¨ä»å±"
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "ä»
æ¾ç¤ºä»å±"
+
+#: video_timeline.cc:473
msgid ""
-"Parsing video file info failed. Is the Video Server running? Is the file readable "
-"by the Video Server? Does the docroot match? Is it a video file?"
+"Parsing video file info failed. Is the Video Server running? Is the file "
+"readable by the Video Server? Does the docroot match? Is it a video file?"
msgstr ""
-"è§£æè§é¢æä»¶ä¿¡æ¯å¤±è´¥ãè§é¢æå¡å¨æ¯å¦æ£å¨è¿è¡åï¼è§é¢æå¡å¨æ¯å¦å¯è¾¨è¯è¯¥æä»¶ï¼ææ¡£æ ¹"
-"æ¯å¦å¹é
ï¼è¿æ¯ä¸ä¸ªè§é¢æä»¶åï¼"
+"è§£æè§é¢æä»¶ä¿¡æ¯å¤±è´¥ãè§é¢æå¡å¨æ¯å¦æ£å¨è¿è¡åï¼è§é¢æå¡å¨æ¯å¦å¯è¾¨è¯è¯¥æä»¶ï¼"
+"ææ¡£æ ¹æ¯å¦å¹é
ï¼è¿æ¯ä¸ä¸ªè§é¢æä»¶åï¼"
-#: video_timeline.cc:506
+#: video_timeline.cc:511
msgid ""
-"Failed to set session-framerate: '%1' does not have a corresponding option setting "
-"in %2."
+"Failed to set session-framerate: '%1' does not have a corresponding option "
+"setting in %2."
msgstr "设置ä¼è¯å¸§ç失败ï¼'%1' çé项设置ä¸å¨ %2 éçä¸ä¸è´ã"
-#: video_timeline.cc:514
+#: video_timeline.cc:519
msgid ""
-"Video file's framerate is not equal to %1 session timecode's framerate: '%2' vs "
-"'%3'"
+"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
+"vs '%3'"
msgstr "è§é¢æä»¶ç帧çä¸çäº %1 ä¼è¯æ¶é´ç 帧çï¼ '%2' vs '%3'"
-#: video_timeline.cc:587
+#: video_timeline.cc:592
msgid ""
-"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually means "
-"that the video server was not started by %1 and uses a different document-root."
+"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
+"means that the video server was not started by %1 and uses a different "
+"document-root."
msgstr ""
-"è§é¢æä»¶ææ¡£æ ¹ä¸å¹é
ã%1: '%2'ï¼è§é¢æå¡å¨ï¼'%3'ãè¿é常æå³çè§é¢æå¡å¨æªè½éè¿ "
-"%1 å¯å¨ï¼å¹¶ä¸ä½¿ç¨çä¸ä¸ªä¸åçææ¡£æ ¹ã"
+"è§é¢æä»¶ææ¡£æ ¹ä¸å¹é
ã%1: '%2'ï¼è§é¢æå¡å¨ï¼'%3'ãè¿é常æå³çè§é¢æå¡å¨æªè½"
+"éè¿ %1 å¯å¨ï¼å¹¶ä¸ä½¿ç¨çä¸ä¸ªä¸åçææ¡£æ ¹ã"
-#: video_timeline.cc:724
+#: video_timeline.cc:729
msgid ""
-"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ (a "
-"custom path to xjadeo can be specified by setting the XJREMOTE environment "
-"variable. It should point to an application compatible with xjadeo's remote-"
-"control interface 'xjremote').\n"
+"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
+"(a custom path to xjadeo can be specified by setting the XJREMOTE "
+"environment variable. It should point to an application compatible with "
+"xjadeo's remote-control interface 'xjremote').\n"
"\n"
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-"è§é¢çæ§ 'xjadeo' æªæ¾å°ã请å®è£
http://xjadeo.sf.net/ ï¼å¯ä»¥éè¿è®¾ç½® XJREMOTE ç¯å¢"
-"å鿥æå®ä¸ä¸ªå° xjadeo çå®å¶è·¯å¾ãå®åºè¯¥æåä¸ä¸ªå
¼å®¹ xjadeo 饿§çé¢ 'xjremote' "
-"çåºç¨ç¨åºï¼ã\n"
+"è§é¢çæ§ 'xjadeo' æªæ¾å°ã请å®è£
http://xjadeo.sf.net/ ï¼å¯ä»¥éè¿è®¾ç½® "
+"XJREMOTE ç¯å¢å鿥æå®ä¸ä¸ªå° xjadeo çå®å¶è·¯å¾ãå®åºè¯¥æåä¸ä¸ªå
¼å®¹ xjadeo é¥"
+"æ§çé¢ 'xjremote' çåºç¨ç¨åºï¼ã\n"
"\n"
"请åé
http://manual.ardour.org/video-timeline/setup/"
-#: video_timeline.cc:739
+#: video_timeline.cc:744
msgid "Video-monitor 'xjadeo' cannot be launched."
msgstr "è§é¢çæ§ 'xjadeo' æ æ³å¯å¨ã"
-#: video_timeline.cc:766
+#: video_timeline.cc:776
msgid ""
-"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or later. "
-"http://xjadeo.sf.net/"
+"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
+"later. http://xjadeo.sf.net/"
msgstr ""
-"è§é¢çæ§ 'xjadeo' 太è¿èæ§ã请å®è£
xjadeo 0.7.7 æè
æ´æ°ççæ¬ã http://xjadeo.sf."
-"net/"
+"è§é¢çæ§ 'xjadeo' 太è¿èæ§ã请å®è£
xjadeo 0.7.7 æè
æ´æ°ççæ¬ã http://"
+"xjadeo.sf.net/"
-#: video_monitor.cc:285
+#: video_monitor.cc:283
msgid "Video Monitor: File Not Found."
msgstr "è§é¢çæ§ï¼æ¾ä¸å°æä»¶ã"
#: transcode_ffmpeg.cc:56
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
"\n"
-"The tools are included with the %1 releases from ardour.org and also available "
-"with the video-server at http://x42.github.com/harvid/\n"
+"The tools are included with the %1 releases from ardour.org and also "
+"available with the video-server at http://x42.github.com/harvid/\n"
"\n"
-"Important: the files need to be installed in $PATH and named ffmpeg_harvid and "
-"ffprobe_harvid.\n"
-"If you already have a suitable ffmpeg installation on your system, we recommend "
-"creating symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to "
-"ffprobe_harvid.\n"
+"Important: the files need to be installed in $PATH and named ffmpeg_harvid "
+"and ffprobe_harvid.\n"
+"If you already have a suitable ffmpeg installation on your system, we "
+"recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
+"ffprobe to ffprobe_harvid.\n"
"\n"
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
-"å¨è¿ä¸ªç³»ç»ä¸æ²¡æ¾å° ffprobe æè
ffmpeg 坿§è¡æä»¶ã\n"
+"å¨è¿ä¸ªç³»ç»ä¸æ¾ä¸å° ffprobe å®è£
çæä»¶ã\n"
"è§é¢å¯¼å
¥åå¯¼åºæ æ³è¿è¡ï¼é¤éæ¨å®è£
è¿äºå·¥å
·ã\n"
"%1 éè¦ ffmpeg å ffprobeï¼æ¥èª ffmpeg.org 1.1 æè
æ´æ°ççæ¬ã\n"
"\n"
-"è¿å·¥å
·å
æ¬æ¥èª ardour.org ç %1ï¼å¹¶ä¸ä¹å¯ç¨äº http://x42.github.com/harvid/ ä¸çè§"
-"颿å¡ã\n"
+"è¿å·¥å
·å
æ¬æ¥èª ardour.org ç %1ï¼å¹¶ä¸ä¹å¯ç¨äº http://x42.github.com/harvid/ "
+"ä¸çè§é¢æå¡ã\n"
"\n"
-"注æï¼è¿äºæä»¶éè¦å®è£
å¨ $PATH å¹¶ä¸å½å为 ffmpeg_harvid å ffprobe_harvid ã\n"
-"妿æ¨å¨æ¨çç³»ç»ä¸å·²ç»å®è£
æä¸ä¸ªåéç ffmpegï¼æä»¬å»ºè®®ç» ffmpeg å建符å·é¾æ¥ä¸º "
-"ffmpeg_harvidï¼ç» ffprobe å建符å·é¾æ¥ä¸º ffprobe_harvid ã\n"
+"注æï¼è¿äºæä»¶éè¦å®è£
å¨ $PATH å¹¶ä¸å½å为 ffmpeg_harvid å "
+"ffprobe_harvid ã\n"
+"妿æ¨å¨æ¨çç³»ç»ä¸å·²ç»å®è£
æä¸ä¸ªåéç ffmpegï¼æä»¬å»ºè®®ç» ffmpeg å建符å·é¾æ¥"
+"为 ffmpeg_harvidï¼ç» ffprobe å建符å·é¾æ¥ä¸º ffprobe_harvid ã\n"
"\n"
"请åé
http://manual.ardour.org/video-timeline/setup/"
@@ -12807,7 +15080,7 @@ msgstr "转ç /导å
¥è§é¢æä»¶"
msgid "Output File:"
msgstr "å¯¼åºæä»¶ï¼"
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
msgid "Abort"
msgstr "䏿¢"
@@ -12816,10 +15089,14 @@ msgid "Height = "
msgstr "é«åº¦ = "
#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr "ä»é³é¢å对é½çè§é¢ä¸æå LTCï¼çºµåæ¶é´ç ï¼"
+
+#: transcode_video_dialog.cc:67
msgid "Manual Override"
msgstr "æå¨è¦ç"
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
msgid "Debug Mode: Print ffmpeg command and output to stdout."
msgstr "è°è¯æ¨¡å¼ï¼æå° ffmpeg å½ä»¤å¹¶è¾åºå°æ åè¾åºã"
@@ -12829,98 +15106,96 @@ msgstr "<b>æä»¶ä¿¡æ¯</b>"
#: transcode_video_dialog.cc:113
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import is "
-"not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
msgstr ""
-"å¨è¿ä¸ªç³»ç»ä¸æ²¡æ¾å° ffprobe æè
ffmpeg 坿§è¡æä»¶ãè§é¢å¯¼å
¥æ æ³è¿è¡ï¼é¤éæ¨å®è£
è¿äº"
-"å·¥å
·ãæ´å¤çä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
+"æ¾ä¸å° ffprobe å®è£
çæä»¶ãè§é¢å¯¼å
¥æ æ³è¿è¡ãæ´å¤çä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
#: transcode_video_dialog.cc:120
msgid ""
"File-info can not be read. Most likely '%1' is not a valid video-file or an "
"unsupported video codec or format."
msgstr ""
-"æ æ³è¯»åæä»¶ä¿¡æ¯ãææå¯è½ 'â% 1' 䏿¯ä¸ä¸ªææçè§é¢æä»¶ï¼æè
æ¯ä¸ä¸ªä¸æ¯æçè§é¢ç¼"
-"è§£ç å¨ææ ¼å¼ã"
+"æ æ³è¯»åæä»¶ä¿¡æ¯ãææå¯è½ 'â% 1' 䏿¯ä¸ä¸ªææçè§é¢æä»¶ï¼æè
æ¯ä¸ä¸ªä¸æ¯æç"
+"è§é¢ç¼è§£ç å¨ææ ¼å¼ã"
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
msgid "FPS:"
-msgstr ""
-
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr "é³é¿ï¼"
+msgstr "FPSï¼å¸§çï¼ï¼"
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
msgid "Codec:"
msgstr "ç¼ç ï¼"
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
msgid "Geometry:"
msgstr "å ä½å½¢ç¶ï¼"
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
msgid "??"
msgstr ""
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
msgid "<b>Import Settings</b>"
msgstr "<b>导å
¥è®¾ç½®</b>"
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
msgstr "ä»å½åä½ç½®å¼ç¨ï¼ä»
ä¸ä¸ä¸ªå·²è½¬ç æä»¶ï¼"
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
msgid "Import/Transcode Video to Session"
msgstr "导å
¥/转ç è§é¢å°ä¼è¯"
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
msgid "Do Not Import Video (Audio Import Only)"
msgstr "ä¸è¦å¯¼å
¥è§é¢ï¼ä»
导å
¥é³é¢ï¼"
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr "ä¸è¦å¯¼å
¥è§é¢"
+
+#: transcode_video_dialog.cc:224
msgid "Scale Video: Width = "
msgstr "缩æ¾è§é¢ï¼å®½åº¦ = "
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
msgid "Original Width"
msgstr "åå§å®½åº¦"
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
msgid "Bitrate (KBit/s):"
msgstr "æ¯ç¹çï¼ç ç KBit/sï¼ï¼"
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
msgid "Extract Audio:"
msgstr "æåé³é¢ï¼"
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
msgid "No Audio Track Present"
msgstr "æ é³é¢è½¨éåç°"
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
msgid "Do Not Extract Audio"
msgstr "æ æ³æåé³é¢"
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
msgid "Extracting Audio.."
msgstr "é³é¢æåä¸â¦"
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
msgid "Audio Extraction Failed."
msgstr "é³é¢æå失败ã"
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
msgid "Transcoding Video.."
msgstr "è§é¢è½¬ç ä¸â¦"
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
msgid "Transcoding Failed."
msgstr "转ç 失败ã"
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
msgid "Save Transcoded Video File"
msgstr "ä¿å已转ç è§é¢æä»¶"
@@ -12940,34 +15215,34 @@ msgstr "æå¡å¨ææ¡£æ ¹ï¼"
msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
msgstr "ä¸åæ¾ç¤ºè¿ä¸ªå¯¹è¯æ¡ãï¼å¯å¨ ç¼è¾ -> é¦é项 ééç½®ï¼ã"
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
msgid ""
"The external video server 'harvid' can not be found.\n"
-"The tool is included with the %1 releases from ardour.org, alternatively you can "
-"download it from http://x42.github.com/harvid/ or acquire it from your "
+"The tool is included with the %1 releases from ardour.org, alternatively you "
+"can download it from http://x42.github.com/harvid/ or acquire it from your "
"distribution.\n"
"\n"
"see also http://manual.ardour.org/video-timeline/setup/"
msgstr ""
"æ¾ä¸å°å¤é¨è§é¢æå¡å¨ 'harvid' ã\n"
-"è¿å·¥å
·å
æ¬æ¥èª ardour.org ç %1ï¼å¦å¤æ¨å¯ä»¥ä» http://x42.github.com/harvid/ ä¸è½½"
-"å®ï¼æè
仿¨çåè¡çè·å¾å®ã\n"
+"è¿å·¥å
·å
æ¬æ¥èª ardour.org ç %1ï¼å¦å¤æ¨å¯ä»¥ä» http://x42.github.com/harvid/ "
+"ä¸è½½å®ï¼æè
仿¨çåè¡çè·å¾å®ã\n"
"\n"
"请åé
http://manual.ardour.org/video-timeline/setup/"
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
msgid "Listen Address:"
msgstr "è¯å¬å°åï¼"
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
msgid "Listen Port:"
msgstr "è¯å¬ç«¯å£ï¼"
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
msgid "Cache Size:"
msgstr "ç¼å大å°ï¼"
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
msgid ""
"%1 relies on an external video server for the videotimeline.\n"
"The server configured in Edit -> Preferences -> Video is not reachable.\n"
@@ -12975,226 +15250,215 @@ msgid ""
msgstr ""
"%1 ä¾èµäºå¤é¨è§é¢æå¡å¨ä»¥è·åè§é¢æ¶é´çº¿ã\n"
"è¿ä¸ªå·²é
ç½®å¨ ç¼è¾ -> é¦é项 -> è§é¢ çæå¡å¨æ æ³è®¿é®ã\n"
-"æ¨æ¯å¦è¦ %1 å¨è¿å°æºå¨ä¸å¯å¨ 'harvid' ï¼"
+"æ¨æ¯å¦è¦ %1 å¨è¿å°æºå¨ä¸å¯å¨ 'harvid'ï¼"
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
msgid "Set Video Server Executable"
msgstr "设置è§é¢æå¡å¨å¯æ§è¡"
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
msgid "Server docroot"
msgstr "æå¡å¨ææ¡£æ ¹"
-#: utils_videotl.cc:60
+#: utils_videotl.cc:63
msgid "Destination is outside Video Server's docroot. "
-msgstr "ç®çå°æ¯è§é¢æå¡å¨çææ¡£æ ¹ä¹å¤ã"
+msgstr "ç®çå°æ¯è§é¢æå¡å¨çææ¡£æ ¹ä¹å¤"
-#: utils_videotl.cc:61
+#: utils_videotl.cc:64
msgid ""
-"The destination file path is outside of the Video Server's docroot. The file will "
-"not be readable by the Video Server. Do you still want to continue?"
+"The destination file path is outside of the Video Server's docroot. The file "
+"will not be readable by the Video Server. Do you still want to continue?"
msgstr ""
-"ç®çå°æä»¶è·¯å¾æ¯å¤å¨è§é¢æå¡å¨ææ¡£æ ¹ä¹å¤ãè¿ä¸ªæä»¶å°æ æ³è¢«è§é¢æå¡å¨è¯»åãæ¨æ¯å¦è¦"
-"ç»§ç»ï¼"
+"ç®çå°æä»¶è·¯å¾æ¯å¤å¨è§é¢æå¡å¨ææ¡£æ ¹ä¹å¤ãè¿ä¸ªæä»¶å°æ æ³è¢«è§é¢æå¡å¨è¯»åãæ¨"
+"æ¯å¦è¦ç»§ç»ï¼"
-#: utils_videotl.cc:64
+#: utils_videotl.cc:67
msgid "Continue"
msgstr "ç»§ç»"
-#: utils_videotl.cc:70
+#: utils_videotl.cc:74
msgid "Confirm Overwrite"
msgstr "确认è¦ç"
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr "å·²æç¸ååç§°çæä»¶åå¨ãæ¨æ¯å¦è¦éåè¦çå®ï¼"
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:84 utils_videotl.cc:100
msgid "Cannot create video folder \"%1\" (%2)"
msgstr "æ æ³å建è§é¢æä»¶å¤¹ \"%1\" (%2)"
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
msgid "Export Video File "
msgstr "导åºè§é¢æä»¶"
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
msgid "Video:"
msgstr "è§é¢ï¼"
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
msgid "Scale Video (W x H):"
msgstr "缩æ¾è§é¢ï¼å®½ x é«ï¼ï¼"
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
msgid "Retain Aspect"
msgstr "ä¿æé¿å®½æ¯"
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
msgid "Set Aspect Ratio:"
msgstr "设置é¿å®½æ¯ï¼"
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
msgid "Normalize Audio"
msgstr "è§èåé³é¢"
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
msgid "2 Pass Encoding"
msgstr "äºæ¬¡ç¼ç "
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
msgid "Codec Optimizations:"
msgstr "è§£ç å¨ä¼åï¼"
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
msgid "Deinterlace"
msgstr "å交é"
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
msgid "Use [2] B-frames (MPEG 2 or 4 only)"
msgstr "ä½¿ç¨ [2] B-帧ï¼ä»
MPEG 2 æ 4ï¼"
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr "è¦ç FPSï¼é»è®¤æ¯è¦çå°ä»è¾å
¥è§é¢æä»¶ä¿çç FPSï¼ï¼"
+msgstr "è¦ç FPS â帧çâï¼é»è®¤æ¯è¦çå°ä»è¾å
¥è§é¢æä»¶ä¿çç FPSï¼ï¼"
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
msgid "Include Session Metadata"
msgstr "å
æ¬ä¼è¯å
æ°æ®"
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export is "
-"not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"å¨è¿ä¸ªç³»ç»ä¸æ²¡æ¾å° ffprobe æè
ffmpeg 坿§è¡æä»¶ãè§é¢å¯¼åºæ æ³è¿è¡ï¼é¤éæ¨å®è£
è¿äº"
-"å·¥å
·ãæ´å¤çä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
+msgstr "æ¾ä¸å° ffmpeg å®è£
çæä»¶ãè§é¢å¯¼åºæ æ³è¿è¡ãæ´å¤çä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
msgid "<b>Output:</b> (file extension defines format)"
msgstr "<b>导åºï¼</b>ï¼ä»¥æä»¶æ©å±åå³å®æ ¼å¼ï¼"
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
msgid "<b>Input Video:</b>"
msgstr "<b>导å
¥è§é¢</b>"
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
msgid "Audio:"
msgstr "é³é¢ï¼"
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
msgid "Master Bus"
msgstr "ä¸»æ§æ»çº¿"
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
msgid "from the %1 session's start to the session's end"
msgstr "ä» %1 ä¼è¯çèµ·ç¹å°ä¼è¯çç»ç¹"
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
msgid "<b>Settings:</b>"
-msgstr "<b>设置</b>"
+msgstr "<b>设置ï¼</b>"
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
msgid "Range:"
msgstr "èå´ï¼"
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "é¢è®¾ï¼"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
msgid "Video Codec:"
-msgstr "è§é¢ç¼ç ï¼"
+msgstr "é¢è®¾ï¼"
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
msgid "Video KBit/s:"
msgstr "è§é¢ KBit/sï¼"
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
msgid "Audio Codec:"
msgstr "é³é¢ç¼ç ï¼"
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
msgid "Audio KBit/s:"
msgstr "é³é¢ KBit/sï¼"
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
msgid "Audio Samplerate:"
msgstr "é³é¢éæ ·çï¼"
-#: export_video_dialog.cc:222 export_video_dialog.cc:231 export_video_dialog.cc:830
-#: export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
msgid "(default for format)"
msgstr "ï¼é»è®¤æ ¼å¼ï¼"
-#: export_video_dialog.cc:242 export_video_dialog.cc:255 export_video_dialog.cc:837
-#: export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
msgid "(default)"
msgstr "ï¼é»è®¤ï¼"
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
msgid "(retain)"
msgstr "ï¼ä¿çï¼"
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
msgid "from 00:00:00:00 to the video's end"
msgstr "ä» 00:00:00:00 å°è§é¢ç»ç¹"
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
msgid "from the video's start to the video's end"
msgstr "ä»è§é¢èµ·ç¹å°è§é¢ç»ç¹"
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
msgid "Selected range"
msgstr "已鿩çèå´"
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
msgid "Normalizing audio"
-msgstr "è§èåé³é¢"
+msgstr "é³é¢è§èåä¸"
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
msgid "Exporting audio"
msgstr "é³é¢å¯¼åºä¸"
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
msgid "Exporting Audio..."
msgstr "é³é¢å¯¼åºä¸â¦"
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
msgid ""
-"Export Video: Cannot query duration of video-file, using duration from timeline "
-"instead."
+"Export Video: Cannot query duration of video-file, using duration from "
+"timeline instead."
msgstr "导åºè§é¢ï¼æ æ³æ¥è¯¢è§é¢æä»¶é¿åº¦ï¼è§é¢æ¶é´çº¿é¿åº¦ä»£æ¿ã"
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
msgid "Export Video: export-range does not include video."
msgstr "导åºè§é¢ï¼å¯¼åºèå´æ æ³å
æ¬è§é¢ã"
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr "导åºè§é¢ï¼æ²¡æä¸»æ§è¾åºç«¯å£å¯è¿æ¥ç»é³é¢å¯¼åº"
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
msgid "Encoding Video..."
msgstr "è§é¢ç¼ç ä¸â¦"
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
msgid "Export Video: Video input file cannot be read."
-msgstr "导åºè§é¢ï¼æ æ³è¯»åè§é¢å¯¼å
¥æä»¶ã"
+msgstr "导åºè§é¢ï¼æ æ³è¯»åè§é¢å¯¼å
¥æä»¶"
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
msgid "Encoding Video.. Pass 1/2"
msgstr "è§é¢ç¼ç ä¸â¦éè¿ 1/2"
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
msgid "Encoding Video.. Pass 2/2"
msgstr "è§é¢ç¼ç ä¸â¦éè¿ 2/2"
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
msgid "Transcoding failed."
msgstr "转ç 失败ã"
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
msgid "Save Exported Video File"
msgstr "ä¿å已导åºçè§é¢æä»¶"
@@ -13212,475 +15476,20 @@ msgstr "<b>è§é¢å¯¼åºä¿¡æ¯</b>"
#: export_video_infobox.cc:51
msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
"Video encoding is a non-trivial task with many details.\n"
"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
"\n"
"Open Manual in Browser? "
msgstr ""
+"%1 ä¸å
å«é³é¢/è§é¢ç¼ç çåä¸è®¸å¯è¯ãå
³äºåç§é³é¢/è§é¢ç¼ç ç许å¯è¯ä¿¡æ¯ï¼è¯·è®¿"
+"é® mpegla.com ã\n"
+"\n"
"è§é¢ç¼ç æ¯ä¸é¡¹å¸¦æè®¸å¤ç»èçä¸ç®åçä»»å¡ã\n"
"\n"
"请åé
æåï¼ä½äº %1/video-timeline/operations/#export ã\n"
"\n"
"卿µè§å¨éæå¼æåï¼"
-
-#~ msgid "Track mode:"
-#~ msgstr "é³è½¨æ¨¡å¼:"
-
-#~ msgid "Theme Manager"
-#~ msgstr "主é¢ç®¡ç"
-
-#~ msgid "Errors"
-#~ msgstr "é误"
-
-#~ msgid "Play Selected Range"
-#~ msgstr "ææ¾å·²éæ©çèå´"
-
-#~ msgid "Convert to Region In-Place"
-#~ msgstr "卿¤è½¬æ¢è³åºå"
-
-#~ msgid "Set Loop from Range"
-#~ msgstr "ä»èå´è®¾ç½®å¾ªç¯"
-
-#~ msgid "Set Punch from Range"
-#~ msgstr "ä»èå´è®¾ç½®Punch"
-
-#~ msgid "Draw/Edit MIDI Notes"
-#~ msgstr "ç»ç»/ç¼è¾MIDIé³ç¬¦"
-
-#~ msgid "Draw Region Gain"
-#~ msgstr "ç»å¶åºåå¢ç"
-
-#~ msgid "Select Zoom Range"
-#~ msgstr "éæ©åç¦èå´"
-
-#~ msgid "Stretch/Shrink Regions and MIDI Notes"
-#~ msgstr "伸/缩åºååMIDIé³ç¬¦"
-
-#~ msgid "Listen to Specific Regions"
-#~ msgstr "å¬ç¹å®åºå"
-
-#~ msgid "Set Punch from Edit Range"
-#~ msgstr "å¨ç¼è¾èå´è®¾ç½®Punch"
-
-#~ msgid "Edit MIDI"
-#~ msgstr "ç¼è¾MIDI"
-
-#~ msgid "Show Measures"
-#~ msgstr "æ¾ç¤ºæµé"
-
-#~ msgid " range"
-#~ msgstr "èå´"
-
-#~ msgid "set loop range from edit range"
-#~ msgstr "ä»ç¼è¾èå´è®¾ç½®å¾ªç¯èå´"
-
-#~ msgid "set punch range from edit range"
-#~ msgstr "ä»ç¼è¾èå´è®¾ç½®punchåºé´"
-
-#~ msgid ""
-#~ "Do you really want to remove %1 %2?\n"
-#~ "\n"
-#~ "This action cannot be undon, and the session file will be overwritten"
-#~ msgstr ""
-#~ "ä½ ç¡®å®ç§»é¤ %1 %2?\n"
-#~ "\n"
-#~ "æ¤å¨ä½ä¸å¯æ¤é, è䏿¤ä¼è¯æä»¶å°ä¼è¢«éæ°åå
¥!"
-
-#~ msgid "set selected regions"
-#~ msgstr "设置æéåºå"
-
-#~ msgid "select all"
-#~ msgstr "éæ©ææ"
-
-#~ msgid "select all within"
-#~ msgstr "å¨å
éæ©ææ"
-
-#~ msgid "set selection from range"
-#~ msgstr "ä»èå´è®¾ç½®éåº"
-
-#~ msgid "select all from range"
-#~ msgstr "ä»èå´éæ©ææ"
-
-#~ msgid "select all from punch"
-#~ msgstr "ä»punchéæ©ææ"
-
-#~ msgid "select all from loop"
-#~ msgstr "ä»å¾ªç¯éæ©ææ"
-
-#~ msgid "select all after cursor"
-#~ msgstr "å¨å
æ åéæ©ææ"
-
-#~ msgid "select all before cursor"
-#~ msgstr "å¨å
æ åéæ©ææ"
-
-#~ msgid "select all after edit"
-#~ msgstr "ç¼è¾åéæ©ææ"
-
-#~ msgid "select all before edit"
-#~ msgstr "ç¼è¾åéæ©ææ"
-
-#~ msgid "Plugin preset %1 not found"
-#~ msgstr "æªæ¾å°æä»¶é¢è®¾%1"
-
-#~ msgid "Set volume (velocity) to forteissimo"
-#~ msgstr "设置é³é(å度)为æå¼ºé³"
-
-#~ msgid "Set volume (velocity) to forteississimo"
-#~ msgstr "设置é³é(å度)为æå¼ºé³"
-
-#~ msgid "badly formatted UI definition file: %1"
-#~ msgstr "é误çç¨æ·ç颿 ¼å¼æä»¶ %1"
-
-#~ msgid ""
-#~ "There are insufficient JACK ports available\n"
-#~ "to create a new track or bus.\n"
-#~ "You should save %1, exit and\n"
-#~ "restart JACK with more ports."
-#~ msgstr ""
-#~ "JACK端å£(port)ä¸è¶³\n"
-#~ "æ æ³ç»§ç»æ°å»ºé³è½¨ææ»çº¿\n"
-#~ "请ä¿å %1ï¼éæ°å¯å¨JACKå¸¦æ¥æ´å¤ç端å£.\n"
-
-#~ msgid "Timecode Frames"
-#~ msgstr "æ¶é´ç æ¡æ¶"
-
-#~ msgid "Timecode Seconds"
-#~ msgstr "æ¶é´ç ç§"
-
-#~ msgid "Timecode Minutes"
-#~ msgstr "æ¶é´ç å"
-
-#~ msgid "Slowest"
-#~ msgstr "ææ
¢"
-
-#~ msgid "insert dragged region"
-#~ msgstr "æå
¥ææ½åºå"
-
-#~ msgid " objects"
-#~ msgstr "对象"
-
-#~ msgid "No edit range defined"
-#~ msgstr "没æå®ä¹çç¼è¾èå´"
-
-#~ msgid ""
-#~ "the edit point is Selected Marker\n"
-#~ "but there is no selected marker."
-#~ msgstr ""
-#~ "è¿ä¸ªç¼è¾ç¹æ¯å·²éæ©çæ è®°,\n"
-#~ "使¯æ²¡æå·²éæ©çæ è®°."
-
-#~ msgid "Position of mark on the ruler"
-#~ msgstr "æ å°ºçæ è®°ä½ç½®"
-
-#~ msgid "Max Size"
-#~ msgstr "æå¤§å尺寸"
-
-#~ msgid "Maximum size of the ruler"
-#~ msgstr "æ å°ºçæå¤§å尺寸"
-
-#~ msgid "Show Position"
-#~ msgstr "æ¾ç¤ºä½ç½®"
-
-#~ msgid "Draw current ruler position"
-#~ msgstr "ç»å¶å½åæ å°ºä½ç½®"
-
-#~ msgid "cannot open pango.rc file %1"
-#~ msgstr "æ æ³æå¼pango.rc æä»¶ %1"
-
-#~ msgid "Missing File!"
-#~ msgstr "æ¾ä¸å°æä»¶!"
-
-#~ msgid "auditioning"
-#~ msgstr "çå¬ä¸"
-
-#~ msgid "mono"
-#~ msgstr "å声é"
-
-#~ msgid "Link selection of regions and tracks"
-#~ msgstr "龿¥æéçåºååé³è½¨"
-
-#~ msgid "ardour"
-#~ msgstr "ardour"
-
-#~ msgid "x1"
-#~ msgstr "x1"
-
-#~ msgid "x coordinate of upper left corner of rect"
-#~ msgstr "xä¸ç©å½¢çå·¦ä¸è§ç¸å
³"
-
-#~ msgid "y1"
-#~ msgstr "y1"
-
-#~ msgid "y coordinate of upper left corner of rect "
-#~ msgstr "yä¸ç©å½¢çå³ä¸è§ç¸å
³"
-
-#~ msgid "x2"
-#~ msgstr "x1"
-
-#~ msgid "x coordinate of lower right corner of rect"
-#~ msgstr "xä¸ç©å½¢çå³ä¸è§ç¸å
³"
-
-#~ msgid "y coordinate of lower right corner of rect "
-#~ msgstr "yä¸ç©å½¢çå³ä¸è§ç¸å
³"
-
-#~ msgid "color rgba"
-#~ msgstr "RGBAé¢è²"
-
-#~ msgid "color of line"
-#~ msgstr "线æ¡é¢è²"
-
-#~ msgid "outline pixels"
-#~ msgstr "è½®å»åç´ "
-
-#~ msgid "width in pixels of outline"
-#~ msgstr "è½®å»çåç´ å®½åº¦"
-
-#~ msgid "fill"
-#~ msgstr "å¡«å
"
-
-#~ msgid "fill rectangle"
-#~ msgstr "å¡«å
ç©å½¢"
-
-#~ msgid "draw"
-#~ msgstr "ç»å¶"
-
-#~ msgid "draw rectangle"
-#~ msgstr "ç»å¶ç©å½¢"
-
-#~ msgid "outline color rgba"
-#~ msgstr "RGBAè½®å»é¢è²"
-
-#~ msgid "color of outline"
-#~ msgstr "è½æ¬çé¢è²"
-
-#~ msgid "fill color rgba"
-#~ msgstr "å¡«å
RGBAé¢è²"
-
-#~ msgid "color of fill"
-#~ msgstr "å¡«å
çé¢è²"
-
-#~ msgid "Auditioning of MIDI files is not yet supported"
-#~ msgstr "æä¸æ¯æçå¬MIDIæä»¶"
-
-#~ msgid "Starting audio engine"
-#~ msgstr "å¯å¨é³é¢å¼æ"
-
-#~ msgid "disconnected"
-#~ msgstr "åæ¶è¿æ¥"
-
-#~ msgid ""
-#~ "%1 is not connected to JACK\n"
-#~ "You cannot open or close sessions in this condition"
-#~ msgstr ""
-#~ "%1 æªè¿æ¥å° JACK.\n"
-#~ "忤æ
åµä¸ï¼ä½ æ æ³æå¼æå
³éä¼è¯"
-
-#~ msgid ""
-#~ "The audio backend (JACK) was shutdown because:\n"
-#~ "\n"
-#~ "%1"
-#~ msgstr ""
-#~ "é³é¢åå°(JACK)å
³éäºï¼åå å¦ä¸:\n"
-#~ "\n"
-#~ "%1"
-
-#~ msgid ""
-#~ "JACK has either been shutdown or it\n"
-#~ "disconnected %1 because %1\n"
-#~ "was not fast enough. Try to restart\n"
-#~ "JACK, reconnect and save the session."
-#~ msgstr ""
-#~ "JACK 被å
³éäºï¼æä¸ %1 失å»äºè¿æ¥\n"
-#~ "åå æ¯ %1 ä¸å¤å¿«.\n"
-#~ "å°è¯éå¯JACKï¼éæ°è¿æ¥å¹¶ä¸ä¿åä¼è¯."
-
-#~ msgid "Unable to start the session running"
-#~ msgstr "æ æ³å¯å¨ä¼è¯"
-
-#~ msgid "Click the Refresh button to try again."
-#~ msgstr "åå»å·æ°æé®,åå°è¯ä¸é"
-
-#~ msgid "Could not disconnect from JACK"
-#~ msgstr "æ æ³æå¼JACKçè¿æ¥"
-
-#~ msgid "Could not reconnect to JACK"
-#~ msgstr "æ æ³éæ°è¿æ¥å°JACK"
-
-#~ msgid "JACK"
-#~ msgstr "JACK"
-
-#~ msgid "Reconnect"
-#~ msgstr "鿰龿¥"
-
-#~ msgid "JACK Sampling Rate and Latency"
-#~ msgstr "JACKéæ ·çåå»¶è¿"
-
-#~ msgid "Realtime"
-#~ msgstr "宿¶"
-
-#~ msgid "Do not lock memory"
-#~ msgstr "ä¸éå
å"
-
-#~ msgid "Unlock memory"
-#~ msgstr "è§£éå
å"
-
-#~ msgid "8000Hz"
-#~ msgstr "8000 Hz"
-
-#~ msgid "22050Hz"
-#~ msgstr "22050 Hz"
-
-#~ msgid "44100Hz"
-#~ msgstr "44100 Hz"
-
-#~ msgid "48000Hz"
-#~ msgstr "48000 Hz"
-
-#~ msgid "88200Hz"
-#~ msgstr "88200 Hz"
-
-#~ msgid "96000Hz"
-#~ msgstr "96000 Hz"
-
-#~ msgid "192000Hz"
-#~ msgstr "192000 Hz"
-
-#~ msgid "Triangular"
-#~ msgstr "ä¸è§å½¢"
-
-#~ msgid "Rectangular"
-#~ msgstr "ç©å½¢"
-
-#~ msgid "Shaped"
-#~ msgstr "å½¢ç¶"
-
-#~ msgid "Playback/recording on 1 device"
-#~ msgstr "å¨è®¾å¤1 ææ¾/å½é³"
-
-#~ msgid "Playback/recording on 2 devices"
-#~ msgstr "å¨è®¾å¤2 ææ¾/å½é³"
-
-#~ msgid "Playback only"
-#~ msgstr "ä»
ææ¾"
-
-#~ msgid "Recording only"
-#~ msgstr "ä»
å½é³"
-
-#~ msgid "Number of buffers:"
-#~ msgstr "ç¼å²åºæ°é:"
-
-#~ msgid "Approximate latency:"
-#~ msgstr "大约延è¿:"
-
-#~ msgid "Audio mode:"
-#~ msgstr "é³é¢æ¨¡å¼:"
-
-#~ msgid "Ignore"
-#~ msgstr "忽ç¥"
-
-#~ msgid "Client timeout"
-#~ msgstr "客æ·ç«¯è¶
æ¶"
-
-#~ msgid "Number of ports:"
-#~ msgstr "ç«¯å£æ°é:"
-
-#~ msgid "MIDI driver:"
-#~ msgstr "MIDI驱å¨:"
-
-#~ msgid ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
-#~ msgstr ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
-
-#~ msgid "Server:"
-#~ msgstr "æå¡å¨:"
-
-#~ msgid "Input device:"
-#~ msgstr "è¾å
¥è®¾å¤:"
-
-#~ msgid "Output device:"
-#~ msgstr "è¾åºè®¾å¤:"
-
-#~ msgid "Advanced"
-#~ msgstr "é«çº§"
-
-#~ msgid "cannot open JACK rc file %1 to store parameters"
-#~ msgstr "æ æ³æå¼JACKçrcæä»¶%1æ¥å¨ååæ°"
-
-#~ msgid "No suitable audio devices"
-#~ msgstr "没æåéçé³é¢è®¾å¤"
-
-#~ msgid "JACK appears to be missing from the %1 bundle"
-#~ msgstr "JACK%1"
-
-#~ msgid "You need to choose an audio device first."
-#~ msgstr "ä½ éè¦å
éæ©ä¸ä¸ªé³é¢è®¾å¤"
-
-#~ msgid "Audio device \"%1\" not known on this computer."
-#~ msgstr "çµèæ æ³è¯å«é³é¢è®¾å¤ %1"
-
-#~ msgid "%1 could not connect to JACK."
-#~ msgstr "%1 æ æ³è¿æ¥å°JACK"
-
-#~ msgid "JACK exited"
-#~ msgstr "JACKå·²ç»éåº"
-
-#~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
-#~ "\n"
-#~ "This could be due to misconfiguration or to an error inside JACK.\n"
-#~ "\n"
-#~ "Click OK to exit %1."
-#~ msgstr ""
-#~ "JACKåºä¹ææå°éåºäº, 没æä»»ä½æ¥å %1.\n"
-#~ "\n"
-#~ "è¿å¯è½æ¯å¾®é
ç½®æJACKéé¢çé误.\n"
-#~ "\n"
-#~ "åå»OKéåº %1."
-
-#~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
-#~ "\n"
-#~ "This is probably due to an error inside JACK. You should restart JACK\n"
-#~ "and reconnect %1 to it, or exit %1 now. You cannot save your\n"
-#~ "session at this time, because we would lose your connection information.\n"
-#~ msgstr ""
-#~ "JACKåºä¹ææå°éåºäº, 没æä»»ä½æ¥å %1.\n"
-#~ "\n"
-#~ "è¿å¯è½æ¯JACKéé¢çé误. ä½ æå¥½éå¯JACK\n"
-#~ "ç¶åè¿æ¥å°%1, æè
ç°å¨éåº%1.\n"
-#~ "ç°å¨ä½ æ²¡åæ³ä¿åä¼è¯, å ä¸ºä½ çè¿æ¥ä¿¡æ¯å¯è½ä¼ä¸¢å¤±.\n"
-
-#~ msgid ""
-#~ " -c, --name <name> Use a specific jack client name, default is "
-#~ "ardour\n"
-#~ msgstr ""
-#~ " -c, --name <name> ç¨ä¸ä¸ªç¹æ®çJACKç¨æ·åç§°, é»è®¤åç§°æ¯: ardour\n"
-
-#~ msgid "follows order of editor"
-#~ msgstr "ç¼è¾å¨çå¦ä¸é¡ºåº"
-
-#~ msgid "Open an existing session"
-#~ msgstr "æå¼ä¸ä¸ªå·²åå¨çä¼è¯"
-
-#~ msgid "I'd like more options for this session"
-#~ msgstr "ææ³è¦å
³äºè¿ä¸ªä¼è¯çæ´å¤é项"
-
-#~ msgid "Audio / MIDI Setup"
-#~ msgstr "é³é¢/MIDI设置"
-
-#~ msgid "Use an existing session as a template:"
-#~ msgstr "使ç¨ä¸ä¸ªåå¨çä¼è¯å½ä½æ¨¡æ¿"
-
-#~ msgid "Select template"
-#~ msgstr "éæ©æ¨¡æ¿"
-
-#~ msgid "Browse:"
-#~ msgstr "æµè§:"
-
-#~ msgid "Select a session"
-#~ msgstr "éæ©ä¸ä¸ªä¼è¯"
-
-#~ msgid "Advanced Session Options"
-#~ msgstr "é«çº§ä¼è¯é项"
diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc
index d02171a..093e307 100644
--- a/gtk2_ardour/port_group.cc
+++ b/gtk2_ardour/port_group.cc
@@ -43,7 +43,7 @@
#include "time_axis_view.h"
#include "public_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -316,7 +316,7 @@ struct RouteIOs {
class RouteIOsComparator {
public:
bool operator() (RouteIOs const & a, RouteIOs const & b) {
- return a.route->order_key () < b.route->order_key ();
+ return a.route->presentation_info ().order() < b.route->presentation_info().order();
}
};
@@ -375,13 +375,10 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
/* Sort RouteIOs by the routes' editor order keys */
route_ios.sort (RouteIOsComparator ());
- /* Now put the bundles that belong to these sorted RouteIOs into the PortGroup.
- Note that if the RouteIO's bundles are multi-type, we may make new Bundles
- with only the ports of one type.
- */
+ /* Now put the bundles that belong to these sorted RouteIOs into the PortGroup. */
for (list<RouteIOs>::iterator i = route_ios.begin(); i != route_ios.end(); ++i) {
- TimeAxisView* tv = PublicEditor::instance().axis_view_from_route (i->route);
+ TimeAxisView* tv = PublicEditor::instance().axis_view_from_stripable (i->route);
/* Work out which group to put these IOs' bundles in */
boost::shared_ptr<PortGroup> g;
@@ -392,10 +389,14 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
}
for (list<boost::shared_ptr<IO> >::iterator j = i->ios.begin(); j != i->ios.end(); ++j) {
- if (tv) {
- g->add_bundle ((*j)->bundle(), *j, tv->color ());
- } else {
- g->add_bundle ((*j)->bundle(), *j);
+ /* Only add the bundle if there is at least one port
+ * with a type that's been asked for */
+ if (type == DataType::NIL || (*j)->bundle()->nchannels().n(type) > 0) {
+ if (tv) {
+ g->add_bundle ((*j)->bundle(), *j, tv->color ());
+ } else {
+ g->add_bundle ((*j)->bundle(), *j);
+ }
}
}
}
@@ -511,7 +512,18 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
lpnc += ':';
vector<string> ports;
- if (AudioEngine::instance()->get_ports ("", type, inputs ? IsInput : IsOutput, ports) > 0) {
+ if (type == DataType::NIL) {
+ vector<string> p1;
+ AudioEngine::instance()->get_ports ("", DataType::AUDIO, inputs ? IsInput : IsOutput, ports);
+ AudioEngine::instance()->get_ports ("", DataType::MIDI, inputs ? IsInput : IsOutput, p1);
+ for (vector<string>::const_iterator s = p1.begin(); s != p1.end(); ++s) {
+ ports.push_back (*s);
+ }
+ } else {
+ AudioEngine::instance()->get_ports ("", type, inputs ? IsInput : IsOutput, ports);
+ }
+
+ if (ports.size () > 0) {
for (vector<string>::const_iterator s = ports.begin(); s != ports.end(); ) {
@@ -537,10 +549,11 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
we excluded them earlier.
*/
- string lp = p;
+ string lp = p, monitor = _("Monitor");
boost::to_lower (lp);
+ boost::to_lower (monitor);
- if ((lp.find (N_(":monitor")) != string::npos) &&
+ if ((lp.find (monitor) != string::npos) &&
(lp.find (lpn) != string::npos)) {
++s;
continue;
@@ -556,9 +569,9 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
if (ph) {
DataType t (AudioEngine::instance()->port_engine().port_data_type (ph));
if (t != DataType::NIL) {
- if (port_has_prefix (p, N_("system:")) ||
- port_has_prefix (p, N_("alsa_pcm:")) ||
- port_has_prefix (p, N_("alsa_midi:"))) {
+ if (port_has_prefix (p, X_("system:")) ||
+ port_has_prefix (p, X_("alsa_pcm:")) ||
+ port_has_prefix (p, X_("alsa_midi:"))) {
extra_system[t].push_back (p);
} else if (port_has_prefix (p, lpnc)) {
/* Hide scene ports from non-Tracks Live builds */
@@ -622,9 +635,7 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
}
add_group_if_not_empty (other);
- if (type != DataType::MIDI) {
- add_group_if_not_empty (bus);
- }
+ add_group_if_not_empty (bus);
add_group_if_not_empty (track);
add_group_if_not_empty (program);
add_group_if_not_empty (system);
diff --git a/gtk2_ardour/port_insert_ui.cc b/gtk2_ardour/port_insert_ui.cc
index a742740..0bf8653 100644
--- a/gtk2_ardour/port_insert_ui.cc
+++ b/gtk2_ardour/port_insert_ui.cc
@@ -29,7 +29,7 @@
#include "port_insert_ui.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace Gtk;
diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc
index 34e0f68..1b58851 100644
--- a/gtk2_ardour/port_matrix.cc
+++ b/gtk2_ardour/port_matrix.cc
@@ -37,7 +37,7 @@
#include "port_matrix_body.h"
#include "port_matrix_component.h"
#include "ardour_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "gui_thread.h"
#include "utils.h"
@@ -159,7 +159,7 @@ PortMatrix::init ()
_session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
/* watch for route order keys changing, which changes the order of things in our global ports list(s) */
- Route::SyncOrderKeys.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context());
+ PresentationInfo::Change.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context());
/* Part 3: other stuff */
@@ -729,9 +729,7 @@ PortMatrix::add_channel (boost::shared_ptr<Bundle> b, DataType t)
if (io) {
int const r = io->add_port ("", this, t);
if (r == -1) {
- Gtk::MessageDialog msg (_("It is not possible to add a port here, as the first processor in the track or buss cannot "
- "support the new configuration."
- ));
+ Gtk::MessageDialog msg (_("It is not possible to add a port here."));
msg.set_title (_("Cannot add port"));
msg.run ();
}
@@ -747,23 +745,31 @@ PortMatrix::can_remove_channels (boost::shared_ptr<Bundle> b) const
void
PortMatrix::remove_channel (ARDOUR::BundleChannel b)
{
+ std::string errmsg;
boost::shared_ptr<IO> io = io_from_bundle (b.bundle);
+ boost::shared_ptr<Port> p = io->nth (b.channel);
- if (io) {
- boost::shared_ptr<Port> p = io->nth (b.channel);
- if (p) {
- int const r = io->remove_port (p, this);
- if (r == -1) {
- ArdourDialog d (_("Port removal not allowed"));
- Label l (_("This port cannot be removed.\nEither the first plugin in the track or buss cannot accept\nthe new number of inputs or the last plugin has more outputs."));
- d.get_vbox()->pack_start (l);
- d.add_button (Stock::OK, RESPONSE_ACCEPT);
- d.set_modal (true);
- d.show_all ();
- d.run ();
- }
+ if (!io || !p) {
+ return;
+ }
+
+ if (io->n_ports ().n_total () == 1) {
+ errmsg = _("The last port cannot be removed");
+ } else {
+ if (-1 == io->remove_port (p, this)) {
+ errmsg = _("This port cannot be removed.");
}
}
+
+ if (!errmsg.empty ()) {
+ ArdourDialog d (_("Port removal not allowed"));
+ Label l (errmsg);
+ d.get_vbox()->pack_start (l);
+ d.add_button (Stock::OK, RESPONSE_ACCEPT);
+ d.set_modal (true);
+ d.show_all ();
+ d.run ();
+ }
}
void
diff --git a/gtk2_ardour/port_matrix_body.cc b/gtk2_ardour/port_matrix_body.cc
index 83864a6..24fb575 100644
--- a/gtk2_ardour/port_matrix_body.cc
+++ b/gtk2_ardour/port_matrix_body.cc
@@ -28,7 +28,7 @@
#include "port_matrix_row_labels.h"
#include "port_matrix_grid.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc
index cf591f8..4cf12b5 100644
--- a/gtk2_ardour/port_matrix_column_labels.cc
+++ b/gtk2_ardour/port_matrix_column_labels.cc
@@ -26,7 +26,7 @@
#include "port_matrix.h"
#include "port_matrix_body.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/gtk2_ardour/port_matrix_row_labels.cc b/gtk2_ardour/port_matrix_row_labels.cc
index 507e9fc..c6b02eb 100644
--- a/gtk2_ardour/port_matrix_row_labels.cc
+++ b/gtk2_ardour/port_matrix_row_labels.cc
@@ -27,7 +27,7 @@
#include "port_matrix_row_labels.h"
#include "port_matrix.h"
#include "port_matrix_body.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/gtk2_ardour/processor_box.bindings b/gtk2_ardour/processor_box.bindings
new file mode 100644
index 0000000..eb64457
--- /dev/null
+++ b/gtk2_ardour/processor_box.bindings
@@ -0,0 +1,6 @@
+<Bindings name="Processor Box">
+ <Press>
+ <Binding key="Delete" action="ProcessorMenu/delete"/>
+ <Binding key="BackSpace" action="ProcessorMenu/backspace"/>
+ </Press>
+</Bindings>
diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc
index 68beac4..3590c28 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -28,8 +28,10 @@
#include <sigc++/bind.h>
#include "pbd/convert.h"
+#include "canvas/utils.h"
#include <glibmm/miscutils.h>
+#include <glibmm/fileutils.h>
#include <gtkmm/messagedialog.h>
@@ -45,6 +47,8 @@
#include "ardour/audioengine.h"
#include "ardour/internal_return.h"
#include "ardour/internal_send.h"
+#include "ardour/luaproc.h"
+#include "ardour/luascripting.h"
#include "ardour/meter.h"
#include "ardour/panner_shell.h"
#include "ardour/plugin_insert.h"
@@ -57,14 +61,18 @@
#include "ardour/session.h"
#include "ardour/types.h"
+#include "LuaBridge/LuaBridge.h"
+
#include "actions.h"
#include "ardour_dialog.h"
#include "ardour_ui.h"
#include "gui_thread.h"
#include "io_selector.h"
#include "keyboard.h"
+#include "luainstance.h"
#include "mixer_ui.h"
#include "mixer_strip.h"
+#include "plugin_pin_dialog.h"
#include "plugin_selector.h"
#include "plugin_ui.h"
#include "port_insert_ui.h"
@@ -72,12 +80,13 @@
#include "public_editor.h"
#include "return_ui.h"
#include "route_processor_selection.h"
+#include "script_selector.h"
#include "send_ui.h"
#include "timers.h"
#include "tooltips.h"
#include "new_plugin_preset_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#ifdef AUDIOUNIT_SUPPORT
class AUPluginUI;
@@ -94,29 +103,54 @@ using namespace Gtk;
using namespace Glib;
using namespace Gtkmm2ext;
-ProcessorBox* ProcessorBox::_current_processor_box = 0;
+ProcessorBox* ProcessorBox::_current_processor_box = 0;
RefPtr<Action> ProcessorBox::paste_action;
RefPtr<Action> ProcessorBox::cut_action;
RefPtr<Action> ProcessorBox::copy_action;
RefPtr<Action> ProcessorBox::rename_action;
RefPtr<Action> ProcessorBox::delete_action;
+RefPtr<Action> ProcessorBox::backspace_action;
+RefPtr<Action> ProcessorBox::manage_pins_action;
RefPtr<Action> ProcessorBox::edit_action;
RefPtr<Action> ProcessorBox::edit_generic_action;
+RefPtr<ActionGroup> ProcessorBox::processor_box_actions;
+Gtkmm2ext::ActionMap ProcessorBox::myactions (X_("processor box"));
+Gtkmm2ext::Bindings* ProcessorBox::bindings = 0;
+
+
+// TODO consolidate with PluginPinDialog::set_color
+static void set_routing_color (cairo_t* cr, bool midi)
+{
+ static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
+ static const uint32_t midi_port_color = 0x960909FF; //Red
-static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
-static const uint32_t midi_port_color = 0x960909FF; //Red
+ if (midi) {
+ cairo_set_source_rgb (cr,
+ UINT_RGBA_R_FLT(midi_port_color),
+ UINT_RGBA_G_FLT(midi_port_color),
+ UINT_RGBA_B_FLT(midi_port_color));
+ } else {
+ cairo_set_source_rgb (cr,
+ UINT_RGBA_R_FLT(audio_port_color),
+ UINT_RGBA_G_FLT(audio_port_color),
+ UINT_RGBA_B_FLT(audio_port_color));
+ }
+}
ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processor> p, Width w)
: _button (ArdourButton::led_default_elements)
, _position (PreFader)
, _position_num(0)
+ , _parent (parent)
, _selectable(true)
, _unknown_processor(false)
- , _parent (parent)
, _processor (p)
, _width (w)
- , _input_icon(true)
- , _output_icon(false)
+ , input_icon(true)
+ , output_icon(false)
+ , routing_icon(true)
+ , output_routing_icon(false)
+ , _plugin_display(0)
{
_vbox.show ();
@@ -141,20 +175,41 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
}
if (_processor) {
- _vbox.pack_start (_routing_icon);
- _vbox.pack_start (_input_icon);
+ _vbox.pack_start (routing_icon);
+ _vbox.pack_start (input_icon);
_vbox.pack_start (_button, true, true);
- _vbox.pack_end (_output_icon);
- _button.set_active (_processor->active());
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_processor);
+ if (pi && pi->plugin() && pi->plugin()->has_inline_display()) {
+ if (pi->plugin()->get_info()->type != ARDOUR::Lua) {
+ _plugin_display = new PluginDisplay (*this, pi->plugin(),
+ std::max (60.f, rintf(112.f * UIConfiguration::instance().get_ui_scale())));
+ } else {
+ assert (boost::dynamic_pointer_cast<LuaProc>(pi->plugin()));
+ _plugin_display = new LuaPluginDisplay (*this, boost::dynamic_pointer_cast<LuaProc>(pi->plugin()),
+ std::max (60.f, rintf(112.f * UIConfiguration::instance().get_ui_scale())));
+ }
+ _vbox.pack_start (*_plugin_display);
+ _plugin_display->set_no_show_all (true);
+ if (UIConfiguration::instance().get_show_inline_display_by_default ()) {
+ _plugin_display->show ();
+ }
+ }
+ _vbox.pack_end (output_routing_icon);
+ _vbox.pack_end (output_icon);
+
+ _button.set_active (_processor->enabled ());
- _routing_icon.set_no_show_all(true);
- _input_icon.set_no_show_all(true);
+ input_icon.set_no_show_all(true);
+ routing_icon.set_no_show_all(true);
+ output_icon.set_no_show_all(true);
+ output_routing_icon.set_no_show_all(true);
_button.show ();
- _routing_icon.set_visible(false);
- _input_icon.hide();
- _output_icon.show();
+ input_icon.hide();
+ output_icon.show();
+ routing_icon.hide();
+ output_routing_icon.hide();
_processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context());
_processor->PropertyChanged.connect (name_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context());
@@ -181,12 +236,6 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
}
}
- _input_icon.set_ports(_processor->input_streams());
- _output_icon.set_ports(_processor->output_streams());
-
- _routing_icon.set_sources(_processor->input_streams());
- _routing_icon.set_sinks(_processor->output_streams());
-
setup_tooltip ();
setup_visuals ();
} else {
@@ -199,6 +248,7 @@ ProcessorEntry::~ProcessorEntry ()
for (list<Control*>::iterator i = _controls.begin(); i != _controls.end(); ++i) {
delete *i;
}
+ delete _plugin_display;
}
EventBox&
@@ -218,6 +268,40 @@ ProcessorEntry::drag_text () const
{
return name (Wide);
}
+
+bool
+ProcessorEntry::can_copy_state (Gtkmm2ext::DnDVBoxChild* o) const
+{
+ ProcessorEntry *other = dynamic_cast<ProcessorEntry*> (o);
+ if (!other) {
+ return false;
+ }
+ boost::shared_ptr<ARDOUR::Processor> otherproc = other->processor();
+ boost::shared_ptr<PluginInsert> my_pi = boost::dynamic_pointer_cast<PluginInsert> (_processor);
+ boost::shared_ptr<PluginInsert> ot_pi = boost::dynamic_pointer_cast<PluginInsert> (otherproc);
+ if (boost::dynamic_pointer_cast<UnknownProcessor> (_processor)) {
+ return false;
+ }
+ if (boost::dynamic_pointer_cast<UnknownProcessor> (otherproc)) {
+ return false;
+ }
+ if (!my_pi || !ot_pi) {
+ return false;
+ }
+ if (my_pi->type() != ot_pi->type()) {
+ return false;
+ }
+ boost::shared_ptr<Plugin> my_p = my_pi->plugin();
+ boost::shared_ptr<Plugin> ot_p = ot_pi->plugin();
+ if (!my_p || !ot_p) {
+ return false;
+ }
+ if (my_p->unique_id() != ot_p->unique_id()) {
+ return false;
+ }
+ return true;
+}
+
bool
ProcessorEntry::drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &data)
{
@@ -278,13 +362,6 @@ ProcessorEntry::set_position (Position p, uint32_t num)
{
_position = p;
_position_num = num;
-
- if (_position_num == 0 || _routing_icon.get_visible()) {
- _input_icon.show();
- } else {
- _input_icon.hide();
- }
-
setup_visuals ();
}
@@ -305,9 +382,17 @@ ProcessorEntry::setup_visuals ()
_button.set_name ("processor stub");
return;
}
+ boost::shared_ptr<Send> send;
+ if ((send = boost::dynamic_pointer_cast<Send> (_processor))) {
+ if (send->remove_on_disconnect ()) {
+ _button.set_name ("processor sidechain");
+ return;
+ }
+ }
switch (_position) {
case PreFader:
+ if (_plugin_display) { _plugin_display->set_name ("processor prefader"); }
_button.set_name ("processor prefader");
break;
@@ -316,6 +401,7 @@ ProcessorEntry::setup_visuals ()
break;
case PostFader:
+ if (_plugin_display) { _plugin_display->set_name ("processor postfader"); }
_button.set_name ("processor postfader");
break;
}
@@ -325,6 +411,9 @@ ProcessorEntry::setup_visuals ()
boost::shared_ptr<Processor>
ProcessorEntry::processor () const
{
+ if (!_processor) {
+ return boost::shared_ptr<Processor>();
+ }
return _processor;
}
@@ -351,11 +440,11 @@ ProcessorEntry::led_clicked(GdkEventButton *ev)
_parent->all_visible_processors_active(false);
if (_position == Fader) {
- _processor->deactivate ();
+ _processor->enable (false);
}
}
else {
- _processor->deactivate ();
+ _processor->enable (false);
}
} else {
@@ -363,11 +452,11 @@ ProcessorEntry::led_clicked(GdkEventButton *ev)
_parent->all_visible_processors_active(true);
if (_position == Fader) {
- _processor->activate ();
+ _processor->enable (true);
}
}
else {
- _processor->activate ();
+ _processor->enable (true);
}
}
}
@@ -377,7 +466,7 @@ void
ProcessorEntry::processor_active_changed ()
{
if (_processor) {
- _button.set_active (_processor->active());
+ _button.set_active (_processor->enabled ());
}
}
@@ -393,13 +482,11 @@ ProcessorEntry::processor_property_changed (const PropertyChange& what_changed)
void
ProcessorEntry::processor_configuration_changed (const ChanCount in, const ChanCount out)
{
- _input_icon.set_ports(in);
- _output_icon.set_ports(out);
- _routing_icon.set_sources(in);
- _routing_icon.set_sinks(out);
- _input_icon.queue_draw();
- _output_icon.queue_draw();
- _routing_icon.queue_draw();
+ _parent->setup_routing_feeds ();
+ input_icon.queue_draw();
+ output_icon.queue_draw();
+ routing_icon.queue_draw();
+ output_routing_icon.queue_draw();
}
void
@@ -427,6 +514,16 @@ ProcessorEntry::setup_tooltip ()
string_compose (_("<b>%1</b>\nThe Plugin is not available on this system\nand has been replaced by a stub."), name (Wide)));
return;
}
+ boost::shared_ptr<Send> send;
+ if ((send = boost::dynamic_pointer_cast<Send> (_processor)) != 0 &&
+ !boost::dynamic_pointer_cast<InternalSend>(_processor)) {
+ if (send->remove_on_disconnect ()) {
+ ARDOUR_UI_UTILS::set_tooltip (_button, string_compose ("<b>> %1</b>\nThis (sidechain) send will be removed when disconnected.", _processor->name()));
+ } else {
+ ARDOUR_UI_UTILS::set_tooltip (_button, string_compose ("<b>> %1</b>", _processor->name()));
+ }
+ return;
+ }
}
ARDOUR_UI_UTILS::set_tooltip (_button, string_compose ("<b>%1</b>", name (Wide)));
}
@@ -445,19 +542,52 @@ ProcessorEntry::name (Width w) const
!boost::dynamic_pointer_cast<InternalSend>(_processor)) {
name_display += '>';
+ std::string send_name;
+ bool pretty_ok = true;
+
+ if (send->remove_on_disconnect ()) {
+ // assume it's a sidechain, find pretty name of connected port(s)
+ PortSet& ps (send->output ()->ports ());
+ for (PortSet::iterator i = ps.begin (); i != ps.end () && pretty_ok; ++i) {
+ vector<string> connections;
+ if (i->get_connections (connections)) {
+ vector<string>::const_iterator ci;
+ for (ci = connections.begin(); ci != connections.end(); ++ci) {
+ std::string pn = AudioEngine::instance()->get_pretty_name_by_name (*ci);
+ if (pn.empty ()) {
+ continue;
+ }
+ if (send_name.empty ()) {
+ send_name = pn;
+ } else if (send_name != pn) {
+ // pretty names don't match
+ pretty_ok = false;
+ break;
+ }
+ }
+ }
+ }
+ }
- /* grab the send name out of its overall name */
+ if (!pretty_ok) {
+ send_name = "";
+ }
- string::size_type lbracket, rbracket;
- lbracket = send->name().find ('[');
- rbracket = send->name().find (']');
+ /* grab the send name out of its overall name */
+ if (send_name.empty()) {
+ send_name = send->name();
+ string::size_type lbracket, rbracket;
+ lbracket = send_name.find ('[');
+ rbracket = send_name.find (']');
+ send_name = send_name.substr (lbracket+1, lbracket-rbracket-1);
+ }
switch (w) {
case Wide:
- name_display += send->name().substr (lbracket+1, lbracket-rbracket-1);
+ name_display += send_name;
break;
case Narrow:
- name_display += PBD::short_version (send->name().substr (lbracket+1, lbracket-rbracket-1), 4);
+ name_display += PBD::short_version (send_name, 5);
break;
}
@@ -510,6 +640,13 @@ ProcessorEntry::add_control_state (XMLNode* node) const
for (list<Control*>::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
(*i)->add_state (node);
}
+
+ if (_plugin_display) {
+ XMLNode* c = new XMLNode (X_("Object"));
+ c->add_property (X_("id"), X_("InlineDisplay"));
+ c->add_property (X_("visible"), _plugin_display->is_visible ());
+ node->add_child_nocopy (*c);
+ }
}
void
@@ -518,6 +655,18 @@ ProcessorEntry::set_control_state (XMLNode const * node)
for (list<Control*>::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
(*i)->set_state (node);
}
+
+ if (_plugin_display) {
+ XMLNode* n = GUIObjectState::get_node (node, X_("InlineDisplay"));
+ XMLProperty const * p = n ? n->property (X_("visible")) : NULL;
+ if (p) {
+ if (string_is_affirmative (p->value ())) {
+ _plugin_display->show();
+ } else {
+ _plugin_display->hide();
+ }
+ }
+ }
}
string
@@ -542,6 +691,14 @@ ProcessorEntry::build_controls_menu ()
Menu* menu = manage (new Menu);
MenuList& items = menu->items ();
+ if (_plugin_display) {
+ items.push_back (CheckMenuElem (_("Inline Display")));
+ Gtk::CheckMenuItem* c = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+ c->set_active (_plugin_display->is_visible ());
+ c->signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::toggle_inline_display_visibility));
+ items.push_back (SeparatorElem ());
+ }
+
items.push_back (
MenuElem (_("Show All Controls"), sigc::mem_fun (*this, &ProcessorEntry::show_all_controls))
);
@@ -565,6 +722,17 @@ ProcessorEntry::build_controls_menu ()
}
void
+ProcessorEntry::toggle_inline_display_visibility ()
+{
+ if (_plugin_display->is_visible ()) {
+ _plugin_display->hide();
+ } else {
+ _plugin_display->show();
+ }
+ _parent->update_gui_object_state (this);
+}
+
+void
ProcessorEntry::toggle_control_visibility (Control* c)
{
c->set_visible (!c->visible ());
@@ -780,7 +948,7 @@ ProcessorEntry::Control::set_state (XMLNode const * node)
{
XMLNode* n = GUIObjectState::get_node (node, state_id ());
if (n) {
- XMLProperty* p = n->property (X_("visible"));
+ XMLProperty const * p = n->property (X_("visible"));
set_visible (p && string_is_affirmative (p->value ()));
} else {
set_visible (false);
@@ -824,94 +992,28 @@ PluginInsertProcessorEntry::PluginInsertProcessorEntry (ProcessorBox* b, boost::
, _plugin_insert (p)
{
p->PluginIoReConfigure.connect (
- _splitting_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::plugin_insert_splitting_changed, this), gui_context()
+ _iomap_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::iomap_changed, this), gui_context()
+ );
+ p->PluginMapChanged.connect (
+ _iomap_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::iomap_changed, this), gui_context()
+ );
+ p->PluginConfigChanged.connect (
+ _iomap_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::iomap_changed, this), gui_context()
);
-
- plugin_insert_splitting_changed ();
}
void
-PluginInsertProcessorEntry::plugin_insert_splitting_changed ()
+PluginInsertProcessorEntry::iomap_changed ()
{
- ChanCount in, out; // actual configured i/o
- _plugin_insert->configured_io (in, out);
-
- /* get number of input ports */
- ChanCount sinks = _plugin_insert->natural_input_streams();
- if (!_plugin_insert->splitting () && _plugin_insert->get_count() > 1) {
- /* replicated instances */
- for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
- sinks.set(*t, sinks.get(*t) * _plugin_insert->get_count());
- }
- }
- /* MIDI bypass */
- if (_plugin_insert->natural_output_streams().n_midi() == 0 &&
- _plugin_insert->output_streams().n_midi() == 1) {
- in.set(DataType::MIDI, 1);
- out.set(DataType::MIDI, 1);
- sinks.set(DataType::MIDI, 1);
- }
-
- /* the Input streams available (*valid* outputs from prev. plugin)
- * this will be <= sinks. Some input-ports of this processor
- * may be unconnected.
- */
- _routing_icon.set_sources(in);
-
- /* the actual input ports of this processor */
- _input_icon.set_ports(sinks);
- _routing_icon.set_sinks(sinks);
-
- /* set/override plugin-output ports to actual outputs-streams.
- *
- * This plugin may have unconnected output-ports (currently only in Mixbus,
- * e.g channelstrip-EQ at the top of a MIDI-channel before the synth).
- *
- * The *next* processor below this one will only see the
- * actual available streams (it cannot know the real outputs
- * of this plugin).
- *
- * There is currently no API to query the ports of the previous (or next)
- * processor.
- *
- * (normally - iff configuration succeeds - this is set during
- * ProcessorEntry::processor_configuration_changed() and should
- * equal _plugin_insert->output_streams())
- */
- _output_icon.set_ports(out);
-#ifndef NDEBUG
- if (out != _plugin_insert->output_streams()) {
- std::cerr << "Processor Wiring: " << processor()->name()
- << " out-ports: " << _plugin_insert->output_streams() // NB. does not include midi-bypass
- << " out-connections: " << out
- << endmsg;
- }
-#endif
-
- _routing_icon.set_splitting(_plugin_insert->splitting ());
-
- if (_plugin_insert->splitting () || in != sinks)
- {
- _routing_icon.set_size_request (-1, std::max (7.f, rintf(7.f * UIConfiguration::instance().get_ui_scale())));
- _routing_icon.set_visible(true);
- _input_icon.show();
- } else {
- _routing_icon.set_visible(false);
- if (_position_num != 0) {
- _input_icon.hide();
- }
- }
-
- _input_icon.queue_draw();
- _output_icon.queue_draw();
- _routing_icon.queue_draw();
+ _parent->setup_routing_feeds ();
+ routing_icon.queue_draw();
+ output_routing_icon.queue_draw();
}
void
PluginInsertProcessorEntry::hide_things ()
{
ProcessorEntry::hide_things ();
- plugin_insert_splitting_changed ();
}
ProcessorEntry::PortIcon::PortIcon(bool input) {
@@ -939,45 +1041,224 @@ ProcessorEntry::PortIcon::on_expose_event (GdkEventExpose* ev)
cairo_fill (cr);
const double dx = rint(max(2., 2. * UIConfiguration::instance().get_ui_scale()));
- if (_ports.n_total() > 1) {
- for (uint32_t i = 0; i < _ports.n_total(); ++i) {
- if (i < _ports.n_midi()) {
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(midi_port_color),
- UINT_RGBA_G_FLT(midi_port_color),
- UINT_RGBA_B_FLT(midi_port_color));
- } else {
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(audio_port_color),
- UINT_RGBA_G_FLT(audio_port_color),
- UINT_RGBA_B_FLT(audio_port_color));
- }
- const float x = rintf(width * (.2f + .6f * i / (_ports.n_total() - 1.f)));
- cairo_rectangle (cr, x-dx * .5, 0, 1+dx, height);
- cairo_fill(cr);
- }
- } else if (_ports.n_total() == 1) {
- if (_ports.n_midi() == 1) {
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(midi_port_color),
- UINT_RGBA_G_FLT(midi_port_color),
- UINT_RGBA_B_FLT(midi_port_color));
- } else {
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(audio_port_color),
- UINT_RGBA_G_FLT(audio_port_color),
- UINT_RGBA_B_FLT(audio_port_color));
- }
- const float x = rintf(width * .5);
- cairo_rectangle (cr, x-dx * .5, 0, 1+dx, height);
+ for (uint32_t i = 0; i < _ports.n_total(); ++i) {
+ set_routing_color (cr, i < _ports.n_midi());
+ const double x = ProcessorEntry::RoutingIcon::pin_x_pos (i, width, _ports.n_total(), 0 , false);
+ cairo_rectangle (cr, x - .5 - dx * .5, 0, 1 + dx, height);
cairo_fill(cr);
- cairo_stroke(cr);
}
cairo_destroy(cr);
return true;
}
+ProcessorEntry::RoutingIcon::RoutingIcon (bool input)
+ : _fed_by (false)
+ , _input (input)
+{
+ set_terminal (false);
+}
+
+void
+ProcessorEntry::RoutingIcon::set_terminal (bool b) {
+ _terminal = b;
+ int h = std::max (8.f, rintf(8.f * sqrt (UIConfiguration::instance().get_ui_scale())));
+ if (_terminal) {
+ h += std::max (4.f, rintf(4.f * sqrt (UIConfiguration::instance().get_ui_scale())));
+ }
+ set_size_request (-1, h);
+}
+
+void
+ProcessorEntry::RoutingIcon::set (
+ const ARDOUR::ChanCount& in,
+ const ARDOUR::ChanCount& out,
+ const ARDOUR::ChanCount& sinks,
+ const ARDOUR::ChanCount& sources,
+ const ARDOUR::ChanMapping& in_map,
+ const ARDOUR::ChanMapping& out_map,
+ const ARDOUR::ChanMapping& thru_map)
+{
+ _in = in;
+ _out = out;
+ _sources = sources;
+ _sinks = sinks;
+ _in_map = in_map;
+ _out_map = out_map;
+ _thru_map = thru_map;
+}
+
+bool
+ProcessorEntry::RoutingIcon::in_identity () const {
+ if (_thru_map.n_total () > 0) {
+ return false;
+ }
+ if (!_in_map.is_monotonic () || !_in_map.is_identity ()) {
+ return false;
+ }
+ if (_in_map.n_total () != _sinks.n_total () || _in.n_total () != _sinks.n_total ()) {
+ return false;
+ }
+ return true;
+}
+
+bool
+ProcessorEntry::RoutingIcon::out_identity () const {
+ if (_thru_map.n_total () > 0) {
+ // TODO skip if trhu is not connected to any of next's inputs
+ return false;
+ }
+ if (!_out_map.is_monotonic () || !_out_map.is_identity ()) {
+ return false;
+ }
+ if (_out_map.n_total () != _sources.n_total () || _out.n_total () != _sources.n_total ()) {
+ return false;
+ }
+ return true;
+}
+
+bool
+ProcessorEntry::RoutingIcon::can_coalesce () const {
+ if (_thru_map.n_total () > 0) {
+ return false;
+ }
+ if (_fed_by && _f_out != _f_sources) {
+ return false;
+ }
+ if (_fed_by && !_f_out_map.is_identity () && !_in_map.is_identity ()) {
+ return false;
+ }
+ if (_input && _sinks == _in && (!_fed_by || _f_out == _in)) {
+ return true;
+ }
+ return false;
+}
+
+void
+ProcessorEntry::RoutingIcon::set_fed_by (
+ const ARDOUR::ChanCount& out,
+ const ARDOUR::ChanCount& sources,
+ const ARDOUR::ChanMapping& out_map,
+ const ARDOUR::ChanMapping& thru_map)
+{
+ _f_out = out;
+ _f_sources = sources;
+ _f_out_map = out_map;
+ _f_thru_map = thru_map;
+ _fed_by = true;
+}
+
+void
+ProcessorEntry::RoutingIcon::set_feeding (
+ const ARDOUR::ChanCount& in,
+ const ARDOUR::ChanCount& sinks,
+ const ARDOUR::ChanMapping& in_map,
+ const ARDOUR::ChanMapping& thru_map)
+{
+ _i_in = in;
+ _i_sinks = sinks;
+ _i_in_map = in_map;
+ _i_thru_map = thru_map;
+ _feeding = true;
+}
+
+double
+ProcessorEntry::RoutingIcon::pin_x_pos (uint32_t i, double width, uint32_t n_total, uint32_t n_midi, bool midi)
+{
+ if (!midi) { i += n_midi; }
+ if (n_total == 1) {
+ assert (i == 0);
+ return rint (width * .5) +.5;
+ }
+ return rint (width * (.15 + .7 * i / (n_total - 1))) + .5;
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_gnd (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+ const double dx = 1 + rint (max(2., 2. * UIConfiguration::instance().get_ui_scale()));
+ const double y1 = rint (height * .66) + .5;
+
+ cairo_save (cr);
+ cairo_translate (cr, x0, y0);
+ cairo_move_to (cr, 0, height);
+ cairo_line_to (cr, 0, y1);
+ cairo_move_to (cr, 0 - dx, y1);
+ cairo_line_to (cr, 0 + dx, y1);
+
+ set_routing_color (cr, midi);
+ cairo_set_line_width (cr, 1.0);
+ cairo_stroke (cr);
+ cairo_restore (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_sidechain (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+ const double dx = 1 + rint (max(2., 2. * UIConfiguration::instance().get_ui_scale()));
+ const double y1 = rint (height * .5) - .5;
+
+ cairo_save (cr);
+ cairo_translate (cr, x0, y0);
+ cairo_move_to (cr, 0 - dx, height);
+ cairo_line_to (cr, 0, y1);
+ cairo_line_to (cr, 0 + dx, height);
+ cairo_close_path (cr);
+
+ set_routing_color (cr, midi);
+ cairo_fill (cr);
+ cairo_restore (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_thru_src (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+ const double rad = 1;
+ const double y1 = height - rad - 1.5;
+
+ cairo_arc (cr, x0, y0 + y1, rad, 0, 2. * M_PI);
+ cairo_move_to (cr, x0, y0 + height - 1.5);
+ cairo_line_to (cr, x0, y0 + height);
+ set_routing_color (cr, midi);
+ cairo_set_line_width (cr, 1.0);
+ cairo_stroke (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_thru_sink (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+ const double rad = 1;
+ const double y1 = rad + 1;
+
+ cairo_arc (cr, x0, y0 + y1, rad, 0, 2. * M_PI);
+ cairo_move_to (cr, x0, y0);
+ cairo_line_to (cr, x0, y0 + 1);
+ set_routing_color (cr, midi);
+ cairo_set_line_width (cr, 1.0);
+ cairo_stroke (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool dashed)
+{
+ double bz = abs (y1 - y0);
+
+ cairo_move_to (cr, x0, y0);
+ cairo_curve_to (cr, x0, y0 + bz, x1, y1 - bz, x1, y1);
+ cairo_set_line_width (cr, 1.0);
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+ cairo_set_source_rgb (cr, 1, 0, 0);
+ if (dashed) {
+ const double dashes[] = { 2, 3 };
+ cairo_set_dash (cr, dashes, 2, 0);
+ }
+ set_routing_color (cr, midi);
+ cairo_stroke (cr);
+ if (dashed) {
+ cairo_set_dash (cr, 0, 0, 0);
+ }
+}
+
bool
ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
{
@@ -986,7 +1267,6 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
cairo_clip (cr);
- cairo_set_line_width (cr, max (1.f, UIConfiguration::instance().get_ui_scale()));
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
Gtk::Allocation a = get_allocation();
@@ -999,115 +1279,471 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
cairo_rectangle (cr, 0, 0, width, height);
cairo_fill (cr);
- Gdk::Color const fg = get_style()->get_fg (STATE_NORMAL);
- cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ());
-
- const uint32_t sources = _sources.n_total();
- const uint32_t sinks = _sinks.n_total();
-
- const uint32_t midi_sources = _sources.n_midi();
- const uint32_t midi_sinks = _sinks.n_midi();
- const uint32_t audio_sources = _sources.n_audio();
- const uint32_t audio_sinks = _sinks.n_audio();
-
- /* MIDI */
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(midi_port_color),
- UINT_RGBA_G_FLT(midi_port_color),
- UINT_RGBA_B_FLT(midi_port_color));
- if (midi_sources > 0 && midi_sinks > 0 && sinks > 1 && sources > 1) {
- for (uint32_t i = 0 ; i < midi_sources; ++i) {
- const float si_x = rintf(width * (.2f + .6f * i / (sinks - 1.f))) + .5f;
- const float si_x0 = rintf(width * (.2f + .6f * i / (sources - 1.f))) + .5f;
- cairo_move_to (cr, si_x, height);
- cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
- cairo_stroke (cr);
+ if (_input) {
+ if (can_coalesce ()) {
+ expose_coalesced_input_map (cr, width, height);
+ } else {
+ expose_input_map (cr, width, height);
}
- } else if (midi_sources == 1 && midi_sinks == 1 && sinks == 1 && sources == 1) {
- const float si_x = rintf(width * .5f) + .5f;
- cairo_move_to (cr, si_x, height);
- cairo_line_to (cr, si_x, 0);
- cairo_stroke (cr);
- } else if (midi_sources == 1 && midi_sinks == 1) {
- /* unusual cases -- removed synth, midi-track w/audio plugins */
- const float si_x = rintf(width * (sinks > 1 ? .2f : .5f)) + .5f;
- const float si_x0 = rintf(width * (sources > 1 ? .2f : .5f)) + .5f;
- cairo_move_to (cr, si_x, height);
- cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
- cairo_stroke (cr);
- } else if (midi_sources == 0 && midi_sinks == 1) {
- const double dx = 1 + rint(max(2., 2. * UIConfiguration::instance().get_ui_scale()));
- // draw "T"
- // TODO connect back to track-input of last midi-out if any, otherwise draw "X"
- const float si_x = rintf(width * .2f) + .5f;
- cairo_move_to (cr, si_x, height);
- cairo_line_to (cr, si_x, height * .66);
- cairo_move_to (cr, si_x - dx, height * .66);
- cairo_line_to (cr, si_x + dx, height * .66);
- cairo_stroke (cr);
-#ifndef NDEBUG
- } else if (midi_sources != 0 && midi_sinks != 0) {
- PBD::warning << string_compose("Programming error: midi routing display: A %1 -> %2 | M %3 -> %4 | T %5 -> %6",
- audio_sources, audio_sinks, midi_sources, midi_sinks, sources, sinks) << endmsg;
-#endif
+ } else {
+ expose_output_map (cr, width, height);
}
- /* AUDIO */
- cairo_set_source_rgb (cr,
- UINT_RGBA_R_FLT(audio_port_color),
- UINT_RGBA_G_FLT(audio_port_color),
- UINT_RGBA_B_FLT(audio_port_color));
-
- if (_splitting) {
- assert(audio_sources < 2);
- assert(audio_sinks > 1);
- /* assume there is only ever one MIDI port */
- const float si_x0 = rintf(width * (midi_sources > 0 ? .8f : .5f)) + .5f;
- for (uint32_t i = midi_sinks; i < sinks; ++i) {
- const float si_x = rintf(width * (.2f + .6f * i / (sinks - 1.f))) + .5f;
- cairo_move_to (cr, si_x, height);
- cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
- cairo_stroke (cr);
+ cairo_destroy(cr);
+ return true;
+}
+
+void
+ProcessorEntry::RoutingIcon::expose_coalesced_input_map (cairo_t* cr, const double width, const double height)
+{
+ const uint32_t pc_in = _sinks.n_total();
+ const uint32_t pc_in_midi = _sinks.n_midi();
+
+ for (uint32_t i = 0; i < pc_in; ++i) {
+ const bool is_midi = i < pc_in_midi;
+ bool valid_in;
+ uint32_t pn = is_midi ? i : i - pc_in_midi;
+ DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+ uint32_t idx = _in_map.get (dt, pn, &valid_in);
+ if (!valid_in) {
+ double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+ draw_gnd (cr, x, 0, height, is_midi);
+ continue;
}
- } else if (audio_sources > 1 && sinks > 1) {
- for (uint32_t i = 0 ; i < audio_sources; ++i) {
- const float si_x = rintf(width * (.2f + .6f * (i + midi_sinks) / (sinks - 1.f))) + .5f;
- const float si_x0 = rintf(width * (.2f + .6f * (i + midi_sources) / (sources - 1.f))) + .5f;
- cairo_move_to (cr, si_x, height);
- cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
- cairo_stroke (cr);
+ if (idx >= _in.get (dt)) {
+ // side-chain, probably
+ double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+ draw_sidechain (cr, x, 0, height, is_midi);
+ continue;
}
- } else if (audio_sources == 1 && audio_sinks > 0) {
- float si_x, si_x0;
- if (sinks == 1) {
- si_x = rintf(width * .5f) + .5f;
+ double c_x0;
+ double c_x1 = pin_x_pos (i, width, pc_in, 0, false);
+
+ if (_fed_by) {
+ bool valid_src;
+ uint32_t src = _f_out_map.get_src (dt, idx, &valid_src);
+ if (!valid_src) {
+ double x = pin_x_pos (i, width, pc_in, 0, false);
+ bool valid_thru;
+ _f_thru_map.get (dt, idx, &valid_thru);
+ if (valid_thru) {
+ draw_thru_src (cr, x, 0, height, is_midi);
+ } else {
+ draw_gnd (cr, x, 0, height, is_midi);
+ }
+ continue;
+ }
+ c_x0 = pin_x_pos (src, width, _f_sources.n_total(), _f_sources.n_midi(), is_midi);
} else {
- si_x = rintf(width * (.2f + .6f * midi_sinks / (sinks - 1.f))) + .5f;
+ c_x0 = pin_x_pos (idx, width, _in.n_total(), _in.n_midi(), is_midi);
+ }
+ draw_connection (cr, c_x0, c_x1, 0, height, is_midi);
+ }
+}
+
+void
+ProcessorEntry::RoutingIcon::expose_input_map (cairo_t* cr, const double width, const double height)
+{
+ const uint32_t n_in = _in.n_total();
+ const uint32_t n_in_midi = _in.n_midi();
+ const uint32_t pc_in = _sinks.n_total();
+ const uint32_t pc_in_midi = _sinks.n_midi();
+
+ // draw inputs to this
+ for (uint32_t i = 0; i < pc_in; ++i) {
+ const bool is_midi = i < pc_in_midi;
+ bool valid_in;
+ uint32_t pn = is_midi ? i : i - pc_in_midi;
+ DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+ uint32_t idx = _in_map.get (dt, pn, &valid_in);
+ // check if it's fed
+ bool valid_src = true;
+ if (valid_in && idx < _in.get (dt) && _fed_by) {
+ bool valid_out;
+ bool valid_thru;
+ _f_out_map.get_src (dt, idx, &valid_out);
+ _f_thru_map.get (dt, idx, &valid_thru);
+ if (!valid_out && !valid_thru) {
+ valid_src = false;
+ }
+ }
+ if (!valid_in || !valid_src) {
+ double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+ draw_gnd (cr, x, 0, height, is_midi);
+ continue;
+ }
+ if (idx >= _in.get (dt)) {
+ // side-chain, probably
+ double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+ draw_sidechain (cr, x, 0, height, is_midi);
+ continue;
+ }
+ double c_x1 = pin_x_pos (i, width, pc_in, 0, false);
+ double c_x0 = pin_x_pos (idx, width, n_in, n_in_midi, is_midi);
+ draw_connection (cr, c_x0, c_x1, 0, height, is_midi);
+ }
+
+ // draw reverse thru
+ for (uint32_t i = 0; i < n_in; ++i) {
+ const bool is_midi = i < n_in_midi;
+ bool valid_thru;
+ uint32_t pn = is_midi ? i : i - n_in_midi;
+ DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+ _thru_map.get_src (dt, pn, &valid_thru);
+ if (!valid_thru) {
+ continue;
}
- if (sources == 1) {
- si_x0 = rintf(width * .5f) + .5f;
+ double x = pin_x_pos (i, width, n_in, 0, is_midi);
+ draw_thru_sink (cr, x, 0, height, is_midi);
+ }
+}
+
+void
+ProcessorEntry::RoutingIcon::expose_output_map (cairo_t* cr, const double width, const double height)
+{
+ int dh = std::max (4.f, rintf(4.f * UIConfiguration::instance().get_ui_scale()));
+ double ht = _terminal ? height - dh : height;
+
+ // draw outputs of this
+ const uint32_t pc_out = _sources.n_total();
+ const uint32_t pc_out_midi = _sources.n_midi();
+ const uint32_t n_out = _out.n_total();
+ const uint32_t n_out_midi = _out.n_midi();
+
+ for (uint32_t i = 0; i < pc_out; ++i) {
+ const bool is_midi = i < pc_out_midi;
+ bool valid_out;
+ uint32_t pn = is_midi ? i : i - pc_out_midi;
+ DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+ uint32_t idx = _out_map.get (dt, pn, &valid_out);
+ if (!valid_out) {
+ continue;
+ }
+ // skip connections that are not used in the next's input
+ if (_feeding) {
+ bool valid_thru, valid_sink;
+ _i_in_map.get_src (dt, idx, &valid_sink);
+ _i_thru_map.get_src (dt, idx, &valid_thru);
+ if (!valid_thru && !valid_sink) {
+ if (!is_midi || i != 0) { // special case midi-bypass
+ continue;
+ }
+ }
+ }
+ double c_x0 = pin_x_pos (i, width, pc_out, 0, false);
+ double c_x1 = pin_x_pos (idx, width, n_out, n_out_midi, is_midi);
+ draw_connection (cr, c_x0, c_x1, 0, ht, is_midi);
+ }
+
+ for (uint32_t i = 0; i < n_out; ++i) {
+ const bool is_midi = i < n_out_midi;
+ uint32_t pn = is_midi ? i : i - n_out_midi;
+ DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+ double x = pin_x_pos (i, width, n_out, 0, is_midi);
+
+ if (!_terminal) {
+ bool valid_thru_f = false;
+ // skip connections that are not used in the next's input
+ if (_feeding) {
+ bool valid_sink;
+ _i_in_map.get_src (dt, pn, &valid_sink);
+ _i_thru_map.get_src (dt, pn, &valid_thru_f);
+ if (!valid_thru_f && !valid_sink) {
+ if (!is_midi || i != 0) { // special case midi-bypass
+ continue;
+ }
+ }
+ }
+
+ bool valid_src;
+ _out_map.get_src (dt, pn, &valid_src);
+ if (!valid_src) {
+ bool valid_thru;
+ uint32_t idx = _thru_map.get (dt, pn, &valid_thru);
+ if (valid_thru) {
+ if (idx >= _in.get (dt)) {
+ draw_sidechain (cr, x, 0, height, is_midi);
+ } else {
+ draw_thru_src (cr, x, 0, height, is_midi);
+ }
+ } else if (valid_thru_f){
+ // gnd is part of input, unless it's a thru input
+ // (also only true if !coalesced into one small display)
+ draw_gnd (cr, x, 0, height, is_midi);
+ }
+ }
} else {
- si_x0 = rintf(width * (.2f + .6f * midi_sources / (sources - 1.f))) + .5f;
+ // terminal node, add arrows
+ bool valid_src;
+ _out_map.get_src (dt, pn, &valid_src);
+ if (!valid_src) {
+ bool valid_thru;
+ uint32_t idx = _thru_map.get (dt, pn, &valid_thru);
+ if (valid_thru) {
+ if (idx >= _in.get (dt)) {
+ draw_sidechain (cr, x, 0, height - dh, is_midi);
+ } else {
+ draw_thru_src (cr, x, 0, height - dh, is_midi);
+ }
+ } else {
+ draw_gnd (cr, x, 0, height - dh, is_midi);
+ }
+ }
+
+ set_routing_color (cr, is_midi);
+ cairo_set_line_width (cr, 1.0);
+ cairo_move_to (cr, x, height - dh);
+ cairo_line_to (cr, x, height - 2);
+ cairo_stroke (cr);
+
+ const double ar = dh - 1;
+ cairo_move_to (cr, x - ar, height - ar);
+ cairo_line_to (cr, x , height - .5);
+ cairo_line_to (cr, x + ar, height - ar);
+ cairo_line_to (cr, x , height - ar * .5);
+ cairo_close_path (cr);
+ cairo_fill_preserve (cr);
+ cairo_stroke (cr);
}
- cairo_move_to (cr, si_x, height);
- cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
- cairo_stroke (cr);
-#ifndef NDEBUG
- } else if (audio_sources != 0 && audio_sinks != 0) {
- PBD::warning << string_compose("Programming error: audio routing display: A %1 -> %2 | M %3 -> %4 | T %5 -> %6",
- audio_sources, audio_sinks, midi_sources, midi_sinks, sources, sinks) << endmsg;
-#endif
}
+}
+
+ProcessorEntry::PluginDisplay::PluginDisplay (ProcessorEntry& e, boost::shared_ptr<ARDOUR::Plugin> p, uint32_t max_height)
+ : _entry (e)
+ , _plug (p)
+ , _surf (0)
+ , _max_height (max_height)
+ , _cur_height (1)
+ , _scroll (false)
+{
+ set_name ("processor prefader");
+ add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+ _plug->DropReferences.connect (_death_connection, invalidator (*this), boost::bind (&PluginDisplay::plugin_going_away, this), gui_context());
+ _plug->QueueDraw.connect (_qdraw_connection, invalidator (*this),
+ boost::bind (&Gtk::Widget::queue_draw, this), gui_context ());
+
+ std::string postfix = "";
+ if (_plug->has_editor()) {
+ ARDOUR_UI_UTILS::set_tooltip (*this,
+ string_compose (_("<b>%1</b>\nDouble-click to show GUI.\n%2+double-click to show generic GUI.%3"), e.name (Wide), Keyboard::primary_modifier_name (), postfix));
+ } else {
+ ARDOUR_UI_UTILS::set_tooltip (*this,
+ string_compose (_("<b>%1</b>\nDouble-click to show generic GUI.%2"), e.name (Wide), postfix));
+ }
+}
+
+ProcessorEntry::PluginDisplay::~PluginDisplay ()
+{
+ if (_surf) {
+ cairo_surface_destroy (_surf);
+ }
+}
+
+bool
+ProcessorEntry::PluginDisplay::on_button_press_event (GdkEventButton *ev)
+{
+ assert (_entry.processor ());
+
+ // consider some tweaks to pass this up to the DnDVBox somehow:
+ // select processor, then call (private)
+ //_entry._parent->processor_button_press_event (ev, &_entry);
+ if (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS)) {
+ if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
+ _entry._parent->generic_edit_processor (_entry.processor ());
+ } else {
+ _entry._parent->edit_processor (_entry.processor ());
+ }
+ return true;
+ }
+ return false;
+}
+
+bool
+ProcessorEntry::PluginDisplay::on_button_release_event (GdkEventButton *ev)
+{
+ return false;
+}
+
+void
+ProcessorEntry::PluginDisplay::on_size_request (Requisition* req)
+{
+ req->width = 56;
+ req->height = _cur_height;
+}
+
+
+void
+ProcessorEntry::PluginDisplay::update_height_alloc (uint32_t inline_height)
+{
+ /* work-around scroll-bar + aspect ratio
+ * show inline-view -> height changes -> scrollbar gets added
+ * -> width changes -> inline-view, fixed aspect ratio -> height changes
+ * -> scroll bar is removed [-> width changes ; repeat ]
+ */
+ uint32_t shm = std::min (_max_height, inline_height);
+ bool sc = false;
+ Gtk::Container* pr = get_parent();
+ for (uint32_t i = 0; i < 4 && pr; ++i) {
+ // VBox, EventBox, ViewPort, ScrolledWindow
+ pr = pr->get_parent();
+ }
+ Gtk::ScrolledWindow* sw = dynamic_cast<Gtk::ScrolledWindow*> (pr);
+ if (sw) {
+ const Gtk::VScrollbar* vsb = sw->get_vscrollbar();
+ sc = vsb && vsb->is_visible();
+ }
+
+ if (shm != _cur_height) {
+ if (_scroll == sc || _cur_height < shm) {
+ queue_resize ();
+ }
+ _cur_height = shm;
+ }
+ _scroll = sc;
+}
+
+uint32_t
+ProcessorEntry::PluginDisplay::render_inline (cairo_t* cr, uint32_t width)
+{
+ Plugin::Display_Image_Surface* dis = _plug->render_inline_display (width, _max_height);
+ if (!dis) {
+ return 0;
+ }
+
+ /* allocate a local image-surface,
+ * We cannot re-use the data via cairo_image_surface_create_for_data(),
+ * since pixman keeps a reference to it.
+ * we'd need to hand over the data and ha cairo_surface_destroy to free it.
+ * it might be possible to work around via cairo_surface_set_user_data().
+ */
+ if (!_surf
+ || dis->width != cairo_image_surface_get_width (_surf)
+ || dis->height != cairo_image_surface_get_height (_surf)
+ ) {
+ if (_surf) {
+ cairo_surface_destroy (_surf);
+ }
+ _surf = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, dis->width, dis->height);
+ }
+
+ if (cairo_image_surface_get_stride (_surf) == dis->stride) {
+ memcpy (cairo_image_surface_get_data (_surf), dis->data, dis->stride * dis->height);
+ } else {
+ unsigned char *src = dis->data;
+ unsigned char *dst = cairo_image_surface_get_data (_surf);
+ const int dst_stride = cairo_image_surface_get_stride (_surf);
+ for (int y = 0; y < dis->height; ++y) {
+ memcpy (dst, src, dis->width * 4 /*ARGB32*/);
+ src += dis->stride;
+ dst += dst_stride;
+ }
+ }
+
+ cairo_surface_flush(_surf);
+ cairo_surface_mark_dirty(_surf);
+ const double xc = floor ((width - dis->width) * .5);
+ cairo_set_source_surface(cr, _surf, xc, 0);
+ cairo_paint (cr);
+
+ return dis->height;
+}
+
+bool
+ProcessorEntry::PluginDisplay::on_expose_event (GdkEventExpose* ev)
+{
+ Gtk::Allocation a = get_allocation();
+ double const width = a.get_width();
+ double const height = a.get_height();
+
+ cairo_t* cr = gdk_cairo_create (get_window()->gobj());
+ cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ cairo_clip (cr);
+
+ Gdk::Color const bg = get_style()->get_bg (STATE_NORMAL);
+ cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ());
+ cairo_rectangle (cr, 0, 0, width, height);
+ cairo_fill (cr);
+
+ cairo_save (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ Gtkmm2ext::rounded_rectangle (cr, .5, -1.5, width - 1, height + 1, 7);
+ cairo_clip (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+
+ uint32_t ht = render_inline (cr, width);
+ cairo_restore (cr);
+
+ if (ht == 0) {
+ hide ();
+ if (_cur_height != 1) {
+ _cur_height = 1;
+ queue_resize ();
+ }
+ cairo_destroy (cr);
+ return true;
+ } else {
+ update_height_alloc (ht);
+ }
+
+ bool failed = false;
+ std::string name = get_name();
+ ArdourCanvas::Color fill_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed);
+
+ Gtkmm2ext::rounded_rectangle (cr, .5, -1.5, width - 1, height + 1, 7);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+ cairo_set_line_width(cr, 1.0);
+ ArdourCanvas::set_source_rgb_a (cr, fill_color, 1.0);
+ cairo_stroke (cr);
+
cairo_destroy(cr);
return true;
}
+ProcessorEntry::LuaPluginDisplay::LuaPluginDisplay (ProcessorEntry& e, boost::shared_ptr<ARDOUR::LuaProc> p, uint32_t max_height)
+ : PluginDisplay (e, p, max_height)
+ , _luaproc (p)
+ , _lua_render_inline (0)
+{
+ p->setup_lua_inline_gui (&lua_gui);
+
+ lua_State* LG = lua_gui.getState ();
+ LuaInstance::bind_cairo (LG);
+ luabridge::LuaRef lua_render = luabridge::getGlobal (LG, "render_inline");
+ assert (lua_render.isFunction ());
+ _lua_render_inline = new luabridge::LuaRef (lua_render);
+}
+
+ProcessorEntry::LuaPluginDisplay::~LuaPluginDisplay ()
+{
+ delete (_lua_render_inline);
+}
+
+uint32_t
+ProcessorEntry::LuaPluginDisplay::render_inline (cairo_t *cr, uint32_t width)
+{
+ Cairo::Context ctx (cr);
+ try {
+ luabridge::LuaRef rv = (*_lua_render_inline)((Cairo::Context *)&ctx, width, _max_height);
+ lua_gui.collect_garbage_step ();
+ if (rv.isTable ()) {
+ uint32_t h = rv[2];
+ return h;
+ }
+ } catch (luabridge::LuaException const& e) {
+#ifndef NDEBUG
+ cerr << "LuaException:" << e.what () << endl;
+#endif
+ }
+ return 0;
+}
+
+
static std::list<Gtk::TargetEntry> drop_targets()
{
std::list<Gtk::TargetEntry> tmp;
tmp.push_back (Gtk::TargetEntry ("processor")); // from processor-box to processor-box
tmp.push_back (Gtk::TargetEntry ("PluginInfoPtr")); // from plugin-manager
- tmp.push_back (Gtk::TargetEntry ("PluginPresetPtr")); // from sidebar
+ tmp.push_back (Gtk::TargetEntry ("PluginFavoritePtr")); // from sidebar
return tmp;
}
@@ -1137,10 +1773,16 @@ ProcessorBox::ProcessorBox (ARDOUR::Session* sess, boost::function<PluginSelecto
, _rr_selection(rsel)
, processor_display (drop_targets())
, _redisplay_pending (false)
-
{
set_session (sess);
+ /* ProcessorBox actions and bindings created statically by call to
+ * ProcessorBox::register_actions(), made by ARDOUR_UI so that actions
+ * are available for context menus.
+ */
+
+ processor_display.set_data ("ardour-bindings", bindings);
+
_width = Wide;
processor_menu = 0;
no_processor_redisplay = false;
@@ -1271,7 +1913,7 @@ ProcessorBox::_drop_plugin_preset (Gtk::SelectionData const &data, Route::Proces
boost::shared_ptr<Processor> processor (new PluginInsert (*_session, p));
if (Config->get_new_plugins_active ()) {
- processor->activate ();
+ processor->enable (true);
}
pl.push_back (processor);
}
@@ -1294,7 +1936,7 @@ ProcessorBox::_drop_plugin (Gtk::SelectionData const &data, Route::ProcessorList
}
boost::shared_ptr<Processor> processor (new PluginInsert (*_session, p));
if (Config->get_new_plugins_active ()) {
- processor->activate ();
+ processor->enable (true);
}
pl.push_back (processor);
}
@@ -1313,7 +1955,7 @@ ProcessorBox::plugin_drop (Gtk::SelectionData const &data, ProcessorEntry* posit
if (data.get_target() == "PluginInfoPtr") {
_drop_plugin (data, pl);
}
- else if (data.get_target() == "PluginPresetPtr") {
+ else if (data.get_target() == "PluginFavoritePtr") {
_drop_plugin_preset (data, pl);
}
else {
@@ -1334,6 +1976,28 @@ not match the configuration of this track.");
void
ProcessorBox::object_drop (DnDVBox<ProcessorEntry>* source, ProcessorEntry* position, Glib::RefPtr<Gdk::DragContext> const & context)
{
+ if (Gdk::ACTION_LINK == context->get_selected_action()) {
+ list<ProcessorEntry*> children = source->selection ();
+ assert (children.size() == 1);
+ ProcessorEntry* other = *children.begin();
+ assert (other->can_copy_state (position));
+ boost::shared_ptr<ARDOUR::Processor> otherproc = other->processor();
+ boost::shared_ptr<ARDOUR::Processor> proc = position->processor();
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (proc);
+ assert (otherproc && proc && pi);
+
+ PBD::ID id = pi->id();
+ XMLNode& state = otherproc->get_state ();
+ /* strip side-chain state (processor inside processor must be a side-chain)
+ * otherwise we'll end up with duplicate ports-names.
+ * (this needs a better solution which retains connections)
+ */
+ state.remove_nodes ("Processor");
+ proc->set_state (state, Stateful::loading_state_version);
+ boost::dynamic_pointer_cast<PluginInsert>(proc)->update_id (id);
+ return;
+ }
+
boost::shared_ptr<Processor> p = find_drop_position (position);
list<ProcessorEntry*> children = source->selection ();
@@ -1470,19 +2134,22 @@ ProcessorBox::show_processor_menu (int arg)
}
}
- Gtk::MenuItem* send_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/send_options"));
- if (send_menu_item) {
- if (single_selection && !_route->is_monitor()) {
- Menu* m = single_selection->build_send_options_menu ();
- if (m && !m->items().empty()) {
- send_menu_item->set_submenu (*m);
- send_menu_item->set_sensitive (true);
+
+ if (!ARDOUR::Profile->get_mixbus()) {
+ Gtk::MenuItem* send_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/send_options"));
+ if (send_menu_item) {
+ if (single_selection && !_route->is_monitor()) {
+ Menu* m = single_selection->build_send_options_menu ();
+ if (m && !m->items().empty()) {
+ send_menu_item->set_submenu (*m);
+ send_menu_item->set_sensitive (true);
+ } else {
+ gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
+ send_menu_item->set_sensitive (false);
+ }
} else {
- gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
send_menu_item->set_sensitive (false);
}
- } else {
- send_menu_item->set_sensitive (false);
}
}
@@ -1495,6 +2162,7 @@ ProcessorBox::show_processor_menu (int arg)
cut_action->set_sensitive (sensitive && can_cut ());
copy_action->set_sensitive (sensitive);
delete_action->set_sensitive (sensitive || stub_processor_selected ());
+ backspace_action->set_sensitive (sensitive || stub_processor_selected ());
edit_action->set_sensitive (one_processor_can_be_edited ());
edit_generic_action->set_sensitive (one_processor_can_be_edited ());
@@ -1504,6 +2172,8 @@ ProcessorBox::show_processor_menu (int arg)
pi = boost::dynamic_pointer_cast<PluginInsert> (single_selection->processor ());
}
+ manage_pins_action->set_sensitive (pi != 0);
+
/* allow editing with an Ardour-generated UI for plugin inserts with editors */
edit_action->set_sensitive (pi && pi->plugin()->has_editor ());
@@ -1530,13 +2200,25 @@ ProcessorBox::show_processor_menu (int arg)
bool
ProcessorBox::enter_notify (GdkEventCrossing*)
{
+ processor_display.grab_focus ();
_current_processor_box = this;
return false;
}
bool
-ProcessorBox::leave_notify (GdkEventCrossing*)
+ProcessorBox::leave_notify (GdkEventCrossing* ev)
{
+ if (ev->detail == GDK_NOTIFY_INFERIOR) {
+ return false;
+ }
+
+ Widget* top = get_toplevel();
+
+ if (top->is_toplevel()) {
+ Window* win = dynamic_cast<Window*> (top);
+ gtk_window_set_focus (win->gobj(), 0);
+ }
+
return false;
}
@@ -1560,8 +2242,9 @@ ProcessorBox::processor_operation (ProcessorOperation op)
}
*/
- if ( (op == ProcessorsDelete) && targets.empty() )
+ if ((op == ProcessorsDelete) && targets.empty()) {
return false; //nothing to delete. return false so the editor-mixer, because the user was probably intending to delete something in the editor
+ }
switch (op) {
case ProcessorsSelectAll:
@@ -1602,11 +2285,7 @@ ProcessorBox::processor_operation (ProcessorOperation op)
case ProcessorsToggleActive:
for (ProcSelection::iterator i = targets.begin(); i != targets.end(); ++i) {
- if ((*i)->active()) {
- (*i)->deactivate ();
- } else {
- (*i)->activate ();
- }
+ (*i)->enable (!(*i)->enabled ());
}
break;
@@ -1692,18 +2371,13 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev, ProcessorEntry
boost::weak_ptr<Processor>(processor)));
} else if (processor && Keyboard::is_button2_event (ev)
-#ifndef GTKOSX
+#ifndef __APPLE__
&& (Keyboard::no_modifier_keys_pressed (ev) && ((ev->state & Gdk::BUTTON2_MASK) == Gdk::BUTTON2_MASK))
#endif
) {
/* button2-click with no/appropriate modifiers */
-
- if (processor->active()) {
- processor->deactivate ();
- } else {
- processor->activate ();
- }
+ processor->enable (!processor->enabled ());
}
return false;
@@ -1749,8 +2423,10 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins)
weird_plugin_dialog (**p, err_streams);
return true;
// XXX SHAREDPTR delete plugin here .. do we even need to care?
- } else if (plugins.size() == 1 && Config->get_open_gui_after_adding_plugin()) {
- if (_session->engine().connected () && processor_can_be_edited (processor)) {
+ } else if (plugins.size() == 1 && UIConfiguration::instance().get_open_gui_after_adding_plugin()) {
+ if (boost::dynamic_pointer_cast<PluginInsert>(processor)->plugin()->has_inline_display() && UIConfiguration::instance().get_prefer_inline_over_gui()) {
+ ;
+ } else if (_session->engine().connected () && processor_can_be_edited (processor)) {
if ((*p)->has_editor ()) {
edit_processor (processor);
} else {
@@ -1766,6 +2442,16 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins)
void
ProcessorBox::weird_plugin_dialog (Plugin& p, Route::ProcessorStreams streams)
{
+ /* XXX this needs to be re-worked!
+ *
+ * With new pin-management "streams" is no longer correct.
+ * p.get_info () is also incorrect for variable i/o plugins (always -1,-1).
+ *
+ * Since pin-management was added, this dialog will only show in a very rare
+ * condition (non-replicated variable i/o configuration failed).
+ *
+ * TODO: simplify the message after the string-freeze is lifted.
+ */
ArdourDialog dialog (_("Plugin Incompatibility"));
Label label;
@@ -1819,11 +2505,10 @@ ProcessorBox::choose_insert ()
void
ProcessorBox::choose_send ()
{
- boost::shared_ptr<Pannable> sendpan(new Pannable (*_session));
- boost::shared_ptr<Send> send (new Send (*_session, sendpan, _route->mute_master()));
+ boost::shared_ptr<Send> send (new Send (*_session, _route->pannable (), _route->mute_master()));
/* make an educated guess at the initial number of outputs for the send */
- ChanCount outs = (_session->master_out())
+ ChanCount outs = (_route->n_outputs().n_audio() && _session->master_out())
? _session->master_out()->n_outputs()
: _route->n_outputs();
@@ -1876,9 +2561,6 @@ ProcessorBox::send_io_finished (IOSelector::Result r, boost::weak_ptr<Processor>
case IOSelector::Accepted:
_route->add_processor_by_index (processor, _placement);
- if (Profile->get_sae()) {
- processor->activate ();
- }
break;
}
@@ -1904,9 +2586,6 @@ ProcessorBox::return_io_finished (IOSelector::Result r, boost::weak_ptr<Processo
case IOSelector::Accepted:
_route->add_processor_by_index (processor, _placement);
- if (Profile->get_sae()) {
- processor->activate ();
- }
break;
}
@@ -1960,6 +2639,8 @@ ProcessorBox::redisplay_processors ()
_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display));
_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::maybe_add_processor_to_ui_list));
+ _route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::maybe_add_processor_pin_mgr));
+
setup_entry_positions ();
}
@@ -2002,7 +2683,7 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr<Processor> w)
const XMLNode* ui_xml = _session->extra_xml (X_("UI"));
if (ui_xml) {
- wp->set_state (*ui_xml);
+ wp->set_state (*ui_xml, 0);
}
void* existing_ui = p->get_ui ();
@@ -2016,6 +2697,26 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr<Processor> w)
}
void
+ProcessorBox::maybe_add_processor_pin_mgr (boost::weak_ptr<Processor> w)
+{
+ boost::shared_ptr<Processor> p = w.lock ();
+ if (!p || p->pinmgr_proxy ()) {
+ return;
+ }
+
+ PluginPinWindowProxy* wp = new PluginPinWindowProxy (
+ string_compose ("PM-%2-%3", _route->id(), p->id()), w);
+ wp->set_session (_session);
+
+ const XMLNode* ui_xml = _session->extra_xml (X_("UI"));
+ if (ui_xml) {
+ wp->set_state (*ui_xml, 0);
+ }
+
+ p->set_pingmgr_proxy (wp);
+ WM::Manager::instance().register_window (wp);
+}
+void
ProcessorBox::help_count_visible_prefader_processors (boost::weak_ptr<Processor> p, uint32_t* cnt, bool* amp_seen)
{
boost::shared_ptr<Processor> processor (p.lock ());
@@ -2027,7 +2728,7 @@ ProcessorBox::help_count_visible_prefader_processors (boost::weak_ptr<Processor>
)
) {
- if (boost::dynamic_pointer_cast<Amp>(processor) &&
+ if (boost::dynamic_pointer_cast<Amp>(processor) &&
boost::dynamic_pointer_cast<Amp>(processor)->gain_control()->parameter().type() == GainAutomation) {
*amp_seen = true;
} else {
@@ -2111,6 +2812,136 @@ ProcessorBox::reordered ()
}
void
+ProcessorBox::setup_routing_feeds ()
+{
+ list<ProcessorEntry*> children = processor_display.children ();
+ /* first set the i/o maps for every processor */
+ list<ProcessorEntry*>::iterator prev = children.begin();
+
+ for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
+ boost::shared_ptr<ARDOUR::Processor> p = (*i)->processor();
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (p);
+
+ list<ProcessorEntry*>::iterator next = i;
+ next++;
+
+ if (pi) {
+ ChanCount sinks = pi->natural_input_streams ();
+ ChanCount sources = pi->natural_output_streams ();
+ uint32_t count = pi->get_count ();
+ ChanCount in, out;
+ pi->configured_io (in, out);
+
+ ChanCount midi_thru;
+ ChanCount midi_bypass;
+ ChanMapping input_map (pi->input_map ());
+ if (pi->has_midi_thru ()) {
+ midi_thru.set(DataType::MIDI, 1);
+ input_map.set (DataType::MIDI, 0, 0);
+ }
+ if (pi->has_midi_bypass ()) {
+ midi_bypass.set(DataType::MIDI, 1);
+ }
+
+ (*i)->input_icon.set_ports (sinks * count + midi_thru);
+ (*i)->output_icon.set_ports (sources * count + midi_bypass);
+
+ (*i)->routing_icon.set (
+ in, out,
+ sinks * count + midi_thru,
+ sources * count + midi_bypass,
+ input_map,
+ pi->output_map (),
+ pi->thru_map ());
+
+ if (next != children.end()) {
+ (*next)->routing_icon.set_fed_by (out, sources * count + midi_bypass,
+ pi->output_map (), pi->thru_map ());
+ }
+
+ if (prev != i) {
+ (*prev)->routing_icon.set_feeding (in, sinks * count + midi_thru,
+ pi->input_map (), pi->thru_map ());
+ }
+
+ } else {
+ (*i)->input_icon.set_ports (p->input_streams());
+ (*i)->output_icon.set_ports (p->output_streams());
+ ChanMapping inmap (p->input_streams ());
+ ChanMapping outmap (p->input_streams ());
+ ChanMapping thrumap;
+ (*i)->routing_icon.set (
+ p->input_streams(),
+ p->output_streams(),
+ p->input_streams(),
+ p->output_streams(),
+ inmap, outmap, thrumap);
+
+ if (next != children.end()) {
+ (*next)->routing_icon.set_fed_by (
+ p->output_streams(),
+ p->output_streams(),
+ outmap, thrumap);
+ }
+ if (prev != i) {
+ (*prev)->routing_icon.set_feeding (
+ p->input_streams(),
+ p->output_streams(),
+ inmap, thrumap);
+ }
+ }
+
+ if (i == children.begin()) {
+ (*i)->routing_icon.unset_fed_by ();
+ }
+ prev = i;
+ (*i)->input_icon.hide();
+ }
+
+ /* now set which icons need to be displayed */
+ for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
+ (*i)->output_routing_icon.copy_state ((*i)->routing_icon);
+
+ if ((*i)->routing_icon.in_identity ()) {
+ (*i)->routing_icon.hide();
+ if (i == children.begin()) {
+ (*i)->input_icon.show();
+ }
+ } else {
+ (*i)->routing_icon.show();
+ (*i)->routing_icon.queue_draw();
+ (*i)->input_icon.show();
+ }
+
+ list<ProcessorEntry*>::iterator next = i;
+ if (++next == children.end()) {
+ // last processor in the chain
+ (*i)->output_routing_icon.set_terminal(true);
+ (*i)->output_routing_icon.unset_feeding ();
+ if ((*i)->routing_icon.out_identity ()) {
+ (*i)->output_routing_icon.hide();
+ } else {
+ (*i)->output_routing_icon.show();
+ (*i)->output_routing_icon.queue_draw();
+ }
+ } else {
+ (*i)->output_routing_icon.set_terminal(false);
+ if ( !(*i)->routing_icon.out_identity ()
+ && !(*next)->routing_icon.in_identity ()
+ && (*next)->routing_icon.can_coalesce ()) {
+ (*i)->output_routing_icon.hide();
+ } else if (!(*i)->routing_icon.out_identity ()) {
+ (*i)->output_routing_icon.show();
+ (*i)->output_routing_icon.queue_draw();
+ (*next)->input_icon.show();
+ } else {
+ (*i)->output_routing_icon.hide();
+ }
+ }
+ }
+}
+
+void
ProcessorBox::setup_entry_positions ()
{
list<ProcessorEntry*> children = processor_display.children ();
@@ -2118,7 +2949,7 @@ ProcessorBox::setup_entry_positions ()
uint32_t num = 0;
for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
- if (boost::dynamic_pointer_cast<Amp>((*i)->processor()) &&
+ if (boost::dynamic_pointer_cast<Amp>((*i)->processor()) &&
boost::dynamic_pointer_cast<Amp>((*i)->processor())->gain_control()->parameter().type() == GainAutomation) {
pre_fader = false;
(*i)->set_position (ProcessorEntry::Fader, num++);
@@ -2130,6 +2961,7 @@ ProcessorBox::setup_entry_positions ()
}
}
}
+ setup_routing_feeds ();
}
void
@@ -2292,7 +3124,7 @@ ProcessorBox::copy_processors (const ProcSelection& to_be_copied)
(boost::dynamic_pointer_cast<Return>((*i)) != 0)) {
node->add_child_nocopy ((*i)->get_state());
}
- }
+ }
_rr_selection.set (node);
}
@@ -2520,14 +3352,27 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr
}
p.reset (pi);
-
} else {
/* XXX its a bit limiting to assume that everything else
is a plugin.
*/
p.reset (new PluginInsert (*_session));
+ /* we can't use RAII Stateful::ForceIDRegeneration
+ * because that'd void copying the state and wrongly bump
+ * the state-version counter.
+ * we need to load the state (incl external files) first and
+ * only then update the ID)
+ */
PBD::ID id = p->id();
- p->set_state (**niter, Stateful::current_state_version);
+ /* strip side-chain state (processor inside processor must be a side-chain)
+ * otherwise we'll end up with duplicate ports-names.
+ * (this needs a better solution which retains connections)
+ * We really would want Stateful::ForceIDRegeneration here :(
+ */
+ XMLNode state (**niter);
+ state.remove_nodes ("Processor");
+
+ p->set_state (state, Stateful::current_state_version);
boost::dynamic_pointer_cast<PluginInsert>(p)->update_id (id);
}
@@ -2800,68 +3645,81 @@ ProcessorBox::get_generic_editor_window (boost::shared_ptr<Processor> processor)
void
ProcessorBox::register_actions ()
{
- Glib::RefPtr<Gtk::ActionGroup> popup_act_grp = Gtk::ActionGroup::create(X_("ProcessorMenu"));
+ processor_box_actions = myactions.create_action_group (X_("ProcessorMenu"));
+
Glib::RefPtr<Action> act;
/* new stuff */
- ActionManager::register_action (popup_act_grp, X_("newplugin"), _("New Plugin"),
+ myactions.register_action (processor_box_actions, X_("newplugin"), _("New Plugin"),
sigc::ptr_fun (ProcessorBox::rb_choose_plugin));
- act = ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"),
+ act = myactions.register_action (processor_box_actions, X_("newinsert"), _("New Insert"),
sigc::ptr_fun (ProcessorBox::rb_choose_insert));
ActionManager::engine_sensitive_actions.push_back (act);
- act = ActionManager::register_action (popup_act_grp, X_("newsend"), _("New External Send ..."),
+ act = myactions.register_action (processor_box_actions, X_("newsend"), _("New External Send ..."),
sigc::ptr_fun (ProcessorBox::rb_choose_send));
ActionManager::engine_sensitive_actions.push_back (act);
- ActionManager::register_action (popup_act_grp, X_("newaux"), _("New Aux Send ..."));
+ myactions.register_action (processor_box_actions, X_("newaux"), _("New Aux Send ..."));
- ActionManager::register_action (popup_act_grp, X_("controls"), _("Controls"));
- ActionManager::register_action (popup_act_grp, X_("send_options"), _("Send Options"));
+ myactions.register_action (processor_box_actions, X_("controls"), _("Controls"));
+ myactions.register_action (processor_box_actions, X_("send_options"), _("Send Options"));
- ActionManager::register_action (popup_act_grp, X_("clear"), _("Clear (all)"),
+ myactions.register_action (processor_box_actions, X_("clear"), _("Clear (all)"),
sigc::ptr_fun (ProcessorBox::rb_clear));
- ActionManager::register_action (popup_act_grp, X_("clear_pre"), _("Clear (pre-fader)"),
+ myactions.register_action (processor_box_actions, X_("clear_pre"), _("Clear (pre-fader)"),
sigc::ptr_fun (ProcessorBox::rb_clear_pre));
- ActionManager::register_action (popup_act_grp, X_("clear_post"), _("Clear (post-fader)"),
+ myactions.register_action (processor_box_actions, X_("clear_post"), _("Clear (post-fader)"),
sigc::ptr_fun (ProcessorBox::rb_clear_post));
/* standard editing stuff */
- cut_action = ActionManager::register_action (popup_act_grp, X_("cut"), _("Cut"),
- sigc::ptr_fun (ProcessorBox::rb_cut));
- copy_action = ActionManager::register_action (popup_act_grp, X_("copy"), _("Copy"),
- sigc::ptr_fun (ProcessorBox::rb_copy));
- delete_action = ActionManager::register_action (popup_act_grp, X_("delete"), _("Delete"),
- sigc::ptr_fun (ProcessorBox::rb_delete));
-
- paste_action = ActionManager::register_action (popup_act_grp, X_("paste"), _("Paste"),
+
+ cut_action = myactions.register_action (processor_box_actions, X_("cut"), _("Cut"),
+ sigc::ptr_fun (ProcessorBox::rb_cut));
+ copy_action = myactions.register_action (processor_box_actions, X_("copy"), _("Copy"),
+ sigc::ptr_fun (ProcessorBox::rb_copy));
+ delete_action = myactions.register_action (processor_box_actions, X_("delete"), _("Delete"),
+ sigc::ptr_fun (ProcessorBox::rb_delete));
+ backspace_action = myactions.register_action (processor_box_actions, X_("backspace"), _("Delete"),
+ sigc::ptr_fun (ProcessorBox::rb_delete));
+
+ ActionManager::plugin_selection_sensitive_actions.push_back (cut_action);
+ ActionManager::plugin_selection_sensitive_actions.push_back (copy_action);
+ ActionManager::plugin_selection_sensitive_actions.push_back (delete_action);
+ ActionManager::plugin_selection_sensitive_actions.push_back (backspace_action);
+
+ paste_action = myactions.register_action (processor_box_actions, X_("paste"), _("Paste"),
sigc::ptr_fun (ProcessorBox::rb_paste));
- rename_action = ActionManager::register_action (popup_act_grp, X_("rename"), _("Rename"),
+ rename_action = myactions.register_action (processor_box_actions, X_("rename"), _("Rename"),
sigc::ptr_fun (ProcessorBox::rb_rename));
- ActionManager::register_action (popup_act_grp, X_("selectall"), _("Select All"),
+ myactions.register_action (processor_box_actions, X_("selectall"), _("Select All"),
sigc::ptr_fun (ProcessorBox::rb_select_all));
- ActionManager::register_action (popup_act_grp, X_("deselectall"), _("Deselect All"),
+ myactions.register_action (processor_box_actions, X_("deselectall"), _("Deselect All"),
sigc::ptr_fun (ProcessorBox::rb_deselect_all));
/* activation etc. */
- ActionManager::register_action (popup_act_grp, X_("activate_all"), _("Activate All"),
+ myactions.register_action (processor_box_actions, X_("activate_all"), _("Activate All"),
sigc::ptr_fun (ProcessorBox::rb_activate_all));
- ActionManager::register_action (popup_act_grp, X_("deactivate_all"), _("Deactivate All"),
+ myactions.register_action (processor_box_actions, X_("deactivate_all"), _("Deactivate All"),
sigc::ptr_fun (ProcessorBox::rb_deactivate_all));
- ActionManager::register_action (popup_act_grp, X_("ab_plugins"), _("A/B Plugins"),
+ myactions.register_action (processor_box_actions, X_("ab_plugins"), _("A/B Plugins"),
sigc::ptr_fun (ProcessorBox::rb_ab_plugins));
+ manage_pins_action = myactions.register_action (
+ processor_box_actions, X_("manage-pins"), _("Pin Connections..."),
+ sigc::ptr_fun (ProcessorBox::rb_manage_pins));
+
/* show editors */
- edit_action = ActionManager::register_action (
- popup_act_grp, X_("edit"), _("Edit..."),
+ edit_action = myactions.register_action (
+ processor_box_actions, X_("edit"), _("Edit..."),
sigc::ptr_fun (ProcessorBox::rb_edit));
- edit_generic_action = ActionManager::register_action (
- popup_act_grp, X_("edit-generic"), _("Edit with generic controls..."),
+ edit_generic_action = myactions.register_action (
+ processor_box_actions, X_("edit-generic"), _("Edit with generic controls..."),
sigc::ptr_fun (ProcessorBox::rb_edit_generic));
- ActionManager::add_action_group (popup_act_grp);
+ load_bindings ();
}
void
@@ -2885,6 +3743,15 @@ ProcessorBox::rb_ab_plugins ()
}
void
+ProcessorBox::rb_manage_pins ()
+{
+ if (_current_processor_box == 0) {
+ return;
+ }
+
+ _current_processor_box->for_selected_processors (&ProcessorBox::manage_pins);
+}
+void
ProcessorBox::rb_choose_plugin ()
{
if (_current_processor_box == 0) {
@@ -3077,12 +3944,15 @@ ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
if (edit_aux_send (processor)) {
return;
}
+ if (!_session->engine().connected()) {
+ return;
+ }
ProcessorWindowProxy* proxy = find_window_proxy (processor);
if (proxy) {
proxy->set_custom_ui_mode (true);
- proxy->toggle ();
+ proxy->show_the_right_window ();
}
}
@@ -3095,15 +3965,32 @@ ProcessorBox::generic_edit_processor (boost::shared_ptr<Processor> processor)
if (edit_aux_send (processor)) {
return;
}
+ if (!_session->engine().connected()) {
+ return;
+ }
ProcessorWindowProxy* proxy = find_window_proxy (processor);
if (proxy) {
proxy->set_custom_ui_mode (false);
- proxy->toggle ();
+ proxy->show_the_right_window ();
+ }
+}
+
+void
+ProcessorBox::manage_pins (boost::shared_ptr<Processor> processor)
+{
+ if (!processor) {
+ return;
+ }
+ PluginPinWindowProxy* proxy = processor->pinmgr_proxy ();
+ if (proxy) {
+ proxy->get (true);
+ proxy->present();
}
}
+
void
ProcessorBox::route_property_changed (const PropertyChange& what_changed)
{
@@ -3121,7 +4008,7 @@ ProcessorBox::route_property_changed (const PropertyChange& what_changed)
for (list<ProcessorEntry*>::iterator iter = children.begin(); iter != children.end(); ++iter) {
- processor = (*iter)->processor ();
+ processor = (*iter)->processor ();
if (!processor) {
continue;
@@ -3227,6 +4114,10 @@ void
ProcessorBox::processor_menu_unmapped ()
{
processor_display.remove_placeholder ();
+ /* make all possibly-desensitized actions sensitive again so that
+ they be activated by other means (e.g. bindings)
+ */
+ ActionManager::set_sensitive (ActionManager::plugin_selection_sensitive_actions, true);
}
XMLNode *
@@ -3305,7 +4196,7 @@ ProcessorWindowProxy::session_handle()
}
XMLNode&
-ProcessorWindowProxy::get_state () const
+ProcessorWindowProxy::get_state ()
{
XMLNode *node;
node = &ProxyBase::get_state();
@@ -3313,13 +4204,13 @@ ProcessorWindowProxy::get_state () const
return *node;
}
-void
-ProcessorWindowProxy::set_state (const XMLNode& node)
+int
+ProcessorWindowProxy::set_state (const XMLNode& node, int /*version*/)
{
XMLNodeList children = node.children ();
XMLNodeList::const_iterator i = children.begin ();
while (i != children.end()) {
- XMLProperty* prop = (*i)->property (X_("name"));
+ XMLProperty const * prop = (*i)->property (X_("name"));
if ((*i)->name() == X_("Window") && prop && prop->value() == _name) {
break;
}
@@ -3327,13 +4218,13 @@ ProcessorWindowProxy::set_state (const XMLNode& node)
}
if (i != children.end()) {
- XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = (*i)->property (X_("custom-ui"))) != 0) {
want_custom = PBD::string_is_affirmative (prop->value ());
}
}
- ProxyBase::set_state(node);
+ return ProxyBase::set_state (node, 0);
}
Gtk::Window*
@@ -3360,19 +4251,80 @@ ProcessorWindowProxy::get (bool create)
if (_window) {
setup ();
}
+ _window->show_all ();
}
-
return _window;
}
void
-ProcessorWindowProxy::toggle ()
+ProcessorWindowProxy::show_the_right_window ()
{
if (_window && (is_custom != want_custom)) {
/* drop existing window - wrong type */
drop_window ();
}
- is_custom = want_custom;
+ toggle ();
+}
+
+
+PluginPinWindowProxy::PluginPinWindowProxy(std::string const &name, boost::weak_ptr<ARDOUR::Processor> processor)
+ : WM::ProxyBase (name, string())
+ , _processor (processor)
+{
+ boost::shared_ptr<Processor> p = _processor.lock ();
+ if (!p) {
+ return;
+ }
+ p->DropReferences.connect (going_away_connection, MISSING_INVALIDATOR, boost::bind (&PluginPinWindowProxy::processor_going_away, this), gui_context());
+}
+
+PluginPinWindowProxy::~PluginPinWindowProxy()
+{
+ _window = 0;
+}
+
+ARDOUR::SessionHandlePtr*
+PluginPinWindowProxy::session_handle ()
+{
+ ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+ if (aw) { return aw; }
+ return 0;
+}
+
+Gtk::Window*
+PluginPinWindowProxy::get (bool create)
+{
+ boost::shared_ptr<Processor> p = _processor.lock ();
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (p);
+ if (!p || !pi) {
+ return 0;
+ }
- WM::ProxyBase::toggle ();
+ if (!_window) {
+ if (!create) {
+ return 0;
+ }
+ _window = new PluginPinDialog (pi);
+ ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+ if (aw) {
+ aw->set_session (_session);
+ }
+ _window->show_all ();
+ }
+ return _window;
+}
+
+void
+PluginPinWindowProxy::processor_going_away ()
+{
+ delete _window;
+ _window = 0;
+ WM::Manager::instance().remove (this);
+ going_away_connection.disconnect();
+}
+
+void
+ProcessorBox::load_bindings ()
+{
+ bindings = Bindings::get_bindings (X_("Processor Box"), myactions);
}
diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h
index d904e13..5dd7483 100644
--- a/gtk2_ardour/processor_box.h
+++ b/gtk2_ardour/processor_box.h
@@ -29,9 +29,11 @@
#include <gtkmm/eventbox.h>
#include <gtkmm/menu.h>
#include <gtkmm/scrolledwindow.h>
-#include "gtkmm2ext/dndtreeview.h"
+
#include "gtkmm2ext/auto_spin.h"
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/click_box.h"
+#include "gtkmm2ext/dndtreeview.h"
#include "gtkmm2ext/dndvbox.h"
#include "gtkmm2ext/pixfader.h"
#include "gtkmm2ext/persistent_tooltip.h"
@@ -42,6 +44,7 @@
#include "ardour/types.h"
#include "ardour/ardour.h"
#include "ardour/plugin_insert.h"
+#include "ardour/luaproc.h"
#include "ardour/port_insert.h"
#include "ardour/processor.h"
#include "ardour/route.h"
@@ -78,33 +81,52 @@ class ProcessorBox;
class ProcessorWindowProxy : public WM::ProxyBase
{
public:
- ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
- ~ProcessorWindowProxy();
+ ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
+ ~ProcessorWindowProxy();
- Gtk::Window* get (bool create = false);
+ Gtk::Window* get (bool create = false);
- boost::weak_ptr<ARDOUR::Processor> processor () const {
- return _processor;
- }
+ boost::weak_ptr<ARDOUR::Processor> processor () const {
+ return _processor;
+ }
- ARDOUR::SessionHandlePtr* session_handle();
- void toggle();
- void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
+ ARDOUR::SessionHandlePtr* session_handle();
+ void show_the_right_window ();
+ void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
- void set_state (const XMLNode&);
- XMLNode& get_state () const;
+ int set_state (const XMLNode&, int);
+ XMLNode& get_state ();
private:
- ProcessorBox* _processor_box;
- boost::weak_ptr<ARDOUR::Processor> _processor;
- bool is_custom;
- bool want_custom;
- bool _valid;
-
- void processor_going_away ();
- PBD::ScopedConnection going_away_connection;
+ ProcessorBox* _processor_box;
+ boost::weak_ptr<ARDOUR::Processor> _processor;
+ bool is_custom;
+ bool want_custom;
+
+ void processor_going_away ();
+ PBD::ScopedConnection going_away_connection;
};
+
+class PluginPinWindowProxy : public WM::ProxyBase
+{
+ public:
+ PluginPinWindowProxy (std::string const &, boost::weak_ptr<ARDOUR::Processor>);
+ ~PluginPinWindowProxy();
+
+ Gtk::Window* get (bool create = false);
+ ARDOUR::SessionHandlePtr* session_handle();
+
+ private:
+ ProcessorBox* _processor_box;
+ boost::weak_ptr<ARDOUR::Processor> _processor;
+
+ void processor_going_away ();
+ PBD::ScopedConnection going_away_connection;
+};
+
+
+
class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable
{
public:
@@ -120,6 +142,7 @@ public:
void set_selectable(bool s) { _selectable = s; }
bool drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &);
+ bool can_copy_state (Gtkmm2ext::DnDVBoxChild*) const;
enum Position {
PreFader,
@@ -148,6 +171,7 @@ protected:
Gtk::VBox _vbox;
Position _position;
uint32_t _position_num;
+ ProcessorBox* _parent;
virtual void setup_visuals ();
@@ -161,7 +185,6 @@ private:
std::string name (Width) const;
void setup_tooltip ();
- ProcessorBox* _parent;
boost::shared_ptr<ARDOUR::Processor> _processor;
Width _width;
PBD::ScopedConnection active_connection;
@@ -213,9 +236,49 @@ private:
std::list<Control*> _controls;
+ void toggle_inline_display_visibility ();
void toggle_control_visibility (Control *);
void toggle_panner_link ();
+ class PluginDisplay : public Gtk::DrawingArea {
+ public:
+ PluginDisplay(ProcessorEntry&, boost::shared_ptr<ARDOUR::Plugin>, uint32_t max_height = 80);
+ virtual ~PluginDisplay();
+ protected:
+ bool on_expose_event (GdkEventExpose *);
+ void on_size_request (Gtk::Requisition* req);
+ bool on_button_press_event (GdkEventButton *ev);
+ bool on_button_release_event (GdkEventButton *ev);
+
+ void plugin_going_away () {
+ _qdraw_connection.disconnect ();
+ }
+
+ void update_height_alloc (uint32_t inline_height);
+ virtual uint32_t render_inline (cairo_t *, uint32_t width);
+
+ ProcessorEntry& _entry;
+ boost::shared_ptr<ARDOUR::Plugin> _plug;
+ PBD::ScopedConnection _qdraw_connection;
+ PBD::ScopedConnection _death_connection;
+ cairo_surface_t* _surf;
+ uint32_t _max_height;
+ uint32_t _cur_height;
+ bool _scroll;
+ };
+
+ class LuaPluginDisplay : public PluginDisplay {
+ public:
+ LuaPluginDisplay(ProcessorEntry&, boost::shared_ptr<ARDOUR::LuaProc>, uint32_t max_height = 80);
+ ~LuaPluginDisplay();
+ protected:
+ virtual uint32_t render_inline (cairo_t *, uint32_t width);
+ private:
+ boost::shared_ptr<ARDOUR::LuaProc> _luaproc;
+ LuaState lua_gui;
+ luabridge::LuaRef * _lua_render_inline;
+ };
+
class PortIcon : public Gtk::DrawingArea {
public:
PortIcon(bool input);
@@ -228,27 +291,97 @@ private:
class RoutingIcon : public Gtk::DrawingArea {
public:
- RoutingIcon() {
- _sources = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
- _sinks = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
- _splitting = false;
- set_size_request (-1, 4);
+ RoutingIcon(bool inputrouting = true);
+ void set (
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanMapping&,
+ const ARDOUR::ChanMapping&,
+ const ARDOUR::ChanMapping&);
+ void set_fed_by (
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanMapping&,
+ const ARDOUR::ChanMapping&);
+
+ void set_feeding (
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanCount&,
+ const ARDOUR::ChanMapping&,
+ const ARDOUR::ChanMapping&);
+
+ void set_terminal (bool b);
+
+ void copy_state (const RoutingIcon& other) {
+ _in = other._in;
+ _out = other._out;
+ _sources = other._sources;
+ _sinks = other._sinks;
+ _in_map = other._in_map;
+ _out_map = other._out_map;
+ _thru_map = other._thru_map;
+ _f_out = other._f_out;
+ _f_out_map = other._f_out_map;
+ _f_thru_map = other._f_thru_map;
+ _f_sources = other._f_sources;
+ _i_in = other._i_in;
+ _i_in_map = other._i_in_map;
+ _i_thru_map = other._i_thru_map;
+ _i_sinks = other._i_sinks;
+ _fed_by = other._fed_by;
+ _feeding = other._feeding;
}
- void set_sources(ARDOUR::ChanCount const sources) { _sources = sources; }
- void set_sinks(ARDOUR::ChanCount const sinks) { _sinks = sinks; }
- void set_splitting(const bool splitting) { _splitting = splitting; }
+
+ void unset_fed_by () { _fed_by = false ; }
+ void unset_feeding () { _feeding = false ; }
+ bool in_identity () const;
+ bool out_identity () const;
+ bool can_coalesce () const;
+
+ static double pin_x_pos (uint32_t, double, uint32_t, uint32_t, bool);
+ static void draw_connection (cairo_t*, double, double, double, double, bool, bool dashed = false);
+ static void draw_gnd (cairo_t*, double, double, double, bool);
+ static void draw_sidechain (cairo_t*, double, double, double, bool);
+ static void draw_thru_src (cairo_t*, double, double, double, bool);
+ static void draw_thru_sink (cairo_t*, double, double, double, bool);
+
private:
bool on_expose_event (GdkEventExpose *);
- /* the wire icon sits on top of every processor if needed */
- ARDOUR::ChanCount _sources; // signals available (valid outputs from prev. processor)
- ARDOUR::ChanCount _sinks; // actual inputs of this processor
- bool _splitting;
+ void expose_input_map (cairo_t*, const double, const double);
+ void expose_coalesced_input_map (cairo_t*, const double, const double);
+ void expose_output_map (cairo_t*, const double, const double);
+
+ ARDOUR::ChanCount _in;
+ ARDOUR::ChanCount _out;
+ ARDOUR::ChanCount _sources;
+ ARDOUR::ChanCount _sinks;
+ ARDOUR::ChanMapping _in_map;
+ ARDOUR::ChanMapping _out_map;
+ ARDOUR::ChanMapping _thru_map;
+ ARDOUR::ChanCount _f_out;
+ ARDOUR::ChanMapping _f_out_map;
+ ARDOUR::ChanMapping _f_thru_map;
+ ARDOUR::ChanCount _f_sources;
+ ARDOUR::ChanCount _i_in;
+ ARDOUR::ChanMapping _i_in_map;
+ ARDOUR::ChanMapping _i_thru_map;
+ ARDOUR::ChanCount _i_sinks;
+ bool _fed_by;
+ bool _feeding;
+ bool _input;
+ bool _terminal;
};
+public:
+ PortIcon input_icon;
+ PortIcon output_icon;
+ RoutingIcon routing_icon; // sits on top of every processor (input routing)
+ RoutingIcon output_routing_icon; // only used by last processor in the chain
+
protected:
- RoutingIcon _routing_icon;
- PortIcon _input_icon;
- PortIcon _output_icon;
+ PluginDisplay *_plugin_display ;
};
class PluginInsertProcessorEntry : public ProcessorEntry
@@ -259,10 +392,10 @@ public:
void hide_things ();
private:
- void plugin_insert_splitting_changed ();
+ void iomap_changed ();
boost::shared_ptr<ARDOUR::PluginInsert> _plugin_insert;
- PBD::ScopedConnection _splitting_connection;
+ PBD::ScopedConnectionList _iomap_connection;
};
class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr
@@ -295,6 +428,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
void select_all_sends ();
void all_visible_processors_active(bool state);
+ void setup_routing_feeds ();
void hide_things ();
@@ -307,6 +441,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
Gtk::Window* get_editor_window (boost::shared_ptr<ARDOUR::Processor>, bool);
Gtk::Window* get_generic_editor_window (boost::shared_ptr<ARDOUR::Processor>);
+ void manage_pins (boost::shared_ptr<ARDOUR::Processor>);
void edit_processor (boost::shared_ptr<ARDOUR::Processor>);
void generic_edit_processor (boost::shared_ptr<ARDOUR::Processor>);
@@ -315,13 +450,15 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorSelected;
sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorUnselected;
+ static Glib::RefPtr<Gtk::ActionGroup> processor_box_actions;
+ static Gtkmm2ext::Bindings* bindings;
static void register_actions();
+
#ifndef NDEBUG
static bool show_all_processors;
#endif
private:
-
/* prevent copy construction */
ProcessorBox (ProcessorBox const &);
@@ -343,6 +480,9 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
uint32_t _visible_prefader_processors;
RouteProcessorSelection& _rr_selection;
+ static Gtkmm2ext::ActionMap myactions;
+
+ static void load_bindings ();
void route_going_away ();
@@ -419,6 +559,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
static Glib::RefPtr<Gtk::Action> paste_action;
static Glib::RefPtr<Gtk::Action> rename_action;
static Glib::RefPtr<Gtk::Action> delete_action;
+ static Glib::RefPtr<Gtk::Action> backspace_action;
+ static Glib::RefPtr<Gtk::Action> manage_pins_action;
static Glib::RefPtr<Gtk::Action> edit_action;
static Glib::RefPtr<Gtk::Action> edit_generic_action;
void paste_processor_state (const XMLNodeList&, boost::shared_ptr<ARDOUR::Processor>);
@@ -451,6 +593,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
static void rb_activate_all ();
static void rb_deactivate_all ();
static void rb_ab_plugins ();
+ static void rb_manage_pins ();
static void rb_edit ();
static void rb_edit_generic ();
@@ -464,6 +607,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
void set_processor_ui (boost::shared_ptr<ARDOUR::Processor>, Gtk::Window *);
void maybe_add_processor_to_ui_list (boost::weak_ptr<ARDOUR::Processor>);
+ void maybe_add_processor_pin_mgr (boost::weak_ptr<ARDOUR::Processor>);
bool one_processor_can_be_edited ();
bool processor_can_be_edited (boost::shared_ptr<ARDOUR::Processor>);
diff --git a/gtk2_ardour/public_editor.cc b/gtk2_ardour/public_editor.cc
index e88f273..6ac0ba3 100644
--- a/gtk2_ardour/public_editor.cc
+++ b/gtk2_ardour/public_editor.cc
@@ -19,6 +19,8 @@
#include "public_editor.h"
+#include "pbd/i18n.h"
+
PublicEditor* PublicEditor::_instance = 0;
const int PublicEditor::window_border_width = 12;
@@ -28,9 +30,8 @@ const int PublicEditor::horizontal_spacing = 6;
sigc::signal<void> PublicEditor::DropDownKeys;
-PublicEditor::PublicEditor ()
- : Window (Gtk::WINDOW_TOPLEVEL)
- , VisibilityTracker (*((Gtk::Window*)this))
+PublicEditor::PublicEditor (Gtk::Widget& content)
+ : Tabbable (content, _("Editor"))
, _suspend_route_redisplay_counter (0)
{
}
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index bcf98db..69c081b 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -32,16 +32,19 @@
#include <gtkmm/box.h>
#include <gtkmm/window.h>
#include <gtkmm/actiongroup.h>
+#include <gtkmm/notebook.h>
#include <sigc++/signal.h>
+#include "evoral/Beats.hpp"
#include "evoral/Note.hpp"
-#include "evoral/types.hpp"
#include "pbd/statefuldestructible.h"
#include "canvas/fwd.h"
#include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/tabbable.h"
#include "gtkmm2ext/visibility_tracker.h"
#include "editing.h"
@@ -54,6 +57,7 @@ namespace ARDOUR {
class RouteGroup;
class Trimmable;
class Movable;
+ class Stripable;
}
namespace Gtk {
@@ -61,10 +65,6 @@ namespace Gtk {
class Menu;
}
-namespace Gtkmm2ext {
- class TearOff;
-}
-
class AudioRegionView;
class AutomationLine;
class AutomationTimeAxisView;
@@ -80,6 +80,7 @@ class PluginUIWindow;
class RegionView;
class RouteTimeAxisView;
class Selection;
+class TempoCurve;
class TempoMarker;
class TimeAxisView;
class TimeAxisViewItem;
@@ -104,9 +105,9 @@ using ARDOUR::framecnt_t;
* of PublicEditor need not be recompiled if private methods or member variables
* change.
*/
-class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, public Gtkmm2ext::VisibilityTracker {
+class PublicEditor : public Gtkmm2ext::Tabbable {
public:
- PublicEditor ();
+ PublicEditor (Gtk::Widget& content);
virtual ~PublicEditor ();
/** @return Singleton PublicEditor instance */
@@ -199,6 +200,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual double sample_to_pixel (framepos_t frame) const = 0;
virtual double sample_to_pixel_unrounded (framepos_t frame) const = 0;
virtual Selection& get_selection () const = 0;
+ virtual bool get_selection_extents (framepos_t &start, framepos_t &end) const = 0;
virtual Selection& get_cut_buffer () const = 0;
virtual void track_mixer_selection () = 0;
virtual bool extend_selection_to_track (TimeAxisView&) = 0;
@@ -206,11 +208,14 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual void play_with_preroll () = 0;
virtual void maybe_locate_with_edit_preroll (framepos_t location) = 0;
virtual void goto_nth_marker (int nth) = 0;
+ virtual void trigger_script (int nth) = 0;
virtual void add_location_from_playhead_cursor () = 0;
virtual void remove_location_at_playhead_cursor () = 0;
virtual void set_show_measures (bool yn) = 0;
virtual bool show_measures () const = 0;
virtual void remove_tracks () = 0;
+ virtual void set_loop_range (framepos_t start, framepos_t end, std::string cmd) = 0;
+ virtual void set_punch_range (framepos_t start, framepos_t end, std::string cmd) = 0;
virtual Editing::MouseMode effective_mouse_mode () const = 0;
@@ -231,8 +236,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual void export_range () = 0;
virtual void register_actions () = 0;
- virtual void add_transport_frame (Gtk::Container&) = 0;
- virtual void add_toplevel_menu (Gtk::Container&) = 0;
virtual void set_zoom_focus (Editing::ZoomFocus) = 0;
virtual Editing::ZoomFocus get_zoom_focus () const = 0;
virtual framecnt_t get_current_zoom () const = 0;
@@ -266,8 +269,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
/** @return true if the playhead is currently being dragged, otherwise false */
virtual bool dragging_playhead () const = 0;
- virtual void ensure_float (Gtk::Window&) = 0;
- virtual void show_window () = 0;
virtual framepos_t leftmost_sample() const = 0;
virtual framecnt_t current_page_samples() const = 0;
virtual double visible_canvas_height () const = 0;
@@ -286,11 +287,9 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual void remove_last_capture () = 0;
virtual void maximise_editing_space () = 0;
virtual void restore_editing_space () = 0;
- virtual void update_tearoff_visibility () = 0;
- virtual void reattach_all_tearoffs () = 0;
virtual framepos_t get_preferred_edit_position (Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE, bool from_context_menu = false, bool from_outside_canvas = false) = 0;
virtual void toggle_meter_updating() = 0;
- virtual void split_regions_at (framepos_t, RegionSelection&) = 0;
+ virtual void split_regions_at (framepos_t, RegionSelection&, const int32_t sub_num) = 0;
virtual void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false) = 0;
virtual void mouse_add_new_marker (framepos_t where, bool is_cd=false) = 0;
virtual void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>) = 0;
@@ -299,6 +298,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual framecnt_t get_paste_offset (framepos_t pos, unsigned paste_count, framecnt_t duration) = 0;
virtual unsigned get_grid_beat_divisions(framepos_t position) = 0;
virtual Evoral::Beats get_grid_type_as_beats (bool& success, framepos_t position) = 0;
+ virtual unsigned get_grid_music_divisions (uint32_t event_state) = 0;
virtual void edit_notes (MidiRegionView*) = 0;
virtual void queue_visual_videotimeline_update () = 0;
@@ -325,7 +325,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
Glib::RefPtr<Gtk::ActionGroup> editor_menu_actions;
Glib::RefPtr<Gtk::ActionGroup> _region_actions;
- virtual void reset_focus () = 0;
+ virtual void reset_focus (Gtk::Widget*) = 0;
virtual bool canvas_scroll_event (GdkEventScroll* event, bool from_canvas) = 0;
virtual bool canvas_control_point_event (GdkEvent* event, ArdourCanvas::Item*, ControlPoint*) = 0;
@@ -349,6 +349,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual bool canvas_marker_event (GdkEvent* event, ArdourCanvas::Item*, ArdourMarker*) = 0;
virtual bool canvas_videotl_bar_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
virtual bool canvas_tempo_marker_event (GdkEvent* event, ArdourCanvas::Item*, TempoMarker*) = 0;
+ virtual bool canvas_tempo_curve_event (GdkEvent* event, ArdourCanvas::Item*, TempoCurve*) = 0;
virtual bool canvas_meter_marker_event (GdkEvent* event, ArdourCanvas::Item*, MeterMarker*) = 0;
virtual bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*) = 0;
@@ -364,15 +365,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
static const int vertical_spacing;
static const int horizontal_spacing;
-#ifdef TOP_MENUBAR
- /*
- * This is needed for OS X primarily
- * but also any other OS that uses a single
- * top menubar instead of per window menus
- */
- virtual Gtk::HBox& get_status_bar_packer() = 0;
-#endif
-
virtual ArdourCanvas::Container* get_trackview_group () const = 0;
virtual ArdourCanvas::ScrollGroup* get_hscroll_group () const = 0;
virtual ArdourCanvas::ScrollGroup* get_hvscroll_group () const = 0;
@@ -380,7 +372,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual ArdourCanvas::GtkCanvasViewport* get_track_canvas() const = 0;
- virtual TimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const = 0;
+ virtual TimeAxisView* axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable>) const = 0;
virtual void set_current_trimmable (boost::shared_ptr<ARDOUR::Trimmable>) = 0;
virtual void set_current_movable (boost::shared_ptr<ARDOUR::Movable>) = 0;
@@ -390,9 +382,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const = 0;
virtual TrackViewList const & get_track_views () = 0;
- virtual Gtkmm2ext::TearOff* mouse_mode_tearoff () const = 0;
- virtual Gtkmm2ext::TearOff* tools_tearoff () const = 0;
-
virtual DragManager* drags () const = 0;
virtual void maybe_autoscroll (bool, bool, bool from_headers) = 0;
virtual void stop_canvas_autoscroll () = 0;
@@ -405,6 +394,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual void abort_reversible_command () = 0;
virtual void commit_reversible_command () = 0;
+ virtual void access_action (std::string,std::string) = 0;
+
virtual MouseCursors const * cursors () const = 0;
virtual VerboseCursor * verbose_cursor () const = 0;
@@ -441,6 +432,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
PBD::Signal0<void> SnapChanged;
PBD::Signal0<void> MouseModeChanged;
+ Gtkmm2ext::Bindings* bindings;
+
protected:
friend class DisplaySuspender;
virtual void suspend_route_redisplay () = 0;
diff --git a/gtk2_ardour/quantize_dialog.cc b/gtk2_ardour/quantize_dialog.cc
index 82e3a1a..591d801 100644
--- a/gtk2_ardour/quantize_dialog.cc
+++ b/gtk2_ardour/quantize_dialog.cc
@@ -25,7 +25,7 @@
#include "quantize_dialog.h"
#include "public_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -37,8 +37,17 @@ static const gchar *_grid_strings[] = {
N_("Beats/128"),
N_("Beats/64"),
N_("Beats/32"),
+ N_("Beats/28"),
+ N_("Beats/24"),
+ N_("Beats/20"),
N_("Beats/16"),
+ N_("Beats/14"),
+ N_("Beats/12"),
+ N_("Beats/10"),
N_("Beats/8"),
+ N_("Beats/7"),
+ N_("Beats/6"),
+ N_("Beats/5"),
N_("Beats/4"),
N_("Beats/3"),
N_("Beats/2"),
@@ -138,24 +147,15 @@ QuantizeDialog::grid_size_to_musical_time (const string& txt) const
return b.to_double();
}
- if (txt == _("Beats/128")) {
- return 1.0/128.0;
- } else if (txt == _("Beats/64")) {
- return 1.0/64.0;
- } else if (txt == _("Beats/32")) {
- return 1.0/32.0;
- } else if (txt == _("Beats/16")) {
- return 1.0/16.0;
- } if (txt == _("Beats/8")) {
- return 1.0/8.0;
- } else if (txt == _("Beats/4")) {
- return 1.0/4.0;
- } else if (txt == _("Beats/3")) {
- return 1.0/3.0;
- } else if (txt == _("Beats/2")) {
- return 1.0/2.0;
- } else if (txt == _("Beats")) {
- return 1.0;
+ string::size_type slash;
+
+ if ((slash = txt.find ('/')) != string::npos) {
+ if (slash < txt.length() - 1) {
+ double divisor = PBD::atof (txt.substr (slash+1));
+ if (divisor != 0.0) {
+ return 1.0/divisor;
+ }
+ }
}
return 1.0;
diff --git a/gtk2_ardour/quantize_dialog.h b/gtk2_ardour/quantize_dialog.h
index 8203875..f162dd0 100644
--- a/gtk2_ardour/quantize_dialog.h
+++ b/gtk2_ardour/quantize_dialog.h
@@ -27,7 +27,6 @@
#include <gtkmm/checkbutton.h>
#include <gtkmm/spinbutton.h>
-#include "evoral/types.hpp"
#include "ardour/types.h"
#include "ardour_dialog.h"
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc
index 421e4c5..4d34b62 100644
--- a/gtk2_ardour/rc_option_editor.cc
+++ b/gtk2_ardour/rc_option_editor.cc
@@ -54,6 +54,8 @@
#include "ardour_window.h"
#include "ardour_dialog.h"
+#include "ardour_ui.h"
+#include "color_theme_manager.h"
#include "gui_thread.h"
#include "meter_patterns.h"
#include "midi_tracer.h"
@@ -64,7 +66,7 @@
#include "keyboard.h"
#include "theme_manager.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -76,7 +78,7 @@ using namespace ARDOUR_UI_UTILS;
class ClickOptions : public OptionEditorBox
{
public:
- ClickOptions (RCConfiguration* c, Gtk::Window* p)
+ ClickOptions (RCConfiguration* c)
: _rc_config (c)
, _click_browse_button (_("Browse..."))
, _click_emphasis_browse_button (_("Browse..."))
@@ -110,7 +112,7 @@ public:
sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
t->attach (_click_emphasis_browse_button, 2, 3, 3, 4, FILL);
- _box->pack_start (*t, false, false);
+ _box->pack_start (*t, true, false);
_click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed));
_click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed));
@@ -326,7 +328,7 @@ static const struct {
{ "Unmodified", 0 },
-#ifdef GTKOSX
+#ifdef __APPLE__
/* Command = Meta
Option/Alt = Mod1
@@ -373,7 +375,7 @@ public:
_insert_note_button_adjustment (3, 1, 5),
_insert_note_button_spin (_insert_note_button_adjustment)
{
- const Glib::ustring restart_msg = _("\nChanges to this setting will only persist after your project has been saved.");
+ const std::string restart_msg = _("\nChanges to this setting will only persist after your project has been saved.");
/* internationalize and prepare for use with combos */
vector<string> dumb;
@@ -514,7 +516,7 @@ public:
_copy_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::copy_modifier_chosen));
Gtkmm2ext::UI::instance()->set_tip (_copy_modifier_combo,
(string_compose (_("<b>Recommended Setting: %1</b>%2"),
-#ifdef GTKOSX
+#ifdef __APPLE__
Keyboard::secondary_modifier_name (),
#else
Keyboard::primary_modifier_name (),
@@ -541,7 +543,7 @@ public:
_constraint_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::constraint_modifier_chosen));
Gtkmm2ext::UI::instance()->set_tip (_constraint_modifier_combo,
(string_compose (_("<b>Recommended Setting: %1</b>%2"),
-#ifdef GTKOSX
+#ifdef __APPLE__
Keyboard::primary_modifier_name (),
#else
Keyboard::secondary_modifier_name (),
@@ -665,10 +667,10 @@ public:
/* ignore snap */
set_popdown_strings (_snap_modifier_combo, dumb);
_snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen));
-#ifdef GTKOSX
- Glib::ustring mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ());
+#ifdef __APPLE__
+ std::string mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ());
#else
- Glib::ustring mod_str = Keyboard::secondary_modifier_name();
+ std::string mod_str = Keyboard::secondary_modifier_name();
#endif
Gtkmm2ext::UI::instance()->set_tip (_snap_modifier_combo,
(string_compose (_("<b>Recommended Setting: %1</b>%2"), mod_str, restart_msg)));
@@ -691,7 +693,7 @@ public:
/* snap delta */
set_popdown_strings (_snap_delta_combo, dumb);
_snap_delta_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_delta_modifier_chosen));
-#ifdef GTKOSX
+#ifdef __APPLE__
mod_str = Keyboard::level4_modifier_name ();
#else
mod_str = string_compose (X_("%1-%2"), Keyboard::secondary_modifier_name (), Keyboard::level4_modifier_name ());
@@ -825,7 +827,7 @@ private:
string const txt = _edit_modifier_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
Keyboard::set_edit_modifier (modifiers[i].modifier);
break;
}
@@ -837,7 +839,7 @@ private:
string const txt = _delete_modifier_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
Keyboard::set_delete_modifier (modifiers[i].modifier);
break;
}
@@ -849,7 +851,7 @@ private:
string const txt = _copy_modifier_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
Keyboard::set_copy_modifier (modifiers[i].modifier);
break;
}
@@ -861,7 +863,7 @@ private:
string const txt = _insert_note_modifier_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
Keyboard::set_insert_note_modifier (modifiers[i].modifier);
break;
}
@@ -873,7 +875,7 @@ private:
string const txt = _snap_modifier_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
Keyboard::set_snap_modifier (modifiers[i].modifier);
break;
}
@@ -885,7 +887,7 @@ private:
string const txt = _snap_delta_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
Keyboard::set_snap_delta_modifier (modifiers[i].modifier);
break;
}
@@ -897,7 +899,7 @@ private:
string const txt = _constraint_modifier_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
ArdourKeyboard::set_constraint_modifier (modifiers[i].modifier);
break;
}
@@ -909,7 +911,7 @@ private:
string const txt = _trim_contents_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
ArdourKeyboard::set_trim_contents_modifier (modifiers[i].modifier);
break;
}
@@ -921,7 +923,7 @@ private:
string const txt = _trim_overlap_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
ArdourKeyboard::set_trim_overlap_modifier (modifiers[i].modifier);
break;
}
@@ -933,7 +935,7 @@ private:
string const txt = _trim_anchored_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
ArdourKeyboard::set_trim_anchored_modifier (modifiers[i].modifier);
break;
}
@@ -945,7 +947,7 @@ private:
string const txt = _fine_adjust_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
ArdourKeyboard::set_fine_adjust_modifier (modifiers[i].modifier);
break;
}
@@ -957,7 +959,7 @@ private:
string const txt = _push_points_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
ArdourKeyboard::set_push_points_modifier (modifiers[i].modifier);
break;
}
@@ -969,7 +971,7 @@ private:
string const txt = _note_size_relative_combo.get_active_text();
for (int i = 0; modifiers[i].name; ++i) {
- if (txt == _(modifiers[i].name)) {
+ if (txt == S_(modifiers[i].name)) {
ArdourKeyboard::set_note_size_relative_modifier (modifiers[i].modifier);
break;
}
@@ -1027,8 +1029,8 @@ public:
Label* l = manage (new Label (_("GUI and Font scaling:")));
l->set_name ("OptionsLabel");
- const Glib::ustring dflt = _("Default");
- const Glib::ustring empty = X_(""); // despite gtk-doc saying so, NULL does not work as reference
+ const std::string dflt = _("Default");
+ const std::string empty = X_(""); // despite gtk-doc saying so, NULL does not work as reference
_dpi_slider.set_name("FontScaleSlider");
_dpi_slider.set_update_policy (UPDATE_DISCONTINUOUS);
@@ -1343,9 +1345,8 @@ private:
class ControlSurfacesOptions : public OptionEditorBox
{
public:
- ControlSurfacesOptions (Gtk::Window& parent)
- : _parent (parent)
- , _ignore_view_change (0)
+ ControlSurfacesOptions ()
+ : _ignore_view_change (0)
{
_store = ListStore::create (_model);
_view.set_model (_store);
@@ -1361,7 +1362,7 @@ public:
edit_box->set_spacing(3);
_box->pack_start (*edit_box, false, false);
edit_box->show ();
-
+
Label* label = manage (new Label);
label->set_text (_("Click to edit the settings for selected protocol ( it must be ENABLED first ):"));
edit_box->pack_start (*label, false, false);
@@ -1431,7 +1432,7 @@ private:
else
edit_button->set_sensitive (false);
}
-
+
void view_changed (TreeModel::Path const &, TreeModel::iterator const & i)
{
TreeModel::Row r = *i;
@@ -1496,7 +1497,8 @@ private:
* or re-initializing a surface.
* tear_down_gui() hides an deletes the Window if it exists.
*/
- ArdourWindow* win = new ArdourWindow (_parent, title.get_string());
+ ArdourWindow* win = new ArdourWindow (*((Gtk::Window*) _view.get_toplevel()), title.get_string());
+ win->set_title ("Control Protocol Options");
win->add (*box);
box->show ();
win->present ();
@@ -1532,7 +1534,6 @@ private:
Glib::RefPtr<ListStore> _store;
ControlSurfacesModelColumns _model;
TreeView _view;
- Gtk::Window& _parent;
PBD::ScopedConnection protocol_status_connection;
uint32_t _ignore_view_change;
Gtk::Button* edit_button;
@@ -1546,45 +1547,78 @@ public:
, _show_video_export_info_button (_("Show Video Export Info before export"))
, _show_video_server_dialog_button (_("Show Video Server Startup Dialog"))
, _video_advanced_setup_button (_("Advanced Setup (remote video server)"))
+ , _xjadeo_browse_button (_("Browse..."))
{
- Table* t = manage (new Table (2, 6));
+ Table* t = manage (new Table (8, 4));
t->set_spacings (4);
- t->attach (_video_advanced_setup_button, 0, 2, 0, 1);
+ std::stringstream s;
+ s << "<b>" << _("Video Server") << "</b>";
+ Label* l = manage (new Label (s.str()));
+ l->set_use_markup (true);
+ l->set_alignment (0, 0.5);
+ t->attach (*l, 0, 4, 0, 1, EXPAND | FILL, FILL | EXPAND, 0, 8);
+
+ t->attach (_video_advanced_setup_button, 1, 4, 1, 2);
_video_advanced_setup_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::video_advanced_setup_toggled));
Gtkmm2ext::UI::instance()->set_tip (_video_advanced_setup_button,
_("<b>When enabled</b> you can speficify a custom video-server URL and docroot. - Do not enable this option unless you know what you are doing."));
- Label* l = manage (new Label (_("Video Server URL:")));
+ l = manage (new Label (_("Video Server URL:")));
l->set_alignment (0, 0.5);
- t->attach (*l, 0, 1, 1, 2, FILL);
- t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL);
+ t->attach (*l, 1, 2, 2, 3, FILL);
+ t->attach (_video_server_url_entry, 2, 4, 2, 3, FILL);
Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry,
_("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is running locally"));
l = manage (new Label (_("Video Folder:")));
l->set_alignment (0, 0.5);
- t->attach (*l, 0, 1, 2, 3, FILL);
- t->attach (_video_server_docroot_entry, 1, 2, 2, 3);
+ t->attach (*l, 1, 2, 3, 4, FILL);
+ t->attach (_video_server_docroot_entry, 2, 4, 3, 4);
Gtkmm2ext::UI::instance()->set_tip (_video_server_docroot_entry,
_("Local path to the video-server document-root. Only files below this directory will be accessible by the video-server. If the server run on a remote host, it should point to a network mounted folder of the server's docroot or be left empty if it is unvailable. It is used for the local video-monitor and file-browsing when opening/adding a video file."));
- /* small vspace y=3..4 */
-
- t->attach (_show_video_export_info_button, 0, 2, 4, 5);
+ t->attach (_show_video_export_info_button, 1, 4, 4, 5);
_show_video_export_info_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_export_info_toggled));
Gtkmm2ext::UI::instance()->set_tip (_show_video_export_info_button,
_("<b>When enabled</b> an information window with details is displayed before the video-export dialog."));
- t->attach (_show_video_server_dialog_button, 0, 2, 5, 6);
+ t->attach (_show_video_server_dialog_button, 1, 4, 5, 6);
_show_video_server_dialog_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_server_dialog_toggled));
Gtkmm2ext::UI::instance()->set_tip (_show_video_server_dialog_button,
_("<b>When enabled</b> the video server is never launched automatically without confirmation"));
+ s.str (std::string ());
+ s << "<b>" << _("Video Monitor") << "</b>";
+ l = manage (new Label (s.str()));
+ l->set_use_markup (true);
+ l->set_alignment (0, 0.5);
+ t->attach (*l, 0, 4, 6, 7, EXPAND | FILL, FILL | EXPAND, 0, 8);
+
+ l = manage (new Label (string_compose (_("Custom Path to Video Monitor (%1) - leave empty for default:"),
+#ifdef __APPLE__
+ "Jadeo.app"
+#elif defined PLATFORM_WINDOWS
+ "xjadeo.exe"
+#else
+ "xjadeo"
+#endif
+ )));
+ l->set_alignment (0, 0.5);
+ t->attach (*l, 1, 4, 7, 8, FILL);
+ t->attach (_custom_xjadeo_path, 2, 3, 8, 9);
+ Gtkmm2ext::UI::instance()->set_tip (_custom_xjadeo_path, _("Set a custom path to the Video Monitor Executable, changing this requires a restart."));
+ t->attach (_xjadeo_browse_button, 3, 4, 8, 9, FILL);
+
_video_server_url_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
_video_server_url_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
_video_server_docroot_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
_video_server_docroot_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
+ _custom_xjadeo_path.signal_changed().connect (sigc::mem_fun (*this, &VideoTimelineOptions::custom_xjadeo_path_changed));
+ _xjadeo_browse_button.signal_clicked ().connect (sigc::mem_fun (*this, &VideoTimelineOptions::xjadeo_browse_clicked));
+
+ // xjadeo-path is a UIConfig parameter
+ UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VideoTimelineOptions::parameter_changed));
_box->pack_start (*t,true,true);
}
@@ -1617,6 +1651,30 @@ public:
_rc_config->set_video_advanced_setup(x);
}
+ void custom_xjadeo_path_changed ()
+ {
+ UIConfiguration::instance().set_xjadeo_binary (_custom_xjadeo_path.get_text());
+ }
+
+ void xjadeo_browse_clicked ()
+ {
+ Gtk::FileChooserDialog dialog(_("Set Video Monitor Executable"), Gtk::FILE_CHOOSER_ACTION_OPEN);
+ dialog.set_filename (UIConfiguration::instance().get_xjadeo_binary());
+ dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+ dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
+ if (dialog.run () == Gtk::RESPONSE_OK) {
+ const std::string& filename = dialog.get_filename();
+ if (!filename.empty() && (
+#ifdef __APPLE__
+ Glib::file_test (filename + "/Contents/MacOS/xjadeo", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE) ||
+#endif
+ Glib::file_test (filename, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)
+ )) {
+ UIConfiguration::instance().set_xjadeo_binary (filename);
+ }
+ }
+ }
+
void parameter_changed (string const & p)
{
if (p == "video-server-url") {
@@ -1634,6 +1692,8 @@ public:
_video_advanced_setup_button.set_active(x);
_video_server_docroot_entry.set_sensitive(x);
_video_server_url_entry.set_sensitive(x);
+ } else if (p == "xjadeo-binary") {
+ _custom_xjadeo_path.set_text (UIConfiguration::instance().get_xjadeo_binary());
}
}
@@ -1645,15 +1705,84 @@ public:
parameter_changed ("show-video-export-info");
parameter_changed ("show-video-server-dialog");
parameter_changed ("video-advanced-setup");
+ parameter_changed ("xjadeo-binary");
}
private:
RCConfiguration* _rc_config;
Entry _video_server_url_entry;
Entry _video_server_docroot_entry;
+ Entry _custom_xjadeo_path;
CheckButton _show_video_export_info_button;
CheckButton _show_video_server_dialog_button;
CheckButton _video_advanced_setup_button;
+ Button _xjadeo_browse_button;
+};
+
+class ColumVisibilityOption : public Option
+{
+ public:
+ ColumVisibilityOption (string id, string name, uint32_t n_col, sigc::slot<uint32_t> get, sigc::slot<bool, uint32_t> set)
+ : Option (id, name)
+ , _heading (name)
+ , _n_col (n_col)
+ , _get (get)
+ , _set (set)
+ {
+ cb = (CheckButton**) malloc (sizeof (CheckButton*) * n_col);
+ for (uint32_t i = 0; i < n_col; ++i) {
+ CheckButton* col = manage (new CheckButton (string_compose (_("Column %1"), i + 1)));
+ col->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &ColumVisibilityOption::column_toggled), i));
+ _hbox.pack_start (*col);
+ cb[i] = col;
+ }
+ parameter_changed (id);
+ }
+
+ ~ColumVisibilityOption () {
+ free (cb);
+ }
+
+ Gtk::Widget& tip_widget() { return _hbox; }
+
+ void set_state_from_config ()
+ {
+ uint32_t c = _get();
+ for (uint32_t i = 0; i < _n_col; ++i) {
+ bool en = (c & (1<<i)) ? true : false;
+ if (cb[i]->get_active () != en) {
+ cb[i]->set_active (en);
+ }
+ }
+ }
+
+ void add_to_page (OptionEditorPage* p)
+ {
+ _heading.add_to_page (p);
+ add_widget_to_page (p, &_hbox);
+ }
+ private:
+
+ void column_toggled (int b) {
+ uint32_t c = _get();
+ uint32_t cc = c;
+ if (cb[b]->get_active ()) {
+ c |= (1<<b);
+ } else {
+ c &= ~(1<<b);
+ }
+ if (cc != c) {
+ _set (c);
+ }
+ }
+
+ HBox _hbox;
+ OptionEditorHeading _heading;
+
+ CheckButton** cb;
+ uint32_t _n_col;
+ sigc::slot<uint32_t> _get;
+ sigc::slot<bool, uint32_t> _set;
};
@@ -1720,10 +1849,21 @@ private:
RCOptionEditor::RCOptionEditor ()
- : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME))
+ : OptionEditorContainer (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME))
+ , Tabbable (*this, _("Preferences")) /* pack self-as-vbox into tabbable */
, _rc_config (Config)
, _mixer_strip_visibility ("mixer-element-visibility")
{
+ XMLNode* node = ARDOUR_UI::instance()->preferences_settings();
+ if (node) {
+ /* gcc4 complains about ambiguity with Gtk::Widget::set_state
+ (Gtk::StateType) here !!!
+ */
+ Tabbable::set_state (*node, Stateful::loading_state_version);
+ }
+
+ UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RCOptionEditor::parameter_changed));
+
/* MISC */
uint32_t hwcpus = hardware_concurrency ();
@@ -1798,11 +1938,11 @@ RCOptionEditor::RCOptionEditor ()
0, 1000, 1, 20
));
- add_option (_("Misc"), new OptionEditorHeading (_("Click")));
+ add_option (_("Misc/Click"), new OptionEditorHeading (_("Click")));
- add_option (_("Misc"), new ClickOptions (_rc_config, this));
+ add_option (_("Misc/Click"), new ClickOptions (_rc_config));
- add_option (_("Misc"),
+ add_option (_("Misc/Click"),
new FaderOption (
"click-gain",
_("Click gain level"),
@@ -1937,8 +2077,8 @@ RCOptionEditor::RCOptionEditor ()
psc->add (1.0, _("1.0 second"));
psc->add (2.0, _("2.0 seconds"));
add_option (_("Transport"), psc);
-
- add_option (_("Transport"), new OptionEditorHeading (S_("Sync/Slave")));
+
+ add_option (_("Transport/Sync"), new OptionEditorHeading (S_("Synchronization and Slave Options")));
_sync_source = new ComboOption<SyncSource> (
"sync-source",
@@ -1947,7 +2087,7 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source)
);
- add_option (_("Transport"), _sync_source);
+ add_option (_("Transport/Sync"), _sync_source);
_sync_framerate = new BoolOption (
"timecode-sync-frame-rate",
@@ -1963,7 +2103,7 @@ RCOptionEditor::RCOptionEditor ()
"Instead the frame rate indication in the main clock will flash red and %1 will convert between the external "
"timecode standard and the session standard."), PROGRAM_NAME));
- add_option (_("Transport"), _sync_framerate);
+ add_option (_("Transport/Sync"), _sync_framerate);
_sync_genlock = new BoolOption (
"timecode-source-is-synced",
@@ -1984,7 +2124,7 @@ RCOptionEditor::RCOptionEditor ()
), PROGRAM_NAME));
- add_option (_("Transport"), _sync_genlock);
+ add_option (_("Transport/Sync"), _sync_genlock);
_sync_source_2997 = new BoolOption (
"timecode-source-2997",
@@ -2002,9 +2142,9 @@ RCOptionEditor::RCOptionEditor ()
"because the variant of using exactly 29.97 fps has zero timecode drift.\n"
));
- add_option (_("Transport"), _sync_source_2997);
+ add_option (_("Transport/Sync"), _sync_source_2997);
- add_option (_("Transport"), new OptionEditorHeading (S_("LTC Reader")));
+ add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Reader")));
_ltc_port = new ComboStringOption (
"ltc-source-port",
@@ -2021,12 +2161,12 @@ RCOptionEditor::RCOptionEditor ()
populate_sync_options ();
AudioEngine::instance()->Running.connect (engine_started_connection, MISSING_INVALIDATOR, boost::bind (&RCOptionEditor::populate_sync_options, this), gui_context());
- add_option (_("Transport"), _ltc_port);
+ add_option (_("Transport/Sync"), _ltc_port);
// TODO; rather disable this button than not compile it..
- add_option (_("Transport"), new OptionEditorHeading (S_("LTC Generator")));
+ add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Generator")));
- add_option (_("Transport"),
+ add_option (_("Transport/Sync"),
new BoolOption (
"send-ltc",
_("Enable LTC generator"),
@@ -2052,9 +2192,9 @@ RCOptionEditor::RCOptionEditor ()
Gtkmm2ext::UI::instance()->set_tip
(_ltc_volume_slider->tip_widget(),
- _("Specify the Peak Volume of the generated LTC signal in dbFS. A good value is 0dBu ^= -18dbFS in an EBU calibrated system"));
+ _("Specify the Peak Volume of the generated LTC signal in dBFS. A good value is 0dBu ^= -18dBFS in an EBU calibrated system"));
- add_option (_("Transport"), _ltc_volume_slider);
+ add_option (_("Transport/Sync"), _ltc_volume_slider);
/* EDITOR */
@@ -2086,14 +2226,6 @@ RCOptionEditor::RCOptionEditor ()
add_option (_("Editor"),
new BoolOption (
- "show-track-meters",
- _("Show meters on tracks in the editor"),
- sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_track_meters),
- sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_track_meters)
- ));
-
- add_option (_("Editor"),
- new BoolOption (
"show-editor-meter",
_("Display master-meter in the toolbar"),
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_editor_meter),
@@ -2212,11 +2344,11 @@ if (!Profile->get_mixbus()) {
rsas->add(ExistingNewlyCreatedBoth, _("existing selection and newly-created regions"));
add_option (_("Editor"), rsas);
-
- add_option (_("Editor"), new OptionEditorHeading (_("Waveforms")));
+
+ add_option (_("Editor/Waveforms"), new OptionEditorHeading (_("Waveforms")));
if (!Profile->get_mixbus()) {
- add_option (_("Editor"),
+ add_option (_("Editor/Waveforms"),
new BoolOption (
"show-waveforms",
_("Show waveforms in regions"),
@@ -2225,7 +2357,7 @@ if (!Profile->get_mixbus()) {
));
} // !mixbus
- add_option (_("Editor"),
+ add_option (_("Editor/Waveforms"),
new BoolOption (
"show-waveforms-while-recording",
_("Show waveforms for audio while it is being recorded"),
@@ -2243,7 +2375,7 @@ if (!Profile->get_mixbus()) {
wfs->add (Linear, _("linear"));
wfs->add (Logarithmic, _("logarithmic"));
- add_option (_("Editor"), wfs);
+ add_option (_("Editor/Waveforms"), wfs);
ComboOption<WaveformShape>* wfsh = new ComboOption<WaveformShape> (
"waveform-shape",
@@ -2255,9 +2387,9 @@ if (!Profile->get_mixbus()) {
wfsh->add (Traditional, _("traditional"));
wfsh->add (Rectified, _("rectified"));
- add_option (_("Editor"), wfsh);
+ add_option (_("Editor/Waveforms"), wfsh);
- add_option (_("Editor"), new ClipLevelOptions ());
+ add_option (_("Editor/Waveforms"), new ClipLevelOptions ());
/* AUDIO */
@@ -2294,8 +2426,8 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode)
));
-if (!Profile->get_mixbus()) {
add_option (_("Audio"), new OptionEditorHeading (_("Connection of tracks and busses")));
+if (!Profile->get_mixbus()) {
add_option (_("Audio"),
new BoolOption (
@@ -2329,6 +2461,18 @@ if (!Profile->get_mixbus()) {
oac->add (ManualConnect, _("manually"));
add_option (_("Audio"), oac);
+
+ bo = new BoolOption (
+ "strict-io",
+ _("Use 'Strict-I/O' for new tracks or Busses"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_strict_io),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_strict_io)
+ );
+
+ add_option (_("Audio"), bo);
+ Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+ _("With strict-i/o enabled, Effect Processors will not modify the number of channels on a track. The number of output channels will always match the number of input channels."));
+
} // !mixbus
add_option (_("Audio"), new OptionEditorHeading (_("Denormals")));
@@ -2380,24 +2524,6 @@ if (!Profile->get_mixbus()) {
add_option (_("Audio"), dm);
- add_option (_("Audio"), new OptionEditorHeading (_("Plugins")));
-
- add_option (_("Audio"),
- new BoolOption (
- "plugins-stop-with-transport",
- _("Silence plugins when the transport is stopped"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport)
- ));
-
- add_option (_("Audio"),
- new BoolOption (
- "new-plugins-active",
- _("Make new plugins active"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active)
- ));
-
add_option (_("Audio"), new OptionEditorHeading (_("Regions")));
add_option (_("Audio"),
@@ -2418,7 +2544,7 @@ if (!Profile->get_mixbus()) {
/* SOLO AND MUTE */
- add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo")));
+ add_option (_("Solo & mute"), new OptionEditorHeading (_("Solo")));
_solo_control_is_listen_control = new BoolOption (
"solo-control-is-listen-control",
@@ -2427,9 +2553,9 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control)
);
- add_option (_("Solo / mute"), _solo_control_is_listen_control);
+ add_option (_("Solo & mute"), _solo_control_is_listen_control);
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new BoolOption (
"exclusive-solo",
_("Exclusive solo"),
@@ -2437,7 +2563,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo)
));
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new BoolOption (
"show-solo-mutes",
_("Show solo muting"),
@@ -2445,7 +2571,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes)
));
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new BoolOption (
"solo-mute-override",
_("Soloing overrides muting"),
@@ -2453,7 +2579,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override)
));
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new FaderOption (
"solo-mute-gain",
_("Solo-in-place mute cut (dB)"),
@@ -2471,7 +2597,7 @@ if (!Profile->get_mixbus()) {
_listen_position->add (AfterFaderListen, _("after-fader (AFL)"));
_listen_position->add (PreFaderListen, _("pre-fader (PFL)"));
- add_option (_("Solo / mute"), _listen_position);
+ add_option (_("Solo & mute"), _listen_position);
ComboOption<PFLPosition>* pp = new ComboOption<PFLPosition> (
"pfl-position",
@@ -2483,7 +2609,7 @@ if (!Profile->get_mixbus()) {
pp->add (PFLFromBeforeProcessors, _("before pre-fader processors"));
pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors"));
- add_option (_("Solo / mute"), pp);
+ add_option (_("Solo & mute"), pp);
ComboOption<AFLPosition>* pa = new ComboOption<AFLPosition> (
"afl-position",
@@ -2495,11 +2621,11 @@ if (!Profile->get_mixbus()) {
pa->add (AFLFromBeforeProcessors, _("immediately post-fader"));
pa->add (AFLFromAfterProcessors, _("after post-fader processors (before pan)"));
- add_option (_("Solo / mute"), pa);
+ add_option (_("Solo & mute"), pa);
- add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options")));
+ add_option (_("Solo & mute"), new OptionEditorHeading (_("Default track / bus muting options")));
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new BoolOption (
"mute-affects-pre-fader",
_("Mute affects pre-fader sends"),
@@ -2507,7 +2633,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_pre_fader)
));
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new BoolOption (
"mute-affects-post-fader",
_("Mute affects post-fader sends"),
@@ -2515,7 +2641,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader)
));
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new BoolOption (
"mute-affects-control-outs",
_("Mute affects control outputs"),
@@ -2523,7 +2649,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs)
));
- add_option (_("Solo / mute"),
+ add_option (_("Solo & mute"),
new BoolOption (
"mute-affects-main-outs",
_("Mute affects main outputs"),
@@ -2531,15 +2657,17 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs)
));
- add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing")));
- add_option (_("Solo / mute"),
+if (!ARDOUR::Profile->get_mixbus()) {
+ add_option (_("Solo & mute"), new OptionEditorHeading (_("Send Routing")));
+ add_option (_("Solo & mute"),
new BoolOption (
"link-send-and-route-panner",
_("Link panners of Aux and External Sends with main panner by default"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_send_and_route_panner),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner)
));
+}
add_option (_("MIDI"), new OptionEditorHeading (_("MIDI Preferences")));
@@ -2594,9 +2722,9 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback)
));
- add_option (_("MIDI"), new OptionEditorHeading (_("MIDI Clock")));
+ add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Clock")));
- add_option (_("MIDI"),
+ add_option (_("MIDI/Sync"),
new BoolOption (
"send-midi-clock",
_("Send MIDI Clock"),
@@ -2604,9 +2732,9 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_midi_clock)
));
- add_option (_("MIDI"), new OptionEditorHeading (_("MIDI Time Code (MTC)")));
+ add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Time Code (MTC)")));
- add_option (_("MIDI"),
+ add_option (_("MIDI/Sync"),
new BoolOption (
"send-mtc",
_("Send MIDI Time Code"),
@@ -2614,7 +2742,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc)
));
- add_option (_("MIDI"),
+ add_option (_("MIDI/Sync"),
new SpinOption<int> (
"mtc-qf-speed-tolerance",
_("Percentage either side of normal transport speed to transmit MTC"),
@@ -2623,9 +2751,9 @@ if (!Profile->get_mixbus()) {
0, 20, 1, 5
));
- add_option (_("MIDI"), new OptionEditorHeading (_("Midi Machine Control (MMC)")));
+ add_option (_("MIDI/Sync"), new OptionEditorHeading (_("Midi Machine Control (MMC)")));
- add_option (_("MIDI"),
+ add_option (_("MIDI/Sync"),
new BoolOption (
"mmc-control",
_("Obey MIDI Machine Control commands"),
@@ -2633,7 +2761,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control)
));
- add_option (_("MIDI"),
+ add_option (_("MIDI/Sync"),
new BoolOption (
"send-mmc",
_("Send MIDI Machine Control commands"),
@@ -2641,7 +2769,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mmc)
));
- add_option (_("MIDI"),
+ add_option (_("MIDI/Sync"),
new SpinOption<uint8_t> (
"mmc-receive-device-id",
_("Inbound MMC device ID"),
@@ -2650,7 +2778,7 @@ if (!Profile->get_mixbus()) {
0, 128, 1, 10
));
- add_option (_("MIDI"),
+ add_option (_("MIDI/Sync"),
new SpinOption<uint8_t> (
"mmc-send-device-id",
_("Outbound MMC device ID"),
@@ -2710,30 +2838,21 @@ if (!Profile->get_mixbus()) {
/* Control Surfaces */
- add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this));
-
- ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> (
- "remote-model",
- _("Control surface remote ID"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_remote_model),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_remote_model)
- );
-
- rm->add (UserOrdered, _("assigned by user"));
- rm->add (MixerOrdered, _("follows order of mixer"));
-
- add_option (_("Control Surfaces"), rm);
+ add_option (_("Control Surfaces"), new ControlSurfacesOptions);
/* VIDEO Timeline */
add_option (_("Video"), new VideoTimelineOptions (_rc_config));
#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT)
- add_option (_("Plugins"), new OptionEditorHeading (_("General")));
-
add_option (_("Plugins"),
new RcActionButton (_("Scan for Plugins"),
sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh)));
+#endif
+
+ add_option (_("Plugins"), new OptionEditorHeading (_("General")));
+
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT)
bo = new BoolOption (
"show-plugin-scan-window",
_("Always Display Plugin Scan Progress"),
@@ -2743,11 +2862,33 @@ if (!Profile->get_mixbus()) {
add_option (_("Plugins"), bo);
Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
_("<b>When enabled</b> a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)"));
-
#endif
+ bo = new BoolOption (
+ "plugins-stop-with-transport",
+ _("Silence plugins when the transport is stopped"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport)
+ );
+ add_option (_("Plugins"), bo);
+ Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+ _("<b>When enabled</b> plugins will be reset at transport stop. When disabled plugins will be left unchanged at transport stop.\n\nThis mostly affects plugins with a \"tail\" like Reverbs."));
+
+ bo = new BoolOption (
+ "new-plugins-active",
+ _("Make new plugins active"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active)
+ );
+ add_option (_("Plugins"), bo);
+ Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+ _("<b>When enabled</b> plugins will be activated when they are added to tracks/busses. When disabled plugins will be left inactive when they are added to tracks/busses"));
+
#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
- add_option (_("Plugins"), new OptionEditorHeading (_("VST")));
+ add_option (_("Plugins/VST"), new OptionEditorHeading (_("VST")));
+ add_option (_("Plugins/VST"),
+ new RcActionButton (_("Scan for Plugins"),
+ sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh)));
bo = new BoolOption (
"discover-vst-on-start",
@@ -2755,7 +2896,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::get_discover_vst_on_start),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_discover_vst_on_start)
);
- add_option (_("Plugins"), bo);
+ add_option (_("Plugins/VST"), bo);
Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
_("<b>When enabled</b> new VST plugins are searched, tested and added to the cache index on application start. When disabled new plugins will only be available after triggering a 'Scan' manually"));
@@ -2767,40 +2908,40 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (*_rc_config, &RCConfiguration::get_verbose_plugin_scan),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_verbose_plugin_scan)
);
- add_option (_("Plugins"), bo);
+ add_option (_("Plugins/VST"), bo);
Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
_("<b>When enabled</b> additional information for every plugin is added to the Log Window."));
#endif
- add_option (_("Plugins"), new VstTimeOutSliderOption (_rc_config));
+ add_option (_("Plugins/VST"), new VstTimeOutSliderOption (_rc_config));
- add_option (_("Plugins"),
+ add_option (_("Plugins/VST"),
new RcActionButton (_("Clear"),
sigc::mem_fun (*this, &RCOptionEditor::clear_vst_cache),
_("VST Cache:")));
- add_option (_("Plugins"),
+ add_option (_("Plugins/VST"),
new RcActionButton (_("Clear"),
sigc::mem_fun (*this, &RCOptionEditor::clear_vst_blacklist),
_("VST Blacklist:")));
#endif
#ifdef LXVST_SUPPORT
- add_option (_("Plugins"),
+ add_option (_("Plugins/VST"),
new RcActionButton (_("Edit"),
sigc::mem_fun (*this, &RCOptionEditor::edit_lxvst_path),
_("Linux VST Path:")));
- add_option (_("Plugins"),
+ add_option (_("Plugins/VST"),
new RcConfigDisplay (
"plugin-path-lxvst",
_("Path:"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugin_path_lxvst),
- ':'));
+ 0));
#endif
#ifdef WINDOWS_VST_SUPPORT
- add_option (_("Plugins"),
+ add_option (_("Plugins/VST"),
new RcActionButton (_("Edit"),
sigc::mem_fun (*this, &RCOptionEditor::edit_vst_path),
_("Windows VST Path:")));
@@ -2813,7 +2954,11 @@ if (!Profile->get_mixbus()) {
#endif
#ifdef AUDIOUNIT_SUPPORT
- add_option (_("Plugins"), new OptionEditorHeading (_("Audio Unit")));
+
+ add_option (_("Plugins/Audio Unit"), new OptionEditorHeading (_("Audio Unit")));
+ add_option (_("Plugins/Audio Unit"),
+ new RcActionButton (_("Scan for Plugins"),
+ sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh)));
bo = new BoolOption (
"discover-audio-units",
@@ -2825,12 +2970,12 @@ if (!Profile->get_mixbus()) {
Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
_("<b>When enabled</b> Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it."));
- add_option (_("Plugins"),
+ add_option (_("Plugins/Audio Unit"),
new RcActionButton (_("Clear"),
sigc::mem_fun (*this, &RCOptionEditor::clear_au_cache),
_("AU Cache:")));
- add_option (_("Plugins"),
+ add_option (_("Plugins/Audio Unit"),
new RcActionButton (_("Clear"),
sigc::mem_fun (*this, &RCOptionEditor::clear_au_blacklist),
_("AU Blacklist:")));
@@ -2842,9 +2987,48 @@ if (!Profile->get_mixbus()) {
new BoolOption (
"open-gui-after-adding-plugin",
_("Automatically open the plugin GUI when adding a new plugin"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_open_gui_after_adding_plugin),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_open_gui_after_adding_plugin)
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_open_gui_after_adding_plugin),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_open_gui_after_adding_plugin)
));
+
+#if (defined LV2_SUPPORT && defined LV2_EXTENDED)
+ add_option (_("Plugins"),
+ new BoolOption (
+ "show-inline-display-by-default",
+ _("Show Plugin Inline Display on Mixerstrip by default"),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_inline_display_by_default),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_inline_display_by_default)
+ ));
+
+ _plugin_prefer_inline = new BoolOption (
+ "prefer-inline-over-gui",
+ _("Don't automatically open the plugin GUI when the plugin has an inline display mode"),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_prefer_inline_over_gui),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_prefer_inline_over_gui)
+ );
+ add_option (_("Plugins"), _plugin_prefer_inline);
+#endif
+
+ add_option (_("Plugins"), new OptionEditorHeading (_("Instrument")));
+
+ bo = new BoolOption (
+ "ask-replace-instrument",
+ _("Ask to replace existing instrument plugin"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_ask_replace_instrument),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_ask_replace_instrument)
+ );
+ add_option (_("Plugins"), bo);
+
+ bo = new BoolOption (
+ "ask-setup_instrument",
+ _("Interactively configure instrument plugins on insert"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_ask_setup_instrument),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_ask_setup_instrument)
+ );
+ add_option (_("Plugins"), bo);
+ Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+ _("<b>When enabled</b> show a dialog to select instrument channel configuration before adding a multichannel plugin."));
+
#endif
/* INTERFACE */
@@ -2876,13 +3060,20 @@ if (!Profile->get_mixbus()) {
add_option (S_("Preferences|GUI"),
new BoolOption (
+ "use-wm-visibility",
+ _("Use Window Manager/Desktop visibility information"),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_wm_visibility),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_wm_visibility)
+ ));
+
+ add_option (S_("Preferences|GUI"),
+ new BoolOption (
"widget-prelight",
_("Graphically indicate mouse pointer hovering over various widgets"),
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_widget_prelight),
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_widget_prelight)
));
-#ifdef TOOLTIPS_GOT_FIXED
add_option (S_("Preferences|GUI"),
new BoolOption (
"use-tooltips",
@@ -2890,7 +3081,6 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_tooltips),
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_tooltips)
));
-#endif
add_option (S_("Preferences|GUI"),
new BoolOption (
@@ -2900,7 +3090,7 @@ if (!Profile->get_mixbus()) {
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_name_highlight)
));
- add_option (S_("GUI"),
+ add_option (S_("Preferences|GUI"),
new BoolOption (
"super-rapid-clock-update",
_("Update transport clock display at FPS instead of every 100ms"),
@@ -2909,7 +3099,7 @@ if (!Profile->get_mixbus()) {
));
-#ifndef GTKOSX
+#ifndef __APPLE__
/* font scaling does nothing with GDK/Quartz */
add_option (S_("Preferences|GUI"), new FontScalingOptions ());
#endif
@@ -2955,6 +3145,7 @@ if (!ARDOUR::Profile->get_mixbus()) {
_mixer_strip_visibility.add (0, X_("SoloIsoLock"), _("Solo Iso / Lock"));
_mixer_strip_visibility.add (0, X_("Output"), _("Output"));
_mixer_strip_visibility.add (0, X_("Comments"), _("Comments"));
+ _mixer_strip_visibility.add (0, X_("VCA"), _("VCA Assigns"));
add_option (
S_("Preferences|GUI"),
@@ -2974,6 +3165,14 @@ if (!ARDOUR::Profile->get_mixbus()) {
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_default_narrow_ms)
));
+ add_option (S_("Preferences|GUI"),
+ new ColumVisibilityOption (
+ "action-table-columns", _("Action Script Button Visibility"), 3,
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_action_table_columns),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_action_table_columns)
+ )
+ );
+
add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Metering")));
ComboOption<float>* mht = new ComboOption<float> (
@@ -3111,7 +3310,7 @@ if (!ARDOUR::Profile->get_mixbus()) {
Gtkmm2ext::UI::instance()->set_tip
(mpks->tip_widget(),
- _("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red."));
+ _("Specify the audio signal level in dBFS at and above which the meter-peak indicator will flash red."));
add_option (S_("Preferences|Metering"), mpks);
@@ -3123,15 +3322,46 @@ if (!ARDOUR::Profile->get_mixbus()) {
sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_style_led)
));
+ add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Editor Meters")));
+
+ add_option (S_("Preferences|Metering"),
+ new BoolOption (
+ "show-track-meters",
+ _("Show meters on tracks in the editor"),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_track_meters),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_track_meters)
+ ));
+
+ add_option (S_("Preferences|Metering"),
+ new BoolOption (
+ "editor-stereo-only-meters",
+ _("Show at most stereo meters in the track-header"),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_editor_stereo_only_meters),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_editor_stereo_only_meters)
+ ));
+
+ add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Post Export Analysis")));
+
+ add_option (S_("Preferences|Metering"),
+ new BoolOption (
+ "save-export-analysis-image",
+ _("Save loudness analysis as image file"),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_save_export_analysis_image),
+ sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_save_export_analysis_image)
+ ));
+
/* and now the theme manager */
ThemeManager* tm = manage (new ThemeManager);
add_page (_("Theme"), *tm);
+ add_option (_("Theme/Colors"), new ColorThemeManager);
+
//trigger some parameter-changed messages which affect widget-visibility or -sensitivity
parameter_changed ("send-ltc");
parameter_changed ("sync-source");
parameter_changed ("use-monitor-bus");
+ parameter_changed ("open-gui-after-adding-plugin");
}
void
@@ -3169,6 +3399,10 @@ RCOptionEditor::parameter_changed (string const & p)
bool const s = Config->get_send_ltc ();
_ltc_send_continuously->set_sensitive (s);
_ltc_volume_slider->set_sensitive (s);
+ } else if (p == "open-gui-after-adding-plugin" || p == "show-inline-display-by-default") {
+#if (defined LV2_SUPPORT && defined LV2_EXTENDED)
+ _plugin_prefer_inline->set_sensitive (UIConfiguration::instance().get_open_gui_after_adding_plugin() && UIConfiguration::instance().get_show_inline_display_by_default());
+#endif
}
}
@@ -3199,10 +3433,10 @@ void RCOptionEditor::clear_au_blacklist () {
void RCOptionEditor::edit_lxvst_path () {
Glib::RefPtr<Gdk::Window> win = get_parent_window ();
Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog (
- *this, _("Set Linux VST Search Path"),
- _rc_config->get_plugin_path_lxvst(),
- PluginManager::instance().get_default_lxvst_path()
- );
+ *current_toplevel(), _("Set Linux VST Search Path"),
+ _rc_config->get_plugin_path_lxvst(),
+ PluginManager::instance().get_default_lxvst_path()
+ );
ResponseType r = (ResponseType) pd->run ();
pd->hide();
if (r == RESPONSE_ACCEPT) {
@@ -3213,10 +3447,10 @@ void RCOptionEditor::edit_lxvst_path () {
void RCOptionEditor::edit_vst_path () {
Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog (
- *this, _("Set Windows VST Search Path"),
- _rc_config->get_plugin_path_vst(),
- PluginManager::instance().get_default_windows_vst_path()
- );
+ *current_toplevel(), _("Set Windows VST Search Path"),
+ _rc_config->get_plugin_path_vst(),
+ PluginManager::instance().get_default_windows_vst_path()
+ );
ResponseType r = (ResponseType) pd->run ();
pd->hide();
if (r == RESPONSE_ACCEPT) {
@@ -3247,3 +3481,26 @@ RCOptionEditor::populate_sync_options ()
parameter_changed ("sync-source");
}
+
+Gtk::Window*
+RCOptionEditor::use_own_window (bool and_fill_it)
+{
+ bool new_window = !own_window();
+
+ Gtk::Window* win = Tabbable::use_own_window (and_fill_it);
+
+ if (win && new_window) {
+ win->set_name ("PreferencesWindow");
+ ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Preferences"), this);
+ }
+
+ return win;
+}
+
+XMLNode&
+RCOptionEditor::get_state ()
+{
+ XMLNode* node = new XMLNode (X_("Preferences"));
+ node->add_child_nocopy (Tabbable::get_state());
+ return *node;
+}
diff --git a/gtk2_ardour/rc_option_editor.h b/gtk2_ardour/rc_option_editor.h
index 1b543e3..d6c5bed 100644
--- a/gtk2_ardour/rc_option_editor.h
+++ b/gtk2_ardour/rc_option_editor.h
@@ -20,6 +20,8 @@
#ifndef __gtk_ardour_rc_option_editor_h__
#define __gtk_ardour_rc_option_editor_h__
+#include "gtkmm2ext/tabbable.h"
+
#include "option_editor.h"
#include "visibility_group.h"
@@ -32,13 +34,16 @@
*/
/** Editor for options which are obtained from and written back to one of the .rc files. */
-class RCOptionEditor : public OptionEditor
+class RCOptionEditor : public OptionEditorContainer, public ARDOUR::SessionHandlePtr, public Gtkmm2ext::Tabbable
{
public:
RCOptionEditor ();
void populate_sync_options ();
+ Gtk::Window* use_own_window (bool and_fill_it);
+ XMLNode& get_state ();
+
private:
void parameter_changed (std::string const &);
void ltc_generator_volume_changed ();
@@ -54,6 +59,7 @@ private:
HSliderOption* _ltc_volume_slider;
Gtk::Adjustment* _ltc_volume_adjustment;
BoolOption* _ltc_send_continuously;
+ BoolOption* _plugin_prefer_inline;
PBD::ScopedConnection parameter_change_connection;
PBD::ScopedConnection engine_started_connection;
diff --git a/gtk2_ardour/region_editor.cc b/gtk2_ardour/region_editor.cc
index 725e5c3..596f600 100644
--- a/gtk2_ardour/region_editor.cc
+++ b/gtk2_ardour/region_editor.cc
@@ -36,7 +36,7 @@
#include "public_editor.h"
#include "tooltips.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
diff --git a/gtk2_ardour/region_gain_line.cc b/gtk2_ardour/region_gain_line.cc
index dc1c14e..fd09119 100644
--- a/gtk2_ardour/region_gain_line.cc
+++ b/gtk2_ardour/region_gain_line.cc
@@ -32,7 +32,7 @@
#include "editor.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/region_layering_order_editor.cc b/gtk2_ardour/region_layering_order_editor.cc
index 759b69f..e58c7c9 100644
--- a/gtk2_ardour/region_layering_order_editor.cc
+++ b/gtk2_ardour/region_layering_order_editor.cc
@@ -31,7 +31,7 @@
#include "region_layering_order_editor.h"
#include "region_view.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -128,7 +128,7 @@ RegionLayeringOrderEditor::row_selected ()
RegionView* rv = row[layering_order_columns.region_view];
vector<RegionView*> eq;
- editor.get_equivalent_regions (rv, eq, Properties::select.property_id);
+ editor.get_equivalent_regions (rv, eq, Properties::group_select.property_id);
/* XXX this should be reversible, really */
@@ -222,7 +222,7 @@ RegionLayeringOrderEditor::on_key_press_event (GdkEventKey* ev)
}
if (!handled) {
- handled = key_press_focus_accelerator_handler (editor, ev);
+ handled = relay_key_press (ev, this);
}
if (!handled) {
diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc
index 1536dd6..2a3a307 100644
--- a/gtk2_ardour/region_selection.cc
+++ b/gtk2_ardour/region_selection.cc
@@ -303,3 +303,13 @@ RegionSelection::n_midi_regions () const
return count;
}
+
+ARDOUR::RegionList
+RegionSelection::regionlist () const
+{
+ ARDOUR::RegionList rl;
+ for (const_iterator r = begin (); r != end (); ++r) {
+ rl.push_back ((*r)->region ());
+ }
+ return rl;
+}
diff --git a/gtk2_ardour/region_selection.h b/gtk2_ardour/region_selection.h
index 062557e..3bbbe8c 100644
--- a/gtk2_ardour/region_selection.h
+++ b/gtk2_ardour/region_selection.h
@@ -66,6 +66,8 @@ class RegionSelection : public std::list<RegionView*>
std::set<boost::shared_ptr<ARDOUR::Playlist> > playlists () const;
std::list<PBD::ID> pending;
+ ARDOUR::RegionList regionlist () const;
+
private:
void remove_it (RegionView*);
diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc
index 3312fc3..27e1611 100644
--- a/gtk2_ardour/region_view.cc
+++ b/gtk2_ardour/region_view.cc
@@ -48,7 +48,7 @@
#include "rgb_macros.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -178,13 +178,14 @@ RegionView::init (bool wfd)
_enable_display = true;
}
- set_height (trackview.current_height());
+ /* derived class calls set_height () including RegionView::set_height() in ::init() */
+ //set_height (trackview.current_height());
_region->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RegionView::region_changed, this, _1), gui_context());
- set_colors ();
-
- UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &RegionView::color_handler));
+ /* derived class calls set_colors () including RegionView::set_colors() in ::init() */
+ //set_colors ();
+ //UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &RegionView::color_handler));
/* XXX sync mark drag? */
}
@@ -381,10 +382,6 @@ RegionView::region_changed (const PropertyChange& what_changed)
if (what_changed.contains (ARDOUR::Properties::locked)) {
region_locked ();
}
- if (what_changed.contains (ARDOUR::Properties::locked)) {
- /* name will show locked status */
- region_renamed ();
- }
}
void
@@ -592,7 +589,6 @@ RegionView::region_renamed ()
set_item_name (str, this);
set_name_text (str);
- reset_width_dependent_items (_pixel_width);
}
void
@@ -779,13 +775,13 @@ RegionView::update_coverage_frames (LayerDisplay d)
/* the color that will be used to show parts of regions that will not be heard */
uint32_t const non_playing_color = UIConfiguration::instance().color_mod ("covered region", "covered region base");
+
while (t < end) {
t++;
/* is this region is on top at time t? */
bool const new_me = (pl->top_unmuted_region_at (t) == _region);
-
/* finish off any old rect, if required */
if (cr && me != new_me) {
cr->set_x1 (trackview.editor().sample_to_pixel (t - position));
@@ -806,11 +802,15 @@ RegionView::update_coverage_frames (LayerDisplay d)
cr->set_fill_color (non_playing_color);
}
}
-
t = pl->find_next_region_boundary (t, 1);
+ if (t < 0) {
+ break;
+ }
me = new_me;
}
+ t = pl->find_next_region_boundary (t, 1);
+
if (cr) {
/* finish off the last rectangle */
cr->set_x1 (trackview.editor().sample_to_pixel (end - position));
@@ -834,7 +834,7 @@ RegionView::update_coverage_frames (LayerDisplay d)
}
bool
-RegionView::trim_front (framepos_t new_bound, bool no_overlap)
+RegionView::trim_front (framepos_t new_bound, bool no_overlap, const int32_t sub_num)
{
if (_region->locked()) {
return false;
@@ -845,7 +845,13 @@ RegionView::trim_front (framepos_t new_bound, bool no_overlap)
framepos_t const pre_trim_first_frame = _region->first_frame();
- _region->trim_front ((framepos_t) (new_bound * speed));
+ const framepos_t speed_bound = (framepos_t) (new_bound * speed);
+
+ if (_region->position() == speed_bound) {
+ return false;
+ }
+
+ _region->trim_front (speed_bound, sub_num);
if (no_overlap) {
// Get the next region on the left of this region and shrink/expand it.
@@ -870,7 +876,7 @@ RegionView::trim_front (framepos_t new_bound, bool no_overlap)
}
bool
-RegionView::trim_end (framepos_t new_bound, bool no_overlap)
+RegionView::trim_end (framepos_t new_bound, bool no_overlap, const int32_t sub_num)
{
if (_region->locked()) {
return false;
@@ -881,7 +887,7 @@ RegionView::trim_end (framepos_t new_bound, bool no_overlap)
framepos_t const pre_trim_last_frame = _region->last_frame();
- _region->trim_end ((framepos_t) (new_bound * speed));
+ _region->trim_end ((framepos_t) (new_bound * speed), sub_num);
if (no_overlap) {
// Get the next region on the right of this region and shrink/expand it.
@@ -896,7 +902,7 @@ RegionView::trim_end (framepos_t new_bound, bool no_overlap)
// Only trim region on the right if the last frame has gone beyond the right region's first frame.
if (region_right != 0 && (region_right->first_frame() < _region->last_frame() || regions_touching)) {
- region_right->trim_front (_region->last_frame() + 1);
+ region_right->trim_front (_region->last_frame() + 1, sub_num);
}
region_changed (ARDOUR::bounds_change);
diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h
index f17e37a..7fad731 100644
--- a/gtk2_ardour/region_view.h
+++ b/gtk2_ardour/region_view.h
@@ -102,12 +102,12 @@ class RegionView : public TimeAxisViewItem
/** Called when a front trim is about to begin */
virtual void trim_front_starting () {}
- bool trim_front (framepos_t, bool);
+ bool trim_front (framepos_t, bool, const int32_t sub_num);
/** Called when a start trim has finished */
virtual void trim_front_ending () {}
- bool trim_end (framepos_t, bool);
+ bool trim_end (framepos_t, bool, const int32_t sub_num);
void move_contents (ARDOUR::frameoffset_t);
virtual void thaw_after_trim ();
diff --git a/gtk2_ardour/icons/ardour_icon_16px.png b/gtk2_ardour/resources/Ardour-icon_16px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_16px.png
rename to gtk2_ardour/resources/Ardour-icon_16px.png
diff --git a/gtk2_ardour/icons/ardour_icon_22px.png b/gtk2_ardour/resources/Ardour-icon_22px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_22px.png
rename to gtk2_ardour/resources/Ardour-icon_22px.png
diff --git a/gtk2_ardour/icons/ardour_icon_256px.png b/gtk2_ardour/resources/Ardour-icon_256px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_256px.png
rename to gtk2_ardour/resources/Ardour-icon_256px.png
diff --git a/gtk2_ardour/icons/ardour_icon_32px.png b/gtk2_ardour/resources/Ardour-icon_32px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_32px.png
rename to gtk2_ardour/resources/Ardour-icon_32px.png
diff --git a/gtk2_ardour/icons/ardour_icon_48px.png b/gtk2_ardour/resources/Ardour-icon_48px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_48px.png
rename to gtk2_ardour/resources/Ardour-icon_48px.png
diff --git a/gtk2_ardour/icons/ardour_icon_512px.png b/gtk2_ardour/resources/Ardour-icon_512px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_512px.png
rename to gtk2_ardour/resources/Ardour-icon_512px.png
diff --git a/gtk2_ardour/small-splash.png b/gtk2_ardour/resources/Ardour-small-splash.png
similarity index 100%
rename from gtk2_ardour/small-splash.png
rename to gtk2_ardour/resources/Ardour-small-splash.png
diff --git a/gtk2_ardour/splash.png b/gtk2_ardour/resources/Ardour-splash.png
similarity index 100%
rename from gtk2_ardour/splash.png
rename to gtk2_ardour/resources/Ardour-splash.png
diff --git a/gtk2_ardour/return_ui.cc b/gtk2_ardour/return_ui.cc
index 301ecda..a6b27f7 100644
--- a/gtk2_ardour/return_ui.cc
+++ b/gtk2_ardour/return_ui.cc
@@ -28,7 +28,7 @@
#include "gui_thread.h"
#include "timers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/rhythm_ferret.cc b/gtk2_ardour/rhythm_ferret.cc
index 57e7632..4d39232 100644
--- a/gtk2_ardour/rhythm_ferret.cc
+++ b/gtk2_ardour/rhythm_ferret.cc
@@ -33,7 +33,7 @@
#include "editor.h"
#include "time_axis_view.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -58,20 +58,25 @@ static const gchar * _onset_function_strings[] = {
N_("Phase Deviation"),
N_("Kullback-Liebler"),
N_("Modified Kullback-Liebler"),
+#ifdef HAVE_AUBIO4
+ N_("Spectral Flux"),
+#endif
0
};
static const gchar * _operation_strings[] = {
N_("Split region"),
+#if 0 // these don't do what a user expects
N_("Snap regions"),
N_("Conform regions"),
+#endif
0
};
RhythmFerret::RhythmFerret (Editor& e)
: ArdourDialog (_("Rhythm Ferret"))
, editor (e)
- , detection_threshold_adjustment (0.015, 0.0, 0.1, 0.001, 0.1)
+ , detection_threshold_adjustment (-35, -80, -6, 1, 6)
, detection_threshold_scale (detection_threshold_adjustment)
, sensitivity_adjustment (40, 0, 100, 1, 10)
, sensitivity_scale (sensitivity_adjustment)
@@ -80,6 +85,10 @@ RhythmFerret::RhythmFerret (Editor& e)
, peak_picker_threshold_scale (peak_picker_threshold_adjustment)
, silence_threshold_adjustment (-90.0, -120.0, 0.0, 1, 10)
, silence_threshold_scale (silence_threshold_adjustment)
+#ifdef HAVE_AUBIO4
+ , minioi_adjustment (4, 0, 40, 1, 5)
+ , minioi_scale (minioi_adjustment)
+#endif
, trigger_gap_adjustment (3, 0, 100, 1, 10)
, trigger_gap_spinner (trigger_gap_adjustment)
, action_button (Stock::APPLY)
@@ -114,19 +123,13 @@ RhythmFerret::RhythmFerret (Editor& e)
t->attach (onset_detection_function_selector, 1, 2, n, n + 1, FILL);
++n;
- t->attach (*manage (new Label (_("Trigger gap"), 1, 0.5)), 0, 1, n, n + 1, FILL);
+ t->attach (*manage (new Label (_("Trigger gap (postproc)"), 1, 0.5)), 0, 1, n, n + 1, FILL);
t->attach (trigger_gap_spinner, 1, 2, n, n + 1, FILL);
t->attach (*manage (new Label (_("ms"))), 2, 3, n, n + 1, FILL);
++n;
- t->attach (*manage (new Label (_("Threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
- t->attach (detection_threshold_scale, 1, 2, n, n + 1, FILL);
- t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
- ++n;
-
t->attach (*manage (new Label (_("Peak threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
t->attach (peak_picker_threshold_scale, 1, 2, n, n + 1, FILL);
- t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
++n;
t->attach (*manage (new Label (_("Silence threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
@@ -134,10 +137,23 @@ RhythmFerret::RhythmFerret (Editor& e)
t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
++n;
+#ifdef HAVE_AUBIO4
+ t->attach (*manage (new Label (_("Min Inter-Onset Time"), 1, 0.5)), 0, 1, n, n + 1, FILL);
+ t->attach (minioi_scale, 1, 2, n, n + 1, FILL);
+ t->attach (*manage (new Label (_("ms"))), 2, 3, n, n + 1, FILL);
+ ++n;
+#endif
+
+
t->attach (*manage (new Label (_("Sensitivity"), 1, 0.5)), 0, 1, n, n + 1, FILL);
t->attach (sensitivity_scale, 1, 2, n, n + 1, FILL);
++n;
+ t->attach (*manage (new Label (_("Cut Pos Threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
+ t->attach (detection_threshold_scale, 1, 2, n, n + 1, FILL);
+ t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
+ ++n;
+
t->attach (*manage (new Label (_("Operation"), 1, 0.5)), 0, 1, n, n + 1, FILL);
t->attach (operation_selector, 1, 2, n, n + 1, FILL);
++n;
@@ -161,12 +177,16 @@ RhythmFerret::analysis_mode_changed ()
{
bool const perc = get_analysis_mode() == PercussionOnset;
- trigger_gap_spinner.set_sensitive (!perc);
+ // would be nice to actually hide/show the rows.
detection_threshold_scale.set_sensitive (perc);
sensitivity_scale.set_sensitive (perc);
+ trigger_gap_spinner.set_sensitive (!perc);
onset_detection_function_selector.set_sensitive (!perc);
peak_picker_threshold_scale.set_sensitive (!perc);
silence_threshold_scale.set_sensitive (!perc);
+#ifdef HAVE_AUBIO4
+ minioi_scale.set_sensitive (!perc);
+#endif
}
RhythmFerret::AnalysisMode
@@ -225,7 +245,7 @@ RhythmFerret::run_analysis ()
break;
}
- (*i)->region()->set_transients (current_results);
+ (*i)->region()->set_onsets (current_results);
current_results.clear();
}
}
@@ -240,8 +260,10 @@ RhythmFerret::run_percussion_onset_analysis (boost::shared_ptr<Readable> readabl
AnalysisFeatureList these_results;
t.reset ();
- t.set_threshold (detection_threshold_adjustment.get_value());
- t.set_sensitivity (sensitivity_adjustment.get_value());
+ float dB = detection_threshold_adjustment.get_value();
+ float coeff = dB > -80.0f ? pow (10.0f, dB * 0.05f) : 0.0f;
+ t.set_threshold (coeff);
+ t.set_sensitivity (4, sensitivity_adjustment.get_value());
if (t.run ("", readable.get(), i, these_results)) {
continue;
@@ -287,11 +309,15 @@ RhythmFerret::run_note_onset_analysis (boost::shared_ptr<Readable> readable, fra
AnalysisFeatureList these_results;
- t.reset ();
-
t.set_function (get_note_onset_function());
t.set_silence_threshold (silence_threshold_adjustment.get_value());
t.set_peak_threshold (peak_picker_threshold_adjustment.get_value());
+#ifdef HAVE_AUBIO4
+ t.set_minioi (minioi_adjustment.get_value());
+#endif
+
+ // aubio-vamp only picks up new settings on reset.
+ t.reset ();
if (t.run ("", readable.get(), i, these_results)) {
continue;
@@ -327,6 +353,7 @@ RhythmFerret::do_action ()
do_split_action ();
break;
case SnapRegionsToGrid:
+ // split first, select all.. ?!
editor.snap_regions_to_grid();
break;
case ConformRegion:
@@ -360,7 +387,7 @@ RhythmFerret::do_split_action ()
for (RegionSelection::iterator i = regions.begin(); i != regions.end(); ++i) {
AnalysisFeatureList features;
- features = (*i)->region()->transients();
+ (*i)->region()->transients(features);
merged_features.insert (merged_features.end(), features.begin(), features.end());
}
@@ -407,7 +434,7 @@ RhythmFerret::clear_transients ()
current_results.clear ();
for (RegionSelection::iterator i = regions_with_transients.begin(); i != regions_with_transients.end(); ++i) {
- (*i)->region()->set_transients (current_results);
+ (*i)->region()->set_onsets (current_results);
}
regions_with_transients.clear ();
diff --git a/gtk2_ardour/rhythm_ferret.h b/gtk2_ardour/rhythm_ferret.h
index 84b5cc5..f091916 100644
--- a/gtk2_ardour/rhythm_ferret.h
+++ b/gtk2_ardour/rhythm_ferret.h
@@ -85,6 +85,10 @@ class RhythmFerret : public ArdourDialog {
Gtk::HScale peak_picker_threshold_scale;
Gtk::Adjustment silence_threshold_adjustment;
Gtk::HScale silence_threshold_scale;
+#ifdef HAVE_AUBIO4
+ Gtk::Adjustment minioi_adjustment;
+ Gtk::HScale minioi_scale;
+#endif
/* generic stuff */
diff --git a/gtk2_ardour/route_group_dialog.cc b/gtk2_ardour/route_group_dialog.cc
index f55281f..d7fb115 100644
--- a/gtk2_ardour/route_group_dialog.cc
+++ b/gtk2_ardour/route_group_dialog.cc
@@ -30,7 +30,7 @@
#include "group_tabs.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace ARDOUR;
@@ -126,12 +126,12 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, bool creating_new)
_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_color.signal_color_set().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_gain.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _relative.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _mute.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _solo.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _rec_enable.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _select.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _route_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _relative.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _mute.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _solo.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _rec_enable.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _select.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _route_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_share_color.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_share_monitoring.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
@@ -178,35 +178,27 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, bool creating_new)
show_all_children ();
}
-/** @return true if the route group edit was cancelled, otherwise false */
bool
-RouteGroupDialog::do_run ()
+RouteGroupDialog::name_check () const
{
- while (1) {
- int const r = run ();
- if (r == Gtk::RESPONSE_CANCEL) {
- /* cancel, so just bail now */
- return Gtk::RESPONSE_CANCEL;
- }
+ if (unique_name (_name.get_text())) {
+ /* not cancelled and the name is ok, so all is well */
+ return true;
+ }
- if (unique_name (_name.get_text())) {
- /* not cancelled and the name is ok, so all is well */
- return false;
- }
+ _group->set_name (_initial_name);
- _group->set_name (_initial_name);
- MessageDialog msg (
- _("The group name is not unique. Please use a different name."),
- false,
- Gtk::MESSAGE_ERROR,
- Gtk::BUTTONS_OK,
- true
- );
+ MessageDialog msg (
+ _("The group name is not unique. Please use a different name."),
+ false,
+ Gtk::MESSAGE_ERROR,
+ Gtk::BUTTONS_OK,
+ true
+ );
- msg.run ();
- }
+ msg.set_position (WIN_POS_MOUSE);
+ msg.run ();
- abort(); /* NOTREACHED */
return false;
}
@@ -215,17 +207,17 @@ RouteGroupDialog::update ()
{
PropertyList plist;
- plist.add (Properties::gain, _gain.get_active());
- plist.add (Properties::recenable, _rec_enable.get_active());
- plist.add (Properties::mute, _mute.get_active());
- plist.add (Properties::solo, _solo.get_active ());
- plist.add (Properties::select, _select.get_active());
- plist.add (Properties::route_active, _route_active.get_active());
- plist.add (Properties::relative, _relative.get_active());
+ plist.add (Properties::group_gain, _gain.get_active());
+ plist.add (Properties::group_recenable, _rec_enable.get_active());
+ plist.add (Properties::group_mute, _mute.get_active());
+ plist.add (Properties::group_solo, _solo.get_active ());
+ plist.add (Properties::group_select, _select.get_active());
+ plist.add (Properties::group_route_active, _route_active.get_active());
+ plist.add (Properties::group_relative, _relative.get_active());
+ plist.add (Properties::group_color, _share_color.get_active());
+ plist.add (Properties::group_monitoring, _share_monitoring.get_active());
plist.add (Properties::active, _active.get_active());
plist.add (Properties::name, string (_name.get_text()));
- plist.add (Properties::color, _share_color.get_active());
- plist.add (Properties::monitoring, _share_monitoring.get_active());
_group->apply_changes (plist);
diff --git a/gtk2_ardour/route_group_dialog.h b/gtk2_ardour/route_group_dialog.h
index 5e2521d..5489cd2 100644
--- a/gtk2_ardour/route_group_dialog.h
+++ b/gtk2_ardour/route_group_dialog.h
@@ -32,7 +32,8 @@ class RouteGroupDialog : public ArdourDialog
public:
RouteGroupDialog (ARDOUR::RouteGroup *, bool);
- bool do_run ();
+ ARDOUR::RouteGroup* group() const { return _group; }
+ bool name_check () const;
private:
ARDOUR::RouteGroup* _group;
diff --git a/gtk2_ardour/route_group_menu.cc b/gtk2_ardour/route_group_menu.cc
index f4c7611..5ccafae 100644
--- a/gtk2_ardour/route_group_menu.cc
+++ b/gtk2_ardour/route_group_menu.cc
@@ -19,13 +19,17 @@
#include <gtkmm/menu.h>
#include <gtkmm/stock.h>
+
#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/doi.h"
+
#include "ardour/session.h"
#include "ardour/route_group.h"
#include "ardour/route.h"
#include "route_group_menu.h"
#include "route_group_dialog.h"
-#include "i18n.h"
+
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace ARDOUR;
@@ -158,14 +162,23 @@ RouteGroupMenu::new_group ()
}
RouteGroup* g = new RouteGroup (*_session, "");
- RouteGroupDialog d (g, true);
+ RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+ d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::new_group_dialog_finished), d));
+ d->present ();
+}
- if (d.do_run ()) {
- delete g;
+void
+RouteGroupMenu::new_group_dialog_finished (int r, RouteGroupDialog* d)
+{
+ if (r == RESPONSE_OK) {
+ _session->add_route_group (d->group());
+ set_group (d->group());
} else {
- _session->add_route_group (g);
- set_group (g);
+ delete d->group ();
}
+
+ delete_when_idle (d);
}
Gtk::Menu *
diff --git a/gtk2_ardour/route_group_menu.h b/gtk2_ardour/route_group_menu.h
index 5d711ff..334a3b5 100644
--- a/gtk2_ardour/route_group_menu.h
+++ b/gtk2_ardour/route_group_menu.h
@@ -23,6 +23,8 @@
#include "ardour/route_group.h"
#include "ardour/session_handle.h"
+class RouteGroupDialog;
+
class RouteGroupMenu : public ARDOUR::SessionHandlePtr
{
public:
@@ -37,8 +39,10 @@ public:
void add_item (ARDOUR::RouteGroup *, std::set<ARDOUR::RouteGroup*> const &, Gtk::RadioMenuItem::Group*);
void new_group ();
void set_group (ARDOUR::RouteGroup *);
+ void new_group_dialog_finished (int, RouteGroupDialog*);
Gtk::Menu* _menu;
+
PBD::PropertyList* _default_properties;
bool _inhibit_group_selected;
ARDOUR::WeakRouteList _subject;
diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc
index 82e6f10..a8ddc02 100644
--- a/gtk2_ardour/route_params_ui.cc
+++ b/gtk2_ardour/route_params_ui.cc
@@ -48,7 +48,7 @@
#include "send_ui.h"
#include "timers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -124,19 +124,11 @@ RouteParams_UI::RouteParams_UI ()
route_vpacker.pack_start (title_label, false, false);
route_vpacker.pack_start (route_hpacker, true, true);
+ list_hpane.add (list_vpacker);
+ list_hpane.add (route_vpacker);
- list_hpane.pack1 (list_vpacker);
- list_hpane.add2 (route_vpacker);
-
- list_hpane.set_position(110);
-
- redir_hpane.set_position(110);
-
- //global_vpacker.pack_start (list_hpane, true, true);
- //get_vbox()->pack_start (global_vpacker);
add (list_hpane);
-
set_name ("RouteParamsWindow");
set_default_size (620,370);
set_wmclass (X_("ardour_route_parameters"), PROGRAM_NAME);
@@ -250,7 +242,7 @@ RouteParams_UI::setup_processor_boxes()
if (at) {
at->FreezeChange.connect (route_connections, invalidator (*this), boost::bind (&RouteParams_UI::map_frozen, this), gui_context());
}
- redir_hpane.pack1 (*insert_box);
+ redir_hpane.add (*insert_box);
insert_box->ProcessorSelected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected)); //note: this indicates a double-click activation, not just a "selection"
insert_box->ProcessorUnselected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected));
@@ -520,9 +512,7 @@ RouteParams_UI::show_track_menu()
if (track_menu == 0) {
track_menu = new Menu;
track_menu->set_name ("ArdourContextMenu");
- track_menu->items().push_back
- (MenuElem (_("Add Track or Bus"),
- sigc::bind (sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::add_route), (Gtk::Window*) 0)));
+ track_menu->items().push_back (MenuElem (_("Add Track or Bus"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::add_route)));
}
track_menu->popup (1, gtk_get_current_event_time());
}
@@ -548,7 +538,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
send->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
_active_view = send_ui;
- redir_hpane.add2 (*_active_view);
+ redir_hpane.add (*_active_view);
redir_hpane.show_all();
} else if ((retrn = boost::dynamic_pointer_cast<Return> (proc)) != 0) {
@@ -559,7 +549,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
retrn->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
_active_view = return_ui;
- redir_hpane.add2 (*_active_view);
+ redir_hpane.add (*_active_view);
redir_hpane.show_all();
} else if ((plugin_insert = boost::dynamic_pointer_cast<PluginInsert> (proc)) != 0) {
@@ -571,7 +561,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
plugin_ui->start_updating (0);
_active_view = plugin_ui;
- redir_hpane.pack2 (*_active_view);
+ redir_hpane.add (*_active_view);
redir_hpane.show_all();
} else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (proc)) != 0) {
@@ -582,7 +572,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
port_insert->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor> (proc)), gui_context());
_active_view = portinsert_ui;
- redir_hpane.pack2 (*_active_view);
+ redir_hpane.add (*_active_view);
portinsert_ui->redisplay();
redir_hpane.show_all();
}
diff --git a/gtk2_ardour/route_params_ui.h b/gtk2_ardour/route_params_ui.h
index 65bef26..83ddf27 100644
--- a/gtk2_ardour/route_params_ui.h
+++ b/gtk2_ardour/route_params_ui.h
@@ -27,7 +27,6 @@
#include <gtkmm/eventbox.h>
#include <gtkmm/frame.h>
#include <gtkmm/label.h>
-#include <gtkmm/paned.h>
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/togglebutton.h>
#include <gtkmm/treeview.h>
@@ -37,6 +36,8 @@
#include "ardour/ardour.h"
+#include <gtkmm2ext/pane.h>
+
#include "ardour_window.h"
#include "processor_box.h"
#include "route_processor_selection.h"
@@ -66,22 +67,13 @@ class RouteParams_UI : public ArdourWindow, public PBD::ScopedConnectionList
PluginSelector* plugin_selector() { return _plugin_selector; }
private:
- Gtk::HBox global_hpacker;
- Gtk::VBox global_vpacker;
- Gtk::ScrolledWindow scroller;
- Gtk::EventBox scroller_base;
- Gtk::HBox scroller_hpacker;
- Gtk::VBox mixer_scroller_vpacker;
-
Gtk::VBox list_vpacker;
- Gtk::Label route_list_button_label;
- Gtk::Button route_list_button;
Gtk::ScrolledWindow route_select_scroller;
Gtk::Notebook notebook;
Gtk::Frame input_frame;
Gtk::Frame output_frame;
- Gtk::HPaned redir_hpane;
+ Gtkmm2ext::HPane redir_hpane;
Gtk::Frame route_select_frame;
@@ -90,11 +82,9 @@ class RouteParams_UI : public ArdourWindow, public PBD::ScopedConnectionList
ProcessorBox* insert_box;
- Gtk::HPaned list_hpane;
-
- Gtk::HPaned right_hpane;
+ Gtkmm2ext::HPane list_hpane;
- Gtk::Frame route_choice_frame;
+ Gtkmm2ext::HPane right_hpane;
Gtk::Frame route_param_frame;
diff --git a/gtk2_ardour/route_processor_selection.cc b/gtk2_ardour/route_processor_selection.cc
index 30943e2..729032e 100644
--- a/gtk2_ardour/route_processor_selection.cc
+++ b/gtk2_ardour/route_processor_selection.cc
@@ -26,7 +26,7 @@
#include "route_processor_selection.h"
#include "route_ui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -42,7 +42,7 @@ RouteProcessorSelection::operator= (const RouteProcessorSelection& other)
{
if (&other != this) {
processors = other.processors;
- routes = other.routes;
+ axes = other.axes;
}
return *this;
}
@@ -51,7 +51,7 @@ bool
operator== (const RouteProcessorSelection& a, const RouteProcessorSelection& b)
{
// XXX MUST TEST PROCESSORS SOMEHOW
- return a.routes == b.routes;
+ return a.axes == b.axes;
}
void
@@ -71,10 +71,10 @@ RouteProcessorSelection::clear_processors ()
void
RouteProcessorSelection::clear_routes ()
{
- for (RouteUISelection::iterator i = routes.begin(); i != routes.end(); ++i) {
+ for (AxisViewSelection::iterator i = axes.begin(); i != axes.end(); ++i) {
(*i)->set_selected (false);
}
- routes.clear ();
+ axes.clear ();
drop_connections ();
if (!_no_route_change_signal) {
RoutesChanged ();
@@ -98,34 +98,33 @@ RouteProcessorSelection::set (XMLNode* node)
}
void
-RouteProcessorSelection::add (RouteUI* r)
+RouteProcessorSelection::add (AxisView* r)
{
- if (find (routes.begin(), routes.end(), r) == routes.end()) {
- if (routes.insert (r).second) {
- r->set_selected (true);
+ if (axes.insert (r).second) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ r->set_selected (true);
- if (ms) {
- ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
- }
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (!_no_route_change_signal) {
- RoutesChanged();
- }
+ if (ms) {
+ ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
+ }
+
+ if (!_no_route_change_signal) {
+ RoutesChanged();
}
}
}
void
-RouteProcessorSelection::remove (RouteUI* r)
+RouteProcessorSelection::remove (AxisView* r)
{
ENSURE_GUI_THREAD (*this, &RouteProcessorSelection::remove, r);
- RouteUISelection::iterator i;
- if ((i = find (routes.begin(), routes.end(), r)) != routes.end()) {
+ AxisViewSelection::iterator i;
+ if ((i = find (axes.begin(), axes.end(), r)) != axes.end()) {
(*i)->set_selected (false);
- routes.erase (i);
+ axes.erase (i);
if (!_no_route_change_signal) {
RoutesChanged ();
}
@@ -133,22 +132,22 @@ RouteProcessorSelection::remove (RouteUI* r)
}
void
-RouteProcessorSelection::set (RouteUI* r)
+RouteProcessorSelection::set (AxisView* r)
{
clear_routes ();
add (r);
}
bool
-RouteProcessorSelection::selected (RouteUI* r)
+RouteProcessorSelection::selected (AxisView* r)
{
- return find (routes.begin(), routes.end(), r) != routes.end();
+ return find (axes.begin(), axes.end(), r) != axes.end();
}
bool
RouteProcessorSelection::empty ()
{
- return processors.empty () && routes.empty ();
+ return processors.empty () && axes.empty ();
}
void
diff --git a/gtk2_ardour/route_processor_selection.h b/gtk2_ardour/route_processor_selection.h
index 3f8bb1a..6c037d7 100644
--- a/gtk2_ardour/route_processor_selection.h
+++ b/gtk2_ardour/route_processor_selection.h
@@ -30,7 +30,7 @@ class RouteProcessorSelection : public PBD::ScopedConnectionList, public sigc::t
{
public:
ProcessorSelection processors;
- RouteUISelection routes;
+ AxisViewSelection axes;
RouteProcessorSelection();
@@ -47,17 +47,17 @@ class RouteProcessorSelection : public PBD::ScopedConnectionList, public sigc::t
void set (XMLNode* node);
void add (XMLNode* node);
- void set (RouteUI*);
- void add (RouteUI*);
- void remove (RouteUI*);
+ void set (AxisView*);
+ void add (AxisView*);
+ void remove (AxisView*);
void clear_processors ();
void clear_routes ();
- bool selected (RouteUI*);
+ bool selected (AxisView*);
private:
- void removed (RouteUI*);
+ void removed (AxisView*);
bool _no_route_change_signal;
};
diff --git a/gtk2_ardour/route_sorter.h b/gtk2_ardour/route_sorter.h
index c203afa..e847882 100644
--- a/gtk2_ardour/route_sorter.h
+++ b/gtk2_ardour/route_sorter.h
@@ -24,27 +24,29 @@
#include <stdint.h>
#include <vector>
-namespace ARDOUR {
- class Route;
-}
+#include "ardour/stripable.h"
-struct RoutePlusOrderKey {
- boost::shared_ptr<ARDOUR::Route> route; /* we don't really need this, but its handy to keep around */
+struct OrderKeys {
uint32_t old_display_order;
uint32_t new_display_order;
- RoutePlusOrderKey (boost::shared_ptr<ARDOUR::Route> r, uint32_t ok, uint32_t nk)
- : route (r)
- , old_display_order (ok)
- , new_display_order (nk) {}
+ OrderKeys (uint32_t ok, uint32_t nk)
+ : old_display_order (ok)
+ , new_display_order (nk) {}
};
-typedef std::vector<RoutePlusOrderKey> OrderKeySortedRoutes;
+typedef std::vector<OrderKeys> OrderingKeys;
struct SortByNewDisplayOrder {
- bool operator() (const RoutePlusOrderKey& a, const RoutePlusOrderKey& b) {
+ bool operator() (const OrderKeys& a, const OrderKeys& b) {
return a.new_display_order < b.new_display_order;
}
};
+struct StripablePresentationInfoSorter {
+ bool operator() (boost::shared_ptr<ARDOUR::Stripable> a, boost::shared_ptr<ARDOUR::Stripable> b) {
+ return a->presentation_info().order () < b->presentation_info().order ();
+ }
+};
+
#endif /* __gtk2_ardour_route_sorter_h__ */
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 4db19bd..9bf84f8 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -83,7 +83,7 @@
#include "ardour/track.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
@@ -95,8 +95,7 @@ using namespace std;
using std::list;
RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas)
- : AxisView(sess)
- , RouteUI(sess)
+ : RouteUI(sess)
, TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas)
, _view (0)
, parent_canvas (canvas)
@@ -124,6 +123,17 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan
number_label.set_fallthrough_to_parent (true);
sess->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::parameter_changed, this, _1), gui_context());
+ UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::parameter_changed));
+
+ parameter_changed ("editor-stereo-only-meters");
+}
+
+void
+RouteTimeAxisView::route_property_changed (const PBD::PropertyChange& what_changed)
+{
+ if (what_changed.contains (ARDOUR::Properties::name)) {
+ label_view ();
+ }
}
void
@@ -168,7 +178,7 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
playlist_button.set_name ("route button");
automation_button.set_name ("route button");
- route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false);
+ route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false);
playlist_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click));
automation_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click));
@@ -188,8 +198,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
gm.set_fader_name ("AudioTrackFader");
}
- rec_enable_button->set_sensitive (_session->writable());
-
/* set playlist button tip to the current playlist, and make it update when it changes */
update_playlist_tip ();
track()->PlaylistChanged.connect (*this, invalidator (*this), ui_bind(&RouteTimeAxisView::update_playlist_tip, this), gui_context());
@@ -291,7 +299,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
_y_position = -1;
_route->processors_changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context());
- _route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::route_property_changed, this, _1), gui_context());
if (is_track()) {
@@ -313,8 +320,8 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
PropertyList* plist = new PropertyList();
- plist->add (ARDOUR::Properties::mute, true);
- plist->add (ARDOUR::Properties::solo, true);
+ plist->add (ARDOUR::Properties::group_mute, true);
+ plist->add (ARDOUR::Properties::group_solo, true);
route_group_menu = new RouteGroupMenu (_session, plist);
@@ -341,6 +348,15 @@ RouteTimeAxisView::~RouteTimeAxisView ()
CatchDeletion (this);
}
+string
+RouteTimeAxisView::name() const
+{
+ if (_route) {
+ return _route->name();
+ }
+ return string();
+}
+
void
RouteTimeAxisView::post_construct ()
{
@@ -429,10 +445,8 @@ RouteTimeAxisView::update_track_number_visibility ()
if (tnw & 1) --tnw;
number_label.set_size_request(tnw, -1);
number_label.show ();
- name_hbox.set_size_request(TimeAxisView::name_width_px - 2 - tnw, -1); // -2 = cellspacing
} else {
number_label.hide ();
- name_hbox.set_size_request(TimeAxisView::name_width_px, -1);
}
}
@@ -441,14 +455,12 @@ RouteTimeAxisView::parameter_changed (string const & p)
{
if (p == "track-name-number") {
update_track_number_visibility();
- }
-}
-
-void
-RouteTimeAxisView::route_property_changed (const PropertyChange& what_changed)
-{
- if (what_changed.contains (ARDOUR::Properties::name)) {
- label_view ();
+ } else if (p == "editor-stereo-only-meters") {
+ if (UIConfiguration::instance().get_editor_stereo_only_meters()) {
+ gm.get_level_meter().set_max_audio_meter_count (2);
+ } else {
+ gm.get_level_meter().set_max_audio_meter_count (0);
+ }
}
}
@@ -463,7 +475,7 @@ RouteTimeAxisView::take_name_changed (void *src)
void
RouteTimeAxisView::playlist_click ()
{
- build_playlist_menu ();
+ build_playlist_menu ();
conditionally_add_to_selection ();
playlist_action_menu->popup (1, gtk_get_current_event_time());
}
@@ -585,15 +597,8 @@ RouteTimeAxisView::build_display_menu ()
}
build_size_menu ();
items.push_back (MenuElem (_("Height"), *_size_menu));
-
items.push_back (SeparatorElem());
- if (!Profile->get_sae()) {
- items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog)));
- items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1);
- items.push_back (SeparatorElem());
- }
-
// Hook for derived classes to add type specific stuff
append_extra_display_menu_items ();
@@ -651,159 +656,152 @@ RouteTimeAxisView::build_display_menu ()
items.push_back (MenuElem (_("Layers"), *layers_menu));
- if (!Profile->get_sae()) {
-
- Menu* alignment_menu = manage (new Menu);
- MenuList& alignment_items = alignment_menu->items();
- alignment_menu->set_name ("ArdourContextMenu");
+ Menu* alignment_menu = manage (new Menu);
+ MenuList& alignment_items = alignment_menu->items();
+ alignment_menu->set_name ("ArdourContextMenu");
- RadioMenuItem::Group align_group;
+ RadioMenuItem::Group align_group;
- /* Same verbose hacks as for the layering options above */
+ /* Same verbose hacks as for the layering options above */
- int existing = 0;
- int capture = 0;
- int automatic = 0;
- int styles = 0;
- boost::shared_ptr<Track> first_track;
+ int existing = 0;
+ int capture = 0;
+ int automatic = 0;
+ int styles = 0;
+ boost::shared_ptr<Track> first_track;
- TrackSelection const & s = _editor.get_selection().tracks;
- for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
- RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
- if (!r || !r->is_track ()) {
- continue;
- }
+ for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) {
+ RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*t);
+ if (!r || !r->is_track ()) {
+ continue;
+ }
- if (!first_track) {
- first_track = r->track();
- }
-
- switch (r->track()->alignment_choice()) {
- case Automatic:
- ++automatic;
- styles |= 0x1;
- switch (r->track()->alignment_style()) {
- case ExistingMaterial:
- ++existing;
- break;
- case CaptureTime:
- ++capture;
- break;
- }
- break;
- case UseExistingMaterial:
- ++existing;
- styles |= 0x2;
- break;
- case UseCaptureTime:
- ++capture;
- styles |= 0x4;
- break;
- }
+ if (!first_track) {
+ first_track = r->track();
}
- bool inconsistent;
- switch (styles) {
- case 1:
- case 2:
- case 4:
- inconsistent = false;
- break;
- default:
- inconsistent = true;
- break;
- }
-
- RadioMenuItem* i;
-
- if (!inconsistent && first_track) {
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)")));
- i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->set_active (automatic != 0 && existing == 0 && capture == 0);
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, Automatic, true));
-
- switch (first_track->alignment_choice()) {
- case Automatic:
- switch (first_track->alignment_style()) {
- case ExistingMaterial:
- alignment_items.push_back (MenuElem (_("(Currently: Existing Material)")));
- break;
- case CaptureTime:
- alignment_items.push_back (MenuElem (_("(Currently: Capture Time)")));
- break;
- }
- break;
- default:
- break;
- }
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Align with Existing Material")));
- i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->set_active (existing != 0 && capture == 0 && automatic == 0);
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true));
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Align with Capture Time")));
- i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->set_active (existing == 0 && capture != 0 && automatic == 0);
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true));
-
- items.push_back (MenuElem (_("Alignment"), *alignment_menu));
-
- } else {
- /* show nothing */
- }
-
- Menu* mode_menu = manage (new Menu);
- MenuList& mode_items = mode_menu->items ();
- mode_menu->set_name ("ArdourContextMenu");
-
- RadioMenuItem::Group mode_group;
-
- int normal = 0;
- int tape = 0;
- int non_layered = 0;
-
- for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
- RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
- if (!r || !r->is_track ()) {
- continue;
+ switch (r->track()->alignment_choice()) {
+ case Automatic:
+ ++automatic;
+ styles |= 0x1;
+ switch (r->track()->alignment_style()) {
+ case ExistingMaterial:
+ ++existing;
+ break;
+ case CaptureTime:
+ ++capture;
+ break;
}
+ break;
+ case UseExistingMaterial:
+ ++existing;
+ styles |= 0x2;
+ break;
+ case UseCaptureTime:
+ ++capture;
+ styles |= 0x4;
+ break;
+ }
+ }
- switch (r->track()->mode()) {
- case Normal:
- ++normal;
- break;
- case Destructive:
- ++tape;
+ bool inconsistent;
+ switch (styles) {
+ case 1:
+ case 2:
+ case 4:
+ inconsistent = false;
+ break;
+ default:
+ inconsistent = true;
+ break;
+ }
+
+ if (!inconsistent && first_track) {
+
+ alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (automatic != 0 && existing == 0 && capture == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, Automatic, true));
+
+ switch (first_track->alignment_choice()) {
+ case Automatic:
+ switch (first_track->alignment_style()) {
+ case ExistingMaterial:
+ alignment_items.push_back (MenuElem (_("(Currently: Existing Material)")));
break;
- case NonLayered:
- ++non_layered;
+ case CaptureTime:
+ alignment_items.push_back (MenuElem (_("(Currently: Capture Time)")));
break;
}
+ break;
+ default:
+ break;
}
- mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode")));
- i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal, true));
- i->set_active (normal != 0 && tape == 0 && non_layered == 0);
- i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0));
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (existing != 0 && capture == 0 && automatic == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true));
+
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (existing == 0 && capture != 0 && automatic == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true));
+
+ items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+
+ } else {
+ /* show nothing */
+ }
+
+ Menu* mode_menu = manage (new Menu);
+ MenuList& mode_items = mode_menu->items ();
+ mode_menu->set_name ("ArdourContextMenu");
+
+ RadioMenuItem::Group mode_group;
- mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode")));
- i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive, true));
- i->set_active (normal == 0 && tape != 0 && non_layered == 0);
- i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0));
+ int normal = 0;
+ int tape = 0;
+ int non_layered = 0;
- mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode")));
- i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered, true));
- i->set_active (normal == 0 && tape == 0 && non_layered != 0);
- i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0));
+ for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) {
+ RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*t);
+ if (!r || !r->is_track ()) {
+ continue;
+ }
- items.push_back (MenuElem (_("Record Mode"), *mode_menu));
+ switch (r->track()->mode()) {
+ case Normal:
+ ++normal;
+ break;
+ case Destructive:
+ ++tape;
+ break;
+ case NonLayered:
+ ++non_layered;
+ break;
+ }
}
+ mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal, true));
+ i->set_active (normal != 0 && tape == 0 && non_layered == 0);
+ i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0));
+
+ mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive, true));
+ i->set_active (normal == 0 && tape != 0 && non_layered == 0);
+ i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0));
+
+ mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered, true));
+ i->set_active (normal == 0 && tape == 0 && non_layered != 0);
+ i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0));
+
+ items.push_back (MenuElem (_("Record Mode"), *mode_menu));
items.push_back (SeparatorElem());
@@ -1177,7 +1175,7 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vector<boost::shared_ptr<Play
name = pl->name();
- if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) {
+ if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) {
name = resolve_new_group_playlist_name(name, playlists_before_op);
}
@@ -1232,7 +1230,7 @@ RouteTimeAxisView::use_new_playlist (bool prompt, vector<boost::shared_ptr<Playl
name = pl->name();
- if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) {
+ if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) {
name = resolve_new_group_playlist_name(name,playlists_before_op);
}
@@ -1412,12 +1410,6 @@ RouteTimeAxisView::route_group () const
return _route->route_group();
}
-string
-RouteTimeAxisView::name() const
-{
- return _route->name();
-}
-
boost::shared_ptr<Playlist>
RouteTimeAxisView::playlist () const
{
@@ -1430,33 +1422,30 @@ RouteTimeAxisView::playlist () const
}
}
-void
-RouteTimeAxisView::name_entry_changed ()
+bool
+RouteTimeAxisView::name_entry_changed (string const& str)
{
- TimeAxisView::name_entry_changed ();
-
- string x = name_entry->get_text ();
-
- if (x == _route->name()) {
- return;
+ if (str == _route->name()) {
+ return true;
}
+ string x = str;
+
strip_whitespace_edges (x);
- if (x.length() == 0) {
- name_entry->set_text (_route->name());
- return;
+ if (x.empty()) {
+ return false;
}
if (_session->route_name_internal (x)) {
- ARDOUR_UI::instance()->popup_error (string_compose (_("You cannot create a track with that name as it is reserved for %1"),
- PROGRAM_NAME));
- name_entry->grab_focus ();
+ ARDOUR_UI::instance()->popup_error (string_compose (_("The name \"%1\" is reserved for %2"), x, PROGRAM_NAME));
+ return false;
} else if (RouteUI::verify_new_route_name (x)) {
_route->set_name (x);
- } else {
- name_entry->grab_focus ();
+ return true;
}
+
+ return false;
}
boost::shared_ptr<Region>
@@ -1596,7 +1585,7 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
}
bool
-RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx)
+RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
{
if (!is_track()) {
return false;
@@ -1630,7 +1619,7 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte
framecnt_t amount = extent.second - extent.first;
pl->ripple(pos, amount * ctx.times, boost::shared_ptr<Region>());
}
- pl->paste (*p, pos, ctx.times);
+ pl->paste (*p, pos, ctx.times, sub_num);
vector<Command*> cmds;
pl->rdiff (cmds);
@@ -1690,7 +1679,7 @@ RouteTimeAxisView::build_playlist_menu ()
playlist_items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteTimeAxisView::rename_current_playlist)));
playlist_items.push_back (SeparatorElem());
- if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::select.property_id)) {
+ if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) {
playlist_items.push_back (MenuElem (_("New..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::new_playlists), this)));
playlist_items.push_back (MenuElem (_("New Copy..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::copy_playlists), this)));
@@ -1734,7 +1723,7 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr<Playlist>
RouteGroup* rg = route_group();
- if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) {
+ if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) {
std::string group_string = "." + rg->name() + ".";
std::string take_name = pl->name();
@@ -1780,7 +1769,7 @@ void
RouteTimeAxisView::update_playlist_tip ()
{
RouteGroup* rg = route_group ();
- if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) {
+ if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) {
string group_string = "." + rg->name() + ".";
string take_name = track()->playlist()->name();
@@ -1825,13 +1814,12 @@ RouteTimeAxisView::map_frozen ()
switch (track()->freeze_state()) {
case Track::Frozen:
playlist_button.set_sensitive (false);
- rec_enable_button->set_sensitive (false);
break;
default:
playlist_button.set_sensitive (true);
- rec_enable_button->set_sensitive (true);
break;
}
+ RouteUI::map_frozen ();
}
void
@@ -2088,7 +2076,7 @@ RouteTimeAxisView::show_existing_automation (bool apply_to_selection)
for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
- if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) {
+ if ((*i)->processor->control((*ii)->what)->list()->size() > 0) {
(*ii)->menu_item->set_active (true);
}
}
@@ -2496,7 +2484,11 @@ RouteTimeAxisView::can_edit_name () const
{
/* we do not allow track name changes if it is record enabled
*/
- return !_route->record_enabled();
+ boost::shared_ptr<Track> trk (boost::dynamic_pointer_cast<Track> (_route));
+ if (!trk) {
+ return true;
+ }
+ return !trk->rec_enable_control()->get_value();
}
void
@@ -2646,7 +2638,7 @@ RouteTimeAxisView::set_underlay_state()
continue;
}
- XMLProperty* prop = child_node->property ("id");
+ XMLProperty const * prop = child_node->property ("id");
if (prop) {
PBD::ID id (prop->value());
@@ -2688,7 +2680,7 @@ RouteTimeAxisView::add_underlay (StreamView* v, bool /*update_xml*/)
}
XMLNode* node = underlay_xml_node->add_child("Underlay");
- XMLProperty* prop = node->add_property("id");
+ XMLProperty const * prop = node->add_property("id");
prop->set_value(v->trackview().route()->id().to_s());
}
#endif
@@ -2727,7 +2719,7 @@ RouteTimeAxisView::remove_underlay (StreamView* v)
void
RouteTimeAxisView::set_button_names ()
{
- if (_route && _route->solo_safe()) {
+ if (_route && _route->solo_safe_control()->solo_safe()) {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
} else {
solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -2928,3 +2920,22 @@ RouteTimeAxisView::remove_child (boost::shared_ptr<TimeAxisView> c)
}
}
}
+
+Gdk::Color
+RouteTimeAxisView::color () const
+{
+ return route_color ();
+}
+
+bool
+RouteTimeAxisView::marked_for_display () const
+{
+ return !_route->presentation_info().hidden();
+}
+
+bool
+RouteTimeAxisView::set_marked_for_display (bool yn)
+{
+ return RouteUI::mark_hidden (!yn);
+}
+
diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h
index 57b2bbb..0634890 100644
--- a/gtk2_ardour/route_time_axis.h
+++ b/gtk2_ardour/route_time_axis.h
@@ -75,8 +75,15 @@ class ItemCounts;
class RouteTimeAxisView : public RouteUI, public TimeAxisView
{
public:
- RouteTimeAxisView (PublicEditor&, ARDOUR::Session*, ArdourCanvas::Canvas& canvas);
- virtual ~RouteTimeAxisView ();
+ RouteTimeAxisView (PublicEditor&, ARDOUR::Session*, ArdourCanvas::Canvas& canvas);
+ virtual ~RouteTimeAxisView ();
+
+ std::string name() const;
+ Gdk::Color color () const;
+ bool marked_for_display () const;
+ bool set_marked_for_display (bool);
+
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
void set_route (boost::shared_ptr<ARDOUR::Route>);
@@ -84,7 +91,7 @@ public:
void set_button_names ();
void set_samples_per_pixel (double);
- void set_height (uint32_t h, TrackHeightMode m = OnlySelf);
+ void set_height (uint32_t h, TrackHeightMode m = OnlySelf);
void show_timestretch (framepos_t start, framepos_t end, int layers, int layer);
void hide_timestretch ();
void selection_click (GdkEventButton*);
@@ -100,7 +107,7 @@ public:
/* Editing operations */
void cut_copy_clear (Selection&, Editing::CutCopyOp);
- bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx);
+ bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx, const int32_t sub_num);
RegionView* combine_regions ();
void uncombine_regions ();
void uncombine_region (RegionView*);
@@ -131,7 +138,6 @@ public:
boost::shared_ptr<AutomationTimeAxisView> automation_child(Evoral::Parameter param);
virtual Gtk::CheckMenuItem* automation_child_menu_item (Evoral::Parameter);
- std::string name() const;
StreamView* view() const { return _view; }
ARDOUR::RouteGroup* route_group() const;
boost::shared_ptr<ARDOUR::Playlist> playlist() const;
@@ -207,7 +213,7 @@ protected:
void take_name_changed (void *src);
void route_property_changed (const PBD::PropertyChange&);
- void name_entry_changed ();
+ bool name_entry_changed (std::string const&);
void blink_rec_display (bool onoff);
@@ -333,4 +339,3 @@ private:
};
#endif /* __ardour_route_time_axis_h__ */
-
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index 402e37d..3f2f39d 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -27,42 +27,51 @@
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/utils.h>
-#include "ardour/route_group.h"
-#include "ardour/dB.h"
#include "pbd/memento_command.h"
#include "pbd/stacktrace.h"
#include "pbd/controllable.h"
#include "pbd/enumwriter.h"
-#include "ardour_ui.h"
-#include "editor.h"
-#include "route_ui.h"
-#include "ardour_button.h"
-#include "keyboard.h"
-#include "utils.h"
-#include "prompter.h"
-#include "gui_thread.h"
-#include "ardour_dialog.h"
-#include "latency_gui.h"
-#include "mixer_strip.h"
-#include "automation_time_axis.h"
-#include "route_time_axis.h"
-#include "group_tabs.h"
-#include "timers.h"
-#include "ui_config.h"
-
+#include "ardour/dB.h"
+#include "ardour/route_group.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
#include "ardour/audio_track.h"
#include "ardour/audioengine.h"
#include "ardour/filename_extensions.h"
#include "ardour/midi_track.h"
+#include "ardour/monitor_control.h"
#include "ardour/internal_send.h"
#include "ardour/profile.h"
+#include "ardour/phase_control.h"
#include "ardour/send.h"
#include "ardour/route.h"
#include "ardour/session.h"
#include "ardour/template_utils.h"
-#include "i18n.h"
+#include "ardour_button.h"
+#include "ardour_dialog.h"
+#include "ardour_ui.h"
+#include "automation_time_axis.h"
+#include "editor.h"
+#include "group_tabs.h"
+#include "gui_object.h"
+#include "gui_thread.h"
+#include "keyboard.h"
+#include "latency_gui.h"
+#include "mixer_strip.h"
+#include "plugin_pin_dialog.h"
+#include "prompter.h"
+#include "rgb_macros.h"
+#include "route_time_axis.h"
+#include "route_ui.h"
+#include "timers.h"
+#include "ui_config.h"
+#include "utils.h"
+
+
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace Gtkmm2ext;
using namespace ARDOUR;
@@ -76,7 +85,8 @@ boost::weak_ptr<Route> RouteUI::_showing_sends_to;
std::string RouteUI::program_port_prefix;
RouteUI::RouteUI (ARDOUR::Session* sess)
- : AxisView(sess)
+ : monitor_input_button (0)
+ , monitor_disk_button (0)
, mute_menu(0)
, solo_menu(0)
, sends_menu(0)
@@ -93,13 +103,16 @@ RouteUI::RouteUI (ARDOUR::Session* sess)
boost::to_lower (lpn);
program_port_prefix = lpn + ":"; // e.g. "ardour:"
}
- if (sess) init ();
+
+ if (sess) {
+ init ();
+ }
}
RouteUI::~RouteUI()
{
if (_route) {
- gui_object_state().remove_node (route_state_id());
+ ARDOUR_UI::instance()->gui_object_state->remove_node (route_state_id());
}
_route.reset (); /* drop reference to route, so that it can be cleaned up */
@@ -108,10 +121,12 @@ RouteUI::~RouteUI()
delete solo_menu;
delete mute_menu;
delete sends_menu;
- delete record_menu;
+ delete record_menu;
delete comment_window;
delete input_selector;
delete output_selector;
+ delete monitor_input_button;
+ delete monitor_disk_button;
delete _invert_menu;
send_blink_connection.disconnect ();
@@ -125,20 +140,21 @@ RouteUI::init ()
mute_menu = 0;
solo_menu = 0;
sends_menu = 0;
- record_menu = 0;
+ record_menu = 0;
_invert_menu = 0;
pre_fader_mute_check = 0;
post_fader_mute_check = 0;
listen_mute_check = 0;
main_mute_check = 0;
- solo_safe_check = 0;
- solo_isolated_check = 0;
- solo_isolated_led = 0;
- solo_safe_led = 0;
+ solo_safe_check = 0;
+ solo_isolated_check = 0;
+ solo_isolated_led = 0;
+ solo_safe_led = 0;
_solo_release = 0;
_mute_release = 0;
denormal_menu_item = 0;
- step_edit_item = 0;
+ step_edit_item = 0;
+ rec_safe_item = 0;
multiple_mute_change = false;
multiple_solo_change = false;
_i_am_the_modifier = 0;
@@ -170,13 +186,13 @@ RouteUI::init ()
show_sends_button->set_name ("send alert button");
UI::instance()->set_tip (show_sends_button, _("make mixer strips show sends to this bus"), "");
- monitor_input_button = manage (new ArdourButton (ArdourButton::default_elements));
+ monitor_input_button = new ArdourButton (ArdourButton::default_elements);
monitor_input_button->set_name ("monitor button");
monitor_input_button->set_text (_("In"));
UI::instance()->set_tip (monitor_input_button, _("Monitor input"), "");
monitor_input_button->set_no_show_all (true);
- monitor_disk_button = manage (new ArdourButton (ArdourButton::default_elements));
+ monitor_disk_button = new ArdourButton (ArdourButton::default_elements);
monitor_disk_button->set_name ("monitor button");
monitor_disk_button->set_text (_("Disk"));
UI::instance()->set_tip (monitor_disk_button, _("Monitor playback"), "");
@@ -240,7 +256,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
_route = rp;
if (set_color_from_route()) {
- set_color (unique_random_color());
+ set_color (gdk_color_to_rgba (AxisView::unique_random_color ()));
}
if (self_destruct) {
@@ -257,29 +273,32 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
solo_button->set_controllable (_route->solo_control());
_route->active_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_active_changed, this), gui_context());
- _route->mute_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_mute_display, this), gui_context());
_route->comment_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::comment_changed, this), gui_context());
- _route->solo_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
- _route->solo_safe_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
- _route->listen_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
- _route->solo_isolated_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+ _route->mute_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_mute_display, this), gui_context());
+ _route->solo_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+ _route->solo_safe_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+ _route->solo_isolate_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+ _route->phase_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::polarity_changed, this), gui_context());
+
if (is_track()) {
+ track()->FreezeChange.connect (*this, invalidator (*this), boost::bind (&RouteUI::map_frozen, this), gui_context());
track()->TrackModeChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::track_mode_changed, this), gui_context());
track_mode_changed();
}
- _route->phase_invert_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::polarity_changed, this), gui_context());
- _route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::property_changed, this, _1), gui_context());
+
+ _route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_property_changed, this, _1), gui_context());
+ _route->presentation_info().PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_gui_changed, this, _1), gui_context ());
_route->io_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::setup_invert_buttons, this), gui_context ());
- _route->gui_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_gui_changed, this, _1), gui_context ());
if (_session->writable() && is_track()) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
- t->RecordEnableChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context());
+ t->rec_enable_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context());
+ t->rec_safe_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context());
rec_enable_button->show();
rec_enable_button->set_controllable (t->rec_enable_control());
@@ -297,7 +316,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
if (is_track()) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
- t->MonitoringChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::monitoring_changed, this), gui_context());
+ t->monitoring_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_monitoring_display, this), gui_context());
update_monitoring_display ();
}
@@ -328,7 +347,10 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
blink_rec_display(true); // set initial rec-en button state
}
+ check_rec_enable_sensitivity ();
+ maybe_add_route_print_mgr ();
route_color_changed();
+ route_gui_changed (PropertyChange (Properties::selected));
}
void
@@ -369,7 +391,7 @@ RouteUI::mute_press (GdkEventButton* ev)
if (Keyboard::is_button2_event (ev)) {
// button2-click is "momentary"
- _mute_release = new SoloMuteRelease (_route->muted ());
+ _mute_release = new SoloMuteRelease (_route->mute_control()->muted ());
}
if (ev->button == 1 || Keyboard::is_button2_event (ev)) {
@@ -401,7 +423,7 @@ RouteUI::mute_press (GdkEventButton* ev)
}
DisplaySuspender ds;
- _session->set_mute (copy, !_route->muted());
+ _session->set_controls (route_list_to_control_list (copy, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::UseGroup);
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
@@ -430,7 +452,7 @@ RouteUI::mute_press (GdkEventButton* ev)
}
DisplaySuspender ds;
- _session->set_mute (rl, !_route->muted(), Session::rt_cleanup, Controllable::InverseGroup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::InverseGroup);
}
} else {
@@ -444,8 +466,7 @@ RouteUI::mute_press (GdkEventButton* ev)
_mute_release->routes = rl;
}
- _session->set_mute (rl, !_route->muted());
-
+ _route->mute_control()->set_value (!_route->muted_by_self(), Controllable::UseGroup);
}
}
}
@@ -458,7 +479,7 @@ RouteUI::mute_release (GdkEventButton* /*ev*/)
{
if (_mute_release){
DisplaySuspender ds;
- _session->set_mute (_mute_release->routes, _mute_release->active, Session::rt_cleanup, Controllable::UseGroup);
+ _session->set_controls (route_list_to_control_list (_mute_release->routes, &Stripable::mute_control), _mute_release->active, Controllable::UseGroup);
delete _mute_release;
_mute_release = 0;
}
@@ -558,11 +579,7 @@ RouteUI::solo_press(GdkEventButton* ev)
}
DisplaySuspender ds;
- if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (_session->get_routes(), !_route->listening_via_monitor(), Session::rt_cleanup, Controllable::NoGroup);
- } else {
- _session->set_solo (_session->get_routes(), !_route->self_soloed(), Session::rt_cleanup, Controllable::NoGroup);
- }
+ _session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::solo_control), !_route->solo_control()->get_value(), Controllable::UseGroup);
} else if (Keyboard::modifier_state_contains (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::SecondaryModifier))) {
@@ -586,14 +603,14 @@ RouteUI::solo_press(GdkEventButton* ev)
/* ??? we need a just_one_listen() method */
} else {
DisplaySuspender ds;
- _session->set_just_one_solo (_route, true);
+ _route->solo_control()->set_value (1.0, Controllable::NoGroup);
}
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
// shift-click: toggle solo isolated status
- _route->set_solo_isolated (!_route->solo_isolated(), Controllable::UseGroup);
+ _route->solo_isolate_control()->set_value (_route->solo_isolate_control()->get_value() ? 0.0 : 1.0, Controllable::UseGroup);
delete _solo_release;
_solo_release = 0;
@@ -633,11 +650,7 @@ RouteUI::solo_press(GdkEventButton* ev)
DisplaySuspender ds;
- if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (rl, !_route->listening_via_monitor(), Session::rt_cleanup, Controllable::InverseGroup);
- } else {
- _session->set_solo (rl, !_route->self_soloed(), Session::rt_cleanup, Controllable::InverseGroup);
- }
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::solo_control), !_route->self_soloed(), Controllable::InverseGroup);
}
delete _solo_release;
@@ -655,11 +668,7 @@ RouteUI::solo_press(GdkEventButton* ev)
}
DisplaySuspender ds;
- if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (rl, !_route->listening_via_monitor());
- } else {
- _session->set_solo (rl, !_route->self_soloed());
- }
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::solo_control), !_route->self_soloed(), Controllable::UseGroup);
}
}
}
@@ -676,11 +685,7 @@ RouteUI::solo_release (GdkEventButton* /*ev*/)
} else {
DisplaySuspender ds;
- if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (_solo_release->routes, _solo_release->active, Session::rt_cleanup, Controllable::UseGroup);
- } else {
- _session->set_solo (_solo_release->routes, _solo_release->active, Session::rt_cleanup, Controllable::UseGroup);
- }
+ _session->set_controls (route_list_to_control_list (_solo_release->routes, &Stripable::solo_control), _solo_release->active ? 1.0 : 0.0, Controllable::UseGroup);
}
delete _solo_release;
@@ -727,7 +732,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
DisplaySuspender ds;
- _session->set_record_enabled (_session->get_routes(), !_route->record_enabled());
+ _session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::rec_enable_control), !track()->rec_enable_control()->get_value(), Controllable::NoGroup);
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
@@ -743,7 +748,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
rl->push_back (_route);
DisplaySuspender ds;
- _session->set_record_enabled (rl, !_route->record_enabled(), Session::rt_cleanup, Controllable::InverseGroup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), !track()->rec_enable_control()->get_value(), Controllable::InverseGroup);
}
} else if (Keyboard::is_context_menu_event (ev)) {
@@ -752,10 +757,8 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
} else {
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (route());
- DisplaySuspender ds;
- _session->set_record_enabled (rl, !_route->record_enabled());
+ boost::shared_ptr<Track> trk = track();
+ trk->rec_enable_control()->set_value (!trk->rec_enable_control()->get_value(), Controllable::UseGroup);
}
}
@@ -763,12 +766,6 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
}
void
-RouteUI::monitoring_changed ()
-{
- update_monitoring_display ();
-}
-
-void
RouteUI::update_monitoring_display ()
{
if (!_route) {
@@ -783,7 +780,7 @@ RouteUI::update_monitoring_display ()
MonitorState ms = t->monitoring_state();
- if (t->monitoring_choice() & MonitorInput) {
+ if (t->monitoring_control()->monitoring_choice() & MonitorInput) {
monitor_input_button->set_active_state (Gtkmm2ext::ExplicitActive);
} else {
if (ms & MonitoringInput) {
@@ -793,7 +790,7 @@ RouteUI::update_monitoring_display ()
}
}
- if (t->monitoring_choice() & MonitorDisk) {
+ if (t->monitoring_control()->monitoring_choice() & MonitorDisk) {
monitor_disk_button->set_active_state (Gtkmm2ext::ExplicitActive);
} else {
if (ms & MonitoringDisk) {
@@ -849,8 +846,8 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
signal together, which requires yet more buffers.
*/
- if (t->monitoring_choice() & monitor_choice) {
- mc = MonitorChoice (t->monitoring_choice() & ~monitor_choice);
+ if (t->monitoring_control()->monitoring_choice() & monitor_choice) {
+ mc = MonitorChoice (t->monitoring_control()->monitoring_choice() & ~monitor_choice);
} else {
/* this line will change when the options are non-orthogonal */
// mc = MonitorChoice (t->monitoring_choice() | monitor_choice);
@@ -873,7 +870,7 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
}
DisplaySuspender ds;
- _session->set_monitoring (rl, mc, Session::rt_cleanup, Controllable::UseGroup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::monitoring_control), (double) mc, Controllable::UseGroup);
return false;
}
@@ -881,35 +878,38 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
void
RouteUI::build_record_menu ()
{
- if (record_menu) {
- return;
- }
-
- /* no rec-button context menu for non-MIDI tracks
- */
-
- if (is_midi_track()) {
+ if (!record_menu) {
record_menu = new Menu;
record_menu->set_name ("ArdourContextMenu");
-
using namespace Menu_Helpers;
MenuList& items = record_menu->items();
- items.push_back (CheckMenuElem (_("Step Entry"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit)));
- step_edit_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
+ items.push_back (CheckMenuElem (_("Rec-Safe"), sigc::mem_fun (*this, &RouteUI::toggle_rec_safe)));
+ rec_safe_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
- if (_route->record_enabled()) {
- step_edit_item->set_sensitive (false);
+ if (is_midi_track()) {
+ items.push_back (SeparatorElem());
+ items.push_back (CheckMenuElem (_("Step Entry"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit)));
+ step_edit_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
}
+ }
+ if (step_edit_item) {
+ if (track()->rec_enable_control()->get_value()) {
+ step_edit_item->set_sensitive (false);
+ }
step_edit_item->set_active (midi_track()->step_editing());
}
+ if (rec_safe_item) {
+ rec_safe_item->set_sensitive (!_route->rec_enable_control()->get_value());
+ rec_safe_item->set_active (_route->rec_safe_control()->get_value());
+ }
}
void
RouteUI::toggle_step_edit ()
{
- if (!is_midi_track() || _route->record_enabled()) {
+ if (!is_midi_track() || track()->rec_enable_control()->get_value()) {
return;
}
@@ -917,6 +917,26 @@ RouteUI::toggle_step_edit ()
}
void
+RouteUI::toggle_rec_safe ()
+{
+ boost::shared_ptr<AutomationControl> rs = _route->rec_safe_control();
+
+ if (!rs) {
+ return;
+ }
+
+ /* This check is made inside the control too, but dong it here can't
+ * hurt.
+ */
+
+ if (_route->rec_enable_control()->get_value()) {
+ return;
+ }
+
+ rs->set_value (rec_safe_item->get_active (), Controllable::UseGroup);
+}
+
+void
RouteUI::step_edit_changed (bool yn)
{
if (yn) {
@@ -1107,41 +1127,42 @@ RouteUI::send_blink (bool onoff)
}
Gtkmm2ext::ActiveState
-RouteUI::solo_active_state (boost::shared_ptr<Route> r)
+RouteUI::solo_active_state (boost::shared_ptr<Stripable> s)
{
- if (r->is_master() || r->is_monitor()) {
+ boost::shared_ptr<SoloControl> sc = s->solo_control();
+
+ if (!sc) {
return Gtkmm2ext::Off;
}
- if (Config->get_solo_control_is_listen_control()) {
-
- if (r->listening_via_monitor()) {
- return Gtkmm2ext::ExplicitActive;
- } else {
- return Gtkmm2ext::Off;
- }
-
+ if (!sc->can_solo()) {
+ return Gtkmm2ext::Off;
}
- if (r->soloed()) {
- if (!r->self_soloed()) {
- return Gtkmm2ext::ImplicitActive;
- } else {
- return Gtkmm2ext::ExplicitActive;
- }
+
+ if (sc->self_soloed()) {
+ return Gtkmm2ext::ExplicitActive;
+ } else if (sc->soloed_by_others()) {
+ return Gtkmm2ext::ImplicitActive;
} else {
return Gtkmm2ext::Off;
}
}
Gtkmm2ext::ActiveState
-RouteUI::solo_isolate_active_state (boost::shared_ptr<Route> r)
+RouteUI::solo_isolate_active_state (boost::shared_ptr<Stripable> s)
{
- if (r->is_master() || r->is_monitor()) {
+ boost::shared_ptr<SoloIsolateControl> sc = s->solo_isolate_control();
+
+ if (!sc) {
+ return Gtkmm2ext::Off;
+ }
+
+ if (s->is_master() || s->is_monitor()) {
return Gtkmm2ext::Off;
}
- if (r->solo_isolated()) {
+ if (sc->solo_isolated()) {
return Gtkmm2ext::ExplicitActive;
} else {
return Gtkmm2ext::Off;
@@ -1149,13 +1170,19 @@ RouteUI::solo_isolate_active_state (boost::shared_ptr<Route> r)
}
Gtkmm2ext::ActiveState
-RouteUI::solo_safe_active_state (boost::shared_ptr<Route> r)
+RouteUI::solo_safe_active_state (boost::shared_ptr<Stripable> s)
{
- if (r->is_master() || r->is_monitor()) {
+ boost::shared_ptr<SoloSafeControl> sc = s->solo_safe_control();
+
+ if (!sc) {
return Gtkmm2ext::Off;
}
- if (r->solo_safe()) {
+ if (s->is_master() || s->is_monitor()) {
+ return Gtkmm2ext::Off;
+ }
+
+ if (sc->solo_safe()) {
return Gtkmm2ext::ExplicitActive;
} else {
return Gtkmm2ext::Off;
@@ -1165,13 +1192,13 @@ RouteUI::solo_safe_active_state (boost::shared_ptr<Route> r)
void
RouteUI::update_solo_display ()
{
- bool yn = _route->solo_safe ();
+ bool yn = _route->solo_safe_control()->solo_safe ();
if (solo_safe_check && solo_safe_check->get_active() != yn) {
solo_safe_check->set_active (yn);
}
- yn = _route->solo_isolated ();
+ yn = _route->solo_isolate_control()->solo_isolated ();
if (solo_isolated_check && solo_isolated_check->get_active() != yn) {
solo_isolated_check->set_active (yn);
@@ -1180,7 +1207,7 @@ RouteUI::update_solo_display ()
set_button_names ();
if (solo_isolated_led) {
- if (_route->solo_isolated()) {
+ if (_route->solo_isolate_control()->solo_isolated()) {
solo_isolated_led->set_active_state (Gtkmm2ext::ExplicitActive);
} else {
solo_isolated_led->unset_active_state ();
@@ -1188,7 +1215,7 @@ RouteUI::update_solo_display ()
}
if (solo_safe_led) {
- if (_route->solo_safe()) {
+ if (_route->solo_safe_control()->solo_safe()) {
solo_safe_led->set_active_state (Gtkmm2ext::ExplicitActive);
} else {
solo_safe_led->unset_active_state ();
@@ -1200,7 +1227,7 @@ RouteUI::update_solo_display ()
/* some changes to solo status can affect mute display, so catch up
*/
- update_mute_display ();
+ update_mute_display ();
}
void
@@ -1210,19 +1237,25 @@ RouteUI::solo_changed_so_update_mute ()
}
ActiveState
-RouteUI::mute_active_state (Session* s, boost::shared_ptr<Route> r)
+RouteUI::mute_active_state (Session*, boost::shared_ptr<Stripable> s)
{
- if (r->is_monitor()) {
- return ActiveState(0);
+ boost::shared_ptr<MuteControl> mc = s->mute_control();
+
+ if (s->is_monitor()) {
+ return Gtkmm2ext::Off;
}
+ if (!mc) {
+ return Gtkmm2ext::Off;
+ }
if (Config->get_show_solo_mutes() && !Config->get_solo_control_is_listen_control ()) {
- if (r->muted ()) {
+ if (mc->muted_by_self ()) {
/* full mute */
return Gtkmm2ext::ExplicitActive;
- } else if (r->muted_by_others()) {
+ } else if (mc->muted_by_others_soloing () || mc->muted_by_masters ()) {
+ /* this will reflect both solo mutes AND master mutes */
return Gtkmm2ext::ImplicitActive;
} else {
/* no mute at all */
@@ -1231,9 +1264,12 @@ RouteUI::mute_active_state (Session* s, boost::shared_ptr<Route> r)
} else {
- if (r->muted()) {
+ if (mc->muted_by_self()) {
/* full mute */
return Gtkmm2ext::ExplicitActive;
+ } else if (mc->muted_by_masters ()) {
+ /* this shows only master mutes, not mute-by-others-soloing */
+ return Gtkmm2ext::ImplicitActive;
} else {
/* no mute at all */
return Gtkmm2ext::Off;
@@ -1253,18 +1289,17 @@ RouteUI::update_mute_display ()
mute_button->set_active_state (mute_active_state (_session, _route));
}
+
void
RouteUI::route_rec_enable_changed ()
{
- blink_rec_display(true); //this lets the button change "immediately" rather than wait for the next blink
- update_monitoring_display ();
+ blink_rec_display (true); //this lets the button change "immediately" rather than wait for the next blink
}
void
RouteUI::session_rec_enable_changed ()
{
- blink_rec_display(true); //this lets the button change "immediately" rather than wait for the next blink
- update_monitoring_display ();
+ blink_rec_display (true); //this lets the button change "immediately" rather than wait for the next blink
}
void
@@ -1273,11 +1308,16 @@ RouteUI::blink_rec_display (bool blinkOn)
if (!rec_enable_button || !_route) {
return;
}
+
if (boost::dynamic_pointer_cast<Send>(_current_delivery)) {
return;
}
- if (_route->record_enabled()) {
+ if (!is_track()) {
+ return;
+ }
+
+ if (track()->rec_enable_control()->get_value()) {
switch (_session->record_status ()) {
case Session::Recording:
rec_enable_button->set_active_state (Gtkmm2ext::ExplicitActive);
@@ -1285,12 +1325,12 @@ RouteUI::blink_rec_display (bool blinkOn)
case Session::Disabled:
case Session::Enabled:
- if ( UIConfiguration::instance().get_blink_rec_arm() )
- rec_enable_button->set_active_state ( blinkOn ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off );
- else
- rec_enable_button->set_active_state ( ImplicitActive );
+ if (UIConfiguration::instance().get_blink_rec_arm()) {
+ rec_enable_button->set_active_state ( blinkOn ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off );
+ } else {
+ rec_enable_button->set_active_state ( ImplicitActive );
+ }
break;
-
}
if (step_edit_item) {
@@ -1305,7 +1345,6 @@ RouteUI::blink_rec_display (bool blinkOn)
}
}
-
check_rec_enable_sensitivity ();
}
@@ -1320,14 +1359,14 @@ RouteUI::build_solo_menu (void)
Gtk::CheckMenuItem* check;
check = new Gtk::CheckMenuItem(_("Solo Isolate"));
- check->set_active (_route->solo_isolated());
+ check->set_active (_route->solo_isolate_control()->solo_isolated());
check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_isolated), check));
items.push_back (CheckMenuElem(*check));
solo_isolated_check = dynamic_cast<Gtk::CheckMenuItem*>(&items.back());
check->show_all();
check = new Gtk::CheckMenuItem(_("Solo Safe"));
- check->set_active (_route->solo_safe());
+ check->set_active (_route->solo_safe_control()->solo_safe());
check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_safe), check));
items.push_back (CheckMenuElem(*check));
solo_safe_check = dynamic_cast<Gtk::CheckMenuItem*>(&items.back());
@@ -1381,16 +1420,16 @@ RouteUI::build_mute_menu(void)
void
RouteUI::init_mute_menu(MuteMaster::MutePoint mp, Gtk::CheckMenuItem* check)
{
- check->set_active (_route->mute_points() & mp);
+ check->set_active (_route->mute_control()->mute_points() & mp);
}
void
RouteUI::toggle_mute_menu(MuteMaster::MutePoint mp, Gtk::CheckMenuItem* check)
{
if (check->get_active()) {
- _route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() | mp));
+ _route->mute_control()->set_mute_points (MuteMaster::MutePoint (_route->mute_control()->mute_points() | mp));
} else {
- _route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() & ~mp));
+ _route->mute_control()->set_mute_points (MuteMaster::MutePoint (_route->mute_control()->mute_points() & ~mp));
}
}
@@ -1400,7 +1439,7 @@ RouteUI::muting_change ()
ENSURE_GUI_THREAD (*this, &RouteUI::muting_change)
bool yn;
- MuteMaster::MutePoint current = _route->mute_points ();
+ MuteMaster::MutePoint current = _route->mute_control()->mute_points ();
yn = (current & MuteMaster::PreFader);
@@ -1435,7 +1474,7 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
}
bool view = solo_isolated_led->active_state();
- bool model = _route->solo_isolated();
+ bool model = _route->solo_isolate_control()->solo_isolated();
/* called BEFORE the view has changed */
@@ -1445,11 +1484,11 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
if (model) {
/* disable isolate for all routes */
DisplaySuspender ds;
- _session->set_solo_isolated (_session->get_routes(), false, Session::rt_cleanup, Controllable::NoGroup);
+ _session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::solo_isolate_control), 0.0, Controllable::NoGroup);
} else {
/* enable isolate for all routes */
DisplaySuspender ds;
- _session->set_solo_isolated (_session->get_routes(), true, Session::rt_cleanup, Controllable::NoGroup);
+ _session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::solo_isolate_control), 1.0, Controllable::NoGroup);
}
} else {
@@ -1461,7 +1500,7 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
boost::shared_ptr<RouteList> rl (new RouteList);
rl->push_back (_route);
DisplaySuspender ds;
- _session->set_solo_isolated (rl, !view, Session::rt_cleanup, Controllable::NoGroup);
+ _session->set_controls (route_list_to_control_list (rl, &Stripable::solo_isolate_control), view ? 0.0 : 1.0, Controllable::NoGroup);
}
}
}
@@ -1477,7 +1516,7 @@ RouteUI::solo_safe_button_release (GdkEventButton* ev)
}
bool view = solo_safe_led->active_state();
- bool model = _route->solo_safe();
+ bool model = _route->solo_safe_control()->solo_safe();
if (ev->button == 1) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
@@ -1486,20 +1525,20 @@ RouteUI::solo_safe_button_release (GdkEventButton* ev)
/* disable solo safe for all routes */
DisplaySuspender ds;
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- (*i)->set_solo_safe (false, Controllable::NoGroup);
+ (*i)->solo_safe_control()->set_value (0.0, Controllable::NoGroup);
}
} else {
/* enable solo safe for all routes */
DisplaySuspender ds;
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- (*i)->set_solo_safe (true, Controllable::NoGroup);
+ (*i)->solo_safe_control()->set_value (1.0, Controllable::NoGroup);
}
}
}
else {
if (model == view) {
/* flip just this route */
- _route->set_solo_safe (!view, Controllable::NoGroup);
+ _route->solo_safe_control()->set_value (view ? 0.0 : 1.0, Controllable::NoGroup);
}
}
}
@@ -1511,19 +1550,19 @@ void
RouteUI::toggle_solo_isolated (Gtk::CheckMenuItem* check)
{
bool view = check->get_active();
- bool model = _route->solo_isolated();
+ bool model = _route->solo_isolate_control()->solo_isolated();
/* called AFTER the view has changed */
if (model != view) {
- _route->set_solo_isolated (view, Controllable::UseGroup);
+ _route->solo_isolate_control()->set_value (view ? 1.0 : 0.0, Controllable::UseGroup);
}
}
void
RouteUI::toggle_solo_safe (Gtk::CheckMenuItem* check)
{
- _route->set_solo_safe (check->get_active(), Controllable::UseGroup);
+ _route->solo_safe_control()->set_value (check->get_active() ? 1.0 : 0.0, Controllable::UseGroup);
}
/** Ask the user to choose a colour, and then apply that color to my route
@@ -1532,10 +1571,11 @@ void
RouteUI::choose_color ()
{
bool picked;
- Gdk::Color const color = Gtkmm2ext::UI::instance()->get_color (_("Color Selection"), picked, &_color);
+ Gdk::Color c (gdk_color_from_rgb (_route->presentation_info().color()));
+ Gdk::Color const color = Gtkmm2ext::UI::instance()->get_color (_("Color Selection"), picked, &c);
if (picked) {
- set_color(color);
+ set_color (gdk_color_to_rgba (color));
}
}
@@ -1543,22 +1583,9 @@ RouteUI::choose_color ()
* the route is in a group which shares its color with its routes.
*/
void
-RouteUI::set_color (const Gdk::Color & c)
+RouteUI::set_color (uint32_t c)
{
- /* leave _color alone in the group case so that tracks can retain their
- * own pre-group colors.
- */
-
- char buf[64];
- _color = c;
- snprintf (buf, sizeof (buf), "%d:%d:%d", c.get_red(), c.get_green(), c.get_blue());
-
- /* note: we use the route state ID here so that color is the same for both
- the time axis view and the mixer strip
- */
-
- gui_object_state().set_property<string> (route_state_id(), X_("color"), buf);
- _route->gui_changed ("color", (void *) 0); /* EMIT_SIGNAL */
+ _route->presentation_info().set_color (c);
}
/** @return GUI state ID for things that are common to the route in all its representations */
@@ -1571,21 +1598,11 @@ RouteUI::route_state_id () const
int
RouteUI::set_color_from_route ()
{
- const string str = gui_object_state().get_string (route_state_id(), X_("color"));
-
- if (str.empty()) {
- return 1;
+ if (_route->presentation_info().color_set()) {
+ return 0; /* nothing to do */
}
- int r, g, b;
-
- sscanf (str.c_str(), "%d:%d:%d", &r, &g, &b);
-
- _color.set_red (r);
- _color.set_green (g);
- _color.set_blue (b);
-
- return 0;
+ return 1; /* pick a color */
}
/** @return true if this name should be used for the route, otherwise false */
@@ -1654,14 +1671,6 @@ RouteUI::route_rename ()
}
void
-RouteUI::property_changed (const PropertyChange& what_changed)
-{
- if (what_changed.contains (ARDOUR::Properties::name)) {
- name_label.set_text (_route->name());
- }
-}
-
-void
RouteUI::toggle_comment_editor ()
{
// if (ignore_toggle) {
@@ -1825,12 +1834,6 @@ RouteUI::has_audio_outputs () const
return (_route->n_outputs().n_audio() > 0);
}
-string
-RouteUI::name() const
-{
- return _route->name();
-}
-
void
RouteUI::map_frozen ()
{
@@ -1839,14 +1842,7 @@ RouteUI::map_frozen ()
AudioTrack* at = dynamic_cast<AudioTrack*>(_route.get());
if (at) {
- switch (at->freeze_state()) {
- case AudioTrack::Frozen:
- rec_enable_button->set_sensitive (false);
- break;
- default:
- rec_enable_button->set_sensitive (true);
- break;
- }
+ check_rec_enable_sensitivity ();
}
}
@@ -1919,12 +1915,27 @@ RouteUI::save_as_template ()
void
RouteUI::check_rec_enable_sensitivity ()
{
+ if (!rec_enable_button) {
+ assert (0); // This should not happen
+ return;
+ }
+ if (!_session->writable()) {
+ rec_enable_button->set_sensitive (false);
+ return;
+ }
+
if (_session->transport_rolling() && rec_enable_button->active_state() && Config->get_disable_disarm_during_roll()) {
rec_enable_button->set_sensitive (false);
+ } else if (is_audio_track () && track()->freeze_state() == AudioTrack::Frozen) {
+ rec_enable_button->set_sensitive (false);
} else {
rec_enable_button->set_sensitive (true);
}
-
+ if (_route && _route->rec_safe_control () && _route->rec_safe_control()->get_value()) {
+ rec_enable_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
+ } else {
+ rec_enable_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
+ }
update_monitoring_display ();
}
@@ -1953,80 +1964,25 @@ RouteUI::parameter_changed (string const & p)
void
RouteUI::step_gain_up ()
{
- _route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.1), Controllable::UseGroup);
+ _route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.1), Controllable::UseGroup);
}
void
RouteUI::page_gain_up ()
{
- _route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.5), Controllable::UseGroup);
+ _route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.5), Controllable::UseGroup);
}
void
RouteUI::step_gain_down ()
{
- _route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.1), Controllable::UseGroup);
+ _route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.1), Controllable::UseGroup);
}
void
RouteUI::page_gain_down ()
{
- _route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.5), Controllable::UseGroup);
-}
-
-void
-RouteUI::open_remote_control_id_dialog ()
-{
- ArdourDialog dialog (_("Remote Control ID"));
- SpinButton* spin = 0;
-
- dialog.get_vbox()->set_border_width (18);
-
- if (Config->get_remote_model() == UserOrdered) {
- uint32_t const limit = _session->ntracks() + _session->nbusses () + 4;
-
- HBox* hbox = manage (new HBox);
- hbox->set_spacing (6);
- hbox->pack_start (*manage (new Label (_("Remote control ID:"))));
- spin = manage (new SpinButton);
- spin->set_digits (0);
- spin->set_increments (1, 10);
- spin->set_range (0, limit);
- spin->set_value (_route->remote_control_id());
- hbox->pack_start (*spin);
- dialog.get_vbox()->pack_start (*hbox);
-
- dialog.add_button (Stock::CANCEL, RESPONSE_CANCEL);
- dialog.add_button (Stock::APPLY, RESPONSE_ACCEPT);
- } else {
- Label* l = manage (new Label());
- if (_route->is_master() || _route->is_monitor()) {
- l->set_markup (string_compose (_("The remote control ID of %1 is: %2\n\n\n"
- "The remote control ID of %3 cannot be changed."),
- Gtkmm2ext::markup_escape_text (_route->name()),
- _route->remote_control_id(),
- (_route->is_master() ? _("the master bus") : _("the monitor bus"))));
- } else {
- l->set_markup (string_compose (_("The remote control ID of %5 is: %2\n\n\n"
- "Remote Control IDs are currently determined by track/bus ordering in %6.\n\n"
- "%3Use the User Interaction tab of the Preferences window if you want to change this%4"),
- (is_track() ? _("track") : _("bus")),
- _route->remote_control_id(),
- "<span size=\"small\" style=\"italic\">",
- "</span>",
- Gtkmm2ext::markup_escape_text (_route->name()),
- PROGRAM_NAME));
- }
- dialog.get_vbox()->pack_start (*l);
- dialog.add_button (Stock::OK, RESPONSE_CANCEL);
- }
-
- dialog.show_all ();
- int const r = dialog.run ();
-
- if (r == RESPONSE_ACCEPT && spin) {
- _route->set_remote_control_id (spin->get_value_as_int ());
- }
+ _route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.5), Controllable::UseGroup);
}
void
@@ -2064,9 +2020,9 @@ RouteUI::setup_invert_buttons ()
}
if (N <= _max_invert_buttons) {
- UI::instance()->set_tip (*b, string_compose (_("Left-click to invert (phase reverse) channel %1 of this track. Right-click to show menu."), i + 1));
+ UI::instance()->set_tip (*b, string_compose (_("Left-click to invert polarity of channel %1 of this track. Right-click to show menu."), i + 1));
} else {
- UI::instance()->set_tip (*b, _("Click to show a menu of channels for inversion (phase reverse)"));
+ UI::instance()->set_tip (*b, _("Click to show a menu of channels to invert polarity"));
}
_invert_buttons.push_back (b);
@@ -2089,9 +2045,9 @@ RouteUI::set_invert_button_state ()
ArdourButton* b = _invert_buttons.front ();
- if (_route->phase_invert().count() == _route->phase_invert().size()) {
+ if (_route->phase_control()->count() == _route->phase_control()->size()) {
b->set_active_state (Gtkmm2ext::ExplicitActive);
- } else if (_route->phase_invert().any()) {
+ } else if (_route->phase_control()->any()) {
b->set_active_state (Gtkmm2ext::ImplicitActive);
} else {
b->set_active_state (Gtkmm2ext::Off);
@@ -2103,7 +2059,7 @@ RouteUI::set_invert_button_state ()
int j = 0;
for (vector<ArdourButton*>::iterator i = _invert_buttons.begin(); i != _invert_buttons.end(); ++i, ++j) {
- (*i)->set_active (_route->phase_invert (j));
+ (*i)->set_active (_route->phase_control()->inverted (j));
}
}
@@ -2116,7 +2072,7 @@ RouteUI::invert_release (GdkEventButton* ev, uint32_t i)
uint32_t const N = _route->input()->n_ports().n_audio ();
if (N <= _max_invert_buttons) {
/* left-click inverts phase so long as we have a button per channel */
- _route->set_phase_invert (i, !_invert_buttons[i]->get_active());
+ _route->phase_control()->set_phase_invert (i, !_invert_buttons[i]->get_active());
return false;
}
}
@@ -2147,7 +2103,7 @@ RouteUI::invert_press (GdkEventButton* ev)
items.push_back (CheckMenuElem (string_compose (X_("Ã%1"), i + 1), sigc::bind (sigc::mem_fun (*this, &RouteUI::invert_menu_toggled), i)));
Gtk::CheckMenuItem* e = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
++_i_am_the_modifier;
- e->set_active (_route->phase_invert (i));
+ e->set_active (_route->phase_control()->inverted (i));
--_i_am_the_modifier;
}
@@ -2163,7 +2119,8 @@ RouteUI::invert_menu_toggled (uint32_t c)
return;
}
- _route->set_phase_invert (c, !_route->phase_invert (c));
+
+ _route->phase_control()->set_phase_invert (c, !_route->phase_control()->inverted (c));
}
void
@@ -2184,9 +2141,9 @@ RouteUI::request_redraw ()
/** The Route's gui_changed signal has been emitted */
void
-RouteUI::route_gui_changed (string what_changed)
+RouteUI::route_gui_changed (PropertyChange const& what_changed)
{
- if (what_changed == "color") {
+ if (what_changed.contains (Properties::color)) {
if (set_color_from_route () == 0) {
route_color_changed ();
}
@@ -2212,18 +2169,55 @@ RouteUI::track_mode_changed (void)
/** @return the color that this route should use; it maybe its own,
or it maybe that of its route group.
*/
+
Gdk::Color
-RouteUI::color () const
+RouteUI::route_color () const
{
+ Gdk::Color c;
RouteGroup* g = _route->route_group ();
+ string p;
if (g && g->is_color()) {
- Gdk::Color c;
set_color_from_rgba (c, GroupTabs::group_color (g));
- return c;
+ } else {
+
+ /* deal with older 4.x color, which was stored in the GUI object state */
+
+ string p = ARDOUR_UI::instance()->gui_object_state->get_string (route_state_id(), X_("color"));
+
+ if (!p.empty()) {
+
+ /* old v4.x or earlier session. Use this information */
+
+ int red, green, blue;
+ char colon;
+
+ stringstream ss (p);
+
+ /* old color format version was:
+
+ 16bit value for red:16 bit value for green:16 bit value for blue
+
+ decode to rgb ..
+ */
+
+ ss >> red;
+ ss >> colon;
+ ss >> green;
+ ss >> colon;
+ ss >> blue;
+
+ red >>= 2;
+ green >>= 2;
+ blue >>= 2;
+
+ _route->presentation_info().set_color (RGBA_TO_UINT (red, green, blue, 255));
+ }
+
+ set_color_from_rgba (c, _route->presentation_info().color());
}
- return _color;
+ return c;
}
void
@@ -2250,3 +2244,108 @@ RouteUI::route_group() const
{
return _route->route_group();
}
+
+
+RoutePinWindowProxy::RoutePinWindowProxy(std::string const &name, boost::shared_ptr<ARDOUR::Route> route)
+ : WM::ProxyBase (name, string())
+ , _route (boost::weak_ptr<Route> (route))
+{
+ route->DropReferences.connect (going_away_connection, MISSING_INVALIDATOR, boost::bind (&RoutePinWindowProxy::route_going_away, this), gui_context());
+}
+
+RoutePinWindowProxy::~RoutePinWindowProxy()
+{
+ _window = 0;
+}
+
+ARDOUR::SessionHandlePtr*
+RoutePinWindowProxy::session_handle ()
+{
+ ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+ if (aw) { return aw; }
+ return 0;
+}
+
+Gtk::Window*
+RoutePinWindowProxy::get (bool create)
+{
+ boost::shared_ptr<Route> r = _route.lock ();
+ if (!r) {
+ return 0;
+ }
+
+ if (!_window) {
+ if (!create) {
+ return 0;
+ }
+ _window = new PluginPinDialog (r);
+ ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+ if (aw) {
+ aw->set_session (_session);
+ }
+ _window->show_all ();
+ }
+ return _window;
+}
+
+void
+RoutePinWindowProxy::route_going_away ()
+{
+ delete _window;
+ _window = 0;
+ WM::Manager::instance().remove (this);
+ going_away_connection.disconnect();
+}
+
+void
+RouteUI::maybe_add_route_print_mgr ()
+{
+ if (_route->pinmgr_proxy ()) {
+ return;
+ }
+ RoutePinWindowProxy* wp = new RoutePinWindowProxy (
+ string_compose ("RPM-%1", _route->id()), _route);
+ wp->set_session (_session);
+
+ const XMLNode* ui_xml = _session->extra_xml (X_("UI"));
+ if (ui_xml) {
+ wp->set_state (*ui_xml, 0);
+ }
+
+#if 0
+ void* existing_ui = _route->pinmgr_proxy ();
+ if (existing_ui) {
+ wp->use_window (*(reinterpret_cast<Gtk::Window*>(existing_ui)));
+ }
+#endif
+ _route->set_pingmgr_proxy (wp);
+
+ WM::Manager::instance().register_window (wp);
+}
+
+void
+RouteUI::manage_pins ()
+{
+ RoutePinWindowProxy* proxy = _route->pinmgr_proxy ();
+ if (proxy) {
+ proxy->get (true);
+ proxy->present();
+ }
+}
+
+bool
+RouteUI::mark_hidden (bool yn)
+{
+ if (yn != _route->presentation_info().hidden()) {
+ _route->presentation_info().set_hidden (yn);
+ return true; // things changed
+ }
+ return false;
+}
+
+boost::shared_ptr<Stripable>
+RouteUI::stripable () const
+{
+ return _route;
+}
+
diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h
index 461419c..e05db7f 100644
--- a/gtk2_ardour/route_ui.h
+++ b/gtk2_ardour/route_ui.h
@@ -31,14 +31,16 @@
#include "ardour/ardour.h"
#include "ardour/mute_master.h"
-#include "ardour/session_event.h"
#include "ardour/session.h"
+#include "ardour/session_event.h"
+#include "ardour/session_handle.h"
#include "ardour/route.h"
#include "ardour/route_group.h"
#include "ardour/track.h"
#include "axis_view.h"
#include "selectable.h"
+#include "window_manager.h"
namespace ARDOUR {
class AudioTrack;
@@ -54,16 +56,32 @@ namespace Gtk {
class ArdourButton;
class ArdourWindow;
class IOSelectorWindow;
+class ControlSlaveUI;
+
+class RoutePinWindowProxy : public WM::ProxyBase
+{
+ public:
+ RoutePinWindowProxy (std::string const &, boost::shared_ptr<ARDOUR::Route>);
+ ~RoutePinWindowProxy();
+
+ Gtk::Window* get (bool create = false);
+ ARDOUR::SessionHandlePtr* session_handle();
+
+ private:
+ boost::weak_ptr<ARDOUR::Route> _route;
+
+ void route_going_away ();
+ PBD::ScopedConnection going_away_connection;
+};
-class RouteUI : public virtual AxisView
+class RouteUI : public virtual ARDOUR::SessionHandlePtr, public virtual PBD::ScopedConnectionList, public virtual Selectable, public virtual sigc::trackable
{
public:
- RouteUI(ARDOUR::Session*);
- RouteUI(boost::shared_ptr<ARDOUR::Route>, ARDOUR::Session*);
+ RouteUI (ARDOUR::Session*);
virtual ~RouteUI();
- Gdk::Color color () const;
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const;
virtual void set_route (boost::shared_ptr<ARDOUR::Route>);
virtual void set_button_names () = 0;
@@ -80,15 +98,14 @@ class RouteUI : public virtual AxisView
boost::shared_ptr<ARDOUR::AudioTrack> audio_track() const;
boost::shared_ptr<ARDOUR::MidiTrack> midi_track() const;
- std::string name() const;
-
// protected: XXX sigh this should be here
boost::shared_ptr<ARDOUR::Route> _route;
void request_redraw ();
- virtual void set_color (const Gdk::Color & c);
+ virtual void set_color (uint32_t c);
+ Gdk::Color route_color () const;
void choose_color ();
bool ignore_toggle;
@@ -109,6 +126,7 @@ class RouteUI : public virtual AxisView
ArdourButton* solo_safe_led;
ArdourButton* solo_isolated_led;
+
Gtk::Label monitor_input_button_label;
Gtk::Label monitor_disk_button_label;
@@ -137,7 +155,6 @@ class RouteUI : public virtual AxisView
bool monitor_input_release(GdkEventButton*);
bool monitor_disk_press(GdkEventButton*);
bool monitor_disk_release(GdkEventButton*);
- void monitoring_changed ();
void update_monitoring_display ();
void edit_input_configuration ();
@@ -189,7 +206,10 @@ class RouteUI : public virtual AxisView
void route_rename();
- virtual void property_changed (const PBD::PropertyChange&);
+ void manage_pins ();
+ void maybe_add_route_print_mgr ();
+
+ virtual void route_property_changed (const PBD::PropertyChange&) = 0;
void route_removed ();
virtual void route_active_changed () {}
@@ -203,6 +223,9 @@ class RouteUI : public virtual AxisView
void toggle_step_edit ();
virtual void step_edit_changed (bool);
+ Gtk::CheckMenuItem *rec_safe_item;
+ void toggle_rec_safe ();
+
virtual void polarity_changed ();
Gtk::CheckMenuItem *denormal_menu_item;
@@ -222,12 +245,11 @@ class RouteUI : public virtual AxisView
void adjust_latency ();
bool process_save_template_prompter (ArdourPrompter& prompter, const std::string& dir);
void save_as_template ();
- void open_remote_control_id_dialog ();
- static Gtkmm2ext::ActiveState solo_active_state (boost::shared_ptr<ARDOUR::Route>);
- static Gtkmm2ext::ActiveState solo_isolate_active_state (boost::shared_ptr<ARDOUR::Route>);
- static Gtkmm2ext::ActiveState solo_safe_active_state (boost::shared_ptr<ARDOUR::Route>);
- static Gtkmm2ext::ActiveState mute_active_state (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>);
+ static Gtkmm2ext::ActiveState solo_active_state (boost::shared_ptr<ARDOUR::Stripable>);
+ static Gtkmm2ext::ActiveState solo_isolate_active_state (boost::shared_ptr<ARDOUR::Stripable>);
+ static Gtkmm2ext::ActiveState solo_safe_active_state (boost::shared_ptr<ARDOUR::Stripable>);
+ static Gtkmm2ext::ActiveState mute_active_state (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Stripable>);
/** Emitted when a bus has been set or unset from `display sends to this bus' mode
* by a click on the `Sends' button. The parameter is the route that the sends are
@@ -255,8 +277,8 @@ class RouteUI : public virtual AxisView
PBD::ScopedConnectionList route_connections;
bool self_destruct;
- void init ();
- void reset ();
+ void init ();
+ void reset ();
void self_delete ();
virtual void start_step_editing () {}
@@ -265,21 +287,25 @@ class RouteUI : public virtual AxisView
void set_invert_sensitive (bool);
bool verify_new_route_name (const std::string& name);
- void route_gui_changed (std::string);
+ void route_gui_changed (PBD::PropertyChange const&);
virtual void route_color_changed () {}
+ void check_rec_enable_sensitivity ();
+
virtual void bus_send_display_changed (boost::shared_ptr<ARDOUR::Route>);
static std::string program_port_prefix;
+ bool mark_hidden (bool yn);
+
private:
- void check_rec_enable_sensitivity ();
void parameter_changed (std::string const &);
void relabel_solo_button ();
void track_mode_changed ();
std::string route_state_id () const;
+ protected:
struct SoloMuteRelease {
SoloMuteRelease (bool was_active)
: active (was_active)
@@ -296,6 +322,9 @@ class RouteUI : public virtual AxisView
SoloMuteRelease* _solo_release;
SoloMuteRelease* _mute_release;
+ ControlSlaveUI* csu;
+
+private:
void setup_invert_buttons ();
void set_invert_button_state ();
void invert_menu_toggled (uint32_t);
diff --git a/gtk2_ardour/route_ui_selection.h b/gtk2_ardour/route_ui_selection.h
index b26e1c6..03935aa 100644
--- a/gtk2_ardour/route_ui_selection.h
+++ b/gtk2_ardour/route_ui_selection.h
@@ -23,8 +23,8 @@
#include <set>
-class RouteUI;
+class AxisView;
-struct RouteUISelection : std::set<RouteUI*> {};
+struct AxisViewSelection : std::set<AxisView*> {};
#endif /* __ardour_gtk_route_ui_selection_h__ */
diff --git a/gtk2_ardour/ruler_dialog.cc b/gtk2_ardour/ruler_dialog.cc
index ce34d70..cee831f 100644
--- a/gtk2_ardour/ruler_dialog.cc
+++ b/gtk2_ardour/ruler_dialog.cc
@@ -22,7 +22,7 @@
#include "actions.h"
#include "ruler_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
RulerDialog::RulerDialog ()
: ArdourDialog (_("Rulers"))
diff --git a/gtk2_ardour/save_as_dialog.cc b/gtk2_ardour/save_as_dialog.cc
index 9c8d3cb..eaee077 100644
--- a/gtk2_ardour/save_as_dialog.cc
+++ b/gtk2_ardour/save_as_dialog.cc
@@ -23,7 +23,7 @@
#include "save_as_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -85,7 +85,7 @@ SaveAsDialog::SaveAsDialog ()
no_include_media_button.signal_toggled ().connect (sigc::mem_fun (*this, &SaveAsDialog::no_include_toggled));
new_parent_folder_selector.set_action (FILE_CHOOSER_ACTION_SELECT_FOLDER);
- new_parent_folder_selector.set_current_folder (Glib::get_home_dir()); // Why $HOME and not poor_mans_glob (Config->get_default_session_parent_dir ()) ??
+ new_parent_folder_selector.set_current_folder (Config->get_default_session_parent_dir ());
new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SaveAsDialog::name_entry_changed));
new_parent_folder_selector.signal_current_folder_changed().connect (sigc::mem_fun (*this, &SaveAsDialog::name_entry_changed));
new_parent_folder_selector.signal_selection_changed().connect (sigc::mem_fun (*this, &SaveAsDialog::name_entry_changed));
diff --git a/gtk2_ardour/script_selector.cc b/gtk2_ardour/script_selector.cc
new file mode 100644
index 0000000..4a26973
--- /dev/null
+++ b/gtk2_ardour/script_selector.cc
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "gtkmm2ext/utils.h"
+
+#include "script_selector.h"
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace ARDOUR;
+
+ScriptSelector::ScriptSelector (std::string title, LuaScriptInfo::ScriptType type)
+ : ArdourDialog (title)
+ , _type ("", Gtk::ALIGN_START, Gtk::ALIGN_CENTER)
+ , _author ("", Gtk::ALIGN_START, Gtk::ALIGN_CENTER)
+ , _description ("", Gtk::ALIGN_START, Gtk::ALIGN_START)
+ , _scripts (LuaScripting::instance ().scripts (type))
+ , _script_type (type)
+{
+ Gtk::Label* l;
+
+ Table* t = manage (new Table (3, 2));
+ t->set_spacings (6);
+
+ int ty = 0;
+
+ l = manage (new Label (_("<b>Type:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+ l->set_use_markup ();
+ t->attach (*l, 0, 1, ty, ty+1);
+ t->attach (_type, 1, 2, ty, ty+1);
+ ++ty;
+
+ l = manage (new Label (_("<b>Author:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+ l->set_use_markup ();
+ t->attach (*l, 0, 1, ty, ty+1);
+ t->attach (_author, 1, 2, ty, ty+1);
+ ++ty;
+
+ l = manage (new Label (_("<b>Description:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+ l->set_use_markup ();
+ t->attach (*l, 0, 1, ty, ty+1);
+ t->attach (_description, 1, 2, ty, ty+1);
+ ++ty;
+
+ _description.set_line_wrap();
+
+ get_vbox()->set_spacing (6);
+ get_vbox()->pack_start (_script_combo, false, false);
+ get_vbox()->pack_start (*t, true, true);
+
+ Button *r = Gtk::manage (new Gtk::Button (Stock::REFRESH));
+ r->signal_clicked().connect (sigc::mem_fun (*this, &ScriptSelector::refresh));
+ get_action_area()->pack_start(*r);
+
+ add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ _add = add_button (Stock::ADD, RESPONSE_ACCEPT);
+ set_default_response (RESPONSE_ACCEPT);
+
+ _add->set_sensitive (false);
+ _combocon = _script_combo.signal_changed().connect (sigc::mem_fun (*this, &ScriptSelector::script_combo_changed));
+
+ setup_list ();
+ show_all ();
+}
+
+void
+ScriptSelector::setup_list ()
+{
+ _combocon.block();
+ vector<string> script_names;
+ for (LuaScriptList::const_iterator s = _scripts.begin(); s != _scripts.end(); ++s) {
+ script_names.push_back ((*s)->name);
+ }
+
+ Gtkmm2ext::set_popdown_strings (_script_combo, script_names);
+ if (script_names.size() > 0) {
+ _script_combo.set_active(0);
+ script_combo_changed ();
+ }
+ _combocon.unblock();
+}
+
+void
+ScriptSelector::script_combo_changed ()
+{
+ int i = _script_combo.get_active_row_number();
+ _script = _scripts[i];
+
+ _type.set_text(LuaScriptInfo::type2str (_script->type));
+ _author.set_text (_script->author);
+ _description.set_text (_script->description);
+
+ _add->set_sensitive (Glib::file_test(_script->path, Glib::FILE_TEST_EXISTS));
+}
+
+void
+ScriptSelector::refresh ()
+{
+ LuaScripting::instance ().refresh ();
+ _script.reset ();
+ _scripts = LuaScripting::instance ().scripts (_script_type);
+ setup_list ();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+SessionScriptManager::SessionScriptManager (std::string title, const std::vector<std::string> &names)
+ : ArdourDialog (title)
+{
+ assert (names.size() > 0);
+ Gtkmm2ext::set_popdown_strings (_names_combo, names);
+ _names_combo.set_active(0);
+
+ Gtk::Label* l;
+ l = manage (new Label (_("Select Script to unload")));
+
+ get_vbox()->set_spacing (6);
+ get_vbox()->pack_start (*l, false, false);
+ get_vbox()->pack_start (_names_combo, false, false);
+
+ add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ add_button (Stock::REMOVE, RESPONSE_ACCEPT);
+ set_default_response (RESPONSE_CANCEL);
+
+ show_all ();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+ScriptParameterDialog::ScriptParameterDialog (std::string title,
+ const LuaScriptInfoPtr& spi,
+ const std::vector<std::string> &names,
+ LuaScriptParamList& lsp)
+ : ArdourDialog (title)
+ , _existing_names (names)
+ , _lsp (lsp)
+{
+ Gtk::Label* l;
+
+ Table* t = manage (new Table (4, 3));
+ t->set_spacings (6);
+
+ _name_entry.set_text (spi->name);
+ _name_entry.signal_changed().connect (sigc::mem_fun (*this, &ScriptParameterDialog::update_sensitivity));
+
+ int ty = 0;
+
+ l = manage (new Label (_("<b>Name:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+ l->set_use_markup ();
+ t->attach (*l, 0, 1, ty, ty+1);
+ t->attach (_name_entry, 1, 2, ty, ty+1);
+ ++ty;
+
+ if (_lsp.size () > 0) {
+ l = manage (new Label (_("<b>Instance Parameters</b>"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
+ l->set_use_markup ();
+ t->attach (*l, 0, 2, ty, ty+1);
+ ++ty;
+ }
+
+ for (size_t i = 0; i < _lsp.size (); ++i) {
+ CheckButton* c = manage (new CheckButton (_lsp[i]->title));
+ Entry* e = manage (new Entry());
+ c->set_active (!_lsp[i]->optional); // also if default ??
+ c->set_sensitive (_lsp[i]->optional);
+ e->set_text (_lsp[i]->dflt);
+ e->set_sensitive (c->get_active ());
+
+ c->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &ScriptParameterDialog::active_changed), i, c, e));
+ e->signal_changed().connect (sigc::bind (sigc::mem_fun (*this, &ScriptParameterDialog::value_changed), i, e));
+
+ t->attach (*c, 0, 1, ty, ty+1);
+ t->attach (*e, 1, 2, ty, ty+1);
+ ++ty;
+ }
+
+ add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ _add = add_button (Stock::ADD, RESPONSE_ACCEPT);
+ set_default_response (RESPONSE_ACCEPT);
+
+ get_vbox()->pack_start (*t, true, true);
+ show_all ();
+ update_sensitivity ();
+}
+
+void
+ScriptParameterDialog::update_sensitivity ()
+{
+ std::string n = _name_entry.get_text ();
+ if (n.empty() || std::find (_existing_names.begin(), _existing_names.end(), n) != _existing_names.end()) {
+ _add->set_sensitive (false);
+ return;
+ }
+
+ for (size_t i = 0; i < _lsp.size(); ++i) {
+ if (!_lsp[i]->optional && _lsp[i]->value.empty()) {
+ _add->set_sensitive (false);
+ return;
+ }
+ }
+
+ _add->set_sensitive (true);
+}
+
+void
+ScriptParameterDialog::active_changed (int i, Gtk::CheckButton* c, Gtk::Entry* e)
+{
+ bool en = c->get_active ();
+ _lsp[i]->is_set = en;
+ e->set_sensitive (en);
+}
+
+void
+ScriptParameterDialog::value_changed (int i, Gtk::Entry* e)
+{
+ _lsp[i]->value = e->get_text ();
+}
diff --git a/gtk2_ardour/script_selector.h b/gtk2_ardour/script_selector.h
new file mode 100644
index 0000000..b249cfe
--- /dev/null
+++ b/gtk2_ardour/script_selector.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtkmm.h>
+#include "ardour/luascripting.h"
+
+#include "ardour_dialog.h"
+
+class ScriptSelector : public ArdourDialog
+{
+public:
+ ScriptSelector (std::string title, ARDOUR::LuaScriptInfo::ScriptType t);
+ ARDOUR::LuaScriptInfoPtr script() const { return _script; }
+
+private:
+ void setup_list ();
+ void refresh ();
+ void script_combo_changed ();
+
+ Gtk::Button* _add;
+ Gtk::ComboBoxText _script_combo;
+
+ Gtk::Label _type;
+ Gtk::Label _author;
+ Gtk::Label _description;
+
+ ARDOUR::LuaScriptList _scripts;
+ ARDOUR::LuaScriptInfoPtr _script;
+ ARDOUR::LuaScriptInfo::ScriptType _script_type;
+ sigc::connection _combocon;
+};
+
+class SessionScriptManager : public ArdourDialog
+{
+public:
+ SessionScriptManager (std::string title, const std::vector<std::string>&);
+ std::string name () { return _names_combo.get_active_text (); }
+
+private:
+ Gtk::ComboBoxText _names_combo;
+};
+
+class ScriptParameterDialog : public ArdourDialog
+{
+public:
+ ScriptParameterDialog (std::string title, const ARDOUR::LuaScriptInfoPtr&, const std::vector<std::string>&, ARDOUR::LuaScriptParamList&);
+ std::string name () { return _name_entry.get_text (); }
+
+private:
+ void update_sensitivity ();
+ void active_changed (int, Gtk::CheckButton*, Gtk::Entry*);
+ void value_changed (int, Gtk::Entry*);
+
+ Gtk::Entry _name_entry;
+ Gtk::Button* _add;
+ const std::vector<std::string> &_existing_names;
+ ARDOUR::LuaScriptParamList& _lsp;
+};
diff --git a/gtk2_ardour/search_path_option.cc b/gtk2_ardour/search_path_option.cc
index 9aea617..925b983 100644
--- a/gtk2_ardour/search_path_option.cc
+++ b/gtk2_ardour/search_path_option.cc
@@ -21,7 +21,7 @@
#include "pbd/shortpath.h"
#include "search_path_option.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/selectable.h b/gtk2_ardour/selectable.h
index 2d31dbf..2ffac87 100644
--- a/gtk2_ardour/selectable.h
+++ b/gtk2_ardour/selectable.h
@@ -37,7 +37,7 @@ class Selectable : public virtual sigc::trackable
}
}
- bool get_selected() const {
+ virtual bool selected() const {
return _selected;
}
diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc
index aa12e4f..f7eb676 100644
--- a/gtk2_ardour/selection.cc
+++ b/gtk2_ardour/selection.cc
@@ -26,6 +26,8 @@
#include "ardour/playlist.h"
#include "ardour/rc_configuration.h"
+#include "control_protocol/control_protocol.h"
+
#include "audio_region_view.h"
#include "debug.h"
#include "gui_thread.h"
@@ -39,7 +41,7 @@
#include "public_editor.h"
#include "control_point.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -620,10 +622,14 @@ Selection::add (boost::shared_ptr<Evoral::ControlList> cl)
warning << "Programming error: Selected list is not an ARDOUR::AutomationList" << endmsg;
return;
}
- if (find (lines.begin(), lines.end(), al) == lines.end()) {
- lines.push_back (al);
- LinesChanged();
- }
+
+ /* The original may change so we must store a copy (not a pointer) here.
+ * e.g AutomationLine rewrites the list with gain mapping.
+ * the downside is that we can't perfom duplicate checks.
+ * This code was changed in response to #6842
+ */
+ lines.push_back (boost::shared_ptr<ARDOUR::AutomationList> (new ARDOUR::AutomationList(*al)));
+ LinesChanged();
}
void
@@ -633,6 +639,7 @@ Selection::remove (TimeAxisView* track)
if ((i = find (tracks.begin(), tracks.end(), track)) != tracks.end()) {
track->set_selected (false);
tracks.erase (i);
+
if (!_no_tracks_changed) {
TracksChanged();
}
@@ -947,7 +954,7 @@ Selection::selected (ArdourMarker* m)
bool
Selection::selected (TimeAxisView* tv)
{
- return tv->get_selected ();
+ return tv->selected ();
}
bool
@@ -993,7 +1000,7 @@ Selection::toggle (ControlPoint* cp)
clear_time(); //enforce region/object exclusivity
clear_tracks(); //enforce object/track exclusivity
- cp->set_selected (!cp->get_selected ());
+ cp->set_selected (!cp->selected ());
PointSelection::iterator i = find (points.begin(), points.end(), cp);
if (i == points.end()) {
points.push_back (cp);
@@ -1143,7 +1150,7 @@ Selection::set (ControlPoint* cp)
clear_time (); //enforce region/object exclusivity
clear_tracks(); //enforce object/track exclusivity
- if (cp->get_selected () && points.size () == 1) {
+ if (cp->selected () && points.size () == 1) {
return;
}
@@ -1361,7 +1368,7 @@ Selection::set_state (XMLNode const & node, int)
for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
if ((*i)->name() == X_("RouteView")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
assert (prop_id);
PBD::ID id (prop_id->value ());
RouteTimeAxisView* rtv = editor->get_route_view_by_route_id (id);
@@ -1370,7 +1377,7 @@ Selection::set_state (XMLNode const & node, int)
}
} else if ((*i)->name() == X_("Region")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
assert (prop_id);
PBD::ID id (prop_id->value ());
@@ -1388,7 +1395,7 @@ Selection::set_state (XMLNode const & node, int)
}
} else if ((*i)->name() == X_("MIDINote")) {
- XMLProperty* prop_region_id = (*i)->property (X_("region-id"));
+ XMLProperty const * prop_region_id = (*i)->property (X_("region-id"));
assert (prop_region_id);
@@ -1401,12 +1408,12 @@ Selection::set_state (XMLNode const & node, int)
XMLNodeList children = (*i)->children ();
for (XMLNodeList::const_iterator ci = children.begin(); ci != children.end(); ++ci) {
- XMLProperty* prop_channel = (*ci)->property (X_("channel"));
- XMLProperty* prop_time = (*ci)->property (X_("time"));
- XMLProperty* prop_note = (*ci)->property (X_("note"));
- XMLProperty* prop_length = (*ci)->property (X_("length"));
- XMLProperty* prop_velocity = (*ci)->property (X_("velocity"));
- XMLProperty* prop_off_velocity = (*ci)->property (X_("off-velocity"));
+ XMLProperty const * prop_channel = (*ci)->property (X_("channel"));
+ XMLProperty const * prop_time = (*ci)->property (X_("time"));
+ XMLProperty const * prop_note = (*ci)->property (X_("note"));
+ XMLProperty const * prop_length = (*ci)->property (X_("length"));
+ XMLProperty const * prop_velocity = (*ci)->property (X_("velocity"));
+ XMLProperty const * prop_off_velocity = (*ci)->property (X_("off-velocity"));
assert (prop_channel);
assert (prop_time);
@@ -1441,16 +1448,16 @@ Selection::set_state (XMLNode const & node, int)
}
} else if ((*i)->name() == X_("ControlPoint")) {
- XMLProperty* prop_type = (*i)->property (X_("type"));
+ XMLProperty const * prop_type = (*i)->property (X_("type"));
assert(prop_type);
if (prop_type->value () == "track") {
- XMLProperty* prop_route_id = (*i)->property (X_("route-id"));
- XMLProperty* prop_alist_id = (*i)->property (X_("automation-list-id"));
- XMLProperty* prop_parameter = (*i)->property (X_("parameter"));
- XMLProperty* prop_view_index = (*i)->property (X_("view-index"));
+ XMLProperty const * prop_route_id = (*i)->property (X_("route-id"));
+ XMLProperty const * prop_alist_id = (*i)->property (X_("automation-list-id"));
+ XMLProperty const * prop_parameter = (*i)->property (X_("parameter"));
+ XMLProperty const * prop_view_index = (*i)->property (X_("view-index"));
assert (prop_route_id);
assert (prop_alist_id);
@@ -1480,8 +1487,8 @@ Selection::set_state (XMLNode const & node, int)
add (cps);
}
} else if (prop_type->value () == "region") {
- XMLProperty* prop_region_id = (*i)->property (X_("region-id"));
- XMLProperty* prop_view_index = (*i)->property (X_("view-index"));
+ XMLProperty const * prop_region_id = (*i)->property (X_("region-id"));
+ XMLProperty const * prop_view_index = (*i)->property (X_("view-index"));
if (!prop_region_id || !prop_view_index) {
continue;
@@ -1511,8 +1518,8 @@ Selection::set_state (XMLNode const & node, int)
}
} else if ((*i)->name() == X_("AudioRange")) {
- XMLProperty* prop_start = (*i)->property (X_("start"));
- XMLProperty* prop_end = (*i)->property (X_("end"));
+ XMLProperty const * prop_start = (*i)->property (X_("start"));
+ XMLProperty const * prop_end = (*i)->property (X_("end"));
assert (prop_start);
assert (prop_end);
@@ -1524,8 +1531,8 @@ Selection::set_state (XMLNode const & node, int)
} else if ((*i)->name() == X_("AutomationView")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
- XMLProperty* prop_parameter = (*i)->property (X_("parameter"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_parameter = (*i)->property (X_("parameter"));
assert (prop_id);
assert (prop_parameter);
@@ -1548,8 +1555,8 @@ Selection::set_state (XMLNode const & node, int)
} else if ((*i)->name() == X_("Marker")) {
- XMLProperty* prop_id = (*i)->property (X_("id"));
- XMLProperty* prop_start = (*i)->property (X_("start"));
+ XMLProperty const * prop_id = (*i)->property (X_("id"));
+ XMLProperty const * prop_start = (*i)->property (X_("start"));
assert (prop_id);
assert (prop_start);
diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h
index aa9510b..c9f5edd 100644
--- a/gtk2_ardour/selection.h
+++ b/gtk2_ardour/selection.h
@@ -107,6 +107,11 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
void block_tracks_changed (bool);
void clear ();
+
+ /** check if all selections are empty
+ * @param internal_selection also check object internals (e.g midi notes, automation points), when false only check objects.
+ * @return true if nothing is selected.
+ */
bool empty (bool internal_selection = false);
void dump_region_layers();
diff --git a/gtk2_ardour/selection_memento.cc b/gtk2_ardour/selection_memento.cc
index ae3ad73..f122de3 100644
--- a/gtk2_ardour/selection_memento.cc
+++ b/gtk2_ardour/selection_memento.cc
@@ -22,7 +22,7 @@
#include "editing.h"
#include "public_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
SelectionMemento::SelectionMemento ()
{
@@ -54,7 +54,7 @@ SelectionMemento::get_state () {
int
SelectionMemento::set_state (const XMLNode& node, int /*version*/) {
- const XMLProperty* prop;
+ XMLProperty const * prop;
PublicEditor& editor = PublicEditor::instance();
if (node.name() != X_("SelectionMemento")) {
return -1;
diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc
index 7f87f2d..364e44c 100644
--- a/gtk2_ardour/send_ui.cc
+++ b/gtk2_ardour/send_ui.cc
@@ -29,7 +29,7 @@
#include "timers.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc
index 9ba479e..225b02d 100644
--- a/gtk2_ardour/session_dialog.cc
+++ b/gtk2_ardour/session_dialog.cc
@@ -54,7 +54,7 @@
#include "session_dialog.h"
#include "opts.h"
#include "engine_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "tooltips.h"
#include "ui_config.h"
#include "utils.h"
@@ -348,7 +348,10 @@ SessionDialog::setup_initial_choice_box ()
string image_path;
- if (find_file (ardour_data_search_path(), "small-splash.png", image_path)) {
+ Searchpath rc (ARDOUR::ardour_data_search_path());
+ rc.add_subdirectory_to_paths ("resources");
+
+ if (find_file (rc, PROGRAM_NAME "-small-splash.png", image_path)) {
Gtk::Image* image;
if ((image = manage (new Gtk::Image (image_path))) != 0) {
hbox->pack_start (*image, false, false);
diff --git a/gtk2_ardour/session_import_dialog.cc b/gtk2_ardour/session_import_dialog.cc
index 5783c83..b528f91 100644
--- a/gtk2_ardour/session_import_dialog.cc
+++ b/gtk2_ardour/session_import_dialog.cc
@@ -33,7 +33,7 @@
#include "gui_thread.h"
#include "prompter.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/gtk2_ardour/session_metadata_dialog.cc b/gtk2_ardour/session_metadata_dialog.cc
index 7973d03..a4cfee2 100644
--- a/gtk2_ardour/session_metadata_dialog.cc
+++ b/gtk2_ardour/session_metadata_dialog.cc
@@ -30,7 +30,7 @@
#include "ardour/session.h"
#include "ardour/session_utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Glib;
@@ -270,15 +270,18 @@ EAN13MetadataField::update_status ()
// calculate EAN-13 modulo 10 check digit
int sum = 0;
const char *p = _value.c_str();
- for (int i =0; i < 12; i++) {
+ for (int i = 0; i < 12; i++) {
char c = p[i] - '0';
if (i % 2) {
- sum += c;
- } else {
sum += c * 3;
+ } else {
+ sum += c;
}
}
sum %= 10;
+ if (sum)
+ sum = 10 - sum;
+
if (sum == p[12] - '0') {
status_label->set_markup (string_compose(
"<span color=\"green\">%1: %2</span>",
diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc
index fa02278..baadcef 100644
--- a/gtk2_ardour/session_option_editor.cc
+++ b/gtk2_ardour/session_option_editor.cc
@@ -22,14 +22,14 @@
#include "gui_thread.h"
#include "session_option_editor.h"
#include "search_path_option.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
using namespace Timecode;
SessionOptionEditor::SessionOptionEditor (Session* s)
- : OptionEditor (&(s->config), _("Session Properties"))
+ : OptionEditorWindow (&(s->config), _("Session Properties"))
, _session_config (&(s->config))
{
set_session (s);
@@ -207,20 +207,20 @@ SessionOptionEditor::SessionOptionEditor (Session* s)
add_option (_("Media"), hf);
- add_option (_("Locations"), new OptionEditorHeading (_("File locations")));
+ add_option (S_("Files|Locations"), new OptionEditorHeading (_("File locations")));
SearchPathOption* spo = new SearchPathOption ("audio-search-path", _("Search for audio files in:"),
_session->path(),
sigc::mem_fun (*_session_config, &SessionConfiguration::get_audio_search_path),
sigc::mem_fun (*_session_config, &SessionConfiguration::set_audio_search_path));
- add_option (_("Locations"), spo);
+ add_option (S_("Files|Locations"), spo);
spo = new SearchPathOption ("midi-search-path", _("Search for MIDI files in:"),
_session->path(),
sigc::mem_fun (*_session_config, &SessionConfiguration::get_midi_search_path),
sigc::mem_fun (*_session_config, &SessionConfiguration::set_midi_search_path));
- add_option (_("Locations"), spo);
+ add_option (S_("Files|Locations"), spo);
/* File Naming */
diff --git a/gtk2_ardour/session_option_editor.h b/gtk2_ardour/session_option_editor.h
index 425ec37..759f28f 100644
--- a/gtk2_ardour/session_option_editor.h
+++ b/gtk2_ardour/session_option_editor.h
@@ -27,7 +27,7 @@ namespace ARDOUR {
class SessionConfiguration;
}
-class SessionOptionEditor : public OptionEditor
+class SessionOptionEditor : public OptionEditorWindow
{
public:
SessionOptionEditor (ARDOUR::Session* s);
diff --git a/gtk2_ardour/sfdb_freesound_mootcher.cc b/gtk2_ardour/sfdb_freesound_mootcher.cc
index 94e0058..74290df 100644
--- a/gtk2_ardour/sfdb_freesound_mootcher.cc
+++ b/gtk2_ardour/sfdb_freesound_mootcher.cc
@@ -50,7 +50,7 @@
#include <glib.h>
#include "pbd/gstdio_compat.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "ardour/audio_library.h"
#include "ardour/rc_configuration.h"
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc
index 104d091..f94c584 100644
--- a/gtk2_ardour/sfdb_ui.cc
+++ b/gtk2_ardour/sfdb_ui.cc
@@ -21,7 +21,7 @@
#include "gtk2ardour-config.h"
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <map>
#include <cerrno>
@@ -560,7 +560,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
, gm (0)
{
-#ifdef GTKOSX
+#ifdef __APPLE__
try {
/* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
chooser.add_shortcut_folder_uri("file:///Library/GarageBand/Apple Loops");
@@ -597,7 +597,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
chooser.signal_update_preview().connect(sigc::mem_fun(*this, &SoundFileBrowser::update_preview));
chooser.signal_file_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
-#ifdef GTKOSX
+#ifdef __APPLE__
/* some broken redraw behaviour - this is a bandaid */
chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw));
#endif
@@ -647,6 +647,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
notebook.append_page (*vbox, _("Search Tags"));
//add freesound search
+#ifdef FREESOUND_GOT_FIXED
HBox* passbox;
Label* label;
@@ -721,6 +722,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
freesound_more_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_more_clicked));
freesound_similar_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_similar_clicked));
notebook.append_page (*vbox, _("Search Freesound"));
+#endif
notebook.set_size_request (500, -1);
notebook.signal_switch_page().connect (sigc::hide_return (sigc::hide (sigc::hide (sigc::mem_fun (*this, &SoundFileBrowser::reset_options)))));
@@ -1091,7 +1093,7 @@ SoundFileBrowser::freesound_search()
std::string theString = mootcher.searchText(
search_string,
freesound_page,
-#ifdef GTKOSX
+#ifdef __APPLE__
"", // OSX eats anything incl mp3
#else
"type:wav OR type:aiff OR type:flac OR type:aif OR type:ogg OR type:oga",
@@ -1672,63 +1674,55 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
, _import_active (false)
, _reset_post_import (false)
{
- VBox* vbox;
- HBox* hbox;
vector<string> str;
- set_size_request (-1, 450);
+ set_size_request (-1, 550);
block_two.set_border_width (12);
block_three.set_border_width (12);
block_four.set_border_width (12);
- options.set_spacing (12);
-
str.clear ();
str.push_back (_("file timestamp"));
str.push_back (_("edit point"));
str.push_back (_("playhead"));
str.push_back (_("session start"));
set_popdown_strings (where_combo, str);
- where_combo.set_active_text (str.front());
+ where_combo.set_active_text (str.back());
where_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::where_combo_changed));
Label* l = manage (new Label);
l->set_markup (_("<b>Add files ...</b>"));
-
- vbox = manage (new VBox);
- vbox->set_border_width (12);
- vbox->set_spacing (6);
- vbox->pack_start (*l, false, false);
- vbox->pack_start (action_combo, false, false);
- hbox = manage (new HBox);
- hbox->pack_start (*vbox, false, false);
- options.pack_start (*hbox, false, false);
+ options.attach (*l, 0, 1, 0, 1, FILL, SHRINK, 8, 0);
+ options.attach (action_combo, 0, 1, 1, 2, FILL, SHRINK, 8, 0);
l = manage (new Label);
l->set_markup (_("<b>Insert at</b>"));
+ options.attach (*l, 0, 1, 3, 4, FILL, SHRINK, 8, 0);
+ options.attach (where_combo, 0, 1, 4, 5, FILL, SHRINK, 8, 0);
- vbox = manage (new VBox);
- vbox->set_border_width (12);
- vbox->set_spacing (6);
- vbox->pack_start (*l, false, false);
- vbox->pack_start (where_combo, false, false);
- hbox = manage (new HBox);
- hbox->pack_start (*vbox, false, false);
- options.pack_start (*hbox, false, false);
+ l = manage (new Label);
+ l->set_markup (_("<b>Mapping</b>"));
+ options.attach (*l, 1, 2, 0, 1, FILL, SHRINK, 8, 0);
+ options.attach (channel_combo, 1, 2, 1, 2, FILL, SHRINK, 8, 0);
+ l = manage (new Label);
+ l->set_markup (_("<b>Conversion quality</b>"));
+ options.attach (*l, 1, 2, 3, 4, FILL, SHRINK, 8, 0);
+ options.attach (src_combo, 1, 2, 4, 5, FILL, SHRINK, 8, 0);
l = manage (new Label);
- l->set_markup (_("<b>Mapping</b>"));
+ l->set_markup (_("<b>Instrument</b>"));
+ options.attach (*l, 3, 4, 0, 1, FILL, SHRINK, 8, 0);
+ options.attach (instrument_combo, 3, 4, 1, 2, FILL, SHRINK, 8, 0);
- vbox = manage (new VBox);
- vbox->set_border_width (12);
- vbox->set_spacing (6);
- vbox->pack_start (*l, false, false);
- vbox->pack_start (channel_combo, false, false);
- hbox = manage (new HBox);
- hbox->pack_start (*vbox, false, false);
- options.pack_start (*hbox, false, false);
+ Alignment *hspace = manage (new Alignment ());
+ hspace->set_size_request (2, 2);
+ options.attach (*hspace, 0, 3, 2, 3, FILL, SHRINK, 0, 8);
+
+ Alignment *vspace = manage (new Alignment ());
+ vspace->set_size_request (2, 2);
+ options.attach (*vspace, 2, 3, 0, 3, EXPAND, SHRINK, 0, 0);
str.clear ();
str.push_back (_("one track per file"));
@@ -1736,30 +1730,6 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
channel_combo.set_active_text (str.front());
channel_combo.set_sensitive (false);
- l = manage (new Label);
- l->set_markup (_("<b>Conversion quality</b>"));
-
- vbox = manage (new VBox);
- vbox->set_border_width (12);
- vbox->set_spacing (6);
- vbox->pack_start (*l, false, false);
- vbox->pack_start (src_combo, false, false);
- hbox = manage (new HBox);
- hbox->pack_start (*vbox, false, false);
- options.pack_start (*hbox, false, false);
-
- l = manage (new Label);
- l->set_markup (_("<b>Instrument</b>"));
-
- vbox = manage (new VBox);
- vbox->set_border_width (12);
- vbox->set_spacing (6);
- vbox->pack_start (*l, false, false);
- vbox->pack_start (instrument_combo, false, false);
- hbox = manage (new HBox);
- hbox->pack_start (*vbox, false, false);
- options.pack_start (*hbox, false, false);
-
str.clear ();
str.push_back (_("Best"));
str.push_back (_("Good"));
@@ -1785,10 +1755,9 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
}
block_four.pack_start (copy_files_btn, false, false);
+ options.attach (block_four, 3, 4, 4, 5, FILL, SHRINK, 8, 0);
- options.pack_start (block_four, false, false);
-
- vpacker.pack_start (options, false, false);
+ vpacker.pack_start (options, false, true);
/* setup disposition map */
diff --git a/gtk2_ardour/sfdb_ui.h b/gtk2_ardour/sfdb_ui.h
index fcdce2a..f070d36 100644
--- a/gtk2_ardour/sfdb_ui.h
+++ b/gtk2_ardour/sfdb_ui.h
@@ -303,7 +303,7 @@ class SoundFileOmega : public SoundFileBrowser
typedef std::map<std::string,Editing::ImportDisposition> DispositionMap;
DispositionMap disposition_map;
- Gtk::HBox options;
+ Gtk::Table options;
Gtk::VBox block_two;
Gtk::VBox block_three;
Gtk::VBox block_four;
diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc
index 4616b76..fec3547 100644
--- a/gtk2_ardour/shuttle_control.cc
+++ b/gtk2_ardour/shuttle_control.cc
@@ -36,7 +36,7 @@
#include "shuttle_control.h"
#include "tooltips.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace Gtkmm2ext;
@@ -53,7 +53,14 @@ gboolean qt (gboolean, gint, gint, gboolean, Gtk::Tooltip*, gpointer)
ShuttleControl::ShuttleControl ()
: _controllable (new ShuttleControllable (*this))
, binding_proxy (_controllable)
+ , text_color (0)
{
+ left_text = Pango::Layout::create (get_pango_context());
+ right_text = Pango::Layout::create (get_pango_context());
+
+ right_text->set_attributes (text_attributes);
+ left_text->set_attributes (text_attributes);
+
set_tooltip (*this, _("Shuttle speed control (Context-click for options)"));
pattern = 0;
@@ -84,6 +91,9 @@ ShuttleControl::ShuttleControl ()
else { shuttle_max_speed = 1.5f; }
Config->ParameterChanged.connect (parameter_connection, MISSING_INVALIDATOR, boost::bind (&ShuttleControl::parameter_changed, this, _1), gui_context());
+ UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ShuttleControl::set_colors));
+
+ set_colors ();
/* gtkmm 2.4: the C++ wrapper doesn't work */
g_signal_connect ((GObject*) gobj(), "query-tooltip", G_CALLBACK (qt), NULL);
@@ -94,6 +104,7 @@ ShuttleControl::~ShuttleControl ()
{
cairo_pattern_destroy (pattern);
cairo_pattern_destroy (shine_pattern);
+ delete text_color;
}
void
@@ -135,6 +146,13 @@ ShuttleControl::on_size_allocate (Gtk::Allocation& alloc)
cairo_pattern_add_color_stop_rgba (shine_pattern, 0, 1,1,1,0.0);
cairo_pattern_add_color_stop_rgba (shine_pattern, 0.2, 1,1,1,0.4);
cairo_pattern_add_color_stop_rgba (shine_pattern, 1, 1,1,1,0.1);
+
+ Pango::AttrFontDesc* font_attr;
+
+ font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (UIConfiguration::instance().get_NormalBoldFont()));
+ text_attributes.change (*font_attr);
+
+ delete font_attr;
}
void
@@ -143,9 +161,9 @@ ShuttleControl::map_transport_state ()
float speed = _session->transport_speed ();
if ( (fabsf( speed - last_speed_displayed) < 0.005f) // dead-zone
- && !( speed == 1.f && last_speed_displayed != 1.f)
- && !( speed == 0.f && last_speed_displayed != 0.f)
- )
+ && !( speed == 1.f && last_speed_displayed != 1.f)
+ && !( speed == 0.f && last_speed_displayed != 0.f)
+ )
{
return; // nothing to see here, move along.
}
@@ -293,10 +311,11 @@ ShuttleControl::on_button_press_event (GdkEventButton* ev)
add_modal_grab ();
shuttle_grabbed = true;
shuttle_speed_on_grab = _session->transport_speed ();
+ requested_speed = shuttle_speed_on_grab;
mouse_shuttle (ev->x, true);
gdk_pointer_grab(ev->window,false,
- GdkEventMask( Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |Gdk::BUTTON_RELEASE_MASK),
- NULL,NULL,ev->time);
+ GdkEventMask( Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |Gdk::BUTTON_RELEASE_MASK),
+ NULL,NULL,ev->time);
}
break;
@@ -538,6 +557,7 @@ ShuttleControl::use_shuttle_fract (bool force, bool zero_ok)
speed = shuttle_max_speed * shuttle_fract;
}
+ requested_speed = speed;
if (zero_ok) {
_session->request_transport_speed (speed, Config->get_shuttle_behaviour() == Wheel);
} else {
@@ -546,19 +566,48 @@ ShuttleControl::use_shuttle_fract (bool force, bool zero_ok)
}
void
-ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
+ShuttleControl::set_colors ()
{
- cairo_text_extents_t extents;
+ int r, g, b, a;
+
+ uint32_t bg_color = UIConfiguration::instance().color (X_("shuttle bg"));
+ uint32_t text = UIConfiguration::instance().color (X_("shuttle text"));
+
+ UINT_TO_RGBA (bg_color, &r, &g, &b, &a);
+ bg_r = r/255.0;
+ bg_g = g/255.0;
+ bg_b = b/255.0;
+
+ UINT_TO_RGBA (text, &r, &g, &b, &a);
+ /* rescale for Pango colors ... sigh */
+
+ r = lrint (r * 65535.0);
+ g = lrint (g * 65535.0);
+ b = lrint (b * 65535.0);
+
+ delete text_color;
+ text_color = new Pango::AttrColor (Pango::Attribute::create_attr_foreground (r, g, b));
+ text_attributes.change (*text_color);
+}
+
+void
+ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
+{
//black border
- cairo_set_source_rgb (cr, 0, 0.0, 0.0);
+ cairo_set_source_rgb (cr, bg_r, bg_g, bg_b);
rounded_rectangle (cr, 0, 0, get_width(), get_height(), 4);
cairo_fill (cr);
float speed = 0.0;
+ float acutal_speed = 0.0;
if (_session) {
speed = _session->transport_speed ();
+ acutal_speed = speed;
+ if (shuttle_grabbed) {
+ speed = requested_speed;
+ }
}
/* Marker */
@@ -584,24 +633,24 @@ ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
char buf[32];
- if (speed != 0) {
+ if (acutal_speed != 0) {
if (Config->get_shuttle_units() == Percentage) {
- if (speed == 1.0) {
+ if (acutal_speed == 1.0) {
snprintf (buf, sizeof (buf), "%s", _("Playing"));
} else {
- if (speed < 0.0) {
- snprintf (buf, sizeof (buf), "<<< %.1f%%", -speed * 100.f);
+ if (acutal_speed < 0.0) {
+ snprintf (buf, sizeof (buf), "<<< %.1f%%", -acutal_speed * 100.f);
} else {
- snprintf (buf, sizeof (buf), ">>> %.1f%%", speed * 100.f);
+ snprintf (buf, sizeof (buf), ">>> %.1f%%", acutal_speed * 100.f);
}
}
} else {
bool reversed;
- int semi = speed_as_semitones (speed, reversed);
+ int semi = speed_as_semitones (acutal_speed, reversed);
if (reversed) {
snprintf (buf, sizeof (buf), _("<<< %+d semitones"), semi);
@@ -614,20 +663,17 @@ ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
snprintf (buf, sizeof (buf), "%s", _("Stopped"));
}
- last_speed_displayed = speed;
+ last_speed_displayed = acutal_speed;
- // TODO use a proper pango layout, scale font
- cairo_set_source_rgb (cr, 0.6, 0.6, 0.6);
- cairo_set_font_size (cr, 13.0);
- cairo_text_extents (cr, "0|", &extents); // note the descender
- const float text_ypos = (get_height() + extents.height - 1.) * .5;
+ const float top_text_margin = 3.0f;
+ const float side_text_margin = 5.0f;
- cairo_move_to (cr, 10, text_ypos);
- cairo_show_text (cr, buf);
+ left_text->set_text (buf);
+ cairo_move_to (cr, side_text_margin, top_text_margin);
+ pango_cairo_show_layout (cr, left_text->gobj());
/* style text */
-
switch (Config->get_shuttle_behaviour()) {
case Sprung:
snprintf (buf, sizeof (buf), "%s", _("Sprung"));
@@ -637,14 +683,15 @@ ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
break;
}
- cairo_text_extents (cr, buf, &extents);
- cairo_move_to (cr, get_width() - (fabs(extents.x_advance) + 5), text_ypos);
- cairo_show_text (cr, buf);
+ right_text->set_text (buf);
+ Pango::Rectangle r = right_text->get_ink_extents ();
+ cairo_move_to (cr, get_width() - ((r.get_width()/PANGO_SCALE) + side_text_margin), top_text_margin);
+ pango_cairo_show_layout (cr, right_text->gobj());
if (UIConfiguration::instance().get_widget_prelight()) {
if (_hovering) {
rounded_rectangle (cr, 1, 1, get_width()-2, get_height()-2, 4.0);
- cairo_set_source_rgba (cr, 1, 1, 1, 0.2);
+ cairo_set_source_rgba (cr, 1, 1, 1, 0.15);
cairo_fill (cr);
}
}
diff --git a/gtk2_ardour/shuttle_control.h b/gtk2_ardour/shuttle_control.h
index 20fe460..e506e7b 100644
--- a/gtk2_ardour/shuttle_control.h
+++ b/gtk2_ardour/shuttle_control.h
@@ -56,6 +56,7 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
};
boost::shared_ptr<ShuttleControllable> controllable() const { return _controllable; }
+ void set_colors ();
protected:
bool _hovering;
@@ -63,6 +64,7 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
float last_speed_displayed;
bool shuttle_grabbed;
double shuttle_speed_on_grab;
+ double requested_speed;
float shuttle_fract;
boost::shared_ptr<ShuttleControllable> _controllable;
cairo_pattern_t* pattern;
@@ -73,7 +75,11 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
Gtk::Menu* shuttle_style_menu;
Gtk::Menu* shuttle_context_menu;
BindingProxy binding_proxy;
-
+ Glib::RefPtr<Pango::Layout> left_text;
+ Glib::RefPtr<Pango::Layout> right_text;
+ Pango::AttrList text_attributes;
+ Pango::AttrColor* text_color;
+ float bg_r, bg_g, bg_b;
void build_shuttle_context_menu ();
void show_shuttle_context_menu ();
void shuttle_style_changed();
diff --git a/gtk2_ardour/simple_progress_dialog.h b/gtk2_ardour/simple_progress_dialog.h
new file mode 100644
index 0000000..1e76f6b
--- /dev/null
+++ b/gtk2_ardour/simple_progress_dialog.h
@@ -0,0 +1,39 @@
+#ifndef _ardour_gtk_simpple_progress_dialog_h_
+#define _ardour_gtk_simpple_progress_dialog_h_
+
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/button.h>
+#include <gtkmm/progressbar.h>
+
+#include "ardour/types.h"
+
+class SimpleProgressDialog : public Gtk::MessageDialog
+{
+public:
+ SimpleProgressDialog (std::string title, const Glib::SignalProxy0< void >::SlotType & cancel)
+ : MessageDialog (title, false, MESSAGE_OTHER, BUTTONS_NONE, true)
+ {
+ get_vbox()->set_size_request(400,-1);
+ set_title (title);
+ pbar = manage (new Gtk::ProgressBar());
+ pbar->show();
+ get_vbox()->pack_start (*pbar, PACK_SHRINK, 4);
+
+ Gtk::Button *cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+ cancel_button->signal_clicked().connect (cancel);
+ cancel_button->show();
+ get_vbox()->pack_start (*cancel_button, PACK_SHRINK);
+ }
+
+ void update_progress (framecnt_t c, framecnt_t t) {
+ pbar->set_fraction ((float) c / (float) t);
+ // see also ARDOUR_UI::gui_idle_handler();
+ int timeout = 30;
+ while (gtk_events_pending() && --timeout) {
+ gtk_main_iteration ();
+ }
+ }
+private:
+ Gtk::ProgressBar *pbar;
+};
+#endif
diff --git a/gtk2_ardour/soundcloud_export_selector.cc b/gtk2_ardour/soundcloud_export_selector.cc
index 524c462..e7e43ad 100644
--- a/gtk2_ardour/soundcloud_export_selector.cc
+++ b/gtk2_ardour/soundcloud_export_selector.cc
@@ -32,7 +32,7 @@
#include <iostream>
#include "pbd/gstdio_compat.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
diff --git a/gtk2_ardour/speaker_dialog.cc b/gtk2_ardour/speaker_dialog.cc
index 3578682..3831094 100644
--- a/gtk2_ardour/speaker_dialog.cc
+++ b/gtk2_ardour/speaker_dialog.cc
@@ -24,7 +24,7 @@
#include "speaker_dialog.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
diff --git a/gtk2_ardour/splash.cc b/gtk2_ardour/splash.cc
index c252247..1784ac8 100644
--- a/gtk2_ardour/splash.cc
+++ b/gtk2_ardour/splash.cc
@@ -34,7 +34,7 @@
#include "gui_thread.h"
#include "splash.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace Glib;
@@ -50,7 +50,10 @@ Splash::Splash ()
std::string splash_file;
- if (!find_file (ardour_data_search_path(), "splash.png", splash_file)) {
+ Searchpath rc (ARDOUR::ardour_data_search_path());
+ rc.add_subdirectory_to_paths ("resources");
+
+ if (!find_file (rc, PROGRAM_NAME "-splash.png", splash_file)) {
cerr << "Cannot find splash screen image file\n";
throw failed_constructor();
}
@@ -111,9 +114,9 @@ Splash::pop_back_for (Gtk::Window& win)
So for OS X, we just hide ourselves.
- Oct 2014: The Windows situation is similar, although it should be possible
- to play tricks with gdk's set_type_hint() or directly hack things using
- SetWindowLong() and UpdateLayeredWindow()
+ Oct 2014: The Windows situation is similar, although it should be possible
+ to play tricks with gdk's set_type_hint() or directly hack things using
+ SetWindowLong() and UpdateLayeredWindow()
*/
(void) win;
hide();
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
index 40dbc73..12f9891 100644
--- a/gtk2_ardour/startup.cc
+++ b/gtk2_ardour/startup.cc
@@ -46,11 +46,12 @@
#include "ardour/session.h"
#include "ardour/session_state_utils.h"
#include "ardour/template_utils.h"
+#include "ardour/profile.h"
#include "startup.h"
#include "opts.h"
#include "engine_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "utils.h"
using namespace std;
@@ -79,23 +80,23 @@ ArdourStartup::ArdourStartup ()
set_position (WIN_POS_CENTER);
set_border_width (12);
- if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
+ if (! (icon_pixbuf = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
throw failed_constructor();
}
list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
Glib::RefPtr<Gdk::Pixbuf> icon;
- if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px"))) {
window_icons.push_back (icon);
}
- if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px"))) {
window_icons.push_back (icon);
}
- if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px"))) {
window_icons.push_back (icon);
}
- if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
+ if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
window_icons.push_back (icon);
}
if (!window_icons.empty ()) {
@@ -357,7 +358,9 @@ ArdourStartup::setup_final_page ()
VBox* vbox = manage (new VBox);
vbox->pack_start (*final_label, true, true);
- vbox->pack_start (plugin_disco_button, true, false);
+ if (!Profile->get_mixbus()) {
+ vbox->pack_start (plugin_disco_button, true, false);
+ }
vbox->show ();
final_page_index = append_page (*vbox);
diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h
index 74e0aee..e27b1c1 100644
--- a/gtk2_ardour/startup.h
+++ b/gtk2_ardour/startup.h
@@ -69,6 +69,7 @@ class ArdourStartup : public Gtk::Assistant {
Glib::RefPtr<Gdk::Pixbuf> icon_pixbuf;
+ void setup_prerelease_page ();
void setup_new_user_page ();
Glib::RefPtr<Gdk::Pixbuf> splash_pixbuf;
Gtk::DrawingArea splash_area;
diff --git a/gtk2_ardour/step_editing.bindings b/gtk2_ardour/step_editing.bindings
index 313bee3..ee41ab4 100644
--- a/gtk2_ardour/step_editing.bindings
+++ b/gtk2_ardour/step_editing.bindings
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Bindings name="logic">
+<Bindings name="Step Editing">
<Press>
<Binding key="grave" action="StepEditing/octave-0"/>
<Binding key="1" action="StepEditing/octave-1"/>
diff --git a/gtk2_ardour/step_editor.cc b/gtk2_ardour/step_editor.cc
index e19f89f..3ea3bb4 100644
--- a/gtk2_ardour/step_editor.cc
+++ b/gtk2_ardour/step_editor.cc
@@ -115,10 +115,14 @@ StepEditor::prepare_step_edit_region ()
} else {
- const Meter& m = _mtv.session()->tempo_map().meter_at (step_edit_insert_position);
- const Tempo& t = _mtv.session()->tempo_map().tempo_at (step_edit_insert_position);
+ const Meter& m = _mtv.session()->tempo_map().meter_at_frame (step_edit_insert_position);
- step_edit_region = _mtv.add_region (step_edit_insert_position, floor (m.frames_per_bar (t, _mtv.session()->frame_rate())), true);
+ double baf = _mtv.session()->tempo_map().beat_at_frame (step_edit_insert_position);
+ double next_bar_in_beats = baf + m.divisions_per_bar();
+ framecnt_t next_bar_pos = _mtv.session()->tempo_map().frame_at_beat (next_bar_in_beats);
+ framecnt_t len = next_bar_pos - step_edit_insert_position;
+
+ step_edit_region = _mtv.add_region (step_edit_insert_position, len, true, _editor.get_grid_music_divisions (0));
RegionView* rv = _mtv.midi_view()->find_view (step_edit_region);
step_edit_region_view = dynamic_cast<MidiRegionView*>(rv);
@@ -320,6 +324,8 @@ StepEditor::step_add_note (uint8_t channel, uint8_t pitch, uint8_t velocity, Evo
_step_edit_chord_duration = max (_step_edit_chord_duration, beat_duration);
}
+ step_edit_region_view->set_step_edit_cursor_width (step_editor->note_length());
+
return 0;
}
diff --git a/gtk2_ardour/step_editor.h b/gtk2_ardour/step_editor.h
index 31632a8..b16cd8f 100644
--- a/gtk2_ardour/step_editor.h
+++ b/gtk2_ardour/step_editor.h
@@ -25,7 +25,7 @@
#include <sigc++/trackable.h>
#include "pbd/signals.h"
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
namespace ARDOUR {
class MidiTrack;
diff --git a/gtk2_ardour/step_entry.cc b/gtk2_ardour/step_entry.cc
index 366a9e1..855766b 100644
--- a/gtk2_ardour/step_entry.cc
+++ b/gtk2_ardour/step_entry.cc
@@ -21,9 +21,8 @@
#include "pbd/file_utils.h"
-#include "gtkmm2ext/keyboard.h"
#include "gtkmm2ext/actions.h"
-#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/keyboard.h"
#include "ardour/filesystem_paths.h"
@@ -34,7 +33,7 @@
#include "tooltips.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -86,6 +85,7 @@ StepEntry::StepEntry (StepEditor& seditor)
, _piano (0)
, piano (0)
, se (&seditor)
+ , myactions (X_("step entry"))
{
register_actions ();
load_bindings ();
@@ -496,26 +496,18 @@ StepEntry::on_key_press_event (GdkEventKey* ev)
forward to main window
*/
- if (!gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
- KeyboardKey k (ev->state, ev->keyval);
-
- if (bindings.activate (k, Bindings::Press)) {
- return true;
- }
+ if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
+ return true;
}
- return forward_key_press (ev);
+ return relay_key_press (ev, this);
}
bool
StepEntry::on_key_release_event (GdkEventKey* ev)
{
- if (!gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
- KeyboardKey k (ev->state, ev->keyval);
-
- if (bindings.activate (k, Bindings::Release)) {
- return true;
- }
+ if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
+ return true;
}
/* don't forward releases */
@@ -593,126 +585,117 @@ StepEntry::bar_resync_click ()
void
StepEntry::register_actions ()
{
- /* add named actions for the editor */
-
- myactions.register_action ("StepEditing", "insert-a", _("Insert Note A"), sigc::mem_fun (*this, &StepEntry::insert_a));
- myactions.register_action ("StepEditing", "insert-asharp", _("Insert Note A-sharp"), sigc::mem_fun (*this, &StepEntry::insert_asharp));
- myactions.register_action ("StepEditing", "insert-b", _("Insert Note B"), sigc::mem_fun (*this, &StepEntry::insert_b));
- myactions.register_action ("StepEditing", "insert-c", _("Insert Note C"), sigc::mem_fun (*this, &StepEntry::insert_c));
- myactions.register_action ("StepEditing", "insert-csharp", _("Insert Note C-sharp"), sigc::mem_fun (*this, &StepEntry::insert_csharp));
- myactions.register_action ("StepEditing", "insert-d", _("Insert Note D"), sigc::mem_fun (*this, &StepEntry::insert_d));
- myactions.register_action ("StepEditing", "insert-dsharp", _("Insert Note D-sharp"), sigc::mem_fun (*this, &StepEntry::insert_dsharp));
- myactions.register_action ("StepEditing", "insert-e", _("Insert Note E"), sigc::mem_fun (*this, &StepEntry::insert_e));
- myactions.register_action ("StepEditing", "insert-f", _("Insert Note F"), sigc::mem_fun (*this, &StepEntry::insert_f));
- myactions.register_action ("StepEditing", "insert-fsharp", _("Insert Note F-sharp"), sigc::mem_fun (*this, &StepEntry::insert_fsharp));
- myactions.register_action ("StepEditing", "insert-g", _("Insert Note G"), sigc::mem_fun (*this, &StepEntry::insert_g));
- myactions.register_action ("StepEditing", "insert-gsharp", _("Insert Note G-sharp"), sigc::mem_fun (*this, &StepEntry::insert_gsharp));
-
- myactions.register_action ("StepEditing", "insert-rest", _("Insert a Note-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_rest));
- myactions.register_action ("StepEditing", "insert-snap-rest", _("Insert a Snap-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_grid_rest));
-
- myactions.register_action ("StepEditing", "next-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::next_octave));
- myactions.register_action ("StepEditing", "prev-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::prev_octave));
-
- myactions.register_action ("StepEditing", "next-note-length", _("Move to Next Note Length"), sigc::mem_fun (*this, &StepEntry::next_note_length));
- myactions.register_action ("StepEditing", "prev-note-length", _("Move to Previous Note Length"), sigc::mem_fun (*this, &StepEntry::prev_note_length));
-
- myactions.register_action ("StepEditing", "inc-note-length", _("Increase Note Length"), sigc::mem_fun (*this, &StepEntry::inc_note_length));
- myactions.register_action ("StepEditing", "dec-note-length", _("Decrease Note Length"), sigc::mem_fun (*this, &StepEntry::dec_note_length));
-
- myactions.register_action ("StepEditing", "next-note-velocity", _("Move to Next Note Velocity"), sigc::mem_fun (*this, &StepEntry::next_note_velocity));
- myactions.register_action ("StepEditing", "prev-note-velocity", _("Move to Previous Note Velocity"), sigc::mem_fun (*this, &StepEntry::prev_note_velocity));
-
- myactions.register_action ("StepEditing", "inc-note-velocity", _("Increase Note Velocity"), sigc::mem_fun (*this, &StepEntry::inc_note_velocity));
- myactions.register_action ("StepEditing", "dec-note-velocity", _("Decrease Note Velocity"), sigc::mem_fun (*this, &StepEntry::dec_note_velocity));
-
- myactions.register_action ("StepEditing", "octave-0", _("Switch to the 1st octave"), sigc::mem_fun (*this, &StepEntry::octave_0));
- myactions.register_action ("StepEditing", "octave-1", _("Switch to the 2nd octave"), sigc::mem_fun (*this, &StepEntry::octave_1));
- myactions.register_action ("StepEditing", "octave-2", _("Switch to the 3rd octave"), sigc::mem_fun (*this, &StepEntry::octave_2));
- myactions.register_action ("StepEditing", "octave-3", _("Switch to the 4th octave"), sigc::mem_fun (*this, &StepEntry::octave_3));
- myactions.register_action ("StepEditing", "octave-4", _("Switch to the 5th octave"), sigc::mem_fun (*this, &StepEntry::octave_4));
- myactions.register_action ("StepEditing", "octave-5", _("Switch to the 6th octave"), sigc::mem_fun (*this, &StepEntry::octave_5));
- myactions.register_action ("StepEditing", "octave-6", _("Switch to the 7th octave"), sigc::mem_fun (*this, &StepEntry::octave_6));
- myactions.register_action ("StepEditing", "octave-7", _("Switch to the 8th octave"), sigc::mem_fun (*this, &StepEntry::octave_7));
- myactions.register_action ("StepEditing", "octave-8", _("Switch to the 9th octave"), sigc::mem_fun (*this, &StepEntry::octave_8));
- myactions.register_action ("StepEditing", "octave-9", _("Switch to the 10th octave"), sigc::mem_fun (*this, &StepEntry::octave_9));
- myactions.register_action ("StepEditing", "octave-10", _("Switch to the 11th octave"), sigc::mem_fun (*this, &StepEntry::octave_10));
+ /* add named actions for the step editor */
+
+ Glib::RefPtr<ActionGroup> group = myactions.create_action_group (X_("StepEditing"));
+
+ myactions.register_action (group, "insert-a", _("Insert Note A"), sigc::mem_fun (*this, &StepEntry::insert_a));
+ myactions.register_action (group, "insert-asharp", _("Insert Note A-sharp"), sigc::mem_fun (*this, &StepEntry::insert_asharp));
+ myactions.register_action (group, "insert-b", _("Insert Note B"), sigc::mem_fun (*this, &StepEntry::insert_b));
+ myactions.register_action (group, "insert-c", _("Insert Note C"), sigc::mem_fun (*this, &StepEntry::insert_c));
+ myactions.register_action (group, "insert-csharp", _("Insert Note C-sharp"), sigc::mem_fun (*this, &StepEntry::insert_csharp));
+ myactions.register_action (group, "insert-d", _("Insert Note D"), sigc::mem_fun (*this, &StepEntry::insert_d));
+ myactions.register_action (group, "insert-dsharp", _("Insert Note D-sharp"), sigc::mem_fun (*this, &StepEntry::insert_dsharp));
+ myactions.register_action (group, "insert-e", _("Insert Note E"), sigc::mem_fun (*this, &StepEntry::insert_e));
+ myactions.register_action (group, "insert-f", _("Insert Note F"), sigc::mem_fun (*this, &StepEntry::insert_f));
+ myactions.register_action (group, "insert-fsharp", _("Insert Note F-sharp"), sigc::mem_fun (*this, &StepEntry::insert_fsharp));
+ myactions.register_action (group, "insert-g", _("Insert Note G"), sigc::mem_fun (*this, &StepEntry::insert_g));
+ myactions.register_action (group, "insert-gsharp", _("Insert Note G-sharp"), sigc::mem_fun (*this, &StepEntry::insert_gsharp));
+
+ myactions.register_action (group, "insert-rest", _("Insert a Note-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_rest));
+ myactions.register_action (group, "insert-snap-rest", _("Insert a Snap-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_grid_rest));
+
+ myactions.register_action (group, "next-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::next_octave));
+ myactions.register_action (group, "prev-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::prev_octave));
+
+ myactions.register_action (group, "next-note-length", _("Move to Next Note Length"), sigc::mem_fun (*this, &StepEntry::next_note_length));
+ myactions.register_action (group, "prev-note-length", _("Move to Previous Note Length"), sigc::mem_fun (*this, &StepEntry::prev_note_length));
+
+ myactions.register_action (group, "inc-note-length", _("Increase Note Length"), sigc::mem_fun (*this, &StepEntry::inc_note_length));
+ myactions.register_action (group, "dec-note-length", _("Decrease Note Length"), sigc::mem_fun (*this, &StepEntry::dec_note_length));
+
+ myactions.register_action (group, "next-note-velocity", _("Move to Next Note Velocity"), sigc::mem_fun (*this, &StepEntry::next_note_velocity));
+ myactions.register_action (group, "prev-note-velocity", _("Move to Previous Note Velocity"), sigc::mem_fun (*this, &StepEntry::prev_note_velocity));
+
+ myactions.register_action (group, "inc-note-velocity", _("Increase Note Velocity"), sigc::mem_fun (*this, &StepEntry::inc_note_velocity));
+ myactions.register_action (group, "dec-note-velocity", _("Decrease Note Velocity"), sigc::mem_fun (*this, &StepEntry::dec_note_velocity));
+
+ myactions.register_action (group, "octave-0", _("Switch to the 1st octave"), sigc::mem_fun (*this, &StepEntry::octave_0));
+ myactions.register_action (group, "octave-1", _("Switch to the 2nd octave"), sigc::mem_fun (*this, &StepEntry::octave_1));
+ myactions.register_action (group, "octave-2", _("Switch to the 3rd octave"), sigc::mem_fun (*this, &StepEntry::octave_2));
+ myactions.register_action (group, "octave-3", _("Switch to the 4th octave"), sigc::mem_fun (*this, &StepEntry::octave_3));
+ myactions.register_action (group, "octave-4", _("Switch to the 5th octave"), sigc::mem_fun (*this, &StepEntry::octave_4));
+ myactions.register_action (group, "octave-5", _("Switch to the 6th octave"), sigc::mem_fun (*this, &StepEntry::octave_5));
+ myactions.register_action (group, "octave-6", _("Switch to the 7th octave"), sigc::mem_fun (*this, &StepEntry::octave_6));
+ myactions.register_action (group, "octave-7", _("Switch to the 8th octave"), sigc::mem_fun (*this, &StepEntry::octave_7));
+ myactions.register_action (group, "octave-8", _("Switch to the 9th octave"), sigc::mem_fun (*this, &StepEntry::octave_8));
+ myactions.register_action (group, "octave-9", _("Switch to the 10th octave"), sigc::mem_fun (*this, &StepEntry::octave_9));
+ myactions.register_action (group, "octave-10", _("Switch to the 11th octave"), sigc::mem_fun (*this, &StepEntry::octave_10));
+
+ myactions.register_toggle_action (group, "toggle-triplet", _("Toggle Triple Notes"),
+ sigc::mem_fun (*this, &StepEntry::toggle_triplet));
+
+ myactions.register_toggle_action (group, "toggle-chord", _("Toggle Chord Entry"),
+ sigc::mem_fun (*this, &StepEntry::toggle_chord));
+ myactions.register_action (group, "sustain", _("Sustain Selected Notes by Note Length"),
+ sigc::mem_fun (*this, &StepEntry::do_sustain));
+ myactions.register_action (group, "sync-to-edit-point", _("Move Insert Position to Edit Point"),
+ sigc::mem_fun (*this, &StepEntry::sync_to_edit_point));
+ myactions.register_action (group, "back", _("Move Insert Position Back by Note Length"),
+ sigc::mem_fun (*this, &StepEntry::back));
RadioAction::Group note_length_group;
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-whole",
+ myactions.register_radio_action (group, note_length_group, "note-length-whole",
_("Set Note Length to Whole"), sigc::mem_fun (*this, &StepEntry::note_length_change), 1);
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-half",
+ myactions.register_radio_action (group, note_length_group, "note-length-half",
_("Set Note Length to 1/2"), sigc::mem_fun (*this, &StepEntry::note_length_change), 2);
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-third",
+ myactions.register_radio_action (group, note_length_group, "note-length-third",
_("Set Note Length to 1/3"), sigc::mem_fun (*this, &StepEntry::note_length_change), 3);
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-quarter",
+ myactions.register_radio_action (group, note_length_group, "note-length-quarter",
_("Set Note Length to 1/4"), sigc::mem_fun (*this, &StepEntry::note_length_change), 4);
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-eighth",
+ myactions.register_radio_action (group, note_length_group, "note-length-eighth",
_("Set Note Length to 1/8"), sigc::mem_fun (*this, &StepEntry::note_length_change), 8);
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-sixteenth",
+ myactions.register_radio_action (group, note_length_group, "note-length-sixteenth",
_("Set Note Length to 1/16"), sigc::mem_fun (*this, &StepEntry::note_length_change), 16);
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-thirtysecond",
+ myactions.register_radio_action (group, note_length_group, "note-length-thirtysecond",
_("Set Note Length to 1/32"), sigc::mem_fun (*this, &StepEntry::note_length_change), 32);
- myactions.register_radio_action ("StepEditing", note_length_group, "note-length-sixtyfourth",
+ myactions.register_radio_action (group, note_length_group, "note-length-sixtyfourth",
_("Set Note Length to 1/64"), sigc::mem_fun (*this, &StepEntry::note_length_change), 64);
RadioAction::Group note_velocity_group;
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-ppp",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-ppp",
_("Set Note Velocity to Pianississimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 1);
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-pp",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-pp",
_("Set Note Velocity to Pianissimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 16);
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-p",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-p",
_("Set Note Velocity to Piano"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 32);
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-mp",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-mp",
_("Set Note Velocity to Mezzo-Piano"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 64);
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-mf",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-mf",
_("Set Note Velocity to Mezzo-Forte"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 80);
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-f",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-f",
_("Set Note Velocity to Forte"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 96);
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-ff",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-ff",
_("Set Note Velocity to Fortississimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 112);
- myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-fff",
+ myactions.register_radio_action (group, note_velocity_group, "note-velocity-fff",
_("Set Note Velocity to Fortississimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 127);
- myactions.register_toggle_action ("StepEditing", "toggle-triplet", _("Toggle Triple Notes"),
- sigc::mem_fun (*this, &StepEntry::toggle_triplet));
RadioAction::Group dot_group;
- myactions.register_radio_action ("StepEditing", dot_group, "no-dotted", _("No Dotted Notes"),
- sigc::mem_fun (*this, &StepEntry::dot_change), 0);
- myactions.register_radio_action ("StepEditing", dot_group, "toggle-dotted", _("Toggled Dotted Notes"),
- sigc::mem_fun (*this, &StepEntry::dot_change), 1);
- myactions.register_radio_action ("StepEditing", dot_group, "toggle-double-dotted", _("Toggled Double-Dotted Notes"),
- sigc::mem_fun (*this, &StepEntry::dot_change), 2);
- myactions.register_radio_action ("StepEditing", dot_group, "toggle-triple-dotted", _("Toggled Triple-Dotted Notes"),
- sigc::mem_fun (*this, &StepEntry::dot_change), 3);
-
- myactions.register_toggle_action ("StepEditing", "toggle-chord", _("Toggle Chord Entry"),
- sigc::mem_fun (*this, &StepEntry::toggle_chord));
- myactions.register_action ("StepEditing", "sustain", _("Sustain Selected Notes by Note Length"),
- sigc::mem_fun (*this, &StepEntry::do_sustain));
-
- myactions.register_action ("StepEditing", "sync-to-edit-point", _("Move Insert Position to Edit Point"),
- sigc::mem_fun (*this, &StepEntry::sync_to_edit_point));
- myactions.register_action ("StepEditing", "back", _("Move Insert Position Back by Note Length"),
- sigc::mem_fun (*this, &StepEntry::back));
+ myactions.register_radio_action (group, dot_group, "no-dotted", _("No Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 0);
+ myactions.register_radio_action (group, dot_group, "toggle-dotted", _("Toggled Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 1);
+ myactions.register_radio_action (group, dot_group, "toggle-double-dotted", _("Toggled Double-Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 2);
+ myactions.register_radio_action (group, dot_group, "toggle-triple-dotted", _("Toggled Triple-Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 3);
}
void
StepEntry::load_bindings ()
{
- /* XXX move this to a better place */
-
- bindings.set_action_map (myactions);
-
- std::string binding_file;
-
- if (find_file (ardour_config_search_path(), "step_editing.bindings", binding_file)) {
- bindings.load (binding_file);
- }
+ bindings = Bindings::get_bindings (X_("Step Editing"), myactions);
+ set_data ("ardour-bindings", bindings);
}
void
diff --git a/gtk2_ardour/step_entry.h b/gtk2_ardour/step_entry.h
index bd354f3..26c46d5 100644
--- a/gtk2_ardour/step_entry.h
+++ b/gtk2_ardour/step_entry.h
@@ -140,7 +140,6 @@ class StepEntry : public ArdourWindow
/* actions */
void register_actions ();
- Gtkmm2ext::ActionMap myactions;
void insert_note (uint8_t);
void insert_rest ();
@@ -166,7 +165,8 @@ class StepEntry : public ArdourWindow
bool radio_button_release (GdkEventButton*, Gtk::RadioButton*, int);
void load_bindings ();
- Gtkmm2ext::Bindings bindings;
+ Gtkmm2ext::ActionMap myactions;
+ Gtkmm2ext::Bindings* bindings;
void inc_note_velocity ();
void dec_note_velocity ();
diff --git a/gtk2_ardour/stereo_panner.cc b/gtk2_ardour/stereo_panner.cc
index 304300f..d528cb1 100644
--- a/gtk2_ardour/stereo_panner.cc
+++ b/gtk2_ardour/stereo_panner.cc
@@ -45,7 +45,7 @@
#include "utils.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/stereo_panner_editor.cc b/gtk2_ardour/stereo_panner_editor.cc
index 477a665..9154b37 100644
--- a/gtk2_ardour/stereo_panner_editor.cc
+++ b/gtk2_ardour/stereo_panner_editor.cc
@@ -25,7 +25,7 @@
#include "pbd/controllable.h"
#include "stereo_panner_editor.h"
#include "stereo_panner.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc
index c737f78..bcab05b 100644
--- a/gtk2_ardour/streamview.cc
+++ b/gtk2_ardour/streamview.cc
@@ -45,7 +45,7 @@
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -78,7 +78,7 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Container* canvas_g
if (_trackview.is_track()) {
_trackview.track()->DiskstreamChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::diskstream_changed, this), gui_context());
- _trackview.track()->RecordEnableChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::rec_enable_changed, this), gui_context());
+ _trackview.track()->rec_enable_control()->Changed.connect (*this, invalidator (*this), boost::bind (&StreamView::rec_enable_changed, this), gui_context());
_trackview.session()->TransportStateChange.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_changed, this), gui_context());
_trackview.session()->TransportLooped.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_looped, this), gui_context());
@@ -119,7 +119,7 @@ StreamView::set_height (double h)
return -1;
}
- if (canvas_rect->y1() == h) {
+ if (height == h) {
return 0;
}
@@ -139,6 +139,10 @@ StreamView::set_samples_per_pixel (double fpp)
return -1;
}
+ if (fpp == _samples_per_pixel) {
+ return 0;
+ }
+
_samples_per_pixel = fpp;
for (i = region_views.begin(); i != region_views.end(); ++i) {
@@ -292,6 +296,7 @@ StreamView::playlist_layered (boost::weak_ptr<Track> wtr)
if (_layer_display == Stacked) {
update_contents_height ();
+ /* tricky. playlist_changed() does this as well, and its really inefficient. */
update_coverage_frames ();
} else {
/* layering has probably been modified. reflect this in the canvas. */
@@ -311,12 +316,12 @@ StreamView::playlist_switched (boost::weak_ptr<Track> wtr)
/* disconnect from old playlist */
playlist_connections.drop_connections ();
- undisplay_track ();
+ //undisplay_track ();
/* draw it */
-
+ tr->playlist()->freeze();
redisplay_track ();
-
+ tr->playlist()->thaw();
/* update layers count and the y positions and heights of our regions */
_layers = tr->playlist()->top_layer() + 1;
update_contents_height ();
@@ -494,7 +499,7 @@ StreamView::num_selected_regionviews () const
uint32_t cnt = 0;
for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) {
- if ((*i)->get_selected()) {
+ if ((*i)->selected()) {
++cnt;
}
}
@@ -513,7 +518,7 @@ void
StreamView::foreach_selected_regionview (sigc::slot<void,RegionView*> slot)
{
for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
- if ((*i)->get_selected()) {
+ if ((*i)->selected()) {
slot (*i);
}
}
diff --git a/gtk2_ardour/strip_silence_dialog.cc b/gtk2_ardour/strip_silence_dialog.cc
index cd41950..823138e 100644
--- a/gtk2_ardour/strip_silence_dialog.cc
+++ b/gtk2_ardour/strip_silence_dialog.cc
@@ -32,7 +32,7 @@
#include "strip_silence_dialog.h"
#include "region_view.h"
#include "rgb_macros.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "logmeter.h"
using namespace ARDOUR;
@@ -64,7 +64,7 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<RegionView*> const & v)
table->attach (*Gtk::manage (new Gtk::Label (_("Threshold"), 1, 0.5)), 0, 1, n, n + 1, Gtk::FILL);
table->attach (_threshold, 1, 2, n, n + 1, Gtk::FILL);
- table->attach (*Gtk::manage (new Gtk::Label (_("dbFS"))), 2, 3, n, n + 1, Gtk::FILL);
+ table->attach (*Gtk::manage (new Gtk::Label (_("dBFS"))), 2, 3, n, n + 1, Gtk::FILL);
++n;
_threshold.set_digits (1);
diff --git a/gtk2_ardour/tape_region_view.cc b/gtk2_ardour/tape_region_view.cc
index 2d71bdf..214686e 100644
--- a/gtk2_ardour/tape_region_view.cc
+++ b/gtk2_ardour/tape_region_view.cc
@@ -31,7 +31,7 @@
#include "audio_time_axis.h"
#include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
diff --git a/gtk2_ardour/tempo_curve.cc b/gtk2_ardour/tempo_curve.cc
new file mode 100644
index 0000000..db675c9
--- /dev/null
+++ b/gtk2_ardour/tempo_curve.cc
@@ -0,0 +1,181 @@
+#include <sigc++/bind.h>
+#include "ardour/tempo.h"
+
+#include "canvas/rectangle.h"
+#include "canvas/container.h"
+#include "canvas/curve.h"
+#include "canvas/canvas.h"
+#include "canvas/debug.h"
+
+#include "ui_config.h"
+
+#include "tempo_curve.h"
+#include "public_editor.h"
+#include "utils.h"
+#include "rgb_macros.h"
+
+#include <gtkmm2ext/utils.h>
+
+#include "pbd/i18n.h"
+
+PBD::Signal1<void,TempoCurve*> TempoCurve::CatchDeletion;
+
+static double curve_height = 13.0;
+
+void TempoCurve::setup_sizes(const double timebar_height)
+{
+ curve_height = floor (timebar_height) - 2.5;
+}
+
+TempoCurve::TempoCurve (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, ARDOUR::TempoSection& temp, framepos_t frame, bool handle_events)
+
+ : editor (ed)
+ , _parent (&parent)
+ , _curve (0)
+ , _shown (false)
+ , _color (rgba)
+ , _min_tempo (temp.beats_per_minute())
+ , _max_tempo (temp.beats_per_minute())
+ , _tempo (temp)
+
+{
+ frame_position = frame;
+ unit_position = editor.sample_to_pixel (frame);
+
+ group = new ArdourCanvas::Container (&parent, ArdourCanvas::Duple (unit_position, 1));
+#ifdef CANVAS_DEBUG
+ group->name = string_compose ("TempoCurve::group for %1", _tempo.beats_per_minute());
+#endif
+
+ _curve = new ArdourCanvas::FramedCurve (group);
+#ifdef CANVAS_DEBUG
+ _curve->name = string_compose ("TempoCurve::curve for %1", _tempo.beats_per_minute());
+#endif
+ _curve->set_fill_mode (ArdourCanvas::FramedCurve::Inside);
+ _curve->set_points_per_segment (3);
+
+ points = new ArdourCanvas::Points ();
+ points->push_back (ArdourCanvas::Duple (0.0, 0.0));
+ points->push_back (ArdourCanvas::Duple (1.0, 0.0));
+ points->push_back (ArdourCanvas::Duple (1.0, curve_height));
+ points->push_back (ArdourCanvas::Duple (0.0, curve_height));
+
+ _curve->set (*points);
+
+ set_color_rgba (rgba);
+
+ editor.ZoomChanged.connect (sigc::mem_fun (*this, &TempoCurve::reposition));
+
+ /* events will be handled by both the group and the mark itself, so
+ * make sure they can both be used to lookup this object.
+ */
+
+ _curve->set_data ("tempo curve", this);
+
+ if (handle_events) {
+ //group->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_marker_event), group, this));
+ }
+
+ set_position (_tempo.frame(), UINT32_MAX);
+ _curve->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_tempo_curve_event), _curve, this));
+
+}
+
+TempoCurve::~TempoCurve ()
+{
+ CatchDeletion (this); /* EMIT SIGNAL */
+
+ /* destroying the parent group destroys its contents, namely any polygons etc. that we added */
+ delete group;
+}
+
+void TempoCurve::reparent(ArdourCanvas::Container & parent)
+{
+ group->reparent (&parent);
+ _parent = &parent;
+}
+
+void
+TempoCurve::canvas_height_set (double h)
+{
+ _canvas_height = h;
+}
+
+ArdourCanvas::Item&
+TempoCurve::the_item() const
+{
+ return *group;
+}
+
+void
+TempoCurve::set_position (framepos_t frame, framepos_t end_frame)
+{
+ unit_position = editor.sample_to_pixel (frame);
+ group->set_x_position (unit_position);
+ frame_position = frame;
+ _end_frame = end_frame;
+
+ points->clear();
+
+ points = new ArdourCanvas::Points ();
+ points->push_back (ArdourCanvas::Duple (0.0, curve_height));
+
+ if (end_frame == UINT32_MAX) {
+ const double tempo_at = _tempo.tempo_at_frame (frame, editor.session()->frame_rate()) * _tempo.note_type();
+ const double y_pos = (curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height);
+
+ points->push_back (ArdourCanvas::Duple (0.0, y_pos));
+ points->push_back (ArdourCanvas::Duple (ArdourCanvas::COORD_MAX - 5.0, y_pos));
+
+ } else {
+ const framepos_t frame_step = max ((end_frame - frame) / 5, (framepos_t) 1);
+ framepos_t current_frame = frame;
+
+ while (current_frame < (end_frame - frame_step)) {
+ const double tempo_at = _tempo.tempo_at_frame (current_frame, editor.session()->frame_rate()) * _tempo.note_type();
+ const double y_pos = max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
+
+ points->push_back (ArdourCanvas::Duple (editor.sample_to_pixel (current_frame - frame), min (y_pos, curve_height)));
+
+ current_frame += frame_step;
+ }
+
+ const double tempo_at = _tempo.tempo_at_frame (end_frame, editor.session()->frame_rate()) * _tempo.note_type();
+ const double y_pos = max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
+
+ points->push_back (ArdourCanvas::Duple (editor.sample_to_pixel ((end_frame - 1) - frame), min (y_pos, curve_height)));
+ }
+
+ _curve->set (*points);
+}
+
+void
+TempoCurve::reposition ()
+{
+ set_position (frame_position, _end_frame);
+}
+
+void
+TempoCurve::show ()
+{
+ _shown = true;
+
+ group->show ();
+}
+
+void
+TempoCurve::hide ()
+{
+ _shown = false;
+
+ group->hide ();
+}
+
+void
+TempoCurve::set_color_rgba (uint32_t c)
+{
+ _color = c;
+ _curve->set_fill_color (UIConfiguration::instance().color_mod ("tempo curve", "selection rect"));
+ _curve->set_outline_color (_color);
+
+}
diff --git a/gtk2_ardour/tempo_curve.h b/gtk2_ardour/tempo_curve.h
new file mode 100644
index 0000000..dc678e4
--- /dev/null
+++ b/gtk2_ardour/tempo_curve.h
@@ -0,0 +1,73 @@
+#ifndef __gtk_ardour_tempo_curve_h__
+#define __gtk_ardour_tempo_curve_h__
+
+#include <string>
+#include <glib.h>
+
+#include <sigc++/signal.h>
+
+#include "ardour/ardour.h"
+#include "pbd/signals.h"
+
+#include "canvas/types.h"
+#include "canvas/framed_curve.h"
+
+namespace ARDOUR {
+ class TempoSection;
+}
+class PublicEditor;
+
+class TempoCurve : public sigc::trackable
+{
+ public:
+ TempoCurve (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, ARDOUR::TempoSection& temp, framepos_t frame, bool handle_events);
+ ~TempoCurve ();
+
+ static PBD::Signal1<void,TempoCurve*> CatchDeletion;
+
+ static void setup_sizes (const double timebar_height);
+
+ ArdourCanvas::Item& the_item() const;
+ void canvas_height_set (double);
+
+ void set_position (framepos_t lower, framepos_t upper);
+ void set_color_rgba (uint32_t rgba);
+ framepos_t position() const { return frame_position; }
+
+ ArdourCanvas::Container * get_parent() { return _parent; }
+ void reparent (ArdourCanvas::Container & parent);
+
+ void hide ();
+ void show ();
+
+ ARDOUR::TempoSection& tempo () { return _tempo; }
+
+ void set_max_tempo (const double& max) { _max_tempo = max; }
+ void set_min_tempo (const double& min) { _min_tempo = min; }
+
+protected:
+ PublicEditor& editor;
+
+ ArdourCanvas::Container* _parent;
+ ArdourCanvas::Container *group;
+ ArdourCanvas::Points *points;
+ ArdourCanvas::FramedCurve* _curve;
+
+ double unit_position;
+ framepos_t frame_position;
+ framepos_t _end_frame;
+ bool _shown;
+ double _canvas_height;
+ uint32_t _color;
+
+ void reposition ();
+private:
+ double _min_tempo;
+ double _max_tempo;
+ /* disallow copy construction */
+ TempoCurve (TempoCurve const &);
+ TempoCurve & operator= (TempoCurve const &);
+ ARDOUR::TempoSection& _tempo;
+
+};
+#endif /* __gtk_ardour_tempo_curve_h__ */
diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc
index a7a6f4a..436acfa 100644
--- a/gtk2_ardour/tempo_dialog.cc
+++ b/gtk2_ardour/tempo_dialog.cc
@@ -26,7 +26,7 @@
#include "tempo_dialog.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -36,6 +36,8 @@ using namespace PBD;
TempoDialog::TempoDialog (TempoMap& map, framepos_t frame, const string&)
: ArdourDialog (_("New Tempo"))
+ , _map (&map)
+ , _section (0)
, bpm_adjustment (60.0, 1.0, 999.9, 0.1, 1.0)
, bpm_spinner (bpm_adjustment)
, when_bar_label (_("bar:"), ALIGN_LEFT, ALIGN_CENTER)
@@ -43,15 +45,16 @@ TempoDialog::TempoDialog (TempoMap& map, framepos_t frame, const string&)
, pulse_selector_label (_("Pulse note"), ALIGN_LEFT, ALIGN_CENTER)
, tap_tempo_button (_("Tap tempo"))
{
- Timecode::BBT_Time when;
- Tempo tempo (map.tempo_at (frame));
- map.bbt_time (frame, when);
+ Tempo tempo (map.tempo_at_frame (frame));
+ Timecode::BBT_Time when (map.bbt_at_frame (frame));
- init (when, tempo.beats_per_minute(), tempo.note_type(), true);
+ init (when, tempo.beats_per_minute(), tempo.note_type(), TempoSection::Constant, true, MusicTime);
}
-TempoDialog::TempoDialog (TempoSection& section, const string&)
+TempoDialog::TempoDialog (TempoMap& map, TempoSection& section, const string&)
: ArdourDialog (_("Edit Tempo"))
+ , _map (&map)
+ , _section (§ion)
, bpm_adjustment (60.0, 1.0, 999.9, 0.1, 1.0)
, bpm_spinner (bpm_adjustment)
, when_bar_label (_("bar:"), ALIGN_LEFT, ALIGN_CENTER)
@@ -59,11 +62,12 @@ TempoDialog::TempoDialog (TempoSection& section, const string&)
, pulse_selector_label (_("Pulse note"), ALIGN_LEFT, ALIGN_CENTER)
, tap_tempo_button (_("Tap tempo"))
{
- init (section.start(), section.beats_per_minute(), section.note_type(), section.movable());
+ Timecode::BBT_Time when (map.bbt_at_frame (section.frame()));
+ init (when, section.beats_per_minute(), section.note_type(), section.type(), section.movable(), section.position_lock_style());
}
void
-TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type, bool movable)
+TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type, TempoSection::Type type, bool movable, PositionLockStyle style)
{
vector<string> strings;
NoteTypes::iterator x;
@@ -106,12 +110,48 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type,
pulse_selector.set_active_text (strings[3]); // "quarter"
}
+ strings.clear();
+
+ tempo_types.insert (make_pair (_("ramped"), TempoSection::Ramp));
+ strings.push_back (_("ramped"));
+ tempo_types.insert (make_pair (_("constant"), TempoSection::Constant));
+ strings.push_back (_("constant"));
+ set_popdown_strings (tempo_type, strings);
+ TempoTypes::iterator tt;
+ for (tt = tempo_types.begin(); tt != tempo_types.end(); ++tt) {
+ if (tt->second == type) {
+ tempo_type.set_active_text (tt->first);
+ break;
+ }
+ }
+ if (tt == tempo_types.end()) {
+ tempo_type.set_active_text (strings[1]); // "constant"
+ }
+
+ strings.clear();
+
+ lock_styles.insert (make_pair (_("music"), MusicTime));
+ strings.push_back (_("music"));
+ lock_styles.insert (make_pair (_("audio"), AudioTime));
+ strings.push_back (_("audio"));
+ set_popdown_strings (lock_style, strings);
+ LockStyles::iterator ls;
+ for (ls = lock_styles.begin(); ls != lock_styles.end(); ++ls) {
+ if (ls->second == style) {
+ lock_style.set_active_text (ls->first);
+ break;
+ }
+ }
+ if (ls == lock_styles.end()) {
+ lock_style.set_active_text (strings[0]); // "music"
+ }
+
Table* table;
if (UIConfiguration::instance().get_allow_non_quarter_pulse()) {
- table = manage (new Table (5, 5));
+ table = manage (new Table (5, 7));
} else {
- table = manage (new Table (5, 4));
+ table = manage (new Table (5, 6));
}
table->set_spacings (6);
@@ -154,10 +194,27 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type,
Label* when_label = manage (new Label(_("Tempo begins at"), ALIGN_LEFT, ALIGN_CENTER));
table->attach (*when_label, 0, 1, row, row+1);
+
+ ++row;
+ ++row;
+
+ Label* lock_style_label = manage (new Label(_("Lock Style:"), ALIGN_LEFT, ALIGN_CENTER));
+ table->attach (*lock_style_label, 0, 1, row, row + 1);
+ table->attach (lock_style, 1, 5, row, row + 1);
+
+ --row;
}
+
+ Label* tempo_type_label = manage (new Label(_("Tempo Type:"), ALIGN_LEFT, ALIGN_CENTER));
+ table->attach (*tempo_type_label, 0, 1, row, row + 1);
+ table->attach (tempo_type, 1, 5, row, row + 1);
+
+ ++row;
+
get_vbox()->set_border_width (12);
get_vbox()->pack_end (*table);
+
table->show_all ();
add_button (Stock::CANCEL, RESPONSE_CANCEL);
@@ -181,6 +238,8 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type,
when_beat_entry.signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &TempoDialog::response), RESPONSE_ACCEPT));
when_beat_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &TempoDialog::entry_key_release), false);
pulse_selector.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::pulse_change));
+ tempo_type.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::tempo_type_change));
+ lock_style.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::lock_style_change));
tap_tempo_button.signal_button_press_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_button_press), false);
tap_tempo_button.signal_focus_out_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_focus_out));
@@ -219,7 +278,15 @@ TempoDialog::bpm_button_release (GdkEventButton*)
bool
TempoDialog::entry_key_release (GdkEventKey*)
{
- set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+ Timecode::BBT_Time bbt;
+ get_bbt_time (bbt);
+
+ if (_section && is_user_input_valid()) {
+ set_response_sensitive (RESPONSE_ACCEPT, _map->can_solve_bbt (_section, bbt));
+ } else {
+ set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+ }
+
return false;
}
@@ -258,12 +325,50 @@ TempoDialog::get_note_type ()
return x->second;
}
+TempoSection::Type
+TempoDialog::get_tempo_type ()
+{
+ TempoTypes::iterator x = tempo_types.find (tempo_type.get_active_text());
+
+ if (x == tempo_types.end()) {
+ error << string_compose(_("incomprehensible tempo type (%1)"), tempo_type.get_active_text()) << endmsg;
+ return TempoSection::Constant;
+ }
+
+ return x->second;
+}
+
+PositionLockStyle
+TempoDialog::get_lock_style ()
+{
+ LockStyles::iterator x = lock_styles.find (lock_style.get_active_text());
+
+ if (x == lock_styles.end()) {
+ error << string_compose(_("incomprehensible lock style (%1)"), lock_style.get_active_text()) << endmsg;
+ return MusicTime;
+ }
+
+ return x->second;
+}
+
void
TempoDialog::pulse_change ()
{
set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
}
+void
+TempoDialog::tempo_type_change ()
+{
+ set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+}
+
+void
+TempoDialog::lock_style_change ()
+{
+ set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+}
+
bool
TempoDialog::tap_tempo_button_press (GdkEventButton *ev)
{
@@ -313,22 +418,23 @@ TempoDialog::tap_tempo_focus_out (GdkEventFocus* )
MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&)
: ArdourDialog (_("New Meter"))
{
- Timecode::BBT_Time when;
frame = map.round_to_bar(frame, RoundNearest);
- Meter meter (map.meter_at(frame));
+ Timecode::BBT_Time when (map.bbt_at_frame (frame));
+ Meter meter (map.meter_at_frame (frame));
- map.bbt_time (frame, when);
- init (when, meter.divisions_per_bar(), meter.note_divisor(), true);
+ init (when, meter.divisions_per_bar(), meter.note_divisor(), true, MusicTime);
}
-MeterDialog::MeterDialog (MeterSection& section, const string&)
+MeterDialog::MeterDialog (TempoMap& map, MeterSection& section, const string&)
: ArdourDialog (_("Edit Meter"))
{
- init (section.start(), section.divisions_per_bar(), section.note_divisor(), section.movable());
+ Timecode::BBT_Time when (map.bbt_at_frame (section.frame()));
+
+ init (when, section.divisions_per_bar(), section.note_divisor(), section.movable(), section.position_lock_style());
}
void
-MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, bool movable)
+MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, bool movable, PositionLockStyle style)
{
char buf[64];
vector<string> strings;
@@ -371,15 +477,34 @@ MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, b
note_type.set_active_text (strings[3]); // "quarter"
}
+ strings.clear();
+
+ lock_styles.insert (make_pair (_("music"), MusicTime));
+ strings.push_back (_("music"));
+ lock_styles.insert (make_pair (_("audio"), AudioTime));
+ strings.push_back (_("audio"));
+ set_popdown_strings (lock_style, strings);
+ LockStyles::iterator ls;
+ for (ls = lock_styles.begin(); ls != lock_styles.end(); ++ls) {
+ if (ls->second == style) {
+ lock_style.set_active_text (ls->first);
+ break;
+ }
+ }
+ if (ls == lock_styles.end()) {
+ lock_style.set_active_text (strings[0]); // "music"
+ }
+
Label* note_label = manage (new Label (_("Note value:"), ALIGN_LEFT, ALIGN_CENTER));
+ Label* lock_label = manage (new Label (_("Lock style:"), ALIGN_LEFT, ALIGN_CENTER));
Label* bpb_label = manage (new Label (_("Beats per bar:"), ALIGN_LEFT, ALIGN_CENTER));
- Table* table = manage (new Table (3, 2));
+ Table* table = manage (new Table (3, 3));
table->set_spacings (6);
table->attach (*bpb_label, 0, 1, 0, 1, FILL|EXPAND, FILL|EXPAND);
table->attach (bpb_entry, 1, 2, 0, 1, FILL|EXPAND, FILL|EXPAND);
table->attach (*note_label, 0, 1, 1, 2, FILL|EXPAND, FILL|EXPAND);
- table->attach (note_type, 1, 2, 1, 2, FILL|EXPAND, SHRINK);
+ table->attach (note_type, 1, 2, 1, 2, FILL|EXPAND, FILL|EXPAND);
snprintf (buf, sizeof (buf), "%" PRIu32, when.bars);
when_bar_entry.set_text (buf);
@@ -390,6 +515,9 @@ MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, b
table->attach (*when_label, 0, 1, 2, 3, FILL | EXPAND, FILL | EXPAND);
table->attach (when_bar_entry, 1, 2, 2, 3, FILL | EXPAND, FILL | EXPAND);
+
+ table->attach (*lock_label, 0, 1, 3, 4, FILL|EXPAND, FILL|EXPAND);
+ table->attach (lock_style, 1, 2, 3, 4, FILL|EXPAND, SHRINK);
}
get_vbox()->set_border_width (12);
@@ -410,6 +538,8 @@ MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, b
when_bar_entry.signal_key_press_event().connect (sigc::mem_fun (*this, &MeterDialog::entry_key_press), false);
when_bar_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &MeterDialog::entry_key_release));
note_type.signal_changed().connect (sigc::mem_fun (*this, &MeterDialog::note_type_change));
+ lock_style.signal_changed().connect (sigc::mem_fun (*this, &MeterDialog::lock_style_change));
+
}
bool
@@ -481,6 +611,12 @@ MeterDialog::note_type_change ()
set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
}
+void
+MeterDialog::lock_style_change ()
+{
+ set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+}
+
double
MeterDialog::get_bpb ()
{
@@ -506,6 +642,19 @@ MeterDialog::get_note_type ()
return x->second;
}
+PositionLockStyle
+MeterDialog::get_lock_style ()
+{
+ LockStyles::iterator x = lock_styles.find (lock_style.get_active_text());
+
+ if (x == lock_styles.end()) {
+ error << string_compose(_("incomprehensible meter lock style (%1)"), lock_style.get_active_text()) << endmsg;
+ return MusicTime;
+ }
+
+ return x->second;
+}
+
bool
MeterDialog::get_bbt_time (Timecode::BBT_Time& requested)
{
diff --git a/gtk2_ardour/tempo_dialog.h b/gtk2_ardour/tempo_dialog.h
index 06c5db1..38c14e8 100644
--- a/gtk2_ardour/tempo_dialog.h
+++ b/gtk2_ardour/tempo_dialog.h
@@ -39,32 +39,45 @@ class TempoDialog : public ArdourDialog
{
public:
TempoDialog (ARDOUR::TempoMap&, framepos_t, const std::string & action);
- TempoDialog (ARDOUR::TempoSection&, const std::string & action);
+ TempoDialog (ARDOUR::TempoMap&, ARDOUR::TempoSection&, const std::string & action);
double get_bpm ();
double get_note_type ();
bool get_bbt_time (Timecode::BBT_Time&);
+ ARDOUR::TempoSection::Type get_tempo_type ();
+ ARDOUR::PositionLockStyle get_lock_style ();
private:
- void init (const Timecode::BBT_Time& start, double, double, bool);
+ void init (const Timecode::BBT_Time& start, double bpm , double note_type, ARDOUR::TempoSection::Type type, bool movable, ARDOUR::PositionLockStyle style);
bool is_user_input_valid() const;
void bpm_changed ();
bool bpm_button_press (GdkEventButton* );
bool bpm_button_release (GdkEventButton* );
bool entry_key_release (GdkEventKey* );
void pulse_change ();
+ void tempo_type_change ();
+ void lock_style_change ();
bool tap_tempo_button_press (GdkEventButton* );
bool tap_tempo_focus_out (GdkEventFocus* );
typedef std::map<std::string,float> NoteTypes;
NoteTypes note_types;
+ typedef std::map<std::string, ARDOUR::TempoSection::Type> TempoTypes;
+ TempoTypes tempo_types;
+
+ typedef std::map<std::string, ARDOUR::PositionLockStyle> LockStyles;
+ LockStyles lock_styles;
+
bool tapped; // whether the tap-tempo button has been clicked
double sum_x, sum_xx, sum_xy, sum_y;
double tap_count;
double last_t;
gint64 first_t;
+ ARDOUR::TempoMap* _map;
+ ARDOUR::TempoSection* _section;
+
Gtk::ComboBoxText pulse_selector;
Gtk::Adjustment bpm_adjustment;
Gtk::SpinButton bpm_spinner;
@@ -74,6 +87,8 @@ private:
Gtk::Label when_beat_label;
Gtk::Label pulse_selector_label;
Gtk::Button tap_tempo_button;
+ Gtk::ComboBoxText tempo_type;
+ Gtk::ComboBoxText lock_style;
};
class MeterDialog : public ArdourDialog
@@ -81,24 +96,30 @@ class MeterDialog : public ArdourDialog
public:
MeterDialog (ARDOUR::TempoMap&, framepos_t, const std::string & action);
- MeterDialog (ARDOUR::MeterSection&, const std::string & action);
+ MeterDialog (ARDOUR::TempoMap&, ARDOUR::MeterSection&, const std::string & action);
double get_bpb ();
double get_note_type ();
+ ARDOUR::PositionLockStyle get_lock_style ();
bool get_bbt_time (Timecode::BBT_Time&);
private:
- void init (const Timecode::BBT_Time&, double, double, bool);
+ void init (const Timecode::BBT_Time&, double, double, bool, ARDOUR::PositionLockStyle style);
bool is_user_input_valid() const;
bool entry_key_press (GdkEventKey* );
bool entry_key_release (GdkEventKey* );
void note_type_change ();
+ void lock_style_change ();
typedef std::map<std::string,float> NoteTypes;
NoteTypes note_types;
+ typedef std::map<std::string, ARDOUR::PositionLockStyle> LockStyles;
+ LockStyles lock_styles;
+
Gtk::Entry bpb_entry;
Gtk::ComboBoxText note_type;
+ Gtk::ComboBoxText lock_style;
std::vector<std::string> strings;
Gtk::Button ok_button;
Gtk::Button cancel_button;
diff --git a/gtk2_ardour/tempo_lines.cc b/gtk2_ardour/tempo_lines.cc
index bb86011..630e476 100644
--- a/gtk2_ardour/tempo_lines.cc
+++ b/gtk2_ardour/tempo_lines.cc
@@ -54,12 +54,11 @@ TempoLines::hide ()
}
void
-TempoLines::draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
- unsigned divisions,
+TempoLines::draw_ticks (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+ unsigned divisions,
framecnt_t leftmost_frame,
framecnt_t frame_rate)
{
- const double fpb = b->tempo->frames_per_beat(frame_rate);
const uint32_t base = UIConfiguration::instance().color_mod("measure line beat", "measure line beat");
for (unsigned l = 1; l < divisions; ++l) {
@@ -70,11 +69,23 @@ TempoLines::draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
level = d;
}
}
-
/* draw line with alpha corresponding to coarsest level */
const uint8_t a = max(8, (int)rint(UINT_RGBA_A(base) / (0.8 * log2(level))));
const uint32_t c = UINT_RGBA_CHANGE_A(base, a);
- const framepos_t f = b->frame + (l * (fpb / (double)divisions));
+ framepos_t f = 0;
+
+ if (grid.begin()->c != 0.0) {
+ const double beat_divisions = (l / ((double) divisions)) * (grid.begin()->tempo.note_type() / grid.begin()->meter.note_divisor());
+ const double time_at_division = log (((grid.begin()->c * (beat_divisions)) /
+ grid.begin()->tempo.beats_per_minute()) + 1) / grid.begin()->c;
+
+ f = grid.begin()->frame + (framecnt_t) floor ((time_at_division * 60.0 * frame_rate) + 0.5);
+ } else {
+ const double fpb = grid.begin()->tempo.frames_per_beat (frame_rate)
+ * (grid.begin()->tempo.note_type() / grid.begin()->meter.note_divisor());
+
+ f = grid.begin()->frame + (l * (fpb / (double) divisions));
+ }
if (f > leftmost_frame) {
lines.add (PublicEditor::instance().sample_to_pixel_unrounded (f), 1.0, c);
}
@@ -82,13 +93,12 @@ TempoLines::draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
}
void
-TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- const ARDOUR::TempoMap::BBTPointList::const_iterator& end,
- unsigned divisions,
+TempoLines::draw (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+ unsigned divisions,
framecnt_t leftmost_frame,
framecnt_t frame_rate)
{
- ARDOUR::TempoMap::BBTPointList::const_iterator i;
+ std::vector<ARDOUR::TempoMap::BBTPoint>::const_iterator i;
double beat_density;
uint32_t beats = 0;
@@ -97,10 +107,10 @@ TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
/* get the first bar spacing */
- i = end;
+ i = grid.end();
i--;
- bars = (*i).bar - (*begin).bar;
- beats = distance (begin, end) - bars;
+ bars = (*i).bar - (*grid.begin()).bar;
+ beats = distance (grid.begin(), grid.end()) - bars;
beat_density = (beats * 10.0f) / lines.canvas()->width();
@@ -116,15 +126,14 @@ TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
}
lines.clear ();
-
- if (beat_density <= 0.12 && begin != end && begin->frame > 0) {
- /* draw subdivisions of the beat before the first visible beat line */
- ARDOUR::TempoMap::BBTPointList::const_iterator prev = begin;
- --prev;
- draw_ticks(prev, divisions, leftmost_frame, frame_rate);
+ if (beat_density <= 0.12 && grid.begin() != grid.end() && grid.begin()->frame > 0) {
+ /* draw subdivisions of the beat before the first visible beat line XX this shouldn't happen now */
+ std::vector<ARDOUR::TempoMap::BBTPoint> vec;
+ vec.push_back (*i);
+ draw_ticks (vec, divisions, leftmost_frame, frame_rate);
}
- for (i = begin; i != end; ++i) {
+ for (i = grid.begin(); i != grid.end(); ++i) {
if ((*i).is_bar()) {
color = UIConfiguration::instance().color ("measure line bar");
@@ -141,7 +150,9 @@ TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
if (beat_density <= 0.12) {
/* draw subdivisions of this beat */
- draw_ticks(i, divisions, leftmost_frame, frame_rate);
+ std::vector<ARDOUR::TempoMap::BBTPoint> vec;
+ vec.push_back (*i);
+ draw_ticks (vec, divisions, leftmost_frame, frame_rate);
}
}
}
diff --git a/gtk2_ardour/tempo_lines.h b/gtk2_ardour/tempo_lines.h
index 6d40a2d..7096028 100644
--- a/gtk2_ardour/tempo_lines.h
+++ b/gtk2_ardour/tempo_lines.h
@@ -29,9 +29,8 @@ public:
void tempo_map_changed();
- void draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- const ARDOUR::TempoMap::BBTPointList::const_iterator& end,
- unsigned divisions,
+ void draw (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+ unsigned divisions,
ARDOUR::framecnt_t leftmost_frame,
ARDOUR::framecnt_t frame_rate);
@@ -39,8 +38,8 @@ public:
void hide();
private:
- void draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
- unsigned divisions,
+ void draw_ticks (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+ unsigned divisions,
ARDOUR::framecnt_t leftmost_frame,
ARDOUR::framecnt_t frame_rate);
diff --git a/gtk2_ardour/theme_manager.cc b/gtk2_ardour/theme_manager.cc
index e1daeab..aa90885 100644
--- a/gtk2_ardour/theme_manager.cc
+++ b/gtk2_ardour/theme_manager.cc
@@ -24,32 +24,24 @@
#include "pbd/gstdio_compat.h"
-#include <gtkmm/stock.h>
#include <gtkmm/settings.h>
#include "gtkmm2ext/gtk_ui.h"
-#include "gtkmm2ext/cell_renderer_color_selector.h"
#include "gtkmm2ext/utils.h"
-#include "pbd/file_utils.h"
#include "pbd/compose.h"
-#include "ardour/filesystem_paths.h"
#include "ardour/profile.h"
-#include "canvas/container.h"
-#include "canvas/rectangle.h"
-#include "canvas/scroll_group.h"
#include "canvas/wave_view.h"
#include "ardour_button.h"
#include "ardour_dialog.h"
#include "theme_manager.h"
-#include "rgb_macros.h"
#include "ui_config.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -58,10 +50,7 @@ using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
ThemeManager::ThemeManager()
- : dark_button (_("Dark Theme"))
- , light_button (_("Light Theme"))
- , reset_button (_("Restore Defaults"))
- , flat_buttons (_("Draw \"flat\" buttons"))
+ : flat_buttons (_("Draw \"flat\" buttons"))
, blink_rec_button (_("Blink Rec-Arm buttons"))
, region_color_button (_("Color regions using their track's color"))
, show_clipping_button (_("Show waveform clipping"))
@@ -73,45 +62,14 @@ ThemeManager::ThemeManager()
, transients_follow_front (_("Transient windows follow front window."))
, floating_monitor_section (_("Float detached monitor-section window"))
, icon_set_label (_("Icon Set"))
- , palette_viewport (*palette_scroller.get_hadjustment(), *palette_scroller.get_vadjustment())
- , palette_group (0)
- , palette_window (0)
{
- /* Now the alias list */
-
- alias_list = TreeStore::create (alias_columns);
- alias_display.set_model (alias_list);
- alias_display.append_column (_("Object"), alias_columns.name);
-
- Gtkmm2ext::CellRendererColorSelector* color_renderer = manage (new Gtkmm2ext::CellRendererColorSelector);
- TreeViewColumn* color_column = manage (new TreeViewColumn (_("Color"), *color_renderer));
- color_column->add_attribute (color_renderer->property_color(), alias_columns.color);
- alias_display.append_column (*color_column);
-
- alias_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
- alias_display.get_column (0)->set_expand (true);
- alias_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
- alias_display.get_column (1)->set_expand (false);
- alias_display.set_reorderable (false);
- alias_display.set_headers_visible (true);
-
- alias_display.signal_button_press_event().connect (sigc::mem_fun (*this, &ThemeManager::alias_button_press_event), false);
-
- alias_scroller.add (alias_display);
+ Gtk::HBox* hbox;
/* various buttons */
- RadioButton::Group group = dark_button.get_group();
- light_button.set_group(group);
- theme_selection_hbox.set_homogeneous(false);
- theme_selection_hbox.pack_start (dark_button);
- theme_selection_hbox.pack_start (light_button);
-
set_homogeneous (false);
-#if 0 // disable light/dark theme choice. until the 'light theme gets some attention.
- pack_start (theme_selection_hbox, PACK_SHRINK);
-#endif
- pack_start (reset_button, PACK_SHRINK);
+
+
#ifndef __APPLE__
pack_start (all_dialogs, PACK_SHRINK);
pack_start (transients_follow_front, PACK_SHRINK);
@@ -124,8 +82,6 @@ ThemeManager::ThemeManager()
pack_start (region_color_button, PACK_SHRINK);
pack_start (show_clipping_button, PACK_SHRINK);
- Gtk::HBox* hbox;
-
vector<string> icon_sets = ::get_icon_sets ();
if (icon_sets.size() > 1) {
@@ -134,12 +90,14 @@ ThemeManager::ThemeManager()
hbox = Gtk::manage (new Gtk::HBox());
hbox->set_spacing (6);
+ Gtk::Alignment* align = Gtk::manage (new Gtk::Alignment);
+ align->set (0, 0.5);
+ align->add (icon_set_dropdown);
hbox->pack_start (icon_set_label, false, false);
- hbox->pack_start (icon_set_dropdown, true, true);
+ hbox->pack_start (*align, true, true);
pack_start (*hbox, PACK_SHRINK);
}
-
hbox = Gtk::manage (new Gtk::HBox());
hbox->set_spacing (6);
hbox->pack_start (waveform_gradient_depth, true, true);
@@ -152,34 +110,13 @@ ThemeManager::ThemeManager()
hbox->pack_start (timeline_item_gradient_depth_label, false, false);
pack_start (*hbox, PACK_SHRINK);
- palette_group = initialize_palette_canvas (*palette_viewport.canvas());
- palette_viewport.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_canvas_allocated), palette_group, palette_viewport.canvas(),
- sigc::mem_fun (*this, &ThemeManager::palette_event)));
- palette_scroller.add (palette_viewport);
-
- modifier_scroller.add (modifier_vbox);
-
- notebook.append_page (alias_scroller, _("Items"));
- notebook.append_page (palette_scroller, _("Palette"));
- notebook.append_page (modifier_scroller, _("Transparency"));
-
- pack_start (notebook);
-
show_all ();
waveform_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED);
timeline_item_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED);
- color_dialog.get_colorsel()->set_has_opacity_control (true);
- color_dialog.get_colorsel()->set_has_palette (true);
-
set_ui_to_state();
- color_dialog.get_ok_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_ACCEPT));
- color_dialog.get_cancel_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_CANCEL));
- dark_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_dark_theme_button_toggled));
- light_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_light_theme_button_toggled));
- reset_button.signal_clicked().connect (sigc::mem_fun (*this, &ThemeManager::reset_canvas_colors));
flat_buttons.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_flat_buttons_toggled));
blink_rec_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_blink_rec_arm_toggled));
region_color_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_region_color_toggled));
@@ -202,74 +139,6 @@ ThemeManager::ThemeManager()
string_compose (_("When detaching the monitoring section, mark it as \"Utility\" window to stay in front.\n"
"This requires a restart of %1 to take effect"), PROGRAM_NAME));
- set_size_request (-1, 400);
- /* no need to call setup_palette() here, it will be done when its size is allocated */
- setup_aliases ();
- setup_modifiers ();
-
- UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ThemeManager::colors_changed));
-}
-
-ThemeManager::~ThemeManager()
-{
-}
-
-void
-ThemeManager::setup_modifiers ()
-{
- UIConfiguration* uic (&UIConfiguration::instance());
- UIConfiguration::Modifiers& modifiers (uic->modifiers);
- Gtk::HBox* mod_hbox;
- Gtk::Label* mod_label;
- Gtk::HScale* mod_scale;
-
- Gtkmm2ext::container_clear (modifier_vbox);
-
- for (UIConfiguration::Modifiers::const_iterator m = modifiers.begin(); m != modifiers.end(); ++m) {
- mod_hbox = manage (new HBox);
-
- mod_scale = manage (new HScale (0.0, 1.0, 0.01));
- mod_scale->set_draw_value (false);
- mod_scale->set_value (m->second.a());
- mod_scale->set_update_policy (Gtk::UPDATE_DISCONTINUOUS);
- mod_scale->signal_value_changed().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::modifier_edited), mod_scale, m->first));
-
- mod_label = manage (new Label (m->first));
- mod_label->set_alignment (1.0, 0.5);
- mod_label->set_size_request (150, -1); /* 150 pixels should be enough for anyone */
-
- mod_hbox->pack_start (*mod_label, false, true, 12);
- mod_hbox->pack_start (*mod_scale, true, true);
-
- modifier_vbox.pack_start (*mod_hbox, false, false);
- }
-
- modifier_vbox.show_all ();
-
-}
-
-void
-ThemeManager::modifier_edited (Gtk::Range* range, string name)
-{
- using namespace ArdourCanvas;
-
- double alpha = range->get_value();
- SVAModifier svam (SVAModifier::Assign, -1.0, -1.0, alpha);
- UIConfiguration::instance().set_modifier (name, svam);
-}
-
-void
-ThemeManager::colors_changed ()
-{
- setup_palette ();
- setup_aliases ();
- setup_modifiers ();
-}
-
-int
-ThemeManager::save (string /*path*/)
-{
- return 0;
}
void
@@ -345,39 +214,8 @@ ThemeManager::on_icon_set_changed ()
}
void
-ThemeManager::on_dark_theme_button_toggled()
-{
- if (!dark_button.get_active()) return;
-
- UIConfiguration* uic (&UIConfiguration::instance());
-
- uic->set_color_file("dark");
-}
-
-void
-ThemeManager::on_light_theme_button_toggled()
-{
- if (!light_button.get_active()) return;
-
- UIConfiguration* uic (&UIConfiguration::instance());
-
- uic->set_color_file("light");
-}
-
-void
ThemeManager::set_ui_to_state()
{
- /* there is no way these values can change individually
- * by themselves (w/o user-interaction)
- * hence a common combined update function suffices
- */
-
- if (UIConfiguration::instance().get_color_file() == "light") {
- light_button.set_active(true);
- } else {
- dark_button.set_active(true);
- }
-
/* there is no need to block signal handlers, here,
* all elements check if the value has changed and ignore NOOPs
*/
@@ -392,369 +230,3 @@ ThemeManager::set_ui_to_state()
timeline_item_gradient_depth.set_value(UIConfiguration::instance().get_timeline_item_gradient_depth());
}
-void
-ThemeManager::reset_canvas_colors()
-{
- string cfile;
- string basename;
-
- basename = "my-";
- basename += UIConfiguration::instance().get_color_file();
- basename += ".colors";
-
- if (find_file (ardour_config_search_path(), basename, cfile)) {
- string backup = cfile + string (X_(".old"));
- g_rename (cfile.c_str(), backup.c_str());
- /* don't really care if it fails */
- }
-
- UIConfiguration::instance().load_defaults();
- UIConfiguration::instance().save_state ();
- set_ui_to_state();
-}
-
-ArdourCanvas::Container*
-ThemeManager::initialize_palette_canvas (ArdourCanvas::Canvas& canvas)
-{
- using namespace ArdourCanvas;
-
- /* hide background */
- canvas.set_background_color (rgba_to_color (0.0, 0.0, 1.0, 0.0));
-
- /* bi-directional scroll group */
-
- ScrollGroup* scroll_group = new ScrollGroup (canvas.root(), ScrollGroup::ScrollSensitivity (ScrollGroup::ScrollsVertically|ScrollGroup::ScrollsHorizontally));
- canvas.add_scroller (*scroll_group);
-
- /* new container to hold everything */
-
- return new ArdourCanvas::Container (scroll_group);
-}
-
-void
-ThemeManager::palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler)
-{
- build_palette_canvas (*canvas, *group, event_handler);
-}
-
-struct NamedColor {
- string name;
- ArdourCanvas::HSV color;
- NamedColor (string s, ArdourCanvas::HSV c) : name (s), color (c) {}
-};
-
-struct SortByHue {
- bool operator() (NamedColor const & a, NamedColor const & b) {
- using namespace ArdourCanvas;
- const HSV black (0, 0, 0);
- if (a.color.is_gray() || b.color.is_gray()) {
- return black.distance (a.color) < black.distance (b.color);
- } else {
- return a.color.h < b.color.h;
- // const HSV red (rgba_to_color (1.0, 0.0, 0.0, 1.0));
- // return red.distance (a.color) < red.distance (b.color);
- }
- }
-};
-
-
-void
-ThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas::Container& group, sigc::slot<bool,GdkEvent*,std::string> event_handler)
-{
- using namespace ArdourCanvas;
-
- /* we want the colors sorted by hue, with their name */
-
- UIConfiguration::Colors& colors (UIConfiguration::instance().colors);
- vector<NamedColor> nc;
- for (UIConfiguration::Colors::const_iterator x = colors.begin(); x != colors.end(); ++x) {
- nc.push_back (NamedColor (x->first, HSV (x->second)));
- }
- SortByHue sorter;
- sort (nc.begin(), nc.end(), sorter);
-
- const uint32_t color_limit = nc.size();
- const double box_size = 20.0;
- const double width = canvas.width();
- const double height = canvas.height();
-
- uint32_t color_num = 0;
-
- /* clear existing rects and delete them */
-
- group.clear (true);
-
- for (uint32_t y = 0; y < height - box_size && color_num < color_limit; y += box_size) {
- for (uint32_t x = 0; x < width - box_size && color_num < color_limit; x += box_size) {
- ArdourCanvas::Rectangle* r = new ArdourCanvas::Rectangle (&group, ArdourCanvas::Rect (x, y, x + box_size, y + box_size));
-
- string name = nc[color_num++].name;
-
- UIConfiguration::Colors::iterator c = colors.find (name);
-
- if (c != colors.end()) {
- Color color = c->second;
- r->set_fill_color (color);
- r->set_outline_color (rgba_to_color (0.0, 0.0, 0.0, 1.0));
- r->set_tooltip (name);
- r->Event.connect (sigc::bind (event_handler, name));
- }
- }
- }
-}
-
-void
-ThemeManager::palette_size_request (Gtk::Requisition* req)
-{
- uint32_t ncolors = UIConfiguration::instance().colors.size();
- const int box_size = 20;
-
- double c = sqrt ((double)ncolors);
- req->width = (int) floor (c * box_size);
- req->height = (int) floor (c * box_size);
-
- /* add overflow row if necessary */
-
- if (fmod (ncolors, c) != 0.0) {
- req->height += box_size;
- }
-}
-
-void
-ThemeManager::setup_palette ()
-{
- build_palette_canvas (*palette_viewport.canvas(), *palette_group, sigc::mem_fun (*this, &ThemeManager::palette_event));
-}
-
-bool
-ThemeManager::palette_event (GdkEvent* ev, string name)
-{
- switch (ev->type) {
- case GDK_BUTTON_RELEASE:
- edit_palette_color (name);
- return true;
- default:
- break;
- }
- return true;
-}
-
-void
-ThemeManager::edit_palette_color (std::string name)
-{
- using namespace ArdourCanvas;
- double r,g, b, a;
- UIConfiguration* uic (&UIConfiguration::instance());
- ArdourCanvas::Color c = uic->color (name);
- Gdk::Color gdkcolor;
-
- color_to_rgba (c, r, g, b, a);
-
- gdkcolor.set_rgb_p (r, g, b);
- color_dialog.get_colorsel()->set_previous_color (gdkcolor);
- color_dialog.get_colorsel()->set_current_color (gdkcolor);
- color_dialog.get_colorsel()->set_previous_alpha ((guint16) (a * 65535));
- color_dialog.get_colorsel()->set_current_alpha ((guint16) (a * 65535));
-
- color_dialog_connection.disconnect ();
- color_dialog_connection = color_dialog.signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_color_response), name));
- color_dialog.present();
-}
-
-void
-ThemeManager::palette_color_response (int result, std::string name)
-{
- using namespace ArdourCanvas;
-
- color_dialog_connection.disconnect ();
-
- UIConfiguration* uic (&UIConfiguration::instance());
- Gdk::Color gdkcolor;
- double r,g, b, a;
-
- switch (result) {
- case RESPONSE_ACCEPT:
- case RESPONSE_OK:
- gdkcolor = color_dialog.get_colorsel()->get_current_color();
- a = color_dialog.get_colorsel()->get_current_alpha() / 65535.0;
- r = gdkcolor.get_red_p();
- g = gdkcolor.get_green_p();
- b = gdkcolor.get_blue_p();
-
- uic->set_color (name, rgba_to_color (r, g, b, a));
- break;
-
- default:
- break;
- }
-
- color_dialog.hide ();
-}
-
-bool
-ThemeManager::alias_palette_event (GdkEvent* ev, string new_alias, string target_name)
-{
- switch (ev->type) {
- case GDK_BUTTON_RELEASE:
- UIConfiguration::instance().set_alias (target_name, new_alias);
- return true;
- break;
- default:
- break;
- }
- return false;
-}
-
-void
-ThemeManager::alias_palette_response (int response, std::string target_name, std::string old_alias)
-{
- switch (response) {
- case GTK_RESPONSE_OK:
- case GTK_RESPONSE_ACCEPT:
- /* rebuild alias list with new color: inefficient but simple */
- setup_aliases ();
- break;
-
- case GTK_RESPONSE_REJECT:
- /* revert choice */
- UIConfiguration::instance().set_alias (target_name, old_alias);
- break;
-
- default:
- /* do nothing */
- break;
- }
-
- palette_window->hide ();
-}
-
-void
-ThemeManager::choose_color_from_palette (string const & name)
-{
- UIConfiguration* uic (&UIConfiguration::instance());
- UIConfiguration::ColorAliases::iterator i = uic->color_aliases.find (name);
-
- if (i == uic->color_aliases.end()) {
- return;
- }
-
- delete palette_window;
-
- palette_window = new ArdourDialog (_("Color Palette"));
- palette_window->add_button (Stock::CANCEL, RESPONSE_REJECT); /* using CANCEL causes confusion if dialog is closed via CloseAllDialogs */
- palette_window->add_button (Stock::OK, RESPONSE_OK);
-
- ArdourCanvas::GtkCanvas* canvas = new ArdourCanvas::GtkCanvas ();
- ArdourCanvas::Container* group = initialize_palette_canvas (*canvas);
-
- canvas->signal_size_request().connect (sigc::mem_fun (*this, &ThemeManager::palette_size_request));
- canvas->signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_canvas_allocated), group, canvas,
- sigc::bind (sigc::mem_fun (*this, &ThemeManager::alias_palette_event), name)));
-
- palette_window->get_vbox()->pack_start (*canvas);
- palette_window->show_all ();
-
- palette_response_connection = palette_window->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::alias_palette_response), name, i->second));
-
- palette_window->set_position (WIN_POS_MOUSE);
- palette_window->present ();
-}
-
-void
-ThemeManager::setup_aliases ()
-{
- using namespace ArdourCanvas;
-
- UIConfiguration* uic (&UIConfiguration::instance());
- UIConfiguration::ColorAliases& aliases (uic->color_aliases);
-
- alias_list->clear ();
-
- for (UIConfiguration::ColorAliases::iterator i = aliases.begin(); i != aliases.end(); ++i) {
- TreeModel::Children rows = alias_list->children();
- TreeModel::Row row;
- string::size_type colon;
-
- if ((colon = i->first.find (':')) != string::npos) {
-
- /* this is supposed to be a child node, so find the
- * parent
- */
-
- string parent = i->first.substr (0, colon);
- TreeModel::iterator ri;
-
- for (ri = rows.begin(); ri != rows.end(); ++ri) {
- string s = (*ri)[alias_columns.name];
- if (s == parent) {
- break;
- }
- }
-
- if (ri == rows.end()) {
- /* not found, add the parent as new top level row */
- row = *(alias_list->append());
- row[alias_columns.name] = parent;
- row[alias_columns.alias] = "";
-
- /* now add the child as a child of this one */
-
- row = *(alias_list->insert (row->children().end()));
- row[alias_columns.name] = i->first.substr (colon+1);
- } else {
- row = *(alias_list->insert ((*ri)->children().end()));
- row[alias_columns.name] = i->first.substr (colon+1);
- }
-
- } else {
- /* add as a child */
- row = *(alias_list->append());
- row[alias_columns.name] = i->first;
- row[alias_columns.key] = i->first;
- }
-
- row[alias_columns.key] = i->first;
- row[alias_columns.alias] = i->second;
-
- Gdk::Color col;
- double r, g, b, a;
- Color c (uic->color (i->second));
- color_to_rgba (c, r, g, b, a);
- col.set_rgb_p (r, g, b);
-
- row[alias_columns.color] = col;
- }
-}
-
-bool
-ThemeManager::alias_button_press_event (GdkEventButton* ev)
-{
- TreeIter iter;
- TreeModel::Path path;
- TreeViewColumn* column;
- int cellx;
- int celly;
-
- if (!alias_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
- return false;
- }
-
- guint32 colnum = GPOINTER_TO_UINT (column->get_data (X_("colnum")));
-
- switch (colnum) {
- case 0:
- /* allow normal processing to occur */
- return false;
-
- case 1: /* color */
- if ((iter = alias_list->get_iter (path))) {
- string target_color_alias = (*iter)[alias_columns.key];
- if (!target_color_alias.empty()) {
- choose_color_from_palette (target_color_alias);
- }
- }
- break;
- }
-
- return true;
-}
diff --git a/gtk2_ardour/theme_manager.h b/gtk2_ardour/theme_manager.h
index 36e85e5..75a7d10 100644
--- a/gtk2_ardour/theme_manager.h
+++ b/gtk2_ardour/theme_manager.h
@@ -17,41 +17,26 @@
*/
-#ifndef __ardour_gtk_color_manager_h__
-#define __ardour_gtk_color_manager_h__
+#ifndef __ardour_gtk_theme_manager_h__
+#define __ardour_gtk_theme_manager_h__
#include <gtkmm/treeview.h>
#include <gtkmm/treestore.h>
#include <gtkmm/scrolledwindow.h>
-#include <gtkmm/colorselection.h>
#include <gtkmm/radiobutton.h>
#include <gtkmm/button.h>
#include <gtkmm/scale.h>
#include <gtkmm/rc.h>
-#include "canvas/types.h"
-#include "canvas/canvas.h"
-
#include "ui_config.h"
-namespace ArdourCanvas {
- class Container;
- class ScrollGroup;
-}
-
class ArdourDialog;
class ThemeManager : public Gtk::VBox
{
public:
ThemeManager();
- ~ThemeManager();
-
- int save (std::string path);
- void reset_canvas_colors();
- void on_dark_theme_button_toggled ();
- void on_light_theme_button_toggled ();
void on_flat_buttons_toggled ();
void on_blink_rec_arm_toggled ();
void on_region_color_toggled ();
@@ -64,25 +49,6 @@ class ThemeManager : public Gtk::VBox
void on_icon_set_changed ();
private:
- Gtk::Notebook notebook;
-
- struct BasicColorDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
- BasicColorDisplayModelColumns() {
- add (name);
- add (gdkcolor);
- }
-
- Gtk::TreeModelColumn<std::string> name;
- Gtk::TreeModelColumn<Gdk::Color> gdkcolor;
- };
-
- Gtk::ColorSelectionDialog color_dialog;
- sigc::connection color_dialog_connection;
-
- Gtk::HBox theme_selection_hbox;
- Gtk::RadioButton dark_button;
- Gtk::RadioButton light_button;
- Gtk::Button reset_button;
Gtk::CheckButton flat_buttons;
Gtk::CheckButton blink_rec_button;
Gtk::CheckButton region_color_button;
@@ -98,82 +64,8 @@ class ThemeManager : public Gtk::VBox
Gtk::Label icon_set_label;
Gtk::ComboBoxText icon_set_dropdown;
- /* handls response from color dialog when it is used to
- edit a derived color.
- */
- void palette_color_response (int, std::string);
-
- Gtk::ScrolledWindow palette_scroller;
- ArdourCanvas::GtkCanvasViewport palette_viewport;
- ArdourCanvas::Container* palette_group;
-
- /* these methods create and manage a canvas for use in either the
- palette tab or in a separate dialog. Different behaviour is
- accomplished by changing the event handler passed into the
- allocation handler. We do it there because we have to rebuild
- the canvas on allocation events, and during the rebuild, connect
- each rectangle to the event handler.
-
- the alternative is one event handler for the canvas and a map
- of where each color rectangle is. nothing wrong with this
- but the per-rect event setup is simpler and avoids building
- and looking up the map information.
- */
- ArdourCanvas::Container* initialize_palette_canvas (ArdourCanvas::Canvas& canvas);
- void build_palette_canvas (ArdourCanvas::Canvas&, ArdourCanvas::Container&, sigc::slot<bool,GdkEvent*,std::string> event_handler);
- void palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler);
- void palette_size_request (Gtk::Requisition*);
-
- /* handles events from a palette canvas inside the palette (derived
- colors) tab
- */
- bool palette_event (GdkEvent*, std::string name);
- /* allows user to edit a named color (e.g. "color 3") after clicking
- on it inside the palette tab.
- */
- void edit_palette_color (std::string);
-
- struct ColorAliasModelColumns : public Gtk::TreeModel::ColumnRecord {
- ColorAliasModelColumns() {
- add (name);
- add (alias);
- add (color);
- add (key);
- }
-
- Gtk::TreeModelColumn<std::string> name;
- Gtk::TreeModelColumn<std::string> alias;
- Gtk::TreeModelColumn<Gdk::Color> color;
- Gtk::TreeModelColumn<std::string> key;
- };
-
- ColorAliasModelColumns alias_columns;
- Gtk::TreeView alias_display;
- Glib::RefPtr<Gtk::TreeStore> alias_list;
- Gtk::ScrolledWindow alias_scroller;
-
- bool alias_button_press_event (GdkEventButton*);
-
- ArdourDialog* palette_window;
- sigc::connection palette_response_connection;
-
- void choose_color_from_palette (std::string const &target_name);
-
- bool alias_palette_event (GdkEvent*, std::string, std::string);
- void alias_palette_response (int, std::string, std::string);
-
- void setup_aliases ();
- void setup_palette ();
-
- Gtk::ScrolledWindow modifier_scroller;
- Gtk::VBox modifier_vbox;
-
- void setup_modifiers ();
- void modifier_edited (Gtk::Range*, std::string);
-
void colors_changed ();
void set_ui_to_state ();
};
-#endif /* __ardour_gtk_color_manager_h__ */
-
+#endif /* __ardour_gtk_theme_manager_h__ */
diff --git a/gtk2_ardour/themes/blueberry-milk-ardour.colors b/gtk2_ardour/themes/blueberry-milk-ardour.colors
new file mode 100644
index 0000000..af542ef
--- /dev/null
+++ b/gtk2_ardour/themes/blueberry-milk-ardour.colors
@@ -0,0 +1,524 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Blueberry Milk">
+ <Colors>
+ <Color name="color 1" value="0x20b2b2ff"/>
+ <Color name="color 10" value="0xe3dedeff"/>
+ <Color name="color 100" value="0xe49c9cff"/>
+ <Color name="color 101" value="0xa06000ff"/>
+ <Color name="color 103" value="0x1e7727ff"/>
+ <Color name="color 104" value="0x676767ff"/>
+ <Color name="color 11" value="0x9496a3ff"/>
+ <Color name="color 12" value="0x18ab27ff"/>
+ <Color name="color 13" value="0xe8e8e8ff"/>
+ <Color name="color 14" value="0xb0cacaff"/>
+ <Color name="color 15" value="0x282b49ff"/>
+ <Color name="color 16" value="0x7a99c7ff"/>
+ <Color name="color 17" value="0x00ff1aff"/>
+ <Color name="color 18" value="0x969ab2ff"/>
+ <Color name="color 19" value="0xdd6363ff"/>
+ <Color name="color 2" value="0x464646ff"/>
+ <Color name="color 20" value="0x684d4dff"/>
+ <Color name="color 21" value="0x565656ff"/>
+ <Color name="color 22" value="0xe0e0e0ff"/>
+ <Color name="color 23" value="0xa581c8ff"/>
+ <Color name="color 24" value="0x9fbca2ff"/>
+ <Color name="color 25" value="0x525252ff"/>
+ <Color name="color 26" value="0xc7c9d8ff"/>
+ <Color name="color 27" value="0x333333ff"/>
+ <Color name="color 28" value="0x79688bff"/>
+ <Color name="color 29" value="0x7b7878ff"/>
+ <Color name="color 3" value="0x738299ff"/>
+ <Color name="color 30" value="0xbb60b3ff"/>
+ <Color name="color 31" value="0xddddd8ff"/>
+ <Color name="color 32" value="0xeddc3d77"/>
+ <Color name="color 33" value="0xbbbbbbff"/>
+ <Color name="color 34" value="0x3c3c3cff"/>
+ <Color name="color 35" value="0x757aa5ff"/>
+ <Color name="color 36" value="0x473212ff"/>
+ <Color name="color 37" value="0x637160ff"/>
+ <Color name="color 38" value="0x8dc9b7ff"/>
+ <Color name="color 39" value="0x35965cff"/>
+ <Color name="color 4" value="0x717171ff"/>
+ <Color name="color 40" value="0x7c3a3aff"/>
+ <Color name="color 41" value="0x497a5dff"/>
+ <Color name="color 42" value="0x404145ff"/>
+ <Color name="color 43" value="0x686c92ff"/>
+ <Color name="color 44" value="0x004f08ff"/>
+ <Color name="color 45" value="0xa29e9eff"/>
+ <Color name="color 46" value="0x666464ff"/>
+ <Color name="color 47" value="0x00880eff"/>
+ <Color name="color 48" value="0x396b3eff"/>
+ <Color name="color 49" value="0x00660aff"/>
+ <Color name="color 5" value="0x9dadc4ff"/>
+ <Color name="color 50" value="0xeeeeecff"/>
+ <Color name="color 51" value="0x383d37ff"/>
+ <Color name="color 52" value="0xe8faa1ff"/>
+ <Color name="color 53" value="0xa1927cff"/>
+ <Color name="color 54" value="0xf48352ff"/>
+ <Color name="color 55" value="0xf85813ff"/>
+ <Color name="color 56" value="0x8ec794ff"/>
+ <Color name="color 57" value="0x7ea854ff"/>
+ <Color name="color 58" value="0x474f3fff"/>
+ <Color name="color 59" value="0xaeb0c4ff"/>
+ <Color name="color 6" value="0x91a993ff"/>
+ <Color name="color 60" value="0x50545aff"/>
+ <Color name="color 61" value="0x4a4b4dff"/>
+ <Color name="color 62" value="0xaaaed4ff"/>
+ <Color name="color 63" value="0x8a90ccff"/>
+ <Color name="color 64" value="0xb7b8c1ff"/>
+ <Color name="color 65" value="0xb8cca3ff"/>
+ <Color name="color 66" value="0x4f2f00ff"/>
+ <Color name="color 67" value="0x272727ff"/>
+ <Color name="color 68" value="0xc57805ff"/>
+ <Color name="color 69" value="0x660000ff"/>
+ <Color name="color 7" value="0x5f5f5fff"/>
+ <Color name="color 70" value="0x304057ff"/>
+ <Color name="color 71" value="0x5f5a58ff"/>
+ <Color name="color 72" value="0xe58b05ff"/>
+ <Color name="color 73" value="0x8487a5ff"/>
+ <Color name="color 74" value="0x899ab4ff"/>
+ <Color name="color 75" value="0xbba900ff"/>
+ <Color name="color 76" value="0x6c6e6aff"/>
+ <Color name="color 77" value="0x8ea8cfff"/>
+ <Color name="color 78" value="0xb5bec2ff"/>
+ <Color name="color 79" value="0x254528ff"/>
+ <Color name="color 8" value="0xff9900ff"/>
+ <Color name="color 80" value="0x603535ff"/>
+ <Color name="color 81" value="0xa5a5a5ff"/>
+ <Color name="color 82" value="0xd8d8d8ff"/>
+ <Color name="color 83" value="0xa80000ff"/>
+ <Color name="color 84" value="0x7b354aff"/>
+ <Color name="color 85" value="0x1e90ffff"/>
+ <Color name="color 86" value="0x794c4cff"/>
+ <Color name="color 87" value="0x242222ff"/>
+ <Color name="color 88" value="0xc6c6c6ff"/>
+ <Color name="color 89" value="0xb6e8fdff"/>
+ <Color name="color 9" value="0xf10000ff"/>
+ <Color name="color 90" value="0x222020ff"/>
+ <Color name="color 91" value="0x8ef823ff"/>
+ <Color name="color 92" value="0xcfdee4ff"/>
+ <Color name="color 93" value="0x51578aff"/>
+ <Color name="color 94" value="0x636363ff"/>
+ <Color name="color 95" value="0xe4f4d3ff"/>
+ <Color name="color 96" value="0x85e524ff"/>
+ <Color name="color 97" value="0xccccccff"/>
+ <Color name="color 98" value="0x9989a3ff"/>
+ <Color name="color 99" value="0xaeb8bcff"/>
+ <Color name="meter color0" value="0x402e6bff"/>
+ <Color name="meter color1" value="0x29ffeeff"/>
+ <Color name="meter color2" value="0x57ffc3ff"/>
+ <Color name="meter color3" value="0xc1ffedff"/>
+ <Color name="meter color4" value="0xf5fed8ff"/>
+ <Color name="meter color5" value="0xfff000ff"/>
+ <Color name="meter color6" value="0xffe23eff"/>
+ <Color name="meter color7" value="0xff8700ff"/>
+ <Color name="meter color8" value="0xff0000ff"/>
+ <Color name="meter color9" value="0xff0000ff"/>
+ </Colors>
+ <ColorAliases>
+ <ColorAlias name="active crossfade" alias="color 1"/>
+ <ColorAlias name="arrange base" alias="color 82"/>
+ <ColorAlias name="audio automation track fill" alias="color 70"/>
+ <ColorAlias name="audio bus base" alias="color 3"/>
+ <ColorAlias name="audio master bus base" alias="color 4"/>
+ <ColorAlias name="audio track base" alias="color 77"/>
+ <ColorAlias name="automation line" alias="meter color0"/>
+ <ColorAlias name="automation track outline" alias="color 7"/>
+ <ColorAlias name="big clock active: background" alias="color 4"/>
+ <ColorAlias name="big clock active: cursor" alias="color 8"/>
+ <ColorAlias name="big clock active: edited text" alias="color 8"/>
+ <ColorAlias name="big clock active: text" alias="color 9"/>
+ <ColorAlias name="big clock: background" alias="color 15"/>
+ <ColorAlias name="big clock: cursor" alias="color 8"/>
+ <ColorAlias name="big clock: edited text" alias="color 8"/>
+ <ColorAlias name="big clock: text" alias="color 10"/>
+ <ColorAlias name="border color" alias="color 4"/>
+ <ColorAlias name="cd marker bar" alias="color 87"/>
+ <ColorAlias name="clipped waveform" alias="color 9"/>
+ <ColorAlias name="clock: background" alias="color 104"/>
+ <ColorAlias name="clock: cursor" alias="color 8"/>
+ <ColorAlias name="clock: edited text" alias="color 8"/>
+ <ColorAlias name="clock: text" alias="color 13"/>
+ <ColorAlias name="comment button: fill" alias="color 20"/>
+ <ColorAlias name="control point fill" alias="color 17"/>
+ <ColorAlias name="control point outline" alias="meter color3"/>
+ <ColorAlias name="control point selected fill" alias="color 62"/>
+ <ColorAlias name="control point selected outline" alias="color 9"/>
+ <ColorAlias name="covered region" alias="color 87"/>
+ <ColorAlias name="crossfade editor base" alias="color 15"/>
+ <ColorAlias name="crossfade editor line" alias="color 4"/>
+ <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+ <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+ <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+ <ColorAlias name="crossfade editor wave" alias="color 13"/>
+ <ColorAlias name="crossfade line" alias="color 4"/>
+ <ColorAlias name="edit point" alias="color 18"/>
+ <ColorAlias name="entered automation line" alias="color 19"/>
+ <ColorAlias name="entered gain line" alias="color 19"/>
+ <ColorAlias name="entered marker" alias="color 19"/>
+ <ColorAlias name="feedback alert: fill" alias="color 20"/>
+ <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+ <ColorAlias name="feedback alert: led active" alias="color 4"/>
+ <ColorAlias name="frame handle" alias="color 23"/>
+ <ColorAlias name="gain line" alias="color 6"/>
+ <ColorAlias name="gain line inactive" alias="color 24"/>
+ <ColorAlias name="generic button: fill" alias="color 25"/>
+ <ColorAlias name="generic button: fill active" alias="color 9"/>
+ <ColorAlias name="generic button: led active" alias="color 18"/>
+ <ColorAlias name="ghost track base" alias="color 46"/>
+ <ColorAlias name="ghost track midi outline" alias="color 4"/>
+ <ColorAlias name="ghost track wave" alias="color 29"/>
+ <ColorAlias name="ghost track wave clip" alias="color 29"/>
+ <ColorAlias name="ghost track wave fill" alias="color 29"/>
+ <ColorAlias name="ghost track zero line" alias="color 30"/>
+ <ColorAlias name="gtk_arm" alias="color 9"/>
+ <ColorAlias name="gtk_audio_bus" alias="color 2"/>
+ <ColorAlias name="gtk_audio_track" alias="color 16"/>
+ <ColorAlias name="gtk_automation_track_header" alias="color 13"/>
+ <ColorAlias name="gtk_background" alias="color 22"/>
+ <ColorAlias name="gtk_bases" alias="color 88"/>
+ <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+ <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+ <ColorAlias name="gtk_bright_color" alias="color 74"/>
+ <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+ <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+ <ColorAlias name="gtk_control_master" alias="color 64"/>
+ <ColorAlias name="gtk_control_text" alias="color 29"/>
+ <ColorAlias name="gtk_control_text2" alias="color 83"/>
+ <ColorAlias name="gtk_darkest" alias="color 81"/>
+ <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+ <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+ <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+ <ColorAlias name="gtk_foreground" alias="color 93"/>
+ <ColorAlias name="gtk_light_text_on_dark" alias="color 104"/>
+ <ColorAlias name="gtk_lightest" alias="color 22"/>
+ <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+ <ColorAlias name="gtk_midi_track" alias="color 64"/>
+ <ColorAlias name="gtk_monitor" alias="color 8"/>
+ <ColorAlias name="gtk_mono" alias="color 95"/>
+ <ColorAlias name="gtk_mute" alias="color 52"/>
+ <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+ <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+ <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+ <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+ <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+ <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+ <ColorAlias name="gtk_processor_prefader" alias="color 23"/>
+ <ColorAlias name="gtk_processor_prefader_frame" alias="color 23"/>
+ <ColorAlias name="gtk_send_bg" alias="color 38"/>
+ <ColorAlias name="gtk_send_fg" alias="color 24"/>
+ <ColorAlias name="gtk_solo" alias="color 91"/>
+ <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+ <ColorAlias name="gtk_texts" alias="color 7"/>
+ <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+ <ColorAlias name="gtk_track_header_selected" alias="color 59"/>
+ <ColorAlias name="image track" alias="color 31"/>
+ <ColorAlias name="inactive crossfade" alias="color 32"/>
+ <ColorAlias name="inactive fade handle" alias="color 33"/>
+ <ColorAlias name="inactive group tab" alias="color 34"/>
+ <ColorAlias name="invert button: fill active" alias="color 35"/>
+ <ColorAlias name="invert button: led active" alias="color 37"/>
+ <ColorAlias name="location cd marker" alias="color 38"/>
+ <ColorAlias name="location loop" alias="color 33"/>
+ <ColorAlias name="location marker" alias="color 32"/>
+ <ColorAlias name="location punch" alias="color 23"/>
+ <ColorAlias name="location range" alias="color 41"/>
+ <ColorAlias name="lock button: fill active" alias="color 42"/>
+ <ColorAlias name="lock button: led active" alias="color 4"/>
+ <ColorAlias name="marker bar" alias="color 2"/>
+ <ColorAlias name="marker bar separator" alias="color 27"/>
+ <ColorAlias name="marker drag line" alias="meter color1"/>
+ <ColorAlias name="marker label" alias="color 4"/>
+ <ColorAlias name="marker track" alias="color 31"/>
+ <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+ <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+ <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+ <ColorAlias name="measure line bar" alias="color 67"/>
+ <ColorAlias name="measure line beat" alias="color 81"/>
+ <ColorAlias name="meter background bottom" alias="color 67"/>
+ <ColorAlias name="meter background top" alias="color 67"/>
+ <ColorAlias name="meter bar" alias="color 7"/>
+ <ColorAlias name="meter color BBC" alias="color 8"/>
+ <ColorAlias name="meter marker" alias="color 19"/>
+ <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+ <ColorAlias name="meterbridge label: led" alias="color 9"/>
+ <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+ <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+ <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+ <ColorAlias name="midi automation track fill" alias="color 22"/>
+ <ColorAlias name="midi bus base" alias="color 15"/>
+ <ColorAlias name="midi device: fill" alias="color 25"/>
+ <ColorAlias name="midi device: fill active" alias="color 42"/>
+ <ColorAlias name="midi device: led active" alias="color 17"/>
+ <ColorAlias name="midi frame base" alias="color 81"/>
+ <ColorAlias name="midi input button: fill active" alias="color 63"/>
+ <ColorAlias name="midi input button: led active" alias="color 4"/>
+ <ColorAlias name="midi meter color0" alias="color 52"/>
+ <ColorAlias name="midi meter color1" alias="color 53"/>
+ <ColorAlias name="midi meter color2" alias="color 53"/>
+ <ColorAlias name="midi meter color3" alias="color 54"/>
+ <ColorAlias name="midi meter color4" alias="color 54"/>
+ <ColorAlias name="midi meter color5" alias="color 55"/>
+ <ColorAlias name="midi meter color6" alias="color 55"/>
+ <ColorAlias name="midi meter color7" alias="color 56"/>
+ <ColorAlias name="midi meter color8" alias="color 56"/>
+ <ColorAlias name="midi meter color9" alias="color 17"/>
+ <ColorAlias name="midi note inactive channel" alias="color 4"/>
+ <ColorAlias name="midi note max" alias="color 17"/>
+ <ColorAlias name="midi note mid" alias="color 62"/>
+ <ColorAlias name="midi note min" alias="color 93"/>
+ <ColorAlias name="midi note selected" alias="color 25"/>
+ <ColorAlias name="midi note selected outline" alias="color 85"/>
+ <ColorAlias name="midi note velocity text" alias="color 32"/>
+ <ColorAlias name="midi patch change fill" alias="color 60"/>
+ <ColorAlias name="midi patch change outline" alias="color 26"/>
+ <ColorAlias name="midi select rect outline" alias="color 63"/>
+ <ColorAlias name="midi sysex fill" alias="color 32"/>
+ <ColorAlias name="midi sysex outline" alias="color 64"/>
+ <ColorAlias name="midi track base" alias="color 82"/>
+ <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+ <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+ <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+ <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+ <ColorAlias name="monitor button: fill active" alias="color 68"/>
+ <ColorAlias name="monitor button: led active" alias="color 9"/>
+ <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+ <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+ <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+ <ColorAlias name="monitor section knob" alias="color 60"/>
+ <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+ <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
+ <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+ <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+ <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+ <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+ <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+ <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+ <ColorAlias name="mono panner bg" alias="color 67"/>
+ <ColorAlias name="mono panner fill" alias="color 74"/>
+ <ColorAlias name="mono panner outline" alias="color 70"/>
+ <ColorAlias name="mono panner position fill" alias="color 11"/>
+ <ColorAlias name="mono panner position outline" alias="color 70"/>
+ <ColorAlias name="mono panner text" alias="color 34"/>
+ <ColorAlias name="mouse mode button: fill active" alias="color 59"/>
+ <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+ <ColorAlias name="mute button: fill active" alias="color 75"/>
+ <ColorAlias name="mute button: led active" alias="color 4"/>
+ <ColorAlias name="name highlight fill" alias="color 18"/>
+ <ColorAlias name="name highlight outline" alias="color 23"/>
+ <ColorAlias name="nudge button: fill" alias="color 35"/>
+ <ColorAlias name="nudge button: fill active" alias="color 42"/>
+ <ColorAlias name="nudge button: led active" alias="color 8"/>
+ <ColorAlias name="nudge clock: background" alias="color 46"/>
+ <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+ <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+ <ColorAlias name="nudge clock: text" alias="color 62"/>
+ <ColorAlias name="page switch button: fill" alias="color 94"/>
+ <ColorAlias name="page switch button: fill active" alias="color 92"/>
+ <ColorAlias name="piano roll black" alias="color 76"/>
+ <ColorAlias name="piano roll black outline" alias="color 33"/>
+ <ColorAlias name="piano roll white" alias="color 13"/>
+ <ColorAlias name="play head" alias="color 70"/>
+ <ColorAlias name="plugin bypass button: led active" alias="meter color4"/>
+ <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+ <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+ <ColorAlias name="processor automation line" alias="color 77"/>
+ <ColorAlias name="processor control button: fill" alias="color 29"/>
+ <ColorAlias name="processor control button: fill active" alias="color 46"/>
+ <ColorAlias name="processor control button: led active" alias="color 62"/>
+ <ColorAlias name="processor fader: fill" alias="color 16"/>
+ <ColorAlias name="processor fader: fill active" alias="color 78"/>
+ <ColorAlias name="processor fader: led active" alias="color 52"/>
+ <ColorAlias name="processor postfader: fill" alias="color 58"/>
+ <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+ <ColorAlias name="processor postfader: led active" alias="color 52"/>
+ <ColorAlias name="processor prefader: fill" alias="color 73"/>
+ <ColorAlias name="processor prefader: fill active" alias="color 62"/>
+ <ColorAlias name="processor prefader: led active" alias="color 52"/>
+ <ColorAlias name="processor stub: fill" alias="color 46"/>
+ <ColorAlias name="processor stub: fill active" alias="color 46"/>
+ <ColorAlias name="punch button: fill" alias="color 20"/>
+ <ColorAlias name="punch button: fill active" alias="color 23"/>
+ <ColorAlias name="punch button: led active" alias="color 4"/>
+ <ColorAlias name="punch clock: background" alias="color 87"/>
+ <ColorAlias name="punch clock: cursor" alias="color 9"/>
+ <ColorAlias name="punch clock: edited text" alias="color 9"/>
+ <ColorAlias name="punch clock: text" alias="color 32"/>
+ <ColorAlias name="punch line" alias="color 83"/>
+ <ColorAlias name="range drag bar rect" alias="color 21"/>
+ <ColorAlias name="range drag rect" alias="color 56"/>
+ <ColorAlias name="range marker bar" alias="color 34"/>
+ <ColorAlias name="record enable button: fill active" alias="color 83"/>
+ <ColorAlias name="record enable button: led active" alias="color 85"/>
+ <ColorAlias name="recording rect" alias="color 86"/>
+ <ColorAlias name="recording waveform fill" alias="color 13"/>
+ <ColorAlias name="recording waveform outline" alias="color 43"/>
+ <ColorAlias name="region list automatic" alias="color 73"/>
+ <ColorAlias name="region list missing source" alias="color 9"/>
+ <ColorAlias name="region list whole file" alias="color 1"/>
+ <ColorAlias name="route button: fill active" alias="color 67"/>
+ <ColorAlias name="route button: led active" alias="color 8"/>
+ <ColorAlias name="rubber band rect" alias="color 88"/>
+ <ColorAlias name="rude audition: fill" alias="color 20"/>
+ <ColorAlias name="rude audition: fill active" alias="color 86"/>
+ <ColorAlias name="rude audition: led active" alias="color 4"/>
+ <ColorAlias name="rude isolate: fill" alias="color 42"/>
+ <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+ <ColorAlias name="rude isolate: led active" alias="color 4"/>
+ <ColorAlias name="rude solo: fill" alias="color 20"/>
+ <ColorAlias name="rude solo: fill active" alias="color 17"/>
+ <ColorAlias name="rude solo: led active" alias="color 17"/>
+ <ColorAlias name="ruler base" alias="color 74"/>
+ <ColorAlias name="ruler text" alias="color 22"/>
+ <ColorAlias name="secondary clock: background" alias="color 67"/>
+ <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+ <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+ <ColorAlias name="secondary clock: text" alias="color 32"/>
+ <ColorAlias name="secondary delta clock: background" alias="color 21"/>
+ <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+ <ColorAlias name="selected midi note frame" alias="color 63"/>
+ <ColorAlias name="selected region base" alias="color 22"/>
+ <ColorAlias name="selected time axis frame" alias="color 86"/>
+ <ColorAlias name="selected waveform fill" alias="color 21"/>
+ <ColorAlias name="selected waveform outline" alias="color 67"/>
+ <ColorAlias name="selection" alias="color 94"/>
+ <ColorAlias name="selection clock: background" alias="color 2"/>
+ <ColorAlias name="selection clock: cursor" alias="color 9"/>
+ <ColorAlias name="selection clock: edited text" alias="color 9"/>
+ <ColorAlias name="selection clock: text" alias="color 8"/>
+ <ColorAlias name="selection rect" alias="color 95"/>
+ <ColorAlias name="send alert button: fill" alias="color 71"/>
+ <ColorAlias name="send alert button: fill active" alias="color 38"/>
+ <ColorAlias name="send alert button: led active" alias="color 4"/>
+ <ColorAlias name="send bg" alias="color 38"/>
+ <ColorAlias name="shuttle" alias="color 12"/>
+ <ColorAlias name="shuttle bg" alias="color 4"/>
+ <ColorAlias name="shuttle text" alias="color 13"/>
+ <ColorAlias name="silence" alias="color 98"/>
+ <ColorAlias name="silence text" alias="color 29"/>
+ <ColorAlias name="solo button: fill active" alias="color 12"/>
+ <ColorAlias name="solo button: led active" alias="color 4"/>
+ <ColorAlias name="solo isolate: fill" alias="color 25"/>
+ <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+ <ColorAlias name="solo isolate: led active" alias="color 9"/>
+ <ColorAlias name="solo safe: fill" alias="color 25"/>
+ <ColorAlias name="solo safe: fill active" alias="color 42"/>
+ <ColorAlias name="solo safe: led active" alias="color 9"/>
+ <ColorAlias name="stereo panner bg" alias="color 67"/>
+ <ColorAlias name="stereo panner fill" alias="color 74"/>
+ <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+ <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+ <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+ <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+ <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+ <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+ <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+ <ColorAlias name="stereo panner mono text" alias="color 4"/>
+ <ColorAlias name="stereo panner outline" alias="color 70"/>
+ <ColorAlias name="stereo panner rule" alias="color 70"/>
+ <ColorAlias name="stereo panner text" alias="color 34"/>
+ <ColorAlias name="stretch clock: background" alias="color 81"/>
+ <ColorAlias name="stretch clock: cursor" alias="color 8"/>
+ <ColorAlias name="stretch clock: edited text" alias="color 8"/>
+ <ColorAlias name="stretch clock: text" alias="color 91"/>
+ <ColorAlias name="sync mark" alias="color 75"/>
+ <ColorAlias name="tempo bar" alias="color 52"/>
+ <ColorAlias name="tempo curve" alias="color 62"/>
+ <ColorAlias name="tempo marker" alias="color 19"/>
+ <ColorAlias name="tempo marker music" alias="color 5"/>
+ <ColorAlias name="time axis frame" alias="color 4"/>
+ <ColorAlias name="time axis view item base" alias="color 94"/>
+ <ColorAlias name="time stretch fill" alias="color 100"/>
+ <ColorAlias name="time stretch outline" alias="color 94"/>
+ <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+ <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+ <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+ <ColorAlias name="transport active option button: fill active" alias="color 63"/>
+ <ColorAlias name="transport active option button: led active" alias="color 8"/>
+ <ColorAlias name="transport button: fill active" alias="color 18"/>
+ <ColorAlias name="transport button: led active" alias="color 4"/>
+ <ColorAlias name="transport clock: background" alias="color 34"/>
+ <ColorAlias name="transport clock: cursor" alias="color 8"/>
+ <ColorAlias name="transport clock: edited text" alias="color 8"/>
+ <ColorAlias name="transport clock: text" alias="color 13"/>
+ <ColorAlias name="transport delta clock: background" alias="color 27"/>
+ <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="transport delta clock: text" alias="color 92"/>
+ <ColorAlias name="transport drag rect" alias="color 21"/>
+ <ColorAlias name="transport loop rect" alias="color 63"/>
+ <ColorAlias name="transport marker bar" alias="color 25"/>
+ <ColorAlias name="transport option button: fill active" alias="color 42"/>
+ <ColorAlias name="transport option button: led active" alias="color 8"/>
+ <ColorAlias name="transport punch rect" alias="color 23"/>
+ <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+ <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+ <ColorAlias name="transport recenable button: led active" alias="color 9"/>
+ <ColorAlias name="trim handle" alias="color 18"/>
+ <ColorAlias name="trim handle locked" alias="color 86"/>
+ <ColorAlias name="trim knob" alias="color 60"/>
+ <ColorAlias name="trim knob: arc end" alias="color 81"/>
+ <ColorAlias name="trim knob: arc start" alias="color 82"/>
+ <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+ <ColorAlias name="video timeline bar" alias="color 46"/>
+ <ColorAlias name="waveform fill" alias="color 13"/>
+ <ColorAlias name="waveform outline" alias="color 4"/>
+ <ColorAlias name="zero line" alias="color 104"/>
+ <ColorAlias name="zoom button: fill active" alias="color 63"/>
+ <ColorAlias name="zoom button: led active" alias="color 8"/>
+ </ColorAliases>
+ <Modifiers>
+ <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+ <Modifier name="audio track base" modifier="= alpha:0.3"/>
+ <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+ <Modifier name="covered region base" modifier="= alpha:0.7"/>
+ <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+ <Modifier name="dragging region" modifier="= alpha:0.9"/>
+ <Modifier name="editable region" modifier="= alpha:0.0752019"/>
+ <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+ <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+ <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+ <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+ <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+ <Modifier name="marker bar" modifier="= alpha:0.5"/>
+ <Modifier name="measure line beat" modifier="= alpha:1"/>
+ <Modifier name="midi frame base" modifier="= alpha:0.814846"/>
+ <Modifier name="midi note" modifier="= alpha:0.8"/>
+ <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+ <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+ <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+ <Modifier name="midi track base" modifier="= alpha:0.3"/>
+ <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+ <Modifier name="opaque region base" modifier="= alpha:0.949034"/>
+ <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+ <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+ <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+ <Modifier name="recording rect" modifier="= alpha:0.25"/>
+ <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+ <Modifier name="selection rect" modifier="= alpha:0.507192"/>
+ <Modifier name="silence" modifier="= alpha:0.4784"/>
+ <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+ <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+ <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+ <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+ <Modifier name="transparent region base" modifier="= alpha:0.99"/>
+ <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+ </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/caineville-ardour.colors b/gtk2_ardour/themes/caineville-ardour.colors
new file mode 100644
index 0000000..b80b1dc
--- /dev/null
+++ b/gtk2_ardour/themes/caineville-ardour.colors
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Caineville">
+ <Colors>
+ <Color name="color 1" value="0x20b2b2ff"/>
+ <Color name="color 10" value="0xf0f0f0ff"/>
+ <Color name="color 100" value="0xe49c9cff"/>
+ <Color name="color 101" value="0xa06000ff"/>
+ <Color name="color 103" value="0x1e7753ff"/>
+ <Color name="color 104" value="0x7f7f7fff"/>
+ <Color name="color 11" value="0x9496a3ff"/>
+ <Color name="color 12" value="0xfdc705ff"/>
+ <Color name="color 13" value="0xffffffff"/>
+ <Color name="color 14" value="0x55ccccff"/>
+ <Color name="color 15" value="0x282b49ff"/>
+ <Color name="color 16" value="0x4e8099ff"/>
+ <Color name="color 17" value="0x00ffdfff"/>
+ <Color name="color 18" value="0x001affff"/>
+ <Color name="color 19" value="0xff0000ff"/>
+ <Color name="color 2" value="0x595959ff"/>
+ <Color name="color 20" value="0x684d4dff"/>
+ <Color name="color 21" value="0x969696ff"/>
+ <Color name="color 22" value="0xe5e5e5ff"/>
+ <Color name="color 23" value="0xff0000ff"/>
+ <Color name="color 24" value="0x9fbca2ff"/>
+ <Color name="color 25" value="0x444444ff"/>
+ <Color name="color 26" value="0xc7c9d8ff"/>
+ <Color name="color 27" value="0x191919ff"/>
+ <Color name="color 28" value="0x5d3e7cff"/>
+ <Color name="color 29" value="0x202020ff"/>
+ <Color name="color 3" value="0x738299ff"/>
+ <Color name="color 30" value="0xe500cfff"/>
+ <Color name="color 31" value="0xddddd8ff"/>
+ <Color name="color 32" value="0xeddc3d77"/>
+ <Color name="color 33" value="0x9e9e9eff"/>
+ <Color name="color 34" value="0x8d8d8dff"/>
+ <Color name="color 35" value="0x4250d0ff"/>
+ <Color name="color 36" value="0x7f7a73ff"/>
+ <Color name="color 37" value="0x00fff6ff"/>
+ <Color name="color 38" value="0x1ee8acff"/>
+ <Color name="color 39" value="0xcececeff"/>
+ <Color name="color 4" value="0x000000ff"/>
+ <Color name="color 40" value="0xb5b2b1ff"/>
+ <Color name="color 41" value="0x497a5dff"/>
+ <Color name="color 42" value="0x404145ff"/>
+ <Color name="color 43" value="0x000424ff"/>
+ <Color name="color 44" value="0x004f3cff"/>
+ <Color name="color 45" value="0xa29e9eff"/>
+ <Color name="color 46" value="0x8d8d8dff"/>
+ <Color name="color 47" value="0x008852ff"/>
+ <Color name="color 48" value="0xddddddff"/>
+ <Color name="color 49" value="0xdbd4d4ff"/>
+ <Color name="color 5" value="0x9dadc4ff"/>
+ <Color name="color 50" value="0xeeeeecff"/>
+ <Color name="color 51" value="0x383d37ff"/>
+ <Color name="color 52" value="0xbba34cff"/>
+ <Color name="color 53" value="0xf2c37dff"/>
+ <Color name="color 54" value="0xf48352ff"/>
+ <Color name="color 55" value="0xf85813ff"/>
+ <Color name="color 56" value="0x8ec794ff"/>
+ <Color name="color 57" value="0x7ea854ff"/>
+ <Color name="color 58" value="0x696e64ff"/>
+ <Color name="color 59" value="0xb2baffff"/>
+ <Color name="color 6" value="0xe11111ff"/>
+ <Color name="color 60" value="0x50545aff"/>
+ <Color name="color 61" value="0x383333ff"/>
+ <Color name="color 62" value="0xffa500ff"/>
+ <Color name="color 63" value="0xfdc705ff"/>
+ <Color name="color 64" value="0xa7acd4ff"/>
+ <Color name="color 65" value="0xb8cca3ff"/>
+ <Color name="color 66" value="0x4f2f00ff"/>
+ <Color name="color 67" value="0x121212ff"/>
+ <Color name="color 68" value="0xc57805ff"/>
+ <Color name="color 69" value="0x030207ff"/>
+ <Color name="color 7" value="0x515151ff"/>
+ <Color name="color 70" value="0x304057ff"/>
+ <Color name="color 71" value="0x5f5a58ff"/>
+ <Color name="color 72" value="0xe58b05ff"/>
+ <Color name="color 73" value="0x3240c0ff"/>
+ <Color name="color 74" value="0xff4c15ff"/>
+ <Color name="color 75" value="0xe6bb3bff"/>
+ <Color name="color 76" value="0x6c6e6aff"/>
+ <Color name="color 77" value="0x7aadf9ff"/>
+ <Color name="color 78" value="0x2e769cff"/>
+ <Color name="color 79" value="0x6b806dff"/>
+ <Color name="color 8" value="0xe70b18ff"/>
+ <Color name="color 80" value="0x704d4dff"/>
+ <Color name="color 81" value="0xa5a5a5ff"/>
+ <Color name="color 82" value="0x0f4ab8ff"/>
+ <Color name="color 83" value="0xa80000ff"/>
+ <Color name="color 84" value="0x7b354aff"/>
+ <Color name="color 85" value="0xffa3bfff"/>
+ <Color name="color 86" value="0xcc2828ff"/>
+ <Color name="color 87" value="0x505050ff"/>
+ <Color name="color 88" value="0xc6c6c6ff"/>
+ <Color name="color 89" value="0xb6e8fdff"/>
+ <Color name="color 9" value="0xff6100ff"/>
+ <Color name="color 90" value="0x2c2121ff"/>
+ <Color name="color 91" value="0xf36363ff"/>
+ <Color name="color 92" value="0x8cd8f8ff"/>
+ <Color name="color 93" value="0x51578aff"/>
+ <Color name="color 94" value="0x636363ff"/>
+ <Color name="color 95" value="0xe4f4d3ff"/>
+ <Color name="color 96" value="0x24e59cff"/>
+ <Color name="color 97" value="0xccccccff"/>
+ <Color name="color 98" value="0x9e00ffff"/>
+ <Color name="color 99" value="0x8d8d8dff"/>
+ <Color name="meter color0" value="0x05ff6bff"/>
+ <Color name="meter color1" value="0x39ff00ff"/>
+ <Color name="meter color2" value="0x29ff17ff"/>
+ <Color name="meter color3" value="0xb2ff52ff"/>
+ <Color name="meter color4" value="0xe3ff00ff"/>
+ <Color name="meter color5" value="0xfff000ff"/>
+ <Color name="meter color6" value="0xff8800ff"/>
+ <Color name="meter color7" value="0xff8800ff"/>
+ <Color name="meter color8" value="0xff0000ff"/>
+ <Color name="meter color9" value="0xff0000ff"/>
+ </Colors>
+ <ColorAliases>
+ <ColorAlias name="active crossfade" alias="color 1"/>
+ <ColorAlias name="arrange base" alias="color 34"/>
+ <ColorAlias name="audio automation track fill" alias="color 70"/>
+ <ColorAlias name="audio bus base" alias="color 3"/>
+ <ColorAlias name="audio master bus base" alias="color 4"/>
+ <ColorAlias name="audio track base" alias="color 77"/>
+ <ColorAlias name="automation line" alias="color 23"/>
+ <ColorAlias name="automation track outline" alias="color 7"/>
+ <ColorAlias name="big clock active: background" alias="color 4"/>
+ <ColorAlias name="big clock active: cursor" alias="color 8"/>
+ <ColorAlias name="big clock active: edited text" alias="color 8"/>
+ <ColorAlias name="big clock active: text" alias="color 9"/>
+ <ColorAlias name="big clock: background" alias="color 67"/>
+ <ColorAlias name="big clock: cursor" alias="color 8"/>
+ <ColorAlias name="big clock: edited text" alias="color 8"/>
+ <ColorAlias name="big clock: text" alias="color 10"/>
+ <ColorAlias name="border color" alias="color 4"/>
+ <ColorAlias name="cd marker bar" alias="color 87"/>
+ <ColorAlias name="clipped waveform" alias="color 9"/>
+ <ColorAlias name="clock: background" alias="color 67"/>
+ <ColorAlias name="clock: cursor" alias="color 8"/>
+ <ColorAlias name="clock: edited text" alias="color 8"/>
+ <ColorAlias name="clock: text" alias="color 12"/>
+ <ColorAlias name="comment button: fill" alias="color 20"/>
+ <ColorAlias name="control point fill" alias="color 97"/>
+ <ColorAlias name="control point outline" alias="meter color8"/>
+ <ColorAlias name="control point selected fill" alias="color 13"/>
+ <ColorAlias name="control point selected outline" alias="color 91"/>
+ <ColorAlias name="covered region" alias="color 87"/>
+ <ColorAlias name="crossfade editor base" alias="color 15"/>
+ <ColorAlias name="crossfade editor line" alias="color 4"/>
+ <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+ <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+ <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+ <ColorAlias name="crossfade editor wave" alias="color 13"/>
+ <ColorAlias name="crossfade line" alias="color 4"/>
+ <ColorAlias name="edit point" alias="color 18"/>
+ <ColorAlias name="entered automation line" alias="color 19"/>
+ <ColorAlias name="entered gain line" alias="color 19"/>
+ <ColorAlias name="entered marker" alias="color 19"/>
+ <ColorAlias name="feedback alert: fill" alias="color 63"/>
+ <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+ <ColorAlias name="feedback alert: led active" alias="color 4"/>
+ <ColorAlias name="frame handle" alias="color 23"/>
+ <ColorAlias name="gain line" alias="color 6"/>
+ <ColorAlias name="gain line inactive" alias="color 24"/>
+ <ColorAlias name="generic button: fill" alias="color 33"/>
+ <ColorAlias name="generic button: fill active" alias="color 9"/>
+ <ColorAlias name="generic button: led active" alias="color 18"/>
+ <ColorAlias name="ghost track base" alias="color 46"/>
+ <ColorAlias name="ghost track midi outline" alias="color 4"/>
+ <ColorAlias name="ghost track wave" alias="color 29"/>
+ <ColorAlias name="ghost track wave clip" alias="color 29"/>
+ <ColorAlias name="ghost track wave fill" alias="color 29"/>
+ <ColorAlias name="ghost track zero line" alias="color 30"/>
+ <ColorAlias name="gtk_arm" alias="color 9"/>
+ <ColorAlias name="gtk_audio_bus" alias="color 42"/>
+ <ColorAlias name="gtk_audio_track" alias="color 46"/>
+ <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
+ <ColorAlias name="gtk_background" alias="color 7"/>
+ <ColorAlias name="gtk_bases" alias="color 7"/>
+ <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+ <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+ <ColorAlias name="gtk_bright_color" alias="color 74"/>
+ <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+ <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+ <ColorAlias name="gtk_control_master" alias="color 64"/>
+ <ColorAlias name="gtk_control_text" alias="color 26"/>
+ <ColorAlias name="gtk_control_text2" alias="color 83"/>
+ <ColorAlias name="gtk_darkest" alias="color 67"/>
+ <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+ <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+ <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+ <ColorAlias name="gtk_foreground" alias="color 50"/>
+ <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+ <ColorAlias name="gtk_lightest" alias="color 13"/>
+ <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+ <ColorAlias name="gtk_midi_track" alias="color 46"/>
+ <ColorAlias name="gtk_monitor" alias="color 8"/>
+ <ColorAlias name="gtk_mono" alias="color 95"/>
+ <ColorAlias name="gtk_mute" alias="color 52"/>
+ <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+ <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+ <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+ <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+ <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+ <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+ <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+ <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+ <ColorAlias name="gtk_send_bg" alias="color 38"/>
+ <ColorAlias name="gtk_send_fg" alias="color 24"/>
+ <ColorAlias name="gtk_solo" alias="color 91"/>
+ <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+ <ColorAlias name="gtk_texts" alias="color 4"/>
+ <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+ <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+ <ColorAlias name="image track" alias="color 31"/>
+ <ColorAlias name="inactive crossfade" alias="color 32"/>
+ <ColorAlias name="inactive fade handle" alias="color 33"/>
+ <ColorAlias name="inactive group tab" alias="color 34"/>
+ <ColorAlias name="invert button: fill active" alias="color 35"/>
+ <ColorAlias name="invert button: led active" alias="color 37"/>
+ <ColorAlias name="location cd marker" alias="color 38"/>
+ <ColorAlias name="location loop" alias="color 39"/>
+ <ColorAlias name="location marker" alias="color 32"/>
+ <ColorAlias name="location punch" alias="color 40"/>
+ <ColorAlias name="location range" alias="color 41"/>
+ <ColorAlias name="lock button: fill active" alias="color 42"/>
+ <ColorAlias name="lock button: led active" alias="color 4"/>
+ <ColorAlias name="marker bar" alias="color 2"/>
+ <ColorAlias name="marker bar separator" alias="color 27"/>
+ <ColorAlias name="marker drag line" alias="color 44"/>
+ <ColorAlias name="marker label" alias="color 4"/>
+ <ColorAlias name="marker track" alias="color 31"/>
+ <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+ <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+ <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+ <ColorAlias name="measure line bar" alias="color 4"/>
+ <ColorAlias name="measure line beat" alias="color 94"/>
+ <ColorAlias name="meter background bottom" alias="color 4"/>
+ <ColorAlias name="meter background top" alias="color 4"/>
+ <ColorAlias name="meter bar" alias="color 7"/>
+ <ColorAlias name="meter color BBC" alias="color 8"/>
+ <ColorAlias name="meter marker" alias="color 19"/>
+ <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+ <ColorAlias name="meterbridge label: led" alias="color 9"/>
+ <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+ <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+ <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+ <ColorAlias name="midi automation track fill" alias="color 58"/>
+ <ColorAlias name="midi bus base" alias="color 4"/>
+ <ColorAlias name="midi device: fill" alias="color 25"/>
+ <ColorAlias name="midi device: fill active" alias="color 42"/>
+ <ColorAlias name="midi device: led active" alias="color 17"/>
+ <ColorAlias name="midi frame base" alias="color 87"/>
+ <ColorAlias name="midi input button: fill active" alias="color 48"/>
+ <ColorAlias name="midi input button: led active" alias="color 4"/>
+ <ColorAlias name="midi meter color0" alias="color 52"/>
+ <ColorAlias name="midi meter color1" alias="color 53"/>
+ <ColorAlias name="midi meter color2" alias="color 53"/>
+ <ColorAlias name="midi meter color3" alias="color 54"/>
+ <ColorAlias name="midi meter color4" alias="color 54"/>
+ <ColorAlias name="midi meter color5" alias="color 55"/>
+ <ColorAlias name="midi meter color6" alias="color 55"/>
+ <ColorAlias name="midi meter color7" alias="color 56"/>
+ <ColorAlias name="midi meter color8" alias="color 56"/>
+ <ColorAlias name="midi meter color9" alias="meter color3"/>
+ <ColorAlias name="midi note inactive channel" alias="color 4"/>
+ <ColorAlias name="midi note max" alias="color 8"/>
+ <ColorAlias name="midi note mid" alias="color 91"/>
+ <ColorAlias name="midi note min" alias="color 49"/>
+ <ColorAlias name="midi note selected" alias="color 80"/>
+ <ColorAlias name="midi note selected outline" alias="color 67"/>
+ <ColorAlias name="midi note velocity text" alias="color 32"/>
+ <ColorAlias name="midi patch change fill" alias="color 60"/>
+ <ColorAlias name="midi patch change outline" alias="color 26"/>
+ <ColorAlias name="midi select rect outline" alias="color 63"/>
+ <ColorAlias name="midi sysex fill" alias="color 32"/>
+ <ColorAlias name="midi sysex outline" alias="color 64"/>
+ <ColorAlias name="midi track base" alias="color 39"/>
+ <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+ <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+ <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+ <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+ <ColorAlias name="monitor button: fill active" alias="color 68"/>
+ <ColorAlias name="monitor button: led active" alias="color 9"/>
+ <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+ <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+ <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+ <ColorAlias name="monitor section knob" alias="color 60"/>
+ <ColorAlias name="monitor section knob: arc end" alias="color 9"/>
+ <ColorAlias name="monitor section knob: arc start" alias="meter color6"/>
+ <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+ <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+ <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+ <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+ <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+ <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+ <ColorAlias name="mono panner bg" alias="color 67"/>
+ <ColorAlias name="mono panner fill" alias="color 74"/>
+ <ColorAlias name="mono panner outline" alias="color 70"/>
+ <ColorAlias name="mono panner position fill" alias="color 11"/>
+ <ColorAlias name="mono panner position outline" alias="color 70"/>
+ <ColorAlias name="mono panner text" alias="color 4"/>
+ <ColorAlias name="mouse mode button: fill active" alias="color 12"/>
+ <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+ <ColorAlias name="mute button: fill active" alias="color 75"/>
+ <ColorAlias name="mute button: led active" alias="color 4"/>
+ <ColorAlias name="name highlight fill" alias="color 18"/>
+ <ColorAlias name="name highlight outline" alias="color 23"/>
+ <ColorAlias name="nudge button: fill" alias="color 63"/>
+ <ColorAlias name="nudge button: fill active" alias="color 42"/>
+ <ColorAlias name="nudge button: led active" alias="color 8"/>
+ <ColorAlias name="nudge clock: background" alias="color 67"/>
+ <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+ <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+ <ColorAlias name="nudge clock: text" alias="color 12"/>
+ <ColorAlias name="piano roll black" alias="color 76"/>
+ <ColorAlias name="piano roll black outline" alias="color 33"/>
+ <ColorAlias name="piano roll white" alias="color 45"/>
+ <ColorAlias name="play head" alias="color 9"/>
+ <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+ <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+ <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+ <ColorAlias name="processor automation line" alias="color 77"/>
+ <ColorAlias name="processor control button: fill" alias="color 29"/>
+ <ColorAlias name="processor control button: fill active" alias="color 46"/>
+ <ColorAlias name="processor control button: led active" alias="color 62"/>
+ <ColorAlias name="processor fader: fill" alias="color 87"/>
+ <ColorAlias name="processor fader: fill active" alias="color 21"/>
+ <ColorAlias name="processor fader: led active" alias="color 9"/>
+ <ColorAlias name="processor postfader: fill" alias="color 58"/>
+ <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+ <ColorAlias name="processor postfader: led active" alias="color 9"/>
+ <ColorAlias name="processor prefader: fill" alias="color 40"/>
+ <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+ <ColorAlias name="processor prefader: led active" alias="color 9"/>
+ <ColorAlias name="processor stub: fill" alias="color 46"/>
+ <ColorAlias name="processor stub: fill active" alias="color 46"/>
+ <ColorAlias name="punch button: fill" alias="color 63"/>
+ <ColorAlias name="punch button: fill active" alias="color 9"/>
+ <ColorAlias name="punch button: led active" alias="color 4"/>
+ <ColorAlias name="punch clock: background" alias="color 67"/>
+ <ColorAlias name="punch clock: cursor" alias="color 9"/>
+ <ColorAlias name="punch clock: edited text" alias="color 9"/>
+ <ColorAlias name="punch clock: text" alias="color 12"/>
+ <ColorAlias name="punch line" alias="color 83"/>
+ <ColorAlias name="range drag bar rect" alias="color 21"/>
+ <ColorAlias name="range drag rect" alias="color 56"/>
+ <ColorAlias name="range marker bar" alias="color 34"/>
+ <ColorAlias name="record enable button: fill active" alias="color 83"/>
+ <ColorAlias name="record enable button: led active" alias="color 85"/>
+ <ColorAlias name="recording rect" alias="color 86"/>
+ <ColorAlias name="recording waveform fill" alias="color 13"/>
+ <ColorAlias name="recording waveform outline" alias="color 43"/>
+ <ColorAlias name="region list automatic" alias="color 53"/>
+ <ColorAlias name="region list missing source" alias="color 9"/>
+ <ColorAlias name="region list whole file" alias="color 1"/>
+ <ColorAlias name="route button: fill active" alias="color 67"/>
+ <ColorAlias name="route button: led active" alias="color 8"/>
+ <ColorAlias name="rubber band rect" alias="color 88"/>
+ <ColorAlias name="rude audition: fill" alias="color 63"/>
+ <ColorAlias name="rude audition: fill active" alias="color 86"/>
+ <ColorAlias name="rude audition: led active" alias="color 4"/>
+ <ColorAlias name="rude isolate: fill" alias="color 42"/>
+ <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+ <ColorAlias name="rude isolate: led active" alias="color 4"/>
+ <ColorAlias name="rude solo: fill" alias="color 63"/>
+ <ColorAlias name="rude solo: fill active" alias="color 82"/>
+ <ColorAlias name="rude solo: led active" alias="color 4"/>
+ <ColorAlias name="ruler base" alias="color 25"/>
+ <ColorAlias name="ruler text" alias="color 4"/>
+ <ColorAlias name="secondary clock: background" alias="color 67"/>
+ <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+ <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+ <ColorAlias name="secondary clock: text" alias="color 88"/>
+ <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+ <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+ <ColorAlias name="selected midi note frame" alias="color 4"/>
+ <ColorAlias name="selected region base" alias="meter color5"/>
+ <ColorAlias name="selected time axis frame" alias="color 86"/>
+ <ColorAlias name="selected waveform fill" alias="color 94"/>
+ <ColorAlias name="selected waveform outline" alias="color 67"/>
+ <ColorAlias name="selection" alias="color 13"/>
+ <ColorAlias name="selection clock: background" alias="color 67"/>
+ <ColorAlias name="selection clock: cursor" alias="color 9"/>
+ <ColorAlias name="selection clock: edited text" alias="color 9"/>
+ <ColorAlias name="selection clock: text" alias="color 12"/>
+ <ColorAlias name="selection rect" alias="color 37"/>
+ <ColorAlias name="send alert button: fill" alias="color 71"/>
+ <ColorAlias name="send alert button: fill active" alias="color 38"/>
+ <ColorAlias name="send alert button: led active" alias="color 4"/>
+ <ColorAlias name="send bg" alias="color 38"/>
+ <ColorAlias name="shuttle" alias="color 12"/>
+ <ColorAlias name="shuttle bg" alias="color 4"/>
+ <ColorAlias name="shuttle text" alias="color 13"/>
+ <ColorAlias name="silence" alias="color 98"/>
+ <ColorAlias name="silence text" alias="color 10"/>
+ <ColorAlias name="solo button: fill active" alias="color 82"/>
+ <ColorAlias name="solo button: led active" alias="color 4"/>
+ <ColorAlias name="solo isolate: fill" alias="color 25"/>
+ <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+ <ColorAlias name="solo isolate: led active" alias="color 9"/>
+ <ColorAlias name="solo safe: fill" alias="color 25"/>
+ <ColorAlias name="solo safe: fill active" alias="color 42"/>
+ <ColorAlias name="solo safe: led active" alias="color 9"/>
+ <ColorAlias name="stereo panner bg" alias="color 67"/>
+ <ColorAlias name="stereo panner fill" alias="color 74"/>
+ <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+ <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+ <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+ <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+ <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+ <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+ <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+ <ColorAlias name="stereo panner mono text" alias="color 4"/>
+ <ColorAlias name="stereo panner outline" alias="color 70"/>
+ <ColorAlias name="stereo panner rule" alias="color 70"/>
+ <ColorAlias name="stereo panner text" alias="color 4"/>
+ <ColorAlias name="sync mark" alias="color 75"/>
+ <ColorAlias name="tempo bar" alias="color 46"/>
+ <ColorAlias name="tempo curve" alias="color 62"/>
+ <ColorAlias name="tempo marker" alias="color 19"/>
+ <ColorAlias name="tempo marker music" alias="color 5"/>
+ <ColorAlias name="time axis frame" alias="color 4"/>
+ <ColorAlias name="time axis view item base" alias="color 94"/>
+ <ColorAlias name="time stretch fill" alias="color 100"/>
+ <ColorAlias name="time stretch outline" alias="color 94"/>
+ <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+ <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+ <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+ <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+ <ColorAlias name="transport active option button: led active" alias="color 8"/>
+ <ColorAlias name="transport button: fill active" alias="color 12"/>
+ <ColorAlias name="transport button: led active" alias="color 4"/>
+ <ColorAlias name="transport clock: background" alias="color 67"/>
+ <ColorAlias name="transport clock: cursor" alias="color 8"/>
+ <ColorAlias name="transport clock: edited text" alias="color 8"/>
+ <ColorAlias name="transport clock: text" alias="color 9"/>
+ <ColorAlias name="transport delta clock: background" alias="color 67"/>
+ <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="transport delta clock: text" alias="color 92"/>
+ <ColorAlias name="transport drag rect" alias="color 21"/>
+ <ColorAlias name="transport loop rect" alias="color 48"/>
+ <ColorAlias name="transport marker bar" alias="color 25"/>
+ <ColorAlias name="transport option button: fill active" alias="color 42"/>
+ <ColorAlias name="transport option button: led active" alias="color 8"/>
+ <ColorAlias name="transport punch rect" alias="color 62"/>
+ <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+ <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+ <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+ <ColorAlias name="trim handle" alias="color 18"/>
+ <ColorAlias name="trim handle locked" alias="color 86"/>
+ <ColorAlias name="trim knob" alias="color 60"/>
+ <ColorAlias name="trim knob: arc end" alias="meter color6"/>
+ <ColorAlias name="trim knob: arc start" alias="color 9"/>
+ <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+ <ColorAlias name="video timeline bar" alias="color 46"/>
+ <ColorAlias name="waveform fill" alias="color 13"/>
+ <ColorAlias name="waveform outline" alias="color 4"/>
+ <ColorAlias name="zero line" alias="color 104"/>
+ <ColorAlias name="zoom button: fill active" alias="color 48"/>
+ <ColorAlias name="zoom button: led active" alias="color 8"/>
+ </ColorAliases>
+ <Modifiers>
+ <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+ <Modifier name="audio track base" modifier="= alpha:0.32"/>
+ <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+ <Modifier name="covered region base" modifier="= alpha:0.680625"/>
+ <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+ <Modifier name="dragging region" modifier="= alpha:0.92"/>
+ <Modifier name="editable region" modifier="= alpha:0"/>
+ <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+ <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+ <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+ <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+ <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+ <Modifier name="marker bar" modifier="= alpha:0.5"/>
+ <Modifier name="measure line beat" modifier="= alpha:1"/>
+ <Modifier name="midi frame base" modifier="= alpha:0.720606"/>
+ <Modifier name="midi note" modifier="= alpha:0.8"/>
+ <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+ <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+ <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+ <Modifier name="midi track base" modifier="= alpha:0.3"/>
+ <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+ <Modifier name="opaque region base" modifier="= alpha:0.75"/>
+ <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+ <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+ <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+ <Modifier name="recording rect" modifier="= alpha:0.275106"/>
+ <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+ <Modifier name="selection rect" modifier="= alpha:0.791048"/>
+ <Modifier name="silence" modifier="= alpha:0.4784"/>
+ <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+ <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+ <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+ <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+ <Modifier name="transparent region base" modifier="= alpha:0.693"/>
+ <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+ </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/clear-gray-ardour.colors b/gtk2_ardour/themes/clear-gray-ardour.colors
new file mode 100644
index 0000000..ad9f3f6
--- /dev/null
+++ b/gtk2_ardour/themes/clear-gray-ardour.colors
@@ -0,0 +1,514 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Clear Gray">
+ <Colors>
+ <Color name="color 1" value="0x20b2b2ff"/>
+ <Color name="color 10" value="0xf0f0f0ff"/>
+ <Color name="color 100" value="0xe49c9cff"/>
+ <Color name="color 101" value="0xa06000ff"/>
+ <Color name="color 103" value="0x1e7753ff"/>
+ <Color name="color 104" value="0x7f7f7fff"/>
+ <Color name="color 11" value="0x9496a3ff"/>
+ <Color name="color 12" value="0xfdc705ff"/>
+ <Color name="color 13" value="0xffffffff"/>
+ <Color name="color 14" value="0x55ccccff"/>
+ <Color name="color 15" value="0x282b49ff"/>
+ <Color name="color 16" value="0x4e8099ff"/>
+ <Color name="color 17" value="0x00ffdfff"/>
+ <Color name="color 18" value="0x001affff"/>
+ <Color name="color 19" value="0xff0000ff"/>
+ <Color name="color 2" value="0x595959ff"/>
+ <Color name="color 20" value="0x684d4dff"/>
+ <Color name="color 21" value="0x969696ff"/>
+ <Color name="color 22" value="0xe5e5e5ff"/>
+ <Color name="color 23" value="0xff0000ff"/>
+ <Color name="color 24" value="0x9fbca2ff"/>
+ <Color name="color 25" value="0x333333ff"/>
+ <Color name="color 26" value="0xc7c9d8ff"/>
+ <Color name="color 27" value="0x191919ff"/>
+ <Color name="color 28" value="0x5d3e7cff"/>
+ <Color name="color 29" value="0x202020ff"/>
+ <Color name="color 3" value="0x738299ff"/>
+ <Color name="color 30" value="0xe500cfff"/>
+ <Color name="color 31" value="0xddddd8ff"/>
+ <Color name="color 32" value="0xeddc3d77"/>
+ <Color name="color 33" value="0x9e9e9eff"/>
+ <Color name="color 34" value="0x8d8d8dff"/>
+ <Color name="color 35" value="0x4250d0ff"/>
+ <Color name="color 36" value="0x7f7a73ff"/>
+ <Color name="color 37" value="0x00fff6ff"/>
+ <Color name="color 38" value="0x1ee8acff"/>
+ <Color name="color 39" value="0xcececeff"/>
+ <Color name="color 4" value="0x000000ff"/>
+ <Color name="color 40" value="0xb5b2b1ff"/>
+ <Color name="color 41" value="0x497a5dff"/>
+ <Color name="color 42" value="0x404145ff"/>
+ <Color name="color 43" value="0x000424ff"/>
+ <Color name="color 44" value="0x004f3cff"/>
+ <Color name="color 45" value="0xa29e9eff"/>
+ <Color name="color 46" value="0x8d8d8dff"/>
+ <Color name="color 47" value="0x008852ff"/>
+ <Color name="color 48" value="0xddddddff"/>
+ <Color name="color 49" value="0xdbd4d4ff"/>
+ <Color name="color 5" value="0x9dadc4ff"/>
+ <Color name="color 50" value="0xeeeeecff"/>
+ <Color name="color 51" value="0x383d37ff"/>
+ <Color name="color 52" value="0xbba34cff"/>
+ <Color name="color 53" value="0xf2c37dff"/>
+ <Color name="color 54" value="0xf48352ff"/>
+ <Color name="color 55" value="0xf82613ff"/>
+ <Color name="color 56" value="0x8ec794ff"/>
+ <Color name="color 57" value="0x7ea854ff"/>
+ <Color name="color 58" value="0x696e64ff"/>
+ <Color name="color 59" value="0xb2baffff"/>
+ <Color name="color 6" value="0xe11111ff"/>
+ <Color name="color 60" value="0x50545aff"/>
+ <Color name="color 61" value="0x383333ff"/>
+ <Color name="color 62" value="0xffa500ff"/>
+ <Color name="color 63" value="0xfdc705ff"/>
+ <Color name="color 64" value="0xa7acd4ff"/>
+ <Color name="color 65" value="0xb8cca3ff"/>
+ <Color name="color 66" value="0x4f2f00ff"/>
+ <Color name="color 67" value="0x121212ff"/>
+ <Color name="color 68" value="0xc57805ff"/>
+ <Color name="color 69" value="0x030207ff"/>
+ <Color name="color 7" value="0x515151ff"/>
+ <Color name="color 70" value="0x304057ff"/>
+ <Color name="color 71" value="0x5f5a58ff"/>
+ <Color name="color 72" value="0xe58b05ff"/>
+ <Color name="color 73" value="0x3240c0ff"/>
+ <Color name="color 74" value="0xffffffff"/>
+ <Color name="color 75" value="0xe6bb3bff"/>
+ <Color name="color 76" value="0x6c6e6aff"/>
+ <Color name="color 77" value="0x7aadf9ff"/>
+ <Color name="color 78" value="0x2e769cff"/>
+ <Color name="color 79" value="0x6b806dff"/>
+ <Color name="color 8" value="0xe70b18ff"/>
+ <Color name="color 80" value="0x704d4dff"/>
+ <Color name="color 81" value="0xa5a5a5ff"/>
+ <Color name="color 82" value="0x0f4ab8ff"/>
+ <Color name="color 83" value="0xa80000ff"/>
+ <Color name="color 84" value="0x7b354aff"/>
+ <Color name="color 85" value="0xffa3bfff"/>
+ <Color name="color 86" value="0xcc2828ff"/>
+ <Color name="color 87" value="0x505050ff"/>
+ <Color name="color 88" value="0xc6c6c6ff"/>
+ <Color name="color 89" value="0xb6e8fdff"/>
+ <Color name="color 9" value="0xff2900ff"/>
+ <Color name="color 90" value="0x2c2121ff"/>
+ <Color name="color 91" value="0xf36363ff"/>
+ <Color name="color 92" value="0x8cd8f8ff"/>
+ <Color name="color 93" value="0x51578aff"/>
+ <Color name="color 94" value="0x636363ff"/>
+ <Color name="color 95" value="0xe4f4d3ff"/>
+ <Color name="color 96" value="0x24e59cff"/>
+ <Color name="color 97" value="0xccccccff"/>
+ <Color name="color 98" value="0x9e00ffff"/>
+ <Color name="color 99" value="0x8d8d8dff"/>
+ <Color name="meter color0" value="0x05ff6bff"/>
+ <Color name="meter color1" value="0x39ff00ff"/>
+ <Color name="meter color2" value="0x29ff17ff"/>
+ <Color name="meter color3" value="0xb2ff52ff"/>
+ <Color name="meter color4" value="0xe3ff00ff"/>
+ <Color name="meter color5" value="0xfff000ff"/>
+ <Color name="meter color6" value="0xff8800ff"/>
+ <Color name="meter color7" value="0xff8800ff"/>
+ <Color name="meter color8" value="0xff0000ff"/>
+ <Color name="meter color9" value="0xff0000ff"/>
+ </Colors>
+ <ColorAliases>
+ <ColorAlias name="active crossfade" alias="color 1"/>
+ <ColorAlias name="arrange base" alias="color 74"/>
+ <ColorAlias name="audio automation track fill" alias="color 97"/>
+ <ColorAlias name="audio bus base" alias="color 104"/>
+ <ColorAlias name="audio master bus base" alias="color 4"/>
+ <ColorAlias name="audio track base" alias="color 10"/>
+ <ColorAlias name="automation line" alias="color 67"/>
+ <ColorAlias name="automation track outline" alias="color 7"/>
+ <ColorAlias name="big clock active: background" alias="color 4"/>
+ <ColorAlias name="big clock active: cursor" alias="color 8"/>
+ <ColorAlias name="big clock active: edited text" alias="color 8"/>
+ <ColorAlias name="big clock active: text" alias="color 13"/>
+ <ColorAlias name="big clock: background" alias="color 67"/>
+ <ColorAlias name="big clock: cursor" alias="color 8"/>
+ <ColorAlias name="big clock: edited text" alias="color 8"/>
+ <ColorAlias name="big clock: text" alias="color 10"/>
+ <ColorAlias name="border color" alias="color 4"/>
+ <ColorAlias name="cd marker bar" alias="color 87"/>
+ <ColorAlias name="clipped waveform" alias="color 19"/>
+ <ColorAlias name="clock: background" alias="color 67"/>
+ <ColorAlias name="clock: cursor" alias="color 8"/>
+ <ColorAlias name="clock: edited text" alias="color 8"/>
+ <ColorAlias name="clock: text" alias="color 13"/>
+ <ColorAlias name="control point fill" alias="color 97"/>
+ <ColorAlias name="control point outline" alias="color 27"/>
+ <ColorAlias name="control point selected fill" alias="color 13"/>
+ <ColorAlias name="control point selected outline" alias="color 23"/>
+ <ColorAlias name="covered region" alias="color 87"/>
+ <ColorAlias name="crossfade editor base" alias="color 15"/>
+ <ColorAlias name="crossfade editor line" alias="color 4"/>
+ <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+ <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+ <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+ <ColorAlias name="crossfade editor wave" alias="color 13"/>
+ <ColorAlias name="crossfade line" alias="color 4"/>
+ <ColorAlias name="edit point" alias="color 18"/>
+ <ColorAlias name="entered automation line" alias="color 13"/>
+ <ColorAlias name="entered gain line" alias="color 13"/>
+ <ColorAlias name="entered marker" alias="color 19"/>
+ <ColorAlias name="feedback alert: fill" alias="color 10"/>
+ <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+ <ColorAlias name="feedback alert: led active" alias="color 4"/>
+ <ColorAlias name="frame handle" alias="color 13"/>
+ <ColorAlias name="gain line" alias="color 6"/>
+ <ColorAlias name="gain line inactive" alias="color 24"/>
+ <ColorAlias name="generic button: fill" alias="color 33"/>
+ <ColorAlias name="generic button: fill active" alias="color 9"/>
+ <ColorAlias name="generic button: led active" alias="color 18"/>
+ <ColorAlias name="ghost track base" alias="color 46"/>
+ <ColorAlias name="ghost track midi outline" alias="color 4"/>
+ <ColorAlias name="ghost track wave" alias="color 29"/>
+ <ColorAlias name="ghost track wave clip" alias="color 29"/>
+ <ColorAlias name="ghost track wave fill" alias="color 29"/>
+ <ColorAlias name="ghost track zero line" alias="color 30"/>
+ <ColorAlias name="gtk_arm" alias="color 13"/>
+ <ColorAlias name="gtk_audio_bus" alias="color 29"/>
+ <ColorAlias name="gtk_audio_track" alias="color 25"/>
+ <ColorAlias name="gtk_automation_track_header" alias="color 48"/>
+ <ColorAlias name="gtk_background" alias="color 87"/>
+ <ColorAlias name="gtk_bases" alias="color 22"/>
+ <ColorAlias name="gtk_bg_selected" alias="color 81"/>
+ <ColorAlias name="gtk_bg_tooltip" alias="color 74"/>
+ <ColorAlias name="gtk_bright_color" alias="color 74"/>
+ <ColorAlias name="gtk_bright_indicator" alias="meter color8"/>
+ <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+ <ColorAlias name="gtk_control_base" alias="color 13"/>
+ <ColorAlias name="gtk_control_master" alias="color 64"/>
+ <ColorAlias name="gtk_control_text" alias="color 26"/>
+ <ColorAlias name="gtk_control_text2" alias="color 83"/>
+ <ColorAlias name="gtk_darkest" alias="color 67"/>
+ <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+ <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+ <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+ <ColorAlias name="gtk_foreground" alias="color 13"/>
+ <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+ <ColorAlias name="gtk_lightest" alias="color 13"/>
+ <ColorAlias name="gtk_midi_channel_selector" alias="color 13"/>
+ <ColorAlias name="gtk_midi_track" alias="color 21"/>
+ <ColorAlias name="gtk_monitor" alias="color 50"/>
+ <ColorAlias name="gtk_mono" alias="color 95"/>
+ <ColorAlias name="gtk_mute" alias="meter color4"/>
+ <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+ <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+ <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+ <ColorAlias name="gtk_processor_frame_selected" alias="color 13"/>
+ <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+ <ColorAlias name="gtk_processor_postfader_frame" alias="color 50"/>
+ <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+ <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+ <ColorAlias name="gtk_send_bg" alias="color 38"/>
+ <ColorAlias name="gtk_send_fg" alias="color 24"/>
+ <ColorAlias name="gtk_solo" alias="color 91"/>
+ <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+ <ColorAlias name="gtk_texts" alias="color 4"/>
+ <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+ <ColorAlias name="gtk_track_header_selected" alias="color 22"/>
+ <ColorAlias name="image track" alias="color 31"/>
+ <ColorAlias name="inactive crossfade" alias="color 32"/>
+ <ColorAlias name="inactive fade handle" alias="color 33"/>
+ <ColorAlias name="inactive group tab" alias="color 34"/>
+ <ColorAlias name="invert button: fill active" alias="color 35"/>
+ <ColorAlias name="invert button: led active" alias="color 37"/>
+ <ColorAlias name="location cd marker" alias="color 38"/>
+ <ColorAlias name="location loop" alias="color 39"/>
+ <ColorAlias name="location marker" alias="color 32"/>
+ <ColorAlias name="location punch" alias="color 40"/>
+ <ColorAlias name="location range" alias="color 41"/>
+ <ColorAlias name="lock button: fill active" alias="color 42"/>
+ <ColorAlias name="lock button: led active" alias="color 4"/>
+ <ColorAlias name="marker bar" alias="color 33"/>
+ <ColorAlias name="marker bar separator" alias="color 27"/>
+ <ColorAlias name="marker drag line" alias="color 13"/>
+ <ColorAlias name="marker label" alias="color 4"/>
+ <ColorAlias name="marker track" alias="color 31"/>
+ <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+ <ColorAlias name="master monitor section button active: fill active" alias="color 13"/>
+ <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+ <ColorAlias name="measure line bar" alias="color 4"/>
+ <ColorAlias name="measure line beat" alias="color 94"/>
+ <ColorAlias name="meter background bottom" alias="color 4"/>
+ <ColorAlias name="meter background top" alias="color 4"/>
+ <ColorAlias name="meter bar" alias="color 7"/>
+ <ColorAlias name="meter color BBC" alias="color 8"/>
+ <ColorAlias name="meter marker" alias="color 19"/>
+ <ColorAlias name="meterbridge label: fill" alias="color 81"/>
+ <ColorAlias name="meterbridge label: fill active" alias="color 48"/>
+ <ColorAlias name="meterbridge label: led" alias="meter color8"/>
+ <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: fill" alias="color 81"/>
+ <ColorAlias name="meterbridge peakindicator: fill active" alias="meter color8"/>
+ <ColorAlias name="meterbridge peakindicator: led" alias="meter color8"/>
+ <ColorAlias name="meterbridge peakindicator: led active" alias="meter color8"/>
+ <ColorAlias name="meterbridge peaklabel" alias="meter color8"/>
+ <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+ <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+ <ColorAlias name="midi automation track fill" alias="color 74"/>
+ <ColorAlias name="midi bus base" alias="color 4"/>
+ <ColorAlias name="midi device: fill" alias="color 25"/>
+ <ColorAlias name="midi device: fill active" alias="color 42"/>
+ <ColorAlias name="midi device: led active" alias="color 17"/>
+ <ColorAlias name="midi frame base" alias="color 87"/>
+ <ColorAlias name="midi input button: fill active" alias="color 48"/>
+ <ColorAlias name="midi input button: led active" alias="color 4"/>
+ <ColorAlias name="midi meter color0" alias="color 52"/>
+ <ColorAlias name="midi meter color1" alias="color 53"/>
+ <ColorAlias name="midi meter color2" alias="color 53"/>
+ <ColorAlias name="midi meter color3" alias="color 54"/>
+ <ColorAlias name="midi meter color4" alias="color 54"/>
+ <ColorAlias name="midi meter color5" alias="color 55"/>
+ <ColorAlias name="midi meter color6" alias="color 55"/>
+ <ColorAlias name="midi meter color7" alias="color 56"/>
+ <ColorAlias name="midi meter color8" alias="color 56"/>
+ <ColorAlias name="midi meter color9" alias="meter color3"/>
+ <ColorAlias name="midi note inactive channel" alias="color 4"/>
+ <ColorAlias name="midi note max" alias="color 67"/>
+ <ColorAlias name="midi note mid" alias="color 87"/>
+ <ColorAlias name="midi note min" alias="color 49"/>
+ <ColorAlias name="midi note selected" alias="color 91"/>
+ <ColorAlias name="midi note selected outline" alias="color 67"/>
+ <ColorAlias name="midi note velocity text" alias="color 13"/>
+ <ColorAlias name="midi patch change fill" alias="color 60"/>
+ <ColorAlias name="midi patch change outline" alias="color 26"/>
+ <ColorAlias name="midi select rect outline" alias="color 13"/>
+ <ColorAlias name="midi sysex fill" alias="color 10"/>
+ <ColorAlias name="midi sysex outline" alias="color 64"/>
+ <ColorAlias name="midi track base" alias="color 74"/>
+ <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+ <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+ <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+ <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+ <ColorAlias name="monitor button: fill active" alias="color 92"/>
+ <ColorAlias name="monitor button: led active" alias="color 13"/>
+ <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+ <ColorAlias name="monitor section dim: fill active" alias="color 100"/>
+ <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+ <ColorAlias name="monitor section knob" alias="color 60"/>
+ <ColorAlias name="monitor section knob: arc end" alias="color 81"/>
+ <ColorAlias name="monitor section knob: arc start" alias="color 13"/>
+ <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+ <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+ <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+ <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+ <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+ <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+ <ColorAlias name="mono panner bg" alias="color 67"/>
+ <ColorAlias name="mono panner fill" alias="color 74"/>
+ <ColorAlias name="mono panner outline" alias="color 70"/>
+ <ColorAlias name="mono panner position fill" alias="color 11"/>
+ <ColorAlias name="mono panner position outline" alias="color 70"/>
+ <ColorAlias name="mono panner text" alias="color 4"/>
+ <ColorAlias name="mouse mode button: fill active" alias="color 13"/>
+ <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+ <ColorAlias name="mute button: fill active" alias="color 53"/>
+ <ColorAlias name="mute button: led active" alias="color 4"/>
+ <ColorAlias name="name highlight fill" alias="color 18"/>
+ <ColorAlias name="name highlight outline" alias="color 23"/>
+ <ColorAlias name="nudge button: fill" alias="color 39"/>
+ <ColorAlias name="nudge button: fill active" alias="color 42"/>
+ <ColorAlias name="nudge button: led active" alias="color 8"/>
+ <ColorAlias name="nudge clock: background" alias="color 67"/>
+ <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+ <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+ <ColorAlias name="nudge clock: text" alias="color 13"/>
+ <ColorAlias name="piano roll black" alias="color 76"/>
+ <ColorAlias name="piano roll black outline" alias="color 33"/>
+ <ColorAlias name="piano roll white" alias="color 45"/>
+ <ColorAlias name="play head" alias="color 13"/>
+ <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+ <ColorAlias name="pluginlist filter button: fill active" alias="color 10"/>
+ <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+ <ColorAlias name="processor automation line" alias="color 77"/>
+ <ColorAlias name="processor control button: fill" alias="color 29"/>
+ <ColorAlias name="processor control button: fill active" alias="color 46"/>
+ <ColorAlias name="processor control button: led active" alias="color 13"/>
+ <ColorAlias name="processor fader: fill" alias="color 87"/>
+ <ColorAlias name="processor fader: fill active" alias="color 21"/>
+ <ColorAlias name="processor fader: led active" alias="color 13"/>
+ <ColorAlias name="processor postfader: fill" alias="color 58"/>
+ <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+ <ColorAlias name="processor postfader: led active" alias="color 13"/>
+ <ColorAlias name="processor prefader: fill" alias="color 40"/>
+ <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+ <ColorAlias name="processor prefader: led active" alias="color 13"/>
+ <ColorAlias name="processor stub: fill" alias="color 46"/>
+ <ColorAlias name="processor stub: fill active" alias="color 46"/>
+ <ColorAlias name="punch button: fill" alias="color 10"/>
+ <ColorAlias name="punch button: fill active" alias="meter color8"/>
+ <ColorAlias name="punch button: led active" alias="color 4"/>
+ <ColorAlias name="punch clock: background" alias="color 67"/>
+ <ColorAlias name="punch clock: cursor" alias="color 100"/>
+ <ColorAlias name="punch clock: edited text" alias="color 100"/>
+ <ColorAlias name="punch clock: text" alias="color 13"/>
+ <ColorAlias name="punch line" alias="color 83"/>
+ <ColorAlias name="range drag bar rect" alias="color 21"/>
+ <ColorAlias name="range drag rect" alias="color 56"/>
+ <ColorAlias name="range marker bar" alias="color 34"/>
+ <ColorAlias name="record enable button: fill active" alias="color 83"/>
+ <ColorAlias name="record enable button: led active" alias="color 85"/>
+ <ColorAlias name="recording rect" alias="color 86"/>
+ <ColorAlias name="recording waveform fill" alias="color 13"/>
+ <ColorAlias name="recording waveform outline" alias="color 43"/>
+ <ColorAlias name="region list automatic" alias="color 53"/>
+ <ColorAlias name="region list missing source" alias="color 9"/>
+ <ColorAlias name="region list whole file" alias="color 1"/>
+ <ColorAlias name="route button: fill active" alias="color 67"/>
+ <ColorAlias name="route button: led active" alias="color 8"/>
+ <ColorAlias name="rubber band rect" alias="color 88"/>
+ <ColorAlias name="rude audition: fill" alias="color 10"/>
+ <ColorAlias name="rude audition: fill active" alias="color 86"/>
+ <ColorAlias name="rude audition: led active" alias="color 4"/>
+ <ColorAlias name="rude isolate: fill" alias="color 42"/>
+ <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+ <ColorAlias name="rude isolate: led active" alias="color 4"/>
+ <ColorAlias name="rude solo: fill" alias="color 10"/>
+ <ColorAlias name="rude solo: fill active" alias="color 103"/>
+ <ColorAlias name="rude solo: led active" alias="color 4"/>
+ <ColorAlias name="ruler base" alias="color 25"/>
+ <ColorAlias name="ruler text" alias="color 13"/>
+ <ColorAlias name="secondary clock: background" alias="color 67"/>
+ <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+ <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+ <ColorAlias name="secondary clock: text" alias="color 88"/>
+ <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+ <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+ <ColorAlias name="selected midi note frame" alias="color 4"/>
+ <ColorAlias name="selected region base" alias="color 13"/>
+ <ColorAlias name="selected time axis frame" alias="color 86"/>
+ <ColorAlias name="selected waveform fill" alias="color 94"/>
+ <ColorAlias name="selected waveform outline" alias="color 67"/>
+ <ColorAlias name="selection" alias="color 13"/>
+ <ColorAlias name="selection clock: background" alias="color 67"/>
+ <ColorAlias name="selection clock: cursor" alias="color 9"/>
+ <ColorAlias name="selection clock: edited text" alias="color 9"/>
+ <ColorAlias name="selection clock: text" alias="color 13"/>
+ <ColorAlias name="selection rect" alias="color 13"/>
+ <ColorAlias name="send alert button: fill" alias="color 71"/>
+ <ColorAlias name="send alert button: fill active" alias="color 38"/>
+ <ColorAlias name="send alert button: led active" alias="color 4"/>
+ <ColorAlias name="send bg" alias="color 38"/>
+ <ColorAlias name="shuttle" alias="color 10"/>
+ <ColorAlias name="silence" alias="color 98"/>
+ <ColorAlias name="silence text" alias="color 10"/>
+ <ColorAlias name="solo button: fill active" alias="color 103"/>
+ <ColorAlias name="solo button: led active" alias="color 4"/>
+ <ColorAlias name="solo isolate: fill" alias="color 25"/>
+ <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+ <ColorAlias name="solo isolate: led active" alias="meter color3"/>
+ <ColorAlias name="solo safe: fill" alias="color 25"/>
+ <ColorAlias name="solo safe: fill active" alias="color 42"/>
+ <ColorAlias name="solo safe: led active" alias="meter color3"/>
+ <ColorAlias name="stereo panner bg" alias="color 67"/>
+ <ColorAlias name="stereo panner fill" alias="color 74"/>
+ <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+ <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+ <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+ <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+ <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+ <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+ <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+ <ColorAlias name="stereo panner mono text" alias="color 4"/>
+ <ColorAlias name="stereo panner outline" alias="color 70"/>
+ <ColorAlias name="stereo panner rule" alias="color 70"/>
+ <ColorAlias name="stereo panner text" alias="color 4"/>
+ <ColorAlias name="sync mark" alias="color 75"/>
+ <ColorAlias name="tempo bar" alias="color 46"/>
+ <ColorAlias name="tempo marker" alias="color 19"/>
+ <ColorAlias name="time axis frame" alias="color 4"/>
+ <ColorAlias name="time axis view item base" alias="color 94"/>
+ <ColorAlias name="time stretch fill" alias="color 100"/>
+ <ColorAlias name="time stretch outline" alias="color 94"/>
+ <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+ <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+ <ColorAlias name="tracknumber label: led active" alias="color 13"/>
+ <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+ <ColorAlias name="transport active option button: led active" alias="color 8"/>
+ <ColorAlias name="transport button: fill active" alias="color 13"/>
+ <ColorAlias name="transport button: led active" alias="color 4"/>
+ <ColorAlias name="transport clock: background" alias="color 67"/>
+ <ColorAlias name="transport clock: cursor" alias="color 8"/>
+ <ColorAlias name="transport clock: edited text" alias="color 8"/>
+ <ColorAlias name="transport clock: text" alias="color 13"/>
+ <ColorAlias name="transport delta clock: background" alias="color 67"/>
+ <ColorAlias name="transport delta clock: cursor" alias="color 100"/>
+ <ColorAlias name="transport delta clock: edited text" alias="color 100"/>
+ <ColorAlias name="transport delta clock: text" alias="color 92"/>
+ <ColorAlias name="transport drag rect" alias="color 21"/>
+ <ColorAlias name="transport loop rect" alias="color 92"/>
+ <ColorAlias name="transport marker bar" alias="color 25"/>
+ <ColorAlias name="transport option button: fill active" alias="color 42"/>
+ <ColorAlias name="transport option button: led active" alias="color 8"/>
+ <ColorAlias name="transport punch rect" alias="meter color9"/>
+ <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+ <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+ <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+ <ColorAlias name="trim handle" alias="color 18"/>
+ <ColorAlias name="trim handle locked" alias="color 86"/>
+ <ColorAlias name="trim knob" alias="color 60"/>
+ <ColorAlias name="trim knob: arc end" alias="color 13"/>
+ <ColorAlias name="trim knob: arc start" alias="color 9"/>
+ <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+ <ColorAlias name="video timeline bar" alias="color 46"/>
+ <ColorAlias name="waveform fill" alias="color 13"/>
+ <ColorAlias name="waveform outline" alias="color 4"/>
+ <ColorAlias name="zero line" alias="color 104"/>
+ <ColorAlias name="zoom button: fill active" alias="color 48"/>
+ <ColorAlias name="zoom button: led active" alias="color 8"/>
+ </ColorAliases>
+ <Modifiers>
+ <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+ <Modifier name="audio track base" modifier="= alpha:0.32"/>
+ <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+ <Modifier name="covered region base" modifier="= alpha:0.680625"/>
+ <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+ <Modifier name="dragging region" modifier="= alpha:0.92"/>
+ <Modifier name="editable region" modifier="= alpha:0"/>
+ <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+ <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+ <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+ <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+ <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+ <Modifier name="marker bar" modifier="= alpha:0.5"/>
+ <Modifier name="measure line beat" modifier="= alpha:1"/>
+ <Modifier name="midi frame base" modifier="= alpha:0.720606"/>
+ <Modifier name="midi note" modifier="= alpha:0.8"/>
+ <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+ <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+ <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+ <Modifier name="midi track base" modifier="= alpha:0.3"/>
+ <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+ <Modifier name="opaque region base" modifier="= alpha:0.75"/>
+ <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+ <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+ <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+ <Modifier name="recording rect" modifier="= alpha:0.275106"/>
+ <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+ <Modifier name="selection rect" modifier="= alpha:0.791048"/>
+ <Modifier name="silence" modifier="= alpha:0.4784"/>
+ <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+ <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+ <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+ <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+ <Modifier name="transparent region base" modifier="= alpha:0.693"/>
+ <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+ </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/cubasish-ardour.colors b/gtk2_ardour/themes/cubasish-ardour.colors
new file mode 100644
index 0000000..2e33bbd
--- /dev/null
+++ b/gtk2_ardour/themes/cubasish-ardour.colors
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Cubasish">
+ <Colors>
+ <Color name="color 1" value="0x31c9b2ff"/>
+ <Color name="color 10" value="0xf0f0f0ff"/>
+ <Color name="color 100" value="0xe49c9cff"/>
+ <Color name="color 101" value="0xa06000ff"/>
+ <Color name="color 103" value="0x1e7753ff"/>
+ <Color name="color 104" value="0x7f7f7fff"/>
+ <Color name="color 11" value="0x9496a3ff"/>
+ <Color name="color 12" value="0xe0e2e5ff"/>
+ <Color name="color 13" value="0xffffffff"/>
+ <Color name="color 14" value="0x55ccccff"/>
+ <Color name="color 15" value="0x282b49ff"/>
+ <Color name="color 16" value="0xdde1e4ff"/>
+ <Color name="color 17" value="0x00ffdfff"/>
+ <Color name="color 18" value="0x001affff"/>
+ <Color name="color 19" value="0xdd6363ff"/>
+ <Color name="color 2" value="0x595959ff"/>
+ <Color name="color 20" value="0x684d4dff"/>
+ <Color name="color 21" value="0x969696ff"/>
+ <Color name="color 22" value="0xe5e5e5ff"/>
+ <Color name="color 23" value="0x6024d1ff"/>
+ <Color name="color 24" value="0x9fbca2ff"/>
+ <Color name="color 25" value="0x4a4a4aff"/>
+ <Color name="color 26" value="0xc7c9d8ff"/>
+ <Color name="color 27" value="0x191919ff"/>
+ <Color name="color 28" value="0x5d3e7cff"/>
+ <Color name="color 29" value="0x202020ff"/>
+ <Color name="color 3" value="0x738299ff"/>
+ <Color name="color 30" value="0xe500cfff"/>
+ <Color name="color 31" value="0xddddd8ff"/>
+ <Color name="color 32" value="0xeddc3d77"/>
+ <Color name="color 33" value="0xc0c4c9ff"/>
+ <Color name="color 34" value="0xcbd6daff"/>
+ <Color name="color 35" value="0x4250d0ff"/>
+ <Color name="color 36" value="0x473212ff"/>
+ <Color name="color 37" value="0x76b8e8ff"/>
+ <Color name="color 38" value="0x1ee8acff"/>
+ <Color name="color 39" value="0xcececeff"/>
+ <Color name="color 4" value="0x000000ff"/>
+ <Color name="color 40" value="0xacb3b9ff"/>
+ <Color name="color 41" value="0x497a5dff"/>
+ <Color name="color 42" value="0x404145ff"/>
+ <Color name="color 43" value="0x000424ff"/>
+ <Color name="color 44" value="0x004f3cff"/>
+ <Color name="color 45" value="0xa29e9eff"/>
+ <Color name="color 46" value="0x2f3841ff"/>
+ <Color name="color 47" value="0x008852ff"/>
+ <Color name="color 48" value="0x4495e3ff"/>
+ <Color name="color 49" value="0x0f0797ff"/>
+ <Color name="color 5" value="0x9dadc4ff"/>
+ <Color name="color 50" value="0xeeeeecff"/>
+ <Color name="color 51" value="0x383d37ff"/>
+ <Color name="color 52" value="0xbba34cff"/>
+ <Color name="color 53" value="0xf2c37dff"/>
+ <Color name="color 54" value="0xf48352ff"/>
+ <Color name="color 55" value="0xf85813ff"/>
+ <Color name="color 56" value="0x8ec794ff"/>
+ <Color name="color 57" value="0x7ea854ff"/>
+ <Color name="color 58" value="0x3e3e3eff"/>
+ <Color name="color 59" value="0xb2baffff"/>
+ <Color name="color 6" value="0x5d3bd6ff"/>
+ <Color name="color 60" value="0x50545aff"/>
+ <Color name="color 61" value="0x20242aff"/>
+ <Color name="color 62" value="0x8894ffff"/>
+ <Color name="color 63" value="0x5566ffff"/>
+ <Color name="color 64" value="0xa7acd4ff"/>
+ <Color name="color 65" value="0xb8cca3ff"/>
+ <Color name="color 66" value="0x4f2f00ff"/>
+ <Color name="color 67" value="0x121212ff"/>
+ <Color name="color 68" value="0xc57805ff"/>
+ <Color name="color 69" value="0x030207ff"/>
+ <Color name="color 7" value="0x282b30ff"/>
+ <Color name="color 70" value="0x304057ff"/>
+ <Color name="color 71" value="0x5f5a58ff"/>
+ <Color name="color 72" value="0xe58b05ff"/>
+ <Color name="color 73" value="0x3240c0ff"/>
+ <Color name="color 74" value="0x7a9bccff"/>
+ <Color name="color 75" value="0xe6bb3bff"/>
+ <Color name="color 76" value="0x6c6e6aff"/>
+ <Color name="color 77" value="0x7aadf9ff"/>
+ <Color name="color 78" value="0x2e769cff"/>
+ <Color name="color 79" value="0x6b806dff"/>
+ <Color name="color 8" value="0xc20020ff"/>
+ <Color name="color 80" value="0x603535ff"/>
+ <Color name="color 81" value="0xa5a5a5ff"/>
+ <Color name="color 82" value="0x00c73eff"/>
+ <Color name="color 83" value="0xa80000ff"/>
+ <Color name="color 84" value="0x7b354aff"/>
+ <Color name="color 85" value="0xffa3bfff"/>
+ <Color name="color 86" value="0xcc2828ff"/>
+ <Color name="color 87" value="0x505050ff"/>
+ <Color name="color 88" value="0xc6c6c6ff"/>
+ <Color name="color 89" value="0xb6e8fdff"/>
+ <Color name="color 9" value="0xffffffff"/>
+ <Color name="color 90" value="0x2c2121ff"/>
+ <Color name="color 91" value="0x921fccff"/>
+ <Color name="color 92" value="0x8cd8f8ff"/>
+ <Color name="color 93" value="0x51578aff"/>
+ <Color name="color 94" value="0x636363ff"/>
+ <Color name="color 95" value="0xe4f4d3ff"/>
+ <Color name="color 96" value="0x24e59cff"/>
+ <Color name="color 97" value="0xccccccff"/>
+ <Color name="color 98" value="0x9e00ffff"/>
+ <Color name="color 99" value="0xacb3b9ff"/>
+ <Color name="meter color0" value="0x086154ff"/>
+ <Color name="meter color1" value="0x26dad4ff"/>
+ <Color name="meter color2" value="0x09e8abff"/>
+ <Color name="meter color3" value="0x0de784ff"/>
+ <Color name="meter color4" value="0x6aff00ff"/>
+ <Color name="meter color5" value="0xffff00ff"/>
+ <Color name="meter color6" value="0xff8800ff"/>
+ <Color name="meter color7" value="0xff8800ff"/>
+ <Color name="meter color8" value="0xff0000ff"/>
+ <Color name="meter color9" value="0xff0000ff"/>
+ </Colors>
+ <ColorAliases>
+ <ColorAlias name="active crossfade" alias="color 1"/>
+ <ColorAlias name="arrange base" alias="color 34"/>
+ <ColorAlias name="audio automation track fill" alias="color 70"/>
+ <ColorAlias name="audio bus base" alias="color 3"/>
+ <ColorAlias name="audio master bus base" alias="color 4"/>
+ <ColorAlias name="audio track base" alias="color 77"/>
+ <ColorAlias name="automation line" alias="color 23"/>
+ <ColorAlias name="automation track outline" alias="color 7"/>
+ <ColorAlias name="big clock active: background" alias="color 4"/>
+ <ColorAlias name="big clock active: cursor" alias="color 8"/>
+ <ColorAlias name="big clock active: edited text" alias="color 8"/>
+ <ColorAlias name="big clock active: text" alias="color 9"/>
+ <ColorAlias name="big clock: background" alias="color 67"/>
+ <ColorAlias name="big clock: cursor" alias="color 8"/>
+ <ColorAlias name="big clock: edited text" alias="color 8"/>
+ <ColorAlias name="big clock: text" alias="color 10"/>
+ <ColorAlias name="border color" alias="color 4"/>
+ <ColorAlias name="cd marker bar" alias="color 87"/>
+ <ColorAlias name="clipped waveform" alias="color 9"/>
+ <ColorAlias name="clock: background" alias="color 67"/>
+ <ColorAlias name="clock: cursor" alias="color 8"/>
+ <ColorAlias name="clock: edited text" alias="color 8"/>
+ <ColorAlias name="clock: text" alias="color 12"/>
+ <ColorAlias name="comment button: fill" alias="color 20"/>
+ <ColorAlias name="control point fill" alias="color 4"/>
+ <ColorAlias name="control point outline" alias="color 58"/>
+ <ColorAlias name="control point selected fill" alias="color 13"/>
+ <ColorAlias name="control point selected outline" alias="color 4"/>
+ <ColorAlias name="covered region" alias="color 87"/>
+ <ColorAlias name="crossfade editor base" alias="color 15"/>
+ <ColorAlias name="crossfade editor line" alias="color 4"/>
+ <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+ <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+ <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+ <ColorAlias name="crossfade editor wave" alias="color 13"/>
+ <ColorAlias name="crossfade line" alias="color 4"/>
+ <ColorAlias name="edit point" alias="color 18"/>
+ <ColorAlias name="entered automation line" alias="color 19"/>
+ <ColorAlias name="entered gain line" alias="color 19"/>
+ <ColorAlias name="entered marker" alias="color 19"/>
+ <ColorAlias name="feedback alert: fill" alias="color 62"/>
+ <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+ <ColorAlias name="feedback alert: led active" alias="color 4"/>
+ <ColorAlias name="frame handle" alias="color 23"/>
+ <ColorAlias name="gain line" alias="color 6"/>
+ <ColorAlias name="gain line inactive" alias="color 24"/>
+ <ColorAlias name="generic button: fill" alias="color 33"/>
+ <ColorAlias name="generic button: fill active" alias="color 9"/>
+ <ColorAlias name="generic button: led active" alias="color 18"/>
+ <ColorAlias name="ghost track base" alias="color 46"/>
+ <ColorAlias name="ghost track midi outline" alias="color 4"/>
+ <ColorAlias name="ghost track wave" alias="color 29"/>
+ <ColorAlias name="ghost track wave clip" alias="color 29"/>
+ <ColorAlias name="ghost track wave fill" alias="color 29"/>
+ <ColorAlias name="ghost track zero line" alias="color 30"/>
+ <ColorAlias name="gtk_arm" alias="color 9"/>
+ <ColorAlias name="gtk_audio_bus" alias="color 61"/>
+ <ColorAlias name="gtk_audio_track" alias="color 46"/>
+ <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
+ <ColorAlias name="gtk_background" alias="color 7"/>
+ <ColorAlias name="gtk_bases" alias="color 7"/>
+ <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+ <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+ <ColorAlias name="gtk_bright_color" alias="color 74"/>
+ <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+ <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+ <ColorAlias name="gtk_control_master" alias="color 64"/>
+ <ColorAlias name="gtk_control_text" alias="color 26"/>
+ <ColorAlias name="gtk_control_text2" alias="color 83"/>
+ <ColorAlias name="gtk_darkest" alias="color 67"/>
+ <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+ <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+ <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+ <ColorAlias name="gtk_foreground" alias="color 50"/>
+ <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+ <ColorAlias name="gtk_lightest" alias="color 13"/>
+ <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+ <ColorAlias name="gtk_midi_track" alias="color 46"/>
+ <ColorAlias name="gtk_monitor" alias="color 8"/>
+ <ColorAlias name="gtk_mono" alias="color 95"/>
+ <ColorAlias name="gtk_mute" alias="color 52"/>
+ <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+ <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+ <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+ <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+ <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+ <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+ <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+ <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+ <ColorAlias name="gtk_send_bg" alias="color 38"/>
+ <ColorAlias name="gtk_send_fg" alias="color 24"/>
+ <ColorAlias name="gtk_solo" alias="color 91"/>
+ <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+ <ColorAlias name="gtk_texts" alias="color 50"/>
+ <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+ <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+ <ColorAlias name="image track" alias="color 31"/>
+ <ColorAlias name="inactive crossfade" alias="color 32"/>
+ <ColorAlias name="inactive fade handle" alias="color 33"/>
+ <ColorAlias name="inactive group tab" alias="color 34"/>
+ <ColorAlias name="invert button: fill active" alias="color 35"/>
+ <ColorAlias name="invert button: led active" alias="color 37"/>
+ <ColorAlias name="location cd marker" alias="color 38"/>
+ <ColorAlias name="location loop" alias="color 39"/>
+ <ColorAlias name="location marker" alias="color 32"/>
+ <ColorAlias name="location punch" alias="color 40"/>
+ <ColorAlias name="location range" alias="color 41"/>
+ <ColorAlias name="lock button: fill active" alias="color 42"/>
+ <ColorAlias name="lock button: led active" alias="color 4"/>
+ <ColorAlias name="marker bar" alias="color 2"/>
+ <ColorAlias name="marker bar separator" alias="color 27"/>
+ <ColorAlias name="marker drag line" alias="color 44"/>
+ <ColorAlias name="marker label" alias="color 4"/>
+ <ColorAlias name="marker track" alias="color 31"/>
+ <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+ <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+ <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+ <ColorAlias name="measure line bar" alias="color 13"/>
+ <ColorAlias name="measure line beat" alias="color 33"/>
+ <ColorAlias name="meter background bottom" alias="color 4"/>
+ <ColorAlias name="meter background top" alias="color 4"/>
+ <ColorAlias name="meter bar" alias="color 7"/>
+ <ColorAlias name="meter color BBC" alias="color 8"/>
+ <ColorAlias name="meter marker" alias="color 19"/>
+ <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+ <ColorAlias name="meterbridge label: led" alias="color 9"/>
+ <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+ <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+ <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+ <ColorAlias name="midi automation track fill" alias="color 58"/>
+ <ColorAlias name="midi bus base" alias="color 4"/>
+ <ColorAlias name="midi device: fill" alias="color 25"/>
+ <ColorAlias name="midi device: fill active" alias="color 42"/>
+ <ColorAlias name="midi device: led active" alias="color 17"/>
+ <ColorAlias name="midi frame base" alias="color 87"/>
+ <ColorAlias name="midi input button: fill active" alias="color 48"/>
+ <ColorAlias name="midi input button: led active" alias="color 4"/>
+ <ColorAlias name="midi meter color0" alias="color 52"/>
+ <ColorAlias name="midi meter color1" alias="color 53"/>
+ <ColorAlias name="midi meter color2" alias="color 53"/>
+ <ColorAlias name="midi meter color3" alias="color 54"/>
+ <ColorAlias name="midi meter color4" alias="color 54"/>
+ <ColorAlias name="midi meter color5" alias="color 55"/>
+ <ColorAlias name="midi meter color6" alias="color 55"/>
+ <ColorAlias name="midi meter color7" alias="color 56"/>
+ <ColorAlias name="midi meter color8" alias="color 56"/>
+ <ColorAlias name="midi meter color9" alias="meter color3"/>
+ <ColorAlias name="midi note inactive channel" alias="color 4"/>
+ <ColorAlias name="midi note max" alias="color 8"/>
+ <ColorAlias name="midi note mid" alias="color 91"/>
+ <ColorAlias name="midi note min" alias="color 49"/>
+ <ColorAlias name="midi note selected" alias="color 29"/>
+ <ColorAlias name="midi note selected outline" alias="color 67"/>
+ <ColorAlias name="midi note velocity text" alias="color 32"/>
+ <ColorAlias name="midi patch change fill" alias="color 60"/>
+ <ColorAlias name="midi patch change outline" alias="color 26"/>
+ <ColorAlias name="midi select rect outline" alias="color 63"/>
+ <ColorAlias name="midi sysex fill" alias="color 32"/>
+ <ColorAlias name="midi sysex outline" alias="color 64"/>
+ <ColorAlias name="midi track base" alias="color 39"/>
+ <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+ <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+ <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+ <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+ <ColorAlias name="monitor button: fill active" alias="color 68"/>
+ <ColorAlias name="monitor button: led active" alias="color 9"/>
+ <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+ <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+ <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+ <ColorAlias name="monitor section knob" alias="color 60"/>
+ <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+ <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
+ <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+ <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+ <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+ <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+ <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+ <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+ <ColorAlias name="mono panner bg" alias="color 67"/>
+ <ColorAlias name="mono panner fill" alias="color 74"/>
+ <ColorAlias name="mono panner outline" alias="color 70"/>
+ <ColorAlias name="mono panner position fill" alias="color 11"/>
+ <ColorAlias name="mono panner position outline" alias="color 70"/>
+ <ColorAlias name="mono panner text" alias="color 4"/>
+ <ColorAlias name="mouse mode button: fill active" alias="color 13"/>
+ <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+ <ColorAlias name="mute button: fill active" alias="color 75"/>
+ <ColorAlias name="mute button: led active" alias="color 4"/>
+ <ColorAlias name="name highlight fill" alias="color 18"/>
+ <ColorAlias name="name highlight outline" alias="color 23"/>
+ <ColorAlias name="nudge button: fill" alias="color 63"/>
+ <ColorAlias name="nudge button: fill active" alias="color 42"/>
+ <ColorAlias name="nudge button: led active" alias="color 8"/>
+ <ColorAlias name="nudge clock: background" alias="color 67"/>
+ <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+ <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+ <ColorAlias name="nudge clock: text" alias="color 12"/>
+ <ColorAlias name="piano roll black" alias="color 76"/>
+ <ColorAlias name="piano roll black outline" alias="color 33"/>
+ <ColorAlias name="piano roll white" alias="color 45"/>
+ <ColorAlias name="play head" alias="color 9"/>
+ <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+ <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+ <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+ <ColorAlias name="processor automation line" alias="color 77"/>
+ <ColorAlias name="processor control button: fill" alias="color 29"/>
+ <ColorAlias name="processor control button: fill active" alias="color 46"/>
+ <ColorAlias name="processor control button: led active" alias="color 62"/>
+ <ColorAlias name="processor fader: fill" alias="color 16"/>
+ <ColorAlias name="processor fader: fill active" alias="color 78"/>
+ <ColorAlias name="processor fader: led active" alias="color 37"/>
+ <ColorAlias name="processor postfader: fill" alias="color 58"/>
+ <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+ <ColorAlias name="processor postfader: led active" alias="color 37"/>
+ <ColorAlias name="processor prefader: fill" alias="color 40"/>
+ <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+ <ColorAlias name="processor prefader: led active" alias="color 37"/>
+ <ColorAlias name="processor stub: fill" alias="color 46"/>
+ <ColorAlias name="processor stub: fill active" alias="color 46"/>
+ <ColorAlias name="punch button: fill" alias="color 62"/>
+ <ColorAlias name="punch button: fill active" alias="color 9"/>
+ <ColorAlias name="punch button: led active" alias="color 4"/>
+ <ColorAlias name="punch clock: background" alias="color 67"/>
+ <ColorAlias name="punch clock: cursor" alias="color 9"/>
+ <ColorAlias name="punch clock: edited text" alias="color 9"/>
+ <ColorAlias name="punch clock: text" alias="color 12"/>
+ <ColorAlias name="punch line" alias="color 83"/>
+ <ColorAlias name="range drag bar rect" alias="color 21"/>
+ <ColorAlias name="range drag rect" alias="color 56"/>
+ <ColorAlias name="range marker bar" alias="color 34"/>
+ <ColorAlias name="record enable button: fill active" alias="color 83"/>
+ <ColorAlias name="record enable button: led active" alias="color 85"/>
+ <ColorAlias name="recording rect" alias="color 86"/>
+ <ColorAlias name="recording waveform fill" alias="color 13"/>
+ <ColorAlias name="recording waveform outline" alias="color 43"/>
+ <ColorAlias name="region list automatic" alias="color 53"/>
+ <ColorAlias name="region list missing source" alias="color 9"/>
+ <ColorAlias name="region list whole file" alias="color 1"/>
+ <ColorAlias name="route button: fill active" alias="color 67"/>
+ <ColorAlias name="route button: led active" alias="color 8"/>
+ <ColorAlias name="rubber band rect" alias="color 88"/>
+ <ColorAlias name="rude audition: fill" alias="color 62"/>
+ <ColorAlias name="rude audition: fill active" alias="color 86"/>
+ <ColorAlias name="rude audition: led active" alias="color 4"/>
+ <ColorAlias name="rude isolate: fill" alias="color 42"/>
+ <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+ <ColorAlias name="rude isolate: led active" alias="color 4"/>
+ <ColorAlias name="rude solo: fill" alias="color 62"/>
+ <ColorAlias name="rude solo: fill active" alias="color 82"/>
+ <ColorAlias name="rude solo: led active" alias="color 4"/>
+ <ColorAlias name="ruler base" alias="color 67"/>
+ <ColorAlias name="ruler text" alias="color 22"/>
+ <ColorAlias name="secondary clock: background" alias="color 67"/>
+ <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+ <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+ <ColorAlias name="secondary clock: text" alias="color 88"/>
+ <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+ <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+ <ColorAlias name="selected midi note frame" alias="color 86"/>
+ <ColorAlias name="selected region base" alias="color 9"/>
+ <ColorAlias name="selected time axis frame" alias="color 86"/>
+ <ColorAlias name="selected waveform fill" alias="color 94"/>
+ <ColorAlias name="selected waveform outline" alias="color 67"/>
+ <ColorAlias name="selection" alias="color 13"/>
+ <ColorAlias name="selection clock: background" alias="color 67"/>
+ <ColorAlias name="selection clock: cursor" alias="color 9"/>
+ <ColorAlias name="selection clock: edited text" alias="color 9"/>
+ <ColorAlias name="selection clock: text" alias="color 12"/>
+ <ColorAlias name="selection rect" alias="color 95"/>
+ <ColorAlias name="send alert button: fill" alias="color 71"/>
+ <ColorAlias name="send alert button: fill active" alias="color 38"/>
+ <ColorAlias name="send alert button: led active" alias="color 4"/>
+ <ColorAlias name="send bg" alias="color 38"/>
+ <ColorAlias name="shuttle" alias="color 12"/>
+ <ColorAlias name="shuttle bg" alias="color 4"/>
+ <ColorAlias name="shuttle text" alias="color 13"/>
+ <ColorAlias name="silence" alias="color 98"/>
+ <ColorAlias name="silence text" alias="color 10"/>
+ <ColorAlias name="solo button: fill active" alias="color 82"/>
+ <ColorAlias name="solo button: led active" alias="color 4"/>
+ <ColorAlias name="solo isolate: fill" alias="color 25"/>
+ <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+ <ColorAlias name="solo isolate: led active" alias="color 9"/>
+ <ColorAlias name="solo safe: fill" alias="color 25"/>
+ <ColorAlias name="solo safe: fill active" alias="color 42"/>
+ <ColorAlias name="solo safe: led active" alias="color 9"/>
+ <ColorAlias name="stereo panner bg" alias="color 67"/>
+ <ColorAlias name="stereo panner fill" alias="color 74"/>
+ <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+ <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+ <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+ <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+ <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+ <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+ <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+ <ColorAlias name="stereo panner mono text" alias="color 4"/>
+ <ColorAlias name="stereo panner outline" alias="color 70"/>
+ <ColorAlias name="stereo panner rule" alias="color 70"/>
+ <ColorAlias name="stereo panner text" alias="color 4"/>
+ <ColorAlias name="sync mark" alias="color 75"/>
+ <ColorAlias name="tempo bar" alias="color 46"/>
+ <ColorAlias name="tempo curve" alias="color 62"/>
+ <ColorAlias name="tempo marker" alias="color 19"/>
+ <ColorAlias name="tempo marker music" alias="color 5"/>
+ <ColorAlias name="time axis frame" alias="color 4"/>
+ <ColorAlias name="time axis view item base" alias="color 94"/>
+ <ColorAlias name="time stretch fill" alias="color 100"/>
+ <ColorAlias name="time stretch outline" alias="color 94"/>
+ <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+ <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+ <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+ <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+ <ColorAlias name="transport active option button: led active" alias="color 8"/>
+ <ColorAlias name="transport button: fill active" alias="color 23"/>
+ <ColorAlias name="transport button: led active" alias="color 4"/>
+ <ColorAlias name="transport clock: background" alias="color 67"/>
+ <ColorAlias name="transport clock: cursor" alias="color 8"/>
+ <ColorAlias name="transport clock: edited text" alias="color 8"/>
+ <ColorAlias name="transport clock: text" alias="color 9"/>
+ <ColorAlias name="transport delta clock: background" alias="color 67"/>
+ <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="transport delta clock: text" alias="color 92"/>
+ <ColorAlias name="transport drag rect" alias="color 21"/>
+ <ColorAlias name="transport loop rect" alias="color 48"/>
+ <ColorAlias name="transport marker bar" alias="color 25"/>
+ <ColorAlias name="transport option button: fill active" alias="color 42"/>
+ <ColorAlias name="transport option button: led active" alias="color 8"/>
+ <ColorAlias name="transport punch rect" alias="color 77"/>
+ <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+ <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+ <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+ <ColorAlias name="trim handle" alias="color 18"/>
+ <ColorAlias name="trim handle locked" alias="color 86"/>
+ <ColorAlias name="trim knob" alias="color 60"/>
+ <ColorAlias name="trim knob: arc end" alias="color 81"/>
+ <ColorAlias name="trim knob: arc start" alias="color 82"/>
+ <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+ <ColorAlias name="video timeline bar" alias="color 46"/>
+ <ColorAlias name="waveform fill" alias="color 13"/>
+ <ColorAlias name="waveform outline" alias="color 4"/>
+ <ColorAlias name="zero line" alias="color 104"/>
+ <ColorAlias name="zoom button: fill active" alias="color 48"/>
+ <ColorAlias name="zoom button: led active" alias="color 8"/>
+ </ColorAliases>
+ <Modifiers>
+ <Modifier name="audio bus base" modifier="= alpha:0.201808"/>
+ <Modifier name="audio track base" modifier="= alpha:0.205615"/>
+ <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+ <Modifier name="covered region base" modifier="= alpha:0.700615"/>
+ <Modifier name="crossfade alpha" modifier="= alpha:0.423606"/>
+ <Modifier name="dragging region" modifier="= alpha:0.99"/>
+ <Modifier name="editable region" modifier="= alpha:0"/>
+ <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+ <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+ <Modifier name="ghost track midi fill" modifier="= alpha:0.182769"/>
+ <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+ <Modifier name="loop rectangle" modifier="= alpha:0.219904"/>
+ <Modifier name="marker bar" modifier="= alpha:0.5"/>
+ <Modifier name="measure line beat" modifier="= alpha:1"/>
+ <Modifier name="midi frame base" modifier="= alpha:0.817702"/>
+ <Modifier name="midi note" modifier="= alpha:0.863394"/>
+ <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+ <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+ <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+ <Modifier name="midi track base" modifier="= alpha:0.3"/>
+ <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+ <Modifier name="opaque region base" modifier="= alpha:0.832933"/>
+ <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+ <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+ <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+ <Modifier name="recording rect" modifier="= alpha:0.25"/>
+ <Modifier name="selected midi note" modifier="= alpha:0.484529"/>
+ <Modifier name="selection rect" modifier="= alpha:0.757731"/>
+ <Modifier name="silence" modifier="= alpha:0.4784"/>
+ <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+ <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+ <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+ <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+ <Modifier name="transparent region base" modifier="= alpha:0.99"/>
+ <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+ </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/dark-ardour.colors b/gtk2_ardour/themes/dark-ardour.colors
new file mode 100644
index 0000000..557647e
--- /dev/null
+++ b/gtk2_ardour/themes/dark-ardour.colors
@@ -0,0 +1,533 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="dark">
+ <Colors>
+ <Color name="color 1" value="0x20b2b2ff"/>
+ <Color name="color 10" value="0xf0f0f0ff"/>
+ <Color name="color 100" value="0xe49c9cff"/>
+ <Color name="color 101" value="0xa06000ff"/>
+ <Color name="color 103" value="0x1e7727ff"/>
+ <Color name="color 104" value="0x7f7f7fff"/>
+ <Color name="color 11" value="0x9496a3ff"/>
+ <Color name="color 12" value="0x18ab27ff"/>
+ <Color name="color 13" value="0xffffffff"/>
+ <Color name="color 14" value="0x55ccccff"/>
+ <Color name="color 15" value="0x282b49ff"/>
+ <Color name="color 16" value="0x526d94ff"/>
+ <Color name="color 17" value="0x00ff1aff"/>
+ <Color name="color 18" value="0x001affff"/>
+ <Color name="color 19" value="0xdd6363ff"/>
+ <Color name="color 2" value="0x595959ff"/>
+ <Color name="color 20" value="0x684d4dff"/>
+ <Color name="color 21" value="0x969696ff"/>
+ <Color name="color 22" value="0xe5e5e5ff"/>
+ <Color name="color 23" value="0x8000ffff"/>
+ <Color name="color 24" value="0x9fbca2ff"/>
+ <Color name="color 25" value="0x4a4a4aff"/>
+ <Color name="color 26" value="0xc7c9d8ff"/>
+ <Color name="color 27" value="0x191919ff"/>
+ <Color name="color 28" value="0x5d3e7cff"/>
+ <Color name="color 29" value="0x202020ff"/>
+ <Color name="color 3" value="0x738299ff"/>
+ <Color name="color 30" value="0xe500cfff"/>
+ <Color name="color 31" value="0xddddd8ff"/>
+ <Color name="color 32" value="0xeddc3d77"/>
+ <Color name="color 33" value="0xbbbbbbff"/>
+ <Color name="color 34" value="0x3d3d3dff"/>
+ <Color name="color 35" value="0x4250d0ff"/>
+ <Color name="color 36" value="0x473212ff"/>
+ <Color name="color 37" value="0x67cb4eff"/>
+ <Color name="color 38" value="0x1ee8acff"/>
+ <Color name="color 39" value="0x35965cff"/>
+ <Color name="color 4" value="0x000000ff"/>
+ <Color name="color 40" value="0x7c3a3aff"/>
+ <Color name="color 41" value="0x497a5dff"/>
+ <Color name="color 42" value="0x404145ff"/>
+ <Color name="color 43" value="0x000424ff"/>
+ <Color name="color 44" value="0x004f08ff"/>
+ <Color name="color 45" value="0xa29e9eff"/>
+ <Color name="color 46" value="0x333333ff"/>
+ <Color name="color 47" value="0x00880eff"/>
+ <Color name="color 48" value="0x00aa11ff"/>
+ <Color name="color 49" value="0x00660aff"/>
+ <Color name="color 5" value="0x9dadc4ff"/>
+ <Color name="color 50" value="0xeeeeecff"/>
+ <Color name="color 51" value="0x383d37ff"/>
+ <Color name="color 52" value="0xe8faa1ff"/>
+ <Color name="color 53" value="0xf2c37dff"/>
+ <Color name="color 54" value="0xf48352ff"/>
+ <Color name="color 55" value="0xf85813ff"/>
+ <Color name="color 56" value="0x8ec794ff"/>
+ <Color name="color 57" value="0x7ea854ff"/>
+ <Color name="color 58" value="0x474f3fff"/>
+ <Color name="color 59" value="0xb2baffff"/>
+ <Color name="color 6" value="0x44bc50ff"/>
+ <Color name="color 60" value="0x50545aff"/>
+ <Color name="color 61" value="0x20242aff"/>
+ <Color name="color 62" value="0x8894ffff"/>
+ <Color name="color 63" value="0x5566ffff"/>
+ <Color name="color 64" value="0xa7acd4ff"/>
+ <Color name="color 65" value="0xb8cca3ff"/>
+ <Color name="color 66" value="0x4f2f00ff"/>
+ <Color name="color 67" value="0x121212ff"/>
+ <Color name="color 68" value="0xc57805ff"/>
+ <Color name="color 69" value="0x660000ff"/>
+ <Color name="color 7" value="0x282828ff"/>
+ <Color name="color 70" value="0x304057ff"/>
+ <Color name="color 71" value="0x5f5a58ff"/>
+ <Color name="color 72" value="0xe58b05ff"/>
+ <Color name="color 73" value="0x3240c0ff"/>
+ <Color name="color 74" value="0x7a9bccff"/>
+ <Color name="color 75" value="0xbba900ff"/>
+ <Color name="color 76" value="0x6c6e6aff"/>
+ <Color name="color 77" value="0x7aadf9ff"/>
+ <Color name="color 78" value="0x256f8fff"/>
+ <Color name="color 79" value="0x254528ff"/>
+ <Color name="color 8" value="0xff9900ff"/>
+ <Color name="color 80" value="0x603535ff"/>
+ <Color name="color 81" value="0xa5a5a5ff"/>
+ <Color name="color 82" value="0xd8d8d8ff"/>
+ <Color name="color 83" value="0xa80000ff"/>
+ <Color name="color 84" value="0x7b354aff"/>
+ <Color name="color 85" value="0xffa3bfff"/>
+ <Color name="color 86" value="0xcc2828ff"/>
+ <Color name="color 87" value="0x505050ff"/>
+ <Color name="color 88" value="0xc6c6c6ff"/>
+ <Color name="color 89" value="0xb6e8fdff"/>
+ <Color name="color 9" value="0xf10000ff"/>
+ <Color name="color 90" value="0x2c2121ff"/>
+ <Color name="color 91" value="0x8ef823ff"/>
+ <Color name="color 92" value="0x8cd8f8ff"/>
+ <Color name="color 93" value="0x51578aff"/>
+ <Color name="color 94" value="0x636363ff"/>
+ <Color name="color 95" value="0xe4f4d3ff"/>
+ <Color name="color 96" value="0x85e524ff"/>
+ <Color name="color 97" value="0xccccccff"/>
+ <Color name="color 98" value="0x9e00ffff"/>
+ <Color name="color 99" value="0x5da3c1ff"/>
+ <Color name="meter color0" value="0x008800ff"/>
+ <Color name="meter color1" value="0x00aa00ff"/>
+ <Color name="meter color2" value="0x00ff00ff"/>
+ <Color name="meter color3" value="0x00ff00ff"/>
+ <Color name="meter color4" value="0xfff000ff"/>
+ <Color name="meter color5" value="0xfff000ff"/>
+ <Color name="meter color6" value="0xff8800ff"/>
+ <Color name="meter color7" value="0xff8800ff"/>
+ <Color name="meter color8" value="0xff0000ff"/>
+ <Color name="meter color9" value="0xff0000ff"/>
+ </Colors>
+ <ColorAliases>
+ <ColorAlias name="active crossfade" alias="color 1"/>
+ <ColorAlias name="arrange base" alias="color 34"/>
+ <ColorAlias name="audio automation track fill" alias="color 70"/>
+ <ColorAlias name="audio bus base" alias="color 3"/>
+ <ColorAlias name="audio master bus base" alias="color 4"/>
+ <ColorAlias name="audio track base" alias="color 77"/>
+ <ColorAlias name="automation line" alias="color 6"/>
+ <ColorAlias name="automation track outline" alias="color 7"/>
+ <ColorAlias name="big clock active: background" alias="color 4"/>
+ <ColorAlias name="big clock active: cursor" alias="color 8"/>
+ <ColorAlias name="big clock active: edited text" alias="color 8"/>
+ <ColorAlias name="big clock active: text" alias="color 9"/>
+ <ColorAlias name="big clock: background" alias="color 67"/>
+ <ColorAlias name="big clock: cursor" alias="color 8"/>
+ <ColorAlias name="big clock: edited text" alias="color 8"/>
+ <ColorAlias name="big clock: text" alias="color 10"/>
+ <ColorAlias name="border color" alias="color 4"/>
+ <ColorAlias name="cd marker bar" alias="color 87"/>
+ <ColorAlias name="clipped waveform" alias="color 9"/>
+ <ColorAlias name="clock: background" alias="color 67"/>
+ <ColorAlias name="clock: cursor" alias="color 8"/>
+ <ColorAlias name="clock: edited text" alias="color 8"/>
+ <ColorAlias name="clock: text" alias="color 12"/>
+ <ColorAlias name="comment button: fill" alias="color 20"/>
+ <ColorAlias name="control point fill" alias="color 17"/>
+ <ColorAlias name="control point outline" alias="meter color3"/>
+ <ColorAlias name="control point selected fill" alias="color 72"/>
+ <ColorAlias name="control point selected outline" alias="color 9"/>
+ <ColorAlias name="covered region" alias="color 87"/>
+ <ColorAlias name="crossfade editor base" alias="color 15"/>
+ <ColorAlias name="crossfade editor line" alias="color 4"/>
+ <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+ <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+ <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+ <ColorAlias name="crossfade editor wave" alias="color 13"/>
+ <ColorAlias name="crossfade line" alias="color 4"/>
+ <ColorAlias name="edit point" alias="color 18"/>
+ <ColorAlias name="entered automation line" alias="color 19"/>
+ <ColorAlias name="entered gain line" alias="color 19"/>
+ <ColorAlias name="entered marker" alias="color 19"/>
+ <ColorAlias name="feedback alert: fill" alias="color 20"/>
+ <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+ <ColorAlias name="feedback alert: led active" alias="color 4"/>
+ <ColorAlias name="frame handle" alias="color 23"/>
+ <ColorAlias name="gain line" alias="color 6"/>
+ <ColorAlias name="gain line inactive" alias="color 24"/>
+ <ColorAlias name="generic button: fill" alias="color 25"/>
+ <ColorAlias name="generic button: fill active" alias="color 9"/>
+ <ColorAlias name="generic button: led active" alias="color 18"/>
+ <ColorAlias name="ghost track base" alias="color 46"/>
+ <ColorAlias name="ghost track midi outline" alias="color 4"/>
+ <ColorAlias name="ghost track wave" alias="color 29"/>
+ <ColorAlias name="ghost track wave clip" alias="color 29"/>
+ <ColorAlias name="ghost track wave fill" alias="color 29"/>
+ <ColorAlias name="ghost track zero line" alias="color 30"/>
+ <ColorAlias name="gtk_arm" alias="color 9"/>
+ <ColorAlias name="gtk_audio_bus" alias="color 61"/>
+ <ColorAlias name="gtk_audio_track" alias="color 70"/>
+ <ColorAlias name="gtk_control_master" alias="color 5"/>
+ <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
+ <ColorAlias name="gtk_background" alias="color 34"/>
+ <ColorAlias name="gtk_bases" alias="color 27"/>
+ <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+ <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+ <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+ <ColorAlias name="gtk_bright_color" alias="color 74"/>
+ <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+ <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+ <ColorAlias name="gtk_control_text" alias="color 26"/>
+ <ColorAlias name="gtk_control_text2" alias="color 83"/>
+ <ColorAlias name="gtk_darkest" alias="color 67"/>
+ <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+ <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+ <ColorAlias name="gtk_foreground" alias="color 50"/>
+ <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+ <ColorAlias name="gtk_lightest" alias="color 13"/>
+ <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+ <ColorAlias name="gtk_midi_track" alias="color 58"/>
+ <ColorAlias name="gtk_monitor" alias="color 8"/>
+ <ColorAlias name="gtk_mono" alias="color 95"/>
+ <ColorAlias name="gtk_mute" alias="color 52"/>
+ <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+ <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+ <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+ <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+ <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+ <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+ <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+ <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+ <ColorAlias name="gtk_send_bg" alias="color 38"/>
+ <ColorAlias name="gtk_send_fg" alias="color 24"/>
+ <ColorAlias name="gtk_solo" alias="color 91"/>
+ <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+ <ColorAlias name="gtk_texts" alias="color 50"/>
+ <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+ <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+ <ColorAlias name="image track" alias="color 31"/>
+ <ColorAlias name="inactive crossfade" alias="color 32"/>
+ <ColorAlias name="inactive fade handle" alias="color 33"/>
+ <ColorAlias name="inactive group tab" alias="color 34"/>
+ <ColorAlias name="invert button: fill active" alias="color 35"/>
+ <ColorAlias name="invert button: led active" alias="color 37"/>
+ <ColorAlias name="location cd marker" alias="color 38"/>
+ <ColorAlias name="location loop" alias="color 39"/>
+ <ColorAlias name="location marker" alias="color 32"/>
+ <ColorAlias name="location punch" alias="color 40"/>
+ <ColorAlias name="location range" alias="color 41"/>
+ <ColorAlias name="lock button: fill active" alias="color 42"/>
+ <ColorAlias name="lock button: led active" alias="color 4"/>
+ <ColorAlias name="marker bar" alias="color 2"/>
+ <ColorAlias name="marker bar separator" alias="color 27"/>
+ <ColorAlias name="marker drag line" alias="color 44"/>
+ <ColorAlias name="marker label" alias="color 4"/>
+ <ColorAlias name="marker track" alias="color 31"/>
+ <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+ <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+ <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+ <ColorAlias name="measure line bar" alias="color 13"/>
+ <ColorAlias name="measure line beat" alias="color 33"/>
+ <ColorAlias name="meter background bottom" alias="color 46"/>
+ <ColorAlias name="meter background top" alias="color 34"/>
+ <ColorAlias name="meter bar" alias="color 7"/>
+ <ColorAlias name="meter color BBC" alias="color 8"/>
+ <ColorAlias name="meter marker" alias="color 19"/>
+ <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+ <ColorAlias name="meterbridge label: led" alias="color 9"/>
+ <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+ <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+ <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+ <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+ <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+ <ColorAlias name="midi automation track fill" alias="color 58"/>
+ <ColorAlias name="midi bus base" alias="color 4"/>
+ <ColorAlias name="midi device: fill" alias="color 25"/>
+ <ColorAlias name="midi device: fill active" alias="color 42"/>
+ <ColorAlias name="midi device: led active" alias="color 17"/>
+ <ColorAlias name="midi frame base" alias="color 87"/>
+ <ColorAlias name="midi input button: fill active" alias="color 48"/>
+ <ColorAlias name="midi input button: led active" alias="color 4"/>
+ <ColorAlias name="midi meter color0" alias="color 52"/>
+ <ColorAlias name="midi meter color1" alias="color 53"/>
+ <ColorAlias name="midi meter color2" alias="color 53"/>
+ <ColorAlias name="midi meter color3" alias="color 54"/>
+ <ColorAlias name="midi meter color4" alias="color 54"/>
+ <ColorAlias name="midi meter color5" alias="color 55"/>
+ <ColorAlias name="midi meter color6" alias="color 55"/>
+ <ColorAlias name="midi meter color7" alias="color 56"/>
+ <ColorAlias name="midi meter color8" alias="color 56"/>
+ <ColorAlias name="midi meter color9" alias="color 17"/>
+ <ColorAlias name="midi note inactive channel" alias="color 4"/>
+ <ColorAlias name="midi note max" alias="color 8"/>
+ <ColorAlias name="midi note mid" alias="color 96"/>
+ <ColorAlias name="midi note min" alias="color 103"/>
+ <ColorAlias name="midi note selected" alias="color 40"/>
+ <ColorAlias name="midi note selected outline" alias="color 9"/>
+ <ColorAlias name="midi note velocity text" alias="color 32"/>
+ <ColorAlias name="midi patch change fill" alias="color 60"/>
+ <ColorAlias name="midi patch change outline" alias="color 26"/>
+ <ColorAlias name="midi select rect outline" alias="color 63"/>
+ <ColorAlias name="midi sysex fill" alias="color 32"/>
+ <ColorAlias name="midi sysex outline" alias="color 64"/>
+ <ColorAlias name="midi track base" alias="color 41"/>
+ <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+ <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+ <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+ <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+ <ColorAlias name="monitor button: fill active" alias="color 68"/>
+ <ColorAlias name="monitor button: led active" alias="color 9"/>
+ <ColorAlias name="monitor section knob" alias="color 60"/>
+ <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+ <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
+ <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+ <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+ <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+ <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+ <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+ <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+ <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+ <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+ <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+ <ColorAlias name="mono panner bg" alias="color 67"/>
+ <ColorAlias name="mono panner fill" alias="color 74"/>
+ <ColorAlias name="mono panner outline" alias="color 70"/>
+ <ColorAlias name="mono panner position fill" alias="color 11"/>
+ <ColorAlias name="mono panner position outline" alias="color 70"/>
+ <ColorAlias name="mono panner text" alias="color 4"/>
+ <ColorAlias name="mouse mode button: fill active" alias="color 12"/>
+ <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+ <ColorAlias name="mute button: fill active" alias="color 75"/>
+ <ColorAlias name="mute button: led active" alias="color 4"/>
+ <ColorAlias name="name highlight fill" alias="color 18"/>
+ <ColorAlias name="name highlight outline" alias="color 23"/>
+ <ColorAlias name="nudge button: fill" alias="color 20"/>
+ <ColorAlias name="nudge button: fill active" alias="color 42"/>
+ <ColorAlias name="nudge button: led active" alias="color 8"/>
+ <ColorAlias name="nudge clock: background" alias="color 67"/>
+ <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+ <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+ <ColorAlias name="nudge clock: text" alias="color 12"/>
+ <ColorAlias name="page switch button: fill active" alias="color 92"/>
+ <ColorAlias name="page switch button: fill" alias="color 94"/>
+ <ColorAlias name="piano roll black" alias="color 76"/>
+ <ColorAlias name="piano roll black outline" alias="color 33"/>
+ <ColorAlias name="piano roll white" alias="color 45"/>
+ <ColorAlias name="play head" alias="color 9"/>
+ <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+ <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+ <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+ <ColorAlias name="pluginui toggle: fill" alias="color 71"/>
+ <ColorAlias name="pluginui toggle: fill active" alias="color 9"/>
+ <ColorAlias name="processor automation line" alias="color 77"/>
+ <ColorAlias name="processor control button: fill" alias="color 29"/>
+ <ColorAlias name="processor control button: fill active" alias="color 46"/>
+ <ColorAlias name="processor control button: led active" alias="color 62"/>
+ <ColorAlias name="processor control knob" alias="color 60"/>
+ <ColorAlias name="processor control knob: arc end" alias="color 70"/>
+ <ColorAlias name="processor control knob: arc start" alias="color 16"/>
+ <ColorAlias name="processor fader: fill" alias="color 16"/>
+ <ColorAlias name="processor fader: fill active" alias="color 78"/>
+ <ColorAlias name="processor fader: led active" alias="color 37"/>
+ <ColorAlias name="processor postfader: fill" alias="color 58"/>
+ <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+ <ColorAlias name="processor postfader: led active" alias="color 37"/>
+ <ColorAlias name="processor prefader: fill" alias="color 40"/>
+ <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+ <ColorAlias name="processor prefader: led active" alias="color 37"/>
+ <ColorAlias name="processor stub: fill" alias="color 46"/>
+ <ColorAlias name="processor stub: fill active" alias="color 46"/>
+ <ColorAlias name="processor sidechain: fill" alias="color 68"/>
+ <ColorAlias name="processor sidechain: led active" alias="color 37"/>
+ <ColorAlias name="pinrouting custom: led active" alias="color 86"/>
+ <ColorAlias name="pinrouting sidechain: led active" alias="color 50"/>
+ <ColorAlias name="punch button: fill" alias="color 20"/>
+ <ColorAlias name="punch button: fill active" alias="color 9"/>
+ <ColorAlias name="punch button: led active" alias="color 4"/>
+ <ColorAlias name="punch clock: background" alias="color 67"/>
+ <ColorAlias name="punch clock: cursor" alias="color 9"/>
+ <ColorAlias name="punch clock: edited text" alias="color 9"/>
+ <ColorAlias name="punch clock: text" alias="color 12"/>
+ <ColorAlias name="punch line" alias="color 83"/>
+ <ColorAlias name="range drag bar rect" alias="color 21"/>
+ <ColorAlias name="range drag rect" alias="color 56"/>
+ <ColorAlias name="range marker bar" alias="color 34"/>
+ <ColorAlias name="record enable button: fill active" alias="color 83"/>
+ <ColorAlias name="record enable button: led active" alias="color 85"/>
+ <ColorAlias name="recording rect" alias="color 86"/>
+ <ColorAlias name="recording waveform fill" alias="color 13"/>
+ <ColorAlias name="recording waveform outline" alias="color 43"/>
+ <ColorAlias name="region list automatic" alias="color 53"/>
+ <ColorAlias name="region list missing source" alias="color 9"/>
+ <ColorAlias name="region list whole file" alias="color 1"/>
+ <ColorAlias name="route button: fill active" alias="color 67"/>
+ <ColorAlias name="route button: led active" alias="color 8"/>
+ <ColorAlias name="rubber band rect" alias="color 88"/>
+ <ColorAlias name="rude audition: fill" alias="color 20"/>
+ <ColorAlias name="rude audition: fill active" alias="color 86"/>
+ <ColorAlias name="rude audition: led active" alias="color 4"/>
+ <ColorAlias name="rude isolate: fill" alias="color 42"/>
+ <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+ <ColorAlias name="rude isolate: led active" alias="color 4"/>
+ <ColorAlias name="rude solo: fill" alias="color 20"/>
+ <ColorAlias name="rude solo: fill active" alias="color 86"/>
+ <ColorAlias name="rude solo: led active" alias="color 4"/>
+ <ColorAlias name="ruler base" alias="color 67"/>
+ <ColorAlias name="ruler text" alias="color 22"/>
+ <ColorAlias name="secondary clock: background" alias="color 67"/>
+ <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+ <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+ <ColorAlias name="secondary clock: text" alias="color 91"/>
+ <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+ <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+ <ColorAlias name="selected midi note frame" alias="color 86"/>
+ <ColorAlias name="selected region base" alias="color 25"/>
+ <ColorAlias name="selected time axis frame" alias="color 86"/>
+ <ColorAlias name="selected waveform fill" alias="color 8"/>
+ <ColorAlias name="selected waveform outline" alias="color 67"/>
+ <ColorAlias name="selection" alias="color 94"/>
+ <ColorAlias name="selection clock: background" alias="color 67"/>
+ <ColorAlias name="selection clock: cursor" alias="color 9"/>
+ <ColorAlias name="selection clock: edited text" alias="color 9"/>
+ <ColorAlias name="selection clock: text" alias="color 12"/>
+ <ColorAlias name="selection rect" alias="color 95"/>
+ <ColorAlias name="send alert button: fill" alias="color 71"/>
+ <ColorAlias name="send alert button: fill active" alias="color 38"/>
+ <ColorAlias name="send alert button: led active" alias="color 4"/>
+ <ColorAlias name="send bg" alias="color 38"/>
+ <ColorAlias name="shuttle" alias="color 12"/>
+ <ColorAlias name="shuttle bg" alias="color 4"/>
+ <ColorAlias name="shuttle text" alias="color 13"/>
+ <ColorAlias name="silence" alias="color 98"/>
+ <ColorAlias name="silence text" alias="color 10"/>
+ <ColorAlias name="solo button: fill active" alias="color 12"/>
+ <ColorAlias name="solo button: led active" alias="color 4"/>
+ <ColorAlias name="solo isolate: fill" alias="color 25"/>
+ <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+ <ColorAlias name="solo isolate: led active" alias="color 9"/>
+ <ColorAlias name="solo safe: fill" alias="color 25"/>
+ <ColorAlias name="solo safe: fill active" alias="color 42"/>
+ <ColorAlias name="solo safe: led active" alias="color 9"/>
+ <ColorAlias name="stereo panner bg" alias="color 67"/>
+ <ColorAlias name="stereo panner fill" alias="color 74"/>
+ <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+ <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+ <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+ <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+ <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+ <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+ <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+ <ColorAlias name="stereo panner mono text" alias="color 4"/>
+ <ColorAlias name="stereo panner outline" alias="color 70"/>
+ <ColorAlias name="stereo panner rule" alias="color 70"/>
+ <ColorAlias name="stereo panner text" alias="color 4"/>
+ <ColorAlias name="stretch clock: background" alias="color 67"/>
+ <ColorAlias name="stretch clock: cursor" alias="color 8"/>
+ <ColorAlias name="stretch clock: edited text" alias="color 8"/>
+ <ColorAlias name="stretch clock: text" alias="color 91"/>
+ <ColorAlias name="sync mark" alias="color 75"/>
+ <ColorAlias name="tempo bar" alias="color 46"/>
+ <ColorAlias name="tempo curve" alias="color 62"/>
+ <ColorAlias name="tempo marker" alias="color 19"/>
+ <ColorAlias name="tempo marker music" alias="color 5"/>
+ <ColorAlias name="time axis frame" alias="color 4"/>
+ <ColorAlias name="time axis view item base" alias="color 94"/>
+ <ColorAlias name="time stretch fill" alias="color 100"/>
+ <ColorAlias name="time stretch outline" alias="color 94"/>
+ <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+ <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+ <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+ <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+ <ColorAlias name="transport active option button: led active" alias="color 8"/>
+ <ColorAlias name="transport button: fill active" alias="color 48"/>
+ <ColorAlias name="transport button: led active" alias="color 4"/>
+ <ColorAlias name="transport clock: background" alias="color 67"/>
+ <ColorAlias name="transport clock: cursor" alias="color 8"/>
+ <ColorAlias name="transport clock: edited text" alias="color 8"/>
+ <ColorAlias name="transport clock: text" alias="color 91"/>
+ <ColorAlias name="transport delta clock: background" alias="color 67"/>
+ <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="transport delta clock: text" alias="color 92"/>
+ <ColorAlias name="transport drag rect" alias="color 21"/>
+ <ColorAlias name="transport loop rect" alias="color 103"/>
+ <ColorAlias name="transport marker bar" alias="color 25"/>
+ <ColorAlias name="transport option button: fill active" alias="color 42"/>
+ <ColorAlias name="transport option button: led active" alias="color 8"/>
+ <ColorAlias name="transport punch rect" alias="color 80"/>
+ <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+ <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+ <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+ <ColorAlias name="trim handle" alias="color 18"/>
+ <ColorAlias name="trim handle locked" alias="color 86"/>
+ <ColorAlias name="trim knob" alias="color 60"/>
+ <ColorAlias name="trim knob: arc end" alias="color 81"/>
+ <ColorAlias name="trim knob: arc start" alias="color 82"/>
+ <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+ <ColorAlias name="video timeline bar" alias="color 46"/>
+ <ColorAlias name="waveform fill" alias="color 13"/>
+ <ColorAlias name="waveform outline" alias="color 4"/>
+ <ColorAlias name="zero line" alias="color 104"/>
+ <ColorAlias name="zoom button: fill active" alias="color 48"/>
+ <ColorAlias name="zoom button: led active" alias="color 8"/>
+ </ColorAliases>
+ <Modifiers>
+ <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+ <Modifier name="audio track base" modifier="= alpha:0.3"/>
+ <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+ <Modifier name="covered region base" modifier="= alpha:0.7"/>
+ <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+ <Modifier name="dragging region" modifier="= alpha:0.9"/>
+ <Modifier name="editable region" modifier="= alpha:0.25"/>
+ <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+ <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+ <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+ <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+ <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+ <Modifier name="marker bar" modifier="= alpha:0.5"/>
+ <Modifier name="measure line beat" modifier="= alpha:1.0"/>
+ <Modifier name="midi frame base" modifier="= alpha:0.4"/>
+ <Modifier name="midi note" modifier="= alpha:0.8"/>
+ <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+ <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+ <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+ <Modifier name="midi track base" modifier="= alpha:0.3"/>
+ <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+ <Modifier name="opaque region base" modifier="= alpha:0.75"/>
+ <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+ <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+ <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+ <Modifier name="recording rect" modifier="= alpha:0.25"/>
+ <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+ <Modifier name="selection rect" modifier="= alpha:0.4666"/>
+ <Modifier name="silence" modifier="= alpha:0.4784"/>
+ <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+ <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+ <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+ <Modifier name="transparent region base" modifier="= alpha:0.6"/>
+ <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+ <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+ </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/unastudia-ardour.colors b/gtk2_ardour/themes/unastudia-ardour.colors
new file mode 100644
index 0000000..fd0c148
--- /dev/null
+++ b/gtk2_ardour/themes/unastudia-ardour.colors
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="UnaStudia">
+ <Colors>
+ <Color name="color 109" value="0x5e656bff"/>
+ <Color name="color 108" value="0xcccdceff"/>
+ <Color name="color 107" value="0x565c64ff"/>
+ <Color name="color 106" value="0x000000ff"/>
+ <Color name="color 105" value="0x3e464eff"/>
+ <Color name="color 1" value="0x4e7e9cff"/>
+ <Color name="color 10" value="0xf0f0f0ff"/>
+ <Color name="color 100" value="0xe49c9cff"/>
+ <Color name="color 101" value="0xa06000ff"/>
+ <Color name="color 103" value="0x1e7753ff"/>
+ <Color name="color 104" value="0x7f7f7fff"/>
+ <Color name="color 11" value="0x9496a3ff"/>
+ <Color name="color 12" value="0xe0e2e5ff"/>
+ <Color name="color 13" value="0xffffffff"/>
+ <Color name="color 14" value="0x3c688aff"/>
+ <Color name="color 15" value="0x282b49ff"/>
+ <Color name="color 16" value="0x4e8099ff"/>
+ <Color name="color 17" value="0x00ffdfff"/>
+ <Color name="color 18" value="0x001affff"/>
+ <Color name="color 19" value="0xdd6363ff"/>
+ <Color name="color 2" value="0x595959ff"/>
+ <Color name="color 20" value="0x684d4dff"/>
+ <Color name="color 21" value="0x969696ff"/>
+ <Color name="color 22" value="0xe5e5e5ff"/>
+ <Color name="color 23" value="0x404145ff"/>
+ <Color name="color 24" value="0x9fbca2ff"/>
+ <Color name="color 25" value="0x4a4a4aff"/>
+ <Color name="color 26" value="0xc7c9d8ff"/>
+ <Color name="color 27" value="0x272a2eff"/>
+ <Color name="color 28" value="0x404145ff"/>
+ <Color name="color 29" value="0x202020ff"/>
+ <Color name="color 3" value="0x738299ff"/>
+ <Color name="color 30" value="0x404145ff"/>
+ <Color name="color 31" value="0xddddd8ff"/>
+ <Color name="color 32" value="0xeddc3dff"/>
+ <Color name="color 33" value="0xc0c4c9ff"/>
+ <Color name="color 34" value="0xcbd6daff"/>
+ <Color name="color 35" value="0x4250d0ff"/>
+ <Color name="color 36" value="0x473212ff"/>
+ <Color name="color 37" value="0x76b8e8ff"/>
+ <Color name="color 38" value="0x1ee8acff"/>
+ <Color name="color 39" value="0xcececeff"/>
+ <Color name="color 4" value="0x000000ff"/>
+ <Color name="color 40" value="0xacb3b9ff"/>
+ <Color name="color 41" value="0x497a5dff"/>
+ <Color name="color 42" value="0x404145ff"/>
+ <Color name="color 43" value="0x000424ff"/>
+ <Color name="color 44" value="0x004f3cff"/>
+ <Color name="color 45" value="0xa29e9eff"/>
+ <Color name="color 46" value="0x2f3841ff"/>
+ <Color name="color 47" value="0x008852ff"/>
+ <Color name="color 48" value="0x4495e3ff"/>
+ <Color name="color 49" value="0x0f0797ff"/>
+ <Color name="color 5" value="0x9dadc4ff"/>
+ <Color name="color 50" value="0xeeeeecff"/>
+ <Color name="color 51" value="0x383d37ff"/>
+ <Color name="color 52" value="0xbba34cff"/>
+ <Color name="color 53" value="0xf2c37dff"/>
+ <Color name="color 54" value="0xf48352ff"/>
+ <Color name="color 55" value="0xf85813ff"/>
+ <Color name="color 56" value="0x8ec794ff"/>
+ <Color name="color 57" value="0x7ea854ff"/>
+ <Color name="color 58" value="0x696e64ff"/>
+ <Color name="color 59" value="0xb2baffff"/>
+ <Color name="color 6" value="0x404145ff"/>
+ <Color name="color 60" value="0x50545aff"/>
+ <Color name="color 61" value="0x20242aff"/>
+ <Color name="color 62" value="0x8894ffff"/>
+ <Color name="color 63" value="0x5566ffff"/>
+ <Color name="color 64" value="0xa7acd4ff"/>
+ <Color name="color 65" value="0xb8cca3ff"/>
+ <Color name="color 66" value="0x4f2f00ff"/>
+ <Color name="color 67" value="0x282a2bff"/>
+ <Color name="color 68" value="0xc57805ff"/>
+ <Color name="color 69" value="0x030207ff"/>
+ <Color name="color 7" value="0x282b30ff"/>
+ <Color name="color 70" value="0x304057ff"/>
+ <Color name="color 71" value="0x5f5a58ff"/>
+ <Color name="color 72" value="0x5991A6ff"/>
+ <Color name="color 73" value="0x3240c0ff"/>
+ <Color name="color 74" value="0x7a9bccff"/>
+ <Color name="color 75" value="0xe6bb3bff"/>
+ <Color name="color 76" value="0x6c6e6aff"/>
+ <Color name="color 77" value="0x7aadf9ff"/>
+ <Color name="color 78" value="0x2e769cff"/>
+ <Color name="color 79" value="0x6b806dff"/>
+ <Color name="color 8" value="0xc20020ff"/>
+ <Color name="color 80" value="0x603535ff"/>
+ <Color name="color 81" value="0xa5a5a5ff"/>
+ <Color name="color 82" value="0x00c73eff"/>
+ <Color name="color 83" value="0xa80000ff"/>
+ <Color name="color 84" value="0x7b354aff"/>
+ <Color name="color 85" value="0xffa3bfff"/>
+ <Color name="color 86" value="0xcc2828ff"/>
+ <Color name="color 87" value="0x505050ff"/>
+ <Color name="color 88" value="0xc6c6c6ff"/>
+ <Color name="color 89" value="0xb6e8fdff"/>
+ <Color name="color 9" value="0xffffffff"/>
+ <Color name="color 90" value="0x2c2121ff"/>
+ <Color name="color 91" value="0x404145ff"/>
+ <Color name="color 92" value="0x8cd8f8ff"/>
+ <Color name="color 93" value="0x51578aff"/>
+ <Color name="color 94" value="0x636363ff"/>
+ <Color name="color 95" value="0xe4f4d3ff"/>
+ <Color name="color 96" value="0x24e59cff"/>
+ <Color name="color 97" value="0xccccccff"/>
+ <Color name="color 98" value="0x404145ff"/>
+ <Color name="color 99" value="0xacb3b9ff"/>
+ <Color name="meter color0" value="0x418cb1ff"/>
+ <Color name="meter color1" value="0x418cb1ff"/>
+ <Color name="meter color2" value="0x418cb1ff"/>
+ <Color name="meter color3" value="0x418cb1ff"/>
+ <Color name="meter color4" value="0x418cb1ff"/>
+ <Color name="meter color5" value="0x418cb1ff"/>
+ <Color name="meter color6" value="0x418cb1ff"/>
+ <Color name="meter color7" value="0x418cb1ff"/>
+ <Color name="meter color8" value="0x418cb1ff"/>
+ <Color name="meter color9" value="0x418cb1ff"/>
+ </Colors>
+ <ColorAliases>
+ <ColorAlias name="active crossfade" alias="color 105"/>
+ <ColorAlias name="arrange base" alias="color 67"/>
+ <ColorAlias name="audio automation track fill" alias="color 27"/>
+ <ColorAlias name="audio bus base" alias="color 27"/>
+ <ColorAlias name="audio master bus base" alias="color 27"/>
+ <ColorAlias name="audio track base" alias="color 107"/>
+ <ColorAlias name="automation line" alias="meter color1"/>
+ <ColorAlias name="automation track outline" alias="color 7"/>
+ <ColorAlias name="big clock active: background" alias="color 4"/>
+ <ColorAlias name="big clock active: cursor" alias="color 8"/>
+ <ColorAlias name="big clock active: edited text" alias="color 8"/>
+ <ColorAlias name="big clock active: text" alias="color 1"/>
+ <ColorAlias name="big clock: background" alias="color 67"/>
+ <ColorAlias name="big clock: cursor" alias="color 8"/>
+ <ColorAlias name="big clock: edited text" alias="color 8"/>
+ <ColorAlias name="big clock: text" alias="color 1"/>
+ <ColorAlias name="border color" alias="color 4"/>
+ <ColorAlias name="cd marker bar" alias="color 87"/>
+ <ColorAlias name="clipped waveform" alias="color 9"/>
+ <ColorAlias name="clock: background" alias="color 67"/>
+ <ColorAlias name="clock: cursor" alias="color 8"/>
+ <ColorAlias name="clock: edited text" alias="color 8"/>
+ <ColorAlias name="clock: text" alias="color 1"/>
+ <ColorAlias name="comment button: fill" alias="color 20"/>
+ <ColorAlias name="control point fill" alias="color 17"/>
+ <ColorAlias name="control point outline" alias="meter color3"/>
+ <ColorAlias name="control point selected fill" alias="color 72"/>
+ <ColorAlias name="control point selected outline" alias="color 9"/>
+ <ColorAlias name="covered region" alias="color 87"/>
+ <ColorAlias name="crossfade editor base" alias="color 15"/>
+ <ColorAlias name="crossfade editor line" alias="color 4"/>
+ <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+ <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+ <ColorAlias name="crossfade editor point outline" alias="color 1"/>
+ <ColorAlias name="crossfade editor wave" alias="color 13"/>
+ <ColorAlias name="crossfade line" alias="color 4"/>
+ <ColorAlias name="edit point" alias="color 1"/>
+ <ColorAlias name="entered automation line" alias="color 19"/>
+ <ColorAlias name="entered gain line" alias="color 19"/>
+ <ColorAlias name="entered marker" alias="color 19"/>
+ <ColorAlias name="feedback alert: fill" alias="color 25"/>
+ <ColorAlias name="feedback alert: fill active" alias="color 1"/>
+ <ColorAlias name="feedback alert: led active" alias="color 1"/>
+ <ColorAlias name="frame handle" alias="color 23"/>
+ <ColorAlias name="gain line" alias="color 6"/>
+ <ColorAlias name="gain line inactive" alias="color 24"/>
+ <ColorAlias name="generic button: fill" alias="color 42"/>
+ <ColorAlias name="generic button: fill active" alias="color 14"/>
+ <ColorAlias name="generic button: led active" alias="color 1"/>
+ <ColorAlias name="ghost track base" alias="color 46"/>
+ <ColorAlias name="ghost track midi outline" alias="color 4"/>
+ <ColorAlias name="ghost track wave" alias="color 29"/>
+ <ColorAlias name="ghost track wave clip" alias="color 29"/>
+ <ColorAlias name="ghost track wave fill" alias="color 29"/>
+ <ColorAlias name="ghost track zero line" alias="color 30"/>
+ <ColorAlias name="gtk_arm" alias="color 2"/>
+ <ColorAlias name="gtk_audio_bus" alias="color 27"/>
+ <ColorAlias name="gtk_audio_track" alias="color 107"/>
+ <ColorAlias name="gtk_automation_track_header" alias="color 27"/>
+ <ColorAlias name="gtk_background" alias="color 27"/>
+ <ColorAlias name="gtk_bases" alias="color 7"/>
+ <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+ <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+ <ColorAlias name="gtk_bright_color" alias="color 74"/>
+ <ColorAlias name="gtk_bright_indicator" alias="color 1"/>
+ <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+ <ColorAlias name="gtk_control_master" alias="color 64"/>
+ <ColorAlias name="gtk_control_text" alias="color 26"/>
+ <ColorAlias name="gtk_control_text2" alias="color 83"/>
+ <ColorAlias name="gtk_darkest" alias="color 67"/>
+ <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+ <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+ <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+ <ColorAlias name="gtk_foreground" alias="color 50"/>
+ <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+ <ColorAlias name="gtk_lightest" alias="color 13"/>
+ <ColorAlias name="gtk_midi_channel_selector" alias="color 15"/>
+ <ColorAlias name="gtk_midi_track" alias="color 105"/>
+ <ColorAlias name="gtk_monitor" alias="color 8"/>
+ <ColorAlias name="gtk_mono" alias="color 95"/>
+ <ColorAlias name="gtk_mute" alias="color 52"/>
+ <ColorAlias name="gtk_not_so_bright_indicator" alias="color 1"/>
+ <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+ <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+ <ColorAlias name="gtk_processor_frame_selected" alias="color 1"/>
+ <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+ <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+ <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+ <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+ <ColorAlias name="gtk_send_bg" alias="color 27"/>
+ <ColorAlias name="gtk_send_fg" alias="color 14"/>
+ <ColorAlias name="gtk_solo" alias="color 91"/>
+ <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 1"/>
+ <ColorAlias name="gtk_texts" alias="color 50"/>
+ <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+ <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+ <ColorAlias name="image track" alias="color 31"/>
+ <ColorAlias name="inactive crossfade" alias="color 1"/>
+ <ColorAlias name="inactive fade handle" alias="color 33"/>
+ <ColorAlias name="inactive group tab" alias="color 34"/>
+ <ColorAlias name="invert button: fill active" alias="color 1"/>
+ <ColorAlias name="invert button: led active" alias="color 37"/>
+ <ColorAlias name="location cd marker" alias="color 108"/>
+ <ColorAlias name="location loop" alias="color 108"/>
+ <ColorAlias name="location marker" alias="color 108"/>
+ <ColorAlias name="location punch" alias="color 108"/>
+ <ColorAlias name="location range" alias="color 108"/>
+ <ColorAlias name="lock button: fill active" alias="color 42"/>
+ <ColorAlias name="lock button: led active" alias="color 1"/>
+ <ColorAlias name="marker bar" alias="color 2"/>
+ <ColorAlias name="marker bar separator" alias="color 4"/>
+ <ColorAlias name="marker drag line" alias="color 1"/>
+ <ColorAlias name="marker label" alias="color 108"/>
+ <ColorAlias name="marker track" alias="color 31"/>
+ <ColorAlias name="master monitor section button active: fill" alias="color 42"/>
+ <ColorAlias name="master monitor section button active: fill active" alias="color 1"/>
+ <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+ <ColorAlias name="measure line bar" alias="color 105"/>
+ <ColorAlias name="measure line beat" alias="color 105"/>
+ <ColorAlias name="meter background bottom" alias="color 4"/>
+ <ColorAlias name="meter background top" alias="color 4"/>
+ <ColorAlias name="meter bar" alias="color 67"/>
+ <ColorAlias name="meter color BBC" alias="color 1"/>
+ <ColorAlias name="meter marker" alias="color 108"/>
+ <ColorAlias name="meterbridge label: fill" alias="color 42"/>
+ <ColorAlias name="meterbridge label: fill active" alias="color 1"/>
+ <ColorAlias name="meterbridge label: led" alias="color 9"/>
+ <ColorAlias name="meterbridge label: led active" alias="color 1"/>
+ <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+ <ColorAlias name="meterbridge peakindicator: fill active" alias="color 1"/>
+ <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+ <ColorAlias name="meterbridge peakindicator: led active" alias="color 1"/>
+ <ColorAlias name="meterbridge peaklabel" alias="color 1"/>
+ <ColorAlias name="meterstrip dpm bg" alias="color 4"/>
+ <ColorAlias name="meterstrip dpm fg" alias="color 1"/>
+ <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+ <ColorAlias name="meterstrip ppm fg" alias="color 1"/>
+ <ColorAlias name="meterstrip vu bg" alias="color 67"/>
+ <ColorAlias name="meterstrip vu fg" alias="color 1"/>
+ <ColorAlias name="midi automation track fill" alias="color 29"/>
+ <ColorAlias name="midi bus base" alias="color 107"/>
+ <ColorAlias name="midi device: fill" alias="color 25"/>
+ <ColorAlias name="midi device: fill active" alias="color 1"/>
+ <ColorAlias name="midi device: led active" alias="color 1"/>
+ <ColorAlias name="midi frame base" alias="color 27"/>
+ <ColorAlias name="midi input button: fill active" alias="color 1"/>
+ <ColorAlias name="midi input button: led active" alias="color 1"/>
+ <ColorAlias name="midi meter color0" alias="meter color0"/>
+ <ColorAlias name="midi meter color1" alias="meter color1"/>
+ <ColorAlias name="midi meter color2" alias="meter color2"/>
+ <ColorAlias name="midi meter color3" alias="meter color3"/>
+ <ColorAlias name="midi meter color4" alias="meter color4"/>
+ <ColorAlias name="midi meter color5" alias="meter color5"/>
+ <ColorAlias name="midi meter color6" alias="meter color6"/>
+ <ColorAlias name="midi meter color7" alias="meter color7"/>
+ <ColorAlias name="midi meter color8" alias="meter color8"/>
+ <ColorAlias name="midi meter color9" alias="meter color9"/>
+ <ColorAlias name="midi note inactive channel" alias="color 4"/>
+ <ColorAlias name="midi note max" alias="color 108"/>
+ <ColorAlias name="midi note mid" alias="color 108"/>
+ <ColorAlias name="midi note min" alias="color 108"/>
+ <ColorAlias name="midi note selected" alias="meter color7"/>
+ <ColorAlias name="midi note selected outline" alias="color 105"/>
+ <ColorAlias name="midi note velocity text" alias="color 2"/>
+ <ColorAlias name="midi patch change fill" alias="color 105"/>
+ <ColorAlias name="midi patch change outline" alias="color 17"/>
+ <ColorAlias name="midi select rect outline" alias="color 105"/>
+ <ColorAlias name="midi sysex fill" alias="color 105"/>
+ <ColorAlias name="midi sysex outline" alias="color 17"/>
+ <ColorAlias name="midi track base" alias="color 27"/>
+ <ColorAlias name="mixer strip button: fill active" alias="color 1"/>
+ <ColorAlias name="mixer strip button: led active" alias="color 1"/>
+ <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+ <ColorAlias name="mixer strip name button: led active" alias="color 1"/>
+ <ColorAlias name="monitor button: fill active" alias="color 1"/>
+ <ColorAlias name="monitor button: led active" alias="color 1"/>
+ <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+ <ColorAlias name="monitor section dim: fill active" alias="color 1"/>
+ <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+ <ColorAlias name="monitor section knob" alias="color 60"/>
+ <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+ <ColorAlias name="monitor section knob: arc start" alias="color 1"/>
+ <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+ <ColorAlias name="monitor section mono: fill active" alias="color 1"/>
+ <ColorAlias name="monitor section mono: led active" alias="color 1"/>
+ <ColorAlias name="monitor section processors present: fill" alias="color 1"/>
+ <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo model: led active" alias="color 1"/>
+ <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+ <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+ <ColorAlias name="monitor section solo option: led active" alias="color 1"/>
+ <ColorAlias name="mono panner bg" alias="color 67"/>
+ <ColorAlias name="mono panner fill" alias="color 1"/>
+ <ColorAlias name="mono panner outline" alias="color 70"/>
+ <ColorAlias name="mono panner position fill" alias="color 1"/>
+ <ColorAlias name="mono panner position outline" alias="color 70"/>
+ <ColorAlias name="mono panner text" alias="color 4"/>
+ <ColorAlias name="mouse mode button: fill active" alias="color 1"/>
+ <ColorAlias name="mouse mode button: led active" alias="color 1"/>
+ <ColorAlias name="mute button: fill active" alias="color 14"/>
+ <ColorAlias name="mute button: led active" alias="color 4"/>
+ <ColorAlias name="name highlight fill" alias="color 1"/>
+ <ColorAlias name="name highlight outline" alias="color 23"/>
+ <ColorAlias name="nudge button: fill" alias="color 42"/>
+ <ColorAlias name="nudge button: fill active" alias="color 14"/>
+ <ColorAlias name="nudge button: led active" alias="color 8"/>
+ <ColorAlias name="nudge clock: background" alias="color 67"/>
+ <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+ <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+ <ColorAlias name="nudge clock: text" alias="color 1"/>
+ <ColorAlias name="piano roll black" alias="color 4"/>
+ <ColorAlias name="piano roll black outline" alias="color 4"/>
+ <ColorAlias name="piano roll white" alias="meter color7"/>
+ <ColorAlias name="play head" alias="color 108"/>
+ <ColorAlias name="plugin bypass button: led active" alias="color 1"/>
+ <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+ <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+ <ColorAlias name="processor automation line" alias="color 1"/>
+ <ColorAlias name="processor control button: fill" alias="color 1"/>
+ <ColorAlias name="processor control button: fill active" alias="color 46"/>
+ <ColorAlias name="processor control button: led active" alias="color 1"/>
+ <ColorAlias name="processor fader: fill" alias="color 1"/>
+ <ColorAlias name="processor fader: fill active" alias="color 78"/>
+ <ColorAlias name="processor fader: led active" alias="color 1"/>
+ <ColorAlias name="processor postfader: fill" alias="color 78"/>
+ <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+ <ColorAlias name="processor postfader: led active" alias="color 1"/>
+ <ColorAlias name="processor prefader: fill" alias="color 48"/>
+ <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+ <ColorAlias name="processor prefader: led active" alias="color 1"/>
+ <ColorAlias name="processor stub: fill" alias="color 1"/>
+ <ColorAlias name="processor stub: fill active" alias="color 46"/>
+ <ColorAlias name="punch button: fill" alias="color 25"/>
+ <ColorAlias name="punch button: fill active" alias="color 1"/>
+ <ColorAlias name="punch button: led active" alias="color 4"/>
+ <ColorAlias name="punch clock: background" alias="color 67"/>
+ <ColorAlias name="punch clock: cursor" alias="color 9"/>
+ <ColorAlias name="punch clock: edited text" alias="color 1"/>
+ <ColorAlias name="punch clock: text" alias="color 1"/>
+ <ColorAlias name="punch line" alias="color 1"/>
+ <ColorAlias name="range drag bar rect" alias="color 21"/>
+ <ColorAlias name="range drag rect" alias="color 1"/>
+ <ColorAlias name="range marker bar" alias="color 29"/>
+ <ColorAlias name="record enable button: fill active" alias="color 1"/>
+ <ColorAlias name="record enable button: led active" alias="color 42"/>
+ <ColorAlias name="recording rect" alias="meter color6"/>
+ <ColorAlias name="recording waveform fill" alias="meter color2"/>
+ <ColorAlias name="recording waveform outline" alias="color 1"/>
+ <ColorAlias name="region list automatic" alias="color 53"/>
+ <ColorAlias name="region list missing source" alias="color 9"/>
+ <ColorAlias name="region list whole file" alias="color 1"/>
+ <ColorAlias name="route button: fill active" alias="color 1"/>
+ <ColorAlias name="route button: led active" alias="color 1"/>
+ <ColorAlias name="rubber band rect" alias="color 88"/>
+ <ColorAlias name="rude audition: fill" alias="color 25"/>
+ <ColorAlias name="rude audition: fill active" alias="color 1"/>
+ <ColorAlias name="rude audition: led active" alias="color 1"/>
+ <ColorAlias name="rude isolate: fill" alias="color 42"/>
+ <ColorAlias name="rude isolate: fill active" alias="color 1"/>
+ <ColorAlias name="rude isolate: led active" alias="color 1"/>
+ <ColorAlias name="rude solo: fill" alias="color 25"/>
+ <ColorAlias name="rude solo: fill active" alias="color 1"/>
+ <ColorAlias name="rude solo: led active" alias="color 1"/>
+ <ColorAlias name="ruler base" alias="color 67"/>
+ <ColorAlias name="ruler text" alias="color 108"/>
+ <ColorAlias name="secondary clock: background" alias="color 67"/>
+ <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+ <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+ <ColorAlias name="secondary clock: text" alias="color 1"/>
+ <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+ <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+ <ColorAlias name="selected midi note frame" alias="color 1"/>
+ <ColorAlias name="selected region base" alias="color 1"/>
+ <ColorAlias name="selected time axis frame" alias="color 1"/>
+ <ColorAlias name="selected waveform fill" alias="color 1"/>
+ <ColorAlias name="selected waveform outline" alias="color 1"/>
+ <ColorAlias name="selection" alias="color 1"/>
+ <ColorAlias name="selection clock: background" alias="color 67"/>
+ <ColorAlias name="selection clock: cursor" alias="color 9"/>
+ <ColorAlias name="selection clock: edited text" alias="color 1"/>
+ <ColorAlias name="selection clock: text" alias="color 1"/>
+ <ColorAlias name="selection rect" alias="color 1"/>
+ <ColorAlias name="send alert button: fill" alias="color 71"/>
+ <ColorAlias name="send alert button: fill active" alias="color 38"/>
+ <ColorAlias name="send alert button: led active" alias="color 4"/>
+ <ColorAlias name="send bg" alias="color 14"/>
+ <ColorAlias name="shuttle" alias="color 12"/>
+ <ColorAlias name="shuttle bg" alias="color 4"/>
+ <ColorAlias name="shuttle text" alias="color 13"/>
+ <ColorAlias name="silence" alias="color 98"/>
+ <ColorAlias name="silence text" alias="color 10"/>
+ <ColorAlias name="solo button: fill active" alias="color 1"/>
+ <ColorAlias name="solo button: led active" alias="color 4"/>
+ <ColorAlias name="solo isolate: fill" alias="color 25"/>
+ <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+ <ColorAlias name="solo isolate: led active" alias="color 1"/>
+ <ColorAlias name="solo safe: fill" alias="color 25"/>
+ <ColorAlias name="solo safe: fill active" alias="color 42"/>
+ <ColorAlias name="solo safe: led active" alias="color 1"/>
+ <ColorAlias name="stereo panner bg" alias="color 67"/>
+ <ColorAlias name="stereo panner fill" alias="color 1"/>
+ <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+ <ColorAlias name="stereo panner inverted fill" alias="color 48"/>
+ <ColorAlias name="stereo panner inverted outline" alias="meter color1"/>
+ <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+ <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+ <ColorAlias name="stereo panner mono fill" alias="color 1"/>
+ <ColorAlias name="stereo panner mono outline" alias="meter color1"/>
+ <ColorAlias name="stereo panner mono text" alias="color 4"/>
+ <ColorAlias name="stereo panner outline" alias="color 14"/>
+ <ColorAlias name="stereo panner rule" alias="color 70"/>
+ <ColorAlias name="stereo panner text" alias="color 4"/>
+ <ColorAlias name="sync mark" alias="color 1"/>
+ <ColorAlias name="tempo bar" alias="color 27"/>
+ <ColorAlias name="tempo curve" alias="color 62"/>
+ <ColorAlias name="tempo marker" alias="color 108"/>
+ <ColorAlias name="tempo marker music" alias="color 5"/>
+ <ColorAlias name="time axis frame" alias="color 4"/>
+ <ColorAlias name="time axis view item base" alias="color 94"/>
+ <ColorAlias name="time stretch fill" alias="color 100"/>
+ <ColorAlias name="time stretch outline" alias="color 94"/>
+ <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+ <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+ <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+ <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+ <ColorAlias name="transport active option button: led active" alias="color 1"/>
+ <ColorAlias name="transport button: fill active" alias="color 1"/>
+ <ColorAlias name="transport button: led active" alias="color 4"/>
+ <ColorAlias name="transport clock: background" alias="color 67"/>
+ <ColorAlias name="transport clock: cursor" alias="color 8"/>
+ <ColorAlias name="transport clock: edited text" alias="color 8"/>
+ <ColorAlias name="transport clock: text" alias="color 1"/>
+ <ColorAlias name="transport delta clock: background" alias="color 67"/>
+ <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+ <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+ <ColorAlias name="transport delta clock: text" alias="color 92"/>
+ <ColorAlias name="transport drag rect" alias="color 21"/>
+ <ColorAlias name="transport loop rect" alias="color 1"/>
+ <ColorAlias name="transport marker bar" alias="color 25"/>
+ <ColorAlias name="transport option button: fill active" alias="color 42"/>
+ <ColorAlias name="transport option button: led active" alias="color 1"/>
+ <ColorAlias name="transport punch rect" alias="color 1"/>
+ <ColorAlias name="transport recenable button: fill" alias="color 94"/>
+ <ColorAlias name="transport recenable button: fill active" alias="meter color1"/>
+ <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+ <ColorAlias name="trim handle" alias="color 1"/>
+ <ColorAlias name="trim handle locked" alias="color 86"/>
+ <ColorAlias name="trim knob" alias="color 60"/>
+ <ColorAlias name="trim knob: arc end" alias="color 81"/>
+ <ColorAlias name="trim knob: arc start" alias="color 1"/>
+ <ColorAlias name="verbose canvas cursor" alias="color 1"/>
+ <ColorAlias name="video timeline bar" alias="color 46"/>
+ <ColorAlias name="waveform fill" alias="color 106"/>
+ <ColorAlias name="waveform outline" alias="color 4"/>
+ <ColorAlias name="zero line" alias="color 106"/>
+ <ColorAlias name="zoom button: fill active" alias="color 48"/>
+ <ColorAlias name="zoom button: led active" alias="color 1"/>
+ </ColorAliases>
+ <Modifiers>
+ <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+ <Modifier name="audio track base" modifier="= alpha:0.4"/>
+ <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+ <Modifier name="covered region base" modifier="= alpha:0.7"/>
+ <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+ <Modifier name="dragging region" modifier="= alpha:0.9"/>
+ <Modifier name="editable region" modifier="= alpha:0.9"/>
+ <Modifier name="gain line inactive" modifier="= alpha:0.782113"/>
+ <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+ <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+ <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+ <Modifier name="loop rectangle" modifier="= alpha:0.3"/>
+ <Modifier name="marker bar" modifier="= alpha:0.5"/>
+ <Modifier name="measure line beat" modifier="= alpha:1"/>
+ <Modifier name="midi frame base" modifier="= alpha:0.4"/>
+ <Modifier name="midi note" modifier="= alpha:1"/>
+ <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+ <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+ <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+ <Modifier name="midi track base" modifier="= alpha:0.3"/>
+ <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+ <Modifier name="opaque region base" modifier="= alpha:0.75"/>
+ <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+ <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+ <Modifier name="piano roll white" modifier="= alpha:0.52366"/>
+ <Modifier name="recording rect" modifier="= alpha:0.25"/>
+ <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+ <Modifier name="selection rect" modifier="= alpha:0.282575"/>
+ <Modifier name="silence" modifier="= alpha:0.4784"/>
+ <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+ <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+ <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+ <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+ <Modifier name="transparent region base" modifier="= alpha:0.6"/>
+ <Modifier name="verbose canvas cursor" modifier="= alpha:0.30"/>
+ </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc
index 27db10c..540dddc 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -42,6 +42,7 @@
#include "ardour/profile.h"
#include "ardour_dialog.h"
+#include "floating_text_entry.h"
#include "gui_thread.h"
#include "public_editor.h"
#include "time_axis_view.h"
@@ -57,7 +58,7 @@
#include "tooltips.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -87,8 +88,7 @@ TimeAxisView::setup_sizes()
}
TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
- : AxisView (sess)
- , controls_table (3, 3)
+ : controls_table (5, 4)
, controls_button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_BOTH))
, _name_editing (false)
, height (0)
@@ -96,15 +96,12 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
, parent (rent)
, selection_group (0)
, _ghost_group (0)
- , _hidden (false)
+ , _hidden (true)
, in_destructor (false)
, _size_menu (0)
, _canvas_display (0)
, _y_position (0)
, _editor (ed)
- , name_entry (0)
- , ending_name_edit (false)
- , by_popup_menu (false)
, control_parent (0)
, _order (0)
, _effective_height (0)
@@ -145,25 +142,24 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
_ghost_group->lower_to_bottom();
_ghost_group->show();
- name_label.set_name ("TrackLabel");
+ name_label.set_name (X_("TrackNameEditor"));
name_label.set_alignment (0.0, 0.5);
name_label.set_width_chars (12);
set_tooltip (name_label, _("Track/Bus name (double click to edit)"));
- Gtk::Entry* an_entry = new Gtkmm2ext::FocusEntry;
- an_entry->set_name ("EditorTrackNameDisplay");
- Gtk::Requisition req;
- an_entry->size_request (req);
- name_label.set_size_request (-1, req.height);
- name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
- delete an_entry;
+ {
+ std::auto_ptr<Gtk::Entry> an_entry (new Gtkmm2ext::FocusEntry);
+ an_entry->set_name (X_("TrackNameEditor"));
+ Gtk::Requisition req;
+ an_entry->size_request (req);
- name_hbox.pack_end (name_label, true, true);
+ name_label.set_size_request (-1, req.height);
+ name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
+ }
// set min. track-header width if fader is not visible
- name_hbox.set_size_request(name_width_px, -1);
+ name_label.set_size_request(name_width_px, -1);
- name_hbox.show ();
name_label.show ();
controls_table.set_row_spacings (2);
@@ -171,10 +167,11 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
controls_table.set_border_width (2);
if (ARDOUR::Profile->get_mixbus() ) {
- controls_table.attach (name_hbox, 4, 5, 0, 2, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+ controls_table.attach (name_label, 4, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
} else {
- controls_table.attach (name_hbox, 1, 2, 0, 2, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+ controls_table.attach (name_label, 1, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
}
+
controls_table.show_all ();
controls_table.set_no_show_all ();
@@ -296,6 +293,7 @@ TimeAxisView::hide ()
* @param y y position.
* @param nth index for this TimeAxisView, increased if this view has children.
* @param parent parent component.
+*
* @return height of this TimeAxisView.
*/
guint32
@@ -510,7 +508,9 @@ TimeAxisView::controls_ebox_button_release (GdkEventButton* ev)
switch (ev->button) {
case 1:
- selection_click (ev);
+ if (selectable()) {
+ selection_click (ev);
+ }
break;
case 3:
@@ -608,148 +608,42 @@ TimeAxisView::set_height (uint32_t h, TrackHeightMode m)
_editor.override_visible_track_count ();
}
-bool
-TimeAxisView::name_entry_key_press (GdkEventKey* ev)
-{
- /* steal escape, tabs from GTK */
-
- switch (ev->keyval) {
- case GDK_Escape:
- case GDK_ISO_Left_Tab:
- case GDK_Tab:
- return true;
- }
- return false;
-}
-
-bool
-TimeAxisView::name_entry_key_release (GdkEventKey* ev)
-{
- TrackViewList::iterator i;
-
- switch (ev->keyval) {
- case GDK_Escape:
- end_name_edit (RESPONSE_CANCEL);
- 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:
- end_name_edit (RESPONSE_APPLY);
- return true;
-
- case GDK_Tab:
- end_name_edit (RESPONSE_ACCEPT);
- return true;
- default:
- break;
- }
-
- return false;
-}
-
-bool
-TimeAxisView::name_entry_focus_out (GdkEventFocus*)
-{
- if (by_popup_menu) {
- by_popup_menu = false;
- return false;
- }
- end_name_edit (RESPONSE_OK);
- return false;
-}
-
-void
-TimeAxisView::name_entry_populate_popup (Gtk::Menu *)
-{
- by_popup_menu = true;
-}
-
void
TimeAxisView::begin_name_edit ()
{
- if (name_entry) {
+ if (!can_edit_name()) {
return;
}
- if (can_edit_name()) {
-
- name_entry = manage (new Gtkmm2ext::FocusEntry);
+ Gtk::Window* toplevel = (Gtk::Window*) control_parent->get_toplevel();
+ FloatingTextEntry* fte = new FloatingTextEntry (toplevel, name_label.get_text ());
- name_entry->set_width_chars(8); // min width, entry expands
+ fte->set_name ("TrackNameEditor");
+ fte->use_text.connect (sigc::mem_fun (*this, &TimeAxisView::end_name_edit));
- name_entry->set_name ("EditorTrackNameDisplay");
- name_entry->signal_key_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_press), false);
- name_entry->signal_key_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_release), false);
- name_entry->signal_focus_out_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_focus_out));
- name_entry->set_text (name_label.get_text());
- name_entry->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &TimeAxisView::end_name_edit), RESPONSE_OK));
- name_entry->signal_populate_popup().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_populate_popup));
+ /* We want to new toplevel window to overlay the name label, so
+ * translate the coordinates of the upper left corner of the name label
+ * into the coordinate space of the top level window.
+ */
- if (name_label.is_ancestor (name_hbox)) {
- name_hbox.remove (name_label);
- }
+ int x, y;
+ int wx, wy;
- name_hbox.pack_end (*name_entry, true, true);
- name_entry->show ();
+ name_label.translate_coordinates (*toplevel, 0, 0, x, y);
+ toplevel->get_window()->get_origin (wx, wy);
- name_entry->select_region (0, -1);
- name_entry->set_state (STATE_SELECTED);
- name_entry->grab_focus ();
- name_entry->start_editing (0);
- }
+ fte->move (wx + x, wy + y);
+ fte->present ();
}
void
-TimeAxisView::end_name_edit (int response)
+TimeAxisView::end_name_edit (std::string str, int next_dir)
{
- if (!name_entry) {
- return;
+ if (!name_entry_changed (str)) {
+ next_dir = 0;
}
- if (ending_name_edit) {
- /* already doing this, and focus out or other event has caused
- us to re-enter this code.
- */
- return;
- }
-
- PBD::Unwinder<bool> uw (ending_name_edit, true);
-
- bool edit_next = false;
- bool edit_prev = false;
-
- switch (response) {
- case RESPONSE_CANCEL:
- break;
- case RESPONSE_OK:
- name_entry_changed ();
- break;
- case RESPONSE_ACCEPT:
- name_entry_changed ();
- edit_next = true;
- case RESPONSE_APPLY:
- name_entry_changed ();
- edit_prev = true;
- }
-
- /* this will delete the name_entry. but it will also drop focus, which
- * will cause another callback to this function, so set name_entry = 0
- * first to ensure we don't double-remove etc. etc.
- */
-
- Gtk::Entry* tmp = name_entry;
- name_entry = 0;
- name_hbox.remove (*tmp);
-
- /* put the name label back */
-
- name_hbox.pack_end (name_label);
- name_label.show ();
-
- if (edit_next) {
+ if (next_dir > 0) {
TrackViewList const & allviews = _editor.get_track_views ();
TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(), this);
@@ -763,7 +657,7 @@ TimeAxisView::end_name_edit (int response)
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*>(*i);
- if (rtav && rtav->route()->record_enabled()) {
+ if (rtav && (!rtav->is_track() || rtav->track()->rec_enable_control()->get_value())) {
continue;
}
@@ -779,7 +673,7 @@ TimeAxisView::end_name_edit (int response)
(*i)->begin_name_edit ();
}
- } else if (edit_prev) {
+ } else if (next_dir < 0) {
TrackViewList const & allviews = _editor.get_track_views ();
TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(), this);
@@ -794,7 +688,7 @@ TimeAxisView::end_name_edit (int response)
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*>(*i);
- if (rtav && rtav->route()->record_enabled()) {
+ if (rtav && (!rtav->is_track() || rtav->track()->rec_enable_control()->get_value())) {
continue;
}
@@ -812,9 +706,10 @@ TimeAxisView::end_name_edit (int response)
}
}
-void
-TimeAxisView::name_entry_changed ()
+bool
+TimeAxisView::name_entry_changed (string const&)
{
+ return true;
}
bool
@@ -826,6 +721,10 @@ TimeAxisView::can_edit_name () const
void
TimeAxisView::conditionally_add_to_selection ()
{
+ if (!selectable()) {
+ return;
+ }
+
Selection& s (_editor.get_selection ());
if (!s.selected (this)) {
@@ -845,11 +744,7 @@ TimeAxisView::popup_display_menu (guint32 when)
void
TimeAxisView::set_selected (bool yn)
{
- if (can_edit_name() && name_entry && name_entry->get_visible()) {
- end_name_edit (RESPONSE_CANCEL);
- }
-
- if (yn == _selected) {
+ if (yn == selected()) {
return;
}
@@ -1034,6 +929,8 @@ TimeAxisView::order_selection_trims (ArdourCanvas::Item *item, bool put_start_on
}
}
+// retuned rect is pushed back into the used_selection_rects list
+// in TimeAxisView::show_selection() which is the only caller.
SelectionRect *
TimeAxisView::get_selection_rect (uint32_t id)
{
@@ -1043,7 +940,9 @@ TimeAxisView::get_selection_rect (uint32_t id)
for (list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i) {
if ((*i)->id == id) {
- return (*i);
+ SelectionRect* ret = (*i);
+ used_selection_rects.erase (i);
+ return ret;
}
}
diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h
index 4be2380..f33379e 100644
--- a/gtk2_ardour/time_axis_view.h
+++ b/gtk2_ardour/time_axis_view.h
@@ -39,7 +39,9 @@
#include "pbd/signals.h"
#include "ardour/types.h"
+#include "ardour/presentation_info.h"
#include "ardour/region.h"
+
#include "evoral/Parameter.hpp"
#include "canvas/line.h"
@@ -55,6 +57,7 @@ namespace ARDOUR {
class Session;
class RouteGroup;
class Playlist;
+ class Stripable;
}
namespace Gtk {
@@ -135,6 +138,8 @@ class TimeAxisView : public virtual AxisView
void set_selected (bool);
+ virtual bool selectable() const { return true; }
+
/**
* potential handler for entered events
*/
@@ -180,7 +185,8 @@ class TimeAxisView : public virtual AxisView
*/
virtual bool paste (ARDOUR::framepos_t pos,
const Selection& selection,
- PasteContext& ctx) { return false; }
+ PasteContext& ctx,
+ const int32_t sub_num) { return false; }
virtual void set_selected_regionviews (RegionSelection&) {}
virtual void set_selected_points (PointSelection&) {}
@@ -213,8 +219,6 @@ class TimeAxisView : public virtual AxisView
typedef std::vector<boost::shared_ptr<TimeAxisView> > Children;
Children get_child_list ();
- SelectionRect* get_selection_rect(uint32_t id);
-
static uint32_t preset_height (Height);
protected:
@@ -229,9 +233,7 @@ class TimeAxisView : public virtual AxisView
Gtk::VBox time_axis_vbox;
Gtk::HBox time_axis_hbox;
Gtk::Frame time_axis_frame;
- Gtk::HBox name_hbox;
Gtk::HBox top_hbox;
- Gtk::Label name_label;
Gtk::Fixed scroomer_placeholder;
bool _name_editing;
uint32_t height; /* in canvas units */
@@ -254,20 +256,12 @@ class TimeAxisView : public virtual AxisView
virtual bool can_edit_name() const;
- bool name_entry_key_release (GdkEventKey *ev);
- bool name_entry_key_press (GdkEventKey *ev);
- bool name_entry_focus_out (GdkEventFocus *ev);
- void name_entry_populate_popup (Gtk::Menu *);
-
- Gtk::Entry* name_entry;
- bool ending_name_edit;
- bool by_popup_menu;
void begin_name_edit ();
- void end_name_edit (int);
+ void end_name_edit (std::string, int);
/* derived classes can override these */
- virtual void name_entry_changed ();
+ virtual bool name_entry_changed (std::string const&);
/** Handle mouse relaese on our LHS control name ebox.
*
@@ -310,7 +304,7 @@ class TimeAxisView : public virtual AxisView
void build_size_menu ();
-private:
+ private:
Gtk::VBox* control_parent;
int _order;
uint32_t _effective_height;
@@ -324,6 +318,8 @@ private:
static uint32_t extra_height;
static int const _max_order;
+ SelectionRect* get_selection_rect(uint32_t id);
+
void compute_heights ();
bool maybe_set_cursor (int y);
diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc
index 008dfab..61ac728 100644
--- a/gtk2_ardour/time_axis_view_item.cc
+++ b/gtk2_ardour/time_axis_view_item.cc
@@ -43,7 +43,7 @@
#include "utils.h"
#include "rgb_macros.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Editing;
@@ -160,7 +160,6 @@ TimeAxisViewItem::init (ArdourCanvas::Item* parent, double fpp, uint32_t base_co
{
group = new ArdourCanvas::Container (parent);
CANVAS_DEBUG_NAME (group, string_compose ("TAVI group for %1", get_item_name()));
- group->Event.connect (sigc::mem_fun (*this, &TimeAxisViewItem::canvas_group_event));
fill_color = base_color;
fill_color_name = "time axis view item base";
@@ -247,13 +246,14 @@ TimeAxisViewItem::init (ArdourCanvas::Item* parent, double fpp, uint32_t base_co
frame_handle_start = frame_handle_end = 0;
}
- set_color (base_color);
+ //set_color (base_color);
- set_duration (item_duration, this);
- set_position (start, this);
+ //set_duration (item_duration, this);
+ //set_position (start, this);
- Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&TimeAxisViewItem::parameter_changed, this, _1), gui_context ());
- UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &TimeAxisViewItem::parameter_changed));
+ group->Event.connect (sigc::mem_fun (*this, &TimeAxisViewItem::canvas_group_event));
+ //Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&TimeAxisViewItem::parameter_changed, this, _1), gui_context ());
+ //UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &TimeAxisViewItem::parameter_changed));
}
TimeAxisViewItem::~TimeAxisViewItem()
@@ -532,7 +532,7 @@ TimeAxisViewItem::set_name_text(const string& new_name)
name_text_width = pixel_width (new_name, NAME_FONT) + 2;
name_text->set (new_name);
manage_name_text ();
-
+ manage_name_highlight ();
}
/**
@@ -569,8 +569,6 @@ TimeAxisViewItem::set_height (double height)
selection_frame->set (frame->get().shrink (1.0));
}
}
-
- set_colors ();
}
void
diff --git a/gtk2_ardour/time_axis_view_item.h b/gtk2_ardour/time_axis_view_item.h
index 63cc564..749df46 100644
--- a/gtk2_ardour/time_axis_view_item.h
+++ b/gtk2_ardour/time_axis_view_item.h
@@ -235,9 +235,9 @@ class TimeAxisViewItem : public Selectable, public PBD::ScopedConnectionList
bool _recregion;
bool _automation; ///< true if this is an automation region view
bool _dragging;
+ double _width;
private:
- double _width;
void parameter_changed (std::string);
void manage_name_highlight ();
diff --git a/gtk2_ardour/time_fx_dialog.cc b/gtk2_ardour/time_fx_dialog.cc
index 7efabc9..be2140d 100644
--- a/gtk2_ardour/time_fx_dialog.cc
+++ b/gtk2_ardour/time_fx_dialog.cc
@@ -17,7 +17,6 @@
*/
-#include "time_fx_dialog.h"
#include <iostream>
#include <cstdlib>
@@ -28,20 +27,25 @@
#include "pbd/error.h"
#include "pbd/pthread_utils.h"
#include "pbd/memento_command.h"
+#include "pbd/unwind.h"
+#include "pbd/stacktrace.h"
#include <gtkmm2ext/utils.h>
+#include "audio_clock.h"
#include "editor.h"
#include "audio_time_axis.h"
#include "audio_region_view.h"
#include "region_selection.h"
+#include "time_fx_dialog.h"
+#include "timers.h"
#ifdef USE_RUBBERBAND
#include <rubberband/RubberBandStretcher.h>
using namespace RubberBand;
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -49,21 +53,27 @@ using namespace PBD;
using namespace Gtk;
using namespace Gtkmm2ext;
-TimeFXDialog::TimeFXDialog (Editor& e, bool pitch)
+TimeFXDialog::TimeFXDialog (Editor& e, bool pitch, framecnt_t oldlen, framecnt_t new_length, framepos_t position)
: ArdourDialog (X_("time fx dialog"))
, editor (e)
, pitching (pitch)
+ , quick_button (_("Quick but Ugly"))
+ , antialias_button (_("Skip Anti-aliasing"))
+ , stretch_opts_label (_("Contents"))
+ , precise_button (_("Minimize time distortion"))
+ , preserve_formants_button(_("Preserve Formants"))
+ , original_length (oldlen)
, pitch_octave_adjustment (0.0, -4.0, 4.0, 1, 2.0)
, pitch_semitone_adjustment (0.0, -12.0, 12.0, 1.0, 4.0)
, pitch_cent_adjustment (0.0, -499.0, 500.0, 5.0, 15.0)
, pitch_octave_spinner (pitch_octave_adjustment)
, pitch_semitone_spinner (pitch_semitone_adjustment)
, pitch_cent_spinner (pitch_cent_adjustment)
- , quick_button (_("Quick but Ugly"))
- , antialias_button (_("Skip Anti-aliasing"))
- , stretch_opts_label (_("Contents:"))
- , precise_button (_("Minimize time distortion"))
- , preserve_formants_button(_("Preserve Formants"))
+ , duration_adjustment (100.0, -1000.0, 1000.0, 1.0, 10.0)
+ , duration_clock (0)
+ , ignore_adjustment_change (false)
+ , ignore_clock_change (false)
+ , progress (0.0f)
{
set_modal (true);
set_skip_taskbar_hint (true);
@@ -123,31 +133,60 @@ TimeFXDialog::TimeFXDialog (Editor& e, bool pitch)
upper_button_box.pack_start (*table, false, true);
} else {
- Table* table = manage (new Table (2, 3, false));
+ Table* table = manage (new Table (4, 2, false));
+ int row = 0;
+
table->set_row_spacings (6);
- table->set_col_spacing (1, 6);
- l = manage (new Label ("", Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false ));
- l->set_padding (8, 0);
- table->attach (*l, 0, 1, 0, 2, Gtk::FILL, Gtk::FILL, 0, 0);
+ table->set_col_spacings (12);
#ifdef USE_RUBBERBAND
vector<string> strings;
+ duration_clock = manage (new AudioClock (X_("stretch"), true, X_("stretch"), true, false, true, false, true));
+ duration_clock->set_session (e.session());
+ duration_clock->set (new_length, true);
+ duration_clock->set_mode (AudioClock::BBT);
+ duration_clock->set_bbt_reference (position);
+
+ Gtk::Alignment* clock_align = manage (new Gtk::Alignment);
+ clock_align->add (*duration_clock);
+ clock_align->set (0.0, 0.5, 0.0, 1.0);
+
+ l = manage (new Gtk::Label (_("Duration")));
+ table->attach (*l, 0, 1, row, row+1, Gtk::FILL, Gtk::FILL, 0, 0);
+ table->attach (*clock_align, 1, 2, row, row+1, Gtk::AttachOptions (Gtk::EXPAND|Gtk::FILL), Gtk::FILL, 0, 0);
+ row++;
- table->attach (stretch_opts_label, 1, 2, 0, 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ const double fract = ((double) new_length) / original_length;
+ /* note the *100.0 to convert fract into a percentage */
+ duration_adjustment.set_value (fract*100.0);
+ Gtk::SpinButton* spinner = manage (new Gtk::SpinButton (duration_adjustment, 1.0, 3));
+
+ l = manage (new Gtk::Label (_("Percent")));
+ table->attach (*l, 0, 1, row, row+1, Gtk::FILL, Gtk::FILL, 0, 0);
+ table->attach (*spinner, 1, 2, row, row+1, Gtk::FILL, Gtk::FILL, 0, 0);
+ row++;
+
+ table->attach (stretch_opts_label, 0, 1, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
set_popdown_strings (stretch_opts_selector, editor.rb_opt_strings);
/* set default */
stretch_opts_selector.set_active_text (editor.rb_opt_strings[editor.rb_current_opt]);
- table->attach (stretch_opts_selector, 2, 3, 0, 1, Gtk::FILL, Gtk::EXPAND & Gtk::FILL, 0, 0);
+ table->attach (stretch_opts_selector, 1, 2, row, row+1, Gtk::FILL, Gtk::EXPAND & Gtk::FILL, 0, 0);
+ row++;
- table->attach (precise_button, 1, 3, 1, 2, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ table->attach (precise_button, 0, 2, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ row++;
+
+ duration_clock->ValueChanged.connect (sigc::mem_fun (*this, &TimeFXDialog::duration_clock_changed));
+ duration_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &TimeFXDialog::duration_adjustment_changed));
#else
quick_button.set_name (N_("TimeFXButton"));
- table->attach (quick_button, 1, 3, 0, 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ table->attach (quick_button, 1, 3, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ row++;
antialias_button.set_name (N_("TimeFXButton"));
- table->attach (antialias_button, 1, 3, 1, 2, Gtk::FILL, Gtk::EXPAND, 0, 0);
+ table->attach (antialias_button, 1, 3, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
#endif
@@ -177,9 +216,30 @@ TimeFXDialog::TimeFXDialog (Editor& e, bool pitch)
}
void
+TimeFXDialog::start_updates ()
+{
+ update_connection = Timers::rapid_connect (sigc::mem_fun (*this, &TimeFXDialog::timer_update));
+}
+
+void
TimeFXDialog::update_progress_gui (float p)
{
- progress_bar.set_fraction (p);
+ /* time/pitch FX are applied in a dedicated thread, so we cannot just
+ update the GUI when notified about progress. That is deferred to a
+ timer-driven callback which will ensure that the visual progress
+ indicator is updated.
+ */
+ progress = p;
+}
+
+void
+TimeFXDialog::timer_update ()
+{
+ progress_bar.set_fraction (progress);
+
+ if (request.done || request.cancel) {
+ update_connection.disconnect ();
+ }
}
void
@@ -199,3 +259,59 @@ TimeFXDialog::delete_in_progress (GdkEventAny*)
return TRUE;
}
+float
+TimeFXDialog::get_time_fraction () const
+{
+ if (pitching) {
+ return 1.0;
+ }
+
+ return duration_adjustment.get_value() / 100.0;
+}
+
+float
+TimeFXDialog::get_pitch_fraction () const
+{
+ if (!pitching) {
+ return 1.0;
+ }
+
+ float cents = pitch_octave_adjustment.get_value() * 1200.0;
+
+ cents += pitch_semitone_adjustment.get_value() * 100.0;
+ cents += pitch_cent_adjustment.get_value();
+
+ if (cents == 0.0) {
+ return 1.0;
+ }
+
+ // one octave == 1200 cents
+ // adding one octave doubles the frequency
+ // ratio is 2^^octaves
+
+ return pow(2, cents/1200);
+}
+
+void
+TimeFXDialog::duration_adjustment_changed ()
+{
+ if (ignore_adjustment_change) {
+ return;
+ }
+
+ PBD::Unwinder<bool> uw (ignore_clock_change, true);
+
+ duration_clock->set ((framecnt_t) (original_length * (duration_adjustment.get_value()/ 100.0)));
+}
+
+void
+TimeFXDialog::duration_clock_changed ()
+{
+ if (ignore_clock_change) {
+ return;
+ }
+
+ PBD::Unwinder<bool> uw (ignore_adjustment_change, true);
+
+ duration_adjustment.set_value (100.0 * (duration_clock->current_duration() / (double) original_length));
+}
diff --git a/gtk2_ardour/time_fx_dialog.h b/gtk2_ardour/time_fx_dialog.h
index a7e4a7a..03e0ccf 100644
--- a/gtk2_ardour/time_fx_dialog.h
+++ b/gtk2_ardour/time_fx_dialog.h
@@ -1,26 +1,32 @@
/*
- Copyright (C) 2000-2009 Paul Davis
+ Copyright (C) 2000-2009 Paul Davis
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __ardour_time_fx_dialog_h__
#define __ardour_time_fx_dialog_h__
-#include <gtkmm.h>
+#include <gtkmm/adjustment.h>
+#include <gtkmm/spinbutton.h>
+#include <gtkmm/progressbar.h>
+#include <gtkmm/box.h>
+#include <gtkmm/comboboxtext.h>
+#include <gtkmm/label.h>
+#include <gtkmm/button.h>
#include "ardour/timefx_request.h"
@@ -28,48 +34,65 @@
#include "progress_reporter.h"
class Editor;
+class AudioClock;
class TimeFXDialog : public ArdourDialog, public ProgressReporter
{
-public:
- ARDOUR::TimeFXRequest request;
- Editor& editor;
- bool pitching;
- Gtk::Adjustment pitch_octave_adjustment;
- Gtk::Adjustment pitch_semitone_adjustment;
- Gtk::Adjustment pitch_cent_adjustment;
- Gtk::SpinButton pitch_octave_spinner;
- Gtk::SpinButton pitch_semitone_spinner;
- Gtk::SpinButton pitch_cent_spinner;
- Gtk::ProgressBar progress_bar;
- ARDOUR::RegionList regions;
-
- /* SoundTouch */
- Gtk::CheckButton quick_button;
- Gtk::CheckButton antialias_button;
- Gtk::VBox upper_button_box;
-
- /* RubberBand */
- Gtk::ComboBoxText stretch_opts_selector;
- Gtk::Label stretch_opts_label;
- Gtk::CheckButton precise_button;
- Gtk::CheckButton preserve_formants_button;
-
- Gtk::Button* cancel_button;
- Gtk::Button* action_button;
- Gtk::VBox packer;
- int status;
-
- TimeFXDialog (Editor& e, bool for_pitch);
-
- sigc::connection first_cancel;
- sigc::connection first_delete;
- void cancel_in_progress ();
- gint delete_in_progress (GdkEventAny*);
-
-private:
-
- void update_progress_gui (float);
+ public:
+ /* We need a position so that BBT mode in the clock can function */
+ TimeFXDialog (Editor& e, bool for_pitch, ARDOUR::framecnt_t old_length, ARDOUR::framecnt_t new_length, ARDOUR::framepos_t position);
+
+ ARDOUR::TimeFXRequest request;
+ Editor& editor;
+ bool pitching;
+ Gtk::ProgressBar progress_bar;
+ ARDOUR::RegionList regions;
+
+ /* SoundTouch */
+ Gtk::CheckButton quick_button;
+ Gtk::CheckButton antialias_button;
+ Gtk::VBox upper_button_box;
+
+ /* RubberBand */
+ Gtk::ComboBoxText stretch_opts_selector;
+ Gtk::Label stretch_opts_label;
+ Gtk::CheckButton precise_button;
+ Gtk::CheckButton preserve_formants_button;
+
+ Gtk::Button* cancel_button;
+ Gtk::Button* action_button;
+ Gtk::VBox packer;
+ int status;
+
+ sigc::connection first_cancel;
+ sigc::connection first_delete;
+ void cancel_in_progress ();
+ gint delete_in_progress (GdkEventAny*);
+
+ float get_time_fraction () const;
+ float get_pitch_fraction () const;
+
+ void start_updates ();
+
+ private:
+ ARDOUR::framecnt_t original_length;
+ Gtk::Adjustment pitch_octave_adjustment;
+ Gtk::Adjustment pitch_semitone_adjustment;
+ Gtk::Adjustment pitch_cent_adjustment;
+ Gtk::SpinButton pitch_octave_spinner;
+ Gtk::SpinButton pitch_semitone_spinner;
+ Gtk::SpinButton pitch_cent_spinner;
+ Gtk::Adjustment duration_adjustment;
+ AudioClock* duration_clock;
+ bool ignore_adjustment_change;
+ bool ignore_clock_change;
+ sigc::connection update_connection;
+ float progress;
+
+ void update_progress_gui (float);
+ void duration_clock_changed ();
+ void duration_adjustment_changed ();
+ void timer_update ();
};
#endif /* __ardour_time_fx_dialog_h__ */
diff --git a/gtk2_ardour/time_info_box.cc b/gtk2_ardour/time_info_box.cc
index a26ec50..d0d6871 100644
--- a/gtk2_ardour/time_info_box.cc
+++ b/gtk2_ardour/time_info_box.cc
@@ -36,7 +36,7 @@
#include "control_point.h"
#include "automation_line.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace ARDOUR;
@@ -58,12 +58,6 @@ TimeInfoBox::TimeInfoBox ()
punch_start = new AudioClock ("punch-start", false, "punch", false, false, false, false);
punch_end = new AudioClock ("punch-end", false, "punch", false, false, false, false);
- selection_start->set_draw_background (false);
- selection_end->set_draw_background (false);
- selection_length->set_draw_background (false);
- punch_start->set_draw_background (false);
- punch_end->set_draw_background (false);
-
selection_title.set_text (_("Selection"));
punch_title.set_text (_("Punch"));
@@ -193,7 +187,7 @@ TimeInfoBox::region_property_change (boost::shared_ptr<ARDOUR::Region> /* r */,
* RegionView (not Region itself).
*/
- selection_changed ();
+ //selection_changed ();
}
bool
diff --git a/gtk2_ardour/time_selection.cc b/gtk2_ardour/time_selection.cc
index 8545a34..2f40dcb 100644
--- a/gtk2_ardour/time_selection.cc
+++ b/gtk2_ardour/time_selection.cc
@@ -24,7 +24,7 @@
#include "time_selection.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
diff --git a/gtk2_ardour/timecode_tester.cc b/gtk2_ardour/timecode_tester.cc
deleted file mode 100644
index 9856231..0000000
--- a/gtk2_ardour/timecode_tester.cc
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- Copyright (C) 2012 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-void
-AudioClock::timecode_tester ()
-{
-#if 0
-#define Timecode_SAMPLE_TEST_1
-#define Timecode_SAMPLE_TEST_2
-#define Timecode_SAMPLE_TEST_3
-#define Timecode_SAMPLE_TEST_4
-#define Timecode_SAMPLE_TEST_5
-#define Timecode_SAMPLE_TEST_6
-#define Timecode_SAMPLE_TEST_7
-
- // Testcode for timecode<->sample conversions (P.S.)
- Timecode::Time timecode1;
- framepos_t sample1;
- framepos_t oldsample = 0;
- Timecode::Time timecode2;
- framecnt_t sample_increment;
-
- sample_increment = (framecnt_t)rint(_session->frame_rate() / _session->timecode_frames_per_second);
-
-#ifdef Timecode_SAMPLE_TEST_1
- // Test 1: use_offset = false, use_subframes = false
- cout << "use_offset = false, use_subframes = false" << endl;
- for (int i = 0; i < 108003; i++) {
- _session->timecode_to_sample( timecode1, sample1, false /* use_offset */, false /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, false /* use_offset */, false /* use_subframes */ );
-
- if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
- cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
- cout << "timecode1: " << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode1: " << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_increment( timecode1 );
- }
-
- cout << "sample_increment: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_2
- // Test 2: use_offset = true, use_subframes = false
- cout << "use_offset = true, use_subframes = false" << endl;
-
- timecode1.hours = 0;
- timecode1.minutes = 0;
- timecode1.seconds = 0;
- timecode1.frames = 0;
- timecode1.subframes = 0;
- sample1 = oldsample = 0;
-
- _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
- cout << "Starting at sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
- for (int i = 0; i < 108003; i++) {
- _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-// cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-// cout << "sample: " << sample1 << endl;
-// cout << "sample: " << sample1 << " -> ";
-// cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
- if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
- cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_increment( timecode1 );
- }
-
- cout << "sample_increment: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_3
- // Test 3: use_offset = true, use_subframes = false, decrement
- cout << "use_offset = true, use_subframes = false, decrement" << endl;
-
- _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
- cout << "Starting at sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
- for (int i = 0; i < 108003; i++) {
- _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-// cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-// cout << "sample: " << sample1 << endl;
-// cout << "sample: " << sample1 << " -> ";
-// cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
- if ((i > 0) && ( ((oldsample - sample1) != sample_increment) && ((oldsample - sample1) != (sample_increment + 1)) && ((oldsample - sample1) != (sample_increment - 1)))) {
- cout << "ERROR: sample increment not right: " << (oldsample - sample1) << " != " << sample_increment << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_decrement( timecode1 );
- }
-
- cout << "sample_decrement: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_4
- // Test 4: use_offset = true, use_subframes = true
- cout << "use_offset = true, use_subframes = true" << endl;
-
- for (long sub = 5; sub < 80; sub += 5) {
- timecode1.hours = 0;
- timecode1.minutes = 0;
- timecode1.seconds = 0;
- timecode1.frames = 0;
- timecode1.subframes = 0;
- sample1 = oldsample = (sample_increment * sub) / 80;
-
- _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, true /* use_subframes */ );
-
- cout << "starting at sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
- for (int i = 0; i < 108003; i++) {
- _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, true /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, true /* use_subframes */ );
-
- if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
- cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- //break;
- }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames || timecode2.subframes != timecode1.subframes) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_increment( timecode1 );
- }
-
- cout << "sample_increment: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
- for (int i = 0; i < 108003; i++) {
- _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, true /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, true /* use_subframes */ );
-
- if ((i > 0) && ( ((oldsample - sample1) != sample_increment) && ((oldsample - sample1) != (sample_increment + 1)) && ((oldsample - sample1) != (sample_increment - 1)))) {
- cout << "ERROR: sample increment not right: " << (oldsample - sample1) << " != " << sample_increment << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- //break;
- }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames || timecode2.subframes != timecode1.subframes) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_decrement( timecode1 );
- }
-
- cout << "sample_decrement: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- }
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_5
- // Test 5: use_offset = true, use_subframes = false, increment seconds
- cout << "use_offset = true, use_subframes = false, increment seconds" << endl;
-
- timecode1.hours = 0;
- timecode1.minutes = 0;
- timecode1.seconds = 0;
- timecode1.frames = 0;
- timecode1.subframes = 0;
- sample1 = oldsample = 0;
- sample_increment = _session->frame_rate();
-
- _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
- cout << "Starting at sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
- for (int i = 0; i < 3600; i++) {
- _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-// cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-// cout << "sample: " << sample1 << endl;
-// cout << "sample: " << sample1 << " -> ";
-// cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-// if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-// {
-// cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-// break;
-// }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_increment_seconds( timecode1 );
- }
-
- cout << "sample_increment: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_6
- // Test 6: use_offset = true, use_subframes = false, increment minutes
- cout << "use_offset = true, use_subframes = false, increment minutes" << endl;
-
- timecode1.hours = 0;
- timecode1.minutes = 0;
- timecode1.seconds = 0;
- timecode1.frames = 0;
- timecode1.subframes = 0;
- sample1 = oldsample = 0;
- sample_increment = _session->frame_rate() * 60;
-
- _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
- cout << "Starting at sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
- for (int i = 0; i < 60; i++) {
- _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-// cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-// cout << "sample: " << sample1 << endl;
-// cout << "sample: " << sample1 << " -> ";
-// cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-// if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-// {
-// cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-// break;
-// }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_increment_minutes( timecode1 );
- }
-
- cout << "sample_increment: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_7
- // Test 7: use_offset = true, use_subframes = false, increment hours
- cout << "use_offset = true, use_subframes = false, increment hours" << endl;
-
- timecode1.hours = 0;
- timecode1.minutes = 0;
- timecode1.seconds = 0;
- timecode1.frames = 0;
- timecode1.subframes = 0;
- sample1 = oldsample = 0;
- sample_increment = _session->frame_rate() * 60 * 60;
-
- _session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
- cout << "Starting at sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
- for (int i = 0; i < 10; i++) {
- _session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
- _session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-// cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-// cout << "sample: " << sample1 << endl;
-// cout << "sample: " << sample1 << " -> ";
-// cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-// if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-// {
-// cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-// break;
-// }
-
- if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
- cout << "ERROR: timecode2 not equal timecode1" << endl;
- cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
- cout << "sample: " << sample1 << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
- break;
- }
- oldsample = sample1;
- _session->timecode_increment_hours( timecode1 );
- }
-
- cout << "sample_increment: " << sample_increment << endl;
- cout << "sample: " << sample1 << " -> ";
- cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#endif
-}
diff --git a/gtk2_ardour/track_selection.cc b/gtk2_ardour/track_selection.cc
index 92efbd4..6937eb6 100644
--- a/gtk2_ardour/track_selection.cc
+++ b/gtk2_ardour/track_selection.cc
@@ -18,7 +18,10 @@
*/
#include <algorithm>
+
#include "ardour/route_group.h"
+#include "control_protocol/control_protocol.h"
+
#include "track_selection.h"
#include "time_axis_view.h"
#include "public_editor.h"
@@ -57,4 +60,3 @@ TrackSelection::add (TrackViewList const & t)
return added;
}
-
diff --git a/gtk2_ardour/track_view_list.cc b/gtk2_ardour/track_view_list.cc
index cc29a57..a89565c 100644
--- a/gtk2_ardour/track_view_list.cc
+++ b/gtk2_ardour/track_view_list.cc
@@ -19,6 +19,7 @@
#include <algorithm>
#include "track_view_list.h"
+#include "route_time_axis.h"
using namespace std;
@@ -51,3 +52,16 @@ TrackViewList::add (TrackViewList const & t)
return added;
}
+
+ARDOUR::RouteList
+TrackViewList::routelist () const
+{
+ ARDOUR::RouteList rl;
+ for (TrackViewList::const_iterator i = begin (); i != end (); ++i) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+ if (rtv) {
+ rl.push_back (rtv->route ());
+ }
+ }
+ return rl;
+}
diff --git a/gtk2_ardour/track_view_list.h b/gtk2_ardour/track_view_list.h
index 24f2646..227cb16 100644
--- a/gtk2_ardour/track_view_list.h
+++ b/gtk2_ardour/track_view_list.h
@@ -20,6 +20,7 @@
#ifndef __ardour_gtk_track_view_list_h__
#define __ardour_gtk_track_view_list_h__
+#include "ardour/types.h"
#include <list>
#include <set>
@@ -37,6 +38,7 @@ public:
bool contains (TimeAxisView const *) const;
TrackViewList filter_to_unique_playlists ();
+ ARDOUR::RouteList routelist () const;
};
#endif
diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc
index 2883f87..6b66123 100644
--- a/gtk2_ardour/transcode_ffmpeg.cc
+++ b/gtk2_ardour/transcode_ffmpeg.cc
@@ -31,7 +31,7 @@
#include "utils_videotl.h"
#include "video_tool_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace VideoUtils;
diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc
index 146ca0c..50e4740 100644
--- a/gtk2_ardour/transcode_video_dialog.cc
+++ b/gtk2_ardour/transcode_video_dialog.cc
@@ -44,7 +44,7 @@
#include "opts.h"
#include "transcode_video_dialog.h"
#include "utils_videotl.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
diff --git a/gtk2_ardour/transform_dialog.cc b/gtk2_ardour/transform_dialog.cc
index 0c21de1..7199b2a 100644
--- a/gtk2_ardour/transform_dialog.cc
+++ b/gtk2_ardour/transform_dialog.cc
@@ -23,7 +23,7 @@
#include "transform_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/gtk2_ardour/transform_dialog.h b/gtk2_ardour/transform_dialog.h
index 5111aa7..df7a1c8 100644
--- a/gtk2_ardour/transform_dialog.h
+++ b/gtk2_ardour/transform_dialog.h
@@ -31,7 +31,6 @@
#include "ardour/midi_model.h"
#include "ardour/transform.h"
#include "ardour/types.h"
-#include "evoral/types.hpp"
#include "ardour_dialog.h"
diff --git a/gtk2_ardour/transpose_dialog.cc b/gtk2_ardour/transpose_dialog.cc
index 0913102..b5f17ab 100644
--- a/gtk2_ardour/transpose_dialog.cc
+++ b/gtk2_ardour/transpose_dialog.cc
@@ -22,7 +22,7 @@
#include <gtkmm/label.h>
#include <gtkmm/stock.h>
#include "transpose_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
diff --git a/gtk2_ardour/ui_config.cc b/gtk2_ardour/ui_config.cc
index c001e5c..c6e538b 100644
--- a/gtk2_ardour/ui_config.cc
+++ b/gtk2_ardour/ui_config.cc
@@ -32,28 +32,30 @@
#include <pango/pangoft2.h> // for fontmap resolution control for GnomeCanvas
#include <pango/pangocairo.h> // for fontmap resolution control for GnomeCanvas
-#include "pbd/gstdio_compat.h"
#include <glibmm/miscutils.h>
#include <gtkmm/settings.h>
#include "pbd/convert.h"
+#include "pbd/error.h"
#include "pbd/failed_constructor.h"
-#include "pbd/xml++.h"
#include "pbd/file_utils.h"
+#include "pbd/gstdio_compat.h"
#include "pbd/locale_guard.h"
-#include "pbd/error.h"
-#include "pbd/stacktrace.h"
-
-#include "gtkmm2ext/rgb_macros.h"
-#include "gtkmm2ext/gtk_ui.h"
+#include "pbd/unwind.h"
+#include "pbd/xml++.h"
#include "ardour/filesystem_paths.h"
+#include "ardour/search_paths.h"
+#include "ardour/revision.h"
#include "ardour/utils.h"
+#include "gtkmm2ext/rgb_macros.h"
+#include "gtkmm2ext/gtk_ui.h"
+
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -64,6 +66,7 @@ static const char* ui_config_file_name = "ui_config";
static const char* default_ui_config_file_name = "default_ui_config";
static const double hue_width = 18.0;
+std::string UIConfiguration::color_file_suffix = X_(".colors");
UIConfiguration&
UIConfiguration::instance ()
@@ -124,7 +127,7 @@ UIConfiguration::parameter_changed (string param)
if (param == "ui-rc-file") {
load_rc_file (true);
} else if (param == "color-file") {
- load_color_theme ();
+ load_color_theme (true);
}
save_state ();
@@ -133,6 +136,7 @@ UIConfiguration::parameter_changed (string param)
void
UIConfiguration::reset_gtk_theme ()
{
+ LocaleGuard lg;
stringstream ss;
ss << "gtk_color_scheme = \"" << hex;
@@ -214,7 +218,7 @@ UIConfiguration::pre_gui_init ()
UIConfiguration*
UIConfiguration::post_gui_init ()
{
- load_color_theme ();
+ load_color_theme (true);
return this;
}
@@ -248,59 +252,108 @@ UIConfiguration::load_defaults ()
if (ret == 0) {
/* reload color theme */
load_color_theme (false);
- ColorsChanged (); /* EMIT SIGNAL */
}
return ret;
}
+std::string
+UIConfiguration::color_file_name (bool use_my, bool with_version) const
+{
+ string basename;
+
+ if (use_my) {
+ basename += "my-";
+ }
+
+ //this is the overall theme file, e.g. "dark" plus "-downcase(PROGRAM_NAME)"
+ basename += color_file.get();
+
+ std::string rev (revision);
+ std::size_t pos = rev.find_first_of("-");
+
+ if (with_version && pos != string::npos && pos > 0) {
+ basename += "-";
+ basename += rev.substr (0, pos); // COLORFILE_VERSION - program major.minor
+ }
+
+ basename += color_file_suffix;
+ return basename;
+}
+
+int
+UIConfiguration::load_color_file (string const & path)
+{
+ XMLTree tree;
+
+ info << string_compose (_("Loading color file %1"), path) << endmsg;
+
+ if (!tree.read (path.c_str())) {
+ error << string_compose(_("cannot read color file \"%1\""), path) << endmsg;
+ return -1;
+ }
+
+ if (set_state (*tree.root(), Stateful::loading_state_version)) {
+ error << string_compose(_("color file \"%1\" not loaded successfully."), path) << endmsg;
+ return -1;
+ }
+
+ return 0;
+}
+
int
UIConfiguration::load_color_theme (bool allow_own)
{
std::string cfile;
- string basename;
bool found = false;
+ /* ColorsChanged() will trigger a parameter_changed () which
+ * in turn calls save_state()
+ */
+ PBD::Unwinder<uint32_t> uw (block_save, block_save + 1);
- if (allow_own) {
- basename = "my-";
- basename += color_file.get();
- basename += ".colors";
+ if (find_file (theme_search_path(), color_file_name (false, true), cfile)) {
+ found = true;
+ }
- if (find_file (ardour_config_search_path(), basename, cfile)) {
+ if (!found) {
+ if (find_file (theme_search_path(), color_file_name (false, false), cfile)) {
found = true;
}
}
if (!found) {
- basename = color_file.get();
- basename += ".colors";
-
- if (find_file (ardour_config_search_path(), basename, cfile)) {
- found = true;
- }
+ warning << string_compose (_("Color file for %1 not found along %2"), color_file.get(), theme_search_path().to_string()) << endmsg;
+ return -1;
}
- if (found) {
+ (void) load_color_file (cfile);
- XMLTree tree;
+ if (allow_own) {
- info << string_compose (_("Loading color file %1"), cfile) << endmsg;
+ found = false;
- if (!tree.read (cfile.c_str())) {
- error << string_compose(_("cannot read color file \"%1\""), cfile) << endmsg;
- return -1;
+ PBD::Searchpath sp (user_config_directory());
+
+ /* user's own color files never have the program name in them */
+
+ if (find_file (sp, color_file_name (true, true), cfile)) {
+ found = true;
}
- if (set_state (*tree.root(), Stateful::loading_state_version)) {
- error << string_compose(_("color file \"%1\" not loaded successfully."), cfile) << endmsg;
- return -1;
+ if (!found) {
+ if (find_file (sp, color_file_name (true, false), cfile)) {
+ found = true;
+ }
+ }
+
+ if (found) {
+ (void) load_color_file (cfile);
}
- ColorsChanged ();
- } else {
- warning << string_compose (_("Color file %1 not found"), basename) << endmsg;
}
+ ColorsChanged ();
+
return 0;
}
@@ -308,7 +361,7 @@ int
UIConfiguration::store_color_theme ()
{
XMLNode* root;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
root = new XMLNode("Ardour");
@@ -342,7 +395,7 @@ UIConfiguration::store_color_theme ()
root->add_child_nocopy (*parent);
XMLTree tree;
- std::string colorfile = Glib::build_filename (user_config_directory(), (string ("my-") + color_file.get() + ".colors"));
+ std::string colorfile = Glib::build_filename (user_config_directory(), color_file_name (true, true));;
tree.set_root (root);
@@ -357,6 +410,7 @@ UIConfiguration::store_color_theme ()
int
UIConfiguration::load_state ()
{
+ LocaleGuard lg; // a single guard for all 3 configs
bool found = false;
std::string rcfile;
@@ -407,6 +461,9 @@ UIConfiguration::load_state ()
int
UIConfiguration::save_state()
{
+ if (block_save != 0) {
+ return -1;
+ }
if (_dirty) {
std::string rcfile = Glib::build_filename (user_config_directory(), ui_config_file_name);
@@ -443,7 +500,7 @@ XMLNode&
UIConfiguration::get_state ()
{
XMLNode* root;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
root = new XMLNode("Ardour");
@@ -461,7 +518,7 @@ XMLNode&
UIConfiguration::get_variables (std::string which_node)
{
XMLNode* node;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
node = new XMLNode (which_node);
@@ -480,6 +537,7 @@ UIConfiguration::get_variables (std::string which_node)
int
UIConfiguration::set_state (const XMLNode& root, int /*version*/)
{
+ LocaleGuard lg;
/* this can load a generic UI configuration file or a colors file */
if (root.name() != "Ardour") {
@@ -531,17 +589,16 @@ UIConfiguration::load_color_aliases (XMLNode const & node)
XMLProperty const *name;
XMLProperty const *alias;
- color_aliases.clear ();
-
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
- if ((*niter)->name() != X_("ColorAlias")) {
+ XMLNode const * child = *niter;
+ if (child->name() != X_("ColorAlias")) {
continue;
}
- name = (*niter)->property (X_("name"));
- alias = (*niter)->property (X_("alias"));
+ name = child->property (X_("name"));
+ alias = child->property (X_("alias"));
if (name && alias) {
- color_aliases.insert (make_pair (name->value(), alias->value()));
+ color_aliases[name->value()] = alias->value();
}
}
}
@@ -554,19 +611,23 @@ UIConfiguration::load_colors (XMLNode const & node)
XMLProperty const *name;
XMLProperty const *color;
- colors.clear ();
+ /* don't clear colors, so that we can load > 1 color file and have
+ the subsequent ones overwrite the later ones.
+ */
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
- if ((*niter)->name() != X_("Color")) {
+ XMLNode const * child = *niter;
+ if (child->name() != X_("Color")) {
continue;
}
- name = (*niter)->property (X_("name"));
- color = (*niter)->property (X_("value"));
+ name = child->property (X_("name"));
+ color = child->property (X_("value"));
if (name && color) {
ArdourCanvas::Color c;
c = strtoul (color->value().c_str(), 0, 16);
- colors.insert (make_pair (name->value(), c));
+ /* insert or replace color name definition */
+ colors[name->value()] = c;
}
}
}
@@ -574,25 +635,24 @@ UIConfiguration::load_colors (XMLNode const & node)
void
UIConfiguration::load_modifiers (XMLNode const & node)
{
- PBD::LocaleGuard lg ("C");
+ PBD::LocaleGuard lg;
XMLNodeList const nlist = node.children();
XMLNodeConstIterator niter;
XMLProperty const *name;
XMLProperty const *mod;
- modifiers.clear ();
-
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
- if ((*niter)->name() != X_("Modifier")) {
+ XMLNode const * child = *niter;
+ if (child->name() != X_("Modifier")) {
continue;
}
- name = (*niter)->property (X_("name"));
- mod = (*niter)->property (X_("modifier"));
+ name = child->property (X_("name"));
+ mod = child->property (X_("modifier"));
if (name && mod) {
SVAModifier svam (mod->value());
- modifiers.insert (make_pair (name->value(), svam));
+ modifiers[name->value()] = svam;
}
}
}
@@ -737,5 +797,3 @@ UIConfiguration::load_rc_file (bool themechange, bool allow_own)
Gtkmm2ext::UI::instance()->load_rcfile (rc_file_path, themechange);
}
-
-
diff --git a/gtk2_ardour/ui_config.h b/gtk2_ardour/ui_config.h
index 06338aa..559c86a 100644
--- a/gtk2_ardour/ui_config.h
+++ b/gtk2_ardour/ui_config.h
@@ -46,18 +46,22 @@ private:
public:
static UIConfiguration& instance();
+ static std::string color_file_suffix;
+
void load_rc_file (bool themechange, bool allow_own = true);
int load_state ();
int save_state ();
int load_defaults ();
- int load_color_theme (bool allow_own=true);
+ int load_color_theme (bool allow_own);
int set_state (const XMLNode&, int version);
XMLNode& get_state (void);
XMLNode& get_variables (std::string);
void set_variables (const XMLNode&);
+ std::string color_file_name (bool use_my, bool with_version) const;
+
typedef std::map<std::string,ArdourCanvas::Color> Colors;
typedef std::map<std::string,std::string> ColorAliases;
typedef std::map<std::string,ArdourCanvas::SVAModifier> Modifiers;
@@ -133,15 +137,15 @@ private:
bool colors_modified;
bool modifiers_modified;
- int store_color_theme ();
+ int store_color_theme ();
void load_color_aliases (XMLNode const &);
void load_colors (XMLNode const &);
void load_modifiers (XMLNode const &);
void reset_gtk_theme ();
+ int load_color_file (std::string const &);
void colors_changed ();
uint32_t block_save;
};
#endif /* __ardour_ui_configuration_h__ */
-
diff --git a/gtk2_ardour/ui_config_vars.h b/gtk2_ardour/ui_config_vars.h
index e512fe3..e6cd3c1 100644
--- a/gtk2_ardour/ui_config_vars.h
+++ b/gtk2_ardour/ui_config_vars.h
@@ -35,7 +35,6 @@ UI_CONFIG_VARIABLE (std::string, keyboard_layout, "keyboard-layout", "ansi")
UI_CONFIG_VARIABLE (std::string, keyboard_layout_name, "keyboard-layout-name", "ansi")
UI_CONFIG_VARIABLE (std::string, default_bindings, "default-bindings", "ardour")
UI_CONFIG_VARIABLE (bool, only_copy_imported_files, "only-copy-imported-files", false)
-UI_CONFIG_VARIABLE (bool, keep_tearoffs, "keep-tearoffs", true)
UI_CONFIG_VARIABLE (bool, default_narrow_ms, "default-narrow_ms", false)
UI_CONFIG_VARIABLE (bool, name_new_markers, "name-new-markers", false)
UI_CONFIG_VARIABLE (bool, rubberbanding_snaps_to_grid, "rubberbanding-snaps-to-grid", false)
@@ -59,6 +58,7 @@ UI_CONFIG_VARIABLE (bool, show_name_highlight, "show-name-highlight", false)
UI_CONFIG_VARIABLE (bool, primary_clock_delta_edit_cursor, "primary-clock-delta-edit-cursor", false)
UI_CONFIG_VARIABLE (bool, secondary_clock_delta_edit_cursor, "secondary-clock-delta-edit-cursor", false)
UI_CONFIG_VARIABLE (bool, show_track_meters, "show-track-meters", true)
+UI_CONFIG_VARIABLE (bool, editor_stereo_only_meters, "editor-stereo-only-meters", false)
UI_CONFIG_VARIABLE (bool, follow_edits, "follow-edits", false)
UI_CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", false)
UI_CONFIG_VARIABLE (bool, autoscroll_editor, "autoscroll-editor", true)
@@ -77,3 +77,10 @@ UI_CONFIG_VARIABLE (bool, buggy_gradients, "buggy-gradients", false)
UI_CONFIG_VARIABLE (bool, cairo_image_surface, "cairo-image-surface", false)
UI_CONFIG_VARIABLE (uint64_t, waveform_cache_size, "waveform-cache-size", 100) /* units of megagbytes */
UI_CONFIG_VARIABLE (int32_t, recent_session_sort, "recent-session-sort", 0)
+UI_CONFIG_VARIABLE (bool, save_export_analysis_image, "save-export-analysis-image", false)
+UI_CONFIG_VARIABLE (std::string, xjadeo_binary, "xjadeo-binary", "")
+UI_CONFIG_VARIABLE (bool, open_gui_after_adding_plugin, "open-gui-after-adding-plugin", true)
+UI_CONFIG_VARIABLE (bool, show_inline_display_by_default, "show-inline-display-by-default", true)
+UI_CONFIG_VARIABLE (bool, prefer_inline_over_gui, "prefer-inline-over-gui", true)
+UI_CONFIG_VARIABLE (uint32_t, action_table_columns, "action-table-columns", 0)
+UI_CONFIG_VARIABLE (bool, use_wm_visibility, "use-wm-visibility", true)
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index 60498b9..26b048f 100644
--- a/gtk2_ardour/utils.cc
+++ b/gtk2_ardour/utils.cc
@@ -36,11 +36,14 @@
#include <gtk/gtkpaned.h>
#include <boost/algorithm/string.hpp>
+#include "pbd/basename.h"
#include "pbd/file_utils.h"
+#include "pbd/stacktrace.h"
#include <gtkmm2ext/utils.h>
#include "ardour/filesystem_paths.h"
+#include "ardour/search_paths.h"
#include "canvas/item.h"
#include "canvas/utils.h"
@@ -49,11 +52,12 @@
#include "public_editor.h"
#include "keyboard.h"
#include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "rgb_macros.h"
#include "gui_thread.h"
#include "ui_config.h"
#include "ardour_dialog.h"
+#include "ardour_ui.h"
using namespace std;
using namespace Gtk;
@@ -260,6 +264,22 @@ ARDOUR_UI_UTILS::get_font_for_style (string widgetname)
return Pango::FontDescription (pfd); /* make a copy */
}
+Gdk::Color
+ARDOUR_UI_UTILS::gdk_color_from_rgb (uint32_t rgb)
+{
+ Gdk::Color c;
+ set_color_from_rgb (c, rgb);
+ return c;
+}
+
+Gdk::Color
+ARDOUR_UI_UTILS::gdk_color_from_rgba (uint32_t rgba)
+{
+ Gdk::Color c;
+ set_color_from_rgb (c, rgba);
+ return c;
+}
+
void
ARDOUR_UI_UTILS::set_color_from_rgb (Gdk::Color& c, uint32_t rgb)
{
@@ -293,33 +313,16 @@ ARDOUR_UI_UTILS::gdk_color_to_rgba (Gdk::Color const& c)
return RGBA_TO_UINT (r,g,b,a);
}
-
bool
ARDOUR_UI_UTILS::relay_key_press (GdkEventKey* ev, Gtk::Window* win)
{
-
- if (!key_press_focus_accelerator_handler (*win, ev)) {
- if (!PublicEditor::_instance) {
- /* early key press in pre-main-window-dialogs, no editor yet */
- return false;
- }
- PublicEditor& ed (PublicEditor::instance());
- return ed.on_key_press_event(ev);
- } else {
- return true;
- }
-}
-
-bool
-ARDOUR_UI_UTILS::forward_key_press (GdkEventKey* ev)
-{
- return PublicEditor::instance().on_key_press_event(ev);
+ return ARDOUR_UI::instance()->key_event_handler (ev, win);
}
bool
-ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
+ARDOUR_UI_UTILS::emulate_key_event (unsigned int keyval)
{
- GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET(w->gobj()));
+ GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET(ARDOUR_UI::instance()->main_window().gobj()));
GdkKeymap *keymap = gdk_keymap_get_for_display (display);
GdkKeymapKey *keymapkey = NULL;
gint n_keys;
@@ -327,9 +330,11 @@ ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
if (!gdk_keymap_get_entries_for_keyval(keymap, keyval, &keymapkey, &n_keys)) return false;
if (n_keys !=1) { g_free(keymapkey); return false;}
+ Gtk::Window& main_window (ARDOUR_UI::instance()->main_window());
+
GdkEventKey ev;
ev.type = GDK_KEY_PRESS;
- ev.window = gtk_widget_get_window(GTK_WIDGET(w->gobj()));
+ ev.window = main_window.get_window()->gobj();
ev.send_event = FALSE;
ev.time = 0;
ev.state = 0;
@@ -340,223 +345,9 @@ ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
ev.group = keymapkey[0].group;
g_free(keymapkey);
- forward_key_press(&ev);
+ relay_key_press (&ev, &main_window);
ev.type = GDK_KEY_RELEASE;
- return forward_key_press(&ev);
-}
-
-static string
-show_gdk_event_state (int state)
-{
- string s;
- if (state & GDK_SHIFT_MASK) {
- s += "+SHIFT";
- }
- if (state & GDK_LOCK_MASK) {
- s += "+LOCK";
- }
- if (state & GDK_CONTROL_MASK) {
- s += "+CONTROL";
- }
- if (state & GDK_MOD1_MASK) {
- s += "+MOD1";
- }
- if (state & GDK_MOD2_MASK) {
- s += "+MOD2";
- }
- if (state & GDK_MOD3_MASK) {
- s += "+MOD3";
- }
- if (state & GDK_MOD4_MASK) {
- s += "+MOD4";
- }
- if (state & GDK_MOD5_MASK) {
- s += "+MOD5";
- }
- if (state & GDK_BUTTON1_MASK) {
- s += "+BUTTON1";
- }
- if (state & GDK_BUTTON2_MASK) {
- s += "+BUTTON2";
- }
- if (state & GDK_BUTTON3_MASK) {
- s += "+BUTTON3";
- }
- if (state & GDK_BUTTON4_MASK) {
- s += "+BUTTON4";
- }
- if (state & GDK_BUTTON5_MASK) {
- s += "+BUTTON5";
- }
- if (state & GDK_SUPER_MASK) {
- s += "+SUPER";
- }
- if (state & GDK_HYPER_MASK) {
- s += "+HYPER";
- }
- if (state & GDK_META_MASK) {
- s += "+META";
- }
- if (state & GDK_RELEASE_MASK) {
- s += "+RELEASE";
- }
-
- return s;
-}
-bool
-ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
-{
- GtkWindow* win = window.gobj();
- GtkWidget* focus = gtk_window_get_focus (win);
- bool special_handling_of_unmodified_accelerators = false;
- bool allow_activating = true;
- /* consider all relevant modifiers but not LOCK or SHIFT */
- const guint mask = (Keyboard::RelevantModifierKeyMask & ~(Gdk::SHIFT_MASK|Gdk::LOCK_MASK));
- GdkModifierType modifier = GdkModifierType (ev->state);
- modifier = GdkModifierType (modifier & gtk_accelerator_get_default_mod_mask());
- Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator(modifier);
-
- if (focus) {
- if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
- special_handling_of_unmodified_accelerators = true;
- }
- }
-
-#ifdef GTKOSX
- /* at one time this appeared to be necessary. As of July 2012, it does not
- appear to be. if it ever is necessar, figure out if it should apply
- to all platforms.
- */
-#if 0
- if (Keyboard::some_magic_widget_has_focus ()) {
- allow_activating = false;
- }
-#endif
-#endif
-
-
- DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 (%8) Key event: code = %2 state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n",
- win,
- ev->keyval,
- show_gdk_event_state (ev->state),
- special_handling_of_unmodified_accelerators,
- Keyboard::some_magic_widget_has_focus(),
- allow_activating,
- focus,
- (focus ? gtk_widget_get_name (focus) : "no focus widget")));
-
- /* This exists to allow us to override the way GTK handles
- key events. The normal sequence is:
-
- a) event is delivered to a GtkWindow
- b) accelerators/mnemonics are activated
- c) if (b) didn't handle the event, propagate to
- the focus widget and/or focus chain
-
- The problem with this is that if the accelerators include
- keys without modifiers, such as the space bar or the
- letter "e", then pressing the key while typing into
- a text entry widget results in the accelerator being
- activated, instead of the desired letter appearing
- in the text entry.
-
- There is no good way of fixing this, but this
- represents a compromise. The idea is that
- key events involving modifiers (not Shift)
- get routed into the activation pathway first, then
- get propagated to the focus widget if necessary.
-
- If the key event doesn't involve modifiers,
- we deliver to the focus widget first, thus allowing
- it to get "normal text" without interference
- from acceleration.
-
- Of course, this can also be problematic: if there
- is a widget with focus, then it will swallow
- all "normal text" accelerators.
- */
-
- if (!special_handling_of_unmodified_accelerators) {
-
-
- /* XXX note that for a brief moment, the conditional above
- * included "|| (ev->state & mask)" so as to enforce the
- * implication of special_handling_of_UNMODIFIED_accelerators.
- * however, this forces any key that GTK doesn't allow and that
- * we have an alternative (see next comment) for to be
- * automatically sent through the accel groups activation
- * pathway, which prevents individual widgets & canvas items
- * from ever seeing it if is used by a key binding.
- *
- * specifically, this hid Ctrl-down-arrow from MIDI region
- * views because it is also bound to an action.
- *
- * until we have a robust, clean binding system, this
- * quirk will have to remain in place.
- */
-
- /* pretend that certain key events that GTK does not allow
- to be used as accelerators are actually something that
- it does allow. but only where there are no modifiers.
- */
-
- uint32_t fakekey = ev->keyval;
-
- if (Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (fakekey)) {
- DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tactivate (was %1 now %2) without special hanlding of unmodified accels\n",
- ev->keyval, fakekey));
-
- DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tmodified modifier was %1\n", show_gdk_event_state (modifier)));
-
- if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, modifier)) {
- DEBUG_TRACE (DEBUG::Accelerators, "\taccel group activated by fakekey\n");
- return true;
- }
- }
- }
-
- if (!special_handling_of_unmodified_accelerators || (ev->state & mask)) {
-
- /* no special handling or there are modifiers in effect: accelerate first */
-
- DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n");
- DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tevent send-event:%1 time:%2 length:%3 name %7 string:%4 hardware_keycode:%5 group:%6\n",
- ev->send_event, ev->time, ev->length, ev->string, ev->hardware_keycode, ev->group, gdk_keyval_name (ev->keyval)));
-
- if (allow_activating) {
- DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
- if (gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier)) {
- DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
- return true;
- }
- } else {
- DEBUG_TRACE (DEBUG::Accelerators, "\tactivation skipped\n");
- }
-
- DEBUG_TRACE (DEBUG::Accelerators, "\tnot accelerated, now propagate\n");
-
- return gtk_window_propagate_key_event (win, ev);
- }
-
- /* no modifiers, propagate first */
-
- DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate, then activate\n");
-
- if (!gtk_window_propagate_key_event (win, ev)) {
- DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n");
- if (allow_activating) {
- return gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier);
- } else {
- DEBUG_TRACE (DEBUG::Accelerators, "\tactivation skipped\n");
- }
-
- } else {
- DEBUG_TRACE (DEBUG::Accelerators, "\thandled by propagate\n");
- return true;
- }
-
- DEBUG_TRACE (DEBUG::Accelerators, "\tnot handled\n");
- return true;
+ return relay_key_press(&ev, &main_window);
}
Glib::RefPtr<Gdk::Pixbuf>
@@ -584,6 +375,39 @@ ARDOUR_UI_UTILS::get_xpm (std::string name)
return xpm_map[name];
}
+void
+ARDOUR_UI_UTILS::get_color_themes (map<std::string,std::string>& themes)
+{
+ Searchpath spath(ARDOUR::theme_search_path());
+
+ for (vector<string>::iterator s = spath.begin(); s != spath.end(); ++s) {
+
+ vector<string> entries;
+
+ find_files_matching_pattern (entries, *s, string ("*") + UIConfiguration::color_file_suffix);
+
+ for (vector<string>::iterator e = entries.begin(); e != entries.end(); ++e) {
+
+ XMLTree tree;
+
+ tree.read ((*e).c_str());
+ XMLNode* root = tree.root();
+
+ if (!root || root->name() != X_("Ardour")) {
+ continue;
+ }
+
+ XMLProperty const* prop = root->property (X_("theme-name"));
+
+ if (!prop) {
+ continue;
+ }
+
+ themes.insert (make_pair (prop->value(), Glib::filename_to_utf8 (basename_nosuffix(*e))));
+ }
+ }
+}
+
vector<string>
ARDOUR_UI_UTILS::get_icon_sets ()
{
@@ -633,6 +457,12 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_imag
find_file (spath, name, data_file_path);
}
+ if (data_file_path.empty()) {
+ Searchpath rc (ARDOUR::ardour_data_search_path());
+ rc.add_subdirectory_to_paths ("resources");
+ find_file (rc, name, data_file_path);
+ }
+
if (is_image && data_file_path.empty()) {
if (!icon_set.empty() && icon_set != _("default")) {
@@ -828,20 +658,10 @@ ARDOUR_UI_UTILS::escape_underscores (string const & s)
return o;
}
-/** Replace < and > with < and > respectively to make < > display correctly in markup strings */
-string
-ARDOUR_UI_UTILS::escape_angled_brackets (string const & s)
-{
- string o = s;
- boost::replace_all (o, "<", "<");
- boost::replace_all (o, ">", ">");
- return o;
-}
-
Gdk::Color
ARDOUR_UI_UTILS::unique_random_color (list<Gdk::Color>& used_colors)
{
- Gdk::Color newcolor;
+ Gdk::Color newcolor;
while (1) {
@@ -947,3 +767,10 @@ ARDOUR_UI_UTILS::overwrite_file_dialog (Gtk::Window& parent, string title, strin
return false;
}
}
+
+bool
+ARDOUR_UI_UTILS::running_from_source_tree ()
+{
+ gchar const *x = g_getenv ("ARDOUR_THEMES_PATH");
+ return x && (string (x).find ("gtk2_ardour") != string::npos);
+}
diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h
index c6df938..590d817 100644
--- a/gtk2_ardour/utils.h
+++ b/gtk2_ardour/utils.h
@@ -23,6 +23,7 @@
#include <string>
#include <cmath>
#include <vector>
+#include <map>
#include "ardour/types.h"
@@ -39,7 +40,6 @@ namespace PBD {
namespace Gtk {
class Window;
class ComboBoxText;
- class Paned;
class Adjustment;
}
@@ -62,18 +62,22 @@ Pango::FontDescription get_font_for_style (std::string widgetname);
void decorate (Gtk::Window& w, Gdk::WMDecoration d);
+Gdk::Color gdk_color_from_rgb (uint32_t);
+Gdk::Color gdk_color_from_rgba (uint32_t);
+uint32_t gdk_color_to_rgba (Gdk::Color const&);
+
void set_color_from_rgb (Gdk::Color&, uint32_t);
void set_color_from_rgba (Gdk::Color&, uint32_t);
-uint32_t gdk_color_to_rgba (Gdk::Color const&);
+
uint32_t contrasting_text_color (uint32_t c);
bool relay_key_press (GdkEventKey* ev, Gtk::Window* win);
-bool forward_key_press (GdkEventKey* ev);
bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev);
-bool emulate_key_event (Gtk::Widget*, unsigned int);
+bool emulate_key_event (unsigned int);
Glib::RefPtr<Gdk::Pixbuf> get_xpm (std::string);
std::vector<std::string> get_icon_sets ();
+void get_color_themes (std::map<std::string,std::string>&);
std::string get_icon_path (const char*, std::string icon_set = std::string(), bool is_image = true);
Glib::RefPtr<Gdk::Pixbuf> get_icon (const char*, std::string icon_set = std::string());
static std::map<std::string, Glib::RefPtr<Gdk::Pixbuf> > xpm_map;
@@ -84,7 +88,6 @@ bool key_is_legal_for_numeric_entry (guint keyval);
void resize_window_to_proportion_of_monitor (Gtk::Window*, int, int);
std::string escape_underscores (std::string const &);
-std::string escape_angled_brackets (std::string const &);
Gdk::Color unique_random_color (std::list<Gdk::Color> &);
@@ -93,6 +96,7 @@ std::string rate_as_string (float r);
bool windows_overlap (Gtk::Window *a, Gtk::Window *b);
bool overwrite_file_dialog (Gtk::Window& parent, std::string title, std::string text);
+bool running_from_source_tree ();
} // namespace
#endif /* __ardour_gtk_utils_h__ */
diff --git a/gtk2_ardour/utils_videotl.cc b/gtk2_ardour/utils_videotl.cc
index b62ac94..684bbf9 100644
--- a/gtk2_ardour/utils_videotl.cc
+++ b/gtk2_ardour/utils_videotl.cc
@@ -21,14 +21,16 @@
#include <string>
#include <cerrno>
#include <gtkmm.h>
-#include <curl/curl.h>
#include "pbd/error.h"
+
#include "ardour/ardour.h"
#include "ardour/session_directory.h"
-#include "video_image_frame.h"
-#include "utils_videotl.h"
+
+#include "ardour_http.h"
#include "utils.h"
+#include "utils_videotl.h"
+#include "video_image_frame.h"
#ifdef WAF_BUILD
#include "gtk2ardour-version.h"
@@ -37,7 +39,7 @@
#ifndef ARDOUR_CURL_TIMEOUT
#define ARDOUR_CURL_TIMEOUT (60)
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtk;
using namespace std;
@@ -264,14 +266,13 @@ VideoUtils::video_query_info (
, video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
, filepath.c_str());
- char *res = a3_curl_http_get(url, NULL);
- if (!res) {
+ std::string res = ArdourCurl::http_get (url);
+ if (res.empty ()) {
return false;
}
std::vector<std::vector<std::string> > lines;
- ParseCSV(std::string(res), lines);
- free(res);
+ ParseCSV(res, lines);
if (lines.empty() || lines.at(0).empty() || lines.at(0).size() != 6) {
return false;
@@ -308,70 +309,3 @@ VideoUtils::video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img)
}
}
-
-extern "C" {
-#include <curl/curl.h>
-
- struct A3MemoryStruct {
- char *data;
- size_t size;
- };
-
- static size_t
- WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) {
- size_t realsize = size * nmemb;
- struct A3MemoryStruct *mem = (struct A3MemoryStruct *)data;
-
- mem->data = (char *)realloc(mem->data, mem->size + realsize + 1);
- if (mem->data) {
- memcpy(&(mem->data[mem->size]), ptr, realsize);
- mem->size += realsize;
- mem->data[mem->size] = 0;
- }
- return realsize;
- }
-
- char *a3_curl_http_get (const char *u, int *status) {
- CURL *curl;
- CURLcode res;
- struct A3MemoryStruct chunk;
- long int httpstatus;
- if (status) *status = 0;
- //Glib::usleep(500000); return NULL; // TEST & DEBUG
- if (strncmp("http://", u, 7)) return NULL;
-
- chunk.data=NULL;
- chunk.size=0;
-
- curl = curl_easy_init();
- if(!curl) return NULL;
- curl_easy_setopt(curl, CURLOPT_URL, u);
-
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, PROGRAM_NAME VERSIONSTRING);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, ARDOUR_CURL_TIMEOUT);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
-#ifdef CURLERRORDEBUG
- char curlerror[CURL_ERROR_SIZE] = "";
- curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curlerror);
-#endif
-
- res = curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpstatus);
- curl_easy_cleanup(curl);
- if (status) *status = httpstatus;
- if (res) {
-#ifdef CURLERRORDEBUG
- printf("a3_curl_http_get() failed: %s\n", curlerror);
-#endif
- return NULL;
- }
- if (httpstatus != 200) {
- free (chunk.data);
- chunk.data = NULL;
- }
- return (chunk.data);
- }
-
-} /* end extern "C" */
diff --git a/gtk2_ardour/utils_videotl.h b/gtk2_ardour/utils_videotl.h
index a7d0908..40425fc 100644
--- a/gtk2_ardour/utils_videotl.h
+++ b/gtk2_ardour/utils_videotl.h
@@ -56,8 +56,4 @@ bool video_query_info (
);
};
-extern "C" {
- char *a3_curl_http_get (const char *u, int *status);
-}
-
#endif /* __gtk_ardour_video_utils_h__ */
diff --git a/gtk2_ardour/vca_master_strip.cc b/gtk2_ardour/vca_master_strip.cc
new file mode 100644
index 0000000..8363f6d
--- /dev/null
+++ b/gtk2_ardour/vca_master_strip.cc
@@ -0,0 +1,512 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <gtkmm/stock.h>
+#include <gtkmm/colorselection.h>
+
+#include "pbd/convert.h"
+
+#include "ardour/rc_configuration.h"
+#include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "gtkmm2ext/doi.h"
+#include "gtkmm2ext/keyboard.h"
+
+#include "ardour_dialog.h"
+#include "floating_text_entry.h"
+#include "gui_thread.h"
+#include "mixer_ui.h"
+#include "tooltips.h"
+#include "ui_config.h"
+#include "utils.h"
+#include "vca_master_strip.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace Gtkmm2ext;
+using namespace Gtk;
+using namespace PBD;
+using std::string;
+
+PBD::Signal1<void,VCAMasterStrip*> VCAMasterStrip::CatchDeletion;
+
+VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v)
+ : SessionHandlePtr (s)
+ , _vca (v)
+ , gain_meter (s, 254) /* magic number, don't adjust blindly */
+ , context_menu (0)
+ , delete_dialog (0)
+ , control_slave_ui (s)
+{
+ /* set color for the VCA, if not already done. */
+
+ if (!_vca->presentation_info().color_set()) {
+ _vca->presentation_info().set_color (gdk_color_to_rgba (unique_random_color()));
+ }
+
+ control_slave_ui.set_stripable (boost::dynamic_pointer_cast<Stripable> (v));
+
+ gain_meter.set_controls (boost::shared_ptr<Route>(),
+ boost::shared_ptr<PeakMeter>(),
+ boost::shared_ptr<Amp>(),
+ _vca->gain_control());
+
+ solo_button.set_name ("solo button");
+ set_tooltip (solo_button, _("Solo slaves"));
+ solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::solo_release), false);
+
+ mute_button.set_name ("mute button");
+ mute_button.set_text (_("M"));
+ set_tooltip (mute_button, _("Mute slaves"));
+ mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::mute_release), false);
+
+ hide_button.set_icon (ArdourIcon::CloseCross);
+ set_tooltip (&hide_button, _("Hide this VCA strip"));
+
+ hide_button.signal_clicked.connect (sigc::mem_fun(*this, &VCAMasterStrip::hide_clicked));
+
+ solo_mute_box.set_spacing (2);
+ solo_mute_box.pack_start (mute_button, true, true);
+ solo_mute_box.pack_start (solo_button, true, true);
+
+ number_label.set_text (to_string (v->number(), std::dec));
+ number_label.set_elements((ArdourButton::Element)(ArdourButton::Edge|ArdourButton::Body|ArdourButton::Text|ArdourButton::Inactive));
+ number_label.set_no_show_all ();
+ number_label.set_name ("generic button");
+ number_label.set_alignment (.5, .5);
+ number_label.set_fallthrough_to_parent (true);
+
+ bottom_padding.set_size_request (-1, 55); /* this one is a hack. there's no trivial way to compute it */
+
+ //Glib::RefPtr<Pango::Layout> layout = vertical_button.get_layout ();
+ // layout->set_justify (JUSTIFY_CENTER);
+ /* horizontally centered, with a little space (5%) at the top */
+ vertical_button.set_angle (90);
+ vertical_button.set_layout_font (UIConfiguration::instance().get_NormalBoldFont());
+ vertical_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::vertical_button_press));
+ vertical_button.set_fallthrough_to_parent (true);
+ vertical_button.set_active_color (_vca->presentation_info().color ());
+ set_tooltip (vertical_button, _("Click to show slaves only")); /* tooltip updated dynamically */
+
+ global_vpacker.set_border_width (1);
+ global_vpacker.set_spacing (0);
+
+ global_vpacker.pack_start (number_label, false, false);
+ global_vpacker.pack_start (hide_button, false, false);
+ global_vpacker.pack_start (vertical_button, true, true);
+ global_vpacker.pack_start (solo_mute_box, false, false);
+ global_vpacker.pack_start (gain_meter, false, false, 2);
+ global_vpacker.pack_start (control_slave_ui, false, false);
+ global_vpacker.pack_start (bottom_padding, false, false);
+
+ global_frame.add (global_vpacker);
+ global_frame.set_shadow_type (Gtk::SHADOW_IN);
+ global_frame.set_name ("BaseFrame");
+
+ add (global_frame);
+
+ global_vpacker.show ();
+ global_frame.show ();
+ top_padding.show ();
+ bottom_padding.show ();
+ vertical_button.show ();
+ hide_button.show ();
+ number_label.show ();
+ gain_meter.show ();
+ solo_mute_box.show_all ();
+ control_slave_ui.show ();
+
+ /* force setting of visible selected status */
+
+ _selected = true;
+ set_selected (false);
+ set_solo_text ();
+ update_vca_name ();
+ solo_changed ();
+ mute_changed ();
+ spill_change (boost::shared_ptr<VCA>());
+
+ Mixer_UI::instance()->show_vca_change.connect (sigc::mem_fun (*this, &VCAMasterStrip::spill_change));
+
+ _vca->PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::vca_property_changed, this, _1), gui_context());
+ _vca->presentation_info().PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::vca_property_changed, this, _1), gui_context());
+ _vca->DropReferences.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::self_delete, this), gui_context());
+
+ _vca->solo_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::solo_changed, this), gui_context());
+ _vca->mute_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::mute_changed, this), gui_context());
+
+
+ s->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCAMasterStrip::parameter_changed, this, _1), gui_context());
+ Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCAMasterStrip::parameter_changed, this, _1), gui_context());
+ UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VCAMasterStrip::parameter_changed));
+}
+
+VCAMasterStrip::~VCAMasterStrip ()
+{
+ if ((_session && !_session->deletion_in_progress()) && Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+ /* cancel spill for this VCA */
+ Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+ }
+
+ delete delete_dialog;
+ delete context_menu;
+
+ CatchDeletion (this); /* EMIT SIGNAL */
+}
+
+void
+VCAMasterStrip::self_delete ()
+{
+ if ((_session && !_session->deletion_in_progress()) && Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+ /* cancel spill for this VCA */
+ Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+ }
+ /* Drop reference immediately, delete self when idle */
+ _vca.reset ();
+ delete_when_idle (this);
+}
+
+void
+VCAMasterStrip::parameter_changed (std::string const & p)
+{
+ if (p == "use-monitor-bus" || p == "solo-control-is-listen-control" || p == "listen-position") {
+ set_button_names ();
+ }
+}
+
+void
+VCAMasterStrip::set_button_names ()
+{
+ if (Config->get_solo_control_is_listen_control()) {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button.set_text (S_("AfterFader|A"));
+ set_tooltip (solo_button, _("After-fade listen (AFL)"));
+ break;
+ case PreFaderListen:
+ solo_button.set_text (S_("PreFader|P"));
+ set_tooltip (solo_button, _("Pre-fade listen (PFL)"));
+ break;
+ }
+ } else {
+ solo_button.set_text (S_("Solo|S"));
+ set_tooltip (solo_button, _("Solo"));
+ }
+}
+
+string
+VCAMasterStrip::name() const
+{
+ return _vca->name();
+}
+
+void
+VCAMasterStrip::hide_clicked ()
+{
+ _vca->presentation_info().set_hidden (true);
+}
+
+void
+VCAMasterStrip::hide_confirmation (int response)
+{
+ delete_dialog->hide ();
+
+ switch (response) {
+ case RESPONSE_YES:
+ /* get everything to deassign. This will also delete ourselves (when
+ * idle) and that in turn will remove us from the Mixer GUI
+ */
+ _session->vca_manager().remove_vca (_vca);
+ break;
+ default:
+ break;
+ }
+}
+
+bool
+VCAMasterStrip::width_button_pressed (GdkEventButton* ev)
+{
+ return false;
+}
+
+void
+VCAMasterStrip::set_selected (bool yn)
+{
+ AxisView::set_selected (yn);
+
+ if (_selected) {
+ global_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
+ global_frame.set_name ("MixerStripSelectedFrame");
+ } else {
+ global_frame.set_shadow_type (Gtk::SHADOW_IN);
+ global_frame.set_name ("MixerStripFrame");
+ }
+
+ global_frame.queue_draw ();
+}
+
+bool
+VCAMasterStrip::solo_release (GdkEventButton*)
+{
+ /* We use NoGroup because VCA controls are never part of a group. This
+ is redundant, but clear.
+ */
+ _vca->solo_control()->set_value (_vca->solo_control()->self_soloed() ? 0.0 : 1.0, Controllable::NoGroup);
+ return true;
+}
+
+bool
+VCAMasterStrip::mute_release (GdkEventButton*)
+{
+ /* We use NoGroup because VCA controls are never part of a group. This
+ is redundant, but clear.
+ */
+ _vca->mute_control()->set_value (_vca->mute_control()->muted_by_self() ? 0.0 : 1.0, Controllable::NoGroup);
+ return true;
+}
+
+void
+VCAMasterStrip::set_solo_text ()
+{
+ if (Config->get_solo_control_is_listen_control ()) {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button.set_text (_("A"));
+ break;
+ case PreFaderListen:
+ solo_button.set_text (_("P"));
+ break;
+ }
+ } else {
+ solo_button.set_text (_("S"));
+ }
+}
+
+void
+VCAMasterStrip::mute_changed ()
+{
+ if (_vca->mute_control()->muted_by_self()) {
+ mute_button.set_active_state (ExplicitActive);
+ } else if (_vca->mute_control()->muted_by_masters ()) {
+ mute_button.set_active_state (ImplicitActive);
+ } else {
+ mute_button.set_active_state (Gtkmm2ext::Off);
+ }
+}
+
+void
+VCAMasterStrip::solo_changed ()
+{
+ if (_vca->solo_control()->self_soloed()) {
+ solo_button.set_active_state (ExplicitActive);
+ } else if (_vca->solo_control()->soloed_by_masters ()) {
+ solo_button.set_active_state (ImplicitActive);
+ } else {
+ solo_button.set_active_state (Gtkmm2ext::Off);
+ }
+}
+
+bool
+VCAMasterStrip::vertical_button_press (GdkEventButton* ev)
+{
+ if (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) {
+ start_name_edit ();
+ return true;
+ }
+
+ if (Keyboard::is_context_menu_event (ev)) {
+ if (!context_menu) {
+ build_context_menu ();
+ }
+ context_menu->popup (1, ev->time);
+ return true;
+ }
+
+ if (ev->button == 1) {
+ spill ();
+ }
+
+ return true;
+}
+
+void
+VCAMasterStrip::start_name_edit ()
+{
+ Gtk::Window* win = dynamic_cast<Gtk::Window*>(get_toplevel());
+ FloatingTextEntry* fte = new FloatingTextEntry (win, _vca->name());
+ fte->use_text.connect (sigc::mem_fun (*this, &VCAMasterStrip::finish_name_edit));
+ fte->present ();
+}
+
+void
+VCAMasterStrip::finish_name_edit (std::string str, int)
+{
+ _vca->set_name (str);
+}
+
+void
+VCAMasterStrip::vca_property_changed (PropertyChange const & what_changed)
+{
+ if (what_changed.contains (ARDOUR::Properties::name)) {
+ update_vca_name ();
+ }
+
+ if (what_changed.contains (ARDOUR::Properties::color)) {
+ vertical_button.set_active_color (_vca->presentation_info().color ());
+ }
+
+ if (what_changed.contains (ARDOUR::Properties::hidden)) {
+
+ }
+}
+
+void
+VCAMasterStrip::update_vca_name ()
+{
+ /* 20 is a rough guess at the number of letters we can fit. */
+ vertical_button.set_text (short_version (_vca->name(), 20));
+}
+
+void
+VCAMasterStrip::build_context_menu ()
+{
+ using namespace Gtk::Menu_Helpers;
+ context_menu = new Menu;
+ MenuList& items = context_menu->items();
+ items.push_back (MenuElem (_("Rename"), sigc::mem_fun (*this, &VCAMasterStrip::start_name_edit)));
+ items.push_back (MenuElem (_("Color..."), sigc::mem_fun (*this, &VCAMasterStrip::start_color_edit)));
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Drop All Slaves"), sigc::mem_fun (*this, &VCAMasterStrip::drop_all_slaves)));
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Remove"), sigc::mem_fun (*this, &VCAMasterStrip::remove)));
+}
+
+void
+VCAMasterStrip::spill ()
+{
+ if (Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+ Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+ } else {
+ Mixer_UI::instance()->show_vca_slaves (_vca);
+ }
+}
+
+void
+VCAMasterStrip::spill_change (boost::shared_ptr<VCA> vca)
+{
+ if (vca != _vca) {
+ vertical_button.set_active_state (Gtkmm2ext::Off);
+ set_tooltip (vertical_button, _("Click to show slaves only"));
+ } else {
+ vertical_button.set_active_state (Gtkmm2ext::ExplicitActive);
+ set_tooltip (vertical_button, _("Click to show normal mixer"));
+ }
+}
+
+void
+VCAMasterStrip::remove ()
+{
+ if (!_session) {
+ return;
+ }
+
+ _session->vca_manager().remove_vca (_vca);
+}
+
+void
+VCAMasterStrip::drop_all_slaves ()
+{
+ _vca->Drop (); /* EMIT SIGNAL */
+
+ if (Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+ Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+ }
+}
+
+Gdk::Color
+VCAMasterStrip::color () const
+{
+ return gdk_color_from_rgba (_vca->presentation_info().color ());
+}
+
+string
+VCAMasterStrip::state_id () const
+{
+ return string_compose (X_("vms-%1"), _vca->number());
+}
+
+void
+VCAMasterStrip::start_color_edit ()
+{
+ Gtk::ColorSelectionDialog* color_dialog = new Gtk::ColorSelectionDialog;
+
+ color_dialog->get_colorsel()->set_has_opacity_control (false);
+ color_dialog->get_colorsel()->set_has_palette (true);
+
+ Gdk::Color c = gdk_color_from_rgba (_vca->presentation_info().color ());
+
+ color_dialog->get_colorsel()->set_previous_color (c);
+ color_dialog->get_colorsel()->set_current_color (c);
+
+ color_dialog->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &VCAMasterStrip::finish_color_edit), color_dialog));
+ color_dialog->present ();
+}
+
+void
+VCAMasterStrip::finish_color_edit (int response, Gtk::ColorSelectionDialog* dialog)
+{
+ switch (response) {
+ case RESPONSE_OK:
+ _vca->presentation_info().set_color (gdk_color_to_rgba (dialog->get_colorsel()->get_current_color()));
+ break;
+ }
+
+ delete_when_idle (dialog);
+}
+
+bool
+VCAMasterStrip::marked_for_display () const
+{
+ return !_vca->presentation_info().hidden();
+}
+
+bool
+VCAMasterStrip::set_marked_for_display (bool yn)
+{
+ if (yn == _vca->presentation_info().hidden()) {
+ _vca->presentation_info().set_hidden (!yn);
+ return true; // things changed
+ }
+ return false;
+}
+
+PresentationInfo const &
+VCAMasterStrip::presentation_info () const
+{
+ return _vca->presentation_info();
+}
+
+boost::shared_ptr<Stripable>
+VCAMasterStrip::stripable () const
+{
+ return _vca;
+}
diff --git a/gtk2_ardour/vca_master_strip.h b/gtk2_ardour/vca_master_strip.h
new file mode 100644
index 0000000..7208071
--- /dev/null
+++ b/gtk2_ardour/vca_master_strip.h
@@ -0,0 +1,110 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_vca_master_strip__
+#define __ardour_vca_master_strip__
+
+#include <boost/shared_ptr.hpp>
+
+#include <gtkmm/box.h>
+#include <gtkmm/menuitem.h>
+
+#include "ardour_button.h"
+#include "axis_view.h"
+#include "control_slave_ui.h"
+#include "gain_meter.h"
+
+namespace ARDOUR {
+ class GainControl;
+ class VCA;
+}
+
+class FloatingTextEntry;
+
+class VCAMasterStrip : public AxisView, public Gtk::EventBox
+{
+ public:
+ VCAMasterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::VCA>);
+ ~VCAMasterStrip ();
+
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+ ARDOUR::PresentationInfo const & presentation_info () const;
+
+ std::string name() const;
+ Gdk::Color color () const;
+ std::string state_id() const;
+ boost::shared_ptr<ARDOUR::VCA> vca() const { return _vca; }
+
+ static PBD::Signal1<void,VCAMasterStrip*> CatchDeletion;
+
+ bool marked_for_display () const;
+ bool set_marked_for_display (bool);
+
+ private:
+ boost::shared_ptr<ARDOUR::VCA> _vca;
+ GainMeter gain_meter;
+
+ Gtk::Frame global_frame;
+ Gtk::VBox global_vpacker;
+ Gtk::HBox top_padding;
+ Gtk::HBox bottom_padding;
+ Gtk::HBox solo_mute_box;
+ ArdourButton width_button;
+ ArdourButton color_button;
+ ArdourButton hide_button;
+ ArdourButton number_label;
+ ArdourButton solo_button;
+ ArdourButton mute_button;
+ Gtk::Menu* context_menu;
+ Gtk::MessageDialog* delete_dialog;
+ ArdourButton vertical_button;
+ ControlSlaveUI control_slave_ui;
+ PBD::ScopedConnectionList vca_connections;
+
+ void spill ();
+ void spill_change (boost::shared_ptr<ARDOUR::VCA>);
+ void hide_clicked();
+ bool width_button_pressed (GdkEventButton *);
+ void set_selected (bool);
+ bool solo_release (GdkEventButton*);
+ bool mute_release (GdkEventButton*);
+ void set_width (bool wide);
+ void set_solo_text ();
+ void solo_changed ();
+ void mute_changed ();
+ void unassign ();
+ void start_name_edit ();
+ void finish_name_edit (std::string, int);
+ bool vertical_button_press (GdkEventButton*);
+ void vca_property_changed (PBD::PropertyChange const & what_changed);
+ void update_vca_name ();
+ void build_context_menu ();
+ void hide_confirmation (int);
+ void self_delete ();
+ void remove ();
+ void drop_all_slaves ();
+
+ void parameter_changed (std::string const& p);
+ void set_button_names ();
+
+ void start_color_edit ();
+ void finish_color_edit (int, Gtk::ColorSelectionDialog*);
+};
+
+
+#endif /* __ardour_vca_master_strip__ */
diff --git a/gtk2_ardour/vca_time_axis.cc b/gtk2_ardour/vca_time_axis.cc
new file mode 100644
index 0000000..f98cda0
--- /dev/null
+++ b/gtk2_ardour/vca_time_axis.cc
@@ -0,0 +1,325 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "pbd/convert.h"
+
+#include "ardour/mute_control.h"
+#include "ardour/profile.h"
+#include "ardour/session.h"
+#include "ardour/solo_control.h"
+#include "ardour/vca.h"
+
+#include "gtkmm2ext/doi.h"
+
+#include "gui_thread.h"
+#include "public_editor.h"
+#include "tooltips.h"
+#include "ui_config.h"
+#include "vca_time_axis.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace Gtkmm2ext;
+using namespace PBD;
+
+VCATimeAxisView::VCATimeAxisView (PublicEditor& ed, Session* s, ArdourCanvas::Canvas& canvas)
+ : SessionHandlePtr (s)
+ , TimeAxisView (s, ed, (TimeAxisView*) 0, canvas)
+ , gain_meter (s, true, 75, 14) // XXX stupid magic numbers, match sizes in RouteTimeAxisView
+{
+ solo_button.set_name ("solo button");
+ set_tooltip (solo_button, _("Solo slaves"));
+ solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::solo_release), false);
+ mute_button.unset_flags (Gtk::CAN_FOCUS);
+
+ mute_button.set_name ("mute button");
+ mute_button.set_text (_("M"));
+ set_tooltip (mute_button, _("Mute slaves"));
+ mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::mute_release), false);
+ solo_button.unset_flags (Gtk::CAN_FOCUS);
+
+ drop_button.set_name ("mute button");
+ drop_button.set_text (_("D"));
+ set_tooltip (drop_button, _("Unassign all slaves"));
+ drop_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::drop_release), false);
+
+ spill_button.set_name ("mute button");
+ spill_button.set_text (_("V"));
+ set_tooltip (spill_button, _("Show only slaves"));
+ spill_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::spill_release), false);
+
+ mute_button.set_tweaks(ArdourButton::TrackHeader);
+ solo_button.set_tweaks(ArdourButton::TrackHeader);
+ drop_button.set_tweaks(ArdourButton::TrackHeader);
+ spill_button.set_tweaks(ArdourButton::TrackHeader);
+
+ controls_table.attach (mute_button, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+ controls_table.attach (solo_button, 3, 4, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+ controls_table.attach (drop_button, 2, 3, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+ controls_table.attach (spill_button, 3, 4, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+ controls_table.attach (gain_meter.get_gain_slider(), 0, 2, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 1, 0);
+
+ mute_button.show ();
+ solo_button.show ();
+ drop_button.show ();
+ spill_button.show ();
+ gain_meter.get_gain_slider().show ();
+
+ controls_ebox.set_name ("ControlMasterBaseUnselected");
+ time_axis_frame.set_name ("ControlMasterBaseUnselected");
+
+ s->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCATimeAxisView::parameter_changed, this, _1), gui_context());
+ Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCATimeAxisView::parameter_changed, this, _1), gui_context());
+ UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VCATimeAxisView::parameter_changed));
+}
+
+VCATimeAxisView::~VCATimeAxisView ()
+{
+}
+
+void
+VCATimeAxisView::self_delete ()
+{
+ /* reset reference immediately rather than deferring to idle */
+ _vca.reset ();
+ delete_when_idle (this);
+}
+
+void
+VCATimeAxisView::parameter_changed (std::string const & p)
+{
+ if (p == "track-name-number") {
+ update_track_number_visibility();
+ } else if (p == "use-monitor-bus" || p == "solo-control-is-listen-control" || p == "listen-position") {
+ set_button_names ();
+ }
+}
+
+bool
+VCATimeAxisView::solo_release (GdkEventButton*)
+{
+ /* We use NoGroup because VCA controls are never part of a group. This
+ is redundant, but clear.
+ */
+ _vca->solo_control()->set_value (_vca->solo_control()->self_soloed() ? 0.0 : 1.0, Controllable::NoGroup);
+ return true;
+}
+
+bool
+VCATimeAxisView::mute_release (GdkEventButton*)
+{
+ /* We use NoGroup because VCA controls are never part of a group. This
+ is redundant, but clear.
+ */
+ _vca->mute_control()->set_value (_vca->mute_control()->muted_by_self() ? 0.0 : 1.0, Controllable::NoGroup);
+ return true;
+}
+
+void
+VCATimeAxisView::set_vca (boost::shared_ptr<VCA> v)
+{
+ _vca = v;
+
+ gain_meter.set_controls (boost::shared_ptr<Route>(),
+ boost::shared_ptr<PeakMeter>(),
+ boost::shared_ptr<Amp>(),
+ _vca->gain_control());
+
+ // Mixer_UI::instance()->show_vca_change.connect (sigc::mem_fun (*this, &VCAMasterStrip::spill_change));
+
+ _vca->PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::vca_property_changed, this, _1), gui_context());
+
+ _vca->solo_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::update_solo_display, this), gui_context());
+ _vca->mute_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::update_mute_display, this), gui_context());
+ _vca->DropReferences.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::self_delete, this), gui_context());
+
+ solo_button.set_controllable (_vca->solo_control());
+ mute_button.set_controllable (_vca->mute_control());
+
+ /* VCA number never changes */
+ number_label.set_text (to_string (_vca->number(), std::dec));
+
+ set_height (preset_height (HeightNormal));
+
+ update_vca_name ();
+ set_button_names ();
+ update_solo_display ();
+ update_mute_display ();
+ update_track_number_visibility ();
+}
+
+void
+VCATimeAxisView::vca_property_changed (PropertyChange const & what_changed)
+{
+ if (what_changed.contains (ARDOUR::Properties::name)) {
+ update_vca_name ();
+ }
+}
+
+void
+VCATimeAxisView::update_vca_name ()
+{
+ name_label.set_text (_vca->name());
+}
+
+void
+VCATimeAxisView::update_mute_display ()
+{
+ if (_vca->mute_control()->muted_by_self()) {
+ mute_button.set_active_state (ExplicitActive);
+ } else if (_vca->mute_control()->muted_by_masters ()) {
+ mute_button.set_active_state (ImplicitActive);
+ } else {
+ mute_button.set_active_state (Gtkmm2ext::Off);
+ }
+}
+
+void
+VCATimeAxisView::update_solo_display ()
+{
+ if (_vca->solo_control()->self_soloed()) {
+ solo_button.set_active_state (ExplicitActive);
+ } else if (_vca->solo_control()->soloed_by_masters ()) {
+ solo_button.set_active_state (ImplicitActive);
+ } else {
+ solo_button.set_active_state (Gtkmm2ext::Off);
+ }
+
+ update_mute_display ();
+}
+
+std::string
+VCATimeAxisView::name() const
+{
+ return _vca->name();
+}
+
+std::string
+VCATimeAxisView::state_id() const
+{
+ return string_compose ("vtv %1", _vca->id().to_s());
+}
+
+void
+VCATimeAxisView::set_button_names ()
+{
+ if (Config->get_solo_control_is_listen_control()) {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button.set_text (S_("AfterFader|A"));
+ set_tooltip (solo_button, _("After-fade listen (AFL)"));
+ break;
+ case PreFaderListen:
+ solo_button.set_text (S_("PreFader|P"));
+ set_tooltip (solo_button, _("Pre-fade listen (PFL)"));
+ break;
+ }
+ } else {
+ solo_button.set_text (S_("Solo|S"));
+ set_tooltip (solo_button, _("Solo"));
+ }
+}
+
+void
+VCATimeAxisView::update_track_number_visibility ()
+{
+ DisplaySuspender ds;
+ bool show_label = _session->config.get_track_name_number();
+
+ if (number_label.get_parent()) {
+ controls_table.remove (number_label);
+ }
+
+ if (show_label) {
+ if (ARDOUR::Profile->get_mixbus()) {
+ controls_table.attach (number_label, 3, 4, 0, 1, Gtk::SHRINK, Gtk::EXPAND|Gtk::FILL, 1, 0);
+ } else {
+ controls_table.attach (number_label, 0, 1, 0, 1, Gtk::SHRINK, Gtk::EXPAND|Gtk::FILL, 1, 0);
+ }
+
+ // see ArdourButton::on_size_request(), we should probably use a global size-group here instead.
+ // except the width of the number label is subtracted from the name-hbox, so we
+ // need to explictly calculate it anyway until the name-label & entry become ArdourWidgets.
+
+ int tnw = (2 + std::max(2u, _session->track_number_decimals())) * number_label.char_pixel_width();
+ if (tnw & 1) --tnw;
+ number_label.set_size_request(tnw, -1);
+ number_label.show ();
+ } else {
+ number_label.hide ();
+ }
+}
+
+bool
+VCATimeAxisView::spill_release (GdkEventButton*)
+{
+ return true;
+}
+
+bool
+VCATimeAxisView::drop_release (GdkEventButton*)
+{
+ _vca->Drop (); /* EMIT SIGNAL */
+
+ return true;
+}
+
+PresentationInfo const &
+VCATimeAxisView::presentation_info () const
+{
+ return _vca->presentation_info();
+}
+
+boost::shared_ptr<Stripable>
+VCATimeAxisView::stripable () const
+{
+ return _vca;
+}
+
+Gdk::Color
+VCATimeAxisView::color () const
+{
+ return gdk_color_from_rgb (_vca->presentation_info().color ());
+}
+
+void
+VCATimeAxisView::set_height (uint32_t h, TrackHeightMode m)
+{
+ TimeAxisView::set_height (h, m);
+ set_gui_property ("height", h);
+ _vca->gui_changed ("track_height", (void*) 0); /* EMIT SIGNAL */
+}
+
+bool
+VCATimeAxisView::marked_for_display () const
+{
+ return _vca && !_vca->presentation_info().hidden();
+}
+
+bool
+VCATimeAxisView::set_marked_for_display (bool yn)
+{
+ if (_vca && (yn == _vca->presentation_info().hidden())) {
+ _vca->presentation_info().set_hidden (!yn);
+ return true; // things changed
+ }
+ return false;
+}
diff --git a/gtk2_ardour/vca_time_axis.h b/gtk2_ardour/vca_time_axis.h
new file mode 100644
index 0000000..c40b1ab
--- /dev/null
+++ b/gtk2_ardour/vca_time_axis.h
@@ -0,0 +1,82 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_vca_time_axis_h__
+#define __ardour_vca_time_axis_h__
+
+#include "ardour_button.h"
+#include "time_axis_view.h"
+#include "gain_meter.h"
+
+namespace ArdourCanvas {
+ class Canvas;
+}
+
+namespace ARDOUR {
+ class Session;
+ class VCA;
+}
+
+class VCATimeAxisView : public TimeAxisView
+{
+ public:
+ VCATimeAxisView (PublicEditor&, ARDOUR::Session*, ArdourCanvas::Canvas& canvas);
+ virtual ~VCATimeAxisView ();
+
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+ ARDOUR::PresentationInfo const & presentation_info () const;
+
+ void set_vca (boost::shared_ptr<ARDOUR::VCA>);
+ boost::shared_ptr<ARDOUR::VCA> vca() const { return _vca; }
+
+ std::string name() const;
+ Gdk::Color color () const;
+ std::string state_id() const;
+
+ void set_height (uint32_t h, TrackHeightMode m = OnlySelf);
+
+ bool selectable() const { return false; }
+ bool marked_for_display () const;
+ bool set_marked_for_display (bool);
+
+ protected:
+ boost::shared_ptr<ARDOUR::VCA> _vca;
+ ArdourButton solo_button;
+ ArdourButton mute_button;
+ ArdourButton spill_button;
+ ArdourButton drop_button;
+ ArdourButton number_label;
+ GainMeterBase gain_meter;
+ PBD::ScopedConnectionList vca_connections;
+
+ void parameter_changed (std::string const& p);
+ void vca_property_changed (PBD::PropertyChange const&);
+ void update_vca_name ();
+ void set_button_names ();
+ void update_solo_display ();
+ void update_mute_display ();
+ void update_track_number_visibility ();
+ bool solo_release (GdkEventButton*);
+ bool mute_release (GdkEventButton*);
+ bool spill_release (GdkEventButton*);
+ bool drop_release (GdkEventButton*);
+ void self_delete ();
+};
+
+#endif /* __ardour_route_time_axis_h__ */
diff --git a/gtk2_ardour/verbose_cursor.cc b/gtk2_ardour/verbose_cursor.cc
index 84d75d2..bf11733 100644
--- a/gtk2_ardour/verbose_cursor.cc
+++ b/gtk2_ardour/verbose_cursor.cc
@@ -34,7 +34,7 @@
#include "ardour_ui.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -137,7 +137,7 @@ VerboseCursor::set_duration (framepos_t start, framepos_t end)
Timecode::Time timecode;
Timecode::BBT_Time sbbt;
Timecode::BBT_Time ebbt;
- Meter meter_at_start (_editor->_session->tempo_map().meter_at(start));
+ Meter meter_at_start (_editor->_session->tempo_map().meter_at_frame (start));
if (_editor->_session == 0) {
return;
diff --git a/gtk2_ardour/video_image_frame.cc b/gtk2_ardour/video_image_frame.cc
index 8399d0b..093f235 100644
--- a/gtk2_ardour/video_image_frame.cc
+++ b/gtk2_ardour/video_image_frame.cc
@@ -20,15 +20,17 @@
#include <sigc++/bind.h>
#include "ardour/tempo.h"
-#include "video_image_frame.h"
-#include "public_editor.h"
-#include "canvas/container.h"
-#include "utils_videotl.h"
-
#include <gtkmm2ext/utils.h>
#include <pthread.h>
-#include "i18n.h"
+#include "canvas/container.h"
+
+#include "ardour_http.h"
+#include "public_editor.h"
+#include "utils_videotl.h"
+#include "video_image_frame.h"
+
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -208,7 +210,7 @@ http_get_thread (void *arg) {
int timeout = 1000; // * 5ms -> 5sec
char *res = NULL;
do {
- res=a3_curl_http_get(url, &status);
+ res = ArdourCurl::http_get (url, &status);
if (status == 503) Glib::usleep(5000); // try-again
} while (status == 503 && --timeout > 0);
diff --git a/gtk2_ardour/video_monitor.cc b/gtk2_ardour/video_monitor.cc
index ece1856..1fe8f97 100644
--- a/gtk2_ardour/video_monitor.cc
+++ b/gtk2_ardour/video_monitor.cc
@@ -28,7 +28,7 @@
#include "editor.h"
#include "video_monitor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -255,9 +255,7 @@ VideoMonitor::is_started ()
void
VideoMonitor::forward_keyevent (unsigned int keyval)
{
- Editor* ed = dynamic_cast<Editor*>(&PublicEditor::instance());
- if (!ed) return;
- emulate_key_event(ed, keyval);
+ emulate_key_event (keyval);
}
void
diff --git a/gtk2_ardour/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc
index 2bd814b..29872fc 100644
--- a/gtk2_ardour/video_server_dialog.cc
+++ b/gtk2_ardour/video_server_dialog.cc
@@ -36,7 +36,7 @@
#include "video_server_dialog.h"
#include "utils_videotl.h"
#include "video_tool_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#ifdef PLATFORM_WINDOWS
#include <windows.h>
diff --git a/gtk2_ardour/video_timeline.cc b/gtk2_ardour/video_timeline.cc
index a1dd4bc..3468ff2 100644
--- a/gtk2_ardour/video_timeline.cc
+++ b/gtk2_ardour/video_timeline.cc
@@ -26,6 +26,7 @@
#include "ardour/session_directory.h"
#include "ardour_ui.h"
+#include "ardour_http.h"
#include "public_editor.h"
#include "gui_thread.h"
#include "utils_videotl.h"
@@ -37,7 +38,7 @@
#include <pthread.h>
#include <curl/curl.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -85,7 +86,7 @@ VideoTimeLine::save_session ()
return;
}
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNode* node = new XMLNode(X_("Videomonitor"));
if (!node) return;
@@ -143,7 +144,7 @@ VideoTimeLine::set_session (ARDOUR::Session *s)
if (!_session) { return ; }
_session->SessionSaveUnderway.connect_same_thread (sessionsave, boost::bind (&VideoTimeLine::save_session, this));
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNode* node = _session->extra_xml (X_("Videotimeline"));
@@ -155,38 +156,38 @@ VideoTimeLine::set_session (ARDOUR::Session *s)
set_id(*node);
- const XMLProperty* proph = node->property (X_("Height"));
+ XMLProperty const * proph = node->property (X_("Height"));
if (proph) {
editor->set_video_timeline_height(atoi(proph->value()));
}
#if 0 /* TODO THINK: set FPS first time only ?! */
- const XMLProperty* propasfps = node->property (X_("AutoFPS"));
+ XMLProperty const * propasfps = node->property (X_("AutoFPS"));
if (propasfps) {
auto_set_session_fps = atoi(propasfps->value())?true:false;
}
#endif
- const XMLProperty* propoffset = node->property (X_("VideoOffset"));
+ XMLProperty const * propoffset = node->property (X_("VideoOffset"));
if (propoffset) {
video_offset = atoll(propoffset->value());
video_offset_p = video_offset;
}
- const XMLProperty* proplock = node->property (X_("VideoOffsetLock"));
+ XMLProperty const * proplock = node->property (X_("VideoOffsetLock"));
if (proplock) {
video_offset_lock = atoi(proplock->value())?true:false;
}
- const XMLProperty* localfile = node->property (X_("LocalFile"));
+ XMLProperty const * localfile = node->property (X_("LocalFile"));
if (localfile) {
local_file = atoi(localfile->value())?true:false;
}
- const XMLProperty* propf = node->property (X_("Filename"));
+ XMLProperty const * propf = node->property (X_("Filename"));
video_file_info(propf->value(), local_file);
if ((node = _session->extra_xml (X_("Videomonitor")))) {
- const XMLProperty* prop = node->property (X_("active"));
+ XMLProperty const * prop = node->property (X_("active"));
if (prop && prop->value() == "yes" && found_xjadeo() && !video_filename.empty() && local_file) {
open_video_monitor();
}
@@ -224,8 +225,8 @@ VideoTimeLine::save_undo ()
int
VideoTimeLine::set_state (const XMLNode& node, int /*version*/)
{
- LocaleGuard lg (X_("C"));
- const XMLProperty* propoffset = node.property (X_("VideoOffset"));
+ LocaleGuard lg;
+ XMLProperty const * propoffset = node.property (X_("VideoOffset"));
if (propoffset) {
video_offset = atoll(propoffset->value());
}
@@ -237,7 +238,7 @@ XMLNode&
VideoTimeLine::get_state ()
{
XMLNode* node = new XMLNode (X_("Videotimeline"));
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
node->add_property (X_("VideoOffset"), video_offset_p);
return *node;
}
@@ -556,7 +557,7 @@ VideoTimeLine::check_server ()
, video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
);
- char *res=a3_curl_http_get(url, NULL);
+ char* res = ArdourCurl::http_get (url, NULL);
if (res) {
if (strstr(res, "status: ok, online.")) { ok = true; }
free(res);
@@ -578,7 +579,7 @@ VideoTimeLine::check_server_docroot ()
, video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
);
- char *res=a3_curl_http_get(url, NULL);
+ char* res = ArdourCurl::http_get (url, NULL);
if (!res) {
return false;
}
@@ -674,7 +675,7 @@ VideoTimeLine::flush_cache () {
, video_server_url.c_str()
, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
);
- char *res=a3_curl_http_get(url, NULL);
+ char* res = ArdourCurl::http_get (url, NULL);
if (res) {
free (res);
}
@@ -746,7 +747,12 @@ VideoTimeLine::find_xjadeo () {
return;
}
- version_check.wait ();
+#ifdef PLATFORM_WINDOWS
+ version_check.wait (); // 40ms timeout
+#else
+ version_check.wait (WNOHANG);
+#endif
+
int timeout = 300;
while (xjadeo_version.empty() && --timeout) {
Glib::usleep(10000);
@@ -799,7 +805,7 @@ VideoTimeLine::open_video_monitor() {
/* load mask from Session */
XMLNode* node = _session->extra_xml (X_("XJRestoreSettings"));
if (node) {
- const XMLProperty* prop = node->property (X_("mask"));
+ XMLProperty const * prop = node->property (X_("mask"));
if (prop) {
xj_settings_mask = atoi(prop->value());
}
@@ -820,7 +826,7 @@ VideoTimeLine::open_video_monitor() {
if (_session) {
XMLNode* node = _session->extra_xml (X_("Videomonitor"));
if (node) {
- const XMLProperty* prop = node->property (X_("active"));
+ XMLProperty const * prop = node->property (X_("active"));
if (prop && prop->value() != "yes") _session->set_dirty ();
} else {
_session->set_dirty ();
diff --git a/gtk2_ardour/video_tool_paths.cc b/gtk2_ardour/video_tool_paths.cc
index 2ac4f4d..0126902 100644
--- a/gtk2_ardour/video_tool_paths.cc
+++ b/gtk2_ardour/video_tool_paths.cc
@@ -27,8 +27,9 @@
#endif
#include "pbd/file_utils.h"
+#include "ui_config.h"
#include "video_tool_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
@@ -107,8 +108,18 @@ ArdourVideoToolPaths::xjadeo_exe (std::string &xjadeo_exe)
std::string reg;
std::string program_files = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
#endif
+ xjadeo_exe = X_("");
+
if (getenv("XJREMOTE")) {
xjadeo_exe = getenv("XJREMOTE");
+#ifdef __APPLE__
+ } else if (!UIConfiguration::instance().get_xjadeo_binary().empty()
+ && Glib::file_test (UIConfiguration::instance().get_xjadeo_binary() + "/Contents/MacOS/xjadeo", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) {
+ xjadeo_exe = UIConfiguration::instance().get_xjadeo_binary() + "/Contents/MacOS/xjadeo";
+#endif
+ } else if (!UIConfiguration::instance().get_xjadeo_binary().empty()
+ && Glib::file_test (UIConfiguration::instance().get_xjadeo_binary(), Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) {
+ xjadeo_exe = UIConfiguration::instance().get_xjadeo_binary();
} else if (find_file (Searchpath(Glib::getenv("PATH")), X_("xjremote"), xjadeo_file_path)) {
xjadeo_exe = xjadeo_file_path;
} else if (find_file (Searchpath(Glib::getenv("PATH")), X_("xjadeo"), xjadeo_file_path)) {
@@ -139,11 +150,8 @@ ArdourVideoToolPaths::xjadeo_exe (std::string &xjadeo_exe)
xjadeo_exe = X_("C:\\Program Files\\xjadeo\\xjadeo.exe");
}
#endif
- else {
- xjadeo_exe = X_("");
- return false;
- }
- return true;
+
+ return (!xjadeo_exe.empty() && Glib::file_test(xjadeo_exe, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE));
}
bool
diff --git a/gtk2_ardour/visibility_group.cc b/gtk2_ardour/visibility_group.cc
index 46a941d..d0ef1dd 100644
--- a/gtk2_ardour/visibility_group.cc
+++ b/gtk2_ardour/visibility_group.cc
@@ -21,10 +21,13 @@
#include <gtkmm/menu.h>
#include <gtkmm/menushell.h>
#include <gtkmm/treeview.h>
+
+#include "pbd/strsplit.h"
#include "pbd/xml++.h"
+
#include "visibility_group.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
@@ -168,6 +171,52 @@ VisibilityGroup::set_state (string v)
}
string
+VisibilityGroup::remove_element (std::string const& from, std::string const& element)
+{
+ std::vector<string> s;
+ std::string ret;
+
+ split (from, s, ',');
+ for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+ if ((*i) == element) {
+ continue;
+ }
+ if (!ret.empty()) {
+ ret += ',';
+ }
+ ret += *i;
+ }
+
+ return ret;
+}
+
+string
+VisibilityGroup::add_element (std::string const& from, std::string const& element)
+{
+ std::vector<string> s;
+ std::string ret;
+
+ split (from, s, ',');
+
+ for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+ if ((*i) == element) {
+ /* already present, just return the original */
+ return from;
+ }
+ }
+
+ ret = from;
+
+ if (!ret.empty()) {
+ ret += ',';
+ }
+
+ ret += element;
+
+ return ret;
+}
+
+string
VisibilityGroup::get_state_name () const
{
return _xml_property_name;
diff --git a/gtk2_ardour/visibility_group.h b/gtk2_ardour/visibility_group.h
index 8ac2c1d..ce1adec 100644
--- a/gtk2_ardour/visibility_group.h
+++ b/gtk2_ardour/visibility_group.h
@@ -56,6 +56,9 @@ public:
PBD::Signal0<void> VisibilityChanged;
+ static std::string remove_element (std::string const& from, std::string const& element);
+ static std::string add_element (std::string const& from, std::string const& element);
+
private:
struct Member {
diff --git a/gtk2_ardour/vst_plugin_ui.cc b/gtk2_ardour/vst_plugin_ui.cc
index a964e96..c2bf2c6 100644
--- a/gtk2_ardour/vst_plugin_ui.cc
+++ b/gtk2_ardour/vst_plugin_ui.cc
@@ -45,6 +45,7 @@ VSTPluginUI::VSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert> insert, boost:
box->pack_end (save_button, false, false);
box->pack_end (add_button, false, false);
box->pack_end (_preset_combo, false, false);
+ box->pack_end (pin_management_button, false, false);
bypass_button.set_active (!insert->active ());
diff --git a/gtk2_ardour/win32/msvc_resources.rc.in b/gtk2_ardour/win32/msvc_resources.rc.in
new file mode 100644
index 0000000..0f357d6
--- /dev/null
+++ b/gtk2_ardour/win32/msvc_resources.rc.in
@@ -0,0 +1,110 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource."
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.K.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDR_MAINFRAME ICON "..\\icons\\ardour.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+1 VERSIONINFO
+ FILEVERSION @MSVC_MIXBUS_MAJOR@, at MSVC_MIXBUS_MINOR@, at MSVC_MIXBUS_MICRO@, at MSVC_MIXBUS_INTERFACE_AGE@
+ PRODUCTVERSION @MSVC_MIXBUS_MAJOR@, at MSVC_MIXBUS_MINOR@, at MSVC_MIXBUS_MICRO@, at MSVC_MIXBUS_INTERFACE_AGE@
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x29L
+#else
+ FILEFLAGS 0x28L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "080904b0"
+ BEGIN
+ VALUE "CompanyName", "Harrison Audio LLC"
+ VALUE "FileDescription", "Mixbus"
+ VALUE "FileVersion", "@MSVC_MIXBUS_VERSION at .@MSVC_MIXBUS_INTERFACE_AGE@"
+ VALUE "InternalName", "MixbusWin at DLL_SUFFIX@"
+ VALUE "LegalCopyright", "Copyright Paul Davis and others © 1999-2014"
+ VALUE "LegalTrademarks", "Harrison and Mixbus are trademarks of Harrison Audio LLC"
+ VALUE "OriginalFilename", "Mixbus2- at DLL_SUFFIX@"
+ VALUE "ProductName", "MSVCMixbus"
+ VALUE "ProductVersion", "@MSVC_MIXBUS_MAJOR@, @MSVC_MIXBUS_MINOR@, @MSVC_MIXBUS_MICRO@, @MSVC_MIXBUS_INTERFACE_AGE@"
+ VALUE "SpecialBuild", "Built for Microsoft Windows by John Emmas - (© 2014)"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x809, 1200
+ END
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // English (U.K.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/gtk2_ardour/win32/resource b/gtk2_ardour/win32/resource
new file mode 100644
index 0000000..6aa0099
--- /dev/null
+++ b/gtk2_ardour/win32/resource
@@ -0,0 +1,493 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by msvc_resources.rc
+//
+#define ID_SEPARATOR 0
+#define VS_VERSION_INFO 1
+#define AFX_IDC_LISTBOX 100
+#define AFX_IDC_CHANGE 101
+#define AFX_IDC_BROWSER 102
+#define IDR_MAINFRAME 128
+#define AFX_IDC_PRINT_DOCNAME 201
+#define AFX_IDC_PRINT_PRINTERNAME 202
+#define AFX_IDC_PRINT_PORTNAME 203
+#define AFX_IDC_PRINT_PAGENUM 204
+#define ID_MFCLOC_MANIFEST 1000
+#define AFX_IDC_FONTPROP 1000
+#define AFX_IDC_FONTNAMES 1001
+#define AFX_IDC_FONTSTYLES 1002
+#define AFX_IDC_FONTSIZES 1003
+#define AFX_IDC_STRIKEOUT 1004
+#define AFX_IDC_UNDERLINE 1005
+#define AFX_IDC_SAMPLEBOX 1006
+#define AFX_IDC_COLOR_BLACK 1100
+#define AFX_IDC_COLOR_WHITE 1101
+#define AFX_IDC_COLOR_RED 1102
+#define AFX_IDC_COLOR_GREEN 1103
+#define AFX_IDC_COLOR_BLUE 1104
+#define AFX_IDC_COLOR_YELLOW 1105
+#define AFX_IDC_COLOR_MAGENTA 1106
+#define AFX_IDC_COLOR_CYAN 1107
+#define AFX_IDC_COLOR_GRAY 1108
+#define AFX_IDC_COLOR_LIGHTGRAY 1109
+#define AFX_IDC_COLOR_DARKRED 1110
+#define AFX_IDC_COLOR_DARKGREEN 1111
+#define AFX_IDC_COLOR_DARKBLUE 1112
+#define AFX_IDC_COLOR_LIGHTBROWN 1113
+#define AFX_IDC_COLOR_DARKMAGENTA 1114
+#define AFX_IDC_COLOR_DARKCYAN 1115
+#define AFX_IDC_COLORPROP 1116
+#define AFX_IDC_SYSTEMCOLORS 1117
+#define AFX_IDC_PROPNAME 1201
+#define AFX_IDC_PICTURE 1202
+#define AFX_IDC_BROWSE 1203
+#define AFX_IDC_CLEAR 1204
+#define AFX_IDC_TAB_CONTROL 0x3020
+#define ID_APPLY_NOW 0x3021
+#define ID_WIZBACK 0x3023
+#define ID_WIZNEXT 0x3024
+#define ID_WIZFINISH 0x3025
+#define AFX_IDD_NEWTYPEDLG 30721
+#define AFX_IDD_PRINTDLG 30722
+#define AFX_IDD_PREVIEW_TOOLBAR 30723
+#define AFX_IDD_INSERTOBJECT 30724
+#define AFX_IDD_CHANGEICON 30725
+#define AFX_IDD_CONVERT 30726
+#define AFX_IDD_PASTESPECIAL 30727
+#define AFX_IDD_EDITLINKS 30728
+#define AFX_IDD_FILEBROWSE 30729
+#define AFX_IDD_BUSY 30730
+#define AFX_IDD_OBJECTPROPERTIES 30732
+#define AFX_IDD_CHANGESOURCE 30733
+#define AFX_IDD_EMPTYDIALOG 30734
+#define AFX_IDC_CONTEXTHELP 30977
+#define AFX_IDC_MAGNIFY 30978
+#define AFX_IDC_SMALLARROWS 30979
+#define AFX_IDC_HSPLITBAR 30980
+#define AFX_IDC_VSPLITBAR 30981
+#define AFX_IDC_NODROPCRSR 30982
+#define AFX_IDC_TRACKNWSE 30983
+#define AFX_IDC_TRACKNESW 30984
+#define AFX_IDC_TRACKNS 30985
+#define AFX_IDC_TRACKWE 30986
+#define AFX_IDC_TRACK4WAY 30987
+#define AFX_IDC_MOVE4WAY 30988
+#define AFX_IDB_MINIFRAME_MENU 30994
+#define AFX_IDB_CHECKLISTBOX_95 30996
+#define AFX_IDR_PREVIEW_ACCEL 30997
+#define AFX_IDC_MOUSE_PAN_NW 30998
+#define AFX_IDC_MOUSE_PAN_N 30999
+#define AFX_IDC_MOUSE_PAN_NE 31000
+#define AFX_IDC_MOUSE_PAN_W 31001
+#define AFX_IDC_MOUSE_PAN_HV 31002
+#define AFX_IDC_MOUSE_PAN_E 31003
+#define AFX_IDC_MOUSE_PAN_SW 31004
+#define AFX_IDC_MOUSE_PAN_S 31005
+#define AFX_IDC_MOUSE_PAN_SE 31006
+#define AFX_IDC_MOUSE_PAN_HORZ 31007
+#define AFX_IDC_MOUSE_PAN_VERT 31008
+#define AFX_IDC_MOUSE_ORG_HORZ 31009
+#define AFX_IDC_MOUSE_ORG_VERT 31010
+#define AFX_IDC_MOUSE_ORG_HV 31011
+#define AFX_IDC_MOUSE_MASK 31012
+#define AFX_IDI_STD_MDIFRAME 31233
+#define AFX_IDI_STD_FRAME 31234
+#define AFX_IDD_PROPPAGE_COLOR 32257
+#define AFX_IDD_PROPPAGE_FONT 32258
+#define AFX_IDD_PROPPAGE_PICTURE 32259
+#define AFX_IDB_TRUETYPE 32384
+#define AFX_IDS_APP_TITLE 0xE000
+#define AFX_IDS_IDLEMESSAGE 0xE001
+#define AFX_IDS_HELPMODEMESSAGE 0xE002
+#define AFX_IDS_APP_TITLE_EMBEDDING 0xE003
+#define AFX_IDS_COMPANY_NAME 0xE004
+#define AFX_IDS_OBJ_TITLE_INPLACE 0xE005
+#define ID_FILE_NEW 0xE100
+#define ID_FILE_OPEN 0xE101
+#define ID_FILE_CLOSE 0xE102
+#define ID_FILE_SAVE 0xE103
+#define ID_FILE_SAVE_AS 0xE104
+#define ID_FILE_PAGE_SETUP 0xE105
+#define ID_FILE_PRINT_SETUP 0xE106
+#define ID_FILE_PRINT 0xE107
+#define ID_FILE_PRINT_DIRECT 0xE108
+#define ID_FILE_PRINT_PREVIEW 0xE109
+#define ID_FILE_UPDATE 0xE10A
+#define ID_FILE_SAVE_COPY_AS 0xE10B
+#define ID_FILE_SEND_MAIL 0xE10C
+#define ID_FILE_NEW_FRAME 0xE10D
+#define ID_FILE_MRU_FIRST 0xE110
+#define ID_FILE_MRU_FILE1 0xE110
+#define ID_FILE_MRU_FILE2 0xE111
+#define ID_FILE_MRU_FILE3 0xE112
+#define ID_FILE_MRU_FILE4 0xE113
+#define ID_FILE_MRU_FILE5 0xE114
+#define ID_FILE_MRU_FILE6 0xE115
+#define ID_FILE_MRU_FILE7 0xE116
+#define ID_FILE_MRU_FILE8 0xE117
+#define ID_FILE_MRU_FILE9 0xE118
+#define ID_FILE_MRU_FILE10 0xE119
+#define ID_FILE_MRU_FILE11 0xE11A
+#define ID_FILE_MRU_FILE12 0xE11B
+#define ID_FILE_MRU_FILE13 0xE11C
+#define ID_FILE_MRU_FILE14 0xE11D
+#define ID_FILE_MRU_FILE15 0xE11E
+#define ID_FILE_MRU_FILE16 0xE11F
+#define ID_FILE_MRU_LAST 0xE11F
+#define ID_EDIT_CLEAR 0xE120
+#define ID_EDIT_CLEAR_ALL 0xE121
+#define ID_EDIT_COPY 0xE122
+#define ID_EDIT_CUT 0xE123
+#define ID_EDIT_FIND 0xE124
+#define ID_EDIT_PASTE 0xE125
+#define ID_EDIT_PASTE_LINK 0xE126
+#define ID_EDIT_PASTE_SPECIAL 0xE127
+#define ID_EDIT_REPEAT 0xE128
+#define ID_EDIT_REPLACE 0xE129
+#define ID_EDIT_SELECT_ALL 0xE12A
+#define ID_EDIT_UNDO 0xE12B
+#define ID_EDIT_REDO 0xE12C
+#define ID_WINDOW_NEW 0xE130
+#define ID_WINDOW_ARRANGE 0xE131
+#define ID_WINDOW_CASCADE 0xE132
+#define ID_WINDOW_TILE_HORZ 0xE133
+#define ID_WINDOW_TILE_VERT 0xE134
+#define ID_WINDOW_SPLIT 0xE135
+#define ID_APP_ABOUT 0xE140
+#define ID_APP_EXIT 0xE141
+#define ID_HELP_INDEX 0xE142
+#define ID_HELP_FINDER 0xE143
+#define ID_HELP_USING 0xE144
+#define ID_CONTEXT_HELP 0xE145
+#define ID_HELP 0xE146
+#define ID_DEFAULT_HELP 0xE147
+#define ID_NEXT_PANE 0xE150
+#define ID_PREV_PANE 0xE151
+#define ID_FORMAT_FONT 0xE160
+#define ID_OLE_INSERT_NEW 0xE200
+#define ID_OLE_EDIT_LINKS 0xE201
+#define ID_OLE_EDIT_CONVERT 0xE202
+#define ID_OLE_EDIT_CHANGE_ICON 0xE203
+#define ID_OLE_EDIT_PROPERTIES 0xE204
+#define ID_OLE_VERB_FIRST 0xE210
+#define AFX_ID_PREVIEW_CLOSE 0xE300
+#define AFX_ID_PREVIEW_NUMPAGE 0xE301
+#define AFX_ID_PREVIEW_NEXT 0xE302
+#define AFX_ID_PREVIEW_PREV 0xE303
+#define AFX_ID_PREVIEW_PRINT 0xE304
+#define AFX_ID_PREVIEW_ZOOMIN 0xE305
+#define AFX_ID_PREVIEW_ZOOMOUT 0xE306
+#define ID_INDICATOR_EXT 0xE700
+#define ID_INDICATOR_CAPS 0xE701
+#define ID_INDICATOR_NUM 0xE702
+#define ID_INDICATOR_SCRL 0xE703
+#define ID_INDICATOR_OVR 0xE704
+#define ID_INDICATOR_REC 0xE705
+#define ID_INDICATOR_KANA 0xE706
+#define ID_VIEW_TOOLBAR 0xE800
+#define ID_VIEW_STATUS_BAR 0xE801
+#define ID_VIEW_REBAR 0xE804
+#define ID_VIEW_AUTOARRANGE 0xE805
+#define ID_VIEW_SMALLICON 0xE810
+#define ID_VIEW_LARGEICON 0xE811
+#define ID_VIEW_LIST 0xE812
+#define ID_VIEW_DETAILS 0xE813
+#define ID_VIEW_LINEUP 0xE814
+#define ID_VIEW_BYNAME 0xE815
+#define ID_RECORD_FIRST 0xE900
+#define ID_RECORD_LAST 0xE901
+#define ID_RECORD_NEXT 0xE902
+#define ID_RECORD_PREV 0xE903
+#define AFX_IDS_SCSIZE 0xEF00
+#define AFX_IDS_SCMOVE 0xEF01
+#define AFX_IDS_SCMINIMIZE 0xEF02
+#define AFX_IDS_SCMAXIMIZE 0xEF03
+#define AFX_IDS_SCNEXTWINDOW 0xEF04
+#define AFX_IDS_SCPREVWINDOW 0xEF05
+#define AFX_IDS_SCCLOSE 0xEF06
+#define AFX_IDS_SCRESTORE 0xEF12
+#define AFX_IDS_SCTASKLIST 0xEF13
+#define AFX_IDS_MDICHILD 0xEF1F
+#define AFX_IDS_DESKACCESSORY 0xEFDA
+#define AFX_IDS_OPENFILE 0xF000
+#define AFX_IDS_SAVEFILE 0xF001
+#define AFX_IDS_ALLFILTER 0xF002
+#define AFX_IDS_UNTITLED 0xF003
+#define AFX_IDS_SAVEFILECOPY 0xF004
+#define AFX_IDS_PREVIEW_CLOSE 0xF005
+#define AFX_IDS_UNNAMED_FILE 0xF006
+#define AFX_IDS_HIDE 0xF011
+#define AFX_IDP_NO_ERROR_AVAILABLE 0xF020
+#define AFX_IDS_NOT_SUPPORTED_EXCEPTION 0xF021
+#define AFX_IDS_RESOURCE_EXCEPTION 0xF022
+#define AFX_IDS_MEMORY_EXCEPTION 0xF023
+#define AFX_IDS_USER_EXCEPTION 0xF024
+#define AFX_IDS_INVALID_ARG_EXCEPTION 0xF025
+#define AFX_IDS_PRINTONPORT 0xF040
+#define AFX_IDS_ONEPAGE 0xF041
+#define AFX_IDS_TWOPAGE 0xF042
+#define AFX_IDS_PRINTPAGENUM 0xF043
+#define AFX_IDS_PREVIEWPAGEDESC 0xF044
+#define AFX_IDS_PRINTDEFAULTEXT 0xF045
+#define AFX_IDS_PRINTDEFAULT 0xF046
+#define AFX_IDS_PRINTFILTER 0xF047
+#define AFX_IDS_PRINTCAPTION 0xF048
+#define AFX_IDS_PRINTTOFILE 0xF049
+#define AFX_IDS_OBJECT_MENUITEM 0xF080
+#define AFX_IDS_EDIT_VERB 0xF081
+#define AFX_IDS_ACTIVATE_VERB 0xF082
+#define AFX_IDS_CHANGE_LINK 0xF083
+#define AFX_IDS_AUTO 0xF084
+#define AFX_IDS_MANUAL 0xF085
+#define AFX_IDS_FROZEN 0xF086
+#define AFX_IDS_ALL_FILES 0xF087
+#define AFX_IDS_SAVE_MENU 0xF088
+#define AFX_IDS_UPDATE_MENU 0xF089
+#define AFX_IDS_SAVE_AS_MENU 0xF08A
+#define AFX_IDS_SAVE_COPY_AS_MENU 0xF08B
+#define AFX_IDS_EXIT_MENU 0xF08C
+#define AFX_IDS_UPDATING_ITEMS 0xF08D
+#define AFX_IDS_METAFILE_FORMAT 0xF08E
+#define AFX_IDS_DIB_FORMAT 0xF08F
+#define AFX_IDS_BITMAP_FORMAT 0xF090
+#define AFX_IDS_LINKSOURCE_FORMAT 0xF091
+#define AFX_IDS_EMBED_FORMAT 0xF092
+#define AFX_IDS_PASTELINKEDTYPE 0xF094
+#define AFX_IDS_UNKNOWNTYPE 0xF095
+#define AFX_IDS_RTF_FORMAT 0xF096
+#define AFX_IDS_TEXT_FORMAT 0xF097
+#define AFX_IDS_INVALID_CURRENCY 0xF098
+#define AFX_IDS_INVALID_DATETIME 0xF099
+#define AFX_IDS_INVALID_DATETIMESPAN 0xF09A
+#define AFX_IDP_INVALID_FILENAME 0xF100
+#define AFX_IDP_FAILED_TO_OPEN_DOC 0xF101
+#define AFX_IDP_FAILED_TO_SAVE_DOC 0xF102
+#define AFX_IDP_ASK_TO_SAVE 0xF103
+#define AFX_IDP_FAILED_TO_CREATE_DOC 0xF104
+#define AFX_IDP_FILE_TOO_LARGE 0xF105
+#define AFX_IDP_FAILED_TO_START_PRINT 0xF106
+#define AFX_IDP_FAILED_TO_LAUNCH_HELP 0xF107
+#define AFX_IDP_INTERNAL_FAILURE 0xF108
+#define AFX_IDP_COMMAND_FAILURE 0xF109
+#define AFX_IDP_FAILED_MEMORY_ALLOC 0xF10A
+#define AFX_IDP_UNREG_DONE 0xF10B
+#define AFX_IDP_UNREG_FAILURE 0xF10C
+#define AFX_IDP_DLL_LOAD_FAILED 0xF10D
+#define AFX_IDP_DLL_BAD_VERSION 0xF10E
+#define AFX_IDP_PARSE_INT 0xF110
+#define AFX_IDP_PARSE_REAL 0xF111
+#define AFX_IDP_PARSE_INT_RANGE 0xF112
+#define AFX_IDP_PARSE_REAL_RANGE 0xF113
+#define AFX_IDP_PARSE_STRING_SIZE 0xF114
+#define AFX_IDP_PARSE_RADIO_BUTTON 0xF115
+#define AFX_IDP_PARSE_BYTE 0xF116
+#define AFX_IDP_PARSE_UINT 0xF117
+#define AFX_IDP_PARSE_DATETIME 0xF118
+#define AFX_IDP_PARSE_CURRENCY 0xF119
+#define AFX_IDP_PARSE_GUID 0xF11A
+#define AFX_IDP_PARSE_TIME 0xF11B
+#define AFX_IDP_PARSE_DATE 0xF11C
+#define AFX_IDP_FAILED_INVALID_FORMAT 0xF120
+#define AFX_IDP_FAILED_INVALID_PATH 0xF121
+#define AFX_IDP_FAILED_DISK_FULL 0xF122
+#define AFX_IDP_FAILED_ACCESS_READ 0xF123
+#define AFX_IDP_FAILED_ACCESS_WRITE 0xF124
+#define AFX_IDP_FAILED_IO_ERROR_READ 0xF125
+#define AFX_IDP_FAILED_IO_ERROR_WRITE 0xF126
+#define AFX_IDP_SCRIPT_ERROR 0xF130
+#define AFX_IDP_SCRIPT_DISPATCH_EXCEPTION 0xF131
+#define AFX_IDP_STATIC_OBJECT 0xF180
+#define AFX_IDP_FAILED_TO_CONNECT 0xF181
+#define AFX_IDP_SERVER_BUSY 0xF182
+#define AFX_IDP_BAD_VERB 0xF183
+#define AFX_IDS_NOT_DOCOBJECT 0xF184
+#define AFX_IDP_FAILED_TO_NOTIFY 0xF185
+#define AFX_IDP_FAILED_TO_LAUNCH 0xF186
+#define AFX_IDP_ASK_TO_UPDATE 0xF187
+#define AFX_IDP_FAILED_TO_UPDATE 0xF188
+#define AFX_IDP_FAILED_TO_REGISTER 0xF189
+#define AFX_IDP_FAILED_TO_AUTO_REGISTER 0xF18A
+#define AFX_IDP_FAILED_TO_CONVERT 0xF18B
+#define AFX_IDP_GET_NOT_SUPPORTED 0xF18C
+#define AFX_IDP_SET_NOT_SUPPORTED 0xF18D
+#define AFX_IDP_ASK_TO_DISCARD 0xF18E
+#define AFX_IDP_FAILED_TO_CREATE 0xF18F
+#define AFX_IDP_FAILED_MAPI_LOAD 0xF190
+#define AFX_IDP_INVALID_MAPI_DLL 0xF191
+#define AFX_IDP_FAILED_MAPI_SEND 0xF192
+#define AFX_IDP_FILE_NONE 0xF1A0
+#define AFX_IDP_FILE_GENERIC 0xF1A1
+#define AFX_IDP_FILE_NOT_FOUND 0xF1A2
+#define AFX_IDP_FILE_BAD_PATH 0xF1A3
+#define AFX_IDP_FILE_TOO_MANY_OPEN 0xF1A4
+#define AFX_IDP_FILE_ACCESS_DENIED 0xF1A5
+#define AFX_IDP_FILE_INVALID_FILE 0xF1A6
+#define AFX_IDP_FILE_REMOVE_CURRENT 0xF1A7
+#define AFX_IDP_FILE_DIR_FULL 0xF1A8
+#define AFX_IDP_FILE_BAD_SEEK 0xF1A9
+#define AFX_IDP_FILE_HARD_IO 0xF1AA
+#define AFX_IDP_FILE_SHARING 0xF1AB
+#define AFX_IDP_FILE_LOCKING 0xF1AC
+#define AFX_IDP_FILE_DISKFULL 0xF1AD
+#define AFX_IDP_FILE_EOF 0xF1AE
+#define AFX_IDP_ARCH_NONE 0xF1B0
+#define AFX_IDP_ARCH_GENERIC 0xF1B1
+#define AFX_IDP_ARCH_READONLY 0xF1B2
+#define AFX_IDP_ARCH_ENDOFFILE 0xF1B3
+#define AFX_IDP_ARCH_WRITEONLY 0xF1B4
+#define AFX_IDP_ARCH_BADINDEX 0xF1B5
+#define AFX_IDP_ARCH_BADCLASS 0xF1B6
+#define AFX_IDP_ARCH_BADSCHEMA 0xF1B7
+#define AFX_IDS_OCC_SCALEUNITS_PIXELS 0xF1C0
+#define AFX_IDS_STATUS_FONT 0xF230
+#define AFX_IDS_TOOLTIP_FONT 0xF231
+#define AFX_IDS_UNICODE_FONT 0xF232
+#define AFX_IDS_MINI_FONT 0xF233
+#define AFX_IDP_SQL_CONNECT_FAIL 0xF281
+#define AFX_IDP_SQL_RECORDSET_FORWARD_ONLY 0xF282
+#define AFX_IDP_SQL_EMPTY_COLUMN_LIST 0xF283
+#define AFX_IDP_SQL_FIELD_SCHEMA_MISMATCH 0xF284
+#define AFX_IDP_SQL_ILLEGAL_MODE 0xF285
+#define AFX_IDP_SQL_MULTIPLE_ROWS_AFFECTED 0xF286
+#define AFX_IDP_SQL_NO_CURRENT_RECORD 0xF287
+#define AFX_IDP_SQL_NO_ROWS_AFFECTED 0xF288
+#define AFX_IDP_SQL_RECORDSET_READONLY 0xF289
+#define AFX_IDP_SQL_SQL_NO_TOTAL 0xF28A
+#define AFX_IDP_SQL_ODBC_LOAD_FAILED 0xF28B
+#define AFX_IDP_SQL_DYNASET_NOT_SUPPORTED 0xF28C
+#define AFX_IDP_SQL_SNAPSHOT_NOT_SUPPORTED 0xF28D
+#define AFX_IDP_SQL_API_CONFORMANCE 0xF28E
+#define AFX_IDP_SQL_SQL_CONFORMANCE 0xF28F
+#define AFX_IDP_SQL_NO_DATA_FOUND 0xF290
+#define AFX_IDP_SQL_ROW_UPDATE_NOT_SUPPORTED 0xF291
+#define AFX_IDP_SQL_ODBC_V2_REQUIRED 0xF292
+#define AFX_IDP_SQL_NO_POSITIONED_UPDATES 0xF293
+#define AFX_IDP_SQL_LOCK_MODE_NOT_SUPPORTED 0xF294
+#define AFX_IDP_SQL_DATA_TRUNCATED 0xF295
+#define AFX_IDP_SQL_ROW_FETCH 0xF296
+#define AFX_IDP_SQL_INCORRECT_ODBC 0xF297
+#define AFX_IDP_SQL_UPDATE_DELETE_FAILED 0xF298
+#define AFX_IDP_SQL_DYNAMIC_CURSOR_NOT_SUPPORTED 0xF299
+#define AFX_IDP_SQL_FIELD_NOT_FOUND 0xF29A
+#define AFX_IDP_SQL_BOOKMARKS_NOT_SUPPORTED 0xF29B
+#define AFX_IDP_SQL_BOOKMARKS_NOT_ENABLED 0xF29C
+#define AFX_IDS_DELETED 0xF29D
+#define AFX_IDP_DAO_ENGINE_INITIALIZATION 0xF2B0
+#define AFX_IDP_DAO_DFX_BIND 0xF2B1
+#define AFX_IDP_DAO_OBJECT_NOT_OPEN 0xF2B2
+#define AFX_IDP_DAO_ROWTOOSHORT 0xF2B3
+#define AFX_IDP_DAO_BADBINDINFO 0xF2B4
+#define AFX_IDP_DAO_COLUMNUNAVAILABLE 0xF2B5
+#define AFX_IDS_HTTP_TITLE 0xF2D1
+#define AFX_IDS_HTTP_NO_TEXT 0xF2D2
+#define AFX_IDS_HTTP_BAD_REQUEST 0xF2D3
+#define AFX_IDS_HTTP_AUTH_REQUIRED 0xF2D4
+#define AFX_IDS_HTTP_FORBIDDEN 0xF2D5
+#define AFX_IDS_HTTP_NOT_FOUND 0xF2D6
+#define AFX_IDS_HTTP_SERVER_ERROR 0xF2D7
+#define AFX_IDS_HTTP_NOT_IMPLEMENTED 0xF2D8
+#define AFX_IDS_CHECKLISTBOX_UNCHECK 0xF2E1
+#define AFX_IDS_CHECKLISTBOX_CHECK 0xF2E2
+#define AFX_IDS_CHECKLISTBOX_MIXED 0xF2E3
+#define AFX_IDS_PROPPAGE_UNKNOWN 0xFE01
+#define AFX_IDS_COLOR_DESKTOP 0xFE04
+#define AFX_IDS_COLOR_APPWORKSPACE 0xFE05
+#define AFX_IDS_COLOR_WNDBACKGND 0xFE06
+#define AFX_IDS_COLOR_WNDTEXT 0xFE07
+#define AFX_IDS_COLOR_MENUBAR 0xFE08
+#define AFX_IDS_COLOR_MENUTEXT 0xFE09
+#define AFX_IDS_COLOR_ACTIVEBAR 0xFE0A
+#define AFX_IDS_COLOR_INACTIVEBAR 0xFE0B
+#define AFX_IDS_COLOR_ACTIVETEXT 0xFE0C
+#define AFX_IDS_COLOR_INACTIVETEXT 0xFE0D
+#define AFX_IDS_COLOR_ACTIVEBORDER 0xFE0E
+#define AFX_IDS_COLOR_INACTIVEBORDER 0xFE0F
+#define AFX_IDS_COLOR_WNDFRAME 0xFE10
+#define AFX_IDS_COLOR_SCROLLBARS 0xFE11
+#define AFX_IDS_COLOR_BTNFACE 0xFE12
+#define AFX_IDS_COLOR_BTNSHADOW 0xFE13
+#define AFX_IDS_COLOR_BTNTEXT 0xFE14
+#define AFX_IDS_COLOR_BTNHIGHLIGHT 0xFE15
+#define AFX_IDS_COLOR_DISABLEDTEXT 0xFE16
+#define AFX_IDS_COLOR_HIGHLIGHT 0xFE17
+#define AFX_IDS_COLOR_HIGHLIGHTTEXT 0xFE18
+#define AFX_IDS_REGULAR 0xFE19
+#define AFX_IDS_BOLD 0xFE1A
+#define AFX_IDS_ITALIC 0xFE1B
+#define AFX_IDS_BOLDITALIC 0xFE1C
+#define AFX_IDS_SAMPLETEXT 0xFE1D
+#define AFX_IDS_DISPLAYSTRING_FONT 0xFE1E
+#define AFX_IDS_DISPLAYSTRING_COLOR 0xFE1F
+#define AFX_IDS_DISPLAYSTRING_PICTURE 0xFE20
+#define AFX_IDS_PICTUREFILTER 0xFE21
+#define AFX_IDS_PICTYPE_UNKNOWN 0xFE22
+#define AFX_IDS_PICTYPE_NONE 0xFE23
+#define AFX_IDS_PICTYPE_BITMAP 0xFE24
+#define AFX_IDS_PICTYPE_METAFILE 0xFE25
+#define AFX_IDS_PICTYPE_ICON 0xFE26
+#define AFX_IDS_COLOR_PPG 0xFE28
+#define AFX_IDS_COLOR_PPG_CAPTION 0xFE29
+#define AFX_IDS_FONT_PPG 0xFE2A
+#define AFX_IDS_FONT_PPG_CAPTION 0xFE2B
+#define AFX_IDS_PICTURE_PPG 0xFE2C
+#define AFX_IDS_PICTURE_PPG_CAPTION 0xFE2D
+#define AFX_IDS_PICTUREBROWSETITLE 0xFE30
+#define AFX_IDS_BORDERSTYLE_0 0xFE31
+#define AFX_IDS_BORDERSTYLE_1 0xFE32
+#define AFX_IDS_VERB_EDIT 0xFE40
+#define AFX_IDS_VERB_PROPERTIES 0xFE41
+#define AFX_IDP_PICTURECANTOPEN 0xFE83
+#define AFX_IDP_PICTURECANTLOAD 0xFE84
+#define AFX_IDP_PICTURETOOLARGE 0xFE85
+#define AFX_IDP_PICTUREREADFAILED 0xFE86
+#define AFX_IDP_E_ILLEGALFUNCTIONCALL 0xFEA0
+#define AFX_IDP_E_OVERFLOW 0xFEA1
+#define AFX_IDP_E_OUTOFMEMORY 0xFEA2
+#define AFX_IDP_E_DIVISIONBYZERO 0xFEA3
+#define AFX_IDP_E_OUTOFSTRINGSPACE 0xFEA4
+#define AFX_IDP_E_OUTOFSTACKSPACE 0xFEA5
+#define AFX_IDP_E_BADFILENAMEORNUMBER 0xFEA6
+#define AFX_IDP_E_FILENOTFOUND 0xFEA7
+#define AFX_IDP_E_BADFILEMODE 0xFEA8
+#define AFX_IDP_E_FILEALREADYOPEN 0xFEA9
+#define AFX_IDP_E_DEVICEIOERROR 0xFEAA
+#define AFX_IDP_E_FILEALREADYEXISTS 0xFEAB
+#define AFX_IDP_E_BADRECORDLENGTH 0xFEAC
+#define AFX_IDP_E_DISKFULL 0xFEAD
+#define AFX_IDP_E_BADRECORDNUMBER 0xFEAE
+#define AFX_IDP_E_BADFILENAME 0xFEAF
+#define AFX_IDP_E_TOOMANYFILES 0xFEB0
+#define AFX_IDP_E_DEVICEUNAVAILABLE 0xFEB1
+#define AFX_IDP_E_PERMISSIONDENIED 0xFEB2
+#define AFX_IDP_E_DISKNOTREADY 0xFEB3
+#define AFX_IDP_E_PATHFILEACCESSERROR 0xFEB4
+#define AFX_IDP_E_PATHNOTFOUND 0xFEB5
+#define AFX_IDP_E_INVALIDPATTERNSTRING 0xFEB6
+#define AFX_IDP_E_INVALIDUSEOFNULL 0xFEB7
+#define AFX_IDP_E_INVALIDFILEFORMAT 0xFEB8
+#define AFX_IDP_E_INVALIDPROPERTYVALUE 0xFEB9
+#define AFX_IDP_E_INVALIDPROPERTYARRAYINDEX 0xFEBA
+#define AFX_IDP_E_SETNOTSUPPORTEDATRUNTIME 0xFEBB
+#define AFX_IDP_E_SETNOTSUPPORTED 0xFEBC
+#define AFX_IDP_E_NEEDPROPERTYARRAYINDEX 0xFEBD
+#define AFX_IDP_E_SETNOTPERMITTED 0xFEBE
+#define AFX_IDP_E_GETNOTSUPPORTEDATRUNTIME 0xFEBF
+#define AFX_IDP_E_GETNOTSUPPORTED 0xFEC0
+#define AFX_IDP_E_PROPERTYNOTFOUND 0xFEC1
+#define AFX_IDP_E_INVALIDCLIPBOARDFORMAT 0xFEC2
+#define AFX_IDP_E_INVALIDPICTURE 0xFEC3
+#define AFX_IDP_E_PRINTERERROR 0xFEC4
+#define AFX_IDP_E_CANTSAVEFILETOTEMP 0xFEC5
+#define AFX_IDP_E_SEARCHTEXTNOTFOUND 0xFEC6
+#define AFX_IDP_E_REPLACEMENTSTOOLONG 0xFEC7
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 129
+#define _APS_NEXT_COMMAND_VALUE 32001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc
index b476787..b3960b0 100644
--- a/gtk2_ardour/window_manager.cc
+++ b/gtk2_ardour/window_manager.cc
@@ -22,15 +22,17 @@
#include "ardour/session_handle.h"
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/visibility_tracker.h"
#include "actions.h"
#include "ardour_dialog.h"
+#include "ardour_ui.h"
#include "ardour_window.h"
#include "window_manager.h"
#include "processor_box.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using std::string;
using namespace WM;
@@ -64,16 +66,50 @@ Manager::register_window (ProxyBase* info)
if (!info->menu_name().empty()) {
if (!window_actions) {
- window_actions = Gtk::ActionGroup::create (X_("Window"));
- ActionManager::add_action_group (window_actions);
+ window_actions = ARDOUR_UI::instance()->global_actions.create_action_group (X_("Window"));
}
- info->set_action (ActionManager::register_action (window_actions, info->action_name().c_str(), info->menu_name().c_str(),
- sigc::bind (sigc::mem_fun (*this, &Manager::toggle_window), info)));
+ info->set_action (ARDOUR_UI::instance()->global_actions.register_toggle_action (window_actions,
+ info->action_name().c_str(), info->menu_name().c_str(),
+ sigc::bind (sigc::mem_fun (*this, &Manager::toggle_window), info)));
+
+ info->signal_map.connect (sigc::bind (sigc::mem_fun (*this, &Manager::window_proxy_was_mapped), info));
+ info->signal_unmap.connect (sigc::bind (sigc::mem_fun (*this, &Manager::window_proxy_was_unmapped), info));
+
}
}
void
+Manager::window_proxy_was_mapped (ProxyBase* proxy)
+{
+ Glib::RefPtr<Gtk::Action> act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name()));
+ if (!act) {
+ return;
+ }
+ Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic (act);
+ if (!tact) {
+ return;
+ }
+
+ tact->set_active (true);
+}
+
+void
+Manager::window_proxy_was_unmapped (ProxyBase* proxy)
+{
+ Glib::RefPtr<Gtk::Action> act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name()));
+ if (!act) {
+ return;
+ }
+ Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic (act);
+ if (!tact) {
+ return;
+ }
+
+ tact->set_active (false);
+}
+
+void
Manager::remove (const ProxyBase* info)
{
for (Windows::iterator i = _windows.begin(); i != _windows.end(); ++i) {
@@ -87,8 +123,19 @@ Manager::remove (const ProxyBase* info)
void
Manager::toggle_window (ProxyBase* proxy)
{
- if (proxy) {
- proxy->toggle ();
+ Glib::RefPtr<Gtk::Action> act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name()));
+ if (!act) {
+ return;
+ }
+ Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic (act);
+ if (!tact) {
+ return;
+ }
+
+ if (tact->get_active()) {
+ proxy->present ();
+ } else {
+ proxy->hide ();
}
}
@@ -97,12 +144,27 @@ Manager::show_visible() const
{
for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
if ((*i)->visible()) {
- if (! (*i)->get (true)) {
+ Gtk::Window* win = (*i)->get (true);
+ if (!win) {
/* the window may be a plugin GUI for a plugin which
* is disabled or longer present.
*/
continue;
}
+ if (dynamic_cast<ArdourDialog*> (win)) {
+ /* do not show dialogs at startup. Most
+ * dialogs require some signal connection work
+ * because we are trying to avoid recursive
+ * event loops (connecting instead to
+ * ::signal_response(). This means we need to
+ * destroy the window as well, so that the code
+ * which checks if it should be created will
+ * find that it is missing and will create it
+ * and connect to any necessary signals.
+ */
+ (*i)->drop_window ();
+ continue;
+ }
(*i)->show_all ();
(*i)->present ();
}
@@ -115,15 +177,12 @@ Manager::add_state (XMLNode& root) const
for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
/* don't save state for temporary proxy windows
*/
+
if (dynamic_cast<ProxyTemporary*> (*i)) {
continue;
}
- if (dynamic_cast<ProcessorWindowProxy*> (*i)) {
- ProcessorWindowProxy *pi = dynamic_cast<ProcessorWindowProxy*> (*i);
- root.add_child_nocopy (pi->get_state());
- } else {
- root.add_child_nocopy ((*i)->get_state());
- }
+
+ root.add_child_nocopy ((*i)->get_state());
}
}
@@ -170,269 +229,24 @@ Manager::set_transient_for (Gtk::Window* parent)
/*-------------------------*/
-ProxyBase::ProxyBase (const string& name, const std::string& menu_name)
- : _name (name)
- , _menu_name (menu_name)
- , _window (0)
- , _visible (false)
- , _x_off (-1)
- , _y_off (-1)
- , _width (-1)
- , _height (-1)
- , vistracker (0)
-{
-}
-
-ProxyBase::ProxyBase (const string& name, const std::string& menu_name, const XMLNode& node)
- : _name (name)
- , _menu_name (menu_name)
- , _window (0)
- , _visible (false)
- , _x_off (-1)
- , _y_off (-1)
- , _width (-1)
- , _height (-1)
- , vistracker (0)
+ProxyBase::ProxyBase (const std::string& name, const std::string& menu_name)
+ : WindowProxy (name, menu_name)
{
- set_state (node);
}
-ProxyBase::~ProxyBase ()
+ProxyBase::ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode& node)
+ : WindowProxy (name, menu_name, node)
{
- delete vistracker;
- delete _window;
-}
-
-void
-ProxyBase::set_state (const XMLNode& node)
-{
- XMLNodeList children = node.children ();
-
- XMLNodeList::const_iterator i = children.begin ();
-
- while (i != children.end()) {
- XMLProperty* prop = (*i)->property (X_("name"));
- if ((*i)->name() == X_("Window") && prop && prop->value() == _name) {
- break;
- }
-
- ++i;
- }
-
- if (i != children.end()) {
-
- XMLProperty* prop;
-
- if ((prop = (*i)->property (X_("visible"))) != 0) {
- _visible = PBD::string_is_affirmative (prop->value ());
- }
-
- if ((prop = (*i)->property (X_("x-off"))) != 0) {
- _x_off = atoi (prop->value());
- }
- if ((prop = (*i)->property (X_("y-off"))) != 0) {
- _y_off = atoi (prop->value());
- }
- if ((prop = (*i)->property (X_("x-size"))) != 0) {
- _width = atoi (prop->value());
- }
- if ((prop = (*i)->property (X_("y-size"))) != 0) {
- _height = atoi (prop->value());
- }
- }
-
- /* if we have a window already, reset its properties */
-
- if (_window) {
- setup ();
- }
-}
-
-void
-ProxyBase::set_action (Glib::RefPtr<Gtk::Action> act)
-{
- _action = act;
-}
-
-std::string
-ProxyBase::action_name() const
-{
- return string_compose (X_("toggle-%1"), _name);
-}
-
-void
-ProxyBase::toggle()
-{
- if (!_window) {
- (void) get (true);
- assert (_window);
- /* XXX this is a hack - the window object should really
- ensure its components are all visible. sigh.
- */
- _window->show_all();
- /* we'd like to just call this and nothing else */
- _window->present ();
-
- if (_width != -1 && _height != -1) {
- _window->set_default_size (_width, _height);
- }
- if (_x_off != -1 && _y_off != -1) {
- _window->move (_x_off, _y_off);
- }
-
- } else {
- if (_window->is_mapped()) {
- save_pos_and_size();
- }
- vistracker->cycle_visibility ();
- if (_window->is_mapped()) {
- if (_width != -1 && _height != -1) {
- _window->set_default_size (_width, _height);
- }
- if (_x_off != -1 && _y_off != -1) {
- _window->move (_x_off, _y_off);
- }
- }
- }
-}
-
-XMLNode&
-ProxyBase::get_state () const
-{
- XMLNode* node = new XMLNode (X_("Window"));
- char buf[32];
-
- node->add_property (X_("name"), _name);
-
- if (_window && vistracker) {
-
- /* we have a window, so use current state */
-
- _visible = vistracker->partially_visible ();
- if (_visible) {
- _window->get_position (_x_off, _y_off);
- _window->get_size (_width, _height);
- }
- }
-
- node->add_property (X_("visible"), _visible? X_("yes") : X_("no"));
-
- snprintf (buf, sizeof (buf), "%d", _x_off);
- node->add_property (X_("x-off"), buf);
- snprintf (buf, sizeof (buf), "%d", _y_off);
- node->add_property (X_("y-off"), buf);
- snprintf (buf, sizeof (buf), "%d", _width);
- node->add_property (X_("x-size"), buf);
- snprintf (buf, sizeof (buf), "%d", _height);
- node->add_property (X_("y-size"), buf);
-
- return *node;
-}
-
-void
-ProxyBase::drop_window ()
-{
- if (_window) {
- _window->hide ();
- delete _window;
- _window = 0;
- delete vistracker;
- vistracker = 0;
- }
-}
-
-void
-ProxyBase::use_window (Gtk::Window& win)
-{
- drop_window ();
- _window = &win;
- setup ();
}
void
ProxyBase::setup ()
{
- assert (_window);
-
- vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
- _window->signal_delete_event().connect (sigc::mem_fun (*this, &ProxyBase::delete_event_handler));
-
- if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
- /* cancel any mouse-based positioning */
- _window->set_position (Gtk::WIN_POS_NONE);
- }
-
- if (_width != -1 && _height != -1) {
- _window->set_default_size (_width, _height);
- }
-
- if (_x_off != -1 && _y_off != -1) {
- _window->move (_x_off, _y_off);
- }
+ WindowProxy::setup ();
set_session(_session);
-}
-
-void
-ProxyBase::show ()
-{
- get (true);
- assert (_window);
- _window->show ();
-}
-
-void
-ProxyBase::maybe_show ()
-{
- if (_visible) {
- show ();
- }
-}
-
-void
-ProxyBase::show_all ()
-{
- get (true);
- assert (_window);
- _window->show_all ();
-}
-void
-ProxyBase::present ()
-{
- get (true);
- assert (_window);
-
- _window->show_all ();
- _window->present ();
-
- /* turn off any mouse-based positioning */
- _window->set_position (Gtk::WIN_POS_NONE);
-}
-
-void
-ProxyBase::hide ()
-{
- if (_window) {
- save_pos_and_size();
- _window->hide ();
- }
-}
-
-bool
-ProxyBase::delete_event_handler (GdkEventAny* /*ev*/)
-{
- hide();
- return true;
}
-void
-ProxyBase::save_pos_and_size ()
-{
- if (_window) {
- _window->get_position (_x_off, _y_off);
- _window->get_size (_width, _height);
- }
-}
/*-----------------------*/
ProxyTemporary::ProxyTemporary (const string& name, Gtk::Window* win)
diff --git a/gtk2_ardour/window_manager.h b/gtk2_ardour/window_manager.h
index 6e89be3..9d0363e 100644
--- a/gtk2_ardour/window_manager.h
+++ b/gtk2_ardour/window_manager.h
@@ -1,19 +1,19 @@
/*
- Copyright (C) 2013 Paul Davis
+ Copyright (C) 2013 Paul Davis
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
@@ -27,11 +27,14 @@
#include <glibmm/refptr.h>
#include <sigc++/trackable.h>
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/window_proxy.h"
+
class XMLNode;
namespace Gtk {
- class Window;
- class Action;
+class Window;
+class Action;
}
namespace Gtkmm2ext {
@@ -50,192 +53,158 @@ class ProxyBase;
class Manager : public ARDOUR::SessionHandlePtr
{
public:
- static Manager& instance();
+ static Manager& instance();
- void register_window (ProxyBase*);
- void remove (const ProxyBase*);
- void toggle_window (ProxyBase*);
- void show_visible () const;
- void set_session (ARDOUR::Session*);
- void add_state (XMLNode&) const;
+ void register_window (ProxyBase*);
+ void remove (const ProxyBase*);
+ void toggle_window (ProxyBase*);
+ void show_visible () const;
+ void set_session (ARDOUR::Session*);
+ void add_state (XMLNode&) const;
- /* HACK HACK HACK */
- void set_transient_for (Gtk::Window*);
- Gtk::Window* transient_parent() const { return current_transient_parent; }
+ /* HACK HACK HACK */
+ void set_transient_for (Gtk::Window*);
+ Gtk::Window* transient_parent() const { return current_transient_parent; }
- private:
- typedef std::list<ProxyBase*> Windows;
- Windows _windows;
- Glib::RefPtr<Gtk::ActionGroup> window_actions;
- Gtk::Window* current_transient_parent;
+ private:
+ typedef std::list<ProxyBase*> Windows;
+ Windows _windows;
+ Glib::RefPtr<Gtk::ActionGroup> window_actions;
+ Gtk::Window* current_transient_parent;
- Manager();
- ~Manager();
+ Manager();
+ ~Manager();
- static Manager* _instance;
+ static Manager* _instance;
+ private:
+ void window_proxy_was_mapped (ProxyBase*);
+ void window_proxy_was_unmapped (ProxyBase*);
};
-class ProxyBase : public ARDOUR::SessionHandlePtr, public sigc::trackable {
+class ProxyBase : public ARDOUR::SessionHandlePtr, public Gtkmm2ext::WindowProxy
+{
public:
- ProxyBase (const std::string& name, const std::string& menu_name);
- ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
- virtual ~ProxyBase();
-
- void show ();
- void show_all ();
- void hide ();
- void present ();
- void maybe_show ();
-
- bool visible() const { return _visible; }
- const std::string& name() const { return _name; }
- const std::string& menu_name() const { return _menu_name; }
-
- std::string action_name() const;
- void set_action (Glib::RefPtr<Gtk::Action>);
- Glib::RefPtr<Gtk::Action> action() const { return _action; };
-
- void drop_window ();
- void use_window (Gtk::Window&);
-
- virtual Gtk::Window* get (bool create = false) = 0;
-
- virtual void toggle ();
-
- void set_state (const XMLNode&);
- XMLNode& get_state () const;
+ ProxyBase (const std::string& name, const std::string& menu_name);
+ ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
- virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
-
- operator bool() const { return _window != 0; }
+ virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
protected:
- std::string _name;
- std::string _menu_name;
- Glib::RefPtr<Gtk::Action> _action;
- Gtk::Window* _window;
- mutable bool _visible; ///< true if the window should be visible on startup
- mutable int _x_off; ///< x position
- mutable int _y_off; ///< y position
- mutable int _width; ///< width
- mutable int _height; ///< height
- Gtkmm2ext::VisibilityTracker* vistracker;
-
- void save_pos_and_size ();
- bool delete_event_handler (GdkEventAny *ev);
-
- void setup ();
+ void setup ();
};
-class ProxyTemporary: public ProxyBase {
+class ProxyTemporary: public ProxyBase
+{
public:
- ProxyTemporary (const std::string& name, Gtk::Window* win);
- ~ProxyTemporary();
+ ProxyTemporary (const std::string& name, Gtk::Window* win);
+ ~ProxyTemporary();
- Gtk::Window* get (bool create = false) {
- (void) create;
- return _window;
- }
+ Gtk::Window* get (bool create = false) {
+ (void) create;
+ return _window;
+ }
- Gtk::Window* operator->() {
- return _window;
- }
+ Gtk::Window* operator->() {
+ return _window;
+ }
- ARDOUR::SessionHandlePtr* session_handle ();
+ ARDOUR::SessionHandlePtr* session_handle ();
};
template<typename T>
-class ProxyWithConstructor: public ProxyBase {
+class ProxyWithConstructor: public ProxyBase
+{
public:
- ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c)
- : ProxyBase (name, menu_name) , creator (c) {}
+ ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c)
+ : ProxyBase (name, menu_name) , creator (c) {}
- ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c, const XMLNode* node)
- : ProxyBase (name, menu_name, *node) , creator (c) {}
+ ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c, const XMLNode* node)
+ : ProxyBase (name, menu_name, *node) , creator (c) {}
- Gtk::Window* get (bool create = false) {
- if (!_window) {
- if (!create) {
- return 0;
- }
+ Gtk::Window* get (bool create = false) {
+ if (!_window) {
+ if (!create) {
+ return 0;
+ }
_window = dynamic_cast<Gtk::Window*> (creator ());
- if (_window) {
- setup ();
- }
- }
-
- return _window;
- }
-
- T* operator->() {
- return dynamic_cast<T*> (get (true));
- }
-
- ARDOUR::SessionHandlePtr* session_handle () {
- /* may return null */
- return dynamic_cast<T*> (_window);
- }
-
- void set_session(ARDOUR::Session *s) {
- SessionHandlePtr::set_session (s);
- ARDOUR::SessionHandlePtr* sp = session_handle ();
- if (sp) {
- sp->set_session (s);
- dynamic_cast<T*>(_window)->set_session(s);
- }
- }
-
- private:
- boost::function<T*()> creator;
+ if (_window) {
+ setup ();
+ }
+ }
+
+ return _window;
+ }
+
+ T* operator->() {
+ return dynamic_cast<T*> (get (true));
+ }
+
+ ARDOUR::SessionHandlePtr* session_handle () {
+ /* may return null */
+ return dynamic_cast<T*> (_window);
+ }
+
+ void set_session(ARDOUR::Session *s) {
+ SessionHandlePtr::set_session (s);
+ ARDOUR::SessionHandlePtr* sp = session_handle ();
+ if (sp) {
+ sp->set_session (s);
+ dynamic_cast<T*>(_window)->set_session(s);
+ }
+ }
+
+ private:
+ boost::function<T*()> creator;
};
template<typename T>
-class Proxy : public ProxyBase {
+class Proxy : public ProxyBase
+{
public:
- Proxy (const std::string& name, const std::string& menu_name)
- : ProxyBase (name, menu_name) {}
-
- Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
- : ProxyBase (name, menu_name, *node) {}
-
- Gtk::Window* get (bool create = false) {
- if (!_window) {
- if (!create) {
- return 0;
- }
-
- _window = new T ();
-
- if (_window) {
- setup ();
- }
- }
-
- return _window;
- }
-
- T* operator->() {
- return dynamic_cast<T*> (get(true));
- }
-
- ARDOUR::SessionHandlePtr* session_handle () {
- /* may return null */
- return dynamic_cast<T*> (_window);
- }
-
- void set_session(ARDOUR::Session *s) {
- SessionHandlePtr::set_session (s);
- ARDOUR::SessionHandlePtr* sp = session_handle ();
- if (sp) {
- sp->set_session (s);
- dynamic_cast<T*>(_window)->set_session(s);
- }
- }
+ Proxy (const std::string& name, const std::string& menu_name)
+ : ProxyBase (name, menu_name) {}
+
+ Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
+ : ProxyBase (name, menu_name, *node) {}
+
+ Gtk::Window* get (bool create = false) {
+ if (!_window) {
+ if (!create) {
+ return 0;
+ }
+
+ _window = new T ();
+
+ if (_window) {
+ setup ();
+ }
+ }
+
+ return _window;
+ }
+
+ T* operator->() {
+ return dynamic_cast<T*> (get(true));
+ }
+
+ ARDOUR::SessionHandlePtr* session_handle () {
+ /* may return null */
+ return dynamic_cast<T*> (_window);
+ }
+
+ void set_session(ARDOUR::Session *s) {
+ SessionHandlePtr::set_session (s);
+ ARDOUR::SessionHandlePtr* sp = session_handle ();
+ if (sp) {
+ sp->set_session (s);
+ dynamic_cast<T*>(_window)->set_session(s);
+ }
+ }
private:
- boost::function<T*()> creator;
+ boost::function<T*()> creator;
};
} /* namespace */
diff --git a/gtk2_ardour/windows_icon.rc b/gtk2_ardour/windows_icon.rc
deleted file mode 100644
index 4fc17d0..0000000
--- a/gtk2_ardour/windows_icon.rc
+++ /dev/null
@@ -1 +0,0 @@
-IDI_ICON1 ICON DISCARDABLE "icons/ardour.ico"
diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript
index 9b864be..e1c349f 100644
--- a/gtk2_ardour/wscript
+++ b/gtk2_ardour/wscript
@@ -11,11 +11,18 @@ from waflib.Task import Task
from waflib.Tools import winres
import subprocess
import glob
+import copy
# Mandatory variables
top = '.'
out = 'build'
+from waflib import TaskGen
+ at TaskGen.extension('.m')
+def m_hook(self, node):
+ """Alias .m files to be compiled the same as .c files, gcc will do the right thing."""
+ return self.create_compiled_task('c', node)
+
path_prefix = 'gtk2_ardour/'
gtk2_ardour_sources = [
@@ -28,7 +35,9 @@ gtk2_ardour_sources = [
'ardour_dialog.cc',
'ardour_display.cc',
'ardour_dropdown.cc',
+ 'ardour_http.cc',
'ardour_knob.cc',
+ 'ardour_spinner.cc',
'ardour_ui.cc',
'ardour_ui2.cc',
'ardour_ui_dependents.cc',
@@ -52,9 +61,11 @@ gtk2_ardour_sources = [
'bundle_manager.cc',
'button_joiner.cc',
'clock_group.cc',
+ 'color_theme_manager.cc',
'configinfo.cc',
'control_point.cc',
'control_point_dialog.cc',
+ 'control_slave_ui.cc',
'cursor_context.cc',
'curvetest.cc',
'debug.cc',
@@ -122,6 +133,9 @@ gtk2_ardour_sources = [
'led.cc',
'level_meter.cc',
'location_ui.cc',
+ 'lua_script_manager.cc',
+ 'luainstance.cc',
+ 'luawindow.cc',
'main.cc',
'main_clock.cc',
'marker.cc',
@@ -141,7 +155,6 @@ gtk2_ardour_sources = [
'midi_velocity_dialog.cc',
'missing_file_dialog.cc',
'missing_plugin_dialog.cc',
- 'mixer_actor.cc',
'mixer_group_tabs.cc',
'mixer_strip.cc',
'mixer_ui.cc',
@@ -173,6 +186,8 @@ gtk2_ardour_sources = [
'pingback.cc',
'playlist_selector.cc',
'plugin_eq_gui.cc',
+ 'plugin_pin_dialog.cc',
+ 'plugin_setup_dialog.cc',
'plugin_selector.cc',
'plugin_ui.cc',
'port_group.cc',
@@ -207,6 +222,7 @@ gtk2_ardour_sources = [
'ruler_dialog.cc',
'save_as_dialog.cc',
'search_path_option.cc',
+ 'script_selector.cc',
'selection.cc',
'selection_memento.cc',
'send_ui.cc',
@@ -228,6 +244,7 @@ gtk2_ardour_sources = [
'strip_silence_dialog.cc',
'sys_ex.cc',
'tape_region_view.cc',
+ 'tempo_curve.cc',
'tempo_dialog.cc',
'tempo_lines.cc',
'theme_manager.cc',
@@ -244,6 +261,7 @@ gtk2_ardour_sources = [
'transpose_dialog.cc',
'ui_config.cc',
'utils.cc',
+ 'vca_master_strip.cc',
'verbose_cursor.cc',
'visibility_group.cc',
'window_manager.cc',
@@ -251,6 +269,7 @@ gtk2_ardour_sources = [
'video_image_frame.cc',
'add_video_dialog.cc',
'editor_videotimeline.cc',
+ 'vca_time_axis.cc',
'video_timeline.cc',
'video_monitor.cc',
'transcode_ffmpeg.cc',
@@ -287,8 +306,11 @@ def enoify (major, minor):
return "\\n\\\"Evening Star\\\""
elif minor == 7:
return "\\n\\\"Cluster and Eno\\\""
- elif minor == 8:
+ elif major == 5:
+ if minor == 0:
return "\\n\\\"Before and After Science\\\""
+ elif minor == 1:
+ return "\\n\\\"After the Heat\\\""
return "\\\"\\\""
def options(opt):
@@ -317,6 +339,23 @@ def configure(conf):
autowaf.check_pkg(conf, 'x11', uselib_store='X11', atleast_version='1.1', mandatory=False)
autowaf.check_pkg(conf, 'fontconfig', uselib_store='FONTCONFIG')
+
+ if sys.platform == 'darwin':
+ retval = conf.run_c_code (code='#include <AppKit/NSWindow.h>\n\
+ int main(void) { (void) NSWindowWillStartLiveResizeNotification; return 0; }\n',
+ env = conf.env.derive (),
+ features = [ 'c' ],
+ compiler = 'cc',
+ compile_filename='test.m',
+ mandatory = False,
+ )
+
+ if retval == 0:
+ autowaf.display_msg (conf, 'Checking for Cocoa live resizing constants', 'ok')
+ conf.define ('HAVE_COCOA_LIVE_RESIZING', 1)
+ else:
+ autowaf.display_msg (conf, 'Checking for Cocoa live resizing constants', 'too old - AU plugin windows will be fixed size')
+
conf.write_config_header('gtk2ardour-config.h', remove=False)
bak = conf.env['define_key']
@@ -401,6 +440,44 @@ def build(bld):
VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+ # Tool to dump lua-bindings (of gtk2ardour + libs)
+ if re.search ("linux", sys.platform) != None and bld.env['LUABINDINGDOC']:
+ obj = bld (features = 'cxx c cxxprogram')
+ obj.install_path = None
+ obj.source = list(gtk2_ardour_sources)
+ obj.target = 'luadoc'
+ obj.includes = ['.', '../libs']
+ obj.ldflags = ['-no-undefined']
+ obj.use = [
+ 'libpbd',
+ 'libardour',
+ 'libardour_cp',
+ 'libtimecode',
+ 'libmidipp',
+ 'libgtkmm2ext',
+ 'libcanvas',
+ 'libptformat',
+ ]
+ obj.defines = [
+ 'NOMAIN',
+ 'PACKAGE="' + I18N_PACKAGE + '"',
+ 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
+ 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
+ 'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
+ ]
+ obj.linkflags = ''
+ obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL GTKMM CANVAS FFTW3F LO TAGLIB XML '
+ obj.source += [ 'luadoc.cc', 'bundle_env_linux.cc' ]
+ if bld.is_defined('HAVE_SUIL'):
+ obj.source += [ 'lv2_plugin_ui.cc' ]
+ obj.use += [ 'SUIL' ]
+ if bld.is_defined('LXVST_SUPPORT'):
+ obj.source += [ 'vst_plugin_ui.cc' ]
+ obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
+ obj.defines += [ 'LXVST_SUPPORT' ]
+ obj.use += [ 'X11' ]
+
+
if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
# Windows VST support w/wine
# If we require VST support we build a stub main() and the FST library
@@ -475,13 +552,10 @@ def build(bld):
]
obj.install_path = bld.env['DLLDIR']
obj.linkflags = ''
- obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL'
- obj.uselib += ' GTKMM CANVAS FFTW3F'
- obj.uselib += ' AUDIOUNITS OSX GTKOSX LO '
- obj.uselib += ' TAGLIB '
+ obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL GTKMM CANVAS FFTW3F LO TAGLIB XML '
if sys.platform == 'darwin':
- obj.uselib += ' AUDIOUNITS OSX GTKOSX'
+ obj.uselib += ' AUDIOUNITS OSX '
obj.use += ' libappleutility'
obj.source += [ 'cocoacarbon.mm', 'bundle_env_cocoa.cc' ]
elif bld.env['build_target'] == 'mingw':
@@ -578,7 +652,7 @@ def build(bld):
base_font = ""
# Set up font sizes
- if bld.is_defined('GTKOSX'): # OS X fonts
+ if sys.platform == 'darwin':
basefont = ""
font_sizes = {
'SMALLER' : '9',
@@ -662,8 +736,8 @@ def build(bld):
# Menus
menus_argv = []
- if bld.is_defined('GTKOSX'):
- menus_argv = [ '-E', '-P', '-DGTKOSX', '-' ]
+ if sys.platform == 'darwin':
+ menus_argv = [ '-E', '-P', '-D__APPLE__', '-' ]
else:
menus_argv = [ '-E', '-P' ]
@@ -715,33 +789,26 @@ def build(bld):
# Keybindings
- # 'SAE-de-keypad', 'SAE-de-nokeypad', 'SAE-us-keypad',
- # 'SAE-us-nokeypad', 'ergonomic-us'
-
- #
+ # NATIVE ARDOUR BINDING FILES
# explicitly state the use of perl here so that it works on windows too
- #
- a_rule = 'perl ../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap <${SRC} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
- for b in [ 'mnemonic-us' ] :
+ #
+ a_rule = 'perl ../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap ${SRC[0].abspath()} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
+ for b in [ 'ardour' ] :
obj = bld(
- target = b + '.bindings',
- source = b + '.bindings.in',
+ target = b + '.keys',
+ source = [ b + '.keys.in', 'mixer.bindings', 'processor_box.bindings', 'step_editing.bindings', 'monitor.bindings' ],
rule = a_rule
)
obj.install_path = bld.env['CONFDIR']
-
- # not modified at present
- bld.install_files(bld.env['CONFDIR'], 'dark.colors')
- bld.install_files(bld.env['CONFDIR'], 'step_editing.bindings')
- bld.install_files(bld.env['CONFDIR'], 'mixer.bindings')
-
+
# Icons/Images
bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), bld.path.ant_glob('icons/*.png'))
- bld.install_files(os.path.join (bld.env['DATADIR'], 'pixmaps'), bld.path.ant_glob('pixmaps/*.xpm'))
- bld.install_files(bld.env['DATADIR'], 'splash.png')
- bld.install_files(bld.env['DATADIR'], 'small-splash.png')
bld.install_files(bld.env['DATADIR'], 'ArdourMono.ttf')
+ # Application/Product specific resources (icon, splash)
+ pgmname = Options.options.program_name;
+ bld.install_files(os.path.join(bld.env['DATADIR'], 'resources'), bld.path.ant_glob('resources/' + pgmname + '*'))
+
if bld.env['build_target'] == 'mingw':
# These icons need to overwrite the files already installed in the icons
# directory above. Do this in the external packaging scripts for now.
@@ -750,8 +817,9 @@ def build(bld):
# Default UI configuration
bld.install_files(bld.env['CONFDIR'], 'default_ui_config')
- # Color Themes
- bld.install_files(bld.env['CONFDIR'], 'dark.colors')
+ # Color Themes. Find each color file for this program only
+ # and install
+ bld.install_files (os.path.join(bld.env['DATADIR'], 'themes'), bld.path.ant_glob ('themes/*-' + Options.options.program_name.lower() + '.colors'));
# Default export stuff
bld.install_files(os.path.join(bld.env['CONFDIR'], 'export'), bld.path.ant_glob('export/*.format'))
@@ -791,13 +859,16 @@ def i18n_mo(bld):
def appdata_i18n_pot(bld):
potfile = os.path.join(bld.top_dir, 'gtk2_ardour', 'appdata',
'ardour.appdata.pot')
- if bld.cmd == 'build':
+ if bld.cmd == 'i18n_pot':
Logs.info('Generating pot file from Ardour appdata')
itsfile = os.path.join(bld.top_dir, 'tools', 'as-metainfo.its')
adsource = os.path.join(bld.top_dir, 'gtk2_ardour',
'ardour.appdata.xml.in.in')
Logs.info('Updating ' + potfile)
- subprocess.call(('itstool', '-i', itsfile, '-o', potfile, adsource))
+ try:
+ subprocess.call(('itstool', '-i', itsfile, '-o', potfile, adsource))
+ except:
+ print ('Error processing appdata pot file - ignored')
elif bld.cmd == 'clean' and os.path.exists(potfile):
Logs.info('Removing Ardour appdata pot file')
os.remove(potfile)
diff --git a/headless/wscript b/headless/wscript
index 31a111b..675c76b 100644
--- a/headless/wscript
+++ b/headless/wscript
@@ -58,7 +58,7 @@ def build(bld):
'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
]
obj.install_path = bld.env['LIBDIR']
- obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL'
+ obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL XML'
obj.uselib += ' FFTW3F'
obj.uselib += ' AUDIOUNITS OSX LO '
obj.uselib += ' TAGLIB '
diff --git a/icons/made_with/ardour_made.png b/icons/made_with/ardour_made.png
deleted file mode 100644
index 9dd672e..0000000
Binary files a/icons/made_with/ardour_made.png and /dev/null differ
diff --git a/icons/made_with/ardour_made.xar b/icons/made_with/ardour_made.xar
deleted file mode 100644
index f349ede..0000000
Binary files a/icons/made_with/ardour_made.xar and /dev/null differ
diff --git a/icons/metronome.svg b/icons/metronome.svg
deleted file mode 100644
index 8c637ed..0000000
--- a/icons/metronome.svg
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="24"
- height="24"
- id="svg2"
- version="1.1"
- inkscape:version="0.47 r22583"
- sodipodi:docname="metronome.svg"
- inkscape:export-filename="/usr/local/music/src/ardour/3.0/icons/metronome.png"
- inkscape:export-xdpi="90.629997"
- inkscape:export-ydpi="90.629997">
- <defs
- id="defs4">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 12 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="24 : 12 : 1"
- inkscape:persp3d-origin="12 : 8 : 1"
- id="perspective16" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#54555d"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:zoom="22.627417"
- inkscape:cx="3.8473868"
- inkscape:cy="10.831237"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="false"
- borderlayer="true"
- inkscape:showpageshadow="false"
- inkscape:window-width="1361"
- inkscape:window-height="851"
- inkscape:window-x="1660"
- inkscape:window-y="15"
- inkscape:window-maximized="0"
- inkscape:snap-bbox="true"
- inkscape:object-paths="true"
- inkscape:snap-intersection-paths="true"
- inkscape:object-nodes="true"
- inkscape:snap-smooth-nodes="true"
- inkscape:snap-midpoints="true"
- inkscape:snap-object-midpoints="true"
- inkscape:snap-center="true"
- inkscape:snap-bbox-midpoints="true"
- inkscape:bbox-nodes="true"
- inkscape:bbox-paths="true"
- inkscape:snap-bbox-edge-midpoints="true">
- <inkscape:grid
- type="xygrid"
- id="grid3082"
- empspacing="5"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-1028.3622)">
- <path
- inkscape:connector-curvature="0"
- id="path3863"
- d="m 10.168027,1029.8622 -5.6055269,21 14.8749999,0 -5.605526,-21 -0.751578,0 -2.129475,0 -0.782894,0 z"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- inkscape:export-xdpi="115.66"
- inkscape:export-ydpi="115.66" />
- <path
- inkscape:connector-curvature="0"
- id="path3865"
- d="m 6.541341,1043.5578 10.917318,0"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <path
- inkscape:connector-curvature="0"
- id="path3101"
- d="M 10.668623,1043.5578 5.3644182,1030.6693"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:nodetypes="cc"
- inkscape:transform-center-y="-8.3149"
- inkscape:transform-center-x="3.4441509" />
- <g
- id="g3856"
- style="stroke:#ffffff;stroke-width:2.19440592;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;opacity:0.66417910000000002"
- transform="matrix(0.90977646,0,0,0.91304328,1.0826824,90.466479)">
- <path
- inkscape:connector-curvature="0"
- id="path3054"
- d="M 5.9999998,1043.8622 18,1043.8622"
- style="fill:none;stroke:#ffffff;stroke-width:2.19440592;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
- <g
- id="g3962"
- style="stroke:#ffffff;stroke-width:2.19440592;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none">
- <path
- style="fill:none;stroke:#ffffff;stroke-width:2.19440592;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 9.9863479,1028.8622 -6.1614328,23 16.3501699,0 -6.161432,-23 -0.826113,0 -2.340657,0 -0.8605351,0 z"
- id="path3047"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-x="3.4441509"
- inkscape:transform-center-y="-8.3149"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:2.19440592;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
- d="M 10.609225,1044.038 5.1116982,1030.7324"
- id="path3960"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
-</svg>
diff --git a/icons/midi_panic.svg b/icons/midi_panic.svg
deleted file mode 100644
index 5c894da..0000000
--- a/icons/midi_panic.svg
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- version="1.1"
- inkscape:version="0.47 r22583"
- inkscape:export-filename="midi_panic.png"
- inkscape:export-xdpi="3.3178849"
- inkscape:export-ydpi="3.3178849"
- sodipodi:docname="midi_panic.svg">
- <defs
- id="defs4">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- id="perspective10" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="0.35"
- inkscape:cx="-727.85714"
- inkscape:cy="502.85714"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="false"
- inkscape:window-width="1436"
- inkscape:window-height="949"
- inkscape:window-x="137"
- inkscape:window-y="86"
- inkscape:window-maximized="0" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="opacity:0;color:#000000;fill:#ffffff;fill-opacity:1;stroke:#000500;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect2816"
- width="74.285728"
- height="448.57144"
- x="242.85715"
- y="118.07647" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.61851852"
- id="path3600"
- sodipodi:cx="121.42857"
- sodipodi:cy="768.07648"
- sodipodi:rx="38.57143"
- sodipodi:ry="38.57143"
- d="m 160,768.07648 a 38.57143,38.57143 0 1 1 -77.142857,0 38.57143,38.57143 0 1 1 77.142857,0 z"
- transform="matrix(2.5060478,0,0,2.3125359,-112.56833,-836.59512)"
- inkscape:export-filename="/usr/local/music/src/ardour/3.0/gtk2_ardour/icons/midi_panic.png"
- inkscape:export-xdpi="2.6415093"
- inkscape:export-ydpi="2.6415093" />
- <path
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.26678240000000009px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.61851852"
- d="m 82.984333,281.07273 9.74369,328.04567 58.462137,220.48971 82.82135,0 48.71844,-223.1786 -4.87182,-322.66789 0,0 -194.873797,-2.68889 z"
- id="path3602"
- inkscape:export-xdpi="2.6415093"
- inkscape:export-ydpi="2.6415093"
- inkscape:export-filename="/usr/local/music/src/ardour/3.0/gtk2_ardour/icons/midi_panic.png" />
- </g>
-</svg>
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp
index f1ffdf7..f545edd 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp
@@ -2,14 +2,14 @@
File: ACBaseCodec.cpp
Abstract: ACBaseCodec.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -93,27 +93,27 @@ void ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
outPropertyDataSize = SizeOf32(CFStringRef);
outWritable = false;
break;
-
+
case kAudioCodecPropertyManufacturerCFString:
outPropertyDataSize = SizeOf32(CFStringRef);
outWritable = false;
break;
-
+
case kAudioCodecPropertyFormatCFString:
outPropertyDataSize = SizeOf32(CFStringRef);
outWritable = false;
- break;
+ break;
#endif
case kAudioCodecPropertyRequiresPacketDescription:
outPropertyDataSize = SizeOf32(UInt32);
outWritable = false;
break;
-
+
case kAudioCodecPropertyMinimumNumberInputPackets :
outPropertyDataSize = SizeOf32(UInt32);
outWritable = false;
break;
-
+
case kAudioCodecPropertyMinimumNumberOutputPackets :
outPropertyDataSize = SizeOf32(UInt32);
outWritable = false;
@@ -123,39 +123,39 @@ void ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
outPropertyDataSize = SizeOf32(AudioStreamBasicDescription);
outWritable = true;
break;
-
+
case kAudioCodecPropertySupportedInputFormats:
case kAudioCodecPropertyInputFormatsForOutputFormat:
outPropertyDataSize = GetNumberSupportedInputFormats() * SizeOf32(AudioStreamBasicDescription);
outWritable = false;
break;
-
+
case kAudioCodecPropertyCurrentOutputFormat:
outPropertyDataSize = SizeOf32(AudioStreamBasicDescription);
outWritable = true;
break;
-
+
case kAudioCodecPropertySupportedOutputFormats:
case kAudioCodecPropertyOutputFormatsForInputFormat:
outPropertyDataSize = GetNumberSupportedOutputFormats() * SizeOf32(AudioStreamBasicDescription);
outWritable = false;
break;
-
+
case kAudioCodecPropertyMagicCookie:
outPropertyDataSize = GetMagicCookieByteSize();
outWritable = true;
break;
-
+
case kAudioCodecPropertyInputBufferSize:
outPropertyDataSize = SizeOf32(UInt32);
outWritable = false;
break;
-
+
case kAudioCodecPropertyUsedInputBufferSize:
outPropertyDataSize = SizeOf32(UInt32);
outWritable = false;
break;
-
+
case kAudioCodecPropertyIsInitialized:
outPropertyDataSize = SizeOf32(UInt32);
outWritable = false;
@@ -165,7 +165,7 @@ void ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
outPropertyDataSize = SizeOf32(UInt32) * 2; // Mono, stereo
outWritable = false;
break;
-
+
case kAudioCodecPropertyPrimeMethod:
outPropertyDataSize = SizeOf32(UInt32);
outWritable = false;
@@ -184,35 +184,35 @@ void ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
default:
CODEC_THROW(kAudioCodecUnknownPropertyError);
break;
-
+
};
}
void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPropertyDataSize, void* outPropertyData)
{
UInt32 thePacketsToGet;
-
+
switch(inPropertyID)
{
#if !BUILD_ADEC_LIB
case kAudioCodecPropertyNameCFString:
{
if (ioPropertyDataSize != SizeOf32(CFStringRef)) CODEC_THROW(kAudioCodecBadPropertySizeError);
-
+
CABundleLocker lock;
CFStringRef name = CFCopyLocalizedStringFromTableInBundle(CFSTR("unknown codec"), CFSTR("CodecNames"), GetCodecBundle(), CFSTR(""));
*(CFStringRef*)outPropertyData = name;
- break;
+ break;
}
-
+
case kAudioCodecPropertyManufacturerCFString:
{
if (ioPropertyDataSize != SizeOf32(CFStringRef)) CODEC_THROW(kAudioCodecBadPropertySizeError);
-
+
CABundleLocker lock;
CFStringRef name = CFCopyLocalizedStringFromTableInBundle(CFSTR("Apple, Inc."), CFSTR("CodecNames"), GetCodecBundle(), CFSTR(""));
*(CFStringRef*)outPropertyData = name;
- break;
+ break;
}
#else
// If called on the device these should return nothing but 0
@@ -226,24 +226,24 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
case kAudioCodecPropertyRequiresPacketDescription:
if(ioPropertyDataSize == SizeOf32(UInt32))
{
- *reinterpret_cast<UInt32*>(outPropertyData) = 0;
+ *reinterpret_cast<UInt32*>(outPropertyData) = 0;
}
else
{
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertyMinimumNumberInputPackets :
if(ioPropertyDataSize != SizeOf32(UInt32)) CODEC_THROW(kAudioCodecBadPropertySizeError);
*(UInt32*)outPropertyData = 1;
break;
-
+
case kAudioCodecPropertyMinimumNumberOutputPackets :
if(ioPropertyDataSize != SizeOf32(UInt32)) CODEC_THROW(kAudioCodecBadPropertySizeError);
*(UInt32*)outPropertyData = 1;
break;
-
+
case kAudioCodecPropertyCurrentInputFormat:
if(ioPropertyDataSize == SizeOf32(AudioStreamBasicDescription))
{
@@ -254,14 +254,14 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertySupportedInputFormats:
case kAudioCodecPropertyInputFormatsForOutputFormat:
thePacketsToGet = ioPropertyDataSize / SizeOf32(AudioStreamBasicDescription);
GetSupportedInputFormats(reinterpret_cast<AudioStreamBasicDescription*>(outPropertyData), thePacketsToGet);
ioPropertyDataSize = thePacketsToGet * SizeOf32(AudioStreamBasicDescription);
break;
-
+
case kAudioCodecPropertyCurrentOutputFormat:
if(ioPropertyDataSize == SizeOf32(AudioStreamBasicDescription))
{
@@ -272,14 +272,14 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertySupportedOutputFormats:
case kAudioCodecPropertyOutputFormatsForInputFormat:
thePacketsToGet = ioPropertyDataSize / SizeOf32(AudioStreamBasicDescription);
GetSupportedOutputFormats(reinterpret_cast<AudioStreamBasicDescription*>(outPropertyData), thePacketsToGet);
ioPropertyDataSize = thePacketsToGet * SizeOf32(AudioStreamBasicDescription);
break;
-
+
case kAudioCodecPropertyMagicCookie:
if(ioPropertyDataSize >= GetMagicCookieByteSize())
{
@@ -290,7 +290,7 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertyInputBufferSize:
if(ioPropertyDataSize == SizeOf32(UInt32))
{
@@ -301,7 +301,7 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertyUsedInputBufferSize:
if(ioPropertyDataSize == SizeOf32(UInt32))
{
@@ -312,7 +312,7 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertyIsInitialized:
if(ioPropertyDataSize == SizeOf32(UInt32))
{
@@ -323,7 +323,7 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertyAvailableNumberChannels:
if(ioPropertyDataSize == SizeOf32(UInt32) * 2)
{
@@ -373,7 +373,7 @@ void ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
default:
CODEC_THROW(kAudioCodecUnknownPropertyError);
break;
-
+
};
}
@@ -384,7 +384,7 @@ void ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
{
CODEC_THROW(kAudioCodecIllegalOperationError);
}
-
+
switch(inPropertyID)
{
case kAudioCodecPropertyCurrentInputFormat:
@@ -397,7 +397,7 @@ void ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertyCurrentOutputFormat:
if(inPropertyDataSize == SizeOf32(AudioStreamBasicDescription))
{
@@ -408,11 +408,11 @@ void ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
CODEC_THROW(kAudioCodecBadPropertySizeError);
}
break;
-
+
case kAudioCodecPropertyMagicCookie:
SetMagicCookie(inPropertyData, inPropertyDataSize);
break;
-
+
case kAudioCodecPropertyMinimumNumberOutputPackets :
case kAudioCodecPropertyMinimumNumberInputPackets :
case kAudioCodecPropertyInputBufferSize:
@@ -432,7 +432,7 @@ void ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
case kAudioCodecPropertyRequiresPacketDescription:
CODEC_THROW(kAudioCodecIllegalOperationError);
break;
-
+
default:
CODEC_THROW(kAudioCodecUnknownPropertyError);
break;
@@ -462,13 +462,13 @@ void ACBaseCodec::GetSupportedInputFormats(AudioStreamBasicDescription* outInput
{
UInt32 theNumberFormats = (UInt32)mInputFormatList.size();
ioNumberInputFormats = (theNumberFormats < ioNumberInputFormats) ? theNumberFormats : ioNumberInputFormats;
-
+
FormatList::const_iterator theIterator = mInputFormatList.begin();
theNumberFormats = ioNumberInputFormats;
while((theNumberFormats > 0) && (theIterator != mInputFormatList.end()))
{
*outInputFormats = *theIterator;
-
+
++outInputFormats;
--theNumberFormats;
std::advance(theIterator, 1);
@@ -501,13 +501,13 @@ void ACBaseCodec::GetSupportedOutputFormats(AudioStreamBasicDescription* outOutp
{
UInt32 theNumberFormats = (UInt32)mOutputFormatList.size();
ioNumberOutputFormats = (theNumberFormats < ioNumberOutputFormats) ? theNumberFormats : ioNumberOutputFormats;
-
+
FormatList::const_iterator theIterator = mOutputFormatList.begin();
theNumberFormats = ioNumberOutputFormats;
while((theNumberFormats > 0) && (theIterator != mOutputFormatList.end()))
{
*outOutputFormats = *theIterator;
-
+
++outOutputFormats;
--theNumberFormats;
std::advance(theIterator, 1);
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h
index 6689d91..2329d94 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h
@@ -2,14 +2,14 @@
File: ACBaseCodec.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__ACBaseCodec_h__)
#define __ACBaseCodec_h__
@@ -92,7 +92,7 @@ public:
protected:
virtual void ReallocateInputBuffer(UInt32 inInputBufferByteSize) = 0;
-
+
bool mIsInitialized;
// Format Management
@@ -102,13 +102,13 @@ public:
void GetCurrentInputFormat(AudioStreamBasicDescription& outInputFormat);
virtual void SetCurrentInputFormat(const AudioStreamBasicDescription& inInputFormat);
-
+
UInt32 GetNumberSupportedOutputFormats() const;
void GetSupportedOutputFormats(AudioStreamBasicDescription* outOutputFormats, UInt32& ioNumberOutputFormats) const;
-
+
void GetCurrentOutputFormat(AudioStreamBasicDescription& outOutputFormat);
virtual void SetCurrentOutputFormat(const AudioStreamBasicDescription& inOutputFormat);
-
+
virtual UInt32 GetMagicCookieByteSize() const;
virtual void GetMagicCookie(void* outMagicCookieData, UInt32& ioMagicCookieDataByteSize) const;
virtual void SetMagicCookie(const void* outMagicCookieData, UInt32 inMagicCookieDataByteSize);
@@ -119,11 +119,11 @@ public:
protected:
void AddInputFormat(const AudioStreamBasicDescription& inInputFormat);
void AddOutputFormat(const AudioStreamBasicDescription& inOutputFormat);
-
+
OSType GetSubType();
-
+
typedef std::vector<CAStreamBasicDescription> FormatList;
-
+
FormatList mInputFormatList;
#if TARGET_OS_WIN32
// VC 2005 screws up if this is not aligned to 8-byte boundaries
@@ -131,7 +131,7 @@ protected:
#else
CAStreamBasicDescription mInputFormat;
#endif
-
+
FormatList mOutputFormatList;
#if TARGET_OS_WIN32
// VC 2005 screws up if this is not aligned to 8-byte boundaries
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp
index 512f938..19cc0cd 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp
@@ -2,14 +2,14 @@
File: ACCodec.cpp
Abstract: ACCodec.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -83,18 +83,18 @@ ACCodec::~ACCodec()
OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCodec *inThis)
{
OSStatus theError = kAudioCodecNoError;
-
+
try
{
switch (inParameters->what)
{
// these selectors don't use the object pointer
-
+
case kComponentOpenSelect:
case kComponentCloseSelect:
theError = ComponentBase::ComponentEntryDispatch(inParameters, inThis);
break;
-
+
case kComponentCanDoSelect:
{
switch (GetSelectorForCanDo(inParameters))
@@ -115,7 +115,7 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
}
break;
-
+
default:
// these selectors use the object pointer
if(inThis != NULL)
@@ -125,16 +125,16 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
case kComponentVersionSelect:
theError = inThis->Version();
break;
-
+
case kAudioCodecGetPropertyInfoSelect:
{
PARAM(AudioCodecPropertyID, inPropertyID, 0, 3);
PARAM(UInt32 *, outSize, 1, 3);
PARAM(Boolean *, outWritable, 2, 3);
-
+
UInt32 theSize = 0;
Boolean isWritable = false;
-
+
inThis->GetPropertyInfo(inPropertyID, theSize, isWritable);
if(outSize != NULL)
{
@@ -146,13 +146,13 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
}
break;
-
+
case kAudioCodecGetPropertySelect:
{
PARAM(AudioCodecPropertyID, inPropertyID, 0, 3);
PARAM(UInt32 *, ioPropertyDataSize, 1, 3);
PARAM(void *, outPropertyData, 2, 3);
-
+
if((ioPropertyDataSize != NULL) && (outPropertyData != NULL))
{
inThis->GetProperty(inPropertyID, *ioPropertyDataSize, outPropertyData);
@@ -163,13 +163,13 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
}
break;
-
+
case kAudioCodecSetPropertySelect:
{
PARAM(AudioCodecPropertyID, inPropertyID, 0, 3);
PARAM(UInt32, inPropertyDataSize, 1, 3);
PARAM(const void *, inPropertyData, 2, 3);
-
+
if(inPropertyData != NULL)
{
inThis->SetProperty(inPropertyID, inPropertyDataSize, inPropertyData);
@@ -180,31 +180,31 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
}
break;
-
+
case kAudioCodecInitializeSelect:
{
PARAM(const AudioStreamBasicDescription *, inInputFormat, 0, 4);
PARAM(const AudioStreamBasicDescription *, inOutputFormat, 1, 4);
PARAM(const void *, inMagicCookie, 2, 4);
PARAM(UInt32, inMagicCookieByteSize, 3, 4);
-
+
inThis->Initialize(inInputFormat, inOutputFormat, inMagicCookie, inMagicCookieByteSize);
}
break;
-
+
case kAudioCodecUninitializeSelect:
{
inThis->Uninitialize();
}
break;
-
+
case kAudioCodecAppendInputDataSelect:
{
PARAM(const void *, inInputData, 0, 4);
PARAM(UInt32 *, ioInputDataByteSize, 1, 4);
PARAM(UInt32 *, ioNumberPackets, 2, 4);
PARAM(const AudioStreamPacketDescription *, inPacketDescription, 3, 4);
-
+
if((inInputData != NULL) && (ioInputDataByteSize != NULL))
{
if(ioNumberPackets != NULL)
@@ -223,7 +223,7 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
}
break;
-
+
case kAudioCodecProduceOutputDataSelect:
{
PARAM(void *, outOutputData, 0, 5);
@@ -231,7 +231,7 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
PARAM(UInt32 *, ioNumberPackets, 2, 5);
PARAM(AudioStreamPacketDescription *, outPacketDescription, 3, 5);
PARAM(UInt32 *, outStatus, 4, 5);
-
+
if((outOutputData != NULL) && (ioOutputDataByteSize != NULL) && (ioNumberPackets != NULL) && (outStatus != NULL))
{
*outStatus = inThis->ProduceOutputPackets(outOutputData, *ioOutputDataByteSize, *ioNumberPackets, outPacketDescription);
@@ -246,7 +246,7 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
}
break;
-
+
#if AC_NON_INTERLEAVED_SUPPORT
case kAudioCodecAppendInputBufferListSelect:
{
@@ -254,7 +254,7 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
PARAM(UInt32 *, ioNumberPackets, 1, 4);
PARAM(const AudioStreamPacketDescription *, inPacketDescription, 2, 4);
PARAM(UInt32 *, outBytesConsumed, 3, 4);
-
+
if((inBufferList != NULL) && (outBytesConsumed != NULL))
{
if(ioNumberPackets != NULL)
@@ -273,14 +273,14 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
}
break;
-
+
case kAudioCodecProduceOutputBufferListSelect:
{
PARAM(AudioBufferList *, ioBufferList, 0, 4);
PARAM(UInt32 *, ioNumberPackets, 1, 4);
PARAM(AudioStreamPacketDescription *, outPacketDescription, 2, 4);
PARAM(UInt32 *, outStatus, 3, 4);
-
+
if((ioBufferList != NULL) && (ioNumberPackets != NULL) && (outStatus != NULL))
{
*outStatus = inThis->ProduceOutputBufferList(ioBufferList, *ioNumberPackets, outPacketDescription);
@@ -296,13 +296,13 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
}
break;
#endif // AC_NON_INTERLEAVED_SUPPORT
-
+
case kAudioCodecResetSelect:
{
inThis->Reset();
}
break;
-
+
default:
theError = badComponentSelector;
break;
@@ -323,7 +323,7 @@ OSStatus ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
{
theError = kAudioCodecUnspecifiedError;
}
-
+
return theError;
}
#endif // !CA_USE_AUDIO_PLUGIN_ONLY && !TARGET_OS_IPHONE
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h
index b0d9316..9b7fecd 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h
@@ -2,14 +2,14 @@
File: ACCodec.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__ACCodec_h__)
#define __ACCodec_h__
@@ -75,7 +75,7 @@ class ACCodec : public ComponentBase
public:
ACCodec(AudioComponentInstance inInstance);
virtual ~ACCodec();
-
+
#if !CA_USE_AUDIO_PLUGIN_ONLY && !TARGET_OS_IPHONE
static OSStatus ComponentEntryDispatch(ComponentParameters *p, ACCodec *This);
#endif
@@ -91,10 +91,10 @@ public:
virtual void Initialize(const AudioStreamBasicDescription* inInputFormat, const AudioStreamBasicDescription* inOutputFormat, const void* inMagicCookie, UInt32 inMagicCookieByteSize) = 0;
virtual void Uninitialize() = 0;
virtual void Reset() = 0;
-
+
virtual void AppendInputData(const void* inInputData, UInt32& ioInputDataByteSize, UInt32& ioNumberPackets, const AudioStreamPacketDescription* inPacketDescription) = 0;
virtual void AppendInputBufferList(const AudioBufferList *ioBufferList, UInt32& ioNumberPackets, const AudioStreamPacketDescription *inPacketDescription, UInt32 *outBytesConsumed) = 0;
-
+
virtual UInt32 ProduceOutputPackets(void* outOutputData, UInt32& ioOutputDataByteSize, UInt32& ioNumberPackets, AudioStreamPacketDescription* outPacketDescription) = 0;
virtual UInt32 ProduceOutputBufferList(AudioBufferList *ioBufferList, UInt32& ioNumberPackets, AudioStreamPacketDescription *outPacketDescription) = 0;
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h
index 42c2bc5..1969d74 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h
@@ -2,14 +2,14 @@
File: ACCodecDispatchTypes.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__ACCodecDispatchTypes_h__)
#define __ACCodecDispatchTypes_h__
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h
index 2cff483..8d82d12 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h
@@ -2,14 +2,14 @@
File: ACConditionalMacros.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__ACConditionalMacros_h__)
#define __ACConditionalMacros_h__
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp
index de9599b..e2204b8 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp
@@ -2,14 +2,14 @@
File: ACPlugInDispatch.cpp
Abstract: ACPlugInDispatch.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if AUDIOCODECS_SUPPORT_PLUGINS
#include "ACPlugInDispatch.h"
@@ -242,10 +242,10 @@ AudioComponentMethod AudioCodecNonInterleavedEncoderLookup::Lookup (SInt16 selec
AudioComponentMethod method = AudioCodecLookup::Lookup(selector);
if (method)
return method;
-
+
if (selector == kAudioCodecAppendInputBufferListSelect)
return (AudioComponentMethod)AppendInputBufferList;
-
+
return NULL;
}
@@ -254,10 +254,10 @@ AudioComponentMethod AudioCodecNonInterleavedDecoderLookup::Lookup (SInt16 selec
AudioComponentMethod method = AudioCodecLookup::Lookup(selector);
if (method)
return method;
-
+
if (selector == kAudioCodecProduceOutputBufferListSelect)
return (AudioComponentMethod)ProduceOutputBufferList;
-
+
return NULL;
}
#endif
@@ -269,14 +269,14 @@ AudioComponentMethod AudioCodecHWCodecLookup::Lookup (SInt16 selector)
{
AudioComponentMethod method = AudioCodecLookup::Lookup(selector);
if (method) return method;
-
+
switch (selector) {
case kAudioCodecAcquireHardwareSelect: return (AudioComponentMethod)AcquireHardware;
case kAudioCodecReleaseHardwareSelect: return (AudioComponentMethod)ReleaseHardware;
default:
break;
}
- return NULL;
+ return NULL;
}
#endif // TARGET_OS_IPHONE && AUDIOCONV_HAVE_AMC
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h
index 252a4af..7c84cac 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h
@@ -2,14 +2,14 @@
File: ACPlugInDispatch.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __ACPlugInDispatch_h__
#define __ACPlugInDispatch_h__
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp
index b10add9..bc78a15 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp
@@ -2,14 +2,14 @@
File: ACSimpleCodec.cpp
Abstract: ACSimpleCodec.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -81,8 +81,8 @@ void ACSimpleCodec::Initialize(const AudioStreamBasicDescription* inInputFormat,
if (mInputFormat.mBytesPerPacket == 0)
{
CODEC_THROW(kAudioCodecUnsupportedFormatError);
- }
-
+ }
+
ACBaseCodec::Initialize(inInputFormat, inOutputFormat, inMagicCookie, inMagicCookieByteSize);
}
@@ -91,11 +91,11 @@ void ACSimpleCodec::Uninitialize()
// get rid of the buffer
delete[] mInputBuffer;
mInputBuffer = NULL;
-
+
// reset the ring buffer state
mInputBufferStart = 0;
mInputBufferEnd = 0;
-
+
ACBaseCodec::Uninitialize();
}
@@ -105,11 +105,11 @@ void ACSimpleCodec::Reset()
if (mInputBuffer) { // could be called before allocated.
memset(mInputBuffer, 0, mInputBufferByteSize);
}
-
+
// reset the ring buffer state
mInputBufferStart = 0;
mInputBufferEnd = 0;
-
+
ACBaseCodec::Reset();
}
@@ -121,7 +121,7 @@ UInt32 ACSimpleCodec::GetInputBufferByteSize() const
UInt32 ACSimpleCodec::GetUsedInputBufferByteSize() const
{
UInt32 theAnswer = 0;
-
+
// this object uses a ring buffer
if(mInputBufferStart <= mInputBufferEnd)
{
@@ -130,10 +130,10 @@ UInt32 ACSimpleCodec::GetUsedInputBufferByteSize() const
}
else
{
- // the active region wraps around
+ // the active region wraps around
theAnswer = (mInputBufferByteSize - mInputBufferStart) + mInputBufferEnd;
}
-
+
return theAnswer;
}
@@ -142,7 +142,7 @@ void ACSimpleCodec::AppendInputData(const void* inInputData, UInt32& ioInputData
{
// this buffer handling code doesn't care about such things as the packet descriptions
if(!mIsInitialized) CODEC_THROW(kAudioCodecStateError);
-
+
// this is a ring buffer we're dealing with, so we need to set up a few things
UInt32 theUsedByteSize = GetUsedInputBufferByteSize();
UInt32 theAvailableByteSize = GetInputBufferByteSize() - theUsedByteSize;
@@ -150,51 +150,51 @@ void ACSimpleCodec::AppendInputData(const void* inInputData, UInt32& ioInputData
UInt32 theMaxAvailableInputBytes = ioInputDataByteSize; // we can't consume more than we get
const Byte* theInputData = static_cast<const Byte*>(inInputData);
-
+
// >>jamesmcc: added this because ioNumberPackets was not being updated if less was taken than given.
// THIS ASSUMES CBR!
UInt32 bytesPerPacketOfInput = mInputFormat.mBytesPerPacket;
UInt32 theAvailablePacketSize = theAvailableByteSize / bytesPerPacketOfInput;
-
+
UInt32 minPacketSize = ioNumberPackets < theAvailablePacketSize ? ioNumberPackets : theAvailablePacketSize;
UInt32 minByteSize = minPacketSize * bytesPerPacketOfInput;
-
+
// we can copy only as much data as there is or up to how much space is availiable
ioNumberPackets = minPacketSize;
ioInputDataByteSize = minByteSize;
-
+
// ioInputDataByteSize had better be <= to theMaxAvailableInputBytes or we're screwed
if (ioInputDataByteSize > theMaxAvailableInputBytes)
{
CODEC_THROW(kAudioCodecStateError);
}
- // <<jamesmcc
-
+ // <<jamesmcc
+
// now we have to copy the data taking into account the wrap around and where the start is
if(mInputBufferEnd + ioInputDataByteSize < mInputBufferByteSize)
{
// no wrap around here
memcpy(mInputBuffer + mInputBufferEnd, theInputData, ioInputDataByteSize);
-
+
// adjust the end point
mInputBufferEnd += ioInputDataByteSize;
}
else
{
// the copy will wrap
-
+
// copy the first part
UInt32 theBeforeWrapByteSize = mInputBufferByteSize - mInputBufferEnd;
memcpy(mInputBuffer + mInputBufferEnd, theInputData, theBeforeWrapByteSize);
-
+
// and the rest
UInt32 theAfterWrapByteSize = ioInputDataByteSize - theBeforeWrapByteSize;
memcpy(mInputBuffer, theInputData + theBeforeWrapByteSize, theAfterWrapByteSize);
-
+
// adjust the end point
mInputBufferEnd = theAfterWrapByteSize;
}
-
+
}
@@ -202,46 +202,46 @@ void ACSimpleCodec::ZeroPadInputData(UInt32& ioNumberPackets, const AudioStreamP
{
// this buffer handling code doesn't care about such things as the packet descriptions
if(!mIsInitialized) CODEC_THROW(kAudioCodecStateError);
-
-
+
+
// this is a ring buffer we're dealing with, so we need to set up a few things
UInt32 theUsedByteSize = GetUsedInputBufferByteSize();
UInt32 theAvailableByteSize = GetInputBufferByteSize() - theUsedByteSize;
-
+
// >>jamesmcc: added this because ioNumberPackets was not being updated if less was taken than given.
// THIS ASSUMES CBR!
UInt32 bytesPerPacketOfInput = mInputFormat.mBytesPerPacket;
UInt32 theAvailablePacketSize = theAvailableByteSize / bytesPerPacketOfInput;
-
+
UInt32 minPacketSize = ioNumberPackets < theAvailablePacketSize ? ioNumberPackets : theAvailablePacketSize;
UInt32 minByteSize = minPacketSize * bytesPerPacketOfInput;
-
+
// we can copy only as much data as there is or up to how much space is availiable
ioNumberPackets = minPacketSize;
-
- // <<jamesmcc
-
+
+ // <<jamesmcc
+
// now we have to copy the data taking into account the wrap around and where the start is
if(mInputBufferEnd + minByteSize < mInputBufferByteSize)
{
// no wrap around here
memset(mInputBuffer + mInputBufferEnd, 0, minByteSize);
-
+
// adjust the end point
mInputBufferEnd += minByteSize;
}
else
{
// the copy will wrap
-
+
// copy the first part
UInt32 theBeforeWrapByteSize = mInputBufferByteSize - mInputBufferEnd;
memset(mInputBuffer + mInputBufferEnd, 0, theBeforeWrapByteSize);
-
+
// and the rest
UInt32 theAfterWrapByteSize = minByteSize - theBeforeWrapByteSize;
memset(mInputBuffer, 0, theAfterWrapByteSize);
-
+
// adjust the end point
mInputBufferEnd = theAfterWrapByteSize;
}
@@ -252,32 +252,32 @@ void ACSimpleCodec::ConsumeInputData(UInt32 inConsumedByteSize)
{
// this is a convenience routine to make maintaining the ring buffer state easy
UInt32 theContiguousRange = GetInputBufferContiguousByteSize();
-
+
if(inConsumedByteSize > GetUsedInputBufferByteSize()) CODEC_THROW(kAudioCodecUnspecifiedError);
-
+
if(inConsumedByteSize <= theContiguousRange)
{
// the region to consume doesn't wrap
-
+
// figure out how much to consume
inConsumedByteSize = (theContiguousRange < inConsumedByteSize) ? theContiguousRange : inConsumedByteSize;
-
+
// clear the consumed bits
memset(mInputBuffer + mInputBufferStart, 0, inConsumedByteSize);
-
+
// adjust the start
mInputBufferStart += inConsumedByteSize;
}
else
{
// the region to consume will wrap
-
+
// clear the bits to the end of the buffer
memset(mInputBuffer + mInputBufferStart, 0, theContiguousRange);
-
+
// now clear the bits left from the start
memset(mInputBuffer, 0, inConsumedByteSize - theContiguousRange);
-
+
// adjust the start
mInputBufferStart = inConsumedByteSize - theContiguousRange;
}
@@ -287,24 +287,24 @@ void ACSimpleCodec::ConsumeInputData(UInt32 inConsumedByteSize)
Byte* ACSimpleCodec::GetBytes(UInt32& ioNumberBytes) const
{
// if a client's algorithm has to have contiguous data and mInputBuffer wraps, then someone has to make a copy.
- // I can do it more efficiently than the client.
-
+ // I can do it more efficiently than the client.
+
if(!mIsInitialized) CODEC_THROW(kAudioCodecStateError);
UInt32 theUsedByteSize = GetUsedInputBufferByteSize();
//UInt32 theAvailableByteSize = GetInputBufferByteSize() - theUsedByteSize;
-
+
if (ioNumberBytes > theUsedByteSize) ioNumberBytes = theUsedByteSize;
-
+
SInt32 leftOver = mInputBufferStart + ioNumberBytes - mInputBufferByteSize;
-
+
if(leftOver > 0)
{
- // need to copy beginning of buffer to the end.
+ // need to copy beginning of buffer to the end.
// We cleverly over allocated our buffer space to make this possible.
memmove(mInputBuffer + mInputBufferByteSize, mInputBuffer, leftOver);
}
-
+
return GetInputBufferStart();
}
@@ -312,17 +312,17 @@ Byte* ACSimpleCodec::GetBytes(UInt32& ioNumberBytes) const
void ACSimpleCodec::ReallocateInputBuffer(UInt32 inInputBufferByteSize)
{
mInputBufferByteSize = inInputBufferByteSize + kBufferPad;
-
+
// toss the old buffer
delete[] mInputBuffer;
mInputBuffer = NULL;
-
+
// allocate the new one
// allocate extra in order to allow making contiguous data.
UInt32 allocSize = 2*inInputBufferByteSize + kBufferPad;
mInputBuffer = new Byte[allocSize];
memset(mInputBuffer, 0, allocSize);
-
+
// reset the ring buffer state
mInputBufferStart = 0;
mInputBufferEnd = 0;
@@ -359,6 +359,6 @@ void ACSimpleCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProp
break;
default:
ACBaseCodec::SetProperty(inPropertyID, inPropertyDataSize, inPropertyData);
- break;
+ break;
}
}
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h
index f41fe54..f8b5d0f 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h
@@ -2,14 +2,14 @@
File: ACSimpleCodec.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__ACSimpleCodec_h__)
#define __ACSimpleCodec_h__
@@ -84,17 +84,17 @@ public:
virtual void SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inPropertyDataSize, const void* inPropertyData);
protected:
- void ConsumeInputData(UInt32 inConsumedByteSize);
+ void ConsumeInputData(UInt32 inConsumedByteSize);
Byte* GetInputBufferStart() const { return mInputBuffer + mInputBufferStart; }
UInt32 GetInputBufferContiguousByteSize() const { return (mInputBufferStart <= mInputBufferEnd) ? (mInputBufferEnd - mInputBufferStart) : (mInputBufferByteSize - mInputBufferStart); }
virtual void ReallocateInputBuffer(UInt32 inInputBufferByteSize);
-
- // returns a pointer to contiguous bytes.
+
+ // returns a pointer to contiguous bytes.
// will do some copying if the request wraps around the internal buffer.
// request must be less than available bytes
Byte* GetBytes(UInt32& ioNumberBytes) const;
-private:
+private:
Byte* mInputBuffer;
UInt32 mInputBufferByteSize;
UInt32 mInputBufferStart;
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp
index 8954c8d..f0b0ef9 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp
@@ -2,14 +2,14 @@
File: GetCodecBundle.cpp
Abstract: GetCodecBundle.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "GetCodecBundle.h"
@@ -59,7 +59,7 @@ const CFStringRef kCodecBundleID = CFSTR("com.apple.audio.codecs.Components");
CFBundleRef GetCodecBundle()
{
static CFBundleRef sAudioCodecBundle = 0;
- if (!sAudioCodecBundle)
+ if (!sAudioCodecBundle)
{
#if TARGET_OS_WIN32
sAudioCodecBundle = CFBundleGetBundleWithIdentifier(CFSTR(kCodecBundleID));
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h
index 96e3d9e..f6c501a 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h
@@ -2,14 +2,14 @@
File: GetCodecBundle.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef _GetCodecBundle_
#define _GetCodecBundle_
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp
index 053da0a..4bbc0d6 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp
@@ -2,14 +2,14 @@
File: AudioFileComponentBase.cpp
Abstract: AudioFileComponentBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
#include <AudioToolbox/AudioFileComponent.h>
@@ -84,8 +84,8 @@ static OSStatus CreateURL(
static OSStatus OpenURL(
void * self,
- CFURLRef inFileRef,
- SInt8 inPermissions,
+ CFURLRef inFileRef,
+ SInt8 inPermissions,
int inFileDescriptor)
{
return AFC->AFAPI_OpenURL(inFileRef, inPermissions, inFileDescriptor);
@@ -93,9 +93,9 @@ static OSStatus OpenURL(
static OSStatus OpenWithCallbacks(
void * self,
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc)
{
@@ -104,9 +104,9 @@ static OSStatus OpenWithCallbacks(
static OSStatus InitializeWithCallbacks(
void * self,
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc,
UInt32 inFileType,
@@ -131,8 +131,8 @@ static OSStatus Optimize(
static OSStatus ReadBytes(
void * self,
Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
void *outBuffer)
{
return AFC->AFAPI_ReadBytes(inUseCache, inStartingByte, ioNumBytes, outBuffer);
@@ -142,8 +142,8 @@ static OSStatus ReadBytes(
static OSStatus WriteBytes(
void * self,
Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
const void *inBuffer)
{
return AFC->AFAPI_WriteBytes(inUseCache, inStartingByte, ioNumBytes, inBuffer);
@@ -155,11 +155,11 @@ static OSStatus ReadPackets(
Boolean inUseCache,
UInt32 *outNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
- return AFC->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions,
+ return AFC->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions,
inStartingPacket, ioNumPackets, outBuffer);
}
@@ -168,11 +168,11 @@ static OSStatus ReadPacketData(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
- return AFC->AFAPI_ReadPacketData(inUseCache, ioNumBytes, outPacketDescriptions,
+ return AFC->AFAPI_ReadPacketData(inUseCache, ioNumBytes, outPacketDescriptions,
inStartingPacket, ioNumPackets, outBuffer);
}
@@ -182,8 +182,8 @@ static OSStatus WritePackets(
Boolean inUseCache,
UInt32 inNumBytes,
AudioStreamPacketDescription *inPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
const void *inBuffer)
#else
static OSStatus WritePackets(
@@ -191,12 +191,12 @@ static OSStatus WritePackets(
Boolean inUseCache,
UInt32 inNumBytes,
const AudioStreamPacketDescription *inPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
const void *inBuffer)
#endif
{
- return AFC->AFAPI_WritePackets(inUseCache, inNumBytes,
+ return AFC->AFAPI_WritePackets(inUseCache, inNumBytes,
(const AudioStreamPacketDescription *)inPacketDescriptions, // this should be const (and is in 10.5 headers)
inStartingPacket, ioNumPackets, inBuffer);
}
@@ -281,7 +281,7 @@ static OSStatus ExtensionIsThisFormat(
{
AudioFileFormatBase* aff = AFC->GetAudioFileFormatBase();
if (!aff) return kAudio_ParamError;
-
+
UInt32 res = aff->ExtensionIsThisFormat(inExtension);
if (outResult) *outResult = res;
return noErr;
@@ -289,13 +289,13 @@ static OSStatus ExtensionIsThisFormat(
static OSStatus FileDataIsThisFormat(
void * self,
- UInt32 inDataByteSize,
+ UInt32 inDataByteSize,
const void* inData,
UInt32 *outResult)
{
AudioFileFormatBase* aff = AFC->GetAudioFileFormatBase();
if (!aff) return kAudio_ParamError;
-
+
UncertainResult res = aff->FileDataIsThisFormat(inDataByteSize, inData);
if (outResult) *outResult = res;
return noErr;
@@ -346,33 +346,33 @@ AudioFileObjectComponentBase::~AudioFileObjectComponentBase()
}
OSStatus AudioFileObjectComponentBase::AFAPI_CreateURL(
- CFURLRef inFileRef,
+ CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags)
{
if (!mAudioFileObject) return kAudio_ParamError;
-
+
OSStatus result = mAudioFileObject->DoCreate (inFileRef, inFormat, inFlags);
return result;
}
-
+
OSStatus AudioFileObjectComponentBase::AFAPI_OpenURL(
- CFURLRef inFileRef,
+ CFURLRef inFileRef,
SInt8 inPermissions,
int inFD)
{
if (!mAudioFileObject) return kAudio_ParamError;
-
+
OSStatus result = mAudioFileObject->DoOpen(inFileRef, inPermissions, inFD);
return result;
}
OSStatus AudioFileObjectComponentBase::AFAPI_OpenWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc)
{
@@ -382,9 +382,9 @@ OSStatus AudioFileObjectComponentBase::AFAPI_OpenWithCallbacks(
OSStatus AudioFileObjectComponentBase::AFAPI_InitializeWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc,
UInt32 inFileType,
@@ -392,11 +392,11 @@ OSStatus AudioFileObjectComponentBase::AFAPI_InitializeWithCallbacks(
UInt32 inFlags)
{
if (!mAudioFileObject) return kAudio_ParamError;
- return mAudioFileObject->DoInitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc,
+ return mAudioFileObject->DoInitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc,
inFileType, inFormat, inFlags);
}
-
+
OSStatus AudioFileObjectComponentBase::AFAPI_Close()
{
if (!mAudioFileObject) return kAudio_ParamError;
@@ -409,10 +409,10 @@ OSStatus AudioFileObjectComponentBase::AFAPI_Optimize()
return mAudioFileObject->DoOptimize();
}
-OSStatus AudioFileObjectComponentBase::AFAPI_ReadBytes(
+OSStatus AudioFileObjectComponentBase::AFAPI_ReadBytes(
Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
void *outBuffer)
{
if (!mAudioFileObject) return kAudio_ParamError;
@@ -420,10 +420,10 @@ OSStatus AudioFileObjectComponentBase::AFAPI_ReadBytes(
}
-OSStatus AudioFileObjectComponentBase::AFAPI_WriteBytes(
+OSStatus AudioFileObjectComponentBase::AFAPI_WriteBytes(
Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
const void *inBuffer)
{
if (!mAudioFileObject) return kAudio_ParamError;
@@ -433,12 +433,12 @@ OSStatus AudioFileObjectComponentBase::AFAPI_WriteBytes(
-OSStatus AudioFileObjectComponentBase::AFAPI_ReadPackets(
+OSStatus AudioFileObjectComponentBase::AFAPI_ReadPackets(
Boolean inUseCache,
UInt32 *outNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
if (!mAudioFileObject) return kAudio_ParamError;
@@ -446,12 +446,12 @@ OSStatus AudioFileObjectComponentBase::AFAPI_ReadPackets(
inStartingPacket, ioNumPackets, outBuffer);
}
-OSStatus AudioFileObjectComponentBase::AFAPI_ReadPacketData(
+OSStatus AudioFileObjectComponentBase::AFAPI_ReadPacketData(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
if (!mAudioFileObject) return kAudio_ParamError;
@@ -459,13 +459,13 @@ OSStatus AudioFileObjectComponentBase::AFAPI_ReadPacketData(
inStartingPacket, ioNumPackets, outBuffer);
}
-
-OSStatus AudioFileObjectComponentBase::AFAPI_WritePackets(
+
+OSStatus AudioFileObjectComponentBase::AFAPI_WritePackets(
Boolean inUseCache,
UInt32 inNumBytes,
const AudioStreamPacketDescription *inPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
const void *inBuffer)
{
if (!mAudioFileObject) return kAudio_ParamError;
@@ -474,8 +474,8 @@ OSStatus AudioFileObjectComponentBase::AFAPI_WritePackets(
}
-
-OSStatus AudioFileObjectComponentBase::AFAPI_GetPropertyInfo(
+
+OSStatus AudioFileObjectComponentBase::AFAPI_GetPropertyInfo(
AudioFilePropertyID inPropertyID,
UInt32 *outDataSize,
UInt32 *isWritable)
@@ -484,23 +484,23 @@ OSStatus AudioFileObjectComponentBase::AFAPI_GetPropertyInfo(
return mAudioFileObject->GetPropertyInfo(inPropertyID, outDataSize, isWritable);
}
-
-OSStatus AudioFileObjectComponentBase::AFAPI_GetProperty(
+
+OSStatus AudioFileObjectComponentBase::AFAPI_GetProperty(
AudioFilePropertyID inPropertyID,
UInt32 *ioPropertySize,
void *ioPropertyData)
{
OSStatus err = noErr;
-
+
if (!ioPropertyData) return kAudio_ParamError;
-
+
if (!mAudioFileObject) return kAudio_ParamError;
err = mAudioFileObject->GetProperty(inPropertyID, ioPropertySize, ioPropertyData);
return err;
}
-
-OSStatus AudioFileObjectComponentBase::AFAPI_SetProperty(
+
+OSStatus AudioFileObjectComponentBase::AFAPI_SetProperty(
AudioFilePropertyID inPropertyID,
UInt32 inPropertySize,
const void *inPropertyData)
@@ -510,7 +510,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_SetProperty(
}
-OSStatus AudioFileObjectComponentBase::AFAPI_CountUserData(
+OSStatus AudioFileObjectComponentBase::AFAPI_CountUserData(
UInt32 inUserDataID,
UInt32 *outNumberItems)
{
@@ -518,7 +518,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_CountUserData(
return mAudioFileObject->CountUserData(inUserDataID, outNumberItems);
}
-OSStatus AudioFileObjectComponentBase::AFAPI_GetUserDataSize(
+OSStatus AudioFileObjectComponentBase::AFAPI_GetUserDataSize(
UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *outUserDataSize)
@@ -527,7 +527,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_GetUserDataSize(
return mAudioFileObject->GetUserDataSize(inUserDataID, inIndex, outUserDataSize);
}
-OSStatus AudioFileObjectComponentBase::AFAPI_GetUserData(
+OSStatus AudioFileObjectComponentBase::AFAPI_GetUserData(
UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *ioUserDataSize,
@@ -537,7 +537,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_GetUserData(
return mAudioFileObject->GetUserData(inUserDataID, inIndex, ioUserDataSize, outUserData);
}
-OSStatus AudioFileObjectComponentBase::AFAPI_SetUserData(
+OSStatus AudioFileObjectComponentBase::AFAPI_SetUserData(
UInt32 inUserDataID,
UInt32 inIndex,
UInt32 inUserDataSize,
@@ -547,7 +547,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_SetUserData(
return mAudioFileObject->SetUserData(inUserDataID, inIndex, inUserDataSize, inUserData);
}
-OSStatus AudioFileObjectComponentBase::AFAPI_RemoveUserData(
+OSStatus AudioFileObjectComponentBase::AFAPI_RemoveUserData(
UInt32 inUserDataID,
UInt32 inIndex)
{
@@ -556,14 +556,14 @@ OSStatus AudioFileObjectComponentBase::AFAPI_RemoveUserData(
}
-OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
+OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
AudioFilePropertyID inPropertyID,
UInt32 inSpecifierSize,
const void* inSpecifier,
UInt32 *outPropertySize)
{
OSStatus err = noErr;
-
+
switch (inPropertyID)
{
case kAudioFileComponent_CanRead :
@@ -578,15 +578,15 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
case kAudioFileComponent_ExtensionsForType :
*outPropertySize = sizeof(CFArrayRef);
break;
-
+
case kAudioFileComponent_UTIsForType :
*outPropertySize = sizeof(CFArrayRef);
break;
-
+
case kAudioFileComponent_MIMETypesForType :
*outPropertySize = sizeof(CFArrayRef);
break;
-
+
case kAudioFileComponent_AvailableFormatIDs :
{
UInt32 size = 0xFFFFFFFF;
@@ -608,7 +608,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
err = GetAudioFileFormatBase()->GetAvailableStreamDescriptions(inFormatID, outPropertySize, NULL);
}
break;
-
+
default:
err = kAudioFileUnsupportedPropertyError;
}
@@ -616,7 +616,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
}
-OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
+OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
AudioFilePropertyID inPropertyID,
UInt32 inSpecifierSize,
const void* inSpecifier,
@@ -624,9 +624,9 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
void *ioPropertyData)
{
OSStatus err = noErr;
-
+
if (!ioPropertyData || !ioPropertySize) return kAudio_ParamError;
-
+
switch (inPropertyID)
{
case kAudioFileComponent_CanRead :
@@ -636,7 +636,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
*flag = GetAudioFileFormatBase()->CanRead();
}
break;
-
+
case kAudioFileComponent_CanWrite :
{
if (*ioPropertySize != sizeof(UInt32)) return kAudioFileBadPropertySizeError;
@@ -644,7 +644,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
*flag = GetAudioFileFormatBase()->CanWrite();
}
break;
-
+
case kAudioFileComponent_FileTypeName :
{
if (*ioPropertySize != sizeof(CFStringRef)) return kAudioFileBadPropertySizeError;
@@ -682,21 +682,21 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
err = GetAudioFileFormatBase()->GetHFSCodes(ioPropertySize, ioPropertyData);
}
break;
-
+
case kAudioFileComponent_AvailableFormatIDs :
{
err = GetAudioFileFormatBase()->GetAvailableFormatIDs(ioPropertySize, ioPropertyData);
}
break;
-
+
case kAudioFileComponent_AvailableStreamDescriptionsForFormat :
{
if (inSpecifierSize != sizeof(UInt32)) return kAudioFileBadPropertySizeError;
- UInt32 inFormatID = *(UInt32*)inSpecifier;
+ UInt32 inFormatID = *(UInt32*)inSpecifier;
err = GetAudioFileFormatBase()->GetAvailableStreamDescriptions(inFormatID, ioPropertySize, ioPropertyData);
}
break;
-
+
default:
err = kAudioFileUnsupportedPropertyError;
}
@@ -709,11 +709,11 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
{
OSStatus result = noErr;
if (inThis == NULL) return kAudio_ParamError;
-
+
try
{
switch (params->what)
- {
+ {
case kComponentCanDoSelect:
switch (GetSelectorForCanDo(params))
{
@@ -734,7 +734,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
case kAudioFileFileDataIsThisFormatSelect:
case kAudioFileGetGlobalInfoSizeSelect:
case kAudioFileGetGlobalInfoSelect:
-
+
case kAudioFileCountUserDataSelect:
case kAudioFileGetUserDataSizeSelect:
case kAudioFileGetUserDataSelect:
@@ -756,7 +756,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(CFURLRef, inFileRef, 0, 3);
PARAM(const AudioStreamBasicDescription*, inFormat, 1, 3);
PARAM(UInt32, inFlags, 2, 3);
-
+
result = inThis->AFAPI_CreateURL(inFileRef, inFormat, inFlags);
}
break;
@@ -765,7 +765,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(CFURLRef, inFileRef, 0, 3);
PARAM(SInt32, inPermissions, 1, 3);
PARAM(int, inFileDescriptor, 2, 3);
-
+
result = inThis->AFAPI_OpenURL(inFileRef, inPermissions, inFileDescriptor);
}
break;
@@ -776,8 +776,8 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(AudioFile_WriteProc, inWriteFunc, 2, 5);
PARAM(AudioFile_GetSizeProc, inGetSizeFunc, 3, 5);
PARAM(AudioFile_SetSizeProc, inSetSizeFunc, 4, 5);
-
- result = inThis->AFAPI_OpenWithCallbacks(inRefCon, inReadFunc, inWriteFunc,
+
+ result = inThis->AFAPI_OpenWithCallbacks(inRefCon, inReadFunc, inWriteFunc,
inGetSizeFunc, inSetSizeFunc);
}
break;
@@ -791,8 +791,8 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(UInt32, inFileType, 5, 8);
PARAM(const AudioStreamBasicDescription*, inFormat, 6, 8);
PARAM(UInt32, inFlags, 7, 8);
-
- result = inThis->AFAPI_InitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc,
+
+ result = inThis->AFAPI_InitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc,
inGetSizeFunc, inSetSizeFunc,
inFileType, inFormat, inFlags);
}
@@ -813,7 +813,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(SInt64*, inStartingByte, 1, 4);
PARAM(UInt32*, ioNumBytes, 2, 4);
PARAM(void*, outBuffer, 3, 4);
-
+
result = inThis->AFAPI_ReadBytes(inUseCache, *inStartingByte, ioNumBytes,
outBuffer);
}
@@ -824,7 +824,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(SInt64*, inStartingByte, 1, 4);
PARAM(UInt32*, ioNumBytes, 2, 4);
PARAM(const void*, inBuffer, 3, 4);
-
+
result = inThis->AFAPI_WriteBytes(inUseCache, *inStartingByte, ioNumBytes,
inBuffer);
}
@@ -837,8 +837,8 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(SInt64*, inStartingPacket, 3, 6);
PARAM(UInt32*, ioNumPackets, 4, 6);
PARAM(void*, outBuffer, 5, 6);
-
- result = inThis->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions,
+
+ result = inThis->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions,
*inStartingPacket, ioNumPackets, outBuffer);
}
break;
@@ -850,28 +850,28 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(SInt64*, inStartingPacket, 3, 6);
PARAM(UInt32*, ioNumPackets, 4, 6);
PARAM(const void*, inBuffer, 5, 6);
-
- result = inThis->AFAPI_WritePackets(inUseCache, inNumBytes, inPacketDescriptions,
+
+ result = inThis->AFAPI_WritePackets(inUseCache, inNumBytes, inPacketDescriptions,
*inStartingPacket, ioNumPackets, inBuffer);
}
break;
-
+
case kAudioFileGetPropertyInfoSelect:
{
PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 3);
PARAM(UInt32*, outPropertySize, 1, 3);
PARAM(UInt32*, outWritable, 2, 3);
-
+
result = inThis->AFAPI_GetPropertyInfo(inPropertyID, outPropertySize, outWritable);
}
break;
-
+
case kAudioFileGetPropertySelect:
{
PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 3);
PARAM(UInt32*, ioPropertyDataSize, 1, 3);
PARAM(void*, outPropertyData, 2, 3);
-
+
result = inThis->AFAPI_GetProperty(inPropertyID, ioPropertyDataSize, outPropertyData);
}
break;
@@ -880,18 +880,18 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 3);
PARAM(UInt32, inPropertyDataSize, 1, 3);
PARAM(const void*, inPropertyData, 2, 3);
-
+
result = inThis->AFAPI_SetProperty(inPropertyID, inPropertyDataSize, inPropertyData);
}
break;
-
+
case kAudioFileGetGlobalInfoSizeSelect:
{
PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 4);
PARAM(UInt32, inSpecifierSize, 1, 4);
PARAM(const void*, inSpecifier, 2, 4);
PARAM(UInt32*, outPropertyDataSize, 3, 4);
-
+
result = inThis->AFAPI_GetGlobalInfoSize(inPropertyID, inSpecifierSize, inSpecifier,
outPropertyDataSize);
}
@@ -903,34 +903,34 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
PARAM(const void*, inSpecifier, 2, 5);
PARAM(UInt32*, ioPropertyDataSize, 3, 5);
PARAM(void*, outPropertyData, 4, 5);
-
+
result = inThis->AFAPI_GetGlobalInfo(inPropertyID, inSpecifierSize, inSpecifier,
ioPropertyDataSize, outPropertyData);
}
break;
-
+
case kAudioFileExtensionIsThisFormatSelect:
{
PARAM(CFStringRef, inExtension, 0, 2);
PARAM(UInt32*, outResult, 1, 2);
-
+
AudioFileFormatBase* aff = inThis->GetAudioFileFormatBase();
if (!aff) return kAudio_ParamError;
-
+
UInt32 res = aff->ExtensionIsThisFormat(inExtension);
if (outResult) *outResult = res;
}
break;
-
+
case kAudioFileFileDataIsThisFormatSelect:
{
PARAM(UInt32, inDataByteSize, 0, 3);
PARAM(const void*, inData, 1, 3);
PARAM(UInt32*, outResult, 2, 3);
-
+
AudioFileFormatBase* aff = inThis->GetAudioFileFormatBase();
if (!aff) return kAudio_ParamError;
-
+
UncertainResult res = aff->FileDataIsThisFormat(inDataByteSize, inData);
if (outResult) *outResult = res;
}
@@ -940,55 +940,55 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
{
PARAM(UInt32, inUserDataID, 0, 2);
PARAM(UInt32*, outNumberItems, 1, 2);
-
+
result = inThis->AFAPI_CountUserData(inUserDataID, outNumberItems);
}
break;
-
+
case kAudioFileGetUserDataSizeSelect:
{
PARAM(UInt32, inUserDataID, 0, 3);
PARAM(UInt32, inIndex, 1, 3);
PARAM(UInt32*, outUserDataSize, 2, 3);
-
+
result = inThis->AFAPI_GetUserDataSize(inUserDataID, inIndex, outUserDataSize);
}
break;
-
+
case kAudioFileGetUserDataSelect:
{
PARAM(UInt32, inUserDataID, 0, 4);
PARAM(UInt32, inIndex, 1, 4);
PARAM(UInt32*, ioUserDataSize, 2, 4);
PARAM(void*, outUserData, 3, 4);
-
- result = inThis->AFAPI_GetUserData(inUserDataID, inIndex,
+
+ result = inThis->AFAPI_GetUserData(inUserDataID, inIndex,
ioUserDataSize, outUserData);
}
break;
-
+
case kAudioFileSetUserDataSelect:
{
PARAM(UInt32, inUserDataID, 0, 4);
PARAM(UInt32, inIndex, 1, 4);
PARAM(UInt32, inUserDataSize, 2, 4);
PARAM(const void*, inUserData, 3, 4);
-
- result = inThis->AFAPI_SetUserData(inUserDataID, inIndex,
+
+ result = inThis->AFAPI_SetUserData(inUserDataID, inIndex,
inUserDataSize, inUserData);
}
break;
-
+
case kAudioFileRemoveUserDataSelect:
{
PARAM(UInt32, inUserDataID, 0, 2);
PARAM(UInt32, inIndex, 1, 2);
-
+
result = inThis->AFAPI_RemoveUserData(inUserDataID, inIndex);
}
break;
-
-
+
+
default:
result = ComponentBase::ComponentEntryDispatch(params, inThis);
break;
@@ -996,13 +996,13 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
}
COMPONENT_CATCH
return result;
-}
+}
#endif
AudioComponentMethod AudioFileComponentLookup::Lookup (SInt16 selector)
{
switch (selector) {
-
+
#define DefCase(NAME) case kAudioFile##NAME##Select: return (AudioComponentMethod)NAME
DefCase(OpenWithCallbacks);
@@ -1016,7 +1016,7 @@ AudioComponentMethod AudioFileComponentLookup::Lookup (SInt16 selector)
DefCase(GetPropertyInfo);
DefCase(GetProperty);
DefCase(SetProperty);
-
+
DefCase(ExtensionIsThisFormat);
DefCase(GetGlobalInfoSize);
DefCase(GetGlobalInfo);
@@ -1030,7 +1030,7 @@ AudioComponentMethod AudioFileComponentLookup::Lookup (SInt16 selector)
DefCase(OpenURL);
DefCase(FileDataIsThisFormat);
DefCase(ReadPacketData);
-
+
// These selectors are deprecated and do not appear: Create, Open, Initialize, FileIsThisFormat, DataIsThisFormat.
default:
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h
index 5a11934..50e0627 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h
@@ -2,14 +2,14 @@
File: AudioFileComponentBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AudioFileComponentBase_h__
#define __AudioFileComponentBase_h__
@@ -67,7 +67,7 @@ public:
virtual ~AudioFileComponentBase();
virtual AudioFileFormatBase* GetAudioFileFormatBase() const = 0;
-
+
/* Public API Function Support */
virtual OSStatus AFAPI_CreateURL(
CFURLRef inFileRef,
@@ -75,96 +75,96 @@ public:
UInt32 inFlags) { return kAudio_UnimplementedError; }
virtual OSStatus AFAPI_OpenURL(
- CFURLRef inFileRef,
+ CFURLRef inFileRef,
SInt8 inPermissions,
int inFD) { return kAudio_UnimplementedError; }
-
+
virtual OSStatus AFAPI_Create(
- const FSRef *inParentRef,
+ const FSRef *inParentRef,
CFStringRef inFileName,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags,
FSRef *outNewFileRef) { return kAudio_UnimplementedError; }
-
+
virtual OSStatus AFAPI_Initialize(
const FSRef *inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags) { return kAudio_UnimplementedError; }
-
+
virtual OSStatus AFAPI_Open(
- const FSRef *inFileRef,
+ const FSRef *inFileRef,
SInt8 inPermissions,
SInt16 inRefNum) { return kAudio_UnimplementedError; }
virtual OSStatus AFAPI_OpenWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc)=0;
virtual OSStatus AFAPI_InitializeWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc,
UInt32 inFileType,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags)=0;
-
+
virtual OSStatus AFAPI_Close()=0;
virtual OSStatus AFAPI_Optimize()=0;
virtual OSStatus AFAPI_ReadBytes( Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
void *outBuffer)=0;
-
+
virtual OSStatus AFAPI_WriteBytes( Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
const void *inBuffer)=0;
-
+
virtual OSStatus AFAPI_ReadPackets( Boolean inUseCache,
UInt32 *outNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)=0;
-
+
virtual OSStatus AFAPI_ReadPacketData( Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)=0;
-
+
virtual OSStatus AFAPI_WritePackets( Boolean inUseCache,
UInt32 inNumBytes,
const AudioStreamPacketDescription *inPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
const void *inBuffer)=0;
-
+
virtual OSStatus AFAPI_GetPropertyInfo( AudioFilePropertyID inPropertyID,
UInt32 *outDataSize,
UInt32 *isWritable)=0;
-
+
virtual OSStatus AFAPI_GetProperty( AudioFilePropertyID inPropertyID,
UInt32 *ioDataSize,
void *ioPropertyData)=0;
-
+
virtual OSStatus AFAPI_SetProperty( AudioFilePropertyID inPropertyID,
UInt32 inDataSize,
const void *inPropertyData)=0;
- virtual OSStatus AFAPI_GetGlobalInfoSize(
+ virtual OSStatus AFAPI_GetGlobalInfoSize(
AudioFilePropertyID inPropertyID,
UInt32 inSpecifierSize,
const void* inSpecifier,
UInt32 *outPropertySize);
- virtual OSStatus AFAPI_GetGlobalInfo(
+ virtual OSStatus AFAPI_GetGlobalInfo(
AudioFilePropertyID inPropertyID,
UInt32 inSpecifierSize,
const void* inSpecifier,
@@ -173,21 +173,21 @@ public:
virtual OSStatus AFAPI_CountUserData( UInt32 inUserDataID,
UInt32 *outNumberItems)=0;
-
+
virtual OSStatus AFAPI_GetUserDataSize( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *outDataSize)=0;
-
+
virtual OSStatus AFAPI_GetUserData( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *ioDataSize,
void *ioUserData)=0;
-
+
virtual OSStatus AFAPI_SetUserData( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 inDataSize,
const void *inUserData)=0;
-
+
virtual OSStatus AFAPI_RemoveUserData( UInt32 inUserDataID,
UInt32 inIndex)=0;
#if !CA_USE_AUDIO_PLUGIN_ONLY
@@ -207,9 +207,9 @@ public:
virtual AudioFileFormat* GetAudioFormat() const = 0;
virtual AudioFileFormatBase* GetAudioFileFormatBase() const { return GetAudioFormat(); }
-
+
void SetAudioFileObject(AudioFileObject* inObject) { mAudioFileObject = inObject; }
-
+
/* Public API Function Support */
virtual OSStatus AFAPI_CreateURL(
@@ -218,92 +218,92 @@ public:
UInt32 inFlags);
virtual OSStatus AFAPI_OpenURL(
- CFURLRef inFileRef,
+ CFURLRef inFileRef,
SInt8 inPermissions,
int inFD);
virtual OSStatus AFAPI_OpenWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc);
virtual OSStatus AFAPI_InitializeWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc,
UInt32 inFileType,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags);
-
+
virtual OSStatus AFAPI_Close();
virtual OSStatus AFAPI_Optimize();
virtual OSStatus AFAPI_ReadBytes( Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
void *outBuffer);
-
+
virtual OSStatus AFAPI_WriteBytes( Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
const void *inBuffer);
-
+
virtual OSStatus AFAPI_ReadPackets( Boolean inUseCache,
UInt32 *outNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer);
-
+
virtual OSStatus AFAPI_ReadPacketData( Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer);
-
+
virtual OSStatus AFAPI_WritePackets( Boolean inUseCache,
UInt32 inNumBytes,
const AudioStreamPacketDescription *inPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
const void *inBuffer);
-
+
virtual OSStatus AFAPI_GetPropertyInfo( AudioFilePropertyID inPropertyID,
UInt32 *outDataSize,
UInt32 *isWritable);
-
+
virtual OSStatus AFAPI_GetProperty( AudioFilePropertyID inPropertyID,
UInt32 *ioDataSize,
void *ioPropertyData);
-
+
virtual OSStatus AFAPI_SetProperty( AudioFilePropertyID inPropertyID,
UInt32 inDataSize,
const void *inPropertyData);
virtual OSStatus AFAPI_CountUserData( UInt32 inUserDataID,
UInt32 *outNumberItems);
-
+
virtual OSStatus AFAPI_GetUserDataSize( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *outDataSize);
-
+
virtual OSStatus AFAPI_GetUserData( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *ioDataSize,
void *ioUserData);
-
+
virtual OSStatus AFAPI_SetUserData( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 inDataSize,
const void *inUserData);
-
+
virtual OSStatus AFAPI_RemoveUserData( UInt32 inUserDataID,
UInt32 inIndex);
-
+
protected:
AudioFileObject* mAudioFileObject;
};
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp
index ee6bedd..36a2bee 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp
@@ -2,14 +2,14 @@
File: AudioFileFormat.cpp
Abstract: AudioFileFormat.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,14 +40,14 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AudioFileFormat.h"
#include "DataSource.h"
-AudioFileFormatBase::AudioFileFormatBase(UInt32 inFileType)
+AudioFileFormatBase::AudioFileFormatBase(UInt32 inFileType)
: mFileType(inFileType)
{
}
@@ -61,7 +61,7 @@ OSStatus AudioFileFormatBase::GetHFSCodes(UInt32* ioDataSize, void* outPropertyD
return kAudioFileUnsupportedPropertyError;
}
-AudioFileFormat::AudioFileFormat(UInt32 inFileType)
+AudioFileFormat::AudioFileFormat(UInt32 inFileType)
: AudioFileFormatBase(inFileType)
{
}
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h
index 9436199..06ff857 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h
@@ -2,14 +2,14 @@
File: AudioFileFormat.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,18 +40,18 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef _AudioFileFormat_H_
#define _AudioFileFormat_H_
#include "AudioFileObject.h"
-// AudioFileFormat is a factory class for AudioFileObjects.
+// AudioFileFormat is a factory class for AudioFileObjects.
-// UncertainResult is needed for DataIsThisFormat.
+// UncertainResult is needed for DataIsThisFormat.
// In the case of SoundDesigner 2 we can't determine if the data is SoundDesigner 2 or not.
typedef int UncertainResult;
@@ -71,23 +71,23 @@ class AudioFileFormatBase
public:
AudioFileFormatBase(UInt32 inFileType);
virtual ~AudioFileFormatBase();
-
+
// return true if extension is of this format type
virtual Boolean ExtensionIsThisFormat(CFStringRef inExtension) = 0;
-
+
virtual UncertainResult FileDataIsThisFormat(
UInt32 /*inDataByteSize*/,
const void* /*inData*/) = 0;
-
+
// support SoundDesigner II files while minimizing opening and closing files.
virtual Boolean ResourceIsThisFormat(const FSRef* /*inRef*/) { return false; }
UInt32 GetFileType() const { return mFileType; }
-
+
virtual UInt32 CanRead() const { return 1; }
virtual UInt32 CanWrite() const { return 1; }
virtual UInt32 HasResourceFork() const { return 0; }
-
+
virtual void GetExtensions(CFArrayRef *outArray) = 0;
virtual void GetUTIs(CFArrayRef *outArray) {}
virtual void GetMIMETypes(CFArrayRef *outArray) {}
@@ -95,10 +95,10 @@ public:
virtual OSStatus GetAvailableFormatIDs(UInt32* ioDataSize, void* outPropertyData) = 0;
virtual OSStatus GetAvailableStreamDescriptions(UInt32 inFormatID, UInt32* ioDataSize, void* outPropertyData) = 0;
virtual OSStatus GetHFSCodes(UInt32* ioDataSize, void* outPropertyData);
-
+
virtual AudioFileFormat* AsAudioFileFormat() { return NULL; }
virtual AudioFileFormatComponent* AsAudioFileFormatComponent() { return NULL; }
-
+
private:
UInt32 mFileType;
};
@@ -110,13 +110,13 @@ class AudioFileFormat : public AudioFileFormatBase
public:
AudioFileFormat(UInt32 inFileType);
virtual ~AudioFileFormat();
-
+
// create an AudioFileObject for this format type.
- virtual AudioFileObject* New() = 0;
+ virtual AudioFileObject* New() = 0;
virtual AudioFileStreamObject* NewStream() { return NULL; }
-
+
// return true if file is of this format type
- virtual UncertainResult FileDataIsThisFormat(UInt32 inDataByteSize, const void* inData) = 0;
+ virtual UncertainResult FileDataIsThisFormat(UInt32 inDataByteSize, const void* inData) = 0;
virtual AudioFileFormat* AsAudioFileFormat() { return this; }
};
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp
index 1a00f96..b823147 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp
@@ -2,14 +2,14 @@
File: AudioFileObject.cpp
Abstract: AudioFileObject.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AudioFileObject.h"
#include "CADebugMacros.h"
@@ -64,7 +64,7 @@ AudioFileObject::~AudioFileObject()
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::DoCreate(
+OSStatus AudioFileObject::DoCreate(
CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags)
@@ -73,27 +73,27 @@ OSStatus AudioFileObject::DoCreate(
if (!IsDataFormatValid(inFormat))
return kAudioFileUnsupportedDataFormatError;
- if (!IsDataFormatSupported(inFormat))
+ if (!IsDataFormatSupported(inFormat))
return kAudioFileUnsupportedDataFormatError;
SetPermissions(kAudioFileReadWritePermission);
-
+
SetAlignDataWithFillerChunks(!(inFlags & 2 /* kAudioFileFlags_DontPageAlignAudioData */ ));
-
+
// call virtual method for particular format.
return Create(inFileRef, inFormat);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-OSStatus AudioFileObject::Create(
+
+OSStatus AudioFileObject::Create(
CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat)
{
int fileD;
OSStatus err = CreateDataFile (inFileRef, fileD);
FailIf (err != noErr, Bail, "CreateDataFile failed");
-
+
SetURL (inFileRef);
err = OpenFile(kAudioFileReadWritePermission, fileD);
@@ -101,23 +101,23 @@ OSStatus AudioFileObject::Create(
err = SetDataFormat(inFormat);
FailIf (err != noErr, Bail, "SetDataFormat failed");
-
+
mIsInitialized = false;
-
+
Bail:
return err;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::DoOpen(
- CFURLRef inFileRef,
+OSStatus AudioFileObject::DoOpen(
+ CFURLRef inFileRef,
SInt8 inPermissions,
int inFD)
-{
+{
OSStatus err = noErr;
SetPermissions(inPermissions);
-
+
err = Open(inFileRef, inPermissions, inFD);
FailIf (err != noErr, Bail, "Open failed");
@@ -130,22 +130,22 @@ Bail:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::Open(
- CFURLRef inFileRef,
+OSStatus AudioFileObject::Open(
+ CFURLRef inFileRef,
SInt8 inPermissions,
int inFD)
-{
+{
if (!(inPermissions & kAudioFileReadPermission))
return kAudioFilePermissionsError; // file must have read permissions
-
+
SetURL(inFileRef);
-
+
OSStatus err = OpenFile(inPermissions, inFD);
FailIf (err != noErr, Bail, "OpenFile failed");
-
+
err = OpenFromDataSource();
FailIf (err != noErr, Bail, "OpenFromDataSource failed");
-
+
Bail:
return err;
}
@@ -154,17 +154,17 @@ Bail:
OSStatus AudioFileObject::ValidateFormatAndData()
{
-
+
AudioStreamBasicDescription asbd = GetDataFormat();
if (!IsDataFormatValid(&asbd))
return kAudioFileInvalidFileError;
- if (asbd.mFormatID == kAudioFormatLinearPCM)
+ if (asbd.mFormatID == kAudioFormatLinearPCM)
{
SInt64 maxPackets = GetNumBytes() / asbd.mBytesPerPacket;
- if (GetNumPackets() > maxPackets)
+ if (GetNumPackets() > maxPackets)
return kAudioFileInvalidFileError;
}
return noErr;
@@ -173,24 +173,24 @@ OSStatus AudioFileObject::ValidateFormatAndData()
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OSStatus AudioFileObject::DoOpenWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc)
{
SInt8 perms = (inSetSizeFunc || inWriteFunc) ? kAudioFileReadWritePermission : kAudioFileReadPermission;
SetPermissions(perms);
-
+
DataSource* dataSource = new Seekable_DataSource(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc);
SetDataSource(dataSource);
return OpenFromDataSource();
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
+
OSStatus AudioFileObject::OpenFromDataSource(void)
-{
+{
return noErr;
}
@@ -198,15 +198,15 @@ OSStatus AudioFileObject::OpenFromDataSource(void)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OSStatus AudioFileObject::DoInitializeWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc,
UInt32 inFileType,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags)
-{
+{
DataSource* dataSource = new Seekable_DataSource(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc);
if (!dataSource->CanWrite()) return -54/*permErr*/;
dataSource->SetSize(0);
@@ -217,13 +217,13 @@ OSStatus AudioFileObject::DoInitializeWithCallbacks(
OSStatus err = SetDataFormat(inFormat);
if (err) return err;
-
+
return InitializeDataSource(inFormat, inFlags);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-OSStatus AudioFileObject::DoInitialize(
+
+OSStatus AudioFileObject::DoInitialize(
CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags)
@@ -236,15 +236,15 @@ OSStatus AudioFileObject::DoInitialize(
return Initialize(inFileRef, inFormat, inFlags);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-OSStatus AudioFileObject::Initialize(
+
+OSStatus AudioFileObject::Initialize(
CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags)
{
OSStatus err = noErr;
-
- UInt8 fPath[FILENAME_MAX];
+
+ UInt8 fPath[FILENAME_MAX];
if (!CFURLGetFileSystemRepresentation (inFileRef, true, fPath, FILENAME_MAX))
return kAudio_FileNotFoundError;
@@ -259,10 +259,10 @@ OSStatus AudioFileObject::Initialize(
int fileD = open((const char*)fPath, flags, filePerms);
if (fileD < 0)
return AudioFileTranslateErrno(errno);
-
+
err = OpenFile(kAudioFileReadWritePermission, fileD);
FailIf (err != noErr, Bail, "OpenFile failed");
-
+
// don't need to do this as open has an option to truncate the file
// GetDataSource()->SetSize(0);
@@ -270,15 +270,15 @@ OSStatus AudioFileObject::Initialize(
FailIf (err != noErr, Bail, "SetDataFormat failed");
InitializeDataSource(inFormat, inFlags);
-
-Bail:
+
+Bail:
return err;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
+
OSStatus AudioFileObject::InitializeDataSource(const AudioStreamBasicDescription *inFormat, UInt32 /*inFlags*/)
-{
+{
return noErr;
}
@@ -288,7 +288,7 @@ OSStatus AudioFileObject::DoClose()
{
OSStatus err = UpdateSizeIfNeeded();
if (err) return err;
-
+
return Close();
}
@@ -313,7 +313,7 @@ OSStatus AudioFileObject::Close()
OSStatus AudioFileObject::Optimize()
{
// default is that nothing needs to be done. This happens to be true for Raw, SD2 and NeXT/Sun types.
- SetIsOptimized(true);
+ SetIsOptimized(true);
return noErr;
}
@@ -326,7 +326,7 @@ OSStatus AudioFileObject::DoOptimize()
OSStatus err = UpdateSizeIfNeeded();
if (err) return err;
-
+
if (IsOptimized()) return noErr;
err = Optimize();
@@ -335,12 +335,12 @@ OSStatus AudioFileObject::DoOptimize()
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::UpdateNumBytes(SInt64 inNumBytes)
+OSStatus AudioFileObject::UpdateNumBytes(SInt64 inNumBytes)
{
OSStatus err = noErr;
if (inNumBytes != GetNumBytes()) {
SetNumBytes(inNumBytes);
-
+
// #warning " this will not work for vbr formats"
SetNumPackets(GetNumBytes() / mDataFormat.mBytesPerPacket);
SizeChanged();
@@ -350,7 +350,7 @@ OSStatus AudioFileObject::UpdateNumBytes(SInt64 inNumBytes)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::UpdateNumPackets(SInt64 inNumPackets)
+OSStatus AudioFileObject::UpdateNumPackets(SInt64 inNumPackets)
{
OSStatus err = noErr;
if (inNumPackets != GetNumPackets()) {
@@ -358,7 +358,7 @@ OSStatus AudioFileObject::UpdateNumPackets(SInt64 inNumPackets)
SetNeedsSizeUpdate(true);
UpdateSizeIfNeeded();
SetNumPackets(inNumPackets);
-
+
// #warning " this will not work for vbr formats"
SetNumBytes(GetNumPackets() * mDataFormat.mBytesPerFrame);
SizeChanged();
@@ -375,19 +375,19 @@ OSStatus AudioFileObject::PacketToFrame(SInt64 inPacket, SInt64& outFirstFrameIn
{
OSStatus err = ScanForPackets(inPacket+1); // the packet count must be one greater than the packet index
if (err) return err;
-
+
SInt64 packetTableSize = GetPacketTableSize();
-
+
if (mPacketTable && inPacket >= packetTableSize)
return kAudioFileEndOfFileError;
-
+
CompressedPacketTable* packetTable = GetPacketTable();
if (!packetTable)
return kAudioFileInvalidPacketOffsetError;
-
+
if (inPacket < 0 || inPacket >= packetTableSize)
return kAudioFileInvalidPacketOffsetError;
-
+
outFirstFrameInPacket = (*packetTable)[(size_t)inPacket].mFrameOffset;
}
else
@@ -406,18 +406,18 @@ OSStatus AudioFileObject::FrameToPacket(SInt64 inFrame, SInt64& outPacket, UInt3
CompressedPacketTable* packetTable = GetPacketTable();
if (!packetTable)
return kAudioFileInvalidPacketOffsetError;
-
+
// search packet table
AudioStreamPacketDescriptionExtended pext;
memset(&pext, 0, sizeof(pext));
pext.mFrameOffset = inFrame;
CompressedPacketTable::iterator iter = std::lower_bound(packetTable->begin(), packetTable->end(), pext);
-
+
if (iter == packetTable->end())
return kAudioFileInvalidPacketOffsetError;
-
+
if (iter > packetTable->begin()) --iter;
-
+
outPacket = iter - packetTable->begin();
outFrameOffsetInPacket = (UInt32)(inFrame - iter->mFrameOffset);
}
@@ -435,21 +435,21 @@ OSStatus AudioFileObject::PacketToByte(AudioBytePacketTranslation* abpt)
{
if (abpt->mPacket < 0)
return kAudioFileInvalidPacketOffsetError;
-
+
if (mDataFormat.mBytesPerPacket == 0)
{
CompressedPacketTable* packetTable = GetPacketTable();
if (!packetTable)
return kAudioFileInvalidPacketOffsetError;
-
+
if (abpt->mPacket < GetPacketTableSize()) {
abpt->mByte = (*packetTable)[(int)abpt->mPacket].mStartOffset;
abpt->mFlags = 0;
} else {
SInt64 numPackets = packetTable->size();
- if (numPackets < 8)
+ if (numPackets < 8)
return 'more' /*kAudioFileStreamError_DataUnavailable*/ ;
-
+
const AudioStreamPacketDescriptionExtended lastPacket = (*packetTable)[numPackets - 1];
SInt64 bytesReadSoFar = lastPacket.mStartOffset + lastPacket.mDataByteSize;
double averageBytesPerPacket = (double)(bytesReadSoFar - GetDataOffset()) / (double)numPackets;
@@ -487,21 +487,21 @@ OSStatus AudioFileObject::ByteToPacket(AudioBytePacketTranslation* abpt)
memset(&pext, 0, sizeof(pext));
pext.mStartOffset = abpt->mByte;
CompressedPacketTable::iterator iter = std::lower_bound(packetTable->begin(), packetTable->end(), pext, byte_less_than);
-
+
if (iter == packetTable->end()) {
SInt64 numPackets = packetTable->size();
- if (numPackets < 8)
+ if (numPackets < 8)
return 'more' /*kAudioFileStreamError_DataUnavailable*/ ;
-
+
const AudioStreamPacketDescriptionExtended lastPacket = (*packetTable)[numPackets - 1];
SInt64 bytesReadSoFar = lastPacket.mStartOffset + lastPacket.mDataByteSize;
double averageBytesPerPacket = (double)(bytesReadSoFar - GetDataOffset()) / (double)numPackets;
-
+
double fpacket = (double)abpt->mByte / averageBytesPerPacket;
abpt->mPacket = (SInt64)floor(fpacket);
abpt->mByteOffsetInPacket = (UInt32)floor((fpacket - (double)abpt->mPacket) * averageBytesPerPacket);
abpt->mFlags = kBytePacketTranslationFlag_IsEstimate;
-
+
} else {
if (iter > packetTable->begin()) --iter;
abpt->mPacket = iter - packetTable->begin();
@@ -523,29 +523,29 @@ OSStatus AudioFileObject::ByteToPacket(AudioBytePacketTranslation* abpt)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::ReadBytes(
+OSStatus AudioFileObject::ReadBytes(
Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
void *outBuffer)
{
OSStatus err = noErr;
UInt16 mode = SEEK_SET;
SInt64 fileOffset = mDataOffset + inStartingByte;
bool readingPastEnd = false;
-
- FailWithAction((ioNumBytes == NULL) || (outBuffer == NULL), err = kAudio_ParamError,
+
+ FailWithAction((ioNumBytes == NULL) || (outBuffer == NULL), err = kAudio_ParamError,
Bail, "invalid num bytes parameter");
//printf("inStartingByte %lld GetNumBytes %lld\n", inStartingByte, GetNumBytes());
- if (inStartingByte >= GetNumBytes())
+ if (inStartingByte >= GetNumBytes())
{
*ioNumBytes = 0;
return kAudioFileEndOfFileError;
}
- if ((fileOffset + *ioNumBytes) > (GetNumBytes() + mDataOffset))
+ if ((fileOffset + *ioNumBytes) > (GetNumBytes() + mDataOffset))
{
*ioNumBytes = (UInt32)(GetNumBytes() + mDataOffset - fileOffset);
readingPastEnd = true;
@@ -554,9 +554,9 @@ OSStatus AudioFileObject::ReadBytes(
if (!inUseCache)
mode |= kAudioFileNoCacheMask;
-
+
err = GetDataSource()->ReadBytes(mode, fileOffset, *ioNumBytes, outBuffer, ioNumBytes);
-
+
if (readingPastEnd && err == noErr)
err = kAudioFileEndOfFileError;
@@ -567,10 +567,10 @@ Bail:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::WriteBytes(
+OSStatus AudioFileObject::WriteBytes(
Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
const void *inBuffer)
{
OSStatus err = noErr;
@@ -586,57 +586,57 @@ OSStatus AudioFileObject::WriteBytes(
// if so, see if file type supports this and bail if not
err = IsValidFilePosition(inStartingByte + *ioNumBytes);
FailIf(err != noErr, Bail, "invalid file position");
-
+
extendingTheAudioData = inStartingByte + *ioNumBytes > GetNumBytes();
-
+
// if file is not optimized, then do not write data that would overwrite chunks following the sound data chunk
- FailWithAction( extendingTheAudioData && !IsOptimized(),
+ FailWithAction( extendingTheAudioData && !IsOptimized(),
err = kAudioFileNotOptimizedError, Bail, "Can't write more data until the file is optimized");
if (!inUseCache)
mode |= kAudioFileNoCacheMask;
-
- err = GetDataSource()->WriteBytes(mode, mDataOffset + inStartingByte, *ioNumBytes,
+
+ err = GetDataSource()->WriteBytes(mode, mDataOffset + inStartingByte, *ioNumBytes,
inBuffer, ioNumBytes);
-
+
FailIf(err != noErr, Bail, "couldn't write new data");
-
+
if (extendingTheAudioData) {
SInt64 nuEOF; // Get the total bytes of audio data
SInt64 nuByteTotal;
err = GetDataSource()->GetSize(nuEOF);
FailIf(err != noErr, Bail, "GetSize failed");
-
+
nuByteTotal = nuEOF - mDataOffset;
err = UpdateNumBytes(nuByteTotal);
}
-
+
Bail:
return err;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::ReadPackets(
+OSStatus AudioFileObject::ReadPackets(
Boolean inUseCache,
UInt32 *outNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
// This only works with CBR. To suppport VBR you must override.
OSStatus err = noErr;
-
+
FailWithAction(outBuffer == NULL, err = kAudio_ParamError, Bail, "NULL buffer");
-
+
FailWithAction((ioNumPackets == NULL) || (*ioNumPackets < 1), err = kAudio_ParamError, Bail, "invalid num packets parameter");
-
+
{
UInt32 byteCount = *ioNumPackets * mDataFormat.mBytesPerPacket;
SInt64 startingByte = inStartingPacket * mDataFormat.mBytesPerPacket;
-
+
err = ReadBytes (inUseCache, startingByte, &byteCount, outBuffer);
if ((err == noErr) || (err == kAudioFileEndOfFileError))
{
@@ -648,7 +648,7 @@ OSStatus AudioFileObject::ReadPackets(
if (outNumBytes)
*outNumBytes = byteCount;
-
+
if (err == kAudioFileEndOfFileError)
err = noErr;
}
@@ -664,12 +664,12 @@ Bail:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::ReadPacketData(
+OSStatus AudioFileObject::ReadPacketData(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
OSStatus err = noErr;
@@ -703,12 +703,12 @@ Bail:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::ReadPacketDataVBR(
+OSStatus AudioFileObject::ReadPacketDataVBR(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
OSStatus err = ScanForPackets(inStartingPacket+1); // need to scan packets up to start
@@ -718,7 +718,7 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
SInt64 dataOffset = GetDataOffset();
CompressedPacketTable* packetTable = GetPacketTable();
- if (!packetTable)
+ if (!packetTable)
return kAudioFileInvalidFileError;
SInt64 packetTableSize = GetPacketTableSize();
@@ -728,7 +728,7 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
*ioNumPackets = 0;
return kAudioFileEndOfFileError;
}
-
+
if (inStartingPacket + *ioNumPackets <= packetTableSize) {
err = ReadPacketDataVBR_InTable(inUseCache, ioNumBytes, outPacketDescriptions, inStartingPacket, ioNumPackets, outBuffer);
} else {
@@ -741,21 +741,21 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
SInt64 remainingBytesInFile = fileSize - firstPacketOffset - dataOffset;
if (bytesRead > remainingBytesInFile)
bytesRead = (UInt32)remainingBytesInFile;
-
+
err = ReadBytes (inUseCache, firstPacketOffset, &bytesRead, outBuffer);
if (err && err != kAudioFileEndOfFileError) {
*ioNumBytes = 0;
*ioNumPackets = 0;
return err;
}
-
+
Buffer_DataSource bufSrc(bytesRead, outBuffer, dataOffset + firstPacketOffset);
-
+
OSStatus scanErr = ScanForPackets(kScanToEnd, &bufSrc, false);
if (scanErr && scanErr != kAudioFileEndOfFileError)
return scanErr;
packetTableSize = packetTable->size();
-
+
UInt32 numPacketsRead = 0;
UInt32 endOfData = 0;
SInt64 packetNumber = inStartingPacket;
@@ -765,10 +765,10 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
SInt64 endOfPacket = curPacketOffset + curPacket.mDataByteSize;
if (endOfPacket > bytesRead) break;
endOfData = (UInt32)endOfPacket;
- outPacketDescriptions[numPacketsRead] = curPacket;
+ outPacketDescriptions[numPacketsRead] = curPacket;
outPacketDescriptions[numPacketsRead].mStartOffset = curPacketOffset;
}
-
+
*ioNumBytes = endOfData;
*ioNumPackets = numPacketsRead;
}
@@ -778,14 +778,14 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes, SInt64 inStartingPacket, UInt32 *ioNumPackets)
-{
+{
CompressedPacketTable* packetTable = GetPacketTable();
SInt64 packetTableSize = GetPacketTableSize();
if (inStartingPacket + *ioNumPackets > (SInt64)packetTableSize) {
*ioNumPackets = (UInt32)(packetTableSize - inStartingPacket);
}
-
+
AudioStreamPacketDescription firstPacket = (*packetTable)[inStartingPacket];
if (*ioNumBytes < firstPacket.mDataByteSize) {
@@ -795,28 +795,28 @@ OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes,
}
SInt64 lastPacketIndex = inStartingPacket + *ioNumPackets - 1;
- if (lastPacketIndex >= packetTableSize)
+ if (lastPacketIndex >= packetTableSize)
lastPacketIndex = packetTableSize - 1;
-
+
AudioStreamPacketDescription lastPacket = (*packetTable)[lastPacketIndex];
-
+
SInt64 readBytes = lastPacket.mStartOffset + lastPacket.mDataByteSize - firstPacket.mStartOffset;
if (readBytes <= *ioNumBytes) {
*ioNumBytes = (UInt32)readBytes;
return noErr;
}
-
+
SInt64 lowBound = inStartingPacket;
SInt64 highBound = lastPacketIndex + 1;
SInt64 okIndex = lowBound;
- while (highBound >= lowBound) {
+ while (highBound >= lowBound) {
SInt64 tryBound = (lowBound + highBound) >> 1;
- if (tryBound > lastPacketIndex)
+ if (tryBound > lastPacketIndex)
break;
AudioStreamPacketDescription tryPacket = (*packetTable)[tryBound];
-
+
SInt64 readBytes = tryPacket.mStartOffset + tryPacket.mDataByteSize - firstPacket.mStartOffset;
-
+
if (readBytes > (SInt64)*ioNumBytes) {
highBound = tryBound - 1;
} else if (readBytes < (SInt64)*ioNumBytes) {
@@ -826,14 +826,14 @@ OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes,
okIndex = tryBound;
break;
}
- }
-
+ }
+
SInt64 numPackets = okIndex - inStartingPacket + 1;
if (numPackets > *ioNumPackets) {
numPackets = *ioNumPackets;
okIndex = inStartingPacket + numPackets - 1;
}
-
+
AudioStreamPacketDescription packet = (*packetTable)[okIndex];
*ioNumBytes = (UInt32)(packet.mStartOffset + packet.mDataByteSize - firstPacket.mStartOffset);
*ioNumPackets = (UInt32)numPackets;
@@ -846,25 +846,25 @@ OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes,
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::ReadPacketDataVBR_InTable(
+OSStatus AudioFileObject::ReadPacketDataVBR_InTable(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer)
{
CompressedPacketTable* packetTable = GetPacketTable();
- if (!packetTable)
+ if (!packetTable)
return kAudioFileInvalidFileError;
-
+
OSStatus err = HowManyPacketsCanBeReadIntoBuffer(ioNumBytes, inStartingPacket, ioNumPackets);
if (err) return err;
-
+
AudioStreamPacketDescription firstPacket = (*packetTable)[inStartingPacket];
SInt64 firstPacketOffset = firstPacket.mStartOffset;
UInt32 bytesRead = *ioNumBytes;
-
+
if (outBuffer) {
err = ReadBytes (inUseCache, firstPacketOffset, &bytesRead, outBuffer);
if (err && err != kAudioFileEndOfFileError) {
@@ -874,12 +874,12 @@ OSStatus AudioFileObject::ReadPacketDataVBR_InTable(
}
*ioNumBytes = bytesRead;
}
-
+
// fill out packet descriptions
- if (outPacketDescriptions) {
+ if (outPacketDescriptions) {
for (UInt32 i = 0; i < *ioNumPackets; i++) {
AudioStreamPacketDescription curPacket = (*packetTable)[i + inStartingPacket];
- outPacketDescriptions[i] = curPacket;
+ outPacketDescriptions[i] = curPacket;
outPacketDescriptions[i].mStartOffset = curPacket.mStartOffset - firstPacketOffset;
}
}
@@ -890,20 +890,20 @@ OSStatus AudioFileObject::ReadPacketDataVBR_InTable(
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::WritePackets(
+OSStatus AudioFileObject::WritePackets(
Boolean inUseCache,
UInt32 inNumBytes,
const AudioStreamPacketDescription *inPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
const void *inBuffer)
{
// This only works with CBR. To suppport VBR you must override.
OSStatus err = noErr;
-
+
FailWithAction(inStartingPacket > GetNumPackets(), err = kAudioFileInvalidPacketOffsetError, Bail, "write past end");
FailWithAction((ioNumPackets == NULL) || (inBuffer == NULL), err = kAudioFileUnspecifiedError, Bail, "invalid parameter");
-
+
{
UInt32 byteCount = *ioNumPackets * mDataFormat.mBytesPerPacket;
SInt64 startingByte = inStartingPacket * mDataFormat.mBytesPerPacket;
@@ -922,21 +922,21 @@ Bail:
OSStatus AudioFileObject::GetBitRate( UInt32 *outBitRate)
{
-
+
if (!outBitRate) return kAudioFileUnspecifiedError;
-
+
UInt32 bytesPerPacket = GetDataFormat().mBytesPerPacket;
UInt32 framesPerPacket = GetDataFormat().mFramesPerPacket;
Float64 sampleRate = GetDataFormat().mSampleRate;
const Float64 bitsPerByte = 8.;
-
+
if (bytesPerPacket && framesPerPacket) {
*outBitRate = (UInt32)(bitsPerByte * (Float64)bytesPerPacket * sampleRate / (Float64)framesPerPacket);
- } else {
+ } else {
SInt64 numPackets = GetNumPackets();
SInt64 numBytes = GetNumBytes();
SInt64 numFrames = 0;
-
+
if (framesPerPacket) {
numFrames = numPackets * framesPerPacket;
} else {
@@ -953,12 +953,12 @@ OSStatus AudioFileObject::GetBitRate( UInt32 *outBitRate)
#endif
{
numFrames += (*packetTable)[i].mVariableFramesInPacket;
- }
+ }
} else {
return kAudioFileUnsupportedPropertyError;
}
}
-
+
if (numFrames == 0 || (sampleRate == 0.)) {
*outBitRate = 0;
return noErr;
@@ -1098,18 +1098,18 @@ OSStatus AudioFileObject::GetInfoDictionarySize( UInt32 *outDataSize,
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
+
OSStatus AudioFileObject::GetInfoDictionary(CACFDictionary *infoDict)
-{
+{
Float64 fl;
if (GetEstimatedDuration(&fl) == noErr)
return AddDurationToInfoDictionary(infoDict, fl);
-
+
return kAudioFileUnsupportedPropertyError;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
+
OSStatus AudioFileObject::SetInfoDictionary(CACFDictionary *infoDict)
{
return kAudioFileUnsupportedPropertyError;
@@ -1120,31 +1120,31 @@ OSStatus AudioFileObject::GetEstimatedDuration(Float64* duration)
{
// calculate duration
AudioStreamBasicDescription ASBD = GetDataFormat();
-
+
*duration = (ASBD.mFramesPerPacket != 0) ? (GetNumPackets() * ASBD.mFramesPerPacket) / ASBD.mSampleRate : 0.0;
-
+
/*
For now, assume that any ASBD that has zero in the frames per packet field has been subclassed for this
method. i.e. A CAF file has a frame count in one of it's chunks.
-
- MP3 has been subclassed because it guesstimates a duration so the entire file does not
+
+ MP3 has been subclassed because it guesstimates a duration so the entire file does not
need to be parsed in order to calculate the total frames.
*/
-
+
return noErr;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AudioFileObject::GetPropertyInfo (
+OSStatus AudioFileObject::GetPropertyInfo (
AudioFilePropertyID inPropertyID,
UInt32 *outDataSize,
UInt32 *isWritable)
{
OSStatus err = noErr;
UInt32 writable = 0;
-
+
switch (inPropertyID)
{
case kAudioFilePropertyDeferSizeUpdates :
@@ -1161,11 +1161,11 @@ OSStatus AudioFileObject::GetPropertyInfo (
if (outDataSize) *outDataSize = sizeof(AudioStreamBasicDescription);
writable = 1;
break;
-
+
case kAudioFilePropertyFormatList:
err = GetFormatListInfo(*outDataSize, writable);
break;
-
+
case kAudioFilePropertyPacketSizeUpperBound:
case kAudioFilePropertyIsOptimized:
case kAudioFilePropertyMaximumPacketSize:
@@ -1184,25 +1184,25 @@ OSStatus AudioFileObject::GetPropertyInfo (
if (outDataSize) *outDataSize = sizeof(SInt64);
break;
- case kAudioFilePropertyBitRate:
+ case kAudioFilePropertyBitRate:
writable = 0;
if (outDataSize) *outDataSize = sizeof(UInt32);
break;
- case kAudioFilePropertyMagicCookieData:
+ case kAudioFilePropertyMagicCookieData:
err = GetMagicCookieDataSize(outDataSize, &writable);
break;
case kAudioFilePropertyMarkerList :
- err = GetMarkerListSize(outDataSize, &writable);
+ err = GetMarkerListSize(outDataSize, &writable);
break;
-
+
case kAudioFilePropertyRegionList :
- err = GetRegionListSize(outDataSize, &writable);
+ err = GetRegionListSize(outDataSize, &writable);
break;
-
+
case kAudioFilePropertyChannelLayout :
- err = GetChannelLayoutSize(outDataSize, &writable);
+ err = GetChannelLayoutSize(outDataSize, &writable);
break;
case kAudioFilePropertyPacketToFrame :
@@ -1218,11 +1218,11 @@ OSStatus AudioFileObject::GetPropertyInfo (
break;
case kAudioFilePropertyInfoDictionary :
- err = GetInfoDictionarySize(outDataSize, &writable);
+ err = GetInfoDictionarySize(outDataSize, &writable);
break;
case kTEMPAudioFilePropertySoundCheckDictionary :
- err = GetSoundCheckDictionarySize(outDataSize, &writable);
+ err = GetSoundCheckDictionarySize(outDataSize, &writable);
break;
case kTEMPAudioFilePropertyGenerateLoudnessInfo :
@@ -1253,7 +1253,7 @@ OSStatus AudioFileObject::GetPropertyInfo (
if (outDataSize) *outDataSize = sizeof(SInt32);
if (isWritable) *isWritable = CanWrite();
break;
-
+
default:
writable = 0;
err = kAudioFileUnsupportedPropertyError;
@@ -1275,109 +1275,109 @@ OSStatus AudioFileObject::GetProperty(
OSStatus err = noErr;
UInt32 neededSize;
UInt32 writable;
-
+
switch (inPropertyID)
{
case kAudioFilePropertyFileFormat:
- FailWithAction(*ioDataSize != sizeof(UInt32),
+ FailWithAction(*ioDataSize != sizeof(UInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-
+
*(UInt32 *) ioPropertyData = GetFileType();
break;
case kAudioFilePropertyFormatList:
err = GetFormatList(*ioDataSize, (AudioFormatListItem*)ioPropertyData);
break;
-
+
case kAudioFilePropertyDataFormat:
- FailWithAction(*ioDataSize != sizeof(AudioStreamBasicDescription),
+ FailWithAction(*ioDataSize != sizeof(AudioStreamBasicDescription),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-
+
memcpy(ioPropertyData, &mDataFormat, sizeof(AudioStreamBasicDescription));
break;
case kAudioFilePropertyDataOffset:
- FailWithAction(*ioDataSize != sizeof(SInt64),
+ FailWithAction(*ioDataSize != sizeof(SInt64),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
*(SInt64 *) ioPropertyData = mDataOffset;
break;
case kAudioFilePropertyIsOptimized:
- FailWithAction(*ioDataSize != sizeof(UInt32),
+ FailWithAction(*ioDataSize != sizeof(UInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
*(UInt32 *) ioPropertyData = mIsOptimized;
break;
case kAudioFilePropertyAudioDataByteCount:
- FailWithAction(*ioDataSize != sizeof(SInt64),
+ FailWithAction(*ioDataSize != sizeof(SInt64),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
*(SInt64 *)ioPropertyData = GetNumBytes();
break;
case kAudioFilePropertyAudioDataPacketCount:
- FailWithAction(*ioDataSize != sizeof(SInt64),
+ FailWithAction(*ioDataSize != sizeof(SInt64),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
*(SInt64 *)ioPropertyData = GetNumPackets();
break;
case kAudioFilePropertyPacketSizeUpperBound:
- FailWithAction(*ioDataSize != sizeof(UInt32),
+ FailWithAction(*ioDataSize != sizeof(UInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
*(UInt32 *)ioPropertyData = GetPacketSizeUpperBound();
break;
-
+
case kAudioFilePropertyMaximumPacketSize:
- FailWithAction(*ioDataSize != sizeof(UInt32),
+ FailWithAction(*ioDataSize != sizeof(UInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
*(UInt32 *)ioPropertyData = FindMaximumPacketSize();
break;
- case kAudioFilePropertyBitRate:
- FailWithAction(*ioDataSize != sizeof(UInt32),
+ case kAudioFilePropertyBitRate:
+ FailWithAction(*ioDataSize != sizeof(UInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
err = GetBitRate((UInt32*)ioPropertyData);
break;
- case kAudioFilePropertyMagicCookieData:
-
+ case kAudioFilePropertyMagicCookieData:
+
err = GetMagicCookieData(ioDataSize, ioPropertyData);
break;
case kAudioFilePropertyMarkerList :
- err = GetMarkerList(ioDataSize, static_cast<AudioFileMarkerList*>(ioPropertyData));
+ err = GetMarkerList(ioDataSize, static_cast<AudioFileMarkerList*>(ioPropertyData));
break;
-
+
case kAudioFilePropertyRegionList :
memset(ioPropertyData, 0, *ioDataSize);
- err = GetRegionList(ioDataSize, static_cast<AudioFileRegionList*>(ioPropertyData));
+ err = GetRegionList(ioDataSize, static_cast<AudioFileRegionList*>(ioPropertyData));
break;
-
+
case kAudioFilePropertyChannelLayout :
err = GetChannelLayoutSize(&neededSize, &writable);
FailIf(err, Bail, "GetChannelLayoutSize failed");
FailWithAction(*ioDataSize != neededSize, err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-
- err = GetChannelLayout(ioDataSize, static_cast<AudioChannelLayout*>(ioPropertyData));
+
+ err = GetChannelLayout(ioDataSize, static_cast<AudioChannelLayout*>(ioPropertyData));
break;
-
+
case kAudioFilePropertyDeferSizeUpdates :
- FailWithAction(*ioDataSize != sizeof(UInt32),
+ FailWithAction(*ioDataSize != sizeof(UInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-
+
*(UInt32 *) ioPropertyData = DeferSizeUpdates();
break;
- case kAudioFilePropertyPacketToFrame :
+ case kAudioFilePropertyPacketToFrame :
{
- FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation),
+ FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-
+
AudioFramePacketTranslation* afpt = (AudioFramePacketTranslation*)ioPropertyData;
err = PacketToFrame(afpt->mPacket, afpt->mFrame);
break;
- }
+ }
case kAudioFilePropertyFrameToPacket :
{
- FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation),
+ FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
AudioFramePacketTranslation* afpt = (AudioFramePacketTranslation*)ioPropertyData;
@@ -1385,18 +1385,18 @@ OSStatus AudioFileObject::GetProperty(
break;
}
- case kAudioFilePropertyPacketToByte :
+ case kAudioFilePropertyPacketToByte :
{
- FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation),
+ FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-
+
AudioBytePacketTranslation* abpt = (AudioBytePacketTranslation*)ioPropertyData;
err = PacketToByte(abpt);
break;
- }
+ }
case kAudioFilePropertyByteToPacket :
{
- FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation),
+ FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
AudioBytePacketTranslation* abpt = (AudioBytePacketTranslation*)ioPropertyData;
@@ -1406,13 +1406,13 @@ OSStatus AudioFileObject::GetProperty(
case kAudioFilePropertyInfoDictionary :
{
- FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
+ FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
CACFDictionary afInfoDictionary(true);
- err = GetInfoDictionary(&afInfoDictionary);
-
+ err = GetInfoDictionary(&afInfoDictionary);
+
if (!err)
{
*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
@@ -1422,7 +1422,7 @@ OSStatus AudioFileObject::GetProperty(
case kTEMPAudioFilePropertySoundCheckDictionary :
{
- FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
+ FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
CACFDictionary afInfoDictionary(true);
@@ -1432,7 +1432,7 @@ OSStatus AudioFileObject::GetProperty(
OSStatus err2 = GetSoundCheckDictionaryFromLoudnessInfo(&afInfoDictionary);
if (err2 == noErr) err = noErr; // else report original error from GetSoundCheckDictionary.
}
-
+
if (!err)
{
*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
@@ -1442,7 +1442,7 @@ OSStatus AudioFileObject::GetProperty(
case kTEMPAudioFilePropertyLoudnessInfo :
{
- FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
+ FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
CACFDictionary afInfoDictionary(true);
@@ -1452,8 +1452,8 @@ OSStatus AudioFileObject::GetProperty(
OSStatus err2 = GetLoudnessInfoFromSoundCheckDictionary(&afInfoDictionary);
if (err2 == noErr) err = noErr; // else report original error from GetLoudnessInfo.
}
-
- if (!err)
+
+ if (!err)
{
*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
}
@@ -1467,8 +1467,8 @@ OSStatus AudioFileObject::GetProperty(
CACFDictionary afInfoDictionary(true);
- err = GenerateLoudnessInfo(&afInfoDictionary);
-
+ err = GenerateLoudnessInfo(&afInfoDictionary);
+
if (!err)
{
*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
@@ -1478,10 +1478,10 @@ OSStatus AudioFileObject::GetProperty(
case kAudioFilePropertyEstimatedDuration :
{
- FailWithAction(*ioDataSize != sizeof(Float64),
+ FailWithAction(*ioDataSize != sizeof(Float64),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-
- err = GetEstimatedDuration((Float64*)ioPropertyData);
+
+ err = GetEstimatedDuration((Float64*)ioPropertyData);
break;
}
@@ -1492,21 +1492,21 @@ OSStatus AudioFileObject::GetProperty(
*ioDataSize = sizeof(CFStringRef);
err = GetLyrics((CFStringRef*) ioPropertyData);
break;
-
- case 'eof?' :
+
+ case 'eof?' :
{
if (*ioDataSize != sizeof(UInt32))
return kAudioFileBadPropertySizeError;
-
+
SInt64 pos;
err = GetDataSource()->GetPos(pos);
if (err) break;
-
+
SInt64 endOfData = GetDataOffset() + GetNumBytes();
*(UInt32*)ioPropertyData = pos >= endOfData;
-
+
break;
- }
+ }
case 'sbtd' /*kAudioFilePropertySourceBitDepth*/ :
{
if (*ioDataSize != sizeof(SInt32))
@@ -1518,17 +1518,17 @@ OSStatus AudioFileObject::GetProperty(
// if there was no stored source bit depth, and this file is LPCM, then report this file's bit depth.
err = noErr;
outValue = GetDataFormat().mBitsPerChannel;
- if (GetDataFormat().mFormatFlags & kAudioFormatFlagIsFloat)
+ if (GetDataFormat().mFormatFlags & kAudioFormatFlagIsFloat)
outValue = -outValue;
- } else if (err)
+ } else if (err)
break;
-
+
*(SInt32 *) ioPropertyData = outValue;
-
+
break;
- }
+ }
default:
- err = kAudioFileUnsupportedPropertyError;
+ err = kAudioFileUnsupportedPropertyError;
break;
}
@@ -1548,14 +1548,14 @@ OSStatus AudioFileObject::SetProperty(
switch (inPropertyID)
{
case kAudioFilePropertyDataFormat:
- FailWithAction(inDataSize != sizeof(AudioStreamBasicDescription),
+ FailWithAction(inDataSize != sizeof(AudioStreamBasicDescription),
err = kAudioFileBadPropertySizeError, Bail, "Incorrect data size");
err = UpdateDataFormat((AudioStreamBasicDescription *) inPropertyData);
break;
case kAudioFilePropertyFormatList:
err = SetFormatList(inDataSize, (AudioFormatListItem*)inPropertyData);
break;
-
+
case kAudioFilePropertyAudioDataByteCount: {
FailWithAction(inDataSize != sizeof(SInt64), err = kAudioFileBadPropertySizeError, Bail, "Incorrect data size");
SInt64 numBytes = *(SInt64 *) inPropertyData;
@@ -1577,82 +1577,82 @@ OSStatus AudioFileObject::SetProperty(
}
err = UpdateNumPackets(numPackets);
} break;
-
- case kAudioFilePropertyMagicCookieData:
+
+ case kAudioFilePropertyMagicCookieData:
err = SetMagicCookieData(inDataSize, inPropertyData);
break;
case kAudioFilePropertyMarkerList :
- err = SetMarkerList(inDataSize, static_cast<const AudioFileMarkerList*>(inPropertyData));
+ err = SetMarkerList(inDataSize, static_cast<const AudioFileMarkerList*>(inPropertyData));
break;
-
+
case kAudioFilePropertyRegionList :
- err = SetRegionList(inDataSize, static_cast<const AudioFileRegionList*>(inPropertyData));
+ err = SetRegionList(inDataSize, static_cast<const AudioFileRegionList*>(inPropertyData));
break;
-
+
case kAudioFilePropertyChannelLayout :
- err = SetChannelLayout(inDataSize, static_cast<const AudioChannelLayout*>(inPropertyData));
+ err = SetChannelLayout(inDataSize, static_cast<const AudioChannelLayout*>(inPropertyData));
break;
case kAudioFilePropertyDeferSizeUpdates :
- FailWithAction(inDataSize != sizeof(UInt32),
+ FailWithAction(inDataSize != sizeof(UInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
SetDeferSizeUpdates(*(UInt32 *) inPropertyData);
break;
case kAudioFilePropertyInfoDictionary :
{
- FailWithAction(inDataSize != sizeof(CFDictionaryRef),
+ FailWithAction(inDataSize != sizeof(CFDictionaryRef),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
// pass the SetInfoDictionary a CACFDictionary object made with the provided CFDictionaryRef
// Let the caller release their own CFObject so pass false for th erelease parameter
CACFDictionary afInfoDictionary(*(CFDictionaryRef *)inPropertyData, false);
- err = SetInfoDictionary(&afInfoDictionary);
-
+ err = SetInfoDictionary(&afInfoDictionary);
+
break;
}
-
+
case kTEMPAudioFilePropertySoundCheckDictionary :
{
- FailWithAction(inDataSize != sizeof(CFDictionaryRef),
+ FailWithAction(inDataSize != sizeof(CFDictionaryRef),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
// pass the SetInfoDictionary a CACFDictionary object made with the provided CFDictionaryRef
// Let the caller release their own CFObject so pass false for the release parameter
CACFDictionary afInfoDictionary(*(CFDictionaryRef *)inPropertyData, false);
- err = SetSoundCheckDictionary(&afInfoDictionary);
-
+ err = SetSoundCheckDictionary(&afInfoDictionary);
+
break;
}
case kTEMPAudioFilePropertyLoudnessInfo :
{
- FailWithAction(inDataSize != sizeof(CFDictionaryRef),
+ FailWithAction(inDataSize != sizeof(CFDictionaryRef),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
// pass the SetInfoDictionary a CACFDictionary object made with the provided CFDictionaryRef
// Let the caller release their own CFObject so pass false for the release parameter
CACFDictionary afInfoDictionary(*(CFDictionaryRef *)inPropertyData, false);
- err = SetLoudnessInfo(&afInfoDictionary);
-
+ err = SetLoudnessInfo(&afInfoDictionary);
+
break;
}
-
+
case 'sbtd' /*kAudioFilePropertySourceBitDepth*/ :
{
- FailWithAction(inDataSize != sizeof(SInt32),
+ FailWithAction(inDataSize != sizeof(SInt32),
err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
SInt32 inValue = *(SInt32 *)inPropertyData;
err = SetSourceBitDepth(inValue);
-
+
break;
- }
+ }
default:
- err = kAudioFileUnsupportedPropertyError;
+ err = kAudioFileUnsupportedPropertyError;
break;
}
@@ -1666,17 +1666,17 @@ Bail:
OSStatus AudioFileObject::SetDataFormat(const AudioStreamBasicDescription* inStreamFormat)
{
OSStatus err = noErr;
-
+
if (!IsDataFormatValid(inStreamFormat))
return kAudioFileUnsupportedDataFormatError;
- if (!IsDataFormatSupported(inStreamFormat))
+ if (!IsDataFormatSupported(inStreamFormat))
return kAudioFileUnsupportedDataFormatError;
-
+
UInt32 prevBytesPerPacket = mDataFormat.mBytesPerPacket;
-
+
mDataFormat = *inStreamFormat;
-
+
// if CBR and bytes per packet changes, we need to change the number of packets we think we have.
if (mDataFormat.mBytesPerPacket && mDataFormat.mBytesPerPacket != prevBytesPerPacket)
{
@@ -1687,9 +1687,9 @@ OSStatus AudioFileObject::SetDataFormat(const AudioStreamBasicDescription* inStr
if (!mFirstSetFormat)
SizeChanged();
}
-
+
mFirstSetFormat = false;
-
+
return err;
}
@@ -1712,7 +1712,7 @@ OSStatus AudioFileObject::GetFormatList( UInt32 &ioDataSize,
// default implementation is to just return the data format
if (ioDataSize < sizeof(AudioFormatListItem))
return kAudioFileBadPropertySizeError;
-
+
AudioFormatListItem afli;
afli.mASBD = mDataFormat;
AudioChannelLayoutTag layoutTag = /*kAudioChannelLayoutTag_Unknown*/ 0xFFFF0000 | mDataFormat.mChannelsPerFrame;
@@ -1727,14 +1727,14 @@ OSStatus AudioFileObject::GetFormatList( UInt32 &ioDataSize,
layoutTag = layout->mChannelLayoutTag;
}
}
- afli.mChannelLayoutTag = layoutTag;
-
+ afli.mChannelLayoutTag = layoutTag;
+
memcpy(ioPropertyData, &afli, sizeof(AudioFormatListItem));
-
+
ioDataSize = sizeof(AudioFormatListItem);
return noErr;
}
-
+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OSStatus AudioFileObject::SetFormatList( UInt32 inDataSize,
@@ -1765,22 +1765,22 @@ Boolean AudioFileObject::IsDataFormatValid(AudioStreamBasicDescription const* in
return false;
if (inDesc->mFormatID == kAudioFormatLinearPCM)
- {
+ {
if (inDesc->mBitsPerChannel < 1 || inDesc->mBitsPerChannel > 64)
return false;
-
+
if (inDesc->mFramesPerPacket != 1)
return false;
-
- if (inDesc->mBytesPerPacket == 0)
+
+ if (inDesc->mBytesPerPacket == 0)
return false;
if (inDesc->mBytesPerFrame != inDesc->mBytesPerPacket)
return false;
-
+
// [3605260] we assume here that a packet is an integer number of frames.
UInt32 minimumBytesPerPacket = (inDesc->mBitsPerChannel * inDesc->mChannelsPerFrame + 7) / 8;
- if (inDesc->mBytesPerPacket < minimumBytesPerPacket)
+ if (inDesc->mBytesPerPacket < minimumBytesPerPacket)
return false;
}
return true;
@@ -1788,7 +1788,7 @@ Boolean AudioFileObject::IsDataFormatValid(AudioStreamBasicDescription const* in
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-void AudioFileObject::SetDataSource(DataSource* inDataSource)
+void AudioFileObject::SetDataSource(DataSource* inDataSource)
{
if (mDataSource != inDataSource) {
delete mDataSource;
@@ -1811,21 +1811,21 @@ OSStatus AudioFileObject::OpenFile(SInt8 inPermissions, int inFD)
OSStatus err = noErr;
SetDataSource(new Cached_DataSource(new UnixFile_DataSource(inFD, inPermissions, true)));
-
+
mFileD = inFD;
SetPermissions (inPermissions);
return err;
}
-
+
OSStatus AudioFileObject::CreateDataFile (CFURLRef inFileRef, int &outFileD)
-{
- UInt8 fPath[FILENAME_MAX];
+{
+ UInt8 fPath[FILENAME_MAX];
if (!CFURLGetFileSystemRepresentation (inFileRef, true, fPath, FILENAME_MAX))
return kAudio_FileNotFoundError;
-
+
struct stat stbuf;
- if (stat ((const char*)fPath, &stbuf) == 0)
+ if (stat ((const char*)fPath, &stbuf) == 0)
return kAudioFilePermissionsError;
#if TARGET_OS_WIN32
@@ -1863,7 +1863,7 @@ OSStatus AudioFileObject::AddDurationToInfoDictionary(CACFDictionary *infoDict,
OSStatus AudioFileObject::SizeChanged()
{
OSStatus err = noErr;
- if (mPermissions & kAudioFileWritePermission)
+ if (mPermissions & kAudioFileWritePermission)
{
if (DeferSizeUpdates())
SetNeedsSizeUpdate(true);
@@ -1874,8 +1874,8 @@ OSStatus AudioFileObject::SizeChanged()
}
OSStatus AudioFileObject::UpdateSizeIfNeeded()
-{
- if (GetNeedsSizeUpdate())
+{
+ if (GetNeedsSizeUpdate())
{
OSStatus err = UpdateSize();
if (err) return err;
@@ -1896,7 +1896,7 @@ OSStatus AudioFileObject::GetUserDataSize( UInt32 /*inUserDataID*/,
{
return kAudioFileOperationNotSupportedError;
}
-
+
OSStatus AudioFileObject::GetUserData( UInt32 /*inUserDataID*/,
UInt32 /*inIndex*/,
UInt32* /*ioDataSize*/,
@@ -1904,7 +1904,7 @@ OSStatus AudioFileObject::GetUserData( UInt32 /*inUserDataID*/,
{
return kAudioFileOperationNotSupportedError;
}
-
+
OSStatus AudioFileObject::SetUserData( UInt32 /*inUserDataID*/,
UInt32 /*inIndex*/,
UInt32 /*inDataSize*/,
@@ -1912,7 +1912,7 @@ OSStatus AudioFileObject::SetUserData( UInt32 /*inUserDataID*/,
{
return kAudioFileOperationNotSupportedError;
}
-
+
OSStatus AudioFileObject::RemoveUserData( UInt32 /*inUserDataID*/,
UInt32 /*inIndex*/)
{
@@ -1921,7 +1921,7 @@ OSStatus AudioFileObject::RemoveUserData( UInt32 /*inUserDataID*/,
OSStatus AudioFileObject::MoveData(SInt64 fromPos, SInt64 toPos, SInt64 size)
{
- if (fromPos == toPos)
+ if (fromPos == toPos)
return noErr;
OSStatus err = noErr;
@@ -1933,13 +1933,13 @@ OSStatus AudioFileObject::MoveData(SInt64 fromPos, SInt64 toPos, SInt64 size)
{
// read from old file
UInt32 byteCount;
- SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize;
+ SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize;
err = GetDataSource()->ReadBytes(SEEK_SET, fromPos+(bytesRemaining-count), (UInt32)count, audioData(), &byteCount);
FailIf (err != noErr, Bail, "MoveData ReadBytes failed");
err = GetDataSource()->WriteBytes(SEEK_SET, toPos+(bytesRemaining-count), (UInt32)count, audioData(), &byteCount);
FailIf (err != noErr, Bail, "WriteBytes failed");
-
+
bytesRemaining -= count;
}
} else {
@@ -1947,17 +1947,17 @@ OSStatus AudioFileObject::MoveData(SInt64 fromPos, SInt64 toPos, SInt64 size)
{
// read from old file
UInt32 byteCount;
- SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize;
+ SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize;
err = GetDataSource()->ReadBytes(SEEK_SET, fromPos+(size - bytesRemaining), (UInt32)count, audioData(), &byteCount);
FailIf (err != noErr, Bail, "MoveData ReadBytes failed");
-
+
err = GetDataSource()->WriteBytes(SEEK_SET, toPos+(size - bytesRemaining), (UInt32)count, audioData(), &byteCount);
FailIf (err != noErr, Bail, "WriteBytes failed");
-
+
bytesRemaining -= count;
}
}
-
+
Bail:
return err;
}
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h
index 6d7c868..9af04ec 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h
@@ -2,14 +2,14 @@
File: AudioFileObject.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef _AudioFileObject_H_
#define _AudioFileObject_H_
@@ -96,12 +96,12 @@ enum {
// as described by the magic cookie.
// The specifier is an AudioFormatInfo struct. At a minimum formatID member of the ASBD struct must filled in. Other fields
// may be filled in.
-
+
kAudioFormatProperty_OutputFormatList = 'ofls',
// Returns a list of AudioFormatListItem structs describing the audio formats which may be obtained by decoding the format
// described by the specifier.
// The specifier is an AudioFormatInfo struct. At a minimum formatID member of the ASBD struct must filled in. Other fields
- // may be filled in. If there is no magic cookie, then the number of channels and sample rate should be filled in.
+ // may be filled in. If there is no magic cookie, then the number of channels and sample rate should be filled in.
};
@@ -134,7 +134,7 @@ enum {
kUpperCase_IMACompression = 'IMA4', /*IMA 4:1*/
kUpperCase_ULawCompression = 'ULAW', /*µLaw 2:1*/
kUpperCase_ALawCompression = 'ALAW', /*aLaw 2:1*/
-
+
kUpperCase_Float32 = 'FL32',
kUpperCase_Float64 = 'FL64'
};
@@ -142,7 +142,7 @@ enum {
enum
{
// in what header is this defined? what is it?
- kGSM = 'agsm',
+ kGSM = 'agsm',
kUpperCase_GSM = 'GSM '
};
@@ -209,9 +209,9 @@ private:
AudioStreamBasicDescription mDataFormat; // format of the audio data
SInt64 mDataOffset; // position if the file where audio data begins
UInt32 mIsOptimized; // 1 if there is nothing in the file following the audio data, 0 if there is
- UInt32 mFileType; // file type of the audio file (i.e. AIFF, WAVE, etc.)
+ UInt32 mFileType; // file type of the audio file (i.e. AIFF, WAVE, etc.)
CFURLRef mFileRef; // URL of the file passed to AudioFileOpen or AudioFileCreate
- int mFileD; // Ref num of the file after opening within Audio File
+ int mFileD; // Ref num of the file after opening within Audio File
SInt8 mPermissions; // file permissions indicated by the caller, passed by AudioFileOpen or set with SetProperty function
Boolean mIsInitialized; // has the AudioFileObject for this file been intialized?
DataSource *mDataSource;
@@ -221,9 +221,9 @@ private:
Boolean mNeedsSizeUpdate;
Boolean mFirstSetFormat;
Boolean mAlignDataWithFillerChunks;
-
-public:
-
+
+public:
+
AudioFileObject (UInt32 inFileType)
: mNumBytes(0),
mNumPackets(0),
@@ -244,159 +244,159 @@ public:
{
memset(&mDataFormat, 0, sizeof(mDataFormat));
}
-
+
virtual ~AudioFileObject();
-
+
/* Public API Function Implementation */
// The DoSomething() versions of these functions are wrappers that perform a standard prologue.
// The Something() methods are those which should be overridden in the subclasses.
-
+
OSStatus DoCreate( CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags);
-
+
virtual OSStatus Create( CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat);
-
- OSStatus DoOpen( CFURLRef inFileRef,
+
+ OSStatus DoOpen( CFURLRef inFileRef,
SInt8 inPermissions,
int inFD);
-
- virtual OSStatus Open( CFURLRef inFileRef,
+
+ virtual OSStatus Open( CFURLRef inFileRef,
SInt8 inPermissions,
int inFD);
OSStatus DoOpenWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc);
-
-
+
+
OSStatus DoInitialize( CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags);
-
+
virtual OSStatus Initialize( CFURLRef inFileRef,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags);
-
+
OSStatus DoInitializeWithCallbacks(
- void * inRefCon,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ void * inRefCon,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc,
UInt32 inFileType,
const AudioStreamBasicDescription *inFormat,
UInt32 inFlags);
-
+
virtual OSStatus OpenFromDataSource(void);
-
+
virtual OSStatus InitializeDataSource(const AudioStreamBasicDescription *inFormat, UInt32 inFlags);
-
+
OSStatus DoClose();
-
+
virtual OSStatus Close();
-
+
OSStatus DoOptimize();
-
+
virtual OSStatus Optimize();
-
+
virtual OSStatus ReadBytes( Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
void *outBuffer);
-
+
virtual OSStatus WriteBytes( Boolean inUseCache,
- SInt64 inStartingByte,
- UInt32 *ioNumBytes,
+ SInt64 inStartingByte,
+ UInt32 *ioNumBytes,
const void *inBuffer);
-
+
virtual OSStatus ReadPackets( Boolean inUseCache,
UInt32 *outNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer);
- virtual OSStatus ReadPacketData(
+ virtual OSStatus ReadPacketData(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer);
-
- virtual OSStatus ReadPacketDataVBR(
+
+ virtual OSStatus ReadPacketDataVBR(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer);
virtual OSStatus HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes, SInt64 inStartingPacket, UInt32 *ioNumPackets);
- virtual OSStatus ReadPacketDataVBR_InTable(
+ virtual OSStatus ReadPacketDataVBR_InTable(
Boolean inUseCache,
UInt32 *ioNumBytes,
AudioStreamPacketDescription *outPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
void *outBuffer);
-
+
virtual OSStatus WritePackets( Boolean inUseCache,
UInt32 inNumBytes,
const AudioStreamPacketDescription *inPacketDescriptions,
- SInt64 inStartingPacket,
- UInt32 *ioNumPackets,
+ SInt64 inStartingPacket,
+ UInt32 *ioNumPackets,
const void *inBuffer);
/* Property Support */
- virtual OSStatus GetPropertyInfo (
+ virtual OSStatus GetPropertyInfo (
AudioFilePropertyID inPropertyID,
UInt32 *outDataSize,
UInt32 *isWritable);
-
+
virtual OSStatus GetProperty ( AudioFilePropertyID inPropertyID,
UInt32 *ioDataSize,
void *ioPropertyData);
-
+
virtual OSStatus SetProperty ( AudioFilePropertyID inPropertyID,
UInt32 inDataSize,
const void *inPropertyData);
-
+
UInt32 GetFileType() const { return mFileType; }
void SetFileType(UInt32 inFileType) { mFileType = inFileType; }
-
+
// this will set the format in memory only.
virtual OSStatus SetDataFormat(const AudioStreamBasicDescription* inStreamFormat);
-
+
// this will update the format info on disk and in memory.
virtual OSStatus UpdateDataFormat(const AudioStreamBasicDescription* inStreamFormat);
-
+
const UInt32 GetBytesPerPacket() const { return mDataFormat.mBytesPerPacket; }
-
+
const AudioStreamBasicDescription &GetDataFormat() const { return mDataFormat; }
-
+
virtual OSStatus GetFormatListInfo( UInt32 &outDataSize,
UInt32 &outWritable);
-
+
virtual OSStatus GetFormatList( UInt32 &ioDataSize,
AudioFormatListItem *ioPropertyData);
-
+
virtual OSStatus SetFormatList( UInt32 inDataSize,
const AudioFormatListItem *inPropertyData);
-
+
virtual OSStatus UpdateSize() { return noErr; }
UInt32 DeferSizeUpdates() { return mDeferSizeUpdates; }
void SetDeferSizeUpdates(UInt32 inFlag) { mDeferSizeUpdates = inFlag; }
OSStatus UpdateSizeIfNeeded();
OSStatus SizeChanged();
-
+
Boolean IsOptimized() const { return mIsOptimized != 0; }
void SetIsOptimized(Boolean inIsOptimized) { mIsOptimized = inIsOptimized ? 1 : 0; }
@@ -407,79 +407,79 @@ public:
// this will update the header size info on disk
OSStatus UpdateNumBytes(SInt64 inNumBytes);
-
+
virtual SInt64 GetNumPackets(){ return mNumPackets; }
virtual void SetNumPackets(SInt64 inNumPackets) { mNumPackets = inNumPackets; }
-
+
// this will update the header size info on disk
OSStatus UpdateNumPackets(SInt64 inNumPackets);
virtual OSStatus PacketToFrame(SInt64 inPacket, SInt64& outFirstFrameInPacket);
virtual OSStatus FrameToPacket(SInt64 inFrame, SInt64& outPacket, UInt32& outFrameOffsetInPacket);
-
+
virtual OSStatus PacketToByte(AudioBytePacketTranslation* abpt);
-
+
virtual OSStatus ByteToPacket(AudioBytePacketTranslation* abpt);
-
+
virtual OSStatus GetBitRate( UInt32 *outBitRate);
-
+
virtual OSStatus GetMagicCookieDataSize( UInt32 *outDataSize,
UInt32 *isWritable);
-
+
virtual OSStatus GetMagicCookieData( UInt32 *ioDataSize,
void *ioPropertyData);
-
+
virtual OSStatus SetMagicCookieData( UInt32 inDataSize,
const void *inPropertyData);
virtual OSStatus GetMarkerListSize( UInt32 *outDataSize,
UInt32 *isWritable);
-
+
virtual OSStatus GetMarkerList( UInt32 *ioDataSize,
AudioFileMarkerList *ioMarkerList);
-
+
virtual OSStatus SetMarkerList( UInt32 inDataSize,
const AudioFileMarkerList *inMarkerList);
virtual OSStatus GetRegionListSize( UInt32 *outDataSize,
UInt32 *isWritable);
-
+
virtual OSStatus GetRegionList( UInt32 *ioDataSize,
AudioFileRegionList *ioRegionList);
-
+
virtual OSStatus SetRegionList( UInt32 inDataSize,
const AudioFileRegionList *inRegionList);
virtual OSStatus GetChannelLayoutSize( UInt32 *outDataSize,
UInt32 *isWritable);
-
+
virtual OSStatus GetChannelLayout( UInt32 *ioDataSize,
AudioChannelLayout *ioChannelLayout);
-
+
virtual OSStatus SetChannelLayout( UInt32 inDataSize,
const AudioChannelLayout *inChannelLayout);
virtual OSStatus GetInfoDictionarySize( UInt32 *outDataSize,
UInt32 *isWritable);
-
+
virtual OSStatus GetInfoDictionary( CACFDictionary *infoDict);
-
+
virtual OSStatus SetInfoDictionary( CACFDictionary *infoDict);
virtual OSStatus GetSoundCheckDictionarySize( UInt32 *outDataSize,
UInt32 *isWritable) { return kAudioFileUnsupportedPropertyError; }
-
+
virtual OSStatus GetSoundCheckDictionary( CACFDictionary *infoDict) { return kAudioFileUnsupportedPropertyError; }
-
+
virtual OSStatus SetSoundCheckDictionary( CACFDictionary *infoDict) { return kAudioFileUnsupportedPropertyError; }
-
+
virtual OSStatus GetLoudnessInfo( CACFDictionary *infoDict) { return kAudioFileUnsupportedPropertyError; }
-
+
virtual OSStatus GetSoundCheckDictionaryFromLoudnessInfo(CACFDictionary* outInfoDict) { return kAudioFileUnsupportedPropertyError; }
virtual OSStatus GetLoudnessInfoFromSoundCheckDictionary(CACFDictionary* outInfoDict) { return kAudioFileUnsupportedPropertyError; }
-
+
virtual OSStatus SetLoudnessInfo( CACFDictionary *infoDict) { return kAudioFileUnsupportedPropertyError; }
virtual OSStatus GetLoudnessInfoSize( UInt32 *outDataSize,
@@ -491,16 +491,16 @@ public:
virtual OSStatus CountUserData( UInt32 inUserDataID,
UInt32 *outNumberItems);
-
+
virtual OSStatus GetUserDataSize( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *outDataSize);
-
+
virtual OSStatus GetUserData( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 *ioDataSize,
void *ioUserData);
-
+
virtual OSStatus SetUserData( UInt32 inUserDataID,
UInt32 inIndex,
UInt32 inDataSize,
@@ -516,14 +516,14 @@ public:
Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
void SetPermissions(SInt8 inPermissions) { mPermissions = inPermissions; }
-
+
/* Other Helper Methods: (some may not be necessary depending on how things are refactored) */
-
+
OSStatus OpenFile(SInt8 inPermissions, int inFD);
OSStatus CreateDataFile (CFURLRef inFileRef, int &outFileD);
- OSStatus AddDurationToInfoDictionary(CACFDictionary *infoDict, Float64 &inDuration);
+ OSStatus AddDurationToInfoDictionary(CACFDictionary *infoDict, Float64 &inDuration);
virtual Boolean IsDataFormatSupported(const AudioStreamBasicDescription *inFormat) = 0;
virtual Boolean IsDataFormatValid(const AudioStreamBasicDescription *inFormat);
@@ -535,21 +535,21 @@ public:
/* Accessors: */
Boolean IsInitialized() const { return mIsInitialized; }
void SetInitialized(Boolean inFlag) { mIsInitialized = inFlag; }
-
+
DataSource* GetDataSource() const { return mDataSource; }
void SetDataSource(DataSource *inDataSource);
-
+
void SetURL (CFURLRef inURL);
-
+
virtual UInt32 GetMaximumPacketSize() { return mMaximumPacketSize; }
virtual UInt32 FindMaximumPacketSize() { return mMaximumPacketSize; }
virtual void SetMaximumPacketSize(const UInt32 inPacketSize) { mMaximumPacketSize = inPacketSize; }
-
+
virtual UInt32 GetPacketSizeUpperBound() { return GetMaximumPacketSize (); }
-
- SInt64 GetDataOffset() const { return mDataOffset; }
- void SetDataOffset(SInt64 inOffset) { mDataOffset = inOffset; }
-
+
+ SInt64 GetDataOffset() const { return mDataOffset; }
+ void SetDataOffset(SInt64 inOffset) { mDataOffset = inOffset; }
+
// I like this idiom better than DoesPacketTableExist+NewPacketTable:
CompressedPacketTable* GetPacketTable(Boolean inCreateIt = false)
{
@@ -557,35 +557,35 @@ public:
mPacketTable = new CompressedPacketTable(mDataFormat.mFramesPerPacket);
return mPacketTable;
}
- void ClearPacketTable()
+ void ClearPacketTable()
{
DeletePacketTable();
GetPacketTable(true);
}
-
- virtual OSStatus ScanForPackets(SInt64 inToPacketCount, DataSource* inDataSrc = NULL, bool fullyParsedIfEndOfDataReached = true)
+
+ virtual OSStatus ScanForPackets(SInt64 inToPacketCount, DataSource* inDataSrc = NULL, bool fullyParsedIfEndOfDataReached = true)
{
// In formats that read packets lazily, this will be overridden to scan for packets up to the index.
if (inToPacketCount > GetNumPackets())
return kAudioFileEndOfFileError;
-
- return noErr;
+
+ return noErr;
}
-
- void AppendPacket(const AudioStreamPacketDescription &inPacket)
+
+ void AppendPacket(const AudioStreamPacketDescription &inPacket)
{
CompressedPacketTable* packetTable = GetPacketTable(true);
UInt32 numFramesInPacket = mDataFormat.mFramesPerPacket ? mDataFormat.mFramesPerPacket : inPacket.mVariableFramesInPacket;
-
+
AudioStreamPacketDescriptionExtended pext;
memset(&pext, 0, sizeof(pext));
pext.mStartOffset = inPacket.mStartOffset;
pext.mDataByteSize = inPacket.mDataByteSize;
pext.mVariableFramesInPacket = inPacket.mVariableFramesInPacket;
pext.mFrameOffset = numFramesInPacket + (packetTable->size() ? packetTable->back().mFrameOffset : 0);
-
- packetTable->push_back(pext);
- if (inPacket.mDataByteSize > mMaximumPacketSize)
+
+ packetTable->push_back(pext);
+ if (inPacket.mDataByteSize > mMaximumPacketSize)
mMaximumPacketSize = inPacket.mDataByteSize;
}
void DeletePacketTable() { delete mPacketTable; mPacketTable = NULL;}
@@ -597,9 +597,9 @@ public:
{
// only get as many packet descriptions as can fit in outPacketDescriptions
UInt32 count = *ioDataSize / sizeof(AudioStreamPacketDescription);
- if (count + inStartingPacket > GetPacketTableSize())
+ if (count + inStartingPacket > GetPacketTableSize())
count = (UInt32)(GetPacketTableSize() - inStartingPacket);
-
+
*ioDataSize = 0;
for (UInt32 i = inStartingPacket; i < (count + inStartingPacket); i++)
{
@@ -632,7 +632,7 @@ public:
Boolean GetNeedsSizeUpdate() const { return mNeedsSizeUpdate; }
void SetNeedsSizeUpdate(Boolean inNeedsSizeUpdate) { mNeedsSizeUpdate = inNeedsSizeUpdate; }
-
+
CFURLRef GetURL () const { return mFileRef; }
virtual OSStatus GetSourceBitDepth(SInt32& outValue) { outValue = 0; return kAudioFileUnsupportedPropertyError; }
@@ -646,7 +646,7 @@ private:
void SetAlignDataWithFillerChunks(Boolean inFlag) { mAlignDataWithFillerChunks = inFlag; }
OSStatus ValidateFormatAndData();
-
+
/* debug */
// virtual void PrintFile (FILE* inFile, const char *indent) = 0;
};
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp
index ba07580..d2c0890 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp
@@ -2,14 +2,14 @@
File: CompressedPacketTable.cpp
Abstract: CompressedPacketTable.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CompressedPacketTable.h"
#include "CAAutoDisposer.h"
@@ -66,7 +66,7 @@ void CompressedPacketTable::push_back(const AudioStreamPacketDescriptionExtended
{
SInt64 baseIndex = mSize >> kShift;
UInt32 packetIndex = (UInt32)(mSize & kMask);
-
+
if (packetIndex == 0) {
// first packet in a new sequence. create a new PacketBase.
PacketBase newBase;
@@ -75,16 +75,16 @@ void CompressedPacketTable::push_back(const AudioStreamPacketDescriptionExtended
newBase.mDescType = kExtendedPacketDescription;
mBases.push_back(newBase);
}
-
+
PacketBase& base = mBases[(size_t)baseIndex];
AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
descs[packetIndex] = inDesc;
-
+
if (packetIndex == kMask) {
// last packet in a sequence. compress the sequence.
Compress(base);
}
-
+
mSize++;
}
@@ -109,13 +109,13 @@ const AudioStreamPacketDescriptionExtended CompressedPacketTable::operator[](SIn
if ((size_t)baseIndex >= mBases.size())
throw -1;
-
+
const PacketBase& base = mBases[(size_t)baseIndex];
-
+
SInt64 packetOffset = 0;
UInt32 packetSize = 0;
-
- switch (base.mDescType)
+
+ switch (base.mDescType)
{
ACCESS_TYPE(Tiny)
ACCESS_TYPE(Small)
@@ -123,7 +123,7 @@ const AudioStreamPacketDescriptionExtended CompressedPacketTable::operator[](SIn
case kExtendedPacketDescription :
return ((AudioStreamPacketDescriptionExtended*)base.mDescs)[packetIndex];
}
-
+
AudioStreamPacketDescriptionExtended outDesc;
outDesc.mStartOffset = base.mBaseOffset + packetOffset;
outDesc.mDataByteSize = packetSize;
@@ -131,14 +131,14 @@ const AudioStreamPacketDescriptionExtended CompressedPacketTable::operator[](SIn
outDesc.mFrameOffset = mFramesPerPacket * inPacketIndex;
//printf("get %d %10qd %10qd %2d %10qd %6d %10qd\n", base.mDescType, inPacketIndex, baseIndex, packetIndex, outDesc.mStartOffset, outDesc.mDataByteSize, outDesc.mFrameOffset);
-
+
return outDesc;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bool CompressedPacketTable::isContiguous(PacketBase& base)
-{
+{
AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
SInt64 expectedOffset = descs[0].mStartOffset + descs[0].mDataByteSize;
for (UInt32 i = 1; i <= kMask; ++i) {
@@ -149,7 +149,7 @@ bool CompressedPacketTable::isContiguous(PacketBase& base)
}
bool CompressedPacketTable::hasVariableFrames(PacketBase& base)
-{
+{
AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
for (UInt32 i = 0; i <= kMask; ++i) {
if (descs[i].mVariableFramesInPacket) return true;
@@ -158,7 +158,7 @@ bool CompressedPacketTable::hasVariableFrames(PacketBase& base)
}
UInt32 CompressedPacketTable::largestPacket(PacketBase& base)
-{
+{
UInt32 maxPacketSize = 0;
AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
for (UInt32 i = 0; i <= kMask; ++i) {
@@ -193,17 +193,17 @@ UInt32 CompressedPacketTable::largestPacket(PacketBase& base)
void CompressedPacketTable::Compress(PacketBase& base)
{
- if (hasVariableFrames(base))
+ if (hasVariableFrames(base))
return;
-
+
bool contiguous = isContiguous(base);
-
+
AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
SInt64 delta = descs[kMask].mStartOffset + descs[kMask].mDataByteSize - descs[0].mStartOffset;
-
+
SInt64 baseOffset = descs[0].mStartOffset;
base.mBaseOffset = baseOffset;
-
+
if (delta <= 65535LL) {
COMPRESS_TYPE(Tiny, UInt16)
} else if (delta <= 4294967295LL && largestPacket(base) <= 65535) {
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h
index 47e28ca..8ca0ccf 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h
@@ -2,14 +2,14 @@
File: CompressedPacketTable.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include <iterator>
#include <vector>
@@ -72,17 +72,17 @@ class CompressedPacketTable
public:
CompressedPacketTable(UInt32 inFramesPerPacket) : mSize(0), mFramesPerPacket(inFramesPerPacket) {}
~CompressedPacketTable();
-
+
SInt64 size() const { return mSize; }
void push_back(const AudioStreamPacketDescriptionExtended& inDesc);
-
+
const AudioStreamPacketDescriptionExtended operator[](SInt64 inPacketIndex) const;
const AudioStreamPacketDescriptionExtended front() const { return (*this)[0]; }
const AudioStreamPacketDescriptionExtended back() const { return (*this)[mSize-1]; }
-
+
//SInt64 PacketForByte(SInt64 inByteOffset) const;
SInt64 ByteForPacket(SInt64 inPacketIndex) const { return (*this)[inPacketIndex].mStartOffset; }
-
+
class iterator {
public:
typedef std::input_iterator_tag iterator_category;
@@ -90,18 +90,18 @@ public:
typedef SInt64 difference_type;
typedef AudioStreamPacketDescriptionExtended value_type;
typedef value_type& reference;
-
+
iterator() : mTable(NULL), mIndex(0) {}
iterator(const CompressedPacketTable* table, SInt64 index) : mTable(table), mIndex(index) {}
iterator(const iterator& that) : mTable(that.mTable), mIndex(that.mIndex) {}
-
+
iterator& operator=(const iterator& that) { mTable = that.mTable; mIndex = that.mIndex; return *this; }
-
+
const AudioStreamPacketDescriptionExtended operator*() const { return (*mTable)[mIndex]; }
const AudioStreamPacketDescriptionExtended* const operator->() { mValue = (*mTable)[mIndex]; return &mValue; }
iterator& operator++() { ++mIndex; return *this; }
iterator& operator--() { --mIndex; return *this; }
-
+
SInt64 operator-(const iterator& that) { return mIndex - that.mIndex; }
const iterator operator-(SInt64 index) { return iterator(mTable, mIndex - index); }
const iterator operator+(SInt64 index) { return iterator(mTable, mIndex + index); }
@@ -114,52 +114,52 @@ public:
SInt64 mIndex;
AudioStreamPacketDescriptionExtended mValue; // in order to support operator-> .
};
-
+
iterator begin() const { return iterator(this, 0); }
iterator end() const { return iterator(this, mSize); }
-
+
private:
struct TinyContiguousPacketDescription
{
UInt16 mNextOffset;
};
-
+
struct TinyDiscontiguousPacketDescription : TinyContiguousPacketDescription
{
UInt16 mDataByteSize;
};
-
- // There could be a 24 bit packet description. But ALAC is who usually needs SmallContiguousPacketDescription and
- // it already uses 8x fewer packet descriptions than AAC due to the mFramesPerPacket being 8x greater.
+
+ // There could be a 24 bit packet description. But ALAC is who usually needs SmallContiguousPacketDescription and
+ // it already uses 8x fewer packet descriptions than AAC due to the mFramesPerPacket being 8x greater.
// So there isn't as great a need for saving space. 4 bytes per packet is OK for ALAC.
-
+
struct SmallContiguousPacketDescription
{
UInt32 mNextOffset;
};
-
+
struct SmallDiscontiguousPacketDescription : SmallContiguousPacketDescription
{
UInt16 mDataByteSize;
};
-
+
struct BigContiguousPacketDescription
{
UInt64 mNextOffset;
};
-
+
struct BigDiscontiguousPacketDescription : BigContiguousPacketDescription
{
UInt32 mDataByteSize;
};
-
+
struct PacketBase
{
SInt64 mBaseOffset;
UInt8 mDescType;
void* mDescs;
};
-
+
enum {
kTinyContiguousPacketDescription,
kTinyDiscontiguousPacketDescription,
@@ -171,14 +171,14 @@ private:
};
static const UInt32 kShift;
static const UInt32 kMask;
-
+
bool isContiguous(PacketBase& base);
bool hasVariableFrames(PacketBase& base);
UInt32 largestPacket(PacketBase& base);
-
+
void Compress(PacketBase& base);
-private:
+private:
std::vector<PacketBase> mBases;
UInt64 mSize;
UInt32 mFramesPerPacket;
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp
index c8a93d2..9ef9be2 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp
@@ -2,14 +2,14 @@
File: DataSource.cpp
Abstract: DataSource.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "DataSource.h"
#if TARGET_OS_WIN32
@@ -70,7 +70,7 @@ DataSource::~DataSource()
{
}
-SInt64 DataSource::CalcOffset( UInt16 positionMode,
+SInt64 DataSource::CalcOffset( UInt16 positionMode,
SInt64 positionOffset,
SInt64 currentOffset,
SInt64 size)
@@ -120,10 +120,10 @@ OSStatus MacFile_DataSource::SetSize(SInt64 inSize)
OSStatus MacFile_DataSource::ReadBytes(
- UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+ UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount)
{
if (actualCount) *actualCount = 0;
@@ -135,10 +135,10 @@ OSStatus MacFile_DataSource::ReadBytes(
}
OSStatus MacFile_DataSource::WriteBytes(
- UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+ UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount)
{
if (!buffer) return kAudio_ParamError;
@@ -162,7 +162,7 @@ UnixFile_DataSource::~UnixFile_DataSource()
{
if (mCloseOnDelete) close(mFileD);
}
-
+
OSStatus UnixFile_DataSource::GetSize(SInt64& outSize)
{
#if 0 // 6764274 using the cached file size causes a regression for apps that play a file while writing to it.
@@ -197,31 +197,31 @@ OSStatus UnixFile_DataSource::GetPos(SInt64& outPos) const
return noErr;
}
-SInt64 UnixFile_DataSource::UFCurrentOffset (UInt16 positionMode,
+SInt64 UnixFile_DataSource::UFCurrentOffset (UInt16 positionMode,
SInt64 positionOffset)
{
SInt64 offset = -1;
- switch (positionMode & kPositionModeMask)
+ switch (positionMode & kPositionModeMask)
{
- /*case fsAtMark :
+ /*case fsAtMark :
{
SInt64 pos;
OSStatus result = GetPos (pos);
if (result) return result;
- offset = pos;
+ offset = pos;
break;
}*/
case SEEK_SET :
{
- offset = positionOffset;
+ offset = positionOffset;
break;
}
- case SEEK_END :
+ case SEEK_END :
{
SInt64 size;
OSStatus result = GetSize (size);
if (result) return result;
- offset = size + positionOffset;
+ offset = size + positionOffset;
break;
}
case SEEK_CUR :
@@ -229,23 +229,23 @@ SInt64 UnixFile_DataSource::UFCurrentOffset (UInt16 positionMode,
SInt64 pos;
OSStatus result = GetPos (pos);
if (result) return result;
- offset = positionOffset + pos;
+ offset = positionOffset + pos;
break;
}
}
return offset;
}
-
+
OSStatus UnixFile_DataSource::ReadBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount)
{
if (actualCount) *actualCount = 0;
if (!buffer) return kAudio_ParamError;
- // can't use current offset as we need to go to the disk too much
+ // can't use current offset as we need to go to the disk too much
SInt64 offset = UFCurrentOffset (positionMode, positionOffset);
if (offset < 0) return kAudioFilePositionError;
@@ -260,7 +260,7 @@ OSStatus UnixFile_DataSource::ReadBytes( UInt16 positionMode,
else if (requestCount > remain) requestCount = remain;
} while (false);
#endif
-
+
if (requestCount <= 0) {
if (actualCount) *actualCount = 0;
return noErr;
@@ -283,20 +283,20 @@ OSStatus UnixFile_DataSource::ReadBytes( UInt16 positionMode,
#endif
if (numBytes == -1) return kAudioFilePositionError;
mFilePointer = offset + numBytes;
-
+
if (actualCount) *actualCount = (UInt32)numBytes;
return noErr;
}
-
-OSStatus UnixFile_DataSource::WriteBytes(UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+
+OSStatus UnixFile_DataSource::WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount)
{
if (!buffer) return kAudio_ParamError;
- // can't use current offset as we need to go to the disk too much
+ // can't use current offset as we need to go to the disk too much
SInt64 offset = UFCurrentOffset (positionMode, positionOffset);
if (offset < 0) return kAudioFilePositionError;
@@ -320,7 +320,7 @@ OSStatus UnixFile_DataSource::WriteBytes(UInt16 positionMode,
#endif
if (numBytes == -1) return kAudioFilePositionError;
mFilePointer = offset + numBytes;
-
+
if (actualCount) *actualCount = (UInt32)numBytes;
return noErr;
}
@@ -330,50 +330,50 @@ OSStatus UnixFile_DataSource::WriteBytes(UInt16 positionMode,
#define NO_CACHE 0
OSStatus Cached_DataSource::ReadFromHeaderCache(
- SInt64 offset,
+ SInt64 offset,
UInt32 requestCount,
- void *buffer,
+ void *buffer,
UInt32* actualCount)
{
if (actualCount) *actualCount = 0;
OSStatus err = noErr;
ByteCount theActualCount = 0;
-#if VERBOSE
+#if VERBOSE
printf("read from header %lld %lu %lld %lu\n", offset, requestCount, 0LL, mHeaderCacheSize);
#endif
- if (!mHeaderCache())
+ if (!mHeaderCache())
{
mHeaderCache.allocBytes(mHeaderCacheSize, true);
err = mDataSource->ReadBytes(SEEK_SET, 0, mHeaderCacheSize, mHeaderCache(), &mHeaderCacheSize);
if (err == kAudioFileEndOfFileError) err = noErr;
if (err) return err;
}
-
+
ByteCount firstPart = std::min((ByteCount)requestCount, (ByteCount)(mHeaderCacheSize - offset));
ByteCount secondPart = requestCount - firstPart;
-
+
memcpy(buffer, mHeaderCache + (ByteCount)offset, firstPart);
theActualCount = firstPart;
-
+
if (secondPart) {
UInt32 secondPartActualCount = 0;
err = mDataSource->ReadBytes(SEEK_SET, mHeaderCacheSize, static_cast<UInt32>(secondPart), (char*)buffer + firstPart, &secondPartActualCount);
theActualCount += secondPartActualCount;
}
-
+
if (actualCount) *actualCount = (UInt32)theActualCount;
mOffset = offset + theActualCount;
-
+
return err;
}
OSStatus Cached_DataSource::ReadBytes(
- UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+ UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount)
{
if (actualCount) *actualCount = 0;
@@ -384,7 +384,7 @@ OSStatus Cached_DataSource::ReadBytes(
if (!buffer) return kAudio_ParamError;
if ((positionMode & kPositionModeMask) != SEEK_END) size = 0; // not used in this case
- else
+ else
{
err = GetSize(size);
if (err) return err;
@@ -392,7 +392,7 @@ OSStatus Cached_DataSource::ReadBytes(
SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
if (offset < 0) return kAudioFilePositionError;
-
+
if (offset < mHeaderCacheSize) {
return ReadFromHeaderCache(offset, requestCount, buffer, actualCount);
}
@@ -405,10 +405,10 @@ OSStatus Cached_DataSource::ReadBytes(
SInt64 cacheEnd = mBodyCacheOffset + mBodyCacheCurSize;
if (mBodyCache() && requestCount < mBodyCacheSize && offset >= mBodyCacheOffset && offset < cacheEnd)
{
- if (offset + requestCount <= cacheEnd)
+ if (offset + requestCount <= cacheEnd)
{
// request is entirely within cache
-#if VERBOSE
+#if VERBOSE
printf("request is entirely within cache %lld %lu %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
#endif
memcpy(buffer, mBodyCache + (size_t)(offset - mBodyCacheOffset), requestCount);
@@ -417,25 +417,25 @@ OSStatus Cached_DataSource::ReadBytes(
else
{
// part of request is within cache. copy, read next cache block, copy.
-#if VERBOSE
+#if VERBOSE
printf("part of request is within cache %lld %lu %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
#endif
-
+
// copy first part.
ByteCount firstPart = (ByteCount)(cacheEnd - offset);
ByteCount secondPart = requestCount - firstPart;
-#if VERBOSE
- printf("memcpy offset %lld mBodyCacheOffset %lld offset - mBodyCacheOffset %lld firstPart %lu requestCount %lu\n",
+#if VERBOSE
+ printf("memcpy offset %lld mBodyCacheOffset %lld offset - mBodyCacheOffset %lld firstPart %lu requestCount %lu\n",
offset, mBodyCacheOffset, offset - mBodyCacheOffset, firstPart, requestCount);
#endif
memcpy(buffer, mBodyCache + (size_t)(offset - mBodyCacheOffset), firstPart);
-
+
theActualCount = static_cast<UInt32>(firstPart);
-
+
// read new block
SInt64 nextOffset = mBodyCacheOffset + mBodyCacheCurSize;
err = mDataSource->ReadBytes(SEEK_SET, nextOffset, mBodyCacheSize, mBodyCache(), &mBodyCacheCurSize);
-
+
if (err == kAudioFileEndOfFileError) err = noErr;
if (err) goto leave;
@@ -447,11 +447,11 @@ OSStatus Cached_DataSource::ReadBytes(
theActualCount = static_cast<UInt32>(firstPart + secondPart);
}
}
- else
+ else
{
if (requestCount > mBodyCacheSize)
{
-#if VERBOSE
+#if VERBOSE
printf("large request %lld %lu %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
#endif
// the request is larger than we normally cache, just do a read and don't cache.
@@ -461,19 +461,19 @@ OSStatus Cached_DataSource::ReadBytes(
else
{
// request is outside cache. read new block.
-#if VERBOSE
+#if VERBOSE
printf("request is outside cache %lld %lu %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
#endif
- if (!mBodyCache())
+ if (!mBodyCache())
{
mBodyCache.allocBytes(mBodyCacheSize, true);
-#if VERBOSE
+#if VERBOSE
printf("alloc mBodyCache %08X\n", mBodyCache());
#endif
}
mBodyCacheOffset = offset;
err = mDataSource->ReadBytes(SEEK_SET, mBodyCacheOffset, mBodyCacheSize, mBodyCache(), &mBodyCacheCurSize);
-#if VERBOSE
+#if VERBOSE
printf("read %08X %d mBodyCacheOffset %lld %lu %lu\n", err, err, mBodyCacheOffset, mBodyCacheSize, mBodyCacheCurSize);
#endif
if (err == kAudioFileEndOfFileError) err = noErr;
@@ -482,32 +482,32 @@ OSStatus Cached_DataSource::ReadBytes(
theActualCount = std::min(requestCount, mBodyCacheCurSize);
memcpy(buffer, mBodyCache(), theActualCount);
}
-
+
}
leave:
#endif
if (actualCount) *actualCount = (UInt32)theActualCount;
-#if VERBOSE
+#if VERBOSE
printf("<<read err %d actualCount %lu\n", err, *actualCount);
#endif
return err;
}
OSStatus Cached_DataSource::WriteBytes(
- UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+ UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount)
{
OSStatus err = noErr;
SInt64 size;
if (!buffer) return kAudio_ParamError;
-
+
if ((positionMode & kPositionModeMask) != SEEK_END) size = 0; // not used in this case
- else
+ else
{
err = GetSize(size);
if (err) return err;
@@ -515,18 +515,18 @@ OSStatus Cached_DataSource::WriteBytes(
SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
if (offset < 0) return kAudioFilePositionError;
-
- if (mHeaderCache() && offset < mHeaderCacheSize)
+
+ if (mHeaderCache() && offset < mHeaderCacheSize)
{
// header cache write through
ByteCount firstPart = std::min((ByteCount)requestCount, (ByteCount)(mHeaderCacheSize - offset));
-#if VERBOSE
+#if VERBOSE
printf("header cache write through %lu %lu\n", mHeaderCacheSize, firstPart);
#endif
memcpy(mHeaderCache + (size_t)offset, buffer, firstPart);
}
-
-#if VERBOSE
+
+#if VERBOSE
printf("write %lld %lu %lld %d %lld\n", offset, requestCount, mOffset, positionMode, positionOffset);
#endif
@@ -535,18 +535,18 @@ OSStatus Cached_DataSource::WriteBytes(
{
// body cache write through
ByteCount firstPart = std::min((SInt64)requestCount, cacheEnd - offset);
-#if VERBOSE
+#if VERBOSE
printf("body cache write through %lld %lu %lld %lu\n", mBodyCacheOffset, mBodyCacheCurSize, offset, firstPart);
#endif
memcpy(mBodyCache + (offset - mBodyCacheOffset), buffer, firstPart);
}
-
+
UInt32 theActualCount;
err = mDataSource->WriteBytes(positionMode, positionOffset, requestCount, buffer, &theActualCount);
-
+
mOffset = offset + theActualCount;
if (actualCount) *actualCount = (UInt32)theActualCount;
-
+
return err;
}
@@ -555,11 +555,11 @@ OSStatus Cached_DataSource::WriteBytes(
//////////////////////////////////////////////////////////////////////////////////////////
Seekable_DataSource::Seekable_DataSource( void * inClientData,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc)
- : DataSource(false), mClientData(inClientData), mReadFunc(inReadFunc), mWriteFunc(inWriteFunc),
+ : DataSource(false), mClientData(inClientData), mReadFunc(inReadFunc), mWriteFunc(inWriteFunc),
mSizeFunc(inGetSizeFunc), mSetSizeFunc(inSetSizeFunc)
{
}
@@ -585,15 +585,15 @@ OSStatus Seekable_DataSource::SetSize(SInt64 inSize)
return (*mSetSizeFunc)(mClientData, inSize);
}
-OSStatus Seekable_DataSource::ReadBytes(
- UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+OSStatus Seekable_DataSource::ReadBytes(
+ UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount)
{
OSStatus err;
-
+
if (actualCount) *actualCount = 0;
if (!mReadFunc) return kAudioFileOperationNotSupportedError;
if (!buffer) return kAudio_ParamError;
@@ -605,16 +605,16 @@ OSStatus Seekable_DataSource::ReadBytes(
if (err) return err;
SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
-
+
// request is outside bounds of file
- if (offset < 0)
+ if (offset < 0)
return kAudioFilePositionError;
- if (offset >= size)
+ if (offset >= size)
return kAudioFileEndOfFileError;
-
+
// reduce request if it exceeds the amount available
requestCount = static_cast<UInt32>(std::min((SInt64)requestCount, size - offset));
-
+
UInt32 theActualCount = 0;
err = (*mReadFunc)(mClientData, offset, requestCount, buffer, &theActualCount);
if (actualCount) *actualCount = theActualCount;
@@ -622,23 +622,23 @@ OSStatus Seekable_DataSource::ReadBytes(
return err;
}
-
+
OSStatus Seekable_DataSource::WriteBytes(
- UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+ UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount)
{
OSStatus err;
-
+
if (!mWriteFunc) return kAudioFileOperationNotSupportedError;
if (!buffer) return kAudio_ParamError;
SInt64 size;
positionMode &= kPositionModeMask;
if (positionMode != SEEK_END) size = 0; // not used in this case
- else
+ else
{
err = GetSize(size);
if (err) return err;
@@ -646,7 +646,7 @@ OSStatus Seekable_DataSource::WriteBytes(
SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
if (offset < 0) return kAudioFilePositionError;
-
+
UInt32 theActualCount;
err = (*mWriteFunc)(mClientData, offset, requestCount, buffer, &theActualCount);
if (err) return err;
@@ -658,16 +658,16 @@ OSStatus Seekable_DataSource::WriteBytes(
//////////////////////////////////////////////////////////////////////////////////////////
OSStatus Buffer_DataSource::ReadBytes(
- UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+ UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount)
{
if (actualCount) *actualCount = 0;
- SInt64 offsetWithinBuffer = CalcOffset(positionMode, positionOffset, mOffset, mDataByteSize + mStartOffset) - mStartOffset;
+ SInt64 offsetWithinBuffer = CalcOffset(positionMode, positionOffset, mOffset, mDataByteSize + mStartOffset) - mStartOffset;
if (offsetWithinBuffer < 0 || offsetWithinBuffer >= mDataByteSize) return kAudioFilePositionError;
-
+
SInt64 bytesAfterOffset = mDataByteSize - offsetWithinBuffer;
SInt64 theActualCount = std::min(bytesAfterOffset, (SInt64)requestCount);
@@ -677,7 +677,7 @@ OSStatus Buffer_DataSource::ReadBytes(
}
memcpy(buffer, mData + offsetWithinBuffer, theActualCount);
-
+
if (actualCount) *actualCount = static_cast<UInt32>(theActualCount);
mOffset = offsetWithinBuffer + theActualCount;
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
index 6c79c94..916ae07 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
@@ -2,14 +2,14 @@
File: DataSource.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __DataSource_h__
#define __DataSource_h__
@@ -63,10 +63,10 @@
class DataSource
{
public:
-
+
DataSource(Boolean inCloseOnDelete);
virtual ~DataSource();
-
+
virtual OSStatus GetSize32(UInt32& outSize)
{
SInt64 size64;
@@ -76,43 +76,43 @@ public:
outSize = (UInt32)size64;
return noErr;
}
-
+
virtual OSStatus GetSize(SInt64& outSize) =0;
-
+
virtual OSStatus SetSize(SInt64 inSize)=0;
-
- virtual OSStatus GetPos(SInt64& outPos) const=0;
-
- /* non seekable data sources should use fsAtMark for the positionMode (or SEEK_CUR with offset zero,
- or SEEK_SET with offset equal to the current position in the stream, in other words no seeking from the
+
+ virtual OSStatus GetPos(SInt64& outPos) const=0;
+
+ /* non seekable data sources should use fsAtMark for the positionMode (or SEEK_CUR with offset zero,
+ or SEEK_SET with offset equal to the current position in the stream, in other words no seeking from the
current position is allowed.)
*/
-
- virtual OSStatus ReadBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount)=0;
-
- virtual OSStatus WriteBytes(UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount)=0;
-
+
virtual void SetCloseOnDelete(Boolean inFlag) { mCloseOnDelete = inFlag; }
-
+
virtual Boolean CanSeek() const=0;
virtual Boolean CanGetSize() const=0;
virtual Boolean CanSetSize() const=0;
virtual Boolean CanRead() const=0;
virtual Boolean CanWrite() const=0;
-
+
protected:
Boolean mCloseOnDelete;
-
+
/* utility method */
- SInt64 CalcOffset( UInt16 positionMode,
+ SInt64 CalcOffset( UInt16 positionMode,
SInt64 positionOffset,
SInt64 currentOffset,
SInt64 size);
@@ -131,33 +131,33 @@ class MacFile_DataSource : public DataSource
{
FSIORefNum mFileNum;
SInt8 mPermissions;
-
+
public:
MacFile_DataSource( FSIORefNum inForkRefNum, SInt8 inPermissions, Boolean inCloseOnDelete);
virtual ~MacFile_DataSource();
-
+
virtual OSStatus GetSize(SInt64& outSize);
- virtual OSStatus GetPos(SInt64& outPos) const;
-
+ virtual OSStatus GetPos(SInt64& outPos) const;
+
virtual OSStatus SetSize(SInt64 inSize);
-
- virtual OSStatus ReadBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount);
-
- virtual OSStatus WriteBytes(UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount);
-
+
virtual Boolean CanSeek() const { return true; }
virtual Boolean CanGetSize() const { return true; }
virtual Boolean CanSetSize() const { return true; }
-
+
virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
};
@@ -171,39 +171,39 @@ class UnixFile_DataSource : public DataSource
UInt32 mNoCache;
SInt64 mCachedSize;
SInt64 mFilePointer;
-
+
public:
UnixFile_DataSource( int inFD, SInt8 inPermissions, Boolean inCloseOnDelete);
virtual ~UnixFile_DataSource();
-
+
virtual OSStatus GetSize(SInt64& outSize);
- virtual OSStatus GetPos(SInt64& outPos) const;
-
+ virtual OSStatus GetPos(SInt64& outPos) const;
+
virtual OSStatus SetSize(SInt64 inSize);
-
- virtual OSStatus ReadBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount);
-
- virtual OSStatus WriteBytes(UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount);
-
+
virtual Boolean CanSeek() const { return true; }
virtual Boolean CanGetSize() const { return true; }
virtual Boolean CanSetSize() const { return true; }
-
+
virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
private:
- SInt64 UFCurrentOffset (UInt16 positionMode,
+ SInt64 UFCurrentOffset (UInt16 positionMode,
SInt64 positionOffset);
};
@@ -225,50 +225,50 @@ class Cached_DataSource : public DataSource
SInt64 mBodyCacheOffset;
SInt64 mOffset;
Boolean mOwnDataSource;
-
+
public:
Cached_DataSource(DataSource* inDataSource, UInt32 inHeaderCacheSize = 4096, UInt32 inBodyCacheSize = 32768, Boolean inOwnDataSource = true)
- : DataSource(false),
- mDataSource(inDataSource), mHeaderCacheSize(inHeaderCacheSize),
- mBodyCacheSize(inBodyCacheSize), mBodyCacheCurSize(0), mBodyCacheOffset(-1),
+ : DataSource(false),
+ mDataSource(inDataSource), mHeaderCacheSize(inHeaderCacheSize),
+ mBodyCacheSize(inBodyCacheSize), mBodyCacheCurSize(0), mBodyCacheOffset(-1),
mOffset(0),
mOwnDataSource(inOwnDataSource)
{
}
-
+
virtual ~Cached_DataSource()
{
if (mOwnDataSource) delete mDataSource;
}
-
+
virtual OSStatus GetSize(SInt64& outSize) { return mDataSource->GetSize(outSize); }
- virtual OSStatus GetPos(SInt64& outPos) const { return mDataSource->GetPos(outPos); }
-
+ virtual OSStatus GetPos(SInt64& outPos) const { return mDataSource->GetPos(outPos); }
+
virtual OSStatus SetSize(SInt64 inSize) { return mDataSource->SetSize(inSize); }
-
- virtual OSStatus ReadBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount);
-
- virtual OSStatus WriteBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+
+ virtual OSStatus WriteBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount);
-
- OSStatus ReadFromHeaderCache( SInt64 offset,
+
+ OSStatus ReadFromHeaderCache( SInt64 offset,
UInt32 requestCount,
- void *buffer,
+ void *buffer,
UInt32* actualCount);
-
+
virtual Boolean CanSeek() const { return mDataSource->CanSeek(); }
virtual Boolean CanGetSize() const { return mDataSource->CanGetSize(); }
virtual Boolean CanSetSize() const { return mDataSource->CanSetSize(); }
-
+
virtual Boolean CanRead() const { return mDataSource->CanRead(); }
virtual Boolean CanWrite() const { return mDataSource->CanWrite(); }
};
@@ -286,37 +286,37 @@ class Seekable_DataSource : public DataSource
{
void * mClientData;
SInt64 mOffset;
-
+
AudioFile_ReadProc mReadFunc;
AudioFile_WriteProc mWriteFunc;
AudioFile_GetSizeProc mSizeFunc;
AudioFile_SetSizeProc mSetSizeFunc;
-
+
public:
Seekable_DataSource( void * inClientData,
- AudioFile_ReadProc inReadFunc,
- AudioFile_WriteProc inWriteFunc,
+ AudioFile_ReadProc inReadFunc,
+ AudioFile_WriteProc inWriteFunc,
AudioFile_GetSizeProc inGetSizeFunc,
AudioFile_SetSizeProc inSetSizeFunc
);
-
+
virtual ~Seekable_DataSource();
-
+
virtual OSStatus GetSize(SInt64& outSize);
- virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
-
+ virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
+
virtual OSStatus SetSize(SInt64 inSize);
-
- virtual OSStatus ReadBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount);
-
- virtual OSStatus WriteBytes(UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount);
virtual Boolean CanSeek() const { return true; }
@@ -340,24 +340,24 @@ public:
const void * inData,
SInt64 inStartOffset = 0
) : DataSource(false), mDataByteSize(inDataByteSize), mData((const char*)inData), mStartOffset(inStartOffset), mOffset(mStartOffset) {}
-
+
virtual ~Buffer_DataSource() {}
-
+
virtual OSStatus GetSize(SInt64& outSize) { outSize = mDataByteSize + mStartOffset; return noErr; }
- virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
-
+ virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
+
virtual OSStatus SetSize(SInt64 inSize) { throw std::runtime_error("not writable"); }
-
- virtual OSStatus ReadBytes( UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- void *buffer,
+
+ virtual OSStatus ReadBytes( UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ void *buffer,
UInt32* actualCount);
-
- virtual OSStatus WriteBytes(UInt16 positionMode,
- SInt64 positionOffset,
- UInt32 requestCount,
- const void *buffer,
+
+ virtual OSStatus WriteBytes(UInt16 positionMode,
+ SInt64 positionOffset,
+ UInt32 requestCount,
+ const void *buffer,
UInt32* actualCount) { throw std::runtime_error("not writable"); }
virtual Boolean CanSeek() const { return true; }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp
index 612bc4d..c77322d 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp
@@ -2,14 +2,14 @@
File: AUBase.cpp
Abstract: AUBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUBase.h"
#include "AUDispatch.h"
@@ -88,7 +88,7 @@ SInt32 AUBase::sVectorUnitType = kVecUninitialized;
//_____________________________________________________________________________
//
-AUBase::AUBase( AudioComponentInstance inInstance,
+AUBase::AUBase( AudioComponentInstance inInstance,
UInt32 numInputElements,
UInt32 numOutputElements,
UInt32 numGroupElements) :
@@ -96,7 +96,7 @@ AUBase::AUBase( AudioComponentInstance inInstance,
mElementsCreated(false),
mInitialized(false),
mHasBegunInitializing(false),
- mInitNumInputEls(numInputElements), mInitNumOutputEls(numOutputElements),
+ mInitNumInputEls(numInputElements), mInitNumOutputEls(numOutputElements),
#if !CA_BASIC_AU_FEATURES
mInitNumGroupEls(numGroupElements),
#endif
@@ -115,7 +115,7 @@ AUBase::AUBase( AudioComponentInstance inInstance,
#endif
{
ResetRenderTime ();
-
+
if(!sAUBaseCFStringsInitialized)
{
kUntitledString = CFSTR("Untitled");
@@ -137,11 +137,11 @@ AUBase::AUBase( AudioComponentInstance inInstance,
}
mAudioUnitAPIVersion = 2;
-
+
SetMaxFramesPerSlice(kAUDefaultMaxFramesPerSlice);
GlobalScope().Initialize(this, kAudioUnitScope_Global, 1);
-
+
#if !CA_NO_AU_UI_FEATURES
memset (&mHostCallbackInfo, 0, sizeof (mHostCallbackInfo));
#endif
@@ -175,7 +175,7 @@ void AUBase::CreateElements()
Groups().Initialize(this, kAudioUnitScope_Group, mInitNumGroupEls);
#endif
CreateExtendedElements();
-
+
mElementsCreated = true;
}
}
@@ -202,7 +202,7 @@ OSStatus AUBase::CanSetMaxFrames() const
void AUBase::ReallocateBuffers()
{
CreateElements();
-
+
UInt32 nOutputs = Outputs().GetNumberOfElements();
for (UInt32 i = 0; i < nOutputs; ++i) {
AUOutputElement *output = GetOutput(i);
@@ -241,7 +241,7 @@ void AUBase::DeallocateIOBuffers()
OSStatus AUBase::DoInitialize()
{
OSStatus result = noErr;
-
+
if (!mInitialized) {
result = Initialize();
if (result == noErr) {
@@ -279,7 +279,7 @@ void AUBase::DoCleanup()
{
if (mInitialized)
Cleanup();
-
+
DeallocateIOBuffers();
ResetRenderTime ();
@@ -312,22 +312,22 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
{
OSStatus result = noErr;
bool validateElement = true;
-
+
switch (inID) {
case kAudioUnitProperty_MakeConnection:
ca_require(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Global, InvalidScope);
outDataSize = sizeof(AudioUnitConnection);
outWritable = true;
break;
-
-
+
+
case kAudioUnitProperty_SetRenderCallback:
ca_require(AudioUnitAPIVersion() > 1, InvalidProperty);
ca_require(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Global, InvalidScope);
outDataSize = sizeof(AURenderCallbackStruct);
outWritable = true;
break;
-
+
case kAudioUnitProperty_StreamFormat:
outDataSize = sizeof(CAStreamBasicDescription);
outWritable = IsStreamFormatWritable(inScope, inElement);
@@ -352,7 +352,7 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
outWritable = false;
}
break;
-
+
case kAudioUnitProperty_PresentPreset:
#if !CA_USE_AUDIO_PLUGIN_ONLY
#ifndef __LP64__
@@ -363,23 +363,23 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
outDataSize = sizeof(AUPreset);
outWritable = true;
break;
-
+
case kAudioUnitProperty_ElementName:
outDataSize = sizeof (CFStringRef);
outWritable = true;
break;
-
+
case kAudioUnitProperty_ParameterList:
{
UInt32 nparams = 0;
result = GetParameterList(inScope, NULL, nparams);
-
+
outDataSize = sizeof(AudioUnitParameterID) * nparams;
outWritable = false;
validateElement = false;
}
break;
-
+
case kAudioUnitProperty_ParameterInfo:
outDataSize = sizeof(AudioUnitParameterInfo);
outWritable = false;
@@ -397,13 +397,13 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
outWritable = BusCountWritable(inScope);
validateElement = false;
break;
-
+
case kAudioUnitProperty_Latency:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
outDataSize = sizeof(Float64);
outWritable = false;
break;
-
+
case kAudioUnitProperty_TailTime:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
if (SupportsTail()) {
@@ -412,19 +412,19 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
} else
goto InvalidProperty;
break;
-
+
case kAudioUnitProperty_MaximumFramesPerSlice:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
outDataSize = sizeof(UInt32);
outWritable = true;
break;
-
+
case kAudioUnitProperty_LastRenderError:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
outDataSize = sizeof(OSStatus);
outWritable = false;
break;
-
+
case kAudioUnitProperty_SupportedNumChannels:
{
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -437,7 +437,7 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
outWritable = false;
break;
}
-
+
case kAudioUnitProperty_SupportedChannelLayoutTags:
{
UInt32 numLayouts = GetChannelLayoutTags(inScope, inElement, NULL);
@@ -450,7 +450,7 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
validateElement = false; //already done it
break;
}
-
+
case kAudioUnitProperty_AudioChannelLayout:
{
outWritable = false;
@@ -490,11 +490,11 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
if (outDataSize == 0)
goto InvalidProperty;
outDataSize *= sizeof (AudioComponentDescription);
-
+
outWritable = false;
break;
#endif
-
+
case kAudioUnitProperty_ParameterValueStrings:
result = GetParameterValueStrings(inScope, inElement, NULL);
if (result == noErr) {
@@ -517,7 +517,7 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
outDataSize = sizeof(CFStringRef);
outWritable = true;
break;
-
+
case kAudioUnitProperty_IconLocation:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
outWritable = false;
@@ -537,7 +537,7 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
outDataSize = sizeof(Float64);
outWritable = false;
break;
-
+
case kAudioUnitProperty_NickName:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
outDataSize = sizeof(CFStringRef);
@@ -551,9 +551,9 @@ OSStatus AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID inID,
}
if (result == noErr && validateElement) {
- ca_require(GetElement(inScope, inElement) != NULL, InvalidElement);
+ ca_require(GetElement(inScope, inElement) != NULL, InvalidElement);
}
-
+
return result;
InvalidProperty:
return kAudioUnitErr_InvalidProperty;
@@ -579,11 +579,11 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
case kAudioUnitProperty_StreamFormat:
*(CAStreamBasicDescription *)outData = GetStreamFormat(inScope, inElement);
break;
-
+
case kAudioUnitProperty_SampleRate:
*(Float64 *)outData = GetStreamFormat(inScope, inElement).mSampleRate;
break;
-
+
case kAudioUnitProperty_ParameterList:
{
UInt32 nparams = 0;
@@ -615,7 +615,7 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
result = GetPresets ((CFArrayRef *)outData);
}
break;
-
+
case kAudioUnitProperty_PresentPreset:
#if !CA_USE_AUDIO_PLUGIN_ONLY
#ifndef __LP64__
@@ -624,15 +624,15 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
#endif
{
*(AUPreset *)outData = mCurrentPreset;
-
+
// retain current string (as client owns a reference to it and will release it)
- if (inID == kAudioUnitProperty_PresentPreset && mCurrentPreset.presetName)
+ if (inID == kAudioUnitProperty_PresentPreset && mCurrentPreset.presetName)
CFRetain (mCurrentPreset.presetName);
result = noErr;
}
break;
-
+
case kAudioUnitProperty_ElementName:
{
AUElement * element = GetElement(inScope, inElement);
@@ -648,7 +648,7 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
case kAudioUnitProperty_ElementCount:
*(UInt32 *)outData = GetScope(inScope).GetNumberOfElements();
break;
-
+
case kAudioUnitProperty_Latency:
*(Float64 *)outData = GetLatency();
break;
@@ -659,7 +659,7 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
else
result = kAudioUnitErr_InvalidProperty;
break;
-
+
case kAudioUnitProperty_MaximumFramesPerSlice:
*(UInt32 *)outData = mMaxFramesPerSlice;
break;
@@ -686,9 +686,9 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
result = kAudioUnitErr_InvalidProperty;
}
break;
-
+
case kAudioUnitProperty_AudioChannelLayout:
- {
+ {
AudioChannelLayout* ptr = outData ? static_cast<AudioChannelLayout*>(outData) : NULL;
Boolean writable;
UInt32 dataSize = GetAudioChannelLayout(inScope, inElement, ptr, writable);
@@ -710,7 +710,7 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
case kAudioUnitProperty_ParameterValueStrings:
result = GetParameterValueStrings(inScope, inElement, (CFArrayRef *)outData);
break;
-
+
#if !CA_USE_AUDIO_PLUGIN_ONLY
case kAudioUnitProperty_FastDispatch:
if (!IsCMgrObject()) result = kAudioUnitErr_InvalidProperty;
@@ -765,21 +765,21 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
result = kAudioUnitErr_InvalidPropertyValue;
}
break;
-
+
case kAudioUnitProperty_ParameterClumpName:
{
AudioUnitParameterNameInfo * ioClumpInfo = (AudioUnitParameterNameInfo*) outData;
if (ioClumpInfo->inID == kAudioUnitClumpID_System) // this ID value is reserved
result = kAudioUnitErr_InvalidPropertyValue;
- else
+ else
{
result = CopyClumpName(inScope, ioClumpInfo->inID, ioClumpInfo->inDesiredLength, &ioClumpInfo->outName);
-
+
// this is provided for compatbility with existing implementations that don't know
// about this new mechanism
if (result == kAudioUnitErr_InvalidProperty)
result = GetProperty (inID, inScope, inElement, outData);
- }
+ }
}
break;
@@ -794,7 +794,7 @@ OSStatus AUBase::DispatchGetProperty( AudioUnitPropertyID inID,
if (mNickName) CFRetain(mNickName);
*(CFStringRef*)outData = mNickName;
break;
-
+
default:
result = GetProperty(inID, inScope, inElement, outData);
break;
@@ -822,7 +822,7 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
}
break;
-
+
case kAudioUnitProperty_SetRenderCallback:
{
ca_require(inDataSize >= sizeof(AURenderCallbackStruct), InvalidPropertyValue);
@@ -840,7 +840,7 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
PropertyChanged(inID, inScope, inElement);
}
break;
-
+
case kAudioUnitProperty_MaximumFramesPerSlice:
ca_require(inDataSize == sizeof(UInt32), InvalidPropertyValue);
result = CanSetMaxFrames();
@@ -862,14 +862,14 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
ca_require(ValidFormat(inScope, inElement, newDesc), InvalidFormat);
const CAStreamBasicDescription curDesc = GetStreamFormat(inScope, inElement);
-
+
if ( !curDesc.IsEqual(newDesc, false) ) {
ca_require(IsStreamFormatWritable(inScope, inElement), NotWritable);
result = ChangeStreamFormat(inScope, inElement, curDesc, newDesc);
}
}
break;
-
+
case kAudioUnitProperty_SampleRate:
{
ca_require(inDataSize == sizeof(Float64), InvalidPropertyValue);
@@ -878,9 +878,9 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
const CAStreamBasicDescription curDesc = GetStreamFormat(inScope, inElement);
CAStreamBasicDescription newDesc = curDesc;
newDesc.mSampleRate = *(Float64 *)inData;
-
+
ca_require(ValidFormat(inScope, inElement, newDesc), InvalidFormat);
-
+
if ( !curDesc.IsEqual(newDesc, false) ) {
ca_require(IsStreamFormatWritable(inScope, inElement), NotWritable);
result = ChangeStreamFormat(inScope, inElement, curDesc, newDesc);
@@ -892,14 +892,14 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
{
const AudioChannelLayout *layout = static_cast<const AudioChannelLayout *>(inData);
size_t headerSize = sizeof(AudioChannelLayout) - sizeof(AudioChannelDescription);
-
+
ca_require(inDataSize >= headerSize + layout->mNumberChannelDescriptions * sizeof(AudioChannelDescription), InvalidPropertyValue);
result = SetAudioChannelLayout(inScope, inElement, layout);
if (result == noErr)
PropertyChanged(inID, inScope, inElement);
break;
}
-
+
case kAudioUnitProperty_ClassInfo:
ca_require(inDataSize == sizeof(CFPropertyListRef *), InvalidPropertyValue);
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -916,7 +916,7 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
ca_require(inDataSize == sizeof(AUPreset), InvalidPropertyValue);
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
AUPreset & newPreset = *(AUPreset *)inData;
-
+
if (newPreset.presetNumber >= 0)
{
result = NewFactoryPresetSet(newPreset);
@@ -935,7 +935,7 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
result = kAudioUnitErr_InvalidPropertyValue;
}
break;
-
+
case kAudioUnitProperty_ElementName:
{
ca_require(GetElement(inScope, inElement) != NULL, InvalidElement);
@@ -1003,7 +1003,7 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
break;
#endif // !CA_NO_AU_UI_FEATURES
-
+
case kAudioUnitProperty_NickName:
{
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -1015,12 +1015,12 @@ OSStatus AUBase::DispatchSetProperty( AudioUnitPropertyID inID,
PropertyChanged(inID, inScope, inElement);
break;
}
-
+
default:
result = SetProperty(inID, inScope, inElement, inData, inDataSize);
if (result == noErr)
PropertyChanged(inID, inScope, inElement);
-
+
break;
}
return result;
@@ -1062,7 +1062,7 @@ OSStatus AUBase::DispatchRemovePropertyValue (AudioUnitPropertyID inID,
PropertyChanged(inID, inScope, inElement);
break;
}
-
+
#if !CA_NO_AU_HOST_CALLBACKS
case kAudioUnitProperty_HostCallbacks:
{
@@ -1088,7 +1088,7 @@ OSStatus AUBase::DispatchRemovePropertyValue (AudioUnitPropertyID inID,
mContextName = NULL;
result = noErr;
break;
-
+
#endif // !CA_NO_AU_UI_FEATURES
case kAudioUnitProperty_NickName:
@@ -1104,10 +1104,10 @@ OSStatus AUBase::DispatchRemovePropertyValue (AudioUnitPropertyID inID,
}
default:
- result = RemovePropertyValue (inID, inScope, inElement);
+ result = RemovePropertyValue (inID, inScope, inElement);
break;
}
-
+
return result;
#if !CA_NO_AU_UI_FEATURES || !CA_NO_AU_HOST_CALLBACKS
InvalidScope:
@@ -1157,7 +1157,7 @@ OSStatus AUBase::RemovePropertyValue ( AudioUnitPropertyID inID,
{
return kAudioUnitErr_InvalidPropertyValue;
}
-
+
//_____________________________________________________________________________
//
OSStatus AUBase::AddPropertyListener( AudioUnitPropertyID inID,
@@ -1165,11 +1165,11 @@ OSStatus AUBase::AddPropertyListener( AudioUnitPropertyID inID,
void * inProcRefCon)
{
PropertyListener pl;
-
+
pl.propertyID = inID;
pl.listenerProc = inProc;
pl.listenerRefCon = inProcRefCon;
-
+
if (mPropertyListeners.empty())
mPropertyListeners.reserve(32);
mPropertyListeners.push_back(pl);
@@ -1196,7 +1196,7 @@ OSStatus AUBase::RemovePropertyListener( AudioUnitPropertyID inID,
//_____________________________________________________________________________
//
void AUBase::PropertyChanged( AudioUnitPropertyID inID,
- AudioUnitScope inScope,
+ AudioUnitScope inScope,
AudioUnitElement inElement)
{
for (PropertyListeners::iterator it = mPropertyListeners.begin(); it != mPropertyListeners.end(); ++it)
@@ -1239,7 +1239,7 @@ OSStatus AUBase::GetParameter( AudioUnitParameterID inID,
return noErr;
}
-
+
//_____________________________________________________________________________
//
OSStatus AUBase::SetParameter( AudioUnitParameterID inID,
@@ -1259,22 +1259,22 @@ OSStatus AUBase::ScheduleParameter ( const AudioUnitParameterEvent *inParamet
UInt32 inNumEvents)
{
bool canScheduleParameters = CanScheduleParameters();
-
- for (UInt32 i = 0; i < inNumEvents; ++i)
+
+ for (UInt32 i = 0; i < inNumEvents; ++i)
{
if (inParameterEvent[i].eventType == kParameterEvent_Immediate)
{
SetParameter (inParameterEvent[i].parameter,
- inParameterEvent[i].scope,
+ inParameterEvent[i].scope,
inParameterEvent[i].element,
- inParameterEvent[i].eventValues.immediate.value,
+ inParameterEvent[i].eventValues.immediate.value,
inParameterEvent[i].eventValues.immediate.bufferOffset);
}
if (canScheduleParameters) {
mParamList.push_back (inParameterEvent[i]);
}
}
-
+
return noErr;
}
@@ -1297,9 +1297,9 @@ OSStatus AUBase::ProcessForScheduledParams( ParameterEventList &inParamList,
void *inUserData )
{
OSStatus result = noErr;
-
+
int totalFramesToProcess = inFramesToProcess;
-
+
int framesRemaining = totalFramesToProcess;
unsigned int currentStartFrame = 0; // start of the whole buffer
@@ -1310,23 +1310,23 @@ OSStatus AUBase::ProcessForScheduledParams( ParameterEventList &inParamList,
std::sort(inParamList.begin(), inParamList.end(), SortParameterEventList);
ParameterEventList::iterator iter = inParamList.begin();
-
-
+
+
while(framesRemaining > 0 )
{
// first of all, go through the ramped automation events and find out where the next
// division of our whole buffer will be
-
+
int currentEndFrame = totalFramesToProcess; // start out assuming we'll process all the way to
// the end of the buffer
-
+
iter = inParamList.begin();
-
+
// find the next break point
while(iter != inParamList.end() )
{
AudioUnitParameterEvent &event = *iter;
-
+
int offset = event.eventType == kParameterEvent_Immediate ? event.eventValues.immediate.bufferOffset : event.eventValues.ramp.startBufferOffset;
if(offset > (int)currentStartFrame && offset < currentEndFrame )
@@ -1339,7 +1339,7 @@ OSStatus AUBase::ProcessForScheduledParams( ParameterEventList &inParamList,
if(event.eventType == kParameterEvent_Ramped )
{
offset = event.eventValues.ramp.startBufferOffset + event.eventValues.ramp.durationInFrames;
-
+
if(offset > (int)currentStartFrame && offset < currentEndFrame )
{
currentEndFrame = offset;
@@ -1348,31 +1348,31 @@ OSStatus AUBase::ProcessForScheduledParams( ParameterEventList &inParamList,
iter++;
}
-
+
int framesThisTime = currentEndFrame - currentStartFrame;
- // next, setup the parameter maps to be current for the ramp parameters active during
+ // next, setup the parameter maps to be current for the ramp parameters active during
// this time segment...
-
+
for(ParameterEventList::iterator iter2 = inParamList.begin(); iter2 != inParamList.end(); iter2++ )
{
AudioUnitParameterEvent &event = *iter2;
-
+
bool eventFallsInSlice;
-
-
+
+
if(event.eventType == kParameterEvent_Ramped)
- eventFallsInSlice = event.eventValues.ramp.startBufferOffset < currentEndFrame
+ eventFallsInSlice = event.eventValues.ramp.startBufferOffset < currentEndFrame
&& event.eventValues.ramp.startBufferOffset + event.eventValues.ramp.durationInFrames > currentStartFrame;
else /* kParameterEvent_Immediate */
// actually, for the same parameter, there may be future immediate events which override this one,
// but it's OK since the event list is sorted in time order, we're guaranteed to end up with the current one
eventFallsInSlice = event.eventValues.immediate.bufferOffset <= currentStartFrame;
-
+
if(eventFallsInSlice)
{
AUElement *element = GetElement(event.scope, event.element );
-
+
if(element) element->SetScheduledEvent( event.parameter,
event,
currentStartFrame,
@@ -1383,18 +1383,18 @@ OSStatus AUBase::ProcessForScheduledParams( ParameterEventList &inParamList,
// Finally, actually do the processing for this slice.....
-
+
result = ProcessScheduledSlice( inUserData,
currentStartFrame,
framesThisTime,
inFramesToProcess );
-
+
if(result != noErr) break;
-
+
framesRemaining -= framesThisTime;
currentStartFrame = currentEndFrame; // now start from where we left off last time
}
-
+
return result;
}
@@ -1402,9 +1402,9 @@ OSStatus AUBase::ProcessForScheduledParams( ParameterEventList &inParamList,
//
void AUBase::SetWantsRenderThreadID (bool inFlag)
{
- if (inFlag == mWantsRenderThreadID)
+ if (inFlag == mWantsRenderThreadID)
return;
-
+
mWantsRenderThreadID = inFlag;
if (!mWantsRenderThreadID)
mRenderThreadID = NULL;
@@ -1423,10 +1423,10 @@ OSStatus AUBase::DoRender( AudioUnitRenderActionFlags & ioActionFlags,
{
OSStatus theError;
RenderCallbackList::iterator rcit;
-
+
AUTRACE(kCATrace_AUBaseRenderStart, mComponentInstance, (uintptr_t)this, inBusNumber, inFramesToProcess, (uintptr_t)ioData.mBuffers[0].mData);
DISABLE_DENORMALS
-
+
try {
ca_require(IsInitialized(), Uninitialized);
ca_require(mAudioUnitAPIVersion >= 2, ParamErr);
@@ -1468,7 +1468,7 @@ OSStatus AUBase::DoRender( AudioUnitRenderActionFlags & ioActionFlags,
buf.mDataByteSize = expectedBufferByteSize;
}
}
-
+
if (WantsRenderThreadID())
{
#if TARGET_OS_MAC
@@ -1477,7 +1477,7 @@ OSStatus AUBase::DoRender( AudioUnitRenderActionFlags & ioActionFlags,
mRenderThreadID = GetCurrentThreadId();
#endif
}
-
+
AudioUnitRenderActionFlags flags;
if (mRenderCallbacksTouched) {
mRenderCallbacks.update();
@@ -1485,26 +1485,26 @@ OSStatus AUBase::DoRender( AudioUnitRenderActionFlags & ioActionFlags,
for (rcit = mRenderCallbacks.begin(); rcit != mRenderCallbacks.end(); ++rcit) {
RenderCallback &rc = *rcit;
AUTRACE(kCATrace_AUBaseRenderCallbackStart, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 1, 0);
- (*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon,
+ (*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon,
&flags,
&inTimeStamp, inBusNumber, inFramesToProcess, &ioData);
AUTRACE(kCATrace_AUBaseRenderCallbackEnd, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 1, 0);
}
}
-
+
theError = DoRenderBus(ioActionFlags, inTimeStamp, inBusNumber, output, inFramesToProcess, ioData);
-
+
if (mRenderCallbacksTouched) {
flags = ioActionFlags | kAudioUnitRenderAction_PostRender;
-
+
if (SetRenderError (theError)) {
- flags |= kAudioUnitRenderAction_PostRenderError;
+ flags |= kAudioUnitRenderAction_PostRenderError;
}
-
+
for (rcit = mRenderCallbacks.begin(); rcit != mRenderCallbacks.end(); ++rcit) {
RenderCallback &rc = *rcit;
AUTRACE(kCATrace_AUBaseRenderCallbackStart, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 2, 0);
- (*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon,
+ (*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon,
&flags,
&inTimeStamp, inBusNumber, inFramesToProcess, &ioData);
AUTRACE(kCATrace_AUBaseRenderCallbackEnd, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 2, 0);
@@ -1527,12 +1527,12 @@ OSStatus AUBase::DoRender( AudioUnitRenderActionFlags & ioActionFlags,
theError = -1;
goto errexit;
}
-done:
+done:
RESTORE_DENORMALS
AUTRACE(kCATrace_AUBaseRenderEnd, mComponentInstance, (intptr_t)this, theError, ioActionFlags, CATrace::ablData(ioData));
-
+
return theError;
-
+
Uninitialized: theError = kAudioUnitErr_Uninitialized; goto errexit;
ParamErr: theError = kAudio_ParamError; goto errexit;
TooManyFrames: theError = kAudioUnitErr_TooManyFramesToProcess; goto errexit;
@@ -1553,8 +1553,8 @@ OSStatus AUBase::DoProcess ( AudioUnitRenderActionFlags & ioActionFlags,
AUTRACE(kCATrace_AUBaseRenderStart, mComponentInstance, (intptr_t)this, -1, inFramesToProcess, 0);
DISABLE_DENORMALS
- try {
-
+ try {
+
if (!(ioActionFlags & (1 << 9)/*kAudioUnitRenderAction_DoNotCheckRenderArgs*/)) {
ca_require(IsInitialized(), Uninitialized);
ca_require(inFramesToProcess <= mMaxFramesPerSlice, TooManyFrames);
@@ -1587,7 +1587,7 @@ OSStatus AUBase::DoProcess ( AudioUnitRenderActionFlags & ioActionFlags,
}
}
}
-
+
if (WantsRenderThreadID())
{
#if TARGET_OS_MAC
@@ -1596,12 +1596,12 @@ OSStatus AUBase::DoProcess ( AudioUnitRenderActionFlags & ioActionFlags,
mRenderThreadID = GetCurrentThreadId();
#endif
}
-
+
if (NeedsToRender (inTimeStamp)) {
theError = ProcessBufferLists (ioActionFlags, ioData, ioData, inFramesToProcess);
} else
theError = noErr;
-
+
}
catch (OSStatus err) {
theError = err;
@@ -1611,12 +1611,12 @@ OSStatus AUBase::DoProcess ( AudioUnitRenderActionFlags & ioActionFlags,
theError = -1;
goto errexit;
}
-done:
+done:
RESTORE_DENORMALS
AUTRACE(kCATrace_AUBaseRenderEnd, mComponentInstance, (intptr_t)this, theError, ioActionFlags, CATrace::ablData(ioData));
-
+
return theError;
-
+
Uninitialized: theError = kAudioUnitErr_Uninitialized; goto errexit;
ParamErr: theError = kAudio_ParamError; goto errexit;
TooManyFrames: theError = kAudioUnitErr_TooManyFramesToProcess; goto errexit;
@@ -1636,25 +1636,25 @@ OSStatus AUBase::DoProcessMultiple ( AudioUnitRenderActionFlags & ioActionFlags
{
OSStatus theError;
DISABLE_DENORMALS
-
+
try {
-
+
if (!(ioActionFlags & (1 << 9)/*kAudioUnitRenderAction_DoNotCheckRenderArgs*/)) {
ca_require(IsInitialized(), Uninitialized);
ca_require(inFramesToProcess <= mMaxFramesPerSlice, TooManyFrames);
ca_require (!UsesFixedBlockSize() || inFramesToProcess == GetMaxFramesPerSlice(), ParamErr);
-
+
for (unsigned ibl = 0; ibl < inNumberInputBufferLists; ++ibl) {
if (inInputBufferLists[ibl] != NULL) {
AUInputElement *input = GetInput(ibl); // will throw if non-existant
unsigned expectedBufferByteSize = inFramesToProcess * input->GetStreamFormat().mBytesPerFrame;
-
+
if (input->GetStreamFormat().NumberChannelStreams() != inInputBufferLists[ibl]->mNumberBuffers) {
DebugMessageN5("%s:%d inInputBufferLists[%u]->mNumberBuffers=%u, input->GetStreamFormat().NumberChannelStreams()=%u; kAudio_ParamError",
__FILE__, __LINE__, ibl, (unsigned)inInputBufferLists[ibl]->mNumberBuffers, (unsigned)input->GetStreamFormat().NumberChannelStreams());
goto ParamErr;
}
-
+
for (unsigned ibuf = 0; ibuf < inInputBufferLists[ibl]->mNumberBuffers; ++ibuf) {
const AudioBuffer &buf = inInputBufferLists[ibl]->mBuffers[ibuf];
if (buf.mData != NULL) {
@@ -1673,7 +1673,7 @@ OSStatus AUBase::DoProcessMultiple ( AudioUnitRenderActionFlags & ioActionFlags
// skip NULL input audio buffer list
}
}
-
+
for (unsigned obl = 0; obl < inNumberOutputBufferLists; ++obl) {
if (ioOutputBufferLists[obl] != NULL) {
AUOutputElement *output = GetOutput(obl); // will throw if non-existant
@@ -1684,7 +1684,7 @@ OSStatus AUBase::DoProcessMultiple ( AudioUnitRenderActionFlags & ioActionFlags
__FILE__, __LINE__, obl, (unsigned)ioOutputBufferLists[obl]->mNumberBuffers, (unsigned)output->GetStreamFormat().NumberChannelStreams());
goto ParamErr;
}
-
+
for (unsigned obuf = 0; obuf < ioOutputBufferLists[obl]->mNumberBuffers; ++obuf) {
AudioBuffer &buf = ioOutputBufferLists[obl]->mBuffers[obuf];
if (buf.mData != NULL) {
@@ -1708,7 +1708,7 @@ OSStatus AUBase::DoProcessMultiple ( AudioUnitRenderActionFlags & ioActionFlags
}
}
}
-
+
if (WantsRenderThreadID())
{
#if TARGET_OS_MAC
@@ -1717,7 +1717,7 @@ OSStatus AUBase::DoProcessMultiple ( AudioUnitRenderActionFlags & ioActionFlags
mRenderThreadID = GetCurrentThreadId();
#endif
}
-
+
if (NeedsToRender (inTimeStamp)) {
theError = ProcessMultipleBufferLists (ioActionFlags, inFramesToProcess, inNumberInputBufferLists, inInputBufferLists, inNumberOutputBufferLists, ioOutputBufferLists);
} else
@@ -1731,11 +1731,11 @@ OSStatus AUBase::DoProcessMultiple ( AudioUnitRenderActionFlags & ioActionFlags
theError = -1;
goto errexit;
}
-done:
+done:
RESTORE_DENORMALS
-
+
return theError;
-
+
Uninitialized: theError = kAudioUnitErr_Uninitialized; goto errexit;
ParamErr: theError = kAudio_ParamError; goto errexit;
TooManyFrames: theError = kAudioUnitErr_TooManyFramesToProcess; goto errexit;
@@ -1748,15 +1748,15 @@ errexit:
//_____________________________________________________________________________
//
OSStatus AUBase::SetInputCallback( UInt32 inPropertyID,
- AudioUnitElement inElement,
+ AudioUnitElement inElement,
AURenderCallback inProc,
void * inRefCon)
{
AUInputElement *input = GetInput(inElement); // may throw
-
+
input->SetInputCallback(inProc, inRefCon);
PropertyChanged(inPropertyID, kAudioUnitScope_Input, inElement);
-
+
return noErr;
}
@@ -1767,7 +1767,7 @@ OSStatus AUBase::SetConnection( const AudioUnitConnection & inConnection)
OSStatus err;
AUInputElement *input = GetInput(inConnection.destInputNumber); // may throw
-
+
if (inConnection.sourceAudioUnit) {
// connecting, not disconnecting
CAStreamBasicDescription sourceDesc;
@@ -1779,19 +1779,19 @@ OSStatus AUBase::SetConnection( const AudioUnitConnection & inConnection)
inConnection.sourceOutputNumber,
&sourceDesc,
&size), errexit);
- ca_require_noerr(err = DispatchSetProperty (kAudioUnitProperty_StreamFormat,
- kAudioUnitScope_Input, inConnection.destInputNumber,
+ ca_require_noerr(err = DispatchSetProperty (kAudioUnitProperty_StreamFormat,
+ kAudioUnitScope_Input, inConnection.destInputNumber,
&sourceDesc, sizeof(CAStreamBasicDescription)), errexit);
}
input->SetConnection(inConnection);
-
+
PropertyChanged(kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, inConnection.destInputNumber);
return noErr;
errexit:
return err;
}
-
+
//_____________________________________________________________________________
//
UInt32 AUBase::SupportedNumChannels ( const AUChannelInfo** outInfo)
@@ -1838,7 +1838,7 @@ const CAStreamBasicDescription &
{
//#warning "aliasing of global scope format should be pushed to subclasses"
AUIOElement *element;
-
+
switch (inScope) {
case kAudioUnitScope_Input:
element = Inputs().GetIOElement(inElement);
@@ -1858,9 +1858,9 @@ const CAStreamBasicDescription &
OSStatus AUBase::SetBusCount( AudioUnitScope inScope,
UInt32 inCount)
{
- if (IsInitialized())
+ if (IsInitialized())
return kAudioUnitErr_Initialized;
-
+
GetScope(inScope).SetNumberOfElements(inCount);
return noErr;
}
@@ -1874,7 +1874,7 @@ OSStatus AUBase::ChangeStreamFormat( AudioUnitScope inScope,
{
//#warning "aliasing of global scope format should be pushed to subclasses"
AUIOElement *element;
-
+
switch (inScope) {
case kAudioUnitScope_Input:
element = Inputs().GetIOElement(inElement);
@@ -1921,7 +1921,7 @@ OSStatus AUBase::RemoveAudioChannelLayout( AudioUnitScope inScope,
return result;
}
-OSStatus AUBase::SetAudioChannelLayout( AudioUnitScope inScope,
+OSStatus AUBase::SetAudioChannelLayout( AudioUnitScope inScope,
AudioUnitElement inElement,
const AudioChannelLayout * inLayout)
{
@@ -1946,7 +1946,7 @@ OSStatus AUBase::SetAudioChannelLayout( AudioUnitScope inScope,
}
}
free(tags);
-
+
if (foundTag == false)
return kAudioUnitErr_InvalidPropertyValue;
@@ -1966,7 +1966,7 @@ OSStatus AUBase::SaveState( CFPropertyListRef * outData)
{
AudioComponentDescription desc = GetComponentDescription();
- CFMutableDictionaryRef dict = CFDictionaryCreateMutable (NULL, 0,
+ CFMutableDictionaryRef dict = CFDictionaryCreateMutable (NULL, 0,
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
// first step -> save the version to the data ref
@@ -1979,24 +1979,24 @@ OSStatus AUBase::SaveState( CFPropertyListRef * outData)
value = desc.componentSubType;
AddNumToDictionary (dict, kSubtypeString, value);
-
+
value = desc.componentManufacturer;
AddNumToDictionary (dict, kManufacturerString, value);
-
+
// fourth step -> save the state of all parameters on all scopes and elements
CFMutableDataRef data = CFDataCreateMutable(NULL, 0);
for (AudioUnitScope iscope = 0; iscope < 3; ++iscope) {
AUScope &scope = GetScope(iscope);
scope.SaveState (data);
}
-
+
SaveExtendedScopes(data);
// save all this in the data section of the dictionary
CFDictionarySetValue(dict, kDataString, data);
CFRelease (data);
-
-//OK - now we're going to do some properties
+
+//OK - now we're going to do some properties
//save the preset name...
CFDictionarySetValue (dict, kNameString, mCurrentPreset.presetName);
@@ -2006,44 +2006,44 @@ OSStatus AUBase::SaveState( CFPropertyListRef * outData)
kAudioUnitScope_Global,
0,
&value);
-
+
if (result == noErr) {
AddNumToDictionary (dict, kRenderQualityString, value);
}
-
+
// Does the unit support the CPULoad Quality property - if so, save it...
Float32 cpuLoad;
result = DispatchGetProperty (6/*kAudioUnitProperty_CPULoad*/,
kAudioUnitScope_Global,
0,
&cpuLoad);
-
+
if (result == noErr) {
CFNumberRef num = CFNumberCreate (NULL, kCFNumberFloatType, &cpuLoad);
CFDictionarySetValue (dict, kCPULoadString, num);
CFRelease (num);
}
-// Do we have any element names for any of our scopes?
+// Do we have any element names for any of our scopes?
// first check to see if we have any names...
bool foundName = false;
for (AudioUnitScope i = 0; i < kNumScopes; ++i) {
foundName = GetScope (i).HasElementWithName();
- if (foundName)
+ if (foundName)
break;
}
// OK - we found a name away we go...
if (foundName) {
- CFMutableDictionaryRef nameDict = CFDictionaryCreateMutable (NULL, 0,
+ CFMutableDictionaryRef nameDict = CFDictionaryCreateMutable (NULL, 0,
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
for (AudioUnitScope i = 0; i < kNumScopes; ++i) {
GetScope (i).AddElementNamesToDict (nameDict);
}
-
+
CFDictionarySetValue (dict, kElementNameString, nameDict);
CFRelease (nameDict);
}
-
+
// we're done!!!
*outData = dict;
@@ -2055,16 +2055,16 @@ OSStatus AUBase::SaveState( CFPropertyListRef * outData)
OSStatus AUBase::RestoreState( CFPropertyListRef plist)
{
if (CFGetTypeID(plist) != CFDictionaryGetTypeID()) return kAudioUnitErr_InvalidPropertyValue;
-
+
AudioComponentDescription desc = GetComponentDescription();
-
+
CFDictionaryRef dict = static_cast<CFDictionaryRef>(plist);
// zeroeth step - make sure the Part key is NOT present, as this method is used
-// to restore the GLOBAL state of the dictionary
+// to restore the GLOBAL state of the dictionary
if (CFDictionaryContainsKey (dict, kPartString))
return kAudioUnitErr_InvalidPropertyValue;
-
+
// first step -> check the saved version in the data ref
// at this point we're only dealing with version==0
CFNumberRef cfnum = reinterpret_cast<CFNumberRef>(CFDictionaryGetValue (dict, kVersionString));
@@ -2087,22 +2087,22 @@ OSStatus AUBase::RestoreState( CFPropertyListRef plist)
CFNumberGetValue (cfnum, kCFNumberSInt32Type, &value);
if (UInt32(value) != desc.componentManufacturer) return kAudioUnitErr_InvalidPropertyValue;
-// fourth step -> restore the state of all of the parameters for each scope and element
+// fourth step -> restore the state of all of the parameters for each scope and element
CFDataRef data = reinterpret_cast<CFDataRef>(CFDictionaryGetValue (dict, kDataString));
- if (data != NULL)
+ if (data != NULL)
{
const UInt8 *p, *pend;
-
+
p = CFDataGetBytePtr(data);
pend = p + CFDataGetLength(data);
-
+
// we have a zero length data, which may just mean there were no parameters to save!
- // if (p >= pend) return noErr;
-
+ // if (p >= pend) return noErr;
+
while (p < pend) {
UInt32 scopeIdx = CFSwapInt32BigToHost(*(UInt32 *)p);
p += sizeof(UInt32);
-
+
AUScope &scope = GetScope(scopeIdx);
p = scope.RestoreState(p);
}
@@ -2116,12 +2116,12 @@ OSStatus AUBase::RestoreState( CFPropertyListRef plist)
{
mCurrentPreset.presetName = name;
mCurrentPreset.presetNumber = -1;
- }
+ }
else { // no name entry make the default one
mCurrentPreset.presetName = kUntitledString;
mCurrentPreset.presetNumber = -1;
}
-
+
CFRetain (mCurrentPreset.presetName);
#if !CA_USE_AUDIO_PLUGIN_ONLY
#ifndef __LP64__
@@ -2130,8 +2130,8 @@ OSStatus AUBase::RestoreState( CFPropertyListRef plist)
#endif
PropertyChanged(kAudioUnitProperty_PresentPreset, kAudioUnitScope_Global, 0);
-// Does the dict contain render quality information?
- if (CFDictionaryGetValueIfPresent (dict, kRenderQualityString, reinterpret_cast<const void**>(&cfnum)))
+// Does the dict contain render quality information?
+ if (CFDictionaryGetValueIfPresent (dict, kRenderQualityString, reinterpret_cast<const void**>(&cfnum)))
{
CFNumberGetValue (cfnum, kCFNumberSInt32Type, &value);
DispatchSetProperty (kAudioUnitProperty_RenderQuality,
@@ -2140,9 +2140,9 @@ OSStatus AUBase::RestoreState( CFPropertyListRef plist)
&value,
sizeof(value));
}
-
+
// Does the unit support the CPULoad Quality property - if so, save it...
- if (CFDictionaryGetValueIfPresent (dict, kCPULoadString, reinterpret_cast<const void**>(&cfnum)))
+ if (CFDictionaryGetValueIfPresent (dict, kCPULoadString, reinterpret_cast<const void**>(&cfnum)))
{
Float32 floatValue;
CFNumberGetValue (cfnum, kCFNumberFloatType, &floatValue);
@@ -2155,24 +2155,24 @@ OSStatus AUBase::RestoreState( CFPropertyListRef plist)
// Do we have any element names for any of our scopes?
CFDictionaryRef nameDict;
- if (CFDictionaryGetValueIfPresent (dict, kElementNameString, reinterpret_cast<const void**>(&nameDict)))
+ if (CFDictionaryGetValueIfPresent (dict, kElementNameString, reinterpret_cast<const void**>(&nameDict)))
{
char string[64];
- for (int i = 0; i < kNumScopes; ++i)
+ for (int i = 0; i < kNumScopes; ++i)
{
snprintf (string, sizeof(string), "%d", i);
CFStringRef key = CFStringCreateWithCString (NULL, string, kCFStringEncodingASCII);
CFDictionaryRef elementDict;
- if (CFDictionaryGetValueIfPresent (nameDict, key, reinterpret_cast<const void**>(&elementDict)))
+ if (CFDictionaryGetValueIfPresent (nameDict, key, reinterpret_cast<const void**>(&elementDict)))
{
bool didAddElements = GetScope (i).RestoreElementNames (elementDict);
if (didAddElements)
PropertyChanged (kAudioUnitProperty_ElementCount, i, 0);
}
- CFRelease (key);
+ CFRelease (key);
}
}
-
+
return noErr;
}
@@ -2206,18 +2206,18 @@ bool AUBase::SetAFactoryPresetAsCurrent (const AUPreset & inPreset)
}
#if !CA_USE_AUDIO_PLUGIN_ONLY
-int AUBase::GetNumCustomUIComponents ()
+int AUBase::GetNumCustomUIComponents ()
{
return 0;
}
void AUBase::GetUIComponentDescs (ComponentDescription* inDescArray) {}
#endif
-
-bool AUBase::HasIcon ()
+
+bool AUBase::HasIcon ()
{
#if !CA_NO_AU_UI_FEATURES
- CFURLRef url = CopyIconLocation();
+ CFURLRef url = CopyIconLocation();
if (url) {
CFRelease (url);
return true;
@@ -2226,11 +2226,11 @@ bool AUBase::HasIcon ()
return false;
}
-CFURLRef AUBase::CopyIconLocation ()
+CFURLRef AUBase::CopyIconLocation ()
{
return NULL;
}
-
+
//_____________________________________________________________________________
//
OSStatus AUBase::GetParameterList( AudioUnitScope inScope,
@@ -2240,7 +2240,7 @@ OSStatus AUBase::GetParameterList( AudioUnitScope inScope,
AUScope &scope = GetScope(inScope);
AUElement *elementWithMostParameters = NULL;
UInt32 maxNumParams = 0;
-
+
int nElems = scope.GetNumberOfElements();
for (int ielem = 0; ielem < nElems; ++ielem) {
AUElement *element = scope.GetElement(ielem);
@@ -2250,10 +2250,10 @@ OSStatus AUBase::GetParameterList( AudioUnitScope inScope,
elementWithMostParameters = element;
}
}
-
+
if (outParameterList != NULL && elementWithMostParameters != NULL)
elementWithMostParameters->GetParameterList(outParameterList);
-
+
outNumParameters = maxNumParams;
return noErr;
}
@@ -2289,8 +2289,8 @@ OSStatus AUBase::GetParameterHistoryInfo( AudioUnitScope inScope,
//_____________________________________________________________________________
//
-OSStatus AUBase::CopyClumpName( AudioUnitScope inScope,
- UInt32 inClumpID,
+OSStatus AUBase::CopyClumpName( AudioUnitScope inScope,
+ UInt32 inClumpID,
UInt32 inDesiredNameLength,
CFStringRef * outClumpName)
{
@@ -2328,7 +2328,7 @@ AUElement * AUBase::CreateElement( AudioUnitScope scope,
#endif
}
COMPONENT_THROW(kAudioUnitErr_InvalidScope);
-
+
return NULL; // get rid of compiler warning
}
@@ -2374,9 +2374,9 @@ const Float64 AUBase::kNoLastRenderedSampleTime = -1.;
char* AUBase::GetLoggingString () const
{
if (mLogString) return mLogString;
-
+
AudioComponentDescription desc = GetComponentDescription();
-
+
const size_t logStringSize = 256;
const_cast<AUBase*>(this)->mLogString = new char[logStringSize];
char str[24];
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h
index 0c78221..8cc600f 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h
@@ -2,14 +2,14 @@
File: AUBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUBase_h__
#define __AUBase_h__
@@ -81,7 +81,7 @@
#ifndef AUTRACE
#define AUTRACE(code, obj, a, b, c, d)
-#endif
+#endif
#include "AUPlugInDispatch.h"
@@ -92,11 +92,11 @@
#define kAUDefaultSampleRate 44100.0
#if !TARGET_OS_WIN32
-#define kAUDefaultMaxFramesPerSlice 1156
+#define kAUDefaultMaxFramesPerSlice 1156
//this allows enough default frames for a 512 dest 44K and SRC from 96K
// add a padding of 4 frames for any altivec rounding
#else
-#define kAUDefaultMaxFramesPerSlice 2048
+#define kAUDefaultMaxFramesPerSlice 2048
#endif
// ________________________________________________________________________
@@ -106,16 +106,16 @@ class AUBase : public ComponentBase {
public:
/*! @ctor AUBase */
- AUBase( AudioComponentInstance inInstance,
+ AUBase( AudioComponentInstance inInstance,
UInt32 numInputElements,
UInt32 numOutputElements,
UInt32 numGroupElements = 0);
/*! @dtor AUBase */
virtual ~AUBase();
-
+
/*! @method PostConstructor */
virtual void PostConstructor() { CreateElements(); }
-
+
/*! @method PreDestructor */
virtual void PreDestructor();
@@ -133,7 +133,7 @@ public:
// ________________________________________________________________________
// Virtual methods (mostly) directly corresponding to the entry points. Many of these
// have useful implementations here and will not need overriding.
-
+
/*! @method DoInitialize */
OSStatus DoInitialize();
// this implements the entry point and makes sure that initialization
@@ -143,16 +143,16 @@ public:
virtual OSStatus Initialize();
// ... so that overrides to this method can assume that they will only
// be called exactly once.
-
+
/*! @method IsInitialized */
bool IsInitialized() const { return mInitialized; }
/*! @method HasBegunInitializing */
bool HasBegunInitializing() const { return mHasBegunInitializing; }
-
+
/*! @method DoCleanup */
void DoCleanup();
// same pattern as with Initialize
-
+
/*! @method Cleanup */
virtual void Cleanup();
@@ -161,7 +161,7 @@ public:
AudioUnitElement inElement);
// Note about GetPropertyInfo, GetProperty, SetProperty:
- // Certain properties are trapped out in these dispatch functions and handled with different virtual
+ // Certain properties are trapped out in these dispatch functions and handled with different virtual
// methods. (To discourage hacks and keep vtable size down, these are non-virtual)
/*! @method DispatchGetPropertyInfo */
@@ -183,7 +183,7 @@ public:
AudioUnitElement inElement,
const void * inData,
UInt32 inDataSize);
-
+
OSStatus DispatchRemovePropertyValue( AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement);
@@ -207,7 +207,7 @@ public:
AudioUnitElement inElement,
const void * inData,
UInt32 inDataSize);
-
+
/*! @method ClearPropertyUsage */
virtual OSStatus RemovePropertyValue ( AudioUnitPropertyID inID,
AudioUnitScope inScope,
@@ -217,28 +217,28 @@ public:
virtual OSStatus AddPropertyListener( AudioUnitPropertyID inID,
AudioUnitPropertyListenerProc inProc,
void * inProcRefCon);
-
+
/*! @method RemovePropertyListener */
virtual OSStatus RemovePropertyListener( AudioUnitPropertyID inID,
AudioUnitPropertyListenerProc inProc,
void * inProcRefCon,
bool refConSpecified);
-
+
/*! @method SetRenderNotification */
virtual OSStatus SetRenderNotification( AURenderCallback inProc,
void * inRefCon);
-
+
/*! @method RemoveRenderNotification */
virtual OSStatus RemoveRenderNotification(
AURenderCallback inProc,
void * inRefCon);
-
+
/*! @method GetParameter */
virtual OSStatus GetParameter( AudioUnitParameterID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
AudioUnitParameterValue & outValue);
-
+
/*! @method SetParameter */
virtual OSStatus SetParameter( AudioUnitParameterID inID,
AudioUnitScope inScope,
@@ -252,7 +252,7 @@ public:
/*! @method ScheduleParameter */
virtual OSStatus ScheduleParameter ( const AudioUnitParameterEvent *inParameterEvent,
UInt32 inNumEvents);
-
+
/*! @method DoRender */
OSStatus DoRender( AudioUnitRenderActionFlags & ioActionFlags,
@@ -260,14 +260,14 @@ public:
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList & ioData);
-
+
/*! @method Process */
OSStatus DoProcess ( AudioUnitRenderActionFlags & ioActionFlags,
const AudioTimeStamp & inTimeStamp,
UInt32 inFramesToProcess,
AudioBufferList & ioData);
-
+
/*! @method ProcessMultiple */
OSStatus DoProcessMultiple ( AudioUnitRenderActionFlags & ioActionFlags,
const AudioTimeStamp & inTimeStamp,
@@ -276,7 +276,7 @@ public:
const AudioBufferList ** inInputBufferLists,
UInt32 inNumberOutputBufferLists,
AudioBufferList ** ioOutputBufferLists);
-
+
/*! @method ProcessBufferLists */
virtual OSStatus ProcessBufferLists( AudioUnitRenderActionFlags & ioActionFlags,
const AudioBufferList & inBuffer,
@@ -288,26 +288,26 @@ public:
/*! @method ProcessMultipleBufferLists */
virtual OSStatus ProcessMultipleBufferLists( AudioUnitRenderActionFlags & ioActionFlags,
- UInt32 inFramesToProcess,
+ UInt32 inFramesToProcess,
UInt32 inNumberInputBufferLists,
const AudioBufferList ** inInputBufferLists,
UInt32 inNumberOutputBufferLists,
- AudioBufferList ** ioOutputBufferLists)
+ AudioBufferList ** ioOutputBufferLists)
{
return kAudio_UnimplementedError;
}
-
+
/*! @method ComplexRender */
- virtual OSStatus ComplexRender( AudioUnitRenderActionFlags & ioActionFlags,
- const AudioTimeStamp & inTimeStamp,
- UInt32 inOutputBusNumber,
- UInt32 inNumberOfPackets,
- UInt32 * outNumberOfPackets,
- AudioStreamPacketDescription * outPacketDescriptions,
- AudioBufferList & ioData,
- void * outMetadata,
- UInt32 * outMetadataByteSize)
- {
+ virtual OSStatus ComplexRender( AudioUnitRenderActionFlags & ioActionFlags,
+ const AudioTimeStamp & inTimeStamp,
+ UInt32 inOutputBusNumber,
+ UInt32 inNumberOfPackets,
+ UInt32 * outNumberOfPackets,
+ AudioStreamPacketDescription * outPacketDescriptions,
+ AudioBufferList & ioData,
+ void * outMetadata,
+ UInt32 * outMetadataByteSize)
+ {
return kAudio_UnimplementedError;
}
@@ -316,7 +316,7 @@ public:
// Otherwise, override Render().
//
// N.B. Implementations of this method can assume that the output's buffer list has already been
- // prepared and access it with GetOutput(inBusNumber)->GetBufferList() instead of
+ // prepared and access it with GetOutput(inBusNumber)->GetBufferList() instead of
// GetOutput(inBusNumber)->PrepareBuffer(nFrames) -- if PrepareBuffer is called, a
// copy may occur after rendering.
/*! @method RenderBus */
@@ -331,7 +331,7 @@ public:
}
// N.B. For a unit with only one output bus, it can assume in its implementation of this
- // method that the output's buffer list has already been prepared and access it with
+ // method that the output's buffer list has already been prepared and access it with
// GetOutput(0)->GetBufferList() instead of GetOutput(0)->PrepareBuffer(nFrames)
// -- if PrepareBuffer is called, a copy may occur after rendering.
/*! @method Render */
@@ -342,7 +342,7 @@ public:
return noErr;
}
-
+
#pragma mark -
#pragma mark Property Dispatch
@@ -361,10 +361,10 @@ public:
/*! @method SetConnection */
virtual OSStatus SetConnection( const AudioUnitConnection & inConnection);
-
+
/*! @method SetInputCallback */
virtual OSStatus SetInputCallback( UInt32 inPropertyID,
- AudioUnitElement inElement,
+ AudioUnitElement inElement,
AURenderCallback inProc,
void * inRefCon);
@@ -386,7 +386,7 @@ public:
/*! @method SaveState */
virtual OSStatus SaveState( CFPropertyListRef * outData);
-
+
/*! @method SaveExtendedScopes */
virtual void SaveExtendedScopes( CFMutableDataRef outData) {};
@@ -399,8 +399,8 @@ public:
CFArrayRef * outStrings);
/*! @method CopyClumpName */
- virtual OSStatus CopyClumpName( AudioUnitScope inScope,
- UInt32 inClumpID,
+ virtual OSStatus CopyClumpName( AudioUnitScope inScope,
+ UInt32 inClumpID,
UInt32 inDesiredNameLength,
CFStringRef * outClumpName);
@@ -411,14 +411,14 @@ public:
// and the name should be valid, or the preset WON'T take
/*! @method SetAFactoryPresetAsCurrent */
bool SetAFactoryPresetAsCurrent (const AUPreset & inPreset);
-
+
// Called when someone sets a new, valid preset
// If this is a valid preset, then the subclass sets its state to that preset
// and returns noErr.
// If not a valid preset, return an error, and the pre-existing preset is restored
/*! @method NewFactoryPresetSet */
virtual OSStatus NewFactoryPresetSet (const AUPreset & inNewFactoryPreset);
-
+
/*! @method NewCustomPresetSet */
virtual OSStatus NewCustomPresetSet (const AUPreset & inNewCustomPreset);
@@ -429,10 +429,10 @@ public:
/*! @method GetUIComponentDescs */
virtual void GetUIComponentDescs (ComponentDescription* inDescArray);
#endif
-
+
/*! @method CopyIconLocation */
virtual CFURLRef CopyIconLocation ();
-
+
// default is no latency, and unimplemented tail time
/*! @method GetLatency */
virtual Float64 GetLatency() {return 0.0;}
@@ -444,18 +444,18 @@ public:
/*! @method IsStreamFormatWritable */
bool IsStreamFormatWritable( AudioUnitScope scope,
AudioUnitElement element);
-
+
/*! @method StreamFormatWritable */
virtual bool StreamFormatWritable( AudioUnitScope scope,
AudioUnitElement element) = 0;
// scope will always be input or output
-
+
// pass in a pointer to get the struct, and num channel infos
// you can pass in NULL to just get the number
// a return value of 0 (the default in AUBase) means the property is not supported...
/*! @method SupportedNumChannels */
virtual UInt32 SupportedNumChannels ( const AUChannelInfo** outInfo);
-
+
/*! @method ValidFormat */
virtual bool ValidFormat( AudioUnitScope inScope,
AudioUnitElement inElement,
@@ -466,7 +466,7 @@ public:
// native-endian 32-bit float, any sample rate,
// any number of channels; override when other
// formats are supported. A subclass's override can
- // choose to always return true and trap invalid
+ // choose to always return true and trap invalid
// formats in ChangeStreamFormat.
@@ -489,7 +489,7 @@ public:
const CAStreamBasicDescription & inNewFormat);
// Will only be called after StreamFormatWritable
// and ValidFormat have succeeded.
-
+
// ________________________________________________________________________
#if !CA_USE_AUDIO_PLUGIN_ONLY
@@ -500,7 +500,7 @@ public:
// ________________________________________________________________________
// Methods useful for subclasses
-
+
/*! @method GetScope */
AUScope & GetScope( AudioUnitScope inScope)
{
@@ -511,10 +511,10 @@ public:
}
return mScopes[inScope];
}
-
+
/*! @method GetScopeExtended */
virtual AUScope * GetScopeExtended (AudioUnitScope inScope) { return NULL; }
-
+
/*! @method GlobalScope */
AUScope & GlobalScope() { return mScopes[kAudioUnitScope_Global]; }
/*! @method Inputs */
@@ -527,7 +527,7 @@ public:
#endif
/*! @method Globals */
AUElement * Globals() { return mScopes[kAudioUnitScope_Global].GetElement(0); }
-
+
/*! @method SetNumberOfElements */
void SetNumberOfElements( AudioUnitScope inScope,
UInt32 numElements);
@@ -538,14 +538,14 @@ public:
{
return GetScope(inScope).GetElement(inElement);
}
-
+
/*! @method GetIOElement */
AUIOElement * GetIOElement( AudioUnitScope inScope,
AudioUnitElement inElement)
{
return GetScope(inScope).GetIOElement(inElement);
}
-
+
/*! @method SafeGetElement */
AUElement * SafeGetElement( AudioUnitScope inScope,
AudioUnitElement inElement)
@@ -558,13 +558,13 @@ public:
{
return static_cast<AUInputElement *>(Inputs().SafeGetElement(inElement));
}
-
+
/*! @method GetOutput */
AUOutputElement * GetOutput( AudioUnitElement inElement)
{
return static_cast<AUOutputElement *>(Outputs().SafeGetElement(inElement));
}
-
+
#if !CA_BASIC_AU_FEATURES
/*! @method GetGroup */
AUElement * GetGroup( AudioUnitElement inElement)
@@ -572,7 +572,7 @@ public:
return Groups().SafeGetElement(inElement);
}
#endif
-
+
/*! @method PullInput */
OSStatus PullInput( UInt32 inBusNumber,
AudioUnitRenderActionFlags &ioActionFlags,
@@ -589,7 +589,7 @@ public:
bool UsesFixedBlockSize() const { return mUsesFixedBlockSize; }
/*! @method SetUsesFixedBlockSize */
void SetUsesFixedBlockSize(bool inUsesFixedBlockSize) { mUsesFixedBlockSize = inUsesFixedBlockSize; }
-
+
/*! @method GetVectorUnitType */
static SInt32 GetVectorUnitType() { return sVectorUnitType; }
/*! @method HasVectorUnit */
@@ -600,12 +600,12 @@ public:
static bool HasSSE2() { return sVectorUnitType >= kVecSSE2; }
/*! @method HasSSE3 */
static bool HasSSE3() { return sVectorUnitType >= kVecSSE3; }
-
+
/*! @method AudioUnitAPIVersion */
UInt8 AudioUnitAPIVersion() const { return mAudioUnitAPIVersion; }
-
+
/*! @method IsRenderThread */
- bool InRenderThread () const
+ bool InRenderThread () const
{
#if TARGET_OS_MAC
return (mRenderThreadID ? pthread_equal (mRenderThreadID, pthread_self()) : false);
@@ -623,7 +623,7 @@ public:
/*! @method PropertyChanged */
virtual void PropertyChanged( AudioUnitPropertyID inID,
- AudioUnitScope inScope,
+ AudioUnitScope inScope,
AudioUnitElement inElement);
#if !CA_NO_AU_UI_FEATURES
@@ -634,12 +634,12 @@ public:
// as this can save work in the host.
/*! @method CallHostBeatAndTempo */
- OSStatus CallHostBeatAndTempo (Float64 *outCurrentBeat,
+ OSStatus CallHostBeatAndTempo (Float64 *outCurrentBeat,
Float64 *outCurrentTempo)
{
- return (mHostCallbackInfo.beatAndTempoProc
- ? (*mHostCallbackInfo.beatAndTempoProc) (mHostCallbackInfo.hostUserData,
- outCurrentBeat,
+ return (mHostCallbackInfo.beatAndTempoProc
+ ? (*mHostCallbackInfo.beatAndTempoProc) (mHostCallbackInfo.hostUserData,
+ outCurrentBeat,
outCurrentTempo)
: -1);
}
@@ -650,14 +650,14 @@ public:
UInt32 *outTimeSig_Denominator,
Float64 *outCurrentMeasureDownBeat)
{
- return (mHostCallbackInfo.musicalTimeLocationProc
+ return (mHostCallbackInfo.musicalTimeLocationProc
? (*mHostCallbackInfo.musicalTimeLocationProc) (mHostCallbackInfo.hostUserData,
outDeltaSampleOffsetToNextBeat,
outTimeSig_Numerator,
outTimeSig_Denominator,
outCurrentMeasureDownBeat)
: -1);
- }
+ }
/*! @method CallHostTransportState */
OSStatus CallHostTransportState (Boolean *outIsPlaying,
@@ -667,7 +667,7 @@ public:
Float64 *outCycleStartBeat,
Float64 *outCycleEndBeat)
{
- return (mHostCallbackInfo.transportStateProc
+ return (mHostCallbackInfo.transportStateProc
? (*mHostCallbackInfo.transportStateProc) (mHostCallbackInfo.hostUserData,
outIsPlaying,
outTransportStateChanged,
@@ -680,7 +680,7 @@ public:
#endif
char* GetLoggingString () const;
-
+
CAMutex* GetMutex() { return mAUMutex; }
// ________________________________________________________________________
@@ -698,7 +698,7 @@ public:
virtual OSStatus Start() { return kAudio_UnimplementedError; }
/*! @method Stop */
virtual OSStatus Stop() { return kAudio_UnimplementedError; }
-
+
#if !CA_BASIC_AU_FEATURES
#pragma mark -
#pragma mark AU Music Base Dispatch
@@ -711,38 +711,38 @@ public:
/*! @method PrepareInstrument */
virtual OSStatus ReleaseInstrument(MusicDeviceInstrumentID inInstrument) { return kAudio_UnimplementedError; }
#endif
-
+
// ________________________________________________________________________
// ________________________________________________________________________
// ________________________________________________________________________
// music device/music effect methods -- incomplete
/*! @method MIDIEvent */
- virtual OSStatus MIDIEvent( UInt32 inStatus,
- UInt32 inData1,
- UInt32 inData2,
+ virtual OSStatus MIDIEvent( UInt32 inStatus,
+ UInt32 inData1,
+ UInt32 inData2,
UInt32 inOffsetSampleFrame) { return kAudio_UnimplementedError; }
/*! @method SysEx */
- virtual OSStatus SysEx( const UInt8 * inData,
+ virtual OSStatus SysEx( const UInt8 * inData,
UInt32 inLength) { return kAudio_UnimplementedError;}
-
+
/*! @method StartNote */
- virtual OSStatus StartNote( MusicDeviceInstrumentID inInstrument,
- MusicDeviceGroupID inGroupID,
- NoteInstanceID * outNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+ virtual OSStatus StartNote( MusicDeviceInstrumentID inInstrument,
+ MusicDeviceGroupID inGroupID,
+ NoteInstanceID * outNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams) { return kAudio_UnimplementedError; }
/*! @method StopNote */
- virtual OSStatus StopNote( MusicDeviceGroupID inGroupID,
- NoteInstanceID inNoteInstanceID,
+ virtual OSStatus StopNote( MusicDeviceGroupID inGroupID,
+ NoteInstanceID inNoteInstanceID,
UInt32 inOffsetSampleFrame) { return kAudio_UnimplementedError; }
#endif
// ________________________________________________________________________
// ________________________________________________________________________
// ________________________________________________________________________
-
+
protected:
#pragma mark -
#pragma mark Implementation methods
@@ -751,7 +751,7 @@ protected:
virtual void ReallocateBuffers();
// needs to be called when mMaxFramesPerSlice changes
virtual void DeallocateIOBuffers();
-
+
/*! @method FillInParameterName */
static void FillInParameterName (AudioUnitParameterInfo& ioInfo, CFStringRef inName, bool inShouldRelease)
{
@@ -761,25 +761,25 @@ protected:
ioInfo.flags |= kAudioUnitParameterFlag_CFNameRelease;
CFStringGetCString (inName, ioInfo.name, offsetof (AudioUnitParameterInfo, clumpID), kCFStringEncodingUTF8);
}
-
- static void HasClump (AudioUnitParameterInfo& ioInfo, UInt32 inClumpID)
+
+ static void HasClump (AudioUnitParameterInfo& ioInfo, UInt32 inClumpID)
{
ioInfo.clumpID = inClumpID;
ioInfo.flags |= kAudioUnitParameterFlag_HasClump;
}
-
+
/*! @method SetMaxFramesPerSlice */
virtual void SetMaxFramesPerSlice(UInt32 nFrames);
/*! @method CanSetMaxFrames */
virtual OSStatus CanSetMaxFrames() const;
-
+
/*! @method WantsRenderThreadID */
bool WantsRenderThreadID () const { return mWantsRenderThreadID; }
-
+
/*! @method SetWantsRenderThreadID */
void SetWantsRenderThreadID (bool inFlag);
-
+
/*! @method SetRenderError */
OSStatus SetRenderError (OSStatus inErr)
{
@@ -789,7 +789,7 @@ protected:
}
return inErr;
}
-
+
private:
/*! @method DoRenderBus */
// shared between Render and RenderSlice, inlined to minimize function call overhead
@@ -829,13 +829,13 @@ private:
memset (&mCurrentRenderTime, 0, sizeof(mCurrentRenderTime));
mCurrentRenderTime.mSampleTime = kNoLastRenderedSampleTime;
}
-
+
protected:
/*! @method GetAudioChannelLayout */
virtual UInt32 GetChannelLayoutTags( AudioUnitScope scope,
AudioUnitElement element,
AudioChannelLayoutTag * outLayoutTags);
-
+
/*! @method GetAudioChannelLayout */
virtual UInt32 GetAudioChannelLayout( AudioUnitScope scope,
AudioUnitElement element,
@@ -843,13 +843,13 @@ protected:
Boolean & outWritable);
/*! @method SetAudioChannelLayout */
- virtual OSStatus SetAudioChannelLayout( AudioUnitScope scope,
+ virtual OSStatus SetAudioChannelLayout( AudioUnitScope scope,
AudioUnitElement element,
const AudioChannelLayout * inLayout);
/*! @method RemoveAudioChannelLayout */
virtual OSStatus RemoveAudioChannelLayout(AudioUnitScope scope, AudioUnitElement element);
-
+
/*! @method NeedsToRender */
bool NeedsToRender( const AudioTimeStamp & inTimeStamp)
{
@@ -858,7 +858,7 @@ protected:
mCurrentRenderTime = inTimeStamp;
return needsToRender;
}
-
+
// Scheduled parameter implementation:
typedef std::vector<AudioUnitParameterEvent> ParameterEventList;
@@ -869,14 +869,14 @@ protected:
// for which the DSP code depends. ProcessForScheduledParams() will call (potentially repeatedly)
// virtual method ProcessScheduledSlice() to perform the actual DSP for a given sub-division of
// the buffer. The job of ProcessForScheduledParams() is to sub-divide the buffer into smaller
- // pieces according to the scheduled times found in the ParameterEventList (usually coming
+ // pieces according to the scheduled times found in the ParameterEventList (usually coming
// directly from a previous call to ScheduleParameter() ), setting the appropriate immediate or
// ramped parameter values for the corresponding scopes and elements, then calling ProcessScheduledSlice()
// to do the actual DSP for each of these divisions.
virtual OSStatus ProcessForScheduledParams( ParameterEventList &inParamList,
UInt32 inFramesToProcess,
void *inUserData );
-
+
// This method is called (potentially repeatedly) by ProcessForScheduledParams()
// in order to perform the actual DSP required for this portion of the entire buffer
// being processed. The entire buffer can be divided up into smaller "slices"
@@ -889,11 +889,11 @@ protected:
UInt32 inStartFrameInBuffer,
UInt32 inSliceFramesToProcess,
UInt32 inTotalBufferFrames ) {return noErr;}; // default impl does nothing...
-
-
+
+
/*! @method CurrentRenderTime */
const AudioTimeStamp & CurrentRenderTime () const { return mCurrentRenderTime; }
-
+
// ________________________________________________________________________
// Private data members to discourage hacking in subclasses
private:
@@ -902,23 +902,23 @@ private:
mRenderNotify(proc),
mRenderNotifyRefCon(ref)
{ }
-
+
AURenderCallback mRenderNotify;
void * mRenderNotifyRefCon;
-
+
bool operator == (const RenderCallback &other) {
return this->mRenderNotify == other.mRenderNotify &&
this->mRenderNotifyRefCon == other.mRenderNotifyRefCon;
}
};
typedef TThreadSafeList<RenderCallback> RenderCallbackList;
-
+
#if !CA_BASIC_AU_FEATURES
enum { kNumScopes = 4 };
#else
enum { kNumScopes = 3 };
#endif
-
+
/*! @var mElementsCreated */
bool mElementsCreated;
protected:
@@ -929,7 +929,7 @@ protected:
private:
/*! @var mAudioUnitAPIVersion */
UInt8 mAudioUnitAPIVersion;
-
+
/*! @var mInitNumInputEls */
const UInt32 mInitNumInputEls;
/*! @var mInitNumOutputEls */
@@ -940,36 +940,36 @@ private:
#endif
/*! @var mScopes */
AUScope mScopes[kNumScopes];
-
+
/*! @var mRenderCallbacks */
RenderCallbackList mRenderCallbacks;
bool mRenderCallbacksTouched;
-
+
/*! @var mRenderThreadID */
#if TARGET_OS_MAC
pthread_t mRenderThreadID;
#elif TARGET_OS_WIN32
UInt32 mRenderThreadID;
#endif
-
+
/*! @var mWantsRenderThreadID */
bool mWantsRenderThreadID;
-
+
/*! @var mCurrentRenderTime */
AudioTimeStamp mCurrentRenderTime;
-
+
/*! @var mMaxFramesPerSlice */
UInt32 mMaxFramesPerSlice;
-
+
/*! @var mLastRenderError */
OSStatus mLastRenderError;
/*! @var mCurrentPreset */
AUPreset mCurrentPreset;
-
+
protected:
/*! @var mUsesFixedBlockSize */
bool mUsesFixedBlockSize;
-
+
struct PropertyListener {
AudioUnitPropertyID propertyID;
AudioUnitPropertyListenerProc listenerProc;
@@ -981,10 +981,10 @@ protected:
ParameterEventList mParamList;
/*! @var mPropertyListeners */
PropertyListeners mPropertyListeners;
-
+
/*! @var mBuffersAllocated */
bool mBuffersAllocated;
-
+
/*! @var mLogString */
// if this is NOT null, it will contain identifying info about this AU.
char* mLogString;
@@ -1012,7 +1012,7 @@ protected:
#endif
};
-inline OSStatus AUInputElement::PullInputWithBufferList(
+inline OSStatus AUInputElement::PullInputWithBufferList(
AudioUnitRenderActionFlags & ioActionFlags,
const AudioTimeStamp & inTimeStamp,
AudioUnitElement inElement,
@@ -1020,7 +1020,7 @@ inline OSStatus AUInputElement::PullInputWithBufferList(
AudioBufferList * inBufferList)
{
OSStatus theResult;
-
+
if (HasConnection()) {
// only support connections for V2 audio units
#if !CA_USE_AUDIO_PLUGIN_ONLY
@@ -1036,7 +1036,7 @@ inline OSStatus AUInputElement::PullInputWithBufferList(
theResult = (mInputProc)(
mInputProcRefCon, &ioActionFlags, &inTimeStamp, inElement, nFrames, inBufferList);
}
-
+
if (mInputType == kNoInput) // defense: the guy upstream could have disconnected
// it's a horrible thing to do, but may happen!
return kAudioUnitErr_NoConnection;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp
index 1f0f01c..ed27327 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp
@@ -2,14 +2,14 @@
File: AUDispatch.cpp
Abstract: AUDispatch.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUBase.h"
#include "CAXException.h"
@@ -101,19 +101,19 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
case kAudioUnitRenderSelect:
result = (This->AudioUnitAPIVersion() > 1);
break;
-
+
default:
return ComponentBase::ComponentEntryDispatch(params, This);
}
break;
-
+
case kAudioUnitInitializeSelect:
{
CAMutex::Locker lock2(This->GetMutex());
result = This->DoInitialize();
}
break;
-
+
case kAudioUnitUninitializeSelect:
{
CAMutex::Locker lock2(This->GetMutex());
@@ -136,7 +136,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
// always assume they're non-null
UInt32 dataSize;
Boolean writable;
-
+
result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement, dataSize, writable);
if (poutDataSize != NULL)
*poutDataSize = dataSize;
@@ -158,7 +158,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
Boolean writable;
char *tempBuffer;
void *destBuffer;
-
+
if (pioDataSize == NULL) {
ca_debug_string("AudioUnitGetProperty: null size pointer");
result = kAudio_ParamError;
@@ -166,12 +166,12 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
}
if (poutData == NULL) {
UInt32 dataSize;
-
+
result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement, dataSize, writable);
*pioDataSize = dataSize;
goto finishGetProperty;
}
-
+
clientBufferSize = *pioDataSize;
if (clientBufferSize == 0)
{
@@ -180,13 +180,13 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
result = kAudio_ParamError;
goto finishGetProperty;
}
-
- result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement,
+
+ result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement,
actualPropertySize, writable);
- if (result)
+ if (result)
goto finishGetProperty;
-
- if (clientBufferSize < actualPropertySize)
+
+ if (clientBufferSize < actualPropertySize)
{
tempBuffer = new char[actualPropertySize];
destBuffer = tempBuffer;
@@ -194,9 +194,9 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
tempBuffer = NULL;
destBuffer = poutData;
}
-
+
result = This->DispatchGetProperty(pinID, pinScope, pinElement, destBuffer);
-
+
if (result == noErr) {
if (clientBufferSize < actualPropertySize && tempBuffer != NULL)
{
@@ -213,7 +213,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
}
break;
-
+
case kAudioUnitSetPropertySelect:
{
CAMutex::Locker lock(This->GetMutex());
@@ -222,7 +222,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
PARAM(AudioUnitElement, pinElement, 2, 5);
PARAM(const void *, pinData, 3, 5);
PARAM(UInt32, pinDataSize, 4, 5);
-
+
if (pinData && pinDataSize)
result = This->DispatchSetProperty(pinID, pinScope, pinElement, pinData, pinDataSize);
else {
@@ -247,7 +247,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
}
break;
-
+
case kAudioUnitAddPropertyListenerSelect:
{
CAMutex::Locker lock(This->GetMutex());
@@ -278,7 +278,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
result = This->RemovePropertyListener(pinID, pinProc, pinProcRefCon, true);
}
break;
-
+
case kAudioUnitAddRenderNotifySelect:
{
CAMutex::Locker lock(This->GetMutex());
@@ -344,7 +344,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
PARAM(UInt32, pinNumberFrames, 3, 5);
PARAM(AudioBufferList *, pioData, 4, 5);
AudioUnitRenderActionFlags tempFlags;
-
+
if (pinTimeStamp == NULL || pioData == NULL)
result = kAudio_ParamError;
else {
@@ -354,7 +354,7 @@ OSStatus AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
}
result = This->DoRender(*pinActionFlags, *pinTimeStamp, pinOutputBusNumber, pinNumberFrames, *pioData);
}
- }
+ }
}
break;
@@ -385,13 +385,13 @@ OSStatus CMgr_AudioUnitBaseGetParameter( AUBase * This,
float *outValue)
{
OSStatus result = AUBase::noErr;
-
+
try {
if (This == NULL || outValue == NULL) return kAudio_ParamError;
result = This->GetParameter(inID, inScope, inElement, *outValue);
}
COMPONENT_CATCH
-
+
return result;
}
@@ -403,13 +403,13 @@ OSStatus CMgr_AudioUnitBaseSetParameter( AUBase * This,
UInt32 inBufferOffset)
{
OSStatus result = AUBase::noErr;
-
+
try {
if (This == NULL) return kAudio_ParamError;
result = This->SetParameter(inID, inScope, inElement, inValue, inBufferOffset);
}
COMPONENT_CATCH
-
+
return result;
}
@@ -421,10 +421,10 @@ OSStatus CMgr_AudioUnitBaseRender( AUBase * This,
AudioBufferList * ioData)
{
if (inTimeStamp == NULL || ioData == NULL) return kAudio_ParamError;
-
+
OSStatus result = AUBase::noErr;
AudioUnitRenderActionFlags tempFlags;
-
+
try {
if (ioActionFlags == NULL) {
tempFlags = 0;
@@ -433,6 +433,6 @@ OSStatus CMgr_AudioUnitBaseRender( AUBase * This,
result = This->DoRender(*ioActionFlags, *inTimeStamp, inBusNumber, inNumberFrames, *ioData);
}
COMPONENT_CATCH
-
+
return result;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h
index 5acd962..fcdc29e 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h
@@ -2,14 +2,14 @@
File: AUDispatch.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUDispatch_h__
#define __AUDispatch_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp
index 2e148e8..688e404 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp
@@ -2,14 +2,14 @@
File: AUInputElement.cpp
Abstract: AUInputElement.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUBase.h"
@@ -76,8 +76,8 @@ void AUInputElement::SetConnection(const AudioUnitConnection &conn)
if (conn.sourceAudioUnit == 0) {
Disconnect();
return;
- }
-
+ }
+
mInputType = kFromConnection;
mConnection = conn;
AllocateBuffer();
@@ -136,16 +136,16 @@ OSStatus AUInputElement::PullInput( AudioUnitRenderActionFlags & ioActionFlag
const AudioTimeStamp & inTimeStamp,
AudioUnitElement inElement,
UInt32 nFrames)
-{
+{
if (!IsActive())
return kAudioUnitErr_NoConnection;
-
+
AudioBufferList *pullBuffer;
-
+
if (HasConnection() || !WillAllocateBuffer())
pullBuffer = &mIOBuffer.PrepareNullBuffer(mStreamFormat, nFrames);
else
pullBuffer = &mIOBuffer.PrepareBuffer(mStreamFormat, nFrames);
-
+
return PullInputWithBufferList (ioActionFlags, inTimeStamp, inElement, nFrames, pullBuffer);
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h
index 891e4c6..128efe5 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h
@@ -2,14 +2,14 @@
File: AUInputElement.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUInput_h__
#define __AUInput_h__
@@ -53,7 +53,7 @@
/*! @class AUInputElement */
class AUInputElement : public AUIOElement {
public:
-
+
/*! @ctor AUInputElement */
AUInputElement(AUBase *audioUnit);
/*! @dtor ~AUInputElement */
@@ -103,7 +103,7 @@ protected:
AURenderCallback mInputProc;
/*! @var mInputProcRefCon */
void * mInputProcRefCon;
-
+
// if from connection:
/*! @var mConnection */
AudioUnitConnection mConnection;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp
index 5eb34a1..080fa63 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp
@@ -2,14 +2,14 @@
File: AUOutputElement.cpp
Abstract: AUOutputElement.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,14 +40,14 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUOutputElement.h"
#include "AUBase.h"
-AUOutputElement::AUOutputElement(AUBase *audioUnit) :
+AUOutputElement::AUOutputElement(AUBase *audioUnit) :
AUIOElement(audioUnit)
{
AllocateBuffer();
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h
index 3e6a938..42ae842 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h
@@ -2,14 +2,14 @@
File: AUOutputElement.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUOutput_h__
#define __AUOutput_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp
index 3bab198..c75d208 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp
@@ -2,14 +2,14 @@
File: AUPlugInDispatch.cpp
Abstract: AUPlugInDispatch.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUPlugInDispatch.h"
#include "CAXException.h"
@@ -83,7 +83,7 @@ static OSStatus AUMethodGetPropertyInfo(void *self, AudioUnitPropertyID prop, Au
try {
UInt32 dataSize = 0; // 13517289 GetPropetyInfo was returning an uninitialized value when there is an error. This is a problem for auval.
Boolean writable = false;
-
+
AUI_LOCK
result = AUI->DispatchGetPropertyInfo(prop, scope, elem, dataSize, writable);
if (outDataSize != NULL)
@@ -103,7 +103,7 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
Boolean writable;
char *tempBuffer;
void *destBuffer;
-
+
AUI_LOCK
if (ioDataSize == NULL) {
ca_debug_string("AudioUnitGetProperty: null size pointer");
@@ -112,12 +112,12 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
}
if (outData == NULL) {
UInt32 dataSize;
-
+
result = AUI->DispatchGetPropertyInfo(inID, inScope, inElement, dataSize, writable);
*ioDataSize = dataSize;
goto finishGetProperty;
}
-
+
clientBufferSize = *ioDataSize;
if (clientBufferSize == 0)
{
@@ -126,12 +126,12 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
result = kAudio_ParamError;
goto finishGetProperty;
}
-
+
result = AUI->DispatchGetPropertyInfo(inID, inScope, inElement, actualPropertySize, writable);
- if (result != noErr)
+ if (result != noErr)
goto finishGetProperty;
-
- if (clientBufferSize < actualPropertySize)
+
+ if (clientBufferSize < actualPropertySize)
{
tempBuffer = new char[actualPropertySize];
destBuffer = tempBuffer;
@@ -139,9 +139,9 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
tempBuffer = NULL;
destBuffer = outData;
}
-
+
result = AUI->DispatchGetProperty(inID, inScope, inElement, destBuffer);
-
+
if (result == noErr) {
if (clientBufferSize < actualPropertySize && tempBuffer != NULL)
{
@@ -285,7 +285,7 @@ static OSStatus AUMethodRender(void *self, AudioUnitRenderActionFlags *ioActionF
#endif
// this is a processing method; no lock
AudioUnitRenderActionFlags tempFlags;
-
+
if (inTimeStamp == NULL || ioData == NULL)
result = kAudio_ParamError;
else {
@@ -313,7 +313,7 @@ static OSStatus AUMethodComplexRender(void *self, AudioUnitRenderActionFlags *io
#endif
// this is a processing method; no lock
AudioUnitRenderActionFlags tempFlags;
-
+
if (inTimeStamp == NULL || ioData == NULL)
result = kAudio_ParamError;
else {
@@ -362,7 +362,7 @@ static OSStatus AUMethodProcess (void *self, AudioUnitRenderActionFlags *ioActio
if (*ioActionFlags & (1 << 9)/*kAudioUnitRenderAction_DoNotCheckRenderArgs*/)
doParamCheck = false;
}
-
+
if (doParamCheck && (inTimeStamp == NULL || ioData == NULL))
result = kAudio_ParamError;
else {
@@ -380,15 +380,15 @@ static OSStatus AUMethodProcess (void *self, AudioUnitRenderActionFlags *ioActio
static OSStatus AUMethodProcessMultiple (void *self, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, UInt32 inNumberInputBufferLists, const AudioBufferList **inInputBufferLists, UInt32 inNumberOutputBufferLists, AudioBufferList **ioOutputBufferLists)
{
OSStatus result = noErr;
-
+
#if !TARGET_OS_IPHONE
try {
#endif
// this is a processing method; no lock
bool doParamCheck = true;
-
+
AudioUnitRenderActionFlags tempFlags;
-
+
if (ioActionFlags == NULL) {
tempFlags = 0;
ioActionFlags = &tempFlags;
@@ -402,7 +402,7 @@ static OSStatus AUMethodProcessMultiple (void *self, AudioUnitRenderActionFlags
else {
result = AUI->DoProcessMultiple(*ioActionFlags, *inTimeStamp, inNumberFrames, inNumberInputBufferLists, inInputBufferLists, inNumberOutputBufferLists, ioOutputBufferLists);
}
-
+
#if !TARGET_OS_IPHONE
}
COMPONENT_CATCH
@@ -465,7 +465,7 @@ static OSStatus AUMethodStartNote(void *self, MusicDeviceInstrumentID inInstrume
OSStatus result = noErr;
try {
// this is a potential render-time method; no lock
- if (inParams == NULL || outNoteInstanceID == NULL)
+ if (inParams == NULL || outNoteInstanceID == NULL)
result = kAudio_ParamError;
else
result = AUI->StartNote(inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams);
@@ -559,10 +559,10 @@ AudioComponentMethod AUComplexOutputLookup::Lookup (SInt16 selector)
{
AudioComponentMethod method = AUBaseLookup::Lookup(selector);
if (method) return method;
-
+
method = AUOutputLookup::Lookup(selector);
if (method) return method;
-
+
if (selector == kAudioUnitComplexRenderSelect)
return (AudioComponentMethod)AUMethodComplexRender;
return NULL;
@@ -572,10 +572,10 @@ AudioComponentMethod AUBaseProcessLookup::Lookup (SInt16 selector)
{
AudioComponentMethod method = AUBaseLookup::Lookup(selector);
if (method) return method;
-
+
if (selector == kAudioUnitProcessSelect)
return (AudioComponentMethod)AUMethodProcess;
-
+
return NULL;
}
@@ -583,10 +583,10 @@ AudioComponentMethod AUBaseProcessMultipleLookup::Lookup (SInt16 selector)
{
AudioComponentMethod method = AUBaseLookup::Lookup(selector);
if (method) return method;
-
+
if (selector == kAudioUnitProcessMultipleSelect)
return (AudioComponentMethod)AUMethodProcessMultiple;
-
+
return NULL;
}
@@ -597,7 +597,7 @@ AudioComponentMethod AUBaseProcessAndMultipleLookup::Lookup (SInt16 selector)
method = AUBaseProcessMultipleLookup::Lookup(selector);
if (method) return method;
-
+
method = AUBaseProcessLookup::Lookup(selector);
if (method) return method;
@@ -620,7 +620,7 @@ AudioComponentMethod AUMIDILookup::Lookup (SInt16 selector)
{
AudioComponentMethod method = AUBaseLookup::Lookup(selector);
if (method) return method;
-
+
return MIDI_Lookup(selector);
}
@@ -628,7 +628,7 @@ AudioComponentMethod AUMIDIProcessLookup::Lookup (SInt16 selector)
{
AudioComponentMethod method = AUBaseProcessLookup::Lookup(selector);
if (method) return method;
-
+
return MIDI_Lookup(selector);
}
@@ -644,7 +644,7 @@ AudioComponentMethod AUMusicLookup::Lookup (SInt16 selector)
case kMusicDevicePrepareInstrumentSelect: return (AudioComponentMethod)AUMethodPrepareInstrument;
case kMusicDeviceReleaseInstrumentSelect: return (AudioComponentMethod)AUMethodReleaseInstrument;
#endif
- default:
+ default:
break;
}
return MIDI_Lookup (selector);
@@ -656,10 +656,10 @@ AudioComponentMethod AUAuxBaseLookup::Lookup (SInt16 selector)
case kAudioUnitGetPropertyInfoSelect: return (AudioComponentMethod)AUMethodGetPropertyInfo;
case kAudioUnitGetPropertySelect: return (AudioComponentMethod)AUMethodGetProperty;
case kAudioUnitSetPropertySelect: return (AudioComponentMethod)AUMethodSetProperty;
-
+
case kAudioUnitGetParameterSelect: return (AudioComponentMethod)AUMethodGetParameter;
case kAudioUnitSetParameterSelect: return (AudioComponentMethod)AUMethodSetParameter;
-
+
default:
break;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h
index 6ebea75..1ce471b 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h
@@ -2,14 +2,14 @@
File: AUPlugInDispatch.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUPlugInBase_h__
#define __AUPlugInBase_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp
index 24bd18e..99d359f 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp
@@ -2,14 +2,14 @@
File: AUScopeElement.cpp
Abstract: AUScopeElement.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUScopeElement.h"
#include "AUBase.h"
@@ -57,7 +57,7 @@
//
void AUElement::UseIndexedParameters(int inNumberOfParameters)
{
- mIndexedParameters.resize (inNumberOfParameters);
+ mIndexedParameters.resize (inNumberOfParameters);
mUseIndexedParameters = true;
}
@@ -69,12 +69,12 @@ void AUElement::UseIndexedParameters(int inNumberOfParameters)
inline ParameterMapEvent& AUElement::GetParamEvent(AudioUnitParameterID paramID)
{
ParameterMapEvent *event;
-
+
if(mUseIndexedParameters)
{
if(paramID >= mIndexedParameters.size() )
COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
-
+
event = &mIndexedParameters[paramID];
}
else
@@ -82,10 +82,10 @@ inline ParameterMapEvent& AUElement::GetParamEvent(AudioUnitParameterID paramID)
ParameterMap::iterator i = mParameters.find(paramID);
if (i == mParameters.end())
COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
-
+
event = &(*i).second;
}
-
+
return *event;
}
@@ -95,19 +95,19 @@ inline ParameterMapEvent& AUElement::GetParamEvent(AudioUnitParameterID paramID)
// returns whether the specified paramID is known to the element
//
bool AUElement::HasParameterID (AudioUnitParameterID paramID) const
-{
+{
if(mUseIndexedParameters)
{
if(paramID >= mIndexedParameters.size() )
return false;
-
+
return true;
}
-
+
ParameterMap::const_iterator i = mParameters.find(paramID);
if (i == mParameters.end())
return false;
-
+
return true;
}
@@ -118,7 +118,7 @@ bool AUElement::HasParameterID (AudioUnitParameterID paramID) const
AudioUnitParameterValue AUElement::GetParameter(AudioUnitParameterID paramID)
{
ParameterMapEvent &event = GetParamEvent(paramID);
-
+
return event.GetValue();
}
@@ -132,7 +132,7 @@ void AUElement::GetRampSliceStartEnd( AudioUnitParameterID paramID,
{
ParameterMapEvent &event = GetParamEvent(paramID);
-
+
// works even if the value is constant (immediate parameter value)
event.GetRampSliceStartEnd(outStartValue, outEndValue, outValuePerFrameDelta );
}
@@ -143,7 +143,7 @@ AudioUnitParameterValue AUElement::GetEndValue( AudioUnitParameterID paramID)
{
ParameterMapEvent &event = GetParamEvent(paramID);
-
+
// works even if the value is constant (immediate parameter value)
return event.GetEndValue();
}
@@ -160,21 +160,21 @@ void AUElement::SetParameter(AudioUnitParameterID paramID, AudioUnitParameterV
else
{
ParameterMap::iterator i = mParameters.find(paramID);
-
+
if (i == mParameters.end())
{
if (mAudioUnit->IsInitialized() && !okWhenInitialized) {
// The AU should not be creating new parameters once initialized.
- // If a client tries to set an undefined parameter, we could throw as follows,
+ // If a client tries to set an undefined parameter, we could throw as follows,
// but this might cause a regression. So it is better to just fail silently.
// COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
#if DEBUG
- fprintf(stderr, "WARNING: %s SetParameter for undefined param ID %d while initialized. Ignoring..\n",
+ fprintf(stderr, "WARNING: %s SetParameter for undefined param ID %d while initialized. Ignoring..\n",
mAudioUnit->GetLoggingString(), (int)paramID);
#endif
} else {
// create new entry in map for the paramID (only happens first time)
- ParameterMapEvent event(inValue);
+ ParameterMapEvent event(inValue);
mParameters[paramID] = event;
}
}
@@ -203,21 +203,21 @@ void AUElement::SetScheduledEvent( AudioUnitParameterID paramID,
else
{
ParameterMap::iterator i = mParameters.find(paramID);
-
+
if (i == mParameters.end())
{
if (mAudioUnit->IsInitialized() && !okWhenInitialized) {
// The AU should not be creating new parameters once initialized.
- // If a client tries to set an undefined parameter, we could throw as follows,
+ // If a client tries to set an undefined parameter, we could throw as follows,
// but this might cause a regression. So it is better to just fail silently.
// COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
#if DEBUG
- fprintf(stderr, "WARNING: %s SetScheduledEvent for undefined param ID %d while initialized. Ignoring..\n",
+ fprintf(stderr, "WARNING: %s SetScheduledEvent for undefined param ID %d while initialized. Ignoring..\n",
mAudioUnit->GetLoggingString(), (int)paramID);
#endif
} else {
// create new entry in map for the paramID (only happens first time)
- ParameterMapEvent event(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames);
+ ParameterMapEvent event(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames);
mParameters[paramID] = event;
}
}
@@ -225,7 +225,7 @@ void AUElement::SetScheduledEvent( AudioUnitParameterID paramID,
{
// paramID already exists in map so simply change its value
ParameterMapEvent &event = (*i).second;
-
+
event.SetScheduledEvent(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames );
}
}
@@ -259,7 +259,7 @@ void AUElement::SaveState(CFMutableDataRef data)
UInt32 nparams = static_cast<UInt32>(mIndexedParameters.size());
UInt32 theData = CFSwapInt32HostToBig(nparams);
CFDataAppendBytes(data, (UInt8 *)&theData, sizeof(nparams));
-
+
for (UInt32 i = 0; i < nparams; i++)
{
struct {
@@ -267,12 +267,12 @@ void AUElement::SaveState(CFMutableDataRef data)
//CFSwappedFloat32 value; crashes gcc3 PFE
UInt32 value; // really a big-endian float
} entry;
-
+
entry.paramID = CFSwapInt32HostToBig(i);
-
+
AudioUnitParameterValue v = mIndexedParameters[i].GetValue();
entry.value = CFSwapInt32HostToBig(*(UInt32 *)&v );
-
+
CFDataAppendBytes(data, (UInt8 *)&entry, sizeof(entry));
}
}
@@ -280,19 +280,19 @@ void AUElement::SaveState(CFMutableDataRef data)
{
UInt32 nparams = CFSwapInt32HostToBig(static_cast<uint32_t>(mParameters.size()));
CFDataAppendBytes(data, (UInt8 *)&nparams, sizeof(nparams));
-
+
for (ParameterMap::iterator i = mParameters.begin(); i != mParameters.end(); ++i) {
struct {
UInt32 paramID;
//CFSwappedFloat32 value; crashes gcc3 PFE
UInt32 value; // really a big-endian float
} entry;
-
+
entry.paramID = CFSwapInt32HostToBig((*i).first);
-
+
AudioUnitParameterValue v = (*i).second.GetValue();
entry.value = CFSwapInt32HostToBig(*(UInt32 *)&v );
-
+
CFDataAppendBytes(data, (UInt8 *)&entry, sizeof(entry));
}
}
@@ -306,20 +306,20 @@ const UInt8 * AUElement::RestoreState(const UInt8 *state)
const UInt8 *p = state;
UInt32 nparams = CFSwapInt32BigToHost(*(UInt32 *)p);
p += sizeof(UInt32);
-
+
for (UInt32 i = 0; i < nparams; ++i) {
struct {
AudioUnitParameterID paramID;
AudioUnitParameterValue value;
} entry;
-
+
entry.paramID = CFSwapInt32BigToHost(*(UInt32 *)p);
p += sizeof(UInt32);
FloatInt32 temp;
temp.i = CFSwapInt32BigToHost(*(UInt32 *)p);
entry.value = temp.f;
p += sizeof(AudioUnitParameterValue);
-
+
SetParameter(entry.paramID, entry.value);
}
return p;
@@ -327,10 +327,10 @@ const UInt8 * AUElement::RestoreState(const UInt8 *state)
//_____________________________________________________________________________
//
-void AUElement::SetName (CFStringRef inName)
-{
+void AUElement::SetName (CFStringRef inName)
+{
if (mElementName) CFRelease (mElementName);
- mElementName = inName;
+ mElementName = inName;
if (mElementName) CFRetain (mElementName);
}
@@ -362,9 +362,9 @@ void AUIOElement::AllocateBuffer(UInt32 inFramesToAllocate)
if (GetAudioUnit()->HasBegunInitializing())
{
UInt32 framesToAllocate = inFramesToAllocate > 0 ? inFramesToAllocate : GetAudioUnit()->GetMaxFramesPerSlice();
-
+
// printf ("will allocate: %d\n", (int)((mWillAllocate && NeedsBufferSpace()) ? framesToAllocate : 0));
-
+
mIOBuffer.Allocate(mStreamFormat, (mWillAllocate && NeedsBufferSpace()) ? framesToAllocate : 0);
}
}
@@ -381,21 +381,21 @@ void AUIOElement::DeallocateBuffer()
// AudioChannelLayout support
// outLayoutTagsPtr WILL be NULL if called to find out how many
-// layouts that Audio Unit will report
+// layouts that Audio Unit will report
// return 0 (ie. NO channel layouts) if the AU doesn't require channel layout knowledge
UInt32 AUIOElement::GetChannelLayoutTags (AudioChannelLayoutTag *outLayoutTagsPtr)
{
return 0;
}
-
-// As the AudioChannelLayout can be a variable length structure
+
+// As the AudioChannelLayout can be a variable length structure
// (though in most cases it won't be!!!)
// The size of the ACL is always returned by the method
-// if outMapPtr is NOT-NULL, then AU should copy into this pointer (outMapPtr) the current ACL that it has in use.
+// if outMapPtr is NOT-NULL, then AU should copy into this pointer (outMapPtr) the current ACL that it has in use.
// the AU should also return whether the property is writable (that is the client can provide any arbitrary ACL that the audio unit will then honour)
// or if the property is read only - which is the generally preferred mode.
// If the AU doesn't require an AudioChannelLayout, then just return 0.
-UInt32 AUIOElement::GetAudioChannelLayout (AudioChannelLayout *outMapPtr,
+UInt32 AUIOElement::GetAudioChannelLayout (AudioChannelLayout *outMapPtr,
Boolean &outWritable)
{
return 0;
@@ -500,7 +500,7 @@ bool AUScope::RestoreElementNames (CFDictionaryRef& inNameDict)
//first we have to see if we have enough elements
bool didAddElements = false;
unsigned int maxElNum = GetNumberOfElements();
-
+
int dictSize = static_cast<int>(CFDictionaryGetCount(inNameDict));
CFStringRef * keys = (CFStringRef*)CA_malloc (dictSize * sizeof (CFStringRef));
CFDictionaryGetKeysAndValues (inNameDict, reinterpret_cast<const void**>(keys), NULL);
@@ -519,7 +519,7 @@ bool AUScope::RestoreElementNames (CFDictionaryRef& inNameDict)
}
}
free (keys);
-
+
return didAddElements;
}
@@ -534,11 +534,11 @@ void AUScope::SaveState(CFMutableDataRef data)
UInt32 scope;
UInt32 element;
} hdr;
-
+
hdr.scope = CFSwapInt32HostToBig(GetScope());
hdr.element = CFSwapInt32HostToBig(ielem);
CFDataAppendBytes(data, (UInt8 *)&hdr, sizeof(hdr));
-
+
element->SaveState(data);
}
}
@@ -556,10 +556,10 @@ const UInt8 * AUScope::RestoreState(const UInt8 *state)
} entry;
UInt32 nparams = CFSwapInt32BigToHost(*(UInt32 *)p);
p += sizeof(UInt32);
-
+
p += nparams * sizeof(entry);
} else
p = element->RestoreState(p);
-
+
return p;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h
index 47ebe2f..ae493f2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h
@@ -2,14 +2,14 @@
File: AUScopeElement.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUScopeElement_h__
#define __AUScopeElement_h__
@@ -69,15 +69,15 @@ class ParameterMapEvent
{
public:
/*! @ctor ParameterMapEvent */
- ParameterMapEvent()
- : mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(0.0f), mValue2(0.0f), mSliceDurationFrames(0)
+ ParameterMapEvent()
+ : mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(0.0f), mValue2(0.0f), mSliceDurationFrames(0)
{}
/*! @ctor ParameterMapEvent */
ParameterMapEvent(AudioUnitParameterValue inValue)
- : mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(inValue), mValue2(inValue), mSliceDurationFrames(0)
+ : mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(inValue), mValue2(inValue), mSliceDurationFrames(0)
{}
-
+
// constructor for scheduled event
/*! @ctor ParameterMapEvent */
ParameterMapEvent( const AudioUnitParameterEvent &inEvent,
@@ -86,7 +86,7 @@ public:
{
SetScheduledEvent(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames );
};
-
+
/*! @method SetScheduledEvent */
void SetScheduledEvent( const AudioUnitParameterEvent &inEvent,
UInt32 inSliceOffsetInBuffer,
@@ -94,7 +94,7 @@ public:
{
mEventType = inEvent.eventType;
mSliceDurationFrames = inSliceDurationFrames;
-
+
if(mEventType == kParameterEvent_Immediate )
{
// constant immediate value for the whole slice
@@ -111,9 +111,9 @@ public:
mValue2 = inEvent.eventValues.ramp.endValue;
}
};
-
-
-
+
+
+
/*! @method GetEventType */
AUParameterEventType GetEventType() const {return mEventType;};
@@ -122,13 +122,13 @@ public:
/*! @method GetEndValue */
AudioUnitParameterValue GetEndValue() const {return mValue2;}; // only valid if immediate event type
/*! @method SetValue */
- void SetValue(AudioUnitParameterValue inValue)
+ void SetValue(AudioUnitParameterValue inValue)
{
- mEventType = kParameterEvent_Immediate;
- mValue1 = inValue;
+ mEventType = kParameterEvent_Immediate;
+ mValue1 = inValue;
mValue2 = inValue;
}
-
+
// interpolates the start and end values corresponding to the current processing slice
// most ramp parameter implementations will want to use this method
// the start value will correspond to the start of the slice
@@ -140,7 +140,7 @@ public:
{
if (mEventType == kParameterEvent_Ramped) {
outValuePerFrameDelta = (mValue2 - mValue1) / mDurationInFrames;
-
+
outStartValue = mValue1 + outValuePerFrameDelta * (-mBufferOffset); // corresponds to frame 0 of this slice
outEndValue = outStartValue + outValuePerFrameDelta * mSliceDurationFrames;
} else {
@@ -178,15 +178,15 @@ public:
}
#endif
-private:
+private:
AUParameterEventType mEventType;
-
+
SInt32 mBufferOffset; // ramp start offset relative to start of this slice (may be negative)
UInt32 mDurationInFrames; // total duration of ramp parameter
AudioUnitParameterValue mValue1; // value if immediate : startValue if ramp
AudioUnitParameterValue mValue2; // endValue (only used for ramp)
-
- UInt32 mSliceDurationFrames; // duration of this processing slice
+
+ UInt32 mSliceDurationFrames; // duration of this processing slice
};
@@ -201,10 +201,10 @@ public:
/*! @ctor AUElement */
AUElement(AUBase *audioUnit) : mAudioUnit(audioUnit),
mUseIndexedParameters(false), mElementName(0) { }
-
+
/*! @dtor ~AUElement */
virtual ~AUElement() { if (mElementName) CFRelease (mElementName); }
-
+
/*! @method GetNumberOfParameters */
virtual UInt32 GetNumberOfParameters()
{
@@ -214,12 +214,12 @@ public:
virtual void GetParameterList(AudioUnitParameterID *outList);
/*! @method HasParameterID */
bool HasParameterID (AudioUnitParameterID paramID) const;
-
+
/*! @method GetParameter */
AudioUnitParameterValue GetParameter(AudioUnitParameterID paramID);
/*! @method SetParameter */
void SetParameter(AudioUnitParameterID paramID, AudioUnitParameterValue value, bool okWhenInitialized = false);
- // Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted.
+ // Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted.
// interpolates the start and end values corresponding to the current processing slice
// most ramp parameter implementations will want to use this method
@@ -228,7 +228,7 @@ public:
AudioUnitParameterValue & outStartValue,
AudioUnitParameterValue & outEndValue,
AudioUnitParameterValue & outValuePerFrameDelta );
-
+
/*! @method GetEndValue */
AudioUnitParameterValue GetEndValue( AudioUnitParameterID paramID);
@@ -238,7 +238,7 @@ public:
UInt32 inSliceOffsetInBuffer,
UInt32 inSliceDurationFrames,
bool okWhenInitialized = false );
- // Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted.
+ // Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted.
/*! @method GetAudioUnit */
@@ -259,13 +259,13 @@ public:
/*! @method AsIOElement*/
virtual AUIOElement* AsIOElement () { return NULL; }
-
+
protected:
inline ParameterMapEvent& GetParamEvent(AudioUnitParameterID paramID);
-
+
private:
typedef std::map<AudioUnitParameterID, ParameterMapEvent, std::less<AudioUnitParameterID> > ParameterMap;
-
+
/*! @var mAudioUnit */
AUBase * mAudioUnit;
/*! @var mParameters */
@@ -275,7 +275,7 @@ private:
bool mUseIndexedParameters;
/*! @var mIndexedParameters */
std::vector<ParameterMapEvent> mIndexedParameters;
-
+
/*! @var mElementName */
CFStringRef mElementName;
};
@@ -292,7 +292,7 @@ public:
/*! @method GetStreamFormat */
const CAStreamBasicDescription &GetStreamFormat() const { return mStreamFormat; }
-
+
/*! @method SetStreamFormat */
virtual OSStatus SetStreamFormat(const CAStreamBasicDescription &desc);
@@ -304,14 +304,14 @@ public:
virtual bool NeedsBufferSpace() const = 0;
/*! @method SetWillAllocateBuffer */
- void SetWillAllocateBuffer(bool inFlag) {
- mWillAllocate = inFlag;
+ void SetWillAllocateBuffer(bool inFlag) {
+ mWillAllocate = inFlag;
}
/*! @method WillAllocateBuffer */
- bool WillAllocateBuffer() const {
- return mWillAllocate;
+ bool WillAllocateBuffer() const {
+ return mWillAllocate;
}
-
+
/*! @method UseExternalBuffer */
void UseExternalBuffer(const AudioUnitExternalBuffer &buf) {
mIOBuffer.UseExternalBuffer(mStreamFormat, buf);
@@ -392,7 +392,7 @@ public:
/*! @method SetAudioChannelLayout */
virtual OSStatus SetAudioChannelLayout (const AudioChannelLayout &inData);
-
+
/*! @method RemoveAudioChannelLayout */
virtual OSStatus RemoveAudioChannelLayout ();
@@ -416,32 +416,32 @@ protected:
class AUScopeDelegate {
public:
/*! @ctor AUScopeDelegate */
- AUScopeDelegate() : mCreator(NULL), mScope(0) { }
+ AUScopeDelegate() : mCreator(NULL), mScope(0) { }
/*! @dtor ~AUScopeDelegate */
virtual ~AUScopeDelegate() {}
-
+
/*! @method Initialize */
- void Initialize( AUBase *creator,
- AudioUnitScope scope,
+ void Initialize( AUBase *creator,
+ AudioUnitScope scope,
UInt32 numElements)
{
mCreator = creator;
mScope = scope;
SetNumberOfElements(numElements);
}
-
+
/*! @method SetNumberOfElements */
virtual void SetNumberOfElements(UInt32 numElements) = 0;
-
+
/*! @method GetNumberOfElements */
virtual UInt32 GetNumberOfElements() = 0;
-
+
/*! @method GetElement */
virtual AUElement * GetElement(UInt32 elementIndex) = 0;
-
+
AUBase * GetCreator() const { return mCreator; }
AudioUnitScope GetScope() const { return mScope; }
-
+
private:
/*! @var mCreator */
@@ -458,13 +458,13 @@ private:
class AUScope {
public:
/*! @ctor AUScope */
- AUScope() : mCreator(NULL), mScope(0), mDelegate(0) { }
+ AUScope() : mCreator(NULL), mScope(0), mDelegate(0) { }
/*! @dtor ~AUScope */
~AUScope();
-
+
/*! @method Initialize */
- void Initialize(AUBase *creator,
- AudioUnitScope scope,
+ void Initialize(AUBase *creator,
+ AudioUnitScope scope,
UInt32 numElements)
{
mCreator = creator;
@@ -472,22 +472,22 @@ public:
if (mDelegate)
return mDelegate->Initialize(creator, scope, numElements);
-
+
SetNumberOfElements(numElements);
}
-
+
/*! @method SetNumberOfElements */
void SetNumberOfElements(UInt32 numElements);
-
+
/*! @method GetNumberOfElements */
- UInt32 GetNumberOfElements() const
+ UInt32 GetNumberOfElements() const
{
if (mDelegate)
return mDelegate->GetNumberOfElements();
-
+
return static_cast<UInt32>(mElements.size());
}
-
+
/*! @method GetElement */
AUElement * GetElement(UInt32 elementIndex) const
{
@@ -498,7 +498,7 @@ public:
// catch passing -1 in as the elementIndex - causes a wrap around
return (i >= mElements.end() || i < mElements.begin()) ? NULL : *i;
}
-
+
/*! @method SafeGetElement */
AUElement * SafeGetElement(UInt32 elementIndex)
{
@@ -507,7 +507,7 @@ public:
COMPONENT_THROW(kAudioUnitErr_InvalidElement);
return element;
}
-
+
/*! @method GetIOElement */
AUIOElement * GetIOElement(UInt32 elementIndex) const
{
@@ -517,15 +517,15 @@ public:
COMPONENT_THROW (kAudioUnitErr_InvalidElement);
return ioel;
}
-
+
/*! @method HasElementWithName */
bool HasElementWithName () const;
-
+
/*! @method AddElementNamesToDict */
void AddElementNamesToDict (CFMutableDictionaryRef & inNameDict);
-
+
bool RestoreElementNames (CFDictionaryRef& inNameDict);
-
+
AudioUnitScope GetScope() const { return mScope; }
void SetDelegate(AUScopeDelegate* inDelegate) { mDelegate = inDelegate; }
@@ -535,7 +535,7 @@ public:
/*! @method RestoreState */
const UInt8 * RestoreState(const UInt8 *state);
-
+
private:
typedef std::vector<AUElement *> ElementVector;
/*! @var mCreator */
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp
index fc98733..37328fe 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp
@@ -2,14 +2,14 @@
File: ComponentBase.cpp
Abstract: ComponentBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "ComponentBase.h"
#include "CAXException.h"
@@ -72,11 +72,11 @@ static OSStatus CB_GetComponentDescription (const AudioComponentInstance inInsta
static OSStatus CMgr_GetComponentDescription (const AudioComponentInstance inInstance, AudioComponentDescription * outDesc);
#endif
-ComponentBase::ComponentBase(AudioComponentInstance inInstance)
- : mComponentInstance(inInstance),
- mInstanceType(sNewInstanceType)
-{
- GetComponentDescription();
+ComponentBase::ComponentBase(AudioComponentInstance inInstance)
+ : mComponentInstance(inInstance),
+ mInstanceType(sNewInstanceType)
+{
+ GetComponentDescription();
}
ComponentBase::~ComponentBase()
@@ -99,7 +99,7 @@ OSStatus ComponentBase::AP_Open(void *self, AudioUnit compInstance)
OSStatus result = noErr;
try {
ComponentInitLocker lock;
-
+
ComponentBase::sNewInstanceType = ComponentBase::kAudioComponentInstance;
ComponentBase *cb = (ComponentBase *)(*ACPI->mConstruct)(&ACPI->mInstanceStorage, compInstance);
cb->PostConstructor(); // allows base class to do additional initialization
@@ -137,13 +137,13 @@ OSStatus ComponentBase::ComponentEntryDispatch(ComponentParameters *p, Componen
if (This == NULL) return kAudio_ParamError;
OSStatus result = noErr;
-
+
switch (p->what) {
case kComponentCloseSelect:
This->PreDestructor();
delete This;
break;
-
+
case kComponentVersionSelect:
result = This->Version();
break;
@@ -158,7 +158,7 @@ OSStatus ComponentBase::ComponentEntryDispatch(ComponentParameters *p, Componen
default:
return 0;
}
-
+
default:
result = badComponentSelector;
break;
@@ -169,7 +169,7 @@ OSStatus ComponentBase::ComponentEntryDispatch(ComponentParameters *p, Componen
SInt16 ComponentBase::GetSelectorForCanDo(ComponentParameters *params)
{
if (params->what != kComponentCanDoSelect) return 0;
-
+
#if TARGET_CPU_X86
SInt16 sel = params->params[0];
#elif TARGET_CPU_X86_64
@@ -179,9 +179,9 @@ SInt16 ComponentBase::GetSelectorForCanDo(ComponentParameters *params)
#else
SInt16 sel = params->params[0];
#endif
-
+
return sel;
-/*
+/*
printf ("flags:%d, paramSize: %d, what: %d\n\t", params->flags, params->paramSize, params->what);
for (int i = 0; i < params->paramSize; ++i) {
printf ("[%d]:%d(0x%x), ", i, params->params[i], params->params[i]);
@@ -192,7 +192,7 @@ SInt16 ComponentBase::GetSelectorForCanDo(ComponentParameters *params)
#endif
-#if CA_DO_NOT_USE_AUDIO_COMPONENT
+#if CA_DO_NOT_USE_AUDIO_COMPONENT
static OSStatus ComponentBase_GetComponentDescription (const AudioComponentInstance & inInstance, AudioComponentDescription &outDesc);
#endif
@@ -200,20 +200,20 @@ AudioComponentDescription ComponentBase::GetComponentDescription() const
{
AudioComponentDescription desc;
OSStatus result = 1;
-
+
if (IsPluginObject()) {
ca_require_noerr(result = CB_GetComponentDescription (mComponentInstance, &desc), home);
}
#if !CA_USE_AUDIO_PLUGIN_ONLY
else {
- ca_require_noerr(result = CMgr_GetComponentDescription (mComponentInstance, &desc), home);
+ ca_require_noerr(result = CMgr_GetComponentDescription (mComponentInstance, &desc), home);
}
#endif
home:
if (result)
memset (&desc, 0, sizeof(AudioComponentDescription));
-
+
return desc;
}
@@ -239,13 +239,13 @@ static OSStatus CB_GetComponentDescription (const AudioComponentInstance inInsta
{
typedef AudioComponent (*AudioComponentInstanceGetComponentProc) (AudioComponentInstance);
static AudioComponentInstanceGetComponentProc aciGCProc = NULL;
-
+
typedef OSStatus (*AudioComponentGetDescriptionProc)(AudioComponent, AudioComponentDescription *);
static AudioComponentGetDescriptionProc acGDProc = NULL;
-
+
static int doneInit = 0;
if (doneInit == 0) {
- doneInit = 1;
+ doneInit = 1;
void* theImage = dlopen("/System/Library/Frameworks/AudioUnit.framework/AudioUnit", RTLD_LAZY);
if (theImage != NULL)
{
@@ -255,13 +255,13 @@ static OSStatus CB_GetComponentDescription (const AudioComponentInstance inInsta
}
}
}
-
+
OSStatus result = kAudio_UnimplementedError;
if (acGDProc && aciGCProc) {
AudioComponent comp = (*aciGCProc)(inInstance);
if (comp)
result = (*acGDProc)(comp, outDesc);
- }
+ }
#if !CA_USE_AUDIO_PLUGIN_ONLY
else {
result = CMgr_GetComponentDescription (inInstance, outDesc);
@@ -317,7 +317,7 @@ static void CSInit ()
dispatch_once_f(&sCSInitOnce, NULL, CSInitOnce);
}
-#else
+#else
static void CSInit ()
{
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h
index 67417aa..f8c5511 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h
@@ -2,14 +2,14 @@
File: ComponentBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __ComponentBase_h__
#define __ComponentBase_h__
@@ -57,7 +57,7 @@
#if !CA_USE_AUDIO_PLUGIN_ONLY
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/Components.h>
-
+
#if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5)
#define AudioComponentInstance ComponentInstance
#define AudioComponentDescription ComponentDescription
@@ -115,13 +115,13 @@ public:
/*! @ctor ComponentBase */
ComponentBase(AudioComponentInstance inInstance);
-
+
/*! @dtor ~ComponentBase */
virtual ~ComponentBase();
-
+
/*! @method PostConstructor */
virtual void PostConstructor();
-
+
/*! @method PreDestructor */
virtual void PreDestructor();
@@ -135,14 +135,14 @@ public:
/*! GetSelectorForCanDo */
static SInt16 GetSelectorForCanDo(ComponentParameters *params);
#endif
-
+
/*! @method GetComponentInstance */
AudioComponentInstance GetComponentInstance() const { return mComponentInstance; }
/*! @method GetComponentDescription */
AudioComponentDescription GetComponentDescription() const;
- // This global variable is so that new instances know how they were instantiated: via the Component Manager,
+ // This global variable is so that new instances know how they were instantiated: via the Component Manager,
// or as AudioComponents. It's ugly, but preferable to altering the constructor of every class in the hierarchy.
// It's safe because construction is protected by ComponentInitLocker.
enum EInstanceType { kComponentMgrInstance, kAudioComponentInstance };
@@ -158,27 +158,27 @@ public:
/*! @method AP_Close */
static OSStatus AP_Close(void *self);
-
+
protected:
/*! @var mComponentInstance */
AudioComponentInstance mComponentInstance;
EInstanceType mInstanceType;
};
-class ComponentInitLocker
+class ComponentInitLocker
{
#if TARGET_OS_MAC
public:
- ComponentInitLocker()
- {
+ ComponentInitLocker()
+ {
pthread_once(&sOnce, InitComponentInitLocker);
- pthread_mutex_lock(&sComponentOpenMutex);
+ pthread_mutex_lock(&sComponentOpenMutex);
mPreviousNewInstanceType = ComponentBase::sNewInstanceType;
}
- ~ComponentInitLocker()
- {
+ ~ComponentInitLocker()
+ {
ComponentBase::sNewInstanceType = mPreviousNewInstanceType;
- pthread_mutex_unlock(&sComponentOpenMutex);
+ pthread_mutex_unlock(&sComponentOpenMutex);
}
// There are situations (11844772) where we need to be able to release the lock early.
@@ -190,7 +190,7 @@ public:
}
~Unlocker()
{
- pthread_mutex_lock(&sComponentOpenMutex);
+ pthread_mutex_lock(&sComponentOpenMutex);
}
};
@@ -198,7 +198,7 @@ private:
static pthread_mutex_t sComponentOpenMutex;
static pthread_once_t sOnce;
static void InitComponentInitLocker();
-
+
#elif TARGET_OS_WIN32
public:
bool sNeedsUnlocking;
@@ -207,12 +207,12 @@ public:
private:
static CAGuard sComponentOpenGuard;
#endif
-
+
private:
ComponentBase::EInstanceType mPreviousNewInstanceType;
};
-/*! @class AudioComponentPlugInInstance */
+/*! @class AudioComponentPlugInInstance */
struct AudioComponentPlugInInstance {
AudioComponentPlugInInterface mPlugInInterface;
void * (*mConstruct)(void *memory, AudioComponentInstance ci);
@@ -222,7 +222,7 @@ struct AudioComponentPlugInInstance {
// this member is just a placeholder. it is aligned to a 16byte boundary
};
-/*! @class APFactory */
+/*! @class APFactory */
template <class APMethodLookup, class Implementor>
class APFactory {
public:
@@ -230,7 +230,7 @@ public:
{
return new(memory) Implementor(compInstance);
}
-
+
static void Destruct(void *memory)
{
((Implementor *)memory)->~Implementor();
@@ -240,7 +240,7 @@ public:
// The actual implementation object is not created until Open().
static AudioComponentPlugInInterface *Factory(const AudioComponentDescription * /* inDesc */)
{
- AudioComponentPlugInInstance *acpi =
+ AudioComponentPlugInInstance *acpi =
(AudioComponentPlugInInstance *)malloc( offsetof(AudioComponentPlugInInstance, mInstanceStorage) + sizeof(Implementor) );
acpi->mPlugInInterface.Open = ComponentBase::AP_Open;
acpi->mPlugInInterface.Close = ComponentBase::AP_Close;
@@ -252,17 +252,17 @@ public:
acpi->mPad[1] = NULL;
return (AudioComponentPlugInInterface*)acpi;
}
-
+
// This is for runtime registration (not for plug-ins loaded from bundles).
static AudioComponent Register(UInt32 type, UInt32 subtype, UInt32 manuf, CFStringRef name, UInt32 vers, UInt32 flags=0)
{
AudioComponentDescription desc = { type, subtype, manuf, flags, 0 };
- return AudioComponentRegister(&desc, name, vers, Factory);
+ return AudioComponentRegister(&desc, name, vers, Factory);
}
};
#if !CA_USE_AUDIO_PLUGIN_ONLY
-/*! @class ComponentEntryPoint
+/*! @class ComponentEntryPoint
* @discussion This is only used for a component manager version
*/
template <class Class>
@@ -272,7 +272,7 @@ public:
static OSStatus Dispatch(ComponentParameters *params, Class *obj)
{
OSStatus result = noErr;
-
+
try {
if (params->what == kComponentOpenSelect) {
// solve a host of initialization thread safety issues.
@@ -283,16 +283,16 @@ public:
Class *This = new Class((AudioComponentInstance)ci);
This->PostConstructor(); // allows base class to do additional initialization
// once the derived class is fully constructed
-
+
CMgr_SetComponentInstanceStorage(ci, (Handle)This);
} else
result = Class::ComponentEntryDispatch(params, obj);
}
COMPONENT_CATCH
-
+
return result;
}
-
+
/*! @method Register */
static Component Register(OSType compType, OSType subType, OSType manufacturer)
{
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp
index 3324753..d3394ee 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp
@@ -2,14 +2,14 @@
File: AUCarbonViewBase.cpp
Abstract: AUCarbonViewBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUCarbonViewBase.h"
#include "AUCarbonViewControl.h"
@@ -59,11 +59,11 @@ AUCarbonViewBase::AUCarbonViewBase(AudioUnitCarbonView inInstance, Float32 inNot
mTimerUPP (NULL),
mCarbonWindow(NULL),
mCarbonPane(NULL),
- mXOffset(0),
+ mXOffset(0),
mYOffset(0)
{
AUEventListenerCreate (ParameterListener, this,
- CFRunLoopGetCurrent(), kCFRunLoopCommonModes,
+ CFRunLoopGetCurrent(), kCFRunLoopCommonModes,
inNotificationInterval, inNotificationInterval,
&mParameterListener);
}
@@ -82,12 +82,12 @@ AUCarbonViewBase::~AUCarbonViewBase()
if (mTimerRef)
::RemoveEventLoopTimer (mTimerRef);
-
+
if (mTimerUPP)
DisposeEventLoopTimerUPP (mTimerUPP);
#endif
}
-
+
void AUCarbonViewBase::AddControl(AUCarbonViewControl *control)
{
ControlList::iterator it = find(mControlList.begin(), mControlList.end(), control);
@@ -126,7 +126,7 @@ void AUCarbonViewBase::ParameterListener(void * inCallbackRefCon,
}
}
-
+
OSStatus AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef inWindow, ControlRef inParentControl, const Float32Point &inLocation, const Float32Point &inSize, ControlRef &outParentControl)
{
#if !__LP64__
@@ -140,19 +140,19 @@ OSStatus AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef i
Rect area;
area.left = short(inLocation.x); area.top = short(inLocation.y);
area.right = short(area.left + inSize.x); area.bottom = short(area.top + inSize.y);
- OSStatus err = ::CreateUserPaneControl(inWindow, &area,
+ OSStatus err = ::CreateUserPaneControl(inWindow, &area,
kControlSupportsEmbedding,
&mCarbonPane); // subclass can resize mCarbonPane to taste
verify_noerr(err);
if (err) return err;
outParentControl = mCarbonPane;
-
+
// register for mouse-down in our pane -- we want to clear focus
EventTypeSpec paneEvents[] = {
{ kEventClassControl, kEventControlClick }
};
WantEventTypes(GetControlEventTarget(mCarbonPane), GetEventTypeCount(paneEvents), paneEvents);
-
+
if (IsCompositWindow()) {
verify_noerr(::HIViewAddSubview(inParentControl, mCarbonPane));
mXOffset = 0;
@@ -164,7 +164,7 @@ OSStatus AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef i
mYOffset = inLocation.y;
}
mBottomRight.h = mBottomRight.v = 0;
-
+
SizeControl(mCarbonPane, 0, 0);
if (err = CreateUI(mXOffset, mYOffset))
return err;
@@ -187,12 +187,12 @@ OSStatus AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef i
{ kEventClassScrollable, kEventScrollableGetInfo },
{ kEventClassScrollable, kEventScrollableScrollTo }
};
-
+
WantEventTypes(GetControlEventTarget(mCarbonPane), GetEventTypeCount(scrollEvents), scrollEvents);
-
+
mCurrentScrollPoint.x = mCurrentScrollPoint.y = 0.0f;
}
-
+
return err;
#else
return noErr;
@@ -212,10 +212,10 @@ OSStatus AUCarbonViewBase::EmbedControl(ControlRef ctl)
if (r.right > mBottomRight.h) mBottomRight.h = r.right;
if (r.bottom > mBottomRight.v) mBottomRight.v = r.bottom;
- if (IsCompositWindow())
+ if (IsCompositWindow())
return ::HIViewAddSubview(mCarbonPane, ctl);
- else
- return ::EmbedControl(ctl, mCarbonPane);
+ else
+ return ::EmbedControl(ctl, mCarbonPane);
#else
return noErr;
#endif
@@ -224,19 +224,19 @@ OSStatus AUCarbonViewBase::EmbedControl(ControlRef ctl)
void AUCarbonViewBase::AddCarbonControl(AUCarbonViewControl::ControlType type, const CAAUParameter ¶m, ControlRef control)
{
verify_noerr(EmbedControl(control));
-
+
AUCarbonViewControl *auvc = new AUCarbonViewControl(this, mParameterListener, type, param, control);
auvc->Bind();
AddControl(auvc);
}
bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event)
-{
+{
#if !__LP64__
UInt32 eclass = GetEventClass(event);
UInt32 ekind = GetEventKind(event);
ControlRef control;
-
+
switch (eclass) {
case kEventClassControl:
{
@@ -250,7 +250,7 @@ bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
}
}
break;
-
+
case kEventClassScrollable:
{
switch (ekind) {
@@ -262,7 +262,7 @@ bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
*/
HISize originalSize = { mBottomRight.h, mBottomRight.v };
verify_noerr(SetEventParameter(event, kEventParamImageSize, typeHISize, sizeof(HISize), &originalSize));
-
+
// [2/4]
/* <-- kEventParamViewSize (out, typeHISize)
* On exit, contains the amount of the scrollable view that is
@@ -274,7 +274,7 @@ bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
//HISize windowSize = { float(windowBounds.right - windowBounds.left),
// float(windowBounds.bottom - windowBounds.top) };
verify_noerr(SetEventParameter(event, kEventParamViewSize, typeHISize, sizeof(HISize), &(parentBounds.size)));
-
+
// [3/4]
/* <-- kEventParamLineSize (out, typeHISize)
* On exit, contains the amount that should be scrolled in
@@ -282,7 +282,7 @@ bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
*/
HISize scrollIncrementSize = { 16.0f, float(20) };
verify_noerr(SetEventParameter(event, kEventParamLineSize, typeHISize, sizeof(HISize), &scrollIncrementSize));
-
+
// [4/4]
/* <-- kEventParamOrigin (out, typeHIPoint)
* On exit, contains the scrollable viewÕs current origin (the
@@ -294,17 +294,17 @@ bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
verify_noerr(SetEventParameter(event, kEventParamOrigin, typeHIPoint, sizeof(HIPoint), &mCurrentScrollPoint));
}
return true;
-
+
case kEventScrollableScrollTo:
{
/*
* kEventClassScrollable / kEventScrollableScrollTo
- *
+ *
* Summary:
* Requests that an HIScrollViewÕs scrollable view should scroll to
* a particular origin.
*/
-
+
/* --> kEventParamOrigin (in, typeHIPoint)
* The new origin for the scrollable view. The origin
* coordinates will vary from (0,0) to scrollable viewÕs image
@@ -312,24 +312,24 @@ bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
*/
HIPoint pointToScrollTo;
verify_noerr(GetEventParameter(event, kEventParamOrigin, typeHIPoint, NULL, sizeof(HIPoint), NULL, &pointToScrollTo));
-
+
float xDelta = mCurrentScrollPoint.x - pointToScrollTo.x;
float yDelta = mCurrentScrollPoint.y - pointToScrollTo.y;
// move visible portion the appropriate amount
verify_noerr(HIViewScrollRect(mCarbonPane, NULL, xDelta, yDelta));
// set new content to be drawn
verify_noerr(HIViewSetBoundsOrigin(mCarbonPane, pointToScrollTo.x, pointToScrollTo.y));
-
+
mCurrentScrollPoint = pointToScrollTo;
}
return true;
-
+
default:
break;
}
}
break;
-
+
default:
break;
}
@@ -352,7 +352,7 @@ void AUCarbonViewBase::TellListener (const CAAUParameter &auvp, AudioUnitCarbonV
} else {
auEvent.mEventType = kAudioUnitEvent_EndParameterChangeGesture;
}
- AUEventListenerNotify(mParameterListener, this, &auEvent);
+ AUEventListenerNotify(mParameterListener, this, &auEvent);
}
@@ -370,34 +370,34 @@ pascal void AUCarbonViewBase::TheTimerProc (EventLoopTimerRef inTimer, void *in
This->RespondToEventTimer (inTimer);
}
-void AUCarbonViewBase::RespondToEventTimer (EventLoopTimerRef inTimer)
+void AUCarbonViewBase::RespondToEventTimer (EventLoopTimerRef inTimer)
{}
-/*
+/*
THESE are reasonable values for these two times
- 0.005 // delay
+ 0.005 // delay
0.050 // interval
*/
-OSStatus AUCarbonViewBase::CreateEventLoopTimer (Float32 inDelay, Float32 inInterval)
+OSStatus AUCarbonViewBase::CreateEventLoopTimer (Float32 inDelay, Float32 inInterval)
{
if (mTimerUPP)
return noErr;
-
+
mTimerUPP = NewEventLoopTimerUPP(TheTimerProc);
-
+
EventLoopRef mainEventLoop = GetMainEventLoop();
-
+
//doesn't seem to like too small a value
if (inDelay < 0.005)
inDelay = 0.005;
-
+
OSStatus timerResult = ::InstallEventLoopTimer(
mainEventLoop,
inDelay,
inInterval,
mTimerUPP,
this,
- &mTimerRef);
+ &mTimerRef);
return timerResult;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h
index 910e53f..0afc5fc 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h
@@ -2,14 +2,14 @@
File: AUCarbonViewBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUCarbonViewBase_h__
#define __AUCarbonViewBase_h__
@@ -62,7 +62,7 @@ public:
Float32 inNotificationInterval = kDefaultNotificationInterval /* in seconds */);
/*! @dtor ~AUCarbonViewBase */
virtual ~AUCarbonViewBase();
-
+
// AUViewBase overrides
/*! @method CreateCarbonView */
virtual OSStatus CreateCarbonView (AudioUnit inAudioUnit, WindowRef inWindow, ControlRef inParentControl, const Float32Point &inLocation, const Float32Point &inSize, ControlRef &outParentControl);
@@ -73,7 +73,7 @@ public:
/*! @method HandleEvent */
virtual bool HandleEvent (EventHandlerCallRef inHandlerRef, EventRef event);
-
+
/*! @method GetEditAudioUnit */
const AudioUnit GetEditAudioUnit () const { return mEditAudioUnit; }
//
@@ -84,8 +84,8 @@ public:
/*! @method AddCarbonControl */
void AddCarbonControl (
- AUCarbonViewControl::ControlType type,
- const CAAUParameter & param,
+ AUCarbonViewControl::ControlType type,
+ const CAAUParameter & param,
ControlRef control);
/*! @method GetCarbonWindow */
@@ -94,27 +94,27 @@ public:
ControlRef GetCarbonPane () { return mCarbonPane; }
/*! @method EmbedControl */
OSStatus EmbedControl (ControlRef ctl);
-
+
/*! @method TellListener */
void TellListener (const CAAUParameter &auvp, AudioUnitCarbonViewEventID event, void *evpar);
-
+
// pass in true if wanting an update to the view and you're calling this from a thread
// that is safe to do UI in.
// If you don't know, pass in false!
/*! @method Update */
void Update (bool inUIThread);
-
+
/*! @method GetXOffset */
Float32 GetXOffset () { return mXOffset; }
/*! @method GetYOffset */
Float32 GetYOffset () { return mYOffset; }
-
+
/*! @method ClearControls */
void ClearControls ();
-
+
/*! @method IsCompositWindow */
bool IsCompositWindow () const { return mCompositWindow; }
-
+
protected:
#if !__LP64__
/*! @method SetEventListener */
@@ -131,15 +131,15 @@ protected:
void RemoveControl (AUCarbonViewControl *control);
OSStatus CreateEventLoopTimer (Float32 inDelay, Float32 inInterval);
-
+
/*! @method ParameterListener */
static void ParameterListener (void * inCallbackRefCon,
void * inObject,
const AudioUnitEvent * inEvent,
UInt64 inEventHostTime,
Float32 inParameterValue);
-
- static pascal void TheTimerProc ( EventLoopTimerRef inTimer,
+
+ static pascal void TheTimerProc ( EventLoopTimerRef inTimer,
void * inUserData);
virtual void RespondToEventTimer (EventLoopTimerRef inTimer);
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp
index 981347b..c22c50c 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp
@@ -2,14 +2,14 @@
File: AUCarbonViewControl.cpp
Abstract: AUCarbonViewControl.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUCarbonViewControl.h"
#include "AUCarbonViewBase.h"
@@ -74,11 +74,11 @@ void AUCarbonViewControl::Bind()
mInControlInitialization = 1; // true
AUListenerAddParameter(mListener, this, &mParam);
// will cause an almost-immediate callback
-
+
EventTypeSpec events[] = {
{ kEventClassControl, kEventControlValueFieldChanged } // N.B. OS X only
};
-
+
WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
if (mType == kTypeContinuous || mType == kTypeText || mType == kTypeDiscrete) {
@@ -88,18 +88,18 @@ void AUCarbonViewControl::Bind()
{ kEventClassControl, kEventControlTrack }
};
WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
- }
+ }
if (mType == kTypeText) {
EventTypeSpec events[] = {
{ kEventClassControl, kEventControlSetFocusPart }
};
- WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
+ WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
ControlKeyFilterUPP proc = mParam.ValuesHaveStrings() ? StdKeyFilterCallback : NumericKeyFilterCallback;
// this will fail for a static text field
SetControlData(mControl, 0, kControlEditTextKeyFilterTag, sizeof(proc), &proc);
}
-
+
Update(true);
mInControlInitialization = 0; // false
#endif
@@ -116,7 +116,7 @@ void AUCarbonViewControl::ParameterToControl(Float32 paramValue)
case kTypeDiscrete:
{
long value = long(paramValue);
-
+
// special case [1] -- menu parameters
if (mParam.HasNamedParams()) {
// if we're dealing with menus they behave differently!
@@ -124,17 +124,17 @@ void AUCarbonViewControl::ParameterToControl(Float32 paramValue)
// first menu item always reports a control value of 1
ControlKind ctrlKind;
if (GetControlKind(mControl, &ctrlKind) == noErr) {
- if ((ctrlKind.kind == kControlKindPopupArrow)
- || (ctrlKind.kind == kControlKindPopupButton))
+ if ((ctrlKind.kind == kControlKindPopupArrow)
+ || (ctrlKind.kind == kControlKindPopupButton))
{
value = value - long(mParam.ParamInfo().minValue) + 1;
}
}
}
-
+
// special case [2] -- Write-only boolean parameters
AudioUnitParameterInfo AUPI = mParam.ParamInfo();
-
+
bool isWriteOnlyBoolParameter = ( (AUPI.unit == kAudioUnitParameterUnit_Boolean) &&
(AUPI.flags & kAudioUnitParameterFlag_IsWritable) &&
!(AUPI.flags & kAudioUnitParameterFlag_IsReadable) );
@@ -148,7 +148,7 @@ void AUCarbonViewControl::ParameterToControl(Float32 paramValue)
CFStringRef cfstr = mParam.GetStringFromValueCopy(¶mValue);
if ( !(mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsWritable) //READ ONLY PARAMS
- && (mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsReadable))
+ && (mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsReadable))
{
if (mParam.GetParamTag()) {
CFMutableStringRef str = CFStringCreateMutableCopy(NULL, 256, cfstr);
@@ -184,7 +184,7 @@ void AUCarbonViewControl::ControlToParameter()
case kTypeDiscrete:
{
long value = GetValue();
-
+
// special case [1] -- Menus
if (mParam.HasNamedParams()) {
// if we're dealing with menus they behave differently!
@@ -192,24 +192,24 @@ void AUCarbonViewControl::ControlToParameter()
// first menu item always reports a control value of 1
ControlKind ctrlKind;
if (GetControlKind(mControl, &ctrlKind) == noErr) {
- if ((ctrlKind.kind == kControlKindPopupArrow)
- || (ctrlKind.kind == kControlKindPopupButton))
+ if ((ctrlKind.kind == kControlKindPopupArrow)
+ || (ctrlKind.kind == kControlKindPopupButton))
{
value = value + long(mParam.ParamInfo().minValue) - 1;
}
}
}
-
+
// special case [2] -- Write-only boolean parameters
AudioUnitParameterInfo AUPI = mParam.ParamInfo();
-
+
bool isWriteOnlyBoolParameter = ( (AUPI.unit == kAudioUnitParameterUnit_Boolean) &&
(AUPI.flags & kAudioUnitParameterFlag_IsWritable) &&
!(AUPI.flags & kAudioUnitParameterFlag_IsReadable) );
if (isWriteOnlyBoolParameter) {
value = 1;
}
-
+
mParam.SetValue (mListener, this, value);
}
break;
@@ -284,25 +284,25 @@ long AUCarbonViewControl::GetValue()
#endif
}
-/* Notes on event handling
-
+/* Notes on event handling
+
Button (Click and release on button)
kEventControlClick received
kEventControlTrack received
kEventControlValueFieldChanged received
kEventControlHit received
-
+
Button (Click and release outside of button bounds)
kEventControlClick received
kEventControlTrack received
-
+
Slider (Click, drag, and release)
kEventControlClick received
kEventControlTrack received
kEventControlValueFieldChanged received
kEventControlValueFieldChanged received
kEventControlHit received
-
+
Slider (Click, release without changing value)
kEventControlClick received
kEventControlTrack received
@@ -313,16 +313,16 @@ bool AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
UInt32 ekind = GetEventKind(event);
ControlRef control;
bool handled = true;
-
+
switch (eclass) {
case kEventClassControl:
{
AudioUnitParameterInfo AUPI = mParam.ParamInfo();
-
+
bool isWriteOnlyBoolParameter = ( (AUPI.unit == kAudioUnitParameterUnit_Boolean) &&
(AUPI.flags & kAudioUnitParameterFlag_IsWritable) &&
!(AUPI.flags & kAudioUnitParameterFlag_IsReadable) );
-
+
switch (ekind) {
case kEventControlSetFocusPart: // tab
handled = !handled; // fall through to next case
@@ -331,7 +331,7 @@ bool AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &control);
verify(control == mControl);
ControlToParameter();
- return handled;
+ return handled;
case kEventControlClick:
if (isWriteOnlyBoolParameter) {
GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &control);
@@ -341,7 +341,7 @@ bool AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
if (mLastControl != NULL) {
mLastControl->Update(false);
}
- mLastControl = this;
+ mLastControl = this;
}
mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseDownInControl, NULL);
break; // don't return true, continue normal processing
@@ -349,17 +349,17 @@ bool AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
if (mLastControl != this) {
if (mLastControl != NULL)
mLastControl->Update(false);
- mLastControl = this;
- }
+ mLastControl = this;
+ }
mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseUpInControl, NULL);
break; // don't return true, continue normal processing
- case kEventControlTrack:
+ case kEventControlTrack:
if (mLastControl != this) {
if (mLastControl != NULL)
mLastControl->Update(false);
- mLastControl = this;
+ mLastControl = this;
}
-
+
CallNextEventHandler(inHandlerRef, event);
ControlToParameter(); // new code
mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseUpInControl, NULL);
@@ -379,8 +379,8 @@ pascal void AUCarbonViewControl::SliderTrackProc(ControlRef theControl, ControlP
// AUCarbonViewControl *This = (AUCarbonViewControl *)GetControlReference(theControl);
}
-pascal ControlKeyFilterResult AUCarbonViewControl::StdKeyFilterCallback(ControlRef theControl,
- SInt16 *keyCode, SInt16 *charCode,
+pascal ControlKeyFilterResult AUCarbonViewControl::StdKeyFilterCallback(ControlRef theControl,
+ SInt16 *keyCode, SInt16 *charCode,
EventModifiers *modifiers)
{
#if !__LP64__
@@ -397,8 +397,8 @@ pascal ControlKeyFilterResult AUCarbonViewControl::StdKeyFilterCallback(ControlR
return kControlKeyFilterBlockKey;
}
-pascal ControlKeyFilterResult AUCarbonViewControl::NumericKeyFilterCallback(ControlRef theControl,
- SInt16 *keyCode, SInt16 *charCode,
+pascal ControlKeyFilterResult AUCarbonViewControl::NumericKeyFilterCallback(ControlRef theControl,
+ SInt16 *keyCode, SInt16 *charCode,
EventModifiers *modifiers)
{
#if !__LP64__
@@ -420,43 +420,43 @@ Boolean AUCarbonViewControl::SizeControlToFit(ControlRef inControl, SInt16 *outW
{
#if !__LP64__
if (inControl == 0) return false;
-
+
Boolean bValue = false;
// this only works on text controls -- returns an error for other controls, but doesn't do anything,
// so the error is irrelevant
SetControlData(inControl, kControlEntireControl, 'stim' /* kControlStaticTextIsMultilineTag */, sizeof(Boolean), &bValue);
-
+
SInt16 baseLineOffset;
Rect bestRect;
- OSErr err = GetBestControlRect(inControl, &bestRect, &baseLineOffset);
+ OSErr err = GetBestControlRect(inControl, &bestRect, &baseLineOffset);
if (err != noErr) return false;
-
+
int width = (bestRect.right - bestRect.left) + 1;
int height = (bestRect.bottom - bestRect.top) + 1;
-
+
Rect boundsRect;
GetControlBounds (inControl, &boundsRect);
-
+
Rect newRect;
newRect.top = boundsRect.top;
newRect.bottom = newRect.top + height;
newRect.left = boundsRect.left;
newRect.right = newRect.left + width;
-
+
SetControlBounds (inControl, &newRect);
-
+
if (outWidth)
*outWidth = width;
-
+
if (outHeight)
*outHeight = height;
-#endif
+#endif
return true;
}
#pragma mark ___AUPropertyControl
bool AUPropertyControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event)
-{
+{
UInt32 eclass = GetEventClass(event);
UInt32 ekind = GetEventKind(event);
switch (eclass) {
@@ -477,14 +477,14 @@ void AUPropertyControl::RegisterEvents ()
EventTypeSpec events[] = {
{ kEventClassControl, kEventControlValueFieldChanged } // N.B. OS X only
};
-
+
WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
#endif
}
-void AUPropertyControl::EmbedControl (ControlRef theControl)
-{
- mView->EmbedControl (theControl);
+void AUPropertyControl::EmbedControl (ControlRef theControl)
+{
+ mView->EmbedControl (theControl);
}
WindowRef AUPropertyControl::GetCarbonWindow()
@@ -498,11 +498,11 @@ static CFStringRef kStringFactoryPreset = kAUViewLocalizedStringKey_FactoryPrese
static bool sAUVPresetLocalized = false;
#endif
-AUVPresets::AUVPresets (AUCarbonViewBase* inParentView,
+AUVPresets::AUVPresets (AUCarbonViewBase* inParentView,
CFArrayRef& inPresets,
- Point inLocation,
- int nameWidth,
- int controlWidth,
+ Point inLocation,
+ int nameWidth,
+ int controlWidth,
ControlFontStyleRec & inFontStyle)
: AUPropertyControl (inParentView),
mPresets (inPresets),
@@ -510,13 +510,13 @@ AUVPresets::AUVPresets (AUCarbonViewBase* inParentView,
{
#if !__LP64__
Rect r;
-
+
// ok we now have an array of factory presets
// get their strings and display them
r.top = inLocation.v; r.bottom = r.top;
r.left = inLocation.h; r.right = r.left;
-
+
// localize as necessary
if (!sAUVPresetLocalized) {
CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(kLocalizedStringBundle_AUView);
@@ -527,86 +527,86 @@ AUVPresets::AUVPresets (AUCarbonViewBase* inParentView,
sAUVPresetLocalized = true;
}
}
-
+
// create localized title string
CFMutableStringRef factoryPresetsTitle = CFStringCreateMutable(NULL, 0);
CFStringAppend(factoryPresetsTitle, kStringFactoryPreset);
CFStringAppend(factoryPresetsTitle, kAUViewUnlocalizedString_TitleSeparator);
-
+
ControlRef theControl;
verify_noerr(CreateStaticTextControl(mView->GetCarbonWindow(), &r, factoryPresetsTitle, &inFontStyle, &theControl));
SInt16 width = 0;
AUCarbonViewControl::SizeControlToFit(theControl, &width, &mHeight);
CFRelease(factoryPresetsTitle);
EmbedControl(theControl);
-
+
r.top -= 2;
r.left += width + 10;
r.right = r.left;
r.bottom = r.top;
-
- verify_noerr(CreatePopupButtonControl ( mView->GetCarbonWindow(), &r, NULL,
+
+ verify_noerr(CreatePopupButtonControl ( mView->GetCarbonWindow(), &r, NULL,
-12345, // DON'T GET MENU FROM RESOURCE mMenuID,!!!
- FALSE, // variableWidth,
- 0, // titleWidth,
- 0, // titleJustification,
- 0, // titleStyle,
+ FALSE, // variableWidth,
+ 0, // titleWidth,
+ 0, // titleJustification,
+ 0, // titleStyle,
&mControl));
-
+
MenuRef menuRef;
verify_noerr(CreateNewMenu(1, 0, &menuRef));
-
+
int numPresets = CFArrayGetCount(mPresets);
-
+
for (int i = 0; i < numPresets; ++i)
{
AUPreset* preset = (AUPreset*) CFArrayGetValueAtIndex (mPresets, i);
verify_noerr(AppendMenuItemTextWithCFString (menuRef, preset->presetName, 0, 0, 0));
}
-
+
verify_noerr(SetControlData(mControl, 0, kControlPopupButtonMenuRefTag, sizeof(menuRef), &menuRef));
verify_noerr (SetControlFontStyle (mControl, &inFontStyle));
-
+
SetControl32BitMaximum (mControl, numPresets);
-
+
// size popup
SInt16 height = 0;
-
+
AUCarbonViewControl::SizeControlToFit(mControl, &width, &height);
-
+
if (height > mHeight) mHeight = height;
if (mHeight < 0) mHeight = 0;
-
+
// find which menu item is the Default preset
UInt32 propertySize = sizeof(AUPreset);
AUPreset defaultPreset;
- OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(),
+ OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(),
kAudioUnitProperty_PresentPreset,
- kAudioUnitScope_Global,
- 0,
- &defaultPreset,
+ kAudioUnitScope_Global,
+ 0,
+ &defaultPreset,
&propertySize);
-
+
mPropertyID = kAudioUnitProperty_PresentPreset;
-#endif
+#endif
#ifndef __LP64__
if (result != noErr) { // if the PresentPreset property is not implemented, fall back to the CurrentPreset property
- OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(),
+ OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(),
kAudioUnitProperty_CurrentPreset,
- kAudioUnitScope_Global,
- 0,
- &defaultPreset,
+ kAudioUnitScope_Global,
+ 0,
+ &defaultPreset,
&propertySize);
mPropertyID = kAudioUnitProperty_CurrentPreset;
if (result == noErr)
CFRetain (defaultPreset.presetName);
- }
+ }
#endif
-#if !__LP64__
+#if !__LP64__
EmbedControl (mControl);
-
+
HandlePropertyChange(defaultPreset);
-
+
RegisterEvents();
#endif
}
@@ -620,7 +620,7 @@ void AUVPresets::AddInterest (AUEventListenerRef inListener,
e.mArgument.mProperty.mPropertyID = mPropertyID;
e.mArgument.mProperty.mScope = kAudioUnitScope_Global;
e.mArgument.mProperty.mElement = 0;
-
+
AUEventListenerAddEventType(inListener, inObject, &e);
}
@@ -644,14 +644,14 @@ void AUVPresets::HandleControlChange ()
if (i > 0)
{
AUPreset* preset = (AUPreset*) CFArrayGetValueAtIndex (mPresets, i-1);
-
- verify_noerr(AudioUnitSetProperty (mView->GetEditAudioUnit(),
+
+ verify_noerr(AudioUnitSetProperty (mView->GetEditAudioUnit(),
mPropertyID, // either currentPreset or PresentPreset depending on which is supported
- kAudioUnitScope_Global,
- 0,
- preset,
+ kAudioUnitScope_Global,
+ 0,
+ preset,
sizeof(AUPreset)));
-
+
// when we change a preset we can't expect the AU to update its state
// as it isn't meant to know that its being viewed!
// so we broadcast a notification to all listeners that all parameters on this AU have changed
@@ -663,12 +663,12 @@ void AUVPresets::HandleControlChange ()
#endif
}
-void AUVPresets::HandlePropertyChange(AUPreset &preset)
+void AUVPresets::HandlePropertyChange(AUPreset &preset)
{
#if !__LP64__
// check to see if the preset is in our menu
int numPresets = CFArrayGetCount(mPresets);
- if (preset.presetNumber < 0) {
+ if (preset.presetNumber < 0) {
SetControl32BitValue (mControl, 0); //controls are one-based
} else {
for (SInt32 i = 0; i < numPresets; ++i) {
@@ -679,7 +679,7 @@ void AUVPresets::HandlePropertyChange(AUPreset &preset)
}
}
}
-
+
if (preset.presetName)
CFRelease (preset.presetName);
#endif
@@ -687,16 +687,16 @@ void AUVPresets::HandlePropertyChange(AUPreset &preset)
bool AUVPresets::HandlePropertyChange (const AudioUnitProperty &inProp)
{
- if (inProp.mPropertyID == mPropertyID)
+ if (inProp.mPropertyID == mPropertyID)
{
UInt32 theSize = sizeof(AUPreset);
AUPreset currentPreset;
-
- OSStatus result = AudioUnitGetProperty(inProp.mAudioUnit,
- inProp.mPropertyID,
- inProp.mScope,
+
+ OSStatus result = AudioUnitGetProperty(inProp.mAudioUnit,
+ inProp.mPropertyID,
+ inProp.mScope,
inProp.mElement, ¤tPreset, &theSize);
-
+
if (result == noErr) {
#ifndef __LP64__
if (inProp.mPropertyID == kAudioUnitProperty_CurrentPreset && currentPreset.presetName)
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h
index 3d5f975..b22e992 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h
@@ -2,14 +2,14 @@
File: AUCarbonViewControl.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUCarbonViewControl_h__
#define __AUCarbonViewControl_h__
@@ -69,7 +69,7 @@ public:
kTypeDiscrete, // e.g. pop-up menu
kTypeText
};
-
+
AUCarbonViewControl(AUCarbonViewBase *ownerView, AUParameterListenerRef listener, ControlType type, const CAAUParameter ¶m, ControlRef control);
~AUCarbonViewControl();
@@ -80,7 +80,7 @@ public:
virtual void ControlToParameter();
/*! @method ParameterToControl */
virtual void ParameterToControl(Float32 newValue);
-
+
/*! @method SetValueFract */
virtual void SetValueFract(double value);
/*! @method GetValueFract */
@@ -93,34 +93,34 @@ public:
virtual void SetValue(long value);
/*! @method GetValue */
virtual long GetValue();
-
+
/*! @method GetOwnerView */
AUCarbonViewBase * GetOwnerView() {return mOwnerView;}
/*! @method Update */
- void Update (bool inUIThread)
- {
+ void Update (bool inUIThread)
+ {
if (inUIThread)
ParameterToControl (mParam.GetValue());
else
AUParameterListenerNotify (mListener, this, &mParam);
}
-
-
+
+
// CarbonEventHandler overrides
/*! @method HandleEvent */
virtual bool HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event);
-
+
/*! @method ControlRef */
operator ControlRef() { return mControl; }
-
+
/*! @method SizeControlToFit */
static Boolean SizeControlToFit(ControlRef inControl, SInt16 *outWidth = NULL, SInt16 *outHeight = NULL);
-
+
/*! @method SliderTrackProc */
static pascal void SliderTrackProc(ControlRef theControl, ControlPartCode partCode);
/*! @method NumericKeyFilterCallback */
- static pascal ControlKeyFilterResult NumericKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode,
+ static pascal ControlKeyFilterResult NumericKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode,
EventModifiers *modifiers);
protected:
/*! @method ParamInfo */
@@ -137,12 +137,12 @@ protected:
/*! @var mControl */
ControlRef mControl;
-
+
/*! @method StdKeyFilterCallback */
- static pascal ControlKeyFilterResult StdKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode,
+ static pascal ControlKeyFilterResult StdKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode,
EventModifiers *modifiers);
SInt16 mInControlInitialization;
-
+
static AUCarbonViewControl* mLastControl;
};
@@ -151,34 +151,34 @@ class AUPropertyControl : public CarbonEventHandler {
public:
/*! @ctor AUPropertyControl */
AUPropertyControl (AUCarbonViewBase * inBase) : mControl(0), mView (inBase), mHeight(0) {}
-
+
/*! @method HandleEvent */
virtual bool HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event);
/*! @method HandlePropertyChange */
virtual bool HandlePropertyChange (const AudioUnitProperty &inProp) = 0;
-
+
/*! @method AddInterest */
virtual void AddInterest (AUEventListenerRef inListener,
void * inObject) = 0;
-
+
/*! @method RemoveInterest */
virtual void RemoveInterest (AUEventListenerRef inListener,
void * inObject) = 0;
-
+
/*! @method GetHeight */
int GetHeight() { return mHeight;}
-
+
protected:
/*! @method HandleControlChange */
- virtual void HandleControlChange () = 0;
+ virtual void HandleControlChange () = 0;
/*! @method RegisterEvents */
void RegisterEvents ();
/*! @method EmbedControl */
void EmbedControl (ControlRef theControl);
-
+
/*! @method GetCarbonWindow */
WindowRef GetCarbonWindow();
@@ -194,30 +194,30 @@ protected:
class AUVPresets : public AUPropertyControl {
public:
/*! @ctor HandleControlChange */
- AUVPresets (AUCarbonViewBase * inBase,
+ AUVPresets (AUCarbonViewBase * inBase,
CFArrayRef& inPresets,
- Point inLocation,
- int nameWidth,
- int controlWidth,
+ Point inLocation,
+ int nameWidth,
+ int controlWidth,
ControlFontStyleRec & inFontStyle);
virtual ~AUVPresets () { CFRelease (mPresets); }
/*! @method HandlePropertyChange */
virtual bool HandlePropertyChange (const AudioUnitProperty &inProp);
-
+
/*! @method AddInterest */
virtual void AddInterest (AUEventListenerRef inListener,
void * inObject);
-
+
/*! @method RemoveInterest */
virtual void RemoveInterest (AUEventListenerRef inListener,
void * inObject);
protected:
/*! @method HandleControlChange */
- virtual void HandleControlChange ();
-
+ virtual void HandleControlChange ();
+
/*! @var mPresets */
CFArrayRef mPresets;
/*! @var mView */
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp
index 15a04e8..2762a67 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp
@@ -2,14 +2,14 @@
File: AUCarbonViewDispatch.cpp
Abstract: AUCarbonViewDispatch.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUCarbonViewBase.h"
@@ -93,7 +93,7 @@ OSStatus AUCarbonViewBase::ComponentEntryDispatch(ComponentParameters *p, AUCar
if (This == NULL) return paramErr;
OSStatus result = noErr;
-
+
switch (p->what) {
case kAudioUnitCarbonViewCreateSelect:
{
@@ -104,7 +104,7 @@ OSStatus AUCarbonViewBase::ComponentEntryDispatch(ComponentParameters *p, AUCar
CheckNull(pb->inSize);
CheckNull(pb->inLocation);
CheckNull(pb->outControl);
- result = This->CreateCarbonView(pb->inAudioUnit, pb->inWindow, pb->inParentControl,
+ result = This->CreateCarbonView(pb->inAudioUnit, pb->inWindow, pb->inParentControl,
*pb->inLocation, *pb->inSize, *pb->outControl);
}
break;
@@ -116,7 +116,7 @@ OSStatus AUCarbonViewBase::ComponentEntryDispatch(ComponentParameters *p, AUCar
}
break;
#endif
-
+
default:
result = ComponentBase::ComponentEntryDispatch(p, This);
break;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp
index 8976b40..d0b7b41 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp
@@ -2,14 +2,14 @@
File: AUControlGroup.cpp
Abstract: AUControlGroup.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include <Carbon/Carbon.h>
#include "AUCarbonViewBase.h"
@@ -59,10 +59,10 @@ static bool sLocalized = false;
#endif
void AUControlGroup::CreateLabelledSlider(
- AUCarbonViewBase * auView,
- const CAAUParameter & auvp,
- const Rect & area,
- Point labelSize,
+ AUCarbonViewBase * auView,
+ const CAAUParameter & auvp,
+ const Rect & area,
+ Point labelSize,
const ControlFontStyleRec & inFontStyle)
{
#if !__LP64__
@@ -73,14 +73,14 @@ void AUControlGroup::CreateLabelledSlider(
CFStringRef cfstr;
int sliderValueMax, sliderValueMin, sliderValueDefault;
AUCarbonViewControl::ControlType sliderType;
-
+
bool horizontal = (width > height);
if (horizontal) {
maxValRect.top = minValRect.top = area.top + (height - labelSize.v) / 2;
minValRect.left = area.left;
maxValRect.left = area.right - labelSize.h;
-
+
minValRect.bottom = minValRect.top + labelSize.v;
minValRect.right = minValRect.left + labelSize.h;
maxValRect.bottom = maxValRect.top + labelSize.v;
@@ -104,12 +104,12 @@ void AUControlGroup::CreateLabelledSlider(
maxValRect.left = minValRect.left = area.left + (width - labelSize.h) / 2;
maxValRect.top = area.top;
minValRect.top = area.bottom - labelSize.v;
-
+
minValRect.bottom = minValRect.top + labelSize.v;
minValRect.right = minValRect.left + labelSize.h;
maxValRect.bottom = maxValRect.top + labelSize.v;
maxValRect.right = maxValRect.left + labelSize.h;
-
+
sliderRect.left = area.left + (width - kSliderThinDimension) / 2;
sliderRect.right = sliderRect.left + kSliderThinDimension + 4;
sliderRect.top = maxValRect.bottom + kLabelAndSliderSpacing;
@@ -117,7 +117,7 @@ void AUControlGroup::CreateLabelledSlider(
if (auvp.IsIndexedParam ()) {
sliderValueMin = sliderValueDefault = int(auvp.ParamInfo().minValue);
- sliderValueMax = int(auvp.ParamInfo().maxValue);
+ sliderValueMax = int(auvp.ParamInfo().maxValue);
sliderType = AUCarbonViewControl::kTypeDiscrete;
} else {
sliderValueMin = sliderValueDefault = 0;
@@ -134,7 +134,7 @@ void AUControlGroup::CreateLabelledSlider(
verify_noerr(CreateStaticTextControl(auView->GetCarbonWindow(), &minValRect, cfstr, &fontStyle, &newControl));
CFRelease(cfstr);
verify_noerr(auView->EmbedControl(newControl));
-
+
// maximum value label
cfstr = auvp.GetStringFromValueCopy(&auvp.ParamInfo().maxValue);
fontStyle.just = horizontal ? teFlushLeft : teCenter;
@@ -142,7 +142,7 @@ void AUControlGroup::CreateLabelledSlider(
CFRelease(cfstr);
verify_noerr(auView->EmbedControl(newControl));
}
-
+
// slider
verify_noerr(CreateSliderControl(auView->GetCarbonWindow(), &sliderRect, sliderValueDefault, sliderValueMin, sliderValueMax, kControlSliderDoesNotPoint, 0, true, AUCarbonViewControl::SliderTrackProc, &newControl));
@@ -154,10 +154,10 @@ void AUControlGroup::CreateLabelledSlider(
}
void AUControlGroup::CreateLabelledSliderAndEditText(
- AUCarbonViewBase * auView,
- const CAAUParameter & auvp,
- const Rect & area,
- Point labelSize,
+ AUCarbonViewBase * auView,
+ const CAAUParameter & auvp,
+ const Rect & area,
+ Point labelSize,
Point editTextSize,
const ControlFontStyleRec & inFontStyle)
{
@@ -166,7 +166,7 @@ void AUControlGroup::CreateLabelledSliderAndEditText(
Rect sliderArea, textArea;
ControlRef newControl;
int width = area.right - area.left, height = area.bottom - area.top;
-
+
bool horizontal = (width > height);
sliderArea = area;
@@ -188,55 +188,55 @@ void AUControlGroup::CreateLabelledSliderAndEditText(
textArea.right = textArea.left + editTextSize.h;
}
CreateLabelledSlider(auView, auvp, sliderArea, labelSize, fontStyle);
-
- verify_noerr(CreateEditUnicodeTextControl(auView->GetCarbonWindow(), &textArea, CFSTR(""), false,
+
+ verify_noerr(CreateEditUnicodeTextControl(auView->GetCarbonWindow(), &textArea, CFSTR(""), false,
&fontStyle, &newControl));
auView->AddCarbonControl(AUCarbonViewControl::kTypeText, auvp, newControl);
#endif
}
-void AUControlGroup::CreatePopupMenu (AUCarbonViewBase * auView,
- const CAAUParameter & auvp,
- const Rect & area,
+void AUControlGroup::CreatePopupMenu (AUCarbonViewBase * auView,
+ const CAAUParameter & auvp,
+ const Rect & area,
const ControlFontStyleRec & inFontStyle,
const bool inSizeToFit)
{
#if !__LP64__
ControlRef thePopUp;
-
- verify_noerr(CreatePopupButtonControl (auView->GetCarbonWindow(), &area, NULL,
+
+ verify_noerr(CreatePopupButtonControl (auView->GetCarbonWindow(), &area, NULL,
-12345, // DON'T GET MENU FROM RESOURCE mMenuID
- FALSE, // variableWidth,
- 0, // titleWidth,
- 0, // titleJustification,
- 0, // titleStyle,
+ FALSE, // variableWidth,
+ 0, // titleWidth,
+ 0, // titleJustification,
+ 0, // titleStyle,
&thePopUp));
-
+
ControlSize small = kControlSizeSmall;
SetControlData(thePopUp, kControlEntireControl, kControlSizeTag, sizeof(ControlSize), &small);
-
+
MenuRef menuRef;
verify_noerr(CreateNewMenu( 1, 0, &menuRef));
-
+
for (int i = 0; i < auvp.GetNumIndexedParams(); ++i) {
verify_noerr(AppendMenuItemTextWithCFString (menuRef, auvp.GetParamName(i), kMenuItemAttrIgnoreMeta, 0, 0));
}
-
+
verify_noerr(SetControlData(thePopUp, 0, kControlPopupButtonMenuRefTag, sizeof(menuRef), &menuRef));
SetControl32BitMaximum(thePopUp, auvp.GetNumIndexedParams());
verify_noerr (SetControlFontStyle (thePopUp, &inFontStyle));
-
+
if (inSizeToFit) {
AUCarbonViewControl::SizeControlToFit(thePopUp);
}
-
+
auView->AddCarbonControl(AUCarbonViewControl::kTypeDiscrete, auvp, thePopUp);
#endif
}
-void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
- const Point & inLocation,
+void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
+ const Point & inLocation,
const SInt16 inRightOffset,
const SInt16 inTotalWidth)
{
@@ -245,14 +245,14 @@ void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
ComponentDescription desc;
Handle h1 = NewHandleClear(4);
OSStatus err = GetComponentInfo ((Component)auView->GetEditAudioUnit(), &desc, h1, 0, 0);
-
- if (err == noErr) {
+
+ if (err == noErr) {
// Get the manufacturer's name... look for the ':' character convention
HLock(h1);
char* ptr1 = *h1;
int len = *ptr1++;
char* displayStr = 0;
-
+
for (int i = 0; i < len; ++i) {
if (ptr1[i] == ':') { // found the name
ptr1[i++] = 0;
@@ -260,7 +260,7 @@ void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
break;
}
}
-
+
// localize as necessary:
if (!sLocalized) {
CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(kLocalizedStringBundle_AUView);
@@ -271,7 +271,7 @@ void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
sLocalized = true;
}
}
-
+
// display strings
ControlRef newControl;
Rect r;
@@ -279,7 +279,7 @@ void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
ControlFontStyleRec fontStyle;
fontStyle.flags = kControlUseFontMask | kControlUseJustMask;
fontStyle.font = kControlFontSmallBoldSystemFont;
-
+
// display manufacturer string
if (displayStr) {
CFMutableStringRef mfrstring = CFStringCreateMutable(NULL, 0);
@@ -291,15 +291,15 @@ void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
CFStringAppend(mfrstring, mfrname); // "Manufacturer: MFRName"
CFRelease (mfrname);
}
-
- r.left = inLocation.h + inRightOffset;
+
+ r.left = inLocation.h + inRightOffset;
r.right = inLocation.h + inTotalWidth - 28;
fontStyle.just = teFlushRight;
-
+
verify_noerr(CreateStaticTextControl(auView->GetCarbonWindow(), &r, mfrstring, &fontStyle, &newControl));
verify_noerr(auView->EmbedControl(newControl));
CFRelease (mfrstring);
-
+
//move displayStr ptr past the manu, to the name
// we move the characters down an index, because the handle doesn't have any room
// at the end for the \0
@@ -316,42 +316,42 @@ void AUControlGroup::AddAUInfo ( AUCarbonViewBase * auView,
displayStr[j] = displayStr[i];
++j; ++i;
} while (i < len);
-
+
displayStr[j] = 0;
}
-
+
// display AudioUnit string
r.left = inLocation.h; r.right = r.left + inRightOffset;
fontStyle.just = 0;
-
+
CFMutableStringRef cfstr = CFStringCreateMutable(NULL, 0);
CFStringAppend(cfstr, kAUViewLocalizedStringKey_AudioUnit); // "Audio Unit"
CFStringAppend(cfstr, kAUViewUnlocalizedString_TitleSeparator);
// "Audio Unit: "
-
+
CFStringRef auname = CFStringCreateWithCString(NULL, displayStr, kCFStringEncodingUTF8);
CFStringAppend(cfstr, auname); // "Audio Unit: AUName"
CFRelease (auname);
-
+
verify_noerr(CreateStaticTextControl(auView->GetCarbonWindow(), &r, cfstr, &fontStyle, &newControl));
-
+
// size text control correctly
Boolean bValue = false;
SetControlData(newControl, kControlEntireControl, 'stim' /* kControlStaticTextIsMultilineTag */, sizeof(Boolean), &bValue);
SInt16 baseLineOffset;
Rect bestRect;
- err = GetBestControlRect(newControl, &bestRect, &baseLineOffset);
+ err = GetBestControlRect(newControl, &bestRect, &baseLineOffset);
if (err == noErr)
{
int width = (bestRect.right - bestRect.left) + 1;
int height = (bestRect.bottom - bestRect.top) + 1;
SizeControl (newControl, width, height);
}
-
+
verify_noerr(auView->EmbedControl(newControl));
CFRelease (cfstr);
}
-
+
DisposeHandle (h1);
#endif
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h
index 0e16100..89ef4f2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h
@@ -2,14 +2,14 @@
File: AUControlGroup.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUControlGroup_h__
#define __AUControlGroup_h__
@@ -57,31 +57,31 @@ class CAAUParameter;
class AUControlGroup {
public:
/*! @method CreateLabelledSlider */
- static void CreateLabelledSlider( AUCarbonViewBase * auView,
- const CAAUParameter & auvp,
- const Rect & area,
- Point labelSize,
+ static void CreateLabelledSlider( AUCarbonViewBase * auView,
+ const CAAUParameter & auvp,
+ const Rect & area,
+ Point labelSize,
const ControlFontStyleRec & fontStyle);
/*! @method CreateLabelledSliderAndEditText */
static void CreateLabelledSliderAndEditText(
- AUCarbonViewBase * auView,
- const CAAUParameter & auvp,
- const Rect & area,
- Point labelSize,
+ AUCarbonViewBase * auView,
+ const CAAUParameter & auvp,
+ const Rect & area,
+ Point labelSize,
Point editTextSize,
const ControlFontStyleRec & fontStyle);
/*! @method CreatePopupMenu */
- static void CreatePopupMenu ( AUCarbonViewBase * auView,
- const CAAUParameter & auvp,
- const Rect & area,
+ static void CreatePopupMenu ( AUCarbonViewBase * auView,
+ const CAAUParameter & auvp,
+ const Rect & area,
const ControlFontStyleRec & inFontStyle,
const bool inSizeToFit = false);
/*! @method AddAUInfo */
- static void AddAUInfo ( AUCarbonViewBase * auView,
- const Point & inLocation,
+ static void AddAUInfo ( AUCarbonViewBase * auView,
+ const Point & inLocation,
const SInt16 inRightOffset,
const SInt16 inTotalWidth);
};
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp
index fe9a731..c935e33 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp
@@ -2,14 +2,14 @@
File: CarbonEventHandler.cpp
Abstract: CarbonEventHandler.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CarbonEventHandler.h"
@@ -65,22 +65,22 @@ CarbonEventHandler::~CarbonEventHandler()
int count = static_cast<int>(CFDictionaryGetCount(mHandlers));
EventHandlerRef *theHandlers = (EventHandlerRef*) malloc(count * sizeof(EventHandlerRef));
CFDictionaryGetKeysAndValues(mHandlers, NULL, (const void **)theHandlers);
-
+
for (int i = 0; i < count; i++)
RemoveEventHandler(theHandlers[i]);
CFDictionaryRemoveAllValues(mHandlers);
CFRelease (mHandlers);
free(theHandlers);
- }
+ }
}
void CarbonEventHandler::WantEventTypes(EventTargetRef target, UInt32 inNumTypes, const EventTypeSpec *inList)
{
if (mHandlers == NULL)
mHandlers = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
-
+
EventHandlerRef handler;
-
+
if (CFDictionaryGetValueIfPresent (mHandlers, target, (const void **)&handler)) // if there is already a handler for the target, add the type
verify_noerr(AddEventTypesToHandler(handler, inNumTypes, inList));
else {
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h
index 9225e1a..b3231a8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h
@@ -2,14 +2,14 @@
File: CarbonEventHandler.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CarbonEventHandler_h__
#define __CarbonEventHandler_h__
@@ -56,7 +56,7 @@ public:
CarbonEventHandler();
/*! @dtor ~CarbonEventHandler */
virtual ~CarbonEventHandler();
-
+
/*! @method WantEventTypes */
virtual void WantEventTypes(EventTargetRef target, UInt32 inNumTypes, const EventTypeSpec *inList);
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp
index 1ce8b30..74336d9 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp
@@ -2,14 +2,14 @@
File: AUInstrumentBase.cpp
Abstract: AUInstrumentBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUInstrumentBase.h"
#include "AUMIDIDefs.h"
@@ -58,12 +58,12 @@
const UInt32 kEventQueueSize = 1024;
AUInstrumentBase::AUInstrumentBase(
- AudioComponentInstance inInstance,
+ AudioComponentInstance inInstance,
UInt32 numInputs,
UInt32 numOutputs,
UInt32 numGroups,
UInt32 numParts)
- : MusicDeviceBase(inInstance, numInputs, numOutputs, numGroups),
+ : MusicDeviceBase(inInstance, numInputs, numOutputs, numGroups),
mAbsoluteSampleFrame(0),
mEventQueue(kEventQueueSize),
mNumNotes(0),
@@ -79,7 +79,7 @@ AUInstrumentBase::AUInstrumentBase(
mFreeNotes.mState = kNoteState_Free;
SetWantsRenderThreadID(true);
}
-
+
AUInstrumentBase::~AUInstrumentBase()
{
@@ -100,12 +100,12 @@ AUElement * AUInstrumentBase::CreateElement(AudioUnitScope inScope, AudioUnitEle
return MusicDeviceBase::CreateElement(inScope, element);
}
-void AUInstrumentBase::CreateExtendedElements()
+void AUInstrumentBase::CreateExtendedElements()
{
Parts().Initialize(this, kAudioUnitScope_Part, mInitNumPartEls);
}
-AUScope * AUInstrumentBase::GetScopeExtended (AudioUnitScope inScope)
+AUScope * AUInstrumentBase::GetScopeExtended (AudioUnitScope inScope)
{
if (inScope == kAudioUnitScope_Part)
return &mPartScope;
@@ -122,7 +122,7 @@ void AUInstrumentBase::SetNotes(UInt32 inNumNotes, UInt32 inMaxActiveNotes, Syn
mMaxActiveNotes = inMaxActiveNotes;
mNoteSize = inNoteDataSize;
mNotes = inNotes;
-
+
for (UInt32 i=0; i<mNumNotes; ++i)
{
SynthNote *note = GetNote(i);
@@ -138,7 +138,7 @@ UInt32 AUInstrumentBase::CountActiveNotes()
for (UInt32 i=0; i<mNumNotes; ++i)
{
SynthNote *note = GetNote(i);
- if (note->GetState() <= kNoteState_Released)
+ if (note->GetState() <= kNoteState_Released)
sum++;
}
return sum;
@@ -165,16 +165,16 @@ OSStatus AUInstrumentBase::Initialize()
TO DO:
Currently ValidFormat will check and validate that the num channels is not being
changed if the AU doesn't support the SupportedNumChannels property - which is correct
-
+
What needs to happen here is that IFF the AU does support this property, (ie, the AU
can be configured to have different num channels than its original configuration) then
the state of the AU at Initialization needs to be validated.
-
+
This is work still to be done - see AUEffectBase for the kind of logic that needs to be applied here
*/
// override to call SetNotes
-
+
mNoteIDCounter = 128; // reset this every time we initialise
mAbsoluteSampleFrame = 0;
return noErr;
@@ -199,7 +199,7 @@ OSStatus AUInstrumentBase::Reset( AudioUnitScope inScope,
for (UInt32 i=0; i<mNumNotes; ++i)
{
SynthNote *note = GetNote(i);
- if (note->IsSounding())
+ if (note->IsSounding())
note->Kill(0);
note->ListRemove();
mFreeNotes.AddNote(note);
@@ -225,7 +225,7 @@ void AUInstrumentBase::PerformEvents(const AudioTimeStamp& inTimeStamp)
#endif
SynthEvent *event;
SynthGroupElement *group;
-
+
while ((event = mEventQueue.ReadItem()) != NULL)
{
#if DEBUG_PRINT_RENDER
@@ -270,12 +270,12 @@ void AUInstrumentBase::PerformEvents(const AudioTimeStamp& inTimeStamp)
group->ResetAllControllers(event->GetOffsetSampleFrame());
break;
}
-
+
mEventQueue.AdvanceReadPtr();
}
}
-
+
OSStatus AUInstrumentBase::Render( AudioUnitRenderActionFlags & ioActionFlags,
const AudioTimeStamp & inTimeStamp,
UInt32 inNumberFrames)
@@ -311,18 +311,18 @@ OSStatus AUInstrumentBase::Render( AudioUnitRenderActionFlags & ioActionFlag
bool AUInstrumentBase::ValidFormat( AudioUnitScope inScope,
AudioUnitElement inElement,
const CAStreamBasicDescription & inNewFormat)
-{
+{
// if the AU supports this, then we should just let this go through to the Init call
- if (SupportedNumChannels (NULL))
+ if (SupportedNumChannels (NULL))
return MusicDeviceBase::ValidFormat(inScope, inElement, inNewFormat);
bool isGood = MusicDeviceBase::ValidFormat (inScope, inElement, inNewFormat);
if (!isGood) return false;
-
+
// if we get to here, then the basic criteria is that the
// num channels cannot change on an existing bus
AUIOElement *el = GetIOElement (inScope, inElement);
- return (el->GetStreamFormat().NumberChannels() == inNewFormat.NumberChannels());
+ return (el->GetStreamFormat().NumberChannels() == inNewFormat.NumberChannels());
}
@@ -333,8 +333,8 @@ bool AUInstrumentBase::StreamFormatWritable( AudioUnitScope scope,
}
OSStatus AUInstrumentBase::RealTimeStartNote( SynthGroupElement *inGroup,
- NoteInstanceID inNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+ NoteInstanceID inNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams)
{
return noErr;
@@ -358,10 +358,10 @@ SynthGroupElement * AUInstrumentBase::GetElForGroupID (MusicDeviceGroupID inGrou
AUScope & groups = Groups();
unsigned int numEls = groups.GetNumberOfElements();
SynthGroupElement* unassignedEl = NULL;
-
+
for (unsigned int i = 0; i < numEls; ++i) {
SynthGroupElement* el = reinterpret_cast<SynthGroupElement*>(groups.GetElement(i));
- if (el->GroupID() == inGroupID)
+ if (el->GroupID() == inGroupID)
return el;
if (el->GroupID() == SynthGroupElement::kUnassignedGroup) {
unassignedEl = el;
@@ -376,14 +376,14 @@ SynthGroupElement * AUInstrumentBase::GetElForGroupID (MusicDeviceGroupID inGrou
}
OSStatus AUInstrumentBase::RealTimeStopNote(
- MusicDeviceGroupID inGroupID,
- NoteInstanceID inNoteInstanceID,
+ MusicDeviceGroupID inGroupID,
+ NoteInstanceID inNoteInstanceID,
UInt32 inOffsetSampleFrame)
{
#if DEBUG_PRINT
printf("AUInstrumentBase::RealTimeStopNote ch %d id %d\n", inGroupID, inNoteInstanceID);
#endif
-
+
SynthGroupElement *gp = (inGroupID == kMusicNoteEvent_Unused
? GetElForNoteID (inNoteInstanceID)
: GetElForGroupID(inGroupID));
@@ -391,7 +391,7 @@ OSStatus AUInstrumentBase::RealTimeStopNote(
{
gp->NoteOff (inNoteInstanceID, inOffsetSampleFrame);
}
-
+
return noErr;
}
@@ -402,7 +402,7 @@ SynthGroupElement * AUInstrumentBase::GetElForNoteID (NoteInstanceID inNoteID)
#endif
AUScope & groups = Groups();
unsigned int numEls = groups.GetNumberOfElements();
-
+
for (unsigned int i = 0; i < numEls; ++i) {
SynthGroupElement* el = reinterpret_cast<SynthGroupElement*>(groups.GetElement(i));
if (el->GetNote(inNoteID) != NULL) // searches for any note state
@@ -411,27 +411,27 @@ SynthGroupElement * AUInstrumentBase::GetElForNoteID (NoteInstanceID inNoteID)
throw static_cast<OSStatus>(kAudioUnitErr_InvalidElement);
}
-OSStatus AUInstrumentBase::StartNote( MusicDeviceInstrumentID inInstrument,
- MusicDeviceGroupID inGroupID,
- NoteInstanceID * outNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+OSStatus AUInstrumentBase::StartNote( MusicDeviceInstrumentID inInstrument,
+ MusicDeviceGroupID inGroupID,
+ NoteInstanceID * outNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams)
{
OSStatus err = noErr;
-
- NoteInstanceID noteID;
+
+ NoteInstanceID noteID;
if (outNoteInstanceID) {
noteID = NextNoteID();
*outNoteInstanceID = noteID;
} else
noteID = (UInt32)inParams.mPitch;
-
+
#if DEBUG_PRINT
printf("AUInstrumentBase::StartNote ch %u, key %u, offset %u\n", inGroupID, (unsigned) inParams.mPitch, inOffsetSampleFrame);
#endif
if (InRenderThread ())
- {
+ {
err = RealTimeStartNote(
GetElForGroupID(inGroupID),
noteID,
@@ -450,14 +450,14 @@ OSStatus AUInstrumentBase::StartNote( MusicDeviceInstrumentID inInstrument,
inOffsetSampleFrame,
&inParams
);
-
+
mEventQueue.AdvanceWritePtr();
}
return err;
}
-OSStatus AUInstrumentBase::StopNote( MusicDeviceGroupID inGroupID,
- NoteInstanceID inNoteInstanceID,
+OSStatus AUInstrumentBase::StopNote( MusicDeviceGroupID inGroupID,
+ NoteInstanceID inNoteInstanceID,
UInt32 inOffsetSampleFrame)
{
#if DEBUG_PRINT
@@ -466,7 +466,7 @@ OSStatus AUInstrumentBase::StopNote( MusicDeviceGroupID inGroupID,
OSStatus err = noErr;
if (InRenderThread ())
- {
+ {
err = RealTimeStopNote(
inGroupID,
inNoteInstanceID,
@@ -484,7 +484,7 @@ OSStatus AUInstrumentBase::StopNote( MusicDeviceGroupID inGroupID,
inOffsetSampleFrame,
NULL
);
-
+
mEventQueue.AdvanceWritePtr();
}
return err;
@@ -492,13 +492,13 @@ OSStatus AUInstrumentBase::StopNote( MusicDeviceGroupID inGroupID,
OSStatus AUInstrumentBase::SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 inEventType, UInt32 inOffsetSampleFrame)
{
-
+
if (InRenderThread ())
{
SynthGroupElement *group = GetElForGroupID(inGroupID);
if (!group)
return kAudioUnitErr_InvalidElement;
-
+
switch (inEventType)
{
case SynthEvent::kEventType_SustainOn :
@@ -532,7 +532,7 @@ OSStatus AUInstrumentBase::SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 i
if (!event) return -1; // queue full
event->Set(inEventType, inGroupID, 0, 0, NULL);
-
+
mEventQueue.AdvanceWritePtr();
}
return noErr;
@@ -576,7 +576,7 @@ OSStatus AUInstrumentBase::HandleControlChange( UInt8 inChannel,
}
return noErr;
}
-
+
OSStatus AUInstrumentBase::HandlePitchWheel( UInt8 inChannel,
UInt8 inPitch1, // LSB
UInt8 inPitch2, // MSB
@@ -592,7 +592,7 @@ OSStatus AUInstrumentBase::HandlePitchWheel( UInt8 inChannel,
return kAudioUnitErr_InvalidElement;
}
-
+
OSStatus AUInstrumentBase::HandleChannelPressure(UInt8 inChannel,
UInt8 inValue,
UInt32 inStartFrame)
@@ -647,13 +647,13 @@ OSStatus AUInstrumentBase::HandleResetAllControllers( UInt8 inChannel)
return SendPedalEvent (inChannel, SynthEvent::kEventType_ResetAllControllers, 0);
}
-
+
OSStatus AUInstrumentBase::HandleAllNotesOff( UInt8 inChannel)
{
return SendPedalEvent (inChannel, SynthEvent::kEventType_AllNotesOff, 0);
}
-
+
OSStatus AUInstrumentBase::HandleAllSoundOff( UInt8 inChannel)
{
return SendPedalEvent (inChannel, SynthEvent::kEventType_AllSoundOff, 0);
@@ -670,7 +670,7 @@ SynthNote* AUInstrumentBase::GetAFreeNote(UInt32 inFrame)
mFreeNotes.RemoveNote(note);
return note;
}
-
+
return VoiceStealing(inFrame, true);
}
@@ -724,13 +724,13 @@ SynthNote* AUInstrumentBase::VoiceStealing(UInt32 inFrame, bool inKillIt)
#if DEBUG_PRINT_NOTE
printf("no notes to steal????\n");
#endif
- return NULL; // It should be impossible to get here. It means there were no notes to kill in any state.
+ return NULL; // It should be impossible to get here. It means there were no notes to kill in any state.
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
AUMonotimbralInstrumentBase::AUMonotimbralInstrumentBase(
- AudioComponentInstance inInstance,
+ AudioComponentInstance inInstance,
UInt32 numInputs,
UInt32 numOutputs,
UInt32 numGroups,
@@ -739,28 +739,28 @@ AUMonotimbralInstrumentBase::AUMonotimbralInstrumentBase(
{
}
-OSStatus AUMonotimbralInstrumentBase::RealTimeStartNote(
- SynthGroupElement *inGroup,
- NoteInstanceID inNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+OSStatus AUMonotimbralInstrumentBase::RealTimeStartNote(
+ SynthGroupElement *inGroup,
+ NoteInstanceID inNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams)
{
#if DEBUG_PRINT_RENDER
printf("AUMonotimbralInstrumentBase::RealTimeStartNote %d\n", inNoteInstanceID);
#endif
- if (NumActiveNotes() + 1 > MaxActiveNotes())
+ if (NumActiveNotes() + 1 > MaxActiveNotes())
{
VoiceStealing(inOffsetSampleFrame, false);
}
SynthNote *note = GetAFreeNote(inOffsetSampleFrame);
if (!note) return -1;
-
+
SynthPartElement *part = GetPartElement (0); // Only one part for monotimbral
-
+
IncNumActiveNotes();
inGroup->NoteOn(note, part, inNoteInstanceID, inOffsetSampleFrame, inParams);
-
+
return noErr;
}
@@ -774,8 +774,8 @@ OSStatus AUMultitimbralInstrumentBase::GetPropertyInfo(AudioUnitPropertyID inI
Boolean & outWritable)
{
OSStatus result = noErr;
-
- switch (inID)
+
+ switch (inID)
{
#if !TARGET_OS_IPHONE
case kMusicDeviceProperty_PartGroup:
@@ -797,7 +797,7 @@ OSStatus AUMultitimbralInstrumentBase::GetProperty( AudioUnitPropertyID inID,
{
OSStatus result = noErr;
- switch (inID)
+ switch (inID)
{
#if !TARGET_OS_IPHONE
case kMusicDeviceProperty_PartGroup:
@@ -809,7 +809,7 @@ OSStatus AUMultitimbralInstrumentBase::GetProperty( AudioUnitPropertyID inID,
default:
result = AUInstrumentBase::GetProperty (inID, inScope, inElement, outData);
}
-
+
return result;
}
@@ -823,7 +823,7 @@ OSStatus AUMultitimbralInstrumentBase::SetProperty( AudioUnitPropertyID in
{
OSStatus result = noErr;
- switch (inID)
+ switch (inID)
{
#if !TARGET_OS_IPHONE
case kMusicDeviceProperty_PartGroup:
@@ -835,7 +835,7 @@ OSStatus AUMultitimbralInstrumentBase::SetProperty( AudioUnitPropertyID in
default:
result = MusicDeviceBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
}
-
+
return result;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h
index 3ad7e03..7e3bfbf 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h
@@ -2,14 +2,14 @@
File: AUInstrumentBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUInstrumentBase__
#define __AUInstrumentBase__
@@ -66,7 +66,7 @@ class AUInstrumentBase : public MusicDeviceBase
{
public:
AUInstrumentBase(
- AudioComponentInstance inInstance,
+ AudioComponentInstance inInstance,
UInt32 numInputs,
UInt32 numOutputs,
UInt32 numGroups = 16,
@@ -74,7 +74,7 @@ public:
virtual ~AUInstrumentBase();
virtual OSStatus Initialize();
-
+
/*! @method Parts */
AUScope & Parts() { return mPartScope; }
@@ -92,10 +92,10 @@ public:
virtual void CreateExtendedElements();
virtual void Cleanup();
-
+
virtual OSStatus Reset( AudioUnitScope inScope,
AudioUnitElement inElement);
-
+
virtual bool ValidFormat( AudioUnitScope inScope,
AudioUnitElement inElement,
const CAStreamBasicDescription & inNewFormat);
@@ -109,35 +109,35 @@ public:
const AudioTimeStamp & inTimeStamp,
UInt32 inNumberFrames);
- virtual OSStatus StartNote( MusicDeviceInstrumentID inInstrument,
- MusicDeviceGroupID inGroupID,
- NoteInstanceID * outNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+ virtual OSStatus StartNote( MusicDeviceInstrumentID inInstrument,
+ MusicDeviceGroupID inGroupID,
+ NoteInstanceID * outNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams);
- virtual OSStatus StopNote( MusicDeviceGroupID inGroupID,
- NoteInstanceID inNoteInstanceID,
+ virtual OSStatus StopNote( MusicDeviceGroupID inGroupID,
+ NoteInstanceID inNoteInstanceID,
UInt32 inOffsetSampleFrame);
virtual OSStatus RealTimeStartNote( SynthGroupElement *inGroup,
- NoteInstanceID inNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+ NoteInstanceID inNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams);
-
- virtual OSStatus RealTimeStopNote( MusicDeviceGroupID inGroupID,
- NoteInstanceID inNoteInstanceID,
+
+ virtual OSStatus RealTimeStopNote( MusicDeviceGroupID inGroupID,
+ NoteInstanceID inNoteInstanceID,
UInt32 inOffsetSampleFrame);
-
+
virtual OSStatus HandleControlChange( UInt8 inChannel,
UInt8 inController,
UInt8 inValue,
UInt32 inStartFrame);
-
+
virtual OSStatus HandlePitchWheel( UInt8 inChannel,
UInt8 inPitch1,
UInt8 inPitch2,
UInt32 inStartFrame);
-
+
virtual OSStatus HandleChannelPressure( UInt8 inChannel,
UInt8 inValue,
UInt32 inStartFrame);
@@ -151,31 +151,31 @@ public:
UInt32 inStartFrame);
virtual OSStatus HandleResetAllControllers( UInt8 inChannel);
-
+
virtual OSStatus HandleAllNotesOff( UInt8 inChannel);
-
+
virtual OSStatus HandleAllSoundOff( UInt8 inChannel);
- SynthNote* GetNote(UInt32 inIndex)
- {
+ SynthNote* GetNote(UInt32 inIndex)
+ {
if (!mNotes)
throw std::runtime_error("no notes");
- return (SynthNote*)((char*)mNotes + inIndex * mNoteSize);
+ return (SynthNote*)((char*)mNotes + inIndex * mNoteSize);
}
-
+
SynthNote* GetAFreeNote(UInt32 inFrame);
void AddFreeNote(SynthNote* inNote);
-
+
friend class SynthGroupElement;
protected:
UInt32 NextNoteID() { return OSAtomicIncrement32((int32_t *)&mNoteIDCounter); }
-
-
- // call SetNotes in your Initialize() method to give the base class your note structures and to set the maximum
+
+
+ // call SetNotes in your Initialize() method to give the base class your note structures and to set the maximum
// number of active notes. inNoteData should be an array of size inMaxActiveNotes.
void SetNotes(UInt32 inNumNotes, UInt32 inMaxActiveNotes, SynthNote* inNotes, UInt32 inNoteSize);
-
+
void PerformEvents( const AudioTimeStamp & inTimeStamp);
OSStatus SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 inEventType, UInt32 inOffsetSampleFrame);
virtual SynthNote* VoiceStealing(UInt32 inFrame, bool inKillIt);
@@ -184,29 +184,29 @@ protected:
void IncNumActiveNotes() { ++mNumActiveNotes; }
void DecNumActiveNotes() { --mNumActiveNotes; }
UInt32 CountActiveNotes();
-
+
SynthPartElement * GetPartElement (AudioUnitElement inPartElement);
-
+
// this call throws if there's no assigned element for the group ID
virtual SynthGroupElement * GetElForGroupID (MusicDeviceGroupID inGroupID);
virtual SynthGroupElement * GetElForNoteID (NoteInstanceID inNoteID);
SInt64 mAbsoluteSampleFrame;
-
+
private:
-
+
SInt32 mNoteIDCounter;
-
+
SynthEventQueue mEventQueue;
-
+
UInt32 mNumNotes;
UInt32 mNumActiveNotes;
UInt32 mMaxActiveNotes;
- SynthNote* mNotes;
+ SynthNote* mNotes;
SynthNoteList mFreeNotes;
UInt32 mNoteSize;
-
+
AUScope mPartScope;
const UInt32 mInitNumPartEls;
};
@@ -217,15 +217,15 @@ class AUMonotimbralInstrumentBase : public AUInstrumentBase
{
public:
AUMonotimbralInstrumentBase(
- AudioComponentInstance inInstance,
+ AudioComponentInstance inInstance,
UInt32 numInputs,
UInt32 numOutputs,
UInt32 numGroups = 16,
UInt32 numParts = 1);
-
- virtual OSStatus RealTimeStartNote( SynthGroupElement *inGroup,
- NoteInstanceID inNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+
+ virtual OSStatus RealTimeStartNote( SynthGroupElement *inGroup,
+ NoteInstanceID inNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams);
};
@@ -236,12 +236,12 @@ class AUMultitimbralInstrumentBase : public AUInstrumentBase
{
public:
AUMultitimbralInstrumentBase(
- AudioComponentInstance inInstance,
+ AudioComponentInstance inInstance,
UInt32 numInputs,
UInt32 numOutputs,
UInt32 numGroups,
UInt32 numParts);
-
+
virtual OSStatus GetPropertyInfo( AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h
index ea6c4c2..f9a0ec2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h
@@ -2,14 +2,14 @@
File: LockFreeFIFO.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include <libkern/OSAtomic.h>
@@ -58,22 +58,22 @@ public:
mItems = new ITEM[inMaxSize];
mMask = inMaxSize - 1;
}
-
+
~LockFreeFIFOWithFree()
{
delete [] mItems;
}
-
- void Reset()
+
+ void Reset()
{
FreeItems();
mReadIndex = 0;
mWriteIndex = 0;
mFreeIndex = 0;
}
-
- ITEM* WriteItem()
+
+ ITEM* WriteItem()
{
//printf("WriteItem %d %d\n", mReadIndex, mWriteIndex);
FreeItems(); // free items on the write thread.
@@ -81,8 +81,8 @@ public:
if (nextWriteIndex == mFreeIndex) return NULL;
return &mItems[mWriteIndex];
}
-
- ITEM* ReadItem()
+
+ ITEM* ReadItem()
{
//printf("ReadItem %d %d\n", mReadIndex, mWriteIndex);
if (mReadIndex == mWriteIndex) return NULL;
@@ -91,14 +91,14 @@ public:
void AdvanceWritePtr() { OSAtomicCompareAndSwap32(mWriteIndex, (mWriteIndex + 1) & mMask, &mWriteIndex); }
void AdvanceReadPtr() { OSAtomicCompareAndSwap32(mReadIndex, (mReadIndex + 1) & mMask, &mReadIndex); }
private:
- ITEM* FreeItem()
+ ITEM* FreeItem()
{
if (mFreeIndex == mReadIndex) return NULL;
return &mItems[mFreeIndex];
}
void AdvanceFreePtr() { OSAtomicCompareAndSwap32(mFreeIndex, (mFreeIndex + 1) & mMask, &mFreeIndex); }
-
- void FreeItems()
+
+ void FreeItems()
{
ITEM* item;
while ((item = FreeItem()) != NULL)
@@ -107,7 +107,7 @@ private:
AdvanceFreePtr();
}
}
-
+
volatile int32_t mReadIndex, mWriteIndex, mFreeIndex;
int32_t mMask;
ITEM *mItems;
@@ -129,38 +129,38 @@ public:
mItems = new ITEM[inMaxSize];
mMask = inMaxSize - 1;
}
-
+
~LockFreeFIFO()
{
delete [] mItems;
}
-
- void Reset()
+
+ void Reset()
{
mReadIndex = 0;
mWriteIndex = 0;
}
-
- ITEM* WriteItem()
+
+ ITEM* WriteItem()
{
int32_t nextWriteIndex = (mWriteIndex + 1) & mMask;
if (nextWriteIndex == mReadIndex) return NULL;
return &mItems[mWriteIndex];
}
-
- ITEM* ReadItem()
+
+ ITEM* ReadItem()
{
if (mReadIndex == mWriteIndex) return NULL;
return &mItems[mReadIndex];
}
-
+
// the CompareAndSwap will always succeed. We use CompareAndSwap because it calls the PowerPC sync instruction,
// plus any processor bug workarounds for various CPUs.
void AdvanceWritePtr() { OSAtomicCompareAndSwap32(mWriteIndex, (mWriteIndex + 1) & mMask, &mWriteIndex); }
void AdvanceReadPtr() { OSAtomicCompareAndSwap32(mReadIndex, (mReadIndex + 1) & mMask, &mReadIndex); }
-
+
private:
-
+
volatile int32_t mReadIndex, mWriteIndex;
int32_t mMask;
ITEM *mItems;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h
index 0f8003f..408108c 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h
@@ -2,14 +2,14 @@
File: MIDIControlHandler.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __MIDICONTROLHANDLER_H__
#define __MIDICONTROLHANDLER_H__
@@ -62,11 +62,11 @@ public:
virtual bool SetPolyPressure(UInt8 inKey, UInt8 inValue) = 0;
virtual bool SetController(UInt8 inControllerNumber, UInt8 inValue) = 0;
virtual bool SetSysex(void *inSysexMsg) = 0;
-
+
virtual float GetPitchBend() const = 0;
/*! Default controller values. These represent MSB values unless indicated in the name */
-
+
enum
{
kDefault_Midpoint = 0x40, //! Used for all center-null-point controllers
@@ -78,7 +78,7 @@ public:
kDefault_ChannelPressure = 0,
kDefault_ReverbSend = 40,
kDefault_ChorusSend = 0,
-
+
kDefault_RPN_LSB = 0x7f,
kDefault_RPN_MSB = 0x7f,
kDefault_PitchBendRange = 2,
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp
index fd329f8..cef3a50 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp
@@ -2,14 +2,14 @@
File: SynthElement.cpp
Abstract: SynthElement.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "SynthElement.h"
#include "AUInstrumentBase.h"
@@ -78,7 +78,7 @@ void MidiControls::Reset()
}
-SynthElement::SynthElement(AUInstrumentBase *audioUnit, UInt32 inElement)
+SynthElement::SynthElement(AUInstrumentBase *audioUnit, UInt32 inElement)
: AUElement(audioUnit), mIndex(inElement)
{
}
@@ -87,7 +87,7 @@ SynthElement::~SynthElement()
{
}
-SynthGroupElement::SynthGroupElement(AUInstrumentBase *audioUnit, UInt32 inElement, MIDIControlHandler *inHandler)
+SynthGroupElement::SynthGroupElement(AUInstrumentBase *audioUnit, UInt32 inElement, MIDIControlHandler *inHandler)
: SynthElement(audioUnit, inElement),
mCurrentAbsoluteFrame(-1),
mMidiControlHandler(inHandler),
@@ -109,7 +109,7 @@ void SynthGroupElement::SetGroupID (MusicDeviceGroupID inGroup)
mGroupID = inGroup;
}
-void SynthGroupElement::Reset()
+void SynthGroupElement::Reset()
{
#if DEBUG_PRINT
printf("SynthGroupElement::Reset\n");
@@ -119,7 +119,7 @@ void SynthGroupElement::Reset()
mNoteList[i].Empty();
}
-SynthPartElement::SynthPartElement(AUInstrumentBase *audioUnit, UInt32 inElement)
+SynthPartElement::SynthPartElement(AUInstrumentBase *audioUnit, UInt32 inElement)
: SynthElement(audioUnit, inElement)
{
}
@@ -132,7 +132,7 @@ SynthNote *SynthGroupElement::GetNote(NoteInstanceID inNoteID, bool unreleasedOn
#if DEBUG_PRINT_RENDER
printf("SynthGroupElement::GetNote %d, unreleased = %d\n", inNoteID, unreleasedOnly);
#endif
- const UInt32 lastNoteState = unreleasedOnly ?
+ const UInt32 lastNoteState = unreleasedOnly ?
(mSostenutoIsOn ? kNoteState_Sostenutoed : kNoteState_Attacked)
: kNoteState_Released;
SynthNote *note = NULL;
@@ -176,7 +176,7 @@ void SynthGroupElement::NoteOn(SynthNote *note,
}
void SynthGroupElement::NoteOff(NoteInstanceID inNoteID, UInt32 inFrame)
-{
+{
#if DEBUG_PRINT_NOTE
printf("SynthGroupElement::NoteOff %d\n", inNoteID);
#endif
@@ -217,7 +217,7 @@ void SynthGroupElement::NoteEnded(SynthNote *inNote, UInt32 inFrame)
SynthNoteList *list = &mNoteList[inNote->GetState()];
list->RemoveNote(inNote);
}
-
+
GetAUInstrument()->AddFreeNote(inNote);
}
@@ -245,7 +245,7 @@ bool SynthGroupElement::ChannelMessage(UInt16 controllerID, UInt16 inValue)
// Sustain and sostenuto are "pedal events", and are handled during render cycle
if (controllerID <= kMidiController_RPN_MSB && controllerID != kMidiController_Sustain && controllerID != kMidiController_Sostenuto)
handled = mMidiControlHandler->SetController(controllerID, UInt8(inValue));
- else
+ else
{
switch (controllerID)
{
@@ -296,7 +296,7 @@ void SynthGroupElement::SostenutoOff(UInt32 inFrame)
mMidiControlHandler->SetController(kMidiController_Sostenuto, 0);
mSostenutoIsOn = false;
mNoteList[kNoteState_Attacked].TransferAllFrom(&mNoteList[kNoteState_Sostenutoed], inFrame);
- if (mSustainIsOn)
+ if (mSustainIsOn)
mNoteList[kNoteState_ReleasedButSustained].TransferAllFrom(&mNoteList[kNoteState_ReleasedButSostenutoed], inFrame);
else
mNoteList[kNoteState_Released].TransferAllFrom(&mNoteList[kNoteState_ReleasedButSostenutoed], inFrame);
@@ -323,7 +323,7 @@ void SynthGroupElement::SustainOff(UInt32 inFrame)
if (mSustainIsOn) {
mMidiControlHandler->SetController(kMidiController_Sustain, 0);
mSustainIsOn = false;
-
+
mNoteList[kNoteState_Released].TransferAllFrom(&mNoteList[kNoteState_ReleasedButSustained], inFrame);
}
}
@@ -342,14 +342,14 @@ void SynthGroupElement::AllNotesOff(UInt32 inFrame)
while (note)
{
SynthNote *nextNote = note->mNext;
-
+
mNoteList[i].RemoveNote(note);
note->Release(inFrame);
mNoteList[newState].AddNote(note);
-
+
note = nextNote;
}
- }
+ }
}
void SynthGroupElement::AllSoundOff(UInt32 inFrame)
@@ -358,21 +358,21 @@ void SynthGroupElement::AllSoundOff(UInt32 inFrame)
printf("SynthGroupElement::AllSoundOff\n");
#endif
SynthNote *note;
-
+
for (UInt32 i=0 ; i<kNumberOfActiveNoteStates; ++i)
{
note = mNoteList[i].mHead;
while (note)
{
SynthNote *nextNote = note->mNext;
-
+
mNoteList[i].RemoveNote(note);
note->FastRelease(inFrame);
mNoteList[kNoteState_FastReleased].AddNote(note);
GetAUInstrument()->DecNumActiveNotes();
note = nextNote;
}
- }
+ }
}
void SynthGroupElement::ResetAllControllers(UInt32 inFrame)
@@ -395,7 +395,7 @@ OSStatus SynthGroupElement::Render(SInt64 inAbsoluteSampleFrame, UInt32 inNumber
{
buffArray[outBus] = &GetAudioUnit()->GetOutput(outBus)->GetBufferList();
}
-
+
for (UInt32 i=0 ; i<kNumberOfSoundingNoteStates; ++i)
{
SynthNote *note = mNoteList[i].mHead;
@@ -405,10 +405,10 @@ OSStatus SynthGroupElement::Render(SInt64 inAbsoluteSampleFrame, UInt32 inNumber
printf("SynthGroupElement::Render: state %d, note %p\n", i, note);
#endif
SynthNote *nextNote = note->mNext;
-
+
OSStatus err = note->Render(inAbsoluteSampleFrame, inNumberFrames, buffArray, numOutputs);
if (err) return err;
-
+
note = nextNote;
}
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h
index 4ca3643..8f844a5 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h
@@ -2,14 +2,14 @@
File: SynthElement.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __SynthElement__
#define __SynthElement__
@@ -62,9 +62,9 @@ public:
virtual ~SynthElement();
UInt32 GetIndex() const { return mIndex; }
-
+
AUInstrumentBase* GetAUInstrument() { return (AUInstrumentBase*)GetAudioUnit(); }
-
+
private:
UInt32 mIndex;
};
@@ -98,11 +98,11 @@ public:
virtual float GetPitchBend() const { return mFPitchBend * mFPitchBendDepth; }
- SInt16 GetHiResControl(UInt32 inIndex) const
- {
+ SInt16 GetHiResControl(UInt32 inIndex) const
+ {
return ((mControls[inIndex] & 127) << 7) | (mControls[inIndex + 32] & 127);
}
-
+
float GetControl(UInt32 inIndex) const
{
if (inIndex < 32) {
@@ -111,10 +111,10 @@ public:
return (float)mControls[inIndex];
}
}
-
-
+
+
private:
-
+
UInt8 mControls[128];
UInt8 mPolyPressure[128];
UInt8 mMonoPressure;
@@ -124,17 +124,17 @@ private:
UInt16 mActiveNRPN;
UInt16 mActiveRPValue;
UInt16 mActiveNRPValue;
-
+
UInt16 mPitchBendDepth;
float mFPitchBendDepth;
float mFPitchBend;
-
+
void SetHiResControl(UInt32 inIndex, UInt8 inMSB, UInt8 inLSB)
- {
+ {
mControls[inIndex] = inMSB;
mControls[inIndex + 32] = inLSB;
}
-
+
};
@@ -144,7 +144,7 @@ public:
enum {
kUnassignedGroup = 0xFFFFFFFF
};
-
+
SynthGroupElement(AUInstrumentBase *audioUnit, UInt32 inElement, MIDIControlHandler *inHandler);
virtual ~SynthGroupElement();
@@ -157,27 +157,27 @@ public:
void NoteEnded(SynthNote *inNote, UInt32 inFrame);
void NoteFastReleased(SynthNote *inNote);
-
+
virtual bool ChannelMessage(UInt16 controlID, UInt16 controlValue);
virtual void AllNotesOff(UInt32 inFrame);
virtual void AllSoundOff(UInt32 inFrame);
void ResetAllControllers(UInt32 inFrame);
-
+
SynthNote * GetNote(NoteInstanceID inNoteID, bool unreleasedOnly=false, UInt32 *outNoteState=NULL);
-
+
void Reset();
-
+
virtual OSStatus Render(SInt64 inAbsoluteSampleFrame, UInt32 inNumberFrames, AUScope &outputs);
-
+
float GetPitchBend() const { return mMidiControlHandler->GetPitchBend(); }
SInt64 GetCurrentAbsoluteFrame() const { return mCurrentAbsoluteFrame; }
-
+
MusicDeviceGroupID GroupID () const { return mGroupID; }
virtual void SetGroupID (MusicDeviceGroupID inGroup);
MIDIControlHandler * GetMIDIControlHandler() const { return mMidiControlHandler; }
-
-protected:
+
+protected:
SInt64 mCurrentAbsoluteFrame;
SynthNoteList mNoteList[kNumberOfSoundingNoteStates];
MIDIControlHandler *mMidiControlHandler;
@@ -186,7 +186,7 @@ private:
friend class AUInstrumentBase;
friend class AUMonotimbralInstrumentBase;
friend class AUMultitimbralInstrumentBase;
-
+
bool mSustainIsOn;
bool mSostenutoIsOn;
UInt32 mOutputBus;
@@ -213,15 +213,15 @@ public:
UInt32 GetGroupIndex() const { return mGroupIndex; }
bool InRange(Float32 inNote, Float32 inVelocity);
-
+
UInt32 GetMaxPolyphony() const { return mMaxPolyphony; }
void SetMaxPolyphony(UInt32 inMaxPolyphony) { mMaxPolyphony = inMaxPolyphony; }
-
+
private:
UInt32 mGroupIndex;
UInt32 mPatchIndex;
UInt32 mMaxPolyphony;
- SynthKeyZone mKeyZone;
+ SynthKeyZone mKeyZone;
};
#endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h
index 9c27aee..abb7886 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h
@@ -2,14 +2,14 @@
File: SynthEvent.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
/* You can either fill in code here or remove this and create or add new files. */
@@ -76,7 +76,7 @@ public:
SynthEvent() {}
~SynthEvent() {}
- void Set(
+ void Set(
UInt32 inEventType,
MusicDeviceGroupID inGroupID,
NoteInstanceID inNoteID,
@@ -88,20 +88,20 @@ public:
mGroupID = inGroupID;
mNoteID = inNoteID;
mOffsetSampleFrame = inOffsetSampleFrame;
-
+
if (inNoteParams)
{
- UInt32 paramSize = offsetof(MusicDeviceNoteParams, mControls) + (inNoteParams->argCount-2)*sizeof(NoteParamsControlValue);
- mNoteParams = inNoteParams->argCount > 3
- ? (MusicDeviceNoteParams*)malloc(paramSize)
+ UInt32 paramSize = offsetof(MusicDeviceNoteParams, mControls) + (inNoteParams->argCount-2)*sizeof(NoteParamsControlValue);
+ mNoteParams = inNoteParams->argCount > 3
+ ? (MusicDeviceNoteParams*)malloc(paramSize)
: &mSmallNoteParams;
memcpy(mNoteParams, inNoteParams, paramSize);
}
- else
+ else
mNoteParams = NULL;
}
-
-
+
+
void Free()
{
if (mNoteParams)
@@ -111,27 +111,27 @@ public:
mNoteParams = NULL;
}
}
-
+
UInt32 GetEventType() const { return mEventType; }
MusicDeviceGroupID GetGroupID() const { return mGroupID; }
NoteInstanceID GetNoteID() const { return mNoteID; }
UInt32 GetOffsetSampleFrame() const { return mOffsetSampleFrame; }
-
+
MusicDeviceNoteParams* GetParams() const { return mNoteParams; }
UInt32 GetArgCount() const { return mNoteParams->argCount; }
UInt32 NumberParameters() const { return mNoteParams->argCount - 2; }
-
+
Float32 GetNote() const { return mNoteParams->mPitch; }
Float32 GetVelocity() const { return mNoteParams->mVelocity; }
-
- NoteParamsControlValue GetParameter(UInt32 inIndex) const
+
+ NoteParamsControlValue GetParameter(UInt32 inIndex) const
{
- if (inIndex >= NumberParameters())
+ if (inIndex >= NumberParameters())
throw std::runtime_error("index out of range");
- return mNoteParams->mControls[inIndex];
+ return mNoteParams->mControls[inIndex];
}
-
+
private:
UInt32 mEventType;
MusicDeviceGroupID mGroupID;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp
index 96a24d3..9ecced6 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp
@@ -2,14 +2,14 @@
File: SynthNote.cpp
Abstract: SynthNote.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "SynthNote.h"
#include "SynthElement.h"
@@ -51,9 +51,9 @@
bool SynthNote::AttackNote(
SynthPartElement * inPart,
SynthGroupElement * inGroup,
- NoteInstanceID inNoteID,
- UInt64 inAbsoluteSampleFrame,
- UInt32 inOffsetSampleFrame,
+ NoteInstanceID inNoteID,
+ UInt64 inAbsoluteSampleFrame,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams)
{
#if DEBUG_PRINT
@@ -70,8 +70,8 @@ bool SynthNote::AttackNote(
mPitch = inParams.mPitch;
mVelocity = inParams.mVelocity;
-
-
+
+
return Attack(inParams);
}
@@ -116,25 +116,25 @@ double SynthNote::SampleRate()
return GetAudioUnit()->GetOutput(0)->GetStreamFormat().mSampleRate;
}
-AUInstrumentBase* SynthNote::GetAudioUnit() const
-{
- return (AUInstrumentBase*)mGroup->GetAudioUnit();
+AUInstrumentBase* SynthNote::GetAudioUnit() const
+{
+ return (AUInstrumentBase*)mGroup->GetAudioUnit();
}
-Float32 SynthNote::GetGlobalParameter(AudioUnitParameterID inParamID) const
+Float32 SynthNote::GetGlobalParameter(AudioUnitParameterID inParamID) const
{
return mGroup->GetAudioUnit()->Globals()->GetParameter(inParamID);
}
-void SynthNote::NoteEnded(UInt32 inFrame)
-{
+void SynthNote::NoteEnded(UInt32 inFrame)
+{
mGroup->NoteEnded(this, inFrame);
- mNoteID = 0xFFFFFFFF;
+ mNoteID = 0xFFFFFFFF;
}
-float SynthNote::GetPitchBend() const
-{
- return mGroup->GetPitchBend();
+float SynthNote::GetPitchBend() const
+{
+ return mGroup->GetPitchBend();
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h
index cec6377..89179b1 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h
@@ -2,14 +2,14 @@
File: SynthNote.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __SynthNote__
#define __SynthNote__
@@ -84,7 +84,7 @@ enum SynthNoteState {
end of note any state free
soft voice stealing any state fast released
hard voice stealing any state free
-
+
soft voice stealing happens when there is a note on event and NumActiveNotes > MaxActiveNotes
hard voice stealing happens when there is a note on event and NumActiveNotes == NumNotes (no free notes)
voice stealing removes the quietest note in the highest numbered state that has sounding notes.
@@ -108,20 +108,20 @@ struct SynthNote
mVelocity(0.0f)
{
}
-
+
virtual ~SynthNote() {}
-
+
virtual void Reset();
//! Returns true if active note resulted from this call, otherwise false
virtual bool AttackNote(
SynthPartElement * inPart,
SynthGroupElement * inGroup,
- NoteInstanceID inNoteID,
- UInt64 inAbsoluteSampleFrame,
- UInt32 inOffsetSampleFrame,
+ NoteInstanceID inNoteID,
+ UInt64 inAbsoluteSampleFrame,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams &inParams
);
-
+
virtual OSStatus Render(UInt64 inAbsoluteSampleFrame, UInt32 inNumFrames, AudioBufferList** inBufferList, UInt32 inOutBusCount) = 0;
//! Returns true if active note resulted from this call, otherwise false
virtual bool Attack(const MusicDeviceNoteParams &inParams) = 0;
@@ -134,7 +134,7 @@ struct SynthNote
SynthGroupElement* GetGroup() const { return mGroup; }
SynthPartElement* GetPart() const { return mPart; }
-
+
AUInstrumentBase* GetAudioUnit() const;
Float32 GetGlobalParameter(AudioUnitParameterID inParamID) const;
@@ -143,7 +143,7 @@ struct SynthNote
SynthNoteState GetState() const { return mState; }
UInt8 GetMidiKey() const { return (UInt8) mPitch; }
UInt8 GetMidiVelocity() const { return (UInt8) mVelocity; }
-
+
Boolean IsSounding() const { return mState < kNumberOfSoundingNoteStates; }
Boolean IsActive() const { return mState < kNumberOfActiveNoteStates; }
UInt64 GetAbsoluteStartFrame() const { return mAbsoluteStartFrame; }
@@ -155,7 +155,7 @@ struct SynthNote
float GetPitchBend() const;
double TuningA() const;
-
+
Float32 GetPitch() const { return mPitch; } // returns raw pitch from MusicDeviceNoteParams
virtual double Frequency(); // returns the frequency of note + pitch bend.
virtual double SampleRate();
@@ -163,7 +163,7 @@ struct SynthNote
// linked list pointers
SynthNote *mPrev;
SynthNote *mNext;
-
+
friend class SynthGroupElement;
friend struct SynthNoteList;
protected:
@@ -171,14 +171,14 @@ protected:
private:
SynthPartElement* mPart;
SynthGroupElement* mGroup;
-
+
NoteInstanceID mNoteID;
SynthNoteState mState;
UInt64 mAbsoluteStartFrame;
SInt32 mRelativeStartFrame;
SInt32 mRelativeReleaseFrame;
SInt32 mRelativeKillFrame;
-
+
Float32 mPitch;
Float32 mVelocity;
};
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp
index 849abd2..7e49da9 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp
@@ -2,14 +2,14 @@
File: SynthNoteList.cpp
Abstract: SynthNoteList.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "SynthNoteList.h"
#include <stdexcept>
@@ -52,23 +52,23 @@ void SynthNoteList::SanityCheck() const
if (mState >= kNoteState_Unset) {
throw std::runtime_error("SanityCheck: mState is bad");
}
-
+
if (mHead == NULL) {
- if (mTail != NULL)
+ if (mTail != NULL)
throw std::runtime_error("SanityCheck: mHead is NULL but not mTail");
return;
}
if (mTail == NULL) {
throw std::runtime_error("SanityCheck: mTail is NULL but not mHead");
}
-
+
if (mHead->mPrev) {
throw std::runtime_error("SanityCheck: mHead has a mPrev");
}
if (mTail->mNext) {
throw std::runtime_error("SanityCheck: mTail has a mNext");
}
-
+
SynthNote *note = mHead;
while (note)
{
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h
index 47a3593..6718f18 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h
@@ -2,14 +2,14 @@
File: SynthNoteList.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __SynthNoteList__
#define __SynthNoteList__
@@ -61,26 +61,26 @@
struct SynthNoteList
{
SynthNoteList() : mState(kNoteState_Unset), mHead(0), mTail(0) {}
-
+
bool NotEmpty() const { return mHead != NULL; }
bool IsEmpty() const { return mHead == NULL; }
- void Empty() {
+ void Empty() {
#if USE_SANITY_CHECK
SanityCheck();
#endif
- mHead = mTail = NULL;
+ mHead = mTail = NULL;
}
-
+
UInt32 Length() const {
#if USE_SANITY_CHECK
SanityCheck();
#endif
UInt32 length = 0;
- for (SynthNote* note = mHead; note; note = note->mNext)
+ for (SynthNote* note = mHead; note; note = note->mNext)
length++;
return length;
};
-
+
void AddNote(SynthNote *inNote)
{
#if DEBUG_PRINT
@@ -92,14 +92,14 @@ struct SynthNoteList
inNote->SetState(mState);
inNote->mNext = mHead;
inNote->mPrev = NULL;
-
+
if (mHead) { mHead->mPrev = inNote; mHead = inNote; }
else mHead = mTail = inNote;
#if USE_SANITY_CHECK
SanityCheck();
#endif
}
-
+
void RemoveNote(SynthNote *inNote)
{
#if DEBUG_PRINT
@@ -113,7 +113,7 @@ struct SynthNoteList
if (inNote->mNext) inNote->mNext->mPrev = inNote->mPrev;
else mTail = inNote->mPrev;
-
+
inNote->mPrev = 0;
inNote->mNext = 0;
#if USE_SANITY_CHECK
@@ -131,7 +131,7 @@ struct SynthNoteList
inNoteList->SanityCheck();
#endif
if (!inNoteList->mTail) return;
-
+
if (mState == kNoteState_Released)
{
for (SynthNote* note = inNoteList->mHead; note; note = note->mNext)
@@ -150,14 +150,14 @@ struct SynthNoteList
note->SetState(mState);
}
}
-
+
inNoteList->mTail->mNext = mHead;
-
+
if (mHead) mHead->mPrev = inNoteList->mTail;
else mTail = inNoteList->mTail;
-
+
mHead = inNoteList->mHead;
-
+
inNoteList->mHead = NULL;
inNoteList->mTail = NULL;
#if USE_SANITY_CHECK
@@ -165,7 +165,7 @@ struct SynthNoteList
inNoteList->SanityCheck();
#endif
}
-
+
SynthNote* FindOldestNote()
{
#if DEBUG_PRINT
@@ -186,7 +186,7 @@ struct SynthNoteList
}
return oldestNote;
}
-
+
SynthNote* FindMostQuietNote()
{
#if DEBUG_PRINT
@@ -219,9 +219,9 @@ struct SynthNoteList
#endif
return mostQuietNote;
}
-
+
void SanityCheck() const;
-
+
SynthNoteState mState;
SynthNote * mHead;
SynthNote * mTail;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h
index 741be00..995b9fb 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h
@@ -2,14 +2,14 @@
File: AUViewLocalizedStringKeys.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUViewLocalizedStringKeys_h__
#define __AUViewLocalizedStringKeys_h__
@@ -53,27 +53,27 @@
// UNLOCALIZED STRINGS:
#define kAUViewUnlocalizedString_TitleSeparator CFSTR(": ")
-
+
// Generic View:
#define kAUViewLocalizedStringKey_AudioUnit CFSTR("Audio Unit")
#define kAUViewLocalizedStringKey_Manufacturer CFSTR("Manufacturer")
-
+
#define kAUViewLocalizedStringKey_FactoryPreset CFSTR("Factory Preset")
-
+
#define kAUViewLocalizedStringKey_Properties CFSTR("Properties")
#define kAUViewLocalizedStringKey_Parameters CFSTR("Parameters")
-
+
#define kAUViewLocalizedStringKey_Standard CFSTR("Standard")
#define kAUViewLocalizedStringKey_Expert CFSTR("Expert")
-
+
// AULoadCPU:
#define kAUViewLocalizedStringKey_RestrictCPULoad CFSTR("Restrict CPU Load")
#define kAUViewLocalizedStringKey_PercentSymbol CFSTR("%")
#define kAUViewLocalizedStringKey_NotApplicable CFSTR("n/a")
-
+
// AUDiskStreamingCheckbox:
#define kAUViewLocalizedStringKey_StreamFromDisk CFSTR("Stream From Disk")
-
+
// AURenderQualityPopup:
#define kAUViewLocalizedStringKey_RenderQuality CFSTR("Render Quality")
#define kAUViewLocalizedStringKey_Maximum CFSTR("Maximum")
@@ -84,5 +84,5 @@
// AUChannelLayoutPopUp:
#define kAUViewLocalizedStringKey_AudioChannelLayout CFSTR("Audio Channel Layout")
-
+
#endif //__AUViewLocalizedStringKeys_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp
index 010082f..c7a8c65 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp
@@ -2,14 +2,14 @@
File: AUEffectBase.cpp
Abstract: AUEffectBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,15 +40,15 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUEffectBase.h"
-/*
+/*
This class does not deal as well as it should with N-M effects...
-
+
The problem areas are (if the channels don't match):
ProcessInPlace if the channels don't match - there will be problems if InputChan != OutputChan
Bypass - its just passing the buffers through when not processing them
@@ -84,7 +84,7 @@ void AUEffectBase::Cleanup()
{
for (KernelList::iterator it = mKernelList.begin(); it != mKernelList.end(); ++it)
delete *it;
-
+
mKernelList.clear();
mMainOutput = NULL;
mMainInput = NULL;
@@ -113,7 +113,7 @@ OSStatus AUEffectBase::Initialize()
if ((configNumInputs < 0) && (configNumOutputs < 0))
{
// unit accepts any number of channels on input and output
- if (((configNumInputs == -1) && (configNumOutputs == -2))
+ if (((configNumInputs == -1) && (configNumOutputs == -2))
|| ((configNumInputs == -2) && (configNumOutputs == -1)))
{
foundMatch = true;
@@ -129,7 +129,7 @@ OSStatus AUEffectBase::Initialize()
}
else
{
- // the -1 case on either scope is saying that the unit doesn't care about the
+ // the -1 case on either scope is saying that the unit doesn't care about the
// number of channels on that scope
bool inputMatch = (auNumInputs == configNumInputs) || (configNumInputs == -1);
bool outputMatch = (auNumOutputs == configNumOutputs) || (configNumOutputs == -1);
@@ -152,14 +152,14 @@ OSStatus AUEffectBase::Initialize()
}
MaintainKernels();
-
+
mMainOutput = GetOutput(0);
mMainInput = GetInput(0);
-
+
const CAStreamBasicDescription& format = GetStreamFormat(kAudioUnitScope_Output, 0);
format.IdentifyCommonPCMFormat(mCommonPCMFormat, NULL);
mBytesPerFrame = format.mBytesPerFrame;
-
+
return noErr;
}
@@ -171,7 +171,7 @@ OSStatus AUEffectBase::Reset( AudioUnitScope inScope,
if (kernel != NULL)
kernel->Reset();
}
-
+
return AUBase::Reset(inScope, inElement);
}
@@ -228,10 +228,10 @@ OSStatus AUEffectBase::SetProperty( AudioUnitPropertyID inID,
{
if (inDataSize < sizeof(UInt32))
return kAudioUnitErr_InvalidPropertyValue;
-
+
bool tempNewSetting = *((UInt32*)inData) != 0;
// we're changing the state of bypass
- if (tempNewSetting != IsBypassEffect())
+ if (tempNewSetting != IsBypassEffect())
{
if (!tempNewSetting && IsBypassEffect() && IsInitialized()) // turning bypass off and we're initialized
Reset(0, 0);
@@ -246,16 +246,16 @@ OSStatus AUEffectBase::SetProperty( AudioUnitPropertyID inID,
}
return AUBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
}
-
+
void AUEffectBase::MaintainKernels()
{
#if TARGET_OS_IPHONE
UInt32 nKernels = mOnlyOneKernel ? 1 : GetNumberOfChannels();
-#else
+#else
UInt32 nKernels = GetNumberOfChannels();
#endif
-
+
if (mKernelList.size() < nKernels) {
mKernelList.reserve(nKernels);
for (UInt32 i = (UInt32)mKernelList.size(); i < nKernels; ++i)
@@ -267,7 +267,7 @@ void AUEffectBase::MaintainKernels()
mKernelList.pop_back();
}
}
-
+
for(unsigned int i = 0; i < nKernels; i++ )
{
if(mKernelList[i]) {
@@ -289,7 +289,7 @@ OSStatus AUEffectBase::ChangeStreamFormat( AudioUnitScope inScope,
{
OSStatus result = AUBase::ChangeStreamFormat(inScope, inElement, inPrevFormat, inNewFormat);
if (result == noErr)
- {
+ {
// for the moment this only dependency we know about
// where a parameter's range may change is with the sample rate
// and effects are only publishing parameters in the global scope!
@@ -314,11 +314,11 @@ OSStatus AUEffectBase::ProcessScheduledSlice( void *inUserData,
UInt32 inTotalBufferFrames )
{
ScheduledProcessParams &sliceParams = *((ScheduledProcessParams*)inUserData);
-
+
AudioUnitRenderActionFlags &actionFlags = *sliceParams.actionFlags;
AudioBufferList &inputBufferList = *sliceParams.inputBufferList;
AudioBufferList &outputBufferList = *sliceParams.outputBufferList;
-
+
UInt32 channelSize = inSliceFramesToProcess * mBytesPerFrame;
// fix the size of the buffer we're operating on before we render this slice of time
for(unsigned int i = 0; i < inputBufferList.mNumberBuffers; i++ ) {
@@ -333,15 +333,15 @@ OSStatus AUEffectBase::ProcessScheduledSlice( void *inUserData,
// we just partially processed the buffers, so increment the data pointers to the next part of the buffer to process
for(unsigned int i = 0; i < inputBufferList.mNumberBuffers; i++ ) {
- inputBufferList.mBuffers[i].mData =
+ inputBufferList.mBuffers[i].mData =
(char *)inputBufferList.mBuffers[i].mData + inputBufferList.mBuffers[i].mNumberChannels * channelSize;
}
-
+
for(unsigned int i = 0; i < outputBufferList.mNumberBuffers; i++ ) {
- outputBufferList.mBuffers[i].mData =
+ outputBufferList.mBuffers[i].mData =
(char *)outputBufferList.mBuffers[i].mData + outputBufferList.mBuffers[i].mNumberChannels * channelSize;
}
-
+
return result;
}
@@ -358,7 +358,7 @@ OSStatus AUEffectBase::Render( AudioUnitRenderActionFlags &ioActionFlags,
OSStatus result = noErr;
result = mMainInput->PullInput(ioActionFlags, inTimeStamp, 0 /* element */, nFrames);
-
+
if (result == noErr)
{
if(ProcessesInPlace() && mMainOutput->WillAllocateBuffer())
@@ -369,7 +369,7 @@ OSStatus AUEffectBase::Render( AudioUnitRenderActionFlags &ioActionFlags,
if (ShouldBypassEffect())
{
// leave silence bit alone
-
+
if(!ProcessesInPlace() )
{
mMainInput->CopyBufferContentsTo (mMainOutput->GetBufferList());
@@ -385,22 +385,22 @@ OSStatus AUEffectBase::Render( AudioUnitRenderActionFlags &ioActionFlags,
else
{
// deal with scheduled parameters...
-
+
AudioBufferList &inputBufferList = mMainInput->GetBufferList();
AudioBufferList &outputBufferList = mMainOutput->GetBufferList();
-
+
ScheduledProcessParams processParams;
processParams.actionFlags = &ioActionFlags;
processParams.inputBufferList = &inputBufferList;
processParams.outputBufferList = &outputBufferList;
-
+
// divide up the buffer into slices according to scheduled params then
// do the DSP for each slice (ProcessScheduledSlice() called for each slice)
result = ProcessForScheduledParams( mParamList,
nFrames,
&processParams );
-
-
+
+
// fixup the buffer pointers to how they were before we started
UInt32 channelSize = nFrames * mBytesPerFrame;
for(unsigned int i = 0; i < inputBufferList.mNumberBuffers; i++ ) {
@@ -408,7 +408,7 @@ OSStatus AUEffectBase::Render( AudioUnitRenderActionFlags &ioActionFlags,
inputBufferList.mBuffers[i].mData = (char *)inputBufferList.mBuffers[i].mData - size;
inputBufferList.mBuffers[i].mDataByteSize = size;
}
-
+
for(unsigned int i = 0; i < outputBufferList.mNumberBuffers; i++ ) {
UInt32 size = outputBufferList.mBuffers[i].mNumberChannels * channelSize;
outputBufferList.mBuffers[i].mData = (char *)outputBufferList.mBuffers[i].mData - size;
@@ -416,13 +416,13 @@ OSStatus AUEffectBase::Render( AudioUnitRenderActionFlags &ioActionFlags,
}
}
}
-
+
if ( (ioActionFlags & kAudioUnitRenderAction_OutputIsSilence) && !ProcessesInPlace() )
{
AUBufferList::ZeroBuffer(mMainOutput->GetBufferList() );
}
}
-
+
return result;
}
@@ -435,7 +435,7 @@ OSStatus AUEffectBase::ProcessBufferLists(
{
if (ShouldBypassEffect())
return noErr;
-
+
// interleaved (or mono)
switch (mCommonPCMFormat) {
case CAStreamBasicDescription::kPCMFormatFloat32 :
@@ -450,7 +450,7 @@ OSStatus AUEffectBase::ProcessBufferLists(
default :
throw CAException(kAudio_UnimplementedError);
}
-
+
return noErr;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h
index 13ba96b..a7c62c2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h
@@ -2,14 +2,14 @@
File: AUEffectBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUEffectBase_h__
#define __AUEffectBase_h__
@@ -63,7 +63,7 @@ public:
bool inProcessesInPlace = true );
/*! @dtor ~AUEffectBase */
~AUEffectBase();
-
+
/*! @method Initialize */
virtual OSStatus Initialize();
@@ -112,7 +112,7 @@ public:
UInt32 inNumberFrames);
// our virtual methods
-
+
// If your unit processes N to N channels, and there are no interactions between channels,
// it can override NewKernel to create a mono processing object per channel. Otherwise,
// don't override NewKernel, and instead, override ProcessBufferLists.
@@ -129,7 +129,7 @@ public:
// convenience format accessors (use output 0's format)
/*! @method GetSampleRate */
Float64 GetSampleRate();
-
+
/*! @method GetNumberOfChannels */
UInt32 GetNumberOfChannels();
@@ -141,7 +141,7 @@ public:
{
Globals()->SetParameter(paramID, value);
}
-
+
/*! @method GetParameter */
using AUBase::GetParameter;
AudioUnitParameterValue GetParameter( AudioUnitParameterID paramID )
@@ -151,13 +151,13 @@ public:
/*! @method CanScheduleParameters */
virtual bool CanScheduleParameters() const { return true; }
-
+
/*! @method IsBypassEffect */
// This is used for the property value - to reflect to the UI if an effect is bypassed
bool IsBypassEffect () { return mBypassEffect; }
-
+
protected:
-
+
/*! @method MaintainKernels */
void MaintainKernels();
@@ -165,17 +165,17 @@ protected:
// This is used in the render call to see if an effect is bypassed
// It can return a different status than IsBypassEffect (though it MUST take that into account)
virtual bool ShouldBypassEffect () { return IsBypassEffect(); }
-
+
public:
/*! @method SetBypassEffect */
virtual void SetBypassEffect (bool inFlag) { mBypassEffect = inFlag; }
-
+
/*! @method SetParamHasSampleRateDependency */
- void SetParamHasSampleRateDependency (bool inFlag)
- {
- mParamSRDep = inFlag;
+ void SetParamHasSampleRateDependency (bool inFlag)
+ {
+ mParamSRDep = inFlag;
}
-
+
/*! @method GetParamHasSampleRateDependency */
bool GetParamHasSampleRateDependency () const { return mParamSRDep; }
@@ -194,12 +194,12 @@ public:
bool ProcessesInPlace() const {return mProcessesInPlace;};
void SetProcessesInPlace(bool inProcessesInPlace) {mProcessesInPlace = inProcessesInPlace;};
-
+
typedef std::vector<AUKernelBase *> KernelList;
-
-
-protected:
+
+
+protected:
/*! @var mKernelList */
KernelList mKernelList;
@@ -209,13 +209,13 @@ protected:
bool IsInputSilent (AudioUnitRenderActionFlags inActionFlags, UInt32 inFramesToProcess)
{
bool inputSilent = (inActionFlags & kAudioUnitRenderAction_OutputIsSilence) != 0;
-
+
// take latency and tail time into account when propagating the silent bit
UInt32 silentTimeoutFrames = UInt32(GetSampleRate() * (GetLatency() + GetTailTime()));
mSilentTimeout.Process (inFramesToProcess, silentTimeoutFrames, inputSilent);
return inputSilent;
}
-
+
#if TARGET_OS_IPHONE
void SetOnlyOneKernel(bool inUseOnlyOneKernel) { mOnlyOneKernel = inUseOnlyOneKernel; } // set in ctor of subclass that wants it.
#endif
@@ -228,26 +228,26 @@ protected:
UInt32 inFramesToProcess );
CAStreamBasicDescription::CommonPCMFormat GetCommonPCMFormat() const { return mCommonPCMFormat; }
-
+
private:
/*! @var mBypassEffect */
bool mBypassEffect;
/*! @var mParamSRDep */
bool mParamSRDep;
-
+
/*! @var mProcessesInplace */
bool mProcessesInPlace;
-
+
/*! @var mSilentTimeout */
AUSilentTimeout mSilentTimeout;
/*! @var mMainOutput */
AUOutputElement * mMainOutput;
-
+
/*! @var mMainInput */
AUInputElement * mMainInput;
-
+
#if TARGET_OS_IPHONE
/*! @var mOnlyOneKernel */
bool mOnlyOneKernel;
@@ -299,16 +299,16 @@ public:
{
return mAudioUnit->GetSampleRate();
}
-
+
/*! @method GetParameter */
- AudioUnitParameterValue GetParameter (AudioUnitParameterID paramID)
+ AudioUnitParameterValue GetParameter (AudioUnitParameterID paramID)
{
return mAudioUnit->GetParameter(paramID);
}
-
+
void SetChannelNum (UInt32 inChan) { mChannelNum = inChan; }
UInt32 GetChannelNum () { return mChannelNum; }
-
+
protected:
/*! @var mAudioUnit */
AUEffectBase * mAudioUnit;
@@ -332,41 +332,41 @@ void AUEffectBase::ProcessBufferListsT(
if (inBuffer.mNumberBuffers == 1) {
if (inBuffer.mBuffers[0].mNumberChannels == 0)
throw CAException(kAudio_ParamError);
-
+
for (UInt32 channel = 0; channel < mKernelList.size(); ++channel) {
AUKernelBase *kernel = mKernelList[channel];
-
+
if (kernel == NULL) continue;
ioSilence = silentInput;
-
+
// process each interleaved channel individually
kernel->Process(
- (const T *)inBuffer.mBuffers[0].mData + channel,
+ (const T *)inBuffer.mBuffers[0].mData + channel,
(T *)outBuffer.mBuffers[0].mData + channel,
inFramesToProcess,
inBuffer.mBuffers[0].mNumberChannels,
ioSilence);
-
+
if (!ioSilence)
ioActionFlags &= ~kAudioUnitRenderAction_OutputIsSilence;
}
} else {
for (UInt32 channel = 0; channel < mKernelList.size(); ++channel) {
AUKernelBase *kernel = mKernelList[channel];
-
+
if (kernel == NULL) continue;
-
+
ioSilence = silentInput;
const AudioBuffer *srcBuffer = &inBuffer.mBuffers[channel];
AudioBuffer *destBuffer = &outBuffer.mBuffers[channel];
-
+
kernel->Process(
- (const T *)srcBuffer->mData,
- (T *)destBuffer->mData,
+ (const T *)srcBuffer->mData,
+ (T *)destBuffer->mData,
inFramesToProcess,
1,
ioSilence);
-
+
if (!ioSilence)
ioActionFlags &= ~kAudioUnitRenderAction_OutputIsSilence;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp
index e5e358d..520d76a 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp
@@ -2,14 +2,14 @@
File: AUMIDIBase.cpp
Abstract: AUMIDIBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUMIDIBase.h"
#include <CoreMIDI/CoreMIDI.h>
@@ -64,18 +64,18 @@ enum
kMidiController_AllNotesOff = 123
};
-AUMIDIBase::AUMIDIBase(AUBase* inBase)
- : mAUBaseInstance (*inBase)
+AUMIDIBase::AUMIDIBase(AUBase* inBase)
+ : mAUBaseInstance (*inBase)
{
#if CA_AUTO_MIDI_MAP
mMapManager = new CAAUMIDIMapManager();
#endif
}
-AUMIDIBase::~AUMIDIBase()
+AUMIDIBase::~AUMIDIBase()
{
#if CA_AUTO_MIDI_MAP
- if (mMapManager)
+ if (mMapManager)
delete mMapManager;
#endif
}
@@ -88,7 +88,7 @@ OSStatus AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID inID,
Boolean & outWritable)
{
OSStatus result = noErr;
-
+
switch (inID) {
#if !TARGET_OS_IPHONE
case kMusicDeviceProperty_MIDIXMLNames:
@@ -100,8 +100,8 @@ OSStatus AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID inID,
} else
result = kAudioUnitErr_InvalidProperty;
break;
-#endif
-#if CA_AUTO_MIDI_MAP
+#endif
+#if CA_AUTO_MIDI_MAP
case kAudioUnitProperty_AllParameterMIDIMappings:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
ca_require(inElement == 0, InvalidElement);
@@ -109,15 +109,15 @@ OSStatus AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID inID,
outDataSize = sizeof (AUParameterMIDIMapping)*mMapManager->NumMaps();
result = noErr;
break;
-
+
case kAudioUnitProperty_HotMapParameterMIDIMapping:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
ca_require(inElement == 0, InvalidElement);
outWritable = true;
- outDataSize = sizeof (AUParameterMIDIMapping);
+ outDataSize = sizeof (AUParameterMIDIMapping);
result = noErr;
break;
-
+
case kAudioUnitProperty_AddParameterMIDIMapping:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
ca_require(inElement == 0, InvalidElement);
@@ -125,12 +125,12 @@ OSStatus AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID inID,
outDataSize = sizeof (AUParameterMIDIMapping);
result = noErr;
break;
-
+
case kAudioUnitProperty_RemoveParameterMIDIMapping:
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
ca_require(inElement == 0, InvalidElement);
outWritable = true;
- outDataSize = sizeof (AUParameterMIDIMapping);
+ outDataSize = sizeof (AUParameterMIDIMapping);
result = noErr;
break;
#endif
@@ -155,7 +155,7 @@ OSStatus AUMIDIBase::DelegateGetProperty( AudioUnitPropertyID inID,
void * outData)
{
OSStatus result;
-
+
switch (inID) {
#if !TARGET_OS_IPHONE
case kMusicDeviceProperty_MIDIXMLNames:
@@ -163,7 +163,7 @@ OSStatus AUMIDIBase::DelegateGetProperty( AudioUnitPropertyID inID,
ca_require(inElement == 0, InvalidElement);
result = GetXMLNames((CFURLRef *)outData);
break;
-#endif
+#endif
#if CA_AUTO_MIDI_MAP
case kAudioUnitProperty_AllParameterMIDIMappings:{
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -175,7 +175,7 @@ OSStatus AUMIDIBase::DelegateGetProperty( AudioUnitPropertyID inID,
result = noErr;
break;
}
-
+
case kAudioUnitProperty_HotMapParameterMIDIMapping:{
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
ca_require(inElement == 0, InvalidElement);
@@ -185,7 +185,7 @@ OSStatus AUMIDIBase::DelegateGetProperty( AudioUnitPropertyID inID,
break;
}
#endif
-
+
default:
result = kAudioUnitErr_InvalidProperty;
break;
@@ -207,7 +207,7 @@ OSStatus AUMIDIBase::DelegateSetProperty( AudioUnitPropertyID inID,
UInt32 inDataSize)
{
OSStatus result;
-
+
switch (inID) {
#if CA_AUTO_MIDI_MAP
case kAudioUnitProperty_AddParameterMIDIMapping:{
@@ -215,11 +215,11 @@ OSStatus AUMIDIBase::DelegateSetProperty( AudioUnitPropertyID inID,
ca_require(inElement == 0, InvalidElement);
AUParameterMIDIMapping * maps = (AUParameterMIDIMapping*)inData;
mMapManager->SortedInsertToParamaterMaps (maps, (inDataSize / sizeof(AUParameterMIDIMapping)), mAUBaseInstance);
- mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);
+ mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);
result = noErr;
break;
}
-
+
case kAudioUnitProperty_RemoveParameterMIDIMapping:{
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
ca_require(inElement == 0, InvalidElement);
@@ -227,16 +227,16 @@ OSStatus AUMIDIBase::DelegateSetProperty( AudioUnitPropertyID inID,
bool didChange;
mMapManager->SortedRemoveFromParameterMaps(maps, (inDataSize / sizeof(AUParameterMIDIMapping)), didChange);
if (didChange)
- mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);
+ mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);
result = noErr;
break;
}
-
+
case kAudioUnitProperty_HotMapParameterMIDIMapping:{
ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
ca_require(inElement == 0, InvalidElement);
AUParameterMIDIMapping & map = *((AUParameterMIDIMapping*)inData);
- mMapManager->SetHotMapping (map);
+ mMapManager->SetHotMapping (map);
result = noErr;
break;
}
@@ -249,7 +249,7 @@ OSStatus AUMIDIBase::DelegateSetProperty( AudioUnitPropertyID inID,
break;
}
#endif
-
+
default:
result = kAudioUnitErr_InvalidProperty;
break;
@@ -319,10 +319,10 @@ inline const Byte * NextMIDIEvent(const Byte *event, const Byte *end)
OSStatus AUMIDIBase::HandleMIDIPacketList(const MIDIPacketList *pktlist)
{
if (!mAUBaseInstance.IsInitialized()) return kAudioUnitErr_Uninitialized;
-
+
int nPackets = pktlist->numPackets;
const MIDIPacket *pkt = pktlist->packet;
-
+
while (nPackets-- > 0) {
const Byte *event = pkt->data, *packetEnd = event + pkt->length;
long startFrame = (long)pkt->timeStamp;
@@ -347,20 +347,20 @@ OSStatus AUMIDIBase::HandleMIDIPacketList(const MIDIPacketList *pktlist)
OSStatus AUMIDIBase::HandleMidiEvent(UInt8 status, UInt8 channel, UInt8 data1, UInt8 data2, UInt32 inStartFrame)
{
if (!mAUBaseInstance.IsInitialized()) return kAudioUnitErr_Uninitialized;
-
-#if CA_AUTO_MIDI_MAP
-// you potentially have a choice to make here - if a param mapping matches, do you still want to process the
+
+#if CA_AUTO_MIDI_MAP
+// you potentially have a choice to make here - if a param mapping matches, do you still want to process the
// MIDI event or not. The default behaviour is to continue on with the MIDI event.
if (mMapManager->HandleHotMapping (status, channel, data1, mAUBaseInstance)) {
mAUBaseInstance.PropertyChanged (kAudioUnitProperty_HotMapParameterMIDIMapping, kAudioUnitScope_Global, 0);
}
else {
mMapManager->FindParameterMapEventMatch(status, channel, data1, data2, inStartFrame, mAUBaseInstance);
- }
-#endif
-
+ }
+#endif
+
OSStatus result = noErr;
-
+
switch(status)
{
case kMidiMessage_NoteOn:
@@ -374,16 +374,16 @@ OSStatus AUMIDIBase::HandleMidiEvent(UInt8 status, UInt8 channel, UInt8 data1,
result = HandleNoteOff(channel, data1, data2, inStartFrame);
}
break;
-
+
case kMidiMessage_NoteOff:
result = HandleNoteOff(channel, data1, data2, inStartFrame);
break;
-
+
default:
result = HandleNonNoteEvent (status, channel, data1, data2, inStartFrame);
break;
}
-
+
return result;
}
@@ -396,15 +396,15 @@ OSStatus AUMIDIBase::HandleNonNoteEvent (UInt8 status, UInt8 channel, UInt8 data
case kMidiMessage_PitchWheel:
result = HandlePitchWheel(channel, data1, data2, inStartFrame);
break;
-
+
case kMidiMessage_ProgramChange:
result = HandleProgramChange(channel, data1);
break;
-
+
case kMidiMessage_ChannelPressure:
result = HandleChannelPressure(channel, data1, inStartFrame);
break;
-
+
case kMidiMessage_ControlChange:
{
switch (data1) {
@@ -419,7 +419,7 @@ OSStatus AUMIDIBase::HandleNonNoteEvent (UInt8 status, UInt8 channel, UInt8 data
case kMidiController_AllSoundOff:
result = HandleAllSoundOff(channel);
break;
-
+
default:
result = HandleControlChange(channel, data1, data2, inStartFrame);
break;
@@ -433,7 +433,7 @@ OSStatus AUMIDIBase::HandleNonNoteEvent (UInt8 status, UInt8 channel, UInt8 data
return result;
}
-OSStatus AUMIDIBase::SysEx (const UInt8 * inData,
+OSStatus AUMIDIBase::SysEx (const UInt8 * inData,
UInt32 inLength)
{
if (!mAUBaseInstance.IsInitialized()) return kAudioUnitErr_Uninitialized;
@@ -466,7 +466,7 @@ OSStatus AUMIDIBase::ComponentEntryDispatch( ComponentParameters * params,
if (This == NULL) return kAudio_ParamError;
OSStatus result;
-
+
switch (params->what) {
case kMusicDeviceMIDIEventSelect:
{
@@ -489,7 +489,7 @@ OSStatus AUMIDIBase::ComponentEntryDispatch( ComponentParameters * params,
result = badComponentSelector;
break;
}
-
+
return result;
}
#endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h
index 40c6a77..223f50e 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h
@@ -2,14 +2,14 @@
File: AUMIDIBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUMIDIBase_h__
#define __AUMIDIBase_h__
@@ -66,24 +66,24 @@ public:
AUMIDIBase(AUBase* inBase);
/*! @dtor ~AUMIDIBase */
virtual ~AUMIDIBase();
-
+
/*! @method MIDIEvent */
- virtual OSStatus MIDIEvent( UInt32 inStatus,
- UInt32 inData1,
- UInt32 inData2,
+ virtual OSStatus MIDIEvent( UInt32 inStatus,
+ UInt32 inData1,
+ UInt32 inData2,
UInt32 inOffsetSampleFrame)
{
UInt32 strippedStatus = inStatus & 0xf0;
UInt32 channel = inStatus & 0x0f;
-
+
return HandleMidiEvent(strippedStatus, channel, inData1, inData2, inOffsetSampleFrame);
}
-
+
/*! @method HandleMIDIPacketList */
OSStatus HandleMIDIPacketList(const MIDIPacketList *pktlist);
-
+
/*! @method SysEx */
- virtual OSStatus SysEx( const UInt8 * inData,
+ virtual OSStatus SysEx( const UInt8 * inData,
UInt32 inLength);
#if TARGET_API_MAC_OSX
@@ -99,7 +99,7 @@ public:
AudioUnitScope inScope,
AudioUnitElement inElement,
void * outData);
-
+
/*! @method DelegateSetProperty */
virtual OSStatus DelegateSetProperty( AudioUnitPropertyID inID,
AudioUnitScope inScope,
@@ -118,15 +118,15 @@ protected:
UInt32 inStartFrame);
/*! @method HandleNonNoteEvent */
- virtual OSStatus HandleNonNoteEvent ( UInt8 status,
- UInt8 channel,
- UInt8 data1,
- UInt8 data2,
+ virtual OSStatus HandleNonNoteEvent ( UInt8 status,
+ UInt8 channel,
+ UInt8 data1,
+ UInt8 data2,
UInt32 inStartFrame);
#if TARGET_API_MAC_OSX
/*! @method GetXMLNames */
- virtual OSStatus GetXMLNames(CFURLRef *outNameDocument)
+ virtual OSStatus GetXMLNames(CFURLRef *outNameDocument)
{ return kAudioUnitErr_InvalidProperty; } // if not overridden, it's unsupported
#endif
@@ -136,25 +136,25 @@ protected:
UInt8 inNoteNumber,
UInt8 inVelocity,
UInt32 inStartFrame) { return noErr; }
-
+
/*! @method HandleNoteOff */
virtual OSStatus HandleNoteOff( UInt8 inChannel,
UInt8 inNoteNumber,
UInt8 inVelocity,
UInt32 inStartFrame) { return noErr; }
-
+
/*! @method HandleControlChange */
virtual OSStatus HandleControlChange( UInt8 inChannel,
UInt8 inController,
UInt8 inValue,
UInt32 inStartFrame) { return noErr; }
-
+
/*! @method HandlePitchWheel */
virtual OSStatus HandlePitchWheel( UInt8 inChannel,
UInt8 inPitch1,
UInt8 inPitch2,
UInt32 inStartFrame) { return noErr; }
-
+
/*! @method HandleChannelPressure */
virtual OSStatus HandleChannelPressure( UInt8 inChannel,
UInt8 inValue,
@@ -172,15 +172,15 @@ protected:
/*! @method HandleResetAllControllers */
virtual OSStatus HandleResetAllControllers(UInt8 inChannel) { return noErr; }
-
+
/*! @method HandleAllNotesOff */
virtual OSStatus HandleAllNotesOff( UInt8 inChannel) { return noErr; }
-
+
/*! @method HandleAllSoundOff */
virtual OSStatus HandleAllSoundOff( UInt8 inChannel) { return noErr; }
-//System messages
+//System messages
/*! @method HandleSysEx */
virtual OSStatus HandleSysEx( const UInt8 * inData,
UInt32 inLength ) { return noErr; }
@@ -188,19 +188,19 @@ protected:
#if CA_AUTO_MIDI_MAP
/* map manager */
CAAUMIDIMapManager *GetMIDIMapManager() {return mMapManager;};
-
+
#endif
-
+
private:
/*! @var mAUBaseInstance */
AUBase & mAUBaseInstance;
-
+
#if CA_AUTO_MIDI_MAP
/* map manager */
CAAUMIDIMapManager * mMapManager;
#endif
-
+
public:
#if !CA_USE_AUDIO_PLUGIN_ONLY
// component dispatcher
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp
index dfe307c..c60aa40 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp
@@ -2,14 +2,14 @@
File: AUMIDIEffectBase.cpp
Abstract: AUMIDIEffectBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUMIDIEffectBase.h"
@@ -61,7 +61,7 @@ static OSStatus AUMIDIEffectBaseMIDIEvent(void * inComponentStorage,
UInt32 inOffsetSampleFrame);
AUMIDIEffectBase::AUMIDIEffectBase( AudioComponentInstance inInstance,
- bool inProcessesInPlace )
+ bool inProcessesInPlace )
: AUEffectBase(inInstance, inProcessesInPlace),
AUMIDIBase(this)
{
@@ -74,12 +74,12 @@ OSStatus AUMIDIEffectBase::GetPropertyInfo(AudioUnitPropertyID inID,
Boolean & outWritable)
{
OSStatus result;
-
+
result = AUEffectBase::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
-
+
if (result == kAudioUnitErr_InvalidProperty)
result = AUMIDIBase::DelegateGetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
-
+
return result;
}
@@ -99,12 +99,12 @@ OSStatus AUMIDIEffectBase::GetProperty( AudioUnitPropertyID inID,
return kAudioUnitErr_InvalidElement;
}
#endif
-
+
result = AUEffectBase::GetProperty (inID, inScope, inElement, outData);
-
+
if (result == kAudioUnitErr_InvalidProperty)
result = AUMIDIBase::DelegateGetProperty (inID, inScope, inElement, outData);
-
+
return result;
}
@@ -116,10 +116,10 @@ OSStatus AUMIDIEffectBase::SetProperty( AudioUnitPropertyID inID,
{
OSStatus result = AUEffectBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
-
+
if (result == kAudioUnitErr_InvalidProperty)
result = AUMIDIBase::DelegateSetProperty (inID, inScope, inElement, inData, inDataSize);
-
+
return result;
}
@@ -131,7 +131,7 @@ OSStatus AUMIDIEffectBase::ComponentEntryDispatch(ComponentParameters * para
if (This == NULL) return paramErr;
OSStatus result;
-
+
switch (params->what) {
case kMusicDeviceMIDIEventSelect:
case kMusicDeviceSysExSelect:
@@ -141,7 +141,7 @@ OSStatus AUMIDIEffectBase::ComponentEntryDispatch(ComponentParameters * para
result = AUEffectBase::ComponentEntryDispatch(params, This);
break;
}
-
+
return result;
}
#endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h
index b38f506..744abd6 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h
@@ -2,14 +2,14 @@
File: AUMIDIEffectBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUMIDIEffectBase_h__
#define __AUMIDIEffectBase_h__
@@ -67,7 +67,7 @@ public:
{
return AUMIDIBase::MIDIEvent (inStatus, inData1, inData2, inOffsetSampleFrame);
}
-
+
/*! @method SysEx */
virtual OSStatus SysEx(const UInt8 * inData,
UInt32 inLength)
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp
index 591c43a..c2ed4cc 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp
@@ -2,14 +2,14 @@
File: AUOutputBase.cpp
Abstract: AUOutputBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !CA_USE_AUDIO_PLUGIN_ONLY
#include "AUOutputBase.h"
@@ -52,7 +52,7 @@ OSStatus AUOutputBase::ComponentEntryDispatch(ComponentParameters *params, AUOu
if (This == NULL) return paramErr;
OSStatus result;
-
+
switch (params->what) {
case kAudioOutputUnitStartSelect:
{
@@ -70,7 +70,7 @@ OSStatus AUOutputBase::ComponentEntryDispatch(ComponentParameters *params, AUOu
result = badComponentSelector;
break;
}
-
+
return result;
}
#endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h
index 8e5399b..f1a3c15 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h
@@ -2,14 +2,14 @@
File: AUOutputBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUOutputBase_h__
#define __AUOutputBase_h__
@@ -63,7 +63,7 @@ public:
// additional component entry points
/*! @method Start */
virtual OSStatus Start() = 0;
-
+
/*! @method Stop */
virtual OSStatus Stop() = 0;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp
index f1e2f24..91e7d9c 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp
@@ -2,14 +2,14 @@
File: AUPannerBase.cpp
Abstract: AUPannerBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUPannerBase.h"
#include "CABundleLocker.h"
@@ -51,13 +51,13 @@
static bool sLocalized = false;
-static CFStringRef kPanner_Azimuth_Name = CFSTR("azimuth");
-static CFStringRef kPanner_Elevation_Name = CFSTR("elevation");
+static CFStringRef kPanner_Azimuth_Name = CFSTR("azimuth");
+static CFStringRef kPanner_Elevation_Name = CFSTR("elevation");
static CFStringRef kPanner_Distance_Name = CFSTR("distance");
-static CFStringRef kPanner_CoordScale_Name = CFSTR("coordinate scale");
-static CFStringRef kPanner_RefDistance_Name = CFSTR("reference distance");
-static CFStringRef kPanner_Gain_Name = CFSTR("gain");
+static CFStringRef kPanner_CoordScale_Name = CFSTR("coordinate scale");
+static CFStringRef kPanner_RefDistance_Name = CFSTR("reference distance");
+static CFStringRef kPanner_Gain_Name = CFSTR("gain");
static Float32 kPannerParamDefault_Azimuth = 0.;
static Float32 kPannerParamDefault_Elevation = 0.;
@@ -75,30 +75,30 @@ AUPannerBase::AUPannerBase(AudioComponentInstance inAudioUnit)
{
CABundleLocker lock;
if (!sLocalized)
- {
+ {
CFBundleRef bundle = CFBundleGetBundleWithIdentifier( CFSTR("com.apple.audio.units.Components") );
if (bundle != NULL)
{
kPanner_Azimuth_Name = CFCopyLocalizedStringFromTableInBundle(kPanner_Azimuth_Name, CFSTR("AudioUnits"), bundle, CFSTR(""));
kPanner_Elevation_Name = CFCopyLocalizedStringFromTableInBundle(kPanner_Elevation_Name, CFSTR("AudioUnits"), bundle, CFSTR(""));
kPanner_Distance_Name = CFCopyLocalizedStringFromTableInBundle(kPanner_Distance_Name, CFSTR("AudioUnits"), bundle, CFSTR(""));
-
+
kPanner_CoordScale_Name = CFCopyLocalizedStringFromTableInBundle(kPanner_CoordScale_Name, CFSTR("AudioUnits"), bundle, CFSTR(""));
kPanner_RefDistance_Name = CFCopyLocalizedStringFromTableInBundle(kPanner_RefDistance_Name, CFSTR("AudioUnits"), bundle, CFSTR(""));
kPanner_Gain_Name = CFCopyLocalizedStringFromTableInBundle(kPanner_Gain_Name, CFSTR("AudioUnits"), bundle, CFSTR(""));
}
-
+
sLocalized = true;
}
}
-
+
CreateElements();
-
+
SetParameter(kPannerParam_Azimuth, kPannerParamDefault_Azimuth);
SetParameter(kPannerParam_Elevation, kPannerParamDefault_Elevation);
SetParameter(kPannerParam_Distance, kPannerParamDefault_Distance);
-
+
SetParameter(kPannerParam_CoordScale, kPannerParamDefault_CoordScale);
SetParameter(kPannerParam_RefDistance, kPannerParamDefault_RefDistance);
SetParameter(kPannerParam_Gain, kPannerParamDefault_Gain);
@@ -135,13 +135,13 @@ void AUPannerBase::AllocBypassMatrix()
static AudioChannelLayoutTag DefaultTagForNumberOfChannels(UInt32 inNumberChannels)
{
switch (inNumberChannels) {
- case 1: return kAudioChannelLayoutTag_Mono;
- case 2: return kAudioChannelLayoutTag_Stereo;
- case 4: return kAudioChannelLayoutTag_Quadraphonic;
- case 5: return kAudioChannelLayoutTag_AudioUnit_5_0;
- case 6: return kAudioChannelLayoutTag_AudioUnit_6_0;
- case 7: return kAudioChannelLayoutTag_AudioUnit_7_0;
- case 8: return kAudioChannelLayoutTag_AudioUnit_8;
+ case 1: return kAudioChannelLayoutTag_Mono;
+ case 2: return kAudioChannelLayoutTag_Stereo;
+ case 4: return kAudioChannelLayoutTag_Quadraphonic;
+ case 5: return kAudioChannelLayoutTag_AudioUnit_5_0;
+ case 6: return kAudioChannelLayoutTag_AudioUnit_6_0;
+ case 7: return kAudioChannelLayoutTag_AudioUnit_7_0;
+ case 8: return kAudioChannelLayoutTag_AudioUnit_8;
default: return 0xFFFF0000 | inNumberChannels;
}
@@ -153,7 +153,7 @@ static AudioChannelLayoutTag DefaultTagForNumberOfChannels(UInt32 inNumberChanne
OSStatus AUPannerBase::SetDefaultChannelLayoutsIfNone()
{
OSStatus err = noErr;
-
+
// if layout has not been set, then guess layout from number of channels
UInt32 inChannels = GetNumberOfInputChannels();
AudioChannelLayout inputLayoutSubstitute;
@@ -168,7 +168,7 @@ OSStatus AUPannerBase::SetDefaultChannelLayoutsIfNone()
err = SetAudioChannelLayout(kAudioUnitScope_Input, 0, &GetInputLayout());
if (err) return err;
}
-
+
// if layout has not been set, then guess layout from number of channels
UInt32 outChannels = GetNumberOfOutputChannels();
AudioChannelLayout outputLayoutSubstitute;
@@ -183,29 +183,29 @@ OSStatus AUPannerBase::SetDefaultChannelLayoutsIfNone()
err = SetAudioChannelLayout(kAudioUnitScope_Output, 0, &GetOutputLayout());
if (err) return err;
}
-
+
return err;
}
-
+
OSStatus AUPannerBase::UpdateBypassMatrix()
{
OSStatus err = SetDefaultChannelLayoutsIfNone();
if (err) return err;
-
+
UInt32 inChannels = GetNumberOfInputChannels();
- UInt32 outChannels = GetNumberOfOutputChannels();
-
+ UInt32 outChannels = GetNumberOfOutputChannels();
+
const AudioChannelLayout* inoutACL[2];
-
+
inoutACL[0] = &GetInputLayout();
inoutACL[1] = &GetOutputLayout();
mBypassMatrix.alloc(inChannels * outChannels, true);
-
+
UInt32 propSize = inChannels * outChannels * sizeof(Float32);
-
+
err = AudioFormatGetProperty(kAudioFormatProperty_MatrixMixMap, sizeof(inoutACL), inoutACL, &propSize, mBypassMatrix());
if (err) {
// if there is an error, use a diagonal matrix.
@@ -225,7 +225,7 @@ OSStatus AUPannerBase::UpdateBypassMatrix()
/*! @method Cleanup */
void AUPannerBase::Cleanup()
{
-
+
}
@@ -249,9 +249,9 @@ OSStatus AUPannerBase::GetParameterInfo( AudioUnitScope inScope,
outParameterInfo.flags = kAudioUnitParameterFlag_IsWritable
+ kAudioUnitParameterFlag_IsReadable;
-
+
if (inScope == kAudioUnitScope_Global) {
-
+
switch(inParameterID)
{
case kPannerParam_Azimuth:
@@ -279,7 +279,7 @@ OSStatus AUPannerBase::GetParameterInfo( AudioUnitScope inScope,
outParameterInfo.flags += kAudioUnitParameterFlag_IsHighResolution;
//outParameterInfo.flags += kAudioUnitParameterFlag_DisplayLogarithmic;
break;
-
+
case kPannerParam_CoordScale:
AUBase::FillInParameterName (outParameterInfo, kPanner_CoordScale_Name, false);
outParameterInfo.unit = kAudioUnitParameterUnit_Meters;
@@ -313,9 +313,9 @@ OSStatus AUPannerBase::GetParameterInfo( AudioUnitScope inScope,
} else {
result = kAudioUnitErr_InvalidParameter;
}
-
+
return result;
-}
+}
//_____________________________________________________________________________
//
@@ -324,15 +324,15 @@ OSStatus AUPannerBase::GetParameter( AudioUnitParameterID inParamID,
AudioUnitElement inElement,
Float32 & outValue)
{
- if (inScope != kAudioUnitScope_Global)
+ if (inScope != kAudioUnitScope_Global)
return kAudioUnitErr_InvalidScope;
-
+
outValue = Globals()->GetParameter(inParamID);
return noErr;
}
-
+
//_____________________________________________________________________________
//
OSStatus AUPannerBase::SetParameter( AudioUnitParameterID inParamID,
@@ -341,11 +341,11 @@ OSStatus AUPannerBase::SetParameter( AudioUnitParameterID inParamID,
Float32 inValue,
UInt32 inBufferOffsetInFrames)
{
- if (inScope != kAudioUnitScope_Global)
+ if (inScope != kAudioUnitScope_Global)
return kAudioUnitErr_InvalidScope;
Globals()->SetParameter(inParamID, inValue);
-
+
return noErr;
}
@@ -365,7 +365,7 @@ OSStatus AUPannerBase::GetPropertyInfo (AudioUnitPropertyID inID,
case kAudioUnitProperty_BypassEffect:
if (inScope != kAudioUnitScope_Global)
return kAudioUnitErr_InvalidScope;
-
+
outWritable = true;
outDataSize = sizeof (UInt32);
break;
@@ -384,7 +384,7 @@ OSStatus AUPannerBase::GetProperty (AudioUnitPropertyID inID,
void * outData)
{
OSStatus err = noErr;
- switch (inID)
+ switch (inID)
{
case kAudioUnitProperty_BypassEffect:
if (inScope != kAudioUnitScope_Global)
@@ -407,14 +407,14 @@ OSStatus AUPannerBase::SetProperty(AudioUnitPropertyID inID,
const void * inData,
UInt32 inDataSize)
{
- switch (inID)
+ switch (inID)
{
case kAudioUnitProperty_BypassEffect:
if (inDataSize < sizeof(UInt32))
return kAudioUnitErr_InvalidPropertyValue;
bool tempNewSetting = *((UInt32*)inData) != 0;
// we're changing the state of bypass
- if (tempNewSetting != IsBypassEffect())
+ if (tempNewSetting != IsBypassEffect())
{
if (!tempNewSetting && IsBypassEffect() && IsInitialized()) // turning bypass off and we're initialized
Reset(0, 0);
@@ -444,15 +444,15 @@ OSStatus AUPannerBase::ChangeStreamFormat (
const CAStreamBasicDescription & inPrevFormat,
const CAStreamBasicDescription & inNewFormat)
{
- if (inScope == kAudioUnitScope_Input && !InputChannelConfigIsSupported(inNewFormat.NumberChannels()))
+ if (inScope == kAudioUnitScope_Input && !InputChannelConfigIsSupported(inNewFormat.NumberChannels()))
return kAudioUnitErr_FormatNotSupported;
-
- if (inScope == kAudioUnitScope_Output && !OutputChannelConfigIsSupported(inNewFormat.NumberChannels()))
+
+ if (inScope == kAudioUnitScope_Output && !OutputChannelConfigIsSupported(inNewFormat.NumberChannels()))
return kAudioUnitErr_FormatNotSupported;
-
+
if (inNewFormat.NumberChannels() != inPrevFormat.NumberChannels())
RemoveAudioChannelLayout(inScope, inElement);
-
+
return AUBase::ChangeStreamFormat(inScope, inElement, inPrevFormat, inNewFormat);
}
@@ -463,9 +463,9 @@ OSStatus AUPannerBase::Render(AudioUnitRenderActionFlags & ioActionFlags,
const AudioTimeStamp & inTimeStamp,
UInt32 inNumberFrames)
{
- if (IsBypassEffect())
+ if (IsBypassEffect())
return BypassRender(ioActionFlags, inTimeStamp, inNumberFrames);
- else
+ else
return PannerRender(ioActionFlags, inTimeStamp, inNumberFrames);
}
@@ -483,16 +483,16 @@ OSStatus AUPannerBase::BypassRender(AudioUnitRenderActionFlags & ioActionFlags
AudioBufferList& outputBufferList = GetOutput(0)->GetBufferList();
AUBufferList::ZeroBuffer(outputBufferList);
-
- if (!isSilent)
+
+ if (!isSilent)
{
UInt32 inChannels = GetNumberOfInputChannels();
UInt32 outChannels = GetNumberOfOutputChannels();
Float32* bypass = mBypassMatrix();
for (UInt32 outChan = 0; outChan < outChannels; ++outChan)
{
- float* outData = GetOutput(0)->GetChannelData(outChan);
-
+ float* outData = GetOutput(0)->GetChannelData(outChan);
+
for (UInt32 inChan = 0; inChan < inChannels; ++inChan)
{
float* inData = GetInput(0)->GetChannelData(inChan);
@@ -510,13 +510,13 @@ UInt32 AUPannerBase::GetAudioChannelLayout( AudioUnitScope inScope,
AudioUnitElement inElement,
AudioChannelLayout * outLayoutPtr,
Boolean & outWritable)
-{
+{
SetDefaultChannelLayoutsIfNone();
-
+
outWritable = true;
-
+
CAAudioChannelLayout* caacl = NULL;
- switch (inScope)
+ switch (inScope)
{
case kAudioUnitScope_Input:
caacl = &mInputLayout;
@@ -527,14 +527,14 @@ UInt32 AUPannerBase::GetAudioChannelLayout( AudioUnitScope inScope,
default:
COMPONENT_THROW(kAudioUnitErr_InvalidScope);
}
-
+
if (inElement != 0)
COMPONENT_THROW(kAudioUnitErr_InvalidElement);
-
+
UInt32 size = caacl->IsValid() ? caacl->Size() : 0;
if (size > 0 && outLayoutPtr)
memcpy(outLayoutPtr, &caacl->Layout(), size);
-
+
return size;
}
@@ -544,7 +544,7 @@ OSStatus AUPannerBase::RemoveAudioChannelLayout( AudioUnitScope inScope,
AudioUnitElement inElement)
{
CAAudioChannelLayout* caacl = NULL;
- switch (inScope)
+ switch (inScope)
{
case kAudioUnitScope_Input:
caacl = &mInputLayout;
@@ -555,17 +555,17 @@ OSStatus AUPannerBase::RemoveAudioChannelLayout( AudioUnitScope inScope,
default:
return kAudioUnitErr_InvalidScope;
}
-
+
if (inElement != 0)
return kAudioUnitErr_InvalidElement;
-
+
*caacl = NULL;
return noErr;
}
//_____________________________________________________________________________
//
-OSStatus AUPannerBase::SetAudioChannelLayout( AudioUnitScope inScope,
+OSStatus AUPannerBase::SetAudioChannelLayout( AudioUnitScope inScope,
AudioUnitElement inElement,
const AudioChannelLayout * inLayout)
{
@@ -574,10 +574,10 @@ OSStatus AUPannerBase::SetAudioChannelLayout( AudioUnitScope inScope,
if (!ChannelLayoutTagIsSupported(inScope, inElement, inLayout->mChannelLayoutTag))
return kAudioUnitErr_FormatNotSupported;
-
+
CAAudioChannelLayout* caacl = NULL;
UInt32 currentChannels;
- switch (inScope)
+ switch (inScope)
{
case kAudioUnitScope_Input:
caacl = &mInputLayout;
@@ -590,28 +590,28 @@ OSStatus AUPannerBase::SetAudioChannelLayout( AudioUnitScope inScope,
default:
return kAudioUnitErr_InvalidScope;
}
-
+
if (inElement != 0)
return kAudioUnitErr_InvalidElement;
UInt32 numChannelsInLayout = CAAudioChannelLayout::NumberChannels(*inLayout);
if (currentChannels != numChannelsInLayout)
return kAudioUnitErr_InvalidPropertyValue;
-
+
*caacl = inLayout;
if (IsInitialized())
UpdateBypassMatrix();
-
+
return noErr;
}
//_____________________________________________________________________________
//
UInt32 AUPannerBase::GetChannelLayoutTags( AudioUnitScope inScope,
- AudioUnitElement inElement,
+ AudioUnitElement inElement,
AudioChannelLayoutTag* outTags)
{
- switch (inScope)
+ switch (inScope)
{
case kAudioUnitScope_Input:
if (outTags) {
@@ -687,20 +687,20 @@ bool AUPannerBase::OutputChannelConfigIsSupported(UInt32 inNumberChannels)
//_____________________________________________________________________________
//
-bool AUPannerBase::ChannelLayoutTagIsSupported( AudioUnitScope inScope,
- AudioUnitElement inElement,
+bool AUPannerBase::ChannelLayoutTagIsSupported( AudioUnitScope inScope,
+ AudioUnitElement inElement,
AudioChannelLayoutTag inTag)
{
UInt32 numTags = GetChannelLayoutTags(inScope, inElement, NULL);
CAAutoFree<AudioChannelLayoutTag> tags(numTags);
GetChannelLayoutTags(inScope, inElement, tags());
-
+
for (UInt32 i = 0; i < numTags; ++i)
{
if (tags[i] == inTag)
return true;
}
-
+
return false;
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h
index 3184830..8804255 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h
@@ -2,14 +2,14 @@
File: AUPannerBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUPannerBase_h__
#define __AUPannerBase_h__
@@ -61,7 +61,7 @@ public:
AUPannerBase(AudioComponentInstance inAudioUnit);
/*! @dtor ~AUPannerBase */
virtual ~AUPannerBase();
-
+
/*! @method Initialize */
virtual OSStatus Initialize();
@@ -114,14 +114,14 @@ public:
const CAStreamBasicDescription & inPrevFormat,
const CAStreamBasicDescription & inNewFormat);
-
+
/*! @method IsBypassEffect */
// This is used for the property value - to reflect to the UI if an effect is bypassed
bool IsBypassEffect () { return mBypassEffect; }
-
+
/*! @method SetBypassEffect */
virtual void SetBypassEffect (bool inFlag) { mBypassEffect = inFlag; }
-
+
/*! @method Render */
virtual OSStatus Render(AudioUnitRenderActionFlags & ioActionFlags,
@@ -146,17 +146,17 @@ public:
Boolean & outWritable);
/*! @method SetAudioChannelLayout */
- virtual OSStatus SetAudioChannelLayout( AudioUnitScope inScope,
+ virtual OSStatus SetAudioChannelLayout( AudioUnitScope inScope,
AudioUnitElement inElement,
const AudioChannelLayout * inLayout);
/*! @method RemoveAudioChannelLayout */
- virtual OSStatus RemoveAudioChannelLayout( AudioUnitScope inScope,
+ virtual OSStatus RemoveAudioChannelLayout( AudioUnitScope inScope,
AudioUnitElement inElement);
/*! @method GetChannelLayoutTags */
virtual UInt32 GetChannelLayoutTags( AudioUnitScope inScope,
- AudioUnitElement inElement,
+ AudioUnitElement inElement,
AudioChannelLayoutTag* outTags);
/*! @method GetNumberOfInputChannels */
@@ -169,7 +169,7 @@ public:
AudioUnitScope inScope,
AudioUnitElement inElement,
Float32 & outValue);
-
+
/*! @method SetParameter */
virtual OSStatus SetParameter( AudioUnitParameterID inParamID,
AudioUnitScope inScope,
@@ -185,7 +185,7 @@ public:
OSStatus err = SetParameter(inParamID, kAudioUnitScope_Global, 0, inValue, 0);
if (err) throw err;
}
-
+
/*! @method GetParameter */
Float32 GetParameter( UInt32 inParamID )
{
@@ -219,8 +219,8 @@ public:
/*! @method GetCoordScale */
Float32 GetCoordScale() { return GetParameter(kPannerParam_CoordScale); }
/*! @method GetRefDistance */
- Float32 GetRefDistance() { return GetParameter(kPannerParam_RefDistance); }
-
+ Float32 GetRefDistance() { return GetParameter(kPannerParam_RefDistance); }
+
/*! @method SetGain */
void SetGain(Float32 inValue) { SetParameter(kPannerParam_Gain, inValue); }
/*! @method SetAzimuth */
@@ -233,7 +233,7 @@ public:
void SetCoordScale(Float32 inValue) { SetParameter(kPannerParam_CoordScale, inValue); }
/*! @method SetRefDistance */
void SetRefDistance(Float32 inValue) { SetParameter(kPannerParam_RefDistance, inValue); }
-
+
protected:
/*! @method ShouldBypassEffect */
// This is used in the render call to see if an effect is bypassed
@@ -248,17 +248,17 @@ protected:
/*! @method SetDefaultChannelLayoutsIfNone */
OSStatus SetDefaultChannelLayoutsIfNone();
-
+
/*! @method ChannelLayoutTagIsSupported */
- bool ChannelLayoutTagIsSupported( AudioUnitScope inScope,
- AudioUnitElement inElement,
+ bool ChannelLayoutTagIsSupported( AudioUnitScope inScope,
+ AudioUnitElement inElement,
AudioChannelLayoutTag inTag);
-
+
const AudioChannelLayout& GetInputLayout() const { return mInputLayout.Layout(); }
const AudioChannelLayout& GetOutputLayout() const { return mOutputLayout.Layout(); }
-
+
private:
-
+
/*! @var UpdateBypassMatrix */
bool mBypassEffect;
/*! @var mBypassMatrix */
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp
index 28e4d36..15e13e8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp
@@ -2,14 +2,14 @@
File: MusicDeviceBase.cpp
Abstract: MusicDeviceBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "MusicDeviceBase.h"
@@ -90,10 +90,10 @@ static OSStatus MusicDeviceBaseStopNote(void * inComponentStorage,
#endif
-MusicDeviceBase::MusicDeviceBase(AudioComponentInstance inInstance,
+MusicDeviceBase::MusicDeviceBase(AudioComponentInstance inInstance,
UInt32 numInputs,
UInt32 numOutputs,
- UInt32 numGroups)
+ UInt32 numGroups)
: AUBase(inInstance, numInputs, numOutputs, numGroups),
AUMIDIBase(this)
{
@@ -106,8 +106,8 @@ OSStatus MusicDeviceBase::GetPropertyInfo(AudioUnitPropertyID inID,
Boolean & outWritable)
{
OSStatus result;
-
- switch (inID)
+
+ switch (inID)
{
#if !TARGET_OS_IPHONE
case kMusicDeviceProperty_InstrumentCount:
@@ -119,7 +119,7 @@ OSStatus MusicDeviceBase::GetPropertyInfo(AudioUnitPropertyID inID,
#endif
default:
result = AUBase::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
-
+
if (result == kAudioUnitErr_InvalidProperty)
result = AUMIDIBase::DelegateGetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
break;
@@ -134,7 +134,7 @@ OSStatus MusicDeviceBase::GetProperty( AudioUnitPropertyID inID,
{
OSStatus result;
- switch (inID)
+ switch (inID)
{
#if !CA_USE_AUDIO_PLUGIN_ONLY
case kAudioUnitProperty_FastDispatch:
@@ -146,7 +146,7 @@ OSStatus MusicDeviceBase::GetProperty( AudioUnitPropertyID inID,
else if (inElement == kMusicDeviceStartNoteSelect) {
*(TEMP_MusicDeviceStartNoteProc *)outData = MusicDeviceBaseStartNote;
return noErr;
- }
+ }
else if (inElement == kMusicDeviceStopNoteSelect) {
*(TEMP_MusicDeviceStopNoteProc *)outData = MusicDeviceBaseStopNote;
return noErr;
@@ -161,11 +161,11 @@ OSStatus MusicDeviceBase::GetProperty( AudioUnitPropertyID inID,
#endif
default:
result = AUBase::GetProperty (inID, inScope, inElement, outData);
-
+
if (result == kAudioUnitErr_InvalidProperty)
result = AUMIDIBase::DelegateGetProperty (inID, inScope, inElement, outData);
}
-
+
return result;
}
@@ -179,10 +179,10 @@ OSStatus MusicDeviceBase::SetProperty( AudioUnitPropertyID inID,
{
OSStatus result = AUBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
-
+
if (result == kAudioUnitErr_InvalidProperty)
result = AUMIDIBase::DelegateSetProperty (inID, inScope, inElement, inData, inDataSize);
-
+
return result;
}
@@ -205,7 +205,7 @@ OSStatus MusicDeviceBase::HandleNoteOn( UInt8 inChannel,
params.mVelocity = inVelocity;
return StartNote (kMusicNoteEvent_UseGroupInstrument, inChannel, NULL, inStartFrame, params);
}
-
+
OSStatus MusicDeviceBase::HandleNoteOff( UInt8 inChannel,
UInt8 inNoteNumber,
UInt8 inVelocity,
@@ -214,17 +214,17 @@ OSStatus MusicDeviceBase::HandleNoteOff( UInt8 inChannel,
return StopNote (inChannel, inNoteNumber, inStartFrame);
}
-OSStatus
-MusicDeviceBase::HandleStartNoteMessage (MusicDeviceInstrumentID inInstrument,
- MusicDeviceGroupID inGroupID,
- NoteInstanceID * outNoteInstanceID,
- UInt32 inOffsetSampleFrame,
+OSStatus
+MusicDeviceBase::HandleStartNoteMessage (MusicDeviceInstrumentID inInstrument,
+ MusicDeviceGroupID inGroupID,
+ NoteInstanceID * outNoteInstanceID,
+ UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams * inParams)
{
if (inParams == NULL || outNoteInstanceID == NULL) return kAudio_ParamError;
if (!IsInitialized()) return kAudioUnitErr_Uninitialized;
-
+
return StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams);
}
@@ -251,7 +251,7 @@ OSStatus MusicDeviceBase::ComponentEntryDispatch( ComponentParameters * param
if (This == NULL) return kAudio_ParamError;
OSStatus result;
-
+
switch (params->what) {
case kMusicDeviceMIDIEventSelect:
case kMusicDeviceSysExSelect:
@@ -294,7 +294,7 @@ OSStatus MusicDeviceBase::ComponentEntryDispatch( ComponentParameters * param
result = AUBase::ComponentEntryDispatch(params, This);
break;
}
-
+
return result;
}
#endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h
index 4850b8f..f7304a8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h
@@ -2,14 +2,14 @@
File: MusicDeviceBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __MusicDeviceBase_h__
#define __MusicDeviceBase_h__
@@ -57,23 +57,23 @@
class MusicDeviceBase : public AUBase, public AUMIDIBase {
public:
/*! @ctor MusicDeviceBase */
- MusicDeviceBase( AudioComponentInstance inInstance,
+ MusicDeviceBase( AudioComponentInstance inInstance,
UInt32 numInputs,
UInt32 numOutputs,
UInt32 numGroups = 0);
- virtual OSStatus MIDIEvent( UInt32 inStatus,
- UInt32 inData1,
- UInt32 inData2,
+ virtual OSStatus MIDIEvent( UInt32 inStatus,
+ UInt32 inData1,
+ UInt32 inData2,
UInt32 inOffsetSampleFrame)
{
return AUMIDIBase::MIDIEvent (inStatus, inData1, inData2, inOffsetSampleFrame);
}
/*! @method SysEx */
- virtual OSStatus SysEx( const UInt8 * inData,
- UInt32 inLength)
+ virtual OSStatus SysEx( const UInt8 * inData,
+ UInt32 inLength)
{
return AUMIDIBase::SysEx (inData, inLength);
}
@@ -90,7 +90,7 @@ public:
AudioUnitScope inScope,
AudioUnitElement inElement,
void * outData);
-
+
/*! @method SetProperty */
virtual OSStatus SetProperty( AudioUnitPropertyID inID,
AudioUnitScope inScope,
@@ -103,7 +103,7 @@ public:
UInt8 inNoteNumber,
UInt8 inVelocity,
UInt32 inStartFrame);
-
+
/*! @method HandleNoteOff */
virtual OSStatus HandleNoteOff( UInt8 inChannel,
UInt8 inNoteNumber,
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp
index 2316807..65c6de8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp
@@ -2,14 +2,14 @@
File: AUBaseHelper.cpp
Abstract: AUBaseHelper.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUBaseHelper.h"
@@ -53,18 +53,18 @@
#endif
OSStatus GetFileRefPath (CFDictionaryRef parent, CFStringRef frKey, CFStringRef * fPath)
-{
+{
static CFStringRef kFRString = CFSTR (kAUPresetExternalFileRefs);
-
+
const void* frVal = CFDictionaryGetValue(parent, kFRString);
if (!frVal) return kAudioUnitErr_InvalidPropertyValue;
const void* frString = CFDictionaryGetValue ((CFDictionaryRef)frVal, frKey);
if (!frString) return kAudioUnitErr_InvalidPropertyValue;
-
+
if (fPath)
*fPath = (CFStringRef)frString;
-
+
return noErr;
}
@@ -74,7 +74,7 @@ CFMutableDictionaryRef CreateFileRefDict (CFStringRef fKey, CFStringRef fPath, C
fileRefDict = CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue (fileRefDict, fKey, fPath);
-
+
return fileRefDict;
}
@@ -113,11 +113,11 @@ void PrintAUParamEvent (AudioUnitParameterEvent& event, FILE* f)
fprintf (f, "\tEvent Type:%s,", (isRamp ? "ramp" : "immediate"));
if (isRamp)
fprintf (f, "start=%ld,dur=%ld,startValue=%f,endValue=%f\n",
- (long)event.eventValues.ramp.startBufferOffset, (long)event.eventValues.ramp.durationInFrames,
+ (long)event.eventValues.ramp.startBufferOffset, (long)event.eventValues.ramp.durationInFrames,
event.eventValues.ramp.startValue, event.eventValues.ramp.endValue);
else
- fprintf (f, "start=%ld,value=%f\n",
- (long)event.eventValues.immediate.bufferOffset,
+ fprintf (f, "start=%ld,value=%f\n",
+ (long)event.eventValues.immediate.bufferOffset,
event.eventValues.immediate.value);
fprintf (f, "- - - - - - - - - - - - - - - -\n");
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h
index 310a8df..ad4cda6 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h
@@ -2,14 +2,14 @@
File: AUBaseHelper.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUBaseHelper_h__
#define __AUBaseHelper_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp
index 36bb41f..6164ae1 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp
@@ -2,14 +2,14 @@
File: AUBuffer.cpp
Abstract: AUBuffer.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUBuffer.h"
#include <stdlib.h>
@@ -58,10 +58,10 @@ AUBufferList::~AUBufferList()
static UInt32 SafeMultiplyAddUInt32(UInt32 a, UInt32 b, UInt32 c)
{
if (a == 0 || b == 0) return c; // prevent zero divide
-
+
if (a > (0xFFFFFFFF - c) / b)
throw std::bad_alloc();
-
+
return a * b + c;
}
@@ -132,7 +132,7 @@ AudioBufferList & AUBufferList::PrepareBuffer(const CAStreamBasicDescription &fo
if (nStreams > mAllocatedStreams)
COMPONENT_THROW(kAudioUnitErr_FormatNotSupported);
}
-
+
AudioBufferList *abl = mPtrs;
abl->mNumberBuffers = nStreams;
AudioBuffer *buf = abl->mBuffers;
@@ -187,7 +187,7 @@ void AUBufferList::UseExternalBuffer(const CAStreamBasicDescription &format, co
Byte *oldMemory = mMemory;
mMemory = buf.buffer;
mAllocatedBytes = alignedSize;
- // from Allocate(): nBytes = nStreams * nFrames * format.mBytesPerFrame;
+ // from Allocate(): nBytes = nStreams * nFrames * format.mBytesPerFrame;
// thus: nFrames = nBytes / (nStreams * format.mBytesPerFrame)
mAllocatedFrames = mAllocatedBytes / (format.NumberChannelStreams() * format.mBytesPerFrame);
mExternalMemory = true;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h
index 64ea4c3..0bdea23 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h
@@ -2,14 +2,14 @@
File: AUBuffer.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUBuffer_h__
#define __AUBuffer_h__
@@ -75,7 +75,7 @@ class AUBufferList {
};
public:
/*! @ctor AUBufferList */
- AUBufferList() : mPtrState(kPtrsInvalid), mExternalMemory(false), mPtrs(NULL), mMemory(NULL),
+ AUBufferList() : mPtrState(kPtrsInvalid), mExternalMemory(false), mPtrs(NULL), mMemory(NULL),
mAllocatedStreams(0), mAllocatedFrames(0), mAllocatedBytes(0) { }
/*! @dtor ~AUBufferList */
~AUBufferList();
@@ -93,7 +93,7 @@ public:
memcpy(mPtrs, &abl, (char *)&abl.mBuffers[abl.mNumberBuffers] - (char *)&abl);
return *mPtrs;
}
-
+
/*! @method SetBuffer */
void SetBuffer(UInt32 index, const AudioBuffer &ab) {
if (mPtrState == kPtrsInvalid || index >= mPtrs->mNumberBuffers)
@@ -118,7 +118,7 @@ public:
COMPONENT_THROW(-1);
memcpy(&abl, mPtrs, (char *)&abl.mBuffers[abl.mNumberBuffers] - (char *)&abl);
}
-
+
/*! @method CopyBufferContentsTo */
void CopyBufferContentsTo(AudioBufferList &abl) const {
if (mPtrState == kPtrsInvalid)
@@ -134,12 +134,12 @@ public:
destbuf->mDataByteSize = srcbuf->mDataByteSize;
}
}
-
+
/*! @method Allocate */
void Allocate(const CAStreamBasicDescription &format, UInt32 nFrames);
/*! @method Deallocate */
void Deallocate();
-
+
/*! @method UseExternalBuffer */
void UseExternalBuffer(const CAStreamBasicDescription &format, const AudioUnitExternalBuffer &buf);
@@ -157,7 +157,7 @@ public:
/*! @method GetAllocatedFrames */
UInt32 GetAllocatedFrames() const { return mAllocatedFrames; }
-
+
private:
/*! @ctor AUBufferList */
AUBufferList(AUBufferList &) { } // prohibit copy constructor
@@ -184,34 +184,34 @@ private:
template <class T>
class TAUBuffer {
public:
- enum {
+ enum {
kAlignInterval = 0x10,
kAlignMask = kAlignInterval - 1
};
-
+
/*! @ctor TAUBuffer.0 */
TAUBuffer() : mMemObject(NULL), mAlignedBuffer(NULL), mBufferSizeBytes(0)
{
}
-
+
/*! @ctor TAUBuffer.1 */
TAUBuffer(UInt32 numElems, UInt32 numChannels) : mMemObject(NULL), mAlignedBuffer(NULL),
mBufferSizeBytes(0)
{
Allocate(numElems, numChannels);
}
-
+
/*! @dtor ~TAUBuffer */
~TAUBuffer()
{
Deallocate();
}
-
+
/*! @method Allocate */
void Allocate(UInt32 numElems) // can also re-allocate
{
UInt32 reqSize = numElems * sizeof(T);
-
+
if (mMemObject != NULL && reqSize == mBufferSizeBytes)
return; // already allocated
@@ -230,28 +230,28 @@ public:
{
if (mMemObject == NULL) return; // so this method has no effect if we're using
// an external buffer
-
+
free(mMemObject);
mMemObject = NULL;
mAlignedBuffer = NULL;
mBufferSizeBytes = 0;
}
-
+
/*! @method AllocateClear */
void AllocateClear(UInt32 numElems) // can also re-allocate
{
Allocate(numElems);
Clear();
}
-
+
/*! @method Clear */
void Clear()
{
memset(mAlignedBuffer, 0, mBufferSizeBytes);
}
-
+
// accessors
-
+
/*! @method operator T *()@ */
operator T *() { return mAlignedBuffer; }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h
index f628a91..bc82c7f 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h
@@ -2,14 +2,14 @@
File: AUInputFormatConverter.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUInputFormatConverter_h__
#define __AUInputFormatConverter_h__
@@ -69,14 +69,14 @@ public:
strcpy(mTimestampGenerator.mDebugName, "AUConverter");
#endif
}
-
+
// need to subsequently call Initialize, with the desired formats
-
+
/*! @dtor ~AUInputFormatConverter */
~AUInputFormatConverter()
{
}
-
+
virtual OSStatus Initialize(const AudioStreamBasicDescription &src, const AudioStreamBasicDescription &dest)
{
OSStatus err = FormatConverterClient::Initialize(src, dest);
@@ -92,7 +92,7 @@ public:
mTimestampGenerator.Reset();
return FormatConverterClient::Reset();
}
-
+
void SetStartInputTimeAtZero(bool b)
{
mTimestampGenerator.SetStartInputAtZero(b);
@@ -119,13 +119,13 @@ public:
}
/*! @method FormatConverterInputProc */
- virtual OSStatus FormatConverterInputProc(
+ virtual OSStatus FormatConverterInputProc(
UInt32 & ioNumberDataPackets,
AudioBufferList & ioData,
AudioStreamPacketDescription** outDataPacketDescription)
{
OSStatus err = ca_noErr;
-
+
AudioUnitRenderActionFlags actionFlags = 0;
AUInputElement *input = mHost->GetInput(mHostBus);
*ioNumberDataPackets = std::min(*ioNumberDataPackets, This->mHost->GetMaxFramesPerSlice());
@@ -144,7 +144,7 @@ protected:
AUBase * mHost;
/*! @var mHostBus */
int mHostBus;
-
+
AUTimestampGenerator mTimestampGenerator;
bool mIsPCMToPCM;
bool mHasSRC;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h
index e83c0e7..4fa7a62 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h
@@ -2,14 +2,14 @@
File: AUMIDIDefs.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUMIDIDefs_h__
#define __AUMIDIDefs_h__
@@ -75,7 +75,7 @@ enum
kMidiController_Balance = 8,
kMidiController_Pan = 10,
kMidiController_Expression = 11,
-
+
// these controls have a (0-63) == off, (64-127) == on
kMidiController_Sustain = 64, //hold1
kMidiController_Portamento = 65,
@@ -91,7 +91,7 @@ enum
kMidiController_VibratoRate = 76,
kMidiController_VibratoDepth = 77,
kMidiController_VibratoDelay = 78,
-
+
// these controls have a 0-127 range and in MIDI they have no LSB (so fractional values are lost in MIDI)
kMidiController_ReverbLevel = 91,
kMidiController_ChorusLevel = 93,
@@ -109,7 +109,7 @@ enum
};
// RPN values
-enum
+enum
{
kMidiControllerValue_RPNPitchBendSensitivity = 0,
kMidiControllerValue_RPNChannelFineTuning = 1,
@@ -119,7 +119,7 @@ enum
};
// GM2 Sound Bank Constants
-enum
+enum
{
kGM2MelodicBank = 0x7900,
kGM2PercussionBank = 0x7800,
@@ -129,7 +129,7 @@ enum
kBankMSBMask = 0xff00
};
-enum
+enum
{
kMSBController_MidPoint = 0x40
};
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h
index 9fbd3e1..ad38819 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h
@@ -2,14 +2,14 @@
File: AUSilentTimeout.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUSilentTimeout
#define __AUSilentTimeout
@@ -64,7 +64,7 @@ public:
mTimeoutCounter = inTimeoutLimit;
mResetTimer = false;
}
-
+
if(mTimeoutCounter > 0 )
{
mTimeoutCounter -= inFramesToProcess;
@@ -74,7 +74,7 @@ public:
else
{
// signal to reset the next time we receive silence
- mResetTimer = true;
+ mResetTimer = true;
}
}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp
index 7c57a81..85dad84 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp
@@ -2,14 +2,14 @@
File: AUTimestampGenerator.cpp
Abstract: AUTimestampGenerator.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUTimestampGenerator.h"
#include "CAMath.h"
@@ -68,12 +68,12 @@ void AUTimestampGenerator::AddOutputTime(const AudioTimeStamp &inTimeStamp, Floa
if (mState.mBypassed)
return;
-
+
if (mState.mHostTimeDiscontinuityCorrection && !(mState.mCurrentOutputTime.mFlags & kAudioTimeStampHostTimeValid) && (mState.mLastOutputTime.mFlags & kAudioTimeStampHostTimeValid)) {
// no host time here but we had one last time, interpolate one
double rateScalar = (mState.mCurrentOutputTime.mFlags & kAudioTimeStampRateScalarValid) ? mState.mCurrentOutputTime.mRateScalar : 1.0;
Float64 deltaSamples = mState.mCurrentOutputTime.mSampleTime - mState.mLastOutputTime.mSampleTime;
- mState.mCurrentOutputTime.mHostTime = mState.mLastOutputTime.mHostTime +
+ mState.mCurrentOutputTime.mHostTime = mState.mLastOutputTime.mHostTime +
UInt64(CAHostTimeBase::GetFrequency() * deltaSamples * rateScalar / outputSampleRate);
mState.mCurrentOutputTime.mFlags |= kAudioTimeStampHostTimeValid;
#if DEBUG
@@ -90,7 +90,7 @@ void AUTimestampGenerator::AddOutputTime(const AudioTimeStamp &inTimeStamp, Floa
mState.mCurrentOutputTime.mFlags |= kAudioTimeStampRateScalarValid;
}
}
-
+
if (mFirstTime) {
mFirstTime = false;
mState.mDiscontinuous = false;
@@ -120,16 +120,16 @@ const AudioTimeStamp & AUTimestampGenerator::GenerateInputTime(Float64 framesToA
return mState.mCurrentOutputTime;
double inputSampleTime;
-
+
mState.mCurrentInputTime.mFlags = kAudioTimeStampSampleTimeValid;
double rateScalar = 1.0;
-
+
// propagate rate scalar
if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampRateScalarValid) {
mState.mCurrentInputTime.mFlags |= kAudioTimeStampRateScalarValid;
mState.mCurrentInputTime.mRateScalar = rateScalar = mState.mCurrentOutputTime.mRateScalar;
}
-
+
// propagate host time and sample time
if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampHostTimeValid) {
mState.mCurrentInputTime.mFlags |= kAudioTimeStampHostTimeValid;
@@ -142,7 +142,7 @@ const AudioTimeStamp & AUTimestampGenerator::GenerateInputTime(Float64 framesToA
mState.mCurrentInputTime.mHostTime = mState.mCurrentOutputTime.mHostTime;
}
if (mState.mHostTimeDiscontinuityCorrection && mState.mDiscontinuous && (mState.mLastOutputTime.mFlags & kAudioTimeStampHostTimeValid)) {
- // we had a discontinuous output time, need to resync by interpolating
+ // we had a discontinuous output time, need to resync by interpolating
// a sample time that is appropriate to the host time
UInt64 deltaHostTime = mState.mCurrentOutputTime.mHostTime - mState.mLastOutputTime.mHostTime;
double deltaSeconds = double(deltaHostTime) * CAHostTimeBase::GetInverseFrequency();
@@ -168,28 +168,28 @@ const AudioTimeStamp & AUTimestampGenerator::GenerateInputTime(Float64 framesToA
// we had a discontinuous output time, need to resync by propagating the
// detected discontinuity, taking the rate scalar adjustment into account
inputSampleTime += floor(mState.mDiscontinuityDeltaSamples / mState.mRateScalarAdj + 0.5);
-
+
#if DEBUG
if (mVerbosity > 1)
printf("%-20.20s: adjusted input time: %.0f -> %.0f (SR=%.3f, rs=%.3f, delta=%.0f)\n", mDebugName, mState.mNextInputSampleTime, inputSampleTime, inputSampleRate, mState.mRateScalarAdj, mState.mDiscontinuityDeltaSamples);
#endif
-
+
mState.mDiscontinuityDeltaSamples = 0.;
}
-
-
+
+
// propagate word clock
if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampWordClockTimeValid) {
mState.mCurrentInputTime.mFlags |= kAudioTimeStampWordClockTimeValid;
mState.mCurrentInputTime.mWordClockTime = mState.mCurrentOutputTime.mWordClockTime;
}
-
+
// propagate SMPTE time
if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampSMPTETimeValid) {
mState.mCurrentInputTime.mFlags |= kAudioTimeStampSMPTETimeValid;
mState.mCurrentInputTime.mSMPTETime = mState.mCurrentOutputTime.mSMPTETime;
}
-
+
// store the input sample time and expected next input time
mState.mCurrentInputTime.mSampleTime = inputSampleTime;
mState.mNextInputSampleTime = inputSampleTime + framesToAdvance;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h
index cfd8456..333dc19 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h
@@ -2,14 +2,14 @@
File: AUTimestampGenerator.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUTimestampGenerator_h__
#define __AUTimestampGenerator_h__
@@ -76,14 +76,14 @@ public:
CAHostTimeBase::GetFrequency();
Reset();
}
-
+
void SetStartInputAtZero(bool b) { mState.mStartInputAtZero = b; }
bool GetStartInputAtZero() const { return mState.mStartInputAtZero; }
-
+
// bypassing is intended for a narrow special case. the upstream sample time will always be the same as the downstream time.
void SetBypassed(bool b) { mState.mBypassed = b; }
bool GetBypassed() const { return mState.mBypassed; }
-
+
// Call this to reset the timeline.
void Reset()
{
@@ -93,26 +93,26 @@ public:
mState.mNextOutputSampleTime = 0.;
mState.mLastOutputTime.mFlags = 0;
mState.mRateScalarAdj = 1.;
-
+
mFirstTime = true;
#if DEBUG
if (mVerbosity)
printf("%-20.20s: Reset\n", mDebugName);
#endif
}
-
+
// Call this once per render cycle with the downstream timestamp.
- // expectedDeltaFrames is the expected difference between the current and NEXT
+ // expectedDeltaFrames is the expected difference between the current and NEXT
// downstream timestamps.
// sampleRate is the OUTPUT sample rate.
void AddOutputTime(const AudioTimeStamp &inTimeStamp, Float64 expectedDeltaFrames, double outputSampleRate, double rateScalarAdj=1.0);
-
+
// Call this once per render cycle to obtain the upstream timestamp.
// framesToAdvance is the number of frames the input timeline is to be
// advanced during this render cycle.
// sampleRate is the INPUT sample rate.
const AudioTimeStamp & GenerateInputTime(Float64 framesToAdvance, double inputSampleRate, bool advanceHostTime = false);
-
+
// this can be called to override the setting of the next input sample time in GenerateInputTime
void Advance(Float64 framesToAdvance)
{
@@ -128,7 +128,7 @@ public:
Float64 mNextInputSampleTime;
Float64 mNextOutputSampleTime;
Float64 mInputSampleTimeForOutputPull;
-
+
AudioTimeStamp mLastOutputTime;
AudioTimeStamp mCurrentOutputTime;
@@ -137,21 +137,21 @@ public:
bool mDiscontinuous;
bool mBypassed;
Float64 mDiscontinuityDeltaSamples;
-
+
double mRateScalarAdj;
-
+
bool mHostTimeDiscontinuityCorrection; // If true, propagate timestamp discontinuities using host time.
};
-
+
void GetState(State& outState) const { outState = mState; }
void SetState(State const& inState) { mState = inState; mFirstTime = false; }
-
+
private:
-
+
struct State mState;
- bool mFirstTime;
-
+ bool mFirstTime;
+
#if DEBUG
public:
int mVerbosity;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp
index c2c8468..8a76b8b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp
@@ -2,14 +2,14 @@
File: AUOutputBL.cpp
Abstract: AUOutputBL.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUOutputBL.h"
#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
@@ -64,7 +64,7 @@ struct AudioBuffer
};
*/
-AUOutputBL::AUOutputBL (const CAStreamBasicDescription &inDesc, UInt32 inDefaultNumFrames)
+AUOutputBL::AUOutputBL (const CAStreamBasicDescription &inDesc, UInt32 inDefaultNumFrames)
: mFormat (inDesc),
mBufferMemory(NULL),
mBufferList (NULL),
@@ -85,10 +85,10 @@ AUOutputBL::~AUOutputBL()
delete [] (Byte *)mBufferList;
}
-void AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated)
+void AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated)
{
UInt32 channelsPerBuffer = mFormat.IsInterleaved() ? mFormat.NumberChannels() : 1;
-
+
if (mBufferMemory == NULL || inWantNullBufferIfAllocated)
{
mBufferList->mNumberBuffers = mNumberBuffers;
@@ -104,7 +104,7 @@ void AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated)
UInt32 nBytes = mFormat.FramesToBytes (inNumFrames);
if ((nBytes * mNumberBuffers) > AllocatedBytes())
throw OSStatus(kAudioUnitErr_TooManyFramesToProcess);
-
+
mBufferList->mNumberBuffers = mNumberBuffers;
AudioBuffer *buf = &mBufferList->mBuffers[0];
Byte* p = mBufferMemory;
@@ -120,31 +120,31 @@ void AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated)
void AUOutputBL::Allocate (UInt32 inNumFrames)
{
- if (inNumFrames)
+ if (inNumFrames)
{
UInt32 nBytes = mFormat.FramesToBytes (inNumFrames);
-
- if (nBytes <= AllocatedBytes())
+
+ if (nBytes <= AllocatedBytes())
return;
-
+
// align successive buffers for Altivec and to take alternating
// cache line hits by spacing them by odd multiples of 16
if (mNumberBuffers > 1)
nBytes = (nBytes + (0x10 - (nBytes & 0xF))) | 0x10;
-
+
mBufferSize = nBytes;
-
+
UInt32 memorySize = mBufferSize * mNumberBuffers;
Byte *newMemory = new Byte[memorySize];
memset(newMemory, 0, memorySize); // make buffer "hot"
-
+
Byte *oldMemory = mBufferMemory;
mBufferMemory = newMemory;
delete[] oldMemory;
-
+
mFrames = inNumFrames;
- }
- else
+ }
+ else
{
if (mBufferMemory) {
delete [] mBufferMemory;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h
index 0baad3a..da30891 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h
@@ -2,14 +2,14 @@
File: AUOutputBL.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __AUOutputBL_h__
#define __AUOutputBL_h__
@@ -63,10 +63,10 @@
class AUOutputBL {
public:
-
+
// you CANNOT use one of these - it will crash!
// AUOutputBL ();
-
+
// this is the constructor that you use
// it can't be reset once you've constructed it
AUOutputBL (const CAStreamBasicDescription &inDesc, UInt32 inDefaultNumFrames = 512);
@@ -76,29 +76,29 @@ public:
{
Prepare (mFrames);
}
-
+
// this version can throw if this is an allocted ABL and inNumFrames is > AllocatedFrames()
// you can set the bool to true if you want a NULL buffer list even if allocated
// inNumFrames must be a valid number (will throw if inNumFrames is 0)
void Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated = false);
-
+
AudioBufferList* ABL() { return mBufferList; }
-
+
// You only need to call this if you want to allocate a buffer list
// if you want an empty buffer list, just call Prepare()
// if you want to dispose previously allocted memory, pass in 0
// then you either have an empty buffer list, or you can re-allocate
// Memory is kept around if an Allocation request is less than what is currently allocated
void Allocate (UInt32 inNumberFrames);
-
+
UInt32 AllocatedFrames() const { return mFrames; }
-
+
const CAStreamBasicDescription& GetFormat() const { return mFormat; }
#if DEBUG
void Print();
#endif
-
+
private:
UInt32 AllocatedBytes () const { return (mBufferSize * mNumberBuffers); }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp
index 87d7848..677fcb4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp
@@ -2,14 +2,14 @@
File: AUParamInfo.cpp
Abstract: AUParamInfo.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,15 +40,15 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "AUParamInfo.h"
#include "CAXException.h"
-AUParamInfo::AUParamInfo (AudioUnit inAU,
- bool inIncludeExpert,
+AUParamInfo::AUParamInfo (AudioUnit inAU,
+ bool inIncludeExpert,
bool inIncludeReadOnly,
AudioUnitScope inScope,
AudioUnitElement inElement)
@@ -61,14 +61,14 @@ AUParamInfo::AUParamInfo (AudioUnit inAU,
UInt32 size;
OSStatus result = AudioUnitGetPropertyInfo(mAU, kAudioUnitProperty_ParameterList, inScope, mElement, &size, NULL);
if (size == 0 || result) return;
-
+
int nparams = size / sizeof(AudioUnitPropertyID);
mParamListID = new AudioUnitParameterID[nparams];
memset (mParamListID, 0xFF, size);
AudioUnitParameterID *paramList = new AudioUnitParameterID[nparams];
-
+
result = AudioUnitGetProperty(mAU, kAudioUnitProperty_ParameterList, mScope, mElement, paramList, &size);
if (result) {
delete [] mParamListID;
@@ -76,33 +76,33 @@ AUParamInfo::AUParamInfo (AudioUnit inAU,
mParamListID = NULL;
return;
}
-
+
ParameterMap params;
- for (int i = 0; i < nparams; ++i)
+ for (int i = 0; i < nparams; ++i)
{
CAAUParameter auvp (mAU, paramList[i], mScope, mElement); // took out only using global scope in CAAUParameter creation
const AudioUnitParameterInfo ¶mInfo = auvp.ParamInfo();
-
+
// don't include if parameter can't be read or written
- if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable)
+ if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable)
&& !(paramInfo.flags & kAudioUnitParameterFlag_IsReadable))
continue;
// only include if expert params wanted
if (!inIncludeExpert && auvp.IsExpert())
continue;
-
+
// only include if read only params are wanted
- if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable)
+ if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable)
&& (paramInfo.flags & kAudioUnitParameterFlag_IsReadable))
- {
+ {
if (!inIncludeReadOnly)
continue;
}
-
+
mParamListID[mNumParams] = paramList[i];
mNumParams++;
-
+
// ok - if we're here, then we have a parameter we are going to display.
UInt32 clump = 0;
auvp.GetClumpID (clump);
@@ -118,9 +118,9 @@ AUParamInfo::~AUParamInfo()
}
UInt32 AUParamInfo::NumParamsForClump (UInt32 inClump) const
-{
+{
ParameterMap::const_iterator it = mParams.find(inClump);
- if (it != mParams.end())
+ if (it != mParams.end())
return static_cast<UInt32>((*it).second.size());
return 0;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h
index d15fbfe..4d5b795 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h
@@ -2,14 +2,14 @@
File: AUParamInfo.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include <map>
#include <vector>
@@ -50,11 +50,11 @@
#include "CAAUParameter.h"
/*
- The ParameterMap returned by the Map() method is a map where
+ The ParameterMap returned by the Map() method is a map where
- the key is the clumpID
- the value is a ParameterList (vector<CAAUParameter>)
-
- If you have parameters on multiple scopes (or elements within a scope), then you should create one of these
+
+ If you have parameters on multiple scopes (or elements within a scope), then you should create one of these
for each scope-element pair
*/
@@ -66,45 +66,45 @@ public:
- AUParamInfo (AudioUnit inAU,
- bool inIncludeExpert,
- bool inIncludeReadOnly,
+ AUParamInfo (AudioUnit inAU,
+ bool inIncludeExpert,
+ bool inIncludeReadOnly,
AudioUnitScope inScope = kAudioUnitScope_Global,
AudioUnitElement inElement = 0);
-
+
~AUParamInfo();
-
+
const ParameterMap& Map () const { return mParams; }
-
+
// some convenience methods
UInt32 NumParams () const { return mNumParams; }
-
- AudioUnitParameterID ParamID (UInt32 inIndex) const
- {
- if (inIndex < mNumParams) return mParamListID[inIndex];
- return 0xFFFFFFFF;
+
+ AudioUnitParameterID ParamID (UInt32 inIndex) const
+ {
+ if (inIndex < mNumParams) return mParamListID[inIndex];
+ return 0xFFFFFFFF;
}
-
+
UInt32 NumClumps () const { return static_cast<UInt32>(mParams.size()); }
UInt32 NumParamsForClump (UInt32 inClump) const;
-
+
// returns NULL if there's no info for the parameter
const CAAUParameter* GetParamInfo (AudioUnitParameterID inParamID) const;
-
+
AudioUnitScope GetScope () const { return mScope; }
AudioUnitElement GetElement () const { return mElement; }
-
+
private:
AudioUnit mAU;
UInt32 mNumParams;
AudioUnitParameterID * mParamListID;
-
+
ParameterMap mParams;
AudioUnitScope mScope;
AudioUnitElement mElement;
-
+
// disallow
AUParamInfo () {}
AUParamInfo (const AUParamInfo &c) {}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp
index 4e72b22..4f8bea6 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp
@@ -2,14 +2,14 @@
File: CAAUMIDIMap.cpp
Abstract: CAAUMIDIMap.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,16 +40,16 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAAUMIDIMap.h"
#include <pthread.h>
struct AllMidiTransformers
{
- MIDILinearTransformer linearTrans;
+ MIDILinearTransformer linearTrans;
MIDILogTransformer logTrans;
MIDIExpTransformer expTrans;
MIDISqrtTransformer sqrtTrans;
@@ -77,13 +77,13 @@ static void CheckInitAllMidiTransformers()
MIDIValueTransformer * CAAUMIDIMap::GetTransformer (UInt32 inFlags)
{
#if TARGET_OS_MAC
- if (gAllMidiTransformers == NULL)
+ if (gAllMidiTransformers == NULL)
CheckInitAllMidiTransformers();
#else
- if (gAllMidiTransformers == NULL)
+ if (gAllMidiTransformers == NULL)
gAllMidiTransformers = new AllMidiTransformers();
#endif
-
+
if (AudioUnitDisplayTypeIsLogarithmic(inFlags))
return &gAllMidiTransformers->logTrans;
else if (AudioUnitDisplayTypeIsExponential(inFlags))
@@ -176,13 +176,13 @@ bool CAAUMIDIMap::MIDI_Matches (UInt8 inChannel, UInt8 inData1, UInt8 inData2, F
}
return false;
}
- //printf("this in midi matches %X with ", this);
- outLinear = inData2 / 127.;
+ //printf("this in midi matches %X with ", this);
+ outLinear = inData2 / 127.;
return true;
}
return false;
}
-
+
// this just matches on the patch change value itself...
if (IsPatchChange()) {
if (mData1 == inData1) {
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h
index a53fdf7..33d0c2e 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h
@@ -2,14 +2,14 @@
File: CAAUMIDIMap.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAUMIDIMap_h_
#define __CAAUMIDIMap_h_
@@ -53,7 +53,7 @@
/*
enum {
kAUParameterMIDIMapping_AnyChannelFlag = (1L << 0),
- // If this flag is set and mStatus is a MIDI channel message, then the MIDI channel number
+ // If this flag is set and mStatus is a MIDI channel message, then the MIDI channel number
// in the status byte is ignored; the mapping is from the specified MIDI message on ANY channel.
kAUParameterMIDIMapping_AnyNoteFlag = (1L << 1),
@@ -68,7 +68,7 @@ enum {
// this is only useful for boolean typed parameters. When set, it means that the parameter's
// value should be toggled (if true, become false and vice versa) when the represented MIDI message
// is received
-
+
kAUParameterMIDIMapping_Bipolar = (1L << 4),
// this can be set to when mapping a MIDI Controller to indicate that the parameter (typically a boolean
// style parameter) will only have its value changed to either the on or off state of a MIDI controller message
@@ -118,41 +118,41 @@ Create a mapping between a parameter and a MIDI message through either:
* The AUParameterMIDIMapping Structure
- Command mStatus mData1
- Note Off 0x8n Note Num
- Note On 0x9n Note Num
- Key Pressure 0xAn Note Num
- Control Change 0xBn ControllerID
- Patch Change 0xCn Patch Num
- Channel Pressure DxDn 0 (Unused)
- Pitch Bend 0xEn 0 (Unused)
+ Command mStatus mData1
+ Note Off 0x8n Note Num
+ Note On 0x9n Note Num
+ Key Pressure 0xAn Note Num
+ Control Change 0xBn ControllerID
+ Patch Change 0xCn Patch Num
+ Channel Pressure DxDn 0 (Unused)
+ Pitch Bend 0xEn 0 (Unused)
(where n is 0-0xF to correspond to MIDI channels 1-16)
Details:
In general MIDI Commands can be mapped to either a specific channel as specified in the mStatus bit.
- If the kAUParameterMIDIMapping_AnyChannelFlag bit is set mStatus is a MIDI channel message, then the
+ If the kAUParameterMIDIMapping_AnyChannelFlag bit is set mStatus is a MIDI channel message, then the
MIDI channel number in the status byte is ignored; the mapping is from the specified MIDI message on ANY channel.
For note commands (note on, note off, key pressure), the MIDI message can trigger either with just a specific
note number, or any note number if the kAUParameterMIDIMapping_AnyNoteFlag bit is set. In these instances, the
- note number is used as the trigger value (for instance, a note message could be used to set the
+ note number is used as the trigger value (for instance, a note message could be used to set the
cut off frequency of a filter).
- The Properties:
+ The Properties:
kAudioUnitProperty_AllParameterMIDIMappings array of AUParameterMIDIMapping (read/write)
This property is used to both retreive and set the current mapping state between (some/many/all of) its parameters
and MIDI messages. When set, it should replace any previous mapped settings the AU had.
If this property is implemented by a non-MIDI capable AU (such as an 'aufx' type), then the property is
- read only, and recommends a suggested set of mappings for the host to perform. In this case, it is the
+ read only, and recommends a suggested set of mappings for the host to perform. In this case, it is the
host's responsibility to map MIDI message to the AU parameters. As described previously, there are a set
- of default mappings (see AudioToolbox/AUMIDIController.h) that the host can recommend to the user
+ of default mappings (see AudioToolbox/AUMIDIController.h) that the host can recommend to the user
in this circumstance.
- This property's size will be very dynamic, depending on the number of mappings currently in affect, so the
+ This property's size will be very dynamic, depending on the number of mappings currently in affect, so the
caller should always get the size of the property first before retrieving it. The AU should return an error
if the caller doesn't provide enough space to return all of the current mappings.
@@ -169,19 +169,19 @@ Create a mapping between a parameter and a MIDI message through either:
(1) If a mapping struct is provided, then that struct provides *all* of the information that the AU should
use to map the parameter, *except* for the MIDI message. The AU should then listen for the next MIDI message
and associate that MIDI message with the supplied AUParameter mapping. When this MIDI message is received and
- the mapping made, the AU should also issue a notification on this property
+ the mapping made, the AU should also issue a notification on this property
(kAudioUnitProperty_HotMapParameterMIDIMapping) to indicate to the host that the mapping has been made. The host
can then retrieve the mapping that was made by getting the value of this property.
- To avoid possible confusion, it is recommended that once the host has retrieved this mapping (if it is
+ To avoid possible confusion, it is recommended that once the host has retrieved this mapping (if it is
presenting a UI to describe the mappings for example), that it then clears the mapping state as described next.
Thus, the only time this property will return a valid value is when the AU has made a mapping. If the AU's mapping
- state has been cleared (or it has not been asked to make a mapping), then the AU should return
+ state has been cleared (or it has not been asked to make a mapping), then the AU should return
kAudioUnitErr_InvalidPropertyValue if the host tries to read this value.
(2) If the value passed in is NULL, then if the AU had a parameter that it was in the process of mapping, it
- should disregard that (stop listening to the MIDI messages to create a mapping) and discard the partially
+ should disregard that (stop listening to the MIDI messages to create a mapping) and discard the partially
mapped struct. If the value is NULL and the AU is not in the process of mapping, the AU can ignore the request.
At all times, the _AllMappings property will completely describe the current known state of the AU's mappings
@@ -242,25 +242,25 @@ struct MIDICubeTransformer : public MIDIValueTransformer {
class CAAUMIDIMap : public AUParameterMIDIMapping {
-
+
public:
-// variables for more efficient parsing of MIDI to Param value
+// variables for more efficient parsing of MIDI to Param value
Float32 mMinValue;
Float32 mMaxValue;
MIDIValueTransformer *mTransType;
-// methods
+// methods
static MIDIValueTransformer *GetTransformer (UInt32 inFlags);
-
+
CAAUMIDIMap() { memset(this, 0, sizeof(CAAUMIDIMap)); }
- CAAUMIDIMap (const AUParameterMIDIMapping& inMap)
+ CAAUMIDIMap (const AUParameterMIDIMapping& inMap)
{
memset(this, 0, sizeof(CAAUMIDIMap));
memcpy (this, &inMap, sizeof(inMap));
}
- CAAUMIDIMap (AudioUnitScope inScope, AudioUnitElement inElement, AudioUnitParameterID inParam)
- {
- memset(this, 0, sizeof(CAAUMIDIMap));
+ CAAUMIDIMap (AudioUnitScope inScope, AudioUnitElement inElement, AudioUnitParameterID inParam)
+ {
+ memset(this, 0, sizeof(CAAUMIDIMap));
mScope = inScope;
mElement = inElement;
mParameterID = inParam;
@@ -271,41 +271,41 @@ public:
// returns -1 if any channel bit is set
SInt32 Channel () const { return IsAnyChannel() ? -1 : (mStatus & 0xF); }
- bool IsAnyChannel () const {
- return mFlags & kAUParameterMIDIMapping_AnyChannelFlag;
+ bool IsAnyChannel () const {
+ return mFlags & kAUParameterMIDIMapping_AnyChannelFlag;
}
// preserves the existing channel info in the status byte
// preserves any previously set mFlags value
- void SetAnyChannel (bool inFlag)
- {
- if (inFlag)
- mFlags |= kAUParameterMIDIMapping_AnyChannelFlag;
+ void SetAnyChannel (bool inFlag)
+ {
+ if (inFlag)
+ mFlags |= kAUParameterMIDIMapping_AnyChannelFlag;
else
mFlags &= ~kAUParameterMIDIMapping_AnyChannelFlag;
}
- bool IsAnyNote () const {
+ bool IsAnyNote () const {
return (mFlags & kAUParameterMIDIMapping_AnyNoteFlag) != 0;
}
// preserves the existing key num in the mData1 byte
// preserves any previously set mFlags value
void SetAnyNote (bool inFlag)
- {
- if (inFlag)
- mFlags |= kAUParameterMIDIMapping_AnyNoteFlag;
+ {
+ if (inFlag)
+ mFlags |= kAUParameterMIDIMapping_AnyNoteFlag;
else
mFlags &= ~kAUParameterMIDIMapping_AnyNoteFlag;
}
-
+
bool IsToggle() const { return (mFlags & kAUParameterMIDIMapping_Toggle) != 0; }
void SetToggle (bool inFlag)
{
- if (inFlag)
- mFlags |= kAUParameterMIDIMapping_Toggle;
+ if (inFlag)
+ mFlags |= kAUParameterMIDIMapping_Toggle;
else
mFlags &= ~kAUParameterMIDIMapping_Toggle;
}
-
+
bool IsBipolar() const { return (mFlags & kAUParameterMIDIMapping_Bipolar) != 0; }
// inUseOnValue is valid ONLY if inFlag is true
void SetBipolar (bool inFlag, bool inUseOnValue = false)
@@ -326,56 +326,56 @@ public:
bool IsSubRange () const { return (mFlags & kAUParameterMIDIMapping_SubRange) != 0; }
void SetSubRange (Float32 inStartValue, Float32 inStopValue)
{
- mFlags |= kAUParameterMIDIMapping_SubRange;
-
+ mFlags |= kAUParameterMIDIMapping_SubRange;
+
mSubRangeMin = inStartValue;
mSubRangeMax = inStopValue;
}
-
+
void SetParamRange(Float32 minValue, Float32 maxValue)
{
mMinValue = minValue;
- mMaxValue = maxValue;
+ mMaxValue = maxValue;
}
-
+
// this will retain the subrange values previously set.
- void SetSubRange (bool inFlag)
- {
+ void SetSubRange (bool inFlag)
+ {
if (inFlag)
- mFlags |= kAUParameterMIDIMapping_SubRange;
+ mFlags |= kAUParameterMIDIMapping_SubRange;
else
- mFlags &= ~kAUParameterMIDIMapping_SubRange;
+ mFlags &= ~kAUParameterMIDIMapping_SubRange;
}
-
+
bool IsAnyValue() const{return !IsBipolar();}
bool IsOnValue() const{return IsBipolar_OnValue();}
bool IsOffValue() const{return IsBipolar();}
-
+
bool IsNoteOff () const { return ((mStatus & 0xF0) == 0x80); }
bool IsNoteOn () const { return ((mStatus & 0xF0) == 0x90); }
-
+
bool IsKeyPressure () const { return ((mStatus & 0xF0) == 0xA0); }
-
+
bool IsKeyEvent () const { return (mStatus > 0x7F) && (mStatus < 0xB0); }
-
+
bool IsPatchChange () const { return ((mStatus & 0xF0) == 0xC0); }
bool IsChannelPressure () const { return ((mStatus & 0xF0) == 0xD0); }
bool IsPitchBend () const { return ((mStatus & 0xF0) == 0xE0); }
bool IsControlChange () const { return ((mStatus & 0xF0) == 0xB0); }
-
-
+
+
void SetControllerOnValue(){SetBipolar(true,true);}
void SetControllerOffValue(){SetBipolar(true,false);}
void SetControllerAnyValue(){SetBipolar(false,false);}
-
- // All of these Set calls will reset the mFlags field based on the
+
+ // All of these Set calls will reset the mFlags field based on the
// anyChannel param value
void SetNoteOff (UInt8 key, SInt8 channel, bool anyChannel = false)
{
mStatus = 0x80 | (channel & 0xF);
mData1 = key;
mFlags = (anyChannel ? kAUParameterMIDIMapping_AnyChannelFlag : 0);
-
+
}
void SetNoteOn (UInt8 key, SInt8 channel, bool anyChannel = false)
@@ -398,7 +398,7 @@ public:
mData1 = controllerID;
mFlags = (anyChannel ? kAUParameterMIDIMapping_AnyChannelFlag : 0);
}
-
+
void SetPatchChange (UInt8 patchChange, SInt8 channel, bool anyChannel = false)
{
mStatus = 0xC0 | (channel & 0xF);
@@ -419,8 +419,8 @@ public:
mData1 = 0;
mFlags = (anyChannel ? kAUParameterMIDIMapping_AnyChannelFlag : 0);
}
-
-
+
+
Float32 ParamValueFromMIDILinear (Float32 inLinearValue) const
{
Float32 low, high;
@@ -432,32 +432,32 @@ public:
low = mMinValue;
high = mMaxValue;
}
-
-
+
+
// WE ARE ASSUMING YOU HAVE SET THIS UP PROPERLY!!!!! (or this will crash cause it will be NULL)
return (Float32)mTransType->fromlinear((inLinearValue * (high - low)) + low);
}
-
+
// The CALLER of this method must ensure that the status byte's MIDI Command (ignoring the channel) matches!!!
bool MIDI_Matches (UInt8 inChannel, UInt8 inData1, UInt8 inData2, Float32 &outLinear) const;
-
+
void Print () const;
-
+
void Save (CFPropertyListRef &outData) const;
void Restore (CFDictionaryRef inData);
-
- static void SaveAsMapPList (AudioUnit inUnit,
- const AUParameterMIDIMapping * inMappings,
- UInt32 inNumMappings,
+
+ static void SaveAsMapPList (AudioUnit inUnit,
+ const AUParameterMIDIMapping * inMappings,
+ UInt32 inNumMappings,
CFPropertyListRef &outData,
CFStringRef inName = NULL);
// inNumMappings describes how much memory is allocated in outMappings
- static void RestoreFromMapPList (const CFDictionaryRef inData,
- AUParameterMIDIMapping * outMappings,
+ static void RestoreFromMapPList (const CFDictionaryRef inData,
+ AUParameterMIDIMapping * outMappings,
UInt32 inNumMappings);
-
+
static UInt32 NumberOfMaps (const CFDictionaryRef inData);
};
@@ -472,15 +472,15 @@ inline bool operator== (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
&& (a.mParameterID == b.mParameterID)
&& (a.mElement == b.mElement)
&& (a.mScope == b.mScope));
-
+
// reserved field comparisons - ignored until/if they are used
}
inline bool operator< (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
{
- if ((a.mStatus & 0xF0) != (b.mStatus & 0xF0))
+ if ((a.mStatus & 0xF0) != (b.mStatus & 0xF0))
return ((a.mStatus & 0xF0) < (b.mStatus & 0xF0));
-
+
if (a.mData1 != b.mData1)
return (a.mData1 < b.mData1);
@@ -488,7 +488,7 @@ inline bool operator< (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
return ((a.mStatus & 0xF) < (b.mStatus & 0xf));
// reserved field comparisons - ignored until/if they are used
-
+
// we're sorting this by MIDI, so we don't really care how the rest is sorted
return ((a.mParameterID < b.mParameterID)
&& (a.mElement < b.mElement)
@@ -498,7 +498,7 @@ inline bool operator< (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
class CompareMIDIMap {
- int compare (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
+ int compare (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
{
if ((a.mStatus & 0xF0) < (b.mStatus & 0xF0))
return -1;
@@ -512,7 +512,7 @@ class CompareMIDIMap {
if (a.mData1 < b.mData1) return -1;
return 0;
}
-
+
public:
bool operator() (const CAAUMIDIMap &a, const CAAUMIDIMap &b) {
return compare (a, b) < 0;
@@ -533,7 +533,7 @@ public:
break;
// ...
}
-
+
in the for loop you call the MIDI_Matches call, to see if the MIDI event matches a given AUMIDIParam mapping
special note: you HAVE to transform note on (with vel zero) events to the note off status byte
*/
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp
index b24ff99..7487229 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp
@@ -2,14 +2,14 @@
File: CAAUMIDIMapManager.cpp
Abstract: CAAUMIDIMapManager.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,42 +40,42 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAAUMIDIMapManager.h"
#include <AudioToolbox/AudioUnitUtilities.h>
CAAUMIDIMapManager::CAAUMIDIMapManager()
-{
- hotMapping = false;
+{
+ hotMapping = false;
}
static void FillInMap (CAAUMIDIMap &map, AUBase &That)
{
AudioUnitParameterInfo info;
That.GetParameterInfo (map.mScope, map.mParameterID, info);
-
+
if (map.IsSubRange()) {
map.mMinValue = map.mSubRangeMin;
map.mMaxValue = map.mSubRangeMax;
} else {
- map.mMinValue = info.minValue;
- map.mMaxValue = info.maxValue;
+ map.mMinValue = info.minValue;
+ map.mMaxValue = info.maxValue;
}
-
+
map.mTransType = CAAUMIDIMap::GetTransformer(info.flags);
}
OSStatus CAAUMIDIMapManager::SortedInsertToParamaterMaps (AUParameterMIDIMapping *maps, UInt32 inNumMaps, AUBase &That)
-{
- for (unsigned int i = 0; i < inNumMaps; ++i)
+{
+ for (unsigned int i = 0; i < inNumMaps; ++i)
{
CAAUMIDIMap map(maps[i]);
FillInMap (map, That);
-
+
int idx = FindParameterIndex (maps[i]);
if (idx > -1)
mParameterMaps.erase(mParameterMaps.begin() + idx);
@@ -83,9 +83,9 @@ OSStatus CAAUMIDIMapManager::SortedInsertToParamaterMaps (AUParameterMIDIMapping
// least disruptive place to put this is at the end
mParameterMaps.push_back(map);
}
-
- std::sort(mParameterMaps.begin(), mParameterMaps.end(), CompareMIDIMap());
-
+
+ std::sort(mParameterMaps.begin(), mParameterMaps.end(), CompareMIDIMap());
+
return noErr;
}
@@ -95,7 +95,7 @@ void CAAUMIDIMapManager::GetHotParameterMap(AUParameterMIDIMapping &outMap )
}
void CAAUMIDIMapManager::SortedRemoveFromParameterMaps(AUParameterMIDIMapping *maps, UInt32 inNumMaps, bool &outMapDidChange)
-{
+{
if (hotMapping) {
hotMapping = false;
}
@@ -122,7 +122,7 @@ void CAAUMIDIMapManager::ReplaceAllMaps (AUParameterMIDIMapping* inMappings, UIn
mParameterMaps.push_back (mapping);
}
- std::sort(mParameterMaps.begin(),mParameterMaps.end(), CompareMIDIMap());
+ std::sort(mParameterMaps.begin(),mParameterMaps.end(), CompareMIDIMap());
}
bool CAAUMIDIMapManager::HandleHotMapping(UInt8 inStatus,
@@ -132,13 +132,13 @@ bool CAAUMIDIMapManager::HandleHotMapping(UInt8 inStatus,
{ //used to set the hot map info
if (inStatus == 0xf0) return false;
-
+
if (!hotMapping) return false;
hotMapping = false;
- mHotMap.mStatus = inStatus | inChannel;
- mHotMap.mData1 = inData1;
-
+ mHotMap.mStatus = inStatus | inChannel;
+ mHotMap.mData1 = inData1;
+
SortedInsertToParamaterMaps (&mHotMap, 1, That);
return true;
}
@@ -147,10 +147,10 @@ bool CAAUMIDIMapManager::HandleHotMapping(UInt8 inStatus,
void CAAUMIDIMapManager::Print()
{
- for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) {
- CAAUMIDIMap* listmap = &(*i);
- listmap->Print();
- }
+ for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) {
+ CAAUMIDIMap* listmap = &(*i);
+ listmap->Print();
+ }
}
#endif // DEBUG
@@ -158,24 +158,24 @@ void CAAUMIDIMapManager::Print()
void CAAUMIDIMapManager::GetMaps(AUParameterMIDIMapping* maps)
{
int i = 0;
- for ( ParameterMaps::iterator iter = mParameterMaps.begin(); iter < mParameterMaps.end(); ++iter, ++i) {
- AUParameterMIDIMapping &listmap = (*iter);
- maps[i] = listmap;
+ for ( ParameterMaps::iterator iter = mParameterMaps.begin(); iter < mParameterMaps.end(); ++iter, ++i) {
+ AUParameterMIDIMapping &listmap = (*iter);
+ maps[i] = listmap;
}
}
int CAAUMIDIMapManager::FindParameterIndex (AUParameterMIDIMapping &inMap)
-{
+{
//used to get back hot mapping and one at a time maps, for ui
-
+
int idx = 0;
- for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) {
+ for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) {
CAAUMIDIMap & listmap = (*i);
- if ( (listmap.mParameterID == inMap.mParameterID) &&
- (listmap.mScope == inMap.mScope) &&
+ if ( (listmap.mParameterID == inMap.mParameterID) &&
+ (listmap.mScope == inMap.mScope) &&
(listmap.mElement == inMap.mElement) )
- {
- return idx;
+ {
+ return idx;
}
idx++;
}
@@ -193,37 +193,37 @@ bool CAAUMIDIMapManager::FindParameterMapEventMatch( UInt8 inStatus,
if (inStatus == 0x90 && !inData2)
inStatus = 0x80 | inChannel;
-
+
//used to test for midi matches once map is made
CAAUMIDIMap tempMap;
tempMap.mStatus = inStatus | inChannel;
tempMap.mData1 = inData1;
-
+
CompareMIDIMap compareObj;
AudioUnitEvent event;
event.mEventType = kAudioUnitEvent_ParameterValueChange;
event.mArgument.mParameter.mAudioUnit = inAUBase.GetComponentInstance();
-
- ParameterMaps::iterator lower_iter =
+
+ ParameterMaps::iterator lower_iter =
std::lower_bound(mParameterMaps.begin(), mParameterMaps.end(), tempMap, compareObj);
-
- while (lower_iter < mParameterMaps.end())
+
+ while (lower_iter < mParameterMaps.end())
{
CAAUMIDIMap & map = (*lower_iter);
- if (compareObj.Finish(map, tempMap))
+ if (compareObj.Finish(map, tempMap))
break;
-
+
Float32 value;
if (map.MIDI_Matches(inChannel, inData1, inData2, value))
- {
- inAUBase.SetParameter ( map.mParameterID, map.mScope, map.mElement,
+ {
+ inAUBase.SetParameter ( map.mParameterID, map.mScope, map.mElement,
map.ParamValueFromMIDILinear(value), inBufferOffset);
event.mArgument.mParameter.mParameterID = map.mParameterID;
event.mArgument.mParameter.mScope = map.mScope;
event.mArgument.mParameter.mElement = map.mElement;
-
+
AUEventListenerNotify(NULL, NULL, &event);
ret_value = true;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h
index 8926d8f..856c8fc 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h
@@ -2,14 +2,14 @@
File: CAAUMIDIMapManager.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAUMIDIMapManager_h_
#define __CAAUMIDIMapManager_h_
@@ -53,46 +53,46 @@
#include <AudioToolbox/AudioUnitUtilities.h>
class CAAUMIDIMapManager {
-
+
protected:
-
+
typedef std::vector<CAAUMIDIMap> ParameterMaps;
ParameterMaps mParameterMaps;
-
+
bool hotMapping;
AUParameterMIDIMapping mHotMap;
-
+
public:
-
+
CAAUMIDIMapManager();
-
+
UInt32 NumMaps(){return static_cast<UInt32>(mParameterMaps.size());}
void GetMaps(AUParameterMIDIMapping* maps);
-
+
int FindParameterIndex(AUParameterMIDIMapping &map);
-
+
void GetHotParameterMap(AUParameterMIDIMapping &outMap);
-
+
void SortedRemoveFromParameterMaps (AUParameterMIDIMapping *maps, UInt32 inNumMaps, bool &outMapDidChange);
OSStatus SortedInsertToParamaterMaps (AUParameterMIDIMapping *maps, UInt32 inNumMaps, AUBase &That);
-
+
void ReplaceAllMaps (AUParameterMIDIMapping* inMappings, UInt32 inNumMaps, AUBase &That);
-
+
bool IsHotMapping(){return hotMapping;}
void SetHotMapping (AUParameterMIDIMapping &inMap){hotMapping = true; mHotMap = inMap; }
-
+
bool HandleHotMapping( UInt8 inStatus,
UInt8 inChannel,
UInt8 inData1,
AUBase &That);
-
-
+
+
bool FindParameterMapEventMatch(UInt8 inStatus,
UInt8 inChannel,
UInt8 inData1,
UInt8 inData2,
UInt32 inBufferOffset,
- AUBase& inAUBase);
+ AUBase& inAUBase);
#if DEBUG
void Print();
#endif
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp
index 2d8fe18..bd8b784 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp
@@ -2,14 +2,14 @@
File: CAAUParameter.cpp
Abstract: CAAUParameter.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,13 +40,13 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAAUParameter.h"
-CAAUParameter::CAAUParameter()
+CAAUParameter::CAAUParameter()
{
memset(this, 0, sizeof(CAAUParameter));
}
@@ -63,7 +63,7 @@ CAAUParameter::CAAUParameter (AudioUnitParameter &inParam)
Init (inParam.mAudioUnit, inParam.mParameterID, inParam.mScope, inParam.mElement);
}
-CAAUParameter::CAAUParameter(const CAAUParameter &a)
+CAAUParameter::CAAUParameter(const CAAUParameter &a)
{
memset(this, 0, sizeof(CAAUParameter));
*this = a;
@@ -74,13 +74,13 @@ CAAUParameter & CAAUParameter::operator = (const CAAUParameter &a)
if (mParamName) CFRelease(mParamName);
if (mParamTag) CFRelease(mParamTag);
if (mNamedParams) CFRelease(mNamedParams);
-
+
memcpy(this, &a, sizeof(CAAUParameter));
if (mParamName) CFRetain(mParamName);
if (mParamTag) CFRetain(mParamTag);
if (mNamedParams) CFRetain(mNamedParams);
-
+
return *this;
}
@@ -97,7 +97,7 @@ void CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
mParameterID = param;
mScope = scope;
mElement = element;
-
+
UInt32 propertySize = sizeof(mParamInfo);
OSStatus err = AudioUnitGetProperty(au, kAudioUnitProperty_ParameterInfo,
scope, param, &mParamInfo, &propertySize);
@@ -105,11 +105,11 @@ void CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
memset(&mParamInfo, 0, sizeof(mParamInfo));
if (mParamInfo.flags & kAudioUnitParameterFlag_HasCFNameString) {
mParamName = mParamInfo.cfNameString;
- if (!(mParamInfo.flags & kAudioUnitParameterFlag_CFNameRelease))
+ if (!(mParamInfo.flags & kAudioUnitParameterFlag_CFNameRelease))
CFRetain (mParamName);
} else
mParamName = CFStringCreateWithCString(NULL, mParamInfo.name, kCFStringEncodingUTF8);
-
+
const char* str = 0;
switch (mParamInfo.unit)
{
@@ -177,11 +177,11 @@ void CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
case kAudioUnitParameterUnit_Indexed:
{
propertySize = sizeof(mNamedParams);
- err = AudioUnitGetProperty (au,
+ err = AudioUnitGetProperty (au,
kAudioUnitProperty_ParameterValueStrings,
- scope,
- param,
- &mNamedParams,
+ scope,
+ param,
+ &mNamedParams,
&propertySize);
if (!err && mNamedParams) {
mNumIndexedParams = CFArrayGetCount(mNamedParams);
@@ -208,7 +208,7 @@ void CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
str = NULL;
break;
}
-
+
if (str)
mParamTag = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
else
@@ -219,7 +219,7 @@ void CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
Float32 CAAUParameter::GetValue() const
{
Float32 value = 0.;
- //OSStatus err =
+ //OSStatus err =
AudioUnitGetParameter(mAudioUnit, mParameterID, mScope, mElement, &value);
return value;
}
@@ -227,7 +227,7 @@ Float32 CAAUParameter::GetValue() const
CFStringRef CreateLocalizedStringForParameterValue ( double inParameterValue,
const CAAUParameter * inParameter,
UInt32 inDigits,
- UInt32 minDigits) {
+ UInt32 minDigits) {
if (!inParameter) return nil;
AudioUnitParameterInfo info = inParameter->ParamInfo();
@@ -252,30 +252,30 @@ CFStringRef CreateLocalizedStringForParameterValue ( double inParameterValue
// 2 100-999 0
// 3 1000-9990 -1
// 4 10000-99900 -2
-
+
int nDigitsAfterDecimal = inDigits - (pow10 + 1);
if (nDigitsAfterDecimal < 0)
nDigitsAfterDecimal = 0; // the least number of digits possible is zero
if (info.flags & kAudioUnitParameterFlag_IsHighResolution)
nDigitsAfterDecimal = 4;
-
- CFLocaleRef currentLocale = CFLocaleCopyCurrent();
+
+ CFLocaleRef currentLocale = CFLocaleCopyCurrent();
CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate (NULL, currentLocale, kCFNumberFormatterDecimalStyle);
-
+
CFNumberRef maxFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal);
-
+
if (nDigitsAfterDecimal > 0)
nDigitsAfterDecimal = minDigits;
-
- CFNumberRef minFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal);
- CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMinFractionDigits, minFractionDigits);
- CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMaxFractionDigits, maxFractionDigits);
- CFStringRef formattedNumberString = CFNumberFormatterCreateStringWithValue (NULL, numberFormatter, kCFNumberDoubleType, &inParameterValue);
+ CFNumberRef minFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal);
- CFRelease(currentLocale);
- CFRelease(numberFormatter);
+ CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMinFractionDigits, minFractionDigits);
+ CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMaxFractionDigits, maxFractionDigits);
+ CFStringRef formattedNumberString = CFNumberFormatterCreateStringWithValue (NULL, numberFormatter, kCFNumberDoubleType, &inParameterValue);
+
+ CFRelease(currentLocale);
+ CFRelease(numberFormatter);
CFRelease(maxFractionDigits);
CFRelease(minFractionDigits);
@@ -284,20 +284,20 @@ CFStringRef CreateLocalizedStringForParameterValue ( double inParameterValue
CFStringRef CreateLocalizedStringForParameterValue ( double inParameterValue,
const CAAUParameter * inParameter,
- UInt32 inDigits) {
+ UInt32 inDigits) {
return CreateLocalizedStringForParameterValue (inParameterValue, inParameter, inDigits, 1);
}
double ValueForLocalizedParameterString (CFStringRef string, const CAAUParameter * inParameter) {
- CFLocaleRef currentLocale = CFLocaleCopyCurrent();
+ CFLocaleRef currentLocale = CFLocaleCopyCurrent();
CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate (NULL, currentLocale, kCFNumberFormatterDecimalStyle);
double value = 0;
Boolean worked = CFNumberFormatterGetValueFromString (numberFormatter, string, NULL, kCFNumberDoubleType, &value);
-
+
CFRelease(currentLocale);
CFRelease(numberFormatter);
-
+
if (worked)
return value;
else {
@@ -318,25 +318,25 @@ CFStringRef CAAUParameter::GetStringFromValueCopy(const Float32 *value) const
return str;
}
}
- else if (ValuesHaveStrings())
+ else if (ValuesHaveStrings())
{
AudioUnitParameterStringFromValue stringValue;
stringValue.inParamID = mParameterID;
stringValue.inValue = value;
stringValue.outString = NULL;
UInt32 propertySize = sizeof(stringValue);
-
- OSStatus err = AudioUnitGetProperty (mAudioUnit,
+
+ OSStatus err = AudioUnitGetProperty (mAudioUnit,
kAudioUnitProperty_ParameterStringFromValue,
- mScope,
- 0,
- &stringValue,
+ mScope,
+ 0,
+ &stringValue,
&propertySize);
-
+
if (!err && stringValue.outString != NULL)
return stringValue.outString;
}
-
+
Float32 val = (value == NULL ? GetValue() : *value);
AudioUnitParameterUnit unit = this->ParamInfo().unit;
if (unit == kAudioUnitParameterUnit_Cents || unit == kAudioUnitParameterUnit_AbsoluteCents)
@@ -347,29 +347,29 @@ CFStringRef CAAUParameter::GetStringFromValueCopy(const Float32 *value) const
Float32 CAAUParameter::GetValueFromString(CFStringRef str) const
{
- if (ValuesHaveStrings())
+ if (ValuesHaveStrings())
{
AudioUnitParameterValueFromString valueString;
valueString.inParamID = mParameterID;
valueString.inString = str;
UInt32 propertySize = sizeof(valueString);
-
- OSStatus err = AudioUnitGetProperty (mAudioUnit,
+
+ OSStatus err = AudioUnitGetProperty (mAudioUnit,
kAudioUnitProperty_ParameterValueFromString,
- mScope,
- 0,
- &valueString,
+ mScope,
+ 0,
+ &valueString,
&propertySize);
-
+
if (!err) {
return valueString.outValue;
}
}
-
+
return (Float32) ValueForLocalizedParameterString(str, this);
}
-void CAAUParameter::SetValue( AUParameterListenerRef inListener,
+void CAAUParameter::SetValue( AUParameterListenerRef inListener,
void * inObject,
Float32 inValue) const
{
@@ -379,7 +379,7 @@ void CAAUParameter::SetValue( AUParameterListenerRef inListener,
valueToSet = mParamInfo.maxValue;
if (valueToSet < mParamInfo.minValue)
valueToSet = mParamInfo.minValue;
-
+
AUParameterSet(inListener, inObject, this, valueToSet, 0);
}
@@ -388,12 +388,12 @@ void CAAUParameter::Print() const
{
UInt32 clump = 0;
GetClumpID (clump);
-
+
UInt32 len = static_cast<UInt32>(CFStringGetLength(mParamName));
char* chars = (char*)malloc (len * 2); // give us plenty of room for unichar chars
if (!CFStringGetCString (mParamName, chars, len * 2, kCFStringEncodingUTF8))
chars[0] = 0;
-
+
printf ("ID: %ld, Clump: %u, Name: %s\n", (long unsigned int) mParameterID, (unsigned int) clump, chars);
free (chars);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h
index f8b5733..42402ed 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h
@@ -2,14 +2,14 @@
File: CAAUParameter.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAUParameter_h__
#define __CAAUParameter_h__
@@ -65,107 +65,107 @@ public:
CAAUParameter(const CAAUParameter &a);
/*! @dtor ~CAAUParameter */
~CAAUParameter();
-
+
/*! @method operator <@ */
- bool operator < (const CAAUParameter &a) const
- {
- return memcmp(this, &a, sizeof(AudioUnitParameter)) < 0;
+ bool operator < (const CAAUParameter &a) const
+ {
+ return memcmp(this, &a, sizeof(AudioUnitParameter)) < 0;
}
/*! @method operator ==@ */
- bool operator == (const CAAUParameter &a) const
- {
- return !memcmp(this, &a, sizeof(AudioUnitParameter));
+ bool operator == (const CAAUParameter &a) const
+ {
+ return !memcmp(this, &a, sizeof(AudioUnitParameter));
}
-
+
/*! @method operator =@ */
CAAUParameter & operator = (const CAAUParameter &a);
-
+
/*! @method GetValue */
Float32 GetValue() const;
/*! @method SetValue */
- void SetValue( AUParameterListenerRef inListener,
+ void SetValue( AUParameterListenerRef inListener,
void * inObject,
Float32 inValue) const;
-
+
/*! @method GetName */
- CFStringRef GetName() const { return mParamName; }
+ CFStringRef GetName() const { return mParamName; }
// borrowed reference!
/*! @method GetStringFromValueCopy */
- CFStringRef GetStringFromValueCopy(const Float32 *value = NULL) const;
+ CFStringRef GetStringFromValueCopy(const Float32 *value = NULL) const;
// returns a copy of the name of the current parameter value
// or null if there is no name associated
// caller must release
/*! @method ValuesHaveStrings */
- bool ValuesHaveStrings () const
- {
- return (mParamInfo.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0;
+ bool ValuesHaveStrings () const
+ {
+ return (mParamInfo.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0;
}
-
+
/*! @method GetValueFromString */
- Float32 GetValueFromString (CFStringRef str) const;
+ Float32 GetValueFromString (CFStringRef str) const;
// caller must release
/*! @method ParamInfo */
- const AudioUnitParameterInfo &
+ const AudioUnitParameterInfo &
ParamInfo() const { return mParamInfo; }
/*! @method GetParamTag */
CFStringRef GetParamTag() const { return mParamTag; }
- // this may return null! -
+ // this may return null! -
// in which case there is no descriptive tag for the parameter
/*! @method GetParamName */
CFStringRef GetParamName (int inIndex) const
// this can return null if there is no name for the parameter
- {
- return (mNamedParams && inIndex < mNumIndexedParams)
+ {
+ return (mNamedParams && inIndex < mNumIndexedParams)
? (CFStringRef) CFArrayGetValueAtIndex(mNamedParams, inIndex)
- : 0;
+ : 0;
}
-
+
/*! @method GetNumIndexedParams */
int GetNumIndexedParams () const { return mNumIndexedParams; }
-
+
/*! @method IsIndexedParam */
bool IsIndexedParam () const { return mNumIndexedParams != 0; }
-
+
/*! @method HasNamedParams */
bool HasNamedParams () const { return IsIndexedParam() && mNamedParams; }
-
+
/*! @method GetClumpID */
- bool GetClumpID (UInt32 &outClumpID) const
- {
+ bool GetClumpID (UInt32 &outClumpID) const
+ {
if (mParamInfo.flags & kAudioUnitParameterFlag_HasClump) {
outClumpID = mParamInfo.clumpID;
return true;
}
return false;
}
-
+
/*! @method HasDisplayTransformation */
- bool HasDisplayTransformation () const
- {
- return GetAudioUnitParameterDisplayType (mParamInfo.flags);
+ bool HasDisplayTransformation () const
+ {
+ return GetAudioUnitParameterDisplayType (mParamInfo.flags);
}
/*! @method IsExpert */
- bool IsExpert () const
- {
- return mParamInfo.flags & kAudioUnitParameterFlag_ExpertMode;
+ bool IsExpert () const
+ {
+ return mParamInfo.flags & kAudioUnitParameterFlag_ExpertMode;
}
#if DEBUG
void Print () const;
#endif
-
+
// these methods are defined in CAPersistence.cpp
// they will persist and restore only the scope, element and param ID's of the AudioUnitParameter
// however, this is sufficient to be able to save/restore a CAAUParameter object
void Save (CFPropertyListRef &outData) const;
-
+
static void Save (const AudioUnitParameter &inParam, CFPropertyListRef &outData);
-
+
static OSStatus Restore (const CFPropertyListRef inData, AudioUnitParameter &outParam);
protected:
@@ -180,7 +180,7 @@ protected:
short mNumIndexedParams;
/*! @var mNamedParams */
CFArrayRef mNamedParams;
-
+
private:
void Init (AudioUnit au, AudioUnitParameterID param, AudioUnitScope scope, AudioUnitElement element);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp
index 1cda39c..9aaba46 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp
@@ -2,14 +2,14 @@
File: CAAUProcessor.cpp
Abstract: CAAUProcessor.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,24 +40,24 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
-#include "CAAUProcessor.h"
+#include "CAAUProcessor.h"
#include "CAXException.h"
-static OSStatus SilenceInputCallback (void *inRefCon,
- AudioUnitRenderActionFlags *ioActionFlags,
- const AudioTimeStamp *inTimeStamp,
- UInt32 inBusNumber,
- UInt32 inNumberFrames,
+static OSStatus SilenceInputCallback (void *inRefCon,
+ AudioUnitRenderActionFlags *ioActionFlags,
+ const AudioTimeStamp *inTimeStamp,
+ UInt32 inBusNumber,
+ UInt32 inNumberFrames,
AudioBufferList *ioData)
{
AudioBuffer *buf = ioData->mBuffers;
for (UInt32 i = ioData->mNumberBuffers; i--; ++buf)
memset((Byte *)buf->mData, 0, buf->mDataByteSize);
-
+
//provide a hint that our input data is silent.
*ioActionFlags &= kAudioUnitRenderAction_OutputIsSilence;
return noErr;
@@ -84,19 +84,19 @@ CAAUProcessor::~CAAUProcessor ()
inline OSStatus SetInputCallback (CAAudioUnit &inUnit, AURenderCallbackStruct &inInputCallback)
{
- return inUnit.SetProperty (kAudioUnitProperty_SetRenderCallback,
- kAudioUnitScope_Input,
+ return inUnit.SetProperty (kAudioUnitProperty_SetRenderCallback,
+ kAudioUnitScope_Input,
0,
- &inInputCallback,
+ &inInputCallback,
sizeof(inInputCallback));
}
static AURenderCallbackStruct sRenderCallback;
-static OSStatus PrerollRenderProc ( void * /*inRefCon*/,
+static OSStatus PrerollRenderProc ( void * /*inRefCon*/,
AudioUnitRenderActionFlags * /*inActionFlags*/,
- const AudioTimeStamp * /*inTimeStamp*/,
+ const AudioTimeStamp * /*inTimeStamp*/,
UInt32 /*inBusNumber*/,
- UInt32 /*inNumFrames*/,
+ UInt32 /*inNumFrames*/,
AudioBufferList *ioData)
{
AudioBuffer *buf = ioData->mBuffers;
@@ -111,18 +111,18 @@ OSStatus Preroll (CAAudioUnit & inAU, UInt32 inFrameSize)
CAStreamBasicDescription desc;
OSStatus result = inAU.GetFormat (kAudioUnitScope_Input, 0, desc);
bool hasInput = false;
- //we have input
- if (result == noErr)
+ //we have input
+ if (result == noErr)
{
sRenderCallback.inputProc = PrerollRenderProc;
sRenderCallback.inputProcRefCon = 0;
-
- result = inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
+
+ result = inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
0, &sRenderCallback, sizeof(sRenderCallback));
if (result) return result;
hasInput = true;
}
-
+
AudioUnitRenderActionFlags flags = 0;
AudioTimeStamp time;
memset (&time, 0, sizeof(time));
@@ -133,7 +133,7 @@ OSStatus Preroll (CAAudioUnit & inAU, UInt32 inFrameSize)
{
AUOutputBL list (outputFormat, inFrameSize);
list.Prepare ();
-
+
result = inAU.Render (&flags, &time, 0, inFrameSize, list.ABL());
if (result) { printf("A result %d\n", (int)result); goto home; }
}
@@ -143,8 +143,8 @@ home:
// remove our installed callback
sRenderCallback.inputProc = 0;
sRenderCallback.inputProcRefCon = 0;
-
- inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
+
+ inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
0, &sRenderCallback, sizeof(sRenderCallback));
}
return result;
@@ -163,10 +163,10 @@ OSStatus CAAUProcessor::EstablishInputCallback (AURenderCallbackStruct &inInput
OSStatus CAAUProcessor::SetAUPreset (CFPropertyListRef inPreset)
{
- return mUnit.SetProperty (kAudioUnitProperty_ClassInfo,
- kAudioUnitScope_Global,
- 0,
- &inPreset,
+ return mUnit.SetProperty (kAudioUnitProperty_ClassInfo,
+ kAudioUnitScope_Global,
+ 0,
+ &inPreset,
sizeof(inPreset));
}
@@ -215,12 +215,12 @@ OSStatus CAAUProcessor::Reinitialize (UInt32 inNewMaxFrames)
{
OSStatus result;
CAStreamBasicDescription inputDesc, outputDesc;
-
+
ca_require_noerr (result = mUnit.GetFormat (kAudioUnitScope_Input, 0, inputDesc), home);
ca_require_noerr (result = mUnit.GetFormat (kAudioUnitScope_Output, 0, outputDesc), home);
-
+
ca_require_noerr (result = DoInitialisation (inputDesc, outputDesc, mNumInputSamples, inNewMaxFrames), home);
-
+
home:
return result;
}
@@ -232,23 +232,23 @@ OSStatus CAAUProcessor::DoInitialisation (const CAStreamBasicDescription &inIn
UInt32 inMaxFrames)
{
OSStatus result;
-
+
if (inNumInputSamples == 0 && IsOfflineAU())
return kAudioUnitErr_InvalidOfflineRender;
-
+
mNumInputSamples = inNumInputSamples;
-
+
// first check that we can do this number of channels
if (mUnit.CanDo (inInputFormat.NumberChannels(), inOutputFormat.NumberChannels()) == false)
ca_require_noerr (result = kAudioUnitErr_FailedInitialization, home);
-
+
// just uninitialise the AU as a matter of course
ca_require_noerr (result = mUnit.Uninitialize(), home);
- ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Input, 0, inInputFormat), home);
- ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Output, 0, inOutputFormat), home);
+ ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Input, 0, inInputFormat), home);
+ ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Output, 0, inOutputFormat), home);
ca_require_noerr (result = SetMaxFramesPerRender (inMaxFrames), home);
-
+
#if !TARGET_OS_IPHONE
// if we're any AU but an offline AU, we should tell it that we've processing offline
if (!IsOfflineAU()) {
@@ -263,11 +263,11 @@ OSStatus CAAUProcessor::DoInitialisation (const CAStreamBasicDescription &inIn
&mNumInputSamples, sizeof(mNumInputSamples));
}
#endif
-
+
ca_require_noerr (result = mUnit.Initialize(), home);
ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
-
+
// finally reset our time stamp
// the time stamp we use with the AU Render - only sample count is valid
memset (&mRenderTimeStamp, 0, sizeof(mRenderTimeStamp));
@@ -281,11 +281,11 @@ OSStatus CAAUProcessor::DoInitialisation (const CAStreamBasicDescription &inIn
delete mPreflightABL;
mPreflightABL = NULL;
}
-
+
mPreflightABL = new AUOutputBL (inOutputFormat);
mLastPercentReported = 0;
-
+
home:
return result;
}
@@ -297,27 +297,27 @@ void CAAUProcessor::CalculateRemainderSamples (Float64 inSampleRate)
mTailSamples = 0;
mTailSamplesRemaining = 0;
return;
-
+
// nothing to do because we're not processing offline
if (IsOfflineContext() == false) return;
-
+
// because an offline unit has some indeterminancy about what it does with the input samples
// it is *required* to deal internally with both latency and tail
- if (!IsOfflineAU())
+ if (!IsOfflineAU())
{
// when offline we need to deal with both latency and tail
-
+
// if the AU has latency - how many samples at the start will be zero?
// we'll end up chucking these away.
Float64 renderTimeProps;
UInt32 propSize = sizeof (renderTimeProps);
OSStatus result = mUnit.GetProperty (kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0,
&renderTimeProps, &propSize);
-
+
Float64 latencySamples = 0;
if (result == noErr) // we have latency to deal with - its reported in seconds
latencySamples = renderTimeProps * inSampleRate;
-
+
// AU tail
// if the AU has a tail - we'll pull that many zeroes through at the end to flush
// out this tail - think of a decaying digital delay or reverb...
@@ -328,7 +328,7 @@ void CAAUProcessor::CalculateRemainderSamples (Float64 inSampleRate)
Float64 tailSamples = 0;
if (result == noErr)
tailSamples = renderTimeProps * inSampleRate;
-
+
// this dictates how many samples at the end we need to pull through...
// we add latency to tail because we throw the latency samples away from the start of the rendering
// and we have to pull that many samples after the end of course to get the last of the original data
@@ -342,7 +342,7 @@ void CAAUProcessor::CalculateRemainderSamples (Float64 inSampleRate)
#if !TARGET_OS_IPHONE
CFStringRef CAAUProcessor::GetOLPreflightName () const
{
- if (OfflineAUNeedsPreflight())
+ if (OfflineAUNeedsPreflight())
{
CFStringRef str;
UInt32 size = sizeof(str);
@@ -389,8 +389,8 @@ OSStatus CAAUProcessor::Preflight (bool inProcessPreceedingTail)
UInt32 numFrames = MaxFramesPerRender();
if (numFrames == 0)
return kAudioUnitErr_InvalidProperty;
-
- if (!IsOfflineAU())
+
+ if (!IsOfflineAU())
{
if ((IsOfflineContext() == false && inProcessPreceedingTail) || IsOfflineContext())
{
@@ -399,22 +399,22 @@ OSStatus CAAUProcessor::Preflight (bool inProcessPreceedingTail)
// Consume the number of input samples indicated by the AU's latency or tail
// based on whether the AU is being used in an offline context or not.
-
- UInt32 latSamps = IsOfflineContext() ? mLatencySamples : mTailSamples;
+
+ UInt32 latSamps = IsOfflineContext() ? mLatencySamples : mTailSamples;
printf("latSamps %d\n", (int)latSamps);
latSamps = 0;
while (latSamps > 0)
{
if (latSamps < numFrames)
numFrames = latSamps;
-
+
// process the samples (the unit's input callback will read the samples
// from the file and convert them to float for processing
AudioUnitRenderActionFlags renderFlags = 0;
mPreflightABL->Prepare();
result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, numFrames, mPreflightABL->ABL());
if (result) { printf("B result %d\n", (int)result); goto home; }
-
+
mRenderTimeStamp.mSampleTime += numFrames;
latSamps -= numFrames;
}
@@ -425,10 +425,10 @@ OSStatus CAAUProcessor::Preflight (bool inProcessPreceedingTail)
{
// processing real-time but not processing preceeding tail, so we should preroll the AU
ca_require_noerr (result = Preroll(mUnit, numFrames), home);
-
+
// re-establish the user's input callback
ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
-
+
mRenderTimeStamp.mSampleTime = 0;
}
}
@@ -437,25 +437,25 @@ OSStatus CAAUProcessor::Preflight (bool inProcessPreceedingTail)
{
// re-establish the user's input callback
ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
-
+
UInt32 preflightRequirements;
UInt32 size; size = sizeof(preflightRequirements);
ca_require_noerr (result = mUnit.GetProperty (kAudioUnitOfflineProperty_PreflightRequirements,
kAudioUnitScope_Global, 0,
&preflightRequirements, &size), home);
-
+
// 0 indicates none, otherwise optional or required -> we do it for either
- if (preflightRequirements)
+ if (preflightRequirements)
{
for (;;) {
- // here we need to do the preflight loop - we don't expect any data back, but have to
+ // here we need to do the preflight loop - we don't expect any data back, but have to
// give the offline unit all of its input data to allow it to prepare its processing
AudioUnitRenderActionFlags renderFlags = kAudioOfflineUnitRenderAction_Preflight;
mPreflightABL->Prepare();
result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, numFrames, mPreflightABL->ABL());
if (result) { printf("C result %d\n", (int)result); goto home; }
mRenderTimeStamp.mSampleTime += numFrames;
-
+
if (renderFlags & kAudioOfflineUnitRenderAction_Complete)
break;
}
@@ -468,7 +468,7 @@ OSStatus CAAUProcessor::Preflight (bool inProcessPreceedingTail)
if (result == noErr) {
mPreflightDone = true;
}
-
+
home:
printf("<<<<CAAUProcessor::Preflight\n");
return result;
@@ -488,16 +488,16 @@ OSStatus CAAUProcessor::OfflineAUPreflight (UInt32 inNumFrames, bool &outIsDone
ca_require_noerr (result = mUnit.GetProperty (kAudioUnitOfflineProperty_PreflightRequirements,
kAudioUnitScope_Global, 0,
&preflightRequirements, &size), home);
-
+
// 0 indicates none, otherwise optional or required -> we do it for either
- if (preflightRequirements)
+ if (preflightRequirements)
{
AudioUnitRenderActionFlags renderFlags = kAudioOfflineUnitRenderAction_Preflight;
mPreflightABL->Prepare();
result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, inNumFrames, mPreflightABL->ABL());
if (result) { printf("D result %d\n", (int)result); goto home; }
mRenderTimeStamp.mSampleTime += inNumFrames;
-
+
if (renderFlags & kAudioOfflineUnitRenderAction_Complete) {
outIsDone = true;
mRenderTimeStamp.mSampleTime = 0;
@@ -512,7 +512,7 @@ OSStatus CAAUProcessor::OfflineAUPreflight (UInt32 inNumFrames, bool &outIsDone
mPreflightDone = true;
mLastPercentReported = 0;
}
-
+
home:
return result;
}
@@ -527,33 +527,33 @@ void SetBufferListToNumFrames (AudioBufferList &list, UInt32 inNumFrames)
}
}
-OSStatus CAAUProcessor::Render (AudioBufferList *ioData,
- UInt32 &ioNumFrames,
+OSStatus CAAUProcessor::Render (AudioBufferList *ioData,
+ UInt32 &ioNumFrames,
bool &outIsSilence,
- bool *outOLCompleted,
+ bool *outOLCompleted,
bool *outOLRequiresPostProcess)
{
if (IsOfflineContext())
{
if (!mPreflightDone)
return kAudioUnitErr_InvalidOfflineRender;
-
+
// YES - this is correct!!! you have to provide both if rendering in an offline Context
*outOLCompleted = false;
*outOLRequiresPostProcess = false;
- if (!IsOfflineAU() && !mUnit.Comp().Desc().IsFConv())
+ if (!IsOfflineAU() && !mUnit.Comp().Desc().IsFConv())
{
// have we processed the input we expect too?
// in an offline case, we want to create output that matches the input
// for an OfflineAU type, it manages this internally, so we don't have to do anything
// for a FormatConverter AU, we don't know and can't tell, so we can't do anything here
- // for any other AU type (effect, instrument) the Prime assumption is that it will
+ // for any other AU type (effect, instrument) the Prime assumption is that it will
// ask for the same number of frames of input as it is asked to output
// so we can ask what it is doing, and get a sample accurate output (which is input + tail time)
- if (mRenderTimeStamp.mSampleTime + ioNumFrames >= InputSampleCount())
+ if (mRenderTimeStamp.mSampleTime + ioNumFrames >= InputSampleCount())
{
- // if we fall into here, we have just a partial number of input samples left
+ // if we fall into here, we have just a partial number of input samples left
// (less input less than what we've been asked to produce output for.
*outOLCompleted = true;
// we require post processing if we've got some tail (or latency) samples to flush through
@@ -579,8 +579,8 @@ OSStatus CAAUProcessor::Render (AudioBufferList *ioData,
OSStatus result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, ioNumFrames, ioData);
if (result) { printf("E result %d\n", (int)result); }
if (result) {
- if (mUnit.Comp().Desc().IsFConv()) {
- // this is the only way we can tell we're done with a FormatConverter AU
+ if (mUnit.Comp().Desc().IsFConv()) {
+ // this is the only way we can tell we're done with a FormatConverter AU
// - ie. client returns an error from input
result = noErr;
*outOLCompleted = true;
@@ -600,7 +600,7 @@ OSStatus CAAUProcessor::Render (AudioBufferList *ioData,
// }
mRenderTimeStamp.mSampleTime += ioNumFrames;
outIsSilence = (renderFlags & kAudioUnitRenderAction_OutputIsSilence);
-
+
// if we're an Offline AU type, it will set this flag on completion of its processing
if (renderFlags & kAudioOfflineUnitRenderAction_Complete) {
// we now need to calculate how many frames we rendered.
@@ -617,7 +617,7 @@ OSStatus CAAUProcessor::Render (AudioBufferList *ioData,
mUnit.GlobalReset (); //flush this out, as we're done with this phase
}
}
-
+
return result;
}
@@ -637,20 +637,20 @@ OSStatus CAAUProcessor::Render (AudioBufferList *ioData,
// u.f = ((float*)(ioData->mBuffers[0].mData))[i];
// printf("aup out %4d %14.10f %02X %02X %02X %02X\n", (int)i, u.f, u.c[0], u.c[1], u.c[2], u.c[3]);
// }
-
- return result;
+
+ return result;
}
-
-OSStatus CAAUProcessor::PostProcess (AudioBufferList *ioData,
- UInt32 &ioNumFrames,
+
+OSStatus CAAUProcessor::PostProcess (AudioBufferList *ioData,
+ UInt32 &ioNumFrames,
bool &outIsSilence,
bool &outDone)
{
- if (IsOfflineAU() || !IsOfflineContext())
+ if (IsOfflineAU() || !IsOfflineContext())
return kAudioUnitErr_CannotDoInCurrentContext;
-
+
outDone = false;
-
+
// we've got less samples to process than we've been asked to process
if (mTailSamplesRemaining <= SInt32(ioNumFrames)) {
outDone = true;
@@ -659,7 +659,7 @@ OSStatus CAAUProcessor::PostProcess (AudioBufferList *ioData,
if (ioNumFrames == 0)
return noErr;
}
-
+
AudioUnitRenderActionFlags renderFlags = 0;
OSStatus result;
result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, ioNumFrames, ioData);
@@ -667,14 +667,14 @@ OSStatus CAAUProcessor::PostProcess (AudioBufferList *ioData,
mRenderTimeStamp.mSampleTime += ioNumFrames;
mTailSamplesRemaining -= ioNumFrames;
outIsSilence = (renderFlags & kAudioUnitRenderAction_OutputIsSilence);
-
+
if (outDone) {
ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
mUnit.GlobalReset (); //flush this out, as we're done with this phase
}
home:
return result;
-}
+}
#if !TARGET_OS_IPHONE
Float32 CAAUProcessor::GetOLPercentComplete ()
@@ -683,22 +683,22 @@ Float32 CAAUProcessor::GetOLPercentComplete ()
return 0;
Float32 percentDone = mLastPercentReported;
-
- if (IsOfflineAU())
+
+ if (IsOfflineAU())
{
// we get the output size every time, as this can change as parameters are changed
UInt64 numOutputSamples = mNumInputSamples;
UInt32 propSize = sizeof(numOutputSamples);
mUnit.GetProperty (kAudioUnitOfflineProperty_OutputSize,
kAudioUnitScope_Global, 0, &numOutputSamples, &propSize);
-
+
percentDone = (mRenderTimeStamp.mSampleTime / Float64(numOutputSamples)) * 100.;
}
else
{
percentDone = (mRenderTimeStamp.mSampleTime / Float64(mNumInputSamples + mTailSamples)) * 100.;
}
-
+
if (percentDone > mLastPercentReported)
mLastPercentReported = percentDone;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h
index f0fb345..c8c02be 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h
@@ -2,14 +2,14 @@
File: CAAUProcessor.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAUProcessor_h__
#define __CAAUProcessor_h__
@@ -60,76 +60,76 @@
It can be used in a RealTime context (rendering data with RT constraints) or in an OffLine context
such as using an AU to process data that is stored in a file, and on which there are no
RT constraints to be imposed.
-
+
Order of operations:
Create an instance
Establish an Input Callback
Initialize the AU to the audio formats and whether it is going to process in an offline or RT context
Preflight
-
+
while (...)
Render // based on your calling context
-
+
PostProcess if needed (only in OL case)
-
+
After any initialization, preflighting is required.
-
+
Parameter Values on the AU should be set just before each call to Render. The sampleFrameOffsets
supplied when setting those values are an offset into that next render buffer's numFrames.
-
+
RT vs OT is determined by whether the inputSampleCount is set during Initialization, thus
this class can move the AU between RT and OL contexts. If you are using an AU of type 'auol'
(Offline), then it cannot be used in a RT context.
The CAAUProcessor will only call your Input Callback for input when it needs valid input.
This input callback will contain a sample time that indicates where within your input
- you should read data from, where after preflighting, the first output data produces is for
+ you should read data from, where after preflighting, the first output data produces is for
the output sample count of zero.
-
+
MaxFrames should be set before initialisation (or is also passed in to the Reinitialize API)
-
+
If RT, then PostProcessing will *never* be required, nor will Render ever return an isDone value
If OL, then Render will at some point return isDone==true, and then also indicate if PostProcessing is required
-
+
If using a Format Converter AU in offline context, then the only way for it to determine that you've finished
is for the Input callback to return an error. This means ultimately, that you'll have potentially longer output
- than you should have. The only way to manage this is for the caller to know the relationship between
+ than you should have. The only way to manage this is for the caller to know the relationship between
input to output samples that will be required, and to call Render for just that amount of output samples
then return an error, so the tail and latency can be processed.
-
+
Tail and Latency are *only* calculated at initialisation.. Some AU's may change these properties based on
either different presets or parameter settings... Ideally, this class should listen to those properties
and recalculate its values based on those changes.
-*/
-
+*/
+
class CAAUProcessor {
public:
// by default this is set to process offline
CAAUProcessor (const CAComponent& inComp);
~CAAUProcessor ();
-
+
CAAudioUnit& AU() { return mUnit; }
const CAAudioUnit& AU() const { return mUnit; }
-
-#pragma mark __Setup APIs
+
+#pragma mark __Setup APIs
bool IsOfflineContext () const { return mNumInputSamples != 0; }
-
- // this contains the callback and client data that the AU
+
+ // this contains the callback and client data that the AU
// uses to call when it needs input
OSStatus EstablishInputCallback (AURenderCallbackStruct &inInputCallback);
-
+
OSStatus SetAUPreset (CFPropertyListRef inPreset);
OSStatus SetAUPresetIndex (SInt32 inPresetIndex);
-
+
OSStatus SetParameter (AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
Float32 value, UInt32 bufferOffsetFrames = 0);
-
+
// a result of zero here signifies an error
UInt32 MaxFramesPerRender () const;
-
+
// this call can return an error if the AU is initialized - see Reinitialize
OSStatus SetMaxFramesPerRender (UInt32 inMaxFrames);
-
+
// Prepares the AU for processing at the specified format
// only doing n-n channel processing here.. could extend this for n-m channel processing easily enough
// if you are processing using an Offline AU, you HAVE to specify the numInputSamples to process
@@ -138,15 +138,15 @@ public:
{
return Initialize (inIODesc, inIODesc, inNumInputSamples);
}
- OSStatus Initialize (const CAStreamBasicDescription &inInputDesc,
- const CAStreamBasicDescription &inOutputDesc,
+ OSStatus Initialize (const CAStreamBasicDescription &inInputDesc,
+ const CAStreamBasicDescription &inOutputDesc,
UInt64 inNumInputSamples = 0);
-
+
// takes the existing format state of the AU, but resets the AUProcessor so that:
// applies an optional new number of max frames
// the AUProcessor will have to be Preflighted again after this call
// Use this when you want to keep the same formats, same input sample count,
- // but want to re-initialize the AU to use a new num max frames and prepare it
+ // but want to re-initialize the AU to use a new num max frames and prepare it
// appropriately...
OSStatus Reinitialize (UInt32 inNewMaxFrames);
@@ -155,18 +155,18 @@ public:
#pragma mark __Render APIs
// Preflighting - you HAVE to preflight
// returns noErr when preflighting is done
-
+
// Offline Context:
// Offline AU's require preflighting, even if they will end up doing no work.
- // In the case where the AU is offline the latency samples are trimmed and not returned
+ // In the case where the AU is offline the latency samples are trimmed and not returned
// from the consequent Render calls
-
- // If you are NOT an offline AU then the first time Render is called,
+
+ // If you are NOT an offline AU then the first time Render is called,
// there will need to be some consumption of the input before you will get any valid output data.
// This is determined by the value of the AU's reported latency. So, in this case preflight
// will consume those initial samples and then return.
// Your InputCallback MUST provide the initial data that is to be processed.
-
+
// RealTime Context:
// (1 No priming. In this case inProcessPreceedingTail is false (the default) and no
// processing is done on the AU. However, because preflight is the first time that Rendering
@@ -185,12 +185,12 @@ public:
// and you'll need to read up to the numSamples of tail time of the preceeding data.
// It discards the output results of the preflighting. If you don't have any previous data
// with which to prepare the AU, then you do NOT need to take this path and can do the step below.
-
+
// In both of these cases the inital latency frames are *not* trimmed from
// the output that will be generated by a consequent call to render.
OSStatus Preflight (bool inProcessPreceedingTail = false);
- // this can be used with an OfflineAU to do a gradual preflight (so you could for instance,
+ // this can be used with an OfflineAU to do a gradual preflight (so you could for instance,
// present a progress indicator. The Preflight call will do it all at once.
// If you break out of the preflight before you are done, then you HAVE to reinitialise the AU
// before you can either do another preflight or do a render, otherwise the Render call will produce
@@ -199,45 +199,45 @@ public:
// Here's the major stage that produces output.
// You pass in two bool flags and an ioNumFrames....
-
+
// So ioNumFrames will be *untouched* if outOLCompleted == false
// if outOLCompleted is true, ioNumFrames contains the number of valid frames within the ioData data that are valid data
// (ioData's pointers and sizes will also have been resized to match these number of frames)
- // outOLRequiresPostProcess should also be checked when outOLCompleted is true,
+ // outOLRequiresPostProcess should also be checked when outOLCompleted is true,
// to see if any post-processing is required
// if rendering in a RT context, then neither outOLCompleted or outOLRequiresPostProcess is required
// if rendering in an OL context, both must be specified.
// Caller MUST provide an ABL that is set up in the previously specified output format
-
+
// If you receive kAudioUnitErr_InvalidOfflineRender when dealing with an OfflineAU Type, then you have either not
// preflighted it (and the AU requires it) or you have changed some state (its num input samples, its start offest)
// and it needs to be re-preflighted. In that case, preflight the AU again first.
- OSStatus Render (AudioBufferList *ioData,
- UInt32 &ioNumFrames,
+ OSStatus Render (AudioBufferList *ioData,
+ UInt32 &ioNumFrames,
bool &outIsSilence,
- bool *outOLCompleted = NULL,
+ bool *outOLCompleted = NULL,
bool *outOLRequiresPostProcess = NULL);
-
+
// call this method if outOLRequiresPostProcess returned true upon rendering completion
OSStatus PostProcess (AudioBufferList *ioData, UInt32 &ioNumFrames, bool &outIsSilence, bool &outDone);
-
+
// This method returns how many input samples will need to be provided before
// valid output data is produced.
UInt32 LatencySampleCount () const { return mLatencySamples; }
-
+
UInt32 TailSampleCount () const { return mTailSamples; }
-
+
UInt64 InputSampleCount () const { return mNumInputSamples; }
-
+
// the class maintains the TimeStamp from render call to render call
// this value is the sample count that will be used in the *next* render call
Float64 SampleTime () const { return mRenderTimeStamp.mSampleTime; }
-
+
// in some settings (for instance a delay with 100% feedback) tail time is essentially infinite
// so you should safeguard the final OL render stage (post process) which is aimed at pulling the tail through
// default is 10 seconds
Float64 GetMaxTailTime () const { return mMaxTailTime; }
-
+
// this ONLY takes affect when you initialise the processor, it doesn't change that AU's tail time,
// but just the max amount of time that this object will allow the AU to post-process data
// set this to 0, to use the AU's tail time with no adjustment
@@ -247,20 +247,20 @@ public:
// if this is NULL, then there is no explicit (optional or required) preflight requirement of the AU
// if this is valid, then the AU either requires or optionally requires preflighting. The default
// behaviour in this case is that the processor will preflight. This name can be used to preset
- // to the user. If the AU doesn't present a name, but preflighting is optional/required, then the
+ // to the user. If the AU doesn't present a name, but preflighting is optional/required, then the
// processor return "Preflight" as its string.
// the String should be released by the caller.
CFStringRef GetOLPreflightName () const;
- // Returns true if this is processor is an offline AU, and that AU (whether optional or required)
+ // Returns true if this is processor is an offline AU, and that AU (whether optional or required)
// needs preflighting
bool OfflineAUNeedsPreflight () const;
-
+
// this provides a rough approximation of the progress of an Offline Processing operation (both for the
// preflight and the render phases)
Float32 GetOLPercentComplete ();
#endif
-
+
private:
CAAudioUnit mUnit;
UInt32 mLatencySamples;
@@ -274,11 +274,11 @@ private:
AURenderCallbackStruct mUserCallback;
Float64 mMaxTailTime;
Float32 mLastPercentReported;
-
+
bool IsOfflineAU () const { return mUnit.Comp().Desc().IsOffline(); }
void CalculateRemainderSamples (Float64 inSampleRate);
-
+
OSStatus DoInitialisation (const CAStreamBasicDescription &inInputFormat,
const CAStreamBasicDescription &inOutputFormat,
UInt64 inNumInputSamples,
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h b/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h
index c9a611b..ae3efd7 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h
@@ -2,14 +2,14 @@
File: CAAtomic.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,17 +40,17 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
/*
This file implements all Atomic operations using Interlocked functions specified in
Winbase.h
NOTE: According to Microsoft documentation, all Interlocked functions generates a
-full barrier.
+full barrier.
On Windows:
- As the Interlocked functions returns the Old value, Extra checks and operations
+ As the Interlocked functions returns the Old value, Extra checks and operations
are made after the atomic operation to return value consistent with OSX counterparts.
*/
#ifndef __CAAtomic_h__
@@ -66,7 +66,7 @@ full barrier.
#include <libkern/OSAtomic.h>
#endif
-inline void CAMemoryBarrier()
+inline void CAMemoryBarrier()
{
#if TARGET_OS_WIN32
MemoryBarrier();
@@ -80,7 +80,7 @@ inline SInt32 CAAtomicAdd32Barrier(SInt32 theAmt, volatile SInt32* theValue)
#if TARGET_OS_WIN32
long lRetVal = InterlockedExchangeAdd((volatile long*)theValue, theAmt);
// InterlockedExchangeAdd returns the original value which differs from OSX version.
- // At this point the addition would have occured and hence returning the new value
+ // At this point the addition would have occurred and hence returning the new value
// to keep it sync with OSX.
return lRetVal + theAmt;
#else
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h b/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h
index 8d40fc5..6277865 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h
@@ -2,14 +2,14 @@
File: CAAtomicStack.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAtomicStack_h__
#define __CAAtomicStack_h__
@@ -63,14 +63,14 @@ template <class T>
class TAtomicStack {
public:
TAtomicStack() : mHead(NULL) { }
-
+
// non-atomic routines, for use when initializing/deinitializing, operate NON-atomically
void push_NA(T *item)
{
item->next() = mHead;
mHead = item;
}
-
+
T * pop_NA()
{
T *result = mHead;
@@ -78,11 +78,11 @@ public:
mHead = result->next();
return result;
}
-
+
bool empty() const { return mHead == NULL; }
-
+
T * head() { return mHead; }
-
+
// atomic routines
void push_atomic(T *item)
{
@@ -92,7 +92,7 @@ public:
item->next() = head_;
} while (!compare_and_swap(head_, item, &mHead));
}
-
+
void push_multiple_atomic(T *item)
// pushes entire linked list headed by item
{
@@ -107,7 +107,7 @@ public:
tail->next() = head_;
} while (!compare_and_swap(head_, item, &mHead));
}
-
+
T * pop_atomic_single_reader()
// this may only be used when only one thread may potentially pop from the stack.
// if multiple threads may pop, this suffers from the ABA problem.
@@ -120,7 +120,7 @@ public:
} while (!compare_and_swap(result, result->next(), &mHead));
return result;
}
-
+
T * pop_atomic()
// This is inefficient for large linked lists.
// prefer pop_all() to a series of calls to pop_atomic.
@@ -135,7 +135,7 @@ public:
}
return result;
}
-
+
T * pop_all()
{
T *result;
@@ -145,7 +145,7 @@ public:
} while (!compare_and_swap(result, NULL, &mHead));
return result;
}
-
+
T* pop_all_reversed()
{
TAtomicStack<T> reversed;
@@ -157,7 +157,7 @@ public:
}
return reversed.mHead;
}
-
+
static bool compare_and_swap(T *oldvalue, T *newvalue, T **pvalue)
{
#if TARGET_OS_MAC
@@ -173,7 +173,7 @@ public:
return CAAtomicCompareAndSwap32Barrier(SInt32(oldvalue), SInt32(newvalue), (SInt32*)pvalue);
#endif
}
-
+
protected:
T * mHead;
};
@@ -194,7 +194,7 @@ public:
void * pop_atomic() { return OSAtomicDequeue(&mHead, mNextPtrOffset); }
void * pop_atomic_single_reader() { return pop_atomic(); }
void * pop_NA() { return pop_atomic(); }
-
+
private:
OSQueueHead mHead;
size_t mNextPtrOffset;
@@ -221,10 +221,10 @@ public:
T * pop_atomic() { return (T *)OSAtomicDequeue(&mHead, mNextPtrOffset); }
T * pop_atomic_single_reader() { return pop_atomic(); }
T * pop_NA() { return pop_atomic(); }
-
+
// caution: do not try to implement pop_all_reversed here. the writer could add new elements
// while the reader is trying to pop old ones!
-
+
private:
OSQueueHead mHead;
ssize_t mNextPtrOffset;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp
index d3644ed..3e73459 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp
@@ -2,14 +2,14 @@
File: CAAudioBufferList.cpp
Abstract: CAAudioBufferList.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -84,12 +84,12 @@ UInt32 CAAudioBufferList::CalculateByteSize(UInt32 inNumberBuffers)
UInt32 CAAudioBufferList::GetTotalNumberChannels(const AudioBufferList& inBufferList)
{
UInt32 theAnswer = 0;
-
+
for(UInt32 theIndex = 0; theIndex < inBufferList.mNumberBuffers; ++theIndex)
{
theAnswer += inBufferList.mBuffers[theIndex].mNumberChannels;
}
-
+
return theAnswer;
}
@@ -97,20 +97,20 @@ bool CAAudioBufferList::GetBufferForChannel(const AudioBufferList& inBufferList,
{
bool theAnswer = false;
UInt32 theIndex = 0;
-
+
while((theIndex < inBufferList.mNumberBuffers) && (inChannel >= inBufferList.mBuffers[theIndex].mNumberChannels))
{
inChannel -= inBufferList.mBuffers[theIndex].mNumberChannels;
++theIndex;
}
-
+
if(theIndex < inBufferList.mNumberBuffers)
{
outBufferNumber = theIndex;
outBufferChannel = inChannel;
theAnswer = true;
}
-
+
return theAnswer;
}
@@ -136,7 +136,7 @@ void CAAudioBufferList::Copy(const AudioBufferList& inSource, UInt32 inStartingS
UInt32 theNumberInputChannels = GetTotalNumberChannels(inSource);
UInt32 theOutputChannel = inStartingDestinationChannel;
UInt32 theNumberOutputChannels = GetTotalNumberChannels(outDestination);
-
+
UInt32 theInputBufferIndex = 0;
UInt32 theInputBufferChannel = 0;
UInt32 theOutputBufferIndex = 0;
@@ -144,11 +144,11 @@ void CAAudioBufferList::Copy(const AudioBufferList& inSource, UInt32 inStartingS
while((theInputChannel < theNumberInputChannels) && (theOutputChannel < theNumberOutputChannels))
{
GetBufferForChannel(inSource, theInputChannel, theInputBufferIndex, theInputBufferChannel);
-
+
GetBufferForChannel(inSource, theOutputChannel, theOutputBufferIndex, theOutputBufferChannel);
-
+
CopyChannel(inSource.mBuffers[theInputBufferIndex], theInputBufferChannel, outDestination.mBuffers[theOutputBufferIndex], theOutputBufferChannel);
-
+
++theInputChannel;
++theOutputChannel;
}
@@ -160,13 +160,13 @@ void CAAudioBufferList::CopyChannel(const AudioBuffer& inSource, UInt32 inSource
UInt32 theNumberFramesToCopy = outDestination.mDataByteSize / (outDestination.mNumberChannels * SizeOf32(Float32));
const Float32* theSource = static_cast<const Float32*>(inSource.mData);
Float32* theDestination = static_cast<Float32*>(outDestination.mData);
-
+
// loop through the data and copy the samples
while(theNumberFramesToCopy > 0)
{
// copy the data
theDestination[inDestinationChannel] = theSource[inSourceChannel];
-
+
// adjust the pointers
--theNumberFramesToCopy;
theSource += inSource.mNumberChannels;
@@ -218,7 +218,7 @@ bool CAAudioBufferList::HasData(AudioBufferList& inBufferList)
void CAAudioBufferList::PrintToLog(const AudioBufferList& inBufferList)
{
PrintInt(" Number streams: ", inBufferList.mNumberBuffers);
-
+
for(UInt32 theIndex = 0; theIndex < inBufferList.mNumberBuffers; ++theIndex)
{
PrintIndexedInt(" Channels in stream", theIndex + 1, inBufferList.mBuffers[theIndex].mNumberChannels);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h
index 70614f3..e28e723 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h
@@ -2,14 +2,14 @@
File: CAAudioBufferList.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAAudioBufferList_h__)
#define __CAAudioBufferList_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp
index 7475359..982dee1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp
@@ -2,14 +2,14 @@
File: CAAudioChannelLayout.cpp
Abstract: CAAudioChannelLayout.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -95,10 +95,10 @@ bool operator== (const AudioChannelLayout &x, const AudioChannelLayout &y)
// (this may be too strict a comparison if all you care about are matching layout tags)
UInt32 theSize1 = CAAudioChannelLayout::CalculateByteSize(x.mNumberChannelDescriptions);
UInt32 theSize2 = CAAudioChannelLayout::CalculateByteSize(y.mNumberChannelDescriptions);
-
+
if (theSize1 != theSize2)
return false;
-
+
return !memcmp (&x, &y, theSize1);
}
@@ -125,7 +125,7 @@ UInt32 CAAudioChannelLayout::NumberChannels (const AudioChannelLayout& inLayout)
{
if (inLayout.mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions)
return inLayout.mNumberChannelDescriptions;
-
+
if (inLayout.mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap)
return CountOnes (inLayout.mChannelBitmap);
@@ -134,7 +134,7 @@ UInt32 CAAudioChannelLayout::NumberChannels (const AudioChannelLayout& inLayout)
void CAShowAudioChannelLayout (FILE* file, const AudioChannelLayout *layout)
{
- if (layout == NULL)
+ if (layout == NULL)
{
fprintf (file, "\tNULL layout\n");
return;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h
index 4307054..9338429 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h
@@ -2,14 +2,14 @@
File: CAAudioChannelLayout.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAAudioChannelLayout_h__)
#define __CAAudioChannelLayout_h__
@@ -85,27 +85,27 @@ class CAAudioChannelLayout
public:
static AudioChannelLayout* Create(UInt32 inNumberChannelDescriptions);
static void Destroy(AudioChannelLayout* inChannelLayout);
- static UInt32 CalculateByteSize(UInt32 inNumberChannelDescriptions) {
+ static UInt32 CalculateByteSize(UInt32 inNumberChannelDescriptions) {
return SizeOf32(AudioChannelLayout) - SizeOf32(AudioChannelDescription) + (inNumberChannelDescriptions * SizeOf32(AudioChannelDescription));
}
static void SetAllToUnknown(AudioChannelLayout& outChannelLayout, UInt32 inNumberChannelDescriptions);
static UInt32 NumberChannels(const AudioChannelLayout& inLayout);
-
+
#if !HAL_Build
-// object methods
+// object methods
public:
CAAudioChannelLayout ();
CAAudioChannelLayout (UInt32 inNumberChannels, bool inChooseSurround);
// if inChooseSurround is false, then symmetrical speaker arrangements
// are chosen in place of surround layouts if there is a choice
- // This call chooses layouts based on the expected defaults in
+ // This call chooses layouts based on the expected defaults in
// AudioUnit usage
CAAudioChannelLayout (AudioChannelLayoutTag inTag);
CAAudioChannelLayout (const CAAudioChannelLayout &c);
CAAudioChannelLayout (const AudioChannelLayout* inChannelLayout);
~CAAudioChannelLayout();
-
+
CAAudioChannelLayout& operator= (const AudioChannelLayout* inChannelLayout);
CAAudioChannelLayout& operator= (const CAAudioChannelLayout& c);
bool operator== (const CAAudioChannelLayout &c) const;
@@ -115,38 +115,38 @@ public:
bool IsValid() const { return NumberChannels() > 0; }
UInt32 Size() const { return mLayout ? mLayout->Size() : 0; }
-
+
UInt32 NumberChannels() const { return mLayout ? mLayout->NumberChannels() : 0; }
-
+
AudioChannelLayoutTag Tag() const { return Layout().mChannelLayoutTag; }
const AudioChannelLayout& Layout() const { return mLayout->Layout(); }
operator const AudioChannelLayout *() const { return &Layout(); }
-
+
void Print () const { Print (stdout); }
void Print (FILE* file) const;
OSStatus Save (CFPropertyListRef *outData) const;
OSStatus Restore (CFPropertyListRef &inData);
-
+
private:
class RefCountedLayout : public CAReferenceCounted {
void * operator new(size_t /* size */, size_t aclSize)
{
return CA_malloc(sizeof(RefCountedLayout) - sizeof(AudioChannelLayout) + aclSize);
}
-
+
void operator delete(void *mem)
{
free(mem);
}
-
-
+
+
RefCountedLayout(UInt32 inDataSize) :
mByteSize(inDataSize)
- {
+ {
memset(&mACL, 0, inDataSize);
}
-
+
public:
static RefCountedLayout *CreateWithNumberChannelDescriptions(unsigned nChannels) {
size_t size = CAAudioChannelLayout::CalculateByteSize(nChannels);
@@ -164,33 +164,33 @@ private:
acl->mACL.mChannelLayoutTag = layoutTag;
return acl;
}
-
+
const AudioChannelLayout & Layout() const { return mACL; }
-
+
UInt32 Size () const { return mByteSize; }
-
+
UInt32 NumberChannels() { return CAAudioChannelLayout::NumberChannels(Layout()); }
-
+
private:
const UInt32 mByteSize;
AudioChannelLayout mACL;
// * * * mACL is variable length and thus must be last * * *
-
+
// only the constructors can change the actual state of the layout
friend CAAudioChannelLayout::CAAudioChannelLayout (UInt32 inNumberChannels, bool inChooseSurround);
friend OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData);
friend CAAudioChannelLayout& CAAudioChannelLayout::operator= (const AudioChannelLayout* inChannelLayout);
friend void CAAudioChannelLayout::SetWithTag(AudioChannelLayoutTag inTag);
-
+
AudioChannelLayout * GetLayout() { return &mACL; }
-
+
private:
// prohibited methods: private and unimplemented.
RefCountedLayout();
RefCountedLayout(const RefCountedLayout& c);
RefCountedLayout& operator=(const RefCountedLayout& c);
};
-
+
RefCountedLayout *mLayout;
#endif // HAL_Build
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp
index 009d4b3..50687e9 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp
@@ -2,14 +2,14 @@
File: CAAudioChannelLayoutObject.cpp
Abstract: CAAudioChannelLayoutObject.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAAudioChannelLayout.h"
#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
@@ -60,11 +60,11 @@ CAAudioChannelLayout::CAAudioChannelLayout ()
// CAAudioChannelLayout::CAAudioChannelLayout
//=============================================================================
CAAudioChannelLayout::CAAudioChannelLayout (UInt32 inNumberChannels, bool inChooseSurround)
-{
+{
// this chooses default layouts based on the number of channels...
AudioChannelLayoutTag tag;
-
- switch (inNumberChannels)
+
+ switch (inNumberChannels)
{
default:
// here we have a "broken" layout, in the sense that we haven't any idea how to lay this out
@@ -93,7 +93,7 @@ CAAudioChannelLayout::CAAudioChannelLayout (UInt32 inNumberChannels, bool inChoo
tag = kAudioChannelLayoutTag_AudioUnit_8;
break;
}
-
+
mLayout = RefCountedLayout::CreateWithLayoutTag(tag);
}
@@ -144,11 +144,11 @@ CAAudioChannelLayout& CAAudioChannelLayout::operator= (const CAAudioChannelLayou
if (mLayout != c.mLayout) {
if (mLayout)
mLayout->release();
-
+
if ((mLayout = c.mLayout) != NULL)
mLayout->retain();
}
-
+
return *this;
}
@@ -156,11 +156,11 @@ CAAudioChannelLayout& CAAudioChannelLayout::operator= (const AudioChannelLayout*
{
if (mLayout && &mLayout->Layout() == inChannelLayout)
return *this;
-
+
if (mLayout)
mLayout->release();
- if (inChannelLayout == NULL)
+ if (inChannelLayout == NULL)
{
mLayout = RefCountedLayout::CreateWithNumberChannelDescriptions(0);
}
@@ -175,7 +175,7 @@ void CAAudioChannelLayout::SetWithTag(AudioChannelLayoutTag inTag)
{
if (mLayout)
mLayout->release();
-
+
mLayout = RefCountedLayout::CreateWithLayoutTag(inTag);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp
index ce2efea..fce21ec 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp
@@ -2,14 +2,14 @@
File: CAAudioFileFormats.cpp
Abstract: CAAudioFileFormats.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAAudioFileFormats.h"
#include <algorithm>
@@ -62,26 +62,26 @@ class CompareFileFormatNames {
public:
bool operator() (const CAAudioFileFormats::FileFormatInfo &a, const CAAudioFileFormats::FileFormatInfo &b)
{
- return CFStringCompare(a.mFileTypeName, b.mFileTypeName,
+ return CFStringCompare(a.mFileTypeName, b.mFileTypeName,
kCFCompareCaseInsensitive | kCFCompareLocalized) == kCFCompareLessThan;
}
};*/
static int CompareFileFormatNames(const void *va, const void *vb)
{
- CAAudioFileFormats::FileFormatInfo *a = (CAAudioFileFormats::FileFormatInfo *)va,
+ CAAudioFileFormats::FileFormatInfo *a = (CAAudioFileFormats::FileFormatInfo *)va,
*b = (CAAudioFileFormats::FileFormatInfo *)vb;
- return CFStringCompare(a->mFileTypeName, b->mFileTypeName,
+ return CFStringCompare(a->mFileTypeName, b->mFileTypeName,
kCFCompareCaseInsensitive | kCFCompareLocalized);
}
-CAAudioFileFormats::CAAudioFileFormats(bool loadDataFormats) :
+CAAudioFileFormats::CAAudioFileFormats(bool loadDataFormats) :
mNumFileFormats(0), mFileFormats(NULL)
{
OSStatus err;
UInt32 size;
UInt32 *fileTypes = NULL;
-
+
// get all file types
err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size);
if (err != noErr) goto bail;
@@ -90,32 +90,32 @@ CAAudioFileFormats::CAAudioFileFormats(bool loadDataFormats) :
fileTypes = new UInt32[mNumFileFormats];
err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size, fileTypes);
if (err != noErr) goto bail;
-
+
// get info for each file type
for (int i = 0; i < mNumFileFormats; ++i) {
FileFormatInfo *ffi = &mFileFormats[i];
OSType filetype = fileTypes[i];
ffi->mFileTypeID = filetype;
-
+
// file type name
ffi->mFileTypeName = NULL;
size = sizeof(CFStringRef);
err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_FileTypeName, sizeof(UInt32), &filetype, &size, &ffi->mFileTypeName);
if (err == noErr && ffi->mFileTypeName)
CFRetain(ffi->mFileTypeName);
-
+
// file extensions
size = sizeof(CFArrayRef);
err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ExtensionsForType,
sizeof(OSType), &filetype, &size, &ffi->mExtensions);
if (err)
ffi->mExtensions = NULL;
-
+
// file data formats
ffi->mNumDataFormats = 0;
ffi->mDataFormats = NULL;
-
+
if (loadDataFormats)
ffi->LoadDataFormats();
}
@@ -129,7 +129,7 @@ bail:
void CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
{
if (mDataFormats != NULL) return;
-
+
UInt32 *writableFormats = NULL, *readableFormats = NULL;
int nWritableFormats, nReadableFormats;
// get all writable formats
@@ -140,7 +140,7 @@ void CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
writableFormats = new UInt32[nWritableFormats];
err = AudioFormatGetProperty(kAudioFormatProperty_EncodeFormatIDs, 0, NULL, &size, writableFormats);
if (err != noErr) goto bail;
-
+
// get all readable formats
err = AudioFormatGetPropertyInfo(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size);
if (err != noErr) goto bail;
@@ -148,7 +148,7 @@ void CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
readableFormats = new UInt32[nReadableFormats];
err = AudioFormatGetProperty(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size, readableFormats);
if (err != noErr) goto bail;
-
+
err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableFormatIDs, sizeof(UInt32), &mFileTypeID, &size);
if (err == noErr) {
mNumDataFormats = size / sizeof(OSType);
@@ -174,7 +174,7 @@ void CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
dfi->mWritable = true;
break;
}
-
+
dfi->mNumVariants = 0;
AudioFileTypeAndFormatID tf = { mFileTypeID, dfi->mFormatID };
err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat,
@@ -200,7 +200,7 @@ void CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
}
}
}
-
+
dfi->mEitherEndianPCM = (anyBigEndian && anyLittleEndian);
}
}
@@ -280,7 +280,7 @@ bool CAAudioFileFormats::InferFileFormatFromFilename(const char *filename, Audio
return result;
}
-bool CAAudioFileFormats::InferFileFormatFromDataFormat(const CAStreamBasicDescription &fmt,
+bool CAAudioFileFormats::InferFileFormatFromDataFormat(const CAStreamBasicDescription &fmt,
AudioFileTypeID &filetype)
{
// if there's exactly one file format that supports this data format
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h
index 3d2f90f..1f99711 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h
@@ -2,14 +2,14 @@
File: CAAudioFileFormats.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAudioFileFormats_h__
#define __CAAudioFileFormats_h__
@@ -61,7 +61,7 @@ public:
struct DataFormatInfo {
DataFormatInfo() : mVariants(NULL) { }
~DataFormatInfo() { delete[] mVariants; }
-
+
UInt32 mFormatID;
int mNumVariants;
AudioStreamBasicDescription * mVariants;
@@ -73,7 +73,7 @@ public:
void DebugPrint();
#endif
};
-
+
struct FileFormatInfo {
FileFormatInfo() : mFileTypeName(NULL), mExtensions(NULL), mDataFormats(NULL) { }
~FileFormatInfo() {
@@ -83,13 +83,13 @@ public:
if (mExtensions)
CFRelease(mExtensions);
}
-
+
AudioFileTypeID mFileTypeID;
CFStringRef mFileTypeName;
CFArrayRef mExtensions;
int mNumDataFormats;
DataFormatInfo * mDataFormats; // NULL until loaded!
-
+
int NumberOfExtensions() { return static_cast<int>(mExtensions ? CFArrayGetCount(mExtensions) : 0); }
char * GetExtension(int index, char *buf, int buflen) {
CFStringRef cfext = (CFStringRef)CFArrayGetValueAtIndex(mExtensions, index);
@@ -107,19 +107,19 @@ public:
}
bool AnyWritableFormats();
void LoadDataFormats();
-
+
#if DEBUG
void DebugPrint();
#endif
};
-
+
private: // use Instance()
CAAudioFileFormats(bool loadDataFormats);
~CAAudioFileFormats();
public:
-
+
bool InferDataFormatFromFileFormat(AudioFileTypeID filetype, CAStreamBasicDescription &fmt);
-
+
bool InferFileFormatFromFilename(const char *filename, AudioFileTypeID &filetype);
bool InferFileFormatFromFilename(CFStringRef filename, AudioFileTypeID &filetype);
@@ -127,19 +127,19 @@ public:
bool InferFileFormatFromDataFormat(const CAStreamBasicDescription &fmt, AudioFileTypeID &filetype);
bool IsKnownDataFormat(UInt32 dataFormat);
-
+
#if DEBUG
void DebugPrint();
#endif
int mNumFileFormats;
FileFormatInfo * mFileFormats;
-
+
FileFormatInfo * FindFileFormat(UInt32 formatID);
static CAAudioFileFormats * Instance(bool loadDataFormats=true);
-private:
+private:
static CAAudioFileFormats * sInstance;
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp
index 0200ec9..48e5ff4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp
@@ -2,14 +2,14 @@
File: CAAudioTimeStamp.cpp
Abstract: CAAudioTimeStamp.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -60,7 +60,7 @@ bool operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
{
bool isLessThan = false;
bool isDone = false;
-
+
// check the sample time
if(!isDone)
{
@@ -70,7 +70,7 @@ bool operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
isDone = true;
}
}
-
+
// check the host time
if(!isDone)
{
@@ -80,7 +80,7 @@ bool operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
isDone = true;
}
}
-
+
// check the word clock time
if(!isDone)
{
@@ -91,7 +91,7 @@ bool operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
//isDone = true;
}
}
-
+
return isLessThan;
}
@@ -99,7 +99,7 @@ bool operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
{
bool isEqual = false;
bool isDone = false;
-
+
// check the sample time
if(!isDone)
{
@@ -109,7 +109,7 @@ bool operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
isDone = true;
}
}
-
+
// check the host time
if(!isDone)
{
@@ -119,7 +119,7 @@ bool operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
isDone = true;
}
}
-
+
// check the word clock time
if(!isDone)
{
@@ -130,6 +130,6 @@ bool operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
//isDone = true;
}
}
-
+
return isEqual;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h
index 9b8d6ab..e7d3b11 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h
@@ -2,14 +2,14 @@
File: CAAudioTimeStamp.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAAudioTimeStamp_h__)
#define __CAAudioTimeStamp_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp
index 53da5a1..cfa0297 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp
@@ -2,14 +2,14 @@
File: CAAudioUnit.cpp
Abstract: CAAudioUnit.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAAudioUnit.h"
@@ -62,7 +62,7 @@
struct StackAUChannelInfo {
StackAUChannelInfo (UInt32 inSize) : mChanInfo ((AUChannelInfo*)malloc (inSize)) {}
~StackAUChannelInfo() { free (mChanInfo); }
-
+
AUChannelInfo* mChanInfo;
};
@@ -81,21 +81,21 @@ class CAAudioUnit::AUState : public CAReferenceCounted {
public:
AUState (AudioComponent inComp)
: mUnit(0), mNode (0)
- {
- OSStatus result = ::AudioComponentInstanceNew (inComp, &mUnit);
+ {
+ OSStatus result = ::AudioComponentInstanceNew (inComp, &mUnit);
if (result)
throw result;
Init();
}
AUState (const AUNode &inNode, const AudioUnit& inUnit)
- : mUnit (inUnit), mNode (inNode)
+ : mUnit (inUnit), mNode (inNode)
{
Init();
}
-
+
~AUState();
-
+
AudioUnit mUnit;
AUNode mNode;
@@ -105,7 +105,7 @@ public:
#if CA_AU_USE_FAST_DISPATCH
if (mGetParamProc != NULL) {
return (mGetParamProc) (mConnInstanceStorage, inID, scope, element, &outValue);
- }
+ }
#endif
return AudioUnitGetParameter(mUnit, inID, scope, element, &outValue);
}
@@ -116,11 +116,11 @@ public:
#if CA_AU_USE_FAST_DISPATCH
if (mSetParamProc != NULL) {
return (mSetParamProc) (mConnInstanceStorage, inID, scope, element, value, bufferOffsetFrames);
- }
+ }
#endif
return AudioUnitSetParameter(mUnit, inID, scope, element, value, bufferOffsetFrames);
}
-
+
OSStatus Render (AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inOutputBusNumber,
@@ -130,11 +130,11 @@ public:
#if CA_AU_USE_FAST_DISPATCH
if (mRenderProc != NULL) {
return (mRenderProc) (mConnInstanceStorage, ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData);
- }
+ }
#endif
return AudioUnitRender(mUnit, ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData);
}
-
+
OSStatus MIDIEvent (UInt32 inStatus,
UInt32 inData1,
UInt32 inData2,
@@ -187,7 +187,7 @@ public:
private:
// get the fast dispatch pointers
- void Init()
+ void Init()
{
#if CA_AU_USE_FAST_DISPATCH
UInt32 size = sizeof(AudioUnitRenderProc);
@@ -195,13 +195,13 @@ private:
kAudioUnitScope_Global, kAudioUnitRenderSelect,
&mRenderProc, &size) != noErr)
mRenderProc = NULL;
-
+
size = sizeof(AudioUnitGetParameterProc);
if (AudioUnitGetProperty(mUnit, kAudioUnitProperty_FastDispatch,
kAudioUnitScope_Global, kAudioUnitGetParameterSelect,
&mGetParamProc, &size) != noErr)
mGetParamProc = NULL;
-
+
size = sizeof(AudioUnitSetParameterProc);
if (AudioUnitGetProperty(mUnit, kAudioUnitProperty_FastDispatch,
kAudioUnitScope_Global, kAudioUnitSetParameterSelect,
@@ -225,7 +225,7 @@ private:
kAudioUnitScope_Global, kMusicDeviceStopNoteSelect,
&mStopNoteProc, &size) != noErr)
mStopNoteProc = NULL;
-
+
if (mRenderProc || mGetParamProc || mSetParamProc || mMIDIEventProc || mStartNoteProc || mStopNoteProc) {
mConnInstanceStorage = LoadGetComponentInstanceStorage ( mUnit );
} else
@@ -234,10 +234,10 @@ private:
mConnInstanceStorage = NULL;
#endif
}
-
+
#if CA_AU_USE_FAST_DISPATCH
AudioUnitRenderProc mRenderProc;
- AudioUnitGetParameterProc mGetParamProc;
+ AudioUnitGetParameterProc mGetParamProc;
AudioUnitSetParameterProc mSetParamProc;
MusicDeviceMIDIEventProc mMIDIEventProc;
MusicDeviceStartNoteProc mStartNoteProc;
@@ -251,9 +251,9 @@ private:
AUState () {}
AUState (const AUState&);
AUState& operator= (const AUState&);
-};
-
-
+};
+
+
CAAudioUnit::AUState::~AUState ()
{
if (mUnit && (mNode == 0)) {
@@ -266,7 +266,7 @@ CAAudioUnit::AUState::~AUState ()
OSStatus CAAudioUnit::Open (const CAComponent& inComp, CAAudioUnit &outUnit)
{
try {
- outUnit = inComp;
+ outUnit = inComp;
return noErr;
} catch (OSStatus res) {
return res;
@@ -286,7 +286,7 @@ CAAudioUnit::CAAudioUnit (const CAComponent& inComp)
}
CAAudioUnit::CAAudioUnit (const AUNode &inNode, const AudioUnit& inUnit)
- : mComp (inUnit), mDataPtr(new AUState (inNode, inUnit))
+ : mComp (inUnit), mDataPtr(new AUState (inNode, inUnit))
{
}
@@ -308,13 +308,13 @@ CAAudioUnit& CAAudioUnit::operator= (const CAAudioUnit &a)
if (mDataPtr != a.mDataPtr) {
if (mDataPtr)
mDataPtr->release();
-
+
if ((mDataPtr = a.mDataPtr) != NULL)
mDataPtr->retain();
-
+
mComp = a.mComp;
}
-
+
return *this;
}
@@ -338,36 +338,36 @@ OSStatus CAAudioUnit::RemovePropertyListener (AudioUnitPropertyID inID,
{
// we call this first. If it fails we call the old API as the failure can
// mean that the AU doesn't implement that selector.
- OSStatus result = AudioUnitRemovePropertyListenerWithUserData(AU(), inID,
+ OSStatus result = AudioUnitRemovePropertyListenerWithUserData(AU(), inID,
inProc, inProcUserData);
#if !__LP64__ && !TARGET_OS_IPHONE
if (result) result = AudioUnitRemovePropertyListener (AU(), inID, inProc);
- #endif
+ #endif
return result;
-}
+}
-#pragma mark __State Management
+#pragma mark __State Management
-bool CAAudioUnit::IsValid () const
-{
- return mDataPtr ? mDataPtr->mUnit != 0 : false;
+bool CAAudioUnit::IsValid () const
+{
+ return mDataPtr ? mDataPtr->mUnit != 0 : false;
}
-
-AudioUnit CAAudioUnit::AU() const
-{
- return mDataPtr ? mDataPtr->mUnit : 0;
+
+AudioUnit CAAudioUnit::AU() const
+{
+ return mDataPtr ? mDataPtr->mUnit : 0;
}
AUNode CAAudioUnit::GetAUNode () const
{
- return mDataPtr ? mDataPtr->mNode : 0;
+ return mDataPtr ? mDataPtr->mNode : 0;
}
#pragma mark __Format Handling
-
-bool CAAudioUnit::CanDo ( int inChannelsIn,
+
+bool CAAudioUnit::CanDo ( int inChannelsIn,
int inChannelsOut) const
-{
+{
// this is the default assumption of an audio effect unit
Boolean* isWritable = 0;
UInt32 dataSize = 0;
@@ -376,31 +376,31 @@ bool CAAudioUnit::CanDo ( int inChannelsIn,
kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
&dataSize, isWritable); //don't care if this is writable
-
+
// if this property is NOT implemented an FX unit
// is expected to deal with same channel valance in and out
- if (result)
+ if (result)
{
if ((Comp().Desc().IsEffect() && inChannelsIn == inChannelsOut)
|| (Comp().Desc().IsOffline() && inChannelsIn == inChannelsOut))
{
return true;
}
- else
+ else
{
// the au should either really tell us about this
// or we will assume the worst
return false;
}
}
-
+
StackAUChannelInfo info (dataSize);
-
+
result = GetProperty (kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
info.mChanInfo, &dataSize);
if (result) { return false; }
-
+
return ValidateChannelPair (inChannelsIn, inChannelsOut, info.mChanInfo, (dataSize / sizeof (AUChannelInfo)));
}
@@ -414,10 +414,10 @@ int CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
&dataSize, isWritable); //don't care if this is writable
-
+
// if this property is NOT implemented an FX unit
// is expected to deal with same channel valance in and out
-
+
if (result)
{
if (Comp().Desc().IsEffect())
@@ -430,16 +430,16 @@ int CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
// (eg. Kick, Snare,.. on a Drummachine)
// eventually the Bus-Name for each configuration should be exposed
// for the User to select..
-
+
UInt32 elCountIn, elCountOut;
-
+
if (GetElementCount (kAudioUnitScope_Input, elCountIn)) return -1;
if (GetElementCount (kAudioUnitScope_Output, elCountOut)) return -1;
-
+
cnt = std::max(elCountIn, elCountOut);
-
+
*chaninfo = (AUChannelInfo*) malloc (sizeof (AUChannelInfo) * cnt);
-
+
for (unsigned int i = 0; i < elCountIn; ++i) {
UInt32 numChans;
if (NumberChannels (kAudioUnitScope_Input, i, numChans)) return -1;
@@ -448,7 +448,7 @@ int CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
for (unsigned int i = elCountIn; i < cnt; ++i) {
(*chaninfo)[i].inChannels = 0;
}
-
+
for (unsigned int i = 0; i < elCountOut; ++i) {
UInt32 numChans;
if (NumberChannels (kAudioUnitScope_Output, i, numChans)) return -1;
@@ -459,26 +459,26 @@ int CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
}
return 0;
}
- else
+ else
{
// the au should either really tell us about this
// or we will assume the worst
return -1;
}
}
-
+
*chaninfo = (AUChannelInfo*) malloc (dataSize);
cnt = dataSize / sizeof (AUChannelInfo);
-
+
result = GetProperty (kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
*chaninfo, &dataSize);
-
+
if (result) { return -1; }
return 0;
}
-bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
+bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
int inChannelsOut,
const AUChannelInfo * info,
UInt32 numChanInfo) const
@@ -490,8 +490,8 @@ bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
-1 wild card:
-1,-1 any num channels as long as same channels on in and out
-1,-2 any num channels channels on in and out - special meaning
--2+ indicates total num channs AU can handle
- - elements configurable to any num channels,
+-2+ indicates total num channs AU can handle
+ - elements configurable to any num channels,
- element count in scope must be writable
*/
@@ -510,7 +510,7 @@ bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
return true; // if one of these is zero, then a -1 means any
}
else if ((info[i].inChannels == -1 && info[i].outChannels == -2)
- || (info[i].inChannels == -2 && info[i].outChannels == -1))
+ || (info[i].inChannels == -2 && info[i].outChannels == -1))
{
return true;
}
@@ -522,22 +522,22 @@ bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
IsElementCountWritable (kAudioUnitScope_Input, inWrite);
if (inWrite && outWrite) {
if ((inChannelsOut <= abs(info[i].outChannels))
- && (inChannelsIn <= abs(info[i].inChannels)))
+ && (inChannelsIn <= abs(info[i].inChannels)))
{
return true;
}
}
}
}
-
+
// special meaning on input, specific num on output
else if (info[i].inChannels < 0) {
- if (info[i].outChannels == inChannelsOut)
+ if (info[i].outChannels == inChannelsOut)
{
// can do any in channels
if (info[i].inChannels == -1) {
return true;
- }
+ }
// total chans on input
else {
bool inWrite = false;
@@ -548,15 +548,15 @@ bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
}
}
}
-
+
// special meaning on output, specific num on input
else if (info[i].outChannels < 0) {
- if (info[i].inChannels == inChannelsIn)
+ if (info[i].inChannels == inChannelsIn)
{
// can do any out channels
if (info[i].outChannels == -1) {
return true;
- }
+ }
// total chans on output
else {
bool outWrite = false;
@@ -571,9 +571,9 @@ bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
// both chans in struct >= 0 - thus has to explicitly match
else if ((info[i].inChannels == inChannelsIn) && (info[i].outChannels == inChannelsOut)) {
return true;
- }
-
- // now check to see if a wild card on the args (inChannelsIn or inChannelsOut chans is zero) is found
+ }
+
+ // now check to see if a wild card on the args (inChannelsIn or inChannelsOut chans is zero) is found
// tells us to match just one side of the scopes
else if (inChannelsIn == 0) {
if (info[i].outChannels == inChannelsOut) {
@@ -586,7 +586,7 @@ bool CAAudioUnit::ValidateChannelPair (int inChannelsIn,
}
}
}
-
+
return false;
}
@@ -599,9 +599,9 @@ bool CheckDynCount (SInt32 inTotalChans, const CAAUChanHelper &inHelper)
return (totalChans <= inTotalChans);
}
-bool CAAudioUnit::CheckOneSide (const CAAUChanHelper &inHelper,
- bool checkOutput,
- const AUChannelInfo *info,
+bool CAAudioUnit::CheckOneSide (const CAAUChanHelper &inHelper,
+ bool checkOutput,
+ const AUChannelInfo *info,
UInt32 numInfo) const
{
// now we can use the wildcard option (see above impl) to see if this matches
@@ -624,25 +624,25 @@ bool CAAudioUnit::CheckOneSide (const CAAUChanHelper &inHelper,
return true;
}
-bool CAAudioUnit::CanDo (const CAAUChanHelper &inputs,
+bool CAAudioUnit::CanDo (const CAAUChanHelper &inputs,
const CAAUChanHelper &outputs) const
{
// first check our state
// huh!
if (inputs.mNumEls == 0 && outputs.mNumEls == 0) return false;
-
+
UInt32 elCount;
if (GetElementCount (kAudioUnitScope_Input, elCount)) { return false; }
if (elCount != inputs.mNumEls) return false;
if (GetElementCount (kAudioUnitScope_Output, elCount)) { return false; }
if (elCount != outputs.mNumEls) return false;
-
+
// (1) special cases (effects and sources (generators and instruments) only)
UInt32 dataSize = 0;
if (GetPropertyInfo (kAudioUnitProperty_SupportedNumChannels,
- kAudioUnitScope_Global, 0, &dataSize, NULL) != noErr)
+ kAudioUnitScope_Global, 0, &dataSize, NULL) != noErr)
{
if (Comp().Desc().IsEffect() || Comp().Desc().IsOffline()) {
UInt32 numChan = outputs.mNumEls > 0 ? outputs.mChans[0] : inputs.mChans[0];
@@ -652,7 +652,7 @@ bool CAAudioUnit::CanDo (const CAAUChanHelper &inputs,
if (numChan != outputs.mChans[out]) return false;
return true;
}
-
+
// in this case, all the channels have to match the current config
if (Comp().Desc().IsGenerator() || Comp().Desc().IsMusicDevice()) {
for (unsigned int in = 0; in < inputs.mNumEls; ++in) {
@@ -667,22 +667,22 @@ bool CAAudioUnit::CanDo (const CAAUChanHelper &inputs,
}
return true;
}
-
+
// if we get here we can't determine anything about channel capabilities
return false;
}
StackAUChannelInfo info (dataSize);
-
+
if (GetProperty (kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
info.mChanInfo, &dataSize) != noErr)
- {
- return false;
+ {
+ return false;
}
-
+
int numInfo = dataSize / sizeof(AUChannelInfo);
-
+
// (2) Test for dynamic capability (or no elements on that scope)
SInt32 dynInChans = 0;
if (ValidateDynamicScope (kAudioUnitScope_Input, dynInChans, info.mChanInfo, numInfo)) {
@@ -706,7 +706,7 @@ bool CAAudioUnit::CanDo (const CAAUChanHelper &inputs,
}
// (4) - not a dynamic AU, has ins and outs, and has channel constraints so we test every possible pairing
- for (unsigned int in = 0; in < inputs.mNumEls; ++in)
+ for (unsigned int in = 0; in < inputs.mNumEls; ++in)
{
bool testInAlready = false;
for (unsigned int i = 0; i < in; ++i) {
@@ -733,7 +733,7 @@ bool CAAudioUnit::CanDo (const CAAUChanHelper &inputs,
}
}
}
-
+
return true;
}
@@ -747,7 +747,7 @@ bool CAAudioUnit::SupportsNumChannels () const
kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
&dataSize, isWritable); //don't care if this is writable
-
+
// if this property is NOT implemented an FX unit
// is expected to deal with same channel valance in and out
if (result) {
@@ -761,7 +761,7 @@ OSStatus CAAudioUnit::GetChannelLayoutTags (AudioUnitScope inScope,
AudioUnitElement inEl,
ChannelTagVector &outChannelVector) const
{
- if (HasChannelLayouts (inScope, inEl) == false) return kAudioUnitErr_InvalidProperty;
+ if (HasChannelLayouts (inScope, inEl) == false) return kAudioUnitErr_InvalidProperty;
UInt32 dataSize;
OSStatus result = AudioUnitGetPropertyInfo (AU(),
@@ -770,7 +770,7 @@ OSStatus CAAudioUnit::GetChannelLayoutTags (AudioUnitScope inScope,
&dataSize, NULL);
if (result) return result;
-
+
// OK lets get our channel layouts and see if the one we want is present
AudioChannelLayoutTag* info = (AudioChannelLayoutTag*)malloc (dataSize);
result = AudioUnitGetProperty (AU(),
@@ -778,7 +778,7 @@ OSStatus CAAudioUnit::GetChannelLayoutTags (AudioUnitScope inScope,
inScope, inEl,
info, &dataSize);
if (result) goto home;
-
+
outChannelVector.erase (outChannelVector.begin(), outChannelVector.end());
for (unsigned int i = 0; i < (dataSize / sizeof (AudioChannelLayoutTag)); ++i)
outChannelVector.push_back (info[i]);
@@ -788,7 +788,7 @@ home:
return result;
}
-bool CAAudioUnit::HasChannelLayouts (AudioUnitScope inScope,
+bool CAAudioUnit::HasChannelLayouts (AudioUnitScope inScope,
AudioUnitElement inEl) const
{
OSStatus result = AudioUnitGetPropertyInfo (AU(),
@@ -798,17 +798,17 @@ bool CAAudioUnit::HasChannelLayouts (AudioUnitScope inScope,
return !result;
}
-bool CAAudioUnit::HasChannelLayout (AudioUnitScope inScope,
+bool CAAudioUnit::HasChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl) const
{
Boolean writable;
UInt32 size;
-
+
return AudioUnitGetPropertyInfo (AU(),
kAudioUnitProperty_AudioChannelLayout,
inScope, inEl,
&size, &writable) == noErr;
-}
+}
OSStatus CAAudioUnit::GetChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl,
@@ -818,14 +818,14 @@ OSStatus CAAudioUnit::GetChannelLayout (AudioUnitScope inScope,
OSStatus result = AudioUnitGetPropertyInfo (AU(), kAudioUnitProperty_AudioChannelLayout,
inScope, inEl, &size, NULL);
if (result) return result;
-
+
AudioChannelLayout *layout = (AudioChannelLayout*)malloc (size);
ca_require_noerr (result = AudioUnitGetProperty (AU(), kAudioUnitProperty_AudioChannelLayout,
inScope, inEl, layout, &size), home);
outLayout = CAAudioChannelLayout (layout);
-
+
home:
free (layout);
return result;
@@ -842,7 +842,7 @@ OSStatus CAAudioUnit::SetChannelLayout (AudioUnitScope inScope,
return result;
}
-OSStatus CAAudioUnit::SetChannelLayout (AudioUnitScope inScope,
+OSStatus CAAudioUnit::SetChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl,
const AudioChannelLayout &inLayout,
UInt32 inSize)
@@ -868,7 +868,7 @@ OSStatus CAAudioUnit::GetFormat (AudioUnitScope inScope,
{
UInt32 dataSize = sizeof (AudioStreamBasicDescription);
return AudioUnitGetProperty (AU(), kAudioUnitProperty_StreamFormat,
- inScope, inEl,
+ inScope, inEl,
&outFormat, &dataSize);
}
@@ -878,7 +878,7 @@ OSStatus CAAudioUnit::SetFormat (AudioUnitScope inScope,
{
return AudioUnitSetProperty (AU(), kAudioUnitProperty_StreamFormat,
inScope, inEl,
- const_cast<AudioStreamBasicDescription*>(&inFormat),
+ const_cast<AudioStreamBasicDescription*>(&inFormat),
sizeof (AudioStreamBasicDescription));
}
@@ -888,7 +888,7 @@ OSStatus CAAudioUnit::GetSampleRate (AudioUnitScope inScope,
{
UInt32 dataSize = sizeof (Float64);
return AudioUnitGetProperty (AU(), kAudioUnitProperty_SampleRate,
- inScope, inEl,
+ inScope, inEl,
&outRate, &dataSize);
}
@@ -906,7 +906,7 @@ OSStatus CAAudioUnit::SetSampleRate (AudioUnitScope inScope,
OSStatus CAAudioUnit::SetSampleRate (Float64 inSampleRate)
{
OSStatus result;
-
+
UInt32 elCount;
ca_require_noerr (result = GetElementCount(kAudioUnitScope_Input, elCount), home);
if (elCount) {
@@ -921,7 +921,7 @@ OSStatus CAAudioUnit::SetSampleRate (Float64 inSampleRate)
ca_require_noerr (result = SetSampleRate (kAudioUnitScope_Output, i, inSampleRate), home);
}
}
-
+
home:
return result;
}
@@ -958,7 +958,7 @@ OSStatus CAAudioUnit::IsElementCountWritable (AudioUnitScope inScope, bool &out
if (result)
return result;
outWritable = isWritable ? true : false;
- return noErr;
+ return noErr;
}
OSStatus CAAudioUnit::GetElementCount (AudioUnitScope inScope, UInt32 &outCount) const
@@ -981,12 +981,12 @@ bool CAAudioUnit::HasDynamicScope (AudioUnitScope inScope, SInt32 &outTotalNum
OSStatus result = GetPropertyInfo (kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
&dataSize, isWritable); //don't care if this is writable
-
+
// AU has to explicitly tell us about this.
if (result) return false;
StackAUChannelInfo info (dataSize);
-
+
result = GetProperty (kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global, 0,
info.mChanInfo, &dataSize);
@@ -1003,9 +1003,9 @@ bool CAAudioUnit::HasDynamicScope (AudioUnitScope inScope, SInt32 &outTotalNum
-N (where N is less than -2), signifies the total channel count on the scope side (in or out)
*/
-bool CAAudioUnit::ValidateDynamicScope (AudioUnitScope inScope,
- SInt32 &outTotalNumChannels,
- const AUChannelInfo *info,
+bool CAAudioUnit::ValidateDynamicScope (AudioUnitScope inScope,
+ SInt32 &outTotalNumChannels,
+ const AUChannelInfo *info,
UInt32 numInfo) const
{
bool writable = false;
@@ -1024,48 +1024,48 @@ bool CAAudioUnit::ValidateDynamicScope (AudioUnitScope inScope,
outTotalNumChannels = -1;
return true;
}
-
+
// ok lets now test our special case....
if (inScope == kAudioUnitScope_Input) {
// isn't dynamic on this side at least
if (info[i].inChannels >= 0)
continue;
-
+
if (info[i].inChannels < -2) {
outTotalNumChannels = abs (info[i].inChannels);
return true;
}
- }
-
+ }
+
else if (inScope == kAudioUnitScope_Output) {
// isn't dynamic on this side at least
if (info[i].outChannels >= 0)
continue;
-
+
if (info[i].outChannels < -2) {
outTotalNumChannels = abs (info[i].outChannels);
return true;
}
- }
-
+ }
+
else {
break; // wrong scope was specified
}
}
-
- return false;
+
+ return false;
}
-OSStatus CAAudioUnit::ConfigureDynamicScope (AudioUnitScope inScope,
- UInt32 inNumElements,
- UInt32 *inChannelsPerElement,
+OSStatus CAAudioUnit::ConfigureDynamicScope (AudioUnitScope inScope,
+ UInt32 inNumElements,
+ UInt32 *inChannelsPerElement,
Float64 inSampleRate)
{
SInt32 numChannels = 0;
bool isDyamic = HasDynamicScope (inScope, numChannels);
if (isDyamic == false)
return kAudioUnitErr_InvalidProperty;
-
+
//lets to a sanity check...
// if numChannels == -1, then it can do "any"...
if (numChannels > 0) {
@@ -1075,11 +1075,11 @@ OSStatus CAAudioUnit::ConfigureDynamicScope (AudioUnitScope inScope,
if (count > numChannels)
return kAudioUnitErr_InvalidPropertyValue;
}
-
+
OSStatus result = SetElementCount (inScope, inNumElements);
if (result)
return result;
-
+
for (unsigned int i = 0; i < inNumElements; ++i) {
CAStreamBasicDescription desc;
result = GetFormat (inScope, i, desc);
@@ -1115,7 +1115,7 @@ bool CAAudioUnit::GetBypass () const
}
OSStatus CAAudioUnit::SetBypass (bool inBypass) const
-{
+{
UInt32 bypass = inBypass ? 1 : 0;
return AudioUnitSetProperty (AU(), kAudioUnitProperty_BypassEffect,
kAudioUnitScope_Global, 0,
@@ -1134,7 +1134,7 @@ OSStatus CAAudioUnit::SetMaxFramesPerSlice (UInt32 inMaxFrames)
{
return AudioUnitSetProperty (AU(), kAudioUnitProperty_MaximumFramesPerSlice,
kAudioUnitScope_Global, 0,
- &inMaxFrames, sizeof (UInt32));
+ &inMaxFrames, sizeof (UInt32));
}
Float64 CAAudioUnit::Latency () const
@@ -1177,7 +1177,7 @@ OSStatus CAAudioUnit::GetPresentPreset (AUPreset &outData) const
kAudioUnitScope_Global, 0,
&outData, &dataSize);
#if !TARGET_OS_IPHONE
-#ifndef __LP64__
+#ifndef __LP64__
if (result == kAudioUnitErr_InvalidProperty) {
dataSize = sizeof(outData);
result = AudioUnitGetProperty (AU(), kAudioUnitProperty_CurrentPreset,
@@ -1194,7 +1194,7 @@ OSStatus CAAudioUnit::GetPresentPreset (AUPreset &outData) const
#endif
return result;
}
-
+
OSStatus CAAudioUnit::SetPresentPreset (AUPreset &inData)
{
OSStatus result = AudioUnitSetProperty (AU(), kAudioUnitProperty_PresentPreset,
@@ -1220,7 +1220,7 @@ bool CAAudioUnit::HasCustomView () const
#ifndef __LP64__
result = GetPropertyInfo(kAudioUnitProperty_GetUIComponentList,
kAudioUnitScope_Global, 0,
- &dataSize, NULL);
+ &dataSize, NULL);
#endif
if (result || !dataSize) {
dataSize = 0;
@@ -1263,7 +1263,7 @@ OSStatus CAAudioUnit::StartNote (MusicDeviceInstrumentID inInstrument,
UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams * inParams)
{
- return mDataPtr ? mDataPtr->StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, inParams)
+ return mDataPtr ? mDataPtr->StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, inParams)
: paramErr;
}
@@ -1287,10 +1287,10 @@ OSStatus CAAudioUnit::Render (AudioUnitRenderActionFlags * ioActionFlags,
}
extern "C" OSStatus
-AudioUnitProcess ( AudioUnit inUnit,
- AudioUnitRenderActionFlags * ioActionFlags,
- const AudioTimeStamp * inTimeStamp,
- UInt32 inNumberFrames,
+AudioUnitProcess ( AudioUnit inUnit,
+ AudioUnitRenderActionFlags * ioActionFlags,
+ const AudioTimeStamp * inTimeStamp,
+ UInt32 inNumberFrames,
AudioBufferList * ioData);
OSStatus CAAudioUnit::Process (AudioUnitRenderActionFlags & ioActionFlags,
@@ -1306,9 +1306,9 @@ OSStatus CAAudioUnit::Process (AudioUnitRenderActionFlags & ioActionFlags,
}
extern "C" OSStatus
-AudioUnitProcessMultiple ( AudioUnit inUnit,
- AudioUnitRenderActionFlags * ioActionFlags,
- const AudioTimeStamp * inTimeStamp,
+AudioUnitProcessMultiple ( AudioUnit inUnit,
+ AudioUnitRenderActionFlags * ioActionFlags,
+ const AudioTimeStamp * inTimeStamp,
UInt32 inNumberFrames,
UInt32 inNumberInputBufferLists,
const AudioBufferList ** inInputBufferLists,
@@ -1324,7 +1324,7 @@ OSStatus CAAudioUnit::ProcessMultiple (AudioUnitRenderActionFlags & ioActionFl
AudioBufferList ** ioOutputBufferLists)
{
#if defined(__MAC_10_7) || defined(__IPHONE_4_0)
- return AudioUnitProcessMultiple (AU(), &ioActionFlags, &inTimeStamp, inNumberFrames,
+ return AudioUnitProcessMultiple (AU(), &ioActionFlags, &inTimeStamp, inNumberFrames,
inNumberInputBufferLists, inInputBufferLists, inNumberOutputBufferLists, ioOutputBufferLists);
#else
return -4/*unimpErr*/;
@@ -1354,8 +1354,8 @@ CAAUChanHelper::CAAUChanHelper(const CAAudioUnit &inAU, AudioUnitScope inScope)
mNumEls = elCount;
}
-CAAUChanHelper::CAAUChanHelper(UInt32 inMaxElems)
- : mNumEls(inMaxElems), mDidAllocate(false)
+CAAUChanHelper::CAAUChanHelper(UInt32 inMaxElems)
+ : mNumEls(inMaxElems), mDidAllocate(false)
{
if (inMaxElems > kStaticElCount) {
mChans = new UInt32[inMaxElems];
@@ -1372,8 +1372,8 @@ CAAUChanHelper::~CAAUChanHelper()
if (mDidAllocate) delete [] mChans;
}
-CAAUChanHelper& CAAUChanHelper::operator= (const CAAUChanHelper &c)
-{
+CAAUChanHelper& CAAUChanHelper::operator= (const CAAUChanHelper &c)
+{
if (mDidAllocate) delete [] mChans;
if (c.mDidAllocate) {
mChans = new UInt32[c.mNumEls];
@@ -1383,8 +1383,8 @@ CAAUChanHelper& CAAUChanHelper::operator= (const CAAUChanHelper &c)
mChans = mStaticChans;
}
memcpy (mChans, c.mChans, c.mNumEls * sizeof(int));
-
- return *this;
+
+ return *this;
}
@@ -1393,7 +1393,7 @@ CAAUChanHelper& CAAUChanHelper::operator= (const CAAUChanHelper &c)
void CAAudioUnit::Print (FILE* file) const
{
fprintf (file, "AudioUnit:%p\n", AU());
- if (IsValid()) {
+ if (IsValid()) {
fprintf (file, "\tnode=%ld\t", (long)GetAUNode()); Comp().Print (file);
}
}
@@ -1404,13 +1404,13 @@ static void *LoadGetComponentInstanceStorage (void *inst)
{
typedef void* (*GetComponentInstanceStorageProc)(void* aComponentInstance);
static GetComponentInstanceStorageProc sGetComponentInstanceStorageProc = NULL;
-
+
static int sDoCSLoad = 1;
if (sDoCSLoad) {
sDoCSLoad = 0;
void *theImage = dlopen("/System/Library/Frameworks/CoreServices.framework/CoreServices", RTLD_LAZY);
if (!theImage) return NULL;
-
+
sGetComponentInstanceStorageProc = (GetComponentInstanceStorageProc) dlsym(theImage, "GetComponentInstanceStorage");
}
if (sGetComponentInstanceStorageProc)
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h
index 07a522e..d06a20c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h
@@ -2,14 +2,14 @@
File: CAAudioUnit.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAudioUnit_h__
#define __CAAudioUnit_h__
@@ -73,7 +73,7 @@ class CAAUChanHelper;
// The destructor will NOT automatically close the AU down
// This state should be managed by the Caller
// once closed, the unit represented by this object is no longer valid
-// it is up to the user of this object to ensure its validity is in sync
+// it is up to the user of this object to ensure its validity is in sync
// if it is removed from a graph
// methods that can significantly change the state of the AU (like its format) are
@@ -89,7 +89,7 @@ public:
typedef ChannelTagVector::iterator ChannelTagVectorIter;
public:
- CAAudioUnit ()
+ CAAudioUnit ()
: mDataPtr(0) {}
CAAudioUnit (const AudioUnit& inUnit);
@@ -105,28 +105,28 @@ public:
void Close ();
-
+
CAAudioUnit& operator= (const CAAudioUnit& y);
bool operator== (const CAAudioUnit& y) const;
bool operator== (const AudioUnit& y) const;
-#pragma mark __State Management
+#pragma mark __State Management
bool IsValid () const;
-
+
AudioUnit AU() const;
operator AudioUnit () const { return AU(); }
const CAComponent& Comp() const { return mComp; }
-
+
const CAComponentDescription& Desc() const { return mComp.Desc(); }
-
+
bool FromAUGraph () const { return GetAUNode() != 0 && GetAUNode() != kCAAU_DoNotKnowIfAUNode; }
-
+
AUNode GetAUNode () const;
operator AUNode () const { return GetAUNode(); }
-
+
#pragma mark __API Wrapper
OSStatus Initialize() const {
return AudioUnitInitialize(AU());
@@ -151,7 +151,7 @@ public:
}
OSStatus SetParameter(AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
Float32 value, UInt32 bufferOffsetFrames=0);
-
+
OSStatus GetParameter(AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
Float32 &outValue) const;
@@ -165,7 +165,7 @@ public:
const AudioTimeStamp & inTimeStamp,
UInt32 inNumberFrames,
AudioBufferList & ioData);
-
+
OSStatus ProcessMultiple (AudioUnitRenderActionFlags & ioActionFlags,
const AudioTimeStamp & inTimeStamp,
UInt32 inNumberFrames,
@@ -174,7 +174,7 @@ public:
UInt32 inNumberOutputBufferLists,
AudioBufferList ** ioOutputBufferLists);
-
+
OSStatus Reset (AudioUnitScope scope, AudioUnitElement element)
{
return AudioUnitReset (AU(), scope, element);
@@ -188,7 +188,7 @@ public:
{
return AudioUnitAddRenderNotify (AU(), inProc, inProcRefCon);
}
-
+
OSStatus RemoveRenderNotify (AURenderCallback inProc, void *inProcRefCon)
{
return AudioUnitRemoveRenderNotify (AU(), inProc, inProcRefCon);
@@ -200,24 +200,24 @@ public:
{
return AudioUnitAddPropertyListener (AU(), inID, inProc, inProcRefCon);
}
-
+
OSStatus RemovePropertyListener (AudioUnitPropertyID inID,
AudioUnitPropertyListenerProc inProc,
void * inProcUserData);
-
+
OSStatus MIDIEvent (UInt32 inStatus,
UInt32 inData1,
UInt32 inData2,
UInt32 inOffsetSampleFrame);
-
+
// uses the default VoiceForGroup value - this is the normal case
OSStatus StartNote (MusicDeviceGroupID inGroupID,
NoteInstanceID * outNoteInstanceID,
UInt32 inOffsetSampleFrame,
const MusicDeviceNoteParams * inParams)
{
- return StartNote (kMusicNoteEvent_UseGroupInstrument,
- inGroupID, outNoteInstanceID,
+ return StartNote (kMusicNoteEvent_UseGroupInstrument,
+ inGroupID, outNoteInstanceID,
inOffsetSampleFrame, inParams);
}
@@ -241,45 +241,45 @@ public:
{
return CanDo (inChannelsInOut, inChannelsInOut);
}
-
- bool CanDo ( int inChannelsIn,
+
+ bool CanDo ( int inChannelsIn,
int inChannelsOut) const;
-
+
// This version does a more thorough test for ANY AU with ANY ins/outs
// you pass in the channel helper (for the current element count on that scope)
-
+
bool CanDo ( const CAAUChanHelper &input,
const CAAUChanHelper &output) const;
-
+
bool SupportsNumChannels () const;
- bool HasChannelLayouts (AudioUnitScope inScope,
+ bool HasChannelLayouts (AudioUnitScope inScope,
AudioUnitElement inEl) const;
-
+
int GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt);
OSStatus GetChannelLayoutTags (AudioUnitScope inScope,
AudioUnitElement inEl,
ChannelTagVector &outChannelVector) const;
-
- bool HasChannelLayout (AudioUnitScope inScope,
+
+ bool HasChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl) const;
-
+
OSStatus GetChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl,
- CAAudioChannelLayout &outLayout) const;
+ CAAudioChannelLayout &outLayout) const;
- OSStatus SetChannelLayout (AudioUnitScope inScope,
+ OSStatus SetChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl,
const CAAudioChannelLayout &inLayout);
- OSStatus SetChannelLayout (AudioUnitScope inScope,
+ OSStatus SetChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl,
const AudioChannelLayout &inLayout,
UInt32 inSize);
-
+
OSStatus ClearChannelLayout (AudioUnitScope inScope,
AudioUnitElement inEl);
-
+
OSStatus GetFormat (AudioUnitScope inScope,
AudioUnitElement inEl,
AudioStreamBasicDescription &outFormat) const;
@@ -298,16 +298,16 @@ public:
// this sets the sample rate on all in/out buses of the AU
OSStatus SetSampleRate (Float64 inSampleRate);
-
+
OSStatus NumberChannels (AudioUnitScope inScope,
AudioUnitElement inEl,
UInt32 &outChans) const;
OSStatus GetNumberChannels (AudioUnitScope inScope,
AudioUnitElement inEl,
- UInt32 &outChans) const
- {
- return NumberChannels (inScope, inEl, outChans);
+ UInt32 &outChans) const
+ {
+ return NumberChannels (inScope, inEl, outChans);
}
OSStatus SetNumberChannels (AudioUnitScope inScope,
@@ -319,28 +319,28 @@ public:
OSStatus GetElementCount (AudioUnitScope inScope, UInt32 &outCount) const;
OSStatus SetElementCount (AudioUnitScope inScope, UInt32 inCount);
-
+
// value of -1 for outTotalNumChannels indicates no restriction on num channels
- // for ex. the Matrix Mixer satisfies this (its in/out element count is writable, and can be set to
+ // for ex. the Matrix Mixer satisfies this (its in/out element count is writable, and can be set to
// any number of channels.
// outTotalNumChannels is only valid if method returns true...
bool HasDynamicInputs (SInt32 &outTotalNumChannels) const
{
return HasDynamicScope (kAudioUnitScope_Input, outTotalNumChannels);
}
-
+
bool HasDynamicOutputs (SInt32 &outTotalNumChannels) const
{
return HasDynamicScope (kAudioUnitScope_Output, outTotalNumChannels);
}
-
+
// here, if the in (or out) elements are dynamic, then you supply the number of elements
// you want on in (or out) scope, and the number of channels on each consecutive element
OSStatus ConfigureDynamicInput (UInt32 inNumElements, UInt32 *inChannelsPerElement, Float64 inSampleRate)
{
return ConfigureDynamicScope (kAudioUnitScope_Input, inNumElements, inChannelsPerElement, inSampleRate);
}
-
+
OSStatus ConfigureDynamicOutput (UInt32 inNumElements, UInt32 *inChannelsPerElement, Float64 inSampleRate)
{
return ConfigureDynamicScope (kAudioUnitScope_Output, inNumElements, inChannelsPerElement, inSampleRate);
@@ -351,57 +351,57 @@ public:
bool GetBypass () const;
OSStatus SetBypass (bool inBypass) const;
-
+
OSStatus GetMaxFramesPerSlice (UInt32& outMaxFrames) const;
-
+
OSStatus SetMaxFramesPerSlice (UInt32 inMaxFrames);
-
+
Float64 Latency () const;
-
+
// these calls just deal with the global preset state
// you could rescope them to deal with presets on the part scope
OSStatus GetAUPreset (CFPropertyListRef &outData) const;
OSStatus SetAUPreset (CFPropertyListRef &inData);
-
+
OSStatus SetAUPresetFromDocument (CFPropertyListRef &inData);
OSStatus GetPresentPreset (AUPreset &outData) const;
-
+
OSStatus SetPresentPreset (AUPreset &inData);
-
+
bool HasCustomView () const;
-
-#pragma mark __Print
+
+#pragma mark __Print
void Print () const { Print (stdout); }
void Print (FILE* file) const;
-
+
private:
CAComponent mComp;
-
+
class AUState;
AUState* mDataPtr;
-
+
// this can throw - so wrap this up in a static that returns a result code...
CAAudioUnit (const CAComponent& inComp);
bool HasDynamicScope (AudioUnitScope inScope, SInt32 &outTotalNumChannels) const;
- OSStatus ConfigureDynamicScope (AudioUnitScope inScope,
- UInt32 inNumElements,
- UInt32 *inChannelsPerElement,
+ OSStatus ConfigureDynamicScope (AudioUnitScope inScope,
+ UInt32 inNumElements,
+ UInt32 *inChannelsPerElement,
Float64 inSampleRate);
- bool ValidateChannelPair (int inChannelsIn,
+ bool ValidateChannelPair (int inChannelsIn,
int inChannelsOut,
const AUChannelInfo * info,
UInt32 numChanInfo) const;
-
- bool ValidateDynamicScope (AudioUnitScope inScope,
- SInt32 &outTotalNumChannels,
- const AUChannelInfo * info,
+
+ bool ValidateDynamicScope (AudioUnitScope inScope,
+ SInt32 &outTotalNumChannels,
+ const AUChannelInfo * info,
UInt32 numInfo) const;
- bool CheckOneSide (const CAAUChanHelper &inHelper,
- bool checkOutput,
- const AUChannelInfo *info,
+ bool CheckOneSide (const CAAUChanHelper &inHelper,
+ bool checkOutput,
+ const AUChannelInfo *info,
UInt32 numInfo) const;
enum {
kCAAU_DoNotKnowIfAUNode = -1
@@ -410,24 +410,24 @@ private:
class CAAUChanHelper {
public:
- CAAUChanHelper()
- : mChans(mStaticChans), mNumEls(0), mDidAllocate(false)
+ CAAUChanHelper()
+ : mChans(mStaticChans), mNumEls(0), mDidAllocate(false)
{
memset (mChans, 0, sizeof(UInt32) * kStaticElCount);
}
CAAUChanHelper(UInt32 inMaxElems);
CAAUChanHelper(const CAAudioUnit &inAU, AudioUnitScope inScope);
- CAAUChanHelper (const CAAUChanHelper &c)
- : mChans(mStaticChans), mNumEls(0), mDidAllocate(false)
+ CAAUChanHelper (const CAAUChanHelper &c)
+ : mChans(mStaticChans), mNumEls(0), mDidAllocate(false)
{ *this = c; }
-
+
~CAAUChanHelper();
CAAUChanHelper& operator= (const CAAUChanHelper &c);
UInt32 * mChans;
UInt32 mNumEls;
-
+
private:
enum {
kStaticElCount = 8
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h
index 42bebfa..0053b18 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h
@@ -2,14 +2,14 @@
File: CAAudioUnitOutputCapturer.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAAudioUnitOutputCapturer_h__
#define __CAAudioUnitOutputCapturer_h__
@@ -77,13 +77,13 @@ public:
mAudioUnit(au),
mExtAudioFile(NULL),
mBusNumber (busNumber)
- {
+ {
CFShow(outputFileURL);
OSStatus err = ExtAudioFileCreateWithURL(outputFileURL, fileType, &format, NULL, kAudioFileFlags_EraseFile, &mExtAudioFile);
if (!err)
mFileOpen = true;
}
-
+
void Start() {
if (mFileOpen) {
if (!mClientFormatSet) {
@@ -97,19 +97,19 @@ public:
AudioUnitAddRenderNotify(mAudioUnit, RenderCallback, this);
}
}
-
+
void Stop() {
if (mFileOpen)
AudioUnitRemoveRenderNotify(mAudioUnit, RenderCallback, this);
}
-
+
void Close() {
if (mExtAudioFile) {
ExtAudioFileDispose(mExtAudioFile);
mExtAudioFile = NULL;
}
}
-
+
~CAAudioUnitOutputCapturer() {
Close();
}
@@ -132,7 +132,7 @@ private:
}
return noErr;
}
-
+
bool mFileOpen;
bool mClientFormatSet;
AudioUnit mAudioUnit;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp
index 203e437..50faf8f 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp
@@ -2,14 +2,14 @@
File: CAAudioValueRange.cpp
Abstract: CAAudioValueRange.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -80,7 +80,7 @@ Float64 CAAudioValueRange::PickCommonSampleRate(const AudioValueRange& inRange)
// if no common rates can be found. It assumes that inRange contains a continuous range of
// sample rates.
Float64 theAnswer = inRange.mMaximum;
-
+
if(ContainsValue(inRange, 44100.0))
{
theAnswer = 44100.0;
@@ -129,7 +129,7 @@ Float64 CAAudioValueRange::PickCommonSampleRate(const AudioValueRange& inRange)
{
theAnswer = 8000.0;
}
-
+
return theAnswer;
}
@@ -173,50 +173,50 @@ void CAAudioValueRange_ComputeUnion(const AudioValueRange& inRange, const CAAudi
{
// this method assumes that the ranges in inRangeList are disjoint and that they are sorted from low to high and
outUnion.clear();
-
+
// start at the beginning of inRangeList
CAAudioValueRangeList::const_iterator theIterator = inRangeList.begin();
-
+
// iterate through inRangeList and add all the ranges that are strictly less than inRange
while((theIterator != inRangeList.end()) && CAAudioValueRange::IsStrictlyLessThan(*theIterator, inRange))
{
// put this range in the union
outUnion.push_back(*theIterator);
-
+
// go to the next one
std::advance(theIterator, 1);
}
-
+
if(theIterator != inRangeList.end())
{
if(!CAAudioValueRange::IsStrictlyGreaterThan(*theIterator, inRange))
{
// inRange intersects the range that theIterator points at, but might actually intersect several contiguous ranges
-
+
// initialize the starting point, noting that we can skip the current one since we already know it's in the intersection
CAAudioValueRangeList::const_iterator theGreaterIterator = theIterator;
std::advance(theGreaterIterator, 1);
-
+
// iterate until we find a range that is strictly greater than inRange
while((theGreaterIterator != inRangeList.end()) && !CAAudioValueRange::IsStrictlyGreaterThan(*theGreaterIterator, inRange))
{
// go to the next one
std::advance(theGreaterIterator, 1);
}
-
+
// theGreaterIterator now points at either one past the highest range in the intersection or the end of the vector
// Either way, we have to adjust it to point at the true highest range in the intersection
std::advance(theGreaterIterator, -1);
-
+
// now theIterator points at the lowest range in the intersection and theGreaterIterator points at the highest
// so we can compute the coagulated range
AudioValueRange theCoagulation;
theCoagulation.mMinimum = std::min(theIterator->mMinimum, inRange.mMinimum);
theCoagulation.mMaximum = std::max(theGreaterIterator->mMaximum, inRange.mMaximum);
-
+
// add the coagulation to the union
outUnion.push_back(theCoagulation);
-
+
// adjust theIterator to point at the next range for processing
theIterator = theGreaterIterator;
std::advance(theIterator, 1);
@@ -226,13 +226,13 @@ void CAAudioValueRange_ComputeUnion(const AudioValueRange& inRange, const CAAudi
// the range theIterator points at is strictly greater than inRange, so insert inRange in front of it and we're done
outUnion.push_back(inRange);
}
-
+
// we need to now copy the remaining higher ranges in inRangeList into the union
while(theIterator != inRangeList.end())
{
// put this range in the union
outUnion.push_back(*theIterator);
-
+
// go to the next one
std::advance(theIterator, 1);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h
index e17c457..c9f94ea 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h
@@ -2,14 +2,14 @@
File: CAAudioValueRange.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAAudioValueRange_h__)
#define __CAAudioValueRange_h__
@@ -104,7 +104,7 @@ public:
return x.mMinimum < y.mMinimum;
}
};
-
+
};
inline bool operator<(const AudioValueRange& x, const AudioValueRange& y) { return x.mMinimum < y.mMinimum; }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h b/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h
index 2da2415..eef4762 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h
@@ -2,14 +2,14 @@
File: CAAutoDisposer.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAPtr_h__)
#define __CAPtr_h__
@@ -78,10 +78,10 @@ inline void* CA_realloc(void* old, size_t size)
#endif
inline void* CA_calloc(size_t n, size_t size)
-{
+{
// ensure that multiplication will not overflow
if (n && UINTPTR_MAX / n < size) throw std::bad_alloc();
-
+
size_t nsize = n*size;
void* p = malloc(nsize);
if (!p && nsize) throw std::bad_alloc();
@@ -107,87 +107,87 @@ private:
T* ptr_;
public:
-
+
CAAutoFree() : ptr_(0) {}
-
+
explicit CAAutoFree(T* ptr) : ptr_(ptr) {}
-
+
template<typename U>
CAAutoFree(CAAutoFree<U>& that) : ptr_(that.release()) {} // take ownership
// C++ std says: a template constructor is never a copy constructor
CAAutoFree(CAAutoFree<T>& that) : ptr_(that.release()) {} // take ownership
- CAAutoFree(size_t n, bool clear = false)
+ CAAutoFree(size_t n, bool clear = false)
// this becomes an ambiguous call if n == 0
- : ptr_(0)
+ : ptr_(0)
{
size_t maxItems = ~size_t(0) / sizeof(T);
- if (n > maxItems)
+ if (n > maxItems)
throw std::bad_alloc();
ptr_ = static_cast<T*>(clear ? CA_calloc(n, sizeof(T)) : CA_malloc(n * sizeof(T)));
}
-
+
~CAAutoFree() { free(); }
-
- void alloc(size_t numItems, bool clear = false)
+
+ void alloc(size_t numItems, bool clear = false)
{
size_t maxItems = ~size_t(0) / sizeof(T);
if (numItems > maxItems) throw std::bad_alloc();
-
+
free();
ptr_ = static_cast<T*>(clear ? CA_calloc(numItems, sizeof(T)) : CA_malloc(numItems * sizeof(T)));
}
-
- void allocBytes(size_t numBytes, bool clear = false)
+
+ void allocBytes(size_t numBytes, bool clear = false)
{
free();
ptr_ = static_cast<T*>(clear ? CA_calloc(1, numBytes) : CA_malloc(numBytes));
}
-
- void reallocBytes(size_t numBytes)
+
+ void reallocBytes(size_t numBytes)
{
ptr_ = static_cast<T*>(CA_realloc(ptr_, numBytes));
}
- void reallocItems(size_t numItems)
+ void reallocItems(size_t numItems)
{
size_t maxItems = ~size_t(0) / sizeof(T);
if (numItems > maxItems) throw std::bad_alloc();
-
+
ptr_ = static_cast<T*>(CA_realloc(ptr_, numItems * sizeof(T)));
}
-
+
template <typename U>
- CAAutoFree& operator=(CAAutoFree<U>& that)
- {
+ CAAutoFree& operator=(CAAutoFree<U>& that)
+ {
set(that.release()); // take ownership
return *this;
}
-
- CAAutoFree& operator=(CAAutoFree& that)
- {
+
+ CAAutoFree& operator=(CAAutoFree& that)
+ {
set(that.release()); // take ownership
return *this;
}
-
- CAAutoFree& operator=(T* ptr)
+
+ CAAutoFree& operator=(T* ptr)
{
- set(ptr);
+ set(ptr);
return *this;
}
-
+
template <typename U>
- CAAutoFree& operator=(U* ptr)
+ CAAutoFree& operator=(U* ptr)
{
- set(ptr);
+ set(ptr);
return *this;
}
-
+
T& operator*() const { return *ptr_; }
T* operator->() const { return ptr_; }
-
+
T* operator()() const { return ptr_; }
T* get() const { return ptr_; }
operator T*() const { return ptr_; }
@@ -196,15 +196,15 @@ public:
bool operator!=(CAAutoFree const& that) const { return ptr_ != that.ptr_; }
bool operator==(T* ptr) const { return ptr_ == ptr; }
bool operator!=(T* ptr) const { return ptr_ != ptr; }
-
- T* release()
+
+ T* release()
{
// release ownership
T* result = ptr_;
ptr_ = 0;
return result;
}
-
+
void set(T* ptr)
{
if (ptr != ptr_)
@@ -213,8 +213,8 @@ public:
ptr_ = ptr;
}
}
-
- void free()
+
+ void free()
{
set(0);
}
@@ -237,7 +237,7 @@ public:
template<typename U>
operator CAAutoFree<U>()
{ return CAAutoFree<U>(release()); }
-
+
};
@@ -251,61 +251,61 @@ public:
CAAutoDelete() : ptr_(0) {}
explicit CAAutoDelete(T* ptr) : ptr_(ptr) {}
-
+
template<typename U>
CAAutoDelete(CAAutoDelete<U>& that) : ptr_(that.release()) {} // take ownership
// C++ std says: a template constructor is never a copy constructor
CAAutoDelete(CAAutoDelete<T>& that) : ptr_(that.release()) {} // take ownership
-
+
~CAAutoDelete() { free(); }
-
+
template <typename U>
- CAAutoDelete& operator=(CAAutoDelete<U>& that)
- {
+ CAAutoDelete& operator=(CAAutoDelete<U>& that)
+ {
set(that.release()); // take ownership
return *this;
}
-
- CAAutoDelete& operator=(CAAutoDelete& that)
- {
+
+ CAAutoDelete& operator=(CAAutoDelete& that)
+ {
set(that.release()); // take ownership
return *this;
}
-
- CAAutoDelete& operator=(T* ptr)
+
+ CAAutoDelete& operator=(T* ptr)
{
- set(ptr);
+ set(ptr);
return *this;
}
-
+
template <typename U>
- CAAutoDelete& operator=(U* ptr)
+ CAAutoDelete& operator=(U* ptr)
{
- set(ptr);
+ set(ptr);
return *this;
}
-
+
T& operator*() const { return *ptr_; }
T* operator->() const { return ptr_; }
-
+
T* operator()() const { return ptr_; }
T* get() const { return ptr_; }
operator T*() const { return ptr_; }
-
+
bool operator==(CAAutoDelete const& that) const { return ptr_ == that.ptr_; }
bool operator!=(CAAutoDelete const& that) const { return ptr_ != that.ptr_; }
bool operator==(T* ptr) const { return ptr_ == ptr; }
bool operator!=(T* ptr) const { return ptr_ != ptr; }
-
- T* release()
+
+ T* release()
{
// release ownership
T* result = ptr_;
ptr_ = 0;
return result;
}
-
+
void set(T* ptr)
{
if (ptr != ptr_)
@@ -314,8 +314,8 @@ public:
ptr_ = ptr;
}
}
-
- void free()
+
+ void free()
{
set(0);
}
@@ -338,7 +338,7 @@ public:
template<typename U>
operator CAAutoFree<U>()
{ return CAAutoFree<U>(release()); }
-
+
};
@@ -352,53 +352,53 @@ public:
CAAutoArrayDelete() : ptr_(0) {}
explicit CAAutoArrayDelete(T* ptr) : ptr_(ptr) {}
-
+
template<typename U>
CAAutoArrayDelete(CAAutoArrayDelete<U>& that) : ptr_(that.release()) {} // take ownership
// C++ std says: a template constructor is never a copy constructor
CAAutoArrayDelete(CAAutoArrayDelete<T>& that) : ptr_(that.release()) {} // take ownership
-
+
// this becomes an ambiguous call if n == 0
CAAutoArrayDelete(size_t n) : ptr_(new T[n]) {}
-
+
~CAAutoArrayDelete() { free(); }
-
- void alloc(size_t numItems)
+
+ void alloc(size_t numItems)
{
free();
ptr_ = new T [numItems];
}
-
+
template <typename U>
- CAAutoArrayDelete& operator=(CAAutoArrayDelete<U>& that)
- {
+ CAAutoArrayDelete& operator=(CAAutoArrayDelete<U>& that)
+ {
set(that.release()); // take ownership
return *this;
}
-
- CAAutoArrayDelete& operator=(CAAutoArrayDelete& that)
- {
+
+ CAAutoArrayDelete& operator=(CAAutoArrayDelete& that)
+ {
set(that.release()); // take ownership
return *this;
}
-
- CAAutoArrayDelete& operator=(T* ptr)
+
+ CAAutoArrayDelete& operator=(T* ptr)
{
- set(ptr);
+ set(ptr);
return *this;
}
-
+
template <typename U>
- CAAutoArrayDelete& operator=(U* ptr)
+ CAAutoArrayDelete& operator=(U* ptr)
{
- set(ptr);
+ set(ptr);
return *this;
}
-
+
T& operator*() const { return *ptr_; }
T* operator->() const { return ptr_; }
-
+
T* operator()() const { return ptr_; }
T* get() const { return ptr_; }
operator T*() const { return ptr_; }
@@ -407,15 +407,15 @@ public:
bool operator!=(CAAutoArrayDelete const& that) const { return ptr_ != that.ptr_; }
bool operator==(T* ptr) const { return ptr_ == ptr; }
bool operator!=(T* ptr) const { return ptr_ != ptr; }
-
- T* release()
+
+ T* release()
{
// release ownership
T* result = ptr_;
ptr_ = 0;
return result;
}
-
+
void set(T* ptr)
{
if (ptr != ptr_)
@@ -424,8 +424,8 @@ public:
ptr_ = ptr;
}
}
-
- void free()
+
+ void free()
{
set(0);
}
@@ -448,7 +448,7 @@ public:
template<typename U>
operator CAAutoArrayDelete<U>()
{ return CAAutoFree<U>(release()); }
-
+
};
@@ -493,7 +493,7 @@ void sink(CAAutoFree<char> captr)
}
-int main (int argc, char * const argv[])
+int main (int argc, char * const argv[])
{
CAAutoFree<char> captr(source());
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h b/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h
index 21cb516..8394fbf 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h
@@ -2,14 +2,14 @@
File: CABitOperations.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef _CABitOperations_h_
#define _CABitOperations_h_
@@ -57,8 +57,8 @@
#include <TargetConditionals.h>
// return whether a number is a power of two
-inline UInt32 IsPowerOfTwo(UInt32 x)
-{
+inline UInt32 IsPowerOfTwo(UInt32 x)
+{
return (x & (x-1)) == 0;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABool.h b/libs/appleutility/CoreAudio/PublicUtility/CABool.h
index 719fd74..0d74961 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABool.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABool.h
@@ -2,14 +2,14 @@
File: CABool.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CABool_h__)
#define __CABool_h__
@@ -72,17 +72,17 @@ public:
CABool(bool inValue) : mValue(inValue ? 1 : 0) {}
CABool(const CABool& inValue) : mValue(inValue.mValue) {}
~CABool() {}
-
+
CABool& operator=(bool inValue) { mValue = inValue; return *this; }
CABool& operator=(const CABool& inValue) { mValue = inValue.mValue; return *this; }
-
+
operator bool() const { ThrowIf(mValue == -1, CAException('nope'), "CABool: uninitialized"); return mValue != 0; }
bool IsInitialized() const { return mValue != -1; }
void Uninitialize() { mValue = -1; }
private:
SInt32 mValue;
-
+
CABool(const void*); // prevent accidental instantiation with a pointer via bool constructor
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp
index 3249013..f43cdaa 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp
@@ -2,14 +2,14 @@
File: CABufferList.cpp
Abstract: CABufferList.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CABufferList.h"
#include "CAByteOrder.h"
@@ -58,7 +58,7 @@ void CABufferList::AllocateBuffers(UInt32 nBytes)
UInt32 memorySize = nBytes * mABL.mNumberBuffers;
Byte *newMemory = new Byte[memorySize], *p = newMemory;
memset(newMemory, 0, memorySize); // get page faults now, not later
-
+
AudioBuffer *buf = mABL.mBuffers;
for (UInt32 i = mABL.mNumberBuffers; i--; ++buf) {
if (buf->mData != NULL && buf->mDataByteSize > 0)
@@ -84,7 +84,7 @@ void CABufferList::AllocateBuffersAndCopyFrom(UInt32 nBytes, CABufferList *inSr
}
inSetPtrList->VerifyNotTrashingOwnedBuffer();
UInt32 fromByteSize = inSrcList->GetNumBytes();
-
+
if (mABL.mNumberBuffers > 1)
// align successive buffers for Altivec and to take alternating
// cache line hits by spacing them by odd multiples of 16
@@ -92,7 +92,7 @@ void CABufferList::AllocateBuffersAndCopyFrom(UInt32 nBytes, CABufferList *inSr
UInt32 memorySize = nBytes * mABL.mNumberBuffers;
Byte *newMemory = new Byte[memorySize], *p = newMemory;
memset(newMemory, 0, memorySize); // make buffer "hot"
-
+
AudioBuffer *buf = mABL.mBuffers;
AudioBuffer *ptrBuf = inSetPtrList->mABL.mBuffers;
AudioBuffer *srcBuf = inSrcList->mABL.mBuffers;
@@ -126,7 +126,7 @@ void CABufferList::DeallocateBuffers()
mBufferMemory = NULL;
mBufferCapacity = 0;
}
-
+
}
static void show(const AudioBufferList &abl, int framesToPrint, int wordSize, const char *label, const char *fmtstr=NULL)
@@ -193,7 +193,7 @@ void CAShowAudioBufferList(const AudioBufferList &abl, int framesToPrint, const
CAStreamBasicDescription fmt(asbd);
int wordSize = 1;
char fmtstr[80] = { 0 };
-
+
if (fmt.mFormatID == kAudioFormatLinearPCM) {
if (fmt.mFormatFlags & kLinearPCMFormatFlagIsFloat) {
if (fmt.mBitsPerChannel == 32) {
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h
index 72c93f8..67bf272 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h
@@ -2,14 +2,14 @@
File: CABufferList.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CABufferList_h__
#define __CABufferList_h__
@@ -61,7 +61,7 @@ extern "C" int CrashIfClientProvidedBogusAudioBufferList(const AudioBufferList *
This class is designed for use in non-simplistic cases. For AudioUnits, AUBufferList
is preferred.
-
+
CABufferList can be used in one of two ways:
- as mutable pointers into non-owned memory
- as an immutable array of buffers (owns its own memory).
@@ -107,20 +107,20 @@ public:
if (mBufferMemory)
delete[] mBufferMemory;
}
-
+
const char * Name() { return mName; }
-
+
const AudioBufferList & GetBufferList() const { return mABL; }
-
+
AudioBufferList & GetModifiableBufferList() { return _GetBufferList(); }
-
+
UInt32 GetNumberBuffers() const { return mABL.mNumberBuffers; }
-
+
UInt32 GetNumBytes() const
{
return mABL.mBuffers[0].mDataByteSize;
}
-
+
void SetBytes(UInt32 nBytes, void *data)
{
VerifyNotTrashingOwnedBuffer();
@@ -128,7 +128,7 @@ public:
mABL.mBuffers[0].mDataByteSize = nBytes;
mABL.mBuffers[0].mData = data;
}
-
+
void CopyAllFrom(CABufferList *srcbl, CABufferList *ptrbl)
// copies bytes from srcbl
// make ptrbl reflect the length copied
@@ -150,17 +150,17 @@ public:
if (srcbl != ptrbl)
srcbl->BytesConsumed(nBytes);
}
-
+
// copies data from another buffer list.
void CopyDataFrom(const AudioBufferList &other)
{
for (unsigned i = 0; i < other.mNumberBuffers; ++i) {
XAssert(mBufferCapacity == 0 || other.mBuffers[i].mDataByteSize <= mBufferCapacity);
- memcpy(mABL.mBuffers[i].mData, other.mBuffers[i].mData,
+ memcpy(mABL.mBuffers[i].mData, other.mBuffers[i].mData,
mABL.mBuffers[i].mDataByteSize = other.mBuffers[i].mDataByteSize);
}
}
-
+
void AppendFrom(CABufferList *blp, UInt32 nBytes)
{
// this may mutate a buffer that owns memory.
@@ -173,7 +173,7 @@ public:
}
blp->BytesConsumed(nBytes);
}
-
+
void PadWithZeroes(UInt32 desiredBufferSize)
// for cases where an algorithm (e.g. SRC) requires some
// padding to create silence following end-of-file
@@ -186,7 +186,7 @@ public:
buf->mDataByteSize = desiredBufferSize;
}
}
-
+
void SetToZeroes(UInt32 nBytes)
{
XAssert(mBufferCapacity == 0 || nBytes <= mBufferCapacity);
@@ -196,23 +196,23 @@ public:
buf->mDataByteSize = nBytes;
}
}
-
+
void Reset()
{
DeallocateBuffers();
}
-
+
Boolean SameDataAs(const CABufferList* anotherBufferList)
{
// check to see if two buffer lists point to the same memory.
if (mABL.mNumberBuffers != anotherBufferList->mABL.mNumberBuffers) return false;
-
+
for (UInt32 i = 0; i < mABL.mNumberBuffers; ++i) {
if (mABL.mBuffers[i].mData != anotherBufferList->mABL.mBuffers[i].mData) return false;
}
return true;
}
-
+
void BytesConsumed(UInt32 nBytes)
// advance buffer pointers, decrease buffer sizes
{
@@ -224,18 +224,18 @@ public:
buf->mDataByteSize -= nBytes;
}
}
-
+
void SetFrom(const AudioBufferList *abl)
{
VerifyNotTrashingOwnedBuffer();
memcpy(&_GetBufferList(), abl, (char *)&abl->mBuffers[abl->mNumberBuffers] - (char *)abl);
}
-
+
void SetFrom(const CABufferList *blp)
{
SetFrom(&blp->GetBufferList());
}
-
+
void SetFrom(const AudioBufferList *abl, UInt32 nBytes)
{
VerifyNotTrashingOwnedBuffer();
@@ -247,25 +247,25 @@ public:
mybuf->mData = srcbuf->mData;
}
}
-
+
void SetFrom(const CABufferList *blp, UInt32 nBytes)
{
SetFrom(&blp->GetBufferList(), nBytes);
}
-
+
AudioBufferList * ToAudioBufferList(AudioBufferList *abl) const
{
memcpy(abl, &GetBufferList(), (char *)&abl->mBuffers[mABL.mNumberBuffers] - (char *)abl);
return abl;
}
-
+
void AllocateBuffers(UInt32 nBytes);
void AllocateBuffersAndCopyFrom(UInt32 nBytes, CABufferList *inCopyFromList, CABufferList *inSetPtrList);
-
+
void DeallocateBuffers();
-
+
void UseExternalBuffer(Byte *ptr, UInt32 nBytes);
-
+
void AdvanceBufferPointers(UInt32 nBytes) // $$$ ReducingSize
// this is for bufferlists that function simply as
// an array of pointers into another bufferlist, being advanced,
@@ -278,7 +278,7 @@ public:
buf->mDataByteSize -= nBytes;
}
}
-
+
void SetNumBytes(UInt32 nBytes)
{
XAssert(mBufferCapacity == 0 || nBytes <= mBufferCapacity);
@@ -296,9 +296,9 @@ public:
if (mBufferMemory)
printf(" owned memory @ 0x%p:\n", mBufferMemory);
}
-
+
UInt32 GetCapacityBytes() const { return mBufferCapacity; }
-
+
template <typename T>
T* GetData(UInt32 inBuffer) {
return static_cast<T*>(mABL.mBuffers[inBuffer].mData);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp
index 2161be7..2e4655c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp
@@ -2,14 +2,14 @@
File: CABundleLocker.cpp
Abstract: CABundleLocker.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CABundleLocker.h"
#include <pthread.h>
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h
index 821ca34..898b2cf 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h
@@ -2,14 +2,14 @@
File: CABundleLocker.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,15 +40,15 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef _CABundleLocker_h_
#define _CABundleLocker_h_
#include <TargetConditionals.h>
-
+
/*
some bundle operations are not thread safe, notably CFCopyLocalizedStringFromTableInBundle
*/
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h b/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h
index 9a56c6d..78a512a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h
@@ -2,14 +2,14 @@
File: CAByteOrder.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAByteOrder_h__)
#define __CAByteOrder_h__
@@ -71,7 +71,7 @@ CF_INLINE Float32 CASwapFloat32 (Float32 arg) {
flip.f = arg;
flip.i = CFSwapInt32 (flip.i);
-
+
return flip.f;
}
@@ -83,7 +83,7 @@ CF_INLINE Float64 CASwapFloat64 (Float64 arg) {
flip.f = arg;
flip.i = CFSwapInt64 (flip.i);
-
+
return flip.f;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp
index e7c057d..ec1e93c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp
@@ -2,14 +2,14 @@
File: CACFArray.cpp
Abstract: CACFArray.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -91,7 +91,7 @@ bool CACFArray::GetIndexOfItem(const void* inItem, UInt32& outIndex) const
bool CACFArray::GetBool(UInt32 inIndex, bool& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inIndex, theValue))
{
@@ -108,14 +108,14 @@ bool CACFArray::GetBool(UInt32 inIndex, bool& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetSInt32(UInt32 inIndex, SInt32& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -125,14 +125,14 @@ bool CACFArray::GetSInt32(UInt32 inIndex, SInt32& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetUInt32(UInt32 inIndex, UInt32& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -142,14 +142,14 @@ bool CACFArray::GetUInt32(UInt32 inIndex, UInt32& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetSInt64(UInt32 inIndex, SInt64& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -159,14 +159,14 @@ bool CACFArray::GetSInt64(UInt32 inIndex, SInt64& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetUInt64(UInt32 inIndex, UInt64& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -176,14 +176,14 @@ bool CACFArray::GetUInt64(UInt32 inIndex, UInt64& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetFloat32(UInt32 inIndex, Float32& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -193,14 +193,14 @@ bool CACFArray::GetFloat32(UInt32 inIndex, Float32& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetFloat64(UInt32 inIndex, Float64& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -210,14 +210,14 @@ bool CACFArray::GetFloat64(UInt32 inIndex, Float64& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::Get4CC(UInt32 inIndex, UInt32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inIndex, theValue))
{
@@ -237,14 +237,14 @@ bool CACFArray::Get4CC(UInt32 inIndex, UInt32& outValue) const
}
}
}
-
+
return theAnswer;
}
bool CACFArray::GetString(UInt32 inIndex, CFStringRef& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -254,14 +254,14 @@ bool CACFArray::GetString(UInt32 inIndex, CFStringRef& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetArray(UInt32 inIndex, CFArrayRef& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -271,14 +271,14 @@ bool CACFArray::GetArray(UInt32 inIndex, CFArrayRef& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetDictionary(UInt32 inIndex, CFDictionaryRef& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -288,14 +288,14 @@ bool CACFArray::GetDictionary(UInt32 inIndex, CFDictionaryRef& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetData(UInt32 inIndex, CFDataRef& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -305,14 +305,14 @@ bool CACFArray::GetData(UInt32 inIndex, CFDataRef& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetUUID(UInt32 inIndex, CFUUIDRef& outItem) const
{
bool theAnswer = false;
-
+
CFTypeRef theItem = NULL;
if(GetCFType(inIndex, theItem))
{
@@ -322,20 +322,20 @@ bool CACFArray::GetUUID(UInt32 inIndex, CFUUIDRef& outItem) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFArray::GetCFType(UInt32 inIndex, CFTypeRef& outItem) const
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && (inIndex < GetNumberItems()))
{
outItem = CFArrayGetValueAtIndex(mCFArray, static_cast<CFIndex>(inIndex));
theAnswer = outItem != NULL;
}
-
+
return theAnswer;
}
@@ -381,7 +381,7 @@ void CACFArray::GetCACFDictionary(UInt32 inIndex, CACFDictionary& outItem) const
bool CACFArray::AppendBool(bool inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFBoolean theItem(inItem);
@@ -390,14 +390,14 @@ bool CACFArray::AppendBool(bool inItem)
theAnswer = AppendCFType(theItem.GetCFBoolean());
}
}
-
+
return theAnswer;
}
bool CACFArray::AppendSInt32(SInt32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -406,14 +406,14 @@ bool CACFArray::AppendSInt32(SInt32 inItem)
theAnswer = AppendCFType(theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::AppendUInt32(UInt32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -422,14 +422,14 @@ bool CACFArray::AppendUInt32(UInt32 inItem)
theAnswer = AppendCFType(theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::AppendSInt64(SInt64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -438,14 +438,14 @@ bool CACFArray::AppendSInt64(SInt64 inItem)
theAnswer = AppendCFType(theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::AppendUInt64(UInt64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -454,14 +454,14 @@ bool CACFArray::AppendUInt64(UInt64 inItem)
theAnswer = AppendCFType(theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::AppendFloat32(Float32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -470,14 +470,14 @@ bool CACFArray::AppendFloat32(Float32 inItem)
theAnswer = AppendCFType(theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::AppendFloat64(Float64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -486,7 +486,7 @@ bool CACFArray::AppendFloat64(Float64 inItem)
theAnswer = AppendCFType(theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
@@ -513,20 +513,20 @@ bool CACFArray::AppendData(const CFDataRef inItem)
bool CACFArray::AppendCFType(const CFTypeRef inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CFArrayAppendValue(mCFArray, inItem);
theAnswer = true;
}
-
+
return theAnswer;
}
bool CACFArray::InsertBool(UInt32 inIndex, bool inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFBoolean theItem(inItem);
@@ -535,14 +535,14 @@ bool CACFArray::InsertBool(UInt32 inIndex, bool inItem)
theAnswer = InsertCFType(inIndex, theItem.GetCFBoolean());
}
}
-
+
return theAnswer;
}
bool CACFArray::InsertSInt32(UInt32 inIndex, SInt32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -551,14 +551,14 @@ bool CACFArray::InsertSInt32(UInt32 inIndex, SInt32 inItem)
theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::InsertUInt32(UInt32 inIndex, UInt32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -567,14 +567,14 @@ bool CACFArray::InsertUInt32(UInt32 inIndex, UInt32 inItem)
theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::InsertSInt64(UInt32 inIndex, SInt64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -583,14 +583,14 @@ bool CACFArray::InsertSInt64(UInt32 inIndex, SInt64 inItem)
theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::InsertUInt64(UInt32 inIndex, UInt64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -599,14 +599,14 @@ bool CACFArray::InsertUInt64(UInt32 inIndex, UInt64 inItem)
theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::InsertFloat32(UInt32 inIndex, Float32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -615,14 +615,14 @@ bool CACFArray::InsertFloat32(UInt32 inIndex, Float32 inItem)
theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::InsertFloat64(UInt32 inIndex, Float64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
CACFNumber theItem(inItem);
@@ -631,7 +631,7 @@ bool CACFArray::InsertFloat64(UInt32 inIndex, Float64 inItem)
theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
@@ -658,7 +658,7 @@ bool CACFArray::InsertData(UInt32 inIndex, const CFDataRef inItem)
bool CACFArray::InsertCFType(UInt32 inIndex, const CFTypeRef inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable)
{
if(inIndex < GetNumberItems())
@@ -671,14 +671,14 @@ bool CACFArray::InsertCFType(UInt32 inIndex, const CFTypeRef inItem)
}
theAnswer = true;
}
-
+
return theAnswer;
}
bool CACFArray::SetBool(UInt32 inIndex, bool inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CACFBoolean theItem(inItem);
@@ -687,14 +687,14 @@ bool CACFArray::SetBool(UInt32 inIndex, bool inItem)
theAnswer = SetCFType(inIndex, theItem.GetCFBoolean());
}
}
-
+
return theAnswer;
}
bool CACFArray::SetSInt32(UInt32 inIndex, SInt32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CACFNumber theItem(inItem);
@@ -703,14 +703,14 @@ bool CACFArray::SetSInt32(UInt32 inIndex, SInt32 inItem)
theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::SetUInt32(UInt32 inIndex, UInt32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CACFNumber theItem(inItem);
@@ -719,14 +719,14 @@ bool CACFArray::SetUInt32(UInt32 inIndex, UInt32 inItem)
theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::SetSInt64(UInt32 inIndex, SInt64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CACFNumber theItem(inItem);
@@ -735,14 +735,14 @@ bool CACFArray::SetSInt64(UInt32 inIndex, SInt64 inItem)
theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::SetUInt64(UInt32 inIndex, UInt64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CACFNumber theItem(inItem);
@@ -751,14 +751,14 @@ bool CACFArray::SetUInt64(UInt32 inIndex, UInt64 inItem)
theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::SetFloat32(UInt32 inIndex, Float32 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CACFNumber theItem(inItem);
@@ -767,14 +767,14 @@ bool CACFArray::SetFloat32(UInt32 inIndex, Float32 inItem)
theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
bool CACFArray::SetFloat64(UInt32 inIndex, Float64 inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CACFNumber theItem(inItem);
@@ -783,7 +783,7 @@ bool CACFArray::SetFloat64(UInt32 inIndex, Float64 inItem)
theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
}
}
-
+
return theAnswer;
}
@@ -810,12 +810,12 @@ bool CACFArray::SetData(UInt32 inIndex, const CFDataRef inItem)
bool CACFArray::SetCFType(UInt32 inIndex, const CFTypeRef inItem)
{
bool theAnswer = false;
-
+
if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
{
CFArraySetValueAtIndex(mCFArray, static_cast<CFIndex>(inIndex), inItem);
theAnswer = true;
}
-
+
return theAnswer;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h
index 89c8c55..4c9fb79 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h
@@ -2,14 +2,14 @@
File: CACFArray.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFArray_h__)
#define __CACFArray_h__
@@ -92,21 +92,21 @@ public:
private:
void Retain() { if(mRelease && (mCFArray != NULL)) { CFRetain(mCFArray); } }
void Release() { if(mRelease && (mCFArray != NULL)) { CFRelease(mCFArray); } }
-
+
// Attributes
public:
bool IsValid() const { return mCFArray != NULL; }
bool IsMutable() const { return mMutable; }
bool CanModify() const { return mMutable && (mCFArray != NULL); }
-
+
bool WillRelease() const { return mRelease; }
void ShouldRelease(bool inRelease) { mRelease = inRelease; }
-
+
CFTypeID GetTypeID() const { return CFGetTypeID(mCFArray); }
-
+
CFArrayRef GetCFArray() const { return mCFArray; }
CFArrayRef CopyCFArray() const { if(mCFArray != NULL) { CFRetain(mCFArray); } return mCFArray; }
-
+
CFMutableArrayRef GetCFMutableArray() const { return mCFArray; }
CFMutableArrayRef CopyCFMutableArray() const { if(mCFArray != NULL) { CFRetain(mCFArray); } return mCFArray; }
CFPropertyListRef AsPropertyList() const { return mCFArray; }
@@ -124,7 +124,7 @@ public:
void Sort(CFComparatorFunction inCompareFunction) { if(CanModify()) { CFRange theRange = { 0, CFArrayGetCount(mCFArray) }; CFArraySortValues(mCFArray, theRange, inCompareFunction, NULL); } }
void SortNumbers() { Sort((CFComparatorFunction)CFNumberCompare); }
void SortStrings() { Sort((CFComparatorFunction)CFStringCompare); }
-
+
bool GetBool(UInt32 inIndex, bool& outValue) const;
bool GetSInt32(UInt32 inIndex, SInt32& outItem) const;
bool GetUInt32(UInt32 inIndex, UInt32& outItem) const;
@@ -139,11 +139,11 @@ public:
bool GetData(UInt32 inIndex, CFDataRef& outItem) const;
bool GetUUID(UInt32 inIndex, CFUUIDRef& outItem) const;
bool GetCFType(UInt32 inIndex, CFTypeRef& outItem) const;
-
+
void GetCACFString(UInt32 inIndex, CACFString& outItem) const;
void GetCACFArray(UInt32 inIndex, CACFArray& outItem) const;
void GetCACFDictionary(UInt32 inIndex, CACFDictionary& outItem) const;
-
+
bool AppendBool(bool inItem);
bool AppendSInt32(SInt32 inItem);
bool AppendUInt32(UInt32 inItem);
@@ -156,7 +156,7 @@ public:
bool AppendDictionary(const CFDictionaryRef inItem);
bool AppendData(const CFDataRef inItem);
bool AppendCFType(const CFTypeRef inItem);
-
+
bool InsertBool(UInt32 inIndex, bool inItem);
bool InsertSInt32(UInt32 inIndex, SInt32 inItem);
bool InsertUInt32(UInt32 inIndex, UInt32 inItem);
@@ -169,7 +169,7 @@ public:
bool InsertDictionary(UInt32 inIndex, const CFDictionaryRef inItem);
bool InsertData(UInt32 inIndex, const CFDataRef inItem);
bool InsertCFType(UInt32 inIndex, const CFTypeRef inItem);
-
+
bool SetBool(UInt32 inIndex, bool inItem);
bool SetSInt32(UInt32 inIndex, SInt32 inItem);
bool SetUInt32(UInt32 inIndex, UInt32 inItem);
@@ -188,7 +188,7 @@ private:
CFMutableArrayRef mCFArray;
bool mRelease;
bool mMutable;
-
+
CACFArray(const void*); // prevent accidental instantiation with a pointer via bool constructor
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFData.h b/libs/appleutility/CoreAudio/PublicUtility/CACFData.h
index 7ce08dc..b289f60 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFData.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFData.h
@@ -2,14 +2,14 @@
File: CACFData.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFData_h__)
#define __CACFData_h__
@@ -81,7 +81,7 @@ public:
private:
void Retain() { if(mWillRelease && (mCFData != NULL)) { CFRetain(mCFData); } }
void Release() { if(mWillRelease && (mCFData != NULL)) { CFRelease(mCFData); } }
-
+
CFDataRef mCFData;
bool mWillRelease;
@@ -95,11 +95,11 @@ public:
public:
CFDataRef GetCFData() const { return mCFData; }
CFDataRef CopyCFData() const { if(mCFData != NULL) { CFRetain(mCFData); } return mCFData; }
-
+
UInt32 GetSize() const { return ToUInt32(CFDataGetLength(mCFData)); }
const void* GetDataPtr() const { return CFDataGetBytePtr(mCFData); }
void CopyData(UInt32 inStartOffset, void* outData, UInt32 inDataSize) const { CFRange theRange = { static_cast<CFIndex>(inStartOffset), static_cast<CFIndex>(inDataSize) }; CFDataGetBytes(mCFData, theRange, static_cast<UInt8*>(outData)); }
-
+
SInt32 GetSInt32() const { SInt32 theAnswer = 0; CopyData(0, &theAnswer, SizeOf32(SInt32)); return theAnswer; }
Float32 GetFloat32() const { Float32 theAnswer = 0; CopyData(0, &theAnswer, SizeOf32(Float32)); return theAnswer; }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp
index fbac774..a488a85 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp
@@ -2,14 +2,14 @@
File: CACFDictionary.cpp
Abstract: CACFDictionary.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -83,7 +83,7 @@ void CACFDictionary::GetKeysAndValues (const void **keys, const void **values) c
bool CACFDictionary::GetBool(const CFStringRef inKey, bool& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -100,14 +100,14 @@ bool CACFDictionary::GetBool(const CFStringRef inKey, bool& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetSInt32(const CFStringRef inKey, SInt32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -117,14 +117,14 @@ bool CACFDictionary::GetSInt32(const CFStringRef inKey, SInt32& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetUInt32(const CFStringRef inKey, UInt32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -134,14 +134,14 @@ bool CACFDictionary::GetUInt32(const CFStringRef inKey, UInt32& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetSInt64(const CFStringRef inKey, SInt64& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -151,14 +151,14 @@ bool CACFDictionary::GetSInt64(const CFStringRef inKey, SInt64& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetUInt64(const CFStringRef inKey, UInt64& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -168,14 +168,14 @@ bool CACFDictionary::GetUInt64(const CFStringRef inKey, UInt64& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetFloat32FromString(const CFStringRef inKey, Float32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -184,14 +184,14 @@ bool CACFDictionary::GetFloat32FromString(const CFStringRef inKey, Float32& outV
outValue = static_cast<Float32>(CFStringGetDoubleValue(static_cast<CFStringRef>(theValue)));
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetUInt32FromString(const CFStringRef inKey, UInt32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -200,14 +200,14 @@ bool CACFDictionary::GetUInt32FromString(const CFStringRef inKey, UInt32& outVal
outValue = CFStringGetIntValue(static_cast<CFStringRef>(theValue));
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetFloat32(const CFStringRef inKey, Float32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -217,14 +217,14 @@ bool CACFDictionary::GetFloat32(const CFStringRef inKey, Float32& outValue) cons
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetFloat64(const CFStringRef inKey, Float64& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -234,14 +234,14 @@ bool CACFDictionary::GetFloat64(const CFStringRef inKey, Float64& outValue) cons
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetFixed32(const CFStringRef inKey, Float32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -249,7 +249,7 @@ bool CACFDictionary::GetFixed32(const CFStringRef inKey, Float32& outValue) cons
{
SInt32 theFixed32 = 0;
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &theFixed32);
-
+
// this is a 16.16 value so convert it to a float
Float32 theSign = theFixed32 < 0 ? -1.0f : 1.0f;
theFixed32 *= (SInt32)theSign;
@@ -260,14 +260,14 @@ bool CACFDictionary::GetFixed32(const CFStringRef inKey, Float32& outValue) cons
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetFixed64(const CFStringRef inKey, Float64& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -280,14 +280,14 @@ bool CACFDictionary::GetFixed64(const CFStringRef inKey, Float64& outValue) cons
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::Get4CC(const CFStringRef inKey, UInt32& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -307,14 +307,14 @@ bool CACFDictionary::Get4CC(const CFStringRef inKey, UInt32& outValue) const
}
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetString(const CFStringRef inKey, CFStringRef& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -324,14 +324,14 @@ bool CACFDictionary::GetString(const CFStringRef inKey, CFStringRef& outValue) c
theAnswer = true;
}
}
-
+
return theAnswer;
}
-
+
bool CACFDictionary::GetArray(const CFStringRef inKey, CFArrayRef& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -341,14 +341,14 @@ bool CACFDictionary::GetArray(const CFStringRef inKey, CFArrayRef& outValue) con
theAnswer = true;
}
}
-
+
return theAnswer;
}
-
+
bool CACFDictionary::GetDictionary(const CFStringRef inKey, CFDictionaryRef& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -358,14 +358,14 @@ bool CACFDictionary::GetDictionary(const CFStringRef inKey, CFDictionaryRef& out
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetData(const CFStringRef inKey, CFDataRef& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -375,27 +375,27 @@ bool CACFDictionary::GetData(const CFStringRef inKey, CFDataRef& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetCFType(const CFStringRef inKey, CFTypeRef& outValue) const
{
bool theAnswer = false;
-
+
if(mCFDictionary != NULL)
{
outValue = CFDictionaryGetValue(mCFDictionary, inKey);
theAnswer = (outValue != NULL);
}
-
+
return theAnswer;
}
bool CACFDictionary::GetURL(const CFStringRef inKey, CFURLRef& outValue) const
{
bool theAnswer = false;
-
+
CFTypeRef theValue = NULL;
if(GetCFType(inKey, theValue))
{
@@ -405,14 +405,14 @@ bool CACFDictionary::GetURL(const CFStringRef inKey, CFURLRef& outValue) const
theAnswer = true;
}
}
-
+
return theAnswer;
}
bool CACFDictionary::GetCFTypeWithCStringKey(const char* inKey, CFTypeRef& outValue) const
{
bool theAnswer = false;
-
+
if(mCFDictionary != NULL)
{
CACFString theKey(inKey);
@@ -421,7 +421,7 @@ bool CACFDictionary::GetCFTypeWithCStringKey(const char* inKey, CFTypeRef& outVa
theAnswer = GetCFType(theKey.GetCFString(), outValue);
}
}
-
+
return theAnswer;
}
@@ -437,7 +437,7 @@ void CACFDictionary::GetCACFString(const CFStringRef inKey, CACFString& outValue
}
}
}
-
+
void CACFDictionary::GetCACFArray(const CFStringRef inKey, CACFArray& outValue) const
{
outValue = static_cast<CFArrayRef>(NULL);
@@ -450,7 +450,7 @@ void CACFDictionary::GetCACFArray(const CFStringRef inKey, CACFArray& outValue)
}
}
}
-
+
void CACFDictionary::GetCACFDictionary(const CFStringRef inKey, CACFDictionary& outValue) const
{
outValue = static_cast<CFDictionaryRef>(NULL);
@@ -539,7 +539,7 @@ bool CACFDictionary::AddURL(const CFStringRef inKey, const CFURLRef inValue)
bool CACFDictionary::AddCFTypeWithCStringKey(const char* inKey, const CFTypeRef inValue)
{
bool theAnswer = false;
-
+
if (inKey)
{
CACFString theKey(inKey);
@@ -548,14 +548,14 @@ bool CACFDictionary::AddCFTypeWithCStringKey(const char* inKey, const CFTypeRef
theAnswer = AddCFType(theKey.GetCFString(), inValue);
}
}
-
+
return theAnswer;
}
bool CACFDictionary::AddCString(const CFStringRef inKey, const char* inValue)
{
bool theAnswer = false;
-
+
if (inValue)
{
CACFString theValue(inValue);
@@ -570,12 +570,12 @@ bool CACFDictionary::AddCString(const CFStringRef inKey, const char* inValue)
bool CACFDictionary::AddCFType(const CFStringRef inKey, const CFTypeRef inValue)
{
bool theAnswer = false;
-
+
if(mMutable && (mCFDictionary != NULL) && inValue)
{
CFDictionarySetValue(mCFDictionary, inKey, inValue);
theAnswer = true;
}
-
+
return theAnswer;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h
index c389e50..db61f63 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h
@@ -2,14 +2,14 @@
File: CACFDictionary.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFDictionary_h__)
#define __CACFDictionary_h__
@@ -69,7 +69,7 @@ class CACFString;
// CACFDictionary
//=============================================================================
-class CACFDictionary
+class CACFDictionary
{
// Construction/Destruction
@@ -79,24 +79,24 @@ public:
CACFDictionary(CFDictionaryRef inCFDictionary, bool inRelease) : mCFDictionary(const_cast<CFMutableDictionaryRef>(inCFDictionary)), mRelease(inRelease), mMutable(false) {}
CACFDictionary(CFMutableDictionaryRef inCFDictionary, bool inRelease) : mCFDictionary(inCFDictionary), mRelease(inRelease), mMutable(true) {}
CACFDictionary(const CACFDictionary& inDictionary) : mCFDictionary(inDictionary.mCFDictionary), mRelease(inDictionary.mRelease), mMutable(inDictionary.mMutable) { Retain(); }
- CACFDictionary& operator=(const CACFDictionary& inDictionary) { Release(); mCFDictionary = inDictionary.mCFDictionary; mRelease = inDictionary.mRelease; mMutable = inDictionary.mMutable; Retain(); return *this; }
- CACFDictionary& operator=(CFDictionaryRef inDictionary) { Release(); mCFDictionary = const_cast<CFMutableDictionaryRef>(inDictionary); mMutable = false; Retain(); return *this; }
- CACFDictionary& operator=(CFMutableDictionaryRef inDictionary) { Release(); mCFDictionary = inDictionary; mMutable = true; Retain(); return *this; }
+ CACFDictionary& operator=(const CACFDictionary& inDictionary) { Release(); mCFDictionary = inDictionary.mCFDictionary; mRelease = inDictionary.mRelease; mMutable = inDictionary.mMutable; Retain(); return *this; }
+ CACFDictionary& operator=(CFDictionaryRef inDictionary) { Release(); mCFDictionary = const_cast<CFMutableDictionaryRef>(inDictionary); mMutable = false; Retain(); return *this; }
+ CACFDictionary& operator=(CFMutableDictionaryRef inDictionary) { Release(); mCFDictionary = inDictionary; mMutable = true; Retain(); return *this; }
~CACFDictionary() { Release(); }
private:
void Retain() { if(mRelease && (mCFDictionary != NULL)) { CFRetain(mCFDictionary); } }
void Release() { if(mRelease && (mCFDictionary != NULL)) { CFRelease(mCFDictionary); } }
-
+
// Attributes
public:
bool IsValid() const { return mCFDictionary != NULL; }
bool IsMutable() const { return mMutable;}
bool CanModify() const { return mMutable && (mCFDictionary != NULL); }
-
+
bool WillRelease() const { return mRelease; }
void ShouldRelease(bool inRelease) { mRelease = inRelease; }
-
+
CFDictionaryRef GetDict() const { return mCFDictionary; }
CFDictionaryRef GetCFDictionary() const { return mCFDictionary; }
CFDictionaryRef CopyCFDictionary() const { if(mCFDictionary != NULL) { CFRetain(mCFDictionary); } return mCFDictionary; }
@@ -116,7 +116,7 @@ public:
UInt32 Size() const;
void GetKeys(const void** keys) const;
void GetKeysAndValues (const void **keys, const void **values) const;
-
+
bool GetBool(const CFStringRef inKey, bool& outValue) const;
bool GetSInt32(const CFStringRef inKey, SInt32& outValue) const;
bool GetUInt32(const CFStringRef inKey, UInt32& outValue) const;
@@ -129,9 +129,9 @@ public:
bool GetFixed32(const CFStringRef inKey, Float32& outValue) const;
bool GetFixed64(const CFStringRef inKey, Float64& outValue) const;
bool Get4CC(const CFStringRef inKey, UInt32& outValue) const;
- bool GetString(const CFStringRef inKey, CFStringRef& outValue) const;
- bool GetArray(const CFStringRef inKey, CFArrayRef& outValue) const;
- bool GetDictionary(const CFStringRef inKey, CFDictionaryRef& outValue) const;
+ bool GetString(const CFStringRef inKey, CFStringRef& outValue) const;
+ bool GetArray(const CFStringRef inKey, CFArrayRef& outValue) const;
+ bool GetDictionary(const CFStringRef inKey, CFDictionaryRef& outValue) const;
bool GetData(const CFStringRef inKey, CFDataRef& outValue) const;
bool GetCFType(const CFStringRef inKey, CFTypeRef& outValue) const;
bool GetURL(const CFStringRef inKey, CFURLRef& outValue) const;
@@ -140,7 +140,7 @@ public:
void GetCACFString(const CFStringRef inKey, CACFString& outItem) const;
void GetCACFArray(const CFStringRef inKey, CACFArray& outItem) const;
void GetCACFDictionary(const CFStringRef inKey, CACFDictionary& outItem) const;
-
+
bool AddBool(const CFStringRef inKey, bool inValue);
bool AddSInt32(const CFStringRef inKey, SInt32 inValue);
bool AddUInt32(const CFStringRef inKey, UInt32 inValue);
@@ -155,21 +155,21 @@ public:
bool AddData(const CFStringRef inKey, const CFDataRef inValue);
bool AddCFType(const CFStringRef inKey, const CFTypeRef inValue);
bool AddURL(const CFStringRef inKey, const CFURLRef inValue);
-
+
bool AddCFTypeWithCStringKey(const char* inKey, const CFTypeRef inValue);
bool AddCString(const CFStringRef inKey, const char* inValue);
void RemoveKey(const CFStringRef inKey) { if(CanModify()) { CFDictionaryRemoveValue(mCFDictionary, inKey); } }
void Clear() { if(CanModify()) { CFDictionaryRemoveAllValues(mCFDictionary); } }
-
+
void Show() { CFShow(mCFDictionary); }
-
+
// Implementation
private:
CFMutableDictionaryRef mCFDictionary;
bool mRelease;
bool mMutable;
-
+
CACFDictionary(const void*); // prevent accidental instantiation with a pointer via bool constructor
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp
index 36c6923..7744ef2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp
@@ -2,14 +2,14 @@
File: CACFDistributedNotification.cpp
Abstract: CACFDistributedNotification.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -68,7 +68,7 @@ void CACFDistributedNotification::AddObserver(const void* inObserver, CFNotifica
CFNotificationCenterRef theCenter = CFNotificationCenterGetDarwinNotifyCenter();
CFNotificationSuspensionBehavior theSuspensionBehavior = static_cast<CFNotificationSuspensionBehavior>(0);
#endif
-
+
CFNotificationCenterAddObserver(theCenter, inObserver, inCallback, inName, NULL, theSuspensionBehavior);
}
@@ -79,7 +79,7 @@ void CACFDistributedNotification::RemoveObserver(const void* inObserver, CFStrin
#else
CFNotificationCenterRef theCenter = CFNotificationCenterGetDarwinNotifyCenter();
#endif
-
+
CFNotificationCenterRemoveObserver(theCenter, inObserver, inName, NULL);
}
@@ -97,11 +97,11 @@ void CACFDistributedNotification::PostNotification(CFStringRef inName, CFDiction
// flag unsupported features
Assert(inUserInfo == NULL, "CACFDistributedNotification::PostNotification: distributed notifications do not support a payload");
Assert(inPostToAllSessions, "CACFDistributedNotification::PostNotification: distributed notifications do not support per-session delivery");
-
+
CFNotificationCenterRef theCenter = CFNotificationCenterGetDarwinNotifyCenter();
CFDictionaryRef theUserInfo = NULL;
CFOptionFlags theFlags = 0;
#endif
-
+
CFNotificationCenterPostNotificationWithOptions(theCenter, inName, NULL, theUserInfo, theFlags);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h
index d75e23b..8132379 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h
@@ -2,14 +2,14 @@
File: CACFDistributedNotification.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFDistributedNotification_h__)
#define __CACFDistributedNotification_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp
index 9a33d5d..520c37a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp
@@ -2,14 +2,14 @@
File: CACFMachPort.cpp
Abstract: CACFMachPort.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -93,7 +93,7 @@ CACFMachPort::CACFMachPort(mach_port_t inMachPort, CFMachPortCallBack inCallBack
mOwnsPort(false)
{
CFMachPortContext theContext = { 1, inUserData, NULL, NULL, NULL };
-
+
if(inMachPort == MACH_PORT_NULL)
{
mMachPort = CFMachPortCreate(NULL, inCallBack, &theContext, NULL);
@@ -119,7 +119,7 @@ CACFMachPort::CACFMachPort(mach_port_t inMachPort, CFMachPortCallBack inCallBack
DebugMessage("CACFMachPort::CACFMachPort: couldn't create the CFRunLoopSource");
throw CAException('what');
}
-
+
if(inInvalidationCallBack != NULL)
{
CFMachPortSetInvalidationCallBack(mMachPort, inInvalidationCallBack);
@@ -132,7 +132,7 @@ CACFMachPort::~CACFMachPort()
{
CFRelease(mRunLoopSource);
}
-
+
if(mMachPort != NULL)
{
if(mOwnsPort)
@@ -162,7 +162,7 @@ kern_return_t CACFMachPort::ReceiveMessage(UInt32 inMaxMessageSize, mach_msg_hea
{
theOptions |= MACH_RCV_TIMEOUT;
}
-
+
// receive the messsage
return mach_msg(outMessage, theOptions, 0, inMaxMessageSize, thePort, inTimeOut, MACH_PORT_NULL);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h
index 18b8ccc..1eb11d2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h
@@ -2,14 +2,14 @@
File: CACFMachPort.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFMachPort_h__)
#define __CACFMachPort_h__
@@ -59,7 +59,7 @@
// CACFMachPort
//
// This class wraps a CFMachPort.
-//
+//
// Note that when you create a CFMachPort object, CF will attach the run loop source for the the
// Mach Port that handles Port Death notifications (aka the Invalidation Callback) to the current
// thread's run loop. This is something over which there is no control, so be sure to create the
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp
index 97b5da1..c56a7ac 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp
@@ -2,14 +2,14 @@
File: CACFMessagePort.cpp
Abstract: CACFMessagePort.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -123,7 +123,7 @@ CACFRemoteMessagePort::CACFRemoteMessagePort(CFStringRef inName, CFMessagePortIn
// because it isn't really an error since the port in question may not
// exist and this fact requires a more complex response than an excpeption
// provides for.
-
+
// add the invalidation callback, if any
if(inInvalidationCallBack != NULL)
{
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h
index c369251..e5b6dab 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h
@@ -2,14 +2,14 @@
File: CACFMessagePort.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFMessagePort_h__)
#define __CACFMessagePort_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp
index 36d1c2e..7bb8345 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp
@@ -2,14 +2,14 @@
File: CACFNumber.cpp
Abstract: CACFNumber.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -57,27 +57,27 @@
Float32 CACFNumber::GetFixed32() const
{
SInt32 theFixedValue = GetSInt32();
-
+
// this is a 16.16 value so convert it to a float
Float32 theSign = theFixedValue < 0 ? -1.0f : 1.0f;
theFixedValue *= (SInt32)theSign;
Float32 theWholePart = (theFixedValue & 0x7FFF0000) >> 16;
Float32 theFractPart = theFixedValue & 0x0000FFFF;
theFractPart /= 65536.0f;
-
+
return theSign * (theWholePart + theFractPart);
}
Float64 CACFNumber::GetFixed64() const
{
SInt64 theFixedValue = GetSInt64();
-
+
// this is a 32.32 value so convert it to a double
Float64 theSign = theFixedValue < 0 ? -1.0 : 1.0;
theFixedValue *= (SInt64)theSign;
Float64 theWholePart = (theFixedValue & 0x7FFFFFFF00000000LL) >> 32;
Float64 theFractPart = theFixedValue & 0x00000000FFFFFFFFLL;
theFractPart /= 4294967296.0;
-
+
return theSign * (theWholePart + theFractPart);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h
index 25887f6..8bf34b4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h
@@ -2,14 +2,14 @@
File: CACFNumber.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFNumber_h__)
#define __CACFNumber_h__
@@ -78,7 +78,7 @@ public:
private:
void Retain() { if(mWillRelease && (mCFBoolean != NULL)) { CFRetain(mCFBoolean); } }
void Release() { if(mWillRelease && (mCFBoolean != NULL)) { CFRelease(mCFBoolean); } }
-
+
CFBooleanRef mCFBoolean;
bool mWillRelease;
@@ -94,7 +94,7 @@ public:
CFBooleanRef CopyCFBoolean() const { if(mCFBoolean != NULL) { CFRetain(mCFBoolean); } return mCFBoolean; }
bool GetBoolean() const { bool theAnswer = false; if(mCFBoolean != NULL) { theAnswer = CFEqual(mCFBoolean, kCFBooleanTrue); } return theAnswer; }
-
+
CACFBoolean(const void*); // prevent accidental instantiation with a pointer via bool constructor
};
@@ -122,7 +122,7 @@ public:
private:
void Retain() { if(mWillRelease && (mCFNumber != NULL)) { CFRetain(mCFNumber); } }
void Release() { if(mWillRelease && (mCFNumber != NULL)) { CFRelease(mCFNumber); } }
-
+
CFNumberRef mCFNumber;
bool mWillRelease;
@@ -144,7 +144,7 @@ public:
Float32 GetFixed32() const;
Float64 GetFixed64() const;
SInt64 GetSInt64() const { SInt64 theAnswer = 0; if(mCFNumber != NULL) { CFNumberGetValue(mCFNumber, kCFNumberSInt64Type, &theAnswer); } return theAnswer; }
-
+
CACFNumber(const void*); // prevent accidental instantiation with a pointer via bool constructor
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h b/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h
index 748016b..7a4ed9d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h
@@ -2,14 +2,14 @@
File: CACFObject.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFObject_h__)
#define __CACFObject_h__
@@ -109,7 +109,7 @@ public:
private:
void Retain() { if(mWillRelease && (mCFObject != NULL)) { CFRetain(mCFObject); } }
void Release() { if(mWillRelease && (mCFObject != NULL)) { CFRelease(mCFObject); mCFObject = NULL; } }
-
+
CFObjectType mCFObject;
bool mWillRelease;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h b/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h
index babde13..5dcf2b1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h
@@ -2,14 +2,14 @@
File: CACFPlugIn.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFPlugIn_h__)
#define __CACFPlugIn_h__
@@ -75,7 +75,7 @@ public:
private:
void Retain() { if(mWillRelease && (mCFPlugIn != NULL)) { CFRetain(mCFPlugIn); } }
void Release() { if(mWillRelease && (mCFPlugIn != NULL)) { CFRelease(mCFPlugIn); mCFPlugIn = NULL; } }
-
+
CFPlugInRef mCFPlugIn;
bool mWillRelease;
@@ -84,7 +84,7 @@ public:
void AllowRelease() { mWillRelease = true; }
void DontAllowRelease() { mWillRelease = false; }
bool IsValid() const { return mCFPlugIn != NULL; }
-
+
CFBundleRef GetBundle() const { CFBundleRef theAnswer = NULL; if(IsValid()) { theAnswer = CFPlugInGetBundle(mCFPlugIn); } return theAnswer; }
CFStringRef CopyBundleID() const { CFStringRef theAnswer = NULL; CFBundleRef theBundle = GetBundle(); if(IsValid() && (theBundle != NULL)) { theAnswer = CFBundleGetIdentifier(theBundle); if(theAnswer != NULL) { CFRetain(theAnswer); } } return theAnswer; }
UInt32 GetBundleVersion() const { UInt32 theAnswer = 0; CFBundleRef theBundle = GetBundle(); if(IsValid() && (theBundle != NULL)) { theAnswer = CFBundleGetVersionNumber(theBundle); } return theAnswer; }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp
index cb2e86c..f605029 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp
@@ -2,14 +2,14 @@
File: CACFPreferences.cpp
Abstract: CACFPreferences.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -63,23 +63,23 @@ CFPropertyListRef CACFPreferences::CopyValue(CFStringRef inKey, bool inCurrentUs
{
// synchronize to make sure that what's in memory matches what's on disk
Synchronize(inCurrentUser, inCurrentHost, false);
-
+
CFPropertyListRef theAnswer = NULL;
CFStringRef theUser = inCurrentUser ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser;
CFStringRef theHost = inCurrentHost ? kCFPreferencesCurrentHost : kCFPreferencesAnyHost;
-
+
theAnswer = CFPreferencesCopyValue(inKey, kCFPreferencesAnyApplication, theUser, theHost);
-
+
return theAnswer;
}
CFStringRef CACFPreferences::CopyStringValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
{
CFStringRef theAnswer = NULL;
-
+
// get the raw value
CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-
+
if(theRawValue != NULL)
{
// get it's type ID and make sure it's a CFString
@@ -95,17 +95,17 @@ CFStringRef CACFPreferences::CopyStringValue(CFStringRef inKey, bool inCurrentUs
DebugMessage("CACFPreferences::CopyStringValue: not a CFString");
}
}
-
+
return theAnswer;
}
CFNumberRef CACFPreferences::CopyNumberValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
{
CFNumberRef theAnswer = NULL;
-
+
// get the raw value
CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-
+
if(theRawValue != NULL)
{
// get it's type ID and make sure it's a CFNumber
@@ -121,17 +121,17 @@ CFNumberRef CACFPreferences::CopyNumberValue(CFStringRef inKey, bool inCurrentUs
DebugMessage("CACFPreferences::CopyNumberValue: not a CFNumber");
}
}
-
+
return theAnswer;
}
CFArrayRef CACFPreferences::CopyArrayValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
{
CFArrayRef theAnswer = NULL;
-
+
// get the raw value
CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-
+
if(theRawValue != NULL)
{
// get it's type ID and make sure it's a CFArray
@@ -147,17 +147,17 @@ CFArrayRef CACFPreferences::CopyArrayValue(CFStringRef inKey, bool inCurrentUser
DebugMessage("CACFPreferences::CopyArrayValue: not a CFArray");
}
}
-
+
return theAnswer;
}
CFDictionaryRef CACFPreferences::CopyDictionaryValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
{
CFDictionaryRef theAnswer = NULL;
-
+
// get the raw value
CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-
+
if(theRawValue != NULL)
{
// get it's type ID and make sure it's a CFDictionary
@@ -173,7 +173,7 @@ CFDictionaryRef CACFPreferences::CopyDictionaryValue(CFStringRef inKey, bool inC
DebugMessage("CACFPreferences::CopyDictionaryValue: not a CFDictionary");
}
}
-
+
return theAnswer;
}
@@ -182,7 +182,7 @@ void CACFPreferences::SetValue(CFStringRef inKey, CFPropertyListRef inValue, boo
CFStringRef theUser = inCurrentUser ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser;
CFStringRef theHost = inCurrentHost ? kCFPreferencesCurrentHost : kCFPreferencesAnyHost;
CFPreferencesSetValue(inKey, inValue, kCFPreferencesAnyApplication, theUser, theHost);
-
+
if(inSynchronize)
{
Synchronize(inCurrentUser, inCurrentHost, true);
@@ -194,7 +194,7 @@ void CACFPreferences::DeleteValue(CFStringRef inKey, bool inCurrentUser, bool in
CFStringRef theUser = inCurrentUser ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser;
CFStringRef theHost = inCurrentHost ? kCFPreferencesCurrentHost : kCFPreferencesAnyHost;
CFPreferencesSetValue(inKey, NULL, kCFPreferencesAnyApplication, theUser, theHost);
-
+
if(inSynchronize)
{
Synchronize(theUser, inCurrentHost, true);
@@ -260,7 +260,7 @@ void CACFPreferences::SendNotification(CFStringRef inName)
bool CACFPreferences::ArePrefsOutOfDate(bool inCurrentUser, bool inCurrentHost)
{
bool theAnswer = false;
-
+
if(!inCurrentUser && !inCurrentHost)
{
theAnswer = sAnyUserAnyHostPrefsOutOfDate;
@@ -277,7 +277,7 @@ bool CACFPreferences::ArePrefsOutOfDate(bool inCurrentUser, bool inCurrentHost)
{
theAnswer = sCurrentUserCurrentHostPrefsOutOfDate;
}
-
+
return theAnswer;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h
index 040490f..53c1b91 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h
@@ -2,14 +2,14 @@
File: CACFPreferences.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFPreferences_h__)
#define __CACFPreferences_h__
@@ -81,7 +81,7 @@ public:
private:
static bool ArePrefsOutOfDate(bool inCurrentUser, bool inCurrentHost);
-
+
static bool sAnyUserAnyHostPrefsOutOfDate;
static bool sAnyUserCurrentHostPrefsOutOfDate;
static bool sCurrentUserAnyHostPrefsOutOfDate;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp
index 3ce81a5..b5328ae 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp
@@ -2,14 +2,14 @@
File: CACFString.cpp
Abstract: CACFString.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -57,13 +57,13 @@
UInt32 CACFString::GetStringByteLength(CFStringRef inCFString, CFStringEncoding inEncoding)
{
CFIndex theAnswer = 0;
-
+
if(inCFString != NULL)
{
CFRange theRange = { 0, CFStringGetLength(inCFString) };
CFStringGetBytes(inCFString, theRange, inEncoding, 0, false, NULL, 0x7FFFFFFF, &theAnswer);
}
-
+
return UInt32(theAnswer);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFString.h b/libs/appleutility/CoreAudio/PublicUtility/CACFString.h
index 3abce51..65127d7 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFString.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFString.h
@@ -2,14 +2,14 @@
File: CACFString.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CACFString_h__)
#define __CACFString_h__
@@ -89,7 +89,7 @@ public:
private:
void Retain() { if(mWillRelease && (mCFString != NULL)) { CFRetain(mCFString); } }
void Release() { if(mWillRelease && (mCFString != NULL)) { CFRelease(mCFString); } }
-
+
CFStringRef mCFString;
bool mWillRelease;
@@ -121,7 +121,7 @@ public:
static void GetUnicodeString(CFStringRef inCFString, UInt16* outString, UInt32& ioStringSize);
static SInt32 GetAsInteger(CFStringRef inCFString) { SInt32 theAnswer = 0; if(inCFString != NULL){ theAnswer = CFStringGetIntValue(inCFString); } return theAnswer; }
static Float64 GetAsFloat64(CFStringRef inCFString) { Float64 theAnswer = 0; if(inCFString != NULL){ theAnswer = CFStringGetDoubleValue(inCFString); } return theAnswer; }
-
+
};
inline bool operator<(const CACFString& x, const CACFString& y) { return CFStringCompare(x.GetCFString(), y.GetCFString(), 0) == kCFCompareLessThan; }
@@ -166,7 +166,7 @@ public:
private:
void Retain() { if(mWillRelease && (mCFMutableString != NULL)) { CFRetain(mCFMutableString); } }
void Release() { if(mWillRelease && (mCFMutableString != NULL)) { CFRelease(mCFMutableString); } }
-
+
CFMutableStringRef mCFMutableString;
bool mWillRelease;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp
index 04eae54..77913c4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp
@@ -2,14 +2,14 @@
File: CAComponent.cpp
Abstract: CAComponent.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAComponent.h"
#include "CAComponentDescription.h"
@@ -60,21 +60,21 @@ CAComponent::CAComponent (const AudioComponentDescription& inDesc, CAComponent*
memcpy (&mDesc, &inDesc, sizeof(AudioComponentDescription));
}
-CAComponent::CAComponent (const AudioComponent& comp)
+CAComponent::CAComponent (const AudioComponent& comp)
: mComp (comp),
- mManuName(0),
- mAUName(0),
+ mManuName(0),
+ mAUName(0),
mCompName(0)
{
AudioComponentGetDescription (Comp(), &mDesc);
}
-CAComponent::CAComponent (const AudioComponentInstance& compInst)
- : mComp (NULL),
- mManuName(0),
- mAUName(0),
+CAComponent::CAComponent (const AudioComponentInstance& compInst)
+ : mComp (NULL),
+ mManuName(0),
+ mAUName(0),
mCompName(0)
-{
+{
mComp = AudioComponentInstanceGetComponent (compInst);
AudioComponentGetDescription (Comp(), &mDesc);
}
@@ -113,7 +113,7 @@ CAComponent& CAComponent::operator= (const CAComponent& y)
if (y.mManuName) { mManuName = y.mManuName; CFRetain (mManuName); }
if (y.mAUName) { mAUName = y.mAUName; CFRetain (mAUName); }
- if (y.mCompName) { mCompName = y.mCompName; CFRetain (mCompName); }
+ if (y.mCompName) { mCompName = y.mCompName; CFRetain (mCompName); }
return *this;
}
@@ -121,33 +121,33 @@ CAComponent& CAComponent::operator= (const CAComponent& y)
void CAComponent::SetCompNames () const
{
if (!mCompName) {
-
+
CFStringRef compName;
OSStatus result = AudioComponentCopyName (Comp(), &compName);
if (result) return;
-
+
const_cast<CAComponent*>(this)->mCompName = compName;
if (compName)
{
CFArrayRef splitStrArray = CFStringCreateArrayBySeparatingStrings(NULL, compName, CFSTR(":"));
-
+
// we need to retain these values so the strings are not lost when the array is released
const_cast<CAComponent*>(this)->mManuName = (CFStringRef)CFArrayGetValueAtIndex(splitStrArray, 0);
CFRetain(this->mManuName);
if (CFArrayGetCount(splitStrArray) > 1)
{
CFStringRef str = (CFStringRef)CFArrayGetValueAtIndex(splitStrArray, 1);
-
+
CFMutableStringRef mstr = CFStringCreateMutableCopy (NULL, CFStringGetLength(str), str);
// this needs to trim out white space:
-
+
CFStringTrimWhitespace (mstr);
-
+
const_cast<CAComponent*>(this)->mAUName = mstr;
} else
const_cast<CAComponent*>(this)->mAUName = NULL;
-
+
CFRelease(splitStrArray);
}
}
@@ -177,6 +177,6 @@ void CAComponent::Print(FILE* file) const
fprintf (file, ", Manu:"); _ShowCF (file, mManuName);
if (mAUName) fprintf (file, ", Name:"); _ShowCF (file, mAUName);
}
- fprintf (file, ", ");
+ fprintf (file, ", ");
Desc ().Print(file);
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h
index 5ff24ee..17bbb61 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h
@@ -2,14 +2,14 @@
File: CAComponent.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAComponent_h__
#define __CAComponent_h__
@@ -54,63 +54,63 @@
#include "CAComponentDescription.h"
-class CAComponent
+class CAComponent
{
public:
CAComponent ()
: mComp (0), mDesc(), mManuName(0), mAUName(0), mCompName(0) {}
-
+
// if next is specifed that is used to find the next component after that one
CAComponent (const AudioComponentDescription& inDesc, CAComponent* next = 0);
-
- CAComponent (const CAComponent& y)
+
+ CAComponent (const CAComponent& y)
: mComp (0), mDesc(), mManuName(0), mAUName(0), mCompName(0) { *this = y; }
CAComponent (const AudioComponent& comp);
-
+
CAComponent (const AudioComponentInstance& compInst);
CAComponent (OSType inType, OSType inSubtype = 0, OSType inManu = 0);
-
+
~CAComponent ();
-
+
CAComponent& operator= (const CAComponent& y);
-
+
// returns true if this object references a valid component
bool IsValid () const { return Comp() != 0; }
-
+
bool HasAUStrings() const { SetCompNames (); return mManuName != 0; }
// CFStringRef should be retained by caller if needed beyond lifetime of this object
-
+
// Can return NULL if component doesn't follow AU naming conventions
CFStringRef GetAUManu () const { SetCompNames (); return mManuName; }
CFStringRef GetAUName () const { SetCompNames (); return mAUName ? mAUName : mCompName; }
-
+
// Return value of NULL indicates a problem getting that information from the component
CFStringRef GetCompName () const { SetCompNames(); return mCompName; }
-
+
const CAComponentDescription& Desc () const { return mDesc; }
-
- OSStatus Open (AudioComponentInstance& outInst) const
+
+ OSStatus Open (AudioComponentInstance& outInst) const
{
return AudioComponentInstanceNew (Comp(), &outInst);
}
OSStatus GetVersion (UInt32 &outVersion) const;
-
+
const AudioComponent& Comp() const { return mComp; }
-
+
void Print(FILE* file = stdout) const;
OSStatus Save (CFPropertyListRef *outData) const;
-
+
OSStatus Restore (CFPropertyListRef &inData);
-
+
private:
AudioComponent mComp;
CAComponentDescription mDesc;
-
+
CFStringRef mManuName, mAUName, mCompName;
void SetCompNames () const;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp
index a3c877b..53dae27 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp
@@ -2,14 +2,14 @@
File: CAComponentDescription.cpp
Abstract: CAComponentDescription.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAComponentDescription.h"
#include "CAStreamBasicDescription.h"
@@ -60,7 +60,7 @@ void CAComponentDescription::_CAShowComponentDescription(const AudioComponentDe
char str[24];
fprintf (file, "AudioComponentDescription: %s - ", CAStringForOSType(desc->componentType, str, sizeof(str)));
fprintf (file, "%s - ", CAStringForOSType(desc->componentSubType, str, sizeof(str)));
- fprintf (file, "%s", CAStringForOSType(desc->componentManufacturer, str, sizeof(str)));
+ fprintf (file, "%s", CAStringForOSType(desc->componentManufacturer, str, sizeof(str)));
fprintf (file, ", 0x%X, 0x%X\n", (int)desc->componentFlags, (int)desc->componentFlagsMask);
}
}
@@ -74,11 +74,11 @@ CAComponentDescription::CAComponentDescription (OSType inType, OSType inSubtype,
componentFlagsMask = 0;
}
-bool CAComponentDescription::IsAU () const
-{
+bool CAComponentDescription::IsAU () const
+{
bool flag = IsEffect() || IsMusicDevice() || IsOffline();
if (flag) return true;
-
+
switch (componentType) {
case kAudioUnitType_Output:
case kAudioUnitType_FormatConverter:
@@ -90,21 +90,21 @@ bool CAComponentDescription::IsAU () const
inline bool _MatchTest (const OSType &inTypeA, const OSType &inTypeB)
{
- return ((inTypeA == inTypeB) || (!inTypeA && !inTypeB) || (inTypeA && !inTypeB) || (!inTypeA && inTypeB));
+ return ((inTypeA == inTypeB) || (!inTypeA && !inTypeB) || (inTypeA && !inTypeB) || (!inTypeA && inTypeB));
}
bool CAComponentDescription::Matches (const AudioComponentDescription &desc) const
{
bool matches = false;
-
+
// see if the type matches
matches = _MatchTest (componentType, desc.componentType);
-
+
if (matches)
matches = _MatchTest (componentSubType, desc.componentSubType);
-
+
if (matches)
matches = _MatchTest (componentManufacturer, desc.componentManufacturer);
-
+
return matches;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h
index 5c756ea..1531129 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h
@@ -2,14 +2,14 @@
File: CAComponentDescription.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAComponentDescription_h__
#define __CAComponentDescription_h__
@@ -66,57 +66,57 @@ void CAShowComponentDescription(const AudioComponentDescription *desc);
class CAComponentDescription : public AudioComponentDescription {
public:
CAComponentDescription() { memset (this, 0, sizeof (AudioComponentDescription)); }
-
+
CAComponentDescription (OSType inType, OSType inSubtype = 0, OSType inManu = 0);
CAComponentDescription(const AudioComponentDescription& desc) { memcpy (this, &desc, sizeof (AudioComponentDescription)); }
-
+
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
//
// interrogation
-
+
bool IsAU () const;
-
+
bool IsAUFX() const { return componentType == kAudioUnitType_Effect; }
bool IsAUFM() const { return componentType == kAudioUnitType_MusicEffect; }
-
+
bool IsAUMI() const { return componentType == 'aumi' /*kAudioUnitType_MIDIProcessor*/; }
-
+
bool IsAUAX () const { return componentType == 'auax' /*kAudioUnitType_Auxiliary*/; }
-
+
bool IsEffect () const { return IsAUFX() || IsAUFM() || IsPanner(); }
-
+
bool IsOffline () const { return componentType == 'auol' /*kAudioUnitType_Offline*/; }
-
+
bool IsFConv () const { return componentType == kAudioUnitType_FormatConverter; }
-
+
bool IsPanner () const { return componentType == kAudioUnitType_Panner; }
-
+
bool IsMusicDevice () const { return componentType == kAudioUnitType_MusicDevice; }
-
+
#ifndef MAC_OS_X_VERSION_10_4
bool IsGenerator () const { return componentType =='augn'; }
#else
bool IsGenerator () const { return componentType ==kAudioUnitType_Generator; }
#endif
-
+
bool IsOutput () const { return componentType == kAudioUnitType_Output; }
-
+
bool IsSource () const { return IsMusicDevice() || IsGenerator(); }
-
+
OSType Type () const { return componentType; }
OSType SubType () const { return componentSubType; }
OSType Manu () const { return componentManufacturer; }
int Count() const { return AudioComponentCount(const_cast<CAComponentDescription*>(this)); }
-
+
// does a semantic match where "wild card" values for type, subtype, manu will match
bool Matches (const AudioComponentDescription &desc) const;
-
+
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
//
// other
-
+
void Print(FILE* file = stdout) const { _CAShowComponentDescription (this, file); }
OSStatus Save (CFPropertyListRef *outData) const;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp
index 9739e37..f60b54d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp
@@ -2,14 +2,14 @@
File: CADebugMacros.cpp
Abstract: CADebugMacros.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CADebugMacros.h"
#include <stdio.h>
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h
index 15af919..980f6b5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h
@@ -2,14 +2,14 @@
File: CADebugMacros.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CADebugMacros_h__)
#define __CADebugMacros_h__
@@ -95,7 +95,7 @@
#if DEBUG || CoreAudio_Debug
// can be used to break into debugger immediately, also see CADebugger
#define BusError() { long* p=NULL; *p=0; }
-
+
// basic debugging print routines
#if TARGET_OS_MAC && !TARGET_API_MAC_CARBON
extern void DebugStr(const unsigned char* debuggerMsg);
@@ -105,13 +105,13 @@
#define DebugMessageN3(msg, N1, N2, N3)
#else
#include "CADebugPrintf.h"
-
+
#if (CoreAudio_FlushDebugMessages && !CoreAudio_UseSysLog) || defined(CoreAudio_UseSideFile)
#define FlushRtn ,fflush(DebugPrintfFile)
#else
#define FlushRtn
#endif
-
+
#if CoreAudio_ThreadStampMessages
#include <pthread.h>
#include "CAHostTimeBase.h"
@@ -137,7 +137,7 @@
#else
#define vprint(msg)
#endif
-
+
// Original macro keeps its function of turning on and off use of CADebuggerStop() for both asserts and throws.
// For backwards compat, it overrides any setting of the two sub-macros.
#if CoreAudio_StopOnFailure
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp
index d691de3..b401c3a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp
@@ -2,14 +2,14 @@
File: CADebugPrintf.cpp
Abstract: CADebugPrintf.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -69,7 +69,7 @@
return 0;
}
#endif
-
+
#if defined(CoreAudio_UseSideFile)
#include <unistd.h>
FILE* sDebugPrintfSideFile = NULL;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h
index 79aa15d..905d0f2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h
@@ -2,14 +2,14 @@
File: CADebugPrintf.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CADebugPrintf_h__)
#define __CADebugPrintf_h__
@@ -65,14 +65,14 @@
//#define CoreAudio_UseSideFile "/CoreAudio-%d.txt"
#if DEBUG || CoreAudio_Debug
-
+
#if TARGET_OS_WIN32
#if defined(__cplusplus)
extern "C"
#endif
extern int CAWin32DebugPrintf(char* inFormat, ...);
#define DebugPrintfRtn CAWin32DebugPrintf
- #define DebugPrintfFile
+ #define DebugPrintfFile
#define DebugPrintfLineEnding "\n"
#define DebugPrintfFileComma
#else
@@ -104,9 +104,9 @@
#define DebugPrintf(inFormat, ...) DebugPrintfRtn(DebugPrintfFileComma inFormat DebugPrintfLineEnding, ## __VA_ARGS__)
#else
- #define DebugPrintfRtn
- #define DebugPrintfFile
- #define DebugPrintfLineEnding
+ #define DebugPrintfRtn
+ #define DebugPrintfFile
+ #define DebugPrintfLineEnding
#define DebugPrintfFileComma
#define DebugPrintf(inFormat, ...)
#endif
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp
index 7f0141d..eb690a5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp
@@ -2,14 +2,14 @@
File: CADebugger.cpp
Abstract: CADebugger.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h
index 9391f01..6c07514 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h
@@ -2,14 +2,14 @@
File: CADebugger.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CADebugger_h__)
#define __CADebugger_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAException.h b/libs/appleutility/CoreAudio/PublicUtility/CAException.h
index 7217001..26b3af1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAException.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAException.h
@@ -2,14 +2,14 @@
File: CAException.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAException_h__)
#define __CAException_h__
@@ -71,7 +71,7 @@ public:
~CAException() {}
OSStatus GetError() const { return mError; }
-
+
protected:
OSStatus mError;
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h b/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h
index f1aa56f..bf0c7e1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h
@@ -2,14 +2,14 @@
File: CAExtAudioFile.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAExtAudioFile_h__
#define __CAExtAudioFile_h__
@@ -74,9 +74,9 @@ public:
{
Close();
}
-
+
bool IsValid() const { return mExtAudioFile != NULL; }
-
+
void Open(const char* filename)
{
Close();
@@ -88,7 +88,7 @@ public:
Check(res, "ExtAudioFileOpenURL");
CFRelease (url);
}
-
+
// this group of methods maps directly to the API other than OSStatus results translating into exceptions.
// you must explicitly open, wrap or create a file.
void OpenURL(CFURLRef url)
@@ -96,7 +96,7 @@ public:
Close();
Check(ExtAudioFileOpenURL(url, &mExtAudioFile), "ExtAudioFileOpenURL");
}
-
+
void WrapAudioFileID(AudioFileID inFileID, Boolean forWriting)
{
Close();
@@ -114,7 +114,7 @@ public:
Check(res, "ExtAudioFileCreateWithURL");
CFRelease(url);
}
-
+
void CreateWithURL(CFURLRef url, AudioFileTypeID filetype, const AudioStreamBasicDescription &streamDesc, const AudioChannelLayout *channelLayout, UInt32 flags)
{
Close();
@@ -129,12 +129,12 @@ public:
mExtAudioFile = NULL;
}
}
-
+
void Read(UInt32 &ioNumberFrames, AudioBufferList *ioData)
{
Check(ExtAudioFileRead(mExtAudioFile, &ioNumberFrames, ioData), "ExtAudioFileRead");
}
-
+
OSStatus Write(UInt32 inNumberFrames, const AudioBufferList *ioData)
{
OSStatus err = ExtAudioFileWrite(mExtAudioFile, inNumberFrames, ioData);
@@ -154,41 +154,41 @@ public:
}
return err;
}
-
+
void WriteAsync(UInt32 inNumberFrames, const AudioBufferList *ioData)
{
Check(ExtAudioFileWriteAsync(mExtAudioFile, inNumberFrames, ioData), "ExtAudioFileWriteAsync");
}
-
+
void Seek(SInt64 inFrameOffset)
{
Check(ExtAudioFileSeek(mExtAudioFile, inFrameOffset), "ExtAudioFileSeek");
}
-
+
SInt64 Tell() const
{
SInt64 pos;
Check(ExtAudioFileTell(mExtAudioFile, &pos), "ExtAudioFileTell");
return pos;
}
-
+
UInt32 GetPropertyInfo(ExtAudioFilePropertyID propid, Boolean *outWritable) const
{
UInt32 size;
CheckProperty(ExtAudioFileGetPropertyInfo(mExtAudioFile, propid, &size, outWritable), "ExtAudioFileGetPropertyInfo", propid);
return size;
}
-
+
void GetProperty(ExtAudioFilePropertyID propid, UInt32 &ioSize, void *outData) const
{
CheckProperty(ExtAudioFileGetProperty(mExtAudioFile, propid, &ioSize, outData), "ExtAudioFileGetProperty", propid);
}
-
+
void SetProperty(ExtAudioFilePropertyID propid, UInt32 size, const void *inData)
{
CheckProperty(ExtAudioFileSetProperty(mExtAudioFile, propid, size, inData), "ExtAudioFileSetProperty", propid);
}
-
+
const CAAudioChannelLayout &GetFileChannelLayout()
{
return FetchChannelLayout(mFileChannelLayout, kExtAudioFileProperty_FileChannelLayout);
@@ -204,13 +204,13 @@ public:
GetProperty(kExtAudioFileProperty_FileDataFormat, size, &mFileDataFormat);
return mFileDataFormat;
}
-
+
const CAStreamBasicDescription &GetClientDataFormat() {
UInt32 size = sizeof(mClientDataFormat);
GetProperty(kExtAudioFileProperty_ClientDataFormat, size, &mClientDataFormat);
return mClientDataFormat;
}
-
+
void SetClientFormat(const CAStreamBasicDescription &dataFormat, const CAAudioChannelLayout *layout=NULL, UInt32 codecManuf=0) {
if (codecManuf != 0)
@@ -219,11 +219,11 @@ public:
if (layout)
SetClientChannelLayout(*layout);
}
-
+
void SetClientChannelLayout(const CAAudioChannelLayout &layout) {
SetProperty(kExtAudioFileProperty_ClientChannelLayout, layout.Size(), &layout.Layout());
}
-
+
AudioConverterRef GetConverter() const {
UInt32 size = sizeof(AudioConverterRef);
AudioConverterRef converter = NULL;
@@ -232,7 +232,7 @@ public:
}
bool HasConverter() const { return GetConverter() != NULL; }
-
+
OSStatus SetConverterProperty(AudioConverterPropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData, bool inCanFail=false)
{
OSStatus err = AudioConverterSetProperty(GetConverter(), inPropertyID, inPropertyDataSize, inPropertyData);
@@ -245,14 +245,14 @@ public:
}
return err;
}
-
+
SInt64 GetNumberFrames() {
SInt64 length;
UInt32 size = sizeof(SInt64);
GetProperty(kExtAudioFileProperty_FileLengthFrames, size, &length);
return length;
}
-
+
protected:
virtual void Check(OSStatus err, const char *func) const
@@ -263,7 +263,7 @@ protected:
throw CAXException(txt, err);
}
}
-
+
virtual void CheckProperty(OSStatus err, const char *func, UInt32 propid) const
{
if (err) {
@@ -289,7 +289,7 @@ private:
private:
ExtAudioFileRef mExtAudioFile;
-
+
// for convenience to the client, it helps if we hold onto some storage for these
CAStreamBasicDescription mFileDataFormat;
CAAudioChannelLayout mFileChannelLayout;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp
index 124cb21..1d46f29 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp
@@ -2,14 +2,14 @@
File: CAFilePathUtils.cpp
Abstract: CAFilePathUtils.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAFilePathUtils.h"
#include <string.h>
@@ -72,16 +72,16 @@ OSStatus PosixPathToParentFSRefAndName(const char *path, FSRef &outParentDir, CF
// get the directory's FSRef
OSStatus err = CFURLGetFSRef(dirurl, &outParentDir) ? OSStatus(noErr) : OSStatus(kAudio_FileNotFoundError);
CFRelease(dirurl);
-
+
CFStringRef lastPathComponent = CFURLCopyLastPathComponent(fullurl);
CFRelease(fullurl);
CFMutableStringRef filename = CFStringCreateMutableCopy(NULL, 0, lastPathComponent);
CFRelease(lastPathComponent);
// convert colons (legal in POSIX paths, illegal in File Manager) to slashes
CFStringFindAndReplace(filename, CFSTR(":"), CFSTR("/"), CFRangeMake(0, CFStringGetLength(filename)), 0);
-
+
outFileName = filename;
-
+
return err;
}
#endif // !CA_NO_CORE_SERVICES
@@ -92,29 +92,29 @@ OSStatus PosixPathToParentFSRefAndName(const char *path, FSRef &outParentDir, CF
char* dirname(const char* inPath)
{
static char sAnswer[1024];
-
+
char* theAnswer = NULL;
SInt32 thePathLength = strlen(inPath);
if(thePathLength < 1023)
{
// make a working copy
strlcpy(sAnswer, inPath, sizeof(sAnswer));
-
+
// start at the end of the string
SInt32 theIndex = thePathLength - 1;
-
+
// walk back over the '\' characters
while((theIndex > 0) && (sAnswer[theIndex] == '\\'))
{
--theIndex;
}
-
+
// now keep walking back until we get to a '\'
while((theIndex > 0) && (sAnswer[theIndex] != '\\'))
{
--theIndex;
}
-
+
// where we are now is either the first character of the path or the '\' that marks the end of the directory name
if(theIndex > 0)
{
@@ -127,34 +127,34 @@ char* dirname(const char* inPath)
sAnswer[0] = '.';
sAnswer[1] = 0;
}
-
+
// set the return value
theAnswer = sAnswer;
}
-
+
return theAnswer;
}
char* basename(const char* inPath)
{
static char sAnswer[1024];
-
+
char* theAnswer = NULL;
SInt32 thePathLength = strlen(inPath);
if(thePathLength < 1023)
{
// make a working copy
strlcpy(sAnswer, inPath, sizeof(sAnswer));
-
+
// start at the end of the string
SInt32 theLastIndex = thePathLength - 1;
-
+
// walk back over the '\' characters
while((theLastIndex > 0) && (sAnswer[theLastIndex] == '\\'))
{
--theLastIndex;
}
-
+
// check to see if we're at the beginning now
if(theLastIndex > 0)
{
@@ -164,10 +164,10 @@ char* basename(const char* inPath)
{
--theFirstIndex;
}
-
+
// we now have a string, so put a '\0' after the last character
sAnswer[theLastIndex + 1] = 0;
-
+
// and set the return value
theAnswer = &sAnswer[theFirstIndex];
}
@@ -176,12 +176,12 @@ char* basename(const char* inPath)
// the path was entirely '\' characters, so the return value is "\"
sAnswer[0] = '\\';
sAnswer[1] = 0;
-
+
// set the return value
theAnswer = sAnswer;
}
}
-
+
return theAnswer;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h
index 41f1ee0..53597a1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h
@@ -2,14 +2,14 @@
File: CAFilePathUtils.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAFilePathUtils_h__
#define __CAFilePathUtils_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp
index a1c83be..1c766f9 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp
@@ -2,14 +2,14 @@
File: CAGuard.cpp
Abstract: CAGuard.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -169,7 +169,7 @@ bool CAGuard::WaitFor(UInt64 inNanos)
theTimeSpec.tv_sec = 0;
theTimeSpec.tv_nsec = static_cast<long>(inNanos);
}
-
+
#if Log_TimedWaits || Log_Latency || Log_Average_Latency
UInt64 theStartNanos = CAHostTimeBase::GetCurrentTimeInNanos();
#endif
@@ -183,19 +183,19 @@ bool CAGuard::WaitFor(UInt64 inNanos)
OSStatus theError = pthread_cond_timedwait_relative_np(&mCondVar, &mMutex, &theTimeSpec);
ThrowIf((theError != 0) && (theError != ETIMEDOUT), CAException(theError), "CAGuard::WaitFor: Wait got an error");
mOwner = pthread_self();
-
+
#if Log_TimedWaits || Log_Latency || Log_Average_Latency
UInt64 theEndNanos = CAHostTimeBase::GetCurrentTimeInNanos();
#endif
-
+
#if Log_TimedWaits
DebugMessageN1("CAGuard::WaitFor: waited %.0f", (Float64)(theEndNanos - theStartNanos));
#endif
-
+
#if Log_Latency
DebugMessageN1("CAGuard::WaitFor: latency %.0f", (Float64)((theEndNanos - theStartNanos) - inNanos));
#endif
-
+
#if Log_Average_Latency
++mAverageLatencyCount;
mAverageLatencyAccumulator += (theEndNanos - theStartNanos) - inNanos;
@@ -231,7 +231,7 @@ bool CAGuard::WaitFor(UInt64 inNanos)
#if Log_WaitOwnership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAGuard::WaitFor: thread %lu is waiting on %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
-
+
ReleaseMutex(mMutex);
HANDLE theHandles[] = { mMutex, mEvent };
OSStatus theError = WaitForMultipleObjects(2, theHandles, true, theWaitTime);
@@ -246,15 +246,15 @@ bool CAGuard::WaitFor(UInt64 inNanos)
#if Log_TimedWaits || Log_Latency || Log_Average_Latency
UInt64 theEndNanos = CAHostTimeBase::GetCurrentTimeInNanos();
#endif
-
+
#if Log_TimedWaits
DebugMessageN1("CAGuard::WaitFor: waited %.0f", (Float64)(theEndNanos - theStartNanos));
#endif
-
+
#if Log_Latency
DebugMessageN1("CAGuard::WaitFor: latency %.0f", (Float64)((theEndNanos - theStartNanos) - inNanos));
#endif
-
+
#if Log_Average_Latency
++mAverageLatencyCount;
mAverageLatencyAccumulator += (theEndNanos - theStartNanos) - inNanos;
@@ -280,11 +280,11 @@ bool CAGuard::WaitUntil(UInt64 inNanos)
{
bool theAnswer = false;
UInt64 theCurrentNanos = CAHostTimeBase::GetCurrentTimeInNanos();
-
+
#if Log_TimedWaits
DebugMessageN2("CAGuard::WaitUntil: now: %.0f, requested: %.0f", (double)theCurrentNanos, (double)inNanos);
#endif
-
+
if(inNanos > theCurrentNanos)
{
#if Log_Errors
@@ -319,7 +319,7 @@ void CAGuard::Notify()
#if Log_WaitOwnership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAGuard::Notify: thread %lu is notifying %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
-
+
SetEvent(mEvent);
#endif
}
@@ -337,7 +337,7 @@ void CAGuard::NotifyAll()
#if Log_WaitOwnership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAGuard::NotifyAll: thread %lu is notifying %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
-
+
SetEvent(mEvent);
#endif
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h
index ffcb59d..f6d80ec 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h
@@ -2,14 +2,14 @@
File: CAGuard.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAGuard_h__)
#define __CAGuard_h__
@@ -83,7 +83,7 @@ public:
virtual void Wait();
virtual bool WaitFor(UInt64 inNanos);
virtual bool WaitUntil(UInt64 inNanos);
-
+
virtual void Notify();
virtual void NotifyAll();
@@ -98,34 +98,34 @@ protected:
Float64 mAverageLatencyAccumulator;
UInt32 mAverageLatencyCount;
#endif
-
+
// Helper class to manage taking and releasing recursively
public:
class Locker
{
-
+
// Construction/Destruction
public:
Locker(CAGuard& inGuard) : mGuard(inGuard), mNeedsRelease(false) { mNeedsRelease = mGuard.Lock(); }
~Locker() { if(mNeedsRelease) { mGuard.Unlock(); } }
-
+
private:
Locker(const Locker&);
Locker& operator=(const Locker&);
-
+
// Actions
public:
void Wait() { mGuard.Wait(); }
bool WaitFor(UInt64 inNanos) { return mGuard.WaitFor(inNanos); }
bool WaitUntil(UInt64 inNanos) { return mGuard.WaitUntil(inNanos); }
-
+
void Notify() { mGuard.Notify(); }
void NotifyAll() { mGuard.NotifyAll(); }
// Implementation
private:
CAGuard& mGuard;
- bool mNeedsRelease;
+ bool mNeedsRelease;
};
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp
index 9bce346..fe668b9 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp
@@ -2,14 +2,14 @@
File: CAHALAudioDevice.cpp
Abstract: CAHALAudioDevice.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -544,7 +544,7 @@ void CAHALAudioDevice::StartIOProcAtTime(AudioDeviceIOProcID inIOProcID, AudioTi
{
theFlags |= kAudioDeviceStartTimeDontConsultDeviceFlag;
}
-
+
OSStatus theError = AudioDeviceStartAtTime(mObjectID, inIOProcID, &ioStartTime, theFlags);
ThrowIfError(theError, CAException(theError), "CAHALAudioDevice::StartIOProcAtTime: got an error starting an IOProc");
}
@@ -561,15 +561,15 @@ void CAHALAudioDevice::GetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool
UInt32 theNumberStreams = GetNumberStreams(inIsInput);
UInt32 theSize = SizeOf32(void*) + SizeOf32(UInt32) + (theNumberStreams * SizeOf32(UInt32));
CAAutoFree<AudioHardwareIOProcStreamUsage> theStreamUsage(theSize);
-
+
// set it up
theStreamUsage->mIOProc = reinterpret_cast<void*>(inIOProcID);
theStreamUsage->mNumberStreams = theNumberStreams;
-
+
// get the property
CAPropertyAddress theAddress(kAudioDevicePropertyIOProcStreamUsage, inIsInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput);
GetPropertyData(theAddress, 0, NULL, theSize, theStreamUsage);
-
+
// fill out the return value
for(UInt32 theIndex = 0; theIndex < theNumberStreams; ++theIndex)
{
@@ -583,7 +583,7 @@ void CAHALAudioDevice::SetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool
UInt32 theNumberStreams = GetNumberStreams(inIsInput);
UInt32 theSize = SizeOf32(void*) + SizeOf32(UInt32) + (theNumberStreams * SizeOf32(UInt32));
CAAutoFree<AudioHardwareIOProcStreamUsage> theStreamUsage(theSize);
-
+
// set it up
theStreamUsage->mIOProc = reinterpret_cast<void*>(inIOProcID);
theStreamUsage->mNumberStreams = theNumberStreams;
@@ -591,7 +591,7 @@ void CAHALAudioDevice::SetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool
{
theStreamUsage->mStreamIsOn[theIndex] = (inStreamUsage[theIndex] ? 1 : 0);
}
-
+
// set the property
CAPropertyAddress theAddress(kAudioDevicePropertyIOProcStreamUsage, inIsInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput);
SetPropertyData(theAddress, 0, NULL, theSize, theStreamUsage);
@@ -635,7 +635,7 @@ void CAHALAudioDevice::GetNearestStartTime(AudioTimeStamp& ioTime, bool inIsInpu
{
theFlags |= kAudioDeviceStartTimeDontConsultDeviceFlag;
}
-
+
OSStatus theError = AudioDeviceGetNearestStartTime(mObjectID, &ioTime, theFlags);
ThrowIfError(theError, CAException(theError), "CAHALAudioDevice::GetNearestStartTime: got an error getting the start time");
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h
index 8cfb466..ea7a438 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h
@@ -2,14 +2,14 @@
File: CAHALAudioDevice.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAHALAudioDevice_h__)
#define __CAHALAudioDevice_h__
@@ -108,7 +108,7 @@ public:
UInt32 GetTotalNumberChannels(bool inIsInput) const;
void GetCurrentVirtualFormats(bool inIsInput, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
void GetCurrentPhysicalFormats(bool inIsInput, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
-
+
// IO Stuff
public:
bool IsRunning() const;
@@ -141,7 +141,7 @@ public:
void SetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool inIsInput, const bool* inStreamUsage);
Float32 GetIOCycleUsage() const;
void SetIOCycleUsage(Float32 inValue);
-
+
// Time Operations
public:
void GetCurrentTime(AudioTimeStamp& outTime);
@@ -158,7 +158,7 @@ public:
void SetVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
Float32 GetVolumeControlScalarForDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
Float32 GetVolumeControlDecibelForScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
-
+
bool HasSubVolumeControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool SubVolumeControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
Float32 GetSubVolumeControlScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
@@ -167,31 +167,31 @@ public:
void SetSubVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
Float32 GetSubVolumeControlScalarForDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
Float32 GetSubVolumeControlDecibelForScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
-
+
bool HasMuteControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool MuteControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool GetMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
void SetMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
-
+
bool HasSoloControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool SoloControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool GetSoloControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
void SetSoloControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
-
+
bool HasStereoPanControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool StereoPanControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
Float32 GetStereoPanControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
void SetStereoPanControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
void GetStereoPanControlChannels(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32& outLeftChannel, UInt32& outRightChannel) const;
-
+
bool HasJackControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool GetJackControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
-
+
bool HasSubMuteControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool SubMuteControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool GetSubMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
void SetSubMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
-
+
bool HasiSubOwnerControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool iSubOwnerControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
bool GetiSubOwnerControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
@@ -224,7 +224,7 @@ public:
UInt32 GetAvailableClockSourceByIndex(UInt32 inIndex) const;
CFStringRef CopyClockSourceNameForID(UInt32 inID) const;
UInt32 GetClockSourceKindForID(UInt32 inID) const;
-
+
};
inline AudioDeviceIOProcID CAHALAudioDevice::CreateIOProcIDWithBlock(dispatch_queue_t inDispatchQueue, AudioDeviceIOBlock inIOBlock)
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp
index c8f16b4..3e3255e 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp
@@ -2,14 +2,14 @@
File: CAHALAudioObject.cpp
Abstract: CAHALAudioObject.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -85,17 +85,17 @@ AudioClassID CAHALAudioObject::GetClassID() const
{
// set up the return value
AudioClassID theAnswer = 0;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyClass);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
UInt32 theSize = sizeof(AudioClassID);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -103,10 +103,10 @@ AudioObjectID CAHALAudioObject::GetOwnerObjectID() const
{
// set up the return value
AudioObjectID theAnswer = 0;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyOwner);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
@@ -114,7 +114,7 @@ AudioObjectID CAHALAudioObject::GetOwnerObjectID() const
UInt32 theSize = sizeof(AudioObjectID);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -122,10 +122,10 @@ CFStringRef CAHALAudioObject::CopyOwningPlugInBundleID() const
{
// set up the return value
CFStringRef theAnswer = NULL;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyCreator);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
@@ -133,7 +133,7 @@ CFStringRef CAHALAudioObject::CopyOwningPlugInBundleID() const
UInt32 theSize = sizeof(CFStringRef);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -141,10 +141,10 @@ CFStringRef CAHALAudioObject::CopyName() const
{
// set up the return value
CFStringRef theAnswer = NULL;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyName);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
@@ -152,7 +152,7 @@ CFStringRef CAHALAudioObject::CopyName() const
UInt32 theSize = sizeof(CFStringRef);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -160,10 +160,10 @@ CFStringRef CAHALAudioObject::CopyManufacturer() const
{
// set up the return value
CFStringRef theAnswer = NULL;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyManufacturer);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
@@ -171,7 +171,7 @@ CFStringRef CAHALAudioObject::CopyManufacturer() const
UInt32 theSize = sizeof(CFStringRef);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -179,10 +179,10 @@ CFStringRef CAHALAudioObject::CopyNameForElement(AudioObjectPropertyScope inScop
{
// set up the return value
CFStringRef theAnswer = NULL;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyElementName, inScope, inElement);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
@@ -190,7 +190,7 @@ CFStringRef CAHALAudioObject::CopyNameForElement(AudioObjectPropertyScope inScop
UInt32 theSize = sizeof(CFStringRef);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -198,10 +198,10 @@ CFStringRef CAHALAudioObject::CopyCategoryNameForElement(AudioObjectPropertyScop
{
// set up the return value
CFStringRef theAnswer = NULL;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyElementCategoryName, inScope, inElement);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
@@ -209,7 +209,7 @@ CFStringRef CAHALAudioObject::CopyCategoryNameForElement(AudioObjectPropertyScop
UInt32 theSize = sizeof(CFStringRef);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -217,10 +217,10 @@ CFStringRef CAHALAudioObject::CopyNumberNameForElement(AudioObjectPropertyScope
{
// set up the return value
CFStringRef theAnswer = NULL;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyElementNumberName, inScope, inElement);
-
+
// make sure the property exists
if(HasProperty(theAddress))
{
@@ -228,7 +228,7 @@ CFStringRef CAHALAudioObject::CopyNumberNameForElement(AudioObjectPropertyScope
UInt32 theSize = sizeof(CFStringRef);
GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
}
-
+
return theAnswer;
}
@@ -243,10 +243,10 @@ UInt32 CAHALAudioObject::GetNumberOwnedObjects(AudioClassID inClass) const
{
// set up the return value
UInt32 theAnswer = 0;
-
+
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyOwnedObjects);
-
+
// figure out the qualifier
UInt32 theQualifierSize = 0;
void* theQualifierData = NULL;
@@ -255,13 +255,13 @@ UInt32 CAHALAudioObject::GetNumberOwnedObjects(AudioClassID inClass) const
theQualifierSize = sizeof(AudioObjectID);
theQualifierData = &inClass;
}
-
+
// get the property data size
theAnswer = GetPropertyDataSize(theAddress, theQualifierSize, theQualifierData);
-
+
// calculate the number of object IDs
theAnswer /= SizeOf32(AudioObjectID);
-
+
return theAnswer;
}
@@ -269,7 +269,7 @@ void CAHALAudioObject::GetAllOwnedObjects(AudioClassID inClass, UInt32& ioNumber
{
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyOwnedObjects);
-
+
// figure out the qualifier
UInt32 theQualifierSize = 0;
void* theQualifierData = NULL;
@@ -278,11 +278,11 @@ void CAHALAudioObject::GetAllOwnedObjects(AudioClassID inClass, UInt32& ioNumber
theQualifierSize = sizeof(AudioObjectID);
theQualifierData = &inClass;
}
-
+
// get the property data
UInt32 theDataSize = ioNumberObjects * SizeOf32(AudioClassID);
GetPropertyData(theAddress, theQualifierSize, theQualifierData, theDataSize, ioObjectIDs);
-
+
// set the number of object IDs being returned
ioNumberObjects = theDataSize / SizeOf32(AudioObjectID);
}
@@ -291,7 +291,7 @@ AudioObjectID CAHALAudioObject::GetOwnedObjectByIndex(AudioClassID inClass, UInt
{
// set up the property address
CAPropertyAddress theAddress(kAudioObjectPropertyOwnedObjects);
-
+
// figure out the qualifier
UInt32 theQualifierSize = 0;
void* theQualifierData = NULL;
@@ -300,27 +300,27 @@ AudioObjectID CAHALAudioObject::GetOwnedObjectByIndex(AudioClassID inClass, UInt
theQualifierSize = sizeof(AudioObjectID);
theQualifierData = &inClass;
}
-
+
// figure out how much space to allocate
UInt32 theDataSize = GetPropertyDataSize(theAddress, theQualifierSize, theQualifierData);
UInt32 theNumberObjectIDs = theDataSize / SizeOf32(AudioObjectID);
-
+
// set up the return value
AudioObjectID theAnswer = 0;
-
+
// maker sure the index is in range
if(inIndex < theNumberObjectIDs)
{
// allocate it
CAAutoArrayDelete<AudioObjectID> theObjectList(theDataSize / sizeof(AudioObjectID));
-
+
// get the property data
GetPropertyData(theAddress, theQualifierSize, theQualifierData, theDataSize, theObjectList);
-
+
// get the return value
theAnswer = theObjectList[inIndex];
}
-
+
return theAnswer;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h
index d99ab0d..1933a27 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h
@@ -2,14 +2,14 @@
File: CAHALAudioObject.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAHALAudioObject_h__)
#define __CAHALAudioObject_h__
@@ -88,7 +88,7 @@ public:
CFStringRef CopyNameForElement(AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) const;
CFStringRef CopyCategoryNameForElement(AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) const;
CFStringRef CopyNumberNameForElement(AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) const;
-
+
static bool ObjectExists(AudioObjectID inObjectID);
// Owned Objects
@@ -96,16 +96,16 @@ public:
UInt32 GetNumberOwnedObjects(AudioClassID inClass) const;
void GetAllOwnedObjects(AudioClassID inClass, UInt32& ioNumberObjects, AudioObjectID* ioObjectIDs) const;
AudioObjectID GetOwnedObjectByIndex(AudioClassID inClass, UInt32 inIndex);
-
+
// Property Operations
public:
bool HasProperty(const AudioObjectPropertyAddress& inAddress) const;
bool IsPropertySettable(const AudioObjectPropertyAddress& inAddress) const;
UInt32 GetPropertyDataSize(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData) const;
-
+
void GetPropertyData(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32& ioDataSize, void* outData) const;
void SetPropertyData(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32 inDataSize, const void* inData);
-
+
UInt32 GetPropertyData_UInt32(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) const { UInt32 theAnswer = 0; UInt32 theDataSize = SizeOf32(UInt32); GetPropertyData(inAddress, inQualifierDataSize, inQualifierData, theDataSize, &theAnswer); return theAnswer; }
void SetPropertyData_UInt32(const AudioObjectPropertyAddress& inAddress, UInt32 inValue, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) { SetPropertyData(inAddress, inQualifierDataSize, inQualifierData, SizeOf32(UInt32), &inValue); }
@@ -127,7 +127,7 @@ public:
template <class T> UInt32 GetPropertyData_ArraySize(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) const { return GetPropertyDataSize(inAddress, inQualifierDataSize, inQualifierData) / SizeOf32(T); }
template <class T> void GetPropertyData_Array(const AudioObjectPropertyAddress& inAddress, UInt32& ioNumberItems, T* outArray, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) const { UInt32 theDataSize = ioNumberItems * SizeOf32(T); GetPropertyData(inAddress, inQualifierDataSize, inQualifierData, theDataSize, outArray); ioNumberItems = theDataSize / SizeOf32(T); }
template <class T> void SetPropertyData_Array(const AudioObjectPropertyAddress& inAddress, UInt32 inNumberItems, T* inArray, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) { SetPropertyData(inAddress, inQualifierDataSize, inQualifierData, inNumberItems * SizeOf32(T), inArray); }
-
+
void AddPropertyListener(const AudioObjectPropertyAddress& inAddress, AudioObjectPropertyListenerProc inListenerProc, void* inClientData);
void RemovePropertyListener(const AudioObjectPropertyAddress& inAddress, AudioObjectPropertyListenerProc inListenerProc, void* inClientData);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp
index 62b9b3c..d28f0d2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp
@@ -2,14 +2,14 @@
File: CAHALAudioStream.cpp
Abstract: CAHALAudioStream.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h
index 0c6cb55..a61c5ad 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h
@@ -2,14 +2,14 @@
File: CAHALAudioStream.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAHALAudioStream_h__)
#define __CAHALAudioStream_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp
index 404dd98..50643db 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp
@@ -2,14 +2,14 @@
File: CAHALAudioSystemObject.cpp
Abstract: CAHALAudioSystemObject.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -124,15 +124,15 @@ void CAHALAudioSystemObject::LogBasicDeviceInfo()
char theCString[256];
UInt32 theCStringSize = sizeof(theCString);
DebugMessageN1("CAHALAudioSystemObject::LogBasicDeviceInfo: Device %d", (int)theDeviceIndex);
-
+
CAHALAudioDevice theDevice(theDeviceList[theDeviceIndex]);
DebugMessageN1("CAHALAudioSystemObject::LogBasicDeviceInfo: Object ID: %d", (int)theDeviceList[theDeviceIndex]);
-
+
CACFString theDeviceName(theDevice.CopyName());
theCStringSize = sizeof(theCString);
theDeviceName.GetCString(theCString, theCStringSize);
DebugMessageN1("CAHALAudioSystemObject::LogBasicDeviceInfo: Name: %s", theCString);
-
+
CACFString theDeviceUID(theDevice.CopyDeviceUID());
theCStringSize = sizeof(theCString);
theDeviceUID.GetCString(theCString, theCStringSize);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h
index 0ade7a5..6b0f938 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h
@@ -2,14 +2,14 @@
File: CAHALAudioSystemObject.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAHALAudioSystemObject_h__)
#define __CAHALAudioSystemObject_h__
@@ -80,7 +80,7 @@ public:
public:
AudioObjectID GetDefaultAudioDevice(bool inIsInput, bool inIsSystem) const;
void SetDefaultAudioDevice(bool inIsInput, bool inIsSystem, AudioObjectID inNewDefaultDevice);
-
+
// PlugIns
public:
AudioObjectID GetAudioPlugInForBundleID(CFStringRef inBundleID) const;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp
index db78a4a..60d91a1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp
@@ -2,14 +2,14 @@
File: CAHostTimeBase.cpp
Abstract: CAHostTimeBase.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -88,7 +88,7 @@ void CAHostTimeBase::Initialize()
sFrequency = static_cast<Float64>(*((UInt64*)&theFrequency));
#endif
sInverseFrequency = 1.0 / sFrequency;
-
+
#if Log_Host_Time_Base_Parameters
DebugPrintf("Host Time Base Parameters");
DebugPrintf(" Minimum Delta: %lu", (unsigned long)sMinDelta);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h
index 50e3507..7b5303b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h
@@ -2,14 +2,14 @@
File: CAHostTimeBase.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAHostTimeBase_h__)
#define __CAHostTimeBase_h__
@@ -101,12 +101,12 @@ public:
static SInt64 HostDeltaToNanos(UInt64 inStartTime, UInt64 inEndTime);
static UInt64 MultiplyByRatio(UInt64 inMuliplicand, UInt32 inNumerator, UInt32 inDenominator);
-
+
private:
static void Initialize();
-
+
static pthread_once_t sIsInited;
-
+
static Float64 sFrequency;
static Float64 sInverseFrequency;
static UInt32 sMinDelta;
@@ -128,7 +128,7 @@ inline UInt64 CAHostTimeBase::GetTheCurrentTime()
QueryPerformanceCounter(&theValue);
theTime = *((UInt64*)&theValue);
#endif
-
+
#if Track_Host_TimeBase
if(sLastTime != 0)
{
@@ -150,7 +150,7 @@ inline UInt64 CAHostTimeBase::GetTheCurrentTime()
inline UInt64 CAHostTimeBase::ConvertToNanos(UInt64 inHostTime)
{
pthread_once(&sIsInited, Initialize);
-
+
UInt64 theAnswer = MultiplyByRatio(inHostTime, sToNanosNumerator, sToNanosDenominator);
#if CoreAudio_Debug
if(((sToNanosNumerator > sToNanosDenominator) && (theAnswer < inHostTime)) || ((sToNanosDenominator > sToNanosNumerator) && (theAnswer > inHostTime)))
@@ -158,7 +158,7 @@ inline UInt64 CAHostTimeBase::ConvertToNanos(UInt64 inHostTime)
DebugPrintf("CAHostTimeBase::ConvertToNanos: The conversion wrapped");
}
#endif
-
+
return theAnswer;
}
@@ -185,7 +185,7 @@ inline UInt64 CAHostTimeBase::GetCurrentTimeInNanos()
inline UInt64 CAHostTimeBase::AbsoluteHostDeltaToNanos(UInt64 inStartTime, UInt64 inEndTime)
{
UInt64 theAnswer;
-
+
if(inStartTime <= inEndTime)
{
theAnswer = inEndTime - inStartTime;
@@ -194,7 +194,7 @@ inline UInt64 CAHostTimeBase::AbsoluteHostDeltaToNanos(UInt64 inStartTime, UInt6
{
theAnswer = inStartTime - inEndTime;
}
-
+
return ConvertToNanos(theAnswer);
}
@@ -202,7 +202,7 @@ inline SInt64 CAHostTimeBase::HostDeltaToNanos(UInt64 inStartTime, UInt64 inEndT
{
SInt64 theAnswer;
SInt64 theSign = 1;
-
+
if(inStartTime <= inEndTime)
{
theAnswer = static_cast<SInt64>(inEndTime - inStartTime);
@@ -212,7 +212,7 @@ inline SInt64 CAHostTimeBase::HostDeltaToNanos(UInt64 inStartTime, UInt64 inEndT
theAnswer = static_cast<SInt64>(inStartTime - inEndTime);
theSign = -1;
}
-
+
return theSign * static_cast<SInt64>(ConvertToNanos(static_cast<UInt64>(theAnswer)));
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h b/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h
index 7fd4ac4..4c62506 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h
@@ -2,14 +2,14 @@
File: CALogMacros.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CALogMacros_h__)
#define __CALogMacros_h__
@@ -57,31 +57,31 @@
#include "CADebugPrintf.h"
#include <stdio.h>
#include <string.h>
-
+
#define PrintLine(msg) DebugPrintfRtn(DebugPrintfFileComma "%s\n", (msg))
-
+
#define PrintBool(msg, b) DebugPrintfRtn(DebugPrintfFileComma "%s%s\n", (msg), (b) ? "true" : "false")
#define PrintIndexedBool(msg, i, b) DebugPrintfRtn(DebugPrintfFileComma " %s %ld: %s\n", (msg), (long)(i), (b) ? "true" : "false")
-
+
#define PrintToggle(msg, b) DebugPrintfRtn(DebugPrintfFileComma "%s%s\n", (msg), (b) ? "on" : "off")
#define PrintIndexedToggle(msg, i, b) DebugPrintfRtn(DebugPrintfFileComma " %s %ld: %s\n", (msg), (long)(i), (b) ? "on" : "off")
-
+
#define PrintInt(msg, n) DebugPrintfRtn(DebugPrintfFileComma "%s%ld\n", (msg), (long)(n))
#define PrintIndexedInt(msg, i, n) DebugPrintfRtn(DebugPrintfFileComma " %s %ld: %ld\n", (msg), (long)(i), (long)(n))
-
+
#define PrintHex(msg, n) DebugPrintfRtn(DebugPrintfFileComma "%s0x%lX\n", (msg), (unsigned long)(n))
#define PrintIndexedHex(msg, i, n) DebugPrintfRtn(DebugPrintfFileComma " %s %ld: 0x%lX\n", (msg), (long)(i), (unsigned long)(n))
-
+
#define PrintFloat(msg, f) DebugPrintfRtn(DebugPrintfFileComma "%s%.6f\n", (msg), (f))
#define PrintIndexedFloat(msg, i, f) DebugPrintfRtn(DebugPrintfFileComma " %s %ld: %.6f\n", (msg), (long)(i), (f))
#define PrintFloatIndexedFloat(msg, i, f) DebugPrintfRtn(DebugPrintfFileComma " %s %.6f: %.6f\n", (msg), (i), (f))
-
+
#define PrintString(msg, s) DebugPrintfRtn(DebugPrintfFileComma "%s%s\n", (msg), (s))
#define PrintIndexedString(msg, i, s) DebugPrintfRtn(DebugPrintfFileComma " %s %ld: %s\n", (msg), (long)(i), (s))
-
+
#define PrintPointer(msg, p) DebugPrintfRtn(DebugPrintfFileComma "%s%p\n", (msg), (p))
#define PrintIndexedPointer(msg, i, p) DebugPrintfRtn(DebugPrintfFileComma " %s %ld: %p\n", (msg), (long)(i), (p))
-
+
#define Print4CharCode(msg, c) { \
UInt32 __4CC_number = (c); \
char __4CC_string[5] = CA4CCToCString(__4CC_number); \
@@ -92,46 +92,46 @@
char __4CC_string[5] = CA4CCToCString(__4CC_number); \
DebugPrintfRtn(DebugPrintfFileComma " %s %ld: '%s'\n", (msg), (long)(i), __4CC_string); \
}
-
+
#define ErrorLine(s) DebugPrintfRtn(DebugPrintfFileComma "%s\n", (s))
#define OSErrorLine(s, e) { \
OSStatus __err_number = (e); \
char __err_string[5] = CA4CCToCString(__err_number); \
DebugPrintfRtn(DebugPrintfFileComma "%s, OSStatus code: %s\n", (s), __err_string); \
}
-
+
#define MessageIfOSError(e, s) if((e) != 0) { OSErrorLine(s, e); }
#define MessageIfNULL(p, s) if((p) == 0) { ErrorLine(s); }
#else
- #define PrintLine(msg)
-
+ #define PrintLine(msg)
+
#define PrintBool(msg, b) (b)
#define PrintIndexedBool(msg, i, b) (b)
-
+
#define PrintInt(msg, n) (n)
#define PrintIndexedInt(msg, i, n) (n)
-
+
#define PrintHex(msg, n) (n)
#define PrintIndexedHex(msg, i, n) (n)
-
+
#define PrintFloat(msg, f) (f)
#define PrintIndexedFloat(msg, i, f) (f)
#define PrintFloatIndexedFloat(msg, i, f) (f)
-
+
#define PrintString(msg, s) (s)
#define PrintIndexedString(msg, i, s) (s)
-
+
#define PrintPointer(msg, p) (p)
#define PrintIndexedPointer(msg, i, p) (p)
-
+
#define Print4CharCode(msg, c) (c)
#define PrintIndexed4CharCode(msg, i, c) (c)
-
+
#define ErrorLine(s) (s)
#define OSErrorLine(s, e) (e)
-
+
#define MessageIfOSError(e, s) (e)
#define MessageIfNULL(p, s) (p)
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMath.h b/libs/appleutility/CoreAudio/PublicUtility/CAMath.h
index eb81f26..ca7cd38 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMath.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMath.h
@@ -2,14 +2,14 @@
File: CAMath.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAMath_h__
#define __CAMath_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h b/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h
index 62e95d4..58d4764 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h
@@ -2,14 +2,14 @@
File: CAMixMap.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,45 +40,45 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAMixMap_h__
#define __CAMixMap_h__
// manages the setting of mix map volumes
-
+
class CAMixMap {
public:
CAMixMap ()
: mIns(0), mOuts (0), mMixMap(NULL)
{}
-
- CAMixMap (const CAMixMap &mm)
+
+ CAMixMap (const CAMixMap &mm)
: mIns(0), mOuts (0), mMixMap(NULL)
{ *this = mm; }
-
- CAMixMap (UInt32 numIns, UInt32 numOuts)
+
+ CAMixMap (UInt32 numIns, UInt32 numOuts)
: mIns(numIns), mOuts (numOuts), mMixMap(NULL)
- {
- mMixMap = new Float32[numIns * numOuts];
+ {
+ mMixMap = new Float32[numIns * numOuts];
memset (mMixMap, 0, ByteSize());
}
-
+
~CAMixMap () { delete [] mMixMap; }
-
- CAMixMap& operator=(const CAMixMap& mm)
- {
+
+ CAMixMap& operator=(const CAMixMap& mm)
+ {
if (mMixMap) { delete [] mMixMap; mMixMap = NULL; }
mIns = mm.mIns; mOuts = mm.mOuts;
- if (NumIns() && NumOuts()) {
+ if (NumIns() && NumOuts()) {
mMixMap = new Float32 [ NumIns() * NumOuts() ];
memcpy (mMixMap, mm.mMixMap, ByteSize());
}
return *this;
}
-
+
UInt32 NumIns () const { return mIns; }
UInt32 NumOuts () const { return mOuts; }
@@ -100,10 +100,10 @@ public:
mMixMap[i * NumOuts() + i] = val;
}
}
-
+
void Clear () { memset (mMixMap, 0, ByteSize()); }
-
-
+
+
Float32* MM() { return mMixMap; }
const Float32* MM() const { return mMixMap; }
UInt32 ByteSize () const { return NumIns() * NumOuts() * sizeof(Float32); }
@@ -116,7 +116,7 @@ public:
}
return sum;
}
-
+
void Normalize()
{
// ensure that no output channel will sum over unity.
@@ -129,25 +129,25 @@ public:
}
if (sum > maxsum) maxsum = sum;
}
-
+
if (maxsum == 0.f) return;
Float32 scale = 1.f / maxsum;
for (UInt32 i = 0; i < mIns * mOuts; ++i) {
mixmap[i] *= scale;
}
}
-
+
void Print ()
{
printf ("Num Ins: %d, Num Outs: %d\n", (int)mIns, (int)mOuts);
for (unsigned int ins = 0; ins < mIns; ++ins) {
printf ("\t%d: ", ins);
for (unsigned int outs = 0; outs < mOuts; ++outs)
- printf ("(%.3f) ", mMixMap[ins * NumOuts() + outs]);
+ printf ("(%.3f) ", mMixMap[ins * NumOuts() + outs]);
printf("\n");
}
}
-
+
private:
UInt32 mIns;
UInt32 mOuts;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp
index 88cf9b0..f6e7ca4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp
@@ -2,14 +2,14 @@
File: CAMutex.cpp
Abstract: CAMutex.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -83,14 +83,14 @@ CAMutex::CAMutex(const char* inName)
#if TARGET_OS_MAC
OSStatus theError = pthread_mutex_init(&mMutex, NULL);
ThrowIf(theError != 0, CAException(theError), "CAMutex::CAMutex: Could not init the mutex");
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::CAMutex: creating %s, owner: %p\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), mName, mOwner);
#endif
#elif TARGET_OS_WIN32
mMutex = CreateMutex(NULL, false, NULL);
ThrowIfNULL(mMutex, CAException(GetLastError()), "CAMutex::CAMutex: could not create the mutex.");
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::CAMutex: creating %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), mName, mOwner);
#endif
@@ -118,7 +118,7 @@ CAMutex::~CAMutex()
bool CAMutex::Lock()
{
bool theAnswer = false;
-
+
#if TARGET_OS_MAC
pthread_t theCurrentThread = pthread_self();
if(!pthread_equal(theCurrentThread, mOwner))
@@ -126,22 +126,22 @@ bool CAMutex::Lock()
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Lock: thread %p is locking %s, owner: %p\n", theCurrentThread, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), theCurrentThread, mName, mOwner);
#endif
-
+
#if Log_LongLatencies
UInt64 lockTryTime = CAHostTimeBase::GetCurrentTimeInNanos();
#endif
-
+
OSStatus theError = pthread_mutex_lock(&mMutex);
ThrowIf(theError != 0, CAException(theError), "CAMutex::Lock: Could not lock the mutex");
mOwner = theCurrentThread;
theAnswer = true;
-
+
#if Log_LongLatencies
UInt64 lockAcquireTime = CAHostTimeBase::GetCurrentTimeInNanos();
if (lockAcquireTime - lockTryTime >= LongLatencyThresholdNS)
DebugPrintfRtn(DebugPrintfFileComma "Thread %p took %.6fs to acquire the lock %s\n", theCurrentThread, (lockAcquireTime - lockTryTime) * 1.0e-9 /* nanos to seconds */, mName);
#endif
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Lock: thread %p has locked %s, owner: %p\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), pthread_self(), mName, mOwner);
#endif
@@ -157,7 +157,7 @@ bool CAMutex::Lock()
ThrowIfError(theError, CAException(theError), "CAMutex::Lock: could not lock the mutex");
mOwner = GetCurrentThreadId();
theAnswer = true;
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Lock: thread %lu has locked %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
@@ -179,7 +179,7 @@ void CAMutex::Unlock()
mOwner = 0;
OSStatus theError = pthread_mutex_unlock(&mMutex);
ThrowIf(theError != 0, CAException(theError), "CAMutex::Unlock: Could not unlock the mutex");
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Unlock: thread %p has unlocked %s, owner: %p\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), pthread_self(), mName, mOwner);
#endif
@@ -198,7 +198,7 @@ void CAMutex::Unlock()
mOwner = 0;
bool wasReleased = ReleaseMutex(mMutex);
ThrowIf(!wasReleased, CAException(GetLastError()), "CAMutex::Unlock: Could not unlock the mutex");
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Unlock: thread %lu has unlocked %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
@@ -232,7 +232,7 @@ bool CAMutex::Try(bool& outWasLocked)
mOwner = theCurrentThread;
theAnswer = true;
outWasLocked = true;
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Try: thread %p has locked %s, owner: %p\n", theCurrentThread, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), theCurrentThread, mName, mOwner);
#endif
@@ -242,7 +242,7 @@ bool CAMutex::Try(bool& outWasLocked)
// return value of EBUSY means that the lock was already locked by another thread
theAnswer = false;
outWasLocked = false;
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Try: thread %p failed to lock %s, owner: %p\n", theCurrentThread, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), theCurrentThread, mName, mOwner);
#endif
@@ -266,7 +266,7 @@ bool CAMutex::Try(bool& outWasLocked)
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Try: thread %lu is try-locking %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
-
+
// try to acquire the mutex
OSStatus theError = WaitForSingleObject(mMutex, 0);
if(theError == WAIT_OBJECT_0)
@@ -275,7 +275,7 @@ bool CAMutex::Try(bool& outWasLocked)
mOwner = GetCurrentThreadId();
theAnswer = true;
outWasLocked = true;
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Try: thread %lu has locked %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
@@ -285,7 +285,7 @@ bool CAMutex::Try(bool& outWasLocked)
// this means that the lock was already locked by another thread
theAnswer = false;
outWasLocked = false;
-
+
#if Log_Ownership
DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Try: thread %lu failed to lock %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
#endif
@@ -303,7 +303,7 @@ bool CAMutex::Try(bool& outWasLocked)
outWasLocked = false;
}
#endif
-
+
return theAnswer;
}
@@ -315,7 +315,7 @@ bool CAMutex::IsFree() const
bool CAMutex::IsOwnedByCurrentThread() const
{
bool theAnswer = true;
-
+
#if TARGET_OS_MAC
theAnswer = pthread_equal(pthread_self(), mOwner);
#elif TARGET_OS_WIN32
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h
index 093066b..4cc8ac5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h
@@ -2,14 +2,14 @@
File: CAMutex.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAMutex_h__
#define __CAMutex_h__
@@ -82,10 +82,10 @@ public:
virtual bool Lock();
virtual void Unlock();
virtual bool Try(bool& outWasLocked); // returns true if lock is free, false if not
-
+
virtual bool IsFree() const;
virtual bool IsOwnedByCurrentThread() const;
-
+
// Implementation
protected:
const char* mName;
@@ -101,24 +101,24 @@ protected:
public:
class Locker
{
-
+
// Construction/Destruction
public:
Locker(CAMutex& inMutex) : mMutex(&inMutex), mNeedsRelease(false) { mNeedsRelease = mMutex->Lock(); }
Locker(CAMutex* inMutex) : mMutex(inMutex), mNeedsRelease(false) { mNeedsRelease = (mMutex != NULL && mMutex->Lock()); }
// in this case the mutex can be null
~Locker() { if(mNeedsRelease) { mMutex->Unlock(); } }
-
-
+
+
private:
Locker(const Locker&);
Locker& operator=(const Locker&);
-
+
// Implementation
private:
CAMutex* mMutex;
bool mNeedsRelease;
-
+
};
// Unlocker
@@ -127,24 +127,24 @@ public:
public:
Unlocker(CAMutex& inMutex);
~Unlocker();
-
+
private:
CAMutex& mMutex;
bool mNeedsLock;
-
+
// Hidden definitions of copy ctor, assignment operator
Unlocker(const Unlocker& copy); // Not implemented
Unlocker& operator=(const Unlocker& copy); // Not implemented
};
-
+
// you can use this with Try - if you take the lock in try, pass in the outWasLocked var
class Tryer {
-
+
// Construction/Destruction
public:
Tryer (CAMutex &mutex) : mMutex(mutex), mNeedsRelease(false), mHasLock(false) { mHasLock = mMutex.Try (mNeedsRelease); }
~Tryer () { if (mNeedsRelease) mMutex.Unlock(); }
-
+
bool HasLock () const { return mHasLock; }
private:
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp
index 3da1058..2428a7a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp
@@ -2,14 +2,14 @@
File: CAPThread.cpp
Abstract: CAPThread.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -170,7 +170,7 @@ void CAPThread::SetPriority(UInt32 inPriority, bool inFixedPriority)
if(mPThread != 0)
{
SetPriority(mPThread, mPriority, mFixedPriority);
- }
+ }
#elif TARGET_OS_WIN32
if(mThreadID != NULL)
{
@@ -185,7 +185,7 @@ void CAPThread::SetPriority(NativeThread inThread, UInt32 inPriority, bool inFix
if(inThread != 0)
{
kern_return_t theError = 0;
-
+
// set whether or not this is a fixed priority thread
if (inFixedPriority)
{
@@ -193,17 +193,17 @@ void CAPThread::SetPriority(NativeThread inThread, UInt32 inPriority, bool inFix
theError = thread_policy_set(pthread_mach_thread_np(inThread), THREAD_EXTENDED_POLICY, (thread_policy_t)&theFixedPolicy, THREAD_EXTENDED_POLICY_COUNT);
AssertNoKernelError(theError, "CAPThread::SetPriority: failed to set the fixed-priority policy");
}
-
+
// set the thread's absolute priority which is relative to the priority on which thread_policy_set() is called
UInt32 theCurrentThreadPriority = getScheduledPriority(pthread_self(), CAPTHREAD_SET_PRIORITY);
thread_precedence_policy_data_t thePrecedencePolicy = { static_cast<integer_t>(inPriority - theCurrentThreadPriority) };
theError = thread_policy_set(pthread_mach_thread_np(inThread), THREAD_PRECEDENCE_POLICY, (thread_policy_t)&thePrecedencePolicy, THREAD_PRECEDENCE_POLICY_COUNT);
AssertNoKernelError(theError, "CAPThread::SetPriority: failed to set the precedence policy");
-
+
#if Log_SetPriority
DebugMessageN4("CAPThread::SetPriority: requsted: %lu spawning: %lu current: %lu assigned: %d", mPriority, mSpawningThreadPriority, theCurrentThreadPriority, thePrecedencePolicy.importance);
#endif
- }
+ }
#elif TARGET_OS_WIN32
if(inThread != NULL)
{
@@ -249,18 +249,18 @@ void CAPThread::Start()
{
OSStatus theResult;
pthread_attr_t theThreadAttributes;
-
+
theResult = pthread_attr_init(&theThreadAttributes);
ThrowIf(theResult != 0, CAException(theResult), "CAPThread::Start: Thread attributes could not be created.");
-
+
theResult = pthread_attr_setdetachstate(&theThreadAttributes, PTHREAD_CREATE_DETACHED);
ThrowIf(theResult != 0, CAException(theResult), "CAPThread::Start: A thread could not be created in the detached state.");
-
+
theResult = pthread_create(&mPThread, &theThreadAttributes, (ThreadRoutine)CAPThread::Entry, this);
ThrowIf(theResult != 0 || !mPThread, CAException(theResult), "CAPThread::Start: Could not create a thread.");
-
+
pthread_attr_destroy(&theThreadAttributes);
-
+
}
#elif TARGET_OS_WIN32
Assert(mThreadID == 0, "CAPThread::Start: can't start because the thread is already running");
@@ -272,7 +272,7 @@ void CAPThread::Start()
CloseHandle(mThreadHandle);
mThreadHandle = NULL;
}
-
+
// create a new thread
mThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Entry, this, 0, &mThreadID);
ThrowIf(mThreadHandle == NULL, CAException(GetLastError()), "CAPThread::Start: Could not create a thread.");
@@ -291,7 +291,7 @@ void* CAPThread::Entry(CAPThread* inCAPThread)
#elif TARGET_OS_WIN32
// do we need to do something here?
#endif
-
+
#if !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
if(inCAPThread->mThreadName[0] != 0)
{
@@ -299,7 +299,7 @@ void* CAPThread::Entry(CAPThread* inCAPThread)
}
#endif
- try
+ try
{
if(inCAPThread->mTimeConstraintSet)
{
@@ -333,11 +333,11 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
if (inThread == NULL)
return 0;
-
+
// get basic info
count = THREAD_BASIC_INFO_COUNT;
thread_info (pthread_mach_thread_np (inThread), THREAD_BASIC_INFO, (thread_info_t)&threadInfo, &count);
-
+
switch (threadInfo.policy) {
case POLICY_TIMESHARE:
count = POLICY_TIMESHARE_INFO_COUNT;
@@ -347,7 +347,7 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
}
return static_cast<UInt32>(thePolicyInfo.ts.base_priority);
break;
-
+
case POLICY_FIFO:
count = POLICY_FIFO_INFO_COUNT;
thread_info(pthread_mach_thread_np (inThread), THREAD_SCHED_FIFO_INFO, (thread_info_t)&(thePolicyInfo.fifo), &count);
@@ -356,7 +356,7 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
}
return static_cast<UInt32>(thePolicyInfo.fifo.base_priority);
break;
-
+
case POLICY_RR:
count = POLICY_RR_INFO_COUNT;
thread_info(pthread_mach_thread_np (inThread), THREAD_SCHED_RR_INFO, (thread_info_t)&(thePolicyInfo.rr), &count);
@@ -366,7 +366,7 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
return static_cast<UInt32>(thePolicyInfo.rr.base_priority);
break;
}
-
+
return 0;
}
@@ -376,7 +376,7 @@ UInt32 WINAPI CAPThread::Entry(CAPThread* inCAPThread)
{
UInt32 theAnswer = 0;
- try
+ try
{
if(inCAPThread->mTimeConstraintSet)
{
@@ -429,20 +429,20 @@ void CAPThread::DebugPriority(const char *label)
{
#if !TARGET_OS_WIN32
if (mTimeConstraintSet)
- printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this,
+ printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this,
(int)mSpawningThreadPriority, (mPThread != NULL) ? (int)GetScheduledPriority() : -1);
else
- printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "",
+ printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "",
(int)mSpawningThreadPriority, (mPThread != NULL) ? (int)GetScheduledPriority() : -1);
#else
if (mTimeConstraintSet)
{
- printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this,
+ printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this,
(int)mPriority, (mThreadHandle != NULL) ? (int)GetScheduledPriority() : -1);
}
else
{
- printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "",
+ printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "",
(int)mPriority, (mThreadHandle != NULL) ? (int)GetScheduledPriority() : -1);
}
#endif
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h
index 4145125..f85cdc0 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h
@@ -2,14 +2,14 @@
File: CAPThread.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAPThread_h__)
#define __CAPThread_h__
@@ -121,7 +121,7 @@ public:
static UInt32 getScheduledPriority(pthread_t inThread, int inPriorityKind);
#elif TARGET_OS_WIN32
typedef unsigned long NativeThread;
-
+
NativeThread GetNativeThread() { return mThreadID; }
static NativeThread GetCurrentThread() { return GetCurrentThreadId(); }
static bool IsNativeThreadsEqual(NativeThread a, NativeThread b) { return (a==b); }
@@ -146,13 +146,13 @@ public:
void GetTimeConstraints(UInt32& outPeriod, UInt32& outComputation, UInt32& outConstraint, bool& outIsPreemptible) const { outPeriod = mPeriod; outComputation = mComputation; outConstraint = mConstraint; outIsPreemptible = mIsPreemptible; }
void SetTimeConstraints(UInt32 inPeriod, UInt32 inComputation, UInt32 inConstraint, bool inIsPreemptible);
void ClearTimeConstraints() { SetPriority(mPriority); }
-
+
bool WillAutoDelete() const { return mAutoDelete; }
void SetAutoDelete(bool b) { mAutoDelete = b; }
-
+
void SetName(const char* inThreadName);
-#if CoreAudio_Debug
+#if CoreAudio_Debug
void DebugPriority(const char *label);
#endif
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp
index d3fe008..cabec8b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp
@@ -2,14 +2,14 @@
File: CAPersistence.cpp
Abstract: CAPersistence.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CACFArray.h"
#include "CACFDictionary.h"
@@ -80,7 +80,7 @@ OSStatus CAStreamBasicDescription::Save (CFPropertyListRef *outData) const
if (!dict.AddUInt32 (kFrameBytes, mBytesPerFrame)) goto error;
if (!dict.AddUInt32 (kFrameChannels, mChannelsPerFrame)) goto error;
if (!dict.AddUInt32 (kChannelBits, mBitsPerChannel)) goto error;
-
+
*outData = dict.GetDict();
return noErr;
@@ -90,14 +90,14 @@ error:
return paramErr;
}
-
+
// Given a CFData object generated by the save command, this will re-establish
// the CAStreamBasicDescription
OSStatus CAStreamBasicDescription::Restore (CFPropertyListRef& inData)
{
if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return paramErr;
CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);
-
+
if (!dict.GetFloat64 (kSampleRate, mSampleRate)) return paramErr;
if (!dict.GetUInt32 (kFormat, mFormatID)) return paramErr;
if (!dict.GetUInt32 (kFormatFlags, mFormatFlags)) return paramErr;
@@ -122,9 +122,9 @@ OSStatus CAComponentDescription::Save (CFPropertyListRef *outData) const
if (!dict.AddUInt32 (kType, componentType)) goto error;
if (!dict.AddUInt32 (kSubType, componentSubType)) goto error;
if (!dict.AddUInt32 (kManu, componentManufacturer)) goto error;
-
+
*outData = dict.GetDict();
-
+
return 0;
error:
dict.ShouldRelease (true);
@@ -135,14 +135,14 @@ OSStatus CAComponentDescription::Restore (CFPropertyListRef &inData)
{
if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return paramErr;
CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);
-
+
if (!dict.GetUInt32 (kType, componentType)) return paramErr;
if (!dict.GetUInt32 (kSubType, componentSubType)) return paramErr;
if (!dict.GetUInt32 (kManu, componentManufacturer)) return paramErr;
componentFlags = 0;
componentFlagsMask = 0;
-
+
return 0;
}
@@ -152,13 +152,13 @@ OSStatus CAComponent::Save (CFPropertyListRef *outData) const
{
OSStatus result = mDesc.Save (outData);
if (result) return result;
-
+
//add the name string of the component for a human readable name...
// this name string is *not* restored when restoring the component
CFStringRef name = GetCompName ();
if (name && *outData)
CFDictionarySetValue ((CFMutableDictionaryRef)(*outData), CFSTR("name"), name);
-
+
return noErr;
}
@@ -187,8 +187,8 @@ static const CFStringRef kACLCoords0Key = CFSTR("coords 0");
static const CFStringRef kACLCoords1Key = CFSTR("coords 1");
static const CFStringRef kACLCoords2Key = CFSTR("coords 2");
static const CFStringRef kACLDescsKey = CFSTR("descriptions");
-
-OSStatus CAAudioChannelLayout::Save (CFPropertyListRef *outData) const
+
+OSStatus CAAudioChannelLayout::Save (CFPropertyListRef *outData) const
{
const AudioChannelLayout& layout = Layout();
@@ -197,13 +197,13 @@ OSStatus CAAudioChannelLayout::Save (CFPropertyListRef *outData) const
goto badadd;
if (layout.mChannelBitmap && !dict.AddUInt32 (kACLBitmapKey, layout.mChannelBitmap))
goto badadd;
-
+
if (layout.mNumberChannelDescriptions)
- {
+ {
CFMutableArrayRef descs = CFArrayCreateMutable (NULL, layout.mNumberChannelDescriptions, &kCFTypeArrayCallBacks);
-
+
const AudioChannelDescription *desc = layout.mChannelDescriptions;
- for (unsigned int i = 0; i < layout.mNumberChannelDescriptions; ++i, ++desc)
+ for (unsigned int i = 0; i < layout.mNumberChannelDescriptions; ++i, ++desc)
{
CACFDictionary descDict (true);
if (!descDict.AddUInt32 (kACLLabelKey, desc->mChannelLabel))
@@ -216,41 +216,41 @@ OSStatus CAAudioChannelLayout::Save (CFPropertyListRef *outData) const
{ CFRelease (descs); goto badadd; }
if (!descDict.AddFloat32 (kACLCoords2Key, desc->mCoordinates[2]))
{ CFRelease (descs); goto badadd; }
-
+
CFArrayAppendValue (descs, descDict.AsPropertyList());
}
dict.AddArray (kACLDescsKey, descs);
-
+
CFRelease (descs);
}
-
- *outData = dict.GetDict();
-
+
+ *outData = dict.GetDict();
+
return noErr;
-
+
badadd:
dict.ShouldRelease(true);
return paramErr;
}
-OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
+OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
{
if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return paramErr;
CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);
RefCountedLayout *temp = NULL;
AudioChannelLayout* layout;
-
+
CFArrayRef descs = NULL;
UInt32 numDescs = 0;
if (dict.GetArray (kACLDescsKey, descs)) {
numDescs = static_cast<OSStatus>(CFArrayGetCount (descs));
}
-
+
temp = RefCountedLayout::CreateWithNumberChannelDescriptions(numDescs);
layout = temp->GetLayout();
-
+
if (!dict.GetUInt32 (kACLTagKey, layout->mChannelLayoutTag))
goto badget;
if (dict.HasKey (kACLBitmapKey)) {
@@ -258,17 +258,17 @@ OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
goto badget;
} else
layout->mChannelBitmap = 0;
-
+
layout->mNumberChannelDescriptions = numDescs;
-
+
if (numDescs)
{
AudioChannelDescription *desc = layout->mChannelDescriptions;
for (unsigned int i = 0; i < numDescs; ++i, ++desc)
{
- CFDictionaryRef descDict = (CFDictionaryRef)CFArrayGetValueAtIndex (descs, i);
+ CFDictionaryRef descDict = (CFDictionaryRef)CFArrayGetValueAtIndex (descs, i);
CACFDictionary theDesc (descDict, false);
-
+
if (!theDesc.GetUInt32 (kACLLabelKey, desc->mChannelLabel))
goto badget;
if (!theDesc.GetUInt32 (kACLFlagsKey, desc->mChannelFlags))
@@ -285,7 +285,7 @@ OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
mLayout->release();
mLayout = temp;
-
+
return noErr;
badget:
@@ -299,9 +299,9 @@ static const CFStringRef kAUScopeStr = CFSTR("scope");
static const CFStringRef kAUElementIDStr = CFSTR("element ID");
static const CFStringRef kAUParameterIDStr = CFSTR("paramID");
-void CAAUParameter::Save (CFPropertyListRef &outData) const
-{
- return CAAUParameter::Save (*this, outData);
+void CAAUParameter::Save (CFPropertyListRef &outData) const
+{
+ return CAAUParameter::Save (*this, outData);
}
// static functions to save/restore AudioUnitParameter
@@ -363,56 +363,56 @@ void CAAUMIDIMap::Save(CFPropertyListRef &outData) const
}
void CAAUMIDIMap::Restore(CFDictionaryRef inData)
-{
+{
CACFDictionary paramDict (inData, false);
- if (!paramDict.GetUInt32 (kLocalScopeStr, mScope)) return;
- if (!paramDict.GetUInt32 (kLocalElementIDStr, mElement)) return;
- if (!paramDict.GetUInt32 (kLocalParameterIDStr, mParameterID)) return;
+ if (!paramDict.GetUInt32 (kLocalScopeStr, mScope)) return;
+ if (!paramDict.GetUInt32 (kLocalElementIDStr, mElement)) return;
+ if (!paramDict.GetUInt32 (kLocalParameterIDStr, mParameterID)) return;
if (!paramDict.GetUInt32 (kMIDIFlagsStr, mFlags)) return;
- if (!paramDict.GetFloat32 (kMIDISubMinStr, mSubRangeMin)) return;
- if (!paramDict.GetFloat32 (kMIDISubMaxStr, mSubRangeMax)) return;
- UInt32 data;
+ if (!paramDict.GetFloat32 (kMIDISubMinStr, mSubRangeMin)) return;
+ if (!paramDict.GetFloat32 (kMIDISubMaxStr, mSubRangeMax)) return;
+ UInt32 data;
if (!paramDict.GetUInt32 (kMIDIStatusStr, data)) return;
mStatus = data;
- if (!paramDict.GetUInt32 (kMIDIDataByteStr, data)) return;
+ if (!paramDict.GetUInt32 (kMIDIDataByteStr, data)) return;
mData1 = data;
}
void CAAUMIDIMap::SaveAsMapPList (AudioUnit inUnit, const AUParameterMIDIMapping* inMappings, UInt32 inNumMappings, CFPropertyListRef &outData, CFStringRef inName)
{
- CACFDictionary mappingDict (false);
+ CACFDictionary mappingDict (false);
CACFArray maps (true);
-
- for (UInt32 i = 0; i< inNumMappings; ++i)
+
+ for (UInt32 i = 0; i< inNumMappings; ++i)
{
CFPropertyListRef data;
CAAUMIDIMap paramMap(inMappings[i]);
paramMap.Save (data);
- if (data)
+ if (data)
{
- maps.AppendCFType (data);
- CFRelease(data);
- }
+ maps.AppendCFType (data);
+ CFRelease(data);
+ }
}
if (maps.GetNumberItems()) {
mappingDict.AddCFType (kParamMIDIStr, maps.GetCFArray());
-
+
// Add the AU info here - where this map came from
CAAudioUnit au (inUnit);
CFPropertyListRef data;
au.Comp().Save (&data);
-
+
mappingDict.AddCFType (kAUStr, data);
CFRelease(data);
-
+
if (!inName) inName = CFSTR("Untitled");
mappingDict.AddString (CFSTR("name"), inName);
-
+
mappingDict.AddUInt32 (CFSTR("version"), 1);
-
+
outData = mappingDict.AsPropertyList();
} else {
mappingDict.ShouldRelease(true);
@@ -423,41 +423,41 @@ void CAAUMIDIMap::SaveAsMapPList (AudioUnit inUnit, const AUParameterMIDIMappin
UInt32 CAAUMIDIMap::NumberOfMaps (const CFDictionaryRef inData)
{
CACFDictionary dict (inData, false);
-
- if (dict.HasKey (kParamMIDIStr))
+
+ if (dict.HasKey (kParamMIDIStr))
{
CFArrayRef cfArray;
- dict.GetArray (kParamMIDIStr, cfArray);
-
+ dict.GetArray (kParamMIDIStr, cfArray);
+
CACFArray array (cfArray, false);
-
+
return array.GetNumberItems();
}
return 0;
}
-
+
void CAAUMIDIMap::RestoreFromMapPList (const CFDictionaryRef inData, AUParameterMIDIMapping* outMappings, UInt32 inNumMappings)
{
CACFDictionary dict (inData, false);
-
- if (dict.HasKey (kParamMIDIStr))
+
+ if (dict.HasKey (kParamMIDIStr))
{
CFArrayRef cfArray;
- dict.GetArray (kParamMIDIStr, cfArray);
-
+ dict.GetArray (kParamMIDIStr, cfArray);
+
CACFArray array (cfArray, false);
-
+
UInt32 count = array.GetNumberItems();
if (count > inNumMappings)
count = inNumMappings;
-
+
for (unsigned int i = 0; i < count; ++i)
{
CFDictionaryRef paramsDictRef;
- if (!array.GetDictionary(i, paramsDictRef))
+ if (!array.GetDictionary(i, paramsDictRef))
return;
-
+
CAAUMIDIMap parameterMap;
parameterMap.Restore(paramsDictRef);
outMappings[i] = parameterMap;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp
index 23ad2c0..fa7d203 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp
@@ -2,14 +2,14 @@
File: CAProcess.cpp
Abstract: CAProcess.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -62,7 +62,7 @@ bool CAProcess::ProcessExists(pid_t inPID)
// pids <= 0 are reserved for special purposes and -1 is
// used as a sentinel value by the HAL.
bool theAnswer = inPID > 0;
-
+
if(theAnswer)
{
// according to kill(2), the process exists if kill(pid, 0) returns 0
@@ -75,7 +75,7 @@ bool CAProcess::ProcessExists(pid_t inPID)
}
}
-
+
return theAnswer;
}
@@ -85,7 +85,7 @@ pid_t CAProcess::GetPID()
{
sPID = getpid();
}
-
+
return sPID;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h
index e512d91..5602ccd 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h
@@ -2,14 +2,14 @@
File: CAProcess.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAProcess_h__)
#define __CAProcess_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h b/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h
index 6df444b..f35776f 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h
@@ -2,14 +2,14 @@
File: CAPropertyAddress.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAPropertyAddress_h__)
#define __CAPropertyAddress_h__
@@ -88,7 +88,7 @@ public:
CAPropertyAddress(const CAPropertyAddress& inAddress) : AudioObjectPropertyAddress(inAddress){}
CAPropertyAddress& operator=(const AudioObjectPropertyAddress& inAddress) { AudioObjectPropertyAddress::operator=(inAddress); return *this; }
CAPropertyAddress& operator=(const CAPropertyAddress& inAddress) { AudioObjectPropertyAddress::operator=(inAddress); return *this; }
-
+
// Operations
public:
static bool IsSameAddress(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2) { return (inAddress1.mScope == inAddress2.mScope) && (inAddress1.mSelector == inAddress2.mSelector) && (inAddress1.mElement == inAddress2.mElement); }
@@ -145,18 +145,18 @@ public:
public:
void* GetToken() const { return mToken; }
void SetToken(void* inToken) { mToken = inToken; }
-
+
uintptr_t GetIntToken() const { return reinterpret_cast<uintptr_t>(mToken); }
void SetIntToken(uintptr_t inToken) { mToken = reinterpret_cast<void*>(inToken); }
-
+
AudioObjectID GetAudioObjectIDToken() const { return static_cast<AudioObjectID>(reinterpret_cast<uintptr_t>(mToken)); }
-
+
bool IsEmpty() const { return mAddressList.empty(); }
UInt32 GetNumberItems() const { return ToUInt32(mAddressList.size()); }
void GetItemByIndex(UInt32 inIndex, AudioObjectPropertyAddress& outAddress) const { if(inIndex < mAddressList.size()) { outAddress = mAddressList.at(inIndex); } }
const AudioObjectPropertyAddress* GetItems() const { return &(*mAddressList.begin()); }
AudioObjectPropertyAddress* GetItems() { return &(*mAddressList.begin()); }
-
+
bool HasItem(const AudioObjectPropertyAddress& inAddress) const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::CongruentEqualTo(), inAddress)); return theIterator != mAddressList.end(); }
bool HasExactItem(const AudioObjectPropertyAddress& inAddress) const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::EqualTo(), inAddress)); return theIterator != mAddressList.end(); }
@@ -174,7 +174,7 @@ private:
AddressList mAddressList;
void* mToken;
-
+
};
//==================================================================================================
@@ -207,10 +207,10 @@ public:
CAPropertyAddressList* GetItemByToken(void* inToken);
const CAPropertyAddressList* GetItemByIntToken(uintptr_t inToken) const;
CAPropertyAddressList* GetItemByIntToken(uintptr_t inToken);
-
+
void AppendItem(const CAPropertyAddressList& inAddressList) { mAddressListVector.push_back(inAddressList); }
void EraseAllItems() { mAddressListVector.clear(); }
-
+
// Implementation
private:
typedef std::vector<CAPropertyAddressList> AddressListVector;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h b/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h
index f00fc61..9e4de36 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h
@@ -2,14 +2,14 @@
File: CAReferenceCounted.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAReferenceCounted_h__
#define __CAReferenceCounted_h__
@@ -53,11 +53,11 @@
class CAReferenceCounted {
public:
CAReferenceCounted() : mRefCount(1) {}
-
+
void retain() { CAAtomicIncrement32(&mRefCount); }
-
- void release()
- {
+
+ void release()
+ {
SInt32 rc = CAAtomicDecrement32(&mRefCount);
if (rc == 0) {
releaseObject();
@@ -69,17 +69,17 @@ public:
public:
Retainer(CAReferenceCounted *obj) : mObject(obj) { mObject->retain(); }
~Retainer() { mObject->release(); }
-
+
private:
CAReferenceCounted * mObject;
};
protected:
virtual ~CAReferenceCounted() { }
-
- virtual void releaseObject ()
- {
- delete this;
+
+ virtual void releaseObject ()
+ {
+ delete this;
}
#if DEBUG
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp
index c78acd2..8d9584e 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp
@@ -2,14 +2,14 @@
File: CARingBuffer.cpp
Abstract: CARingBuffer.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CARingBuffer.h"
#include "CABitOperations.h"
@@ -69,9 +69,9 @@ CARingBuffer::~CARingBuffer()
void CARingBuffer::Allocate(int nChannels, UInt32 bytesPerFrame, UInt32 capacityFrames)
{
Deallocate();
-
+
capacityFrames = NextPowerOfTwo(capacityFrames);
-
+
mNumberChannels = nChannels;
mBytesPerFrame = bytesPerFrame;
mCapacityFrames = capacityFrames;
@@ -88,7 +88,7 @@ void CARingBuffer::Allocate(int nChannels, UInt32 bytesPerFrame, UInt32 capacity
mBuffers[i] = p;
p += mCapacityBytes;
}
-
+
for (UInt32 i = 0; i<kGeneralRingTimeBoundsQueueSize; ++i)
{
mTimeBoundsQueue[i].mStartTime = 0;
@@ -157,12 +157,12 @@ CARingBufferError CARingBuffer::Store(const AudioBufferList *abl, UInt32 framesT
{
if (framesToWrite == 0)
return kCARingBufferError_OK;
-
+
if (framesToWrite > mCapacityFrames)
return kCARingBufferError_TooMuch; // too big!
SampleTime endWrite = startWrite + framesToWrite;
-
+
if (startWrite < EndTime()) {
// going backwards, throw everything out
SetTimeBounds(startWrite, startWrite);
@@ -174,13 +174,13 @@ CARingBufferError CARingBuffer::Store(const AudioBufferList *abl, UInt32 framesT
SampleTime newEnd = std::max(newStart, EndTime());
SetTimeBounds(newStart, newEnd);
}
-
+
// write the new frames
Byte **buffers = mBuffers;
int nchannels = mNumberChannels;
int offset0, offset1, nbytes;
SampleTime curEnd = EndTime();
-
+
if (startWrite > curEnd) {
// we are skipping some samples, so zero the range we are skipping
offset0 = FrameOffset(curEnd);
@@ -204,10 +204,10 @@ CARingBufferError CARingBuffer::Store(const AudioBufferList *abl, UInt32 framesT
StoreABL(buffers, offset0, abl, 0, nbytes);
StoreABL(buffers, 0, abl, nbytes, offset1);
}
-
+
// now update the end time
SetTimeBounds(StartTime(), endWrite);
-
+
return kCARingBufferError_OK; // success
}
@@ -215,7 +215,7 @@ void CARingBuffer::SetTimeBounds(SampleTime startTime, SampleTime endTime)
{
UInt32 nextPtr = mTimeBoundsQueuePtr + 1;
UInt32 index = nextPtr & kGeneralRingTimeBoundsQueueMask;
-
+
mTimeBoundsQueue[index].mStartTime = startTime;
mTimeBoundsQueue[index].mEndTime = endTime;
mTimeBoundsQueue[index].mUpdateCounter = nextPtr;
@@ -229,12 +229,12 @@ CARingBufferError CARingBuffer::GetTimeBounds(SampleTime &startTime, SampleTime
UInt32 curPtr = mTimeBoundsQueuePtr;
UInt32 index = curPtr & kGeneralRingTimeBoundsQueueMask;
CARingBuffer::TimeBounds* bounds = mTimeBoundsQueue + index;
-
+
startTime = bounds->mStartTime;
endTime = bounds->mEndTime;
UInt32 newPtr = bounds->mUpdateCounter;
-
- if (newPtr == curPtr)
+
+ if (newPtr == curPtr)
return kCARingBufferError_OK;
}
return kCARingBufferError_CPUOverload;
@@ -243,19 +243,19 @@ CARingBufferError CARingBuffer::GetTimeBounds(SampleTime &startTime, SampleTime
CARingBufferError CARingBuffer::ClipTimeBounds(SampleTime& startRead, SampleTime& endRead)
{
SampleTime startTime, endTime;
-
+
CARingBufferError err = GetTimeBounds(startTime, endTime);
if (err) return err;
-
+
if (startRead > endTime || endRead < startTime) {
endRead = startRead;
return kCARingBufferError_OK;
}
-
+
startRead = std::max(startRead, startTime);
endRead = std::min(endRead, endTime);
endRead = std::max(endRead, startRead);
-
+
return kCARingBufferError_OK; // success
}
@@ -263,9 +263,9 @@ CARingBufferError CARingBuffer::Fetch(AudioBufferList *abl, UInt32 nFrames, Samp
{
if (nFrames == 0)
return kCARingBufferError_OK;
-
+
startRead = std::max(0LL, startRead);
-
+
SampleTime endRead = startRead + nFrames;
SampleTime startRead0 = startRead;
@@ -278,25 +278,25 @@ CARingBufferError CARingBuffer::Fetch(AudioBufferList *abl, UInt32 nFrames, Samp
ZeroABL(abl, 0, nFrames * mBytesPerFrame);
return kCARingBufferError_OK;
}
-
+
SInt32 byteSize = (SInt32)((endRead - startRead) * mBytesPerFrame);
-
- SInt32 destStartByteOffset = std::max((SInt32)0, (SInt32)((startRead - startRead0) * mBytesPerFrame));
-
+
+ SInt32 destStartByteOffset = std::max((SInt32)0, (SInt32)((startRead - startRead0) * mBytesPerFrame));
+
if (destStartByteOffset > 0) {
ZeroABL(abl, 0, std::min((SInt32)(nFrames * mBytesPerFrame), destStartByteOffset));
}
- SInt32 destEndSize = std::max((SInt32)0, (SInt32)(endRead0 - endRead));
+ SInt32 destEndSize = std::max((SInt32)0, (SInt32)(endRead0 - endRead));
if (destEndSize > 0) {
ZeroABL(abl, destStartByteOffset + byteSize, destEndSize * mBytesPerFrame);
}
-
+
Byte **buffers = mBuffers;
int offset0 = FrameOffset(startRead);
int offset1 = FrameOffset(endRead);
int nbytes;
-
+
if (offset0 < offset1) {
nbytes = offset1 - offset0;
FetchABL(abl, destStartByteOffset, buffers, offset0, nbytes);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h
index 9569e9a..4331194 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h
@@ -2,14 +2,14 @@
File: CARingBuffer.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
#include <CoreAudio/CoreAudioTypes.h>
@@ -71,37 +71,37 @@ public:
CARingBuffer();
~CARingBuffer();
-
+
void Allocate(int nChannels, UInt32 bytesPerFrame, UInt32 capacityFrames);
// capacityFrames will be rounded up to a power of 2
void Deallocate();
-
+
CARingBufferError Store(const AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber);
// Copy nFrames of data into the ring buffer at the specified sample time.
// The sample time should normally increase sequentially, though gaps
// are filled with zeroes. A sufficiently large gap effectively empties
- // the buffer before storing the new data.
-
+ // the buffer before storing the new data.
+
// If frameNumber is less than the previous frame number, the behavior is undefined.
-
+
// Return false for failure (buffer not large enough).
-
+
CARingBufferError Fetch(AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber);
// will alter mNumDataBytes of the buffers
-
+
CARingBufferError GetTimeBounds(SampleTime &startTime, SampleTime &endTime);
-
+
protected:
int FrameOffset(SampleTime frameNumber) { return (frameNumber & mCapacityFramesMask) * mBytesPerFrame; }
CARingBufferError ClipTimeBounds(SampleTime& startRead, SampleTime& endRead);
-
+
// these should only be called from Store.
SampleTime StartTime() const { return mTimeBoundsQueue[mTimeBoundsQueuePtr & kGeneralRingTimeBoundsQueueMask].mStartTime; }
SampleTime EndTime() const { return mTimeBoundsQueue[mTimeBoundsQueuePtr & kGeneralRingTimeBoundsQueueMask].mEndTime; }
void SetTimeBounds(SampleTime startTime, SampleTime endTime);
-
+
protected:
Byte ** mBuffers; // allocated in one chunk of memory
int mNumberChannels;
@@ -109,14 +109,14 @@ protected:
UInt32 mCapacityFrames; // per channel, must be a power of 2
UInt32 mCapacityFramesMask;
UInt32 mCapacityBytes; // per channel
-
+
// range of valid sample time in the buffer
typedef struct {
volatile SampleTime mStartTime;
volatile SampleTime mEndTime;
volatile UInt32 mUpdateCounter;
} TimeBounds;
-
+
CARingBuffer::TimeBounds mTimeBoundsQueue[kGeneralRingTimeBoundsQueueSize];
UInt32 mTimeBoundsQueuePtr;
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp
index 69bdffc..3982f3d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp
@@ -2,14 +2,14 @@
File: CASettingsStorage.cpp
Abstract: CASettingsStorage.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -81,17 +81,17 @@ CASettingsStorage::CASettingsStorage(const char* inSettingsFilePath, mode_t inSe
size_t theLength = strlen(inSettingsFilePath);
mSettingsFilePath = new char[theLength + 2];
strlcpy(mSettingsFilePath, inSettingsFilePath, theLength + 2);
-
+
mSettingsCacheTime.tv_sec = 0;
mSettingsCacheTime.tv_nsec = 0;
-
+
mSettingsCacheForceRefresh = true;
}
CASettingsStorage::~CASettingsStorage()
{
delete[] mSettingsFilePath;
-
+
if(mSettingsCache != NULL)
{
CFRelease(mSettingsCache);
@@ -119,11 +119,11 @@ void CASettingsStorage::CopyBoolValue(CFStringRef inKey, bool& outValue, bool in
{
// initialize the return value
outValue = inDefaultValue;
-
+
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, NULL);
-
+
// for this type, NULL is an invalid value
if(theValue != NULL)
{
@@ -138,11 +138,11 @@ void CASettingsStorage::CopyBoolValue(CFStringRef inKey, bool& outValue, bool in
// get the numeric value
SInt32 theNumericValue = 0;
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &theNumericValue);
-
+
// non-zero indicates true
outValue = theNumericValue != 0;
}
-
+
// release the value since we aren't returning it
CFRelease(theValue);
}
@@ -152,11 +152,11 @@ void CASettingsStorage::CopySInt32Value(CFStringRef inKey, SInt32& outValue, SIn
{
// initialize the return value
outValue = inDefaultValue;
-
+
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, NULL);
-
+
// for this type, NULL is an invalid value
if(theValue != NULL)
{
@@ -166,7 +166,7 @@ void CASettingsStorage::CopySInt32Value(CFStringRef inKey, SInt32& outValue, SIn
// get the return value from the CF object
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &outValue);
}
-
+
// release the value since we aren't returning it
CFRelease(theValue);
}
@@ -176,11 +176,11 @@ void CASettingsStorage::CopyUInt32Value(CFStringRef inKey, UInt32& outValue, UIn
{
// initialize the return value
outValue = inDefaultValue;
-
+
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, NULL);
-
+
// for this type, NULL is an invalid value
if(theValue != NULL)
{
@@ -190,7 +190,7 @@ void CASettingsStorage::CopyUInt32Value(CFStringRef inKey, UInt32& outValue, UIn
// get the return value from the CF object
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &outValue);
}
-
+
// release the value since we aren't returning it
CFRelease(theValue);
}
@@ -200,11 +200,11 @@ void CASettingsStorage::CopySInt64Value(CFStringRef inKey, SInt64& outValue, SIn
{
// initialize the return value
outValue = inDefaultValue;
-
+
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, NULL);
-
+
// for this type, NULL is an invalid value
if(theValue != NULL)
{
@@ -214,7 +214,7 @@ void CASettingsStorage::CopySInt64Value(CFStringRef inKey, SInt64& outValue, SIn
// get the return value from the CF object
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt64Type, &outValue);
}
-
+
// release the value since we aren't returning it
CFRelease(theValue);
}
@@ -224,11 +224,11 @@ void CASettingsStorage::CopyUInt64Value(CFStringRef inKey, UInt64& outValue, UIn
{
// initialize the return value
outValue = inDefaultValue;
-
+
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, NULL);
-
+
// for this type, NULL is an invalid value
if(theValue != NULL)
{
@@ -238,7 +238,7 @@ void CASettingsStorage::CopyUInt64Value(CFStringRef inKey, UInt64& outValue, UIn
// get the return value from the CF object
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt64Type, &outValue);
}
-
+
// release the value since we aren't returning it
CFRelease(theValue);
}
@@ -248,11 +248,11 @@ void CASettingsStorage::CopyFloat32Value(CFStringRef inKey, Float32& outValue, F
{
// initialize the return value
outValue = inDefaultValue;
-
+
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, NULL);
-
+
// for this type, NULL is an invalid value
if(theValue != NULL)
{
@@ -262,7 +262,7 @@ void CASettingsStorage::CopyFloat32Value(CFStringRef inKey, Float32& outValue, F
// get the return value from the CF object
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberFloat32Type, &outValue);
}
-
+
// release the value since we aren't returning it
CFRelease(theValue);
}
@@ -272,11 +272,11 @@ void CASettingsStorage::CopyFloat64Value(CFStringRef inKey, Float64& outValue, F
{
// initialize the return value
outValue = inDefaultValue;
-
+
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, NULL);
-
+
// for this type, NULL is an invalid value
if(theValue != NULL)
{
@@ -286,7 +286,7 @@ void CASettingsStorage::CopyFloat64Value(CFStringRef inKey, Float64& outValue, F
// get the return value from the CF object
CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberFloat64Type, &outValue);
}
-
+
// release the value since we aren't returning it
CFRelease(theValue);
}
@@ -300,7 +300,7 @@ void CASettingsStorage::CopyNumberValue(CFStringRef inKey, CFNumberRef& outValue
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, inDefaultValue);
-
+
// for this type, NULL is a valid value, but requires less work
if(theValue != NULL)
{
@@ -314,16 +314,16 @@ void CASettingsStorage::CopyNumberValue(CFStringRef inKey, CFNumberRef& outValue
{
// release the value since we aren't returning it
CFRelease(theValue);
-
+
// set the return value to the default value
outValue = inDefaultValue;
-
+
// and retain it
CFRetain(outValue);
}
}
}
-
+
void CASettingsStorage::CopyStringValue(CFStringRef inKey, CFStringRef& outValue, CFStringRef inDefaultValue) const
{
// initialize the return value
@@ -332,7 +332,7 @@ void CASettingsStorage::CopyStringValue(CFStringRef inKey, CFStringRef& outValue
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, inDefaultValue);
-
+
// for this type, NULL is a valid value, but requires less work
if(theValue != NULL)
{
@@ -346,16 +346,16 @@ void CASettingsStorage::CopyStringValue(CFStringRef inKey, CFStringRef& outValue
{
// release the value since we aren't returning it
CFRelease(theValue);
-
+
// set the return value to the default value
outValue = inDefaultValue;
-
+
// and retain it
CFRetain(outValue);
}
}
}
-
+
void CASettingsStorage::CopyArrayValue(CFStringRef inKey, CFArrayRef& outValue, CFArrayRef inDefaultValue) const
{
// initialize the return value
@@ -364,7 +364,7 @@ void CASettingsStorage::CopyArrayValue(CFStringRef inKey, CFArrayRef& outValue,
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, inDefaultValue);
-
+
// for this type, NULL is a valid value, but requires less work
if(theValue != NULL)
{
@@ -378,16 +378,16 @@ void CASettingsStorage::CopyArrayValue(CFStringRef inKey, CFArrayRef& outValue,
{
// release the value since we aren't returning it
CFRelease(theValue);
-
+
// set the return value to the default value
outValue = inDefaultValue;
-
+
// and retain it
CFRetain(outValue);
}
}
}
-
+
void CASettingsStorage::CopyDictionaryValue(CFStringRef inKey, CFDictionaryRef& outValue, CFDictionaryRef inDefaultValue) const
{
// initialize the return value
@@ -396,7 +396,7 @@ void CASettingsStorage::CopyDictionaryValue(CFStringRef inKey, CFDictionaryRef&
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, inDefaultValue);
-
+
// for this type, NULL is a valid value, but requires less work
if(theValue != NULL)
{
@@ -410,16 +410,16 @@ void CASettingsStorage::CopyDictionaryValue(CFStringRef inKey, CFDictionaryRef&
{
// release the value since we aren't returning it
CFRelease(theValue);
-
+
// set the return value to the default value
outValue = inDefaultValue;
-
+
// and retain it
CFRetain(outValue);
}
}
}
-
+
void CASettingsStorage::CopyDataValue(CFStringRef inKey, CFDataRef& outValue, CFDataRef inDefaultValue) const
{
// initialize the return value
@@ -428,7 +428,7 @@ void CASettingsStorage::CopyDataValue(CFStringRef inKey, CFDataRef& outValue, CF
// get the raw value
CFTypeRef theValue = NULL;
CopyCFTypeValue(inKey, theValue, inDefaultValue);
-
+
// for this type, NULL is a valid value, but requires less work
if(theValue != NULL)
{
@@ -442,10 +442,10 @@ void CASettingsStorage::CopyDataValue(CFStringRef inKey, CFDataRef& outValue, CF
{
// release the value since we aren't returning it
CFRelease(theValue);
-
+
// set the return value to the default value
outValue = inDefaultValue;
-
+
// and retain it
CFRetain(outValue);
}
@@ -463,7 +463,7 @@ void CASettingsStorage::CopyCFTypeValue(CFStringRef inKey, CFTypeRef& outValue,
// the key wasn't in the cache, so return the default value
outValue = inDefaultValue;
}
-
+
// make sure we retain the return value
if(outValue != NULL)
{
@@ -536,10 +536,10 @@ void CASettingsStorage::SetCFTypeValue(CFStringRef inKey, CFTypeRef inValue)
{
// make sure our cache is up to date
RefreshSettings();
-
+
// add the new key/value to the dictionary
CFDictionarySetValue(mSettingsCache, inKey, inValue);
-
+
// write the settings to the file
SaveSettings();
}
@@ -548,10 +548,10 @@ void CASettingsStorage::RemoveValue(CFStringRef inKey)
{
// make sure our cache is up to date
RefreshSettings();
-
+
// remove the given key
CFDictionaryRemoveValue(mSettingsCache, inKey);
-
+
// write the settings to the file
SaveSettings();
}
@@ -560,10 +560,10 @@ void CASettingsStorage::RemoveAllValues()
{
// make sure our cache is up to date
RefreshSettings();
-
+
// remove the given key
CFDictionaryRemoveAllValues(mSettingsCache);
-
+
// write the settings to the file
SaveSettings();
}
@@ -593,11 +593,11 @@ void CASettingsStorage::RefreshSettings()
// telling us if the file exisits
struct stat theFileInfo;
int theStatError = stat(mSettingsFilePath, &theFileInfo);
-
+
// we use this boolean to make error recovery easier since we need a case for when there's no file anyway
bool theSettingsWereCached = false;
bool theSettingsNeedSaving = true;
-
+
if(theStatError == 0)
{
// stat says there is something there, only have to do work if we either don't have a cache or the cache is out of date
@@ -615,44 +615,44 @@ void CASettingsStorage::RefreshSettings()
fseek(theFile, 0, SEEK_END);
size_t theFileLength = static_cast<size_t>(ftell(theFile));
fseek(theFile, 0, SEEK_SET);
-
+
if(theFileLength > 0)
{
// allocate a block of memory to hold the data in the file
CAAutoFree<Byte> theRawFileData(theFileLength);
-
+
// read all the data in
fread(static_cast<Byte*>(theRawFileData), theFileLength, 1, theFile);
-
+
// release the lock
flock(fileno(theFile), LOCK_UN);
-
+
// put it into a CFData object
CACFData theRawFileDataCFData(static_cast<Byte*>(theRawFileData), static_cast<UInt32>(theFileLength));
-
+
// get rid of the existing cache
if(mSettingsCache != NULL)
{
CFRelease(mSettingsCache);
mSettingsCache = NULL;
}
-
+
// parse the data as a property list
mSettingsCache = (CFMutableDictionaryRef)CFPropertyListCreateWithData(NULL, theRawFileDataCFData.GetCFData(), kCFPropertyListMutableContainersAndLeaves, NULL, NULL);
-
+
// check to be sure we parsed a plist out of the file
if(mSettingsCache != NULL)
{
// save the date of the cache
mSettingsCacheTime = theFileInfo.st_mtimespec;
-
+
// mark that we're done
theSettingsWereCached = true;
theSettingsNeedSaving = false;
}
}
}
-
+
// close the file
fclose(theFile);
mSettingsCacheForceRefresh = false;
@@ -665,8 +665,8 @@ void CASettingsStorage::RefreshSettings()
theSettingsWereCached = true;
}
}
-
- // if there was a failure, we need to clean up
+
+ // if there was a failure, we need to clean up
if((theStatError != 0) || theSettingsNeedSaving || !theSettingsWereCached)
{
// we get here if either there isn't a file or something wacky happenned while parsing it
@@ -675,10 +675,10 @@ void CASettingsStorage::RefreshSettings()
{
mSettingsCache = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
}
-
+
mSettingsCacheTime.tv_sec = 0;
mSettingsCacheTime.tv_nsec = 0;
-
+
if((theStatError != 0) || theSettingsNeedSaving)
{
SaveSettings();
@@ -693,7 +693,7 @@ void CASettingsStorage::SaveSettings()
{
// make a CFData that contains the new settings
CACFData theNewRawPrefsCFData(CFPropertyListCreateData(NULL, mSettingsCache, mSettingsCacheFormat, 0, NULL), true);
-
+
// open the file for writing
FILE* theFile = fopen(mSettingsFilePath, "w+");
if(theFile != NULL)
@@ -707,23 +707,23 @@ void CASettingsStorage::SaveSettings()
{
fchmod(fileno(theFile), mSettingsFileAccessMode);
}
-
+
// write the data
fwrite(theNewRawPrefsCFData.GetDataPtr(), theNewRawPrefsCFData.GetSize(), 1, theFile);
-
+
// flush the file to be sure it is all on disk
fflush(theFile);
-
+
// release the lock
flock(fileno(theFile), LOCK_UN);
-
+
// close the file
fclose(theFile);
-
+
// stat the file to get the mod date
struct stat theFileInfo;
stat(mSettingsFilePath, &theFileInfo);
-
+
// save the mod date
mSettingsCacheTime = theFileInfo.st_mtimespec;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h
index d15f87d..33d0148 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h
@@ -2,14 +2,14 @@
File: CASettingsStorage.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CASettingsStorage_h__)
#define __CASettingsStorage_h__
@@ -83,13 +83,13 @@ public:
void CopyUInt64Value(const CFStringRef inKey, UInt64& outValue, UInt64 inDefaultValue = 0) const;
void CopyFloat32Value(const CFStringRef inKey, Float32& outValue, Float32 inDefaultValue = 0) const;
void CopyFloat64Value(const CFStringRef inKey, Float64& outValue, Float64 inDefaultValue = 0) const;
- void CopyNumberValue(const CFStringRef inKey, CFNumberRef& outValue, CFNumberRef inDefaultValue = NULL) const;
- void CopyStringValue(const CFStringRef inKey, CFStringRef& outValue, CFStringRef inDefaultValue = NULL) const;
- void CopyArrayValue(const CFStringRef inKey, CFArrayRef& outValue, CFArrayRef inDefaultValue = NULL) const;
- void CopyDictionaryValue(const CFStringRef inKey, CFDictionaryRef& outValue, CFDictionaryRef inDefaultValue = NULL) const;
+ void CopyNumberValue(const CFStringRef inKey, CFNumberRef& outValue, CFNumberRef inDefaultValue = NULL) const;
+ void CopyStringValue(const CFStringRef inKey, CFStringRef& outValue, CFStringRef inDefaultValue = NULL) const;
+ void CopyArrayValue(const CFStringRef inKey, CFArrayRef& outValue, CFArrayRef inDefaultValue = NULL) const;
+ void CopyDictionaryValue(const CFStringRef inKey, CFDictionaryRef& outValue, CFDictionaryRef inDefaultValue = NULL) const;
void CopyDataValue(const CFStringRef inKey, CFDataRef& outValue, CFDataRef inDefaultValue = NULL) const;
void CopyCFTypeValue(const CFStringRef inKey, CFTypeRef& outValue, CFTypeRef inDefaultValue = NULL) const;
-
+
void SetSInt32Value(const CFStringRef inKey, SInt32 inValue);
void SetUInt32Value(const CFStringRef inKey, UInt32 inValue);
void SetSInt64Value(const CFStringRef inKey, SInt64 inValue);
@@ -102,10 +102,10 @@ public:
void SetDictionaryValue(const CFStringRef inKey, const CFDictionaryRef inValue);
void SetDataValue(const CFStringRef inKey, const CFDataRef inValue);
void SetCFTypeValue(const CFStringRef inKey, const CFTypeRef inValue);
-
+
void RemoveValue(const CFStringRef inKey);
void RemoveAllValues();
-
+
void SendNotification(const CFStringRef inName, CFDictionaryRef inData = NULL, bool inPostToAllSessions = true) const;
void ForceRefresh();
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp
index 0e39ac7..d463b4c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp
@@ -2,14 +2,14 @@
File: CASharedLibrary.cpp
Abstract: CASharedLibrary.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -84,7 +84,7 @@ void* CASharedLibrary::LoadLibraryAndGetRoutineAddress(const char* inRoutineName
// off when passed to dlsym
theRoutine = dlsym(theImage, &(inRoutineName[1]));
}
-
+
#endif
return theRoutine;
@@ -93,7 +93,7 @@ void* CASharedLibrary::LoadLibraryAndGetRoutineAddress(const char* inRoutineName
void* CASharedLibrary::GetRoutineAddressIfLibraryLoaded(const char* inRoutineName, const char* /*inLibraryName*/, const char* inLibraryPath)
{
void* theRoutine = 0;
-
+
#if CASharedLibrary_Use_DYLD
const struct mach_header* theImage = NSAddImage(inLibraryPath, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED);
if(theImage != 0)
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h
index d02e70e..e183b1b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h
@@ -2,14 +2,14 @@
File: CASharedLibrary.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CASharedLibrary_h__)
#define __CASharedLibrary_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp
index ffb2da8..85f14cb 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp
@@ -2,14 +2,14 @@
File: CASpectralProcessor.cpp
Abstract: CASpectralProcessor.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,11 +40,11 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
-
+
//#include "AudioFormulas.h"
#include "CASpectralProcessor.h"
#include "CABitOperations.h"
@@ -57,23 +57,23 @@
CASpectralProcessor::CASpectralProcessor(UInt32 inFFTSize, UInt32 inHopSize, UInt32 inNumChannels, UInt32 inMaxFrames)
: mFFTSize(inFFTSize), mHopSize(inHopSize), mNumChannels(inNumChannels), mMaxFrames(inMaxFrames),
- mLog2FFTSize(Log2Ceil(mFFTSize)),
+ mLog2FFTSize(Log2Ceil(mFFTSize)),
mFFTMask(mFFTSize - 1),
mFFTByteSize(mFFTSize * sizeof(Float32)),
mIOBufSize(NextPowerOfTwo(mFFTSize + mMaxFrames)),
mIOMask(mIOBufSize - 1),
mInputSize(0),
- mInputPos(0), mOutputPos(-mFFTSize & mIOMask),
+ mInputPos(0), mOutputPos(-mFFTSize & mIOMask),
mInFFTPos(0), mOutFFTPos(0),
mSpectralFunction(0), mUserData(0)
{
mWindow.alloc(mFFTSize, false);
SineWindow(); // set default window.
-
+
mChannels.alloc(mNumChannels);
mSpectralBufferList.allocBytes(OFFSETOF(SpectralBufferList, mDSPSplitComplex[mNumChannels]), true);
mSpectralBufferList->mNumberSpectra = mNumChannels;
- for (UInt32 i = 0; i < mNumChannels; ++i)
+ for (UInt32 i = 0; i < mNumChannels; ++i)
{
mChannels[i].mInputBuf.alloc(mIOBufSize, true);
mChannels[i].mOutputBuf.alloc(mIOBufSize, true);
@@ -84,7 +84,7 @@ CASpectralProcessor::CASpectralProcessor(UInt32 inFFTSize, UInt32 inHopSize, UIn
}
mFFTSetup = vDSP_create_fftsetup (mLog2FFTSize, FFT_RADIX2);
-
+
}
CASpectralProcessor::~CASpectralProcessor()
@@ -101,8 +101,8 @@ void CASpectralProcessor::Reset()
mOutputPos = -mFFTSize & mIOMask;
mInFFTPos = 0;
mOutFFTPos = 0;
-
- for (UInt32 i = 0; i < mNumChannels; ++i)
+
+ for (UInt32 i = 0; i < mNumChannels; ++i)
{
memset(mChannels[i].mInputBuf(), 0, mIOBufSize * sizeof(Float32));
memset(mChannels[i].mOutputBuf(), 0, mIOBufSize * sizeof(Float32));
@@ -113,13 +113,13 @@ void CASpectralProcessor::Reset()
const double two_pi = 2. * M_PI;
void CASpectralProcessor::HanningWindow()
-{
+{
// this is also vector optimized
double w = two_pi / (double)(mFFTSize - 1);
for (UInt32 i = 0; i < mFFTSize; ++i)
{
- mWindow[i] = (0.5 - 0.5 * cos(w * (double)i));
+ mWindow[i] = (0.5 - 0.5 * cos(w * (double)i));
}
}
@@ -136,9 +136,9 @@ void CASpectralProcessor::Process(UInt32 inNumFrames, AudioBufferList* inInput,
{
// copy from buffer list to input buffer
CopyInput(inNumFrames, inInput);
-
+
// if enough input to process, then process.
- while (mInputSize >= mFFTSize)
+ while (mInputSize >= mFFTSize)
{
CopyInputToFFT(); // copy from input buffer to fft buffer
DoWindowing();
@@ -170,18 +170,18 @@ void CASpectralProcessor::CopyInput(UInt32 inNumFrames, AudioBufferList* inInput
{
UInt32 numBytes = inNumFrames * sizeof(Float32);
UInt32 firstPart = mIOBufSize - mInputPos;
-
+
if (firstPart < inNumFrames) {
UInt32 firstPartBytes = firstPart * sizeof(Float32);
UInt32 secondPartBytes = numBytes - firstPartBytes;
- for (UInt32 i=0; i<mNumChannels; ++i) {
+ for (UInt32 i=0; i<mNumChannels; ++i) {
memcpy(mChannels[i].mInputBuf + mInputPos, inInput->mBuffers[i].mData, firstPartBytes);
memcpy(mChannels[i].mInputBuf, (UInt8*)inInput->mBuffers[i].mData + firstPartBytes, secondPartBytes);
}
} else {
UInt32 numBytes = inNumFrames * sizeof(Float32);
- for (UInt32 i=0; i<mNumChannels; ++i) {
+ for (UInt32 i=0; i<mNumChannels; ++i) {
memcpy(mChannels[i].mInputBuf + mInputPos, inInput->mBuffers[i].mData, numBytes);
}
}
@@ -221,7 +221,7 @@ void CASpectralProcessor::PrintSpectralBufferList()
UInt32 half = mFFTSize >> 1;
for (UInt32 i=0; i<mNumChannels; ++i) {
DSPSplitComplex &freqData = mSpectralBufferList->mDSPSplitComplex[i];
-
+
for (UInt32 j=0; j<half; j++){
printf(" bin[%d]: %lf + %lfi\n", (int) j, freqData.realp[j], freqData.imagp[j]);
}
@@ -277,7 +277,7 @@ void CASpectralProcessor::DoFwdFFT()
{
//printf("->DoFwdFFT %g %g\n", mChannels[0].mFFTBuf()[0], mChannels[0].mFFTBuf()[200]);
UInt32 half = mFFTSize >> 1;
- for (UInt32 i=0; i<mNumChannels; ++i)
+ for (UInt32 i=0; i<mNumChannels; ++i)
{
vDSP_ctoz((DSPComplex*)mChannels[i].mFFTBuf(), 2, &mSpectralBufferList->mDSPSplitComplex[i], 1, half);
vDSP_fft_zrip(mFFTSetup, &mSpectralBufferList->mDSPSplitComplex[i], 1, mLog2FFTSize, FFT_FORWARD);
@@ -289,10 +289,10 @@ void CASpectralProcessor::DoInvFFT()
{
//printf("->DoInvFFT %g %g\n", mChannels[0].mFFTBuf()[0], mChannels[0].mFFTBuf()[200]);
UInt32 half = mFFTSize >> 1;
- for (UInt32 i=0; i<mNumChannels; ++i)
+ for (UInt32 i=0; i<mNumChannels; ++i)
{
vDSP_fft_zrip(mFFTSetup, &mSpectralBufferList->mDSPSplitComplex[i], 1, mLog2FFTSize, FFT_INVERSE);
- vDSP_ztoc(&mSpectralBufferList->mDSPSplitComplex[i], 1, (DSPComplex*)mChannels[i].mFFTBuf(), 2, half);
+ vDSP_ztoc(&mSpectralBufferList->mDSPSplitComplex[i], 1, (DSPComplex*)mChannels[i].mFFTBuf(), 2, half);
float scale = 0.5 / mFFTSize;
vDSP_vsmul(mChannels[i].mFFTBuf(), 1, &scale, mChannels[i].mFFTBuf(), 1, mFFTSize );
}
@@ -301,7 +301,7 @@ void CASpectralProcessor::DoInvFFT()
void CASpectralProcessor::SetSpectralFunction(SpectralFunction inFunction, void* inUserData)
{
- mSpectralFunction = inFunction;
+ mSpectralFunction = inFunction;
mUserData = inUserData;
}
@@ -313,29 +313,29 @@ void CASpectralProcessor::ProcessSpectrum(UInt32 inFFTSize, SpectralBufferList*
#pragma mark ___Utility___
-void CASpectralProcessor::GetMagnitude(AudioBufferList* list, Float32* min, Float32* max)
-{
- UInt32 half = mFFTSize >> 1;
+void CASpectralProcessor::GetMagnitude(AudioBufferList* list, Float32* min, Float32* max)
+{
+ UInt32 half = mFFTSize >> 1;
for (UInt32 i=0; i<mNumChannels; ++i) {
- DSPSplitComplex &freqData = mSpectralBufferList->mDSPSplitComplex[i];
-
+ DSPSplitComplex &freqData = mSpectralBufferList->mDSPSplitComplex[i];
+
Float32* b = (Float32*) list->mBuffers[i].mData;
-
- vDSP_zvabs(&freqData,1,b,1,half);
-
- vDSP_maxmgv(b, 1, &max[i], half);
- vDSP_minmgv(b, 1, &min[i], half);
-
- }
+
+ vDSP_zvabs(&freqData,1,b,1,half);
+
+ vDSP_maxmgv(b, 1, &max[i], half);
+ vDSP_minmgv(b, 1, &min[i], half);
+
+ }
}
void CASpectralProcessor::GetFrequencies(Float32* freqs, Float32 sampleRate)
{
- UInt32 half = mFFTSize >> 1;
+ UInt32 half = mFFTSize >> 1;
for (UInt32 i=0; i< half; i++){
- freqs[i] = ((Float32)(i))*sampleRate/((Float32)mFFTSize);
+ freqs[i] = ((Float32)(i))*sampleRate/((Float32)mFFTSize);
}
}
@@ -344,10 +344,10 @@ bool CASpectralProcessor::ProcessForwards(UInt32 inNumFrames, AudioBufferList* i
{
// copy from buffer list to input buffer
CopyInput(inNumFrames, inInput);
-
+
bool processed = false;
// if enough input to process, then process.
- while (mInputSize >= mFFTSize)
+ while (mInputSize >= mFFTSize)
{
CopyInputToFFT(); // copy from input buffer to fft buffer
DoWindowing();
@@ -355,21 +355,21 @@ bool CASpectralProcessor::ProcessForwards(UInt32 inNumFrames, AudioBufferList* i
ProcessSpectrum(mFFTSize, mSpectralBufferList()); // here you would copy the fft results out to a buffer indicated in mUserData, say for sonogram drawing
processed = true;
}
-
+
return processed;
}
bool CASpectralProcessor::ProcessBackwards(UInt32 inNumFrames, AudioBufferList* outOutput)
-{
-
+{
+
ProcessSpectrum(mFFTSize, mSpectralBufferList());
DoInvFFT();
DoWindowing();
- OverlapAddOutput();
-
+ OverlapAddOutput();
+
// copy from output buffer to buffer list
CopyOutput(inNumFrames, outOutput);
-
+
return true;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h
index d7c285b..7c8b1a7 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h
@@ -2,14 +2,14 @@
File: CASpectralProcessor.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,13 +40,13 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef _SpectralProcesor_H_
#define _SpectralProcesor_H_
-
+
#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
#include <CoreAudio/CoreAudioTypes.h>
#include <CoreFoundation/CoreFoundation.h>
@@ -65,39 +65,39 @@ struct SpectralBufferList
DSPSplitComplex mDSPSplitComplex[1];
};
-class CASpectralProcessor
+class CASpectralProcessor
{
public:
CASpectralProcessor(UInt32 inFFTSize, UInt32 inHopSize, UInt32 inNumChannels, UInt32 inMaxFrames);
virtual ~CASpectralProcessor();
-
+
void Reset();
-
+
void Process(UInt32 inNumFrames, AudioBufferList* inInput, AudioBufferList* outOutput);
-
+
typedef void (*SpectralFunction)(SpectralBufferList* inSpectra, void* inUserData);
-
+
void SetSpectralFunction(SpectralFunction inFunction, void* inUserData);
-
+
UInt32 FFTSize() const { return mFFTSize; }
UInt32 MaxFrames() const { return mMaxFrames; }
UInt32 NumChannels() const { return mNumChannels; }
UInt32 HopSize() const { return mHopSize; }
Float32* Window() const { return mWindow; }
-
-
+
+
void HanningWindow(); // set up a hanning window
void SineWindow();
-
+
void GetFrequencies(Float32* freqs, Float32 sampleRate); // only for processed forward
void GetMagnitude(AudioBufferList* inCopy, Float32* min, Float32* max); // only for processed forward
-
+
virtual bool ProcessForwards(UInt32 inNumFrames, AudioBufferList* inInput);
bool ProcessBackwards(UInt32 inNumFrames, AudioBufferList* outOutput);
void PrintSpectralBufferList();
-
+
protected:
void CopyInput(UInt32 inNumFrames, AudioBufferList* inInput);
void CopyInputToFFT();
@@ -107,14 +107,14 @@ protected:
void OverlapAddOutput();
void CopyOutput(UInt32 inNumFrames, AudioBufferList* inOutput);
void ProcessSpectrum(UInt32 inFFTSize, SpectralBufferList* inSpectra);
-
+
UInt32 mFFTSize;
UInt32 mHopSize;
UInt32 mNumChannels;
UInt32 mMaxFrames;
UInt32 mLog2FFTSize;
- UInt32 mFFTMask;
+ UInt32 mFFTMask;
UInt32 mFFTByteSize;
UInt32 mIOBufSize;
UInt32 mIOMask;
@@ -126,7 +126,7 @@ protected:
FFTSetup mFFTSetup;
CAAutoFree<Float32> mWindow;
- struct SpectralChannel
+ struct SpectralChannel
{
CAAutoFree<Float32> mInputBuf; // log2ceil(FFT size + max frames)
CAAutoFree<Float32> mOutputBuf; // log2ceil(FFT size + max frames)
@@ -136,10 +136,10 @@ protected:
CAAutoArrayDelete<SpectralChannel> mChannels;
CAAutoFree<SpectralBufferList> mSpectralBufferList;
-
+
SpectralFunction mSpectralFunction;
void *mUserData;
-
+
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp
index d56947a..432d513 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp
@@ -2,14 +2,14 @@
File: CAStreamBasicDescription.cpp
Abstract: CAStreamBasicDescription.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAStreamBasicDescription.h"
#include "CAMath.h"
@@ -72,12 +72,12 @@ char *CAStringForOSType (OSType t, char *writeLocation, size_t bufsize)
q++;
}
q = u.str;
-
+
if (hasNonPrint)
p += snprintf (p, pend - p, "0x");
else if (p < pend)
*p++ = '\'';
-
+
for (int i = 0; i < 4 && p < pend; ++i) {
if (hasNonPrint) {
p += snprintf(p, pend - p, "%02X", *q++);
@@ -96,11 +96,11 @@ char *CAStringForOSType (OSType t, char *writeLocation, size_t bufsize)
const AudioStreamBasicDescription CAStreamBasicDescription::sEmpty = { 0.0, 0, 0, 0, 0, 0, 0, 0, 0 };
-CAStreamBasicDescription::CAStreamBasicDescription()
-{
- memset (this, 0, sizeof(AudioStreamBasicDescription));
+CAStreamBasicDescription::CAStreamBasicDescription()
+{
+ memset (this, 0, sizeof(AudioStreamBasicDescription));
}
-
+
CAStreamBasicDescription::CAStreamBasicDescription(const AudioStreamBasicDescription &desc)
{
SetFrom(desc);
@@ -165,15 +165,15 @@ char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize, bool brief
return theBuffer;
}
}
-
+
nc = snprintf(buf, static_cast<size_t>(bufsize), "%2d ch, %6.0f Hz, %s (0x%08X) ", (int)NumberChannels(), mSampleRate, formatID, (int)mFormatFlags);
buf += nc; if ((bufsize -= nc) <= 0) goto exit;
if (mFormatID == kAudioFormatLinearPCM) {
bool isInt = !(mFormatFlags & kLinearPCMFormatFlagIsFloat);
int wordSize = static_cast<int>(SampleWordSize());
- const char *endian = (wordSize > 1) ?
+ const char *endian = (wordSize > 1) ?
((mFormatFlags & kLinearPCMFormatFlagIsBigEndian) ? " big-endian" : " little-endian" ) : "";
- const char *sign = isInt ?
+ const char *sign = isInt ?
((mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) ? " signed" : " unsigned") : "";
const char *floatInt = isInt ? "integer" : "float";
char packed[32];
@@ -195,9 +195,9 @@ char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize, bool brief
snprintf(bitdepth, sizeof(bitdepth), "%d.%d", (int)mBitsPerChannel - fracbits, fracbits);
else
snprintf(bitdepth, sizeof(bitdepth), "%d", (int)mBitsPerChannel);
-
+
/*nc =*/ snprintf(buf, static_cast<size_t>(bufsize), "%s-bit%s%s %s%s%s%s%s",
- bitdepth, endian, sign, floatInt,
+ bitdepth, endian, sign, floatInt,
commaSpace, packed, align, deinter);
// buf += nc; if ((bufsize -= nc) <= 0) goto exit;
} else if (mFormatID == kAudioFormatAppleLossless) {
@@ -226,7 +226,7 @@ char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize, bool brief
// buf += nc; if ((bufsize -= nc) <= 0) goto exit;
}
else
- /*nc =*/ snprintf(buf, static_cast<size_t>(bufsize), "%d bits/channel, %d bytes/packet, %d frames/packet, %d bytes/frame",
+ /*nc =*/ snprintf(buf, static_cast<size_t>(bufsize), "%d bits/channel, %d bytes/packet, %d frames/packet, %d bytes/frame",
(int)mBitsPerChannel, (int)mBytesPerPacket, (int)mFramesPerPacket, (int)mBytesPerFrame);
exit:
return theBuffer;
@@ -328,7 +328,7 @@ void CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
outName += theCharactersWritten;
inMaxNameLength -= static_cast<UInt32>(theCharactersWritten);
}
-
+
switch(inDescription.mFormatID)
{
case kAudioFormatLinearPCM:
@@ -346,7 +346,7 @@ void CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
theEndianString = "Little Endian";
#endif
}
-
+
const char* theKindString = NULL;
if((inDescription.mFormatFlags & kAudioFormatFlagIsFloat) != 0)
{
@@ -360,7 +360,7 @@ void CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
{
theKindString = (inAbbreviate ? "UInt" : "Unsigned Integer");
}
-
+
const char* thePackingString = NULL;
if((inDescription.mFormatFlags & kAudioFormatFlagIsPacked) == 0)
{
@@ -373,7 +373,7 @@ void CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
thePackingString = "Low";
}
}
-
+
const char* theMixabilityString = NULL;
if((inDescription.mFormatFlags & kIsNonMixableFlag) == 0)
{
@@ -383,7 +383,7 @@ void CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
{
theMixabilityString = "Unmixable";
}
-
+
if(inAbbreviate)
{
if(theEndianString != NULL)
@@ -436,15 +436,15 @@ void CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
}
}
break;
-
+
case kAudioFormatAC3:
strlcpy(outName, "AC-3", sizeof(outName));
break;
-
+
case kAudioFormat60958AC3:
strlcpy(outName, "AC-3 for SPDIF", sizeof(outName));
break;
-
+
default:
CACopy4CCToCString(outName, inDescription.mFormatID);
break;
@@ -471,9 +471,9 @@ bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
{
bool theAnswer = false;
bool isDone = false;
-
+
// note that if either side is 0, that field is skipped
-
+
// format ID is the first order sort
if((!isDone) && ((x.mFormatID != 0) && (y.mFormatID != 0)))
{
@@ -496,8 +496,8 @@ bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
isDone = true;
}
}
-
-
+
+
// mixable is always better than non-mixable for linear PCM and should be the second order sort item
if((!isDone) && ((x.mFormatID == kAudioFormatLinearPCM) && (y.mFormatID == kAudioFormatLinearPCM)))
{
@@ -512,7 +512,7 @@ bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
isDone = true;
}
}
-
+
// floating point vs integer for linear PCM only
if((!isDone) && ((x.mFormatID == kAudioFormatLinearPCM) && (y.mFormatID == kAudioFormatLinearPCM)))
{
@@ -523,7 +523,7 @@ bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
isDone = true;
}
}
-
+
// bit depth
if((!isDone) && ((x.mBitsPerChannel != 0) && (y.mBitsPerChannel != 0)))
{
@@ -534,7 +534,7 @@ bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
isDone = true;
}
}
-
+
// sample rate
if((!isDone) && fnonzero(x.mSampleRate) && fnonzero(y.mSampleRate))
{
@@ -545,7 +545,7 @@ bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
isDone = true;
}
}
-
+
// number of channels
if((!isDone) && ((x.mChannelsPerFrame != 0) && (y.mChannelsPerFrame != 0)))
{
@@ -556,7 +556,7 @@ bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
//isDone = true;
}
}
-
+
return theAnswer;
}
@@ -569,24 +569,24 @@ void CAStreamBasicDescription::ModifyFormatFlagsForMatching(const AudioStreamBas
xFlags = yFlags = 0;
return;
}
-
+
if (x.mFormatID == kAudioFormatLinearPCM) {
// knock off the all clear flag
xFlags = xFlags & ~kAudioFormatFlagsAreAllClear;
yFlags = yFlags & ~kAudioFormatFlagsAreAllClear;
-
+
// if both kAudioFormatFlagIsPacked bits are set, then we don't care about the kAudioFormatFlagIsAlignedHigh bit.
if (xFlags & yFlags & kAudioFormatFlagIsPacked) {
xFlags = xFlags & ~static_cast<UInt32>(kAudioFormatFlagIsAlignedHigh);
yFlags = yFlags & ~static_cast<UInt32>(kAudioFormatFlagIsAlignedHigh);
}
-
+
// if both kAudioFormatFlagIsFloat bits are set, then we don't care about the kAudioFormatFlagIsSignedInteger bit.
if (xFlags & yFlags & kAudioFormatFlagIsFloat) {
xFlags = xFlags & ~static_cast<UInt32>(kAudioFormatFlagIsSignedInteger);
yFlags = yFlags & ~static_cast<UInt32>(kAudioFormatFlagIsSignedInteger);
}
-
+
// if the bit depth is 8 bits or less and the format is packed, we don't care about endianness
if((x.mBitsPerChannel <= 8) && ((xFlags & kAudioFormatFlagIsPacked) == kAudioFormatFlagIsPacked))
{
@@ -596,13 +596,13 @@ void CAStreamBasicDescription::ModifyFormatFlagsForMatching(const AudioStreamBas
{
yFlags = yFlags & ~static_cast<UInt32>(kAudioFormatFlagIsBigEndian);
}
-
+
// if the number of channels is 1, we don't care about non-interleavedness
if (x.mChannelsPerFrame == 1 && y.mChannelsPerFrame == 1) {
xFlags &= ~static_cast<UInt32>(kLinearPCMFormatFlagIsNonInterleaved);
yFlags &= ~static_cast<UInt32>(kLinearPCMFormatFlagIsNonInterleaved);
}
-
+
if (converterOnly) {
CAStreamBasicDescription cas_x = CAStreamBasicDescription(x);
CAStreamBasicDescription cas_y = CAStreamBasicDescription(y);
@@ -625,7 +625,7 @@ static bool MatchFormatFlags(const AudioStreamBasicDescription& x, const AudioSt
{
UInt32 xFlags = x.mFormatFlags;
UInt32 yFlags = y.mFormatFlags;
-
+
CAStreamBasicDescription::ModifyFormatFlagsForMatching(x, y, xFlags, yFlags, false);
return xFlags == yFlags;
}
@@ -635,37 +635,37 @@ bool operator==(const AudioStreamBasicDescription& x, const AudioStreamBasicDesc
// the semantics for equality are:
// 1) Values must match exactly -- except for PCM format flags, see above.
// 2) wildcard's are ignored in the comparison
-
+
#define MATCH(name) ((x.name) == 0 || (y.name) == 0 || (x.name) == (y.name))
-
- return
+
+ return
// check all but the format flags
CAStreamBasicDescription::FlagIndependentEquivalence(x, y)
// check the format flags
- && MatchFormatFlags(x, y);
+ && MatchFormatFlags(x, y);
}
bool CAStreamBasicDescription::FlagIndependentEquivalence(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y)
{
- return
+ return
// check the sample rate
(fiszero(x.mSampleRate) || fiszero(y.mSampleRate) || fequal(x.mSampleRate, y.mSampleRate))
-
+
// check the format ids
&& MATCH(mFormatID)
-
+
// check the bytes per packet
- && MATCH(mBytesPerPacket)
-
+ && MATCH(mBytesPerPacket)
+
// check the frames per packet
- && MATCH(mFramesPerPacket)
-
+ && MATCH(mFramesPerPacket)
+
// check the bytes per frame
- && MATCH(mBytesPerFrame)
-
+ && MATCH(mBytesPerFrame)
+
// check the channels per frame
- && MATCH(mChannelsPerFrame)
-
+ && MATCH(mChannelsPerFrame)
+
// check the channels per frame
&& MATCH(mBitsPerChannel) ;
}
@@ -679,15 +679,15 @@ bool CAStreamBasicDescription::IsEqual(const AudioStreamBasicDescription &other,
bool CAStreamBasicDescription::IsFunctionallyEquivalent(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y)
{
- UInt32 xFlags = x.mFormatFlags, yFlags = y.mFormatFlags;
+ UInt32 xFlags = x.mFormatFlags, yFlags = y.mFormatFlags;
CAStreamBasicDescription::ModifyFormatFlagsForMatching(x, y, xFlags, yFlags, true);
-
+
return
// check all but the format flags
CAStreamBasicDescription::FlagIndependentEquivalence(x, y)
// check the format flags with converter focus
&& (xFlags == yFlags);
-
+
}
bool SanityCheck(const AudioStreamBasicDescription& x)
@@ -695,9 +695,9 @@ bool SanityCheck(const AudioStreamBasicDescription& x)
// This function returns false if there are sufficiently insane values in any field.
// It is very conservative so even some very unlikely values will pass.
// This is just meant to catch the case where the data from a file is corrupted.
-
- return
- (x.mSampleRate >= 0.)
+
+ return
+ (x.mSampleRate >= 0.)
&& (x.mSampleRate < 3e6) // SACD sample rate is 2.8224 MHz
&& (x.mBytesPerPacket < 1000000)
&& (x.mFramesPerPacket < 1000000)
@@ -711,7 +711,7 @@ bool SanityCheck(const AudioStreamBasicDescription& x)
bool CAStreamBasicDescription::FromText(const char *inTextDesc, AudioStreamBasicDescription &fmt)
{
const char *p = inTextDesc;
-
+
memset(&fmt, 0, sizeof(fmt));
bool isPCM = true; // until proven otherwise
@@ -764,18 +764,18 @@ bool CAStreamBasicDescription::FromText(const char *inTextDesc, AudioStreamBasic
p += 2;
}
}
-
+
if (strchr("-@/#", buf[3])) {
// further special-casing for 'aac'
buf[3] = ' ';
--p;
}
-
+
memcpy(&fmt.mFormatID, buf, 4);
fmt.mFormatID = CFSwapInt32BigToHost(fmt.mFormatID);
}
}
-
+
if (isPCM) {
fmt.mFormatID = kAudioFormatLinearPCM;
fmt.mFormatFlags = pcmFlags;
@@ -874,6 +874,6 @@ Bail:
return false;
}
-const char *CAStreamBasicDescription::sTextParsingUsageString =
+const char *CAStreamBasicDescription::sTextParsingUsageString =
"format[@sample_rate_hz][/format_flags][#frames_per_packet][:LHbytesPerFrame][,channelsDI].\n"
"Format for PCM is [-][BE|LE]{F|I|UI}{bitdepth}; else a 4-char format code (e.g. aac, alac).\n";
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h
index 8b81dba..6c6b7a1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h
@@ -2,14 +2,14 @@
File: CAStreamBasicDescription.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAStreamBasicDescription_h__
#define __CAStreamBasicDescription_h__
@@ -90,14 +90,14 @@ enum {
// It adds a number of convenience routines, but otherwise adds nothing
// to the footprint of the original struct.
//=============================================================================
-class CAStreamBasicDescription :
+class CAStreamBasicDescription :
public AudioStreamBasicDescription
{
// Constants
public:
static const AudioStreamBasicDescription sEmpty;
-
+
enum CommonPCMFormat {
kPCMFormatOther = 0,
kPCMFormatFloat32 = 1,
@@ -105,13 +105,13 @@ public:
kPCMFormatFixed824 = 3,
kPCMFormatFloat64 = 4
};
-
+
// Construction/Destruction
public:
CAStreamBasicDescription();
-
+
CAStreamBasicDescription(const AudioStreamBasicDescription &desc);
-
+
CAStreamBasicDescription( double inSampleRate, UInt32 inFormatID,
UInt32 inBytesPerPacket, UInt32 inFramesPerPacket,
UInt32 inBytesPerFrame, UInt32 inChannelsPerFrame,
@@ -164,55 +164,55 @@ public:
{
memcpy(this, &desc, sizeof(AudioStreamBasicDescription));
}
-
+
bool FromText(const char *inTextDesc) { return FromText(inTextDesc, *this); }
static bool FromText(const char *inTextDesc, AudioStreamBasicDescription &outDesc);
// return true if parsing was successful
-
+
static const char *sTextParsingUsageString;
-
+
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
//
// interrogation
-
+
bool IsPCM() const { return mFormatID == kAudioFormatLinearPCM; }
-
+
bool PackednessIsSignificant() const
{
Assert(IsPCM(), "PackednessIsSignificant only applies for PCM");
return (SampleWordSize() << 3) != mBitsPerChannel;
}
-
+
bool AlignmentIsSignificant() const
{
return PackednessIsSignificant() || (mBitsPerChannel & 7) != 0;
}
-
+
bool IsInterleaved() const
{
return !(mFormatFlags & kAudioFormatFlagIsNonInterleaved);
}
-
+
bool IsSignedInteger() const
{
return IsPCM() && (mFormatFlags & kAudioFormatFlagIsSignedInteger);
}
-
+
bool IsFloat() const
{
return IsPCM() && (mFormatFlags & kAudioFormatFlagIsFloat);
}
-
+
bool IsNativeEndian() const
{
return (mFormatFlags & kAudioFormatFlagIsBigEndian) == kAudioFormatFlagsNativeEndian;
}
-
+
// for sanity with interleaved/deinterleaved possibilities, never access mChannelsPerFrame, use these:
- UInt32 NumberInterleavedChannels() const { return IsInterleaved() ? mChannelsPerFrame : 1; }
+ UInt32 NumberInterleavedChannels() const { return IsInterleaved() ? mChannelsPerFrame : 1; }
UInt32 NumberChannelStreams() const { return IsInterleaved() ? 1 : mChannelsPerFrame; }
UInt32 NumberChannels() const { return mChannelsPerFrame; }
- UInt32 SampleWordSize() const {
+ UInt32 SampleWordSize() const {
return (mBytesPerFrame > 0 && NumberInterleavedChannels()) ? mBytesPerFrame / NumberInterleavedChannels() : 0;
}
@@ -221,15 +221,15 @@ public:
Assert(mBytesPerFrame > 0, "bytesPerFrame must be > 0 in BytesToFrames");
return nbytes / mBytesPerFrame;
}
-
+
bool SameChannelsAndInterleaving(const CAStreamBasicDescription &a) const
{
return this->NumberChannels() == a.NumberChannels() && this->IsInterleaved() == a.IsInterleaved();
}
-
+
bool IdentifyCommonPCMFormat(CommonPCMFormat &outFormat, bool *outIsInterleaved=NULL) const
{ // return true if it's a valid PCM format.
-
+
outFormat = kPCMFormatOther;
// trap out patently invalid formats.
if (mFormatID != kAudioFormatLinearPCM || mFramesPerPacket != 1 || mBytesPerFrame != mBytesPerPacket || mBitsPerChannel/8 > mBytesPerFrame || mChannelsPerFrame == 0)
@@ -241,7 +241,7 @@ public:
if (wordsize % mChannelsPerFrame != 0) return false;
wordsize /= mChannelsPerFrame;
}
-
+
if ((mFormatFlags & kAudioFormatFlagIsBigEndian) == kAudioFormatFlagsNativeEndian
&& wordsize * 8 == mBitsPerChannel) {
// packed and native endian, good
@@ -281,11 +281,11 @@ public:
CommonPCMFormat fmt;
return IdentifyCommonPCMFormat(fmt, outIsInterleaved) && fmt == kPCMFormatInt16;
}
-
+
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
//
// manipulation
-
+
void SetCanonical(UInt32 nChannels, bool interleaved)
// note: leaves sample rate untouched
{
@@ -302,7 +302,7 @@ public:
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
}
-
+
bool IsCanonical() const
{
if (mFormatID != kAudioFormatLinearPCM) return false;
@@ -319,7 +319,7 @@ public:
&& mBytesPerFrame == reqFrameSize
&& mBytesPerPacket == reqFrameSize);
}
-
+
void SetAUCanonical(UInt32 nChannels, bool interleaved)
{
mFormatID = kAudioFormatLinearPCM;
@@ -338,7 +338,7 @@ public:
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
}
-
+
void ChangeNumberChannels(UInt32 nChannels, bool interleaved)
// alter an existing format
{
@@ -356,28 +356,28 @@ public:
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
}
-
+
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
//
// other
-
+
bool IsEqual(const AudioStreamBasicDescription &other, bool interpretingWildcards=true) const;
static bool FlagIndependentEquivalence(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y);
static bool IsFunctionallyEquivalent(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y);
-
+
void Print() const {
Print (stdout);
}
void Print(FILE* file) const {
- PrintFormat (file, "", "AudioStreamBasicDescription:");
+ PrintFormat (file, "", "AudioStreamBasicDescription:");
}
void PrintFormat(FILE *f, const char *indent, const char *name) const {
char buf[256];
fprintf(f, "%s%s %s\n", indent, name, AsString(buf, sizeof(buf)));
}
-
+
void PrintFormat2(FILE *f, const char *indent, const char *name) const { // no trailing newline
char buf[256];
fprintf(f, "%s%s %s", indent, name, AsString(buf, sizeof(buf)));
@@ -385,14 +385,14 @@ public:
char * AsString(char *buf, size_t bufsize, bool brief=false) const;
- static void Print (const AudioStreamBasicDescription &inDesc)
- {
+ static void Print (const AudioStreamBasicDescription &inDesc)
+ {
CAStreamBasicDescription desc(inDesc);
desc.Print ();
}
-
+
OSStatus Save(CFPropertyListRef *outData) const;
-
+
OSStatus Restore(CFPropertyListRef &inData);
// Operations
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp
index 9b72054..99d3e0c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp
@@ -2,14 +2,14 @@
File: CAStreamRangedDescription.cpp
Abstract: CAStreamRangedDescription.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//==================================================================================================
// Includes
@@ -80,9 +80,9 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
{
bool theAnswer = false;
bool isDone = false;
-
+
// note that if either side is 0, that field is skipped
-
+
// format ID is the first order sort
if((!isDone) && ((x.mFormat.mFormatID != 0) && (y.mFormat.mFormatID != 0)))
{
@@ -105,8 +105,8 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
isDone = true;
}
}
-
-
+
+
// mixable is always better than non-mixable for linear PCM and should be the second order sort item
if((!isDone) && ((x.mFormat.mFormatID == kAudioFormatLinearPCM) && (y.mFormat.mFormatID == kAudioFormatLinearPCM)))
{
@@ -121,7 +121,7 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
isDone = true;
}
}
-
+
// floating point vs integer for linear PCM only
if((!isDone) && ((x.mFormat.mFormatID == kAudioFormatLinearPCM) && (y.mFormat.mFormatID == kAudioFormatLinearPCM)))
{
@@ -132,7 +132,7 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
isDone = true;
}
}
-
+
// bit depth
if((!isDone) && ((x.mFormat.mBitsPerChannel != 0) && (y.mFormat.mBitsPerChannel != 0)))
{
@@ -143,7 +143,7 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
isDone = true;
}
}
-
+
// sample rate range
if((!isDone) && fnonzero(x.mSampleRateRange.mMinimum) && fnonzero(x.mSampleRateRange.mMaximum) && fnonzero(y.mSampleRateRange.mMinimum) && fnonzero(y.mSampleRateRange.mMaximum))
{
@@ -154,7 +154,7 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
isDone = true;
}
}
-
+
// sample rate
if((!isDone) && fnonzero(x.mFormat.mSampleRate) && fnonzero(y.mFormat.mSampleRate))
{
@@ -165,7 +165,7 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
isDone = true;
}
}
-
+
// number of channels
if((!isDone) && ((x.mFormat.mChannelsPerFrame != 0) && (y.mFormat.mChannelsPerFrame != 0)))
{
@@ -177,7 +177,7 @@ bool CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
//isDone = true;
}
}
-
+
return theAnswer;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h
index 7f8284d..2c439a5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h
@@ -2,14 +2,14 @@
File: CAStreamRangedDescription.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAStreamRangedDescription_h__)
#define __CAStreamRangedDescription_h__
@@ -89,7 +89,7 @@ public:
};
-inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y) { return (x.mFormat.mFormatID == y.mFormat.mFormatID) ?
+inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y) { return (x.mFormat.mFormatID == y.mFormat.mFormatID) ?
(x.mFormat < y.mFormat) && (x.mSampleRateRange < y.mSampleRateRange) :
(x.mFormat.mFormatID == kAudioFormatLinearPCM) ? false : (x.mFormat.mFormatID < y.mFormat.mFormatID); }
inline bool operator==(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y) { return (x.mFormat == y.mFormat) && (x.mSampleRateRange == y.mSampleRateRange); }
@@ -100,10 +100,10 @@ inline bool operator>=(const AudioStreamRangedDescription& x, const AudioStreamR
inline bool operator>(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y) { return !((x < y) || (x == y)); }
#endif
-inline bool operator<(const AudioStreamBasicDescription& x, const AudioStreamRangedDescription& y) { return (x.mFormatID == y.mFormat.mFormatID) ?
+inline bool operator<(const AudioStreamBasicDescription& x, const AudioStreamRangedDescription& y) { return (x.mFormatID == y.mFormat.mFormatID) ?
(x < y.mFormat) && (x.mSampleRate < y.mSampleRateRange.mMinimum) :
(x.mFormatID == kAudioFormatLinearPCM) ? false : (x.mFormatID < y.mFormat.mFormatID); }
-inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamBasicDescription& y) { return (x.mFormat.mFormatID == y.mFormatID) ?
+inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamBasicDescription& y) { return (x.mFormat.mFormatID == y.mFormatID) ?
(x.mFormat < y) && (x.mSampleRateRange.mMinimum < y.mSampleRate) :
(x.mFormat.mFormatID == kAudioFormatLinearPCM) ? false : (x.mFormat.mFormatID < y.mFormatID); }
inline bool operator==(const AudioStreamBasicDescription& x, const AudioStreamRangedDescription& y) { return (x == y.mFormat) && CAAudioValueRange::ContainsValue(y.mSampleRateRange, x.mSampleRate); }
@@ -126,7 +126,7 @@ struct CAStreamRangedDescription_EqualToASBD
{
CAStreamRangedDescription_EqualToASBD(const AudioStreamBasicDescription& inFormat) : mFormat(inFormat) {}
bool operator()(const AudioStreamRangedDescription& x) const { return mFormat == x; }
-
+
AudioStreamBasicDescription mFormat;
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h b/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h
index d0b7391..18c3a0d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h
@@ -2,14 +2,14 @@
File: CAThreadSafeList.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAThreadSafeList_h__
#define __CAThreadSafeList_h__
@@ -60,7 +60,7 @@ private:
Node * mNext;
EEventType mEventType;
T mObject;
-
+
Node *& next() { return mNext; }
};
@@ -69,19 +69,19 @@ public:
public:
iterator() { }
iterator(Node *n) : mNode(n) { }
-
+
bool operator == (const iterator &other) const { return this->mNode == other.mNode; }
bool operator != (const iterator &other) const { return this->mNode != other.mNode; }
-
+
T & operator * () const { return mNode->mObject; }
-
+
iterator & operator ++ () { mNode = mNode->next(); return *this; } // preincrement
iterator operator ++ (int) { iterator tmp = *this; mNode = mNode->next(); return tmp; } // postincrement
-
+
private:
Node * mNode;
};
-
+
TThreadSafeList() { }
~TThreadSafeList()
{
@@ -89,9 +89,9 @@ public:
mPendingList.free_all();
mFreeList.free_all();
}
-
+
// These may be called on any thread
-
+
void deferred_add(const T &obj) // can be called on any thread
{
Node *node = AllocNode();
@@ -100,7 +100,7 @@ public:
mPendingList.push_atomic(node);
//mPendingList.dump("pending after add");
}
-
+
void deferred_remove(const T &obj) // can be called on any thread
{
Node *node = AllocNode();
@@ -109,22 +109,22 @@ public:
mPendingList.push_atomic(node);
//mPendingList.dump("pending after remove");
}
-
+
void deferred_clear() // can be called on any thread
{
Node *node = AllocNode();
node->mEventType = kClear;
mPendingList.push_atomic(node);
}
-
+
// These must be called from only one thread
-
+
void update() // must only be called from one thread
{
NodeStack reversed;
Node *event, *node, *next;
bool workDone = false;
-
+
// reverse the events so they are in order
event = mPendingList.pop_all();
while (event != NULL) {
@@ -136,7 +136,7 @@ public:
if (workDone) {
//reversed.dump("pending popped");
//mActiveList.dump("active before update");
-
+
// now process them
while ((event = reversed.pop_NA()) != NULL) {
switch (event->mEventType) {
@@ -190,14 +190,14 @@ public:
//mActiveList.dump("active after update");
}
}
-
+
iterator begin() const {
//mActiveList.dump("active at begin");
return iterator(mActiveList.head());
}
iterator end() const { return iterator(NULL); }
-
+
private:
Node * AllocNode()
{
@@ -206,7 +206,7 @@ private:
node = (Node *)CA_malloc(sizeof(Node));
return node;
}
-
+
void FreeNode(Node *node)
{
mFreeList.push_atomic(node);
@@ -220,7 +220,7 @@ private:
while ((node = this->pop_NA()) != NULL)
free(node);
}
-
+
Node ** phead() { return &this->mHead; }
Node * head() const { return this->mHead; }
};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CATink.h b/libs/appleutility/CoreAudio/PublicUtility/CATink.h
index f082935..fa279c3 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CATink.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CATink.h
@@ -2,14 +2,14 @@
File: CATink.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CATink_h__)
#define __CATink_h__
@@ -74,7 +74,7 @@ class CATink
public:
CATink(F proc) { Set(proc); }
-
+
~CATink() { Set((F)0xDEADDEAD); } // jump to an obviously bad (odd) address if accessed after destruction
#if TARGET_CPU_PPC
@@ -97,7 +97,7 @@ public:
mCode[3] = 0x4E800420;
MakeDataExecutable(mCode, sizeof(mCode));
}
-
+
operator F () { return F(mCode); }
private:
@@ -107,7 +107,7 @@ private:
{
/*
<tink>: push $0x12345678
- <tink+5>: ret
+ <tink+5>: ret
<tink>: 0x34567868
<tink+4>: 0x00e8c312
*/
@@ -123,14 +123,14 @@ private:
UInt32 mCode[2];
#else
#warning: CPU not directly supported by CATink
-
+
// For other CPU's, just wrap the function pointer for now.
// this bypasses what we're trying to accomplish with the Tink
// (multiple unique "instances" of a function), but it will at
// least compile and run.
void Set(F proc) { mProcPtr = proc; }
-
+
operator F () { return mProcPtr; }
private:
F mProcPtr;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h b/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h
index f85f393..e1272b8 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h
@@ -2,14 +2,14 @@
File: CATokenMap.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CATokenMap_h__)
#define __CATokenMap_h__
@@ -88,7 +88,7 @@ public:
{
return mTokenMapMutex.Lock();
}
-
+
void Unlock()
{
mTokenMapMutex.Unlock();
@@ -109,7 +109,7 @@ public:
}
return theAnswer;
}
-
+
T* GetObject(UInt32 inToken) const
{
CAMutex::Locker theLocker(const_cast<CAMutex&>(mTokenMapMutex));
@@ -125,13 +125,13 @@ public:
return GetObject((UInt32)inToken);
#endif
}
-
+
UInt32 GetNumberObjects() const
{
CAMutex::Locker theLocker(const_cast<CAMutex&>(mTokenMapMutex));
return static_cast<UInt32>(mTokenMap.size());
}
-
+
T* GetObjectByIndex(UInt32 inIndex) const
{
T* theAnswer = NULL;
@@ -144,7 +144,7 @@ public:
}
return theAnswer;
}
-
+
void AddMapping(UInt32 inToken, T* inObject)
{
CAMutex::Locker theLocker(mTokenMapMutex);
@@ -158,7 +158,7 @@ public:
mTokenMap.insert(typename TokenMap::value_type(inToken, inObject));
}
}
-
+
void RemoveMapping(UInt32 inToken, T* /*inObject*/)
{
CAMutex::Locker theLocker(mTokenMapMutex);
@@ -168,12 +168,12 @@ public:
mTokenMap.erase(i);
}
}
-
+
UInt32 GetNextToken()
{
return mNextToken++;
}
-
+
UInt32 MapObject(T* inObject)
{
CAMutex::Locker theLocker(mTokenMapMutex);
@@ -181,7 +181,7 @@ public:
mTokenMap.insert(typename TokenMap::value_type(theToken, inObject));
return theToken;
}
-
+
void UnmapObject(T* inObject)
{
CAMutex::Locker theLocker(mTokenMapMutex);
@@ -202,7 +202,7 @@ public:
}
// Implementation
-private:
+private:
TokenMap mTokenMap;
UInt32 mNextToken;
CAMutex mTokenMapMutex;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp
index 83bfb8c..2737855 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp
@@ -2,14 +2,14 @@
File: CAVectorUnit.cpp
Abstract: CAVectorUnit.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAVectorUnit.h"
@@ -101,17 +101,17 @@ static bool IsCpuidAvailable()
{
SInt32 return_value = 0x0;
_asm{
- pushfd ; //push original EFLAGS
- pop eax ; //get original EFLAGS
- mov ecx, eax ; //save original EFLAGS
- xor eax, 200000h ; //flip ID bit in EFLAGS
- push eax ; //save new EFLAGS value on stack
- popfd ; //replace current EFLAGS value
- pushfd ; //get new EFLAGS
- pop eax ; //store new EFLAGS in EAX
- xor eax, ecx ;
+ pushfd ; //push original EFLAGS
+ pop eax ; //get original EFLAGS
+ mov ecx, eax ; //save original EFLAGS
+ xor eax, 200000h ; //flip ID bit in EFLAGS
+ push eax ; //save new EFLAGS value on stack
+ popfd ; //replace current EFLAGS value
+ pushfd ; //get new EFLAGS
+ pop eax ; //store new EFLAGS in EAX
+ xor eax, ecx ;
je end_cpuid_identify ; //can't toggle ID bit
- mov return_value, 0x1;
+ mov return_value, 0x1;
end_cpuid_identify:
nop;
}
@@ -123,9 +123,9 @@ end_cpuid_identify:
SInt32 CAVectorUnit_Examine()
{
int result = kVecNone;
-
+
#if TARGET_OS_WIN32
-#if HAS_IPP
+#if HAS_IPP
// Initialize the static IPP library! This needs to be done before
// any IPP function calls, otherwise we may have a performance penalty
int status = ippStaticInit();
@@ -156,7 +156,7 @@ SInt32 CAVectorUnit_Examine()
if (getenv("CA_NoVector")) {
fprintf(stderr, "CA_NoVector set; Vector unit optimized routines will be bypassed\n");
return result;
- }
+ }
else
#endif
{
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h
index cf3a16c..604fe84 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h
@@ -2,14 +2,14 @@
File: CAVectorUnit.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAVectorUnit_h__
#define __CAVectorUnit_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h
index 85ff837..2efb2e6 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h
@@ -2,14 +2,14 @@
File: CAVectorUnitTypes.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAVectorUnitTypes_h__
#define __CAVectorUnitTypes_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp
index bb6e70c..5431d20 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp
@@ -2,14 +2,14 @@
File: CAVolumeCurve.cpp
Abstract: CAVolumeCurve.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
//=============================================================================
// Includes
@@ -74,61 +74,61 @@ CAVolumeCurve::~CAVolumeCurve()
SInt32 CAVolumeCurve::GetMinimumRaw() const
{
SInt32 theAnswer = 0;
-
+
if(!mCurveMap.empty())
{
CurveMap::const_iterator theIterator = mCurveMap.begin();
theAnswer = theIterator->first.mMinimum;
}
-
+
return theAnswer;
}
SInt32 CAVolumeCurve::GetMaximumRaw() const
{
SInt32 theAnswer = 0;
-
+
if(!mCurveMap.empty())
{
CurveMap::const_iterator theIterator = mCurveMap.begin();
std::advance(theIterator, static_cast<int>(mCurveMap.size() - 1));
theAnswer = theIterator->first.mMaximum;
}
-
+
return theAnswer;
}
Float32 CAVolumeCurve::GetMinimumDB() const
{
Float32 theAnswer = 0;
-
+
if(!mCurveMap.empty())
{
CurveMap::const_iterator theIterator = mCurveMap.begin();
theAnswer = theIterator->second.mMinimum;
}
-
+
return theAnswer;
}
Float32 CAVolumeCurve::GetMaximumDB() const
{
Float32 theAnswer = 0;
-
+
if(!mCurveMap.empty())
{
CurveMap::const_iterator theIterator = mCurveMap.begin();
std::advance(theIterator, static_cast<int>(mCurveMap.size() - 1));
theAnswer = theIterator->second.mMaximum;
}
-
+
return theAnswer;
}
void CAVolumeCurve::SetTransferFunction(UInt32 inTransferFunction)
{
mTransferFunction = inTransferFunction;
-
+
// figure out the co-efficients
switch(inTransferFunction)
{
@@ -137,97 +137,97 @@ void CAVolumeCurve::SetTransferFunction(UInt32 inTransferFunction)
mRawToScalarExponentNumerator = 1.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow1Over3Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 1.0f;
mRawToScalarExponentDenominator = 3.0f;
break;
-
+
case kPow1Over2Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 1.0f;
mRawToScalarExponentDenominator = 2.0f;
break;
-
+
case kPow3Over4Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 3.0f;
mRawToScalarExponentDenominator = 4.0f;
break;
-
+
case kPow3Over2Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 3.0f;
mRawToScalarExponentDenominator = 2.0f;
break;
-
+
case kPow2Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 2.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow3Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 3.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow4Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 4.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow5Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 5.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow6Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 6.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow7Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 7.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow8Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 8.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow9Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 9.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow10Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 10.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow11Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 11.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
case kPow12Over1Curve:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 12.0f;
mRawToScalarExponentDenominator = 1.0f;
break;
-
+
default:
mIsApplyingTransferFunction = true;
mRawToScalarExponentNumerator = 2.0f;
@@ -240,7 +240,7 @@ void CAVolumeCurve::AddRange(SInt32 inMinRaw, SInt32 inMaxRaw, Float32 inMinDB,
{
CARawPoint theRaw(inMinRaw, inMaxRaw);
CADBPoint theDB(inMinDB, inMaxDB);
-
+
bool isOverlapped = false;
bool isDone = false;
CurveMap::iterator theIterator = mCurveMap.begin();
@@ -248,13 +248,13 @@ void CAVolumeCurve::AddRange(SInt32 inMinRaw, SInt32 inMaxRaw, Float32 inMinDB,
{
isOverlapped = CARawPoint::Overlap(theRaw, theIterator->first);
isDone = theRaw >= theIterator->first;
-
+
if(!isOverlapped && !isDone)
{
std::advance(theIterator, 1);
}
}
-
+
if(!isOverlapped)
{
mCurveMap.insert(CurveMap::value_type(theRaw, theDB));
@@ -273,7 +273,7 @@ void CAVolumeCurve::ResetRange()
bool CAVolumeCurve::CheckForContinuity() const
{
bool theAnswer = true;
-
+
CurveMap::const_iterator theIterator = mCurveMap.begin();
if(theIterator != mCurveMap.end())
{
@@ -284,22 +284,22 @@ bool CAVolumeCurve::CheckForContinuity() const
SInt32 theRawMin = theIterator->first.mMinimum;
SInt32 theRawMax = theIterator->first.mMaximum;
SInt32 theRawRange = theRawMax - theRawMin;
-
+
Float32 theDBMin = theIterator->second.mMinimum;
Float32 theDBMax = theIterator->second.mMaximum;
Float32 theDBRange = theDBMax - theDBMin;
theAnswer = theRaw == theRawMin;
theAnswer = theAnswer && (theDB == theDBMin);
-
+
theRaw += theRawRange;
theDB += theDBRange;
-
+
std::advance(theIterator, 1);
}
while((theIterator != mCurveMap.end()) && theAnswer);
}
-
+
return theAnswer;
}
@@ -308,16 +308,16 @@ SInt32 CAVolumeCurve::ConvertDBToRaw(Float32 inDB) const
// clamp the value to the dB range
Float32 theOverallDBMin = GetMinimumDB();
Float32 theOverallDBMax = GetMaximumDB();
-
+
if(inDB < theOverallDBMin) inDB = theOverallDBMin;
if(inDB > theOverallDBMax) inDB = theOverallDBMax;
-
+
// get the first entry in the curve map;
CurveMap::const_iterator theIterator = mCurveMap.begin();
-
+
// initialize the answer to the minimum raw of the first item in the curve map
SInt32 theAnswer = theIterator->first.mMinimum;
-
+
// iterate through the curve map until we run out of dB
bool isDone = false;
while(!isDone && (theIterator != mCurveMap.end()))
@@ -325,13 +325,13 @@ SInt32 CAVolumeCurve::ConvertDBToRaw(Float32 inDB) const
SInt32 theRawMin = theIterator->first.mMinimum;
SInt32 theRawMax = theIterator->first.mMaximum;
SInt32 theRawRange = theRawMax - theRawMin;
-
+
Float32 theDBMin = theIterator->second.mMinimum;
Float32 theDBMax = theIterator->second.mMaximum;
Float32 theDBRange = theDBMax - theDBMin;
-
+
Float32 theDBPerRaw = theDBRange / static_cast<Float32>(theRawRange);
-
+
// figure out how many steps we are into this entry in the curve map
if(inDB > theDBMax)
{
@@ -344,44 +344,44 @@ SInt32 CAVolumeCurve::ConvertDBToRaw(Float32 inDB) const
// figure out how many steps it is
Float32 theNumberRawSteps = inDB - theDBMin;
theNumberRawSteps /= theDBPerRaw;
-
+
// only move in whole steps
theNumberRawSteps = roundf(theNumberRawSteps);
-
+
// add this many steps to the answer
theAnswer += static_cast<SInt32>(theNumberRawSteps);
-
+
// mark that we are done
isDone = true;
}
-
+
// go to the next entry in the curve map
std::advance(theIterator, 1);
}
-
+
return theAnswer;
}
Float32 CAVolumeCurve::ConvertRawToDB(SInt32 inRaw) const
{
Float32 theAnswer = 0;
-
+
// clamp the raw value
SInt32 theOverallRawMin = GetMinimumRaw();
SInt32 theOverallRawMax = GetMaximumRaw();
-
+
if(inRaw < theOverallRawMin) inRaw = theOverallRawMin;
if(inRaw > theOverallRawMax) inRaw = theOverallRawMax;
-
+
// figure out how many raw steps need to be taken from the first one
SInt32 theNumberRawSteps = inRaw - theOverallRawMin;
// get the first item in the curve map
CurveMap::const_iterator theIterator = mCurveMap.begin();
-
+
// initialize the answer to the minimum dB of the first item in the curve map
theAnswer = theIterator->second.mMinimum;
-
+
// iterate through the curve map until we run out of steps
while((theNumberRawSteps > 0) && (theIterator != mCurveMap.end()))
{
@@ -389,26 +389,26 @@ Float32 CAVolumeCurve::ConvertRawToDB(SInt32 inRaw) const
SInt32 theRawMin = theIterator->first.mMinimum;
SInt32 theRawMax = theIterator->first.mMaximum;
SInt32 theRawRange = theRawMax - theRawMin;
-
+
Float32 theDBMin = theIterator->second.mMinimum;
Float32 theDBMax = theIterator->second.mMaximum;
Float32 theDBRange = theDBMax - theDBMin;
-
+
Float32 theDBPerRaw = theDBRange / static_cast<Float32>(theRawRange);
-
+
// there might be more steps than the current map entry accounts for
SInt32 theRawStepsToAdd = std::min(theRawRange, theNumberRawSteps);
-
+
// add this many steps worth of db to the answer;
theAnswer += theRawStepsToAdd * theDBPerRaw;
-
+
// figure out how many steps are left
theNumberRawSteps -= theRawStepsToAdd;
-
+
// go to the next map entry
std::advance(theIterator, 1);
}
-
+
return theAnswer;
}
@@ -421,7 +421,7 @@ Float32 CAVolumeCurve::ConvertRawToScalar(SInt32 inRaw) const
SInt32 theRawMin = GetMinimumRaw();
SInt32 theRawMax = GetMaximumRaw();
SInt32 theRawRange = theRawMax - theRawMin;
-
+
// range the raw value
if(inRaw < theRawMin) inRaw = theRawMin;
if(inRaw > theRawMax) inRaw = theRawMax;
@@ -449,7 +449,7 @@ SInt32 CAVolumeCurve::ConvertScalarToRaw(Float32 inScalar) const
{
// range the scalar value
inScalar = std::min(1.0f, std::max(0.0f, inScalar));
-
+
// get some important values
Float32 theDBMin = GetMinimumDB();
Float32 theDBMax = GetMaximumDB();
@@ -457,20 +457,20 @@ SInt32 CAVolumeCurve::ConvertScalarToRaw(Float32 inScalar) const
SInt32 theRawMin = GetMinimumRaw();
SInt32 theRawMax = GetMaximumRaw();
SInt32 theRawRange = theRawMax - theRawMin;
-
+
// have to undo the curve if the dB range is greater than 30
if(mIsApplyingTransferFunction && (theDBRange > 30.0f))
{
inScalar = powf(inScalar, mRawToScalarExponentDenominator / mRawToScalarExponentNumerator);
}
-
+
// now we can figure out how many raw steps this is
Float32 theNumberRawSteps = inScalar * static_cast<Float32>(theRawRange);
theNumberRawSteps = roundf(theNumberRawSteps);
-
+
// the answer is the minimum raw value plus the number of raw steps
SInt32 theAnswer = theRawMin + static_cast<SInt32>(theNumberRawSteps);
-
+
return theAnswer;
}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h
index 4f95446..c8ac3f6 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h
@@ -2,14 +2,14 @@
File: CAVolumeCurve.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#if !defined(__CAVolumeCurve_h__)
#define __CAVolumeCurve_h__
@@ -66,12 +66,12 @@ struct CARawPoint
{
SInt32 mMinimum;
SInt32 mMaximum;
-
+
CARawPoint() : mMinimum(0), mMaximum(0) {}
CARawPoint(const CARawPoint& inPoint) : mMinimum(inPoint.mMinimum), mMaximum(inPoint.mMaximum) {}
CARawPoint(SInt32 inMinimum, SInt32 inMaximum) : mMinimum(inMinimum), mMaximum(inMaximum) {}
CARawPoint& operator=(const CARawPoint& inPoint) { mMinimum = inPoint.mMinimum; mMaximum = inPoint.mMaximum; return *this; }
-
+
static bool Overlap(const CARawPoint& x, const CARawPoint& y) { return (x.mMinimum < y.mMaximum) && (x.mMaximum > y.mMinimum); }
};
@@ -86,12 +86,12 @@ struct CADBPoint
{
Float32 mMinimum;
Float32 mMaximum;
-
+
CADBPoint() : mMinimum(0), mMaximum(0) {}
CADBPoint(const CADBPoint& inPoint) : mMinimum(inPoint.mMinimum), mMaximum(inPoint.mMaximum) {}
CADBPoint(Float32 inMinimum, Float32 inMaximum) : mMinimum(inMinimum), mMaximum(inMaximum) {}
CADBPoint& operator=(const CADBPoint& inPoint) { mMinimum = inPoint.mMinimum; mMaximum = inPoint.mMaximum; return *this; }
-
+
static bool Overlap(const CADBPoint& x, const CADBPoint& y) { return (x.mMinimum < y.mMaximum) && (x.mMaximum >= y.mMinimum); }
};
@@ -144,7 +144,7 @@ public:
SInt32 GetMaximumRaw() const;
Float32 GetMinimumDB() const;
Float32 GetMaximumDB() const;
-
+
void SetIsApplyingTransferFunction(bool inIsApplyingTransferFunction) { mIsApplyingTransferFunction = inIsApplyingTransferFunction; }
UInt32 GetTransferFunction() const { return mTransferFunction; }
void SetTransferFunction(UInt32 inTransferFunction);
@@ -154,7 +154,7 @@ public:
void AddRange(SInt32 mMinRaw, SInt32 mMaxRaw, Float32 inMinDB, Float32 inMaxDB);
void ResetRange();
bool CheckForContinuity() const;
-
+
SInt32 ConvertDBToRaw(Float32 inDB) const;
Float32 ConvertRawToDB(SInt32 inRaw) const;
Float32 ConvertRawToScalar(SInt32 inRaw) const;
@@ -165,7 +165,7 @@ public:
// Implementation
private:
typedef std::map<CARawPoint, CADBPoint> CurveMap;
-
+
UInt32 mTag;
CurveMap mCurveMap;
bool mIsApplyingTransferFunction;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp
index c2dbac5..2b83bd4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp
@@ -2,14 +2,14 @@
File: CAXException.cpp
Abstract: CAXException.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "CAXException.h"
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAXException.h b/libs/appleutility/CoreAudio/PublicUtility/CAXException.h
index 90dabe9..0f174e0 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAXException.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAXException.h
@@ -2,14 +2,14 @@
File: CAXException.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __CAXException_h__
#define __CAXException_h__
@@ -118,31 +118,31 @@ public:
strlcpy(mOperation, operation, sizeof(mOperation));
}
-
+
char *FormatError(char *str, size_t strsize) const
{
return FormatError(str, strsize, mError);
}
-
+
char mOperation[256];
const OSStatus mError;
-
+
// -------------------------------------------------
-
+
typedef void (*WarningHandler)(const char *msg, OSStatus err);
-
+
static char *FormatError(char *str, size_t strsize, OSStatus error)
{
strlcpy(str, CAX4CCString(error), strsize);
return str;
}
-
+
static void Warning(const char *s, OSStatus error)
{
if (sWarningHandler)
(*sWarningHandler)(s, error);
}
-
+
static void SetWarningHandler(WarningHandler f) { sWarningHandler = f; }
private:
static WarningHandler sWarningHandler;
@@ -178,7 +178,7 @@ private:
goto label; \
} \
} while (0)
-
+
#define XAssert(assertion) \
do { \
if (!(assertion)) { \
@@ -186,7 +186,7 @@ private:
__ASSERT_STOP; \
} \
} while (0)
-
+
#define XAssertNoError(error) \
do { \
OSStatus __err = error; \
@@ -271,7 +271,7 @@ private:
__LINE__); \
} \
} while ( 0 )
-
+
#else
#define XThrowIfError(error, operation) \
do { \
diff --git a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp
index 98d868e..f3d106a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp
@@ -2,14 +2,14 @@
File: MatrixMixerVolumes.cpp
Abstract: MatrixMixerVolumes.h
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#include "MatrixMixerVolumes.h"
#include "CAXException.h"
@@ -59,9 +59,9 @@ OSStatus PrintBuses (FILE* file, const char* str, AudioUnit au, AudioUnitScope i
UInt32 busCount;
UInt32 theSize = sizeof(busCount);
- ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_ElementCount,
+ ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_ElementCount,
inScope, 0, &busCount, &theSize), home);
-
+
fprintf (file, "\t%s Elements:\n\t\t", str);
for (UInt32 i = 0; i < busCount; ++i) {
Float32 val;
@@ -83,16 +83,16 @@ void PrintMatrixMixerVolumes (FILE* file, AudioUnit au)
UInt32 theSize = sizeof(UInt32) * 2;
Float32 *theVols = NULL;
OSStatus result;
-
-// this call will fail if the unit is NOT initialized as it would present an incomplete state
- ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixDimensions,
+
+// this call will fail if the unit is NOT initialized as it would present an incomplete state
+ ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixDimensions,
kAudioUnitScope_Global, 0, dims, &theSize), home);
theSize = ((dims[0] + 1) * (dims[1] + 1)) * sizeof(Float32);
-
+
theVols = static_cast<Float32*> (malloc (theSize));
-
- ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixLevels,
+
+ ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixLevels,
kAudioUnitScope_Global, 0, theVols, &theSize), home);
home:
@@ -101,9 +101,9 @@ home:
free(theVols);
return;
}
-
+
theSize /= sizeof(Float32);
-
+
unsigned int inputs = dims[0];
unsigned int outputs = dims[1];
@@ -114,7 +114,7 @@ home:
for (unsigned int i = 0; i < (inputs + 1); ++i) {
if (i < inputs) {
fprintf (file, "\t%.3f ", theVols[(i + 1) * (outputs + 1) - 1]);
-
+
for (unsigned int j = 0; j < outputs; ++j)
fprintf (file, "(%.3f) ", theVols[(i * (outputs + 1)) + j]);
} else {
@@ -141,7 +141,7 @@ OSStatus NumberChannels (AudioUnit au,
AudioStreamBasicDescription desc;
UInt32 dataSize = sizeof (AudioStreamBasicDescription);
OSStatus result = AudioUnitGetProperty (au, kAudioUnitProperty_StreamFormat,
- inScope, inEl,
+ inScope, inEl,
&desc, &dataSize);
if (!result)
outChans = desc.mChannelsPerFrame;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h
index 06854f0..aa47ef0 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h
@@ -2,14 +2,14 @@
File: MatrixMixerVolumes.h
Abstract: Part of CoreAudio Utility Classes
Version: 1.1
-
+
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
-
+
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
-
+
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-
+
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-
+
Copyright (C) 2014 Apple Inc. All Rights Reserved.
-
+
*/
#ifndef __MatrixMixerVolumes_h__
#define __MatrixMixerVolumes_h__
@@ -59,10 +59,10 @@ extern "C"
#endif
// prints the matrix mixer volumes of a specific audio unit to the given file
-void PrintMatrixMixerVolumes (FILE* file, AudioUnit au);
+void PrintMatrixMixerVolumes (FILE* file, AudioUnit au);
// prints the mixer volumes for the specific scope of the audio unit
-// results will be printed to the speficied file "file" with identifiying string tag "str"
+// results will be printed to the speficied file "file" with identifiying string tag "str"
OSStatus PrintBuses (FILE* file, char* str, AudioUnit au, AudioUnitScope inScope);
#if defined(__cplusplus)
}
diff --git a/libs/ardour/MSVClibardour/ardour.vcproj b/libs/ardour/MSVClibardour/ardour.vcproj
index 15caf97..8e03f65 100644
--- a/libs/ardour/MSVClibardour/ardour.vcproj
+++ b/libs/ardour/MSVClibardour/ardour.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\lua;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;LV2_EXTENDED=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -60,7 +60,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvD.lib zlib1D.lib boost-regex32D.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangoft232$(PangoDllSuffix)D.lib $(DllPrefix)pangowin32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)atk32$(AtkDllSuffix)D.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)curlD.lib $(DllPrefix)fontconfigD.lib $(DllPrefix)timecode32D.lib $(DllPrefix)taglib32D.lib freetype32-2D.lib raptor2D.lib lrdfD.lib libloD.lib rubberbandD.lib $(DllPrefix)ltcD.lib $(DllPrefix)audiographer32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)evoral32D.lib $(DllPrefix)sndfile-1D.lib $(DllPrefix)samplerate-0D.lib vampsdkD.lib vamphostsdkD.lib $(DllPrefix)lilv32-0D.lib $(DllPrefix)suil32-0D.lib $(DllPrefix)serd32-0D.lib $(DllPrefix)sord32-0D.lib $(DllPrefix)sratom32-0D.lib libart_lgpl_2D.lib libjackD.lib libxml2D.lib intlD.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+ AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvD.lib zlib1D.lib boost-regex32D.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangoft232$(PangoDllSuffix)D.lib $(DllPrefix)pangowin32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)atk32$(AtkDllSuffix)D.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)curlD.lib $(DllPrefix)fontconfigD.lib $(DllPrefix)timecode32D.lib $(DllPrefix)taglib32D.lib freetype32-2D.lib raptor2D.lib lrdfD.lib libloD.lib rubberbandD.lib $(DllPrefix)ltcD.lib $(DllPrefix)lua32D.lib $(DllPrefix)audiographer32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)evoral32D.lib $(DllPrefix)sndfile-1D.lib $(DllPrefix)samplerate-0D.lib vampsdkD.lib vamphostsdkD.lib $(DllPrefix)lilv32-0D.lib $(DllPrefix)suil32-0D.lib $(DllPrefix)serd32-0D.lib $(DllPrefix)sord32-0D.lib $(DllPrefix)sratom32-0D.lib libart_lgpl_2D.lib libjackD.lib libxml2D.lib intlD.lib shell32.lib psapi.lib iphlpapi.lib ws2_32.lib winmm.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\lua;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0";..\.."
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;LV2_EXTENDED=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -142,7 +142,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconv.lib zlib1.lib boost-regex32.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangoft232$(PangoDllSuffix).lib $(DllPrefix)pangowin32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)atk32$(AtkDllSuffix).lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)curl.lib $(DllPrefix)fontconfig.lib $(DllPrefix)timecode32.lib $(DllPrefix)taglib32.lib freetype32-2.lib raptor2.lib lrdf.lib liblo.lib rubberband.lib $(DllPrefix)ltc.lib $(DllPrefix)audiographer32.lib $(DllPrefix)pbd32.lib $(DllPrefix)midi++32.lib $(DllPrefix)evoral32.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdk.lib vamphostsdk.lib $(DllPrefix)lilv32-0.lib $(DllPrefix)suil32-0.lib $(DllPrefix)serd32-0.lib $(DllPrefix)sord32-0.lib $(DllPrefix)sratom32-0.lib libart_lgpl_2.lib libjack.lib libxml2.lib intl.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+ AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconv.lib zlib1.lib boost-regex32.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangoft232$(PangoDllSuffix).lib $(DllPrefix)pangowin32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)atk32$(AtkDllSuffix).lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)curl.lib $(DllPrefix)fontconfig.lib $(DllPrefix)timecode32.lib $(DllPrefix)taglib32.lib freetype32-2.lib raptor2.lib lrdf.lib liblo.lib rubberband.lib $(DllPrefix)ltc.lib $(DllPrefix)lua32.lib $(DllPrefix)audiographer32.lib $(DllPrefix)pbd32.lib $(DllPrefix)midi++32.lib $(DllPrefix)evoral32.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdk.lib vamphostsdk.lib $(DllPrefix)lilv32-0.lib $(DllPrefix)suil32-0.lib $(DllPrefix)serd32-0.lib $(DllPrefix)sord32-0.lib $(DllPrefix)sratom32-0.lib libart_lgpl_2.lib libjack.lib libxml2.lib intl.lib shell32.lib psapi.lib iphlpapi.lib ws2_32.lib winmm.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\lua;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0";..\.."
+ PreprocessorDefinitions="PLATFORM_WINDOWS;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;LV2_EXTENDED=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -224,7 +224,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvRDC.lib zlib1RDC.lib boost-regex32RDC.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangoft232$(PangoDllSuffix)RDC.lib $(DllPrefix)pangowin32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)atk32$(AtkDllSuffix)RDC.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)curlRDC.lib $(DllPrefix)fontconfigRDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)taglib32RDC.lib freetype32-2RDC.lib raptor2.lib lrdf.lib libloRDC.lib rubberbandRDC.lib $(DllPrefix)ltcRDC.lib $(DllPrefix)audiographer32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)evoral32RDC.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdkRDC.lib vamphostsdkRDC.lib $(DllPrefix)lilv32-0RDC.lib $(DllPrefix)suil32-0RDC.lib $(DllPrefix)serd32-0RDC.lib $(DllPrefix)sord32-0RDC.lib $(DllPrefix)sratom32-0RDC.lib libart_lgpl_2.lib libjack.lib libxml2.lib intlRDC.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+ AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvRDC.lib zlib1RDC.lib boost-regex32RDC.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangoft232$(PangoDllSuffix)RDC.lib $(DllPrefix)pangowin32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)atk32$(AtkDllSuffix)RDC.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)curlRDC.lib $(DllPrefix)fontconfigRDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)taglib32RDC.lib freetype32-2RDC.lib raptor2.lib lrdf.lib libloRDC.lib rubberbandRDC.lib $(DllPrefix)ltcRDC.lib $(DllPrefix)lua32RDC.lib $(DllPrefix)audiographer32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)evoral32RDC.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdkRDC.lib vamphostsdkRDC.lib $(DllPrefix)lilv32-0RDC.lib $(DllPrefix)suil32-0RDC.lib $(DllPrefix)serd32-0RDC.lib $(DllPrefix)sord32-0RDC.lib $(DllPrefix)sratom32-0RDC.lib libart_lgpl_2.lib libjack.lib libxml2.lib intlRDC.lib shell32.lib psapi.lib iphlpapi.lib ws2_32.lib winmm.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -284,6 +284,10 @@
>
</File>
<File
+ RelativePath="..\analysis_graph.cc"
+ >
+ </File>
+ <File
RelativePath="..\async_midi_port.cc"
>
</File>
@@ -424,10 +428,18 @@
>
</File>
<File
+ RelativePath="..\control_group.cc"
+ >
+ </File>
+ <File
RelativePath="..\control_protocol_manager.cc"
>
</File>
<File
+ RelativePath="..\controllable_descriptor.cc"
+ >
+ </File>
+ <File
RelativePath="..\cycle_timer.cc"
>
</File>
@@ -460,6 +472,10 @@
>
</File>
<File
+ RelativePath="..\dsp_filter.cc"
+ >
+ </File>
+ <File
RelativePath="..\ebur128_analysis.cc"
>
</File>
@@ -560,6 +576,10 @@
>
</File>
<File
+ RelativePath="..\fixed_delay.cc"
+ >
+ </File>
+ <File
RelativePath="..\gain_control.cc"
>
</File>
@@ -640,6 +660,22 @@
>
</File>
<File
+ RelativePath="..\lua_api.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\luabindings.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\luaproc.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\luascripting.cc"
+ >
+ </File>
+ <File
RelativePath="..\lv2_evbuf.c"
>
</File>
@@ -740,6 +776,10 @@
>
</File>
<File
+ RelativePath="..\monitor_control.cc"
+ >
+ </File>
+ <File
RelativePath="..\monitor_processor.cc"
>
</File>
@@ -752,10 +792,18 @@
>
</File>
<File
+ RelativePath="..\mute_control.cc"
+ >
+ </File>
+ <File
RelativePath="..\mute_master.cc"
>
</File>
<File
+ RelativePath="..\muteable.cc"
+ >
+ </File>
+ <File
RelativePath="..\note_fixer.cc"
>
</File>
@@ -796,6 +844,10 @@
>
</File>
<File
+ RelativePath="..\phase_control.cc"
+ >
+ </File>
+ <File
RelativePath="..\playlist.cc"
>
</File>
@@ -836,6 +888,10 @@
>
</File>
<File
+ RelativePath="..\presentation_info.cc"
+ >
+ </File>
+ <File
RelativePath="..\process_thread.cc"
>
</File>
@@ -864,6 +920,14 @@
>
</File>
<File
+ RelativePath="..\record_enable_control.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\record_safe_control.cc"
+ >
+ </File>
+ <File
RelativePath="..\region.cc"
>
</File>
@@ -892,10 +956,6 @@
>
</File>
<File
- RelativePath="..\route_controls.cc"
- >
- </File>
- <File
RelativePath="..\route_graph.cc"
>
</File>
@@ -1188,6 +1248,18 @@
>
</File>
<File
+ RelativePath="..\sidechain.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\slavable.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\slavable_automation_control.cc"
+ >
+ </File>
+ <File
RelativePath="..\slave.cc"
>
</File>
@@ -1208,6 +1280,18 @@
>
</File>
<File
+ RelativePath="..\solo_control.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\solo_isolate_control.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\solo_safe_control.cc"
+ >
+ </File>
+ <File
RelativePath="..\soundcloud_upload.cc"
>
</File>
@@ -1236,6 +1320,10 @@
>
</File>
<File
+ RelativePath="..\stripable.cc"
+ >
+ </File>
+ <File
RelativePath="..\system_exec.cc"
>
</File>
@@ -1296,6 +1384,14 @@
>
</File>
<File
+ RelativePath="..\vca.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\vca_manager.cc"
+ >
+ </File>
+ <File
RelativePath="..\version.cc"
>
</File>
@@ -1346,6 +1442,10 @@
>
</File>
<File
+ RelativePath="..\ardour\analysis_graph.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\ardour.h"
>
</File>
@@ -1458,6 +1558,10 @@
>
</File>
<File
+ RelativePath="..\ardour\boost_debug.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\broadcast_info.h"
>
</File>
@@ -1506,10 +1610,18 @@
>
</File>
<File
+ RelativePath="..\ardour\control_group_member.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\control_protocol_manager.h"
>
</File>
<File
+ RelativePath="..\ardour\controllable_descriptor.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\coreaudiosource.h"
>
</File>
@@ -1550,6 +1662,10 @@
>
</File>
<File
+ RelativePath="..\ardour\dsp_filter.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\dsp_load_calculator.h"
>
</File>
@@ -1662,6 +1778,10 @@
>
</File>
<File
+ RelativePath="..\ardour\fixed_delay.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\gain_control.h"
>
</File>
@@ -1718,6 +1838,10 @@
>
</File>
<File
+ RelativePath="..\ardour\io_vector.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\kmeterdsp.h"
>
</File>
@@ -1754,6 +1878,30 @@
>
</File>
<File
+ RelativePath="..\ardour\lua_api.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\lua_script_params.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\luabindings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\luaproc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\luascripting.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\lv2_extensions.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\lv2_plugin.h"
>
</File>
@@ -1974,6 +2122,10 @@
>
</File>
<File
+ RelativePath="..\ardour\presentation_info.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\process_thread.h"
>
</File>
@@ -2022,6 +2174,10 @@
>
</File>
<File
+ RelativePath="..\ardour\record_safe_control.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\region.h"
>
</File>
@@ -2070,10 +2226,6 @@
>
</File>
<File
- RelativePath="..\ardour\route_sorters.h"
- >
- </File>
- <File
RelativePath="..\ardour\runtime_functions.h"
>
</File>
@@ -2146,10 +2298,22 @@
>
</File>
<File
+ RelativePath="..\ardour\sidechain.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\silentfilesource.h"
>
</File>
<File
+ RelativePath="..\ardour\slavable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\slavable_automation_control.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\slave.h"
>
</File>
@@ -2210,6 +2374,10 @@
>
</File>
<File
+ RelativePath="..\ardour\stripable.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\system_exec.h"
>
</File>
@@ -2298,6 +2466,14 @@
>
</File>
<File
+ RelativePath="..\ardour\vca.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\vca_manager.h"
+ >
+ </File>
+ <File
RelativePath="..\ardour\vst_plugin.h"
>
</File>
@@ -2324,7 +2500,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc
index d5b9f56..d86362a 100644
--- a/libs/ardour/amp.cc
+++ b/libs/ardour/amp.cc
@@ -31,7 +31,7 @@
#include "ardour/rc_configuration.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -71,7 +71,7 @@ Amp::configure_io (ChanCount in, ChanCount out)
}
void
-Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
{
if (!_active && !_pending_active) {
return;
@@ -118,7 +118,7 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
} else { /* manual (scalar) gain */
- gain_t const dg = _gain_control->user_double();
+ gain_t const dg = _gain_control->get_value();
if (_current_gain != dg) {
@@ -388,7 +388,7 @@ Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framec
assert (_gain_automation_buffer);
_apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector (
start_frame, end_frame, _gain_automation_buffer, nframes);
- if (start_frame != _current_automation_frame) {
+ if (start_frame != _current_automation_frame && _session.bounce_processing ()) {
_current_gain = _gain_automation_buffer[0];
}
_current_automation_frame = end_frame;
@@ -405,7 +405,7 @@ Amp::visible() const
}
std::string
-Amp::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Amp::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
if (ac == _gain_control) {
char buffer[32];
diff --git a/libs/ardour/analyser.cc b/libs/ardour/analyser.cc
index 58a8f30..457291f 100644
--- a/libs/ardour/analyser.cc
+++ b/libs/ardour/analyser.cc
@@ -19,12 +19,13 @@
#include "ardour/analyser.h"
#include "ardour/audiofilesource.h"
+#include "ardour/rc_configuration.h"
#include "ardour/session_event.h"
#include "ardour/transient_detector.h"
#include "pbd/compose.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -110,6 +111,7 @@ Analyser::analyse_audio_file_source (boost::shared_ptr<AudioFileSource> src)
try {
TransientDetector td (src->sample_rate());
+ td.set_sensitivity (3, Config->get_transient_sensitivity()); // "General purpose"
if (td.run (src->get_transients_path(), src.get(), 0, results) == 0) {
src->set_been_analysed (true);
} else {
diff --git a/libs/ardour/analysis_graph.cc b/libs/ardour/analysis_graph.cc
new file mode 100644
index 0000000..a1e8807
--- /dev/null
+++ b/libs/ardour/analysis_graph.cc
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include "ardour/analysis_graph.h"
+#include "ardour/route.h"
+#include "ardour/session.h"
+
+#include "timecode/time.h"
+
+#include "audiographer/process_context.h"
+#include "audiographer/general/chunker.h"
+#include "audiographer/general/interleaver.h"
+#include "audiographer/general/analyser.h"
+#include "audiographer/general/peak_reader.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace AudioGrapher;
+
+AnalysisGraph::AnalysisGraph (Session *s)
+ : _session (s)
+ , _max_chunksize (8192)
+ , _frames_read (0)
+ , _frames_end (0)
+ , _canceled (false)
+{
+ _buf = (Sample *) malloc(sizeof(Sample) * _max_chunksize);
+ _mixbuf = (Sample *) malloc(sizeof(Sample) * _max_chunksize);
+ _gainbuf = (float *) malloc(sizeof(float) * _max_chunksize);
+}
+
+AnalysisGraph::~AnalysisGraph ()
+{
+ free (_buf);
+ free (_mixbuf);
+ free (_gainbuf);
+}
+
+void
+AnalysisGraph::analyze_region (boost::shared_ptr<AudioRegion> region)
+{
+ interleaver.reset (new Interleaver<Sample> ());
+ interleaver->init (region->n_channels(), _max_chunksize);
+ chunker.reset (new Chunker<Sample> (_max_chunksize));
+ analyser.reset (new Analyser (
+ _session->nominal_frame_rate(),
+ region->n_channels(),
+ _max_chunksize,
+ region->length()));
+
+ interleaver->add_output(chunker);
+ chunker->add_output (analyser);
+
+ framecnt_t x = 0;
+ framecnt_t length = region->length();
+ while (x < length) {
+ framecnt_t chunk = std::min (_max_chunksize, length - x);
+ framecnt_t n = 0;
+ for (unsigned int channel = 0; channel < region->n_channels(); ++channel) {
+ memset (_buf, 0, chunk * sizeof (Sample));
+ n = region->read_at (_buf, _mixbuf, _gainbuf, region->position() + x, chunk, channel);
+ ConstProcessContext<Sample> context (_buf, n, 1);
+ if (n < _max_chunksize) {
+ context().set_flag (ProcessContext<Sample>::EndOfInput);
+ }
+ interleaver->input (channel)->process (context);
+
+ if (n == 0) {
+ std::cerr << "AnalysisGraph::analyze_region read zero samples\n";
+ break;
+ }
+ }
+ x += n;
+ _frames_read += n;
+ Progress (_frames_read, _frames_end);
+ if (_canceled) {
+ return;
+ }
+ }
+ _results.insert (std::make_pair (region->name(), analyser->result ()));
+}
+
+void
+AnalysisGraph::analyze_range (boost::shared_ptr<Route> route, boost::shared_ptr<AudioPlaylist> pl, const std::list<AudioRange>& range)
+{
+ const uint32_t n_audio = route->n_inputs().n_audio();
+
+ for (std::list<AudioRange>::const_iterator j = range.begin(); j != range.end(); ++j) {
+
+ interleaver.reset (new Interleaver<Sample> ());
+ interleaver->init (n_audio, _max_chunksize);
+ chunker.reset (new Chunker<Sample> (_max_chunksize));
+ analyser.reset (new Analyser (48000.f, n_audio, _max_chunksize, (*j).length()));
+
+ interleaver->add_output(chunker);
+ chunker->add_output (analyser);
+
+ framecnt_t x = 0;
+ while (x < j->length()) {
+ framecnt_t chunk = std::min (_max_chunksize, (*j).length() - x);
+ framecnt_t n = 0;
+ for (uint32_t channel = 0; channel < n_audio; ++channel) {
+ n = pl->read (_buf, _mixbuf, _gainbuf, (*j).start + x, chunk, channel);
+
+ ConstProcessContext<Sample> context (_buf, n, 1);
+ if (n < _max_chunksize) {
+ context().set_flag (ProcessContext<Sample>::EndOfInput);
+ }
+ interleaver->input (channel)->process (context);
+ }
+ x += n;
+ _frames_read += n;
+ Progress (_frames_read, _frames_end);
+ if (_canceled) {
+ return;
+ }
+ }
+
+ std::string name = string_compose (_("%1 (%2..%3)"), route->name(),
+ Timecode::timecode_format_sampletime (
+ (*j).start,
+ _session->nominal_frame_rate(),
+ 100, false),
+ Timecode::timecode_format_sampletime (
+ (*j).start + (*j).length(),
+ _session->nominal_frame_rate(),
+ 100, false)
+ );
+ _results.insert (std::make_pair (name, analyser->result ()));
+ }
+}
diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h
index 20a07c0..820e2a8 100644
--- a/libs/ardour/ardour/amp.h
+++ b/libs/ardour/ardour/amp.h
@@ -47,7 +47,7 @@ public:
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out);
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
bool apply_gain () const { return _apply_gain; }
void apply_gain (bool yn) { _apply_gain = yn; }
@@ -79,7 +79,7 @@ public:
return _gain_control;
}
- std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
private:
bool _denormal_protection;
diff --git a/libs/ardour/ardour/analysis_graph.h b/libs/ardour/ardour/analysis_graph.h
new file mode 100644
index 0000000..4724b82
--- /dev/null
+++ b/libs/ardour/ardour/analysis_graph.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __ardour_analysis_graph_h__
+#define __ardour_analysis_graph_h__
+
+#include <map>
+#include <set>
+#include <cstring>
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/audioregion.h"
+#include "ardour/audioplaylist.h"
+#include "ardour/export_analysis.h"
+#include "ardour/libardour_visibility.h"
+
+namespace AudioGrapher {
+ class Analyser;
+ template <typename T> class Chunker;
+ template <typename T> class Interleaver;
+}
+
+namespace ARDOUR {
+class LIBARDOUR_API AnalysisGraph {
+ public:
+ AnalysisGraph (ARDOUR::Session*);
+ ~AnalysisGraph ();
+
+ void analyze_region (boost::shared_ptr<ARDOUR::AudioRegion>);
+ void analyze_range (boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::AudioPlaylist>, const std::list<AudioRange>&);
+ const AnalysisResults& results () const { return _results; }
+
+ void cancel () { _canceled = true; }
+ bool canceled () const { return _canceled; }
+
+ void set_total_frames (framecnt_t p) { _frames_end = p; }
+ PBD::Signal2<void, framecnt_t, framecnt_t> Progress;
+
+ private:
+ ARDOUR::Session* _session;
+ AnalysisResults _results;
+ framecnt_t _max_chunksize;
+
+ ARDOUR::Sample* _buf;
+ ARDOUR::Sample* _mixbuf;
+ float* _gainbuf;
+ framecnt_t _frames_read;
+ framecnt_t _frames_end;
+ bool _canceled;
+
+ typedef boost::shared_ptr<AudioGrapher::Analyser> AnalysisPtr;
+ typedef boost::shared_ptr<AudioGrapher::Chunker<float> > ChunkerPtr;
+ typedef boost::shared_ptr<AudioGrapher::Interleaver<Sample> > InterleaverPtr;
+
+ InterleaverPtr interleaver;
+ ChunkerPtr chunker;
+ AnalysisPtr analyser;
+};
+} // namespace ARDOUR
+#endif
diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h
index ddea43f..79b6912 100644
--- a/libs/ardour/ardour/ardour.h
+++ b/libs/ardour/ardour/ardour.h
@@ -72,8 +72,6 @@ namespace ARDOUR {
extern LIBARDOUR_API const char* const ardour_config_info;
- LIBARDOUR_API void find_bindings_files (std::map<std::string,std::string>&);
-
/* these only impact bundled installations */
LIBARDOUR_API std::string translation_enable_path ();
LIBARDOUR_API bool translations_are_enabled ();
diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h
index d5c53b4..9a00cf2 100644
--- a/libs/ardour/ardour/audio_backend.h
+++ b/libs/ardour/ardour/audio_backend.h
@@ -80,6 +80,9 @@ struct LIBARDOUR_API AudioBackendInfo {
bool (*available)();
};
+/** AudioBackend is an high-level abstraction for interacting with the operating system's
+ * audio and midi I/O.
+ */
class LIBARDOUR_API AudioBackend : public PortEngine {
public:
diff --git a/libs/ardour/ardour/audio_buffer.h b/libs/ardour/ardour/audio_buffer.h
index f3ec2ed..9a9653b 100644
--- a/libs/ardour/ardour/audio_buffer.h
+++ b/libs/ardour/ardour/audio_buffer.h
@@ -33,9 +33,18 @@ public:
AudioBuffer(size_t capacity);
~AudioBuffer();
+ /** silence buffer
+ * @param len number of samples to clear
+ * @laram offset start offset
+ */
void silence (framecnt_t len, framecnt_t offset = 0);
- /** Read @a len frames @a src starting at @a src_offset into self starting at @ dst_offset*/
+ /** Copy samples from src array starting at src_offset into self starting at dst_offset
+ * @param src array to read from
+ * @param len number of samples to copy
+ * @param dst_offset offset in destination buffer
+ * @param src_offset start offset in src buffer
+ */
void read_from (const Sample* src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
assert(src != 0);
assert(_capacity > 0);
@@ -45,7 +54,7 @@ public:
_written = true;
}
- void read_from_with_gain (const Sample* src, framecnt_t len, gain_t gain, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
+ void read_from_with_gain (const Sample* src, framecnt_t len, gain_t gain, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
assert(src != 0);
assert(_capacity > 0);
assert(len <= _capacity);
@@ -57,7 +66,12 @@ public:
_written = true;
}
- /** Read @a len frames @a src starting at @a src_offset into self starting at @ dst_offset*/
+ /** Copy samples from src buffer starting at src_offset into self starting at dst_offset
+ * @param src buffer to read from
+ * @param len number of samples to copy
+ * @param dst_offset offset in destination buffer
+ * @param src_offset start offset in src buffer
+ */
void read_from (const Buffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
assert(&src != this);
assert(_capacity > 0);
@@ -73,14 +87,14 @@ public:
_written = true;
}
- /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
+ /** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
void merge_from (const Buffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
const AudioBuffer* ab = dynamic_cast<const AudioBuffer*>(&src);
assert (ab);
accumulate_from (*ab, len, dst_offset, src_offset);
}
- /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
+ /** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
void accumulate_from (const AudioBuffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
assert(_capacity > 0);
assert(len <= _capacity);
@@ -94,7 +108,7 @@ public:
_written = true;
}
- /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
+ /** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
void accumulate_from (const Sample* src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
assert(_capacity > 0);
assert(len <= _capacity);
@@ -108,7 +122,7 @@ public:
_written = true;
}
- /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @dst_offset
+ /** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @dst_offset
* scaling by @a gain_coeff */
void accumulate_with_gain_from (const AudioBuffer& src, framecnt_t len, gain_t gain_coeff, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
@@ -162,6 +176,10 @@ public:
_written = true;
}
+ /** apply a fixed gain factor to the audio buffer
+ * @param gain gain factor
+ * @param len number of frames to amplify
+ */
void apply_gain (gain_t gain, framecnt_t len) {
apply_gain_to_buffer (_data, len, gain);
}
@@ -195,9 +213,20 @@ public:
return _data + offset;
}
- bool check_silence (pframes_t, pframes_t&) const;
+ /** check buffer for silence
+ * @param nframes number of frames to check
+ * @param n first non zero sample (if any)
+ * @return true if all samples are zero
+ */
+ bool check_silence (pframes_t nframes, pframes_t& n) const;
- void prepare () { _written = false; _silent = false; }
+ void prepare () {
+ if (!_owns_data) {
+ _data = 0;
+ }
+ _written = false;
+ _silent = false;
+ }
bool written() const { return _written; }
void set_written(bool w) { _written = w; }
diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h
index 17e2223..d80042a 100644
--- a/libs/ardour/ardour/audio_track.h
+++ b/libs/ardour/ardour/audio_track.h
@@ -34,7 +34,7 @@ class AudioFileSource;
class LIBARDOUR_API AudioTrack : public Track
{
public:
- AudioTrack (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal);
+ AudioTrack (Session&, std::string name, TrackMode m = Normal);
~AudioTrack ();
int set_mode (TrackMode m);
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index e9a5622..c5c5ed4 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -74,6 +74,8 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
void set_parameter (uint32_t which, float val);
float get_parameter (uint32_t which) const;
+ PluginOutputConfiguration possible_output () const { return _output_configs; }
+
int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
uint32_t nth_parameter (uint32_t which, bool& ok) const;
void activate ();
@@ -82,10 +84,12 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
int set_block_size (pframes_t nframes);
int connect_and_run (BufferSet& bufs,
- ChanMapping in, ChanMapping out,
- pframes_t nframes, framecnt_t offset);
+ framepos_t start, framepos_t end, double speed,
+ ChanMapping in, ChanMapping out,
+ pframes_t nframes, framecnt_t offset);
std::set<Evoral::Parameter> automatable() const;
std::string describe_parameter (Evoral::Parameter);
+ IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
std::string state_node_name () const { return "audiounit"; }
void print_parameter (uint32_t, char*, uint32_t len) const;
@@ -103,7 +107,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
bool has_editor () const;
- bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
+ bool can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise);
ChanCount output_streams() const;
ChanCount input_streams() const;
bool configure_io (ChanCount in, ChanCount out);
@@ -166,12 +170,13 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
int32_t input_channels;
int32_t output_channels;
std::vector<std::pair<int,int> > io_configs;
- pframes_t _current_block_size;
framecnt_t _last_nframes;
+ mutable volatile guint _current_latency;
bool _requires_fixed_size_buffers;
AudioBufferList* buffers;
bool _has_midi_input;
bool _has_midi_output;
+ PluginOutputConfiguration _output_configs;
/* despite all the cool work that apple did on their AU preset
system, they left factory presets and user presets as two
@@ -190,9 +195,18 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
UInt32 output_elements;
UInt32 input_elements;
- int set_output_format (AudioStreamBasicDescription&);
- int set_input_format (AudioStreamBasicDescription&);
- int set_stream_format (int scope, uint32_t cnt, AudioStreamBasicDescription&);
+ bool variable_inputs;
+ bool variable_outputs;
+
+ uint32_t configured_input_busses;
+ uint32_t configured_output_busses;
+
+ uint32_t *bus_inputs;
+ uint32_t *bus_outputs;
+ std::vector <std::string> _bus_name_in;
+ std::vector <std::string> _bus_name_out;
+
+ int set_stream_format (int scope, uint32_t bus, AudioStreamBasicDescription&);
void discover_parameters ();
void add_state (XMLNode *) const;
@@ -200,8 +214,9 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
ParameterMap parameter_map;
uint32_t input_maxbuf;
framecnt_t input_offset;
- framecnt_t cb_offset;
+ framecnt_t *cb_offsets;
BufferSet* input_buffers;
+ ChanMapping * input_map;
framecnt_t frames_processed;
uint32_t audio_input_cnt;
@@ -212,8 +227,9 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
void discover_factory_presets ();
- bool last_transport_rolling;
- float last_transport_speed;
+ framepos_t transport_frame;
+ float transport_speed;
+ float last_transport_speed;
static void _parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value);
void parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value);
@@ -234,7 +250,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
- bool needs_midi_input ();
+ bool needs_midi_input () const;
bool is_effect () const;
bool is_effect_without_midi_input () const;
bool is_effect_with_midi_input () const;
@@ -244,6 +260,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
bool reconfigurable_io() const { return true; }
+ static void clear_cache ();
static PluginInfoList* discover (bool scan_only);
static bool au_get_crashlog (std::string &msg);
static std::string stringify_descriptor (const CAComponentDescription&);
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h
index 330af8d..cb5b82d 100644
--- a/libs/ardour/ardour/audioengine.h
+++ b/libs/ardour/ardour/audioengine.h
@@ -57,7 +57,7 @@ class ProcessThread;
class AudioBackend;
struct AudioBackendInfo;
-class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
+class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr
{
public:
@@ -161,7 +161,7 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
(the regular process() call to session->process() is not made)
*/
- PBD::Signal1<int, pframes_t> Freewheel;
+ PBD::Signal1<void, pframes_t> Freewheel;
PBD::Signal0<void> Xrun;
diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h
index 45b7fea..d25cf0e 100644
--- a/libs/ardour/ardour/audioregion.h
+++ b/libs/ardour/ardour/audioregion.h
@@ -82,8 +82,17 @@ class LIBARDOUR_API AudioRegion : public Region
gain_t scale_amplitude() const { return _scale_amplitude; }
void normalize (float, float target_in_dB = 0.0f);
+
+ /** @return the maximum (linear) amplitude of the region, or a -ve
+ * number if the Progress object reports that the process was cancelled.
+ */
double maximum_amplitude (Progress* p = 0) const;
+ /** @return the maximum (rms) signal power of the region, or a -1
+ * if the Progress object reports that the process was cancelled.
+ */
+ double rms (Progress* p = 0) const;
+
bool envelope_active () const { return _envelope_active; }
bool fade_in_active () const { return _fade_in_active; }
bool fade_out_active () const { return _fade_out_active; }
@@ -167,10 +176,10 @@ class LIBARDOUR_API AudioRegion : public Region
void add_transient (framepos_t where);
void remove_transient (framepos_t where);
- int set_transients (AnalysisFeatureList&);
- int get_transients (AnalysisFeatureList&, bool force_new = false);
- int update_transient (framepos_t old_position, framepos_t new_position);
- int adjust_transients (frameoffset_t delta);
+ void clear_transients ();
+ void set_onsets (AnalysisFeatureList&);
+ void get_transients (AnalysisFeatureList&);
+ void update_transient (framepos_t old_position, framepos_t new_position);
AudioIntervalResult find_silence (Sample, framecnt_t, framecnt_t, InterThreadInfo&) const;
@@ -180,7 +189,7 @@ class LIBARDOUR_API AudioRegion : public Region
AudioRegion (boost::shared_ptr<AudioSource>);
AudioRegion (const SourceList &);
AudioRegion (boost::shared_ptr<const AudioRegion>);
- AudioRegion (boost::shared_ptr<const AudioRegion>, frameoffset_t offset);
+ AudioRegion (boost::shared_ptr<const AudioRegion>, frameoffset_t offset, const int32_t sub_num);
AudioRegion (boost::shared_ptr<const AudioRegion>, const SourceList&);
AudioRegion (SourceList &);
@@ -188,6 +197,8 @@ class LIBARDOUR_API AudioRegion : public Region
friend class ::AudioRegionReadTest;
friend class ::PlaylistReadTest;
+ void build_transients ();
+
PBD::Property<bool> _envelope_active;
PBD::Property<bool> _default_fade_in;
PBD::Property<bool> _default_fade_out;
diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h
index c9e14cf..ae2c8dd 100644
--- a/libs/ardour/ardour/automatable.h
+++ b/libs/ardour/ardour/automatable.h
@@ -23,10 +23,15 @@
#include <map>
#include <set>
#include <string>
+
#include <boost/shared_ptr.hpp>
+
#include "pbd/signals.h"
+
#include "evoral/ControlSet.hpp"
+
#include "ardour/libardour_visibility.h"
+#include "ardour/slavable.h"
#include "ardour/types.h"
class XMLNode;
@@ -39,7 +44,7 @@ class AutomationControl;
/* The inherited ControlSet is virtual because AutomatableSequence inherits
* from this AND EvoralSequence, which is also a ControlSet
*/
-class LIBARDOUR_API Automatable : virtual public Evoral::ControlSet
+class LIBARDOUR_API Automatable : virtual public Evoral::ControlSet, public Slavable
{
public:
Automatable(Session&);
@@ -47,24 +52,24 @@ public:
virtual ~Automatable();
- boost::shared_ptr<Evoral::Control>
- control_factory(const Evoral::Parameter& id);
+ boost::shared_ptr<Evoral::Control> control_factory(const Evoral::Parameter& id);
- boost::shared_ptr<AutomationControl>
- automation_control (const Evoral::Parameter& id, bool create_if_missing=false);
+ boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id) {
+ return automation_control (id, false);
+ }
- boost::shared_ptr<const AutomationControl>
- automation_control (const Evoral::Parameter& id) const;
+ boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id, bool create_if_missing);
+ boost::shared_ptr<const AutomationControl> automation_control (const Evoral::Parameter& id) const;
virtual void add_control(boost::shared_ptr<Evoral::Control>);
- virtual bool find_next_event(double start, double end, Evoral::ControlEvent& ev, bool only_active = true) const;
+ virtual bool find_next_event (double start, double end, Evoral::ControlEvent& ev, bool only_active = true) const;
void clear_controls ();
virtual void transport_located (framepos_t now);
virtual void transport_stopped (framepos_t now);
virtual std::string describe_parameter(Evoral::Parameter param);
- virtual std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ virtual std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
AutoState get_parameter_automation_state (Evoral::Parameter param);
virtual void set_parameter_automation_state (Evoral::Parameter param, AutoState);
diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h
index 0d06568..e15abbe 100644
--- a/libs/ardour/ardour/automation_control.h
+++ b/libs/ardour/ardour/automation_control.h
@@ -21,22 +21,29 @@
#ifndef __ardour_automation_control_h__
#define __ardour_automation_control_h__
+#include <map>
+
+#include <glibmm/threads.h>
+
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
-#include "evoral/types.hpp"
#include "pbd/controllable.h"
+
+#include "evoral/types.hpp"
#include "evoral/Control.hpp"
-#include "ardour/libardour_visibility.h"
#include "ardour/automation_list.h"
+#include "ardour/control_group_member.h"
#include "ardour/parameter_descriptor.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
class Session;
class Automatable;
-
+class ControlGroup;
/** A PBD::Controllable with associated automation data (AutomationList)
*/
@@ -44,8 +51,9 @@ class LIBARDOUR_API AutomationControl
: public PBD::Controllable
, public Evoral::Control
, public boost::enable_shared_from_this<AutomationControl>
+ , public ControlGroupMember
{
-public:
+ public:
AutomationControl(ARDOUR::Session&,
const Evoral::Parameter& parameter,
const ParameterDescriptor& desc,
@@ -82,8 +90,6 @@ public:
void stop_touch(bool mark, double when);
/* inherited from PBD::Controllable.
- * Derived classes MUST call ::writable() to verify
- * that writing to the parameter is legal at that time.
*/
double get_value () const;
/* inherited from PBD::Controllable.
@@ -94,10 +100,11 @@ public:
/* automation related value setting */
virtual bool writable () const;
/* Call to ::set_value() with no test for writable() because
- * this is only used by automation playback. We would like
- * to make it pure virtual
+ * this is only used by automation playback.
*/
- virtual void set_value_unchecked (double val) {}
+ void set_value_unchecked (double val) {
+ actually_set_value (val, PBD::Controllable::NoGroup);
+ }
double lower() const { return _desc.lower; }
double upper() const { return _desc.upper; }
@@ -112,10 +119,34 @@ public:
const ARDOUR::Session& session() const { return _session; }
void commit_transaction (bool did_write);
-protected:
+ protected:
ARDOUR::Session& _session;
+ boost::shared_ptr<ControlGroup> _group;
const ParameterDescriptor _desc;
+
+ bool check_rt (double val, Controllable::GroupControlDisposition gcd);
+
+ /* derived classes may reimplement this, but should either
+ call this explicitly inside their version OR make sure that the
+ Controllable::Changed signal is emitted when necessary.
+ */
+
+ virtual void actually_set_value (double value, PBD::Controllable::GroupControlDisposition);
+
+ /* Session needs to call this method before it queues up the real
+ change for execution in a realtime context. C++ access control sucks.
+ */
+ friend class Session;
+ virtual void do_pre_realtime_queue_stuff (double new_value) {}
+
+ private:
+ /* I am unclear on why we have to make ControlGroup a friend in order
+ to get access to the ::set_group() method when it is already
+ declared to be a friend in ControlGroupMember. Oh well.
+ */
+ friend class ControlGroup;
+ void set_group (boost::shared_ptr<ControlGroup>);
};
diff --git a/libs/ardour/ardour/automation_list.h b/libs/ardour/ardour/automation_list.h
index 37a30ac..a57460c 100644
--- a/libs/ardour/ardour/automation_list.h
+++ b/libs/ardour/ardour/automation_list.h
@@ -61,6 +61,10 @@ private:
AutomationListProperty& operator= (AutomationListProperty const &);
};
+/** AutomationList is a stateful wrapper around Evoral::ControlList.
+ * It includes session-specifics (such as automation state), control logic (e.g. touch, signals)
+ * and acts as proxy to the underlying ControlList which holds the actual data.
+ */
class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList
{
public:
@@ -111,9 +115,11 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev
XMLNode& state (bool full);
XMLNode& serialize_events ();
+ Command* memento_command (XMLNode* before, XMLNode* after);
+
bool operator!= (const AutomationList &) const;
- XMLNode* before () { return _before; }
+ XMLNode* before () { XMLNode* rv = _before; _before = 0; return rv; }
void clear_history ();
private:
void create_curve_if_necessary ();
diff --git a/libs/ardour/ardour/beats_frames_converter.h b/libs/ardour/ardour/beats_frames_converter.h
index 908dd19..4b7169b 100644
--- a/libs/ardour/ardour/beats_frames_converter.h
+++ b/libs/ardour/ardour/beats_frames_converter.h
@@ -19,8 +19,8 @@
$Id: midiregion.h 733 2006-08-01 17:19:38Z drobilla $
*/
+#include "evoral/Beats.hpp"
#include "evoral/TimeConverter.hpp"
-#include "evoral/types.hpp"
#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
diff --git a/libs/ardour/ardour/boost_debug.h b/libs/ardour/ardour/boost_debug.h
new file mode 100644
index 0000000..08c5f5a
--- /dev/null
+++ b/libs/ardour/ardour/boost_debug.h
@@ -0,0 +1,41 @@
+/*
+ Copyright (C) 2016 Paul Davis
+ From an idea by Carl Hetherington.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_boost_debug_h__
+#define __libardour_boost_debug_h__
+
+#include "pbd/boost_debug.h"
+
+/* these defines are intended to be switched on as-needed. They will not work
+ unless the program was configured with --boost-sp-debug
+*/
+
+//#define BOOST_MARK_ROUTE(p) boost_debug_shared_ptr_mark_interesting((p).get(),"Route")
+//#define BOOST_MARK_TRACK(p) boost_debug_shared_ptr_mark_interesting((p).get(),"Track")
+//#define BOOST_MARK_VCA(p) boost_debug_shared_ptr_mark_interesting((p).get(),"ControlMaster")
+//#define BOOST_SHOW_POINTERS() boost_debug_list_ptrs()
+
+#define BOOST_MARK_ROUTE(p)
+#define BOOST_MARK_TRACK(p)
+#define BOOST_MARK_VCA(p)
+#define BOOST_SHOW_POINTERS()
+
+
+#endif /* __libardour_boost_debug_h__ */
diff --git a/libs/ardour/ardour/capturing_processor.h b/libs/ardour/ardour/capturing_processor.h
index 9a91e6d..dccb7eb 100644
--- a/libs/ardour/ardour/capturing_processor.h
+++ b/libs/ardour/ardour/capturing_processor.h
@@ -20,14 +20,16 @@
#ifndef __ardour_capturing_processor_h__
#define __ardour_capturing_processor_h__
+#include "ardour/fixed_delay.h"
#include "ardour/processor.h"
+#include "ardour/types.h"
namespace ARDOUR {
class LIBARDOUR_API CapturingProcessor : public Processor
{
public:
- CapturingProcessor (Session & session);
+ CapturingProcessor (Session & session, framecnt_t latency);
~CapturingProcessor();
public: // main interface
@@ -36,7 +38,7 @@ class LIBARDOUR_API CapturingProcessor : public Processor
public: // Processor overrides
bool display_to_user() const { return false; }
int set_block_size (pframes_t nframes);
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool result_required);
bool configure_io (ChanCount in, ChanCount out);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
virtual XMLNode& state (bool);
@@ -47,6 +49,8 @@ class LIBARDOUR_API CapturingProcessor : public Processor
framecnt_t block_size;
BufferSet capture_buffers;
+ FixedDelay _delaybuffers;
+ framecnt_t _latency;
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/chan_count.h b/libs/ardour/ardour/chan_count.h
index b613f67..b5699b6 100644
--- a/libs/ardour/ardour/chan_count.h
+++ b/libs/ardour/ardour/chan_count.h
@@ -43,29 +43,56 @@ public:
ChanCount(const XMLNode& node);
ChanCount() { reset(); }
- // Convenience constructor for making single-typed streams (stereo, mono, etc)
- ChanCount(DataType type, uint32_t channels) {
+ /** Convenience constructor for making single-typed streams (mono, stereo, midi, etc)
+ * @param type data type
+ * @param count number of channels
+ */
+ ChanCount(DataType type, uint32_t count) {
reset();
- set(type, channels);
+ set(type, count);
}
+ /** zero count of all data types */
void reset() {
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
_counts[*t] = 0;
}
}
+ /** set channel count for given type
+ * @param type data type
+ * @param count number of channels
+ */
void set(DataType t, uint32_t count) { assert(t != DataType::NIL); _counts[t] = count; }
+ /** query channel count for given type
+ * @param type data type
+ * @returns channel count for given type
+ */
uint32_t get(DataType t) const { assert(t != DataType::NIL); return _counts[t]; }
inline uint32_t n (DataType t) const { return _counts[t]; }
+ /** query number of audio channels
+ * @returns number of audio channels
+ */
inline uint32_t n_audio() const { return _counts[DataType::AUDIO]; }
+ /** set number of audio channels
+ * @param a number of audio channels
+ */
inline void set_audio(uint32_t a) { _counts[DataType::AUDIO] = a; }
+ /** query number of midi channels
+ * @returns number of midi channels
+ */
inline uint32_t n_midi() const { return _counts[DataType::MIDI]; }
+ /** set number of audio channels
+ * @param m number of midi channels
+ */
inline void set_midi(uint32_t m) { _counts[DataType::MIDI] = m; }
+ /** query total channel count of all data types
+ * @returns total channel count (audio + midi)
+ */
uint32_t n_total() const {
uint32_t ret = 0;
for (uint32_t i=0; i < DataType::num_types; ++i)
@@ -120,6 +147,39 @@ public:
return ret;
}
+ /** underflow safe subtraction */
+ ChanCount operator-(const ChanCount& other) const {
+ ChanCount ret;
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ if (get(*t) < other.get(*t)) {
+ ret.set(*t, 0);
+ } else {
+ ret.set(*t, get(*t) - other.get(*t));
+ }
+ }
+ return ret;
+ }
+
+ ChanCount operator*(const unsigned int factor) const {
+ ChanCount ret;
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ ret.set(*t, get(*t) * factor );
+ }
+ return ret;
+ }
+
+ /** underflow safe subtraction */
+ ChanCount& operator-=(const ChanCount& other) {
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ if (_counts[*t] < other._counts[*t]) {
+ _counts[*t] = 0;
+ } else {
+ _counts[*t] -= other._counts[*t];
+ }
+ }
+ return *this;
+ }
+
ChanCount& operator+=(const ChanCount& other) {
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
_counts[*t] += other._counts[*t];
diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h
index 7b9f819..ac546e3 100644
--- a/libs/ardour/ardour/chan_mapping.h
+++ b/libs/ardour/ardour/chan_mapping.h
@@ -25,32 +25,95 @@
#include <ostream>
#include <utility>
+#include "pbd/xml++.h"
#include "ardour/data_type.h"
#include "ardour/chan_count.h"
namespace ARDOUR {
-/** A mapping from one set of channels to another
- * (e.g. how to 'connect' two BufferSets).
+/** A mapping from one set of channels to another.
+ * The general form is 1 source (from), many sinks (to).
+ * numeric IDs are used to identify sources and sinks.
+ *
+ * for plugins this is used to map "plugin-pin" to "audio-buffer"
*/
class LIBARDOUR_API ChanMapping {
public:
ChanMapping() {}
ChanMapping(ARDOUR::ChanCount identity);
-
- uint32_t get(DataType t, uint32_t from, bool* valid);
- uint32_t get(DataType t, uint32_t from) { return get (t, from, NULL); }
+ ChanMapping(const ChanMapping&);
+ ChanMapping(const XMLNode& node);
+
+ uint32_t get(DataType t, uint32_t from, bool* valid) const;
+
+ /** reverse lookup
+ * @param type data type
+ * @param to pin
+ * @param valid pointer to a boolean. If not NULL it is set to true if the mapping is found, and false otherwise.
+ * @returns first "from" that matches given "to"
+ */
+ uint32_t get_src(DataType t, uint32_t to, bool* valid) const;
+
+ /** get buffer mapping for given data type and pin
+ * @param type data type
+ * @param from numeric source id
+ * @returns mapped buffer number (or ChanMapping::Invalid)
+ */
+ uint32_t get (DataType t, uint32_t from) const { return get (t, from, NULL); }
+
+ /** set buffer mapping for given data type
+ * @param type data type
+ * @param from numeric source id
+ * @param to buffer
+ */
void set(DataType t, uint32_t from, uint32_t to);
void offset_from(DataType t, int32_t delta);
void offset_to(DataType t, int32_t delta);
+ /** remove mapping
+ * @param type data type
+ * @param from numeric source to remove from mapping
+ */
+ void unset(DataType t, uint32_t from);
+
+ /** Test mapping matrix for identity
+ * @param offset per data-type offset to take into account
+ * @returns true if the mapping is a channel identity map
+ */
+ bool is_identity (ARDOUR::ChanCount offset = ARDOUR::ChanCount()) const;
+
+ /** Test if this mapping is monotonic (useful to see if inplace processing is feasible)
+ * @returns true if the map is a strict monotonic set
+ */
+ bool is_monotonic () const;
+
+ uint32_t n_total () const;
+
+ ChanCount count () const;
+
+ XMLNode* state(const std::string& name) const;
+
+ /** Test if this mapping is a subset
+ * @param superset to test against
+ * @returns true if all mapping are also present in the superset
+ */
+ bool is_subset (const ChanMapping& superset) const;
+
typedef std::map<uint32_t, uint32_t> TypeMapping;
typedef std::map<DataType, TypeMapping> Mappings;
Mappings mappings() { return _mappings; }
const Mappings mappings() const { return _mappings; }
+ bool operator==(const ChanMapping& other) const {
+ return (_mappings == other._mappings);
+ }
+
+ bool operator!=(const ChanMapping& other) const {
+ return ! (*this == other);
+ }
+
private:
Mappings _mappings;
};
diff --git a/libs/ardour/ardour/control_group.h b/libs/ardour/ardour/control_group.h
new file mode 100644
index 0000000..e1b83bb
--- /dev/null
+++ b/libs/ardour/ardour/control_group.h
@@ -0,0 +1,108 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_control_group_h__
+#define __libardour_control_group_h__
+
+#include <map>
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#include <glibmm/threads.h>
+
+#include "pbd/controllable.h"
+
+#include "evoral/Parameter.hpp"
+
+#include "ardour/automation_control.h"
+#include "ardour/types.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API ControlGroup : public boost::enable_shared_from_this<ControlGroup>
+{
+ public:
+ ControlGroup (Evoral::Parameter p);
+ virtual ~ControlGroup ();
+
+ enum Mode {
+ Relative = 0x1,
+ Inverted = 0x2,
+ };
+
+ int add_control (boost::shared_ptr<AutomationControl>);
+ int remove_control (boost::shared_ptr<AutomationControl>);
+
+ ControlList controls () const;
+
+ void clear ();
+
+ void set_active (bool);
+ bool active() const { return _active; }
+
+ void set_mode (Mode m);
+ Mode mode () const { return _mode; }
+
+ Evoral::Parameter parameter() const { return _parameter; }
+
+ virtual void set_group_value (boost::shared_ptr<AutomationControl>, double val);
+
+ bool use_me (PBD::Controllable::GroupControlDisposition gcd) const {
+ switch (gcd) {
+ case PBD::Controllable::ForGroup:
+ return false;
+ case PBD::Controllable::NoGroup:
+ return false;
+ case PBD::Controllable::InverseGroup:
+ return !_active;
+ default:
+ return _active;
+ }
+ }
+
+ protected:
+ typedef std::map<PBD::ID,boost::shared_ptr<AutomationControl> > ControlMap;
+ Evoral::Parameter _parameter;
+ mutable Glib::Threads::RWLock controls_lock;
+ ControlMap _controls;
+ bool _active;
+ Mode _mode;
+ PBD::ScopedConnectionList member_connections;
+ bool propagating;
+
+ void control_going_away (boost::weak_ptr<AutomationControl>);
+};
+
+
+class LIBARDOUR_API GainControlGroup : public ControlGroup
+{
+ public:
+ GainControlGroup();
+
+ void set_group_value (boost::shared_ptr<AutomationControl>, double val);
+
+ private:
+ gain_t get_max_factor (gain_t);
+ gain_t get_min_factor (gain_t);
+};
+
+} /* namespace */
+
+#endif /* __libardour_control_group_h__ */
diff --git a/libs/ardour/ardour/control_group_member.h b/libs/ardour/ardour/control_group_member.h
new file mode 100644
index 0000000..385de9c
--- /dev/null
+++ b/libs/ardour/ardour/control_group_member.h
@@ -0,0 +1,40 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_control_group_member_h__
+#define __libardour_control_group_member_h__
+
+namespace ARDOUR {
+
+class ControlGroup;
+
+class LIBARDOUR_API ControlGroupMember
+{
+ public:
+ virtual ~ControlGroupMember () {};
+ private:
+ friend class ControlGroup;
+ /* Only a ControlGroup can call this; all membership changes must be
+ mediated by the ControlGroup, not by operating on the member.
+ */
+ virtual void set_group (boost::shared_ptr<ControlGroup>) = 0;
+};
+
+} /* namespace */
+
+#endif /* __libardour_control_group_member_h__ */
diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h
index dbbb0c3..c6ea045 100644
--- a/libs/ardour/ardour/control_protocol_manager.h
+++ b/libs/ardour/ardour/control_protocol_manager.h
@@ -36,20 +36,21 @@ class ControlProtocolDescriptor;
class Session;
class LIBARDOUR_API ControlProtocolInfo {
-public:
- ControlProtocolDescriptor* descriptor;
- ControlProtocol* protocol;
- std::string name;
- std::string path;
- bool requested;
- bool mandatory;
- bool supports_feedback;
- XMLNode* state;
-
- ControlProtocolInfo() : descriptor (0), protocol (0), requested(false),
+ public:
+ ControlProtocolDescriptor* descriptor;
+ ControlProtocol* protocol;
+ std::string name;
+ std::string path;
+ bool requested;
+ bool mandatory;
+ bool supports_feedback;
+ XMLNode* state;
+
+ ControlProtocolInfo() : descriptor (0), protocol (0), requested(false),
mandatory(false), supports_feedback(false), state (0)
{}
- ~ControlProtocolInfo() { delete state; }
+ ~ControlProtocolInfo();
+
};
class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandlePtr
diff --git a/libs/ardour/ardour/controllable_descriptor.h b/libs/ardour/ardour/controllable_descriptor.h
new file mode 100644
index 0000000..9f16022
--- /dev/null
+++ b/libs/ardour/ardour/controllable_descriptor.h
@@ -0,0 +1,95 @@
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_controllable_descriptor_h__
+#define __libardour_controllable_descriptor_h__
+
+#include <vector>
+#include <string>
+#include <stdint.h>
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API ControllableDescriptor {
+public:
+ enum TopLevelType {
+ PresentationOrderRoute,
+ PresentationOrderTrack,
+ PresentationOrderBus,
+ PresentationOrderVCA,
+ NamedRoute,
+ SelectionCount,
+ };
+
+ enum SubType {
+ Gain,
+ Trim,
+ Solo,
+ Mute,
+ Recenable,
+ PanDirection,
+ PanWidth,
+ PanElevation,
+ Balance,
+ SendGain,
+ PluginParameter
+ };
+
+ ControllableDescriptor ()
+ : _top_level_type (PresentationOrderRoute)
+ , _subtype (Gain)
+ , _banked (false)
+ , _bank_offset (0)
+ {}
+
+ int set (const std::string&);
+
+ /* it is only valid to call top_level_name() if top_level_type() returns
+ NamedRoute
+ */
+
+ TopLevelType top_level_type() const { return _top_level_type; }
+ const std::string& top_level_name() const { return _top_level_name; }
+
+ SubType subtype() const { return _subtype; }
+
+ uint32_t presentation_order() const;
+ uint32_t selection_id() const;
+ uint32_t target (uint32_t n) const;
+ bool banked() const { return _banked; }
+
+ void set_bank_offset (uint32_t o) { _bank_offset = o; }
+
+private:
+ TopLevelType _top_level_type;
+ SubType _subtype;
+ std::string _top_level_name;
+ union {
+ uint32_t _presentation_order;
+ uint32_t _selection_id;
+ };
+ std::vector<uint32_t> _target;
+ uint32_t _banked;
+ uint32_t _bank_offset;
+};
+
+}
+
+#endif /* __libardour_controllable_descriptor_h__ */
diff --git a/libs/ardour/ardour/debug.h b/libs/ardour/ardour/debug.h
index 6ebf21a..4193508 100644
--- a/libs/ardour/ardour/debug.h
+++ b/libs/ardour/ardour/debug.h
@@ -37,6 +37,7 @@ namespace PBD {
LIBARDOUR_API extern DebugBits LatencyCompensation;
LIBARDOUR_API extern DebugBits Peaks;
LIBARDOUR_API extern DebugBits Processors;
+ LIBARDOUR_API extern DebugBits ChanMapping;
LIBARDOUR_API extern DebugBits ProcessThreads;
LIBARDOUR_API extern DebugBits Graph;
LIBARDOUR_API extern DebugBits Destruction;
@@ -53,6 +54,7 @@ namespace PBD {
LIBARDOUR_API extern DebugBits AudioPlayback;
LIBARDOUR_API extern DebugBits Panning;
LIBARDOUR_API extern DebugBits LV2;
+ LIBARDOUR_API extern DebugBits LV2Automate;
LIBARDOUR_API extern DebugBits CaptureAlignment;
LIBARDOUR_API extern DebugBits PluginManager;
LIBARDOUR_API extern DebugBits AudioUnits;
@@ -77,6 +79,7 @@ namespace PBD {
LIBARDOUR_API extern DebugBits BackendPorts;
LIBARDOUR_API extern DebugBits VSTCallbacks;
LIBARDOUR_API extern DebugBits FaderPort;
+ LIBARDOUR_API extern DebugBits VCA;
}
}
diff --git a/libs/ardour/ardour/delayline.h b/libs/ardour/ardour/delayline.h
index 56a6de0..93097df 100644
--- a/libs/ardour/ardour/delayline.h
+++ b/libs/ardour/ardour/delayline.h
@@ -20,6 +20,9 @@
#ifndef __ardour_delayline_h__
#define __ardour_delayline_h__
+#include <boost/shared_ptr.hpp>
+#include <boost/shared_array.hpp>
+
#include "ardour/types.h"
#include "ardour/processor.h"
@@ -39,7 +42,7 @@ public:
bool display_to_user() const { return false; }
- void run (BufferSet&, framepos_t, framepos_t, pframes_t, bool);
+ void run (BufferSet&, framepos_t, framepos_t, double, pframes_t, bool);
void set_delay(framecnt_t signal_delay);
framecnt_t get_delay() { return _pending_delay; }
@@ -58,8 +61,8 @@ private:
framecnt_t _delay, _pending_delay;
framecnt_t _bsiz, _pending_bsiz;
frameoffset_t _roff, _woff;
- boost::shared_ptr<Sample> _buf;
- boost::shared_ptr<Sample> _pending_buf;
+ boost::shared_array<Sample> _buf;
+ boost::shared_array<Sample> _pending_buf;
boost::shared_ptr<MidiBuffer> _midi_buf;
bool _pending_flush;
};
diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h
index 13e1cdc..80b8431 100644
--- a/libs/ardour/ardour/delivery.h
+++ b/libs/ardour/ardour/delivery.h
@@ -71,7 +71,7 @@ public:
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out);
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
/* supplemental method used with MIDI */
diff --git a/libs/ardour/ardour/directory_names.h b/libs/ardour/ardour/directory_names.h
index c2b4783..7c507d1 100644
--- a/libs/ardour/ardour/directory_names.h
+++ b/libs/ardour/ardour/directory_names.h
@@ -39,6 +39,7 @@ namespace ARDOUR {
LIBARDOUR_API extern const char* const templates_dir_name;
LIBARDOUR_API extern const char* const route_templates_dir_name;
LIBARDOUR_API extern const char* const surfaces_dir_name;
+ LIBARDOUR_API extern const char* const theme_dir_name;
LIBARDOUR_API extern const char* const ladspa_dir_name;
LIBARDOUR_API extern const char* const panner_dir_name;
LIBARDOUR_API extern const char* const backend_dir_name;
@@ -46,6 +47,7 @@ namespace ARDOUR {
LIBARDOUR_API extern const char* const analysis_dir_name;
LIBARDOUR_API extern const char* const plugins_dir_name;
LIBARDOUR_API extern const char* const externals_dir_name;
+ LIBARDOUR_API extern const char* const lua_dir_name;
};
diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h
index fb9be65..e51f8c3 100644
--- a/libs/ardour/ardour/diskstream.h
+++ b/libs/ardour/ardour/diskstream.h
@@ -29,7 +29,7 @@
#include <boost/utility.hpp>
-#include "evoral/types.hpp"
+#include "evoral/Range.hpp"
#include "ardour/ardour.h"
#include "ardour/chan_count.h"
diff --git a/libs/ardour/ardour/dsp_filter.h b/libs/ardour/ardour/dsp_filter.h
new file mode 100644
index 0000000..b7be410
--- /dev/null
+++ b/libs/ardour/ardour/dsp_filter.h
@@ -0,0 +1,314 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef _dsp_filter_h_
+#define _dsp_filter_h_
+
+#include <stdint.h>
+#include <string.h>
+#include <assert.h>
+#include <glib.h>
+#include <glibmm.h>
+#include <fftw3.h>
+
+#include "pbd/malign.h"
+
+#include "ardour/buffer_set.h"
+#include "ardour/chan_mapping.h"
+#include "ardour/libardour_visibility.h"
+#include "ardour/types.h"
+
+namespace ARDOUR { namespace DSP {
+
+ /** C/C++ Shared Memory
+ *
+ * A convenience class representing a C array of float[] or int32_t[]
+ * data values. This is useful for lua scripts to perform DSP operations
+ * directly using C/C++ with CPU Hardware acceleration.
+ *
+ * Access to this memory area is always 4 byte aligned. The data
+ * is interpreted either as float or as int.
+ *
+ * This memory area can also be shared between different instances
+ * or the same lua plugin (DSP, GUI).
+ *
+ * Since memory allocation is not realtime safe it should be
+ * allocated during dsp_init() or dsp_configure().
+ * The memory is free()ed automatically when the lua instance is
+ * destroyed.
+ */
+ class DspShm {
+ public:
+ DspShm (size_t s = 0)
+ : _data (0)
+ , _size (0)
+ {
+ assert (sizeof(float) == sizeof (int32_t));
+ assert (sizeof(float) == sizeof (int));
+ allocate (s);
+ }
+
+ ~DspShm () {
+ cache_aligned_free (_data);
+ }
+
+ /** [re] allocate memory in host's memory space
+ *
+ * @param s size, total number of float or integer elements to store.
+ */
+ void allocate (size_t s) {
+ if (s == _size) { return; }
+ cache_aligned_free (_data);
+ cache_aligned_malloc ((void**) &_data, sizeof (float) * s);
+ if (_data) { _size = s; }
+ }
+
+ /** clear memory (set to zero) */
+ void clear () {
+ memset (_data, 0, sizeof(float) * _size);
+ }
+
+ /** access memory as float array
+ *
+ * @param off offset in shared memory region
+ * @returns float[]
+ */
+ float* to_float (size_t off) {
+ if (off >= _size) { return 0; }
+ return &(((float*)_data)[off]);
+ }
+
+ /** access memory as integer array
+ *
+ * @param off offset in shared memory region
+ * @returns int_32_t[]
+ */
+ int32_t* to_int (size_t off) {
+ if (off >= _size) { return 0; }
+ return &(((int32_t*)_data)[off]);
+ }
+
+ /** atomically set integer at offset
+ *
+ * This involves a memory barrier. This call
+ * is intended for buffers which are
+ * shared with another instance.
+ *
+ * @param off offset in shared memory region
+ * @param val value to set
+ */
+ void atomic_set_int (size_t off, int32_t val) {
+ g_atomic_int_set (&(((int32_t*)_data)[off]), val);
+ }
+
+ /** atomically read integer at offset
+ *
+ * This involves a memory barrier. This call
+ * is intended for buffers which are
+ * shared with another instance.
+ *
+ * @param off offset in shared memory region
+ * @returns value at offset
+ */
+ int32_t atomic_get_int (size_t off) {
+ return g_atomic_int_get (&(((int32_t*)_data)[off]));
+ }
+
+ private:
+ void* _data;
+ size_t _size;
+ };
+
+ /** lua wrapper to memset() */
+ void memset (float *data, const float val, const uint32_t n_samples);
+ /** matrix multiply
+ * multiply every sample of `data' with the corresponding sample at `mult'.
+ *
+ * @param data multiplicand
+ * @param mult multiplicand
+ * @param n_samples number of samples in data and mmult
+ */
+ void mmult (float *data, float *mult, const uint32_t n_samples);
+ /** calculate peaks
+ *
+ * @param data data to analyze
+ * @param min result, minimum value found in range
+ * @param max result, max value found in range
+ * @param n_samples number of samples to analyze
+ */
+ void peaks (const float *data, float &min, float &max, uint32_t n_samples);
+
+ /** non-linear power-scale meter deflection
+ *
+ * @param power signal power (dB)
+ * @returns deflected value
+ */
+ float log_meter (float power);
+ /** non-linear power-scale meter deflection
+ *
+ * @param coeff signal value
+ * @returns deflected value
+ */
+ float log_meter_coeff (float coeff);
+
+ void process_map (BufferSet* bufs,
+ const ChanMapping& in,
+ const ChanMapping& out,
+ pframes_t nframes, framecnt_t offset,
+ const DataType&);
+
+ /** 1st order Low Pass filter */
+ class LIBARDOUR_API LowPass {
+ public:
+ /** instantiate a LPF
+ *
+ * @param samplerate samplerate
+ * @param freq cut-off frequency
+ */
+ LowPass (double samplerate, float freq);
+ /** process audio data
+ *
+ * @param data pointer to audio-data
+ * @param n_samples number of samples to process
+ */
+ void proc (float *data, const uint32_t n_samples);
+ /** filter control data
+ *
+ * This is useful for parameter smoothing.
+ *
+ * @param data pointer to control-data array
+ * @param val target value
+ * @param array length
+ */
+ void ctrl (float *data, const float val, const uint32_t n_samples);
+ /** update filter cut-off frequency
+ *
+ * @param freq cut-off frequency
+ */
+ void set_cutoff (float freq);
+ /** reset filter state */
+ void reset () { _z = 0.f; }
+ private:
+ float _rate;
+ float _z;
+ float _a;
+ };
+
+ /** Biquad Filter */
+ class LIBARDOUR_API Biquad {
+ public:
+ enum Type {
+ LowPass,
+ HighPass,
+ BandPassSkirt,
+ BandPass0dB,
+ Notch,
+ AllPass,
+ Peaking,
+ LowShelf,
+ HighShelf
+ };
+
+ /** Instantiate Biquad Filter
+ *
+ * @param samplerate Samplerate
+ */
+ Biquad (double samplerate);
+ Biquad (const Biquad &other);
+
+ /** process audio data
+ *
+ * @param data pointer to audio-data
+ * @param n_samples number of samples to process
+ */
+ void run (float *data, const uint32_t n_samples);
+ /** setup filter, compute coefficients
+ *
+ * @param t filter type (LowPass, HighPass, etc)
+ * @param freq filter frequency
+ * @param Q filter quality
+ * @param gain filter gain
+ */
+ void compute (Type t, double freq, double Q, double gain);
+
+ /** setup filter, set coefficients directly */
+ void configure (double a1, double a2, double b0, double b1, double b2);
+
+ /** filter transfer function (filter response for spectrum visualization)
+ * @param freq frequency
+ * @return gain at given frequency in dB (clamped to -120..+120)
+ */
+ float dB_at_freq (float freq) const;
+
+ /** reset filter state */
+ void reset () { _z1 = _z2 = 0.0; }
+ private:
+ double _rate;
+ float _z1, _z2;
+ double _a1, _a2;
+ double _b0, _b1, _b2;
+ };
+
+ class LIBARDOUR_API FFTSpectrum {
+ public:
+ FFTSpectrum (uint32_t window_size, double rate);
+ ~FFTSpectrum ();
+
+ /** set data to be analyzed and pre-process with hanning window
+ * n_samples + offset must not be larger than the configured window_size
+ *
+ * @param data raw audio data
+ * @param n_samples number of samples to write to analysis buffer
+ * @param offset destination offset
+ */
+ void set_data_hann (float const * const data, const uint32_t n_samples, const uint32_t offset = 0);
+
+ /** process current data in buffer */
+ void execute ();
+
+ /** query
+ * @param bin the frequency bin 0 .. window_size / 2
+ * @param norm gain factor (set equal to @bin for 1/f normalization)
+ * @return signal power at given bin (in dBFS)
+ */
+ float power_at_bin (const uint32_t bin, const float norm = 1.f) const;
+
+ float freq_at_bin (const uint32_t bin) const {
+ return bin * _fft_freq_per_bin;
+ }
+
+ private:
+ static Glib::Threads::Mutex fft_planner_lock;
+ float* hann_window;
+
+ void init (uint32_t window_size, double rate);
+ void reset ();
+
+ uint32_t _fft_window_size;
+ uint32_t _fft_data_size;
+ double _fft_freq_per_bin;
+
+ float* _fft_data_in;
+ float* _fft_data_out;
+ float* _fft_power;
+
+ fftwf_plan _fftplan;
+ };
+
+} } /* namespace */
+#endif
diff --git a/libs/ardour/ardour/export_format_manager.h b/libs/ardour/ardour/export_format_manager.h
index fff9729..5a78708 100644
--- a/libs/ardour/ardour/export_format_manager.h
+++ b/libs/ardour/ardour/export_format_manager.h
@@ -109,7 +109,10 @@ class LIBARDOUR_API ExportFormatManager : public PBD::ScopedConnectionList
void select_trim_end (bool value);
void select_silence_end (AnyTime const & time);
void select_normalize (bool value);
- void select_normalize_target (float value);
+ void select_normalize_loudness (bool value);
+ void select_normalize_dbfs (float value);
+ void select_normalize_lufs (float value);
+ void select_normalize_dbtp (float value);
void select_tagging (bool tag);
private:
diff --git a/libs/ardour/ardour/export_format_specification.h b/libs/ardour/ardour/export_format_specification.h
index 89ce0e5..d473d20 100644
--- a/libs/ardour/ardour/export_format_specification.h
+++ b/libs/ardour/ardour/export_format_specification.h
@@ -91,7 +91,10 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
void set_trim_beginning (bool value) { _trim_beginning = value; }
void set_trim_end (bool value) { _trim_end = value; }
void set_normalize (bool value) { _normalize = value; }
- void set_normalize_target (float value) { _normalize_target = value; }
+ void set_normalize_loudness (bool value) { _normalize_loudness = value; }
+ void set_normalize_dbfs (float value) { _normalize_dbfs = value; }
+ void set_normalize_lufs (float value) { _normalize_lufs = value; }
+ void set_normalize_dbtp (float value) { _normalize_dbtp = value; }
void set_tag (bool tag_it) { _tag = tag_it; }
void set_with_cue (bool yn) { _with_cue = yn; }
@@ -157,7 +160,10 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
bool trim_beginning () const { return _trim_beginning; }
bool trim_end () const { return _trim_end; }
bool normalize () const { return _normalize; }
- float normalize_target () const { return _normalize_target; }
+ bool normalize_loudness () const { return _normalize_loudness; }
+ float normalize_dbfs () const { return _normalize_dbfs; }
+ float normalize_lufs () const { return _normalize_lufs; }
+ float normalize_dbtp () const { return _normalize_dbtp; }
bool with_toc() const { return _with_toc; }
bool with_cue() const { return _with_cue; }
bool with_mp4chaps() const { return _with_mp4chaps; }
@@ -211,7 +217,10 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
Time _silence_end;
bool _normalize;
- float _normalize_target;
+ bool _normalize_loudness;
+ float _normalize_dbfs;
+ float _normalize_lufs;
+ float _normalize_dbtp;
bool _with_toc;
bool _with_cue;
bool _with_mp4chaps;
diff --git a/libs/ardour/ardour/export_graph_builder.h b/libs/ardour/ardour/export_graph_builder.h
index 0a9912e..c9671d7 100644
--- a/libs/ardour/ardour/export_graph_builder.h
+++ b/libs/ardour/ardour/export_graph_builder.h
@@ -32,6 +32,7 @@
namespace AudioGrapher {
class SampleRateConverter;
class PeakReader;
+ class LoudnessReader;
class Normalizer;
class Analyser;
template <typename T> class Chunker;
@@ -67,14 +68,15 @@ class LIBARDOUR_API ExportGraphBuilder
~ExportGraphBuilder ();
int process (framecnt_t frames, bool last_cycle);
- bool process_normalize (); // returns true when finished
- bool will_normalize() { return !normalizers.empty(); }
- unsigned get_normalize_cycle_count() const;
+ bool post_process (); // returns true when finished
+ bool need_postprocessing () const { return !intermediates.empty(); }
+ bool realtime() const { return _realtime; }
+ unsigned get_postprocessing_cycle_count() const;
void reset ();
void cleanup (bool remove_out_files = false);
void set_current_timespan (boost::shared_ptr<ExportTimespan> span);
- void add_config (FileSpec const & config);
+ void add_config (FileSpec const & config, bool rt);
void get_analysis_results (AnalysisResults& results);
private:
@@ -145,41 +147,45 @@ class LIBARDOUR_API ExportGraphBuilder
ShortConverterPtr short_converter;
};
- class Normalizer {
+ class Intermediate {
public:
- Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
+ Intermediate (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
FloatSinkPtr sink ();
void add_child (FileSpec const & new_config);
void remove_children (bool remove_out_files);
bool operator== (FileSpec const & other_config) const;
- unsigned get_normalize_cycle_count() const;
+ unsigned get_postprocessing_cycle_count() const;
/// Returns true when finished
bool process ();
private:
typedef boost::shared_ptr<AudioGrapher::PeakReader> PeakReaderPtr;
+ typedef boost::shared_ptr<AudioGrapher::LoudnessReader> LoudnessReaderPtr;
typedef boost::shared_ptr<AudioGrapher::Normalizer> NormalizerPtr;
typedef boost::shared_ptr<AudioGrapher::TmpFile<Sample> > TmpFilePtr;
typedef boost::shared_ptr<AudioGrapher::Threader<Sample> > ThreaderPtr;
typedef boost::shared_ptr<AudioGrapher::AllocatingProcessContext<Sample> > BufferPtr;
- void start_post_processing();
+ void prepare_post_processing ();
+ void start_post_processing ();
ExportGraphBuilder & parent;
FileSpec config;
framecnt_t max_frames_out;
-
+ bool use_loudness;
+ bool use_peak;
BufferPtr buffer;
PeakReaderPtr peak_reader;
TmpFilePtr tmp_file;
NormalizerPtr normalizer;
ThreaderPtr threader;
+ LoudnessReaderPtr loudness_reader;
boost::ptr_list<SFC> children;
- PBD::ScopedConnection post_processing_connection;
+ PBD::ScopedConnectionList post_processing_connection;
};
// sample rate converter
@@ -201,7 +207,7 @@ class LIBARDOUR_API ExportGraphBuilder
ExportGraphBuilder & parent;
FileSpec config;
boost::ptr_list<SFC> children;
- boost::ptr_list<Normalizer> normalized_children;
+ boost::ptr_list<Intermediate> intermediate_children;
SRConverterPtr converter;
framecnt_t max_frames_out;
};
@@ -257,10 +263,12 @@ class LIBARDOUR_API ExportGraphBuilder
framecnt_t process_buffer_frames;
- std::list<Normalizer *> normalizers;
+ std::list<Intermediate *> intermediates;
AnalysisMap analysis_map;
+ bool _realtime;
+
Glib::ThreadPool thread_pool;
};
diff --git a/libs/ardour/ardour/export_handler.h b/libs/ardour/ardour/export_handler.h
index 3d92888..5ed1c0b 100644
--- a/libs/ardour/ardour/export_handler.h
+++ b/libs/ardour/ardour/export_handler.h
@@ -34,7 +34,7 @@
#include "ardour/types.h"
#include "pbd/signals.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace AudioGrapher {
class BroadcastInfo;
@@ -72,6 +72,7 @@ class LIBARDOUR_API ExportElementFactory
Session & session;
};
+/** Export Handler */
class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::trackable
{
public:
@@ -138,13 +139,13 @@ class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::tr
typedef std::multimap<ExportTimespanPtr, FileSpec> ConfigMap;
ConfigMap config_map;
- bool normalizing;
+ bool post_processing;
/* Timespan management */
void start_timespan ();
int process_timespan (framecnt_t frames);
- int process_normalize ();
+ int post_process ();
void finish_timespan ();
typedef std::pair<ConfigMap::iterator, ConfigMap::iterator> TimespanBounds;
diff --git a/libs/ardour/ardour/export_profile_manager.h b/libs/ardour/ardour/export_profile_manager.h
index 2757795..b0285f8 100644
--- a/libs/ardour/ardour/export_profile_manager.h
+++ b/libs/ardour/ardour/export_profile_manager.h
@@ -65,6 +65,8 @@ class LIBARDOUR_API ExportProfileManager
void load_profile ();
void prepare_for_export ();
+ ExportType type () const { return _type; }
+
typedef std::list<ExportPresetPtr> PresetList;
PresetList const & get_presets () { return preset_list; }
@@ -79,7 +81,7 @@ class LIBARDOUR_API ExportProfileManager
typedef std::pair<PBD::UUID, std::string> FilePair;
typedef std::map<PBD::UUID, std::string> FileMap;
- ExportType type;
+ ExportType _type;
std::string xml_node_name;
HandlerPtr handler;
Session & session;
diff --git a/libs/ardour/ardour/export_status.h b/libs/ardour/ardour/export_status.h
index f250ae0..99642a2 100644
--- a/libs/ardour/ardour/export_status.h
+++ b/libs/ardour/ardour/export_status.h
@@ -62,6 +62,7 @@ class LIBARDOUR_API ExportStatus {
volatile enum Progress {
Exporting,
Normalizing,
+ Encoding,
Tagging,
Uploading,
Command }
@@ -77,8 +78,8 @@ class LIBARDOUR_API ExportStatus {
volatile framecnt_t total_frames_current_timespan;
volatile framecnt_t processed_frames_current_timespan;
- volatile uint32_t total_normalize_cycles;
- volatile uint32_t current_normalize_cycle;
+ volatile uint32_t total_postprocessing_cycles;
+ volatile uint32_t current_postprocessing_cycle;
AnalysisResults result_map;
diff --git a/libs/ardour/ardour/export_timespan.h b/libs/ardour/ardour/export_timespan.h
index 754335b..d4631cb 100644
--- a/libs/ardour/ardour/export_timespan.h
+++ b/libs/ardour/ardour/export_timespan.h
@@ -53,6 +53,9 @@ class LIBARDOUR_API ExportTimespan
std::string range_id () const { return _range_id; }
void set_range_id (std::string range_id) { _range_id = range_id; }
+ bool realtime () const { return _realtime; }
+ void set_realtime (bool rt) { _realtime = rt; }
+
void set_range (framepos_t start, framepos_t end);
framecnt_t get_length () const { return end_frame - start_frame; }
framepos_t get_start () const { return start_frame; }
@@ -76,6 +79,7 @@ class LIBARDOUR_API ExportTimespan
std::string _name;
std::string _range_id;
+ bool _realtime;
};
diff --git a/libs/ardour/ardour/fixed_delay.h b/libs/ardour/ardour/fixed_delay.h
new file mode 100644
index 0000000..21eaa65
--- /dev/null
+++ b/libs/ardour/ardour/fixed_delay.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __ardour_fixed_delay_h__
+#define __ardour_fixed_delay_h__
+
+#include <vector>
+#include "ardour/buffer.h"
+
+namespace ARDOUR {
+
+class ChanCount;
+
+/** Multichannel Audio/Midi Delay Line
+ *
+ * This is an efficient delay line operating directly on Ardour buffers.
+ * The drawback is that there is no thread safety:
+ * All calls need to be executed in the same thread.
+ *
+ * After configuration, the delay can be changed safely up to the maximum
+ * configured delay but doing so flushes the buffer. There is no de-clicking
+ * (see ARDOUR::Delayline for those cases).
+ *
+ * Increasing the delay above the max configured or requesting more
+ * buffers will allocate the required space (not realtime safe).
+ *
+ * All buffers part of the set are treated separately.
+ */
+class LIBARDOUR_API FixedDelay
+{
+public:
+ FixedDelay ();
+ ~FixedDelay ();
+
+ /** initial configuration, usually done after instantiation
+ *
+ * @param count Channel Count (audio+midi)
+ * @param max_delay the maximum number of samples to delay
+ * @param shrink when false already allocated buffers are kept if both channel-count and max-delay requirements are satisified
+ */
+ void configure (const ChanCount& count, framecnt_t max_delay, bool shrink = true);
+
+ /** set delay time and update active process buffers
+ *
+ * This calls configure with shrink = false and sets the current delay time
+ * if the delay time mismatches, the buffers are silenced (zeroed).
+ *
+ * @param count channels to be processed
+ * @param delay number of audio samples to delay
+ */
+ void set (const ChanCount& count, framecnt_t delay);
+
+ /** process a channel
+ *
+ * Read N samples from the input buffer, delay them by the configured delay-time and write
+ * the delayed samples to the output buffer at the given offset.
+ *
+ * @param dt datatype
+ * @param id buffer number (starting at 0)
+ * @param out output buffer to write data to
+ * @param in input buffer to read data from
+ * @param n_samples number of samples to process (must be <= 8192)
+ * @param dst_offset offset in output buffer to start writing to
+ * @param src_offset offset in input buffer to start reading from
+ */
+ void delay (ARDOUR::DataType dt, uint32_t id, Buffer& out, const Buffer& in, pframes_t n_samples, framecnt_t dst_offset = 0, framecnt_t src_offset = 0);
+
+ /** zero all buffers */
+ void flush();
+
+private:
+ framecnt_t _max_delay;
+ framecnt_t _buf_size;
+ framecnt_t _delay;
+ ChanCount _count;
+
+ struct DelayBuffer {
+ public:
+ DelayBuffer () : buf (0), pos (0) {}
+ DelayBuffer (DataType dt, size_t capacity)
+ : buf (Buffer::create (dt, capacity)), pos (0) {}
+ ~DelayBuffer () { delete buf; }
+ Buffer * buf;
+ framepos_t pos;
+ };
+
+ typedef std::vector<DelayBuffer*> BufferVec;
+ // Vector of vectors, indexed by DataType
+ std::vector<BufferVec> _buffers;
+
+ void ensure_buffers(DataType type, size_t num_buffers, size_t buffer_capacity);
+ void clear ();
+};
+
+} // namespace ARDOUR
+
+#endif // __ardour_fixed_delay_h__
diff --git a/libs/ardour/ardour/gain_control.h b/libs/ardour/ardour/gain_control.h
index 07a900a..f72320f 100644
--- a/libs/ardour/ardour/gain_control.h
+++ b/libs/ardour/ardour/gain_control.h
@@ -20,27 +20,25 @@
#define __ardour_gain_control_h__
#include <string>
+
#include <boost/shared_ptr.hpp>
#include "pbd/controllable.h"
#include "evoral/Parameter.hpp"
-#include "ardour/automation_control.h"
+#include "ardour/slavable_automation_control.h"
#include "ardour/libardour_visibility.h"
namespace ARDOUR {
class Session;
-class LIBARDOUR_API GainControl : public AutomationControl {
+class LIBARDOUR_API GainControl : public SlavableAutomationControl {
public:
GainControl (Session& session, const Evoral::Parameter ¶m,
boost::shared_ptr<AutomationList> al = boost::shared_ptr<AutomationList>());
- void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
- void set_value_unchecked (double);
-
double internal_to_interface (double) const;
double interface_to_internal (double) const;
double internal_to_user (double) const;
@@ -49,8 +47,14 @@ class LIBARDOUR_API GainControl : public AutomationControl {
double lower_db;
double range_db;
+
+ int set_state (XMLNode const&, int);
+ XMLNode& get_state();
+
+ void inc_gain (gain_t);
+
private:
- void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+ void recompute_masters_ratios (double val);
};
} /* namespace */
diff --git a/libs/ardour/ardour/instrument_info.h b/libs/ardour/ardour/instrument_info.h
index 745e480..8e08c8b 100644
--- a/libs/ardour/ardour/instrument_info.h
+++ b/libs/ardour/ardour/instrument_info.h
@@ -52,6 +52,7 @@ class LIBARDOUR_API InstrumentInfo {
void set_internal_instrument (boost::shared_ptr<ARDOUR::Processor>);
std::string get_patch_name (uint16_t bank, uint8_t program, uint8_t channel) const;
+ std::string get_patch_name_without (uint16_t bank, uint8_t program, uint8_t channel) const;
std::string get_controller_name (Evoral::Parameter param) const;
std::string get_instrument_name () const;
@@ -70,6 +71,7 @@ class LIBARDOUR_API InstrumentInfo {
boost::shared_ptr<MIDI::Name::ChannelNameSet> plugin_programs_to_channel_name_set (boost::shared_ptr<Processor> p);
std::string get_plugin_patch_name (boost::shared_ptr<ARDOUR::Processor>, uint16_t bank, uint8_t program, uint8_t channel) const;
+ std::string get_patch_name (uint16_t bank, uint8_t program, uint8_t channel, bool with_extra) const;
static MIDI::Name::PatchNameList _gm_patches;
};
diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h
index d12b330..48fcab1 100644
--- a/libs/ardour/ardour/internal_return.h
+++ b/libs/ardour/ardour/internal_return.h
@@ -37,7 +37,7 @@ class LIBARDOUR_API InternalReturn : public Return
XMLNode& state (bool full);
XMLNode& get_state ();
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
bool configure_io (ChanCount, ChanCount);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h
index 71d8049..263c40b 100644
--- a/libs/ardour/ardour/internal_send.h
+++ b/libs/ardour/ardour/internal_send.h
@@ -40,7 +40,7 @@ class LIBARDOUR_API InternalSend : public Send
int set_state(const XMLNode& node, int version);
void cycle_start (pframes_t);
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
bool feeds (boost::shared_ptr<Route> other) const;
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out);
diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h
index 9afd016..db0f2c3 100644
--- a/libs/ardour/ardour/io.h
+++ b/libs/ardour/ardour/io.h
@@ -74,8 +74,8 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
Output
};
- IO (Session&, const std::string& name, Direction, DataType default_type = DataType::AUDIO, bool sendish = false);
- IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO, bool sendish = false);
+ IO (Session&, const std::string& name, Direction, DataType default_type = DataType::AUDIO, bool sendish = false);
+ IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO, bool sendish = false);
virtual ~IO();
@@ -88,13 +88,15 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
void set_active(bool yn) { _active = yn; }
bool set_name (const std::string& str);
+ void set_pretty_name (const std::string& str);
+ std::string pretty_name () const { return _pretty_name_prefix; }
virtual void silence (framecnt_t);
void increment_port_buffer_offset (pframes_t offset);
int ensure_io (ChanCount cnt, bool clear, void *src);
- int connect_ports_to_bundle (boost::shared_ptr<Bundle>, bool exclusive, void *);
+ int connect_ports_to_bundle (boost::shared_ptr<Bundle>, bool exclusive, void *);
int disconnect_ports_from_bundle (boost::shared_ptr<Bundle>, void *);
BundleList bundles_connected ();
@@ -192,7 +194,7 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
/* three utility functions - this just seems to be simplest place to put them */
void collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset);
- void process_input (boost::shared_ptr<Processor>, framepos_t start_frame, framepos_t end_frame, pframes_t nframes);
+ void process_input (boost::shared_ptr<Processor>, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes);
void copy_to_outputs (BufferSet& bufs, DataType type, pframes_t nframes, framecnt_t offset);
/* AudioTrack::deprecated_use_diskstream_connections() needs these */
@@ -207,7 +209,7 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
Direction _direction;
DataType _default_type;
bool _active;
- bool _sendish;
+ bool _sendish;
private:
int connecting_became_legal ();
@@ -248,6 +250,8 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
void setup_bundle ();
std::string bundle_channel_name (uint32_t, uint32_t, DataType) const;
+ void apply_pretty_name ();
+ std::string _pretty_name_prefix;
BufferSet _buffers;
void disconnect_check (boost::shared_ptr<ARDOUR::Port>, boost::shared_ptr<ARDOUR::Port>);
};
diff --git a/libs/ardour/ardour/io_processor.h b/libs/ardour/ardour/io_processor.h
index a273545..15bd74d 100644
--- a/libs/ardour/ardour/io_processor.h
+++ b/libs/ardour/ardour/io_processor.h
@@ -64,7 +64,7 @@ class LIBARDOUR_API IOProcessor : public Processor
void set_input (boost::shared_ptr<IO>);
void set_output (boost::shared_ptr<IO>);
- void silence (framecnt_t nframes);
+ void silence (framecnt_t nframes, framepos_t start_frame);
void disconnect ();
void increment_port_buffer_offset (pframes_t);
diff --git a/libs/ardour/ardour/io_vector.h b/libs/ardour/ardour/io_vector.h
new file mode 100644
index 0000000..0c68f97
--- /dev/null
+++ b/libs/ardour/ardour/io_vector.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2006 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __ardour_io_vector_h__
+#define __ardour_io_vector_h__
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include "ardour/io.h"
+
+namespace ARDOUR {
+
+class IOVector : public std::vector<boost::weak_ptr<ARDOUR::IO> >
+{
+public:
+#if 0 // unused -- for future reference
+ bool connected_to (const IOVector& other) const {
+ for (IOVector::const_iterator i = other.begin(); i != other.end(); ++i) {
+ boost::shared_ptr<const IO> io = i->lock();
+ if (!io) continue;
+ if (connected_to (io)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool connected_to (boost::shared_ptr<const IO> other) const {
+ for (IOVector::const_iterator i = begin(); i != end(); ++i) {
+ boost::shared_ptr<const IO> io = i->lock();
+ if (!io) continue;
+ if (io->connected_to (other)) {
+ return true;
+ }
+ }
+ return false;
+ }
+#endif
+
+ bool fed_by (boost::shared_ptr<const IO> other) const {
+ for (IOVector::const_iterator i = begin(); i != end(); ++i) {
+ boost::shared_ptr<const IO> io = i->lock();
+ if (!io) continue;
+ if (other->connected_to (io)) {
+ return true;
+ }
+ }
+ return false;
+ }
+};
+
+} // namespace ARDOUR
+
+
+#endif
diff --git a/libs/ardour/ardour/ladspa_plugin.h b/libs/ardour/ardour/ladspa_plugin.h
index 6fd214d..dbb635f 100644
--- a/libs/ardour/ardour/ladspa_plugin.h
+++ b/libs/ardour/ardour/ladspa_plugin.h
@@ -83,6 +83,7 @@ class LIBARDOUR_API LadspaPlugin : public ARDOUR::Plugin
int set_block_size (pframes_t /*nframes*/) { return 0; }
int connect_and_run (BufferSet& bufs,
+ framepos_t start, framepos_t end, double speed,
ChanMapping in, ChanMapping out,
pframes_t nframes, framecnt_t offset);
diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h
index f564757..6b61dae 100644
--- a/libs/ardour/ardour/location.h
+++ b/libs/ardour/ardour/location.h
@@ -41,6 +41,7 @@ namespace ARDOUR {
class SceneChange;
+/** Location on Timeline - abstract representation for Markers, Loop/Punch Ranges, CD-Markers etc. */
class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDestructible
{
public:
@@ -150,9 +151,9 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
private:
std::string _name;
framepos_t _start;
- Timecode::BBT_Time _bbt_start;
+ double _bbt_start;
framepos_t _end;
- Timecode::BBT_Time _bbt_end;
+ double _bbt_end;
Flags _flags;
bool _locked;
PositionLockStyle _position_lock_style;
@@ -163,6 +164,7 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
void recompute_bbt_from_frames ();
};
+/** A collection of session locations including unique dedicated locations (loop, punch, etc) */
class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDestructible
{
public:
@@ -171,7 +173,8 @@ class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDes
Locations (Session &);
~Locations ();
- const LocationList& list() { return locations; }
+ const LocationList& list () const { return locations; }
+ LocationList list () { return locations; }
void add (Location *, bool make_current = false);
void remove (Location *);
diff --git a/libs/ardour/ardour/lua_api.h b/libs/ardour/ardour/lua_api.h
new file mode 100644
index 0000000..9af9649
--- /dev/null
+++ b/libs/ardour/ardour/lua_api.h
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef _ardour_lua_api_h_
+#define _ardour_lua_api_h_
+
+#include <string>
+#include <lo/lo.h>
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/libardour_visibility.h"
+
+#include "ardour/processor.h"
+#include "ardour/session.h"
+
+namespace ARDOUR { namespace LuaAPI {
+
+ /** convenience constructor for DataType::NIL with managed lifetime
+ * @returns DataType::NIL
+ */
+ int datatype_ctor_null (lua_State *lua);
+ /** convenience constructor for DataType::AUDIO with managed lifetime
+ * @returns DataType::AUDIO
+ */
+ int datatype_ctor_audio (lua_State *L);
+ /** convenience constructor for DataType::MIDI with managed lifetime
+ * @returns DataType::MIDI
+ */
+ int datatype_ctor_midi (lua_State *L);
+
+ /** Create a null processor shared pointer
+ *
+ * This is useful for Track:bounce() to indicate no processing.
+ */
+ boost::shared_ptr<ARDOUR::Processor> nil_processor ();
+
+ /** create a new Lua Processor (Plugin)
+ *
+ * @param s Session Handle
+ * @param p Identifier or Name of the Processor
+ * @returns Processor object (may be nil)
+ */
+ boost::shared_ptr<ARDOUR::Processor> new_luaproc (ARDOUR::Session *s, const std::string& p);
+
+ /** search a Plugin
+ *
+ * @param id Plugin Name, ID or URI
+ * @param type Plugin Type
+ * @returns PluginInfo or nil if not found
+ */
+ boost::shared_ptr<ARDOUR::PluginInfo> new_plugin_info (const std::string& id, ARDOUR::PluginType type);
+
+ /** create a new Plugin Instance
+ *
+ * @param s Session Handle
+ * @param id Plugin Name, ID or URI
+ * @param type Plugin Type
+ * @returns Processor or nil
+ */
+ boost::shared_ptr<ARDOUR::Processor> new_plugin (ARDOUR::Session *s, const std::string& id, ARDOUR::PluginType type, const std::string& preset = "");
+
+ /** set a plugin control-input parameter value
+ *
+ * @param proc Plugin-Processor
+ * @param which control-input to set (starting at 0)
+ * @param value value to set
+ * @returns true on success, false on error or out-of-bounds value
+ */
+ bool set_processor_param (boost::shared_ptr<ARDOUR::Processor> proc, uint32_t which, float val);
+ /** set a plugin control-input parameter value
+ *
+ * This is a wrapper around set_processor_param which looks up the Processor by plugin-insert.
+ *
+ * @param proc Plugin-Insert
+ * @param which control-input to set (starting at 0)
+ * @param value value to set
+ * @returns true on success, false on error or out-of-bounds value
+ */
+ bool set_plugin_insert_param (boost::shared_ptr<ARDOUR::PluginInsert> pi, uint32_t which, float val);
+
+ /**
+ * A convenience function to get a Automation Lists and ParamaterDescriptor
+ * for a given plugin control.
+ *
+ * This is equivalent to the following lua code
+ * @code
+ * function (processor, param_id)
+ * local plugininsert = processor:to_insert ()
+ * local plugin = plugininsert:plugin(0)
+ * local _, t = plugin:get_parameter_descriptor(param_id, ARDOUR.ParameterDescriptor ())
+ * local ctrl = Evoral.Parameter (ARDOUR.AutomationType.PluginAutomation, 0, param_id)
+ * local ac = pi:automation_control (ctrl, false)
+ * local acl = ac:alist()
+ * return ac:alist(), ac:to_ctrl():list(), t[2]
+ * end
+ * @endcode
+ *
+ * Example usage: get the third input parameter of first plugin on the given route
+ * (Ardour starts counting at zero).
+ * @code
+ * local al, cl, pd = ARDOUR.LuaAPI.plugin_automation (route:nth_plugin (0), 3)
+ * @endcode
+ * @returns 3 parameters: AutomationList, ControlList, ParamaterDescriptor
+ */
+ int plugin_automation (lua_State *lua);
+
+ /**
+ * A convenience function for colorspace HSL to RGB conversion.
+ * All ranges are 0..1
+ *
+ * Example:
+ * @code
+ * local r, g, b, a = ARDOUR.LuaAPI.hsla_to_rgba (hue, saturation, luminosity, alpha)
+ * @endcode
+ * @returns 4 parameters: red, green, blue, alpha (in range 0..1)
+ */
+ int hsla_to_rgba (lua_State *lua);
+} } /* namespace */
+
+namespace ARDOUR { namespace LuaOSC {
+ /** OSC transmitter
+ *
+ * A Class to send OSC messages.
+ */
+ class Address {
+ /*
+ * OSC is kinda special, lo_address is a void* and lo_send() has varags
+ * and typed arguments which makes it hard to bind, even lo_cpp.
+ */
+ public:
+ /** Construct a new OSC transmitter object
+ * @param uri the destination uri e.g. "osc.udp://localhost:7890"
+ */
+ Address (std::string uri) {
+ _addr = lo_address_new_from_url (uri.c_str());
+ }
+
+ ~Address () { if (_addr) { lo_address_free (_addr); } }
+ /** Transmit an OSC message
+ *
+ * Path (string) and type (string) must always be given.
+ * The number of following args must match the type.
+ * Supported types are:
+ *
+ * 'i': integer (lua number)
+ *
+ * 'f': float (lua number)
+ *
+ * 'd': double (lua number)
+ *
+ * 'h': 64bit integer (lua number)
+ *
+ * 's': string (lua string)
+ *
+ * 'c': character (lua string)
+ *
+ * 'T': boolean (lua bool) -- this is not implicily True, a lua true/false must be given
+ *
+ * 'F': boolean (lua bool) -- this is not implicily False, a lua true/false must be given
+ *
+ * @param lua: lua arguments: path, types, ...
+ * @returns boolean true if successful, false on error.
+ */
+ int send (lua_State *lua);
+ private:
+ lo_address _addr;
+ };
+
+}
+
+class LuaTableRef {
+ public:
+ LuaTableRef ();
+ ~LuaTableRef ();
+
+ int get (lua_State* L);
+ int set (lua_State* L);
+
+ private:
+ struct LuaTableEntry {
+ LuaTableEntry (int kt, int vt)
+ : keytype (kt)
+ , valuetype (vt)
+ { }
+
+ int keytype;
+ std::string k_s;
+ unsigned int k_n;
+
+ int valuetype;
+ // LUA_TUSERDATA
+ const void* c;
+ void* p;
+ // LUA_TBOOLEAN
+ bool b;
+ // LUA_TSTRING:
+ std::string s;
+ // LUA_TNUMBER:
+ double n;
+ };
+
+ std::vector<LuaTableEntry> _data;
+
+ static void* findclasskey (lua_State *L, const void* key);
+ template<typename T>
+ static void assign (luabridge::LuaRef* rv, T key, const LuaTableEntry& s);
+};
+
+} /* namespace */
+
+#endif // _ardour_lua_api_h_
diff --git a/libs/ardour/ardour/lua_script_params.h b/libs/ardour/ardour/lua_script_params.h
new file mode 100644
index 0000000..b636aad
--- /dev/null
+++ b/libs/ardour/ardour/lua_script_params.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef _ardour_lua_script_params_h_
+#define _ardour_lua_script_params_h_
+
+#include "ardour/libardour_visibility.h"
+#include "ardour/luascripting.h"
+
+namespace luabridge {
+ class LuaRef;
+}
+
+/* Semantically these are static functions of the LuaScripting class
+ * but are kept separately to minimize header includes.
+ *
+ * LuaScripting itself is a standalone abstraction (not depending on luabridge)
+ * luascripting.h is included by session.h (this file is not).
+ *
+ * The implementation of these functions is in libs/ardour/luascripting.cc
+ */
+namespace ARDOUR { namespace LuaScriptParams {
+
+ LIBARDOUR_API LuaScriptParamList script_params (LuaScriptInfoPtr, const std::string &);
+ LIBARDOUR_API LuaScriptParamList script_params (const std::string &, const std::string &, bool file=true);
+ LIBARDOUR_API void params_to_ref (luabridge::LuaRef *tbl_args, const LuaScriptParamList&);
+ LIBARDOUR_API void ref_to_params (LuaScriptParamList&, luabridge::LuaRef *tbl_args);
+
+} } // namespace
+
+#endif // _ardour_lua_script_params_h_
diff --git a/libs/ardour/ardour/luabindings.h b/libs/ardour/ardour/luabindings.h
new file mode 100644
index 0000000..4650858
--- /dev/null
+++ b/libs/ardour/ardour/luabindings.h
@@ -0,0 +1,40 @@
+/*
+ Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_luabindings_h__
+#define __ardour_luabindings_h__
+
+#include "lua/lua.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+ class Session;
+ namespace LuaBindings {
+ LIBARDOUR_API extern void stddef (lua_State* L);
+
+ LIBARDOUR_API extern void common (lua_State* L);
+ LIBARDOUR_API extern void dsp (lua_State* L);
+ LIBARDOUR_API extern void session (lua_State* L);
+ LIBARDOUR_API extern void osc (lua_State* L);
+
+ LIBARDOUR_API extern void set_session (lua_State* L, Session *s);
+
+ } // namespace LuaBindings
+} // namespace ARDOUR
+
+#endif /* __ardour_luabindings_h__ */
diff --git a/libs/ardour/ardour/luaproc.h b/libs/ardour/ardour/luaproc.h
new file mode 100644
index 0000000..e38e8fb
--- /dev/null
+++ b/libs/ardour/ardour/luaproc.h
@@ -0,0 +1,213 @@
+/*
+ Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ Copyright (C) 2006 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* print runtime and garbage-collection timing statistics */
+//#define WITH_LUAPROC_STATS
+
+/* memory allocation system, default: ReallocPool */
+//#define USE_TLSF // use TLSF instead of ReallocPool
+//#define USE_MALLOC // or plain OS provided realloc (no mlock) -- if USE_TLSF isn't defined
+
+#ifndef __ardour_luaproc_h__
+#define __ardour_luaproc_h__
+
+#include <set>
+#include <vector>
+#include <string>
+
+#ifdef USE_TLSF
+# include "pbd/tlsf.h"
+#else
+# include "pbd/reallocpool.h"
+#endif
+
+#include "pbd/stateful.h"
+
+#include "ardour/types.h"
+#include "ardour/plugin.h"
+#include "ardour/luascripting.h"
+#include "ardour/dsp_filter.h"
+#include "ardour/lua_api.h"
+
+#include "lua/luastate.h"
+
+namespace luabridge {
+ class LuaRef;
+}
+
+namespace ARDOUR {
+
+class LIBARDOUR_API LuaProc : public ARDOUR::Plugin {
+public:
+ LuaProc (AudioEngine&, Session&, const std::string&);
+ LuaProc (const LuaProc &);
+ ~LuaProc ();
+
+ /* Plugin interface */
+
+ std::string unique_id() const { return get_info()->unique_id; }
+ const char* name() const { return get_info()->name.c_str(); }
+ const char* label() const { return get_info()->name.c_str(); }
+ const char* maker() const { return get_info()->creator.c_str(); }
+
+ uint32_t parameter_count() const;
+ float default_value (uint32_t port);
+ void set_parameter (uint32_t port, float val);
+ float get_parameter (uint32_t port) const;
+ int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
+ uint32_t nth_parameter (uint32_t port, bool& ok) const;
+
+ std::string get_docs () const { return _docs; }
+ std::string get_parameter_docs (uint32_t) const;
+
+ PluginOutputConfiguration possible_output () const { return _output_configs; }
+
+ std::set<Evoral::Parameter> automatable() const;
+
+ void activate () { }
+ void deactivate () { }
+ void cleanup () { }
+
+ int set_block_size (pframes_t /*nframes*/) { return 0; }
+ framecnt_t signal_latency() const { return 0; }
+
+ int connect_and_run (BufferSet& bufs,
+ framepos_t start, framepos_t end, double speed,
+ ChanMapping in, ChanMapping out,
+ pframes_t nframes, framecnt_t offset);
+
+ std::string describe_parameter (Evoral::Parameter);
+ void print_parameter (uint32_t, char*, uint32_t len) const;
+ boost::shared_ptr<ScalePoints> get_scale_points(uint32_t port_index) const;
+
+ bool parameter_is_audio (uint32_t) const { return false; }
+ bool parameter_is_control (uint32_t) const { return true; }
+ bool parameter_is_input (uint32_t) const;
+ bool parameter_is_output (uint32_t) const;
+
+ uint32_t designated_bypass_port () {
+ return _designated_bypass_port;
+ }
+
+ std::string state_node_name() const { return "luaproc"; }
+ void add_state (XMLNode *) const;
+ int set_state (const XMLNode&, int version);
+ int set_script_from_state (const XMLNode&);
+
+ bool load_preset (PresetRecord);
+ std::string do_save_preset (std::string);
+ void do_remove_preset (std::string);
+
+ bool has_editor() const { return false; }
+
+ bool can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise);
+ bool configure_io (ChanCount in, ChanCount out);
+
+ ChanCount output_streams() const { return _configured_out; }
+ ChanCount input_streams() const { return _configured_in; }
+
+ bool has_inline_display () { return _lua_has_inline_display; }
+ void setup_lua_inline_gui (LuaState *lua_gui);
+
+private:
+ void find_presets ();
+
+ /* END Plugin interface */
+protected:
+ const std::string& script() const { return _script; }
+
+private:
+#ifdef USE_TLSF
+ PBD::TLSF _mempool;
+#else
+ PBD::ReallocPool _mempool;
+#endif
+ LuaState lua;
+ luabridge::LuaRef * _lua_dsp;
+ std::string _script;
+ std::string _docs;
+ bool _lua_does_channelmapping;
+ bool _lua_has_inline_display;
+
+ void queue_draw () { QueueDraw(); /* EMIT SIGNAL */ }
+ DSP::DspShm* instance_shm () { return &lshm; }
+ DSP::DspShm lshm;
+
+ LuaTableRef* instance_ref () { return &lref; }
+ LuaTableRef lref;
+
+ void init ();
+ bool load_script ();
+ void lua_print (std::string s);
+
+ std::string preset_name_to_uri (const std::string&) const;
+ std::string presets_file () const;
+ XMLTree* presets_tree () const;
+
+ boost::shared_ptr<ScalePoints> parse_scale_points (luabridge::LuaRef*);
+
+ std::vector<std::pair<bool, int> > _ctrl_params;
+ std::map<int, ARDOUR::ParameterDescriptor> _param_desc;
+ std::map<int, std::string> _param_doc;
+ uint32_t _designated_bypass_port;
+
+ float* _control_data;
+ float* _shadow_data;
+
+ ChanCount _configured_in;
+ ChanCount _configured_out;
+
+ ChanCount _selected_in;
+ ChanCount _selected_out;
+
+ PluginOutputConfiguration _output_configs;
+
+ bool _has_midi_input;
+ bool _has_midi_output;
+
+#ifdef WITH_LUAPROC_STATS
+ int64_t _stats_avg[2];
+ int64_t _stats_max[2];
+ int64_t _stats_cnt;
+#endif
+};
+
+class LIBARDOUR_API LuaPluginInfo : public PluginInfo
+{
+ public:
+ LuaPluginInfo (LuaScriptInfoPtr lsi);
+ ~LuaPluginInfo () { };
+
+ PluginPtr load (Session& session);
+ std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
+
+ bool in_category (const std::string &c) const {
+ return (category == c);
+ }
+ bool is_instrument () const { return _is_instrument; }
+ bool reconfigurable_io() const { return true; }
+
+ bool _is_instrument;
+};
+
+typedef boost::shared_ptr<LuaPluginInfo> LuaPluginInfoPtr;
+
+} // namespace ARDOUR
+
+#endif // __ardour_luaproc_h__
diff --git a/libs/ardour/ardour/luascripting.h b/libs/ardour/ardour/luascripting.h
new file mode 100644
index 0000000..1e7833f
--- /dev/null
+++ b/libs/ardour/ardour/luascripting.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef _ardour_luascripting_h_
+#define _ardour_luascripting_h_
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+#include <glibmm/threads.h>
+
+#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API LuaScriptInfo {
+ public:
+
+ enum ScriptType {
+ Invalid,
+ DSP,
+ Session,
+ EditorHook,
+ EditorAction,
+ Snippet,
+ };
+
+ static std::string type2str (const ScriptType t);
+ static ScriptType str2type (const std::string& str);
+
+ LuaScriptInfo (ScriptType t, const std::string &n, const std::string &p, const std::string &uid)
+ : type (t)
+ , name (n)
+ , path (p)
+ , unique_id (uid)
+ { }
+
+ virtual ~LuaScriptInfo () { }
+
+ ScriptType type;
+ std::string name;
+ std::string path;
+ std::string unique_id;
+
+ std::string author;
+ std::string license;
+ std::string category;
+ std::string description;
+};
+
+struct LIBARDOUR_API LuaScriptParam {
+ public:
+ LuaScriptParam (
+ const std::string& n,
+ const std::string& t,
+ const std::string& d,
+ bool o)
+ : name (n)
+ , title (t)
+ , dflt (d)
+ , optional (o)
+ , is_set (false)
+ , value (d)
+ {}
+
+ std::string name;
+ std::string title;
+ std::string dflt;
+ bool optional;
+ bool is_set;
+ std::string value;
+};
+
+
+typedef boost::shared_ptr<LuaScriptInfo> LuaScriptInfoPtr;
+typedef std::vector<LuaScriptInfoPtr> LuaScriptList;
+
+typedef boost::shared_ptr<LuaScriptParam> LuaScriptParamPtr;
+typedef std::vector<LuaScriptParamPtr> LuaScriptParamList;
+
+
+class LIBARDOUR_API LuaScripting {
+
+public:
+ static LuaScripting& instance();
+
+ ~LuaScripting ();
+
+ LuaScriptList &scripts (LuaScriptInfo::ScriptType);
+ void refresh (bool run_scan = false);
+ PBD::Signal0<void> scripts_changed;
+
+ static LuaScriptInfoPtr script_info (const std::string &script);
+ static bool try_compile (const std::string&, const LuaScriptParamList&);
+ static std::string get_factory_bytecode (const std::string&);
+ static std::string user_script_dir ();
+
+private:
+ static LuaScripting* _instance; // singleton
+ LuaScripting ();
+
+ void scan ();
+ static LuaScriptInfoPtr scan_script (const std::string &, const std::string & sc = "");
+ static void lua_print (std::string s);
+
+ LuaScriptList *_sl_dsp;
+ LuaScriptList *_sl_session;
+ LuaScriptList *_sl_hook;
+ LuaScriptList *_sl_action;
+ LuaScriptList *_sl_snippet;
+ LuaScriptList _empty_script_info;
+
+ Glib::Threads::Mutex _lock;
+};
+
+} // namespace ARDOUR
+
+#endif // _ardour_luascripting_h_
diff --git a/libs/ardour/ardour/lv2_extensions.h b/libs/ardour/ardour/lv2_extensions.h
new file mode 100644
index 0000000..64fc3bc
--- /dev/null
+++ b/libs/ardour/ardour/lv2_extensions.h
@@ -0,0 +1,174 @@
+/*
+ Copyright 2016 Robin Gareus <robin at gareus.org>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#ifndef _ardour_lv2_extensions_h_
+#define _ardour_lv2_extensions_h_
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+/**
+ @defgroup inlinedisplay Inline-Display
+
+ Support for displaying a miniaturized generic view
+ directly in the host's Mixer Window.
+
+ @{
+*/
+
+#define LV2_INLINEDISPLAY_URI "http://harrisonconsoles.com/lv2/inlinedisplay"
+#define LV2_INLINEDISPLAY_PREFIX LV2_INLINEDISPLAY_URI "#"
+#define LV2_INLINEDISPLAY__interface LV2_INLINEDISPLAY_PREFIX "interface"
+#define LV2_INLINEDISPLAY__queue_draw LV2_INLINEDISPLAY_PREFIX "queue_draw"
+
+/** Opaque handle for LV2_Inline_Display::queue_draw() */
+typedef void* LV2_Inline_Display_Handle;
+
+/** raw image pixmap format is ARGB32,
+ * the data pointer is owned by the plugin and must be valid
+ * from the first call to render until cleanup.
+ */
+typedef struct {
+ unsigned char *data;
+ int width;
+ int height;
+ int stride;
+} LV2_Inline_Display_Image_Surface;
+
+/** a LV2 Feature provided by the Host to the plugin */
+typedef struct {
+ /** Opaque host data */
+ LV2_Inline_Display_Handle handle;
+ /** Request from run() that the host should call render() at a later time
+ * to update the inline display */
+ void (*queue_draw)(LV2_Inline_Display_Handle handle);
+} LV2_Inline_Display;
+
+/**
+ * Plugin Inline-Display Interface.
+ */
+typedef struct {
+ /**
+ * The render method. This is called by the host in a non-realtime context,
+ * usually the main GUI thread.
+ * The data pointer is owned by the plugin and must be valid
+ * from the first call to render until cleanup.
+ *
+ * @param instance The LV2 instance
+ * @param w the max available width
+ * @param h the max available height
+ * @return pointer to a LV2_Inline_Display_Image_Surface or NULL
+ */
+ LV2_Inline_Display_Image_Surface* (*render)(LV2_Handle instance, uint32_t w, uint32_t h);
+} LV2_Inline_Display_Interface;
+
+/**
+ @}
+*/
+
+/**
+ @defgroup automate Self-Automation
+
+ Support for plugins to write automation data via Atom Events
+
+ @{
+*/
+
+#define LV2_AUTOMATE_URI "http://ardour.org/lv2/automate"
+#define LV2_AUTOMATE_URI_PREFIX LV2_AUTOMATE_URI "#"
+/** an lv2:optionalFeature */
+#define LV2_AUTOMATE_URI__can_write LV2_AUTOMATE_URI_PREFIX "canWriteAutomatation"
+/** atom:supports */
+#define LV2_AUTOMATE_URI__control LV2_AUTOMATE_URI_PREFIX "automationControl"
+/** lv2:portProperty */
+#define LV2_AUTOMATE_URI__controlled LV2_AUTOMATE_URI_PREFIX "automationControlled"
+#define LV2_AUTOMATE_URI__controller LV2_AUTOMATE_URI_PREFIX "automationController"
+
+/** atom messages */
+#define LV2_AUTOMATE_URI__event LV2_AUTOMATE_URI_PREFIX "event"
+#define LV2_AUTOMATE_URI__setup LV2_AUTOMATE_URI_PREFIX "setup"
+#define LV2_AUTOMATE_URI__finalize LV2_AUTOMATE_URI_PREFIX "finalize"
+#define LV2_AUTOMATE_URI__start LV2_AUTOMATE_URI_PREFIX "start"
+#define LV2_AUTOMATE_URI__end LV2_AUTOMATE_URI_PREFIX "end"
+#define LV2_AUTOMATE_URI__parameter LV2_AUTOMATE_URI_PREFIX "parameter"
+#define LV2_AUTOMATE_URI__value LV2_AUTOMATE_URI_PREFIX "value"
+
+/**
+ @}
+*/
+
+/**
+ @defgroup license License-Report
+
+ Allow for commercial LV2 to report their
+ licensing status.
+
+ @{
+*/
+
+#define LV2_PLUGINLICENSE_URI "http://harrisonconsoles.com/lv2/license"
+#define LV2_PLUGINLICENSE_PREFIX LV2_PLUGINLICENSE_URI "#"
+#define LV2_PLUGINLICENSE__interface LV2_PLUGINLICENSE_PREFIX "interface"
+
+typedef struct _LV2_License_Interface {
+ /* @return -1 if no license is needed; 0 if unlicensed, 1 if licensed */
+ int (*is_licensed)(LV2_Handle instance);
+ /* @return a string copy of the licensee name if licensed, or NULL, the caller needs to free this */
+ char* (*licensee)(LV2_Handle instance);
+ /* @return a URI identifying the plugin-bundle or plugin for which a given license is valid */
+ const char* (*product_uri)(LV2_Handle instance);
+ /* @return human readable product name for the URI */
+ const char* (*product_name)(LV2_Handle instance);
+ /* @return link to website or webstore */
+ const char* (*store_url)(LV2_Handle instance);
+} LV2_License_Interface;
+
+/**
+ @}
+*/
+
+/**
+ @defgroup plugin provided bypass
+
+ A port with the designation "processing#enable" must
+ control a plugin's internal bypass mode.
+
+ If the port value is larger than zero the plugin processes
+ normally.
+
+ If the port value is zero, the plugin is expected to bypass
+ all signals unmodified.
+
+ The plugin is responsible for providing a click-free transition
+ between the states.
+
+ (values less than zero are reserved for future use:
+ e.g click-free insert/removal of latent plugins.
+ Generally values <= 0 are to be treated as bypassed.)
+
+ lv2:designation <http://ardour.org/lv2/processing#enable> ;
+
+ @{
+*/
+
+#define LV2_PROCESSING_URI "http://ardour.org/lv2/processing"
+#define LV2_PROCESSING_URI_PREFIX LV2_PROCESSING_URI "#"
+#define LV2_PROCESSING_URI__enable LV2_PROCESSING_URI_PREFIX "enable"
+
+/**
+ @}
+*/
+
+#endif
diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h
index a4cdfcd..7f31245 100644
--- a/libs/ardour/ardour/lv2_plugin.h
+++ b/libs/ardour/ardour/lv2_plugin.h
@@ -20,6 +20,7 @@
#ifndef __ardour_lv2_plugin_h__
#define __ardour_lv2_plugin_h__
+#include <glibmm/threads.h>
#include <set>
#include <string>
#include <vector>
@@ -30,6 +31,10 @@
#include "ardour/worker.h"
#include "pbd/ringbuffer.h"
+#ifdef LV2_EXTENDED // -> needs to eventually go upstream to lv2plug.in
+#include "ardour/lv2_extensions.h"
+#endif
+
#ifndef PATH_MAX
#define PATH_MAX 1024
#endif
@@ -67,6 +72,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
uint32_t num_ports () const;
uint32_t parameter_count () const;
float default_value (uint32_t port);
+ framecnt_t max_latency () const;
framecnt_t signal_latency () const;
void set_parameter (uint32_t port, float val);
float get_parameter (uint32_t port) const;
@@ -74,6 +80,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
std::string get_parameter_docs(uint32_t which) const;
int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
uint32_t nth_parameter (uint32_t port, bool& ok) const;
+ bool get_layout (uint32_t which, UILayoutHint&) const;
+
+ IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
const void* extension_data (const char* uri) const;
@@ -91,6 +100,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
const LV2_Feature* const* features () { return _features; }
std::set<Evoral::Parameter> automatable () const;
+ virtual void set_automation_control (uint32_t, boost::shared_ptr<AutomationControl>);
void activate ();
void deactivate ();
@@ -100,6 +110,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
bool requires_fixed_sized_buffers () const;
int connect_and_run (BufferSet& bufs,
+ framepos_t start, framepos_t end, double speed,
ChanMapping in, ChanMapping out,
pframes_t nframes, framecnt_t offset);
@@ -117,6 +128,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
bool parameter_is_output (uint32_t) const;
bool parameter_is_toggled (uint32_t) const;
+ uint32_t designated_bypass_port ();
+
boost::shared_ptr<ScalePoints>
get_scale_points(uint32_t port_index) const;
@@ -151,7 +164,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
URIMap& uri_map() { return _uri_map; }
const URIMap& uri_map() const { return _uri_map; }
- int work(uint32_t size, const void* data);
+ int work(Worker& worker, uint32_t size, const void* data);
int work_response(uint32_t size, const void* data);
void set_property(uint32_t key, const Variant& value);
@@ -165,6 +178,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
void* _module;
LV2_Feature** _features;
Worker* _worker;
+ Worker* _state_worker;
framecnt_t _sample_rate;
float* _control_data;
float* _shadow_data;
@@ -182,6 +196,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
uint32_t _patch_port_out_index;
URIMap& _uri_map;
bool _no_sample_accurate_ctrl;
+ bool _can_write_automation;
+ framecnt_t _max_latency;
+ framecnt_t _current_latency;
friend const void* lv2plugin_get_port_value(const char* port_symbol,
void* user_data,
@@ -197,7 +214,11 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
PORT_SEQUENCE = 1 << 5, ///< New atom API event port
PORT_MIDI = 1 << 6, ///< Event port understands MIDI
PORT_POSITION = 1 << 7, ///< Event port understands position
- PORT_PATCHMSG = 1 << 8 ///< Event port supports patch:Message
+ PORT_PATCHMSG = 1 << 8, ///< Event port supports patch:Message
+ PORT_AUTOCTRL = 1 << 9, ///< Event port supports auto:AutomationControl
+ PORT_CTRLED = 1 << 10, ///< Port prop auto:AutomationControlled (can be self controlled)
+ PORT_CTRLER = 1 << 11, ///< Port prop auto:AutomationController (can be self set)
+ PORT_NOAUTO = 1 << 12 ///< Port don't allow to automate
} PortFlag;
typedef unsigned PortFlags;
@@ -208,6 +229,25 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
PropertyDescriptors _property_descriptors;
+ struct AutomationCtrl {
+ AutomationCtrl (const AutomationCtrl &other)
+ : ac (other.ac)
+ , guard (other.guard)
+ { }
+
+ AutomationCtrl (boost::shared_ptr<ARDOUR::AutomationControl> c)
+ : ac (c)
+ , guard (false)
+ { }
+ boost::shared_ptr<ARDOUR::AutomationControl> ac;
+ bool guard;
+ };
+
+ typedef boost::shared_ptr<AutomationCtrl> AutomationCtrlPtr;
+ typedef std::map<uint32_t, AutomationCtrlPtr> AutomationCtrlMap;
+ AutomationCtrlMap _ctrl_map;
+ AutomationCtrlPtr get_automation_control (uint32_t);
+
/// Message send to/from UI via ports
struct UIMessage {
uint32_t index;
@@ -230,6 +270,12 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
RingBuffer<uint8_t>* _to_ui;
RingBuffer<uint8_t>* _from_ui;
+ Glib::Threads::Mutex _work_mutex;
+
+#ifdef LV2_EXTENDED
+ const LV2_Inline_Display_Interface* _display_interface;
+#endif
+
typedef struct {
const void* (*extension_data) (const char* uri);
} LV2_DataAccess;
@@ -242,6 +288,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
LV2_Feature _work_schedule_feature;
LV2_Feature _options_feature;
LV2_Feature _def_state_feature;
+#ifdef LV2_EXTENDED
+ LV2_Feature _queue_draw_feature;
+#endif
// Options passed to plugin
int32_t _seq_size;
@@ -265,6 +314,11 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
void load_supported_properties(PropertyDescriptors& descs);
+#ifdef LV2_EXTENDED
+ bool has_inline_display ();
+ Plugin::Display_Image_Surface* render_inline_display (uint32_t, uint32_t);
+#endif
+
void latency_compute_run ();
std::string do_save_preset (std::string);
void do_remove_preset (std::string);
diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h
index a3bd34e..ddc1e5e 100644
--- a/libs/ardour/ardour/meter.h
+++ b/libs/ardour/ardour/meter.h
@@ -64,7 +64,7 @@ public:
void emit_configuration_changed ();
/** Compute peaks */
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
void activate () { }
void deactivate () { }
diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h
index 8593a4e..2a472e1 100644
--- a/libs/ardour/ardour/midi_buffer.h
+++ b/libs/ardour/ardour/midi_buffer.h
@@ -45,6 +45,7 @@ public:
void merge_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_offset = 0, framecnt_t src_offset = 0);
void copy(const MidiBuffer& copy);
+ void copy(MidiBuffer const * const);
bool push_back(const Evoral::MIDIEvent<TimeType>& event);
bool push_back(TimeType time, size_t size, const uint8_t* data);
diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h
index 21c67c2..ea4f178 100644
--- a/libs/ardour/ardour/midi_model.h
+++ b/libs/ardour/ardour/midi_model.h
@@ -175,8 +175,9 @@ public:
private:
struct Change {
+ Change () : sysex_id (0) {}
boost::shared_ptr<Evoral::Event<TimeType> > sysex;
- gint sysex_id;
+ gint sysex_id;
SysExDiffCommand::Property property;
TimeType old_time;
TimeType new_time;
@@ -264,7 +265,8 @@ public:
bool write_section_to(boost::shared_ptr<MidiSource> source,
const Glib::Threads::Mutex::Lock& source_lock,
Evoral::Beats begin = Evoral::MinBeats,
- Evoral::Beats end = Evoral::MaxBeats);
+ Evoral::Beats end = Evoral::MaxBeats,
+ bool offset_events = false);
// MidiModel doesn't use the normal AutomationList serialisation code
// since controller data is stored in the .mid
diff --git a/libs/ardour/ardour/midi_operator.h b/libs/ardour/ardour/midi_operator.h
index b79544e..589e930 100644
--- a/libs/ardour/ardour/midi_operator.h
+++ b/libs/ardour/ardour/midi_operator.h
@@ -23,7 +23,7 @@
#include <vector>
#include <string>
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
#include "evoral/Sequence.hpp"
class Command;
diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h
index cb07bc1..a84c464 100644
--- a/libs/ardour/ardour/midi_playlist.h
+++ b/libs/ardour/ardour/midi_playlist.h
@@ -30,12 +30,12 @@
#include "ardour/midi_state_tracker.h"
#include "ardour/note_fixer.h"
#include "ardour/playlist.h"
-#include "evoral/Beats.hpp"
#include "evoral/Note.hpp"
#include "evoral/Parameter.hpp"
namespace Evoral {
template<typename Time> class EventSink;
+class Beats;
}
namespace ARDOUR
diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h
index 250a58a..5a1dfe0 100644
--- a/libs/ardour/ardour/midi_region.h
+++ b/libs/ardour/ardour/midi_region.h
@@ -23,7 +23,7 @@
#include <vector>
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
#include "ardour/ardour.h"
#include "ardour/region.h"
@@ -61,6 +61,8 @@ class LIBARDOUR_API MidiRegion : public Region
~MidiRegion();
+ bool do_export (std::string path) const;
+
boost::shared_ptr<MidiRegion> clone (std::string path = std::string()) const;
boost::shared_ptr<MidiRegion> clone (boost::shared_ptr<MidiSource>) const;
@@ -101,7 +103,8 @@ class LIBARDOUR_API MidiRegion : public Region
boost::shared_ptr<const MidiModel> model() const;
void fix_negative_start ();
-
+ Evoral::Beats start_beats () {return _start_beats.val(); }
+ Evoral::Beats length_beats () {return _length_beats.val(); }
protected:
virtual bool can_trim_start_before_source_start () const {
@@ -115,7 +118,7 @@ class LIBARDOUR_API MidiRegion : public Region
MidiRegion (const SourceList&);
MidiRegion (boost::shared_ptr<const MidiRegion>);
- MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset);
+ MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset, const int32_t sub_num = 0);
framecnt_t _read_at (const SourceList&, Evoral::EventSink<framepos_t>& dst,
framepos_t position,
@@ -131,16 +134,17 @@ class LIBARDOUR_API MidiRegion : public Region
void recompute_at_start ();
void recompute_at_end ();
- void set_position_internal (framepos_t pos, bool allow_bbt_recompute);
- void set_length_internal (framecnt_t len);
- void set_start_internal (framecnt_t);
- void update_length_beats ();
+ void set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
+ void set_length_internal (framecnt_t len, const int32_t sub_num);
+ void set_start_internal (framecnt_t, const int32_t sub_num);
+ void trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num);
+ void update_length_beats (const int32_t sub_num);
void model_changed ();
void model_automation_state_changed (Evoral::Parameter const &);
void set_start_beats_from_start_frames ();
- void update_after_tempo_map_change ();
+ void update_after_tempo_map_change (bool send_change = true);
std::set<Evoral::Parameter> _filtered_parameters; ///< parameters that we ask our source not to return when reading
PBD::ScopedConnection _model_connection;
diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h
index 6a55398..c8b4263 100644
--- a/libs/ardour/ardour/midi_source.h
+++ b/libs/ardour/ardour/midi_source.h
@@ -63,6 +63,19 @@ class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_sha
Evoral::Beats begin = Evoral::MinBeats,
Evoral::Beats end = Evoral::MaxBeats);
+ /** Export the midi data in the given time range to another MidiSource
+ * \param newsrc MidiSource to which data will be written. Should be a
+ * new, empty source. If it already has contents, the results are
+ * undefined. Source must be writable.
+ * \param begin time of earliest event that can be written.
+ * \param end time of latest event that can be written.
+ * \return zero on success, non-zero if the write failed for any reason.
+ */
+ int export_write_to (const Lock& lock,
+ boost::shared_ptr<MidiSource> newsrc,
+ Evoral::Beats begin,
+ Evoral::Beats end);
+
/** Read the data in a given time range from the MIDI source.
* All time stamps in parameters are in audio frames (even if the source has tempo time).
* \param dst Ring buffer where read events are written.
@@ -79,7 +92,9 @@ class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_sha
framecnt_t cnt,
MidiStateTracker* tracker,
MidiChannelFilter* filter,
- const std::set<Evoral::Parameter>& filtered) const;
+ const std::set<Evoral::Parameter>& filtered,
+ double beat,
+ double start_beat) const;
/** Write data from a MidiRingBuffer to this source.
* @param source Source to read from.
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index ed13832..f756812 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -37,7 +37,7 @@ class Session;
class LIBARDOUR_API MidiTrack : public Track
{
public:
- MidiTrack (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal);
+ MidiTrack (Session&, std::string name, TrackMode m = Normal);
~MidiTrack ();
int init ();
@@ -50,8 +50,9 @@ public:
boost::shared_ptr<Diskstream> create_diskstream ();
void set_diskstream (boost::shared_ptr<Diskstream>);
- void set_record_enabled (bool yn, PBD::Controllable::GroupControlDisposition);
- void set_record_safe (bool yn, PBD::Controllable::GroupControlDisposition);
+
+ bool can_be_record_enabled ();
+ bool can_be_record_safe ();
DataType data_type () const {
return DataType::MIDI;
@@ -89,14 +90,12 @@ public:
, _route (route)
{}
- void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
- void set_value_unchecked (double);
bool writable() const { return true; }
MidiTrack* _route;
private:
- void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+ void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
};
virtual void set_parameter_automation_state (Evoral::Parameter param, AutoState);
@@ -133,7 +132,6 @@ public:
PBD::Signal1<void, boost::weak_ptr<MidiSource> > DataRecorded;
boost::shared_ptr<MidiBuffer> get_gui_feed_buffer () const;
- void set_monitoring (MonitorChoice, PBD::Controllable::GroupControlDisposition);
MonitorState monitoring_state () const;
void set_input_active (bool);
@@ -144,6 +142,7 @@ protected:
XMLNode& state (bool full);
void act_on_mute ();
+ void monitoring_changed (bool, PBD::Controllable::GroupControlDisposition);
private:
MidiRingBuffer<framepos_t> _immediate_events;
diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h
index 2f0f7d3..88ea021 100644
--- a/libs/ardour/ardour/midi_ui.h
+++ b/libs/ardour/ardour/midi_ui.h
@@ -62,7 +62,7 @@ class LIBARDOUR_API MidiControlUI : public AbstractUI<MidiUIRequest>
private:
ARDOUR::Session& _session;
- bool midi_input_handler (Glib::IOCondition, boost::shared_ptr<AsyncMIDIPort>);
+ bool midi_input_handler (Glib::IOCondition, boost::weak_ptr<AsyncMIDIPort>);
void reset_ports ();
void clear_ports ();
diff --git a/libs/ardour/ardour/monitor_control.h b/libs/ardour/ardour/monitor_control.h
new file mode 100644
index 0000000..b185172
--- /dev/null
+++ b/libs/ardour/ardour/monitor_control.h
@@ -0,0 +1,58 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_monitor_control_h__
+#define __ardour_monitor_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/dynamic_bitset.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/monitorable.h"
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API MonitorControl : public SlavableAutomationControl
+{
+ public:
+ MonitorControl (Session& session, std::string const & name, Monitorable& m);
+ ~MonitorControl() {}
+
+ MonitorChoice monitoring_choice() const { return static_cast<MonitorChoice> ((int)get_value()); }
+ MonitorState monitoring_state () const { return _monitorable.monitoring_state(); }
+
+ int set_state (XMLNode const&, int);
+ XMLNode& get_state ();
+
+ protected:
+ void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+ private:
+ Monitorable& _monitorable;
+ MonitorChoice _monitoring;
+};
+
+} /* namespace */
+
+#endif /* __libardour_monitor_control_h__ */
diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h
index e971d0a..d369cb9 100644
--- a/libs/ardour/ardour/monitor_processor.h
+++ b/libs/ardour/ardour/monitor_processor.h
@@ -54,11 +54,11 @@ public:
/* Controllable API */
- void set_value (double v, PBD::Controllable::GroupControlDisposition group_override) {
+ void set_value (double v, PBD::Controllable::GroupControlDisposition gcd) {
T newval = (T) v;
if (newval != _value) {
_value = std::max (_lower, std::min (_upper, newval));
- Changed(); /* EMIT SIGNAL */
+ Changed (true, gcd); /* EMIT SIGNAL */
}
}
@@ -84,7 +84,7 @@ public:
MPControl& operator=(const T& v) {
if (v != _value) {
_value = std::max (_lower, std::min (_upper, v));
- Changed (); /* EMIT SIGNAL */
+ Changed (true, PBD::Controllable::UseGroup); /* EMIT SIGNAL */
}
return *this;
}
@@ -127,7 +127,7 @@ public:
bool display_to_user() const;
- void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t /*nframes*/, bool /*result_required*/);
+ void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t /*nframes*/, bool /*result_required*/);
XMLNode& state (bool full);
int set_state (const XMLNode&, int /* version */);
diff --git a/libs/ardour/ardour/monitorable.h b/libs/ardour/ardour/monitorable.h
new file mode 100644
index 0000000..03968e6
--- /dev/null
+++ b/libs/ardour/ardour/monitorable.h
@@ -0,0 +1,35 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_monitorable_h__
+#define __ardour_monitorable_h__
+
+#include "ardour/types.h"
+
+namespace ARDOUR {
+
+class Monitorable {
+ public:
+ virtual ~Monitorable() {}
+
+ virtual MonitorState monitoring_state() const = 0;
+};
+
+} /* namespace */
+
+#endif /* __ardour_monitorable_h__ */
diff --git a/libs/ardour/ardour/mute_control.h b/libs/ardour/ardour/mute_control.h
new file mode 100644
index 0000000..909f0cb
--- /dev/null
+++ b/libs/ardour/ardour/mute_control.h
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_mute_control_h__
+#define __ardour_mute_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+
+#include "ardour/mute_master.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+class Muteable;
+
+class LIBARDOUR_API MuteControl : public SlavableAutomationControl
+{
+ public:
+ MuteControl (Session& session, std::string const& name, Muteable&);
+
+ double get_value () const;
+
+ /* Export additional API so that objects that only get access
+ * to a Controllable/AutomationControl can do more fine-grained
+ * operations with respect to mute. Obviously, they would need
+ * to dynamic_cast<MuteControl> first.
+ *
+ * Mute state is not representable by a single scalar value,
+ * so set_value() and get_value() is not enough.
+ *
+ * This means that the Controllable is technically
+ * asymmetric. It is possible to call ::set_value (0.0) to
+ * turn off mute, and then call ::get_value() and get a
+ * return of 1.0 because the control is affected by
+ * upstream/downstream or a master.
+ */
+
+ bool muted () const;
+ bool muted_by_self () const;
+ bool muted_by_masters () const;
+ bool muted_by_self_or_masters () const {
+ return muted_by_self() || muted_by_masters ();
+ }
+
+ bool muted_by_others_soloing () const;
+
+ void set_mute_points (MuteMaster::MutePoint);
+ MuteMaster::MutePoint mute_points () const;
+
+ void automation_run (framepos_t start, pframes_t nframes);
+
+ protected:
+ void master_changed (bool, PBD::Controllable::GroupControlDisposition, boost::shared_ptr<AutomationControl>);
+ void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+ void pre_remove_master (boost::shared_ptr<AutomationControl>);
+ void post_add_master (boost::shared_ptr<AutomationControl>);
+
+ private:
+ Muteable& _muteable;
+};
+
+} /* namespace */
+
+#endif /* __libardour_mute_control_h__ */
diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h
index d88cbdc..f73ce09 100644
--- a/libs/ardour/ardour/mute_master.h
+++ b/libs/ardour/ardour/mute_master.h
@@ -20,16 +20,20 @@
#ifndef __ardour_mute_master_h__
#define __ardour_mute_master_h__
-#include "evoral/Parameter.hpp"
+#include <string>
+
#include "pbd/signals.h"
#include "pbd/stateful.h"
-#include <string>
+
+#include "evoral/Parameter.hpp"
#include "ardour/session_handle.h"
+#include "ardour/types.h"
namespace ARDOUR {
class Session;
+class Muteable;
class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful
{
@@ -44,12 +48,14 @@ class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful
static const MutePoint AllPoints;
- MuteMaster (Session& s, const std::string& name);
+ MuteMaster (Session& s, Muteable&, const std::string& name);
~MuteMaster() {}
bool muted_by_self () const { return _muted_by_self && (_mute_point != MutePoint (0)); }
bool muted_by_self_at (MutePoint mp) const { return _muted_by_self && (_mute_point & mp); }
- bool muted_by_others_at (MutePoint mp) const;
+ bool muted_by_others_soloing_at (MutePoint mp) const;
+ bool muted_by_masters () const { return _muted_by_masters && (_mute_point != MutePoint (0)); }
+ bool muted_by_masters_at (MutePoint mp) const { return _muted_by_masters && (_mute_point & mp); }
gain_t mute_gain_at (MutePoint) const;
@@ -64,19 +70,22 @@ class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful
void set_soloed_by_self (bool yn) { _soloed_by_self = yn; }
void set_soloed_by_others (bool yn) { _soloed_by_others = yn; }
- void set_solo_ignore (bool yn) { _solo_ignore = yn; }
+
+ void set_muted_by_masters (bool);
PBD::Signal0<void> MutePointChanged;
XMLNode& get_state();
int set_state(const XMLNode&, int version);
+ static const std::string xml_node_name;
private:
- volatile MutePoint _mute_point;
- volatile bool _muted_by_self;
- volatile bool _soloed_by_self;
- volatile bool _soloed_by_others;
- volatile bool _solo_ignore;
+ Muteable* _muteable;
+ MutePoint _mute_point;
+ bool _muted_by_self;
+ bool _soloed_by_self;
+ bool _soloed_by_others;
+ bool _muted_by_masters;
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/muteable.h b/libs/ardour/ardour/muteable.h
new file mode 100644
index 0000000..adc4259
--- /dev/null
+++ b/libs/ardour/ardour/muteable.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_muteable_h__
+#define __ardour_muteable_h__
+
+#include <boost/shared_ptr.hpp>
+
+#include "pbd/signals.h"
+
+namespace ARDOUR {
+
+class MuteMaster;
+class Session;
+
+class Muteable {
+ public:
+ Muteable (Session&, std::string const &name);
+ virtual ~Muteable() {}
+
+ virtual bool can_be_muted_by_others () const = 0;
+ virtual void act_on_mute () {}
+ virtual bool muted_by_others_soloing () const = 0;
+
+ boost::shared_ptr<MuteMaster> mute_master() const {
+ return _mute_master;
+ }
+
+ PBD::Signal0<void> mute_points_changed;
+
+ protected:
+ boost::shared_ptr<MuteMaster> _mute_master;
+};
+
+} /* namespace */
+
+#endif /* __ardour_muteable_h__ */
diff --git a/libs/ardour/ardour/onset_detector.h b/libs/ardour/ardour/onset_detector.h
index 40eac9b..a77b84f 100644
--- a/libs/ardour/ardour/onset_detector.h
+++ b/libs/ardour/ardour/onset_detector.h
@@ -37,6 +37,7 @@ public:
void set_silence_threshold (float);
void set_peak_threshold (float);
+ void set_minioi (float);
void set_function (int);
int run (const std::string& path, Readable*, uint32_t channel, AnalysisFeatureList& results);
diff --git a/libs/ardour/ardour/pan_controllable.h b/libs/ardour/ardour/pan_controllable.h
index 85a4efe..82aa60f 100644
--- a/libs/ardour/ardour/pan_controllable.h
+++ b/libs/ardour/ardour/pan_controllable.h
@@ -47,12 +47,11 @@ class LIBARDOUR_API PanControllable : public AutomationControl
{}
double lower () const;
- void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- void set_value_unchecked (double);
+ std::string get_user_string () const;
private:
Pannable* owner;
- void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+ void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
};
} // namespace
diff --git a/libs/ardour/ardour/pannable.h b/libs/ardour/ardour/pannable.h
index 62c9cd1..fd8ffe6 100644
--- a/libs/ardour/ardour/pannable.h
+++ b/libs/ardour/ardour/pannable.h
@@ -68,7 +68,7 @@ class LIBARDOUR_API Pannable : public PBD::Stateful, public Automatable, public
return ((_auto_state & Write) || ((_auto_state & Touch) && touching()));
}
- std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
void start_touch (double when);
void stop_touch (bool mark, double when);
diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h
index 1838fb5..48f9ee1 100644
--- a/libs/ardour/ardour/panner.h
+++ b/libs/ardour/ardour/panner.h
@@ -110,7 +110,7 @@ public:
virtual std::set<Evoral::Parameter> what_can_be_automated() const;
virtual std::string describe_parameter (Evoral::Parameter);
- virtual std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ virtual std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
bool touching() const;
diff --git a/libs/ardour/ardour/parameter_descriptor.h b/libs/ardour/ardour/parameter_descriptor.h
index 9d219d1..9a8c559 100644
--- a/libs/ardour/ardour/parameter_descriptor.h
+++ b/libs/ardour/ardour/parameter_descriptor.h
@@ -43,6 +43,8 @@ struct LIBARDOUR_API ParameterDescriptor : public Evoral::ParameterDescriptor
HZ, ///< Frequency in Hertz
};
+ static std::string midi_note_name (uint8_t);
+
ParameterDescriptor(const Evoral::Parameter& parameter);
ParameterDescriptor();
diff --git a/libs/ardour/ardour/phase_control.h b/libs/ardour/ardour/phase_control.h
new file mode 100644
index 0000000..0693c8e
--- /dev/null
+++ b/libs/ardour/ardour/phase_control.h
@@ -0,0 +1,71 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_phase_control_h__
+#define __ardour_phase_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/dynamic_bitset.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+/* Note that PhaseControl is not Slavable. There's no particular reason for
+ * this, it could be changed at any time. But it seems useless.
+ */
+
+class LIBARDOUR_API PhaseControl : public AutomationControl
+{
+ public:
+ PhaseControl (Session& session, std::string const & name);
+
+ /* There are two approaches to designing/using a PhaseControl. One is
+ * to have one such control for every channel of the control's
+ * owner. The other is to have a single control which manages all
+ * channels. For now (Spring 2016) we're using the second design.
+ */
+
+ void set_phase_invert (uint32_t, bool yn);
+ void set_phase_invert (boost::dynamic_bitset<>);
+ bool inverted (uint32_t chn) const { return _phase_invert[chn]; }
+
+ bool none () const { return !_phase_invert.any(); }
+ bool any() const { return _phase_invert.any(); }
+ uint64_t count() const { return _phase_invert.count(); }
+ uint64_t size() const { return _phase_invert.size(); }
+ void resize (uint32_t);
+
+ int set_state (XMLNode const&, int);
+ XMLNode& get_state ();
+
+ protected:
+ void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+ private:
+ boost::dynamic_bitset<> _phase_invert;
+};
+
+} /* namespace */
+
+#endif /* __libardour_phase_control_h__ */
diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h
index e5bdfd9..04615ac 100644
--- a/libs/ardour/ardour/playlist.h
+++ b/libs/ardour/ardour/playlist.h
@@ -38,7 +38,7 @@
#include "pbd/sequence_property.h"
#include "pbd/stacktrace.h"
-#include "evoral/types.hpp"
+#include "evoral/Range.hpp"
#include "ardour/ardour.h"
#include "ardour/region.h"
@@ -128,15 +128,14 @@ public:
/* Editing operations */
- void add_region (boost::shared_ptr<Region>, framepos_t position, float times = 1, bool auto_partition = false);
+ void add_region (boost::shared_ptr<Region>, framepos_t position, float times = 1, bool auto_partition = false, const int32_t sub_num = 0);
void remove_region (boost::shared_ptr<Region>);
- void remove_region_by_source (boost::shared_ptr<Source>);
void get_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
void get_region_list_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
void get_source_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
void replace_region (boost::shared_ptr<Region> old, boost::shared_ptr<Region> newr, framepos_t pos);
- void split_region (boost::shared_ptr<Region>, framepos_t position);
- void split (framepos_t at);
+ void split_region (boost::shared_ptr<Region>, framepos_t position, const int32_t sub_num);
+ void split (framepos_t at, const int32_t sub_num);
void shift (framepos_t at, frameoffset_t distance, bool move_intersected, bool ignore_music_glue);
void partition (framepos_t start, framepos_t end, bool cut = false);
void duplicate (boost::shared_ptr<Region>, framepos_t position, float times);
@@ -162,9 +161,10 @@ public:
boost::shared_ptr<Playlist> cut (std::list<AudioRange>&, bool result_is_hidden = true);
boost::shared_ptr<Playlist> copy (std::list<AudioRange>&, bool result_is_hidden = true);
- int paste (boost::shared_ptr<Playlist>, framepos_t position, float times);
+ int paste (boost::shared_ptr<Playlist>, framepos_t position, float times, const int32_t sub_num);
- const RegionListProperty& region_list () const { return regions; }
+ const RegionListProperty& region_list_property () const { return regions; }
+ boost::shared_ptr<RegionList> region_list();
boost::shared_ptr<RegionList> regions_at (framepos_t frame);
uint32_t count_regions_at (framepos_t) const;
@@ -180,7 +180,8 @@ public:
bool region_is_shuffle_constrained (boost::shared_ptr<Region>);
bool has_region_at (framepos_t const) const;
- bool uses_source (boost::shared_ptr<const Source> src) const;
+ bool uses_source (boost::shared_ptr<const Source> src, bool shallow = false) const;
+ void deep_sources (std::set<boost::shared_ptr<Source> >&) const;
framepos_t find_next_transient (framepos_t position, int dir);
@@ -361,7 +362,7 @@ public:
virtual XMLNode& state (bool);
- bool add_region_internal (boost::shared_ptr<Region>, framepos_t position);
+ bool add_region_internal (boost::shared_ptr<Region>, framepos_t position, const int32_t sub_num = 0);
int remove_region_internal (boost::shared_ptr<Region>);
void copy_regions (RegionList&) const;
@@ -379,7 +380,7 @@ public:
void begin_undo ();
void end_undo ();
- void _split_region (boost::shared_ptr<Region>, framepos_t position);
+ void _split_region (boost::shared_ptr<Region>, framepos_t position, const int32_t sub_num);
typedef std::pair<boost::shared_ptr<Region>, boost::shared_ptr<Region> > TwoRegions;
diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h
index 44090c3..df4b512 100644
--- a/libs/ardour/ardour/plugin.h
+++ b/libs/ardour/ardour/plugin.h
@@ -22,6 +22,7 @@
#include <boost/shared_ptr.hpp>
#include <string>
+#include <set>
#include "pbd/statefuldestructible.h"
#include "pbd/controllable.h"
@@ -49,11 +50,21 @@ class BufferSet;
class PluginInsert;
class Plugin;
class PluginInfo;
+class AutomationControl;
typedef boost::shared_ptr<Plugin> PluginPtr;
typedef boost::shared_ptr<PluginInfo> PluginInfoPtr;
typedef std::list<PluginInfoPtr> PluginInfoList;
-
+typedef std::set<uint32_t> PluginOutputConfiguration;
+
+/** A plugin is an external module (usually 3rd party provided) loaded into Ardour
+ * for the purpose of digital signal processing.
+ *
+ * This class provides an abstraction for methords provided by
+ * all supported plugin standards such as presets, name, parameters etc.
+ *
+ * Plugins are not used directly in Ardour but always wrapped by a PluginInsert.
+ */
class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
{
public:
@@ -77,6 +88,18 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
virtual std::string get_docs () const { return ""; }
virtual std::string get_parameter_docs (uint32_t /*which*/) const { return ""; }
+ struct UILayoutHint {
+ UILayoutHint ()
+ : x0(-1), x1(-1), y0(-1), y1(-1), knob(false) {}
+ int x0;
+ int x1;
+ int y0;
+ int y1;
+ bool knob;
+ };
+
+ virtual bool get_layout (uint32_t which, UILayoutHint&) const { return false; }
+
virtual int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const = 0;
virtual uint32_t nth_parameter (uint32_t which, bool& ok) const = 0;
virtual void activate () = 0;
@@ -84,10 +107,13 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
virtual void flush () { deactivate(); activate(); }
virtual int set_block_size (pframes_t nframes) = 0;
+ virtual bool requires_fixed_sized_buffers() const { return false; }
+ virtual bool inplace_broken() const { return false; }
virtual int connect_and_run (BufferSet& bufs,
- ChanMapping in, ChanMapping out,
- pframes_t nframes, framecnt_t offset);
+ framepos_t start, framepos_t end, double speed,
+ ChanMapping in, ChanMapping out,
+ pframes_t nframes, framecnt_t offset);
virtual std::set<Evoral::Parameter> automatable() const = 0;
virtual std::string describe_parameter (Evoral::Parameter) = 0;
@@ -99,6 +125,27 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
virtual bool parameter_is_input(uint32_t) const = 0;
virtual bool parameter_is_output(uint32_t) const = 0;
+ virtual uint32_t designated_bypass_port () { return UINT32_MAX; }
+
+ struct LIBARDOUR_API IOPortDescription {
+ public:
+ IOPortDescription (const std::string& n)
+ : name (n)
+ , is_sidechain (false)
+ {}
+ IOPortDescription (const IOPortDescription &other)
+ : name (other.name)
+ , is_sidechain (other.is_sidechain)
+ {}
+ std::string name;
+ bool is_sidechain;
+ };
+
+ virtual IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
+ virtual PluginOutputConfiguration possible_output () const;
+
+ virtual void set_automation_control (uint32_t /*port_index*/, boost::shared_ptr<ARDOUR::AutomationControl>) { }
+
virtual boost::shared_ptr<ScalePoints> get_scale_points(uint32_t /*port_index*/) const {
return boost::shared_ptr<ScalePoints>();
}
@@ -107,6 +154,17 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
void realtime_locate ();
void monitoring_changed ();
+ typedef struct {
+ unsigned char *data;
+ int width;
+ int height;
+ int stride;
+ } Display_Image_Surface;
+
+ virtual bool has_inline_display () { return false; }
+ virtual Display_Image_Surface* render_inline_display (uint32_t, uint32_t) { return NULL; }
+ PBD::Signal0<void> QueueDraw;
+
struct PresetRecord {
PresetRecord () : valid (false) {}
PresetRecord (const std::string& u, const std::string& l, bool s = true) : uri (u), label (l), user (s), valid (true) {}
@@ -167,6 +225,9 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
return 0;
}
+ /** the max possible latency a plugin will have */
+ virtual framecnt_t max_latency () const { return 0; } // TODO = 0, require implementation
+
/** Emitted when a preset is added or removed, respectively */
PBD::Signal0<void> PresetAdded;
PBD::Signal0<void> PresetRemoved;
@@ -194,7 +255,7 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
/* specific types of plugins can overload this. As of September 2008, only
AUPlugin does this.
*/
- virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return false; }
+ virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/, ChanCount* imprecise = 0) { return false; }
virtual ChanCount output_streams() const;
virtual ChanCount input_streams() const;
@@ -334,6 +395,7 @@ class LIBARDOUR_API PluginInfo {
virtual PluginPtr load (Session& session) = 0;
virtual bool is_instrument() const;
+ virtual bool needs_midi_input() const { return is_instrument (); }
virtual bool in_category (const std::string &) const { return false; }
virtual std::vector<Plugin::PresetRecord> get_presets (bool user_only) const = 0;
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index ffa55b9..d38523a 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -27,9 +27,14 @@
#include "ardour/ardour.h"
#include "ardour/libardour_visibility.h"
+#include "ardour/chan_mapping.h"
+#include "ardour/fixed_delay.h"
+#include "ardour/io.h"
#include "ardour/types.h"
#include "ardour/parameter_descriptor.h"
+#include "ardour/plugin.h"
#include "ardour/processor.h"
+#include "ardour/sidechain.h"
#include "ardour/automation_control.h"
class XMLNode;
@@ -56,37 +61,128 @@ class LIBARDOUR_API PluginInsert : public Processor
void update_id (PBD::ID);
void set_state_dir (const std::string& d = "");
- void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
- void silence (framecnt_t nframes);
+ void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
+ void silence (framecnt_t nframes, framepos_t start_frame);
void activate ();
void deactivate ();
void flush ();
+ void enable (bool yn);
+ bool enabled () const;
+ bool bypassable () const;
+
bool reset_parameters_to_default ();
bool can_reset_all_parameters ();
int set_block_size (pframes_t nframes);
+ ChanMapping input_map (uint32_t num) const {
+ if (num < _in_map.size()) {
+ return _in_map.find (num)->second;
+ } else {
+ return ChanMapping ();
+ }
+ }
+
+ ChanMapping output_map (uint32_t num) const {
+ if (num < _out_map.size()) {
+ return _out_map.find (num)->second;
+ } else {
+ return ChanMapping ();
+ }
+ }
+
+ ChanMapping thru_map () const {
+ return _thru_map;
+ }
+
+ bool pre_seed (const ChanCount&, const ChanCount&, const ChanMapping&, const ChanMapping&, const ChanMapping&);
+
+ ChanMapping input_map () const; ///< combined (all instances) input map
+ ChanMapping no_sc_input_map () const; ///< combined (all instances) input map w/o sidechain sinks
+ ChanMapping output_map () const; ///< combined (all instances) output map
+ bool has_midi_bypass () const;
+ bool has_midi_thru () const;
+ bool inplace () const { return ! _no_inplace; }
+
+#ifdef MIXBUS
+ bool is_channelstrip () const;
+#endif
+
+ void set_input_map (uint32_t, ChanMapping);
+ void set_output_map (uint32_t, ChanMapping);
+ void set_thru_map (ChanMapping);
+ bool reset_map (bool emit = true);
+ bool sanitize_maps ();
+ bool check_inplace ();
+
+ // these are ports visible on the outside
ChanCount output_streams() const;
ChanCount input_streams() const;
+ ChanCount internal_streams() const; // with side-chain
+
+ // actual ports of all plugins.
+ // n * natural_i/o or result of reconfigurable i/o
+ ChanCount internal_output_streams() const;
+ ChanCount internal_input_streams() const;
+
+ // a single plugin's internal i/o
ChanCount natural_output_streams() const;
ChanCount natural_input_streams() const;
- bool set_count (uint32_t num);
- uint32_t get_count () const { return _plugins.size(); }
+ /** plugin ports marked as sidechain */
+ ChanCount sidechain_input_pins() const;
+
+ /** Plugin-Insert IO sidechain ports */
+ ChanCount sidechain_input_ports() const {
+ if (_sidechain) {
+ return _sidechain->input ()->n_ports ();
+ } else {
+ return ChanCount ();
+ }
+ }
+
+ const ChanCount& required_buffers () const { return _required_buffers; }
+ const ChanCount& preset_out () const { return _preset_out; }
+
+ // allow to override output_streams(), implies "Custom Mode"
+
+ // only the owning route may call these (with process lock held)
+ // route is not a friend class, it owns us
+ bool set_count (uint32_t num);
+ void set_sinks (const ChanCount&); // reconfigurable I/O ONLY
+ void set_outputs (const ChanCount&);
+ void set_strict_io (bool b);
+ void set_custom_cfg (bool b);
+ bool set_preset_out (const ChanCount&);
+ bool add_sidechain (uint32_t n_audio = 1, uint32_t n_midi = 0);
+ bool del_sidechain ();
+ void set_sidechain_latency (uint32_t, uint32_t);
+ boost::shared_ptr<SideChain> sidechain () const { return _sidechain; }
+ // end C++ class slavery!
+
+ uint32_t get_count () const { return _plugins.size(); }
+ bool strict_io () const { return _strict_io; }
+ bool custom_cfg () const { return _custom_cfg; }
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out);
bool has_no_inputs() const;
bool has_no_audio_inputs() const;
- bool is_midi_instrument() const;
+ bool needs_midi_input() const;
+ bool has_output_presets (
+ ChanCount in = ChanCount (DataType::MIDI, 1),
+ ChanCount out = ChanCount (DataType::AUDIO, 2)
+ );
void realtime_handle_transport_stopped ();
void realtime_locate ();
void monitoring_changed ();
+ bool load_preset (Plugin::PresetRecord);
+
/** A control that manipulates a plugin parameter (control port). */
struct PluginControl : public AutomationControl
{
@@ -95,15 +191,13 @@ class LIBARDOUR_API PluginInsert : public Processor
const ParameterDescriptor& desc,
boost::shared_ptr<AutomationList> list=boost::shared_ptr<AutomationList>());
- void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
- void set_value_unchecked (double);
double get_value (void) const;
void catch_up_with_external_value (double val);
XMLNode& get_state();
private:
PluginInsert* _plugin;
- void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+ void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
};
/** A control that manipulates a plugin property (message). */
@@ -114,10 +208,10 @@ class LIBARDOUR_API PluginInsert : public Processor
const ParameterDescriptor& desc,
boost::shared_ptr<AutomationList> list=boost::shared_ptr<AutomationList>());
- void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
- void set_value_unchecked (double);
double get_value (void) const;
XMLNode& get_state();
+ protected:
+ void actually_set_value (double value, PBD::Controllable::GroupControlDisposition);
private:
PluginInsert* _plugin;
@@ -132,6 +226,19 @@ class LIBARDOUR_API PluginInsert : public Processor
}
}
+ framecnt_t plugin_latency () const;
+
+ bool has_sidechain () const {
+ return _sidechain ? true : false;
+ }
+
+ boost::shared_ptr<IO> sidechain_input () const {
+ if (_sidechain) {
+ return _sidechain->input ();
+ }
+ return boost::shared_ptr<IO> ();
+ }
+
PluginType type ();
std::string describe_parameter (Evoral::Parameter param);
@@ -142,14 +249,23 @@ class LIBARDOUR_API PluginInsert : public Processor
void collect_signal_for_analysis (framecnt_t nframes);
+ bool strict_io_configured () const {
+ return _match.strict_io;
+ }
+
bool splitting () const {
return _match.method == Split;
}
- void configured_io (ChanCount &in, ChanCount &out) { in = _configured_in; out = _configured_out; }
+ void configured_io (ChanCount &in, ChanCount &out) const {
+ in = _configured_in;
+ out = _configured_out;
+ }
PBD::Signal2<void,BufferSet*, BufferSet*> AnalysisDataGathered;
PBD::Signal0<void> PluginIoReConfigure;
+ PBD::Signal0<void> PluginMapChanged;
+ PBD::Signal0<void> PluginConfigChanged;
/** Enumeration of the ways in which we can match our insert's
* IO to that of the plugin(s).
@@ -164,19 +280,38 @@ class LIBARDOUR_API PluginInsert : public Processor
Hide, ///< we `hide' some of the plugin's inputs by feeding them silence
};
+ /** Description of how we can match our plugin's IO to our own insert IO */
+ struct Match {
+ Match () : method (Impossible), plugins (0), strict_io (false), custom_cfg (false) {}
+ Match (MatchingMethod m, int32_t p,
+ bool strict = false, bool custom = false, ChanCount h = ChanCount ())
+ : method (m), plugins (p), hide (h), strict_io (strict), custom_cfg (custom) {}
+
+ MatchingMethod method; ///< method to employ
+ int32_t plugins; ///< number of copies of the plugin that we need
+ ChanCount hide; ///< number of channels to hide
+ bool strict_io; ///< force in == out
+ bool custom_cfg; ///< custom config (if not strict)
+ };
+
private:
/* disallow copy construction */
PluginInsert (const PluginInsert&);
void parameter_changed_externally (uint32_t, float);
- void set_parameter (Evoral::Parameter param, float val);
+ void set_parameter (Evoral::Parameter param, float val);
float default_parameter_value (const Evoral::Parameter& param);
typedef std::vector<boost::shared_ptr<Plugin> > Plugins;
Plugins _plugins;
+ boost::shared_ptr<SideChain> _sidechain;
+ uint32_t _sc_playback_latency;
+ uint32_t _sc_capture_latency;
+ uint32_t _plugin_signal_latency;
+
boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
framecnt_t _signal_analysis_collected_nframes;
@@ -185,41 +320,62 @@ class LIBARDOUR_API PluginInsert : public Processor
BufferSet _signal_analysis_inputs;
BufferSet _signal_analysis_outputs;
- ChanCount midi_bypass;
+ FixedDelay _delaybuffers;
ChanCount _configured_in;
+ ChanCount _configured_internal; // with side-chain
ChanCount _configured_out;
-
- /** Description of how we can match our plugin's IO to our own insert IO */
- struct Match {
- Match () : method (Impossible), plugins (0) {}
- Match (MatchingMethod m, int32_t p, ChanCount h = ChanCount ()) : method (m), plugins (p), hide (h) {}
-
- MatchingMethod method; ///< method to employ
- int32_t plugins; ///< number of copies of the plugin that we need
- ChanCount hide; ///< number of channels to hide
- };
-
- Match private_can_support_io_configuration (ChanCount const &, ChanCount &);
+ ChanCount _custom_out;
+ ChanCount _custom_sinks;
+ ChanCount _preset_out;
+ ChanCount _cached_sidechain_pins;
+ ChanCount _required_buffers;
+
+ bool _configured;
+ bool _no_inplace;
+ bool _strict_io;
+ bool _custom_cfg;
+ bool _maps_from_state;
+ bool _mapping_changed;
+
+ Match private_can_support_io_configuration (ChanCount const &, ChanCount &) const;
+ Match internal_can_support_io_configuration (ChanCount const &, ChanCount &) const;
+ Match automatic_can_support_io_configuration (ChanCount const &, ChanCount &) const;
/** details of the match currently being used */
Match _match;
- void automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes);
- void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0);
+ typedef std::map <uint32_t, ARDOUR::ChanMapping> PinMappings;
+ PinMappings _in_map;
+ PinMappings _out_map;
+ ChanMapping _thru_map; // out-idx <= in-idx
+
+ void automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes);
+ void connect_and_run (BufferSet& bufs, framepos_t start, framecnt_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto);
+ void bypass (BufferSet& bufs, pframes_t nframes);
+ void inplace_silence_unconnected (BufferSet&, const PinMappings&, framecnt_t nframes, framecnt_t offset) const;
void create_automatable_parameters ();
void control_list_automation_state_changed (Evoral::Parameter, AutoState);
void set_parameter_state_2X (const XMLNode& node, int version);
void set_control_ids (const XMLNode&, int version);
+ void enable_changed ();
+ void bypassable_changed ();
+
boost::shared_ptr<Plugin> plugin_factory (boost::shared_ptr<Plugin>);
void add_plugin (boost::shared_ptr<Plugin>);
void start_touch (uint32_t param_id);
void end_touch (uint32_t param_id);
+
+ void latency_changed ();
+ bool _latency_changed;
+ uint32_t _bypass_port;
};
} // namespace ARDOUR
+std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m);
+
#endif /* __ardour_plugin_insert_h__ */
diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h
index e25a268..1a92543 100644
--- a/libs/ardour/ardour/plugin_manager.h
+++ b/libs/ardour/ardour/plugin_manager.h
@@ -50,6 +50,7 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
ARDOUR::PluginInfoList &ladspa_plugin_info ();
ARDOUR::PluginInfoList &lv2_plugin_info ();
ARDOUR::PluginInfoList &au_plugin_info ();
+ ARDOUR::PluginInfoList &lua_plugin_info ();
void refresh (bool cache_only = false);
void cancel_plugin_scan();
@@ -112,6 +113,7 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
ARDOUR::PluginInfoList* _ladspa_plugin_info;
ARDOUR::PluginInfoList* _lv2_plugin_info;
ARDOUR::PluginInfoList* _au_plugin_info;
+ ARDOUR::PluginInfoList* _lua_plugin_info;
std::map<uint32_t, std::string> rdf_type;
@@ -122,6 +124,8 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
bool _cancel_timeout;
void ladspa_refresh ();
+ void lua_refresh ();
+ void lua_refresh_cb ();
void windows_vst_refresh (bool cache_only = false);
void lxvst_refresh (bool cache_only = false);
@@ -146,6 +150,7 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
std::string get_ladspa_category (uint32_t id);
std::vector<uint32_t> ladspa_plugin_whitelist;
+ PBD::ScopedConnection lua_refresh_connection;
Glib::Threads::Mutex _lock;
static PluginManager* _instance; // singleton
diff --git a/libs/ardour/ardour/plugin_types.h b/libs/ardour/ardour/plugin_types.h
index e0dd660..d997e28 100644
--- a/libs/ardour/ardour/plugin_types.h
+++ b/libs/ardour/ardour/plugin_types.h
@@ -28,6 +28,7 @@ namespace ARDOUR {
LV2,
Windows_VST,
LXVST,
+ Lua,
};
}
diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h
index 97f8a4e..619b8ba 100644
--- a/libs/ardour/ardour/port.h
+++ b/libs/ardour/ardour/port.h
@@ -57,11 +57,12 @@ public:
/** @return Port human readable name */
std::string pretty_name (bool fallback_to_name = false) const;
+ bool set_pretty_name (const std::string&);
int set_name (std::string const &);
/** @return flags */
- PortFlags flags () const {
+ PortFlags flags () const {
return _flags;
}
@@ -98,9 +99,9 @@ public:
bool last_monitor() const { return _last_monitor; }
void set_last_monitor (bool yn) { _last_monitor = yn; }
- PortEngine::PortHandle port_handle() { return _port_handle; }
+ PortEngine::PortHandle port_handle() { return _port_handle; }
- void get_connected_latency_range (LatencyRange& range, bool playback) const;
+ void get_connected_latency_range (LatencyRange& range, bool playback) const;
void set_private_latency_range (LatencyRange& range, bool playback);
const LatencyRange& private_latency_range (bool playback) const;
@@ -124,6 +125,7 @@ public:
PBD::Signal1<void,bool> MonitorInputChanged;
static PBD::Signal2<void,boost::shared_ptr<Port>,boost::shared_ptr<Port> > PostDisconnect;
static PBD::Signal0<void> PortDrop;
+ static PBD::Signal0<void> PortSignalDrop;
static void set_cycle_framecnt (pframes_t n) {
_cycle_nframes = n;
@@ -168,8 +170,11 @@ private:
*/
std::set<std::string> _connections;
- void drop ();
- PBD::ScopedConnection drop_connection;
+ void port_connected_or_disconnected (boost::weak_ptr<Port>, boost::weak_ptr<Port>, bool);
+ void signal_drop ();
+ void drop ();
+ PBD::ScopedConnection drop_connection;
+ PBD::ScopedConnection engine_connection;
};
}
diff --git a/libs/ardour/ardour/port_engine.h b/libs/ardour/ardour/port_engine.h
index 5d18706..a6fa2a5 100644
--- a/libs/ardour/ardour/port_engine.h
+++ b/libs/ardour/ardour/port_engine.h
@@ -138,6 +138,17 @@ class LIBARDOUR_API PortEngine {
*/
virtual int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const { return -1; }
+ /** Set the port-property value and type for a given key
+ *
+ * The API follows jack_set_property():
+ * @param key The key of the property.
+ * @param value The value of the property.
+ * @param type The type of the property.
+ *
+ * @return 0 on success, -1 on error
+ */
+ virtual int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type) { return -1; }
+
/** Return a reference to a port with the fullname @param name. Return
* an "empty" PortHandle (analogous to a null pointer) if no such port exists.
*/
diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h
index 54d8583..0b1b3fb 100644
--- a/libs/ardour/ardour/port_insert.h
+++ b/libs/ardour/ardour/port_insert.h
@@ -26,6 +26,7 @@
#include "ardour/ardour.h"
#include "ardour/io_processor.h"
+#include "ardour/delivery.h"
#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
@@ -52,7 +53,11 @@ class LIBARDOUR_API PortInsert : public IOProcessor
XMLNode& get_state(void);
int set_state (const XMLNode&, int version);
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
+
+ void flush_buffers (framecnt_t nframes) {
+ _out->flush_buffers (nframes);
+ }
framecnt_t signal_latency () const;
diff --git a/libs/ardour/ardour/port_manager.h b/libs/ardour/ardour/port_manager.h
index 21ba221..ba1a8c3 100644
--- a/libs/ardour/ardour/port_manager.h
+++ b/libs/ardour/ardour/port_manager.h
@@ -39,6 +39,7 @@ namespace ARDOUR {
class PortEngine;
class AudioBackend;
+class Session;
class LIBARDOUR_API PortManager
{
@@ -147,7 +148,7 @@ class LIBARDOUR_API PortManager
boost::shared_ptr<Ports> _cycle_ports;
void fade_out (gain_t, gain_t, pframes_t);
- void silence (pframes_t nframes);
+ void silence (pframes_t nframes, Session *s = 0);
void silence_outputs (pframes_t nframes);
void check_monitoring ();
/** Signal the start of an audio cycle.
diff --git a/libs/ardour/ardour/port_set.h b/libs/ardour/ardour/port_set.h
index cd76f75..fce3627 100644
--- a/libs/ardour/ardour/port_set.h
+++ b/libs/ardour/ardour/port_set.h
@@ -49,10 +49,15 @@ public:
void add (boost::shared_ptr<Port> port);
bool remove (boost::shared_ptr<Port> port);
- /** nth port */
+ /** nth port
+ * @param index port index
+ */
boost::shared_ptr<Port> port(size_t index) const;
- /** nth port of type @a t, or nth port if t = NIL */
+ /** nth port of type @a t, or nth port if t = NIL
+ * @param t data type
+ * @param index port index
+ */
boost::shared_ptr<Port> port(DataType t, size_t index) const;
boost::shared_ptr<AudioPort> nth_audio_port(size_t n) const;
diff --git a/libs/ardour/ardour/presentation_info.h b/libs/ardour/ardour/presentation_info.h
new file mode 100644
index 0000000..6ef0fae
--- /dev/null
+++ b/libs/ardour/ardour/presentation_info.h
@@ -0,0 +1,253 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_presentation_info_h__
+#define __libardour_presentation_info_h__
+
+#include <iostream>
+#include <string>
+
+#include <stdint.h>
+
+#include "pbd/signals.h"
+#include "pbd/stateful.h"
+#include "pbd/properties.h"
+
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+namespace Properties {
+ LIBARDOUR_API extern PBD::PropertyDescriptor<uint32_t> order;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<uint32_t> color;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> selected;
+ /* we use this; declared in region.cc */
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden;
+}
+
+class LIBARDOUR_API PresentationInfo : public PBD::Stateful
+{
+ public:
+
+ /* a PresentationInfo object exists to share information between
+ * different user interfaces (e.g. GUI and a Mackie Control surface)
+ * about:
+ *
+ * - ordering
+ * - selection status
+ * - visibility
+ * - object identity
+ *
+ * ORDERING
+ *
+ * One UI takes control of ordering by setting the "order" value for
+ * the PresentationInfo component of every Stripable object. In Ardour,
+ * this is done by the GUI (mostly because it is very hard for the user
+ * to re-order things on a control surface).
+ *
+ * Ordering is a complex beast, however. Different user interfaces may
+ * display things in different ways. For example, the GUI of Ardour
+ * allows the user to mix busses in between tracks. A control surface
+ * may do the same, but may also allow the user to press a button that
+ * makes it show only busses, or only MIDI tracks. At that point, the
+ * ordering on the surface differs from the ordering in the GUI.
+ *
+ * There are several pathways for the order being set:
+ *
+ * - object created during session loading from XML
+ * - numeric order will be set during ::set_state(), based on
+ * - type will be set during ctor call
+ *
+ * - object created in response to user request
+ * - numeric order will be set by Session, before adding
+ * to container.
+ * - type set during ctor call
+ *
+ *
+ * OBJECT IDENTITY
+ *
+ * Control surfaces/protocols often need to be able to get a handle on
+ * an object identified only abstractly, such as the "5th audio track"
+ * or "the master out". A PresentationInfo object uniquely identifies
+ * all objects in this way through the combination of its _order member
+ * and part of its _flags member. The _flags member identifies the type
+ * of object, as well as selection/hidden status. The type may never
+ * change after construction (not strictly the constructor itself, but
+ * a more generalized notion of construction, as in "ready to use").
+ *
+ * SELECTION
+ *
+ * When an object is selected, its _flags member will have the Selected
+ * bit set.
+ *
+ * VISIBILITY
+ *
+ * When an object is hidden, its _flags member will have the Hidden
+ * bit set.
+ *
+ *
+ */
+
+ enum Flag {
+ /* Type information */
+ AudioTrack = 0x1,
+ MidiTrack = 0x2,
+ AudioBus = 0x4,
+ MidiBus = 0x8,
+ VCA = 0x10,
+ MasterOut = 0x20,
+ MonitorOut = 0x40,
+ Auditioner = 0x80,
+ /* These are for sharing Stripable states between the GUI and other
+ * user interfaces/control surfaces
+ */
+ Selected = 0x100,
+ Hidden = 0x200,
+ /* single bit indicates that the group order is set */
+ OrderSet = 0x400,
+
+ /* special mask to delect out "state" bits */
+ StatusMask = (Selected|Hidden)
+ };
+
+ static const Flag AllStripables; /* mask to use for any route or VCA (but not auditioner) */
+ static const Flag AllRoutes; /* mask to use for any route include master+monitor, but not auditioner */
+ static const Flag Route; /* mask for any route (bus or track */
+ static const Flag Track; /* mask to use for any track */
+ static const Flag Bus; /* mask to use for any bus */
+
+ typedef uint32_t order_t;
+ typedef uint32_t color_t;
+
+ PresentationInfo (Flag f);
+ PresentationInfo (order_t o, Flag f);
+ PresentationInfo (PresentationInfo const &);
+
+ static const order_t max_order;
+
+ PresentationInfo::Flag flags() const { return _flags; }
+ order_t order() const { return _order; }
+ color_t color() const { return _color; }
+
+ bool color_set() const;
+
+ void set_color (color_t);
+ void set_selected (bool yn);
+ void set_hidden (bool yn);
+ void set_flags (Flag f) { _flags = f; }
+
+ bool order_set() const { return _flags & OrderSet; }
+
+ bool hidden() const { return _flags & Hidden; }
+ bool selected() const { return _flags & Selected; }
+ bool special() const { return _flags & (MasterOut|MonitorOut|Auditioner); }
+
+ bool flag_match (Flag f) const {
+ /* no flags, match all */
+
+ if (f == Flag (0)) {
+ return true;
+ }
+
+ if (f & StatusMask) {
+ /* status bits set, must match them */
+ if ((_flags & StatusMask) != (f & StatusMask)) {
+ return false;
+ }
+ }
+
+ /* Generic flags in f, match the right stuff */
+
+ if (f == Bus && (_flags & Bus)) {
+ /* some kind of bus */
+ return true;
+ }
+ if (f == Track && (_flags & Track)) {
+ /* some kind of track */
+ return true;
+ }
+ if (f == Route && (_flags & Route)) {
+ /* any kind of route, but not master, monitor in
+ or auditioner.
+ */
+ return true;
+ }
+
+ if (f == AllRoutes && (_flags & AllRoutes)) {
+ /* any kind of route, but not auditioner. Ask for that
+ specifically.
+ */
+ return true;
+ }
+
+ if (f == AllStripables && (_flags & AllStripables)) {
+ /* any kind of stripable, but not auditioner. Ask for that
+ specifically.
+ */
+ return true;
+ }
+
+ /* compare without status mask - we already checked that above
+ */
+
+ return (_flags & (f &~ (StatusMask|OrderSet))) != 0; /* some flag matches */
+ }
+
+ int set_state (XMLNode const&, int);
+ XMLNode& get_state ();
+
+ bool operator==(PresentationInfo const& other) {
+ return (_order == other.order()) && (_flags == other.flags());
+ }
+
+ bool operator!=(PresentationInfo const& other) {
+ return (_order != other.order()) || (_flags != other.flags());
+ }
+
+ PresentationInfo& operator= (PresentationInfo const& other);
+
+ static Flag get_flags (XMLNode const& node);
+ static std::string state_node_name;
+
+ /* for things concerned about *any* PresentationInfo. This is emitted
+ * only at the request of another object that has finished making some
+ * changes (e.g. reordering things)
+ */
+
+ static PBD::Signal0<void> Change;
+
+ static void make_property_quarks ();
+
+ protected:
+ friend class Stripable;
+ void set_order (order_t order);
+
+ private:
+ order_t _order;
+ Flag _flags;
+ color_t _color;
+};
+
+}
+
+std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid);
+
+#endif /* __libardour_presentation_info_h__ */
diff --git a/libs/ardour/ardour/process_thread.h b/libs/ardour/ardour/process_thread.h
index ee2e522..cd1087f 100644
--- a/libs/ardour/ardour/process_thread.h
+++ b/libs/ardour/ardour/process_thread.h
@@ -47,6 +47,7 @@ public:
static BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
+ static BufferSet& get_noinplace_buffers (ChanCount count = ChanCount::ZERO);
static BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
static BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
static gain_t* gain_automation_buffer ();
diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h
index c7d3608..1a4863f 100644
--- a/libs/ardour/ardour/processor.h
+++ b/libs/ardour/ardour/processor.h
@@ -36,6 +36,7 @@
class XMLNode;
class ProcessorWindowProxy;
+class PluginPinWindowProxy;
namespace ARDOUR {
@@ -58,7 +59,9 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public
virtual bool display_to_user() const { return _display_to_user; }
virtual void set_display_to_user (bool);
- bool active () const { return _pending_active; }
+ bool active () const { return _pending_active; } ///< ardour hard bypass
+ virtual bool enabled () const { return _pending_active; } ///< processor enabled/bypass
+ virtual bool bypassable () const { return true; } ///< enable is not automated or locked
virtual bool does_routing() const { return false; }
@@ -73,13 +76,15 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public
/** @param result_required true if, on return from this method, @a bufs is required to contain valid data;
* if false, the method need not bother writing to @a bufs if it doesn't want to.
*/
- virtual void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t /*nframes*/, bool /*result_required*/) {}
- virtual void silence (framecnt_t /*nframes*/) {}
+ virtual void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double speed, pframes_t /*nframes*/, bool /*result_required*/) {}
+ virtual void silence (framecnt_t /*nframes*/, framepos_t /*start_frame*/) {}
virtual void activate () { _pending_active = true; ActiveChanged(); }
virtual void deactivate () { _pending_active = false; ActiveChanged(); }
virtual void flush() {}
+ virtual void enable (bool yn) { if (yn) { activate (); } else { deactivate (); } }
+
virtual bool configure_io (ChanCount in, ChanCount out);
/* Derived classes should override these, or processor appears as an in-place pass-through */
@@ -110,13 +115,17 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public
virtual void set_pre_fader (bool);
PBD::Signal0<void> ActiveChanged;
+ PBD::Signal0<void> BypassableChanged;
PBD::Signal2<void,ChanCount,ChanCount> ConfigurationChanged;
void set_ui (void*);
void* get_ui () const { return _ui_pointer; }
ProcessorWindowProxy * window_proxy () const { return _window_proxy; }
- void set_window_proxy (ProcessorWindowProxy* wp);
+ void set_window_proxy (ProcessorWindowProxy* wp) { _window_proxy = wp; }
+
+ PluginPinWindowProxy * pinmgr_proxy () const { return _pinmgr_proxy; }
+ void set_pingmgr_proxy (PluginPinWindowProxy* wp) { _pinmgr_proxy = wp ; }
void set_owner (SessionObject*);
SessionObject* owner() const;
@@ -134,6 +143,7 @@ protected:
bool _pre_fader; ///< true if this processor is currently placed before the Amp, otherwise false
void* _ui_pointer;
ProcessorWindowProxy *_window_proxy;
+ PluginPinWindowProxy *_pinmgr_proxy;
SessionObject* _owner;
};
diff --git a/libs/ardour/ardour/profile.h b/libs/ardour/ardour/profile.h
index 1ea7e2b..cc3ae4f 100644
--- a/libs/ardour/ardour/profile.h
+++ b/libs/ardour/ardour/profile.h
@@ -31,7 +31,6 @@ class LIBARDOUR_API RuntimeProfile {
public:
enum Element {
SmallScreen,
- SAE,
SinglePackage,
Trx,
Mixbus,
@@ -44,9 +43,6 @@ public:
void set_small_screen() { bits[SmallScreen] = true; }
bool get_small_screen() const { return bits[SmallScreen]; }
- void set_sae () { bits[SAE] = true; }
- bool get_sae () const { return bits[SAE]; }
-
bool get_trx() const { return bits[Trx]; }
void set_trx() { bits[Trx] = true; }
diff --git a/libs/ardour/ardour/proxy_controllable.h b/libs/ardour/ardour/proxy_controllable.h
index c60f5f1..22761d7 100644
--- a/libs/ardour/ardour/proxy_controllable.h
+++ b/libs/ardour/ardour/proxy_controllable.h
@@ -40,7 +40,7 @@ class LIBARDOUR_API ProxyControllable : public PBD::Controllable {
, _getter (getter)
{}
- void set_value (double v, PBD::Controllable::GroupControlDisposition /*group_override*/) { if (_setter (v)) { Changed(); /* EMIT SIGNAL */ } }
+ void set_value (double v, PBD::Controllable::GroupControlDisposition gcd) { if (_setter (v)) { Changed (true, gcd); /* EMIT SIGNAL */ } }
double get_value () const { return _getter (); }
double internal_to_user (double i) const { return accurate_coefficient_to_dB (i);}
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index 39f7709..a753e1b 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -40,6 +40,7 @@ CONFIG_VARIABLE (bool, auto_connect_standard_busses, "auto-connect-standard-buss
*/
CONFIG_VARIABLE (AutoConnectOption, output_auto_connect, "output-auto-connect", AutoConnectMaster)
CONFIG_VARIABLE (AutoConnectOption, input_auto_connect, "input-auto-connect", AutoConnectPhysical)
+CONFIG_VARIABLE (bool, strict_io, "strict-io", true)
/* Naming */
CONFIG_VARIABLE (TracksAutoNamingRule, tracks_auto_naming, "tracks-auto-naming", UseDefaultNames)
@@ -84,7 +85,6 @@ CONFIG_VARIABLE (float, ltc_output_volume, "ltc-output-volume", 0.125893)
CONFIG_VARIABLE (uint32_t, feedback_interval_ms, "feedback-interval-ms", 100)
CONFIG_VARIABLE (bool, use_tranzport, "use-tranzport", false)
-CONFIG_VARIABLE (RemoteModel, remote_model, "remote-model", MixerOrdered)
/* disk operations */
@@ -97,6 +97,7 @@ CONFIG_VARIABLE (float, audio_playback_buffer_seconds, "playback-buffer-seconds"
CONFIG_VARIABLE (float, midi_track_buffer_seconds, "midi-track-buffer-seconds", 1.0)
CONFIG_VARIABLE (uint32_t, disk_choice_space_threshold, "disk-choice-space-threshold", 57600000)
CONFIG_VARIABLE (bool, auto_analyse_audio, "auto-analyse-audio", false)
+CONFIG_VARIABLE (float, transient_sensitivity, "transient-sensitivity", 50)
/* OSC */
@@ -198,6 +199,7 @@ CONFIG_VARIABLE (MeterType, meter_type_bus, "meter-type-bus", MeterPeak)
/* miscellany */
+CONFIG_VARIABLE (bool, try_autostart_engine, "try-autostart-engine", false)
CONFIG_VARIABLE (std::string, auditioner_output_left, "auditioner-output-left", "default")
CONFIG_VARIABLE (std::string, auditioner_output_right, "auditioner-output-right", "default")
CONFIG_VARIABLE (bool, replicate_missing_region_channels, "replicate-missing-region-channels", false)
@@ -237,7 +239,8 @@ CONFIG_VARIABLE (bool, discover_vst_on_start, "discover-vst-on-start", false)
CONFIG_VARIABLE (bool, verbose_plugin_scan, "verbose-plugin-scan", true)
CONFIG_VARIABLE (int, vst_scan_timeout, "vst-scan-timeout", 600) /* deciseconds, per plugin, <= 0 no timeout */
CONFIG_VARIABLE (bool, discover_audio_units, "discover-audio-units", false)
-CONFIG_VARIABLE (bool, open_gui_after_adding_plugin, "open-gui-after-adding-plugin", true)
+CONFIG_VARIABLE (bool, ask_replace_instrument, "ask-replace-instrument", true)
+CONFIG_VARIABLE (bool, ask_setup_instrument, "ask-setup-instrument", true)
/* custom user plugin paths */
CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@")
@@ -271,3 +274,6 @@ CONFIG_VARIABLE (std::string, video_server_docroot, "video-server-docroot", "C:\
#endif
CONFIG_VARIABLE (bool, show_video_export_info, "show-video-export-info", true)
CONFIG_VARIABLE (bool, show_video_server_dialog, "show-video-server-dialog", false)
+
+CONFIG_VARIABLE (float, export_preroll, "export-preroll", 10.0) // seconds
+CONFIG_VARIABLE (float, export_silence_threshold, "export-silence-threshold", -INFINITY) // dB
diff --git a/libs/ardour/ardour/record_enable_control.h b/libs/ardour/ardour/record_enable_control.h
new file mode 100644
index 0000000..c5cb65c
--- /dev/null
+++ b/libs/ardour/ardour/record_enable_control.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_record_enable_control_h__
+#define __ardour_record_enable_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/dynamic_bitset.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/recordable.h"
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API RecordEnableControl : public SlavableAutomationControl
+{
+ public:
+ RecordEnableControl (Session& session, std::string const & name, Recordable& m);
+ ~RecordEnableControl() {}
+
+ /* Most (Slavable)AutomationControls do not override this, but we need
+ * to in order to prepare the Recordable for a change that will happen
+ * subsequently, in a realtime context. So the change is divided into
+ * two parts: the non-RT preparation, executed inside ::set_value(),
+ * then the second RT part.
+ */
+
+ void set_value (double, PBD::Controllable::GroupControlDisposition);
+
+ protected:
+ void actually_set_value (double val, Controllable::GroupControlDisposition gcd);
+ void do_pre_realtime_queue_stuff (double value);
+
+ private:
+ Recordable& _recordable;
+};
+
+} /* namespace */
+
+#endif /* __libardour_record_enable_control_h__ */
diff --git a/libs/ardour/ardour/record_safe_control.h b/libs/ardour/ardour/record_safe_control.h
new file mode 100644
index 0000000..ef062aa
--- /dev/null
+++ b/libs/ardour/ardour/record_safe_control.h
@@ -0,0 +1,50 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_record_safe_control_h__
+#define __ardour_record_safe_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/recordable.h"
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API RecordSafeControl : public SlavableAutomationControl
+{
+ public:
+ RecordSafeControl (Session& session, std::string const & name, Recordable& m);
+ ~RecordSafeControl() {}
+
+ protected:
+ void actually_set_value (double val, Controllable::GroupControlDisposition gcd);
+
+ private:
+ Recordable& _recordable;
+};
+
+} /* namespace */
+
+#endif /* __libardour_record_enable_control_h__ */
diff --git a/libs/ardour/ardour/recordable.h b/libs/ardour/ardour/recordable.h
new file mode 100644
index 0000000..e8568cf
--- /dev/null
+++ b/libs/ardour/ardour/recordable.h
@@ -0,0 +1,35 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_recordable_h__
+#define __ardour_recordable_h__
+
+namespace ARDOUR {
+
+class Recordable {
+ public:
+ virtual ~Recordable() {}
+
+ virtual int prep_record_enabled (bool yn) = 0;
+ virtual bool can_be_record_enabled() = 0;
+ virtual bool can_be_record_safe() = 0;
+};
+
+} /* namespace */
+
+#endif /* __ardour_recordable_h__ */
diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h
index a8a1475..e86db04 100644
--- a/libs/ardour/ardour/region.h
+++ b/libs/ardour/ardour/region.h
@@ -27,7 +27,6 @@
#include "pbd/undo.h"
#include "pbd/signals.h"
-
#include "ardour/ardour.h"
#include "ardour/data_type.h"
#include "ardour/automatable.h"
@@ -58,6 +57,7 @@ namespace Properties {
LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> start;
LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> length;
LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> position;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<double> beat;
LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> sync_position;
LIBARDOUR_API extern PBD::PropertyDescriptor<layer_t> layer;
LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> ancestral_start;
@@ -101,8 +101,6 @@ class LIBARDOUR_API Region
const DataType& data_type () const { return _type; }
- AnalysisFeatureList transients () { return _transients; };
-
/** How the region parameters play together:
*
* POSITION: first frame of the region along the timeline
@@ -132,7 +130,6 @@ class LIBARDOUR_API Region
frameoffset_t sync_offset (int& dir) const;
framepos_t sync_position () const;
- framepos_t sync_point () const;
framepos_t adjust_to_sync (framepos_t) const;
@@ -164,7 +161,6 @@ class LIBARDOUR_API Region
bool locked () const { return _locked; }
bool position_locked () const { return _position_locked; }
bool video_locked () const { return _video_locked; }
- bool valid_transients () const { return _valid_transients; }
bool automatic () const { return _automatic; }
bool whole_file () const { return _whole_file; }
bool captured () const { return !(_import || _external); }
@@ -176,9 +172,11 @@ class LIBARDOUR_API Region
Trimmable::CanTrim can_trim () const;
PositionLockStyle position_lock_style () const { return _position_lock_style; }
-
void set_position_lock_style (PositionLockStyle ps);
- void recompute_position_from_lock_style ();
+ void recompute_position_from_lock_style (const int32_t sub_num);
+
+ double beat () const { return _beat; }
+ void set_beat (double beat) { _beat = beat; }
void suspend_property_changes ();
@@ -202,33 +200,34 @@ class LIBARDOUR_API Region
bool region_list_equivalent (boost::shared_ptr<const Region>) const;
bool source_equivalent (boost::shared_ptr<const Region>) const;
bool any_source_equivalent (boost::shared_ptr<const Region>) const;
- bool uses_source (boost::shared_ptr<const Source>) const;
+ bool uses_source (boost::shared_ptr<const Source>, bool shallow = false) const;
+ void deep_sources (std::set<boost::shared_ptr<Source> >&) const;
std::string source_string () const;
/* EDITING OPERATIONS */
- void set_length (framecnt_t);
+ void set_length (framecnt_t, const int32_t sub_num);
void set_start (framepos_t);
- void set_position (framepos_t);
+ void set_position (framepos_t, int32_t sub_num = 0);
void set_initial_position (framepos_t);
void special_set_position (framepos_t);
- virtual void update_after_tempo_map_change ();
+ virtual void update_after_tempo_map_change (bool send_change = true);
void nudge_position (frameoffset_t);
bool at_natural_position () const;
void move_to_natural_position ();
- void move_start (frameoffset_t distance);
- void trim_front (framepos_t new_position);
- void trim_end (framepos_t new_position);
- void trim_to (framepos_t position, framecnt_t length);
+ void move_start (frameoffset_t distance, const int32_t sub_num = 0);
+ void trim_front (framepos_t new_position, const int32_t sub_num = 0);
+ void trim_end (framepos_t new_position, const int32_t sub_num = 0);
+ void trim_to (framepos_t position, framecnt_t length, const int32_t sub_num = 0);
virtual void fade_range (framepos_t, framepos_t) {}
- void cut_front (framepos_t new_position);
- void cut_end (framepos_t new_position);
+ void cut_front (framepos_t new_position, const int32_t sub_num = 0);
+ void cut_end (framepos_t new_position, const int32_t sub_num = 0);
void set_layer (layer_t l); /* ONLY Playlist can call this */
void raise ();
@@ -291,37 +290,45 @@ class LIBARDOUR_API Region
// no transients, but its OK
}
- virtual int update_transient (framepos_t /* old_position */, framepos_t /* new_position */) {
+ virtual void clear_transients () {
// no transients, but its OK
- return 0;
}
- virtual void remove_transient (framepos_t /* where */) {
+ virtual void update_transient (framepos_t /* old_position */, framepos_t /* new_position */) {
// no transients, but its OK
}
- virtual int set_transients (AnalysisFeatureList&) {
+ virtual void remove_transient (framepos_t /* where */) {
// no transients, but its OK
- return 0;
}
- virtual int get_transients (AnalysisFeatureList&, bool force_new = false) {
- (void) force_new;
+ virtual void set_onsets (AnalysisFeatureList&) {
// no transients, but its OK
- return 0;
}
- virtual int adjust_transients (frameoffset_t /*delta*/) {
+ /** merges _onsets and _user_transients into given list
+ * and removed exact duplicates.
+ */
+ void transients (AnalysisFeatureList&);
+
+ /** merges _onsets OR _transients with _user_transients into given list
+ * if _onsets and _transients are unset, run analysis.
+ * list is not thinned, duplicates remain in place.
+ *
+ * intended for: Playlist::find_next_transient ()
+ */
+ virtual void get_transients (AnalysisFeatureList&) {
// no transients, but its OK
- return 0;
}
+ bool has_transients () const;
+
virtual int separate_by_channel (ARDOUR::Session&,
std::vector< boost::shared_ptr<Region> >&) const {
return 0;
}
- void invalidate_transients ();
+ void maybe_invalidate_transients ();
void drop_sources ();
@@ -335,7 +342,7 @@ class LIBARDOUR_API Region
Region (boost::shared_ptr<const Region>);
/** Construct a region from another region, at an offset within that region */
- Region (boost::shared_ptr<const Region>, frameoffset_t start_offset);
+ Region (boost::shared_ptr<const Region>, frameoffset_t start_offset, const int32_t sub_num);
/** Construct a region as a copy of another region, but with different sources */
Region (boost::shared_ptr<const Region>, const SourceList&);
@@ -352,9 +359,11 @@ class LIBARDOUR_API Region
void send_change (const PBD::PropertyChange&);
virtual int _set_state (const XMLNode&, int version, PBD::PropertyChange& what_changed, bool send_signal);
void post_set (const PBD::PropertyChange&);
- virtual void set_position_internal (framepos_t pos, bool allow_bbt_recompute);
- virtual void set_length_internal (framecnt_t);
- virtual void set_start_internal (framecnt_t);
+ virtual void set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
+ virtual void set_length_internal (framecnt_t, const int32_t sub_num);
+ virtual void set_start_internal (framecnt_t, const int32_t sub_num = 0);
+ bool verify_start_and_length (framepos_t, framecnt_t&);
+ void first_edit ();
DataType _type;
@@ -365,6 +374,7 @@ class LIBARDOUR_API Region
PBD::Property<framepos_t> _start;
PBD::Property<framecnt_t> _length;
PBD::Property<framepos_t> _position;
+ PBD::Property<double> _beat;
/** Sync position relative to the start of our file */
PBD::Property<framepos_t> _sync_position;
@@ -372,22 +382,31 @@ class LIBARDOUR_API Region
/** Used when timefx are applied, so we can always use the original source */
SourceList _master_sources;
- AnalysisFeatureList _transients;
-
boost::weak_ptr<ARDOUR::Playlist> _playlist;
+ void merge_features (AnalysisFeatureList&, const AnalysisFeatureList&, const frameoffset_t) const;
+
+ AnalysisFeatureList _onsets; // used by the Ferret (Aubio OnsetDetector)
+
+ // _transient_user_start is covered by _valid_transients
+ AnalysisFeatureList _user_transients; // user added
+ framepos_t _transient_user_start; // region's _start relative to user_transients
+
+ // these are used by Playlist::find_next_transient() in absence of onsets
+ AnalysisFeatureList _transients; // Source Analysis (QM Transient), user read-only
+ framepos_t _transient_analysis_start;
+ framepos_t _transient_analysis_end;
+
private:
void mid_thaw (const PBD::PropertyChange&);
- void trim_to_internal (framepos_t position, framecnt_t length);
- void modify_front (framepos_t new_position, bool reset_fade);
- void modify_end (framepos_t new_position, bool reset_fade);
+ virtual void trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num);
+ void modify_front (framepos_t new_position, bool reset_fade, const int32_t sub_num);
+ void modify_end (framepos_t new_position, bool reset_fade, const int32_t sub_num);
void maybe_uncopy ();
- void first_edit ();
bool verify_start (framepos_t);
- bool verify_start_and_length (framepos_t, framecnt_t&);
bool verify_start_mutable (framepos_t&_start);
bool verify_length (framecnt_t&);
@@ -414,7 +433,6 @@ class LIBARDOUR_API Region
framecnt_t _last_length;
framepos_t _last_position;
mutable RegionEditState _first_edit;
- Timecode::BBT_Time _bbt_time;
layer_t _layer;
void register_properties ();
diff --git a/libs/ardour/ardour/region_factory.h b/libs/ardour/ardour/region_factory.h
index 08d9aff..6971e77 100644
--- a/libs/ardour/ardour/region_factory.h
+++ b/libs/ardour/ardour/region_factory.h
@@ -59,7 +59,7 @@ public:
static PBD::Signal1<void,boost::shared_ptr<Region> > CheckNewRegion;
/** create a "pure copy" of Region @param other */
- static boost::shared_ptr<Region> create (boost::shared_ptr<const Region> other, bool announce = false);
+ static boost::shared_ptr<Region> create (boost::shared_ptr<const Region> other, bool announce = false, const int32_t sub_num = 0);
/** create a region from a single Source */
static boost::shared_ptr<Region> create (boost::shared_ptr<Source>,
@@ -73,7 +73,7 @@ public:
const PBD::PropertyList&, bool announce = true);
/** create a copy of @param other starting at @param offset within @param other */
static boost::shared_ptr<Region> create (boost::shared_ptr<Region> other, frameoffset_t offset,
- const PBD::PropertyList&, bool announce = true);
+ const PBD::PropertyList&, bool announce = true, const int32_t sub_num = 0);
/** create a "copy" of @param other but using a different set of sources @param srcs */
static boost::shared_ptr<Region> create (boost::shared_ptr<Region> other, const SourceList& srcs,
const PBD::PropertyList&, bool announce = true);
diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h
index 1d60a43..d42a280 100644
--- a/libs/ardour/ardour/return.h
+++ b/libs/ardour/ardour/return.h
@@ -42,7 +42,7 @@ public:
uint32_t bit_slot() const { return _bitslot; }
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
boost::shared_ptr<Amp> amp() const { return _amp; }
boost::shared_ptr<PeakMeter> meter() const { return _meter; }
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 92e073e..6c57263 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -14,7 +14,6 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
*/
#ifndef __ardour_route_h__
@@ -29,7 +28,6 @@
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
-#include <boost/dynamic_bitset.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <glibmm/threads.h>
@@ -44,13 +42,24 @@
#include "ardour/gain_control.h"
#include "ardour/instrument_info.h"
#include "ardour/io.h"
+#include "ardour/io_vector.h"
#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
+#include "ardour/monitorable.h"
+#include "ardour/muteable.h"
#include "ardour/mute_master.h"
+#include "ardour/mute_control.h"
#include "ardour/route_group_member.h"
+#include "ardour/stripable.h"
#include "ardour/graphnode.h"
#include "ardour/automatable.h"
#include "ardour/unknown_processor.h"
+#include "ardour/soloable.h"
+#include "ardour/solo_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/slavable.h"
+
+class RoutePinWindowProxy;
namespace ARDOUR {
@@ -62,6 +71,7 @@ class Panner;
class PannerShell;
class PortSet;
class Processor;
+class PluginInsert;
class RouteGroup;
class Send;
class InternalReturn;
@@ -69,26 +79,33 @@ class MonitorProcessor;
class Pannable;
class CapturingProcessor;
class InternalSend;
-
-class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
+class VCA;
+class SoloIsolateControl;
+class PhaseControl;
+class MonitorControl;
+
+class LIBARDOUR_API Route : public Stripable,
+ public GraphNode,
+ public Soloable,
+ public Muteable,
+ public Monitorable,
+ public Automatable,
+ public RouteGroupMember,
+ public boost::enable_shared_from_this<Route>
{
- public:
+public:
typedef std::list<boost::shared_ptr<Processor> > ProcessorList;
- enum Flag {
- Auditioner = 0x1,
- MasterOut = 0x2,
- MonitorOut = 0x4
- };
-
- Route (Session&, std::string name, Flag flags = Flag(0), DataType default_type = DataType::AUDIO);
+ Route (Session&, std::string name, PresentationInfo::Flag flags = PresentationInfo::Flag(0), DataType default_type = DataType::AUDIO);
virtual ~Route();
virtual int init ();
boost::shared_ptr<IO> input() const { return _input; }
boost::shared_ptr<IO> output() const { return _output; }
+ IOVector all_inputs () const;
+ IOVector all_outputs () const;
ChanCount n_inputs() const { return _input->n_ports(); }
ChanCount n_outputs() const { return _output->n_ports(); }
@@ -104,15 +121,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
bool set_name (const std::string& str);
static void set_name_in_state (XMLNode &, const std::string &, bool rename_playlist = true);
- uint32_t order_key () const;
- bool has_order_key () const;
- void set_order_key (uint32_t);
-
- bool is_auditioner() const { return _flags & Auditioner; }
- bool is_master() const { return _flags & MasterOut; }
- bool is_monitor() const { return _flags & MonitorOut; }
-
- virtual MonitorState monitoring_state () const;
+ MonitorState monitoring_state () const;
virtual MeterState metering_state () const;
/* these are the core of the API of a Route. see the protected sections as well */
@@ -128,60 +137,39 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
virtual bool can_record() { return false; }
- virtual void set_record_enabled (bool /*yn*/, PBD::Controllable::GroupControlDisposition) {}
- virtual bool record_enabled() const { return false; }
- virtual void set_record_safe (bool /*yn*/, PBD::Controllable::GroupControlDisposition) {}
- virtual bool record_safe () const {return false; }
virtual void nonrealtime_handle_transport_stopped (bool abort, bool did_locate, bool flush_processors);
virtual void realtime_handle_transport_stopped () {}
virtual void realtime_locate () {}
- virtual void non_realtime_locate (framepos_t);
+ virtual void non_realtime_locate (framepos_t);
virtual void set_pending_declick (int);
/* end of vfunc-based API */
void shift (framepos_t, framecnt_t);
- void set_gain (gain_t val, PBD::Controllable::GroupControlDisposition);
- void inc_gain (gain_t delta);
-
void set_trim (gain_t val, PBD::Controllable::GroupControlDisposition);
- void set_mute_points (MuteMaster::MutePoint);
- MuteMaster::MutePoint mute_points () const;
-
- bool muted () const;
- void set_mute (bool yn, PBD::Controllable::GroupControlDisposition);
-
- bool muted_by_others() const;
-
/* controls use set_solo() to modify this route's solo state
*/
- void set_solo (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- bool soloed () const { return self_soloed () || soloed_by_others (); }
void clear_all_solo_state ();
- bool soloed_by_others () const { return _soloed_by_others_upstream||_soloed_by_others_downstream; }
- bool soloed_by_others_upstream () const { return _soloed_by_others_upstream; }
- bool soloed_by_others_downstream () const { return _soloed_by_others_downstream; }
- bool self_soloed () const { return _self_solo; }
-
- void set_solo_isolated (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- bool solo_isolated() const;
-
- void set_solo_safe (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- bool solo_safe() const;
+ bool soloed_by_others () const { return _solo_control->soloed_by_others(); }
+ bool soloed_by_others_upstream () const { return _solo_control->soloed_by_others_upstream(); }
+ bool soloed_by_others_downstream () const { return _solo_control->soloed_by_others_downstream(); }
+ bool self_soloed () const { return _solo_control->self_soloed(); }
+ bool soloed () const { return self_soloed () || soloed_by_others (); }
- void set_listen (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- bool listening_via_monitor () const;
+ void push_solo_upstream (int32_t delta);
+ void push_solo_isolate_upstream (int32_t delta);
+ bool can_solo () const {
+ return !(is_master() || is_monitor() || is_auditioner());
+ }
+ bool is_safe () const {
+ return _solo_safe_control->get_value();
+ }
void enable_monitor_send ();
- void set_phase_invert (uint32_t, bool yn);
- void set_phase_invert (boost::dynamic_bitset<>);
- bool phase_invert (uint32_t) const;
- boost::dynamic_bitset<> phase_invert () const;
-
void set_denormal_protection (bool yn);
bool denormal_protection() const;
@@ -197,8 +185,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
boost::shared_ptr<Amp> amp() const { return _amp; }
boost::shared_ptr<Amp> trim() const { return _trim; }
- PeakMeter& peak_meter() { return *_meter.get(); }
- const PeakMeter& peak_meter() const { return *_meter.get(); }
+ boost::shared_ptr<PeakMeter> peak_meter() { return _meter; }
+ boost::shared_ptr<const PeakMeter> peak_meter() const { return _meter; }
boost::shared_ptr<PeakMeter> shared_peak_meter() const { return _meter; }
boost::shared_ptr<DelayLine> delay_line() const { return _delayline; }
@@ -232,9 +220,13 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
std::list<std::string> unknown_processors () const;
+ RoutePinWindowProxy * pinmgr_proxy () const { return _pinmgr_proxy; }
+ void set_pingmgr_proxy (RoutePinWindowProxy* wp) { _pinmgr_proxy = wp ; }
+
/* special processors */
boost::shared_ptr<InternalSend> monitor_send() const { return _monitor_send; }
+ /** the signal processorat at end of the processing chain which produces output */
boost::shared_ptr<Delivery> main_outs() const { return _main_outs; }
boost::shared_ptr<InternalReturn> internal_return() const { return _intreturn; }
boost::shared_ptr<MonitorProcessor> monitor_control() const { return _monitor_control; }
@@ -262,7 +254,22 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
boost::shared_ptr<Processor> before_processor_for_placement (Placement);
boost::shared_ptr<Processor> before_processor_for_index (int);
bool processors_reorder_needs_configure (const ProcessorList& new_order);
- int remove_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0, bool need_process_lock = true);
+ /** remove plugin/processor
+ *
+ * @param proc processor to remove
+ * @param err error report (index where removal vailed, channel-count why it failed) may be nil
+ * @param need_process_lock if locking is required (set to true, unless called from RT context with lock)
+ * @returns 0 on success
+ */
+ int remove_processor (boost::shared_ptr<Processor> proc, ProcessorStreams* err = 0, bool need_process_lock = true);
+ /** replace plugin/processor with another
+ *
+ * @param old processor to remove
+ * @param sub processor to substitute the old one with
+ * @param err error report (index where removal vailed, channel-count why it failed) may be nil
+ * @returns 0 on success
+ */
+ int replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err = 0);
int remove_processors (const ProcessorList&, ProcessorStreams* err = 0);
int reorder_processors (const ProcessorList& new_order, ProcessorStreams* err = 0);
void disable_processors (Placement);
@@ -273,6 +280,46 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
void clear_processors (Placement);
void all_visible_processors_active (bool);
+ bool strict_io () const { return _strict_io; }
+ bool set_strict_io (bool);
+ /** reset plugin-insert configuration to default, disable customizations.
+ *
+ * This is equivalent to calling
+ * @code
+ * customize_plugin_insert (proc, 0, unused)
+ * @endcode
+ *
+ * @param proc Processor to reset
+ * @returns true if successful
+ */
+ bool reset_plugin_insert (boost::shared_ptr<Processor> proc);
+ /** enable custom plugin-insert configuration
+ * @param proc Processor to customize
+ * @param count number of plugin instances to use (if zero, reset to default)
+ * @param outs output port customization
+ * @param sinks input pins for variable-I/O plugins
+ * @returns true if successful
+ */
+ bool customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks);
+ bool add_remove_sidechain (boost::shared_ptr<Processor> proc, bool);
+ bool plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs);
+
+ /* enable sidechain input for a given processor
+ *
+ * The sidechain itself is an IO port object with variable number of channels and configured independently.
+ * Adding/removing the port itself however requires reconfiguring the route and is hence
+ * not a plugin operation itself.
+ *
+ * @param proc the processor to add sidechain inputs to
+ * @returns true on success
+ */
+ bool add_sidechain (boost::shared_ptr<Processor> proc) { return add_remove_sidechain (proc, true); }
+ /* remove sidechain input from given processor
+ * @param proc the processor to remove the sidechain input from
+ * @returns true on success
+ */
+ bool remove_sidechain (boost::shared_ptr<Processor> proc) { return add_remove_sidechain (proc, false); }
+
framecnt_t set_private_port_latencies (bool playback) const;
void set_public_port_latencies (framecnt_t, bool playback) const;
@@ -284,15 +331,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
framecnt_t signal_latency() const { return _signal_latency; }
PBD::Signal0<void> active_changed;
- PBD::Signal0<void> phase_invert_changed;
PBD::Signal0<void> denormal_protection_changed;
- PBD::Signal1<void,PBD::Controllable::GroupControlDisposition> listen_changed;
- PBD::Signal2<void,bool,PBD::Controllable::GroupControlDisposition> solo_changed;
- PBD::Signal0<void> solo_safe_changed;
- PBD::Signal0<void> solo_isolated_changed;
PBD::Signal0<void> comment_changed;
- PBD::Signal0<void> mute_changed;
- PBD::Signal0<void> mute_points_changed;
/** track numbers - assigned by session
* nubers > 0 indicate tracks (audio+midi)
@@ -309,9 +349,18 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
PropertyChanged (ARDOUR::Properties::name);
}
+ enum PluginSetupOptions {
+ None = 0x0,
+ CanReplace = 0x1,
+ MultiOut = 0x2,
+ };
+
+ static PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, PluginSetupOptions > PluginSetup;
+
/** the processors have changed; the parameter indicates what changed */
PBD::Signal1<void,RouteProcessorChange> processors_changed;
PBD::Signal1<void,void*> record_enable_changed;
+ PBD::Signal0<void> processor_latency_changed;
/** the metering point has changed */
PBD::Signal0<void> meter_change;
PBD::Signal0<void> signal_latency_changed;
@@ -320,10 +369,6 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
/** Emitted with the process lock held */
PBD::Signal0<void> io_changed;
- /* gui's call this for their own purposes. */
-
- PBD::Signal2<void,std::string,void*> gui_changed;
-
/* stateful */
XMLNode& get_state();
@@ -360,6 +405,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
*/
bool direct_feeds_according_to_graph (boost::shared_ptr<Route>, bool* via_send_only = 0);
+ bool feeds_according_to_graph (boost::shared_ptr<Route>);
+
struct FeedRecord {
boost::weak_ptr<Route> r;
bool sends_only;
@@ -385,131 +432,33 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
boost::shared_ptr<AutomationControl> get_control (const Evoral::Parameter& param);
- class RouteAutomationControl : public AutomationControl {
- public:
- RouteAutomationControl (const std::string& name,
- AutomationType atype,
- boost::shared_ptr<AutomationList> alist,
- boost::shared_ptr<Route> route);
- protected:
- friend class Route;
-
- void route_set_value (double val) {
- AutomationControl::set_value (val, Controllable::NoGroup);
- }
-
- boost::weak_ptr<Route> _route;
- };
-
- class GainControllable : public GainControl {
- public:
- GainControllable (Session& session,
- AutomationType type,
- boost::shared_ptr<Route> route);
-
- void set_value (double val, PBD::Controllable::GroupControlDisposition group_override) {
- boost::shared_ptr<Route> r = _route.lock();
- if (r) {
- /* Route must mediate group control */
- r->set_control ((AutomationType) parameter().type(), val, group_override);
- }
- }
-
- protected:
- friend class Route;
-
- void route_set_value (double val) {
- GainControl::set_value (val, Controllable::NoGroup);
- }
-
- boost::weak_ptr<Route> _route;
- };
-
- class SoloControllable : public RouteAutomationControl {
- public:
- SoloControllable (std::string name, boost::shared_ptr<Route>);
- void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- void set_value_unchecked (double);
- double get_value () const;
- private:
- void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- };
-
- struct MuteControllable : public RouteAutomationControl {
- public:
- MuteControllable (std::string name, boost::shared_ptr<Route>);
- void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- void set_value_unchecked (double);
- double get_value () const;
-
- /* Pretend to change value, but do not affect actual route mute. */
- void set_superficial_value(bool muted);
-
- private:
- boost::weak_ptr<Route> _route;
- void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- };
-
- class LIBARDOUR_API PhaseControllable : public RouteAutomationControl {
- public:
- PhaseControllable (std::string name, boost::shared_ptr<Route>);
- void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- /* currently no automation, so no need for set_value_unchecked() */
- void set_channel (uint32_t);
- double get_value () const;
- uint32_t channel() const;
- private:
- uint32_t _current_phase;
- void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- };
-
- class LIBARDOUR_API SoloIsolateControllable : public RouteAutomationControl {
- public:
- SoloIsolateControllable (std::string name, boost::shared_ptr<Route>);
- void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- /* currently no automation, so no need for set_value_unchecked() */
- double get_value () const;
- private:
- void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- };
-
- class LIBARDOUR_API SoloSafeControllable : public RouteAutomationControl {
- public:
- SoloSafeControllable (std::string name, boost::shared_ptr<Route>);
- void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- /* currently no automation, so no need for set_value_unchecked() */
- double get_value () const;
- private:
- void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- };
-
- void set_control (AutomationType, double val, PBD::Controllable::GroupControlDisposition group_override);
-
- boost::shared_ptr<SoloControllable> solo_control() const {
+ boost::shared_ptr<SoloControl> solo_control() const {
return _solo_control;
}
- boost::shared_ptr<MuteControllable> mute_control() const {
+ boost::shared_ptr<MuteControl> mute_control() const {
return _mute_control;
}
- boost::shared_ptr<MuteMaster> mute_master() const {
- return _mute_master;
- }
+ bool can_be_muted_by_others () const { return can_solo(); }
+ bool muted () const { return _mute_control->muted(); }
+ bool muted_by_masters () const { return _mute_control->muted_by_masters(); }
+ bool muted_by_self () const { return _mute_control->muted_by_self(); }
+ bool muted_by_others_soloing () const;
- boost::shared_ptr<SoloIsolateControllable> solo_isolate_control() const {
+ boost::shared_ptr<SoloIsolateControl> solo_isolate_control() const {
return _solo_isolate_control;
}
- boost::shared_ptr<SoloSafeControllable> solo_safe_control() const {
+ boost::shared_ptr<SoloSafeControl> solo_safe_control() const {
return _solo_safe_control;
}
- boost::shared_ptr<AutomationControl> monitoring_control() const {
+ boost::shared_ptr<MonitorControl> monitoring_control() const {
/* tracks override this to provide actual monitoring control;
busses have no possible choices except input monitoring.
*/
- return boost::shared_ptr<AutomationControl> ();
+ return boost::shared_ptr<MonitorControl> ();
}
/* Route doesn't own these items, but sub-objects that it does own have them
@@ -519,11 +468,11 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
boost::shared_ptr<Panner> panner() const; /* may return null */
boost::shared_ptr<PannerShell> panner_shell() const;
- boost::shared_ptr<GainControl> gain_control() const;
boost::shared_ptr<Pannable> pannable() const;
- boost::shared_ptr<GainControl> trim_control() const;
- boost::shared_ptr<PhaseControllable> phase_control() const;
+ boost::shared_ptr<GainControl> gain_control() const;
+ boost::shared_ptr<GainControl> trim_control() const;
+ boost::shared_ptr<PhaseControl> phase_control() const;
/**
Return the first processor that accepts has at least one MIDI input
@@ -533,121 +482,102 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
special case not covered by this utility function.
*/
boost::shared_ptr<Processor> the_instrument() const;
- InstrumentInfo& instrument_info() { return _instrument_info; }
-
- /* "well-known" controls for panning. Any or all of these may return
- * null.
- */
-
- boost::shared_ptr<AutomationControl> pan_azimuth_control() const;
- boost::shared_ptr<AutomationControl> pan_elevation_control() const;
- boost::shared_ptr<AutomationControl> pan_width_control() const;
- boost::shared_ptr<AutomationControl> pan_frontback_control() const;
- boost::shared_ptr<AutomationControl> pan_lfe_control() const;
-
- /* "well-known" controls for an EQ in this route. Any or all may
- * be null. eq_band_cnt() must return 0 if there is no EQ present.
- * Passing an @param band value >= eq_band_cnt() will guarantee the
- * return of a null ptr (or an empty string for eq_band_name()).
- */
- uint32_t eq_band_cnt () const;
- std::string eq_band_name (uint32_t) const;
- boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const;
- boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const;
- boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const;
- boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const;
- boost::shared_ptr<AutomationControl> eq_enable_controllable () const;
- boost::shared_ptr<AutomationControl> eq_hpf_controllable () const;
-
- /* "well-known" controls for a compressor in this route. Any or all may
- * be null.
- */
- boost::shared_ptr<AutomationControl> comp_enable_controllable () const;
- boost::shared_ptr<AutomationControl> comp_threshold_controllable () const;
- boost::shared_ptr<AutomationControl> comp_speed_controllable () const;
- boost::shared_ptr<AutomationControl> comp_mode_controllable () const;
- boost::shared_ptr<AutomationControl> comp_makeup_controllable () const;
- boost::shared_ptr<AutomationControl> comp_redux_controllable () const;
-
- /* @param mode must be supplied by the comp_mode_controllable(). All other values
- * result in undefined behaviour
- */
- std::string comp_mode_name (uint32_t mode) const;
- /* @param mode - as for comp mode name. This returns the name for the
- * parameter/control accessed via comp_speed_controllable(), which can
- * be mode dependent.
- */
- std::string comp_speed_name (uint32_t mode) const;
-
- /* "well-known" controls for sends to well-known busses in this route. Any or all may
- * be null.
- *
- * In Mixbus, these are the sends that connect to the mixbusses.
- * In Ardour, these are user-created sends that connect to user-created
- * Aux busses.
- */
- boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const;
- boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const;
- /* for the same value of @param n, this returns the name of the send
- * associated with the pair of controllables returned by the above two methods.
- */
- std::string send_name (uint32_t n) const;
-
- /* well known control that enables/disables sending to the master bus.
- *
- * In Ardour, this returns null.
- * In Mixbus, it will return a suitable control, or null depending on
- * the route.
- */
- boost::shared_ptr<AutomationControl> master_send_enable_controllable () const;
-
- void protect_automation ();
-
- enum {
- /* These numbers are taken from MIDI Machine Control,
- which can only control up to 317 tracks without
- doing sysex segmentation.
- */
- MasterBusRemoteControlID = 318,
- MonitorBusRemoteControlID = 319,
- };
+ InstrumentInfo& instrument_info() { return _instrument_info; }
- void set_remote_control_id (uint32_t id, bool notify_class_listeners = true);
- uint32_t remote_control_id () const;
- void set_remote_control_id_explicit (uint32_t order_key);
+ /* "well-known" controls for panning. Any or all of these may return
+ * null.
+ */
- /* for things concerned about *this* route's RID */
+ boost::shared_ptr<AutomationControl> pan_azimuth_control() const;
+ boost::shared_ptr<AutomationControl> pan_elevation_control() const;
+ boost::shared_ptr<AutomationControl> pan_width_control() const;
+ boost::shared_ptr<AutomationControl> pan_frontback_control() const;
+ boost::shared_ptr<AutomationControl> pan_lfe_control() const;
- PBD::Signal0<void> RemoteControlIDChanged;
+ /* "well-known" controls for an EQ in this route. Any or all may
+ * be null. eq_band_cnt() must return 0 if there is no EQ present.
+ * Passing an @param band value >= eq_band_cnt() will guarantee the
+ * return of a null ptr (or an empty string for eq_band_name()).
+ */
+ uint32_t eq_band_cnt () const;
+ std::string eq_band_name (uint32_t) const;
+ boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const;
+ boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const;
+ boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const;
+ boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const;
+ boost::shared_ptr<AutomationControl> eq_enable_controllable () const;
+ boost::shared_ptr<AutomationControl> eq_hpf_controllable () const;
+
+ /* "well-known" controls for a compressor in this route. Any or all may
+ * be null.
+ */
+ boost::shared_ptr<AutomationControl> comp_enable_controllable () const;
+ boost::shared_ptr<AutomationControl> comp_threshold_controllable () const;
+ boost::shared_ptr<AutomationControl> comp_speed_controllable () const;
+ boost::shared_ptr<AutomationControl> comp_mode_controllable () const;
+ boost::shared_ptr<AutomationControl> comp_makeup_controllable () const;
+ boost::shared_ptr<AutomationControl> comp_redux_controllable () const;
+
+ /* @param mode must be supplied by the comp_mode_controllable(). All other values
+ * result in undefined behaviour
+ */
+ std::string comp_mode_name (uint32_t mode) const;
+ /* @param mode - as for comp mode name. This returns the name for the
+ * parameter/control accessed via comp_speed_controllable(), which can
+ * be mode dependent.
+ */
+ std::string comp_speed_name (uint32_t mode) const;
+
+ /* "well-known" controls for sends to well-known busses in this route. Any or all may
+ * be null.
+ *
+ * In Mixbus, these are the sends that connect to the mixbusses.
+ * In Ardour, these are user-created sends that connect to user-created
+ * Aux busses.
+ */
+ boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const;
+ boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const;
+ /* for the same value of @param n, this returns the name of the send
+ * associated with the pair of controllables returned by the above two methods.
+ */
+ std::string send_name (uint32_t n) const;
- /* for things concerned about *any* route's RID changes */
+ /* well known control that enables/disables sending to the master bus.
+ *
+ * In Ardour, this returns null.
+ * In Mixbus, it will return a suitable control, or null depending on
+ * the route.
+ */
+ boost::shared_ptr<AutomationControl> master_send_enable_controllable () const;
- static PBD::Signal0<void> RemoteControlIDChange;
- static PBD::Signal0<void> SyncOrderKeys;
+ void protect_automation ();
bool has_external_redirects() const;
- /* can only be executed by a route for which is_monitor() is true
- (i.e. the monitor out)
- */
- void monitor_run (framepos_t start_frame, framepos_t end_frame,
- pframes_t nframes, int declick);
+ /* can only be executed by a route for which is_monitor() is true
+ * (i.e. the monitor out)
+ */
+ void monitor_run (framepos_t start_frame, framepos_t end_frame,
+ pframes_t nframes, int declick);
+
+ bool slaved_to (boost::shared_ptr<VCA>) const;
+ bool slaved () const;
protected:
- friend class Session;
+ friend class Session;
void catch_up_on_solo_mute_override ();
- void mod_solo_by_others_upstream (int32_t);
- void mod_solo_by_others_downstream (int32_t);
+ void set_listen (bool);
+
void curve_reallocate ();
virtual void set_block_size (pframes_t nframes);
protected:
- virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; }
+ virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; }
- void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
+ void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
- void passthru (BufferSet&, framepos_t start_frame, framepos_t end_frame,
+ void passthru (BufferSet&, framepos_t start_frame, framepos_t end_frame,
pframes_t nframes, int declick);
virtual void write_out_of_band_data (BufferSet& /* bufs */, framepos_t /* start_frame */, framepos_t /* end_frame */,
@@ -658,6 +588,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
pframes_t nframes, int declick,
bool gain_automation_ok);
+ void flush_processor_buffers_locked (framecnt_t nframes);
+
virtual void bounce_process (BufferSet& bufs,
framepos_t start_frame, framecnt_t nframes,
boost::shared_ptr<Processor> endpoint, bool include_endpoint,
@@ -695,19 +627,10 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
gint _pending_process_reorder; // atomic
gint _pending_signals; // atomic
- Flag _flags;
int _pending_declick;
MeterPoint _meter_point;
MeterPoint _pending_meter_point;
MeterType _meter_type;
- boost::dynamic_bitset<> _phase_invert;
- bool _self_solo;
- uint32_t _soloed_by_others_upstream;
- uint32_t _soloed_by_others_downstream;
- bool _solo_isolated;
- uint32_t _solo_isolated_by_upstream;
-
- void mod_solo_isolated_by_upstream (bool);
bool _denormal_protection;
@@ -715,26 +638,22 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
bool _silent : 1;
bool _declickable : 1;
- boost::shared_ptr<SoloControllable> _solo_control;
- boost::shared_ptr<MuteControllable> _mute_control;
- boost::shared_ptr<MuteMaster> _mute_master;
- boost::shared_ptr<PhaseControllable> _phase_control;
- boost::shared_ptr<SoloIsolateControllable> _solo_isolate_control;
- boost::shared_ptr<SoloSafeControllable> _solo_safe_control;
-
- virtual void act_on_mute () {}
+ boost::shared_ptr<SoloControl> _solo_control;
+ boost::shared_ptr<MuteControl> _mute_control;
+ boost::shared_ptr<PhaseControl> _phase_control;
+ boost::shared_ptr<SoloIsolateControl> _solo_isolate_control;
+ boost::shared_ptr<SoloSafeControl> _solo_safe_control;
std::string _comment;
bool _have_internal_generator;
- bool _solo_safe;
DataType _default_type;
FedBy _fed_by;
- InstrumentInfo _instrument_info;
+ InstrumentInfo _instrument_info;
virtual ChanCount input_streams () const;
- protected:
+protected:
virtual XMLNode& state(bool);
int configure_processors (ProcessorStreams*);
@@ -753,9 +672,9 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
virtual void maybe_declick (BufferSet&, framecnt_t, int);
- boost::shared_ptr<GainControllable> _gain_control;
+ boost::shared_ptr<GainControl> _gain_control;
boost::shared_ptr<Amp> _amp;
- boost::shared_ptr<GainControllable> _trim_control;
+ boost::shared_ptr<GainControl> _trim_control;
boost::shared_ptr<Amp> _trim;
boost::shared_ptr<PeakMeter> _meter;
boost::shared_ptr<DelayLine> _delayline;
@@ -763,25 +682,27 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
boost::shared_ptr<Processor> the_instrument_unlocked() const;
private:
+ int64_t _track_number;
+
int set_state_2X (const XMLNode&, int);
void set_processor_state_2X (XMLNodeList const &, int);
- uint32_t _order_key;
- bool _has_order_key;
- uint32_t _remote_control_id;
-
- int64_t _track_number;
-
void input_change_handler (IOChange, void *src);
void output_change_handler (IOChange, void *src);
+ void sidechain_change_handler (IOChange, void *src);
+
+ void processor_selfdestruct (boost::weak_ptr<Processor>);
+ std::vector<boost::weak_ptr<Processor> > selfdestruct_sequence;
+ Glib::Threads::Mutex selfdestruct_lock;
bool input_port_count_changing (ChanCount);
bool output_port_count_changing (ChanCount);
bool _in_configure_processors;
bool _initial_io_setup;
+ bool _in_sidechain_setup;
- int configure_processors_unlocked (ProcessorStreams*);
+ int configure_processors_unlocked (ProcessorStreams*, Glib::Threads::RWLock::WriterLock*);
bool set_meter_point_unlocked ();
void apply_processor_order (const ProcessorList& new_order);
@@ -793,7 +714,6 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
void placement_range (Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end);
void set_self_solo (bool yn);
- void set_mute_master_solo ();
void set_processor_positions ();
framecnt_t update_port_latencies (PortSet& ports, PortSet& feeders, bool playback, framecnt_t) const;
@@ -832,6 +752,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
friend class ProcessorState;
+ bool _strict_io;
+
/* no copy construction */
Route (Route const &);
@@ -843,10 +765,11 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
or 0.
*/
boost::weak_ptr<Processor> _processor_after_last_custom_meter;
+ RoutePinWindowProxy *_pinmgr_proxy;
- void reset_instrument_info ();
+ void reset_instrument_info ();
- void set_remote_control_id_internal (uint32_t id, bool notify_class_listeners = true);
+ void solo_control_changed (bool self, PBD::Controllable::GroupControlDisposition);
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/route_graph.h b/libs/ardour/ardour/route_graph.h
index e1e1049..aae2ba0 100644
--- a/libs/ardour/ardour/route_graph.h
+++ b/libs/ardour/ardour/route_graph.h
@@ -44,6 +44,7 @@ public:
void add (GraphVertex from, GraphVertex to, bool via_sends_only);
bool has (GraphVertex from, GraphVertex to, bool* via_sends_only);
+ bool feeds (GraphVertex from, GraphVertex to);
std::set<GraphVertex> from (GraphVertex r) const;
void remove (GraphVertex from, GraphVertex to);
bool has_none_to (GraphVertex to) const;
@@ -56,6 +57,7 @@ private:
typedef std::multimap<GraphVertex, std::pair<GraphVertex, bool> > EdgeMapWithSends;
EdgeMapWithSends::iterator find_in_from_to_with_sends (GraphVertex, GraphVertex);
+ EdgeMapWithSends::iterator find_recursively_in_from_to_with_sends (GraphVertex, GraphVertex);
/** map of edges with from as `first' and to as `second' */
EdgeMap _from_to;
diff --git a/libs/ardour/ardour/route_group.h b/libs/ardour/ardour/route_group.h
index fc295a6..1285d3b 100644
--- a/libs/ardour/ardour/route_group.h
+++ b/libs/ardour/ardour/route_group.h
@@ -29,24 +29,27 @@
#include "pbd/signals.h"
#include "pbd/stateful.h"
-#include "ardour/libardour_visibility.h"
+#include "ardour/control_group.h"
#include "ardour/types.h"
#include "ardour/session_object.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
namespace Properties {
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> relative;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_relative;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_gain;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_mute;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_solo;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_recenable;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_select;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_route_active;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_color;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_monitoring;
LIBARDOUR_API extern PBD::PropertyDescriptor<bool> active;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> gain;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> mute;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> solo;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> recenable;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> select;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> route_active;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> color;
- LIBARDOUR_API extern PBD::PropertyDescriptor<bool> monitoring;
- /* we use this, but its declared in region.cc */
+ LIBARDOUR_API extern PBD::PropertyDescriptor<int32_t> group_master_number;
+ /* we use these declared in region.cc */
LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden;
};
@@ -55,6 +58,13 @@ class Track;
class AudioTrack;
class Session;
+/** A group identifier for routes.
+ *
+ * RouteGroups permit to define properties which are shared
+ * among all Routes that use the given identifier.
+ *
+ * A route can at most be in one group.
+ */
class LIBARDOUR_API RouteGroup : public SessionObject
{
public:
@@ -66,7 +76,7 @@ class LIBARDOUR_API RouteGroup : public SessionObject
bool is_active () const { return _active.val(); }
bool is_relative () const { return _relative.val(); }
bool is_hidden () const { return _hidden.val(); }
- bool is_gain () const { return _gain.val(); }
+ bool is_gain () const { return _gain.val() && _group_master_number.val() <= 0; }
bool is_mute () const { return _mute.val(); }
bool is_solo () const { return _solo.val(); }
bool is_recenable () const { return _recenable.val(); }
@@ -74,6 +84,7 @@ class LIBARDOUR_API RouteGroup : public SessionObject
bool is_route_active () const { return _route_active.val(); }
bool is_color () const { return _color.val(); }
bool is_monitoring() const { return _monitoring.val(); }
+ int32_t group_master_number() const { return _group_master_number.val(); }
bool empty() const {return routes->empty();}
size_t size() const { return routes->size();}
@@ -134,9 +145,15 @@ class LIBARDOUR_API RouteGroup : public SessionObject
int set_state (const XMLNode&, int version);
+ void assign_master (boost::shared_ptr<VCA>);
+ void unassign_master (boost::shared_ptr<VCA>);
+ bool has_control_master() const;
+ bool slaved () const;
+
private:
boost::shared_ptr<RouteList> routes;
boost::shared_ptr<Route> subgroup_bus;
+ boost::weak_ptr<VCA> group_master;
PBD::Property<bool> _relative;
PBD::Property<bool> _active;
@@ -149,9 +166,19 @@ class LIBARDOUR_API RouteGroup : public SessionObject
PBD::Property<bool> _route_active;
PBD::Property<bool> _color;
PBD::Property<bool> _monitoring;
+ PBD::Property<int32_t> _group_master_number;
+
+ boost::shared_ptr<ControlGroup> _solo_group;
+ boost::shared_ptr<ControlGroup> _mute_group;
+ boost::shared_ptr<ControlGroup> _rec_enable_group;
+ boost::shared_ptr<ControlGroup> _gain_group;
+ boost::shared_ptr<ControlGroup> _monitoring_group;
void remove_when_going_away (boost::weak_ptr<Route>);
int set_state_2X (const XMLNode&, int);
+
+ void post_set (PBD::PropertyChange const &);
+ void push_to_groups ();
};
} /* namespace */
diff --git a/libs/ardour/ardour/route_sorters.h b/libs/ardour/ardour/route_sorters.h
deleted file mode 100644
index 022d5a2..0000000
--- a/libs/ardour/ardour/route_sorters.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Copyright (C) 2000-2014 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef __libardour_route_sorters_h__
-#define __libardour_route_sorters_h__
-
-#include "ardour/route.h"
-
-namespace ARDOUR {
-
-struct SignalOrderRouteSorter {
- bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
- if (a->is_master() || a->is_monitor()) {
- /* "a" is a special route (master, monitor, etc), and comes
- * last in the mixer ordering
- */
- return false;
- } else if (b->is_master() || b->is_monitor()) {
- /* everything comes before b */
- return true;
- }
- return a->order_key () < b->order_key ();
- }
-};
-
-} // namespace
-
-#endif /* __libardour_route_sorters_h__ */
diff --git a/libs/ardour/ardour/search_paths.h b/libs/ardour/ardour/search_paths.h
index 3eea491..f280e5d 100644
--- a/libs/ardour/ardour/search_paths.h
+++ b/libs/ardour/ardour/search_paths.h
@@ -79,19 +79,29 @@ namespace ARDOUR {
*
* If ARDOUR_MIDI_PATCH_PATH is defined then the Searchpath returned
* will contain only those directories specified in it, otherwise it will
- * contain the user and system directories which may contain control
- * surface plugins.
+ * contain the user and system directories.
*/
LIBARDOUR_API PBD::Searchpath midi_patch_search_path ();
/**
* return a Searchpath containing directories in which to look for
+ * theme files.
+ *
+ * If ARDOUR_THEMES_PATH is defined then the Searchpath returned
+ * will contain only those directories specified in it, otherwise it will
+ * contain the user and system directories
+ */
+ LIBARDOUR_API PBD::Searchpath theme_search_path ();
+
+
+ /**
+ * return a Searchpath containing directories in which to look for
* panner plugins.
*
* If ARDOUR_PANNER_PATH is defined then the Searchpath returned
* will contain only those directories specified in it, otherwise it will
- * contain the user and system directories which may contain control
- * surface plugins.
+ * contain the user and system directories which may contain panner
+ * plugins.
*/
LIBARDOUR_API PBD::Searchpath panner_search_path ();
@@ -107,6 +117,14 @@ namespace ARDOUR {
*/
LIBARDOUR_API PBD::Searchpath template_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * lua scripts
+ */
+ LIBARDOUR_API PBD::Searchpath lua_search_path ();
+
+
} // namespace ARDOUR
#endif /* __libardour_search_paths_h__ */
diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h
index 3b0e8a4..f70f09b 100644
--- a/libs/ardour/ardour/send.h
+++ b/libs/ardour/ardour/send.h
@@ -55,9 +55,13 @@ class LIBARDOUR_API Send : public Delivery
XMLNode& get_state ();
int set_state(const XMLNode&, int version);
+ PBD::Signal0<void> SelfDestruct;
+ void set_remove_on_disconnect (bool b) { _remove_on_disconnect = b; }
+ bool remove_on_disconnect () const { return _remove_on_disconnect; }
+
uint32_t pans_required() const { return _configured_input.n_audio(); }
- void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out);
@@ -73,7 +77,7 @@ class LIBARDOUR_API Send : public Delivery
bool set_name (const std::string& str);
- std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
static uint32_t how_many_sends();
static std::string name_and_id_new_send (Session&, Delivery::Role r, uint32_t&, bool);
@@ -89,6 +93,7 @@ class LIBARDOUR_API Send : public Delivery
/* disallow copy construction */
Send (const Send&);
void panshell_changed ();
+ void snd_output_changed (IOChange, void*);
int set_state_2X (XMLNode const &, int);
@@ -96,6 +101,7 @@ class LIBARDOUR_API Send : public Delivery
framecnt_t _delay_in;
framecnt_t _delay_out;
+ bool _remove_on_disconnect;
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index e28ff8e..db80ddc 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -28,6 +28,7 @@
#include <set>
#include <string>
#include <vector>
+#include <queue>
#include <stdint.h>
#include <boost/dynamic_bitset.hpp>
@@ -42,11 +43,14 @@
#include "pbd/error.h"
#include "pbd/event_loop.h"
#include "pbd/rcu.h"
+#include "pbd/reallocpool.h"
#include "pbd/statefuldestructible.h"
#include "pbd/signals.h"
#include "pbd/undo.h"
-#include "evoral/types.hpp"
+#include "lua/luastate.h"
+
+#include "evoral/Range.hpp"
#include "midi++/types.h"
#include "midi++/mmc.h"
@@ -57,12 +61,16 @@
#include "ardour/chan_count.h"
#include "ardour/delivery.h"
#include "ardour/interthread_info.h"
+#include "ardour/luascripting.h"
#include "ardour/location.h"
#include "ardour/monitor_processor.h"
+#include "ardour/presentation_info.h"
#include "ardour/rc_configuration.h"
#include "ardour/session_configuration.h"
#include "ardour/session_event.h"
#include "ardour/interpolation.h"
+#include "ardour/plugin.h"
+#include "ardour/presentation_info.h"
#include "ardour/route.h"
#include "ardour/route_graph.h"
@@ -80,7 +88,10 @@ class Parser;
namespace PBD {
class Controllable;
-class ControllableDescriptor;
+}
+
+namespace luabridge {
+ class LuaRef;
}
namespace Evoral {
@@ -102,6 +113,7 @@ class BufferSet;
class Bundle;
class Butler;
class Click;
+class ControllableDescriptor;
class Diskstream;
class ExportHandler;
class ExportStatus;
@@ -138,6 +150,7 @@ class Source;
class Speakers;
class TempoMap;
class Track;
+class VCAManager;
class WindowsVSTPlugin;
extern void setup_enum_writer ();
@@ -153,6 +166,7 @@ private:
std::string _message;
};
+/** Ardour Session */
class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager
{
public:
@@ -177,6 +191,12 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format);
static std::string get_snapshot_from_instant (const std::string& session_dir);
+ /** a monotonic counter used for naming user-visible things uniquely
+ * (curently the sidechain port).
+ * Use sparingly to keep the numbers low, prefer PBD::ID for all
+ * internal, not user-visible IDs */
+ static unsigned int next_name_id ();
+
std::string path() const { return _path; }
std::string name() const { return _name; }
std::string snap_name() const { return _current_snapshot_name; }
@@ -193,11 +213,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
bool routes_deletion_in_progress() const { return _route_deletion_in_progress; }
bool peaks_cleanup_in_progres() const { return _state_of_the_state & PeakCleanup; }
+ bool loading () const { return _state_of_the_state & Loading; }
PBD::Signal0<void> DirtyChanged;
- PBD::Signal1<void, bool> RouteAddedOrRemoved;
-
const SessionDirectory& session_directory () const { return *(_session_dir.get()); }
static PBD::Signal1<void,std::string> Dialog;
@@ -219,6 +238,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
std::string new_audio_source_path_for_embedded (const std::string& existing_path);
std::string new_audio_source_path (const std::string&, uint32_t nchans, uint32_t chan, bool destructive, bool take_required);
std::string new_midi_source_path (const std::string&);
+ /** create a new track or bus from a template (XML path)
+ * @param how_many how many tracks or busses to create
+ * @param template_path path to xml template file
+ * @param name name (prefix) of the route to create
+ * @param pd Playlist disposition
+ * @return list of newly created routes
+ */
RouteList new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
RouteList new_route_from_template (uint32_t how_many, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path, uint32_t channels);
@@ -228,7 +254,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void process (pframes_t nframes);
BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
- BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true );
+ BufferSet& get_noinplace_buffers (ChanCount count = ChanCount::ZERO);
+ BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
@@ -250,6 +277,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
return routes.reader ();
}
+ /* because the set of Stripables consists of objects managed
+ * independently, in multiple containers within the Session (or objects
+ * owned by the session), we fill out a list in-place rather than
+ * return a pointer to a copy of the (RCU) managed list, as happens
+ * with get_routes()
+ */
+
+ void get_stripables (StripableList&) const;
boost::shared_ptr<RouteList> get_tracks() const;
boost::shared_ptr<RouteList> get_routes_with_internal_returns() const;
boost::shared_ptr<RouteList> get_routes_with_regions_at (framepos_t const) const;
@@ -266,20 +301,20 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
};
- void set_order_hint (int32_t order_hint) {_order_hint = order_hint;};
- void notify_remote_id_change ();
- void sync_order_keys ();
+ void notify_presentation_info_change ();
template<class T> void foreach_route (T *obj, void (T::*func)(Route&), bool sort = true);
template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>), bool sort = true);
template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg, bool sort = true);
static char session_name_is_legal (const std::string&);
- bool io_name_is_legal (const std::string&);
- boost::shared_ptr<Route> route_by_name (std::string);
- boost::shared_ptr<Route> route_by_id (PBD::ID);
- boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
- boost::shared_ptr<Track> track_by_diskstream_id (PBD::ID);
+ bool io_name_is_legal (const std::string&) const;
+ boost::shared_ptr<Route> route_by_name (std::string) const;
+ boost::shared_ptr<Route> route_by_id (PBD::ID) const;
+ boost::shared_ptr<Stripable> get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag) const;
+ boost::shared_ptr<Route> get_remote_nth_route (PresentationInfo::order_t n) const;
+ boost::shared_ptr<Route> route_by_selected_count (uint32_t cnt) const;
+ boost::shared_ptr<Track> track_by_diskstream_id (PBD::ID) const;
void routes_using_input_from (const std::string& str, RouteList& rl);
bool route_name_unique (std::string) const;
@@ -305,7 +340,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void maybe_enable_record ();
void disable_record (bool rt_context, bool force = false);
void step_back_from_record ();
-
+
void set_all_tracks_record_enabled(bool);
void maybe_write_autosave ();
@@ -424,6 +459,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void set_auto_punch_location (Location *);
void set_auto_loop_location (Location *);
void set_session_extents (framepos_t start, framepos_t end);
+ void set_end_is_free (bool);
int location_name(std::string& result, std::string base = std::string(""));
pframes_t get_block_size() const { return current_block_size; }
@@ -461,6 +497,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
};
int save_as (SaveAs&);
+ /** save session
+ * @param snapshot_name name of the session (use an empty string for the current name)
+ * @param pending save a 'recovery', not full state (default: false)
+ * @param switch_to_snapshot switch to given snapshot after saving (default: false)
+ * @param template_only save a session template (default: false)
+ * @return zero on success
+ */
int save_state (std::string snapshot_name, bool pending = false, bool switch_to_snapshot = false, bool template_only = false);
int restore_state (std::string snapshot_name);
int save_template (std::string template_name, bool replace_existing = false);
@@ -559,23 +602,25 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
std::list<boost::shared_ptr<AudioTrack> > new_audio_track (
int input_channels,
int output_channels,
- TrackMode mode = Normal,
- RouteGroup* route_group = 0,
- uint32_t how_many = 1,
- std::string name_template = ""
- );
-
- RouteList new_audio_route (
- int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, std::string name_template = ""
+ RouteGroup* route_group,
+ uint32_t how_many,
+ std::string name_template,
+ PresentationInfo::order_t order,
+ TrackMode mode = Normal
);
std::list<boost::shared_ptr<MidiTrack> > new_midi_track (
const ChanCount& input, const ChanCount& output,
- boost::shared_ptr<PluginInfo> instrument = boost::shared_ptr<PluginInfo>(),
- TrackMode mode = Normal,
- RouteGroup* route_group = 0, uint32_t how_many = 1, std::string name_template = ""
+ boost::shared_ptr<PluginInfo> instrument,
+ Plugin::PresetRecord* pset,
+ RouteGroup* route_group, uint32_t how_many, std::string name_template,
+ PresentationInfo::order_t,
+ TrackMode mode = Normal
);
+ RouteList new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, std::string name_template, PresentationInfo::Flag, PresentationInfo::order_t);
+ RouteList new_midi_route (RouteGroup* route_group, uint32_t how_many, std::string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord*, PresentationInfo::Flag, PresentationInfo::order_t);
+
void remove_routes (boost::shared_ptr<RouteList>);
void remove_route (boost::shared_ptr<Route>);
@@ -631,8 +676,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool synced_to_ltc () const { return config.get_external_sync() && Config->get_sync_source() == LTC && g_atomic_int_get (const_cast<gint*>(&_ltc_active)); }
double transport_speed() const { return _transport_speed; }
- bool transport_stopped() const { return _transport_speed == 0.0f; }
- bool transport_rolling() const { return _transport_speed != 0.0f; }
+ bool transport_stopped() const { return _transport_speed == 0.0; }
+ bool transport_rolling() const { return _transport_speed != 0.0; }
bool silent () { return _silent; }
@@ -659,7 +704,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
boost::shared_ptr<ExportHandler> get_export_handler ();
boost::shared_ptr<ExportStatus> get_export_status ();
- int start_audio_export (framepos_t position);
+ int start_audio_export (framepos_t position, bool realtime = false);
PBD::Signal1<int, framecnt_t> ProcessExport;
static PBD::Signal2<void,std::string, std::string> Exported;
@@ -693,6 +738,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
*/
static PBD::Signal2<int, framecnt_t, framecnt_t> AskAboutSampleRateMismatch;
+ /** non interactive message */
+ static PBD::Signal2<void, framecnt_t, framecnt_t> NotifyAboutSampleRateMismatch;
+
/** handlers should return !0 for use pending state, 0 for ignore it.
*/
static PBD::Signal0<int> AskAboutPendingState;
@@ -723,6 +771,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
PBD::Signal1<void,bool> AuditionActive;
+ /* session script */
+ void register_lua_function (const std::string&, const std::string&, const LuaScriptParamList&);
+ void unregister_lua_function (const std::string& name);
+ std::vector<std::string> registered_lua_functions ();
+ uint32_t registered_lua_function_count () const { return _n_lua_scripts; }
+ void scripts_changed (); // called from lua, updates _n_lua_scripts
+
/* flattening stuff */
boost::shared_ptr<Region> write_one_track (Track&, framepos_t start, framepos_t end,
@@ -736,18 +791,17 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool soloing() const { return _non_soloed_outs_muted; }
bool listening() const { return _listen_cnt > 0; }
bool solo_isolated() const { return _solo_isolated_cnt > 0; }
+ void cancel_all_solo ();
static const SessionEvent::RTeventCallback rt_cleanup;
- void set_solo (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
void clear_all_solo_state (boost::shared_ptr<RouteList>);
- void set_just_one_solo (boost::shared_ptr<Route>, bool, SessionEvent::RTeventCallback after = rt_cleanup);
- void set_mute (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- void set_listen (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- void set_record_enabled (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- void set_record_safe (boost::shared_ptr<RouteList>, bool yn, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- void set_solo_isolated (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
- void set_monitoring (boost::shared_ptr<RouteList>, MonitorChoice, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
+
+ /* Control-based methods */
+
+ void set_controls (boost::shared_ptr<ControlList>, double val, PBD::Controllable::GroupControlDisposition);
+ void set_control (boost::shared_ptr<AutomationControl>, double val, PBD::Controllable::GroupControlDisposition);
+
void set_exclusive_input_active (boost::shared_ptr<RouteList> rt, bool onoff, bool flip_others = false);
PBD::Signal1<void,bool> SoloActive;
@@ -835,13 +889,38 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
std::string next_undo() const { return _history.next_undo(); }
std::string next_redo() const { return _history.next_redo(); }
+ /** begin collecting undo information
+ *
+ * This call must always be followed by either
+ * begin_reversible_command() or commit_reversible_command()
+ *
+ * @param cmd_name human readable name for the undo operation
+ */
void begin_reversible_command (const std::string& cmd_name);
void begin_reversible_command (GQuark);
+ /** abort an open undo command
+ * This must only be called after begin_reversible_command ()
+ */
void abort_reversible_command ();
+ /** finalize an undo command and commit pending transactions
+ *
+ * This must only be called after begin_reversible_command ()
+ * @param cmd (additional) command to add
+ */
void commit_reversible_command (Command* cmd = 0);
void add_command (Command *const cmd);
+ /** create an StatefulDiffCommand from the given object and add it to the stack.
+ *
+ * This function must only be called after begin_reversible_command.
+ * Failing to do so may lead to a crash.
+ *
+ * @param sfd the object to diff
+ * @returns the allocated StatefulDiffCommand (already added via add_command)
+ */
+ PBD::StatefulDiffCommand* add_stateful_diff_command (boost::shared_ptr<PBD::StatefulDestructible> sfd);
+
/** @return The list of operations that are currently in progress */
std::list<GQuark> const & current_operations () {
return _current_trans_quarks;
@@ -916,8 +995,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
/* Controllables */
+ boost::shared_ptr<Processor> processor_by_id (PBD::ID) const;
+
boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&);
- boost::shared_ptr<PBD::Controllable> controllable_by_descriptor (const PBD::ControllableDescriptor&);
+ boost::shared_ptr<PBD::Controllable> controllable_by_descriptor (const ARDOUR::ControllableDescriptor&);
void add_controllable (boost::shared_ptr<PBD::Controllable>);
void remove_controllable (PBD::Controllable*);
@@ -1045,11 +1126,15 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void reconnect_ltc_input ();
void reconnect_ltc_output ();
+ VCAManager& vca_manager() { return *_vca_manager; }
+
protected:
friend class AudioEngine;
void set_block_size (pframes_t nframes);
void set_frame_rate (framecnt_t nframes);
+#ifdef USE_TRACKS_CODE_FEATURES
void reconnect_existing_routes (bool withLock, bool reconnect_master = true, bool reconnect_inputs = true, bool reconnect_outputs = true);
+#endif
protected:
friend class Route;
@@ -1060,6 +1145,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
int create (const std::string& mix_template, BusProfile*);
void destroy ();
+ static guint _name_id_counter;
+ static void init_name_id_counter (guint n);
+ static unsigned int name_id_counter ();
+
enum SubState {
PendingDeclickIn = 0x1, ///< pending de-click fade-in for start
PendingDeclickOut = 0x2, ///< pending de-click fade-out for stop
@@ -1081,13 +1170,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
process_function_type last_process_function;
bool _bounce_processing_active;
bool waiting_for_sync_offset;
- framecnt_t _base_frame_rate;
- framecnt_t _current_frame_rate; //this includes video pullup offset
- framecnt_t _nominal_frame_rate; //ignores audioengine setting, "native" SR
+ framecnt_t _base_frame_rate; // sample-rate of the session at creation time, "native" SR
+ framecnt_t _nominal_frame_rate; // overridden by audioengine setting
+ framecnt_t _current_frame_rate; // this includes video pullup offset
int transport_sub_state;
mutable gint _record_status;
framepos_t _transport_frame;
Location* _session_range_location; ///< session range, or 0 if there is nothing in the session yet
+ bool _session_range_end_is_free;
Slave* _slave;
bool _silent;
@@ -1140,8 +1230,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void process_without_events (pframes_t);
void process_with_events (pframes_t);
void process_audition (pframes_t);
- int process_export (pframes_t);
- int process_export_fw (pframes_t);
+ void process_export (pframes_t);
+ void process_export_fw (pframes_t);
void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
@@ -1177,8 +1267,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
framepos_t post_export_position;
bool _exporting;
- bool _export_started;
bool _export_rolling;
+ bool _realtime_export;
+ framepos_t _export_preroll;
+ framepos_t _export_latency;
boost::shared_ptr<ExportHandler> export_handler;
boost::shared_ptr<ExportStatus> export_status;
@@ -1271,6 +1363,21 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool pending_abort;
bool pending_auto_loop;
+ PBD::ReallocPool _mempool;
+ LuaState lua;
+ Glib::Threads::Mutex lua_lock;
+ luabridge::LuaRef * _lua_run;
+ luabridge::LuaRef * _lua_add;
+ luabridge::LuaRef * _lua_del;
+ luabridge::LuaRef * _lua_list;
+ luabridge::LuaRef * _lua_load;
+ luabridge::LuaRef * _lua_save;
+ luabridge::LuaRef * _lua_cleanup;
+ uint32_t _n_lua_scripts;
+
+ void setup_lua ();
+ void try_run_lua (pframes_t);
+
Butler* _butler;
static const PostTransportWork ProcessCannotProceedMask =
@@ -1322,7 +1429,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void auto_loop_changed (Location *);
void auto_loop_declick_range (Location *, framepos_t &, framepos_t &);
- int ensure_engine (uint32_t desired_sample_rate);
+ int ensure_engine (uint32_t desired_sample_rate, bool);
void pre_engine_init (std::string path);
int post_engine_init ();
int immediately_post_engine ();
@@ -1370,6 +1477,47 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
pthread_cond_t _rt_emit_cond;
bool _rt_emit_pending;
+ /* Auto Connect Thread */
+ static void *auto_connect_thread (void *);
+ void auto_connect_thread_run ();
+ void auto_connect_thread_start ();
+ void auto_connect_thread_terminate ();
+
+ pthread_t _auto_connect_thread;
+ bool _ac_thread_active;
+ pthread_mutex_t _auto_connect_mutex;
+ pthread_cond_t _auto_connect_cond;
+
+ struct AutoConnectRequest {
+ public:
+ AutoConnectRequest (boost::shared_ptr <Route> r, bool ci,
+ const ChanCount& is,
+ const ChanCount& os,
+ const ChanCount& io,
+ const ChanCount& oo)
+ : route (boost::weak_ptr<Route> (r))
+ , connect_inputs (ci)
+ , input_start (is)
+ , output_start (os)
+ , input_offset (io)
+ , output_offset (oo)
+ {}
+
+ boost::weak_ptr <Route> route;
+ bool connect_inputs;
+ ChanCount input_start;
+ ChanCount output_start;
+ ChanCount input_offset;
+ ChanCount output_offset;
+ };
+
+ typedef std::queue<AutoConnectRequest> AutoConnectQueue;
+ Glib::Threads::Mutex _auto_connect_queue_lock;
+ AutoConnectQueue _auto_connect_queue;
+ guint _latency_recompute_pending;
+
+ void auto_connect (const AutoConnectRequest&);
+ void queue_latency_recompute ();
/* SessionEventManager interface */
@@ -1503,6 +1651,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
TempoMap *_tempo_map;
void tempo_map_changed (const PBD::PropertyChange&);
+ void gui_tempo_map_changed ();
/* edit/mix groups */
@@ -1517,8 +1666,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
SerializedRCUManager<RouteList> routes;
- void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save);
- void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect);
+ void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t);
+ void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t);
bool _adding_routes_in_progress;
bool _reconnecting_routes_in_progress;
bool _route_deletion_in_progress;
@@ -1532,9 +1681,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
bool find_route_name (std::string const &, uint32_t& id, std::string& name, bool);
void count_existing_track_channels (ChanCount& in, ChanCount& out);
- void auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
- bool with_lock, bool connect_inputs = true,
- ChanCount input_start = ChanCount (), ChanCount output_start = ChanCount ());
+ void auto_connect_route (boost::shared_ptr<Route>, bool, const ChanCount&, const ChanCount&, const ChanCount& io = ChanCount(), const ChanCount& oo = ChanCount());
void midi_output_change_handler (IOChange change, void* /*src*/, boost::weak_ptr<Route> midi_track);
/* track numbering */
@@ -1542,12 +1689,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void reassign_track_numbers ();
uint32_t _track_number_decimals;
- /* mixer stuff */
+ /* solo/mute/notifications */
void route_listen_changed (PBD::Controllable::GroupControlDisposition, boost::weak_ptr<Route>);
void route_mute_changed ();
void route_solo_changed (bool self_solo_change, PBD::Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route>);
void route_solo_isolated_changed (boost::weak_ptr<Route>);
+
void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
void listen_position_changed ();
@@ -1782,15 +1930,30 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
return ev;
}
- void rt_set_solo (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
+ /* specialized version realtime "apply to set of routes" operations */
+ template<typename T1, typename T2> SessionEvent*
+ get_rt_event (boost::shared_ptr<RouteList> rl, T1 t1arg, T2 t2arg, SessionEvent::RTeventCallback after, PBD::Controllable::GroupControlDisposition group_override,
+ void (Session::*method) (boost::shared_ptr<RouteList>, T1, T2, PBD::Controllable::GroupControlDisposition)) {
+ SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
+ ev->rt_slot = boost::bind (method, this, rl, t1arg, t2arg, group_override);
+ ev->rt_return = after;
+ ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
+
+ return ev;
+ }
+
+ /* specialized version realtime "apply to set of controls" operations */
+ SessionEvent* get_rt_event (boost::shared_ptr<ControlList> cl, double arg, PBD::Controllable::GroupControlDisposition group_override) {
+ SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
+ ev->rt_slot = boost::bind (&Session::rt_set_controls, this, cl, arg, group_override);
+ ev->rt_return = Session::rt_cleanup;
+ ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
+
+ return ev;
+ }
+
+ void rt_set_controls (boost::shared_ptr<ControlList>, double val, PBD::Controllable::GroupControlDisposition group_override);
void rt_clear_all_solo_state (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
- void rt_set_just_one_solo (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition /* ignored*/ );
- void rt_set_mute (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
- void rt_set_listen (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
- void rt_set_solo_isolated (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
- void rt_set_record_enabled (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
- void rt_set_record_safe (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
- void rt_set_monitoring (boost::shared_ptr<RouteList>, MonitorChoice, PBD::Controllable::GroupControlDisposition group_override);
/** temporary list of Diskstreams used only during load of 2.X sessions */
std::list<boost::shared_ptr<Diskstream> > _diskstreams_2X;
@@ -1821,8 +1984,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
*/
GraphEdges _current_route_graph;
- uint32_t next_control_id () const;
- int32_t _order_hint;
+ void ensure_route_presentation_info_gap (PresentationInfo::order_t, uint32_t gap_size);
bool ignore_route_processor_changes;
MidiClockTicker* midi_clock;
@@ -1848,6 +2010,12 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
static const uint32_t session_end_shift;
std::string _template_state_dir;
+
+ VCAManager* _vca_manager;
+
+ boost::shared_ptr<Route> get_midi_nth_route_by_id (PresentationInfo::order_t n) const;
+
+ std::string created_with;
};
diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h
index 25625e2..6c4bc3f 100644
--- a/libs/ardour/ardour/session_configuration_vars.h
+++ b/libs/ardour/ardour/session_configuration_vars.h
@@ -56,6 +56,14 @@ CONFIG_VARIABLE (std::string, timecode_generator_offset, "timecode-generator-off
CONFIG_VARIABLE (bool, glue_new_markers_to_bars_and_beats, "glue-new-markers-to-bars-and-beats", false)
CONFIG_VARIABLE (bool, midi_copy_is_fork, "midi-copy-is-fork", false)
CONFIG_VARIABLE (bool, glue_new_regions_to_bars_and_beats, "glue-new-regions-to-bars-and-beats", false)
+CONFIG_VARIABLE (bool, realtime_export, "realtime-export", false)
+
+/* Video-settings are saved with the session and belong to the session.
+ * headless ardour could remote control xjadeo for example.
+ */
+CONFIG_VARIABLE (bool, use_video_file_fps, "use-video-file-fps", false)
+CONFIG_VARIABLE (bool, videotimeline_pullup, "videotimeline-pullup", true)
+
/* These are GUI-only properties and should not be present in this
* context. There needs to be a new GUI-level session-scoped configuration
* variable header.
@@ -65,8 +73,6 @@ CONFIG_VARIABLE (uint16_t, wave_zoom_factor, "wave-zoom-factor", 2)
CONFIG_VARIABLE (bool, show_summary, "show-summary", true)
CONFIG_VARIABLE (bool, show_group_tabs, "show-group-tabs", true)
CONFIG_VARIABLE (bool, show_region_fades, "show-region-fades", true)
-CONFIG_VARIABLE (bool, use_video_file_fps, "use-video-file-fps", false)
-CONFIG_VARIABLE (bool, videotimeline_pullup, "videotimeline-pullup", true)
CONFIG_VARIABLE (bool, show_busses_on_meterbridge, "show-busses-on-meterbridge", false)
CONFIG_VARIABLE (bool, show_master_on_meterbridge, "show-master-on-meterbridge", true)
CONFIG_VARIABLE (bool, show_midi_on_meterbridge, "show-midi-on-meterbridge", true)
diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h
index cca7f12..8bb160b 100644
--- a/libs/ardour/ardour/session_event.h
+++ b/libs/ardour/ardour/session_event.h
@@ -84,26 +84,28 @@ public:
union {
void* ptr;
bool yes_or_no;
- framepos_t target2_frame;
+ framepos_t target2_frame;
Slave* slave;
Route* route;
};
union {
bool second_yes_or_no;
+ double control_value;
};
union {
bool third_yes_or_no;
};
- /* 4 members to handle a multi-group event handled in RT context */
+ /* 5 members to handle a multi-group event handled in RT context */
typedef boost::function<void (SessionEvent*)> RTeventCallback;
- boost::shared_ptr<RouteList> routes; /* apply to */
- boost::function<void (void)> rt_slot; /* what to call in RT context */
- RTeventCallback rt_return; /* called after rt_slot, with this event as an argument */
+ boost::shared_ptr<ControlList> controls; /* apply to */
+ boost::shared_ptr<RouteList> routes; /* apply to */
+ boost::function<void (void)> rt_slot; /* what to call in RT context */
+ RTeventCallback rt_return; /* called after rt_slot, with this event as an argument */
PBD::EventLoop* event_loop;
std::list<AudioRange> audio_range;
diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h
index e7ad162..cc6d301 100644
--- a/libs/ardour/ardour/session_playlists.h
+++ b/libs/ardour/ardour/session_playlists.h
@@ -54,12 +54,14 @@ public:
uint32_t source_use_count (boost::shared_ptr<const Source> src) const;
uint32_t region_use_count (boost::shared_ptr<Region> region) const;
template<class T> void foreach (T *obj, void (T::*func)(boost::shared_ptr<Playlist>));
+ void foreach (boost::function<void(boost::shared_ptr<const Playlist>)> functor);
void get (std::vector<boost::shared_ptr<Playlist> >&) const;
void unassigned (std::list<boost::shared_ptr<Playlist> > & list);
void destroy_region (boost::shared_ptr<Region>);
boost::shared_ptr<Crossfade> find_crossfade (const PBD::ID &);
void sync_all_regions_with_regions ();
std::vector<boost::shared_ptr<Playlist> > playlists_for_track (boost::shared_ptr<Track>) const;
+ uint32_t n_playlists() const;
private:
friend class Session;
@@ -69,7 +71,6 @@ private:
void remove_weak (boost::weak_ptr<Playlist>);
void track (bool, boost::weak_ptr<Playlist>);
- uint32_t n_playlists() const;
void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
void update_after_tempo_map_change ();
void add_state (XMLNode *, bool);
diff --git a/libs/ardour/ardour/sidechain.h b/libs/ardour/ardour/sidechain.h
new file mode 100644
index 0000000..9d44c3e
--- /dev/null
+++ b/libs/ardour/ardour/sidechain.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2006 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __ardour_sidechain_h__
+#define __ardour_sidechain_h__
+
+#include <string>
+
+#include "pbd/stateful.h"
+#include "ardour/ardour.h"
+#include "ardour/io_processor.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API SideChain : public IOProcessor
+{
+public:
+ SideChain (Session&, const std::string&);
+ virtual ~SideChain ();
+
+ void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
+
+ bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
+ bool configure_io (ChanCount in, ChanCount out);
+
+ XMLNode& state(bool full);
+ int set_state(const XMLNode&, int version);
+
+private:
+ /* disallow copy construction */
+ SideChain (const SideChain&);
+};
+
+} // namespace ARDOUR
+
+#endif // __ardour_sidechain_h__
diff --git a/libs/ardour/ardour/slavable.h b/libs/ardour/ardour/slavable.h
new file mode 100644
index 0000000..83675f0
--- /dev/null
+++ b/libs/ardour/ardour/slavable.h
@@ -0,0 +1,79 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_slavable_h__
+#define __ardour_slavable_h__
+
+#include <set>
+#include <string>
+#include <stdint.h>
+
+#include <boost/shared_ptr.hpp>
+
+#include "pbd/signals.h"
+
+#include "evoral/Parameter.hpp"
+
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+class VCA;
+class VCAManager;
+class AutomationControl;
+
+class LIBARDOUR_API Slavable
+{
+ public:
+ Slavable ();
+ virtual ~Slavable() {}
+
+ XMLNode& get_state () const;
+ int set_state (XMLNode const&, int);
+
+ void assign (boost::shared_ptr<VCA>);
+ void unassign (boost::shared_ptr<VCA>);
+
+ virtual boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id) = 0;
+
+ static std::string xml_node_name;
+
+ /* signal sent VCAManager once assignment is possible */
+ static PBD::Signal1<void,VCAManager*> Assign;
+
+ protected:
+ virtual int assign_controls (boost::shared_ptr<VCA>);
+ virtual int unassign_controls (boost::shared_ptr<VCA>);
+
+ private:
+ mutable Glib::Threads::RWLock master_lock;
+ std::set<uint32_t> _masters;
+ PBD::ScopedConnection assign_connection;
+ PBD::ScopedConnectionList unassign_connections;
+
+ int do_assign (VCAManager* s);
+ void weak_unassign (boost::weak_ptr<VCA>);
+
+};
+
+} // namespace ARDOUR
+
+#endif /* __ardour_slavable_h__ */
diff --git a/libs/ardour/ardour/slavable_automation_control.h b/libs/ardour/ardour/slavable_automation_control.h
new file mode 100644
index 0000000..45b5555
--- /dev/null
+++ b/libs/ardour/ardour/slavable_automation_control.h
@@ -0,0 +1,117 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_slavable_automation_control_h__
+#define __ardour_slavable_automation_control_h__
+
+#include "ardour/automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
+{
+ public:
+ SlavableAutomationControl(ARDOUR::Session&,
+ const Evoral::Parameter& parameter,
+ const ParameterDescriptor& desc,
+ boost::shared_ptr<ARDOUR::AutomationList> l=boost::shared_ptr<ARDOUR::AutomationList>(),
+ const std::string& name="");
+
+ double get_value () const;
+
+ void add_master (boost::shared_ptr<AutomationControl>);
+ void remove_master (boost::shared_ptr<AutomationControl>);
+ void clear_masters ();
+ bool slaved_to (boost::shared_ptr<AutomationControl>) const;
+ bool slaved () const;
+ double get_masters_value () const {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ return get_masters_value_locked ();
+ }
+
+ /* for toggled/boolean controls, returns a count of the number of
+ masters currently enabled. For other controls, returns zero.
+ */
+ int32_t get_boolean_masters () const;
+
+ std::vector<PBD::ID> masters () const;
+
+ PBD::Signal0<void> MasterStatusChange;
+
+ protected:
+
+ class MasterRecord {
+ public:
+ MasterRecord (boost::shared_ptr<AutomationControl> gc, double r)
+ : _master (gc)
+ , _ratio (r)
+ {}
+
+ boost::shared_ptr<AutomationControl> master() const { return _master; }
+
+ /* for boolean/toggled controls, we store a boolean value to
+ * indicate if this master returned true/false (1.0/0.0) from
+ * ::get_value() after its most recent change.
+ */
+
+ bool yn() const { return _yn; }
+ void set_yn (bool yn) { _yn = yn; }
+
+ /* for non-boolean/non-toggled controls, we store a ratio that
+ * connects the value of the master with the value of this
+ * slave. See comments in the source for more details on how
+ * this is computed and used.
+ */
+
+ double ratio () const { return _ratio; }
+ void reset_ratio (double r) { _ratio = r; }
+
+ PBD::ScopedConnection connection;
+
+ private:
+ boost::shared_ptr<AutomationControl> _master;
+ union {
+ double _ratio;
+ bool _yn;
+ };
+ };
+
+ mutable Glib::Threads::RWLock master_lock;
+ typedef std::map<PBD::ID,MasterRecord> Masters;
+ Masters _masters;
+ PBD::ScopedConnectionList masters_connections;
+
+ void master_going_away (boost::weak_ptr<AutomationControl>);
+ double get_value_locked() const;
+ void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+ void update_boolean_masters_records (boost::shared_ptr<AutomationControl>);
+
+ virtual void master_changed (bool from_self, GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>);
+ virtual void recompute_masters_ratios (double val) { /* do nothing by default */}
+ virtual double get_masters_value_locked () const;
+ virtual void pre_remove_master (boost::shared_ptr<AutomationControl>) {}
+ virtual void post_add_master (boost::shared_ptr<AutomationControl>) {}
+
+
+};
+
+} // namespace ARDOUR
+
+#endif /* __ardour_slavable_automation_control_h__ */
diff --git a/libs/ardour/ardour/solo_control.h b/libs/ardour/ardour/solo_control.h
new file mode 100644
index 0000000..3f0f522
--- /dev/null
+++ b/libs/ardour/ardour/solo_control.h
@@ -0,0 +1,118 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_solo_control_h__
+#define __ardour_solo_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+class Soloable;
+class Muteable;
+
+class LIBARDOUR_API SoloControl : public SlavableAutomationControl
+{
+ public:
+ SoloControl (Session& session, std::string const & name, Soloable& soloable, Muteable& m);
+
+ double get_value () const;
+
+ bool can_solo() const;
+
+ /* Export additional API so that objects that only get access
+ * to a Controllable/AutomationControl can do more fine-grained
+ * operations with respect to solo. Obviously, they would need
+ * to dynamic_cast<SoloControl> first.
+ *
+ * Solo state is not representable by a single scalar value,
+ * so set_value() and get_value() is not enough.
+ *
+ * This means that the Controllable is technically
+ * asymmetric. It is possible to call ::set_value (0.0) to
+ * disable (self)solo, and then call ::get_value() and get a
+ * return of 1.0 because the control is soloed by
+ * upstream/downstream or a master.
+ */
+
+ void mod_solo_by_others_upstream (int32_t delta);
+ void mod_solo_by_others_downstream (int32_t delta);
+
+ /* API to check different aspects of solo substate
+ */
+
+ bool self_soloed () const {
+ return _self_solo;
+ }
+ bool soloed_by_masters () const {
+ return get_masters_value();
+ }
+ bool soloed_by_self_or_masters () const {
+ return self_soloed() || get_masters_value ();
+ }
+ bool soloed_by_others () const {
+ return _soloed_by_others_downstream || _soloed_by_others_upstream || get_masters_value ();
+ }
+ uint32_t soloed_by_others_upstream () const {
+ return _soloed_by_others_upstream;
+ }
+ uint32_t soloed_by_others_downstream () const {
+ return _soloed_by_others_downstream;
+ }
+ bool soloed() const { return self_soloed() || soloed_by_others(); }
+
+ /* The session object needs to respond to solo
+ changes, but to do so accurately it needs to know if we transition
+ into or out of solo. The normal Changed signal doesn't make that
+ possible.
+ */
+
+ int32_t transitioned_into_solo () const { return _transition_into_solo; }
+
+ void clear_all_solo_state ();
+
+ int set_state (XMLNode const&, int);
+ XMLNode& get_state ();
+
+ protected:
+ void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+ void master_changed (bool from_self, GroupControlDisposition, boost::shared_ptr<AutomationControl> m);
+ void pre_remove_master (boost::shared_ptr<AutomationControl>);
+ void post_add_master (boost::shared_ptr<AutomationControl>);
+
+ private:
+ Soloable& _soloable;
+ Muteable& _muteable;
+ bool _self_solo;
+ uint32_t _soloed_by_others_upstream;
+ uint32_t _soloed_by_others_downstream;
+ int32_t _transition_into_solo;
+
+ void set_self_solo (bool yn);
+ void set_mute_master_solo ();
+};
+
+} /* namespace */
+
+#endif /* __libardour_solo_control_h__ */
diff --git a/libs/ardour/ardour/solo_isolate_control.h b/libs/ardour/ardour/solo_isolate_control.h
new file mode 100644
index 0000000..1e49469
--- /dev/null
+++ b/libs/ardour/ardour/solo_isolate_control.h
@@ -0,0 +1,91 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_solo_isolate_control_h__
+#define __ardour_solo_isolate_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+class Session;
+class Soloable;
+class Muteable;
+
+class LIBARDOUR_API SoloIsolateControl : public SlavableAutomationControl
+{
+ public:
+ SoloIsolateControl (Session& session, std::string const & name, Soloable& soloable, Muteable& m);
+
+ double get_value () const;
+
+ /* Export additional API so that objects that only get access
+ * to a Controllable/AutomationControl can do more fine-grained
+ * operations with respect to solo isolate. Obviously, they would need
+ * to dynamic_cast<SoloControl> first.
+ *
+ * Solo Isolate state is not representable by a single scalar value,
+ * so set_value() and get_value() is not enough.
+ *
+ * This means that the Controllable is technically
+ * asymmetric. It is possible to call ::set_value (0.0) to
+ * disable (self)solo, and then call ::get_value() and get a
+ * return of 1.0 because the control is isolated by
+ * upstream/downstream or a master.
+ */
+
+ void mod_solo_isolated_by_upstream (int32_t delta);
+
+ /* API to check different aspects of solo isolate substate
+ */
+
+ uint32_t solo_isolated_by_upstream () const {
+ return _solo_isolated_by_upstream;
+ }
+ bool self_solo_isolated () const {
+ return _solo_isolated;
+ }
+ bool solo_isolated() const { return self_solo_isolated() || solo_isolated_by_upstream(); }
+
+ int set_state (XMLNode const&, int);
+ XMLNode& get_state ();
+
+ protected:
+ void master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>);
+ void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+ private:
+ Soloable& _soloable;
+ Muteable& _muteable;
+ bool _solo_isolated;
+ uint32_t _solo_isolated_by_upstream;
+
+ void set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override);
+
+};
+
+} /* namespace */
+
+#endif /* __libardour_solo_isolate_control_h__ */
diff --git a/libs/ardour/ardour/solo_safe_control.h b/libs/ardour/ardour/solo_safe_control.h
new file mode 100644
index 0000000..e969959
--- /dev/null
+++ b/libs/ardour/ardour/solo_safe_control.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_solo_safe_control_h__
+#define __ardour_solo_safe_control_h__
+
+#include <string>
+
+#include "ardour/slavable_automation_control.h"
+
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API SoloSafeControl : public SlavableAutomationControl
+{
+ public:
+ SoloSafeControl (Session& session, std::string const & name);
+
+ double get_value () const;
+
+ bool solo_safe() const { return _solo_safe; }
+
+ int set_state (XMLNode const&, int);
+ XMLNode& get_state ();
+
+ protected:
+ void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+ private:
+ bool _solo_safe;
+};
+
+} /* namespace */
+
+#endif /* __libardour_solo_safe_control_h__ */
diff --git a/libs/ardour/ardour/soloable.h b/libs/ardour/ardour/soloable.h
new file mode 100644
index 0000000..6dafac7
--- /dev/null
+++ b/libs/ardour/ardour/soloable.h
@@ -0,0 +1,38 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_soloable_h__
+#define __ardour_soloable_h__
+
+#include <stdint.h>
+
+namespace ARDOUR {
+
+class Soloable {
+ public:
+ virtual ~Soloable() {}
+
+ virtual void push_solo_upstream (int32_t delta) = 0;
+ virtual void push_solo_isolate_upstream (int32_t delta) = 0;
+ virtual bool is_safe () const = 0;
+ virtual bool can_solo () const = 0;
+};
+
+} /* namespace */
+
+#endif /* __ardour_soloable_h__ */
diff --git a/libs/ardour/ardour/stripable.h b/libs/ardour/ardour/stripable.h
new file mode 100644
index 0000000..2464ddd
--- /dev/null
+++ b/libs/ardour/ardour/stripable.h
@@ -0,0 +1,190 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_stripable_h__
+#define __libardour_stripable_h__
+
+#include <stdint.h>
+
+#include <string>
+#include <boost/utility.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "pbd/signals.h"
+
+#include "ardour/presentation_info.h"
+#include "ardour/session_object.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class AutomationControl;
+class GainControl;
+class PeakMeter;
+class SoloControl;
+class MuteControl;
+class PhaseControl;
+class SoloIsolateControl;
+class SoloSafeControl;
+class MonitorControl;
+class MonitorProcessor;
+class RecordEnableControl;
+class RecordSafeControl;
+
+/* This is a virtual base class for any object that needs to be potentially
+ * represented by a control-centric user interface using the general model of a
+ * mixing console "strip" - a collection of controls that determine the state
+ * and behaviour of the object.
+ */
+
+class LIBARDOUR_API Stripable : public SessionObject {
+ public:
+ Stripable (Session& session, std::string const & name, PresentationInfo const &);
+ virtual ~Stripable () {}
+
+ /* XXX
+ midi on/off
+ */
+
+ bool is_auditioner() const { return _presentation_info.flags() & PresentationInfo::Auditioner; }
+ bool is_master() const { return _presentation_info.flags() & PresentationInfo::MasterOut; }
+ bool is_monitor() const { return _presentation_info.flags() & PresentationInfo::MonitorOut; }
+
+ int set_state (XMLNode const&, int);
+
+ bool is_hidden() const { return _presentation_info.flags() & PresentationInfo::Hidden; }
+ bool is_selected() const { return _presentation_info.flags() & PresentationInfo::Selected; }
+
+ PresentationInfo const & presentation_info () const { return _presentation_info; }
+ PresentationInfo& presentation_info () { return _presentation_info; }
+
+ /* set just the order */
+
+ void set_presentation_order (PresentationInfo::order_t, bool notify_class_listeners = true);
+
+ struct PresentationOrderSorter {
+ bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
+ return a->presentation_info().order() < b->presentation_info().order();
+ }
+ };
+
+ /* gui's call this for their own purposes. */
+
+ PBD::Signal2<void,std::string,void*> gui_changed;
+
+ /***************************************************************
+ * Pure interface begins here
+ ***************************************************************/
+
+ virtual boost::shared_ptr<PeakMeter> peak_meter() = 0;
+ virtual boost::shared_ptr<const PeakMeter> peak_meter() const = 0;
+
+ virtual boost::shared_ptr<GainControl> gain_control() const = 0;
+
+ virtual boost::shared_ptr<SoloControl> solo_control() const = 0;
+ virtual boost::shared_ptr<SoloIsolateControl> solo_isolate_control() const = 0;
+ virtual boost::shared_ptr<SoloSafeControl> solo_safe_control() const = 0;
+ virtual boost::shared_ptr<MuteControl> mute_control() const = 0;
+
+ virtual boost::shared_ptr<PhaseControl> phase_control() const = 0;
+ virtual boost::shared_ptr<GainControl> trim_control() const = 0;
+
+ virtual boost::shared_ptr<MonitorControl> monitoring_control() const = 0;
+
+ virtual boost::shared_ptr<AutomationControl> rec_enable_control() const { return boost::shared_ptr<AutomationControl>(); }
+ virtual boost::shared_ptr<AutomationControl> rec_safe_control() const { return boost::shared_ptr<AutomationControl>(); }
+
+ /* "well-known" controls for panning. Any or all of these may return
+ * null.
+ */
+ virtual boost::shared_ptr<AutomationControl> pan_azimuth_control() const = 0;
+ virtual boost::shared_ptr<AutomationControl> pan_elevation_control() const = 0;
+ virtual boost::shared_ptr<AutomationControl> pan_width_control() const = 0;
+ virtual boost::shared_ptr<AutomationControl> pan_frontback_control() const = 0;
+ virtual boost::shared_ptr<AutomationControl> pan_lfe_control() const = 0;
+
+ /* "well-known" controls for an EQ in this route. Any or all may
+ * be null. eq_band_cnt() must return 0 if there is no EQ present.
+ * Passing an @param band value >= eq_band_cnt() will guarantee the
+ * return of a null ptr (or an empty string for eq_band_name()).
+ */
+ virtual uint32_t eq_band_cnt () const = 0;
+ virtual std::string eq_band_name (uint32_t) const = 0;
+ virtual boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const = 0;
+ virtual boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const = 0;
+ virtual boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const = 0;
+ virtual boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const = 0;
+ virtual boost::shared_ptr<AutomationControl> eq_enable_controllable () const = 0;
+ virtual boost::shared_ptr<AutomationControl> eq_hpf_controllable () const = 0;
+
+ /* "well-known" controls for a compressor in this route. Any or all may
+ * be null.
+ */
+ virtual boost::shared_ptr<AutomationControl> comp_enable_controllable () const = 0;
+ virtual boost::shared_ptr<AutomationControl> comp_threshold_controllable () const = 0;
+ virtual boost::shared_ptr<AutomationControl> comp_speed_controllable () const = 0;
+ virtual boost::shared_ptr<AutomationControl> comp_mode_controllable () const = 0;
+ virtual boost::shared_ptr<AutomationControl> comp_makeup_controllable () const = 0;
+ virtual boost::shared_ptr<AutomationControl> comp_redux_controllable () const = 0;
+
+ /* @param mode must be supplied by the comp_mode_controllable(). All other values
+ * result in undefined behaviour
+ */
+ virtual std::string comp_mode_name (uint32_t mode) const = 0;
+
+ /* @param mode - as for comp mode name. This returns the name for the
+ * parameter/control accessed via comp_speed_controllable(), which can
+ * be mode dependent.
+ */
+ virtual std::string comp_speed_name (uint32_t mode) const = 0;
+
+ /* "well-known" controls for sends to well-known busses in this route. Any or all may
+ * be null.
+ *
+ * In Mixbus, these are the sends that connect to the mixbusses.
+ * In Ardour, these are user-created sends that connect to user-created
+ * Aux busses.
+ */
+ virtual boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const = 0;
+ virtual boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const = 0;
+
+ /* for the same value of @param n, this returns the name of the send
+ * associated with the pair of controllables returned by the above two methods.
+ */
+ virtual std::string send_name (uint32_t n) const = 0;
+
+ /* well known control that enables/disables sending to the master bus.
+ *
+ * In Ardour, this returns null.
+ * In Mixbus, it will return a suitable control, or null depending on
+ * the route.
+ */
+ virtual boost::shared_ptr<AutomationControl> master_send_enable_controllable () const = 0;
+
+ virtual bool muted_by_others_soloing () const = 0;
+
+ virtual boost::shared_ptr<MonitorProcessor> monitor_control() const = 0;
+
+ protected:
+ PresentationInfo _presentation_info;
+};
+
+}
+
+#endif /* __libardour_stripable_h__ */
diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h
index bb22a79..1db1f65 100644
--- a/libs/ardour/ardour/tempo.h
+++ b/libs/ardour/ardour/tempo.h
@@ -27,15 +27,17 @@
#include <glibmm/threads.h>
#include "pbd/undo.h"
+
#include "pbd/stateful.h"
#include "pbd/statefuldestructible.h"
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
#include "ardour/ardour.h"
class BBTTest;
class FrameposPlusBeatsTest;
+class FrameposMinusBeatsTest;
class TempoTest;
class XMLNode;
@@ -47,14 +49,29 @@ class TempoMap;
/** Tempo, the speed at which musical time progresses (BPM). */
class LIBARDOUR_API Tempo {
public:
+ /**
+ * @param bpm Beats Per Minute
+ * @param type Note Type (default `4': quarter note)
+ */
Tempo (double bpm, double type=4.0) // defaulting to quarter note
: _beats_per_minute (bpm), _note_type(type) {}
- double beats_per_minute () const { return _beats_per_minute;}
- double note_type () const { return _note_type;}
+ /* ..or more aptly 'pulse divisions per minute'.
+ Nothing to do with actual beats, which are defined by the meter and tempo.
+ */
+ double beats_per_minute () const { return _beats_per_minute; }
+ void set_beats_per_minute (double bpm) { _beats_per_minute = bpm; }
+ double note_type () const { return _note_type; }
+ double pulses_per_minute () const { return _beats_per_minute / _note_type; }
+ /** audio samples per beat
+ * @param sr samplerate
+ */
double frames_per_beat (framecnt_t sr) const {
return (60.0 * sr) / _beats_per_minute;
}
+ double frames_per_pulse (framecnt_t sr) const {
+ return (_note_type * 60.0 * sr) / _beats_per_minute;
+ }
protected:
double _beats_per_minute;
@@ -89,26 +106,21 @@ class LIBARDOUR_API Meter {
/** A section of timeline with a certain Tempo or Meter. */
class LIBARDOUR_API MetricSection {
public:
- MetricSection (const Timecode::BBT_Time& start)
- : _start (start), _frame (0), _movable (true) {}
- MetricSection (framepos_t start)
- : _frame (start), _movable (true) {}
+ MetricSection (double pulse, framepos_t frame, PositionLockStyle pls, bool is_tempo)
+ : _pulse (pulse), _frame (frame), _movable (true), _position_lock_style (pls), _is_tempo (is_tempo) {}
virtual ~MetricSection() {}
- const Timecode::BBT_Time& start() const { return _start; }
- framepos_t frame() const { return _frame; }
-
- void set_movable (bool yn) { _movable = yn; }
- bool movable() const { return _movable; }
+ const double& pulse () const { return _pulse; }
+ void set_pulse (double pulse) { _pulse = pulse; }
+ framepos_t frame() const { return _frame; }
virtual void set_frame (framepos_t f) {
_frame = f;
}
- virtual void set_start (const Timecode::BBT_Time& w) {
- _start = w;
- }
+ void set_movable (bool yn) { _movable = yn; }
+ bool movable() const { return _movable; }
/* MeterSections are not stateful in the full sense,
but we do want them to control their own
@@ -116,44 +128,108 @@ class LIBARDOUR_API MetricSection {
*/
virtual XMLNode& get_state() const = 0;
- private:
- Timecode::BBT_Time _start;
+ PositionLockStyle position_lock_style () const { return _position_lock_style; }
+ void set_position_lock_style (PositionLockStyle ps) { _position_lock_style = ps; }
+ bool is_tempo () const { return _is_tempo; }
+
+private:
+ double _pulse;
framepos_t _frame;
bool _movable;
+ PositionLockStyle _position_lock_style;
+ const bool _is_tempo;
};
/** A section of timeline with a certain Meter. */
class LIBARDOUR_API MeterSection : public MetricSection, public Meter {
public:
- MeterSection (const Timecode::BBT_Time& start, double bpb, double note_type)
- : MetricSection (start), Meter (bpb, note_type) {}
- MeterSection (framepos_t start, double bpb, double note_type)
- : MetricSection (start), Meter (bpb, note_type) {}
+ MeterSection (double pulse, framepos_t frame, double beat, const Timecode::BBT_Time& bbt, double bpb, double note_type, PositionLockStyle pls)
+ : MetricSection (pulse, frame, pls, false), Meter (bpb, note_type), _bbt (bbt), _beat (beat) {}
+
MeterSection (const XMLNode&);
static const std::string xml_state_node_name;
XMLNode& get_state() const;
+
+ void set_beat (std::pair<double, Timecode::BBT_Time>& w) {
+ _beat = w.first;
+ _bbt = w.second;
+ }
+
+ const Timecode::BBT_Time& bbt() const { return _bbt; }
+ const double& beat () const { return _beat; }
+ void set_beat (double beat) { _beat = beat; }
+
+private:
+ Timecode::BBT_Time _bbt;
+ double _beat;
};
/** A section of timeline with a certain Tempo. */
class LIBARDOUR_API TempoSection : public MetricSection, public Tempo {
public:
- TempoSection (const Timecode::BBT_Time& start, double qpm, double note_type)
- : MetricSection (start), Tempo (qpm, note_type), _bar_offset (-1.0) {}
- TempoSection (framepos_t start, double qpm, double note_type)
- : MetricSection (start), Tempo (qpm, note_type), _bar_offset (-1.0) {}
+ enum Type {
+ Ramp,
+ Constant,
+ };
+
+ TempoSection (const double& pulse, const framepos_t& frame, double qpm, double note_type, Type tempo_type, PositionLockStyle pls)
+ : MetricSection (pulse, frame, pls, true), Tempo (qpm, note_type), _type (tempo_type), _c_func (0.0), _active (true), _locked_to_meter (false) {}
+
TempoSection (const XMLNode&);
static const std::string xml_state_node_name;
XMLNode& get_state() const;
- void update_bar_offset_from_bbt (const Meter&);
- void update_bbt_time_from_bar_offset (const Meter&);
- double bar_offset() const { return _bar_offset; }
+ double c_func () const { return _c_func; }
+ void set_c_func (double c_func) { _c_func = c_func; }
+
+ void set_type (Type type);
+ Type type () const { return _type; }
+
+ bool active () const { return _active; }
+ void set_active (bool yn) { _active = yn; }
+
+ bool locked_to_meter () const { return _locked_to_meter; }
+ void set_locked_to_meter (bool yn) { _locked_to_meter = yn; }
+
+ double tempo_at_frame (const framepos_t& frame, const framecnt_t& frame_rate) const;
+ framepos_t frame_at_tempo (const double& ppm, const double& beat, const framecnt_t& frame_rate) const;
+
+ double tempo_at_pulse (const double& pulse) const;
+ double pulse_at_tempo (const double& ppm, const framepos_t& frame, const framecnt_t& frame_rate) const;
+
+ double pulse_at_frame (const framepos_t& frame, const framepos_t& frame_rate) const;
+ framepos_t frame_at_pulse (const double& pulse, const framecnt_t& frame_rate) const;
+
+ double compute_c_func_pulse (const double& end_bpm, const double& end_pulse, const framecnt_t& frame_rate);
+ double compute_c_func_frame (const double& end_bpm, const framepos_t& end_frame, const framecnt_t& frame_rate) const;
+
+ Timecode::BBT_Time legacy_bbt () { return _legacy_bbt; }
private:
+
+ framepos_t minute_to_frame (const double& time, const framecnt_t& frame_rate) const;
+ double frame_to_minute (const framepos_t& frame, const framecnt_t& frame_rate) const;
+
+ /* tempo ramp functions. zero-based with time in minutes,
+ * 'tick tempo' in ticks per minute and tempo in bpm.
+ * time relative to section start.
+ */
+ double a_func (double end_tpm, double c_func) const;
+ double c_func (double end_tpm, double end_time) const;
+
+ double pulse_tempo_at_time (const double& time) const;
+ double time_at_pulse_tempo (const double& pulse_tempo) const;
+
+ double pulse_tempo_at_pulse (const double& pulse) const;
+ double pulse_at_pulse_tempo (const double& pulse_tempo) const;
+
+ double pulse_at_time (const double& time) const;
+ double time_at_pulse (const double& pulse) const;
+
/* this value provides a fractional offset into the bar in which
the tempo section is located in. A value of 0.0 indicates that
it occurs on the first beat of the bar, a value of 0.5 indicates
@@ -162,7 +238,11 @@ class LIBARDOUR_API TempoSection : public MetricSection, public Tempo {
this enables us to keep the tempo change at the same relative
position within the bar if/when the meter changes.
*/
- double _bar_offset;
+ Type _type;
+ double _c_func;
+ bool _active;
+ bool _locked_to_meter;
+ Timecode::BBT_Time _legacy_bbt;
};
typedef std::list<MetricSection*> Metrics;
@@ -178,7 +258,7 @@ class LIBARDOUR_API TempoMetric {
void set_tempo (const Tempo& t) { _tempo = &t; }
void set_meter (const Meter& m) { _meter = &m; }
void set_frame (framepos_t f) { _frame = f; }
- void set_start (const Timecode::BBT_Time& t) { _start = t; }
+ void set_pulse (const double& p) { _pulse = p; }
void set_metric (const MetricSection* section) {
const MeterSection* meter;
@@ -189,22 +269,25 @@ class LIBARDOUR_API TempoMetric {
set_tempo(*tempo);
}
- set_frame(section->frame());
- set_start(section->start());
+ set_frame (section->frame());
+ set_pulse (section->pulse());
}
const Meter& meter() const { return *_meter; }
const Tempo& tempo() const { return *_tempo; }
framepos_t frame() const { return _frame; }
- const Timecode::BBT_Time& start() const { return _start; }
+ const double& pulse() const { return _pulse; }
private:
const Meter* _meter;
const Tempo* _tempo;
framepos_t _frame;
- Timecode::BBT_Time _start;
+ double _pulse;
};
+/** Tempo Map - mapping of timecode to musical time.
+ * convert audio-samples, sample-rate to Bar/Beat/Tick, Meter/Tempo
+ */
class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
{
public:
@@ -220,14 +303,15 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
struct BBTPoint {
framepos_t frame;
- const MeterSection* meter;
- const TempoSection* tempo;
+ Meter meter;
+ Tempo tempo;
+ double c;
uint32_t bar;
uint32_t beat;
- BBTPoint (const MeterSection& m, const TempoSection& t, framepos_t f,
- uint32_t b, uint32_t e)
- : frame (f), meter (&m), tempo (&t), bar (b), beat (e) {}
+ BBTPoint (const MeterSection& m, const Tempo& t, framepos_t f,
+ uint32_t b, uint32_t e, double func_c)
+ : frame (f), meter (m.divisions_per_bar(), m.note_divisor()), tempo (t.beats_per_minute(), t.note_type()), c (func_c), bar (b), beat (e) {}
Timecode::BBT_Time bbt() const { return Timecode::BBT_Time (bar, beat, 0); }
operator Timecode::BBT_Time() const { return bbt(); }
@@ -235,19 +319,83 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
bool is_bar() const { return beat == 1; }
};
- typedef std::vector<BBTPoint> BBTPointList;
-
template<class T> void apply_with_metrics (T& obj, void (T::*method)(const Metrics&)) {
Glib::Threads::RWLock::ReaderLock lm (lock);
- (obj.*method)(metrics);
+ (obj.*method)(_metrics);
}
- void get_grid (BBTPointList::const_iterator&, BBTPointList::const_iterator&,
+ void get_grid (std::vector<BBTPoint>&,
framepos_t start, framepos_t end);
+ static const Tempo& default_tempo() { return _default_tempo; }
+ static const Meter& default_meter() { return _default_meter; }
+
+ /* because tempos may be ramped, this is only valid for the instant requested.*/
+ double frames_per_beat_at (const framepos_t&, const framecnt_t& sr) const;
+
+ const TempoSection& tempo_section_at_frame (framepos_t frame) const;
+ const MeterSection& meter_section_at_frame (framepos_t frame) const;
+ const MeterSection& meter_section_at_beat (double beat) const;
+
+ /** add a tempo section locked to pls. ignored values will be set in recompute_tempi()
+ * @param pulse pulse position of new section. ignored if pls == AudioTime
+ * @param frame frame position of new section. ignored if pls == MusicTime
+ * @param type type of new tempo section (Ramp, Constant)
+ */
+ TempoSection* add_tempo (const Tempo&, const double& pulse, const framepos_t& frame, TempoSection::Type type, PositionLockStyle pls);
+
+ /** add an meter section locked to pls.. ignored values will be set in recompute_meters()
+ * @param beat beat position of new section
+ * @param where bbt position of new section
+ * @param frame frame position of new section. ignored if pls == MusicTime
+ */
+ MeterSection* add_meter (const Meter&, const double& beat, const Timecode::BBT_Time& where, const framepos_t& frame, PositionLockStyle pls);
+
+ void remove_tempo (const TempoSection&, bool send_signal);
+ void remove_meter (const MeterSection&, bool send_signal);
+
+ void replace_tempo (const TempoSection&, const Tempo&, const double& pulse, const framepos_t& frame
+ , TempoSection::Type type, PositionLockStyle pls);
+
+ void replace_meter (const MeterSection&, const Meter&, const Timecode::BBT_Time& where, const framepos_t& frame
+ , PositionLockStyle pls);
+
+ framepos_t round_to_bar (framepos_t frame, RoundMode dir);
+ framepos_t round_to_beat (framepos_t frame, RoundMode dir);
+ framepos_t round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir);
+
+ void set_length (framepos_t frames);
+
+ XMLNode& get_state (void);
+ int set_state (const XMLNode&, int version);
+
+ void dump (const Metrics& metrics, std::ostream&) const;
+ void clear ();
+
+ TempoMetric metric_at (Timecode::BBT_Time bbt) const;
+
+ /** Return the TempoMetric at frame @p t, and point @p last to the latest
+ * metric change <= t, if it is non-NULL.
+ */
+ TempoMetric metric_at (framepos_t, Metrics::const_iterator* last=NULL) const;
+
+ Metrics::const_iterator metrics_end() { return _metrics.end(); }
+
+ void change_existing_tempo_at (framepos_t, double bpm, double note_type);
+ void change_initial_tempo (double bpm, double note_type);
+
+ void insert_time (framepos_t, framecnt_t);
+ bool remove_time (framepos_t where, framecnt_t amount); //returns true if anything was moved
+
+ int n_tempos () const;
+ int n_meters () const;
+
+ framecnt_t frame_rate () const { return _frame_rate; }
+
/* TEMPO- AND METER-SENSITIVE FUNCTIONS
- bbt_time(), bbt_time_rt(), frame_time() and bbt_duration_at()
+ bbt_at_frame(), frame_at_bbt(), beat_at_frame(), frame_at_beat(), tempo_at_beat()
+ and bbt_duration_at()
are all sensitive to tempo and meter, and will give answers
that align with the grid formed by tempo and meter sections.
@@ -255,14 +403,34 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
whose location is canonically defined in beats.
*/
- void bbt_time (framepos_t when, Timecode::BBT_Time&);
+ double beat_at_frame (const framecnt_t& frame) const;
+ framepos_t frame_at_beat (const double& beat) const;
+
+ Tempo tempo_at_frame (const framepos_t& frame) const;
+ framepos_t frame_at_tempo (const Tempo& tempo) const;
+
+ Tempo tempo_at_beat (const double& beat) const;
+
+ const Meter& meter_at_frame (framepos_t) const;
+
+ /* you probably only need to use pulses when moving tempos */
+ double pulse_at_beat (const double& beat) const;
+ double beat_at_pulse (const double& pulse) const;
+
+ double pulse_at_frame (const framecnt_t& frame) const;
+ framepos_t frame_at_pulse (const double& pulse) const;
+
+ /* bbt - it's nearly always better to use beats.*/
+ Timecode::BBT_Time bbt_at_frame (framepos_t when);
+ Timecode::BBT_Time bbt_at_frame_rt (framepos_t when);
+ framepos_t frame_at_bbt (const Timecode::BBT_Time&);
+
+ double beat_at_bbt (const Timecode::BBT_Time& bbt);
+ Timecode::BBT_Time bbt_at_beat (const double& beats);
+
+ double pulse_at_bbt (const Timecode::BBT_Time& bbt);
+ Timecode::BBT_Time bbt_at_pulse (const double& pulse);
- /* realtime safe variant of ::bbt_time(), will throw
- std::logic_error if the map is not large enough
- to provide an answer.
- */
- void bbt_time_rt (framepos_t when, Timecode::BBT_Time&);
- framepos_t frame_time (const Timecode::BBT_Time&);
framecnt_t bbt_duration_at (framepos_t, const Timecode::BBT_Time&, int dir);
/* TEMPO-SENSITIVE FUNCTIONS
@@ -280,85 +448,75 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
framepos_t framepos_minus_beats (framepos_t, Evoral::Beats) const;
Evoral::Beats framewalk_to_beats (framepos_t pos, framecnt_t distance) const;
- static const Tempo& default_tempo() { return _default_tempo; }
- static const Meter& default_meter() { return _default_meter; }
+ void gui_move_tempo (TempoSection*, const framepos_t& frame, const int& sub_num);
+ void gui_move_meter (MeterSection*, const framepos_t& frame);
+ bool gui_change_tempo (TempoSection*, const Tempo& bpm);
+ void gui_dilate_tempo (TempoSection* tempo, const framepos_t& frame, const framepos_t& end_frame, const double& pulse);
- const Tempo& tempo_at (framepos_t) const;
- const Meter& meter_at (framepos_t) const;
+ double exact_beat_at_frame (const framepos_t& frame, const int32_t sub_num);
- const TempoSection& tempo_section_at (framepos_t) const;
- const MeterSection& meter_section_at (framepos_t) const;
+ std::pair<double, framepos_t> predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt);
+ bool can_solve_bbt (TempoSection* section, const Timecode::BBT_Time& bbt);
- void add_tempo (const Tempo&, Timecode::BBT_Time where);
- void add_meter (const Meter&, Timecode::BBT_Time where);
+ PBD::Signal0<void> MetricPositionChanged;
+ void fix_legacy_session();
- void remove_tempo (const TempoSection&, bool send_signal);
- void remove_meter (const MeterSection&, bool send_signal);
+private:
- void replace_tempo (const TempoSection&, const Tempo&, const Timecode::BBT_Time& where);
- void replace_meter (const MeterSection&, const Meter&, const Timecode::BBT_Time& where);
+ double beat_at_frame_locked (const Metrics& metrics, const framecnt_t& frame) const;
+ framepos_t frame_at_beat_locked (const Metrics& metrics, const double& beat) const;
- framepos_t round_to_bar (framepos_t frame, RoundMode dir);
- framepos_t round_to_beat (framepos_t frame, RoundMode dir);
- framepos_t round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir);
+ double pulse_at_beat_locked (const Metrics& metrics, const double& beat) const;
+ double beat_at_pulse_locked (const Metrics& metrics, const double& pulse) const;
- void set_length (framepos_t frames);
+ double pulse_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const;
+ framepos_t frame_at_pulse_locked (const Metrics& metrics, const double& pulse) const;
- XMLNode& get_state (void);
- int set_state (const XMLNode&, int version);
-
- void dump (std::ostream&) const;
- void clear ();
+ Tempo tempo_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const;
+ framepos_t frame_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) const;
- TempoMetric metric_at (Timecode::BBT_Time bbt) const;
+ Timecode::BBT_Time bbt_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const;
+ framepos_t frame_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time&) const;
- /** Return the TempoMetric at frame @p t, and point @p last to the latest
- * metric change <= t, if it is non-NULL.
- */
- TempoMetric metric_at (framepos_t, Metrics::const_iterator* last=NULL) const;
+ double beat_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const ;
+ Timecode::BBT_Time bbt_at_beat_locked (const Metrics& metrics, const double& beats) const;
- Metrics::const_iterator metrics_end() { return metrics.end(); }
+ double pulse_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const;
+ Timecode::BBT_Time bbt_at_pulse_locked (const Metrics& metrics, const double& pulse) const;
- void change_existing_tempo_at (framepos_t, double bpm, double note_type);
- void change_initial_tempo (double bpm, double note_type);
+ const TempoSection& tempo_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const;
+ const TempoSection& tempo_section_at_beat_locked (const Metrics& metrics, const double& beat) const;
- void insert_time (framepos_t, framecnt_t);
- bool remove_time (framepos_t where, framecnt_t amount); //returns true if anything was moved
+ const MeterSection& meter_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const;
+ const MeterSection& meter_section_at_beat_locked (const Metrics& metrics, const double& beat) const;
- int n_tempos () const;
- int n_meters () const;
+ bool check_solved (const Metrics& metrics) const;
+ bool set_active_tempos (const Metrics& metrics, const framepos_t& frame);
- framecnt_t frame_rate () const { return _frame_rate; }
+ bool solve_map_frame (Metrics& metrics, TempoSection* section, const framepos_t& frame);
+ bool solve_map_pulse (Metrics& metrics, TempoSection* section, const double& pulse);
+ bool solve_map_frame (Metrics& metrics, MeterSection* section, const framepos_t& frame);
+ bool solve_map_bbt (Metrics& metrics, MeterSection* section, const Timecode::BBT_Time& bbt);
- private:
+ double exact_beat_at_frame_locked (const Metrics& metrics, const framepos_t& frame, const int32_t sub_num);
friend class ::BBTTest;
friend class ::FrameposPlusBeatsTest;
+ friend class ::FrameposMinusBeatsTest;
friend class ::TempoTest;
static Tempo _default_tempo;
static Meter _default_meter;
- Metrics metrics;
+ Metrics _metrics;
framecnt_t _frame_rate;
mutable Glib::Threads::RWLock lock;
- BBTPointList _map;
-
- void recompute_map (bool reassign_tempo_bbt, framepos_t end = -1);
- void extend_map (framepos_t end);
- void require_map_to (framepos_t pos);
- void require_map_to (const Timecode::BBT_Time&);
- void _extend_map (TempoSection* tempo, MeterSection* meter,
- Metrics::iterator next_metric,
- Timecode::BBT_Time current, framepos_t current_frame, framepos_t end);
- BBTPointList::const_iterator bbt_before_or_at (framepos_t);
- BBTPointList::const_iterator bbt_before_or_at (const Timecode::BBT_Time&);
- BBTPointList::const_iterator bbt_after_or_at (framepos_t);
+ void recompute_tempi (Metrics& metrics);
+ void recompute_meters (Metrics& metrics);
+ void recompute_map (Metrics& metrics, framepos_t end = -1);
framepos_t round_to_type (framepos_t fr, RoundMode dir, BBTPointType);
- void bbt_time (framepos_t, Timecode::BBT_Time&, const BBTPointList::const_iterator&);
- framecnt_t bbt_duration_at_unlocked (const Timecode::BBT_Time& when, const Timecode::BBT_Time& bbt, int dir);
const MeterSection& first_meter() const;
MeterSection& first_meter();
@@ -367,12 +525,17 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
void do_insert (MetricSection* section);
- void add_tempo_locked (const Tempo&, Timecode::BBT_Time where, bool recompute);
- void add_meter_locked (const Meter&, Timecode::BBT_Time where, bool recompute);
+ TempoSection* add_tempo_locked (const Tempo&, double pulse, framepos_t frame
+ , TempoSection::Type type, PositionLockStyle pls, bool recompute, bool locked_to_meter = false);
+
+ MeterSection* add_meter_locked (const Meter&, double beat, const Timecode::BBT_Time& where, framepos_t frame
+ , PositionLockStyle pls, bool recompute);
bool remove_tempo_locked (const TempoSection&);
bool remove_meter_locked (const MeterSection&);
+ TempoSection* copy_metrics_and_point (const Metrics& metrics, Metrics& copy, TempoSection* section);
+ MeterSection* copy_metrics_and_point (const Metrics& metrics, Metrics& copy, MeterSection* section);
};
}; /* namespace ARDOUR */
diff --git a/libs/ardour/ardour/thread_buffers.h b/libs/ardour/ardour/thread_buffers.h
index f018ee4..598d8f3 100644
--- a/libs/ardour/ardour/thread_buffers.h
+++ b/libs/ardour/ardour/thread_buffers.h
@@ -39,6 +39,7 @@ public:
BufferSet* silent_buffers;
BufferSet* scratch_buffers;
+ BufferSet* noinplace_buffers;
BufferSet* route_buffers;
BufferSet* mix_buffers;
gain_t* gain_automation_buffer;
diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h
index ee05666..243d40f 100644
--- a/libs/ardour/ardour/track.h
+++ b/libs/ardour/ardour/track.h
@@ -22,6 +22,7 @@
#include <boost/shared_ptr.hpp>
#include "ardour/interthread_info.h"
+#include "ardour/recordable.h"
#include "ardour/route.h"
#include "ardour/public_diskstream.h"
@@ -34,11 +35,19 @@ class Source;
class Region;
class Diskstream;
class IO;
-
-class LIBARDOUR_API Track : public Route, public PublicDiskstream
+class MonitorControl;
+class RecordEnableControl;
+class RecordSafeControl;
+
+/** A track is an route (bus) with a recordable diskstream and
+ * related objects relevant to tracking, playback and editing.
+ *
+ * Specifically a track has regions and playlist objects.
+ */
+class LIBARDOUR_API Track : public Route, public Recordable, public PublicDiskstream
{
public:
- Track (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal, DataType default_type = DataType::AUDIO);
+ Track (Session&, std::string name, PresentationInfo::Flag f = PresentationInfo::Flag (0), TrackMode m = Normal, DataType default_type = DataType::AUDIO);
virtual ~Track ();
int init ();
@@ -51,23 +60,9 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
virtual bool can_use_mode (TrackMode /*m*/, bool& /*bounce_required*/) { return false; }
PBD::Signal0<void> TrackModeChanged;
- class LIBARDOUR_API MonitoringControllable : public RouteAutomationControl {
- public:
- MonitoringControllable (std::string name, boost::shared_ptr<Track>);
- void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- /* currently no automation, so no need for set_value_unchecked() */
- double get_value () const;
- private:
- void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
- };
-
- void set_monitoring (MonitorChoice, PBD::Controllable::GroupControlDisposition group_override);
- MonitorChoice monitoring_choice() const { return _monitoring; }
- MonitorState monitoring_state () const;
- PBD::Signal0<void> MonitoringChanged;
-
- boost::shared_ptr<AutomationControl> monitoring_control() const { return _monitoring_control; }
+ boost::shared_ptr<MonitorControl> monitoring_control() const { return _monitoring_control; }
+ MonitorState monitoring_state () const;
MeterState metering_state () const;
virtual int no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
@@ -102,11 +97,32 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
virtual void freeze_me (InterThreadInfo&) = 0;
virtual void unfreeze () = 0;
- /** @return true if the track can be bounced, or false otherwise.
+ /** Test if the track can be bounced with the given settings.
+ * If sends/inserts/returns are present in the signal path or the given track
+ * has no audio outputs bouncing is not possible.
+ *
+ * @param endpoint the processor to tap the signal off (or nil for the top)
+ * @param include_endpoint include the given processor in the bounced audio.
+ * @return true if the track can be bounced, or false otherwise.
*/
virtual bool bounceable (boost::shared_ptr<Processor> endpoint, bool include_endpoint) const = 0;
- virtual boost::shared_ptr<Region> bounce (InterThreadInfo&) = 0;
- virtual boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo&,
+
+ /** bounce track from session start to session end to new region
+ *
+ * @param itt asynchronous progress report and cancel
+ * @return a new audio region (or nil in case of error)
+ */
+ virtual boost::shared_ptr<Region> bounce (InterThreadInfo& itt) = 0;
+
+ /** Bounce the given range to a new audio region.
+ * @param start start time (in samples)
+ * @param end end time (in samples)
+ * @param itt asynchronous progress report and cancel
+ * @param endpoint the processor to tap the signal off (or nil for the top)
+ * @param include_endpoint include the given processor in the bounced audio.
+ * @return a new audio region (or nil in case of error)
+ */
+ virtual boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo& itt,
boost::shared_ptr<Processor> endpoint, bool include_endpoint) = 0;
virtual int export_stuff (BufferSet& bufs, framepos_t start_frame, framecnt_t nframes,
boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) = 0;
@@ -116,13 +132,12 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
virtual int set_state (const XMLNode&, int version);
static void zero_diskstream_id_in_xml (XMLNode&);
- boost::shared_ptr<AutomationControl> rec_enable_control() { return _rec_enable_control; }
+ boost::shared_ptr<AutomationControl> rec_enable_control() const { return _record_enable_control; }
+ boost::shared_ptr<AutomationControl> rec_safe_control() const { return _record_safe_control; }
- bool record_enabled() const;
- bool record_safe () const;
- void set_record_enabled (bool yn, PBD::Controllable::GroupControlDisposition);
- void set_record_safe (bool yn, PBD::Controllable::GroupControlDisposition);
- void prep_record_enabled (bool yn, PBD::Controllable::GroupControlDisposition);
+ int prep_record_enabled (bool);
+ bool can_be_record_enabled ();
+ bool can_be_record_safe ();
bool using_diskstream_id (PBD::ID) const;
@@ -178,8 +193,6 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
PBD::Signal0<void> FreezeChange;
/* Emitted when our diskstream is set to use a different playlist */
PBD::Signal0<void> PlaylistChanged;
- PBD::Signal0<void> RecordEnableChanged;
- PBD::Signal0<void> RecordSafeChanged;
PBD::Signal0<void> SpeedChanged;
PBD::Signal0<void> AlignmentStyleChanged;
@@ -190,8 +203,7 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
MeterPoint _saved_meter_point;
TrackMode _mode;
bool _needs_butler;
- MonitorChoice _monitoring;
- boost::shared_ptr<MonitoringControllable> _monitoring_control;
+ boost::shared_ptr<MonitorControl> _monitoring_control;
//private: (FIXME)
struct FreezeRecordProcessorInfo {
@@ -216,20 +228,6 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
FreezeState state;
};
- class RecEnableControl : public AutomationControl {
- public:
- RecEnableControl (boost::shared_ptr<Track> t);
-
- void set_value (double, PBD::Controllable::GroupControlDisposition);
- void set_value_unchecked (double);
- double get_value (void) const;
-
- boost::weak_ptr<Track> track;
-
- private:
- void _set_value (double, PBD::Controllable::GroupControlDisposition);
- };
-
virtual void set_state_part_two () = 0;
FreezeRecord _freeze_record;
@@ -238,17 +236,20 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
void maybe_declick (BufferSet&, framecnt_t, int);
- boost::shared_ptr<RecEnableControl> _rec_enable_control;
+ boost::shared_ptr<AutomationControl> _record_enable_control;
+ boost::shared_ptr<AutomationControl> _record_safe_control;
+
+ virtual void record_enable_changed (bool, PBD::Controllable::GroupControlDisposition);
+ virtual void record_safe_changed (bool, PBD::Controllable::GroupControlDisposition);
framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&);
+ virtual void monitoring_changed (bool, PBD::Controllable::GroupControlDisposition);
private:
virtual boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &) = 0;
void diskstream_playlist_changed ();
- void diskstream_record_enable_changed ();
- void diskstream_record_safe_changed ();
void diskstream_speed_changed ();
void diskstream_alignment_style_changed ();
void parameter_changed (std::string const & p);
diff --git a/libs/ardour/ardour/transient_detector.h b/libs/ardour/ardour/transient_detector.h
index 0e07c58..d29e124 100644
--- a/libs/ardour/ardour/transient_detector.h
+++ b/libs/ardour/ardour/transient_detector.h
@@ -37,10 +37,7 @@ public:
static std::string operational_identifier();
void set_threshold (float);
- void set_sensitivity (float);
-
- float get_threshold () const;
- float get_sensitivity () const;
+ void set_sensitivity (uint32_t, float);
int run (const std::string& path, Readable*, uint32_t channel, AnalysisFeatureList& results);
void update_positions (Readable* src, uint32_t channel, AnalysisFeatureList& results);
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index 97dba38..ce28484 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -52,6 +52,9 @@ namespace ARDOUR {
class AudioSource;
class Route;
class Region;
+ class Stripable;
+ class VCA;
+ class AutomationControl;
typedef float Sample;
typedef float pan_t;
@@ -148,6 +151,7 @@ namespace ARDOUR {
FadeOutAutomation,
EnvelopeAutomation,
RecEnableAutomation,
+ RecSafeAutomation,
TrimAutomation,
PhaseAutomation,
MonitoringAutomation,
@@ -318,7 +322,7 @@ namespace ARDOUR {
AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
- framecnt_t length() { return end - start + 1; }
+ framecnt_t length() const { return end - start + 1; }
bool operator== (const AudioRange& other) const {
return start == other.start && end == other.end && id == other.id;
@@ -462,11 +466,6 @@ namespace ARDOUR {
DenormalFTZDAZ
};
- enum RemoteModel {
- UserOrdered,
- MixerOrdered
- };
-
enum LayerModel {
LaterHigher,
Manual
@@ -563,7 +562,12 @@ namespace ARDOUR {
typedef std::list<framepos_t> AnalysisFeatureList;
typedef std::list<boost::shared_ptr<Route> > RouteList;
+ typedef std::list<boost::shared_ptr<Stripable> > StripableList;
typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
+ typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
+ typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
+
+ typedef std::list<boost::shared_ptr<VCA> > VCAList;
class Bundle;
typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
@@ -690,7 +694,6 @@ std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
@@ -714,7 +717,6 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
diff --git a/libs/ardour/ardour/unknown_processor.h b/libs/ardour/ardour/unknown_processor.h
index b9743c9..170be38 100644
--- a/libs/ardour/ardour/unknown_processor.h
+++ b/libs/ardour/ardour/unknown_processor.h
@@ -46,7 +46,7 @@ public:
virtual ~UnknownProcessor ();
bool can_support_io_configuration (const ChanCount &, ChanCount &);
- void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t /*nframes*/, bool /*result_required*/);
+ void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t /*nframes*/, bool /*result_required*/);
XMLNode & state (bool);
diff --git a/libs/ardour/ardour/uri_map.h b/libs/ardour/ardour/uri_map.h
index d745ad5..460aa99 100644
--- a/libs/ardour/ardour/uri_map.h
+++ b/libs/ardour/ardour/uri_map.h
@@ -69,6 +69,7 @@ public:
uint32_t atom_Float;
uint32_t log_Error;
uint32_t log_Note;
+ uint32_t log_Trace;
uint32_t log_Warning;
uint32_t midi_MidiEvent;
uint32_t time_Position;
@@ -83,6 +84,15 @@ public:
uint32_t patch_Set;
uint32_t patch_property;
uint32_t patch_value;
+#ifdef LV2_EXTENDED
+ uint32_t auto_event;
+ uint32_t auto_setup;
+ uint32_t auto_finalize;
+ uint32_t auto_start;
+ uint32_t auto_end;
+ uint32_t auto_parameter;
+ uint32_t auto_value;
+#endif
};
URIDs urids;
diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h
index f3767d4..cc6e504 100644
--- a/libs/ardour/ardour/utils.h
+++ b/libs/ardour/ardour/utils.h
@@ -28,19 +28,26 @@
#include <string>
#include <cmath>
+#include "boost/shared_ptr.hpp"
+
#if __APPLE__
#include <CoreFoundation/CoreFoundation.h>
#endif /* __APPLE__ */
-#include "ardour/libardour_visibility.h"
#include "ardour/ardour.h"
#include "ardour/data_type.h"
#include "ardour/dB.h"
+#include "ardour/types.h"
+
+#include "ardour/libardour_visibility.h"
class XMLNode;
namespace ARDOUR {
+class Route;
+class Track;
+
LIBARDOUR_API std::string legalize_for_path (const std::string& str);
LIBARDOUR_API std::string legalize_for_universal_path (const std::string& str);
LIBARDOUR_API std::string legalize_for_uri (const std::string& str);
@@ -169,6 +176,28 @@ LIBARDOUR_API bool matching_unsuffixed_filename_exists_in (const std::string& di
LIBARDOUR_API uint32_t how_many_dsp_threads ();
+template<typename T> boost::shared_ptr<ControlList> route_list_to_control_list (boost::shared_ptr<RouteList> rl, boost::shared_ptr<T> (Stripable::*get_control)() const) {
+ boost::shared_ptr<ControlList> cl (new ControlList);
+ for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
+ boost::shared_ptr<AutomationControl> ac = ((*r).get()->*get_control)();
+ if (ac) {
+ cl->push_back (ac);
+ }
+ }
+ return cl;
+}
+
+template<typename T> boost::shared_ptr<ControlList> stripable_list_to_control_list (StripableList& sl, boost::shared_ptr<T> (Stripable::*get_control)() const) {
+ boost::shared_ptr<ControlList> cl (new ControlList);
+ for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
+ boost::shared_ptr<AutomationControl> ac = ((*s).get()->*get_control)();
+ if (ac) {
+ cl->push_back (ac);
+ }
+ }
+ return cl;
+}
+
#if __APPLE__
LIBARDOUR_API std::string CFStringRefToStdString(CFStringRef stringRef);
#endif // __APPLE__
@@ -176,4 +205,3 @@ LIBARDOUR_API std::string CFStringRefToStdString(CFStringRef stringRef);
} //namespave
#endif /* __ardour_utils_h__ */
-
diff --git a/libs/ardour/ardour/value_as_string.h b/libs/ardour/ardour/value_as_string.h
index c2f40fc..9e042b7 100644
--- a/libs/ardour/ardour/value_as_string.h
+++ b/libs/ardour/ardour/value_as_string.h
@@ -46,16 +46,7 @@ value_as_string(const ARDOUR::ParameterDescriptor& desc,
// Value is not a scale point, print it normally
if (desc.unit == ARDOUR::ParameterDescriptor::MIDI_NOTE) {
- if (v >= 0 && v <= 127) {
- const int num = rint(v);
- static const char names[12][3] = {
- "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
- };
- snprintf(buf, sizeof(buf), "%s %d", names[num % 12], (num / 12) - 2);
- } else {
- // Odd, invalid range, just print the number
- snprintf(buf, sizeof(buf), "%.0f", v);
- }
+ snprintf(buf, sizeof(buf), "%s", ParameterDescriptor::midi_note_name (rint(v)).c_str());
} else if (!desc.print_fmt.empty()) {
snprintf(buf, sizeof(buf), desc.print_fmt.c_str(), v);
} else if (desc.integer_step) {
diff --git a/libs/ardour/ardour/variant.h b/libs/ardour/ardour/variant.h
index 9ecadbf..4cf1df5 100644
--- a/libs/ardour/ardour/variant.h
+++ b/libs/ardour/ardour/variant.h
@@ -27,7 +27,7 @@
#include <stdexcept>
#include "ardour/libardour_visibility.h"
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
#include "pbd/compose.h"
namespace ARDOUR {
diff --git a/libs/ardour/ardour/vca.h b/libs/ardour/ardour/vca.h
new file mode 100644
index 0000000..710447f
--- /dev/null
+++ b/libs/ardour/ardour/vca.h
@@ -0,0 +1,163 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_vca_h__
+#define __ardour_vca_h__
+
+#include <string>
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#include <glibmm/threads.h>
+
+#include "pbd/controllable.h"
+#include "pbd/statefuldestructible.h"
+
+#include "ardour/automatable.h"
+#include "ardour/muteable.h"
+#include "ardour/monitorable.h"
+#include "ardour/recordable.h"
+#include "ardour/soloable.h"
+#include "ardour/slavable.h"
+#include "ardour/stripable.h"
+
+namespace ARDOUR {
+
+class Route;
+class GainControl;
+class SoloControl;
+class MuteControl;
+class MonitorControl;
+
+class LIBARDOUR_API VCA : public Stripable,
+ public Soloable,
+ public Muteable,
+ public Automatable,
+ public Recordable,
+ public Monitorable,
+ public boost::enable_shared_from_this<VCA> {
+ public:
+ VCA (Session& session, int32_t num, const std::string& name);
+ ~VCA();
+
+ int32_t number () const { return _number; }
+
+ int init ();
+ XMLNode& get_state();
+ int set_state (XMLNode const&, int version);
+
+ PBD::Signal0<void> Drop; /* signal to slaves to drop control by this VCA */
+
+ /* Slavable API */
+
+ bool slaved_to (boost::shared_ptr<VCA>) const;
+ bool slaved () const;
+
+ /* Soloable API */
+
+ void clear_all_solo_state ();
+
+ bool soloed () const;
+ void push_solo_upstream (int32_t) {}
+ void push_solo_isolate_upstream (int32_t) {}
+ bool can_solo() const { return true; }
+ bool is_safe () const { return false; }
+
+ /* Muteable API */
+
+ bool can_be_muted_by_others () const { return true; }
+ bool muted_by_others_soloing() const { return false; }
+
+ /* Recordable API */
+
+ int prep_record_enabled (bool yn) { return 0; }
+ bool can_be_record_enabled() { return true; }
+ bool can_be_record_safe() { return true; }
+
+ /* Monitorable API */
+
+ MonitorState monitoring_state() const;
+
+ static std::string default_name_template ();
+ static int32_t next_vca_number ();
+ static std::string xml_node_name;
+
+ /* used by Session to save/restore the atomic counter */
+ static int32_t get_next_vca_number ();
+ static void set_next_vca_number (int32_t);
+
+ boost::shared_ptr<GainControl> gain_control() const { return _gain_control; }
+ boost::shared_ptr<SoloControl> solo_control() const { return _solo_control; }
+ boost::shared_ptr<MuteControl> mute_control() const { return _mute_control; }
+
+ /* null Stripable API, because VCAs don't have any of this */
+
+ boost::shared_ptr<SoloIsolateControl> solo_isolate_control() const { return boost::shared_ptr<SoloIsolateControl>(); }
+ boost::shared_ptr<SoloSafeControl> solo_safe_control() const { return boost::shared_ptr<SoloSafeControl>(); }
+ boost::shared_ptr<PeakMeter> peak_meter() { return boost::shared_ptr<PeakMeter>(); }
+ boost::shared_ptr<const PeakMeter> peak_meter() const { return boost::shared_ptr<PeakMeter>(); }
+ boost::shared_ptr<PhaseControl> phase_control() const { return boost::shared_ptr<PhaseControl>(); }
+ boost::shared_ptr<GainControl> trim_control() const { return boost::shared_ptr<GainControl>(); }
+ boost::shared_ptr<AutomationControl> pan_azimuth_control() const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> pan_elevation_control() const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> pan_width_control() const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> pan_frontback_control() const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> pan_lfe_control() const { return boost::shared_ptr<AutomationControl>(); }
+ uint32_t eq_band_cnt () const { return 0; }
+ std::string eq_band_name (uint32_t) const { return std::string(); }
+ boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> eq_enable_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> eq_hpf_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> comp_enable_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> comp_threshold_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> comp_speed_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> comp_mode_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> comp_makeup_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> comp_redux_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ std::string comp_mode_name (uint32_t mode) const { return std::string(); }
+ std::string comp_speed_name (uint32_t mode) const { return std::string(); }
+ boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const { return boost::shared_ptr<AutomationControl>(); }
+ std::string send_name (uint32_t n) const { return std::string(); }
+ boost::shared_ptr<AutomationControl> master_send_enable_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+ boost::shared_ptr<MonitorProcessor> monitor_control() const { return boost::shared_ptr<MonitorProcessor>(); }
+ boost::shared_ptr<MonitorControl> monitoring_control() const { return boost::shared_ptr<MonitorControl>(); }
+
+ private:
+ int32_t _number;
+
+ boost::shared_ptr<GainControl> _gain_control;
+ boost::shared_ptr<SoloControl> _solo_control;
+ boost::shared_ptr<MuteControl> _mute_control;
+
+
+ static int32_t next_number;
+ static Glib::Threads::Mutex number_lock;
+
+ void solo_target_going_away (boost::weak_ptr<Route>);
+ void mute_target_going_away (boost::weak_ptr<Route>);
+ bool soloed_locked () const;
+ bool muted_locked () const;
+};
+
+} /* namespace */
+
+#endif /* __ardour_vca_h__ */
diff --git a/libs/ardour/ardour/vca_manager.h b/libs/ardour/ardour/vca_manager.h
new file mode 100644
index 0000000..99be0c5
--- /dev/null
+++ b/libs/ardour/ardour/vca_manager.h
@@ -0,0 +1,75 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_vca_manager_h__
+#define __libardour_vca_manager_h__
+
+#include <string>
+#include <list>
+
+#include <boost/shared_ptr.hpp>
+
+#include <glibmm/threads.h>
+
+#include "pbd/signals.h"
+#include "pbd/statefuldestructible.h"
+
+#include "ardour/session_handle.h"
+#include "ardour/types.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class VCA;
+
+class LIBARDOUR_API VCAManager : public SessionHandleRef, public PBD::StatefulDestructible
+{
+ public:
+ VCAManager (ARDOUR::Session&);
+ ~VCAManager ();
+
+ int create_vca (uint32_t how_many, std::string const & name = std::string());
+ void remove_vca (boost::shared_ptr<VCA>);
+
+ boost::shared_ptr<VCA> vca_by_number(int32_t) const;
+
+ VCAList vcas() const;
+ VCAList::size_type n_vcas() const { return _vcas.size(); }
+
+ PBD::Signal1<void,VCAList&> VCAAdded;
+
+ XMLNode& get_state();
+ int set_state (XMLNode const&, int version);
+
+ bool vcas_loaded() const { return _vcas_loaded; }
+ void clear_all_solo_state ();
+
+ static std::string xml_node_name;
+
+ private:
+ mutable Glib::Threads::Mutex lock;
+ VCAList _vcas;
+ bool _vcas_loaded;
+
+ void clear ();
+};
+
+} // namespace
+
+#endif /* __libardour_vca_manager_h__ */
diff --git a/libs/ardour/ardour/vestige/aeffectx.h b/libs/ardour/ardour/vestige/aeffectx.h
index 2b839f0..25be89b 100644
--- a/libs/ardour/ardour/vestige/aeffectx.h
+++ b/libs/ardour/ardour/vestige/aeffectx.h
@@ -138,6 +138,7 @@ struct RemoteVstPlugin;
#define kVstTransportChanged 1
#define kVstTransportPlaying (1 << 1)
#define kVstTransportCycleActive (1 << 2)
+#define kVstTransportRecording (1 << 3)
#define kVstAutomationWriting (1 << 6)
#define kVstAutomationReading (1 << 7)
diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h
index d77d380..e56b9c0 100644
--- a/libs/ardour/ardour/vst_plugin.h
+++ b/libs/ardour/ardour/vst_plugin.h
@@ -29,8 +29,12 @@ typedef struct _VSTHandle VSTHandle;
struct _VSTState;
typedef struct _VSTState VSTState;
+#include "ardour/vestige/aeffectx.h"
+
namespace ARDOUR {
+class PluginInsert;
+
/** Parent class for VST plugins of both Windows and Linux varieties */
class LIBARDOUR_API VSTPlugin : public Plugin
{
@@ -42,6 +46,7 @@ public:
void deactivate ();
int set_block_size (pframes_t);
+ bool inplace_broken() const { return true; }
float default_value (uint32_t port);
float get_parameter (uint32_t port) const;
uint32_t nth_parameter (uint32_t port, bool& ok) const;
@@ -58,10 +63,11 @@ public:
bool parameter_is_input (uint32_t) const { return true; }
bool parameter_is_output (uint32_t) const { return false; }
- int connect_and_run (
- BufferSet&, ChanMapping in, ChanMapping out,
- pframes_t nframes, framecnt_t offset
- );
+ int connect_and_run (BufferSet&,
+ framepos_t start, framepos_t end, double speed,
+ ChanMapping in, ChanMapping out,
+ pframes_t nframes, framecnt_t offset
+ );
std::string unique_id () const;
const char * label () const;
@@ -80,6 +86,14 @@ public:
int first_user_preset_index () const;
+ void set_insert (PluginInsert* pi, uint32_t num) { _pi = pi; _num = num; }
+ PluginInsert* plugin_insert () const { return _pi; }
+ uint32_t plugin_number () const { return _num; }
+ VstTimeInfo* timeinfo () { return &_timeInfo; }
+ framepos_t transport_frame () const { return _transport_frame; }
+ float transport_speed () const { return _transport_speed; }
+
+
protected:
void set_plugin (AEffect *);
gchar* get_chunk (bool) const;
@@ -96,8 +110,15 @@ protected:
VSTHandle* _handle;
VSTState* _state;
AEffect* _plugin;
+ PluginInsert* _pi;
+ uint32_t _num;
MidiBuffer* _midi_out_buf;
+ VstTimeInfo _timeInfo;
+
+ framepos_t _transport_frame;
+ float _transport_speed;
+ mutable std::map <uint32_t, float> _parameter_defaults;
};
}
diff --git a/libs/ardour/ardour/worker.h b/libs/ardour/ardour/worker.h
index c83f006..6e1a7c9 100644
--- a/libs/ardour/ardour/worker.h
+++ b/libs/ardour/ardour/worker.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012 Paul Davis
+ Copyright (C) 2012-2016 Paul Davis
Author: David Robillard
This program is free software; you can redistribute it and/or modify
@@ -31,6 +31,8 @@
namespace ARDOUR {
+class Worker;
+
/**
An object that needs to schedule non-RT work in the audio thread.
*/
@@ -41,7 +43,7 @@ public:
/**
Do some work in the worker thread.
*/
- virtual int work(uint32_t size, const void* data) = 0;
+ virtual int work(Worker& worker, uint32_t size, const void* data) = 0;
/**
Handle a response from the worker thread in the audio thread.
@@ -50,12 +52,16 @@ public:
};
/**
- A worker thread for non-realtime tasks scheduled in the audio thread.
+ A worker for non-realtime tasks scheduled from another thread.
+
+ A worker may be a separate thread that runs to execute scheduled work
+ asynchronously, or unthreaded, in which case work is executed immediately
+ upon scheduling by the calling thread.
*/
class LIBARDOUR_API Worker
{
public:
- Worker(Workee* workee, uint32_t ring_size);
+ Worker(Workee* workee, uint32_t ring_size, bool threaded=true);
~Worker();
/**
@@ -75,6 +81,16 @@ public:
*/
void emit_responses();
+ /**
+ Enable or disable synchronous execution.
+
+ If enabled, all work is performed immediately in schedule() regardless
+ of whether or not the worker is threaded. This is used for exporting,
+ where we want to temporarily execute all work synchronously but the
+ worker is typically used threaded for live rolling.
+ */
+ void set_synchronous(bool synchronous) { _synchronous = synchronous; }
+
private:
void run();
/**
@@ -83,19 +99,19 @@ private:
Handle the unlikley edge-case, if we're called in between the
responder writing 'size' and 'data'.
- @param rb the ringbuffer to check
- @return true if the message is complete, false otherwise
- */
+ @param rb the ringbuffer to check
+ @return true if the message is complete, false otherwise
+ */
bool verify_message_completeness(RingBuffer<uint8_t>* rb);
Workee* _workee;
RingBuffer<uint8_t>* _requests;
RingBuffer<uint8_t>* _responses;
uint8_t* _response;
- PBD::Semaphore _sem;
- bool _exit;
+ PBD::Semaphore _sem;
Glib::Threads::Thread* _thread;
-
+ bool _exit;
+ bool _synchronous;
};
} // namespace ARDOUR
diff --git a/libs/ardour/audio_backend.cc b/libs/ardour/audio_backend.cc
index c3e88e7..930eb41 100644
--- a/libs/ardour/audio_backend.cc
+++ b/libs/ardour/audio_backend.cc
@@ -19,7 +19,7 @@
#include "ardour/audio_backend.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
diff --git a/libs/ardour/audio_buffer.cc b/libs/ardour/audio_buffer.cc
index 6d8b2aa..89e210c 100644
--- a/libs/ardour/audio_buffer.cc
+++ b/libs/ardour/audio_buffer.cc
@@ -22,7 +22,7 @@
#include "pbd/error.h"
#include "pbd/malign.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index 6f7c2d6..330b9d5 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -56,7 +56,7 @@
#include "ardour/types.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -168,7 +168,7 @@ AudioDiskstream::non_realtime_input_change ()
need_write_sources = true;
}
- if (input_change_pending.type == IOChange::ConfigurationChanged) {
+ if (input_change_pending.type & IOChange::ConfigurationChanged) {
RCUWriter<ChannelList> writer (channels);
boost::shared_ptr<ChannelList> c = writer.get_copy();
@@ -359,7 +359,7 @@ AudioDiskstream::use_destructive_playlist ()
boost::shared_ptr<Region> rp;
{
- const RegionList& rl (_playlist->region_list().rlist());
+ const RegionList& rl (_playlist->region_list_property().rlist());
if (rl.size() > 0) {
assert((rl.size() == 1));
rp = rl.front();
@@ -377,9 +377,9 @@ AudioDiskstream::use_destructive_playlist ()
throw failed_constructor();
}
- /* be sure to stretch the region out to the maximum length */
+ /* be sure to stretch the region out to the maximum length (non-musical)*/
- region->set_length (max_framepos - region->position());
+ region->set_length (max_framepos - region->position(), 0);
uint32_t n;
ChannelList::iterator chan;
@@ -1895,7 +1895,7 @@ AudioDiskstream::get_state ()
{
XMLNode& node (Diskstream::get_state());
char buf[64] = "";
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
boost::shared_ptr<ChannelList> c = channels.reader();
snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size());
@@ -1932,12 +1932,12 @@ AudioDiskstream::get_state ()
int
AudioDiskstream::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
uint32_t nchans = 1;
XMLNode* capture_pending_node = 0;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
/* prevent write sources from being created */
@@ -2237,11 +2237,11 @@ AudioDiskstream::playback_buffer_load () const
boost::shared_ptr<ChannelList> c = channels.reader();
if (c->empty ()) {
- return 0;
+ return 1.0;
}
return (float) ((double) c->front()->playback_buf->read_space()/
- (double) c->front()->playback_buf->bufsize());
+ (double) c->front()->playback_buf->bufsize());
}
float
@@ -2250,7 +2250,7 @@ AudioDiskstream::capture_buffer_load () const
boost::shared_ptr<ChannelList> c = channels.reader();
if (c->empty ()) {
- return 0;
+ return 1.0;
}
return (float) ((double) c->front()->capture_buf->write_space()/
@@ -2260,7 +2260,7 @@ AudioDiskstream::capture_buffer_load () const
int
AudioDiskstream::use_pending_capture_data (XMLNode& node)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
boost::shared_ptr<AudioFileSource> fs;
@@ -2435,7 +2435,7 @@ AudioDiskstream::can_become_destructive (bool& requires_bounce) const
boost::shared_ptr<Region> first;
{
- const RegionList& rl (_playlist->region_list().rlist());
+ const RegionList& rl (_playlist->region_list_property().rlist());
assert((rl.size() == 1));
first = rl.front();
diff --git a/libs/ardour/audio_library.cc b/libs/ardour/audio_library.cc
index a1643c8..2f09a37 100644
--- a/libs/ardour/audio_library.cc
+++ b/libs/ardour/audio_library.cc
@@ -40,7 +40,7 @@
#include "ardour/audio_library.h"
#include "ardour/filesystem_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc
index 0553206..b00252d 100644
--- a/libs/ardour/audio_playlist.cc
+++ b/libs/ardour/audio_playlist.cc
@@ -28,7 +28,7 @@
#include "ardour/region_sorters.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
@@ -38,7 +38,7 @@ AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden
: Playlist (session, node, DataType::AUDIO, hidden)
{
#ifndef NDEBUG
- const XMLProperty* prop = node.property("type");
+ XMLProperty const * prop = node.property("type");
assert(!prop || DataType(prop->value()) == DataType::AUDIO);
#endif
@@ -335,6 +335,11 @@ AudioPlaylist::region_changed (const PropertyChange& what_changed, boost::shared
return false;
}
+ PropertyChange bounds;
+ bounds.add (Properties::start);
+ bounds.add (Properties::position);
+ bounds.add (Properties::length);
+
PropertyChange our_interests;
our_interests.add (Properties::fade_in_active);
@@ -348,8 +353,8 @@ AudioPlaylist::region_changed (const PropertyChange& what_changed, boost::shared
bool parent_wants_notify;
parent_wants_notify = Playlist::region_changed (what_changed, region);
-
- if (parent_wants_notify || (what_changed.contains (our_interests))) {
+ /* if bounds changed, we have already done notify_contents_changed ()*/
+ if ((parent_wants_notify || what_changed.contains (our_interests)) && !what_changed.contains (bounds)) {
notify_contents_changed ();
}
@@ -487,7 +492,7 @@ AudioPlaylist::load_legacy_crossfades (const XMLNode& node, int version)
for (XMLNodeConstIterator i = children.begin(); i != children.end(); ++i) {
if ((*i)->name() == X_("Crossfade")) {
- XMLProperty* p = (*i)->property (X_("active"));
+ XMLProperty const * p = (*i)->property (X_("active"));
assert (p);
if (!string_is_affirmative (p->value())) {
diff --git a/libs/ardour/audio_playlist_importer.cc b/libs/ardour/audio_playlist_importer.cc
index 5390f1c..c1afdfe 100644
--- a/libs/ardour/audio_playlist_importer.cc
+++ b/libs/ardour/audio_playlist_importer.cc
@@ -31,7 +31,7 @@
#include "ardour/playlist_factory.h"
#include "ardour/session_playlists.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -51,7 +51,7 @@ AudioPlaylistImportHandler::AudioPlaylistImportHandler (XMLTree const & source,
XMLNodeList const & pl_children = playlists->children();
for (XMLNodeList::const_iterator it = pl_children.begin(); it != pl_children.end(); ++it) {
- const XMLProperty* type = (*it)->property("type");
+ XMLProperty const * type = (*it)->property("type");
if ( !type || type->value() == "audio" ) {
try {
elements.push_back (ElementPtr ( new AudioPlaylistImporter (source, session, *this, **it)));
@@ -75,7 +75,7 @@ AudioPlaylistImportHandler::get_regions (XMLNode const & node, ElementList & lis
}
void
-AudioPlaylistImportHandler::update_region_id (XMLProperty* id_prop)
+AudioPlaylistImportHandler::update_region_id (XMLProperty * id_prop)
{
PBD::ID old_id (id_prop->value());
PBD::ID new_id (region_handler.get_new_id (old_id));
@@ -178,7 +178,7 @@ AudioPlaylistImporter::_prepare_move ()
name = rename_pair.second;
}
- XMLProperty* p = xml_playlist.property ("name");
+ XMLProperty * p = xml_playlist.property ("name");
if (!p) {
error << _("badly-formed XML in imported playlist") << endmsg;
return false;
@@ -219,8 +219,8 @@ AudioPlaylistImporter::_move ()
// Update region ids in crossfades
XMLNodeList crossfades = xml_playlist.children("Crossfade");
for (XMLNodeIterator it = crossfades.begin(); it != crossfades.end(); ++it) {
- XMLProperty* in = (*it)->property("in");
- XMLProperty* out = (*it)->property("out");
+ XMLProperty * in = (*it)->property("in");
+ XMLProperty * out = (*it)->property("out");
if (!in || !out) {
error << string_compose (X_("AudioPlaylistImporter (%1): did not find the \"in\" or \"out\" property from a crossfade"), name) << endmsg;
continue; // or fatal?
@@ -230,12 +230,12 @@ AudioPlaylistImporter::_move ()
handler.update_region_id (out);
// rate convert length and position
- XMLProperty* length = (*it)->property("length");
+ XMLProperty * length = (*it)->property("length");
if (length) {
length->set_value (rate_convert_samples (length->value()));
}
- XMLProperty* position = (*it)->property("position");
+ XMLProperty * position = (*it)->property("position");
if (position) {
position->set_value (rate_convert_samples (position->value()));
}
diff --git a/libs/ardour/audio_playlist_source.cc b/libs/ardour/audio_playlist_source.cc
index 8effdd0..f77c8b5 100644
--- a/libs/ardour/audio_playlist_source.cc
+++ b/libs/ardour/audio_playlist_source.cc
@@ -35,7 +35,7 @@
#include "ardour/session.h"
#include "ardour/session_directory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -108,7 +108,7 @@ AudioPlaylistSource::set_state (const XMLNode& node, int version, bool with_desc
}
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
pair<framepos_t,framepos_t> extent = _playlist->get_extent();
AudioSource::_length = extent.second - extent.first;
@@ -188,7 +188,7 @@ AudioPlaylistSource::n_channels () const
return 1;
}
- boost::shared_ptr<Region> r = _playlist->region_list().front ();
+ boost::shared_ptr<Region> r = _playlist->region_list_property().front ();
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
return ar->audio_source()->n_channels ();
@@ -203,7 +203,7 @@ AudioPlaylistSource::sample_rate () const
_session.frame_rate ();
}
- boost::shared_ptr<Region> r = _playlist->region_list().front ();
+ boost::shared_ptr<Region> r = _playlist->region_list_property().front ();
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
return ar->audio_source()->sample_rate ();
diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc
index e2bb20d..33e41c1 100644
--- a/libs/ardour/audio_port.cc
+++ b/libs/ardour/audio_port.cc
@@ -59,8 +59,11 @@ void
AudioPort::cycle_end (pframes_t nframes)
{
if (sends_output() && !_buffer->written()) {
- if (_buffer->capacity() >= nframes) {
- _buffer->silence (nframes);
+ if (!_buffer->data (0)) {
+ get_audio_buffer (nframes);
+ }
+ if (_buffer->capacity() >= nframes) {
+ _buffer->silence (nframes);
}
}
}
diff --git a/libs/ardour/audio_region_importer.cc b/libs/ardour/audio_region_importer.cc
index 53367a3..8fc5c53 100644
--- a/libs/ardour/audio_region_importer.cc
+++ b/libs/ardour/audio_region_importer.cc
@@ -33,7 +33,7 @@
#include "ardour/region_factory.h"
#include "ardour/session_directory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -236,7 +236,7 @@ AudioRegionImporter::parse_source_xml ()
char buf[128];
std::string source_dir(get_sound_dir (source));
XMLNode * source_node;
- XMLProperty *prop;
+ XMLProperty const * prop;
// Get XML for sources
if (!(source_node = source.root()->child (X_("Sources")))) {
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index 47746ff..3a653a0 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -19,7 +19,6 @@
#include <boost/scoped_array.hpp>
-#include "pbd/boost_debug.h"
#include "pbd/enumwriter.h"
#include "pbd/error.h"
@@ -30,9 +29,11 @@
#include "ardour/audio_diskstream.h"
#include "ardour/audio_track.h"
#include "ardour/audioplaylist.h"
+#include "ardour/boost_debug.h"
#include "ardour/buffer_set.h"
#include "ardour/delivery.h"
#include "ardour/meter.h"
+#include "ardour/monitor_control.h"
#include "ardour/playlist_factory.h"
#include "ardour/processor.h"
#include "ardour/profile.h"
@@ -43,14 +44,14 @@
#include "ardour/source.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
using namespace PBD;
-AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode mode)
- : Track (sess, name, flag, mode)
+AudioTrack::AudioTrack (Session& sess, string name, TrackMode mode)
+ : Track (sess, name, PresentationInfo::AudioTrack, mode)
{
}
@@ -158,7 +159,7 @@ AudioTrack::deprecated_use_diskstream_connections ()
return 0;
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNode& node (*diskstream->deprecated_io_node);
/* don't do this more than once. */
@@ -200,7 +201,7 @@ AudioTrack::deprecated_use_diskstream_connections ()
int
AudioTrack::set_state (const XMLNode& node, int version)
{
- const XMLProperty *prop;
+ XMLProperty const * prop;
if ((prop = node.property (X_("mode"))) != 0) {
_mode = TrackMode (string_2_enum (prop->value(), _mode));
@@ -266,8 +267,8 @@ void
AudioTrack::set_state_part_two ()
{
XMLNode* fnode;
- XMLProperty* prop;
- LocaleGuard lg (X_("C"));
+ XMLProperty const * prop;
+ LocaleGuard lg;
/* This is called after all session state has been restored but before
have been made ports and connections are established.
@@ -349,7 +350,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
if (!_active) {
silence (nframes);
- if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
+ if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
_meter->reset();
}
return 0;
@@ -374,16 +375,6 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
return dret;
}
- if (_mute_control->list() && _mute_control->automation_playback()) {
- bool valid = false;
- const float mute = _mute_control->list()->rt_safe_eval(transport_frame, valid);
- if (mute >= 0.5 && !muted()) {
- _mute_control->set_value_unchecked(1.0); // mute
- } else if (mute < 0.5 && muted()) {
- _mute_control->set_value_unchecked(0.0); // unmute
- }
- }
-
_silent = false;
_amp->apply_gain_automation(false);
@@ -391,8 +382,8 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
fill_buffers_with_input (bufs, _input, nframes);
- if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
- _meter->run (bufs, start_frame, end_frame, nframes, true);
+ if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
+ _meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
}
if ((dret = diskstream->process (bufs, transport_frame, nframes, playback_distance, (monitoring_state() == MonitoringDisk))) != 0) {
@@ -403,12 +394,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
process_output_buffers (bufs, start_frame, end_frame, nframes, declick, (!diskstream->record_enabled() && _session.transport_rolling()));
- for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
- if (d) {
- d->flush_buffers (nframes);
- }
- }
+ flush_processor_buffers_locked (nframes);
need_butler = diskstream->commit (playback_distance);
@@ -629,8 +615,9 @@ AudioTrack::freeze_me (InterThreadInfo& itt)
/* reset stuff that has already been accounted for in the freeze process */
- set_gain (GAIN_COEFF_UNITY, Controllable::NoGroup);
- _amp->gain_control()->set_automation_state (Off);
+ gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
+ gain_control()->set_automation_state (Off);
+
/* XXX need to use _main_outs _panner->set_automation_state (Off); */
_freeze_record.state = Frozen;
diff --git a/libs/ardour/audio_track_importer.cc b/libs/ardour/audio_track_importer.cc
index 43a4010..dd77cb3 100644
--- a/libs/ardour/audio_track_importer.cc
+++ b/libs/ardour/audio_track_importer.cc
@@ -31,7 +31,7 @@
#include <sstream>
#include <algorithm>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -51,7 +51,7 @@ AudioTrackImportHandler::AudioTrackImportHandler (XMLTree const & source, Sessio
XMLNodeList const & route_list = routes->children();
for (XMLNodeList::const_iterator it = route_list.begin(); it != route_list.end(); ++it) {
- const XMLProperty* type = (*it)->property("default-type");
+ XMLProperty const * type = (*it)->property("default-type");
if ( (!type || type->value() == "audio") && ((*it)->property ("diskstream") != 0 || (*it)->property ("diskstream-id") != 0)) {
try {
elements.push_back (ElementPtr ( new AudioTrackImporter (source, session, *this, **it, pl_handler)));
@@ -254,7 +254,7 @@ AudioTrackImporter::_prepare_move ()
return false;
}
- XMLProperty* p = c->property ("name");
+ XMLProperty * p = c->property ("name");
if (!p) {
error << _("badly-formed XML in imported track") << endmsg;
return false;
@@ -289,7 +289,7 @@ AudioTrackImporter::_move ()
}
boost::shared_ptr<XMLNode> ds_node = ds_node_list->front();
- XMLProperty* p = ds_node->property (X_("id"));
+ XMLProperty * p = ds_node->property (X_("id"));
assert (p);
p->set_value (new_ds_id.to_s());
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 6cb5c2a..5c324b0 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -71,7 +71,7 @@
#define ArdourFindNext AudioComponentFindNext
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -430,17 +430,27 @@ AUPlugin::AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAC
, comp (_comp)
, unit (new CAAudioUnit)
, initialized (false)
- , _current_block_size (0)
+ , _last_nframes (0)
+ , _current_latency (UINT_MAX)
, _requires_fixed_size_buffers (false)
, buffers (0)
+ , variable_inputs (false)
+ , variable_outputs (false)
+ , configured_input_busses (0)
+ , configured_output_busses (0)
+ , bus_inputs (0)
+ , bus_outputs (0)
, input_maxbuf (0)
, input_offset (0)
+ , cb_offsets (0)
, input_buffers (0)
+ , input_map (0)
, frames_processed (0)
, audio_input_cnt (0)
, _parameter_listener (0)
, _parameter_listener_arg (0)
- , last_transport_rolling (false)
+ , transport_frame (0)
+ , transport_speed (0)
, last_transport_speed (0.0)
{
if (!preset_search_path_initialized) {
@@ -461,16 +471,27 @@ AUPlugin::AUPlugin (const AUPlugin& other)
, comp (other.get_comp())
, unit (new CAAudioUnit)
, initialized (false)
- , _current_block_size (0)
, _last_nframes (0)
+ , _current_latency (UINT_MAX)
, _requires_fixed_size_buffers (false)
, buffers (0)
+ , variable_inputs (false)
+ , variable_outputs (false)
+ , configured_input_busses (0)
+ , configured_output_busses (0)
+ , bus_inputs (0)
+ , bus_outputs (0)
, input_maxbuf (0)
, input_offset (0)
+ , cb_offsets (0)
, input_buffers (0)
+ , input_map (0)
, frames_processed (0)
, _parameter_listener (0)
, _parameter_listener_arg (0)
+ , transport_frame (0)
+ , transport_speed (0)
+ , last_transport_speed (0.0)
{
init ();
@@ -491,9 +512,10 @@ AUPlugin::~AUPlugin ()
unit->Uninitialize ();
}
- if (buffers) {
- free (buffers);
- }
+ free (buffers);
+ free (bus_inputs);
+ free (bus_outputs);
+ free (cb_offsets);
}
void
@@ -584,18 +606,56 @@ AUPlugin::init ()
DEBUG_TRACE (DEBUG::AudioUnits, "count output elements\n");
unit->GetElementCount (kAudioUnitScope_Output, output_elements);
- if (input_elements > 0) {
- /* setup render callback: the plugin calls this to get input data
- */
+ cb_offsets = (framecnt_t*) calloc (input_elements, sizeof(uint32_t));
+ bus_inputs = (uint32_t*) calloc (input_elements, sizeof(uint32_t));
+ bus_outputs = (uint32_t*) calloc (output_elements, sizeof(uint32_t));
- AURenderCallbackStruct renderCallbackInfo;
+ for (size_t i = 0; i < output_elements; ++i) {
+ unit->Reset (kAudioUnitScope_Output, i);
+ AudioStreamBasicDescription fmt;
+ err = unit->GetFormat (kAudioUnitScope_Output, i, fmt);
+ if (err == noErr) {
+ bus_outputs[i] = fmt.mChannelsPerFrame;
+ }
+ CFStringRef name;
+ UInt32 sz = sizeof (CFStringRef);
+ if (AudioUnitGetProperty (unit->AU(), kAudioUnitProperty_ElementName, kAudioUnitScope_Output,
+ i, &name, &sz) == noErr
+ && sz > 0) {
+ _bus_name_out.push_back (CFStringRefToStdString (name));
+ CFRelease(name);
+ } else {
+ _bus_name_out.push_back (string_compose ("Audio-Bus %1", i));
+ }
+ }
+ for (size_t i = 0; i < input_elements; ++i) {
+ unit->Reset (kAudioUnitScope_Input, i);
+ AudioStreamBasicDescription fmt;
+ err = unit->GetFormat (kAudioUnitScope_Input, i, fmt);
+ if (err == noErr) {
+ bus_inputs[i] = fmt.mChannelsPerFrame;
+ }
+ CFStringRef name;
+ UInt32 sz = sizeof (CFStringRef);
+ if (AudioUnitGetProperty (unit->AU(), kAudioUnitProperty_ElementName, kAudioUnitScope_Input,
+ i, &name, &sz) == noErr
+ && sz > 0) {
+ _bus_name_in.push_back (CFStringRefToStdString (name));
+ CFRelease(name);
+ } else {
+ _bus_name_in.push_back (string_compose ("Audio-Bus %1", i));
+ }
+ }
+
+ for (size_t i = 0; i < input_elements; ++i) {
+ /* setup render callback: the plugin calls this to get input data */
+ AURenderCallbackStruct renderCallbackInfo;
renderCallbackInfo.inputProc = _render_callback;
renderCallbackInfo.inputProcRefCon = this;
-
DEBUG_TRACE (DEBUG::AudioUnits, "set render callback in input scope\n");
if ((err = unit->SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
- 0, (void*) &renderCallbackInfo, sizeof(renderCallbackInfo))) != 0) {
+ i, (void*) &renderCallbackInfo, sizeof(renderCallbackInfo))) != 0) {
error << string_compose (_("cannot install render callback (err = %1)"), err) << endmsg;
throw failed_constructor();
}
@@ -895,7 +955,12 @@ AUPlugin::default_value (uint32_t port)
framecnt_t
AUPlugin::signal_latency () const
{
- return unit->Latency() * _session.frame_rate();
+ guint lat = g_atomic_int_get (&_current_latency);;
+ if (lat == UINT_MAX) {
+ lat = unit->Latency() * _session.frame_rate();
+ g_atomic_int_set (&_current_latency, lat);
+ }
+ return lat;
}
void
@@ -1022,8 +1087,6 @@ AUPlugin::set_block_size (pframes_t nframes)
activate ();
}
- _current_block_size = nframes;
-
return 0;
}
@@ -1036,14 +1099,14 @@ AUPlugin::configure_io (ChanCount in, ChanCount out)
if (audio_input_cnt > 0) {
in.set (DataType::AUDIO, audio_input_cnt);
}
- int32_t audio_in = in.n_audio();
+ const int32_t audio_in = in.n_audio();
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("configure %1 for %2 in %3 out\n", name(), in, out));
if (initialized) {
//if we are already running with the requested i/o config, bail out here
if ( (audio_in==input_channels) && (audio_out==output_channels) ) {
- return 0;
+ return true;
} else {
deactivate ();
}
@@ -1063,41 +1126,104 @@ AUPlugin::configure_io (ChanCount in, ChanCount out)
streamFormat.mFramesPerPacket = 1;
/* apple says that for non-interleaved data, these
- values always refer to a single channel.
- */
+ * values always refer to a single channel.
+ */
streamFormat.mBytesPerPacket = 4;
streamFormat.mBytesPerFrame = 4;
- streamFormat.mChannelsPerFrame = audio_in;
+ configured_input_busses = 0;
+ configured_output_busses = 0;
+ /* reset busses */
+ for (size_t i = 0; i < output_elements; ++i) {
+ unit->Reset (kAudioUnitScope_Output, i);
+ }
+ for (size_t i = 0; i < input_elements; ++i) {
+ unit->Reset (kAudioUnitScope_Input, i);
+ }
+
+ /* now assign the channels to available busses */
+ uint32_t used_in = 0;
+ uint32_t used_out = 0;
- if (set_input_format (streamFormat) != 0) {
- return -1;
+ if (variable_inputs || input_elements == 1) {
+ // we only ever use the first bus
+ if (input_elements > 1) {
+ warning << string_compose (_("AU %1 has multiple input busses and variable port count."), name()) << endmsg;
+ }
+ streamFormat.mChannelsPerFrame = audio_in;
+ if (set_stream_format (kAudioUnitScope_Input, 0, streamFormat) != 0) {
+ return false;
+ }
+ configured_input_busses = 1;
+ used_in = audio_in;
+ } else {
+ configured_input_busses = 0;
+ uint32_t remain = audio_in;
+ for (uint32_t bus = 0; remain > 0 && bus < input_elements; ++bus) {
+ uint32_t cnt = std::min (remain, bus_inputs[bus]);
+ if (cnt == 0) { continue; }
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 configure input bus: %2 chn: %3", name(), bus, cnt));
+
+ streamFormat.mChannelsPerFrame = cnt;
+ if (set_stream_format (kAudioUnitScope_Input, bus, streamFormat) != 0) {
+ return false;
+ }
+ used_in += cnt;
+ ++configured_input_busses;
+ remain -= cnt;
+ }
}
- streamFormat.mChannelsPerFrame = audio_out;
+ if (variable_outputs || output_elements == 1) {
+ if (output_elements > 1) {
+ warning << string_compose (_("AU %1 has multiple output busses and variable port count."), name()) << endmsg;
+ }
- if (set_output_format (streamFormat) != 0) {
- return -1;
+ streamFormat.mChannelsPerFrame = audio_out;
+ if (set_stream_format (kAudioUnitScope_Output, 0, streamFormat) != 0) {
+ return false;
+ }
+ configured_output_busses = 1;
+ used_out = audio_out;
+ } else {
+ uint32_t remain = audio_out;
+ configured_output_busses = 0;
+ for (uint32_t bus = 0; remain > 0 && bus < output_elements; ++bus) {
+ uint32_t cnt = std::min (remain, bus_outputs[bus]);
+ if (cnt == 0) { continue; }
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 configure output bus: %2 chn: %3", name(), bus, cnt));
+ streamFormat.mChannelsPerFrame = cnt;
+ if (set_stream_format (kAudioUnitScope_Output, bus, streamFormat) != 0) {
+ return false;
+ }
+ used_out += cnt;
+ remain -= cnt;
+ ++configured_output_busses;
+ }
}
+ free (buffers);
+ buffers = (AudioBufferList *) malloc (offsetof(AudioBufferList, mBuffers) +
+ used_out * sizeof(::AudioBuffer));
+
+ input_channels = used_in;
+ output_channels = used_out;
/* reset plugin info to show currently configured state */
- _info->n_inputs = in;
- _info->n_outputs = out;
+ _info->n_inputs = ChanCount (DataType::AUDIO, used_in) + ChanCount (DataType::MIDI, _has_midi_input ? 1 : 0);
+ _info->n_outputs = ChanCount (DataType::AUDIO, used_out);
if (was_initialized) {
activate ();
}
- return 0;
+ return true;
}
ChanCount
AUPlugin::input_streams() const
{
ChanCount c;
-
-
if (input_channels < 0) {
// force PluginIoReConfigure -- see also commit msg e38eb06
c.set (DataType::AUDIO, 0);
@@ -1106,7 +1232,6 @@ AUPlugin::input_streams() const
c.set (DataType::AUDIO, input_channels);
c.set (DataType::MIDI, _has_midi_input ? 1 : 0);
}
-
return c;
}
@@ -1115,7 +1240,6 @@ ChanCount
AUPlugin::output_streams() const
{
ChanCount c;
-
if (output_channels < 0) {
// force PluginIoReConfigure - see also commit msg e38eb06
c.set (DataType::AUDIO, 0);
@@ -1124,43 +1248,73 @@ AUPlugin::output_streams() const
c.set (DataType::AUDIO, output_channels);
c.set (DataType::MIDI, _has_midi_output ? 1 : 0);
}
-
return c;
}
bool
-AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
+AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise)
{
- // Note: We never attempt to multiply-instantiate plugins to meet io configurations.
-
- int32_t audio_in = in.n_audio();
- int32_t audio_out;
- bool found = false;
+ _output_configs.clear ();
+ const int32_t audio_in = in.n_audio();
AUPluginInfoPtr pinfo = boost::dynamic_pointer_cast<AUPluginInfo>(get_info());
/* lets check MIDI first */
- if (in.n_midi() > 0) {
- if (!_has_midi_input) {
- return false;
+ if (in.n_midi() > 0 && !_has_midi_input && !imprecise) {
+ return false;
+ }
+
+ vector<pair<int,int> > io_configs = pinfo->cache.io_configs;
+
+ if (input_elements > 1) {
+ const vector<pair<int,int> >& ioc (pinfo->cache.io_configs);
+ for (vector<pair<int,int> >::const_iterator i = ioc.begin(); i != ioc.end(); ++i) {
+ int32_t possible_in = i->first;
+ int32_t possible_out = i->second;
+ if (possible_in < 1 || possible_out < 1) {
+ continue;
+ }
+ for (uint32_t i = 1; i < input_elements; ++i) {
+ // can't use up-to bus_inputs[]
+ // waves' SC-C6(s) for example fails to configure with only 1 input
+ // on the 2nd bus.
+ io_configs.push_back (pair<int,int> (possible_in + bus_inputs[i], possible_out));
+ }
}
}
- vector<pair<int,int> >& io_configs = pinfo->cache.io_configs;
+ if (output_elements > 1) {
+ const vector<pair<int,int> >& ioc (pinfo->cache.io_configs);
+ for (vector<pair<int,int> >::const_iterator i = ioc.begin(); i != ioc.end(); ++i) {
+ int32_t possible_in = i->first;
+ int32_t possible_out = i->second;
+ if (possible_in < 1 || possible_out < 1) {
+ continue;
+ }
+ for (uint32_t i = 1; i < output_elements; ++i) {
+ int32_t c = bus_outputs[i];
+ for (uint32_t j = 1; j < i; ++j) {
+ c += bus_outputs [j];
+ }
+ io_configs.push_back (pair<int,int> (possible_in, possible_out + c));
+ }
+ }
+ }
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 has %2 IO configurations, looking for %3 in, %4 out\n",
name(), io_configs.size(), in, out));
- //Ardour expects the plugin to tell it the output
- //configuration but AU plugins can have multiple I/O
- //configurations in most cases. so first lets see
- //if there's a configuration that keeps out==in
-
- if (in.n_midi() > 0 && audio_in == 0) {
- audio_out = 2; // prefer stereo version if available.
- } else {
- audio_out = audio_in;
+#if 0
+ printf ("AU I/O Configs %s %d\n", name(), io_configs.size());
+ for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
+ printf ("- I/O %d / %d\n", i->first, i->second);
}
+#endif
+
+ // preferred setting (provided by plugin_insert)
+ const int preferred_out = out.n_audio ();
+ bool found = false;
+ bool exact_match = false;
/* kAudioUnitProperty_SupportedNumChannels
* https://developer.apple.com/library/mac/documentation/MusicAudio/Conceptual/AudioUnitProgrammingGuide/TheAudioUnit/TheAudioUnit.html#//apple_ref/doc/uid/TP40003278-CH12-SW20
@@ -1193,21 +1347,50 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
int32_t possible_in = i->first;
int32_t possible_out = i->second;
- if ((possible_in == audio_in) && (possible_out == audio_out)) {
+ if ((possible_in == audio_in) && (possible_out == preferred_out)) {
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tCHOSEN: %1 in %2 out to match in %3 out %4\n",
- possible_in, possible_out,
- in, out));
+ possible_in, possible_out,
+ in, out));
- out.set (DataType::MIDI, 0);
- out.set (DataType::AUDIO, audio_out);
-
- return 1;
+ // exact match
+ _output_configs.insert (preferred_out);
+ exact_match = true;
+ found = true;
+ break;
}
}
/* now allow potentially "imprecise" matches */
+ int32_t audio_out = -1;
+ float penalty = 9999;
+ int used_possible_in = 0;
+#if defined (__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wtautological-compare"
+#endif
+
+#define FOUNDCFG(nch) { \
+ float p = fabsf ((float)(nch) - preferred_out); \
+ _output_configs.insert (nch); \
+ if ((nch) > preferred_out) { p *= 1.1; } \
+ if (p < penalty) { \
+ used_possible_in = possible_in; \
+ audio_out = (nch); \
+ penalty = p; \
+ found = true; \
+ variable_inputs = possible_in < 0; \
+ variable_outputs = possible_out < 0; \
+ } \
+}
- audio_out = -1;
+#define ANYTHINGGOES \
+ _output_configs.insert (0);
+
+#define UPTO(nch) { \
+ for (int n = 1; n <= nch; ++n) { \
+ _output_configs.insert (n); \
+ } \
+}
for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
@@ -1223,252 +1406,237 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
}
if (possible_in == 0) {
-
- /* instrument plugin, always legal but throws away inputs ...
- */
-
+ /* no inputs, generators & instruments */
if (possible_out == -1) {
/* any configuration possible, provide stereo output */
- audio_out = 2;
- found = true;
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out == -2) {
- /* plugins shouldn't really use (0,-2) but might.
- any configuration possible, provide stereo output
- */
- audio_out = 2;
- found = true;
+ /* invalid, should be (0, -1) */
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out < -2) {
- /* explicitly variable number of outputs.
- *
- * We really need to ask the user in this case.
- * stereo will be correct in 99.9% of all cases.
- */
- audio_out = 2;
- found = true;
+ /* variable number of outputs up to -N, */
+ FOUNDCFG (min (-possible_out, preferred_out));
+ UPTO (-possible_out);
} else {
/* exact number of outputs */
- audio_out = possible_out;
- found = true;
+ FOUNDCFG (possible_out);
}
}
if (possible_in == -1) {
-
/* wildcard for input */
-
if (possible_out == -1) {
- /* out much match in */
- audio_out = audio_in;
- found = true;
+ /* out must match in */
+ FOUNDCFG (audio_in);
} else if (possible_out == -2) {
/* any configuration possible, pick matching */
- audio_out = audio_in;
- found = true;
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out < -2) {
/* explicitly variable number of outputs, pick maximum */
- audio_out = -possible_out;
- found = true;
+ FOUNDCFG (max (-possible_out, preferred_out));
+ /* and try min, too, in case the penalty is lower */
+ FOUNDCFG (min (-possible_out, preferred_out));
+ UPTO (-possible_out)
} else {
/* exact number of outputs */
- audio_out = possible_out;
- found = true;
+ FOUNDCFG (possible_out);
}
}
if (possible_in == -2) {
-
if (possible_out == -1) {
/* any configuration possible, pick matching */
- audio_out = audio_in;
- found = true;
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out == -2) {
- /* plugins shouldn't really use (-2,-2) but might.
- interpret as (-1,-1).
- */
- audio_out = audio_in;
- found = true;
+ /* invalid. interpret as (-1, -1) */
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out < -2) {
- /* explicitly variable number of outputs, pick maximum */
- audio_out = -possible_out;
- found = true;
+ /* invalid, interpret as (<-2, <-2)
+ * variable number of outputs up to -N, */
+ FOUNDCFG (min (-possible_out, preferred_out));
+ UPTO (-possible_out)
} else {
/* exact number of outputs */
- audio_out = possible_out;
- found = true;
+ FOUNDCFG (possible_out);
}
}
if (possible_in < -2) {
-
/* explicit variable number of inputs */
-
- if (audio_in > -possible_in) {
- /* request is too large */
+ if (audio_in > -possible_in && imprecise != NULL) {
+ // hide inputs ports
+ imprecise->set (DataType::AUDIO, -possible_in);
}
-
- if (possible_out == -1) {
- /* any output configuration possible, provide stereo out */
- audio_out = 2;
- found = true;
+ if (audio_in > -possible_in && imprecise == NULL) {
+ /* request is too large */
+ } else if (possible_out == -1) {
+ /* any output configuration possible */
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out == -2) {
- /* plugins shouldn't really use (<-2,-2) but might.
- interpret as (<-2,-1): any configuration possible, provide stereo output
- */
- audio_out = 2;
- found = true;
+ /* invalid. interpret as (<-2, -1) */
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out < -2) {
- /* explicitly variable number of outputs.
- *
- * We really need to ask the user in this case.
- * stereo will be correct in 99.9% of all cases.
- */
- audio_out = 2;
- found = true;
+ /* variable number of outputs up to -N, */
+ FOUNDCFG (min (-possible_out, preferred_out));
+ UPTO (-possible_out)
} else {
/* exact number of outputs */
- audio_out = possible_out;
- found = true;
+ FOUNDCFG (possible_out);
}
}
if (possible_in && (possible_in == audio_in)) {
-
/* exact number of inputs ... must match obviously */
-
if (possible_out == -1) {
- /* any output configuration possible, provide stereo output */
- audio_out = 2;
- found = true;
+ /* any output configuration possible */
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out == -2) {
- /* plugins shouldn't really use (>0,-2) but might.
- interpret as (>0,-1):
- any output configuration possible, provide stereo output
- */
- audio_out = 2;
- found = true;
+ /* plugins shouldn't really use (>0,-2), interpret as (>0,-1) */
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
} else if (possible_out < -2) {
- /* explicitly variable number of outputs, pick maximum */
- audio_out = -possible_out;
- found = true;
+ /* > 0, < -2 is not specified
+ * interpret as up to -N */
+ FOUNDCFG (min (-possible_out, preferred_out));
+ UPTO (-possible_out)
} else {
/* exact number of outputs */
- audio_out = possible_out;
- found = true;
+ FOUNDCFG (possible_out);
}
}
+ }
+
+ if (!found && imprecise) {
+ /* try harder */
+ for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
+ int32_t possible_in = i->first;
+ int32_t possible_out = i->second;
+
+ assert (possible_in > 0); // all other cases will have been matched above
+ assert (possible_out !=0 || possible_in !=0); // already handled above
- if (found) {
- if (possible_in < -2 && audio_in == 0) {
- // input-port count cannot be zero, use as many ports
- // as outputs, but at most abs(possible_in)
- audio_input_cnt = max (1, min (audio_out, -possible_in));
+ imprecise->set (DataType::AUDIO, possible_in);
+ if (possible_out == -1 || possible_out == -2) {
+ FOUNDCFG (2);
+ } else if (possible_out < -2) {
+ /* explicitly variable number of outputs, pick maximum */
+ FOUNDCFG (min (-possible_out, preferred_out));
+ } else {
+ /* exact number of outputs */
+ FOUNDCFG (possible_out);
}
- break;
+ // ideally we'll also find the closest, best matching
+ // input configuration with minimal output penalty...
}
-
}
- if (found) {
- out.set (DataType::MIDI, 0); /// XXX
- out.set (DataType::AUDIO, audio_out);
- DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tCHOSEN: in %1 out %2\n", in, out));
- } else {
+ if (!found) {
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tFAIL: no io configs match %1\n", in));
return false;
}
- return true;
-}
-
-int
-AUPlugin::set_input_format (AudioStreamBasicDescription& fmt)
-{
- return set_stream_format (kAudioUnitScope_Input, input_elements, fmt);
-}
-
-int
-AUPlugin::set_output_format (AudioStreamBasicDescription& fmt)
-{
- if (set_stream_format (kAudioUnitScope_Output, output_elements, fmt) != 0) {
- return -1;
- }
-
- if (buffers) {
- free (buffers);
- buffers = 0;
+ if (exact_match) {
+ out.set (DataType::MIDI, 0); // currently always zero
+ out.set (DataType::AUDIO, preferred_out);
+ } else {
+ if (used_possible_in < -2 && audio_in == 0) {
+ // input-port count cannot be zero, use as many ports
+ // as outputs, but at most abs(possible_in)
+ audio_input_cnt = max (1, min (audio_out, -used_possible_in));
+ }
+ out.set (DataType::MIDI, 0); /// XXX
+ out.set (DataType::AUDIO, audio_out);
}
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tCHOSEN: in %1 out %2\n", in, out));
- buffers = (AudioBufferList *) malloc (offsetof(AudioBufferList, mBuffers) +
- fmt.mChannelsPerFrame * sizeof(::AudioBuffer));
-
- return 0;
+#if defined (__clang__)
+# pragma clang diagnostic pop
+#endif
+ return true;
}
int
-AUPlugin::set_stream_format (int scope, uint32_t cnt, AudioStreamBasicDescription& fmt)
+AUPlugin::set_stream_format (int scope, uint32_t bus, AudioStreamBasicDescription& fmt)
{
OSErr result;
- for (uint32_t i = 0; i < cnt; ++i) {
- DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("set stream format for %1, scope = %2 element %3\n",
- (scope == kAudioUnitScope_Input ? "input" : "output"),
- scope, cnt));
- if ((result = unit->SetFormat (scope, i, fmt)) != 0) {
- error << string_compose (_("AUPlugin: could not set stream format for %1/%2 (err = %3)"),
- (scope == kAudioUnitScope_Input ? "input" : "output"), i, result) << endmsg;
- return -1;
- }
- }
-
- if (scope == kAudioUnitScope_Input) {
- input_channels = fmt.mChannelsPerFrame;
- } else {
- output_channels = fmt.mChannelsPerFrame;
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("set stream format for %1, scope = %2 element %3\n",
+ (scope == kAudioUnitScope_Input ? "input" : "output"),
+ scope, bus));
+ if ((result = unit->SetFormat (scope, bus, fmt)) != 0) {
+ error << string_compose (_("AUPlugin: could not set stream format for %1/%2 (err = %3)"),
+ (scope == kAudioUnitScope_Input ? "input" : "output"), bus, result) << endmsg;
+ return -1;
}
-
return 0;
}
OSStatus
AUPlugin::render_callback(AudioUnitRenderActionFlags*,
const AudioTimeStamp*,
- UInt32,
- UInt32 inNumberFrames,
- AudioBufferList* ioData)
+ UInt32 bus,
+ UInt32 inNumberFrames,
+ AudioBufferList* ioData)
{
/* not much to do with audio - the data is already in the buffers given to us in connect_and_run() */
- // DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1: render callback, frames %2 bufs %3\n",
- // name(), inNumberFrames, ioData->mNumberBuffers));
+ // DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1: render callback, frames %2 bus %3 bufs %4\n",
+ // name(), inNumberFrames, bus, ioData->mNumberBuffers));
if (input_maxbuf == 0) {
+ DEBUG_TRACE (DEBUG::AudioUnits, "AUPlugin: render callback called illegally!");
error << _("AUPlugin: render callback called illegally!") << endmsg;
return kAudioUnitErr_CannotDoInCurrentContext;
}
+
+ assert (bus < input_elements);
+ uint32_t busoff = 0;
+ for (uint32_t i = 0; i < bus; ++i) {
+ busoff += bus_inputs[i];
+ }
+
uint32_t limit = min ((uint32_t) ioData->mNumberBuffers, input_maxbuf);
+ ChanCount bufs_count (DataType::AUDIO, 1);
+ BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
+
+ /* apply bus offsets */
+
for (uint32_t i = 0; i < limit; ++i) {
ioData->mBuffers[i].mNumberChannels = 1;
ioData->mBuffers[i].mDataByteSize = sizeof (Sample) * inNumberFrames;
- /* we don't use the channel mapping because audiounits are
- * never replicated. one plugin instance uses all channels/buffers
- * passed to PluginInsert::connect_and_run()
- */
-
- ioData->mBuffers[i].mData = input_buffers->get_audio (i).data (cb_offset + input_offset);
+ bool valid = false;
+ uint32_t idx = input_map->get (DataType::AUDIO, i + busoff, &valid);
+ if (valid) {
+ ioData->mBuffers[i].mData = input_buffers->get_audio (idx).data (cb_offsets[bus] + input_offset);
+ } else {
+ ioData->mBuffers[i].mData = silent_bufs.get_audio(0).data (cb_offsets[bus] + input_offset);
+ }
}
-
- cb_offset += inNumberFrames;
-
+ cb_offsets[bus] += inNumberFrames;
return noErr;
}
int
-AUPlugin::connect_and_run (BufferSet& bufs, ChanMapping in_map, ChanMapping out_map, pframes_t nframes, framecnt_t offset)
+AUPlugin::connect_and_run (BufferSet& bufs,
+ framepos_t start, framepos_t end, double speed,
+ ChanMapping in_map, ChanMapping out_map,
+ pframes_t nframes, framecnt_t offset)
{
- Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
+ Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
+
+ transport_frame = start;
+ transport_speed = speed;
AudioUnitRenderActionFlags flags = 0;
AudioTimeStamp ts;
@@ -1479,101 +1647,151 @@ AUPlugin::connect_and_run (BufferSet& bufs, ChanMapping in_map, ChanMapping out_
_last_nframes = nframes;
}
- DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 in %2 out %3 MIDI %4 bufs %5 (available %6)\n",
+ /* test if we can run in-place; only compare audio buffers */
+ bool inplace = true; // TODO check plugin-insert in-place ?
+ ChanMapping::Mappings inmap (in_map.mappings ());
+ ChanMapping::Mappings outmap (out_map.mappings ());
+ if (outmap[DataType::AUDIO].size () == 0) {
+ inplace = false;
+ }
+ if (inmap[DataType::AUDIO].size() > 0 && inmap != outmap) {
+ inplace = false;
+ }
+
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 in %2 out %3 MIDI %4 bufs %5 (available %6) InBus %7 OutBus %8 Inplace: %9 var-i/o %10 %11\n",
name(), input_channels, output_channels, _has_midi_input,
- bufs.count(), bufs.available()));
+ bufs.count(), bufs.available(),
+ configured_input_busses, configured_output_busses, inplace, variable_inputs, variable_outputs));
/* the apparent number of buffers matches our input configuration, but we know that the bufferset
- has the capacity to handle our outputs.
- */
+ * has the capacity to handle our outputs.
+ */
assert (bufs.available() >= ChanCount (DataType::AUDIO, output_channels));
input_buffers = &bufs;
+ input_map = &in_map;
input_maxbuf = bufs.count().n_audio(); // number of input audio buffers
input_offset = offset;
- cb_offset = 0;
-
- buffers->mNumberBuffers = output_channels;
-
- for (int32_t i = 0; i < output_channels; ++i) {
- buffers->mBuffers[i].mNumberChannels = 1;
- buffers->mBuffers[i].mDataByteSize = nframes * sizeof (Sample);
- /* setting this to 0 indicates to the AU that it can provide buffers here
- * if necessary. if it can process in-place, it will use the buffers provided
- * as input by ::render_callback() above.
- *
- * a non-null values tells the plugin to render into the buffer pointed
- * at by the value.
- */
- buffers->mBuffers[i].mData = 0;
+ for (size_t i = 0; i < input_elements; ++i) {
+ cb_offsets[i] = 0;
}
- if (_has_midi_input) {
+ ChanCount bufs_count (DataType::AUDIO, 1);
+ BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
+ if (_has_midi_input) {
uint32_t nmidi = bufs.count().n_midi();
-
for (uint32_t i = 0; i < nmidi; ++i) {
-
/* one MIDI port/buffer only */
-
MidiBuffer& m = bufs.get_midi (i);
-
for (MidiBuffer::iterator i = m.begin(); i != m.end(); ++i) {
Evoral::MIDIEvent<framepos_t> ev (*i);
-
if (ev.is_channel_event()) {
const uint8_t* b = ev.buffer();
DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1: MIDI event %2\n", name(), ev));
unit->MIDIEvent (b[0], b[1], b[2], ev.time());
}
-
/* XXX need to handle sysex and other message types */
}
}
}
- /* does this really mean anything ?
- */
-
- ts.mSampleTime = frames_processed;
- ts.mFlags = kAudioTimeStampSampleTimeValid;
+ assert (input_maxbuf < 512);
+ std::bitset<512> used_outputs;
- DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 render flags=%2 time=%3 nframes=%4 buffers=%5\n",
- name(), flags, frames_processed, nframes, buffers->mNumberBuffers));
+ bool ok = true;
+ uint32_t busoff = 0;
+ uint32_t remain = output_channels;
+ for (uint32_t bus = 0; remain > 0 && bus < configured_output_busses; ++bus) {
+ uint32_t cnt;
+ if (variable_outputs || (output_elements == configured_output_busses && configured_output_busses == 1)) {
+ cnt = output_channels;
+ } else {
+ cnt = std::min (remain, bus_outputs[bus]);
+ }
+ assert (cnt > 0);
+
+ buffers->mNumberBuffers = cnt;
+
+ for (uint32_t i = 0; i < cnt; ++i) {
+ buffers->mBuffers[i].mNumberChannels = 1;
+ buffers->mBuffers[i].mDataByteSize = nframes * sizeof (Sample);
+ /* setting this to 0 indicates to the AU that it can provide buffers here
+ * if necessary. if it can process in-place, it will use the buffers provided
+ * as input by ::render_callback() above.
+ *
+ * a non-null values tells the plugin to render into the buffer pointed
+ * at by the value.
+ */
+ if (inplace) {
+ buffers->mBuffers[i].mData = 0;
+ } else {
+ bool valid = false;
+ uint32_t idx = out_map.get (DataType::AUDIO, i + busoff, &valid);
+ if (valid) {
+ buffers->mBuffers[i].mData = bufs.get_audio (idx).data (offset);
+ } else {
+ buffers->mBuffers[i].mData = scratch_bufs.get_audio(0).data(offset);
+ }
+ }
+ }
- if ((err = unit->Render (&flags, &ts, 0, nframes, buffers)) == noErr) {
+ /* does this really mean anything ? */
+ ts.mSampleTime = frames_processed;
+ ts.mFlags = kAudioTimeStampSampleTimeValid;
- input_maxbuf = 0;
- frames_processed += nframes;
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 render flags=%2 time=%3 nframes=%4 bus=%5 buffers=%6\n",
+ name(), flags, frames_processed, nframes, bus, buffers->mNumberBuffers));
- DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 rendered %2 buffers of %3\n",
- name(), buffers->mNumberBuffers, output_channels));
+ if ((err = unit->Render (&flags, &ts, bus, nframes, buffers)) == noErr) {
- int32_t limit = min ((int32_t) buffers->mNumberBuffers, output_channels);
- int32_t i;
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 rendered %2 buffers of %3\n",
+ name(), buffers->mNumberBuffers, output_channels));
- for (i = 0; i < limit; ++i) {
- Sample* expected_buffer_address= bufs.get_audio (i).data (offset);
- if (expected_buffer_address != buffers->mBuffers[i].mData) {
- /* plugin provided its own buffer for output so copy it back to where we want it
- */
- memcpy (expected_buffer_address, buffers->mBuffers[i].mData, nframes * sizeof (Sample));
+ uint32_t limit = std::min ((uint32_t) buffers->mNumberBuffers, cnt);
+ for (uint32_t i = 0; i < limit; ++i) {
+ bool valid = false;
+ uint32_t idx = out_map.get (DataType::AUDIO, i + busoff, &valid);
+ if (!valid) continue;
+ used_outputs.set (i + busoff);
+ Sample* expected_buffer_address = bufs.get_audio (idx).data (offset);
+ if (expected_buffer_address != buffers->mBuffers[i].mData) {
+ /* plugin provided its own buffer for output so copy it back to where we want it */
+ memcpy (expected_buffer_address, buffers->mBuffers[i].mData, nframes * sizeof (Sample));
+ }
}
+ } else {
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose (_("AU: render error for %1, bus %2 status = %3\n"), name(), bus, err));
+ error << string_compose (_("AU: render error for %1, bus %2 status = %3"), name(), bus, err) << endmsg;
+ ok = false;
+ break;
}
- /* now silence any buffers that were passed in but the that the plugin
- * did not fill/touch/use.
- */
+ remain -= cnt;
+ busoff += bus_outputs[bus];
+ }
- for (;i < output_channels; ++i) {
- memset (bufs.get_audio (i).data (offset), 0, nframes * sizeof (Sample));
- }
+ /* now silence any buffers that were passed in but the that the plugin
+ * did not fill/touch/use.
+ *
+ * TODO: optimize, when plugin-insert is processing in-place
+ * unconnected buffers are (also) cleared there.
+ */
+ for (uint32_t i = 0; i < input_maxbuf; ++i) {
+ if (used_outputs.test (i)) { continue; }
+ bool valid = false;
+ uint32_t idx = out_map.get (DataType::AUDIO, i, &valid);
+ if (!valid) continue;
+ memset (bufs.get_audio (idx).data (offset), 0, nframes * sizeof (Sample));
+ }
+
+ input_maxbuf = 0;
+ if (ok) {
+ frames_processed += nframes;
return 0;
}
-
- error << string_compose (_("AU: render error for %1, status = %2"), name(), err) << endmsg;
return -1;
}
@@ -1594,16 +1812,16 @@ AUPlugin::get_beat_and_tempo_callback (Float64* outCurrentBeat,
return kAudioUnitErr_CannotDoInCurrentContext;
}
- Timecode::BBT_Time bbt;
- TempoMetric metric = tmap.metric_at (_session.transport_frame() + input_offset);
- tmap.bbt_time (_session.transport_frame() + input_offset, bbt);
+ TempoMetric metric = tmap.metric_at (transport_frame + input_offset);
+ Timecode::BBT_Time bbt = _session.tempo_map().bbt_at_frame (transport_frame + input_offset);
if (outCurrentBeat) {
+ const double ppq_scaling = metric.meter().note_divisor() / 4.0;
float beat;
- beat = metric.meter().divisions_per_bar() * bbt.bars;
- beat += bbt.beats;
+ beat = metric.meter().divisions_per_bar() * (bbt.bars - 1);
+ beat += (bbt.beats - 1);
beat += bbt.ticks / Timecode::BBT_Time::ticks_per_beat;
- *outCurrentBeat = beat;
+ *outCurrentBeat = beat * ppq_scaling;
}
if (outCurrentTempo) {
@@ -1633,18 +1851,16 @@ AUPlugin::get_musical_time_location_callback (UInt32* outDeltaSampleOffsetToNe
return kAudioUnitErr_CannotDoInCurrentContext;
}
- Timecode::BBT_Time bbt;
- TempoMetric metric = tmap.metric_at (_session.transport_frame() + input_offset);
- tmap.bbt_time (_session.transport_frame() + input_offset, bbt);
+ TempoMetric metric = tmap.metric_at (transport_frame + input_offset);
+ Timecode::BBT_Time bbt = _session.tempo_map().bbt_at_frame (transport_frame + input_offset);
if (outDeltaSampleOffsetToNextBeat) {
if (bbt.ticks == 0) {
/* on the beat */
*outDeltaSampleOffsetToNextBeat = 0;
} else {
- *outDeltaSampleOffsetToNextBeat = (UInt32)
- floor (((Timecode::BBT_Time::ticks_per_beat - bbt.ticks)/Timecode::BBT_Time::ticks_per_beat) * // fraction of a beat to next beat
- metric.tempo().frames_per_beat (_session.frame_rate())); // frames per beat
+ double const beat_frac_to_next = (Timecode::BBT_Time::ticks_per_beat - bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
+ *outDeltaSampleOffsetToNextBeat = tmap.frame_at_beat (tmap.beat_at_frame (transport_frame + input_offset) + beat_frac_to_next);
}
}
@@ -1678,22 +1894,20 @@ AUPlugin::get_transport_state_callback (Boolean* outIsPlaying,
Float64* outCycleStartBeat,
Float64* outCycleEndBeat)
{
- bool rolling;
- float speed;
+ const bool rolling = (transport_speed != 0);
+ const bool last_transport_rolling = (last_transport_speed != 0);
DEBUG_TRACE (DEBUG::AudioUnits, "AU calls ardour transport state callback\n");
- rolling = _session.transport_rolling();
- speed = _session.transport_speed ();
if (outIsPlaying) {
- *outIsPlaying = _session.transport_rolling();
+ *outIsPlaying = rolling;
}
if (outTransportStateChanged) {
if (rolling != last_transport_rolling) {
*outTransportStateChanged = true;
- } else if (speed != last_transport_speed) {
+ } else if (transport_speed != last_transport_speed) {
*outTransportStateChanged = true;
} else {
*outTransportStateChanged = false;
@@ -1704,13 +1918,14 @@ AUPlugin::get_transport_state_callback (Boolean* outIsPlaying,
/* this assumes that the AU can only call this host callback from render context,
where input_offset is valid.
*/
- *outCurrentSampleInTimeLine = _session.transport_frame() + input_offset;
+ *outCurrentSampleInTimeLine = transport_frame + input_offset;
}
if (outIsCycling) {
+ // TODO check bounce-processing
Location* loc = _session.locations()->auto_loop_location();
- *outIsCycling = (loc && _session.transport_rolling() && _session.get_play_loop());
+ *outIsCycling = (loc && rolling && _session.get_play_loop());
if (*outIsCycling) {
@@ -1730,7 +1945,7 @@ AUPlugin::get_transport_state_callback (Boolean* outIsPlaying,
if (outCycleStartBeat) {
TempoMetric metric = tmap.metric_at (loc->start() + input_offset);
- _session.tempo_map().bbt_time (loc->start(), bbt);
+ bbt = _session.tempo_map().bbt_at_frame (loc->start() + input_offset);
float beat;
beat = metric.meter().divisions_per_bar() * bbt.bars;
@@ -1742,7 +1957,7 @@ AUPlugin::get_transport_state_callback (Boolean* outIsPlaying,
if (outCycleEndBeat) {
TempoMetric metric = tmap.metric_at (loc->end() + input_offset);
- _session.tempo_map().bbt_time (loc->end(), bbt);
+ bbt = _session.tempo_map().bbt_at_frame (loc->end() + input_offset);
float beat;
beat = metric.meter().divisions_per_bar() * bbt.bars;
@@ -1755,8 +1970,7 @@ AUPlugin::get_transport_state_callback (Boolean* outIsPlaying,
}
}
- last_transport_rolling = rolling;
- last_transport_speed = speed;
+ last_transport_speed = transport_speed;
return noErr;
}
@@ -1775,6 +1989,60 @@ AUPlugin::automatable() const
return automates;
}
+Plugin::IOPortDescription
+AUPlugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
+{
+ std::stringstream ss;
+ switch (dt) {
+ case DataType::AUDIO:
+ break;
+ case DataType::MIDI:
+ ss << _("Midi");
+ break;
+ default:
+ ss << _("?");
+ break;
+ }
+
+ if (dt == DataType::AUDIO) {
+ if (input) {
+ uint32_t pid = id;
+ for (uint32_t bus = 0; bus < input_elements; ++bus) {
+ if (pid < bus_inputs[bus]) {
+ id = pid;
+ ss << _bus_name_in[bus];
+ ss << " / Bus " << (1 + bus);
+ break;
+ }
+ pid -= bus_inputs[bus];
+ }
+ }
+ else {
+ uint32_t pid = id;
+ for (uint32_t bus = 0; bus < output_elements; ++bus) {
+ if (pid < bus_outputs[bus]) {
+ id = pid;
+ ss << _bus_name_out[bus];
+ ss << " / Bus " << (1 + bus);
+ break;
+ }
+ pid -= bus_outputs[bus];
+ }
+ }
+ }
+
+ if (input) {
+ ss << " " << _("In") << " ";
+ } else {
+ ss << " " << _("Out") << " ";
+ }
+
+ ss << (id + 1);
+
+ Plugin::IOPortDescription iod (ss.str());
+ return iod;
+}
+
string
AUPlugin::describe_parameter (Evoral::Parameter param)
{
@@ -1833,7 +2101,7 @@ AUPlugin::parameter_is_output (uint32_t param) const
void
AUPlugin::add_state (XMLNode* root) const
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
CFDataRef xmlData;
CFPropertyListRef propertyList;
@@ -1872,7 +2140,7 @@ AUPlugin::set_state(const XMLNode& node, int version)
{
int ret = -1;
CFPropertyListRef propertyList;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
if (node.name() != state_node_name()) {
error << _("Bad node sent to AUPlugin::set_state") << endmsg;
@@ -2485,6 +2753,8 @@ AUPluginInfo::discover (bool scan_only)
if (!Glib::file_test (au_cache_path(), Glib::FILE_TEST_EXISTS)) {
ARDOUR::BootMessage (_("Discovering AudioUnit plugins (could take some time ...)"));
+ // flush RAM cache -- after clear_cache()
+ cached_info.clear();
}
// create crash log file
au_start_crashlog ();
@@ -2645,6 +2915,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
continue;
}
+ bool has_midi_in = false;
+
AUPluginInfoPtr info (new AUPluginInfo
(boost::shared_ptr<CAComponentDescription> (new CAComponentDescription(temp))));
@@ -2669,9 +2941,11 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
break;
case kAudioUnitType_MusicDevice:
info->category = _("AudioUnit Instruments");
+ has_midi_in = true;
break;
case kAudioUnitType_MusicEffect:
info->category = _("AudioUnit MusicEffects");
+ has_midi_in = true;
break;
case kAudioUnitType_Effect:
info->category = _("AudioUnit Effects");
@@ -2699,8 +2973,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
info->type = ARDOUR::AudioUnit;
info->unique_id = stringify_descriptor (*info->descriptor);
- /* XXX not sure of the best way to handle plugin versioning yet
- */
+ /* XXX not sure of the best way to handle plugin versioning yet */
CAComponent cacomp (*info->descriptor);
@@ -2738,6 +3011,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
info->n_inputs.set (DataType::AUDIO, 1);
}
+ info->n_inputs.set (DataType::MIDI, has_midi_in ? 1 : 0);
+
if (possible_out > 0) {
info->n_outputs.set (DataType::AUDIO, possible_out);
} else {
@@ -2820,20 +3095,34 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
}
if (ret > 0) {
-
- /* no explicit info available, so default to 1in/1out */
-
- /* XXX this is wrong. we should be indicating wildcard values */
-
+ /* AU is expected to deal with same channel valance in and out */
cinfo.io_configs.push_back (pair<int,int> (-1, -1));
-
} else {
-
- /* store each configuration */
-
- for (uint32_t n = 0; n < cnt; ++n) {
- cinfo.io_configs.push_back (pair<int,int> (channel_info[n].inChannels,
- channel_info[n].outChannels));
+ /* CAAudioUnit::GetChannelInfo silently merges bus formats
+ * check if this was the case and if so, add
+ * bus configs as incremental options.
+ */
+ Boolean* isWritable = 0;
+ UInt32 dataSize = 0;
+ OSStatus result = AudioUnitGetPropertyInfo (unit.AU(),
+ kAudioUnitProperty_SupportedNumChannels,
+ kAudioUnitScope_Global, 0,
+ &dataSize, isWritable);
+ if (result != noErr && (comp.Desc().IsGenerator() || comp.Desc().IsMusicDevice())) {
+ /* incrementally add busses */
+ int in = 0;
+ int out = 0;
+ for (uint32_t n = 0; n < cnt; ++n) {
+ in += channel_info[n].inChannels;
+ out += channel_info[n].outChannels;
+ cinfo.io_configs.push_back (pair<int,int> (in, out));
+ }
+ } else {
+ /* store each configuration */
+ for (uint32_t n = 0; n < cnt; ++n) {
+ cinfo.io_configs.push_back (pair<int,int> (channel_info[n].inChannels,
+ channel_info[n].outChannels));
+ }
}
free (channel_info);
@@ -2846,6 +3135,17 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
}
void
+AUPluginInfo::clear_cache ()
+{
+ const string& fn = au_cache_path();
+ if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+ ::g_unlink(fn.c_str());
+ }
+ // keep cached_info in RAM until restart or re-scan
+ cached_info.clear();
+}
+
+void
AUPluginInfo::add_cached_info (const std::string& id, AUPluginCachedInfo& cinfo)
{
cached_info[id] = cinfo;
@@ -2913,7 +3213,7 @@ AUPluginInfo::load_cached_info ()
}
//initial version has incorrectly stored i/o info, and/or garbage chars.
- const XMLProperty* version = root->property(X_("version"));
+ XMLProperty const * version = root->property(X_("version"));
if (! ((version != NULL) && (version->value() == X_(AU_CACHE_VERSION)))) {
error << "au_cache is not correct version. AU plugins will be re-scanned" << endmsg;
return -1;
@@ -2931,7 +3231,7 @@ AUPluginInfo::load_cached_info ()
const XMLNode* gchild;
const XMLNodeList gchildren = child->children();
- const XMLProperty* prop = child->property (X_("id"));
+ XMLProperty const * prop = child->property (X_("id"));
if (!prop) {
continue;
@@ -2969,8 +3269,8 @@ AUPluginInfo::load_cached_info ()
int in;
int out;
- const XMLProperty* iprop;
- const XMLProperty* oprop;
+ XMLProperty const * iprop;
+ XMLProperty const * oprop;
if (((iprop = gchild->property (X_("in"))) != 0) &&
((oprop = gchild->property (X_("out"))) != 0)) {
@@ -3012,7 +3312,7 @@ AUPluginInfo::stringify_descriptor (const CAComponentDescription& desc)
}
bool
-AUPluginInfo::needs_midi_input ()
+AUPluginInfo::needs_midi_input () const
{
return is_effect_with_midi_input () || is_instrument ();
}
@@ -3067,6 +3367,19 @@ AUPlugin::create_parameter_listener (AUEventListenerProc cb, void* arg, float in
_parameter_listener_arg = arg;
+ // listen for latency changes
+ AudioUnitEvent event;
+ event.mEventType = kAudioUnitEvent_PropertyChange;
+ event.mArgument.mProperty.mAudioUnit = unit->AU();
+ event.mArgument.mProperty.mPropertyID = kAudioUnitProperty_Latency;
+ event.mArgument.mProperty.mScope = kAudioUnitScope_Global;
+ event.mArgument.mProperty.mElement = 0;
+
+ if (AUEventListenerAddEventType (_parameter_listener, _parameter_listener_arg, &event) != noErr) {
+ PBD::error << "Failed to create latency event listener\n";
+ // TODO don't cache _current_latency
+ }
+
return 0;
}
@@ -3163,6 +3476,15 @@ AUPlugin::_parameter_change_listener (void* arg, void* src, const AudioUnitEvent
void
AUPlugin::parameter_change_listener (void* /*arg*/, void* src, const AudioUnitEvent* event, UInt64 /*host_time*/, Float32 new_value)
{
+ if (event->mEventType == kAudioUnitEvent_PropertyChange) {
+ if (event->mArgument.mProperty.mPropertyID == kAudioUnitProperty_Latency) {
+ DEBUG_TRACE (DEBUG::AudioUnits, string_compose("AU Latency Change Event %1 <> %2\n", new_value, unit->Latency()));
+ guint lat = unit->Latency() * _session.frame_rate();
+ g_atomic_int_set (&_current_latency, lat);
+ }
+ return;
+ }
+
ParameterMap::iterator i;
if ((i = parameter_map.find (event->mArgument.mParameter.mParameterID)) == parameter_map.end()) {
diff --git a/libs/ardour/audioanalyser.cc b/libs/ardour/audioanalyser.cc
index 7013d34..f90edd3 100644
--- a/libs/ardour/audioanalyser.cc
+++ b/libs/ardour/audioanalyser.cc
@@ -33,7 +33,7 @@
#include <cstring>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Vamp;
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 07a70ae..30c2113 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -55,7 +55,7 @@
#include "ardour/process_thread.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -114,6 +114,7 @@ AudioEngine::~AudioEngine ()
for (BackendMap::const_iterator i = _backends.begin(); i != _backends.end(); ++i) {
i->second->deinstantiate();
}
+ delete _main_thread;
}
AudioEngine*
@@ -411,7 +412,7 @@ AudioEngine::process_callback (pframes_t nframes)
#else
if (_session->silent()) {
- PortManager::silence (nframes);
+ PortManager::silence (nframes, _session);
}
#endif
@@ -1234,6 +1235,7 @@ AudioEngine::thread_init_callback (void* arg)
AsyncMIDIPort::set_process_thread (pthread_self());
if (arg) {
+ delete AudioEngine::instance()->_main_thread;
/* the special thread created/managed by the backend */
AudioEngine::instance()->_main_thread = new ProcessThread;
}
diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc
index bb3c18f..bb0b4da 100644
--- a/libs/ardour/audiofilesource.cc
+++ b/libs/ardour/audiofilesource.cc
@@ -61,7 +61,7 @@
#include <AudioToolbox/AudioFormat.h>
#endif // HAVE_COREAUDIO
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index ddd152b..873d411 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -55,7 +55,7 @@
#include "ardour/coreaudiosource.h"
#endif // HAVE_COREAUDIO
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -213,7 +213,7 @@ AudioRegion::register_properties ()
, _fade_in (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_fade_in.val()))) \
, _inverse_fade_in (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_in.val()))) \
, _fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_fade_out.val()))) \
- , _inverse_fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_out.val())))
+ , _inverse_fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_out.val()))) \
/* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */
void
@@ -279,8 +279,8 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
assert (_sources.size() == _master_sources.size());
}
-AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t offset)
- : Region (other, offset)
+AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t offset, const int32_t sub_num)
+ : Region (other, offset, sub_num)
, AUDIOREGION_COPY_STATE (other)
/* As far as I can see, the _envelope's times are relative to region position, and have nothing
to do with sources (and hence _start). So when we copy the envelope, we just use the supplied offset.
@@ -372,7 +372,7 @@ void
AudioRegion::connect_to_analysis_changed ()
{
for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
- (*i)->AnalysisChanged.connect_same_thread (*this, boost::bind (&AudioRegion::invalidate_transients, this));
+ (*i)->AnalysisChanged.connect_same_thread (*this, boost::bind (&AudioRegion::maybe_invalidate_transients, this));
}
}
@@ -771,7 +771,7 @@ AudioRegion::get_basic_state ()
{
XMLNode& node (Region::state ());
char buf[64];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
snprintf (buf, sizeof (buf), "%u", (uint32_t) _sources.size());
node.add_property ("channels", buf);
@@ -784,7 +784,7 @@ AudioRegion::state ()
{
XMLNode& node (get_basic_state());
XMLNode *child;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
child = node.add_child ("Envelope");
@@ -840,8 +840,8 @@ int
AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_changed, bool send)
{
const XMLNodeList& nlist = node.children();
- const XMLProperty *prop;
- LocaleGuard lg (X_("C"));
+ XMLProperty const * prop;
+ LocaleGuard lg;
boost::shared_ptr<Playlist> the_playlist (_playlist.lock());
suspend_property_changes ();
@@ -871,7 +871,7 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
XMLNode *child;
- XMLProperty *prop;
+ XMLProperty const * prop;
child = (*niter);
@@ -1402,9 +1402,6 @@ AudioRegion::set_scale_amplitude (gain_t g)
send_change (PropertyChange (Properties::scale_amplitude));
}
-/** @return the maximum (linear) amplitude of the region, or a -ve
- * number if the Progress object reports that the process was cancelled.
- */
double
AudioRegion::maximum_amplitude (Progress* p) const
{
@@ -1444,6 +1441,45 @@ AudioRegion::maximum_amplitude (Progress* p) const
return maxamp;
}
+double
+AudioRegion::rms (Progress* p) const
+{
+ framepos_t fpos = _start;
+ framepos_t const fend = _start + _length;
+ uint32_t const n_chan = n_channels ();
+ double rms = 0;
+
+ framecnt_t const blocksize = 64 * 1024;
+ Sample buf[blocksize];
+
+ framecnt_t total = 0;
+
+ if (n_chan == 0) {
+ return 0;
+ }
+
+ while (fpos < fend) {
+ framecnt_t const to_read = min (fend - fpos, blocksize);
+ total += to_read;
+ for (uint32_t c = 0; c < n_chan; ++c) {
+ if (read_raw_internal (buf, fpos, to_read, c) != to_read) {
+ return 0;
+ }
+ for (framepos_t i = 0; i < to_read; ++i) {
+ rms += buf[i] * buf[i];
+ }
+ fpos += to_read;
+ if (p) {
+ p->set_progress (float (fpos - _start) / _length);
+ if (p->cancelled ()) {
+ return -1;
+ }
+ }
+ }
+ }
+ return sqrt (rms / (double)(total * n_chan));
+}
+
/** Normalize using a given maximum amplitude and target, so that region
* _scale_amplitude becomes target / max_amplitude.
*/
@@ -1594,93 +1630,136 @@ AudioRegion::get_related_audio_file_channel_count () const
return chan_count;
}
-int
-AudioRegion::adjust_transients (frameoffset_t delta)
+void
+AudioRegion::clear_transients () // yet unused
{
- for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
- (*x) = (*x) + delta;
- }
-
+ _user_transients.clear ();
+ _valid_transients = false;
send_change (PropertyChange (Properties::valid_transients));
-
- return 0;
}
-int
-AudioRegion::update_transient (framepos_t old_position, framepos_t new_position)
+void
+AudioRegion::add_transient (framepos_t where)
{
- for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
- if ((*x) == old_position) {
- (*x) = new_position;
- send_change (PropertyChange (Properties::valid_transients));
+ if (where < first_frame () || where >= last_frame ()) {
+ return;
+ }
+ where -= _position;
- break;
+ if (!_valid_transients) {
+ _transient_user_start = _start;
+ _valid_transients = true;
+ }
+ frameoffset_t offset = _transient_user_start - _start;
+
+ if (where < offset) {
+ if (offset <= 0) {
+ return;
+ }
+ // region start changed (extend to front), shift points and offset
+ for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
+ (*x) += offset;
}
+ _transient_user_start -= offset;
+ offset = 0;
}
- return 0;
+ const framepos_t p = where - offset;
+ _user_transients.push_back(p);
+ send_change (PropertyChange (Properties::valid_transients));
}
void
-AudioRegion::add_transient (framepos_t where)
+AudioRegion::update_transient (framepos_t old_position, framepos_t new_position)
{
- _transients.push_back(where);
- _valid_transients = true;
+ bool changed = false;
+ if (!_onsets.empty ()) {
+ const framepos_t p = old_position - _position;
+ AnalysisFeatureList::iterator x = std::find (_onsets.begin (), _onsets.end (), p);
+ if (x != _transients.end ()) {
+ (*x) = new_position - _position;
+ changed = true;
+ }
+ }
- send_change (PropertyChange (Properties::valid_transients));
+ if (_valid_transients) {
+ const frameoffset_t offset = _position + _transient_user_start - _start;
+ const framepos_t p = old_position - offset;
+ AnalysisFeatureList::iterator x = std::find (_user_transients.begin (), _user_transients.end (), p);
+ if (x != _transients.end ()) {
+ (*x) = new_position - offset;
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ send_change (PropertyChange (Properties::valid_transients));
+ }
}
void
AudioRegion::remove_transient (framepos_t where)
{
- _transients.remove(where);
- _valid_transients = true;
+ bool changed = false;
+ if (!_onsets.empty ()) {
+ const framepos_t p = where - _position;
+ AnalysisFeatureList::iterator i = std::find (_onsets.begin (), _onsets.end (), p);
+ if (i != _transients.end ()) {
+ _onsets.erase (i);
+ changed = true;
+ }
+ }
- send_change (PropertyChange (Properties::valid_transients));
+ if (_valid_transients) {
+ const framepos_t p = where - (_position + _transient_user_start - _start);
+ AnalysisFeatureList::iterator i = std::find (_user_transients.begin (), _user_transients.end (), p);
+ if (i != _transients.end ()) {
+ _transients.erase (i);
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ send_change (PropertyChange (Properties::valid_transients));
+ }
}
-int
-AudioRegion::set_transients (AnalysisFeatureList& results)
+void
+AudioRegion::set_onsets (AnalysisFeatureList& results)
{
- _transients.clear();
- _transients = results;
- _valid_transients = true;
-
+ _onsets.clear();
+ _onsets = results;
send_change (PropertyChange (Properties::valid_transients));
-
- return 0;
}
-int
-AudioRegion::get_transients (AnalysisFeatureList& results, bool force_new)
+void
+AudioRegion::build_transients ()
{
+ _transients.clear ();
+ _transient_analysis_start = _transient_analysis_end = 0;
+
boost::shared_ptr<Playlist> pl = playlist();
if (!pl) {
- return -1;
- }
-
- if (_valid_transients && !force_new) {
- results = _transients;
- return 0;
+ return;
}
+ /* check analyzed sources first */
SourceList::iterator s;
-
for (s = _sources.begin() ; s != _sources.end(); ++s) {
if (!(*s)->has_been_analysed()) {
+#ifndef NDEBUG
cerr << "For " << name() << " source " << (*s)->name() << " has not been analyzed\n";
+#endif
break;
}
}
if (s == _sources.end()) {
/* all sources are analyzed, merge data from each one */
-
for (s = _sources.begin() ; s != _sources.end(); ++s) {
/* find the set of transients within the bounds of this region */
-
AnalysisFeatureList::iterator low = lower_bound ((*s)->transients.begin(),
(*s)->transients.end(),
_start);
@@ -1690,23 +1769,19 @@ AudioRegion::get_transients (AnalysisFeatureList& results, bool force_new)
_start + _length);
/* and add them */
-
- results.insert (results.end(), low, high);
+ _transients.insert (_transients.end(), low, high);
}
- TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
+ TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
/* translate all transients to current position */
-
- for (AnalysisFeatureList::iterator x = results.begin(); x != results.end(); ++x) {
+ for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
(*x) -= _start;
- (*x) += _position;
}
- _transients = results;
- _valid_transients = true;
-
- return 0;
+ _transient_analysis_start = _start;
+ _transient_analysis_end = _start + _length;
+ return;
}
/* no existing/complete transient info */
@@ -1721,7 +1796,7 @@ You currently have \"auto-analyse-audio\" disabled, which means \
that transient data must be generated every time it is required.\n\n\
If you are doing work that will require transient data on a \
regular basis, you should probably enable \"auto-analyse-audio\" \
-then quit %1 and restart.\n\n\
+in Preferences > Audio > Regions, then quit %1 and restart.\n\n\
This dialog will not display again. But you may notice a slight delay \
in this and future transient-detection operations.\n\
"), PROGRAM_NAME));
@@ -1729,64 +1804,74 @@ in this and future transient-detection operations.\n\
}
}
- bool existing_results = !results.empty();
-
try {
-
TransientDetector t (pl->session().frame_rate());
-
- _transients.clear ();
- _valid_transients = false;
-
for (uint32_t i = 0; i < n_channels(); ++i) {
AnalysisFeatureList these_results;
t.reset ();
+ /* this produces analysis result relative to current position
+ * ::read() sample 0 is at _position */
if (t.run ("", this, i, these_results)) {
- return -1;
- }
-
- /* translate all transients to give absolute position */
-
- for (AnalysisFeatureList::iterator i = these_results.begin(); i != these_results.end(); ++i) {
- (*i) += _position;
+ return;
}
/* merge */
-
_transients.insert (_transients.end(), these_results.begin(), these_results.end());
}
} catch (...) {
error << string_compose(_("Transient Analysis failed for %1."), _("Audio Region")) << endmsg;
- return -1;
+ return;
}
- if (!results.empty()) {
- if (existing_results) {
-
- /* merge our transients into the existing ones, then clean up
- those.
- */
-
- results.insert (results.end(), _transients.begin(), _transients.end());
- TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
- }
-
- /* make sure ours are clean too */
+ TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
+ _transient_analysis_start = _start;
+ _transient_analysis_end = _start + _length;
+}
- TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
+/* Transient analysis uses ::read() which is relative to _start,
+ * at the time of analysis and spans _length samples.
+ *
+ * This is true for RhythmFerret::run_analysis and the
+ * TransientDetector here.
+ *
+ * We store _start and length in _transient_analysis_start,
+ * _transient_analysis_end in case the region is trimmed or split after analysis.
+ *
+ * Various methods (most notably Playlist::find_next_transient and
+ * RhythmFerret::do_split_action) span multiple regions and *merge/combine*
+ * Analysis results.
+ * We therefore need to translate the analysis timestamps to absolute session-time
+ * and include the _position of the region.
+ *
+ * Note: we should special case the AudioRegionView. The region-view itself
+ * is located at _position (currently ARV subtracts _position again)
+ */
+void
+AudioRegion::get_transients (AnalysisFeatureList& results)
+{
+ boost::shared_ptr<Playlist> pl = playlist();
+ if (!playlist ()) {
+ return;
+ }
- } else {
+ Region::merge_features (results, _user_transients, _position + _transient_user_start - _start);
- TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
- results = _transients;
+ if (!_onsets.empty ()) {
+ // onsets are invalidated when start or length changes
+ merge_features (results, _onsets, _position);
+ return;
}
- _valid_transients = true;
+ if ((_transient_analysis_start == _transient_analysis_end)
+ || _transient_analysis_start > _start
+ || _transient_analysis_end < _start + _length) {
+ build_transients ();
+ }
- return 0;
+ merge_features (results, _transients, _position + _transient_analysis_start - _start);
}
/** Find areas of `silence' within a region.
@@ -1817,11 +1902,13 @@ AudioRegion::find_silence (Sample threshold, framecnt_t min_length, framecnt_t f
while (pos < end && !itt.cancel) {
framecnt_t cur_samples = 0;
+ framecnt_t const to_read = min (end - pos, block_size);
/* fill `loudest' with the loudest absolute sample at each instant, across all channels */
memset (loudest.get(), 0, sizeof (Sample) * block_size);
+
for (uint32_t n = 0; n < n_channels(); ++n) {
- cur_samples = read_raw_internal (buf.get(), pos, block_size, n);
+ cur_samples = read_raw_internal (buf.get(), pos, to_read, n);
for (framecnt_t i = 0; i < cur_samples; ++i) {
loudest[i] = max (loudest[i], abs (buf[i]));
}
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index 9d90d05..123bc22 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -58,7 +58,7 @@
#include "ardour/runtime_functions.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "ardour/debug.h"
@@ -142,7 +142,7 @@ AudioSource::get_state ()
int
AudioSource::set_state (const XMLNode& node, int /*version*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("captured-for")) != 0) {
_captured_for = prop->value();
diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc
index fe84a2d..aa81c3a 100644
--- a/libs/ardour/auditioner.cc
+++ b/libs/ardour/auditioner.cc
@@ -43,10 +43,10 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
Auditioner::Auditioner (Session& s)
- : Track (s, "auditioner", Route::Auditioner)
+ : Track (s, "auditioner", PresentationInfo::Auditioner)
, current_frame (0)
, _auditioning (0)
, length (0)
@@ -85,13 +85,17 @@ Auditioner::init ()
Auditioner::~Auditioner ()
{
+ if (asynth) {
+ asynth->drop_references ();
+ }
+ asynth.reset ();
}
void
Auditioner::lookup_synth ()
{
string plugin_id = Config->get_midi_audition_synth_uri();
- asynth = boost::shared_ptr<Processor>();
+ asynth.reset ();
if (!plugin_id.empty()) {
boost::shared_ptr<Plugin> p;
p = find_plugin (_session, plugin_id, ARDOUR::LV2);
diff --git a/libs/ardour/auto_bundle.cc b/libs/ardour/auto_bundle.cc
deleted file mode 100644
index a8d471a..0000000
--- a/libs/ardour/auto_bundle.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- Copyright (C) 2012 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <cassert>
-#include "ardour/auto_bundle.h"
-
-ARDOUR::AutoBundle::AutoBundle (bool i)
- : Bundle (i)
-{
-
-}
-
-ARDOUR::AutoBundle::AutoBundle (std::string const & n, bool i)
- : Bundle (n, i)
-{
-
-}
-
-ARDOUR::ChanCount
-ARDOUR::AutoBundle::nchannels () const
-{
- Glib::Threads::Mutex::Lock lm (_ports_mutex);
- return ChanCount (type(), _ports.size ());
-}
-
-const ARDOUR::PortList&
-ARDOUR::AutoBundle::channel_ports (uint32_t c) const
-{
- assert (c < nchannels().get (type()));
-
- Glib::Threads::Mutex::Lock lm (_ports_mutex);
- return _ports[c];
-}
-
-void
-ARDOUR::AutoBundle::set_channels (uint32_t n)
-{
- Glib::Threads::Mutex::Lock lm (_ports_mutex);
- _ports.resize (n);
-}
-
-void
-ARDOUR::AutoBundle::set_port (uint32_t c, std::string const & p)
-{
- assert (c < nchannels ().get (type()));
-
- Glib::Threads::Mutex::Lock lm (_ports_mutex);
- _ports[c].resize (1);
- _ports[c][0] = p;
-}
diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc
index 3c5d610..10d2565 100644
--- a/libs/ardour/automatable.cc
+++ b/libs/ardour/automatable.cc
@@ -29,16 +29,18 @@
#include "ardour/automatable.h"
#include "ardour/event_type_map.h"
#include "ardour/gain_control.h"
+#include "ardour/monitor_control.h"
#include "ardour/midi_track.h"
#include "ardour/pan_controllable.h"
#include "ardour/pannable.h"
#include "ardour/plugin.h"
#include "ardour/plugin_insert.h"
+#include "ardour/record_enable_control.h"
#include "ardour/session.h"
#include "ardour/uri_map.h"
#include "ardour/value_as_string.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -77,7 +79,7 @@ Automatable::~Automatable ()
int
Automatable::old_set_automation_state (const XMLNode& node)
{
- const XMLProperty *prop;
+ XMLProperty const * prop;
if ((prop = node.property ("path")) != 0) {
load_automation (prop->value());
@@ -148,7 +150,9 @@ Automatable::add_control(boost::shared_ptr<Evoral::Control> ac)
boost::shared_ptr<AutomationList> al = boost::dynamic_pointer_cast<AutomationList> (ac->list ());
- if (al) {
+ boost::shared_ptr<AutomationControl> actl (boost::dynamic_pointer_cast<AutomationControl> (ac));
+
+ if ((!actl || !(actl->flags() & Controllable::NotAutomatable)) && al) {
al->automation_state_changed.connect_same_thread (
_list_connections,
boost::bind (&Automatable::automation_list_automation_state_changed,
@@ -157,7 +161,7 @@ Automatable::add_control(boost::shared_ptr<Evoral::Control> ac)
ControlSet::add_control (ac);
- if (al) {
+ if ((!actl || !(actl->flags() & Controllable::NotAutomatable)) && al) {
_can_automate_list.insert (param);
automation_list_automation_state_changed (param, al->automation_state ()); // sync everything up
}
@@ -220,7 +224,7 @@ Automatable::set_automation_xml_state (const XMLNode& node, Evoral::Parameter le
if ((*niter)->name() == "AutomationList") {
- const XMLProperty* id_prop = (*niter)->property("automation-id");
+ XMLProperty const * id_prop = (*niter)->property("automation-id");
Evoral::Parameter param = (id_prop
? EventTypeMap::instance().from_symbol(id_prop->value())
@@ -229,7 +233,12 @@ Automatable::set_automation_xml_state (const XMLNode& node, Evoral::Parameter le
if (param.type() == NullAutomation) {
warning << "Automation has null type" << endl;
continue;
- }
+ }
+
+ if (_can_automate_list.find (param) == _can_automate_list.end ()) {
+ warning << "Ignored automation data for non-automatable parameter" << endl;
+ continue;
+ }
if (!id_prop) {
warning << "AutomationList node without automation-id property, "
@@ -420,6 +429,7 @@ Automatable::control_factory(const Evoral::Parameter& param)
bool make_list = true;
ParameterDescriptor desc(param);
boost::shared_ptr<AutomationList> list;
+
if (param.type() >= MidiCCAutomation && param.type() <= MidiChannelPressureAutomation) {
MidiTrack* mt = dynamic_cast<MidiTrack*>(this);
if (mt) {
@@ -460,6 +470,27 @@ Automatable::control_factory(const Evoral::Parameter& param)
} else {
warning << "PanAutomation for non-Pannable" << endl;
}
+ } else if (param.type() == RecEnableAutomation) {
+ Recordable* re = dynamic_cast<Recordable*> (this);
+ if (re) {
+ control = new RecordEnableControl (_a_session, X_("recenable"), *re);
+ }
+ } else if (param.type() == MonitoringAutomation) {
+ Monitorable* m = dynamic_cast<Monitorable*>(this);
+ if (m) {
+ control = new MonitorControl (_a_session, X_("monitor"), *m);
+ }
+ } else if (param.type() == SoloAutomation) {
+ Soloable* s = dynamic_cast<Soloable*>(this);
+ Muteable* m = dynamic_cast<Muteable*>(this);
+ if (s && m) {
+ control = new SoloControl (_a_session, X_("solo"), *s, *m);
+ }
+ } else if (param.type() == MuteAutomation) {
+ Muteable* m = dynamic_cast<Muteable*>(this);
+ if (m) {
+ control = new MuteControl (_a_session, X_("mute"), *m);
+ }
}
if (make_list && !list) {
@@ -493,7 +524,7 @@ Automatable::clear_controls ()
}
string
-Automatable::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Automatable::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
return ARDOUR::value_as_string(ac->desc(), ac->get_value());
}
diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc
index 583f388..e27da6a 100644
--- a/libs/ardour/automation_control.cc
+++ b/libs/ardour/automation_control.cc
@@ -18,16 +18,28 @@
*/
+#include <math.h>
#include <iostream>
+
+#include "pbd/memento_command.h"
+#include "pbd/stacktrace.h"
+
+#include "ardour/audioengine.h"
#include "ardour/automation_control.h"
#include "ardour/automation_watch.h"
+#include "ardour/control_group.h"
#include "ardour/event_type_map.h"
#include "ardour/session.h"
-#include "pbd/memento_command.h"
-#include "pbd/stacktrace.h"
+#include "pbd/i18n.h"
-#include "i18n.h"
+#ifdef COMPILER_MSVC
+#include <float.h>
+// C99 'isfinite()' is not available in MSVC.
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local isfinite
+#endif
using namespace std;
using namespace ARDOUR;
@@ -43,10 +55,14 @@ AutomationControl::AutomationControl(ARDOUR::Session& s
, _session(session)
, _desc(desc)
{
+ if (_desc.toggled) {
+ set_flags (Controllable::Toggle);
+ }
}
AutomationControl::~AutomationControl ()
{
+ DropReferences (); /* EMIT SIGNAL */
}
bool
@@ -63,36 +79,73 @@ AutomationControl::writable() const
double
AutomationControl::get_value() const
{
- bool from_list = _list && ((AutomationList*)_list.get())->automation_playback();
+ bool from_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback();
return Control::get_double (from_list, _session.transport_frame());
}
+void
+AutomationControl::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+ if (!writable()) {
+ return;
+ }
+
+ /* enforce strict double/boolean value mapping */
+
+ if (_desc.toggled) {
+ if (val != 0.0) {
+ val = 1.0;
+ }
+ }
+
+ if (check_rt (val, gcd)) {
+ /* change has been queued to take place in an RT context */
+ return;
+ }
+
+ if (_group && _group->use_me (gcd)) {
+ _group->set_group_value (shared_from_this(), val);
+ } else {
+ actually_set_value (val, gcd);
+ }
+}
+
/** Set the value and do the right thing based on automation state
* (e.g. record if necessary, etc.)
* @param value `user' value
*/
void
-AutomationControl::set_value (double value, PBD::Controllable::GroupControlDisposition /* group_override */)
+AutomationControl::actually_set_value (double value, PBD::Controllable::GroupControlDisposition gcd)
{
- bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
+ bool to_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_write();
+ //const double old_value = Control::user_double ();
Control::set_double (value, _session.transport_frame(), to_list);
- Changed(); /* EMIT SIGNAL */
+ //AutomationType at = (AutomationType) _parameter.type();
+ //std::cerr << "++++ Changed (" << enum_2_string (at) << ", " << enum_2_string (gcd) << ") = " << value
+ //<< " (was " << old_value << ") @ " << this << std::endl;
+
+ Changed (true, gcd);
}
void
AutomationControl::set_list (boost::shared_ptr<Evoral::ControlList> list)
{
Control::set_list (list);
- Changed(); /* EMIT SIGNAL */
+ Changed (true, Controllable::NoGroup);
}
void
AutomationControl::set_automation_state (AutoState as)
{
+ if (flags() & NotAutomatable) {
+ return;
+ }
if (_list && as != alist()->automation_state()) {
+ const double val = get_value ();
+
alist()->set_automation_state (as);
if (_desc.toggled) {
return; // No watch for boolean automation
@@ -101,6 +154,11 @@ AutomationControl::set_automation_state (AutoState as)
if (as == Write) {
AutomationWatch::instance().add_automation_watch (shared_from_this());
} else if (as == Touch) {
+ if (alist()->empty()) {
+ Control::set_double (val, _session.current_start_frame (), true);
+ Control::set_double (val, _session.current_end_frame (), true);
+ Changed (true, Controllable::NoGroup);
+ }
if (!touching()) {
AutomationWatch::instance().remove_automation_watch (shared_from_this());
} else {
@@ -199,6 +257,9 @@ AutomationControl::internal_to_interface (double val) const
double
AutomationControl::interface_to_internal (double val) const
{
+ if (!isfinite_local (val)) {
+ val = 0;
+ }
if (_desc.logarithmic) {
if (val <= 0) {
val = 0;
@@ -219,4 +280,26 @@ AutomationControl::interface_to_internal (double val) const
return val;
}
+void
+AutomationControl::set_group (boost::shared_ptr<ControlGroup> cg)
+{
+ /* this method can only be called by a ControlGroup. We do not need
+ to ensure consistency by calling ControlGroup::remove_control(),
+ since we are guaranteed that the ControlGroup will take care of that
+ for us.
+ */
+ _group = cg;
+}
+
+bool
+AutomationControl::check_rt (double val, Controllable::GroupControlDisposition gcd)
+{
+ if (!_session.loading() && (flags() & Controllable::RealTime) && !AudioEngine::instance()->in_process_thread()) {
+ /* queue change in RT context */
+ _session.set_control (shared_from_this(), val, gcd);
+ return true;
+ }
+
+ return false;
+}
diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc
index bc8ca8e..4b23378 100644
--- a/libs/ardour/automation_list.cc
+++ b/libs/ardour/automation_list.cc
@@ -27,10 +27,11 @@
#include "ardour/event_type_map.h"
#include "ardour/parameter_descriptor.h"
#include "evoral/Curve.hpp"
+#include "pbd/memento_command.h"
#include "pbd/stacktrace.h"
#include "pbd/enumwriter.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -130,6 +131,7 @@ AutomationList::AutomationList (const XMLNode& node, Evoral::Parameter id)
AutomationList::~AutomationList()
{
+ delete _before;
}
boost::shared_ptr<Evoral::ControlList>
@@ -191,8 +193,11 @@ AutomationList::set_automation_state (AutoState s)
{
if (s != _state) {
_state = s;
+ delete _before;
if (s == Write && _desc.toggled) {
_before = &get_state ();
+ } else {
+ _before = 0;
}
automation_state_changed (s); /* EMIT SIGNAL */
}
@@ -210,8 +215,11 @@ AutomationList::set_automation_style (AutoStyle s)
void
AutomationList::start_write_pass (double when)
{
+ delete _before;
if (in_new_write_pass ()) {
_before = &get_state ();
+ } else {
+ _before = 0;
}
ControlList::start_write_pass (when);
}
@@ -220,8 +228,6 @@ void
AutomationList::write_pass_finished (double when, double thinning_factor)
{
ControlList::write_pass_finished (when, thinning_factor);
- /* automation control has deleted this or it is now owned by the session undo stack */
- _before = 0;
}
void
@@ -259,7 +265,9 @@ AutomationList::stop_touch (bool mark, double)
/* _before may be owned by the undo stack,
* so we have to be careful about doing this.
-*/
+ *
+ * ::before () transfers ownership, setting _before to 0
+ */
void
AutomationList::clear_history ()
{
@@ -278,6 +286,12 @@ AutomationList::thaw ()
}
}
+Command*
+AutomationList::memento_command (XMLNode* before, XMLNode* after)
+{
+ return new MementoCommand<AutomationList> (*this, before, after);
+}
+
XMLNode&
AutomationList::get_state ()
{
@@ -289,7 +303,7 @@ AutomationList::state (bool full)
{
XMLNode* root = new XMLNode (X_("AutomationList"));
char buf[64];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
root->add_property ("automation-id", EventTypeMap::instance().to_symbol(_parameter));
@@ -407,11 +421,11 @@ AutomationList::deserialize_events (const XMLNode& node)
int
AutomationList::set_state (const XMLNode& node, int version)
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNodeList nlist = node.children();
XMLNode* nsos;
XMLNodeIterator niter;
- const XMLProperty* prop;
+ XMLProperty const * prop;
if (node.name() == X_("events")) {
/* partial state setting*/
@@ -429,7 +443,7 @@ AutomationList::set_state (const XMLNode& node, int version)
const XMLNodeList& elist = node.children();
XMLNodeConstIterator i;
- XMLProperty* prop;
+ XMLProperty const * prop;
pframes_t x;
double y;
diff --git a/libs/ardour/bundle.cc b/libs/ardour/bundle.cc
index 9934083..c27905e 100644
--- a/libs/ardour/bundle.cc
+++ b/libs/ardour/bundle.cc
@@ -23,7 +23,7 @@
#include "ardour/audioengine.h"
#include "ardour/port.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc
index 62f3a52..2281886 100644
--- a/libs/ardour/butler.cc
+++ b/libs/ardour/butler.cc
@@ -35,7 +35,7 @@
#include "ardour/track.h"
#include "ardour/auditioner.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
diff --git a/libs/ardour/caimportable.cc b/libs/ardour/caimportable.cc
index 751e74c..b9bd20d 100644
--- a/libs/ardour/caimportable.cc
+++ b/libs/ardour/caimportable.cc
@@ -21,7 +21,7 @@
#include <sndfile.h>
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
diff --git a/libs/ardour/capturing_processor.cc b/libs/ardour/capturing_processor.cc
index ce4a546..b942883 100644
--- a/libs/ardour/capturing_processor.cc
+++ b/libs/ardour/capturing_processor.cc
@@ -22,13 +22,14 @@
#include "ardour/session.h"
#include "ardour/audioengine.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
-CapturingProcessor::CapturingProcessor (Session & session)
+CapturingProcessor::CapturingProcessor (Session & session, framecnt_t latency)
: Processor (session, X_("capture point"))
, block_size (AudioEngine::instance()->samples_per_cycle())
+ , _latency (latency)
{
realloc_buffers ();
}
@@ -46,10 +47,16 @@ CapturingProcessor::set_block_size (pframes_t nframes)
}
void
-CapturingProcessor::run (BufferSet& bufs, framepos_t, framepos_t, pframes_t nframes, bool)
+CapturingProcessor::run (BufferSet& bufs, framepos_t, framepos_t, double, pframes_t nframes, bool)
{
- if (active()) {
- capture_buffers.read_from (bufs, nframes);
+ if (!active()) {
+ _delaybuffers.flush ();
+ return;
+ }
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t b = 0; b < bufs.count().get (*t); ++b) {
+ _delaybuffers.delay (*t, b, capture_buffers.get (*t, b), bufs.get (*t, b), nframes, 0, 0);
+ }
}
}
@@ -57,6 +64,7 @@ bool
CapturingProcessor::configure_io (ChanCount in, ChanCount out)
{
Processor::configure_io (in, out);
+ _delaybuffers.set (out, _latency);
realloc_buffers();
return true;
}
@@ -72,6 +80,7 @@ void
CapturingProcessor::realloc_buffers()
{
capture_buffers.ensure_buffers (_configured_input, block_size);
+ _delaybuffers.flush ();
}
XMLNode &
diff --git a/libs/ardour/chan_count.cc b/libs/ardour/chan_count.cc
index 3cef0f6..42f9994 100644
--- a/libs/ardour/chan_count.cc
+++ b/libs/ardour/chan_count.cc
@@ -21,7 +21,7 @@
#include <stdint.h>
#include "ardour/chan_count.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
static const char* state_node_name = "Channels";
diff --git a/libs/ardour/chan_mapping.cc b/libs/ardour/chan_mapping.cc
index 5773480..f6f0e09 100644
--- a/libs/ardour/chan_mapping.cc
+++ b/libs/ardour/chan_mapping.cc
@@ -23,6 +23,10 @@
#include <iostream>
#include "ardour/chan_mapping.h"
+#include "pbd/i18n.h"
+
+static const char* state_node_name = "Channelmap";
+
using namespace std;
namespace ARDOUR {
@@ -40,15 +44,38 @@ ChanMapping::ChanMapping(ChanCount identity)
}
}
+ChanMapping::ChanMapping (const ChanMapping& other)
+{
+ const ChanMapping::Mappings& mp (other.mappings());
+ for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ set (tm->first, i->first, i->second);
+ }
+ }
+}
+
+ChanMapping::ChanMapping (const XMLNode& node)
+{
+ XMLNodeConstIterator iter = node.children().begin();
+ for ( ; iter != node.children().end(); ++iter) {
+ if ((*iter)->name() == X_(state_node_name)) {
+ const string& type_str = (*iter)->property("type")->value();
+ const string& from_str = (*iter)->property("from")->value();
+ const string& to_str = (*iter)->property("to")->value();
+ set(DataType(type_str), atol (from_str.c_str()), atol (to_str.c_str()));
+ }
+ }
+}
+
uint32_t
-ChanMapping::get(DataType t, uint32_t from, bool* valid)
+ChanMapping::get(DataType t, uint32_t from, bool* valid) const
{
- Mappings::iterator tm = _mappings.find(t);
+ Mappings::const_iterator tm = _mappings.find(t);
if (tm == _mappings.end()) {
if (valid) { *valid = false; }
return -1;
}
- TypeMapping::iterator m = tm->second.find(from);
+ TypeMapping::const_iterator m = tm->second.find(from);
if (m == tm->second.end()) {
if (valid) { *valid = false; }
return -1;
@@ -57,26 +84,57 @@ ChanMapping::get(DataType t, uint32_t from, bool* valid)
return m->second;
}
+uint32_t
+ChanMapping::get_src(DataType t, uint32_t to, bool* valid) const
+{
+ Mappings::const_iterator tm = _mappings.find(t);
+ if (tm == _mappings.end()) {
+ if (valid) { *valid = false; }
+ return -1;
+ }
+ for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ if (i->second == to) {
+ if (valid) { *valid = true; }
+ return i->first;
+ }
+ }
+ if (valid) { *valid = false; }
+ return -1;
+}
+
+
+
void
ChanMapping::set(DataType t, uint32_t from, uint32_t to)
{
assert(t != DataType::NIL);
- Mappings::iterator tm = _mappings.find(t);
+ Mappings::iterator tm = _mappings.find (t);
if (tm == _mappings.end()) {
tm = _mappings.insert(std::make_pair(t, TypeMapping())).first;
}
tm->second.insert(std::make_pair(from, to));
}
+void
+ChanMapping::unset(DataType t, uint32_t from)
+{
+ assert(t != DataType::NIL);
+ Mappings::iterator tm = _mappings.find (t);
+ if (tm == _mappings.end()) {
+ return;
+ }
+ tm->second.erase(from);
+}
+
/** Offset the 'from' field of every mapping for type @a t by @a delta */
void
ChanMapping::offset_from(DataType t, int32_t delta)
{
Mappings::iterator tm = _mappings.find(t);
- if (tm != _mappings.end()) {
+ if (tm != _mappings.end ()) {
TypeMapping new_map;
for (TypeMapping::iterator m = tm->second.begin(); m != tm->second.end(); ++m) {
- new_map.insert(make_pair(m->first + delta, m->second));
+ new_map.insert (make_pair (m->first + delta, m->second));
}
tm->second = new_map;
}
@@ -94,12 +152,103 @@ ChanMapping::offset_to(DataType t, int32_t delta)
}
}
+XMLNode*
+ChanMapping::state(const std::string& name) const
+{
+ XMLNode* node = new XMLNode (name);
+ const Mappings& mp (mappings());
+ for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ XMLNode* n = new XMLNode(X_(state_node_name));
+ n->add_property("type", tm->first.to_string());
+ n->add_property("from", i->first);
+ n->add_property("to", i->second);
+ node->add_child_nocopy(*n);
+ }
+ }
+ return node;
+}
+
+bool
+ChanMapping::is_subset (const ChanMapping& superset) const
+{
+ const Mappings& mp (mappings());
+ for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ bool valid;
+ if (i->second != superset.get (tm->first, i->first, &valid)) {
+ return false;
+ }
+ if (!valid) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+bool
+ChanMapping::is_monotonic () const
+{
+ const Mappings& mp (mappings());
+ for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ uint32_t prev = UINT32_MAX;
+ for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ // set keys are strictly weak ordered
+ if (i->first < i->second || i->second == prev) {
+ return false;
+ }
+ prev = i->second;
+ }
+ }
+ return true;
+}
+
+bool
+ChanMapping::is_identity (ChanCount offset) const
+{
+ const Mappings& mp (mappings());
+ for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ if (i->first + offset.get (tm->first) != i->second) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+uint32_t
+ChanMapping::n_total () const
+{
+ // fast version of count().n_total();
+ uint32_t rv = 0;
+ const Mappings& mp (mappings());
+ for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ rv += tm->second.size ();
+ }
+ return rv;
+}
+
+ChanCount
+ChanMapping::count () const
+{
+ ChanCount rv;
+ const Mappings& mp (mappings());
+ for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ rv.set (tm->first, tm->second.size ());
+ }
+ return rv;
+}
+
+
+
} // namespace ARDOUR
std::ostream& operator<<(std::ostream& o, const ARDOUR::ChanMapping& cm)
{
- for (ARDOUR::ChanMapping::Mappings::const_iterator tm = cm.mappings().begin();
- tm != cm.mappings().end(); ++tm) {
+ const ARDOUR::ChanMapping::Mappings& mp (cm.mappings());
+ for (ARDOUR::ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
o << tm->first.to_string() << endl;
for (ARDOUR::ChanMapping::TypeMapping::const_iterator i = tm->second.begin();
i != tm->second.end(); ++i) {
@@ -109,4 +258,3 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::ChanMapping& cm)
return o;
}
-
diff --git a/libs/ardour/config_text.cc b/libs/ardour/config_text.cc
new file mode 100644
index 0000000..d81c143
--- /dev/null
+++ b/libs/ardour/config_text.cc
@@ -0,0 +1,56 @@
+#include "ardour/ardour.h"
+namespace ARDOUR {
+const char* const ardour_config_info = "\n\
+Build documentation: False\n\
+Debuggable build: True\n\
+Export all symbols (backtrace): True\n\
+Install prefix: /usr/local\n\
+Strict compiler flags: []\n\
+Internal Shared Libraries: True\n\
+Use External Libraries: False\n\
+Library exports hidden: True\n\
+ALSA DBus Reservation: True\n\
+Architecture flags: None\n\
+Aubio: True\n\
+AudioUnits: False\n\
+Free/Demo copy: False\n\
+Build target: x86_64\n\
+CoreAudio: False\n\
+CoreAudio 10.5 compat: False\n\
+Debug RT allocations: False\n\
+Debug Symbols: True\n\
+Process thread timing: False\n\
+Denormal exceptions: False\n\
+FLAC: True\n\
+FPU optimization: True\n\
+Freedesktop files: False\n\
+Libjack linking: link\n\
+Libjack metadata: True\n\
+Lua Binding Doc: False\n\
+LV2 UI embedding: True\n\
+LV2 support: True\n\
+LV2 extensions: True\n\
+LXVST support: True\n\
+OGG: True\n\
+Phone home: True\n\
+Program name: Ardour\n\
+Samplerate: True\n\
+PT format: False\n\
+PTW32 Semaphore: False\n\
+Translation: True\n\
+Unit tests: False\n\
+Mac i386 Architecture: False\n\
+Mac ppc Architecture: False\n\
+Windows VST support: False\n\
+Wiimote support: True\n\
+Windows key: Mod4><Super\n\
+PortAudio Backend: False\n\
+CoreAudio/Midi Backend: False\n\
+ALSA Backend: True\n\
+Dummy backend: False\n\
+JACK Backend: True\n\
+C compiler flags: ['-I/usr/local/music/src/ardour/4.0', '-DWAF_BUILD', '-g', '-std=c99', '-pedantic', '-Wshadow', '-Wall', '-Wcast-align', '-Wextra', '-Wwrite-strings', '-Wunsafe-loop-optimizations', '-Wlogical-op', '-fshow-column', '-DARCH_X86', '-mmmx', '-msse', '-mfpmath=sse', '-DUSE_XMMINTRIN', '-DBUILD_SSE_OPTIMIZATIONS', '-DLXVST_64BIT', '-Wall', '-Wpointer-arith', '-Wcast-qual', '-Wcast-align', '-Wno-unused-parameter', '-DBOOST_SYSTEM_NO_DEPRECATED', '-D_ISOC9X_SOURCE', '-D_LARGEFILE64_SOURCE', '-D_FILE_OFFSET_BITS=64', '-DENABLE_NLS', '-DPROGRAM_NAME=\"Ardour\"', u'-DPROGRAM_VERSION=\"5\"', '-Wstrict-prototypes', '-Wmissing-prototypes']\n\
+C++ compiler flags: ['-I/usr/local/music/src/ardour/4.0', '-DWAF_BUILD', '-g', '-ansi', '-Wnon-virtual-dtor', '-Woverloaded-virtual', '-fstrict-overflow', '-Wall', '-Wcast-align', '-Wextra', '-Wwrite-strings', '-Wunsafe-loop-optimizations', '-Wlogical-op', '-fshow-column', '-DARCH_X86', '-mmmx', '-msse', '-mfpmath=sse', '-DUSE_XMMINTRIN', '-DBUILD_SSE_OPTIMIZATIONS', '-DLXVST_64BIT', '-Wall', '-Wpointer-arith', '-Wcast-qual', '-Wcast-align', '-Wno-unused-parameter', '-DBOOST_SYSTEM_NO_DEPRECATED', '-D_ISOC9X_SOURCE', '-D_LARGEFILE64_SOURCE', '-D_FILE_OFFSET_BITS=64', '-DENABLE_NLS', '-DPROGRAM_NAME=\"Ardour\"', u'-DPROGRAM_VERSION=\"5\"', '-Woverloaded-virtual', '-Wno-unused-local-typedefs', '-D__STDC_LIMIT_MACROS', '-D__STDC_FORMAT_MACROS', '-DCANVAS_COMPATIBILITY', '-DCANVAS_DEBUG']\n\
+Linker flags: ['', '-rdynamic']\n\
+";
+}
diff --git a/libs/ardour/control_group.cc b/libs/ardour/control_group.cc
new file mode 100644
index 0000000..51a1515
--- /dev/null
+++ b/libs/ardour/control_group.cc
@@ -0,0 +1,318 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <vector>
+
+#include "pbd/unwind.h"
+
+#include "ardour/control_group.h"
+#include "ardour/gain_control.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+ControlGroup::ControlGroup (Evoral::Parameter p)
+ : _parameter (p)
+ , _active (true)
+ , _mode (Mode (0))
+ , propagating (false)
+{
+}
+
+
+ControlGroup::~ControlGroup ()
+{
+ clear ();
+}
+
+void
+ControlGroup::set_active (bool yn)
+{
+ _active = yn;
+}
+
+void
+ControlGroup::set_mode (Mode m)
+{
+ _mode = m;
+}
+
+void
+ControlGroup::clear ()
+{
+ /* we're giving up on all members, so we don't care about their
+ * DropReferences signals anymore
+ */
+
+ member_connections.drop_connections ();
+
+ /* make a copy so that when the control calls ::remove_control(), we
+ * don't deadlock.
+ */
+
+ std::vector<boost::shared_ptr<AutomationControl> > controls;
+ {
+ Glib::Threads::RWLock::WriterLock lm (controls_lock);
+ for (ControlMap::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
+ controls.push_back (i->second);
+ }
+ }
+
+ _controls.clear ();
+
+ for (std::vector<boost::shared_ptr<AutomationControl> >::iterator c = controls.begin(); c != controls.end(); ++c) {
+ (*c)->set_group (boost::shared_ptr<ControlGroup>());
+ }
+}
+
+ControlList
+ControlGroup::controls () const
+{
+ ControlList c;
+
+ if (_active) {
+ Glib::Threads::RWLock::WriterLock lm (controls_lock);
+ for (ControlMap::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
+ c.push_back (i->second);
+ }
+ }
+
+ return c;
+}
+
+void
+ControlGroup::control_going_away (boost::weak_ptr<AutomationControl> wac)
+{
+ boost::shared_ptr<AutomationControl> ac (wac.lock());
+ if (!ac) {
+ return;
+ }
+
+ remove_control (ac);
+}
+
+int
+ControlGroup::remove_control (boost::shared_ptr<AutomationControl> ac)
+{
+ int erased;
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (controls_lock);
+ erased = _controls.erase (ac->id());
+ }
+
+ if (erased) {
+ ac->set_group (boost::shared_ptr<ControlGroup>());
+ }
+
+ /* return zero if erased, non-zero otherwise */
+ return !erased;
+}
+
+int
+ControlGroup::add_control (boost::shared_ptr<AutomationControl> ac)
+{
+ if (ac->parameter() != _parameter) {
+ return -1;
+ }
+
+ std::pair<ControlMap::iterator,bool> res;
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (controls_lock);
+ res = _controls.insert (std::make_pair (ac->id(), ac));
+ }
+
+ if (!res.second) {
+ /* already in ControlMap */
+ return -1;
+ }
+
+ /* Inserted */
+
+ ac->set_group (shared_from_this());
+
+ ac->DropReferences.connect_same_thread (member_connections, boost::bind (&ControlGroup::control_going_away, this, boost::weak_ptr<AutomationControl>(ac)));
+
+ return 0;
+}
+
+void
+ControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control, double val)
+{
+ double old = control->get_value ();
+
+ /* set the primary control */
+
+ control->set_value (val, Controllable::ForGroup);
+
+ if (!_active) {
+ return;
+ }
+
+ /* now propagate across the group */
+
+ Glib::Threads::RWLock::ReaderLock lm (controls_lock);
+
+ if (_mode & Relative) {
+
+ const double factor = old / control->get_value ();
+
+ for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+ if (c->second != control) {
+ c->second->set_value (factor * c->second->get_value(), Controllable::ForGroup);
+ }
+ }
+
+ } else {
+
+ for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+ if (c->second != control) {
+ c->second->set_value (val, Controllable::ForGroup);
+ }
+ }
+ }
+}
+
+/*---- GAIN CONTROL GROUP -----------*/
+
+GainControlGroup::GainControlGroup ()
+ : ControlGroup (GainAutomation)
+{
+}
+
+gain_t
+GainControlGroup::get_min_factor (gain_t factor)
+{
+ /* CALLER MUST HOLD READER LOCK */
+
+ for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+ gain_t const g = c->second->get_value();
+
+ if ((g + g * factor) >= 0.0f) {
+ continue;
+ }
+
+ if (g <= 0.0000003f) {
+ return 0.0f;
+ }
+
+ factor = 0.0000003f / g - 1.0f;
+ }
+
+ return factor;
+}
+
+gain_t
+GainControlGroup::get_max_factor (gain_t factor)
+{
+ /* CALLER MUST HOLD READER LOCK */
+
+ for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+ gain_t const g = c->second->get_value();
+
+ // if the current factor woulnd't raise this route above maximum
+ if ((g + g * factor) <= 1.99526231f) {
+ continue;
+ }
+
+ // if route gain is already at peak, return 0.0f factor
+ if (g >= 1.99526231f) {
+ return 0.0f;
+ }
+
+ // factor is calculated so that it would raise current route to max
+ factor = 1.99526231f / g - 1.0f;
+ }
+
+ return factor;
+}
+
+void
+GainControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control, double val)
+{
+ if (!_active) {
+ /* set the primary control */
+ control->set_value (val, Controllable::ForGroup);
+ return;
+ }
+
+ Glib::Threads::RWLock::ReaderLock lm (controls_lock);
+
+ if (_mode & Relative) {
+
+ gain_t usable_gain = control->get_value();
+
+ if (usable_gain < 0.000001f) {
+ usable_gain = 0.000001f;
+ }
+
+ gain_t delta = val;
+ if (delta < 0.000001f) {
+ delta = 0.000001f;
+ }
+
+ delta -= usable_gain;
+
+ if (delta == 0.0f) {
+ return;
+ }
+
+ gain_t factor = delta / usable_gain;
+
+ if (factor > 0.0f) {
+ factor = get_max_factor (factor);
+ if (factor == 0.0f) {
+ control->Changed (true, Controllable::ForGroup); /* EMIT SIGNAL */
+ return;
+ }
+ } else {
+ factor = get_min_factor (factor);
+ if (factor == 0.0f) {
+ control->Changed (true, Controllable::ForGroup); /* EMIT SIGNAL */
+ return;
+ }
+ }
+
+ /* set the primary control */
+
+ control->set_value (val, Controllable::ForGroup);
+
+ /* now propagate across the group */
+
+ for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+ if (c->second == control) {
+ continue;
+ }
+
+ boost::shared_ptr<GainControl> gc = boost::dynamic_pointer_cast<GainControl> (c->second);
+
+ if (gc) {
+ gc->inc_gain (factor);
+ }
+ }
+
+ } else {
+
+ /* just set entire group */
+
+ for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+ c->second->set_value (val, Controllable::ForGroup);
+ }
+ }
+}
diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc
index 7423d3b..a0a36c1 100644
--- a/libs/ardour/control_protocol_manager.cc
+++ b/libs/ardour/control_protocol_manager.cc
@@ -38,11 +38,27 @@ using namespace ARDOUR;
using namespace std;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
ControlProtocolManager* ControlProtocolManager::_instance = 0;
const string ControlProtocolManager::state_node_name = X_("ControlProtocols");
+
+ControlProtocolInfo::~ControlProtocolInfo ()
+{
+ if (protocol && descriptor) {
+ descriptor->destroy (descriptor, protocol);
+ protocol = 0;
+ }
+
+ delete state; state = 0;
+
+ if (descriptor) {
+ delete (Glib::Module*) descriptor->module;
+ descriptor = 0;
+ }
+}
+
ControlProtocolManager::ControlProtocolManager ()
{
}
@@ -168,7 +184,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
cpi.descriptor = get_descriptor (cpi.path);
- DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("instantiating %1\n", cpi.name));
+ DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("instantiating %1\n", cpi.name));
if (cpi.descriptor == 0) {
error << string_compose (_("control protocol name \"%1\" has no descriptor"), cpi.name) << endmsg;
@@ -410,28 +426,31 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
{
XMLNodeList clist;
XMLNodeConstIterator citer;
- XMLProperty* prop;
+ XMLProperty const * prop;
Glib::Threads::Mutex::Lock lm (protocols_lock);
clist = node.children();
for (citer = clist.begin(); citer != clist.end(); ++citer) {
- if ((*citer)->name() == X_("Protocol")) {
+ XMLNode const * child = *citer;
+
+ if (child->name() == X_("Protocol")) {
- if ((prop = (*citer)->property (X_("active"))) == 0) {
+ if ((prop = child->property (X_("active"))) == 0) {
continue;
}
bool active = string_is_affirmative (prop->value());
- if ((prop = (*citer)->property (X_("name"))) == 0) {
+ if ((prop = child->property (X_("name"))) == 0) {
continue;
}
ControlProtocolInfo* cpi = cpi_by_name (prop->value());
if (cpi) {
+ delete cpi->state;
cpi->state = new XMLNode (**citer);
if (active) {
diff --git a/libs/ardour/controllable_descriptor.cc b/libs/ardour/controllable_descriptor.cc
new file mode 100644
index 0000000..fff8b00
--- /dev/null
+++ b/libs/ardour/controllable_descriptor.cc
@@ -0,0 +1,221 @@
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifdef COMPILER_MSVC
+#include <io.h> // Microsoft's nearest equivalent to <unistd.h>
+#include <ardourext/misc.h>
+#else
+#include <regex.h>
+#endif
+
+#include "pbd/strsplit.h"
+#include "pbd/convert.h"
+
+#include "ardour/controllable_descriptor.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+
+int
+ControllableDescriptor::set (const std::string& str)
+{
+ string::size_type first_space = str.find_first_of (" ");
+
+ if (first_space == string::npos) {
+ return -1;
+ }
+
+ string front = str.substr (0, first_space);
+ string back = str.substr (first_space);
+
+ vector<string> path;
+ split (front, path, '/');
+
+ if (path.size() < 2) {
+ return -1;
+ }
+
+ vector<string> rest;
+ split (back, rest, ' ');
+
+ if (rest.size() < 1) {
+ return -1;
+ }
+
+ bool stripable = false;
+ regex_t compiled_pattern;
+ const char * const pattern = "^[BS]?[0-9]+";
+
+ if (path[0] == "route" || path[0] == "rid") {
+
+ /* this is not going to fail */
+ regcomp (&compiled_pattern, pattern, REG_EXTENDED|REG_NOSUB);
+ bool matched = (regexec (&compiled_pattern, rest[0].c_str(), 0, 0, 0) == 0);
+ regfree (&compiled_pattern);
+
+ if (matched) {
+ _top_level_type = PresentationOrderRoute;
+ stripable = true;
+ } else {
+ _top_level_type = NamedRoute;
+ _top_level_name = rest[0];
+ }
+
+ } else if (path[0] == "vca") {
+ _top_level_type = PresentationOrderVCA;
+ stripable = true;
+ } else if (path[0] == "bus") {
+ /* digits, or B<digits> or S<digits> will be used as for route;
+ anything else will be treated as a track name.
+ */
+
+ /* this is not going to fail */
+
+ regcomp (&compiled_pattern, pattern, REG_EXTENDED|REG_NOSUB);
+ bool matched = (regexec (&compiled_pattern, rest[0].c_str(), 0, 0, 0) == 0);
+ regfree (&compiled_pattern);
+
+ if (matched) {
+ _top_level_type = PresentationOrderBus;
+ stripable = true;
+ } else {
+ _top_level_type = NamedRoute;
+ _top_level_name = rest[0];
+ }
+
+ } else if (path[0] == "track") {
+
+ /* digits, or B<digits> or S<digits> will be used as for route;
+ anything else will be treated as a track name.
+ */
+
+ /* this is not going to fail */
+ regcomp (&compiled_pattern, pattern, REG_EXTENDED|REG_NOSUB);
+ bool matched = (regexec (&compiled_pattern, rest[0].c_str(), 0, 0, 0) == 0);
+ regfree (&compiled_pattern);
+
+ if (matched) {
+ _top_level_type = PresentationOrderTrack;
+ stripable = true;
+ } else {
+ _top_level_type = NamedRoute;
+ _top_level_name = rest[0];
+ }
+ }
+
+ if (stripable) {
+ if (rest[0][0] == 'B') {
+ _banked = true;
+ _presentation_order = atoi (rest[0].substr (1));
+ } else if (rest[0][0] == 'S') {
+ _top_level_type = SelectionCount;
+ _banked = true;
+ _selection_id = atoi (rest[0].substr (1));
+ } else if (isdigit (rest[0][0])) {
+ _banked = false;
+ _presentation_order = atoi (rest[0]);
+ } else {
+ return -1;
+ }
+
+ _presentation_order -= 1; /* order is zero-based, but maps use 1-based */
+ }
+
+ if (path[1] == "gain") {
+ _subtype = Gain;
+
+ } else if (path[1] == "trim") {
+ _subtype = Trim;
+
+ } else if (path[1] == "solo") {
+ _subtype = Solo;
+
+ } else if (path[1] == "mute") {
+ _subtype = Mute;
+
+ } else if (path[1] == "recenable") {
+ _subtype = Recenable;
+
+ } else if (path[1] == "balance") {
+ _subtype = Balance;
+
+ } else if (path[1] == "panwidth") {
+ _subtype = PanWidth;
+
+ } else if (path[1] == "pandirection") {
+ _subtype = PanDirection;
+
+ } else if (path[1] == "plugin") {
+ if (path.size() == 3 && rest.size() == 3) {
+ if (path[2] == "parameter") {
+ _subtype = PluginParameter;
+ _target.push_back (atoi (rest[1]));
+ _target.push_back (atoi (rest[2]));
+ } else {
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+ } else if (path[1] == "send") {
+
+ if (path.size() == 3 && rest.size() == 2) {
+ if (path[2] == "gain") {
+ _subtype = SendGain;
+ _target.push_back (atoi (rest[1]));
+ } else {
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+uint32_t
+ControllableDescriptor::presentation_order () const
+{
+ if (banked()) {
+ return _presentation_order + _bank_offset;
+ }
+
+ return _presentation_order;
+}
+
+uint32_t
+ControllableDescriptor::selection_id () const
+{
+ if (banked()) {
+ return _selection_id + _bank_offset;
+ }
+
+ return _selection_id;
+}
+
+uint32_t
+ControllableDescriptor::target (uint32_t n) const
+{
+ if (n < _target.size()) {
+ return _target[n];
+ }
+
+ return 0;
+}
diff --git a/libs/ardour/coreaudiosource.cc b/libs/ardour/coreaudiosource.cc
index 3bb00f7..90ab07b 100644
--- a/libs/ardour/coreaudiosource.cc
+++ b/libs/ardour/coreaudiosource.cc
@@ -34,7 +34,7 @@
#include <glibmm/fileutils.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <AudioToolbox/AudioFormat.h>
diff --git a/libs/ardour/cycle_timer.cc b/libs/ardour/cycle_timer.cc
index a86124c..4742d96 100644
--- a/libs/ardour/cycle_timer.cc
+++ b/libs/ardour/cycle_timer.cc
@@ -24,7 +24,7 @@
#include "ardour/libardour_visibility.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/ardour/data_type.cc b/libs/ardour/data_type.cc
index 4a43009..c72c173 100644
--- a/libs/ardour/data_type.cc
+++ b/libs/ardour/data_type.cc
@@ -18,7 +18,7 @@
*/
#include "ardour/data_type.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
const char *
ARDOUR::DataType::to_i18n_string () const
diff --git a/libs/ardour/debug.cc b/libs/ardour/debug.cc
index 86afaf6..4dd7714 100644
--- a/libs/ardour/debug.cc
+++ b/libs/ardour/debug.cc
@@ -33,6 +33,7 @@ PBD::DebugBits PBD::DEBUG::Latency = PBD::new_debug_bit ("latency");
PBD::DebugBits PBD::DEBUG::LatencyCompensation = PBD::new_debug_bit ("latencycompensation");
PBD::DebugBits PBD::DEBUG::Peaks = PBD::new_debug_bit ("peaks");
PBD::DebugBits PBD::DEBUG::Processors = PBD::new_debug_bit ("processors");
+PBD::DebugBits PBD::DEBUG::ChanMapping = PBD::new_debug_bit ("chanmapping");
PBD::DebugBits PBD::DEBUG::ProcessThreads = PBD::new_debug_bit ("processthreads");
PBD::DebugBits PBD::DEBUG::Graph = PBD::new_debug_bit ("graph");
PBD::DebugBits PBD::DEBUG::Destruction = PBD::new_debug_bit ("destruction");
@@ -49,6 +50,7 @@ PBD::DebugBits PBD::DEBUG::Solo = PBD::new_debug_bit ("solo");
PBD::DebugBits PBD::DEBUG::AudioPlayback = PBD::new_debug_bit ("audioplayback");
PBD::DebugBits PBD::DEBUG::Panning = PBD::new_debug_bit ("panning");
PBD::DebugBits PBD::DEBUG::LV2 = PBD::new_debug_bit ("lv2");
+PBD::DebugBits PBD::DEBUG::LV2Automate = PBD::new_debug_bit ("lv2automate");
PBD::DebugBits PBD::DEBUG::CaptureAlignment = PBD::new_debug_bit ("capturealignment");
PBD::DebugBits PBD::DEBUG::PluginManager = PBD::new_debug_bit ("pluginmanager");
PBD::DebugBits PBD::DEBUG::AudioUnits = PBD::new_debug_bit ("audiounits");
@@ -74,3 +76,4 @@ PBD::DebugBits PBD::DEBUG::BackendThreads = PBD::new_debug_bit ("backendthreads"
PBD::DebugBits PBD::DEBUG::BackendPorts = PBD::new_debug_bit ("backendports");
PBD::DebugBits PBD::DEBUG::VSTCallbacks = PBD::new_debug_bit ("vstcallbacks");
PBD::DebugBits PBD::DEBUG::FaderPort = PBD::new_debug_bit ("faderport");
+PBD::DebugBits PBD::DEBUG::VCA = PBD::new_debug_bit ("vca");
diff --git a/libs/ardour/delayline.cc b/libs/ardour/delayline.cc
index 0bd7793..eda85f0 100644
--- a/libs/ardour/delayline.cc
+++ b/libs/ardour/delayline.cc
@@ -50,7 +50,7 @@ DelayLine::~DelayLine ()
#define FADE_LEN (16)
void
-DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end_frame */, pframes_t nsamples, bool)
+DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end_frame */, double /* speed */, pframes_t nsamples, bool)
{
const uint32_t chn = _configured_output.n_audio();
pframes_t p0 = 0;
@@ -112,6 +112,7 @@ DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end
_roff += boff;
}
+ // use shared_array::swap() ??
_buf = _pending_buf;
_bsiz = _pending_bsiz;
_pending_bsiz = 0;
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc
index b2cdc0b..e051ce6 100644
--- a/libs/ardour/delivery.cc
+++ b/libs/ardour/delivery.cc
@@ -34,7 +34,7 @@
#include "ardour/port.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR { class Panner; }
@@ -229,14 +229,14 @@ Delivery::configure_io (ChanCount in, ChanCount out)
}
void
-Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required)
+Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double /*speed*/, pframes_t nframes, bool result_required)
{
assert (_output);
PortSet& ports (_output->ports());
gain_t tgain;
- if (_output->n_ports ().get (_output->default_type()) == 0) {
+ if (ports.num_ports () == 0) {
goto out;
}
@@ -246,8 +246,8 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
}
/* this setup is not just for our purposes, but for anything that comes after us in the
- processing pathway that wants to use this->output_buffers() for some reason.
- */
+ * processing pathway that wants to use this->output_buffers() for some reason.
+ */
// TODO delayline -- latency-compensation
output_buffers().get_backend_port_addresses (ports, nframes);
@@ -267,8 +267,8 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
} else if (tgain < GAIN_COEFF_SMALL) {
/* we were quiet last time, and we're still supposed to be quiet.
- Silence the outputs, and make sure the buffers are quiet too,
- */
+ Silence the outputs, and make sure the buffers are quiet too,
+ */
_output->silence (nframes);
if (result_required) {
@@ -283,7 +283,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
Amp::apply_simple_gain (bufs, nframes, tgain);
}
- // Speed quietning
+ // Speed quietning
if (fabs (_session.transport_speed()) > 1.5 && Config->get_quieten_at_speed ()) {
Amp::apply_simple_gain (bufs, nframes, speed_quietning, false);
@@ -297,30 +297,36 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
_panshell->run (bufs, output_buffers(), start_frame, end_frame, nframes);
- // MIDI data will not have been delivered by the panner
+ // non-audio data will not have been delivered by the panner
- if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) {
- _output->copy_to_outputs (bufs, DataType::MIDI, nframes, ports.port(0)->port_offset());
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ if (*t != DataType::AUDIO && bufs.count().get(*t) > 0) {
+ _output->copy_to_outputs (bufs, *t, nframes, ports.port(0)->port_offset());
+ }
}
} else {
// Do a 1:1 copy of data to output ports
- if (bufs.count().n_audio() > 0 && ports.count().n_audio () > 0) {
+ // audio is handled separately because we use 0 for the offset
+ // XXX how does this interact with Port::increment_global_port_buffer_offset ?
+ if (bufs.count().n_audio() > 0) {
_output->copy_to_outputs (bufs, DataType::AUDIO, nframes, 0);
- }
+ }
- if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) {
- _output->copy_to_outputs (bufs, DataType::MIDI, nframes, ports.port(0)->port_offset());
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ if (*t != DataType::AUDIO && bufs.count().get(*t) > 0) {
+ _output->copy_to_outputs (bufs, *t, nframes, ports.port(0)->port_offset());
+ }
}
}
- if (result_required) {
- bufs.read_from (output_buffers (), nframes);
- }
+ if (result_required) {
+ bufs.read_from (output_buffers (), nframes);
+ }
- out:
+out:
_active = _pending_active;
}
@@ -352,7 +358,7 @@ Delivery::state (bool full_state)
int
Delivery::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if (IOProcessor::set_state (node, version)) {
return -1;
diff --git a/libs/ardour/directory_names.cc b/libs/ardour/directory_names.cc
index 54b491e..5d13850 100644
--- a/libs/ardour/directory_names.cc
+++ b/libs/ardour/directory_names.cc
@@ -19,7 +19,7 @@
#include "ardour/directory_names.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
@@ -37,11 +37,13 @@ const char* const templates_dir_name = X_("templates");
const char* const route_templates_dir_name = X_("route_templates");
const char* const surfaces_dir_name = X_("surfaces");
const char* const ladspa_dir_name = X_("ladspa");
+const char* const theme_dir_name = X_("themes");
const char* const panner_dir_name = X_("panners");
const char* const backend_dir_name = X_("backends");
const char* const automation_dir_name = X_("automation");
const char* const analysis_dir_name = X_("analysis");
const char* const plugins_dir_name = X_("plugins");
const char* const externals_dir_name = X_("externals");
+const char* const lua_dir_name = X_("scripts");
}
diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc
index 7f42140..ebd11a1 100644
--- a/libs/ardour/diskstream.cc
+++ b/libs/ardour/diskstream.cc
@@ -46,7 +46,7 @@
#include "ardour/session.h"
#include "ardour/track.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -380,7 +380,7 @@ Diskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
_playlist = playlist;
_playlist->use();
- if (!in_set_state && recordable()) {
+ if (!in_set_state && destructive() && recordable()) {
reset_write_sources (false);
}
@@ -461,7 +461,7 @@ Diskstream::get_state ()
{
XMLNode* node = new XMLNode ("Diskstream");
char buf[64];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
node->add_property ("flags", enum_2_string (_flags));
node->add_property ("playlist", _playlist->name());
@@ -483,7 +483,7 @@ Diskstream::get_state ()
int
Diskstream::set_state (const XMLNode& node, int /*version*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("name")) != 0) {
_name = prop->value();
@@ -568,7 +568,9 @@ Diskstream::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const &
continue;
}
boost::shared_ptr<AutomationList> alist = ac->alist();
-
+ if (!alist->size()) {
+ continue;
+ }
XMLNode & before = alist->get_state ();
bool const things_moved = alist->move_ranges (movements);
if (things_moved) {
@@ -598,6 +600,9 @@ Diskstream::move_processor_automation (boost::weak_ptr<Processor> p, list< Evora
for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
+ if (!al->size()) {
+ continue;
+ }
XMLNode & before = al->get_state ();
bool const things_moved = al->move_ranges (movements);
if (things_moved) {
diff --git a/libs/ardour/dsp_filter.cc b/libs/ardour/dsp_filter.cc
new file mode 100644
index 0000000..0eef61a
--- /dev/null
+++ b/libs/ardour/dsp_filter.cc
@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <algorithm>
+#include <stdlib.h>
+#include <cmath>
+#include "ardour/dB.h"
+#include "ardour/buffer.h"
+#include "ardour/dsp_filter.h"
+
+#ifdef COMPILER_MSVC
+#include <float.h>
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local std::isfinite
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+using namespace ARDOUR::DSP;
+
+void
+ARDOUR::DSP::memset (float *data, const float val, const uint32_t n_samples) {
+ for (uint32_t i = 0; i < n_samples; ++i) {
+ data[i] = val;
+ }
+}
+
+void
+ARDOUR::DSP::mmult (float *data, float *mult, const uint32_t n_samples) {
+ for (uint32_t i = 0; i < n_samples; ++i) {
+ data[i] *= mult[i];
+ }
+}
+
+float
+ARDOUR::DSP::log_meter (float power) {
+ // compare to gtk2_ardour/logmeter.h
+ static const float lower_db = -192.f;
+ static const float upper_db = 0.f;
+ static const float non_linearity = 8.0;
+ return (power < lower_db ? 0.0 : powf ((power - lower_db) / (upper_db - lower_db), non_linearity));
+}
+
+float
+ARDOUR::DSP::log_meter_coeff (float coeff) {
+ if (coeff <= 0) return 0;
+ return log_meter (fast_coefficient_to_dB (coeff));
+}
+
+void
+ARDOUR::DSP::peaks (const float *data, float &min, float &max, uint32_t n_samples) {
+ for (uint32_t i = 0; i < n_samples; ++i) {
+ if (data[i] < min) min = data[i];
+ if (data[i] > max) max = data[i];
+ }
+}
+
+void
+ARDOUR::DSP::process_map (BufferSet* bufs, const ChanMapping& in, const ChanMapping& out, pframes_t nframes, framecnt_t offset, const DataType& dt)
+{
+ const ChanMapping::Mappings& im (in.mappings());
+ const ChanMapping::Mappings& om (out.mappings());
+
+ for (ChanMapping::Mappings::const_iterator tm = im.begin(); tm != im.end(); ++tm) {
+ if (tm->first != dt) { continue; }
+ for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ bool valid;
+ const uint32_t idx = out.get (dt, i->second, &valid);
+ if (valid && idx != i->first) {
+ bufs->get (dt, idx).read_from (bufs->get (dt, i->first), nframes, offset, offset);
+ }
+ }
+ }
+ for (ChanMapping::Mappings::const_iterator tm = im.begin(); tm != im.end(); ++tm) {
+ if (tm->first != dt) { continue; }
+ for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ bool valid;
+ in.get_src (dt, i->first, &valid);
+ if (!valid) {
+ bufs->get (dt, i->second).silence (nframes, offset);
+ }
+ }
+ }
+
+}
+
+LowPass::LowPass (double samplerate, float freq)
+ : _rate (samplerate)
+ , _z (0)
+{
+ set_cutoff (freq);
+}
+
+void
+LowPass::set_cutoff (float freq)
+{
+ _a = 1.f - expf (-2.f * M_PI * freq / _rate);
+}
+
+void
+LowPass::proc (float *data, const uint32_t n_samples)
+{
+ // localize variables
+ const float a = _a;
+ float z = _z;
+ for (uint32_t i = 0; i < n_samples; ++i) {
+ data[i] += a * (data[i] - z);
+ z = data[i];
+ }
+ _z = z;
+ if (!isfinite_local (_z)) { _z = 0; }
+}
+
+void
+LowPass::ctrl (float *data, const float val, const uint32_t n_samples)
+{
+ // localize variables
+ const float a = _a;
+ float z = _z;
+ for (uint32_t i = 0; i < n_samples; ++i) {
+ data[i] += a * (val - z);
+ z = data[i];
+ }
+ _z = z;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+Biquad::Biquad (double samplerate)
+ : _rate (samplerate)
+ , _z1 (0.0)
+ , _z2 (0.0)
+ , _a1 (0.0)
+ , _a2 (0.0)
+ , _b0 (1.0)
+ , _b1 (0.0)
+ , _b2 (0.0)
+{
+}
+
+Biquad::Biquad (const Biquad &other)
+ : _rate (other._rate)
+ , _z1 (0.0)
+ , _z2 (0.0)
+ , _a1 (other._a1)
+ , _a2 (other._a2)
+ , _b0 (other._b0)
+ , _b1 (other._b1)
+ , _b2 (other._b2)
+{
+}
+
+void
+Biquad::run (float *data, const uint32_t n_samples)
+{
+ for (uint32_t i = 0; i < n_samples; ++i) {
+ const float xn = data[i];
+ const float z = _b0 * xn + _z1;
+ _z1 = _b1 * xn - _a1 * z + _z2;
+ _z2 = _b2 * xn - _a2 * z;
+ data[i] = z;
+ }
+
+ if (!isfinite_local (_z1)) { _z1 = 0; }
+ if (!isfinite_local (_z2)) { _z2 = 0; }
+}
+
+void
+Biquad::configure (double a1, double a2, double b0, double b1, double b2)
+{
+ _a1 = a1;
+ _a2 = a2;
+ _b0 = b0;
+ _b1 = b1;
+ _b2 = b2;
+}
+
+void
+Biquad::compute (Type type, double freq, double Q, double gain)
+{
+ if (Q <= .001) { Q = 0.001; }
+ if (freq <= 1.) { freq = 1.; }
+ if (freq >= _rate) { freq = _rate; }
+
+ /* Compute biquad filter settings.
+ * Based on 'Cookbook formulae for audio EQ biquad filter coefficents'
+ * by Robert Bristow-Johnson
+ */
+ const double A = pow (10.0, (gain / 40.0));
+ const double W0 = (2.0 * M_PI * freq) / _rate;
+ const double sinW0 = sin (W0);
+ const double cosW0 = cos (W0);
+ const double alpha = sinW0 / (2.0 * Q);
+ const double beta = sqrt (A) / Q;
+
+ double _a0;
+
+ switch (type) {
+ case LowPass:
+ _b0 = (1.0 - cosW0) / 2.0;
+ _b1 = 1.0 - cosW0;
+ _b2 = (1.0 - cosW0) / 2.0;
+ _a0 = 1.0 + alpha;
+ _a1 = -2.0 * cosW0;
+ _a2 = 1.0 - alpha;
+ break;
+
+ case HighPass:
+ _b0 = (1.0 + cosW0) / 2.0;
+ _b1 = -(1.0 + cosW0);
+ _b2 = (1.0 + cosW0) / 2.0;
+ _a0 = 1.0 + alpha;
+ _a1 = -2.0 * cosW0;
+ _a2 = 1.0 - alpha;
+ break;
+
+ case BandPassSkirt: /* Constant skirt gain, peak gain = Q */
+ _b0 = sinW0 / 2.0;
+ _b1 = 0.0;
+ _b2 = -sinW0 / 2.0;
+ _a0 = 1.0 + alpha;
+ _a1 = -2.0 * cosW0;
+ _a2 = 1.0 - alpha;
+ break;
+
+ case BandPass0dB: /* Constant 0 dB peak gain */
+ _b0 = alpha;
+ _b1 = 0.0;
+ _b2 = -alpha;
+ _a0 = 1.0 + alpha;
+ _a1 = -2.0 * cosW0;
+ _a2 = 1.0 - alpha;
+ break;
+
+ case Notch:
+ _b0 = 1.0;
+ _b1 = -2.0 * cosW0;
+ _b2 = 1.0;
+ _a0 = 1.0 + alpha;
+ _a1 = -2.0 * cosW0;
+ _a2 = 1.0 - alpha;
+ break;
+
+ case AllPass:
+ _b0 = 1.0 - alpha;
+ _b1 = -2.0 * cosW0;
+ _b2 = 1.0 + alpha;
+ _a0 = 1.0 + alpha;
+ _a1 = -2.0 * cosW0;
+ _a2 = 1.0 - alpha;
+ break;
+
+ case Peaking:
+ _b0 = 1.0 + (alpha * A);
+ _b1 = -2.0 * cosW0;
+ _b2 = 1.0 - (alpha * A);
+ _a0 = 1.0 + (alpha / A);
+ _a1 = -2.0 * cosW0;
+ _a2 = 1.0 - (alpha / A);
+ break;
+
+ case LowShelf:
+ _b0 = A * ((A + 1) - ((A - 1) * cosW0) + (beta * sinW0));
+ _b1 = (2.0 * A) * ((A - 1) - ((A + 1) * cosW0));
+ _b2 = A * ((A + 1) - ((A - 1) * cosW0) - (beta * sinW0));
+ _a0 = (A + 1) + ((A - 1) * cosW0) + (beta * sinW0);
+ _a1 = -2.0 * ((A - 1) + ((A + 1) * cosW0));
+ _a2 = (A + 1) + ((A - 1) * cosW0) - (beta * sinW0);
+ break;
+
+ case HighShelf:
+ _b0 = A * ((A + 1) + ((A - 1) * cosW0) + (beta * sinW0));
+ _b1 = -(2.0 * A) * ((A - 1) + ((A + 1) * cosW0));
+ _b2 = A * ((A + 1) + ((A - 1) * cosW0) - (beta * sinW0));
+ _a0 = (A + 1) - ((A - 1) * cosW0) + (beta * sinW0);
+ _a1 = 2.0 * ((A - 1) - ((A + 1) * cosW0));
+ _a2 = (A + 1) - ((A - 1) * cosW0) - (beta * sinW0);
+ break;
+ default:
+ abort(); /*NOTREACHED*/
+ break;
+ }
+
+ _b0 /= _a0;
+ _b1 /= _a0;
+ _b2 /= _a0;
+ _a1 /= _a0;
+ _a2 /= _a0;
+}
+
+float
+Biquad::dB_at_freq (float freq) const
+{
+ const double W0 = (2.0 * M_PI * freq) / _rate;
+ const float c1 = cosf (W0);
+ const float s1 = sinf (W0);
+
+ const float A = _b0 + _b2;
+ const float B = _b0 - _b2;
+ const float C = 1.0 + _a2;
+ const float D = 1.0 - _a2;
+
+ const float a = A * c1 + _b1;
+ const float b = B * s1;
+ const float c = C * c1 + _a1;
+ const float d = D * s1;
+
+#define SQUARE(x) ( (x) * (x) )
+ float rv = 20.f * log10f (sqrtf ((SQUARE(a) + SQUARE(b)) * (SQUARE(c) + SQUARE(d))) / (SQUARE(c) + SQUARE(d)));
+ if (!isfinite_local (rv)) { rv = 0; }
+ return std::min (120.f, std::max(-120.f, rv));
+}
+
+
+Glib::Threads::Mutex FFTSpectrum::fft_planner_lock;
+
+FFTSpectrum::FFTSpectrum (uint32_t window_size, double rate)
+ : hann_window (0)
+{
+ init (window_size, rate);
+}
+
+FFTSpectrum::~FFTSpectrum ()
+{
+ {
+ Glib::Threads::Mutex::Lock lk (fft_planner_lock);
+ fftwf_destroy_plan (_fftplan);
+ }
+ fftwf_free (_fft_data_in);
+ fftwf_free (_fft_data_out);
+ free (_fft_power);
+ free (hann_window);
+}
+
+void
+FFTSpectrum::init (uint32_t window_size, double rate)
+{
+ Glib::Threads::Mutex::Lock lk (fft_planner_lock);
+
+ _fft_window_size = window_size;
+ _fft_data_size = window_size / 2;
+ _fft_freq_per_bin = rate / _fft_data_size / 2.f;
+
+ _fft_data_in = (float *) fftwf_malloc (sizeof(float) * _fft_window_size);
+ _fft_data_out = (float *) fftwf_malloc (sizeof(float) * _fft_window_size);
+ _fft_power = (float *) malloc (sizeof(float) * _fft_data_size);
+
+ reset ();
+
+ _fftplan = fftwf_plan_r2r_1d (_fft_window_size, _fft_data_in, _fft_data_out, FFTW_R2HC, FFTW_MEASURE);
+
+ hann_window = (float *) malloc(sizeof(float) * window_size);
+ double sum = 0.0;
+
+ for (uint32_t i = 0; i < window_size; ++i) {
+ hann_window[i] = 0.5f - (0.5f * (float) cos (2.0f * M_PI * (float)i / (float)(window_size)));
+ sum += hann_window[i];
+ }
+ const double isum = 2.0 / sum;
+ for (uint32_t i = 0; i < window_size; ++i) {
+ hann_window[i] *= isum;
+ }
+}
+
+void
+FFTSpectrum::reset ()
+{
+ for (uint32_t i = 0; i < _fft_data_size; ++i) {
+ _fft_power[i] = 0;
+ }
+ for (uint32_t i = 0; i < _fft_window_size; ++i) {
+ _fft_data_out[i] = 0;
+ }
+}
+
+void
+FFTSpectrum::set_data_hann (float const * const data, uint32_t n_samples, uint32_t offset)
+{
+ assert(n_samples + offset <= _fft_window_size);
+ for (uint32_t i = 0; i < n_samples; ++i) {
+ _fft_data_in[i + offset] = data[i] * hann_window[i + offset];
+ }
+}
+
+void
+FFTSpectrum::execute ()
+{
+ fftwf_execute (_fftplan);
+
+ _fft_power[0] = _fft_data_out[0] * _fft_data_out[0];
+
+#define FRe (_fft_data_out[i])
+#define FIm (_fft_data_out[_fft_window_size - i])
+ for (uint32_t i = 1; i < _fft_data_size - 1; ++i) {
+ _fft_power[i] = (FRe * FRe) + (FIm * FIm);
+ //_fft_phase[i] = atan2f (FIm, FRe);
+ }
+#undef FRe
+#undef FIm
+}
+
+float
+FFTSpectrum::power_at_bin (const uint32_t b, const float norm) const {
+ assert (b < _fft_data_size);
+ const float a = _fft_power[b] * norm;
+ return a > 1e-12 ? 10.0 * fast_log10 (a) : -INFINITY;
+}
diff --git a/libs/ardour/ebur128_analysis.cc b/libs/ardour/ebur128_analysis.cc
index 3788e02..a329f87 100644
--- a/libs/ardour/ebur128_analysis.cc
+++ b/libs/ardour/ebur128_analysis.cc
@@ -22,7 +22,7 @@
#include "ardour/ebur128_analysis.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Vamp;
using namespace ARDOUR;
diff --git a/libs/ardour/element_importer.cc b/libs/ardour/element_importer.cc
index 4f635f1..7bd7d01 100644
--- a/libs/ardour/element_importer.cc
+++ b/libs/ardour/element_importer.cc
@@ -26,7 +26,7 @@
#include "pbd/convert.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -42,7 +42,7 @@ ElementImporter::ElementImporter (XMLTree const & source, ARDOUR::Session & sess
_broken (false)
{
// Get samplerate
- XMLProperty *prop;
+ XMLProperty const * prop;
prop = source.root()->property ("sample-rate");
if (prop) {
std::istringstream iss (prop->value());
diff --git a/libs/ardour/engine_state_controller.cc b/libs/ardour/engine_state_controller.cc
index 57b8a84..06a4f46 100644
--- a/libs/ardour/engine_state_controller.cc
+++ b/libs/ardour/engine_state_controller.cc
@@ -26,7 +26,7 @@
#include "pbd/pthread_utils.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -150,7 +150,7 @@ EngineStateController::_deserialize_and_load_engine_states ()
XMLNode* state_node = *state_node_iter;
StatePtr engine_state (new State);
- XMLProperty* prop = NULL;
+ XMLProperty const * prop = NULL;
if ((prop = state_node->property ("backend-name")) == 0) {
continue;
@@ -302,7 +302,7 @@ EngineStateController::_deserialize_and_load_midi_port_states ()
for (; input_state_node_iter != input_state_nodes.end (); ++input_state_node_iter) {
XMLNode* input_state_node = *input_state_node_iter;
- XMLProperty* prop = NULL;
+ XMLProperty const * prop = NULL;
if (input_state_node->name () != "input") {
continue;
@@ -341,7 +341,7 @@ EngineStateController::_deserialize_and_load_midi_port_states ()
for (; output_state_node_iter != output_state_nodes.end (); ++output_state_node_iter) {
XMLNode* output_state_node = *output_state_node_iter;
- XMLProperty* prop = NULL;
+ XMLProperty const * prop = NULL;
if (output_state_node->name () != "output") {
continue;
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index fa83780..6e90bd0 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -32,8 +32,10 @@
#include "ardour/location.h"
#include "ardour/midi_model.h"
#include "ardour/mute_master.h"
+#include "ardour/presentation_info.h"
#include "ardour/session.h"
#include "ardour/source.h"
+#include "ardour/tempo.h"
#include "ardour/track.h"
#include "ardour/types.h"
@@ -72,7 +74,6 @@ setup_enum_writer ()
MonitorState _MonitorState;
PFLPosition _PFLPosition;
AFLPosition _AFLPosition;
- RemoteModel _RemoteModel;
DenormalModel _DenormalModel;
LayerModel _LayerModel;
InsertMergePolicy _InsertMergePolicy;
@@ -98,11 +99,11 @@ setup_enum_writer ()
AutoConnectOption _AutoConnectOption;
TracksAutoNamingRule _TracksAutoNamingRule;
Session::StateOfTheState _Session_StateOfTheState;
- Route::Flag _Route_Flag;
Source::Flag _Source_Flag;
Diskstream::Flag _Diskstream_Flag;
Location::Flags _Location_Flags;
PositionLockStyle _PositionLockStyle;
+ TempoSection::Type _TempoSection_Type;
Track::FreezeState _Track_FreezeState;
AutomationList::InterpolationStyle _AutomationList_InterpolationStyle;
AnyTime::Type _AnyTime_Type;
@@ -132,27 +133,37 @@ setup_enum_writer ()
Evoral::OverlapType _OverlapType;
BufferingPreset _BufferingPreset;
AutoReturnTarget _AutoReturnTarget;
+ PresentationInfo::Flag _PresentationInfo_Flag;
#define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear()
#define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear()
#define REGISTER_ENUM(e) i.push_back (e); s.push_back (#e)
#define REGISTER_CLASS_ENUM(t,e) i.push_back (t::e); s.push_back (#e)
+ REGISTER_ENUM (NullAutomation);
REGISTER_ENUM (GainAutomation);
- REGISTER_ENUM (TrimAutomation);
REGISTER_ENUM (PanAzimuthAutomation);
REGISTER_ENUM (PanElevationAutomation);
REGISTER_ENUM (PanWidthAutomation);
+ REGISTER_ENUM (PanFrontBackAutomation);
+ REGISTER_ENUM (PanLFEAutomation);
REGISTER_ENUM (PluginAutomation);
REGISTER_ENUM (PluginPropertyAutomation);
REGISTER_ENUM (SoloAutomation);
+ REGISTER_ENUM (SoloIsolateAutomation);
+ REGISTER_ENUM (SoloSafeAutomation);
REGISTER_ENUM (MuteAutomation);
REGISTER_ENUM (MidiCCAutomation);
+ REGISTER_ENUM (MidiPgmChangeAutomation);
+ REGISTER_ENUM (MidiPitchBenderAutomation);
+ REGISTER_ENUM (MidiChannelPressureAutomation);
+ REGISTER_ENUM (MidiSystemExclusiveAutomation);
REGISTER_ENUM (FadeInAutomation);
REGISTER_ENUM (FadeOutAutomation);
REGISTER_ENUM (EnvelopeAutomation);
- REGISTER_ENUM (SoloIsolateAutomation);
- REGISTER_ENUM (SoloSafeAutomation);
+ REGISTER_ENUM (RecEnableAutomation);
+ REGISTER_ENUM (RecSafeAutomation);
+ REGISTER_ENUM (TrimAutomation);
REGISTER_ENUM (PhaseAutomation);
REGISTER_ENUM (MonitoringAutomation);
REGISTER_ENUM (EQGain);
@@ -311,9 +322,6 @@ setup_enum_writer ()
REGISTER_ENUM (DenormalFTZDAZ);
REGISTER (_DenormalModel);
- REGISTER_ENUM (UserOrdered);
- REGISTER_ENUM (MixerOrdered);
- REGISTER (_RemoteModel);
/*
* EditorOrdered has been deprecated
* since the removal of independent
@@ -480,11 +488,6 @@ setup_enum_writer ()
REGISTER_CLASS_ENUM (Session, pullup_Minus4Minus1);
REGISTER (_Session_PullupFormat);
- REGISTER_CLASS_ENUM (Route, Auditioner);
- REGISTER_CLASS_ENUM (Route, MasterOut);
- REGISTER_CLASS_ENUM (Route, MonitorOut);
- REGISTER_BITS (_Route_Flag);
-
REGISTER_CLASS_ENUM (Source, Writable);
REGISTER_CLASS_ENUM (Source, CanRename);
REGISTER_CLASS_ENUM (Source, Broadcast);
@@ -528,6 +531,10 @@ setup_enum_writer ()
REGISTER_CLASS_ENUM (Location, IsSkip);
REGISTER_BITS (_Location_Flags);
+ REGISTER_CLASS_ENUM (TempoSection, Ramp);
+ REGISTER_CLASS_ENUM (TempoSection, Constant);
+ REGISTER (_TempoSection_Type);
+
REGISTER_CLASS_ENUM (Track, NoFreeze);
REGISTER_CLASS_ENUM (Track, Frozen);
REGISTER_CLASS_ENUM (Track, UnFrozen);
@@ -694,6 +701,19 @@ setup_enum_writer ()
REGISTER_ENUM (Loop);
REGISTER_ENUM (RegionSelectionStart);
REGISTER_BITS (_AutoReturnTarget);
+
+ REGISTER_CLASS_ENUM (PresentationInfo, AudioTrack);
+ REGISTER_CLASS_ENUM (PresentationInfo, MidiTrack);
+ REGISTER_CLASS_ENUM (PresentationInfo, AudioBus);
+ REGISTER_CLASS_ENUM (PresentationInfo, MidiBus);
+ REGISTER_CLASS_ENUM (PresentationInfo, VCA);
+ REGISTER_CLASS_ENUM (PresentationInfo, MasterOut);
+ REGISTER_CLASS_ENUM (PresentationInfo, MonitorOut);
+ REGISTER_CLASS_ENUM (PresentationInfo, Auditioner);
+ REGISTER_CLASS_ENUM (PresentationInfo, Selected);
+ REGISTER_CLASS_ENUM (PresentationInfo, Hidden);
+ REGISTER_CLASS_ENUM (PresentationInfo, OrderSet);
+ REGISTER_BITS (_PresentationInfo_Flag);
}
} /* namespace ARDOUR */
@@ -826,19 +846,6 @@ std::ostream& operator<<(std::ostream& o, const AFLPosition& var)
return o << s;
}
-std::istream& operator>>(std::istream& o, RemoteModel& var)
-{
- std::string s;
- o >> s;
- var = (RemoteModel) string_2_enum (s, var);
- return o;
-}
-
-std::ostream& operator<<(std::ostream& o, const RemoteModel& var)
-{
- std::string s = enum_2_string (var);
- return o << s;
-}
std::istream& operator>>(std::istream& o, EditMode& var)
{
std::string s;
diff --git a/libs/ardour/export_channel.cc b/libs/ardour/export_channel.cc
index 2ccaf1a..cc38853 100644
--- a/libs/ardour/export_channel.cc
+++ b/libs/ardour/export_channel.cc
@@ -30,7 +30,7 @@
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -98,7 +98,7 @@ PortExportChannel::get_state (XMLNode * node) const
void
PortExportChannel::set_state (XMLNode * node, Session & session)
{
- XMLProperty * prop;
+ XMLProperty const * prop;
XMLNodeList xml_ports = node->children ("Port");
for (XMLNodeList::iterator it = xml_ports.begin(); it != xml_ports.end(); ++it) {
if ((prop = (*it)->property ("name"))) {
diff --git a/libs/ardour/export_failed.cc b/libs/ardour/export_failed.cc
index 97f2ee5..6de3c9f 100644
--- a/libs/ardour/export_failed.cc
+++ b/libs/ardour/export_failed.cc
@@ -21,7 +21,7 @@
#include "pbd/error.h"
#include "ardour/export_failed.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/export_filename.cc b/libs/ardour/export_filename.cc
index 201abb9..177d515 100644
--- a/libs/ardour/export_filename.cc
+++ b/libs/ardour/export_filename.cc
@@ -37,7 +37,7 @@
#include "ardour/export_timespan.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace Glib;
@@ -107,7 +107,7 @@ int
ExportFilename::set_state (const XMLNode & node)
{
XMLNode * child;
- XMLProperty * prop;
+ XMLProperty const * prop;
FieldPair pair;
child = node.child ("Folder");
@@ -372,7 +372,7 @@ ExportFilename::get_field (XMLNode const & node, string const & name)
XMLNodeList children = node.children();
for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) {
- XMLProperty * prop = (*it)->property ("name");
+ XMLProperty const * prop = (*it)->property ("name");
if (prop && !prop->value().compare (name)) {
prop = (*it)->property ("enabled");
diff --git a/libs/ardour/export_format_manager.cc b/libs/ardour/export_format_manager.cc
index f87a086..4025ad3 100644
--- a/libs/ardour/export_format_manager.cc
+++ b/libs/ardour/export_format_manager.cc
@@ -23,7 +23,7 @@
#include "ardour/export_format_specification.h"
#include "ardour/export_format_compatibility.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using std::string;
@@ -216,13 +216,13 @@ void
ExportFormatManager::init_sample_rates ()
{
add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_Session, _("Session rate"))));
- add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_8, "8 kHz")));
- add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_22_05, "22,05 kHz")));
- add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_44_1, "44,1 kHz")));
- add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_48, "48 kHz")));
- add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_88_2, "88,2 kHz")));
- add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_96, "96 kHz")));
- add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_192, "192 kHz")));
+ add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_8, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 8))));
+ add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_22_05, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(2), 22.05))));
+ add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_44_1, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(1), 44.1))));
+ add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_48, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 48))));
+ add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_88_2, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(1), 88.2))));
+ add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_96, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 96))));
+ add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_192, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 192))));
}
void
@@ -343,9 +343,30 @@ ExportFormatManager::select_normalize (bool value)
}
void
-ExportFormatManager::select_normalize_target (float value)
+ExportFormatManager::select_normalize_loudness (bool value)
{
- current_selection->set_normalize_target (value);
+ current_selection->set_normalize_loudness (value);
+ check_for_description_change ();
+}
+
+void
+ExportFormatManager::select_normalize_dbfs (float value)
+{
+ current_selection->set_normalize_dbfs (value);
+ check_for_description_change ();
+}
+
+void
+ExportFormatManager::select_normalize_lufs (float value)
+{
+ current_selection->set_normalize_lufs (value);
+ check_for_description_change ();
+}
+
+void
+ExportFormatManager::select_normalize_dbtp (float value)
+{
+ current_selection->set_normalize_dbtp (value);
check_for_description_change ();
}
diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc
index fd85c32..07bd911 100644
--- a/libs/ardour/export_format_specification.cc
+++ b/libs/ardour/export_format_specification.cc
@@ -31,7 +31,7 @@
#include "pbd/enumwriter.h"
#include "pbd/convert.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR
{
@@ -167,7 +167,10 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
, _silence_end (s)
, _normalize (false)
- , _normalize_target (GAIN_COEFF_UNITY)
+ , _normalize_loudness (false)
+ , _normalize_dbfs (GAIN_COEFF_UNITY)
+ , _normalize_lufs (-23)
+ , _normalize_dbtp (-1)
, _with_toc (false)
, _with_cue (false)
, _with_mp4chaps (false)
@@ -184,9 +187,30 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const & state)
: session (s)
+
+ , has_sample_format (false)
+ , supports_tagging (false)
+ , _has_broadcast_info (false)
+ , _channel_limit (0)
+ , _dither_type (D_None)
+ , _src_quality (SRC_SincBest)
+ , _tag (true)
+
+ , _trim_beginning (false)
, _silence_beginning (s)
+ , _trim_end (false)
, _silence_end (s)
+
+ , _normalize (false)
+ , _normalize_loudness (false)
+ , _normalize_dbfs (GAIN_COEFF_UNITY)
+ , _normalize_lufs (-23)
+ , _normalize_dbtp (-1)
+ , _with_toc (false)
+ , _with_cue (false)
+ , _with_mp4chaps (false)
, _soundcloud_upload (false)
+ , _command ("")
, _analyse (true)
{
_silence_beginning.type = Time::Timecode;
@@ -228,7 +252,10 @@ ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification
set_trim_beginning (other.trim_beginning());
set_trim_end (other.trim_end());
set_normalize (other.normalize());
- set_normalize_target (other.normalize_target());
+ set_normalize_loudness (other.normalize_loudness());
+ set_normalize_dbfs (other.normalize_dbfs());
+ set_normalize_lufs (other.normalize_lufs());
+ set_normalize_dbtp (other.normalize_dbtp());
set_tag (other.tag());
@@ -245,6 +272,7 @@ ExportFormatSpecification::~ExportFormatSpecification ()
XMLNode &
ExportFormatSpecification::get_state ()
{
+ LocaleGuard lg;
XMLNode * node;
XMLNode * root = new XMLNode ("ExportFormatSpecification");
@@ -281,7 +309,10 @@ ExportFormatSpecification::get_state ()
node = processing->add_child ("Normalize");
node->add_property ("enabled", normalize() ? "true" : "false");
- node->add_property ("target", to_string (normalize_target(), std::dec));
+ node->add_property ("loudness", normalize_loudness() ? "yes" : "no");
+ node->add_property ("dbfs", to_string (normalize_dbfs(), std::dec));
+ node->add_property ("lufs", to_string (normalize_lufs(), std::dec));
+ node->add_property ("dbtp", to_string (normalize_dbtp(), std::dec));
XMLNode * silence = processing->add_child ("Silence");
XMLNode * start = silence->add_child ("Start");
@@ -310,6 +341,7 @@ ExportFormatSpecification::set_state (const XMLNode & root)
XMLProperty const * prop;
XMLNode const * child;
string value;
+ LocaleGuard lg;
if ((prop = root.property ("name"))) {
_name = prop->value();
@@ -407,8 +439,25 @@ ExportFormatSpecification::set_state (const XMLNode & root)
_normalize = (!prop->value().compare ("true"));
}
+ // old formats before ~ 4.7-930ish
if ((prop = child->property ("target"))) {
- _normalize_target = atof (prop->value());
+ _normalize_dbfs = atof (prop->value());
+ }
+
+ if ((prop = child->property ("loudness"))) {
+ _normalize_loudness = string_is_affirmative (prop->value());
+ }
+
+ if ((prop = child->property ("dbfs"))) {
+ _normalize_dbfs = atof (prop->value());
+ }
+
+ if ((prop = child->property ("lufs"))) {
+ _normalize_lufs = atof (prop->value());
+ }
+
+ if ((prop = child->property ("dbtp"))) {
+ _normalize_dbtp = atof (prop->value());
}
}
@@ -556,7 +605,11 @@ ExportFormatSpecification::description (bool include_name)
list<string> components;
if (_normalize) {
- components.push_back (_("normalize"));
+ if (_normalize_loudness) {
+ components.push_back (_("normalize loudness"));
+ } else {
+ components.push_back (_("normalize peak"));
+ }
}
if (_trim_beginning && _trim_end) {
@@ -649,7 +702,7 @@ ExportFormatSpecification::get_option (XMLNode const * node, std::string const &
XMLNodeList list (node->children ("Option"));
for (XMLNodeList::iterator it = list.begin(); it != list.end(); ++it) {
- XMLProperty * prop = (*it)->property ("name");
+ XMLProperty const * prop = (*it)->property ("name");
if (prop && !name.compare (prop->value())) {
prop = (*it)->property ("value");
if (prop) {
diff --git a/libs/ardour/export_formats.cc b/libs/ardour/export_formats.cc
index 47f68fe..642f05a 100644
--- a/libs/ardour/export_formats.cc
+++ b/libs/ardour/export_formats.cc
@@ -20,7 +20,7 @@
#include "ardour/export_formats.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc
index a15a48a..7c5a434 100644
--- a/libs/ardour/export_graph_builder.cc
+++ b/libs/ardour/export_graph_builder.cc
@@ -30,11 +30,14 @@
#include "audiographer/general/normalizer.h"
#include "audiographer/general/analyser.h"
#include "audiographer/general/peak_reader.h"
+#include "audiographer/general/loudness_reader.h"
#include "audiographer/general/sample_format_converter.h"
#include "audiographer/general/sr_converter.h"
#include "audiographer/general/silence_trimmer.h"
#include "audiographer/general/threader.h"
#include "audiographer/sndfile/tmp_file.h"
+#include "audiographer/sndfile/tmp_file_rt.h"
+#include "audiographer/sndfile/tmp_file_sync.h"
#include "audiographer/sndfile/sndfile_writer.h"
#include "ardour/audioengine.h"
@@ -81,25 +84,25 @@ ExportGraphBuilder::process (framecnt_t frames, bool last_cycle)
}
bool
-ExportGraphBuilder::process_normalize ()
+ExportGraphBuilder::post_process ()
{
- for (std::list<Normalizer *>::iterator it = normalizers.begin(); it != normalizers.end(); /* ++ in loop */) {
+ for (std::list<Intermediate *>::iterator it = intermediates.begin(); it != intermediates.end(); /* ++ in loop */) {
if ((*it)->process()) {
- it = normalizers.erase (it);
+ it = intermediates.erase (it);
} else {
++it;
}
}
- return normalizers.empty();
+ return intermediates.empty();
}
unsigned
-ExportGraphBuilder::get_normalize_cycle_count() const
+ExportGraphBuilder::get_postprocessing_cycle_count() const
{
unsigned max = 0;
- for (std::list<Normalizer *>::const_iterator it = normalizers.begin(); it != normalizers.end(); ++it) {
- max = std::max(max, (*it)->get_normalize_cycle_count());
+ for (std::list<Intermediate *>::const_iterator it = intermediates.begin(); it != intermediates.end(); ++it) {
+ max = std::max(max, (*it)->get_postprocessing_cycle_count());
}
return max;
}
@@ -110,8 +113,9 @@ ExportGraphBuilder::reset ()
timespan.reset();
channel_configs.clear ();
channels.clear ();
- normalizers.clear ();
+ intermediates.clear ();
analysis_map.clear();
+ _realtime = false;
}
void
@@ -132,7 +136,7 @@ ExportGraphBuilder::set_current_timespan (boost::shared_ptr<ExportTimespan> span
}
void
-ExportGraphBuilder::add_config (FileSpec const & config)
+ExportGraphBuilder::add_config (FileSpec const & config, bool rt)
{
ExportChannelConfiguration::ChannelList const & channels =
config.channel_config->get_channels();
@@ -141,6 +145,8 @@ ExportGraphBuilder::add_config (FileSpec const & config)
(*it)->set_max_buffer_size(process_buffer_frames);
}
+ _realtime = rt;
+
// If the sample rate is "session rate", change it to the real value.
// However, we need to copy it to not change the config which is saved...
FileSpec new_config (config);
@@ -316,6 +322,8 @@ ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &parent, FileSpec const & new_c
analyser.reset (new Analyser (config.format->sample_rate(), channels, max_frames,
(framecnt_t) ceil (duration * config.format->sample_rate () / (double) sample_rate)));
chunker->add_output (analyser);
+
+ config.filename->set_channel_config (config.channel_config);
parent.add_analyser (config.filename->get_path (config.format), analyser);
}
@@ -403,10 +411,12 @@ ExportGraphBuilder::SFC::operator== (FileSpec const & other_config) const
return config.format->sample_format() == other_config.format->sample_format();
}
-/* Normalizer */
+/* Intermediate (Normalizer, TmpFile) */
-ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t /*max_frames*/)
+ExportGraphBuilder::Intermediate::Intermediate (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames)
: parent (parent)
+ , use_loudness (false)
+ , use_peak (false)
{
std::string tmpfile_path = parent.session.session_directory().export_path();
tmpfile_path = Glib::build_filename(tmpfile_path, "XXXXXX");
@@ -417,33 +427,58 @@ ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpe
config = new_config;
uint32_t const channels = config.channel_config->get_n_chans();
max_frames_out = 4086 - (4086 % channels); // TODO good chunk size
+ use_loudness = config.format->normalize_loudness ();
+ use_peak = config.format->normalize ();
buffer.reset (new AllocatingProcessContext<Sample> (max_frames_out, channels));
- peak_reader.reset (new PeakReader ());
- normalizer.reset (new AudioGrapher::Normalizer (config.format->normalize_target()));
- threader.reset (new Threader<Sample> (parent.thread_pool));
+ if (use_peak) {
+ peak_reader.reset (new PeakReader ());
+ }
+ if (use_loudness) {
+ loudness_reader.reset (new LoudnessReader (config.format->sample_rate(), channels, max_frames));
+ }
+
+ normalizer.reset (new AudioGrapher::Normalizer (use_loudness ? 0.0 : config.format->normalize_dbfs()));
+ threader.reset (new Threader<Sample> (parent.thread_pool));
normalizer->alloc_buffer (max_frames_out);
normalizer->add_output (threader);
int format = ExportFormatBase::F_RAW | ExportFormatBase::SF_Float;
- tmp_file.reset (new TmpFile<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+
+ if (parent._realtime) {
+ tmp_file.reset (new TmpFileRt<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+ } else {
+ tmp_file.reset (new TmpFileSync<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+ }
+
tmp_file->FileWritten.connect_same_thread (post_processing_connection,
- boost::bind (&Normalizer::start_post_processing, this));
+ boost::bind (&Intermediate::prepare_post_processing, this));
+ tmp_file->FileFlushed.connect_same_thread (post_processing_connection,
+ boost::bind (&Intermediate::start_post_processing, this));
add_child (new_config);
- peak_reader->add_output (tmp_file);
+ if (use_loudness) {
+ loudness_reader->add_output (tmp_file);
+ } else if (use_peak) {
+ peak_reader->add_output (tmp_file);
+ }
}
ExportGraphBuilder::FloatSinkPtr
-ExportGraphBuilder::Normalizer::sink ()
+ExportGraphBuilder::Intermediate::sink ()
{
- return peak_reader;
+ if (use_loudness) {
+ return loudness_reader;
+ } else if (use_peak) {
+ return peak_reader;
+ }
+ return tmp_file;
}
void
-ExportGraphBuilder::Normalizer::add_child (FileSpec const & new_config)
+ExportGraphBuilder::Intermediate::add_child (FileSpec const & new_config)
{
for (boost::ptr_list<SFC>::iterator it = children.begin(); it != children.end(); ++it) {
if (*it == new_config) {
@@ -457,7 +492,7 @@ ExportGraphBuilder::Normalizer::add_child (FileSpec const & new_config)
}
void
-ExportGraphBuilder::Normalizer::remove_children (bool remove_out_files)
+ExportGraphBuilder::Intermediate::remove_children (bool remove_out_files)
{
boost::ptr_list<SFC>::iterator iter = children.begin ();
@@ -468,36 +503,62 @@ ExportGraphBuilder::Normalizer::remove_children (bool remove_out_files)
}
bool
-ExportGraphBuilder::Normalizer::operator== (FileSpec const & other_config) const
+ExportGraphBuilder::Intermediate::operator== (FileSpec const & other_config) const
{
return config.format->normalize() == other_config.format->normalize() &&
- config.format->normalize_target() == other_config.format->normalize_target();
+ config.format->normalize_loudness () == other_config.format->normalize_loudness() &&
+ (
+ (!config.format->normalize_loudness () && config.format->normalize_dbfs() == other_config.format->normalize_dbfs())
+ ||
+ // FIXME: allow simultaneous export of two formats with different loundness normalization settings
+ (config.format->normalize_loudness () /* lufs/dbtp is a result option, not an instantaion option */)
+ );
}
unsigned
-ExportGraphBuilder::Normalizer::get_normalize_cycle_count() const
+ExportGraphBuilder::Intermediate::get_postprocessing_cycle_count() const
{
return static_cast<unsigned>(std::ceil(static_cast<float>(tmp_file->get_frames_written()) /
max_frames_out));
}
bool
-ExportGraphBuilder::Normalizer::process()
+ExportGraphBuilder::Intermediate::process()
{
framecnt_t frames_read = tmp_file->read (*buffer);
return frames_read != buffer->frames();
}
void
-ExportGraphBuilder::Normalizer::start_post_processing()
-{
- const float gain = normalizer->set_peak (peak_reader->get_peak());
- for (boost::ptr_list<SFC>::iterator i = children.begin(); i != children.end(); ++i) {
- (*i).set_peak (gain);
+ExportGraphBuilder::Intermediate::prepare_post_processing()
+{
+ // called in sync rt-context
+ float gain;
+ if (use_loudness) {
+ gain = normalizer->set_peak (loudness_reader->get_peak (config.format->normalize_lufs (), config.format->normalize_dbtp ()));
+ } else if (use_peak) {
+ gain = normalizer->set_peak (peak_reader->get_peak());
+ } else {
+ gain = normalizer->set_peak (0.0);
+ }
+ if (use_loudness || use_peak) {
+ // push info to analyzers
+ for (boost::ptr_list<SFC>::iterator i = children.begin(); i != children.end(); ++i) {
+ (*i).set_peak (gain);
+ }
}
- tmp_file->seek (0, SEEK_SET);
tmp_file->add_output (normalizer);
- parent.normalizers.push_back (this);
+ parent.intermediates.push_back (this);
+}
+
+void
+ExportGraphBuilder::Intermediate::start_post_processing()
+{
+ // called in disk-thread (when exporting in realtime)
+ tmp_file->seek (0, SEEK_SET);
+ if (!AudioEngine::instance()->freewheeling ()) {
+ AudioEngine::instance()->freewheel (true);
+ }
}
/* SRC */
@@ -523,8 +584,8 @@ ExportGraphBuilder::SRC::sink ()
void
ExportGraphBuilder::SRC::add_child (FileSpec const & new_config)
{
- if (new_config.format->normalize()) {
- add_child_to_list (new_config, normalized_children);
+ if (new_config.format->normalize() || parent._realtime) {
+ add_child_to_list (new_config, intermediate_children);
} else {
add_child_to_list (new_config, children);
}
@@ -541,12 +602,12 @@ ExportGraphBuilder::SRC::remove_children (bool remove_out_files)
sfc_iter = children.erase (sfc_iter);
}
- boost::ptr_list<Normalizer>::iterator norm_iter = normalized_children.begin();
+ boost::ptr_list<Intermediate>::iterator norm_iter = intermediate_children.begin();
- while (norm_iter != normalized_children.end() ) {
+ while (norm_iter != intermediate_children.end() ) {
converter->remove_output (norm_iter->sink() );
norm_iter->remove_children (remove_out_files);
- norm_iter = normalized_children.erase (norm_iter);
+ norm_iter = intermediate_children.erase (norm_iter);
}
}
@@ -580,7 +641,12 @@ ExportGraphBuilder::SilenceHandler::SilenceHandler (ExportGraphBuilder & parent,
max_frames_in = max_frames;
framecnt_t sample_rate = parent.session.nominal_frame_rate();
- silence_trimmer.reset (new SilenceTrimmer<Sample>(max_frames_in));
+#ifdef MIXBUS
+ silence_trimmer.reset (new SilenceTrimmer<Sample>(max_frames_in, -90));
+#else
+ // TODO silence-threshold should be per export-preset, with Config->get_silence_threshold being the default
+ silence_trimmer.reset (new SilenceTrimmer<Sample>(max_frames_in, Config->get_export_silence_threshold ()));
+#endif
silence_trimmer->set_trim_beginning (config.format->trim_beginning());
silence_trimmer->set_trim_end (config.format->trim_end());
diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc
index c36a6da..ac2f7b0 100644
--- a/libs/ardour/export_handler.cc
+++ b/libs/ardour/export_handler.cc
@@ -26,6 +26,7 @@
#include "pbd/convert.h"
+#include "ardour/audioengine.h"
#include "ardour/audiofile_tagger.h"
#include "ardour/debug.h"
#include "ardour/export_graph_builder.h"
@@ -40,7 +41,7 @@
#include "pbd/basename.h"
#include "ardour/session_metadata.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -110,7 +111,7 @@ ExportHandler::ExportHandler (Session & session)
, session (session)
, graph_builder (new ExportGraphBuilder (session))
, export_status (session.get_export_status ())
- , normalizing (false)
+ , post_processing (false)
, cue_tracknum (0)
, cue_indexnum (0)
{
@@ -189,19 +190,20 @@ ExportHandler::start_timespan ()
graph_builder->reset ();
graph_builder->set_current_timespan (current_timespan);
handle_duplicate_format_extensions();
+ bool realtime = current_timespan->realtime ();
for (ConfigMap::iterator it = timespan_bounds.first; it != timespan_bounds.second; ++it) {
// Filenames can be shared across timespans
FileSpec & spec = it->second;
spec.filename->set_timespan (it->first);
- graph_builder->add_config (spec);
+ graph_builder->add_config (spec, realtime);
}
/* start export */
- normalizing = false;
+ post_processing = false;
session.ProcessExport.connect_same_thread (process_connection, boost::bind (&ExportHandler::process, this, _1));
process_position = current_timespan->get_start();
- session.start_audio_export (process_position);
+ session.start_audio_export (process_position, realtime);
}
void
@@ -230,9 +232,14 @@ ExportHandler::process (framecnt_t frames)
{
if (!export_status->running ()) {
return 0;
- } else if (normalizing) {
+ } else if (post_processing) {
Glib::Threads::Mutex::Lock l (export_status->lock());
- return process_normalize ();
+ if (AudioEngine::instance()->freewheeling ()) {
+ return post_process ();
+ } else {
+ // wait until we're freewheeling
+ return 0;
+ }
} else {
Glib::Threads::Mutex::Lock l (export_status->lock());
return process_timespan (frames);
@@ -242,6 +249,7 @@ ExportHandler::process (framecnt_t frames)
int
ExportHandler::process_timespan (framecnt_t frames)
{
+ export_status->active_job = ExportStatus::Exporting;
/* update position */
framecnt_t frames_to_read = 0;
@@ -263,12 +271,12 @@ ExportHandler::process_timespan (framecnt_t frames)
/* Do actual processing */
int ret = graph_builder->process (frames_to_read, last_cycle);
- /* Start normalizing if necessary */
+ /* Start post-processing/normalizing if necessary */
if (last_cycle) {
- normalizing = graph_builder->will_normalize();
- if (normalizing) {
- export_status->total_normalize_cycles = graph_builder->get_normalize_cycle_count();
- export_status->current_normalize_cycle = 0;
+ post_processing = graph_builder->need_postprocessing ();
+ if (post_processing) {
+ export_status->total_postprocessing_cycles = graph_builder->get_postprocessing_cycle_count();
+ export_status->current_postprocessing_cycle = 0;
} else {
finish_timespan ();
return 0;
@@ -279,16 +287,20 @@ ExportHandler::process_timespan (framecnt_t frames)
}
int
-ExportHandler::process_normalize ()
+ExportHandler::post_process ()
{
- if (graph_builder->process_normalize ()) {
+ if (graph_builder->post_process ()) {
finish_timespan ();
export_status->active_job = ExportStatus::Exporting;
} else {
- export_status->active_job = ExportStatus::Normalizing;
+ if (graph_builder->realtime ()) {
+ export_status->active_job = ExportStatus::Encoding;
+ } else {
+ export_status->active_job = ExportStatus::Normalizing;
+ }
}
- export_status->current_normalize_cycle++;
+ export_status->current_postprocessing_cycle++;
return 0;
}
@@ -321,6 +333,8 @@ ExportHandler::finish_timespan ()
export_cd_marker_file (current_timespan, fmt, filename, MP4Chaps);
}
+ Session::Exported (current_timespan->name(), filename); /* EMIT SIGNAL */
+
/* close file first, otherwise TagLib enounters an ERROR_SHARING_VIOLATION
* The process cannot access the file because it is being used.
* ditto for post-export and upload.
@@ -336,8 +350,9 @@ ExportHandler::finish_timespan ()
}
if (!fmt->command().empty()) {
+ SessionMetadata const & metadata (*SessionMetadata::Metadata());
-#if 0 // would be nicer with C++11 initialiser...
+#if 0 // would be nicer with C++11 initialiser...
std::map<char, std::string> subs {
{ 'f', filename },
{ 'd', Glib::path_get_dirname(filename) + G_DIR_SEPARATOR },
@@ -348,11 +363,38 @@ ExportHandler::finish_timespan ()
export_status->active_job = ExportStatus::Command;
PBD::ScopedConnection command_connection;
std::map<char, std::string> subs;
- subs.insert (std::pair<char, std::string> ('f', filename));
- subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname (filename) + G_DIR_SEPARATOR));
+
+ std::stringstream track_number;
+ track_number << metadata.track_number ();
+ std::stringstream total_tracks;
+ total_tracks << metadata.total_tracks ();
+ std::stringstream year;
+ year << metadata.year ();
+
+ subs.insert (std::pair<char, std::string> ('a', metadata.artist ()));
subs.insert (std::pair<char, std::string> ('b', PBD::basename_nosuffix (filename)));
- subs.insert (std::pair<char, std::string> ('s', session.path ()));
+ subs.insert (std::pair<char, std::string> ('c', metadata.copyright ()));
+ subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname (filename) + G_DIR_SEPARATOR));
+ subs.insert (std::pair<char, std::string> ('f', filename));
+ subs.insert (std::pair<char, std::string> ('l', metadata.lyricist ()));
subs.insert (std::pair<char, std::string> ('n', session.name ()));
+ subs.insert (std::pair<char, std::string> ('s', session.path ()));
+ subs.insert (std::pair<char, std::string> ('o', metadata.conductor ()));
+ subs.insert (std::pair<char, std::string> ('t', metadata.title ()));
+ subs.insert (std::pair<char, std::string> ('z', metadata.organization ()));
+ subs.insert (std::pair<char, std::string> ('A', metadata.album ()));
+ subs.insert (std::pair<char, std::string> ('C', metadata.comment ()));
+ subs.insert (std::pair<char, std::string> ('E', metadata.engineer ()));
+ subs.insert (std::pair<char, std::string> ('G', metadata.genre ()));
+ subs.insert (std::pair<char, std::string> ('L', total_tracks.str ()));
+ subs.insert (std::pair<char, std::string> ('M', metadata.mixer ()));
+ subs.insert (std::pair<char, std::string> ('N', current_timespan->name())); // =?= config_map.begin()->first->name ()
+ subs.insert (std::pair<char, std::string> ('O', metadata.composer ()));
+ subs.insert (std::pair<char, std::string> ('P', metadata.producer ()));
+ subs.insert (std::pair<char, std::string> ('S', metadata.disc_subtitle ()));
+ subs.insert (std::pair<char, std::string> ('T', track_number.str ()));
+ subs.insert (std::pair<char, std::string> ('Y', year.str ()));
+ subs.insert (std::pair<char, std::string> ('Z', metadata.country ()));
ARDOUR::SystemExec *se = new ARDOUR::SystemExec(fmt->command(), subs);
info << "Post-export command line : {" << se->to_s () << "}" << endmsg;
@@ -517,10 +559,10 @@ ExportHandler::export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSp
}
} catch (std::exception& e) {
- error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
+ error << string_compose (_("an error occurred while writing a TOC/CUE file: %1"), e.what()) << endmsg;
::g_unlink (filepath.c_str());
} catch (Glib::Exception& e) {
- error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
+ error << string_compose (_("an error occurred while writing a TOC/CUE file: %1"), e.what()) << endmsg;
::g_unlink (filepath.c_str());
}
}
@@ -808,7 +850,7 @@ ExportHandler::toc_escape_cdtext (const std::string& txt)
char buf[5];
try {
- latin1_txt = Glib::convert (txt, "ISO-8859-1", "UTF-8");
+ latin1_txt = Glib::convert_with_fallback (txt, "ISO-8859-1", "UTF-8", "_");
} catch (Glib::ConvertError& err) {
throw Glib::ConvertError (err.code(), string_compose (_("Cannot convert %1 to Latin-1 text"), txt));
}
diff --git a/libs/ardour/export_multiplication.cc b/libs/ardour/export_multiplication.cc
deleted file mode 100644
index 13b7a4a..0000000
--- a/libs/ardour/export_multiplication.cc
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- Copyright (C) 2008-2012 Paul Davis
- Author: Sakari Bergen
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/* This file is not used at the moment. It includes code related to export a
- * multiplication graph system that can be used together with the ExportMultiplicator
- * class in the gtk2_ardour folder.
- * - Sakari Bergen 6.8.2008 -
- */
-
-void
-ExportProfileManager::register_all_configs ()
-{
- list<TimespanNodePtr>::iterator tsl_it; // timespan list node iterator
- for (tsl_it = graph.timespans.begin(); tsl_it != graph.timespans.end(); ++tsl_it) {
- list<GraphNode *>::const_iterator cc_it; // channel config node iterator
- for (cc_it = (*tsl_it)->get_children().begin(); cc_it != (*tsl_it)->get_children().end(); ++cc_it) {
- list<GraphNode *>::const_iterator f_it; // format node iterator
- for (f_it = (*cc_it)->get_children().begin(); f_it != (*cc_it)->get_children().end(); ++f_it) {
- list<GraphNode *>::const_iterator fn_it; // filename node iterator
- for (fn_it = (*f_it)->get_children().begin(); fn_it != (*f_it)->get_children().end(); ++fn_it) {
- /* Finally loop through each timespan in the timespan list */
-
- TimespanNodePtr ts_node;
- if (!(ts_node = boost::dynamic_pointer_cast<TimespanNode> (*tsl_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
-
- TimespanListPtr ts_list = ts_node->data()->timespans;
- TimespanList::iterator ts_it;
- for (ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) {
-
- TimespanPtr timespan = *ts_it;
-
- ChannelConfigNode * cc_node;
- if (!(cc_node = dynamic_cast<ChannelConfigNode *> (*cc_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- ChannelConfigPtr channel_config = cc_node->data()->config;
-
- FormatNode * f_node;
- if (!(f_node = dynamic_cast<FormatNode *> (*f_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- FormatPtr format = f_node->data()->format;
-
- FilenameNode * fn_node;
- if (!(fn_node = dynamic_cast<FilenameNode *> (*fn_it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- FilenamePtr filename = fn_node->data()->filename;
-
- handler->add_export_config (timespan, channel_config, format, filename);
- }
- }
- }
- }
- }
-}
-
-void
-ExportProfileManager::create_empty_config ()
-{
- TimespanNodePtr timespan = TimespanNode::create (new TimespanState ());
- timespan->data()->timespans->push_back (handler->add_timespan());
-
- ChannelConfigNodePtr channel_config = ChannelConfigNode::create (new ChannelConfigState(handler->add_channel_config()));
-
- FormatNodePtr format;
- load_formats ();
- if (!format_list.empty()) {
- format = FormatNode::create (new FormatState (*format_list.begin ()));
- } else {
- format = FormatNode::create (new FormatState (handler->add_format ()));
- }
-
- FilenameNodePtr filename = FilenameNode::create (new FilenameState (handler->add_filename()));
-
- /* Bring everything together */
-
- timespan->add_child (channel_config.get(), 0);
- channel_config->add_child (format.get(), 0);
- format->add_child (filename.get(), 0);
-
- graph.timespans.push_back (timespan);
- graph.channel_configs.push_back (channel_config);
- graph.formats.push_back (format);
- graph.filenames.push_back (filename);
-}
-
-/*** GraphNode ***/
-
-uint32_t ExportProfileManager::GraphNode::id_counter = 0;
-
-ExportProfileManager::GraphNode::GraphNode ()
-{
- _id = ++id_counter;
-}
-
-ExportProfileManager::GraphNode::~GraphNode ()
-{
- while (!children.empty()) {
- remove_child (children.front());
- }
-
- while (!parents.empty()) {
- parents.front()->remove_child (this);
- }
-}
-
-void
-ExportProfileManager::GraphNode::add_parent (GraphNode * parent)
-{
- for (list<GraphNode *>::iterator it = parents.begin(); it != parents.end(); ++it) {
- if (*it == parent) {
- return;
- }
- }
-
- parents.push_back (parent);
-}
-
-void
-ExportProfileManager::GraphNode::add_child (GraphNode * child, GraphNode * left_sibling)
-{
- for (list<GraphNode *>::iterator it = children.begin(); it != children.end(); ++it) {
- if (*it == child) {
- return;
- }
- }
-
- if (left_sibling) {
- insert_after (children, left_sibling, child);
- } else {
- children.push_back (child);
- }
-
- child->add_parent (this);
-}
-
-bool
-ExportProfileManager::GraphNode::is_ancestor_of (GraphNode const * node) const
-{
- for (list<GraphNode *>::const_iterator it = children.begin(); it != children.end(); ++it) {
- if (*it == node || (*it)->is_ancestor_of (node)) {
- return true;
- }
- }
-
- return false;
-}
-
-bool
-ExportProfileManager::GraphNode::is_descendant_of (GraphNode const * node) const
-{
- for (list<GraphNode *>::const_iterator it = parents.begin(); it != parents.end(); ++it) {
- if (*it == node || (*it)->is_descendant_of (node)) {
- return true;
- }
- }
-
- return false;
-}
-
-void
-ExportProfileManager::GraphNode::select (bool value)
-{
- if (_selected == value) { return; }
-
- _selected = value;
- SelectChanged (value);
-}
-
-void
-ExportProfileManager::GraphNode::remove_parent (GraphNode * parent)
-{
- for (list<GraphNode *>::iterator it = parents.begin(); it != parents.end(); ++it) {
- if (*it == parent) {
- parents.erase (it);
- break;
- }
- }
-}
-
-void
-ExportProfileManager::GraphNode::remove_child (GraphNode * child)
-{
- for (list<GraphNode *>::iterator it = children.begin(); it != children.end(); ++it) {
- if (*it == child) {
- children.erase (it);
- break;
- }
- }
-
- child->remove_parent (this);
-}
-
-void
-ExportProfileManager::split_node (GraphNode * node, float position)
-{
- TimespanNode * ts_node;
- if ((ts_node = dynamic_cast<TimespanNode *> (node))) {
- split_timespan (ts_node->self_ptr(), position);
- return;
- }
-
- ChannelConfigNode * cc_node;
- if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
- split_channel_config (cc_node->self_ptr(), position);
- return;
- }
-
- FormatNode * f_node;
- if ((f_node = dynamic_cast<FormatNode *> (node))) {
- split_format (f_node->self_ptr(), position);
- return;
- }
-
- FilenameNode * fn_node;
- if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
- split_filename (fn_node->self_ptr(), position);
- return;
- }
-}
-
-void
-ExportProfileManager::remove_node (GraphNode * node)
-{
- TimespanNode * ts_node;
- if ((ts_node = dynamic_cast<TimespanNode *> (node))) {
- remove_timespan (ts_node->self_ptr());
- return;
- }
-
- ChannelConfigNode * cc_node;
- if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
- remove_channel_config (cc_node->self_ptr());
- return;
- }
-
- FormatNode * f_node;
- if ((f_node = dynamic_cast<FormatNode *> (node))) {
- remove_format (f_node->self_ptr());
- return;
- }
-
- FilenameNode * fn_node;
- if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
- remove_filename (fn_node->self_ptr());
- return;
- }
-}
-
-void
-ExportProfileManager::purge_graph ()
-{
- for (list<TimespanNodePtr>::iterator it = graph.timespans.begin(); it != graph.timespans.end(); ) {
- list<TimespanNodePtr>::iterator tmp = it;
- ++it;
-
- if ((*tmp)->get_children().empty()) {
- graph.timespans.erase (tmp);
- }
- }
-
- for (list<ChannelConfigNodePtr>::iterator it = graph.channel_configs.begin(); it != graph.channel_configs.end(); ) {
- list<ChannelConfigNodePtr>::iterator tmp = it;
- ++it;
-
- if ((*tmp)->get_parents().empty()) {
- graph.channel_configs.erase (tmp);
- }
- }
-
- for (list<FormatNodePtr>::iterator it = graph.formats.begin(); it != graph.formats.end(); ) {
- list<FormatNodePtr>::iterator tmp = it;
- ++it;
-
- if ((*tmp)->get_parents().empty()) {
- graph.formats.erase (tmp);
- }
- }
-
- for (list<FilenameNodePtr>::iterator it = graph.filenames.begin(); it != graph.filenames.end(); ) {
- list<FilenameNodePtr>::iterator tmp = it;
- ++it;
-
- if ((*tmp)->get_parents().empty()) {
- graph.filenames.erase (tmp);
- }
- }
-
- GraphChanged();
-}
-
-template<typename T>
-void
-ExportProfileManager::insert_after (list<T> & the_list, T const & position, T const & element)
-{
- typename list<T>::iterator it;
- for (it = the_list.begin(); it != the_list.end(); ++it) {
- if (*it == position) {
- the_list.insert (++it, element);
- return;
- }
- }
-
- std::cerr << "invalid position given to ExportProfileManager::insert_after (aborting)" << std::endl;
-
- abort();
-}
-
-template<typename T>
-void
-ExportProfileManager::remove_by_element (list<T> & the_list, T const & element)
-{
- typename list<T>::iterator it;
- for (it = the_list.begin(); it != the_list.end(); ++it) {
- if (*it == element) {
- the_list.erase (it);
- return;
- }
- }
-}
-
-bool
-ExportProfileManager::nodes_have_one_common_child (list<GraphNode *> const & the_list)
-{
- return end_of_common_child_range (the_list, the_list.begin()) == --the_list.end();
-}
-
-list<ExportProfileManager::GraphNode *>::const_iterator
-ExportProfileManager::end_of_common_child_range (list<GraphNode *> const & the_list, list<GraphNode *>::const_iterator beginning)
-{
- if ((*beginning)->get_children().size() != 1) { return beginning; }
- GraphNode * child = (*beginning)->get_children().front();
-
- list<GraphNode *>::const_iterator it = beginning;
- while (it != the_list.end() && (*it)->get_children().size() == 1 && (*it)->get_children().front() == child) {
- ++it;
- }
-
- return --it;
-}
-
-void
-ExportProfileManager::split_node_at_position (GraphNode * old_node, GraphNode * new_node, float position)
-{
- list<GraphNode *> const & node_parents = old_node->get_parents();
- uint32_t split_index = (int) (node_parents.size() * position + 0.5);
- split_index = std::max ((uint32_t) 1, std::min (split_index, node_parents.size() - 1));
-
- list<GraphNode *>::const_iterator it = node_parents.begin();
- for (uint32_t index = 1; it != node_parents.end(); ++index) {
- if (index > split_index) {
- list<GraphNode *>::const_iterator tmp = it++;
- (*tmp)->add_child (new_node, old_node);
- (*tmp)->remove_child (old_node);
- } else {
- ++it;
- }
- }
-}
-
-void
-ExportProfileManager::split_timespan (TimespanNodePtr node, float)
-{
- TimespanNodePtr new_timespan = duplicate_timespan_node (node);
- insert_after (graph.timespans, node, new_timespan);
-
- /* Note: Since a timespan selector allows all combinations of ranges
- * there is no reason for a channel configuration to have two parents
- */
-
- duplicate_timespan_children (node->self_ptr(), new_timespan);
-
- GraphChanged();
-}
-
-void
-ExportProfileManager::split_channel_config (ChannelConfigNodePtr node, float)
-{
- ChannelConfigNodePtr new_config = duplicate_channel_config_node (node);
- insert_after (graph.channel_configs, node, new_config);
-
- /* Channel configs have only one parent, see above! */
- node->get_parents().front()->add_child (new_config.get(), node.get());
-
- if (node->get_children().size() == 1) {
- new_config->add_child (node->first_child(), 0);
- } else {
- duplicate_channel_config_children (node, new_config);
- }
-
- GraphChanged();
-}
-
-void
-ExportProfileManager::split_format (FormatNodePtr node, float position)
-{
- FormatNodePtr new_format = duplicate_format_node (node);
- insert_after (graph.formats, node, new_format);
-
- list<GraphNode *> const & node_parents = node->get_parents();
- if (node_parents.size() == 1) {
- node_parents.front()->add_child (new_format.get(), 0);
- } else {
- node->sort_parents (graph.channel_configs);
- split_node_at_position (node.get(), new_format.get(), position);
- }
-
- if (node->get_children().size() == 1) {
- new_format->add_child (node->first_child(), 0);
- } else {
- duplicate_format_children (node, new_format);
- }
-
- GraphChanged();
-}
-
-void
-ExportProfileManager::split_filename (FilenameNodePtr node, float position)
-{
- FilenameNodePtr new_filename = duplicate_filename_node (node);
- insert_after (graph.filenames, node, new_filename);
-
- list<GraphNode *> const & node_parents = node->get_parents();
-
- if (node_parents.size() == 1) {
- node_parents.front()->add_child (new_filename.get(), 0);
- } else {
- node->sort_parents (graph.formats);
- split_node_at_position (node.get(), new_filename.get(), position);
- }
-
- GraphChanged();
-}
-
-void
-ExportProfileManager::duplicate_timespan_children (TimespanNodePtr source, TimespanNodePtr target, GraphNode * insertion_point)
-{
- list<GraphNode *> const & source_children = source->get_children();
- bool one_grandchild = nodes_have_one_common_child (source_children);
- GraphNode * child_insertion_point = 0;
-
- ChannelConfigNodePtr node_insertion_point;
- ChannelConfigNode * node_insertion_ptr;
- if (!insertion_point) { insertion_point = source->last_child(); }
- if (!(node_insertion_ptr = dynamic_cast<ChannelConfigNode *> (insertion_point))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- node_insertion_point = node_insertion_ptr->self_ptr();
-
- /* Keep track of common children */
-
- list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
- list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
- GraphNode * common_child = 0;
-
- for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
- /* Duplicate node */
-
- ChannelConfigNode * node;
- ChannelConfigNodePtr new_node;
-
- if (!(node = dynamic_cast<ChannelConfigNode *> (*it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
-
- new_node = duplicate_channel_config_node (node->self_ptr());
-
- /* Insert in gaph's list and update insertion position */
-
- insert_after (graph.channel_configs, node_insertion_point, new_node);
- node_insertion_point = new_node;
-
- /* Handle children */
-
- target->add_child (new_node.get(), child_insertion_point);
- child_insertion_point = new_node.get();
-
- if (one_grandchild) {
- new_node->add_child (node->first_child(), 0);
- } else {
- list<GraphNode *>::const_iterator past_end = common_children_end;
- if (it == ++past_end) { // At end => start new range
- common_children_begin = it;
- common_children_end = end_of_common_child_range (source_children, it);
- }
-
- if (it == common_children_begin) { // At beginning => do duplication
- GraphNode * grand_child_ins_pt = common_child;
- if (!grand_child_ins_pt) {
- grand_child_ins_pt = source->last_child()->last_child();
- }
- duplicate_channel_config_children (node->self_ptr(), new_node, grand_child_ins_pt);
- common_child = new_node->first_child();
- } else { // Somewhere in between end and beginning => share child
- new_node->add_child (common_child, 0);
- }
- }
- }
-}
-
-void
-ExportProfileManager::duplicate_channel_config_children (ChannelConfigNodePtr source, ChannelConfigNodePtr target, GraphNode * insertion_point)
-{
- list<GraphNode *> const & source_children = source->get_children();
- bool one_grandchild = nodes_have_one_common_child (source_children);
- GraphNode * child_insertion_point = 0;
-
- FormatNodePtr node_insertion_point;
- FormatNode * node_insertion_ptr;
- if (!insertion_point) { insertion_point = source->last_child(); }
- if (!(node_insertion_ptr = dynamic_cast<FormatNode *> (insertion_point))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- node_insertion_point = node_insertion_ptr->self_ptr();
-
- /* Keep track of common children */
-
- list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
- list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
- GraphNode * common_child = 0;
-
- for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
- /* Duplicate node */
-
- FormatNode * node;
- FormatNodePtr new_node;
-
- if (!(node = dynamic_cast<FormatNode *> (*it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
-
- new_node = duplicate_format_node (node->self_ptr());
-
- /* Insert in gaph's list and update insertion position */
-
- insert_after (graph.formats, node_insertion_point, new_node);
- node_insertion_point = new_node;
-
- /* Handle children */
-
- target->add_child (new_node.get(), child_insertion_point);
- child_insertion_point = new_node.get();
-
- if (one_grandchild) {
- new_node->add_child (node->first_child(), 0);
- } else {
- list<GraphNode *>::const_iterator past_end = common_children_end;
- if (it == ++past_end) { // At end => start new range
- common_children_begin = it;
- common_children_end = end_of_common_child_range (source_children, it);
- }
-
- if (it == common_children_begin) { // At beginning => do duplication
- GraphNode * grand_child_ins_pt = common_child;
- if (!grand_child_ins_pt) {
- grand_child_ins_pt = source->get_parents().back()->last_child()->last_child()->last_child();
- }
- duplicate_format_children (node->self_ptr(), new_node, grand_child_ins_pt);
- common_child = new_node->first_child();
- } else { // Somewhere in between end and beginning => share child
- new_node->add_child (common_child, 0);
- }
- }
- }
-}
-
-void
-ExportProfileManager::duplicate_format_children (FormatNodePtr source, FormatNodePtr target, GraphNode * insertion_point)
-{
- GraphNode * child_insertion_point = 0;
-
- FilenameNodePtr node_insertion_point;
- FilenameNode * node_insertion_ptr;
- if (!insertion_point) { insertion_point = source->last_child(); }
- if (!(node_insertion_ptr = dynamic_cast<FilenameNode *> (insertion_point))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
- node_insertion_point = node_insertion_ptr->self_ptr();
-
- for (list<GraphNode *>::const_iterator it = source->get_children().begin(); it != source->get_children().end(); ++it) {
- /* Duplicate node */
-
- FilenameNode * node;
- FilenameNodePtr new_node;
-
- if (!(node = dynamic_cast<FilenameNode *> (*it))) {
- throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
- }
-
- new_node = duplicate_filename_node (node->self_ptr());
-
- /* Insert in gaph's list and update insertion position */
-
- insert_after (graph.filenames, node_insertion_point, new_node);
- node_insertion_point = new_node;
-
- /* Handle children */
-
- target->add_child (new_node.get(), child_insertion_point);
- child_insertion_point = new_node.get();
- }
-}
-
-ExportProfileManager::TimespanNodePtr
-ExportProfileManager::duplicate_timespan_node (TimespanNodePtr node)
-{
- TimespanStatePtr state = node->data();
- TimespanStatePtr new_state (new TimespanState ());
- TimespanNodePtr new_node = TimespanNode::create (new_state);
-
- for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) {
- new_state->timespans->push_back (handler->add_timespan_copy (*it));
- }
-
- new_state->time_format = state->time_format;
- new_state->marker_format = state->marker_format;
-
- return new_node;
-}
-
-ExportProfileManager::ChannelConfigNodePtr
-ExportProfileManager::duplicate_channel_config_node (ChannelConfigNodePtr node)
-{
- ChannelConfigStatePtr state = node->data();
- ChannelConfigStatePtr new_state (new ChannelConfigState (handler->add_channel_config_copy (state->config)));
- ChannelConfigNodePtr new_node = ChannelConfigNode::create (new_state);
-
- return new_node;
-}
-
-ExportProfileManager::FormatNodePtr
-ExportProfileManager::duplicate_format_node (FormatNodePtr node)
-{
- FormatStatePtr state = node->data();
- FormatStatePtr new_state (new FormatState (handler->add_format_copy (state->format)));
- FormatNodePtr new_node = FormatNode::create (new_state);
-
- return new_node;
-}
-
-ExportProfileManager::FilenameNodePtr
-ExportProfileManager::duplicate_filename_node (FilenameNodePtr node)
-{
- FilenameStatePtr state = node->data();
- FilenameStatePtr new_state (new FilenameState (handler->add_filename_copy (state->filename)));
- FilenameNodePtr new_node = FilenameNode::create (new_state);
-
- return new_node;
-}
-
-void
-ExportProfileManager::remove_timespan (TimespanNodePtr node)
-{
- remove_by_element (graph.timespans, node);
- purge_graph ();
-}
-
-void
-ExportProfileManager::remove_channel_config (ChannelConfigNodePtr node)
-{
- remove_by_element (graph.channel_configs, node);
- purge_graph ();
-}
-
-void
-ExportProfileManager::remove_format (FormatNodePtr node)
-{
- remove_by_element (graph.formats, node);
- purge_graph ();
-}
-
-void
-ExportProfileManager::remove_filename (FilenameNodePtr node)
-{
- remove_by_element (graph.filenames, node);
- purge_graph ();
-}
diff --git a/libs/ardour/export_preset.cc b/libs/ardour/export_preset.cc
index c6bae09..dec4c4b 100644
--- a/libs/ardour/export_preset.cc
+++ b/libs/ardour/export_preset.cc
@@ -30,7 +30,7 @@ ExportPreset::ExportPreset (string filename, Session & s) :
{
XMLNode * root;
if ((root = global.root())) {
- XMLProperty * prop;
+ XMLProperty const * prop;
if ((prop = root->property ("id"))) {
set_id (prop->value());
}
@@ -124,7 +124,7 @@ ExportPreset::get_instant_xml () const
if ((instant_xml = session.instant_xml ("ExportPresets"))) {
XMLNodeList children = instant_xml->children ("ExportPreset");
for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) {
- XMLProperty * prop;
+ XMLProperty const * prop;
if ((prop = (*it)->property ("id")) && _id == PBD::UUID(prop->value())) {
return *it;
}
diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc
index 932b990..be9cdd6 100644
--- a/libs/ardour/export_profile_manager.cc
+++ b/libs/ardour/export_profile_manager.cc
@@ -48,7 +48,7 @@
#include "ardour/session.h"
#include "ardour/broadcast_info.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Glib;
@@ -58,7 +58,7 @@ namespace ARDOUR
{
ExportProfileManager::ExportProfileManager (Session & s, ExportType type)
- : type(type)
+ : _type(type)
, handler (s.get_export_handler())
, session (s)
@@ -162,7 +162,7 @@ ExportProfileManager::prepare_for_export ()
}
// ...and each channel config
- filename->include_channel_config = (type == StemExport) ||
+ filename->include_channel_config = (_type == StemExport) ||
(channel_configs.size() > 1);
for(ChannelConfigStateList::iterator cc_it = channel_configs.begin(); cc_it != channel_configs.end(); ++cc_it) {
handler->add_export_config (*ts_it, (*cc_it)->config, (*format_it)->format, filename, b);
@@ -180,9 +180,14 @@ ExportProfileManager::load_preset (ExportPresetPtr preset)
if (!preset) { return false; }
XMLNode const * state;
+ /* local state is saved in instant.xml and contains timespan
+ * and channel config for per session.
+ * It may not be present for a given preset/session combination
+ * and is never preset for system-wide presets, but that's OK.
+ */
if ((state = preset->get_local_state())) {
set_local_state (*state);
- } else { ok = false; }
+ }
if ((state = preset->get_global_state())) {
if (!set_global_state (*state)) {
@@ -701,7 +706,7 @@ ExportProfileManager::init_formats (XMLNodeList nodes)
ExportProfileManager::FormatStatePtr
ExportProfileManager::deserialize_format (XMLNode & root)
{
- XMLProperty * prop;
+ XMLProperty const * prop;
PBD::UUID id;
if ((prop = root.property ("id"))) {
diff --git a/libs/ardour/export_status.cc b/libs/ardour/export_status.cc
index 1700739..808d6f1 100644
--- a/libs/ardour/export_status.cc
+++ b/libs/ardour/export_status.cc
@@ -50,8 +50,8 @@ ExportStatus::init ()
total_frames_current_timespan = 0;
processed_frames_current_timespan = 0;
- total_normalize_cycles = 0;
- current_normalize_cycle = 0;
+ total_postprocessing_cycles = 0;
+ current_postprocessing_cycle = 0;
result_map.clear();
}
diff --git a/libs/ardour/export_timespan.cc b/libs/ardour/export_timespan.cc
index 3b20213..f8a0676 100644
--- a/libs/ardour/export_timespan.cc
+++ b/libs/ardour/export_timespan.cc
@@ -28,7 +28,8 @@ ExportTimespan::ExportTimespan (ExportStatusPtr status, framecnt_t frame_rate) :
start_frame (0),
end_frame (0),
position (0),
- frame_rate (frame_rate)
+ frame_rate (frame_rate),
+ _realtime (false)
{
}
diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc
index 3ec561d..c05a0a4 100644
--- a/libs/ardour/file_source.cc
+++ b/libs/ardour/file_source.cc
@@ -44,7 +44,7 @@
#include "ardour/source.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -140,7 +140,7 @@ FileSource::init (const string& pathstr, bool must_exist)
int
FileSource::set_state (const XMLNode& node, int /*version*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property (X_("channel"))) != 0) {
_channel = atoi (prop->value());
diff --git a/libs/ardour/filename_extensions.cc b/libs/ardour/filename_extensions.cc
index fa6ca07..c575f12 100644
--- a/libs/ardour/filename_extensions.cc
+++ b/libs/ardour/filename_extensions.cc
@@ -19,7 +19,7 @@
#include "ardour/filename_extensions.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc
index fcdf42c..47b9994 100644
--- a/libs/ardour/filesystem_paths.cc
+++ b/libs/ardour/filesystem_paths.cc
@@ -29,7 +29,7 @@
#include "ardour/directory_names.h"
#include "ardour/filesystem_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#ifdef PLATFORM_WINDOWS
#include "shlobj.h"
diff --git a/libs/ardour/filter.cc b/libs/ardour/filter.cc
index 36a74da..6ebf231 100644
--- a/libs/ardour/filter.cc
+++ b/libs/ardour/filter.cc
@@ -32,7 +32,7 @@
#include "ardour/smf_source.h"
#include "ardour/source_factory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/find_session.cc b/libs/ardour/find_session.cc
index c470ef7..af39a47 100644
--- a/libs/ardour/find_session.cc
+++ b/libs/ardour/find_session.cc
@@ -35,7 +35,7 @@
#include "ardour/utils.h"
#include "ardour/session_utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/ardour/fixed_delay.cc b/libs/ardour/fixed_delay.cc
new file mode 100644
index 0000000..f4c8b98
--- /dev/null
+++ b/libs/ardour/fixed_delay.cc
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "ardour/audio_buffer.h"
+#include "ardour/buffer_set.h"
+#include "ardour/fixed_delay.h"
+#include "ardour/midi_buffer.h"
+
+using namespace ARDOUR;
+
+FixedDelay::FixedDelay ()
+ : _max_delay (0)
+ , _buf_size (0)
+ , _delay (0)
+{
+ for (size_t i = 0; i < DataType::num_types; ++i) {
+ _buffers.push_back (BufferVec ());
+ }
+ _count.reset ();
+}
+
+FixedDelay::~FixedDelay ()
+{
+ clear ();
+}
+
+void
+FixedDelay::ensure_buffers (DataType type, size_t num_buffers, size_t buffer_capacity)
+{
+ assert (type != DataType::NIL);
+ assert (type < _buffers.size ());
+ if (num_buffers == 0) {
+ return;
+ }
+ BufferVec& bufs = _buffers[type];
+ if (bufs.size () < num_buffers || (bufs.size () > 0 && bufs[0]->buf->capacity () < buffer_capacity)) {
+ for (BufferVec::iterator i = bufs.begin (); i != bufs.end (); ++i) {
+ delete (*i);
+ }
+ bufs.clear ();
+ for (size_t i = 0; i < num_buffers; ++i) {
+ bufs.push_back (new DelayBuffer (type, buffer_capacity));
+ }
+ _count.set (type, num_buffers);
+ }
+}
+
+void
+FixedDelay::clear ()
+{
+ for (std::vector<BufferVec>::iterator i = _buffers.begin (); i != _buffers.end (); ++i) {
+ for (BufferVec::iterator j = (*i).begin (); j != (*i).end (); ++j) {
+ delete *j;
+ }
+ (*i).clear ();
+ }
+ _buffers.clear ();
+ _count.reset ();
+}
+
+void
+FixedDelay::flush()
+{
+ for (std::vector<BufferVec>::iterator i = _buffers.begin (); i != _buffers.end (); ++i) {
+ for (BufferVec::iterator j = (*i).begin (); j != (*i).end (); ++j) {
+ (*j)->buf->silence (_buf_size);
+ }
+ }
+}
+
+void
+FixedDelay::configure (const ChanCount& count, framecnt_t max_delay, bool shrink)
+{
+ if (shrink) {
+ if (max_delay == _max_delay && count == _count) {
+ return;
+ }
+ _max_delay = max_delay;
+ } else if (max_delay <= _max_delay || count <= _count) {
+ return;
+ _max_delay = std::max (_max_delay, max_delay);
+ }
+
+ // max possible (with all engines and during export)
+ static const framecnt_t max_block_length = 8192;
+ _buf_size = _max_delay + max_block_length;
+ for (DataType::iterator i = DataType::begin (); i != DataType::end (); ++i) {
+ ensure_buffers (*i, count.get (*i), _buf_size);
+ }
+}
+
+void
+FixedDelay::set (const ChanCount& count, framecnt_t delay)
+{
+ configure (count, delay, false);
+ if (_delay != delay) {
+ flush ();
+ }
+ _delay = delay;
+}
+
+void
+FixedDelay::delay (
+ ARDOUR::DataType dt, uint32_t id,
+ Buffer& out, const Buffer& in,
+ pframes_t n_frames,
+ framecnt_t dst_offset, framecnt_t src_offset)
+{
+ if (_delay == 0) {
+ out.read_from (in, n_frames, dst_offset, src_offset);
+ return;
+ }
+
+ assert (dt < _buffers.size ());
+ assert (id < _buffers[dt].size ());
+ DelayBuffer *db = _buffers[dt][id];
+
+ if (db->pos + n_frames > _buf_size) {
+ uint32_t w0 = _buf_size - db->pos;
+ uint32_t w1 = db->pos + n_frames - _buf_size;
+ db->buf->read_from (in, w0, db->pos, src_offset);
+ db->buf->read_from (in, w1, 0, src_offset + w0);
+ } else {
+ db->buf->read_from (in, n_frames, db->pos, src_offset);
+ }
+
+ uint32_t rp = (db->pos + _buf_size - _delay) % _buf_size;
+
+ if (rp + n_frames > _buf_size) {
+ uint32_t r0 = _buf_size - rp;
+ uint32_t r1 = rp + n_frames - _buf_size;
+ out.read_from (*db->buf, r0, dst_offset, rp);
+ out.read_from (*db->buf, r1, dst_offset + r0, 0);
+ } else {
+ out.read_from (*db->buf, n_frames, dst_offset, rp);
+ }
+
+ db->pos = (db->pos + n_frames) % _buf_size;
+}
diff --git a/libs/ardour/gain_control.cc b/libs/ardour/gain_control.cc
index 867edaf..8910c9a 100644
--- a/libs/ardour/gain_control.cc
+++ b/libs/ardour/gain_control.cc
@@ -16,19 +16,26 @@
675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <cmath>
+
+#include "pbd/convert.h"
+#include "pbd/strsplit.h"
+
#include "ardour/dB.h"
#include "ardour/gain_control.h"
#include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
GainControl::GainControl (Session& session, const Evoral::Parameter ¶m, boost::shared_ptr<AutomationList> al)
- : AutomationControl (session, param, ParameterDescriptor(param),
- al ? al : boost::shared_ptr<AutomationList> (new AutomationList (param)),
- param.type() == GainAutomation ? X_("gaincontrol") : X_("trimcontrol")) {
+ : SlavableAutomationControl (session, param, ParameterDescriptor(param),
+ al ? al : boost::shared_ptr<AutomationList> (new AutomationList (param)),
+ param.type() == GainAutomation ? X_("gaincontrol") : X_("trimcontrol")) {
alist()->reset_default (1.0);
@@ -36,28 +43,6 @@ GainControl::GainControl (Session& session, const Evoral::Parameter ¶m, boos
range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db;
}
-void
-GainControl::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
- if (writable()) {
- _set_value (val, group_override);
- }
-}
-
-void
-GainControl::set_value_unchecked (double val)
-{
- /* used only automation playback */
- _set_value (val, Controllable::NoGroup);
-}
-
-void
-GainControl::_set_value (double val, Controllable::GroupControlDisposition group_override)
-{
- AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower), group_override);
- _session.set_dirty ();
-}
-
double
GainControl::internal_to_interface (double v) const
{
@@ -97,3 +82,102 @@ GainControl::get_user_string () const
return std::string(theBuf);
}
+void
+GainControl::inc_gain (gain_t factor)
+{
+ /* To be used ONLY when doing group-relative gain adjustment, from
+ * ControlGroup::set_group_values().
+ */
+
+ const float desired_gain = user_double();
+
+ if (fabsf (desired_gain) < GAIN_COEFF_SMALL) {
+ // really?! what's the idea here?
+ actually_set_value (0.000001f + (0.000001f * factor), Controllable::ForGroup);
+ } else {
+ actually_set_value (desired_gain + (desired_gain * factor), Controllable::ForGroup);
+ }
+}
+
+void
+GainControl::recompute_masters_ratios (double val)
+{
+ /* Master WRITE lock must be held */
+
+ /* V' is the new gain value for this
+
+ Mv(n) is the return value of ::get_value() for the n-th master
+ Mr(n) is the return value of ::ratio() for the n-th master record
+
+ the slave should return V' on the next call to ::get_value().
+
+ but the value is determined by the masters, so we know:
+
+ V' = (Mv(1) * Mr(1)) * (Mv(2) * Mr(2)) * ... * (Mv(n) * Mr(n))
+
+ hence:
+
+ Mr(1) * Mr(2) * ... * (Mr(n) = V' / (Mv(1) * Mv(2) * ... * Mv(n))
+
+ if we make all ratios equal (i.e. each master contributes the same
+ fraction of its own gain level to make the final slave gain), then we
+ have:
+
+ pow (Mr(n), n) = V' / (Mv(1) * Mv(2) * ... * Mv(n))
+
+ which gives
+
+ Mr(n) = pow ((V' / (Mv(1) * Mv(2) * ... * Mv(n))), 1/n)
+
+ Mr(n) is the new ratio number for the slaves
+ */
+
+
+ const double nmasters = _masters.size();
+ double masters_total_gain_coefficient = 1.0;
+
+ for (Masters::iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+ masters_total_gain_coefficient *= mr->second.master()->get_value();
+ }
+
+ const double new_universal_ratio = pow ((val / masters_total_gain_coefficient), (1.0/nmasters));
+
+ for (Masters::iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+ mr->second.reset_ratio (new_universal_ratio);
+ }
+}
+
+XMLNode&
+GainControl::get_state ()
+{
+ XMLNode& node (AutomationControl::get_state());
+
+#if 0
+ /* store VCA master IDs */
+
+ string str;
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+ if (!str.empty()) {
+ str += ',';
+ }
+ str += PBD::to_string (mr->first, std::dec);
+ }
+ }
+
+ if (!str.empty()) {
+ node.add_property (X_("masters"), str);
+ }
+#endif
+
+ return node;
+}
+
+int
+GainControl::set_state (XMLNode const& node, int version)
+{
+ return AutomationControl::set_state (node, version);
+}
+
diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc
index 9f4a139..974247a 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -80,7 +80,6 @@
#include "pbd/fpu.h"
#include "pbd/file_utils.h"
#include "pbd/enumwriter.h"
-#include "pbd/basename.h"
#include "midi++/port.h"
#include "midi++/mmc.h"
@@ -103,6 +102,7 @@
#include "ardour/operations.h"
#include "ardour/panner_manager.h"
#include "ardour/plugin_manager.h"
+#include "ardour/presentation_info.h"
#include "ardour/process_thread.h"
#include "ardour/profile.h"
#include "ardour/rc_configuration.h"
@@ -116,10 +116,10 @@
#include "audiographer/routines.h"
#if defined (__APPLE__)
- #include <Carbon/Carbon.h> // For Gestalt
+#include <CoreFoundation/CoreFoundation.h>
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
ARDOUR::RCConfiguration* ARDOUR::Config = 0;
ARDOUR::RuntimeProfile* ARDOUR::Profile = 0;
@@ -206,12 +206,8 @@ setup_hardware_optimization (bool try_optimization)
}
#elif defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS)
- SInt32 sysVersion = 0;
- if (noErr != Gestalt(gestaltSystemVersion, &sysVersion))
- sysVersion = 0;
-
- if (sysVersion >= 0x00001040) { // Tiger at least
+ if (floor (kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_4) { /* at least Tiger */
compute_peak = veclib_compute_peak;
find_peaks = veclib_find_peaks;
apply_gain_to_buffer = veclib_apply_gain_to_buffer;
@@ -305,7 +301,7 @@ copy_configuration_files (string const & old_dir, string const & new_dir, int ol
return -1;
}
- if (old_version == 3) {
+ if (old_version >= 3) {
old_name = Glib::build_filename (old_dir, X_("recent"));
new_name = Glib::build_filename (new_dir, X_("recent"));
@@ -443,6 +439,7 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
RouteGroup::make_property_quarks ();
Playlist::make_property_quarks ();
AudioPlaylist::make_property_quarks ();
+ PresentationInfo::make_property_quarks ();
/* this is a useful ready to use PropertyChange that many
things need to check. This avoids having to compose
@@ -608,31 +605,6 @@ ARDOUR::cleanup ()
return;
}
-void
-ARDOUR::find_bindings_files (map<string,string>& files)
-{
- vector<std::string> found;
- Searchpath spath = ardour_config_search_path();
-
- if (getenv ("ARDOUR_SAE")) {
- find_files_matching_pattern (found, spath, "*SAE-*.bindings");
- } else {
- find_files_matching_pattern (found, spath, "*.bindings");
- }
-
- if (found.empty()) {
- return;
- }
-
- for (vector<std::string>::iterator x = found.begin(); x != found.end(); ++x) {
- std::string path(*x);
- pair<string,string> namepath;
- namepath.second = path;
- namepath.first = PBD::basename_nosuffix (path);
- files.insert (namepath);
- }
-}
-
bool
ARDOUR::no_auto_connect()
{
diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc
index ff4f860..563c882 100644
--- a/libs/ardour/graph.cc
+++ b/libs/ardour/graph.cc
@@ -32,7 +32,7 @@
#include "ardour/process_thread.h"
#include "ardour/audioengine.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -412,15 +412,16 @@ Graph::helper_thread()
ProcessThread* pt = new ProcessThread ();
resume_rt_malloc_checks ();
- pt->get_buffers();
+ pt->get_buffers();
- while(1) {
- if (run_one()) {
- break;
- }
- }
+ while(1) {
+ if (run_one()) {
+ break;
+ }
+ }
- pt->drop_buffers();
+ pt->drop_buffers();
+ delete pt;
}
/** Here's the main graph thread */
@@ -431,35 +432,35 @@ Graph::main_thread()
ProcessThread* pt = new ProcessThread ();
resume_rt_malloc_checks ();
- pt->get_buffers();
+ pt->get_buffers();
- again:
- _callback_start_sem.wait ();
+again:
+ _callback_start_sem.wait ();
DEBUG_TRACE(DEBUG::ProcessThreads, "main thread is awake\n");
- if (!_threads_active) {
- return;
- }
+ if (!_threads_active) {
+ return;
+ }
prep ();
- if (_graph_empty && _threads_active) {
- _callback_done_sem.signal ();
- DEBUG_TRACE(DEBUG::ProcessThreads, "main thread sees graph done, goes back to sleep\n");
- goto again;
- }
+ if (_graph_empty && _threads_active) {
+ _callback_done_sem.signal ();
+ DEBUG_TRACE(DEBUG::ProcessThreads, "main thread sees graph done, goes back to sleep\n");
+ goto again;
+ }
/* This loop will run forever */
- while (1) {
+ while (1) {
DEBUG_TRACE(DEBUG::ProcessThreads, "main thread runs one graph node\n");
- if (run_one()) {
- break;
- }
- }
+ if (run_one()) {
+ break;
+ }
+ }
- pt->drop_buffers();
- delete (pt);
+ pt->drop_buffers();
+ delete (pt);
}
void
diff --git a/libs/ardour/i18n.h b/libs/ardour/i18n.h
deleted file mode 100644
index b04c96d..0000000
--- a/libs/ardour/i18n.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text) dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-/** Use this to translate strings that have different meanings in different places.
- * Text should be of the form Context|Message.
- */
-#define S_(Text) PBD::sgettext (PACKAGE, Text)
-
-/** Use this to translate strings with plural forms
- */
-#define P_(Singular,Plural,HowMany) dngettext (PACKAGE, (Singular), (Plural), (HowMany))
-
-#endif // __i18n_h__
diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc
index 0656cdc..b2b9403 100644
--- a/libs/ardour/import.cc
+++ b/libs/ardour/import.cc
@@ -67,7 +67,7 @@
#include "ardour/caimportable.h"
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -265,14 +265,14 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
uint32_t read_count = 0;
while (!status.cancel) {
- framecnt_t const nread = source->read (data.get(), nframes);
+ framecnt_t const nread = source->read (data.get(), nframes * channels);
if (nread == 0) {
break;
}
- peak = compute_peak (data.get(), nread, peak);
+ peak = compute_peak (data.get(), nread * channels, peak);
- read_count += nread;
+ read_count += nread / channels;
status.progress = 0.5 * read_count / (source->ratio() * source->length() * channels);
}
@@ -294,7 +294,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
uint32_t x;
uint32_t chn;
- if ((nread = source->read (data.get(), nframes)) == 0) {
+ if ((nread = source->read (data.get(), nframes * channels)) == 0) {
#ifdef PLATFORM_WINDOWS
/* Flush the data once we've finished importing the file. Windows can */
/* cache the data for very long periods of time (perhaps not writing */
@@ -459,7 +459,7 @@ Session::import_files (ImportStatus& status)
status.sources.clear ();
- for (vector<string>::iterator p = status.paths.begin();
+ for (vector<string>::const_iterator p = status.paths.begin();
p != status.paths.end() && !status.cancel;
++p)
{
diff --git a/libs/ardour/instrument_info.cc b/libs/ardour/instrument_info.cc
index c30994b..b8c026b 100644
--- a/libs/ardour/instrument_info.cc
+++ b/libs/ardour/instrument_info.cc
@@ -29,7 +29,7 @@
#include "ardour/plugin_insert.h"
#include "ardour/rc_configuration.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace MIDI::Name;
@@ -82,6 +82,18 @@ InstrumentInfo::get_instrument_name () const
string
InstrumentInfo::get_patch_name (uint16_t bank, uint8_t program, uint8_t channel) const
{
+ return get_patch_name (bank, program, channel, true);
+}
+
+string
+InstrumentInfo::get_patch_name_without (uint16_t bank, uint8_t program, uint8_t channel) const
+{
+ return get_patch_name (bank, program, channel, false);
+}
+
+string
+InstrumentInfo::get_patch_name (uint16_t bank, uint8_t program, uint8_t channel, bool with_extra) const
+{
boost::shared_ptr<Processor> p = internal_instrument.lock();
if (p) {
return get_plugin_patch_name (p, bank, program, channel);
@@ -100,7 +112,11 @@ InstrumentInfo::get_patch_name (uint16_t bank, uint8_t program, uint8_t channel)
#define MIDI_BP_ZERO ((Config->get_first_midi_bank_is_zero())?0:1)
- return string_compose ("prg %1 bnk %2",program + MIDI_BP_ZERO , bank + MIDI_BP_ZERO);
+ if (with_extra) {
+ return string_compose ("prg %1 bnk %2",program + MIDI_BP_ZERO , bank + MIDI_BP_ZERO);
+ } else {
+ return string_compose ("%1", program + MIDI_BP_ZERO);
+ }
}
}
diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc
index 4947231..e42c067 100644
--- a/libs/ardour/internal_return.cc
+++ b/libs/ardour/internal_return.cc
@@ -32,7 +32,7 @@ InternalReturn::InternalReturn (Session& s)
}
void
-InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
{
if (!_active && !_pending_active) {
return;
diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc
index 8870535..1746b00 100644
--- a/libs/ardour/internal_send.cc
+++ b/libs/ardour/internal_send.cc
@@ -30,7 +30,7 @@
#include "ardour/session.h"
#include "ardour/audioengine.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR { class MuteMaster; class Pannable; }
@@ -133,7 +133,7 @@ InternalSend::send_to_going_away ()
}
void
-InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
{
if ((!_active && !_pending_active) || !_send_to) {
_meter->reset ();
@@ -144,7 +144,30 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
// in-place, which a send must never do.
if (_panshell && !_panshell->bypassed() && role() != Listen) {
- _panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
+ if (mixbufs.count ().n_audio () > 0) {
+ _panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
+ }
+
+ /* non-audio data will not have been copied by the panner, do it now
+ * if there are more buffers available than send buffers, ignore them,
+ * if there are less, copy the last as IO::copy_to_output does. */
+
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ if (*t != DataType::AUDIO) {
+ BufferSet::iterator o = mixbufs.begin(*t);
+ BufferSet::iterator i = bufs.begin(*t);
+
+ while (i != bufs.end(*t) && o != mixbufs.end(*t)) {
+ o->read_from (*i, nframes);
+ ++i;
+ ++o;
+ }
+ while (o != mixbufs.end(*t)) {
+ o->silence(nframes, 0);
+ ++o;
+ }
+ }
+ }
} else {
if (role() == Listen) {
/* We're going to the monitor bus, so discard MIDI data */
@@ -213,9 +236,9 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
_amp->set_gain_automation_buffer (_session.send_gain_automation_buffer ());
_amp->setup_gain_automation (start_frame, end_frame, nframes);
- _amp->run (mixbufs, start_frame, end_frame, nframes, true);
+ _amp->run (mixbufs, start_frame, end_frame, speed, nframes, true);
- _delayline->run (mixbufs, start_frame, end_frame, nframes, true);
+ _delayline->run (mixbufs, start_frame, end_frame, speed, nframes, true);
/* consider metering */
@@ -223,7 +246,7 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
if (_amp->gain_control()->get_value() == GAIN_COEFF_ZERO) {
_meter->reset();
} else {
- _meter->run (mixbufs, start_frame, end_frame, nframes, true);
+ _meter->run (mixbufs, start_frame, end_frame, speed, nframes, true);
}
}
@@ -274,7 +297,7 @@ InternalSend::get_state()
int
InternalSend::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
init_gain ();
diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc
index 9fa6c70..f535467 100644
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -43,7 +43,7 @@
#include "ardour/session.h"
#include "ardour/user_bundle.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#define BLOCK_PROCESS_CALLBACK() Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock())
@@ -99,6 +99,9 @@ IO::~IO ()
void
IO::disconnect_check (boost::shared_ptr<Port> a, boost::shared_ptr<Port> b)
{
+ if (_session.state_of_the_state () & Session::Deletion) {
+ return;
+ }
/* this could be called from within our own ::disconnect() method(s)
or from somewhere that operates directly on a port. so, we don't
know for sure if we can take this lock or not. if we fail,
@@ -368,6 +371,7 @@ IO::add_port (string destination, void* src, DataType type)
}
}
+ apply_pretty_name ();
setup_bundle ();
_session.set_dirty ();
@@ -401,6 +405,7 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed)
#endif
boost::shared_ptr<Port> port;
+ vector<boost::shared_ptr<Port> > deleted_ports;
changed = false;
@@ -414,11 +419,30 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed)
assert(port);
_ports.remove(port);
+
+ /* hold a reference to the port so that we can ensure
+ * that this thread, and not a JACK notification thread,
+ * holds the final reference.
+ */
+
+ deleted_ports.push_back (port);
_session.engine().unregister_port (port);
changed = true;
}
+ /* this will drop the final reference to the deleted ports,
+ * which will in turn call their destructors, which will in
+ * turn call the backend to unregister them.
+ *
+ * There will no connect/disconnect or register/unregister
+ * callbacks from the backend until we get here, because
+ * they are driven by the Port destructor. The destructor
+ * will not execute until we drop the final reference,
+ * which all happens right .... here.
+ */
+ deleted_ports.clear ();
+
/* create any necessary new ports */
while (n_ports().get(*t) < n) {
@@ -526,7 +550,7 @@ IO::state (bool /*full_state*/)
char buf[64];
string str;
int n;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
Glib::Threads::Mutex::Lock lm (io_lock);
node->add_property("name", _name);
@@ -535,6 +559,10 @@ IO::state (bool /*full_state*/)
node->add_property ("direction", enum_2_string (_direction));
node->add_property ("default-type", _default_type.to_string());
+ if (!_pretty_name_prefix.empty ()) {
+ node->add_property("pretty-name", _pretty_name_prefix);
+ }
+
for (std::vector<UserBundleInfo*>::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) {
XMLNode* n = new XMLNode ("Bundle");
n->add_property ("name", (*i)->bundle->name ());
@@ -587,9 +615,9 @@ IO::set_state (const XMLNode& node, int version)
*/
assert (version >= 3000);
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNodeConstIterator iter;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
/* force use of non-localized representation of decimal point,
since we use it a lot in XML files and so forth.
@@ -619,6 +647,11 @@ IO::set_state (const XMLNode& node, int version)
return -1;
}
+ // after create_ports, updates names
+ if ((prop = node.property ("pretty-name")) != 0) {
+ set_pretty_name (prop->value());
+ }
+
if (connecting_legal) {
if (make_connections (node, version, false)) {
@@ -643,9 +676,9 @@ IO::set_state (const XMLNode& node, int version)
int
IO::set_state_2X (const XMLNode& node, int version, bool in)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNodeConstIterator iter;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
/* force use of non-localized representation of decimal point,
since we use it a lot in XML files and so forth.
@@ -915,7 +948,7 @@ IO::make_connections (const XMLNode& node, int version, bool in)
return make_connections_2X (node, version, in);
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
for (XMLNodeConstIterator i = node.children().begin(); i != node.children().end(); ++i) {
@@ -976,7 +1009,7 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name)
the name of the thing we're applying it to.
*/
- XMLProperty* prop;
+ XMLProperty * prop;
XMLNodeList children = node.children();
for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
@@ -1007,7 +1040,7 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name)
int
IO::make_connections_2X (const XMLNode& node, int /*version*/, bool in)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
/* XXX: bundles ("connections" as was) */
@@ -1220,6 +1253,31 @@ IO::set_name (const string& requested_name)
return r;
}
+void
+IO::set_pretty_name (const std::string& str)
+{
+ if (_pretty_name_prefix == str) {
+ return;
+ }
+ _pretty_name_prefix = str;
+ apply_pretty_name ();
+}
+
+void
+IO::apply_pretty_name ()
+{
+ uint32_t pn = 1;
+ if (_pretty_name_prefix.empty ()) {
+ return;
+ }
+ for (PortSet::iterator i = _ports.begin (); i != _ports.end(); ++i, ++pn) {
+ (*i)->set_pretty_name (string_compose (("%1/%2 %3"),
+ _pretty_name_prefix,
+ _direction == Output ? _("Out") : _("In"),
+ pn));
+ }
+}
+
framecnt_t
IO::latency () const
{
@@ -1541,13 +1599,13 @@ IO::bundle_channel_name (uint32_t c, uint32_t n, DataType t) const
case 2:
return c == 0 ? _("L") : _("R");
default:
- snprintf (buf, sizeof(buf), _("%d"), (c + 1));
+ snprintf (buf, sizeof(buf), "%d", (c + 1));
return buf;
}
} else {
- snprintf (buf, sizeof(buf), _("%d"), (c + 1));
+ snprintf (buf, sizeof(buf), "%d", (c + 1));
return buf;
}
@@ -1558,7 +1616,7 @@ IO::bundle_channel_name (uint32_t c, uint32_t n, DataType t) const
string
IO::name_from_state (const XMLNode& node)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("name")) != 0) {
return prop->value();
@@ -1637,7 +1695,7 @@ IO::connected_to (const string& str) const
* Caller must hold process lock.
*/
void
-IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, framepos_t end_frame, pframes_t nframes)
+IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes)
{
/* don't read the data into new buffers - just use the port buffers directly */
@@ -1648,7 +1706,7 @@ IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, fr
_buffers.get_backend_port_addresses (_ports, nframes);
if (proc) {
- proc->run (_buffers, start_frame, end_frame, nframes, true);
+ proc->run (_buffers, start_frame, end_frame, speed, nframes, true);
}
}
@@ -1674,7 +1732,7 @@ IO::collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset)
}
for ( ; i != _ports.end(*t); ++i, ++b) {
- Buffer& bb (i->get_buffer (nframes));
+ const Buffer& bb (i->get_buffer (nframes));
b->read_from (bb, nframes);
}
}
@@ -1683,12 +1741,14 @@ IO::collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset)
void
IO::copy_to_outputs (BufferSet& bufs, DataType type, pframes_t nframes, framecnt_t offset)
{
- // Copy any buffers 1:1 to outputs
-
PortSet::iterator o = _ports.begin(type);
BufferSet::iterator i = bufs.begin(type);
BufferSet::iterator prev = i;
+ assert(i != bufs.end(type)); // or second loop will crash
+
+ // Copy any buffers 1:1 to outputs
+
while (i != bufs.end(type) && o != _ports.end (type)) {
Buffer& port_buffer (o->get_buffer (nframes));
port_buffer.read_from (*i, nframes, offset);
diff --git a/libs/ardour/io_processor.cc b/libs/ardour/io_processor.cc
index 8240062..61bb97f 100644
--- a/libs/ardour/io_processor.cc
+++ b/libs/ardour/io_processor.cc
@@ -32,7 +32,7 @@
#include "ardour/session_object.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -147,7 +147,7 @@ IOProcessor::set_state (const XMLNode& node, int version)
return set_state_2X (node, version);
}
- const XMLProperty *prop;
+ XMLProperty const * prop;
const XMLNode *io_node = 0;
Processor::set_state(node, version);
@@ -168,9 +168,9 @@ IOProcessor::set_state (const XMLNode& node, int version)
const string instr = enum_2_string (IO::Input);
const string outstr = enum_2_string (IO::Output);
- if (_own_input) {
+ if (_own_input && _input) {
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = (*niter)->property ("name")) != 0) {
if (_name == prop->value()) {
if ((prop = (*niter)->property ("direction")) != 0) {
@@ -197,10 +197,10 @@ IOProcessor::set_state (const XMLNode& node, int version)
}
- if (_own_output) {
+ if (_own_output && _output) {
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == "IO") {
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = (*niter)->property ("name")) != 0) {
if (_name == prop->value()) {
if ((prop = (*niter)->property ("direction")) != 0) {
@@ -240,7 +240,7 @@ IOProcessor::set_state_2X (const XMLNode& node, int version)
}
void
-IOProcessor::silence (framecnt_t nframes)
+IOProcessor::silence (framecnt_t nframes, framepos_t /* start_frame */)
{
if (_own_output && _output) {
_output->silence (nframes);
diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc
index f30925a..7ca6929 100644
--- a/libs/ardour/ladspa_plugin.cc
+++ b/libs/ardour/ladspa_plugin.cc
@@ -51,7 +51,7 @@
#include "pbd/stl_delete.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -141,11 +141,8 @@ LadspaPlugin::init (string module_path, uint32_t index, framecnt_t rate)
*_latency_control_port = 0;
}
- if (!LADSPA_IS_PORT_INPUT(port_descriptor (i))) {
- continue;
- }
-
_shadow_data[i] = _default_value (i);
+ _control_data[i] = _shadow_data[i];
}
}
@@ -350,8 +347,8 @@ void
LadspaPlugin::add_state (XMLNode* root) const
{
XMLNode *child;
- char buf[16];
- LocaleGuard lg (X_("C"));
+ char buf[32];
+ LocaleGuard lg;
for (uint32_t i = 0; i < parameter_count(); ++i){
@@ -377,14 +374,14 @@ LadspaPlugin::set_state (const XMLNode& node, int version)
#ifndef NO_PLUGIN_STATE
XMLNodeList nodes;
- XMLProperty *prop;
+ XMLProperty const * prop;
XMLNodeConstIterator iter;
XMLNode *child;
const char *port;
const char *data;
uint32_t port_id;
#endif
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
if (node.name() != state_node_name()) {
error << _("Bad node sent to LadspaPlugin::set_state") << endmsg;
@@ -427,14 +424,14 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */)
{
#ifndef NO_PLUGIN_STATE
XMLNodeList nodes;
- XMLProperty *prop;
+ XMLProperty const * prop;
XMLNodeConstIterator iter;
XMLNode *child;
const char *port;
const char *data;
uint32_t port_id;
#endif
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
if (node.name() != state_node_name()) {
error << _("Bad node sent to LadspaPlugin::set_state") << endmsg;
@@ -569,10 +566,11 @@ LadspaPlugin::automatable () const
int
LadspaPlugin::connect_and_run (BufferSet& bufs,
+ framepos_t start, framepos_t end, double speed,
ChanMapping in_map, ChanMapping out_map,
pframes_t nframes, framecnt_t offset)
{
- Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
+ Plugin::connect_and_run (bufs, start, end, speed, in_map, out_map, nframes, offset);
cycles_t now;
cycles_t then = get_cycles ();
diff --git a/libs/ardour/linux_vst_support.cc b/libs/ardour/linux_vst_support.cc
index 0bdc896..9f2ab0a 100644
--- a/libs/ardour/linux_vst_support.cc
+++ b/libs/ardour/linux_vst_support.cc
@@ -37,7 +37,7 @@
#include "pbd/basename.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
/***********************************************************/
/* VSTFX - A set of modules for managing linux VST plugins */
diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc
index 1b63ce4..0a48b43 100644
--- a/libs/ardour/location.cc
+++ b/libs/ardour/location.cc
@@ -36,7 +36,7 @@
#include "ardour/audiofilesource.h"
#include "ardour/tempo.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -207,8 +207,8 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute)
start_changed (this); /* EMIT SIGNAL */
StartChanged (); /* EMIT SIGNAL */
- end_changed (this); /* EMIT SIGNAL */
- EndChanged (); /* EMIT SIGNAL */
+ //end_changed (this); /* EMIT SIGNAL */
+ //EndChanged (); /* EMIT SIGNAL */
}
/* moving the start (position) of a marker with a scene change
@@ -281,8 +281,8 @@ Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute)
if (allow_bbt_recompute) {
recompute_bbt_from_frames ();
}
- start_changed (this); /* EMIT SIGNAL */
- StartChanged (); /* EMIT SIGNAL */
+ //start_changed (this); /* EMIT SIGNAL */
+ //StartChanged (); /* EMIT SIGNAL */
end_changed (this); /* EMIT SIGNAL */
EndChanged (); /* EMIT SIGNAL */
}
@@ -396,21 +396,17 @@ Location::set (framepos_t s, framepos_t e, bool allow_bbt_recompute)
assert (_end >= 0);
}
- if (start_change) {
+ if (start_change && end_change) {
+ changed (this);
+ Changed ();
+ } else if (start_change) {
start_changed(this); /* EMIT SIGNAL */
StartChanged(); /* EMIT SIGNAL */
- }
-
- if (end_change) {
+ } else if (end_change) {
end_changed(this); /* EMIT SIGNAL */
EndChanged(); /* EMIT SIGNAL */
}
- if (start_change && end_change) {
- changed (this);
- Changed ();
- }
-
return 0;
}
@@ -598,7 +594,7 @@ Location::get_state ()
int
Location::set_state (const XMLNode& node, int version)
{
- const XMLProperty *prop;
+ XMLProperty const * prop;
XMLNodeList cd_list = node.children();
XMLNodeConstIterator cd_iter;
@@ -726,8 +722,8 @@ Location::recompute_bbt_from_frames ()
return;
}
- _session.bbt_time (_start, _bbt_start);
- _session.bbt_time (_end, _bbt_end);
+ _bbt_start = _session.tempo_map().beat_at_frame (_start);
+ _bbt_end = _session.tempo_map().beat_at_frame (_end);
}
void
@@ -738,7 +734,7 @@ Location::recompute_frames_from_bbt ()
}
TempoMap& map (_session.tempo_map());
- set (map.frame_time (_bbt_start), map.frame_time (_bbt_end), false);
+ set (map.frame_at_beat (_bbt_start), map.frame_at_beat (_bbt_end), false);
}
void
diff --git a/libs/ardour/location_importer.cc b/libs/ardour/location_importer.cc
index 281e045..87c304f 100644
--- a/libs/ardour/location_importer.cc
+++ b/libs/ardour/location_importer.cc
@@ -27,7 +27,7 @@
#include "pbd/convert.h"
#include "pbd/failed_constructor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/ardour/ltc_file_reader.cc b/libs/ardour/ltc_file_reader.cc
index b07b320..8ca97ee 100644
--- a/libs/ardour/ltc_file_reader.cc
+++ b/libs/ardour/ltc_file_reader.cc
@@ -32,7 +32,7 @@
#include "timecode/time.h"
#include "ardour/ltc_file_reader.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc
index ab84cf6..6167c6b 100644
--- a/libs/ardour/ltc_slave.cc
+++ b/libs/ardour/ltc_slave.cc
@@ -32,7 +32,7 @@
#include "ardour/audioengine.h"
#include "ardour/audio_port.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/lua_api.cc b/libs/ardour/lua_api.cc
new file mode 100644
index 0000000..890e268
--- /dev/null
+++ b/libs/ardour/lua_api.cc
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#include <cstring>
+
+#include "pbd/error.h"
+#include "pbd/compose.h"
+
+#include "ardour/lua_api.h"
+#include "ardour/luaproc.h"
+#include "ardour/luascripting.h"
+#include "ardour/plugin.h"
+#include "ardour/plugin_insert.h"
+#include "ardour/plugin_manager.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace std;
+
+int
+ARDOUR::LuaAPI::datatype_ctor_null (lua_State *L)
+{
+ DataType dt (DataType::NIL);
+ luabridge::Stack <DataType>::push (L, dt);
+ return 1;
+}
+
+int
+ARDOUR::LuaAPI::datatype_ctor_audio (lua_State *L)
+{
+ DataType dt (DataType::AUDIO);
+ // NB luabridge will copy construct the object and manage lifetime.
+ luabridge::Stack <DataType>::push (L, dt);
+ return 1;
+}
+
+int
+ARDOUR::LuaAPI::datatype_ctor_midi (lua_State *L)
+{
+ DataType dt (DataType::MIDI);
+ luabridge::Stack <DataType>::push (L, dt);
+ return 1;
+}
+
+boost::shared_ptr<Processor>
+ARDOUR::LuaAPI::nil_processor ()
+{
+ return boost::shared_ptr<Processor> ();
+}
+
+boost::shared_ptr<Processor>
+ARDOUR::LuaAPI::new_luaproc (Session *s, const string& name)
+{
+ if (!s) {
+ return boost::shared_ptr<Processor> ();
+ }
+
+ LuaScriptInfoPtr spi;
+ ARDOUR::LuaScriptList & _scripts (LuaScripting::instance ().scripts (LuaScriptInfo::DSP));
+ for (LuaScriptList::const_iterator i = _scripts.begin(); i != _scripts.end(); ++i) {
+ if (name == (*i)->name) {
+ spi = *i;
+ break;
+ }
+ }
+
+ if (!spi) {
+ warning << _("Script with given name was not found\n");
+ return boost::shared_ptr<Processor> ();
+ }
+
+ PluginPtr p;
+ try {
+ LuaPluginInfoPtr lpi (new LuaPluginInfo(spi));
+ p = (lpi->load (*s));
+ } catch (...) {
+ warning << _("Failed to instantiate Lua Processor\n");
+ return boost::shared_ptr<Processor> ();
+ }
+
+ return boost::shared_ptr<Processor> (new PluginInsert (*s, p));
+}
+
+PluginInfoPtr
+ARDOUR::LuaAPI::new_plugin_info (const string& name, ARDOUR::PluginType type)
+{
+ PluginManager& manager = PluginManager::instance();
+ PluginInfoList all_plugs;
+ all_plugs.insert(all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
+ all_plugs.insert(all_plugs.end(), manager.lua_plugin_info().begin(), manager.lua_plugin_info().end());
+#ifdef WINDOWS_VST_SUPPORT
+ all_plugs.insert(all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
+#endif
+#ifdef LXVST_SUPPORT
+ all_plugs.insert(all_plugs.end(), manager.lxvst_plugin_info().begin(), manager.lxvst_plugin_info().end());
+#endif
+#ifdef AUDIOUNIT_SUPPORT
+ all_plugs.insert(all_plugs.end(), manager.au_plugin_info().begin(), manager.au_plugin_info().end());
+#endif
+#ifdef LV2_SUPPORT
+ all_plugs.insert(all_plugs.end(), manager.lv2_plugin_info().begin(), manager.lv2_plugin_info().end());
+#endif
+
+ for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
+ if (((*i)->name == name || (*i)->unique_id == name) && (*i)->type == type) {
+ return *i;
+ }
+ }
+ return PluginInfoPtr ();
+}
+
+boost::shared_ptr<Processor>
+ARDOUR::LuaAPI::new_plugin (Session *s, const string& name, ARDOUR::PluginType type, const string& preset)
+{
+ if (!s) {
+ return boost::shared_ptr<Processor> ();
+ }
+
+ PluginInfoPtr pip = new_plugin_info (name, type);
+
+ if (!pip) {
+ return boost::shared_ptr<Processor> ();
+ }
+
+ PluginPtr p = pip->load (*s);
+ if (!p) {
+ return boost::shared_ptr<Processor> ();
+ }
+
+ if (!preset.empty()) {
+ const Plugin::PresetRecord *pr = p->preset_by_label (preset);
+ if (pr) {
+ p->load_preset (*pr);
+ }
+ }
+
+ return boost::shared_ptr<Processor> (new PluginInsert (*s, p));
+}
+
+bool
+ARDOUR::LuaAPI::set_plugin_insert_param (boost::shared_ptr<PluginInsert> pi, uint32_t which, float val)
+{
+ boost::shared_ptr<Plugin> plugin = pi->plugin();
+ if (!plugin) { return false; }
+
+ bool ok=false;
+ uint32_t controlid = plugin->nth_parameter (which, ok);
+ if (!ok) { return false; }
+ if (!plugin->parameter_is_input (controlid)) { return false; }
+
+ ParameterDescriptor pd;
+ if (plugin->get_parameter_descriptor (controlid, pd) != 0) { return false; }
+ if (val < pd.lower || val > pd.upper) { return false; }
+
+ boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));
+ c->set_value (val, PBD::Controllable::NoGroup);
+ return true;
+}
+
+bool
+ARDOUR::LuaAPI::set_processor_param (boost::shared_ptr<Processor> proc, uint32_t which, float val)
+{
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (proc);
+ if (!pi) { return false; }
+ return set_plugin_insert_param (pi, which, val);
+}
+
+int
+ARDOUR::LuaAPI::plugin_automation (lua_State *L)
+{
+ typedef boost::shared_ptr<Processor> T;
+
+ int top = lua_gettop(L);
+ if (top < 2) {
+ return luaL_argerror (L, 1, "invalid number of arguments, :plugin_automation (plugin, parameter_number)");
+ }
+ T* const p = luabridge::Userdata::get<T>(L, 1, false);
+ uint32_t which = luabridge::Stack<uint32_t>::get (L, 2);
+ if (!p) {
+ return luaL_error (L, "Invalid pointer to Ardour:Processor");
+ }
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (*p);
+ if (!pi) {
+ return luaL_error (L, "Given Processor is not a Plugin Insert");
+ }
+ boost::shared_ptr<Plugin> plugin = pi->plugin();
+ if (!plugin) {
+ return luaL_error (L, "Given Processor is not a Plugin");
+ }
+
+ bool ok=false;
+ uint32_t controlid = plugin->nth_parameter (which, ok);
+ if (!ok) {
+ return luaL_error (L, "Invalid Parameter");
+ }
+ if (!plugin->parameter_is_input (controlid)) {
+ return luaL_error (L, "Given Parameter is not an input");
+ }
+
+ ParameterDescriptor pd;
+ if (plugin->get_parameter_descriptor (controlid, pd) != 0) {
+ return luaL_error (L, "Cannot describe parameter");
+ }
+
+ boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));
+
+ luabridge::Stack<boost::shared_ptr<AutomationList> >::push (L, c->alist());
+ luabridge::Stack<boost::shared_ptr<Evoral::ControlList> >::push (L, c->list());
+ luabridge::Stack<ParameterDescriptor>::push (L, pd);
+ return 3;
+}
+
+int
+ARDOUR::LuaOSC::Address::send (lua_State *L)
+{
+ Address * const luaosc = luabridge::Userdata::get <Address> (L, 1, false);
+ if (!luaosc) {
+ return luaL_error (L, "Invalid pointer to OSC.Address");
+ }
+ if (!luaosc->_addr) {
+ return luaL_error (L, "Invalid Destination Address");
+ }
+
+ int top = lua_gettop(L);
+ if (top < 3) {
+ return luaL_argerror (L, 1, "invalid number of arguments, :send (path, type, ...)");
+ }
+
+ const char* path = luaL_checkstring (L, 2);
+ const char* type = luaL_checkstring (L, 3);
+ assert (path && type);
+
+ if ((int) strlen(type) != top - 3) {
+ return luaL_argerror (L, 3, "type description does not match arguments");
+ }
+
+ lo_message msg = lo_message_new ();
+
+ for (int i = 4; i <= top; ++i) {
+ char t = type[i - 4];
+ int lt = lua_type(L, i);
+ int ok = -1;
+ switch(lt) {
+ case LUA_TSTRING:
+ if (t == LO_STRING) {
+ ok = lo_message_add_string (msg, luaL_checkstring(L, i));
+ } else if (t == LO_CHAR) {
+ char c = luaL_checkstring (L, i) [0];
+ ok = lo_message_add_char (msg, c);
+ }
+ break;
+ case LUA_TBOOLEAN:
+ if (t == LO_TRUE || t == LO_FALSE) {
+ if (lua_toboolean (L, i)) {
+ ok = lo_message_add_true (msg);
+ } else {
+ ok = lo_message_add_false (msg);
+ }
+ }
+ break;
+ case LUA_TNUMBER:
+ if (t == LO_INT32) {
+ ok = lo_message_add_int32 (msg, (int32_t) luaL_checkinteger(L, i));
+ }
+ else if (t == LO_FLOAT) {
+ ok = lo_message_add_float (msg, (float) luaL_checknumber(L, i));
+ }
+ else if (t == LO_DOUBLE) {
+ ok = lo_message_add_double (msg, (double) luaL_checknumber(L, i));
+ }
+ else if (t == LO_INT64) {
+ ok = lo_message_add_double (msg, (int64_t) luaL_checknumber(L, i));
+ }
+ break;
+ default:
+ break;
+ }
+ if (ok != 0) {
+ return luaL_argerror (L, i, "type description does not match parameter");
+ }
+ }
+
+ int rv = lo_send_message (luaosc->_addr, path, msg);
+ lo_message_free (msg);
+ luabridge::Stack<bool>::push (L, (rv == 0));
+ return 1;
+}
+
+static double hue2rgb (const double p, const double q, double t) {
+ if (t < 0.0) t += 1.0;
+ if (t > 1.0) t -= 1.0;
+ if (t < 1.0 / 6.0) return p + (q - p) * 6.0 * t;
+ if (t < 1.0 / 2.0) return q;
+ if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6.0;
+ return p;
+}
+
+int
+ARDOUR::LuaAPI::hsla_to_rgba (lua_State *L)
+{
+ int top = lua_gettop(L);
+ if (top < 3) {
+ return luaL_argerror (L, 1, "invalid number of arguments, :hsla_to_rgba (h, s, l [,a])");
+ }
+ double h = luabridge::Stack<double>::get (L, 1);
+ double s = luabridge::Stack<double>::get (L, 2);
+ double l = luabridge::Stack<double>::get (L, 3);
+ double a = 1.0;
+ if (top > 3) {
+ a = luabridge::Stack<double>::get (L, 4);
+ }
+
+ // we can't use ArdourCanvas::hsva_to_color here
+ // besides we want HSL not HSV and without intermediate
+ // color_to_rgba (rgba_to_color ())
+ double r,g,b;
+ const double cq = l < 0.5 ? l * (1 + s) : l + s - l * s;
+ const double cp = 2.f * l - cq;
+ r = hue2rgb (cp, cq, h + 1.0 / 3.0);
+ g = hue2rgb (cp, cq, h);
+ b = hue2rgb (cp, cq, h - 1.0 / 3.0);
+
+ luabridge::Stack<double>::push (L, r);
+ luabridge::Stack<double>::push (L, g);
+ luabridge::Stack<double>::push (L, b);
+ luabridge::Stack<double>::push (L, a);
+ return 4;
+}
+
+luabridge::LuaRef::Proxy&
+luabridge::LuaRef::Proxy::clone_instance (const void* classkey, void* p) {
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+
+ luabridge::UserdataPtr::push_raw (m_L, p, classkey);
+
+ lua_rawset (m_L, -3);
+ lua_pop (m_L, 1);
+ return *this;
+}
+
+LuaTableRef::LuaTableRef () {}
+LuaTableRef::~LuaTableRef () {}
+
+int
+LuaTableRef::get (lua_State* L)
+{
+ luabridge::LuaRef rv (luabridge::newTable (L));
+ for (std::vector<LuaTableEntry>::const_iterator i = _data.begin (); i != _data.end (); ++i) {
+ switch ((*i).keytype) {
+ case LUA_TSTRING:
+ assign(&rv, i->k_s, *i);
+ break;
+ case LUA_TNUMBER:
+ assign(&rv, i->k_n, *i);
+ break;
+ }
+ }
+ luabridge::push (L, rv);
+ return 1;
+}
+
+int
+LuaTableRef::set (lua_State* L)
+{
+ if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+ _data.clear ();
+
+ lua_pushvalue (L, -1);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+
+ LuaTableEntry s (lua_type(L, -1), lua_type(L, -2));
+ switch (lua_type(L, -1)) {
+ case LUA_TSTRING:
+ s.k_s = luabridge::Stack<std::string>::get (L, -1);
+ break;
+ ;
+ case LUA_TNUMBER:
+ s.k_n = luabridge::Stack<unsigned int>::get (L, -1);
+ break;
+ default:
+ // invalid key
+ lua_pop (L, 2);
+ continue;
+ }
+
+ switch(lua_type(L, -2)) {
+ case LUA_TSTRING:
+ s.s = luabridge::Stack<std::string>::get (L, -2);
+ break;
+ case LUA_TBOOLEAN:
+ s.b = lua_toboolean (L, -2);
+ break;
+ case LUA_TNUMBER:
+ s.n = lua_tonumber (L, -2);
+ break;
+ case LUA_TUSERDATA:
+ {
+ bool ok = false;
+ lua_getmetatable (L, -2);
+ lua_rawgetp (L, -1, luabridge::getIdentityKey ());
+ if (lua_isboolean (L, -1)) {
+ lua_pop (L, 1);
+ const void* key = lua_topointer (L, -1);
+ lua_pop (L, 1);
+ void const* classkey = findclasskey (L, key);
+
+ if (classkey) {
+ ok = true;
+ s.c = classkey;
+ s.p = luabridge::Userdata::get_ptr (L, -2);
+ }
+ } else {
+ lua_pop (L, 2);
+ }
+
+ if (ok) {
+ break;
+ }
+ // invalid userdata -- fall through
+ }
+ // no break
+ case LUA_TFUNCTION: // no support -- we could... string.format("%q", string.dump(value, true))
+ case LUA_TTABLE: // no nested tables, sorry.
+ case LUA_TNIL: // fallthrough
+ default:
+ // invalid value
+ lua_pop (L, 2);
+ continue;
+ }
+
+ _data.push_back(s);
+ lua_pop (L, 2);
+ }
+ return 0;
+}
+
+void*
+LuaTableRef::findclasskey (lua_State *L, const void* key)
+{
+ lua_pushvalue(L, LUA_REGISTRYINDEX);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ if (lua_topointer(L, -2) == key) {
+ void* rv = lua_touserdata (L, -1);
+ lua_pop (L, 4);
+ return rv;
+ }
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ return NULL;
+}
+
+template<typename T>
+void LuaTableRef::assign (luabridge::LuaRef* rv, T key, const LuaTableEntry& s)
+{
+ switch (s.valuetype) {
+ case LUA_TSTRING:
+ (*rv)[key] = s.s;
+ break;
+ case LUA_TBOOLEAN:
+ (*rv)[key] = s.b;
+ break;
+ case LUA_TNUMBER:
+ (*rv)[key] = s.n;
+ break;
+ case LUA_TUSERDATA:
+ (*rv)[key].clone_instance (s.c, s.p);
+ break;
+ default:
+ assert (0);
+ break;
+ }
+}
diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc
new file mode 100644
index 0000000..0bbfb11
--- /dev/null
+++ b/libs/ardour/luabindings.cc
@@ -0,0 +1,1502 @@
+/*
+ Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <glibmm.h>
+
+#include "timecode/bbt_time.h"
+#include "pbd/stateful_diff_command.h"
+#include "pbd/openuri.h"
+#include "evoral/Control.hpp"
+#include "evoral/ControlList.hpp"
+#include "evoral/Range.hpp"
+
+#include "ardour/amp.h"
+#include "ardour/audioengine.h"
+#include "ardour/audiosource.h"
+#include "ardour/audio_backend.h"
+#include "ardour/audio_buffer.h"
+#include "ardour/audio_port.h"
+#include "ardour/audio_track.h"
+#include "ardour/buffer_set.h"
+#include "ardour/chan_mapping.h"
+#include "ardour/dB.h"
+#include "ardour/dsp_filter.h"
+#include "ardour/interthread_info.h"
+#include "ardour/lua_api.h"
+#include "ardour/luabindings.h"
+#include "ardour/luaproc.h"
+#include "ardour/meter.h"
+#include "ardour/midi_track.h"
+#include "ardour/midi_port.h"
+#include "ardour/phase_control.h"
+#include "ardour/playlist.h"
+#include "ardour/plugin.h"
+#include "ardour/plugin_insert.h"
+#include "ardour/port_manager.h"
+#include "ardour/runtime_functions.h"
+#include "ardour/region.h"
+#include "ardour/region_factory.h"
+#include "ardour/route_group.h"
+#include "ardour/session.h"
+#include "ardour/session_object.h"
+#include "ardour/sidechain.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/stripable.h"
+#include "ardour/track.h"
+#include "ardour/tempo.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#ifdef PLATFORM_WINDOWS
+/* luabridge uses addresses of static functions/variables to identify classes.
+ *
+ * Static symbols on windows (even identical symbols) are not
+ * mapped to the same address when mixing .dll + .exe.
+ * So we need a single point to define those static functions.
+ * (normally they're header-only in libs/lua/LuaBridge/detail/ClassInfo.h)
+ *
+ * Really!! A static function with a static variable in a library header
+ * should never ever be replicated, even if it is a template.
+ * But then again this is windows... what else can go wrong.
+ */
+
+template <class T>
+void const*
+luabridge::ClassInfo<T>::getStaticKey ()
+{
+ static char value;
+ return &value;
+}
+
+template <class T>
+void const*
+luabridge::ClassInfo<T>::getClassKey ()
+{
+ static char value;
+ return &value;
+}
+
+template <class T>
+void const*
+luabridge::ClassInfo<T>::getConstKey ()
+{
+ static char value;
+ return &value;
+}
+
+void*
+luabridge::getIdentityKey ()
+{
+ static char value;
+ return &value;
+}
+
+/* ...and this is the ugly part of it.
+ *
+ * We need to foward declare classes from gtk2_ardour
+ * end explicily list classes which are used by gtk2_ardour's bindings.
+ *
+ * This is needed because some of the GUI classes use objects from libardour
+ * as function parameters and the .exe would re-create symbols for libardour
+ * objects.
+ *
+ * Classes which don't use libardour symbols could be moved to
+ * gtk2_ardour/luainstance.cc, but keeping this here reduces code
+ * duplication and does not give the compiler a chance to even think
+ * about replicating the symbols.
+ */
+
+#define CLASSKEYS(CLS) \
+ template void const* luabridge::ClassInfo< CLS >::getStaticKey(); \
+ template void const* luabridge::ClassInfo< CLS >::getClassKey(); \
+ template void const* luabridge::ClassInfo< CLS >::getConstKey();
+
+#define CLASSINFO(CLS) \
+ class CLS; \
+ template void const* luabridge::ClassInfo< CLS >::getStaticKey(); \
+ template void const* luabridge::ClassInfo< CLS >::getClassKey(); \
+ template void const* luabridge::ClassInfo< CLS >::getConstKey();
+
+CLASSINFO(MarkerSelection);
+CLASSINFO(TrackSelection);
+CLASSINFO(TrackViewList);
+CLASSINFO(TimeSelection);
+CLASSINFO(RegionSelection);
+CLASSINFO(PublicEditor);
+CLASSINFO(Selection);
+CLASSINFO(ArdourMarker);
+
+namespace LuaCairo {
+ class ImageSurface;
+ class PangoLayout;
+}
+CLASSKEYS(LuaCairo::ImageSurface);
+CLASSKEYS(LuaCairo::PangoLayout);
+
+namespace Cairo {
+ class Context;
+}
+CLASSKEYS(Cairo::Context);
+CLASSKEYS(std::vector<double>);
+CLASSKEYS(std::list<ArdourMarker*>);
+CLASSKEYS(std::bitset<47ul>); // LuaSignal::LAST_SIGNAL
+CLASSKEYS(ArdourMarker*);
+CLASSKEYS(ARDOUR::RouteGroup);
+CLASSKEYS(ARDOUR::LuaProc);
+CLASSKEYS(ARDOUR::DataType);
+CLASSKEYS(ARDOUR::ChanCount);
+CLASSKEYS(boost::shared_ptr<ARDOUR::Processor>);
+CLASSKEYS(ARDOUR::ParameterDescriptor);
+CLASSKEYS(boost::shared_ptr<ARDOUR::AutomationList>);
+CLASSKEYS(boost::shared_ptr<Evoral::ControlList>);
+CLASSKEYS(ARDOUR::LuaOSC::Address);
+CLASSKEYS(ARDOUR::Session);
+CLASSKEYS(ARDOUR::BufferSet);
+CLASSKEYS(ARDOUR::ChanMapping);
+CLASSKEYS(ARDOUR::DSP::DspShm);
+CLASSKEYS(ARDOUR::LuaTableRef);
+CLASSKEYS(PBD::ID);
+CLASSKEYS(ARDOUR::Location);
+CLASSKEYS(ARDOUR::PluginInfo);
+CLASSKEYS(PBD::PropertyChange);
+CLASSKEYS(std::vector<std::string>);
+CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Route> >);
+CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Port> >);
+CLASSKEYS(boost::shared_ptr<ARDOUR::PluginInfo>);
+CLASSKEYS(boost::shared_ptr<ARDOUR::Region>);
+CLASSKEYS(boost::weak_ptr<ARDOUR::Route>);
+CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Region> >);
+CLASSKEYS(std::list<ARDOUR::AudioRange>);
+CLASSKEYS(Evoral::Beats);
+CLASSKEYS(ARDOUR::PortEngine);
+CLASSKEYS(ARDOUR::PortManager);
+CLASSKEYS(ARDOUR::AudioEngine);
+CLASSKEYS(void);
+CLASSKEYS(float);
+
+#endif // end windows special case
+
+/* Some notes on Lua bindings for libardour and friends
+ *
+ * - Prefer factory methods over Contructors whenever possible.
+ * Don't expose the constructor method unless required.
+ *
+ * e.g. Don't allow the script to construct a "Track" Object directly
+ * but do allow to create a "BBT_TIME" object.
+ *
+ * - Do not dereference Shared or Weak Pointers. Pass the pointer to Lua.
+ * - Define Objects as boost:shared_ptr Object whenever possible.
+ *
+ * Storing a boost::shared_ptr in a Lua-variable keeps the reference
+ * until that variable is set to 'nil'.
+ * (if the script were to keep a direct pointer to the object instance, the
+ * behaviour is undefined if the actual object goes away)
+ *
+ * Methods of the actual class are indirectly exposed,
+ * boost::*_ptr get() and ::lock() is implicit when the class is exported
+ * as LuaBridge's "WSPtrClass".
+ */
+
+using namespace ARDOUR;
+
+void
+LuaBindings::stddef (lua_State* L)
+{
+ // std::list<std::string>
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("C")
+ .beginStdList <std::string> ("StringList")
+ .endClass ()
+
+ // std::vector<std::string>
+ .beginStdVector <std::string> ("StringVector")
+ .endClass ()
+
+ // register float array (uint8_t*)
+ .registerArray <uint8_t> ("ByteArray")
+
+ // register float array (float*)
+ .registerArray <float> ("FloatArray")
+
+ // register float array (int32_t*)
+ .registerArray <int32_t> ("IntArray")
+
+ // TODO std::set
+ .endNamespace ();
+}
+
+void
+LuaBindings::common (lua_State* L)
+{
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("PBD")
+
+ .addFunction ("open_uri", (bool (*) (const std::string&))&PBD::open_uri)
+ .addFunction ("open_uri", &PBD::open_folder)
+
+ .beginClass <PBD::ID> ("ID")
+ .addConstructor <void (*) (std::string)> ()
+ .addFunction ("to_s", &PBD::ID::to_s) // TODO special case LUA __tostring ?
+ .endClass ()
+
+ .beginStdVector <PBD::ID> ("IdVector").endClass ()
+
+ .beginClass <XMLNode> ("XMLNode")
+ .addFunction ("name", &XMLNode::name)
+ .endClass ()
+
+ .beginClass <PBD::Stateful> ("Stateful")
+ .addFunction ("id", &PBD::Stateful::id)
+ .addFunction ("properties", &PBD::Stateful::properties)
+ .addFunction ("clear_changes", &PBD::Stateful::clear_changes)
+ .endClass ()
+
+ .beginWSPtrClass <PBD::Stateful> ("StatefulPtr")
+ .addFunction ("id", &PBD::Stateful::id)
+ .addFunction ("properties", &PBD::Stateful::properties)
+ .addFunction ("clear_changes", &PBD::Stateful::clear_changes)
+ .endClass ()
+
+ .deriveClass <PBD::StatefulDestructible, PBD::Stateful> ("StatefulDestructible")
+ .endClass ()
+
+ .deriveWSPtrClass <PBD::StatefulDestructible, PBD::Stateful> ("StatefulDestructiblePtr")
+ .endClass ()
+
+ .deriveClass <Command, PBD::StatefulDestructible> ("Command")
+ .addFunction ("set_name", &Command::set_name)
+ .addFunction ("name", &Command::name)
+ .endClass ()
+
+ /* UndoTransaction::add_command() subscribes to DropReferences()
+ * and deletes the object.
+ *
+ * This object cannot be constructed by lua because lua would manage lifetime
+ * and delete the object leading to a double free.
+ *
+ * use Session::add_stateful_diff_command()
+ * and Session::abort_reversible_command()
+ */
+ .deriveClass <PBD::StatefulDiffCommand, Command> ("StatefulDiffCommand")
+ .addFunction ("undo", &PBD::StatefulDiffCommand::undo)
+ .addFunction ("empty", &PBD::StatefulDiffCommand::empty)
+ .endClass ()
+
+ .deriveWSPtrClass <PBD::Controllable, PBD::StatefulDestructible> ("Controllable")
+ .addFunction ("name", &PBD::Controllable::name)
+ .addFunction ("get_value", &PBD::Controllable::get_value)
+ .endClass ()
+
+ .beginClass <PBD::RingBufferNPT <uint8_t> > ("RingBuffer8")
+ .addConstructor <void (*) (size_t)> ()
+ .addFunction ("reset", &PBD::RingBufferNPT<uint8_t>::reset)
+ .addFunction ("read", &PBD::RingBufferNPT<uint8_t>::read)
+ .addFunction ("write", &PBD::RingBufferNPT<uint8_t>::write)
+ .addFunction ("write_one", &PBD::RingBufferNPT<uint8_t>::write_one)
+ .addFunction ("write_space", &PBD::RingBufferNPT<uint8_t>::write_space)
+ .addFunction ("read_space", &PBD::RingBufferNPT<uint8_t>::read_space)
+ .addFunction ("increment_read_ptr", &PBD::RingBufferNPT<uint8_t>::increment_read_ptr)
+ .addFunction ("increment_write_ptr", &PBD::RingBufferNPT<uint8_t>::increment_write_ptr)
+ .endClass ()
+
+ .beginClass <PBD::RingBufferNPT <float> > ("RingBufferF")
+ .addConstructor <void (*) (size_t)> ()
+ .addFunction ("reset", &PBD::RingBufferNPT<float>::reset)
+ .addFunction ("read", &PBD::RingBufferNPT<float>::read)
+ .addFunction ("write", &PBD::RingBufferNPT<float>::write)
+ .addFunction ("write_one", &PBD::RingBufferNPT<float>::write_one)
+ .addFunction ("write_space", &PBD::RingBufferNPT<float>::write_space)
+ .addFunction ("read_space", &PBD::RingBufferNPT<float>::read_space)
+ .addFunction ("increment_read_ptr", &PBD::RingBufferNPT<float>::increment_read_ptr)
+ .addFunction ("increment_write_ptr", &PBD::RingBufferNPT<float>::increment_write_ptr)
+ .endClass ()
+
+ .beginClass <PBD::RingBufferNPT <int> > ("RingBufferI")
+ .addConstructor <void (*) (size_t)> ()
+ .addFunction ("reset", &PBD::RingBufferNPT<int>::reset)
+ .addFunction ("read", &PBD::RingBufferNPT<int>::read)
+ .addFunction ("write", &PBD::RingBufferNPT<int>::write)
+ .addFunction ("write_one", &PBD::RingBufferNPT<int>::write_one)
+ .addFunction ("write_space", &PBD::RingBufferNPT<int>::write_space)
+ .addFunction ("read_space", &PBD::RingBufferNPT<int>::read_space)
+ .addFunction ("increment_read_ptr", &PBD::RingBufferNPT<int>::increment_read_ptr)
+ .addFunction ("increment_write_ptr", &PBD::RingBufferNPT<int>::increment_write_ptr)
+ .endClass ()
+
+ /* PBD enums */
+ .beginNamespace ("GroupControlDisposition")
+ .addConst ("InverseGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::InverseGroup))
+ .addConst ("NoGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::NoGroup))
+ .addConst ("UseGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::UseGroup))
+ .endNamespace ()
+
+ .endNamespace (); // PBD
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Timecode")
+ .beginClass <Timecode::BBT_Time> ("BBT_TIME")
+ .addConstructor <void (*) (uint32_t, uint32_t, uint32_t)> ()
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+
+ .beginNamespace ("Evoral")
+ .beginClass <Evoral::Parameter> ("Parameter")
+ .addConstructor <void (*) (uint32_t, uint8_t, uint32_t)> ()
+ .addFunction ("type", &Evoral::Parameter::type)
+ .addFunction ("channel", &Evoral::Parameter::channel)
+ .addFunction ("id", &Evoral::Parameter::id)
+ .endClass ()
+
+ .beginWSPtrClass <Evoral::ControlList> ("ControlList")
+ .addFunction ("add", &Evoral::ControlList::add)
+ .addFunction ("thin", &Evoral::ControlList::thin)
+ .addFunction ("eval", &Evoral::ControlList::eval)
+ .addRefFunction ("rt_safe_eval", &Evoral::ControlList::rt_safe_eval)
+ .addFunction ("interpolation", &Evoral::ControlList::interpolation)
+ .addFunction ("set_interpolation", &Evoral::ControlList::set_interpolation)
+ .addFunction ("truncate_end", &Evoral::ControlList::truncate_end)
+ .addFunction ("truncate_start", &Evoral::ControlList::truncate_start)
+ .addFunction ("clear", (void (Evoral::ControlList::*)(double, double))&Evoral::ControlList::clear)
+ .addFunction ("in_write_pass", &Evoral::ControlList::in_write_pass)
+ .endClass ()
+
+ .beginWSPtrClass <Evoral::ControlSet> ("ControlSet")
+ .endClass ()
+
+ .beginWSPtrClass <Evoral::Control> ("Control")
+ .addFunction ("list", (boost::shared_ptr<Evoral::ControlList>(Evoral::Control::*)())&Evoral::Control::list)
+ .endClass ()
+
+ .beginClass <Evoral::ParameterDescriptor> ("ParameterDescriptor")
+ .addVoidConstructor ()
+ .addData ("lower", &Evoral::ParameterDescriptor::lower)
+ .addData ("upper", &Evoral::ParameterDescriptor::upper)
+ .addData ("normal", &Evoral::ParameterDescriptor::normal)
+ .addData ("toggled", &Evoral::ParameterDescriptor::toggled)
+ .endClass ()
+
+ .beginClass <Evoral::Range<framepos_t> > ("Range")
+ .addConstructor <void (*) (framepos_t, framepos_t)> ()
+ .addData ("from", &Evoral::Range<framepos_t>::from)
+ .addData ("to", &Evoral::Range<framepos_t>::to)
+ .endClass ()
+
+ /* libevoral enums */
+ .beginNamespace ("InterpolationStyle")
+ .addConst ("Discrete", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Discrete))
+ .addConst ("Linear", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Linear))
+ .addConst ("Curved", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Curved))
+ .endNamespace ()
+
+ .endNamespace () // Evoral
+
+ .beginNamespace ("ARDOUR")
+
+ .beginClass <InterThreadInfo> ("InterThreadInfo")
+ .addVoidConstructor ()
+ .addData ("done", const_cast<bool InterThreadInfo::*>(&InterThreadInfo::done))
+#if 0 // currently unused, lua is single-threaded, no custom UIs.
+ .addData ("cancel", (bool InterThreadInfo::*)&InterThreadInfo::cancel)
+#endif
+ .addData ("progress", const_cast<float InterThreadInfo::*>(&InterThreadInfo::progress))
+ .endClass ()
+
+ .beginClass <AudioRange> ("AudioRange")
+ .addConstructor <void (*) (framepos_t, framepos_t, uint32_t)> ()
+ .addFunction ("length", &AudioRange::length)
+ .addFunction ("equal", &AudioRange::equal)
+ .addData ("start", &AudioRange::start)
+ .addData ("_end", &AudioRange::end) // XXX "end" is a lua reserved word
+ .addData ("id", &AudioRange::id)
+ .endClass ()
+
+ .beginWSPtrClass <PluginInfo> ("PluginInfo")
+ .addVoidConstructor ()
+ .endClass ()
+
+ .beginNamespace ("Route")
+ .beginClass <Route::ProcessorStreams> ("ProcessorStreams")
+ .addVoidConstructor ()
+ .endClass ()
+ .endNamespace ()
+
+ .beginClass <ChanMapping> ("ChanMapping")
+ .addVoidConstructor ()
+ .addFunction ("get", static_cast<uint32_t(ChanMapping::*)(DataType, uint32_t) const>(&ChanMapping::get))
+ .addFunction ("set", &ChanMapping::set)
+ .addFunction ("count", &ChanMapping::count)
+ .addFunction ("n_total", &ChanMapping::n_total)
+ .addFunction ("is_monotonic", &ChanMapping::is_monotonic)
+ .addConst ("Invalid", 4294967295U) // UINT32_MAX
+ .endClass ()
+
+ .beginNamespace ("Properties")
+ // templated class definitions
+ .beginClass <PBD::PropertyDescriptor<bool> > ("BoolProperty").endClass ()
+ .beginClass <PBD::PropertyDescriptor<float> > ("FloatProperty").endClass ()
+ .beginClass <PBD::PropertyDescriptor<framepos_t> > ("FrameposProperty").endClass ()
+ // actual references (TODO: also expose GQuark for std::set)
+ // ardour/region.h
+ .addConst ("Start", &ARDOUR::Properties::start)
+ .addConst ("Length", &ARDOUR::Properties::length)
+ .addConst ("Position", &ARDOUR::Properties::position)
+ .endNamespace ()
+
+ .beginClass <PBD::PropertyChange> ("PropertyChange")
+ // TODO add special handling (std::set<PropertyID>), PropertyID is a GQuark.
+ // -> direct map to lua table beginStdSet()A
+ //
+ // expand templated PropertyDescriptor<T>
+ .addFunction ("containsBool", &PBD::PropertyChange::contains<bool>)
+ .addFunction ("containsFloat", &PBD::PropertyChange::contains<float>)
+ .addFunction ("containsFramePos", &PBD::PropertyChange::contains<framepos_t>)
+ .endClass ()
+
+ .beginClass <PBD::PropertyList> ("PropertyList")
+ // is-a std::map<PropertyID, PropertyBase*>
+ .endClass ()
+
+ .deriveClass <PBD::OwnedPropertyList, PBD::PropertyList> ("OwnedPropertyList")
+ .endClass ()
+
+ .beginWSPtrClass <AutomationList> ("AutomationList")
+ .addCast<PBD::Stateful> ("to_stateful")
+ .addCast<PBD::StatefulDestructible> ("to_statefuldestructible")
+ .addCast<Evoral::ControlList> ("list")
+ .addFunction ("get_state", &AutomationList::get_state)
+ .addFunction ("memento_command", &AutomationList::memento_command)
+ .addFunction ("touching", &AutomationList::touching)
+ .addFunction ("writing", &AutomationList::writing)
+ .addFunction ("touch_enabled", &AutomationList::touch_enabled)
+ .endClass ()
+
+ .deriveClass <Location, PBD::StatefulDestructible> ("Location")
+ .addFunction ("locked", &Location::locked)
+ .addFunction ("lock", &Location::lock)
+ .addFunction ("unlock", &Location::unlock)
+ .addFunction ("start", &Location::start)
+ .addFunction ("_end", &Location::end) // XXX "end" is a lua reserved word
+ .addFunction ("length", &Location::length)
+ .addFunction ("set_start", &Location::set_start)
+ .addFunction ("set_end", &Location::set_end)
+ .addFunction ("set_length", &Location::set)
+ .addFunction ("move_to", &Location::move_to)
+ .addFunction ("matches", &Location::matches)
+ .addFunction ("flags", &Location::flags)
+ .addFunction ("is_auto_punch", &Location::is_auto_punch)
+ .addFunction ("is_auto_loop", &Location::is_auto_loop)
+ .addFunction ("is_mark", &Location::is_mark)
+ .addFunction ("is_hidden", &Location::is_hidden)
+ .addFunction ("is_cd_marker", &Location::is_cd_marker)
+ .addFunction ("is_session_range", &Location::is_session_range)
+ .addFunction ("is_range_marker", &Location::is_range_marker)
+ .endClass ()
+
+ .deriveClass <Locations, PBD::StatefulDestructible> ("Locations")
+ .addFunction ("list", static_cast<Locations::LocationList (Locations::*)()>(&Locations::list))
+ .addFunction ("auto_loop_location", &Locations::auto_loop_location)
+ .addFunction ("auto_punch_location", &Locations::auto_punch_location)
+ .addFunction ("session_range_location", &Locations::session_range_location)
+ .addFunction ("first_mark_after", &Locations::first_mark_after)
+ .addFunction ("first_mark_before", &Locations::first_mark_before)
+ .addFunction ("first_mark_at", &Locations::mark_at)
+ .addRefFunction ("marks_either_side", &Locations::marks_either_side)
+ .addRefFunction ("find_all_between", &Locations::find_all_between)
+ .endClass ()
+
+ .beginWSPtrClass <SessionObject> ("SessionObject")
+ /* SessionObject is-a PBD::StatefulDestructible,
+ * but multiple inheritance is not covered by luabridge,
+ * we need explicit casts */
+ .addCast<PBD::Stateful> ("to_stateful")
+ .addCast<PBD::StatefulDestructible> ("to_statefuldestructible")
+ .addFunction ("name", &SessionObject::name)
+ .endClass ()
+
+ .beginWSPtrClass <Port> ("Port")
+ .addCast<MidiPort> ("to_midiport")
+ .addCast<AudioPort> ("to_audioport")
+ .addFunction ("name", &Port::name)
+ .addFunction ("pretty_name", &Port::pretty_name)
+ .addFunction ("receives_input", &Port::receives_input)
+ .addFunction ("sends_output", &Port::sends_output)
+ .addFunction ("connected", &Port::connected)
+ .addFunction ("disconnect_all", &Port::disconnect_all)
+ .addFunction ("connected_to_name", (bool (Port::*)(std::string const &)const)&Port::connected_to)
+ .addFunction ("connect_by_name", (int (Port::*)(std::string const &))&Port::connect)
+ .addFunction ("disconnect_by_name", (int (Port::*)(std::string const &))&Port::disconnect)
+ .addFunction ("connected_to", (bool (Port::*)(Port*)const)&Port::connected_to)
+ .addFunction ("connect", (int (Port::*)(Port*))&Port::connect)
+ .addFunction ("disconnect", (int (Port::*)(Port*))&Port::disconnect)
+ //.addStaticFunction ("port_offset", &Port::port_offset) // static
+ .endClass ()
+
+ .deriveWSPtrClass <AudioPort, Port> ("AudioPort")
+ .endClass ()
+
+ .deriveWSPtrClass <MidiPort, Port> ("MidiPort")
+ .addFunction ("input_active", &MidiPort::input_active)
+ .addFunction ("set_input_active", &MidiPort::set_input_active)
+ .addFunction ("get_midi_buffer", &MidiPort::get_midi_buffer) // DSP only
+ .endClass ()
+
+ .beginWSPtrClass <PortSet> ("PortSet")
+ .addFunction ("num_ports", (size_t (PortSet::*)(DataType)const)&PortSet::num_ports)
+ .addFunction ("add", &PortSet::add)
+ .addFunction ("remove", &PortSet::remove)
+ .addFunction ("port", (boost::shared_ptr<Port> (PortSet::*)(DataType, size_t)const)&PortSet::port)
+ .addFunction ("contains", &PortSet::contains)
+ .addFunction ("clear", &PortSet::clear)
+ .addFunction ("empty", &PortSet::empty)
+ .endClass ()
+
+ .deriveWSPtrClass <IO, SessionObject> ("IO")
+ .addFunction ("active", &IO::active)
+ .addFunction ("add_port", &IO::add_port)
+ .addFunction ("remove_port", &IO::remove_port)
+ .addFunction ("connect", &IO::connect)
+ .addFunction ("disconnect", (int (IO::*)(boost::shared_ptr<Port>, std::string, void *))&IO::disconnect)
+ .addFunction ("physically_connected", &IO::physically_connected)
+ .addFunction ("has_port", &IO::has_port)
+ .addFunction ("nth", &IO::nth)
+ .addFunction ("audio", &IO::audio)
+ .addFunction ("midi", &IO::midi)
+ .addFunction ("port_by_name", &IO::nth)
+ .addFunction ("n_ports", &IO::n_ports)
+ .endClass ()
+
+ .beginClass <RouteGroup> ("RouteGroup")
+ // stub RouteGroup* is needed for new_audio_track()
+ .endClass ()
+
+ .deriveWSPtrClass <Stripable, SessionObject> ("Stripable")
+ .addCast<Route> ("to_route")
+ .addFunction ("is_auditioner", &Stripable::is_auditioner)
+ .addFunction ("is_master", &Stripable::is_master)
+ .addFunction ("is_monitor", &Stripable::is_monitor)
+ .addFunction ("is_hidden", &Stripable::is_hidden)
+ .addFunction ("is_selected", &Stripable::is_selected)
+ .addFunction ("gain_control", &Stripable::gain_control)
+ .addFunction ("solo_control", &Stripable::solo_control)
+ .addFunction ("solo_isolate_control", &Stripable::solo_isolate_control)
+ .addFunction ("solo_safe_control", &Stripable::solo_safe_control)
+ .addFunction ("mute_control", &Stripable::mute_control)
+ .addFunction ("phase_control", &Stripable::phase_control)
+ .addFunction ("trim_control", &Stripable::trim_control)
+ .addFunction ("rec_enable_control", &Stripable::rec_enable_control)
+ .addFunction ("rec_safe_control", &Stripable::rec_safe_control)
+ .endClass ()
+
+ .deriveWSPtrClass <Route, Stripable> ("Route")
+ .addCast<Track> ("to_track")
+ .addFunction ("set_name", &Route::set_name)
+ .addFunction ("comment", &Route::comment)
+ .addFunction ("active", &Route::active)
+ .addFunction ("set_active", &Route::set_active)
+ .addFunction ("nth_plugin", &Route::nth_plugin)
+ .addFunction ("nth_processor", &Route::nth_processor)
+ .addFunction ("nth_send", &Route::nth_send)
+ .addFunction ("add_processor_by_index", &Route::add_processor_by_index)
+ .addFunction ("remove_processor", &Route::remove_processor)
+ .addFunction ("replace_processor", &Route::replace_processor)
+ .addFunction ("n_inputs", &Route::n_inputs)
+ .addFunction ("n_outputs", &Route::n_outputs)
+ .addFunction ("set_comment", &Route::set_comment)
+ .addFunction ("strict_io", &Route::strict_io)
+ .addFunction ("set_strict_io", &Route::set_strict_io)
+ .addFunction ("reset_plugin_insert", &Route::reset_plugin_insert)
+ .addFunction ("customize_plugin_insert", &Route::customize_plugin_insert)
+ .addFunction ("add_sidechain", &Route::add_sidechain)
+ .addFunction ("remove_sidechain", &Route::remove_sidechain)
+ .addFunction ("main_outs", &Route::main_outs)
+ .addFunction ("muted", &Route::muted)
+ .addFunction ("soloed", &Route::soloed)
+ .addFunction ("amp", &Route::amp)
+ .addFunction ("trim", &Route::trim)
+ .endClass ()
+
+ .deriveWSPtrClass <Playlist, SessionObject> ("Playlist")
+ .addFunction ("region_by_id", &Playlist::region_by_id)
+ .addFunction ("data_type", &Playlist::data_type)
+ .addFunction ("n_regions", &Playlist::n_regions)
+ //.addFunction ("get_extent", &Playlist::get_extent) // pair<framepos_t, framepos_t>
+ .addFunction ("region_list", &Playlist::region_list)
+ .addFunction ("add_region", &Playlist::add_region)
+ .addFunction ("remove_region", &Playlist::remove_region)
+ .addFunction ("regions_at", &Playlist::regions_at)
+ .addFunction ("top_region_at", &Playlist::top_region_at)
+ .addFunction ("top_unmuted_region_at", &Playlist::top_unmuted_region_at)
+ .addFunction ("find_next_region", &Playlist::find_next_region)
+ .addFunction ("find_next_region_boundary", &Playlist::find_next_region_boundary)
+ .addFunction ("count_regions_at", &Playlist::count_regions_at)
+ .addFunction ("regions_touched", &Playlist::regions_touched)
+ .addFunction ("regions_with_start_within", &Playlist::regions_with_start_within)
+ .addFunction ("regions_with_end_within", &Playlist::regions_with_end_within)
+ .addFunction ("raise_region", &Playlist::raise_region)
+ .addFunction ("lower_region", &Playlist::lower_region)
+ .addFunction ("raise_region_to_top", &Playlist::raise_region_to_top)
+ .addFunction ("lower_region_to_bottom", &Playlist::lower_region_to_bottom)
+ .addFunction ("duplicate", (void (Playlist::*)(boost::shared_ptr<Region>, framepos_t, framecnt_t, float))&Playlist::duplicate)
+ .addFunction ("duplicate_until", &Playlist::duplicate_until)
+ .addFunction ("duplicate_range", &Playlist::duplicate_range)
+ .addFunction ("combine", &Playlist::combine)
+ .addFunction ("uncombine", &Playlist::uncombine)
+ .addFunction ("split_region", &Playlist::split_region)
+ .addFunction ("split", (void (Playlist::*)(framepos_t))&Playlist::split)
+ .addFunction ("cut", (boost::shared_ptr<Playlist> (Playlist::*)(std::list<AudioRange>&, bool))&Playlist::cut)
+#if 0
+ .addFunction ("copy", &Playlist::copy)
+ .addFunction ("paste", &Playlist::paste)
+#endif
+ .endClass ()
+
+ .deriveWSPtrClass <Track, Route> ("Track")
+ .addCast<AudioTrack> ("to_audio_track")
+ .addCast<MidiTrack> ("to_midi_track")
+ .addFunction ("set_name", &Track::set_name)
+ .addFunction ("can_record", &Track::can_record)
+ .addFunction ("bounceable", &Track::bounceable)
+ .addFunction ("bounce", &Track::bounce)
+ .addFunction ("bounce_range", &Track::bounce_range)
+ .addFunction ("playlist", &Track::playlist)
+ .endClass ()
+
+ .deriveWSPtrClass <AudioTrack, Track> ("AudioTrack")
+ .endClass ()
+
+ .deriveWSPtrClass <MidiTrack, Track> ("MidiTrack")
+ .endClass ()
+
+ .deriveWSPtrClass <Region, SessionObject> ("Region")
+ /* properties */
+ .addFunction ("position", &Region::position)
+ .addFunction ("start", &Region::start)
+ .addFunction ("length", &Region::length)
+ .addFunction ("layer", &Region::layer)
+ .addFunction ("data_type", &Region::data_type)
+ .addFunction ("stretch", &Region::stretch)
+ .addFunction ("shift", &Region::shift)
+ .addRefFunction ("sync_offset", &Region::sync_offset)
+ .addFunction ("sync_position", &Region::sync_position)
+ .addFunction ("hidden", &Region::hidden)
+ .addFunction ("muted", &Region::muted)
+ .addFunction ("opaque", &Region::opaque)
+ .addFunction ("locked", &Region::locked)
+ .addFunction ("position_locked", &Region::position_locked)
+ .addFunction ("video_locked", &Region::video_locked)
+ .addFunction ("automatic", &Region::automatic)
+ .addFunction ("whole_file", &Region::whole_file)
+ .addFunction ("captured", &Region::captured)
+ .addFunction ("can_move", &Region::can_move)
+ .addFunction ("sync_marked", &Region::sync_marked)
+ .addFunction ("external", &Region::external)
+ .addFunction ("import", &Region::import)
+ .addFunction ("covers", &Region::covers)
+ .addFunction ("at_natural_position", &Region::at_natural_position)
+ .addFunction ("is_compound", &Region::is_compound)
+ /* editing operations */
+ .addFunction ("set_length", &Region::set_length)
+ .addFunction ("set_start", &Region::set_start)
+ .addFunction ("set_position", &Region::set_position)
+ .addFunction ("set_initial_position", &Region::set_initial_position)
+ .addFunction ("nudge_position", &Region::nudge_position)
+ .addFunction ("move_to_natural_position", &Region::move_to_natural_position)
+ .addFunction ("move_start", &Region::move_start)
+ .addFunction ("trim_front", &Region::trim_front)
+ .addFunction ("trim_end", &Region::trim_end)
+ .addFunction ("trim_to", &Region::trim_to)
+ .addFunction ("cut_front", &Region::cut_front)
+ .addFunction ("cut_end", &Region::cut_end)
+ .addFunction ("raise", &Region::raise)
+ .addFunction ("lower", &Region::lower)
+ .addFunction ("raise_to_top", &Region::raise_to_top)
+ .addFunction ("lower_to_bottom", &Region::lower_to_bottom)
+ .addFunction ("set_sync_position", &Region::set_sync_position)
+ .addFunction ("clear_sync_position", &Region::clear_sync_position)
+ .addFunction ("set_hidden", &Region::set_hidden)
+ .addFunction ("set_muted", &Region::set_muted)
+ .addFunction ("set_opaque", &Region::set_opaque)
+ .addFunction ("set_locked", &Region::set_locked)
+ .addFunction ("set_video_locked", &Region::set_video_locked)
+ .addFunction ("set_position_locked", &Region::set_position_locked)
+ .endClass ()
+
+ .beginWSPtrClass <Source> ("Source")
+ .endClass ()
+
+ .beginClass <Plugin::PresetRecord> ("PresetRecord")
+ .addVoidConstructor ()
+ .addData ("uri", &Plugin::PresetRecord::uri, false)
+ .addData ("label", &Plugin::PresetRecord::label, false)
+ .addData ("user", &Plugin::PresetRecord::user, false)
+ .addData ("valid", &Plugin::PresetRecord::valid, false)
+ .endClass ()
+
+ .deriveWSPtrClass <Automatable, Evoral::ControlSet> ("Automatable")
+ .addFunction ("automation_control", (boost::shared_ptr<AutomationControl>(Automatable::*)(const Evoral::Parameter&, bool))&Automatable::automation_control)
+ .endClass ()
+
+ .deriveClass <ParameterDescriptor, Evoral::ParameterDescriptor> ("ParameterDescriptor")
+ .addVoidConstructor ()
+ .addData ("label", &ParameterDescriptor::label)
+ .addData ("logarithmic", &ParameterDescriptor::logarithmic)
+ .addStaticFunction ("midi_note_name", &ParameterDescriptor::midi_note_name)
+ .endClass ()
+
+ .deriveWSPtrClass <Processor, SessionObject> ("Processor")
+ .addCast<Automatable> ("to_automatable")
+ .addCast<PluginInsert> ("to_insert")
+ .addCast<SideChain> ("to_sidechain")
+ .addCast<IOProcessor> ("to_ioprocessor")
+ .addCast<UnknownProcessor> ("to_unknownprocessor")
+ .addCast<Amp> ("to_amp")
+#if 0 // those objects are not yet bound
+ .addCast<MonitorProcessor> ("to_monitorprocessor")
+ .addCast<CapturingProcessor> ("to_capturingprocessor")
+ .addCast<DelayLine> ("to_delayline")
+ .addCast<PeakMeter> ("to_meter")
+#endif
+ .addFunction ("display_name", &Processor::display_name)
+ .addFunction ("active", &Processor::active)
+ .addFunction ("activate", &Processor::activate)
+ .addFunction ("deactivate", &Processor::deactivate)
+ .endClass ()
+
+ .deriveWSPtrClass <IOProcessor, Processor> ("IOProcessor")
+ .addFunction ("natural_input_streams", &IOProcessor::natural_input_streams)
+ .addFunction ("natural_output_streams", &IOProcessor::natural_output_streams)
+ .addFunction ("input", (boost::shared_ptr<IO>(IOProcessor::*)())&IOProcessor::input)
+ .addFunction ("output", (boost::shared_ptr<IO>(IOProcessor::*)())&IOProcessor::output)
+ .endClass ()
+
+ .deriveWSPtrClass <SideChain, IOProcessor> ("SideChain")
+ .endClass ()
+
+ .deriveWSPtrClass <Delivery, IOProcessor> ("Delivery")
+ .endClass ()
+
+ .deriveWSPtrClass <Plugin, PBD::StatefulDestructible> ("Plugin")
+ .addFunction ("label", &Plugin::label)
+ .addFunction ("name", &Plugin::name)
+ .addFunction ("maker", &Plugin::maker)
+ .addFunction ("parameter_count", &Plugin::parameter_count)
+ .addRefFunction ("nth_parameter", &Plugin::nth_parameter)
+ .addFunction ("preset_by_label", &Plugin::preset_by_label)
+ .addFunction ("preset_by_uri", &Plugin::preset_by_uri)
+ .addFunction ("load_preset", &Plugin::load_preset)
+ .addFunction ("parameter_is_input", &Plugin::parameter_is_input)
+ .addFunction ("get_docs", &Plugin::get_docs)
+ .addFunction ("get_parameter_docs", &Plugin::get_parameter_docs)
+ .addRefFunction ("get_parameter_descriptor", &Plugin::get_parameter_descriptor)
+ .endClass ()
+
+ .deriveWSPtrClass <PluginInsert, Processor> ("PluginInsert")
+ .addFunction ("plugin", &PluginInsert::plugin)
+ .addFunction ("activate", &PluginInsert::activate)
+ .addFunction ("deactivate", &PluginInsert::deactivate)
+ .addFunction ("strict_io_configured", &PluginInsert::strict_io_configured)
+ .addFunction ("input_map", (ARDOUR::ChanMapping (PluginInsert::*)(uint32_t) const)&PluginInsert::input_map)
+ .addFunction ("output_map", (ARDOUR::ChanMapping (PluginInsert::*)(uint32_t) const)&PluginInsert::output_map)
+ .addFunction ("set_input_map", &PluginInsert::set_input_map)
+ .addFunction ("set_output_map", &PluginInsert::set_output_map)
+ .addFunction ("sidechain_input", &PluginInsert::sidechain_input)
+ .endClass ()
+
+ .deriveWSPtrClass <AutomationControl, PBD::Controllable> ("AutomationControl")
+ .addCast<Evoral::Control> ("to_ctrl")
+ .addFunction ("automation_state", &AutomationControl::automation_state)
+ .addFunction ("automation_style", &AutomationControl::automation_style)
+ .addFunction ("set_automation_state", &AutomationControl::set_automation_state)
+ .addFunction ("set_automation_style", &AutomationControl::set_automation_style)
+ .addFunction ("start_touch", &AutomationControl::start_touch)
+ .addFunction ("stop_touch", &AutomationControl::stop_touch)
+ .addFunction ("get_value", &AutomationControl::get_value)
+ .addFunction ("set_value", &AutomationControl::set_value)
+ .addFunction ("writable", &AutomationControl::writable)
+ .addFunction ("alist", &AutomationControl::alist)
+ .endClass ()
+
+ .deriveWSPtrClass <SlavableAutomationControl, AutomationControl> ("SlavableAutomationControl,")
+ .addFunction ("add_master", &SlavableAutomationControl::add_master)
+ .addFunction ("remove_master", &SlavableAutomationControl::remove_master)
+ .addFunction ("clear_masters", &SlavableAutomationControl::clear_masters)
+ .addFunction ("slaved_to", &SlavableAutomationControl::slaved_to)
+ .addFunction ("slaved", &SlavableAutomationControl::slaved)
+ .addFunction ("get_masters_value", &SlavableAutomationControl::get_masters_value)
+ .addFunction ("get_boolean_masters", &SlavableAutomationControl::get_boolean_masters)
+ //.addFunction ("masters", &SlavableAutomationControl::masters) // not implemented
+ .endClass ()
+
+ .deriveWSPtrClass <PhaseControl, AutomationControl> ("PhaseControl")
+ .addFunction ("set_phase_invert", (void(PhaseControl::*)(uint32_t, bool))&PhaseControl::set_phase_invert)
+ .addFunction ("inverted", &PhaseControl::inverted)
+ .endClass ()
+
+ .deriveWSPtrClass <GainControl, SlavableAutomationControl> ("GainControl")
+ .endClass ()
+
+ .deriveWSPtrClass <SoloControl, SlavableAutomationControl> ("SoloControl")
+ .addFunction ("can_solo", &SoloControl::can_solo)
+ .addFunction ("soloed", &SoloControl::soloed)
+ .addFunction ("self_soloed", &SoloControl::self_soloed)
+ .endClass ()
+
+ .deriveWSPtrClass <MuteControl, SlavableAutomationControl> ("MuteControl")
+ .addFunction ("muted", &MuteControl::muted)
+ .addFunction ("muted_by_self", &MuteControl::muted_by_self)
+ .endClass ()
+
+ .deriveWSPtrClass <SoloIsolateControl, SlavableAutomationControl> ("SoloIsolateControl")
+ .addFunction ("solo_isolated", &SoloIsolateControl::solo_isolated)
+ .addFunction ("self_solo_isolated", &SoloIsolateControl::self_solo_isolated)
+ .endClass ()
+
+ .deriveWSPtrClass <SoloSafeControl, SlavableAutomationControl> ("SoloSafeControl")
+ .addFunction ("solo_safe", &SoloSafeControl::solo_safe)
+ .endClass ()
+
+ .deriveWSPtrClass <Amp, Processor> ("Amp")
+ .addFunction ("gain_control", (boost::shared_ptr<GainControl>(Amp::*)())&Amp::gain_control)
+ .endClass ()
+
+ .deriveWSPtrClass <UnknownProcessor, Processor> ("UnknownProcessor")
+ .endClass ()
+
+ .deriveWSPtrClass <PluginInsert::PluginControl, AutomationControl> ("PluginControl")
+ .endClass ()
+
+ .deriveWSPtrClass <AudioSource, Source> ("AudioSource")
+ .addFunction ("readable_length", &AudioSource::readable_length)
+ .addFunction ("n_channels", &AudioSource::n_channels)
+ .endClass ()
+
+ // <std::list<boost::shared_ptr <AudioTrack> >
+ .beginStdList <boost::shared_ptr<AudioTrack> > ("AudioTrackList")
+ .endClass ()
+
+ // std::list<boost::shared_ptr <MidiTrack> >
+ .beginStdList <boost::shared_ptr<MidiTrack> > ("MidiTrackList")
+ .endClass ()
+
+ // RouteList == std::list<boost::shared_ptr<Route> >
+ .beginConstStdList <boost::shared_ptr<Route> > ("RouteList")
+ .endClass ()
+
+ // boost::shared_ptr<RouteList>
+ .beginPtrStdList <boost::shared_ptr<Route> > ("RouteListPtr")
+ .endClass ()
+
+ // typedef std::list<boost::weak_ptr <Route> > WeakRouteList
+ .beginConstStdList <boost::weak_ptr<Route> > ("WeakRouteList")
+ .endClass ()
+
+ // std::list< boost::weak_ptr <AudioSource> >
+ .beginConstStdList <boost::weak_ptr<AudioSource> > ("WeakAudioSourceList")
+ .endClass ()
+
+ // typedef std::list<boost::shared_ptr<Region> > RegionList
+ .beginConstStdList <boost::shared_ptr<Region> > ("RegionList")
+ .endClass ()
+
+ // boost::shared_ptr <std::list<boost::shared_ptr<Region> > >
+ .beginPtrStdList <boost::shared_ptr<Region> > ("RegionListPtr")
+ .endClass ()
+
+ //std::list<boost::shared_ptr<Port> > PortList;
+ .beginConstStdList <boost::shared_ptr<Port> > ("PortList")
+ .endClass ()
+
+ // used by Playlist::cut/copy
+ .beginConstStdList <AudioRange> ("AudioRangeList")
+ .endClass ()
+
+ .beginConstStdList <Location*> ("LocationList")
+ .endClass ()
+
+#if 0 // depends on Evoal:: Note, Beats see note_fixer.h
+ // typedef Evoral::Note<Evoral::Beats> Note;
+ // std::set< boost::weak_ptr<Note> >
+ .beginStdSet <boost::weak_ptr<Note> > ("WeakNoteSet")
+ .endClass ()
+#endif
+
+ // std::list<boost::weak_ptr<Source> >
+ .beginConstStdList <boost::weak_ptr<Source> > ("WeakSourceList")
+ .endClass ()
+
+ .beginClass <Tempo> ("Tempo")
+ .addConstructor <void (*) (double, double)> ()
+ .addFunction ("note_type", &Tempo::note_type)
+ .addFunction ("beats_per_minute", &Tempo::beats_per_minute)
+ .addFunction ("frames_per_beat", &Tempo::frames_per_beat)
+ .endClass ()
+
+ .beginClass <Meter> ("Meter")
+ .addConstructor <void (*) (double, double)> ()
+ .addFunction ("divisions_per_bar", &Meter::divisions_per_bar)
+ .addFunction ("note_divisor", &Meter::note_divisor)
+ .addFunction ("frames_per_bar", &Meter::frames_per_bar)
+ .addFunction ("frames_per_grid", &Meter::frames_per_grid)
+ .endClass ()
+
+ .beginClass <TempoMap> ("TempoMap")
+ .addFunction ("add_tempo", &TempoMap::add_tempo)
+ .addFunction ("add_meter", &TempoMap::add_meter)
+ .addFunction ("tempo_section_at_frame", &TempoMap::tempo_section_at_frame)
+ .addFunction ("meter_section_at_frame", &TempoMap::meter_section_at_frame)
+ .addFunction ("meter_section_at_beat", &TempoMap::meter_section_at_beat)
+ .endClass ()
+
+ .beginClass <MetricSection> ("MetricSection")
+ .addFunction ("pulse", &MetricSection::pulse)
+ .addFunction ("set_pulse", &MetricSection::set_pulse)
+ .endClass ()
+
+ .deriveClass <TempoSection, MetricSection> ("TempoSection")
+ .addFunction ("c_func", (double(TempoSection::*)()const)&TempoSection::c_func)
+ .endClass ()
+
+ .deriveClass <MeterSection, MetricSection> ("MeterSection")
+ .addCast<Meter> ("to_meter")
+ .addFunction ("set_pulse", &MeterSection::set_pulse)
+ .addFunction ("set_beat", (void(MeterSection::*)(double))&MeterSection::set_beat)
+ .endClass ()
+
+ .beginClass <ChanCount> ("ChanCount")
+ .addConstructor <void (*) (DataType, uint32_t)> ()
+ .addFunction ("get", &ChanCount::get)
+ .addFunction ("set", &ChanCount::set)
+ .addFunction ("n_audio", &ChanCount::n_audio)
+ .addFunction ("n_midi", &ChanCount::n_midi)
+ .addFunction ("n_total", &ChanCount::n_total)
+ .addFunction ("reset", &ChanCount::reset)
+ .endClass()
+
+ .beginClass <DataType> ("DataType")
+ .addConstructor <void (*) (std::string)> ()
+ .addStaticCFunction ("null", &LuaAPI::datatype_ctor_null) // "nil" is a lua reseved word
+ .addStaticCFunction ("audio", &LuaAPI::datatype_ctor_audio)
+ .addStaticCFunction ("midi", &LuaAPI::datatype_ctor_midi)
+ .addFunction ("to_string", &DataType::to_string) // TODO Lua __tostring
+ // TODO add uint32_t cast, add operator== !=
+ .endClass()
+
+ /* libardour enums */
+ .beginNamespace ("PluginType")
+ .addConst ("AudioUnit", ARDOUR::PluginType(AudioUnit))
+ .addConst ("LADSPA", ARDOUR::PluginType(LADSPA))
+ .addConst ("LV2", ARDOUR::PluginType(LV2))
+ .addConst ("Windows_VST", ARDOUR::PluginType(Windows_VST))
+ .addConst ("LXVST", ARDOUR::PluginType(LXVST))
+ .addConst ("Lua", ARDOUR::PluginType(Lua))
+ .endNamespace ()
+
+ .beginNamespace ("PresentationInfo")
+ .beginNamespace ("Flag")
+ .addConst ("AudioTrack", ARDOUR::PresentationInfo::Flag(PresentationInfo::AudioTrack))
+ .addConst ("MidiTrack", ARDOUR::PresentationInfo::Flag(PresentationInfo::MidiTrack))
+ .addConst ("AudioBus", ARDOUR::PresentationInfo::Flag(PresentationInfo::AudioBus))
+ .addConst ("MidiBus", ARDOUR::PresentationInfo::Flag(PresentationInfo::MidiBus))
+ .addConst ("VCA", ARDOUR::PresentationInfo::Flag(PresentationInfo::VCA))
+ .addConst ("MasterOut", ARDOUR::PresentationInfo::Flag(PresentationInfo::MasterOut))
+ .addConst ("MonitorOut", ARDOUR::PresentationInfo::Flag(PresentationInfo::MonitorOut))
+ .addConst ("Auditioner", ARDOUR::PresentationInfo::Flag(PresentationInfo::Auditioner))
+ .addConst ("Selected", ARDOUR::PresentationInfo::Flag(PresentationInfo::Selected))
+ .addConst ("Hidden", ARDOUR::PresentationInfo::Flag(PresentationInfo::Hidden))
+ .addConst ("GroupOrderSet", ARDOUR::PresentationInfo::Flag(PresentationInfo::OrderSet))
+ .addConst ("StatusMask", ARDOUR::PresentationInfo::Flag(PresentationInfo::StatusMask))
+ .endNamespace ()
+ .endNamespace ()
+
+ .beginNamespace ("AutoStyle")
+ .addConst ("Absolute", ARDOUR::AutoStyle(Absolute))
+ .addConst ("Trim", ARDOUR::AutoStyle(Trim))
+ .endNamespace ()
+
+ .beginNamespace ("AutoState")
+ .addConst ("Off", ARDOUR::AutoState(Off))
+ .addConst ("Write", ARDOUR::AutoState(Write))
+ .addConst ("Touch", ARDOUR::AutoState(Touch))
+ .addConst ("Play", ARDOUR::AutoState(Play))
+ .endNamespace ()
+
+ .beginNamespace ("AutomationType")
+ .addConst ("GainAutomation", ARDOUR::AutomationType(GainAutomation))
+ .addConst ("PluginAutomation", ARDOUR::AutomationType(PluginAutomation))
+ .addConst ("SoloAutomation", ARDOUR::AutomationType(SoloAutomation))
+ .addConst ("SoloIsolateAutomation", ARDOUR::AutomationType(SoloIsolateAutomation))
+ .addConst ("SoloSafeAutomation", ARDOUR::AutomationType(SoloSafeAutomation))
+ .addConst ("MuteAutomation", ARDOUR::AutomationType(MuteAutomation))
+ .addConst ("RecEnableAutomation", ARDOUR::AutomationType(RecEnableAutomation))
+ .addConst ("RecSafeAutomation", ARDOUR::AutomationType(RecSafeAutomation))
+ .addConst ("TrimAutomation", ARDOUR::AutomationType(TrimAutomation))
+ .addConst ("PhaseAutomation", ARDOUR::AutomationType(PhaseAutomation))
+ .endNamespace ()
+
+ .beginNamespace ("SrcQuality")
+ .addConst ("SrcBest", ARDOUR::SrcQuality(SrcBest))
+ .endNamespace ()
+
+ .beginNamespace ("PortFlags")
+ .addConst ("IsInput", ARDOUR::PortFlags(IsInput))
+ .addConst ("IsOutput", ARDOUR::PortFlags(IsOutput))
+ .addConst ("IsPhysical", ARDOUR::PortFlags(IsPhysical))
+ .addConst ("CanMonitor", ARDOUR::PortFlags(CanMonitor))
+ .addConst ("IsTerminal", ARDOUR::PortFlags(IsTerminal))
+ .endNamespace ()
+
+ .beginNamespace ("PlaylistDisposition")
+ .addConst ("CopyPlaylist", ARDOUR::PlaylistDisposition(CopyPlaylist))
+ .addConst ("NewPlaylist", ARDOUR::PlaylistDisposition(NewPlaylist))
+ .addConst ("SharePlaylist", ARDOUR::PlaylistDisposition(SharePlaylist))
+ .endNamespace ()
+
+ .beginNamespace ("RegionPoint")
+ .addConst ("Start", ARDOUR::RegionPoint(Start))
+ .addConst ("End", ARDOUR::RegionPoint(End))
+ .addConst ("SyncPoint", ARDOUR::RegionPoint(SyncPoint))
+ .endNamespace ()
+
+ .beginNamespace ("TempoSection")
+ .beginNamespace ("PositionLockStyle")
+ .addConst ("AudioTime", ARDOUR::PositionLockStyle(AudioTime))
+ .addConst ("MusicTime", ARDOUR::PositionLockStyle(MusicTime))
+ .endNamespace ()
+ .endNamespace ()
+
+ .beginNamespace ("TempoSection")
+ .beginNamespace ("Type")
+ .addConst ("Ramp", ARDOUR::TempoSection::Type(TempoSection::Ramp))
+ .addConst ("Constant", ARDOUR::TempoSection::Type(TempoSection::Constant))
+ .endNamespace ()
+ .endNamespace ()
+
+ .beginNamespace ("TrackMode")
+ .addConst ("Normal", ARDOUR::TrackMode(Start))
+ .addConst ("NonLayered", ARDOUR::TrackMode(NonLayered))
+ .addConst ("Destructive", ARDOUR::TrackMode(Destructive))
+ .endNamespace ()
+ .endNamespace (); // end ARDOUR
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+ .beginClass <AudioBackendInfo> ("AudioBackendInfo")
+ .addData ("name", &AudioBackendInfo::name)
+ .endClass()
+ .beginStdVector <const AudioBackendInfo*> ("BackendVector").endClass ()
+
+ .beginClass <AudioBackend::DeviceStatus> ("DeviceStatus")
+ .addData ("name", &AudioBackend::DeviceStatus::name)
+ .addData ("available", &AudioBackend::DeviceStatus::available)
+ .endClass()
+ .beginStdVector <AudioBackend::DeviceStatus> ("DeviceStatusVector").endClass ()
+
+ .beginWSPtrClass <AudioBackend> ("AudioBackend")
+ .addFunction ("info", &AudioBackend::info)
+ .addFunction ("sample_rate", &AudioBackend::sample_rate)
+ .addFunction ("buffer_size", &AudioBackend::buffer_size)
+ .addFunction ("period_size", &AudioBackend::period_size)
+ .addFunction ("input_channels", &AudioBackend::input_channels)
+ .addFunction ("output_channels", &AudioBackend::output_channels)
+ .addFunction ("dsp_load", &AudioBackend::dsp_load)
+
+ .addFunction ("set_sample_rate", &AudioBackend::set_sample_rate)
+ .addFunction ("set_buffer_size", &AudioBackend::set_buffer_size)
+ .addFunction ("set_peridod_size", &AudioBackend::set_peridod_size)
+
+ .addFunction ("enumerate_drivers", &AudioBackend::enumerate_drivers)
+ .addFunction ("driver_name", &AudioBackend::driver_name)
+ .addFunction ("set_driver", &AudioBackend::set_driver)
+
+ .addFunction ("use_separate_input_and_output_devices", &AudioBackend::use_separate_input_and_output_devices)
+ .addFunction ("enumerate_devices", &AudioBackend::enumerate_devices)
+ .addFunction ("enumerate_input_devices", &AudioBackend::enumerate_input_devices)
+ .addFunction ("enumerate_output_devices", &AudioBackend::enumerate_output_devices)
+ .addFunction ("device_name", &AudioBackend::device_name)
+ .addFunction ("input_device_name", &AudioBackend::input_device_name)
+ .addFunction ("output_device_name", &AudioBackend::output_device_name)
+ .addFunction ("set_device_name", &AudioBackend::set_device_name)
+ .addFunction ("set_input_device_name", &AudioBackend::set_input_device_name)
+ .addFunction ("set_output_device_name", &AudioBackend::set_output_device_name)
+ .endClass()
+
+ .beginClass <PortEngine> ("PortEngine")
+ .endClass()
+
+ .beginClass <PortManager> ("PortManager")
+ .addFunction ("port_engine", &PortManager::port_engine)
+ .addFunction ("connected", &PortManager::connected)
+ .addFunction ("connect", &PortManager::connect)
+ .addFunction ("physically_connected", &PortManager::physically_connected)
+ .addFunction ("disconnect", (int (PortManager::*)(const std::string&, const std::string&))&PortManager::disconnect)
+ .addFunction ("disconnect_port", (int (PortManager::*)(boost::shared_ptr<Port>))&PortManager::disconnect)
+ .addFunction ("get_port_by_name", &PortManager::get_port_by_name)
+ .addFunction ("get_pretty_name_by_name", &PortManager::get_pretty_name_by_name)
+ .addFunction ("port_is_physical", &PortManager::port_is_physical)
+ .addFunction ("get_physical_outputs", &PortManager::get_physical_outputs)
+ .addFunction ("get_physical_inputs", &PortManager::get_physical_inputs)
+ .addFunction ("n_physical_outputs", &PortManager::n_physical_outputs)
+ .addFunction ("n_physical_inputs", &PortManager::n_physical_inputs)
+ .addRefFunction ("get_connections", &PortManager::get_connections)
+ .addRefFunction ("get_ports", (int (PortManager::*)(DataType, PortManager::PortList&))&PortManager::get_ports)
+ .addRefFunction ("get_backend_ports", (int (PortManager::*)(const std::string&, DataType, PortFlags, std::vector<std::string>&))&PortManager::get_ports)
+ .endClass()
+
+ .deriveClass <AudioEngine, PortManager> ("AudioEngine")
+ .addFunction ("available_backends", &AudioEngine::available_backends)
+ .addFunction ("current_backend_name", &AudioEngine::current_backend_name)
+ .addFunction ("set_backend", &AudioEngine::set_backend)
+ .addFunction ("setup_required", &AudioEngine::setup_required)
+ .addFunction ("start", &AudioEngine::start)
+ .addFunction ("stop", &AudioEngine::stop)
+ .addFunction ("get_dsp_load", &AudioEngine::get_dsp_load)
+ .addFunction ("set_device_name", &AudioEngine::set_device_name)
+ .addFunction ("set_sample_rate", &AudioEngine::set_sample_rate)
+ .addFunction ("set_buffer_size", &AudioEngine::set_buffer_size)
+ .addFunction ("get_last_backend_error", &AudioEngine::get_last_backend_error)
+ .endClass()
+ .endNamespace ();
+
+ // basic representation of Session
+ // functions which can be used from realtime and non-realtime contexts
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+ .beginClass <Session> ("Session")
+ .addFunction ("scripts_changed", &Session::scripts_changed) // used internally
+ .addFunction ("transport_rolling", &Session::transport_rolling)
+ .addFunction ("request_transport_speed", &Session::request_transport_speed)
+ .addFunction ("transport_frame", &Session::transport_frame)
+ .addFunction ("transport_speed", &Session::transport_speed)
+ .addFunction ("frame_rate", &Session::frame_rate)
+ .addFunction ("nominal_frame_rate", &Session::nominal_frame_rate)
+ .addFunction ("frames_per_timecode_frame", &Session::frames_per_timecode_frame)
+ .addFunction ("timecode_frames_per_hour", &Session::timecode_frames_per_hour)
+ .addFunction ("timecode_frames_per_second", &Session::timecode_frames_per_second)
+ .addFunction ("timecode_drop_frames", &Session::timecode_drop_frames)
+ .addFunction ("request_locate", &Session::request_locate)
+ .addFunction ("request_stop", &Session::request_stop)
+ .addFunction ("last_transport_start", &Session::last_transport_start)
+ .addFunction ("goto_start", &Session::goto_start)
+ .addFunction ("goto_end", &Session::goto_end)
+ .addFunction ("current_start_frame", &Session::current_start_frame)
+ .addFunction ("current_end_frame", &Session::current_end_frame)
+ .addFunction ("actively_recording", &Session::actively_recording)
+ .addFunction ("new_audio_track", &Session::new_audio_track)
+ .addFunction ("new_audio_route", &Session::new_audio_route)
+ .addFunction ("new_midi_track", &Session::new_midi_track)
+ .addFunction ("new_midi_route", &Session::new_midi_route)
+ .addFunction ("get_routes", &Session::get_routes)
+ .addFunction ("get_tracks", &Session::get_tracks)
+ .addFunction ("name", &Session::name)
+ .addFunction ("path", &Session::path)
+ .addFunction ("record_status", &Session::record_status)
+ .addFunction ("route_by_id", &Session::route_by_id)
+ .addFunction ("route_by_name", &Session::route_by_name)
+ .addFunction ("get_remote_nth_stripable", &Session::get_remote_nth_stripable)
+ .addFunction ("get_remote_nth_route", &Session::get_remote_nth_route)
+ .addFunction ("route_by_selected_count", &Session::route_by_selected_count)
+ .addFunction ("track_by_diskstream_id", &Session::track_by_diskstream_id)
+ .addFunction ("source_by_id", &Session::source_by_id)
+ .addFunction ("controllable_by_id", &Session::controllable_by_id)
+ .addFunction ("processor_by_id", &Session::processor_by_id)
+ .addFunction ("snap_name", &Session::snap_name)
+ .addFunction ("monitor_out", &Session::monitor_out)
+ .addFunction ("master_out", &Session::master_out)
+ .addFunction ("tempo_map", (TempoMap& (Session::*)())&Session::tempo_map)
+ .addFunction ("locations", &Session::locations)
+ .addFunction ("begin_reversible_command", (void (Session::*)(const std::string&))&Session::begin_reversible_command)
+ .addFunction ("commit_reversible_command", &Session::commit_reversible_command)
+ .addFunction ("abort_reversible_command", &Session::abort_reversible_command)
+ .addFunction ("add_command", &Session::add_command)
+ .addFunction ("add_stateful_diff_command", &Session::add_stateful_diff_command)
+ .addFunction ("engine", (AudioEngine& (Session::*)())&Session::engine)
+ .addFunction ("get_block_size", &Session::get_block_size)
+ .addFunction ("worst_output_latency", &Session::worst_output_latency)
+ .addFunction ("worst_input_latency", &Session::worst_input_latency)
+ .addFunction ("worst_track_latency", &Session::worst_track_latency)
+ .addFunction ("worst_playback_latency", &Session::worst_playback_latency)
+ .endClass ()
+
+ .beginClass <RegionFactory> ("RegionFactory")
+ .addStaticFunction ("region_by_id", &RegionFactory::region_by_id)
+ .endClass ()
+
+ /* session enums (rt-safe, common) */
+ .beginNamespace ("Session")
+
+ .beginNamespace ("RecordState")
+ .addConst ("Disabled", ARDOUR::Session::RecordState(Session::Disabled))
+ .addConst ("Enabled", ARDOUR::Session::RecordState(Session::Enabled))
+ .addConst ("Recording", ARDOUR::Session::RecordState(Session::Recording))
+ .endNamespace ()
+
+ .endNamespace () // end Session enums
+
+ /* ardour enums (rt-safe, common) */
+ .beginNamespace ("LocationFlags")
+ .addConst ("IsMark", ARDOUR::Location::Flags(Location::IsMark))
+ .addConst ("IsAutoPunch", ARDOUR::Location::Flags(Location::IsAutoPunch))
+ .addConst ("IsAutoLoop", ARDOUR::Location::Flags(Location::IsAutoLoop))
+ .addConst ("IsHidden", ARDOUR::Location::Flags(Location::IsHidden))
+ .addConst ("IsCDMarker", ARDOUR::Location::Flags(Location::IsCDMarker))
+ .addConst ("IsRangeMarker", ARDOUR::Location::Flags(Location::IsRangeMarker))
+ .addConst ("IsSessionRange", ARDOUR::Location::Flags(Location::IsSessionRange))
+ .addConst ("IsSkip", ARDOUR::Location::Flags(Location::IsSkip))
+ .addConst ("IsSkipping", ARDOUR::Location::Flags(Location::IsSkipping))
+ .endNamespace ()
+
+ .beginNamespace ("LuaAPI")
+ .addFunction ("nil_proc", ARDOUR::LuaAPI::nil_processor)
+ .addFunction ("new_luaproc", ARDOUR::LuaAPI::new_luaproc)
+ .addFunction ("new_plugin_info", ARDOUR::LuaAPI::new_plugin_info)
+ .addFunction ("new_plugin", ARDOUR::LuaAPI::new_plugin)
+ .addFunction ("set_processor_param", ARDOUR::LuaAPI::set_processor_param)
+ .addFunction ("set_plugin_insert_param", ARDOUR::LuaAPI::set_plugin_insert_param)
+ .addCFunction ("plugin_automation", ARDOUR::LuaAPI::plugin_automation)
+ .addCFunction ("hsla_to_rgba", ARDOUR::LuaAPI::hsla_to_rgba)
+ .addFunction ("usleep", Glib::usleep)
+ .endNamespace () // end LuaAPI
+ .endNamespace ();// end ARDOUR
+}
+
+void
+LuaBindings::dsp (lua_State* L)
+{
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+
+ .beginClass <AudioBuffer> ("AudioBuffer")
+ .addEqualCheck ()
+ .addFunction ("data", (Sample*(AudioBuffer::*)(framecnt_t))&AudioBuffer::data)
+ .addFunction ("silence", &AudioBuffer::silence)
+ .addFunction ("apply_gain", &AudioBuffer::apply_gain)
+ .addFunction ("check_silence", &AudioBuffer::check_silence)
+ .addFunction ("read_from", (void (AudioBuffer::*)(const Sample*, framecnt_t, framecnt_t, framecnt_t))&AudioBuffer::check_silence)
+ .endClass()
+
+ .beginClass <MidiBuffer> ("MidiBuffer")
+ .addEqualCheck ()
+ .addFunction ("silence", &MidiBuffer::silence)
+ .addFunction ("size", &MidiBuffer::size)
+ .addFunction ("empty", &MidiBuffer::empty)
+ .addFunction ("resize", &MidiBuffer::resize)
+ .addFunction ("copy", (void (MidiBuffer::*)(MidiBuffer const * const))&MidiBuffer::copy)
+ .addFunction ("push_event", (bool (MidiBuffer::*)(const Evoral::MIDIEvent<framepos_t>&))&MidiBuffer::push_back)
+ .addFunction ("push_back", (bool (MidiBuffer::*)(framepos_t, size_t, const uint8_t*))&MidiBuffer::push_back)
+ // TODO iterators..
+ .addExtCFunction ("table", &luabridge::CFunc::listToTable<const Evoral::MIDIEvent<framepos_t>, MidiBuffer>)
+ .endClass()
+
+ .beginClass <BufferSet> ("BufferSet")
+ .addEqualCheck ()
+ .addFunction ("get_audio", static_cast<AudioBuffer&(BufferSet::*)(size_t)>(&BufferSet::get_audio))
+ .addFunction ("get_midi", static_cast<MidiBuffer&(BufferSet::*)(size_t)>(&BufferSet::get_midi))
+ .addFunction ("count", static_cast<const ChanCount&(BufferSet::*)()const>(&BufferSet::count))
+ .endClass()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Evoral")
+ .beginClass <Evoral::Event<framepos_t> > ("Event")
+ .addFunction ("clear", &Evoral::Event<framepos_t>::clear)
+ .addFunction ("size", &Evoral::Event<framepos_t>::size)
+ .addFunction ("set_buffer", &Evoral::Event<framepos_t>::set_buffer)
+ .addFunction ("buffer", (uint8_t*(Evoral::Event<framepos_t>::*)())&Evoral::Event<framepos_t>::buffer)
+ .addFunction ("time", (framepos_t (Evoral::Event<framepos_t>::*)())&Evoral::MIDIEvent<framepos_t>::time)
+ .endClass ()
+
+ .beginClass <Evoral::Beats> ("Beats")
+ .addFunction ("to_double", &Evoral::Beats::to_double)
+ .endClass ()
+
+ .deriveClass <Evoral::MIDIEvent<framepos_t>, Evoral::Event<framepos_t> > ("MidiEvent")
+ // add Ctor?
+ .addFunction ("type", &Evoral::MIDIEvent<framepos_t>::type)
+ .addFunction ("channel", &Evoral::MIDIEvent<framepos_t>::channel)
+ .addFunction ("set_type", &Evoral::MIDIEvent<framepos_t>::set_type)
+ .addFunction ("set_channel", &Evoral::MIDIEvent<framepos_t>::set_channel)
+ .endClass ()
+ .endNamespace ();
+
+ // dsp releated session functions
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+ .beginClass <Session> ("Session")
+ .addFunction ("get_scratch_buffers", &Session::get_scratch_buffers)
+ .addFunction ("get_silent_buffers", &Session::get_silent_buffers)
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+ .beginNamespace ("DSP")
+ .addFunction ("compute_peak", ARDOUR::compute_peak)
+ .addFunction ("find_peaks", ARDOUR::find_peaks)
+ .addFunction ("apply_gain_to_buffer", ARDOUR::apply_gain_to_buffer)
+ .addFunction ("mix_buffers_no_gain", ARDOUR::mix_buffers_no_gain)
+ .addFunction ("mix_buffers_with_gain", ARDOUR::mix_buffers_with_gain)
+ .addFunction ("copy_vector", ARDOUR::copy_vector)
+ .addFunction ("dB_to_coefficient", &dB_to_coefficient)
+ .addFunction ("fast_coefficient_to_dB", &fast_coefficient_to_dB)
+ .addFunction ("accurate_coefficient_to_dB", &accurate_coefficient_to_dB)
+ .addFunction ("memset", &DSP::memset)
+ .addFunction ("mmult", &DSP::mmult)
+ .addFunction ("log_meter", &DSP::log_meter)
+ .addFunction ("log_meter_coeff", &DSP::log_meter_coeff)
+ .addFunction ("process_map", &DSP::process_map)
+ .addRefFunction ("peaks", &DSP::peaks)
+
+ .beginClass <DSP::LowPass> ("LowPass")
+ .addConstructor <void (*) (double, float)> ()
+ .addFunction ("proc", &DSP::LowPass::proc)
+ .addFunction ("ctrl", &DSP::LowPass::ctrl)
+ .addFunction ("set_cutoff", &DSP::LowPass::set_cutoff)
+ .addFunction ("reset", &DSP::LowPass::reset)
+ .endClass ()
+ .beginClass <DSP::Biquad> ("Biquad")
+ .addConstructor <void (*) (double)> ()
+ .addFunction ("run", &DSP::Biquad::run)
+ .addFunction ("compute", &DSP::Biquad::compute)
+ .addFunction ("configure", &DSP::Biquad::configure)
+ .addFunction ("reset", &DSP::Biquad::reset)
+ .addFunction ("dB_at_freq", &DSP::Biquad::dB_at_freq)
+ .endClass ()
+ .beginClass <DSP::FFTSpectrum> ("FFTSpectrum")
+ .addConstructor <void (*) (uint32_t, double)> ()
+ .addFunction ("set_data_hann", &DSP::FFTSpectrum::set_data_hann)
+ .addFunction ("execute", &DSP::FFTSpectrum::execute)
+ .addFunction ("power_at_bin", &DSP::FFTSpectrum::power_at_bin)
+ .addFunction ("freq_at_bin", &DSP::FFTSpectrum::freq_at_bin)
+ .endClass ()
+
+ /* DSP enums */
+ .beginNamespace ("BiquadType")
+ .addConst ("LowPass", ARDOUR::DSP::Biquad::LowPass)
+ .addConst ("HighPass", ARDOUR::DSP::Biquad::HighPass)
+ .addConst ("BandPassSkirt", ARDOUR::DSP::Biquad::BandPassSkirt)
+ .addConst ("BandPass0dB", ARDOUR::DSP::Biquad::BandPass0dB)
+ .addConst ("Notch", ARDOUR::DSP::Biquad::Notch)
+ .addConst ("AllPass", ARDOUR::DSP::Biquad::AllPass)
+ .addConst ("Peaking", ARDOUR::DSP::Biquad::Peaking)
+ .addConst ("LowShelf", ARDOUR::DSP::Biquad::LowShelf)
+ .addConst ("HighShelf", ARDOUR::DSP::Biquad::HighShelf)
+ .endNamespace ()
+
+ .beginClass <DSP::DspShm> ("DspShm")
+ .addConstructor<void (*) (size_t)> ()
+ .addFunction ("allocate", &DSP::DspShm::allocate)
+ .addFunction ("clear", &DSP::DspShm::clear)
+ .addFunction ("to_float", &DSP::DspShm::to_float)
+ .addFunction ("to_int", &DSP::DspShm::to_int)
+ .addFunction ("atomic_set_int", &DSP::DspShm::atomic_set_int)
+ .addFunction ("atomic_get_int", &DSP::DspShm::atomic_get_int)
+ .endClass ()
+
+ .endNamespace () // DSP
+
+ .beginClass <LuaTableRef> ("LuaTableRef")
+ .addCFunction ("get", &LuaTableRef::get)
+ .addCFunction ("set", &LuaTableRef::set)
+ .endClass ()
+
+ .endNamespace (); // ARDOUR
+}
+
+void
+LuaBindings::session (lua_State* L)
+{
+ // non-realtime session functions
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+ .beginClass <Session> ("Session")
+ .addFunction ("save_state", &Session::save_state)
+ .addFunction ("set_dirty", &Session::set_dirty)
+ .addFunction ("unknown_processors", &Session::unknown_processors)
+
+ .addFunction<RouteList (Session::*)(uint32_t, const std::string&, const std::string&, PlaylistDisposition)> ("new_route_from_template", &Session::new_route_from_template)
+ // TODO session_add_audio_track session_add_midi_track session_add_mixed_track
+ //.addFunction ("new_midi_track", &Session::new_midi_track)
+ .endClass ()
+
+ .endNamespace (); // ARDOUR
+}
+
+void
+LuaBindings::osc (lua_State* L)
+{
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+ .beginNamespace ("LuaOSC")
+ .beginClass<LuaOSC::Address> ("Address")
+ .addConstructor<void (*) (std::string)> ()
+ .addCFunction ("send", &LuaOSC::Address::send)
+ .endClass ()
+ .endNamespace ()
+ .endNamespace ();
+}
+
+void
+LuaBindings::set_session (lua_State* L, Session *s)
+{
+ /* LuaBridge uses unique keys to identify classes/c-types.
+ *
+ * Those keys are "generated" by using the memory-address of a static
+ * variable, templated for every Class.
+ * (see libs/lua/LuaBridge/detail/ClassInfo.h)
+ *
+ * When linking the final executable there must be exactly one static
+ * function (static variable) for every templated class.
+ * This works fine on OSX and Linux...
+ *
+ * Windows (mingw and MSVC) however expand the template differently for libardour
+ * AND gtk2_ardour. We end up with two identical static functions
+ * at different addresses!!
+ *
+ * The Solution: have gtk2_ardour never include LuaBridge headers directly
+ * and always go via libardour function calls for classes that are registered
+ * in libardour. (calling lua itself is fine, calling c-functions in the GUI
+ * which expand the template is not)
+ *
+ * (the actual cause: even static symbols in a .dll have no fixed address
+ * and are mapped when loading the dll. static functions in .exe do have a fixed
+ * address)
+ *
+ * libardour:
+ * 0000000000000000 I __imp__ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+ * 0000000000000000 I __nm__ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+ * 0000000000000000 T _ZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEv
+ *
+ * ardour.exe
+ * 000000000104f560 d .data$_ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+ * 000000000104f560 D _ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+ * 0000000000e9baf0 T _ZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEv
+ *
+ *
+ */
+ luabridge::push <Session *> (L, s);
+ lua_setglobal (L, "Session");
+
+ if (s) {
+ // call lua function.
+ luabridge::LuaRef cb_ses = luabridge::getGlobal (L, "new_session");
+ if (cb_ses.type() == LUA_TFUNCTION) { cb_ses(s->name()); } // TODO args
+ }
+}
diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc
new file mode 100644
index 0000000..fbba74b
--- /dev/null
+++ b/libs/ardour/luaproc.cc
@@ -0,0 +1,1251 @@
+/*
+ Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ Copyright (C) 2006 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <glib.h>
+#include <glibmm/miscutils.h>
+#include <glibmm/fileutils.h>
+
+#include "pbd/gstdio_compat.h"
+#include "pbd/locale_guard.h"
+#include "pbd/pthread_utils.h"
+
+#include "ardour/audio_buffer.h"
+#include "ardour/buffer_set.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/luabindings.h"
+#include "ardour/luaproc.h"
+#include "ardour/luascripting.h"
+#include "ardour/midi_buffer.h"
+#include "ardour/plugin.h"
+#include "ardour/session.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+LuaProc::LuaProc (AudioEngine& engine,
+ Session& session,
+ const std::string &script)
+ : Plugin (engine, session)
+ , _mempool ("LuaProc", 2097152)
+#ifdef USE_TLSF
+ , lua (lua_newstate (&PBD::TLSF::lalloc, &_mempool))
+#elif defined USE_MALLOC
+ , lua ()
+#else
+ , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
+#endif
+ , _lua_dsp (0)
+ , _script (script)
+ , _lua_does_channelmapping (false)
+ , _lua_has_inline_display (false)
+ , _designated_bypass_port (UINT32_MAX)
+ , _control_data (0)
+ , _shadow_data (0)
+ , _has_midi_input (false)
+ , _has_midi_output (false)
+{
+ init ();
+
+ /* when loading a session, or pasing a processor,
+ * the script is set during set_state();
+ */
+ if (!_script.empty () && load_script ()) {
+ throw failed_constructor ();
+ }
+}
+
+LuaProc::LuaProc (const LuaProc &other)
+ : Plugin (other)
+ , _mempool ("LuaProc", 2097152)
+#ifdef USE_TLSF
+ , lua (lua_newstate (&PBD::TLSF::lalloc, &_mempool))
+#elif defined USE_MALLOC
+ , lua ()
+#else
+ , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
+#endif
+ , _lua_dsp (0)
+ , _script (other.script ())
+ , _lua_does_channelmapping (false)
+ , _lua_has_inline_display (false)
+ , _designated_bypass_port (UINT32_MAX)
+ , _control_data (0)
+ , _shadow_data (0)
+ , _has_midi_input (false)
+ , _has_midi_output (false)
+{
+ init ();
+
+ if (load_script ()) {
+ throw failed_constructor ();
+ }
+
+ for (uint32_t i = 0; i < parameter_count (); ++i) {
+ _control_data[i] = other._shadow_data[i];
+ _shadow_data[i] = other._shadow_data[i];
+ }
+}
+
+LuaProc::~LuaProc () {
+#ifdef WITH_LUAPROC_STATS
+ if (_info && _stats_cnt > 0) {
+ printf ("LuaProc: '%s' run() avg: %.3f max: %.3f [ms]\n",
+ _info->name.c_str (),
+ 0.0001f * _stats_avg[0] / (float) _stats_cnt,
+ 0.0001f * _stats_max[0]);
+ printf ("LuaProc: '%s' gc() avg: %.3f max: %.3f [ms]\n",
+ _info->name.c_str (),
+ 0.0001f * _stats_avg[1] / (float) _stats_cnt,
+ 0.0001f * _stats_max[1]);
+ }
+#endif
+ lua.do_command ("collectgarbage();");
+ delete (_lua_dsp);
+ delete [] _control_data;
+ delete [] _shadow_data;
+}
+
+void
+LuaProc::init ()
+{
+#ifdef WITH_LUAPROC_STATS
+ _stats_avg[0] = _stats_avg[1] = _stats_max[0] = _stats_max[1] = _stats_cnt = 0;
+#endif
+
+ lua.tweak_rt_gc ();
+ lua.Print.connect (sigc::mem_fun (*this, &LuaProc::lua_print));
+ // register session object
+ lua_State* L = lua.getState ();
+ LuaBindings::stddef (L);
+ LuaBindings::common (L);
+ LuaBindings::dsp (L);
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Ardour")
+ .beginClass <LuaProc> ("LuaProc")
+ .addFunction ("queue_draw", &LuaProc::queue_draw)
+ .addFunction ("shmem", &LuaProc::instance_shm)
+ .addFunction ("table", &LuaProc::instance_ref)
+ .endClass ()
+ .endNamespace ();
+
+ // add session to global lua namespace
+ luabridge::push <Session *> (L, &_session);
+ lua_setglobal (L, "Session");
+
+ // instance
+ luabridge::push <LuaProc *> (L, this);
+ lua_setglobal (L, "self");
+
+ // sandbox
+ lua.do_command ("io = nil os = nil loadfile = nil require = nil dofile = nil package = nil debug = nil");
+#if 0
+ lua.do_command ("for n in pairs(_G) do print(n) end print ('----')"); // print global env
+#endif
+ lua.do_command ("function ardour () end");
+}
+
+void
+LuaProc::lua_print (std::string s) {
+ std::cout <<"LuaProc: " << s << "\n";
+ PBD::error << "LuaProc: " << s << "\n";
+}
+
+bool
+LuaProc::load_script ()
+{
+ assert (!_lua_dsp); // don't allow to re-initialize
+ LuaPluginInfoPtr lpi;
+
+ // TODO: refine APIs; function arguments..
+ // - perform channel-map in ardour (silent/scratch buffers) ?
+ // - control-port API (explicit get/set functions ??)
+ // - latency reporting (global var? ctrl-port? set-function ?)
+ // - MIDI -> sparse table of events
+ // { [sample] => { Event }, .. }
+ // or { { sample, Event }, .. }
+
+ try {
+ LuaScriptInfoPtr lsi = LuaScripting::script_info (_script);
+ lpi = LuaPluginInfoPtr (new LuaPluginInfo (lsi));
+ assert (lpi);
+ set_info (lpi);
+ _mempool.set_name ("LuaProc: " + lsi->name);
+ _docs = lsi->description;
+ } catch (failed_constructor& err) {
+ return true;
+ }
+
+ lua_State* L = lua.getState ();
+ lua.do_command (_script);
+
+ // check if script has a DSP callback
+ luabridge::LuaRef lua_dsp_run = luabridge::getGlobal (L, "dsp_run");
+ luabridge::LuaRef lua_dsp_map = luabridge::getGlobal (L, "dsp_runmap");
+
+ if ((lua_dsp_run.type () != LUA_TFUNCTION) == (lua_dsp_map.type () != LUA_TFUNCTION)) {
+ return true;
+ }
+
+ if (lua_dsp_run.type () == LUA_TFUNCTION) {
+ _lua_dsp = new luabridge::LuaRef (lua_dsp_run);
+ }
+ else if (lua_dsp_map.type () == LUA_TFUNCTION) {
+ _lua_dsp = new luabridge::LuaRef (lua_dsp_map);
+ _lua_does_channelmapping = true;
+ }
+ else {
+ assert (0);
+ }
+
+ // initialize the DSP if needed
+ luabridge::LuaRef lua_dsp_init = luabridge::getGlobal (L, "dsp_init");
+ if (lua_dsp_init.type () == LUA_TFUNCTION) {
+ try {
+ lua_dsp_init (_session.nominal_frame_rate ());
+ } catch (luabridge::LuaException const& e) {
+ ;
+ }
+ }
+
+ _ctrl_params.clear ();
+
+ luabridge::LuaRef lua_render = luabridge::getGlobal (L, "render_inline");
+ if (lua_render.isFunction ()) {
+ _lua_has_inline_display = true;
+ }
+
+ luabridge::LuaRef lua_params = luabridge::getGlobal (L, "dsp_params");
+ if (lua_params.isFunction ()) {
+
+ // call function // add try {} catch (luabridge::LuaException const& e)
+ luabridge::LuaRef params = lua_params ();
+
+ if (params.isTable ()) {
+
+ for (luabridge::Iterator i (params); !i.isNil (); ++i) {
+ // required fields
+ if (!i.key ().isNumber ()) { return false; }
+ if (!i.value ().isTable ()) { return false; }
+ if (!i.value ()["type"].isString ()) { return false; }
+ if (!i.value ()["name"].isString ()) { return false; }
+ if (!i.value ()["min"].isNumber ()) { return false; }
+ if (!i.value ()["max"].isNumber ()) { return false; }
+
+ int pn = i.key ().cast<int> ();
+ std::string type = i.value ()["type"].cast<std::string> ();
+ if (type == "input") {
+ if (!i.value ()["default"].isNumber ()) { return false; }
+ _ctrl_params.push_back (std::make_pair (false, pn));
+ }
+ else if (type == "output") {
+ _ctrl_params.push_back (std::make_pair (true, pn));
+ } else {
+ return false;
+ }
+ assert (pn == (int) _ctrl_params.size ());
+
+ //_param_desc[pn] = boost::shared_ptr<ParameterDescriptor> (new ParameterDescriptor());
+ luabridge::LuaRef lr = i.value ();
+
+ if (type == "input") {
+ _param_desc[pn].normal = lr["default"].cast<float> ();
+ } else {
+ _param_desc[pn].normal = lr["min"].cast<float> (); // output-port, no default
+ }
+ _param_desc[pn].lower = lr["min"].cast<float> ();
+ _param_desc[pn].upper = lr["max"].cast<float> ();
+ _param_desc[pn].toggled = lr["toggled"].isBoolean () && (lr["toggled"]).cast<bool> ();
+ _param_desc[pn].logarithmic = lr["logarithmic"].isBoolean () && (lr["logarithmic"]).cast<bool> ();
+ _param_desc[pn].integer_step = lr["integer"].isBoolean () && (lr["integer"]).cast<bool> ();
+ _param_desc[pn].sr_dependent = lr["ratemult"].isBoolean () && (lr["ratemult"]).cast<bool> ();
+ _param_desc[pn].enumeration = lr["enum"].isBoolean () && (lr["enum"]).cast<bool> ();
+
+ if (lr["bypass"].isBoolean () && (lr["bypass"]).cast<bool> ()) {
+ _designated_bypass_port = pn - 1; // lua table starts at 1.
+ }
+
+ if (lr["unit"].isString ()) {
+ std::string unit = lr["unit"].cast<std::string> ();
+ if (unit == "dB") { _param_desc[pn].unit = ParameterDescriptor::DB; }
+ else if (unit == "Hz") { _param_desc[pn].unit = ParameterDescriptor::HZ; }
+ else if (unit == "Midi Note") { _param_desc[pn].unit = ParameterDescriptor::MIDI_NOTE; }
+ }
+ _param_desc[pn].label = (lr["name"]).cast<std::string> ();
+ _param_desc[pn].scale_points = parse_scale_points (&lr);
+
+ luabridge::LuaRef doc = lr["doc"];
+ if (doc.isString ()) {
+ _param_doc[pn] = doc.cast<std::string> ();
+ } else {
+ _param_doc[pn] = "";
+ }
+ assert (!(_param_desc[pn].toggled && _param_desc[pn].logarithmic));
+ }
+ }
+ }
+
+ _control_data = new float[parameter_count ()];
+ _shadow_data = new float[parameter_count ()];
+
+ for (uint32_t i = 0; i < parameter_count (); ++i) {
+ if (parameter_is_input (i)) {
+ _control_data[i] = _shadow_data[i] = default_value (i);
+ }
+ }
+
+ // expose ctrl-ports to global lua namespace
+ luabridge::push <float *> (L, _control_data);
+ lua_setglobal (L, "CtrlPorts");
+
+ return false; // no error
+}
+
+bool
+LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise)
+{
+ // caller must hold process lock (no concurrent calls to interpreter
+ _output_configs.clear ();
+
+ lua_State* L = lua.getState ();
+ luabridge::LuaRef ioconfig = luabridge::getGlobal (L, "dsp_ioconfig");
+
+ luabridge::LuaRef *_iotable = NULL; // can't use reference :(
+
+ if (ioconfig.isFunction ()) {
+ try {
+ luabridge::LuaRef iotable = ioconfig ();
+ if (iotable.isTable ()) {
+ _iotable = new luabridge::LuaRef (iotable);
+ }
+ } catch (luabridge::LuaException const& e) {
+ _iotable = NULL;
+ }
+ }
+
+ if (!_iotable) {
+ /* empty table as default */
+ luabridge::LuaRef iotable = luabridge::newTable(L);
+ _iotable = new luabridge::LuaRef (iotable);
+ }
+
+ // now we can reference it.
+ luabridge::LuaRef iotable (*_iotable);
+ delete _iotable;
+
+ if ((iotable).length () < 1) {
+ /* empty table as only config, to get default values */
+ luabridge::LuaRef ioconf = luabridge::newTable(L);
+ iotable[1] = ioconf;
+ }
+
+ const int audio_in = in.n_audio ();
+ const int midi_in = in.n_midi ();
+
+ // preferred setting (provided by plugin_insert)
+ const int preferred_out = out.n_audio ();
+ const int preferred_midiout = out.n_midi ();
+
+ int midi_out = -1;
+ int audio_out = -1;
+ float penalty = 9999;
+ bool found = false;
+
+#define FOUNDCFG_PENALTY(in, out, p) { \
+ _output_configs.insert (out); \
+ if (p < penalty) { \
+ audio_out = (out); \
+ midi_out = possible_midiout; \
+ if (imprecise) { \
+ imprecise->set (DataType::AUDIO, (in)); \
+ imprecise->set (DataType::MIDI, possible_midiin); \
+ } \
+ _has_midi_input = (possible_midiin > 0); \
+ _has_midi_output = (possible_midiout > 0); \
+ penalty = p; \
+ found = true; \
+ } \
+}
+
+#define FOUNDCFG_IMPRECISE(in, out) { \
+ const float p = fabsf ((float)(out) - preferred_out) * \
+ (((out) > preferred_out) ? 1.1 : 1) \
+ + fabsf ((float)possible_midiout - preferred_midiout) * \
+ ((possible_midiout - preferred_midiout) ? 0.6 : 0.5) \
+ + fabsf ((float)(in) - audio_in) * \
+ (((in) > audio_in) ? 275 : 250) \
+ + fabsf ((float)possible_midiin - midi_in) * \
+ ((possible_midiin - midi_in) ? 100 : 110); \
+ FOUNDCFG_PENALTY(in, out, p); \
+}
+
+#define FOUNDCFG(out) \
+ FOUNDCFG_IMPRECISE(audio_in, out)
+
+#define ANYTHINGGOES \
+ _output_configs.insert (0);
+
+#define UPTO(nch) { \
+ for (int n = 1; n < nch; ++n) { \
+ _output_configs.insert (n); \
+ } \
+}
+
+ if (imprecise) {
+ *imprecise = in;
+ }
+
+ for (luabridge::Iterator i (iotable); !i.isNil (); ++i) {
+ luabridge::LuaRef io (i.value ());
+ if (!io.isTable()) {
+ continue;
+ }
+
+ int possible_in = io["audio_in"].isNumber() ? io["audio_in"] : -1;
+ int possible_out = io["audio_out"].isNumber() ? io["audio_out"] : -1;
+ int possible_midiin = io["midi_in"].isNumber() ? io["midi_in"] : 0;
+ int possible_midiout = io["midi_out"].isNumber() ? io["midi_out"] : 0;
+
+ if (midi_in != possible_midiin && !imprecise) {
+ continue;
+ }
+
+ // exact match
+ if ((possible_in == audio_in) && (possible_out == preferred_out)) {
+ /* Set penalty so low that this output configuration
+ * will trump any other one */
+ FOUNDCFG_PENALTY(audio_in, preferred_out, -1);
+ }
+
+ if (possible_out == 0 && possible_midiout == 0) {
+ /* skip configurations with no output at all */
+ continue;
+ }
+
+ if (possible_in == -1 || possible_in == -2) {
+ /* wildcard for input */
+ if (possible_out == possible_in) {
+ /* either both -1 or both -2 (invalid and
+ * interpreted as both -1): out must match in */
+ FOUNDCFG (audio_in);
+ } else if (possible_out == -3 - possible_in) {
+ /* one is -1, the other is -2: any output configuration
+ * possible, pick what the insert prefers */
+ FOUNDCFG (preferred_out);
+ ANYTHINGGOES;
+ } else if (possible_out < -2) {
+ /* variable number of outputs up to -N,
+ * invalid if in == -2 but we accept it anyway */
+ FOUNDCFG (min (-possible_out, preferred_out));
+ UPTO (-possible_out)
+ } else {
+ /* exact number of outputs */
+ FOUNDCFG (possible_out);
+ }
+ }
+
+ if (possible_in < -2 || possible_in >= 0) {
+ /* specified number, exact or up to */
+ int desired_in;
+ if (possible_in >= 0) {
+ /* configuration can only match possible_in */
+ desired_in = possible_in;
+ } else {
+ /* configuration can match up to -possible_in */
+ desired_in = min (-possible_in, audio_in);
+ }
+ if (!imprecise && audio_in != desired_in) {
+ /* skip that configuration, it cannot match
+ * the required audio input count, and we
+ * cannot ask for change via \imprecise */
+ } else if (possible_out == -1 || possible_out == -2) {
+ /* any output configuration possible
+ * out == -2 is invalid, interpreted as out == -1.
+ * Really imprecise only if desired_in != audio_in */
+ FOUNDCFG_IMPRECISE (desired_in, preferred_out);
+ ANYTHINGGOES;
+ } else if (possible_out < -2) {
+ /* variable number of outputs up to -N
+ * not specified if in > 0, but we accept it anyway.
+ * Really imprecise only if desired_in != audio_in */
+ FOUNDCFG_IMPRECISE (desired_in, min (-possible_out, preferred_out));
+ UPTO (-possible_out)
+ } else {
+ /* exact number of outputs
+ * Really imprecise only if desired_in != audio_in */
+ FOUNDCFG_IMPRECISE (desired_in, possible_out);
+ }
+ }
+
+ }
+
+ if (!found) {
+ return false;
+ }
+
+ if (imprecise) {
+ _selected_in = *imprecise;
+ } else {
+ _selected_in = in;
+ }
+
+ out.set (DataType::MIDI, midi_out);
+ out.set (DataType::AUDIO, audio_out);
+ _selected_out = out;
+
+ return true;
+}
+
+bool
+LuaProc::configure_io (ChanCount in, ChanCount out)
+{
+ in.set (DataType::MIDI, _has_midi_input ? 1 : 0);
+ out.set (DataType::MIDI, _has_midi_output ? 1 : 0);
+
+ _info->n_inputs = _selected_in;
+ _info->n_outputs = _selected_out;
+
+ // configure the DSP if needed
+ if (in != _configured_in || out != _configured_out) {
+ lua_State* L = lua.getState ();
+ luabridge::LuaRef lua_dsp_configure = luabridge::getGlobal (L, "dsp_configure");
+ if (lua_dsp_configure.type () == LUA_TFUNCTION) {
+ try {
+ luabridge::LuaRef io = lua_dsp_configure (&in, &out);
+ if (io.isTable ()) {
+ ChanCount lin (_selected_in);
+ ChanCount lout (_selected_out);
+
+ if (io["audio_in"].type() == LUA_TNUMBER) {
+ const int c = io["audio_in"].cast<int> ();
+ if (c >= 0) {
+ lin.set (DataType::AUDIO, c);
+ }
+ }
+ if (io["audio_out"].type() == LUA_TNUMBER) {
+ const int c = io["audio_out"].cast<int> ();
+ if (c >= 0) {
+ lout.set (DataType::AUDIO, c);
+ }
+ }
+ if (io["midi_in"].type() == LUA_TNUMBER) {
+ const int c = io["midi_in"].cast<int> ();
+ if (c >= 0) {
+ lin.set (DataType::MIDI, c);
+ }
+ }
+ if (io["midi_out"].type() == LUA_TNUMBER) {
+ const int c = io["midi_out"].cast<int> ();
+ if (c >= 0) {
+ lout.set (DataType::MIDI, c);
+ }
+ }
+ _info->n_inputs = lin;
+ _info->n_outputs = lout;
+ }
+ } catch (luabridge::LuaException const& e) {
+ PBD::error << "LuaException: " << e.what () << "\n";
+#ifndef NDEBUG
+ std::cerr << "LuaException: " << e.what () << "\n";
+#endif
+ return false;
+ }
+ }
+ }
+
+ _configured_in = in;
+ _configured_out = out;
+
+ return true;
+}
+
+int
+LuaProc::connect_and_run (BufferSet& bufs,
+ framepos_t start, framepos_t end, double speed,
+ ChanMapping in, ChanMapping out,
+ pframes_t nframes, framecnt_t offset)
+{
+ if (!_lua_dsp) {
+ return 0;
+ }
+
+ Plugin::connect_and_run (bufs, start, end, speed, in, out, nframes, offset);
+
+ // This is needed for ARDOUR::Session requests :(
+ if (! SessionEvent::has_per_thread_pool ()) {
+ char name[64];
+ snprintf (name, 64, "Proc-%p", this);
+ pthread_set_name (name);
+ SessionEvent::create_per_thread_pool (name, 64);
+ PBD::notify_event_loops_about_thread_creation (pthread_self(), name, 64);
+ }
+
+ uint32_t const n = parameter_count ();
+ for (uint32_t i = 0; i < n; ++i) {
+ if (parameter_is_control (i) && parameter_is_input (i)) {
+ _control_data[i] = _shadow_data[i];
+ }
+ }
+
+#ifdef WITH_LUAPROC_STATS
+ int64_t t0 = g_get_monotonic_time ();
+#endif
+
+ try {
+ if (_lua_does_channelmapping) {
+ // run the DSP function
+ (*_lua_dsp)(&bufs, in, out, nframes, offset);
+ } else {
+ // map buffers
+ BufferSet& silent_bufs = _session.get_silent_buffers (ChanCount (DataType::AUDIO, 1));
+ BufferSet& scratch_bufs = _session.get_scratch_buffers (ChanCount (DataType::AUDIO, 1));
+
+ lua_State* L = lua.getState ();
+ luabridge::LuaRef in_map (luabridge::newTable (L));
+ luabridge::LuaRef out_map (luabridge::newTable (L));
+
+ const uint32_t audio_in = _configured_in.n_audio ();
+ const uint32_t audio_out = _configured_out.n_audio ();
+ const uint32_t midi_in = _configured_in.n_midi ();
+
+ for (uint32_t ap = 0; ap < audio_in; ++ap) {
+ bool valid;
+ const uint32_t buf_index = in.get(DataType::AUDIO, ap, &valid);
+ if (valid) {
+ in_map[ap + 1] = bufs.get_audio (buf_index).data (offset);
+ } else {
+ in_map[ap + 1] = silent_bufs.get_audio (0).data (offset);
+ }
+ }
+ for (uint32_t ap = 0; ap < audio_out; ++ap) {
+ bool valid;
+ const uint32_t buf_index = out.get(DataType::AUDIO, ap, &valid);
+ if (valid) {
+ out_map[ap + 1] = bufs.get_audio (buf_index).data (offset);
+ } else {
+ out_map[ap + 1] = scratch_bufs.get_audio (0).data (offset);
+ }
+ }
+
+ luabridge::LuaRef lua_midi_src_tbl (luabridge::newTable (L));
+ int e = 1; // > 1 port, we merge events (unsorted)
+ for (uint32_t mp = 0; mp < midi_in; ++mp) {
+ bool valid;
+ const uint32_t idx = in.get(DataType::MIDI, mp, &valid);
+ if (valid) {
+ for (MidiBuffer::iterator m = bufs.get_midi(idx).begin();
+ m != bufs.get_midi(idx).end(); ++m, ++e) {
+ const Evoral::MIDIEvent<framepos_t> ev(*m, false);
+ luabridge::LuaRef lua_midi_data (luabridge::newTable (L));
+ const uint8_t* data = ev.buffer();
+ for (uint32_t i = 0; i < ev.size(); ++i) {
+ lua_midi_data [i + 1] = data[i];
+ }
+ luabridge::LuaRef lua_midi_event (luabridge::newTable (L));
+ lua_midi_event["time"] = 1 + (*m).time();
+ lua_midi_event["data"] = lua_midi_data;
+ lua_midi_src_tbl[e] = lua_midi_event;
+ }
+ }
+ }
+
+ if (_has_midi_input) {
+ // XXX TODO This needs a better solution than global namespace
+ luabridge::push (L, lua_midi_src_tbl);
+ lua_setglobal (L, "midiin");
+ }
+
+ luabridge::LuaRef lua_midi_sink_tbl (luabridge::newTable (L));
+ if (_has_midi_output) {
+ luabridge::push (L, lua_midi_sink_tbl);
+ lua_setglobal (L, "midiout");
+ }
+
+ // run the DSP function
+ (*_lua_dsp)(in_map, out_map, nframes);
+
+ // copy back midi events
+ if (_has_midi_output && lua_midi_sink_tbl.isTable ()) {
+ bool valid;
+ const uint32_t idx = out.get(DataType::MIDI, 0, &valid);
+ if (valid && bufs.count().n_midi() > idx) {
+ MidiBuffer& mbuf = bufs.get_midi(idx);
+ mbuf.silence(0, 0);
+ for (luabridge::Iterator i (lua_midi_sink_tbl); !i.isNil (); ++i) {
+ if (!i.key ().isNumber ()) { continue; }
+ if (!i.value ()["time"].isNumber ()) { continue; }
+ if (!i.value ()["data"].isTable ()) { continue; }
+ luabridge::LuaRef data_tbl (i.value ()["data"]);
+ framepos_t tme = i.value ()["time"];
+ if (tme < 1 || tme > nframes) { continue; }
+ uint8_t data[64];
+ size_t size = 0;
+ for (luabridge::Iterator di (data_tbl); !di.isNil () && size < sizeof(data); ++di, ++size) {
+ data[size] = di.value ();
+ }
+ if (size > 0 && size < 64) {
+ mbuf.push_back(tme - 1, size, data);
+ }
+ }
+
+ }
+ }
+ }
+ } catch (luabridge::LuaException const& e) {
+ PBD::error << "LuaException: " << e.what () << "\n";
+#ifndef NDEBUG
+ std::cerr << "LuaException: " << e.what () << "\n";
+#endif
+ return -1;
+ }
+#ifdef WITH_LUAPROC_STATS
+ int64_t t1 = g_get_monotonic_time ();
+#endif
+
+ lua.collect_garbage_step ();
+#ifdef WITH_LUAPROC_STATS
+ ++_stats_cnt;
+ int64_t t2 = g_get_monotonic_time ();
+ int64_t ela0 = t1 - t0;
+ int64_t ela1 = t2 - t1;
+ if (ela0 > _stats_max[0]) _stats_max[0] = ela0;
+ if (ela1 > _stats_max[1]) _stats_max[1] = ela1;
+ _stats_avg[0] += ela0;
+ _stats_avg[1] += ela1;
+#endif
+ return 0;
+}
+
+
+void
+LuaProc::add_state (XMLNode* root) const
+{
+ XMLNode* child;
+ char buf[32];
+ LocaleGuard lg;
+
+ gchar* b64 = g_base64_encode ((const guchar*)_script.c_str (), _script.size ());
+ std::string b64s (b64);
+ g_free (b64);
+ XMLNode* script_node = new XMLNode (X_("script"));
+ script_node->add_property (X_("lua"), LUA_VERSION);
+ script_node->add_content (b64s);
+ root->add_child_nocopy (*script_node);
+
+ for (uint32_t i = 0; i < parameter_count(); ++i) {
+ if (parameter_is_input(i) && parameter_is_control(i)) {
+ child = new XMLNode("Port");
+ snprintf(buf, sizeof(buf), "%u", i);
+ child->add_property("id", std::string(buf));
+ snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
+ child->add_property("value", std::string(buf));
+ root->add_child_nocopy(*child);
+ }
+ }
+}
+
+int
+LuaProc::set_script_from_state (const XMLNode& node)
+{
+ XMLNode* child;
+ if (node.name () != state_node_name ()) {
+ return -1;
+ }
+
+ if ((child = node.child (X_("script"))) != 0) {
+ for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+ if (!(*n)->is_content ()) { continue; }
+ gsize size;
+ guchar* buf = g_base64_decode ((*n)->content ().c_str (), &size);
+ _script = std::string ((const char*)buf, size);
+ g_free (buf);
+ if (load_script ()) {
+ PBD::error << _("Failed to load Lua script from session state.") << endmsg;
+#ifndef NDEBUG
+ std::cerr << "Failed Lua Script: " << _script << std::endl;
+#endif
+ _script = "";
+ }
+ break;
+ }
+ }
+ if (_script.empty ()) {
+ PBD::error << _("Session State for LuaProcessor did not include a Lua script.") << endmsg;
+ return -1;
+ }
+ if (!_lua_dsp) {
+ PBD::error << _("Invalid/incompatible Lua script found for LuaProcessor.") << endmsg;
+ return -1;
+ }
+ return 0;
+}
+
+int
+LuaProc::set_state (const XMLNode& node, int version)
+{
+#ifndef NO_PLUGIN_STATE
+ XMLNodeList nodes;
+ XMLProperty const * prop;
+ XMLNodeConstIterator iter;
+ XMLNode *child;
+ const char *value;
+ const char *port;
+ uint32_t port_id;
+#endif
+ LocaleGuard lg;
+
+ if (_script.empty ()) {
+ if (set_script_from_state (node)) {
+ return -1;
+ }
+ }
+
+#ifndef NO_PLUGIN_STATE
+ if (node.name() != state_node_name()) {
+ error << _("Bad node sent to LuaProc::set_state") << endmsg;
+ return -1;
+ }
+
+ nodes = node.children ("Port");
+ for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
+ child = *iter;
+ if ((prop = child->property("id")) != 0) {
+ port = prop->value().c_str();
+ } else {
+ warning << _("LuaProc: port has no symbol, ignored") << endmsg;
+ continue;
+ }
+ if ((prop = child->property("value")) != 0) {
+ value = prop->value().c_str();
+ } else {
+ warning << _("LuaProc: port has no value, ignored") << endmsg;
+ continue;
+ }
+ sscanf (port, "%" PRIu32, &port_id);
+ set_parameter (port_id, atof(value));
+ }
+#endif
+
+ return Plugin::set_state (node, version);
+}
+
+uint32_t
+LuaProc::parameter_count () const
+{
+ return _ctrl_params.size ();
+}
+
+float
+LuaProc::default_value (uint32_t port)
+{
+ if (_ctrl_params[port].first) {
+ assert (0);
+ return 0;
+ }
+ int lp = _ctrl_params[port].second;
+ return _param_desc[lp].normal;
+}
+
+void
+LuaProc::set_parameter (uint32_t port, float val)
+{
+ assert (port < parameter_count ());
+ if (get_parameter (port) == val) {
+ return;
+ }
+ _shadow_data[port] = val;
+ Plugin::set_parameter (port, val);
+}
+
+float
+LuaProc::get_parameter (uint32_t port) const
+{
+ if (parameter_is_input (port)) {
+ return _shadow_data[port];
+ } else {
+ return _control_data[port];
+ }
+}
+
+int
+LuaProc::get_parameter_descriptor (uint32_t port, ParameterDescriptor& desc) const
+{
+ assert (port <= parameter_count ());
+ int lp = _ctrl_params[port].second;
+ const ParameterDescriptor& d (_param_desc.find(lp)->second);
+
+ desc.lower = d.lower;
+ desc.upper = d.upper;
+ desc.normal = d.normal;
+ desc.toggled = d.toggled;
+ desc.logarithmic = d.logarithmic;
+ desc.integer_step = d.integer_step;
+ desc.sr_dependent = d.sr_dependent;
+ desc.enumeration = d.enumeration;
+ desc.unit = d.unit;
+ desc.label = d.label;
+ desc.scale_points = d.scale_points;
+
+ desc.update_steps ();
+ return 0;
+}
+
+std::string
+LuaProc::get_parameter_docs (uint32_t port) const {
+ assert (port <= parameter_count ());
+ int lp = _ctrl_params[port].second;
+ return _param_doc.find(lp)->second;
+}
+
+uint32_t
+LuaProc::nth_parameter (uint32_t port, bool& ok) const
+{
+ if (port < _ctrl_params.size ()) {
+ ok = true;
+ return port;
+ }
+ ok = false;
+ return 0;
+}
+
+bool
+LuaProc::parameter_is_input (uint32_t port) const
+{
+ assert (port < _ctrl_params.size ());
+ return (!_ctrl_params[port].first);
+}
+
+bool
+LuaProc::parameter_is_output (uint32_t port) const
+{
+ assert (port < _ctrl_params.size ());
+ return (_ctrl_params[port].first);
+}
+
+std::set<Evoral::Parameter>
+LuaProc::automatable () const
+{
+ std::set<Evoral::Parameter> automatables;
+ for (uint32_t i = 0; i < _ctrl_params.size (); ++i) {
+ if (parameter_is_input (i)) {
+ automatables.insert (automatables.end (), Evoral::Parameter (PluginAutomation, 0, i));
+ }
+ }
+ return automatables;
+}
+
+std::string
+LuaProc::describe_parameter (Evoral::Parameter param)
+{
+ if (param.type () == PluginAutomation && param.id () < parameter_count ()) {
+ int lp = _ctrl_params[param.id ()].second;
+ return _param_desc[lp].label;
+ }
+ return "??";
+}
+
+void
+LuaProc::print_parameter (uint32_t param, char* buf, uint32_t len) const
+{
+ if (buf && len) {
+ if (param < parameter_count ()) {
+ snprintf (buf, len, "%.3f", get_parameter (param));
+ } else {
+ strcat (buf, "0");
+ }
+ }
+}
+
+boost::shared_ptr<ScalePoints>
+LuaProc::parse_scale_points (luabridge::LuaRef* lr)
+{
+ if (!(*lr)["scalepoints"].isTable()) {
+ return boost::shared_ptr<ScalePoints> ();
+ }
+
+ int cnt = 0;
+ boost::shared_ptr<ScalePoints> rv = boost::shared_ptr<ScalePoints>(new ScalePoints());
+ luabridge::LuaRef scalepoints ((*lr)["scalepoints"]);
+
+ for (luabridge::Iterator i (scalepoints); !i.isNil (); ++i) {
+ if (!i.key ().isString ()) { continue; }
+ if (!i.value ().isNumber ()) { continue; }
+ rv->insert(make_pair(i.key ().cast<std::string> (),
+ i.value ().cast<float> ()));
+ ++cnt;
+ }
+
+ if (rv->size() > 0) {
+ return rv;
+ }
+ return boost::shared_ptr<ScalePoints> ();
+}
+
+boost::shared_ptr<ScalePoints>
+LuaProc::get_scale_points (uint32_t port) const
+{
+ int lp = _ctrl_params[port].second;
+ return _param_desc.find(lp)->second.scale_points;
+}
+
+void
+LuaProc::setup_lua_inline_gui (LuaState *lua_gui)
+{
+ lua_State* LG = lua_gui->getState ();
+ LuaBindings::stddef (LG);
+ LuaBindings::common (LG);
+ LuaBindings::dsp (LG);
+
+ lua_gui->Print.connect (sigc::mem_fun (*this, &LuaProc::lua_print));
+ lua_gui->do_command ("function ardour () end");
+ lua_gui->do_command (_script);
+
+ // TODO think: use a weak-pointer here ?
+ // (the GUI itself uses a shared ptr to this plugin, so we should be good)
+ luabridge::getGlobalNamespace (LG)
+ .beginNamespace ("Ardour")
+ .beginClass <LuaProc> ("LuaProc")
+ .addFunction ("shmem", &LuaProc::instance_shm)
+ .addFunction ("table", &LuaProc::instance_ref)
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::push <LuaProc *> (LG, this);
+ lua_setglobal (LG, "self");
+
+ luabridge::push <float *> (LG, _shadow_data);
+ lua_setglobal (LG, "CtrlPorts");
+}
+////////////////////////////////////////////////////////////////////////////////
+
+#include "ardour/search_paths.h"
+#include "sha1.c"
+
+std::string
+LuaProc::preset_name_to_uri (const std::string& name) const
+{
+ std::string uri ("urn:lua:");
+ char hash[41];
+ Sha1Digest s;
+ sha1_init (&s);
+ sha1_write (&s, (const uint8_t *) name.c_str(), name.size ());
+ sha1_write (&s, (const uint8_t *) _script.c_str(), _script.size ());
+ sha1_result_hash (&s, hash);
+ return uri + hash;
+}
+
+std::string
+LuaProc::presets_file () const
+{
+ return string_compose ("lua-%1", _info->unique_id);
+}
+
+XMLTree*
+LuaProc::presets_tree () const
+{
+ XMLTree* t = new XMLTree;
+ std::string p = Glib::build_filename (ARDOUR::user_config_directory (), "presets");
+
+ if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) {
+ if (g_mkdir_with_parents (p.c_str(), 0755) != 0) {
+ error << _("Unable to create LuaProc presets directory") << endmsg;
+ };
+ }
+
+ p = Glib::build_filename (p, presets_file ());
+
+ if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) {
+ t->set_root (new XMLNode (X_("LuaPresets")));
+ return t;
+ }
+
+ t->set_filename (p);
+ if (!t->read ()) {
+ delete t;
+ return 0;
+ }
+ return t;
+}
+
+bool
+LuaProc::load_preset (PresetRecord r)
+{
+ boost::shared_ptr<XMLTree> t (presets_tree ());
+ if (t == 0) {
+ return false;
+ }
+
+ XMLNode* root = t->root ();
+ for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+ XMLProperty const * label = (*i)->property (X_("label"));
+ assert (label);
+ if (label->value() != r.label) {
+ continue;
+ }
+
+ for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
+ if ((*j)->name() == X_("Parameter")) {
+ XMLProperty const * index = (*j)->property (X_("index"));
+ XMLProperty const * value = (*j)->property (X_("value"));
+ assert (index);
+ assert (value);
+ LocaleGuard lg;
+ set_parameter (atoi (index->value().c_str()), atof (value->value().c_str ()));
+ }
+ }
+ return Plugin::load_preset(r);
+ }
+ return false;
+}
+
+std::string
+LuaProc::do_save_preset (std::string name) {
+
+ boost::shared_ptr<XMLTree> t (presets_tree ());
+ if (t == 0) {
+ return "";
+ }
+
+ std::string uri (preset_name_to_uri (name));
+
+ XMLNode* p = new XMLNode (X_("Preset"));
+ p->add_property (X_("uri"), uri);
+ p->add_property (X_("label"), name);
+
+ for (uint32_t i = 0; i < parameter_count(); ++i) {
+ if (parameter_is_input (i)) {
+ XMLNode* c = new XMLNode (X_("Parameter"));
+ c->add_property (X_("index"), string_compose ("%1", i));
+ c->add_property (X_("value"), string_compose ("%1", get_parameter (i)));
+ p->add_child_nocopy (*c);
+ }
+ }
+ t->root()->add_child_nocopy (*p);
+
+ std::string f = Glib::build_filename (ARDOUR::user_config_directory (), "presets");
+ f = Glib::build_filename (f, presets_file ());
+
+ t->write (f);
+ return uri;
+}
+
+void
+LuaProc::do_remove_preset (std::string name)
+{
+ boost::shared_ptr<XMLTree> t (presets_tree ());
+ if (t == 0) {
+ return;
+ }
+ t->root()->remove_nodes_and_delete (X_("label"), name);
+ std::string f = Glib::build_filename (ARDOUR::user_config_directory (), "presets");
+ f = Glib::build_filename (f, presets_file ());
+ t->write (f);
+}
+
+void
+LuaProc::find_presets ()
+{
+ boost::shared_ptr<XMLTree> t (presets_tree ());
+ if (t) {
+ XMLNode* root = t->root ();
+ for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+
+ XMLProperty const * uri = (*i)->property (X_("uri"));
+ XMLProperty const * label = (*i)->property (X_("label"));
+
+ assert (uri);
+ assert (label);
+
+ PresetRecord r (uri->value(), label->value(), true);
+ _presets.insert (make_pair (r.uri, r));
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+LuaPluginInfo::LuaPluginInfo (LuaScriptInfoPtr lsi) {
+ if (lsi->type != LuaScriptInfo::DSP) {
+ throw failed_constructor ();
+ }
+
+ path = lsi->path;
+ name = lsi->name;
+ creator = lsi->author;
+ category = lsi->category;
+ unique_id = lsi->unique_id;
+
+ n_inputs.set (DataType::AUDIO, 1);
+ n_outputs.set (DataType::AUDIO, 1);
+ type = Lua;
+
+ _is_instrument = category == "Instrument";
+}
+
+PluginPtr
+LuaPluginInfo::load (Session& session)
+{
+ std::string script = "";
+ if (!Glib::file_test (path, Glib::FILE_TEST_EXISTS)) {
+ return PluginPtr ();
+ }
+
+ try {
+ script = Glib::file_get_contents (path);
+ } catch (Glib::FileError err) {
+ return PluginPtr ();
+ }
+
+ if (script.empty ()) {
+ return PluginPtr ();
+ }
+
+ try {
+ PluginPtr plugin (new LuaProc (session.engine (), session, script));
+ return plugin;
+ } catch (failed_constructor& err) {
+ ;
+ }
+ return PluginPtr ();
+}
+
+std::vector<Plugin::PresetRecord>
+LuaPluginInfo::get_presets (bool /*user_only*/) const
+{
+ std::vector<Plugin::PresetRecord> p;
+ XMLTree* t = new XMLTree;
+ std::string pf = Glib::build_filename (ARDOUR::user_config_directory (), "presets", string_compose ("lua-%1", unique_id));
+ if (Glib::file_test (pf, Glib::FILE_TEST_EXISTS)) {
+ t->set_filename (pf);
+ if (t->read ()) {
+ XMLNode* root = t->root ();
+ for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+ XMLProperty const * uri = (*i)->property (X_("uri"));
+ XMLProperty const * label = (*i)->property (X_("label"));
+ p.push_back (Plugin::PresetRecord (uri->value(), label->value(), true));
+ }
+ }
+ }
+ delete t;
+ return p;
+}
diff --git a/libs/ardour/luascripting.cc b/libs/ardour/luascripting.cc
new file mode 100644
index 0000000..815711f
--- /dev/null
+++ b/libs/ardour/luascripting.cc
@@ -0,0 +1,487 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#include <cstring>
+#include <glibmm.h>
+
+#include "pbd/error.h"
+#include "pbd/file_utils.h"
+#include "pbd/compose.h"
+
+#include "ardour/directory_names.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/luascripting.h"
+#include "ardour/lua_script_params.h"
+#include "ardour/search_paths.h"
+
+#include "lua/luastate.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
+#include "sha1.c"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace std;
+
+LuaScripting* LuaScripting::_instance = 0;
+
+LuaScripting&
+LuaScripting::instance ()
+{
+ if (!_instance) {
+ _instance = new LuaScripting;
+ }
+ return *_instance;
+}
+
+LuaScripting::LuaScripting ()
+ : _sl_dsp (0)
+ , _sl_session (0)
+ , _sl_hook (0)
+ , _sl_action (0)
+ , _sl_snippet (0)
+{
+ ;
+}
+
+LuaScripting::~LuaScripting ()
+{
+ if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
+ // don't bother, just exit quickly.
+ delete _sl_dsp;
+ delete _sl_session;
+ delete _sl_hook;
+ delete _sl_action;
+ delete _sl_snippet;
+ }
+}
+
+
+void
+LuaScripting::refresh (bool run_scan)
+{
+ Glib::Threads::Mutex::Lock lm (_lock);
+
+ delete _sl_dsp;
+ delete _sl_session;
+ delete _sl_hook;
+ delete _sl_action;
+ delete _sl_snippet;
+
+ _sl_dsp = 0;
+ _sl_session = 0;
+ _sl_hook = 0;
+ _sl_action = 0;
+ _sl_snippet = 0;
+
+ if (run_scan) {
+ lm.release ();
+ scan ();
+ }
+}
+
+struct ScriptSorter {
+ bool operator () (LuaScriptInfoPtr a, LuaScriptInfoPtr b) {
+ return a->name < b->name;
+ }
+};
+
+LuaScriptInfoPtr
+LuaScripting::script_info (const std::string &script) {
+ return scan_script ("", script);
+}
+
+void
+LuaScripting::scan ()
+{
+ Glib::Threads::Mutex::Lock lm (_lock);
+
+#define CLEAR_OR_NEW(LIST) \
+ if (LIST) { LIST->clear (); } else { LIST = new LuaScriptList (); }
+
+ CLEAR_OR_NEW (_sl_dsp)
+ CLEAR_OR_NEW (_sl_session)
+ CLEAR_OR_NEW (_sl_hook)
+ CLEAR_OR_NEW (_sl_action)
+ CLEAR_OR_NEW (_sl_snippet)
+
+#undef CLEAR_OR_NEW
+
+ vector<string> luascripts;
+ find_files_matching_pattern (luascripts, lua_search_path (), "*.lua");
+
+ for (vector<string>::iterator i = luascripts.begin(); i != luascripts.end (); ++i) {
+ LuaScriptInfoPtr lsi = scan_script (*i);
+ if (!lsi) {
+ PBD::info << string_compose (_("Script '%1' has no valid descriptor."), *i) << endmsg;
+ continue;
+ }
+ switch (lsi->type) {
+ case LuaScriptInfo::DSP:
+ _sl_dsp->push_back(lsi);
+ break;
+ case LuaScriptInfo::Session:
+ _sl_session->push_back(lsi);
+ break;
+ case LuaScriptInfo::EditorHook:
+ _sl_hook->push_back(lsi);
+ break;
+ case LuaScriptInfo::EditorAction:
+ _sl_action->push_back(lsi);
+ break;
+ case LuaScriptInfo::Snippet:
+ _sl_snippet->push_back(lsi);
+ break;
+ default:
+ break;
+ }
+ }
+
+ std::sort (_sl_dsp->begin(), _sl_dsp->end(), ScriptSorter());
+ std::sort (_sl_session->begin(), _sl_session->end(), ScriptSorter());
+ std::sort (_sl_hook->begin(), _sl_hook->end(), ScriptSorter());
+ std::sort (_sl_action->begin(), _sl_action->end(), ScriptSorter());
+ std::sort (_sl_snippet->begin(), _sl_snippet->end(), ScriptSorter());
+
+ scripts_changed (); /* EMIT SIGNAL */
+}
+
+void
+LuaScripting::lua_print (std::string s) {
+ PBD::info << "Lua: " << s << "\n";
+}
+
+LuaScriptInfoPtr
+LuaScripting::scan_script (const std::string &fn, const std::string &sc)
+{
+ LuaState lua;
+ if (!(fn.empty() ^ sc.empty())){
+ // give either file OR script
+ assert (0);
+ return LuaScriptInfoPtr();
+ }
+
+ lua_State* L = lua.getState();
+ lua.Print.connect (&LuaScripting::lua_print);
+
+ lua.do_command ("io = nil;");
+
+ lua.do_command (
+ "ardourluainfo = {}"
+ "function ardour (entry)"
+ " ardourluainfo['type'] = assert(entry['type'])"
+ " ardourluainfo['name'] = assert(entry['name'])"
+ " ardourluainfo['category'] = entry['category'] or 'Unknown'"
+ " ardourluainfo['author'] = entry['author'] or 'Unknown'"
+ " ardourluainfo['license'] = entry['license'] or ''"
+ " ardourluainfo['description'] = entry['description'] or ''"
+ " end"
+ );
+
+ try {
+ int err;
+ if (fn.empty()) {
+ err = lua.do_command (sc);
+ } else {
+ err = lua.do_file (fn);
+ }
+ if (err) {
+#ifndef NDEBUG
+ cerr << "failed to load lua script\n";
+#endif
+ return LuaScriptInfoPtr();
+ }
+ } catch (...) { // luabridge::LuaException
+#ifndef NDEBUG
+ cerr << "failed to parse lua script\n";
+#endif
+ return LuaScriptInfoPtr();
+ }
+ luabridge::LuaRef nfo = luabridge::getGlobal (L, "ardourluainfo");
+ if (nfo.type() != LUA_TTABLE) {
+#ifndef NDEBUG
+ cerr << "failed to get ardour{} table from script\n";
+#endif
+ return LuaScriptInfoPtr();
+ }
+
+ if (nfo["name"].type() != LUA_TSTRING || nfo["type"].type() != LUA_TSTRING) {
+#ifndef NDEBUG
+ cerr << "script-type or script-name is not a string\n";
+#endif
+ return LuaScriptInfoPtr();
+ }
+
+ std::string name = nfo["name"].cast<std::string>();
+ LuaScriptInfo::ScriptType type = LuaScriptInfo::str2type (nfo["type"].cast<std::string>());
+
+ if (name.empty() || type == LuaScriptInfo::Invalid) {
+#ifndef NDEBUG
+ cerr << "invalid script-type or missing script name\n";
+#endif
+ return LuaScriptInfoPtr();
+ }
+
+ char hash[41];
+ Sha1Digest s;
+ sha1_init (&s);
+
+ if (fn.empty()) {
+ sha1_write (&s, (const uint8_t *) sc.c_str(), sc.size ());
+ } else {
+ try {
+ std::string script = Glib::file_get_contents (fn);
+ sha1_write (&s, (const uint8_t *) script.c_str(), script.size ());
+ } catch (Glib::FileError err) {
+ return LuaScriptInfoPtr();
+ }
+ }
+ sha1_result_hash (&s, hash);
+
+
+ LuaScriptInfoPtr lsi (new LuaScriptInfo (type, name, fn, hash));
+
+ for (luabridge::Iterator i(nfo); !i.isNil (); ++i) {
+ if (!i.key().isString() || !i.value().isString()) {
+ return LuaScriptInfoPtr();
+ }
+ std::string key = i.key().tostring();
+ std::string val = i.value().tostring();
+
+ if (key == "author") { lsi->author = val; }
+ if (key == "license") { lsi->license = val; }
+ if (key == "description") { lsi->description = val; }
+ if (key == "category") { lsi->category = val; }
+ }
+ return lsi;
+}
+
+LuaScriptList &
+LuaScripting::scripts (LuaScriptInfo::ScriptType type) {
+
+ if (!_sl_dsp || !_sl_session || !_sl_hook || !_sl_action || !_sl_snippet) {
+ scan ();
+ }
+
+ switch (type) {
+ case LuaScriptInfo::DSP:
+ return *_sl_dsp;
+ break;
+ case LuaScriptInfo::Session:
+ return *_sl_session;
+ break;
+ case LuaScriptInfo::EditorHook:
+ return *_sl_hook;
+ break;
+ case LuaScriptInfo::EditorAction:
+ return *_sl_action;
+ break;
+ case LuaScriptInfo::Snippet:
+ return *_sl_snippet;
+ break;
+ default:
+ break;
+ }
+ return _empty_script_info; // make some compilers happy
+}
+
+
+std::string
+LuaScriptInfo::type2str (const ScriptType t) {
+ switch (t) {
+ case LuaScriptInfo::DSP: return "DSP";
+ case LuaScriptInfo::Session: return "Session";
+ case LuaScriptInfo::EditorHook: return "EditorHook";
+ case LuaScriptInfo::EditorAction: return "EditorAction";
+ case LuaScriptInfo::Snippet: return "Snippet";
+ default: return "Invalid";
+ }
+}
+
+LuaScriptInfo::ScriptType
+LuaScriptInfo::str2type (const std::string& str) {
+ const char* type = str.c_str();
+ if (!strcasecmp (type, "DSP")) {return LuaScriptInfo::DSP;}
+ if (!strcasecmp (type, "Session")) {return LuaScriptInfo::Session;}
+ if (!strcasecmp (type, "EditorHook")) {return LuaScriptInfo::EditorHook;}
+ if (!strcasecmp (type, "EditorAction")) {return LuaScriptInfo::EditorAction;}
+ if (!strcasecmp (type, "Snippet")) {return LuaScriptInfo::Snippet;}
+ return LuaScriptInfo::Invalid;
+}
+
+LuaScriptParamList
+LuaScriptParams::script_params (LuaScriptInfoPtr lsi, const std::string &pname)
+{
+ assert (lsi);
+ return LuaScriptParams::script_params (lsi->path, pname);
+}
+
+LuaScriptParamList
+LuaScriptParams::script_params (const std::string& s, const std::string &pname, bool file)
+{
+ LuaScriptParamList rv;
+
+ LuaState lua;
+ lua_State* L = lua.getState();
+ lua.do_command ("io = nil;");
+ lua.do_command ("function ardour () end");
+
+ try {
+ if (file) {
+ lua.do_file (s);
+ } else {
+ lua.do_command (s);
+ }
+ } catch (luabridge::LuaException const& e) {
+ return rv;
+ }
+
+ luabridge::LuaRef lua_params = luabridge::getGlobal (L, pname.c_str());
+ if (lua_params.isFunction ()) {
+ luabridge::LuaRef params = lua_params ();
+ if (params.isTable ()) {
+ for (luabridge::Iterator i (params); !i.isNil (); ++i) {
+ if (!i.key ().isString ()) { continue; }
+ if (!i.value ().isTable ()) { continue; }
+ if (!i.value ()["title"].isString ()) { continue; }
+
+ std::string name = i.key ().cast<std::string> ();
+ std::string title = i.value ()["title"].cast<std::string> ();
+ std::string dflt;
+ bool optional = false;
+
+ if (i.value ()["default"].isString ()) {
+ dflt = i.value ()["default"].cast<std::string> ();
+ }
+ if (i.value ()["optional"].isBoolean ()) {
+ optional = i.value ()["optional"].cast<bool> ();
+ }
+ LuaScriptParamPtr lsspp (new LuaScriptParam(name, title, dflt, optional));
+ rv.push_back (lsspp);
+ }
+ }
+ }
+ return rv;
+}
+
+void
+LuaScriptParams::params_to_ref (luabridge::LuaRef *tbl_args, const LuaScriptParamList& args)
+{
+ assert (tbl_args && (*tbl_args).isTable ());
+ for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+ if ((*i)->optional && !(*i)->is_set) { continue; }
+ (*tbl_args)[(*i)->name] = (*i)->value;
+ }
+}
+
+void
+LuaScriptParams::ref_to_params (LuaScriptParamList& args, luabridge::LuaRef *tbl_ref)
+{
+ assert (tbl_ref && (*tbl_ref).isTable ());
+ for (luabridge::Iterator i (*tbl_ref); !i.isNil (); ++i) {
+ if (!i.key ().isString ()) { assert(0); continue; }
+ std::string name = i.key ().cast<std::string> ();
+ std::string value = i.value ().cast<std::string> ();
+ for (LuaScriptParamList::const_iterator ii = args.begin(); ii != args.end(); ++ii) {
+ if ((*ii)->name == name) {
+ (*ii)->value = value;
+ break;
+ }
+ }
+ }
+}
+
+bool
+LuaScripting::try_compile (const std::string& script, const LuaScriptParamList& args)
+{
+ const std::string& bytecode = get_factory_bytecode (script);
+ if (bytecode.empty()) {
+ return false;
+ }
+ LuaState l;
+ l.Print.connect (&LuaScripting::lua_print);
+ lua_State* L = l.getState();
+
+ l.do_command (""
+ " function checkfactory (b, a)"
+ " assert(type(b) == 'string', 'ByteCode must be string')"
+ " load(b)()" // assigns f
+ " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+ " local factory = load(f)"
+ " assert(type(factory) == 'function', 'Factory is a not a function')"
+ " local env = _ENV; env.f = nil env.debug = nil os.exit = nil"
+ " load (string.dump(factory, true), nil, nil, env)(a)"
+ " end"
+ );
+
+ try {
+ luabridge::LuaRef lua_test = luabridge::getGlobal (L, "checkfactory");
+ l.do_command ("checkfactory = nil"); // hide it.
+ l.do_command ("collectgarbage()");
+
+ luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+ LuaScriptParams::params_to_ref (&tbl_arg, args);
+ lua_test (bytecode, tbl_arg);
+ return true; // OK
+ } catch (luabridge::LuaException const& e) {
+#ifndef NDEBUG
+ cerr << e.what() << "\n";
+#endif
+ lua_print (e.what());
+ }
+
+ return false;
+}
+
+std::string
+LuaScripting::get_factory_bytecode (const std::string& script)
+{
+ LuaState l;
+ l.Print.connect (&LuaScripting::lua_print);
+ lua_State* L = l.getState();
+
+ l.do_command (
+ " function ardour () end"
+ ""
+ " function dump_function (f)"
+ " assert(type(f) == 'function', 'Factory is a not a function')"
+ " return string.format(\"f = %q\", string.dump(f, true))"
+ " end"
+ );
+
+ try {
+ luabridge::LuaRef lua_dump = luabridge::getGlobal (L, "dump_function");
+ l.do_command ("dump_function = nil"); // hide it
+ l.do_command (script); // register "factory"
+ luabridge::LuaRef lua_factory = luabridge::getGlobal (L, "factory");
+
+ if (lua_factory.isFunction()) {
+ return (lua_dump(lua_factory)).cast<std::string> ();
+ }
+ } catch (luabridge::LuaException const& e) { }
+ return "";
+}
+
+std::string
+LuaScripting::user_script_dir ()
+{
+ std::string dir = Glib::build_filename (user_config_directory(), lua_dir_name);
+ g_mkdir_with_parents (dir.c_str(), 0744);
+ return dir;
+}
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index 7791c0b..c1f3c06 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -17,6 +17,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <cctype>
#include <string>
#include <vector>
#include <limits>
@@ -35,6 +36,7 @@
#include "pbd/stl_delete.h"
#include "pbd/compose.h"
#include "pbd/error.h"
+#include "pbd/replace_all.h"
#include "pbd/xml++.h"
#include "libardour-config.h"
@@ -50,7 +52,7 @@
#include "ardour/worker.h"
#include "ardour/search_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
#include <lilv/lilv.h>
@@ -125,6 +127,10 @@ public:
LilvNode* ev_EventPort;
LilvNode* ext_logarithmic;
LilvNode* ext_notOnGUI;
+ LilvNode* ext_expensive;
+ LilvNode* ext_causesArtifacts;
+ LilvNode* ext_notAutomatic;
+ LilvNode* ext_rangeSteps;
LilvNode* lv2_AudioPort;
LilvNode* lv2_ControlPort;
LilvNode* lv2_InputPort;
@@ -132,6 +138,7 @@ public:
LilvNode* lv2_enumeration;
LilvNode* lv2_freewheeling;
LilvNode* lv2_inPlaceBroken;
+ LilvNode* lv2_isSideChain;
LilvNode* lv2_integer;
LilvNode* lv2_default;
LilvNode* lv2_minimum;
@@ -155,13 +162,26 @@ public:
LilvNode* units_midiNote;
LilvNode* patch_writable;
LilvNode* patch_Message;
- LilvNode* lv2_noSampleAccurateCtrl;
#ifdef HAVE_LV2_1_2_0
LilvNode* bufz_powerOf2BlockLength;
LilvNode* bufz_fixedBlockLength;
LilvNode* bufz_nominalBlockLength;
#endif
+#ifdef HAVE_LV2_1_10_0
+ LilvNode* atom_int;
+ LilvNode* atom_float;
+ LilvNode* atom_object; // new in 1.8
+ LilvNode* atom_vector;
+#endif
+#ifdef LV2_EXTENDED
+ LilvNode* lv2_noSampleAccurateCtrl;
+ LilvNode* auto_can_write_automatation; // lv2:optionalFeature
+ LilvNode* auto_automation_control; // atom:supports
+ LilvNode* auto_automation_controlled; // lv2:portProperty
+ LilvNode* auto_automation_controller; // lv2:portProperty
+#endif
+
private:
bool _bundle_checked;
};
@@ -176,15 +196,9 @@ work_schedule(LV2_Worker_Schedule_Handle handle,
uint32_t size,
const void* data)
{
- LV2Plugin* plugin = (LV2Plugin*)handle;
- if (plugin->session().engine().freewheeling()) {
- // Freewheeling, do the work immediately in this (audio) thread
- return (LV2_Worker_Status)plugin->work(size, data);
- } else {
- // Enqueue message for the worker thread
- return plugin->worker()->schedule(size, data) ?
- LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
- }
+ return (((Worker*)handle)->schedule(size, data)
+ ? LV2_WORKER_SUCCESS
+ : LV2_WORKER_ERR_UNKNOWN);
}
/** Called by the plugin to respond to non-RT work. */
@@ -193,16 +207,20 @@ work_respond(LV2_Worker_Respond_Handle handle,
uint32_t size,
const void* data)
{
+ return (((Worker*)handle)->respond(size, data)
+ ? LV2_WORKER_SUCCESS
+ : LV2_WORKER_ERR_UNKNOWN);
+}
+
+#ifdef LV2_EXTENDED
+/* inline display extension */
+static void
+queue_draw (LV2_Inline_Display_Handle handle)
+{
LV2Plugin* plugin = (LV2Plugin*)handle;
- if (plugin->session().engine().freewheeling()) {
- // Freewheeling, respond immediately in this (audio) thread
- return (LV2_Worker_Status)plugin->work_response(size, data);
- } else {
- // Enqueue response for the worker
- return plugin->worker()->respond(size, data) ?
- LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
- }
+ plugin->QueueDraw(); /* EMIT SIGNAL */
}
+#endif
/* log extension */
@@ -214,14 +232,23 @@ log_vprintf(LV2_Log_Handle /*handle*/,
{
char* str = NULL;
const int ret = g_vasprintf(&str, fmt, args);
+ /* strip trailing whitespace */
+ while (strlen (str) > 0 && isspace (str[strlen (str) - 1])) {
+ str[strlen (str) - 1] = '\0';
+ }
+ if (strlen (str) == 0) {
+ return 0;
+ }
+
if (type == URIMap::instance().urids.log_Error) {
error << str << endmsg;
} else if (type == URIMap::instance().urids.log_Warning) {
warning << str << endmsg;
} else if (type == URIMap::instance().urids.log_Note) {
info << str << endmsg;
+ } else if (type == URIMap::instance().urids.log_Trace) {
+ DEBUG_TRACE(DEBUG::LV2, str);
}
- // TODO: Toggleable log:Trace message support
return ret;
}
@@ -248,6 +275,9 @@ struct LV2Plugin::Impl {
#ifdef HAVE_LV2_1_2_0
, options(0)
#endif
+#ifdef LV2_EXTENDED
+ , queue_draw(0)
+#endif
{}
/** Find the LV2 input port with the given designation.
@@ -272,6 +302,9 @@ struct LV2Plugin::Impl {
#ifdef HAVE_LV2_1_2_0
LV2_Options_Option* options;
#endif
+#ifdef LV2_EXTENDED
+ LV2_Inline_Display* queue_draw;
+#endif
};
LV2Plugin::LV2Plugin (AudioEngine& engine,
@@ -283,6 +316,7 @@ LV2Plugin::LV2Plugin (AudioEngine& engine,
, _impl(new Impl())
, _features(NULL)
, _worker(NULL)
+ , _state_worker(NULL)
, _insert_id("0")
, _patch_port_in_index((uint32_t)-1)
, _patch_port_out_index((uint32_t)-1)
@@ -298,6 +332,7 @@ LV2Plugin::LV2Plugin (const LV2Plugin& other)
, _impl(new Impl())
, _features(NULL)
, _worker(NULL)
+ , _state_worker(NULL)
, _insert_id(other._insert_id)
, _patch_port_in_index((uint32_t)-1)
, _patch_port_out_index((uint32_t)-1)
@@ -335,6 +370,9 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
_state_version = 0;
_was_activated = false;
_has_state_interface = false;
+ _can_write_automation = false;
+ _max_latency = 0;
+ _current_latency = 0;
_impl->block_length = _session.get_block_size();
_instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
@@ -358,7 +396,7 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
lilv_node_free(state_uri);
lilv_node_free(state_iface_uri);
- _features = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
+ _features = (LV2_Feature**)calloc(12, sizeof(LV2_Feature*));
_features[0] = &_instance_access_feature;
_features[1] = &_data_access_feature;
_features[2] = &_make_path_feature;
@@ -375,6 +413,17 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
+#ifdef LV2_EXTENDED
+ _impl->queue_draw = (LV2_Inline_Display*)
+ malloc (sizeof(LV2_Inline_Display));
+ _impl->queue_draw->handle = this;
+ _impl->queue_draw->queue_draw = queue_draw;
+
+ _queue_draw_feature.URI = LV2_INLINEDISPLAY__queue_draw;
+ _queue_draw_feature.data = _impl->queue_draw;
+ _features[n_features++] = &_queue_draw_feature;
+#endif
+
#ifdef HAVE_LV2_1_2_0
LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
static const int32_t _min_block_length = 1; // may happen during split-cycles
@@ -418,19 +467,24 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
log->vprintf = &log_vprintf;
_log_feature.data = log;
+ const size_t ring_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
if (lilv_plugin_has_feature(plugin, worker_schedule)) {
LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
sizeof(LV2_Worker_Schedule));
- size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
- _worker = new Worker(this, buf_size);
- schedule->handle = this;
+ _worker = new Worker(this, ring_size);
+ schedule->handle = _worker;
schedule->schedule_work = work_schedule;
_work_schedule_feature.data = schedule;
_features[n_features++] = &_work_schedule_feature;
}
lilv_node_free(worker_schedule);
+ if (_has_state_interface) {
+ // Create a non-threaded worker for use by state restore
+ _state_worker = new Worker(this, ring_size, false);
+ }
+
_impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
_impl->name = lilv_plugin_get_name(plugin);
_impl->author = lilv_plugin_get_author_name(plugin);
@@ -461,6 +515,11 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
lilv_node_free(options_iface_uri);
#endif
+#ifdef LV2_EXTENDED
+ _display_interface = (const LV2_Inline_Display_Interface*)
+ extension_data (LV2_INLINEDISPLAY__interface);
+#endif
+
if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
error << string_compose(
_("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
@@ -484,11 +543,16 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
throw failed_constructor();
}
lilv_nodes_free(required_features);
+#endif
+#ifdef LV2_EXTENDED
LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
_no_sample_accurate_ctrl = true;
}
+ if (lilv_nodes_contains (optional_features, _world.auto_can_write_automatation)) {
+ _can_write_automation = true;
+ }
lilv_nodes_free(optional_features);
#endif
@@ -542,6 +606,11 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
flags |= PORT_POSITION;
}
+#ifdef LV2_EXTENDED
+ if (lilv_nodes_contains(atom_supports, _world.auto_automation_control)) {
+ flags |= PORT_AUTOCTRL;
+ }
+#endif
if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
flags |= PORT_PATCHMSG;
if (flags & PORT_INPUT) {
@@ -566,8 +635,33 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
throw failed_constructor();
}
+ if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
+ if (lilv_port_has_property(_impl->plugin, port, _world.ext_causesArtifacts)) {
+ flags |= PORT_NOAUTO;
+ }
+ if (lilv_port_has_property(_impl->plugin, port, _world.ext_notAutomatic)) {
+ flags |= PORT_NOAUTO;
+ }
+ if (lilv_port_has_property(_impl->plugin, port, _world.ext_expensive)) {
+ flags |= PORT_NOAUTO;
+ }
+ }
+#ifdef LV2_EXTENDED
+ if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controlled)) {
+ if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
+ flags |= PORT_CTRLED;
+ }
+ }
+ if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controller)) {
+ if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
+ flags |= PORT_CTRLER;
+ }
+ }
+#endif
+
_port_flags.push_back(flags);
_port_minimumSize.push_back(minimumSize);
+ DEBUG_TRACE(DEBUG::LV2, string_compose("port %1 buffer %2 bytes\n", i, minimumSize));
}
_control_data = new float[num_ports];
@@ -609,6 +703,9 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
if (latent && i == latency_index) {
+ LilvNode *max;
+ lilv_port_get_range(_impl->plugin, port, NULL, NULL, &max);
+ _max_latency = max ? lilv_node_as_float(max) : .02 * _sample_rate;
_latency_control_port = &_control_data[i];
*_latency_control_port = 0;
}
@@ -710,6 +807,13 @@ LV2Plugin::requires_fixed_sized_buffers () const
* e.g The process cycle may be split when looping, also
* the period-size may change any time: see set_block_size()
*/
+ if (get_info()->n_inputs.n_midi() > 0) {
+ /* we don't yet implement midi buffer offsets (for split cycles).
+ * Also connect_and_run() also uses _session.transport_frame() directly
+ * (for BBT) which is not offset for plugin cycle split.
+ */
+ return true;
+ }
return _no_sample_accurate_ctrl;
}
@@ -727,14 +831,19 @@ LV2Plugin::~LV2Plugin ()
#ifdef HAVE_LV2_1_2_0
free(_impl->options);
#endif
+#ifdef LV2_EXTENDED
+ free(_impl->queue_draw);
+#endif
free(_features);
+ free(_log_feature.data);
free(_make_path_feature.data);
free(_work_schedule_feature.data);
delete _to_ui;
delete _from_ui;
delete _worker;
+ delete _state_worker;
if (_atom_ev_buffers) {
LV2_Evbuf** b = _atom_ev_buffers;
@@ -749,6 +858,7 @@ LV2Plugin::~LV2Plugin ()
delete [] _shadow_data;
delete [] _defaults;
delete [] _ev_buffers;
+ delete _impl;
}
bool
@@ -789,6 +899,23 @@ LV2Plugin::ui_is_resizable () const
return !fs_matches && !nrs_matches;
}
+#ifdef LV2_EXTENDED
+bool
+LV2Plugin::has_inline_display () {
+ return _display_interface ? true : false;
+}
+
+Plugin::Display_Image_Surface*
+LV2Plugin::render_inline_display (uint32_t w, uint32_t h) {
+ if (_display_interface) {
+ /* Plugin::Display_Image_Surface is identical to
+ * LV2_Inline_Display_Image_Surface */
+ return (Plugin::Display_Image_Surface*) _display_interface->render ((void*)_impl->instance->lv2_handle, w, h);
+ }
+ return NULL;
+}
+#endif
+
string
LV2Plugin::unique_id() const
{
@@ -924,6 +1051,51 @@ LV2Plugin::get_parameter_docs(uint32_t which) const
return "";
}
+bool
+LV2Plugin::get_layout (uint32_t which, UILayoutHint& h) const
+{
+ /// TODO lookup port-properties
+ if (unique_id () != "urn:ardour:a-eq") {
+ return false;
+ }
+ h.knob = true;
+ switch (which) {
+ case 0: h.x0 = 0; h.x1 = 1; h.y0 = 2; h.y1 = 3; break; // Frequency L
+ case 1: h.x0 = 0; h.x1 = 1; h.y0 = 0; h.y1 = 1; break; // Gain L
+ case 17: h.x0 = 0; h.x1 = 1; h.y0 = 5; h.y1 = 6; break; // enable L
+
+ case 2: h.x0 = 1; h.x1 = 3; h.y0 = 2; h.y1 = 3; break; // Frequency 1
+ case 3: h.x0 = 1; h.x1 = 3; h.y0 = 0; h.y1 = 1; break; // Gain 1
+ case 4: h.x0 = 2; h.x1 = 4; h.y0 = 1; h.y1 = 2; break; // Bandwidth 1
+ case 18: h.x0 = 1; h.x1 = 4; h.y0 = 5; h.y1 = 6; break; // enable 1
+
+ case 5: h.x0 = 4; h.x1 = 6; h.y0 = 2; h.y1 = 3; break; // Frequency 2
+ case 6: h.x0 = 4; h.x1 = 6; h.y0 = 0; h.y1 = 1; break; // Gain 2
+ case 7: h.x0 = 5; h.x1 = 7; h.y0 = 1; h.y1 = 2; break; // Bandwidth 2
+ case 19: h.x0 = 4; h.x1 = 7; h.y0 = 5; h.y1 = 6; break; // enable 2
+
+ case 8: h.x0 = 7; h.x1 = 9; h.y0 = 2; h.y1 = 3; break; // Frequency 3
+ case 9: h.x0 = 7; h.x1 = 9; h.y0 = 0; h.y1 = 1; break; // Gain 3
+ case 10: h.x0 = 8; h.x1 = 10; h.y0 = 1; h.y1 = 2; break; // Bandwidth 3
+ case 20: h.x0 = 7; h.x1 = 10; h.y0 = 5; h.y1 = 6; break; // enable 3
+
+ case 11: h.x0 = 10; h.x1 = 12; h.y0 = 2; h.y1 = 3; break; // Frequency 4
+ case 12: h.x0 = 10; h.x1 = 12; h.y0 = 0; h.y1 = 1; break; // Gain 4
+ case 13: h.x0 = 11; h.x1 = 13; h.y0 = 1; h.y1 = 2; break; // Bandwidth 4
+ case 21: h.x0 = 10; h.x1 = 13; h.y0 = 5; h.y1 = 6; break; // enable 4
+
+ case 14: h.x0 = 13; h.x1 = 14; h.y0 = 2; h.y1 = 3; break; // Frequency H
+ case 15: h.x0 = 13; h.x1 = 14; h.y0 = 0; h.y1 = 1; break; // Gain H
+ case 22: h.x0 = 13; h.x1 = 14; h.y0 = 5; h.y1 = 6; break; // enable H
+
+
+ case 16: h.x0 = 14; h.x1 = 15; h.y0 = 4; h.y1 = 6; break; // Master Gain
+ default:
+ return false;
+ }
+ return true;
+}
+
uint32_t
LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
{
@@ -1028,7 +1200,7 @@ LV2Plugin::add_state(XMLNode* root) const
XMLNode* child;
char buf[32];
- LocaleGuard lg(X_("C"));
+ LocaleGuard lg;
for (uint32_t i = 0; i < parameter_count(); ++i) {
if (parameter_is_input(i) && parameter_is_control(i)) {
@@ -1164,8 +1336,15 @@ LV2Plugin::load_preset(PresetRecord r)
LilvNode* pset = lilv_new_uri(world, r.uri.c_str());
LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
+ const LV2_Feature* state_features[2] = { NULL, NULL };
+ LV2_Worker_Schedule schedule = { _state_worker, work_schedule };
+ const LV2_Feature state_sched_feature = { LV2_WORKER__schedule, &schedule };
+ if (_state_worker) {
+ state_features[0] = &state_sched_feature;
+ }
+
if (state) {
- lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
+ lilv_state_restore(state, _impl->instance, set_port_value, this, 0, state_features);
lilv_state_free(state);
Plugin::load_preset(r);
}
@@ -1516,6 +1695,7 @@ load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, co
LilvNode* render = get_value(lworld, unit, _world.units_render);
if (render) {
desc.print_fmt = lilv_node_as_string(render);
+ replace_all (desc.print_fmt, "%f", "%.2f");
lilv_node_free(render);
}
}
@@ -1666,10 +1846,11 @@ LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
}
int
-LV2Plugin::work(uint32_t size, const void* data)
+LV2Plugin::work(Worker& worker, uint32_t size, const void* data)
{
+ Glib::Threads::Mutex::Lock lm(_work_mutex);
return _impl->work_iface->work(
- _impl->instance->lv2_handle, work_respond, this, size, data);
+ _impl->instance->lv2_handle, work_respond, &worker, size, data);
}
int
@@ -1701,13 +1882,13 @@ int
LV2Plugin::set_state(const XMLNode& node, int version)
{
XMLNodeList nodes;
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNodeConstIterator iter;
XMLNode* child;
const char* sym;
const char* value;
uint32_t port_id;
- LocaleGuard lg(X_("C"));
+ LocaleGuard lg;
if (node.name() != state_node_name()) {
error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
@@ -1804,6 +1985,8 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c
lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
+ LilvNode* steps = lilv_port_get(_impl->plugin, port, _world.ext_rangeSteps);
+
// TODO: Once we can rely on lilv 0.18.0 being present,
// load_parameter_descriptor() can be used for ports as well
desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
@@ -1829,14 +2012,89 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c
desc.update_steps();
+ if (steps) {
+ //override auto-calculated steps in update_steps()
+ float s = lilv_node_as_float (steps);
+ const float delta = desc.upper - desc.lower;
+
+ desc.step = desc.smallstep = (delta / s);
+ desc.largestep = std::min ((delta / 5.0f), 10.f * desc.smallstep);
+
+ if (desc.logarithmic) {
+ // TODO marry AutomationControl::internal_to_interface () with
+ // http://lv2plug.in/ns/ext/port-props/#rangeSteps
+ desc.smallstep = desc.smallstep / logf(s);
+ desc.step = desc.step / logf(s);
+ desc.largestep = desc.largestep / logf(s);
+ } else if (desc.integer_step) {
+ desc.smallstep = 1.0;
+ desc.step = std::max(1.f, rintf (desc.step));
+ desc.largestep = std::max(1.f, rintf (desc.largestep));
+ }
+ DEBUG_TRACE(DEBUG::LV2, string_compose("parameter %1 small: %2, step: %3 largestep: %4\n",
+ which, desc.smallstep, desc.step, desc.largestep));
+ }
+
+
lilv_node_free(def);
lilv_node_free(min);
lilv_node_free(max);
+ lilv_node_free(steps);
lilv_nodes_free(portunits);
return 0;
}
+Plugin::IOPortDescription
+LV2Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
+{
+ PortFlags match = 0;
+ switch (dt) {
+ case DataType::AUDIO:
+ match = PORT_AUDIO;
+ break;
+ case DataType::MIDI:
+ match = PORT_SEQUENCE | PORT_MIDI; // ignore old PORT_EVENT
+ break;
+ default:
+ return Plugin::IOPortDescription ("?");
+ break;
+ }
+ if (input) {
+ match |= PORT_INPUT;
+ } else {
+ match |= PORT_OUTPUT;
+ }
+
+ uint32_t p = 0;
+ uint32_t idx = UINT32_MAX;
+
+ uint32_t const num_ports = parameter_count();
+ for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
+ PortFlags flags = _port_flags[port_index];
+ if ((flags & match) == match) {
+ if (p == id) {
+ idx = port_index;
+ }
+ ++p;
+ }
+ }
+ if (idx == UINT32_MAX) {
+ return Plugin::IOPortDescription ("?");
+ }
+
+ LilvNode* name = lilv_port_get_name(_impl->plugin,
+ lilv_plugin_get_port_by_index(_impl->plugin, idx));
+ Plugin::IOPortDescription iod (lilv_node_as_string (name));
+ lilv_node_free(name);
+
+ if (lilv_port_has_property(_impl->plugin,
+ lilv_plugin_get_port_by_index(_impl->plugin, idx), _world.lv2_isSideChain)) {
+ iod.is_sidechain = true;
+ }
+ return iod;
+}
+
string
LV2Plugin::describe_parameter(Evoral::Parameter which)
{
@@ -1868,6 +2126,12 @@ LV2Plugin::describe_parameter(Evoral::Parameter which)
}
framecnt_t
+LV2Plugin::max_latency () const
+{
+ return _max_latency;
+}
+
+framecnt_t
LV2Plugin::signal_latency() const
{
if (_latency_control_port) {
@@ -1883,7 +2147,7 @@ LV2Plugin::automatable() const
set<Evoral::Parameter> ret;
for (uint32_t i = 0; i < parameter_count(); ++i) {
- if (parameter_is_input(i) && parameter_is_control(i)) {
+ if (parameter_is_input(i) && parameter_is_control(i) && !(_port_flags[i] & PORT_NOAUTO)) {
ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
}
}
@@ -1897,6 +2161,24 @@ LV2Plugin::automatable() const
}
void
+LV2Plugin::set_automation_control (uint32_t i, boost::shared_ptr<AutomationControl> c)
+{
+ if ((_port_flags[i] & (PORT_CTRLED | PORT_CTRLER))) {
+ DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Ctrl Port %1\n", i));
+ _ctrl_map [i] = AutomationCtrlPtr (new AutomationCtrl(c));
+ }
+}
+
+LV2Plugin::AutomationCtrlPtr
+LV2Plugin::get_automation_control (uint32_t i)
+{
+ if (_ctrl_map.find (i) == _ctrl_map.end()) {
+ return AutomationCtrlPtr ();
+ }
+ return _ctrl_map[i];
+}
+
+void
LV2Plugin::activate()
{
DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
@@ -1948,8 +2230,7 @@ LV2Plugin::allocate_atom_event_buffers()
LilvNodes* atom_supports = lilv_port_get_value(
p, port, _world.atom_supports);
- if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
- || !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
+ if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
count_atom_in++;
}
@@ -1976,7 +2257,7 @@ LV2Plugin::allocate_atom_event_buffers()
return;
}
- DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
+ DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %2 bytes\n", total_atom_buffers, minimumSize));
_atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
for (int i = 0; i < total_atom_buffers; ++i ) {
_atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
@@ -2047,17 +2328,18 @@ write_position(LV2_Atom_Forge* forge,
int
LV2Plugin::connect_and_run(BufferSet& bufs,
- ChanMapping in_map, ChanMapping out_map,
- pframes_t nframes, framecnt_t offset)
+ framepos_t start, framepos_t end, double speed,
+ ChanMapping in_map, ChanMapping out_map,
+ pframes_t nframes, framecnt_t offset)
{
DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
- Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
+ Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
cycles_t then = get_cycles();
TempoMap& tmap = _session.tempo_map();
Metrics::const_iterator metric_i = tmap.metrics_end();
- TempoMetric tmetric = tmap.metric_at(_session.transport_frame(), &metric_i);
+ TempoMetric tmetric = tmap.metric_at(start, &metric_i);
if (_freewheel_control_port) {
*_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
@@ -2067,6 +2349,15 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
*_bpm_control_port = tmetric.tempo().beats_per_minute();
}
+#ifdef LV2_EXTENDED
+ if (_can_write_automation && start != _next_cycle_start) {
+ // add guard-points after locating
+ for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
+ i->second->guard = true;
+ }
+ }
+#endif
+
ChanCount bufs_count;
bufs_count.set(DataType::AUDIO, 1);
bufs_count.set(DataType::MIDI, 1);
@@ -2127,13 +2418,12 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
if (valid && (flags & PORT_INPUT)) {
Timecode::BBT_Time bbt;
if ((flags & PORT_POSITION)) {
- if (_session.transport_frame() != _next_cycle_start ||
- _session.transport_speed() != _next_cycle_speed) {
+ if (start != _next_cycle_start ||
+ speed != _next_cycle_speed) {
// Transport has changed, write position at cycle start
- tmap.bbt_time(_session.transport_frame(), bbt);
+ bbt = tmap.bbt_at_frame (start);
write_position(&_impl->forge, _ev_buffers[port_index],
- tmetric, bbt, _session.transport_speed(),
- _session.transport_frame(), 0);
+ tmetric, bbt, speed, start, 0);
}
}
@@ -2147,7 +2437,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
// Now merge MIDI and any transport events into the buffer
const uint32_t type = _uri_map.urids.midi_MidiEvent;
- const framepos_t tend = _session.transport_frame() + nframes;
+ const framepos_t tend = end;
++metric_i;
while (m != m_end || (metric_i != tmap.metrics_end() &&
(*metric_i)->frame() < tend)) {
@@ -2162,11 +2452,11 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
++m;
} else {
tmetric.set_metric(metric);
- bbt = metric->start();
+ bbt = tmap.bbt_at_pulse (metric->pulse());
write_position(&_impl->forge, _ev_buffers[port_index],
- tmetric, bbt, _session.transport_speed(),
+ tmetric, bbt, speed,
metric->frame(),
- metric->frame() - _session.transport_frame());
+ metric->frame() - start);
++metric_i;
}
}
@@ -2251,9 +2541,8 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
}
}
-
// Write messages to UI
- if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
+ if ((_to_ui || _can_write_automation || _patch_port_out_index != (uint32_t)-1) &&
(flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
LV2_Evbuf* buf = _ev_buffers[port_index];
for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
@@ -2263,6 +2552,117 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
uint8_t* data;
lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
+#ifdef LV2_EXTENDED
+ // Intercept Automation Write Events
+ if ((flags & PORT_AUTOCTRL)) {
+ LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
+ if (atom->type == _uri_map.urids.atom_Blank ||
+ atom->type == _uri_map.urids.atom_Object) {
+ LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
+ if (obj->body.otype == _uri_map.urids.auto_event) {
+ // only if transport_rolling ??
+ const LV2_Atom* parameter = NULL;
+ const LV2_Atom* value = NULL;
+ lv2_atom_object_get(obj,
+ _uri_map.urids.auto_parameter, ¶meter,
+ _uri_map.urids.auto_value, &value,
+ 0);
+ if (parameter && value) {
+ const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+ const float v = ((const LV2_Atom_Float*)value)->body;
+ // -> add automation event..
+ DEBUG_TRACE(DEBUG::LV2Automate,
+ string_compose ("Event p: %1 t: %2 v: %3\n", p, frames, v));
+ AutomationCtrlPtr c = get_automation_control (p);
+ if (c &&
+ (c->ac->automation_state() == Touch || c->ac->automation_state() == Write)
+ ) {
+ framepos_t when = std::max ((framepos_t) 0, start + frames - _current_latency);
+ assert (start + frames - _current_latency >= 0);
+ if (c->guard) {
+ c->guard = false;
+ c->ac->list()->add (when, v, true, true);
+ } else {
+ c->ac->set_double (v, when, true);
+ }
+ }
+ }
+ }
+ else if (obj->body.otype == _uri_map.urids.auto_setup) {
+ // TODO optional arguments, for now we assume the plugin
+ // writes automation for its own inputs
+ // -> put them in "touch" mode (preferably "exclusive plugin touch(TM)"
+ for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
+ if (_port_flags[i->first] & PORT_CTRLED) {
+ DEBUG_TRACE(DEBUG::LV2Automate,
+ string_compose ("Setup p: %1\n", i->first));
+ i->second->ac->set_automation_state (Touch);
+ }
+ }
+ }
+ else if (obj->body.otype == _uri_map.urids.auto_finalize) {
+ // set [touched] parameters to "play" ??
+ // allow plugin to change its mode (from analyze to apply)
+ const LV2_Atom* parameter = NULL;
+ const LV2_Atom* value = NULL;
+ lv2_atom_object_get(obj,
+ _uri_map.urids.auto_parameter, ¶meter,
+ _uri_map.urids.auto_value, &value,
+ 0);
+ if (parameter && value) {
+ const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+ const float v = ((const LV2_Atom_Float*)value)->body;
+ AutomationCtrlPtr c = get_automation_control (p);
+ DEBUG_TRACE(DEBUG::LV2Automate,
+ string_compose ("Finalize p: %1 v: %2\n", p, v));
+ if (c && _port_flags[p] & PORT_CTRLER) {
+ c->ac->set_value(v, Controllable::NoGroup);
+ }
+ } else {
+ DEBUG_TRACE(DEBUG::LV2Automate, "Finalize\n");
+ }
+ for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
+ // guard will be false if an event was written
+ if ((_port_flags[i->first] & PORT_CTRLED) && !i->second->guard) {
+ DEBUG_TRACE(DEBUG::LV2Automate,
+ string_compose ("Thin p: %1\n", i->first));
+ i->second->ac->alist ()->thin (20);
+ }
+ }
+ }
+ else if (obj->body.otype == _uri_map.urids.auto_start) {
+ const LV2_Atom* parameter = NULL;
+ lv2_atom_object_get(obj,
+ _uri_map.urids.auto_parameter, ¶meter,
+ 0);
+ if (parameter) {
+ const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+ AutomationCtrlPtr c = get_automation_control (p);
+ DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Start Touch p: %1\n", p));
+ if (c) {
+ c->ac->start_touch (std::max ((framepos_t)0, start - _current_latency));
+ c->guard = true;
+ }
+ }
+ }
+ else if (obj->body.otype == _uri_map.urids.auto_end) {
+ const LV2_Atom* parameter = NULL;
+ lv2_atom_object_get(obj,
+ _uri_map.urids.auto_parameter, ¶meter,
+ 0);
+ if (parameter) {
+ const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+ AutomationCtrlPtr c = get_automation_control (p);
+ DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("End Touch p: %1\n", p));
+ if (c) {
+ c->ac->stop_touch (true, std::max ((framepos_t)0, start - _current_latency));
+ }
+ }
+ }
+ }
+ }
+#endif
+
// Intercept patch change messages to emit PropertyChanged signal
if ((flags & PORT_PATCHMSG)) {
LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
@@ -2277,19 +2677,18 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
_uri_map.urids.patch_value, &value,
0);
- if (!property || !value ||
- property->type != _uri_map.urids.atom_URID ||
- value->type != _uri_map.urids.atom_Path) {
+ if (property && value &&
+ property->type == _uri_map.urids.atom_URID &&
+ value->type == _uri_map.urids.atom_Path) {
+ const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
+ const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
+
+ // Emit PropertyChanged signal for UI
+ // TODO: This should emit the control's Changed signal
+ PropertyChanged(prop_id, Variant(Variant::PATH, path));
+ } else {
std::cerr << "warning: patch:Set for unknown property" << std::endl;
- continue;
}
-
- const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
- const char* path = (const char*)LV2_ATOM_BODY_CONST(value);
-
- // Emit PropertyChanged signal for UI
- // TODO: This should emit the control's Changed signal
- PropertyChanged(prop_id, Variant(Variant::PATH, path));
}
}
}
@@ -2306,9 +2705,13 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
set_cycles((uint32_t)(now - then));
// Update expected transport information for next cycle so we can detect changes
- _next_cycle_speed = _session.transport_speed();
- _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
+ _next_cycle_speed = speed;
+ _next_cycle_start = end;
+ if (_latency_control_port) {
+ framecnt_t new_latency = signal_latency ();
+ _current_latency = new_latency;
+ }
return 0;
}
@@ -2347,6 +2750,22 @@ LV2Plugin::parameter_is_input(uint32_t param) const
return _port_flags[param] & PORT_INPUT;
}
+uint32_t
+LV2Plugin::designated_bypass_port ()
+{
+#ifdef LV2_EXTENDED
+ const LilvPort* port = NULL;
+ LilvNode* designation = lilv_new_uri (_world.world, LV2_PROCESSING_URI__enable);
+ port = lilv_plugin_get_port_by_designation (
+ _impl->plugin, _world.lv2_InputPort, designation);
+ lilv_node_free(designation);
+ if (port) {
+ return lilv_port_get_index (_impl->plugin, port);
+ }
+#endif
+ return UINT32_MAX;
+}
+
void
LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
{
@@ -2396,10 +2815,24 @@ LV2Plugin::run(pframes_t nframes)
}
}
+ if (_worker) {
+ // Execute work synchronously if we're freewheeling (export)
+ _worker->set_synchronous(session().engine().freewheeling());
+ }
+
+ // Run the plugin for this cycle
lilv_instance_run(_impl->instance, nframes);
- if (_impl->work_iface) {
+ // Emit any queued worker responses (calls a plugin callback)
+ if (_state_worker) {
+ _state_worker->emit_responses();
+ }
+ if (_worker) {
_worker->emit_responses();
+ }
+
+ // Notify the plugin that a work run cycle is complete
+ if (_impl->work_iface) {
if (_impl->work_iface->end_run) {
_impl->work_iface->end_run(_impl->instance->lv2_handle);
}
@@ -2488,11 +2921,16 @@ LV2World::LV2World()
ev_EventPort = lilv_new_uri(world, LILV_URI_EVENT_PORT);
ext_logarithmic = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
ext_notOnGUI = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
+ ext_expensive = lilv_new_uri(world, LV2_PORT_PROPS__expensive);
+ ext_causesArtifacts= lilv_new_uri(world, LV2_PORT_PROPS__causesArtifacts);
+ ext_notAutomatic = lilv_new_uri(world, LV2_PORT_PROPS__notAutomatic);
+ ext_rangeSteps = lilv_new_uri(world, LV2_PORT_PROPS__rangeSteps);
lv2_AudioPort = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT);
lv2_OutputPort = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
lv2_inPlaceBroken = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
+ lv2_isSideChain = lilv_new_uri(world, LV2_CORE_PREFIX "isSideChain");
lv2_integer = lilv_new_uri(world, LV2_CORE__integer);
lv2_default = lilv_new_uri(world, LV2_CORE__default);
lv2_minimum = lilv_new_uri(world, LV2_CORE__minimum);
@@ -2518,7 +2956,13 @@ LV2World::LV2World()
units_db = lilv_new_uri(world, LV2_UNITS__db);
patch_writable = lilv_new_uri(world, LV2_PATCH__writable);
patch_Message = lilv_new_uri(world, LV2_PATCH__Message);
- lv2_noSampleAccurateCtrl = lilv_new_uri(world, LV2_CORE_PREFIX "noSampleAccurateControls");
+#ifdef LV2_EXTENDED
+ lv2_noSampleAccurateCtrl = lilv_new_uri(world, "http://ardour.org/lv2/ext#noSampleAccurateControls");
+ auto_can_write_automatation = lilv_new_uri(world, LV2_AUTOMATE_URI__can_write);
+ auto_automation_control = lilv_new_uri(world, LV2_AUTOMATE_URI__control);
+ auto_automation_controlled = lilv_new_uri(world, LV2_AUTOMATE_URI__controlled);
+ auto_automation_controller = lilv_new_uri(world, LV2_AUTOMATE_URI__controller);
+#endif
#ifdef HAVE_LV2_1_2_0
bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
@@ -2537,7 +2981,13 @@ LV2World::~LV2World()
lilv_node_free(bufz_fixedBlockLength);
lilv_node_free(bufz_powerOf2BlockLength);
#endif
+#ifdef LV2_EXTENDED
lilv_node_free(lv2_noSampleAccurateCtrl);
+ lilv_node_free(auto_can_write_automatation);
+ lilv_node_free(auto_automation_control);
+ lilv_node_free(auto_automation_controlled);
+ lilv_node_free(auto_automation_controller);
+#endif
lilv_node_free(patch_Message);
lilv_node_free(patch_writable);
lilv_node_free(units_hz);
@@ -2560,11 +3010,16 @@ LV2World::~LV2World()
lilv_node_free(lv2_sampleRate);
lilv_node_free(lv2_reportsLatency);
lilv_node_free(lv2_integer);
+ lilv_node_free(lv2_isSideChain);
lilv_node_free(lv2_inPlaceBroken);
lilv_node_free(lv2_OutputPort);
lilv_node_free(lv2_InputPort);
lilv_node_free(lv2_ControlPort);
lilv_node_free(lv2_AudioPort);
+ lilv_node_free(ext_rangeSteps);
+ lilv_node_free(ext_notAutomatic);
+ lilv_node_free(ext_causesArtifacts);
+ lilv_node_free(ext_expensive);
lilv_node_free(ext_notOnGUI);
lilv_node_free(ext_logarithmic);
lilv_node_free(ev_EventPort);
diff --git a/libs/ardour/lxvst_plugin.cc b/libs/ardour/lxvst_plugin.cc
index 2c50144..3939048 100644
--- a/libs/ardour/lxvst_plugin.cc
+++ b/libs/ardour/lxvst_plugin.cc
@@ -25,7 +25,7 @@
#include "ardour/session.h"
#include "ardour/lxvst_plugin.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -150,8 +150,8 @@ LXVSTPluginInfo::get_presets (bool user_only) const
if (t->read ()) { // TODO read names only. skip parsing the actual data
XMLNode* root = t->root ();
for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
- XMLProperty* uri = (*i)->property (X_("uri"));
- XMLProperty* label = (*i)->property (X_("label"));
+ XMLProperty const * uri = (*i)->property (X_("uri"));
+ XMLProperty const * label = (*i)->property (X_("label"));
p.push_back (Plugin::PresetRecord (uri->value(), label->value(), true));
}
}
diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc
index fa9ee2f..430306c 100644
--- a/libs/ardour/meter.cc
+++ b/libs/ardour/meter.cc
@@ -78,7 +78,7 @@ PeakMeter::~PeakMeter ()
* (runs in jack realtime context)
*/
void
-PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
{
if (!_active && !_pending_active) {
return;
@@ -87,6 +87,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
const bool do_reset_dpm = _reset_dpm;
_reset_max = false;
_reset_dpm = false;
+ _combined_peak = 0;
// cerr << "meter " << name() << " runs with " << bufs.available() << " inputs\n";
@@ -136,11 +137,12 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
// Meter audio in to the rest of the peaks
for (uint32_t i = 0; i < n_audio; ++i, ++n) {
if (bufs.get_audio(i).silent()) {
- ;
+ _peak_buffer[n] = 0;
} else {
_peak_buffer[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_buffer[n]);
+ _peak_buffer[n] = std::min (_peak_buffer[n], 100.f); // cut off at +40dBFS for falloff.
_max_peak_signal[n] = std::max(_peak_buffer[n], _max_peak_signal[n]); // todo sync reset
- _combined_peak =std::max(_peak_buffer[n], _combined_peak);
+ _combined_peak = std::max(_peak_buffer[n], _combined_peak);
}
if (do_reset_max) {
@@ -235,14 +237,23 @@ PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out)
bool
PeakMeter::configure_io (ChanCount in, ChanCount out)
{
+ bool changed = false;
if (out != in) { // always 1:1
return false;
}
+ if (current_meters != in) {
+ changed = true;
+ }
+
current_meters = in;
set_max_channels (in);
+ if (changed) {
+ reset_max();
+ }
+
return Processor::configure_io (in, out);
}
@@ -364,7 +375,6 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
break;
case MeterMCP:
mcptmp = _combined_peak;
- _combined_peak = 0;
return accurate_coefficient_to_dB(mcptmp);
case MeterMaxSignal:
assert(0);
diff --git a/libs/ardour/midi_automation_list_binder.cc b/libs/ardour/midi_automation_list_binder.cc
index f7249d7..b01155b 100644
--- a/libs/ardour/midi_automation_list_binder.cc
+++ b/libs/ardour/midi_automation_list_binder.cc
@@ -35,10 +35,10 @@ MidiAutomationListBinder::MidiAutomationListBinder (boost::shared_ptr<MidiSource
MidiAutomationListBinder::MidiAutomationListBinder (XMLNode* node, Session::SourceMap const & sources)
: _parameter (0, 0, 0)
{
- XMLProperty* source = node->property ("source-id");
+ XMLProperty const * source = node->property ("source-id");
assert (source);
- XMLProperty* parameter = node->property ("parameter");
+ XMLProperty const * parameter = node->property ("parameter");
assert (parameter);
Session::SourceMap::const_iterator i = sources.find (PBD::ID (source->value()));
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc
index 3a03a03..41d638d 100644
--- a/libs/ardour/midi_buffer.cc
+++ b/libs/ardour/midi_buffer.cc
@@ -80,6 +80,14 @@ MidiBuffer::copy(const MidiBuffer& copy)
memcpy(_data, copy._data, copy._size);
}
+void
+MidiBuffer::copy(MidiBuffer const * const copy)
+{
+ assert(_capacity >= copy->size ());
+ _size = copy->size ();
+ memcpy(_data, copy->data(), _size);
+}
+
/** Read events from @a src starting at time @a offset into the START of this buffer, for
* time duration @a nframes. Relative time, where 0 = start of buffer.
diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc
index 8c95272..f2dc4f9 100644
--- a/libs/ardour/midi_clock_slave.cc
+++ b/libs/ardour/midi_clock_slave.cc
@@ -35,7 +35,7 @@
#include "ardour/slave.h"
#include "ardour/tempo.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -82,8 +82,8 @@ MIDIClock_Slave::rebind (MidiPort& port)
void
MIDIClock_Slave::calculate_one_ppqn_in_frames_at(framepos_t time)
{
- const Tempo& current_tempo = session->tempo_map().tempo_at(time);
- double frames_per_beat = current_tempo.frames_per_beat(session->frame_rate());
+ const Tempo& current_tempo = session->tempo_map().tempo_at_frame (time);
+ double const frames_per_beat = session->tempo_map().frames_per_beat_at (time, session->frame_rate());
double quarter_notes_per_beat = 4.0 / current_tempo.note_type();
double frames_per_quarter_note = frames_per_beat / quarter_notes_per_beat;
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 485967b..4d3dd4e 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -58,7 +58,7 @@
#include "midi++/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -1213,7 +1213,7 @@ MidiDiskstream::get_state ()
{
XMLNode& node (Diskstream::get_state());
char buf[64];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
if (_write_source && _session.get_record_enabled()) {
@@ -1247,7 +1247,7 @@ MidiDiskstream::set_state (const XMLNode& node, int version)
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
XMLNode* capture_pending_node = 0;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
/* prevent write sources from being created */
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index 1950fbe..4e895c5 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -40,7 +40,7 @@
#include "ardour/session.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -491,7 +491,7 @@ Evoral::Sequence<MidiModel::TimeType>::NotePtr
MidiModel::NoteDiffCommand::unmarshal_note (XMLNode *xml_note)
{
unsigned int note;
- XMLProperty* prop;
+ XMLProperty const * prop;
unsigned int channel;
MidiModel::TimeType time;
MidiModel::TimeType length;
@@ -599,7 +599,7 @@ MidiModel::NoteDiffCommand::marshal_change (const NoteChange& change)
MidiModel::NoteDiffCommand::NoteChange
MidiModel::NoteDiffCommand::unmarshal_change (XMLNode *xml_change)
{
- XMLProperty* prop;
+ XMLProperty const * prop;
NoteChange change;
change.note_id = 0;
@@ -876,7 +876,7 @@ MidiModel::SysExDiffCommand::marshal_change (const Change& change)
MidiModel::SysExDiffCommand::Change
MidiModel::SysExDiffCommand::unmarshal_change (XMLNode *xml_change)
{
- XMLProperty* prop;
+ XMLProperty const * prop;
Change change;
if ((prop = xml_change->property ("property")) != 0) {
@@ -1235,8 +1235,8 @@ MidiModel::PatchChangeDiffCommand::marshal_change (const Change& c)
MidiModel::PatchChangePtr
MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
{
- XMLProperty* prop;
- XMLProperty* prop_id;
+ XMLProperty const * prop;
+ XMLProperty const * prop_id;
Evoral::event_id_t id = 0;
Evoral::Beats time = Evoral::Beats();
int channel = 0;
@@ -1277,7 +1277,7 @@ MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
MidiModel::PatchChangeDiffCommand::Change
MidiModel::PatchChangeDiffCommand::unmarshal_change (XMLNode* n)
{
- XMLProperty* prop;
+ XMLProperty const * prop;
Change c;
int an_int;
@@ -1482,8 +1482,9 @@ MidiModel::sync_to_source (const Glib::Threads::Mutex::Lock& source_lock)
bool
MidiModel::write_section_to (boost::shared_ptr<MidiSource> source,
const Glib::Threads::Mutex::Lock& source_lock,
- Evoral::Beats begin_time,
- Evoral::Beats end_time)
+ TimeType begin_time,
+ TimeType end_time,
+ bool offset_events)
{
ReadLock lock(read_lock());
MidiStateTracker mst;
@@ -1495,21 +1496,17 @@ MidiModel::write_section_to (boost::shared_ptr<MidiSource> source,
source->mark_streaming_midi_write_started (source_lock, note_mode());
for (Evoral::Sequence<TimeType>::const_iterator i = begin(TimeType(), true); i != end(); ++i) {
- const Evoral::Event<Evoral::Beats>& ev (*i);
+ if (i->time() >= begin_time && i->time() < end_time) {
- if (ev.time() >= begin_time && ev.time() < end_time) {
+ Evoral::MIDIEvent<TimeType> mev (*i, true); /* copy the event */
- const Evoral::MIDIEvent<Evoral::Beats>* mev =
- static_cast<const Evoral::MIDIEvent<Evoral::Beats>* > (&ev);
-
- if (!mev) {
- continue;
+ if (offset_events) {
+ mev.set_time(mev.time() - begin_time);
}
+ if (mev.is_note_off()) {
- if (mev->is_note_off()) {
-
- if (!mst.active (mev->note(), mev->channel())) {
+ if (!mst.active (mev.note(), mev.channel())) {
/* the matching note-on was outside the
time range we were given, so just
ignore this note-off.
@@ -1517,18 +1514,21 @@ MidiModel::write_section_to (boost::shared_ptr<MidiSource> source,
continue;
}
- source->append_event_beats (source_lock, *i);
- mst.remove (mev->note(), mev->channel());
+ source->append_event_beats (source_lock, mev);
+ mst.remove (mev.note(), mev.channel());
- } else if (mev->is_note_on()) {
- mst.add (mev->note(), mev->channel());
- source->append_event_beats(source_lock, *i);
+ } else if (mev.is_note_on()) {
+ mst.add (mev.note(), mev.channel());
+ source->append_event_beats(source_lock, mev);
} else {
- source->append_event_beats(source_lock, *i);
+ source->append_event_beats(source_lock, mev);
}
}
}
+ if (offset_events) {
+ end_time -= begin_time;
+ }
mst.resolve_notes (*source, source_lock, end_time);
set_percussive(old_percussive);
diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc
index 133f4ee..8a6d8df 100644
--- a/libs/ardour/midi_patch_manager.cc
+++ b/libs/ardour/midi_patch_manager.cc
@@ -29,7 +29,7 @@
#include "ardour/search_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/midi_playlist.cc b/libs/ardour/midi_playlist.cc
index 7adbe70..e3274c7 100644
--- a/libs/ardour/midi_playlist.cc
+++ b/libs/ardour/midi_playlist.cc
@@ -36,7 +36,7 @@
#include "ardour/session.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -48,7 +48,7 @@ MidiPlaylist::MidiPlaylist (Session& session, const XMLNode& node, bool hidden)
, _read_end(0)
{
#ifndef NDEBUG
- const XMLProperty* prop = node.property("type");
+ XMLProperty const * prop = node.property("type");
assert(prop && DataType(prop->value()) == DataType::MIDI);
#endif
diff --git a/libs/ardour/midi_playlist_source.cc b/libs/ardour/midi_playlist_source.cc
index 3d9c5b1..65c2794 100644
--- a/libs/ardour/midi_playlist_source.cc
+++ b/libs/ardour/midi_playlist_source.cc
@@ -25,7 +25,7 @@
#include "ardour/midi_playlist.h"
#include "ardour/midi_playlist_source.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc
index 56472e4..eef2811 100644
--- a/libs/ardour/midi_region.cc
+++ b/libs/ardour/midi_region.cc
@@ -28,7 +28,7 @@
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
#include "pbd/xml++.h"
#include "pbd/basename.h"
@@ -44,7 +44,7 @@
#include "ardour/tempo.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -91,9 +91,9 @@ MidiRegion::MidiRegion (const SourceList& srcs)
MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other)
: Region (other)
, _start_beats (Properties::start_beats, other->_start_beats)
- , _length_beats (Properties::length_beats, Evoral::Beats())
+ , _length_beats (Properties::length_beats, other->_length_beats)
{
- update_length_beats ();
+ //update_length_beats ();
register_properties ();
assert(_name.val().find("/") == string::npos);
@@ -102,17 +102,13 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other)
}
/** Create a new MidiRegion that is part of an existing one */
-MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t offset)
- : Region (other, offset)
+MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t offset, const int32_t sub_num)
+ : Region (other, offset, sub_num)
, _start_beats (Properties::start_beats, Evoral::Beats())
- , _length_beats (Properties::length_beats, Evoral::Beats())
+ , _length_beats (Properties::length_beats, other->_length_beats)
{
- BeatsFramesConverter bfc (_session.tempo_map(), _position);
- Evoral::Beats const offset_beats = bfc.from (offset);
-
- _start_beats = other->_start_beats.val() + offset_beats;
- _length_beats = other->_length_beats.val() - offset_beats;
-
+ _start_beats = Evoral::Beats (_session.tempo_map().exact_beat_at_frame ((other->_position + offset), sub_num) - other->beat()) + other->_start_beats;
+ update_length_beats (sub_num);
register_properties ();
assert(_name.val().find("/") == string::npos);
@@ -124,6 +120,37 @@ MidiRegion::~MidiRegion ()
{
}
+/** Export the MIDI data of the MidiRegion to a new MIDI file (SMF).
+ */
+bool
+MidiRegion::do_export (string path) const
+{
+ boost::shared_ptr<MidiSource> newsrc;
+
+ /* caller must check for pre-existing file */
+ assert (!path.empty());
+ assert (!Glib::file_test (path, Glib::FILE_TEST_EXISTS));
+ newsrc = boost::dynamic_pointer_cast<MidiSource>(
+ SourceFactory::createWritable(DataType::MIDI, _session,
+ path, false, _session.frame_rate()));
+
+ BeatsFramesConverter bfc (_session.tempo_map(), _position);
+ Evoral::Beats const bbegin = bfc.from (_start);
+ Evoral::Beats const bend = bfc.from (_start + _length);
+
+ {
+ /* Lock our source since we'll be reading from it. write_to() will
+ take a lock on newsrc. */
+ Source::Lock lm (midi_source(0)->mutex());
+ if (midi_source(0)->export_write_to (lm, newsrc, bbegin, bend)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
/** Create a new MidiRegion that has its own version of some/all of the Source used by another.
*/
boost::shared_ptr<MidiRegion>
@@ -166,7 +193,10 @@ MidiRegion::clone (boost::shared_ptr<MidiSource> newsrc) const
plist.add (Properties::length_beats, _length_beats);
plist.add (Properties::layer, 0);
- return boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (newsrc, plist, true));
+ boost::shared_ptr<MidiRegion> ret (boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (newsrc, plist, true)));
+ ret->set_beat (beat());
+
+ return ret;
}
void
@@ -175,7 +205,8 @@ MidiRegion::post_set (const PropertyChange& pc)
Region::post_set (pc);
if (pc.contains (Properties::length) && !pc.contains (Properties::length_beats)) {
- update_length_beats ();
+ /* update non-musically */
+ update_length_beats (0);
} else if (pc.contains (Properties::start) && !pc.contains (Properties::start_beats)) {
set_start_beats_from_start_frames ();
}
@@ -184,49 +215,71 @@ MidiRegion::post_set (const PropertyChange& pc)
void
MidiRegion::set_start_beats_from_start_frames ()
{
- BeatsFramesConverter c (_session.tempo_map(), _position - _start);
- _start_beats = c.from (_start);
+ _start_beats = Evoral::Beats (beat() - _session.tempo_map().beat_at_frame (_position - _start));
}
void
-MidiRegion::set_length_internal (framecnt_t len)
+MidiRegion::set_length_internal (framecnt_t len, const int32_t sub_num)
{
- Region::set_length_internal (len);
- update_length_beats ();
+ Region::set_length_internal (len, sub_num);
+ update_length_beats (sub_num);
}
void
-MidiRegion::update_after_tempo_map_change ()
+MidiRegion::update_after_tempo_map_change (bool /* send */)
{
- Region::update_after_tempo_map_change ();
+ boost::shared_ptr<Playlist> pl (playlist());
- /* _position has now been updated for the new tempo map */
- _start = _position - _session.tempo_map().framepos_minus_beats (_position, _start_beats);
+ if (!pl || position_lock_style() != MusicTime) {
+ return;
+ }
+
+ const framepos_t old_pos = _position;
+ const framepos_t old_length = _length;
+ const framepos_t old_start = _start;
+
+ Region::update_after_tempo_map_change (false);
+
+ /* _start has now been updated. */
+ _length = _session.tempo_map().frame_at_beat (beat() + _length_beats.val().to_double()) - _position;
+
+ PropertyChange s_and_l;
+ if (old_start != _start) {
+ s_and_l.add (Properties::start);
+ }
+ if (old_length != _length) {
+ s_and_l.add (Properties::length);
+ }
+ if (old_pos != _position) {
+ s_and_l.add (Properties::position);
+ }
- send_change (Properties::start);
+ send_change (s_and_l);
}
void
-MidiRegion::update_length_beats ()
+MidiRegion::update_length_beats (const int32_t sub_num)
{
- BeatsFramesConverter converter (_session.tempo_map(), _position);
- _length_beats = converter.from (_length);
+ _length_beats = Evoral::Beats (_session.tempo_map().exact_beat_at_frame (_position + _length, sub_num) - beat());
}
void
-MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
+MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num)
{
- Region::set_position_internal (pos, allow_bbt_recompute);
- /* zero length regions don't exist - so if _length_beats is zero, this object
- is under construction.
- */
- if (_length_beats.val() == Evoral::Beats()) {
- /* leave _length_beats alone, and change _length to reflect the state of things
- at the new position (tempo map may dictate a different number of frames
- */
- BeatsFramesConverter converter (_session.tempo_map(), _position);
- Region::set_length_internal (converter.to (_length_beats));
+ Region::set_position_internal (pos, allow_bbt_recompute, sub_num);
+
+ /* set _start to new position in tempo map */
+ _start = _position - _session.tempo_map().frame_at_beat (beat() - _start_beats.val().to_double());
+
+ /* in construction from src */
+ if (_length_beats == Evoral::Beats()) {
+ update_length_beats (sub_num);
}
+
+ /* leave _length_beats alone, and change _length to reflect the state of things
+ at the new position (tempo map may dictate a different number of frames).
+ */
+ Region::set_length_internal (_session.tempo_map().frame_at_beat (beat() + _length_beats.val().to_double()) - _position, sub_num);
}
framecnt_t
@@ -309,7 +362,9 @@ MidiRegion::_read_at (const SourceList& /*srcs*/,
to_read, // read duration in frames
tracker,
filter,
- _filtered_parameters
+ _filtered_parameters,
+ beat(),
+ _start_beats.val().to_double()
) != to_read) {
return 0; /* "read nothing" */
}
@@ -329,7 +384,10 @@ MidiRegion::set_state (const XMLNode& node, int version)
int ret = Region::set_state (node, version);
if (ret == 0) {
- update_length_beats ();
+ /* set length beats to the frame (non-musical) */
+ if (position_lock_style() == AudioTime) {
+ update_length_beats (0);
+ }
}
return ret;
@@ -459,8 +517,79 @@ MidiRegion::fix_negative_start ()
}
void
-MidiRegion::set_start_internal (framecnt_t s)
+MidiRegion::set_start_internal (framecnt_t s, const int32_t sub_num)
{
- Region::set_start_internal (s);
- set_start_beats_from_start_frames ();
+ Region::set_start_internal (s, sub_num);
+
+ if (position_lock_style() == AudioTime) {
+ set_start_beats_from_start_frames ();
+ }
+}
+
+void
+MidiRegion::trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num)
+{
+ framepos_t new_start;
+
+ if (locked()) {
+ return;
+ }
+
+ PropertyChange what_changed;
+
+ /* beat has been set exactly by set_position_internal, but the source starts on a frame.
+ working in beats seems the correct thing to do, but reports of a missing first note
+ on playback suggest otherwise. for now, we work in exact beats.
+ */
+ const double pos_beat = _session.tempo_map().exact_beat_at_frame (position, sub_num);
+ const double beat_delta = pos_beat - beat();
+
+ /* Set position before length, otherwise for MIDI regions this bad thing happens:
+ * 1. we call set_length_internal; length in beats is computed using the region's current
+ * (soon-to-be old) position
+ * 2. we call set_position_internal; position is set and length in frames re-computed using
+ * length in beats from (1) but at the new position, which is wrong if the region
+ * straddles a tempo/meter change.
+ */
+
+ if (_position != position) {
+ set_position_internal (position, true, sub_num);
+ what_changed.add (Properties::position);
+ }
+
+ const double new_start_beat = _start_beats.val().to_double() + beat_delta;
+ new_start = _position - _session.tempo_map().frame_at_beat (beat() - new_start_beat);
+
+ if (!verify_start_and_length (new_start, length)) {
+ return;
+ }
+
+ if (_start != new_start) {
+ _start_beats = Evoral::Beats (new_start_beat);
+ what_changed.add (Properties::start_beats);
+
+ set_start_internal (new_start, sub_num);
+ what_changed.add (Properties::start);
+ }
+
+ if (_length != length) {
+ set_length_internal (length, sub_num);
+ what_changed.add (Properties::length);
+ what_changed.add (Properties::length_beats);
+ }
+
+ set_whole_file (false);
+
+ PropertyChange start_and_length;
+
+ start_and_length.add (Properties::start);
+ start_and_length.add (Properties::length);
+
+ if (what_changed.contains (start_and_length)) {
+ first_edit ();
+ }
+
+ if (!what_changed.empty()) {
+ send_change (what_changed);
+ }
}
diff --git a/libs/ardour/midi_scene_change.cc b/libs/ardour/midi_scene_change.cc
index ed0729b..969dadb 100644
--- a/libs/ardour/midi_scene_change.cc
+++ b/libs/ardour/midi_scene_change.cc
@@ -23,7 +23,7 @@
#include "ardour/midi_port.h"
#include "ardour/midi_scene_change.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
@@ -123,7 +123,7 @@ MIDISceneChange::set_state (const XMLNode& node, int /* version-ignored */)
return -1;
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property (X_("program"))) == 0) {
return -1;
diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc
index 7f6c865..07eb549 100644
--- a/libs/ardour/midi_scene_changer.cc
+++ b/libs/ardour/midi_scene_changer.cc
@@ -30,7 +30,7 @@
#include "ardour/midi_scene_changer.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc
index 0314a92..97bce4b 100644
--- a/libs/ardour/midi_source.cc
+++ b/libs/ardour/midi_source.cc
@@ -44,10 +44,11 @@
#include "ardour/midi_source.h"
#include "ardour/midi_state_tracker.h"
#include "ardour/session.h"
+#include "ardour/tempo.h"
#include "ardour/session_directory.h"
#include "ardour/source_factory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR { template <typename T> class MidiRingBuffer; }
@@ -113,7 +114,7 @@ MidiSource::get_state ()
int
MidiSource::set_state (const XMLNode& node, int /*version*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("captured-for")) != 0) {
_captured_for = prop->value();
}
@@ -192,9 +193,11 @@ MidiSource::midi_read (const Lock& lm,
framecnt_t cnt,
MidiStateTracker* tracker,
MidiChannelFilter* filter,
- const std::set<Evoral::Parameter>& filtered) const
+ const std::set<Evoral::Parameter>& filtered,
+ double beat,
+ double start_beat) const
{
- BeatsFramesConverter converter(_session.tempo_map(), source_start);
+ //BeatsFramesConverter converter(_session.tempo_map(), source_start);
DEBUG_TRACE (DEBUG::MidiSourceIO,
string_compose ("MidiSource::midi_read() %5 sstart %1 start %2 cnt %3 tracker %4\n",
@@ -247,12 +250,14 @@ MidiSource::midi_read (const Lock& lm,
* some way (maybe keep an iterator per playlist).
*/
for (i = _model->begin(); i != _model->end(); ++i) {
- const framecnt_t time_frames = converter.to(i->time());
- if (time_frames >= start) {
+ if (i->time().to_double() + (beat - start_beat) >= beat) {
break;
}
}
_model_iter_valid = true;
+ if (!linear_read) {
+ _model->active_notes().clear();
+ }
#endif
}
@@ -260,21 +265,21 @@ MidiSource::midi_read (const Lock& lm,
// Copy events in [start, start + cnt) into dst
for (; i != _model->end(); ++i) {
- const framecnt_t time_frames = converter.to(i->time());
- if (time_frames < start + cnt) {
+ const framecnt_t time_frames = _session.tempo_map().frame_at_beat (i->time().to_double() + (beat - start_beat));
+
+ if (time_frames < start + cnt + source_start) {
if (filter && filter->filter(i->buffer(), i->size())) {
DEBUG_TRACE (DEBUG::MidiSourceIO,
string_compose ("%1: filter event @ %2 type %3 size %4\n",
- _name, time_frames + source_start, i->event_type(), i->size()));
+ _name, time_frames, i->event_type(), i->size()));
continue;
}
-
// Offset by source start to convert event time to session time
- dst.write (time_frames + source_start, i->event_type(), i->size(), i->buffer());
+ dst.write (time_frames, i->event_type(), i->size(), i->buffer());
DEBUG_TRACE (DEBUG::MidiSourceIO,
string_compose ("%1: add event @ %2 type %3 size %4\n",
- _name, time_frames + source_start, i->event_type(), i->size()));
+ _name, time_frames, i->event_type(), i->size()));
if (tracker) {
tracker->track (*i);
@@ -380,6 +385,23 @@ MidiSource::mark_streaming_write_completed (const Lock& lock)
}
int
+MidiSource::export_write_to (const Lock& lock, boost::shared_ptr<MidiSource> newsrc, Evoral::Beats begin, Evoral::Beats end)
+{
+ Lock newsrc_lock (newsrc->mutex ());
+
+ if (!_model) {
+ error << string_compose (_("programming error: %1"), X_("no model for MidiSource during export"));
+ return -1;
+ }
+
+ _model->write_section_to (newsrc, newsrc_lock, begin, end, true);
+
+ newsrc->flush_midi(newsrc_lock);
+
+ return 0;
+}
+
+int
MidiSource::write_to (const Lock& lock, boost::shared_ptr<MidiSource> newsrc, Evoral::Beats begin, Evoral::Beats end)
{
Lock newsrc_lock (newsrc->mutex ());
diff --git a/libs/ardour/midi_state_tracker.cc b/libs/ardour/midi_state_tracker.cc
index 0403461..884d1e1 100644
--- a/libs/ardour/midi_state_tracker.cc
+++ b/libs/ardour/midi_state_tracker.cc
@@ -55,7 +55,7 @@ MidiStateTracker::add (uint8_t note, uint8_t chn)
++_active_notes[note + 128 * chn];
if (_active_notes[note+128 * chn] > 1) {
- cerr << this << " note " << (int) note << '/' << (int) chn << " was already on, now at " << (int) _active_notes[note+128*chn] << endl;
+ //cerr << this << " note " << (int) note << '/' << (int) chn << " was already on, now at " << (int) _active_notes[note+128*chn] << endl;
}
DEBUG_TRACE (PBD::DEBUG::MidiTrackers, string_compose ("%1 ON %2/%3 voices %5 total on %4\n",
diff --git a/libs/ardour/midi_stretch.cc b/libs/ardour/midi_stretch.cc
index 71ffcc2..70f44e1 100644
--- a/libs/ardour/midi_stretch.cc
+++ b/libs/ardour/midi_stretch.cc
@@ -26,7 +26,7 @@
#include "ardour/midi_stretch.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -114,8 +114,8 @@ MidiStretch::run (boost::shared_ptr<Region> r, Progress*)
new_src->copy_interpolation_from (src);
const int ret = finish (region, nsrcs, new_name);
-
- results[0]->set_length((framecnt_t) floor (r->length() * _request.time_fraction));
+ /* non-musical */
+ results[0]->set_length((framecnt_t) floor (r->length() * _request.time_fraction), 0);
return ret;
}
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index da47fab..b79a1cf 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -44,6 +44,7 @@
#include "ardour/midi_port.h"
#include "ardour/midi_region.h"
#include "ardour/midi_track.h"
+#include "ardour/monitor_control.h"
#include "ardour/parameter_types.h"
#include "ardour/port.h"
#include "ardour/processor.h"
@@ -53,7 +54,7 @@
#include "ardour/session_playlists.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
class InterThreadInfo;
@@ -66,8 +67,8 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-MidiTrack::MidiTrack (Session& sess, string name, Route::Flag flag, TrackMode mode)
- : Track (sess, name, flag, mode, DataType::MIDI)
+MidiTrack::MidiTrack (Session& sess, string name, TrackMode mode)
+ : Track (sess, name, PresentationInfo::MidiTrack, mode, DataType::MIDI)
, _immediate_events(1024) // FIXME: size?
, _step_edit_ring_buffer(64) // FIXME: size?
, _note_mode(Sustained)
@@ -103,24 +104,24 @@ MidiTrack::create_diskstream ()
}
-void
-MidiTrack::set_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
+bool
+MidiTrack::can_be_record_safe ()
{
if (_step_editing) {
- return;
+ return false;
}
- Track::set_record_enabled (yn, group_override);
+ return Track::can_be_record_safe ();
}
-void
-MidiTrack::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
+bool
+MidiTrack::can_be_record_enabled ()
{
- if (_step_editing) { /* REQUIRES REVIEW */
- return;
+ if (_step_editing) {
+ return false;
}
- Track::set_record_safe (yn, group_override);
+ return Track::can_be_record_enabled ();
}
void
@@ -161,7 +162,7 @@ MidiTrack::midi_diskstream() const
int
MidiTrack::set_state (const XMLNode& node, int version)
{
- const XMLProperty *prop;
+ XMLProperty const * prop;
/* This must happen before Track::set_state(), as there will be a buffer
fill during that call, and we must fill buffers using the correct
@@ -272,8 +273,8 @@ void
MidiTrack::set_state_part_two ()
{
XMLNode* fnode;
- XMLProperty* prop;
- LocaleGuard lg (X_("C"));
+ XMLProperty const * prop;
+ LocaleGuard lg;
/* This is called after all session state has been restored but before
have been made ports and connections are established.
@@ -372,7 +373,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
if (!_active) {
silence (nframes);
- if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
+ if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
_meter->reset();
}
return 0;
@@ -395,16 +396,6 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
return dret;
}
- if (_mute_control->list() && _mute_control->automation_playback()) {
- bool valid = false;
- const float mute = _mute_control->list()->rt_safe_eval(transport_frame, valid);
- if (mute >= 0.5 && !muted()) {
- _mute_control->set_value_unchecked(1.0); // mute
- } else if (mute < 0.5 && muted()) {
- _mute_control->set_value_unchecked(0.0); // unmute
- }
- }
-
BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
fill_buffers_with_input (bufs, _input, nframes);
@@ -412,8 +403,8 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
/* filter captured data before meter sees it */
_capture_filter.filter (bufs);
- if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
- _meter->run (bufs, start_frame, end_frame, nframes, true);
+ if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
+ _meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
}
@@ -453,12 +444,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
process_output_buffers (bufs, start_frame, end_frame, nframes,
declick, (!diskstream->record_enabled() && !_session.transport_stopped()));
- for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
- if (d) {
- d->flush_buffers (nframes);
- }
- }
+ flush_processor_buffers_locked (nframes);
need_butler = diskstream->commit (playback_distance);
@@ -726,22 +712,7 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st
}
void
-MidiTrack::MidiControl::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
- if (writable()) {
- _set_value (val, group_override);
- }
-}
-
-void
-MidiTrack::MidiControl::set_value_unchecked (double val)
-{
- /* used only by automation playback */
- _set_value (val, Controllable::NoGroup);
-}
-
-void
-MidiTrack::MidiControl::_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
+MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
{
const Evoral::Parameter ¶meter = _list ? _list->parameter() : Control::parameter();
const Evoral::ParameterDescriptor &desc = EventTypeMap::instance().descriptor(parameter);
@@ -798,7 +769,7 @@ MidiTrack::MidiControl::_set_value (double val, PBD::Controllable::GroupControlD
_route->write_immediate_event(size, ev);
}
- AutomationControl::set_value(val, group_override);
+ AutomationControl::actually_set_value(val, group_override);
}
void
@@ -934,7 +905,7 @@ MidiTrack::act_on_mute ()
return;
}
- if (muted() || _mute_master->muted_by_others_at(MuteMaster::AllPoints)) {
+ if (muted() || _mute_master->muted_by_others_soloing_at (MuteMaster::AllPoints)) {
/* only send messages for channels we are using */
uint16_t mask = _playback_filter.get_channel_mask();
@@ -958,35 +929,27 @@ MidiTrack::act_on_mute ()
}
void
-MidiTrack::set_monitoring (MonitorChoice mc, Controllable::GroupControlDisposition gcd)
+MidiTrack::monitoring_changed (bool self, Controllable::GroupControlDisposition gcd)
{
- if (use_group (gcd, &RouteGroup::is_monitoring)) {
- _route_group->apply (&Track::set_monitoring, mc, Controllable::NoGroup);
- return;
- }
+ Track::monitoring_changed (self, gcd);
- if (mc != _monitoring) {
+ /* monitoring state changed, so flush out any on notes at the
+ * port level.
+ */
- Track::set_monitoring (mc, gcd);
+ PortSet& ports (_output->ports());
- /* monitoring state changed, so flush out any on notes at the
- * port level.
- */
-
- PortSet& ports (_output->ports());
-
- for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) {
- boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
- if (mp) {
- mp->require_resolve ();
- }
+ for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) {
+ boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
+ if (mp) {
+ mp->require_resolve ();
}
+ }
- boost::shared_ptr<MidiDiskstream> md (midi_diskstream());
+ boost::shared_ptr<MidiDiskstream> md (midi_diskstream());
- if (md) {
- md->reset_tracker ();
- }
+ if (md) {
+ md->reset_tracker ();
}
}
@@ -999,4 +962,3 @@ MidiTrack::monitoring_state () const
}
return ms;
}
-
diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc
index 1d2fe7c..eaacde2 100644
--- a/libs/ardour/midi_ui.cc
+++ b/libs/ardour/midi_ui.cc
@@ -37,7 +37,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace Glib;
-#include "i18n.h"
+#include "pbd/i18n.h"
MidiControlUI* MidiControlUI::_instance = 0;
@@ -82,8 +82,13 @@ MidiControlUI::do_request (MidiUIRequest* req)
}
bool
-MidiControlUI::midi_input_handler (IOCondition ioc, boost::shared_ptr<AsyncMIDIPort> port)
+MidiControlUI::midi_input_handler (IOCondition ioc, boost::weak_ptr<AsyncMIDIPort> wport)
{
+ boost::shared_ptr<AsyncMIDIPort> port = wport.lock ();
+ if (!port) {
+ return false;
+ }
+
DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", boost::shared_ptr<ARDOUR::Port> (port)->name()));
if (ioc & ~IO_IN) {
@@ -130,7 +135,8 @@ MidiControlUI::reset_ports ()
}
for (vector<boost::shared_ptr<AsyncMIDIPort> >::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) {
- (*pi)->xthread().set_receive_handler (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi));
+ (*pi)->xthread().set_receive_handler (sigc::bind (
+ sigc::mem_fun (this, &MidiControlUI::midi_input_handler), boost::weak_ptr<AsyncMIDIPort>(*pi)));
(*pi)->xthread().attach (_main_loop->get_context());
}
}
diff --git a/libs/ardour/midiport_manager.cc b/libs/ardour/midiport_manager.cc
index 7f3f05a..7f5dee4 100644
--- a/libs/ardour/midiport_manager.cc
+++ b/libs/ardour/midiport_manager.cc
@@ -22,7 +22,7 @@
#include "ardour/midiport_manager.h"
#include "ardour/rc_configuration.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
@@ -111,7 +111,7 @@ MidiPortManager::create_ports ()
void
MidiPortManager::set_midi_port_states (const XMLNodeList&nodes)
{
- XMLProperty* prop;
+ XMLProperty const * prop;
typedef map<std::string,boost::shared_ptr<Port> > PortMap;
PortMap ports;
const int version = 0;
diff --git a/libs/ardour/monitor_control.cc b/libs/ardour/monitor_control.cc
new file mode 100644
index 0000000..907a747
--- /dev/null
+++ b/libs/ardour/monitor_control.cc
@@ -0,0 +1,80 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/monitor_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+MonitorControl::MonitorControl (Session& session, std::string const & name, Monitorable& m)
+ : SlavableAutomationControl (session, MonitoringAutomation, ParameterDescriptor (MonitoringAutomation),
+ boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(MonitoringAutomation))),
+ name)
+
+ , _monitorable (m)
+ , _monitoring (MonitorAuto)
+{
+ _list->set_interpolation(Evoral::ControlList::Discrete);
+ /* monitoring changes must be synchronized by the process cycle */
+ set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+MonitorControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ int v = (int) val;
+ switch (v) {
+ case MonitorAuto:
+ case MonitorInput:
+ case MonitorDisk:
+ case MonitorCue:
+ break;
+ default:
+ /* illegal value */
+ return;
+ }
+
+ _monitoring = MonitorChoice (v);
+ AutomationControl::actually_set_value (val, gcd);
+}
+
+XMLNode&
+MonitorControl::get_state ()
+{
+ XMLNode& node (SlavableAutomationControl::get_state());
+ node.add_property (X_("monitoring"), enum_2_string (_monitoring));
+ return node;
+}
+
+int
+MonitorControl::set_state (XMLNode const & node, int version)
+{
+ SlavableAutomationControl::set_state (node, version);
+
+ const XMLProperty* prop;
+
+ if ((prop = node.property (X_("monitoring"))) != 0) {
+ _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
+ } else {
+ _monitoring = MonitorAuto;
+ }
+
+ return 0;
+}
diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc
index 6b73af6..811d5a1 100644
--- a/libs/ardour/monitor_processor.cc
+++ b/libs/ardour/monitor_processor.cc
@@ -28,7 +28,7 @@
#include "ardour/monitor_processor.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -37,11 +37,11 @@ using namespace std;
/* specialize for bool because of set_value() semantics */
namespace ARDOUR {
- template<> void MPControl<bool>::set_value (double v, PBD::Controllable::GroupControlDisposition /*group_override*/) {
+ template<> void MPControl<bool>::set_value (double v, PBD::Controllable::GroupControlDisposition gcd) {
bool newval = fabs (v) >= 0.5;
if (newval != _value) {
_value = newval;
- Changed(); /* EMIT SIGNAL */
+ Changed (true, gcd); /* EMIT SIGNAL */
}
}
}
@@ -112,7 +112,7 @@ MonitorProcessor::set_state (const XMLNode& node, int version)
return ret;
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property (X_("type"))) == 0) {
error << string_compose (X_("programming error: %1"), X_("MonitorProcessor XML settings have no type information"))
@@ -226,7 +226,7 @@ MonitorProcessor::set_state (const XMLNode& node, int version)
XMLNode&
MonitorProcessor::state (bool full)
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNode& node (Processor::state (full));
char buf[64];
@@ -270,7 +270,7 @@ MonitorProcessor::state (bool full)
}
void
-MonitorProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool /*result_required*/)
+MonitorProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool /*result_required*/)
{
uint32_t chn = 0;
gain_t target_gain;
diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc
index 25aa93d..102694e 100644
--- a/libs/ardour/mtc_slave.cc
+++ b/libs/ardour/mtc_slave.cc
@@ -34,7 +34,7 @@
#include <glibmm/timer.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/mute_control.cc b/libs/ardour/mute_control.cc
new file mode 100644
index 0000000..5b38547
--- /dev/null
+++ b/libs/ardour/mute_control.cc
@@ -0,0 +1,194 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "evoral/ControlList.hpp"
+
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/mute_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+
+
+MuteControl::MuteControl (Session& session, std::string const & name, Muteable& m)
+ : SlavableAutomationControl (session, MuteAutomation, ParameterDescriptor (MuteAutomation),
+ boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (MuteAutomation))),
+ name)
+ , _muteable (m)
+{
+ _list->set_interpolation (Evoral::ControlList::Discrete);
+ /* mute changes must be synchronized by the process cycle */
+ set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+MuteControl::post_add_master (boost::shared_ptr<AutomationControl> m)
+{
+ if (m->get_value()) {
+
+ /* boolean masters records are not updated until AFTER
+ * ::post_add_master() is called, so we can use them to check
+ * on whether any master was already enabled before the new
+ * one was added.
+ */
+
+ if (!muted_by_self() && !get_boolean_masters()) {
+ _muteable.mute_master()->set_muted_by_masters (true);
+ Changed (false, Controllable::NoGroup);
+ }
+ }
+}
+
+void
+MuteControl::pre_remove_master (boost::shared_ptr<AutomationControl> m)
+{
+ if (!m) {
+ /* null control ptr means we're removing all masters */
+ _muteable.mute_master()->set_muted_by_masters (false);
+ /* Changed will be emitted in SlavableAutomationControl::clear_masters() */
+ return;
+ }
+
+ if (m->get_value()) {
+ if (!muted_by_self() && (get_boolean_masters() == 1)) {
+ Changed (false, Controllable::NoGroup);
+ }
+ }
+}
+
+void
+MuteControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ if (muted_by_self() != bool (val)) {
+ _muteable.mute_master()->set_muted_by_self (val);
+
+ /* allow the Muteable to respond to the mute change
+ before anybody else knows about it.
+ */
+ _muteable.act_on_mute ();
+ }
+
+ SlavableAutomationControl::actually_set_value (val, gcd);
+}
+
+void
+MuteControl::master_changed (bool self_change, Controllable::GroupControlDisposition gcd, boost::shared_ptr<AutomationControl> m)
+{
+ bool send_signal = false;
+ boost::shared_ptr<MuteControl> mc = boost::dynamic_pointer_cast<MuteControl> (m);
+
+ if (m->get_value()) {
+ /* this master is now enabled */
+ if (!muted_by_self() && get_boolean_masters() == 0) {
+ _muteable.mute_master()->set_muted_by_masters (true);
+ send_signal = true;
+ }
+ } else {
+ /* this master is disabled and there was only 1 enabled before */
+ if (!muted_by_self() && get_boolean_masters() == 1) {
+ _muteable.mute_master()->set_muted_by_masters (false);
+ send_signal = true;
+ }
+ }
+
+ update_boolean_masters_records (m);
+
+ if (send_signal) {
+ Changed (false, Controllable::NoGroup);
+ }
+}
+
+double
+MuteControl::get_value () const
+{
+ if (slaved ()) {
+ return muted_by_self() || get_masters_value ();
+ }
+
+ if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+ // Playing back automation, get the value from the list
+ return AutomationControl::get_value();
+ }
+
+ return muted();
+}
+
+void
+MuteControl::set_mute_points (MuteMaster::MutePoint mp)
+{
+ _muteable.mute_master()->set_mute_points (mp);
+ _muteable.mute_points_changed (); /* EMIT SIGNAL */
+
+ if (_muteable.mute_master()->muted_by_self()) {
+ Changed (true, Controllable::UseGroup); /* EMIT SIGNAL */
+ }
+}
+
+MuteMaster::MutePoint
+MuteControl::mute_points () const
+{
+ return _muteable.mute_master()->mute_points ();
+}
+
+bool
+MuteControl::muted () const
+{
+ /* have to get (self-muted) value from somewhere. could be our own
+ Control, or the Muteable that we sort-of proxy for. Since this
+ method is called by ::get_value(), use the latter to avoid recursion.
+ */
+ return _muteable.mute_master()->muted_by_self() || get_masters_value ();
+}
+
+bool
+MuteControl::muted_by_self () const
+{
+ return _muteable.mute_master()->muted_by_self();
+}
+
+bool
+MuteControl::muted_by_masters () const
+{
+ return get_masters_value ();
+}
+
+bool
+MuteControl::muted_by_others_soloing () const
+{
+ return _muteable.muted_by_others_soloing ();
+}
+
+void
+MuteControl::automation_run (framepos_t start, pframes_t)
+{
+ if (!list() || !automation_playback()) {
+ return;
+ }
+
+ bool valid = false;
+ const float mute = list()->rt_safe_eval (start, valid);
+
+ if (mute >= 0.5 && !muted()) {
+ set_value_unchecked (1.0); // mute
+ } else if (mute < 0.5 && muted ()) {
+ set_value_unchecked (0.0); // unmute
+ }
+}
diff --git a/libs/ardour/mute_master.cc b/libs/ardour/mute_master.cc
index 8f81a5e..ed77942 100644
--- a/libs/ardour/mute_master.cc
+++ b/libs/ardour/mute_master.cc
@@ -26,21 +26,24 @@
#include "ardour/mute_master.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
+const string MuteMaster::xml_node_name (X_("MuteMaster"));
+
const MuteMaster::MutePoint MuteMaster::AllPoints = MuteMaster::MutePoint(
PreFader|PostFader|Listen|Main);
-MuteMaster::MuteMaster (Session& s, const std::string&)
+MuteMaster::MuteMaster (Session& s, Muteable& m, const std::string&)
: SessionHandleRef (s)
+ , _muteable (&m)
, _mute_point (MutePoint (0))
, _muted_by_self (false)
, _soloed_by_self (false)
, _soloed_by_others (false)
- , _solo_ignore (false)
+ , _muted_by_masters (0)
{
if (Config->get_mute_affects_pre_fader ()) {
@@ -86,22 +89,22 @@ MuteMaster::mute_gain_at (MutePoint mp) const
if (Config->get_solo_mute_override()) {
if (_soloed_by_self) {
gain = GAIN_COEFF_UNITY;
- } else if (muted_by_self_at (mp)) {
+ } else if (muted_by_self_at (mp) || muted_by_masters_at (mp)) {
gain = GAIN_COEFF_ZERO;
} else {
- if (muted_by_others_at (mp) && !_soloed_by_others) {
+ if (!_soloed_by_others && muted_by_others_soloing_at (mp)) {
gain = Config->get_solo_mute_gain ();
} else {
gain = GAIN_COEFF_UNITY;
}
}
} else {
- if (muted_by_self_at (mp)) {
+ if (muted_by_self_at (mp) || muted_by_masters_at (mp)) {
gain = GAIN_COEFF_ZERO;
} else if (_soloed_by_self || _soloed_by_others) {
gain = GAIN_COEFF_UNITY;
} else {
- if (muted_by_others_at (mp)) {
+ if (muted_by_others_soloing_at (mp)) {
gain = Config->get_solo_mute_gain ();
} else {
gain = GAIN_COEFF_UNITY;
@@ -136,7 +139,7 @@ MuteMaster::set_mute_points (MutePoint mp)
int
MuteMaster::set_state (const XMLNode& node, int /*version*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("mute-point")) != 0) {
_mute_point = (MutePoint) string_2_enum (prop->value(), _mute_point);
@@ -154,15 +157,20 @@ MuteMaster::set_state (const XMLNode& node, int /*version*/)
XMLNode&
MuteMaster::get_state()
{
- XMLNode* node = new XMLNode (X_("MuteMaster"));
+ XMLNode* node = new XMLNode (xml_node_name);
node->add_property ("mute-point", enum_2_string (_mute_point));
node->add_property ("muted", (_muted_by_self ? X_("yes") : X_("no")));
return *node;
}
bool
-MuteMaster::muted_by_others_at (MutePoint mp) const
+MuteMaster::muted_by_others_soloing_at (MutePoint mp) const
{
- return (!_solo_ignore && _session.soloing() && (_mute_point & mp));
+ return _muteable->muted_by_others_soloing() && (_mute_point & mp);
}
+void
+MuteMaster::set_muted_by_masters (bool yn)
+{
+ _muted_by_masters = yn;
+}
diff --git a/libs/ardour/muteable.cc b/libs/ardour/muteable.cc
new file mode 100644
index 0000000..c94b55a
--- /dev/null
+++ b/libs/ardour/muteable.cc
@@ -0,0 +1,27 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/muteable.h"
+#include "ardour/mute_master.h"
+
+using namespace ARDOUR;
+
+Muteable::Muteable (Session& s, std::string const & name)
+ : _mute_master (new MuteMaster (s, *this, name))
+{
+}
diff --git a/libs/ardour/onset_detector.cc b/libs/ardour/onset_detector.cc
index 60fea6d..7658bd8 100644
--- a/libs/ardour/onset_detector.cc
+++ b/libs/ardour/onset_detector.cc
@@ -20,7 +20,7 @@
#include <cmath>
#include "ardour/onset_detector.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Vamp;
using namespace ARDOUR;
@@ -93,6 +93,16 @@ OnsetDetector::set_peak_threshold (float val)
}
void
+OnsetDetector::set_minioi (float val)
+{
+#ifdef HAVE_AUBIO4
+ if (plugin) {
+ plugin->setParameter ("minioi", val);
+ }
+#endif
+}
+
+void
OnsetDetector::set_function (int val)
{
if (plugin) {
diff --git a/libs/ardour/operations.cc b/libs/ardour/operations.cc
index 1b4796d..5c5fe41 100644
--- a/libs/ardour/operations.cc
+++ b/libs/ardour/operations.cc
@@ -19,7 +19,7 @@
#include <glib.h>
#include "ardour/operations.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
GQuark Operations::capture;
GQuark Operations::paste;
diff --git a/libs/ardour/pan_controllable.cc b/libs/ardour/pan_controllable.cc
index a6a9678..89842b1 100644
--- a/libs/ardour/pan_controllable.cc
+++ b/libs/ardour/pan_controllable.cc
@@ -35,27 +35,13 @@ PanControllable::lower () const
}
void
-PanControllable::set_value (double v, PBD::Controllable::GroupControlDisposition group_override)
-{
- if (writable()) {
- _set_value (v, group_override);
- }
-}
-void
-PanControllable::set_value_unchecked (double v)
-{
- /* used only automation playback */
- _set_value (v, Controllable::NoGroup);
-}
-
-void
-PanControllable::_set_value (double v, Controllable::GroupControlDisposition group_override)
+PanControllable::actually_set_value (double v, Controllable::GroupControlDisposition group_override)
{
boost::shared_ptr<Panner> p = owner->panner();
if (!p) {
/* no panner: just do it */
- AutomationControl::set_value (v, group_override);
+ AutomationControl::actually_set_value (v, group_override);
return;
}
@@ -76,7 +62,12 @@ PanControllable::_set_value (double v, Controllable::GroupControlDisposition gro
}
if (can_set) {
- AutomationControl::set_value (v, group_override);
+ AutomationControl::actually_set_value (v, group_override);
}
}
+std::string
+PanControllable::get_user_string () const
+{
+ return owner->value_as_string (shared_from_this());
+}
diff --git a/libs/ardour/pannable.cc b/libs/ardour/pannable.cc
index f589024..d77c8a0 100644
--- a/libs/ardour/pannable.cc
+++ b/libs/ardour/pannable.cc
@@ -20,8 +20,8 @@
#include "pbd/error.h"
#include "pbd/convert.h"
#include "pbd/compose.h"
-#include "pbd/boost_debug.h"
+#include "ardour/boost_debug.h"
#include "ardour/debug.h"
#include "ardour/automation_control.h"
#include "ardour/automation_list.h"
@@ -30,7 +30,7 @@
#include "ardour/pan_controllable.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -187,6 +187,7 @@ Pannable::get_state ()
XMLNode&
Pannable::state (bool /*full*/)
{
+ LocaleGuard lg;
XMLNode* node = new XMLNode (X_("Pannable"));
node->add_child_nocopy (pan_azimuth_control->get_state());
@@ -213,7 +214,7 @@ Pannable::set_state (const XMLNode& root, int version)
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == Controllable::xml_node_name) {
- const XMLProperty* prop = (*niter)->property (X_("name"));
+ XMLProperty const * prop = (*niter)->property (X_("name"));
if (!prop) {
continue;
@@ -235,7 +236,7 @@ Pannable::set_state (const XMLNode& root, int version)
set_automation_xml_state (**niter, PanAzimuthAutomation);
} else {
- const XMLProperty* prop;
+ XMLProperty const * prop;
/* old school (alpha1-6) XML info */
@@ -274,7 +275,7 @@ Pannable::set_state (const XMLNode& root, int version)
}
string
-Pannable::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Pannable::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
boost::shared_ptr<Panner> p = panner ();
diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc
index c88fbe4..59e4e2e 100644
--- a/libs/ardour/panner.cc
+++ b/libs/ardour/panner.cc
@@ -22,7 +22,7 @@
#include "ardour/panner.h"
#include "ardour/pannable.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -109,7 +109,7 @@ Panner::describe_parameter (Evoral::Parameter p)
}
string
-Panner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Panner::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
return _pannable->value_as_string (ac);
}
diff --git a/libs/ardour/panner_manager.cc b/libs/ardour/panner_manager.cc
index 906e979..c6b73b4 100644
--- a/libs/ardour/panner_manager.cc
+++ b/libs/ardour/panner_manager.cc
@@ -32,7 +32,7 @@
#include "ardour/search_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc
index 678b1a1..6c3ae00 100644
--- a/libs/ardour/panner_shell.cc
+++ b/libs/ardour/panner_shell.cc
@@ -32,7 +32,6 @@
#include <glibmm.h>
#include "pbd/cartesian.h"
-#include "pbd/boost_debug.h"
#include "pbd/convert.h"
#include "pbd/error.h"
#include "pbd/failed_constructor.h"
@@ -43,16 +42,18 @@
#include "ardour/audio_buffer.h"
#include "ardour/audioengine.h"
+#include "ardour/boost_debug.h"
#include "ardour/buffer_set.h"
#include "ardour/debug.h"
#include "ardour/pannable.h"
#include "ardour/panner.h"
#include "ardour/panner_manager.h"
#include "ardour/panner_shell.h"
+#include "ardour/profile.h"
#include "ardour/session.h"
#include "ardour/speakers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/mathfix.h"
@@ -73,7 +74,7 @@ PannerShell::PannerShell (string name, Session& s, boost::shared_ptr<Pannable> p
{
if (is_send) {
_pannable_internal.reset(new Pannable (s));
- if (Config->get_link_send_and_route_panner()) {
+ if (Config->get_link_send_and_route_panner() && !ARDOUR::Profile->get_mixbus()) {
_panlinked = true;
} else {
_panlinked = false;
@@ -170,15 +171,17 @@ PannerShell::set_state (const XMLNode& node, int version)
{
XMLNodeList nlist = node.children ();
XMLNodeConstIterator niter;
- const XMLProperty *prop;
- LocaleGuard lg (X_("C"));
+ XMLProperty const * prop;
+ LocaleGuard lg;
if ((prop = node.property (X_("bypassed"))) != 0) {
set_bypassed (string_is_affirmative (prop->value ()));
}
if ((prop = node.property (X_("linked-to-route"))) != 0) {
- _panlinked = string_is_affirmative (prop->value ());
+ if (!ARDOUR::Profile->get_mixbus()) {
+ _panlinked = string_is_affirmative (prop->value ());
+ }
}
if ((prop = node.property (X_("user-panner"))) != 0) {
diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc
index 7ce6a5e..bf0c9b7 100644
--- a/libs/ardour/parameter_descriptor.cc
+++ b/libs/ardour/parameter_descriptor.cc
@@ -24,7 +24,7 @@
#include "ardour/types.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
@@ -75,6 +75,7 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
normal = 0.0f;
break;
case RecEnableAutomation:
+ case RecSafeAutomation:
lower = 0.0;
upper = 1.0;
toggled = true;
@@ -157,6 +158,9 @@ ParameterDescriptor::update_steps()
step = slider_position_to_gain(largestep / 10.0);
smallstep = step;
} else {
+ /* note that LV2Plugin::get_parameter_descriptor ()
+ * overrides this is lv2:rangeStep is set for a port.
+ */
const float delta = upper - lower;
/* 30 happens to be the total number of steps for a fader with default
@@ -178,10 +182,40 @@ ParameterDescriptor::update_steps()
largestep = largestep / logf(30.0f);
} else if (integer_step) {
smallstep = 1.0;
- step = std::max(1.0, rint(step));
- largestep = std::max(1.0, rint(largestep));
+ step = std::max(1.f, rintf (step));
+ largestep = std::max(1.f, rintf (largestep));
}
}
}
+std::string
+ParameterDescriptor::midi_note_name (const uint8_t b)
+{
+ char buf[8];
+ if (b > 127) {
+ snprintf(buf, sizeof(buf), "%d", b);
+ return buf;
+ }
+
+ static const char* notes[] = {
+ S_("Note|C"),
+ S_("Note|C#"),
+ S_("Note|D"),
+ S_("Note|D#"),
+ S_("Note|E"),
+ S_("Note|F"),
+ S_("Note|F#"),
+ S_("Note|G"),
+ S_("Note|G#"),
+ S_("Note|A"),
+ S_("Note|A#"),
+ S_("Note|B")
+ };
+
+ /* MIDI note 0 is in octave -1 (in scientific pitch notation) */
+ const int octave = b / 12 - 1;
+ snprintf (buf, sizeof (buf), "%s%d", notes[b % 12], octave);
+ return buf;
+}
+
} // namespace ARDOUR
diff --git a/libs/ardour/phase_control.cc b/libs/ardour/phase_control.cc
new file mode 100644
index 0000000..9757c10
--- /dev/null
+++ b/libs/ardour/phase_control.cc
@@ -0,0 +1,97 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/phase_control.h"
+#include "ardour/session.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+
+PhaseControl::PhaseControl (Session& session, std::string const & name)
+ : AutomationControl (session, PhaseAutomation, ParameterDescriptor (PhaseAutomation),
+ boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(PhaseAutomation))),
+ name)
+{
+}
+
+void
+PhaseControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ _phase_invert = boost::dynamic_bitset<> (std::numeric_limits<double>::digits, (unsigned long) val);
+
+ AutomationControl::actually_set_value (val, gcd);
+}
+
+/** @param c Audio channel index.
+ * @param yn true to invert phase, otherwise false.
+ */
+void
+PhaseControl::set_phase_invert (uint32_t c, bool yn)
+{
+ if (_phase_invert[c] != yn) {
+ _phase_invert[c] = yn;
+ AutomationControl::actually_set_value (_phase_invert.to_ulong(), Controllable::NoGroup);
+ _session.set_dirty ();
+ }
+}
+
+void
+PhaseControl::set_phase_invert (boost::dynamic_bitset<> p)
+{
+ if (_phase_invert != p) {
+ _phase_invert = p;
+ AutomationControl::actually_set_value (_phase_invert.to_ulong(), Controllable::NoGroup);
+ Changed (true, Controllable::NoGroup); /* EMIT SIGNAL */
+ _session.set_dirty ();
+ }
+}
+
+void
+PhaseControl::resize (uint32_t n)
+{
+ _phase_invert.resize (n);
+}
+
+XMLNode&
+PhaseControl::get_state ()
+{
+ XMLNode& node (AutomationControl::get_state ());
+
+ string p;
+ boost::to_string (_phase_invert, p);
+ node.add_property("phase-invert", p);
+
+ return node;
+}
+
+int
+PhaseControl::set_state (XMLNode const & node, int version)
+{
+ AutomationControl::set_state (node, version);
+
+ const XMLProperty* prop;
+
+ if ((prop = node.property (X_("phase-invert"))) != 0) {
+ set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
+ }
+
+ return 0;
+}
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 41681a7..7074442 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -40,7 +40,7 @@
#include "ardour/session_playlists.h"
#include "ardour/source_factory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -141,7 +141,7 @@ Playlist::Playlist (Session& sess, const XMLNode& node, DataType type, bool hide
, _type(type)
{
#ifndef NDEBUG
- const XMLProperty* prop = node.property("type");
+ XMLProperty const * prop = node.property("type");
assert(!prop || DataType(prop->value()) == _type);
#endif
@@ -657,6 +657,7 @@ Playlist::flush_notifications (bool from_undo)
pending_range_moves.clear ();
pending_region_extensions.clear ();
pending_contents_change = false;
+ pending_layering = false;
}
/*************************************************************
@@ -665,7 +666,7 @@ Playlist::flush_notifications (bool from_undo)
/** Note: this calls set_layer (..., DBL_MAX) so it will reset the layering index of region */
void
- Playlist::add_region (boost::shared_ptr<Region> region, framepos_t position, float times, bool auto_partition)
+ Playlist::add_region (boost::shared_ptr<Region> region, framepos_t position, float times, bool auto_partition, const int32_t sub_num)
{
RegionWriteLock rlock (this);
times = fabs (times);
@@ -679,7 +680,7 @@ Playlist::flush_notifications (bool from_undo)
}
if (itimes >= 1) {
- add_region_internal (region, pos);
+ add_region_internal (region, pos, sub_num);
set_layer (region, DBL_MAX);
pos += region->length();
--itimes;
@@ -691,8 +692,8 @@ Playlist::flush_notifications (bool from_undo)
*/
for (int i = 0; i < itimes; ++i) {
- boost::shared_ptr<Region> copy = RegionFactory::create (region, true);
- add_region_internal (copy, pos);
+ boost::shared_ptr<Region> copy = RegionFactory::create (region, true, sub_num);
+ add_region_internal (copy, pos, sub_num);
set_layer (copy, DBL_MAX);
pos += region->length();
}
@@ -713,7 +714,7 @@ Playlist::flush_notifications (bool from_undo)
plist.add (Properties::layer, region->layer());
boost::shared_ptr<Region> sub = RegionFactory::create (region, plist);
- add_region_internal (sub, pos);
+ add_region_internal (sub, pos, sub_num);
set_layer (sub, DBL_MAX);
}
}
@@ -734,7 +735,7 @@ Playlist::flush_notifications (bool from_undo)
}
bool
- Playlist::add_region_internal (boost::shared_ptr<Region> region, framepos_t position)
+ Playlist::add_region_internal (boost::shared_ptr<Region> region, framepos_t position, const int32_t sub_num)
{
if (region->data_type() != _type) {
return false;
@@ -747,7 +748,7 @@ Playlist::flush_notifications (bool from_undo)
region->set_playlist (boost::weak_ptr<Playlist>(foo));
}
- region->set_position (position);
+ region->set_position (position, sub_num);
regions.insert (upper_bound (regions.begin(), regions.end(), region, cmp), region);
all_regions.insert (region);
@@ -1146,7 +1147,7 @@ Playlist::flush_notifications (bool from_undo)
chopped.
*/
- ret->paste (pl, (*i).start - start, 1.0f);
+ ret->paste (pl, (*i).start - start, 1.0f, 0);
}
}
@@ -1208,7 +1209,7 @@ Playlist::flush_notifications (bool from_undo)
}
int
- Playlist::paste (boost::shared_ptr<Playlist> other, framepos_t position, float times)
+ Playlist::paste (boost::shared_ptr<Playlist> other, framepos_t position, float times, const int32_t sub_num)
{
times = fabs (times);
@@ -1230,7 +1231,7 @@ Playlist::flush_notifications (bool from_undo)
the ordering they had in the original playlist.
*/
- add_region_internal (copy_of_region, (*i)->position() + pos);
+ add_region_internal (copy_of_region, (*i)->position() + pos, sub_num);
set_layer (copy_of_region, copy_of_region->layer() + top);
}
pos += shift;
@@ -1321,7 +1322,7 @@ Playlist::duplicate_range (AudioRange& range, float times)
{
boost::shared_ptr<Playlist> pl = copy (range.start, range.length(), true);
framecnt_t offset = range.end - range.start;
- paste (pl, range.start + offset, times);
+ paste (pl, range.start + offset, times, 0);
}
void
@@ -1345,7 +1346,7 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
for (list<AudioRange>::iterator i = ranges.begin(); i != ranges.end(); ++i) {
boost::shared_ptr<Playlist> pl = copy ((*i).start, (*i).length(), true);
- paste (pl, (*i).start + offset, 1.0f); // times ??
+ paste (pl, (*i).start + offset, 1.0f, 0); // times ??
}
}
@@ -1384,12 +1385,12 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
/* XXX: may not be necessary; Region::post_set should do this, I think */
for (RegionList::iterator r = fixup.begin(); r != fixup.end(); ++r) {
- (*r)->recompute_position_from_lock_style ();
+ (*r)->recompute_position_from_lock_style (0);
}
}
void
- Playlist::split (framepos_t at)
+ Playlist::split (framepos_t at, const int32_t sub_num)
{
RegionWriteLock rlock (this);
RegionList copy (regions.rlist());
@@ -1398,19 +1399,19 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
*/
for (RegionList::iterator r = copy.begin(); r != copy.end(); ++r) {
- _split_region (*r, at);
+ _split_region (*r, at, sub_num);
}
}
void
- Playlist::split_region (boost::shared_ptr<Region> region, framepos_t playlist_position)
+ Playlist::split_region (boost::shared_ptr<Region> region, framepos_t playlist_position, const int32_t sub_num)
{
RegionWriteLock rl (this);
- _split_region (region, playlist_position);
+ _split_region (region, playlist_position, sub_num);
}
void
- Playlist::_split_region (boost::shared_ptr<Region> region, framepos_t playlist_position)
+ Playlist::_split_region (boost::shared_ptr<Region> region, framepos_t playlist_position, const int32_t sub_num)
{
if (!region->covers (playlist_position)) {
return;
@@ -1451,7 +1452,7 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
since it supplies that offset to the Region constructor, which
is necessary to get audio region gain envelopes right.
*/
- left = RegionFactory::create (region, 0, plist);
+ left = RegionFactory::create (region, 0, plist, true, sub_num);
}
RegionFactory::region_name (after_name, region->name(), false);
@@ -1466,7 +1467,7 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
plist.add (Properties::layer, region->layer ());
/* same note as above */
- right = RegionFactory::create (region, before, plist);
+ right = RegionFactory::create (region, before, plist, true, sub_num);
}
add_region_internal (left, region->position());
@@ -1769,11 +1770,29 @@ Playlist::region_bounds_changed (const PropertyChange& what_changed, boost::shar
}
- /***********************************************************************
+ /* *********************************************************************
FINDING THINGS
**********************************************************************/
boost::shared_ptr<RegionList>
+Playlist::region_list()
+{
+ RegionReadLock rlock (this);
+ boost::shared_ptr<RegionList> rlist (new RegionList (regions.rlist ()));
+ return rlist;
+}
+
+void
+Playlist::deep_sources (std::set<boost::shared_ptr<Source> >& sources) const
+{
+ RegionReadLock rlock (const_cast<Playlist*>(this));
+
+ for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
+ (*i)->deep_sources (sources);
+ }
+}
+
+boost::shared_ptr<RegionList>
Playlist::regions_at (framepos_t frame)
{
RegionReadLock rlock (this);
@@ -1822,6 +1841,7 @@ Playlist::regions_at (framepos_t frame)
for (RegionList::iterator i = rlist->begin(); i != rlist->end(); ) {
RegionList::iterator tmp = i;
+
++tmp;
if ((*i)->muted()) {
@@ -1949,7 +1969,7 @@ Playlist::find_next_transient (framepos_t from, int dir)
bool reached = false;
if (dir > 0) {
- for (AnalysisFeatureList::iterator x = points.begin(); x != points.end(); ++x) {
+ for (AnalysisFeatureList::const_iterator x = points.begin(); x != points.end(); ++x) {
if ((*x) >= from) {
reached = true;
}
@@ -2047,23 +2067,25 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir)
boost::shared_ptr<Region> r = (*i);
frameoffset_t distance;
+ const framepos_t first_frame = r->first_frame();
+ const framepos_t last_frame = r->last_frame();
- if (r->first_frame() > frame) {
+ if (first_frame > frame) {
- distance = r->first_frame() - frame;
+ distance = first_frame - frame;
if (distance < closest) {
- ret = r->first_frame();
+ ret = first_frame;
closest = distance;
}
}
- if (r->last_frame () > frame) {
+ if (last_frame > frame) {
- distance = r->last_frame () - frame;
+ distance = last_frame - frame;
if (distance < closest) {
- ret = r->last_frame ();
+ ret = last_frame;
closest = distance;
}
}
@@ -2075,23 +2097,25 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir)
boost::shared_ptr<Region> r = (*i);
frameoffset_t distance;
+ const framepos_t first_frame = r->first_frame();
+ const framepos_t last_frame = r->last_frame();
- if (r->last_frame() < frame) {
+ if (last_frame < frame) {
- distance = frame - r->last_frame();
+ distance = frame - last_frame;
if (distance < closest) {
- ret = r->last_frame();
+ ret = last_frame;
closest = distance;
}
}
- if (r->first_frame() < frame) {
+ if (first_frame < frame) {
- distance = frame - r->first_frame();
+ distance = frame - first_frame;
if (distance < closest) {
- ret = r->first_frame();
+ ret = first_frame;
closest = distance;
}
}
@@ -2156,7 +2180,7 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir)
XMLNodeConstIterator niter;
XMLPropertyList plist;
XMLPropertyConstIterator piter;
- XMLProperty *prop;
+ XMLProperty const * prop;
boost::shared_ptr<Region> region;
string region_name;
bool seen_region_nodes = false;
@@ -2647,12 +2671,18 @@ Playlist::nudge_after (framepos_t start, framecnt_t distance, bool forwards)
}
bool
-Playlist::uses_source (boost::shared_ptr<const Source> src) const
+Playlist::uses_source (boost::shared_ptr<const Source> src, bool shallow) const
{
RegionReadLock rlock (const_cast<Playlist*> (this));
for (set<boost::shared_ptr<Region> >::const_iterator r = all_regions.begin(); r != all_regions.end(); ++r) {
- if ((*r)->uses_source (src)) {
+ /* Note: passing the second argument as false can cause at best
+ incredibly deep and time-consuming recursion, and at worst
+ cycles if the user has managed to create cycles of reference
+ between compound regions. We generally only this during
+ cleanup, and @param shallow is passed as true.
+ */
+ if ((*r)->uses_source (src, shallow)) {
return true;
}
}
@@ -2660,6 +2690,7 @@ Playlist::uses_source (boost::shared_ptr<const Source> src) const
return false;
}
+
boost::shared_ptr<Region>
Playlist::find_region (const ID& id) const
{
@@ -2897,7 +2928,7 @@ Playlist::update_after_tempo_map_change ()
for (RegionList::iterator i = copy.begin(); i != copy.end(); ++i) {
(*i)->update_after_tempo_map_change ();
}
-
+ /* possibly causes a contents changed notification (flush_notifications()) */
thaw ();
}
@@ -2923,25 +2954,6 @@ Playlist::has_region_at (framepos_t const p) const
return (i != regions.end());
}
-/** Remove any region that uses a given source */
-void
-Playlist::remove_region_by_source (boost::shared_ptr<Source> s)
-{
- RegionWriteLock rl (this);
-
- RegionList::iterator i = regions.begin();
- while (i != regions.end()) {
- RegionList::iterator j = i;
- ++j;
-
- if ((*i)->uses_source (s)) {
- remove_region_internal (*i);
- }
-
- i = j;
- }
-}
-
/** Look from a session frame time and find the start time of the next region
* which is on the top layer of this playlist.
* @param t Time to look from.
@@ -3126,7 +3138,7 @@ Playlist::uncombine (boost::shared_ptr<Region> target)
// (2) get all the original regions
- const RegionList& rl (pl->region_list().rlist());
+ const RegionList& rl (pl->region_list_property().rlist());
RegionFactory::CompoundAssociations& cassocs (RegionFactory::compound_associations());
frameoffset_t move_offset = 0;
@@ -3173,7 +3185,7 @@ Playlist::uncombine (boost::shared_ptr<Region> target)
}
/* check to see how the original region (in the
- * playlist before compounding occured) overlaps
+ * playlist before compounding occurred) overlaps
* with the new state of the compound region.
*/
diff --git a/libs/ardour/playlist_factory.cc b/libs/ardour/playlist_factory.cc
index 150ae6c..46f9910 100644
--- a/libs/ardour/playlist_factory.cc
+++ b/libs/ardour/playlist_factory.cc
@@ -25,7 +25,7 @@
#include "ardour/midi_playlist.h"
#include "ardour/playlist_factory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -36,7 +36,7 @@ PBD::Signal2<void,boost::shared_ptr<Playlist>, bool> PlaylistFactory::PlaylistCr
boost::shared_ptr<Playlist>
PlaylistFactory::create (Session& s, const XMLNode& node, bool hidden, bool unused)
{
- const XMLProperty* type = node.property("type");
+ XMLProperty const * type = node.property("type");
boost::shared_ptr<Playlist> pl;
diff --git a/libs/ardour/playlist_source.cc b/libs/ardour/playlist_source.cc
index ed8735b..07f7233 100644
--- a/libs/ardour/playlist_source.cc
+++ b/libs/ardour/playlist_source.cc
@@ -34,7 +34,7 @@
#include "ardour/playlist_source.h"
#include "ardour/playlist_factory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -93,7 +93,7 @@ PlaylistSource::set_state (const XMLNode& node, int /*version*/)
{
/* check that we have a playlist ID */
- const XMLProperty *prop = node.property (X_("playlist"));
+ XMLProperty const * prop = node.property (X_("playlist"));
if (!prop) {
error << _("No playlist ID in PlaylistSource XML!") << endmsg;
diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc
index 31e9e2e..a0ac97b 100644
--- a/libs/ardour/plugin.cc
+++ b/libs/ardour/plugin.cc
@@ -46,6 +46,7 @@
#include "ardour/chan_count.h"
#include "ardour/chan_mapping.h"
#include "ardour/data_type.h"
+#include "ardour/luaproc.h"
#include "ardour/midi_buffer.h"
#include "ardour/midi_state_tracker.h"
#include "ardour/plugin.h"
@@ -64,7 +65,7 @@
#include "pbd/stl_delete.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -162,6 +163,10 @@ ARDOUR::find_plugin(Session& session, string identifier, PluginType type)
PluginInfoList plugs;
switch (type) {
+ case ARDOUR::Lua:
+ plugs = mgr.lua_plugin_info();
+ break;
+
case ARDOUR::LADSPA:
plugs = mgr.ladspa_plugin_info();
break;
@@ -249,9 +254,52 @@ Plugin::input_streams () const
return ChanCount::ZERO;
}
+Plugin::IOPortDescription
+Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
+{
+ std::stringstream ss;
+ switch (dt) {
+ case DataType::AUDIO:
+ ss << _("Audio") << " ";
+ break;
+ case DataType::MIDI:
+ ss << _("Midi") << " ";
+ break;
+ default:
+ ss << _("?") << " ";
+ break;
+ }
+ if (input) {
+ ss << _("In") << " ";
+ } else {
+ ss << _("Out") << " ";
+ }
+
+ ss << (id + 1);
+
+ Plugin::IOPortDescription iod (ss.str());
+ return iod;
+}
+
+PluginOutputConfiguration
+Plugin::possible_output () const
+{
+ PluginOutputConfiguration oc;
+ if (_info) {
+ oc.insert (_info->n_outputs.n_audio ());
+ }
+ return oc;
+}
+
const Plugin::PresetRecord *
Plugin::preset_by_label (const string& label)
{
+#ifndef NO_PLUGIN_STATE
+ if (!_have_presets) {
+ find_presets ();
+ _have_presets = true;
+ }
+#endif
// FIXME: O(n)
for (map<string, PresetRecord>::const_iterator i = _presets.begin(); i != _presets.end(); ++i) {
if (i->second.label == label) {
@@ -265,6 +313,12 @@ Plugin::preset_by_label (const string& label)
const Plugin::PresetRecord *
Plugin::preset_by_uri (const string& uri)
{
+#ifndef NO_PLUGIN_STATE
+ if (!_have_presets) {
+ find_presets ();
+ _have_presets = true;
+ }
+#endif
map<string, PresetRecord>::const_iterator pr = _presets.find (uri);
if (pr != _presets.end()) {
return &pr->second;
@@ -275,8 +329,9 @@ Plugin::preset_by_uri (const string& uri)
int
Plugin::connect_and_run (BufferSet& bufs,
- ChanMapping /*in_map*/, ChanMapping /*out_map*/,
- pframes_t /* nframes */, framecnt_t /*offset*/)
+ framepos_t /*start*/, framepos_t /*end*/, double /*speed*/,
+ ChanMapping /*in_map*/, ChanMapping /*out_map*/,
+ pframes_t /* nframes */, framecnt_t /*offset*/)
{
if (bufs.count().n_midi() > 0) {
@@ -371,6 +426,7 @@ Plugin::load_preset (PresetRecord r)
_last_preset = r;
_parameter_changed_since_last_preset = false;
+ _session.set_dirty ();
PresetLoaded (); /* EMIT SIGNAL */
return true;
}
@@ -382,6 +438,7 @@ Plugin::clear_preset ()
_last_preset.label = "";
_parameter_changed_since_last_preset = false;
+ _session.set_dirty ();
PresetLoaded (); /* EMIT SIGNAL */
}
@@ -427,7 +484,7 @@ XMLNode &
Plugin::get_state ()
{
XMLNode* root = new XMLNode (state_node_name ());
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
root->add_property (X_("last-preset-uri"), _last_preset.uri);
root->add_property (X_("last-preset-label"), _last_preset.label);
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 96b8570..9a0e6c5 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -33,8 +33,10 @@
#include "ardour/debug.h"
#include "ardour/event_type_map.h"
#include "ardour/ladspa_plugin.h"
+#include "ardour/luaproc.h"
#include "ardour/plugin.h"
#include "ardour/plugin_insert.h"
+#include "ardour/port.h"
#ifdef LV2_SUPPORT
#include "ardour/lv2_plugin.h"
@@ -55,7 +57,7 @@
#include "ardour/session.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -65,14 +67,41 @@ const string PluginInsert::port_automation_node_name = "PortAutomation";
PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
: Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
+ , _sc_playback_latency (0)
+ , _sc_capture_latency (0)
+ , _plugin_signal_latency (0)
, _signal_analysis_collected_nframes(0)
, _signal_analysis_collect_nframes_max(0)
+ , _configured (false)
+ , _no_inplace (false)
+ , _strict_io (false)
+ , _custom_cfg (false)
+ , _maps_from_state (false)
+ , _bypass_port (UINT32_MAX)
{
/* the first is the master */
if (plug) {
add_plugin (plug);
create_automatable_parameters ();
+ const ChanCount& sc (sidechain_input_pins ());
+ if (sc.n_audio () > 0 || sc.n_midi () > 0) {
+ add_sidechain (sc.n_audio (), sc.n_midi ());
+ }
+ }
+}
+
+PluginInsert::~PluginInsert ()
+{
+}
+
+void
+PluginInsert::set_strict_io (bool b)
+{
+ bool changed = _strict_io != b;
+ _strict_io = b;
+ if (changed) {
+ PluginConfigChanged (); /* EMIT SIGNAL */
}
}
@@ -81,9 +110,14 @@ PluginInsert::set_count (uint32_t num)
{
bool require_state = !_plugins.empty();
+ if (require_state && num > 1 && plugin (0)->get_info ()->type == ARDOUR::AudioUnit) {
+ // we don't allow to replicate AUs
+ return false;
+ }
+
/* this is a bad idea.... we shouldn't do this while active.
- only a route holding their redirect_lock should be calling this
- */
+ * only a route holding their redirect_lock should be calling this
+ */
if (num == 0) {
return false;
@@ -93,27 +127,123 @@ PluginInsert::set_count (uint32_t num)
for (uint32_t n = 0; n < diff; ++n) {
boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
add_plugin (p);
- if (active ()) {
- p->activate ();
- }
if (require_state) {
- /* XXX do something */
+ XMLNode& state = _plugins[0]->get_state ();
+ p->set_state (state, Stateful::loading_state_version);
+ }
+
+ if (active ()) {
+ p->activate ();
}
}
+ PluginConfigChanged (); /* EMIT SIGNAL */
} else if (num < _plugins.size()) {
uint32_t diff = _plugins.size() - num;
for (uint32_t n= 0; n < diff; ++n) {
_plugins.pop_back();
}
+ PluginConfigChanged (); /* EMIT SIGNAL */
}
return true;
}
-PluginInsert::~PluginInsert ()
+
+void
+PluginInsert::set_sinks (const ChanCount& c)
+{
+ _custom_sinks = c;
+ /* no signal, change will only be visible after re-config */
+}
+
+void
+PluginInsert::set_outputs (const ChanCount& c)
{
+ bool changed = (_custom_out != c) && _custom_cfg;
+ _custom_out = c;
+ if (changed) {
+ PluginConfigChanged (); /* EMIT SIGNAL */
+ }
+}
+
+void
+PluginInsert::set_custom_cfg (bool b)
+{
+ bool changed = _custom_cfg != b;
+ _custom_cfg = b;
+ if (changed) {
+ PluginConfigChanged (); /* EMIT SIGNAL */
+ }
+}
+
+bool
+PluginInsert::set_preset_out (const ChanCount& c)
+{
+ bool changed = _preset_out != c;
+ _preset_out = c;
+ if (changed && !_custom_cfg) {
+ PluginConfigChanged (); /* EMIT SIGNAL */
+ }
+ return changed;
+}
+
+bool
+PluginInsert::add_sidechain (uint32_t n_audio, uint32_t n_midi)
+{
+ // caller must hold process lock
+ if (_sidechain) {
+ return false;
+ }
+ std::ostringstream n;
+ if (n_audio > 0 || n_midi > 0) {
+ n << "Sidechain " << Session::next_name_id ();
+ } else {
+ n << "TO BE RESET FROM XML";
+ }
+ SideChain *sc = new SideChain (_session, n.str ());
+ _sidechain = boost::shared_ptr<SideChain> (sc);
+ _sidechain->activate ();
+ for (uint32_t n = 0; n < n_audio; ++n) {
+ _sidechain->input()->add_port ("", owner(), DataType::AUDIO); // add a port, don't connect.
+ }
+ for (uint32_t n = 0; n < n_midi; ++n) {
+ _sidechain->input()->add_port ("", owner(), DataType::MIDI); // add a port, don't connect.
+ }
+ PluginConfigChanged (); /* EMIT SIGNAL */
+ return true;
+}
+
+bool
+PluginInsert::del_sidechain ()
+{
+ if (!_sidechain) {
+ return false;
+ }
+ _sidechain.reset ();
+ _sc_playback_latency = 0;
+ _sc_capture_latency = 0;
+ PluginConfigChanged (); /* EMIT SIGNAL */
+ return true;
+}
+
+void
+PluginInsert::set_sidechain_latency (uint32_t capture, uint32_t playback)
+{
+ if (_sidechain &&
+ (_sc_playback_latency != playback || _sc_capture_latency != capture)) {
+ _sc_capture_latency = capture;
+ _sc_playback_latency = playback;
+ LatencyRange pl; pl.min = pl.max = playback;
+ LatencyRange cl; cl.min = cl.max = capture;
+ DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: capture %2 playback; %3\n", _sidechain->name (), capture, playback));
+ PortSet& ps (_sidechain->input ()->ports ());
+ for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
+ p->set_private_latency_range (pl, true);
+ p->set_private_latency_range (cl, false);
+ }
+ }
}
void
@@ -133,6 +263,27 @@ PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, Au
ChanCount
PluginInsert::output_streams() const
{
+ assert (_configured);
+ return _configured_out;
+}
+
+ChanCount
+PluginInsert::input_streams() const
+{
+ assert (_configured);
+ return _configured_in;
+}
+
+ChanCount
+PluginInsert::internal_streams() const
+{
+ assert (_configured);
+ return _configured_internal;
+}
+
+ChanCount
+PluginInsert::internal_output_streams() const
+{
assert (!_plugins.empty());
PluginInfoPtr info = _plugins.front()->get_info();
@@ -145,13 +296,13 @@ PluginInsert::output_streams() const
ChanCount out = info->n_outputs;
// DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
out.set_audio (out.n_audio() * _plugins.size());
- out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
+ out.set_midi (out.n_midi() * _plugins.size());
return out;
}
}
ChanCount
-PluginInsert::input_streams() const
+PluginInsert::internal_input_streams() const
{
assert (!_plugins.empty());
@@ -160,7 +311,6 @@ PluginInsert::input_streams() const
PluginInfoPtr info = _plugins.front()->get_info();
if (info->reconfigurable_io()) {
- assert (_plugins.size() == 1);
in = _plugins.front()->input_streams();
} else {
in = info->n_inputs;
@@ -200,15 +350,31 @@ PluginInsert::input_streams() const
ChanCount
PluginInsert::natural_output_streams() const
{
+#ifdef MIXBUS
+ if (is_channelstrip ()) {
+ return ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2));
+ }
+#endif
return _plugins[0]->get_info()->n_outputs;
}
ChanCount
PluginInsert::natural_input_streams() const
{
+#ifdef MIXBUS
+ if (is_channelstrip ()) {
+ return ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2));
+ }
+#endif
return _plugins[0]->get_info()->n_inputs;
}
+ChanCount
+PluginInsert::sidechain_input_pins() const
+{
+ return _cached_sidechain_pins;
+}
+
bool
PluginInsert::has_no_inputs() const
{
@@ -221,16 +387,48 @@ PluginInsert::has_no_audio_inputs() const
return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
}
+framecnt_t
+PluginInsert::plugin_latency () const {
+ return _plugins.front()->signal_latency ();
+}
+
bool
-PluginInsert::is_midi_instrument() const
+PluginInsert::needs_midi_input() const
{
- /* XXX more finesse is possible here. VST plugins have a
- a specific "instrument" flag, for example.
- */
- PluginInfoPtr pi = _plugins[0]->get_info();
+ PluginInfoPtr pip = _plugins[0]->get_info();
+ if (pip->needs_midi_input ()) {
+ return true;
+ }
+ return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0;
+}
+
+bool
+PluginInsert::has_output_presets (ChanCount in, ChanCount out)
+{
+ if (!_configured && _plugins[0]->get_info ()->reconfigurable_io ()) {
+ // collect possible configurations, prefer given in/out
+ _plugins[0]->can_support_io_configuration (in, out);
+ }
+
+ PluginOutputConfiguration ppc (_plugins[0]->possible_output ());
+
+ if (ppc.size () == 0) {
+ return false;
+ }
+ if (!strict_io () && ppc.size () == 1) {
+ return false;
+ }
- return pi->n_inputs.n_midi() != 0 &&
- pi->n_outputs.n_audio() > 0;
+ if (strict_io () && ppc.size () == 1) {
+ // "stereo" is currently preferred default for instruments
+ if (ppc.find (2) != ppc.end ()) {
+ return false;
+ }
+ }
+ if (!needs_midi_input ()) {
+ return false;
+ }
+ return true;
}
void
@@ -238,29 +436,53 @@ PluginInsert::create_automatable_parameters ()
{
assert (!_plugins.empty());
+ boost::shared_ptr<Plugin> plugin = _plugins.front();
set<Evoral::Parameter> a = _plugins.front()->automatable ();
- for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
- if (i->type() == PluginAutomation) {
+ for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
+ if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
+ continue;
+ }
+ Evoral::Parameter param (PluginAutomation, 0, i);
- Evoral::Parameter param(*i);
+ ParameterDescriptor desc;
+ plugin->get_parameter_descriptor(i, desc);
- ParameterDescriptor desc;
- _plugins.front()->get_parameter_descriptor(i->id(), desc);
+ const bool automatable = a.find(param) != a.end();
+ if (automatable) {
can_automate (param);
- boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
- add_control (boost::shared_ptr<AutomationControl> (new PluginControl(this, param, desc, list)));
- } else if (i->type() == PluginPropertyAutomation) {
- Evoral::Parameter param(*i);
- const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
- if (desc.datatype != Variant::NOTHING) {
- boost::shared_ptr<AutomationList> list;
- if (Variant::type_is_numeric(desc.datatype)) {
- list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
- }
- add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
+ }
+ boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
+ boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
+ if (!automatable) {
+ c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
+ }
+ add_control (c);
+ plugin->set_automation_control (i, c);
+ }
+
+
+ const Plugin::PropertyDescriptors& pdl (plugin->get_supported_properties ());
+ for (Plugin::PropertyDescriptors::const_iterator p = pdl.begin(); p != pdl.end(); ++p) {
+ Evoral::Parameter param (PluginPropertyAutomation, 0, p->first);
+ const ParameterDescriptor& desc = plugin->get_property_descriptor(param.id());
+ if (desc.datatype != Variant::NOTHING) {
+ boost::shared_ptr<AutomationList> list;
+ if (Variant::type_is_numeric(desc.datatype)) {
+ list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
}
+ add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
+ }
+ }
+
+ _bypass_port = plugin->designated_bypass_port ();
+
+ if (_bypass_port != UINT32_MAX) {
+ boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
+ if (0 == (ac->flags () & Controllable::NotAutomatable)) {
+ ac->alist()->automation_state_changed.connect_same_thread (*this, boost::bind (&PluginInsert::bypassable_changed, this));
+ ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this));
}
}
}
@@ -333,6 +555,17 @@ PluginInsert::activate ()
}
Processor::activate ();
+ /* when setting state e.g ProcessorBox::paste_processor_state ()
+ * the plugin is not yet owned by a route.
+ * but no matter. Route::add_processors() will call activate () again
+ */
+ if (!owner ()) {
+ return;
+ }
+ if (_plugin_signal_latency != signal_latency ()) {
+ _plugin_signal_latency = signal_latency ();
+ latency_changed ();
+ }
}
void
@@ -343,6 +576,10 @@ PluginInsert::deactivate ()
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
(*i)->deactivate ();
}
+ if (_plugin_signal_latency != signal_latency ()) {
+ _plugin_signal_latency = signal_latency ();
+ latency_changed ();
+ }
}
void
@@ -354,41 +591,148 @@ PluginInsert::flush ()
}
void
-PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
+PluginInsert::enable (bool yn)
{
- // Calculate if, and how many frames we need to collect for analysis
- framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
- _signal_analysis_collected_nframes);
- if (nframes < collect_signal_nframes) { // we might not get all frames now
- collect_signal_nframes = nframes;
+ if (_bypass_port == UINT32_MAX) {
+ if (yn) {
+ activate ();
+ } else {
+ deactivate ();
+ }
+ } else {
+ if (!_pending_active) {
+ activate ();
+ }
+ boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
+ ac->set_value (yn ? 1.0 : 0.0, Controllable::NoGroup);
+ ActiveChanged ();
+ }
+}
+
+bool
+PluginInsert::enabled () const
+{
+ if (_bypass_port == UINT32_MAX) {
+ return Processor::enabled ();
+ } else {
+ boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
+ return (ac->get_value () > 0 && _pending_active);
}
+}
- ChanCount const in_streams = input_streams ();
- ChanCount const out_streams = output_streams ();
+bool
+PluginInsert::bypassable () const
+{
+ if (_bypass_port == UINT32_MAX) {
+ return true;
+ } else {
+ boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
- ChanMapping in_map (in_streams);
- ChanMapping out_map (out_streams);
- bool valid;
- if (_match.method == Split) {
- /* fix the input mapping so that we have maps for each of the plugin's inputs */
- in_map = ChanMapping (natural_input_streams ());
-
- /* copy the first stream's buffer contents to the others */
- /* XXX: audio only */
- uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid);
- if (valid) {
- for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
- bufs.get_audio(in_map.get (DataType::AUDIO, i, &valid)).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
+ return !ac->automation_playback ();
+ }
+}
+
+void
+PluginInsert::enable_changed ()
+{
+ ActiveChanged ();
+}
+
+void
+PluginInsert::bypassable_changed ()
+{
+ BypassableChanged ();
+}
+
+void
+PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const
+{
+ // TODO optimize: store "unconnected" in a fixed set.
+ // it only changes on reconfiguration.
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
+ bool mapped = false;
+ if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
+ mapped = true; // in-place Midi bypass
+ }
+ for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
+ PinMappings::const_iterator i = out_map.find (pc);
+ if (i == out_map.end ()) {
+ continue;
+ }
+ const ChanMapping& outmap (i->second);
+ for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
+ bool valid;
+ uint32_t idx = outmap.get (*t, o, &valid);
+ if (valid && idx == out) {
+ mapped = true;
+ break;
+ }
+ }
+ }
+ if (!mapped) {
+ bufs.get (*t, out).silence (nframes, offset);
}
}
}
+}
- bufs.set_count(ChanCount::max(bufs.count(), in_streams));
- bufs.set_count(ChanCount::max(bufs.count(), out_streams));
+void
+PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto)
+{
+ // TODO: atomically copy maps & _no_inplace
+ PinMappings in_map (_in_map);
+ PinMappings out_map (_out_map);
+ ChanMapping thru_map (_thru_map);
+ if (_mapping_changed) { // ToDo use a counters, increment until match.
+ _no_inplace = check_inplace ();
+ _mapping_changed = false;
+ }
+
+ if (_latency_changed) {
+ /* delaylines are configured with the max possible latency (as reported by the plugin)
+ * so this won't allocate memory (unless the plugin lied about its max latency)
+ * It may still 'click' though, since the fixed delaylines are not de-clicked.
+ * Then again plugin-latency changes are not click-free to begin with.
+ *
+ * This is also worst case, there is currently no concept of per-stream latency.
+ *
+ * e.g. Two identical latent plugins:
+ * 1st plugin: process left (latent), bypass right.
+ * 2nd plugin: bypass left, process right (latent).
+ * -> currently this yields 2 times latency of the plugin,
+ */
+ _latency_changed = false;
+ _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
+ }
- /* Note that we've already required that plugins
- be able to handle in-place processing.
- */
+ if (_match.method == Split && !_no_inplace) {
+ // TODO: also use this optimization if one source-buffer
+ // feeds _all_ *connected* inputs.
+ // currently this is *first* buffer to all only --
+ // see PluginInsert::check_inplace
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ if (_configured_internal.get (*t) == 0) {
+ continue;
+ }
+ bool valid;
+ uint32_t first_idx = in_map[0].get (*t, 0, &valid);
+ assert (valid && first_idx == 0); // check_inplace ensures this
+ /* copy the first stream's buffer contents to the others */
+ for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
+ uint32_t idx = in_map[0].get (*t, i, &valid);
+ if (valid) {
+ assert (idx == 0);
+ bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
+ }
+ }
+ }
+ /* the copy operation produces a linear monotonic input map */
+ in_map[0] = ChanMapping (natural_input_streams ());
+ }
+
+ bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
+ bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
if (with_auto) {
@@ -402,7 +746,7 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
if (c->list() && c->automation_playback()) {
bool valid;
- const float val = c->list()->rt_safe_eval (now, valid);
+ const float val = c->list()->rt_safe_eval (start, valid);
if (valid) {
/* This is the ONLY place where we are
@@ -421,37 +765,153 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
}
}
+ /* Calculate if, and how many frames we need to collect for analysis */
+ framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
+ _signal_analysis_collected_nframes);
+ if (nframes < collect_signal_nframes) { // we might not get all frames now
+ collect_signal_nframes = nframes;
+ }
+
if (collect_signal_nframes > 0) {
// collect input
//std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
- //std::cerr << " streams " << input_streams().n_audio() << std::endl;
+ //std::cerr << " streams " << internal_input_streams().n_audio() << std::endl;
//std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
_signal_analysis_inputs.set_count(input_streams());
for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
- _signal_analysis_inputs.get_audio(i).read_from(
+ _signal_analysis_inputs.get_audio(i).read_from (
bufs.get_audio(i),
collect_signal_nframes,
_signal_analysis_collected_nframes); // offset is for target buffer
}
}
+#ifdef MIXBUS
+ if (is_channelstrip ()) {
+ if (_configured_in.n_audio() > 0) {
+ ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
+ ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
- for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
- if ((*i)->connect_and_run(bufs, in_map, out_map, nframes, offset)) {
- deactivate ();
+ _plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
+
+ for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
+ bufs.get (DataType::AUDIO, out).silence (nframes, offset);
+ }
}
+ } else
+#endif
+ if (_no_inplace) {
+ // TODO optimize -- build maps once.
+ uint32_t pc = 0;
+ BufferSet& inplace_bufs = _session.get_noinplace_buffers();
+ ARDOUR::ChanMapping used_outputs;
+
+ assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
+
+ /* build used-output map */
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
+ bool valid;
+ uint32_t out_idx = out_map[pc].get (*t, out, &valid);
+ if (valid) {
+ used_outputs.set (*t, out_idx, 1); // mark as used
+ }
+ }
+ }
+ }
+ /* copy thru data to outputs before processing in-place */
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
- in_map.offset_to(*t, natural_input_streams().get(*t));
- out_map.offset_to(*t, natural_output_streams().get(*t));
+ for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
+ bool valid;
+ uint32_t in_idx = thru_map.get (*t, out, &valid);
+ uint32_t m = out + natural_input_streams ().get (*t);
+ if (valid) {
+ _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
+ used_outputs.set (*t, out, 1); // mark as used
+ } else {
+ used_outputs.get (*t, out, &valid);
+ if (valid) {
+ /* the plugin is expected to write here, but may not :(
+ * (e.g. drumgizmo w/o kit loaded)
+ */
+ inplace_bufs.get (*t, m).silence (nframes);
+ }
+ }
+ }
}
+
+ pc = 0;
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+
+ ARDOUR::ChanMapping i_in_map (natural_input_streams());
+ ARDOUR::ChanMapping i_out_map (out_map[pc]);
+ ARDOUR::ChanCount mapped;
+
+ /* map inputs sequentially */
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
+ bool valid;
+ uint32_t in_idx = in_map[pc].get (*t, in, &valid);
+ uint32_t m = mapped.get (*t);
+ if (valid) {
+ inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
+ } else {
+ inplace_bufs.get (*t, m).silence (nframes, offset);
+ }
+ mapped.set (*t, m + 1);
+ }
+ }
+
+ /* outputs are mapped to inplace_bufs after the inputs */
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ i_out_map.offset_to (*t, natural_input_streams ().get (*t));
+ }
+
+ if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
+ deactivate ();
+ }
+ }
+
+ /* all instances have completed, now copy data that was written
+ * and zero unconnected buffers */
+ ARDOUR::ChanMapping nonzero_out (used_outputs);
+ if (has_midi_bypass ()) {
+ nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
+ }
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
+ bool valid;
+ used_outputs.get (*t, out, &valid);
+ if (!valid) {
+ nonzero_out.get (*t, out, &valid);
+ if (!valid) {
+ bufs.get (*t, out).silence (nframes, offset);
+ }
+ } else {
+ uint32_t m = out + natural_input_streams ().get (*t);
+ bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
+ }
+ }
+ }
+ } else {
+ /* in-place processing */
+ uint32_t pc = 0;
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+ if ((*i)->connect_and_run(bufs, start, end, speed, in_map[pc], out_map[pc], nframes, offset)) {
+ deactivate ();
+ }
+ }
+ // now silence unconnected outputs
+ inplace_silence_unconnected (bufs, _out_map, nframes, offset);
}
if (collect_signal_nframes > 0) {
// collect output
//std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
- //std::cerr << " streams " << output_streams().n_audio() << std::endl;
+ //std::cerr << " streams " << internal_output_streams().n_audio() << std::endl;
_signal_analysis_outputs.set_count(output_streams());
@@ -473,67 +933,169 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
&_signal_analysis_outputs);
}
}
- /* leave remaining channel buffers alone */
+
+ if (_plugin_signal_latency != signal_latency ()) {
+ _plugin_signal_latency = signal_latency ();
+ latency_changed ();
+ }
}
void
-PluginInsert::silence (framecnt_t nframes)
+PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
{
- if (!active ()) {
- return;
+ /* bypass the plugin(s) not the whole processor.
+ * -> use mappings just like connect_and_run
+ */
+
+ // TODO: atomically copy maps & _no_inplace
+ const ChanMapping in_map (no_sc_input_map ());
+ const ChanMapping out_map (output_map ());
+ if (_mapping_changed) {
+ _no_inplace = check_inplace ();
+ _mapping_changed = false;
}
- ChanMapping in_map(input_streams());
- ChanMapping out_map(output_streams());
+ bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
+ bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
- if (_match.method == Split) {
- /* fix the input mapping so that we have maps for each of the plugin's inputs */
- in_map = ChanMapping (natural_input_streams ());
+ if (_no_inplace) {
+ ChanMapping thru_map (_thru_map);
+
+ BufferSet& inplace_bufs = _session.get_noinplace_buffers();
+ // copy all inputs
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
+ inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
+ }
+ }
+ ARDOUR::ChanMapping used_outputs;
+ // copy thru
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+ bool valid;
+ uint32_t in_idx = thru_map.get (*t, out, &valid);
+ if (valid) {
+ bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
+ used_outputs.set (*t, out, 1); // mark as used
+ }
+ }
+ }
+ // plugin no-op: assume every plugin has an internal identity map
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+ bool valid;
+ uint32_t src_idx = out_map.get_src (*t, out, &valid);
+ if (!valid) {
+ continue;
+ }
+ uint32_t in_idx = in_map.get (*t, src_idx, &valid);
+ if (!valid) {
+ continue;
+ }
+ bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
+ used_outputs.set (*t, out, 1); // mark as used
+ }
+ }
+ // now silence all unused outputs
+ if (has_midi_bypass ()) {
+ used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
+ }
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+ bool valid;
+ used_outputs.get (*t, out, &valid);
+ if (!valid) {
+ bufs.get (*t, out).silence (nframes, 0);
+ }
+ }
+ }
+ } else {
+ if (_match.method == Split) {
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ if (_configured_internal.get (*t) == 0) {
+ continue;
+ }
+ // copy/feeds _all_ *connected* inputs, copy the first buffer
+ bool valid;
+ uint32_t first_idx = in_map.get (*t, 0, &valid);
+ assert (valid && first_idx == 0); // check_inplace ensures this
+ for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
+ uint32_t idx = in_map.get (*t, i, &valid);
+ if (valid) {
+ assert (idx == 0);
+ bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
+ }
+ }
+ }
+ }
+
+ // apply output map and/or monotonic but not identity i/o mappings
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+ bool valid;
+ uint32_t src_idx = out_map.get_src (*t, out, &valid);
+ if (!valid) {
+ bufs.get (*t, out).silence (nframes, 0);
+ continue;
+ }
+ uint32_t in_idx = in_map.get (*t, src_idx, &valid);
+ if (!valid) {
+ bufs.get (*t, out).silence (nframes, 0);
+ continue;
+ }
+ if (in_idx != src_idx) {
+ bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
+ }
+ }
+ }
}
+}
+void
+PluginInsert::silence (framecnt_t nframes, framepos_t start_frame)
+{
+ if (!active ()) {
+ return;
+ }
+
+ _delaybuffers.flush ();
+
+ ChanMapping in_map (natural_input_streams ());
+ ChanMapping out_map (natural_output_streams ());
+ ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
+#ifdef MIXBUS
+ if (is_channelstrip ()) {
+ if (_configured_in.n_audio() > 0) {
+ _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
+ }
+ } else
+#endif
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
- (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
+ (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
}
}
void
-PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
+PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
{
+ if (_sidechain) {
+ // collect sidechain input for complete cycle (!)
+ // TODO we need delaylines here for latency compensation
+ _sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
+ }
+
if (_pending_active) {
/* run as normal if we are active or moving from inactive to active */
if (_session.transport_rolling() || _session.bounce_processing()) {
- automation_run (bufs, start_frame, nframes);
+ automation_run (bufs, start_frame, end_frame, speed, nframes);
} else {
- connect_and_run (bufs, nframes, 0, false);
+ connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, false);
}
} else {
- uint32_t in = input_streams ().n_audio ();
- uint32_t out = output_streams().n_audio ();
-
- if (has_no_audio_inputs() || in == 0) {
-
- /* silence all (audio) outputs. Should really declick
- * at the transitions of "active"
- */
-
- for (uint32_t n = 0; n < out; ++n) {
- bufs.get_audio (n).silence (nframes);
- }
-
- } else if (out > in) {
-
- /* not active, but something has make up for any channel count increase */
-
- // TODO: option round-robin (n % in) or silence additional buffers ??
- // for now , simply replicate last buffer
- for (uint32_t n = in; n < out; ++n) {
- bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
- }
- }
-
- bufs.count().set_audio (out);
+ bypass (bufs, nframes);
+ _delaybuffers.flush ();
}
_active = _pending_active;
@@ -541,43 +1103,40 @@ PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_fra
/* we have no idea whether the plugin generated silence or not, so mark
* all buffers appropriately.
*/
-
}
void
-PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
+PluginInsert::automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
{
Evoral::ControlEvent next_event (0, 0.0f);
- framepos_t now = start;
- framepos_t end = now + nframes;
framecnt_t offset = 0;
Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
if (!lm.locked()) {
- connect_and_run (bufs, nframes, offset, false);
+ connect_and_run (bufs, start, end, speed, nframes, offset, false);
return;
}
- if (!find_next_event (now, end, next_event) || requires_fixed_sized_buffers()) {
+ if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
/* no events have a time within the relevant range */
- connect_and_run (bufs, nframes, offset, true, now);
+ connect_and_run (bufs, start, end, speed, nframes, offset, true);
return;
}
while (nframes) {
- framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
+ framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
- connect_and_run (bufs, cnt, offset, true, now);
+ connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
nframes -= cnt;
offset += cnt;
- now += cnt;
+ start += cnt;
- if (!find_next_event (now, end, next_event)) {
+ if (!find_next_event (start, end, next_event)) {
break;
}
}
@@ -585,7 +1144,7 @@ PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nfram
/* cleanup anything that is left to do */
if (nframes) {
- connect_and_run (bufs, nframes, offset, true, now);
+ connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
}
}
@@ -648,83 +1207,524 @@ PluginInsert::reset_parameters_to_default ()
const float dflt = _plugins[0]->default_value (cid);
const float curr = _plugins[0]->get_parameter (cid);
- if (dflt == curr) {
- continue;
+ if (dflt == curr) {
+ continue;
+ }
+
+ boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
+ if (!ac) {
+ continue;
+ }
+
+ if (ac->automation_state() & Play) {
+ all = false;
+ continue;
+ }
+
+ ac->set_value (dflt, Controllable::NoGroup);
+ }
+ return all;
+}
+
+boost::shared_ptr<Plugin>
+PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
+{
+ boost::shared_ptr<LadspaPlugin> lp;
+ boost::shared_ptr<LuaProc> lua;
+#ifdef LV2_SUPPORT
+ boost::shared_ptr<LV2Plugin> lv2p;
+#endif
+#ifdef WINDOWS_VST_SUPPORT
+ boost::shared_ptr<WindowsVSTPlugin> vp;
+#endif
+#ifdef LXVST_SUPPORT
+ boost::shared_ptr<LXVSTPlugin> lxvp;
+#endif
+#ifdef AUDIOUNIT_SUPPORT
+ boost::shared_ptr<AUPlugin> ap;
+#endif
+
+ if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
+ return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
+ } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
+ return boost::shared_ptr<Plugin> (new LuaProc (*lua));
+#ifdef LV2_SUPPORT
+ } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
+ return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
+#endif
+#ifdef WINDOWS_VST_SUPPORT
+ } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
+ return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
+#endif
+#ifdef LXVST_SUPPORT
+ } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
+ return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
+#endif
+#ifdef AUDIOUNIT_SUPPORT
+ } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
+ return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
+#endif
+ }
+
+ fatal << string_compose (_("programming error: %1"),
+ X_("unknown plugin type in PluginInsert::plugin_factory"))
+ << endmsg;
+ abort(); /*NOTREACHED*/
+ return boost::shared_ptr<Plugin> ((Plugin*) 0);
+}
+
+void
+PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
+ if (num < _in_map.size()) {
+ bool changed = _in_map[num] != m;
+ _in_map[num] = m;
+ changed |= sanitize_maps ();
+ if (changed) {
+ PluginMapChanged (); /* EMIT SIGNAL */
+ _mapping_changed = true;
+ _session.set_dirty();
+ }
+ }
+}
+
+void
+PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
+ if (num < _out_map.size()) {
+ bool changed = _out_map[num] != m;
+ _out_map[num] = m;
+ changed |= sanitize_maps ();
+ if (changed) {
+ PluginMapChanged (); /* EMIT SIGNAL */
+ _mapping_changed = true;
+ _session.set_dirty();
+ }
+ }
+}
+
+void
+PluginInsert::set_thru_map (ChanMapping m) {
+ bool changed = _thru_map != m;
+ _thru_map = m;
+ changed |= sanitize_maps ();
+ if (changed) {
+ PluginMapChanged (); /* EMIT SIGNAL */
+ _mapping_changed = true;
+ _session.set_dirty();
+ }
+}
+
+bool
+PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
+ const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
+{
+ if (_configured) { return false; }
+ _configured_in = in;
+ _configured_out = out;
+ _in_map[0] = im;
+ _out_map[0] = om;
+ _thru_map = tm;
+ _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
+ return true;
+}
+
+ChanMapping
+PluginInsert::input_map () const
+{
+ ChanMapping rv;
+ uint32_t pc = 0;
+ for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
+ ChanMapping m (i->second);
+ const ChanMapping::Mappings& mp ((*i).second.mappings());
+ for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
+ }
+ }
+ }
+ return rv;
+}
+
+
+ChanMapping
+PluginInsert::no_sc_input_map () const
+{
+ ChanMapping rv;
+ uint32_t pc = 0;
+ for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
+ ChanMapping m (i->second);
+ const ChanMapping::Mappings& mp ((*i).second.mappings());
+ for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
+ for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ if (i->first < ins) {
+ rv.set (tm->first, i->first + pc * ins, i->second);
+ }
+ }
+ }
+ }
+ return rv;
+}
+
+ChanMapping
+PluginInsert::output_map () const
+{
+ ChanMapping rv;
+ uint32_t pc = 0;
+ for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
+ ChanMapping m (i->second);
+ const ChanMapping::Mappings& mp ((*i).second.mappings());
+ for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+ for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+ rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
+ }
+ }
+ }
+ if (has_midi_bypass ()) {
+ rv.set (DataType::MIDI, 0, 0);
+ }
+
+ return rv;
+}
+
+bool
+PluginInsert::has_midi_bypass () const
+{
+ if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
+ && natural_output_streams ().n_midi () == 0) {
+ return true;
+ }
+ return false;
+}
+
+bool
+PluginInsert::has_midi_thru () const
+{
+ if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
+ && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
+ return true;
+ }
+ return false;
+}
+
+#ifdef MIXBUS
+bool
+PluginInsert::is_channelstrip () const {
+ return _plugins.front()->is_channelstrip();
+}
+#endif
+
+bool
+PluginInsert::check_inplace ()
+{
+ bool inplace_ok = !_plugins.front()->inplace_broken ();
+
+ if (_thru_map.n_total () > 0) {
+ // TODO once midi-bypass is part of the mapping, ignore it
+ inplace_ok = false;
+ }
+
+ if (_match.method == Split && inplace_ok) {
+ assert (get_count() == 1);
+ assert (_in_map.size () == 1);
+ if (!_out_map[0].is_monotonic ()) {
+ inplace_ok = false;
+ }
+ if (_configured_internal != _configured_in) {
+ /* no sidechain -- TODO we could allow this with
+ * some more logic in PluginInsert::connect_and_run().
+ *
+ * PluginInsert::reset_map() already maps it.
+ */
+ inplace_ok = false;
+ }
+ /* check mapping */
+ for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
+ if (_configured_internal.get (*t) == 0) {
+ continue;
+ }
+ bool valid;
+ uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
+ if (!valid || first_idx != 0) {
+ // so far only allow to copy the *first* stream's buffer to others
+ inplace_ok = false;
+ } else {
+ for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
+ uint32_t idx = _in_map[0].get (*t, i, &valid);
+ if (valid && idx != first_idx) {
+ inplace_ok = false;
+ break;
+ }
+ }
+ }
+ }
+
+ if (inplace_ok) {
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
+ return false;
+ }
+ }
+
+ for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
+ if (!_in_map[pc].is_monotonic ()) {
+ inplace_ok = false;
+ }
+ if (!_out_map[pc].is_monotonic ()) {
+ inplace_ok = false;
+ }
+ }
+
+ if (inplace_ok) {
+ /* check if every output is fed by the corresponding input
+ *
+ * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2
+ * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1)
+ *
+ * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1
+ */
+ ChanMapping in_map (input_map ());
+ const ChanMapping::Mappings out_m (output_map ().mappings ());
+ for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
+ for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+ /* src-pin: c->first, out-port: c->second */
+ bool valid;
+ uint32_t in_port = in_map.get (t->first, c->first, &valid);
+ if (valid && in_port != c->second) {
+ inplace_ok = false;
+ break;
+ }
+ }
+ }
+ }
+
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
+ return !inplace_ok; // no-inplace
+}
+
+bool
+PluginInsert::sanitize_maps ()
+{
+ bool changed = false;
+ /* strip dead wood */
+ PinMappings new_ins;
+ PinMappings new_outs;
+ ChanMapping new_thru;
+
+ for (uint32_t pc = 0; pc < get_count(); ++pc) {
+ ChanMapping new_in;
+ ChanMapping new_out;
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
+ bool valid;
+ uint32_t idx = _in_map[pc].get (*t, i, &valid);
+ if (valid && idx < _configured_internal.get (*t)) {
+ new_in.set (*t, i, idx);
+ }
+ }
+ for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
+ bool valid;
+ uint32_t idx = _out_map[pc].get (*t, o, &valid);
+ if (valid && idx < _configured_out.get (*t)) {
+ new_out.set (*t, o, idx);
+ }
+ }
+ }
+ if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
+ changed = true;
+ }
+ new_ins[pc] = new_in;
+ new_outs[pc] = new_out;
+ }
+
+ /* prevent dup output assignments */
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
+ bool mapped = false;
+ for (uint32_t pc = 0; pc < get_count(); ++pc) {
+ bool valid;
+ uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
+ if (valid && mapped) {
+ new_outs[pc].unset (*t, idx);
+ } else if (valid) {
+ mapped = true;
+ }
+ }
}
+ }
- boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
- if (!ac) {
- continue;
+ /* remove excess thru */
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
+ bool valid;
+ uint32_t idx = _thru_map.get (*t, o, &valid);
+ if (valid && idx < _configured_internal.get (*t)) {
+ new_thru.set (*t, o, idx);
+ }
}
+ }
- if (ac->automation_state() & Play) {
- all = false;
- continue;
+ /* prevent out + thru, existing plugin outputs override thru */
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
+ bool mapped = false;
+ bool valid;
+ for (uint32_t pc = 0; pc < get_count(); ++pc) {
+ new_outs[pc].get_src (*t, o, &mapped);
+ if (mapped) { break; }
+ }
+ if (!mapped) { continue; }
+ uint32_t idx = new_thru.get (*t, o, &valid);
+ if (mapped) {
+ new_thru.unset (*t, idx);
+ }
}
+ }
- ac->set_value (dflt, Controllable::NoGroup);
+ if (has_midi_bypass ()) {
+ // TODO: include midi-bypass in the thru set,
+ // remove dedicated handling.
+ new_thru.unset (DataType::MIDI, 0);
}
- return all;
+
+ if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
+ changed = true;
+ }
+ _in_map = new_ins;
+ _out_map = new_outs;
+ _thru_map = new_thru;
+
+ return changed;
}
-boost::shared_ptr<Plugin>
-PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
+bool
+PluginInsert::reset_map (bool emit)
{
- boost::shared_ptr<LadspaPlugin> lp;
-#ifdef LV2_SUPPORT
- boost::shared_ptr<LV2Plugin> lv2p;
-#endif
-#ifdef WINDOWS_VST_SUPPORT
- boost::shared_ptr<WindowsVSTPlugin> vp;
-#endif
-#ifdef LXVST_SUPPORT
- boost::shared_ptr<LXVSTPlugin> lxvp;
-#endif
-#ifdef AUDIOUNIT_SUPPORT
- boost::shared_ptr<AUPlugin> ap;
-#endif
+ const PinMappings old_in (_in_map);
+ const PinMappings old_out (_out_map);
- if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
- return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
-#ifdef LV2_SUPPORT
- } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
- return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
-#endif
-#ifdef WINDOWS_VST_SUPPORT
- } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
- return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
-#endif
-#ifdef LXVST_SUPPORT
- } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
- return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
-#endif
-#ifdef AUDIOUNIT_SUPPORT
- } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
- return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
-#endif
+ _in_map.clear ();
+ _out_map.clear ();
+ _thru_map = ChanMapping ();
+
+ /* build input map */
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ uint32_t sc = 0; // side-chain round-robin (all instances)
+ uint32_t pc = 0;
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+ const uint32_t nis = natural_input_streams ().get(*t);
+ const uint32_t stride = nis - sidechain_input_pins().get (*t);
+
+ /* SC inputs are last in the plugin-insert.. */
+ const uint32_t sc_start = _configured_in.get (*t);
+ const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
+ /* ...but may not be at the end of the plugin ports.
+ * in case the side-chain is not the last port, shift connections back.
+ * and connect to side-chain
+ */
+ uint32_t shift = 0;
+ uint32_t ic = 0; // split inputs
+ const uint32_t cend = _configured_in.get (*t);
+
+ for (uint32_t in = 0; in < nis; ++in) {
+ const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
+ if (iod.is_sidechain) {
+ /* connect sidechain sinks to sidechain inputs in round-robin fashion */
+ if (sc_len > 0) {// side-chain may be hidden
+ _in_map[pc].set (*t, in, sc_start + sc);
+ sc = (sc + 1) % sc_len;
+ }
+ ++shift;
+ } else {
+ if (_match.method == Split) {
+ if (cend == 0) { continue; }
+ if (_strict_io && ic + stride * pc >= cend) {
+ break;
+ }
+ /* connect *no* sidechain sinks in round-robin fashion */
+ _in_map[pc].set (*t, in, ic + stride * pc);
+ if (_strict_io && (ic + 1) == cend) {
+ break;
+ }
+ ic = (ic + 1) % cend;
+ } else {
+ uint32_t s = in - shift;
+ if (stride * pc + s < cend) {
+ _in_map[pc].set (*t, in, s + stride * pc);
+ }
+ }
+ }
+ }
+ }
}
- fatal << string_compose (_("programming error: %1"),
- X_("unknown plugin type in PluginInsert::plugin_factory"))
- << endmsg;
- abort(); /*NOTREACHED*/
- return boost::shared_ptr<Plugin> ((Plugin*) 0);
+ /* build output map */
+ uint32_t pc = 0;
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+ _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
+ }
+ }
+
+ sanitize_maps ();
+ if (old_in == _in_map && old_out == _out_map) {
+ return false;
+ }
+ if (emit) {
+ PluginMapChanged (); /* EMIT SIGNAL */
+ _mapping_changed = true;
+ _session.set_dirty();
+ }
+ return true;
}
bool
PluginInsert::configure_io (ChanCount in, ChanCount out)
{
Match old_match = _match;
- ChanCount old_in = input_streams ();
- ChanCount old_out = output_streams ();
+ ChanCount old_in;
+ ChanCount old_internal;
+ ChanCount old_out;
+ ChanCount old_pins;
+
+ old_pins = natural_input_streams();
+ old_in = _configured_in;
+ old_out = _configured_out;
+ old_internal = _configured_internal;
_configured_in = in;
+ _configured_internal = in;
_configured_out = out;
- /* set the matching method and number of plugins that we will use to meet this configuration */
+ if (_sidechain) {
+ /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
+ * (currently _sidechain->configure_io always succeeds
+ * since Processor::configure_io() succeeds)
+ */
+ if (!_sidechain->configure_io (in, out)) {
+ DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
+ return false;
+ }
+ _configured_internal += _sidechain->input()->n_ports();
+
+ // include (static_cast<Route*>owner())->name() ??
+ _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
+ }
+
+ /* get plugin configuration */
_match = private_can_support_io_configuration (in, out);
+#ifndef NDEBUG
+ if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
+ DEBUG_STR_DECL(a);
+ DEBUG_STR_APPEND(a, string_compose ("%1: ", name()));
+ DEBUG_STR_APPEND(a, _match);
+ DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
+ }
+#endif
+
+ /* set the matching method and number of plugins that we will use to meet this configuration */
if (set_count (_match.plugins) == false) {
PluginIoReConfigure (); /* EMIT SIGNAL */
+ _configured = false;
return false;
}
@@ -732,40 +1732,188 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
switch (_match.method) {
case Split:
case Hide:
- if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out) == false) {
+ if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
PluginIoReConfigure (); /* EMIT SIGNAL */
+ _configured = false;
return false;
}
break;
+ case Delegate:
+ {
+ ChanCount din (_configured_internal);
+ ChanCount dout (din); // hint
+ if (_custom_cfg) {
+ if (_custom_sinks.n_total () > 0) {
+ din = _custom_sinks;
+ }
+ dout = _custom_out;
+ } else if (_preset_out.n_audio () > 0) {
+ dout.set (DataType::AUDIO, _preset_out.n_audio ());
+ } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
+ dout.set (DataType::AUDIO, 2);
+ }
+ if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
+ ChanCount useins;
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
+ bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
+ assert (r);
+ if (useins.n_audio() == 0) {
+ useins = din;
+ }
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
+ if (_plugins.front()->configure_io (useins, dout) == false) {
+ PluginIoReConfigure (); /* EMIT SIGNAL */
+ _configured = false;
+ return false;
+ }
+ if (!_custom_cfg) {
+ _custom_sinks = din;
+ }
+ }
+ break;
default:
if (_plugins.front()->configure_io (in, out) == false) {
PluginIoReConfigure (); /* EMIT SIGNAL */
+ _configured = false;
return false;
}
break;
}
- if ( (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
- || old_in != in
- || old_out != out
- )
- {
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: cfg:%2 state:%3 chn-in:%4 chn-out:%5 inpin:%6 match:%7 cust:%8 size-in:%9 size-out:%10\n",
+ name (),
+ _configured ? "Y" : "N",
+ _maps_from_state ? "Y" : "N",
+ old_in == in ? "==" : "!=",
+ old_out == out ? "==" : "!=",
+ old_pins == natural_input_streams () ? "==" : "!=",
+ old_match.method == _match.method ? "==" : "!=",
+ old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
+ _in_map.size() == get_count () ? "==" : "!=",
+ _out_map.size() == get_count () ? "==" : "!="
+ ));
+
+ bool mapping_changed = false;
+ if (old_in == in && old_out == out
+ && _configured
+ && old_pins == natural_input_streams ()
+ && old_match.method == _match.method
+ && old_match.custom_cfg == _match.custom_cfg
+ && _in_map.size() == _out_map.size()
+ && _in_map.size() == get_count ()
+ ) {
+ assert (_maps_from_state == false);
+ /* If the configuration has not changed, keep the mapping */
+ mapping_changed = sanitize_maps ();
+ } else if (_match.custom_cfg && _configured) {
+ assert (_maps_from_state == false);
+ /* don't touch the map in manual mode */
+ mapping_changed = sanitize_maps ();
+ } else {
+#ifdef MIXBUS
+ if (is_channelstrip ()) {
+ /* fake channel map - for wire display */
+ _in_map.clear ();
+ _out_map.clear ();
+ _thru_map = ChanMapping ();
+ _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
+ _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
+ /* set "thru" map for in-place forward of audio */
+ for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
+ _thru_map.set (DataType::AUDIO, i, i);
+ }
+ /* and midi (after implicit 1st channel bypass) */
+ for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
+ _thru_map.set (DataType::MIDI, i, i);
+ }
+ } else
+#endif
+ if (_maps_from_state && old_in == in && old_out == out) {
+ mapping_changed = true;
+ sanitize_maps ();
+ } else {
+ /* generate a new mapping */
+ mapping_changed = reset_map (false);
+ }
+ _maps_from_state = false;
+ }
+
+ if (mapping_changed) {
+ PluginMapChanged (); /* EMIT SIGNAL */
+
+#ifndef NDEBUG
+ if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
+ uint32_t pc = 0;
+ DEBUG_STR_DECL(a);
+ DEBUG_STR_APPEND(a, "\n--------<<--------\n");
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+ if (pc > 0) {
+ DEBUG_STR_APPEND(a, "----><----\n");
+ }
+ DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
+ DEBUG_STR_APPEND(a, " * Inputs:\n");
+ DEBUG_STR_APPEND(a, _in_map[pc]);
+ DEBUG_STR_APPEND(a, " * Outputs:\n");
+ DEBUG_STR_APPEND(a, _out_map[pc]);
+ }
+ DEBUG_STR_APPEND(a, " * Thru:\n");
+ DEBUG_STR_APPEND(a, _thru_map);
+ DEBUG_STR_APPEND(a, "-------->>--------\n");
+ DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
+ }
+#endif
+ }
+
+ _no_inplace = check_inplace ();
+ _mapping_changed = false;
+
+ /* only the "noinplace_buffers" thread buffers need to be this large,
+ * this can be optimized. other buffers are fine with
+ * ChanCount::max (natural_input_streams (), natural_output_streams())
+ * and route.cc's max (configured_in, configured_out)
+ *
+ * no-inplace copies "thru" outputs (to emulate in-place) for
+ * all outputs (to prevent overwrite) into a temporary space
+ * which also holds input buffers (in case the plugin does process
+ * in-place and overwrites those).
+ *
+ * this buffers need to be at least as
+ * natural_input_streams () + possible outputs.
+ *
+ * sidechain inputs add a constraint on the input:
+ * configured input + sidechain (=_configured_internal)
+ *
+ * NB. this also satisfies
+ * max (natural_input_streams(), natural_output_streams())
+ * which is needed for silence runs
+ */
+ _required_buffers = ChanCount::max (_configured_internal,
+ natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
+
+ if (old_in != in || old_out != out || old_internal != _configured_internal
+ || old_pins != natural_input_streams ()
+ || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
+ ) {
PluginIoReConfigure (); /* EMIT SIGNAL */
}
+ _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
+ _latency_changed = true;
+
// we don't know the analysis window size, so we must work with the
// current buffer size here. each request for data fills in these
// buffers and the analyser makes sure it gets enough data for the
// analysis window
session().ensure_buffer_set (_signal_analysis_inputs, in);
- //_signal_analysis_inputs.set_count (in);
+ _signal_analysis_inputs.set_count (in);
session().ensure_buffer_set (_signal_analysis_outputs, out);
- //_signal_analysis_outputs.set_count (out);
+ _signal_analysis_outputs.set_count (out);
// std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
+ _configured = true;
return Processor::configure_io (in, out);
}
@@ -780,46 +1928,212 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
bool
PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
{
+ if (_sidechain) {
+ _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
+ }
return private_can_support_io_configuration (in, out).method != Impossible;
}
+PluginInsert::Match
+PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
+{
+ if (!_custom_cfg && _preset_out.n_audio () > 0) {
+ // preseed hint (for variable i/o)
+ out.set (DataType::AUDIO, _preset_out.n_audio ());
+ }
+
+ Match rv = internal_can_support_io_configuration (in, out);
+
+ if (!_custom_cfg && _preset_out.n_audio () > 0) {
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
+ out.set (DataType::AUDIO, _preset_out.n_audio ());
+ }
+ return rv;
+}
+
/** A private version of can_support_io_configuration which returns the method
* by which the configuration can be matched, rather than just whether or not
* it can be.
*/
PluginInsert::Match
-PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
+PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
{
if (_plugins.empty()) {
return Match();
}
+#ifdef MIXBUS
+ if (is_channelstrip ()) {
+ out = inx;
+ return Match (ExactMatch, 1);
+ }
+#endif
+
+ /* if a user specified a custom cfg, so be it. */
+ if (_custom_cfg) {
+ PluginInfoPtr info = _plugins.front()->get_info();
+ out = _custom_out;
+ if (info->reconfigurable_io()) {
+ return Match (Delegate, 1, _strict_io, true);
+ } else {
+ return Match (ExactMatch, get_count(), _strict_io, true);
+ }
+ }
+
+ /* try automatic configuration */
+ Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
+
PluginInfoPtr info = _plugins.front()->get_info();
- ChanCount in; in += inx;
- midi_bypass.reset();
+ ChanCount inputs = info->n_inputs;
+ ChanCount outputs = info->n_outputs;
+
+ /* handle case strict-i/o */
+ if (_strict_io && m.method != Impossible) {
+ m.strict_io = true;
+
+ /* special case MIDI instruments */
+ if (needs_midi_input ()) {
+ // output = midi-bypass + at most master-out channels.
+ ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
+ max_out.set (DataType::MIDI, out.get(DataType::MIDI));
+ out = ChanCount::min (out, max_out);
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
+ return m;
+ }
+
+ switch (m.method) {
+ case NoInputs:
+ if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
+ /* replicate processor to match output count (generators and such)
+ * at least enough to feed every output port. */
+ uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ uint32_t nout = outputs.get (*t);
+ if (nout == 0 || inx.get(*t) == 0) { continue; }
+ f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
+ }
+ out = inx;
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
+ return Match (Replicate, f, _strict_io);
+ }
+ break;
+ default:
+ break;
+ }
+
+ out = inx;
+ return m;
+ }
+
+ if (m.method != Impossible) {
+ return m;
+ }
+
+ ChanCount ns_inputs = inputs - sidechain_input_pins ();
+
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
if (info->reconfigurable_io()) {
- /* Plugin has flexible I/O, so delegate to it */
- bool const r = _plugins.front()->can_support_io_configuration (in, out);
+ ChanCount useins;
+ out = inx; // hint
+ if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
+ if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
+ bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
if (!r) {
+ // houston, we have a problem.
return Match (Impossible, 0);
}
+ // midi bypass
+ if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
+ return Match (Delegate, 1, _strict_io);
+ }
+
+ ChanCount midi_bypass;
+ if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
+ midi_bypass.set (DataType::MIDI, 1);
+ }
+
+ // add at least as many plugins so that output count matches input count (w/o sidechain pins)
+ uint32_t f = 0;
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ uint32_t nin = ns_inputs.get (*t);
+ uint32_t nout = outputs.get (*t);
+ if (nin == 0 || inx.get(*t) == 0) { continue; }
+ // prefer floor() so the count won't overly increase IFF (nin < nout)
+ f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
+ }
+ if (f > 0 && outputs * f >= _configured_out) {
+ out = outputs * f + midi_bypass;
+ return Match (Replicate, f, _strict_io);
+ }
+
+ // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
+ f = 0;
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ uint32_t nin = ns_inputs.get (*t);
+ if (nin == 0 || inx.get(*t) == 0) { continue; }
+ f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
+ }
+ if (f > 0) {
+ out = outputs * f + midi_bypass;
+ return Match (Replicate, f, _strict_io);
+ }
+
+ // add at least as many plugins needed to connect all inputs
+ f = 1;
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ uint32_t nin = inputs.get (*t);
+ if (nin == 0 || inx.get(*t) == 0) { continue; }
+ f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
+ }
+ out = outputs * f + midi_bypass;
+ return Match (Replicate, f, _strict_io);
+}
+
+/* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
+PluginInsert::Match
+PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
+{
+ if (_plugins.empty()) {
+ return Match();
+ }
+ PluginInfoPtr info = _plugins.front()->get_info();
+ ChanCount in; in += inx;
+ ChanCount midi_bypass;
+
+ if (info->reconfigurable_io()) {
+ /* Plugin has flexible I/O, so delegate to it
+ * pre-seed outputs, plugin tries closest match
+ */
+ out = in; // hint
+ if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
+ if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
+ bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
+ if (!r) {
+ return Match (Impossible, 0);
+ }
+ // midi bypass
+ if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
return Match (Delegate, 1);
}
ChanCount inputs = info->n_inputs;
ChanCount outputs = info->n_outputs;
+ ChanCount ns_inputs = inputs - sidechain_input_pins ();
if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
- DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
- midi_bypass.set(DataType::MIDI, 1);
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
+ midi_bypass.set (DataType::MIDI, 1);
}
if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
- DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
+ DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
in.set(DataType::MIDI, 0);
}
+ // add internally provided sidechain ports
+ ChanCount insc = in + sidechain_input_ports ();
+
bool no_inputs = true;
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
if (inputs.get (*t) != 0) {
@@ -834,8 +2148,14 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
return Match (NoInputs, 1);
}
- /* Plugin inputs match requested inputs exactly */
- if (inputs == in) {
+ /* Plugin inputs match requested inputs + side-chain-ports exactly */
+ if (inputs == insc) {
+ out = outputs + midi_bypass;
+ return Match (ExactMatch, 1);
+ }
+
+ /* Plugin inputs matches without side-chain-pins */
+ if (ns_inputs == in) {
out = outputs + midi_bypass;
return Match (ExactMatch, 1);
}
@@ -850,7 +2170,8 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
bool can_replicate = true;
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
- uint32_t nin = inputs.get (*t);
+ // ignore side-chains
+ uint32_t nin = ns_inputs.get (*t);
// No inputs of this type
if (nin == 0 && in.get(*t) == 0) {
@@ -874,7 +2195,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
}
}
- if (can_replicate) {
+ if (can_replicate && f > 0) {
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
out.set (*t, outputs.get(*t) * f);
}
@@ -893,7 +2214,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
bool can_split = true;
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
- bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
+ bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
if (!can_split_type && !nothing_to_do_for_type) {
@@ -927,13 +2248,13 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
if (could_hide && !cannot_hide) {
out = outputs + midi_bypass;
- return Match (Hide, 1, hide_channels);
+ return Match (Hide, 1, false, false, hide_channels);
}
- midi_bypass.reset();
return Match (Impossible, 0);
}
+
XMLNode&
PluginInsert::get_state ()
{
@@ -952,7 +2273,24 @@ PluginInsert::state (bool full)
/* remember actual i/o configuration (for later placeholder
* in case the plugin goes missing) */
node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
+ node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
+ node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
+
+ /* save custom i/o config */
+ node.add_property("custom", _custom_cfg ? "yes" : "no");
+ for (uint32_t pc = 0; pc < get_count(); ++pc) {
+ char tmp[128];
+ snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
+ node.add_child_nocopy (* _in_map[pc].state (tmp));
+ snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
+ node.add_child_nocopy (* _out_map[pc].state (tmp));
+ }
+ node.add_child_nocopy (* _thru_map.state ("ThruMap"));
+
+ if (_sidechain) {
+ node.add_child_nocopy (_sidechain->state (full));
+ }
_plugins[0]->set_insert_id(this->id());
node.add_child_nocopy (_plugins[0]->get_state());
@@ -976,7 +2314,7 @@ PluginInsert::set_control_ids (const XMLNode& node, int version)
for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
if ((*iter)->name() == Controllable::xml_node_name) {
- const XMLProperty* prop;
+ XMLProperty const * prop;
uint32_t p = (uint32_t)-1;
#ifdef LV2_SUPPORT
@@ -1017,7 +2355,7 @@ PluginInsert::set_state(const XMLNode& node, int version)
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
XMLPropertyList plist;
- const XMLProperty *prop;
+ XMLProperty const * prop;
ARDOUR::PluginType type;
if ((prop = node.property ("type")) == 0) {
@@ -1035,6 +2373,8 @@ PluginInsert::set_state(const XMLNode& node, int version)
type = ARDOUR::LXVST;
} else if (prop->value() == X_("audiounit")) {
type = ARDOUR::AudioUnit;
+ } else if (prop->value() == X_("luaproc")) {
+ type = ARDOUR::Lua;
} else {
error << string_compose (_("unknown plugin type %1 in plugin insert state"),
prop->value())
@@ -1087,6 +2427,19 @@ PluginInsert::set_state(const XMLNode& node, int version)
}
#endif
+ if (plugin == 0 && type == ARDOUR::Lua) {
+ /* unique ID (sha1 of script) was not found,
+ * load the plugin from the serialized version in the
+ * session-file instead.
+ */
+ boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
+ XMLNode *ls = node.child (lp->state_node_name().c_str());
+ if (ls && lp) {
+ lp->set_script_from_state (*ls);
+ plugin = lp;
+ }
+ }
+
if (plugin == 0) {
error << string_compose(
_("Found a reference to a plugin (\"%1\") that is unknown.\n"
@@ -1189,6 +2542,58 @@ PluginInsert::set_state(const XMLNode& node, int version)
set_parameter_state_2X (node, version);
}
+ if ((prop = node.property (X_("custom"))) != 0) {
+ _custom_cfg = string_is_affirmative (prop->value());
+ }
+
+ uint32_t in_maps = 0;
+ uint32_t out_maps = 0;
+ XMLNodeList kids = node.children ();
+ for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
+ if ((*i)->name() == X_("ConfiguredInput")) {
+ _configured_in = ChanCount(**i);
+ }
+ if ((*i)->name() == X_("CustomSinks")) {
+ _custom_sinks = ChanCount(**i);
+ }
+ if ((*i)->name() == X_("ConfiguredOutput")) {
+ _custom_out = ChanCount(**i);
+ _configured_out = ChanCount(**i);
+ }
+ if ((*i)->name() == X_("PresetOutput")) {
+ _preset_out = ChanCount(**i);
+ }
+ if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
+ long pc = atol (&((*i)->name().c_str()[9]));
+ if (pc >= 0 && pc <= (long) get_count()) {
+ _in_map[pc] = ChanMapping (**i);
+ ++in_maps;
+ }
+ }
+ if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
+ long pc = atol (&((*i)->name().c_str()[10]));
+ if (pc >= 0 && pc <= (long) get_count()) {
+ _out_map[pc] = ChanMapping (**i);
+ ++out_maps;
+ }
+ }
+ if ((*i)->name () == "ThruMap") {
+ _thru_map = ChanMapping (**i);
+ }
+
+ // sidechain is a Processor (IO)
+ if ((*i)->name () == Processor::state_node_name) {
+ if (!_sidechain) {
+ add_sidechain (0);
+ }
+ _sidechain->set_state (**i, version);
+ }
+ }
+
+ if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
+ _maps_from_state = true;
+ }
+
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
if (active()) {
(*i)->activate ();
@@ -1197,6 +2602,7 @@ PluginInsert::set_state(const XMLNode& node, int version)
}
}
+ PluginConfigChanged (); /* EMIT SIGNAL */
return 0;
}
@@ -1231,7 +2637,7 @@ PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
}
XMLNodeList cnodes;
- XMLProperty *cprop;
+ XMLProperty const * cprop;
XMLNodeConstIterator iter;
XMLNode *child;
const char *port;
@@ -1317,6 +2723,9 @@ PluginInsert::describe_parameter (Evoral::Parameter param)
ARDOUR::framecnt_t
PluginInsert::signal_latency() const
{
+ if (!_pending_active) {
+ return 0;
+ }
if (_user_latency) {
return _user_latency;
}
@@ -1343,29 +2752,12 @@ PluginInsert::PluginControl::PluginControl (PluginInsert* p,
list->set_interpolation(Evoral::ControlList::Discrete);
}
}
-
- if (desc.toggled) {
- set_flags(Controllable::Toggle);
- }
}
/** @param val `user' value */
-void
-PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
-{
- if (writable()) {
- _set_value (user_val, group_override);
- }
-}
-void
-PluginInsert::PluginControl::set_value_unchecked (double user_val)
-{
- /* used only by automation playback */
- _set_value (user_val, Controllable::NoGroup);
-}
void
-PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
+PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
{
/* FIXME: probably should be taking out some lock here.. */
@@ -1378,13 +2770,13 @@ PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::Gro
iasp->set_parameter (_list->parameter().id(), user_val);
}
- AutomationControl::set_value (user_val, group_override);
+ AutomationControl::actually_set_value (user_val, group_override);
}
void
PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
{
- AutomationControl::set_value (user_val, Controllable::NoGroup);
+ AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
}
XMLNode&
@@ -1429,22 +2821,10 @@ PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert*
alist()->set_yrange (desc.lower, desc.upper);
alist()->reset_default (desc.normal);
}
-
- if (desc.toggled) {
- set_flags(Controllable::Toggle);
- }
-}
-
-void
-PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
-{
- if (writable()) {
- set_value_unchecked (user_val);
- }
}
void
-PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
+PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
{
/* Old numeric set_value(), coerce to appropriate datatype if possible.
This is lossy, but better than nothing until Ardour's automation system
@@ -1460,7 +2840,8 @@ PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
}
_value = value;
- AutomationControl::set_value (user_val, Controllable::NoGroup);
+
+ AutomationControl::actually_set_value (user_val, gcd);
}
XMLNode&
@@ -1487,8 +2868,18 @@ PluginInsert::get_impulse_analysis_plugin()
{
boost::shared_ptr<Plugin> ret;
if (_impulseAnalysisPlugin.expired()) {
+ // LV2 in particular uses various _session params
+ // during init() -- most notably block_size..
+ // not great.
ret = plugin_factory(_plugins[0]);
- ret->configure_io (input_streams (), output_streams ());
+ ChanCount out (internal_output_streams ());
+ if (ret->get_info ()->reconfigurable_io ()) {
+ // populate get_info ()->n_inputs and ->n_outputs
+ ChanCount useins;
+ ret->can_support_io_configuration (internal_input_streams (), out, &useins);
+ assert (out == internal_output_streams ());
+ }
+ ret->configure_io (internal_input_streams (), out);
_impulseAnalysisPlugin = ret;
} else {
ret = _impulseAnalysisPlugin.lock();
@@ -1502,8 +2893,8 @@ PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
{
// called from outside the audio thread, so this should be safe
// only do audio as analysis is (currently) only for audio plugins
- _signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
- _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
+ _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(), nframes);
+ _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
_signal_analysis_collected_nframes = 0;
_signal_analysis_collect_nframes_max = nframes;
@@ -1516,17 +2907,46 @@ PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
plugin->set_insert_id (this->id());
if (_plugins.empty()) {
- /* first (and probably only) plugin instance - connect to relevant signals
- */
+ /* first (and probably only) plugin instance - connect to relevant signals */
plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
- plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
- plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
+ plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
+ plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
+ _custom_sinks = plugin->get_info()->n_inputs;
+ // cache sidechain port count
+ _cached_sidechain_pins.reset ();
+ const ChanCount& nis (plugin->get_info()->n_inputs);
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ for (uint32_t in = 0; in < nis.get (*t); ++in) {
+ const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
+ if (iod.is_sidechain) {
+ _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
+ }
+ }
+ }
}
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+ boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
+ if (vst) {
+ vst->set_insert (this, _plugins.size ());
+ }
+#endif
_plugins.push_back (plugin);
}
+bool
+PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
+{
+ bool ok = true;
+ for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
+ if (! (*i)->load_preset (pr)) {
+ ok = false;
+ }
+ }
+ return ok;
+}
+
void
PluginInsert::realtime_handle_transport_stopped ()
{
@@ -1552,6 +2972,16 @@ PluginInsert::monitoring_changed ()
}
void
+PluginInsert::latency_changed ()
+{
+ // this is called in RT context, LatencyChanged is emitted after run()
+ _latency_changed = true;
+ // XXX This also needs a proper API not an owner() hack.
+ assert (owner ());
+ static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
+}
+
+void
PluginInsert::start_touch (uint32_t param_id)
{
boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
@@ -1568,3 +2998,24 @@ PluginInsert::end_touch (uint32_t param_id)
ac->stop_touch (true, session().audible_frame());
}
}
+
+std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
+{
+ switch (m.method) {
+ case PluginInsert::Impossible: o << "Impossible"; break;
+ case PluginInsert::Delegate: o << "Delegate"; break;
+ case PluginInsert::NoInputs: o << "NoInputs"; break;
+ case PluginInsert::ExactMatch: o << "ExactMatch"; break;
+ case PluginInsert::Replicate: o << "Replicate"; break;
+ case PluginInsert::Split: o << "Split"; break;
+ case PluginInsert::Hide: o << "Hide"; break;
+ }
+ o << " cnt: " << m.plugins
+ << (m.strict_io ? " strict-io" : "")
+ << (m.custom_cfg ? " custom-cfg" : "");
+ if (m.method == PluginInsert::Hide) {
+ o << " hide: " << m.hide;
+ }
+ o << "\n";
+ return o;
+}
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc
index 53d73c4..23515a2 100644
--- a/libs/ardour/plugin_manager.cc
+++ b/libs/ardour/plugin_manager.cc
@@ -67,6 +67,8 @@
#include "ardour/filesystem_paths.h"
#include "ardour/ladspa.h"
#include "ardour/ladspa_plugin.h"
+#include "ardour/luascripting.h"
+#include "ardour/luaproc.h"
#include "ardour/plugin.h"
#include "ardour/plugin_manager.h"
#include "ardour/rc_configuration.h"
@@ -93,7 +95,7 @@
#include "pbd/error.h"
#include "pbd/stl_delete.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "ardour/debug.h"
@@ -119,6 +121,7 @@ PluginManager::PluginManager ()
, _ladspa_plugin_info(0)
, _lv2_plugin_info(0)
, _au_plugin_info(0)
+ , _lua_plugin_info(0)
, _cancel_scan(false)
, _cancel_timeout(false)
{
@@ -215,6 +218,8 @@ PluginManager::PluginManager ()
}
BootMessage (_("Discovering Plugins"));
+
+ LuaScripting::instance().scripts_changed.connect_same_thread (lua_refresh_connection, boost::bind (&PluginManager::lua_refresh_cb, this));
}
@@ -227,6 +232,7 @@ PluginManager::~PluginManager()
delete _ladspa_plugin_info;
delete _lv2_plugin_info;
delete _au_plugin_info;
+ delete _lua_plugin_info;
}
}
@@ -244,6 +250,8 @@ PluginManager::refresh (bool cache_only)
BootMessage (_("Scanning LADSPA Plugins"));
ladspa_refresh ();
+ BootMessage (_("Scanning Lua DSP Processors"));
+ lua_refresh ();
#ifdef LV2_SUPPORT
BootMessage (_("Scanning LV2 Plugins"));
lv2_refresh ();
@@ -437,11 +445,7 @@ void
PluginManager::clear_au_cache ()
{
#ifdef AUDIOUNIT_SUPPORT
- // AUPluginInfo::au_cache_path ()
- string fn = Glib::build_filename (ARDOUR::user_config_directory(), "au_cache");
- if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
- ::g_unlink(fn.c_str());
- }
+ AUPluginInfo::clear_cache ();
#endif
}
@@ -457,6 +461,32 @@ PluginManager::clear_au_blacklist ()
}
void
+PluginManager::lua_refresh ()
+{
+ if (_lua_plugin_info) {
+ _lua_plugin_info->clear ();
+ } else {
+ _lua_plugin_info = new ARDOUR::PluginInfoList ();
+ }
+ ARDOUR::LuaScriptList & _scripts (LuaScripting::instance ().scripts (LuaScriptInfo::DSP));
+ for (LuaScriptList::const_iterator s = _scripts.begin(); s != _scripts.end(); ++s) {
+ LuaPluginInfoPtr lpi (new LuaPluginInfo(*s));
+ _lua_plugin_info->push_back (lpi);
+ }
+}
+
+void
+PluginManager::lua_refresh_cb ()
+{
+ Glib::Threads::Mutex::Lock lm (_lock, Glib::Threads::TRY_LOCK);
+ if (!lm.locked()) {
+ return;
+ }
+ lua_refresh ();
+ PluginListChanged (); /* EMIT SIGNAL */
+}
+
+void
PluginManager::ladspa_refresh ()
{
if (_ladspa_plugin_info) {
@@ -586,6 +616,11 @@ PluginManager::ladspa_discover (string path)
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path));
for (uint32_t i = 0; ; ++i) {
+ /* if a ladspa plugin allocates memory here
+ * it is never free()ed (or plugin-dependent only when unloading).
+ * For some plugins memory allocated is incremental, we should
+ * avoid re-scanning plugins and file bug reports.
+ */
if ((descriptor = dfunc (i)) == 0) {
break;
}
@@ -1102,6 +1137,9 @@ PluginManager::save_statuses ()
case LXVST:
ofs << "LXVST";
break;
+ case Lua:
+ ofs << "Lua";
+ break;
}
ofs << ' ';
@@ -1188,6 +1226,8 @@ PluginManager::load_statuses ()
type = Windows_VST;
} else if (stype == "LXVST") {
type = LXVST;
+ } else if (stype == "Lua") {
+ type = Lua;
} else {
error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype)
<< endmsg;
@@ -1265,3 +1305,10 @@ PluginManager::au_plugin_info ()
#endif
return _empty_plugin_info;
}
+
+ARDOUR::PluginInfoList&
+PluginManager::lua_plugin_info ()
+{
+ assert(_lua_plugin_info);
+ return *_lua_plugin_info;
+}
diff --git a/libs/ardour/po/cs.mo b/libs/ardour/po/cs.mo
new file mode 100644
index 0000000..3a4a78e
Binary files /dev/null and b/libs/ardour/po/cs.mo differ
diff --git a/libs/ardour/po/cs.po b/libs/ardour/po/cs.po
index 47c740f..333aa45 100644
--- a/libs/ardour/po/cs.po
+++ b/libs/ardour/po/cs.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2013-06-13 22:47+0200\n"
"Last-Translator: Pavel Fric <pavelfric at seznam.cz>\n"
"Language-Team: Czech <kde-i18n-doc at kde.org>\n"
@@ -17,89 +17,242 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.5\n"
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
-msgstr "ProlÃnaÄ"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr ""
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
msgstr ""
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "Žádný"
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr "AudioDiskstream: Seznam skladeb \"%1\" nenà seznamem zvukových skladeb"
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"AudioDiskstream %1: nenà žádný seznam skladeb, který by bylo lze kopÃrovat!"
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: PÅi doplÅovánà nelze ÄÃst %2 ze seznamu skladeb u snÃmku "
"%3"
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "AudioDiskstream %1: Nelze ÄÃst %2 ze seznamu skladeb u snÃmku %3"
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "AudioDiskstream %1: Nelze zapisovat na disk"
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "AudioDiskstream %1: Zachycená data nelze zapisovat na disk!"
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
msgstr "%1: NepodaÅilo se vytvoÅit oblast pro úplný zvukový soubor"
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
"AudioDiskstream: NepodaÅilo se vytvoÅit oblast pro zaznamenaný zvukový "
"materiál!"
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
msgstr "Chyba v programovánÃ: %1"
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: Kanál %1 pÅekroÄenà rozsahu"
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 nový záznamový soubor neinicializován správnÄ"
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: Nelze obnovit pÅedbÄžný záznamový zdrojový soubor %2"
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
"%1: Seznam obsahuje nesprávný poÄet pÅedbÄžných zdrojů - vÅ¡echny jsou "
"pÅehlÞeny"
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
"%1: Z pÅedbÄžných záznamových zdrojů nelze vytvoÅit žádnou oblast pro úplný "
"soubor"
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr "NepodaÅilo se otevÅÃt %1. Zvuková knihovna nebyla uložena"
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -107,7 +260,7 @@ msgstr ""
"Do prolÃnánà byla zapojena zesilujÃcà oblast, která ale neexistuje v seznamu "
"skladeb \"%1\" - prolÃnánà zahozeno"
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -139,10 +292,11 @@ msgstr "Å patnÄ utvoÅený XML v zavedeném seznamu skladeb"
msgid "Audio Playlists (unused)"
msgstr "Seznamy zvukových skladeb (nepoužÃvané)"
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "Chyba v programovánÃ: %1"
@@ -170,26 +324,30 @@ msgstr ""
"\n"
"Kanály: "
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Neznámý kabel \"%1\" uvedený pro vstup %2"
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr "in 1"
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr "Nejsou žádné vhodné vstupnà kabely jako náhrada"
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Kabel %1 nebyl dostupný - mÃsto nÄj se použÃvá \"in 1\""
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr "Uzel XML (%1) obsahuje nevhodný seznam vstupnÃch kanálů"
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr "Zvukové stopy"
@@ -210,19 +368,19 @@ msgstr "Nelze nahrát pÅÃdavný modul VAMP \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "PÅÃdavný modul VAMP \"%1\" se nepodaÅilo nahrát"
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -230,13 +388,14 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr ""
@@ -244,171 +403,199 @@ msgstr ""
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "Nelze pÅejmenovat vrcholový soubor pro %1 z %2 na %3 (%4)"
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr "AudioSource: Vrcholový soubor \"%1\" nenà zjevný"
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr "Nelze pÅeÄÃst vzorkovacà data neÅ¡kálovaný výpoÄet vrcholů"
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
"AudioSource[%1]: Ätenà vrcholu - Nelze pÅeÄÃst %2 vzorky pÅi posunu %3 %4(%5)"
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
"%1: NepodaÅilo se pÅeÄÃst/zapsat nezpracovaná data pro výpoÄet vrcholů (%2)"
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
-msgstr "AudioSource: Nelze otevÅÃt cestu pro vrcholy (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
+msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr "%1: NepodaÅilo se zapsat vrcholová data do souboru (%2)"
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr "NepodaÅilo se zkrátit vrcholový soubor %1 na %2 (Chyba: %3)"
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr "Pro poslech nejsou dostupné žádné výstupy - požadováno ruÄnà pÅipojenÃ"
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Nelze nastavit signálový tok poslechu pro %1 kanály"
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr "Uzel automatizace nemá žádnou vlastnost \"cesta\""
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr "Nelze otevÅÃt %2 pro nahránà dat automatizace (%3)"
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr "Nelze nahrát data automatizace z %2"
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "ProlÃnaÄ"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr ""
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
"Seznam automatizace: Nelze nahrát souÅadnice z XML. VÅ¡echny body se pÅehlÞÃ"
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"Seznam automatizace: Nenà uložena žádná souÅadnice x pro kontrolnà bod (bod "
"se pÅehlÞÃ)"
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"Seznam automatizace: Nenà uložena žádná souÅadnice y pro kontrolnà bod (bod "
"se pÅehlÞÃ)"
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
"Seznam automatizace: Uzel XML s názvem %1, nepÅedán \"AutomationList\" - "
"pÅehlÞà se"
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr "SezenÃ: NepodaÅilo se vytvoÅit vlákno sluhy"
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr "Chyba pÅi Ätenà sluhy u dstream %1"
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr "Chyba pÅi zápisu sluhy u dstream %1"
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr "Název kontrolnÃho protokolu \"%1\" nemá žádný popis"
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr "Kontrolnà protokol \"%1\" se nepodaÅilo inicializovat"
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr "Doloženà povinného kontrolnÃho protokolu %1"
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr "Hledánà kontrolnÃho protokolu v %1\n"
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr "Kontrolnà protokol %1 nepoužitelný"
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr "Protokol pro kontrolnà povrch odkryt: \"%1\"\n"
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "ControlProtocolManager: Nelze nahrát modul \"%1\" (%2)"
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "ControlProtocolManager: Modul \"%1\" nemá žádnou funkci k popisu"
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): Nelze otevÅÃt /proc/cpuinfo"
@@ -425,7 +612,7 @@ msgstr "Nelze nalézt takt CPU (MHz) v /proc/cpuinfo"
msgid "audio"
msgstr "Zvuk"
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr "MIDI"
@@ -437,11 +624,11 @@ msgstr "Neznámý"
msgid "main outs"
msgstr "Hlavnà výstupy"
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr "Poslech"
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "Äasový bod \"%1\" pro smyÄku stopy neplatný (ZaÄátek >= Konec)"
@@ -455,24 +642,24 @@ msgstr ""
msgid "Export failed: %1"
msgstr "Vyvedenà se nezdaÅilo: %1"
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
"StávajÃcà složka pro vyvedenà pro toto sezenà (%1) neexistuje - pÅehlÞà se"
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr "Žádný Äas"
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr "Neplatný Äasový formát"
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr "Žádné datum"
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr "Neplatný formát data"
@@ -508,23 +695,27 @@ msgstr "Ztrátová komprese"
msgid "Lossless compression"
msgstr "Bezztrátová komprese"
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr "KmitoÄet sezenÃ"
-#: export_format_specification.cc:549
-msgid "normalize"
-msgstr "Normalizovat"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
-#: export_format_specification.cc:553
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
+
+#: export_format_specification.cc:616
msgid "trim"
msgstr "OÅÃznout"
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr "UstÅihnout zaÄátek"
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr "UstÅihnout konec"
@@ -540,25 +731,21 @@ msgstr "TrojúhelnÃkový"
msgid "Rectangular"
msgstr "ObdélnÃkový"
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr "Žádný"
-
#: export_formats.cc:159
-msgid "8bit"
-msgstr "8bit"
+msgid "8-bit"
+msgstr ""
#: export_formats.cc:161
-msgid "16bit"
-msgstr "16bit"
+msgid "16-bit"
+msgstr ""
#: export_formats.cc:163
-msgid "24bit"
-msgstr "24bit"
+msgid "24-bit"
+msgstr ""
#: export_formats.cc:165
-msgid "32bit"
-msgstr "32bit"
+msgid "32-bit"
+msgstr ""
#: export_formats.cc:167
msgid "float"
@@ -569,8 +756,8 @@ msgid "double"
msgstr "dvojitý"
#: export_formats.cc:171
-msgid "8bit unsigned"
-msgstr "8bit bez znaménka"
+msgid "8-bit unsigned"
+msgstr ""
#: export_formats.cc:173
msgid "Vorbis sample format"
@@ -580,95 +767,91 @@ msgstr "Vzorkovacà formát Vorbis"
msgid "No sample format"
msgstr "Žádný vzorkovacà formát"
-#: export_handler.cc:360
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr ""
-#: export_handler.cc:366
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr "Editor: Nelze otevÅÃt \"%1\" jako soubor vyvedenà pro znaÄku CD"
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr "PÅi zápisu souboru TOC/CUE se vyskytla chyba:%1"
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr "Nelze pÅevést %1 na kódovánà Latin-1"
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr "Hledánà vyvádÄcÃch formátů v %1"
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr "Nelze vytvoÅit adresáŠ%1 pro vyvádÄcà formáty: %2"
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr "Nelze odstranit pÅednastavenà vyvádÄnà %1: %2"
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr "VýbÄr"
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr "Nelze pÅejmenovat vyvádÄcà formát %1 na %2: %3"
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr "Nelze odstranit vyvádÄcà profil %1: %2"
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr "Prázdný formát"
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr "Nebyl vybrán žádný Äasový úsek!"
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr "Nebyly vybrány žádné kanály!"
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr "NÄkteré kanály jsou prázdné"
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr "Nebyl vybrán žádný formát!"
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr "Všechny kanály jsou prázdné!"
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr "Jeden nebo vÃce formátu nenà sluÄitelný s tÃmto systémem!"
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
msgstr ""
"% podporuje jen %2 kanály, ale ve vašem nastavenà kanálů se nacházà %3 kanál"
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr "Je již 1000 souborů s názvem, jako je %1; verzovánà skonÄeno"
@@ -677,25 +860,25 @@ msgstr "Je již 1000 souborů s názvem, jako je %1; verzovánà skonÄeno"
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr "Nelze pÅejmenovat zdroj souboru z %1 na %2 (%3)"
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr "Zdroj souboru: Cesta hledánà nenastavena"
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Zdroj souboru: Nelze najÃt požadovaný soubor (%1): %2"
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Zdroj souboru: U souboru (%1) nelze ovÄÅit, zda existuje: %2"
@@ -712,11 +895,11 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr "Nelze pÅejmenovat soubor %1 na %2 (%3)"
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr "Nelze vytvoÅit adresáŠpro nastavenà %1 - nelze spustit"
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
@@ -724,24 +907,28 @@ msgstr ""
"AdresáŠpro nastavenà %1 již existuje, nenà ale žádný adresáÅ/složka - nelze "
"spustit"
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr "PromÄnná prostÅedà ARDOUR_DLL_PATH nenà nastavena - ukonÄuje se\n"
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
@@ -749,52 +936,81 @@ msgstr ""
msgid "filter: error creating name for new file based on %1"
msgstr "Filtr: Chyba pÅi vytváÅenà názvu pro nový soubor z %1"
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr "Filtr: Chyba pÅi vytváÅenà nového souboru %1 (%2)"
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr "Nelze ovÄÅit cestu sezenà %1 (%2)"
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr "Nelze ovÄÅit soubor sezenà %1 (%2)"
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr "%1 nenà souborem se snÃmkem"
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr "Nelze urÄit nynÄjšà pracovnà adresáŠ(%1)"
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr "Neznámý typ souboru pro sezenà %1"
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
"NepodaÅilo se nastavit systémové omezenà pro otevÅené soubory na \"neomezeno"
"\""
-#: globals.cc:236
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr "NepodaÅilo se nastavit systémové omezenà pro otevÅené soubory na %1"
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr "VaÅ¡e systémové nastavenà omezuje %1 na jen %2 otevÅené soubory"
-#: globals.cc:244
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr "NepodaÅilo se dostat systémové omezenà pro otevÅené soubory (%1)"
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
msgid "Loading configuration"
msgstr "Nahrává se nastavenÃ"
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr ""
@@ -820,8 +1036,8 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr "Stopa %1 z %2 neobsahovala žádná užiteÄná data MIDI"
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
-msgstr "Soubor MIDI %1 nebyl Äitelný (žádná pÅÃÄina se nedá urÄit)"
+msgid "MIDI file could not be written (best guess: %1)"
+msgstr ""
#: import.cc:475
msgid "Import: cannot open input sound file \"%1\""
@@ -848,110 +1064,113 @@ msgstr ""
msgid "Unknown"
msgstr "Neznámý"
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr "PÅednastavenà %1 (banka %2)"
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr "%1 - Nelze najÃt stopu/sbÄrnici s ID %2 ke spojenà s"
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IO: PÅÃpojku %1 nelze oddÄlit od %2"
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr "IO: Nelze zapsat vstupnà pÅÃpojku %1"
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr "IO: Nelze zapsat výstupnà pÅÃpojku %1"
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "Nesprávný uzel XML \"%1\" odevzdán objektu IO"
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr "vst"
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr "výst"
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr "Vstup"
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr "Výstup"
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Neznámý kabel \"%1\"uvedený pro %2 %3"
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Kabel %1 nebyl dostupný - mÃsto nÄj se použÃvá \"%2\" "
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr "Žádné %1 kabely dostupné jako náhrada"
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr "%1: Nelze vytvoÅit pÅÃpojky vstup/výstup"
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: Å patnÄ utvoÅený ÅetÄzec v uzlu XML pro vstupy \"%1\""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr "IO: Å patný ÅetÄzec pro vstup v uzlu XML \"%1\""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: Å patnÄ utvoÅený ÅetÄzec v uzlu XML pro výstupy \"%1\""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: Å patný ÅetÄzec pro výstup v uzlu XML \"%1\""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr "%s vstup"
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr "%s výstup"
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr "Mono"
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr "L"
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr "P"
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr "%d"
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -969,7 +1188,7 @@ msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: \"%1\" nemůže být použit, neboÅ¥ nedÄlá žádný \"inplace processing\""
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
@@ -977,75 +1196,75 @@ msgstr ""
"Å patné ÄÃslo parametru pro pÅÃdavný modul \"%1\". To může znaÄit zmÄnu v "
"návrhupÅÃdavného modulu, a pÅednastavenà jsou pÅÃpadnÄ neplatná"
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Špatný uzel poslán LadspaPlugin::set_state"
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: Žádné ÄÃslo pÅÃpojky LADSPA"
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: Žádná data pÅÃpojky LADSPA"
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr "NepodaÅilo se najÃt HOME. PÅednastavenà neodstranÄno."
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "NepodaÅilo se vytvoÅit %1. PÅednastavenà neuloženo. (%2)"
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr "Chyba pÅi ukládánà souboru s pÅednastavenÃm %1."
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr "NepodaÅilo se najÃt HOME. PÅednastavenà neuloženo."
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr "Na toto mÃsto nemůžete dát žádnou znaÄku CD"
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr "Nesprávný uzel XML pÅedán dál Location::set_state"
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr "Uzel XML pro polohu nemá žádnou informaci o ID"
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr "Uzel XML pro polohu nemá žádnou informaci o názvu"
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr "Uzel XML pro polohu nemá žádnou informaci o zaÄátku"
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr "Uzel XML pro polohu nemá žádnou informaci o konci"
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr "Uzel XML pro polohu nemá žádnou informaci o pÅÃznacÃch"
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr "Locations: Pokus o použità neznámé polohy jako vybrané polohy"
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "Nesprávný uzel XML pÅedán dál Locations::set_state"
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr "SezenÃ"
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr "NepodaÅilo se nahrát polohu ze souboru se sezenÃm - pÅehlÞà se"
@@ -1097,50 +1316,106 @@ msgstr ""
"Poloha s tÃmto názvem již existuje.\n"
"Zavedenou polohu můžete pÅejmenovat:"
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr "Rychlost snÃmkovánà sezenà zmÄnÄna z %1 na %2 (LTC)."
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr "Rychlost snÃmkovánà sezenà a LTC se liÅ¡Ã: LTC: %1 SezenÃ: %2."
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr "SetrvaÄnÃk"
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
"%1: ZmÄna nastavenà vstupu/výstupu %4 použije %2, ale poÄet kanálů je %3"
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr "MidiDiskstream: Seznam skladeb \"%1\" nenà seznamem skladeb MIDI"
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"MidiDiskstream %1: nenà žádný seznam skladeb, který by bylo lze kopÃrovat!"
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "MidiDiskstream %1: Nelze ÄÃst %2 ze seznamu skladeb u snÃmku %3"
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
msgid "MidiDiskstream %1: cannot write to disk"
msgstr "MidiDiskstream %1: Nelze zapisovat na disk"
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "MidiDiskstream %1: Zachycená data nelze zapisovat na disk!"
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
msgstr "%1: NepodaÅilo se vytvoÅit oblast pro úplný soubor MIDI"
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
"MidiDiskstream: NepodaÅilo se vytvoÅit oblast pro zaznamenaný materiál MIDI!"
@@ -1161,31 +1436,47 @@ msgstr "Nenalezeno žádné NoteID pro zmÄnu vlastnosti \"note\" - pÅehlÞÃ
msgid "No SysExID found for sys-ex property change - ignored"
msgstr "Nenalezeno žádné SysExID pro zmÄnu vlastnosti \"sys-ex\" - pÅehlÞà se"
-#: midi_model.cc:1994
-msgid "transpose"
-msgstr "PÅevést"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr ""
+
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr "Zdvojenà zaÅÃzenà MIDI `%1' v `%2' se pÅehlÞÃ"
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr "ChybÄjÃcà vlastnost \"parameter\" u InterpolationStyle"
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr "ChybÄjÃcà vlastnost \"style\" u InterpolationStyle"
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr "ChybÄjÃcà vlastnost \"parameter\" u AutomationState"
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr "ChybÄjÃcà vlastnost \"state\" u AutomationState"
@@ -1193,47 +1484,47 @@ msgstr "ChybÄjÃcà vlastnost \"state\" u AutomationState"
msgid "MIDI stretch created non-MIDI source"
msgstr "Protaženà MIDI vytvoÅilo zdroj, který nenà MIDI"
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr "Utlumenà sledovánà "
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr "PÅeruÅ¡enà sledovánà "
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr "Mono sledovánÃ"
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr "SÃla hlasitosti pro utlumenà sledovánà "
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr "SÃla hlasitosti pro zdůraznÄnà sóla sledovánÃ"
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr "Ovládánà pÅeruÅ¡enà %1"
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr "Ovládánà útlumu"
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr "Ovládánà polarity"
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
msgid "solo control"
msgstr "Ovládánà sóla"
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr "MTC Slave: Chyba pÅi atomickém Ätenà nynÄjÅ¡Ãho Äasu, spánek!"
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
@@ -1241,11 +1532,11 @@ msgstr ""
"Neznámá hodnota %1 pro rychlost snÃmkovánÃ/zahozené snÃmky v pÅÃchozÃm "
"datovém proudu MTC, mÃsto nà se použÃvajà hodnoty sezenÃ"
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr "Rychlost snÃmkovánà sezenà zmÄnÄna z %1 na MTC: %2"
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr "Rychlost snÃmkovánà sezenà a MTC se neshodujÃ: MTC: %1 %2:%3."
@@ -1301,7 +1592,7 @@ msgstr "KopÃrovat oblast"
msgid "fixed time region copy"
msgstr "KopÃrovat oblast s pevnÄ stanoveným Äasem"
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr "CÃli vyváženà pÅedána data XML pro %1 - pÅehlÞà se"
@@ -1335,21 +1626,69 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
"Ve stavu vyváženà nalezen neznámý pÅÃdavný modul pro vyváženà \"%1\" - "
"pÅehlÞà se"
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr "Uzel pÅÃdavného modulu pro vyváženà nemá žádnou informaci o typu!"
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr "Uzel stavu oblasti nemá žádné ID, pÅehlÞà se"
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr "Seznam skladeb: Nelze vytvoÅit oblast ze XML"
@@ -1361,35 +1700,59 @@ msgstr "Žádné ID seznamu skladeb v XML zdroje seznamu skladeb!"
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr "NepodaÅilo se sestavit seznam skladeb ze zdrojových dat sezenÃ!"
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "Zvuk"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr "Chyba v programovánÃ:"
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr "Uzlu XML k popisu pÅÃdavného modulu chybà pole \"type\""
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr "Neznámý typ pÅÃdavného modulu %1 ve vkládacÃm stavu pÅÃdavného modulu"
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr "PÅÃdavný modul nemá žádné pole pro jedineÄné ID"
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1397,80 +1760,174 @@ msgstr ""
"Nalezen odkaz na neznámý pÅÃdavný modul (\"%1\").\n"
"Snad byl od poslednÃho použità odstranÄn nebo pÅesunut."
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr "PluginInsert: Auto: Žádné ÄÃslo pÅÃpojky LADSPA"
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr "PluginInsert: Auto: PÅekroÄenà rozsahu ID pÅÃpojky"
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
"PluginInsert: automatizovatelný prvek ovládánà %1 nenalezen - pÅehlÞà se"
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr "Hledánà pÅÃdavných modulů"
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr ""
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr "NepodaÅilo se zpracovat soubor RDF: %1"
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: Nelze nahrát modul \"%1\" (%2)"
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: Modul \"%1\" nemá žádnou funkci popisu."
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
msgstr ""
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-"PÅÃdavný modul VST %1 nepodporuje processReplacing a z toho důvodu jej nynà "
-"nelze v %2 použÃt"
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
@@ -1478,16 +1935,16 @@ msgstr ""
"PÅÃdavný modul linuxVST %1 nepodporuje processReplacing a z toho důvodu jej "
"nynà nelze v %2 použÃt"
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
"Neznámý typ stavu pÅÃdavného modulu\"%1\" - vÅ¡echny záznamy se pÅehlÞÃ"
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr "Neznámý typ pÅÃdavného modulu \"%1\" - pÅehlÞà se"
-#: port.cc:450
+#: port.cc:504
msgid "could not reregister %1"
msgstr "NepodaÅilo se znovu zaregistrovat %1"
@@ -1495,16 +1952,16 @@ msgstr "NepodaÅilo se znovu zaregistrovat %1"
msgid "insert %1"
msgstr "Vložit %1"
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr "Uzlu XML k popisu pÅÃpojky chybà pole \"type\""
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr ""
"XML pro vloženà ne-pÅÃpojky použito ke vloženà pÅÃdavného modulu pÅÃpojky"
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
@@ -1512,49 +1969,49 @@ msgstr ""
"PÅÃpojka s názvem \"%1\" již existuje: ProvÄÅte na zdvojené názvy stop/"
"sbÄrnic"
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
msgstr ""
-#: port_manager.cc:292
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr "AudioEngine: Nelze zaregistrovat pÅÃpojku \"%1\": %2"
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr "Nelze vytvoÅit pÅÃpojku: %1"
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "AudioEngine: Nelze spojit %1 (%2) s %3 (%4)"
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr "Žádný pÅÃznak pro vlastnost \"%1\" v prvku %2"
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr "Žádný uzel potomka s vlastnostà \"Äinný\""
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr "Nahrává se soubor s nastavenÃm systému %1"
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr "%1: Nelze pÅeÄÃst soubor s nastavenÃm systému \"%2\""
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr "%1: Soubor s nastavenÃm systému \"%2\" se nepodaÅilo nahrát."
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
@@ -1562,93 +2019,156 @@ msgstr ""
"Váš soubor s nastavenÃm systému %1 je prázdný. To zÅejmÄ znamená, že pÅi "
"instalaci %1 se vyskytla chyba."
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr "Nahrává se soubor s uživatelovým nastavenÃm %1"
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr "%1: Nelze pÅeÄÃst soubor s nastavenÃm\"%2\""
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr "%1: Soubor s uživatelovým nastavenÃm \"%2\" se nepodaÅilo nahrát."
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr "Váš soubor s nastavenÃm %1 je prázdný. To nenà obvyklé."
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr "Soubor s nastavenÃm %1 nebyl uložen"
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr "Nelze otevÅÃt naposledy otevÅený soubor sezenà %1 (%2)"
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
"Chyba v programovánÃ: RegionFactory::create() zavoláno s neznámým typem "
"oblasti"
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr "%1 spojen-%2 (%3)"
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr "%1 spojen-%2.1 (%3)"
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr "Nelze vytvoÅit nový název pro oblast \"%1\""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr "ZavedenÃ: %1"
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr "ZavedenÃ: Chyba v src_new() : %1"
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr "Vrácená hodnota: %1"
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr "Neznámý typ procesoru \"%1\"; pÅehlÞà se"
-#: route.cc:1240
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr "Procesor se nepodaÅilo vytvoÅit. PÅehlÞà se."
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Špatný uzel poslán Route::set_state() [%1]"
-#: route.cc:2186
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
"Nalezen stav cÃle vyváženà pro cestu (%1), aniž by bylo nalezeno vyváženÃ!"
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
msgstr ""
-"Å patnÄ utvoÅený ÅetÄzec znaků pro klÃÄ poÅadà roztÅÃdÄnà v souboru sezenÃ! "
-"[%1] ... PÅehlÞà se."
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5126
+msgid "Attk"
msgstr ""
-#: route_group.cc:459
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr "Stopy MIDI nelze nynà sdružit do podskupin"
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr "tempoize: Chyba pÅi Ätenà dat z %1 v %2 (žádáno %3, obdrženo %4)"
@@ -1657,106 +2177,126 @@ msgstr "tempoize: Chyba pÅi Ätenà dat z %1 v %2 (žádáno %3, obdrženo %4)"
msgid "error writing tempo-adjusted data to %1"
msgstr "Chyba pÅi zápisu dat s upraveným tempem do %1"
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr "Pomocné (Aux) %1"
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr "Poslánà (send) %1"
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr "Chyba v programovánÃ: Poslánà vytvoÅeno pomocà role %1"
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr "Spojit se strojem"
-#: session.cc:362
+#: session.cc:484
msgid "Session loading complete"
msgstr "Nahránà sezenà dokonÄeno"
-#: session.cc:434
+#: session.cc:575
msgid "Set up LTC"
msgstr ""
-#: session.cc:436
+#: session.cc:577
msgid "Set up Click"
msgstr ""
-#: session.cc:438
+#: session.cc:579
msgid "Set up standard connections"
msgstr "Nastavit standardnà spojenÃ"
-#: session.cc:664
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr "NepodaÅilo se nastavit vstup/výstup metronomu"
-#: session.cc:727
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr ""
-#: session.cc:729
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr "Výstup %<PRIu32>"
-#: session.cc:744
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "Výstup %<PRIu32>+%<PRIu32>"
-#: session.cc:761
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr ""
-#: session.cc:763
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr "Vstup %<PRIu32>"
-#: session.cc:778
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "Vstup %<PRIu32>+%<PRIu32>"
-#: session.cc:852
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr "Nelze spojit hlavnà výstup %1 s %2"
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr "Nelze spojit vstup ovládánà %1 s %2"
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "UpÅednostÅovaný vstup/výstup pro sledovacà sbÄrnici (%1) nelze najÃt"
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr "Nelze spojit výstup ovládánà %1 s %2"
-#: session.cc:1085
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "Nelze vytvoÅit poslechový systém: Žádný poslech oblastà nenà možný"
-#: session.cc:1270
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"SezenÃ: Tuto polohu nelze pro automatický pÅepis použÃt (ZaÄátek <= Konec) "
-#: session.cc:1297
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1329
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -1764,19 +2304,31 @@ msgstr ""
"Tuto polohu nelze pro automatickou smyÄku použÃt, protože nemá žádnou, nebo "
"má zápornou délku"
-#: session.cc:1497
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1751
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr "SmyÄka zpÄtné vazby rozpoznána mezi %1 a %2"
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr "SezenÃ: NepodaÅilo se vytvoÅit novou stopu MIDI"
-#: session.cc:2053
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@@ -1784,83 +2336,91 @@ msgstr ""
"Nejsou dostupné dalšà pÅÃpojky JACK. Pokud potÅebujete tolik stop, musÃte "
"zastavit %1 a spustit JACK znovu s vÃce pÅÃpojkami."
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
-msgstr "Zvuk"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "SezenÃ: NepodaÅilo se vytvoÅit novou zvukovou cestu"
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "Nelze nastavit %1 nastavenà vstup/%2 výstup pro novou zvukovou stopu"
-#: session.cc:2297
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr "SezenÃ: NepodaÅilo se vytvoÅit novou zvukovou stopu"
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr "SbÄrnice"
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr "SezenÃ: NepodaÅilo se vytvoÅit novou zvukovou cestu"
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr "SezenÃ: Cesty UINT_MAX? Nemožné!"
-#: session.cc:2475
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr "SezenÃ: Nelze vytvoÅit stopu/sbÄrnici z popisu pÅedlohy"
-#: session.cc:2501
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr "SezenÃ: NepodaÅilo se vytvoÅit novou cestu z pÅedlohy"
-#: session.cc:2531
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr "Chyba pÅi pÅidávánà nové stopy/sbÄrnice"
-#: session.cc:3671
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Již je %1 nahrávek pro %2, což je pÅÃliÅ¡ mnoho."
-#: session.cc:4316
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr "Zdá se, že ID poslánà (send) %1, se již použÃvá"
-#: session.cc:4328
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr "Zdá se, že ID pomocného-poslánà (aux-send) %1, se již použÃvá"
-#: session.cc:4340
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr "Zdá se, že ID vrácenà (return) %1, se již použÃvá"
-#: session.cc:4352
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr "Zdá se, že ID vloženà (insert) %1, se již použÃvá"
-#: session.cc:4477
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Nelze zapsat oblast s Konec <= ZaÄátek (napÅ. %1 <= %2)"
-#: session.cc:4486
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr ""
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "Nelze otevÅÃt zvukový soubor metronomu %1 (%2)"
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "Nelze pÅeÄÃst data ze zvukového souboru metronomu"
@@ -1903,23 +2463,36 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
msgstr "Nelze vytvoÅit adresáŠse sezenÃm v cestÄ %1. Chyba: %2"
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr "AdresáŠse sezenÃm v cestÄ %1 neexistuje"
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr "SezenÃ: Nenà možné mÃt ve stejném snÃmku (%2) dvÄ události typu %1."
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr "%1: Polohu souboru %2 nelze vyhledat pro vyvedenÃ"
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr "Vyvedenà skonÄilo neoÄekávanÄ: %1"
@@ -1931,100 +2504,112 @@ msgstr ""
"Kodér LTC: Neplatná rychlost snÃmkovánà - Kódovánà LTC je pro zbývajÃcà Äást "
"tohoto sezenà zakázáno."
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "SezenÃ: Nelze poslat quarter-frame MTC (%1)"
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr "SezenÃ: Nelze vytvoÅit seznam skladeb z popisu XML"
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr "SezenÃ: Chyba v no_roll pro %1"
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Chyba v programovánÃ: Neplatný typ události v process_event (%1)"
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr "Nastavenà Solo Cut (dB)"
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr "Nastavit velikost bloku a vzorkovacà kmitoÄet"
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr "PoužÃvané nastavenÃ"
-#: session_state.cc:331
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr "Nastavit dálkové ovládánà znovu"
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit složku Peakfile \"%1\" (%2)"
-#: session_state.cc:430
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit adresáŠsezenà pro zvuková data \"%1\" (%2)"
-#: session_state.cc:437
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit adresáŠsezenà pro MIDI \"%1\" (%2)"
-#: session_state.cc:444
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
"SezenÃ: Nelze vytvoÅit odpadkový koÅ¡ sezenà pro zahozený zvuk \"%1\" (%2)"
-#: session_state.cc:451
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit složku sezenà pro vyvedené soubory \"%1\" (%2)"
-#: session_state.cc:458
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit složku sezenà pro data rozboru \"%1\" (%2)"
-#: session_state.cc:465
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit složku sezenà pro pÅÃdavné moduly \"%1\" (%2)"
-#: session_state.cc:472
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit složku sezenà pro vnÄjšà \"%1\" (%2)"
-#: session_state.cc:486
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit složku sezenà \"%1\" (%2)"
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr "NepodaÅilo se otevÅÃt %1 pro zápis pÅedlohy sezenÃ"
-#: session_state.cc:526
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr "NepodaÅilo se otevÅÃt pÅedlohu sezenà %1 pro ÄtenÃ"
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
msgstr ""
-#: session_state.cc:606
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr "NepodaÅilo se odstranit pÅedbÄžný stav nahrávánà v cestÄ \"%1\" (%2)"
-#: session_state.cc:630
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "NepodaÅilo se pÅejmenovat snÃmek obrazovky %1 na %2 (%3)"
-#: session_state.cc:658
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr "NepodaÅilo se odstranit soubor se sezenÃm v cestÄ \"%1\" (%2)"
-#: session_state.cc:685
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -2032,142 +2617,142 @@ msgstr ""
"Zvukový stroj %1 nenà spojen, a pÅi ukládánà stavu by doÅ¡lo ke ztrátÄ vÅ¡ech "
"spojenà vstup/výstup. Sezenà neuloženo"
-#: session_state.cc:736
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr "Stav se do %1 uložit nepodaÅilo"
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr "NepodaÅilo se odstranit doÄasný soubor se sezenÃm v cestÄ \"%1\" (%2)"
-#: session_state.cc:746
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:814
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: Soubor se sezenÃm \"%2\" neexistuje!"
-#: session_state.cc:826
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr "NepodaÅilo se porozumÄt souboru se sezenÃm\"%1\""
-#: session_state.cc:835
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr "Soubor se sezenÃm %1 nenà sezenÃm"
-#: session_state.cc:1147
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr "Chyba v programovánÃ: SezenÃ: Nesprávný uzel XML poslán set_state()"
-#: session_state.cc:1201
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr "SezenÃ: XML nemá žádnou Äást \"options\""
-#: session_state.cc:1206
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr "SezenÃ: XML nemá žádnou Äást \"metadata\""
-#: session_state.cc:1217
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr "SezenÃ: XML nemá žádnou Äást \"sources\""
-#: session_state.cc:1224
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr "SezenÃ: XML nemá žádnou Äást \"Tempo Map\""
-#: session_state.cc:1231
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr "SezenÃ: XML nemá žádnou Äást \"locations\""
-#: session_state.cc:1244
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr "SezenÃ: XML nemá žádnou Äást \"Regions\""
-#: session_state.cc:1251
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr "SezenÃ: XML nemá žádnou Äást \"playlists\""
-#: session_state.cc:1271
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr "SezenÃ: XML nemá žádnou Äást \"bundles\""
-#: session_state.cc:1283
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr "SezenÃ: XML nemá žádnou Äást \"diskstreams\""
-#: session_state.cc:1291
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr "SezenÃ: XML nemá žádnou Äást \"routes\""
-#: session_state.cc:1303
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr "SezenÃ: XML nemá žádnou Äást \"route groups\""
-#: session_state.cc:1312
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr "SezenÃ: XML nemá žádnou Äást \"edit groups\""
-#: session_state.cc:1319
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr "SezenÃ: XML nemá žádnou Äást \"mix groups\""
-#: session_state.cc:1327
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr "SezenÃ: XML nemá žádnou Äást \"click\""
-#: session_state.cc:1373
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr "SezenÃ: Nelze vytvoÅit cestu z popisu XML"
-#: session_state.cc:1377
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr "Byla nahrána stopa/sbÄrnice %1"
-#: session_state.cc:1382
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1386
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1485
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr "NepodaÅilo se najÃt Diskstream pro cestu"
-#: session_state.cc:1545
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr "SezenÃ: Nelze vytvoÅit oblast z popisu XML"
-#: session_state.cc:1549
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr "Nelze nahrát stav pro oblast '%1'"
-#: session_state.cc:1585
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr "Oblasti ve spojeném popisu nenalezeny (ID %1 a %2): pÅehlÞà se"
-#: session_state.cc:1613
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
"VnoÅený zdroj nemá v souboru se sezenÃm žádné informace ID! (pÅehlÞà se)"
-#: session_state.cc:1625
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr "Nelze obnovit vnoÅený zdroj pro oblast %1"
-#: session_state.cc:1687
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr "SezenÃ: Uzel XML k popisu zvukové oblasti je neúplný (chybà zdroj)"
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"SezenÃ: Uzel XML k popisu zvukové oblasti odkazuje na ID neznámého zdroje =%1"
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2175,7 +2760,7 @@ msgstr ""
"SezenÃ: Uzel XML k popisu zvukové oblasti odkazuje na ID nezvukového zdroje ="
"%1"
-#: session_state.cc:1765
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2183,139 +2768,174 @@ msgstr ""
"SezenÃ: Uzlu XML k popisu zvukové oblasti chybà nÄkteré hlavnà zdroje; "
"pÅehlÞà se"
-#: session_state.cc:1799
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr "SezenÃ: Uzel XML k popisu oblasti MIDI je neúplný (chybà zdroj)"
-#: session_state.cc:1807
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"SezenÃ: Uzel XML k popisu oblasti MIDI odkazuje na ID neznámého zdroje =%1"
-#: session_state.cc:1813
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"SezenÃ: Uzel XML k popisu oblasti MIDI odkazuje na ID ne-MIDI zdroje =%1"
-#: session_state.cc:1872
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr "SezenÃ: Nelze vytvoÅit zdroj z popisu XML"
-#: session_state.cc:1880
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1979
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "NepodaÅilo se vytvoÅit adresáŠs pÅedlohami \"%1\" (%2)"
-#: session_state.cc:1992
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr "PÅedloha \"%1\" již existuje - nová verze nebyla vytvoÅena"
-#: session_state.cc:1998
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "NepodaÅilo se vytvoÅit adresáŠpro pÅedlohu sezenà \"%1\" (%2)"
-#: session_state.cc:2008
+#: session_state.cc:2259
msgid "template not saved"
msgstr "PÅedloha neuložena"
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
-msgstr ""
-"NepodaÅilo se vytvoÅit adresáŠpro stav pÅÃdavného modulu pÅedlohy sezenà "
-"\"%1\" (%2)"
-
-#: session_state.cc:2261
+#: session_state.cc:2501
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "Nalezen neznámý uzel \"%1\" v seznamu svazků souboru sezenÃ"
-#: session_state.cc:2834
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "SezenÃ: Nelze vytvoÅit odpadkový koÅ¡ pro zahozen soubory \"%1\" (%2)"
-#: session_state.cc:2873
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "Nelze pÅejmenovat nepoužÃvaný souborový zdroj z %1 na %2 (%3)"
-#: session_state.cc:2891
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "Nelze odstranit vrcholový soubor %1 pro %2 (%3)"
-#: session_state.cc:3204
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
"NepodaÅilo se vytvoÅit zálohu starého souboru se seznamem ÄinnostÃ, nynÄjšà "
"historie neuložena"
-#: session_state.cc:3213
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr "NepodaÅilo se uložit seznam Äinnostà do %1"
-#: session_state.cc:3216
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
"NepodaÅilo se odstranit soubor se seznamem Äinnostà v cestÄ \"%1\" (%2)"
-#: session_state.cc:3220
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr "NepodaÅilo se obnovit soubor se seznamem Äinnostà ze zálohy %1 (%2)"
-#: session_state.cc:3245
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: Žádný soubor se seznamem Äinnostà \"%2\" pro toto sezenÃ."
-#: session_state.cc:3251
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr "NepodaÅilo se porozumÄt souboru se seznamem Äinnostà sezenà \"%1\""
-#: session_state.cc:3293
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "NepodaÅilo se najÃt MidiSource pro NoteDiffCommand"
-#: session_state.cc:3304
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "NepodaÅilo se najÃt MidiSource pro SysExDiffCommand"
-#: session_state.cc:3315
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "NepodaÅilo se najÃt MidiSource pro PatchChangeDiffCommand"
-#: session_state.cc:3323
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "NepodaÅilo se rozpoznat žádný pÅÃkaz v uzlu XML \"%1\"."
-#: session_state.cc:3559
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr "SezenÃ: Neznámý typ Diskstream v XML"
-#: session_state.cc:3564
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr "SezenÃ: NepodaÅilo se nahrát Diskstream pomocà stavu XML"
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr "Nelze pÅehrávat ve smyÄce - Nestanovena žádná oblast smyÄky"
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
@@ -2323,11 +2943,11 @@ msgstr ""
"Souvislé pÅehrávánà ve smyÄce nenà možné, dokud %1 použÃvá transport JACK.\n"
"DoporuÄuje se zmÄna volby v nastavenÃ"
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
@@ -2335,28 +2955,32 @@ msgstr ""
"Celkové ovládánà výšky tónu pÅi promÄnlivé rychlosti pÅehrávánà nenà možné, "
"dokud je %1 spojen s transportem JACK."
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr "Nelze pÅeÄÃst pÅedponu události, poÅ¡kozen okraj MIDI"
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr "Událost má Äas a velikost, ale nemá tÄlo, poÅ¡kozen okraj MIDI"
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr "Äas události je pÅed polohou zdroje MIDI"
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr "Nelze otevÅÃt soubor MIDI %1 pro zápis"
@@ -2373,8 +2997,8 @@ msgid "CAF"
msgstr "CAF"
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
#: sndfile_helpers.cc:38
msgid "FLAC"
@@ -2417,24 +3041,24 @@ msgid ".raw"
msgstr ".raw"
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
-msgstr "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
-msgstr "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
-msgstr "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
-msgstr "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
-msgstr "32 bit float"
+msgid "32-bit float"
+msgstr ""
#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
@@ -2444,18 +3068,26 @@ msgstr "Little-endian (Intel)"
msgid "Big-endian (PowerPC)"
msgstr "Big-endian (PowerPC)"
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: Nelze otevÅÃt soubor \"%1\" pro %2 (%3)"
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
"SndFileSource: Soubor obsahuje jen %1 kanály, %2 je neplatným poÄtem kanálů"
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2463,68 +3095,68 @@ msgstr ""
"Nelze nastavit informace o pÅenosu pro zvukový soubor %1 (%2); Zahazujà se "
"informace o pÅenosu pro tento soubor"
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
-msgstr "NepodaÅilo se pÅidÄlit soubor %1 pro ÄtenÃ."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
+msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: NepodaÅil se vyhledat v %2 snÃmku %1 (%3)"
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
"SndFileSource: @ %1 NepodaÅil se ÄÃst %2 uvnitÅ %3 (%4) (len = %5, ret byl "
"%6)"
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
"Pokus o zápis zvukového zdrojového souboru chránÄného proti zápisu (%1)"
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
msgstr "Chyba v programovánÃ: %1 %2"
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
"Pokus o uklizenà zvukového zdrojového souboru chránÄného proti zápisu (%1)"
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr "NepodaÅilo se pÅidÄlit soubor %1 pro zapsánà hlaviÄky souboru"
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
"Pokus o zápis informace o pÅenosu do zvukového zdrojového souboru chránÄného "
"proti zápisu (%1)"
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
"Pokus o nastavenà informace BWF v neotevÅeném zvukovém zdrojovém souboru (%1)"
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr "%1: Nelze vyhledat %2 (Chyba libsndfile: %3)"
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr "SndFileSource: \"%1\" Å¡patná vrácená hodnota ÄtenÃ: %2 z %5 (%3: %4)"
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr "SndFileSource: \"%1\" špatný postup zápisu (%2)"
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
@@ -2532,12 +3164,24 @@ msgstr ""
"Filesource: ZaÄáteÄnà Äas pro existujÃcà soubor je již nastaven (%1): "
"ZaÄáteÄnà Äas nelze zmÄnit."
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2553,7 +3197,7 @@ msgstr "Ãdaj pro reproduktor postrádá vyvýšenà - reproduktor se pÅehlÞ
msgid "Speaker information is missing distance - speaker ignored"
msgstr "Ãdaj pro reproduktor postrádá vzdálenost - reproduktor se pÅehlÞÃ"
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2561,44 +3205,68 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr "Regulárnà výraz stopy pásky nelze vyhodnotit k užÃvánà (%1)"
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "TempoSection: Uzel XML nemá žádnou vlastnost \"start\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "TempoSection: Uzel XML má nepÅÃpustnou hodnotu pro \"start\""
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr "TempoSection: Uzel XML nemá žádnou vlastnost \"beats-per-minute\""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
"TempoSection: Uzel XML má nepÅÃpustnou hodnotu pro \"beats_per_minute\""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr "TempoSection: Uzel XML má nepÅÃpustnou hodnotu pro \"note-type\""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr "TempoSection: Uzel XML má nepÅÃpustnou hodnotu pro \"movable\""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
-msgstr "TempoSection: Uzel XML má nepÅÃpustnou hodnotu pro \"bar-offset\""
-
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"start\""
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr ""
-#: tempo.cc:210
+#: tempo.cc:471
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr "MeterSection: Uzel XML má nepÅÃpustnou hodnotu pro \"start\""
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
@@ -2606,68 +3274,72 @@ msgstr ""
"MeterSection: Uzel XML nemá žádnou vlastnost \"beats-per-bar\" nebo "
"\"divisions-per-bar\""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-"MeterSection: Uzel XML má nepÅÃpustnou hodnotu pro \"beats-per-bar\" nebo "
-"\"divisions-per-bar\""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"note-type\""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr "MeterSection: Uzel XML má nepÅÃpustnou hodnotu pro \"note-type\""
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"movable\""
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
"ZmÄny metra lze umÃstit pouze na prvnà dobu taktu. PÅesunuje se z %1 na %2"
-#: tempo.cc:650
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
"V pÅiÅazenà tempa nejsou stanoveny žádné úseky tempa - Nelze zmÄnit tempo @ "
"%1"
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
msgid "programming error: no tempo section in tempo map!"
msgstr "Chyba v programovánÃ: Žádný úsek tempa v pÅiÅazenà tempa"
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
-msgstr "Chyba v programovánÃ: Neupravený typ MetricSection"
-
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr "PÅiÅazenà tempa požádalo o Äas BBT u snÃmku %1\n"
-#: tempo.cc:1185
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr "PÅiÅazenà tempa požádalo o Äas snÃmku v taktu < 1 %1\n"
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
"PÅiÅazenà tempa: NepodaÅilo se nastavit nový stav, obnovuje se starý stav."
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr "V %1 nalezeno vÃce vymezenà metra"
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr "V %1 nalezeno vÃce vymezenà tempa"
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "Chyba v programovánÃ: Neupravený typ MetricSection"
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr "PÅiÅazenà tempa"
@@ -2696,6 +3368,14 @@ msgstr ""
"Toto nahradà nynÄjšà pÅiÅazenà tempa!\n"
"Opravdu to chcete udÄlat?"
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr "Uzel pro svazek nemá žádnou vlastnost \"name\""
@@ -2717,62 +3397,162 @@ msgstr "Uzel pro kanál nemá žádnou vlastnost \"type\""
msgid "Node for Port has no \"name\" property"
msgstr "Uzel pro pÅÃpojku nemá žádnou vlastnost \"name\""
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
msgid "Splice"
msgstr "Spojit"
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
msgid "Slide"
msgstr "Vsunout"
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr "Zamknout"
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr "Chyba v programovánÃ: neznámý ÅetÄzec pro režim úprav \"%1\""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr "Äasový kód MIDI"
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
msgid "MTC"
msgstr "MTC"
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr "Hodiny MIDI"
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
msgid "JACK"
msgstr "JACK"
-#: utils.cc:470
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
+msgstr "LTC"
+
+#: utils.cc:464
msgid "programming error: unknown sync source string \"%1\""
msgstr "Chyba v programovánÃ: neznámý ÅetÄzec pro zdroj seÅÃzenà \"%1\""
-#: utils.cc:495
+#: utils.cc:489
msgid "M-Clock"
msgstr "M-Clock"
-#: utils.cc:501
-msgid "LTC"
-msgstr "LTC"
-
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr "Chyba v programovánÃ: neznámý nativnà formát hlaviÄky: %1"
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr "Nelze otevÅÃt adresáŠ%1 (%2)"
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#~ msgstr "AudioSource: Nelze otevÅÃt cestu pro vrcholy (c) \"%1\" (%2)"
+
+#~ msgid "normalize"
+#~ msgstr "Normalizovat"
+
+#~ msgid "8bit"
+#~ msgstr "8bit"
+
+#~ msgid "16bit"
+#~ msgstr "16bit"
+
+#~ msgid "24bit"
+#~ msgstr "24bit"
+
+#~ msgid "32bit"
+#~ msgstr "32bit"
+
+#~ msgid "8bit unsigned"
+#~ msgstr "8bit bez znaménka"
+
+#~ msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#~ msgstr "Editor: Nelze otevÅÃt \"%1\" jako soubor vyvedenà pro znaÄku CD"
+
+#~ msgid "MIDI file %1 was not readable (no reason available)"
+#~ msgstr "Soubor MIDI %1 nebyl Äitelný (žádná pÅÃÄina se nedá urÄit)"
+
+#~ msgid "transpose"
+#~ msgstr "PÅevést"
+
+#~ msgid ""
+#~ "VST plugin %1 does not support processReplacing, and so cannot be used in "
+#~ "%2 at this time"
+#~ msgstr ""
+#~ "PÅÃdavný modul VST %1 nepodporuje processReplacing a z toho důvodu jej "
+#~ "nynà nelze v %2 použÃt"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "Å patnÄ utvoÅený ÅetÄzec znaků pro klÃÄ poÅadà roztÅÃdÄnà v souboru "
+#~ "sezenÃ! [%1] ... PÅehlÞà se."
+
+#~ msgid ""
+#~ "Could not create directory for Session template plugin state\"%1\" (%2)"
+#~ msgstr ""
+#~ "NepodaÅilo se vytvoÅit adresáŠpro stav pÅÃdavného modulu pÅedlohy sezenà "
+#~ "\"%1\" (%2)"
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64 bit WAV)"
+
+#~ msgid "Signed 16 bit PCM"
+#~ msgstr "Signed 16 bit PCM"
+
+#~ msgid "Signed 24 bit PCM"
+#~ msgstr "Signed 24 bit PCM"
+
+#~ msgid "Signed 32 bit PCM"
+#~ msgstr "Signed 32 bit PCM"
+
+#~ msgid "Signed 8 bit PCM"
+#~ msgstr "Signed 8 bit PCM"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bit float"
+
+#~ msgid "could not allocate file %1 for reading."
+#~ msgstr "NepodaÅilo se pÅidÄlit soubor %1 pro ÄtenÃ."
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "TempoSection: Uzel XML nemá žádnou vlastnost \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "TempoSection: Uzel XML má nepÅÃpustnou hodnotu pro \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "TempoSection: Uzel XML má nepÅÃpustnou hodnotu pro \"bar-offset\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"start\""
+
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr ""
+#~ "MeterSection: Uzel XML má nepÅÃpustnou hodnotu pro \"beats-per-bar\" nebo "
+#~ "\"divisions-per-bar\""
+
#~ msgid ""
#~ "You have requested an operation that requires audio analysis.\n"
#~ "\n"
diff --git a/libs/ardour/po/de.mo b/libs/ardour/po/de.mo
new file mode 100644
index 0000000..e8704bf
Binary files /dev/null and b/libs/ardour/po/de.mo differ
diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po
index 5056d59..7964ddd 100644
--- a/libs/ardour/po/de.po
+++ b/libs/ardour/po/de.po
@@ -1,48 +1,39 @@
# Copyright (C) YEAR "Paul Davis"
# This file is distributed under the same license as the PACKAGE package.
#
-# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2014, 2015.
+# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2014, 2015, 2016.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-23 09:42+0100\n"
-"PO-Revision-Date: 2015-12-23 12:06+0100\n"
-"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-08-06 15:36+0100\n"
+"Last-Translator: Edgar Aichinger <edgar.aichinger at aon.at>\n"
"Language-Team: German <ardour-dev at lists.ardour.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
-#: amp.cc:62 automatable.cc:173
-msgid "Trim"
-msgstr "Anpassen"
-
-#: amp.cc:62 automatable.cc:171
-msgid "Fader"
-msgstr "Fader"
-
-#: amp.cc:453
-#, c-format
-msgid "%3.1f dB"
-msgstr "%3.1f dB"
-
-#: amp.cc:494
+#: amp.cc:412
#, c-format
msgid "%.2fdB"
msgstr "%.2fdB"
-#: analyser.cc:119 audioregion.cc:1762
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr "Transientenanalyse für %1 fehlgeschlagen."
-#: analyser.cc:119
+#: analyser.cc:121
msgid "Audio File Source"
msgstr "Audiodateiquelle"
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr "%1 (%2..%3)"
+
#: audio_backend.cc:31
msgid "No Error occurred"
msgstr "Kein Fehler aufgetreten"
@@ -183,7 +174,7 @@ msgstr "Fehler: Speichermangel"
msgid "Could not reconnect to Audio/MIDI engine"
msgstr "Konnte nicht zur Audio/MIDI Engine wiederverbinden"
-#: audio_backend.cc:107 export_formats.cc:52 session.cc:6233 session.cc:6253
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
msgid "None"
msgstr "Kein"
@@ -262,7 +253,7 @@ msgstr ""
msgid "Could not open %1. Audio Library not saved"
msgstr "Konnte %1 nicht öffnen. Die Audio-Bibliothek wurde nicht gesichert"
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -270,7 +261,7 @@ msgstr ""
"An der veralteten Ãberblendung war eine einzublendende Region beteiligt, die "
"aber in Wiedergabeliste \"%1\" nicht existiert- Ãberblendung verworfen"
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -306,8 +297,8 @@ msgstr "Audio-Wiedergabelisten (unbenutzt)"
#: audio_playlist_source.cc:171 audiosource.cc:1046
#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
-#: midi_playlist_source.cc:162 midi_source.cc:398 plugin_insert.cc:705
-#: rb_effect.cc:327 session.cc:3545 session.cc:3583 session.cc:4893
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "Programmierfehler: %1"
@@ -336,27 +327,27 @@ msgstr ""
"\n"
"Kanäle: "
-#: audio_track.cc:176
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Unbekanntes Bündel \"%1\" für Eingang von %2 genannt"
-#: audio_track.cc:178
+#: audio_track.cc:179
msgid "in 1"
msgstr "in 1"
-#: audio_track.cc:179
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr "Es gibt keine als Ersatz geeigneten Eingangs-Bündel"
-#: audio_track.cc:183
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Bündel %1 war nicht verfügbar - verwende statt dessen \"in 1\""
-#: audio_track.cc:192
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr "XML-Knoten (%1) enthält ungeeignete Liste der Eingangskanäle"
-#: audio_track.cc:215 diskstream.cc:503 source.cc:149
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
msgid "%1: this session uses destructive tracks, which are not supported"
msgstr ""
"%1: dieses Projekt benutzt destruktive Spuren, was aber nicht unterstützt "
@@ -382,19 +373,19 @@ msgstr "kann VAMP-Plugin \"%1\" nicht laden"
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "VAMP-Plugin \"%1\" konnte nicht geladen werden"
-#: audioengine.cc:753
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)"
-#: audioengine.cc:759
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion."
-#: audioengine.cc:838
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr "Konnte Backend für %1 nicht erzeugen: %2"
-#: audioregion.cc:1718
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -402,24 +393,26 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-"Sie haben eine Operation ausgelöst, die Audio-Analyse verlangt.\n"
+"Sie haben eine Operation angefordert, die Audioanalyse erfordert.\n"
"\n"
-"Momentan haben Sie \"auto-analyse-audio\" deaktiviert, weshalbTransienten-"
-"Daten bei Bedarf jedesmal neu erzeugt werden müssen.\n"
+"Zur Zeit ist \"auto-analyse-audio\" deaktiviert, was bedeutet, daà "
+"Transientendaten, wenn verlangt, jedesmal neu generiert werden müssen.\n"
"\n"
-"Wenn Sie öfters mit Transienten-Daten arbeiten, sollten Sie möglicherweise "
-"\"auto-analyse-audio\" einschalten und %1 neu starten.\n"
+"Falls Sie an etwas arbeiten, das regelmäÃig Transientendaten benötigt, "
+"sollten Sie \"auto-analyse-audio\" in Globale Einstellungen > Audio > "
+"Regionen aktivieren, dann %1 beenden und neu starten.\n"
"\n"
-"Dieser Dialog wird nicht wieder erscheinen. Jedoch könnten Sie bei dieser "
-"und zukünftigen Operation(en) zur Transienten-Erkennung eine leichte "
-"Verzögerung bemerken.\n"
+"Dieser Dialog wird nicht mehr angezeigt. Aber Sie könnten eine leichte "
+"Verzögerung bei dieser und zukünftigen Operationen mit Transienten-Erkennung "
+"bemerken.\n"
-#: audioregion.cc:1762
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr "Audioregion"
@@ -496,70 +489,78 @@ msgstr "%1: konnte Peak-Daten nicht in Datei schreiben (%2)"
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr "konnte Peakdatei %1 nicht auf %2 kürzen (Fehler: %3)"
-#: auditioner.cc:101
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr "Greife fürs MIDI-Vorhören auf Reasonable Synth zurück"
-#: auditioner.cc:103
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr "Keinen Synth zum MIDI-Vorhören gefunden."
-#: auditioner.cc:159
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr "Keine Ausgänge für Abhöre verfügbar - manuelle Verbindung erforderlich"
-#: auditioner.cc:404 auditioner.cc:451
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Kann den Abhör-Signalfluss für %1 Kanäle nicht einrichten"
-#: auditioner.cc:439
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr "Konnte Synth zum MIDI-Vorhören nicht laden."
-#: auditioner.cc:458
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr "Vorhören anderer Regionen als Audio oder MIDI wird nicht unterstützt."
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr "Automationsknoten hat keine Eigenschaft \"Pfad\""
-#: automatable.cc:105
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr "kann %2 nicht öffnen, um Automationsdaten zu laden (%3)"
-#: automatable.cc:137
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr "kann Automationsdaten von %2 nicht laden"
-#: automatable.cc:175
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Fader"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr "Anpassen"
+
+#: automatable.cc:180
msgid "Mute"
msgstr "Stumm"
-#: automation_control.cc:170
+#: automation_control.cc:228
msgid "record %1 automation"
msgstr "%1 Automation aufnehmen"
-#: automation_list.cc:396
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
"Automationsliste: kann Koordinaten aus XML nicht laden, alle Punkte ignoriert"
-#: automation_list.cc:442
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"Automationsliste: Keine X-Koordinate für Kontrollpunkt gespeichert (Punkt "
"ignoriert)"
-#: automation_list.cc:448
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"Automationsliste: Keine Y-Koordinate für Kontrollpunkt gespeichert (Punkt "
"ignoriert)"
-#: automation_list.cc:462
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
@@ -578,39 +579,43 @@ msgstr "Butler-Lesefehler bei dstream %1"
msgid "Butler write-behind failure on dstream %1"
msgstr "Butler-Schreibfehler bei dstream %1"
-#: control_protocol_manager.cc:173
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr "Kontrollprotokollname \"%1\" hat keine Beschreibung"
-#: control_protocol_manager.cc:180
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr "Kontrollprotokoll \"%1\" konnte nicht initialisiert werden"
-#: control_protocol_manager.cc:246
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr "Instanziere erforderliches Kontrollprotokoll %1"
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr "suche nach Kontrollprotokollen in %1\n"
-#: control_protocol_manager.cc:315
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr "Kontrollprotokoll %1 nicht benutzbar"
-#: control_protocol_manager.cc:332
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr "Protokoll für Kontrolloberfläche entdeckt: \"%1\"\n"
-#: control_protocol_manager.cc:350
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "ControlProtocolManager: kann Modul \"%1\" nicht laden (%2)"
-#: control_protocol_manager.cc:356
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
"ControlProtocolManager: Modul \"%1\" hat keine Funktion zur Beschreibung."
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr "Kontrollprotokoll \"%1\" hat keinen Deskriptor"
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): kann /proc/cpuinfo nicht öffnen"
@@ -627,7 +632,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden"
msgid "audio"
msgstr "Audio"
-#: data_type.cc:28 session.cc:2307
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr "MIDI"
@@ -639,7 +644,7 @@ msgstr "unbekannt"
msgid "main outs"
msgstr "Hauptausgänge"
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr "hören"
@@ -656,25 +661,25 @@ msgstr ""
msgid "Export failed: %1"
msgstr "Export fehlgeschlagen: %1"
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
"genanntes Exportverzeichnis für dieses Projekt (%1) existiert nicht - "
"ignoriert"
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr "Keine Zeit"
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr "Ungültiges Zeitformat"
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr "Kein Datum"
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr "Ungültiges Datumsformat"
@@ -710,23 +715,27 @@ msgstr "Verlustbehaftete Kompression"
msgid "Lossless compression"
msgstr "Verlustfreie Kompression"
-#: export_format_manager.cc:218 export_format_specification.cc:601
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr "Projektrate"
-#: export_format_specification.cc:556
-msgid "normalize"
-msgstr "normalisiere"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr "normalisiere Lautheit"
-#: export_format_specification.cc:560
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr "normalisiere Spitzenwert"
+
+#: export_format_specification.cc:616
msgid "trim"
msgstr "anpassen"
-#: export_format_specification.cc:562
+#: export_format_specification.cc:618
msgid "trim start"
msgstr "Anfang anpassen"
-#: export_format_specification.cc:564
+#: export_format_specification.cc:620
msgid "trim end"
msgstr "Ende anpassen"
@@ -778,22 +787,22 @@ msgstr "Vorbis-Sampleformat"
msgid "No sample format"
msgstr "Kein Sampleformat"
-#: export_handler.cc:371
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr "Datei %1 nach %2 hochgeladen"
-#: export_handler.cc:377
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
"das Hochladen nach Soundcloud ist gescheitert. Vielleicht sind E-mail-"
-"Adresse oder Passwort falsch?"
+"Adresse oder Passwort falsch?\n"
-#: export_handler.cc:503 export_handler.cc:506
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr "beim Schreiben einer TOC/CUE Datei trat ein Fehler auf:%1"
-#: export_handler.cc:796 export_handler.cc:854
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr "Kann %1 nicht zu Latin-1 Kodierung konvertieren"
@@ -805,61 +814,61 @@ msgstr "Suche in %1 nach Exportformaten"
msgid "Unable to create export format directory %1: %2"
msgstr "Kann Verzeichnis %1 für Exportformate nicht erzeugen: %2"
-#: export_profile_manager.cc:263
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr "Kann Export-Preset %1 nicht entfernen: %2"
-#: export_profile_manager.cc:352
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr "Auswahl"
-#: export_profile_manager.cc:616
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr "Kann Export-Format %1 nicht nach %2 umbenennen: %3"
-#: export_profile_manager.cc:648
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr "Kann Export-Profil %1 nicht entfernen: %2"
-#: export_profile_manager.cc:666
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr "leeres Format"
-#: export_profile_manager.cc:747
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr "Kann Exportformat aus %1 nicht laden"
-#: export_profile_manager.cc:753
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr "Kann Exportformat aus %1 nicht lesen"
-#: export_profile_manager.cc:847
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr "Keine Zeitspanne ausgewählt!"
-#: export_profile_manager.cc:851
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr "Keine Kanäle ausgewählt!"
-#: export_profile_manager.cc:855
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr "Einige Kanäle sind leer"
-#: export_profile_manager.cc:888
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr "Kein Format ausgewählt!"
-#: export_profile_manager.cc:890
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr "Alle Kanäle sind leer!"
-#: export_profile_manager.cc:892
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
"Eines oder mehrere der gewählten Formate sind mit diesem Sytem nicht "
"kompatibel!"
-#: export_profile_manager.cc:895
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
@@ -867,7 +876,7 @@ msgstr ""
"% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich "
"jedoch %3 Kanäle"
-#: file_source.cc:201 session_state.cc:3144
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -981,50 +990,55 @@ msgstr "kann momentanes Arbeitsverzeichnis nicht bestimmen (%1)"
msgid "unknown file type for session %1"
msgstr "Unbekannter Dateityp für Projekt %1"
-#: globals.cc:265
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr "%3.1f dB"
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
"Konnte die Systemgrenze für offene Dateien nicht auf \"unbeschränkt\" setzen"
-#: globals.cc:267
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr "Konnte die Systemgrenze für offene Dateien nicht auf %1 setzen"
-#: globals.cc:271 globals.cc:288
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr "Ihre Systemkonfiguration beschränkt %1 auf nur %2 offene Dateien"
-#: globals.cc:275
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr "Konnte die Grenze für offene Dateien nicht erhalten (%1)"
-#: globals.cc:290
+#: globals.cc:291
msgid "Could not set system open files limit. Current limit is %1 open files"
msgstr ""
"Konnte die Systemgrenze für offene Dateien nicht setzen. Momentane Grenze "
"ist bei %1 Dateien"
-#: globals.cc:472
+#: globals.cc:474
msgid "Loading configuration"
msgstr "Lade Konfiguration"
-#: globals.cc:536 session.cc:1031
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
msgid "Monitor"
msgstr "Monitor"
-#: globals.cc:537 session_state.cc:633
+#: globals.cc:555 session_state.cc:642
msgid "Master"
msgstr "Master"
-#: globals.cc:538
+#: globals.cc:556
msgid "Control"
msgstr "Strg"
-#: globals.cc:539
+#: globals.cc:557
msgid "Click"
msgstr "Klick"
-#: globals.cc:540
+#: globals.cc:558
msgid "Mackie"
msgstr "Mackie"
@@ -1082,110 +1096,113 @@ msgstr ""
msgid "Unknown"
msgstr "Unbekannt"
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr "Preset %1 (Bank %2)"
-#: internal_send.cc:315 internal_send.cc:316
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr "%1 - kann Spur/Bus mit der ID %2 zum Verbinden finden"
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IO: kann Port %1 nicht von %2 trennen"
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr "IO: kann Eingangsport %1 nicht registrieren"
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr "IO: kann Ausgangsport %1 nicht registrieren"
-#: io.cc:599 io.cc:655
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "unkorrekter XML-Knoten \"%1\" an IO Objekt weitergereicht"
-#: io.cc:717
+#: io.cc:730
msgid "in"
msgstr "in"
-#: io.cc:717
+#: io.cc:730
msgid "out"
msgstr "out"
-#: io.cc:718
+#: io.cc:731
msgid "input"
msgstr "Eingang"
-#: io.cc:718
+#: io.cc:731
msgid "output"
msgstr "Ausgang"
-#: io.cc:728
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Unbekanntes Bündel \"%1\" für %2 von %3 genannt"
-#: io.cc:794
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Bündel %1 war nicht verfügbar - verwende stattdessen \"%2\" "
-#: io.cc:797
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr "%1 Bündel nicht als Ersatz verfügbar"
-#: io.cc:901
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr "%1: kann keine E/A-Ports erzeugen"
-#: io.cc:1029 io.cc:1130
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Eingänge \"%1\""
-#: io.cc:1034 io.cc:1135
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr "IO: schlechte Zeichenkette für Eingang in XML-Knoten \"%1\""
-#: io.cc:1073
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Ausgänge \"%1\""
-#: io.cc:1078
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: schlechte Zeichenkette für Ausgang in XML-Knoten \"%1\""
-#: io.cc:1416
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr "Aus"
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr "Ein"
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1463
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr "%s in"
-#: io.cc:1465
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr "%s out"
-#: io.cc:1540 session.cc:837 session.cc:871
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr "Mono"
-#: io.cc:1542 session.cc:850 session.cc:885
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr "L"
-#: io.cc:1542 session.cc:852 session.cc:887
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr "R"
-#: io.cc:1544 io.cc:1550
-#, c-format
-msgid "%d"
-msgstr "%d"
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr "LADSPA: Kann Modul nicht öffnen: "
@@ -1204,7 +1221,7 @@ msgstr ""
"LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing"
"\" beherrscht"
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
@@ -1212,77 +1229,77 @@ msgstr ""
"Falsche Parameterzahl für Plugin \"%1\". Das auf eine Ãnderung im Plugin-"
"Design hindeuten, und Presets sind eventuell ungültig"
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet"
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: keine LADSPA-Portnummer"
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: keine LADSPA-Portdaten"
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt."
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)"
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr "Fehler beim Sichern der Preset-Datei %1."
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert."
-#: location.cc:459
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr "An dieser Stelle können Sie keinen CD-Marker ablegen"
-#: location.cc:611
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr "Unkorrekter XML-Knoten an Location::set_state weitergereicht"
-#: location.cc:616
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr "XML-Knoten für Position hat keine ID-Information"
-#: location.cc:620
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr "XML-Knoten für Position hat keine Namensinformation"
-#: location.cc:627
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr "XML-Knoten für Position hat keine Start-Information"
-#: location.cc:638
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr "XML-Knoten für Position hat keine End-Information"
-#: location.cc:645
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr "XML-Knoten für Position hat keine Flags-Information"
-#: location.cc:872
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
"Locations: Versuch, eine unbekannte Position als ausgewählte Position zu "
"verwenden"
-#: location.cc:1050
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht"
-#: location.cc:1063 session.cc:1537 session.cc:5717 session_state.cc:1169
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr "Projekt"
-#: location.cc:1130
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr "konnte Position nicht aus Projektdatei laden - ignoriert"
@@ -1365,6 +1382,46 @@ msgstr ""
msgid "flywheel"
msgstr "Schwungrad"
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr "Skript mit dem angegebenen Namen konnte nicht gefunden werden\n"
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr "Instantiierung des Lua-Prozessors fehlgeschlagen\n"
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr "Das Laden eines Lua Skriptes aus dem Projektstatus schlug fehl."
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr "Projektstatus für LuaProcessor enthielt kein Lua Skript."
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr "Ungültiges/inkompatibles Lua Skript für LuaProcessor gefunden."
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr "Schlechter Knoten an LuaProc::set_state gesendet"
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr "LuaProc: port hat kein Symbol, ignoriere"
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr "LuaProc: port hat keinen Wert, ignoriere"
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr "Kann LuaProc Preset-Ordner nicht erzeugen"
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr "Skript '%1' hat keinen gültigen Deskriptor."
+
#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
@@ -1448,19 +1505,19 @@ msgstr "Entferne MIDI-Patch-Datei %1"
msgid "Scene "
msgstr "Szene"
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr "Fehlende Eigenschaft \"parameter\" bei InterpolationStyle"
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr "Fehlende Eigenschaft \"style\" bei InterpolationStyle"
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr "Fehlende Eigenschaft \"parameter\" bei AutomationState"
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr "Fehlende Eigenschaft \"state\" bei AutomationState"
@@ -1468,39 +1525,39 @@ msgstr "Fehlende Eigenschaft \"state\" bei AutomationState"
msgid "MIDI stretch created non-MIDI source"
msgstr "MIDI Streckung erzeugte Nicht-MIDI Quelle"
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr "Monitor dämpfen"
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr "Monitor Cut"
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr "Monitor Mono"
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr "Lautstärke für Monitor dämpfen"
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr "Lautstärke für Monitor Solo Boost"
-#: monitor_processor.cc:511
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr "Cut-Regler %1"
-#: monitor_processor.cc:512
+#: monitor_processor.cc:544
msgid "dim control"
msgstr "Dämpfungsschalter"
-#: monitor_processor.cc:513
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr "Polaritätsschalter"
-#: monitor_processor.cc:514
+#: monitor_processor.cc:546
msgid "solo control"
msgstr "Solo-Schalter"
@@ -1576,7 +1633,7 @@ msgstr "Region kopieren"
msgid "fixed time region copy"
msgstr "Region mit fixierter Zeit kopieren"
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr "Pannerziel bekam XML-Daten für %1 übergeben - ignoriert"
@@ -1600,7 +1657,7 @@ msgstr "PannerManager: Modul \"%1\" hat keine Beschreibungsfunktion"
msgid "no panner discovered for in/out = %1/%2"
msgstr "keinen Panner für %1/%2 Ein/Ausgänge gefunden"
-#: panner_shell.cc:121
+#: panner_shell.cc:122
msgid ""
"No panner found: check that panners are being discovered correctly during "
"startup."
@@ -1608,23 +1665,71 @@ msgstr ""
"Keinen Panner gefunden: Vergewissern Sie sich, dass die Panner während des "
"Programmstarts korrekt erkannt werden."
-#: panner_shell.cc:125
+#: panner_shell.cc:126
msgid "select panner: %1\n"
msgstr "wähle Panner: %1\n"
-#: panner_shell.cc:254
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr "Unbekanntes Panner-Plugin \"%1\" in Pan-Status gefunden - ignoriert"
-#: panner_shell.cc:260
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr "Panner Plugin-Knoten hat keine Typinformation!"
-#: playlist.cc:2179
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr "C"
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr "Cis"
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr "D"
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr "Dis"
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr "E"
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr "F"
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr "Fis"
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr "G"
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr "Gis"
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr "A"
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr "Ais"
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr "H"
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr "Status-Knoten der Region hat keine ID, ignoriert"
-#: playlist.cc:2197
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr "Wiedergabeliste: kann Region aus XML nicht erzeugen"
@@ -1638,7 +1743,27 @@ msgstr ""
"Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts "
"konstruieren!"
-#: plugin.cc:329
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr "Factory-Preset des Plugins kann nicht entfernt werden."
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr "Ein Preset mit diesem Namen existiert bereits"
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "Audio"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr "MIDI"
+
+#: plugin.cc:269
+msgid "?"
+msgstr "?"
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -1646,7 +1771,7 @@ msgstr ""
"Pluginpresets werden in diesem %1-Binärpaket nicht unterstützt. Erwägen Sie, "
"für die Vollversion zu bezahlen"
-#: plugin.cc:412
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
@@ -1654,23 +1779,27 @@ msgstr ""
"Das Speichern von Pluginpresets werden in diesem %1-Binärpaket nicht "
"unterstützt. Erwägen Sie, für die Vollversion zu bezahlen"
-#: plugin_insert.cc:597
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr "Programmierfehler:"
-#: plugin_insert.cc:1010
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr "SC %1"
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr "Dem XML-Knoten zur Beschreibung des Plugins fehlt das \"type\"-Feld"
-#: plugin_insert.cc:1025
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr "Unbekannter Plugintyp %1 im Einfüge-Status des Plugins"
-#: plugin_insert.cc:1053
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr "Das Plugin hat kein Feld für die eindeutige ID"
-#: plugin_insert.cc:1078
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1678,153 +1807,157 @@ msgstr ""
"Referenz auf ein unbekanntes Plugin (\"%1\") gefunden.\n"
"Vielleicht wurde es seit der letzten Verwendung entfernt oder verschoben."
-#: plugin_insert.cc:1235
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr "PluginInsert: Auto: keine LADSPA Portnummer"
-#: plugin_insert.cc:1242
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr "PluginInsert: Auto: Port-ID Bereichsüberschreitung"
-#: plugin_insert.cc:1278
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
"PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert"
-#: plugin_manager.cc:217
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr "Finde Plugins"
-#: plugin_manager.cc:245
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr "Scanne LADSPA Plugins"
-#: plugin_manager.cc:248
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr "Scanne Lua DSP-Prozessoren"
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr "Scanne LV2 Plugins"
-#: plugin_manager.cc:254
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr "Scanne Windows VST Plugins"
-#: plugin_manager.cc:256
+#: plugin_manager.cc:264
msgid "Discovering Windows VST Plugins"
msgstr "Halte Ausschau nach Windows VST Plugins"
-#: plugin_manager.cc:265
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr "Scanne Linux VST Plugins"
-#: plugin_manager.cc:267
+#: plugin_manager.cc:275
msgid "Discovering Linux VST Plugins"
msgstr "Halte Ausschau nach Linux VST Plugins"
-#: plugin_manager.cc:280
+#: plugin_manager.cc:288
msgid "VST Blacklist: "
msgstr "VST Schwarzliste: "
-#: plugin_manager.cc:282
+#: plugin_manager.cc:290
msgid "VST Blacklist:"
msgstr "VST Schwarzliste:"
-#: plugin_manager.cc:292
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr "Scanne AU Plugins"
-#: plugin_manager.cc:294
+#: plugin_manager.cc:302
msgid "Discovering AU Plugins"
msgstr "Halte Ausschau nach AU Plugins"
-#: plugin_manager.cc:299
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr "Plugin-Scan abgeschlossen"
-#: plugin_manager.cc:483
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr "LADSPA"
-#: plugin_manager.cc:535
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr "Konnte RDF-Datei: %1 nicht parsen"
-#: plugin_manager.cc:572
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: kann Modul \"%1\" nicht laden (%2)"
-#: plugin_manager.cc:579
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: Modul \"%1\" hat keine Beschreibungsfunktion."
-#: plugin_manager.cc:778
+#: plugin_manager.cc:813
msgid "--- Windows VST plugins Scan: %1"
msgstr "--- Windows VST plugins Scan: %1"
-#: plugin_manager.cc:784
+#: plugin_manager.cc:819
msgid "VST"
msgstr "VST"
-#: plugin_manager.cc:789
+#: plugin_manager.cc:824
msgid "--- Windows VST plugins Scan Done"
msgstr "--- Windows VST plugins Scan Fertig"
-#: plugin_manager.cc:804
+#: plugin_manager.cc:839
msgid "cannot open dll"
msgstr "kann dll nicht öffnen"
-#: plugin_manager.cc:808
+#: plugin_manager.cc:843
msgid "invalid dll, file too small"
msgstr "Ungültige dll, Datei zu klein"
-#: plugin_manager.cc:812
+#: plugin_manager.cc:847
msgid "not a dll"
msgstr "keine dll"
-#: plugin_manager.cc:818
+#: plugin_manager.cc:853
msgid "cannot determine dll type"
msgstr "kann dll-Typ nicht ermitteln"
-#: plugin_manager.cc:822
+#: plugin_manager.cc:857
msgid "cannot read dll PE header"
msgstr "kann den dll-PE-Header nicht lesen"
-#: plugin_manager.cc:827
+#: plugin_manager.cc:862
msgid "invalid dll PE header"
msgstr "ungültiger dll-PE-Header"
-#: plugin_manager.cc:834
+#: plugin_manager.cc:869
msgid "i386 (32-bit)"
msgstr "i386 (32-bit)"
-#: plugin_manager.cc:837
+#: plugin_manager.cc:872
msgid "Itanium"
msgstr "Itanium"
-#: plugin_manager.cc:840
+#: plugin_manager.cc:875
msgid "x64 (64-bit)"
msgstr "x64 (64-bit)"
-#: plugin_manager.cc:843
+#: plugin_manager.cc:878
msgid "Native Architecture"
msgstr "Native Architektur"
-#: plugin_manager.cc:846
+#: plugin_manager.cc:881
msgid "Unknown Architecture"
msgstr "Unbekannte Architektur"
-#: plugin_manager.cc:862
+#: plugin_manager.cc:897
msgid " * %1 (cache only)"
msgstr " * %1 (nur Cache)"
-#: plugin_manager.cc:864
+#: plugin_manager.cc:899
msgid " * %1 - %2"
msgstr " * %1 - %2"
-#: plugin_manager.cc:878
+#: plugin_manager.cc:913
msgid " -> Cannot get Windows VST information, plugin ignored."
msgstr ""
"Kann Windows VST Informationen nicht erhalten, Plugin \"%1\" wird ignoriert."
-#: plugin_manager.cc:889
+#: plugin_manager.cc:924
msgid ""
"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
"this time"
@@ -1832,19 +1965,19 @@ msgstr ""
"VST-Plugin %1 unterstützt kein processReplacing und kann zur Zeit nicht mit "
"%2 benützt werden"
-#: plugin_manager.cc:924
+#: plugin_manager.cc:959
msgid "Ignoring duplicate Windows VST plugin \"%1\""
msgstr "Ignoriere Duplikat des Windows VST Plugins \"%1\""
-#: plugin_manager.cc:936
+#: plugin_manager.cc:971
msgid " -> OK (VST Plugin \"%1\" was added)."
msgstr " -> OK (VST Plugin \"%1\" hinzugefügt)."
-#: plugin_manager.cc:984
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr "LXVST"
-#: plugin_manager.cc:1011
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
@@ -1852,15 +1985,15 @@ msgstr ""
"linuxVST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit "
"nicht mit %2 benützt werden"
-#: plugin_manager.cc:1175
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr "unbekannter Plugin-Statustyp \"%1\" - alle Einträge ignoriert"
-#: plugin_manager.cc:1192
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr "unbekannter Plugintyp \"%1\" - ignoriert"
-#: port.cc:462
+#: port.cc:504
msgid "could not reregister %1"
msgstr "konnte %1 nicht erneut registrieren"
@@ -1877,7 +2010,7 @@ msgstr ""
msgid "non-port insert XML used for port plugin insert"
msgstr "Nicht-Port-Insert XML zum Einfügen eines Port-Plugin benutzt"
-#: port_manager.cc:285
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
@@ -1885,7 +2018,7 @@ msgstr ""
"Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/"
"Busnamen"
-#: port_manager.cc:287
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
@@ -1893,27 +2026,27 @@ msgstr ""
"Keine Ports mehr verfügbar. Wenn Sie so viele Spuren brauchen, müssen Sie %1 "
"stoppen und mit mehr Ports neu starten."
-#: port_manager.cc:290
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren"
-#: port_manager.cc:329
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr "kann Port: %1 nicht erzeugen"
-#: port_manager.cc:416
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
-#: port_manager.cc:468 port_manager.cc:469
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr "Portwiederherstellung fehlgeschlagen"
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2"
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr "Kein Kindknoten mit der Eigenschaft \"aktiv\""
@@ -1977,123 +2110,113 @@ msgstr "Kann kürzlich geöffnete Projektdatei %1 nicht schreiben (%2)"
msgid "Error writing saved template file %1 (%2)"
msgstr "Kann gesicherte Vorlagendatei %1 nicht schreiben (%2)"
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
"Programmierfehler: RegionFactory::create() mit unbekanntem Regionentyp "
"aufgerufen"
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr "%1 verbunden-%2 (%3)"
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr "%1 verbunden-%2.1 (%3)"
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr "kann keinen neuen Namen für Region \"%1\" erzeugen"
-#: resampled_source.cc:106
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr "Import: %1"
-#: resampled_source.cc:135 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr "Import: Fehler in src_new() : %1"
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr "Rückgabewert: %1"
-#: route.cc:841
-msgid "Cleared Explicit solo: %1\n"
-msgstr "Explizites Solo gelöscht: %1\n"
-
-#: route.cc:844
-msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
-msgstr "Implizites Solo gelöscht: %1 auf:%2 ab:%3\n"
-
-#: route.cc:1371 route.cc:2983
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr "unbekannter Prozessortyp \"%1\"; ignoriert"
-#: route.cc:1393
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert."
-#: route.cc:2406 route.cc:2631
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]"
-#: route.cc:2466
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!"
-#: route.cc:2540 route.cc:2544 route.cc:2745 route.cc:2749
-msgid "badly formed order key string in state file! [%1] ... ignored."
-msgstr ""
-"schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in "
-"der Projektdatei! [%1] ... ignoriert"
-
-#: route.cc:2755
-msgid "Converting deprecated order key for %1 using Editor order %2"
-msgstr ""
-"Konvertiere veralteten Sortierschlüssel für %1 unter Nutzung der "
-"Editorreihenfolge %2"
-
-#: route.cc:3389
+#: route.cc:3270
msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
msgstr "Ungültige Solo-Isolate Propagierung: von:%1 neu:%2 - alt:%3 = delta:%4"
-#: route.cc:5308
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+"Verstärker/Fader auf Route '%1' war nicht vorhanden. Wurde wieder "
+"hinzugefügt."
+
+#: route.cc:4994
msgid "lo"
msgstr "lo"
-#: route.cc:5310
+#: route.cc:4996
msgid "mid"
msgstr "mid"
-#: route.cc:5312
+#: route.cc:4998
msgid "hi"
msgstr "hi"
-#: route.cc:5419
+#: route.cc:5105
msgid "Leveler"
msgstr "Leveller"
-#: route.cc:5421
+#: route.cc:5107
msgid "Compressor"
msgstr "Kompressor"
-#: route.cc:5423
+#: route.cc:5109 route.cc:5111
msgid "Limiter"
msgstr "Limiter"
-#: route.cc:5426 route.cc:5428 route.cc:5444 route.cc:5446
+#: route.cc:5111
+msgid "Sidechain"
+msgstr "Sidechain"
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
msgid "???"
msgstr "???"
-#: route.cc:5438
+#: route.cc:5126
msgid "Attk"
msgstr "Attk"
-#: route.cc:5440
+#: route.cc:5128
msgid "Ratio"
msgstr "Ratio"
-#: route.cc:5442
+#: route.cc:5131
msgid "Rels"
msgstr "Rels"
-#: route_group.cc:459
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr "MIDI-Spuren können zur Zeit nicht zu Subgruppen zusammengefasst werden"
-#: route_group.cc:466
+#: route_group.cc:514
msgid ""
"You cannot subgroup tracks with different number of outputs at this time."
msgstr ""
@@ -2110,131 +2233,131 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr "Fehler beim Schreiben der tempo-angepassten Daten nach %1"
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr "Aux %1"
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr "Send %1"
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr "Programmierfehler: Send erzeugt mittels Rolle %1"
-#: session.cc:317 session.cc:366
+#: session.cc:348 session.cc:403
msgid "Cannot connect to audio/midi engine"
msgstr "Kann nicht zur Audio/MIDI Engine verbinden"
-#: session.cc:322
+#: session.cc:358
msgid "Session initialization failed"
msgstr "Projektinitialisierung gescheitert"
-#: session.cc:338
+#: session.cc:374
msgid "Failed to load template/snapshot state"
msgstr "Konnte Vorlagen/Schnappschussstatus nicht laden"
-#: session.cc:349
+#: session.cc:385
msgid "Failed to load state"
msgstr "Konnte Status nicht laden"
-#: session.cc:372
+#: session.cc:409
msgid "Cannot configure audio/midi engine with session parameters"
msgstr "Kann Audio/MIDI Engine nicht mit Projektparametern konfigurieren"
-#: session.cc:395
+#: session.cc:433
msgid "Connect to engine"
msgstr "Verbinde zur Engine"
-#: session.cc:446
+#: session.cc:484
msgid "Session loading complete"
msgstr "Laden des Projektes abgeschlossen"
-#: session.cc:517
+#: session.cc:575
msgid "Set up LTC"
msgstr "LTC einrichten"
-#: session.cc:519
+#: session.cc:577
msgid "Set up Click"
msgstr "Klick einrichten"
-#: session.cc:521
+#: session.cc:579
msgid "Set up standard connections"
msgstr "Richte Standard-Verbindungen ein"
-#: session.cc:768
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr "konnte Metronom-E/A nicht einrichten"
-#: session.cc:831
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr "aus %s"
-#: session.cc:833
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr "out %<PRIu32>"
-#: session.cc:848
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "out %<PRIu32>+%<PRIu32>"
-#: session.cc:865
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr "in %s"
-#: session.cc:867
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr "in %<PRIu32>"
-#: session.cc:882
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "in %<PRIu32>+%<PRIu32>"
-#: session.cc:962
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden"
-#: session.cc:1045
+#: session.cc:1170
msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
"Kann keine Monitorsektion erzeugen. Der Portname 'Monitor' ist schon "
"vergeben."
-#: session.cc:1079 session.cc:1205
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden"
-#: session.cc:1099 session.cc:1224
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Bevorzugte E/A für den Monitorbus (%1) kann nicht gefunden werden"
-#: session.cc:1130 session.cc:1255
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden"
-#: session.cc:1313
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
"Kann das Vorhör-System nicht einrichten: kein Vorhören von Regionen möglich"
-#: session.cc:1514
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Session: Sie können diese Position nicht für Auto-Punch verwenden (Start <= "
"Ende) "
-#: session.cc:1541
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
"Projekt: Sie können diesen Zeitpunkt nicht als Projektanfang/ende benutzen"
-#: session.cc:1573
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -2242,31 +2365,31 @@ msgstr ""
"Sie können diese Position nicht für \"automatische Schleife\" verwenden, da "
"sie keine oder eine negative Länge hat"
-#: session.cc:1756
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr "Programmierfehler: Projektbereich entfernt!"
-#: session.cc:2016
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr "Feedbackschleife zwischen %1 und %2 erkannt"
-#: session.cc:2276
+#: session.cc:2419
msgid "Track "
msgstr "Spur "
-#: session.cc:2278
+#: session.cc:2421
msgid "Audio "
msgstr "Audio "
-#: session.cc:2283
+#: session.cc:2426
msgid "MIDI "
msgstr "MIDI"
-#: session.cc:2358
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr "Session: konnte keine neue MIDI-Spur erzeugen."
-#: session.cc:2364
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@@ -2274,81 +2397,93 @@ msgstr ""
"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen "
"Sie %1 stoppen und JACK mit mehr Ports neu starten."
-#: session.cc:2884 session.cc:2892 session.cc:2976 session.cc:2984
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr "MIDI Bus"
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr "kann neuen MIDI-Buseingang nicht konfigurieren"
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr "kann neuen MIDI-Busausgang nicht konfigurieren"
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Session: konnte keine neueAudio-Route erzeugen"
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "kann %1 ein/%2 aus für neue Audiospur nicht konfigurieren"
-#: session.cc:2917
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr "Session: konnte keine neue Audiospur erzeugen"
-#: session.cc:2954 session.cc:2957
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr "Bus"
-#: session.cc:3009
-msgid "Session: could not create new audio route."
-msgstr "Session: konnte keine neueAudio-Route erzeugen"
-
-#: session.cc:3082 session.cc:3092
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Session: UINT_MAX Routen? unmöglich!"
-#: session.cc:3125
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen"
-#: session.cc:3168
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen."
-#: session.cc:3202
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr "Fehler beim Hinzufügen neuer Spuren/Busse"
-#: session.cc:4440
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
"Zusammenführen der eingebetteten Datei %1: Namenskollision UND md5 hash "
"Kollision!"
-#: session.cc:4570 session.cc:4643
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Es gibt bereits %1 Aufnahmen für %2, was ich als zu viele erachte."
-#: session.cc:5085
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr "Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:5097
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:5109
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr "Return ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:5121
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr "Insert ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:5246
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Kann einen Bereich mit Ende <= Start nicht schreiben (z.B. %1 <= %2)"
-#: session.cc:5255
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr "Kann einen Bereich ohne Daten nicht schreiben."
-#: session.cc:5297
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr "Kann neue Datei \"%1\" für %2 nicht erzeugen"
-#: session_click.cc:163
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "kann Metronom-Audiodatei %1 nicht öffnen (%2)"
-#: session_click.cc:176
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "kann Daten der Metronom-Audiodatei nicht lesen"
@@ -2426,11 +2561,11 @@ msgstr ""
"Session: zwei Ereignisse des Typs %1 können nicht im selben Frame existieren "
"(%2)."
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr "%1: kann für Export nicht Dateiposition %2 aufsuchen"
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr "Export endet unerwartet: %1"
@@ -2442,11 +2577,11 @@ msgstr ""
"LTC-Kodierer: ungültige Framerate - das Kodieren von LTC wird für den "
"restlichen Teil dieses Projekts ausgesetzt."
-#: session_midi.cc:534
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
-#: session_playlists.cc:402 session_playlists.cc:421
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
@@ -2454,105 +2589,105 @@ msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
msgid "Session: error in no roll for %1"
msgstr "Session: Fehler in no_roll für %1"
-#: session_process.cc:1199
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)"
-#: session_state.cc:187
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr "Solo Cut Einstellung (dB)"
-#: session_state.cc:209
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr "Setze BlockgröÃe und Samplerate"
-#: session_state.cc:214
+#: session_state.cc:221
msgid "Using configuration"
msgstr "Benutze Konfiguration"
-#: session_state.cc:339
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr "Fernbedienungen zurücksetzen"
-#: session_state.cc:368 session_state.cc:400
+#: session_state.cc:377 session_state.cc:409
msgid "Filling playback buffers"
msgstr "Fülle Wiedergabepuffer"
-#: session_state.cc:466
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "Session: kann den Peakfile Ordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:473
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für Sounddateien \"%1\" nicht erzeugen "
"(%2)"
-#: session_state.cc:480
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für MIDI \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:487
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer des Projektes \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:494
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Exportdateien \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:501
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Analysedaten \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:508
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner für Plugins \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:515
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Externals \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:529
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:560
+#: session_state.cc:569
msgid "Error reading session template file %1 (%2)"
msgstr "Fehler beim Lesen der Projektvorlagendatei %1 (%2)"
-#: session_state.cc:575
+#: session_state.cc:584
msgid "Error writing session template file %1 (%2)"
msgstr "Fehler beim Schreiben der Projektvorlagendatei %1 (%2)"
-#: session_state.cc:592
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr "Konnte %1 nicht zum Schreiben der Projektvorlage öffnen"
-#: session_state.cc:599
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr "Konnte Projektvorlage %1 nicht zum Lesen öffnen"
-#: session_state.cc:617
+#: session_state.cc:626
msgid "Loop"
msgstr "Schleife"
-#: session_state.cc:698
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr "Konnte vorläufigen Aufnahmestatus im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:722
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "Konnte Schnappschuss %1 nicht auf %2 umbenennen (%3)"
-#: session_state.cc:750
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr "Konnte Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:777
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -2560,148 +2695,148 @@ msgstr ""
"die %1 Audio-Engine ist nicht verbunden, beim Sichern würden Sie daher alle "
"E/A-Verbindungen verlieren. Projekt nicht gesichert"
-#: session_state.cc:841
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr "Status konnte nicht nach %1 gesichert werden"
-#: session_state.cc:843 session_state.cc:856
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr "Konnte temporäre Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:853
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr "konnte temporäre Projektdatei %1 nicht nach %2 umbenennen(%3)"
-#: session_state.cc:923
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: Projektdatei \"%2\" existiert nicht!"
-#: session_state.cc:935
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr "Konnte Projektdatei \"%1\" nicht verstehen"
-#: session_state.cc:944
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr "Projektdatei %1 ist kein Projekt"
-#: session_state.cc:1273
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"Programmierfehler: Session: Inkorrekter XML-Knoten an send_state() gesendet"
-#: session_state.cc:1327
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr "Session: XML hat keinen Abschnitt \"options\""
-#: session_state.cc:1332
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr "Session: XML hat keinen Abschnitt \"metadata\""
-#: session_state.cc:1343
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr "Session: XML hat keinen Abschnitt \"sources\""
-#: session_state.cc:1350
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr "Session: XML hat keinen Abschnitt \"Tempo Map\""
-#: session_state.cc:1357
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr "Session: XML hat keinen Abschnitt \"locations\""
-#: session_state.cc:1370
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr "Session: XML hat keinen Abschnitt \"Regions\""
-#: session_state.cc:1377
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr "Session: XML hat keinen Abschnitt \"playlists\""
-#: session_state.cc:1397
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr "Session: XML hat keinen Abschnitt \"bundles\""
-#: session_state.cc:1409
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr "Session: XML hat keinen Abschnitt \"diskstreams\""
-#: session_state.cc:1417
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr "Session: XML hat keinen Abschnitt \"routes\""
-#: session_state.cc:1429
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr "Session: XML hat keinen Abschnitt \"route groups\""
-#: session_state.cc:1438
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr "Session: XML hat keinen Abschnitt \"edit groups\""
-#: session_state.cc:1445
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr "Session: XML hat keinen Abschnitt \"mix groups\""
-#: session_state.cc:1453
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr "Session: XML hat keinen Abschnitt \"click\""
-#: session_state.cc:1500
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:1504
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr "Spur/Bus %1 wurde geladen"
-#: session_state.cc:1509
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr "Spuren/Busse geladen; Füge sie dem Projekt hinzu"
-#: session_state.cc:1513
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr "Hinzufügen der Spuren/Busse abgeschlossen"
-#: session_state.cc:1612
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr "Konnte Diskstream für Route nicht finden"
-#: session_state.cc:1672
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen"
-#: session_state.cc:1676
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr "Kann Status für Region '%1' nicht laden"
-#: session_state.cc:1712
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
"Regionen der Verbindungsbeschreibung nicht gefunden (IDs %1 and %2): "
"ignoriert"
-#: session_state.cc:1740
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
"Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)"
-#: session_state.cc:1752
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen"
-#: session_state.cc:1814
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion ist unvollständig "
"(Quelle fehlt)"
-#: session_state.cc:1822 session_state.cc:1843 session_state.cc:1863
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"unbekannte Quell-ID =%1"
-#: session_state.cc:1828 session_state.cc:1849 session_state.cc:1869
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2709,7 +2844,7 @@ msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"Nicht-Audio Quell-ID =%1"
-#: session_state.cc:1892
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2717,31 +2852,31 @@ msgstr ""
"Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige "
"Hauptquellen; ignoriert"
-#: session_state.cc:1926
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region ist unvollständig "
"(Quelle fehlt)"
-#: session_state.cc:1934
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"unbekannte Quell-ID =%1"
-#: session_state.cc:1940
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"Nicht-MIDI Quell-ID =%1"
-#: session_state.cc:2013
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:2021
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
@@ -2749,41 +2884,41 @@ msgstr ""
"Eine externe MIDI-Datei fehlt, %1 kann zur Zeit mit fehlenden externen MIDI-"
"Dateien nicht umgehen"
-#: session_state.cc:2103
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
"Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den "
"Programmierern."
-#: session_state.cc:2124
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:2136
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt"
-#: session_state.cc:2142
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)"
-#: session_state.cc:2171
+#: session_state.cc:2259
msgid "template not saved"
msgstr "Vorlage nicht gesichert"
-#: session_state.cc:2413
+#: session_state.cc:2501
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden"
-#: session_state.cc:2869
+#: session_state.cc:2969
msgid "Cannot cleanup peak-files for read-only session."
msgstr "Kann Peakdateien für Nur-Lese Projekt nicht aufräumen"
-#: session_state.cc:2873
+#: session_state.cc:2973
msgid "Cannot cleanup peak-files while recording"
msgstr "Kann Peakdateien während Aufnahme nicht aufräumen"
-#: session_state.cc:2896
+#: session_state.cc:2996
msgid ""
"Timeout waiting for peak-file creation to terminate before cleanup, please "
"try again later."
@@ -2791,91 +2926,91 @@ msgstr ""
"Timeout beim Warten darauf, daà die Peakdatei-Erzeugung vor dem Aufräumen "
"abgeschlossen wird, bitte versuchen Sie es später noch einmal."
-#: session_state.cc:3121
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:3160
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "kann unbenutzte Dateiquelle nicht von %1 nach %2 umbenennen (%3)"
-#: session_state.cc:3178
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)"
-#: session_state.cc:3495
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
"konnte kein Backup der alten Aktionsliste erstellen, momentane Aktionsliste "
"ungesichert"
-#: session_state.cc:3504
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr "Aktionsliste konnte nicht nach %1 gesichert werden"
-#: session_state.cc:3507
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:3511
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)"
-#: session_state.cc:3536
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt."
-#: session_state.cc:3542
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen"
-#: session_state.cc:3584
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "MidiSource für NoteDiffCommand nicht auffindbar"
-#: session_state.cc:3595
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "MidiSource für SysExDiffCommand nicht auffindbar"
-#: session_state.cc:3606
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar"
-#: session_state.cc:3614
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Konnte im XML-Knoten \"%1\" keinen Befehl erkennen."
-#: session_state.cc:3852
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr "Session: Unbekannter Diskstream im XML"
-#: session_state.cc:3857
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr "Session: konnte Diskstream nicht via XML-Status laden"
-#: session_state.cc:3954
+#: session_state.cc:4092
msgid "Cannot rename read-only session."
msgstr "Kann Nur-Lese Projekt nicht umbenennen"
-#: session_state.cc:3958
+#: session_state.cc:4096
msgid "Cannot rename session while recording"
msgstr "Kann Projekt während Aufnahme nicht umbenennen"
-#: session_state.cc:4043 session_state.cc:4044 session_state.cc:4086
-#: session_state.cc:4090
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr "umbenennen von %s in %2 gescheitert (%3)"
-#: session_state.cc:4106 session_state.cc:4107 session_state.cc:4121
-#: session_state.cc:4122
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
msgid "renaming %1 as %2 failed (%3)"
msgstr "umbenennen von %1 in %2 gescheitert (%3)"
-#: session_state.cc:4431
+#: session_state.cc:4571
msgid "Cannot create new session folder %1"
msgstr "Kann den neuen Projektordner \"%1\" nicht erzeugen"
-#: session_state.cc:4493 session_state.cc:4568
+#: session_state.cc:4633 session_state.cc:4708
msgid ""
"\n"
"copying \"%1\" failed !"
@@ -2883,7 +3018,7 @@ msgstr ""
"\n"
"kopieren von \"%1\" fehlgeschlagen !"
-#: session_state.cc:4766
+#: session_state.cc:4906
msgid "unknown reason"
msgstr "unbekannter Grund"
@@ -2895,7 +3030,7 @@ msgstr "Unbekannter Transportstatus %1 im Sync-Callback"
msgid "Cannot loop - no loop range defined"
msgstr "Kann nicht loopen - kein Schleifenbereich definieert"
-#: session_transport.cc:956
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
@@ -2904,11 +3039,11 @@ msgstr ""
"benutzt.\n"
"Ãndern Sie die Konfigurationsoption"
-#: session_transport.cc:1038
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr "Locate für negative Sample-Position aufgerufen - ignoriert"
-#: session_transport.cc:1392
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
@@ -2916,6 +3051,10 @@ msgstr ""
"Globales Varispeed ist nicht möglich, solange %1 mit JACK Transport "
"verbunden ist."
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr "Master #%1 nicht gefunden, Zuordnung verloren"
+
#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr "Kann Ereignisprefix nicht lesen, korrupter MIDI-Ringbuffer"
@@ -3128,12 +3267,20 @@ msgstr ""
msgid "SndFileSource: cannot open file \"%1\" for reading"
msgstr "SndFileSource: kann Datei \"%1\" nicht zum Lesen öffnen"
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr "Explizites Solo gelöscht: %1\n"
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr "Implizites Solo gelöscht: %1 auf:%2 ab:%3\n"
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
"Das Hochladen nach Soundcloud ist gescheitert. Vielleicht sind E-mail-"
-"Adresse oder Passwort falsch?"
+"Adresse oder Passwort falsch?\n"
#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
@@ -3160,44 +3307,70 @@ msgstr "video_server_dialog.cc:140"
msgid "Cannot compile tape track regexp for use (%1)"
msgstr "Kann regulären Ausdruck der Bandspur nicht zum Gebrauch auswerten (%1)"
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"start\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+"Altes Projekt entdeckt. XML-Knoten für TempoSection wird nicht verändert."
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr "XML-Knoten für TempoSection enthält einen illegalen Wert für \"pulse\""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"start\""
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr "XML-Knoten für TempoSection enthält einen illegalen Wert für \"frame\""
-#: tempo.cc:95
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"beats-per-minute\""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
"TempoSection: XML-Knoten hat unzulässigen Wert für \"beats_per_minute\""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"note-type\""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"movable\""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
-msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"bar-offset\""
-
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"start\""
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr "XML-Knoten für TempoSection enthält keine Eigenschaft \"active\""
-#: tempo.cc:210
+#: tempo.cc:471
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr "MeterSection: XML-Knoten hat unzulässigen Wert für \"start\""
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+"Altes Projekt entdeckt. XML-Knoten für MeterSection wird nicht verändert."
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"pulse\""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"beat\""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr "XML-Knoten für MeterSection enthält keine Eigenschaft \"bbt\""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"bbt\""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"frame\""
+
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
@@ -3205,27 +3378,29 @@ msgstr ""
"MeterSection: XML-Knoten hat keine Eigenschaft \"beats-per-bar\" oderr "
"\"divisions-per-bar\""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-"MeterSection: XML-Knoten hat unzulässigen Wert für \"beats-per-bar\" oder "
-"\"divisions-per-bar\""
+"XML-Knoten für MeterSection enthält einen illegalen Wert für"
+" \"divisions-per-bar\""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"note-type\""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr "MeterSection: XML-Knoten hat unzulässigen Wert für \"note-type\""
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"movable\""
-#: tempo.cc:402
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr "XML-Knoten für MeterSection enthält keine Eigenschaft \"lock-style\""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
@@ -3233,41 +3408,45 @@ msgstr ""
"Metrumswechsel können nur am ersten Schlag eines Taktes platziert werden. "
"Verschiebe von%1 nach %2"
-#: tempo.cc:682
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
"in der Tempo Map sind keine Tempo-Abschnitte definiert - kann Tempo @ %1 "
"nicht ändern"
-#: tempo.cc:712 tempo.cc:730 tempo.cc:748 tempo.cc:764
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr "Programmierfehler: kein Metrum-Abschnitt in der Tempo map!"
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
msgid "programming error: no tempo section in tempo map!"
msgstr "Programmierfehler: kein Tempo-Abschnitt in der Tempo Map"
-#: tempo.cc:882 tempo.cc:1892
-msgid "programming error: unhandled MetricSection type"
-msgstr "Programmierfehler: unbehandelter MetricSection Typ"
-
-#: tempo.cc:1178
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr "Tempo Map fragte nach BBT-Zeit an Frame %1\n"
-#: tempo.cc:1221
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr "Tempo Map fragte nach Frame-Zeit an Takt < 1 %1\n"
-#: tempo.cc:1705 tempo.cc:1719
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
"Tempo Map: konnte neuen Status nicht setzen, stelle den alten wieder her."
-#: tempo.cc:1740 tempo.cc:1741
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr "Mehrere Metrumdefinitionen an %1 gefunden"
-#: tempo.cc:1746 tempo.cc:1747
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr "Mehrere Tempodefinitionen an %1 gefunden"
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "Programmierfehler: unbehandelter MetricSection Typ"
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr "Tempo Map"
@@ -3300,6 +3479,10 @@ msgstr ""
msgid "Using plugin-stub with unknown i/o configuration for: "
msgstr "Benutze Plugin-Platzhalter mit unbekannter E/A-Konfiguration für: "
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr "Benutze einen Plugin-Platzhalter mit falscher E/A-Konfiguration für: "
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr "Knoten für Bündel hat keine Eigenschaft \"name\""
@@ -3377,3 +3560,46 @@ msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
msgid "cannot open directory %1 (%2)"
msgstr "kann Verzeichnis %1 nicht öffnen (%2)"
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr "VCA %n"
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr "Kann den Status eines VCA nicht setzen"
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge "
+#~ "in der Projektdatei! [%1] ... ignoriert"
+
+#~ msgid "Converting deprecated order key for %1 using Editor order %2"
+#~ msgstr ""
+#~ "Konvertiere veralteten Sortierschlüssel für %1 unter Nutzung der "
+#~ "Editorreihenfolge %2"
+
+#~ msgid "programming error: %1%2\n"
+#~ msgstr "Programmierfehler: %1 %2\n"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"bar-offset\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"start\""
+
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr ""
+#~ "MeterSection: XML-Knoten hat unzulässigen Wert für \"beats-per-bar\" oder "
+#~ "\"divisions-per-bar\""
diff --git a/libs/ardour/po/el.mo b/libs/ardour/po/el.mo
new file mode 100644
index 0000000..eb450a8
Binary files /dev/null and b/libs/ardour/po/el.mo differ
diff --git a/libs/ardour/po/el.po b/libs/ardour/po/el.po
index a0e913a..4e0d02a 100644
--- a/libs/ardour/po/el.po
+++ b/libs/ardour/po/el.po
@@ -7,105 +7,258 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2007-04-16 00:38+0200\n"
"Last-Translator: Klearchos Gourgourinis <muadib at in.gr>\n"
"Language-Team: Hellenic(Greek)\n"
-"Language: \n"
+"Language: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr ""
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
msgstr ""
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr "AudioDiskStream: Î ÎίÏÏα \"%1\" δεν είναι ηÏηÏική λίÏÏα αναÏαÏ/γήÏ"
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"AudioDiskstream %1: δεν Ï
ÏάÏÏει λίÏÏα αναÏαÏ/Î³Î®Ï Î³Î¹Î± να γίνει ανÏιγÏαÏή!"
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: καÏα Ïην αναγÏμÏÏη, δεν μÏÏÏεÏα να διαβάÏÏ %2 αÏÏ Ïη "
"λίÏÏα αναÏαÏ/Î³Î®Ï ÏÏο frame %3"
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: δεν μÏÏÏεÏα να διαβάÏÏ %2 αÏÏ Ïη λίÏÏα αναÏαÏ/Î³Î®Ï ÏÏο "
"frame %3"
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "AudioDiskstream %1: δεν μÏοÏÏ Î½Î± γÏάÏÏ ÏÏο δίÏκο"
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
"AudioDiskstream \"%1\": αδÏναÏη η εκκαθάÏιÏη δειγμαÏοληÏÏικÏν δεδομÎνÏν ÏÏο "
"δίÏκο!"
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
msgstr "%1: δεν μÏÏÏεÏα να δημιοÏ
ÏγήÏÏ ÏεÏιοÏή για ολÏκληÏο audio file"
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
"AudioDiskstream: δεν μÏÏÏεÏα να δημιοÏ
ÏγήÏÏ ÏεÏιοÏή για δειγμαÏοληÏίεÏ!"
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏÏή: %1"
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: κανάλι %1 εκÏÏÏ Î´Î¹Î±ÏÏήμαÏοÏ"
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 νÎα δειγμαÏοληÏία δεν εκκινήθη ÏÏÏÏά"
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: δεν μÏοÏÏ Î½Î± Î±Î½Î¿Î¯Î¾Ï Ïο αÏÏείο %2 αÏÏ Ïην αÏαιÏοÏμενη Ïηγή"
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr "%1: εÏÏ
ÏÏθη λανθαÏμÎÎ½Î¿Ï Î±ÏιθμÏÏ Î±ÏαιÏοÏμενÏν ÏηγÏν - αγνοήθηκαν ÏλεÏ"
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
"%1: αδÏναÏη η δημιοÏ
Ïγία ακÎÏÎ±Î¹Î±Ï ÏεÏιοÏÎ®Ï Î±ÏÏ ÏÎ¹Ï Î±ÏαιÏοÏÎ¼ÎµÎ½ÎµÏ ÏηγÎÏ "
"ηÏοληÏίαÏ"
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr "Îεν μÏÏÏεÏα να Î±Î½Î¿Î¯Î¾Ï Ïο %1. Î Audio Library δεν αÏοθηκεÏθηκε"
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
msgstr ""
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -135,10 +288,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: %1"
@@ -162,26 +316,30 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr ""
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr "ακαÏάλληλη λίÏÏα καναλιÏν ειÏÏδοÏ
ÏÏον κÏμβο XML (%1)"
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr ""
@@ -202,19 +360,19 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -222,13 +380,14 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr ""
@@ -236,169 +395,197 @@ msgstr ""
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "αδÏναÏη η μεÏονομαÏία ÏοÏ
peakfile για %1 αÏÏ %2 Ïε %3 (%4)"
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
"δεν μÏοÏÏ Î½Î± διαβάÏÏ Î´ÎµÎ´Î¿Î¼Îνα δείγμαÏÎ¿Ï Î³Î¹Î± Ï
ÏολογιÏÎ¼Ï Î¼Î·-κλιμακÏÏοÏ
peak"
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
"%1: δεν μÏοÏεÏα να γÏάÏÏ Î±Î½ÎµÎ³Î½ÏÏμÎνα raw δεδομÎνα για Ïον Ï
ÏολογιÏÎ¼Ï ÏοÏ
"
"peak (%2)"
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr "%1: δεν μÏÏÏεÏα να γÏάÏÏ Î´ÎµÎ´Î¿Î¼Îνα ÏοÏ
αÏÏείοÏ
peak (%2)"
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr ""
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr ""
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr ""
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr ""
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"λίÏÏα αÏ
ÏομαÏιÏμοÏ: καμία x-ÏÏ
νÏεÏαγμÎνη αÏοθηκεÏ
μÎνη για Ïημείο ελÎγÏοÏ
(Ïο "
"Ïημείο αγνοήθηκε)"
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"λίÏÏα αÏ
ÏομαÏιÏμοÏ: καμία y-ÏÏ
νÏεÏαγμÎνη αÏοθηκεÏ
μÎνη για Ïημείο ελÎγÏοÏ
(Ïο "
"Ïημείο αγνοήθηκε)"
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr "ΣÏ
νεδÏία: δεν μÏÏÏεÏα να δημιοÏ
ÏγήÏÏ Î´ÎÏμη με Ïον butler"
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr "ÎÏοÏÏ
Ïία ÏÏοανάγνÏÏÎ·Ï Butler ÏÏο dstream %1"
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr "ÎÏοÏÏ
Ïία οÏιÏθεγγÏαÏÎ®Ï Butler ÏÏο dstream %1"
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr "Το Ïνομα ÏÏÏÏοκÏλλοÏ
ελÎγÏοÏ
\"%1\" δεν ÎÏει descriptor"
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr "Το Ïνομα ÏÏÏÏοκÏλλοÏ
ελÎγÏοÏ
\"%1\" ήÏαν αδÏναÏο να αÏÏίÏει"
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr "Î ÏÏÏÏκολλο ελÎγÏοÏ
%1 μη ÏÏηÏιμοÏοιήÏιμο"
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "ControlProtocolManager: δεν μÏοÏÏ Î½Î± ÏοÏÏÏÏÏ Ïο module \"%1\" (%2)"
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "ControlProtocolManager: Ïο module \"%1\" δεν ÎÏει descriptor function."
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): δεν ανοίγει Ïο /proc/cpuinfo"
@@ -415,7 +602,7 @@ msgstr "δεν εÏ
ÏÎθη Ïο cpu MHz ÏÏο /proc/cpuinfo"
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr ""
@@ -427,11 +614,11 @@ msgstr ""
msgid "main outs"
msgstr ""
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr ""
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "ΠΤοÏοθεÏία \"%1\" δεν είναι ικανή για track loop (αÏÏή >= ÏÎλοÏ)"
@@ -443,23 +630,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr ""
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr ""
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr ""
@@ -495,23 +682,27 @@ msgstr ""
msgid "Lossless compression"
msgstr ""
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr ""
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
msgstr ""
-#: export_format_specification.cc:553
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
+
+#: export_format_specification.cc:616
msgid "trim"
msgstr ""
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr ""
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr ""
@@ -527,24 +718,20 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
#: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
msgstr ""
#: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
msgstr ""
#: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
msgstr ""
#: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
msgstr ""
#: export_formats.cc:167
@@ -556,7 +743,7 @@ msgid "double"
msgstr ""
#: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
msgstr ""
#: export_formats.cc:173
@@ -567,94 +754,90 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:360
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr ""
-#: export_handler.cc:366
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr ""
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr ""
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr ""
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr ""
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr ""
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr ""
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr ""
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr ""
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr ""
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr ""
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr ""
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr ""
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
msgstr ""
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr "Î¥ÏάÏÏοÏ
ν ήδη 1000 αÏÏεία με ονÏμαÏα ÏÏÏÏ %1; μη-ÏÏ
νεÏÎÏ versioning"
@@ -663,25 +846,25 @@ msgstr "Î¥ÏάÏÏοÏ
ν ήδη 1000 αÏÏεία με ονÏμαÏα ÏÏÏÏ %
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr "FileSource: μονοÏάÏι αναζηÏήÏεÏÏ Î´ÎµÎ½ εÏÎθη"
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Filesource: δεν εÏ
ÏÎθη Ïο αÏαιÏοÏμενο αÏÏείο (%1): %2"
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Filesource: δεν μÏοÏÏ Î½Î± ελÎÎ³Î¾Ï Î³Î¹Î± Ïο Ï
ÏάÏÏον αÏÏείο (%1): %2"
@@ -695,34 +878,38 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
msgstr ""
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
@@ -730,50 +917,79 @@ msgstr ""
msgid "filter: error creating name for new file based on %1"
msgstr ""
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr "δεν μÏοÏÏ Î½Î± ελÎÎ³Î¾Ï Ïο μονοÏάÏι ÏÏ
νεδÏÎ¯Î±Ï %1 (%2)"
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr "δεν μÏοÏÏ Î½Î± ελÎÎ³Î¾Ï Ïο αÏÏείο καÏάÏÏαÏεÏÏ %1 (%2)"
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr "δεν μÏοÏÏ Î½Î± καθοÏίÏÏ Ïον ÏÏÎÏονÏα ενεÏÎ³Ï Ïάκελο(directory) (%1)"
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr "άγνÏÏÏÎ¿Ï ÏÏÏÎ¿Ï Î±ÏÏείοÏ
για Ïην ÏÏ
νεδÏία %1"
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:236
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:244
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
msgid "Loading configuration"
msgstr ""
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr ""
@@ -799,7 +1015,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
msgstr ""
#: import.cc:475
@@ -826,110 +1042,113 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr "IO: δεν μÏοÏεί να καÏαÏÏÏηθεί η θÏÏα ειÏÏδοÏ
%1"
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr "IO: δεν μÏοÏει να καÏαÏÏÏηθεί η θÏÏα εξÏδοÏ
%1"
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "μη-ÏÏÏÏÏÏ ÎºÏÎ¼Î²Î¿Ï XML \"%1\" ÏÎÏαÏε ÏÏο IO ανÏικείμενο"
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr ""
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr "%1: θÏÏÎµÏ I/O δεν μÏοÏοÏν να δημιοÏ
ÏγηθοÏν"
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: κακοÏÏιαγμÎνη γÏαμμή ÏÏον XML κÏμβο για ειÏÏδοÏ
Ï \"%1\""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr "κακή γÏαμμή ειÏÏδοÏ
ÏÏον XML κÏμβο \"%1\""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: δÏÏμοÏÏη γÏαμμή ÏÏον κÏμβο XML για ÏÎ¹Ï ÎµÎ¾ÏδοÏ
Ï \"%1\""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: κακή γÏαμμή εξÏδοÏ
ÏÏον κÏμβο XML \"%1\""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr ""
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr ""
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr ""
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -948,83 +1167,83 @@ msgstr ""
"LADSPA: \"%1\" δεν μÏοÏεί να ÏÏηÏιμοÏοιηθεί, εÏ'ÏÏον δεν μÏοÏεί να κάνει εÏι "
"ÏÏÏοÏ
εÏεξεÏγαÏία"
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "ÎακÏÏ ÎºÏÎ¼Î²Î¿Ï ÎµÏÏάλη ÏÏο LadspaPlugin::set_state"
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: ÎºÎ±Î½ÎµÎ¯Ï Î±ÏιθμÏÏ Î¸ÏÏÎ±Ï ladspa"
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: κανÎνα δεδομÎνο θÏÏÎ±Ï ladspa"
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Îεν μÏÏÏεÏα να δημιοÏ
ÏγήÏÏ Ïο %1. Î Ïο-ÏÏθμιÏη δεν αÏοθηκεÏθηκε. (%2)"
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr "ΣÏάλμα ÏÏην αÏοθήκεÏ
Ïη αÏÏείοÏ
ÏÏο-ÏÏ
θμίÏεÏν %1."
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr "Îεν μÏÏÏεÏα να βÏÏ Ïο HOME. Î Ïο-ÏÏθμιÏη δεν αÏοθηκεÏθηκε."
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr ""
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr "λανθαÏμÎÎ½Î¿Ï ÎºÏÎ¼Î²Î¿Ï XML ÏÎÏαÏε ÏÏην ΤοÏοθεÏία::set_state"
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr ""
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr "ΠκÏÎ¼Î²Î¿Ï XML για Ïην ΤοÏοθεÏία δεν ÎÏει ÏληÏοÏοÏÎ¯ÎµÏ Î¿Î½ÏμαÏοÏ"
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr "ΠκÏÎ¼Î²Î¿Ï XML για Ïην ΤοÏοθεÏία δεν ÎÏει ÏληÏοÏοÏÎ¯ÎµÏ ÎµÎ½Î¬ÏξεÏÏ"
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr "ΠκÏÎ¼Î²Î¿Ï XML για Ïην ΤοÏοθεÏία δεν ÎÏει ÏληÏοÏοÏÎ¯ÎµÏ ÏÎλοÏ
Ï"
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr "ΠκÏÎ¼Î²Î¿Ï XML για Ïην ΤοÏοθεÏία δεν ÎÏει ÏληÏοÏοÏÎ¯ÎµÏ Î³Î¹Î± ÏημαίεÏ(flags)"
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
"ΤοÏοθεÏίεÏ: αÏÏÏειÏα να ÏÏηÏιμοÏοιηθεί άγνÏÏÏη ÏοÏοθεÏία Ïαν εÏιλεγμÎνη "
"ÏοÏοθεÏία"
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "λανθαÏμÎνο XML mode ÏÎÏαÏε ÏÏÎ¹Ï Î¤Î¿ÏοθεÏίεÏ::set_state"
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr ""
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr ""
@@ -1066,48 +1285,104 @@ msgid ""
"You may rename the imported location:"
msgstr ""
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr ""
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1127,31 +1402,47 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
msgstr ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1159,58 +1450,58 @@ msgstr ""
msgid "MIDI stretch created non-MIDI source"
msgstr ""
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr ""
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr ""
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr ""
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr ""
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr ""
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr ""
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr ""
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr ""
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
"MTC Slave: αÏομική ανάγνÏÏη ÏοÏ
ÏÏÎÏονÏÎ¿Ï ÏÏÏνοÏ
αÏÎÏÏ
Ïε, ÏίÏÏ Î³Î¹Î± ÏÏνο!"
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1266,7 +1557,7 @@ msgstr ""
msgid "fixed time region copy"
msgstr ""
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
@@ -1300,19 +1591,67 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr "ÎγνÏÏÏο plugin για panner \"%1\" εÏ
ÏÎθη ÏÏην καÏάÏÏαÏη pan - αγνοήθηκε"
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr "ο κÏÎ¼Î²Î¿Ï Î³Î¹Î± Ïα plugin ÏοÏ
panner δεν ÎÏει ÏληÏοÏοÏÎ¯ÎµÏ ÏÏÏοÏ
!"
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr ""
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr ""
@@ -1324,35 +1663,59 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: "
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr ""
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr "άγνÏÏÏÎ¿Ï ÏÏÏÎ¿Ï plugin %1 ÏÏην καÏάÏÏαÏη ειÏαÏθÎνÏÏν plugins"
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr ""
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1360,91 +1723,187 @@ msgstr ""
"ÎÏ
ÏÎθη μια αναÏοÏά Ïε plugin (\"%1\") ÏοÏ
είναι άγνÏÏÏο.\n"
"ÎÏÏÏ ÎÏει διαγÏαÏεί ή μεÏακινηθεί αÏÏ Ïην ÏελεÏ
Ïαία ÏοÏ
ÏÏήÏη."
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr "PluginInsert: Auto: ÏÏÏÎ¯Ï Î±ÏÎ¹Î¸Î¼Ï Î¸ÏÏÎ±Ï ladspa"
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr "PluginInsert: Auto: Ïο id θÏÏÎ±Ï ÎµÎ¯Î½Î±Î¹ εκÏÏÏ ÏεδίοÏ
"
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr ""
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr "Îεν μÏÏÏεÏα να αναλÏÏÏ Ïο αÏÏείο rdf: %1"
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: δεν μÏοÏÏ Î½Î± ÏοÏÏÏÏÏ Ïο module \"%1\" (%2)"
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: Ïο module \"%1\" δεν ÎÏει λειÏοÏ
Ïγία ÏεÏιγÏαÏήÏ."
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
msgstr ""
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:450
+#: port.cc:504
msgid "could not reregister %1"
msgstr "αδÏναÏη η εÏανακαÏαγÏαÏή %1"
@@ -1452,152 +1911,215 @@ msgstr "αδÏναÏη η εÏανακαÏαγÏαÏή %1"
msgid "insert %1"
msgstr ""
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr "ειÏαγÏγή μη-θÏÏÎ±Ï XML για ÏÏήÏη Ïε ειÏαγÏγή plugin θÏÏαÏ"
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
msgstr ""
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
msgstr ""
-#: port_manager.cc:292
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr ""
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr ""
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "AudioEngine: αδÏναÏη η ÏÏνδεÏη %1 (%2) Ïε %3 (%4)"
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr ""
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr "ÎνάκληÏη αÏÏείοÏ
ÏÏ
θμίÏεÏν ÏÏ
ÏÏήμαÏÎ¿Ï %1"
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
msgstr ""
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr "ÎνάκληÏη αÏÏείοÏ
ÏÏ
θμίÏεÏν ÏÏήÏÏη %1"
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr ""
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr "ÎÏÏείο ÏÏ
θμίÏεÏν %1 δεν αÏοθηκεÏθηκε"
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr "δεν μÏοÏÏ Î½Î± Î±Î½Î¿Î¯Î¾Ï Ïο ÏÏÏÏÏαÏο αÏÏείο ÏÏ
νεδÏÎ¯Î±Ï %1 (%2)"
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr ""
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr ""
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr "δεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ Î½Îο Ïνομα για Ïην ÏεÏιοÏή \"%1\""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr "ÎιÏαγÏγή: %1"
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr "ÎιÏαγÏγή: src_new() αÏÎÏÏ
Ïε : %1"
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr ""
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1240
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "ÎακÏÏ ÎºÏÎ¼Î²Î¿Ï ÎµÏÏάλη ÏÏο Route::set_state() [%1]"
-#: route.cc:2186
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
msgstr ""
-"δÏÏμοÏÏη γÏαμμή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏαξινομήÏεÏÏ ÏÏο αÏÏείο καÏαÏÏάÏεÏÏ ! [%1] ... "
-"αγνοήθηκε."
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5107
+msgid "Compressor"
msgstr ""
-#: route_group.cc:459
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr ""
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
@@ -1606,207 +2128,247 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr "ÏÏάλμα ÏÏην εγγÏαÏή ÏÏονο-ÏÏ
θμιÏμÎνÏν δεδομÎνÏν ÏÏο %1"
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr ""
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr ""
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr ""
-#: session.cc:362
+#: session.cc:484
msgid "Session loading complete"
msgstr ""
-#: session.cc:434
+#: session.cc:575
msgid "Set up LTC"
msgstr ""
-#: session.cc:436
+#: session.cc:577
msgid "Set up Click"
msgstr ""
-#: session.cc:438
+#: session.cc:579
msgid "Set up standard connections"
msgstr ""
-#: session.cc:664
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr "Îεν μÏÏÏεÏα να διαμοÏÏÏÏÏ Ïο I/O ÏοÏ
ÎεÏÏονÏμοÏ
(click)"
-#: session.cc:727
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr ""
-#: session.cc:729
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:744
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:761
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr ""
-#: session.cc:763
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:778
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:852
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1085
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "δεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ Ïον ÎκÏοαÏή: καμία ακÏÏαÏη ÏεÏιοÏÏν δÏ
ναÏή"
-#: session.cc:1270
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"ΣÏ
νεδÏία: δεν μÏοÏείÏε να ÏÏηÏιμοÏοιήÏεÏε αÏ
Ïήν Ïην ÏοÏοθεÏία για auto punch "
"(αÏÏή <= ÏÎλοÏ)"
-#: session.cc:1297
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1329
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1497
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1751
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr "διαμÏÏÏÏÏη feedback loop ανάμεÏα Ïε %1 και %2"
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:2053
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
msgstr ""
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "δεν μÏοÏÏ Î½Î± διαμοÏÏÏÏÏ %1 in/%2 out διάÏαξη για νÎο κανάλι ήÏοÏ
"
-#: session.cc:2297
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr "ΣÏ
νεδÏία: δεν μÏÏÏεÏα να δημιοÏ
ÏγήÏÏ Î½Îο κανάλι ήÏοÏ
."
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr ""
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2475
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2501
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2531
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3671
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Î¥ÏάÏÏοÏ
ν ήδη %1 εγγÏαÏÎÏ Î³Î¹Î± %2, ÏÎ¹Ï Î¿ÏÎ¿Î¯ÎµÏ Î¸ÎµÏÏÏ ÏάÏα ÏολλÎÏ."
-#: session.cc:4316
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4328
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4340
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4352
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4477
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4486
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr ""
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "δεν μÏοÏÏ Î½Î± Î±Î½Î¿Î¯Î¾Ï Ïοsoundfile μεÏÏονÏμοÏ
%1 (%2)"
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "δεν μÏοÏÏ Î½Î± διαβάÏÏ Î´ÎµÎ´Î¿Î¼Îνα αÏÏ Ïο soundfile μεÏÏονÏμοÏ
"
@@ -1845,25 +2407,38 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
msgstr ""
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
"ΣÏ
νεδÏία: δεν γίνεÏαι να Ï
ÏάÏÏοÏ
ν δÏο ÏÏ
μβάνÏα ÏοÏ
ÏÏÏοÏ
%1 ÏÏο ίδιο frame "
"(%2)."
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr "%1: δεν μÏοÏÏ Î½Î± αναζηÏήÏÏ ÏÏο %2 για εξαγÏγή"
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr ""
@@ -1873,244 +2448,256 @@ msgid ""
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "ΣÏ
νεδÏία: δεν μÏοÏÏ Î½Î± ÏÏÎµÎ¯Î»Ï ÏÎÏαÏÏο-frame MTC μήνÏ
μα (%1)"
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr "ΣÏ
νεδÏία: δεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ Ïην Playlist αÏÏ Ïην XML ÏεÏιγÏαÏή."
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr "ΣÏ
νεδÏία: ÏÏάλμα ÏÏο no roll για %1"
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
"ΣÏάλμα ÏÏογÏαμμαÏιÏμοÏ: ÏαÏÎ¬Î½Î¿Î¼Î¿Ï ÏÏÏÎ¿Ï ÏÏ
μβάνÏÎ¿Ï ÏÏο process_event (%1)"
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr ""
-#: session_state.cc:331
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:430
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr "ΣÏ
νεδÏία: δεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ Ïάκελο ήÏÏν ÏÏ
νεδÏÎ¯Î±Ï \"%1\" (%2)"
-#: session_state.cc:437
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:444
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:451
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:458
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:465
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:472
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:486
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:526
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
msgstr ""
-#: session_state.cc:606
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:630
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:658
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:685
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:736
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr "η καÏάÏÏαÏη δεν μÏοÏοÏÏε να ÏÏθεί ÏÏο %1"
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:746
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:814
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:826
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:835
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1147
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: ΣÏ
νεδÏία: λανθαÏμÎÎ½Î¿Ï ÎºÏÎ¼Î²Î¿Ï XML εÏÏάλη ÏÏην "
"set_state()"
-#: session_state.cc:1201
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα εÏιλογÏν(options)"
-#: session_state.cc:1206
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1217
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα ÏηγÏν"
-#: session_state.cc:1224
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα Tempo Map"
-#: session_state.cc:1231
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα ÏοÏοθεÏιÏν"
-#: session_state.cc:1244
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα ΠεÏιοÏÏν"
-#: session_state.cc:1251
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα playlists"
-#: session_state.cc:1271
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1283
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα diskstreams"
-#: session_state.cc:1291
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα διαδÏομÏν"
-#: session_state.cc:1303
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1312
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα εÏεξεÏ/ÏÎ¯Î±Ï Î¿Î¼Î¬Î´Ïν"
-#: session_state.cc:1319
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα μίξεÏÏ Î¿Î¼Î¬Î´Ïν"
-#: session_state.cc:1327
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr "ΣÏ
νεδÏία: η XML καÏάÏÏαÏη δεν ÎÏει ÏομÎα μεÏÏονÏμοÏ
"
-#: session_state.cc:1373
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr "ΣÏ
νεδÏία: δεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ ÎιαδÏομή αÏÏ XML ÏεÏιγÏαÏή."
-#: session_state.cc:1377
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1382
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1386
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1485
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1545
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr "ΣÏ
νεδÏία: δεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ Î ÎµÏιοÏή αÏÏ XML ÏεÏιγÏαÏή."
-#: session_state.cc:1549
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1585
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1613
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1625
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1687
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"ΣÏ
νεδÏία: Î XMLÎÏÎ¼Î²Î¿Ï ÏοÏ
ÏεÏιγÏάÏει AudioΠεÏιοÏή είναι ημιÏÎµÎ»Î®Ï (δίÏÏÏ Ïηγή)"
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"ΣÏ
νεδÏία: Î XMLÎÏÎ¼Î²Î¿Ï ÏοÏ
ÏεÏιγÏάÏει AudioΠεÏιοÏή αναÏÎÏει άγνÏÏÏο id ÏÎ·Î³Î®Ï ="
"%1"
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2118,175 +2705,216 @@ msgstr ""
"ΣÏ
νεδÏία: Î XMLNode ÏοÏ
ÏεÏιγÏάÏει AudioRegion αναÏÎÏει μη-ηÏηÏική Ïηγή με "
"id =%1"
-#: session_state.cc:1765
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1799
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1807
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1813
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1872
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr "ΣÏ
νεδÏία: δεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ Î Î·Î³Î® αÏÏ XML ÏεÏιγÏαÏή."
-#: session_state.cc:1880
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1979
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1992
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr "Το ÏÏοÏÏÎδιο \"%1\" ήδη Ï
ÏάÏÏει - νÎα ÎκδοÏη δεν δημιοÏ
Ïγήθηκε"
-#: session_state.cc:1998
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2008
+#: session_state.cc:2259
msgid "template not saved"
msgstr ""
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
msgstr ""
-#: session_state.cc:2834
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2873
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2891
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "δεν μÏοÏÏ Î½Î± αÏαλοίÏÏ Ïο peakfile %1 για %2 (%3)"
-#: session_state.cc:3204
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3213
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3216
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3220
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3245
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3251
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3293
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3304
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3315
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3323
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3559
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3564
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr "ΣÏ
νεδÏία: δεν μÏÏÏεÏα να ÏοÏÏÏÏÏ diskstream μÎÏÏ ÎºÎ±ÏαÏÏάÏεÏÏ XML"
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr "Îεν γίνεÏαι loop - κανÎνα διάÏÏημα loop δεν ÏÏοÏδιοÏίÏÏηκε"
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
msgstr ""
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr ""
@@ -2303,8 +2931,8 @@ msgid "CAF"
msgstr ""
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
#: sndfile_helpers.cc:38
msgid "FLAC"
@@ -2347,23 +2975,23 @@ msgid ".raw"
msgstr ""
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
msgstr ""
#: sndfile_helpers.cc:83
@@ -2374,11 +3002,15 @@ msgstr "Little-endian (Intel)"
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: δεν μÏοÏÏ Î½Î± Î±Î½Î¿Î¯Î¾Ï Ïο αÏÏείο \"%1\" για %2 (%3)"
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
@@ -2386,7 +3018,11 @@ msgstr ""
"SndFileSource: Ïο αÏÏείο ÏεÏιÎÏει μÏνο %1 κανάλια; %2 δεν ÎÏει αξία Ïαν "
"κανάλι number"
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2394,72 +3030,84 @@ msgstr ""
"Îεν εÏÎθηÏαν broadcast info για Ïο audio file %1 (%2); αÏÏÏÏιÏη broadcast "
"info για αÏ
ÏÏ Ïο αÏÏείο"
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: δεν μÏοÏοÏÏα να αναζηÏήÏÏ ÏÏο frame %1 μÎÏα ÏÏο %2 (%3)"
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: %1 %2"
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2475,7 +3123,7 @@ msgstr ""
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2483,105 +3131,135 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
TempoSection XML δεν ÎÏει ιδιÏÏηÏα \"ÎναÏξη\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
TempoSection XML ÎÏει αθÎμιÏη αξία \"ÎναÏξη\""
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
-#: tempo.cc:95
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
TempoSection XML δεν ÎÏει \"κÏÏÏÏν-ανά-λεÏÏÏ\" ιδιÏÏηÏα"
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
TempoSection XML ÎÏει αθÎμιÏη \"κÏÏÏÏν_ανά_λεÏÏÏ\" αξία"
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
TempoSection XML δεν ÎÏει \"κινηÏή\" ιδιÏÏηÏα"
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
msgstr ""
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
MeterSection XML δεν ÎÏει \"ÎναÏξη\" ιδιÏÏηÏα"
-
-#: tempo.cc:210
+#: tempo.cc:471
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
MeterSection XML ÎÏει αθÎμιÏη \"ÎναÏξη\" αξία"
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
MeterSection XML δεν ÎÏει \"ÏÏÏοÏ-νÏÏαÏ\" ιδιÏÏηÏα"
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
MeterSection XML ÎÏει αθÎμιÏη \"ÏÏÏοÏ-νÏÏαÏ\" αξία"
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
MeterSection XML δεν ÎÏει \"κινηÏή\" ιδιÏÏηÏα"
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
-#: tempo.cc:650
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
msgid "programming error: no tempo section in tempo map!"
msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: κανÎÎ½Î±Ï ÏομÎÎ±Ï ÏÏ
Î¸Î¼Î¿Ï ÏÏο ÏάÏÏη ÏÏ
θμÏν!"
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
-msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: αÏείÏιÏÏÎ¿Ï ÏÏÏÎ¿Ï MetricSection"
-
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1185
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
"ΧάÏÏÎ·Ï ÏÏ
θμÏν: δεν μÏÏÏεÏα να θÎÏÏ Î½Îα καÏάÏÏαÏη, εÏιÏÏÏοÏή ÏÏοηγοÏμενηÏ."
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr ""
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr ""
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "ÏÏάλμα ÏÏογÏαμμαÏιÏμοÏ: αÏείÏιÏÏÎ¿Ï ÏÏÏÎ¿Ï MetricSection"
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr ""
@@ -2606,6 +3284,14 @@ msgid ""
"Are you sure you want to do this?"
msgstr ""
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr ""
@@ -2627,62 +3313,88 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
msgid "Splice"
msgstr ""
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
msgid "Slide"
msgstr ""
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr ""
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
msgid "MTC"
msgstr ""
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
msgid "JACK"
msgstr ""
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
msgstr ""
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
msgstr ""
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr ""
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "δÏÏμοÏÏη γÏαμμή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏαξινομήÏεÏÏ ÏÏο αÏÏείο καÏαÏÏάÏεÏÏ ! [%1] ... "
+#~ "αγνοήθηκε."
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64 bit WAV)"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
TempoSection XML δεν ÎÏει ιδιÏÏηÏα \"ÎναÏξη\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
TempoSection XML ÎÏει αθÎμιÏη αξία \"ÎναÏξη\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "ÎÏÎ¼Î²Î¿Ï ÏοÏ
MeterSection XML δεν ÎÏει \"ÎναÏξη\" ιδιÏÏηÏα"
+
#~ msgid "Cannot create transport request signal pipe (%1)"
#~ msgstr "Îεν μÏοÏÏ Î½Î± δημιοÏ
ÏγήÏÏ transport request signal pipe (%1)"
diff --git a/libs/ardour/po/en_GB.mo b/libs/ardour/po/en_GB.mo
new file mode 100644
index 0000000..d33e563
Binary files /dev/null and b/libs/ardour/po/en_GB.mo differ
diff --git a/libs/ardour/po/en_GB.po b/libs/ardour/po/en_GB.po
index 7d46f4e..dd5b2d7 100644
--- a/libs/ardour/po/en_GB.po
+++ b/libs/ardour/po/en_GB.po
@@ -5,100 +5,253 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-02 18:25+0100\n"
-"PO-Revision-Date: 2015-03-21 14:12+0100\n"
+"POT-Creation-Date: 2016-07-21 12:29+0100\n"
+"PO-Revision-Date: 2016-07-24 16:09+0100\n"
"Last-Translator: Colin Fletcher <colin.m.fletcher at googlemail.com>\n"
-"Language-Team: <colin.m.fletcher at googlemail.com>\n"
-"Language: English (UK)\n"
+"Language-Team: colin.m.fletcher at googlemail.com\n"
+"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: English\n"
-"X-Poedit-Country: UNITED KINGDOM\n"
-"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.8\n"
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr ""
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
msgstr ""
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr "Failed to initialise audio backend"
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr "Failed to deinitialise audio backend"
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr "Failed to reinitialise audio backend"
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6774 session.cc:6794
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
msgstr ""
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
msgstr ""
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 new capture file not initialised correctly"
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr ""
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
msgstr ""
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -128,10 +281,10 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2848 session.cc:2881
-#: session.cc:4127 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046 midi_playlist_source.cc:147
+#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:393
+#: midi_source.cc:420 plugin_insert.cc:1259 rb_effect.cc:327 session.cc:5316
+#: session.cc:5343 session.cc:5463 session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr ""
@@ -155,26 +308,30 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr ""
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr ""
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr ""
@@ -195,19 +352,19 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:709
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:715
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:792
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -215,7 +372,8 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
@@ -226,12 +384,13 @@ msgstr ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialogue will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr ""
@@ -239,162 +398,190 @@ msgstr ""
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr ""
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr ""
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr ""
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr ""
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr "control protocol name \"%1\" could not be initialised"
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
@@ -411,7 +598,7 @@ msgstr ""
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1998 session.cc:2001
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr ""
@@ -423,11 +610,11 @@ msgstr ""
msgid "main outs"
msgstr ""
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr ""
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
@@ -439,23 +626,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr ""
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr ""
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr ""
@@ -491,23 +678,27 @@ msgstr ""
msgid "Lossless compression"
msgstr ""
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr ""
-#: export_format_specification.cc:549
-msgid "normalize"
-msgstr "normalise"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr "normalise loudness"
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr "normalise peak"
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
msgid "trim"
msgstr ""
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr ""
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr ""
@@ -523,24 +714,20 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5424 session.cc:5440
-msgid "None"
-msgstr ""
-
#: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
msgstr ""
#: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
msgstr ""
#: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
msgstr ""
#: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
msgstr ""
#: export_formats.cc:167
@@ -552,7 +739,7 @@ msgid "double"
msgstr ""
#: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
msgstr ""
#: export_formats.cc:173
@@ -563,94 +750,90 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:360
+#: export_handler.cc:430
msgid "File %1 uploaded to %2"
msgstr ""
-#: export_handler.cc:366
+#: export_handler.cc:436
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:562 export_handler.cc:565
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:855 export_handler.cc:913
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr ""
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr ""
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr ""
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr ""
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr ""
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr ""
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr ""
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr ""
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr ""
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr ""
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr ""
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr ""
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
msgstr ""
-#: file_source.cc:201 session_state.cc:2858
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -659,25 +842,25 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr ""
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr ""
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
@@ -691,34 +874,38 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
msgstr ""
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
@@ -726,50 +913,79 @@ msgstr ""
msgid "filter: error creating name for new file based on %1"
msgstr ""
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr ""
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:262
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:236
+#: globals.cc:264
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:240
+#: globals.cc:268 globals.cc:285
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:244
+#: globals.cc:272
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:415
+#: globals.cc:287
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:470
msgid "Loading configuration"
msgstr ""
+#: globals.cc:550 route.cc:182 route.cc:4146 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:551 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:552
+msgid "Control"
+msgstr ""
+
+#: globals.cc:553
+msgid "Click"
+msgstr ""
+
+#: globals.cc:554
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr ""
@@ -795,7 +1011,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
msgstr ""
#: import.cc:475
@@ -822,110 +1038,113 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr ""
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr ""
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr ""
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1537 session.cc:736 session.cc:770
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr ""
-#: io.cc:1539 session.cc:749 session.cc:784
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr ""
-#: io.cc:1539 session.cc:751 session.cc:786
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr ""
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -942,81 +1161,81 @@ msgstr ""
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr ""
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr ""
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr ""
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr ""
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr ""
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr ""
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr ""
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr ""
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr ""
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:1047 session.cc:1296 session.cc:4922 session_state.cc:1054
+#: location.cc:1059 session.cc:1667 session.cc:6307 session_state.cc:1205
msgid "session"
msgstr ""
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr ""
@@ -1058,48 +1277,104 @@ msgid ""
"You may rename the imported location:"
msgstr ""
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr ""
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:888
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:898
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:902
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:930
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:940
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:946
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1176
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1119,31 +1394,47 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
msgstr ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1151,57 +1442,57 @@ msgstr ""
msgid "MIDI stretch created non-MIDI source"
msgstr ""
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr ""
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr ""
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr ""
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr ""
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr ""
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr ""
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr ""
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr ""
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1257,7 +1548,7 @@ msgstr ""
msgid "fixed time region copy"
msgstr ""
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
@@ -1291,19 +1582,67 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr ""
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr ""
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr ""
@@ -1315,125 +1654,245 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr ""
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr ""
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr ""
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr ""
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
msgstr ""
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr ""
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr ""
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr ""
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr ""
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
msgstr ""
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:450
+#: port.cc:504
msgid "could not reregister %1"
msgstr ""
@@ -1441,150 +1900,215 @@ msgstr ""
msgid "insert %1"
msgstr ""
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr ""
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
msgstr ""
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
msgstr ""
-#: port_manager.cc:292
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr ""
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr ""
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr ""
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr ""
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
msgstr ""
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr ""
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr ""
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr ""
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr ""
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr ""
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr ""
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr ""
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr ""
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr ""
-#: route.cc:1218 route.cc:2701
+#: route.cc:858 route.cc:2780
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1240
+#: route.cc:880
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:2126 route.cc:2355
+#: route.cc:2334 route.cc:2491
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2186
+#: route.cc:2387
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3258
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4393
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
msgstr ""
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5131
+msgid "Rels"
msgstr ""
-#: route_group.cc:459
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr ""
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
@@ -1593,205 +2117,245 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr ""
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr ""
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr ""
-#: session.cc:363
+#: session.cc:484
msgid "Session loading complete"
msgstr ""
-#: session.cc:435
+#: session.cc:575
msgid "Set up LTC"
msgstr ""
-#: session.cc:437
+#: session.cc:577
msgid "Set up Click"
msgstr ""
-#: session.cc:439
+#: session.cc:579
msgid "Set up standard connections"
msgstr ""
-#: session.cc:667
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr ""
-#: session.cc:730
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr ""
-#: session.cc:732
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:747
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:764
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr ""
-#: session.cc:766
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:781
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:855
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:924
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:969
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:989
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:1020
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1088
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1273
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1300
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1332
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1500
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1754
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:2050
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:2056
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2242 session.cc:2245
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
msgstr ""
-#: session.cc:2269 session.cc:2277 session.cc:2355 session.cc:2363
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2300
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2333 session.cc:2336
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr ""
-#: session.cc:2386
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2446 session.cc:2456
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2478
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2504
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2534
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3674
+#: session.cc:4786
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3804 session.cc:3877
+#: session.cc:4916 session.cc:4989
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:4319
+#: session.cc:5665
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4331
+#: session.cc:5677
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4343
+#: session.cc:5689
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4355
+#: session.cc:5701
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4480
+#: session.cc:5827
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4489
+#: session.cc:5836
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4531
+#: session.cc:5878
msgid "cannot create new file \"%1\" for %2"
msgstr ""
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr ""
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr ""
@@ -1830,23 +2394,36 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
msgstr ""
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr ""
-#: session_export.cc:182
+#: session_export.cc:221
msgid "Export ended unexpectedly: %1"
msgstr ""
@@ -1856,412 +2433,465 @@ msgid ""
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr ""
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr ""
-#: session_state.cc:332
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:424
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:431
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:452
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:459
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:466
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:473
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:487
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:521
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:527
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:546
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
msgstr ""
-#: session_state.cc:607
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:631
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:659
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:686
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:737
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:739 session_state.cc:750
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:747
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:815
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:827
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:836
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1148
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1202
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1207
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1218
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1225
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1232
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1245
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1252
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1272
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1284
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1292
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1304
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1313
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1320
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1328
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1374
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1378
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1383
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1387
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1486
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1546
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1550
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1586
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1614
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1626
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1688
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1696 session_state.cc:1717 session_state.cc:1737
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1702 session_state.cc:1723 session_state.cc:1743
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1766
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1800
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1808
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1814
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1873
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1881
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1963
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1980
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1993
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1999
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2009
+#: session_state.cc:2259
msgid "template not saved"
msgstr ""
-#: session_state.cc:2019
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2262
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
msgstr ""
-#: session_state.cc:2835
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2874
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2892
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3205
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3214
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3217
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3221
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3246
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3252
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3294
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3305
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3316
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3324
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3560
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3565
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr ""
-#: session_state.cc:3689 session_state.cc:3717 session_state.cc:3730
-#: session_state.cc:3745
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr ""
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
msgstr ""
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr ""
@@ -2278,7 +2908,7 @@ msgid "CAF"
msgstr ""
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
msgstr ""
#: sndfile_helpers.cc:38
@@ -2322,23 +2952,23 @@ msgid ".raw"
msgstr ""
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
msgstr ""
#: sndfile_helpers.cc:83
@@ -2349,88 +2979,108 @@ msgstr ""
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
msgstr ""
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2446,7 +3096,7 @@ msgstr ""
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2454,104 +3104,134 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
msgstr ""
-#: tempo.cc:95
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
msgstr ""
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
msgstr ""
-#: tempo.cc:220
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:402
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
-#: tempo.cc:682
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
-#: tempo.cc:712 tempo.cc:730 tempo.cc:748 tempo.cc:764
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
msgstr ""
-#: tempo.cc:882 tempo.cc:1863
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: tempo.cc:1178
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1221
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1678 tempo.cc:1692
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: tempo.cc:1713
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr ""
-#: tempo.cc:1718
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr ""
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr ""
@@ -2576,6 +3256,14 @@ msgid ""
"Are you sure you want to do this?"
msgstr ""
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr ""
@@ -2597,58 +3285,95 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
msgid "Splice"
msgstr ""
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
msgid "Slide"
msgstr ""
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr ""
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
msgid "MTC"
msgstr ""
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
msgid "JACK"
msgstr ""
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
msgstr ""
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
msgstr ""
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr ""
+
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid ""
+#~ "You have requested an operation that requires audio analysis.\n"
+#~ "\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
+#~ "\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
+#~ "\n"
+#~ "This dialog will not display again. But you may notice a slight delay in "
+#~ "this and future transient-detection operations.\n"
+#~ msgstr ""
+#~ "You have requested an operation that requires audio analysis.\n"
+#~ "\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
+#~ "\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
+#~ "\n"
+#~ "This dialogue will not display again. But you may notice a slight delay "
+#~ "in this and future transient-detection operations.\n"
+
+#~ msgid "normalize"
+#~ msgstr "normalise"
diff --git a/libs/ardour/po/es.mo b/libs/ardour/po/es.mo
new file mode 100644
index 0000000..7ce0bcd
Binary files /dev/null and b/libs/ardour/po/es.mo differ
diff --git a/libs/ardour/po/es.po b/libs/ardour/po/es.po
index b43f81f..92d15e5 100644
--- a/libs/ardour/po/es.po
+++ b/libs/ardour/po/es.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2015-03-15 11:50+0100\n"
"PO-Revision-Date: 2015-03-15 \n"
"Last-Translator: Pablo Fernández <pablo.fbus at gmail.com>\n"
"Language-Team: \n"
@@ -17,14 +17,6 @@ msgstr ""
msgid "Fader"
msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
-msgid "Transient Analysis failed for %1."
-msgstr ""
-
-#: analyser.cc:117
-msgid "Audio File Source"
-msgstr ""
-
#: audio_diskstream.cc:249
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
@@ -72,7 +64,7 @@ msgstr "error de programador: %1"
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: canal %1 fuera de rango"
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:1935 midi_diskstream.cc:1297
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 archivo de captura nuevo no inicializado correctamente"
@@ -131,10 +123,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "error de programación: %1"
@@ -202,19 +195,19 @@ msgstr "no se puede cargar el plugin VAMP \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "el plugin VAMP \"%1\" no pudo ser cargado"
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -222,106 +215,103 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
-msgid "Audio Region"
-msgstr ""
-
#: audiosource.cc:228
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
-#: audiosource.cc:361
+#: audiosource.cc:367
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:742
+#: audiosource.cc:748
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr "No hay salidas disponibles para Audición - se requiere conexión manual"
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr ""
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr ""
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr ""
@@ -335,66 +325,66 @@ msgstr ""
"Lista de automatización: No se pudieron cargar las coordenadas de XML, se "
"han ignorado todos los puntos"
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"Lista de automatización: No hay coordenada 'X' almacenada para el punto de "
"control (punto ignorado)"
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"Lista de automatización: No hay coordenada 'Y' almacenada para el punto de "
"control (punto ignorado)"
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr "control protocol name \"%1\" has no descriptor"
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr "El protocolo de control de nombre \"%1\" no se pudo inicializar"
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr "buscando protocolos de control en %1\n"
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr "Protocolo de control %1 no usable."
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
@@ -414,7 +404,7 @@ msgstr ""
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr ""
@@ -426,11 +416,11 @@ msgstr "desconocido"
msgid "main outs"
msgstr ""
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr ""
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
"La localización \"%1\" no es válida para bucle de pista (inicio >= fin)"
@@ -443,23 +433,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr ""
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr ""
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr ""
@@ -527,7 +517,7 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
+#: export_formats.cc:52 session.cc:5420 session.cc:5436
msgid "None"
msgstr ""
@@ -584,7 +574,7 @@ msgstr ""
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:717 export_handler.cc:775
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -754,23 +744,23 @@ msgstr ""
msgid "unknown file type for session %1"
msgstr "tipo de archivo desconocido para la sesión %1"
-#: globals.cc:234
+#: globals.cc:232
msgid "Could not set system open files limit to \"unlimited\""
msgstr "No se pudo establecer el lÃmite de archivos abiertos a \"unlimited\""
-#: globals.cc:236
+#: globals.cc:234
msgid "Could not set system open files limit to %1"
msgstr "No se pudo establecer el lÃmite de archivos abiertos a \"unlimited\""
-#: globals.cc:240
+#: globals.cc:238
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:244
+#: globals.cc:242
msgid "Could not get system open files limit (%1)"
msgstr "No se pudo obtener el lÃmite de archivos abiertos del sistema (%1) "
-#: globals.cc:415
+#: globals.cc:396
msgid "Loading configuration"
msgstr "Cargando configuración"
@@ -1016,7 +1006,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1047 session.cc:1293 session.cc:4918 session_state.cc:1053
msgid "session"
msgstr "sesión"
@@ -1089,23 +1079,23 @@ msgstr ""
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:777
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:914
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:948
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1037
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1078
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1137,19 +1127,19 @@ msgstr ""
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:131
+#: midi_source.cc:130
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:140
+#: midi_source.cc:139
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:146
+#: midi_source.cc:145
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1327,7 +1317,7 @@ msgid ""
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
@@ -1767,39 +1757,39 @@ msgstr "Sesión: No se pudo crear la nueva ruta desde plantilla"
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3671
+#: session.cc:3670
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:3800 session.cc:3873
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:4316
+#: session.cc:4315
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4328
+#: session.cc:4327
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4340
+#: session.cc:4339
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4352
+#: session.cc:4351
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4477
+#: session.cc:4476
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4486
+#: session.cc:4485
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
+#: session.cc:4527
msgid "cannot create new file \"%1\" for %2"
msgstr ""
@@ -2257,28 +2247,28 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:344
+#: smf_source.cc:340
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:353
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:359
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:405
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:449
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:514
msgid "cannot open MIDI file %1 for write"
msgstr ""
@@ -2471,101 +2461,101 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
-#: tempo.cc:80
+#: tempo.cc:79
msgid "TempoSection XML node has no \"start\" property"
msgstr ""
-#: tempo.cc:88
+#: tempo.cc:87
msgid "TempoSection XML node has an illegal \"start\" value"
msgstr ""
-#: tempo.cc:95
+#: tempo.cc:94
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: tempo.cc:100
+#: tempo.cc:99
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: tempo.cc:109
+#: tempo.cc:108
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:115
+#: tempo.cc:114
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:125
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"bar-offset\" value"
msgstr ""
-#: tempo.cc:202
+#: tempo.cc:201
msgid "MeterSection XML node has no \"start\" property"
msgstr ""
-#: tempo.cc:210
+#: tempo.cc:209
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: tempo.cc:220
+#: tempo.cc:219
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
+#: tempo.cc:225
msgid ""
"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
"\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:230
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: tempo.cc:236
+#: tempo.cc:235
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:241
+#: tempo.cc:240
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:388
+#: tempo.cc:387
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
-#: tempo.cc:650
+#: tempo.cc:649
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:679 tempo.cc:695 tempo.cc:711 tempo.cc:727
msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: tempo.cc:846 tempo.cc:1827
+#: tempo.cc:845 tempo.cc:1826
msgid "programming error: unhandled MetricSection type"
msgstr ""
-#: tempo.cc:1142
+#: tempo.cc:1141
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1185
+#: tempo.cc:1184
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:1641 tempo.cc:1655
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: tempo.cc:1677
+#: tempo.cc:1676
msgid "Multiple meter definitions found at %1"
msgstr ""
-#: tempo.cc:1682
+#: tempo.cc:1681
msgid "Multiple tempo definitions found at %1"
msgstr ""
diff --git a/libs/ardour/po/fr.mo b/libs/ardour/po/fr.mo
new file mode 100644
index 0000000..95cbbe1
Binary files /dev/null and b/libs/ardour/po/fr.mo differ
diff --git a/libs/ardour/po/fr.po b/libs/ardour/po/fr.po
index 507c2c7..09a8a5d 100644
--- a/libs/ardour/po/fr.po
+++ b/libs/ardour/po/fr.po
@@ -1,106 +1,260 @@
# Copyright (C) YEAR "Paul Davis"
# This file is distributed under the same license as the PACKAGE package.
# Fred Rech <f.rech at yahoo.fr>, 2014.
+# Raphaël Doursenaud <rdoursenaud at free.fr>, 2015
+# Julien Rivaud <frnchfrgg at free.fr>, 2016
#
msgid ""
msgstr ""
-"Project-Id-Version: libardour 3\n"
+"Project-Id-Version: libardour 5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2015-03-28 20:54+0100\n"
-"Last-Translator: Raphaël Doursenaud <rdoursenaud at free.fr>\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-07-29 21:22+0200\n"
+"Last-Translator: Julien Rivaud <frnchfrgg at free.fr>\n"
"Language-Team: \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 1.7.4\n"
+"X-Generator: Poedit 1.8.8\n"
"X-Poedit-SourceCharset: UTF-8\n"
-"X-Poedit-Basepath: ../\n"
+"X-Poedit-Basepath: ..\n"
-#: amp.cc:57 automatable.cc:165
-#, fuzzy
-msgid "Fader"
-msgstr "Atténuateur"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr "%.2fâ¯dB"
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
-msgstr ""
+msgstr "La recherche des transitoires a échoué pour %1."
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
-msgstr ""
+msgstr "le fichier source audio"
+
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr "%1 (%2..%3)"
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr "Aucune erreur"
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr "L'initialisation du moteur audio a échoué"
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr "L'arrêt du moteur audio a échoué"
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr "La réinitialisation du moteur audio a échoué"
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr "L'ouverture du périphérique audio a échoué"
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr "La fermeture du périphérique audio a échoué"
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr "Le périphérique audio n'est pas valide"
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr "Le périphérique audio n'est pas disponible"
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr "Le périphérique audio n'est pas connecté"
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr "La réservation du périphérique audio a échoué"
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr "Erreur d'entrée/sortie du périphérique audio"
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr "L'ouverture du périphérique MIDI a échoué"
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr "La fermeture du périphérique MIDI a échoué."
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr "Le périphérique MIDI n'est pas disponible"
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr "Le périphérique MIDI n'est pas connecté"
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr "Erreur d'entrée/sortie du périphérique MIDI"
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr "Le format d'échantillon n'est pas supporté"
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr "Le taux d'échantillonnage n'est pas supporté"
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr "La latence d'entrée demandée n'est pas supportée"
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr "La latence de sortie demandée n'est pas supportée"
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr "Cette longueur de période n'est pas supportée"
-#: audio_diskstream.cc:249
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr "Ce nombre de périodes n'est pas supporté"
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr "Cette configuration de périphérique(s) n'est pas supportée"
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr "Ce nombre de canaux n'est pas supporté"
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr "Ce nombre de canaux n'est pas supporté en entrée"
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr "Ce nombre de canaux n'est pas supporté en sortie"
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr "Impossible d'obtenir les permissions temps-réel"
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr "Le réglage des priorités de la tâche « périphérique audio » a échoué"
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr "Le réglage des priorités de la tâche « périphérique MIDI » a échoué"
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr "Le démarrage de la tâche de traitement a échoué"
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr "Le démarrage de la tâche de débrayage a échoué"
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr "Impossible de réserver les ports audio/midi"
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr "Impossible de reconnecter les ports audio/midi"
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr "Erreur: plus de mémoire"
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr "Impossible de se reconnecter au moteur audio/MIDI"
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "Aucune"
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr "Par défaut"
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-"AudioDiskstream : la liste de lecture \"%1\" n'est pas une liste de lecture "
+"AudioDiskstreamâ¯: la liste de lecture \"%1\" n'est pas une liste de lecture "
"audio"
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
-msgstr "AudioDiskstream %1 : aucune liste de lecture existante à copier !"
+msgstr "AudioDiskstream %1â¯: aucune liste de lecture existante à copier !"
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-"AudioDiskstream %1 : en rechargeant, lecture impossible de %2 depuis la "
+"AudioDiskstream %1â¯: en rechargeant, lecture impossible de %2 depuis la "
"liste de lecture à l'image %3"
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-"AudioDiskstream %1 : lecture impossible de %2 depuis la liste de lecture à "
+"AudioDiskstream %1â¯: lecture impossible de %2 depuis la liste de lecture à "
"l'image %3"
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
-msgstr "AudioDiskstream %1 : écriture sur le disque impossible"
+msgstr "AudioDiskstream %1â¯: écriture sur le disque impossible"
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-"AudioDiskstream \"%1\" : transfert de la capture sur le disque impossible !"
+"AudioDiskstream \"%1\"â¯: transfert de la capture sur le disque impossible !"
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
-msgstr "%1 : création de région pour le fichier audio complet impossible"
+msgstr "%1â¯: création de région pour le fichier audio complet impossible"
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr "AudioDiskstream: création de région pour l'audio capturé impossible !"
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
-msgstr ""
+msgstr "erreur de programmation : %1"
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
-msgstr "AudioDiskstream : canal %1 hors intervalle"
+msgstr "AudioDiskstreamâ¯: canal %1 hors intervalle"
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
-msgstr "%1 : %2 nouveau fichier de capture mal initialisé"
+msgstr "%1â¯: %2 nouveau fichier de capture mal initialisé"
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
-msgstr "%1 : reprise de la capture suspendue %2 impossible"
+msgstr "%1â¯: reprise de la capture suspendue %2 impossible"
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
-msgstr "%1 : nombre de sources suspendues listées incorrect - tout ignorer"
+msgstr "%1â¯: nombre de sources suspendues listées incorrect - tout ignorer"
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
-msgstr "%1 : création de région unique pour les captures suspendues impossible"
+msgstr "%1â¯: création de région unique pour les captures suspendues impossible"
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr "Ouverture de %1 impossible. Librairie Audio non sauvegardée"
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -108,7 +262,7 @@ msgstr ""
"Le fondu implique un début de région absent de la liste de lecture \"%1\" - "
"fondu abandonné"
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -134,17 +288,16 @@ msgstr "Ce nom de liste de lecture existe déjà , merci de la renommer."
#: audio_playlist_importer.cc:183
msgid "badly-formed XML in imported playlist"
-msgstr "Liste de lecture importée : syntaxe XML incorrecte"
+msgstr "Liste de lecture importéeâ¯: syntaxe XML incorrecte"
#: audio_playlist_importer.cc:267
msgid "Audio Playlists (unused)"
msgstr "Listes de lecture Audio (inutilisées)"
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
-#, fuzzy
+#: audio_playlist_source.cc:171 audiosource.cc:1046 midi_playlist_source.cc:147
+#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:403
+#: plugin_insert.cc:1259 rb_effect.cc:327 session.cc:5314 session.cc:5341
+#: session.cc:5461 session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "erreur de programmation : %1"
@@ -154,7 +307,7 @@ msgstr "Régions Audio"
#: audio_region_importer.cc:145
msgid "Length: "
-msgstr "Durée : "
+msgstr "Duréeâ¯: "
#: audio_region_importer.cc:147
msgid ""
@@ -162,7 +315,7 @@ msgid ""
"Position: "
msgstr ""
"\n"
-"Position : "
+"Positionâ¯: "
#: audio_region_importer.cc:149
msgid ""
@@ -170,35 +323,41 @@ msgid ""
"Channels: "
msgstr ""
"\n"
-"Canaux : "
+"Canauxâ¯: "
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Groupe inconnu \"%1\" listé comme entrée de %2"
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr "Entrée 1"
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr "Pas de groupe d'entrée disponible en remplacement"
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Groupe %1 indisponible - \"Entrée 1\" utilisée à la place"
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr "Liste de canal d'entrée invalide dans le noeud XML (%1)"
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+"%1Â : cette session utilise des pistes destructrices, qui ne sont pas "
+"supportées"
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr "Pistes Audio"
#: audio_track_importer.cc:253 audio_track_importer.cc:259
msgid "badly-formed XML in imported track"
-msgstr "Piste importée : syntaxe XML incorrecte"
+msgstr "Piste importéeâ¯: syntaxe XML incorrecte"
#: audio_track_importer.cc:287
msgid "Error Importing Audio track %1"
@@ -212,19 +371,19 @@ msgstr "Impossible de charger le Plugin VAMP \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "Le Plugin VAMP \"%1\" ne pouvait pas être chargé"
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "Moteur Audioâ¯: module \"%1\" inchargeable (%2)"
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
-msgstr ""
+msgstr "Impossible de créer le moteur pour %1 : %2"
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -232,187 +391,216 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
-msgstr ""
+msgstr "Région audio"
#: audiosource.cc:228
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "Impossible de renommer le fichier de pic-audio pour %1 de %2 Ã %3 (%4)"
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr "Retour à Reasonable Synth pour l'audition MIDI"
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr "Pas de synthé trouvé pour l'audition MIDI."
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr "Pas de sortie disponible pour l'audition - correction manuelle requise"
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
"Configuration du traitement de flux d'audition pour %1 canaux impossible"
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr "Echec du chargement de synthé pour l'audition MIDI"
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr "L'audition de régions autres qu'Audio ou MIDI est impossible."
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr "Le noeud d'automation n'a aucune propriété de chemin"
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr "Impossible d'ouvrir %2 pour charger les données d'automation (%3)"
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr "Impossible de charger les données d'automation de %2"
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+#, fuzzy
+msgid "Fader"
+msgstr "Atténuateur"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
#, fuzzy
msgid "Mute"
msgstr "Muet"
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
-"Liste d'automation : chargement des coordonnées XML impossible, tous les "
+"Liste d'automationâ¯: chargement des coordonnées XML impossible, tous les "
"points sont ignorés"
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
-"Liste d'automation : pas de coordonnée x pour le point de controle (point "
+"Liste d'automationâ¯: pas de coordonnée x pour le point de controle (point "
"ignoré)"
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
-"Liste d'automation : pas de coordonnée y pour le point de controle (point "
+"Liste d'automationâ¯: pas de coordonnée y pour le point de controle (point "
"ignoré)"
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-"Liste d'automation : le noeud XML %1 entré n'est pas de liste d'automation - "
+"Liste d'automationâ¯: le noeud XML %1 entré n'est pas de liste d'automation - "
"ignoré"
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
-#, fuzzy
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "ControlProtocolManagerâ¯: impossible de charger le module «â¯%1â¯Â» (%2)"
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
@@ -429,8 +617,7 @@ msgstr ""
msgid "audio"
msgstr "Audio"
-#: data_type.cc:28 session.cc:1995 session.cc:1998
-#, fuzzy
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr "MIDI"
@@ -442,11 +629,11 @@ msgstr "Inconnu"
msgid "main outs"
msgstr "Sorties principales"
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr "Ecoute"
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "Emplacement \"%1\" invalide pour boucle (début >= fin)"
@@ -456,30 +643,29 @@ msgstr "Pas de port possible pour l'export du canal \"%1\", canal omis"
#: export_failed.cc:32
msgid "Export failed: %1"
-msgstr "Echec d'export : %1"
+msgstr "Echec d'exportâ¯: %1"
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr "Pas de répertoire d'export pour cette session (%1) - ignoré"
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr "Pas d'heure"
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr "Format d'heure invalide"
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr "Pas de date"
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr "Format de date invalide"
#: export_format_manager.cc:57
-#, fuzzy
msgid "CD"
msgstr "CD"
@@ -512,23 +698,27 @@ msgstr "Compression avec perte"
msgid "Lossless compression"
msgstr "Compression sans perte"
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr "Débit de la session"
-#: export_format_specification.cc:549
-msgid "normalize"
-msgstr "Normaliser"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
msgid "trim"
msgstr "Enlever le silence au début et à la fin"
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr "Enlever le silence au début"
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr "Enlever le silence à la fin"
@@ -544,25 +734,21 @@ msgstr "Triangulaire"
msgid "Rectangular"
msgstr "Rectangulaire"
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr "Aucune"
-
#: export_formats.cc:159
-msgid "8bit"
-msgstr "8 bits"
+msgid "8-bit"
+msgstr ""
#: export_formats.cc:161
-msgid "16bit"
-msgstr "16 bits"
+msgid "16-bit"
+msgstr ""
#: export_formats.cc:163
-msgid "24bit"
-msgstr "24 bits"
+msgid "24-bit"
+msgstr ""
#: export_formats.cc:165
-msgid "32bit"
-msgstr "32 bits"
+msgid "32-bit"
+msgstr ""
#: export_formats.cc:167
msgid "float"
@@ -573,8 +759,8 @@ msgid "double"
msgstr "Double"
#: export_formats.cc:171
-msgid "8bit unsigned"
-msgstr "8 bits non-signé"
+msgid "8-bit unsigned"
+msgstr ""
#: export_formats.cc:173
msgid "Vorbis sample format"
@@ -584,92 +770,85 @@ msgstr "Format d'échantillonnage Vorbis"
msgid "No sample format"
msgstr "Pas de format d'échantillonnage"
-#: export_handler.cc:360
-#, fuzzy
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
-msgstr "Import du fichier : %1 sur %2"
+msgstr "Fichier %1 téléversé vers %2"
-#: export_handler.cc:366
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-"Editeur : impossible d'ouvrir \"%1\" comme fichier d'export pour les repères "
-"de CD"
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
-msgstr "Erreur lors de l'écriture du fichier TOC/CUE : %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
+msgstr "Erreur lors de l'écriture du fichier TOC/CUEâ¯: %1"
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr "Conversion de texte %1 en Latin-1 impossible"
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr "Recherche de formats d'export dans %1"
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
-msgstr "Création du dossier de formats d'export %1 impossible : %2"
+msgstr "Création du dossier de formats d'export %1 impossibleâ¯: %2"
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
-msgstr "Impossible d'enlever le préset d'export %1 : %2"
+msgstr "Impossible d'enlever le préset d'export %1â¯: %2"
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr "Sélection"
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
-msgstr "Impossible de renommer le format d'export %1 en %2 : %3"
+msgstr "Impossible de renommer le format d'export %1 en %2â¯: %3"
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
-msgstr "Impossible d'enlever le profil d'export %1 : %2"
+msgstr "Impossible d'enlever le profil d'export %1â¯: %2"
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr "Format vide"
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr "Aucun intervalle sélectionné !"
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr "Aucun canal sélectionné !"
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr "Certains canaux sont vides !"
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr "Aucun format sélectionné !"
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr "Tous les canaux sont vides !"
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
"Au moins un des formats sélectionnés est incompatible avec ce système !"
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
@@ -677,7 +856,7 @@ msgstr ""
"%1 supporte seulement %2 canaux, mais votre configuration de canal spécifie "
"%3 canaux"
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -686,25 +865,25 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr "Impossible de renommer la source du fichier de %1 en %2 (%3)"
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr ""
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr ""
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
@@ -721,12 +900,12 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr "Renommage du fichier %1 en %2 impossible (%3)"
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr ""
"Création du dossier de configuration %1 impossible - démarrage impossible"
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
@@ -734,75 +913,109 @@ msgstr ""
"Le dossier de configuration %1 existe déjà , mais n'est pas un dossier - "
"démarrage impossible"
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr "ARDOUR_DLL_PATH non fixé dans l'environnement - sortie\n"
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
#: filter.cc:67
msgid "filter: error creating name for new file based on %1"
-msgstr "Filtre : erreur de création du nom pour le nouveau fichier basé sur %1"
+msgstr "Filtreâ¯: erreur de création du nom pour le nouveau fichier basé sur %1"
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
-msgstr "Filtre : erreur de création du nouveau fichier %1 (%2)"
+msgstr "Filtreâ¯: erreur de création du nouveau fichier %1 (%2)"
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr "Impossible de vérifier le chemin de session %1 (%2)"
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr "Impossible de vérifier l'état du fichier %1 (%2)"
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr "%1 n'est pas un cliché"
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr "Répertoire de travail courant impossible à déterminer (%1)"
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr "Type de fichier inconnu pour la session %1"
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr "Impossible de passer le nombre de fichiers ouverts à \"illimité\""
-#: globals.cc:236
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr "Impossible de passer le nombre de fichiers ouverts à %1"
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr "Votre configuration-système limite %1 à %2 fichiers ouverts"
-#: globals.cc:244
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr "Impossible de modifier le nombre de fichiers ouverts (%1)"
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
msgid "Loading configuration"
msgstr "Chargement de la configuration"
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr "Monitoring"
+
+#: globals.cc:555 session_state.cc:642
+#, fuzzy
+msgid "Master"
+msgstr "Bus Master"
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr "Impossible de trouver un nouveau nom pour le fichier importé %1"
@@ -828,16 +1041,16 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr "La piste %1 de %2 ne contient aucune donnée MIDI valide"
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
-msgstr "Le fichier MIDI %1 n'est pas lisible (pour une raison inconnue)"
+msgid "MIDI file could not be written (best guess: %1)"
+msgstr ""
#: import.cc:475
msgid "Import: cannot open input sound file \"%1\""
-msgstr "Import : impossible d'ouvrir le fichier Audio \"%1\""
+msgstr "Importâ¯: impossible d'ouvrir le fichier Audio \"%1\""
#: import.cc:486
msgid "Import: error opening MIDI file"
-msgstr "Import : erreur d'ouverture du fichier MIDI"
+msgstr "Importâ¯: erreur d'ouverture du fichier MIDI"
#: import.cc:493
msgid "Import: file contains no channels."
@@ -855,110 +1068,113 @@ msgstr "Echec de suppression de fichier(s) après l'échec/annulation d'import"
msgid "Unknown"
msgstr "Inconnnu"
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr "Préset %1 (Banque %2)"
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr "%1 - aucune piste/bus à l'ID %2 à qui se connecter"
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
-msgstr "E/S : impossible de déconnecter le port %1 de %2"
+msgstr "E/Sâ¯: impossible de déconnecter le port %1 de %2"
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
-msgstr "E/S : impossible d'inscrire le port d'entrée %1"
+msgstr "E/Sâ¯: impossible d'inscrire le port d'entrée %1"
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
-msgstr "E/S : impossible d'inscrire le port de sortie %1"
+msgstr "E/Sâ¯: impossible d'inscrire le port de sortie %1"
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr "Entrée"
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr "Sortie"
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr "Entrée"
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr "Sortie"
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Groupe inconnu \"%1\" listé comme %2 de %3"
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Groupe %1 indisponible - \"%2\" utilisé à la place"
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
-msgstr "%1 : création de ports E/S impossible"
+msgstr "%1â¯: création de ports E/S impossible"
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr "Entrée %s"
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr "Sortie %s"
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr "Mono"
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr "G"
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr "D"
-#: io.cc:1541 io.cc:1547
-#, fuzzy, c-format
-msgid "%d"
-msgstr "S"
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -969,87 +1185,87 @@ msgstr ""
#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
-msgstr "LADSPA : le plugin a disparu depuis sa découverte !"
+msgstr "LADSPAâ¯: le plugin a disparu depuis sa découverte !"
#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr "HOME introuvable. Préset non enlevé."
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Création de %1 impossible. Préset non sauvegardé. (%2)"
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr "HOME introuvable. Préset non sauvegardé."
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr "Impossible de placer un repère de CD ici"
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr ""
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr ""
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr ""
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr ""
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr ""
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr ""
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr "Session"
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr ""
@@ -1077,7 +1293,7 @@ msgid ""
"end: "
msgstr ""
"\n"
-"fin : "
+"finâ¯: "
#: location_importer.cc:146
msgid ""
@@ -1086,7 +1302,7 @@ msgid ""
msgstr ""
"L'emplacement est l'intervalle-Punch, il sera importé comme intervalle "
"normal.\n"
-"Vous pourriez renommer l'emplacement importé : "
+"Vous pourriez renommer l'emplacement importéâ¯: "
#: location_importer.cc:157
msgid ""
@@ -1095,7 +1311,7 @@ msgid ""
msgstr ""
"L'emplacement est un intervalle-Boucle, il sera importé comme intervalle "
"normal.\n"
-"Vous pourriez renommer l'emplacement importé : "
+"Vous pourriez renommer l'emplacement importéâ¯: "
#: location_importer.cc:168
msgid ""
@@ -1103,59 +1319,115 @@ msgid ""
"You may rename the imported location:"
msgstr ""
"Un emplacement de ce nom existe déjà .\n"
-"Vous pourriez renommer l'emplacement importé : "
+"Vous pourriez renommer l'emplacement importéâ¯: "
+
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
-#: ltc_slave.cc:272
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr "FPS de la session ajusté de %1 à %2 du LTC."
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
-msgstr "Décalage FPS entre Session et LTC : Session : %2 - LTC : %1."
+msgstr "Décalage FPS entre Session et LTCâ¯: Sessionâ¯: %2 - LTCâ¯: %1."
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-"%1 : changement de configuration E/S %4 requis pour utiliser %2, mais le "
+"%1â¯: changement de configuration E/S %4 requis pour utiliser %2, mais le "
"canal est réglé à %3"
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
#, fuzzy
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
-msgstr "AudioDiskstream %1 : aucune liste de lecture existante à copier !"
+msgstr "AudioDiskstream %1â¯: aucune liste de lecture existante à copier !"
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
#, fuzzy
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-"AudioDiskstream %1 : lecture impossible de %2 depuis la liste de lecture à "
+"AudioDiskstream %1â¯: lecture impossible de %2 depuis la liste de lecture à "
"l'image %3"
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
#, fuzzy
msgid "MidiDiskstream %1: cannot write to disk"
-msgstr "AudioDiskstream %1 : écriture sur le disque impossible"
+msgstr "AudioDiskstream %1â¯: écriture sur le disque impossible"
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
#, fuzzy
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-"AudioDiskstream \"%1\" : transfert de la capture sur le disque impossible !"
+"AudioDiskstream \"%1\"â¯: transfert de la capture sur le disque impossible !"
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
-msgstr "%1 : création de région impossible pour le fichier MIDI complet"
+msgstr "%1â¯: création de région impossible pour le fichier MIDI complet"
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1175,32 +1447,47 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:1994
-msgid "transpose"
-msgstr "Transposer"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr ""
+
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:131
-#, fuzzy
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
-msgstr "Style RGBA manquant pour \"%1\""
+msgstr ""
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1208,59 +1495,58 @@ msgstr ""
msgid "MIDI stretch created non-MIDI source"
msgstr ""
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr "Dim monitoring"
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr "Monitoring coupé"
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr "Monitoring Mono"
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr "Niveau de Dim du Monitoring"
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr "Niveau de gain solos du Monitoring"
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr ""
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr ""
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr ""
-#: monitor_processor.cc:515
-#, fuzzy
+#: monitor_processor.cc:546
msgid "solo control"
-msgstr "Ctrl"
+msgstr ""
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
#, fuzzy
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr "FPS de la session ajusté de %1 à %2 du LTC."
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1316,7 +1602,7 @@ msgstr "Copier une région"
msgid "fixed time region copy"
msgstr "Copier une région (horodatage fixe)"
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
@@ -1325,16 +1611,13 @@ msgid "looking for panners in %1\n"
msgstr "Recherche de Panoramiques dans %1\n"
#: panner_manager.cc:121
-#, fuzzy
msgid "Panner discovered: \"%1\" in %2\n"
-msgstr ""
-"%1\n"
-"(révision %2)"
+msgstr " \n"
#: panner_manager.cc:140
#, fuzzy
msgid "PannerManager: cannot load module \"%1\" (%2)"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "Moteur Audioâ¯: module \"%1\" inchargeable (%2)"
#: panner_manager.cc:147
msgid "PannerManager: module \"%1\" has no descriptor function."
@@ -1354,32 +1637,101 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr ""
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr "Do"
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr "Doâ¯â¯"
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr "Ré"
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr "Réâ¯â¯"
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr "Mi"
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr "Fa"
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr "Faâ¯â¯"
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr "Sol"
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr "Solâ¯â¯"
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr "La"
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr "Si â"
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr "Si"
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr ""
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr ""
#: playlist_source.cc:99
#, fuzzy
msgid "No playlist ID in PlaylistSource XML!"
-msgstr "Liste de lecture importée : syntaxe XML incorrecte"
+msgstr "Liste de lecture importéeâ¯: syntaxe XML incorrecte"
#: playlist_source.cc:118
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+#, fuzzy
+msgid "Audio"
+msgstr "Audio"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -1387,7 +1739,7 @@ msgstr ""
"Les présets de Plugin ne sont pas supportés dans cette version d'%1. "
"Envisagez d'acheter une version complète."
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
@@ -1395,24 +1747,27 @@ msgstr ""
"Sauvegarder les réglages de Plugin est impossible dans cette version d'%1. "
"Envisagez d'acheter la version complète."
-#: plugin_insert.cc:596
-#, fuzzy
+#: plugin_insert.cc:1148
msgid "programming error: "
-msgstr "erreur de programmation: "
+msgstr "erreur de programmationâ¯: "
+
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
-#: plugin_insert.cc:933
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr ""
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr ""
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr ""
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1420,119 +1775,209 @@ msgstr ""
"Référence à un Plugin (\"%1\") qui est inconnu.\n"
"Il a peut-être été enlevé ou déplacé depuis sa dernière utilisation."
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr ""
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr ""
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr "Découverte de Plugins..."
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
-#, fuzzy
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
-msgstr "Recherche de greffons"
+msgstr "Recherche de greffons LV2"
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
-msgstr "LADSPA : chargement du module \"%1\" impossible (%2)"
+msgstr "LADSPAâ¯: chargement du module \"%1\" impossible (%2)"
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:705
-#, fuzzy
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
+msgstr "VST"
+
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
msgstr ""
-"Type d'Ãditeur de plugin inconnu (note: VST non supporté dans cette version "
-"d'%1)"
-#: plugin_manager.cc:732
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:1037
-#, fuzzy
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
-msgstr "Type d'Ãditeur de plugin inconnu"
+msgstr "Type de greffon «â¯%1â¯Â» inconnu â ignoré"
-#: port.cc:450
-#, fuzzy
+#: port.cc:504
msgid "could not reregister %1"
-msgstr "IHM %1 impossible à créer"
+msgstr "impossible d'inscrire à nouveau %1"
#: port_insert.cc:43
msgid "insert %1"
msgstr ""
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr ""
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
msgstr ""
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
@@ -1540,44 +1985,43 @@ msgstr ""
"Plus de port disponible. Vous devez stopper %1 et redémarrer avec plus de "
"ports si vous avez besoin d'autant de pistes."
-#: port_manager.cc:292
-#, fuzzy
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "AudioEngineâ¯: impossible de réserver le port «â¯%1â¯Â» (%2)"
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
-msgstr "création de port impossible : %1"
+msgstr "création de port impossibleâ¯: %1"
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr ""
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr "Chargement du fichier de configuration-système %1"
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
-msgstr "%1 : lecture du fichier de configuration-système \"%2\" impossible"
+msgstr "%1â¯: lecture du fichier de configuration-système \"%2\" impossible"
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
-msgstr "%1 : échec de chargement du fichier de configuration-système \"%2\"."
+msgstr "%1â¯: échec de chargement du fichier de configuration-système \"%2\"."
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
@@ -1585,89 +2029,154 @@ msgstr ""
"Le fichier de configuration-système %1 est vide. Il y a probablement eu une "
"erreur en installant %1"
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr "Chargement du fichier de configuration-utilisateur %1"
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
-msgstr "%1 : lecture du fichier de configuration \"%2\" impossible"
+msgstr "%1â¯: lecture du fichier de configuration \"%2\" impossible"
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr ""
-"%1 : échec de chargement du fichier de configuration-utilisateur \"%2\"."
+"%1â¯: échec de chargement du fichier de configuration-utilisateur \"%2\"."
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr "Le fichier de configuration %1 est vide. Ce n'est pas normal."
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr "Fichier de configuration %1 non sauvegardé"
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr "Impossible d'ouvrir le fichier de session récente %1 (%2)"
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr ""
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr ""
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr "Impossible de créer un nouveau nom pour la région \"%1\""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
-msgstr "Import : %1"
+msgstr "Importâ¯: %1"
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr ""
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr ""
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1240
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2186
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
msgstr ""
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:4994
+msgid "lo"
msgstr ""
-#: route_group.cc:459
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr ""
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
@@ -1676,109 +2185,126 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr "%1 Aux."
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr "%1 Dép."
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr ""
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr "Connecter au moteur"
-#: session.cc:362
+#: session.cc:484
msgid "Session loading complete"
msgstr "Session chargée."
-#: session.cc:434
+#: session.cc:575
msgid "Set up LTC"
msgstr "Régler LTC"
-#: session.cc:436
+#: session.cc:577
msgid "Set up Click"
msgstr "Régler le clic"
-#: session.cc:438
+#: session.cc:579
msgid "Set up standard connections"
msgstr ""
-#: session.cc:664
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr ""
-#: session.cc:727
-#, fuzzy, c-format
+#: session.cc:951
+#, c-format
msgid "out %s"
msgstr "Sortie %s"
-#: session.cc:729
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr "Sortie %<PRIu32>"
-#: session.cc:744
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "Sortie %<PRIu32>+%<PRIu32>"
-#: session.cc:761
-#, fuzzy, c-format
+#: session.cc:985
+#, c-format
msgid "in %s"
msgstr "Entrée %s"
-#: session.cc:763
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr "Entrée %<PRIu32>"
-#: session.cc:778
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "Entrée %<PRIu32>+%<PRIu32>"
-#: session.cc:852
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr "Connection de sortie Master %1 Ã %2 impossible"
-#: session.cc:921
-#, fuzzy
-msgid "Monitor"
-msgstr ": moniteur"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
+msgstr ""
-#: session.cc:966
-#, fuzzy
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
-msgstr "Connection de sortie Master %1 Ã %2 impossible"
+msgstr "Impossible de connecter l'entrée de contrôle %1 à %2"
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Préférences d'E/S du bus de Monitoring introuvables"
-#: session.cc:1017
-#, fuzzy
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
-msgstr "Connection de sortie Master %1 Ã %2 impossible"
+msgstr "Impossible de connecter la sortie de contrôle %1 à %2"
-#: session.cc:1085
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-"Création du bus d'Audition impossible : pas d'audition de région possible"
+"Création du bus d'Audition impossibleâ¯: pas d'audition de région possible"
-#: session.cc:1270
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
-msgstr "Session : le Punch ne peut pas utiliser cet intervalle (début <= fin)"
+msgstr "Sessionâ¯: le Punch ne peut pas utiliser cet intervalle (début <= fin)"
-#: session.cc:1297
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1329
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -1786,19 +2312,31 @@ msgstr ""
"La boucle ne peut utiliser cet intervalle car sa durée est inférieure ou "
"égale à zéro"
-#: session.cc:1497
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1751
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
-msgstr "Session : création de nouvelle piste MIDI impossible."
+msgstr "Sessionâ¯: création de nouvelle piste MIDI impossible."
-#: session.cc:2053
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@@ -1806,86 +2344,91 @@ msgstr ""
"Plus de port JACK disponible. Vous devez stopper %1 et redémarrer JACK avec "
"plus de ports si vous avez besoin d'autant de pistes."
-#: session.cc:2239 session.cc:2242
-#, fuzzy
-msgid "Audio"
-msgstr "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Sessionâ¯: impossible de créer un nouveau routage Audio."
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "Impossible de créer une piste Audio avec %1 Entrée(s) / %2 Sortie(s)"
-#: session.cc:2297
+#: session.cc:3050
msgid "Session: could not create new audio track."
-msgstr "Session : impossible de créer une nouvelle piste Audio."
+msgstr "Sessionâ¯: impossible de créer une nouvelle piste Audio."
-#: session.cc:2330 session.cc:2333
-#, fuzzy
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr "Bus"
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr "Session : impossible de créer un nouveau routage Audio."
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2475
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2501
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2531
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr "Echec de l'ajout de nouvelles pistes/bus"
-#: session.cc:3671
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Il y a déjà %1 prises pour %2, c'est trop !"
-#: session.cc:4316
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4328
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4340
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4352
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4477
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Impossible d'établir un intervalle où fin <= début (ex. %1 <= %2)"
-#: session.cc:4486
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
-#, fuzzy
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
-msgstr "(%2) : création du répertoire %1 pour l'utilisateur %3 impossible"
+msgstr "Impossible de créer le nouveau fichier «â¯%1â¯Â» pour %2"
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "Fichier Audio %1 impossible à ouvrir pour le clic (%2)"
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "Données du fichier Audio du clic illisibles"
@@ -1924,127 +2467,151 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
-msgstr "Création du répertoire de session à l'adresse % impossible Erreur : %2"
+msgstr "Création du répertoire de session à l'adresse % impossible Erreurâ¯: %2"
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr "Aucun sous-répertoire de Session à l'adresse %1"
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
-msgstr "Session : 2 évènements simultanés de type %1 impossibles (%2)."
+msgstr "Sessionâ¯: 2 évènements simultanés de type %1 impossibles (%2)."
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
-msgstr "%1 : chercher à %2 impossible pour exporter"
+msgstr "%1â¯: chercher à %2 impossible pour exporter"
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
-msgstr "Export inopinément fini : %1"
+msgstr "Export inopinément finiâ¯: %1"
#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-"Encodeur LTC : FPS invalide - Encodage LTC désactivé pour cette session."
+"Encodeur LTCâ¯: FPS invalide - Encodage LTC désactivé pour cette session."
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr ""
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr "Définir la taille et la fréquence des échantillons"
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr "Utiliser la configuration"
-#: session_state.cc:331
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr "RÃ Z des Controleurs Distants..."
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Pics-Audio \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire Pics-Audio \"%1\" impossible (%2)"
-#: session_state.cc:430
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
-msgstr "Session : création du répertoire Audio \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire Audio \"%1\" impossible (%2)"
-#: session_state.cc:437
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
-msgstr "Session : création du répertoire MIDI \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire MIDI \"%1\" impossible (%2)"
-#: session_state.cc:444
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Nettoyage \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire Nettoyage \"%1\" impossible (%2)"
-#: session_state.cc:451
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Export \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire Export \"%1\" impossible (%2)"
-#: session_state.cc:458
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Analyse \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire Analyse \"%1\" impossible (%2)"
-#: session_state.cc:465
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Plugins \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire Plugins \"%1\" impossible (%2)"
-#: session_state.cc:472
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Externes \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire Externes \"%1\" impossible (%2)"
-#: session_state.cc:486
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
-msgstr "Session : création du répertoire \"%1\" impossible (%2)"
+msgstr "Sessionâ¯: création du répertoire \"%1\" impossible (%2)"
+
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
-#: session_state.cc:520
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:526
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:545
-#, fuzzy
-msgid "Master"
-msgstr "Bus Master"
+#: session_state.cc:626
+msgid "Loop"
+msgstr ""
-#: session_state.cc:606
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:630
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "Impossible de renommer le cliché %1 en %2 (%3)"
-#: session_state.cc:658
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:685
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -2053,340 +2620,375 @@ msgstr ""
"toutes les connections E/S.\n"
"Session non sauvegardée."
-#: session_state.cc:736
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:746
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:814
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
-msgstr "%1 : le fichier de session \"%2\" n'existe pas !"
+msgstr "%1â¯: le fichier de session \"%2\" n'existe pas !"
-#: session_state.cc:826
-#, fuzzy
+#: session_state.cc:954
msgid "Could not understand session file %1"
-msgstr "Ce fichier de session n'a pu être lu!"
+msgstr "Impossible d'interpréter le fichier de session %1"
-#: session_state.cc:835
-#, fuzzy
+#: session_state.cc:963
msgid "Session file %1 is not a session"
-msgstr "Type de fichier inconnu pour la session %1"
+msgstr "Le fichier %1 n'est pas un fichier de session"
-#: session_state.cc:1147
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1201
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1206
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1217
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1224
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1231
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1244
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1251
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1271
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1283
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1291
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1312
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1319
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1327
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1373
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1377
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
-msgstr "Chargement de piste/bus : %1..."
+msgstr "Chargement de piste/busâ¯: %1..."
-#: session_state.cc:1382
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1386
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1485
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1545
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1549
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr "Etat de la région '%1' inchargeable"
-#: session_state.cc:1585
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1613
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1625
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1687
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1765
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1799
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1807
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1813
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1872
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1880
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1979
-#, fuzzy
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
-msgstr "Création du dossier de formats d'export %1 impossible : %2"
+msgstr "Impossible de créer le dossier de modèles «â¯%1â¯Â» (%2)"
-#: session_state.cc:1992
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1998
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2008
+#: session_state.cc:2259
msgid "template not saved"
msgstr "Modèle non sauvegardé"
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
msgstr ""
-#: session_state.cc:2834
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2873
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2891
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3204
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3213
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3216
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3220
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3245
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
-msgstr "%1 : pas de fichier d'historique \"%2\" pour cette session"
+msgstr "%1â¯: pas de fichier d'historique \"%2\" pour cette session"
-#: session_state.cc:3251
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3293
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3304
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3315
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3323
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3559
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3564
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr ""
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr "Boucle impossible - pas d'intervalle défini"
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
"Impossible de rendre le bouclage inaudible si %1 utilise le transport JACK.\n"
-"Conseil : changer les options configurées"
+"Conseilâ¯: changer les options configurées"
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
msgstr ""
"Le Varispeed est désactivé avec %1 connecté au controle de transport JACK"
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr ""
#: sndfile_helpers.cc:34
-#, fuzzy
msgid "WAV"
msgstr "WAV"
#: sndfile_helpers.cc:35
-#, fuzzy
msgid "AIFF"
msgstr "AIFF"
#: sndfile_helpers.cc:36
-#, fuzzy
msgid "CAF"
msgstr "CAF"
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
msgstr ""
#: sndfile_helpers.cc:38
@@ -2394,29 +2996,24 @@ msgid "FLAC"
msgstr ""
#: sndfile_helpers.cc:39
-#, fuzzy
msgid "Ogg/Vorbis"
-msgstr "Options Ogg Vorbis"
+msgstr "Ogg/Vorbis"
#: sndfile_helpers.cc:40
-#, fuzzy
msgid "raw (no header)"
-msgstr "Modèle d'en-tête"
+msgstr "brut (sans en-tête)"
#: sndfile_helpers.cc:45
-#, fuzzy
msgid ".wav"
-msgstr "WAV"
+msgstr ".wav"
#: sndfile_helpers.cc:46
-#, fuzzy
msgid ".aiff"
-msgstr "AIFF"
+msgstr ".aiff"
#: sndfile_helpers.cc:47
-#, fuzzy
msgid ".caf"
-msgstr "CAF"
+msgstr ".caf"
#: sndfile_helpers.cc:48
msgid ".w64"
@@ -2435,24 +3032,24 @@ msgid ".raw"
msgstr ""
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
-msgstr "32 bits à virgule flottante"
+msgid "32-bit float"
+msgstr ""
#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
@@ -2462,90 +3059,108 @@ msgstr ""
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:260
-#, fuzzy
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
-msgstr "Impossible d'ouvrir le fichier de session récente %1 (%2)"
+msgstr ""
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
-#, fuzzy
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
-msgstr "erreur de programmation: %1 %2"
+msgstr "erreur de programmation : %1 %2"
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
-msgstr "%1 : chercher à %2 impossible (erreur libsndfile : %3)"
+msgstr "%1â¯: chercher à %2 impossible (erreur libsndfileâ¯: %3)"
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2561,7 +3176,7 @@ msgstr ""
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2569,67 +3184,93 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
msgstr ""
-#: tempo.cc:95
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
msgstr ""
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
msgstr ""
-#: tempo.cc:220
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
@@ -2637,38 +3278,42 @@ msgstr ""
"Les changements de Rythme sont réservés aux premiers temps de mesures. "
"Déplacement de %1 à %2"
-#: tempo.cc:650
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
msgstr ""
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1185
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr "Plusieurs définitions de Rythme trouvées à %1"
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr "Plusieurs définitions de Tempo trouvées à %1"
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr "Table de tempo"
@@ -2679,7 +3324,7 @@ msgstr "Table de Tempo"
#: tempo_map_importer.cc:80
msgid "Tempo marks: "
-msgstr "Repères de Tempo : "
+msgstr "Repères de Tempoâ¯: "
#: tempo_map_importer.cc:80
msgid ""
@@ -2687,7 +3332,7 @@ msgid ""
"Meter marks: "
msgstr ""
"\n"
-"Repères de Rythme : "
+"Repères de Rythmeâ¯: "
#: tempo_map_importer.cc:89
msgid ""
@@ -2697,6 +3342,14 @@ msgstr ""
"Vous allez remplacer la table de Tempo actuelle !\n"
"Etes vous sur de le vouloir ?"
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr ""
@@ -2718,68 +3371,110 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:422 utils.cc:451
-#, fuzzy
+#: utils.cc:412 utils.cc:441
msgid "Splice"
-msgstr "Collant"
+msgstr ""
-#: utils.cc:424 utils.cc:441
-#, fuzzy
+#: utils.cc:414 utils.cc:431
msgid "Slide"
-msgstr "Glissant"
+msgstr "Glisser"
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
-#, fuzzy
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr "Verrouiller"
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr "Timecode MIDI"
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
#, fuzzy
msgid "MTC"
msgstr "Entrée MTC"
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr "Horloge MIDI"
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
#, fuzzy
msgid "JACK"
-msgstr "Paramètres JACK de Transport et Timecode"
+msgstr "Transport JACK"
-#: utils.cc:470
+#: utils.cc:460 utils.cc:495
+#, fuzzy
+msgid "LTC"
+msgstr "Entrée LTC"
+
+#: utils.cc:464
msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:495
+#: utils.cc:489
msgid "M-Clock"
msgstr ""
-#: utils.cc:501
-#, fuzzy
-msgid "LTC"
-msgstr "Entrée LTC"
-
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr ""
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#, fuzzy
+#~ msgid "%d"
+#~ msgstr "S"
+
+#~ msgid "normalize"
+#~ msgstr "Normaliser"
+
+#~ msgid "8bit"
+#~ msgstr "8 bits"
+
+#~ msgid "16bit"
+#~ msgstr "16 bits"
+
+#~ msgid "24bit"
+#~ msgstr "24 bits"
+
+#~ msgid "32bit"
+#~ msgstr "32 bits"
+
+#~ msgid "8bit unsigned"
+#~ msgstr "8 bits non-signé"
+
+#~ msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#~ msgstr ""
+#~ "Editeur : impossible d'ouvrir \"%1\" comme fichier d'export pour les "
+#~ "repères de CD"
+
+#~ msgid "MIDI file %1 was not readable (no reason available)"
+#~ msgstr "Le fichier MIDI %1 n'est pas lisible (pour une raison inconnue)"
+
+#~ msgid "transpose"
+#~ msgstr "Transposer"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bits à virgule flottante"
+
#~ msgid ""
#~ "You have requested an operation that requires audio analysis.\n"
#~ "\n"
diff --git a/libs/ardour/po/it.mo b/libs/ardour/po/it.mo
new file mode 100644
index 0000000..a7a2381
Binary files /dev/null and b/libs/ardour/po/it.mo differ
diff --git a/libs/ardour/po/it.po b/libs/ardour/po/it.po
index a51a520..3c426f0 100644
--- a/libs/ardour/po/it.po
+++ b/libs/ardour/po/it.po
@@ -7,95 +7,248 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2003-05-21 12:50+0500\n"
"Last-Translator: Filippo Pappalardo <filippo at email.it>\n"
"Language-Team: Italian\n"
-"Language: \n"
+"Language: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr ""
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
msgstr ""
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
msgstr "%1: impossibile creare una regione per il file audio completo"
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
msgstr ""
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 nuovo file di registrazione non è stato avviato correttamente"
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr "Impossibile accedere a %1. Libreria Audio non salvata"
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
msgstr ""
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -125,10 +278,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "errore di programmazione: %1"
@@ -152,26 +306,30 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr ""
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr ""
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr ""
@@ -192,19 +350,19 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -212,13 +370,14 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr ""
@@ -226,166 +385,194 @@ msgstr ""
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr ""
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr ""
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr ""
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr ""
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"lista automazione: nessuna coordinata X salvata per punto di controllo "
"(ignorato)"
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"lista automazione: nessuna coordinata Y salvata per punto di controllo "
"(ignorato)"
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): impossibile accedere a /proc/cpuinfo"
@@ -403,7 +590,7 @@ msgstr "impossibile localizzare \"cpu MHz\" in /proc/cpuinfo"
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr ""
@@ -415,11 +602,11 @@ msgstr ""
msgid "main outs"
msgstr ""
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr ""
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "La Location \"%1\" non valida per il loop (inizio >= fine)"
@@ -431,23 +618,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr ""
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr ""
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr ""
@@ -483,23 +670,27 @@ msgstr ""
msgid "Lossless compression"
msgstr ""
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr ""
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
msgstr ""
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
msgid "trim"
msgstr ""
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr ""
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr ""
@@ -515,24 +706,20 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
#: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
msgstr ""
#: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
msgstr ""
#: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
msgstr ""
#: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
msgstr ""
#: export_formats.cc:167
@@ -544,7 +731,7 @@ msgid "double"
msgstr ""
#: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
msgstr ""
#: export_formats.cc:173
@@ -555,94 +742,90 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:360
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr ""
-#: export_handler.cc:366
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr ""
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr ""
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr ""
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr ""
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr ""
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr ""
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr ""
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr ""
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr ""
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr ""
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr ""
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr ""
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
msgstr ""
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -652,25 +835,25 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr "FileSource: percorso di ricerca non specificato"
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr "FileSource: impossibile trovare il file richiesto (%1): %2"
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "FileSource: impossibile controllare il file esistente (%1): %2"
@@ -684,34 +867,38 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
msgstr ""
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
@@ -719,50 +906,79 @@ msgstr ""
msgid "filter: error creating name for new file based on %1"
msgstr ""
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr "impossibile controllare il percorso %1 (%2)"
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr "impossibile controllare il file di stato %1 (%2)"
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr "impossibile determinare la cartella di lavoro corrente (%1)"
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr "tipo di fle sconosciuto per la sessione %1"
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:236
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:244
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
msgid "Loading configuration"
msgstr ""
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr ""
@@ -788,7 +1004,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
msgstr ""
#: import.cc:475
@@ -815,110 +1031,113 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr "IO: impossibile registrare la porta %1"
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr "IO: impossibile registrare la porta %1"
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr ""
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: stringa malformata nel nodo XML per le entrate \"%1\""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr "stringa malformata nel nodo XML \"%1\""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: stringa mal formata nel nodo XML per le uscite \"%1\""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: stringa mal formata nel nodo XML \"%1\""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr ""
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr ""
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr ""
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -935,81 +1154,81 @@ msgstr "LADSPA: il plugin
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Impossibile creare %1 . Preset non salvato. (%2)"
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr "Errore nel salvare il file di preset %1."
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr "impossibile localizzare HOME. Preset non salvato."
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr ""
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr ""
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr ""
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr "il nodo XML per la Location non ha informazioni sul nome"
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr "il nodo XML per la Location non ha informazioni sull'inizio"
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr "il nodo XML per la Location non ha informazioni sulla fine"
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr "il nodo XML per la Location non ha informazioni sui flags"
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr ""
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr ""
@@ -1051,48 +1270,104 @@ msgid ""
"You may rename the imported location:"
msgstr ""
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr ""
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1112,31 +1387,47 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
msgstr ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1144,57 +1435,57 @@ msgstr ""
msgid "MIDI stretch created non-MIDI source"
msgstr ""
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr ""
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr ""
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr ""
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr ""
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr ""
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr ""
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr ""
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr ""
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1250,7 +1541,7 @@ msgstr ""
msgid "fixed time region copy"
msgstr ""
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
@@ -1284,19 +1575,67 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr ""
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr ""
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr ""
@@ -1308,35 +1647,59 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr "errore di programmazione: "
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr ""
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr ""
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr ""
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1344,91 +1707,187 @@ msgstr ""
"Trovato un riferimento ad un plugin (\"%1\") sconosciuto.\n"
"Forse stato rimosso o spostato dall'ultima volta che lo si e' usato"
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr ""
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr ""
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr ""
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: impossibile caricare il modulo \"%1\" (%2)"
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: il modulo \"%1\" non ha alcuna funzione descriptor."
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
msgstr ""
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:450
+#: port.cc:504
msgid "could not reregister %1"
msgstr ""
@@ -1436,150 +1895,215 @@ msgstr ""
msgid "insert %1"
msgstr ""
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr "insert non-port XML usato per insert di plugin di porta"
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
msgstr ""
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
msgstr ""
-#: port_manager.cc:292
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr ""
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr ""
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr ""
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr ""
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
msgstr ""
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr ""
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr ""
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr ""
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr ""
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr ""
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr ""
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr "impossibile creare un nuovo nome per la regione \"%1\""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr ""
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr ""
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr ""
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1240
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2186
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
msgstr ""
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5131
+msgid "Rels"
msgstr ""
-#: route_group.cc:459
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr ""
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
@@ -1588,206 +2112,246 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr ""
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr ""
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr ""
-#: session.cc:362
+#: session.cc:484
msgid "Session loading complete"
msgstr ""
-#: session.cc:434
+#: session.cc:575
msgid "Set up LTC"
msgstr ""
-#: session.cc:436
+#: session.cc:577
msgid "Set up Click"
msgstr ""
-#: session.cc:438
+#: session.cc:579
msgid "Set up standard connections"
msgstr ""
-#: session.cc:664
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr "impossibile impostare entrata/uscita del click"
-#: session.cc:727
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr ""
-#: session.cc:729
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:744
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:761
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr ""
-#: session.cc:763
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:778
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:852
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1085
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "impossibile creare l'Auditioner"
-#: session.cc:1270
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Sessione: non si può usare quella location per l'auto punch (inizio <= fine)"
-#: session.cc:1297
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1329
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1497
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1751
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:2053
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
msgstr ""
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2297
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr "Sessione: impossibile creare una nuova traccia audio"
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr ""
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2475
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2501
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2531
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3671
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Ci sono già %1 registrazioni per %2, che io considero troppe"
-#: session.cc:4316
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4328
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4340
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4352
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4477
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4486
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr ""
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "impossibile accedere al file audio per il click %1 (%2)"
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "impossibile leggere dati dal file audio per il click"
@@ -1826,23 +2390,36 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
msgstr ""
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr ""
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr ""
@@ -1852,413 +2429,466 @@ msgid ""
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr "Sessione: impossibile creare Playlist dalla descrizione XML"
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr ""
-#: session_state.cc:331
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:430
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"Sessione: impossibile creare la cartella sounds per la sessione \"%1\" (%2)"
-#: session_state.cc:437
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:444
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:451
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:458
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:465
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:472
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:486
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:526
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
msgstr ""
-#: session_state.cc:606
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:630
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:658
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:685
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:736
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:746
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:814
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:826
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:835
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1147
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1201
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione option"
-#: session_state.cc:1206
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1217
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione sources"
-#: session_state.cc:1224
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione Tempo Map"
-#: session_state.cc:1231
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione locations"
-#: session_state.cc:1244
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione Regions"
-#: session_state.cc:1251
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione playlist"
-#: session_state.cc:1271
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1283
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione diskstream"
-#: session_state.cc:1291
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione routes"
-#: session_state.cc:1303
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1312
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione edit groups"
-#: session_state.cc:1319
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione mix groups"
-#: session_state.cc:1327
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1373
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr "Sessione: impossibile creare Route dalla descrizione XML"
-#: session_state.cc:1377
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1382
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1386
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1485
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1545
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr "Sessione: impossibile creare regione dalla descrizione XML"
-#: session_state.cc:1549
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1585
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1613
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1625
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1687
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1765
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1799
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1807
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1813
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1872
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr "Sessione: impossibile creare Source dalla descrizione XML"
-#: session_state.cc:1880
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1979
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1992
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr "Il modello \"%1\" esiste già - non è stata creata una nuova versione"
-#: session_state.cc:1998
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2008
+#: session_state.cc:2259
msgid "template not saved"
msgstr ""
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
msgstr ""
-#: session_state.cc:2834
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2873
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2891
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "impossibile eliminare il peakfile %1 per %2 (%3)"
-#: session_state.cc:3204
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3213
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3216
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3220
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3245
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3251
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3293
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3304
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3315
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3323
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3559
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3564
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr ""
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr ""
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
msgstr ""
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr ""
@@ -2275,7 +2905,7 @@ msgid "CAF"
msgstr ""
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
msgstr ""
#: sndfile_helpers.cc:38
@@ -2319,23 +2949,23 @@ msgid ".raw"
msgstr ""
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
msgstr ""
#: sndfile_helpers.cc:83
@@ -2346,11 +2976,15 @@ msgstr ""
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
@@ -2358,78 +2992,94 @@ msgstr ""
"SndFileSource: il file contiene solo %1 canali; %2 non è valido come numero "
"di canale"
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
msgstr ""
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2445,7 +3095,7 @@ msgstr ""
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2453,104 +3103,134 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
msgstr ""
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
msgstr ""
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
msgstr ""
-#: tempo.cc:220
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
-#: tempo.cc:650
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
msgstr ""
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1185
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr ""
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr ""
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr ""
@@ -2575,6 +3255,14 @@ msgid ""
"Are you sure you want to do this?"
msgstr ""
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr ""
@@ -2596,62 +3284,71 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
msgid "Splice"
msgstr ""
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
msgid "Slide"
msgstr ""
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr ""
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
msgid "MTC"
msgstr ""
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
msgid "JACK"
msgstr ""
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
msgstr ""
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
msgstr ""
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr ""
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
#~ msgid "cannot create new audio file \"%1\" for %2"
#~ msgstr "impossibile creare un nuovo file audio \"%1\" per %2"
diff --git a/libs/ardour/po/nn.mo b/libs/ardour/po/nn.mo
new file mode 100644
index 0000000..ca6f270
Binary files /dev/null and b/libs/ardour/po/nn.mo differ
diff --git a/libs/ardour/po/nn.po b/libs/ardour/po/nn.po
index 96780ff..bc09a1c 100644
--- a/libs/ardour/po/nn.po
+++ b/libs/ardour/po/nn.po
@@ -8,11 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2011-09-13 22:43+0100\n"
"Last-Translator: Eivind ÃdegÃ¥rd <meinmycell-lists at yahoo.no>\n"
"Language-Team: Nynorsk <i18n-nn at lister.ping.uio.no>\n"
-"Language: \n"
+"Language: Norwegian Nynorsk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -20,88 +20,241 @@ msgstr ""
"X-Poedit-Country: NORWAY\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
-msgstr "Dempar"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr ""
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
msgstr ""
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "Ingen"
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr "Lyd-diskstraum: Spelelista \"%1\" er ikkje ei lydspeleliste"
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr "Lyd-diskstraum %1: det finst inga speleliste å kopiera!"
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"Lyd-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3, ved "
"attfylling"
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "Lyd-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3"
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "Lyd-diskstraum %1: greidde ikkje skriva til disk"
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "Lyd-diskstraum \"%1\": greier ikkje skriva opptaket til disken!"
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
msgstr "%1: greidde ikkje laga bolk for heil lydfil"
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr "Lyd-diskstraum: greidde ikkje laga bolk frå opptaket!"
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
msgstr "Programmerarfeil: %1"
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
msgstr "Lyd-diskstraum: kanal %1 utanfor rekkjevidd"
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1: ny opptaksfil %2 vart ikkje påbyrja rett"
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: greidde ikkje henta fram att den ventande opptakskjeldefila %2"
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr "%1: feil tal på ventande kjelder på lista - ser bort frå alle"
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr "%1: greidde ikkje laga heilfilbolk frå ventande opptakskjelder"
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr "Greidde ikkje opna %1. Lydbiblioteket er ikkje lagra"
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
msgstr ""
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -131,10 +284,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr "Lydspelelister (ubrukte)"
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "Programmeringsfeil: %1"
@@ -162,26 +316,30 @@ msgstr ""
"\n"
"Kanalar:"
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Ukjend bundel \"%1\" lista opp for inngangen på %2"
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr "inn 1"
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr "Ingen inngangsbundlar klare som erstatting"
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Bundelen %1 var ikkje tilgjengeleg - brukar \"inn 1\" i staden for"
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr "Feil inngangskanalliste i XML-node (%1)"
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr "Lydspor"
@@ -202,19 +360,19 @@ msgstr "greier ikkje lasta VAMP-innstikket \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "VAMP-innstikket \"%1\" vart ikkje lasta"
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -222,13 +380,14 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr ""
@@ -236,172 +395,200 @@ msgstr ""
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "kan ikkje døypa om toppfil for %1 frå %2 til %3 (%4)"
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr "Lydkjelde: kan ikkje bruka toppfil \"%1\""
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr "kan ikkje lesa lyddata for uskalert topputrekning"
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
"AudioSource [%1]: topplesing - kan ikkje lesa %2 punkt ved forskuvinga %3 av "
"%4 (%5)"
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr "%1 greidde ikkje skriva/lesa rådata for topputrekninga (%2)"
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
-msgstr "Lydkjelde: kan ikkje opna toppstig (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
+msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr "%1: greidde ikkje skriva toppfildata (%2)"
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr "ingen utgangar for lyttinga - du må kopla til manuelt"
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Greier ikkje setja opp lyttehandteringsflyt for %1 kanalar"
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr "Automasjonspunktet har ingen stigeigenskapar"
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr "greier ikkje opna %2 for å lasta automasjonsdata (%3)"
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr "greier ikkje lasta automasjonsdata frå %2"
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Dempar"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr ""
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
"automasjonsliste: greier ikkje lasta koordinater frå XML, såg bort frå alle "
"punkt"
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"automasjonsliste: ingen x-koordinatar er lagra for kontrollpunktet (hoppar "
"over)"
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"automasjonsliste: ingen y-koordinatar er lagra for kontrollpunktet (hoppar "
"over)"
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
"AutomationList: gav XML-node med namet %1, ikkje \"AutomationList\" - såg "
"bort frå."
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr "Ãkt: greier ikkje laga butler-trÃ¥d"
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr "Butler-førlesingsfeil på dstream %1"
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr "Butler-etterskrivingsfeil på dstream %1"
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr "kontrollprotokollnamnet \"%1\" har inga skildring"
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr "kontrollprotokollnamnet \"%1\" greidde ikkje starta opp"
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr "Lagar obligatorisk kontrollprotokolløkt %1"
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr "Kontrollprotokollen %1 er ikkje brukande"
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "Kontrollprotokollstyring: kan ikkje lasta modulen \"%1\" (%2)"
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "Kontrollprotokollstyring: modulen \"%1\" har ingen skildringsfunksjon."
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get:mhz()-funksjonen: kan ikkje opna /proc/cpuinfo"
@@ -419,7 +606,7 @@ msgstr "finn ikkje prosessor-MHz i /proc/cpuinfo"
msgid "audio"
msgstr "lyd"
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr "MIDI"
@@ -431,11 +618,11 @@ msgstr "ukjend"
msgid "main outs"
msgstr "hovudutgangar"
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr "høyr på"
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
"Staden \"%1\" er ikkje gyldig for å spela spor i lykkje (start >= slutt)"
@@ -448,23 +635,23 @@ msgstr "Greidde ikkje få port for eksportkanalen \"%1\", hoppar over kanalen"
msgid "Export failed: %1"
msgstr "Eksportfeil: %1"
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr "Inga tid"
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr "Ugyldig tidsformat"
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr "Ingen dato"
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr "Ugyldig datoformat"
@@ -500,23 +687,27 @@ msgstr "Komprimering med tap"
msgid "Lossless compression"
msgstr "Tapsfri komprimering"
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr "Ãktrate"
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
msgstr ""
-#: export_format_specification.cc:553
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
+
+#: export_format_specification.cc:616
msgid "trim"
msgstr ""
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr ""
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr ""
@@ -532,25 +723,21 @@ msgstr "Trekant"
msgid "Rectangular"
msgstr "Firkant"
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr "Ingen"
-
#: export_formats.cc:159
-msgid "8bit"
-msgstr "8-bit"
+msgid "8-bit"
+msgstr ""
#: export_formats.cc:161
-msgid "16bit"
-msgstr "16-bit"
+msgid "16-bit"
+msgstr ""
#: export_formats.cc:163
-msgid "24bit"
-msgstr "24-bit"
+msgid "24-bit"
+msgstr ""
#: export_formats.cc:165
-msgid "32bit"
-msgstr "32-bit"
+msgid "32-bit"
+msgstr ""
#: export_formats.cc:167
msgid "float"
@@ -561,8 +748,8 @@ msgid "double"
msgstr "dobbel"
#: export_formats.cc:171
-msgid "8bit unsigned"
-msgstr "8bit usignert"
+msgid "8-bit unsigned"
+msgstr ""
#: export_formats.cc:173
msgid "Vorbis sample format"
@@ -572,95 +759,91 @@ msgstr "Vorbis-punktformat"
msgid "No sample format"
msgstr "Ikkje noko punktformat"
-#: export_handler.cc:360
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr ""
-#: export_handler.cc:366
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr "Redigering: greier ikkje opna \"%1\" som eksportfil for CD-markørfil"
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr "Leitar etter eksportformat i %1"
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr ""
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr ""
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr "Val"
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr ""
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr ""
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr ""
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr "Du har ikkje valt noko tidsomfang!"
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr "Ingen MIDI-kanalar er valde!"
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr "Nokre av kanalane er tomme"
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr "Du har ikkje valt noko format!"
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr "Alle kanalane er tomme!"
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr "Eitt eller fleire av desse formata samsvarar ikkje med dette systemet!"
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
msgstr ""
"%1 støttar berre %2 kanalar, men du har %3 kanalar i kanaloppsettet ditt"
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn"
@@ -669,25 +852,25 @@ msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn"
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr "kan ikkje døypa om filkjelda frå %1 til %2 (%3)"
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr "Filkjelde: søkjestigen er ikkje sett opp"
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Filkjelde: Kan ikkje finna den naudsynte fila %1: %2"
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Filkjelde:Kan ikkje sjå etter eksisterande fil %1: %2"
@@ -704,34 +887,38 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr "kan ikkje døypa om %1 til %2 (%3)"
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
msgstr ""
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
@@ -739,50 +926,79 @@ msgstr ""
msgid "filter: error creating name for new file based on %1"
msgstr "lydfilter: feil med å laga namn for ny fil bygd på %1"
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr "lydfilter: feil med å laga den nye fila %1 (%2)"
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr "greier ikkje sjekka øktstigen %1 (%2)"
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr "greier ikkje sjekka tilstandsfila %1 (%2)"
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr "%1 er ikkje ei snøggbiletefil"
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr "greier ikkje avgjera kva som er arbeidsmappa no (%1)"
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr "ukjend filtype for økta %1"
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr "Greidde ikkje setja systemgrensa for opne filer til \"uavgrensa\""
-#: globals.cc:236
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr "Greidde ikkje setja grensa for opne systemfiler til %1"
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:244
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr "Greidde ikkje få tak i grensa for opne systemfiler (%1)"
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
msgid "Loading configuration"
msgstr "Lastar oppsettet"
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr ""
@@ -809,7 +1025,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr "Spor %1 av %2 inneheld ingen brukbare MIDI-data"
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
msgstr ""
#: import.cc:475
@@ -836,110 +1052,113 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IU: kan ikkje kopla porten %1 frå %2"
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr "IU: greier ikkje registrera inngangsporten %1"
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr "IU: greier ikkje registrera utgangsporten %1"
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "feil XML-punkt, \"%1\", sendt til IU-objektet"
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr "inn"
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr "ut"
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr "inngang"
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr "utgang"
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Ukjend bundel \"%1\" lista for %2 av %3"
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Bundelen %1 var ikkje tilgjengeleg - brukte \"%2\" i staden"
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr "Ingen %1-bundlar klare som erstatting"
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr "%1: greier ikkje laga I/U-portar"
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IU: feilforma streng i XML-opunkt for inngangane \"%1\""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr "feil inngangsstreng i XML-punktet \"%1\""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IU: feilforma streng i XML-punktet for utgangane \"%1\""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr "IU: feil utgangsstreng i XML-punktet \"%1\""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr " %s inn"
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr "%s ut"
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr "mono"
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr "V"
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr "H"
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr "%d"
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -957,81 +1176,81 @@ msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: kan ikkje bruka \"%1\", sidan han ikkje kan prosessera på staden"
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Feil punkt sendt til LadspaPlugin::set_state"
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: ikkje noko Ladspa-portnummer"
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: ingen portdata"
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr "Greidde ikkje finna heimemappa. Har ikkje fjera ferdigoppsett."
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Greidde ikkje laga %1. Har ikkje lagra ferdigoppsett. (%2)"
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr "Feil med å lagra ferdigoppsettfila %1."
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr "Greidde ikkje finna heimemappa. Har ikkje lagra ferdigoppsett."
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr "Du kan ikkje leggja til ein CD-markør her"
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr "feil XML-punkt sendt til Location::set_state"
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr "XML-punktet for denne staden har ingen ID-informasjon"
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr "XML-punktet for denne staden har ingen namneinformasjon"
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr "XML-punktet for denne staden har ingen startinformasjon"
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr "XML-punktet for denne staden har ingen sluttinformasjon"
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr "XML-punktet for denne staden har ingen flagginformasjon"
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr "Stader: forsøk på å bruka ukjend stad som vald stad"
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "feil XML-modus send til Locations::set_state"
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr "økt"
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr "greidde ikkje lasta stad frå øktfila - hoppa over"
@@ -1083,48 +1302,104 @@ msgstr ""
"Det finst alt ei plassering med det namnet.\n"
"Du kan gje eit nytt namn til den importerte plasseringa:"
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr ""
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr "%1: I/U-oppsettsendringa %4 ba om å bruka %2, men kanaloppsettet er %3"
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr "MIDI-diskstraum %1: det finst inga speleliste å kopiera!"
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "MIDI-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3"
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
msgid "MidiDiskstream %1: cannot write to disk"
msgstr "MIDI-diskstraum %1: greidde ikkje skriva til disk"
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "MIDI-diskstraum \"%1\": greier ikkje skriva opptaket til disken!"
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
msgstr "%1: greidde ikkje laga bolk for heil midifil"
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr "MIDI-diskstraum: greidde ikkje laga bolk frå midi-opptaket!"
@@ -1144,31 +1419,47 @@ msgstr "Fann ingen NoteID for noteeigenskapsendringa - såg bort frå"
msgid "No SysExID found for sys-ex property change - ignored"
msgstr "Fann ingen SysExID for sys-ex-eigenskapsendring - såg bort frå"
-#: midi_model.cc:1994
-msgid "transpose"
-msgstr "transponer"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr "Manglar parametereigenskap på InterpolationStyle"
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr "Manglar stileigenskap på InterpolationStyle"
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr "Manglar parameterigenskap på AutomationStyle"
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr "Manglar statuseigenskap på AutomationState"
@@ -1176,58 +1467,58 @@ msgstr "Manglar statuseigenskap på AutomationState"
msgid "MIDI stretch created non-MIDI source"
msgstr ""
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr "dim lytting"
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr "kutt lytting"
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr "lytting i mono"
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr "dimnivå lytting"
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr "soloaukingsnivå for lytting"
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr "kutt kontroll %1"
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr "dim kontroll"
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr "polaritetskontroll"
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
msgid "solo control"
msgstr "solo kontroll"
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr "MTC-slave: greidde ikkje lesa gyldig tid. Søv."
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
"Ukjent rate/sleppverdi %1 i innkomande MTC-straum, bruker øktverdiar i staden"
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1283,7 +1574,7 @@ msgstr "bolkkopi"
msgid "fixed time region copy"
msgstr "fast tid-bolkkopi"
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr "Panoreringa fekk XML-data for %1 - ignorert"
@@ -1317,21 +1608,69 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
"Ukjent panoreringstilleggsprogram, \"%1\", funne i panoreringstilstand. "
"Hoppa over."
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr "tilleggsprogrampunktet for panoreringa har ingen typeinformasjon!"
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr "områdestatusnoden har ingen ID, ser bort frå"
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr "Speleliste: greier ikkje laga bolk frå XML"
@@ -1343,35 +1682,59 @@ msgstr "Fann ingen speleliste-ID i PlaylistSource-XML!"
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr "Greidde ikkje byggja speleliste for PlaylistSource frå øktdata!"
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "Lyd"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr "programmeringsfeil: "
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr "XML-punktet som skildrar utvidinga manglar 'type'-feltet"
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr "ukjent programtilleggstype %1 i innpluggingstilstanden"
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr "Innstikket har ikkje noko eige ID-felt"
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1379,93 +1742,189 @@ msgstr ""
"Fann ein referanse til det ukjende tilleggsprogrammet \"%1\".\n"
"Kanskje det har vorte fjerna eller flytt sidan sist det vart brukt."
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr "PluginInsert:Auto: ikkje noko ladspa-portnummer"
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr "PluginInsert: Auto: port-id utanfor rekkjevidd"
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
"PluginInsert: fann ikkje den automasjonsferdige kontrollen %1, såg bort frå "
"han."
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr "Finn innstikk"
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr ""
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr "Greidde ikkje tolka rdf-fila: %1"
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: greier ikkje lasta modulen \"%1\" (%2)"
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: modulen \"%1\" har ingen skildringsfunksjon."
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
msgstr ""
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr "\"%1\" er ein ukjend utvidingsstatustype, såg bort frå alt"
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr "\"%1\" er ein ukjend innstikktype - hoppa over"
-#: port.cc:450
+#: port.cc:504
msgid "could not reregister %1"
msgstr "greidde ikkje registrera %1."
@@ -1473,16 +1932,16 @@ msgstr "greidde ikkje registrera %1."
msgid "insert %1"
msgstr "set inn %1"
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr "XML-punktet som skildrar portinnstikket manglar 'type'-feltet"
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr ""
"tappingspunkt-XML som ikkje er ein port er brukt for porttilleggstapping"
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
@@ -1490,138 +1949,203 @@ msgstr ""
"ein port med namnet \"%1\" finst frå før: sjekk opp dublettar i namn på spor "
"eller bussar"
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
msgstr ""
-#: port_manager.cc:292
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr "AudioEngine: greier ikkje registrera porten \"%1\": %2"
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr "greidde ikkje laga port: %1"
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "Lydmaskineri: Klarte ikkje kopla %1 (%2) til %3 (%4)."
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr "Ikkje noko %1-eigenskapsflagg i elementet %2"
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr "Ingen undernode med aktiv eigenskap"
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr "Lastar systemoppsettfila %1"
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr "%1: greier ikkje lesa systemoppsettfila \"%2\""
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr "%1: greidde ikkje lasta systemoppsettfila \"%2\" skikkeleg."
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
msgstr ""
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr "Lastar brukaroppsettfila %1"
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr "%1: greier ikkje lesa oppsettfila \"%2\""
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr "%1: greidde ikkje lasta brukaroppsettfila \"%2\" skikkeleg."
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr "%1-oppsettsfila di er tom. Dette er ikkje normalt."
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr "Oppsettfila %1 er ikkje lagra"
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr "greier ikkje opna den nyleg brukte øktfila %1 (%2)"
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
"programmeringsfeil: RegionFactory::create()-funksjonen oppkalle med ukjent "
"bolktype"
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr "%1 samansett-%2 (%3)"
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr "%1 samansett-%2.1 (%3)"
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr "greier ikkje laga nytt namn for bolken \"%1\""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr "Import: %1"
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr "Import: src_new()-funkjsonen lukkast ikkje: %1"
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr "retur %1"
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr "\"%1\" er ein ukjend prosesseringstype, hoppa over"
-#: route.cc:1240
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr "greidde ikkje laga prosessering. Hoppa over."
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Feil punkt sendt til Route::set_state()-funksjonen [%1]"
-#: route.cc:2186
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr "Fann panoreringsstatus for ruta (%1) utan panorering!"
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
-msgstr "feilforma tingingsnykjelstreng i tilstandsfil! [%1] ... hoppa over."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5131
+msgid "Rels"
msgstr ""
-#: route_group.cc:459
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr "Du kan ikkje laga undergrupper for MIDI-spor no"
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
@@ -1631,206 +2155,246 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr "greidde ikkje skriva tempo-justert fil til %1"
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr "send %1"
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr ""
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr "Kople til maskin"
-#: session.cc:362
+#: session.cc:484
msgid "Session loading complete"
msgstr "Ferdig å lasta økta."
-#: session.cc:434
+#: session.cc:575
msgid "Set up LTC"
msgstr ""
-#: session.cc:436
+#: session.cc:577
msgid "Set up Click"
msgstr ""
-#: session.cc:438
+#: session.cc:579
msgid "Set up standard connections"
msgstr "Set opp standartilkoplingar"
-#: session.cc:664
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr "greidde ikkje setja opp klikk-I/U"
-#: session.cc:727
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr ""
-#: session.cc:729
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr "ut %<PRIu32>"
-#: session.cc:744
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "ut %<PRIu32>+%<PRIu32>"
-#: session.cc:761
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr ""
-#: session.cc:763
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr "inn %<PRIu32>"
-#: session.cc:778
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "inn %<PRIu32>+%<PRIu32>"
-#: session.cc:852
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr "greier ikkje kopla til hovudutgangane %1 til %2"
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr "greier ikkje kopla til kontrollinngangane %1 til %2"
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Greidde ikkje finna føretrekt I/U for lyttebussen (%1)"
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr "greier ikkje kopla til kontrollutgangane %1 til %2"
-#: session.cc:1085
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "greier ikkje laga Lytting: det er ikkje råd å lytta på nokon bolkar."
-#: session.cc:1270
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr "Ãkt: du kan ikkje bruka denne staden for autoinnslag (start<=slutt)"
-#: session.cc:1297
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1329
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1497
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1751
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr "rundgang-lykkjeoppsett mellom %1 og %2"
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr "Ãkt: greidde ikkje laga nytt midispor."
-#: session.cc:2053
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
-msgstr "Lyd"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Ãkt: greidde ikkje laga ny lydrute."
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
"greier ikkje stilla inn %1 inn/%2 ut-innstillingane for det nye lydsporet"
-#: session.cc:2297
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr "Ãkt: greidde ikkje laga nytt lydspor."
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr "Buss"
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr "Ãkt: greidde ikkje laga ny lydrute."
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Ãkt: UINT_MAX-ruter? GÃ¥r ikkje an!"
-#: session.cc:2475
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr "Ãkt: greier ikkje laga spor/buss frÃ¥ malskildringa"
-#: session.cc:2501
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr "Ãkt: greidde ikkje laga ny lydrute frÃ¥ malen"
-#: session.cc:2531
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3671
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Det er alt %1 opptak for %2, og eg synest det er for mange."
-#: session.cc:4316
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr "send-IDen %1 ser ut til å vera i bruk frå før"
-#: session.cc:4328
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4340
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr "retur-IDen %1 ser ut til å vera i bruk frå før"
-#: session.cc:4352
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr "send-IDen %2 ser ut til å vera i bruk frå før"
-#: session.cc:4477
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Kan ikkje skriva eit område der slutten <= starten (td. %1 <= %2)"
-#: session.cc:4486
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr ""
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "greier ikkje opna klikk-lydfila %1 (%2)"
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "greier ikkje lesa data frå klikklydfila"
@@ -1873,23 +2437,36 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
msgstr "greier ikkje laga øktmappa i stigen \"%1\", feil: %2"
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr "Undermappa for økta finst ikkje i stigen %1"
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr "Ãkt: du kan ikkje ha to handlingar av typen %1 pÃ¥ same ramma (%2)."
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr "%1: greier ikkje finna %2 for eksportering"
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr ""
@@ -1899,99 +2476,111 @@ msgid ""
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "Ãkt: greidde ikkje senda kvartramme-MTC-melding (%1)"
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr "Ãkt: greier ikkje laga speleliste ut frÃ¥ XML-skildringa."
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr "Ãkt: feil pÃ¥ ingen rull for %1"
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Programmeringsfeil: ulovleg handlingstype i process-event (%1)"
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr "solokutt-kontroll (dB)"
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr "Set blokkstorleik og punktrate"
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr "Bruker oppsett"
-#: session_state.cc:331
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr "Still tilbake fjernkontrollar"
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "Ãkt: greier ikkje laga mappa \"%1\" for økttoppfiler (%2)"
-#: session_state.cc:430
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr "Ãkt: greier ikkje laga øktmappa \"%1\" for lydfiler (%2)"
-#: session_state.cc:437
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr "Ãkt: greier ikkje laga midimappa \"%1\" for økta (%2)"
-#: session_state.cc:444
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr "Ãkt: greier ikkje laga mappa \"%1\" for daudlyd (%2)"
-#: session_state.cc:451
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr "Ãkt: greidde ikkje laga mappa \"%1\" for eksportlyd (%2)"
-#: session_state.cc:458
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr "Ãkt: greidde ikkje laga mappa \"%1\" for øktanalyse (%2)"
-#: session_state.cc:465
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Ãkt: greier ikkje laga utvidingmappa \"%1\" for økta (%2)"
-#: session_state.cc:472
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:486
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Ãkt: greidde ikkje laga øktmappa \"%1\" (%2)"
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:526
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
msgstr ""
-#: session_state.cc:606
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:630
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "greidde ikkje døypa om snøggbiletet %1 til %2 (%3)"
-#: session_state.cc:658
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:685
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -1999,142 +2588,142 @@ msgstr ""
"lydmotoren i %1 er ikkje kopla til, og å lagra statusen ville kasta bort "
"alle I/U-tilkoplingar. Ãkta er ikkje lagra"
-#: session_state.cc:736
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr "greidde ikkje lagra tilstanden til %1"
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:746
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:814
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:826
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:835
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr "Ãktfila %1 er ikkje ei økt"
-#: session_state.cc:1147
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"programmeringsfeil: Ãkt: feil XML-punkt sendt til set_state()-funksjonen"
-#: session_state.cc:1201
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr "Ãkt: XML-tilstandsfila har ikkje noko avsnitt om instillingar"
-#: session_state.cc:1206
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr "Ãkt: XML-fila har inga avdeling for metadata"
-#: session_state.cc:1217
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr "Ãkt: XML-tilstandsfila har ikkje noko avsnitt om kjelder"
-#: session_state.cc:1224
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr "Ãkt: XML-fila har ikkje noko avsnitt om tempokart"
-#: session_state.cc:1231
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr "Ãkt: XML-fila har ikkje noko avsnitt om stader"
-#: session_state.cc:1244
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr "Ãkt: XML-tilstandsfila har ikkje noko avsnitt om bolkar"
-#: session_state.cc:1251
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr "Ãkt: XML-tilstandsfila har ikkje noko avsnitt om spelelister"
-#: session_state.cc:1271
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr "Ãkt: XML-fila har inga avdeling for bundlar"
-#: session_state.cc:1283
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr "Ãkt: XML-fila har ikkje nok avsnitt om diskstraumar"
-#: session_state.cc:1291
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr "Ãkt: XML-fila har ikkje noko avsnitt om ruter"
-#: session_state.cc:1303
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr "Ãkt: XML-fila har inga avdeling for rutegrupper"
-#: session_state.cc:1312
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr "Ãkt: XML-fila har ikkje noko avsnitt om grupperedigering"
-#: session_state.cc:1319
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr "Ãkt: XML-fila har ikkje noko avsnitt om miksgrupper"
-#: session_state.cc:1327
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr "Ãkt: XML-fila har ikkje noko avsnitt om klikk"
-#: session_state.cc:1373
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr "Ãkt: greier ikkje laga rute ut frÃ¥ XML-skildringa."
-#: session_state.cc:1377
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr "Lasta spor/buss %1"
-#: session_state.cc:1382
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1386
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1485
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr "Greidde ikkje finna diskstraumen for rute"
-#: session_state.cc:1545
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr "Ãkt: greier ikkje laga bolkar ut frÃ¥ XML-skildringa."
-#: session_state.cc:1549
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr "Greier ikkje laga status for bolken '%1'"
-#: session_state.cc:1585
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr "Fann ikkje bolkar i samansetjingsstatus (IDar %1 og %2): ignorert"
-#: session_state.cc:1613
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1625
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr "Greier ikkje rekonstruera nøsta kjelde for bolken %1"
-#: session_state.cc:1687
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr "Ãkt: XML-punktet som skildrar ein lydbolk er uferdig (manglar kjelde)"
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"Ãkt: XML-punktet som skildrar ein lydbolk peikar pÃ¥ ein ukjend kjelde-ID = %1"
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2142,7 +2731,7 @@ msgstr ""
"Ãkt: XML-punktet som skildrar ein lydbolk peikar pÃ¥ ein kjelde-ID %1 som "
"ikkje er ei lydfil"
-#: session_state.cc:1765
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2150,138 +2739,175 @@ msgstr ""
"Ãkt: XML-punktet som skildrar ein lydbolk manglar nokre masterkjelder, ser "
"bort frå"
-#: session_state.cc:1799
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr "Ãkt: XML-punktet som skildrar ein midibolk er uferdig (manglar kjelde)"
-#: session_state.cc:1807
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"Ãkt: XML-punktet som skildrar ein midibolk peikar pÃ¥ ein ukjend kjelde-ID = "
"%1"
-#: session_state.cc:1813
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"Ãkt: XML-punktet som skildrar ein midibolk peikar pÃ¥ ein kjelde-ID %1 som "
"ikkje er ei midi-fil"
-#: session_state.cc:1872
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr "Ãkt: greier ikkje laga kjelde ut frÃ¥ XML-skildringa."
-#: session_state.cc:1880
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1979
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1992
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr "Malen \"%1\" finst alt - laga ingen ny versjon"
-#: session_state.cc:1998
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2008
+#: session_state.cc:2259
msgid "template not saved"
msgstr "malen vart ikkje lagra"
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
msgstr ""
-#: session_state.cc:2834
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Ãkt: greier ikkje laga mappa \"%1\" for daudlyd (%2)"
-#: session_state.cc:2873
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "kan ikkje døypa om den ubrukte filkjelda frå %1 til %2 (%3)"
-#: session_state.cc:2891
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "kan ikkje fjerna toppfil %1 for %2 (%3)"
-#: session_state.cc:3204
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
"greidde ikkje ta tryggingskopi av den gamle historiefila, noverande historie "
"vart ikkje lagra."
-#: session_state.cc:3213
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr "greidde ikkje lagra historia til %1"
-#: session_state.cc:3216
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3220
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr "greidde ikkje henta fram att historiefila frå tryggingskopien %1 (%2)"
-#: session_state.cc:3245
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: inga historiefil \"%2\" for denne økta."
-#: session_state.cc:3251
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr "Skjønte ikkje økthistoriefila \"%1\""
-#: session_state.cc:3293
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "Greidde ikkje kasta ned midi-kjelde for NoteDiffCommand"
-#: session_state.cc:3304
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "Greidde ikkje kasta ned midi-kjelde for SysExDiffCommand"
-#: session_state.cc:3315
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "Greidde ikkje kasta ned midi-kjelde for PatchChangeDiffCommand"
-#: session_state.cc:3323
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Fann ikkje ut korleis eg skal laga ein kommando av eit %1-XML-punkt."
-#: session_state.cc:3559
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr "Ãkt: ukjend diskstraumtype i XML"
-#: session_state.cc:3564
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr "Ãkt: greidde ikkje lasta diskstraumen via XML-tilstand"
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr "Greidde ikkje spela i lykkje - du har ikkje gjeve noko lykkjeområde"
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
@@ -2289,11 +2915,11 @@ msgstr ""
"Samanhengande lykkjespeling er ikkje støtta når %1 bruker JACK-transporten.\n"
"Me rår til at du endrar innstillingane."
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
@@ -2301,28 +2927,32 @@ msgstr ""
"Allmenn varifart-kontroll kan ikkje brukast når %1 er kopla til JACK-"
"transportkontrollen"
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr "greier ikkje opna MIDI-fila %1 for skriving"
@@ -2339,8 +2969,8 @@ msgid "CAF"
msgstr "CAF"
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64-bits WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
#: sndfile_helpers.cc:38
msgid "FLAC"
@@ -2383,24 +3013,24 @@ msgid ".raw"
msgstr ".raw"
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
-msgstr "Signert 16bit PCM"
+msgid "Signed 16-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
-msgstr "Signert 24bit PCM"
+msgid "Signed 24-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
-msgstr "Signert 32bit PCM"
+msgid "Signed 32-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
-msgstr "Signert 8bit PCM"
+msgid "Signed 8-bit PCM"
+msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
-msgstr "32-bit flytpunkt"
+msgid "32-bit float"
+msgstr ""
#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
@@ -2410,18 +3040,26 @@ msgstr "Liten endian (Intel)"
msgid "Big-endian (PowerPC)"
msgstr "Viktigaste bit fyrst (Mac)"
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "Lydfilkjelde: greier ikkje opna fila \"%1\" for %2 (%3)"
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
"Lydfilkjelde: fila inneheld berre %1 kanalar, %2 er eit ugyldig kanalnummer"
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2429,62 +3067,62 @@ msgstr ""
"greier ikkje fastsetja kringkastingsinformasjon for lydfila %1 (%2), hoppar "
"over kringkastingsinformasjonen for denne fila"
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
-msgstr "greidde ikkje tildela fila %1 for å lesa"
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
+msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "Lydfilkjelde: greier ikkje leita fram til ramma %1 innan %2 (%3)"
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr "prøvde å skriva til ei ikkje-skrivbar lydkjeldefil (%1)"
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
msgstr "programmeringsfeil: %1 %2"
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr "prøvde å tømma ei ikkje-skrivbar lydkjeldefil (%1)"
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr "greidde ikkje tildela fila %1 for å skriva hovudet"
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
"prøvde å lagra kringastingsinfo til ei ikkje-skrivbar lydkjeldefil (%1)"
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr "prøvde å laga BWF-info for ei uopna lydkjeldefil (%1)"
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr "SndFileSource: \"%1\" feillesen returverdi: %2 av %5 (%3: %4)"
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr "SndFileSource: \"%1\" feilskriving (%2)"
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
@@ -2492,12 +3130,24 @@ msgstr ""
"Filkjelde: starttida er alt sett for denne fila (%1): kan ikkje endra "
"starttid."
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2516,7 +3166,7 @@ msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
"Høgtalaroppsettet manglar opplysingar om avstand - høgtalaren ikkje medteken"
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2524,107 +3174,137 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr "Greier ikkje setja saman bandspor-reguttrykk til bruk (%1)"
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "TempoSection-XML-punktet har ingen \"start\"-eigenskap"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "TempoSection-XML-punktet har ein ulovleg \"start\"-verdi"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
-#: tempo.cc:95
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr "TempoSection-XML-punktet har ingen \"slag per minutt\"-eigenskap"
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr "TempoSection-XML-punktet har ein ulovleg \"slag per minutt\"-verdi"
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr "TempoSection-XML-punktet har ein ulovleg \"note-type\"-verdi"
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr "TempoSection-XML-punktet har ingen \"flyttbar\"-eigenskap"
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
msgstr ""
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "MeterSection-XML-punktet har ingen \"start\"-eigenskap"
-
-#: tempo.cc:210
+#: tempo.cc:471
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr "MeterSection-XML-punktet har ein ulovleg \"start\"-verdi"
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr "MeterSection-XML-punktet har ingen \"notetype\"-eigenskap"
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr "MeterSection-XML-punktet har ein ulovleg \"start\"-verdi"
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr "MeterSection-XML-punktet har ingen \"flyttbar\"-eigenskap"
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
-#: tempo.cc:650
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
"ingen temposeksjonar sette opp i tempokartet - kan ikkje endra tempoet ved %1"
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
msgid "programming error: no tempo section in tempo map!"
msgstr "programmeringsfeil: ikkje noko tempoavsnitt i tempokartet!"
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
-msgstr "programmeringsfeil: uhandtert MetricSection-type"
-
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1185
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
"Tempokart: greidde ikkje fastsetja den nye tilstanden, hentar fram att den "
"gamle."
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr ""
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr ""
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "programmeringsfeil: uhandtert MetricSection-type"
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr "Tempokart"
@@ -2651,6 +3331,14 @@ msgid ""
"Are you sure you want to do this?"
msgstr ""
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr "Punkt for bundelen har ingen \"namn\"-eigenskap"
@@ -2672,62 +3360,132 @@ msgstr "Punktet for kanalen har ingen \"type\"-eigenskap"
msgid "Node for Port has no \"name\" property"
msgstr "Punktet for porten har ingen \"namn\"-eigenskap"
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
msgid "Splice"
msgstr "Splitt"
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
msgid "Slide"
msgstr "Gli"
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr "LÃ¥s"
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr "programmeringsfeil: ukjend redigeringsmodus-streng \"%1\""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr "MIDI-tidskode"
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
msgid "MTC"
msgstr "MTC"
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr "MIDI-klokke"
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
msgid "JACK"
msgstr "JACK"
-#: utils.cc:470
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
+msgstr ""
+
+#: utils.cc:464
msgid "programming error: unknown sync source string \"%1\""
msgstr "programmeringsfeil: ukjend synkkjeldestreng \"%1\""
-#: utils.cc:495
+#: utils.cc:489
msgid "M-Clock"
msgstr ""
-#: utils.cc:501
-msgid "LTC"
-msgstr ""
-
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr "programmeringsfeil: ukjent opphavleg hovudformat: \"%1\""
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr "greier ikkje opna mappa %1 (%2)"
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#~ msgstr "Lydkjelde: kan ikkje opna toppstig (c) \"%1\" (%2)"
+
+#~ msgid "8bit"
+#~ msgstr "8-bit"
+
+#~ msgid "16bit"
+#~ msgstr "16-bit"
+
+#~ msgid "24bit"
+#~ msgstr "24-bit"
+
+#~ msgid "32bit"
+#~ msgstr "32-bit"
+
+#~ msgid "8bit unsigned"
+#~ msgstr "8bit usignert"
+
+#~ msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#~ msgstr ""
+#~ "Redigering: greier ikkje opna \"%1\" som eksportfil for CD-markørfil"
+
+#~ msgid "transpose"
+#~ msgstr "transponer"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr "feilforma tingingsnykjelstreng i tilstandsfil! [%1] ... hoppa over."
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64-bits WAV)"
+
+#~ msgid "Signed 16 bit PCM"
+#~ msgstr "Signert 16bit PCM"
+
+#~ msgid "Signed 24 bit PCM"
+#~ msgstr "Signert 24bit PCM"
+
+#~ msgid "Signed 32 bit PCM"
+#~ msgstr "Signert 32bit PCM"
+
+#~ msgid "Signed 8 bit PCM"
+#~ msgstr "Signert 8bit PCM"
+
+#~ msgid "32 bit float"
+#~ msgstr "32-bit flytpunkt"
+
+#~ msgid "could not allocate file %1 for reading."
+#~ msgstr "greidde ikkje tildela fila %1 for å lesa"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "TempoSection-XML-punktet har ingen \"start\"-eigenskap"
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "TempoSection-XML-punktet har ein ulovleg \"start\"-verdi"
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "MeterSection-XML-punktet har ingen \"start\"-eigenskap"
+
#~ msgid ""
#~ "You have requested an operation that requires audio analysis.\n"
#~ "\n"
diff --git a/libs/ardour/po/pl.mo b/libs/ardour/po/pl.mo
new file mode 100644
index 0000000..6d67e04
Binary files /dev/null and b/libs/ardour/po/pl.mo differ
diff --git a/libs/ardour/po/pl.po b/libs/ardour/po/pl.po
index e6c4f7b..c6fe0fe 100644
--- a/libs/ardour/po/pl.po
+++ b/libs/ardour/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2008-04-10 10:51+0100\n"
"Last-Translator: Piotr Zaryk <pzaryk at gmail.com>\n"
"Language-Team: Polish <pl at li.org>\n"
@@ -16,86 +16,239 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr ""
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
msgstr ""
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
msgstr ""
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
msgstr "bÅÄ
d programisty: %1"
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
msgstr ""
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr ""
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
msgstr ""
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -125,10 +278,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr ""
@@ -152,26 +306,30 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr "wejÅcie 1"
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr ""
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr ""
@@ -192,19 +350,19 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -212,13 +370,14 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr ""
@@ -226,162 +385,190 @@ msgstr ""
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr ""
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr ""
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr ""
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr ""
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
@@ -398,7 +585,7 @@ msgstr "nie można zlokalizowaÄ taktowania CPU w /proc/cpuinfo"
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr ""
@@ -410,11 +597,11 @@ msgstr ""
msgid "main outs"
msgstr ""
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr ""
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
@@ -426,23 +613,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr ""
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr ""
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr ""
@@ -478,23 +665,27 @@ msgstr ""
msgid "Lossless compression"
msgstr ""
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr ""
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
msgstr ""
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
msgid "trim"
msgstr ""
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr ""
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr ""
@@ -510,24 +701,20 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
#: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
msgstr ""
#: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
msgstr ""
#: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
msgstr ""
#: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
msgstr ""
#: export_formats.cc:167
@@ -539,7 +726,7 @@ msgid "double"
msgstr ""
#: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
msgstr ""
#: export_formats.cc:173
@@ -550,94 +737,90 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:360
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr ""
-#: export_handler.cc:366
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr ""
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr ""
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr ""
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr ""
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr ""
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr ""
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr ""
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr ""
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr ""
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr ""
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr ""
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr ""
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
msgstr ""
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -646,25 +829,25 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr ""
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr ""
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
@@ -678,34 +861,38 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
msgstr ""
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
@@ -713,50 +900,79 @@ msgstr ""
msgid "filter: error creating name for new file based on %1"
msgstr ""
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr ""
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:236
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:244
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
msgid "Loading configuration"
msgstr ""
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr ""
@@ -782,7 +998,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
msgstr ""
#: import.cc:475
@@ -809,110 +1025,113 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr ""
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr ""
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr "wejÅcie"
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr "wyjÅcie"
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr ""
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr ""
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr ""
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr ""
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -929,81 +1148,81 @@ msgstr ""
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr ""
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr ""
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr ""
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr ""
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr ""
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr ""
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr ""
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr ""
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr ""
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr ""
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr ""
@@ -1045,48 +1264,104 @@ msgid ""
"You may rename the imported location:"
msgstr ""
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr ""
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1106,31 +1381,47 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
msgstr ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1138,57 +1429,57 @@ msgstr ""
msgid "MIDI stretch created non-MIDI source"
msgstr ""
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr ""
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr ""
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr ""
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr ""
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr ""
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr ""
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr ""
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr ""
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1244,7 +1535,7 @@ msgstr ""
msgid "fixed time region copy"
msgstr ""
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
@@ -1278,19 +1569,67 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr ""
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr ""
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr ""
@@ -1302,125 +1641,245 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr ""
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr ""
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr ""
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr ""
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
msgstr ""
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr ""
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr ""
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr ""
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr ""
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
msgstr ""
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:450
+#: port.cc:504
msgid "could not reregister %1"
msgstr "nie można byÅo zarejestrowaÄ %1"
@@ -1428,150 +1887,215 @@ msgstr "nie można byÅo zarejestrowaÄ %1"
msgid "insert %1"
msgstr ""
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr ""
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
msgstr ""
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
msgstr ""
-#: port_manager.cc:292
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr ""
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr ""
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr ""
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr ""
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
msgstr ""
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr ""
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr ""
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr "Plik konfiguracji %1 nie zapisany"
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr ""
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr ""
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr ""
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr ""
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr ""
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr ""
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1240
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2186
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
msgstr ""
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:4996
+msgid "mid"
msgstr ""
-#: route_group.cc:459
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr ""
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
@@ -1580,205 +2104,245 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr ""
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr ""
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr ""
-#: session.cc:362
+#: session.cc:484
msgid "Session loading complete"
msgstr ""
-#: session.cc:434
+#: session.cc:575
msgid "Set up LTC"
msgstr ""
-#: session.cc:436
+#: session.cc:577
msgid "Set up Click"
msgstr ""
-#: session.cc:438
+#: session.cc:579
msgid "Set up standard connections"
msgstr ""
-#: session.cc:664
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr "nie można byÅo ustawiÄ I/O metronomu"
-#: session.cc:727
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr ""
-#: session.cc:729
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr "wyjÅcie %<PRIu32>"
-#: session.cc:744
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "wyjÅcie %<PRIu32>+%<PRIu32>"
-#: session.cc:761
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr ""
-#: session.cc:763
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr "wejÅcie %<PRIu32>"
-#: session.cc:778
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "wejÅcie %<PRIu32>+%<PRIu32>"
-#: session.cc:852
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1085
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1270
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1297
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1329
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1497
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1751
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:2053
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
msgstr ""
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2297
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr ""
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2475
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2501
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2531
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3671
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:4316
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4328
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4340
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4352
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4477
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4486
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr ""
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "nie można otworzyÄ pliku dźwiÄkowego metronomu %1 (%2)"
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "nie można odczytaÄ danych z pliku dźwiÄkowego metronomu"
@@ -1817,23 +2381,36 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
msgstr ""
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr ""
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr ""
@@ -1843,412 +2420,465 @@ msgid ""
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr ""
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr ""
-#: session_state.cc:331
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:430
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:437
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:444
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:451
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:458
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:465
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:472
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:486
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:526
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
msgstr ""
-#: session_state.cc:606
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:630
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:658
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:685
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:736
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:746
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:814
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:826
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:835
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1147
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1201
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1206
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1217
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1224
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1231
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1244
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1251
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1271
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1283
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1291
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1312
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1319
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1327
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1373
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1377
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1382
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1386
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1485
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1545
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1549
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1585
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1613
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1625
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1687
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1765
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1799
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1807
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1813
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1872
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1880
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1979
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1992
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1998
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2008
+#: session_state.cc:2259
msgid "template not saved"
msgstr ""
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
msgstr ""
-#: session_state.cc:2834
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2873
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2891
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3204
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3213
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3216
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3220
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3245
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3251
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3293
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3304
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3315
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3323
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3559
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3564
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr ""
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr ""
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
msgstr ""
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr ""
@@ -2265,8 +2895,8 @@ msgid "CAF"
msgstr "CAF"
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
#: sndfile_helpers.cc:38
msgid "FLAC"
@@ -2309,23 +2939,23 @@ msgid ".raw"
msgstr ".raw"
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
msgstr ""
#: sndfile_helpers.cc:83
@@ -2336,88 +2966,108 @@ msgstr "Little-endian (Intel)"
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
msgstr ""
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2433,7 +3083,7 @@ msgstr ""
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2441,104 +3091,134 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
msgstr ""
-#: tempo.cc:95
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
msgstr ""
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
msgstr ""
-#: tempo.cc:220
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
-#: tempo.cc:650
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
msgstr ""
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1185
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr ""
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr ""
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr ""
@@ -2563,6 +3243,14 @@ msgid ""
"Are you sure you want to do this?"
msgstr ""
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr ""
@@ -2584,62 +3272,74 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
msgid "Splice"
msgstr ""
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
msgid "Slide"
msgstr ""
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr ""
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
msgid "MTC"
msgstr "MTC"
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
msgid "JACK"
msgstr "JACK"
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
msgstr ""
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
msgstr ""
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr ""
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64 bit WAV)"
+
#~ msgid "monitor"
#~ msgstr "monitor"
diff --git a/libs/ardour/po/ru.mo b/libs/ardour/po/ru.mo
new file mode 100644
index 0000000..30d0a0b
Binary files /dev/null and b/libs/ardour/po/ru.mo differ
diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po
index dac67d7..62d96a7 100644
--- a/libs/ardour/po/ru.po
+++ b/libs/ardour/po/ru.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 03:46+0300\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2016-01-07 04:14+0300\n"
"Last-Translator: Alexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
"Language-Team: ÑÑÑÑкий <>\n"
@@ -21,32 +21,23 @@ msgstr ""
"|| n%100>=20) ? 1 : 2);\n"
"X-Generator: Gtranslator 2.91.7\n"
-#: amp.cc:57 automatable.cc:173
-msgid "Trim"
-msgstr ""
-
-#: amp.cc:57 automatable.cc:171
-msgid "Fader"
-msgstr "ФейдеÑ"
-
-#: amp.cc:448
-#, c-format
-msgid "%3.1f dB"
-msgstr "%3.1f Ðб"
-
-#: amp.cc:489
+#: amp.cc:412
#, c-format
msgid "%.2fdB"
msgstr "%.2f Ðб"
-#: analyser.cc:119 audioregion.cc:1762
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr "Ðе ÑдалоÑÑ Ð²ÑполниÑÑ Ð°Ð½Ð°Ð»Ð¸Ð· ÑÑанзиенÑов Ð´Ð»Ñ %1."
-#: analyser.cc:119
+#: analyser.cc:121
msgid "Audio File Source"
msgstr "ÐÑÑоÑник звÑкового Ñайла"
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
#: audio_backend.cc:31
msgid "No Error occurred"
msgstr ""
@@ -187,7 +178,7 @@ msgstr "ÐÑибка: законÑилаÑÑ ÑÐ²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¼ÑÑÑ"
msgid "Could not reconnect to Audio/MIDI engine"
msgstr ""
-#: audio_backend.cc:107 export_formats.cc:52 session.cc:6238 session.cc:6258
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
msgid "None"
msgstr "ÐеÑ"
@@ -262,7 +253,7 @@ msgstr "%1: невозможно ÑоздаÑÑ ÑелÑноÑайловÑÑ Ð¾
msgid "Could not open %1. Audio Library not saved"
msgstr "Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ %1. ÐÑдио библиоÑека не ÑоÑ
Ñанена"
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -270,7 +261,7 @@ msgstr ""
"ÐлавнÑй пеÑеÑ
од ÑÑаÑÑвÑÑÑией вÑ
одÑÑей облаÑÑи оÑÑÑÑÑÑвÑÐµÑ Ð¿Ð»ÐµÐ¹Ð»Ð¸ÑÑе \"%1\" - "
"Склейка оÑменÑеÑÑÑ"
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -303,10 +294,11 @@ msgstr "ÐлоÑ
о ÑÑоÑмиÑованнÑй XML в импоÑÑиÑован
msgid "Audio Playlists (unused)"
msgstr "ÐлейлиÑÑÑ Ð°Ñдио (неиÑполÑзованнÑе)"
-#: audio_playlist_source.cc:171 audiosource.cc:1046 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:398
-#: plugin_insert.cc:705 rb_effect.cc:327 session.cc:3550 session.cc:3588
-#: session.cc:4898 session_handle.cc:88 sndfilesource.cc:173
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr "ÐÑибка в пÑогÑамме: %1"
@@ -334,27 +326,27 @@ msgstr ""
"\n"
"Ðаналов: "
-#: audio_track.cc:176
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "ÐеизвеÑÑÐ½Ð°Ñ ÑвÑзка \"%1\" в ÑпиÑке Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° %2"
-#: audio_track.cc:178
+#: audio_track.cc:179
msgid "in 1"
msgstr "в 1"
-#: audio_track.cc:179
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr "ÐÐµÑ Ð²Ñ
однÑÑ
ÑвÑзок, доÑÑÑпнÑÑ
в каÑеÑÑве заменÑ"
-#: audio_track.cc:183
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "СвÑзка %1 не бÑла доÑÑÑпна - \"в 1\" иÑполÑзована вмеÑÑо неÑ"
-#: audio_track.cc:192
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr "ÐеадекваÑнÑй ÑÑ
одÑÑий ÑпиÑок каналов в XML Ñзле (% 1)"
-#: audio_track.cc:215 diskstream.cc:503 source.cc:149
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
msgid "%1: this session uses destructive tracks, which are not supported"
msgstr ""
@@ -378,19 +370,19 @@ msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ VAMP под назв
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ VAMP под названием \"%1\""
-#: audioengine.cc:753
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr "AudioEngine: невозможно загÑÑзиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ \"%1\" (%2)"
-#: audioengine.cc:759
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr "AudioEngine: бÑкÑнд на \"%1\" не Ð¸Ð¼ÐµÐµÑ ÑÑнкÑии деÑкÑипÑоÑов."
-#: audioengine.cc:838
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ Ð´Ð²Ð¸Ð¶Ð¾Ðº Ð´Ð»Ñ %1: %2"
-#: audioregion.cc:1718
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -398,24 +390,14 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-"ÐÑ Ð·Ð°Ð¿ÑоÑили опеÑаÑиÑ, ÑÑебÑÑÑÑÑ Ð°Ñдиоанализ.\n"
-"\n"
-"РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ñ ÐÐ°Ñ \"auto-analyse-audio\" оÑклÑÑен. ÐÑо ознаÑаеÑ, ÑÑо "
-"пеÑеÑ
однÑе даннÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑгенеÑиÑÐ¾Ð²Ð°Ð½Ñ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда поÑÑебÑеÑÑÑ.\n"
-"\n"
-"ÐÑли Ð²Ñ Ð´ÐµÐ»Ð°ÐµÑе ÑабоÑÑ, коÑоÑÐ°Ñ Ð¿Ð¾ÑÑебÑÐµÑ Ð¿ÐµÑеÑ
однÑÑ
даннÑÑ
на ÑегÑлÑÑной "
-"оÑнове, Ñо Ðам, веÑоÑÑно, ÑледÑÐµÑ Ð²ÐºÐ»ÑÑиÑÑ \"auto-analyse-audio\", заÑем "
-"закÑÑÑÑ Ardour и пеÑезапÑÑÑиÑÑ.\n"
-"\n"
-"ÐÑÐ¾Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³ не бÑÐ´ÐµÑ Ð¾ÑобÑажаÑÑÑÑ Ñнова, но ÐÑ Ð¼Ð¾Ð¶ÐµÑе замеÑиÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÑÑ "
-"задеÑÐ¶ÐºÑ Ð² ÑÑой и бÑдÑÑиÑ
опеÑаÑиÑÑ
пеÑеÑ
однÑÑ
обнаÑÑжений.\n"
-#: audioregion.cc:1762
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr "ÐвÑÐºÐ¾Ð²Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ"
@@ -493,73 +475,81 @@ msgstr "%1: не ÑдалоÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð¿Ð¸ÐºÐ¾Ð²Ñе даннÑе Ñ
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr "Ðе ÑдалоÑÑ ÑÑеÑÑ Ð¿Ð¸Ðº-Ñайл %1 в %2 (оÑибка: %3)"
-#: auditioner.cc:101
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr "ÐозвÑÐ°Ñ Ðº Reasonable Synth Ð´Ð»Ñ Ð¿ÑоÑлÑÑÐ¸Ð²Ð°Ð½Ð¸Ñ MIDI"
-#: auditioner.cc:103
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr "СинÑезаÑоÑа Ð´Ð»Ñ Ð¿ÑоÑлÑÑÐ¸Ð²Ð°Ð½Ð¸Ñ MIDI не найдено."
-#: auditioner.cc:159
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr ""
"ÐÐµÑ Ð´Ð¾ÑÑÑпнÑÑ
вÑÑ
одов Ð´Ð»Ñ Ð´Ð²Ð¸Ð¶ÐºÐ° пÑоÑлÑÑиваниÑ. ТÑебÑеÑÑÑ ÑÑÑное подклÑÑение"
-#: auditioner.cc:404 auditioner.cc:451
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Ðе ÑдалоÑÑ ÑÑÑановиÑÑ Ð¿ÑоÑеÑÑ Ð¾Ð±ÑабоÑки поÑока Ð´Ð»Ñ %1 каналов"
-#: auditioner.cc:439
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ ÑинÑезаÑÐ¾Ñ MIDI-пÑоÑлÑÑиваниÑ."
-#: auditioner.cc:458
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
"ÐÑоÑлÑÑивание в дÑÑгиÑ
облаÑÑÑÑ
, Ñем ÑÑо аÑдио или MIDI не поддеÑживаеÑÑÑ."
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr "Узел авÑомаÑизаÑии не Ð¸Ð¼ÐµÐµÑ Ð¿ÑÑевÑÑ
ÑвойÑÑв"
-#: automatable.cc:105
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr "Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ %2 Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки даннÑÑ
авÑомаÑизаÑии (%3)"
-#: automatable.cc:137
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð´Ð°Ð½Ð½Ñе авÑомаÑизаÑии из %2"
-#: automatable.cc:175
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "ФейдеÑ"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr "ÐÑиглÑÑиÑÑ"
-#: automation_control.cc:170
+#: automation_control.cc:228
msgid "record %1 automation"
msgstr ""
-#: automation_list.cc:396
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
"СпиÑок авÑомаÑизаÑии: не ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ Ð¸Ð· XML. ÐÑе ÑоÑки "
"игноÑиÑованÑ"
-#: automation_list.cc:442
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"СпиÑок авÑомаÑизаÑии: Ð½ÐµÑ x-кооÑдинаÑÑ, ÑоÑ
ÑанÑнной Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки.\n"
"ТоÑка игноÑиÑÑеÑÑÑ"
-#: automation_list.cc:448
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"СпиÑок авÑомаÑизаÑии: Ð½ÐµÑ y-кооÑдинаÑÑ, ÑоÑ
ÑанÑнной Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки.\n"
"ТоÑка игноÑиÑÑеÑÑÑ"
-#: automation_list.cc:462
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
@@ -610,7 +600,7 @@ msgstr "ControlProtocolManager: не ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð¼Ð¾Ð´Ñ
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "ControlProtocolManager: модÑÐ»Ñ \"%1\" не Ð¸Ð¼ÐµÐµÑ ÑÑнкÑии деÑкÑипÑоÑа."
-#: control_protocol_manager.cc:514
+#: control_protocol_manager.cc:516
msgid "Control protocol \"%1\" has no descriptor"
msgstr ""
@@ -630,7 +620,7 @@ msgstr "Ðе ÑдалоÑÑ Ð½Ð°Ð¹Ñи ÑаÑÑоÑÑ CPU в /proc/cpuinfo"
msgid "audio"
msgstr "аÑдио"
-#: data_type.cc:28 session.cc:2312
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr "MIDI"
@@ -642,7 +632,7 @@ msgstr "ÐеизвеÑÑно"
msgid "main outs"
msgstr "ÐлавнÑе вÑÑ
одÑ"
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr "СлÑÑаÑÑ"
@@ -658,25 +648,25 @@ msgstr "Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾ÑÑ Ð´Ð»Ñ ÑкÑпоÑÑа к
msgid "Export failed: %1"
msgstr "ÐкÑпоÑÑ Ð½Ðµ ÑдалÑÑ: %1"
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
"ÐÑиÑÑÑÑÑвÑÑÑÐ°Ñ Ð¿Ð°Ð¿ÐºÐ° ÑкÑпоÑÑа Ð´Ð»Ñ ÑÑой ÑеÑÑии (%1) не ÑÑÑеÑÑвÑеÑ. "
"ÐгноÑиÑовано"
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr "Ðез вÑемени"
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr "ÐекоÑÑекÑнÑй ÑоÑÐ¼Ð°Ñ Ð²Ñемени"
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr "Ðез даÑÑ"
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr "ÐекоÑÑекÑнÑй ÑоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ"
@@ -712,23 +702,27 @@ msgstr "СжаÑие Ñ Ð¿Ð¾ÑеÑÑми"
msgid "Lossless compression"
msgstr "СжаÑие без поÑеÑÑ"
-#: export_format_manager.cc:218 export_format_specification.cc:601
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr "ЧаÑÑоÑа ÑеÑÑии"
-#: export_format_specification.cc:556
-msgid "normalize"
-msgstr "ÐоÑмиÑовка"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
-#: export_format_specification.cc:560
+#: export_format_specification.cc:616
msgid "trim"
msgstr "ÐбÑезка"
-#: export_format_specification.cc:562
+#: export_format_specification.cc:618
msgid "trim start"
msgstr "ÐбÑезка наÑала"
-#: export_format_specification.cc:564
+#: export_format_specification.cc:620
msgid "trim end"
msgstr "ÐбÑезка конÑа"
@@ -780,22 +774,22 @@ msgstr "ФоÑÐ¼Ð°Ñ ÑÑмплов Vorbis"
msgid "No sample format"
msgstr "Ðез ÑоÑмаÑа ÑÑмплов"
-#: export_handler.cc:371
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr "Файл %1 загÑÑжен в %2"
-#: export_handler.cc:377
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
"ÐагÑÑзка на Soundcloud не ÑдалоÑÑ. Ðозможно, ваÑа ÑлекÑÑÐ¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑÑа или "
"паÑÐ¾Ð»Ñ Ð½ÐµÐ²ÐµÑнÑ.\n"
-#: export_handler.cc:503 export_handler.cc:506
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr "ÐÑоизоÑла оÑибка пÑи запиÑи TOC/CUE Ñайла: %1"
-#: export_handler.cc:796 export_handler.cc:854
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr "Ðевозможно пÑеобÑазоваÑÑ %1 в Latin-1 ÑекÑÑ"
@@ -807,59 +801,59 @@ msgstr "ÐоиÑк ÑоÑмаÑов ÑкÑпоÑÑа в %1"
msgid "Unable to create export format directory %1: %2"
msgstr "Ðевозможно ÑоздаÑÑ ÐºÐ°Ñалог ÑкÑпоÑÑного ÑоÑмаÑа %1: %2"
-#: export_profile_manager.cc:263
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr "Ðевозможно ÑдалиÑÑ Ð¿ÑоÑÐ¸Ð»Ñ ÑкÑпоÑÑа %1: %2"
-#: export_profile_manager.cc:352
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr "ÐÑделение"
-#: export_profile_manager.cc:616
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr "Ðевозможно пеÑеименоваÑÑ Ð¿ÑоÑÐ¸Ð»Ñ ÑкÑпоÑÑа %1 в %2: %3"
-#: export_profile_manager.cc:648
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr "Ðевозможно ÑдалиÑÑ Ð¿ÑоÑÐ¸Ð»Ñ ÑкÑпоÑÑа %1: %2"
-#: export_profile_manager.cc:666
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr "ÐеопÑеделÑннÑй ÑоÑмаÑ"
-#: export_profile_manager.cc:747
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ ÑоÑÐ¼Ð°Ñ ÑкÑпоÑÑа из %1"
-#: export_profile_manager.cc:753
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr "Ðе ÑдалоÑÑ ÑкÑпоÑÑиÑоваÑÑ ÑоÑÐ¼Ð°Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸Ð· %1"
-#: export_profile_manager.cc:847
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr "ÐÑÑезок вÑемени не Ñказан!"
-#: export_profile_manager.cc:851
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr "ÐÐµÑ Ð²ÑбÑаннÑÑ
каналов!"
-#: export_profile_manager.cc:855
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr "ÐекоÑоÑÑе ÐºÐ°Ð½Ð°Ð»Ñ Ð¿ÑÑÑÑ"
-#: export_profile_manager.cc:888
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr "ФоÑÐ¼Ð°Ñ Ð½Ðµ вÑбÑан!"
-#: export_profile_manager.cc:890
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr "ÐÑе ÐºÐ°Ð½Ð°Ð»Ñ Ð¿ÑÑÑÑ!"
-#: export_profile_manager.cc:892
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr "Ðдин или более из вÑбÑаннÑÑ
ÑоÑмаÑов не ÑовмеÑÑим Ñ ÑÑой ÑиÑÑемой!"
-#: export_profile_manager.cc:895
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
@@ -867,7 +861,7 @@ msgstr ""
"%1 поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко %2 каналов, но Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ %3 каналов в ваÑей "
"ÐонÑигÑÑаÑии каналов"
-#: file_source.cc:201 session_state.cc:3144
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -981,6 +975,11 @@ msgstr "Ðе ÑдалоÑÑ Ð¾Ð¿ÑеделиÑÑ ÑекÑÑий ÑабоÑий
msgid "unknown file type for session %1"
msgstr "ÐеизвеÑÑнÑй Ñип Ñайла Ð´Ð»Ñ ÑеÑÑии %1"
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr "%3.1f Ðб"
+
#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr "Ðе ÑдалоÑÑ ÑÑÑановиÑÑ ÑиÑÑемнÑй Ð»Ð¸Ð¼Ð¸Ñ Ð¾ÑкÑÑÑÑÑ
Ñайлов в \"unlimited\""
@@ -1002,27 +1001,27 @@ msgstr "Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑиÑÑемнÑй Ð»Ð¸Ð¼Ð¸Ñ Ð¾Ñ
msgid "Could not set system open files limit. Current limit is %1 open files"
msgstr ""
-#: globals.cc:473
+#: globals.cc:474
msgid "Loading configuration"
msgstr "ÐагÑÑзка конÑигÑÑаÑии"
-#: globals.cc:553 session.cc:1036
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
msgid "Monitor"
msgstr "ÐониÑоÑ"
-#: globals.cc:554 session_state.cc:633
+#: globals.cc:555 session_state.cc:642
msgid "Master"
msgstr "ÐаÑÑеÑ"
-#: globals.cc:555
+#: globals.cc:556
msgid "Control"
msgstr ""
-#: globals.cc:556
+#: globals.cc:557
msgid "Click"
msgstr ""
-#: globals.cc:557
+#: globals.cc:558
msgid "Mackie"
msgstr "Mackie"
@@ -1080,110 +1079,113 @@ msgstr ""
msgid "Unknown"
msgstr "ÐеизвеÑÑнÑй"
-#: instrument_info.cc:227
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr "ÐÑедÑÑÑановки %1 (банк %2)"
-#: internal_send.cc:315 internal_send.cc:316
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr "%1 - не ÑдалоÑÑ Ð½Ð°Ð¹Ñи лÑбÑÑ Ð´Ð¾ÑожкÑ/ÑÐ¸Ð½Ñ Ñ ID %2 Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ðº"
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IO: не ÑдалоÑÑ Ð¾ÑклÑÑиÑÑ Ð¿Ð¾ÑÑ %1 из %2"
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr "IO: не ÑдалоÑÑ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð²Ñ
одной поÑÑ %1"
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr "IO: не ÑдалоÑÑ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð²ÑÑ
одной поÑÑ %1"
-#: io.cc:599 io.cc:655
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "ÐепÑавилÑнÑй XML Ñзел \"%1\" одобÑеннÑй Ð´Ð»Ñ Ð¾Ð±ÑекÑа IO"
-#: io.cc:717
+#: io.cc:730
msgid "in"
msgstr "в"
-#: io.cc:717
+#: io.cc:730
msgid "out"
msgstr "за"
-#: io.cc:718
+#: io.cc:731
msgid "input"
msgstr "вÑ
од"
-#: io.cc:718
+#: io.cc:731
msgid "output"
msgstr "вÑÑ
од"
-#: io.cc:728
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "ÐеизвеÑÑнÑй Ð¿Ð°ÐºÐµÑ \"%1\" в ÑпиÑке Ð´Ð»Ñ %2 из %3"
-#: io.cc:794
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "ÐÐ°ÐºÐµÑ %1 не бÑл доÑÑÑпен - \"%2\" иÑполÑзован вмеÑÑо него"
-#: io.cc:797
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr "ÐÐµÑ %1 пакеÑов, доÑÑÑпнÑÑ
в каÑеÑÑве заменÑ"
-#: io.cc:901
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr "%1: не ÑдалоÑÑ ÑоздаÑÑ Ð¿Ð¾ÑÑÑ Ð²Ð²Ð¾Ð´Ð°/вÑвода"
-#: io.cc:1029 io.cc:1130
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: плоÑ
о ÑÑоÑмиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока в XML Ñзле Ð´Ð»Ñ Ð²Ñ
одов \"%1\""
-#: io.cc:1034 io.cc:1135
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr "ÐлоÑ
Ð°Ñ Ð²Ñ
Ð¾Ð´Ð½Ð°Ñ ÑÑÑока в XML Ñзле \"%1\""
-#: io.cc:1073
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: плоÑ
о ÑÑоÑмиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока в XML Ñзле Ð´Ð»Ñ Ð²ÑÑ
одов \"%1\""
-#: io.cc:1078
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: плоÑ
Ð°Ñ Ð²ÑÑ
Ð¾Ð´Ð½Ð°Ñ ÑÑÑока в XML Ñзле \"%1\""
-#: io.cc:1416
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1463
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr "%s вÑ
."
-#: io.cc:1465
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr "%s вÑÑ
."
-#: io.cc:1540 session.cc:842 session.cc:876
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr "Ðоно"
-#: io.cc:1542 session.cc:855 session.cc:890
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr "L"
-#: io.cc:1542 session.cc:857 session.cc:892
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr "R"
-#: io.cc:1544 io.cc:1550
-#, c-format
-msgid "%d"
-msgstr "%d"
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr "LADSPA: Ðевозможно оÑкÑÑÑÑ Ð¼Ð¾Ð´ÑлÑ:"
@@ -1202,7 +1204,7 @@ msgstr ""
"LADSPA: \"%1\" не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован, Ñ. к . он не Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполниÑÑ "
"INPLACE обÑабоÑкÑ"
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
@@ -1210,75 +1212,75 @@ msgstr ""
"иÑполÑзован некоÑÑекÑнÑй Ð½Ð¾Ð¼ÐµÑ Ð¿Ð°ÑамеÑÑа, иÑполÑзованного Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ \"%1\". "
"ÐÑо Ð¼Ð¾Ð¶ÐµÑ ÑказÑваÑÑ Ð½Ð° дизайн плагина или пÑеÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐºÐ¾ÑÑекÑнÑми"
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "ÐÑпÑавлен плоÑ
ой Ð¿Ð°ÐºÐµÑ LadspaPlugin::set_state"
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: Ð½ÐµÑ Ð½Ð¾Ð¼ÐµÑа поÑÑа LADSPA"
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: Ð½ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
поÑÑа LADSPA"
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr "Ðевозможно найÑи HOME. ÐÑедÑÑÑановки не ÑдаленÑ."
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ %1. ÐÑедÑÑÑановки не ÑоÑ
ÑаненÑ. (%2)"
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr "ÐÑибка ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñайла пÑеÑеÑов %1."
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr "Ðевозможно найÑи HOME. ÐÑедÑÑÑановки не ÑоÑ
ÑаненÑ."
-#: location.cc:459
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr "ÐÑ Ð½Ðµ можеÑе поÑÑавиÑÑ CD-маÑÐºÐµÑ Ð² ÑÑо положение"
-#: location.cc:611
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr "некоÑÑекÑнÑй XML Ñзел одобÑен Ð´Ð»Ñ Location::set_state"
-#: location.cc:616
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr "У XML-Ñзла позиÑии Ð½ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
ID"
-#: location.cc:620
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr "У XML-Ñзла позиÑии Ð½ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
имени"
-#: location.cc:627
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr "У XML-Ñзла позиÑии Ð½ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
о наÑале"
-#: location.cc:638
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr "У XML-Ñзла позиÑии Ð½ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
о конÑе"
-#: location.cc:645
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr "У XML-Ñзла позиÑии Ð½ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
о ÑлагаÑ
"
-#: location.cc:872
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr "ÐозиÑии: попÑÑка иÑполÑзоваÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑнÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÐºÐ°Ðº вÑбÑаннÑÑ"
-#: location.cc:1050
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "ÐевеÑнÑй Ñежим XML одобÑен Ð´Ð»Ñ Locations::set_state"
-#: location.cc:1063 session.cc:1542 session.cc:5722 session_state.cc:1169
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr "СеÑÑÑиÑ"
-#: location.cc:1130
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð¸Ð· Ñайла ÑеÑÑии, пÑоигноÑиÑовано"
@@ -1359,6 +1361,46 @@ msgstr "ЧаÑÑоÑа кадÑов ÑеÑÑии и LTC не ÑооÑвеÑÑÑ
msgid "flywheel"
msgstr "ÐаÑ
овик"
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
@@ -1440,19 +1482,19 @@ msgstr ""
msgid "Scene "
msgstr "СÑена"
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr "ÐÑÑÑÑÑÑвÑÐµÑ ÑойÑÑва паÑамеÑÑа на InterpolationStyle"
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr "ÐÑÑÑÑÑÑвÑÐµÑ ÑÑÐ¸Ð»Ñ ÑвойÑÑв на InterpolationStyle"
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr "ÐÑÑÑÑÑÑвÑÐµÑ ÑвойÑÑва паÑамеÑÑа на AutomationState"
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr "ÐÑÑÑÑÑÑвÑÑÑ ÑвойÑÑва ÑоÑÑоÑÐ½Ð¸Ñ Ð½Ð° AutomationState"
@@ -1460,39 +1502,39 @@ msgstr "ÐÑÑÑÑÑÑвÑÑÑ ÑвойÑÑва ÑоÑÑоÑÐ½Ð¸Ñ Ð½Ð° Automati
msgid "MIDI stretch created non-MIDI source"
msgstr "РаÑÑÑгивание MIDI Ñоздало не-MIDI иÑÑоÑник"
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr "ÐаглÑÑение мониÑоÑа"
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr "ÐодÑезание мониÑоÑа"
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr "ÐониÑÐ¾Ñ Ð¼Ð¾Ð½Ð¾"
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr "УÑÐ¾Ð²ÐµÐ½Ñ Ð·Ð°ÑÐµÐ¼Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð½Ð¸ÑоÑа"
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr "ÐониÑÐ¾Ñ ÑÑÐ¾Ð²ÐµÐ½Ñ ÑÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ñоло"
-#: monitor_processor.cc:511
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr "ÐÑÑезаÑÑ ÑпÑавление %1"
-#: monitor_processor.cc:512
+#: monitor_processor.cc:544
msgid "dim control"
msgstr "ÐонÑÑÐ¾Ð»Ñ ÑÑÑклоÑÑи"
-#: monitor_processor.cc:513
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr "ÐонÑÑÐ¾Ð»Ñ Ð¿Ð¾Ð»ÑÑноÑÑи"
-#: monitor_processor.cc:514
+#: monitor_processor.cc:546
msgid "solo control"
msgstr "ÐонÑÑÐ¾Ð»Ñ Ñоло"
@@ -1568,7 +1610,7 @@ msgstr "ÐопиÑование облаÑÑи"
msgid "fixed time region copy"
msgstr "ФикÑиÑованное вÑÐµÐ¼Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑи"
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
"ÐÑигодноÑÑÑ Ðº паноÑамиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоглаÑно XML-даннÑм Ð´Ð»Ñ %1, пÑоигноÑиÑовано"
@@ -1593,7 +1635,7 @@ msgstr "PannerManager: модÑÐ»Ñ \"%1\" не Ð¸Ð¼ÐµÐµÑ ÑÑнкÑии деÑ
msgid "no panner discovered for in/out = %1/%2"
msgstr "Ðе обнаÑÑжен Ð¿Ð°Ð½Ð½ÐµÑ Ð´Ð»Ñ Ð²Ñ
ода/вÑÑ
ода =%1/%2"
-#: panner_shell.cc:121
+#: panner_shell.cc:122
msgid ""
"No panner found: check that panners are being discovered correctly during "
"startup."
@@ -1601,25 +1643,73 @@ msgstr ""
"ÐÐ°Ð½Ð½ÐµÑ Ð½Ðµ найден: ÑбедиÑеÑÑ, ÑÑо паннеÑÑ Ð¾Ð±Ð½Ð°ÑÑживаÑÑÑÑ Ð¿ÑавилÑно во вÑÐµÐ¼Ñ "
"запÑÑка."
-#: panner_shell.cc:125
+#: panner_shell.cc:126
msgid "select panner: %1\n"
msgstr "ÐÑÐ±Ð¾Ñ Ð¿Ð°Ð½Ð¾ÑамиÑованиÑ: %1\n"
-#: panner_shell.cc:254
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
"Ðайден неизвеÑÑнÑй паннеÑ-плагин \"%1\" в ÑоÑÑоÑнии паноÑамиÑованиÑ. "
"ÐгноÑиÑовано"
-#: panner_shell.cc:260
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr "Узел паннеÑ-плагина не Ð¸Ð¼ÐµÐµÑ Ð¸Ð½ÑоÑмаÑии о Ñипе!"
-#: playlist.cc:2179
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr "СоÑÑоÑние Ñзла облаÑÑи не Ð¸Ð¼ÐµÐµÑ ID, пÑоигноÑиÑовано"
-#: playlist.cc:2197
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr "ÐлейлиÑÑ: не ÑдалоÑÑ ÑоздаÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð· XML"
@@ -1632,7 +1722,27 @@ msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
"Ðе ÑдалоÑÑ Ð¿Ð¾ÑÑÑоиÑÑ ÑпиÑок воÑпÑ. Ð´Ð»Ñ PlaylistSource из даннÑÑ
ÑеÑÑии!"
-#: plugin.cc:346
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "ÐÑдио"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -1640,7 +1750,7 @@ msgstr ""
"ÐаÑÑÑойки плагина не поддеÑживаÑÑÑÑ Ð² ÑÑой ÑбоÑке %1. РаÑÑмоÑÑиÑе "
"возможноÑÑÑ Ð¾Ð¿Ð»Ð°ÑÑ Ð·Ð° полнÑÑ Ð²ÐµÑÑиÑ"
-#: plugin.cc:429
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
@@ -1648,23 +1758,27 @@ msgstr ""
"СоÑ
Ñанение наÑÑÑоек плагина не поддеÑживаÑÑÑÑ Ð² ÑÑой ÑбоÑке %1. РаÑÑмоÑÑиÑе "
"возможноÑÑÑ Ð¾Ð¿Ð»Ð°ÑÑ Ð·Ð° полнÑÑ Ð²ÐµÑÑиÑ"
-#: plugin_insert.cc:597
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr "ÐÑогÑÐ°Ð¼Ð¼Ð½Ð°Ñ Ð¾Ñибка: "
-#: plugin_insert.cc:1022
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr "Ð XML-Ñзле опиÑÐ°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° оÑÑÑÑÑÑвÑÐµÑ Ð¿Ð¾Ð»Ðµ `type'"
-#: plugin_insert.cc:1037
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr "ÐеизвеÑÑнÑй Ñип плагина %1 в ÑÑаÑÑÑе вÑÑавки плагина"
-#: plugin_insert.cc:1065
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr "Ðлагин не Ð¸Ð¼ÐµÐµÑ ÑникалÑного иденÑиÑикаÑионного полÑ"
-#: plugin_insert.cc:1090
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
@@ -1673,171 +1787,175 @@ msgstr ""
"Ðозможно, он бÑл Ñдален или пеÑемеÑен Ñ ÑеÑ
поÑ, как бÑл в поÑледний Ñаз "
"иÑполÑзован."
-#: plugin_insert.cc:1247
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr "PluginInsert: Auto: Ð½ÐµÑ Ð½Ð¾Ð¼ÐµÑа поÑÑа LADSPA"
-#: plugin_insert.cc:1254
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr "PluginInsert: Auto: ID поÑÑа вне диапазона"
-#: plugin_insert.cc:1290
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
"PluginInsert: ÑпÑавление возможноÑÑÑÑ Ð°Ð²ÑомаÑизизаÑии %1 не найдено. "
"ÐгноÑиÑовано"
-#: plugin_manager.cc:217
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr "ÐбнаÑÑжение модÑлей"
-#: plugin_manager.cc:245
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr "СканиÑование плагинов LADSPA"
-#: plugin_manager.cc:248
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr "СканиÑование плагинов LV2"
-#: plugin_manager.cc:254
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr "СканиÑование плагинов Windows VST"
-#: plugin_manager.cc:256
+#: plugin_manager.cc:264
msgid "Discovering Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:265
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr "СканиÑование плагинов Linux VST"
-#: plugin_manager.cc:267
+#: plugin_manager.cc:275
msgid "Discovering Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:280
+#: plugin_manager.cc:288
msgid "VST Blacklist: "
msgstr "ЧÑÑнÑй ÑпиÑок VST"
-#: plugin_manager.cc:282
+#: plugin_manager.cc:290
msgid "VST Blacklist:"
msgstr "ЧÑÑнÑй ÑпиÑок VST:"
-#: plugin_manager.cc:292
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr "СканиÑование плагинов AU"
-#: plugin_manager.cc:294
+#: plugin_manager.cc:302
msgid "Discovering AU Plugins"
msgstr ""
-#: plugin_manager.cc:299
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr "СканиÑование плагинов завеÑÑено"
-#: plugin_manager.cc:483
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr "LADSPA"
-#: plugin_manager.cc:535
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr "Ðе ÑдалоÑÑ Ð¿ÑоанализиÑоваÑÑ RDF-Ñайл: %1"
-#: plugin_manager.cc:572
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: не ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ \"%1\" (%2)"
-#: plugin_manager.cc:579
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: модÑÐ»Ñ \"%1\" не Ð¸Ð¼ÐµÐµÑ ÑÑнкÑии деÑкÑипÑоÑа."
-#: plugin_manager.cc:778
+#: plugin_manager.cc:813
msgid "--- Windows VST plugins Scan: %1"
msgstr ""
-#: plugin_manager.cc:784
+#: plugin_manager.cc:819
msgid "VST"
msgstr "VST"
-#: plugin_manager.cc:789
+#: plugin_manager.cc:824
msgid "--- Windows VST plugins Scan Done"
msgstr ""
-#: plugin_manager.cc:804
+#: plugin_manager.cc:839
msgid "cannot open dll"
msgstr ""
-#: plugin_manager.cc:808
+#: plugin_manager.cc:843
msgid "invalid dll, file too small"
msgstr ""
-#: plugin_manager.cc:812
+#: plugin_manager.cc:847
msgid "not a dll"
msgstr ""
-#: plugin_manager.cc:818
+#: plugin_manager.cc:853
msgid "cannot determine dll type"
msgstr ""
-#: plugin_manager.cc:822
+#: plugin_manager.cc:857
msgid "cannot read dll PE header"
msgstr ""
-#: plugin_manager.cc:827
+#: plugin_manager.cc:862
msgid "invalid dll PE header"
msgstr ""
-#: plugin_manager.cc:834
+#: plugin_manager.cc:869
msgid "i386 (32-bit)"
msgstr "i386 (32-bit)"
-#: plugin_manager.cc:837
+#: plugin_manager.cc:872
msgid "Itanium"
msgstr "Itanium"
-#: plugin_manager.cc:840
+#: plugin_manager.cc:875
msgid "x64 (64-bit)"
msgstr "x64 (64-bit)"
-#: plugin_manager.cc:843
+#: plugin_manager.cc:878
msgid "Native Architecture"
msgstr ""
-#: plugin_manager.cc:846
+#: plugin_manager.cc:881
msgid "Unknown Architecture"
msgstr ""
-#: plugin_manager.cc:862
+#: plugin_manager.cc:897
msgid " * %1 (cache only)"
msgstr ""
-#: plugin_manager.cc:864
+#: plugin_manager.cc:899
msgid " * %1 - %2"
msgstr ""
-#: plugin_manager.cc:878
+#: plugin_manager.cc:913
msgid " -> Cannot get Windows VST information, plugin ignored."
msgstr ""
-#: plugin_manager.cc:889
+#: plugin_manager.cc:924
msgid ""
"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
"this time"
msgstr ""
-#: plugin_manager.cc:924
+#: plugin_manager.cc:959
msgid "Ignoring duplicate Windows VST plugin \"%1\""
msgstr ""
-#: plugin_manager.cc:936
+#: plugin_manager.cc:971
msgid " -> OK (VST Plugin \"%1\" was added)."
msgstr ""
-#: plugin_manager.cc:984
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr "LXVST"
-#: plugin_manager.cc:1011
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
@@ -1845,15 +1963,15 @@ msgstr ""
"linuxVST плагин %1 не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ processReplacing и поÑÑÐ¾Ð¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ "
"иÑполÑзован в %2 в ÑÑо вÑемÑ"
-#: plugin_manager.cc:1175
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr "неизвеÑÑнÑй ÑÑаÑÑÑ Ñипа плагина \"%1\". ÐÑе даннÑе пÑоигноÑиÑованÑ"
-#: plugin_manager.cc:1192
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr "ÐеизвеÑÑнÑй Ñип плагина \"%1\" - пÑоигноÑиÑован"
-#: port.cc:462
+#: port.cc:504
msgid "could not reregister %1"
msgstr "Ðе ÑдалоÑÑ Ð¿ÐµÑеÑегиÑÑÑиÑоваÑÑ %1"
@@ -1869,7 +1987,7 @@ msgstr "Ðо вÑÑавке XML-Ñзла опиÑÐ°Ð½Ð¸Ñ Ð¿Ð¾ÑÑа оÑÑÑÑ
msgid "non-port insert XML used for port plugin insert"
msgstr "ÐÑполÑзована беÑпоÑÑÐ¾Ð²Ð°Ñ Ð²ÑÑавка XML Ð´Ð»Ñ Ð²ÑÑавки поÑÑа плагина"
-#: port_manager.cc:285
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
@@ -1877,7 +1995,7 @@ msgstr ""
"ÐоÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%1\" Ñже ÑÑÑеÑÑвÑеÑ: пÑовеÑÑÑе дÑблиÑованнÑе имена доÑожек/"
"Ñин "
-#: port_manager.cc:287
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
@@ -1885,27 +2003,27 @@ msgstr ""
"ÐолÑÑе поÑÑов неÑ. Ðам нÑжно бÑÐ´ÐµÑ Ð¾ÑÑановиÑÑ Ð¸ пеÑезапÑÑÑиÑÑ %1 Ñ Ð±Ð¾Ð»ÑÑим "
"колиÑеÑÑвом поÑÑов, еÑли вам нÑжно много доÑожек."
-#: port_manager.cc:290
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr "AudioEngine: не ÑдалоÑÑ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð¿Ð¾ÑÑ \"%1\": %2"
-#: port_manager.cc:329
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ Ð¿Ð¾ÑÑ: %1"
-#: port_manager.cc:416
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "AudioEngine: не ÑдалоÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑ %1 (%2) к %3 (%4)"
-#: port_manager.cc:468 port_manager.cc:469
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr "ÐеÑеÑÑÑановка поÑÑа %1 не ÑдалаÑÑ"
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr "ÐÐµÑ %1 Ñлага ÑвойÑÑв в ÑлеменÑе %2"
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr "ÐÐµÑ Ð´Ð¾ÑеÑнего Ñзла Ñ Ð°ÐºÑивнÑми ÑвойÑÑвами"
@@ -1969,123 +2087,111 @@ msgstr ""
msgid "Error writing saved template file %1 (%2)"
msgstr ""
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
"ÐÑибка в пÑогÑамме: RegionFactory::create() вÑзÑваеÑÑÑ Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑнÑм Ñипом "
"облаÑÑи"
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr "%1 Ñоединение-%2 (%3)"
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr "%1 Ñоединение-%2.1 (%3)"
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr "Ðевозможно ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¾Ð±Ð»Ð°ÑÑи \"%1\""
-#: resampled_source.cc:106
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr "ÐмпоÑÑ: %1"
-#: resampled_source.cc:135 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr "ÐмпоÑÑ: src_new() не ÑдалÑÑ: %1"
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr "ÐозвÑÐ°Ñ %1"
-#: route.cc:840
-msgid "Cleared Explicit solo: %1\n"
-msgstr ""
-
-#: route.cc:843
-msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
-msgstr ""
-
-#: route.cc:1370 route.cc:2982
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr "ÐеизвеÑÑнÑй Ñип пÑоÑеÑÑоÑа \"%1\". ÐгноÑиÑован"
-#: route.cc:1392
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr "ÐÑоÑеÑÑÐ¾Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñоздан. ÐгноÑиÑован"
-#: route.cc:2405 route.cc:2630
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "ÐÑпÑавлен плоÑ
ой Ñзел в Route::set_state() [%1]"
-#: route.cc:2465
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr "СÑаÑÑÑ Ð¿Ð°Ð½Ð°ÑомиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ð¹Ð´ÐµÐ½ Ð´Ð»Ñ Ð¼Ð°ÑÑÑÑÑа (%1) без паннеÑа!"
-#: route.cc:2539 route.cc:2543 route.cc:2744 route.cc:2748
-msgid "badly formed order key string in state file! [%1] ... ignored."
-msgstr ""
-"ÐлоÑ
о ÑÑоÑмиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока поÑÑдкового клÑÑа в Ñайле ÑоÑÑоÑниÑ! [%1] ... "
-"игноÑиÑован."
-
-#: route.cc:2754
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
msgstr ""
-"ÐÑеобÑазование ÑÑÑаÑевÑего поÑÑдкового клÑÑа Ð´Ð»Ñ %1 Ñ Ð¸ÑполÑзованием "
-"ÑедакÑоÑа поÑÑдка %2"
-#: route.cc:3388
-msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
msgstr ""
-#: route.cc:5333
+#: route.cc:4994
msgid "lo"
msgstr ""
-#: route.cc:5335
+#: route.cc:4996
msgid "mid"
msgstr ""
-#: route.cc:5337
+#: route.cc:4998
msgid "hi"
msgstr ""
-#: route.cc:5444
+#: route.cc:5105
msgid "Leveler"
msgstr "ÐÑÑавниваÑелÑ"
-#: route.cc:5446
+#: route.cc:5107
msgid "Compressor"
msgstr "ÐомпÑеÑÑоÑ"
-#: route.cc:5448
+#: route.cc:5109 route.cc:5111
msgid "Limiter"
msgstr "ÐгÑаниÑиÑелÑ"
-#: route.cc:5451 route.cc:5453 route.cc:5469 route.cc:5471
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
msgid "???"
msgstr ""
-#: route.cc:5463
+#: route.cc:5126
msgid "Attk"
msgstr ""
-#: route.cc:5465
+#: route.cc:5128
msgid "Ratio"
msgstr ""
-#: route.cc:5467
+#: route.cc:5131
msgid "Rels"
msgstr ""
-#: route_group.cc:459
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr "СейÑÐ°Ñ Ð²Ñ Ð½Ðµ можеÑе подгÑÑппиÑоваÑÑ MIDI-доÑожки"
-#: route_group.cc:466
+#: route_group.cc:514
msgid ""
"You cannot subgroup tracks with different number of outputs at this time."
msgstr ""
@@ -2098,128 +2204,128 @@ msgstr "tempoize: ÐÑибка ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
из %1 на %2 (ожи
msgid "error writing tempo-adjusted data to %1"
msgstr "ÐÑибка запиÑи Ñемпа Ñ Ð¿Ð¾Ð¿Ñавкой на даннÑе в %1"
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr "aux %1"
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr "ÐÑпÑавиÑÑ %1"
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr "оÑибка в пÑогÑамме: оÑпÑавка Ñоздана пÑи помоÑи Ñолей %1"
-#: session.cc:317 session.cc:371
+#: session.cc:348 session.cc:403
msgid "Cannot connect to audio/midi engine"
msgstr ""
-#: session.cc:327
+#: session.cc:358
msgid "Session initialization failed"
msgstr ""
-#: session.cc:343
+#: session.cc:374
msgid "Failed to load template/snapshot state"
msgstr ""
-#: session.cc:354
+#: session.cc:385
msgid "Failed to load state"
msgstr ""
-#: session.cc:377
+#: session.cc:409
msgid "Cannot configure audio/midi engine with session parameters"
msgstr ""
-#: session.cc:400
+#: session.cc:433
msgid "Connect to engine"
msgstr "Соединение Ñо звÑковÑм движком"
-#: session.cc:451
+#: session.cc:484
msgid "Session loading complete"
msgstr "ÐагÑÑзка ÑеÑÑии завеÑÑена"
-#: session.cc:522
+#: session.cc:575
msgid "Set up LTC"
msgstr "ÐаÑÑÑойка LTC"
-#: session.cc:524
+#: session.cc:577
msgid "Set up Click"
msgstr "ÐаÑÑÑойка Click"
-#: session.cc:526
+#: session.cc:579
msgid "Set up standard connections"
msgstr "ÐаÑÑÑойка обÑÑнÑÑ
Ñоединений"
-#: session.cc:773
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr "не ÑдалоÑÑÑ Ð½Ð°ÑÑÑоиÑÑ Click I/O"
-#: session.cc:836
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr "out %s"
-#: session.cc:838
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr "out %<PRIu32>"
-#: session.cc:853
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "out %<PRIu32>+%<PRIu32>"
-#: session.cc:870
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr "in %s"
-#: session.cc:872
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr "in %<PRIu32>"
-#: session.cc:887
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "in %<PRIu32>+%<PRIu32>"
-#: session.cc:967
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr "Ðе ÑдалоÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑ Ð²ÑÑ
од master %1 к %2"
-#: session.cc:1050
+#: session.cc:1170
msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:1084 session.cc:1210
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr "Ðе ÑдалоÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑ ÑпÑавление вÑ
ода %1 к %2"
-#: session.cc:1104 session.cc:1229
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "ÐÑедпоÑиÑаемÑй I/O Ð´Ð»Ñ ÑÐ¸Ð½Ñ Ð¼Ð¾Ð½Ð¸ÑоÑа (%1) не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½"
-#: session.cc:1135 session.cc:1260
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr "Ðе ÑдалоÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑÑ
одом %1 к %2"
-#: session.cc:1318
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "Ðевозможно ÑоздаÑÑ Auditioner: пÑоÑлÑÑивание облаÑÑей невозможно"
-#: session.cc:1519
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"СеÑÑиÑ: Ð²Ñ Ð½Ðµ можеÑе иÑполÑзоваÑÑ ÑÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð´Ð»Ñ Ð°Ð²ÑовÑезки (наÑало <= "
"конеÑ)"
-#: session.cc:1546
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
"СеÑÑиÑ: Ð²Ñ Ð½Ðµ можеÑе иÑполÑзоваÑÑ ÑÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð² каÑеÑÑве наÑала/конÑа ÑеÑÑии"
-#: session.cc:1578
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -2227,31 +2333,31 @@ msgstr ""
"ÐÑ Ð½Ðµ можеÑе иÑполÑзоваÑÑ ÑÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð´Ð»Ñ Ð°Ð²ÑоÑикла, поÑколÑÐºÑ Ñ Ð½ÐµÑ Ð½ÑÐ»ÐµÐ²Ð°Ñ "
"или оÑÑиÑаÑелÑÐ½Ð°Ñ Ð´Ð»Ð¸ÑелÑноÑÑÑ"
-#: session.cc:1761
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr "ÐÑибка в пÑогÑамме: диапазон ÑеÑÑии ÑдалÑн!"
-#: session.cc:2021
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr "ÐаÑÑÑойка пеÑли обÑаÑной ÑвÑзи Ð¼ÐµÐ¶Ð´Ñ %1 и %2"
-#: session.cc:2281
+#: session.cc:2419
msgid "Track "
msgstr ""
-#: session.cc:2283
+#: session.cc:2421
msgid "Audio "
msgstr ""
-#: session.cc:2288
+#: session.cc:2426
msgid "MIDI "
msgstr ""
-#: session.cc:2363
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr "СеÑÑиÑ: не ÑдалоÑÑ ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ MIDI-доÑожкÑ"
-#: session.cc:2369
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@@ -2259,80 +2365,92 @@ msgstr ""
"ÐоÑÑÑпнÑÑ
поÑÑов JACK болÑÑе неÑ. Ðам нÑжно оÑÑановиÑÑ %1 и пеÑезапÑÑÑиÑÑ "
"JACK Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом поÑÑов, еÑли вам нÑжно болÑÑе доÑожек."
-#: session.cc:2889 session.cc:2897 session.cc:2981 session.cc:2989
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "СеÑÑиÑ: не ÑдалоÑÑ ÑоздаÑÑ Ð½Ð¾Ð²Ñй маÑÑÑÑÑ."
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
"Ðе ÑдалоÑÑ Ð½Ð°ÑÑÑоиÑÑ %1 в/%2 из конÑигÑÑаÑии Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ звÑковой доÑожки"
-#: session.cc:2922
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr "СеÑÑиÑ: не ÑдалоÑÑ ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð·Ð²ÑковÑÑ Ð´Ð¾ÑожкÑ."
-#: session.cc:2959 session.cc:2962
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr "Шина"
-#: session.cc:3014
-msgid "Session: could not create new audio route."
-msgstr "СеÑÑиÑ: не ÑдалоÑÑ ÑоздаÑÑ Ð½Ð¾Ð²Ñй маÑÑÑÑÑ."
-
-#: session.cc:3087 session.cc:3097
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr "СеÑÑиÑ: UINT_MAX маÑÑÑÑÑÑ? Ðевозможно!"
-#: session.cc:3130
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr "СеÑÑиÑ: нелÑÐ·Ñ ÑоздаÑÑ Ð´Ð¾ÑожкÑ/ÑÐ¸Ð½Ñ Ð¸Ð· Ñаблоннного опиÑаниÑ"
-#: session.cc:3173
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr "СеÑÑиÑ: не ÑдалоÑÑ ÑоздаÑÑ Ð½Ð¾Ð²Ñй маÑÑÑÑÑ Ð¸Ð· Ñаблона"
-#: session.cc:3207
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr "Ðе ÑдалоÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð½Ð¾Ð²Ñе доÑожки/ÑинÑ"
-#: session.cc:4445
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr "СлиÑние вÑÑÑоенного Ñайла %1: пÑоÑивоÑеÑие Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸ MD5 Ñ
еÑа!"
-#: session.cc:4575 session.cc:4648
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Уже еÑÑÑ %1 запиÑей Ð´Ð»Ñ %2, коÑоÑÑÑ
, ÑÑиÑаеÑÑÑ, ÑлиÑком много."
-#: session.cc:5090
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr "ÐÑпÑавленное ID %1, кажеÑÑÑ, Ñже иÑполÑзÑеÑÑÑ"
-#: session.cc:5102
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr "Ðо-видимомÑ, aux поÑÑл ID %1 Ñже иÑполÑзÑеÑÑÑ"
-#: session.cc:5114
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr "ÐозвÑÐ°Ñ ID% 1, по-видимомÑ, Ñже иÑполÑзÑеÑÑÑ"
-#: session.cc:5126
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr "Ðо-видимомÑ, вÑÑавка ID %1 Ñже иÑполÑзÑеÑÑÑ"
-#: session.cc:5251
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Ðевозможно запиÑаÑÑ ÑÑд, где ÐºÐ¾Ð½ÐµÑ <= пÑÑка (напÑимеÑ, %1 <= %2)"
-#: session.cc:5260
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr "Ðевозможно запиÑаÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð±ÐµÐ· даннÑÑ
."
-#: session.cc:5302
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr "невозможно ÑоздаÑÑ Ð½Ð¾Ð²Ñй Ñайл \"%1\" Ð´Ð»Ñ %2"
-#: session_click.cc:163
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr "Ðе ÑдаеÑÑÑ Ð¾ÑкÑÑÑÑ ÐºÐ»Ð¸ÐºÐ¾Ð¼ звÑковой Ñайл %1 (%2)"
-#: session_click.cc:176
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr "Ðе ÑдалоÑÑ ÑÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе Ð¾Ñ ÐºÐ»Ð¸ÐºÐ° на звÑковой Ñайл"
@@ -2400,11 +2518,11 @@ msgstr ""
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr "СеÑÑиÑ: не ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð²Ð° ÑобÑÑÐ¸Ñ Ñипа %1 на Ñом же кадÑе (%2)."
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr "% 1: невозможно иÑкаÑÑ Ð½Ð° %2 Ð´Ð»Ñ ÑкÑпоÑÑа"
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr "ÐкÑпоÑÑ Ð·Ð°ÐºÐ¾Ð½ÑилÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾: %1"
@@ -2416,11 +2534,11 @@ msgstr ""
"LTC кодеÑ: невеÑÐ½Ð°Ñ ÑаÑÑоÑа кадÑов. LTC кодиÑование оÑклÑÑено Ð´Ð»Ñ "
"оÑÑавÑегоÑÑ Ð² ÑÑой ÑеÑÑии."
-#: session_midi.cc:534
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "СеÑÑиÑ: невозможно оÑпÑавиÑÑ ÑеÑвеÑÑÑ-кадÑовое MTC ÑообÑение (%1)"
-#: session_playlists.cc:402 session_playlists.cc:421
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ ÑпиÑок воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ð· опиÑÐ°Ð½Ð¸Ñ XML."
@@ -2428,103 +2546,103 @@ msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ ÑпиÑок воÑп
msgid "Session: error in no roll for %1"
msgstr "СеÑÑиÑ: оÑибка непÑокÑÑÑки Ð´Ð»Ñ %1"
-#: session_process.cc:1199
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "ÐÑибка в пÑогÑамме: некоÑÑекÑнÑй Ñип ÑобÑÑÐ¸Ñ Ð² process_event (%1)"
-#: session_state.cc:187
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr "ÐонÑÑÐ¾Ð»Ñ Ð²ÑÑезки Ñоло (дÐ)"
-#: session_state.cc:209
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr "УÑÑановка ÑазмеÑа блока и ÑаÑÑоÑÑ ÑÑмплиÑованиÑ"
-#: session_state.cc:214
+#: session_state.cc:221
msgid "Using configuration"
msgstr "ÐÑименÑеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ"
-#: session_state.cc:339
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr "СбÑÐ¾Ñ ÑдалÑнного ÑпÑавлениÑ"
-#: session_state.cc:368 session_state.cc:400
+#: session_state.cc:377 session_state.cc:409
msgid "Filling playback buffers"
msgstr ""
-#: session_state.cc:466
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" Ñ Ð¿Ð¸Ðº-Ñайлами (%2)"
-#: session_state.cc:473
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" Ñо звÑковÑми Ñайлами (%2)"
-#: session_state.cc:480
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" Ñ Ñайлами MIDI (%2)"
-#: session_state.cc:487
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
"СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" Ñ ÑÑеÑÑннÑми звÑками (%2)"
-#: session_state.cc:494
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" Ð´Ð»Ñ ÑкÑпоÑÑа (%2)"
-#: session_state.cc:501
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
"СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" Ñ Ð´Ð°Ð½Ð½Ñми анализа (%2)"
-#: session_state.cc:508
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" плагинов (%2)"
-#: session_state.cc:515
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
"СеÑÑиÑ: невозможно ÑоздаÑÑ ÑеÑÑионнÑÑ Ð¿Ð°Ð¿ÐºÑ \"%1\" Ñ Ð²Ð½ÐµÑними даннÑми (%2)"
-#: session_state.cc:529
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ Ð¿Ð°Ð¿ÐºÑ ÑеÑÑии \"%1\" (%2)"
-#: session_state.cc:560
+#: session_state.cc:569
msgid "Error reading session template file %1 (%2)"
msgstr ""
-#: session_state.cc:575
+#: session_state.cc:584
msgid "Error writing session template file %1 (%2)"
msgstr ""
-#: session_state.cc:592
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr "Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Ñаблона ÑеÑÑии"
-#: session_state.cc:599
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr "Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ Ñаблон ÑеÑÑии %1 Ð´Ð»Ñ ÑÑениÑ"
-#: session_state.cc:617
+#: session_state.cc:626
msgid "Loop"
msgstr "ÐеÑлÑ"
-#: session_state.cc:698
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr "Ðе ÑдалоÑÑ ÑдалиÑÑ ÑоÑÑоÑние оÑложенного заÑ
ваÑа по пÑÑи \"%1\" (%2)"
-#: session_state.cc:722
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "Ðе ÑдалоÑÑ Ð¿ÐµÑеименоваÑÑ Ñнимок %1 в %2 (%3)"
-#: session_state.cc:750
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr "Ðе ÑдалоÑÑ ÑдалиÑÑ Ñайл ÑеÑÑии по пÑÑи \"%1\" (%2)"
-#: session_state.cc:777
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -2532,143 +2650,143 @@ msgstr ""
"ÐвÑковой движок %1 не подклÑÑен и ÑÑаÑÑÑ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²ÐµÐ´ÑÑ Ðº поÑеÑе вÑÑ
"
"опеÑаÑий ввода/вÑвода I/O Ñоединений. СеÑÑÐ¸Ñ Ð½Ðµ ÑоÑ
Ñанена"
-#: session_state.cc:841
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr "СÑаÑÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑоÑ
Ñанен в %1"
-#: session_state.cc:843 session_state.cc:856
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr "Ðе ÑдалоÑÑ ÑдалиÑÑ Ð²ÑеменнÑй Ñайл ÑеÑÑии в каÑалоге \"%1\" (%2)"
-#: session_state.cc:853
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr "Ðе ÑдалоÑÑ Ð¿ÐµÑеименоваÑÑ Ð²ÑеменнÑй Ñайл ÑеÑÑии %1 в %2 (%3)"
-#: session_state.cc:923
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: Ñайл ÑеÑÑии «%2» не ÑÑÑеÑÑвÑеÑ!"
-#: session_state.cc:935
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr "Ðе ÑдалоÑÑ Ð¿Ð¾Ð½ÑÑÑ Ñайл ÑеÑÑии %1"
-#: session_state.cc:944
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr "Файл ÑеÑÑии %1 не ÑвлÑеÑÑÑ ÑеÑÑией"
-#: session_state.cc:1273
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"ÐÑибка в пÑогÑамме: СеÑÑиÑ: некоÑÑекÑнÑй Ñзел XML оÑпÑавил в set_state ()"
-#: session_state.cc:1327
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел опÑий"
-#: session_state.cc:1332
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел меÑаданнÑÑ
"
-#: session_state.cc:1343
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел иÑÑоÑников"
-#: session_state.cc:1350
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздела ÑeмpoкаÑÑÑ"
-#: session_state.cc:1357
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел ÑаÑположениÑ"
-#: session_state.cc:1370
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел облаÑÑей"
-#: session_state.cc:1377
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел плейлиÑÑов"
-#: session_state.cc:1397
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел ÑлоÑв"
-#: session_state.cc:1409
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел диÑковÑÑ
поÑоков"
-#: session_state.cc:1417
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел маÑÑÑÑÑов"
-#: session_state.cc:1429
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел маÑÑÑÑÑ Ð³ÑÑпп"
-#: session_state.cc:1438
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð³ÑÑпп"
-#: session_state.cc:1445
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ Ñаздел микÑ-гÑÑпп"
-#: session_state.cc:1453
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr "СеÑÑиÑ: ÑоÑÑоÑние XML не Ð¸Ð¼ÐµÐµÑ click-Ñаздела"
-#: session_state.cc:1500
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ Ð¼Ð°ÑÑÑÑÑ Ð¸Ð· опиÑÐ°Ð½Ð¸Ñ XML."
-#: session_state.cc:1504
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr "ÐагÑÑжена доÑожка/Ñина %1"
-#: session_state.cc:1509
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr "ÐоÑожки и ÑÐ¸Ð½Ñ Ð·Ð°Ð³ÑÑженÑ, добавлÑÑÑÑÑ Ð² ÑеÑÑиÑ"
-#: session_state.cc:1513
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr "Ðобавление доÑожек/Ñин завеÑÑено"
-#: session_state.cc:1612
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr "Ðе ÑдалоÑÑ Ð½Ð°Ð¹Ñи диÑковÑе поÑоки по маÑÑÑÑÑÑ"
-#: session_state.cc:1672
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð· опиÑÐ°Ð½Ð¸Ñ XML."
-#: session_state.cc:1676
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr "Ðе ÑдаеÑÑÑ Ð·Ð°Ð³ÑÑзиÑÑ ÑоÑÑоÑние Ð´Ð»Ñ Ð¾Ð±Ð»Ð°ÑÑи '%1'"
-#: session_state.cc:1712
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr "ÐблаÑÑей в опиÑании ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ найдено (ID's %1 и %2): игноÑиÑовано"
-#: session_state.cc:1740
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr "ÐложеннÑй иÑÑоÑник не Ð¸Ð¼ÐµÐµÑ ID-даннÑÑ
в Ñайле ÑеÑÑии! (ÐгноÑиÑовано)"
-#: session_state.cc:1752
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr "Ðевозможно воÑÑÑановиÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñй иÑÑоÑник Ð´Ð»Ñ Ð¾Ð±Ð»Ð°ÑÑи %1"
-#: session_state.cc:1814
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr "СеÑÑиÑ: XMLNode опиÑание AudioRegion ÑвлÑеÑÑÑ Ð½ÐµÐ¿Ð¾Ð»Ð½Ñм (без иÑÑоÑника)"
-#: session_state.cc:1822 session_state.cc:1843 session_state.cc:1863
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"СеÑÑиÑ: XMLNode опиÑание AudioRegion ÑÑÑлаеÑÑÑ Ð½Ð° неизвеÑÑнÑй иденÑиÑикаÑÐ¾Ñ "
"иÑÑоÑника = %1"
-#: session_state.cc:1828 session_state.cc:1849 session_state.cc:1869
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2676,7 +2794,7 @@ msgstr ""
"СеÑÑиÑ: XMLNode опиÑание AudioRegion ÑÑÑлаеÑÑÑ Ð½Ð° неиÑÑ
однÑй "
"аÑдиоиденÑиÑикаÑÐ¾Ñ = %1"
-#: session_state.cc:1892
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2684,29 +2802,29 @@ msgstr ""
"СеÑÑиÑ: XMLNode в опиÑании AudioRegion оÑÑÑÑÑÑвÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе маÑÑеÑ-"
"иÑÑоÑники; ÐгноÑиÑовано"
-#: session_state.cc:1926
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr "СеÑÑиÑ: XMLNode опиÑание MidiRegion ÑвлÑеÑÑÑ Ð½ÐµÐ¿Ð¾Ð»Ð½Ñм (без иÑÑоÑника)"
-#: session_state.cc:1934
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"СеÑÑиÑ: XMLNode опиÑание MidiRegion ÑÑÑлаеÑÑÑ Ð½Ð° неизвеÑÑнÑй иденÑиÑикаÑÐ¾Ñ "
"иÑÑоÑника id = %1"
-#: session_state.cc:1940
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"СеÑÑиÑ: XMLNode опиÑание MidiRegion ÑÑÑлаеÑÑÑ Ð½Ð° неиÑÑ
однÑй MIDI-"
"иденÑиÑикаÑÐ¾Ñ id= %1"
-#: session_state.cc:2013
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ Ð¸ÑÑоÑник из опиÑÐ°Ð½Ð¸Ñ XML."
-#: session_state.cc:2021
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
@@ -2714,137 +2832,137 @@ msgstr ""
"ÐнеÑний MIDI Ñайл оÑÑÑÑÑÑвÑеÑ. % 1 в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾ÑÑÑановиÑÑ "
"даннÑе из ÑÑÑаÑеннÑÑ
внеÑниÑ
MIDI Ñайлов"
-#: session_state.cc:2103
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
"Ðайден звÑковой Ñайл, коÑоÑÑй не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован %1. ÐбÑаÑиÑеÑÑ Ðº "
"пÑогÑаммиÑÑам."
-#: session_state.cc:2124
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÐºÐ°Ñалогоа \"%1\" (%2)"
-#: session_state.cc:2136
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr "Шаблон \"%1\" Ñже ÑÑÑеÑÑвÑеÑ. ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð½Ðµ Ñоздана"
-#: session_state.cc:2142
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Ðе ÑдалоÑÑ ÑоздаÑÑ ÐºÐ°Ñалог Ð´Ð»Ñ Ñаблона ÑеÑÑии \"%1\" (%2)"
-#: session_state.cc:2171
+#: session_state.cc:2259
msgid "template not saved"
msgstr "Шаблон не ÑоÑ
ÑанÑн"
-#: session_state.cc:2413
+#: session_state.cc:2501
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "ÐеизвеÑÑнÑй Ñзел \"%1\" найден в ÑпиÑке пакеÑов Ñайла ÑеÑÑии"
-#: session_state.cc:2869
+#: session_state.cc:2969
msgid "Cannot cleanup peak-files for read-only session."
msgstr ""
-#: session_state.cc:2873
+#: session_state.cc:2973
msgid "Cannot cleanup peak-files while recording"
msgstr ""
-#: session_state.cc:2896
+#: session_state.cc:2996
msgid ""
"Timeout waiting for peak-file creation to terminate before cleanup, please "
"try again later."
msgstr ""
-#: session_state.cc:3121
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "СеÑÑиÑ: невозможно ÑоздаÑÑ Ð¿Ð°Ð¿ÐºÑ ÑÑеÑÑннÑÑ
Ñайлов \"%1\" (%2)"
-#: session_state.cc:3160
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
"Ðевозможно пеÑеименоваÑÑ Ð½ÐµÐ¸ÑполÑзованнÑй Ñайл иÑÑоÑника из %1 в %2 (%3)"
-#: session_state.cc:3178
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "Ðе ÑдалоÑÑ ÑдалиÑÑ Ð¿Ð¸Ðº-Ñайл %1 Ð´Ð»Ñ %2 (%3)"
-#: session_state.cc:3495
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
"Ðевозможно ÑделаÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÑÑаÑого Ñайла иÑÑоÑии. ТекÑÑÐ°Ñ Ð¸ÑÑоÑÐ¸Ñ Ð½Ðµ ÑоÑ
Ñанена"
-#: session_state.cc:3504
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr "ÐÑÑоÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑоÑ
Ñаненв в %1"
-#: session_state.cc:3507
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr "Ðе ÑдалоÑÑ ÑдалиÑÑ Ñайл иÑÑоÑии по пÑÑи \"%1\" (%2)"
-#: session_state.cc:3511
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr "Ðе ÑдалоÑÑ Ð²Ð¾ÑÑÑановиÑÑ Ñайл иÑÑоÑии из ÑезеÑвной %1 (% 2)"
-#: session_state.cc:3536
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: Ð½ÐµÑ Ñайла иÑÑоÑии \"%2\" Ð´Ð»Ñ ÑÑой ÑеÑÑии."
-#: session_state.cc:3542
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr "Ðе ÑдалоÑÑ Ð¿Ð¾Ð½ÑÑÑ Ñайл иÑÑоÑии ÑеÑÑии \"%1\""
-#: session_state.cc:3584
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "Ðе ÑдалоÑÑ Ð¾Ð±ÑаÑное пÑиведение MidiSource Ð´Ð»Ñ NoteDiffCommand"
-#: session_state.cc:3595
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "Ðе ÑдалоÑÑ Ð¾Ð±ÑаÑное пÑиведение MidiSource Ð´Ð»Ñ SysExDiffCommand"
-#: session_state.cc:3606
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "Ðе ÑдалоÑÑ Ð¾Ð±ÑаÑное пÑиведение MidiSource Ð´Ð»Ñ PatchChangeDiffCommand"
-#: session_state.cc:3614
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Ðе ÑдалоÑÑ Ð²ÑÑÑниÑÑ, как ÑделаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸Ð· %1 XMLNode."
-#: session_state.cc:3852
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr "СеÑÑиÑ: неизвеÑÑнÑй Ñип диÑковÑÑ
поÑоков в XML"
-#: session_state.cc:3857
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr "СеÑÑиÑ: Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð´Ð¸ÑковÑе поÑоки ÑеÑез XML-ÑÑаÑÑÑ"
-#: session_state.cc:3954
+#: session_state.cc:4092
msgid "Cannot rename read-only session."
msgstr "Ðевозможно пеÑеименоваÑÑ ÑеанÑ, доÑÑÑпнÑй ÑолÑко Ð´Ð»Ñ ÑÑениÑ."
-#: session_state.cc:3958
+#: session_state.cc:4096
msgid "Cannot rename session while recording"
msgstr "Ðевозможно пеÑеименоваÑÑ ÑÐµÐ°Ð½Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи."
-#: session_state.cc:4043 session_state.cc:4044 session_state.cc:4086
-#: session_state.cc:4090
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr "ÐеÑеименование %s в %2 не ÑдалоÑÑ (%3)"
-#: session_state.cc:4106 session_state.cc:4107 session_state.cc:4121
-#: session_state.cc:4122
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
msgid "renaming %1 as %2 failed (%3)"
msgstr "Ðе ÑдалоÑÑ Ð¿ÐµÑеименоваÑÑ %1 в %2 (%3)"
-#: session_state.cc:4431
+#: session_state.cc:4571
msgid "Cannot create new session folder %1"
msgstr ""
-#: session_state.cc:4493 session_state.cc:4568
+#: session_state.cc:4633 session_state.cc:4708
msgid ""
"\n"
"copying \"%1\" failed !"
msgstr ""
-#: session_state.cc:4766
+#: session_state.cc:4906
msgid "unknown reason"
msgstr ""
@@ -2856,7 +2974,7 @@ msgstr "ÐеизвеÑÑное ÑоÑÑоÑние ÑÑанÑпоÑÑа %1 в о
msgid "Cannot loop - no loop range defined"
msgstr "Ðе ÑдалоÑÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ñикл - диапазон Ñикла не опÑеделен"
-#: session_transport.cc:956
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
@@ -2865,11 +2983,11 @@ msgstr ""
"ÑÑанÑпоÑÑ.\n"
"РекомендÑеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸ÑÑ Ð½Ð°ÑÑÑоеннÑе паÑамеÑÑÑ"
-#: session_transport.cc:1038
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr "РазмеÑение, вÑзÑваемое Ð´Ð»Ñ Ð½ÐµÐ³Ð°Ñивной позиÑии обÑазÑа, игноÑиÑовано"
-#: session_transport.cc:1392
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
@@ -2877,6 +2995,10 @@ msgstr ""
"ÐлобалÑÐ½Ð°Ñ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑкоÑоÑÑÑ Ð½Ðµ поддеÑживаеÑÑÑ Ð² Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº %1 подклÑÑен "
"к JACK ÑÑанÑпоÑÑÑконÑÑолÑ"
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr "Ðевозможно пÑоÑиÑаÑÑ Ð¿ÑеÑÐ¸ÐºÑ ÑобÑÑий. MIDI колÑÑо повÑеждено"
@@ -3086,6 +3208,14 @@ msgstr ""
msgid "SndFileSource: cannot open file \"%1\" for reading"
msgstr ""
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
@@ -3117,43 +3247,67 @@ msgstr "SrcFileSource: %1"
msgid "Cannot compile tape track regexp for use (%1)"
msgstr "Ðе ÑдаеÑÑÑ ÑкомпилиÑоваÑÑ ÑегÑлÑÑное вÑÑажение доÑожеÑной ленÑÑ (%1)"
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "Узел XML TempoSection не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑв \"start\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "Узел XML TempoSection Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимое знаÑение \"start\""
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr "Узел XML TempoSection не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑв \"beats-per-minute\""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr "Узел XML TempoSection Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимое знаÑение \"beats_per_minute\""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr "Узел XML TempoSection Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимое знаÑение \"note-type\""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr "Узел XML TempoSection Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑе ÑвойÑÑва \"movable\""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
-msgstr "Узел XML TempoSection Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑе ÑвойÑÑва \"bar-offset\""
-
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑв \"start\""
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr ""
-#: tempo.cc:210
+#: tempo.cc:471
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr "Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐºÐ¾ÑÑекÑнÑÑ
знаÑений \"start\""
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
@@ -3161,27 +3315,27 @@ msgstr ""
"Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑв \"beats-per-bar\" или \"divisions-per-"
"bar\""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-"Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐºÐ¾ÑÑекÑнÑÑ
знаÑений \"beats-per-bar\" или "
-"\"divisions-per-bar"
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr "Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑв \"note-type\""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr "Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ "
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr "Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐºÐ¾ÑÑекÑнÑÑ
знаÑений \"movable\""
-#: tempo.cc:402
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
@@ -3189,40 +3343,44 @@ msgstr ""
"ÐеÑÑиÑеÑкие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ ÑолÑко на пеÑвой доле баÑа. "
"ÐеÑеÑ
од Ð¾Ñ %1 к %2"
-#: tempo.cc:682
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
"ÐÐµÑ ÑекÑий Ñеампа, опÑеделÑннÑÑ
в Ñемп-каÑÑе. Ðе ÑдалоÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ñемп @ %1"
-#: tempo.cc:712 tempo.cc:730 tempo.cc:748 tempo.cc:764
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
msgid "programming error: no tempo section in tempo map!"
msgstr "ÐÑибка в пÑогÑамме: Ð½ÐµÑ ÑекÑии Ñемпа в Ñемп-каÑÑе!"
-#: tempo.cc:882 tempo.cc:1892
-msgid "programming error: unhandled MetricSection type"
-msgstr "ÐÑибка в пÑогÑамме: необÑабоÑаннÑй MetricSection Ñип"
-
-#: tempo.cc:1178
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr "Темп-каÑÑа запÑоÑила Ð´Ð»Ñ BBT-вÑемени в кадÑе %1\n"
-#: tempo.cc:1221
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr "Темп-каÑÑа запÑоÑила вÑÐµÐ¼Ñ ÐºÐ°Ð´Ñа в баÑе < 1 (%1)\n"
-#: tempo.cc:1705 tempo.cc:1719
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
"Темп-каÑÑа: не ÑдалоÑÑ ÑÑÑановиÑÑ Ð½Ð¾Ð²Ð¾Ðµ ÑоÑÑоÑние, воÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ ÑÑаÑое."
-#: tempo.cc:1740 tempo.cc:1741
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr "ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÑлÑÑиизмеÑений найдено на %1"
-#: tempo.cc:1746 tempo.cc:1747
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr "ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÑлÑÑиÑемпа найдено найдено на %1"
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "ÐÑибка в пÑогÑамме: необÑабоÑаннÑй MetricSection Ñип"
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr "ÐаÑÑа Ñемпа"
@@ -3255,6 +3413,10 @@ msgstr ""
msgid "Using plugin-stub with unknown i/o configuration for: "
msgstr ""
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr "Узел Ð´Ð»Ñ Bundle ÑÑо не ÑвойÑÑва \"name\""
@@ -3332,6 +3494,76 @@ msgstr "ÐÑибка в пÑогÑамме: неизвеÑÑнÑй Ñодной
msgid "cannot open directory %1 (%2)"
msgstr "Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ %1 (%2)"
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid ""
+#~ "You have requested an operation that requires audio analysis.\n"
+#~ "\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
+#~ "\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
+#~ "\n"
+#~ "This dialog will not display again. But you may notice a slight delay in "
+#~ "this and future transient-detection operations.\n"
+#~ msgstr ""
+#~ "ÐÑ Ð·Ð°Ð¿ÑоÑили опеÑаÑиÑ, ÑÑебÑÑÑÑÑ Ð°Ñдиоанализ.\n"
+#~ "\n"
+#~ "РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ñ ÐÐ°Ñ \"auto-analyse-audio\" оÑклÑÑен. ÐÑо ознаÑаеÑ, "
+#~ "ÑÑо пеÑеÑ
однÑе даннÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑгенеÑиÑÐ¾Ð²Ð°Ð½Ñ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда "
+#~ "поÑÑебÑеÑÑÑ.\n"
+#~ "\n"
+#~ "ÐÑли Ð²Ñ Ð´ÐµÐ»Ð°ÐµÑе ÑабоÑÑ, коÑоÑÐ°Ñ Ð¿Ð¾ÑÑебÑÐµÑ Ð¿ÐµÑеÑ
однÑÑ
даннÑÑ
на ÑегÑлÑÑной "
+#~ "оÑнове, Ñо Ðам, веÑоÑÑно, ÑледÑÐµÑ Ð²ÐºÐ»ÑÑиÑÑ \"auto-analyse-audio\", заÑем "
+#~ "закÑÑÑÑ Ardour и пеÑезапÑÑÑиÑÑ.\n"
+#~ "\n"
+#~ "ÐÑÐ¾Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³ не бÑÐ´ÐµÑ Ð¾ÑобÑажаÑÑÑÑ Ñнова, но ÐÑ Ð¼Ð¾Ð¶ÐµÑе замеÑиÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÑÑ "
+#~ "задеÑÐ¶ÐºÑ Ð² ÑÑой и бÑдÑÑиÑ
опеÑаÑиÑÑ
пеÑеÑ
однÑÑ
обнаÑÑжений.\n"
+
+#~ msgid "normalize"
+#~ msgstr "ÐоÑмиÑовка"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "ÐлоÑ
о ÑÑоÑмиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока поÑÑдкового клÑÑа в Ñайле ÑоÑÑоÑниÑ! [%1] ... "
+#~ "игноÑиÑован."
+
+#~ msgid "Converting deprecated order key for %1 using Editor order %2"
+#~ msgstr ""
+#~ "ÐÑеобÑазование ÑÑÑаÑевÑего поÑÑдкового клÑÑа Ð´Ð»Ñ %1 Ñ Ð¸ÑполÑзованием "
+#~ "ÑедакÑоÑа поÑÑдка %2"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "Узел XML TempoSection не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑв \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "Узел XML TempoSection Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимое знаÑение \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "Узел XML TempoSection Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑе ÑвойÑÑва \"bar-offset\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ ÑвойÑÑв \"start\""
+
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr ""
+#~ "Узел XML MeterSection не Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐºÐ¾ÑÑекÑнÑÑ
знаÑений \"beats-per-bar\" "
+#~ "или \"divisions-per-bar"
+
#~ msgid ""
#~ "Could not create directory for Session template plugin state\"%1\" (%2)"
#~ msgstr ""
@@ -3392,9 +3624,6 @@ msgstr "Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ %1 (%2)"
#~ "VST плагин %1 не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ processReplacing и поÑÑÐ¾Ð¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ "
#~ "иÑполÑзован в %2 в ÑÑо вÑемÑ"
-#~ msgid "Audio"
-#~ msgstr "ÐÑдио"
-
#~ msgid "could not allocate file %1 for reading."
#~ msgstr "Ðе ÑдалоÑÑ Ð²ÑделиÑÑ Ñайл %1 Ð´Ð»Ñ ÑÑениÑ."
diff --git a/libs/ardour/po/sv.mo b/libs/ardour/po/sv.mo
new file mode 100644
index 0000000..cb4e9a2
Binary files /dev/null and b/libs/ardour/po/sv.mo differ
diff --git a/libs/ardour/po/sv.po b/libs/ardour/po/sv.po
index dd2b060..dc617fd 100644
--- a/libs/ardour/po/sv.po
+++ b/libs/ardour/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
"PO-Revision-Date: 2006-10-03 01:09+GMT+1\n"
"Last-Translator: Petter Sundlöf <petter.sundlof at findus.dhs.org>\n"
"Language-Team: Swedish <sv at li.org>\n"
@@ -16,86 +16,239 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
-msgstr "Volymreglage"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr ""
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
msgid "Transient Analysis failed for %1."
msgstr ""
-#: analyser.cc:117
+#: analyser.cc:121
msgid "Audio File Source"
msgstr ""
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
msgid "%1: could not create region for complete audio file"
msgstr ""
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
msgid "programmer error: %1"
msgstr ""
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
msgid "%1:%2 new capture file not initialized correctly"
msgstr ""
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:81
+#: audio_library.cc:82
msgid "Could not open %1. Audio Library not saved"
msgstr ""
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
msgid ""
"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
"- crossfade discarded"
msgstr ""
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
msgid ""
"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
"- crossfade discarded"
@@ -125,10 +278,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
msgid "programming error: %1"
msgstr ""
@@ -152,26 +306,30 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:161
+#: audio_track.cc:177
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:163
+#: audio_track.cc:179
msgid "in 1"
msgstr ""
-#: audio_track.cc:164
+#: audio_track.cc:180
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:168
+#: audio_track.cc:184
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:177
+#: audio_track.cc:193
msgid "improper input channel list in XML node (%1)"
msgstr ""
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
#: audio_track_importer.cc:68
msgid "Audio Tracks"
msgstr ""
@@ -192,19 +350,19 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:696
+#: audioengine.cc:756
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:702
+#: audioengine.cc:762
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:779
+#: audioengine.cc:841
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1685
+#: audioregion.cc:1757
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -212,13 +370,14 @@ msgid ""
"transient data must be generated every time it is required.\n"
"\n"
"If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
"\n"
"This dialog will not display again. But you may notice a slight delay in "
"this and future transient-detection operations.\n"
msgstr ""
-#: audioregion.cc:1729
+#: audioregion.cc:1789
msgid "Audio Region"
msgstr ""
@@ -226,162 +385,190 @@ msgstr ""
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:257
+#: audiosource.cc:262
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
msgid "Cannot open peakfile @ %1 for reading (%2)"
msgstr ""
-#: audiosource.cc:394
+#: audiosource.cc:438
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
msgid "map failed - could not create file mapping for peakfile %1."
msgstr ""
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
msgid "map failed - could not map peakfile %1."
msgstr ""
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
msgid "unmap failed - could not unmap peakfile %1."
msgstr ""
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
msgid "map failed - could not mmap peakfile %1."
msgstr ""
-#: audiosource.cc:638
+#: audiosource.cc:681
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:705
+#: audiosource.cc:748
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
msgid "%1: could not seek in peak file data (%2)"
msgstr ""
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:975
+#: audiosource.cc:1058
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:100
+#: auditioner.cc:105
msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:102
+#: auditioner.cc:107
msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:158
+#: auditioner.cc:163
msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
-#: auditioner.cc:434
+#: auditioner.cc:443
msgid "Failed to load synth for MIDI-Audition."
msgstr ""
-#: auditioner.cc:453
+#: auditioner.cc:462
msgid "Auditioning of regions other than Audio or Midi is not supported."
msgstr ""
-#: automatable.cc:84
+#: automatable.cc:87
msgid "Automation node has no path property"
msgstr ""
-#: automatable.cc:104
+#: automatable.cc:108
msgid "cannot open %2 to load automation data (%3)"
msgstr ""
-#: automatable.cc:132
+#: automatable.cc:140
msgid "cannot load automation data from %2"
msgstr ""
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Volymreglage"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
msgid "Mute"
msgstr ""
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
msgid "automation list: cannot load coordinates from XML, all points ignored"
msgstr ""
-#: automation_list.cc:402
+#: automation_list.cc:456
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
-#: automation_list.cc:408
+#: automation_list.cc:462
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
-#: automation_list.cc:422
+#: automation_list.cc:476
msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:100
+#: butler.cc:126
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
@@ -398,7 +585,7 @@ msgstr ""
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
msgid "MIDI"
msgstr ""
@@ -410,11 +597,11 @@ msgstr ""
msgid "main outs"
msgstr ""
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
msgid "listen"
msgstr ""
-#: diskstream.cc:309
+#: diskstream.cc:311
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
@@ -426,23 +613,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:126
+#: export_filename.cc:128
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:242
+#: export_filename.cc:263
msgid "No Time"
msgstr "Ingen tid"
-#: export_filename.cc:251
+#: export_filename.cc:272
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:260
+#: export_filename.cc:281
msgid "No Date"
msgstr "Inget datum"
-#: export_filename.cc:275
+#: export_filename.cc:296
msgid "Invalid date format"
msgstr ""
@@ -478,23 +665,27 @@ msgstr ""
msgid "Lossless compression"
msgstr ""
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
msgid "Session rate"
msgstr ""
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
msgstr ""
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
msgid "trim"
msgstr ""
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
msgid "trim start"
msgstr ""
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
msgid "trim end"
msgstr ""
@@ -510,24 +701,20 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
#: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
msgstr ""
#: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
msgstr ""
#: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
msgstr ""
#: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
msgstr ""
#: export_formats.cc:167
@@ -539,7 +726,7 @@ msgid "double"
msgstr ""
#: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
msgstr ""
#: export_formats.cc:173
@@ -550,94 +737,90 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:360
+#: export_handler.cc:419
msgid "File %1 uploaded to %2"
msgstr ""
-#: export_handler.cc:366
+#: export_handler.cc:425
msgid ""
"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
-msgstr ""
-
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
msgid "Searching for export formats in %1"
msgstr ""
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
msgid "Unable to create export format directory %1: %2"
msgstr ""
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
msgid "Unable to remove export preset %1: %2"
msgstr ""
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
msgid "Selection"
msgstr ""
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
msgid "Unable to rename export format %1 to %2: %3"
msgstr ""
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
msgid "Unable to remove export profile %1: %2"
msgstr ""
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
msgid "empty format"
msgstr ""
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
msgid "Cannot load export format from %1"
msgstr ""
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
msgid "Cannot export format read from %1"
msgstr ""
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
msgid "No timespan has been selected!"
msgstr ""
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
msgid "No channels have been selected!"
msgstr ""
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
msgid "Some channels are empty"
msgstr ""
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
msgid "No format selected!"
msgstr "Inget format valt!"
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
msgid "All channels are empty!"
msgstr ""
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
msgid "One or more of the selected formats is not compatible with this system!"
msgstr ""
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
msgid ""
"%1 supports only %2 channels, but you have %3 channels in your channel "
"configuration"
msgstr ""
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -646,25 +829,25 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
msgid "FileSource: search path not set"
msgstr ""
-#: file_source.cc:435
+#: file_source.cc:434
msgid ""
"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:442
+#: file_source.cc:441
msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:487
+#: file_source.cc:486
msgid "Filesource: cannot find required file (%1): %2"
msgstr ""
-#: file_source.cc:495
+#: file_source.cc:494
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
@@ -678,34 +861,38 @@ msgstr ""
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
msgid "Cannot create Configuration directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
msgid ""
"Configuration directory %1 already exists and is not a directory/folder - "
"cannot run"
msgstr ""
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
msgid "Cannot create cache directory %1 - cannot run"
msgstr ""
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
msgid ""
"Cache directory %1 already exists and is not a directory/folder - cannot run"
msgstr ""
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
msgid "ARDOUR_CONFIG_PATH not set in environment\n"
msgstr ""
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
msgid "ARDOUR_DATA_PATH not set in environment\n"
msgstr ""
@@ -713,50 +900,79 @@ msgstr ""
msgid "filter: error creating name for new file based on %1"
msgstr ""
-#: filter.cc:79
+#: filter.cc:92
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:59
+#: find_session.cc:60
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: find_session.cc:85
+#: find_session.cc:86
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:121
+#: find_session.cc:125
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:138
+#: find_session.cc:142
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:155
+#: find_session.cc:159
msgid "unknown file type for session %1"
msgstr ""
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:236
+#: globals.cc:268
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:244
+#: globals.cc:276
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
msgid "Loading configuration"
msgstr ""
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
#: import.cc:146
msgid "Cannot find new filename for imported file %1"
msgstr ""
@@ -782,7 +998,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
#: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
msgstr ""
#: import.cc:475
@@ -809,110 +1025,113 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: instrument_info.cc:231
+#: instrument_info.cc:243
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:209
+#: io.cc:212
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
msgid "IO: cannot register input port %1"
msgstr ""
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
msgid "IO: cannot register output port %1"
msgstr ""
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "in"
msgstr ""
-#: io.cc:713
+#: io.cc:730
msgid "out"
msgstr ""
-#: io.cc:714
+#: io.cc:731
msgid "input"
msgstr "ingång"
-#: io.cc:714
+#: io.cc:731
msgid "output"
msgstr "utgång"
-#: io.cc:724
+#: io.cc:741
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:790
+#: io.cc:807
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:793
+#: io.cc:810
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:897
+#: io.cc:914
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1069
+#: io.cc:1086
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1074
+#: io.cc:1091
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1460
+#: io.cc:1501
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1462
+#: io.cc:1503
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
msgid "mono"
msgstr ""
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
msgid "L"
msgstr ""
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
msgid "R"
msgstr ""
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
#: ladspa_plugin.cc:93
msgid "LADSPA: Unable to open module: "
msgstr ""
@@ -929,81 +1148,81 @@ msgstr ""
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
msgid "Could not create %1. Preset not saved. (%2)"
msgstr ""
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
msgid "Could not locate HOME. Preset not saved."
msgstr ""
-#: location.cc:456
+#: location.cc:455
msgid "You cannot put a CD marker at this position"
msgstr ""
-#: location.cc:608
+#: location.cc:607
msgid "incorrect XML node passed to Location::set_state"
msgstr ""
-#: location.cc:613
+#: location.cc:612
msgid "XML node for Location has no ID information"
msgstr ""
-#: location.cc:617
+#: location.cc:616
msgid "XML node for Location has no name information"
msgstr ""
-#: location.cc:624
+#: location.cc:623
msgid "XML node for Location has no start information"
msgstr ""
-#: location.cc:635
+#: location.cc:634
msgid "XML node for Location has no end information"
msgstr ""
-#: location.cc:642
+#: location.cc:641
msgid "XML node for Location has no flags information"
msgstr ""
-#: location.cc:856
+#: location.cc:868
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
-#: location.cc:1034
+#: location.cc:1046
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
msgid "session"
msgstr ""
-#: location.cc:1112
+#: location.cc:1126
msgid "could not load location from session file - ignored"
msgstr ""
@@ -1045,48 +1264,104 @@ msgid ""
"You may rename the imported location:"
msgstr ""
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
msgid "Session framerate adjusted from %1 to LTC's %2."
msgstr ""
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1106,31 +1381,47 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
msgstr ""
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
msgid "Scene "
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:126
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:131
+#: midi_source.cc:132
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:140
+#: midi_source.cc:141
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:146
+#: midi_source.cc:147
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1138,57 +1429,57 @@ msgstr ""
msgid "MIDI stretch created non-MIDI source"
msgstr ""
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
msgid "monitor dim"
msgstr ""
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
msgid "monitor cut"
msgstr ""
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
msgid "monitor mono"
msgstr ""
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
msgid "monitor dim level"
msgstr ""
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
msgid "monitor solo boost level"
msgstr ""
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
msgid "cut control %1"
msgstr ""
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
msgid "dim control"
msgstr ""
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
msgid "polarity control"
msgstr ""
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1244,7 +1535,7 @@ msgstr ""
msgid "fixed time region copy"
msgstr ""
-#: pannable.cc:207
+#: pannable.cc:208
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
@@ -1278,19 +1569,67 @@ msgstr ""
msgid "select panner: %1\n"
msgstr ""
-#: panner_shell.cc:255
+#: panner_shell.cc:257
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:261
+#: panner_shell.cc:263
msgid "panner plugin node has no type information!"
msgstr ""
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
msgid "region state node has no ID, ignored"
msgstr ""
-#: playlist.cc:2156
+#: playlist.cc:2252
msgid "Playlist: cannot create region from XML"
msgstr ""
@@ -1302,125 +1641,245 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:403
+#: plugin.cc:495
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
msgid "programming error: "
msgstr ""
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
msgid "XML node describing plugin is missing the `type' field"
msgstr ""
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
msgid "unknown plugin type %1 in plugin insert state"
msgstr ""
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
msgid "Plugin has no unique ID field"
msgstr ""
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
msgstr ""
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
msgid "PluginInsert: Auto: no ladspa port number"
msgstr ""
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
msgid "PluginInsert: Auto: port id out of range"
msgstr ""
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
msgid "Scanning LADSPA Plugins"
msgstr ""
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
msgid "Scanning LV2 Plugins"
msgstr ""
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
msgid "Scanning Windows VST Plugins"
msgstr ""
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
msgid "Scanning Linux VST Plugins"
msgstr ""
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
msgid "Scanning AU Plugins"
msgstr ""
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
msgid "Plugin Scan Complete..."
msgstr ""
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
msgid "LADSPA"
msgstr ""
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr ""
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
msgid "VST"
msgstr ""
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
msgstr ""
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
msgid "LXVST"
msgstr ""
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:450
+#: port.cc:504
msgid "could not reregister %1"
msgstr ""
@@ -1428,150 +1887,215 @@ msgstr ""
msgid "insert %1"
msgstr ""
-#: port_insert.cc:197
+#: port_insert.cc:204
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:202
+#: port_insert.cc:209
msgid "non-port insert XML used for port plugin insert"
msgstr ""
-#: port_manager.cc:287
+#: port_manager.cc:288
msgid ""
"a port with the name \"%1\" already exists: check for duplicated track/bus "
"names"
msgstr ""
-#: port_manager.cc:289
+#: port_manager.cc:290
msgid ""
"No more ports are available. You will need to stop %1 and restart with more "
"ports if you need this many tracks."
msgstr ""
-#: port_manager.cc:292
+#: port_manager.cc:293
msgid "AudioEngine: cannot register port \"%1\": %2"
msgstr ""
-#: port_manager.cc:331
+#: port_manager.cc:332
msgid "unable to create port: %1"
msgstr ""
-#: port_manager.cc:418
+#: port_manager.cc:453
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr "AudioEngine: kan inte ansluta %1 (%2) till %3 (%4)"
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:214
+#: processor.cc:218
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:223
+#: processor.cc:227
msgid "No child node with active property"
msgstr ""
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
msgid "Loading system configuration file %1"
msgstr ""
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
msgid "%1: cannot read system configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
msgstr ""
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
msgid "Loading user configuration file %1"
msgstr ""
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
msgid "%1: cannot read configuration file \"%2\""
msgstr ""
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr ""
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
msgid "your %1 configuration file is empty. This is not normal."
msgstr ""
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
msgid "Config file %1 not saved"
msgstr ""
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
msgid "cannot open recent session file %1 (%2)"
msgstr ""
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
msgid ""
"programming error: RegionFactory::create() called with unknown Region type"
msgstr ""
-#: region_factory.cc:565
+#: region_factory.cc:566
msgid "%1 compound-%2 (%3)"
msgstr ""
-#: region_factory.cc:567
+#: region_factory.cc:568
msgid "%1 compound-%2.1 (%3)"
msgstr ""
-#: region_factory.cc:629
+#: region_factory.cc:630
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: resampled_source.cc:102
+#: resampled_source.cc:107
msgid "Import: %1"
msgstr ""
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
msgid "Import: src_new() failed : %1"
msgstr ""
-#: return.cc:41
+#: return.cc:42
msgid "return %1"
msgstr ""
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1240
+#: route.cc:884
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2186
+#: route.cc:2395
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
msgstr ""
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:4994
+msgid "lo"
msgstr ""
-#: route_group.cc:459
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
msgid "You cannot subgroup MIDI tracks at this time"
msgstr ""
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
#: rb_effect.cc:229 rb_effect.cc:269
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
@@ -1580,205 +2104,245 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:61
+#: send.cc:62
msgid "aux %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "send %1"
msgstr ""
-#: send.cc:67
+#: send.cc:68
msgid "programming error: send created using role %1"
msgstr ""
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
msgid "Connect to engine"
msgstr "Ansluter till ljudmotorn"
-#: session.cc:362
+#: session.cc:484
msgid "Session loading complete"
msgstr ""
-#: session.cc:434
+#: session.cc:575
msgid "Set up LTC"
msgstr ""
-#: session.cc:436
+#: session.cc:577
msgid "Set up Click"
msgstr ""
-#: session.cc:438
+#: session.cc:579
msgid "Set up standard connections"
msgstr ""
-#: session.cc:664
+#: session.cc:888
msgid "could not setup Click I/O"
msgstr ""
-#: session.cc:727
+#: session.cc:951
#, c-format
msgid "out %s"
msgstr ""
-#: session.cc:729
+#: session.cc:953
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:744
+#: session.cc:968
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:761
+#: session.cc:985
#, c-format
msgid "in %s"
msgstr ""
-#: session.cc:763
+#: session.cc:987
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:778
+#: session.cc:1002
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:852
+#: session.cc:1082
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
msgstr ""
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1085
+#: session.cc:1443
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1270
+#: session.cc:1644
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1297
+#: session.cc:1671
msgid "Session: you can't use that location for session start/end)"
msgstr ""
-#: session.cc:1329
+#: session.cc:1703
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1497
+#: session.cc:1886
msgid "programming error: session range removed!"
msgstr ""
-#: session.cc:1751
+#: session.cc:2158
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:2053
+#: session.cc:2506
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
msgstr ""
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2297
+#: session.cc:3050
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
msgid "Bus"
msgstr ""
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2475
+#: session.cc:3293
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2501
+#: session.cc:3331
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2531
+#: session.cc:3365
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3671
+#: session.cc:4784
msgid "Merging embedded file %1: name collision AND md5 hash collision!"
msgstr ""
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:4316
+#: session.cc:5663
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4328
+#: session.cc:5675
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4340
+#: session.cc:5687
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4352
+#: session.cc:5699
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4477
+#: session.cc:5825
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4486
+#: session.cc:5834
msgid "Cannot write a range with no data."
msgstr ""
-#: session.cc:4528
+#: session.cc:5876
msgid "cannot create new file \"%1\" for %2"
msgstr ""
-#: session_click.cc:161
+#: session_click.cc:162
msgid "cannot open click soundfile %1 (%2)"
msgstr ""
-#: session_click.cc:174
+#: session_click.cc:175
msgid "cannot read data from click soundfile"
msgstr ""
@@ -1817,23 +2381,36 @@ msgstr ""
msgid "Could not save session options"
msgstr ""
-#: session_directory.cc:59
+#: session_directory.cc:65
msgid "Cannot create Session directory at path %1 Error: %2"
msgstr ""
-#: session_directory.cc:76
+#: session_directory.cc:82
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
-#: session_export.cc:125
+#: session_export.cc:152
msgid "%1: cannot seek to %2 for export"
msgstr ""
-#: session_export.cc:182
+#: session_export.cc:216
msgid "Export ended unexpectedly: %1"
msgstr ""
@@ -1843,412 +2420,465 @@ msgid ""
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:570
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
msgid "Session: cannot create Playlist from XML description."
msgstr ""
-#: session_process.cc:136
+#: session_process.cc:159
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1174
+#: session_process.cc:1202
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:179
+#: session_state.cc:194
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:203
+#: session_state.cc:216
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:221
msgid "Using configuration"
msgstr ""
-#: session_state.cc:331
+#: session_state.cc:348
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:430
+#: session_state.cc:482
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:437
+#: session_state.cc:489
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:444
+#: session_state.cc:496
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:451
+#: session_state.cc:503
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:458
+#: session_state.cc:510
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:465
+#: session_state.cc:517
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:472
+#: session_state.cc:524
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:486
+#: session_state.cc:538
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:526
+#: session_state.cc:608
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
msgstr ""
-#: session_state.cc:606
+#: session_state.cc:707
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:630
+#: session_state.cc:731
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:658
+#: session_state.cc:759
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:685
+#: session_state.cc:788
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:736
+#: session_state.cc:856
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:746
+#: session_state.cc:868
msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:814
+#: session_state.cc:942
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:826
+#: session_state.cc:954
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:835
+#: session_state.cc:963
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1147
+#: session_state.cc:1332
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1201
+#: session_state.cc:1410
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1206
+#: session_state.cc:1415
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1217
+#: session_state.cc:1426
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1224
+#: session_state.cc:1433
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1231
+#: session_state.cc:1440
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1244
+#: session_state.cc:1453
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1251
+#: session_state.cc:1460
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1271
+#: session_state.cc:1480
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1283
+#: session_state.cc:1492
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1291
+#: session_state.cc:1504
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1520
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1312
+#: session_state.cc:1529
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1319
+#: session_state.cc:1536
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1327
+#: session_state.cc:1544
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1373
+#: session_state.cc:1606
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1377
+#: session_state.cc:1610
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1382
+#: session_state.cc:1615
msgid "Tracks/busses loaded; Adding to Session"
msgstr ""
-#: session_state.cc:1386
+#: session_state.cc:1619
msgid "Finished adding tracks/busses"
msgstr ""
-#: session_state.cc:1485
+#: session_state.cc:1709
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1545
+#: session_state.cc:1760
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1549
+#: session_state.cc:1764
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1585
+#: session_state.cc:1800
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1613
+#: session_state.cc:1828
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1625
+#: session_state.cc:1840
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1687
+#: session_state.cc:1902
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1765
+#: session_state.cc:1980
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1799
+#: session_state.cc:2014
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1807
+#: session_state.cc:2022
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1813
+#: session_state.cc:2028
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1872
+#: session_state.cc:2101
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1880
+#: session_state.cc:2109
msgid ""
"A external MIDI file is missing. %1 cannot currently recover from missing "
"external MIDI files"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:2191
msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
msgstr ""
-#: session_state.cc:1979
+#: session_state.cc:2212
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1992
+#: session_state.cc:2224
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1998
+#: session_state.cc:2230
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2008
+#: session_state.cc:2259
msgid "template not saved"
msgstr ""
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
msgstr ""
-#: session_state.cc:2834
+#: session_state.cc:3261
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2873
+#: session_state.cc:3296
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2891
+#: session_state.cc:3312
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3204
+#: session_state.cc:3633
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3213
+#: session_state.cc:3642
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3216
+#: session_state.cc:3645
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3220
+#: session_state.cc:3649
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3245
+#: session_state.cc:3674
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3251
+#: session_state.cc:3680
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3293
+#: session_state.cc:3722
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3304
+#: session_state.cc:3733
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3315
+#: session_state.cc:3744
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3323
+#: session_state.cc:3752
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3559
+#: session_state.cc:3990
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3564
+#: session_state.cc:3995
msgid "Session: could not load diskstream via XML state"
msgstr ""
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
msgid "renaming %s as %2 failed (%3)"
msgstr ""
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
#: session_time.cc:214
msgid "Unknown transport state %1 in sync callback"
msgstr ""
-#: session_transport.cc:171
+#: session_transport.cc:177
msgid "Cannot loop - no loop range defined"
msgstr ""
-#: session_transport.cc:833
+#: session_transport.cc:968
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
-#: session_transport.cc:915
+#: session_transport.cc:1050
msgid "Locate called for negative sample position - ignored"
msgstr ""
-#: session_transport.cc:1272
+#: session_transport.cc:1401
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
msgstr ""
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:357
+#: smf_source.cc:363
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:363
+#: smf_source.cc:369
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:409
+#: smf_source.cc:417
msgid ""
"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
msgstr ""
-#: smf_source.cc:453
+#: smf_source.cc:461
msgid "Skipping event with unordered frame time %1 < %2"
msgstr ""
-#: smf_source.cc:518
+#: smf_source.cc:526
msgid "cannot open MIDI file %1 for write"
msgstr ""
@@ -2265,7 +2895,7 @@ msgid "CAF"
msgstr ""
#: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
msgstr ""
#: sndfile_helpers.cc:38
@@ -2309,23 +2939,23 @@ msgid ".raw"
msgstr ""
#: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
msgstr ""
#: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
msgstr ""
#: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
msgstr ""
#: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
msgstr ""
#: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
msgstr ""
#: sndfile_helpers.cc:83
@@ -2336,88 +2966,108 @@ msgstr ""
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
msgstr ""
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
msgid "programming error: %1 %2"
msgstr ""
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
msgid "could not allocate file %1 to flush contents"
msgstr ""
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
#: soundcloud_upload.cc:129
msgid ""
"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
msgstr ""
-#: source_factory.cc:374
+#: source_factory.cc:390
msgid "Recovery attempted on a MIDI file - not implemented"
msgstr ""
@@ -2433,7 +3083,7 @@ msgstr ""
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
msgid "SrcFileSource: %1"
msgstr ""
@@ -2441,104 +3091,134 @@ msgstr ""
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
msgstr ""
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
msgstr ""
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: tempo.cc:100
+#: tempo.cc:124
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: tempo.cc:109
+#: tempo.cc:133
msgid "TempoSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:115
+#: tempo.cc:139
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
msgstr ""
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
msgstr ""
-#: tempo.cc:220
+#: tempo.cc:519
msgid ""
"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
"property"
msgstr ""
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
msgstr ""
-#: tempo.cc:231
+#: tempo.cc:529
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: tempo.cc:236
+#: tempo.cc:533
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: tempo.cc:241
+#: tempo.cc:538
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
msgid ""
"Meter changes can only be positioned on the first beat of a bar. Moving from "
"%1 to %2"
msgstr ""
-#: tempo.cc:650
+#: tempo.cc:1156
msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
msgstr ""
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
msgstr ""
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
msgid "tempo map asked for BBT time at frame %1\n"
msgstr ""
-#: tempo.cc:1185
+#: tempo.cc:2054
msgid "tempo map asked for frame time at bar < 1 (%1)\n"
msgstr ""
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
msgid "Multiple meter definitions found at %1"
msgstr ""
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
msgid "Multiple tempo definitions found at %1"
msgstr ""
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
#: tempo_map_importer.cc:52
msgid "Tempo map"
msgstr ""
@@ -2563,6 +3243,14 @@ msgid ""
"Are you sure you want to do this?"
msgstr ""
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
#: user_bundle.cc:47
msgid "Node for Bundle has no \"name\" property"
msgstr ""
@@ -2584,58 +3272,67 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
msgid "Splice"
msgstr "Skarv"
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
msgid "Slide"
msgstr "Glid"
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
msgid "Ripple"
msgstr ""
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
msgid "Lock"
msgstr "LÃ¥s"
-#: utils.cc:431
+#: utils.cc:421
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
msgid "MTC"
msgstr ""
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
msgid "JACK"
msgstr ""
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
msgstr ""
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
msgstr ""
-#: utils.cc:671
+#: utils.cc:658
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:686
+#: utils.cc:673
msgid "cannot open directory %1 (%2)"
msgstr ""
+
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
diff --git a/libs/ardour/po/zh.mo b/libs/ardour/po/zh.mo
new file mode 100644
index 0000000..6e1b972
Binary files /dev/null and b/libs/ardour/po/zh.mo differ
diff --git a/libs/ardour/po/zh.po b/libs/ardour/po/zh.po
index 32fb0c3..756cfa3 100644
--- a/libs/ardour/po/zh.po
+++ b/libs/ardour/po/zh.po
@@ -1,13686 +1,3455 @@
-# Copyright (C) YEAR Free Software Foundation, Inc.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-# ä¸åé±¼ YQ-YSY at 163.com å®æç¿»è¯äº 2015-12-09 å¨ Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn> çåºç¡ä¸
-#
+# ä¸åé±¼ <YQ-YSY at 163.com> ç¿»è¯äº 2016-02-06
msgid ""
msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2016-01-04 23:21+0800\n"
-"Last-Translator: Rui-huai Zhang <zrhzrh>\n"
-"Language-Team: zrhzrh <zrhzrh at mail.ustc.edu.cn>\n"
-"Language: zh_CN\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-03-27 10:49+0800\n"
+"Last-Translator: \n"
+"Language-Team: ä¸åé±¼ YQ-YSY at 163.com\n"
+"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
-"X-Poedit-Basepath: ../..\n"
-"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.8.4\n"
-"X-Poedit-SearchPath-0: gtk2_ardour\n"
-#: about.cc:125
-msgid "Brian Ahr"
-msgstr ""
-
-#: about.cc:126
-msgid "John Anderson"
-msgstr ""
-
-#: about.cc:127
-msgid "Marcus Andersson"
-msgstr ""
-
-#: about.cc:128
-msgid "Nedko Arnaudov"
-msgstr ""
-
-#: about.cc:129
-msgid "Hans Baier"
-msgstr ""
-
-#: about.cc:130
-msgid "Ben Bell"
-msgstr ""
-
-#: about.cc:131
-msgid "Sakari Bergen"
-msgstr ""
-
-#: about.cc:132
-msgid "Christian Borss"
-msgstr ""
-
-#: about.cc:133
-msgid "Chris Cannam"
-msgstr ""
-
-#: about.cc:134
-msgid "Jeremy Carter"
-msgstr ""
-
-#: about.cc:135
-msgid "Jesse Chappell"
-msgstr ""
-
-#: about.cc:136
-msgid "Thomas Charbonnel"
-msgstr ""
-
-#: about.cc:137
-msgid "Sam Chessman"
-msgstr ""
-
-#: about.cc:138
-msgid "André Colomb"
-msgstr ""
-
-#: about.cc:139
-msgid "Paul Davis"
-msgstr ""
-
-#: about.cc:140
-msgid "Gerard van Dongen"
-msgstr ""
-
-#: about.cc:141
-msgid "John Emmas"
-msgstr ""
-
-#: about.cc:142
-msgid "Colin Fletcher"
-msgstr ""
-
-#: about.cc:143
-msgid "Dave Flick"
-msgstr ""
-
-#: about.cc:144
-msgid "Hans Fugal"
-msgstr ""
-
-#: about.cc:145
-msgid "Robin Gareus"
-msgstr ""
-
-#: about.cc:146
-msgid "Christopher George"
-msgstr ""
-
-#: about.cc:147
-msgid "Chris Goddard"
-msgstr ""
-
-#: about.cc:148
-msgid "J. Abelardo Gutierrez"
-msgstr ""
-
-#: about.cc:149
-msgid "Jeremy Hall"
-msgstr ""
-
-#: about.cc:150
-msgid "Audun Halland"
-msgstr ""
-
-#: about.cc:151
-msgid "David Halter"
-msgstr ""
-
-#: about.cc:152
-msgid "Steve Harris"
-msgstr ""
-
-#: about.cc:153
-msgid "Melvin Ray Herr"
-msgstr ""
-
-#: about.cc:154
-msgid "Carl Hetherington"
-msgstr ""
-
-#: about.cc:155
-msgid "Rob Holland"
-msgstr ""
-
-#: about.cc:156
-msgid "Robert Jordens"
-msgstr ""
-
-#: about.cc:157
-msgid "Stefan Kersten"
-msgstr ""
-
-#: about.cc:158
-msgid "Armand Klenk"
-msgstr ""
-
-#: about.cc:159
-msgid "Julien de Kozak"
-msgstr ""
-
-#: about.cc:160
-msgid "Matt Krai"
-msgstr ""
-
-#: about.cc:161
-msgid "Georg Krause"
-msgstr ""
-
-#: about.cc:162
-msgid "Nick Lanham"
-msgstr ""
-
-#: about.cc:163
-msgid "Colin Law"
-msgstr ""
-
-#: about.cc:164
-msgid "Joshua Leach"
-msgstr ""
-
-#: about.cc:165
-msgid "Ben Loftis"
-msgstr ""
-
-#: about.cc:166
-msgid "Nick Mainsbridge"
-msgstr ""
-
-#: about.cc:167
-msgid "Tim Mayberry"
-msgstr ""
-
-#: about.cc:168
-msgid "Doug Mclain"
-msgstr ""
-
-#: about.cc:169
-msgid "Todd Naugle"
-msgstr ""
-
-#: about.cc:170
-msgid "Jack O'Quin"
-msgstr ""
-
-#: about.cc:171
-msgid "Nimal Ratnayake"
-msgstr ""
-
-#: about.cc:172
-msgid "David Robillard"
-msgstr ""
-
-#: about.cc:173
-msgid "Taybin Rutkin"
-msgstr ""
-
-#: about.cc:174
-msgid "Andreas Ruge"
-msgstr ""
-
-#: about.cc:175
-msgid "Sampo Savolainen"
-msgstr ""
-
-#: about.cc:176
-msgid "Rodrigo Severo"
-msgstr ""
-
-#: about.cc:177
-msgid "Per Sigmond"
-msgstr ""
-
-#: about.cc:178
-msgid "Lincoln Spiteri"
-msgstr ""
-
-#: about.cc:179
-msgid "Mike Start"
-msgstr ""
-
-#: about.cc:180
-msgid "Mark Stewart"
-msgstr ""
-
-#: about.cc:181
-msgid "Roland Stigge"
-msgstr ""
-
-#: about.cc:182
-msgid "Petter Sundlöf"
-msgstr ""
-
-#: about.cc:183
-msgid "Mike Täht"
-msgstr ""
-
-#: about.cc:184
-msgid "Roy Vegard"
-msgstr ""
-
-#: about.cc:185
-msgid "Thorsten Wilms"
-msgstr ""
-
-#: about.cc:186
-msgid "Grygorii Zharun"
-msgstr ""
-
-#: about.cc:191
-msgid ""
-"French:\n"
-"\tAlain Fréhel <alain.frehel at free.fr>\n"
-"\tChristophe Combelles <ccomb at free.fr>\n"
-"\tMartin Blanchard\n"
-"\tRomain Arnaud <roming22 at gmail.com>\n"
-msgstr ""
-"æ³è¯ï¼\n"
-"\tAlain Fréhel <alain.frehel at free.fr>\n"
-"\tChristophe Combelles <ccomb at free.fr>\n"
-"\tMartin Blanchard\n"
-"\tRomain Arnaud <roming22 at gmail.com>\n"
-
-#: about.cc:192
-msgid ""
-"German:\n"
-"\tKarsten Petersen <kapet at kapet.de>\n"
-"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
-"\tRobert Schwede <schwede at ironshark.com>\n"
-"\tBenjamin Scherrer <realhangman at web.de>\n"
-"\tEdgar Aichinger <edogawa at aon.at>\n"
-"\tRichard Oax <richard at pagliacciempire.de>\n"
-"\tRobin Gloster <robin at loc-com.de>\n"
-msgstr ""
-"å¾·è¯ï¼\n"
-"\tKarsten Petersen <kapet at kapet.de>\n"
-"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
-"\tRobert Schwede <schwede at ironshark.com>\n"
-"\tBenjamin Scherrer <realhangman at web.de>\n"
-"\tEdgar Aichinger <edogawa at aon.at>\n"
-"\tRichard Oax <richard at pagliacciempire.de>\n"
-"\tRobin Gloster <robin at loc-com.de>\n"
-
-#: about.cc:199
-msgid ""
-"Italian:\n"
-"\tFilippo Pappalardo <filippo at email.it>\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-msgstr ""
-"æå¤§å©è¯ï¼\n"
-"\tFilippo Pappalardo <filippo at email.it>\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-
-#: about.cc:200
-msgid ""
-"Portuguese:\n"
-"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-msgstr ""
-"è¡èçè¯ï¼\n"
-"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-
-#: about.cc:201
-msgid ""
-"Brazilian Portuguese:\n"
-"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
-"\tChris Ross <chris at tebibyte.org>\n"
-msgstr ""
-"巴西è¡èçè¯ï¼\n"
-"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
-"\tChris Ross <chris at tebibyte.org>\n"
-
-#: about.cc:203
-msgid ""
-"Spanish:\n"
-"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
-"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-msgstr ""
-"西ççè¯ï¼\n"
-"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
-"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-
-#: about.cc:204
-msgid ""
-"Russian:\n"
-"\t Igor Blinov <pitstop at nm.ru>\n"
-"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-msgstr ""
-"ä¿è¯ï¼\n"
-"\t Igor Blinov <pitstop at nm.ru>\n"
-"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-
-#: about.cc:206
-msgid ""
-"Greek:\n"
-"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-msgstr ""
-"å¸è
è¯ï¼\n"
-"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-
-#: about.cc:207
-msgid ""
-"Swedish:\n"
-"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-msgstr ""
-"çå
¸è¯ï¼\n"
-"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-
-#: about.cc:208
-msgid ""
-"Polish:\n"
-"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-msgstr ""
-"æ³¢å
°è¯ï¼\n"
-"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-
-#: about.cc:209
-msgid ""
-"Czech:\n"
-"\t Pavel Fric <pavelfric at seznam.cz>\n"
-msgstr ""
-"æ·å
è¯ï¼\n"
-"\t Pavel Fric <pavelfric at seznam.cz>\n"
-
-#: about.cc:210
-msgid ""
-"Norwegian:\n"
-"\t Eivind ÃdegÃ¥rd\n"
-msgstr ""
-"æªå¨è¯ï¼\n"
-"\t Eivind ÃdegÃ¥rd\n"
-
-#: about.cc:211
-msgid ""
-"Chinese:\n"
-"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-msgstr ""
-"æ±è¯ï¼\n"
-"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-
-#: about.cc:591
-msgid "Copyright (C) 1999-2015 Paul Davis\n"
-msgstr "çæææ (C) 1999-2015 Paul Davis\n"
-
-#: about.cc:595
-msgid "http://ardour.org/"
-msgstr ""
-
-#: about.cc:596
-msgid ""
-"%1%2\n"
-"(built from revision %3)"
-msgstr ""
-"%1%2\n"
-"(修订èªçæ¬ %3)"
-
-#: about.cc:600
-msgid "Config"
-msgstr "é
ç½®"
-
-#: actions.cc:85
-msgid "Loading menus from %1"
-msgstr "æ£å¨è½½å
¥èå %1"
-
-#: actions.cc:88 actions.cc:89
-msgid "badly formatted menu definition file: %1"
-msgstr "带æéè¯¯æ ¼å¼çèåå®ä¹æä»¶ï¼ %1"
-
-#: actions.cc:91
-msgid "%1 menu definition file not found"
-msgstr "%1 èåå®ä¹æä»¶æªæ¾å°"
-
-#: actions.cc:95 actions.cc:96
-msgid "%1 will not work without a valid menu definition file"
-msgstr "缺失ææçèåå®ä¹æä»¶å°å¯¼è´ %1 æ æ³å·¥ä½ã"
-
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "æ·»å é³è½¨ææ»çº¿"
-
-#: add_route_dialog.cc:57
-msgid "Configuration:"
-msgstr "é
ç½®:"
-
-#: add_route_dialog.cc:58
-msgid "Record Mode:"
-msgstr "å½å¶æ¨¡å¼ï¼"
-
-#: add_route_dialog.cc:59
-msgid "Instrument:"
-msgstr "ä¹å¨ï¼"
-
-#: add_route_dialog.cc:77
-msgid "Audio Tracks"
-msgstr "é³é¢è½¨é"
-
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
-msgid "MIDI Tracks"
-msgstr "MIDI 轨é"
-
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
-msgid "Audio+MIDI Tracks"
-msgstr "é³é¢+MIDI 轨é"
-
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "æ»çº¿"
-
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
-msgid "First"
-msgstr "èµ·å§ç¹"
-
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
-msgstr "å¨ç¼è¾å¨å·²éæ©é¨åä¹å"
-
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr "卿··é³å¨å·²éæ©é¨åä¹å"
-
-#: add_route_dialog.cc:86
-msgid "Last"
-msgstr "ç»æç¹"
-
-#: add_route_dialog.cc:103
-msgid "Add:"
-msgstr "æ·»å ï¼"
-
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
-msgid "<b>Options</b>"
-msgstr "<b>é项</b>"
-
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
-msgid "Name:"
-msgstr "åç§°ï¼"
-
-#: add_route_dialog.cc:156
-msgid "Group:"
-msgstr "åç»ï¼"
-
-#: add_route_dialog.cc:162
-msgid "Insert:"
-msgstr "æå
¥ï¼"
-
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
-msgid "Audio"
-msgstr "é³é¢"
-
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
-msgid "MIDI"
-msgstr "MIDI"
-
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
-msgid "Audio+MIDI"
-msgstr "Audio+MIDI"
-
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
-msgid "Bus"
-msgstr "æ»çº¿"
-
-#: add_route_dialog.cc:268
-msgid ""
-"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use both "
-"audio and MIDI input data\n"
-"\n"
-"If you do not plan to use such a plugin, then use a normal audio or MIDI track "
-"instead."
-msgstr ""
-"é³é¢+MIDI 轨éå·²ç»åå¤å°±ç»ª ï¼<b>ä½ä»
éäº</b> 使ç¨é³é¢åMIDIè¾å
¥æ°æ®çæä»¶ã\n"
-"\n"
-"妿æ¨ä¸æç®ä½¿ç¨è¿æ ·ä¸ä¸ªæä»¶ï¼é£ä¹è¯·ä½¿ç¨æ®éçé³é¢æMIDI轨éä½ä¸ºæ¿ä»£ã"
-
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
-msgid "Normal"
-msgstr "æ®é"
-
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
-msgid "Non Layered"
-msgstr "ä¸åå±ç"
-
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
-msgid "Tape"
-msgstr "ç£å¸¦"
-
-#: add_route_dialog.cc:431 monitor_section.cc:290
-msgid "Mono"
-msgstr "å声é"
-
-#: add_route_dialog.cc:435
-msgid "Stereo"
-msgstr "å声éç«ä½å£°"
-
-#: add_route_dialog.cc:459
-msgid "3 Channel"
-msgstr "ä¸å£°é"
-
-#: add_route_dialog.cc:463
-msgid "4 Channel"
-msgstr "å声é"
-
-#: add_route_dialog.cc:467
-msgid "5 Channel"
-msgstr "äºå£°é"
-
-#: add_route_dialog.cc:471
-msgid "6 Channel"
-msgstr "å
声é"
-
-#: add_route_dialog.cc:475
-msgid "8 Channel"
-msgstr "å
«å£°é"
-
-#: add_route_dialog.cc:479
-msgid "12 Channel"
-msgstr "åäºå£°é"
-
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
-msgid "Custom"
-msgstr "èªå®ä¹"
-
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
-msgid "New Group..."
-msgstr "æ°å»ºç¾¤ç»â¦"
-
-#: add_route_dialog.cc:520 route_group_menu.cc:85
-msgid "No Group"
-msgstr "没æç¾¤ç»"
-
-#: ambiguous_file_dialog.cc:30
-msgid "Ambiguous File"
-msgstr "模ç³çæä»¶"
-
-#: ambiguous_file_dialog.cc:35
-msgid ""
-"%1 has found the file <i>%2</i> in the following places:\n"
-"\n"
-msgstr ""
-"%1 被åç°ä½äºæä»¶ <i>%2</i> ç以ä¸ä½ç½®ï¼\n"
-"\n"
-
-#: ambiguous_file_dialog.cc:44
-msgid ""
-"\n"
-"\n"
-"Please select the path that you want to get the file from."
-msgstr ""
-"\n"
-"\n"
-"è¯·éæ©æ¨æ³è·åçæä»¶æå¨çè·¯å¾ã"
-
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
-msgid "Done"
-msgstr "宿"
-
-#: analysis_window.cc:46
-msgid "Signal source"
-msgstr "ä¿¡å·æº"
-
-#: analysis_window.cc:47
-msgid "Selected ranges"
-msgstr "éæ©èå´"
-
-#: analysis_window.cc:48
-msgid "Selected regions"
-msgstr "éæ©åºå"
-
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "æ¾ç¤ºæ¨¡å¼"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "æ¯ä¸ªé³è½¨çåæå¾"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "ææé³è½¨çåæå¾"
-
-#: analysis_window.cc:54
-msgid "Show frequency power range"
-msgstr "æ¾ç¤ºé¢ççåçèå´"
-
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "è§èåæ°å¼"
-
-#: analysis_window.cc:59
-msgid "FFT analysis window"
-msgstr "FFT å¿«éå
ç«å¶åæ¢åæè§çª"
-
-#: analysis_window.cc:60 editor.cc:1823
-msgid "Spectral Analysis"
-msgstr "é¢è°±åæ"
-
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
-msgid "Track"
-msgstr "é³è½¨"
-
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131 mixer_ui.cc:1854
-msgid "Show"
-msgstr "æ¾ç¤º"
-
-#: analysis_window.cc:135
-msgid "Re-analyze data"
-msgstr "éæ°åææ°æ®"
-
-#: ardour_button.cc:887
-msgid "button cannot watch state of non-existing Controllable\n"
-msgstr "æé®æ æ³æ¾ç¤ºä¸åå¨çææ§ç¶æ\n"
-
-#: ardour_button.cc:1155
-msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-
-#: ardour_ui.cc:164
-msgid ""
-"%1 %2.x has discovered configuration files from %1 %3.x.\n"
-"\n"
-"Would you like to copy the relevant files before starting to use the program?\n"
-"\n"
-"(This will require you to restart %1.)"
-msgstr ""
-"%1 %2.x åç°é
ç½®æä»¶æ¥æºäº %1 %3.x.\n"
-"\n"
-"å¨å¯ç¨è¿ä¸ªç¨åºåï¼æ¨æç®å¤å¶å
³èæä»¶åï¼\n"
-"\n"
-"ï¼è¿å°éè¦ä½ éæ°å¯å¨ %1.ï¼"
-
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
-msgid "Audition"
-msgstr "çå¬"
-
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
-msgid "Solo"
-msgstr "ç¬å¥"
-
-#: ardour_ui.cc:213 rc_option_editor.cc:741
-msgid "Feedback"
-msgstr "åé¦"
-
-#: ardour_ui.cc:219 speaker_dialog.cc:36
-msgid "Speaker Configuration"
-msgstr "æ¬å£°å¨é
ç½®"
-
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "æé®ç»å®"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "é¦é项"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
-msgid "Add Tracks/Busses"
-msgstr "æ·»å é³è½¨/æ»çº¿"
-
-#: ardour_ui.cc:223
-msgid "About"
-msgstr "å
³äº"
-
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "ä½ç½®"
-
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
-msgid "Tracks and Busses"
-msgstr "é³è½¨åæ»çº¿"
-
-#: ardour_ui.cc:226 engine_dialog.cc:70
-msgid "Audio/MIDI Setup"
-msgstr "é³é¢/MIDI设置"
-
-#: ardour_ui.cc:227
-msgid "Video Export Dialog"
-msgstr "è§é¢å¯¼åºå¯¹è¯æ¡"
-
-#: ardour_ui.cc:228
-msgid "Properties"
-msgstr "屿§"
-
-#: ardour_ui.cc:230 bundle_manager.cc:264
-msgid "Bundle Manager"
-msgstr "å
裹管çå¨"
-
-#: ardour_ui.cc:231 big_clock_window.cc:37
-msgid "Big Clock"
-msgstr "Big Clock 大计æ¶å¨"
-
-#: ardour_ui.cc:232
-msgid "Audio Connections"
-msgstr "é³é¢è¿æ¥"
-
-#: ardour_ui.cc:233
-msgid "MIDI Connections"
-msgstr "MIDI è¿æ¥"
-
-#: ardour_ui.cc:242
-msgid "Your configuration files were copied. You can now restart %1."
-msgstr "æ¨çé
ç½®æä»¶å·²ç»å¤ä»½å®æãç°å¨å¯ä»¥éæ°å¯å¨ %1 ã"
-
-#: ardour_ui.cc:481
-msgid ""
-"The audio backend was shutdown because:\n"
-"\n"
-"%1"
-msgstr ""
-"é³é¢å端已å
³éï¼å 为ï¼\n"
-"\n"
-"%1"
-
-#: ardour_ui.cc:483
-msgid ""
-"The audio backend has either been shutdown or it\n"
-"disconnected %1 because %1\n"
-"was not fast enough. Try to restart\n"
-"the audio backend and save the session."
-msgstr ""
-"é³é¢å端è¦ä¹å·²ç»å
³éï¼\n"
-"è¦ä¹å®ä¸ %1 失å»äºè¿æ¥ï¼\n"
-"å 为 %1ä¸å¤å¿«ã\n"
-"请å°è¯éæ°å¯å¨é³é¢å端并ä¿åä¼è¯ã"
-
-#: ardour_ui.cc:507
-msgid ""
-"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. Please see "
-"the log window for further details."
-msgstr "é³é¢åå
æä»¶æ«æå¤±è´¥ãèªå¨ AU æ«æå·²è¢«ç¦ç¨ã详æ
请åé
æ¥å¿çªå£ã"
-
-#: ardour_ui.cc:508
-msgid "Audio Unit Plugin Scan Failed:"
-msgstr "é³é¢åå
æä»¶æ«æå¤±è´¥ï¼"
-
-# NSM (network service manager)
-#: ardour_ui.cc:827
-msgid "NSM server did not announce itself"
-msgstr "NSMæå¡å¨æ²¡æè¡¨æèº«ä»½"
-
-#: ardour_ui.cc:840
-msgid "NSM: no client ID provided"
-msgstr "NSMï¼æ²¡ææä¾å®¢æ·æºè¯å«å·"
-
-#: ardour_ui.cc:847
-msgid "NSM: no session created"
-msgstr "NSMï¼æ²¡æå·²å建çä¼è¯"
-
-#: ardour_ui.cc:870
-msgid "NSM: initialization failed"
-msgstr "NSMï¼åå§å失败"
-
-#: ardour_ui.cc:900
-msgid "Free/Demo Version Warning"
-msgstr "å
è´¹/æ¼ç¤ºçæ¬çè¦å"
-
-#: ardour_ui.cc:902
-msgid "Subscribe and support development of %1"
-msgstr "订é
忝æåå± %1"
-
-#: ardour_ui.cc:903
-msgid "Don't warn me about this again"
-msgstr "ä¸åæéæè¿ä¸ª"
-
-#: ardour_ui.cc:905
-msgid ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
-msgstr ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
-
-#: ardour_ui.cc:906
-msgid "This is a free/demo version of %1"
-msgstr "è¿æ¯ä¸ä¸ªå
è´¹/æ¼ç¤ºçæ¬ %1"
-
-#: ardour_ui.cc:907
-msgid "It will not restore OR save any plugin settings"
-msgstr "å®ä¸ä¼æ¢å¤æä¿åä»»ä½æä»¶è®¾ç½®"
-
-#: ardour_ui.cc:908
-msgid ""
-"If you load an existing session with plugin settings\n"
-"they will not be used and will be lost."
-msgstr ""
-"妿æ¨è½½å
¥ä¸ä¸ªå¸¦ææä»¶è®¾ç½®çå·²åå¨çä¼è¯\n"
-"å®ä»¬å°ä¸ä¼è¢«éç¨å¹¶å°ä¼è¢«ä¸¢å¤±ã"
-
-#: ardour_ui.cc:910 plugin_ui.cc:569
-msgid ""
-"To get full access to updates without this limitation\n"
-"consider becoming a subscriber for a low cost every month."
-msgstr ""
-"为äºä¸åè¿ä¸ªéå¶å°å级èå¾å°å®æ´ä½¿ç¨æï¼\n"
-"请èèä»¥æ¯ææä½çææ¬èæä¸ºä¸ä¸ªç¨æ·ã"
-
-#: ardour_ui.cc:920
-msgid "Quit now"
-msgstr "ç«å³éåº"
-
-#: ardour_ui.cc:921
-msgid "Continue using %1"
-msgstr "ç»§ç»ä½¿ç¨ %1"
-
-#: ardour_ui.cc:954 startup.cc:345
-msgid "%1 is ready for use"
-msgstr "%1 åå¤å°±ç»ª"
-
-#: ardour_ui.cc:996
-msgid ""
-"WARNING: Your system has a limit for maximum amount of locked memory. This might "
-"cause %1 to run out of memory before your system runs out of memory. \n"
-"\n"
-"You can view the memory limit with 'ulimit -l', and it is normally controlled by %2"
-msgstr ""
-"è¦åï¼æ¨çç³»ç»æå¯¹äºéå®å
åçæå¤§æ°ééå¶ãè¿å¯è½ä¼å¨æ¨çç³»ç»èå°½å
åä¹åï¼é¦å
导"
-"è´ %1 æ å
åå¯ç¨ã\n"
-"\n"
-"æ¨å¯ä»¥ä½¿ç¨âulimit -lâå½ä»¤æ¥æ¥çå
åéå¶ï¼é常å®ç± %2 æ¥æ§å¶ã"
-
-#: ardour_ui.cc:1013
-msgid "Do not show this window again"
-msgstr "ä¸åæ¾ç¤ºæ¤çªå£"
-
-#: ardour_ui.cc:1057
-msgid "Don't quit"
-msgstr "ä¸éåº"
-
-#: ardour_ui.cc:1058
-msgid "Just quit"
-msgstr "ä¸ä¿åèéåº"
-
-#: ardour_ui.cc:1059
-msgid "Save and quit"
-msgstr "ä¿åå¹¶éåº"
-
-#: ardour_ui.cc:1069
-msgid ""
-"%1 was unable to save your session.\n"
-"\n"
-"If you still wish to quit, please use the\n"
-"\n"
-"\"Just quit\" option."
-msgstr ""
-"%1 æ æ³ä¿åæ¨çä¼è¯ã\n"
-"\n"
-"妿æ¨ä»æç®éåºï¼\n"
-"\n"
-"请å¯ç¨âä¸ä¿åèéåºâé项ã"
-
-#: ardour_ui.cc:1119
-msgid "Unsaved Session"
-msgstr " å°æªä¿åçä¼è¯"
-
-#: ardour_ui.cc:1140
-msgid ""
-"The session \"%1\"\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"
-"\n"
-"åææä½çä¿®æ¹å°ä¼ä¸¢å¤±\n"
-"é¤éæ¨ä¿åå®ã\n"
-"\n"
-"æ¨æç®å¦ä½åï¼"
-
-#: ardour_ui.cc:1143
-msgid ""
-"The snapshot \"%1\"\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"
-"\n"
-"åææä½çä¿®æ¹å°ä¼ä¸¢å¤±\n"
-"é¤éæ¨ä¿åå®ã\n"
-"\n"
-"æ¨æç®å¦ä½åï¼"
-
-#: ardour_ui.cc:1157
-msgid "Prompter"
-msgstr "æè¯æº"
-
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
-msgid "Audio: <span foreground=\"red\">none</span>"
-msgstr "é³é¢ï¼<span foreground=\"red\">æ </span>"
-
-#: ardour_ui.cc:1281
-#, c-format
-msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr "é³é¢ï¼ <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-
-#: ardour_ui.cc:1285
-#, c-format
-msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr "é³é¢ï¼<span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
-msgid "File:"
-msgstr "æä»¶ï¼"
-
-#: ardour_ui.cc:1307
-msgid "BWF"
-msgstr ""
-
-#: ardour_ui.cc:1310
-msgid "WAV"
-msgstr ""
-
-#: ardour_ui.cc:1313
-msgid "WAV64"
-msgstr ""
-
-#: ardour_ui.cc:1316 session_option_editor.cc:185
-msgid "CAF"
-msgstr ""
-
-#: ardour_ui.cc:1319
-msgid "AIFF"
-msgstr ""
-
-#: ardour_ui.cc:1322
-msgid "iXML"
-msgstr ""
-
-#: ardour_ui.cc:1325
-msgid "RF64"
-msgstr ""
-
-#: ardour_ui.cc:1333
-msgid "32-float"
-msgstr ""
-
-#: ardour_ui.cc:1336
-msgid "24-int"
-msgstr ""
-
-#: ardour_ui.cc:1339
-msgid "16-int"
-msgstr ""
-
-# DSP æ°åä¿¡å·å¤çå¨ï¼Digital Signal Processorï¼
-#: ardour_ui.cc:1358
-#, c-format
-msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-msgstr "æ°åä¿¡å·å¤çå¨ï¼ <span foreground=\"%s\">%5.1f%%</span>"
-
-#: ardour_ui.cc:1377
-#, c-format
-msgid ""
-"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
-msgstr ""
-"ç¼å²åºï¼ <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
-
-#: ardour_ui.cc:1418
-msgid "Disk: <span foreground=\"green\">Unknown</span>"
-msgstr "硬çï¼ <span foreground=\"green\">Unknown</span>"
-
-#: ardour_ui.cc:1420
-msgid "Disk: <span foreground=\"green\">24hrs+</span>"
-msgstr "硬çï¼<span foreground=\"green\">24hrs+</span>"
-
-#: ardour_ui.cc:1438
-msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
-msgstr "硬çï¼<span foreground=\"green\">>24 hrs</span>"
-
-#: ardour_ui.cc:1449
-#, c-format
-msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-msgstr "硬çï¼<span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-
-#: ardour_ui.cc:1475
-#, c-format
-msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
-msgstr "æ¶é´ç |TCï¼<span foreground=\"%s\">%s</span>"
-
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318 session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "æè¿çä¼è¯"
-
-#: ardour_ui.cc:1684
-msgid ""
-"%1 is not connected to any audio backend.\n"
-"You cannot open or close sessions in this condition"
-msgstr ""
-"%1 没æè¿æ¥å°ä»»ä½é³é¢å端ã\n"
-"å¨è¿ç§æ
åµä¸æ¨ä¸è½æå¼æå
³éä¼è¯"
-
-#: ardour_ui.cc:1708
-msgid "Open Session"
-msgstr "æå¼ä¼è¯"
-
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
-msgid "%1 sessions"
-msgstr "%1 ä¼è¯"
-
-#: ardour_ui.cc:1770
-msgid "You cannot add a track without a session already loaded."
-msgstr "卿²¡æä»»ä½ä¸ä¸ªä¼è¯è¢«è½½å
¥ä¹åï¼æ¨ä¸è½æ·»å é³è½¨ã"
-
-#: ardour_ui.cc:1778
-msgid "could not create %1 new mixed track"
-msgid_plural "could not create %1 new mixed tracks"
-msgstr[0] "æ æ³å建 %1 æ°çæ··é³è½¨é"
-
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"没æè¶³å¤å¯ç¨ç端å£\n"
-"å»å建ä¸ä¸ªæ°çé³è½¨ææ»çº¿ã\n"
-"æ¨åºå½ä¿å %1ï¼\n"
-"éåºå¹¶ä¸å¸¦çæ´å¤ç端å£éæ°å¯å¨ã"
-
-#: ardour_ui.cc:1819
-msgid "You cannot add a track or bus without a session already loaded."
-msgstr "卿²¡æä»»ä½ä¸ä¸ªä¼è¯è¢«è½½å
¥ä¹åï¼æ¨ä¸è½æ·»å é³è½¨ææ»çº¿ã"
-
-#: ardour_ui.cc:1828
-msgid "could not create %1 new audio track"
-msgid_plural "could not create %1 new audio tracks"
-msgstr[0] "æ æ³å建 %1 æ°çé³é¢è½¨é"
-
-#: ardour_ui.cc:1837
-msgid "could not create %1 new audio bus"
-msgid_plural "could not create %1 new audio busses"
-msgstr[0] "æ æ³å建 %1 æ°çé³é¢æ»çº¿"
-
-#: ardour_ui.cc:1990
-msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
-msgstr ""
-"å¨å½å¶ä¹å请å
åå»ºä¸æ¡æå¤æ¡é³è½¨ã\n"
-"æ¨å¯ä»¥ä½¿ç¨ä¼è¯èåä¸çâæ·»å é³è½¨ææ»çº¿âé项æ¥å®ç°ã"
-
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "å¦å为â¦"
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "æ°å»ºå¿«ç
§çåç§°"
-
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "çæå¿«ç
§"
-
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "æ°å»ºå¿«ç
§çåç§°"
-
-#: ardour_ui.cc:2405
-msgid ""
-"To ensure compatibility with various systems\n"
-"snapshot names may not contain a '%1' character"
-msgstr ""
-"为äºç¡®ä¿å¨ä¸åç³»ç»é´çå
¼å®¹æ§\n"
-"å¿«ç
§åç§°ä¸è½å
å«' % 1 'å符"
-
-#: ardour_ui.cc:2417
-msgid "Confirm Snapshot Overwrite"
-msgstr "ç¡®å®è¦çå¿«ç
§"
-
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name. Do you want to overwrite it?"
-msgstr "å·²åå¨ç¸ååç§°çå¿«ç
§ãæ¨æç®è¦çå®ï¼"
-
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "è¦ç"
-
-#: ardour_ui.cc:2455
-msgid "Rename Session"
-msgstr "éå½åä¼è¯"
-
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
-msgid ""
-"To ensure compatibility with various systems\n"
-"session names may not contain a '%1' character"
-msgstr ""
-"为äºç¡®ä¿å¨ä¸åç³»ç»é´çå
¼å®¹æ§\n"
-"ä¼è¯åç§°ä¸è½å
å«' % 1 'å符"
-
-#: ardour_ui.cc:2478
-msgid "That name is already in use by another directory/folder. Please try again."
-msgstr "æ¤å称已被å¦ä¸ä¸ªç®å½/æä»¶å¤¹ä½¿ç¨ã 请åå°è¯å¦ä¸ä¸ªã"
-
-#: ardour_ui.cc:2487
-msgid ""
-"Renaming this session failed.\n"
-"Things could be seriously messed up at this point"
-msgstr ""
-"éå½åä¼è¯å¤±è´¥.\n"
-"ä»ç°å¨å¼å§äºæ
ççå°ä¼åå¾å¾éº»ç¦ã"
-
-#: ardour_ui.cc:2602
-msgid "Save Template"
-msgstr "ä¿å模æ¿..."
-
-#: ardour_ui.cc:2603
-msgid "Name for template:"
-msgstr "模æ¿å:"
-
-#: ardour_ui.cc:2604
-msgid "-template"
-msgstr "-模æ¿"
-
-#: ardour_ui.cc:2643
-msgid ""
-"This session\n"
-"%1\n"
-"already exists. Do you want to open it?"
-msgstr ""
-"ä¼è¯\n"
-"%1\n"
-"å·²åå¨ãæ¯å¦ æå¼å®ï¼"
-
-#: ardour_ui.cc:2653
-msgid "Open Existing Session"
-msgstr "æå¼å·²åå¨çä¼è¯"
-
-#: ardour_ui.cc:2914
-msgid "There is no existing session at \"%1\""
-msgstr "å¨ \"%1\" 没æä¼è¯æä»¶"
-
-#: ardour_ui.cc:3006
-msgid "Please wait while %1 loads your session"
-msgstr "请çå¾
%1 è½½å
¥æ¨çä¼è¯"
-
-#: ardour_ui.cc:3021
-msgid "Port Registration Error"
-msgstr "ç«¯å£æ³¨åé误"
-
-#: ardour_ui.cc:3022
-msgid "Click the Close button to try again."
-msgstr "请åå»å
³éæé®ï¼åå°è¯ä¸é"
-
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "ä¼è¯ \"%1 (å¿«ç
§ %2)\" è½½å
¥å¤±è´¥"
-
-#: ardour_ui.cc:3049
-msgid "Loading Error"
-msgstr "è½½å
¥é误"
-
-#: ardour_ui.cc:3068
-msgid ""
-"This session has been opened in read-only mode.\n"
-"\n"
-"You will not be able to record or save."
-msgstr ""
-"æ¬æ¬¡ä¼è¯å·²ç»ä»¥åªè¯»æ¨¡å¼æå¼ã\n"
-"\n"
-"æ¨ä¸è½å½å¶æè
ä¿åã"
-
-#: ardour_ui.cc:3073
-msgid "Read-only Session"
-msgstr "åªè¯»ä¼è¯"
-
-#: ardour_ui.cc:3139
-msgid "Could not create session in \"%1\""
-msgstr "å¨ \"%1\" æ æ³å建ä¼è¯"
-
-#: ardour_ui.cc:3288
-msgid "No files were ready for clean-up"
-msgstr "没æå¯ä»¥æ¸
空çæä»¶"
-
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
-msgid "Clean-up"
-msgstr "æ¸
空"
-
-#: ardour_ui.cc:3293
-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 ""
-"å¦æè¿æ
åµçèµ·æ¥æç¹å¼å¸¸ï¼\n"
-"è¯·æ£æ¥ä»»ä½å·²åå¨çå¿«ç
§ã\n"
-"å®ä»¬ä¹è®¸ä»å
æ¬ææäºèå´\n"
-" éè¦ç»§ç»ä¿çæäºæªä½¿ç¨çæä»¶ã"
-
-#: ardour_ui.cc:3352
-msgid "kilo"
-msgstr "å"
-
-#: ardour_ui.cc:3355
-msgid "mega"
-msgstr "å
ï¼ç¾ä¸ï¼"
-
-#: ardour_ui.cc:3358
-msgid "giga"
-msgstr "å亿ï¼åå
ï¼"
-
-#: ardour_ui.cc:3363
-msgid ""
-"The following file was deleted from %2,\n"
-"releasing %3 %4bytes of disk space"
-msgid_plural ""
-"The following %1 files were deleted from %2,\n"
-"releasing %3 %4bytes of disk space"
-msgstr[0] ""
-"ä»¥ä¸ %1 æä»¶è¢«ä» %2 å é¤ï¼\n"
-"éæ¾ %3 %4 åèçç£ç空é´"
-
-#: ardour_ui.cc:3370
-msgid ""
-"The following file was not in use and \n"
-"has been moved to: %2\n"
-"\n"
-"After a restart of %5\n"
-"\n"
-"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
-"\n"
-"will release an additional %3 %4bytes of disk space.\n"
-msgid_plural ""
-"The following %1 files were not in use and \n"
-"have been moved to: %2\n"
-"\n"
-"After a restart of %5\n"
-"\n"
-"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
-"\n"
-"will release an additional %3 %4bytes of disk space.\n"
-msgstr[0] ""
-"ä»¥ä¸ %1 æä»¶æªè¢«ä½¿ç¨\n"
-"å¹¶ä¸è¢«ç§»å¨å°ï¼ %2 \n"
-"\n"
-
-#: ardour_ui.cc:3430
-msgid "Are you sure you want to clean-up?"
-msgstr "æ¨ç¡®è®¤è¦æ¸
空ï¼"
-
-#: ardour_ui.cc:3437
-msgid ""
-"Clean-up is a destructive operation.\n"
-"ALL undo/redo information will be lost if you clean-up.\n"
-"Clean-up will move all unused files to a \"dead\" location."
-msgstr ""
-"æ¸
ç©ºæ¯æ¯çæ§çæä½ã\n"
-"å¦æä½ æ¸
空äº, ææçæ¤é/éåä¿¡æ¯å°ä¼ä¸¢å¤±ã\n"
-"æ¸
空å°ä¼ææææªä½¿ç¨è¿çæä»¶ç§»å¨å° \"æ»äº¡\" ä½ç½®ã"
-
-#: ardour_ui.cc:3445
-msgid "CleanupDialog"
-msgstr "æ¸
ç©ºå¯¹è¯æ¡"
-
-#: ardour_ui.cc:3475
-msgid "Cleaned Files"
-msgstr "æ¸
餿件"
-
-#: ardour_ui.cc:3492
-msgid "deleted file"
-msgstr "å 餿件"
-
-#: ardour_ui.cc:3637
-msgid "Video-Server was not launched by %1. The request to stop it is ignored."
-msgstr "è§é¢æå¡å¨æªè¢« %1 触åã请æ±åæ¢è§é¢æå¡å¨çè¦æ±è¢«å¿½ç¥ã"
-
-#: ardour_ui.cc:3641
-msgid "Stop Video-Server"
-msgstr "忢è§é¢æå¡å¨"
-
-#: ardour_ui.cc:3642
-msgid "Do you really want to stop the Video Server?"
-msgstr "æ¨ççæç®åæ¢è§é¢æå¡å¨ï¼"
-
-#: ardour_ui.cc:3645
-msgid "Yes, Stop It"
-msgstr "æ¯çï¼åæ¢å®"
-
-#: ardour_ui.cc:3671
-msgid "The Video Server is already started."
-msgstr "è§é¢æå¡å¨å·²ç»å¯å¨ã"
-
-#: ardour_ui.cc:3673
-msgid ""
-"An external Video Server is configured and can be reached. Not starting a new "
-"instance."
-msgstr "ä¸ä¸ªå¤é¨è§é¢æå¡å¨å·²ç»é
ç½®ä¸å¯ä»¥å®ç°ãå°æªå¯å¨ä¸ä¸ªæ°çå®ä¾ã"
-
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
-msgid ""
-"Could not connect to the Video Server. Start it or configure its access URL in "
-"Preferences."
-msgstr "æ æ³è¿æ¥å°è§é¢æå¡å¨ã请å¯å¨æè
é
ç½®è§é¢æå¡å¨ç访é®URLç½åé¦é项ã"
-
-#: ardour_ui.cc:3711
-msgid "Specified docroot is not an existing directory."
-msgstr "æå®çææ¡£æ ¹ç®å½ä¸åå¨ã"
-
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
-msgid "Given Video Server is not an executable file."
-msgstr "ç»å®çè§é¢æå¡å¨ä¸æ¯ä¸ä¸ªå¯æ§è¡æä»¶ã"
-
-#: ardour_ui.cc:3757
-msgid "Cannot launch the video-server"
-msgstr "æ æ³å¯å¨è§é¢æå¡å¨"
-
-#: ardour_ui.cc:3767
-msgid "Video-server was started but does not respond to requests..."
-msgstr "è§é¢æå¡å¨å·²ç»å¯å¨ä½æ²¡æååºè¯·æ±â¦â¦"
-
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
-msgid "could not open %1"
-msgstr "æ æ³æå¼%1"
-
-#: ardour_ui.cc:3816
-msgid "no video-file selected"
-msgstr "å°æªéæ©è§é¢æä»¶"
-
-#: ardour_ui.cc:4014
-msgid "Recording was stopped because your system could not keep up."
-msgstr "ç±äºæ¨çç³»ç»æ æ³ç»§ç»å·¥ä½å¯¼è´å½å¶åæ¢ã"
-
-#: ardour_ui.cc:4043
-msgid ""
-"The disk system on your computer\n"
-"was not able to keep up with %1.\n"
-"\n"
-"Specifically, it failed to write data to disk\n"
-"quickly enough to keep up with recording.\n"
-msgstr ""
-"æ¨çµèç硬çç³»ç»\n"
-"æ æ³æç»è·è¿ %1 ã\n"
-"\n"
-"ç¡®åå°è¯´ï¼å¤±è´¥çåå æ¯ç¡¬ççåå
¥é度\n"
-"ä¸è¶³ä»¥æç»è·ä¸å½å¶çé度ã\n"
-
-#: ardour_ui.cc:4113
-msgid "Scanning for plugins"
-msgstr "æ£å¨æ«ææä»¶"
-
-#: ardour_ui.cc:4115
-msgid "Cancel plugin scan"
-msgstr "åæ¶æä»¶æ«æ"
-
-#: ardour_ui.cc:4124
-msgid "Stop Timeout"
-msgstr "忢è¶
æ¶"
-
-#: ardour_ui.cc:4131
-msgid "Scan Timeout"
-msgstr "æ«æè¶
æ¶"
-
-#: ardour_ui.cc:4174
-msgid ""
-"The disk system on your computer\n"
-"was not able to keep up with %1.\n"
-"\n"
-"Specifically, it failed to read data from disk\n"
-"quickly enough to keep up with playback.\n"
-msgstr ""
-"æ¨çµèç硬çç³»ç»\n"
-"æ æ³æç»è·è¿ %1 ã\n"
-"\n"
-"ç¡®åå°è¯´ï¼å¤±è´¥çåå æ¯ç¡¬çç读åé度\n"
-"ä¸è¶³ä»¥æç»è·ä¸åæ¾çé度ã\n"
-
-#: ardour_ui.cc:4214
-msgid "Crash Recovery"
-msgstr "å´©æºæ¢å¤"
-
-#: ardour_ui.cc:4215
-msgid ""
-"This session appears to have been in the\n"
-"middle of recording when %1 or\n"
-"the computer was shutdown.\n"
-"\n"
-"%1 can recover any captured audio for\n"
-"you, or it can ignore it. Please decide\n"
-"what you would like to do.\n"
-msgstr ""
-"æ¬ä¼è¯ä¼¼ä¹æ¯ä¸ç´å¤å¨\n"
-"å½å¶ç䏿®µï¼å½ %1 æ¶\n"
-"æè
å¨è®¡ç®æºå
³éæ¶ã\n"
-"\n"
-" %1 å¯ä»¥ä¸ºæ¨æ¢å¤ä»»ä½å·²æè·çé³é¢ï¼\n"
-"æè
忽ç¥å®ã\n"
-"请确认æ¨çå³å®ã\n"
-
-#: ardour_ui.cc:4227
-msgid "Ignore crash data"
-msgstr "忽ç¥å´©æºçæ°æ®"
-
-#: ardour_ui.cc:4228
-msgid "Recover from crash"
-msgstr "æ¢å¤å°å´©æºå"
-
-#: ardour_ui.cc:4248
-msgid "Sample Rate Mismatch"
-msgstr "éæ ·çä¸å¹é
"
-
-#: ardour_ui.cc:4249
-msgid ""
-"This session was created with a sample rate of %1 Hz, but\n"
-"%2 is currently running at %3 Hz. If you load this session,\n"
-"audio may be played at the wrong sample rate.\n"
-msgstr ""
-"æ¬ä¼è¯å·²ç»å建 %1 Hz çéæ ·çï¼\n"
-"使¯ %2 ç®åè¿è¡å¨ %3 Hzã妿æ¨å è½½è¿ä¸ªä¼è¯ï¼\n"
-"é³é¢å¯è½ä¼å¤å¨é误çéæ ·ç䏿æ¾ã\n"
-
-#: ardour_ui.cc:4258
-msgid "Do not load session"
-msgstr "ä¸è¦è½½å
¥ä¼è¯"
-
-#: ardour_ui.cc:4259
-msgid "Load session anyway"
-msgstr "åªç®¡è½½å
¥ä¼è¯"
-
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "æ æ³ä»é³é¢/MIDI弿ä¸åæ¶è¿æ¥"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "æ æ³éæ°è¿æ¥å°é³é¢/MIDI弿"
-
-#: ardour_ui.cc:4590
-msgid ""
-"%4This is a session from an older version of %3%5\n"
-"\n"
-"%3 has copied the old session file\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"to\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"From now on, use the -2000 version with older versions of %3"
-msgstr ""
-"%4 è¿æ¯ä¸ä¸ªæ¥æºäº %3%5 æ§çæ¬çä¼è¯\n"
-"\n"
-"%3 å·²ç»è¢«å¤å¶å°æ§çä¼è¯æä»¶\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"to\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"ä»ç°å¨å¼å§ï¼ä½¿ç¨è¿å¸¦æ§ç %3 ç -2000 çæ¬"
-
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "ç¨æ·çé¢ï¼æ æ³è®¾ç½®ç¼è¾å¨"
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "ç¨æ·çé¢ï¼æ æ³è®¾ç½®æ··é³å¨"
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "ç¨æ·çé¢ï¼æ æ³è®¾ç½®èææ¡¥æ¥"
-
-#: ardour_ui2.cc:128
-msgid "Play from playhead"
-msgstr "仿éå¼å§ææ¾"
-
-#: ardour_ui2.cc:129
-msgid "Stop playback"
-msgstr "忢忾"
-
-#: ardour_ui2.cc:130
-msgid "Toggle record"
-msgstr "忢å½å¶"
-
-#: ardour_ui2.cc:131
-msgid "Play range/selection"
-msgstr "ææ¾èå´/已鿩é¨å"
-
-#: ardour_ui2.cc:132
-msgid "Go to start of session"
-msgstr "转è³ä¼è¯èµ·ç¹"
-
-#: ardour_ui2.cc:133
-msgid "Go to end of session"
-msgstr "转è³ä¼è¯ç»ç¹"
-
-#: ardour_ui2.cc:134
-msgid "Play loop range"
-msgstr "ææ¾å¾ªç¯èå´"
-
-#: ardour_ui2.cc:135
-msgid ""
-"MIDI Panic\n"
-"Send note off and reset controller messages on all MIDI channels"
-msgstr ""
-"MIDI ç»æ¢\n"
-"åéé³ç¬¦å
³éåå¤ä½æ§å¶å¨ä¿¡æ¯å°ææ MIDI éé"
-
-#: ardour_ui2.cc:136
-msgid "Return to last playback start when stopped"
-msgstr "å½åæ¢æ¶è¿åè³æå䏿¬¡åæ¾çèµ·ç¹"
-
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "æéè·éèå´å·²éæ©é¨åå¹¶ç¼è¾"
-
-#: ardour_ui2.cc:138
-msgid "Be sensible about input monitoring"
-msgstr "ç¡®ä¿æ¸
æ°çè¾å
¥çæ§"
-
-#: ardour_ui2.cc:139
-msgid "Enable/Disable audio click"
-msgstr "å¯ç¨/ç¦ç¨é³é¢è¯å«å£°ï¼èæå¨ï¼ "
-
-#: ardour_ui2.cc:140 monitor_section.cc:111
-msgid ""
-"When active, something is soloed.\n"
-"Click to de-solo everything"
-msgstr ""
-"å¯ç¨æ¶ï¼ä»
ç¬å¥æé¨åã\n"
-"Click to de-solo everything ç¹å»å
¨é¨ä¸ç¬å¥"
-
-#: ardour_ui2.cc:141
-msgid ""
-"When active, auditioning is taking place\n"
-"Click to stop the audition"
-msgstr ""
-"å½å¯ç¨æ¶çå¬å¼å§.\n"
-"ç¹å»åæ¢çå¬."
-
-#: ardour_ui2.cc:142
-msgid "When active, there is a feedback loop."
-msgstr "å¯ç¨æ¶ï¼æä¸ä¸ªåé¦åè·¯ã"
-
-#: ardour_ui2.cc:143
-msgid ""
-"<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a "
-"digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
-msgstr ""
-"<b>主计æ¶å¨</b>å³é®ç¹å»è®¾ç½®æ¾ç¤ºæ¨¡å¼ãç¹å»å³å¯ç¼è¾ï¼ç¹å»+æå¨æ°åæè
é¼ æ æ¾å¨æ°åä¸"
-"颿»å¨æ»è½®å³å¯ä¿®æ¹æ°åã\n"
-"ææ¬ç¼è¾ï¼ä»å³å°å·¦è¦ç <tt>Esc é®</tt>ï¼åæ¶ï¼ <tt>å车é®</tt>ï¼ç¡®è®¤ï¼ç¼è¾åå "
-"ä¸â+âå·æè
â-âå·å³å¯è¿å
¥ä¸ä¸çº§æ¶é´\n"
-
-#: ardour_ui2.cc:144
-msgid ""
-"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag "
-"a digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
-msgstr ""
-"<b>第äºè®¡æ¶å¨</b>å³é®ç¹å»è®¾ç½®æ¾ç¤ºæ¨¡å¼ãç¹å»å³å¯ç¼è¾ï¼ç¹å»+æå¨æ°åæè
é¼ æ æ¾å¨æ°å"
-"ä¸é¢æ»å¨æ»è½®å³å¯ä¿®æ¹æ°åã\n"
-"ææ¬ç¼è¾ï¼ä»å³å°å·¦è¦ç <tt>Esc é®</tt>ï¼åæ¶ï¼ <tt>å车é®</tt>ï¼ç¡®è®¤ï¼ç¼è¾åå "
-"ä¸â+âå·æè
â-âå·å³å¯è¿å
¥ä¸ä¸çº§æ¶é´\n"
-
-#: ardour_ui2.cc:145
-msgid "Reset All Peak Indicators"
-msgstr "éç½®ææå³°å¼ææ "
-
-#: ardour_ui2.cc:146
-msgid "Show Error Log and acknowledge warnings"
-msgstr "æ¾ç¤ºé误æ¥å¿å¹¶ç¡®è®¤è¦æ¥"
-
-#: ardour_ui2.cc:179
-msgid "[ERROR]: "
-msgstr "ãé误ãï¼"
-
-#: ardour_ui2.cc:182
-msgid "[WARNING]: "
-msgstr "ãè¦åãï¼"
-
-#: ardour_ui2.cc:185
-msgid "[INFO]: "
-msgstr "ãä¿¡æ¯ãï¼"
-
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
-msgid "Auto Return"
-msgstr "èªå¨è¿å"
-
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
-msgid "Follow Edits"
-msgstr "è·éç¼è¾"
-
-# GUI - Graphical User Interface
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
-msgid "GUI"
-msgstr "å¾å½¢ç¨æ·çé¢"
-
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399 session_option_editor.cc:321
-#: session_option_editor.cc:323 session_option_editor.cc:344
-#: session_option_editor.cc:346 session_option_editor.cc:348
-#: session_option_editor.cc:355 session_option_editor.cc:362
-#: session_option_editor.cc:366
-msgid "Misc"
-msgstr "æé¡¹"
-
-#: ardour_ui_dependents.cc:76
-msgid "Setup Editor"
-msgstr "设置ç¼è¾å¨"
-
-#: ardour_ui_dependents.cc:78
-msgid "Setup Mixer"
-msgstr "设置混é³å¨"
-
-#: ardour_ui_dependents.cc:84
-msgid "Reload Session History"
-msgstr "éæ°è£
æä¼è¯åå²"
-
-#: ardour_ui_dialogs.cc:250
-msgid "Don't close"
-msgstr "请å¿å
³é"
-
-#: ardour_ui_dialogs.cc:251
-msgid "Just close"
-msgstr "åªç®¡å
³é"
-
-#: ardour_ui_dialogs.cc:252
-msgid "Save and close"
-msgstr "ä¿åå¹¶å
³é"
-
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "è¿ä¸ªå±å¹çé«åº¦ä¸è¶³ä»¥æ¾ç¤ºæ··é³å¨çªå£"
-
-#: ardour_ui_ed.cc:102
-msgid "Session"
-msgstr "ä¼è¯"
-
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116 port_group.cc:458
-#: session_option_editor.cc:82 session_option_editor.cc:89
-msgid "Sync"
-msgstr "忥"
-
-#: ardour_ui_ed.cc:106
-msgid "Options"
-msgstr "é项"
-
-#: ardour_ui_ed.cc:107
-msgid "Window"
-msgstr "çªå£"
-
-#: ardour_ui_ed.cc:108
-msgid "Help"
-msgstr "帮å©"
-
-#: ardour_ui_ed.cc:109
-msgid "Misc. Shortcuts"
-msgstr "æé¡¹ã å¿«æ·é®"
-
-#: ardour_ui_ed.cc:110
-msgid "Audio File Format"
-msgstr "é³é¢æä»¶æ ¼å¼"
-
-#: ardour_ui_ed.cc:111
-msgid "File Type"
-msgstr "æä»¶ç±»å"
-
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
-msgid "Sample Format"
-msgstr "éæ ·æ ¼å¼"
-
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
-msgid "Control Surfaces"
-msgstr "æ§å¶é¢"
-
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
-msgid "Plugins"
-msgstr "æä»¶"
-
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
-msgid "Metering"
-msgstr "èæ"
-
-#: ardour_ui_ed.cc:116
-msgid "Fall Off Rate"
-msgstr "è¡°åç"
-
-#: ardour_ui_ed.cc:117
-msgid "Hold Time"
-msgstr "æç»æ¶é´"
-
-#: ardour_ui_ed.cc:118
-msgid "Denormal Handling"
-msgstr "é常è§å¤ç"
-
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
-msgid "New..."
-msgstr "æ°å»ºâ¦"
-
-#: ardour_ui_ed.cc:124
-msgid "Open..."
-msgstr "æå¼â¦"
-
-#: ardour_ui_ed.cc:125
-msgid "Recent..."
-msgstr "æè¿çâ¦"
-
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
-msgid "Close"
-msgstr "å
³é"
-
-#: ardour_ui_ed.cc:129
-msgid "Add Track or Bus..."
-msgstr "æ·»å é³è½¨ææ»çº¿â¦"
-
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "æå¼è§é¢"
-
-#: ardour_ui_ed.cc:137
-msgid "Remove Video"
-msgstr "ç§»é¤è§é¢"
-
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "导åºä¸ºè§é¢æä»¶"
-
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "å¿«ç
§â¦"
-
-#: ardour_ui_ed.cc:148
-msgid "Save As..."
-msgstr "å¦å为â¦"
-
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
-msgid "Rename..."
-msgstr "éå½åâ¦"
-
-#: ardour_ui_ed.cc:156
-msgid "Save Template..."
-msgstr "ä¿å模æ¿â¦"
-
-#: ardour_ui_ed.cc:159
-msgid "Metadata"
-msgstr "å
æ°æ®"
-
-#: ardour_ui_ed.cc:162
-msgid "Edit Metadata..."
-msgstr "ç¼è¾å
æ°æ®â¦"
-
-#: ardour_ui_ed.cc:165
-msgid "Import Metadata..."
-msgstr "导å
¥å
æ°æ®â¦"
-
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "导åºä¸ºé³é¢æä»¶â¦"
-
-#: ardour_ui_ed.cc:171
-msgid "Stem export..."
-msgstr "主ä½å¯¼åºâ¦"
-
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
-msgid "Export"
-msgstr "导åº"
-
-#: ardour_ui_ed.cc:177
-msgid "Clean-up Unused Sources..."
-msgstr "æ¸
空æªä½¿ç¨çæºâ¦"
-
-#: ardour_ui_ed.cc:181
-msgid "Flush Wastebasket"
-msgstr "æ¸
ç©ºåæ¶ç«"
-
-#: ardour_ui_ed.cc:188
-msgid "Quit"
-msgstr "éåº"
-
-#: ardour_ui_ed.cc:192
-msgid "Maximise Editor Space"
-msgstr "æå¤§åç¼è¾å¨ç©ºé´"
-
-#: ardour_ui_ed.cc:193
-msgid "Maximise Mixer Space"
-msgstr "æå¤§åæ··é³å¨ç©ºé´"
-
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "æ¾ç¤ºå·¥å
·æ "
-
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
-msgstr "æ¾ç¤ºæ´å¤ç¨æ·çé¢é¦é项"
-
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "çªå£|æ··é³å¨"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "忢ç¼è¾å¨+æ··é³å¨"
-
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
-msgid "Window|Meterbridge"
-msgstr "çªå£|èææ¡¥æ¥"
-
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "éæ°éå ææççæ®µ"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
-msgid "MIDI Tracer"
-msgstr "MIDI é³è½¨"
-
-#: ardour_ui_ed.cc:208
-msgid "Chat"
-msgstr "è天"
-
-#: ardour_ui_ed.cc:210
-msgid "Help|Manual"
-msgstr "帮å©|æå"
-
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "åè"
-
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr "æ¥åæ
é"
-
-#: ardour_ui_ed.cc:213
-msgid "Cheat Sheet"
-msgstr "å¤å¿å½"
-
-#: ardour_ui_ed.cc:214
-msgid "Ardour Website"
-msgstr "Ardour å®ç½"
-
-#: ardour_ui_ed.cc:215
-msgid "Ardour Development"
-msgstr "Ardour å¼å "
-
-#: ardour_ui_ed.cc:216
-msgid "User Forums"
-msgstr "ç¨æ·è®ºå"
-
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr "å¦ä½æ¥åæ
é"
-
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
-msgid "Save"
-msgstr "ä¿å"
-
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
-msgid "Transport"
-msgstr "æé"
-
-#: ardour_ui_ed.cc:233
-msgid "Stop"
-msgstr "忢"
-
-#: ardour_ui_ed.cc:236
-msgid "Roll"
-msgstr "æ»å¨"
-
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
-msgid "Start/Stop"
-msgstr "å¼å§/忢"
-
-#: ardour_ui_ed.cc:246
-msgid "Start/Continue/Stop"
-msgstr "å¼å§/ç»§ç»/忢"
-
-#: ardour_ui_ed.cc:249
-msgid "Stop and Forget Capture"
-msgstr "æåå¹¶ä¸åºå¼å·²æè·å
容"
-
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "è¿æ¸¡å°æ»å¨"
-
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "è¿æ¸¡å°åå"
-
-#: ardour_ui_ed.cc:267
-msgid "Play Loop Range"
-msgstr "å¾ªç¯ææ¾èå´"
-
-#: ardour_ui_ed.cc:270
-msgid "Play Selection"
-msgstr "ææ¾å·²éæ©é¨å"
-
-#: ardour_ui_ed.cc:273
-msgid "Play Selection w/Preroll"
-msgstr "ææ¾å·²éæ©é¨å颿»"
-
-#: ardour_ui_ed.cc:277
-msgid "Enable Record"
-msgstr "å¯ç¨å½å¶"
-
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
-msgid "Start Recording"
-msgstr "å¼å§å½å¶"
-
-#: ardour_ui_ed.cc:288
-msgid "Rewind"
-msgstr "å带"
-
-#: ardour_ui_ed.cc:291
-msgid "Rewind (Slow)"
-msgstr "åå¸¦ï¼æ
¢éï¼"
-
-#: ardour_ui_ed.cc:294
-msgid "Rewind (Fast)"
-msgstr "å带ï¼å¿«éï¼"
-
-#: ardour_ui_ed.cc:297
-msgid "Forward"
-msgstr "å¿«è¿"
-
-#: ardour_ui_ed.cc:300
-msgid "Forward (Slow)"
-msgstr "å¿«è¿ï¼æ
¢éï¼"
-
-#: ardour_ui_ed.cc:303
-msgid "Forward (Fast)"
-msgstr "å¿«è¿ï¼å¿«éï¼"
-
-#: ardour_ui_ed.cc:306
-msgid "Go to Zero"
-msgstr "转å°é¶ç¹"
-
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
-msgid "Go to Start"
-msgstr "转å°èµ·å§ä½ç½®"
-
-#: ardour_ui_ed.cc:315
-msgid "Go to End"
-msgstr "è½¬å°æ«å°¾ä½ç½®"
-
-#: ardour_ui_ed.cc:318
-msgid "Go to Wall Clock"
-msgstr "转å°è®¡æ¶ç¹"
-
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
-msgid "Numpad Decimal"
-msgstr "æ°åé®çåè¿å¶"
-
-#: ardour_ui_ed.cc:329
-msgid "Numpad 0"
-msgstr "æ°åé®ç 0"
-
-#: ardour_ui_ed.cc:332
-msgid "Numpad 1"
-msgstr "æ°åé®ç 1"
-
-#: ardour_ui_ed.cc:335
-msgid "Numpad 2"
-msgstr "æ°åé®ç 2"
-
-#: ardour_ui_ed.cc:338
-msgid "Numpad 3"
-msgstr "æ°åé®ç 3"
-
-#: ardour_ui_ed.cc:341
-msgid "Numpad 4"
-msgstr "æ°åé®ç 4"
-
-#: ardour_ui_ed.cc:344
-msgid "Numpad 5"
-msgstr "æ°åé®ç 5"
-
-#: ardour_ui_ed.cc:347
-msgid "Numpad 6"
-msgstr "æ°åé®ç 6"
-
-#: ardour_ui_ed.cc:350
-msgid "Numpad 7"
-msgstr "æ°åé®ç 7"
-
-#: ardour_ui_ed.cc:353
-msgid "Numpad 8"
-msgstr "æ°åé®ç 8"
-
-#: ardour_ui_ed.cc:356
-msgid "Numpad 9"
-msgstr "æ°åé®ç 9"
-
-#: ardour_ui_ed.cc:360
-msgid "Focus On Clock"
-msgstr "èç¦äºè®¡æ¶å¨"
-
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
-#: session_option_editor.cc:41 session_option_editor.cc:61
-#: session_option_editor.cc:80 session_option_editor.cc:96
-#: session_option_editor.cc:109 session_option_editor.cc:122
-#: session_option_editor.cc:124 session_option_editor.cc:126
-msgid "Timecode"
-msgstr "æ¶é´ç "
-
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
-msgid "Bars & Beats"
-msgstr "å°è & æå"
-
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
-msgid "Minutes & Seconds"
-msgstr "å&ç§"
-
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
-msgid "Samples"
-msgstr "éæ ·"
-
-#: ardour_ui_ed.cc:382
-msgid "Punch In"
-msgstr "åå
¥"
-
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843 mixer_strip.cc:2007
-#: route_ui.cc:162 time_info_box.cc:116
-msgid "In"
-msgstr "å
¥"
-
-#: ardour_ui_ed.cc:386
-msgid "Punch Out"
-msgstr "ååº"
-
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
-msgid "Out"
-msgstr "åº"
-
-#: ardour_ui_ed.cc:390
-msgid "Punch In/Out"
-msgstr "åå
¥/ååº"
-
-#: ardour_ui_ed.cc:391
-msgid "In/Out"
-msgstr "å
¥/åº"
-
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
-msgid "Click"
-msgstr "ç¹å»"
-
-#: ardour_ui_ed.cc:397
-msgid "Auto Input"
-msgstr "èªå¨è¾å
¥"
-
-#: ardour_ui_ed.cc:400
-msgid "Auto Play"
-msgstr "èªå¨ææ¾"
-
-#: ardour_ui_ed.cc:411
-msgid "Sync Startup to Video"
-msgstr "忥å¯å¨å°è§é¢"
-
-#: ardour_ui_ed.cc:413
-msgid "Time Master"
-msgstr "计æ¶å¨ä¸»æ§"
-
-#: ardour_ui_ed.cc:420
-msgid "Toggle Record Enable Track %1"
-msgstr "忢å½å¶å¯ç¨é³è½¨ %1"
-
-#: ardour_ui_ed.cc:427
-msgid "Percentage"
-msgstr "ç¾åæ¯"
-
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
-msgid "Semitones"
-msgstr "åé³"
-
-#: ardour_ui_ed.cc:432
-msgid "Send MTC"
-msgstr "åéMTC"
-
-#: ardour_ui_ed.cc:434
-msgid "Send MMC"
-msgstr "åéMMC"
-
-#: ardour_ui_ed.cc:436
-msgid "Use MMC"
-msgstr "使ç¨MMC"
-
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
-msgid "Send MIDI Clock"
-msgstr "åéMIDI计æ¶å¨"
-
-#: ardour_ui_ed.cc:440
-msgid "Send MIDI Feedback"
-msgstr "åéMIDIåé¦"
-
-#: ardour_ui_ed.cc:446
-msgid "Panic"
-msgstr "ç»æ¢"
-
-#: ardour_ui_ed.cc:534
-msgid "Wall Clock"
-msgstr "计æ¶ç¹"
-
-#: ardour_ui_ed.cc:536
-msgid "Disk Space"
-msgstr "硬ç空é´"
-
-#: ardour_ui_ed.cc:537
-msgid "DSP"
-msgstr "æ°åä¿¡å·å¤ç"
-
-#: ardour_ui_ed.cc:538
-msgid "Buffers"
-msgstr "ç¼å²"
-
-#: ardour_ui_ed.cc:540
-msgid "Timecode Format"
-msgstr " æ¶é´ç æ ¼å¼"
-
-#: ardour_ui_ed.cc:541
-msgid "File Format"
-msgstr "æä»¶æ ¼å¼"
-
-#: ardour_ui_options.cc:63
-msgid ""
-"It is not possible to use JACK as the the sync source\n"
-"when the pull up/down setting is non-zero."
-msgstr ""
-"彿å¨ä¸/ä¸ç设置为éé¶æ¶ï¼\n"
-"ä¸å¯è½ä½¿ç¨JACKä½ä¸ºåæ¥æºã"
-
-#: ardour_ui_options.cc:317
-msgid "Internal"
-msgstr "å
é¨ç"
-
-#: ardour_ui_options.cc:498
-msgid "Enable/Disable external positional sync"
-msgstr "å¯ç¨/ç¦ç¨å¤é¨ä½ç½®åæ¥"
-
-#: ardour_ui_options.cc:500
-msgid "Sync to JACK is not possible: video pull up/down is set"
-msgstr "ä¸å¯è½åæ¥JACKï¼è§é¢æå¨ä¸/ä¸å½å设置"
-
-#: audio_clock.cc:1047 audio_clock.cc:1066
-msgid "--pending--"
-msgstr "âæç½®â"
-
-#: audio_clock.cc:1118
-msgid "SR"
-msgstr ""
-
-#: audio_clock.cc:1124 audio_clock.cc:1128
-msgid "Pull"
-msgstr "æå¨"
-
-#: audio_clock.cc:1126
-#, c-format
-msgid "%+.4f%%"
-msgstr "%+.4f%%"
-
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139 editor_actions.cc:561
-msgid "Tempo"
-msgstr "èå¥"
-
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
-msgid "Meter"
-msgstr "èæ"
-
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845 streamview.cc:470
-msgid "programming error: %1"
-msgstr "ç¨åºé误: %1"
-
-#: audio_clock.cc:1997 audio_clock.cc:2025
-msgid "programming error: %1 %2"
-msgstr "ç¨åºé误ï¼%1 %2"
-
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
-msgid "Bars:Beats"
-msgstr "å°è:æå"
-
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
-msgid "Minutes:Seconds"
-msgstr "å:ç§"
-
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "仿é设置"
-
-#: audio_clock.cc:2100
-msgid "Locate to This Time"
-msgstr "æ¾ç½®æ¤æ¶é´"
-
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
-msgid "dB"
-msgstr ""
-
-#: audio_region_editor.cc:67
-msgid "Region gain:"
-msgstr "åºåå¢çï¼"
-
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
-msgid "dBFS"
-msgstr ""
-
-#: audio_region_editor.cc:80
-msgid "Peak amplitude:"
-msgstr "å³°å¼å¹
度ï¼"
-
-#: audio_region_editor.cc:91
-msgid "Calculating..."
-msgstr "计ç®ä¸â¦"
-
-#: audio_region_view.cc:1243
-msgid "add gain control point"
-msgstr "æ·»å å¢çæ§å¶ç¹"
-
-#: automation_controller.cc:286 automation_controller.cc:302
-msgid "Select Note..."
-msgstr "éæ©é³ç¬¦â¦"
-
-#: automation_controller.cc:293
-msgid "Halve"
-msgstr "åå"
-
-#: automation_controller.cc:296
-msgid "Double"
-msgstr "å å"
-
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr "设为 %1 æ"
-
-#: automation_line.cc:286 automation_line.cc:462
-msgid "automation event move"
-msgstr "èªå¨åäºä»¶ç§»å¨"
-
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "èªå¨åèå´ç§»å¨"
-
-#: automation_line.cc:880 region_gain_line.cc:72
-msgid "remove control point"
-msgstr "ç§»é¤æ§å¶ç¹"
-
-#: automation_line.cc:1003
-msgid "Ignoring illegal points on AutomationLine \"%1\""
-msgstr "忽ç¥èªå¨å线路ä¸çéæ³ç¹ï¼â %1 â"
-
-#: automation_region_view.cc:190 automation_time_axis.cc:644
-msgid "add automation event"
-msgstr "æ·»å èªå¨åäºä»¶"
-
-#: automation_streamview.cc:95
-msgid "unable to display automation region for control without list"
-msgstr "æ æ³æ¾ç¤ºæ²¡æå表çèªå¨ååºåæ§å¶"
-
-#: automation_time_axis.cc:163
-msgid "automation state"
-msgstr "èªå¨åç¶æ"
-
-#: automation_time_axis.cc:164
-msgid "hide track"
-msgstr "éèé³è½¨"
-
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
-msgid "Automation|Manual"
-msgstr "èªå¨å | æå"
-
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981 editor_actions.cc:122
-#: editor_actions.cc:1920 gain_meter.cc:223 generic_pluginui.cc:99
-#: generic_pluginui.cc:526 generic_pluginui.cc:819 midi_time_axis.cc:1606
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1612 panner_ui.cc:154
-msgid "Play"
-msgstr "ææ¾"
-
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
-msgid "Write"
-msgstr "åå
¥"
-
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
-msgid "Touch"
-msgstr "触碰"
-
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
-msgid "???"
-msgstr "???"
-
-#: automation_time_axis.cc:445
-msgid "clear automation"
-msgstr "æ¸
é¤èªå¨å"
-
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "éè"
-
-#: automation_time_axis.cc:545
-msgid "Clear"
-msgstr "æ¸
é¤"
-
-#: automation_time_axis.cc:576
-msgid "State"
-msgstr "ç¶æ"
-
-#: automation_time_axis.cc:592
-msgid "Discrete"
-msgstr "离æ£"
-
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
-msgid "Linear"
-msgstr "线æ§"
-
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
-msgid "Mode"
-msgstr "模å¼"
-
-#: bundle_manager.cc:182
-msgid "Disassociate"
-msgstr "åé"
-
-#: bundle_manager.cc:186
-msgid "Edit Bundle"
-msgstr "ç¼è¾å
裹"
-
-#: bundle_manager.cc:201
-msgid "Direction:"
-msgstr "æ¹åï¼"
-
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
-msgid "Input"
-msgstr "è¾å
¥"
-
-#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371 mixer_strip.cc:2243
-#: rc_option_editor.cc:2330
-msgid "Output"
-msgstr "è¾åº"
-
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94 editor_actions.cc:104
-#: rc_option_editor.cc:1087 rc_option_editor.cc:1094
-msgid "Edit"
-msgstr "ç¼è¾"
-
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
-msgid "Delete"
-msgstr "å é¤"
-
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
-msgid "Name"
-msgstr "åç§°"
-
-#: bundle_manager.cc:283
-msgid "New"
-msgstr "æ°å»º"
-
-#: bundle_manager.cc:333
-msgid "Bundle"
-msgstr "å
裹"
-
-#: bundle_manager.cc:418
-msgid "Add Channel"
-msgstr "æ·»å 声é"
-
-#: bundle_manager.cc:425
-msgid "Rename Channel"
-msgstr "éå½å声é"
-
-#: configinfo.cc:28
-msgid "Build Configuration"
-msgstr "å建é
ç½®"
-
-#: control_point_dialog.cc:33
-msgid "Control point"
-msgstr "æ§å¶ç¹"
-
-#: control_point_dialog.cc:45
-msgid "Value"
-msgstr "å¼"
-
-#: edit_note_dialog.cc:42
-msgid "Note"
-msgstr "é³ç¬¦"
-
-#: edit_note_dialog.cc:45
-msgid "Set selected notes to this channel"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬å£°é"
-
-#: edit_note_dialog.cc:46
-msgid "Set selected notes to this pitch"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬é³é«"
-
-#: edit_note_dialog.cc:47
-msgid "Set selected notes to this velocity"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬å度"
-
-#: edit_note_dialog.cc:49
-msgid "Set selected notes to this time"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬æ¶é´"
-
-#: edit_note_dialog.cc:51
-msgid "Set selected notes to this length"
-msgstr "设置已éä¸çé³ç¬¦ä¸ºæ¬é¿åº¦"
-
-#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
-#: step_entry.cc:394
-msgid "Channel"
-msgstr "é³è½¨"
-
-#: edit_note_dialog.cc:68
-msgid "Pitch"
-msgstr "é³é«"
-
-#: edit_note_dialog.cc:78 step_entry.cc:408
-msgid "Velocity"
-msgstr "å度"
-
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
-msgid "Time"
-msgstr "æ¶é´"
-
-#: edit_note_dialog.cc:98 editor_regions.cc:115 export_timespan_selector.cc:378
-#: export_timespan_selector.cc:440 location_ui.cc:320 midi_list_editor.cc:115
-#: time_info_box.cc:108
-msgid "Length"
-msgstr "é¿åº¦"
-
-#: edit_note_dialog.cc:165
-msgid "edit note"
-msgstr "ç¼è¾é³ç¬¦"
-
-#: editor.cc:147
-msgid "CD Frames"
-msgstr "CD æ¡æ¶"
-
-#: editor.cc:148
-msgid "TC Frames"
-msgstr "TC æ¡æ¶"
-
-#: editor.cc:149
-msgid "TC Seconds"
-msgstr "TC ç§"
-
-#: editor.cc:150
-msgid "TC Minutes"
-msgstr "TC å"
-
-#: editor.cc:151
-msgid "Seconds"
-msgstr "ç§"
-
-#: editor.cc:152
-msgid "Minutes"
-msgstr "å"
-
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
-msgid "Beats/128"
-msgstr "128æ"
-
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
-msgid "Beats/64"
-msgstr "64æ"
-
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
-msgid "Beats/32"
-msgstr "32æ"
-
-#: editor.cc:156
-msgid "Beats/28"
-msgstr "28æ"
-
-#: editor.cc:157
-msgid "Beats/24"
-msgstr "24æ"
-
-#: editor.cc:158
-msgid "Beats/20"
-msgstr "20æ"
-
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
-msgid "Beats/16"
-msgstr "16æ"
-
-#: editor.cc:160
-msgid "Beats/14"
-msgstr "14æ"
-
-#: editor.cc:161
-msgid "Beats/12"
-msgstr "12æ"
-
-#: editor.cc:162
-msgid "Beats/10"
-msgstr "10æ"
-
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
-msgid "Beats/8"
-msgstr "8æ"
-
-#: editor.cc:164
-msgid "Beats/7"
-msgstr "7æ"
-
-#: editor.cc:165
-msgid "Beats/6"
-msgstr "6æ"
-
-#: editor.cc:166
-msgid "Beats/5"
-msgstr "5æ"
-
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
-msgid "Beats/4"
-msgstr "4æ"
-
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
-msgid "Beats/3"
-msgstr "3æ"
-
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
-msgid "Beats/2"
-msgstr "2æ"
-
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
-msgid "Beats"
-msgstr "1æ"
-
-#: editor.cc:171
-msgid "Bars"
-msgstr "å°è"
-
-#: editor.cc:172
-msgid "Marks"
-msgstr "æ è®°"
-
-#: editor.cc:173
-msgid "Region starts"
-msgstr "åºåå¼å§"
-
-#: editor.cc:174
-msgid "Region ends"
-msgstr "åºåç»æ"
-
-#: editor.cc:175
-msgid "Region syncs"
-msgstr "åºå忥"
-
-#: editor.cc:176
-msgid "Region bounds"
-msgstr "åºåè¾¹ç"
-
-#: editor.cc:181 editor_actions.cc:510
-msgid "No Grid"
-msgstr "æ ç½æ ¼"
-
-#: editor.cc:182 editor_actions.cc:511
-msgid "Grid"
-msgstr "ç½æ ¼"
-
-#: editor.cc:183 editor_actions.cc:512
-msgid "Magnetic"
-msgstr "ç£æ§å¸é"
-
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
-msgid "Playhead"
-msgstr "æé"
-
-#: editor.cc:189 editor_actions.cc:495
-msgid "Marker"
-msgstr "æ è®°"
-
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
-msgid "Mouse"
-msgstr "é¼ æ "
-
-#: editor.cc:195 editor_actions.cc:502
-msgid "Slide"
-msgstr "æ»è¡"
-
-#: editor.cc:196
-msgid "Splice"
-msgstr "æ¼æ¥"
-
-#: editor.cc:197 editor_actions.cc:501
-msgid "Ripple"
-msgstr "波纹"
-
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503 editor_actions.cc:1789
-#: editor_markers.cc:905 editor_rulers.cc:260 location_ui.cc:58 mixer_strip.cc:195
-#: mixer_strip.cc:2028
-msgid "Lock"
-msgstr "éå®"
-
-#: editor.cc:203 mono_panner_editor.cc:42
-msgid "Left"
-msgstr "å·¦"
-
-#: editor.cc:204 mono_panner_editor.cc:47
-msgid "Right"
-msgstr "å³"
-
-#: editor.cc:205
-msgid "Center"
-msgstr "ä¸"
-
-#: editor.cc:208 editor.cc:3231
-msgid "Edit point"
-msgstr "ç¼è¾ç¹"
-
-#: editor.cc:214
-msgid "Mushy"
-msgstr "模ç³"
-
-#: editor.cc:215
-msgid "Smooth"
-msgstr "å¹³æ»"
-
-#: editor.cc:216
-msgid "Balanced multitimbral mixture"
-msgstr "平衡çå¤éé³è²æ··åä¹"
-
-#: editor.cc:217
-msgid "Unpitched percussion with stable notes"
-msgstr "带æç¨³å®é³ç¬¦çæªå®é³é«æå»ä¹"
-
-#: editor.cc:218
-msgid "Crisp monophonic instrumental"
-msgstr "欢快çå声è°ä¹å¨"
-
-#: editor.cc:219
-msgid "Unpitched solo percussion"
-msgstr "æªå®é³é«çç¬å¥æå»ä¹"
-
-#: editor.cc:220
-msgid "Resample without preserving pitch"
-msgstr "ä¸ä¿æé³é«çéæ°éæ ·"
-
-#: editor.cc:256
-msgid "Mins:Secs"
-msgstr "å:ç§"
-
-#: editor.cc:262
-msgid "Location Markers"
-msgstr "ä½ç½®æ è®°"
-
-#: editor.cc:263
-msgid "Range Markers"
-msgstr "èå´æ è®°"
-
-#: editor.cc:264
-msgid "Loop/Punch Ranges"
-msgstr "å¾ªç¯ / 忢èå´"
-
-#: editor.cc:265 editor_actions.cc:565
-msgid "CD Markers"
-msgstr "CDæ è®°"
-
-#: editor.cc:266
-msgid "Video Timeline"
-msgstr "è§é¢æ¶é´çº¿"
-
-#: editor.cc:283
-msgid "mode"
-msgstr "模å¼"
-
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
-msgid "Markers"
-msgstr "æ è®°"
-
-#: editor.cc:577 rc_option_editor.cc:1939
-msgid "Regions"
-msgstr "åºå"
-
-#: editor.cc:578
-msgid "Tracks & Busses"
-msgstr "é³è½¨ & æ»çº¿"
-
-#: editor.cc:579
-msgid "Snapshots"
-msgstr "å¿«ç
§"
-
-#: editor.cc:580
-msgid "Track & Bus Groups"
-msgstr "é³è½¨ & æ»çº¿åç»"
-
-#: editor.cc:581
-msgid "Ranges & Marks"
-msgstr "èå´ & æ è®°"
-
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619 rc_option_editor.cc:1627
-#: rc_option_editor.cc:1635 rc_option_editor.cc:1643 rc_option_editor.cc:1667
-#: rc_option_editor.cc:1679 rc_option_editor.cc:1681 rc_option_editor.cc:1689
-#: rc_option_editor.cc:1697 rc_option_editor.cc:1717 rc_option_editor.cc:1729
-#: rc_option_editor.cc:1731 rc_option_editor.cc:1733 rc_option_editor.cc:1741
-#: rc_option_editor.cc:1749 rc_option_editor.cc:1757 rc_option_editor.cc:1772
-#: rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "ç¼è¾å¨"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
-msgid "Loop"
-msgstr "循ç¯"
-
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
-msgid "Punch"
-msgstr "忢"
-
-#: editor.cc:1449 rc_option_editor.cc:1661
-msgid "Linear (for highly correlated material)"
-msgstr "线æ§ï¼é«åº¦ç¸å
³çææï¼"
-
-#: editor.cc:1459 rc_option_editor.cc:1662
-msgid "Constant power"
-msgstr "æå®åç"
-
-#: editor.cc:1468 rc_option_editor.cc:1663
-msgid "Symmetric"
-msgstr "对称"
-
-#: editor.cc:1478 rc_option_editor.cc:1664
-msgid "Slow"
-msgstr "æ
¢"
-
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
-msgid "Fast"
-msgstr "å¿«"
-
-#: editor.cc:1509 editor.cc:1534
-msgid "Deactivate"
-msgstr "åæ¶æ¿æ´»"
-
-#: editor.cc:1511 editor.cc:1536
-msgid "Activate"
-msgstr "æ¿æ´»"
-
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
-msgid "Freeze"
-msgstr "å»ç»"
-
-#: editor.cc:1641
-msgid "Unfreeze"
-msgstr "åæ¶å»ç»"
-
-#: editor.cc:1780
-msgid "Selected Regions"
-msgstr "已鿩çåºå"
-
-#: editor.cc:1816 editor_markers.cc:940
-msgid "Play Range"
-msgstr "ææ¾èå´"
-
-#: editor.cc:1817 editor_markers.cc:943
-msgid "Loop Range"
-msgstr "循ç¯èå´"
-
-#: editor.cc:1820 editor_markers.cc:950
-msgid "Zoom to Range"
-msgstr "缩æ¾è³æ´ä¸ªèå´"
-
-#: editor.cc:1829 editor_actions.cc:369
-msgid "Move Range Start to Previous Region Boundary"
-msgstr "ç§»å¨èå´èµ·ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor.cc:1836 editor_actions.cc:376
-msgid "Move Range Start to Next Region Boundary"
-msgstr "ç§»å¨èå´èµ·ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor.cc:1843 editor_actions.cc:383
-msgid "Move Range End to Previous Region Boundary"
-msgstr "ç§»å¨èå´ç»ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor.cc:1850 editor_actions.cc:390
-msgid "Move Range End to Next Region Boundary"
-msgstr "ç§»å¨èå´ç»ç¹å°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
-msgid "Separate"
-msgstr "å离"
-
-#: editor.cc:1857
-msgid "Convert to Region in Region List"
-msgstr "å¨åºåå表转æ¢è³åºå"
-
-#: editor.cc:1860 editor_markers.cc:970
-msgid "Select All in Range"
-msgstr "å¨èå´å
å
¨é"
-
-#: editor.cc:1863 editor_actions.cc:297
-msgid "Set Loop from Selection"
-msgstr "ä»å·²éæ©é¨å设置循ç¯"
-
-#: editor.cc:1864 editor_actions.cc:298
-msgid "Set Punch from Selection"
-msgstr "ä»å·²éæ©é¨åè®¾ç½®åæ¢"
-
-#: editor.cc:1865 editor_actions.cc:299
-msgid "Set Session Start/End from Selection"
-msgstr "ä»å·²éæ©é¨å设置ä¼è¯èµ·ç¹/ç»ç¹"
-
-#: editor.cc:1868
-msgid "Add Range Markers"
-msgstr "æ·»å èå´æ è®°"
-
-#: editor.cc:1871
-msgid "Crop Region to Range"
-msgstr "è£åªåºåå°èå´"
-
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "ç¨åºåå¡«å
èå´"
-
-#: editor.cc:1873 editor_actions.cc:311
-msgid "Duplicate Range"
-msgstr "å¤å¶èå´"
-
-#: editor.cc:1876
-msgid "Consolidate Range"
-msgstr "åå¹¶èå´"
-
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "åå¹¶èå´å¹¶å¤ç"
-
-#: editor.cc:1878
-msgid "Bounce Range to Region List"
-msgstr "欢跳弹å¥èå´å°åºåå表"
-
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "欢跳弹å¥èå´å°åºåå表并å¤ç"
-
-#: editor.cc:1880 editor_markers.cc:953
-msgid "Export Range..."
-msgstr "导åºèå´â¦"
-
-#: editor.cc:1882
-msgid "Export Video Range..."
-msgstr "导åºè§é¢èå´â¦"
-
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "ä»ç¼è¾ç¹ææ¾"
-
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "ä»èµ·ç¹ææ¾"
-
-#: editor.cc:1900
-msgid "Play Region"
-msgstr "ææ¾åºå"
-
-#: editor.cc:1902
-msgid "Loop Region"
-msgstr "循ç¯åºå"
-
-#: editor.cc:1912 editor.cc:1989
-msgid "Select All in Track"
-msgstr "å¨é³è½¨ä¸å
¨éææ"
-
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
-msgid "Select All Objects"
-msgstr "å
¨éææå¯¹è±¡ç©ä½"
-
-#: editor.cc:1914 editor.cc:1991
-msgid "Invert Selection in Track"
-msgstr "å¨é³è½¨åé"
-
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
-msgid "Invert Selection"
-msgstr "åé"
-
-#: editor.cc:1917
-msgid "Set Range to Loop Range"
-msgstr "设置èå´å°å¾ªç¯èå´"
-
-#: editor.cc:1918
-msgid "Set Range to Punch Range"
-msgstr "设置èå´å°åæ¢åºé´"
-
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
-msgid "Select All After Edit Point"
-msgstr "å
¨éç¼è¾ç¹åææ"
-
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
-msgid "Select All Before Edit Point"
-msgstr "å
¨éç¼è¾åææ"
-
-#: editor.cc:1922 editor.cc:1996
-msgid "Select All After Playhead"
-msgstr "å
¨éæéåææ"
-
-#: editor.cc:1923 editor.cc:1997
-msgid "Select All Before Playhead"
-msgstr "å
¨éæéåææ"
-
-#: editor.cc:1924
-msgid "Select All Between Playhead and Edit Point"
-msgstr "å
¨éæéåç¼è¾ç¹ä¹é´ææ"
-
-#: editor.cc:1925
-msgid "Select All Within Playhead and Edit Point"
-msgstr "å
¨éæéåç¼è¾ç¹å
鍿æ"
-
-#: editor.cc:1926
-msgid "Select Range Between Playhead and Edit Point"
-msgstr "éæ©æéåç¼è¾ç¹ä¹é´èå´"
-
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
-msgid "Select"
-msgstr "éæ©"
-
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
-msgid "Cut"
-msgstr "åªå"
-
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
-msgid "Copy"
-msgstr "å¤å¶"
-
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
-msgid "Paste"
-msgstr "ç²è´´"
-
-#: editor.cc:1942 editor_actions.cc:91
-msgid "Align"
-msgstr "对é½"
-
-#: editor.cc:1943
-msgid "Align Relative"
-msgstr "对é½ç¸å
³"
-
-#: editor.cc:1950
-msgid "Insert Selected Region"
-msgstr "æå
¥å·²éæ©çåºå"
-
-#: editor.cc:1951
-msgid "Insert Existing Media"
-msgstr "æå
¥å·²åå¨çåªä½"
-
-#: editor.cc:1960 editor.cc:2016
-msgid "Nudge Entire Track Later"
-msgstr "ååå¾®è°æ´ä¸ªé³è½¨"
-
-#: editor.cc:1961 editor.cc:2017
-msgid "Nudge Track After Edit Point Later"
-msgstr "ååå¾®è°ç¼è¾ç¹ä»¥åçé³è½¨"
-
-#: editor.cc:1962 editor.cc:2018
-msgid "Nudge Entire Track Earlier"
-msgstr "ååå¾®è°æ´ä¸ªé³è½¨"
-
-#: editor.cc:1963 editor.cc:2019
-msgid "Nudge Track After Edit Point Earlier"
-msgstr "ååå¾®è°ç¼è¾ç¹ä»¥åçé³è½¨"
-
-#: editor.cc:1965 editor.cc:2021
-msgid "Nudge"
-msgstr "å¾®è°"
-
-#: editor.cc:2235
-msgid "Playhead position stored with a negative value - ignored (use zero instead)"
-msgstr "æéä½ç½®åå¨ä¸ºä¸ä¸ªè´å¼ââ忽ç¥ï¼ç¨é¶ä»£æ¿ï¼"
-
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
-#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
-msgid "All"
-msgstr "ææ"
-
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
-msgstr "æºè½æ¨¡å¼ï¼æ·»å èå´åè½å°æå模å¼ï¼"
-
-#: editor.cc:3211
-msgid "Grab Mode (select/move objects)"
-msgstr "æå模å¼ï¼éæ©/ç§»å¨å¯¹è±¡ç©ä½ï¼"
-
-#: editor.cc:3212
-msgid "Cut Mode (split regions)"
-msgstr "å岿¨¡å¼ï¼æååºåï¼"
-
-#: editor.cc:3213
-msgid "Range Mode (select time ranges)"
-msgstr "èå´æ¨¡å¼ï¼éæ©æ¶é´èå´ï¼"
-
-#: editor.cc:3214
-msgid "Draw Mode (draw and edit gain/notes/automation)"
-msgstr "æç»æ¨¡å¼ï¼æç»åç¼è¾å¢ç/é³ç¬¦/èªå¨åï¼"
-
-#: editor.cc:3215
-msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
-msgstr "延伸模å¼ï¼æ¶é´å»¶ä¼¸é³é¢åMIDIåºåï¼ä¿æé³é«ï¼"
-
-#: editor.cc:3216
-msgid "Audition Mode (listen to regions)"
-msgstr "ç嬿¨¡å¼ï¼è¯å¬åºåï¼"
-
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr "å
é¨ç¼è¾æ¨¡å¼ï¼å¨åºåå
ç¼è¾é³ç¬¦åå¢çæ²çº¿ï¼"
-
-#: editor.cc:3218
-msgid ""
-"Groups: click to (de)activate\n"
-"Context-click for other operations"
-msgstr ""
-"åç»ï¼ç¹å»ï¼ä¸ï¼å¯ç¨\n"
-"å³é®ç¹å»å
¶å®æä½"
-
-#: editor.cc:3219
-msgid "Nudge Region/Selection Later"
-msgstr "ååå¾®è°åºå/已鿩é¨å"
-
-#: editor.cc:3220
-msgid "Nudge Region/Selection Earlier"
-msgstr "ååå¾®è°åºå/已鿩é¨å"
-
-#: editor.cc:3221 editor_actions.cc:262
-msgid "Zoom In"
-msgstr "æ¾å¤§"
-
-#: editor.cc:3222 editor_actions.cc:261
-msgid "Zoom Out"
-msgstr "缩å°"
-
-#: editor.cc:3223
-msgid "Zoom to Time Scale"
-msgstr "缩æ¾è³æ¶é´æ¯ä¾"
-
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
-msgid "Zoom to Session"
-msgstr "缩æ¾è³æ´ä¸ªä¼è¯"
-
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr "缩æ¾ç¦ç¹"
-
-#: editor.cc:3226
-msgid "Expand Tracks"
-msgstr "æ©å±é³è½¨"
-
-#: editor.cc:3227
-msgid "Shrink Tracks"
-msgstr "æ¶ç¼©é³è½¨"
-
-#: editor.cc:3228
-msgid "Number of visible tracks"
-msgstr "å¯è§é³è½¨æ°é"
-
-#: editor.cc:3229
-msgid "Snap/Grid Units"
-msgstr "å¸é/ç½æ ¼åä½"
-
-#: editor.cc:3230
-msgid "Snap/Grid Mode"
-msgstr "å¸é/ç½æ ¼æ¨¡å¼"
-
-#: editor.cc:3232
-msgid "Edit Mode"
-msgstr "ç¼è¾æ¨¡å¼"
-
-#: editor.cc:3233
-msgid ""
-"Nudge Clock\n"
-"(controls distance used to nudge regions and selections)"
-msgstr ""
-"å¾®è°è®¡æ¶å¨\n"
-"ï¼ä½¿ç¨å¾®è°åºåå已鿩é¨åæ¥æ§å¶è·ç¦»ï¼"
-
-#: editor.cc:3501 editor_actions.cc:313
-msgid "Command|Undo"
-msgstr "å½ä»¤|æ¤é"
-
-#: editor.cc:3503
-msgid "Command|Undo (%1)"
-msgstr "å½ä»¤|æ¤éï¼%1ï¼"
-
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316 editor_actions.cc:317
-msgid "Redo"
-msgstr "éå"
-
-#: editor.cc:3512
-msgid "Redo (%1)"
-msgstr "éåï¼%1ï¼"
-
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
-msgid "Duplicate"
-msgstr "å¤å¶"
-
-#: editor.cc:3532
-msgid "Number of duplications:"
-msgstr "å¤å¶æ°éï¼"
-
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
-msgid "Selection"
-msgstr "已鿩é¨å"
-
-#: editor.cc:3709
-msgid "Fit 1 track"
-msgstr "å¹é
é³è½¨"
-
-#: editor.cc:3710
-msgid "Fit 2 tracks"
-msgstr "å¹é
2é³è½¨"
-
-#: editor.cc:3711
-msgid "Fit 4 tracks"
-msgstr "å¹é
4é³è½¨"
-
-#: editor.cc:3712
-msgid "Fit 8 tracks"
-msgstr "å¹é
8é³è½¨"
-
-#: editor.cc:3713
-msgid "Fit 16 tracks"
-msgstr "å¹é
16é³è½¨"
-
-#: editor.cc:3714
-msgid "Fit 24 tracks"
-msgstr "å¹é
24é³è½¨"
-
-#: editor.cc:3715
-msgid "Fit 32 tracks"
-msgstr "å¹é
32é³è½¨"
-
-#: editor.cc:3716
-msgid "Fit 48 tracks"
-msgstr "å¹é
48é³è½¨"
-
-#: editor.cc:3717
-msgid "Fit All tracks"
-msgstr "å¹é
ææé³è½¨"
-
-#: editor.cc:3718
-msgid "Fit Selection"
-msgstr "å¹é
已鿩é¨å"
-
-#: editor.cc:3720
-msgid "Zoom to 10 ms"
-msgstr "缩æ¾è³ 10 毫ç§"
-
-#: editor.cc:3721
-msgid "Zoom to 100 ms"
-msgstr "缩æ¾è³ 100 毫ç§"
-
-#: editor.cc:3722
-msgid "Zoom to 1 sec"
-msgstr "缩æ¾è³ 1 ç§"
-
-#: editor.cc:3723
-msgid "Zoom to 10 sec"
-msgstr "缩æ¾è³ 10 ç§"
-
-#: editor.cc:3724
-msgid "Zoom to 1 min"
-msgstr "缩æ¾è³ 1 åé"
-
-#: editor.cc:3725
-msgid "Zoom to 10 min"
-msgstr "缩æ¾è³ 10 åé"
-
-#: editor.cc:3726
-msgid "Zoom to 1 hour"
-msgstr "缩æ¾è³ 1 å°æ¶"
-
-#: editor.cc:3727
-msgid "Zoom to 8 hours"
-msgstr "缩æ¾è³ 8 å°æ¶"
-
-#: editor.cc:3728
-msgid "Zoom to 24 hours"
-msgstr "缩æ¾è³ 24 å°æ¶"
-
-#: editor.cc:3730
-msgid "Zoom to Range/Region Selection"
-msgstr "缩æ¾è³èå´/åºå已鿩é¨å"
-
-#: editor.cc:3800
-msgid "*"
-msgstr ""
-
-#: editor.cc:4120
-msgid "Playlist Deletion"
-msgstr "ææ¾å表å é¤é¨å"
-
-#: editor.cc:4121
-msgid ""
-"Playlist %1 is currently unused.\n"
-"If it is kept, its audio files will not be cleaned.\n"
-"If it is deleted, audio files used by it alone will be cleaned."
-msgstr ""
-"ææ¾å表 %1 å½åæªè¢«ä½¿ç¨ã\n"
-"妿ä¿çå®ï¼å®çé³é¢æä»¶å°ä¸ä¼è¢«æ¸
é¤ã\n"
-"妿å é¤å®ï¼å®åç¬ä½¿ç¨è¿çé³é¢æä»¶å°ä¼è¢«æ¸
é¤ã"
-
-#: editor.cc:4131
-msgid "Delete Playlist"
-msgstr "å 餿æ¾å表"
-
-#: editor.cc:4132
-msgid "Keep Playlist"
-msgstr "ä¿çææ¾å表"
-
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
-msgid "Cancel"
-msgstr "åæ¶"
-
-#: editor.cc:4275
-msgid "new playlists"
-msgstr "æ°å»ºææ¾å表"
-
-#: editor.cc:4291
-msgid "copy playlists"
-msgstr "å¤å¶ææ¾å表"
-
-#: editor.cc:4306
-msgid "clear playlists"
-msgstr "æ¸
餿æ¾å表"
-
-#: editor.cc:5046
-msgid "Please wait while %1 loads visual data."
-msgstr "请çå %1 è½½å
¥å¯è§æ°æ®ã"
-
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
-msgid "Edit..."
-msgstr "ç¼è¾â¦"
-
-#: editor.cc:5934 editor_actions.cc:1941
-msgid "Legatize"
-msgstr " åæ³å"
-
-#: editor.cc:5936 editor_actions.cc:1940
-msgid "Quantize..."
-msgstr "éåâ¦"
-
-#: editor.cc:5938 editor_actions.cc:1943
-msgid "Remove Overlap"
-msgstr "ç§»é¤éå "
-
-#: editor.cc:5940 editor_actions.cc:1942
-msgid "Transform..."
-msgstr "忢â¦"
-
-#: editor_actions.cc:92
-msgid "Autoconnect"
-msgstr "èªå¨è¿æ¥"
-
-#: editor_actions.cc:93
-msgid "Crossfades"
-msgstr "æ·¡å
¥æ·¡åºï¼äº¤åæ·¡åï¼"
-
-#: editor_actions.cc:95
-msgid "Move Selected Marker"
-msgstr "ç§»å¨å·²éæ©çæ è®°"
-
-#: editor_actions.cc:96
-msgid "Select Range Operations"
-msgstr "éæ©èå´æä½"
-
-#: editor_actions.cc:97
-msgid "Select Regions"
-msgstr "éæ©åºå"
-
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "ç¼è¾ç¹"
-
-#: editor_actions.cc:99
-msgid "Fade"
-msgstr "æ·¡å"
-
-#: editor_actions.cc:100
-msgid "Latch"
-msgstr "çé"
-
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
-msgid "Region"
-msgstr "åºå"
-
-#: editor_actions.cc:102
-msgid "Layering"
-msgstr "åå±"
-
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
-msgid "Position"
-msgstr "ä½ç½®"
-
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
-msgid "Trim"
-msgstr "ä¿®åª"
-
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
-msgid "Gain"
-msgstr "å¢ç"
-
-#: editor_actions.cc:107 editor_actions.cc:563
-msgid "Ranges"
-msgstr "èå´"
-
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
-#: session_option_editor.cc:144 session_option_editor.cc:151
-msgid "Fades"
-msgstr "æ·¡å"
-
-#: editor_actions.cc:111
-msgid "Link"
-msgstr "龿¥"
-
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "缩æ¾ç¦ç¹"
-
-#: editor_actions.cc:113
-msgid "Locate to Markers"
-msgstr "å®ä½å°æ è®°"
-
-#: editor_actions.cc:115
-msgid "Meter falloff"
-msgstr "èæè¡°å"
-
-#: editor_actions.cc:116
-msgid "Meter hold"
-msgstr "èæä¿æ"
-
-#: editor_actions.cc:117 session_option_editor.cc:321
-msgid "MIDI Options"
-msgstr "MIDIé项"
-
-#: editor_actions.cc:118
-msgid "Misc Options"
-msgstr "å
¶å®é项"
-
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
-msgid "Monitoring"
-msgstr "çæ§ä¸"
-
-#: editor_actions.cc:120
-msgid "Active Mark"
-msgstr "å¯ç¨æ è®°"
-
-#: editor_actions.cc:123
-msgid "Primary Clock"
-msgstr "主计æ¶å¨"
-
-#: editor_actions.cc:124
-msgid "Pullup / Pulldown"
-msgstr "å䏿å¨/å䏿å¨"
-
-#: editor_actions.cc:125
-msgid "Region operations"
-msgstr "åºåæä½"
-
-#: editor_actions.cc:127 ruler_dialog.cc:28
-msgid "Rulers"
-msgstr "æ å°º"
-
-#: editor_actions.cc:128
-msgid "Views"
-msgstr "è§å¾"
-
-#: editor_actions.cc:129
-msgid "Scroll"
-msgstr "æ»å¨"
-
-#: editor_actions.cc:130
-msgid "Secondary Clock"
-msgstr "第äºè®¡æ¶å¨"
-
-#: editor_actions.cc:137
-msgid "Subframes"
-msgstr "åæ¡æ¶"
-
-#: editor_actions.cc:140
-msgid "Timecode fps"
-msgstr "æ¶é´ç FPS"
-
-#: editor_actions.cc:141 route_time_axis.cc:575
-msgid "Height"
-msgstr "é«åº¦"
-
-#: editor_actions.cc:143
-msgid "Tools"
-msgstr "å·¥å
·"
-
-#: editor_actions.cc:144
-msgid "View"
-msgstr "è§å¾"
-
-#: editor_actions.cc:146
-msgid "Zoom"
-msgstr "缩æ¾"
-
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "ç»æ¢ææ½æåæ¶éæ©ææ"
-
-#: editor_actions.cc:159
-msgid "Show Editor Mixer"
-msgstr "æ¾ç¤ºç¼è¾å¨æ··é³å¨"
-
-#: editor_actions.cc:160
-msgid "Show Editor List"
-msgstr "æ¾ç¤ºç¼è¾å¨å表"
-
-#: editor_actions.cc:162
-msgid "Playhead to Next Region Boundary"
-msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor_actions.cc:163
-msgid "Playhead to Next Region Boundary (No Track Selection)"
-msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-
-#: editor_actions.cc:164
-msgid "Playhead to Previous Region Boundary"
-msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor_actions.cc:165
-msgid "Playhead to Previous Region Boundary (No Track Selection)"
-msgstr "æéå°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-
-#: editor_actions.cc:167
-msgid "Playhead to Next Region Start"
-msgstr "æéå°ä¸ä¸ä¸ªåºåèµ·ç¹"
-
-#: editor_actions.cc:168
-msgid "Playhead to Next Region End"
-msgstr "æéå°ä¸ä¸ä¸ªåºåç»ç¹"
-
-#: editor_actions.cc:169
-msgid "Playhead to Next Region Sync"
-msgstr "ææ¾å¤´å°ä¸ä¸ä¸ªåºå忥"
-
-#: editor_actions.cc:171
-msgid "Playhead to Previous Region Start"
-msgstr "æéå°ä¸ä¸ä¸ªåºåèµ·ç¹"
-
-#: editor_actions.cc:172
-msgid "Playhead to Previous Region End"
-msgstr "æéå°ä¸ä¸ä¸ªåºåç»ç¹"
-
-#: editor_actions.cc:173
-msgid "Playhead to Previous Region Sync"
-msgstr "æéå°ä¸ä¸ä¸ªåºå忥"
-
-#: editor_actions.cc:175
-msgid "To Next Region Boundary"
-msgstr "å°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor_actions.cc:176
-msgid "To Next Region Boundary (No Track Selection)"
-msgstr "å°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-
-#: editor_actions.cc:177
-msgid "To Previous Region Boundary"
-msgstr "å°ä¸ä¸ä¸ªåºåè¾¹ç"
-
-#: editor_actions.cc:178
-msgid "To Previous Region Boundary (No Track Selection)"
-msgstr "å°ä¸ä¸ä¸ªåºåè¾¹çï¼æ é³è½¨å·²éæ©é¨åï¼"
-
-#: editor_actions.cc:180
-msgid "To Next Region Start"
-msgstr "å°ä¸ä¸ä¸ªåºåèµ·ç¹"
-
-#: editor_actions.cc:181
-msgid "To Next Region End"
-msgstr "å°ä¸ä¸ä¸ªåºåç»ç¹"
-
-#: editor_actions.cc:182
-msgid "To Next Region Sync"
-msgstr "å°ä¸ä¸ä¸ªåºå忥"
-
-#: editor_actions.cc:184
-msgid "To Previous Region Start"
-msgstr "å°ä¸ä¸ä¸ªåºåèµ·ç¹"
-
-#: editor_actions.cc:185
-msgid "To Previous Region End"
-msgstr "å°ä¸ä¸ä¸ªåºåç»ç¹"
-
-#: editor_actions.cc:186
-msgid "To Previous Region Sync"
-msgstr "å°ä¸ä¸ä¸ªåºå忥"
-
-#: editor_actions.cc:188
-msgid "To Range Start"
-msgstr "å°èå´èµ·ç¹"
-
-#: editor_actions.cc:189
-msgid "To Range End"
-msgstr "å°èå´ç»ç¹"
-
-#: editor_actions.cc:191
-msgid "Playhead to Range Start"
-msgstr "æéå°èå´èµ·ç¹"
-
-#: editor_actions.cc:192
-msgid "Playhead to Range End"
-msgstr "æéå°èå´ç»ç¹"
-
-#: editor_actions.cc:195
-msgid "Select All Tracks"
-msgstr "éæ©ææé³è½¨"
-
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
-msgid "Deselect All"
-msgstr "åéææ"
-
-#: editor_actions.cc:204
-msgid "Select All Overlapping Edit Range"
-msgstr "éæ©ææéå çç¼è¾èå´"
-
-#: editor_actions.cc:205
-msgid "Select All Inside Edit Range"
-msgstr "éæ©ææå
é¨çç¼è¾èå´"
-
-#: editor_actions.cc:207
-msgid "Select Edit Range"
-msgstr "éæ©ç¼è¾èå´"
-
-#: editor_actions.cc:209
-msgid "Select All in Punch Range"
-msgstr "éæ©ææå¨åæ¢èå´å
ç"
-
-#: editor_actions.cc:210
-msgid "Select All in Loop Range"
-msgstr "éæ©ææå¨å¾ªç¯èå´å
ç"
-
-#: editor_actions.cc:212
-msgid "Select Next Track or Bus"
-msgstr "éæ©ä¸ä¸ä¸ªé³è½¨ææ»çº¿"
-
-#: editor_actions.cc:213
-msgid "Select Previous Track or Bus"
-msgstr "éæ©ä¸ä¸ä¸ªé³è½¨ææ»çº¿"
-
-#: editor_actions.cc:215
-msgid "Toggle Record Enable"
-msgstr "忢å½å¶å¯ç¨"
-
-#: editor_actions.cc:217
-msgid "Toggle Solo"
-msgstr "åç¬å¥"
-
-#: editor_actions.cc:219
-msgid "Toggle Mute"
-msgstr "忢éé³"
-
-#: editor_actions.cc:221
-msgid "Toggle Solo Isolate"
-msgstr "忢ç¬å¥é离"
-
-#: editor_actions.cc:226
-msgid "Save View %1"
-msgstr "ä¿åè§å¾ %1"
-
-#: editor_actions.cc:232
-msgid "Go to View %1"
-msgstr "跳转å°è§å¾ %1"
-
-#: editor_actions.cc:238
-msgid "Locate to Mark %1"
-msgstr "å®ä½å°æ è®° %1"
-
-#: editor_actions.cc:242 editor_actions.cc:243
-msgid "Jump to Next Mark"
-msgstr "è·³å°ä¸ä¸ä¸ªæ è®°"
-
-#: editor_actions.cc:244 editor_actions.cc:245
-msgid "Jump to Previous Mark"
-msgstr "è·³å°ä¸ä¸ä¸ªæ è®°"
-
-#: editor_actions.cc:247 editor_actions.cc:248
-msgid "Add Mark from Playhead"
-msgstr "仿éèµ·æ·»å æ è®°"
-
-#: editor_actions.cc:250 editor_actions.cc:251
-msgid "Remove Mark at Playhead"
-msgstr "ç§»é¤æéå¤çæ è®°"
-
-#: editor_actions.cc:253
-msgid "Nudge Next Later"
-msgstr "ååå¾®è°ä¸ä¸ä¸ª"
-
-#: editor_actions.cc:254
-msgid "Nudge Next Earlier"
-msgstr "ååå¾®è°ä¸ä¸ä¸ª"
-
-#: editor_actions.cc:256
-msgid "Nudge Playhead Forward"
-msgstr "å¾®è°æéåè¿"
-
-#: editor_actions.cc:257
-msgid "Nudge Playhead Backward"
-msgstr "å¾®è°æéåé"
-
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "æé转å°ä¸ä¸ä¸ªç½æ ¼"
-
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "æé转å°ä¸ä¸ä¸ªç½æ ¼"
-
-#: editor_actions.cc:264
-msgid "Zoom to Selection"
-msgstr "缩æ¾è³å·²éæ©é¨å"
-
-#: editor_actions.cc:265
-msgid "Toggle Zoom State"
-msgstr "åæ¢ç¼©æ¾ç¶æ"
-
-#: editor_actions.cc:267
-msgid "Expand Track Height"
-msgstr "æ©å±é³è½¨é«åº¦"
-
-#: editor_actions.cc:268
-msgid "Shrink Track Height"
-msgstr "æ¶ç¼©æ©å±é³è½¨é«åº¦"
-
-#: editor_actions.cc:270
-msgid "Move Selected Tracks Up"
-msgstr "åä¸ç§»å¨å·²éä¸é³è½¨"
-
-#: editor_actions.cc:272
-msgid "Move Selected Tracks Down"
-msgstr "åä¸ç§»å¨å·²éä¸é³è½¨"
-
-#: editor_actions.cc:275
-msgid "Scroll Tracks Up"
-msgstr "å䏿»å¨é³è½¨"
-
-#: editor_actions.cc:277
-msgid "Scroll Tracks Down"
-msgstr "å䏿»å¨é³è½¨"
-
-#: editor_actions.cc:279
-msgid "Step Tracks Up"
-msgstr "å䏿¥è¿é³è½¨"
-
-#: editor_actions.cc:281
-msgid "Step Tracks Down"
-msgstr "å䏿¥è¿é³è½¨"
-
-#: editor_actions.cc:284
-msgid "Scroll Backward"
-msgstr "ååæ»å¨"
-
-#: editor_actions.cc:285
-msgid "Scroll Forward"
-msgstr "ååæ»å¨"
-
-#: editor_actions.cc:286
-msgid "Center Playhead"
-msgstr "æéç½®ä¸"
-
-#: editor_actions.cc:287
-msgid "Center Edit Point"
-msgstr "ç¼è¾ç¹ç½®ä¸"
-
-#: editor_actions.cc:289
-msgid "Playhead Forward"
-msgstr "æéåè¿"
-
-#: editor_actions.cc:290
-msgid "Playhead Backward"
-msgstr "æéåé"
-
-#: editor_actions.cc:292
-msgid "Playhead to Active Mark"
-msgstr "æéè·³è½¬å°æ¿æ´»çæ è®°å¤"
-
-#: editor_actions.cc:293
-msgid "Active Mark to Playhead"
-msgstr "æ¿æ´»çæ è®°è·³è½¬å°æéå¤"
-
-#: editor_actions.cc:295
-msgid "Use Skip Ranges"
-msgstr "使ç¨ä¸è¿ç»çèå´"
-
-#: editor_actions.cc:302
-msgid "Play Selected Regions"
-msgstr "ææ¾å·²éä¸çåºå"
-
-#: editor_actions.cc:304
-msgid "Play from Edit Point and Return"
-msgstr "ä»ç¼è¾ç¹ææ¾å¹¶è¿å"
-
-#: editor_actions.cc:306
-msgid "Play Edit Range"
-msgstr "ææ¾ç¼è¾èå´"
-
-#: editor_actions.cc:308
-msgid "Playhead to Mouse"
-msgstr "æé跳转å°é¼ æ å¤"
-
-#: editor_actions.cc:309
-msgid "Active Marker to Mouse"
-msgstr "æ¿æ´»çæ 记跳转å°é¼ æ å¤"
-
-#: editor_actions.cc:319
-msgid "Undo Selection Change"
-msgstr "æ¤éå·²éä¸é¨åçæ¹å¨"
-
-#: editor_actions.cc:320
-msgid "Redo Selection Change"
-msgstr "éåå·²éä¸é¨åçæ¹å¨"
-
-#: editor_actions.cc:322
-msgid "Export Audio"
-msgstr "导åºé³é¢"
-
-#: editor_actions.cc:323 export_dialog.cc:396
-msgid "Export Range"
-msgstr "导åºèå´"
-
-#: editor_actions.cc:328
-msgid "Separate Using Punch Range"
-msgstr "使ç¨åæ¢èå´å离"
-
-#: editor_actions.cc:331
-msgid "Separate Using Loop Range"
-msgstr "使ç¨å¾ªç¯èå´å离"
-
-#: editor_actions.cc:334 editor_actions.cc:356
-msgid "Crop"
-msgstr "åªè£"
-
-#: editor_actions.cc:344
-msgid "Fade Range Selection"
-msgstr "æ·¡åèå´å·²éä¸é¨å"
-
-#: editor_actions.cc:346
-msgid "Set Tempo from Edit Range = Bar"
-msgstr "ä»ç¼è¾èå´è®¾ç½®èå¥ = å°è"
-
-#: editor_actions.cc:348
-msgid "Log"
-msgstr "æ¥å¿"
-
-#: editor_actions.cc:351 editor_actions.cc:353
-msgid "Move to Next Transient"
-msgstr "ç§»å¨å°ä¸ä¸ä¸ªè¿æ¸¡"
-
-#: editor_actions.cc:352 editor_actions.cc:354
-msgid "Move to Previous Transient"
-msgstr "ç§»å¨å°ä¸ä¸ä¸ªè¿æ¸¡"
-
-#: editor_actions.cc:358 editor_actions.cc:361
-msgid "Start Range"
-msgstr "å¼å§èå´"
-
-#: editor_actions.cc:359 editor_actions.cc:362
-msgid "Finish Range"
-msgstr "ç»æèå´"
-
-#: editor_actions.cc:394
-msgid "Follow Playhead"
-msgstr "è·éæé"
-
-#: editor_actions.cc:395
-msgid "Remove Last Capture"
-msgstr "ç§»é¤å·²æè·å
容"
-
-#: editor_actions.cc:397
-msgid "Stationary Playhead"
-msgstr "åºå®æé"
-
-#: editor_actions.cc:399 insert_time_dialog.cc:32
-msgid "Insert Time"
-msgstr "æå
¥æ¶é´"
-
-#: editor_actions.cc:402
-msgid "Toggle Active"
-msgstr "åæ¢æ¿æ´»"
-
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
-msgid "Remove"
-msgstr "ç§»é¤"
-
-#: editor_actions.cc:411
-msgid "Fit Selection (Vertical)"
-msgstr " å¹é
已鿩é¨åï¼åç´ï¼"
-
-#: editor_actions.cc:413 time_axis_view.cc:1371
-msgid "Largest"
-msgstr "æå¤§ç"
-
-#: editor_actions.cc:416 time_axis_view.cc:1372
-msgid "Larger"
-msgstr "æ´å¤§ç"
-
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
-msgid "Large"
-msgstr "大"
-
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
-msgid "Small"
-msgstr "å°"
-
-#: editor_actions.cc:429
-msgid "Sound Selected MIDI Notes"
-msgstr "声é³å·²éæ©é¨åMIDIé³ç¬¦"
-
-#: editor_actions.cc:434
-msgid "Zoom Focus Left"
-msgstr "以左侧为ç¦ç¹ç¼©æ¾"
-
-#: editor_actions.cc:435
-msgid "Zoom Focus Right"
-msgstr "以å³ä¾§ä¸ºç¦ç¹ç¼©æ¾"
-
-#: editor_actions.cc:436
-msgid "Zoom Focus Center"
-msgstr "以ä¸å¤®ä¸ºç¦ç¹ç¼©æ¾"
-
-#: editor_actions.cc:437
-msgid "Zoom Focus Playhead"
-msgstr "以æé为ç¦ç¹ç¼©æ¾"
-
-#: editor_actions.cc:438
-msgid "Zoom Focus Mouse"
-msgstr "ä»¥é¼ æ 为ç¦ç¹ç¼©æ¾"
-
-#: editor_actions.cc:439
-msgid "Zoom Focus Edit Point"
-msgstr "以ç¼è¾ç¹ä¸ºç¦ç¹ç¼©æ¾"
-
-#: editor_actions.cc:441
-msgid "Next Zoom Focus"
-msgstr "ä¸ä¸ä¸ªç¼©æ¾ç¦ç¹"
-
-#: editor_actions.cc:447
-msgid "Smart Object Mode"
-msgstr "æºè½å¯¹è±¡ç©ä½æ¨¡å¼"
-
-#: editor_actions.cc:450
-msgid "Smart"
-msgstr "æºè½"
-
-#: editor_actions.cc:453
-msgid "Object Tool"
-msgstr "对象ç©ä½å·¥å
·"
-
-#: editor_actions.cc:458
-msgid "Range Tool"
-msgstr "èå´å·¥å
·"
-
-#: editor_actions.cc:463
-msgid "Note Drawing Tool"
-msgstr "é³ç¬¦æç»å·¥å
·"
-
-#: editor_actions.cc:468
-msgid "Audition Tool"
-msgstr "çå¬å·¥å
·"
-
-#: editor_actions.cc:473
-msgid "Time FX Tool"
-msgstr "æ¶é´ç¹æå·¥å
·"
-
-#: editor_actions.cc:478
-msgid "Content Tool"
-msgstr "å
容工å
·"
-
-#: editor_actions.cc:484
-msgid "Cut Tool"
-msgstr " åå²å·¥å
·"
-
-#: editor_actions.cc:490
-msgid "Step Mouse Mode"
-msgstr "æ¥è¿é¼ æ æ¨¡å¼"
-
-#: editor_actions.cc:497
-msgid "Change Edit Point"
-msgstr "æ¹åç¼è¾ç¹"
-
-#: editor_actions.cc:498
-msgid "Change Edit Point Including Marker"
-msgstr "æ¹åç¼è¾ç¹å
æ¬æ è®°"
-
-#: editor_actions.cc:504
-msgid "Cycle Edit Mode"
-msgstr "循ç¯ç¼è¾æ¨¡å¼"
-
-#: editor_actions.cc:506
-msgid "Snap to"
-msgstr "å¸éå°"
-
-#: editor_actions.cc:507
-msgid "Snap Mode"
-msgstr "å¸é模å¼"
-
-#: editor_actions.cc:514
-msgid "Next Snap Mode"
-msgstr "ä¸ä¸ä¸ªå¸é模å¼"
-
-#: editor_actions.cc:515
-msgid "Next Snap Choice"
-msgstr "ä¸ä¸ä¸ªå¸ééæ©"
-
-#: editor_actions.cc:516
-msgid "Next Musical Snap Choice"
-msgstr "ä¸ä¸ä¸ªé
ä¹çå¸ééæ©"
-
-#: editor_actions.cc:517
-msgid "Previous Snap Choice"
-msgstr "ä¸ä¸ä¸ªå¸ééæ©"
-
-#: editor_actions.cc:518
-msgid "Previous Musical Snap Choice"
-msgstr "ä¸ä¸ä¸ªé
ä¹çå¸ééæ©"
-
-#: editor_actions.cc:523
-msgid "Snap to CD Frame"
-msgstr "å¸éå°CDæ¡æ¶"
-
-#: editor_actions.cc:524
-msgid "Snap to Timecode Frame"
-msgstr "å¸éå°æ¶é´ç æ¡æ¶"
-
-#: editor_actions.cc:525
-msgid "Snap to Timecode Seconds"
-msgstr "å¸éå°æ¶é´ç ç§"
-
-#: editor_actions.cc:526
-msgid "Snap to Timecode Minutes"
-msgstr "å¸éå°æ¶é´ç å"
-
-#: editor_actions.cc:527
-msgid "Snap to Seconds"
-msgstr "å¸éå°ç§"
-
-#: editor_actions.cc:528
-msgid "Snap to Minutes"
-msgstr "å¸éå°å"
-
-#: editor_actions.cc:530
-msgid "Snap to One Twenty Eighths"
-msgstr "å¸éå°ä¸ç¾äºåå
«åä¹ä¸"
-
-#: editor_actions.cc:531
-msgid "Snap to Sixty Fourths"
-msgstr "å¸éå°å
åååä¹ä¸"
-
-#: editor_actions.cc:532
-msgid "Snap to Thirty Seconds"
-msgstr "å¸éå°ä¸åäºåä¹ä¸"
-
-#: editor_actions.cc:533
-msgid "Snap to Twenty Eighths"
-msgstr "å¸éå°äºåå
«åä¹ä¸"
-
-#: editor_actions.cc:534
-msgid "Snap to Twenty Fourths"
-msgstr "å¸éå°äºåååä¹ä¸"
-
-#: editor_actions.cc:535
-msgid "Snap to Twentieths"
-msgstr "å¸éå°äºååä¹ä¸"
-
-#: editor_actions.cc:536
-msgid "Snap to Sixteenths"
-msgstr "å¸éå°åå
åä¹ä¸"
-
-#: editor_actions.cc:537
-msgid "Snap to Fourteenths"
-msgstr "å¸éå°åååä¹ä¸"
-
-#: editor_actions.cc:538
-msgid "Snap to Twelfths"
-msgstr "å¸éå°åäºåä¹ä¸"
-
-#: editor_actions.cc:539
-msgid "Snap to Tenths"
-msgstr "å¸éå°ååä¹ä¸"
-
-#: editor_actions.cc:540
-msgid "Snap to Eighths"
-msgstr "å¸éå°å
«åä¹ä¸"
-
-#: editor_actions.cc:541
-msgid "Snap to Sevenths"
-msgstr "å¸éå°ä¸åä¹ä¸"
-
-#: editor_actions.cc:542
-msgid "Snap to Sixths"
-msgstr "å¸éå°å
åä¹ä¸"
-
-#: editor_actions.cc:543
-msgid "Snap to Fifths"
-msgstr "å¸éå°äºåä¹ä¸"
-
-#: editor_actions.cc:544
-msgid "Snap to Quarters"
-msgstr "å¸éå°ååä¹ä¸"
-
-#: editor_actions.cc:545
-msgid "Snap to Thirds"
-msgstr "å¸éå°ä¸åä¹ä¸"
-
-#: editor_actions.cc:546
-msgid "Snap to Halves"
-msgstr "å¸éå°äºåä¹ä¸"
-
-#: editor_actions.cc:548
-msgid "Snap to Beat"
-msgstr "å¸éå°æå"
-
-#: editor_actions.cc:549
-msgid "Snap to Bar"
-msgstr "å¸éå°å°è"
-
-#: editor_actions.cc:550
-msgid "Snap to Mark"
-msgstr "å¸éå°æ è®°"
-
-#: editor_actions.cc:551
-msgid "Snap to Region Start"
-msgstr "å¸éå°åºåèµ·ç¹"
-
-#: editor_actions.cc:552
-msgid "Snap to Region End"
-msgstr "å¸éå°åºåç»ç¹"
-
-#: editor_actions.cc:553
-msgid "Snap to Region Sync"
-msgstr "å¸éå°åºå忥"
-
-#: editor_actions.cc:554
-msgid "Snap to Region Boundary"
-msgstr "å¸éå°åºåè¾¹ç"
-
-#: editor_actions.cc:556
-msgid "Show Marker Lines"
-msgstr "æ¾ç¤ºæ 记线æ¡"
-
-#: editor_actions.cc:566
-msgid "Loop/Punch"
-msgstr "循ç¯/忢"
-
-#: editor_actions.cc:570
-msgid "Min:Sec"
-msgstr "åï¼ç§"
-
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
-msgid "Video Monitor"
-msgstr "è§é¢çæ§"
-
-#: editor_actions.cc:574 rc_option_editor.cc:2260
-msgid "Video"
-msgstr "è§é¢"
-
-#: editor_actions.cc:577
-msgid "Always on Top"
-msgstr "æ»æ¯ç½®é¡¶"
-
-#: editor_actions.cc:579
-msgid "Frame number"
-msgstr "帧å·ç "
-
-#: editor_actions.cc:580
-msgid "Timecode Background"
-msgstr "æ¶é´ç èæ¯"
-
-#: editor_actions.cc:581
-msgid "Fullscreen"
-msgstr "å
¨å±"
-
-#: editor_actions.cc:582
-msgid "Letterbox"
-msgstr "宽é¶å¹å¼"
-
-#: editor_actions.cc:583
-msgid "Original Size"
-msgstr "åå§å°ºå¯¸"
-
-#: editor_actions.cc:640
-msgid "Sort"
-msgstr "æåº"
-
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
-msgid "Show All"
-msgstr "æ¾ç¤ºææ"
-
-#: editor_actions.cc:652
-msgid "Show Automatic Regions"
-msgstr "æ¾ç¤ºèªå¨çåºå"
-
-#: editor_actions.cc:654
-msgid "Ascending"
-msgstr "ååº"
-
-#: editor_actions.cc:656
-msgid "Descending"
-msgstr "éåº"
-
-#: editor_actions.cc:659
-msgid "By Region Name"
-msgstr "以åºååç§°"
-
-#: editor_actions.cc:661
-msgid "By Region Length"
-msgstr "以åºåé¿åº¦"
-
-#: editor_actions.cc:663
-msgid "By Region Position"
-msgstr "以åºåä½ç½®"
-
-#: editor_actions.cc:665
-msgid "By Region Timestamp"
-msgstr "以åºåæ¶é´æ³"
-
-#: editor_actions.cc:667
-msgid "By Region Start in File"
-msgstr "以æä»¶å
çåºåèµ·ç¹"
-
-#: editor_actions.cc:669
-msgid "By Region End in File"
-msgstr "以æä»¶å
çåºåç»ç¹"
-
-#: editor_actions.cc:671
-msgid "By Source File Name"
-msgstr "ä»¥æºæä»¶åç§°"
-
-#: editor_actions.cc:673
-msgid "By Source File Length"
-msgstr "ä»¥æºæä»¶é¿åº¦"
-
-#: editor_actions.cc:675
-msgid "By Source File Creation Date"
-msgstr "ä»¥æºæä»¶åå»ºæ¥æ"
-
-#: editor_actions.cc:677
-msgid "By Source Filesystem"
-msgstr "ä»¥æºæä»¶ç³»ç»"
-
-#: editor_actions.cc:680
-msgid "Remove Unused"
-msgstr "ç§»é¤æªä½¿ç¨ç"
-
-#: editor_actions.cc:684 editor_audio_import.cc:282 session_import_dialog.cc:75
-#: session_import_dialog.cc:95 session_metadata_dialog.cc:418
-#: editor_videotimeline.cc:91
-msgid "Import"
-msgstr "导å
¥"
-
-#: editor_actions.cc:687
-msgid "Import to Region List..."
-msgstr "导å
¥å°åºåå表â¦"
-
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
-msgstr "ä»ä¼è¯å¯¼å
¥"
-
-#: editor_actions.cc:694
-msgid "Bring all media into session folder"
-msgstr "å°ææåªä½å¼å
¥ä¼è¯æä»¶å¤¹"
-
-#: editor_actions.cc:697
-msgid "Show Summary"
-msgstr "æ¾ç¤ºæè¦"
-
-#: editor_actions.cc:699
-msgid "Show Group Tabs"
-msgstr "æ¾ç¤ºç¾¤ç»æ ç¾é¡µ"
-
-#: editor_actions.cc:701
-msgid "Show Measure Lines"
-msgstr "æ¾ç¤ºæµé线"
-
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "æ¾ç¤ºåæ "
-
-#: editor_actions.cc:709
-msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
-msgstr "忢æ¯å¦ä¸ºç¼è¾å¨ä¸å·²éæ©çé³è½¨/æ»çº¿æ¿æ´»MIDIè¾å
¥"
-
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "å·²ä» %1 è½½å
¥ç¼è¾å¨ç»å®"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "å¨æç´¢è·¯å¾ %1 æ¾ä¸å°ç¼è¾å¨ç»å®"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
-msgid "programming error: %1: %2"
-msgstr "ç¨åºéè¯¯ï¼ %1: %2"
-
-#: editor_actions.cc:1774
-msgid "Raise"
-msgstr "æå"
-
-#: editor_actions.cc:1777
-msgid "Raise to Top"
-msgstr "æåå°é¡¶é¨"
-
-#: editor_actions.cc:1780
-msgid "Lower"
-msgstr "æ²é"
-
-#: editor_actions.cc:1783
-msgid "Lower to Bottom"
-msgstr "æ²éå°åºé¨"
-
-#: editor_actions.cc:1786
-msgid "Move to Original Position"
-msgstr "ç§»å¨å°åå§ä½ç½®"
-
-#: editor_actions.cc:1791
-msgid "Lock to Video"
-msgstr "éå®å°è§é¢"
-
-#: editor_actions.cc:1796 editor_markers.cc:912
-msgid "Glue to Bars and Beats"
-msgstr "ç²è¿å°å°èåæå"
-
-#: editor_actions.cc:1801
-msgid "Remove Sync"
-msgstr "ç§»é¤åæ¥"
-
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
-msgid "Mute"
-msgstr "éé³"
-
-#: editor_actions.cc:1807
-msgid "Normalize..."
-msgstr "è§èåâ¦"
-
-#: editor_actions.cc:1810
-msgid "Reverse"
-msgstr "å转"
-
-#: editor_actions.cc:1813
-msgid "Make Mono Regions"
-msgstr "设为å声éåºå"
-
-#: editor_actions.cc:1816
-msgid "Boost Gain"
-msgstr "æ¾å¤§å¢ç"
-
-#: editor_actions.cc:1819
-msgid "Cut Gain"
-msgstr "åå°å¢ç"
-
-#: editor_actions.cc:1822
-msgid "Pitch Shift..."
-msgstr "é³é«æ¿æ¢â¦"
-
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "åè°â¦"
-
-#: editor_actions.cc:1828
-msgid "Opaque"
-msgstr "模ç³åº¦"
-
-#: editor_actions.cc:1832 editor_regions.cc:117
-msgid "Fade In"
-msgstr "æ·¡å
¥"
-
-#: editor_actions.cc:1837 editor_regions.cc:118
-msgid "Fade Out"
-msgstr "æ·¡åº"
-
-#: editor_actions.cc:1852
-msgid "Multi-Duplicate..."
-msgstr "å¤ä¸ªå¯æ¬â¦"
-
-#: editor_actions.cc:1857
-msgid "Fill Track"
-msgstr "å¡«å
é³è½¨"
-
-#: editor_actions.cc:1861 editor_markers.cc:1000
-msgid "Set Loop Range"
-msgstr "设置循ç¯èå´"
-
-#: editor_actions.cc:1868
-msgid "Set Punch"
-msgstr "è®¾ç½®åæ¢"
-
-#: editor_actions.cc:1872
-msgid "Add Single Range Marker"
-msgstr "æ·»å å个èå´æ è®°"
-
-#: editor_actions.cc:1877
-msgid "Add Range Marker Per Region"
-msgstr "为æ¯ä¸ªåºåæ·»å èå´æ è®°"
-
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
-msgstr "å¸éä½ç½®å°ç½æ ¼"
-
-#: editor_actions.cc:1884
-msgid "Close Gaps"
-msgstr "å°éé´é"
-
-# ä½¿ç¨æ¹æ³ http://linuxaudioblog.com/?tag=rhythm-ferret
-#: editor_actions.cc:1887
-msgid "Rhythm Ferret..."
-msgstr "è奿¢æµâ¦"
-
-#: editor_actions.cc:1890
-msgid "Export..."
-msgstr "导åº..."
-
-#: editor_actions.cc:1896
-msgid "Separate Under"
-msgstr "å离ä½äº"
-
-#: editor_actions.cc:1900 editor_actions.cc:1901
-msgid "Set Fade In Length"
-msgstr "设置淡å
¥é¿åº¦"
-
-#: editor_actions.cc:1902 editor_actions.cc:1903
-msgid "Set Fade Out Length"
-msgstr "设置淡åºé¿åº¦"
-
-#: editor_actions.cc:1905
-msgid "Set Tempo from Region = Bar"
-msgstr "ä»åºå设置èå¥=å°è"
-
-#: editor_actions.cc:1910
-msgid "Split at Percussion Onsets"
-msgstr "卿å»ä¹å»å夿å"
-
-#: editor_actions.cc:1915
-msgid "List Editor..."
-msgstr "å表ç¼è¾å¨â¦"
-
-#: editor_actions.cc:1918
-msgid "Properties..."
-msgstr "屿§â¦"
-
-#: editor_actions.cc:1922
-msgid "Bounce (with processing)"
-msgstr "欢跳弹å¥ï¼å¹¶å¤çï¼"
-
-#: editor_actions.cc:1923
-msgid "Bounce (without processing)"
-msgstr "欢跳弹å¥ï¼ä¸å¤çï¼"
-
-#: editor_actions.cc:1924
-msgid "Combine"
-msgstr "æ´å"
-
-#: editor_actions.cc:1925
-msgid "Uncombine"
-msgstr "䏿´å"
-
-#: editor_actions.cc:1927
-msgid "Spectral Analysis..."
-msgstr "é¢è°±åæâ¦"
-
-#: editor_actions.cc:1929
-msgid "Reset Envelope"
-msgstr "éç½®å°è£
"
-
-#: editor_actions.cc:1931
-msgid "Reset Gain"
-msgstr "éç½®å¢ç"
-
-#: editor_actions.cc:1936
-msgid "Envelope Active"
-msgstr "å°è£
æ¿æ´»"
-
-#: editor_actions.cc:1944 editor_actions.cc:1945
-msgid "Insert Patch Change..."
-msgstr "æå
¥ååé³è²â¦"
-
-#: editor_actions.cc:1946
-msgid "Unlink from other copies"
-msgstr "è§£é¤é¾æ¥å
¶å®æ·è´"
-
-#: editor_actions.cc:1947
-msgid "Strip Silence..."
-msgstr "çæ®µæ 声â¦"
-
-#: editor_actions.cc:1948
-msgid "Set Range Selection"
-msgstr "设置èå´å·²éæ©é¨å"
-
-#: editor_actions.cc:1950 editor_actions.cc:1951
-msgid "Nudge Later"
-msgstr "ååå¾®è°"
-
-#: editor_actions.cc:1952 editor_actions.cc:1953
-msgid "Nudge Earlier"
-msgstr "ååå¾®è°"
-
-#: editor_actions.cc:1955
-msgid "Sequence Regions"
-msgstr "åºååºå"
-
-#: editor_actions.cc:1960
-msgid "Nudge Later by Capture Offset"
-msgstr "以æè·é¨ååç§»ååå¾®è°"
-
-#: editor_actions.cc:1967
-msgid "Nudge Earlier by Capture Offset"
-msgstr "以æè·é¨ååç§»ååå¾®è°"
-
-#: editor_actions.cc:1971
-msgid "Trim to Loop"
-msgstr "ä¿®åªå°å¾ªç¯"
-
-#: editor_actions.cc:1972
-msgid "Trim to Punch"
-msgstr "ä¿®åªå°åæ¢"
-
-#: editor_actions.cc:1974
-msgid "Trim to Previous"
-msgstr "ä¿®åªå°ä¸ä¸ä¸ª"
-
-#: editor_actions.cc:1975
-msgid "Trim to Next"
-msgstr "ä¿®åªå°ä¸ä¸ä¸ª"
-
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "ä»åºåå表æå
¥åºå"
-
-#: editor_actions.cc:1988
-msgid "Set Sync Position"
-msgstr "è®¾ç½®åæ¥ä½ç½®"
-
-#: editor_actions.cc:1989
-msgid "Place Transient"
-msgstr "æ¾ç½®è¿æ¸¡"
-
-#: editor_actions.cc:1990
-msgid "Split/Separate"
-msgstr "æå/å离"
-
-#: editor_actions.cc:1991
-msgid "Trim Start at Edit Point"
-msgstr "å¨ç¼è¾ç¹ä¿®åªèµ·ç¹"
-
-#: editor_actions.cc:1992
-msgid "Trim End at Edit Point"
-msgstr "å¨ç¼è¾ç¹ä¿®åªç»ç¹"
-
-#: editor_actions.cc:1997
-msgid "Align Start"
-msgstr "对é½èµ·ç¹"
-
-#: editor_actions.cc:2004
-msgid "Align Start Relative"
-msgstr "对é½èµ·ç¹ç¸å
³"
-
-#: editor_actions.cc:2008
-msgid "Align End"
-msgstr "对é½ç»ç¹"
-
-#: editor_actions.cc:2013
-msgid "Align End Relative"
-msgstr "对é½ç»ç¹ç¸å
³"
-
-#: editor_actions.cc:2020
-msgid "Align Sync"
-msgstr "对é½åæ¥"
-
-#: editor_actions.cc:2027
-msgid "Align Sync Relative"
-msgstr "对é½åæ¥ç¸å
³"
-
-#: editor_actions.cc:2031 editor_actions.cc:2034
-msgid "Choose Top..."
-msgstr "鿩顶é¨â¦"
-
-#: editor_audio_import.cc:77 editor_audio_import.cc:99
-msgid "You can't import or embed an audiofile until you have a session loaded."
-msgstr "æ æ³å¯¼å
¥åµå
¥ççé³é¢æä»¶,ï¼é¤éæ¨å·²ç»è½½å
¥ä¸ä¸ªä¼è¯æä»¶ã"
-
-#: editor_audio_import.cc:83 editor_audio_import.cc:127
-msgid "Add Existing Media"
-msgstr "æ·»å å·²åå¨çåªä½"
-
-#: editor_audio_import.cc:175
-msgid ""
-"The session already contains a source file named %1. Do you want to import %1 as "
-"a new file, or skip it?"
-msgstr ""
-"æ¤ä¼è¯å·²ç»åå¨ä¸ä¸ªå为 %1 çæºæä»¶ãæ¨æ³æ %1 ä½ä¸ºä¸ä¸ªæ°æä»¶å¯¼å
¥è¿æ¥,ï¼æè
è·³è¿å®ï¼"
-
-#: editor_audio_import.cc:177
-msgid ""
-"The session already contains a source file named %1. Do you want to import %2 as "
-"a new source, or skip it?"
-msgstr ""
-"æ¤ä¼è¯å·²ç»åå¨ä¸ä¸ªå为 %1 çæºæä»¶ãæ¨æ³æ %2 ä½ä¸ºä¸ä¸ªæ°çæºå¯¼å
¥è¿æ¥,ï¼æè
è·³è¿å®ï¼"
-
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
-msgid "Cancel Import"
-msgstr "忶坼å
¥"
-
-#: editor_audio_import.cc:559
-msgid "Editor: cannot open file \"%1\", (%2)"
-msgstr "ç¼è¾å¨: æ æ³æå¼æä»¶ \"%1\", (%2)"
-
-#: editor_audio_import.cc:567
-msgid "Cancel entire import"
-msgstr "åæ¶æ´ä½å¯¼å
¥"
-
-#: editor_audio_import.cc:568
-msgid "Don't embed it"
-msgstr "ä¸åµå
¥å®"
-
-#: editor_audio_import.cc:569
-msgid "Embed all without questions"
-msgstr "åµå
¥ææï¼ä¸å¿
询é®"
-
-#: editor_audio_import.cc:572 editor_audio_import.cc:598 export_format_dialog.cc:60
-msgid "Sample rate"
-msgstr "éæ ·ç"
-
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
-msgid ""
-"%1\n"
-"This audiofile's sample rate doesn't match the session sample rate!"
-msgstr ""
-"%1\n"
-"æ¤é³é¢æä»¶çéæ ·çä¸ä¼è¯çéæ ·çä¸å¹é
ï¼"
-
-#: editor_audio_import.cc:595
-msgid "Embed it anyway"
-msgstr "åªç®¡åµå
¥å®"
-
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
-msgid "Could not create new track after region placed in the drop zone"
-msgstr "åºå被æ¾ç½®å¨è½éåºåï¼æ æ³å建æ°é³è½¨"
-
-#: editor_drag.cc:1266
-msgid "fixed time region drag"
-msgstr "å·²å®åçæ¶é´åºåææ½"
-
-#: editor_drag.cc:2214
-msgid "Ripple drag"
-msgstr "æ³¢çº¹ææ½"
-
-#: editor_drag.cc:2365 midi_region_view.cc:2813
-msgid "resize notes"
-msgstr "é设é³ç¬¦å¤§å°"
-
-#: editor_drag.cc:2517
-msgid "Video Start:"
-msgstr "è§é¢èµ·ç¹ï¼"
-
-#: editor_drag.cc:2519
-msgid "Diff:"
-msgstr "å·®å«ï¼"
-
-#: editor_drag.cc:2538
-msgid "Move Video"
-msgstr "ç§»å¨è§é¢"
-
-#: editor_drag.cc:3046
-msgid "copy meter mark"
-msgstr "å¤å¶èææ è®°"
-
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "ç§»å¨èææ è®°"
-
-#: editor_drag.cc:3177
-msgid "copy tempo mark"
-msgstr "å¤å¶è奿 è®°"
-
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "ç§»å¨è奿 è®°"
-
-#: editor_drag.cc:3412
-msgid "change fade in length"
-msgstr "æ¹åæ¸å
¥é¿åº¦"
-
-#: editor_drag.cc:3526
-msgid "change fade out length"
-msgstr "æ¹åæ¸åºé¿åº¦"
-
-#: editor_drag.cc:3880
-msgid "move marker"
-msgstr "ç§»å¨æ è®°"
-
-#: editor_drag.cc:4490
-msgid "An error occurred while executing time stretch operation"
-msgstr "彿§è¡æ¶é´å»¶ä¼¸æä½æ¶åºç°é误"
-
-#: editor_drag.cc:4947
-msgid "programming_error: %1"
-msgstr "ç¨åºé误ï¼%1"
-
-#: editor_drag.cc:5016 editor_drag.cc:5026
-msgid "new skip marker"
-msgstr "æ°å»ºè·³è·æ è®°"
-
-#: editor_drag.cc:5017
-msgid "skip"
-msgstr "è·³è·"
-
-#: editor_drag.cc:5021 location_ui.cc:56
-msgid "CD"
-msgstr ""
-
-#: editor_drag.cc:5022
-msgid "new CD marker"
-msgstr "æ°å»ºCDæ è®°"
-
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
-msgid "unnamed"
-msgstr "æªå½åç"
-
-#: editor_drag.cc:5309
-msgid "Automation range drag created for invalid region type"
-msgstr "ä¸ºæ æçåºåç±»åå·²å建èªå¨èå´ææ½"
-
-#: editor_route_groups.cc:96
-msgid "Col"
-msgstr "å"
-
-#: editor_route_groups.cc:96
-msgid "Group Tab Color"
-msgstr "åç»æ ç¾é¡µé¢è²"
-
-#: editor_route_groups.cc:97
-msgid "Name of Group"
-msgstr "åç»åç§°"
-
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr ""
-
-#: editor_route_groups.cc:98
-msgid "Group is visible?"
-msgstr "åç»æ¯å¦å¯è§ï¼"
-
-#: editor_route_groups.cc:99
-msgid "On"
-msgstr "å¼å¯"
-
-#: editor_route_groups.cc:99
-msgid "Group is enabled?"
-msgstr "åç»æ¯å¦å¯ç¨ï¼"
-
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "åç»|G"
-
-#: editor_route_groups.cc:100
-msgid "Sharing Gain?"
-msgstr "å享å¢çï¼"
-
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "ç¸å
³|Rel"
-
-#: editor_route_groups.cc:101
-msgid "Relative Gain Changes?"
-msgstr "ç¸å
³å¢çæ¹åï¼"
-
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "éé³|M"
-
-#: editor_route_groups.cc:102
-msgid "Sharing Mute?"
-msgstr "å享éé³ï¼"
-
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "ç¬å¥|S"
-
-#: editor_route_groups.cc:103
-msgid "Sharing Solo?"
-msgstr "å享ç¬å¥ï¼"
-
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
-msgid "Rec"
-msgstr "å½å¶"
-
-#: editor_route_groups.cc:104
-msgid "Sharing Record-enable Status?"
-msgstr "å享éé³ï¼"
-
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "çæ§|Mon"
-
-#: editor_route_groups.cc:105
-msgid "Sharing Monitoring Choice?"
-msgstr "åäº«çæ§éæ©ï¼"
-
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "已鿩é¨å|Sel"
-
-#: editor_route_groups.cc:106
-msgid "Sharing Selected/Editing Status?"
-msgstr "åäº«å·²éæ©/ç¼è¾ç¶æï¼"
-
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "æ¿æ´»"
-
-#: editor_route_groups.cc:107
-msgid "Sharing Active Status?"
-msgstr "åäº«æ¿æ´»ç¶æï¼"
-
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
-msgid "programming error: marker canvas item has no marker object pointer!"
-msgstr "ç¨åºéè¯¯ï¼æ è®°ç颿¡ç®æ²¡ææ 记对象ç©ä½æç¤ºï¼"
-
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "æä»¶å·²åå¨ï¼"
-
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "è¦çå·²å卿件"
-
-#: editor_group_tabs.cc:176
-msgid "Fit to Window"
-msgstr "å¹é
éåçªå£"
-
-#: editor_markers.cc:139
-msgid "start"
-msgstr "start"
-
-#: editor_markers.cc:140
-msgid "end"
-msgstr "ç»ç¹"
-
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107 editor_ops.cc:2164
-#: editor_ops.cc:2193 location_ui.cc:1023
-msgid "add marker"
-msgstr "æ·»å æ è®°"
-
-#: editor_markers.cc:689 editor_markers.cc:1456
-msgid "set loop range"
-msgstr "è®¾ç½®åæ¢èå´"
-
-#: editor_markers.cc:705 editor_markers.cc:1462
-msgid "set punch range"
-msgstr "è®¾ç½®åæ¢èå´"
-
-#: editor_markers.cc:722 editor_ops.cc:4055
-msgid "range"
-msgstr "èå´"
-
-#: editor_markers.cc:725
-msgid "new range marker"
-msgstr "æ°å»ºèå´æ è®°"
-
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
-msgid "remove marker"
-msgstr "ç§»é¤æ è®°"
-
-#: editor_markers.cc:894
-msgid "Locate to Here"
-msgstr "å®ä½å°æ¤å¤"
-
-#: editor_markers.cc:895
-msgid "Play from Here"
-msgstr "仿¤å¤å¼å§ææ¾"
-
-#: editor_markers.cc:896
-msgid "Move Mark to Playhead"
-msgstr "ç§»å¨æ è®°å°æé"
-
-#: editor_markers.cc:900
-msgid "Create Range to Next Marker"
-msgstr "å建èå´å°ä¸ä¸ä¸ªæ è®°"
-
-#: editor_markers.cc:941
-msgid "Locate to Marker"
-msgstr "å®ä½å°æ è®°"
-
-#: editor_markers.cc:942
-msgid "Play from Marker"
-msgstr "仿 è®°å¼å§ææ¾"
-
-#: editor_markers.cc:945
-msgid "Set Marker from Playhead"
-msgstr "仿é起设置æ è®°"
-
-#: editor_markers.cc:947
-msgid "Set Range from Selection"
-msgstr "ä»å·²éæ©é¨å起设置èå´"
-
-#: editor_markers.cc:957
-msgid "Hide Range"
-msgstr "éèèå´"
-
-#: editor_markers.cc:958
-msgid "Rename Range..."
-msgstr "éå½åèå´â¦"
-
-#: editor_markers.cc:962
-msgid "Remove Range"
-msgstr "ç§»é¤èå´"
-
-#: editor_markers.cc:969
-msgid "Separate Regions in Range"
-msgstr "å¨èå´ä¸å离åºå"
-
-#: editor_markers.cc:972
-msgid "Select Range"
-msgstr "éæ©èå´"
-
-#: editor_markers.cc:1001
-msgid "Set Punch Range"
-msgstr "è®¾ç½®åæ¢èå´"
-
-#: editor_markers.cc:1407 editor_ops.cc:2040
-msgid "New Name:"
-msgstr "æ°åç§°ï¼"
-
-#: editor_markers.cc:1410
-msgid "Rename Mark"
-msgstr "éå½åæ è®°"
-
-#: editor_markers.cc:1412
-msgid "Rename Range"
-msgstr "éå½åèå´"
-
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
-msgid "Rename"
-msgstr "éå½å"
-
-#: editor_markers.cc:1432
-msgid "rename marker"
-msgstr "éå½åæ è®°"
-
-#: editor_mixer.cc:90
-msgid "This screen is not tall enough to display the editor mixer"
-msgstr "å±å¹é«åº¦ä¸è¶³ä»¥æ¾ç¤ºç¼è¾å¨ææ··é³å¨"
-
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
-msgid "programming error: tempo marker canvas item has no marker object pointer!"
-msgstr "ç¨åºé误ï¼è奿 è®°ç颿¡ç®æ²¡ææ 记对象ç©ä½æç¤ºï¼"
-
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
-msgid "programming error: marker for tempo is not a tempo marker!"
-msgstr "ç¨åºé误ï¼èå¥ä¸çæ è®°ä¸æ¯ä¸ä¸ªè奿 è®°ï¼"
-
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
-msgid "programming error: marker for meter is not a meter marker!"
-msgstr "ç¨åºé误ï¼èæä¸çæ è®°ä¸æ¯ä¸ä¸ªèææ è®°ï¼"
-
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
-msgid ""
-"programming error: control point canvas item has no control point object pointer!"
-msgstr "ç¨åºéè¯¯ï¼æ§å¶ç¹ç颿¡ç®æ²¡ææ§å¶ç¹å¯¹è±¡ç©ä½æç¤ºï¼"
-
-#: editor_mouse.cc:2058
-msgid "start point trim"
-msgstr "èµ·ç¹ä¿®åª"
-
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "ç»ç¹ä¿®åª"
-
-#: editor_mouse.cc:2135
-msgid "Name for region:"
-msgstr "åºååï¼"
-
-#: editor_ops.cc:165
-msgid "split"
-msgstr "æå"
-
-#: editor_ops.cc:339
-msgid "alter selection"
-msgstr "æ´æ¹å·²éæ©é¨å"
-
-#: editor_ops.cc:381
-msgid "nudge regions forward"
-msgstr "ååå¾®è°åºå"
-
-#: editor_ops.cc:404 editor_ops.cc:489
-msgid "nudge location forward"
-msgstr "ååå¾®è°ä½ç½®"
-
-#: editor_ops.cc:462
-msgid "nudge regions backward"
-msgstr "ååå¾®è°åºå"
-
-#: editor_ops.cc:551
-msgid "nudge forward"
-msgstr "ååå¾®è°"
-
-#: editor_ops.cc:575
-msgid "nudge backward"
-msgstr "ååå¾®è°"
-
-#: editor_ops.cc:618
-msgid "sequence regions"
-msgstr "åºååºå"
-
-#: editor_ops.cc:694
-msgid "build_region_boundary_cache called with snap_type = %1"
-msgstr "æå»ºåºåè¾¹çç¼åè°ç¨å¸éç±»å = %1"
-
-#: editor_ops.cc:2042
-msgid "New Location Marker"
-msgstr "æ°å»ºä½ç½®æ è®°"
-
-#: editor_ops.cc:2164
-msgid "add markers"
-msgstr "æ·»å æ è®°"
-
-#: editor_ops.cc:2274
-msgid "clear markers"
-msgstr "æ¸
é¤è¡¨å·±"
-
-#: editor_ops.cc:2289
-msgid "clear ranges"
-msgstr "æ¸
é¤èå´"
-
-#: editor_ops.cc:2305
-msgid "clear locations"
-msgstr "æ¸
é¤ä½ç½®"
-
-#: editor_ops.cc:2368
-msgid "insert region"
-msgstr "æå
¥åºå"
-
-#: editor_ops.cc:2559
-msgid "raise regions"
-msgstr "æååºå"
-
-#: editor_ops.cc:2561
-msgid "raise region"
-msgstr "æååºå"
-
-#: editor_ops.cc:2567
-msgid "raise regions to top"
-msgstr "æååºåå°é¡¶é¨"
-
-#: editor_ops.cc:2569
-msgid "raise region to top"
-msgstr "æååºåå°é¡¶é¨"
-
-#: editor_ops.cc:2575
-msgid "lower regions"
-msgstr "æ²éåºå"
-
-#: editor_ops.cc:2577 editor_ops.cc:2585
-msgid "lower region"
-msgstr "æ²éåºå"
-
-#: editor_ops.cc:2583
-msgid "lower regions to bottom"
-msgstr "æ²éåºåå°åºé¨"
-
-#: editor_ops.cc:2668
-msgid "Rename Region"
-msgstr "éå½ååºå"
-
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
-msgid "New name:"
-msgstr "æ°åç§°ï¼"
-
-#: editor_ops.cc:2987
-msgid "separate"
-msgstr "å离"
-
-#: editor_ops.cc:3099
-msgid "separate region under"
-msgstr "å离åºåä½äº"
-
-#: editor_ops.cc:3220
-msgid "trim to selection"
-msgstr "ä¿®åªå°å·²éä¸é¨å"
-
-#: editor_ops.cc:3356
-msgid "set sync point"
-msgstr "è®¾ç½®åæ¥ç¹"
-
-#: editor_ops.cc:3380
-msgid "remove region sync"
-msgstr "ç§»é¤åºå忥"
-
-#: editor_ops.cc:3402
-msgid "move regions to original position"
-msgstr "ç§»å¨åºåå°åå§ä½ç½®"
-
-#: editor_ops.cc:3404
-msgid "move region to original position"
-msgstr "ç§»å¨åºåå°åå§ä½ç½®"
-
-#: editor_ops.cc:3425
-msgid "align selection"
-msgstr "对é½å·²éä¸é¨å"
-
-#: editor_ops.cc:3499
-msgid "align selection (relative)"
-msgstr "对é½å·²éä¸é¨åï¼ç¸å
³ï¼"
-
-#: editor_ops.cc:3533
-msgid "align region"
-msgstr "对é½åºå"
-
-#: editor_ops.cc:3584
-msgid "trim front"
-msgstr "ä¿®åªåé¨"
-
-#: editor_ops.cc:3584
-msgid "trim back"
-msgstr "ä¿®åªåé¨"
-
-#: editor_ops.cc:3614
-msgid "trim to loop"
-msgstr "ä¿®åªå°å¾ªç¯"
-
-#: editor_ops.cc:3624
-msgid "trim to punch"
-msgstr "ä¿®åªå°åæ¢"
-
-#: editor_ops.cc:3686
-msgid "trim to region"
-msgstr "ä¿®åªå°åºå"
-
-#: editor_ops.cc:3794
-msgid ""
-"This track/bus cannot be frozen because the signal adds or loses channels before "
-"reaching the outputs.\n"
-"This is typically caused by plugins that generate stereo output from mono input or "
-"vice versa."
-msgstr ""
-"è¿ä¸ªé³è½¨/æ»çº¿ä¸è½è¢«å»ç»ï¼å 为å¨ä¿¡å·å°è¾¾è¾åºåæ·»å æä¸¢å¤±äºå£°éã\n"
-"è¿é常æ¯ç±äºä»å声éè¾å
¥çæç«ä½å£°è¾åºï¼åä¹äº¦ç¶ï¼çæä»¶å¼èµ·çã"
-
-#: editor_ops.cc:3797
-msgid "Cannot freeze"
-msgstr "æ æ³å»ç»"
-
-#: editor_ops.cc:3803
-msgid ""
-"<b>%1</b>\n"
-"\n"
-"This track has at least one send/insert/return as part of its signal flow.\n"
-"\n"
-"Freezing will only process the signal as far as the first send/insert/return."
-msgstr ""
-"<b>%1</b>\n"
-"\n"
-"è¿ä¸ªé³è½¨è³å°æä¸ä¸ªåé/æå
¥/è¿åä½ä¸ºå®çä¿¡å·æµçä¸é¨åã\n"
-"\n"
-"å»ç»å°åªä¼å¤çå°ä¿¡å·ç第ä¸ä¸ªåé/æå
¥/è¿å为æ¢ã"
-
-#: editor_ops.cc:3807
-msgid "Freeze anyway"
-msgstr "åªç®¡å»ç»"
-
-#: editor_ops.cc:3808
-msgid "Don't freeze"
-msgstr "ä¸è¦å»ç»"
-
-#: editor_ops.cc:3809
-msgid "Freeze Limits"
-msgstr "å»ç»éå¶"
-
-#: editor_ops.cc:3824
-msgid "Cancel Freeze"
-msgstr "åæ¶å»ç»"
-
-#: editor_ops.cc:3854
-msgid ""
-"You can't perform this operation because the processing of the signal will cause "
-"one or more of the tracks to end up with a region with more channels than this "
-"track has inputs.\n"
-"\n"
-"You can do this without processing, which is a different operation."
-msgstr ""
-"æ¨ä¸è½æ§è¡æ¤æä½ï¼å 为信å·çå¤çå°å¯¼è´ä¸ä¸ªæå¤ä¸ªé³è½¨ä»¥å¸¦çå¤ä¸ªå£°éçåºåç»æï¼èä¸"
-"æ¯ä»¥è¿ä¸ªé³è½¨æ¥æçè¾å
¥å£°éç»æã\n"
-"\n"
-"æ¨å¯ä»¥ä¸åä»»ä½å¤çï¼è¿æ¯ä¸ä¸ªä¸åçæä½ã"
-
-#: editor_ops.cc:3858
-msgid "Cannot bounce"
-msgstr "ä¸è½æ¬¢è·³å¼¹å¥"
-
-#: editor_ops.cc:3869
-msgid "bounce range"
-msgstr "欢跳弹å¥èå´"
-
-#: editor_ops.cc:3971
-msgid "delete"
-msgstr "å é¤"
-
-#: editor_ops.cc:3974
-msgid "cut"
-msgstr "åªå"
-
-#: editor_ops.cc:3977
-msgid "copy"
-msgstr "å¤å¶"
-
-#: editor_ops.cc:3980
-msgid "clear"
-msgstr "æ¸
é¤"
-
-#: editor_ops.cc:4028
-msgid "objects"
-msgstr "对象ç©ä½"
-
-#: editor_ops.cc:4238 editor_ops.cc:4270
-msgid "remove region"
-msgstr "å é¤åºé´"
-
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "å¤å¶å·²éæ©é¨å"
-
-#: editor_ops.cc:4803
-msgid "nudge track"
-msgstr "å¾®è°é³è½¨"
-
-#: editor_ops.cc:4840
-msgid ""
-"Do you really want to destroy the last capture?\n"
-"(This is destructive and cannot be undone)"
-msgstr ""
-"æ¨æ¯å¦ç¡®å®è¦éæ¯æåå·²æè·å
容ï¼\n"
-"ï¼è¿ä¸ªæä½æç ´åæ§ä¸ä¸è½æ¤éï¼ï¼"
-
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
-msgid "No, do nothing."
-msgstr "å¦ï¼ ä»ä¹é½ä¸åã"
-
-#: editor_ops.cc:4844
-msgid "Yes, destroy it."
-msgstr "æ¯ï¼éæ¯å®ã"
-
-#: editor_ops.cc:4846
-msgid "Destroy last capture"
-msgstr "鿝æåæè·çé¨å"
-
-#: editor_ops.cc:4906
-msgid "normalize"
-msgstr "è§èå"
-
-#: editor_ops.cc:5000
-msgid "reverse regions"
-msgstr "å转åºå"
-
-#: editor_ops.cc:5034
-msgid "strip silence"
-msgstr "çæ®µæ 声"
-
-#: editor_ops.cc:5091
-msgid "Fork Region(s)"
-msgstr "åè§£åºå"
-
-#: editor_ops.cc:5112
-msgid "Could not unlink %1"
-msgstr "æ æ³è§£é¤é¾æ¥ %1"
-
-#: editor_ops.cc:5326
-msgid "reset region gain"
-msgstr "é设åºåå¢ç"
-
-#: editor_ops.cc:5379
-msgid "region gain envelope active"
-msgstr "åºåå¢çå°è£
æ¿æ´»"
-
-#: editor_ops.cc:5406
-msgid "toggle region lock"
-msgstr "忢åºåéå®"
-
-#: editor_ops.cc:5430
-msgid "Toggle Video Lock"
-msgstr "忢è§é¢éå®"
-
-#: editor_ops.cc:5454
-msgid "region lock style"
-msgstr "åºåéå®é£æ ¼"
-
-#: editor_ops.cc:5479
-msgid "change region opacity"
-msgstr "æ¹ååºåçæ¨¡ç³åº¦"
-
-#: editor_ops.cc:5572
-msgid "fade range"
-msgstr "æ·¡åèå´"
-
-#: editor_ops.cc:5610
-msgid "set fade in length"
-msgstr "设置淡å
¥é¿åº¦"
-
-#: editor_ops.cc:5617
-msgid "set fade out length"
-msgstr "设置淡åºé¿åº¦"
-
-#: editor_ops.cc:5662
-msgid "set fade in shape"
-msgstr "设置淡å
¥å½¢ç¶"
-
-#: editor_ops.cc:5693
-msgid "set fade out shape"
-msgstr "设置淡åºå½¢ç¶"
-
-#: editor_ops.cc:5723
-msgid "set fade in active"
-msgstr "设置淡å
¥å¯ç¨"
-
-#: editor_ops.cc:5752
-msgid "set fade out active"
-msgstr "设置淡åºé¿åº¦"
-
-#: editor_ops.cc:5994
-msgid "set loop range from selection"
-msgstr "ä»å·²éæ©é¨å设置循ç¯èå´"
-
-#: editor_ops.cc:6008
-msgid "set loop range from region"
-msgstr "ä»åºå设置循ç¯èå´"
-
-#: editor_ops.cc:6027
-msgid "set punch range from selection"
-msgstr "ä»å·²éæ©é¨åè®¾ç½®åæ¢èå´"
-
-#: editor_ops.cc:6041
-msgid "set session start/end from selection"
-msgstr "ä»å·²éæ©é¨å设置ä¼è¯èµ·ç¹/ç»ç¹"
-
-#: editor_ops.cc:6066
-msgid "set punch range from region"
-msgstr "ä»åºåè®¾ç½®åæ¢èå´"
-
-#: editor_ops.cc:6175
-msgid "Add new marker"
-msgstr "æ·»å æ°æ è®°"
-
-#: editor_ops.cc:6176
-msgid "Set global tempo"
-msgstr "设置å
¨å±èå¥"
-
-#: editor_ops.cc:6179
-msgid "Define one bar"
-msgstr "å®ä¹ä¸ä¸ªå°è"
-
-#: editor_ops.cc:6180
-msgid "Do you want to set the global tempo or add a new tempo marker?"
-msgstr "æ¨æ¯å¦è¦è®¾ç½®å
¨å±è奿è
æ·»å ä¸ä¸ªæ°çè奿 ç¾ï¼"
-
-#: editor_ops.cc:6206
-msgid "set tempo from region"
-msgstr "ä»åºå设置èå¥"
-
-#: editor_ops.cc:6236
-msgid "split regions"
-msgstr "æååºå"
-
-#: editor_ops.cc:6278
-msgid ""
-"You are about to split\n"
-"%1\n"
-"into %2 pieces.\n"
-"This could take a long time."
-msgstr ""
-"æ¨è¯å¾æå\n"
-" %1\n"
-" æä¸º %2 é¨åã\n"
-"è¿éè¦ä¸äºæ¶é´ã"
-
-#: editor_ops.cc:6285
-msgid "Call for the Ferret!"
-msgstr "è°ç¨æ¢æµï¼"
-
-#: editor_ops.cc:6286
-msgid ""
-"Press OK to continue with this split operation\n"
-"or ask the Ferret dialog to tune the analysis"
-msgstr ""
-"æOKç»§ç»æåæä½\n"
-"æè
è¯·æ±æ¢æµå¯¹è¯æ¡è¿è¡ä¼ååæ"
-
-#: editor_ops.cc:6288
-msgid "Press OK to continue with this split operation"
-msgstr "æOKç»§ç»æåæä½"
-
-#: editor_ops.cc:6291
-msgid "Excessive split?"
-msgstr "è¿å¤çæåï¼"
-
-#: editor_ops.cc:6443
-msgid "place transient"
-msgstr "æ¾ç½®è¿æ¸¡"
-
-#: editor_ops.cc:6478
-msgid "snap regions to grid"
-msgstr "å¸éåºåå°ç½æ ¼"
-
-#: editor_ops.cc:6517
-msgid "Close Region Gaps"
-msgstr "å
³éåºå空缺"
-
-#: editor_ops.cc:6522
-msgid "Crossfade length"
-msgstr "äº¤åæ·¡åé¿åº¦"
-
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
-msgid "ms"
-msgstr ""
-
-#: editor_ops.cc:6533
-msgid "Pull-back length"
-msgstr "æ¤åé¿åº¦"
-
-#: editor_ops.cc:6546
-msgid "Ok"
-msgstr ""
-
-#: editor_ops.cc:6561
-msgid "close region gaps"
-msgstr "å
³éåºå空缺"
-
-#: editor_ops.cc:6786 route_ui.cc:1543
-msgid "That would be bad news ...."
-msgstr "è¿å°æ¯ä¸ªåæ¶æ¯â¦"
-
-#: editor_ops.cc:6791 route_ui.cc:1548
-msgid ""
-"Removing the master or monitor bus is such a bad idea\n"
-"that %1 is not going to allow it.\n"
-"\n"
-"If you really want to do this sort of thing\n"
-"edit your ardour.rc file to set the\n"
-"\"allow-special-bus-removal\" option to be \"yes\""
-msgstr ""
-"å é¤ä¸»æ§æçæ§æ»çº¿å¯ä¸æ¯ä¸ªå¥½ä¸»æ\n"
-"ä¸ %1 ä¸å
è®¸è¿æ ·åã\n"
-"\n"
-"妿æ¨ççæ³åè¿ç§äº\n"
-"ç¼è¾æ¨ç ardour.rc æä»¶\n"
-"æ\"allow-special-bus-removal\" é项设为 \"yes\" "
-
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "é³è½¨"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
-msgid "track"
-msgstr "é³è½¨"
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "æ»çº¿"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
-msgid "bus"
-msgstr "æ»çº¿"
-
-#: editor_ops.cc:6822
-msgid ""
-"Do you really want to remove %1 %2 and %3 %4?\n"
-"(You may also lose the playlists associated with the %2)\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten!"
-msgstr ""
-"æ¨æ¯å¦ç¡®å®ç§»é¤ %1 %2 å %3 %4 ï¼\n"
-"ï¼æ¨ä¹å¯è½ä¼ä¸¢å¤±ä¸ %2 ç¸å
³çææ¾å表ï¼\n"
-"\n"
-"æ¤æä½ä¸å¯æ¤éï¼ è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼ï¼æ¨ä¹å¯è½ä¼ä¸¢å¤±ä¸ %2 ç¸å
³çææ¾å"
-"表ï¼"
-
-#: editor_ops.cc:6827
-msgid ""
-"Do you really want to remove %1 %2?\n"
-"(You may also lose the playlists associated with the %2)\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten!"
-msgstr ""
-"æ¨æ¯å¦ç¡®å®ç§»é¤ %1 %2 \n"
-"ï¼æ¨ä¹å¯è½ä¼ä¸¢å¤±ä¸ %2 ç¸å
³çææ¾å表ï¼\n"
-"\n"
-"æ¤æä½ä¸å¯æ¤éï¼ è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼"
-
-#: editor_ops.cc:6833
-msgid ""
-"Do you really want to remove %1 %2?\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten"
-msgstr ""
-"æ¨æ¯å¦ç¡®å®ç§»é¤ %1 %2 ï¼\n"
-"\n"
-"æ¤æä½ä¸å¯æ¤éï¼ è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦ç"
-
-#: editor_ops.cc:6840
-msgid "Yes, remove them."
-msgstr "æ¯çï¼ç§»é¤å®ä»¬ã"
-
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
-msgid "Yes, remove it."
-msgstr "æ¯çï¼ç§»é¤å®ã"
-
-#: editor_ops.cc:6847 editor_ops.cc:6849
-msgid "Remove %1"
-msgstr "ç§»é¤ %1"
-
-#: editor_ops.cc:6912
-msgid "insert time"
-msgstr "æå
¥æ¶é´"
-
-#: editor_ops.cc:7076
-msgid "There are too many tracks to fit in the current window"
-msgstr "é³è½¨å¤ªå¤ä»¥è³äºæ æ³å¹é
å½åçªå£ã"
-
-#: editor_ops.cc:7137
-msgid "Sel"
-msgstr "éæ©"
-
-#: editor_ops.cc:7176
-#, c-format
-msgid "Saved view %u"
-msgstr "ä¿åè§å¾ %u"
-
-#: editor_ops.cc:7201
-msgid "mute regions"
-msgstr "éé³åºå"
-
-#: editor_ops.cc:7203
-msgid "mute region"
-msgstr "éé³åºå"
-
-#: editor_ops.cc:7240
-msgid "combine regions"
-msgstr "æ´ååºå"
-
-#: editor_ops.cc:7278
-msgid "uncombine regions"
-msgstr "è§£é¤æ´ååºå"
-
-#: editor_ops.cc:7315
-msgid "%1: Locked"
-msgstr "%1: éå®"
-
-#: editor_ops.cc:7322
-msgid "Click to unlock"
-msgstr "ç¹å»è§£é¤éå®"
-
-#: editor_ops.cc:7376
-msgid "Moving embedded files into session folder"
-msgstr "ç§»å¨å·²åµå
¥çæä»¶å°ä¼è¯æä»¶å¤¹"
-
-#: editor_regions.cc:112
-msgid "Region name, with number of channels in []'s"
-msgstr "åºååï¼å¨ [ ] æ¹æ¬å·å
é带声éç¼å·"
-
-#: editor_regions.cc:113
-msgid "Position of start of region"
-msgstr "åºåèµ·ç¹çä½ç½®"
-
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
-msgid "End"
-msgstr "ç»ç¹"
-
-#: editor_regions.cc:114
-msgid "Position of end of region"
-msgstr "åºåç»ç¹çä½ç½®"
-
-#: editor_regions.cc:115
-msgid "Length of the region"
-msgstr "åºåçé¿åº¦"
-
-#: editor_regions.cc:116
-msgid "Position of region sync point, relative to start of the region"
-msgstr "åºå忥ç¹çä½ç½®ï¼ä¸åºåèµ·ç¹ç¸å
³"
-
-#: editor_regions.cc:117
-msgid "Length of region fade-in (units: secondary clock), () if disabled"
-msgstr "åºåæ·¡å
¥çé¿åº¦ï¼å¦ææ ææ¶ï¼å ä¸åä½ï¼ç§è®¡æ¶å¨ï¼"
-
-#: editor_regions.cc:118
-msgid "Length of region fade-out (units: secondary clock), () if disabled"
-msgstr "åºåæ·¡åºçé¿åº¦ï¼å¦ææ ææ¶ï¼å ä¸åä½ï¼ç§è®¡æ¶å¨ï¼"
-
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203 panner2d.cc:240
-#: stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr ""
-
-#: editor_regions.cc:119
-msgid "Region position locked?"
-msgstr "åºåä½ç½®éå®ï¼"
-
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr ""
-
-#: editor_regions.cc:120
-msgid "Region position glued to Bars|Beats time?"
-msgstr "åºåä½ç½®ç²è¿å°å°è|æåæ¶é´ï¼"
-
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793 mixer_strip.cc:2032
-#: meter_strip.cc:359 panner_ui.cc:603 route_time_axis.cc:2713 stereo_panner.cc:271
-#: time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
-msgid "Region muted?"
-msgstr "åºåéé³ï¼"
-
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr ""
-
-#: editor_regions.cc:122
-msgid "Region opaque (blocks regions below it from being heard)?"
-msgstr "åºå模ç³ï¼ä»åºåå以ä¸çé¨åèµ·å¯ä»¥è¢«å¬è§ï¼?"
-
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
-msgid "Hidden"
-msgstr "éè"
-
-#: editor_regions.cc:391
-msgid "(MISSING) "
-msgstr "ï¼ç¼ºå¤±ï¼"
-
-#: editor_regions.cc:459
-msgid ""
-"Do you really want to remove unused regions?\n"
-"(This is destructive and cannot be undone)"
-msgstr ""
-"æ¨ççæç®ç§»é¤æªä½¿ç¨çåºåï¼\n"
-"ï¼è¿æ¯ç ´åæ§ç䏿 æ³æ¤éï¼"
-
-#: editor_regions.cc:463
-msgid "Yes, remove."
-msgstr "æ¯çï¼ç§»é¤ã"
-
-#: editor_regions.cc:465
-msgid "Remove unused regions"
-msgstr "ç§»é¤æªä½¿ç¨çåºå"
-
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
-msgid "Mult."
-msgstr "å¤"
-
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
-msgid "Start"
-msgstr "èµ·ç¹"
-
-#: editor_regions.cc:867 editor_regions.cc:883
-msgid "Multiple"
-msgstr "å¤ä¸ª"
-
-#: editor_regions.cc:952
-msgid "MISSING "
-msgstr "缺失"
-
-#: editor_routes.cc:182 editor_routes.cc:214
-msgid "SS"
-msgstr ""
-
-#: editor_routes.cc:206
-msgid "Track/Bus Name"
-msgstr "é³è½¨/æ»çº¿åç§°"
-
-#: editor_routes.cc:207
-msgid "Track/Bus visible ?"
-msgstr "é³è½¨/æ»çº¿å¯è§ï¼"
-
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
-msgid "Track/Bus active ?"
-msgstr "é³è½¨/æ»çº¿å¯ç¨ï¼"
-
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054 meter_strip.cc:379
-msgid "I"
-msgstr ""
-
-#: editor_routes.cc:209
-msgid "MIDI input enabled"
-msgstr "MIDIè¾å
¥å·²å¯ç¨"
-
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241 stereo_panner.cc:249
-#: stereo_panner.cc:276
-msgid "R"
-msgstr ""
-
-#: editor_routes.cc:210
-msgid "Record enabled"
-msgstr "å½å¶å·²å¯ç¨"
-
-#: editor_routes.cc:211
-msgid "Muted"
-msgstr "å·²éé³"
-
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr ""
-
-#: editor_routes.cc:212
-msgid "Soloed"
-msgstr "å·²ç¬å¥"
-
-#: editor_routes.cc:213
-msgid "SI"
-msgstr ""
-
-#: editor_routes.cc:213
-msgid "Solo Isolated"
-msgstr "ç¬å¥å·²é离"
-
-#: editor_routes.cc:214
-msgid "Solo Safe (Locked)"
-msgstr "ç¬å¥å®å
¨ï¼éå®ï¼"
-
-#: editor_routes.cc:477 mixer_ui.cc:1197
-msgid "Hide All"
-msgstr "éèææ"
-
-#: editor_routes.cc:478 mixer_ui.cc:1198
-msgid "Show All Audio Tracks"
-msgstr "æ¾ç¤ºææé³é¢è½¨é"
-
-#: editor_routes.cc:479 mixer_ui.cc:1199
-msgid "Hide All Audio Tracks"
-msgstr "éèææé³é¢è½¨é"
-
-#: editor_routes.cc:480 mixer_ui.cc:1200
-msgid "Show All Audio Busses"
-msgstr "æ¾ç¤ºææé³é¢æ»çº¿"
-
-#: editor_routes.cc:481 mixer_ui.cc:1201
-msgid "Hide All Audio Busses"
-msgstr "éèææé³é¢æ»çº¿"
-
-#: editor_routes.cc:482
-msgid "Show All Midi Tracks"
-msgstr "æ¾ç¤ºææMIDI轨"
-
-#: editor_routes.cc:483
-msgid "Hide All Midi Tracks"
-msgstr "éèææMIDI轨"
-
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "æ¾ç¤ºæéåé¢åºåç轨é"
-
-#: editor_rulers.cc:211
-msgid "New location marker"
-msgstr "æ°å»ºä½ç½®æ è®°"
-
-#: editor_rulers.cc:212
-msgid "Clear all locations"
-msgstr "æ¸
餿æä½ç½®"
-
-#: editor_rulers.cc:213
-msgid "Unhide locations"
-msgstr "åæ¶éèä½ç½®"
-
-#: editor_rulers.cc:217
-msgid "New range"
-msgstr "æ°å»ºèå´"
-
-#: editor_rulers.cc:218
-msgid "Clear all ranges"
-msgstr "æ¸
餿æèå´"
-
-#: editor_rulers.cc:219
-msgid "Unhide ranges"
-msgstr "åæ¶éèèå´"
-
-#: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "设为循ç¯èå´"
-
-#: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "è®¾ä¸ºåæ¢èå´"
-
-#: editor_rulers.cc:230
-msgid "New CD track marker"
-msgstr "æ°å»ºCDé³è½¨æ ç¾"
-
-#: editor_rulers.cc:235 tempo_dialog.cc:38
-msgid "New Tempo"
-msgstr "æ°èå¥"
-
-#: editor_rulers.cc:239 tempo_dialog.cc:296
-msgid "New Meter"
-msgstr "æ°èæ"
-
-#: editor_snapshots.cc:137
-msgid "Rename Snapshot"
-msgstr "éå½åå¿«ç
§"
-
-#: editor_snapshots.cc:139
-msgid "New name of snapshot"
-msgstr "å¿«ç
§çæ°åç§°"
-
-#: editor_snapshots.cc:157
-msgid ""
-"Do you really want to remove snapshot \"%1\" ?\n"
-"(which cannot be undone)"
-msgstr ""
-"æ¨æ¯å¦ç¡®å®ç§»é¤å¿«ç
§ \"%1\"ï¼\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-
-#: editor_snapshots.cc:162
-msgid "Remove snapshot"
-msgstr "ç§»é¤å¿«ç
§"
-
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "æ·»å "
-
-#: editor_tempodisplay.cc:215
-msgid "add tempo mark"
-msgstr "æ·»å è奿 è®°"
-
-#: editor_tempodisplay.cc:254
-msgid "add meter mark"
-msgstr "æ·»å èææ è®°"
-
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
-msgid "done"
-msgstr "宿"
-
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
-msgid "replace tempo mark"
-msgstr "æ¿æ¢è奿 è®°"
-
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
-msgid "remove tempo mark"
-msgstr "ç§»é¤è奿 è®°"
-
-#: editor_tempodisplay.cc:370
-msgid "programming error: meter marker canvas item has no marker object pointer!"
-msgstr "ç¨åºé误ï¼èææ è®°ç颿¡ç®æ²¡ææ 记对象ç©ä½æç¤ºï¼"
-
-#: editor_timefx.cc:68
-msgid "stretch/shrink"
-msgstr "延伸/æ¶ç¼©"
-
-#: editor_timefx.cc:129
-msgid "pitch shift"
-msgstr "é³é«æ¿æ¢"
-
-#: editor_timefx.cc:301
-msgid "timefx cannot be started - thread creation error"
-msgstr "é´ç¹ææ æ³å¯å¨ - 线ç¨å建é误"
-
-#: engine_dialog.cc:83
-msgid "Device Control Panel"
-msgstr "è®¾å¤æ§å¶é¢æ¿"
-
-#: engine_dialog.cc:84
-msgid "Midi Device Setup"
-msgstr "MIDI设å¤è®¾ç½®"
-
-#: engine_dialog.cc:85 engine_dialog.cc:2097
-msgid "Measure"
-msgstr "æµé"
-
-#: engine_dialog.cc:86
-msgid "Use results"
-msgstr "使ç¨ç»æ"
-
-#: engine_dialog.cc:87
-msgid "Back to settings ... (ignore results)"
-msgstr "åå°è®¾ç½®â¦ï¼å¿½ç¥ç»æï¼"
-
-#: engine_dialog.cc:88
-msgid "Calibrate Audio"
-msgstr "æ ¡æ£é³é¢"
-
-#: engine_dialog.cc:92
-msgid "Back to settings"
-msgstr "åå°è®¾ç½®"
-
-#: engine_dialog.cc:111
-msgid ""
-"No audio/MIDI backends detected. %1 cannot run\n"
-"\n"
-"(This is a build/packaging/system error. It should never happen.)"
-msgstr ""
-"æªæ£æµå°é³é¢/MIDIå端ã %1 æ æ³è¿è¡\n"
-"\n"
-"ï¼è¿æ¯ä¸ä¸ªæå»º/å
è£
/ç³»ç»é误ãå®åºè¯¥æ°¸è¿ä¸ä¼åçãï¼"
-
-#: engine_dialog.cc:137
-msgid "Latency Measurement Tool"
-msgstr "å»¶è¿æµéå·¥å
·"
-
-#: engine_dialog.cc:149
-msgid ""
-"<span weight=\"bold\">Turn down the volume on your audio equipment to a very low "
-"level.</span>"
-msgstr "<span weight=\"bold\">è°ä½æ¨çé³é¢è®¾å¤é³éå°ä¸ä¸ªé常ä½çæ°´å¹³ã</span>"
-
-#: engine_dialog.cc:158
-msgid "Select two channels below and connect them using a cable."
-msgstr "éæ©ä¸é¢ä¸¤ä¸ªå£°éå¹¶å使ç¨çº¿æ¡è¿æ¥å®ä»¬ã"
-
-#: engine_dialog.cc:163
-msgid "Output channel"
-msgstr "è¾åºå£°é"
-
-#: engine_dialog.cc:171
-msgid "Input channel"
-msgstr "è¾å
¥å£°é"
-
-#: engine_dialog.cc:206
-msgid "Once the channels are connected, click the \"Measure\" button."
-msgstr "䏿¦å£°éå·²è¿æ¥å¥½ï¼åå»âæµéâæé®ã"
-
-#: engine_dialog.cc:213
-msgid "When satisfied with the results, click the \"Use results\" button."
-msgstr "妿å¾å°äºä»¤äººæ»¡æçç»æï¼è¯·ç¹å»â使ç¨ç»æâæé®ã"
-
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
-msgid "No measurement results yet"
-msgstr "è¿æ²¡ææµéç»æ"
-
-#: engine_dialog.cc:238 route_params_ui.cc:106
-msgid "Latency"
-msgstr "å»¶è¿"
-
-#: engine_dialog.cc:372
-msgid "Audio System:"
-msgstr "é³é¢ç³»ç»ï¼"
-
-#: engine_dialog.cc:409
-msgid "Driver:"
-msgstr "驱å¨ï¼"
-
-#: engine_dialog.cc:415
-msgid "Device:"
-msgstr "设å¤ï¼"
-
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
-msgid "Sample rate:"
-msgstr "éæ ·çï¼"
-
-#: engine_dialog.cc:426 engine_dialog.cc:526
-msgid "Buffer size:"
-msgstr "ç¼å²åºå¤§å°ï¼"
-
-#: engine_dialog.cc:444
-msgid "Input Channels:"
-msgstr "è¾å
¥å£°éï¼"
-
-#: engine_dialog.cc:457
-msgid "Output Channels:"
-msgstr "è¾åºå£°éï¼"
-
-#: engine_dialog.cc:469
-msgid "Hardware input latency:"
-msgstr "硬件è¾å
¥å»¶è¿ï¼"
-
-#: engine_dialog.cc:472 engine_dialog.cc:485
-msgid "samples"
-msgstr "éæ ·"
-
-#: engine_dialog.cc:482
-msgid "Hardware output latency:"
-msgstr "硬件è¾åºå»¶è¿ï¼"
-
-#: engine_dialog.cc:493
-msgid "MIDI System:"
-msgstr "MIDIç³»ç»ï¼"
-
-#: engine_dialog.cc:511
-msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
-msgstr ""
-"é³é¢å端已é
置并已å¨å¤é¨å¯å¨ã\n"
-"è¿éå¶äºæ¨å¯¹å®çæ§å¶åã"
-
-#: engine_dialog.cc:564
-msgid ""
-"Failed to start or connect to audio-engine.\n"
-"\n"
-"Latency calibration requires a working audio interface."
-msgstr ""
-"å¯å¨æé¾æ¥é³é¢å¼æå¤±è´¥ã\n"
-"\n"
-"å»¶è¿æ ¡åéè¦æä¸ä¸ªé³é¢æ¥å£å¨å·¥ä½ã"
-
-#: engine_dialog.cc:570
-msgid ""
-"Your selected audio configuration is playback- or capture-only.\n"
-"\n"
-"Latency calibration requires playback and capture"
-msgstr ""
-"æ¨å·²éæ©çé³é¢é
ç½®ä»
ä¾åæ¾æä»
便è·ã\n"
-"\n"
-"å»¶è¿æ ¡åéè¦åæ¾åææ"
-
-#: engine_dialog.cc:651
-msgid "MIDI Devices"
-msgstr "MIDI 设å¤"
-
-#: engine_dialog.cc:657
-msgid "Device"
-msgstr "设å¤"
-
-#: engine_dialog.cc:659
-msgid "Hardware Latencies"
-msgstr "硬件延è¿"
-
-#: engine_dialog.cc:700
-msgid "Calibrate"
-msgstr "æ ¡æ£"
-
-#: engine_dialog.cc:800
-msgid "all available channels"
-msgstr "ææå¯ç¨ç声é"
-
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "éæ ·"
-
-#: engine_dialog.cc:1090
-#, c-format
-msgid "(%.1f ms)"
-msgstr ""
-
-#: engine_dialog.cc:1593
-msgid "Could not start backend engine %1"
-msgstr "æ æ³å¯å¨åç«¯å¼æ %1"
-
-#: engine_dialog.cc:1644
-msgid "Cannot set driver to %1"
-msgstr "æ æ³è®¾ç½®é©±å¨å° %1"
-
-#: engine_dialog.cc:1648
-msgid "Cannot set device name to %1"
-msgstr "æ æ³è®¾ç½®è®¾å¤åç§°å° %1"
-
-#: engine_dialog.cc:1652
-msgid "Cannot set sample rate to %1"
-msgstr "æ æ³è®¾ç½®éæ ·çå° %1"
-
-#: engine_dialog.cc:1656
-msgid "Cannot set buffer size to %1"
-msgstr "æ æ³è®¾ç½®ç¼å²åºå¤§å°å° %1"
-
-#: engine_dialog.cc:1662
-msgid "Cannot set input channels to %1"
-msgstr "æ æ³è®¾ç½®è¾å
¥å£°éå° %1"
-
-#: engine_dialog.cc:1666
-msgid "Cannot set output channels to %1"
-msgstr "æ æ³è®¾ç½®è¾åºå£°éå° %1"
-
-#: engine_dialog.cc:1672
-msgid "Cannot set input latency to %1"
-msgstr "æ æ³è®¾ç½®è¾å
¥å»¶è¿å° %1"
-
-#: engine_dialog.cc:1676
-msgid "Cannot set output latency to %1"
-msgstr "æ æ³è®¾ç½®è¾åºå»¶è¿å° %1"
-
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
-msgid "No signal detected "
-msgstr "æªæ£æµå°ä¿¡å·"
-
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
-#: port_insert_ui.cc:98
-msgid "Disconnected from audio engine"
-msgstr "ä¸é³é¢å¼æå·²æå¼è¿æ¥"
-
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
-msgid "Detected roundtrip latency: "
-msgstr "æ£æµå°å¾è¿å»¶è¿ï¼"
-
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
-msgid "Systemic latency: "
-msgstr "ç³»ç»å»¶è¿ï¼"
-
-#: engine_dialog.cc:1986
-msgid "(signal detection error)"
-msgstr "ï¼ä¿¡å·æ£æµé误ï¼"
-
-#: engine_dialog.cc:1992
-msgid "(inverted - bad wiring)"
-msgstr "ï¼åå - æåæ¥çº¿ï¼"
-
-#: engine_dialog.cc:2039
-msgid "(averaging)"
-msgstr "ï¼å¹³åï¼"
-
-#: engine_dialog.cc:2045
-msgid "(too large jitter)"
-msgstr "ï¼æ¯å¹
è¿å¤§ï¼"
-
-#: engine_dialog.cc:2049
-msgid "(large jitter)"
-msgstr "ï¼å¤§æ¯å¹
ï¼"
-
-#: engine_dialog.cc:2061
-msgid "Timeout - large MIDI jitter."
-msgstr "è¶
æ¶ - 大MIDIæ¯å¹
ã"
-
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
-msgid "Detecting ..."
-msgstr "æ£æµä¸â¦"
-
-#: engine_dialog.cc:2171
-msgid "Disconnect from %1"
-msgstr "ä¸ %1 失å»è¿æ¥"
-
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "æ¿æ´»"
-
-#: engine_dialog.cc:2185
-msgid "Connect to %1"
-msgstr "è¿æ¥å° %1"
-
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "æªæ¿æ´»"
-
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
-msgid "Channels:"
-msgstr "声éï¼"
-
-#: export_channel_selector.cc:46
-msgid "Split to mono files"
-msgstr "æåå°å声éæä»¶"
-
-#: export_channel_selector.cc:182
-msgid "Bus or Track"
-msgstr "æ»çº¿æé³è½¨"
-
-#: export_channel_selector.cc:459
-msgid "Region contents without fades nor region gain (channels: %1)"
-msgstr "åºåå
å®¹æ²¡ææ·¡å乿²¡æåºåå¢çï¼å£°éï¼ %1ï¼"
-
-#: export_channel_selector.cc:463
-msgid "Region contents with fades and region gain (channels: %1)"
-msgstr "åºåå
å®¹å¸¦ææ·¡åååºåå¢çï¼å£°éï¼ %1ï¼"
-
-#: export_channel_selector.cc:467
-msgid "Track output (channels: %1)"
-msgstr "é³è½¨è¾åº ï¼å£°éï¼ %1ï¼"
-
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "导åºåºåå
容"
-
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "导åºé³è½¨è¾åº"
-
-#: export_dialog.cc:46
-msgid ""
-"<span color=\"#ffa755\">Some already existing files will be overwritten.</span>"
-msgstr "<span color=\"#ffa755\">ä¸äºå·²åå¨çæä»¶å°ä¼è¢«åå
¥è¦çã</span>"
-
-#: export_dialog.cc:47
-msgid "List files"
-msgstr "å表æä»¶"
-
-#: export_dialog.cc:158 export_format_dialog.cc:59
-msgid "File format"
-msgstr "æä»¶æ ¼å¼"
-
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
-msgid "Time Span"
-msgstr "æ¶é´è·¨åº¦"
-
-#: export_dialog.cc:160
-msgid "Channels"
-msgstr "声é"
-
-#: export_dialog.cc:182
-msgid ""
-"Export has been aborted due to an error!\n"
-"See the Log for details."
-msgstr ""
-"å¯¼åºæå¤ä¸æ¢ï¼å 为æä¸ªé误ï¼\n"
-"详æ
è¯·è§æ¥å¿ã"
-
-#: export_dialog.cc:251
-msgid "Files that will be overwritten"
-msgstr "å°ä¼è¢«è¢«åå
¥è¦ççæä»¶"
-
-#: export_dialog.cc:296
-msgid "Export initialization failed: %1"
-msgstr "导åºåå§åå¤±è´¥ï¼ %1"
-
-#: export_dialog.cc:306
-msgid "Stop Export"
-msgstr "Stop Export 忢坼åº"
-
-#: export_dialog.cc:327
-msgid "export"
-msgstr "导åº"
-
-#: export_dialog.cc:346
-msgid "Normalizing '%3' (timespan %1 of %2)"
-msgstr "è§èå '%3' ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
-
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "å¯¼åº '%3' ï¼æ¶é´è·¨åº¦ %1 ç %2ï¼"
-
-#: export_dialog.cc:373 export_dialog.cc:375
-msgid "<span color=\"#ffa755\">Error: "
-msgstr "<span color=\"#ffa755\">é误ï¼"
-
-#: export_dialog.cc:385
-msgid "<span color=\"#ffa755\">Warning: "
-msgstr "<span color=\"#ffa755\">è¦åï¼"
-
-#: export_dialog.cc:387
-msgid ""
-"\n"
-"<span color=\"#ffa755\">Warning: "
-msgstr ""
-"\n"
-"<span color=\"#ffa755\">è¦åï¼"
-
-#: export_dialog.cc:411
-msgid "Export Selection"
-msgstr "导åºå·²éæ©é¨å"
-
-#: export_dialog.cc:425
-msgid "Export Region"
-msgstr "导åºåºå"
-
-#: export_dialog.cc:434
-msgid "Source"
-msgstr "æº"
-
-#: export_dialog.cc:450
-msgid "Stem Export"
-msgstr "éå导åº"
-
-#: export_file_notebook.cc:39
-msgid "Add another format"
-msgstr "æ·»å å¦ä¸ä¸ªæ ¼å¼"
-
-#: export_file_notebook.cc:193
-msgid "Format"
-msgstr "æ ¼å¼"
-
-#: export_file_notebook.cc:194
-msgid "Location"
-msgstr "ä½ç½®"
-
-#: export_file_notebook.cc:195
-msgid "Upload to Soundcloud"
-msgstr "ä¸ä¼ å°Soundcloud"
-
-#: export_file_notebook.cc:273
-msgid "No format!"
-msgstr "䏿 ¼å¼åï¼"
-
-#: export_file_notebook.cc:291
-msgid "Format %1: %2"
-msgstr "æ ¼å¼å %1: %2"
-
-#: export_filename_selector.cc:32
-msgid "Label:"
-msgstr "æ ç¾ï¼"
-
-#: export_filename_selector.cc:33
-msgid "Session Name"
-msgstr "ä¼è¯åç§°"
-
-#: export_filename_selector.cc:34
-msgid "Revision:"
-msgstr "ä¿®è®¢çæ¬ï¼"
-
-#: export_filename_selector.cc:36
-msgid "Folder:"
-msgstr "æä»¶å¤¹ï¼"
-
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
-#: transcode_video_dialog.cc:59 video_server_dialog.cc:54 video_server_dialog.cc:56
-#: export_video_dialog.cc:81 export_video_dialog.cc:83
-msgid "Browse"
-msgstr "æµè§"
-
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>ä»è¿äºç»ä»¶æå»ºæä»¶åï¼</i>"
-
-#: export_filename_selector.cc:212
-msgid "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
-msgstr "<small><i>对ä¸èµ·ï¼ç®å没æä¾åæä»¶åå¯ä»¥æ¾ç¤º</i></small>"
-
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>å½åï¼è¿ä¼¼ï¼æä»¶åï¼ â%1â</i></small>"
-
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
-msgid ""
-"%1: this is only the directory/folder name, not the filename.\n"
-"The filename will be chosen from the information just above the folder selector."
-msgstr ""
-"%1ï¼è¿ä»
æ¯ç®å½/æä»¶å¤¹åç§°ï¼ä¸æ¯æä»¶å\n"
-"å°ä¼ä»åæä¸é¢çæä»¶éæ©å¨ä¿¡æ¯ééåºæä»¶åã"
-
-#: export_filename_selector.cc:322
-msgid "Choose export folder"
-msgstr "éæ©å¯¼åºæä»¶å¤¹"
-
-#: export_format_dialog.cc:31
-msgid "New Export Format Profile"
-msgstr "æ°å»ºå¯¼åºæ ¼å¼é
ç½®æä»¶"
-
-#: export_format_dialog.cc:31
-msgid "Edit Export Format Profile"
-msgstr "ç¼è¾å¯¼åºæ ¼å¼é
ç½®æä»¶"
-
-#: export_format_dialog.cc:38
-msgid "Label: "
-msgstr "æ ç¾ï¼"
-
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "è§èåå°ï¼"
-
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
-msgstr "å¨èµ·ç¹ä¿®åªæ 声"
-
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
-msgstr "å¨èµ·ç¹æ·»å æ 声ï¼"
-
-#: export_format_dialog.cc:50
-msgid "Trim silence at end"
-msgstr "å¨ç»ç¹ä¿®åªæ 声"
-
-#: export_format_dialog.cc:51
-msgid "Add silence at end:"
-msgstr "å¨ç»ç¹æ·»å æ 声ï¼"
-
-#: export_format_dialog.cc:54
-msgid ""
-"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
-msgstr ""
-"è¿è¡åç½®-导åºçå½ä»¤\n"
-"ï¼%f=宿´è·¯å¾åæä»¶åï¼%d=ç®å½ï¼%b=åºæ¬åç§°ï¼ï¼"
-
-#: export_format_dialog.cc:57
-msgid "Compatibility"
-msgstr "å
¼å®¹æ§"
-
-#: export_format_dialog.cc:58
-msgid "Quality"
-msgstr "è´¨é"
-
-#: export_format_dialog.cc:61
-msgid "Sample rate conversion quality:"
-msgstr "éæ ·ç转æ¢è´¨éï¼"
-
-#: export_format_dialog.cc:68
-msgid "Dithering"
-msgstr "æå¨"
-
-# CUE cuesheet æ¯æå
çæ åï¼éåï¼è¾
婿件æç§°æ è®°æä»¶
-#: export_format_dialog.cc:70
-msgid "Create CUE file for disk-at-once CD/DVD creation"
-msgstr "为åå»ºä¸æ¬¡æ§CD/DVDå
çèå建CUEæä»¶"
-
-# ç®å½æ°æ® (Table of Content,TOC)
-#: export_format_dialog.cc:71
-msgid "Create TOC file for disk-at-once CD/DVD creation"
-msgstr "为åå»ºä¸æ¬¡æ§CD/DVDå
çèå建TOCæä»¶"
-
-#: export_format_dialog.cc:73
-msgid "Tag file with session's metadata"
-msgstr "ä¼è¯å
æ°æ®çæ ç¾æä»¶"
-
-#: export_format_dialog.cc:470
-msgid "Best (sinc)"
-msgstr "æä½³ï¼sincï¼"
-
-#: export_format_dialog.cc:475
-msgid "Medium (sinc)"
-msgstr "ä¸çï¼sincï¼"
-
-#: export_format_dialog.cc:480
-msgid "Fast (sinc)"
-msgstr "å¿«éï¼sincï¼"
-
-#: export_format_dialog.cc:490
-msgid "Zero order hold"
-msgstr "é¶é¶ä¿æ"
-
-#: export_format_dialog.cc:895
-msgid "Linear encoding options"
-msgstr "线æ§ç¼ç é项"
-
-#: export_format_dialog.cc:911
-msgid "Ogg Vorbis options"
-msgstr "Ogg Vorbis é项"
-
-#: export_format_dialog.cc:922
-msgid "FLAC options"
-msgstr "FLAC é项"
-
-#: export_format_dialog.cc:939
-msgid "Broadcast Wave options"
-msgstr "广æWaveé项"
-
-#: export_format_selector.cc:136
-msgid "Do you really want to remove the format?"
-msgstr "æ¨æ¯å¦ççè¦ç§»é¤è¿ä¸ªæ ¼å¼ï¼"
-
-#: export_preset_selector.cc:28
-msgid "Preset"
-msgstr "é¢è®¾"
-
-#: export_preset_selector.cc:104
-msgid ""
-"The selected preset did not load successfully!\n"
-"Perhaps it references a format that has been removed?"
-msgstr ""
-"被éä¸çé¢è®¾è½½å
¥å¤±è´¥ï¼\n"
-"ä¹è®¸å®å¼ç¨äºä¸ä¸ªå·²è¢«å é¤çæ ¼å¼ï¼"
-
-#: export_preset_selector.cc:156
-msgid "Do you really want to remove this preset?"
-msgstr "æ¨æ¯å¦ççè¦ç§»é¤è¿ä¸ªé¢è®¾ï¼"
-
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
-msgstr "æ¾ç¤ºæ¶é´ä¸ºï¼"
-
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "éæ©ææ"
-
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
-msgstr "å°"
-
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
-msgstr "èå´"
-
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
-msgstr "åæé误 %1 (%2)"
-
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
-msgstr "è·å声é³èµæºæä»¶ï¼å¨ xml æä»¶éæ²¡ææ£ç¡®çæ ¹"
-
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
-msgstr "è·å声é³èµæºæä»¶ï¼æ ¹ = %1, ! = ååº"
-
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
-msgstr ""
-
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
-msgstr ""
-
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
-msgstr "æ·¡åå¨èªå¨æ¨¡å¼"
-
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
-msgstr "æ·¡åå¨èªå¨ç±»å"
-
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
-msgstr ""
-
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
-msgid "P"
-msgstr ""
-
-#: gain_meter.cc:799 panner_ui.cc:609
-msgid "T"
-msgstr ""
-
-#: gain_meter.cc:802 panner_ui.cc:612
-msgid "W"
-msgstr ""
-
-#: generic_pluginui.cc:83
-msgid "<span size=\"large\">Presets</span>"
-msgstr "<span size=\"large\">é¢è®¾</span>"
-
-#: generic_pluginui.cc:97
-msgid "Manual"
-msgstr "æå"
-
-#: generic_pluginui.cc:106
-msgid "All Automation"
-msgstr "å
¨é¨èªå¨å"
-
-#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "转æ¢"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "æ§å¶"
-
-#: generic_pluginui.cc:293
-msgid "Plugin Editor: could not build control element for port %1"
-msgstr "æä»¶ç¼è¾å¨ï¼æ æ³ä¸ºç«¯å£ %1 å»ºç«æ§å¶å
ç´ "
-
-#: generic_pluginui.cc:318
-msgid "Plugin Editor: no control for property %1"
-msgstr "æä»¶ç¼è¾å¨ï¼æ æ³æ§å¶ %1 屿§"
-
-#: generic_pluginui.cc:324
-msgid "Plugin Editor: could not build control element for property %1"
-msgstr "æä»¶ç¼è¾å¨ï¼æ æ³ä¸º %1 屿§å»ºç«æ§å¶å
ç´ "
-
-#: generic_pluginui.cc:468
-msgid "Meters"
-msgstr "èæ"
-
-#: generic_pluginui.cc:490
-msgid "Automation control"
-msgstr "èªå¨æ§å¶"
-
-#: generic_pluginui.cc:497
-msgid "Mgnual"
-msgstr ""
-
-#: global_port_matrix.cc:158
-msgid "Audio Connection Manager"
-msgstr "é³é¢è¿ç»ç®¡çå¨"
-
-#: global_port_matrix.cc:161
-msgid "MIDI Connection Manager"
-msgstr "MIDIè¿æ¥ç®¡çå¨"
-
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
-msgid "Disconnect"
-msgstr "åæ¶è¿æ¥"
-
-#: global_port_matrix.cc:207 io_selector.cc:217
-msgid "port"
-msgstr "端å£"
-
-#: group_tabs.cc:312
-msgid "Selection..."
-msgstr "已鿩é¨åâ¦"
-
-#: group_tabs.cc:313
-msgid "Record Enabled..."
-msgstr "å¯ç¨å½å¶â¦"
-
-#: group_tabs.cc:314
-msgid "Soloed..."
-msgstr "ç¬å¥â¦"
-
-#: group_tabs.cc:320
-msgid "Create New Group ..."
-msgstr "å建æ°çåç»â¦"
-
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "å建æ°çåç»æ¥èªäº"
-
-#: group_tabs.cc:324
-msgid "Edit Group..."
-msgstr "ç¼è¾åç»â¦"
-
-#: group_tabs.cc:325
-msgid "Collect Group"
-msgstr "æ¶éåç»"
-
-#: group_tabs.cc:326
-msgid "Remove Group"
-msgstr "ç§»é¤åç»"
-
-#: group_tabs.cc:329
-msgid "Remove Subgroup Bus"
-msgstr "ç§»é¤æ¬¡çº§åç»æ»çº¿"
-
-#: group_tabs.cc:331
-msgid "Add New Subgroup Bus"
-msgstr "æ·»å æ°ç次级åç»æ»çº¿"
-
-#: group_tabs.cc:333
-msgid "Add New Aux Bus (pre-fader)"
-msgstr "æ·»å æ°çè¾
婿»çº¿ï¼å置淡åï¼"
-
-#: group_tabs.cc:334
-msgid "Add New Aux Bus (post-fader)"
-msgstr "æ·»å æ°çè¾
婿»çº¿ï¼å置淡åï¼"
-
-#: group_tabs.cc:340
-msgid "Enable All Groups"
-msgstr "å¯ç¨ææåç»"
-
-#: group_tabs.cc:341
-msgid "Disable All Groups"
-msgstr "ç¦ç¨ææåç»"
-
-#: insert_time_dialog.cc:46
-msgid "Time to insert:"
-msgstr "è¦æå
¥çæ¶é´ä½ç½®ï¼"
-
-#: insert_time_dialog.cc:54
-msgid "Intersected regions should:"
-msgstr "ç¸äº¤çåºååºè¯¥ï¼"
-
-#: insert_time_dialog.cc:57
-msgid "stay in position"
-msgstr "åçå¨åä½"
-
-#: insert_time_dialog.cc:58
-msgid "move"
-msgstr "ç§»å¨"
-
-#: insert_time_dialog.cc:59
-msgid "be split"
-msgstr "æå"
-
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "卿æçé³è½¨ææ¾åè¡¨ä¸æå
¥æ¶é´"
-
-#: insert_time_dialog.cc:68
-msgid "Move glued regions"
-msgstr "ç§»å¨è¢«ç²è¿çåºå"
-
-#: insert_time_dialog.cc:70
-msgid "Move markers"
-msgstr "ç§»å¨æ è®°"
-
-#: insert_time_dialog.cc:73
-msgid "Move glued markers"
-msgstr "ç§»å¨è¢«ç²è¿çæ è®°"
-
-#: insert_time_dialog.cc:78
-msgid "Move locked markers"
-msgstr "ç§»å¨è¢«éå®çæ è®°"
-
-#: insert_time_dialog.cc:83
-msgid ""
-"Move tempo and meter changes\n"
-"<i>(may cause oddities in the tempo map)</i>"
-msgstr ""
-"ç§»å¨èå¥åèæåå\n"
-"ï¼ä¹è®¸ä¼å¨èå¥å¾ä¸å¼åå¼å¸¸ï¼"
-
-#: insert_time_dialog.cc:91
-msgid "Insert time"
-msgstr "æå
¥æ¶é´"
-
-#: instrument_selector.cc:62
-msgid "-none-"
-msgstr "â æ â"
-
-#: interthread_progress_window.cc:103
-msgid "Importing file: %1 of %2"
-msgstr "导å
¥æä»¶ï¼ %2 ç %1"
-
-#: io_selector.cc:221
-msgid "I/O selector"
-msgstr "è¾å
¥/è¾åºéæ©å¨"
-
-#: io_selector.cc:266
-msgid "%1 input"
-msgstr "%1 è¾å
¥"
-
-#: io_selector.cc:268
-msgid "%1 output"
-msgstr "%1 è¾åº"
-
-#: keyboard.cc:70
-msgid "your own"
-msgstr "æ¨èªå·±ç"
-
-#: keyboard.cc:133 keyboard.cc:157
-msgid "Default keybindings not found - %1 will be hard to use!"
-msgstr "æ¾ä¸å°é»è®¤çæé®ç»å®ââ %1 å°å¾é¾ä½¿ç¨ï¼"
-
-#: keyboard.cc:136
-msgid "Key bindings file \"%1\" not found. Default bindings used instead"
-msgstr "æ¾ä¸å°æé®ç»å®æä»¶ \"%1\"ã使ç¨é»è®¤ç»å®æ¿ä»£ã"
-
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "ç§»é¤å¿«æ·é®"
-
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "æä½"
-
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "å¿«æ·é®"
-
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "éæ©ä¸ä¸ªæä½ï¼ç¶åæä¸æé®æ¥ï¼éæ°ï¼è®¾ç½®å¿«æ·é®"
-
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
-msgstr "é置为é»è®¤ç»å®"
-
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "主èå"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "éå®åèå"
-
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "ç¼è¾å¨èå"
-
-#: keyeditor.cc:269
-msgid "RegionList"
-msgstr "åºåå表"
-
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "å¤çå¨èå"
-
-#: latency_gui.cc:40
-msgid "msec"
-msgstr "毫ç§"
-
-#: latency_gui.cc:41
-msgid "period"
-msgstr "卿"
-
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 éæ ·"
-
-#: latency_gui.cc:72 panner_ui.cc:409
-msgid "Reset"
-msgstr "é¢è®¾"
-
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
-msgid "programming error: %1 (%2)"
-msgstr "ç¨åºéè¯¯ï¼ %1 (%2)"
-
-#: location_ui.cc:52 location_ui.cc:54
-msgid "Use PH"
-msgstr "ä½¿ç¨ PH"
-
-#: location_ui.cc:59
-msgid "Glue"
-msgstr "ç²è¿"
-
-#: location_ui.cc:87
-msgid "Performer:"
-msgstr "æ¼å¥è
ï¼"
-
-#: location_ui.cc:88
-msgid "Composer:"
-msgstr "使²å®¶ï¼"
-
-#: location_ui.cc:90
-msgid "Pre-Emphasis"
-msgstr "é¢å é"
-
-#: location_ui.cc:317
-msgid "Remove this range"
-msgstr "ç§»é¤è¿ä¸ªèå´"
-
-#: location_ui.cc:318
-msgid "Start time - middle click to locate here"
-msgstr "èµ·ç¹æ¶é´ââé¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
-
-#: location_ui.cc:319
-msgid "End time - middle click to locate here"
-msgstr "ç»ç¹æ¶é´ââé¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
-
-#: location_ui.cc:322
-msgid "Set range start from playhead location"
-msgstr "仿éä½ç½®è®¾ç½®èå´èµ·ç¹"
-
-#: location_ui.cc:323
-msgid "Set range end from playhead location"
-msgstr "仿éä½ç½®è®¾ç½®èå´ç»ç¹"
-
-#: location_ui.cc:327
-msgid "Remove this marker"
-msgstr "ç§»é¤è¿ä¸ªæ è®°"
-
-#: location_ui.cc:328
-msgid "Position - middle click to locate here"
-msgstr "ä½ç½®ââé¼ æ ä¸é®ç¹å»æ¾ç½®å¨æ¤å¤"
-
-#: location_ui.cc:330
-msgid "Set marker time from playhead location"
-msgstr "仿éä½ç½®è®¾ç½®æ è®°æ¶é´"
-
-#: location_ui.cc:499
-msgid "You cannot put a CD marker at the start of the session"
-msgstr "æ¨ä¸è½å¨ä¼è¯èµ·ç¹å¤æ¾ç½®CDæ è®°"
-
-#: location_ui.cc:725
-msgid "New Marker"
-msgstr "æ°å»ºæ è®°"
-
-#: location_ui.cc:726
-msgid "New Range"
-msgstr "æ°å»ºèå´"
-
-#: location_ui.cc:739
-msgid "<b>Loop/Punch Ranges</b>"
-msgstr "<b>循ç¯/忢èå´</b>"
-
-#: location_ui.cc:764
-msgid "<b>Markers (Including CD Index)</b>"
-msgstr "<b>æ è®°ï¼å
æ¬CDç´¢å¼ï¼</b>"
-
-#: location_ui.cc:799
-msgid "<b>Ranges (Including CD Track Ranges)</b>"
-msgstr "<b>èå´ï¼å
æ¬CDé³è½¨èå´ï¼</b>"
-
-#: location_ui.cc:1042
-msgid "add range marker"
-msgstr "æ·»å èå´æ è®°"
-
-#: main.cc:82
-msgid "%1 could not connect to the audio backend."
-msgstr "%1æ æ³è¿æ¥å°é³é¢å端ã"
-
-#: main.cc:107 main.cc:123
-msgid "The audio backend (%1) has failed, or terminated"
-msgstr "é³é¢å端ï¼%1ï¼å¤±ææè
䏿¢ã"
-
-#: main.cc:110
-msgid ""
-"%2 exited unexpectedly, and without notifying %1.\n"
-"\n"
-"This could be due to misconfiguration or to an error inside %2.\n"
-"\n"
-"Click OK to exit %1."
-msgstr ""
-"%2 æå¤éåºï¼ä¸æ²¡æéç¥ %1 ã\n"
-"\n"
-"è¿å¯è½æ¯ç±äºé误é
ç½®æè
å®åå°é误 %2 å
é¨é误ã\n"
-"ç¹å» OK éåº %1ã"
-
-#: main.cc:124
-msgid "%2 exited unexpectedly, and without notifying %1."
-msgstr "%2 exited unexpectedly, and without notifying %1."
-
-#: main.cc:219
-msgid ""
-"\n"
-" %1 could not understand your command line "
-msgstr ""
-"\n"
-" %1 æ æ³è¯å«æ¨çå½ä»¤è¡ "
-
-#: main.cc:221
-msgid "An error was encountered while launching %1"
-msgstr "å¯å¨ %1 æ¶éå°ä¸ä¸ªæå¤é误"
-
-#: main.cc:310
-msgid " (built using "
-msgstr "ï¼æå»ºä½¿ç¨ "
-
-#: main.cc:313
-msgid " and GCC version "
-msgstr "å GCC çæ¬ "
-
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr " çæ (C) 1999-2012 Paul Davis"
-
-#: main.cc:324
-msgid ""
-"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, "
-"Robin Gareus"
-msgstr ""
-"é¨åçæ (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, Robin Gareus"
-
-#: main.cc:326
-msgid "%1 comes with ABSOLUTELY NO WARRANTY"
-msgstr "%1 ç»å¯¹ä¸é另任使
ä¿"
-
-#: main.cc:327
-msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-msgstr " çè³ä¸å
æ¬å¯é宿§è´¨åéç¨äºä»»ä½ç¹å®ç®ççä¿è¯ã"
-
-#: main.cc:328
-msgid "This is free software, and you are welcome to redistribute it "
-msgstr "è¿æ¯èªç±è½¯ä»¶ï¼ä¸æ¬¢è¿æ¨ååæ¨å¹¿å®ï¼"
-
-#: main.cc:329
-msgid "under certain conditions; see the source for copying conditions."
-msgstr "å¨ä¸å®æ¡ä»¶ä¸ï¼è¯·åé
å¤å¶åè®®çæºæä»¶ã"
-
-#: main.cc:334
-msgid "could not initialize %1."
-msgstr "æ æ³åå§å %1 ã"
-
-#: main.cc:344
-msgid "Cannot xinstall SIGPIPE error handler"
-msgstr "æ æ³å®è£
å¸è½½ SIGPIPE é误å¤çç¨åº"
-
-#: main.cc:351
-msgid "could not create %1 GUI"
-msgstr "æ æ³å建 %1 å¾å½¢ç¨æ·çé¢"
-
-#: main_clock.cc:52
-msgid "Display delta to edit cursor"
-msgstr "æ¾ç¤ºæ¬¡çº§ä»¥ç¼è¾æ¸¸æ "
-
-#: marker.cc:273
-msgid "MarkerText"
-msgstr "æ è®°ææ¬"
-
-#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573 rc_option_editor.cc:2203
-#: sfdb_ui.cc:665
-msgid "None"
-msgstr "æ "
-
-#: midi_channel_selector.cc:165 midi_channel_selector.cc:405
-#: midi_channel_selector.cc:441
-msgid "Invert"
-msgstr "å转"
-
-#: midi_channel_selector.cc:169
-msgid "Force"
-msgstr "强å¶"
-
-#: midi_channel_selector.cc:328 midi_channel_selector.cc:370
-msgid "MIDI Channel Control"
-msgstr "MIDI 声鿧å¶"
-
-#: midi_channel_selector.cc:330
-msgid "Playback all channels"
-msgstr "åæ¾ææå£°é"
-
-#: midi_channel_selector.cc:331
-msgid "Play only selected channels"
-msgstr "ä»
ææ¾å·²éä¸ç声é"
-
-#: midi_channel_selector.cc:332
-msgid "Use a single fixed channel for all playback"
-msgstr "ææåæ¾ä½¿ç¨ä¸ä¸ªåç¬åºå®ç声é"
-
-#: midi_channel_selector.cc:333
-msgid "Record all channels"
-msgstr "å½å¶ææå£°é"
-
-#: midi_channel_selector.cc:334
-msgid "Record only selected channels"
-msgstr "ä»
å½å¶å·²éä¸ç声é"
-
-#: midi_channel_selector.cc:335
-msgid "Force all channels to 1 channel"
-msgstr "å¼ºå¶ææå£°é为 1 声é"
-
-#: midi_channel_selector.cc:376
-msgid "Inbound"
-msgstr "è¿åº"
-
-#: midi_channel_selector.cc:396
-msgid "Click to enable recording all channels"
-msgstr "ç¹å»å¯ç¨å½å¶ææå£°é"
-
-#: midi_channel_selector.cc:401
-msgid "Click to disable recording all channels"
-msgstr "ç¹å»ç¦ç¨å½å¶ææå£°é"
-
-#: midi_channel_selector.cc:406
-msgid "Click to invert currently selected recording channels"
-msgstr "ç¹å»å转å½å已鿩çå½å¶å£°é"
-
-#: midi_channel_selector.cc:413
-msgid "Playback"
-msgstr "åæ¾"
-
-#: midi_channel_selector.cc:432
-msgid "Click to enable playback of all channels"
-msgstr "ç¹å»å¯ç¨åæ¾ææå£°é"
-
-#: midi_channel_selector.cc:437
-msgid "Click to disable playback of all channels"
-msgstr "ç¹å»ç¦ç¨åæ¾ææå£°é"
-
-#: midi_channel_selector.cc:442
-msgid "Click to invert current selected playback channels"
-msgstr "ç¹å»å转å½å已鿩ç忾声é"
-
-#: midi_channel_selector.cc:620
-msgid "Click to toggle playback of channel %1"
-msgstr "ç¹å»åæ¢åæ¾å£°é %1"
-
-#: midi_channel_selector.cc:628
-msgid "Click to force all MIDI channel messages to channel %1"
-msgstr "ç¹å»å¼ºå¶ææMIDI声éåéä¿¡æ¯å°å£°é %1"
-
-#: midi_channel_selector.cc:718
-msgid "Click to toggle recording of channel %1"
-msgstr "ç¹å»åæ¢å½å¶å£°é %1"
-
-#: midi_channel_selector.cc:726
-msgid "Click to force all recorded channels to %1"
-msgstr "ç¹å»å¼ºå¶ææå·²å½å¶å£°éå° %1"
-
-#: midi_export_dialog.cc:35
-msgid "Export MIDI: %1"
-msgstr "导åºMIDIï¼ %1"
-
-#: midi_list_editor.cc:56
-msgid "Whole"
-msgstr "æ´ä½"
-
-#: midi_list_editor.cc:57
-msgid "Half"
-msgstr "ä¸å"
-
-#: midi_list_editor.cc:58
-msgid "Triplet"
-msgstr "ä¸åä¹ä¸"
-
-#: midi_list_editor.cc:59
-msgid "Quarter"
-msgstr "ååä¹ä¸"
-
-#: midi_list_editor.cc:60
-msgid "Eighth"
-msgstr "å
«åä¹ä¸"
-
-#: midi_list_editor.cc:61
-msgid "Sixteenth"
-msgstr "åå
åä¹ä¸"
-
-#: midi_list_editor.cc:62
-msgid "Thirty-second"
-msgstr "ä¸åäºåä¹ä¸"
-
-#: midi_list_editor.cc:63
-msgid "Sixty-fourth"
-msgstr "å
åååä¹ä¸"
-
-#: midi_list_editor.cc:106
-msgid "Num"
-msgstr "æ°å¼"
-
-#: midi_list_editor.cc:108
-msgid "Vel"
-msgstr "å度"
-
-#: midi_list_editor.cc:216
-msgid "edit note start"
-msgstr "ç¼è¾é³ç¬¦èµ·ç¹"
-
-#: midi_list_editor.cc:225
-msgid "edit note channel"
-msgstr "ç¼è¾é³ç¬¦å£°é"
-
-#: midi_list_editor.cc:235
-msgid "edit note number"
-msgstr "ç¼è¾é³ç¬¦ç¼å·"
-
-#: midi_list_editor.cc:245
-msgid "edit note velocity"
-msgstr "ç¼è¾é³ç¬¦å度"
-
-#: midi_list_editor.cc:259
-msgid "edit note length"
-msgstr "ç¼è¾é³ç¬¦é¿åº¦"
-
-#: midi_list_editor.cc:463
-msgid "insert new note"
-msgstr "æå
¥æ°çé³ç¬¦"
-
-#: midi_list_editor.cc:527
-msgid "delete notes (from list)"
-msgstr "å é¤é³ç¬¦ï¼ä»å表ä¸ï¼"
-
-#: midi_list_editor.cc:602
-msgid "change note channel"
-msgstr "忢é³ç¬¦å£°é"
-
-#: midi_list_editor.cc:610
-msgid "change note number"
-msgstr "忢é³ç¬¦ç¼å·"
-
-#: midi_list_editor.cc:620
-msgid "change note velocity"
-msgstr "忢é³ç¬¦å度"
-
-#: midi_list_editor.cc:690
-msgid "change note length"
-msgstr "忢é³ç¬¦é¿åº¦"
-
-#: midi_port_dialog.cc:39
-msgid "Add MIDI Port"
-msgstr "æ·»å MIDI端å£"
-
-#: midi_port_dialog.cc:40
-msgid "Port name:"
-msgstr "端å£åç§°ï¼"
-
-#: midi_port_dialog.cc:45
-msgid "MidiPortDialog"
-msgstr "MIDI端å£å¯¹è¯æ¡"
-
-#: midi_region_view.cc:859
-msgid "channel edit"
-msgstr "声éç¼è¾"
-
-#: midi_region_view.cc:895
-msgid "velocity edit"
-msgstr "å度ç¼è¾"
-
-#: midi_region_view.cc:954
-msgid "add note"
-msgstr "æ·»å é³ç¬¦"
-
-#: midi_region_view.cc:1885
-msgid "step add"
-msgstr "æ¥è¿æ·»å "
-
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
-msgid "alter patch change"
-msgstr "æ´æ¹é³è²åæ¢"
-
-#: midi_region_view.cc:2038
-msgid "add patch change"
-msgstr "æ·»å é³è²åæ¢"
-
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
-msgid "move patch change"
-msgstr "ç§»å¨é³è²åæ¢"
-
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
-msgid "delete patch change"
-msgstr "å é¤é³è²åæ¢"
-
-#: midi_region_view.cc:2112
-msgid "delete selection"
-msgstr "å é¤å·²éåé¨å"
-
-#: midi_region_view.cc:2128
-msgid "delete note"
-msgstr "å é¤é³ç¬¦"
-
-#: midi_region_view.cc:2587
-msgid "move notes"
-msgstr "ç§»å¨é³ç¬¦"
-
-#: midi_region_view.cc:3070
-msgid "change velocities"
-msgstr "æ¹åå度"
-
-#: midi_region_view.cc:3136
-msgid "transpose"
-msgstr "åè°"
-
-#: midi_region_view.cc:3164
-msgid "change note lengths"
-msgstr "æ¹åé³ç¬¦é¿åº¦"
-
-#: midi_region_view.cc:3240
-msgid "nudge"
-msgstr "å¾®è°"
-
-#: midi_region_view.cc:3255
-msgid "change channel"
-msgstr "æ¹å声é"
-
-#: midi_region_view.cc:3295
-msgid "Bank "
-msgstr "åº"
-
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "ç¨åº"
-
-#: midi_region_view.cc:3297
-msgid "Channel "
-msgstr "声é"
-
-#: midi_region_view.cc:3484
-msgid "paste"
-msgstr "ç²è´´"
-
-#: midi_streamview.cc:185
-msgid "attempt to display MIDI region with no source"
-msgstr "å°è¯æ¾ç¤ºæ æ¥æºç MIDI åºå"
-
-#: midi_streamview.cc:195
-msgid "attempt to display MIDI region with no model"
-msgstr "å°è¯æ¾ç¤ºæ 模å¼ç MIDI åºå"
-
-#: midi_streamview.cc:506
-msgid "failed to create MIDI region"
-msgstr "å建 MIDI åºå失败"
-
-#: midi_time_axis.cc:309
-msgid "External MIDI Device"
-msgstr "å¤é¨ MIDI 设å¤"
-
-#: midi_time_axis.cc:310
-msgid "External Device Mode"
-msgstr "å¤é¨è®¾å¤æ¨¡å¼"
-
-#: midi_time_axis.cc:318
-msgid "Chns"
-msgstr "声é"
-
-#: midi_time_axis.cc:320
-msgid "Click to edit channel settings"
-msgstr "ç¹å»ç¼è¾å£°é设置"
-
-#: midi_time_axis.cc:519
-msgid "Show Full Range"
-msgstr "æ¾ç¤ºå
¨é¨èå´"
-
-#: midi_time_axis.cc:524
-msgid "Fit Contents"
-msgstr "å¹é
å
容"
-
-#: midi_time_axis.cc:528
-msgid "Note Range"
-msgstr "é³ç¬¦èå´"
-
-#: midi_time_axis.cc:529
-msgid "Note Mode"
-msgstr "é³ç¬¦æ¨¡å¼"
-
-#: midi_time_axis.cc:530
-msgid "Channel Selector"
-msgstr "声ééæ©å¨"
-
-#: midi_time_axis.cc:535
-msgid "Color Mode"
-msgstr "é¢è²æ¨¡å¼"
-
-#: midi_time_axis.cc:594
-msgid "Bender"
-msgstr "æ»é³å¨"
-
-#: midi_time_axis.cc:598
-msgid "Pressure"
-msgstr "åå"
-
-#: midi_time_axis.cc:610
-msgid "Controllers"
-msgstr "æ§å¶å¨ "
-
-#: midi_time_axis.cc:615
-msgid "No MIDI Channels selected"
-msgstr "æªéæ© MIDI 声é"
-
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
-msgid "Hide all channels"
-msgstr "éèææå£°é"
-
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
-msgid "Show all channels"
-msgstr "æ¾ç¤ºææå£°é"
-
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
-msgid "Channel %1"
-msgstr "声é %1"
-
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
-msgid "Controllers %1-%2"
-msgstr "æ§å¶å¨ %1-%2"
-
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
-msgid "Controller %1"
-msgstr "æ§å¶å¨ %1"
-
-#: midi_time_axis.cc:991
-msgid "Sustained"
-msgstr "æç»"
-
-#: midi_time_axis.cc:998
-msgid "Percussive"
-msgstr "æ²å»"
-
-#: midi_time_axis.cc:1018
-msgid "Meter Colors"
-msgstr "èæé¢è²"
-
-#: midi_time_axis.cc:1025
-msgid "Channel Colors"
-msgstr " 声éé¢è²"
-
-#: midi_time_axis.cc:1032
-msgid "Track Color"
-msgstr "é³è½¨é¢è²"
-
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
-msgid "all"
-msgstr "ææ"
-
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
-msgid "some"
-msgstr "ä¸äº"
-
-#: midi_tracer.cc:48
-msgid "Line history: "
-msgstr "线æ¡åå²ï¼"
-
-#: midi_tracer.cc:55
-msgid "Auto-Scroll"
-msgstr "èªå¨æ»å¨"
-
-#: midi_tracer.cc:56
-msgid "Decimal"
-msgstr "åè¿å¶"
-
-#: midi_tracer.cc:57 rc_option_editor.cc:740
-msgid "Enabled"
-msgstr "å¯ç¨"
-
-#: midi_tracer.cc:58
-msgid "Delta times"
-msgstr "次级æ¶é´"
-
-#: midi_tracer.cc:71
-msgid "Port:"
-msgstr "端å£ï¼"
-
-#: midi_velocity_dialog.cc:31
-msgid "New velocity"
-msgstr "æ°å»ºå度"
-
-#: missing_file_dialog.cc:35
-msgid "Missing File"
-msgstr "缺失æä»¶"
-
-#: missing_file_dialog.cc:37
-msgid "Select a folder to search"
-msgstr "éæ©ä¸ä¸ªè¦æç´¢çæä»¶å¤¹"
-
-#: missing_file_dialog.cc:38
-msgid "Add chosen folder to search path, and try again"
-msgstr "请添å 已鿩çæä»¶å¤¹å°æç´¢è·¯å¾ï¼ç¶ååè¯ä¸æ¬¡"
-
-#: missing_file_dialog.cc:40
-msgid "Stop loading this session"
-msgstr "åæ¢è½½å
¥æ¤ä¼è¯"
-
-#: missing_file_dialog.cc:41
-msgid "Skip all missing files"
-msgstr "è·³è¿ææç¼ºå¤±çæä»¶"
-
-#: missing_file_dialog.cc:42
-msgid "Skip this file"
-msgstr "è·³è¿è¿ä¸ªæä»¶"
-
-#: missing_file_dialog.cc:53
-msgid "audio"
-msgstr "é³é¢"
-
-#: missing_file_dialog.cc:70
-msgid ""
-"%1 cannot find the %2 file\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"in any of these folders:\n"
-"\n"
-"<tt>%4</tt>\n"
-"\n"
-msgstr ""
-"%1 æ¾ä¸å°æä»¶ %2\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"å¨ä¸å任使件夹ä¸ï¼\n"
-"\n"
-"<tt>%4</tt>\n"
-"\n"
-
-#: missing_file_dialog.cc:104
-msgid "Click to choose an additional folder"
-msgstr "ç¹å»éæ©ä¸ä¸ªé¢å¤çæä»¶å¤¹"
-
-#: missing_plugin_dialog.cc:29
-msgid "Missing Plugins"
-msgstr "缺失æä»¶"
-
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
-msgid "OK"
-msgstr ""
-
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢ç¬å¥"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢éé³"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åæ¢å¯å½å¶"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸åå°å¢ç"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸å 大å¢ç"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "卿··é³å¨å·²éä¸çé³è½¨/æ»çº¿ä¸è®¾ç½®å¢ç为 0dB"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "å¤å¶å·²éä¸çå¤çå¨"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "åªåå·²éä¸çå¤çå¨"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "ç²è´´å·²éä¸çå¤çå¨"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "å é¤å·²éä¸çå¤çå¨"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "éæ©ææï¼å¯è§çï¼å¤çå¨"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "忢已éä¸çå¤çå¨"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "忢已éä¸çæä»¶"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "ä¸é䏿æç段åå¤çå¨"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "æ»å¨æ··é³å¨çªå£å°å·¦ä¾§"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "为混é³å¨å·²éä¸çé³è½¨/æ»çº¿æ¿æ´»åæ¢ MIDI è¾å
¥"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "ä» %1 è½½å
¥æ··é³å¨ç»å®"
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "å¨æç´¢è·¯å¾ %1 æ¾ä¸å°æ··é³å¨ç»å®"
-
-#: mixer_strip.cc:96 mixer_strip.cc:125
-msgid "pre"
-msgstr "é¢å
"
-
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
-msgid "Comments"
-msgstr "注é"
-
-#: mixer_strip.cc:149
-msgid "Click to toggle the width of this mixer strip."
-msgstr "ç¹å»åæ¢æ¤æ··é³å¨ç段ç宽度ã"
-
-#: mixer_strip.cc:151
-msgid ""
-"\n"
-"%1-%2-click to toggle the width of all strips."
-msgstr ""
-"\n"
-"%1-%2-ç¹å»åæ¢ææç段ç宽度ã"
-
-#: mixer_strip.cc:158
-msgid "Hide this mixer strip"
-msgstr "éèæ¤æ··é³å¨ç段"
-
-#: mixer_strip.cc:169
-msgid "Click to select metering point"
-msgstr "ç¹å»éæ©èæç¹"
-
-#: mixer_strip.cc:185
-msgid "Isolate Solo"
-msgstr "é离ç¬å¥"
-
-#: mixer_strip.cc:193
-msgid "Lock Solo Status"
-msgstr "éå®ç¬å¥ç¶æ"
-
-#: mixer_strip.cc:196 mixer_strip.cc:2027
-msgid "Iso"
-msgstr "é离"
-
-#: mixer_strip.cc:250
-msgid "Mix group"
-msgstr "æ··ååç»"
-
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
-msgid "Phase Invert"
-msgstr "ç¸ä½å转"
-
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
-msgid "Record & Monitor"
-msgstr "å½å¶åçæ§"
-
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
-msgid "Solo Iso / Lock"
-msgstr "ç¬å¥é离/éå®"
-
-#: mixer_strip.cc:524
-msgid "Enable/Disable MIDI input"
-msgstr "å¯ç¨/ç¦ç¨ MIDI è¾å
¥"
-
-#: mixer_strip.cc:688
-msgid "Aux"
-msgstr "è¾
å©"
-
-#: mixer_strip.cc:710
-msgid "Snd"
-msgstr "声é³"
-
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
-msgid "Not connected to audio engine - no I/O changes are possible"
-msgstr "æªè¿æ¥å°é³é¢å¼æââä¸å¯è½æ¹åè¾å
¥/è¾åº"
-
-#: mixer_strip.cc:833 mixer_strip.cc:935
-msgid "Add %1 port"
-msgstr "æ·»å %1 端å£"
-
-#: mixer_strip.cc:840 mixer_strip.cc:942
-msgid "Routing Grid"
-msgstr "è·¯ç±ç½æ ¼"
-
-#: mixer_strip.cc:1171
-msgid "<b>INPUT</b> to %1"
-msgstr "<b>è¾å
¥</b> å° %1"
-
-#: mixer_strip.cc:1174
-msgid "<b>OUTPUT</b> from %1"
-msgstr "<b>è¾åº</b> æ¥èª %1"
-
-#: mixer_strip.cc:1287
-msgid "Disconnected"
-msgstr "失å»è¿æ¥"
-
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*注é*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
-msgstr "注é"
-
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*注é*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "ç¹å»æ·»å /ç¼è¾æ³¨é"
-
-#: mixer_strip.cc:1473
-msgid "Grp"
-msgstr "åç»"
-
-#: mixer_strip.cc:1476
-msgid "~G"
-msgstr "~G"
-
-#: mixer_strip.cc:1505 route_time_axis.cc:561
-msgid "Color..."
-msgstr "é¢è²â¦"
-
-#: mixer_strip.cc:1507 route_time_axis.cc:563
-msgid "Comments..."
-msgstr "注éâ¦"
-
-#: mixer_strip.cc:1509 route_time_axis.cc:565
-msgid "Inputs..."
-msgstr "è¾å
¥â¦"
-
-#: mixer_strip.cc:1511 route_time_axis.cc:567
-msgid "Outputs..."
-msgstr "è¾åºâ¦"
-
-#: mixer_strip.cc:1516
-msgid "Save As Template..."
-msgstr "ä¿å为模æ¿..."
-
-#: mixer_strip.cc:1530
-msgid "Adjust Latency..."
-msgstr "è°æ´å»¶è¿..."
-
-#: mixer_strip.cc:1533
-msgid "Protect Against Denormals"
-msgstr "鲿¢å¼å¸¸è¿å"
-
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "è¿ç¨æ§å¶ IDâ¦"
-
-#: mixer_strip.cc:1823
-msgid "Pre"
-msgstr "é¢å
"
-
-#: mixer_strip.cc:1827
-msgid "Post"
-msgstr "åç½®"
-
-#: mixer_strip.cc:1847
-msgid "Pr"
-msgstr "é¢å
"
-
-#: mixer_strip.cc:1851
-msgid "Po"
-msgstr "åç½®"
-
-#: mixer_strip.cc:1860
-msgid "C"
-msgstr ""
-
-#: mixer_strip.cc:2008 route_ui.cc:168
-msgid "Disk"
-msgstr "硬ç"
-
-# AFL - Aside Fade Listen. è¡°ååçå¬
-#: mixer_strip.cc:2020 monitor_section.cc:70
-msgid "AFL"
-msgstr "å置淡åè¯å¬"
-
-# PFL Pre-Fader-Listenè¡°ååçå¬
-#: mixer_strip.cc:2023 monitor_section.cc:71
-msgid "PFL"
-msgstr "å置淡åè¯å¬"
-
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr ""
-
-#: mixer_strip.cc:2241
-msgid "Pre Fader"
-msgstr "å置淡å"
-
-#: mixer_strip.cc:2242
-msgid "Post Fader"
-msgstr "å置淡å"
-
-#: mixer_strip.cc:2286 meter_strip.cc:847
-msgid "Change all in Group to %1"
-msgstr "æ¹ååç»éææçå° %1"
-
-#: mixer_strip.cc:2288 meter_strip.cc:849
-msgid "Change all to %1"
-msgstr "æ¹åææçå° %1"
-
-#: mixer_strip.cc:2290 meter_strip.cc:851
-msgid "Change same track-type to %1"
-msgstr "æ¹åç¸å轨éç±»åçå° %1"
-
-#: mixer_ui.cc:130 route_time_axis.cc:818
-msgid "Group"
-msgstr "åç»"
-
-#: mixer_ui.cc:1224
-msgid "track display list item for renamed strip not found!"
-msgstr "æªæ¾å°é³è½¨æ¾ç¤ºå表çéå½åçæ®µæ¡ç®ï¼"
-
-#: mixer_ui.cc:1316
-msgid "-all-"
-msgstr "âææâ"
-
-#: mixer_ui.cc:1853
-msgid "Strips"
-msgstr "çæ®µ"
-
-#: meter_strip.cc:157
-msgid "Reset Peak"
-msgstr "é置峰å¼"
-
-#: meter_strip.cc:883
-msgid "Variable height"
-msgstr "åéé«åº¦"
-
-#: meter_strip.cc:884
-msgid "Short"
-msgstr "çå°ç"
-
-#: meter_strip.cc:885
-msgid "Tall"
-msgstr "é«å¤§ç"
-
-#: meter_strip.cc:886
-msgid "Grande"
-msgstr ""
-
-#: meter_strip.cc:887
-msgid "Venti"
-msgstr ""
-
-#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "å³°å¼"
-
-#: meter_patterns.cc:85
-msgid "RMS + Peak"
-msgstr "åæ¹æ ¹ + å³°å¼"
-
-#: meter_patterns.cc:88
-msgid "IEC1/DIN"
-msgstr ""
-
-#: meter_patterns.cc:91
-msgid "IEC1/Nordic"
-msgstr ""
-
-#: meter_patterns.cc:94
-msgid "IEC2/BBC"
-msgstr ""
-
-#: meter_patterns.cc:97
-msgid "IEC2/EBU"
-msgstr ""
-
-#: meter_patterns.cc:100
-msgid "K20"
-msgstr ""
-
-#: meter_patterns.cc:103
-msgid "K14"
-msgstr ""
-
-#: meter_patterns.cc:106
-msgid "K12"
-msgstr ""
-
-#: meter_patterns.cc:109
-msgid "VU"
-msgstr ""
-
-#: monitor_section.cc:69
-msgid "SiP"
-msgstr ""
-
-#: monitor_section.cc:96 route_group_dialog.cc:49
-msgid "Soloing"
-msgstr "ç¬å¥ä¸"
-
-#: monitor_section.cc:100
-msgid "Isolated"
-msgstr "å·²é离"
-
-#: monitor_section.cc:104
-msgid "Auditioning"
-msgstr "çå¬ä¸"
-
-#: monitor_section.cc:114
-msgid ""
-"When active, something is solo-isolated.\n"
-"Click to de-isolate everything"
-msgstr ""
-"å¯ç¨æ¶ï¼æäºè¢«ç¬å¥é离ã\n"
-"ç¹å»è§£é¤ææçé离"
-
-#: monitor_section.cc:117
-msgid ""
-"When active, auditioning is active.\n"
-"Click to stop the audition"
-msgstr ""
-"å¯ç¨æ¶ï¼ç嬿¿æ´»ã\n"
-"ç¹å»åæ¢çå¬."
-
-#: monitor_section.cc:134
-msgid "Solo controls affect solo-in-place"
-msgstr "ç¬å¥æ§å¶å½±åç¬å¥å
¥ä½"
-
-#: monitor_section.cc:140
-msgid "Solo controls toggle after-fader-listen"
-msgstr "ç¬å¥æ§å¶åæ¢å置淡åè¯å¬"
-
-#: monitor_section.cc:146
-msgid "Solo controls toggle pre-fader-listen"
-msgstr "ç¬å¥æ§å¶åæ¢å置淡åè¯å¬"
-
-#: monitor_section.cc:156
-msgid "Gain increase for soloed signals (0dB is normal)"
-msgstr "为ç¬å¥ä¿¡å·å 大å¢çï¼æ£å¸¸å¼ä¸º 0dBï¼"
-
-#: monitor_section.cc:170
-msgid "Solo Boost"
-msgstr "ç¬å¥æå"
-
-#: monitor_section.cc:185
-msgid ""
-"Gain reduction non-soloed signals\n"
-"A value above -inf dB causes \"solo-in-front\""
-msgstr ""
-"å¢çåå°éç¬å¥ä¿¡å·\n"
-"ä¸ä¸ªæ°å¼é«äº -inf dB å¼èµ·âç¬å¥å¨åâ"
-
-#: monitor_section.cc:196
-msgid "SiP Cut"
-msgstr "SiP åªå"
-
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
-msgstr "å½åå¼±çæ§è¾åºæ¶ï¼åå°å¢çç使ç¨"
-
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
-msgstr "åå¼±"
-
-#: monitor_section.cc:235
-msgid "Excl. Solo"
-msgstr "æç¬å¥æé¤å¨å¤"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "ä¸å±ç¬å¥æå³çå¨å䏿¶é´ä»
æä¸ä¸ªç¬å¥æ¯æ¿æ´»ç"
-
-#: monitor_section.cc:244
-msgid "Solo » Mute"
-msgstr "ç¬å¥ » éé³"
-
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
-msgstr ""
-"妿å¯ç¨ï¼ç¬å¥å°è¦çéé³\n"
-"ï¼ä¸ä¸ªç¬å¥ä¸éé³çé³è½¨ææ»çº¿å°æä¸ºå¯å¬è§ï¼"
-
-#: monitor_section.cc:323
-msgid "Monitor"
-msgstr "çæ§"
-
-#: monitor_section.cc:744
-msgid "Switch monitor to mono"
-msgstr "转æ¢çæ§å°å声é"
-
-#: monitor_section.cc:747
-msgid "Cut monitor"
-msgstr "åªåçæ§"
-
-#: monitor_section.cc:750
-msgid "Dim monitor"
-msgstr "åå¼±çæ§"
-
-#: monitor_section.cc:753
-msgid "Toggle exclusive solo mode"
-msgstr "忢ä¸å±çç¬å¥æ¨¡å¼"
-
-#: monitor_section.cc:759
-msgid "Toggle mute overrides solo mode"
-msgstr "忢éé³è¦çç¬å¥æ¨¡å¼"
-
-#: monitor_section.cc:771
-msgid "Cut monitor channel %1"
-msgstr "åªåçæ§å£°é %1"
-
-#: monitor_section.cc:776
-msgid "Dim monitor channel %1"
-msgstr "åå¼±çæ§å£°é %1"
-
-#: monitor_section.cc:781
-msgid "Solo monitor channel %1"
-msgstr "ç¬å¥çæ§å£°é %1"
-
-#: monitor_section.cc:786
-msgid "Invert monitor channel %1"
-msgstr "åè½¬çæ§å£°é %1"
-
-#: monitor_section.cc:796
-msgid "In-place solo"
-msgstr "å
¥ä½ç¬å¥"
-
-#: monitor_section.cc:798
-msgid "After Fade Listen (AFL) solo"
-msgstr "è¡°ååçå¬ï¼AFLï¼ç¬å¥"
-
-#: monitor_section.cc:800
-msgid "Pre Fade Listen (PFL) solo"
-msgstr "è¡°ååçå¬ï¼PFLï¼ç¬å¥"
-
-#: mono_panner.cc:109 stereo_panner.cc:119
-msgid "bypassed"
-msgstr "æ¯è·¯"
-
-#: mono_panner.cc:123
-#, c-format
-msgid "L:%3d R:%3d"
-msgstr "å·¦ï¼%3d å³ï¼%3d"
-
-#: mono_panner_editor.cc:33
-msgid "Mono Panner"
-msgstr "å声é颿¿"
-
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49 stereo_panner_editor.cc:46
-#: stereo_panner_editor.cc:51
-msgid "%"
-msgstr ""
-
-#: nag.cc:41
-msgid "Support %1 Development"
-msgstr "æ¯æ %1 çå¼å"
-
-#: nag.cc:42
-msgid "I'd like to make a one-time donation"
-msgstr "ææ¿æç»äºä¸æ¬¡æ§æå©"
-
-#: nag.cc:43
-msgid "Tell me more about becoming a subscriber"
-msgstr "请åç¥æå
³äºæä¸ºæå©è
çä¿¡æ¯"
-
-#: nag.cc:44
-msgid "I'm already a subscriber!"
-msgstr "æå·²ç»æ¯æå©è
äºï¼"
-
-#: nag.cc:45
-msgid "Ask about this the next time I export"
-msgstr "å¨ä¸æ¬¡æå¯¼åºæ¶è¯¢é®è¿äº"
-
-#: nag.cc:46
-msgid "Never ever ask me about this again"
-msgstr "åä¹ä¸è¦è¯¢é®æè¿äº"
-
-#: nag.cc:49
-msgid ""
-"Congratulations on your session export.\n"
-"\n"
-"It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
-"to bother you again about this - I'm working on improving our subscriber system\n"
-"so that I don't have to keep annoying you with this message.\n"
-"\n"
-"If you're not a subscriber, perhaps you might consider supporting my work\n"
-"on Ardour with either a one-time donation or subscription. Nothing will \n"
-"happen if you choose not to do so. However Ardour's continuing development\n"
-"relies on a stable, sustainable income stream. Thanks for using Ardour!"
-msgstr ""
-"æåï¼ä½ çä¼è¯å·²å¯¼åºã\n"
-"\n"
-"çèµ·æ¥æ¨å¯è½å·²ç»æ¯æå©è
ã 妿æ¯çè¯ï¼æè°¢æ¨ï¼\n"
-"æ±æä¸ºè¿äºè忬¡ææ°äºæ¨ââæä»¬æ£è´åäºæ¹åæä»¬çæå©ç³»ç»\n"
-"叿æä»¬å°±ä¸ä¼åå ä¸ºè¿æ¡ä¿¡æ¯èææ°æ¨ã\n"
-"\n"
-"妿æ¨ä¸æ¯æå©è
ï¼ä¹è®¸æ¨å¯ä»¥èèä¸ä¸æ¯ææä»¬å¨Ardourä¸çå·¥ä½\n"
-"æ¨å¯ä»¥ä¸æ¬¡æ§æèµ æè
宿æå©åå¯ã 妿æ¨ä¸æ³è¿æ ·åçè¯ä¹æ²¡äºã\n"
-"ä¸ç®¡ææ ·ï¼ Ardourçåç»å¼åéè¦ä¸ä¸ªç¨³å®ãæç»çèµéæ¥æºã\n"
-"æè°¢ä½¿ç¨Ardourï¼"
-
-#: nag.cc:58
-msgid ""
-"Congratulations on your session export.\n"
-"\n"
-"I hope you find Ardour a useful tool. I'd like to ask you to consider supporting\n"
-"its development with either a one-time donation or subscription. Nothing\n"
-"will happen if you choose not to do so. However Ardour's continuing development\n"
-"relies on a stable, sustainable income stream. Thanks for using Ardour!"
-msgstr ""
-"æåï¼ä½ çä¼è¯å·²å¯¼åºã\n"
-"\n"
-"æä»¬å¸ææ¨è§å¾Ardouræ¯ä¸ªæç¨çå·¥å
·ãææ³å»ºè®®æ¨èèä¸ä¸æ¯æå®çå¼åã\n"
-"ä¸è®ºæ¯ä¸æ¬¡æ§æèµ æè
æå©åå¯ã妿æ¨ä¸æ³è¿æ ·åçè¯ä¹æ²¡äºã\n"
-"ä¸ç®¡ææ ·ï¼ Ardouråç»çå¼åéè¦ä¸ä¸ªç¨³å®ãæç»çèµéæ¥æºã\n"
-"æè°¢ä½¿ç¨Ardourï¼"
-
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "æ°å»ºé¢è®¾"
-
-#: new_plugin_preset_dialog.cc:30
-msgid "Replace existing preset with this name"
-msgstr "ç¨è¿ä¸ªåç§°æ¿ä»£å·²åå¨çé¢è®¾"
-
-#: new_plugin_preset_dialog.cc:34
-msgid "Name of new preset"
-msgstr "æ°å»ºé¢è®¾çåç§°"
-
-#: normalize_dialog.cc:34
-msgid "Normalize regions"
-msgstr "è§èååºå"
-
-#: normalize_dialog.cc:34
-msgid "Normalize region"
-msgstr "è§èååºå"
-
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr ""
-
-#: normalize_dialog.cc:56
-msgid "Normalize each region using its own peak value"
-msgstr "ç¨æ¯ä¸ªåºåå®èªå·±ç峰弿°å¼è§èåæ¯ä¸ªåºå"
-
-#: normalize_dialog.cc:58
-msgid "Normalize each region using the peak value of all regions"
-msgstr "ç¨ææåºåç峰弿°å¼è§èåæ¯ä¸ªåºå"
-
-#: normalize_dialog.cc:73
-msgid "Normalize"
-msgstr "è§èå"
-
-#: note_select_dialog.cc:33
-msgid "Select Note"
-msgstr "éæ©é³ç¬¦"
-
-#: opts.cc:57
-msgid "Usage: "
-msgstr "ç¨æ³ï¼"
-
-#: opts.cc:58
-msgid " [SESSION_NAME] Name of session to load\n"
-msgstr " [SESSION_NAME] è¦è½½å
¥çä¼è¯çåç§°\n"
-
-#: opts.cc:59
-msgid " -v, --version Show version information\n"
-msgstr " -v, --version æ¾ç¤ºçæ¬ä¿¡æ¯\n"
-
-#: opts.cc:60
-msgid " -h, --help Print this message\n"
-msgstr " -h, --help æå°æ¬ä¿¡æ¯\n"
-
-#: opts.cc:61
-msgid " -a, --no-announcements Do not contact website for announcements\n"
-msgstr " -a, --no-announcements ä¸èç³»ç½ç«å
Œ\n"
-
-#: opts.cc:62
-msgid " -b, --bindings Print all possible keyboard binding names\n"
-msgstr " -b, --bindings æå°ææå¯è½çé®çç»å®åç§°\n"
-
-#: opts.cc:63
-msgid ""
-" -c, --name <name> Use a specific backend client name, default is "
-"ardour\n"
-msgstr " -c, --name <name> 使ç¨ä¸ä¸ªç¹å®çå端客æ·åç§°ï¼é»è®¤æ¯ardour\n"
-
-#: opts.cc:64
-msgid " -d, --disable-plugins Disable all plugins in an existing session\n"
-msgstr " -d, --disable-plugins å¨ä¸ä¸ªå·²åå¨çä¼è¯ä¸ç¦ç¨æææä»¶\n"
-
-#: opts.cc:65
-msgid ""
-" -D, --debug <options> Set debug flags. Use \"-D list\" to see available "
-"options\n"
-msgstr ""
-" -D, --debug <options> 设置è°è¯æ å¿. ä½¿ç¨ \"-D list\" æ¾ç¤ºå¯ç¨çé项\n"
-
-#: opts.cc:66
-msgid " -n, --no-splash Do not show splash screen\n"
-msgstr " -n, --no-splash 䏿¾ç¤ºéªå±\n"
-
-#: opts.cc:67
-msgid " -m, --menus file Use \"file\" to define menus\n"
-msgstr " -m, --menus file ä½¿ç¨ \"file\" ï¼æä»¶ï¼æ¥å®ä¹èå\n"
-
-#: opts.cc:68
-msgid " -N, --new session-name Create a new session from the command line\n"
-msgstr " -N, --new session-name ä»å½ä»¤è¡å建ä¸ä¸ªæ°çä¼è¯\n"
-
-#: opts.cc:69
-msgid " -O, --no-hw-optimizations Disable h/w specific optimizations\n"
-msgstr " -O, --no-hw-optimizations ç¦ç¨ h/w ç¹æ®çä¼å\n"
-
-#: opts.cc:70
-msgid " -P, --no-connect-ports Do not connect any ports at startup\n"
-msgstr " -P, --no-connect-ports å¨å¯å¨æ¶ä¸è¿æ¥ä»»ä½ç«¯å£ \n"
-
-#: opts.cc:71
-msgid " -S, --sync Draw the gui synchronously \n"
-msgstr " -S, --sync 忥ç»å¶ç¨æ·å¾å½¢çé¢ \n"
-
-#: opts.cc:73
-msgid " -V, --novst Do not use VST support\n"
-msgstr " -V, --novst ä¸ä½¿ç¨VSTæ¯æ\n"
-
-#: opts.cc:75
-msgid ""
-" -E, --save <file> Load the specified session, save it to <file> and "
-"then quit\n"
-msgstr ""
-" -E, --save <file> è½½å
¥æå®çä¼è¯ï¼ ä¿åå®å¨ <file æä»¶> ä¸å¹¶éåº\n"
-
-#: opts.cc:76
-msgid " -C, --curvetest filename Curve algorithm debugger\n"
-msgstr " -C, --curvetest filename æ²çº¿ç®æ³è°è¯å¨\n"
-
-#: opts.cc:77
-msgid ""
-" -k, --keybindings filename Name of key bindings to load (default is ~/.ardour3/"
-"ardour.bindings)\n"
-msgstr ""
-" -k, --keybindings æä»¶å è¦è½½å
¥çæé®ç»å®åç§°ï¼é»è®¤æ¯ ~/.ardour3/ardour."
-"bindingsï¼\n"
-
-#: panner2d.cc:854
-msgid "Panner (2D)"
-msgstr "颿¿ï¼2Dï¼"
-
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
-msgid "Bypass"
-msgstr "æ¯è·¯"
-
-#: panner2d.cc:862
-msgid "Panner"
-msgstr "颿¿"
-
-#: panner_ui.cc:72
-msgid "Pan automation mode"
-msgstr "çéèªå¨æ¨¡å¼"
-
-#: panner_ui.cc:73
-msgid "Pan automation type"
-msgstr "çéèªå¨ç±»å"
-
-#: playlist_selector.cc:43
-msgid "Playlists"
-msgstr "ææ¾å表"
-
-#: playlist_selector.cc:54
-msgid "Playlists grouped by track"
-msgstr "以é³è½¨å¯¹ææ¾å表åç»"
-
-#: playlist_selector.cc:101
-msgid "Playlist for %1"
-msgstr "%1 çææ¾å表"
-
-#: playlist_selector.cc:114
-msgid "Other tracks"
-msgstr "å
¶ä»é³è½¨"
-
-#: playlist_selector.cc:139
-msgid "unassigned"
-msgstr "æªæå®"
-
-#: playlist_selector.cc:194
-msgid "Imported"
-msgstr "已导å
¥"
-
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
-msgid "dB scale"
-msgstr "dB æ¯ä¾"
-
-#: plugin_eq_gui.cc:116
-msgid "Show phase"
-msgstr "æ¾ç¤ºç¸ä½"
-
-#: plugin_selector.cc:53 plugin_selector.cc:229
-msgid "Name contains"
-msgstr "åç§°å
å«"
-
-#: plugin_selector.cc:54 plugin_selector.cc:233
-msgid "Type contains"
-msgstr "ç±»åå
å«"
-
-#: plugin_selector.cc:55 plugin_selector.cc:231
-msgid "Category contains"
-msgstr "ç±»åå
å«"
-
-#: plugin_selector.cc:56 plugin_selector.cc:253
-msgid "Author contains"
-msgstr "ä½è
å
å«"
-
-#: plugin_selector.cc:57 plugin_selector.cc:255
-msgid "Library contains"
-msgstr "åºå
å«"
-
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
-msgid "Favorites only"
-msgstr "ä»
æ¶è"
-
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
-msgid "Hidden only"
-msgstr "ä»
éè"
-
-#: plugin_selector.cc:64
-msgid "Plugin Manager"
-msgstr "æä»¶ç®¡ç"
-
-#: plugin_selector.cc:85
-msgid "Fav"
-msgstr "æ¶è"
-
-#: plugin_selector.cc:87
-msgid "Available Plugins"
-msgstr "å¯ç¨æä»¶"
-
-#: plugin_selector.cc:88
-msgid "Type"
-msgstr "ç±»å"
-
-#: plugin_selector.cc:89
-msgid "Category"
-msgstr "ç±»å«"
-
-#: plugin_selector.cc:90
-msgid "Creator"
-msgstr "å建è
"
-
-#: plugin_selector.cc:91
-msgid "# Audio In"
-msgstr "# é³é¢è¾å
¥"
-
-#: plugin_selector.cc:92
-msgid "# Audio Out"
-msgstr "# é³é¢è¾åº"
-
-#: plugin_selector.cc:93
-msgid "# MIDI In"
-msgstr "# MIDIè¾å
¥"
-
-#: plugin_selector.cc:94
-msgid "# MIDI Out"
-msgstr "# MIDIè¾åº"
-
-#: plugin_selector.cc:116
-msgid "Plugins to be connected"
-msgstr "è¢«è¿æ¥çæä»¶"
-
-#: plugin_selector.cc:129
-msgid "Add a plugin to the effect list"
-msgstr "æ·»å ä¸ä¸ªæä»¶å°ææå表"
-
-#: plugin_selector.cc:133
-msgid "Remove a plugin from the effect list"
-msgstr "仿æå表ä¸ç§»é¤ä¸ä¸ªæä»¶"
-
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "æ´æ°å¯ç¨æä»¶"
-
-#: plugin_selector.cc:172
-msgid "Insert Plugin(s)"
-msgstr "æå
¥æä»¶"
-
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
-msgid "variable"
-msgstr "åé"
-
-#: plugin_selector.cc:496
-msgid ""
-"The plugin \"%1\" could not be loaded\n"
-"\n"
-"See the Log window for more details (maybe)"
-msgstr ""
-"æ æ³è½½å
¥æä»¶ \"%1\"\n"
-"\n"
-"æ´å¤çä¿¡æ¯ï¼ä¹è®¸å¯ä»¥ï¼åé
æ¥å¿çªå£"
-
-#: plugin_selector.cc:644
-msgid "Favorites"
-msgstr "æ¶è"
-
-#: plugin_selector.cc:646
-msgid "Plugin Manager..."
-msgstr "æä»¶ç®¡çå¨â¦"
-
-#: plugin_selector.cc:650
-msgid "By Creator"
-msgstr "æ ¹æ®å建è
"
-
-#: plugin_selector.cc:653
-msgid "By Category"
-msgstr "æ ¹æ®ç±»å«"
-
-#: plugin_ui.cc:113
-msgid "Eh? LADSPA plugins don't have editors!"
-msgstr "å¢ï¼LADSPAæä»¶æ²¡æç¼è¾å¨ï¼"
-
-#: plugin_ui.cc:122 plugin_ui.cc:227
-msgid ""
-"unknown type of editor-supplying plugin (note: no VST support in this version of "
-"%1)"
-msgstr "æªç¥çç¼è¾å¨åºç¨æä»¶ç±»åï¼æ³¨æï¼å¨è¿ä¸ª %1 çæ¬æ VST æ¯æï¼"
-
-#: plugin_ui.cc:125
-msgid "unknown type of editor-supplying plugin"
-msgstr "æªç¥çç¼è¾å¨åºç¨æä»¶ç±»å"
-
-#: plugin_ui.cc:257
-msgid ""
-"unknown type of editor-supplying plugin (note: no linuxVST support in this version "
-"of %1)"
-msgstr "æªç¥çç¼è¾å¨åºç¨æä»¶ç±»åï¼æ³¨æï¼å¨è¿ä¸ª %1 çæ¬æ linuxVST æ¯æï¼"
-
-#: plugin_ui.cc:329
-msgid "create_lv2_editor called on non-LV2 plugin"
-msgstr "å建_lv2_ç¼è¾å¨è°ç¨ non-LV2 æä»¶"
-
-#: plugin_ui.cc:418
-msgid "Add"
-msgstr "æ·»å "
-
-#: plugin_ui.cc:422
-msgid "Description"
-msgstr "说æ"
-
-#: plugin_ui.cc:423
-msgid "Plugin analysis"
-msgstr "æä»¶åæ"
-
-#: plugin_ui.cc:430
-msgid ""
-"Presets (if any) for this plugin\n"
-"(Both factory and user-created)"
-msgstr ""
-"é¢è®¾è¿ä¸ªæä»¶ï¼å¦ææçè¯ï¼\n"
-"ï¼å
æ¬åºå设置åç¨æ·å建ç设置ï¼"
-
-#: plugin_ui.cc:431
-msgid "Save a new preset"
-msgstr "ä¿åä¸ä¸ªæ°çé¢è®¾"
-
-#: plugin_ui.cc:432
-msgid "Save the current preset"
-msgstr "ä¿åå½åé¢è®¾"
-
-#: plugin_ui.cc:433
-msgid "Delete the current preset"
-msgstr "å é¤å½åé¢è®¾"
-
-#: plugin_ui.cc:434
-msgid "Disable signal processing by the plugin"
-msgstr "ææä»¶ç¦ç¨ä¿¡å·å¤ç"
-
-#: plugin_ui.cc:467 plugin_ui.cc:663
-msgid ""
-"Click to allow the plugin to receive keyboard events that %1 would normally use as "
-"a shortcut"
-msgstr "åå»å
è®¸æ¤æä»¶æ¥åé®çäºä»¶ï¼ä»¥ä¾¿ %1 å¯ä»¥æ£å¸¸å°ä½ä¸ºä¸ä¸ªå¿«æ·é®ä½¿ç¨"
-
-#: plugin_ui.cc:468
-msgid "Click to enable/disable this plugin"
-msgstr "åå»å¯ç¨/ç¦ç¨æ¤æä»¶"
-
-#: plugin_ui.cc:507
-msgid "latency (%1 sample)"
-msgid_plural "latency (%1 samples)"
-msgstr[0] "å»¶è¿ï¼%1 éæ ·ï¼"
-
-#: plugin_ui.cc:509
-msgid "latency (%1 ms)"
-msgstr "å»¶è¿ï¼%1 毫ç§ï¼"
-
-#: plugin_ui.cc:520
-msgid "Edit Latency"
-msgstr "ç¼è¾å»¶è¿"
-
-#: plugin_ui.cc:566
-msgid ""
-"Plugin presets are not supported in this build of %1. Consider paying for a full "
-"version"
-msgstr "æä»¶é¢è®¾å¨æ¬ä¸ª %1 æå»ºä¸ä¸æ¯æã请èèä¸ºå®æ´çæ¬ä»"
-
-#: plugin_ui.cc:574
-msgid ""
-"Plugin presets are not supported in this build, see the Log window for more "
-"information."
-msgstr "æä»¶é¢è®¾å¨æ¬æå»ºä¸ä¸æ¯æï¼æ´å¤ä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
-
-#: plugin_ui.cc:670
-msgid "Click to allow normal use of %1 keyboard shortcuts"
-msgstr "åå»å
许æ£å¸¸ä½¿ç¨ %1 é®çå¿«æ·é®"
-
-#: port_group.cc:337
-msgid "%1 Busses"
-msgstr "%1 æ»çº¿"
-
-#: port_group.cc:338
-msgid "%1 Tracks"
-msgstr "%1 é³è½¨"
-
-#: port_group.cc:339
-msgid "Hardware"
-msgstr "硬件"
-
-#: port_group.cc:340
-msgid "%1 Misc"
-msgstr "%1 æé¡¹"
-
-#: port_group.cc:341
-msgid "Other"
-msgstr "å
¶å®"
-
-#: port_group.cc:432 port_group.cc:433
-msgid "LTC Out"
-msgstr "LTC è¾åº"
-
-#: port_group.cc:436 port_group.cc:437
-msgid "LTC In"
-msgstr "LTC è¾å
¥"
-
-#: port_group.cc:463
-msgid "MTC in"
-msgstr "MTC è¾å
¥"
-
-#: port_group.cc:466
-msgid "MIDI control in"
-msgstr "MIDI æ§å¶è¾å
¥"
-
-#: port_group.cc:469
-msgid "MIDI clock in"
-msgstr "MIDI 计æ¶å¨è¾å
¥"
-
-#: port_group.cc:472
-msgid "MMC in"
-msgstr "MMC è¾å
¥"
-
-#: port_group.cc:476
-msgid "MTC out"
-msgstr "MTC è¾åº"
-
-#: port_group.cc:479
-msgid "MIDI control out"
-msgstr "MIDI æ§å¶è¾åº"
-
-#: port_group.cc:482
-msgid "MIDI clock out"
-msgstr "MIDI 计æ¶å¨è¾åº"
-
-#: port_group.cc:485
-msgid "MMC out"
-msgstr "MMC è¾åº"
-
-#: port_group.cc:532
-msgid ":monitor"
-msgstr "ï¼çæ§"
-
-#: port_group.cc:544
-msgid "system:"
-msgstr "ç³»ç»ï¼"
-
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr ""
-
-#: port_insert_ui.cc:39
-msgid "Measure Latency"
-msgstr "æµéå»¶è¿"
-
-#: port_insert_ui.cc:50
-msgid "Send/Output"
-msgstr "åé/è¾åº"
-
-#: port_insert_ui.cc:51
-msgid "Return/Input"
-msgstr "è¿å/è¾å
¥"
-
-#: port_insert_ui.cc:85
-msgid "No signal detected"
-msgstr "æªæ£æµå°ä¿¡å·"
-
-#: port_insert_ui.cc:165
-msgid "Port Insert "
-msgstr "ç«¯å£æå
¥"
-
-#: port_matrix.cc:331 port_matrix.cc:357
-msgid "<b>Sources</b>"
-msgstr "<b>æº</b>"
-
-#: port_matrix.cc:332 port_matrix.cc:358
-msgid "<b>Destinations</b>"
-msgstr "<b>ç®çå°</b>"
-
-#: port_matrix.cc:440 port_matrix.cc:448
-#, c-format
-msgid "Add %s %s"
-msgstr "æ·»å %s %s"
-
-#: port_matrix.cc:456
-#, c-format
-msgid "Rename '%s'..."
-msgstr "éå½å '%s'..."
-
-#: port_matrix.cc:472
-msgid "Remove all"
-msgstr "ç§»é¤ææ"
-
-#: port_matrix.cc:492 port_matrix.cc:504
-#, c-format
-msgid "%s all"
-msgstr "%s ææ"
-
-#: port_matrix.cc:527
-msgid "Rescan"
-msgstr "éæ°æ«æ"
-
-#: port_matrix.cc:529
-msgid "Show individual ports"
-msgstr "æ¾ç¤ºå个端å£"
-
-#: port_matrix.cc:535
-msgid "Flip"
-msgstr "轻弹"
-
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track or buss "
-"cannot support the new configuration."
-msgstr "ä¸å¯è½å¨æ¤æ·»å ä¸ä¸ªç«¯å£ï¼ä½ä¸ºå¨é³è½¨ææ»çº¿éç第ä¸ä¸ªå¤ç卿 æ³æ¯ææ°çé
ç½®ã"
-
-#: port_matrix.cc:725
-msgid "Cannot add port"
-msgstr "æ æ³æ·»å 端å£"
-
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "ä¸å
许移é¤ç«¯å£"
-
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"该端å£ä¸è½è¢«ç§»é¤ã\n"
-"ä¸è®ºæ¯æ°çè¾å
¥å·ç æè
æåä¸ä¸ªæä»¶ææ´å¤çè¾åºï¼\n"
-"å¨é³è½¨ææ»çº¿éç第ä¸ä¸ªæä»¶é½æ æ³æ¥åã"
-
-#: port_matrix.cc:965
-#, c-format
-msgid "Remove '%s'"
-msgstr "ç§»é¤ '%s'"
-
-#: port_matrix.cc:980
-#, c-format
-msgid "%s all from '%s'"
-msgstr "%s æææ¥èªäº '%s'"
-
-#: port_matrix.cc:1046 transform_dialog.cc:62
-msgid "channel"
-msgstr "声é"
-
-#: port_matrix_body.cc:82
-msgid "There are no ports to connect."
-msgstr "没æç«¯å£å¯è¿æ¥ã"
-
-#: port_matrix_body.cc:84
-msgid "There are no %1 ports to connect."
-msgstr "没æ %1 端å£å¯è¿æ¥."
-
-#: processor_box.cc:150
-msgid "Send"
-msgstr "åé"
-
-#: processor_box.cc:152
-msgid "Return"
-msgstr "è¿å"
-
-#: processor_box.cc:310
-msgid ""
-"\n"
-"This mono plugin has been replicated %1 times."
-msgstr ""
-"\n"
-"è¿ä¸ªå声éæä»¶å·²ç»è¢«å¤å¶äº %1 次ã"
-
-#: processor_box.cc:314
-msgid ""
-"<b>%1</b>\n"
-"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
-msgstr ""
-"<b>%1</b>\n"
-"å廿¾ç¤ºå¾å½¢ç¨æ·çé¢ã\n"
-"Alt+å廿¾ç¤ºéç¨å¾å½¢ç¨æ·çé¢ã%2"
-
-#: processor_box.cc:317
-msgid ""
-"<b>%1</b>\n"
-"Double-click to show generic GUI.%2"
-msgstr ""
-"<b>%1</b>\n"
-"å廿¾ç¤ºéç¨å¾å½¢ç¨æ·çé¢ã%2"
-
-#: processor_box.cc:361
-#, c-format
-msgid "(%1x1) "
-msgstr ""
-
-#: processor_box.cc:437
-msgid "Show All Controls"
-msgstr "æ¾ç¤ºæææ§å¶"
-
-#: processor_box.cc:441
-msgid "Hide All Controls"
-msgstr "éèæææ§å¶"
-
-#: processor_box.cc:475
-msgid "Link panner controls"
-msgstr "龿¥é¢æ¿æ§å¶"
-
-#: processor_box.cc:575
-msgid "on"
-msgstr "å¼å¯"
-
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
-msgid "off"
-msgstr "å
³é"
-
-#: processor_box.cc:957
-msgid ""
-"Right-click to add/remove/edit\n"
-"plugins,inserts,sends and more"
-msgstr ""
-"å³é®ç¹å»æ·»å /ç§»é¤/ç¼è¾\n"
-"æä»¶ãæå
¥ãåé以忴å¤"
-
-#: processor_box.cc:1429 processor_box.cc:1804
-msgid "Plugin Incompatibility"
-msgstr "æä»¶ä¸å
¼å®¹"
-
-#: processor_box.cc:1432
-msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
-msgstr "æ¨è¯å¾å¨ç©ºä½ %2 䏿·»å æä»¶ \"%1\" ã\n"
-
-#: processor_box.cc:1438
-msgid ""
-"\n"
-"This plugin has:\n"
-msgstr ""
-"\n"
-"æ¤æä»¶æï¼\n"
-
-#: processor_box.cc:1441
-msgid "\t%1 MIDI input\n"
-msgid_plural "\t%1 MIDI inputs\n"
-msgstr[0] "\t%1 MIDI è¾å
¥\n"
-
-#: processor_box.cc:1445
-msgid "\t%1 audio input\n"
-msgid_plural "\t%1 audio inputs\n"
-msgstr[0] "\t%1 é³é¢è¾åº\n"
-
-#: processor_box.cc:1448
-msgid ""
-"\n"
-"but at the insertion point, there are:\n"
-msgstr ""
-"\n"
-"ä½å¨æå
¥ç¹é£éæï¼\n"
-
-#: processor_box.cc:1451
-msgid "\t%1 MIDI channel\n"
-msgid_plural "\t%1 MIDI channels\n"
-msgstr[0] "\t%1 MIDI 声é\n"
-
-#: processor_box.cc:1455
-msgid "\t%1 audio channel\n"
-msgid_plural "\t%1 audio channels\n"
-msgstr[0] "\t%1 é³é¢å£°é\n"
-
-#: processor_box.cc:1458
-msgid ""
-"\n"
-"%1 is unable to insert this plugin here.\n"
-msgstr ""
-"\n"
-"%1 æ æ³å¨æ¤å¤å次æå
¥æä»¶.\n"
-
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "æ æ³å»ºç«æ°çåéï¼ %1"
-
-#: processor_box.cc:1807
-msgid ""
-"You cannot reorder these plugins/sends/inserts\n"
-"in that way because the inputs and\n"
-"outputs will not work correctly."
-msgstr ""
-"æ¨ä¸è½ä»¥è¿ç§æ¹å¼\n"
-"è¦æ±è¿äºæä»¶/åé/æå
¥\n"
-"å 为è¾å
¥åè¾åºå°æ æ³æ£ç¡®å·¥ä½ã"
-
-#: processor_box.cc:1991
-msgid "Rename Processor"
-msgstr "éå½åå¤çå¨"
-
-#: processor_box.cc:2022
-msgid "At least 100 IO objects exist with a name like %1 - name not changed"
-msgstr "è³å°æ100个è¾å
¥è¾åºå¯¹è±¡ç©ä½åå¨çå %1è¿æ ·çåç§°ââåç§°æ²¡ææ¹å"
-
-#: processor_box.cc:2159
-msgid "plugin insert constructor failed"
-msgstr "æä»¶æå
¥æé 彿°å¤±è´¥"
-
-#: processor_box.cc:2170
-msgid ""
-"Copying the set of processors on the clipboard failed,\n"
-"probably because the I/O configuration of the plugins\n"
-"could not match the configuration of this track."
-msgstr ""
-"å¤å¶åªè´´æ¿ä¸çå¤çå¨éæå¤±è´¥ï¼\n"
-"å¯è½æ¯å 为æä»¶çè¾å
¥/è¾åºé
ç½®\n"
-"æ æ³å¹é
è¿æ¡é³è½¨çé
ç½®ã"
-
-#: processor_box.cc:2216
-msgid ""
-"Do you really want to remove all processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçå¤çå¨ï¼\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-
-#: processor_box.cc:2220 processor_box.cc:2245
-msgid "Yes, remove them all"
-msgstr "æ¯çï¼å
¨é¨ç§»é¤å®ä»¬"
-
-#: processor_box.cc:2222 processor_box.cc:2247
-msgid "Remove processors"
-msgstr "ç§»é¤å¤çå¨"
-
-#: processor_box.cc:2237
-msgid ""
-"Do you really want to remove all pre-fader processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçå置淡åå¤çå¨ï¼\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-
-#: processor_box.cc:2240
-msgid ""
-"Do you really want to remove all post-fader processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"æ¨æ¯å¦ççè¦ä» %1 ç§»é¤ææçå置淡åå¤çå¨ï¼\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼"
-
-#: processor_box.cc:2428
-msgid "New Plugin"
-msgstr "æ°å»ºæä»¶"
-
-#: processor_box.cc:2431
-msgid "New Insert"
-msgstr "æ°å»ºæå
¥"
-
-#: processor_box.cc:2434
-msgid "New External Send ..."
-msgstr "æ°å»ºå¤é¨åéâ¦"
-
-#: processor_box.cc:2438
-msgid "New Aux Send ..."
-msgstr "æ°å»ºè¾
å©åé"
-
-#: processor_box.cc:2441
-msgid "Send Options"
-msgstr "åéé项"
-
-#: processor_box.cc:2443
-msgid "Clear (all)"
-msgstr "æ¸
é¤ï¼ææï¼"
-
-#: processor_box.cc:2445
-msgid "Clear (pre-fader)"
-msgstr "æ¸
é¤ï¼å置淡åï¼"
-
-#: processor_box.cc:2447
-msgid "Clear (post-fader)"
-msgstr "æ¸
é¤ï¼å置淡åï¼"
-
-#: processor_box.cc:2473
-msgid "Activate All"
-msgstr "æ¿æ´»ææ"
-
-#: processor_box.cc:2475
-msgid "Deactivate All"
-msgstr "䏿¿æ´»ææ"
-
-#: processor_box.cc:2477
-msgid "A/B Plugins"
-msgstr "A/B æä»¶"
-
-#: processor_box.cc:2486
-msgid "Edit with generic controls..."
-msgstr "以éç¨æ§å¶ç¼è¾â¦"
-
-#: processor_box.cc:2789
-msgid "%1: %2 (by %3)"
-msgstr "%1: %2ï¼éè¿ %3ï¼"
-
-#: processor_box.cc:2791
-msgid "%1 (by %2)"
-msgstr "%1ï¼éè¿ %2ï¼"
-
-#: patch_change_dialog.cc:50
-msgid "Patch Change"
-msgstr "é³è²åæ¢"
-
-#: patch_change_dialog.cc:76
-msgid "Patch Bank"
-msgstr "é³è²åº"
-
-#: patch_change_dialog.cc:83
-msgid "Patch"
-msgstr "é³è²"
-
-#: patch_change_dialog.cc:98 step_entry.cc:430
-msgid "Program"
-msgstr "ç¨åº"
-
-#: patch_change_dialog.cc:106 step_entry.cc:422
-msgid "Bank"
-msgstr "åº"
-
-#: quantize_dialog.cc:36
-msgid "main grid"
-msgstr "主è¦ç½æ ¼"
-
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
-msgid "Quantize"
-msgstr "æ°å转æ¢"
-
-#: quantize_dialog.cc:56
-msgid "Strength"
-msgstr "强度"
-
-#: quantize_dialog.cc:59
-msgid "Swing"
-msgstr "æå¨"
-
-#: quantize_dialog.cc:62
-msgid "Threshold (ticks)"
-msgstr "临çå¼ï¼è¯å«å£°ï¼"
-
-#: quantize_dialog.cc:63
-msgid "Snap note start"
-msgstr "对é½é³ç¬¦èµ·ç¹"
-
-#: quantize_dialog.cc:64
-msgid "Snap note end"
-msgstr "对é½é³ç¬¦ç»ç¹"
-
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "åå»é³é¢æä»¶ï¼"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
-msgstr "æµè§â¦"
-
-#: rc_option_editor.cc:84
-msgid "Click emphasis audio file:"
-msgstr "ç¹å»å éé³é¢æä»¶ï¼"
-
-#: rc_option_editor.cc:116
-msgid "Choose Click"
-msgstr "éæ©ç¹å»"
-
-#: rc_option_editor.cc:139
-msgid "Choose Click Emphasis"
-msgstr "éæ©ç¹å»å é"
-
-#: rc_option_editor.cc:170
-msgid "Limit undo history to"
-msgstr "éå¶æ¤éåå²å°"
-
-#: rc_option_editor.cc:171
-msgid "Save undo history of"
-msgstr "ä¿åæ¤éåå²"
-
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
-msgid "commands"
-msgstr "å½ä»¤"
-
-#: rc_option_editor.cc:325
-msgid "Edit using:"
-msgstr "ç¼è¾ä½¿ç¨ï¼"
-
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
-msgid "+ button"
-msgstr "+æé®"
-
-#: rc_option_editor.cc:351
-msgid "Delete using:"
-msgstr "å é¤ä½¿ç¨ï¼"
-
-#: rc_option_editor.cc:378
-msgid "Insert note using:"
-msgstr "æå
¥é³ç¬¦ä½¿ç¨ï¼"
-
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
-msgstr "忽ç¥é³ç¬¦ä½¿ç¨ï¼"
-
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "é®çå¸å±ï¼"
-
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "åä½ç¼©æ¾ï¼"
-
-#: rc_option_editor.cc:547
-msgid "Default"
-msgstr "é»è®¤"
-
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
-msgstr "éè¦çåä½ç¼©æ¾ååè¦æ±åºç¨ç¨åºéæ°å¯å¨ä»¥ä¾¿äºéæ°å¸å±ã"
-
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
-msgstr "æ³¢å½¢æªæ³¢çµå¹³ï¼dBFSï¼ï¼"
-
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "åæ¾ï¼ç¼å²çç§æ°ï¼ï¼"
-
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "å½å¶ï¼ç¼å²çç§æ°ï¼ï¼"
-
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
-msgstr "æ§å¶é¢åè®®"
-
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "åå»å称以便ç¼è¾å·²å¯ç¨åè®®ç设置"
-
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
-msgstr "导åºåæ¾ç¤ºè§é¢å¯¼åºä¿¡æ¯"
-
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
-msgstr "æ¾ç¤ºè§é¢æå¡å¯å¨å¯¹è¯æ¡"
-
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
-msgstr "é«çº§è®¾ç½®ï¼è¿ç¨è§é¢æå¡ï¼"
-
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. - Do "
-"not enable this option unless you know what you are doing."
-msgstr ""
-"<b>å¯ç¨æ¶</b> æ¨å¯ä»¥æå®ä¸ä¸ªå®å¶çè§é¢æå¡å¨ç½ååææ¡£æ ¹ãââä¸è¦å¯ç¨è¯¥é项ï¼é¤éæ¨"
-"ç¥éæ¨æ£å¨åä»ä¹ã"
-
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
-msgstr "è§é¢æå¡å¨ç½åï¼"
-
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the "
-"video-server is running locally"
-msgstr ""
-"åºäºç½åçè§é¢æå¡å
æ¬ http åç¼ãå½è§é¢æå¡å¨æ¯è¿è¡å¨æ¬å°æ¶ï¼è¿ç½åéå¸¸æ¯ âhttp://"
-"hostname.example.org:1554/â 以åé»è®¤æ¯ âhttp://localhost:1554/â ã"
-
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
-msgstr "è§é¢æä»¶å¤¹ï¼"
-
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this directory will "
-"be accessible by the video-server. If the server run on a remote host, it should "
-"point to a network mounted folder of the server's docroot or be left empty if it "
-"is unvailable. It is used for the local video-monitor and file-browsing when "
-"opening/adding a video file."
-msgstr ""
-"è§é¢æå¡å¨ææ¡£æ ¹çæ¬å°è·¯å¾ãè§é¢æå¡å¨ä»
访é®è¿ä¸ªç®å½ä¸çæä»¶ã妿æå¡å¨è¿è¡å¨è¿ç¨"
-"主æºä¸ï¼å®å°æåæå¡å¨ææ¡£æ ¹çä¸ä¸ªç½ç»æè½½æä»¶å¤¹ï¼æè
妿å®ä¸å¯ç¨å°±çç空ç½ãè¿æ¯"
-"ç¨äºå¨æå¼/æ·»å ä¸ä¸ªè§é¢æä»¶æ¶çæ¬å°è§é¢çæ§ä»¥åæä»¶æµè§ã"
-
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before the "
-"video-export dialog."
-msgstr "<b>å¯ç¨æ¶</b> å¨è§é¢è¾åºå¯¹è¯æ¡åæ¾ç¤ºä¸ä¸ªç»èä¿¡æ¯çªå£ã"
-
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
-msgstr "<b>å¯ç¨æ¶</b> è§é¢æå¡å¨å¨æ²¡æå¾å°ç¡®è®¤åä¸ä¼èªå¨å¯å¨ã"
-
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr "æ»æ¯æ¾ç¤ºæä»¶æ«æç¨åº"
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr "å¨åºç¨èµ·ç¹æ«æ [æ°] VST æä»¶"
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr "å¨åºç¨èµ·ç¹æ«æé³é¢å使件"
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "éç¨"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "æ«ææä»¶"
-
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed for "
-"indexing (cache load) and discovery (detect new plugins)"
-msgstr ""
-"<b>å¯ç¨æ¶</b> ä¸ä¸ªå¼¹åºçªå£æ¾ç¤ºæä»¶æ«æç¨åºï¼ä»¥å±ç¤ºç´¢å¼ï¼ç¼åè½½å
¥ï¼ååç°ï¼æ¢æµæ°æ"
-"ä»¶ï¼ã"
-
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. Plugins that "
-"require more time to load will be blacklisted. A value of 0 disables the timeout."
-msgstr ""
-"æä»¶å®ä¾åæå®çé»è®¤è¶
æ¶å¨ 1/10 以å
ãéè¦æ´å¤æ¶é´è½½å
¥çæä»¶å°è¢«åå
¥é»ååãæ°å¼ä¸º "
-"0 åç¦ç¨è¶
æ¶ã"
-
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr "æ«æè¶
æ¶ [ååä¹ä¸ç§]"
-
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr ""
-
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "æ¸
é¤ VST ç¼å"
-
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "æ¸
é¤ VST é»åå"
-
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the cache "
-"index on application start. When disabled new plugins will only be available after "
-"triggering a 'Scan' manually"
-msgstr ""
-"<b>å¯ç¨æ¶</b> æ°ç VST æä»¶è¢«æç´¢ãæµè¯ä»¥åæ·»å å°åºç¨èµ·ç¹çç¼åç´¢å¼ä¸ãå½ç¦ç¨æ°æä»¶"
-"æ¶ï¼ä»
卿å¨è§¦åâæ«æâæ¶å¯ç¨ã"
-
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr "Linux VST è·¯å¾ï¼"
-
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr "Windows VST è·¯å¾ï¼"
-
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "é³é¢åä½"
-
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. When "
-"disabled AU plugins will only be available after triggering a 'Scan' manually. The "
-"first successful scan will enable AU auto-scan, Any crash during plugin discovery "
-"will disable it."
-msgstr ""
-"<b>å¯ç¨æ¶</b> é³é¢åä½æä»¶è¢«åºç¨èµ·ç¹åç°ãå½ç¦ç¨é³é¢å使件æ¶ï¼ä»
卿å¨è§¦åâæ«"
-"æâæ¶å¯ç¨ãç¬¬ä¸æ¬¡æåçæ«æå°å¯ç¨é³é¢åä½èªå¨æ«æï¼è¥æä»¶åç°ä»»ä½å´©æºçæ
åµé½å°ç¦ç¨"
-"èªå¨æ«æã"
-
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "æ¸
é¤é³é¢åä½ç¼å"
-
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "æ¸
é¤é³é¢åä½é»åå"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
-msgstr "设置 Windows VST æç´¢è·¯å¾"
-
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
-msgstr "设置 Linux VST æç´¢è·¯å¾"
-
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
-msgstr "%1 é¦é项"
-
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
-msgstr "DSP ç CPU å©ç¨ç"
-
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
-msgstr "ä¿¡å·å¤ç使ç¨"
-
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
-msgstr "é¤äºä¸ä¸ªå¤çå¨å¤ææç"
-
-#: rc_option_editor.cc:1319
-msgid "all available processors"
-msgstr "ææå¯ç¨çå¤çå¨"
-
-#: rc_option_editor.cc:1322
-msgid "%1 processors"
-msgstr "ï¼
1 å¤çå¨"
-
-#: rc_option_editor.cc:1325
-msgid "This setting will only take effect when %1 is restarted."
-msgstr "该设置å°ä»
ä»
å¨ %1 éæ°å¯å¨æ¶èµ·ä½ç¨"
-
-#: rc_option_editor.cc:1330
-msgid "Options|Undo"
-msgstr "é项|æ¤é"
-
-#: rc_option_editor.cc:1337
-msgid "Verify removal of last capture"
-msgstr "ç¡®è®¤ç§»é¤æåçæè·é¨å"
-
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "宿å¤ä»½ä¼è¯æä»¶"
-
-#: rc_option_editor.cc:1350
-msgid "Session Management"
-msgstr "ä¼è¯ç®¡ç"
-
-#: rc_option_editor.cc:1355
-msgid "Always copy imported files"
-msgstr "æ»æ¯å¤å¶å¯¼å
¥çæä»¶"
-
-#: rc_option_editor.cc:1362
-msgid "Default folder for new sessions:"
-msgstr "æ°ä¼è¯çé»è®¤æä»¶å¤¹ï¼"
-
-#: rc_option_editor.cc:1370
-msgid "Maximum number of recent sessions"
-msgstr "å½åä¼è¯çæå¤§æ°é"
-
-#: rc_option_editor.cc:1383
-msgid "Click gain level"
-msgstr "ç¹å»å¢ççµå¹³"
-
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
-msgid "Automation"
-msgstr "èªå¨å"
-
-#: rc_option_editor.cc:1393
-msgid "Thinning factor (larger value => less data)"
-msgstr " ç¨éåæ°ï¼è¾å¤§çæ°å¼ => è¾å°çæ°æ®ï¼"
-
-#: rc_option_editor.cc:1402
-msgid "Automation sampling interval (milliseconds)"
-msgstr "èªå¨åæ ·æ¬é´éï¼æ¯«ç§ï¼"
-
-#: rc_option_editor.cc:1414
-msgid "Keep record-enable engaged on stop"
-msgstr "忢æ¶ï¼ä¿æå¯ç¨çå½å¶ä»å¨å¯ç¨ä¸"
-
-#: rc_option_editor.cc:1423
-msgid "Play loop is a transport mode"
-msgstr "ææ¾å¾ªç¯æ¯ä¸ä¸ªæé模å¼"
-
-#: rc_option_editor.cc:1428
-msgid ""
-"<b>When enabled</b> the loop button does not start playback but forces playback to "
-"always play the loop\n"
-"\n"
-"<b>When disabled</b> the loop button starts playing the loop, but stop then "
-"cancels loop playback"
-msgstr ""
-"<b>å¯ç¨æ¶</b> å¾ªç¯æé®ä¸å¯å¨åæ¾ï¼ä½å¼ºå¶åæ¾æ»æ¯ææ¾å¾ªç¯\n"
-"\n"
-"<b>ç¦ç¨æ¶</b> å¾ªç¯æé®å¯å¨ææ¾å¾ªç¯ï¼ä½åæ¢ä¹åæ¶å¾ªç¯åæ¾"
-
-#: rc_option_editor.cc:1434
-msgid "Stop recording when an xrun occurs"
-msgstr "å¨xè¿è¡åºç°æ¶åæ¢å½å¶"
-
-#: rc_option_editor.cc:1439
-msgid ""
-"<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by "
-"the audio engine"
-msgstr "<b>å¯ç¨æ¶</b> 妿é³é¢å¼ææ£æµå°ä¸ä¸ªè¶
è½½æè
æ¬ è½½è¿è¡ %1 å°åæ¢å½å¶"
-
-#: rc_option_editor.cc:1445
-msgid "Create markers where xruns occur"
-msgstr "å¨xè¿è¡åºç°æ¶å建æ è®°"
-
-#: rc_option_editor.cc:1454
-msgid "Stop at the end of the session"
-msgstr "å¨ä¼è¯ç»ç¹åæ¢"
-
-#: rc_option_editor.cc:1459
-msgid ""
-"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the transport when "
-"it reaches the current session end marker\n"
-"\n"
-"<b>When disabled</b> %1 will continue to roll past the session end marker at all "
-"times"
-msgstr ""
-"<b>å¯ç¨æ¶</b> 妿 %1 æ¯ <b>éå½å¶ä¸</b>ï¼å½å®è¾¾å°å½åä¼è¯çç»ç¹æ è®°æ¶å®å°åæ¢æ"
-"é\n"
-"\n"
-"<b>ç¦ç¨æ¶</b> %1 å°ç»§ç»ä¸ç´æ»å¨è¿è¡å°ä¼è¯ç»ç¹æ è®°"
-
-#: rc_option_editor.cc:1467
-msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
-msgstr "åæ ç¼å¾ªç¯ï¼å½ä»å±äº MTCï¼LTC è¯¸å¦æ¤ç±»æ¶ä¸å¯è½å®ç°ï¼"
-
-#: rc_option_editor.cc:1472
-msgid ""
-"<b>When enabled</b> this will loop by reading ahead and wrapping around at the "
-"loop point, preventing any need to do a transport locate at the end of the loop\n"
-"\n"
-"<b>When disabled</b> looping is done by locating back to the start of the loop "
-"when %1 reaches the end which will often cause a small click or delay"
-msgstr ""
-"<b>å¯ç¨æ¶</b>è¿å°éè¿é¢å
è¯»åæ¥å¾ªç¯å¹¶ä¸å¨å¾ªç¯ç¹å´ç»ï¼é²æ¢ä»»ä½éè¦ææéå®ä½å¨å¾ªç¯ç"
-"ç»ç¹çæ
åµ\n"
-"\n"
-"<b>ç¦ç¨æ¶</b> å½ %1 å°è¾¾ä¼ç»å¸¸å¼èµ·ä¸ä¸ªè½»å¾®è¯å«å£°æå»¶è¿çç»ç¹æ¶ï¼éè¿å®ä½åå°å¾ªç¯ç"
-"èµ·ç¹èå®æå¾ªç¯"
-
-#: rc_option_editor.cc:1480
-msgid "Disable per-track record disarm while rolling"
-msgstr "彿»å¨æ¶ç¦ç¨é¢å
é³è½¨å½å¶è§£é¤"
-
-#: rc_option_editor.cc:1484
-msgid ""
-"<b>When enabled</b> this will prevent you from accidentally stopping specific "
-"tracks recording during a take"
-msgstr "<b>å¯ç¨æ¶</b> è¿å°é²æ¢æ¨å¨è¿è¿ç¨ä¸æå¤åæ¢æå®çé³è½¨å½å¶"
-
-#: rc_option_editor.cc:1489
-msgid "12dB gain reduction during fast-forward and fast-rewind"
-msgstr "å¿«è¿ååå¸¦æ¶æ 12dB çå¢çåå°"
-
-#: rc_option_editor.cc:1493
-msgid ""
-"This will reduce the unpleasant increase in perceived volume that occurs when fast-"
-"forwarding or rewinding through some kinds of audio"
-msgstr "å½å¿«è¿æå带éè¿æäºé³é¢ç±»åæ¶ï¼è¿å°åå°ä»¤äººæå°ä¸éç坿ç¥é³éå¢å çç°å"
-
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "忥/ä»å±"
-
-#: rc_option_editor.cc:1501
-msgid "External timecode source"
-msgstr "å¤é¨æ¶é´ç æº"
-
-#: rc_option_editor.cc:1510
-msgid "Match session video frame rate to external timecode"
-msgstr "å¹é
ä¼è¯è§é¢å¸§çå°å¤é¨æ¶é´ç "
-
-#: rc_option_editor.cc:1516
-msgid ""
-"This option controls the value of the video frame rate <i>while chasing</i> an "
-"external timecode source.\n"
-"\n"
-"<b>When enabled</b> the session video frame rate will be changed to match that of "
-"the selected external timecode source.\n"
-"\n"
-"<b>When disabled</b> the session video frame rate will not be changed to match "
-"that of the selected external timecode source.Instead the frame rate indication in "
-"the main clock will flash red and %1 will convert between the external timecode "
-"standard and the session standard."
-msgstr ""
-"è¿ä¸ªé项æ§å¶è§é¢å¸§ççæ°å¼<i>å½è¿½é</i>ä¸ä¸ªå¤é¨æ¶é´ç æºæ¶\n"
-"\n"
-"<b>å¯ç¨æ¶</b> ä¼è¯è§é¢å¸§çå°è¢«æ¹å为å¹é
å°å·²éä¸çå¤é¨æ¶é´ç æºã\n"
-"\n"
-"<b>ç¦ç¨æ¶</b> ä¼è¯è§é¢å¸§çå°ä¸ä¼è¢«æ¹å为å¹é
å°å·²éä¸çå¤é¨æ¶é´ç æºãåè代ä¹çæ¯ï¼"
-"帧çå¨ä¸»è®¡æ¶å¨éçæç¤ºå°å¨è½¬æ¢å¤é¨æ¶é´ä»£ç æ ååä¼è¯æ å两è
é´è½¬æ¢ã"
-
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
-msgstr "忥æ¶é´ä»£ç å°è®¡æ¶å¨ââç¦ç¨æ¼ç§»è¡¥å¿ã"
-
-#: rc_option_editor.cc:1532
-msgid ""
-"<b>When enabled</b> %1 will never varispeed when slaved to external timecode. Sync "
-"Lock indicates that the selected external timecode source shares clock-sync (Black "
-"& Burst, Wordclock, etc) with the audio interface. This option disables drift "
-"compensation. The transport speed is fixed at 1.0.Varispeed LTC will be ignored "
-"and cause drift.\n"
-"\n"
-"<b>When disabled</b> %1 will compensate for potential drift, regardless if the "
-"timecode sources shares clock sync."
-msgstr ""
-"<b>å¯ç¨æ¶</b> å¨ä»å±äºå¤é¨æ¶é´ç æ¶ %1 å°ä¸ä¼åéã忥éå®è¡¨æå·²éä¸çå¤é¨æ¶é´ç æº"
-"ä¸é³é¢çé¢å
±äº«è®¡æ¶å¨åæ¥ï¼ Black & Burstï¼ Wordclockï¼ççï¼ãè¿ä¸ªé项ç¦ç¨æ¼ç§»"
-"è¡¥å¿ãæéé度被修æ£äº 1.0.Varispeed LTC å°è¢«å¿½ç¥ä¸å¼èµ·æ¼ç§»ã\n"
-"\n"
-"<b>ç¦ç¨æ¶</b> %1 å°è¡¥å¿æ½å¨çæ¼ç§»ï¼ä¸è®ºæ¶é´ç æºæ¯å¦å
±äº«æ¶é´åæ¥ã"
-
-#: rc_option_editor.cc:1547
-msgid "Lock to 29.9700 fps instead of 30000/1001"
-msgstr "éå®å° 29.9700 fps 以æ¿ä»£ 30000/1001"
-
-#: rc_option_editor.cc:1553
-msgid ""
-"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
-"instead of 30000/1001.\n"
-"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions that "
-"drop-frame timecode has an accumulated error of -86ms over a 24-hour period.\n"
-"Drop-frame timecode would compensate exactly for a NTSC color frame rate of 30 * "
-"0.9990 (ie 29.970000). That is not the actual rate. However, some vendors use that "
-"rate - despite it being against the specs - because the variant of using exactly "
-"29.97 fps has zero timecode drift.\n"
-msgstr ""
-"<b>å¯ç¨æ¶</b> å¤é¨æ¶é´ç æºè¢«åå®ä½¿ç¨ 29.97 fps 以æ¿ä»£ 30000/1001 ã\n"
-"SMPTE 12M-1999 æå® 29.97df 为 30000/1001 ãè¿ä¸æ¥çè§èæå°ä¸¢å¸§æ¶é´ç æä¸ä¸ªå¨ 24 "
-"å°æ¶å
-86ms ç累积é误ã\n"
-"丢帧æ¶é´ç å°å®å
¨è¡¥å¿ 30 * 0.9990 ï¼ie 29.970000ï¼ç NTSC è²å½©å¸§çãé£ä¸æ¯å®é
帧çã"
-"ç¶èï¼æäºåå使ç¨è¿å¸§çââ尽管å®è¿èè§èââå 为使ç¨å®é
29.97 fps çæ¶é´ç æ¼ç§»åå"
-"为 0 ã\n"
-
-#: rc_option_editor.cc:1563
-msgid "LTC Reader"
-msgstr "LTC é
读å¨"
-
-#: rc_option_editor.cc:1567
-msgid "LTC incoming port"
-msgstr "LTC 导å
¥ç«¯å£"
-
-#: rc_option_editor.cc:1582
-msgid "LTC Generator"
-msgstr "LTC çæå¨"
-
-#: rc_option_editor.cc:1587
-msgid "Enable LTC generator"
-msgstr "å¯ç¨ LTC çæå¨"
-
-#: rc_option_editor.cc:1594
-msgid "Send LTC while stopped"
-msgstr "忢æ¶åé LTC "
-
-#: rc_option_editor.cc:1600
-msgid ""
-"<b>When enabled</b> %1 will continue to send LTC information even when the "
-"transport (playhead) is not moving"
-msgstr "<b>å¯ç¨æ¶</b> %1 å°ç»§ç»åé LTC ä¿¡æ¯ï¼å³ä½¿å½æéï¼æéï¼ä¸åç§»å¨"
-
-#: rc_option_editor.cc:1606
-msgid "LTC generator level"
-msgstr "LTC çæå¨çµå¹³"
-
-#: rc_option_editor.cc:1610
-msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value is 0dBu "
-"^= -18dbFS in an EBU calibrated system"
-msgstr ""
-"以 dbFS æå®çæ LTC ä¿¡å·é³éçå³°å¼ãå»ºè®®çæ°å¼æ¯ 0dBu ^= -18dbFS å¨ä¸ä¸ª EBU æ ¡åç³»"
-"ç»é"
-
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr "å
è®¸ææ½æé"
-
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "å½é³é¢åºåç§»å¨æ¶ï¼ä¹ç§»å¨ç¸å
³çèªå¨å"
-
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "å¨ç¼è¾å¨çé³è½¨ä¸æ¾ç¤ºèæ"
-
-#: rc_option_editor.cc:1646
-msgid "Display master-meter in the toolbar"
-msgstr "å¨å·¥å
·æ éæ¾ç¤ºä¸»æ§èæ"
-
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
-msgstr "é»è®¤æ·¡åå½¢ç¶"
-
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
-msgstr "åºåä½äºæ¿æ´»ç¼è¾çåç»éä¼è¢«å½¼æ¤ç¼è¾"
-
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
-msgstr "ä¸è®ºä½æ¶é½åæ¶éå å®ä»¬"
-
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
-msgstr "ä»
å¨å½å®ä»¬æ¥æå®å
¨ç¸åçé¿åº¦ãä½ç½®ååç¹æ¶"
-
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "使橡ç®å¸¦å·²éæ©é¨åç©å½¢å¸éå°ç½æ ¼å¯¹é½"
-
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "å¨åºåå
æ¾ç¤ºæ³¢å½¢"
-
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
-msgstr "å¨é³é¢åºåå
æ¾ç¤ºå¢çå°è£
"
-
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "å¨æææ¨¡å¼å
"
-
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "ä»
å¨åºåå¢ç模å¼å
"
-
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
-msgstr "波形æ¯ä¾"
-
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "线æ§"
-
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "对æ°"
-
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
-msgstr "波形形ç¶"
-
-#: rc_option_editor.cc:1726
-msgid "traditional"
-msgstr "ä¼ ç»ç"
-
-#: rc_option_editor.cc:1727
-msgid "rectified"
-msgstr "å·²ç«æ£ç"
-
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "å¨é³é¢è¢«å½å¶æ¶æ¾ç¤ºå®ç波形"
-
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "æ¾ç¤ºç¼©æ¾å·¥å
·æ "
-
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "å½ææ½æè¦æ¶ï¼æ´æ°ç¼è¾å¨çªå£"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "忥ç¼è¾å¨åæ··é³å¨å·²éä¸é¨å"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "å½åæ°æ ç¾"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to be "
-"set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
msgstr ""
-"妿å¯ç¨ï¼å½å建ä¸ä¸ªæ°æ è®°æ¶ä¼å¼¹åºä¸ä¸ªå¯¹è¯æ¡ï¼å
许为å建å®è设置å®çåç§°ã\n"
-"\n"
-"æ¨æ»æ¯å¯ä»¥éè¿å³é®åå»å®ä»¬æ¥éå½åæ å¿"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr "彿å¨è¾¹ç¼éè¿æ¶ï¼èªå¨æ»å¨ç¼è¾å¨çªå£"
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr "卿åå·²éä¸åºåä¹åï¼éæ©"
+#: analyser.cc:121 audioregion.cc:1789
+msgid "Transient Analysis failed for %1."
+msgstr " %1 ç¬æåæå¤±è´¥"
-#: rc_option_editor.cc:1791
-msgid "no regions"
-msgstr "æ åºå"
+#: analyser.cc:121
+msgid "Audio File Source"
+msgstr "é³é¢æä»¶æ¥æº"
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr "æ°å建çåºå"
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr "å·²åå¨çå·²éä¸é¨ååæ°å建çåºå"
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr " æªåçä»»ä½é误"
-#: rc_option_editor.cc:1805
-msgid "Buffering"
-msgstr "ç¼å²ä¸"
-
-#: rc_option_editor.cc:1813
-msgid "Record monitoring handled by"
-msgstr "å½å¶çæ§çå¤çæ¯éè¿"
-
-#: rc_option_editor.cc:1819
-msgid "via Audio Driver"
-msgstr "via é³é¢é©±å¨"
-
-#: rc_option_editor.cc:1825
-msgid "audio hardware"
-msgstr "é³é¢ç¡¬ä»¶"
-
-#: rc_option_editor.cc:1832
-msgid "Tape machine mode"
-msgstr "ç£å¸¦æºå¨æ¨¡å¼"
-
-#: rc_option_editor.cc:1837
-msgid "Connection of tracks and busses"
-msgstr "é³è½¨åæ»çº¿çè¿æ¥"
-
-#: rc_option_editor.cc:1842
-msgid "Auto-connect master/monitor busses"
-msgstr "èªå¨è¿æ¥ä¸»æ§/çæ§æ»çº¿"
-
-#: rc_option_editor.cc:1849
-msgid "Connect track inputs"
-msgstr "è¿æ¥é³è½¨è¾å
¥"
-
-#: rc_option_editor.cc:1854
-msgid "automatically to physical inputs"
-msgstr "èªå¨åç©çè¾å
¥"
-
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
-msgid "manually"
-msgstr "æå¨"
-
-#: rc_option_editor.cc:1861
-msgid "Connect track and bus outputs"
-msgstr "è¿æ¥é³è½¨åæ»çº¿è¾åº"
-
-#: rc_option_editor.cc:1866
-msgid "automatically to physical outputs"
-msgstr "èªå¨åç©çè¾åº"
-
-#: rc_option_editor.cc:1867
-msgid "automatically to master bus"
-msgstr "èªå¨åä¸»æ§æ»çº¿"
-
-#: rc_option_editor.cc:1872
-msgid "Denormals"
-msgstr "å¼å¸¸"
-
-#: rc_option_editor.cc:1877
-msgid "Use DC bias to protect against denormals"
-msgstr "使ç¨ç´æµååé对å¼å¸¸é²æ¤"
-
-#: rc_option_editor.cc:1884
-msgid "Processor handling"
-msgstr "å¤çå¨å¤ç"
-
-#: rc_option_editor.cc:1890
-msgid "no processor handling"
-msgstr "æ å¤çå¨å¤ç"
-
-#: rc_option_editor.cc:1896
-msgid "use FlushToZero"
-msgstr "使ç¨é½å¹³ä¸ºé¶"
-
-#: rc_option_editor.cc:1903
-msgid "use DenormalsAreZero"
-msgstr "使ç¨å¼å¸¸é½å¹³ä¸ºé¶"
-
-#: rc_option_editor.cc:1910
-msgid "use FlushToZero and DenormalsAreZero"
-msgstr "使ç¨é½å¹³ä¸ºé¶åå¼å¸¸é½å¹³ä¸ºé¶"
-
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "彿éåæ¢æ¶æä»¶ä¹æ 声"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "å¯ç¨æ°æä»¶"
-
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
-msgstr "å¯ç¨é³é¢èªå¨åæ"
-
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
-msgstr "å¤å¶ç¼ºå¤±çåºå声é"
-
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "ç¬å¥ / éé³"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "éå½çç¬å¥ååéé³ï¼dBï¼"
-
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
-msgstr "åç¬æ§å¶å³æ¯è¯å¬æ§å¶"
-
-#: rc_option_editor.cc:1980
-msgid "Listen Position"
-msgstr "è¯å¬ä½ç½®"
-
-#: rc_option_editor.cc:1985
-msgid "after-fader (AFL)"
-msgstr "å置淡åï¼AFLï¼"
-
-#: rc_option_editor.cc:1986
-msgid "pre-fader (PFL)"
-msgstr "å置淡åï¼PFLï¼"
-
-#: rc_option_editor.cc:1992
-msgid "PFL signals come from"
-msgstr "å置淡åä¿¡å·æ¥èª"
-
-#: rc_option_editor.cc:1997
-msgid "before pre-fader processors"
-msgstr "å¨å置淡åå¤çå¨ä¹å"
-
-#: rc_option_editor.cc:1998
-msgid "pre-fader but after pre-fader processors"
-msgstr "å置淡åä½å¨å置淡åå¤çå¨ä¹å"
-
-#: rc_option_editor.cc:2004
-msgid "AFL signals come from"
-msgstr "å置淡åä¿¡å·æ¥èªäº"
-
-#: rc_option_editor.cc:2009
-msgid "immediately post-fader"
-msgstr "ç«å³å置淡å"
-
-#: rc_option_editor.cc:2010
-msgid "after post-fader processors (before pan)"
-msgstr "å置淡åå¤çå¨ä¹åï¼å¹³ç§»ä¹åï¼"
-
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "ä¸å±ç¬å¥"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "æ¾ç¤ºç¬å¥éé³"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "ç¬å¥è¦çéé³"
-
-#: rc_option_editor.cc:2040
-msgid "Default track / bus muting options"
-msgstr "é»è®¤é³è½¨ / æ»çº¿éé³é项"
-
-#: rc_option_editor.cc:2045
-msgid "Mute affects pre-fader sends"
-msgstr "é鳿æå置淡ååé"
-
-#: rc_option_editor.cc:2053
-msgid "Mute affects post-fader sends"
-msgstr "é鳿æå置淡ååé"
-
-#: rc_option_editor.cc:2061
-msgid "Mute affects control outputs"
-msgstr "éé³æææ§å¶è¾åº"
-
-#: rc_option_editor.cc:2069
-msgid "Mute affects main outputs"
-msgstr "é鳿æä¸»è¦è¾åº"
-
-#: rc_option_editor.cc:2074
-msgid "Send Routing"
-msgstr "åéè·¯ç±"
-
-#: rc_option_editor.cc:2079
-msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr "龿¥è¾
å©åå¤é¨åé颿¿åé»è®¤ç主è¦é¢æ¿"
-
-#: rc_option_editor.cc:2087
-msgid "MIDI read-ahead time (seconds)"
-msgstr "MIDI é¢å
è¯»åæ¶é´ï¼ç§ï¼"
-
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
-msgstr "åé MIDI æ¶é´ç "
-
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
-msgstr "æ£å¸¸æéé度ä¸ä¼ è¾ MTC ä¹é´çç¾åæ¯"
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr "åå§åé³é¢å端失败"
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
-msgstr "éµå® MIDI æºå¨æ§å¶å½ä»¤"
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr "æ¤éåå§åé³é¢å端失败"
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
-msgstr "åé MIDI æºå¨æ§å¶å½ä»¤"
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr "éæ°åå§åé³é¢å端失败"
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "åé MIDI æ§å¶åé¦"
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr "æå¼é³é¢è®¾å¤å¤±è´¥"
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
-msgstr "è¿åºç MMC è®¾å¤ ID"
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr "å
³éé³é¢è®¾å¤å¤±è´¥"
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
-msgstr "åºåºç MMC è®¾å¤ ID"
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr "é³é¢è®¾å¤æ æ"
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "åå§ç¨åºæ¹å"
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr "é³é¢è®¾å¤ä¸å¯ç¨"
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "æ¾ç¤ºç¬¬ä¸ä¸ª MIDI åº/ç¨åºä¸º 0"
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr "é³é¢è®¾å¤å°æªè¿æ¥"
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "ä¸åæ¾ç¤ºå®æ MIDI ä¿¡æ¯ï¼MTC, MIDI 计æ¶å¨ï¼"
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr "请æ±åå¨å¤é³é¢è®¾å¤å¤±è´¥"
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "å½ MIDI é³ç¬¦è¢«é䏿¶ååºå£°é³"
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr "é³é¢è®¾å¤è¾å
¥/è¾åºé误"
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
-msgstr "Midi çå¬"
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr "æå¼ MIDI 设å¤å¤±è´¥"
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
-msgstr "Midi çå¬åæï¼LV2ï¼"
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr "å
³é MIDI 设å¤å¤±è´¥"
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
-msgstr "ç¨æ·äº¤äº"
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr " MIDI 设å¤ä¸å¯ç¨"
-#: rc_option_editor.cc:2232
-msgid ""
-"Use translations of %1 messages\n"
-" <i>(requires a restart of %1 to take effect)</i>\n"
-" <i>(if available for your language preferences)</i>"
-msgstr ""
-"%1 ä¿¡æ¯çç¨æ·äº¤äº\n"
-" <i>ï¼è¦æ±éå¯ %1 以çæï¼</i>\n"
-" <i>ï¼å¦ææ¨çè¯è¨é¦é项å¯ç¨ï¼</i>"
-
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
-msgstr "é®ç"
-
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "æ§å¶é¢è¿ç¨ ID"
-
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "ç±ç¨æ·æå®"
-
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "æ··é³å¨æå¦ä¸æåº"
-
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
-msgstr "é¦é项|å¾å½¢ç¨æ·çé¢"
-
-#: rc_option_editor.cc:2272
-msgid "Graphically indicate mouse pointer hovering over various widgets"
-msgstr "彿¬åå¨åç§å°é¨ä»¶ä¸é¢æ¶æ¾ç¤ºé¼ æ æé"
-
-#: rc_option_editor.cc:2281
-msgid "Show tooltips if mouse hovers over a control"
-msgstr "å¦æé¼ æ æ¬åå¨ä¸ä¸ªæ§ä»¶ä¸é¢æ¶æ¾ç¤ºå·¥å
·æç¤º"
-
-#: rc_option_editor.cc:2290
-msgid "Use name highlight bars in region displays (requires a restart)"
-msgstr "å¨åºåæ¾ç¤ºä¸ä½¿ç¨åç§°çªåºæ¾ç¤ºæ ï¼éè¦éæ°å¯å¨ï¼"
-
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
-msgstr "以 FPS æ¿ä»£æ¯ 100ms æ´æ°æé计æ¶å¨æ¾ç¤º"
-
-#: rc_option_editor.cc:2312
-msgid "Lock timeout (seconds)"
-msgstr "éå®è¶
æ¶ï¼ç§ï¼"
-
-#: rc_option_editor.cc:2320
-msgid "Lock GUI after this many idle seconds (zero to never lock)"
-msgstr "å¨ç©ºé²è¿ä¹å¤ç§ä¹åéå®å¾å½¢ç¨æ·çé¢ï¼é¶åæ°¸ä¸éå®ï¼"
-
-#: rc_option_editor.cc:2336
-msgid "Mixer Strip"
-msgstr "æ··é³å¨æ "
-
-#: rc_option_editor.cc:2346
-msgid "Use narrow strips in the mixer by default"
-msgstr "é»è®¤å¨æ··é³å¨é使ç¨ç»é¿æ "
-
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
-msgid "Preferences|Metering"
-msgstr "é¦é项|èæ"
-
-#: rc_option_editor.cc:2355
-msgid "Peak hold time"
-msgstr "å³°å¼åçæ¶é´"
-
-#: rc_option_editor.cc:2361
-msgid "short"
-msgstr "ç"
-
-#: rc_option_editor.cc:2362
-msgid "medium"
-msgstr "ä¸"
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr " MIDI 设å¤å°æªè¿æ¥"
-#: rc_option_editor.cc:2363
-msgid "long"
-msgstr "é¿"
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr " MIDI 设å¤è¾å
¥è¾åºé误"
-#: rc_option_editor.cc:2369
-msgid "DPM fall-off"
-msgstr "DPM è¡°å"
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr "æ ·æ¬æ ¼å¼ä¸è¢«æ¯æ"
-#: rc_option_editor.cc:2375
-msgid "slowest [6.6dB/sec]"
-msgstr "ææ
¢ [6.6dB/sec]"
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr "éæ ·çä¸åæ¯æ"
-#: rc_option_editor.cc:2376
-msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
-msgstr "æ
¢ [8.6dB/sec] (BBC PPM, EBU PPM)"
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr "æè¯·æ±çè¾å
¥å»¶è¿ä¸åæ¯æ"
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "ç¨æ
¢ [12.0dB/sec] (DIN)"
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr "æè¯·æ±çè¾åºå»¶è¿ä¸åæ¯æ"
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "ç¨³å¥ [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr "乿®µå¤§å°ä¸åæ¯æ"
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
-msgstr "ä¸ç [20dB/sec]"
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr "乿®µè®¡æ°ä¸åæ¯æ"
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
-msgstr "å¿« [32dB/sec]"
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr "设å¤é
ç½®ä¸åæ¯æ"
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr "è¾å¿« [46dB/sec]"
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr "声é计æ°é
ç½®ä¸åæ¯æ"
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr "æå¿« [70dB/sec]"
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr "è¾å
¥å£°é计æ°é
ç½®ä¸åæ¯æ"
-#: rc_option_editor.cc:2388
-msgid "Meter line-up level; 0dBu"
-msgstr "èææéçµå¹³ï¼0dBu"
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr "è¾åºå£°é计æ°é
ç½®ä¸åæ¯æ"
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
-msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-msgstr ""
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr "æ æ³è·å¾å®æ¶æé"
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
-msgid "-20dBFS (SMPTE RP.0155)"
-msgstr ""
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr "设置é³é¢è®¾å¤çº¿ç¨ä¼å
级失败"
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
-msgid "-18dBFS (EBU, BBC)"
-msgstr ""
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr "设置 MIDI 设å¤çº¿ç¨ä¼å
级失败"
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
-msgid "-15dBFS (DIN)"
-msgstr ""
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr "å¯å¨è¿ç¨çº¿ç¨å¤±è´¥"
-#: rc_option_editor.cc:2398
-msgid ""
-"Configure meter-marks and color-knee point for dBFS scale DPM, set reference level "
-"for IEC1/Nordic, IEC2 PPM and VU meter."
-msgstr ""
-"é
ç½®èææ å¿å转è§é¢è²ç¹ç¨äº dBFS ç¼©æ¾ DPMï¼ä¸º IEC1/NordicãIEC2 PPM å VU èæè®¾ç½®"
-"åèçµå¹³ã"
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr "å¯å¨é£è½®çº¿ç¨å¤±è´¥"
-#: rc_option_editor.cc:2404
-msgid "IEC1/DIN Meter line-up level; 0dBu"
-msgstr "IEC1/DIN èææéçµå¹³ï¼0dBu"
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr "注åé³é¢/MIDI端å£å¤±è´¥"
-#: rc_option_editor.cc:2414
-msgid "Reference level for IEC1/DIN meter."
-msgstr "IEC1/DIN èæåèçµå¹³ã"
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr "æ æ³è¿æ¥é³é¢/MIDI弿"
-#: rc_option_editor.cc:2420
-msgid "VU Meter standard"
-msgstr "VU èææ å"
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr "å
åæº¢åºé误"
-#: rc_option_editor.cc:2425
-msgid "0VU = -2dBu (France)"
-msgstr "0VU = -2dBu ï¼æ³å½ï¼"
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr "æ æ³è¿æ¥é³é¢/MIDI弿"
-#: rc_option_editor.cc:2426
-msgid "0VU = 0dBu (North America, Australia)"
-msgstr "0VU = 0dBu ï¼åç¾ï¼æ¾³æ´²ï¼"
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "æ "
-#: rc_option_editor.cc:2427
-msgid "0VU = +4dBu (standard)"
-msgstr "0VU = +4dBu ï¼æ åï¼"
+#: audio_backend.cc:109
+msgid "Default"
+msgstr "é»è®¤"
-#: rc_option_editor.cc:2428
-msgid "0VU = +8dBu"
-msgstr ""
+#: audio_diskstream.cc:257
+msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
+msgstr "é³é¢ç¡¬çæµï¼ææ¾å表 \"%1\" 并䏿¯ä¸ä¸ªé³é¢ææ¾å表"
-#: rc_option_editor.cc:2434
-msgid "Peak threshold [dBFS]"
-msgstr "å³°å¼ä¸´çå¼ [dBFS]"
+#: audio_diskstream.cc:309
+msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr "é³é¢ç¡¬çæµ %1ï¼æ²¡æå·²åå¨çææ¾å表å¯ç¨äºå¤å¶ï¼"
-#: rc_option_editor.cc:2442
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak indicator "
-"will flash red."
-msgstr "以 dbFS æå®é³é¢ä¿¡å·çµå¹³ï¼è¾¾å°ä»¥åè¶
è¿èæå³°æ¶ï¼å¼æç¤ºå¨å°éªç红ç¯ã"
-
-#: rc_option_editor.cc:2449
-msgid "LED meter style"
-msgstr "LED èæç±»å"
-
-#: rc_option_editor.cc:2457
-msgid "Theme"
-msgstr "主é¢"
-
-#: region_editor.cc:79
-msgid "audition this region"
-msgstr "ç嬿¤åºå"
+"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
+msgstr "é³é¢ç¡¬çæµ %1ï¼éæ°å¡«å
æ¶ï¼å¨ %3 å¸§æ æ³ä»ææ¾å表读å %2 "
-#: region_editor.cc:88 region_layering_order_editor.cc:75
-msgid "Position:"
-msgstr "ä½ç½®ï¼"
+#: audio_diskstream.cc:1053
+msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr "é³é¢ç¡¬çæµ %1ï¼æ æ³å¨ %3 叧仿æ¾å表读å %2 "
-#: region_editor.cc:90 add_video_dialog.cc:155
-msgid "End:"
-msgstr "ç»ç¹ï¼"
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
+msgid "AudioDiskstream %1: cannot write to disk"
+msgstr "é³é¢ç¡¬çæµ %1ï¼æ æ³åå
¥ç¡¬ç"
-#: region_editor.cc:92 sfdb_ui.cc:145
-msgid "Length:"
-msgstr "é¿åº¦ï¼"
+#: audio_diskstream.cc:1531
+msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr "é³é¢ç¡¬çæµ \"%1\"ï¼æ æ³æ³¨å
¥å·²æè·çæ°æ®å°ç¡¬çï¼"
-#: region_editor.cc:94
-msgid "Sync point (relative to region):"
-msgstr "忥ç¹ï¼ç¸å¯¹äºåºåï¼ï¼"
+#: audio_diskstream.cc:1627
+msgid "%1: could not create region for complete audio file"
+msgstr "%1ï¼æ æ³ä¸ºå®æ´çé³é¢æä»¶å建åºå"
-#: region_editor.cc:96
-msgid "Sync point (absolute):"
-msgstr "忥ç¹ï¼ç»å¯¹ï¼ï¼"
+#: audio_diskstream.cc:1659
+msgid "AudioDiskstream: could not create region for captured audio!"
+msgstr "é³é¢ç¡¬çæµï¼æ æ³ä¸ºæè·çé³é¢å建åºåï¼"
-#: region_editor.cc:98
-msgid "File start:"
-msgstr "æä»¶èµ·ç¹ï¼"
+#: audio_diskstream.cc:1755
+msgid "programmer error: %1"
+msgstr "ç¨åºé误ï¼%1"
-#: region_editor.cc:102
-msgid "Sources:"
-msgstr "æºï¼"
+#: audio_diskstream.cc:2012
+msgid "AudioDiskstream: channel %1 out of range"
+msgstr "é³é¢ç¡¬çæµï¼å£°é %1 è¶
åºèå´"
-#: region_editor.cc:104
-msgid "Source:"
-msgstr "æºï¼"
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
+msgid "%1:%2 new capture file not initialized correctly"
+msgstr "%1ï¼%2 æ°æè·çæä»¶æ²¡ææ£ç¡®åå§å"
-#: region_editor.cc:166
-msgid "Region '%1'"
-msgstr "åºå '%1'"
+#: audio_diskstream.cc:2305
+msgid "%1: cannot restore pending capture source file %2"
+msgstr "%1ï¼æ æ³æ¢å¤çåä¸çæè·æºæä»¶ %2"
-#: region_editor.cc:273
-msgid "change region start position"
-msgstr "æ¹ååºåèµ·ç¹ä½ç½®"
+#: audio_diskstream.cc:2327
+msgid "%1: incorrect number of pending sources listed - ignoring them all"
+msgstr "%1ï¼çåä¸å·²ååºçæ¥æºç¼å·é误ââå
¨é¨å¿½ç¥å®ä»¬"
-#: region_editor.cc:289
-msgid "change region end position"
-msgstr "æ¹ååºåç»ç¹ä½ç½®"
+#: audio_diskstream.cc:2361
+msgid "%1: cannot create whole-file region from pending capture sources"
+msgstr "%1ï¼æ æ³ä»çåä¸çæè·æ¥æºå建æ´ä¸ªæä»¶åºå"
-#: region_editor.cc:309
-msgid "change region length"
-msgstr "æ¹ååºåé¿åº¦"
+#: audio_library.cc:82
+msgid "Could not open %1. Audio Library not saved"
+msgstr "æ æ³æå¼ %1ãé³é¢åºå°æªä¿å"
-#: region_editor.cc:403 region_editor.cc:415
-msgid "change region sync point"
-msgstr "æ¹ååºå忥ç¹"
+#: audio_playlist.cc:509
+msgid ""
+"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
+"- crossfade discarded"
+msgstr ""
+"æéççäº¤åæ·¡åï¼æ·¡å
¥æ·¡åºï¼æ¶åä¸ä¸ªå¨ææ¾å表 \"%1\" éå¹¶ä¸åå¨ç导å
¥åºåââ"
+"äº¤åæ·¡åï¼æ·¡å
¥æ·¡åºï¼è¢«å¼ç¨"
-#: region_layering_order_editor.cc:42
-msgid "RegionLayeringOrderEditor"
-msgstr "åºåå屿åºç¼è¾å¨"
+#: audio_playlist.cc:525
+msgid ""
+"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
+"- crossfade discarded"
+msgstr ""
+"æéççäº¤åæ·¡åï¼æ·¡å
¥æ·¡åºï¼æ¶åä¸ä¸ªå¨ææ¾å表 \"%1\" éå¹¶ä¸åå¨ç导åºåºåââ"
+"äº¤åæ·¡åï¼æ·¡å
¥æ·¡åºï¼è¢«å¼ç¨"
-#: region_layering_order_editor.cc:55
-msgid "Region Name"
-msgstr "åºååç§°"
+#: audio_playlist_importer.cc:68
+msgid "Audio Playlists"
+msgstr "é³é¢ææ¾å表"
-#: region_layering_order_editor.cc:72
-msgid "Track:"
-msgstr "é³è½¨ï¼"
+#: audio_playlist_importer.cc:161
+msgid "region"
+msgstr "åºå"
-#: region_layering_order_editor.cc:104
-msgid "Choose Top Region"
-msgstr "鿩顶é¨åºå"
+#: audio_playlist_importer.cc:163
+msgid "regions"
+msgstr "åºå"
-#: region_view.cc:277
-msgid "SilenceText"
-msgstr "æ å£°ææ¬"
+#: audio_playlist_importer.cc:174 audio_track_importer.cc:244
+msgid "A playlist with this name already exists, please rename it."
+msgstr "å·²ç»å卿ç¸ååç§°çææ¾å表ï¼è¯·éæ°å½åå®ã"
-#: region_view.cc:292 region_view.cc:311
-msgid "minutes"
-msgstr "åé"
+#: audio_playlist_importer.cc:183
+msgid "badly-formed XML in imported playlist"
+msgstr "导å
¥çææ¾åè¡¨ä¸ XML 形弿··ä¹±"
-#: region_view.cc:295 region_view.cc:314
-msgid "msecs"
-msgstr "毫ç§"
+#: audio_playlist_importer.cc:267
+msgid "Audio Playlists (unused)"
+msgstr "é³é¢ææ¾åè¡¨ï¼æªä½¿ç¨çï¼"
-#: region_view.cc:298 region_view.cc:317
-msgid "secs"
-msgstr "ç§"
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
+msgid "programming error: %1"
+msgstr "ç¨åºé误ï¼%1"
-#: region_view.cc:301
-msgid "%1 silent segment"
-msgid_plural "%1 silent segments"
-msgstr[0] "%1 æ å£°çæ®µ"
+#: audio_region_importer.cc:75
+msgid "Audio Regions"
+msgstr "é³é¢åºå"
-#: region_view.cc:303
-msgid "shortest = %1 %2"
-msgstr "æç = %1 %2"
+#: audio_region_importer.cc:145
+msgid "Length: "
+msgstr "é¿åº¦ï¼"
-#: region_view.cc:320
+#: audio_region_importer.cc:147
msgid ""
"\n"
-" (shortest audible segment = %1 %2)"
+"Position: "
msgstr ""
"\n"
-" ï¼æççå¯å¬è§ç段 = %1 %2ï¼"
+"ä½ç½®ï¼"
-#: return_ui.cc:102
-msgid "Return "
-msgstr "è¿å"
-
-#: rhythm_ferret.cc:48
-msgid "Percussive Onset"
-msgstr "æ²å»å¯å¨"
-
-#: rhythm_ferret.cc:49
-msgid "Note Onset"
-msgstr "é³ç¬¦å¯å¨"
-
-#: rhythm_ferret.cc:54
-msgid "Energy Based"
-msgstr "è½éåºå"
-
-#: rhythm_ferret.cc:55
-msgid "Spectral Difference"
-msgstr "波谱差å¼"
-
-#: rhythm_ferret.cc:56
-msgid "High-Frequency Content"
-msgstr "é«é¢å
容"
-
-#: rhythm_ferret.cc:57
-msgid "Complex Domain"
-msgstr "å¤åé¢å"
-
-#: rhythm_ferret.cc:58
-msgid "Phase Deviation"
-msgstr "ç¸ä½åå·®"
-
-#: rhythm_ferret.cc:59
-msgid "Kullback-Liebler"
+#: audio_region_importer.cc:149
+msgid ""
+"\n"
+"Channels: "
msgstr ""
+"\n"
+"声éï¼"
-#: rhythm_ferret.cc:60
-msgid "Modified Kullback-Liebler"
-msgstr "æ¹è¯ç Kullback-Liebler"
-
-#: rhythm_ferret.cc:65
-msgid "Split region"
-msgstr "æååºå"
-
-#: rhythm_ferret.cc:66
-msgid "Snap regions"
-msgstr "å¸éåºå"
-
-#: rhythm_ferret.cc:67
-msgid "Conform regions"
-msgstr "éåºåºå"
-
-#: rhythm_ferret.cc:72
-msgid "Rhythm Ferret"
-msgstr "è奿¢æµ"
-
-#: rhythm_ferret.cc:78
-msgid "Analyze"
-msgstr "åæ"
-
-#: rhythm_ferret.cc:113
-msgid "Detection function"
-msgstr "æ£æµåè½"
-
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "触åé´é"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "临çå¼"
-
-#: rhythm_ferret.cc:127
-msgid "Peak threshold"
-msgstr "å³°å¼ä¸´çå¼"
-
-#: rhythm_ferret.cc:132
-msgid "Silence threshold"
-msgstr "æ 声临çå¼"
-
-#: rhythm_ferret.cc:137
-msgid "Sensitivity"
-msgstr "çµæåº¦"
-
-#: rhythm_ferret.cc:141
-msgid "Operation"
-msgstr "æä½"
-
-#: rhythm_ferret.cc:355
-msgid "split regions (rhythm ferret)"
-msgstr "æååºåï¼è奿¢æµï¼"
-
-#: route_group_dialog.cc:42
-msgid "Track/bus Group"
-msgstr "é³è½¨/æ»çº¿åç»"
-
-#: route_group_dialog.cc:47
-msgid "Relative"
-msgstr "å
³èç"
-
-#: route_group_dialog.cc:48
-msgid "Muting"
-msgstr "éé³ä¸"
-
-#: route_group_dialog.cc:50
-msgid "Record enable"
-msgstr "å¯ç¨å½å¶"
-
-#: route_group_dialog.cc:52
-msgid "Active state"
-msgstr "æ¿æ´»ç¶æ"
-
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "é¢è²"
-
-#: route_group_dialog.cc:59
-msgid "RouteGroupDialog"
-msgstr "è·¯ç±åç»å¯¹è¯æ¡"
-
-#: route_group_dialog.cc:100
-msgid "<b>Sharing</b>"
-msgstr "<b>å
±äº«ä¸</b>"
+#: audio_track.cc:177
+msgid "Unknown bundle \"%1\" listed for input of %2"
+msgstr "æªç¥çéæ \"%1\" ç½åå¨ %2 çè¾å
¥"
-#: route_group_dialog.cc:200
-msgid "The group name is not unique. Please use a different name."
-msgstr "åç»åç§°æéå¤ã请使ç¨å¦ä¸ä¸ªåç§°ã"
+#: audio_track.cc:179
+msgid "in 1"
+msgstr "å¨ 1 å
"
-#: route_params_ui.cc:84
-msgid "Tracks/Busses"
-msgstr "é³è½¨/æ»çº¿"
+#: audio_track.cc:180
+msgid "No input bundles available as a replacement"
+msgstr "没æå¯ç¨çè¾å
¥éæå¯ä½ä¸ºæ¿ä»£"
-#: route_params_ui.cc:103
-msgid "Inputs"
-msgstr "è¾å
¥"
+#: audio_track.cc:184
+msgid "Bundle %1 was not available - \"in 1\" used instead"
+msgstr "éæ %1 ä¸å¯ç¨ââ使ç¨âå¨ 1 å
âæ¿ä»£"
-#: route_params_ui.cc:104
-msgid "Outputs"
-msgstr "è¾åº"
+#: audio_track.cc:193
+msgid "improper input channel list in XML node (%1)"
+msgstr "å¨ XML èç¹ä¸æä¸æ°å½çè¾å
¥å£°éå表ï¼%1ï¼"
-#: route_params_ui.cc:105
-msgid "Plugins, Inserts & Sends"
-msgstr "æä»¶ï¼æå
¥ååé"
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr "æ¬ä¼è¯ä½¿ç¨ç ´åæ§çé³è½¨ï¼å¨æ¤ä¸åæ¯æã"
-#: route_params_ui.cc:209
-msgid "route display list item for renamed route not found!"
-msgstr "æªæ¾å°å·²éå½åè·¯ç±çè·¯ç±æ¾ç¤ºå表æ¡ç®ï¼"
+#: audio_track_importer.cc:68
+msgid "Audio Tracks"
+msgstr "é³é¢è½¨é"
-#: route_params_ui.cc:279 route_params_ui.cc:307
-#, c-format
-msgid "Playback delay: %<PRId64> samples"
-msgstr "忾延è¿ï¼ %<PRId64> éæ ·"
+#: audio_track_importer.cc:253 audio_track_importer.cc:259
+msgid "badly-formed XML in imported track"
+msgstr "导å
¥çé³è½¨ä¸ XML 形弿··ä¹±"
-#: route_params_ui.cc:499
-msgid "NO TRACK"
-msgstr "没æé³è½¨"
+#: audio_track_importer.cc:287
+msgid "Error Importing Audio track %1"
+msgstr "导å
¥é³é¢è½¨é %1 åºé"
-#: route_params_ui.cc:637 route_params_ui.cc:638
-msgid "No Track or Bus Selected"
-msgstr "没æé³è½¨ææ»çº¿è¢«éä¸"
+#: audioanalyser.cc:50
+msgid "cannot load VAMP plugin \"%1\""
+msgstr "æ æ³è½½å
¥ VAMP æä»¶ \"%1\""
-#: route_time_axis.cc:181
-msgid "Record (Right-click for Step Edit)"
-msgstr "å½å¶ï¼å³é®ç¹å»æ¥è¿ç¼è¾ï¼"
+#: audioanalyser.cc:70
+msgid "VAMP Plugin \"%1\" could not be loaded"
+msgstr " VAMP æä»¶ \"%1\" æ æ³è¢«å è½½"
-#: route_time_axis.cc:184
-msgid "Record"
-msgstr "å½å¶"
+#: audioengine.cc:756
+msgid "AudioEngine: cannot load module \"%1\" (%2)"
+msgstr "é³é¢å¼æï¼æ æ³è½½å
¥æ¨¡å¼ \"%1\" ï¼%2ï¼"
-#: route_time_axis.cc:254
-msgid "Route Group"
-msgstr "è·¯ç±åç»"
+#: audioengine.cc:762
+msgid "AudioEngine: backend at \"%1\" has no descriptor function."
+msgstr "é³é¢å¼æï¼å¨ \"%1\" çå端没ææè¿°ç¬¦å½æ°ã"
-#: route_time_axis.cc:264
-msgid "MIDI Controllers and Automation"
-msgstr "MIDI æ§å¶å¨åèªå¨å"
+#: audioengine.cc:841
+msgid "Could not create backend for %1: %2"
+msgstr "æ æ³ä¸º %1 å建å端ï¼%2"
-#: route_time_axis.cc:495
-msgid "Show All Automation"
-msgstr "æ¾ç¤ºææçèªå¨å"
+#: audioregion.cc:1757
+msgid ""
+"You have requested an operation that requires audio analysis.\n"
+"\n"
+"You currently have \"auto-analyse-audio\" disabled, which means that "
+"transient data must be generated every time it is required.\n"
+"\n"
+"If you are doing work that will require transient data on a regular basis, "
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
+"\n"
+"This dialog will not display again. But you may notice a slight delay in "
+"this and future transient-detection operations.\n"
+msgstr ""
-#: route_time_axis.cc:498
-msgid "Show Existing Automation"
-msgstr "æ¾ç¤ºå·²æçèªå¨å"
+#: audioregion.cc:1789
+msgid "Audio Region"
+msgstr "é³é¢åºå"
-#: route_time_axis.cc:501
-msgid "Hide All Automation"
-msgstr "éèææèªå¨å"
+#: audiosource.cc:228
+msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
+msgstr "æ æ³ä¸º %1 ä» %2 å° %3ï¼%4ï¼éå½å峰弿件"
-#: route_time_axis.cc:510
-msgid "Processor automation"
-msgstr "å¤çå¨èªå¨å"
+#: audiosource.cc:262
+msgid "AudioSource: cannot stat peakfile \"%1\""
+msgstr "é³é¢æ¥æºï¼æ æ³å¯å¨å³°å¼æä»¶ \"%1\""
-#: route_time_axis.cc:517
-msgid "Fader"
-msgstr "æ·¡å"
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr "æ æ³ä¸ºå°ºå¯¸æ ¡æ ¸ï¼%2ï¼æå¼å³°å¼æä»¶ @ %1 "
-#: route_time_axis.cc:535
-msgid "Pan"
-msgstr "平移"
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr "峰弿件 %1 è¢«ä» %2 å° %3 æªçå è"
-#: route_time_axis.cc:626
-msgid "Overlaid"
-msgstr "éå "
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr "æ æ³ä¸ºå°ºå¯¸æ ¡æ ¸ï¼%2ï¼é建ä¹åæå¼å³°å¼æä»¶ @ %1 "
-#: route_time_axis.cc:632
-msgid "Stacked"
-msgstr "å æ "
+#: audiosource.cc:404
+msgid "Cannot open peakfile @ %1 for reading (%2)"
+msgstr "æ æ³ä¸ºè¯»åï¼%2ï¼æå¼å³°å¼æä»¶ @ %1 "
-#: route_time_axis.cc:640
-msgid "Layers"
-msgstr "å±"
+#: audiosource.cc:438
+msgid "cannot read sample data for unscaled peak computation"
+msgstr "æ æ³ä¸ºå°æªæ¯ä¾åçå³°å¼è®¡ç®è¯»åéæ ·æ°æ®"
-#: route_time_axis.cc:709
-msgid "Automatic (based on I/O connections)"
-msgstr "èªå¨çï¼åºäºè¾å
¥/è¾åºè¿æ¥ï¼"
+#: audiosource.cc:473 audiosource.cc:568
+msgid "map failed - could not create file mapping for peakfile %1."
+msgstr "æ å°å¤±è´¥ââæ æ³ä¸ºå³°å¼æä»¶ %1 å建æä»¶æ å°ã"
-#: route_time_axis.cc:718
-msgid "(Currently: Existing Material)"
-msgstr "ï¼å½åï¼ç°æææï¼"
+#: audiosource.cc:479 audiosource.cc:574
+msgid "map failed - could not map peakfile %1."
+msgstr "æ å°å¤±è´¥ââæ æ³æ å°å³°å¼æä»¶ %1ã"
-#: route_time_axis.cc:721
-msgid "(Currently: Capture Time)"
-msgstr "ï¼å½åï¼æè·æ¶é´ï¼"
+#: audiosource.cc:490 audiosource.cc:585
+msgid "unmap failed - could not unmap peakfile %1."
+msgstr "æ¤éæ å°å¤±è´¥ââæ æ³æ¤éæ å°å³°å¼æä»¶ %1ã"
-#: route_time_axis.cc:729
-msgid "Align With Existing Material"
-msgstr "ä¸ç°æææå¯¹é½"
+#: audiosource.cc:496 audiosource.cc:591
+msgid "map failed - could not mmap peakfile %1."
+msgstr "æ å°å¤±è´¥ââæ æ³å
åæ å°å³°å¼æä»¶ %1ã"
-#: route_time_axis.cc:734
-msgid "Align With Capture Time"
-msgstr "ä¸æè·æ¶é´å¯¹é½"
+#: audiosource.cc:681
+msgid ""
+"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
+msgstr "é³é¢æ¥æº [%1]ï¼å³°å¼è¯»åââå¨ %4ï¼%5ï¼åç§» %3 夿 æ³è¯»å %2 æ ·æ¬"
-#: route_time_axis.cc:739
-msgid "Alignment"
-msgstr "对é½"
+#: audiosource.cc:748
+msgid "%1: could not write read raw data for peak computation (%2)"
+msgstr "%1ï¼æ æ³ä¸ºå³°å¼è®¡ç®ï¼%2ï¼åå
¥è¯»ååå§æ°æ®"
-#: route_time_axis.cc:774
-msgid "Normal Mode"
-msgstr "æ£å¸¸æ¨¡å¼"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
+msgstr "é³é¢æ¥æºï¼æ æ³æå¼ _peakpath (c) \"%1\" (%2)"
-#: route_time_axis.cc:780
-msgid "Tape Mode"
-msgstr "ç£å¸¦æ¨¡å¼"
+#: audiosource.cc:894 audiosource.cc:1016
+msgid "%1: could not seek in peak file data (%2)"
+msgstr "%1ï¼æ æ³æå¯»å³°å¼æä»¶æ°æ®ï¼%2ï¼"
-#: route_time_axis.cc:786
-msgid "Non-Layered Mode"
-msgstr "ä¸å屿¨¡å¼"
+#: audiosource.cc:899 audiosource.cc:1025
+msgid "%1: could not write peak file data (%2)"
+msgstr "%1ï¼æ æ³åå
¥å³°å¼æä»¶æ°æ®ï¼%2ï¼"
-#: route_time_axis.cc:792
-msgid "Record Mode"
-msgstr "å½å¶æ¨¡å¼"
+#: audiosource.cc:1058
+msgid "could not truncate peakfile %1 to %2 (error: %3)"
+msgstr "æ æ³ä» %1 å° %2 æªç峰弿件ï¼é误ï¼%3ï¼"
-#: route_time_axis.cc:799 route_time_axis.cc:1789
-msgid "Playlist"
-msgstr "ææ¾å表"
+#: auditioner.cc:105
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr "为 MIDI çå¬åæ¤å°åççåæã"
-#: route_time_axis.cc:1097
-msgid "Rename Playlist"
-msgstr "éå½åææ¾å表"
+#: auditioner.cc:107
+msgid "No synth for midi-audition found."
+msgstr "æ åæå¯ç¨äº MIDI çå¬ã"
-#: route_time_axis.cc:1098
-msgid "New name for playlist:"
-msgstr "ææ¾åè¡¨çæ°åç§°ï¼"
+#: auditioner.cc:163
+msgid "no outputs available for auditioner - manual connection required"
+msgstr "æ è¾åºå¯ç¨äºçå¬å¨ââéè¦æå¨è¿æ¥"
-#: route_time_axis.cc:1183
-msgid "New Copy Playlist"
-msgstr "æ°å»ºææ¾å表æ·è´"
+#: auditioner.cc:408 auditioner.cc:455
+msgid "Cannot setup auditioner processing flow for %1 channels"
+msgstr "æ æ³ä¸º %1 声é设置çå¬å¨å¤çæµç¨"
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
-msgid "Name for new playlist:"
-msgstr "æ°ææ¾å表åç§°ï¼"
+#: auditioner.cc:443
+msgid "Failed to load synth for MIDI-Audition."
+msgstr "为 MIDI çå¬è½½å
¥åæå¤±è´¥ã"
-#: route_time_axis.cc:1236
-msgid "New Playlist"
-msgstr "æ°å»ºææ¾å表"
+#: auditioner.cc:462
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr "ä¸åäºé³é¢æMIDIçåºåçå¬ä¸åæ¯æã"
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "æ æ³ä»¥æ¤åç§°å建é³è½¨ï¼å 为å®è¢« %1 ä¿ç使ç¨"
+#: automatable.cc:87
+msgid "Automation node has no path property"
+msgstr "èªå¨åèç¹æ²¡æè·¯å¾å±æ§"
-#: route_time_axis.cc:1678
-msgid "New Copy..."
-msgstr "æ°å»ºæ·è´â¦"
+#: automatable.cc:108
+msgid "cannot open %2 to load automation data (%3)"
+msgstr "æ æ³æå¼ %2 æ¥è½½å
¥èªå¨åæ°æ®ï¼%3ï¼"
-#: route_time_axis.cc:1682
-msgid "New Take"
-msgstr "æ°å»ºç£å¸¦"
+#: automatable.cc:140
+msgid "cannot load automation data from %2"
+msgstr "æ æ³ä» %2 è½½å
¥èªå¨åæ°æ®"
-#: route_time_axis.cc:1683
-msgid "Copy Take"
-msgstr "æ·è´ç£å¸¦"
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "æ·¡åå¨"
-#: route_time_axis.cc:1688
-msgid "Clear Current"
-msgstr "æ¸
é¤å½å"
+#: automatable.cc:178
+msgid "Trim"
+msgstr "ä¿®åª"
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "éæ©ææâ¦"
+#: automatable.cc:180
+msgid "Mute"
+msgstr "éé³"
-#: route_time_axis.cc:1779
-msgid "Take: %1.%2"
-msgstr "ç£å¸¦ï¼%1.%2"
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr "å½å¶ %1 èªå¨å"
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
-msgid "programming error: "
-msgstr "ç¨åºé误ï¼"
+#: automation_list.cc:410
+msgid "automation list: cannot load coordinates from XML, all points ignored"
+msgstr "èªå¨ååè¡¨ï¼æ æ³ä» XML è½½å
¥åæ ï¼å·²å¿½ç¥ææçç¹"
-#: route_time_axis.cc:2585
-msgid "Underlays"
-msgstr "åºå±"
+#: automation_list.cc:456
+msgid ""
+"automation list: no x-coordinate stored for control point (point ignored)"
+msgstr "èªå¨ååè¡¨ï¼æ æ§å¶ç¹æåå¨ç X åæ ï¼å·²å¿½ç¥ç¹ï¼"
-#: route_time_axis.cc:2588
-msgid "Remove \"%1\""
-msgstr "ç§»é¤ \"%1\""
+#: automation_list.cc:462
+msgid ""
+"automation list: no y-coordinate stored for control point (point ignored)"
+msgstr "èªå¨ååè¡¨ï¼æ æ§å¶ç¹æåå¨ç Y åæ ï¼å·²å¿½ç¥ç¹ï¼"
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
-msgid "programming error: underlay reference pointer pairs are inconsistent!"
-msgstr "ç¨åºé误ï¼åºå±åèæéæé
ä¸ä¸è´ï¼"
+#: automation_list.cc:476
+msgid ""
+"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
+msgstr "èªå¨åå表ï¼å·²éè¿ç XML èç¹è¢«æä¸º %1ï¼ä¸æ¯âèªå¨åå表âââ已忽ç¥"
-#: route_time_axis.cc:2702
-msgid "After-fade listen (AFL)"
-msgstr "å置淡åè¯å¬ï¼AFLï¼"
+#: butler.cc:126
+msgid "Session: could not create butler thread"
+msgstr "ä¼è¯ï¼æ æ³å建管家线ç¨"
-#: route_time_axis.cc:2706
-msgid "Pre-fade listen (PFL)"
-msgstr "å置淡åè¯å¬ï¼PFLï¼"
+#: butler.cc:254 butler.cc:255
+msgid "Butler read ahead failure on dstream %1"
+msgstr "ç®¡å®¶å¨æ°æ®æµèç±»ç®æ³ %1 æå读å失败"
-#: route_ui.cc:140
-msgid "Mute this track"
-msgstr "é鳿¤é³è½¨"
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
+msgid "Butler write-behind failure on dstream %1"
+msgstr "ç®¡å®¶å¨æ°æ®æµèç±»ç®æ³ %1 æ»ååå
¥å¤±è´¥"
-#: route_ui.cc:144
-msgid "Mute other (non-soloed) tracks"
-msgstr "éé³å
¶å®ï¼éç¬å¥ï¼é³è½¨"
+#: control_protocol_manager.cc:174
+msgid "control protocol name \"%1\" has no descriptor"
+msgstr "æ§å¶åè®®åç§° \"%1\" 没ææè¿°ç¬¦"
-#: route_ui.cc:150
-msgid "Enable recording on this track"
-msgstr "卿¤é³è½¨å¯ç¨å½å¶"
+#: control_protocol_manager.cc:181
+msgid "control protocol name \"%1\" could not be initialized"
+msgstr "æ§å¶åè®®åç§° \"%1\" æ æ³è¢«åå§å"
-#: route_ui.cc:158
-msgid "make mixer strips show sends to this bus"
-msgstr "让混é³å¨æ æ¾ç¤ºåéå°è¯¥æ»çº¿"
+#: control_protocol_manager.cc:265
+msgid "Instantiating mandatory control protocol %1"
+msgstr "æ£å¨å¼ºå¶æ§å®ä¾åæ§å¶åè®® %1"
-#: route_ui.cc:163
-msgid "Monitor input"
-msgstr "çæ§è¾å
¥"
+#: control_protocol_manager.cc:309
+msgid "looking for control protocols in %1\n"
+msgstr "æ£å¨ \"%1\" 䏿¥æ¾æ§å¶åè®®\n"
-#: route_ui.cc:169
-msgid "Monitor playback"
-msgstr "çæ§åæ¾"
+#: control_protocol_manager.cc:334
+msgid "Control protocol %1 not usable"
+msgstr "æ§å¶åè®® %1 ä¸å¯ç¨"
-#: route_ui.cc:676
-msgid "Not connected to AudioEngine - cannot engage record"
-msgstr "æªè¿æ¥å°é³é¢å¼æââæ æ³ä»äºå½å¶"
+#: control_protocol_manager.cc:351
+msgid "Control surface protocol discovered: \"%1\"\n"
+msgstr "å·²åç°æ§å¶é¢åè®®ï¼\"%1\"\n"
-#: route_ui.cc:875
-msgid "Step Entry"
-msgstr "æ¥è¿å
¥å£"
+#: control_protocol_manager.cc:367
+msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
+msgstr "æ§å¶é¢å议管çå¨ï¼æ æ³è½½å
¥æ¨¡å¼ \"%1\" (%2)"
-#: route_ui.cc:948
-msgid "Assign all tracks (prefader)"
-msgstr "æå®ææé³è½¨ï¼å置淡åï¼"
+#: control_protocol_manager.cc:373
+msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
+msgstr "æ§å¶é¢å议管çå¨ï¼æ¨¡å¼ \"%1\" 没ææè¿°ç¬¦å½æ°ã"
-#: route_ui.cc:952
-msgid "Assign all tracks and buses (prefader)"
-msgstr "æå®ææé³è½¨åæ»çº¿ï¼å置淡åï¼"
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr "æ§å¶é¢åè®® \"%1\" 没ææè¿°ç¬¦"
-#: route_ui.cc:956
-msgid "Assign all tracks (postfader)"
-msgstr "æå®ææé³è½¨ï¼å置淡åï¼"
+#: cycle_timer.cc:40
+msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
+msgstr "CycleTimer::get_mhz()ï¼æ æ³æå¼ /proc/cpuinfo"
-#: route_ui.cc:960
-msgid "Assign all tracks and buses (postfader)"
-msgstr "æå®ææé³è½¨åæ»çº¿ï¼å置淡åï¼"
+#: cycle_timer.cc:52
+msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
+msgstr "CycleTimer::get_mhz()ï¼å¨ /proc/cpuinfo éæ æ³å®ä½ cpu MHz"
-#: route_ui.cc:964
-msgid "Assign selected tracks (prefader)"
-msgstr "æå®å·²éä¸çé³è½¨ï¼å置淡åï¼"
+#: cycle_timer.cc:75
+msgid "cannot locate cpu MHz in /proc/cpuinfo"
+msgstr "å¨ /proc/cpuinfo éæ æ³å®ä½ cpu MHz"
-#: route_ui.cc:968
-msgid "Assign selected tracks and buses (prefader)"
-msgstr "æå®å·²éä¸çé³è½¨åæ»çº¿ï¼å置淡åï¼"
+#: data_type.cc:27
+msgid "audio"
+msgstr "é³é¢"
-#: route_ui.cc:971
-msgid "Assign selected tracks (postfader)"
-msgstr "æå®å·²éä¸çé³è½¨ï¼å置淡åï¼"
+#: data_type.cc:28 session.cc:2452
+msgid "MIDI"
+msgstr ""
-#: route_ui.cc:975
-msgid "Assign selected tracks and buses (postfader)"
-msgstr "æå®å·²éä¸çé³è½¨åæ»çº¿ï¼å置淡åï¼"
+#: data_type.cc:29
+msgid "unknown"
+msgstr "æªç¥ç"
-#: route_ui.cc:978
-msgid "Copy track/bus gains to sends"
-msgstr "å¤å¶é³è½¨/æ»çº¿å¢çå°åé"
+#: delivery.cc:118
+msgid "main outs"
+msgstr "主è¾åº"
-#: route_ui.cc:979
-msgid "Set sends gain to -inf"
-msgstr "设置åéå¢çå° -inf"
+#: delivery.cc:121 send.cc:64
+msgid "listen"
+msgstr "å¬"
-#: route_ui.cc:980
-msgid "Set sends gain to 0dB"
-msgstr "设置åéå¢çå° 0dB"
+#: diskstream.cc:311
+msgid "Location \"%1\" not valid for track loop (start >= end)"
+msgstr "ä½ç½® \"%1\" å¨é³è½¨å¾ªç¯éæ æï¼èµ·ç¹ >= ç»ç¹ï¼"
-#: route_ui.cc:1300
-msgid "Solo Isolate"
-msgstr "ç¬å¥é离"
+#: export_channel.cc:110
+msgid "Could not get port for export channel \"%1\", dropping the channel"
+msgstr "æ æ³ä¸ºå¯¼åºå£°é \"%1\" è·å端å£ï¼æ£å¨å¼ç¨å£°é"
-#: route_ui.cc:1307
-msgid "Solo Safe"
-msgstr "ç¬å¥å®å
¨"
+#: export_failed.cc:32
+msgid "Export failed: %1"
+msgstr "导åºå¤±è´¥ï¼%1"
-#: route_ui.cc:1329
-msgid "Pre Fader Sends"
-msgstr "å置淡ååé"
+#: export_filename.cc:128
+msgid "Existing export folder for this session (%1) does not exist - ignored"
+msgstr "为æ¬ä¼è¯ï¼%1ï¼èåå¨çå¯¼åºæä»¶å¤¹ä¸åå¨ââ已忽ç¥"
-#: route_ui.cc:1335
-msgid "Post Fader Sends"
-msgstr "å置淡ååé"
+#: export_filename.cc:263
+msgid "No Time"
+msgstr "æ æ¶é´"
-#: route_ui.cc:1341
-msgid "Control Outs"
-msgstr "æ§å¶è¾åº"
+#: export_filename.cc:272
+msgid "Invalid time format"
+msgstr "æ æçæ¶é´æ ¼å¼"
-#: route_ui.cc:1347
-msgid "Main Outs"
-msgstr "主è¦è¾åº"
+#: export_filename.cc:281
+msgid "No Date"
+msgstr "æ æ¥æ"
-#: route_ui.cc:1479
-msgid "Color Selection"
-msgstr "é¢è²å·²éæ©é¨å"
+#: export_filename.cc:296
+msgid "Invalid date format"
+msgstr "æ æçæ¥ææ ¼å¼"
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
+#: export_format_manager.cc:57
+msgid "CD"
msgstr ""
-"æ¨æ¯å¦ççè¦ç§»é¤é³è½¨ \"%1\"ï¼\n"
-"\n"
-"æ¨ä¹å¯è½ä¼å¤±å»ä½¿ç¨æ¤é³è½¨ä½¿ç¨çææ¾å表ã\n"
-"\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼"
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
+#: export_format_manager.cc:66
+msgid "DVD-A"
msgstr ""
-"æ¨æ¯å¦ççè¦ç§»é¤æ»çº¿\"%1\" ï¼\n"
-"\n"
-"ï¼æ¤æä½ä¸å¯æ¤éï¼è䏿¤ä¼è¯æä»¶å°ä¼è¢«éåè¦çï¼"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "ç§»é¤é³è½¨"
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "ç§»é¤æ»çº¿"
-
-#: route_ui.cc:1604
-msgid ""
-"The use of colons (':') is discouraged in track and bus names.\n"
-"Do you want to use this new name?"
+#: export_format_manager.cc:80
+msgid "iPod"
msgstr ""
-"建议ä¸è¦å¨é³è½¨åæ»çº¿åç§°ä¸ä½¿ç¨åå·ï¼â : âï¼ã\n"
-"æ¨æ¯å¦ç¡®å®ä½¿ç¨è¿ä¸ªæ°åç§°ï¼"
-
-#: route_ui.cc:1608
-msgid "Use the new name"
-msgstr "ä½¿ç¨æ°åç§°"
-
-#: route_ui.cc:1609
-msgid "Re-edit the name"
-msgstr "éæ°ç¼è¾åç§°"
-#: route_ui.cc:1622
-msgid "Rename Track"
-msgstr "éå½åé³è½¨"
+#: export_format_manager.cc:91
+msgid "Something else"
+msgstr "å
¶å®çä¸è¥¿"
-#: route_ui.cc:1624
-msgid "Rename Bus"
-msgstr "éå½åæ»çº¿"
+#: export_format_manager.cc:110
+msgid "Any"
+msgstr "ä»»ä½"
-#: route_ui.cc:1692
-msgid ": comment editor"
-msgstr "ï¼æ³¨éç¼è¾å¨"
+#: export_format_manager.cc:111
+msgid "Lossless (linear PCM)"
+msgstr "æ æï¼çº¿æ§ PCMï¼"
-#: route_ui.cc:1858
-msgid " latency"
-msgstr "å»¶è¿"
+#: export_format_manager.cc:112
+msgid "Lossy compression"
+msgstr "ææå缩"
-#: route_ui.cc:1871
-msgid "Cannot create route template directory %1"
-msgstr "æ æ³åå»ºè·¯ç±æ¨¡æ¿ç®å½ %1"
+#: export_format_manager.cc:113
+msgid "Lossless compression"
+msgstr "æ æå缩"
-#: route_ui.cc:1877
-msgid "Save As Template"
-msgstr "å¦å为模æ¿"
+#: export_format_manager.cc:218 export_format_specification.cc:657
+msgid "Session rate"
+msgstr "ä¼è¯éç"
-#: route_ui.cc:1878
-msgid "Template name:"
-msgstr "模æ¿åç§°ï¼"
-
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ç§»é¤æ§å¶ ID"
-
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "ç§»é¤æ§å¶ IDï¼"
-
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: export_format_specification.cc:609
+msgid "normalize loudness"
msgstr ""
-" %1 çè¿ç¨æ§å¶ ID æ¯ï¼%2\n"
-"\n"
-"\n"
-"%3 çè¿ç¨æ§å¶ ID æ æ³æ¹åã"
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "ä¸»æ§æ»çº¿"
-
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "çæ§æ»çº¿"
-
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to change this"
-"%4"
+#: export_format_specification.cc:611
+msgid "normalize peak"
msgstr ""
-"%5 çè¿ç¨æ§å¶ ID æ¯ï¼%2\n"
-"\n"
-"\n"
-"è¿ç¨æ§å¶ IDs æ¯ç±å½åé³è½¨/æ»çº¿å¨ %6 éçæåºæå³å®çã\n"
-"\n"
-"å¦ææ¨æ³æ¹å %4ï¼%3 使ç¨é¦é项çªå£çç¨æ·äº¤äºé项å¡"
-
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track. Right-click to "
-"show menu."
-msgstr "å·¦é®ç¹å»å转ï¼ç¸ä½å转ï¼è¯¥é³è½¨ç声é %1 ãå³é®ç¹å»æ¾ç¤ºèåã"
-
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "ç¹å»æ¾ç¤ºå£°éå转ï¼ç¸ä½å转ï¼èå"
-
-#: search_path_option.cc:35
-msgid "Select folder to search for media"
-msgstr "éæ©ç®å½ä»¥ä¾¿æç´¢åªä½"
-
-#: search_path_option.cc:44
-msgid "Click to add a new location"
-msgstr "ç¹å»æ·»å ä¸ä¸ªæ°ä½ç½®"
-
-#: search_path_option.cc:51
-msgid "the session folder"
-msgstr "ä¼è¯æä»¶å¤¹"
-
-#: send_ui.cc:134
-msgid "Send "
-msgstr "åé"
-#: session_dialog.cc:61
-msgid "Session Setup"
-msgstr "åé设置"
-
-#: session_dialog.cc:66
-msgid "Advanced options ..."
-msgstr "é«çº§é项â¦"
-
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "æ°å»ºä¼è¯"
-
-#: session_dialog.cc:301
-msgid "Check the website for more..."
-msgstr "æ¥è¯¢ç½ç«ä»¥å¾å°æ´å¤â¦"
-
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
-msgstr "ç¹å»ä»¥ä¾¿å¨æ¨çç½é¡µæµè§å¨æå¼ç¨åºç½ç«"
-
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "éæ ·ç"
-
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "ç¡¬çæ ¼å¼å"
-
-#: session_dialog.cc:343
-msgid "Select session file"
-msgstr "éæ©ä¼è¯æä»¶"
-
-#: session_dialog.cc:358
-msgid "Other Sessions"
-msgstr "å
¶å®ä¼è¯"
-
-#: session_dialog.cc:384
-msgid "Open"
-msgstr "æå¼"
-
-#: session_dialog.cc:451
-msgid "Session name:"
-msgstr "ä¼è¯åç§°ï¼"
+#: export_format_specification.cc:616
+msgid "trim"
+msgstr "ä¿®åª"
-#: session_dialog.cc:473
-msgid "Create session folder in:"
-msgstr "å建ä¼è¯æä»¶å¤¹å¨ï¼"
+#: export_format_specification.cc:618
+msgid "trim start"
+msgstr "ä¿®åªèµ·ç¹"
-#: session_dialog.cc:496
-msgid "Select folder for session"
-msgstr "为ä¼è¯éæ©æä»¶å¤¹"
+#: export_format_specification.cc:620
+msgid "trim end"
+msgstr "ä¿®åªç»ç¹"
-#: session_dialog.cc:525
-msgid "Use this template"
-msgstr "ä½¿ç¨æ¤æ¨¡æ¿"
+#: export_formats.cc:49
+msgid "Shaped Noise"
+msgstr "å·²æå½¢çåªå£°"
-#: session_dialog.cc:528
-msgid "no template"
-msgstr "æ²¡ææ¨¡æ¿"
+#: export_formats.cc:50
+msgid "Triangular"
+msgstr "ä¸è§"
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 使µ®ç¹"
+#: export_formats.cc:51
+msgid "Rectangular"
+msgstr "ç©å½¢"
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 ä½"
+#: export_formats.cc:159
+msgid "8-bit"
+msgstr "8 ä½"
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: export_formats.cc:161
+msgid "16-bit"
msgstr "16 ä½"
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
-msgid "channels"
-msgstr "声é"
-
-#: session_dialog.cc:763
-msgid "<b>Busses</b>"
-msgstr "<b>æ»çº¿</b>"
-
-#: session_dialog.cc:764
-msgid "<b>Inputs</b>"
-msgstr "<b>è¾å
¥</b>"
-
-#: session_dialog.cc:765
-msgid "<b>Outputs</b>"
-msgstr "<b>è¾åº</b>"
-
-#: session_dialog.cc:773
-msgid "Create master bus"
-msgstr "åå»ºä¸»æ§æ»çº¿"
-
-#: session_dialog.cc:783
-msgid "Automatically connect to physical inputs"
-msgstr "èªå¨è¿æ¥å°ç©çè¾å
¥"
-
-#: session_dialog.cc:790 session_dialog.cc:849
-msgid "Use only"
-msgstr "ä»
使ç¨"
-
-#: session_dialog.cc:843
-msgid "Automatically connect outputs"
-msgstr "èªå¨è¿æ¥å°è¾åº"
-
-#: session_dialog.cc:865
-msgid "... to master bus"
-msgstr "â¦å°ä¸»æ§æ»çº¿"
-
-#: session_dialog.cc:875
-msgid "... to physical outputs"
-msgstr "â¦å°ç©çè¾åº"
-
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "ä»ä¼è¯å¯¼å
¥"
-
-#: session_import_dialog.cc:74
-msgid "Elements"
-msgstr "å
ç´ "
-
-#: session_import_dialog.cc:111
-msgid "Cannot load XML for session from %1"
-msgstr "æ æ³ä» %1 为ä¼è¯è½½å
¥ XML"
-
-#: session_import_dialog.cc:128 session_import_dialog.cc:212
-msgid "Some elements had errors in them. Please see the log for details"
-msgstr "ä¸äºå
ç´ åºéï¼è¯¦æ
请åé
æ¥å¿æä»¶"
-
-#: session_import_dialog.cc:164
-msgid "Import from session"
-msgstr "ä»ä¼è¯å¯¼å
¥"
-
-#: session_import_dialog.cc:228
-msgid "This will select all elements of this type!"
-msgstr "è¿å°éæ©æ¤ç±»åçææå
ç´ ï¼"
-
-#: session_metadata_dialog.cc:285
-msgid "EAN Check digit OK"
-msgstr "EAN æ ¡éªæ°ä½æ£å¸¸"
-
-#: session_metadata_dialog.cc:289
-msgid "EAN Check digit error"
-msgstr "EAN æ ¡éªæ°ä½åºé"
-
-#: session_metadata_dialog.cc:289
-msgid "expected"
-msgstr "ææ"
-
-#: session_metadata_dialog.cc:294
-msgid "EAN Length error"
-msgstr "EAN é¿åº¦é误"
-
-#: session_metadata_dialog.cc:423
-msgid "Field"
-msgstr "åæ®µ"
-
-#: session_metadata_dialog.cc:427
-msgid "Values (current value on top)"
-msgstr "æ°å¼ï¼å½åæ°å¼ä½äºé¡¶é¨ï¼"
-
-#: session_metadata_dialog.cc:641
-msgid "User"
-msgstr "ç¨æ·"
-
-#: session_metadata_dialog.cc:649
-msgid "Email"
-msgstr "çµåé®ä»¶"
-
-#: session_metadata_dialog.cc:652
-msgid "Web"
-msgstr "ç½ç«"
-
-#: session_metadata_dialog.cc:655
-msgid "Organization"
-msgstr "ç»ç»"
-
-#: session_metadata_dialog.cc:658
-msgid "Country"
-msgstr "å½å®¶"
-
-#: session_metadata_dialog.cc:672
-msgid "Title"
-msgstr "æ é¢"
-
-#: session_metadata_dialog.cc:675
-msgid "Track Number"
-msgstr "é³è½¨åºå·"
-
-#: session_metadata_dialog.cc:678
-msgid "Subtitle"
-msgstr "坿 é¢"
-
-#: session_metadata_dialog.cc:681
-msgid "Grouping"
-msgstr "ç»å"
-
-#: session_metadata_dialog.cc:684
-msgid "Artist"
-msgstr "èºæ¯å®¶"
-
-#: session_metadata_dialog.cc:687
-msgid "Genre"
-msgstr "æµæ´¾"
+#: export_formats.cc:163
+msgid "24-bit"
+msgstr "24 ä½"
-#: session_metadata_dialog.cc:690
-msgid "Comment"
-msgstr "注é"
+#: export_formats.cc:165
+msgid "32-bit"
+msgstr "32 ä½"
-#: session_metadata_dialog.cc:693
-msgid "Copyright"
-msgstr "çæ"
+#: export_formats.cc:167
+msgid "float"
+msgstr "æµ®ç¹"
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
-msgid "Album"
-msgstr "ä¸è¾"
+#: export_formats.cc:169
+msgid "double"
+msgstr "åå"
-#: session_metadata_dialog.cc:709
-msgid "Year"
-msgstr "年份"
+#: export_formats.cc:171
+msgid "8-bit unsigned"
+msgstr "8使 符å·"
-#: session_metadata_dialog.cc:712
-msgid "Album Artist"
-msgstr "ä¸è¾èºæ¯å®¶"
+#: export_formats.cc:173
+msgid "Vorbis sample format"
+msgstr "Vorbis éæ ·æ ¼å¼"
-#: session_metadata_dialog.cc:715
-msgid "Total Tracks"
-msgstr "é³è½¨æ»æ°"
+#: export_formats.cc:175
+msgid "No sample format"
+msgstr "æ éæ ·æ ¼å¼"
-#: session_metadata_dialog.cc:718
-msgid "Disc Subtitle"
-msgstr "å
ç坿 é¢"
+#: export_handler.cc:419
+msgid "File %1 uploaded to %2"
+msgstr "æä»¶ %1 å·²æ´æ°å° %2"
-#: session_metadata_dialog.cc:721
-msgid "Disc Number"
-msgstr "å
çç¼å·"
+#: export_handler.cc:425
+msgid ""
+"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
+msgstr "ä¸ä¼ 声äºå¤±è´¥ãä¹è®¸æ¨ççµåé®ä»¶æå¯ç 䏿£ç¡®ï¼\n"
-#: session_metadata_dialog.cc:724
-msgid "Total Discs"
-msgstr "å
çæ»æ°"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
+msgstr "å½åå
¥ TOC/CUEï¼ç®å½æ°æ®/å
çæ åè¾
å©ï¼æä»¶æ¶åºç°ä¸ä¸ªé误ï¼%1"
-#: session_metadata_dialog.cc:727
-msgid "Compilation"
-msgstr "ç¼çº"
+#: export_handler.cc:844 export_handler.cc:902
+msgid "Cannot convert %1 to Latin-1 text"
+msgstr "æ æ³è½¬æ¢ %1 为 æä¸-1 ææ¬"
-#: session_metadata_dialog.cc:730
-msgid "ISRC"
-msgstr "ISRC å½é
æ åé³åå¶åç¼ç "
+#: export_profile_manager.cc:94
+msgid "Searching for export formats in %1"
+msgstr "æ£å¨ %1 ä¸æç´¢å¯¼åºæ ¼å¼"
-#: session_metadata_dialog.cc:733
-msgid "EAN barcode"
-msgstr "EAN æ¡å½¢ç "
+#: export_profile_manager.cc:100
+msgid "Unable to create export format directory %1: %2"
+msgstr "æ æ³åå»ºå¯¼åºæ ¼å¼ç®å½ %1ï¼%2"
-#: session_metadata_dialog.cc:746
-msgid "People"
-msgstr "æ°æ"
+#: export_profile_manager.cc:268
+msgid "Unable to remove export preset %1: %2"
+msgstr "æ æ³ç§»é¤å¯¼åºé¢è®¾ %1ï¼%2"
-#: session_metadata_dialog.cc:751
-msgid "Lyricist"
-msgstr "ä½è¯"
+#: export_profile_manager.cc:357
+msgid "Selection"
+msgstr "已鿩é¨å"
-#: session_metadata_dialog.cc:754
-msgid "Composer"
-msgstr "使²å®¶"
+#: export_profile_manager.cc:621
+msgid "Unable to rename export format %1 to %2: %3"
+msgstr "æ æ³éå½åå¯¼åºæ ¼å¼ %1 å° %2ï¼%3"
-#: session_metadata_dialog.cc:757
-msgid "Conductor"
-msgstr "ææ¥å®¶"
+#: export_profile_manager.cc:653
+msgid "Unable to remove export profile %1: %2"
+msgstr "æ æ³ç§»é¤å¯¼åºé
ç½®æä»¶ %1ï¼%2"
-#: session_metadata_dialog.cc:760
-msgid "Remixer"
-msgstr "æ··é³å¸"
+#: export_profile_manager.cc:671
+msgid "empty format"
+msgstr "ç©ºç½æ ¼å¼"
-#: session_metadata_dialog.cc:763
-msgid "Arranger"
-msgstr "ç¼æ²è
"
+#: export_profile_manager.cc:752
+msgid "Cannot load export format from %1"
+msgstr "æ æ³ä» %1 è½½å
¥å¯¼åºæ ¼å¼"
-#: session_metadata_dialog.cc:766
-msgid "Engineer"
-msgstr "å·¥ç¨å¸"
+#: export_profile_manager.cc:758
+msgid "Cannot export format read from %1"
+msgstr "æ æ³ä» %1 读åå¯¼åºæ ¼å¼"
-#: session_metadata_dialog.cc:769
-msgid "Producer"
-msgstr "å¶ç人"
+#: export_profile_manager.cc:852
+msgid "No timespan has been selected!"
+msgstr "æ å·²éä¸çæ¶é´è·¨åº¦ï¼"
-#: session_metadata_dialog.cc:772
-msgid "DJ Mixer"
-msgstr "DJ æ··é³å¨"
+#: export_profile_manager.cc:856
+msgid "No channels have been selected!"
+msgstr "æ å·²éä¸ç声éï¼"
-#: session_metadata_dialog.cc:775
-msgid "Metadata|Mixer"
-msgstr "å
æ°æ®|æ··é³å¨"
+#: export_profile_manager.cc:860
+msgid "Some channels are empty"
+msgstr "æäºå£°éæ¯ç©ºç½ç"
-#: session_metadata_dialog.cc:783
-msgid "School"
-msgstr "颿 ¡"
+#: export_profile_manager.cc:893
+msgid "No format selected!"
+msgstr "æ éä¸çæ ¼å¼ï¼"
-#: session_metadata_dialog.cc:788
-msgid "Instructor"
-msgstr "æå¯¼å"
+#: export_profile_manager.cc:895
+msgid "All channels are empty!"
+msgstr "ææå£°é齿¯ç©ºç½çï¼"
-#: session_metadata_dialog.cc:791
-msgid "Course"
-msgstr "è¿ç¨"
+#: export_profile_manager.cc:897
+msgid "One or more of the selected formats is not compatible with this system!"
+msgstr "ä¸ä¸ªæå¤ä¸ªå·²éä¸çæ ¼å¼ä¸è¿ä¸ªç³»ç»ä¸å
¼å®¹ï¼"
-#: session_metadata_dialog.cc:799
-msgid "Edit Session Metadata"
-msgstr "æ è®°ä¼è¯å
æ°æ®"
+#: export_profile_manager.cc:900
+msgid ""
+"%1 supports only %2 channels, but you have %3 channels in your channel "
+"configuration"
+msgstr "%1 ä»
æ¯æ %2 声éï¼ä½å¨æ¨ç声éé
ç½®ä¸æ¨æ %3 声é"
-#: session_metadata_dialog.cc:830
-msgid "Import session metadata"
-msgstr "导å
¥ä¼è¯å
æ°æ®"
+#: file_source.cc:201 session_state.cc:3284
+msgid ""
+"there are already 1000 files with names like %1; versioning discontinued"
+msgstr "å·²ç»æ 1000 个æä»¶çå称类似 %1ï¼çæ¬æ§å¶ä¸æ"
-#: session_metadata_dialog.cc:851
-msgid "Choose session to import metadata from"
-msgstr "鿩坼å
¥å
æ°æ®çæ¥æºä¼è¯"
+#: file_source.cc:210
+msgid "cannot rename file source from %1 to %2 (%3)"
+msgstr "æ æ³éå½åæä»¶æ¥æºä» %1 å° %2ï¼(%3ï¼"
-#: session_metadata_dialog.cc:889
-msgid "This session file could not be read!"
-msgstr "æ¤ä¼è¯æä»¶æ æ³è¯»åï¼"
+#: file_source.cc:251 file_source.cc:374
+msgid "FileSource: search path not set"
+msgstr "æä»¶æ¥æºï¼æç´¢è·¯å¾æªè®¾ç½®"
-#: session_metadata_dialog.cc:899
+#: file_source.cc:434
msgid ""
-"The session file didn't contain metadata!\n"
-"Maybe this is an old session format?"
+"FileSource: \"%1\" is ambigous when searching\n"
+"\t"
msgstr ""
-"æ¤ä¼è¯æä»¶ä¸å
å«å
æ°æ®ï¼\n"
-"ä¹è®¸è¿æ¯ä¸ä¸ªæ§çä¼è¯æ ¼å¼ï¼"
-
-#: session_metadata_dialog.cc:918
-msgid "Import all from:"
-msgstr "导å
¥ææä»ï¼"
+"æä»¶æ¥æºï¼ æç´¢æ¶ \"%1\" ä¸å¯ç¡®å®\n"
+"\t"
-#: session_option_editor.cc:32
-msgid "Session Properties"
-msgstr "ä¼è¯å±æ§ "
+#: file_source.cc:441
+msgid "Filesource: cannot find required file (%1)"
+msgstr "æä»¶æ¥æºï¼æ¾ä¸å°æéçæä»¶ï¼%1ï¼"
-#: session_option_editor.cc:41
-msgid "Timecode Settings"
-msgstr "æ¶é´ç 设置"
+#: file_source.cc:486
+msgid "Filesource: cannot find required file (%1): %2"
+msgstr "æä»¶æ¥æºï¼æ¾ä¸å°æéçæä»¶ï¼%1ï¼ï¼%2"
-#: session_option_editor.cc:45
-msgid "Timecode frames-per-second"
-msgstr "æ¶é´ç å¸§æ°æ¯ç§"
-
-#: session_option_editor.cc:50
-msgid "23.976"
-msgstr ""
-
-#: session_option_editor.cc:51
-msgid "24"
-msgstr ""
+#: file_source.cc:494
+msgid "Filesource: cannot check for existing file (%1): %2"
+msgstr "æä»¶æ¥æºï¼æ æ³æ£æ¥ç°ææä»¶ï¼%1ï¼ï¼%2"
-#: session_option_editor.cc:52
-msgid "24.975"
+#: file_source.cc:589
+msgid ""
+"Programming error! %1 tried to rename a file over another file! It's safe to "
+"continue working, but please report this to the developers."
msgstr ""
+"ç¨åºé误ï¼%1 è¯å¾å¨å¦ä¸ä¸ªæä»¶ä¸éå½åä¸ä¸ªæä»¶ï¼å®å¯ä»¥ç»§ç»å·¥ä½ï¼ä½è¯·æè¿ä»¶äºæ¥"
+"åç»å¼å人åã"
-#: session_option_editor.cc:53
-msgid "25"
-msgstr ""
+#: file_source.cc:596
+msgid "cannot rename file %1 to %2 (%3)"
+msgstr "æ æ³éå½åæä»¶ %1 为 %2ï¼%3ï¼"
-#: session_option_editor.cc:54
-msgid "29.97"
-msgstr ""
+#: filesystem_paths.cc:120
+msgid "Cannot create Configuration directory %1 - cannot run"
+msgstr "æ æ³å建é
ç½®ç®å½ %1 ââæ æ³è¿è¡"
-#: session_option_editor.cc:55
-msgid "29.97 drop"
-msgstr "29.97 丢帧"
+#: filesystem_paths.cc:125
+msgid ""
+"Configuration directory %1 already exists and is not a directory/folder - "
+"cannot run"
+msgstr "é
ç½®ç®å½ %1 å·²åå¨å¹¶ä¸ä¸æ¯ä¸ä¸ªç®å½/æä»¶å¤¹ââæ æ³è¿è¡"
-#: session_option_editor.cc:56
-msgid "30"
-msgstr ""
+#: filesystem_paths.cc:186
+msgid "Cannot create cache directory %1 - cannot run"
+msgstr "æ æ³å建ç¼åç®å½ %1 ââæ æ³è¿è¡"
-#: session_option_editor.cc:57
-msgid "30 drop"
-msgstr "30 丢帧"
+#: filesystem_paths.cc:191
+msgid ""
+"Cache directory %1 already exists and is not a directory/folder - cannot run"
+msgstr "ç¼åç®å½ %1 å·²åå¨å¹¶ä¸ä¸æ¯ä¸ä¸ªç®å½/æä»¶å¤¹ââæ æ³è¿è¡"
-#: session_option_editor.cc:58
-msgid "59.94"
-msgstr ""
+#: filesystem_paths.cc:209
+msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
+msgstr "å¨ç¯å¢ä¸æªè®¾ç½®ARDOUR_DLL_PATH ââæ£å¨éåº\n"
-#: session_option_editor.cc:59
-msgid "60"
-msgstr ""
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr "æ æ³ç¡®å® %1 软件å
ç®å½"
-#: session_option_editor.cc:65
-msgid "Pull-up / pull-down"
-msgstr "䏿 / 䏿"
+#: filesystem_paths.cc:277
+msgid "ARDOUR_CONFIG_PATH not set in environment\n"
+msgstr "å¨ç¯å¢ä¸æªè®¾ç½®ARDOUR_CONFIG_PATH\n"
-#: session_option_editor.cc:70
-msgid "4.1667 + 0.1%"
-msgstr ""
+#: filesystem_paths.cc:298
+msgid "ARDOUR_DATA_PATH not set in environment\n"
+msgstr "å¨ç¯å¢ä¸æªè®¾ç½®ARDOUR_DATA_PATH\n"
-#: session_option_editor.cc:71
-msgid "4.1667"
-msgstr ""
+#: filter.cc:67
+msgid "filter: error creating name for new file based on %1"
+msgstr "滤éï¼åºäº %1 ä¸ºæ°æä»¶å建åç§°åºé"
-#: session_option_editor.cc:72
-msgid "4.1667 - 0.1%"
-msgstr ""
+#: filter.cc:92
+msgid "filter: error creating new file %1 (%2)"
+msgstr "滤éï¼åå»ºæ°æä»¶ %1ï¼%2ï¼åºé"
-#: session_option_editor.cc:73
-msgid "0.1"
-msgstr ""
+#: find_session.cc:60
+msgid "cannot check session path %1 (%2)"
+msgstr "æ æ³æ£æ¥ä¼è¯è·¯å¾ %1ï¼%2ï¼"
-#: session_option_editor.cc:74
-msgid "none"
-msgstr "æ "
+#: find_session.cc:86
+msgid "cannot check statefile %1 (%2)"
+msgstr "æ æ³æ£æ¥ç¶ææä»¶ %1ï¼%2ï¼"
-#: session_option_editor.cc:75
-msgid "-0.1"
-msgstr ""
+#: find_session.cc:125
+msgid "%1 is not a snapshot file"
+msgstr "%1䏿¯ä¸ä¸ªå¿«ç
§æä»¶"
-#: session_option_editor.cc:76
-msgid "-4.1667 + 0.1%"
-msgstr ""
+#: find_session.cc:142
+msgid "cannot determine current working directory (%1)"
+msgstr "æ æ³ç¡®å®å½åå·¥ä½ä¸çç®å½ï¼%1ï¼"
-#: session_option_editor.cc:77
-msgid "-4.1667"
-msgstr ""
+#: find_session.cc:159
+msgid "unknown file type for session %1"
+msgstr "å
³äºä¼è¯ %1 æªç¥çæä»¶ç±»å"
-#: session_option_editor.cc:78
-msgid "-4.1667 - 0.1%"
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
msgstr ""
-#: session_option_editor.cc:84
-msgid ""
-"Use Video File's FPS Instead of Timecode Value for Timeline and Video Monitor."
-msgstr "为æ¶é´çº¿åè§é¢çæ§ä½¿ç¨è§é¢æä»¶ç FPS æ¿ä»£æ¶é´ç æ°å¼ã"
-
-#: session_option_editor.cc:91
-msgid ""
-"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-sync)."
-msgstr "åºç¨ä¸æ/䏿å°è§é¢æ¶é´çº¿åè§é¢çæ§ï¼é¤éä½¿ç¨ JACK-忥ï¼"
-
-#: session_option_editor.cc:96
-msgid "Ext Timecode Offsets"
-msgstr "å¤é¨æ¶é´ç åç§»"
-
-#: session_option_editor.cc:100
-msgid "Slave Timecode offset"
-msgstr "ä»å±æ¶é´ç åç§»"
-
-#: session_option_editor.cc:107
-msgid "The specified offset is added to the received timecode (MTC or LTC)."
-msgstr "æå®çå移已被添å å°å·²æ¥æ¶çæ¶é´ç ï¼MTC æ LTCï¼ã"
-
-#: session_option_editor.cc:113
-msgid "Timecode Generator offset"
-msgstr "æ¶é´ç çæå¨åç§»"
+#: globals.cc:266
+msgid "Could not set system open files limit to \"unlimited\""
+msgstr "æ æ³è®¾ç½®ç³»ç»æå¼æä»¶éå¶ä¸ºâæ éå¶â"
-#: session_option_editor.cc:120
-msgid "Specify an offset which is added to the generated timecode (so far only LTC)."
-msgstr "æå®ä¸ä¸ªå·²è¢«æ·»å å°éç¨æ¶é´ç çåç§»ï¼è¿ä»ä¸ºæ¢ä»
æ LTCï¼ã"
+#: globals.cc:268
+msgid "Could not set system open files limit to %1"
+msgstr "æ æ³è®¾ç½®ç³»ç»æå¼æä»¶éå¶ä¸º %1"
-#: session_option_editor.cc:124
-msgid "JACK Transport/Time Settings"
-msgstr "JACK æé/æ¶é´è®¾ç½®"
+#: globals.cc:272 globals.cc:289
+msgid "Your system is configured to limit %1 to only %2 open files"
+msgstr "æ¨çç³»ç»å·²é
ç½®éå® %1 å°ä»
%2 æå¼æä»¶"
-#: session_option_editor.cc:128
-msgid "%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
-msgstr "%1 æ¯ JACK æ¶é´ä¸»æ§ï¼æä¾å°è|æå|è¯å«å£°ä»¥åå
¶å®ä¿¡æ¯ç» JACKï¼"
+#: globals.cc:276
+msgid "Could not get system open files limit (%1)"
+msgstr "æ æ³è·åç³»ç»æå¼æä»¶éå¶ï¼%1ï¼"
-#: session_option_editor.cc:136
-msgid "destructive-xfade-seconds"
-msgstr "鿝åç½®å置淡åç§æ°"
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr "æ æ³è®¾ç½®ç³»ç»æå¼æä»¶éå¶ãå½åéå¶æ¯ %1 æå¼æä»¶"
-#: session_option_editor.cc:137
-msgid "Destructive crossfade length"
-msgstr "éæ¯äº¤åæ·¡åé¿åº¦"
+#: globals.cc:474
+msgid "Loading configuration"
+msgstr "æ£å¨è½½å
¥é
ç½®ä¸"
-#: session_option_editor.cc:146
-msgid "Region fades active"
-msgstr "åºåæ·¡åæ¿æ´»"
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr "çæ§"
-#: session_option_editor.cc:153
-msgid "Region fades visible"
-msgstr "åºåæ·¡åå¯è§"
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr "主æ§"
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
-msgid "Media"
-msgstr "åªä½"
+#: globals.cc:556
+msgid "Control"
+msgstr "æ§å¶"
-#: session_option_editor.cc:160
-msgid "Audio file format"
-msgstr "é³é¢æä»¶æ ¼å¼"
+#: globals.cc:557
+msgid "Click"
+msgstr "é³é¢è¯å«å£°ï¼èæå¨ï¼"
-#: session_option_editor.cc:164
-msgid "Sample format"
-msgstr "éæ ·æ ¼å¼"
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
-#: session_option_editor.cc:169
-msgid "32-bit floating point"
-msgstr "32 使µ®ç¹"
+#: import.cc:146
+msgid "Cannot find new filename for imported file %1"
+msgstr "æ æ³ä¸ºå¯¼å
¥çæä»¶ %1 æ¾å°æ°çæä»¶å"
-#: session_option_editor.cc:170
-msgid "24-bit integer"
-msgstr "24 使´æ°"
+#: import.cc:166
+msgid "Could not find a source for %1 even though we are updating this file!"
+msgstr "æ æ³ä¸º %1 æ¾å°ä¸ä¸ªæ¥æºï¼å°½ç®¡æä»¬æ£å¨æ´æ°è¿ä¸ªæä»¶ï¼"
-#: session_option_editor.cc:171
-msgid "16-bit integer"
-msgstr "16 使´æ°"
+#: import.cc:195
+msgid "Unable to create file %1 during import"
+msgstr "导å
¥è¿ç¨ä¸æ æ³å建æä»¶ %1 "
-#: session_option_editor.cc:177
-msgid "File type"
-msgstr "æä»¶ç±»å"
+#: import.cc:221
+msgid "Resampling %1 from %2kHz to %3kHz"
+msgstr " éæ°éæ · %1 ä» %2kHz å° %3kHz"
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "广æ WAVE"
+#: import.cc:227
+msgid "Copying %1"
+msgstr "æ£å¨å¤å¶ %1 ä¸"
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr ""
+#: import.cc:420
+msgid "Track %1 of %2 contained no usable MIDI data"
+msgstr "%2 ç %1 é³è½¨å
嫿ä¸å¯ç¨ç MIDI æ°æ®"
-#: session_option_editor.cc:184
-msgid "WAVE-64"
-msgstr ""
+#: import.cc:427
+msgid "MIDI file could not be written (best guess: %1)"
+msgstr "MIDI æä»¶æ æ³åå
¥ï¼æä¹è§çæµï¼%1ï¼"
-#: session_option_editor.cc:189
-msgid "File locations"
-msgstr "æä»¶ä½ç½®"
-
-#: session_option_editor.cc:191
-msgid "Search for audio files in:"
-msgstr "æç´¢é³é¢æä»¶äºï¼"
-
-#: session_option_editor.cc:197
-msgid "Search for MIDI files in:"
-msgstr "æç´¢ MIDI æä»¶äºï¼"
-
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
-msgid "Filenames"
-msgstr "æä»¶å"
-
-#: session_option_editor.cc:206
-msgid "File Naming"
-msgstr "æä»¶å½å"
-
-#: session_option_editor.cc:212
-msgid "Prefix Track number"
-msgstr "é³è½¨ç¼å·åç¼"
-
-#: session_option_editor.cc:217
-msgid "Adds the current track number to the beginning of the recorded file name."
-msgstr "æ·»å å½åé³è½¨ç¼å·å°å·²å½å¶æä»¶åçå端ã"
-
-#: session_option_editor.cc:222
-msgid "Prefix Take Name"
-msgstr "ç£å¸¦åç§°åç¼"
-
-#: session_option_editor.cc:227
-msgid "Adds the Take Name to the beginning of the recorded file name."
-msgstr "æ·»å ç£å¸¦åç§°å°å·²å½å¶æä»¶åçå端ã"
-
-#: session_option_editor.cc:232
-msgid "Take Name"
-msgstr "ç£å¸¦åç§°"
-
-#: session_option_editor.cc:245
-msgid "Track Input Monitoring automatically follows transport state (\"auto-input\")"
-msgstr "é³è½¨è¾å
¥çæ§èªå¨åè·éæéç¶æï¼âèªå¨è¾å
¥âï¼"
-
-#: session_option_editor.cc:252
-msgid "Use monitor section in this session"
-msgstr "å¨è¯¥ä¼è¯ä¸ä½¿ç¨ççæ§é¢"
-
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
-msgid "Meterbridge"
-msgstr "èææ¡¥æ¥"
-
-#: session_option_editor.cc:257
-msgid "Route Display"
-msgstr "è·¯ç±æ¾ç¤º"
-
-#: session_option_editor.cc:261
-msgid "Show Midi Tracks"
-msgstr "æ¾ç¤º MIDI é³è½¨"
-
-#: session_option_editor.cc:268
-msgid "Show Busses"
-msgstr "æ¾ç¤ºæ»çº¿"
-
-#: session_option_editor.cc:275
-msgid "Include Master Bus"
-msgstr "å
æ¬ä¸»æ§æ»çº¿"
-
-#: session_option_editor.cc:280
-msgid "Button Area"
-msgstr "æé®åºå"
-
-#: session_option_editor.cc:284
-msgid "Rec-enable Button"
-msgstr "å¯å½å¶æé®"
-
-#: session_option_editor.cc:291
-msgid "Mute Button"
-msgstr "é鳿é®"
-
-#: session_option_editor.cc:298
-msgid "Solo Button"
-msgstr "ç¬å¥æé®"
-
-#: session_option_editor.cc:305
-msgid "Monitor Buttons"
-msgstr "çæ§æé®"
-
-#: session_option_editor.cc:310
-msgid "Name Labels"
-msgstr "åç§°æ ç¾"
-
-#: session_option_editor.cc:314
-msgid "Track Name"
-msgstr "é³è½¨åç§°"
-
-#: session_option_editor.cc:325
-msgid "MIDI region copies are independent"
-msgstr "MIDI åºåæ·è´ä¸å约æ"
-
-#: session_option_editor.cc:332
-msgid ""
-"Policy for handling overlapping notes\n"
-" on the same MIDI channel"
-msgstr "å¤çä½äºåä¸ä¸ª MIDI 声éä¸çéå é³ç¬¦ççç¥"
+#: import.cc:475
+msgid "Import: cannot open input sound file \"%1\""
+msgstr "导å
¥ï¼æ æ³æå¼è¾å
¥å£°é³æä»¶ \"%1\""
-#: session_option_editor.cc:337
-msgid "never allow them"
-msgstr "ä»ä¸å
许å®ä»¬"
+#: import.cc:486
+msgid "Import: error opening MIDI file"
+msgstr "导å
¥ï¼æå¼ MIDI æä»¶åºé"
-#: session_option_editor.cc:338
-msgid "don't do anything in particular"
-msgstr "ä¸åä»»ä½ç¹æ®å¤ç"
+#: import.cc:493
+msgid "Import: file contains no channels."
+msgstr "导å
¥ï¼æä»¶ä¸å
å«å£°é"
-#: session_option_editor.cc:339
-msgid "replace any overlapped existing note"
-msgstr "æ¿æ¢ææå·²åå¨çéå é³ç¬¦"
+#: import.cc:527
+msgid "Loading MIDI file %1"
+msgstr "æ£å¨è½½å
¥ MIDI æä»¶ %1 ä¸"
-#: session_option_editor.cc:340
-msgid "shorten the overlapped existing note"
-msgstr "缩çå·²åå¨çéå é³ç¬¦"
+#: import.cc:592
+msgid "Failed to remove some files after failed/cancelled import operation"
+msgstr "å¨å¯¼å
¥æä½å¤±è´¥/åæ¶åç§»é¤ä¸äºæä»¶å¤±è´¥"
-#: session_option_editor.cc:341
-msgid "shorten the overlapping new note"
-msgstr "缩çå·²åå¨çæ°é³ç¬¦"
+#: instrument_info.cc:41 instrument_info.cc:62
+msgid "Unknown"
+msgstr "æªç¥ç"
-#: session_option_editor.cc:342
-msgid "replace both overlapping notes with a single note"
-msgstr "æéå çé³ç¬¦æ¿æ¢ä¸ºä¸ä¸ªå个é³ç¬¦"
+#: instrument_info.cc:243
+msgid "preset %1 (bank %2)"
+msgstr "é¢è®¾ %1ï¼åº %2ï¼"
-#: session_option_editor.cc:346
-msgid "Glue to bars and beats"
-msgstr "ç²è¿å°å°èåæå"
+#: internal_send.cc:338 internal_send.cc:339
+msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
+msgstr "%1 ââæ æ³æ¾å°ä»»ä½å¸¦æ %2 ç ID å·çé³è½¨/æ»çº¿æ¥è¿æ¥"
-#: session_option_editor.cc:350
-msgid "Glue new markers to bars and beats"
-msgstr "ç²è¿æ°çæ è®°å°å°èåæå"
+#: io.cc:212
+msgid "IO: cannot disconnect port %1 from %2"
+msgstr "è¾å
¥è¾åºï¼æ æ³ä» %2 æ¤éè¿æ¥ç«¯å£ %1"
-#: session_option_editor.cc:357
-msgid "Glue new regions to bars and beats"
-msgstr "ç²è¿æ°çåºåå°å°èåæå"
+#: io.cc:347 io.cc:435
+msgid "IO: cannot register input port %1"
+msgstr "è¾å
¥è¾åºï¼æ æ³æ³¨åè¾å
¥ç«¯å£ %1"
-#: session_option_editor.cc:362
-msgid "Defaults"
-msgstr "é»è®¤"
+#: io.cc:352 io.cc:440
+msgid "IO: cannot register output port %1"
+msgstr "è¾å
¥è¾åºï¼æ æ³æ³¨åè¾åºç«¯å£ %1"
-#: session_option_editor.cc:364
-msgid "Use these settings as defaults"
-msgstr "使ç¨è¿äºè®¾ç½®ä½ä¸ºé»è®¤"
+#: io.cc:607 io.cc:668
+msgid "incorrect XML node \"%1\" passed to IO object"
+msgstr "é误ç XML èç¹ \"%1\" å·²éè¿è¾å
¥è¾åºå¯¹è±¡ç©ä½"
-#: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
-msgid "as new tracks"
-msgstr "ä½ä¸ºæ°çé³è½¨"
+#: io.cc:730
+msgid "in"
+msgstr "å
¥"
-#: sfdb_ui.cc:92 sfdb_ui.cc:112
-msgid "to selected tracks"
-msgstr "å°å·²éä¸çé³è½¨"
+#: io.cc:730
+msgid "out"
+msgstr "åº"
-#: sfdb_ui.cc:94 sfdb_ui.cc:114
-msgid "to region list"
-msgstr "å°åºåå表"
+#: io.cc:731
+msgid "input"
+msgstr "è¾å
¥"
-#: sfdb_ui.cc:96 sfdb_ui.cc:116
-msgid "as new tape tracks"
-msgstr "ä½ä¸ºæ°çç£å¸¦é³è½¨"
+#: io.cc:731
+msgid "output"
+msgstr "è¾åº"
-#: sfdb_ui.cc:100
-msgid "programming error: unknown import mode string %1"
-msgstr "ç¨åºéè¯¯ï¼æªç¥ç导å
¥æ¨¡å¼å符串 %1"
+#: io.cc:741
+msgid "Unknown bundle \"%1\" listed for %2 of %3"
+msgstr "æªç¥çéæ \"%1\" 已为 %3 ç %2 ç½ååº"
-#: sfdb_ui.cc:127
-msgid "Auto-play"
-msgstr "èªå¨ææ¾"
+#: io.cc:807
+msgid "Bundle %1 was not available - \"%2\" used instead"
+msgstr "éæ %1 ä¸å¯ç¨ââä½¿ç¨ \"%2\" 代æ¿"
-#: sfdb_ui.cc:135 sfdb_ui.cc:324
-msgid "<b>Sound File Information</b>"
-msgstr "<b>å£°é³æä»¶ä¿¡æ¯</b>"
+#: io.cc:810
+msgid "No %1 bundles available as a replacement"
+msgstr "æ %1 éæå¯ç¨äºä½ä¸ºæ¿ä»£"
-#: sfdb_ui.cc:147
-msgid "Timestamp:"
-msgstr "æ¶é´æ³ï¼"
+#: io.cc:914
+msgid "%1: cannot create I/O ports"
+msgstr "%1ï¼æ æ³å建è¾å
¥/è¾åºç«¯å£"
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "æ ¼å¼ï¼"
+#: io.cc:1042 io.cc:1143
+msgid "IO: badly formed string in XML node for inputs \"%1\""
+msgstr "è¾å
¥è¾åºï¼å¨ XML èç¹éç¨äºè¾å
¥ \"%1\" çåç¬¦ä¸²å½¢å¼æ··ä¹±"
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
-msgid "Tags:"
-msgstr "æ ç¾ï¼"
+#: io.cc:1047 io.cc:1148
+msgid "bad input string in XML node \"%1\""
+msgstr "å¨ XML èç¹ \"%1\" éé误è¾å
¥çå符串"
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "æ æ³è¯»åæä»¶ï¼ %1 (%2)."
+#: io.cc:1086
+msgid "IO: badly formed string in XML node for outputs \"%1\""
+msgstr "è¾å
¥è¾åºï¼å¨ XML èç¹éç¨äºè¾åº \"%1\" çåç¬¦ä¸²å½¢å¼æ··ä¹±"
-#: sfdb_ui.cc:297
-msgid "<b>Midi File Information</b>"
-msgstr "<b>Midi æä»¶ä¿¡æ¯</b>"
+#: io.cc:1091
+msgid "IO: bad output string in XML node \"%1\""
+msgstr "è¾å
¥è¾åºï¼å¨ XML èç¹ \"%1\" éé误è¾åºçå符串"
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "æ æ³è®¿é®å£°é³æä»¶ï¼ "
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
-#: sfdb_ui.cc:530
-msgid "SoundFileBox: Could not tokenize string: "
-msgstr "声鳿件çï¼æ æ³ä»¤çååç¬¦ä¸²ï¼ "
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
-#: sfdb_ui.cc:550 sfdb_ui.cc:552
-msgid "Search"
-msgstr "æç´¢"
+#: io.cc:1454
+#, c-format
+msgid "%s %u"
+msgstr ""
-#: sfdb_ui.cc:576
-msgid "Audio and MIDI files"
-msgstr "é³é¢å MIDI æä»¶"
+#: io.cc:1501
+#, c-format
+msgid "%s in"
+msgstr "%s å
¥"
-#: sfdb_ui.cc:579
-msgid "Audio files"
-msgstr "é³é¢æä»¶"
+#: io.cc:1503
+#, c-format
+msgid "%s out"
+msgstr "%s åº"
-#: sfdb_ui.cc:582
-msgid "MIDI files"
-msgstr "MIDI æä»¶"
+#: io.cc:1578 session.cc:957 session.cc:991
+msgid "mono"
+msgstr "å声é"
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
-msgid "All files"
-msgstr "æææä»¶"
+#: io.cc:1580 session.cc:970 session.cc:1005
+msgid "L"
+msgstr "å·¦"
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
-msgid "Browse Files"
-msgstr "æµè§æä»¶"
+#: io.cc:1580 session.cc:972 session.cc:1007
+msgid "R"
+msgstr "å³"
-#: sfdb_ui.cc:633
-msgid "Paths"
-msgstr "è·¯å¾"
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr "LADSPAï¼æ æ³æå¼æ¨¡åï¼"
-#: sfdb_ui.cc:642
-msgid "Search Tags"
-msgstr "æç´¢æ ç¾"
+#: ladspa_plugin.cc:99
+msgid "LADSPA: module has no descriptor function."
+msgstr "LADSPAï¼æ¨¡å没ææè¿°ç¬¦å½æ°ã"
-#: sfdb_ui.cc:658
-msgid "Sort:"
-msgstr "æåºï¼"
+#: ladspa_plugin.cc:106
+msgid "LADSPA: plugin has gone away since discovery!"
+msgstr "LADSPAï¼æä»¶èªä»è¢«åç°ä»¥æ¥å°±å·²ç»æ¶å¤±ï¼"
-#: sfdb_ui.cc:666
-msgid "Longest"
-msgstr "æé¿"
+#: ladspa_plugin.cc:113
+msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
+msgstr "LADSPAï¼æ æ³ä½¿ç¨\"%1\"ï¼å ä¸ºå®æ æ³å°±å°å¤ç"
-#: sfdb_ui.cc:667
-msgid "Shortest"
-msgstr "æç"
+#: ladspa_plugin.cc:308
+msgid ""
+"illegal parameter number used with plugin \"%1\". This may indicate a change "
+"in the plugin design, and presets may be invalid"
+msgstr ""
+"æä»¶ \"%1\" 使ç¨äºéæ³åæ°ç¼å·ãè¿å¯è½è¡¨æä¸ä¸ªæä»¶è®¾è®¡çååï¼ä»¥åé¢è®¾å¯è½æ¯"
+"æ æç"
-#: sfdb_ui.cc:668
-msgid "Newest"
-msgstr "ææ°"
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
+msgid "Bad node sent to LadspaPlugin::set_state"
+msgstr "é误èç¹åéå° LadspaPlugin::set_state"
-#: sfdb_ui.cc:669
-msgid "Oldest"
-msgstr "ææ§"
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
+msgid "LADSPA: no ladspa port number"
+msgstr "LADSPAï¼æ²¡æ ladspa 端å£å·"
-#: sfdb_ui.cc:670
-msgid "Most downloaded"
-msgstr "æå¤ä¸è½½"
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
+msgid "LADSPA: no ladspa port data"
+msgstr "LADSPAï¼æ²¡æ ladspa ç«¯å£æ°æ®"
-#: sfdb_ui.cc:671
-msgid "Least downloaded"
-msgstr "ææ°ä¸è½½"
+#: ladspa_plugin.cc:863
+msgid "Could not locate HOME. Preset not removed."
+msgstr "æ æ³å®ä½ HOMEãé¢è®¾æªå é¤ã"
-#: sfdb_ui.cc:672
-msgid "Highest rated"
-msgstr "æé«è¯ä»·"
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
+msgid "Could not create %1. Preset not saved. (%2)"
+msgstr "æ æ³å建 %1ãé¢è®¾æªä¿åãï¼%2ï¼"
-#: sfdb_ui.cc:673
-msgid "Lowest rated"
-msgstr "æä½è¯ä»·"
+#: ladspa_plugin.cc:915
+msgid "Error saving presets file %1."
+msgstr "ä¿åé¢è®¾æä»¶ %1 æ¶åºéã"
-#: sfdb_ui.cc:678
-msgid "More"
-msgstr "æ´å¤"
+#: ladspa_plugin.cc:957
+msgid "Could not locate HOME. Preset not saved."
+msgstr "æ æ³å®ä½ HOMEãé¢è®¾æªä¿åã"
-#: sfdb_ui.cc:682
-msgid "Similar"
-msgstr "类似ç"
+#: location.cc:455
+msgid "You cannot put a CD marker at this position"
+msgstr "æ¨ä¸è½å®æ¾ä¸ä¸ª CD æ è®°å¨è¿ä¸ªä½ç½®"
-#: sfdb_ui.cc:694
-msgid "ID"
-msgstr ""
+#: location.cc:607
+msgid "incorrect XML node passed to Location::set_state"
+msgstr "䏿£ç¡®ç XMLèç¹ä¼ éç» Location::set_state"
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
-msgid "Filename"
-msgstr "æä»¶å"
+#: location.cc:612
+msgid "XML node for Location has no ID information"
+msgstr "ç¨äºå®ä½ç XML èç¹æ²¡æ ID ä¿¡æ¯"
-#: sfdb_ui.cc:697
-msgid "Duration"
-msgstr "é³é¿"
+#: location.cc:616
+msgid "XML node for Location has no name information"
+msgstr "ç¨äºå®ä½ç XML èç¹æ²¡æåç§°ä¿¡æ¯"
-#: sfdb_ui.cc:698
-msgid "Size"
-msgstr "尺寸"
+#: location.cc:623
+msgid "XML node for Location has no start information"
+msgstr "ç¨äºå®ä½ç XML èç¹æ²¡æèµ·ç¹ä¿¡æ¯"
-#: sfdb_ui.cc:699
-msgid "Samplerate"
-msgstr "éæ ·ç"
+#: location.cc:634
+msgid "XML node for Location has no end information"
+msgstr "ç¨äºå®ä½ç XML èç¹æ²¡æç»ç¹ä¿¡æ¯"
-#: sfdb_ui.cc:700
-msgid "License"
-msgstr "许å¯è¯"
+#: location.cc:641
+msgid "XML node for Location has no flags information"
+msgstr "ç¨äºå®ä½ç XML èç¹æ²¡ææ å¿ä¿¡æ¯"
-#: sfdb_ui.cc:718
-msgid "Search Freesound"
-msgstr "æç´¢èªç±å£°é³"
+#: location.cc:868
+msgid "Locations: attempt to use unknown location as selected location"
+msgstr "ä½ç½®ï¼å°è¯ä½¿ç¨æªç¥çä½ç½®ä½ä¸ºå·²éæ©çä½ç½®"
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr "æä¸æå
¥å·²éä¸çæä»¶å¹¶ä¸å
³éæ¤çªå£"
+#: location.cc:1046
+msgid "incorrect XML mode passed to Locations::set_state"
+msgstr "䏿£ç¡®ç XML模å¼ä¼ éç» Location::set_state"
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr "æä¸æå
¥å·²éä¸çæä»¶å¹¶ä¸ä¿çæ¤çªå£"
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
+msgid "session"
+msgstr "ä¼è¯"
-#: sfdb_ui.cc:740
-msgid "Press to close this window without importing any files"
-msgstr "æä¸å
³éæ¤çªå£å¹¶ä¸ä¸æå
¥ä»»ä½æä»¶"
+#: location.cc:1126
+msgid "could not load location from session file - ignored"
+msgstr "æ æ³ä»ä¼è¯æä»¶è½½å
¥ä½ç½®ââ已忽ç¥"
-#: sfdb_ui.cc:936
-msgid "SoundFileBrowser: Could not tokenize string: "
-msgstr "声鳿件æµè§å¨ï¼æ æ³ä»¤çååç¬¦ä¸²ï¼ "
+#: location_importer.cc:61
+msgid "Locations"
+msgstr "ä½ç½®"
-#: sfdb_ui.cc:1136
-msgid "%1 more page of 100 results available"
-msgid_plural "%1 more pages of 100 results available"
-msgstr[0] "%1 æ 100 å¤é¡µç»æå¯ç¨"
+#: location_importer.cc:123
+msgid "Location: "
+msgstr "ä½ç½®ï¼"
-#: sfdb_ui.cc:1141
-msgid "No more results available"
-msgstr "æ æ´å¤ç»æå¯ç¨"
+#: location_importer.cc:125
+msgid ""
+"Range\n"
+"start: "
+msgstr ""
+"èå´\n"
+"èµ·ç¹ï¼"
-#: sfdb_ui.cc:1205
-msgid "B"
+#: location_importer.cc:126
+msgid ""
+"\n"
+"end: "
msgstr ""
+"\n"
+"ç»ç¹ï¼"
-#: sfdb_ui.cc:1207
-msgid "kB"
+#: location_importer.cc:146
+msgid ""
+"The location is the Punch range. It will be imported as a normal range.\n"
+"You may rename the imported location:"
msgstr ""
+"该ä½ç½®æ¯ä¸ªåæ¢èå´ãå®å°è¢«ä½ä¸ºä¸ä¸ªæ®éèå´è导å
¥ã\n"
+"æ¨å¯ä»¥éå½å被导å
¥çä½ç½®ï¼"
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
-msgid "MB"
+#: location_importer.cc:157
+msgid ""
+"The location is a Loop range. It will be imported as a normal range.\n"
+"You may rename the imported location:"
msgstr ""
+"该ä½ç½®æ¯ä¸ªå¾ªç¯èå´ãå®å°è¢«ä½ä¸ºä¸ä¸ªæ®éèå´è导å
¥ã\n"
+"æ¨å¯ä»¥éå½å被导å
¥çä½ç½®ï¼"
-#: sfdb_ui.cc:1213
-msgid "GB"
+#: location_importer.cc:168
+msgid ""
+"A location with that name already exists.\n"
+"You may rename the imported location:"
msgstr ""
+"å·²ç»æä¸ä¸ªç¸ååç§°çä½ç½®åå¨ã\n"
+"æ¨å¯ä»¥éå½å导å
¥çä½ç½®ï¼"
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
-msgid "one track per file"
-msgstr "æ¯ä¸ªæä»¶ä¸ä¸ªé³è½¨"
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr "LTCï¼çºµåæ¶é´ç ï¼æä»¶é
读å¨ï¼æ æ³æå¼æä»¶ \"%1\""
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
-msgid "one track per channel"
-msgstr "æ¯ä¸ªå£°éä¸ä¸ªé³è½¨"
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr "çºµåæ¶é´ç ï¼æä»¶é
读å¨ï¼æ æ³æå¼æä»¶ \"%1\" (%3)"
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
-msgid "sequence files"
-msgstr "åºåæä»¶"
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼æä»¶é
读å¨ï¼ \"%1\" æ¯ä¸ä¸ªç©ºç½é³é¢æä»¶"
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
-msgid "all files in one track"
-msgstr "æææä»¶å¨ä¸ä¸ªé³è½¨ä¸"
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr "LTCï¼çºµåæ¶é´ç ï¼æä»¶é
è¯»å¨ :: æ æçé³é¢å£°é已鿩"
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
-msgid "merge files"
-msgstr "åå¹¶æä»¶"
+#: ltc_slave.cc:275
+msgid "Session framerate adjusted from %1 to LTC's %2."
+msgstr "ä¼è¯å¸§çä» %1 å·²è°æ´ä¸º LTCï¼çºµåæ¶é´ç ï¼ç %2ã"
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
-msgid "one region per file"
-msgstr "æ¯ä¸ªæä»¶ä¸ä¸ªåºå"
+#: ltc_slave.cc:289
+msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
+msgstr ""
+"ä¼è¯ä¸LTCï¼çºµåæ¶é´ç ï¼ç帧çä¸å¹é
ï¼ LTCï¼çºµåæ¶é´ç ï¼ï¼%1 ä¼è¯ï¼ %2ã"
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
-msgid "one region per channel"
-msgstr "æ¯ä¸ªå£°éä¸ä¸ªåºå"
+#: ltc_slave.cc:609
+msgid "flywheel"
+msgstr "é£è½®"
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
-msgid "all files in one region"
-msgstr "æææä»¶å¨ä¸ä¸ªåºåé"
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr "æªæ¾å°å¸¦æç»å®åç§°çèæ¬\n"
-#: sfdb_ui.cc:1521
-msgid ""
-"One or more of the selected files\n"
-"cannot be used by %1"
-msgstr ""
-"ä¸ä¸ªæå¤ä¸ªå·²éä¸çæä»¶\n"
-"ä¸è½è¢«ç¨äº %1"
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr "å®ä¾å Lua å¤çå¨å¤±è´¥\n"
-#: sfdb_ui.cc:1665
-msgid "Copy files to session"
-msgstr "å¤å¶æä»¶å°ä¼è¯"
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr "ä»ä¼è¯ç¶æè½½å
¥ Lua èæ¬å¤±è´¥ã"
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
-msgid "file timestamp"
-msgstr "æä»¶æ¶é´æ³"
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr "ç¨äº LuaProcessor çä¼è¯ç¶ææ²¡æå
æ¬ä¸ä¸ª Lua èæ¬ã"
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
-msgid "edit point"
-msgstr "ç¼è¾ç¹"
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr "åç°ç¨äº LuaProcessor çæ æç/ä¸å
¼å®¹ç Lua èæ¬ã"
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
-msgid "playhead"
-msgstr "æé"
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr "åèç¹åéå° LuaProc::set_state"
-#: sfdb_ui.cc:1685
-msgid "session start"
-msgstr "ä¼è¯èµ·ç¹"
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr "LuaProcï¼ç«¯å£æ²¡æç¬¦å·ï¼å·²å¿½ç¥"
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
-msgstr "<b>æ·»å æä»¶ä¸ºâ¦</b>"
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr "LuaProcï¼ç«¯å£æ²¡ææ°å¼ï¼å·²å¿½ç¥"
-#: sfdb_ui.cc:1713
-msgid "<b>Insert at</b>"
-msgstr "<b>æå
¥äº</b>"
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
-#: sfdb_ui.cc:1726
-msgid "<b>Mapping</b>"
-msgstr "<b>æ å°</b>"
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr "èæ¬ '%1' æ²¡æææçæè¿°ç¬¦ã"
-#: sfdb_ui.cc:1744
-msgid "<b>Conversion quality</b>"
-msgstr "<b>转æ¢è´¨é</b>"
+#: midi_diskstream.cc:172
+msgid ""
+"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
+msgstr "%1ï¼è¾å
¥/è¾åºé
ç½®æ¹å %4 è¦æ±ä½¿ç¨ %2ï¼ä½å£°éè®¾ç½®æ¯ %3"
-#: sfdb_ui.cc:1756
-msgid "<b>Instrument</b>"
-msgstr "<b>ä¹å¨</b>"
+#: midi_diskstream.cc:224
+msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
+msgstr "Midi ç¡¬çæµï¼ææ¾å表 \"%1\" 䏿¯ä¸ä¸ª midi ææ¾å表"
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
-msgid "Best"
-msgstr "æä½³"
+#: midi_diskstream.cc:275
+msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr "Midi ç¡¬çæµ %1ï¼æ²¡æå·²åå¨çææ¾å表å¯ç¨äºå¤å¶ï¼"
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
-msgid "Good"
-msgstr "好"
+#: midi_diskstream.cc:753
+msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr "Midi ç¡¬çæµ %1ï¼å¨ %3 å¸§æ æ³ä»ææ¾å表读å %2"
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
-msgid "Quick"
-msgstr "å¿«"
+#: midi_diskstream.cc:890
+msgid "MidiDiskstream %1: cannot write to disk"
+msgstr "Midi ç¡¬çæµ %1ï¼æ æ³åå
¥ç¡¬ç"
-#: sfdb_ui.cc:1772
-msgid "Fastest"
-msgstr "æå¿«"
+#: midi_diskstream.cc:924
+msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr "Midi ç¡¬çæµ \"%1\"ï¼æ æ³æ³¨å
¥å·²æè·çæ°æ®å°ç¡¬çï¼"
-#: shuttle_control.cc:56
-msgid "Shuttle speed control (Context-click for options)"
-msgstr "å¾å¤é度æ§å¶ï¼å³é®ç¹å»æ¥çæ´å¤é项ï¼"
+#: midi_diskstream.cc:1013
+msgid "%1: could not create region for complete midi file"
+msgstr "%1ï¼æ æ³ä¸ºå®æ MIDI æä»¶èå建åºå"
-#: shuttle_control.cc:174
-msgid "Percent"
-msgstr "ç¾åæ¯"
+#: midi_diskstream.cc:1054
+msgid "MidiDiskstream: could not create region for captured midi!"
+msgstr "Midi ç¡¬çæµï¼æ æ³ä¸ºå·²æè·ç MIDI å建åºåï¼"
-#: shuttle_control.cc:182
-msgid "Units"
-msgstr "åä½"
+#: midi_model.cc:589
+msgid "Change has no note, using note ID"
+msgstr "ååæ²¡æèç¹ï¼æ£å¨ä½¿ç¨èç¹ ID"
-#: shuttle_control.cc:188 shuttle_control.cc:609
-msgid "Sprung"
-msgstr "å¼¹å¨"
+#: midi_model.cc:593
+msgid "Change has no note or note ID"
+msgstr "ååæ²¡æèç¹æèç¹ID"
-#: shuttle_control.cc:192 shuttle_control.cc:612
-msgid "Wheel"
-msgstr "轮转"
+#: midi_model.cc:614
+msgid "No NoteID found for note property change - ignored"
+msgstr "æªæ¾å°ç¨äºé³ç¬¦åæ°ååç NoteID ââ已忽ç¥"
-#: shuttle_control.cc:226
-msgid "Maximum speed"
-msgstr "æå¤§é度"
+#: midi_model.cc:890
+msgid "No SysExID found for sys-ex property change - ignored"
+msgstr "æªæ¾å°ç¨äº sys-ex ååç SysExID ââ已忽ç¥"
-#: shuttle_control.cc:568
-msgid "Playing"
-msgstr "ææ¾ä¸"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] "æ£å¨ä» %2 è½½å
¥ %1 MIDI é³è²"
-#: shuttle_control.cc:583
-#, c-format
-msgid "<<< %+d semitones"
-msgstr "<<< %+d åé³"
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] "æ£å¨æ¤éä» %2 è½½å
¥ %1 MIDI é³è²"
-#: shuttle_control.cc:585
-#, c-format
-msgid ">>> %+d semitones"
-msgstr ">>> %+d åé³"
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr "è§£æ MIDI é³è²æä»¶ %1 åºé"
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "已忢"
+#: midi_patch_manager.cc:135
+msgid "Duplicate MIDI device `%1' in `%2' ignored"
+msgstr "å¨`%2' å
å¤å¶ MIDI è®¾å¤ `%1' 已忽ç¥"
-#: soundcloud_export_selector.cc:44
-msgid "User Email"
-msgstr "ç¨æ·çµåä¿¡ç®±"
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr "ç§»é¤ MIDI é³è²æä»¶ %1"
-#: soundcloud_export_selector.cc:45
-msgid "Password"
-msgstr "å¯ç "
+#: midi_scene_changer.cc:312
+msgid "Scene "
+msgstr "åºæ¯"
-#: soundcloud_export_selector.cc:46
-msgid "Make files public"
-msgstr "æä»¶å
¬å¼"
+#: midi_source.cc:126
+msgid "Missing parameter property on InterpolationStyle"
+msgstr "å¨ InterpolationStyleï¼æå¼ç±»åï¼ä¸ç¼ºå°åæ°å±æ§"
-#: soundcloud_export_selector.cc:47
-msgid "Open uploaded files in browser"
-msgstr "卿µè§å¨éæå¼å·²ä¸ä¼ çæä»¶"
+#: midi_source.cc:132
+msgid "Missing style property on InterpolationStyle"
+msgstr "å¨ InterpolationStyleï¼æå¼ç±»åï¼ä¸ç¼ºå°ç±»å屿§"
-#: soundcloud_export_selector.cc:48
-msgid "Make files downloadable"
-msgstr "æä»¶å¯ä¸è½½"
+#: midi_source.cc:141
+msgid "Missing parameter property on AutomationState"
+msgstr "å¨ AutomationStateï¼èªå¨åç¶æï¼ä¸ç¼ºå°åæ°å±æ§"
-#: soundcloud_export_selector.cc:107
-msgid "%1: %2 of %3 bytes uploaded"
-msgstr "%1: %2 ç %3 åèå·²ä¸ä¼ "
+#: midi_source.cc:147
+msgid "Missing state property on AutomationState"
+msgstr "å¨ AutomationStateï¼èªå¨åç¶æï¼ä¸ç¼ºå°ç¶æå±æ§"
-#: splash.cc:73
-msgid "%1 loading ..."
-msgstr "%1 è½½å
¥ä¸â¦"
+#: midi_stretch.cc:88
+msgid "MIDI stretch created non-MIDI source"
+msgstr "MIDI 延伸已å建 non-MIDI æ¥æº"
-#: speaker_dialog.cc:40
-msgid "Add Speaker"
-msgstr "æ·»å æ¬å£°å¨"
+#: monitor_processor.cc:54
+msgid "monitor dim"
+msgstr "çæ§åå¼±"
-#: speaker_dialog.cc:41
-msgid "Remove Speaker"
-msgstr "ç§»é¤æ¬å£°å¨"
+#: monitor_processor.cc:55
+msgid "monitor cut"
+msgstr "çæ§åªå"
-#: speaker_dialog.cc:63
-msgid "Azimuth:"
-msgstr "æ¹ä½è§ï¼"
+#: monitor_processor.cc:56
+msgid "monitor mono"
+msgstr "çæ§å声é"
-#: startup.cc:67
-msgid ""
-"Use an external mixer or the hardware mixer of your audio interface.\n"
-"%1 will play NO role in monitoring"
-msgstr ""
-"使ç¨ä¸ä¸ªå¤é¨æ··é³å¨ææ¨çé³é¢æ¥å£ç¡¬ä»¶æ··é³å¨ã\n"
-"%1 å°ä¸ä¼åºç°å¨çæ§ä¸"
+#: monitor_processor.cc:59
+msgid "monitor dim level"
+msgstr "çæ§åå¼±çµå¹³"
-#: startup.cc:69
-msgid "Ask %1 to play back material as it is being recorded"
-msgstr "å½ %1 被å½å¶æ¶è¯·æ±å
¶åæ¾ææ"
+#: monitor_processor.cc:63
+msgid "monitor solo boost level"
+msgstr "çæ§ç¬å¥æ¾å¤§çµå¹³"
-#: startup.cc:142
-msgid ""
-"<span size=\"larger\">%1 is a digital audio workstation. You can use it to record, "
-"edit and mix multi-track audio. You can produce your own CDs, mix video "
-"soundtracks, or experiment with new ideas about music and sound. \n"
-"\n"
-"There are a few things that need to be configured before you start using the "
-"program.</span> "
-msgstr ""
-"<span size=\"larger\">%1 æ¯ä¸ä¸ªæ°åé³é¢å·¥ä½ç«ãæ¨å¯ä»¥ç¨å®å½å¶ãç¼è¾å¹¶æ··åå¤å£°éé³"
-"é¢ãæ¨å¯ä»¥åä½èªå·±çCDå
çãæ··åè§é¢é³è½¨ãæè
è¯éªä¸é³ä¹å声鳿å
³çæ°æ³æ³ã\n"
-"\n"
-"卿¨å¼å§ä½¿ç¨è¿ä¸ªç¨åºä¹åï¼éè¦å®æä¸äºé
ç½®ã</span> "
+#: monitor_processor.cc:543
+msgid "cut control %1"
+msgstr "åªåæ§å¶ %1"
-#: startup.cc:168
-msgid "Welcome to %1"
-msgstr "欢è¿ä½¿ç¨ %1"
+#: monitor_processor.cc:544
+msgid "dim control"
+msgstr "åå¼±æ§å¶"
-#: startup.cc:191
-msgid "Default folder for %1 sessions"
-msgstr "ä¼è¯ %1 çé»è®¤æä»¶å¤¹"
+#: monitor_processor.cc:545
+msgid "polarity control"
+msgstr "ææ§æ§å¶"
-#: startup.cc:197
-msgid ""
-"Each project that you work on with %1 has its own folder.\n"
-"These can require a lot of disk space if you are recording audio.\n"
-"\n"
-"Where would you like new %1 sessions to be stored by default?\n"
-"\n"
-"<i>(You can put new sessions anywhere, this is just a default)</i>"
-msgstr ""
-"æ¨å¨ %1 å·¥ä½çæ¯ä¸ªé¡¹ç®é½æå®åèªçæä»¶å¤¹ã\n"
-"彿¨å¨å½å¶é³é¢æ¶ï¼å¯è½éè¦å¤§éçç£ç空é´ã\n"
-"\n"
-"æ¨å¸ææ°ç %1 ä¼è¯è¢«é»è®¤åæ¾å¨åªå¿ï¼\n"
-"\n"
-"<i>ï¼æ¨å¯ä»¥ææ°çä¼è¯åæ¾å¨ä»»ä½ä½ç½®ï¼è¿éåªæ¯é»è®¤æä»¶å¤¹ï¼</i>"
+#: monitor_processor.cc:546
+msgid "solo control"
+msgstr "ç¬å¥æ§å¶"
-#: startup.cc:220
-msgid "Default folder for new sessions"
-msgstr "æ°ä¼è¯çé»è®¤æä»¶å¤¹"
+#: mtc_slave.cc:241
+msgid "MTC Slave: atomic read of current time failed, sleeping!"
+msgstr "MTCï¼MIDI æ¶é´ç ï¼ä»å±ï¼å½åæ¶é´ç atomic read åå读å失败ï¼ç¡ç ï¼"
-#: startup.cc:241
+#: mtc_slave.cc:363
msgid ""
-"While recording instruments or vocals, you probably want to listen to the\n"
-"signal as well as record it. This is called \"monitoring\". There are\n"
-"different ways to do this depending on the equipment you have and the\n"
-"configuration of that equipment. The two most common are presented here.\n"
-"Please choose whichever one is right for your setup.\n"
-"\n"
-"<i>(You can change this preference at any time, via the Preferences dialog)</i>\n"
-"\n"
-"<i>If you do not understand what this is about, just accept the default.</i>"
+"Unknown rate/drop value %1 in incoming MTC stream, session values used "
+"instead"
msgstr ""
-"å½å½å¶ä¹å¨æäººå£°æ¶ï¼æ¨å¯è½å¸æå¨å½å¶çåæ¶å¬å°ä¿¡å·ã\n"
-"è¿è¢«ç§°ä¸ºâçæ§âã\n"
-"æä¸åçæ¹æ³å¯ä»¥åå°è¿ä¸ç¹ï¼è¿åå³äºæ¨ææ¥æç设å¤ä»¥åè¿äºè®¾å¤çé
ç½®ã\n"
-"è¿éæä¸¤ä¸ªæå¸¸è§çæ¹å¼ã\n"
-"è¯·éæ©æé忍ç设置çé£ä¸ä¸ªã\n"
-"\n"
-"<i>ï¼æ¨å¯ä»¥å¨ä»»ä½æ¶åæ¹åè¿ä¸ªé¦é项ï¼å°±å¨é¦éé¡¹å¯¹è¯æ¡éï¼</i>\n"
-"\n"
-"<i>妿æ¨ä¸å¤§äºè§£è¿æ¹é¢çä¿¡æ¯ï¼ä¿æé»è®¤å³å¯ã</i>"
-
-#: startup.cc:262
-msgid "Monitoring Choices"
-msgstr "çæ§éæ©"
+"å¨å¼å
¥ç MTCï¼MIDI æ¶é´ç ï¼æµéææªç¥çæ¯ç/æ²éæ°å¼ %1 ï¼ä½¿ç¨ä¼è¯æ°å¼ä»£æ¿"
-#: startup.cc:285
-msgid "Use a Master bus directly"
-msgstr "ç´æ¥ä½¿ç¨ä¸»æ§æ»çº¿"
+#: mtc_slave.cc:383
+msgid "Session framerate adjusted from %1 TO: MTC's %2."
+msgstr "ä¼è¯å¸§çä» %1 è°æ´ä¸ºï¼MTCï¼MIDI æ¶é´ç ï¼ç %2ã"
-#: startup.cc:287
-msgid ""
-"Connect the Master bus directly to your hardware outputs. This is preferable for "
-"simple usage."
-msgstr "ç´æ¥è¿æ¥ä¸»æ§æ»çº¿å°æ¨ç硬件è¾åºãè¿å¯è½æ´ç®åæç¨ã"
+#: mtc_slave.cc:397
+msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
+msgstr "ä¼è¯ä¸MTCï¼MIDI æ¶é´ç ï¼å¸§çä¸å¹é
ï¼MTCï¼MIDI æ¶é´ç ï¼ï¼%1 %2:%3ã"
-#: startup.cc:296
-msgid "Use an additional Monitor bus"
-msgstr "使ç¨ä¸ä¸ªé¢å¤ççæ§æ»çº¿"
+#: operations.cc:41
+msgid "capture"
+msgstr "æè·"
-#: startup.cc:299
-msgid ""
-"Use a Monitor bus between Master bus and hardware outputs for \n"
-"greater control in monitoring without affecting the mix."
-msgstr ""
-"å¨ä¸»æ§æ»çº¿å硬件è¾å
¥ä¹é´ä½¿ç¨ä¸ä¸ªçæ§æ»çº¿\n"
-"çæ§æ¶å¯æ´å¥½çæ§å¶ï¼ä¸ä¼å½±åæ··é³ã"
+#: operations.cc:42
+msgid "paste"
+msgstr "ç²è´´"
-#: startup.cc:321
-msgid ""
-"<i>You can change this preference at any time via the Preferences dialog.\n"
-"You can also add or remove the monitor section to/from any session.</i>\n"
-"\n"
-"<i>If you do not understand what this is about, just accept the default.</i>"
-msgstr ""
-"<i>æ¨å¯ä»¥å¨ä»»ä½æ¶åæ¹åè¿ä¸ªé¦é项ï¼å°±å¨é¦éé¡¹å¯¹è¯æ¡éã\n"
-"æ¨ä¹å¯ä»¥æ·»å çæ§é¢å°ä»»ä½ä¼è¯ï¼æçä»ä»»ä½ä¼è¯ç§»é¤çæ§é¢ã</i>\n"
-"\n"
-"<i>妿æ¨ä¸å¤§äºè§£è¿æ¹é¢çä¿¡æ¯ï¼ä¿æé»è®¤å³å¯ã</i>"
+#: operations.cc:43
+msgid "duplicate region"
+msgstr "å¤å¶åºå"
-#: startup.cc:332
-msgid "Monitor Section"
-msgstr "çæ§é¢"
+#: operations.cc:44
+msgid "insert file"
+msgstr "æå
¥æä»¶"
-#: step_entry.cc:60
-msgid "Step Entry: %1"
-msgstr "æ¥è¿å
¥å£ï¼%1"
+#: operations.cc:45
+msgid "insert region"
+msgstr "æå
¥åºå"
-#: step_entry.cc:65
-msgid ">beat"
-msgstr ">æå"
+#: operations.cc:46
+msgid "drag region brush"
+msgstr "ææ½åºåç¬å·"
-#: step_entry.cc:66
-msgid ">bar"
-msgstr ">å°è"
+#: operations.cc:47
+msgid "region drag"
+msgstr "åºåææ½"
-#: step_entry.cc:67
-msgid ">EP"
-msgstr ">éæ ·"
+#: operations.cc:48
+msgid "selection grab"
+msgstr "已鿩é¨åæå"
-#: step_entry.cc:68
-msgid "sustain"
-msgstr "æç»"
+#: operations.cc:49
+msgid "region fill"
+msgstr "åºåå¡«å
"
-#: step_entry.cc:69
-msgid "rest"
-msgstr "伿¢"
+#: operations.cc:50
+msgid "fill selection"
+msgstr "å¡«å
已鿩é¨å"
-#: step_entry.cc:70
-msgid "g-rest"
-msgstr "g-伿¢"
+#: operations.cc:51
+msgid "create region"
+msgstr "å建åºå"
-#: step_entry.cc:71
-msgid "back"
-msgstr "åé"
+#: operations.cc:52
+msgid "region copy"
+msgstr "åºåå¤å¶"
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
+#: operations.cc:53
+msgid "fixed time region copy"
+msgstr "åºå®æ¶é´åºåå¤å¶"
-#: step_entry.cc:191
-msgid "Set note length to a whole note"
-msgstr "设置é³ç¬¦é¿åº¦ä¸ºå
¨é³ç¬¦"
+#: pannable.cc:208
+msgid "Pannable given XML data for %1 - ignored"
+msgstr "å¯ç¨å£°ç¸ä¸º %1 æå®ç XML æ°æ®ââ已忽ç¥"
-#: step_entry.cc:192
-msgid "Set note length to a half note"
-msgstr "设置é³ç¬¦é¿åº¦ä¸ºåé³ç¬¦"
+#: panner_manager.cc:95
+msgid "looking for panners in %1\n"
+msgstr "æ£å¨ %1 䏿¥æ¾å£°ç¸å¨\n"
-#: step_entry.cc:193
-msgid "Set note length to a quarter note"
-msgstr "设置é³ç¬¦é¿åº¦ä¸ºååé³ç¬¦"
+#: panner_manager.cc:121
+msgid "Panner discovered: \"%1\" in %2\n"
+msgstr "å·²åç°å£°ç¸å¨ï¼å¨ %2 ä¸ç \"%1\"\n"
-#: step_entry.cc:194
-msgid "Set note length to a eighth note"
-msgstr "设置é³ç¬¦é¿åº¦ä¸ºå
«åé³ç¬¦"
+#: panner_manager.cc:140
+msgid "PannerManager: cannot load module \"%1\" (%2)"
+msgstr "声ç¸å¨ç®¡çå¨ï¼æ æ³è½½å
¥æ¨¡å¼ \"%1\"ï¼%2ï¼"
-#: step_entry.cc:195
-msgid "Set note length to a sixteenth note"
-msgstr "设置é³ç¬¦é¿åº¦ä¸ºåå
åé³ç¬¦"
+#: panner_manager.cc:147
+msgid "PannerManager: module \"%1\" has no descriptor function."
+msgstr "声ç¸å¨ç®¡çå¨ï¼ \"%1\" 没ææè¿°ç¬¦å½æ°ã"
-#: step_entry.cc:196
-msgid "Set note length to a thirty-second note"
-msgstr "设置é³ç¬¦é¿åº¦ä¸ºä¸åäºåé³ç¬¦"
+#: panner_manager.cc:234
+msgid "no panner discovered for in/out = %1/%2"
+msgstr "æªåç°ç¨äºè¾å
¥/è¾åºç声ç¸å¨ = %1/%2"
-#: step_entry.cc:197
-msgid "Set note length to a sixty-fourth note"
-msgstr "设置é³ç¬¦é¿åº¦ä¸ºå
åååé³ç¬¦"
+#: panner_shell.cc:122
+msgid ""
+"No panner found: check that panners are being discovered correctly during "
+"startup."
+msgstr "æ¾ä¸å°å£°ç¸å¨ï¼æ£æ¥å¯å¨æ¶è¢«æ£ç¡®åç°ç声ç¸å¨ã"
-#: step_entry.cc:276
-msgid "Set volume (velocity) to pianississimo"
-msgstr "设置é³éï¼å度ï¼ä¸ºæå¼±é³"
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr "鿩声ç¸å¨ï¼%1\n"
-#: step_entry.cc:277
-msgid "Set volume (velocity) to pianissimo"
-msgstr "设置é³éï¼å度ï¼ä¸ºæå¼±é³"
+#: panner_shell.cc:257
+msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
+msgstr "å¨å£°ç¸ç¶æä¸åç°æªç¥ç声ç¸å¨æä»¶ \"%1\" ââ已忽ç¥"
-#: step_entry.cc:278
-msgid "Set volume (velocity) to piano"
-msgstr "设置é³éï¼å度ï¼ä¸ºå¼±é³"
+#: panner_shell.cc:263
+msgid "panner plugin node has no type information!"
+msgstr "声ç¸å¨æä»¶èç¹æ²¡æç±»åä¿¡æ¯ï¼"
-#: step_entry.cc:279
-msgid "Set volume (velocity) to mezzo-piano"
-msgstr "设置é³éï¼å度ï¼ä¸ºä¸å¼±é³"
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
-#: step_entry.cc:280
-msgid "Set volume (velocity) to mezzo-forte"
-msgstr "设置é³éï¼å度ï¼ä¸ºä¸å¼ºé³"
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
-#: step_entry.cc:281
-msgid "Set volume (velocity) to forte"
-msgstr "设置é³éï¼å度ï¼ä¸ºå¼ºé³"
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
-#: step_entry.cc:282
-msgid "Set volume (velocity) to fortissimo"
-msgstr "设置é³é(å度)为æå¼ºé³"
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
-#: step_entry.cc:283
-msgid "Set volume (velocity) to fortississimo"
-msgstr "设置é³éï¼å度ï¼ä¸ºæå¼ºé³"
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
-#: step_entry.cc:331
-msgid "Stack inserted notes to form a chord"
-msgstr "å æ å·²æå
¥çé³ç¬¦å½¢æä¸ä¸ªå弦"
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
-#: step_entry.cc:332
-msgid "Extend selected notes by note length"
-msgstr "éè¿é³ç¬¦é¿åº¦å»¶ä¼¸å·²éæ©çé³ç¬¦"
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
-#: step_entry.cc:333
-msgid "Use undotted note lengths"
-msgstr "使ç¨ä¸å¸¦ç¹é³ç¬¦é¿åº¦"
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
-#: step_entry.cc:334
-msgid "Use dotted (* 1.5) note lengths"
-msgstr "使ç¨å¸¦ç¹ï¼*1.5ï¼é³ç¬¦é¿åº¦"
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
-#: step_entry.cc:335
-msgid "Use double-dotted (* 1.75) note lengths"
-msgstr "使ç¨å¸¦åç¹ï¼*1.75ï¼é³ç¬¦é¿åº¦"
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
-#: step_entry.cc:336
-msgid "Use triple-dotted (* 1.875) note lengths"
-msgstr "使ç¨å¸¦ä¸ç¹ï¼* 1.875ï¼é³ç¬¦é¿åº¦"
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
-#: step_entry.cc:337
-msgid "Insert a note-length's rest"
-msgstr "æå
¥ä¸ä¸ªé³ç¬¦é¿åº¦ç伿¢ç¬¦"
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
-#: step_entry.cc:338
-msgid "Insert a grid-unit's rest"
-msgstr "æå
¥ä¸ä¸ªç½æ ¼åä½ç伿¢ç¬¦"
+#: playlist.cc:2234
+msgid "region state node has no ID, ignored"
+msgstr "åºåç¶æèç¹æ²¡æ IDï¼å·²å¿½ç¥"
-#: step_entry.cc:339
-msgid "Insert a rest until the next beat"
-msgstr "æå
¥ä¸ä¸ªä¼æ¢ç¬¦ç´å°ä¸ä¸æ"
+#: playlist.cc:2252
+msgid "Playlist: cannot create region from XML"
+msgstr "ææ¾åè¡¨ï¼æ æ³ä» XML å建åºå"
-#: step_entry.cc:340
-msgid "Insert a rest until the next bar"
-msgstr "æå
¥ä¸ä¸ªä¼æ¢ç¬¦ç´å°ä¸ä¸å°è"
+#: playlist_source.cc:99
+msgid "No playlist ID in PlaylistSource XML!"
+msgstr "å¨ PlaylistSource ææ¾åè¡¨æ¥æº XML éæ²¡æææ¾å表 IDï¼"
-#: step_entry.cc:341
-msgid "Insert a bank change message"
-msgstr "æå
¥ä¸ä¸ªåºåæ¢ä¿¡æ¯"
+#: playlist_source.cc:118
+msgid "Could not construct playlist for PlaylistSource from session data!"
+msgstr "æ æ³ä»ä¼è¯æ°æ®ä¸º PlaylistSource æé ææ¾å表ï¼"
-#: step_entry.cc:342
-msgid "Insert a program change message"
-msgstr "æå
¥ä¸ä¸ªç¨å¼åæ¢ä¿¡æ¯"
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr "æ æ³ç§»é¤æä»¶åºåé¢è®¾ã"
-#: step_entry.cc:343 step_entry.cc:700
-msgid "Move Insert Position Back by Note Length"
-msgstr "æé³ç¬¦é¿åº¦ååç§»å¨æå
¥ä½ç½®"
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr "æå®çé¢è®¾åç§°å·²åå¨ã"
-#: step_entry.cc:344 step_entry.cc:698
-msgid "Move Insert Position to Edit Point"
-msgstr "ç§»å¨æå
¥ä½ç½®å°ç¼è¾ä½ç½®"
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
-#: step_entry.cc:401
-msgid "1/Note"
-msgstr "1/é³ç¬¦"
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
-#: step_entry.cc:415
-msgid "Octave"
-msgstr "å
«åº¦"
+#: plugin.cc:269
+msgid "?"
+msgstr ""
-#: step_entry.cc:598
-msgid "Insert Note A"
-msgstr "æå
¥é³ç¬¦A"
+#: plugin.cc:412
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr "å¨ %1 çè¿ä¸ªç¼è¯çä¸ä¸æ¯ææä»¶é¢è®¾ã请èè为ä¸ä¸ªå®æ´ççæ¬ä»è´¹"
-#: step_entry.cc:599
-msgid "Insert Note A-sharp"
-msgstr "æå
¥é³ç¬¦A#"
+#: plugin.cc:495
+msgid ""
+"Saving plugin settings is not supported in this build of %1. Consider paying "
+"for the full version"
+msgstr "å¨ %1 çè¿ä¸ªç¼è¯çä¸ä¸æ¯æä¿åæä»¶ã请èè为ä¸ä¸ªå®æ´ççæ¬ä»è´¹"
-#: step_entry.cc:600
-msgid "Insert Note B"
-msgstr "æå
¥é³ç¬¦B"
+#: plugin_insert.cc:1148
+msgid "programming error: "
+msgstr "ç¨åºé误ï¼"
-#: step_entry.cc:601
-msgid "Insert Note C"
-msgstr "æå
¥é³ç¬¦C"
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
-#: step_entry.cc:602
-msgid "Insert Note C-sharp"
-msgstr "æå
¥é³ç¬¦C#"
+#: plugin_insert.cc:2352
+msgid "XML node describing plugin is missing the `type' field"
+msgstr "XMLèç¹æ£å¨æè¿°çæä»¶ç¼ºå¤± âtypeâ åæ®µ"
-#: step_entry.cc:603
-msgid "Insert Note D"
-msgstr "æå
¥é³ç¬¦D"
+#: plugin_insert.cc:2369
+msgid "unknown plugin type %1 in plugin insert state"
+msgstr "卿件æå
¥ç¶æä¸ææªç¥çæä»¶ç±»å %1"
-#: step_entry.cc:604
-msgid "Insert Note D-sharp"
-msgstr "æå
¥é³ç¬¦D#"
+#: plugin_insert.cc:2397
+msgid "Plugin has no unique ID field"
+msgstr "æä»¶æ²¡æå¯ä¸ç ID åæ®µ"
-#: step_entry.cc:605
-msgid "Insert Note E"
-msgstr "æå
¥é³ç¬¦E"
+#: plugin_insert.cc:2435
+msgid ""
+"Found a reference to a plugin (\"%1\") that is unknown.\n"
+"Perhaps it was removed or moved since it was last used."
+msgstr ""
+"åç°ä¸ä¸ªå¼ç¨æåå°ä¸ä¸ªæªç¥çæä»¶ï¼\"%1\"ï¼ã\n"
+"ä¹è®¸èªä»å®æå䏿¬¡ä½¿ç¨ä¹åè¢«ç§»é¤æè
ç§»å¨äºã"
-#: step_entry.cc:606
-msgid "Insert Note F"
-msgstr "æå
¥é³ç¬¦F"
+#: plugin_insert.cc:2645
+msgid "PluginInsert: Auto: no ladspa port number"
+msgstr "æä»¶æå
¥ï¼èªå¨ï¼æ ladspa 端å£å·"
-#: step_entry.cc:607
-msgid "Insert Note F-sharp"
-msgstr "æå
¥é³ç¬¦F#"
+#: plugin_insert.cc:2652
+msgid "PluginInsert: Auto: port id out of range"
+msgstr "æä»¶æå
¥ï¼èªå¨ï¼ç«¯å£ ID è¶
åºèå´"
-#: step_entry.cc:608
-msgid "Insert Note G"
-msgstr "æå
¥é³ç¬¦G"
+#: plugin_insert.cc:2688
+msgid "PluginInsert: automatable control %1 not found - ignored"
+msgstr "æä»¶æå
¥ï¼æªæ¾å°å¯èªå¨åæ§å¶ %1 ââ已忽ç¥"
-#: step_entry.cc:609
-msgid "Insert Note G-sharp"
-msgstr "æå
¥é³ç¬¦G#"
+#: plugin_manager.cc:220
+msgid "Discovering Plugins"
+msgstr "æ£å¨æ¥æ¾æä»¶"
-#: step_entry.cc:611
-msgid "Insert a Note-length Rest"
-msgstr "æå
¥ä¸ä¸ªå
¨ä¼æ¢ç¬¦"
+#: plugin_manager.cc:251
+msgid "Scanning LADSPA Plugins"
+msgstr "æ£å¨æ«æ LADSPA æä»¶"
-#: step_entry.cc:612
-msgid "Insert a Snap-length Rest"
-msgstr "æå
¥ä¸ä¸ªå¸éé¿åº¦ç伿¢ç¬¦"
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
-#: step_entry.cc:614 step_entry.cc:615
-msgid "Move to next octave"
-msgstr "ç§»å¨å°ä¸ä¸ä¸ªå
«åº¦"
+#: plugin_manager.cc:256
+msgid "Scanning LV2 Plugins"
+msgstr "æ£å¨æ«æ LV2 æä»¶"
-#: step_entry.cc:617
-msgid "Move to Next Note Length"
-msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦é¿åº¦"
+#: plugin_manager.cc:262
+msgid "Scanning Windows VST Plugins"
+msgstr "æ£å¨æ«æ Windows VST æä»¶"
-#: step_entry.cc:618
-msgid "Move to Previous Note Length"
-msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦é¿åº¦"
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr "æ£å¨æ¥æ¾ Windows VST æä»¶"
-#: step_entry.cc:620
-msgid "Increase Note Length"
-msgstr "å¢å é³ç¬¦é¿åº¦"
+#: plugin_manager.cc:273
+msgid "Scanning Linux VST Plugins"
+msgstr "æ£å¨æ«æ Linux VST æä»¶"
-#: step_entry.cc:621
-msgid "Decrease Note Length"
-msgstr "åå°é³ç¬¦é¿åº¦"
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr "æ£å¨æ¥æ¾ Linux VST æä»¶"
-#: step_entry.cc:623
-msgid "Move to Next Note Velocity"
-msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦å度"
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr "VST é»ååï¼"
-#: step_entry.cc:624
-msgid "Move to Previous Note Velocity"
-msgstr "ç§»å¨å°ä¸ä¸ä¸ªé³ç¬¦å度"
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr "VST é»ååï¼"
-#: step_entry.cc:626
-msgid "Increase Note Velocity"
-msgstr "å¢å é³ç¬¦å度"
+#: plugin_manager.cc:300
+msgid "Scanning AU Plugins"
+msgstr "æ£å¨æ«æ AU æä»¶"
-#: step_entry.cc:627
-msgid "Decrease Note Velocity"
-msgstr "åå°é³ç¬¦å度"
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr "æ£å¨æ¥æ¾ AU æä»¶"
-#: step_entry.cc:629
-msgid "Switch to the 1st octave"
-msgstr "忢å°ç¬¬ä¸ä¸ªå
«åº¦"
+#: plugin_manager.cc:307
+msgid "Plugin Scan Complete..."
+msgstr "æä»¶æ«æå®æâ¦"
-#: step_entry.cc:630
-msgid "Switch to the 2nd octave"
-msgstr "忢å°ç¬¬äºä¸ªå
«åº¦"
+#: plugin_manager.cc:513
+msgid "LADSPA"
+msgstr ""
-#: step_entry.cc:631
-msgid "Switch to the 3rd octave"
-msgstr "忢å°ç¬¬ä¸ä¸ªå
«åº¦"
+#: plugin_manager.cc:565
+msgid "Could not parse rdf file: %1"
+msgstr "æ æ³è§£æ rdf æä»¶ï¼%1"
-#: step_entry.cc:632
-msgid "Switch to the 4th octave"
-msgstr "忢å°ç¬¬å个å
«åº¦"
+#: plugin_manager.cc:602
+msgid "LADSPA: cannot load module \"%1\" (%2)"
+msgstr "LADSPAï¼æ æ³è½½å
¥æ¨¡å \"%1\"ï¼%2ï¼"
-#: step_entry.cc:633
-msgid "Switch to the 5th octave"
-msgstr "忢å°ç¬¬äºä¸ªå
«åº¦"
+#: plugin_manager.cc:609
+msgid "LADSPA: module \"%1\" has no descriptor function."
+msgstr "LADSPAï¼æ¨¡å \"%1\" 没ææè¿°ç¬¦å½æ°ã"
-#: step_entry.cc:634
-msgid "Switch to the 6th octave"
-msgstr "忢å°ç¬¬å
个å
«åº¦"
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr "--- Windows VST æä»¶æ«æï¼%1"
-#: step_entry.cc:635
-msgid "Switch to the 7th octave"
-msgstr "忢å°ç¬¬ä¸ä¸ªå
«åº¦"
+#: plugin_manager.cc:819
+msgid "VST"
+msgstr ""
-#: step_entry.cc:636
-msgid "Switch to the 8th octave"
-msgstr "忢å°ç¬¬å
«ä¸ªå
«åº¦"
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr "--- Windows VST æä»¶æ«æå®æ¯"
-#: step_entry.cc:637
-msgid "Switch to the 9th octave"
-msgstr "忢å°ç¬¬ä¹ä¸ªå
«åº¦"
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr "æ æ³æå¼ dll"
-#: step_entry.cc:638
-msgid "Switch to the 10th octave"
-msgstr "忢å°ç¬¬å个å
«åº¦"
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr "æ æç dllï¼æä»¶å¤ªå°"
-#: step_entry.cc:639
-msgid "Switch to the 11th octave"
-msgstr "忢å°ç¬¬åä¸ä¸ªå
«åº¦"
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr "䏿¯ä¸ä¸ª dll"
-#: step_entry.cc:644
-msgid "Set Note Length to Whole"
-msgstr "设置为å
¨é³ç¬¦"
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr "æ æ³ç¡®å®ç dll ç±»å"
-#: step_entry.cc:646
-msgid "Set Note Length to 1/2"
-msgstr "设置为äºåé³ç¬¦"
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr "æ æ³è¯»å dll PE æä»¶å¤´"
-#: step_entry.cc:648
-msgid "Set Note Length to 1/3"
-msgstr "设置为ä¸åé³ç¬¦"
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr "æ æç dll PE æä»¶å¤´"
-#: step_entry.cc:650
-msgid "Set Note Length to 1/4"
-msgstr "设置为ååé³ç¬¦"
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr "i386ï¼32ä½ï¼"
-#: step_entry.cc:652
-msgid "Set Note Length to 1/8"
-msgstr "设置为å
«åé³ç¬¦"
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
-#: step_entry.cc:654
-msgid "Set Note Length to 1/16"
-msgstr "设置为åå
åé³ç¬¦"
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr "x64ï¼64ä½ï¼"
-#: step_entry.cc:656
-msgid "Set Note Length to 1/32"
-msgstr "设置为ä¸åäºåé³ç¬¦"
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr "æ¬å°æ¶æ"
-#: step_entry.cc:658
-msgid "Set Note Length to 1/64"
-msgstr "设置为å
åååé³ç¬¦"
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr "æªç¥æ¶æ"
-#: step_entry.cc:663
-msgid "Set Note Velocity to Pianississimo"
-msgstr "设置é³ç¬¦å度为æå¼±é³"
+#: plugin_manager.cc:897
+msgid " * %1 (cache only)"
+msgstr " * %1ï¼ä»
ç¼åï¼"
-#: step_entry.cc:665
-msgid "Set Note Velocity to Pianissimo"
-msgstr "设置é³ç¬¦å度为æå¼±é³"
+#: plugin_manager.cc:899
+msgid " * %1 - %2"
+msgstr ""
-#: step_entry.cc:667
-msgid "Set Note Velocity to Piano"
-msgstr "设置é³ç¬¦å度为弱é³"
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr " -> æ æ³è·å Windows VST ä¿¡æ¯ï¼æä»¶å·²å¿½ç¥ã"
-#: step_entry.cc:669
-msgid "Set Note Velocity to Mezzo-Piano"
-msgstr "设置é³ç¬¦å度为ä¸å¼±é³"
+#: plugin_manager.cc:924
+msgid ""
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
+msgstr "VST æä»¶ %1 䏿¯æ processReplacingï¼ä¸æ¤æ¶æ æ³å¨ %2 ä¸ä½¿ç¨"
-#: step_entry.cc:671
-msgid "Set Note Velocity to Mezzo-Forte"
-msgstr "设置é³ç¬¦å度为ä¸å¼ºé³"
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr "æ£å¨å¿½ç¥å¤å¶ Windows VST æä»¶ \"%1\""
-#: step_entry.cc:673
-msgid "Set Note Velocity to Forte"
-msgstr "设置é³ç¬¦å度为强é³"
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr " -> OKï¼VST æä»¶ \"%1\" 已添å ï¼ã"
-#: step_entry.cc:675 step_entry.cc:677
-msgid "Set Note Velocity to Fortississimo"
-msgstr "设置é³ç¬¦å度为æå¼ºé³"
+#: plugin_manager.cc:1019
+msgid "LXVST"
+msgstr ""
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "忢ä¸åé³ç¬¦"
+#: plugin_manager.cc:1046
+msgid ""
+"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
+"in %2 at this time"
+msgstr "linuxVST æä»¶ %1 䏿¯æ processReplacingï¼ä¸æ¤æ¶æ æ³å¨ %2 ä¸ä½¿ç¨"
-#: step_entry.cc:684
-msgid "No Dotted Notes"
-msgstr "æ 带ç¹é³ç¬¦"
+#: plugin_manager.cc:1213
+msgid "unknown plugin status type \"%1\" - all entries ignored"
+msgstr "æªç¥çæä»¶ç¶æç±»å \"%1\" ââææå
¥å£é½å·²å¿½ç¥"
-#: step_entry.cc:686
-msgid "Toggled Dotted Notes"
-msgstr "忢另ç¹é³ç¬¦"
+#: plugin_manager.cc:1232
+msgid "unknown plugin type \"%1\" - ignored"
+msgstr "æªç¥çæä»¶ç±»å \"%1\" ââ已忽ç¥"
-#: step_entry.cc:688
-msgid "Toggled Double-Dotted Notes"
-msgstr "忢另åç¹é³ç¬¦"
+#: port.cc:504
+msgid "could not reregister %1"
+msgstr "æ æ³éæ°æ³¨å %1"
-#: step_entry.cc:690
-msgid "Toggled Triple-Dotted Notes"
-msgstr "忢另ä¸ç¹é³ç¬¦"
+#: port_insert.cc:43
+msgid "insert %1"
+msgstr "æå
¥ %1"
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "忢å弦å
¥å£"
+#: port_insert.cc:204
+msgid "XML node describing port insert is missing the `type' field"
+msgstr "XMLèç¹æ£å¨æè¿°çç«¯å£æå
¥ç¼ºå¤± âtypeâ åæ®µ"
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "éè¿é³ç¬¦é¿åº¦æç»å·²éæ©çé³ç¬¦"
+#: port_insert.cc:209
+msgid "non-port insert XML used for port plugin insert"
+msgstr "non-port æå
¥ XML å·²ç¨äºç«¯å£æä»¶æå
¥"
-#: stereo_panner.cc:133
-#, c-format
-msgid "L:%3d R:%3d Width:%d%%"
-msgstr "å·¦ï¼%3d å³ï¼%3d 宽度ï¼%d%%"
+#: port_manager.cc:288
+msgid ""
+"a port with the name \"%1\" already exists: check for duplicated track/bus "
+"names"
+msgstr "å称为 \"%1\" ç端å£å·²åå¨ï¼æ£æ¥å·²å¤å¶çé³è½¨/æ»çº¿åç§°"
-#: stereo_panner_editor.cc:35
-msgid "Stereo Panner"
-msgstr "ç«ä½å£°é¢æ¿"
+#: port_manager.cc:290
+msgid ""
+"No more ports are available. You will need to stop %1 and restart with more "
+"ports if you need this many tracks."
+msgstr ""
+"æ æ´å¤çå¯ç¨ç«¯å£ã妿æ¨éè¦è¿ä¹å¤é³è½¨ï¼æ¨å°å¿
须忢 %1 ï¼ç¶åå¸¦çæ´å¤ç端å£"
+"éå¯ã"
-#: stereo_panner_editor.cc:49
-msgid "Width"
-msgstr "宽度"
+#: port_manager.cc:293
+msgid "AudioEngine: cannot register port \"%1\": %2"
+msgstr "é³é¢å¼æï¼æ æ³æ³¨åç«¯å£ \"%1\": %2"
-#: strip_silence_dialog.cc:44
-msgid "Strip Silence"
-msgstr "çæ®µæ 声"
+#: port_manager.cc:332
+msgid "unable to create port: %1"
+msgstr "ä¸è½å建端å£ï¼%1"
-#: strip_silence_dialog.cc:75
-msgid "Minimum length"
-msgstr "æå°é¿åº¦"
+#: port_manager.cc:453
+msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
+msgstr "é³é¢å¼æï¼æ æ³è¿æ¥ %1ï¼%2ï¼å° %3ï¼%4ï¼"
-#: strip_silence_dialog.cc:83
-msgid "Fade length"
-msgstr "æ·¡åé¿åº¦"
+#: port_manager.cc:505 port_manager.cc:506
+msgid "Re-establising port %1 failed"
+msgstr "éæ°ç¡®ç«ç«¯å£ %1 失败"
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
-msgid "bar:"
-msgstr "å°èï¼"
+#: processor.cc:218
+msgid "No %1 property flag in element %2"
+msgstr "å¨å
ç´ %2 䏿 %1 屿§æ å¿"
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
-msgid "beat:"
-msgstr "æåï¼"
+#: processor.cc:227
+msgid "No child node with active property"
+msgstr "æ å¸¦æ¿æ´»å±æ§çåèç¹"
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
-msgid "Pulse note"
-msgstr "èå²é³ç¬¦"
+#: rc_configuration.cc:92
+msgid "Loading system configuration file %1"
+msgstr "æ£å¨è½½å
¥ç³»ç»é
ç½®æä»¶ %1"
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
-msgid "Tap tempo"
-msgstr "èæèå¥"
+#: rc_configuration.cc:96
+msgid "%1: cannot read system configuration file \"%2\""
+msgstr "%1ï¼ æ æ³è¯»åç³»ç»é
ç½®æä»¶ \"%2\""
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "ç¼è¾èå¥"
+#: rc_configuration.cc:101
+msgid "%1: system configuration file \"%2\" not loaded successfully."
+msgstr "%1ï¼ ç³»ç»é
ç½®æä»¶ \"%2\" 没ææåè½½å
¥ã"
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324 tempo_dialog.cc:325
-msgid "whole"
-msgstr "å
¨"
+#: rc_configuration.cc:105
+msgid ""
+"Your system %1 configuration file is empty. This probably means that there "
+"was an error installing %1"
+msgstr "æ¨çç³»ç»é
ç½®æä»¶ %1 æ¯ç©ºç½çãè¿å¯è½æå³çå®è£
%1 æ¶æä¸ä¸ªé误ã"
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326 tempo_dialog.cc:327
-msgid "second"
-msgstr "äºåä¹ä¸"
+#: rc_configuration.cc:120
+msgid "Loading user configuration file %1"
+msgstr "æ£å¨è½½å
¥ç¨æ·é
ç½®æä»¶ %1"
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328 tempo_dialog.cc:329
-msgid "third"
-msgstr "ä¸åä¹ä¸"
+#: rc_configuration.cc:124
+msgid "%1: cannot read configuration file \"%2\""
+msgstr "%1ï¼ æ æ³è¯»åé
ç½®æä»¶ \"%2\""
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330 tempo_dialog.cc:331
-msgid "quarter"
-msgstr "ååä¹ä¸"
+#: rc_configuration.cc:129
+msgid "%1: user configuration file \"%2\" not loaded successfully."
+msgstr "%1ï¼ ç¨æ·é
ç½®æä»¶ \"%2\" 没ææåè½½å
¥ã"
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332 tempo_dialog.cc:333
-msgid "eighth"
-msgstr "å
«åä¹ä¸"
+#: rc_configuration.cc:133
+msgid "your %1 configuration file is empty. This is not normal."
+msgstr "æ¨çé
ç½®æä»¶ %1 æ¯ç©ºç½çãè¿ä¸æ£å¸¸ã"
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334 tempo_dialog.cc:335
-msgid "sixteenth"
-msgstr "åå
åä¹ä¸"
+#: rc_configuration.cc:150
+msgid "Config file %1 not saved"
+msgstr "é
ç½®æä»¶ %1 æªä¿å"
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336 tempo_dialog.cc:337
-msgid "thirty-second"
-msgstr "ä¸åäºåä¹ä¸"
+#: recent_sessions.cc:55
+msgid "cannot open recent session file %1 (%2)"
+msgstr "æ æ³æå¼æè¿çä¼è¯æä»¶ %1ï¼%2ï¼"
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338 tempo_dialog.cc:339
-msgid "sixty-fourth"
-msgstr "å
åååä¹ä¸"
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr "读åæè¿çä¼è¯æä»¶ %1ï¼%2ï¼åºé"
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340 tempo_dialog.cc:341
-msgid "one-hundred-twenty-eighth"
-msgstr "ä¸ç¾äºåå
«åä¹ä¸"
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr "æ æ³æå¼æè¿çæ¨¡æ¿æä»¶ %1ï¼%2ï¼"
-#: tempo_dialog.cc:121
-msgid "Beats per minute:"
-msgstr "æ¯åéæåæ°ï¼"
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr "åå
¥æè¿çä¼è¯æä»¶ %1ï¼%2ï¼åºé"
-#: tempo_dialog.cc:155
-msgid "Tempo begins at"
-msgstr "èå¥å¼å§ä½äº"
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr "åå
¥å·²ä¿åçæ¨¡æ¿æä»¶ %1ï¼%2ï¼åºé"
-#: tempo_dialog.cc:251
-msgid "incomprehensible pulse note type (%1)"
-msgstr "ä¸å¯çè§£çèå²é³ç¬¦ç±»åï¼%1ï¼"
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
+msgid ""
+"programming error: RegionFactory::create() called with unknown Region type"
+msgstr "ç¨åºé误ï¼RegionFactory::create() 被æªç¥çåºåç±»åè°ç¨"
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "ç¼è¾èæ"
+#: region_factory.cc:566
+msgid "%1 compound-%2 (%3)"
+msgstr "%1 åæ-%2 (%3)"
-#: tempo_dialog.cc:356
-msgid "Note value:"
-msgstr "é³ç¬¦å¼ï¼"
+#: region_factory.cc:568
+msgid "%1 compound-%2.1 (%3)"
+msgstr "%1 åæ-%2.1 (%3)"
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
-msgstr "æ¯å°èæåæ°ï¼"
+#: region_factory.cc:630
+msgid "cannot create new name for region \"%1\""
+msgstr "æ æ³ä¸ºåºå \"%1\" å建æ°çåç§°"
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
-msgstr "èæå¼å§ä½äºå°èï¼"
+#: resampled_source.cc:107
+msgid "Import: %1"
+msgstr "导å
¥ï¼%1"
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
-msgstr "ä¸å¯çè§£çèæé³ç¬¦ç±»åï¼%1ï¼"
+#: resampled_source.cc:136 srcfilesource.cc:75
+msgid "Import: src_new() failed : %1"
+msgstr "导å
¥ï¼src_new() 失败ï¼%1"
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "æ·±æä¸»é¢"
+#: return.cc:42
+msgid "return %1"
+msgstr "è¿å %1"
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "æäº®ä¸»é¢"
+#: route.cc:862 route.cc:2797
+msgid "unknown Processor type \"%1\"; ignored"
+msgstr "æªç¥çå¤çå¨ç±»å \"%1\"ï¼å·²å¿½ç¥"
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "éç½®æ¢å¤é»è®¤å¼"
+#: route.cc:884
+msgid "processor could not be created. Ignored."
+msgstr "æ æ³å建å¤çå¨ã已忽ç¥ã"
-#: theme_manager.cc:68
-msgid "Draw \"flat\" buttons"
-msgstr "æç»âéè°âæé®"
+#: route.cc:2338 route.cc:2504
+msgid "Bad node sent to Route::set_state() [%1]"
+msgstr "åçèç¹åéå° Route::set_state() [%1]"
-#: theme_manager.cc:69
-msgid "Blink Rec-Arm buttons"
-msgstr "éªå
å½å¶èæé®"
+#: route.cc:2395
+msgid "Pannable state found for route (%1) without a panner!"
+msgstr "为路ç±ï¼%1ï¼æ¾å°çå¯ç¨å£°ç¸ç¶æä¸å¸¦æä¸ä¸ªå£°ç¸å¨ï¼"
-#: theme_manager.cc:70
-msgid "Color regions using their track's color"
-msgstr "使ç¨åºåçé³è½¨é¢è²ä½ä¸ºåºåè²"
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr "æ æçç¬å¥éç¦»ä¼ æï¼ä»ï¼%1 æ°ï¼%2 - æ§ï¼%3 = å¢éï¼%4"
-#: theme_manager.cc:71
-msgid "Show waveform clipping"
-msgstr "æ¾ç¤ºæ³¢å½¢æªæ³¢"
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
-#: theme_manager.cc:73
-msgid "Waveforms color gradient depth"
-msgstr "波形é¢è²æ¢¯åº¦æ·±åº¦"
+#: route.cc:4994
+msgid "lo"
+msgstr "ä½"
-#: theme_manager.cc:75
-msgid "Timeline item gradient depth"
-msgstr "æ¶é´çº¿æ¡ç®æ¢¯åº¦æ·±åº¦"
+#: route.cc:4996
+msgid "mid"
+msgstr "ä¸"
-#: theme_manager.cc:76
-msgid "All floating windows are dialogs"
-msgstr "æææµ®å¨çªå£é½æ¯å¯¹è¯æ¡"
+#: route.cc:4998
+msgid "hi"
+msgstr "é«"
-#: theme_manager.cc:77
-msgid "Transient windows follow front window."
-msgstr "临æ¶çªå£è·éåæ¹çªå£ã"
+#: route.cc:5105
+msgid "Leveler"
+msgstr "æ ¡å¹³å¨"
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr "徿 é"
+#: route.cc:5107
+msgid "Compressor"
+msgstr "å缩å¨"
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "对象ç©ä½"
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr "éå¶å¨"
-#: theme_manager.cc:163
-msgid "Items"
-msgstr "æ¡ç®"
+#: route.cc:5111
+msgid "Sidechain"
+msgstr "ä¾§é¾"
-#: theme_manager.cc:164
-msgid "Palette"
-msgstr "è°è²æ¿"
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr "éæåº¦"
+#: route.cc:5126
+msgid "Attk"
+msgstr "ä¸å²"
-#: theme_manager.cc:195
-msgid ""
-"Mark all floating windows to be type \"Dialog\" rather than using \"Utility\" for "
-"some.\n"
-"This may help with some window managers. This requires a restart of %1 to take "
-"effect"
-msgstr ""
-"æ è®°ææçªå£ç±»å为âå¯¹è¯æ¡âï¼è䏿¯ææäºçªå£æ 记为âå·¥å
·âã\n"
-"è¿ä¹è®¸å¯¹äºæäºçªå£ç®¡çææå¸®å©ãè¿éè¦éæ°å¯å¨ %1以çæã"
+#: route.cc:5128
+msgid "Ratio"
+msgstr "æ¯ç"
-#: theme_manager.cc:199
-msgid ""
-"Make transient windows follow the front window when toggling between the editor "
-"and mixer.\n"
-"This requires a restart of %1 to take effect"
-msgstr ""
-"å¨ç¼è¾å¨åæ··é³å¨ä¹é´åæ¢æ¶ï¼è®©ä¸´æ¶çªå£è·éåæ¹çªå£ã\n"
-"è¿éè¦éæ°å¯å¨ %1以çæã"
+#: route.cc:5131
+msgid "Rels"
+msgstr "éæ¾"
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "颿è°è²æ¿"
+#: route_group.cc:507
+msgid "You cannot subgroup MIDI tracks at this time"
+msgstr "æ¨æ æ³å¨æ¤æ¶å建 MIDI é³è½¨å群ç»"
-#: time_axis_view.cc:148
-msgid "Track/Bus name (double click to edit)"
-msgstr "é³è½¨/æ»çº¿åç§°ï¼åå»å³å¯ç¼è¾ï¼"
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr "æ¨æ æ³å¨æ¤æ¶å建带ä¸åè¾åºç«¯ç¼å·çé³è½¨å群ç»ã"
-#: time_axis_view_item.cc:345
-msgid "new duration %1 frame is out of bounds for %2"
-msgid_plural "new duration of %1 frames is out of bounds for %2"
-msgstr[0] "æ°çé³é¿ %1 帧è¶
åºäº %2 çè¾¹ç"
+#: rb_effect.cc:229 rb_effect.cc:269
+msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
+msgstr "èå¥å°ºå¯¸ï¼ä» %1 ä½äº %2 å¤è¯»åæ°æ®åºéï¼éè¦ %3ï¼å¾å° %4ï¼"
-#: time_fx_dialog.cc:62
-msgid "Quick but Ugly"
-msgstr "å¿«éï¼ä½ä¸ä¼ç¾ï¼"
+#: rb_effect.cc:298 rb_effect.cc:320
+msgid "error writing tempo-adjusted data to %1"
+msgstr "åå
¥èå¥å·²è°æ´æ°æ®å° %1 æ¶åºé"
-#: time_fx_dialog.cc:63
-msgid "Skip Anti-aliasing"
-msgstr "è·³è¿èªå¨å¯¹é½"
+#: send.cc:62
+msgid "aux %1"
+msgstr "è¾
å© %1"
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "å
容ï¼"
+#: send.cc:66
+msgid "send %1"
+msgstr "åé端 %1"
-#: time_fx_dialog.cc:65
-msgid "Minimize time distortion"
-msgstr "åå°æ¶é´ææ²"
+#: send.cc:68
+msgid "programming error: send created using role %1"
+msgstr "ç¨åºé误ï¼ä½¿ç¨è§è² %1 å·²å建åé端"
-#: time_fx_dialog.cc:66
-msgid "Preserve Formants"
-msgstr "ä¿æå
±æ¯å³°"
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr "æ æ³è¿æ¥å°é³é¢/MIDI弿"
-#: time_fx_dialog.cc:71
-msgid "TimeFXDialog"
-msgstr "æ¶é´ç¹æå¯¹è¯æ¡"
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr "ä¼è¯åå§å失败"
-#: time_fx_dialog.cc:74
-msgid "Pitch Shift Audio"
-msgstr "é³é«æ¿æ¢é³é¢"
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr "è½½å
¥æ¨¡æ¿/å¿«ç
§ç¶æå¤±è´¥"
-#: time_fx_dialog.cc:76
-msgid "Time Stretch Audio"
-msgstr "æ¶é´å»¶ä¼¸é³é¢"
+#: session.cc:385
+msgid "Failed to load state"
+msgstr "è½½å
¥ç¶æå¤±è´¥"
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
-msgid "Octaves:"
-msgstr "å
«åº¦ï¼"
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr "æ æ³ç¨ä¼è¯åæ°é
ç½®é³é¢/MIDI弿"
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
-msgid "Semitones:"
-msgstr "åé³ï¼"
+#: session.cc:433
+msgid "Connect to engine"
+msgstr "è¿æ¥å°å¼æ"
-#: time_fx_dialog.cc:114
-msgid "Cents:"
-msgstr "é³åï¼"
+#: session.cc:484
+msgid "Session loading complete"
+msgstr "ä¼è¯å è½½å®æ"
-#: time_fx_dialog.cc:122
-msgid "Time|Shift"
-msgstr "æ¶é´|æ¿æ¢"
+#: session.cc:575
+msgid "Set up LTC"
+msgstr "å»ºç« LTCï¼çºµåæ¶é´ç ï¼"
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
-msgid "TimeFXButton"
-msgstr "æ¶é´ç¹ææé®"
+#: session.cc:577
+msgid "Set up Click"
+msgstr "建ç«é³é¢è¯å«å£°ï¼èæå¨ï¼"
-#: time_fx_dialog.cc:154
-msgid "Stretch/Shrink"
-msgstr "延伸/æ¶ç¼©"
+#: session.cc:579
+msgid "Set up standard connections"
+msgstr "å»ºç«æ åè¿æ¥"
-#: time_fx_dialog.cc:164
-msgid "<b>Progress</b>"
-msgstr "<b>è¿ç¨</b>"
+#: session.cc:888
+msgid "could not setup Click I/O"
+msgstr "æ æ³è®¾ç½®é³é¢è¯å«å£°ï¼èæå¨ï¼è¾å
¥/è¾åº"
-#: time_info_box.cc:124
-msgid "Start recording at auto-punch start"
-msgstr "å¨èªå¨åæ¢èµ·ç¹å¼å§å½å¶"
+#: session.cc:951
+#, c-format
+msgid "out %s"
+msgstr "è¾åº %s"
-#: time_info_box.cc:125
-msgid "Stop recording at auto-punch end"
-msgstr "å¨èªå¨åæ¢ç»ç¹åæ¢å½å¶"
+#: session.cc:953
+#, c-format
+msgid "out %<PRIu32>"
+msgstr "è¾åº %<PRIu32>"
-#: time_selection.cc:40
-msgid "programming error: request for non-existent audio range (%1)!"
-msgstr "ç¨åºé误: éè¦çé³é¢èå´ï¼%1ï¼ä¸åå¨ï¼"
+#: session.cc:968
+#, c-format
+msgid "out %<PRIu32>+%<PRIu32>"
+msgstr "è¾åº %<PRIu32>+%<PRIu32>"
-#: transform_dialog.cc:39
-msgid "this note's"
-msgstr "è¿ä¸ªé³ç¬¦ç"
+#: session.cc:985
+#, c-format
+msgid "in %s"
+msgstr "è¾å
¥ %s"
-#: transform_dialog.cc:40
-msgid "the previous note's"
-msgstr "ä¸ä¸ä¸ªé³ç¬¦ç"
+#: session.cc:987
+#, c-format
+msgid "in %<PRIu32>"
+msgstr "è¾å
¥ %<PRIu32>"
-#: transform_dialog.cc:41
-msgid "this note's index"
-msgstr "è¿ä¸ªé³ç¬¦çç´¢å¼"
+#: session.cc:1002
+#, c-format
+msgid "in %<PRIu32>+%<PRIu32>"
+msgstr "è¾å
¥ %<PRIu32>+%<PRIu32>"
-#: transform_dialog.cc:42
-msgid "the number of notes"
-msgstr "é³ç¬¦çæ°ç®"
+#: session.cc:1082
+msgid "cannot connect master output %1 to %2"
+msgstr "æ æ³è¿æ¥ä¸»æ§è¾åº %1 å° %2"
-#: transform_dialog.cc:43
-msgid "exactly"
-msgstr "精确å°"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
+msgstr "æ æ³åå»ºçæ§é¨åãâçæ§â端å£åç§°ä¸æ¯å¯ä¸çã"
-#: transform_dialog.cc:44
-msgid "a random number from"
-msgstr "ä¸ä¸ªéæºæ°æ¥èªäº"
+#: session.cc:1204 session.cc:1335
+msgid "cannot connect control input %1 to %2"
+msgstr "æ æ³è¿æ¥æ§å¶è¾å
¥ %1 å° %2"
-#: transform_dialog.cc:55
-msgid "equal steps from"
-msgstr "ç¸åæ¥é¿æ¥èªäº"
+#: session.cc:1224 session.cc:1354
+msgid "The preferred I/O for the monitor bus (%1) cannot be found"
+msgstr "æ¾ä¸å°ç¨äºçæ§æ»çº¿ï¼%1ï¼çä¼å
è¾å
¥/è¾åº"
-#: transform_dialog.cc:58
-msgid "note number"
-msgstr "é³ç¬¦ç¼å·"
+#: session.cc:1255 session.cc:1385
+msgid "cannot connect control output %1 to %2"
+msgstr "æ æ³è¿æ¥æ§å¶è¾åº %1 å° %2"
-#: transform_dialog.cc:59
-msgid "velocity"
-msgstr "å度"
+#: session.cc:1443
+msgid "cannot create Auditioner: no auditioning of regions possible"
+msgstr "æ æ³å建çå¬å¨ï¼ä¸å¯è½çå¬åºå"
-#: transform_dialog.cc:60
-msgid "start time"
-msgstr "èµ·ç¹æ¶é´"
+#: session.cc:1644
+msgid "Session: you can't use that location for auto punch (start <= end)"
+msgstr "ä¼è¯ï¼æ¨ä¸è½ä¸ºèªå¨åæ¢ä½¿ç¨è¯¥ä½ç½®ï¼èµ·ç¹ <= ç»ç¹ï¼"
-#: transform_dialog.cc:61
-msgid "length"
-msgstr "é¿åº¦"
+#: session.cc:1671
+msgid "Session: you can't use that location for session start/end)"
+msgstr "ä¼è¯ï¼æ¨ä¸è½ä¸ºä¼è¯ä½¿ç¨è¯¥ä½ç½®ï¼èµ·ç¹/ç»ç¹ï¼"
-#: transform_dialog.cc:82 transform_dialog.cc:113
-msgid "Transform"
-msgstr "忢"
+#: session.cc:1703
+msgid ""
+"You cannot use this location for auto-loop because it has zero or negative "
+"length"
+msgstr "æ¨ä¸è½ä¸ºèªå¨å¾ªç¯ä½¿ç¨è¯¥ä½ç½®ï¼å 为å®çé¿åº¦æ¯é¶æè
è´å¼"
-#: transform_dialog.cc:91
-msgid "Set "
-msgstr "é"
+#: session.cc:1886
+msgid "programming error: session range removed!"
+msgstr "ç¨åºé误ï¼ä¼è¯èå´å·²ç§»é¤ï¼"
-#: transpose_dialog.cc:30
-msgid "Transpose MIDI"
-msgstr "åè° MIDI"
+#: session.cc:2158
+msgid "feedback loop setup between %1 and %2"
+msgstr "åé¦ç¯è·¯è®¾ç½®å¨ %1 å %2 ä¹é´"
-#: transpose_dialog.cc:55
-msgid "Transpose"
-msgstr "åè°"
+#: session.cc:2419
+msgid "Track "
+msgstr "é³è½¨"
-#: ui_config.cc:163 ui_config.cc:300
-msgid "Loading default ui configuration file %1"
-msgstr "è½½å
¥é»è®¤ç¨æ·çé¢é
ç½®æä»¶ %1"
+#: session.cc:2421
+msgid "Audio "
+msgstr "é³é¢"
-#: ui_config.cc:166 ui_config.cc:303
-msgid "cannot read default ui configuration file \"%1\""
-msgstr "æ æ³è¯»åé»è®¤ç¨æ·çé¢é
ç½®æä»¶ \"%1\""
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
-#: ui_config.cc:169 ui_config.cc:308
-msgid "default ui configuration file \"%1\" not loaded successfully."
-msgstr "é»è®¤ç¨æ·çé¢é
ç½®æä»¶ \"%1\" è½½å
¥ä¸æåã"
+#: session.cc:2500
+msgid "Session: could not create new midi track."
+msgstr "ä¼è¯ï¼æ æ³å建æ°ç MIDI é³è½¨ã"
-#: ui_config.cc:177
-msgid "Could not find default UI configuration file %1"
-msgstr "æ æ³æ¾å°é»è®¤ç¨æ·çé¢é
ç½®æä»¶\"%1\""
+#: session.cc:2506
+msgid ""
+"No more JACK ports are available. You will need to stop %1 and restart JACK "
+"with more ports if you need this many tracks."
+msgstr ""
+"æ æ´å¤ç JACK 端å£å¯ç¨ã妿æ¨éè¦è¿ä¹å¤é³è½¨ï¼æ¨å°å¿
须忢 %1 ï¼ç¶åå¸¦çæ´å¤"
+"ç端å£éå¯ JACKã"
-#: ui_config.cc:219
-msgid "Loading color file %1"
-msgstr "è½½å
¥é¢è²æä»¶ %1"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr "MIDI æ»çº¿"
-#: ui_config.cc:222
-msgid "cannot read color file \"%1\""
-msgstr "æ æ³è¯»åé¢è²æä»¶ %1"
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr "æ æ³é
ç½®æ°ç MIDI æ»çº¿è¾å
¥"
-#: ui_config.cc:227
-msgid "color file \"%1\" not loaded successfully."
-msgstr "é¢è²æä»¶ %1è½½å
¥ä¸æå"
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr "æ æ³é
ç½®æ°ç MIDI æ»çº¿è¾åº"
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "æ¾ä¸å°é¢è²æä»¶ %1"
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "ä¼è¯ï¼æ æ³å建æ°çé³é¢è·¯ç±ã"
-#: ui_config.cc:282 ui_config.cc:361
-msgid "Color file %1 not saved"
-msgstr "å°æªä¿åé¢è²æä»¶ %1"
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
+msgid "cannot configure %1 in/%2 out configuration for new audio track"
+msgstr "æ æ³ä¸ºæ°çé³é¢è½¨éé
ç½® %1 å
¥/ %2 åºçé
ä½"
-#: ui_config.cc:317
-msgid "Loading user ui configuration file %1"
-msgstr "è½½å
¥ç¨æ·çé¢é
ç½®æä»¶ %1"
+#: session.cc:3050
+msgid "Session: could not create new audio track."
+msgstr "ä¼è¯ï¼æ æ³å建æ°çé³é¢è½¨éã"
-#: ui_config.cc:320
-msgid "cannot read ui configuration file \"%1\""
-msgstr "æ æ³è¯»åç¨æ·çé¢é
ç½®æä»¶ \"%1\""
+#: session.cc:3088 session.cc:3091
+msgid "Bus"
+msgstr "æ»çº¿"
-#: ui_config.cc:325
-msgid "user ui configuration file \"%1\" not loaded successfully."
-msgstr "ç¨æ·çç¨æ·çé¢é
ç½®æä»¶ \"%1\" è½½å
¥ä¸æåã"
+#: session.cc:3207 session.cc:3217
+msgid "Session: UINT_MAX routes? impossible!"
+msgstr "ä¼è¯ï¼UINT_MAX è·¯ç±ï¼ä¸å¯è½ï¼"
-#: ui_config.cc:333
-msgid "could not find any ui configuration file, canvas will look broken."
-msgstr "æ¾ä¸å°ä»»ä½ç¨æ·çé¢é
ç½®æä»¶ï¼çé¢çèµ·æ¥å°ä¸å¤§ç¾è§ã"
+#: session.cc:3293
+msgid "Session: cannot create track/bus from template description"
+msgstr "ä¼è¯ï¼æ æ³ä»æ¨¡æ¿æè¿°å建æ°çé³è½¨/æ»çº¿"
-#: ui_config.cc:351
-msgid "Config file %1 not saved"
-msgstr "å°æªä¿åé
ç½®æä»¶ %1"
+#: session.cc:3331
+msgid "Session: could not create new route from template"
+msgstr "ä¼è¯ï¼æ æ³ä»æ¨¡æ¿å建æ°çé³é¢è·¯ç±"
-#: ui_config.cc:592
-msgid "Color %1 not found"
-msgstr "æ¾ä¸å°é¢è² %1"
+#: session.cc:3365
+msgid "Adding new tracks/busses failed"
+msgstr "æ·»å æ°çé³è½¨/æ»çº¿å¤±è´¥"
-#: ui_config.cc:662
-msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
-msgstr "å¨æç´¢è·¯å¾ %2 䏿¾ä¸å°ç¨æ·ç颿 ·å¼æä»¶ %1ã%3 çèµ·æ¥å°ä¸å¤§ç¾è§ã"
+#: session.cc:4784
+msgid "Merging embedded file %1: name collision AND md5 hash collision!"
+msgstr "åå¹¶åµå
¥çæä»¶ %1ï¼åç§°å²çªå¹¶ä¸ md5 åå¸å²çªï¼"
-#: utils.cc:117 utils.cc:160
-msgid "bad XPM header %1"
-msgstr "æåç XPM æ¥å¤´ %1"
+#: session.cc:4914 session.cc:4987
+msgid "There are already %1 recordings for %2, which I consider too many."
+msgstr "卿¤ %1 å·²ç»ä¸º %2 å½å¶ä¸ï¼æèè太å¤ã"
-#: utils.cc:577
-msgid "cannot find XPM file for %1"
-msgstr "æ¾ä¸å° XPM æä»¶æä¾ç» %1"
+#: session.cc:5663
+msgid "send ID %1 appears to be in use already"
+msgstr "åé端 ID ä¼¼ä¹å·²ç»å¨ä½¿ç¨ä¸"
-#: utils.cc:597 utils.cc:627 utils.cc:641
-msgid "default"
-msgstr "é»è®¤"
+#: session.cc:5675
+msgid "aux send ID %1 appears to be in use already"
+msgstr "è¾
å©åé端 ID ä¼¼ä¹å·²ç»å¨ä½¿ç¨ä¸"
-#: utils.cc:642
-msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
-msgstr "æ¾ä¸å°å¾æ \"%1\" æä¾ç»å¾æ é \"%2\"ï¼éåé»è®¤ç¶æ"
+#: session.cc:5687
+msgid "return ID %1 appears to be in use already"
+msgstr "è¿å ID ä¼¼ä¹å·²ç»å¨ä½¿ç¨ä¸"
-#: utils.cc:649
-msgid "cannot find icon image for %1 using %2"
-msgstr "æ¾ä¸å°å¾æ å¾åæä¾ç» %1 ä½¿ç¨ %2"
+#: session.cc:5699
+msgid "insert ID %1 appears to be in use already"
+msgstr "æå
¥ ID ä¼¼ä¹å·²ç»å¨ä½¿ç¨ä¸"
-#: utils.cc:666 utils.cc:682
-msgid "Caught exception while loading icon named %1"
-msgstr "è½½å
¥å½å为 %1 ç徿 æ¶éå°å¼å¸¸"
+#: session.cc:5825
+msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
+msgstr "æ æ³åå
¥ä¸ä¸ªä½äºç»ç¹ <= èµ·ç¹çèå´ï¼ä¾å¦ %1 <= %2ï¼"
-#: add_video_dialog.cc:54
-msgid "Set Video Track"
-msgstr "设置è§é¢è½¨é"
+#: session.cc:5834
+msgid "Cannot write a range with no data."
+msgstr "æ²¡ææ°æ®æ æ³åå
¥ä¸ä¸ªèå´ã"
-#: add_video_dialog.cc:62
-msgid "Open Video Monitor Window"
-msgstr "æå¼è§é¢çæ§çªå£"
+#: session.cc:5876
+msgid "cannot create new file \"%1\" for %2"
+msgstr "æ æ³ä¸º %2 å建æ°çæä»¶ \"%1\""
-#: add_video_dialog.cc:63
-msgid "Adjust Session Framerate to Match Video Framerate"
-msgstr "è°æ´ä¼è¯å¸§çå¹é
è§é¢å¸§ç"
+#: session_click.cc:162
+msgid "cannot open click soundfile %1 (%2)"
+msgstr "æ æ³æå¼é³é¢è¯å«å£°ï¼èæå¨ï¼å£°é³æä»¶ %1ï¼%2ï¼"
-#: add_video_dialog.cc:65
-msgid "Reload docroot"
-msgstr "éæ°è½½å
¥ææ¡£æ ¹"
+#: session_click.cc:175
+msgid "cannot read data from click soundfile"
+msgstr "æ æ³ä»é³é¢è¯å«å£°ï¼èæå¨ï¼å£°é³æä»¶è¯»åæ°æ®"
-#: add_video_dialog.cc:120
-msgid "Video files"
-msgstr "è§é¢æä»¶"
+#: session_command.cc:87
+msgid "Tried to reconstitute a MementoCommand with no contents, failing. id=%1"
+msgstr "è¯å¾ä»¥æ å
容æ¥éæ°ç»æä¸ä¸ª MementoCommandï¼å¤±è´¥ãid=%1"
-#: add_video_dialog.cc:149
-msgid "<b>Video Information</b>"
-msgstr "<b>è§é¢ä¿¡æ¯</b>"
+#: session_command.cc:148
+msgid ""
+"could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"
+msgstr ""
+"è¯å¾ä» XML èç¹æ¥éæ°ç»æä¸ä¸ª MementoCommand å½ä»¤ ã对象ç©ä½ç±»å= %1 id=%2"
-#: add_video_dialog.cc:152
-msgid "Start:"
-msgstr "èµ·ç¹ï¼"
+#: session_command.cc:177
+msgid ""
+"could not reconstitute StatefulDiffCommand from XMLNode. object type = %1 id "
+"= %2"
+msgstr ""
+"è¯å¾ä» XML èç¹æ¥éæ°ç»æä¸ä¸ª StatefulDiffCommand å½ä»¤ ã对象ç©ä½ç±»å= %1 id="
+"%2"
-#: add_video_dialog.cc:158
-msgid "Frame rate:"
-msgstr "帧çï¼"
+#: session_configuration.cc:150
+msgid "%1: cannot part default session options \"%2\""
+msgstr "%1ï¼æ æ³åå¼é»è®¤ä¼è¯é项 \"%2\""
-#: add_video_dialog.cc:161
-msgid "Aspect Ratio:"
-msgstr "é¿å®½æ¯ï¼"
+#: session_configuration.cc:156
+msgid "Invalid session default XML Root."
+msgstr "æ æçä¼è¯é»è®¤XMLæ ¹ã"
-#: add_video_dialog.cc:244
-msgid "VideoServerIndex"
-msgstr "è§é¢æå¡ç´¢å¼"
+#: session_configuration.cc:164
+msgid "Loaded custom session defaults."
+msgstr "已载å
¥èªå®ä¹ä¼è¯é»è®¤å¼ã"
-#: add_video_dialog.cc:675
-msgid " %1 fps"
-msgstr ""
+#: session_configuration.cc:166
+msgid "Found no session defaults in XML file."
+msgstr "å¨ XML æä»¶ä¸æ¾ä¸å°ä¼è¯é»è®¤å¼ã"
-#: video_timeline.cc:468
-msgid ""
-"Parsing video file info failed. Is the Video Server running? Is the file readable "
-"by the Video Server? Does the docroot match? Is it a video file?"
-msgstr ""
-"è§£æè§é¢æä»¶ä¿¡æ¯å¤±è´¥ãè§é¢æå¡å¨æ¯å¦æ£å¨è¿è¡åï¼è§é¢æå¡å¨æ¯å¦å¯è¾¨è¯è¯¥æä»¶ï¼ææ¡£æ ¹"
-"æ¯å¦å¹é
ï¼è¿æ¯ä¸ä¸ªè§é¢æä»¶åï¼"
+#: session_configuration.cc:192
+msgid "Could not save session options"
+msgstr "æ æ³ä¿åä¼è¯é项"
-#: video_timeline.cc:506
-msgid ""
-"Failed to set session-framerate: '%1' does not have a corresponding option setting "
-"in %2."
-msgstr "设置ä¼è¯å¸§ç失败ï¼'%1' çé项设置ä¸å¨ %2 éçä¸ä¸è´ã"
+#: session_directory.cc:65
+msgid "Cannot create Session directory at path %1 Error: %2"
+msgstr "æ æ³å建ä¼è¯ç®å½å¨è·¯å¾ %1 ä¸ï¼é误ï¼%2"
-#: video_timeline.cc:514
-msgid ""
-"Video file's framerate is not equal to %1 session timecode's framerate: '%2' vs "
-"'%3'"
-msgstr "è§é¢æä»¶ç帧çä¸çäº %1 ä¼è¯æ¶é´ç 帧çï¼ '%2' vs '%3'"
+#: session_directory.cc:82
+msgid "Session subdirectory does not exist at path %1"
+msgstr "ä¼è¯åç®å½ä¸åå¨äºè·¯å¾ %1"
-#: video_timeline.cc:587
+#: session_directory.cc:161
msgid ""
-"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually means "
-"that the video server was not started by %1 and uses a different document-root."
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
msgstr ""
-"è§é¢æä»¶ææ¡£æ ¹ä¸å¹é
ã%1: '%2'ï¼è§é¢æå¡å¨ï¼'%3'ãè¿é常æå³çè§é¢æå¡å¨æªè½éè¿ "
-"%1 å¯å¨ï¼å¹¶ä¸ä½¿ç¨çä¸ä¸ªä¸åçææ¡£æ ¹ã"
+"ä¼è¯ç®å½åä¼è¯åç§°ä¸å¹é
ã以å请使ç¨âèå > ä¼è¯ > éå½åâæ¥éå½åä¼è¯ã"
-#: video_timeline.cc:724
+#: session_directory.cc:167
msgid ""
-"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ (a "
-"custom path to xjadeo can be specified by setting the XJREMOTE environment "
-"variable. It should point to an application compatible with xjadeo's remote-"
-"control interface 'xjremote').\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
msgstr ""
-"è§é¢çæ§ 'xjadeo' æªæ¾å°ã请å®è£
http://xjadeo.sf.net/ ï¼å¯ä»¥éè¿è®¾ç½® XJREMOTE ç¯å¢"
-"å鿥æå®ä¸ä¸ªå° xjadeo çå®å¶è·¯å¾ãå®åºè¯¥æåä¸ä¸ªå
¼å®¹ xjadeo 饿§çé¢ 'xjremote' "
-"çåºç¨ç¨åºï¼ã\n"
-"\n"
-"请åé
http://manual.ardour.org/video-timeline/setup/"
+"ä¼è¯ç交æ¢ç®å½å·²è¢«æ±¡æã\n"
+"å¨ '%1' éæä¸æ¢ä¸ä¸ªæä»¶å¤¹ã\n"
+"请移é¤é¢å¤çåç®å½ä»¥åå°æä»¶åäº§çæ§ä¹çå¯è½æ§ã"
-#: video_timeline.cc:739
-msgid "Video-monitor 'xjadeo' cannot be launched."
-msgstr "è§é¢çæ§ 'xjadeo' æ æ³å¯å¨ã"
+#: session_events.cc:229
+msgid "Session: cannot have two events of type %1 at the same frame (%2)."
+msgstr "ä¼è¯ï¼å¨ç¸åç帧ï¼%2ï¼éä¸è½æä¸¤ä¸ªç±»å为 %1 çäºä»¶ã"
-#: video_timeline.cc:766
-msgid ""
-"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or later. "
-"http://xjadeo.sf.net/"
-msgstr ""
-"è§é¢çæ§ 'xjadeo' 太è¿èæ§ã请å®è£
xjadeo 0.7.7 æè
æ´æ°ççæ¬ã http://xjadeo.sf."
-"net/"
+#: session_export.cc:152
+msgid "%1: cannot seek to %2 for export"
+msgstr "%1ï¼æ æ³æå¯»å° %2 ç¨äºå¯¼åº"
-#: video_monitor.cc:285
-msgid "Video Monitor: File Not Found."
-msgstr "è§é¢çæ§ï¼æ¾ä¸å°æä»¶ã"
+#: session_export.cc:216
+msgid "Export ended unexpectedly: %1"
+msgstr "å¯¼åºæå¤ç»æï¼%1"
-#: transcode_ffmpeg.cc:56
+#: session_ltc.cc:221
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
-"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
-"\n"
-"The tools are included with the %1 releases from ardour.org and also available "
-"with the video-server at http://x42.github.com/harvid/\n"
-"\n"
-"Important: the files need to be installed in $PATH and named ffmpeg_harvid and "
-"ffprobe_harvid.\n"
-"If you already have a suitable ffmpeg installation on your system, we recommend "
-"creating symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to "
-"ffprobe_harvid.\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
+"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
+"of this session."
msgstr ""
-"å¨è¿ä¸ªç³»ç»ä¸æ²¡æ¾å° ffprobe æè
ffmpeg 坿§è¡æä»¶ã\n"
-"è§é¢å¯¼å
¥åå¯¼åºæ æ³è¿è¡ï¼é¤éæ¨å®è£
è¿äºå·¥å
·ã\n"
-"%1 éè¦ ffmpeg å ffprobeï¼æ¥èª ffmpeg.org 1.1 æè
æ´æ°ççæ¬ã\n"
-"\n"
-"è¿å·¥å
·å
æ¬æ¥èª ardour.org ç %1ï¼å¹¶ä¸ä¹å¯ç¨äº http://x42.github.com/harvid/ ä¸çè§"
-"颿å¡ã\n"
-"\n"
-"注æï¼è¿äºæä»¶éè¦å®è£
å¨ $PATH å¹¶ä¸å½å为 ffmpeg_harvid å ffprobe_harvid ã\n"
-"妿æ¨å¨æ¨çç³»ç»ä¸å·²ç»å®è£
æä¸ä¸ªåéç ffmpegï¼æä»¬å»ºè®®ç» ffmpeg å建符å·é¾æ¥ä¸º "
-"ffmpeg_harvidï¼ç» ffprobe å建符å·é¾æ¥ä¸º ffprobe_harvid ã\n"
-"\n"
-"请åé
http://manual.ardour.org/video-timeline/setup/"
+"LTCï¼çºµåæ¶é´ç ï¼ç¼ç å¨ï¼æ æç帧çââLTCï¼çºµåæ¶é´ç ï¼ç¼ç 已被ç¦ç¨äºæ¬ä¼è¯ä½"
+"ä¸çé¨åã"
-#: transcode_video_dialog.cc:56
-msgid "Transcode/Import Video File "
-msgstr "转ç /导å
¥è§é¢æä»¶"
+#: session_midi.cc:570
+msgid "Session: cannot send quarter-frame MTC message (%1)"
+msgstr "ä¼è¯ï¼æ æ³åéååä¹ä¸å¸§MTCï¼MIDI æ¶é´ç ï¼ä¿¡æ¯ï¼%1ï¼"
-#: transcode_video_dialog.cc:58
-msgid "Output File:"
-msgstr "å¯¼åºæä»¶ï¼"
+#: session_playlists.cc:405 session_playlists.cc:424
+msgid "Session: cannot create Playlist from XML description."
+msgstr "ä¼è¯ï¼æ æ³ä» XML æè¿°åå»ºææ¾å表ã"
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
-msgid "Abort"
-msgstr "䏿¢"
+#: session_process.cc:159
+msgid "Session: error in no roll for %1"
+msgstr "ä¼è¯ï¼å¨ä¸º %1 æ æ»å¨ä¸åºé"
-#: transcode_video_dialog.cc:63
-msgid "Height = "
-msgstr "é«åº¦ = "
+#: session_process.cc:1202
+msgid "Programming error: illegal event type in process_event (%1)"
+msgstr "ç¨åºé误ï¼éæ³äºä»¶ç±»åä½äº process_event (%1)"
-#: transcode_video_dialog.cc:66
-msgid "Manual Override"
-msgstr "æå¨è¦ç"
+#: session_state.cc:194
+msgid "solo cut control (dB)"
+msgstr "ç¬å¥åªåæ§å¶ï¼dBï¼"
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
-msgid "Debug Mode: Print ffmpeg command and output to stdout."
-msgstr "è°è¯æ¨¡å¼ï¼æå° ffmpeg å½ä»¤å¹¶è¾åºå°æ åè¾åºã"
+#: session_state.cc:216
+msgid "Set block size and sample rate"
+msgstr "设置å大å°åéæ ·ç"
-#: transcode_video_dialog.cc:107
-msgid "<b>File Information</b>"
-msgstr "<b>æä»¶ä¿¡æ¯</b>"
+#: session_state.cc:221
+msgid "Using configuration"
+msgstr "æ£å¨ä½¿ç¨é
ç½®"
-#: transcode_video_dialog.cc:113
-msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import is "
-"not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"å¨è¿ä¸ªç³»ç»ä¸æ²¡æ¾å° ffprobe æè
ffmpeg 坿§è¡æä»¶ãè§é¢å¯¼å
¥æ æ³è¿è¡ï¼é¤éæ¨å®è£
è¿äº"
-"å·¥å
·ãæ´å¤çä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
+#: session_state.cc:348
+msgid "Reset Remote Controls"
+msgstr "éç½®é¥æ§æ§å¶"
-#: transcode_video_dialog.cc:120
-msgid ""
-"File-info can not be read. Most likely '%1' is not a valid video-file or an "
-"unsupported video codec or format."
-msgstr ""
-"æ æ³è¯»åæä»¶ä¿¡æ¯ãææå¯è½ 'â% 1' 䏿¯ä¸ä¸ªææçè§é¢æä»¶ï¼æè
æ¯ä¸ä¸ªä¸æ¯æçè§é¢ç¼"
-"è§£ç å¨ææ ¼å¼ã"
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr "æ£å¨å¡«å
åæ¾ç¼å²"
-#: transcode_video_dialog.cc:134
-msgid "FPS:"
-msgstr ""
+#: session_state.cc:475
+msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯å³°å¼æä»¶çæä»¶å¤¹ \"%1\" (%2)"
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr "é³é¿ï¼"
+#: session_state.cc:482
+msgid "Session: cannot create session sounds dir \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯å£°é³ç®å½ \"%1\" (%2)"
-#: transcode_video_dialog.cc:138
-msgid "Codec:"
-msgstr "ç¼ç ï¼"
+#: session_state.cc:489
+msgid "Session: cannot create session midi dir \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯ MIDI ç®å½ \"%1\" (%2)"
-#: transcode_video_dialog.cc:140
-msgid "Geometry:"
-msgstr "å ä½å½¢ç¶ï¼"
+#: session_state.cc:496
+msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯æ²å¯å£°é³æä»¶å¤¹ \"%1\" (%2)"
-#: transcode_video_dialog.cc:155
-msgid "??"
-msgstr ""
+#: session_state.cc:503
+msgid "Session: cannot create session export folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯å¯¼åºæä»¶å¤¹ \"%1\" (%2)"
-#: transcode_video_dialog.cc:176
-msgid "<b>Import Settings</b>"
-msgstr "<b>导å
¥è®¾ç½®</b>"
+#: session_state.cc:510
+msgid "Session: cannot create session analysis folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯åææä»¶å¤¹ \"%1\" (%2)"
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
-msgstr "ä»å½åä½ç½®å¼ç¨ï¼ä»
ä¸ä¸ä¸ªå·²è½¬ç æä»¶ï¼"
+#: session_state.cc:517
+msgid "Session: cannot create session plugins folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯æä»¶æä»¶å¤¹ \"%1\" (%2)"
-#: transcode_video_dialog.cc:183
-msgid "Import/Transcode Video to Session"
-msgstr "导å
¥/转ç è§é¢å°ä¼è¯"
+#: session_state.cc:524
+msgid "Session: cannot create session externals folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯å¤é¨æä»¶å¤¹ \"%1\" (%2)"
-#: transcode_video_dialog.cc:191
-msgid "Do Not Import Video (Audio Import Only)"
-msgstr "ä¸è¦å¯¼å
¥è§é¢ï¼ä»
导å
¥é³é¢ï¼"
+#: session_state.cc:538
+msgid "Session: cannot create session folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建ä¼è¯æä»¶å¤¹ \"%1\" (%2)"
-#: transcode_video_dialog.cc:200
-msgid "Scale Video: Width = "
-msgstr "缩æ¾è§é¢ï¼å®½åº¦ = "
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr "读åä¼è¯æ¨¡æ¿æä»¶ %1 (%2) æ¶åºé"
-#: transcode_video_dialog.cc:207
-msgid "Original Width"
-msgstr "åå§å®½åº¦"
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr "åå
¥ä¼è¯æ¨¡æ¿æä»¶ %1 (%2) æ¶åºé"
-#: transcode_video_dialog.cc:222
-msgid "Bitrate (KBit/s):"
-msgstr "æ¯ç¹çï¼ç ç KBit/sï¼ï¼"
+#: session_state.cc:601
+msgid "Could not open %1 for writing session template"
+msgstr "æ æ³æå¼ %1 ç¨äºåå
¥ä¼è¯æ¨¡æ¿"
-#: transcode_video_dialog.cc:227
-msgid "Extract Audio:"
-msgstr "æåé³é¢ï¼"
+#: session_state.cc:608
+msgid "Could not open session template %1 for reading"
+msgstr "æ æ³æå¼ä¼è¯æ¨¡æ¿ %1 ç¨äºè¯»å"
-#: transcode_video_dialog.cc:232
-msgid "No Audio Track Present"
-msgstr "æ é³é¢è½¨éåç°"
+#: session_state.cc:626
+msgid "Loop"
+msgstr "循ç¯"
-#: transcode_video_dialog.cc:235
-msgid "Do Not Extract Audio"
-msgstr "æ æ³æåé³é¢"
+#: session_state.cc:707
+msgid "Could not remove pending capture state at path \"%1\" (%2)"
+msgstr "æ æ³ç§»é¤å¨è·¯å¾ \"%1\" (%2) ä¸å¾
å®çæè·ç¶æ"
-#: transcode_video_dialog.cc:350
-msgid "Extracting Audio.."
-msgstr "é³é¢æåä¸â¦"
+#: session_state.cc:731
+msgid "could not rename snapshot %1 to %2 (%3)"
+msgstr "æ æ³éå½åå¿«ç
§ %1 为 %2ï¼%3ï¼"
-#: transcode_video_dialog.cc:353
-msgid "Audio Extraction Failed."
-msgstr "é³é¢æå失败ã"
+#: session_state.cc:759
+msgid "Could not remove session file at path \"%1\" (%2)"
+msgstr "æ æ³ç§»é¤å¨è·¯å¾ \"%1\" (%2) ä¸çä¼è¯æä»¶"
-#: transcode_video_dialog.cc:379
-msgid "Transcoding Video.."
-msgstr "è§é¢è½¬ç ä¸â¦"
+#: session_state.cc:788
+msgid ""
+"the %1 audio engine is not connected and state saving would lose all I/O "
+"connections. Session not saved"
+msgstr "%1 é³é¢å¼ææªè¿æ¥ï¼ä¸è¯¥ç¶æä¿åæ¶å°ä¸¢å¤±ææçè¾å
¥/è¾åºè¿æ¥ãä¼è¯æªä¿å"
-#: transcode_video_dialog.cc:413
-msgid "Transcoding Failed."
-msgstr "转ç 失败ã"
+#: session_state.cc:856
+msgid "state could not be saved to %1"
+msgstr "ç¶ææ æ³ä¿åå° %1"
-#: transcode_video_dialog.cc:503
-msgid "Save Transcoded Video File"
-msgstr "ä¿å已转ç è§é¢æä»¶"
+#: session_state.cc:858 session_state.cc:871
+msgid "Could not remove temporary session file at path \"%1\" (%2)"
+msgstr "æ æ³ç§»é¤å¨è·¯å¾ \"%1\" (%2) ä¸ç临æ¶ä¼è¯æä»¶"
-#: video_server_dialog.cc:52
-msgid "Launch Video Server"
-msgstr "å¯å¨è§é¢æå¡å¨"
+#: session_state.cc:868
+msgid "could not rename temporary session file %1 to %2 (%3)"
+msgstr "æ æ³éå½åå¨è·¯å¾ \"%1\" (%2) ä¸ç临æ¶ä¼è¯æä»¶"
-#: video_server_dialog.cc:53
-msgid "Server Executable:"
-msgstr "æå¡å¨å¯æ§è¡ï¼"
+#: session_state.cc:942
+msgid "%1: session file \"%2\" doesn't exist!"
+msgstr "%1ï¼ä¼è¯æä»¶ \"%2\" ä¸åå¨ï¼"
-#: video_server_dialog.cc:55
-msgid "Server Docroot:"
-msgstr "æå¡å¨ææ¡£æ ¹ï¼"
+#: session_state.cc:954
+msgid "Could not understand session file %1"
+msgstr "æ æ³çè§£çä¼è¯æä»¶ %1"
-#: video_server_dialog.cc:61
-msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
-msgstr "ä¸åæ¾ç¤ºè¿ä¸ªå¯¹è¯æ¡ãï¼å¯å¨ ç¼è¾ -> é¦é项 ééç½®ï¼ã"
+#: session_state.cc:963
+msgid "Session file %1 is not a session"
+msgstr "ä¼è¯æä»¶ %1䏿¯ä¸ä¸ªä¼è¯"
-#: video_server_dialog.cc:97
-msgid ""
-"The external video server 'harvid' can not be found.\n"
-"The tool is included with the %1 releases from ardour.org, alternatively you can "
-"download it from http://x42.github.com/harvid/ or acquire it from your "
-"distribution.\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
-msgstr ""
-"æ¾ä¸å°å¤é¨è§é¢æå¡å¨ 'harvid' ã\n"
-"è¿å·¥å
·å
æ¬æ¥èª ardour.org ç %1ï¼å¦å¤æ¨å¯ä»¥ä» http://x42.github.com/harvid/ ä¸è½½"
-"å®ï¼æè
仿¨çåè¡çè·å¾å®ã\n"
-"\n"
-"请åé
http://manual.ardour.org/video-timeline/setup/"
+#: session_state.cc:1332
+msgid "programming error: Session: incorrect XML node sent to set_state()"
+msgstr "ç¨åºé误ï¼ä¼è¯ï¼ä¸æ£ç¡®ç XML èç¹åéå° set_state()"
-#: video_server_dialog.cc:129
-msgid "Listen Address:"
-msgstr "è¯å¬å°åï¼"
+#: session_state.cc:1410
+msgid "Session: XML state has no options section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æé项é¨å"
-#: video_server_dialog.cc:134
-msgid "Listen Port:"
-msgstr "è¯å¬ç«¯å£ï¼"
+#: session_state.cc:1415
+msgid "Session: XML state has no metadata section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æå
æ°æ®é¨å"
-#: video_server_dialog.cc:139
-msgid "Cache Size:"
-msgstr "ç¼å大å°ï¼"
+#: session_state.cc:1426
+msgid "Session: XML state has no sources section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡ææ¥æºé¨å"
-#: video_server_dialog.cc:145
-msgid ""
-"%1 relies on an external video server for the videotimeline.\n"
-"The server configured in Edit -> Preferences -> Video is not reachable.\n"
-"Do you want %1 to launch 'harvid' on this machine?"
-msgstr ""
-"%1 ä¾èµäºå¤é¨è§é¢æå¡å¨ä»¥è·åè§é¢æ¶é´çº¿ã\n"
-"è¿ä¸ªå·²é
ç½®å¨ ç¼è¾ -> é¦é项 -> è§é¢ çæå¡å¨æ æ³è®¿é®ã\n"
-"æ¨æ¯å¦è¦ %1 å¨è¿å°æºå¨ä¸å¯å¨ 'harvid' ï¼"
+#: session_state.cc:1433
+msgid "Session: XML state has no Tempo Map section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æè奿 å°é¨å"
-#: video_server_dialog.cc:189
-msgid "Set Video Server Executable"
-msgstr "设置è§é¢æå¡å¨å¯æ§è¡"
+#: session_state.cc:1440
+msgid "Session: XML state has no locations section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æä½ç½®é¨å"
-#: video_server_dialog.cc:209
-msgid "Server docroot"
-msgstr "æå¡å¨ææ¡£æ ¹"
+#: session_state.cc:1453
+msgid "Session: XML state has no Regions section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æåºåé¨å"
-#: utils_videotl.cc:60
-msgid "Destination is outside Video Server's docroot. "
-msgstr "ç®çå°æ¯è§é¢æå¡å¨çææ¡£æ ¹ä¹å¤ã"
+#: session_state.cc:1460
+msgid "Session: XML state has no playlists section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æææ¾å表é¨å"
-#: utils_videotl.cc:61
-msgid ""
-"The destination file path is outside of the Video Server's docroot. The file will "
-"not be readable by the Video Server. Do you still want to continue?"
-msgstr ""
-"ç®çå°æä»¶è·¯å¾æ¯å¤å¨è§é¢æå¡å¨ææ¡£æ ¹ä¹å¤ãè¿ä¸ªæä»¶å°æ æ³è¢«è§é¢æå¡å¨è¯»åãæ¨æ¯å¦è¦"
-"ç»§ç»ï¼"
+#: session_state.cc:1480
+msgid "Session: XML state has no bundles section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æå
裹é¨å"
+
+#: session_state.cc:1492
+msgid "Session: XML state has no diskstreams section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æç¡¬çæµé¨å"
-#: utils_videotl.cc:64
-msgid "Continue"
-msgstr "ç»§ç»"
+#: session_state.cc:1504
+msgid "Session: XML state has no routes section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æè·¯ç±é¨å"
-#: utils_videotl.cc:70
-msgid "Confirm Overwrite"
-msgstr "确认è¦ç"
+#: session_state.cc:1520
+msgid "Session: XML state has no route groups section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æè·¯ç±ç¾¤ç»é¨å"
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists. Do you want to overwrite it?"
-msgstr "å·²æç¸ååç§°çæä»¶åå¨ãæ¨æ¯å¦è¦éåè¦çå®ï¼"
+#: session_state.cc:1529
+msgid "Session: XML state has no edit groups section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æç¼è¾ç¾¤ç»é¨å"
-#: utils_videotl.cc:81 utils_videotl.cc:97
-msgid "Cannot create video folder \"%1\" (%2)"
-msgstr "æ æ³å建è§é¢æä»¶å¤¹ \"%1\" (%2)"
+#: session_state.cc:1536
+msgid "Session: XML state has no mix groups section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡ææ··é³ç¾¤ç»é¨å"
-#: export_video_dialog.cc:71
-msgid "Export Video File "
-msgstr "导åºè§é¢æä»¶"
+#: session_state.cc:1544
+msgid "Session: XML state has no click section"
+msgstr "ä¼è¯ï¼XML ç¶ææ²¡æé³é¢è¯å«å£°ï¼èæå¨ï¼é¨å"
-#: export_video_dialog.cc:82
-msgid "Video:"
-msgstr "è§é¢ï¼"
+#: session_state.cc:1606
+msgid "Session: cannot create Route from XML description."
+msgstr "ä¼è¯ï¼æ æ³ä» XML æè¿°å建路ç±ã"
-#: export_video_dialog.cc:87
-msgid "Scale Video (W x H):"
-msgstr "缩æ¾è§é¢ï¼å®½ x é«ï¼ï¼"
+#: session_state.cc:1610
+msgid "Loaded track/bus %1"
+msgstr "已载å
¥é³è½¨/æ»çº¿ %1"
-#: export_video_dialog.cc:88
-msgid "Retain Aspect"
-msgstr "ä¿æé¿å®½æ¯"
+#: session_state.cc:1615
+msgid "Tracks/busses loaded; Adding to Session"
+msgstr "é³è½¨/æ»çº¿å·²è½½å
¥ï¼æ£å¨æ·»å å°ä¼è¯"
-#: export_video_dialog.cc:93
-msgid "Set Aspect Ratio:"
-msgstr "设置é¿å®½æ¯ï¼"
+#: session_state.cc:1619
+msgid "Finished adding tracks/busses"
+msgstr "æ·»å é³è½¨/æ»çº¿å·²ç»æ"
-#: export_video_dialog.cc:94
-msgid "Normalize Audio"
-msgstr "è§èåé³é¢"
+#: session_state.cc:1709
+msgid "Could not find diskstream for route"
+msgstr "æ æ³æ¾å°ç¨äºè·¯ç±çç¡¬çæµ"
-#: export_video_dialog.cc:95
-msgid "2 Pass Encoding"
-msgstr "äºæ¬¡ç¼ç "
+#: session_state.cc:1760
+msgid "Session: cannot create Region from XML description."
+msgstr "ä¼è¯ï¼æ æ³ä» XML æè¿°å建åºåã"
-#: export_video_dialog.cc:96
-msgid "Codec Optimizations:"
-msgstr "è§£ç å¨ä¼åï¼"
+#: session_state.cc:1764
+msgid "Can not load state for region '%1'"
+msgstr "æ æ³ä¸ºåºå '%1' è½½å
¥ç¶æ"
-#: export_video_dialog.cc:98
-msgid "Deinterlace"
-msgstr "å交é"
+#: session_state.cc:1800
+msgid "Regions in compound description not found (ID's %1 and %2): ignored"
+msgstr "å¨åææè¿°ä¸æ¾ä¸å°åºåï¼IDç %1 å %2ï¼ï¼å·²å¿½ç¥"
-#: export_video_dialog.cc:99
-msgid "Use [2] B-frames (MPEG 2 or 4 only)"
-msgstr "ä½¿ç¨ [2] B-帧ï¼ä»
MPEG 2 æ 4ï¼"
+#: session_state.cc:1828
+msgid "Nested source has no ID info in session file! (ignored)"
+msgstr "å¨ä¼è¯æä»¶éåµå
¥çæ¥æºæ²¡æ ID ä¿¡æ¯ï¼ï¼å·²å¿½ç¥ï¼"
-#: export_video_dialog.cc:100
-msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr "è¦ç FPSï¼é»è®¤æ¯è¦çå°ä»è¾å
¥è§é¢æä»¶ä¿çç FPSï¼ï¼"
+#: session_state.cc:1840
+msgid "Cannot reconstruct nested source for region %1"
+msgstr "æ æ³ä¸ºåºå %1 é建åµå
¥çæ¥æº"
-#: export_video_dialog.cc:101
-msgid "Include Session Metadata"
-msgstr "å
æ¬ä¼è¯å
æ°æ®"
+#: session_state.cc:1902
+msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
+msgstr "ä¼è¯ï¼XML èç¹æè¿°çä¸ä¸ªé³é¢åºåæ¯ä¸å®æ´çï¼æ æ¥æºï¼"
-#: export_video_dialog.cc:119
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export is "
-"not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"å¨è¿ä¸ªç³»ç»ä¸æ²¡æ¾å° ffprobe æè
ffmpeg 坿§è¡æä»¶ãè§é¢å¯¼åºæ æ³è¿è¡ï¼é¤éæ¨å®è£
è¿äº"
-"å·¥å
·ãæ´å¤çä¿¡æ¯è¯·åé
æ¥å¿çªå£ã"
+"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
+msgstr "ä¼è¯ï¼XML èç¹æè¿°çä¸ä¸ªé³é¢åºåå¼ç¨ä¸ä¸ªæªç¥æ¥æº id =%1"
+
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
+msgid ""
+"Session: XMLNode describing a AudioRegion references a non-audio source id ="
+"%1"
+msgstr "ä¼è¯ï¼XML èç¹æè¿°çä¸ä¸ªé³é¢åºåå¼ç¨ä¸ä¸ªéé³é¢æ¥æº id =%1"
-#: export_video_dialog.cc:130
-msgid "<b>Output:</b> (file extension defines format)"
-msgstr "<b>导åºï¼</b>ï¼ä»¥æä»¶æ©å±åå³å®æ ¼å¼ï¼"
+#: session_state.cc:1980
+msgid ""
+"Session: XMLNode describing an AudioRegion is missing some master sources; "
+"ignored"
+msgstr "ä¼è¯ï¼XML èç¹æè¿°çä¸ä¸ªé³é¢åºå缺失ä¸äºä¸»æ§æ¥æºï¼å·²å¿½ç¥"
+
+#: session_state.cc:2014
+msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
+msgstr "ä¼è¯ï¼XML èç¹æè¿°çä¸ä¸ª MIDI åºåæ¯ä¸å®æ´çï¼æ æ¥æºï¼"
-#: export_video_dialog.cc:140
-msgid "<b>Input Video:</b>"
-msgstr "<b>导å
¥è§é¢</b>"
+#: session_state.cc:2022
+msgid ""
+"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
+msgstr "ä¼è¯ï¼XML èç¹æè¿°çä¸ä¸ª MIDI åºåå¼ç¨ä¸ä¸ªæªç¥æ¥æº id =%1"
-#: export_video_dialog.cc:151
-msgid "Audio:"
-msgstr "é³é¢ï¼"
+#: session_state.cc:2028
+msgid ""
+"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
+msgstr "ä¼è¯ï¼XML èç¹æè¿°çä¸ä¸ªé³é¢åºåå¼ç¨ä¸ä¸ªé MIDI æ¥æº id =%1"
-#: export_video_dialog.cc:153
-msgid "Master Bus"
-msgstr "ä¸»æ§æ»çº¿"
+#: session_state.cc:2101
+msgid "Session: cannot create Source from XML description."
+msgstr "ä¼è¯ï¼æ æ³ä» XML æè¿°åå»ºæ¥æºã"
-#: export_video_dialog.cc:158
-msgid "from the %1 session's start to the session's end"
-msgstr "ä» %1 ä¼è¯çèµ·ç¹å°ä¼è¯çç»ç¹"
+#: session_state.cc:2109
+msgid ""
+"A external MIDI file is missing. %1 cannot currently recover from missing "
+"external MIDI files"
+msgstr "缺失ä¸ä¸ªå¤é¨ MIDI æä»¶ã%1 ç®åæ æ³ä»ç¼ºå¤±å¤é¨ MIDI æä»¶ä¸æ¢å¤"
-#: export_video_dialog.cc:161
-msgid "<b>Settings:</b>"
-msgstr "<b>设置</b>"
+#: session_state.cc:2191
+msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
+msgstr "åç°ä¸ä¸ªæ æ³è¢« %1 使ç¨ç声鳿件ã请转åç¨åºåã"
-#: export_video_dialog.cc:169
-msgid "Range:"
-msgstr "èå´ï¼"
+#: session_state.cc:2212
+msgid "Could not create templates directory \"%1\" (%2)"
+msgstr "æ æ³å建模æ¿ç®å½ \"%1\" (%2)"
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "é¢è®¾ï¼"
+#: session_state.cc:2224
+msgid "Template \"%1\" already exists - new version not created"
+msgstr "æ¨¡æ¿ \"%1\" å·²åå¨ââæ°çæ¬æªå建"
-#: export_video_dialog.cc:175
-msgid "Video Codec:"
-msgstr "è§é¢ç¼ç ï¼"
+#: session_state.cc:2230
+msgid "Could not create directory for Session template\"%1\" (%2)"
+msgstr "æ æ³ä¸ºä¼è¯æ¨¡æ¿ \"%1\" (%2) å建ç®å½"
-#: export_video_dialog.cc:178
-msgid "Video KBit/s:"
-msgstr "è§é¢ KBit/sï¼"
+#: session_state.cc:2259
+msgid "template not saved"
+msgstr "æ¨¡æ¿æªä¿å"
-#: export_video_dialog.cc:181
-msgid "Audio Codec:"
-msgstr "é³é¢ç¼ç ï¼"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
+msgstr "ä»ä¼è¯æä»¶çå
裹å表éåç°æªç¥çèç¹ \"%1\""
-#: export_video_dialog.cc:184
-msgid "Audio KBit/s:"
-msgstr "é³é¢ KBit/sï¼"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr "æ æ³ä¸ºåªè¯»ä¼è¯æ¸
é¤å³°å¼æä»¶ã"
-#: export_video_dialog.cc:187
-msgid "Audio Samplerate:"
-msgstr "é³é¢éæ ·çï¼"
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr "å½å¶æ¶æ æ³æ¸
é¤å³°å¼æä»¶ã"
-#: export_video_dialog.cc:222 export_video_dialog.cc:231 export_video_dialog.cc:830
-#: export_video_dialog.cc:833
-msgid "(default for format)"
-msgstr "ï¼é»è®¤æ ¼å¼ï¼"
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr "ä¸ºå³°å¼æä»¶çå建èè¶
æ¶ççå¾
卿¸
çåç»æ¢ï¼è¯·ç¨å忬¡å°è¯ã"
-#: export_video_dialog.cc:242 export_video_dialog.cc:255 export_video_dialog.cc:837
-#: export_video_dialog.cc:846
-msgid "(default)"
-msgstr "ï¼é»è®¤ï¼"
+#: session_state.cc:3261
+msgid "Session: cannot create dead file folder \"%1\" (%2)"
+msgstr "ä¼è¯ï¼æ æ³å建æ²å¯æä»¶çæä»¶å¤¹ \"%1\" (%2)"
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
-msgid "(retain)"
-msgstr "ï¼ä¿çï¼"
+#: session_state.cc:3296
+msgid "cannot rename unused file source from %1 to %2 (%3)"
+msgstr "æ æ³éå½åæªä½¿ç¨çæä»¶æ¥æºä» %1 å° %2 (%3)"
-#: export_video_dialog.cc:348
-msgid "from 00:00:00:00 to the video's end"
-msgstr "ä» 00:00:00:00 å°è§é¢ç»ç¹"
+#: session_state.cc:3312
+msgid "cannot remove peakfile %1 for %2 (%3)"
+msgstr "æ æ³ç§»é¤å³°å¼æä»¶ %1 为 %2 (%3)"
-#: export_video_dialog.cc:350
-msgid "from the video's start to the video's end"
-msgstr "ä»è§é¢èµ·ç¹å°è§é¢ç»ç¹"
+#: session_state.cc:3633
+msgid "could not backup old history file, current history not saved"
+msgstr "æ æ³å¤ä»½æ§çå岿件ï¼ç®åå岿ªä¿å"
-#: export_video_dialog.cc:353
-msgid "Selected range"
-msgstr "已鿩çèå´"
+#: session_state.cc:3642
+msgid "history could not be saved to %1"
+msgstr "å岿 æ³ä¿å为 %1"
-#: export_video_dialog.cc:589
-msgid "Normalizing audio"
-msgstr "è§èåé³é¢"
+#: session_state.cc:3645
+msgid "Could not remove history file at path \"%1\" (%2)"
+msgstr "å¨è·¯å¾ \"%1\" (%2) 䏿 æ³ç§»é¤å岿件"
-#: export_video_dialog.cc:593
-msgid "Exporting audio"
-msgstr "é³é¢å¯¼åºä¸"
+#: session_state.cc:3649
+msgid "could not restore history file from backup %1 (%2)"
+msgstr "æ æ³ä»å¤ä»½ %1 (%2) æ¢å¤å岿件"
-#: export_video_dialog.cc:648
-msgid "Exporting Audio..."
-msgstr "é³é¢å¯¼åºä¸â¦"
+#: session_state.cc:3674
+msgid "%1: no history file \"%2\" for this session."
+msgstr "%1ï¼æ å岿件 \"%2\" ç¨äºæ¬ä¼è¯ã"
-#: export_video_dialog.cc:705
-msgid ""
-"Export Video: Cannot query duration of video-file, using duration from timeline "
-"instead."
-msgstr "导åºè§é¢ï¼æ æ³æ¥è¯¢è§é¢æä»¶é¿åº¦ï¼è§é¢æ¶é´çº¿é¿åº¦ä»£æ¿ã"
+#: session_state.cc:3680
+msgid "Could not understand session history file \"%1\""
+msgstr "æ æ³çè§£ä¼è¯å岿件 \"%1\""
-#: export_video_dialog.cc:735
-msgid "Export Video: export-range does not include video."
-msgstr "导åºè§é¢ï¼å¯¼åºèå´æ æ³å
æ¬è§é¢ã"
+#: session_state.cc:3722
+msgid "Failed to downcast MidiSource for NoteDiffCommand"
+msgstr "åä¸è½¬æ¢ MidiSource 为 NoteDiffCommand 失败"
-#: export_video_dialog.cc:748
-msgid "Export Video: No Master Out Ports to Connect for Audio Export"
-msgstr "导åºè§é¢ï¼æ²¡æä¸»æ§è¾åºç«¯å£å¯è¿æ¥ç»é³é¢å¯¼åº"
+#: session_state.cc:3733
+msgid "Failed to downcast MidiSource for SysExDiffCommand"
+msgstr "åä¸è½¬æ¢ MidiSource 为 SysExDiffCommand 失败"
-#: export_video_dialog.cc:790
-msgid "Encoding Video..."
-msgstr "è§é¢ç¼ç ä¸â¦"
+#: session_state.cc:3744
+msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
+msgstr "åä¸è½¬æ¢ MidiSource 为 PatchChangeDiffCommand 失败"
-#: export_video_dialog.cc:810
-msgid "Export Video: Video input file cannot be read."
-msgstr "导åºè§é¢ï¼æ æ³è¯»åè§é¢å¯¼å
¥æä»¶ã"
+#: session_state.cc:3752
+msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
+msgstr "æ æ³æ¨ç®åºå¦ä½ç¨ä¸ä¸ª %1 XML èç¹æ¥å®ç°ä¸ä¸ªå½ä»¤"
-#: export_video_dialog.cc:916
-msgid "Encoding Video.. Pass 1/2"
-msgstr "è§é¢ç¼ç ä¸â¦éè¿ 1/2"
+#: session_state.cc:3990
+msgid "Session: unknown diskstream type in XML"
+msgstr "ä¼è¯ï¼å¨ XML éæªç¥çç¡¬çæµç±»å"
-#: export_video_dialog.cc:928
-msgid "Encoding Video.. Pass 2/2"
-msgstr "è§é¢ç¼ç ä¸â¦éè¿ 2/2"
+#: session_state.cc:3995
+msgid "Session: could not load diskstream via XML state"
+msgstr "ä¼è¯ï¼æ æ³éè¿ XML ç¶æè½½å
¥ç¡¬çæµ"
-#: export_video_dialog.cc:1031
-msgid "Transcoding failed."
-msgstr "转ç 失败ã"
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr "æ æ³éå½ååªè¯»ä¼è¯ã"
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
-msgid "Save Exported Video File"
-msgstr "ä¿å已导åºçè§é¢æä»¶"
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr "å½å¶æ¶æ æ³éå½åä¼è¯"
-#: export_video_infobox.cc:33
-msgid "Video Export Info"
-msgstr "è§é¢å¯¼åºä¿¡æ¯"
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
+msgid "renaming %s as %2 failed (%3)"
+msgstr "éå½å %s 为 %2 失败ï¼%3ï¼"
-#: export_video_infobox.cc:34
-msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
-msgstr "ä¸åæ¾ç¤ºè¿ä¸ªå¯¹è¯æ¡ãï¼å¯å¨ ç¼è¾ > é¦é项 > è§é¢ ééç½®ï¼ã"
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr "éå½å %1 为 %2 失败ï¼%3ï¼"
-#: export_video_infobox.cc:46
-msgid "<b>Video Export Info</b>"
-msgstr "<b>è§é¢å¯¼åºä¿¡æ¯</b>"
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr "æ æ³å建æ°çä¼è¯æä»¶å¤¹ %1"
-#: export_video_infobox.cc:51
+#: session_state.cc:4633 session_state.cc:4708
msgid ""
-"Video encoding is a non-trivial task with many details.\n"
-"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
"\n"
-"Open Manual in Browser? "
+"copying \"%1\" failed !"
msgstr ""
-"è§é¢ç¼ç æ¯ä¸é¡¹å¸¦æè®¸å¤ç»èçä¸ç®åçä»»å¡ã\n"
"\n"
-"请åé
æåï¼ä½äº %1/video-timeline/operations/#export ã\n"
-"\n"
-"卿µè§å¨éæå¼æåï¼"
+"å¤å¶ \"%1\" 失败ï¼"
-#~ msgid "Track mode:"
-#~ msgstr "é³è½¨æ¨¡å¼:"
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr "䏿åå "
-#~ msgid "Theme Manager"
-#~ msgstr "主é¢ç®¡ç"
+#: session_time.cc:214
+msgid "Unknown transport state %1 in sync callback"
+msgstr "å¨åæ¥åè°ä¸æªç¥çæéç¶æ %1"
-#~ msgid "Errors"
-#~ msgstr "é误"
+#: session_transport.cc:177
+msgid "Cannot loop - no loop range defined"
+msgstr "æ æ³å¾ªç¯ââæªå®ä¹å¾ªç¯èå´"
-#~ msgid "Play Selected Range"
-#~ msgstr "ææ¾å·²éæ©çèå´"
+#: session_transport.cc:968
+msgid ""
+"Seamless looping cannot be supported while %1 is using JACK transport.\n"
+"Recommend changing the configured options"
+msgstr ""
+"å½ %1 æ£å¨ä½¿ç¨ JACK æéæ¶ä¸æ¯ææ ç¼å¾ªç¯ã\n"
+"建议修æ¹å·²é
ç½®çé项"
-#~ msgid "Convert to Region In-Place"
-#~ msgstr "卿¤è½¬æ¢è³åºå"
+#: session_transport.cc:1050
+msgid "Locate called for negative sample position - ignored"
+msgstr "å®ä½è°ç¨è´å¼æ ·æ¬ä½ç½®ââ已忽ç¥"
-#~ msgid "Set Loop from Range"
-#~ msgstr "ä»èå´è®¾ç½®å¾ªç¯"
+#: session_transport.cc:1401
+msgid ""
+"Global varispeed cannot be supported while %1 is connected to JACK transport "
+"control"
+msgstr "å½ %1 å·²è¿æ¥å° JACK æéæ§å¶æ¶ä¸æ¯æå
¨å±åé"
-#~ msgid "Set Punch from Range"
-#~ msgstr "ä»èå´è®¾ç½®Punch"
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
-#~ msgid "Draw/Edit MIDI Notes"
-#~ msgstr "ç»ç»/ç¼è¾MIDIé³ç¬¦"
+#: smf_source.cc:350
+msgid "Unable to read event prefix, corrupt MIDI ring"
+msgstr "æ æ³è¯»åäºä»¶åç¼ï¼æ±¡æç MIDI åç¯"
-#~ msgid "Draw Region Gain"
-#~ msgstr "ç»å¶åºåå¢ç"
+#: smf_source.cc:363
+msgid "Event has time and size but no body, corrupt MIDI ring"
+msgstr "äºä»¶æ¥ææ¶é´å大å°ä½æ²¡ææ¬ä½ï¼æ±¡æç MIDI åç¯"
-#~ msgid "Select Zoom Range"
-#~ msgstr "éæ©åç¦èå´"
+#: smf_source.cc:369
+msgid "Event time is before MIDI source position"
+msgstr "äºä»¶æ¶é´ä½äº MIDI æ¥æºä½ç½®ä¹å"
-#~ msgid "Stretch/Shrink Regions and MIDI Notes"
-#~ msgstr "伸/缩åºååMIDIé³ç¬¦"
+#: smf_source.cc:417
+msgid ""
+"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
+msgstr "è·³è¿å¸¦ææ åºæåæ¶é´çäºä»¶ %1 < %2 ï¼è±ç¦»äº %3 æåï¼ %4 è¯å«å£°ï¼"
-#~ msgid "Listen to Specific Regions"
-#~ msgstr "å¬ç¹å®åºå"
+#: smf_source.cc:461
+msgid "Skipping event with unordered frame time %1 < %2"
+msgstr "è·³è¿å¸¦ææ åºå¸§æ¶é´çäºä»¶ %1 < %2"
-#~ msgid "Set Punch from Edit Range"
-#~ msgstr "å¨ç¼è¾èå´è®¾ç½®Punch"
+#: smf_source.cc:526
+msgid "cannot open MIDI file %1 for write"
+msgstr "æ æ³æå¼ MIDI æä»¶ %1 ç¨äºåå
¥"
-#~ msgid "Edit MIDI"
-#~ msgstr "ç¼è¾MIDI"
+#: sndfile_helpers.cc:34
+msgid "WAV"
+msgstr ""
-#~ msgid "Show Measures"
-#~ msgstr "æ¾ç¤ºæµé"
+#: sndfile_helpers.cc:35
+msgid "AIFF"
+msgstr ""
-#~ msgid " range"
-#~ msgstr "èå´"
+#: sndfile_helpers.cc:36
+msgid "CAF"
+msgstr ""
-#~ msgid "set loop range from edit range"
-#~ msgstr "ä»ç¼è¾èå´è®¾ç½®å¾ªç¯èå´"
+#: sndfile_helpers.cc:37
+msgid "W64 (64-bit WAV)"
+msgstr "W64ï¼64ä½ WAVï¼"
-#~ msgid "set punch range from edit range"
-#~ msgstr "ä»ç¼è¾èå´è®¾ç½®punchåºé´"
+#: sndfile_helpers.cc:38
+msgid "FLAC"
+msgstr ""
-#~ msgid ""
-#~ "Do you really want to remove %1 %2?\n"
-#~ "\n"
-#~ "This action cannot be undon, and the session file will be overwritten"
-#~ msgstr ""
-#~ "ä½ ç¡®å®ç§»é¤ %1 %2?\n"
-#~ "\n"
-#~ "æ¤å¨ä½ä¸å¯æ¤é, è䏿¤ä¼è¯æä»¶å°ä¼è¢«éæ°åå
¥!"
+#: sndfile_helpers.cc:39
+msgid "Ogg/Vorbis"
+msgstr ""
-#~ msgid "set selected regions"
-#~ msgstr "设置æéåºå"
+#: sndfile_helpers.cc:40
+msgid "raw (no header)"
+msgstr "rawï¼æ æä»¶å¤´ï¼"
-#~ msgid "select all"
-#~ msgstr "éæ©ææ"
+#: sndfile_helpers.cc:45
+msgid ".wav"
+msgstr ""
-#~ msgid "select all within"
-#~ msgstr "å¨å
éæ©ææ"
+#: sndfile_helpers.cc:46
+msgid ".aiff"
+msgstr ""
-#~ msgid "set selection from range"
-#~ msgstr "ä»èå´è®¾ç½®éåº"
+#: sndfile_helpers.cc:47
+msgid ".caf"
+msgstr ""
-#~ msgid "select all from range"
-#~ msgstr "ä»èå´éæ©ææ"
+#: sndfile_helpers.cc:48
+msgid ".w64"
+msgstr ""
-#~ msgid "select all from punch"
-#~ msgstr "ä»punchéæ©ææ"
+#: sndfile_helpers.cc:49
+msgid ".flac"
+msgstr ""
-#~ msgid "select all from loop"
-#~ msgstr "ä»å¾ªç¯éæ©ææ"
+#: sndfile_helpers.cc:50
+msgid ".ogg"
+msgstr ""
-#~ msgid "select all after cursor"
-#~ msgstr "å¨å
æ åéæ©ææ"
+#: sndfile_helpers.cc:51
+msgid ".raw"
+msgstr ""
-#~ msgid "select all before cursor"
-#~ msgstr "å¨å
æ åéæ©ææ"
+#: sndfile_helpers.cc:66
+msgid "Signed 16-bit PCM"
+msgstr "å¸¦ç¬¦å· 16 ä½ PCMï¼èå²ç¼ç è°å¶ï¼"
-#~ msgid "select all after edit"
-#~ msgstr "ç¼è¾åéæ©ææ"
+#: sndfile_helpers.cc:67
+msgid "Signed 24-bit PCM"
+msgstr "å¸¦ç¬¦å· 24 ä½ PCMï¼èå²ç¼ç è°å¶ï¼"
-#~ msgid "select all before edit"
-#~ msgstr "ç¼è¾åéæ©ææ"
+#: sndfile_helpers.cc:68
+msgid "Signed 32-bit PCM"
+msgstr "å¸¦ç¬¦å· 32 ä½ PCMï¼èå²ç¼ç è°å¶ï¼"
-#~ msgid "Plugin preset %1 not found"
-#~ msgstr "æªæ¾å°æä»¶é¢è®¾%1"
+#: sndfile_helpers.cc:69
+msgid "Signed 8-bit PCM"
+msgstr "å¸¦ç¬¦å· 8 ä½ PCMï¼èå²ç¼ç è°å¶ï¼"
-#~ msgid "Set volume (velocity) to forteissimo"
-#~ msgstr "设置é³é(å度)为æå¼ºé³"
+#: sndfile_helpers.cc:70
+msgid "32-bit float"
+msgstr "32 使µ®ç¹"
-#~ msgid "Set volume (velocity) to forteississimo"
-#~ msgstr "设置é³é(å度)为æå¼ºé³"
+#: sndfile_helpers.cc:83
+msgid "Little-endian (Intel)"
+msgstr "ä½ä½ä¼å
ï¼Intel è±ç¹å°ï¼"
-#~ msgid "badly formatted UI definition file: %1"
-#~ msgstr "é误çç¨æ·ç颿 ¼å¼æä»¶ %1"
+#: sndfile_helpers.cc:84
+msgid "Big-endian (PowerPC)"
+msgstr "大端åå¨ï¼PowerPC 强åçµèï¼"
-#~ msgid ""
-#~ "There are insufficient JACK ports available\n"
-#~ "to create a new track or bus.\n"
-#~ "You should save %1, exit and\n"
-#~ "restart JACK with more ports."
-#~ msgstr ""
-#~ "JACK端å£(port)ä¸è¶³\n"
-#~ "æ æ³ç»§ç»æ°å»ºé³è½¨ææ»çº¿\n"
-#~ "请ä¿å %1ï¼éæ°å¯å¨JACKå¸¦æ¥æ´å¤ç端å£.\n"
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr "åé端æä»¶æ¥æºï¼æ æ³ä¸º %2 æå¼æä»¶ \"%1\""
-#~ msgid "Timecode Frames"
-#~ msgstr "æ¶é´ç æ¡æ¶"
+#: sndfilesource.cc:300
+msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
+msgstr "åé端æä»¶æ¥æºï¼æ æ³ä¸º %2 (%3) æå¼æä»¶ \"%1\""
-#~ msgid "Timecode Seconds"
-#~ msgstr "æ¶é´ç ç§"
+#: sndfilesource.cc:308
+msgid ""
+"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
+"number"
+msgstr "åé端æä»¶æ¥æºï¼æä»¶ä»
å
å« %1 声éï¼%2 æ¯æ æç声鿰é"
-#~ msgid "Timecode Minutes"
-#~ msgstr "æ¶é´ç å"
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr "æ æ³ä¸ºèªå¨åéçº§å° WAV æ è®° RF64 é³é¢æä»¶ï¼%1"
-#~ msgid "Slowest"
-#~ msgstr "ææ
¢"
+#: sndfilesource.cc:375 sndfilesource.cc:705
+msgid ""
+"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
+"for this file"
+msgstr "æ æ³ä¸ºé³é¢æä»¶ %1 (%2) 设置广æä¿¡æ¯ï¼æ£å¨ä¸ºè¯¥æä»¶ä¸¢å¼å¹¿æä¿¡æ¯"
-#~ msgid "insert dragged region"
-#~ msgstr "æå
¥ææ½åºå"
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
+msgstr "æ æ³æå¼ %1 æä»¶ç¨äºè¯»åã"
-#~ msgid " objects"
-#~ msgstr "对象"
+#: sndfilesource.cc:453
+msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
+msgstr "åé端æä»¶æ¥æºï¼æ æ³å¨ %2 (%3) å
æå¯»å°å¸§ %1"
-#~ msgid "No edit range defined"
-#~ msgstr "没æå®ä¹çç¼è¾èå´"
+#: sndfilesource.cc:462
+msgid ""
+"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
+msgstr ""
+"åé端æä»¶æ¥æºï¼@ %1 æ æ³å¨ %3 (%4) å
读å %2ï¼é¿åº¦ = %5ï¼å©ä½çæ¯ %6ï¼"
-#~ msgid ""
-#~ "the edit point is Selected Marker\n"
-#~ "but there is no selected marker."
-#~ msgstr ""
-#~ "è¿ä¸ªç¼è¾ç¹æ¯å·²éæ©çæ è®°,\n"
-#~ "使¯æ²¡æå·²éæ©çæ è®°."
+#: sndfilesource.cc:504 sndfilesource.cc:533
+msgid "attempt to write a non-writable audio file source (%1)"
+msgstr "å°è¯åå
¥ä¸ä¸ªéå¯åé³é¢æä»¶æ¥æºï¼%1ï¼"
-#~ msgid "Position of mark on the ruler"
-#~ msgstr "æ å°ºçæ è®°ä½ç½®"
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
+msgid "programming error: %1 %2"
+msgstr "ç¨åºé误ï¼%1 %2"
-#~ msgid "Max Size"
-#~ msgstr "æå¤§å尺寸"
+#: sndfilesource.cc:636 sndfilesource.cc:654
+msgid "attempt to flush a non-writable audio file source (%1)"
+msgstr "å°è¯æ³¨å
¥ä¸ä¸ªéå¯åé³é¢æä»¶æ¥æºï¼%1ï¼"
-#~ msgid "Maximum size of the ruler"
-#~ msgstr "æ å°ºçæå¤§å尺寸"
+#: sndfilesource.cc:641
+msgid "could not allocate file %1 to write header"
+msgstr "æ æ³åé
æä»¶ %1 å°åå
¥æä»¶å¤´"
-#~ msgid "Show Position"
-#~ msgstr "æ¾ç¤ºä½ç½®"
+#: sndfilesource.cc:659
+msgid "could not allocate file %1 to flush contents"
+msgstr "æ æ³åé
æä»¶ %1 å°æ³¨å
¥å
容"
-#~ msgid "Draw current ruler position"
-#~ msgstr "ç»å¶å½åæ å°ºä½ç½®"
+#: sndfilesource.cc:671
+msgid ""
+"attempt to store broadcast info in a non-writable audio file source (%1)"
+msgstr "å°è¯å¨ä¸ä¸ªéå¯åé³é¢æä»¶æ¥æºå
å¨å广æä¿¡æ¯ï¼%1ï¼"
-#~ msgid "cannot open pango.rc file %1"
-#~ msgstr "æ æ³æå¼pango.rc æä»¶ %1"
+#: sndfilesource.cc:676
+msgid "attempt to set BWF info for an un-opened audio file source (%1)"
+msgstr "å°è¯ä¸ºä¸ä¸ªéå¯åé³é¢æä»¶æ¥æºè®¾ç½® BWF ä¿¡æ¯ï¼%1ï¼"
-#~ msgid "Missing File!"
-#~ msgstr "æ¾ä¸å°æä»¶!"
+#: sndfilesource.cc:720
+msgid "%1: cannot seek to %2 (libsndfile error: %3)"
+msgstr "%1ï¼æ æ³æå¯» %2ï¼libsndfile é误ï¼%3ï¼"
-#~ msgid "auditioning"
-#~ msgstr "çå¬ä¸"
+#: sndfilesource.cc:830
+msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
+msgstr "åé端æä»¶æ¥æºï¼\"%1\" é误读åè¿åå¼ï¼%5 ç %2ï¼%3: %4ï¼"
-#~ msgid "mono"
-#~ msgstr "å声é"
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
+msgid "SndFileSource: \"%1\" bad write (%2)"
+msgstr "åé端æä»¶æ¥æºï¼\"%1\" é误åå
¥ï¼%2ï¼"
-#~ msgid "Link selection of regions and tracks"
-#~ msgstr "龿¥æéçåºååé³è½¨"
+#: sndfilesource.cc:923
+msgid ""
+"Filesource: start time is already set for existing file (%1): Cannot change "
+"start time."
+msgstr "æä»¶æ¥æºï¼èµ·ç¹æ¶é´å·²ç»è®¾ç½®äºå·²åå¨çæä»¶ï¼%1ï¼ï¼æ æ³ä¿®æ¹èµ·ç¹æ¶é´ã"
-#~ msgid "ardour"
-#~ msgstr "ardour"
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr "åé端æä»¶æ¥æºï¼æ æ³æå¼æä»¶ \"%1\" ç¨äºè¯»å"
-#~ msgid "x1"
-#~ msgstr "x1"
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr "å·²æ¸
é¤æç¡®çå声éï¼%1\n"
-#~ msgid "x coordinate of upper left corner of rect"
-#~ msgstr "xä¸ç©å½¢çå·¦ä¸è§ç¸å
³"
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr "å·²æ¸
é¤éæ¦çå声éï¼%1 ä¸ï¼%2 ä¸ï¼%3\n"
-#~ msgid "y1"
-#~ msgstr "y1"
+#: soundcloud_upload.cc:129
+msgid ""
+"Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
+msgstr "ä¸ä¼ Soundcloud 失败ãå¯è½æ¨ççµåé®ä»¶æè
å¯ç 䏿£ç¡®ï¼\n"
-#~ msgid "y coordinate of upper left corner of rect "
-#~ msgstr "yä¸ç©å½¢çå³ä¸è§ç¸å
³"
+#: source_factory.cc:390
+msgid "Recovery attempted on a MIDI file - not implemented"
+msgstr "å¨ä¸ä¸ª MIDI æä»¶ä¸æ¢å¤æªéââæªå®æ½"
-#~ msgid "x2"
-#~ msgstr "x1"
+#: speakers.cc:280
+msgid "Speaker information is missing azimuth - speaker ignored"
+msgstr "æ¬å£°å¨ä¿¡æ¯ç¼ºå¤±æ¹ä½è§ââæ¬å£°å¨å·²å¿½ç¥"
-#~ msgid "x coordinate of lower right corner of rect"
-#~ msgstr "xä¸ç©å½¢çå³ä¸è§ç¸å
³"
+#: speakers.cc:286
+msgid "Speaker information is missing elevation - speaker ignored"
+msgstr "æ¬å£°å¨ä¿¡æ¯ç¼ºå¤±ä»°è§ââæ¬å£°å¨å·²å¿½ç¥"
-#~ msgid "y coordinate of lower right corner of rect "
-#~ msgstr "yä¸ç©å½¢çå³ä¸è§ç¸å
³"
+#: speakers.cc:292
+msgid "Speaker information is missing distance - speaker ignored"
+msgstr "æ¬å£°å¨ä¿¡æ¯ç¼ºå¤±è·ç¦»ââæ¬å£°å¨å·²å¿½ç¥"
-#~ msgid "color rgba"
-#~ msgstr "RGBAé¢è²"
+#: srcfilesource.cc:142
+msgid "SrcFileSource: %1"
+msgstr "忥饿§æä»¶æ¥æºï¼%1"
-#~ msgid "color of line"
-#~ msgstr "线æ¡é¢è²"
+#: tape_file_matcher.cc:46
+msgid "Cannot compile tape track regexp for use (%1)"
+msgstr "æ æ³ç¼è¯ç£å¸¦é³è½¨ regexp æ¥ä½¿ç¨ï¼%1ï¼"
-#~ msgid "outline pixels"
-#~ msgstr "è½®å»åç´ "
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
-#~ msgid "width in pixels of outline"
-#~ msgstr "è½®å»çåç´ å®½åº¦"
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
-#~ msgid "fill"
-#~ msgstr "å¡«å
"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
-#~ msgid "fill rectangle"
-#~ msgstr "å¡«å
ç©å½¢"
+#: tempo.cc:119
+msgid "TempoSection XML node has no \"beats-per-minute\" property"
+msgstr "èå¥é¨å XML èç¹æ²¡æâæ¯åéæåæ°â屿§"
-#~ msgid "draw"
-#~ msgstr "ç»å¶"
+#: tempo.cc:124
+msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
+msgstr "èå¥é¨å XML èç¹æä¸ä¸ªéæ³çâæ¯åéæåæ°âæ°å¼"
-#~ msgid "draw rectangle"
-#~ msgstr "ç»å¶ç©å½¢"
+#: tempo.cc:133
+msgid "TempoSection XML node has an illegal \"note-type\" value"
+msgstr "èå¥é¨å XML èç¹æä¸ä¸ªéæ³çâé³ç¬¦ç±»åâæ°å¼"
-#~ msgid "outline color rgba"
-#~ msgstr "RGBAè½®å»é¢è²"
+#: tempo.cc:139
+msgid "TempoSection XML node has no \"movable\" property"
+msgstr "èå¥é¨å XML èç¹æ²¡æâå¯ç§»å¨â屿§"
-#~ msgid "color of outline"
-#~ msgstr "è½æ¬çé¢è²"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr ""
-#~ msgid "fill color rgba"
-#~ msgstr "å¡«å
RGBAé¢è²"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
+msgstr "èæé¨å XML èç¹æä¸ä¸ªéæ³çâèµ·ç¹âæ°å¼"
-#~ msgid "color of fill"
-#~ msgstr "å¡«å
çé¢è²"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
-#~ msgid "Auditioning of MIDI files is not yet supported"
-#~ msgstr "æä¸æ¯æçå¬MIDIæä»¶"
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
-#~ msgid "Starting audio engine"
-#~ msgstr "å¯å¨é³é¢å¼æ"
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
-#~ msgid "disconnected"
-#~ msgstr "åæ¶è¿æ¥"
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
-#~ msgid ""
-#~ "%1 is not connected to JACK\n"
-#~ "You cannot open or close sessions in this condition"
-#~ msgstr ""
-#~ "%1 æªè¿æ¥å° JACK.\n"
-#~ "忤æ
åµä¸ï¼ä½ æ æ³æå¼æå
³éä¼è¯"
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
-#~ msgid ""
-#~ "The audio backend (JACK) was shutdown because:\n"
-#~ "\n"
-#~ "%1"
-#~ msgstr ""
-#~ "é³é¢åå°(JACK)å
³éäºï¼åå å¦ä¸:\n"
-#~ "\n"
-#~ "%1"
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
-#~ msgid ""
-#~ "JACK has either been shutdown or it\n"
-#~ "disconnected %1 because %1\n"
-#~ "was not fast enough. Try to restart\n"
-#~ "JACK, reconnect and save the session."
-#~ msgstr ""
-#~ "JACK 被å
³éäºï¼æä¸ %1 失å»äºè¿æ¥\n"
-#~ "åå æ¯ %1 ä¸å¤å¿«.\n"
-#~ "å°è¯éå¯JACKï¼éæ°è¿æ¥å¹¶ä¸ä¿åä¼è¯."
+#: tempo.cc:519
+msgid ""
+"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
+"property"
+msgstr "èå¥é¨å XML èç¹æ²¡æâæ¯åéæåæ°âæè
âæ¯å°èç»åâ屿§"
-#~ msgid "Unable to start the session running"
-#~ msgstr "æ æ³å¯å¨ä¼è¯"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
+msgstr ""
-#~ msgid "Click the Refresh button to try again."
-#~ msgstr "åå»å·æ°æé®,åå°è¯ä¸é"
+#: tempo.cc:529
+msgid "MeterSection XML node has no \"note-type\" property"
+msgstr "èæé¨å XML èç¹æ²¡æâé³ç¬¦ç±»åâ屿§"
-#~ msgid "Could not disconnect from JACK"
-#~ msgstr "æ æ³æå¼JACKçè¿æ¥"
+#: tempo.cc:533
+msgid "MeterSection XML node has an illegal \"note-type\" value"
+msgstr "èæé¨å XML èç¹æä¸ä¸ªéæ³çâé³ç¬¦ç±»åâæ°å¼"
-#~ msgid "Could not reconnect to JACK"
-#~ msgstr "æ æ³éæ°è¿æ¥å°JACK"
+#: tempo.cc:538
+msgid "MeterSection XML node has no \"movable\" property"
+msgstr "èæé¨å XML èç¹æ²¡æâå¯ç§»å¨â屿§"
-#~ msgid "JACK"
-#~ msgstr "JACK"
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
-#~ msgid "Reconnect"
-#~ msgstr "鿰龿¥"
+#: tempo.cc:821
+msgid ""
+"Meter changes can only be positioned on the first beat of a bar. Moving from "
+"%1 to %2"
+msgstr "èæçä¿®æ¹åªè½æ¾ç½®å¨ä¸ä¸ªå°èçç¬¬ä¸æåä¸ãæ£å¨ä» %1 ç§»å¨å° %2"
-#~ msgid "JACK Sampling Rate and Latency"
-#~ msgstr "JACKéæ ·çåå»¶è¿"
+#: tempo.cc:1156
+msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
+msgstr "å¨è奿 å°ä¸æ²¡æå®ä¹èå¥é¨åââæ æ³æ¹åèå¥ @ %1"
-#~ msgid "Realtime"
-#~ msgstr "宿¶"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
-#~ msgid "Do not lock memory"
-#~ msgstr "ä¸éå
å"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
+msgstr "ç¨åºé误ï¼å¨è奿 å°ä¸æ èå¥é¨åï¼"
-#~ msgid "Unlock memory"
-#~ msgstr "è§£éå
å"
+#: tempo.cc:1959 tempo.cc:1987
+msgid "tempo map asked for BBT time at frame %1\n"
+msgstr "è奿 å°è¦æ±å¨å¸§ %1 å¤ç BBT æ¶é´\n"
-#~ msgid "8000Hz"
-#~ msgstr "8000 Hz"
+#: tempo.cc:2054
+msgid "tempo map asked for frame time at bar < 1 (%1)\n"
+msgstr "è奿 å°è¦æ±å¨å°è < 1 (%1) å¤ç帧æ¶é´\n"
-#~ msgid "22050Hz"
-#~ msgstr "22050 Hz"
+#: tempo.cc:3472 tempo.cc:3485
+msgid "Tempo map: could not set new state, restoring old one."
+msgstr "è奿 å°ï¼æ æ³è®¾ç½®æ°çç¶æï¼æ£å¨æ¢å¤ä¸ºæ§çé£ä¸ªã"
-#~ msgid "44100Hz"
-#~ msgstr "44100 Hz"
+#: tempo.cc:3522 tempo.cc:3523
+msgid "Multiple meter definitions found at %1"
+msgstr "å¨ %1 åç°å¤ä¸ªèæå®ä¹"
-#~ msgid "48000Hz"
-#~ msgstr "48000 Hz"
+#: tempo.cc:3528 tempo.cc:3529
+msgid "Multiple tempo definitions found at %1"
+msgstr "å¨ %1 åç°å¤ä¸ªèå¥å®ä¹"
-#~ msgid "88200Hz"
-#~ msgstr "88200 Hz"
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "ç¨åºéè¯¯ï¼æªå¤çç MetricSection ç±»å"
-#~ msgid "96000Hz"
-#~ msgstr "96000 Hz"
+#: tempo_map_importer.cc:52
+msgid "Tempo map"
+msgstr "è奿 å°"
-#~ msgid "192000Hz"
-#~ msgstr "192000 Hz"
+#: tempo_map_importer.cc:60
+msgid "Tempo Map"
+msgstr "è奿 å°"
-#~ msgid "Triangular"
-#~ msgstr "ä¸è§å½¢"
+#: tempo_map_importer.cc:80
+msgid "Tempo marks: "
+msgstr "è奿 è®°ï¼"
-#~ msgid "Rectangular"
-#~ msgstr "ç©å½¢"
+#: tempo_map_importer.cc:80
+msgid ""
+"\n"
+"Meter marks: "
+msgstr ""
+"\n"
+"èææ è®°ï¼"
-#~ msgid "Shaped"
-#~ msgstr "å½¢ç¶"
+#: tempo_map_importer.cc:89
+msgid ""
+"This will replace the current tempo map!\n"
+"Are you sure you want to do this?"
+msgstr ""
+"è¿å°å代å½åçè奿 å°ï¼\n"
+"æ¨æ¯å¦ç¡®å®æ¨è¦è¿æ ·åï¼"
-#~ msgid "Playback/recording on 1 device"
-#~ msgstr "å¨è®¾å¤1 ææ¾/å½é³"
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr "æ£å¨ä½¿ç¨å¸¦ææªç¥è¾å
¥/è¾åºé
ç½®çæä»¶åæ ¹ç¨äºï¼"
-#~ msgid "Playback/recording on 2 devices"
-#~ msgstr "å¨è®¾å¤2 ææ¾/å½é³"
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
-#~ msgid "Playback only"
-#~ msgstr "ä»
ææ¾"
+#: user_bundle.cc:47
+msgid "Node for Bundle has no \"name\" property"
+msgstr "ç¨äºå
裹çèç¹æ²¡æâåç§°â屿§"
-#~ msgid "Recording only"
-#~ msgstr "ä»
å½é³"
+#: user_bundle.cc:59 user_bundle.cc:80
+#, c-format
+msgid "Unknown node \"%s\" in Bundle"
+msgstr "å¨å
è£¹ä¸æªç¥çèç¹ \"%s\""
-#~ msgid "Number of buffers:"
-#~ msgstr "ç¼å²åºæ°é:"
+#: user_bundle.cc:64
+msgid "Node for Channel has no \"name\" property"
+msgstr "ç¨äºå£°éçèç¹æ²¡æâåç§°â屿§"
-#~ msgid "Approximate latency:"
-#~ msgstr "大约延è¿:"
+#: user_bundle.cc:70
+msgid "Node for Channel has no \"type\" property"
+msgstr "ç¨äºå£°éçèç¹æ²¡æâç±»åâ屿§"
-#~ msgid "Audio mode:"
-#~ msgstr "é³é¢æ¨¡å¼:"
+#: user_bundle.cc:85
+msgid "Node for Port has no \"name\" property"
+msgstr "ç¨äºç«¯å£çèç¹æ²¡æâåç§°â屿§"
-#~ msgid "Ignore"
-#~ msgstr "忽ç¥"
+#: utils.cc:412 utils.cc:441
+msgid "Splice"
+msgstr "æ¼æ¥"
-#~ msgid "Client timeout"
-#~ msgstr "客æ·ç«¯è¶
æ¶"
+#: utils.cc:414 utils.cc:431
+msgid "Slide"
+msgstr "æ»è¡"
-#~ msgid "Number of ports:"
-#~ msgstr "ç«¯å£æ°é:"
+#: utils.cc:416 utils.cc:437
+msgid "Ripple"
+msgstr "波纹"
-#~ msgid "MIDI driver:"
-#~ msgstr "MIDI驱å¨:"
+#: utils.cc:418 utils.cc:434
+msgid "Lock"
+msgstr "éå®"
-#~ msgid ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
-#~ msgstr ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
+#: utils.cc:421
+msgid "programming error: unknown edit mode string \"%1\""
+msgstr "ç¨åºéè¯¯ï¼æªç¥çç¼è¾æ¨¡å¼å符串 \"%1\""
-#~ msgid "Server:"
-#~ msgstr "æå¡å¨:"
+#: utils.cc:448 utils.cc:484
+msgid "MIDI Timecode"
+msgstr "MIDI æ¶é´ç "
-#~ msgid "Input device:"
-#~ msgstr "è¾å
¥è®¾å¤:"
+#: utils.cc:448 utils.cc:482
+msgid "MTC"
+msgstr "MTC MIDI æ¶é´ç "
-#~ msgid "Output device:"
-#~ msgstr "è¾åºè®¾å¤:"
+#: utils.cc:452 utils.cc:491
+msgid "MIDI Clock"
+msgstr "MIDI 计æ¶å¨"
-#~ msgid "Advanced"
-#~ msgstr "é«çº§"
+#: utils.cc:456 utils.cc:478 utils.cc:498
+msgid "JACK"
+msgstr ""
-#~ msgid "cannot open JACK rc file %1 to store parameters"
-#~ msgstr "æ æ³æå¼JACKçrcæä»¶%1æ¥å¨ååæ°"
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
+msgstr "LTC çºµåæ¶é´ç "
-#~ msgid "No suitable audio devices"
-#~ msgstr "没æåéçé³é¢è®¾å¤"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
+msgstr "ç¨åºéè¯¯ï¼æªç¥çåæ¥æ¥æºå符串 \"%1\""
-#~ msgid "JACK appears to be missing from the %1 bundle"
-#~ msgstr "JACK%1"
+#: utils.cc:489
+msgid "M-Clock"
+msgstr "M-计æ¶å¨"
-#~ msgid "You need to choose an audio device first."
-#~ msgstr "ä½ éè¦å
éæ©ä¸ä¸ªé³é¢è®¾å¤"
+#: utils.cc:658
+msgid "programming error: unknown native header format: %1"
+msgstr "ç¨åºéè¯¯ï¼æªç¥çæ¬å°æä»¶å¤´å符串 \"%1\""
-#~ msgid "Audio device \"%1\" not known on this computer."
-#~ msgstr "çµèæ æ³è¯å«é³é¢è®¾å¤ %1"
+#: utils.cc:673
+msgid "cannot open directory %1 (%2)"
+msgstr "æ æ³æå¼ç®å½ %1 (%2)"
-#~ msgid "%1 could not connect to JACK."
-#~ msgstr "%1 æ æ³è¿æ¥å°JACK"
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
-#~ msgid "JACK exited"
-#~ msgstr "JACKå·²ç»éåº"
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
#~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
+#~ "You have requested an operation that requires audio analysis.\n"
#~ "\n"
-#~ "This could be due to misconfiguration or to an error inside JACK.\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
#~ "\n"
-#~ "Click OK to exit %1."
-#~ msgstr ""
-#~ "JACKåºä¹ææå°éåºäº, 没æä»»ä½æ¥å %1.\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
#~ "\n"
-#~ "è¿å¯è½æ¯å¾®é
ç½®æJACKéé¢çé误.\n"
+#~ "This dialog will not display again. But you may notice a slight delay in "
+#~ "this and future transient-detection operations.\n"
+#~ msgstr ""
+#~ "æ¨æè¦æ±çæä½éè¦é³é¢åæã\n"
#~ "\n"
-#~ "åå»OKéåº %1."
-
-#~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
+#~ "æ¨å½åç¦ç¨âèªå¨åæé³é¢âï¼è¿æå³çæ¯æ¬¡éè¦è¦å®æ¶é½å¿
é¡»çæç¬ææ°æ®ã\n"
#~ "\n"
-#~ "This is probably due to an error inside JACK. You should restart JACK\n"
-#~ "and reconnect %1 to it, or exit %1 now. You cannot save your\n"
-#~ "session at this time, because we would lose your connection information.\n"
-#~ msgstr ""
-#~ "JACKåºä¹ææå°éåºäº, 没æä»»ä½æ¥å %1.\n"
+#~ "å¦ææ¨æ£åçéè¦å®æç¬ææ°æ®çå·¥ä½ï¼æ¨åºè¯¥å¯ç¨âèªå¨åæé³é¢âç¶åéåº %1 å¹¶"
+#~ "éæ°å¯å¨ã\n"
#~ "\n"
-#~ "è¿å¯è½æ¯JACKéé¢çé误. ä½ æå¥½éå¯JACK\n"
-#~ "ç¶åè¿æ¥å°%1, æè
ç°å¨éåº%1.\n"
-#~ "ç°å¨ä½ æ²¡åæ³ä¿åä¼è¯, å ä¸ºä½ çè¿æ¥ä¿¡æ¯å¯è½ä¼ä¸¢å¤±.\n"
+#~ "è¿ä¸ªå¯¹è¯æ¡å°ä¸ä¼å次æ¾ç¤ºã使¨å¯è½ä¼æ³¨æå°å¨ç°å¨åå°æ¥çç¬ææ£æµæä½ä¸æä¸"
+#~ "个轻微çå»¶è¿ã\n"
-#~ msgid ""
-#~ " -c, --name <name> Use a specific jack client name, default is "
-#~ "ardour\n"
-#~ msgstr ""
-#~ " -c, --name <name> ç¨ä¸ä¸ªç¹æ®çJACKç¨æ·åç§°, é»è®¤åç§°æ¯: ardour\n"
+#~ msgid "normalize"
+#~ msgstr "è§èå"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr "å¨ç¶ææä»¶ [%1] éé误形å¼çå½ä»¤é®å符串ï¼â¦å·²å¿½ç¥ã"
-#~ msgid "follows order of editor"
-#~ msgstr "ç¼è¾å¨çå¦ä¸é¡ºåº"
+#~ msgid "Converting deprecated order key for %1 using Editor order %2"
+#~ msgstr "æ£å¨ä¸º %1 使ç¨ç¼è¾å¨å½ä»¤ %2 转æ¢åºå¼çå½ä»¤é®"
-#~ msgid "Open an existing session"
-#~ msgstr "æå¼ä¸ä¸ªå·²åå¨çä¼è¯"
+#~ msgid "programming error: %1%2\n"
+#~ msgstr "ç¨åºé误ï¼%1%2\n"
-#~ msgid "I'd like more options for this session"
-#~ msgstr "ææ³è¦å
³äºè¿ä¸ªä¼è¯çæ´å¤é项"
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "èå¥é¨å XML èç¹æ²¡æâèµ·ç¹â屿§"
-#~ msgid "Audio / MIDI Setup"
-#~ msgstr "é³é¢/MIDI设置"
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "èå¥é¨å XML èç¹æä¸ä¸ªéæ³çâèµ·ç¹âæ°å¼"
-#~ msgid "Use an existing session as a template:"
-#~ msgstr "使ç¨ä¸ä¸ªåå¨çä¼è¯å½ä½æ¨¡æ¿"
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "èå¥é¨å XML èç¹æä¸ä¸ªéæ³çâå°èåç§»âæ°å¼"
-#~ msgid "Select template"
-#~ msgstr "éæ©æ¨¡æ¿"
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "èæé¨å XML èç¹æ²¡æâèµ·ç¹â屿§"
-#~ msgid "Browse:"
-#~ msgstr "æµè§:"
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr "èæé¨å XML èç¹æä¸ä¸ªéæ³çâæ¯åéæåæ°âæè
âæ¯å°èç»åâæ°å¼"
+
+#~ msgid "an error occured while writing a TOC/CUE file: %1"
+#~ msgstr "å½åå
¥ TOC/CUEï¼ç®å½æ°æ®/å
çæ åè¾
å©ï¼æä»¶æ¶åºç°ä¸ä¸ªé误ï¼%1"
-#~ msgid "Select a session"
-#~ msgstr "éæ©ä¸ä¸ªä¼è¯"
+#~ msgid "Session: you can't use that location for session (start/end)"
+#~ msgstr "ä¼è¯ï¼æ¨ä¸è½ä¸ºä¼è¯ä½¿ç¨è¯¥ä½ç½®ï¼èµ·ç¹/ç»ç¹ï¼"
-#~ msgid "Advanced Session Options"
-#~ msgstr "é«çº§ä¼è¯é项"
+#~ msgid ""
+#~ "The session's interchange dir is tainted.\n"
+#~ "There is more than one folder in '%1'.\n"
+#~ "Please remove extra subdirs to reduce possible filename ambiguities."
+#~ msgstr ""
+#~ "ä¼è¯ç交æ¢ç®å½å·²è¢«æ±¡æã\n"
+#~ "å¨ '%1' éæä¸æ¢ä¸ä¸ªæä»¶å¤¹ã\n"
+#~ "请移é¤é¢å¤çåç®å½ä»¥åå°æä»¶åäº§çæ§ä¹çå¯è½æ§ã"
diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc
index 06169dd..33b41f5 100644
--- a/libs/ardour/port.cc
+++ b/libs/ardour/port.cc
@@ -30,7 +30,7 @@
#include "ardour/port.h"
#include "ardour/port_engine.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -38,6 +38,7 @@ using namespace PBD;
PBD::Signal2<void,boost::shared_ptr<Port>, boost::shared_ptr<Port> > Port::PostDisconnect;
PBD::Signal0<void> Port::PortDrop;
+PBD::Signal0<void> Port::PortSignalDrop;
bool Port::_connecting_blocked = false;
pframes_t Port::_global_port_buffer_offset = 0;
@@ -75,6 +76,9 @@ Port::Port (std::string const & n, DataType t, PortFlags f)
}
PortDrop.connect_same_thread (drop_connection, boost::bind (&Port::drop, this));
+ PortSignalDrop.connect_same_thread (drop_connection, boost::bind (&Port::signal_drop, this));
+ port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection,
+ boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5));
}
/** Port destructor */
@@ -103,6 +107,25 @@ Port::pretty_name(bool fallback_to_name) const
return "";
}
+bool
+Port::set_pretty_name(const std::string& n)
+{
+ if (_port_handle) {
+ if (0 == port_engine.set_port_property (_port_handle,
+ "http://jackaudio.org/metadata/pretty-name", n, ""))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+void
+Port::signal_drop ()
+{
+ engine_connection.disconnect ();
+}
+
void
Port::drop ()
{
@@ -113,6 +136,26 @@ Port::drop ()
}
}
+void
+Port::port_connected_or_disconnected (boost::weak_ptr<Port> w0, boost::weak_ptr<Port> w1, bool con)
+{
+ if (con) {
+ /* we're only interested in disconnect */
+ return;
+ }
+ boost::shared_ptr<Port> p0 = w0.lock ();
+ boost::shared_ptr<Port> p1 = w1.lock ();
+ /* a cheaper, less hacky way to do boost::shared_from_this() ... */
+ boost::shared_ptr<Port> pself = AudioEngine::instance()->get_port_by_name (name());
+
+ if (p0 == pself) {
+ PostDisconnect (p0, p1); // emit signal
+ }
+ if (p1 == pself) {
+ PostDisconnect (p1, p0); // emit signal
+ }
+}
+
/** @return true if this port is connected to anything */
bool
Port::connected () const
@@ -225,8 +268,7 @@ Port::disconnect (std::string const & other)
_connections.erase (other);
}
- /* a cheaper, less hacky way to do boost::shared_from_this() ...
- */
+ /* a cheaper, less hacky way to do boost::shared_from_this() ... */
boost::shared_ptr<Port> pself = AudioEngine::instance()->get_port_by_name (name());
boost::shared_ptr<Port> pother = AudioEngine::instance()->get_port_by_name (other);
@@ -465,6 +507,8 @@ Port::reestablish ()
reset ();
+ port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection,
+ boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5));
return 0;
}
@@ -543,7 +587,7 @@ Port::get_state () const
int
Port::set_state (const XMLNode& node, int)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if (node.name() != state_node_name) {
return -1;
diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc
index ce34048..3b53454 100644
--- a/libs/ardour/port_insert.cc
+++ b/libs/ardour/port_insert.cc
@@ -30,7 +30,7 @@
#include "ardour/session.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -107,7 +107,7 @@ PortInsert::latency() const
}
void
-PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
{
if (_output->n_ports().n_total() == 0) {
return;
@@ -134,7 +134,7 @@ PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
hear the remnants of whatever MTDM pumped into the pipeline.
*/
- silence (nframes);
+ silence (nframes, start_frame);
if (_latency_flush_frames > nframes) {
_latency_flush_frames -= nframes;
@@ -147,11 +147,11 @@ PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
if (!_active && !_pending_active) {
/* deliver silence */
- silence (nframes);
+ silence (nframes, start_frame);
goto out;
}
- _out->run (bufs, start_frame, end_frame, nframes, true);
+ _out->run (bufs, start_frame, end_frame, speed, nframes, true);
_input->collect_input (bufs, nframes, ChanCount::ZERO);
out:
@@ -186,7 +186,7 @@ PortInsert::set_state (const XMLNode& node, int version)
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
XMLPropertyList plist;
- const XMLProperty *prop;
+ XMLProperty const * prop;
const XMLNode* insert_node = &node;
diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc
index 874d36d..10c19a9 100644
--- a/libs/ardour/port_manager.cc
+++ b/libs/ardour/port_manager.cc
@@ -28,8 +28,9 @@
#include "ardour/midiport_manager.h"
#include "ardour/port_manager.h"
#include "ardour/profile.h"
+#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -158,6 +159,7 @@ void
PortManager::get_physical_outputs (DataType type, std::vector<std::string>& s)
{
if (!_backend) {
+ s.clear ();
return;
}
_backend->get_physical_outputs (type, s);
@@ -167,6 +169,7 @@ void
PortManager::get_physical_inputs (DataType type, std::vector<std::string>& s)
{
if (!_backend) {
+ s.clear ();
return;
}
@@ -350,6 +353,12 @@ PortManager::register_output_port (DataType type, const string& portname, bool a
int
PortManager::unregister_port (boost::shared_ptr<Port> port)
{
+ /* This is a little subtle. We do not call the backend's port
+ * unregistration code from here. That is left for the Port
+ * destructor. We are trying to drop references to the Port object
+ * here, so that its destructor will run and it will unregister itself.
+ */
+
/* caller must hold process lock */
{
@@ -385,6 +394,40 @@ PortManager::connected (const string& port_name)
return _backend->connected (handle);
}
+bool
+PortManager::physically_connected (const string& port_name)
+{
+ if (!_backend) {
+ return false;
+ }
+
+ PortEngine::PortHandle handle = _backend->get_port_by_name (port_name);
+
+ if (!handle) {
+ return false;
+ }
+
+ return _backend->physically_connected (handle);
+}
+
+int
+PortManager::get_connections (const string& port_name, std::vector<std::string>& s)
+{
+ if (!_backend) {
+ s.clear ();
+ return 0;
+ }
+
+ PortEngine::PortHandle handle = _backend->get_port_by_name (port_name);
+
+ if (!handle) {
+ s.clear ();
+ return 0;
+ }
+
+ return _backend->get_connections (handle, s);
+}
+
int
PortManager::connect (const string& source, const string& destination)
{
@@ -629,9 +672,18 @@ PortManager::cycle_end (pframes_t nframes)
}
void
-PortManager::silence (pframes_t nframes)
+PortManager::silence (pframes_t nframes, Session *s)
{
for (Ports::iterator i = _cycle_ports->begin(); i != _cycle_ports->end(); ++i) {
+ if (s && i->second == s->mtc_output_port ()) {
+ continue;
+ }
+ if (s && i->second == s->midi_clock_output_port ()) {
+ continue;
+ }
+ if (s && i->second == s->ltc_output_port ()) {
+ continue;
+ }
if (i->second->sends_output()) {
i->second->get_buffer(nframes).silence(nframes);
}
diff --git a/libs/ardour/presentation_info.cc b/libs/ardour/presentation_info.cc
new file mode 100644
index 0000000..b335f54
--- /dev/null
+++ b/libs/ardour/presentation_info.cc
@@ -0,0 +1,236 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <sstream>
+#include <typeinfo>
+
+#include <cassert>
+
+#include "pbd/convert.h"
+#include "pbd/debug.h"
+#include "pbd/enumwriter.h"
+#include "pbd/error.h"
+#include "pbd/failed_constructor.h"
+#include "pbd/xml++.h"
+
+#include "ardour/presentation_info.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using std::string;
+
+string PresentationInfo::state_node_name = X_("PresentationInfo");
+PBD::Signal0<void> PresentationInfo::Change;
+
+namespace ARDOUR {
+ namespace Properties {
+ PBD::PropertyDescriptor<bool> selected;
+ PBD::PropertyDescriptor<uint32_t> order;
+ PBD::PropertyDescriptor<uint32_t> color;
+ }
+}
+
+const PresentationInfo::order_t PresentationInfo::max_order = UINT32_MAX;
+const PresentationInfo::Flag PresentationInfo::Bus = PresentationInfo::Flag (PresentationInfo::AudioBus|PresentationInfo::MidiBus);
+const PresentationInfo::Flag PresentationInfo::Track = PresentationInfo::Flag (PresentationInfo::AudioTrack|PresentationInfo::MidiTrack);
+const PresentationInfo::Flag PresentationInfo::Route = PresentationInfo::Flag (PresentationInfo::Bus|PresentationInfo::Track);
+const PresentationInfo::Flag PresentationInfo::AllRoutes = PresentationInfo::Flag (PresentationInfo::Route|PresentationInfo::MasterOut|PresentationInfo::MonitorOut);
+const PresentationInfo::Flag PresentationInfo::AllStripables = PresentationInfo::Flag (PresentationInfo::AllRoutes|PresentationInfo::VCA);
+
+void
+PresentationInfo::make_property_quarks ()
+{
+ Properties::selected.property_id = g_quark_from_static_string (X_("selected"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for selected = %1\n", Properties::selected.property_id));
+ Properties::color.property_id = g_quark_from_static_string (X_("color"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n", Properties::color.property_id));
+ Properties::order.property_id = g_quark_from_static_string (X_("order"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for order = %1\n", Properties::order.property_id));
+}
+
+PresentationInfo::PresentationInfo (Flag f)
+ : _order (0)
+ , _flags (Flag (f & ~OrderSet))
+ , _color (0)
+{
+ /* OrderSet is not set */
+}
+
+PresentationInfo::PresentationInfo (order_t o, Flag f)
+ : _order (o)
+ , _flags (Flag (f | OrderSet))
+ , _color (0)
+{
+ /* OrderSet is set */
+}
+PresentationInfo::PresentationInfo (PresentationInfo const& other)
+ : _order (other.order())
+ , _flags (other.flags())
+ , _color (other.color())
+{
+}
+
+XMLNode&
+PresentationInfo::get_state ()
+{
+ XMLNode* node = new XMLNode (state_node_name);
+ node->add_property ("order", PBD::to_string (_order, std::dec));
+ node->add_property ("flags", enum_2_string (_flags));
+ node->add_property ("color", PBD::to_string (_color, std::dec));
+
+ return *node;
+}
+
+int
+PresentationInfo::set_state (XMLNode const& node, int /* version */)
+{
+ if (node.name() != state_node_name) {
+ return -1;
+ }
+
+ XMLProperty const* prop;
+ PropertyChange pc;
+
+ if ((prop = node.property (X_("order"))) != 0) {
+ order_t o = atoi (prop->value());
+ if (o != _order) {
+ pc.add (Properties::order);
+ _order = o;
+ }
+ _order = atoi (prop->value());
+ }
+
+ if ((prop = node.property (X_("flags"))) != 0) {
+ Flag f = Flag (string_2_enum (prop->value(), f));
+ if ((f&Hidden) != (_flags&Hidden)) {
+ pc.add (Properties::hidden);
+ }
+ _flags = f;
+ }
+
+ if ((prop = node.property (X_("color"))) != 0) {
+ color_t c = atoi (prop->value());
+ if (c != _color) {
+ pc.add (Properties::color);
+ _color = c;
+ }
+ }
+
+ send_change (PropertyChange (pc));
+
+ return 0;
+
+}
+
+PresentationInfo::Flag
+PresentationInfo::get_flags (XMLNode const& node)
+{
+ XMLNodeList nlist = node.children ();
+
+ for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter){
+ XMLNode* child = *niter;
+
+ if (child->name() == PresentationInfo::state_node_name) {
+ XMLProperty const* prop = child->property (X_("flags"));
+ if (prop) {
+ Flag f = (Flag) string_2_enum (prop->value(), f);
+ return f;
+ }
+ }
+ }
+ return Flag (0);
+}
+
+void
+PresentationInfo::set_color (PresentationInfo::color_t c)
+{
+ if (c != _color) {
+ _color = c;
+ send_change (PropertyChange (Properties::color));
+ }
+}
+
+bool
+PresentationInfo::color_set () const
+{
+ /* all RGBA values zero? not set.
+ *
+ * this is heuristic, but it is fairly realistic. who will ever set
+ * a color to completely transparent black? only the constructor ..
+ */
+ return _color != 0;
+}
+
+void
+PresentationInfo::set_selected (bool yn)
+{
+ if (yn != selected()) {
+ if (yn) {
+ _flags = Flag (_flags | Selected);
+ } else {
+ _flags = Flag (_flags & ~Selected);
+ }
+ send_change (PropertyChange (Properties::selected));
+ }
+}
+
+void
+PresentationInfo::set_hidden (bool yn)
+{
+ if (yn != hidden()) {
+
+ if (yn) {
+ _flags = Flag (_flags | Hidden);
+ } else {
+ _flags = Flag (_flags & ~Hidden);
+ }
+
+ send_change (PropertyChange (Properties::hidden));
+ }
+}
+
+void
+PresentationInfo::set_order (order_t order)
+{
+ _flags = Flag (_flags|OrderSet);
+
+ if (order != _order) {
+ _order = order;
+ send_change (PropertyChange (Properties::order));
+ }
+}
+
+PresentationInfo&
+PresentationInfo::operator= (PresentationInfo const& other)
+{
+ if (this != &other) {
+ _order = other.order();
+ _flags = other.flags();
+ _color = other.color();
+ }
+
+ return *this;
+}
+
+std::ostream&
+operator<<(std::ostream& o, ARDOUR::PresentationInfo const& pi)
+{
+ return o << pi.order() << '/' << enum_2_string (pi.flags()) << '/' << pi.color();
+}
diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc
index cf48c50..efcc47f 100644
--- a/libs/ardour/process_thread.cc
+++ b/libs/ardour/process_thread.cc
@@ -117,6 +117,25 @@ ProcessThread::get_scratch_buffers (ChanCount count, bool silence)
}
BufferSet&
+ProcessThread::get_noinplace_buffers (ChanCount count)
+{
+ ThreadBuffers* tb = _private_thread_buffers.get();
+ assert (tb);
+
+ BufferSet* sb = tb->noinplace_buffers;
+ assert (sb);
+
+ if (count != ChanCount::ZERO) {
+ assert(sb->available() >= count);
+ sb->set_count (count);
+ } else {
+ sb->set_count (sb->available());
+ }
+
+ return *sb;
+}
+
+BufferSet&
ProcessThread::get_route_buffers (ChanCount count, bool silence)
{
ThreadBuffers* tb = _private_thread_buffers.get();
diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc
index 315fb66..60a2337 100644
--- a/libs/ardour/processor.cc
+++ b/libs/ardour/processor.cc
@@ -42,7 +42,7 @@
#include "ardour/session.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -64,6 +64,7 @@ Processor::Processor(Session& session, const string& name)
, _pre_fader (false)
, _ui_pointer (0)
, _window_proxy (0)
+ , _pinmgr_proxy (0)
, _owner (0)
{
}
@@ -81,6 +82,7 @@ Processor::Processor (const Processor& other)
, _pre_fader (false)
, _ui_pointer (0)
, _window_proxy (0)
+ , _pinmgr_proxy (0)
, _owner (0)
{
}
@@ -124,6 +126,8 @@ Processor::state (bool full_state)
XMLNode& automation = Automatable::get_automation_xml_state();
if (!automation.children().empty() || !automation.properties().empty()) {
node->add_child_nocopy (automation);
+ } else {
+ delete &automation;
}
}
@@ -176,8 +180,8 @@ Processor::set_state (const XMLNode& node, int version)
return set_state_2X (node, version);
}
- const XMLProperty *prop;
- const XMLProperty *legacy_active = 0;
+ XMLProperty const * prop;
+ XMLProperty const * legacy_active = 0;
bool leave_name_alone = (node.property ("ignore-name") != 0);
if (!leave_name_alone) {
@@ -201,7 +205,7 @@ Processor::set_state (const XMLNode& node, int version)
if ((*niter)->name() == X_("Automation")) {
- XMLProperty *prop;
+ XMLProperty const * prop;
if ((prop = (*niter)->property ("path")) != 0) {
old_set_automation_state (*(*niter));
@@ -278,12 +282,6 @@ Processor::set_ui (void* p)
}
void
-Processor::set_window_proxy (ProcessorWindowProxy* wp)
-{
- _window_proxy = wp;
-}
-
-void
Processor::set_owner (SessionObject* o)
{
_owner = o;
diff --git a/libs/ardour/quantize.cc b/libs/ardour/quantize.cc
index f484a16..b60b63d 100644
--- a/libs/ardour/quantize.cc
+++ b/libs/ardour/quantize.cc
@@ -23,7 +23,7 @@
#include "ardour/quantize.h"
#include "ardour/midi_model.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/ardour/rb_effect.cc b/libs/ardour/rb_effect.cc
index 03ce918..bc127e2 100644
--- a/libs/ardour/rb_effect.cc
+++ b/libs/ardour/rb_effect.cc
@@ -32,7 +32,7 @@
#include "ardour/stretch.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -352,9 +352,9 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
shift);
(*x)->set_master_sources (region->master_sources());
/* multiply the old (possibly previously stretched) region length by the extra
- stretch this time around to get its new length
+ stretch this time around to get its new length. this is a non-music based edit atm.
*/
- (*x)->set_length ((*x)->length() * tsr.time_fraction);
+ (*x)->set_length ((*x)->length() * tsr.time_fraction, 0);
}
/* stretch region gain envelope */
diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc
index 2abf347..7fc2f51 100644
--- a/libs/ardour/rc_configuration.cc
+++ b/libs/ardour/rc_configuration.cc
@@ -36,7 +36,7 @@
#include "ardour/rc_configuration.h"
#include "ardour/session_metadata.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
@@ -89,7 +89,7 @@ RCConfiguration::load_state ()
}
if (statbuf.st_size != 0) {
- info << string_compose (_("Loading system configuration file %1"), rcfile) << endl;
+ info << string_compose (_("Loading system configuration file %1"), rcfile) << endmsg;
XMLTree tree;
if (!tree.read (rcfile.c_str())) {
@@ -117,7 +117,7 @@ RCConfiguration::load_state ()
}
if (statbuf.st_size != 0) {
- info << string_compose (_("Loading user configuration file %1"), rcfile) << endl;
+ info << string_compose (_("Loading user configuration file %1"), rcfile) << endmsg;
XMLTree tree;
if (!tree.read (rcfile)) {
@@ -172,7 +172,7 @@ XMLNode&
RCConfiguration::get_state ()
{
XMLNode* root;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
root = new XMLNode("Ardour");
@@ -193,7 +193,7 @@ XMLNode&
RCConfiguration::get_variables ()
{
XMLNode* node;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
node = new XMLNode ("Config");
@@ -220,6 +220,7 @@ RCConfiguration::set_state (const XMLNode& root, int version)
XMLNodeList nlist = root.children();
XMLNodeConstIterator niter;
XMLNode *node;
+ LocaleGuard lg;
Stateful::save_extra_xml (root);
diff --git a/libs/ardour/recent_sessions.cc b/libs/ardour/recent_sessions.cc
index 39d517c..fd0b9b1 100644
--- a/libs/ardour/recent_sessions.cc
+++ b/libs/ardour/recent_sessions.cc
@@ -31,7 +31,7 @@
#include "ardour/filesystem_paths.h"
#include "ardour/recent_sessions.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/record_enable_control.cc b/libs/ardour/record_enable_control.cc
new file mode 100644
index 0000000..f3512c3
--- /dev/null
+++ b/libs/ardour/record_enable_control.cc
@@ -0,0 +1,75 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/audioengine.h"
+#include "ardour/record_enable_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+RecordEnableControl::RecordEnableControl (Session& session, std::string const & name, Recordable& r)
+ : SlavableAutomationControl (session, RecEnableAutomation, ParameterDescriptor (RecEnableAutomation),
+ boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(RecEnableAutomation))),
+ name)
+ , _recordable (r)
+{
+ _list->set_interpolation(Evoral::ControlList::Discrete);
+
+ /* record-enable changes must be synchronized by the process cycle */
+ set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+RecordEnableControl::set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ /* Because we are marked as a RealTime control, this will queue
+ up the control change to be executed in a realtime context.
+ */
+ SlavableAutomationControl::set_value (val, gcd);
+}
+
+void
+RecordEnableControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ if (val && !_recordable.can_be_record_enabled()) {
+ std::cerr << "rec-enable not allowed\n";
+ return;
+ }
+
+ SlavableAutomationControl::actually_set_value (val, gcd);
+}
+
+void
+RecordEnableControl::do_pre_realtime_queue_stuff (double newval)
+{
+ /* do the non-RT part of rec-enabling first - the RT part will be done
+ * on the next process cycle. This does mean that theoretically we are
+ * doing things provisionally on the assumption that the rec-enable
+ * change will work, but this had better be a solid assumption for
+ * other reasons.
+ *
+ * this is guaranteed to be called from a non-process thread.
+ */
+
+ if (_recordable.prep_record_enabled (newval)) {
+ /* failed */
+ std::cerr << "Prep rec-enable failed\n";
+ }
+}
diff --git a/libs/ardour/record_safe_control.cc b/libs/ardour/record_safe_control.cc
new file mode 100644
index 0000000..f3036e0
--- /dev/null
+++ b/libs/ardour/record_safe_control.cc
@@ -0,0 +1,49 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/audioengine.h"
+#include "ardour/record_safe_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+RecordSafeControl::RecordSafeControl (Session& session, std::string const & name, Recordable& r)
+ : SlavableAutomationControl (session, RecSafeAutomation, ParameterDescriptor (RecSafeAutomation),
+ boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(RecSafeAutomation))),
+ name)
+ , _recordable (r)
+{
+ _list->set_interpolation(Evoral::ControlList::Discrete);
+
+ /* record-enable changes must be synchronized by the process cycle */
+ set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+RecordSafeControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ if (val && !_recordable.can_be_record_safe()) {
+ std::cerr << "rec-enable not allowed\n";
+ return;
+ }
+
+ SlavableAutomationControl::actually_set_value (val, gcd);
+}
+
diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc
index bd99403..f787466 100644
--- a/libs/ardour/region.cc
+++ b/libs/ardour/region.cc
@@ -36,8 +36,9 @@
#include "ardour/session.h"
#include "ardour/source.h"
#include "ardour/tempo.h"
+#include "ardour/transient_detector.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -63,6 +64,7 @@ namespace ARDOUR {
PBD::PropertyDescriptor<framepos_t> start;
PBD::PropertyDescriptor<framecnt_t> length;
PBD::PropertyDescriptor<framepos_t> position;
+ PBD::PropertyDescriptor<double> beat;
PBD::PropertyDescriptor<framecnt_t> sync_position;
PBD::PropertyDescriptor<layer_t> layer;
PBD::PropertyDescriptor<framepos_t> ancestral_start;
@@ -80,55 +82,57 @@ void
Region::make_property_quarks ()
{
Properties::muted.property_id = g_quark_from_static_string (X_("muted"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for muted = %1\n", Properties::muted.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for muted = %1\n", Properties::muted.property_id));
Properties::opaque.property_id = g_quark_from_static_string (X_("opaque"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for opaque = %1\n", Properties::opaque.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for opaque = %1\n", Properties::opaque.property_id));
Properties::locked.property_id = g_quark_from_static_string (X_("locked"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for locked = %1\n", Properties::locked.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for locked = %1\n", Properties::locked.property_id));
Properties::video_locked.property_id = g_quark_from_static_string (X_("video-locked"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for video-locked = %1\n", Properties::video_locked.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for video-locked = %1\n", Properties::video_locked.property_id));
Properties::automatic.property_id = g_quark_from_static_string (X_("automatic"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for automatic = %1\n", Properties::automatic.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for automatic = %1\n", Properties::automatic.property_id));
Properties::whole_file.property_id = g_quark_from_static_string (X_("whole-file"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for whole-file = %1\n", Properties::whole_file.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for whole-file = %1\n", Properties::whole_file.property_id));
Properties::import.property_id = g_quark_from_static_string (X_("import"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for import = %1\n", Properties::import.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for import = %1\n", Properties::import.property_id));
Properties::external.property_id = g_quark_from_static_string (X_("external"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for external = %1\n", Properties::external.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for external = %1\n", Properties::external.property_id));
Properties::sync_marked.property_id = g_quark_from_static_string (X_("sync-marked"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-marked = %1\n", Properties::sync_marked.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-marked = %1\n", Properties::sync_marked.property_id));
Properties::left_of_split.property_id = g_quark_from_static_string (X_("left-of-split"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for left-of-split = %1\n", Properties::left_of_split.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for left-of-split = %1\n", Properties::left_of_split.property_id));
Properties::right_of_split.property_id = g_quark_from_static_string (X_("right-of-split"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for right-of-split = %1\n", Properties::right_of_split.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for right-of-split = %1\n", Properties::right_of_split.property_id));
Properties::hidden.property_id = g_quark_from_static_string (X_("hidden"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for hidden = %1\n", Properties::hidden.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for hidden = %1\n", Properties::hidden.property_id));
Properties::position_locked.property_id = g_quark_from_static_string (X_("position-locked"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position-locked = %1\n", Properties::position_locked.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position-locked = %1\n", Properties::position_locked.property_id));
Properties::valid_transients.property_id = g_quark_from_static_string (X_("valid-transients"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for valid-transients = %1\n", Properties::valid_transients.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for valid-transients = %1\n", Properties::valid_transients.property_id));
Properties::start.property_id = g_quark_from_static_string (X_("start"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for start = %1\n", Properties::start.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for start = %1\n", Properties::start.property_id));
Properties::length.property_id = g_quark_from_static_string (X_("length"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for length = %1\n", Properties::length.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for length = %1\n", Properties::length.property_id));
Properties::position.property_id = g_quark_from_static_string (X_("position"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position = %1\n", Properties::position.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position = %1\n", Properties::position.property_id));
+ Properties::beat.property_id = g_quark_from_static_string (X_("beat"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for beat = %1\n", Properties::beat.property_id));
Properties::sync_position.property_id = g_quark_from_static_string (X_("sync-position"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-position = %1\n", Properties::sync_position.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-position = %1\n", Properties::sync_position.property_id));
Properties::layer.property_id = g_quark_from_static_string (X_("layer"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layer = %1\n", Properties::layer.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layer = %1\n", Properties::layer.property_id));
Properties::ancestral_start.property_id = g_quark_from_static_string (X_("ancestral-start"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-start = %1\n", Properties::ancestral_start.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-start = %1\n", Properties::ancestral_start.property_id));
Properties::ancestral_length.property_id = g_quark_from_static_string (X_("ancestral-length"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-length = %1\n", Properties::ancestral_length.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-length = %1\n", Properties::ancestral_length.property_id));
Properties::stretch.property_id = g_quark_from_static_string (X_("stretch"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for stretch = %1\n", Properties::stretch.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for stretch = %1\n", Properties::stretch.property_id));
Properties::shift.property_id = g_quark_from_static_string (X_("shift"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for shift = %1\n", Properties::shift.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for shift = %1\n", Properties::shift.property_id));
Properties::position_lock_style.property_id = g_quark_from_static_string (X_("positional-lock-style"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position_lock_style = %1\n", Properties::position_lock_style.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position_lock_style = %1\n", Properties::position_lock_style.property_id));
Properties::layering_index.property_id = g_quark_from_static_string (X_("layering-index"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layering_index = %1\n", Properties::layering_index.property_id));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layering_index = %1\n", Properties::layering_index.property_id));
}
void
@@ -153,6 +157,7 @@ Region::register_properties ()
add_property (_start);
add_property (_length);
add_property (_position);
+ add_property (_beat);
add_property (_sync_position);
add_property (_ancestral_start);
add_property (_ancestral_length);
@@ -170,7 +175,11 @@ Region::register_properties ()
, _start (Properties::start, (s)) \
, _length (Properties::length, (l)) \
, _position (Properties::position, 0) \
+ , _beat (Properties::beat, 0.0) \
, _sync_position (Properties::sync_position, (s)) \
+ , _transient_user_start (0) \
+ , _transient_analysis_start (0) \
+ , _transient_analysis_end (0) \
, _muted (Properties::muted, false) \
, _opaque (Properties::opaque, true) \
, _locked (Properties::locked, false) \
@@ -196,8 +205,14 @@ Region::register_properties ()
, _start(Properties::start, other->_start) \
, _length(Properties::length, other->_length) \
, _position(Properties::position, other->_position) \
+ , _beat (Properties::beat, other->_beat) \
, _sync_position(Properties::sync_position, other->_sync_position) \
- , _muted (Properties::muted, other->_muted) \
+ , _user_transients (other->_user_transients) \
+ , _transient_user_start (other->_transient_user_start) \
+ , _transients (other->_transients) \
+ , _transient_analysis_start (other->_transient_analysis_start) \
+ , _transient_analysis_end (other->_transient_analysis_end) \
+ , _muted (Properties::muted, other->_muted) \
, _opaque (Properties::opaque, other->_opaque) \
, _locked (Properties::locked, other->_locked) \
, _video_locked (Properties::video_locked, other->_video_locked) \
@@ -264,17 +279,19 @@ Region::Region (boost::shared_ptr<const Region> other)
/* override state that may have been incorrectly inherited from the other region
*/
- _position = 0;
+ _position = other->_position;
_locked = false;
_whole_file = false;
_hidden = false;
use_sources (other->_sources);
+ set_master_sources (other->_master_sources);
_position_lock_style = other->_position_lock_style;
_first_edit = other->_first_edit;
- _start = 0; // It seems strange _start is not inherited here?
+ _start = other->_start;
+ _beat = other->_beat;
/* sync pos is relative to start of file. our start-in-file is now zero,
so set our sync position to whatever the the difference between
@@ -301,17 +318,6 @@ Region::Region (boost::shared_ptr<const Region> other)
_sync_position = _start;
}
- if (Profile->get_sae()) {
- /* reset sync point to start if its ended up
- outside region bounds.
- */
-
- if (_sync_position < _start || _sync_position >= _start + _length) {
- _sync_marked = false;
- _sync_position = _start;
- }
- }
-
assert (_type == other->data_type());
}
@@ -320,7 +326,7 @@ Region::Region (boost::shared_ptr<const Region> other)
the start within \a other is given by \a offset
(i.e. relative to the start of \a other's sources, the start is \a offset + \a other.start()
*/
-Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset)
+Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset, const int32_t sub_num)
: SessionObject(other->session(), other->name())
, _type (other->data_type())
, REGION_COPY_STATE (other)
@@ -334,14 +340,16 @@ Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset)
/* override state that may have been incorrectly inherited from the other region
*/
- _position = 0;
+ _position = other->_position + offset;
_locked = false;
_whole_file = false;
_hidden = false;
use_sources (other->_sources);
+ set_master_sources (other->_master_sources);
_start = other->_start + offset;
+ _beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num);
/* if the other region had a distinct sync point
set, then continue to use it as best we can.
@@ -360,17 +368,6 @@ Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset)
_sync_position = _start;
}
- if (Profile->get_sae()) {
- /* reset sync point to start if its ended up
- outside region bounds.
- */
-
- if (_sync_position < _start || _sync_position >= _start + _length) {
- _sync_marked = false;
- _sync_position = _start;
- }
- }
-
assert (_type == other->data_type());
}
@@ -427,7 +424,7 @@ Region::set_name (const std::string& str)
}
void
-Region::set_length (framecnt_t len)
+Region::set_length (framecnt_t len, const int32_t sub_num)
{
//cerr << "Region::set_length() len = " << len << endl;
if (locked()) {
@@ -449,12 +446,11 @@ Region::set_length (framecnt_t len)
}
- _last_length = _length;
- set_length_internal (len);
+ set_length_internal (len, sub_num);
_whole_file = false;
first_edit ();
maybe_uncopy ();
- invalidate_transients ();
+ maybe_invalidate_transients ();
if (!property_changes_suspended()) {
recompute_at_end ();
@@ -465,8 +461,9 @@ Region::set_length (framecnt_t len)
}
void
-Region::set_length_internal (framecnt_t len)
+Region::set_length_internal (framecnt_t len, const int32_t sub_num)
{
+ _last_length = _length;
_length = len;
}
@@ -549,7 +546,7 @@ Region::set_position_lock_style (PositionLockStyle ps)
_position_lock_style = ps;
if (_position_lock_style == MusicTime) {
- _session.bbt_time (_position, _bbt_time);
+ _beat = _session.tempo_map().beat_at_frame (_position);
}
send_change (Properties::position_lock_style);
@@ -557,7 +554,7 @@ Region::set_position_lock_style (PositionLockStyle ps)
}
void
-Region::update_after_tempo_map_change ()
+Region::update_after_tempo_map_change (bool send)
{
boost::shared_ptr<Playlist> pl (playlist());
@@ -565,29 +562,50 @@ Region::update_after_tempo_map_change ()
return;
}
- TempoMap& map (_session.tempo_map());
- framepos_t pos = map.frame_time (_bbt_time);
- set_position_internal (pos, false);
+ const framepos_t pos = _session.tempo_map().frame_at_beat (_beat);
+ /* we have _beat. update frame position non-musically */
+ set_position_internal (pos, false, 0);
/* do this even if the position is the same. this helps out
a GUI that has moved its representation already.
*/
- send_change (Properties::position);
+
+ if (send) {
+ send_change (Properties::position);
+ }
}
void
-Region::set_position (framepos_t pos)
+Region::set_position (framepos_t pos, int32_t sub_num)
{
if (!can_move()) {
return;
}
- set_position_internal (pos, true);
+ if (sub_num == 0) {
+ set_position_internal (pos, true, 0);
+ } else {
+ double beat = _session.tempo_map().exact_beat_at_frame (pos, sub_num);
+ _beat = beat;
+ set_position_internal (pos, false, sub_num);
+ }
/* do this even if the position is the same. this helps out
a GUI that has moved its representation already.
*/
- send_change (Properties::position);
+ PropertyChange p_and_l;
+
+ p_and_l.add (Properties::position);
+ /* Currently length change due to position change is only implemented
+ for MidiRegion (Region has no length in beats).
+ Notify a length change regardless (its more efficient for MidiRegions),
+ and when Region has a _length_beats we will need it here anyway).
+ */
+ if (position_lock_style() == MusicTime) {
+ p_and_l.add (Properties::length);
+ }
+
+ send_change (p_and_l);
}
@@ -617,7 +635,7 @@ Region::set_initial_position (framepos_t pos)
_length = max_framepos - _position;
}
- recompute_position_from_lock_style ();
+ recompute_position_from_lock_style (0);
/* ensure that this move doesn't cause a range move */
_last_position = _position;
}
@@ -630,7 +648,7 @@ Region::set_initial_position (framepos_t pos)
}
void
-Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
+Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num)
{
/* We emit a change of Properties::position even if the position hasn't changed
(see Region::set_position), so we must always set this up so that
@@ -641,31 +659,25 @@ Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
if (_position != pos) {
_position = pos;
+ if (allow_bbt_recompute) {
+ recompute_position_from_lock_style (sub_num);
+ }
/* check that the new _position wouldn't make the current
length impossible - if so, change the length.
XXX is this the right thing to do?
*/
-
if (max_framepos - _length < _position) {
_last_length = _length;
_length = max_framepos - _position;
}
-
- if (allow_bbt_recompute) {
- recompute_position_from_lock_style ();
- }
-
- //invalidate_transients ();
}
}
void
-Region::recompute_position_from_lock_style ()
+Region::recompute_position_from_lock_style (const int32_t sub_num)
{
- if (_position_lock_style == MusicTime) {
- _session.bbt_time (_position, _bbt_time);
- }
+ _beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num);
}
void
@@ -694,8 +706,8 @@ Region::nudge_position (frameoffset_t n)
new_position += n;
}
}
-
- set_position_internal (new_position, true);
+ /* assumes non-musical nudge */
+ set_position_internal (new_position, true, 0);
send_change (Properties::position);
}
@@ -729,14 +741,14 @@ Region::set_start (framepos_t pos)
set_start_internal (pos);
_whole_file = false;
first_edit ();
- invalidate_transients ();
+ maybe_invalidate_transients ();
send_change (Properties::start);
}
}
void
-Region::move_start (frameoffset_t distance)
+Region::move_start (frameoffset_t distance, const int32_t sub_num)
{
if (locked() || position_locked() || video_locked()) {
return;
@@ -772,7 +784,7 @@ Region::move_start (frameoffset_t distance)
return;
}
- set_start_internal (new_start);
+ set_start_internal (new_start, sub_num);
_whole_file = false;
first_edit ();
@@ -781,25 +793,25 @@ Region::move_start (frameoffset_t distance)
}
void
-Region::trim_front (framepos_t new_position)
+Region::trim_front (framepos_t new_position, const int32_t sub_num)
{
- modify_front (new_position, false);
+ modify_front (new_position, false, sub_num);
}
void
-Region::cut_front (framepos_t new_position)
+Region::cut_front (framepos_t new_position, const int32_t sub_num)
{
- modify_front (new_position, true);
+ modify_front (new_position, true, sub_num);
}
void
-Region::cut_end (framepos_t new_endpoint)
+Region::cut_end (framepos_t new_endpoint, const int32_t sub_num)
{
- modify_end (new_endpoint, true);
+ modify_end (new_endpoint, true, sub_num);
}
void
-Region::modify_front (framepos_t new_position, bool reset_fade)
+Region::modify_front (framepos_t new_position, bool reset_fade, const int32_t sub_num)
{
if (locked()) {
return;
@@ -817,7 +829,6 @@ Region::modify_front (framepos_t new_position, bool reset_fade)
if (new_position < end) { /* can't trim it zero or negative length */
framecnt_t newlen = 0;
- framepos_t delta = 0;
if (!can_trim_start_before_source_start ()) {
/* can't trim it back past where source position zero is located */
@@ -826,13 +837,11 @@ Region::modify_front (framepos_t new_position, bool reset_fade)
if (new_position > _position) {
newlen = _length - (new_position - _position);
- delta = -1 * (new_position - _position);
} else {
newlen = _length + (_position - new_position);
- delta = _position - new_position;
}
- trim_to_internal (new_position, newlen);
+ trim_to_internal (new_position, newlen, sub_num);
if (reset_fade) {
_right_of_split = true;
@@ -842,21 +851,19 @@ Region::modify_front (framepos_t new_position, bool reset_fade)
recompute_at_start ();
}
- if (_transients.size() > 0){
- adjust_transients(delta);
- }
+ maybe_invalidate_transients ();
}
}
void
-Region::modify_end (framepos_t new_endpoint, bool reset_fade)
+Region::modify_end (framepos_t new_endpoint, bool reset_fade, const int32_t sub_num)
{
if (locked()) {
return;
}
if (new_endpoint > _position) {
- trim_to_internal (_position, new_endpoint - _position);
+ trim_to_internal (_position, new_endpoint - _position, sub_num);
if (reset_fade) {
_left_of_split = true;
}
@@ -871,19 +878,19 @@ Region::modify_end (framepos_t new_endpoint, bool reset_fade)
*/
void
-Region::trim_end (framepos_t new_endpoint)
+Region::trim_end (framepos_t new_endpoint, const int32_t sub_num)
{
- modify_end (new_endpoint, false);
+ modify_end (new_endpoint, false, sub_num);
}
void
-Region::trim_to (framepos_t position, framecnt_t length)
+Region::trim_to (framepos_t position, framecnt_t length, const int32_t sub_num)
{
if (locked()) {
return;
}
- trim_to_internal (position, length);
+ trim_to_internal (position, length, sub_num);
if (!property_changes_suspended()) {
recompute_at_start ();
@@ -892,7 +899,7 @@ Region::trim_to (framepos_t position, framecnt_t length)
}
void
-Region::trim_to_internal (framepos_t position, framecnt_t length)
+Region::trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num)
{
framepos_t new_start;
@@ -929,10 +936,11 @@ Region::trim_to_internal (framepos_t position, framecnt_t length)
PropertyChange what_changed;
if (_start != new_start) {
- set_start_internal (new_start);
+ set_start_internal (new_start, sub_num);
what_changed.add (Properties::start);
}
+
/* Set position before length, otherwise for MIDI regions this bad thing happens:
* 1. we call set_length_internal; length in beats is computed using the region's current
* (soon-to-be old) position
@@ -945,7 +953,7 @@ Region::trim_to_internal (framepos_t position, framecnt_t length)
if (!property_changes_suspended()) {
_last_position = _position;
}
- set_position_internal (position, true);
+ set_position_internal (position, true, sub_num);
what_changed.add (Properties::position);
}
@@ -953,7 +961,7 @@ Region::trim_to_internal (framepos_t position, framecnt_t length)
if (!property_changes_suspended()) {
_last_length = _length;
}
- set_length_internal (length);
+ set_length_internal (length, sub_num);
what_changed.add (Properties::length);
}
@@ -1176,7 +1184,7 @@ Region::state ()
XMLNode *node = new XMLNode ("Region");
char buf[64];
char buf2[64];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
const char* fe = NULL;
/* custom version of 'add_properties (*node);'
@@ -1215,12 +1223,6 @@ Region::state ()
/* note: flags are stored by derived classes */
- if (_position_lock_style != AudioTime) {
- stringstream str;
- str << _bbt_time;
- node->add_property ("bbt-position", str.str());
- }
-
for (uint32_t n=0; n < _sources.size(); ++n) {
snprintf (buf2, sizeof(buf2), "source-%d", n);
_sources[n]->id().print (buf, sizeof(buf));
@@ -1278,7 +1280,8 @@ Region::set_state (const XMLNode& node, int version)
int
Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_changed, bool send)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
+ Timecode::BBT_Time bbt_time;
Stateful::save_extra_xml (node);
@@ -1287,15 +1290,14 @@ Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_c
set_id (node);
if (_position_lock_style == MusicTime) {
- if ((prop = node.property ("bbt-position")) == 0) {
- /* missing BBT info, revert to audio time locking */
- _position_lock_style = AudioTime;
- } else {
+ if ((prop = node.property ("bbt-position")) != 0) {
if (sscanf (prop->value().c_str(), "%d|%d|%d",
- &_bbt_time.bars,
- &_bbt_time.beats,
- &_bbt_time.ticks) != 3) {
+ &bbt_time.bars,
+ &bbt_time.beats,
+ &bbt_time.ticks) != 3) {
_position_lock_style = AudioTime;
+ } else {
+ _beat = _session.tempo_map().beat_at_bbt (bbt_time);
}
}
}
@@ -1323,7 +1325,7 @@ Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_c
}
// saved property is invalid, region-transients are not saved
- if (_transients.size() == 0){
+ if (_user_transients.size() == 0){
_valid_transients = false;
}
@@ -1515,19 +1517,59 @@ Region::source_string () const
return res.str();
}
+void
+Region::deep_sources (std::set<boost::shared_ptr<Source> > & sources) const
+{
+ for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+
+ boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+
+ if (ps) {
+ if (sources.find (ps) == sources.end()) {
+ /* (Playlist)Source not currently in
+ accumulating set, so recurse.
+ */
+ ps->playlist()->deep_sources (sources);
+ }
+ }
+
+ /* add this source */
+ sources.insert (*i);
+ }
+
+ for (SourceList::const_iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) {
+
+ boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+
+ if (ps) {
+ if (sources.find (ps) == sources.end()) {
+ /* (Playlist)Source not currently in
+ accumulating set, so recurse.
+ */
+ ps->playlist()->deep_sources (sources);
+ }
+ }
+
+ /* add this source */
+ sources.insert (*i);
+ }
+}
+
bool
-Region::uses_source (boost::shared_ptr<const Source> source) const
+Region::uses_source (boost::shared_ptr<const Source> source, bool shallow) const
{
for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
if (*i == source) {
return true;
}
- boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+ if (!shallow) {
+ boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
- if (ps) {
- if (ps->playlist()->uses_source (source)) {
- return true;
+ if (ps) {
+ if (ps->playlist()->uses_source (source)) {
+ return true;
+ }
}
}
}
@@ -1537,11 +1579,13 @@ Region::uses_source (boost::shared_ptr<const Source> source) const
return true;
}
- boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+ if (!shallow) {
+ boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
- if (ps) {
- if (ps->playlist()->uses_source (source)) {
- return true;
+ if (ps) {
+ if (ps->playlist()->uses_source (source)) {
+ return true;
+ }
}
}
}
@@ -1549,6 +1593,7 @@ Region::uses_source (boost::shared_ptr<const Source> source) const
return false;
}
+
framecnt_t
Region::source_length(uint32_t n) const
{
@@ -1647,12 +1692,60 @@ Region::apply (Filter& filter, Progress* progress)
void
-Region::invalidate_transients ()
+Region::maybe_invalidate_transients ()
{
- _valid_transients = false;
- _transients.clear ();
+ bool changed = !_onsets.empty();
+ _onsets.clear ();
- send_change (PropertyChange (Properties::valid_transients));
+ if (_valid_transients || changed) {
+ send_change (PropertyChange (Properties::valid_transients));
+ return;
+ }
+}
+
+void
+Region::transients (AnalysisFeatureList& afl)
+{
+ int cnt = afl.empty() ? 0 : 1;
+
+ Region::merge_features (afl, _onsets, _position);
+ Region::merge_features (afl, _user_transients, _position + _transient_user_start - _start);
+ if (!_onsets.empty ()) {
+ ++cnt;
+ }
+ if (!_user_transients.empty ()) {
+ ++cnt;
+ }
+ if (cnt > 1 ) {
+ afl.sort ();
+ // remove exact duplicates
+ TransientDetector::cleanup_transients (afl, _session.frame_rate(), 0);
+ }
+}
+
+bool
+Region::has_transients () const
+{
+ if (!_user_transients.empty ()) {
+ assert (_valid_transients);
+ return true;
+ }
+ if (!_onsets.empty ()) {
+ return true;
+ }
+ return false;
+}
+
+void
+Region::merge_features (AnalysisFeatureList& result, const AnalysisFeatureList& src, const frameoffset_t off) const
+{
+ for (AnalysisFeatureList::const_iterator x = src.begin(); x != src.end(); ++x) {
+ const frameoffset_t p = (*x) + off;
+ if (p < first_frame() || p > last_frame()) {
+ continue;
+ }
+ result.push_back (p);
+ }
}
void
@@ -1742,12 +1835,12 @@ void
Region::post_set (const PropertyChange& pc)
{
if (pc.contains (Properties::position)) {
- recompute_position_from_lock_style ();
+ recompute_position_from_lock_style (0);
}
}
void
-Region::set_start_internal (framecnt_t s)
+Region::set_start_internal (framecnt_t s, const int32_t sub_num)
{
_start = s;
}
@@ -1780,4 +1873,3 @@ Region::latest_possible_frame () const
return _position + (minlen - _start) - 1;
}
-
diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc
index 33c714c..16a9e02 100644
--- a/libs/ardour/region_factory.cc
+++ b/libs/ardour/region_factory.cc
@@ -30,7 +30,7 @@
#include "ardour/region_factory.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -46,7 +46,7 @@ std::map<std::string, PBD::ID> RegionFactory::region_name_map;
RegionFactory::CompoundAssociations RegionFactory::_compound_associations;
boost::shared_ptr<Region>
-RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
+RegionFactory::create (boost::shared_ptr<const Region> region, bool announce, const int32_t sub_num)
{
boost::shared_ptr<Region> ret;
boost::shared_ptr<const AudioRegion> ar;
@@ -54,7 +54,7 @@ RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
if ((ar = boost::dynamic_pointer_cast<const AudioRegion>(region)) != 0) {
- ret = boost::shared_ptr<Region> (new AudioRegion (ar, 0));
+ ret = boost::shared_ptr<Region> (new AudioRegion (ar, 0, sub_num));
} else if ((mr = boost::dynamic_pointer_cast<const MidiRegion>(region)) != 0) {
@@ -71,7 +71,7 @@ RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
source->set_ancestor_name(mr->sources().front()->name());
ret = mr->clone(source);
} else {
- ret = boost::shared_ptr<Region> (new MidiRegion (mr, 0));
+ ret = boost::shared_ptr<Region> (new MidiRegion (mr, 0, sub_num));
}
} else {
@@ -82,12 +82,13 @@ RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
if (ret) {
ret->set_name (new_region_name(ret->name()));
- ret->set_position (region->position());
- if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+ if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
ret->set_position_lock_style (MusicTime);
}
+ ret->set_position (region->position(), sub_num);
+
/* pure copy constructor - no property list */
if (announce) {
map_add (ret);
@@ -126,7 +127,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const PropertyList& pli
if (ret) {
ret->apply_changes (plist);
- if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+ if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
ret->set_position_lock_style (MusicTime);
}
@@ -143,7 +144,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const PropertyList& pli
}
boost::shared_ptr<Region>
-RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, const PropertyList& plist, bool announce)
+RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, const PropertyList& plist, bool announce, const int32_t sub_num)
{
boost::shared_ptr<Region> ret;
boost::shared_ptr<const AudioRegion> other_a;
@@ -151,11 +152,11 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, c
if ((other_a = boost::dynamic_pointer_cast<AudioRegion>(region)) != 0) {
- ret = boost::shared_ptr<Region> (new AudioRegion (other_a, offset));
+ ret = boost::shared_ptr<Region> (new AudioRegion (other_a, offset, sub_num));
} else if ((other_m = boost::dynamic_pointer_cast<MidiRegion>(region)) != 0) {
- ret = boost::shared_ptr<Region> (new MidiRegion (other_m, offset));
+ ret = boost::shared_ptr<Region> (new MidiRegion (other_m, offset, sub_num));
} else {
fatal << _("programming error: RegionFactory::create() called with unknown Region type")
@@ -167,7 +168,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, c
if (ret) {
ret->apply_changes (plist);
- if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+ if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
ret->set_position_lock_style (MusicTime);
}
@@ -208,7 +209,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs,
if (ret) {
ret->apply_changes (plist);
- if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+ if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
ret->set_position_lock_style (MusicTime);
}
@@ -252,7 +253,7 @@ RegionFactory::create (const SourceList& srcs, const PropertyList& plist, bool a
if (ret) {
ret->apply_changes (plist);
- if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+ if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
ret->set_position_lock_style (MusicTime);
}
@@ -635,7 +636,7 @@ RegionFactory::get_regions_using_source (boost::shared_ptr<Source> s, std::set<b
{
Glib::Threads::Mutex::Lock lm (region_map_lock);
- for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
+ for (RegionMap::const_iterator i = region_map.begin(); i != region_map.end(); ++i) {
if (i->second->uses_source (s)) {
r.insert (i->second);
}
diff --git a/libs/ardour/resampled_source.cc b/libs/ardour/resampled_source.cc
index 5c81170..24eb12a 100644
--- a/libs/ardour/resampled_source.cc
+++ b/libs/ardour/resampled_source.cc
@@ -21,7 +21,7 @@
#include "ardour/resampled_source.h"
#include "pbd/failed_constructor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -73,14 +73,15 @@ framecnt_t
ResampledImportableSource::read (Sample* output, framecnt_t nframes)
{
int err;
+ size_t bs = floor ((float)(blocksize / source->channels())) * source->channels();
/* If the input buffer is empty, refill it. */
if (_src_data.input_frames == 0) {
- _src_data.input_frames = source->read (_input, blocksize);
+ _src_data.input_frames = source->read (_input, bs);
/* The last read will not be a full buffer, so set end_of_input. */
- if ((framecnt_t) _src_data.input_frames < blocksize) {
+ if ((size_t) _src_data.input_frames < bs) {
_end_of_input = true;
}
diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc
index db81568..5c92b90 100644
--- a/libs/ardour/return.cc
+++ b/libs/ardour/return.cc
@@ -30,7 +30,7 @@
#include "ardour/return.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -86,7 +86,7 @@ Return::set_state (const XMLNode& node, int version)
{
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
- const XMLProperty* prop;
+ XMLProperty const * prop;
const XMLNode* insert_node = &node;
/* Return has regular IO automation (gain, pan) */
@@ -115,7 +115,7 @@ Return::set_state (const XMLNode& node, int version)
}
void
-Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
{
if ((!_active && !_pending_active) || _input->n_ports() == ChanCount::ZERO) {
return;
@@ -127,13 +127,13 @@ Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pfra
// Can't automate gain for sends or returns yet because we need different buffers
// so that we don't overwrite the main automation data for the route amp
// _amp->setup_gain_automation (start_frame, end_frame, nframes);
- _amp->run (bufs, start_frame, end_frame, nframes, true);
+ _amp->run (bufs, start_frame, end_frame, speed, nframes, true);
if (_metering) {
if (_amp->gain_control()->get_value() == 0) {
_meter->reset();
} else {
- _meter->run (bufs, start_frame, end_frame, nframes, true);
+ _meter->run (bufs, start_frame, end_frame, speed, nframes, true);
}
}
diff --git a/libs/ardour/revision.cc b/libs/ardour/revision.cc
new file mode 100644
index 0000000..bb79402
--- /dev/null
+++ b/libs/ardour/revision.cc
@@ -0,0 +1,2 @@
+#include "ardour/revision.h"
+namespace ARDOUR { const char* revision = "5.0"; }
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 5eb962d..11db732 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -33,7 +33,6 @@
#include "pbd/memento_command.h"
#include "pbd/stacktrace.h"
#include "pbd/convert.h"
-#include "pbd/boost_debug.h"
#include "pbd/unwind.h"
#include "ardour/amp.h"
@@ -41,6 +40,7 @@
#include "ardour/audio_track.h"
#include "ardour/audio_port.h"
#include "ardour/audioengine.h"
+#include "ardour/boost_debug.h"
#include "ardour/buffer.h"
#include "ardour/buffer_set.h"
#include "ardour/capturing_processor.h"
@@ -58,6 +58,7 @@
#include "ardour/panner.h"
#include "ardour/panner_shell.h"
#include "ardour/parameter_descriptor.h"
+#include "ardour/phase_control.h"
#include "ardour/plugin_insert.h"
#include "ardour/port.h"
#include "ardour/port_insert.h"
@@ -67,22 +68,26 @@
#include "ardour/route_group.h"
#include "ardour/send.h"
#include "ardour/session.h"
+#include "ardour/solo_control.h"
+#include "ardour/solo_isolate_control.h"
#include "ardour/unknown_processor.h"
#include "ardour/utils.h"
+#include "ardour/vca.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
using namespace PBD;
-PBD::Signal0<void> Route::SyncOrderKeys;
-PBD::Signal0<void> Route::RemoteControlIDChange;
+PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, Route::PluginSetupOptions > Route::PluginSetup;
-Route::Route (Session& sess, string name, Flag flg, DataType default_type)
- : SessionObject (sess, name)
- , Automatable (sess)
+/** Base class for all routable/mixable objects (tracks and busses) */
+Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType default_type)
+ : Stripable (sess, name, PresentationInfo (flag))
, GraphNode (sess._process_graph)
+ , Muteable (sess, name)
+ , Automatable (sess)
, _active (true)
, _signal_latency (0)
, _signal_latency_at_amp_position (0)
@@ -91,31 +96,23 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, _roll_delay (0)
, _pending_process_reorder (0)
, _pending_signals (0)
- , _flags (flg)
, _pending_declick (true)
, _meter_point (MeterPostFader)
, _pending_meter_point (MeterPostFader)
, _meter_type (MeterPeak)
- , _self_solo (false)
- , _soloed_by_others_upstream (0)
- , _soloed_by_others_downstream (0)
- , _solo_isolated (false)
- , _solo_isolated_by_upstream (0)
, _denormal_protection (false)
, _recordable (true)
, _silent (false)
, _declickable (false)
- , _mute_master (new MuteMaster (sess, name))
, _have_internal_generator (false)
- , _solo_safe (false)
, _default_type (default_type)
- , _order_key (0)
- , _has_order_key (false)
- , _remote_control_id (0)
, _track_number (0)
, _in_configure_processors (false)
, _initial_io_setup (false)
+ , _in_sidechain_setup (false)
+ , _strict_io (false)
, _custom_meter_position_noted (false)
+ , _pinmgr_proxy (0)
{
processor_max_streams.reset();
}
@@ -135,24 +132,31 @@ Route::init ()
/* add standard controls */
- _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
- _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
- _phase_control.reset (new PhaseControllable (X_("phase"), shared_from_this ()));
-
- _solo_isolate_control.reset (new SoloIsolateControllable (X_("solo-iso"), shared_from_this ()));
- _solo_safe_control.reset (new SoloSafeControllable (X_("solo-safe"), shared_from_this ()));
+ _gain_control.reset (new GainControl (_session, GainAutomation));
+ add_control (_gain_control);
- _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
- _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
- _phase_control->set_flags (Controllable::Flag (_phase_control->flags() | Controllable::Toggle));
+ _trim_control.reset (new GainControl (_session, TrimAutomation));
+ add_control (_trim_control);
+ _solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
add_control (_solo_control);
+ _solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
+
+ _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
add_control (_mute_control);
+
+ _phase_control.reset (new PhaseControl (_session, X_("phase")));
add_control (_phase_control);
+ _solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
+ add_control (_solo_isolate_control);
+
+ _solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
+ add_control (_solo_safe_control);
+
/* panning */
- if (!(_flags & Route::MonitorOut)) {
+ if (!(_presentation_info.flags() & PresentationInfo::MonitorOut)) {
_pannable.reset (new Pannable (_session));
}
@@ -167,17 +171,9 @@ Route::init ()
_output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
_output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
-#if 0 // not used - just yet
- if (!is_master() && !is_monitor() && !is_auditioner()) {
- _delayline.reset (new DelayLine (_session, _name));
- add_processor (_delayline, PreFader);
- }
-#endif
-
- /* add amp processor */
-
- _gain_control = boost::shared_ptr<GainControllable> (new GainControllable (_session, GainAutomation, shared_from_this ()));
- add_control (_gain_control);
+ /* add the amp/fader processor.
+ * it should be the first processor to be added on every route.
+ */
_amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
add_processor (_amp, PostFader);
@@ -186,10 +182,14 @@ Route::init ()
_amp->set_display_name (_("Monitor"));
}
- /* and input trim */
+#if 0 // not used - just yet
+ if (!is_master() && !is_monitor() && !is_auditioner()) {
+ _delayline.reset (new DelayLine (_session, _name));
+ add_processor (_delayline, PreFader);
+ }
+#endif
- _trim_control = boost::shared_ptr<GainControllable> (new GainControllable (_session, TrimAutomation, shared_from_this ()));
- add_control (_trim_control);
+ /* and input trim */
_trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
_trim->set_display_to_user (false);
@@ -229,10 +229,6 @@ Route::init ()
_monitor_control->activate ();
}
- if (is_master() || is_monitor() || is_auditioner()) {
- _mute_master->set_solo_ignore (true);
- }
-
/* now that we have _meter, its safe to connect to this */
{
@@ -264,120 +260,6 @@ Route::~Route ()
_processors.clear ();
}
-void
-Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
-{
- if (Config->get_remote_model() != UserOrdered) {
- return;
- }
-
- set_remote_control_id_internal (id, notify_class_listeners);
-}
-
-void
-Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
-{
- /* force IDs for master/monitor busses and prevent
- any other route from accidentally getting these IDs
- (i.e. legacy sessions)
- */
-
- if (is_master() && id != MasterBusRemoteControlID) {
- id = MasterBusRemoteControlID;
- }
-
- if (is_monitor() && id != MonitorBusRemoteControlID) {
- id = MonitorBusRemoteControlID;
- }
-
- if (id < 1) {
- return;
- }
-
- /* don't allow it to collide */
-
- if (!is_master () && !is_monitor() &&
- (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
- id += MonitorBusRemoteControlID;
- }
-
- if (id != remote_control_id()) {
- _remote_control_id = id;
- RemoteControlIDChanged ();
-
- if (notify_class_listeners) {
- RemoteControlIDChange ();
- }
- }
-}
-
-uint32_t
-Route::remote_control_id() const
-{
- if (is_master()) {
- return MasterBusRemoteControlID;
- }
-
- if (is_monitor()) {
- return MonitorBusRemoteControlID;
- }
-
- return _remote_control_id;
-}
-
-bool
-Route::has_order_key () const
-{
- return _has_order_key;
-}
-
-uint32_t
-Route::order_key () const
-{
- return _order_key;
-}
-
-void
-Route::set_remote_control_id_explicit (uint32_t rid)
-{
- if (is_master() || is_monitor() || is_auditioner()) {
- /* hard-coded remote IDs, or no remote ID */
- return;
- }
-
- if (_remote_control_id != rid) {
- DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
- _remote_control_id = rid;
- RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
- }
-
- /* don't emit the class-level RID signal RemoteControlIDChange here,
- leave that to the entity that changed the order key, so that we
- don't get lots of emissions for no good reasons (e.g. when changing
- all route order keys).
-
- See Session::sync_remote_id_from_order_keys() for the (primary|only)
- spot where that is emitted.
- */
-}
-
-void
-Route::set_order_key (uint32_t n)
-{
- _has_order_key = true;
-
- if (_order_key == n) {
- return;
- }
-
- _order_key = n;
-
- DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
- name(), order_key ()));
-
- _session.set_dirty ();
-}
-
string
Route::ensure_track_or_route_name(string name, Session &session)
{
@@ -391,82 +273,10 @@ Route::ensure_track_or_route_name(string name, Session &session)
}
void
-Route::inc_gain (gain_t factor)
-{
- /* To be used ONLY when doing group-relative gain adjustment, from
- * ::set_gain()
- */
-
- float desired_gain = _gain_control->user_double();
-
- if (fabsf (desired_gain) < GAIN_COEFF_SMALL) {
- // really?! what's the idea here?
- _gain_control->route_set_value (0.000001f + (0.000001f * factor));
- } else {
- _gain_control->route_set_value (desired_gain + (desired_gain * factor));
- }
-}
-
-void
-Route::set_gain (gain_t val, Controllable::GroupControlDisposition group_override)
-{
- if (use_group (group_override, &RouteGroup::is_gain)) {
-
- if (_route_group->is_relative()) {
-
- gain_t usable_gain = _gain_control->get_value();
- if (usable_gain < 0.000001f) {
- usable_gain = 0.000001f;
- }
-
- gain_t delta = val;
- if (delta < 0.000001f) {
- delta = 0.000001f;
- }
-
- delta -= usable_gain;
-
- if (delta == 0.0f)
- return;
-
- gain_t factor = delta / usable_gain;
-
- if (factor > 0.0f) {
- factor = _route_group->get_max_factor(factor);
- if (factor == 0.0f) {
- _amp->gain_control()->Changed(); /* EMIT SIGNAL */
- return;
- }
- } else {
- factor = _route_group->get_min_factor(factor);
- if (factor == 0.0f) {
- _amp->gain_control()->Changed(); /* EMIT SIGNAL */
- return;
- }
- }
-
- _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor));
-
- } else {
-
- _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, Controllable::NoGroup));
- }
-
- return;
- }
-
- if (val == _gain_control->get_value()) {
- return;
- }
-
- _gain_control->route_set_value (val);
-}
-
-void
Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
{
// TODO route group, see set_gain()
- _trim_control->route_set_value (val);
+ // _trim_control->route_set_value (val);
}
void
@@ -503,6 +313,8 @@ Route::process_output_buffers (BufferSet& bufs,
return;
}
+ _mute_control->automation_run (start_frame, nframes);
+
/* figure out if we're going to use gain automation */
if (gain_automation_ok) {
_amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
@@ -543,7 +355,7 @@ Route::process_output_buffers (BufferSet& bufs,
DENORMAL CONTROL/PHASE INVERT
----------------------------------------------------------------------------------------- */
- if (_phase_invert.any ()) {
+ if (!_phase_control->none()) {
int chn = 0;
@@ -552,7 +364,7 @@ Route::process_output_buffers (BufferSet& bufs,
for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
Sample* const sp = i->data();
- if (_phase_invert[chn]) {
+ if (_phase_control->inverted (chn)) {
for (pframes_t nx = 0; nx < nframes; ++nx) {
sp[nx] = -sp[nx];
sp[nx] += 1.0e-27f;
@@ -569,7 +381,7 @@ Route::process_output_buffers (BufferSet& bufs,
for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
Sample* const sp = i->data();
- if (_phase_invert[chn]) {
+ if (_phase_control->inverted (chn)) {
for (pframes_t nx = 0; nx < nframes; ++nx) {
sp[nx] = -sp[nx];
}
@@ -599,6 +411,7 @@ Route::process_output_buffers (BufferSet& bufs,
bool const meter_already_run = metering_state() == MeteringInput;
framecnt_t latency = 0;
+ const double speed = _session.transport_speed ();
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
@@ -628,8 +441,13 @@ Route::process_output_buffers (BufferSet& bufs,
if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
}
+ if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
+ const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
+ boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
+ _initial_delay + latency, longest_session_latency - latency);
+ }
- (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
+ (*i)->run (bufs, start_frame - latency, end_frame - latency, speed, nframes, *i != _processors.back());
bufs.set_count ((*i)->output_streams());
if ((*i)->active ()) {
@@ -657,13 +475,14 @@ Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
_trim->setup_gain_automation (start, start + nframes, nframes);
latency = 0;
+ const double speed = _session.transport_speed ();
for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
if (!include_endpoint && (*i) == endpoint) {
break;
}
- /* if we're not exporting, stop processing if we come across a routing processor. */
+ /* if we're *not* exporting, stop processing if we come across a routing processor. */
if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
break;
}
@@ -671,11 +490,23 @@ Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
break;
}
- /* don't run any processors that does routing.
- * oh, and don't bother with the peak meter either.
+ /* special case the panner (export outputs)
+ * Ideally we'd only run the panner, not the delivery itself...
+ * but panners need separate input/output buffers and some context
+ * (panshell, panner type, etc). AFAICT there is no ill side effect
+ * of re-using the main delivery when freewheeling/exporting a region.
+ */
+ if ((*i) == _main_outs) {
+ assert ((*i)->does_routing());
+ (*i)->run (buffers, start - latency, start - latency + nframes, speed, nframes, true);
+ buffers.set_count ((*i)->output_streams());
+ }
+
+ /* don't run any processors that do routing.
+ * Also don't bother with metering.
*/
if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
- (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
+ (*i)->run (buffers, start - latency, start - latency + nframes, 1.0, nframes, true);
buffers.set_count ((*i)->output_streams());
latency += (*i)->signal_latency ();
}
@@ -788,291 +619,38 @@ Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t
}
void
-Route::set_listen (bool yn, Controllable::GroupControlDisposition group_override)
-{
- if (_solo_safe) {
- return;
- }
-
- if (use_group (group_override, &RouteGroup::is_solo)) {
- _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, Controllable::NoGroup));
- return;
- }
-
- if (_monitor_send) {
- if (yn != _monitor_send->active()) {
- if (yn) {
- _monitor_send->activate ();
- _mute_master->set_soloed_by_self (true);
- } else {
- _monitor_send->deactivate ();
- _mute_master->set_soloed_by_self (false);
- }
- _mute_master->set_soloed_by_others (false);
-
- listen_changed (group_override); /* EMIT SIGNAL */
- }
- }
-}
-
-bool
-Route::listening_via_monitor () const
+Route::set_listen (bool yn)
{
if (_monitor_send) {
- return _monitor_send->active ();
- } else {
- return false;
- }
-}
-
-void
-Route::set_solo_safe (bool yn, Controllable::GroupControlDisposition /* group_override */)
-{
- if (_solo_safe != yn) {
- _solo_safe = yn;
- solo_safe_changed (); /* EMIT SIGNAL */
- _solo_safe_control->Changed(); /* EMIT SIGNAL */
- }
-}
-
-bool
-Route::solo_safe() const
-{
- return _solo_safe;
-}
-
-void
-Route::clear_all_solo_state ()
-{
- // ideally this function will never do anything, it only exists to forestall Murphy
- bool emit_changed = false;
-
-#ifndef NDEBUG
- // these are really debug messages, but of possible interest.
- if (_self_solo) {
- PBD::info << string_compose (_("Cleared Explicit solo: %1\n"), name());
- }
- if (_soloed_by_others_upstream || _soloed_by_others_downstream) {
- PBD::info << string_compose (_("Cleared Implicit solo: %1 up:%2 down:%3\n"),
- name(), _soloed_by_others_upstream, _soloed_by_others_downstream);
- }
-#endif
-
- if (!_self_solo && (_soloed_by_others_upstream || _soloed_by_others_downstream)) {
- // if self-soled, set_solo() will do signal emission
- emit_changed = true;
- }
-
- _soloed_by_others_upstream = 0;
- _soloed_by_others_downstream = 0;
-
- {
- PBD::Unwinder<bool> uw (_solo_safe, false);
- set_solo (false, Controllable::NoGroup);
- }
-
- if (emit_changed) {
- set_mute_master_solo ();
- solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
- }
-}
-
-void
-Route::set_solo (bool yn, Controllable::GroupControlDisposition group_override)
-{
- if (_solo_safe) {
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
- return;
- }
-
- if (is_master() || is_monitor() || is_auditioner()) {
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
- return;
- }
-
- if (use_group (group_override, &RouteGroup::is_solo)) {
- _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, Controllable::NoGroup));
- return;
- }
-
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, grp ? %3 currently self-soloed ? %4\n",
- name(), yn, enum_2_string(group_override), self_soloed()));
-
- if (self_soloed() != yn) {
- set_self_solo (yn);
- solo_changed (true, group_override); /* EMIT SIGNAL */
- _solo_control->Changed (); /* EMIT SIGNAL */
- }
-
- assert (Config->get_solo_control_is_listen_control() || !_monitor_send || !_monitor_send->active());
-
- /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
- Config->get_solo_mute_overrride().
- */
-
- if (yn && Profile->get_trx()) {
- set_mute (false, Controllable::UseGroup);
- }
-}
-
-void
-Route::set_self_solo (bool yn)
-{
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
- _self_solo = yn;
- set_mute_master_solo ();
-}
-
-void
-Route::mod_solo_by_others_upstream (int32_t delta)
-{
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
- name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
-
- uint32_t old_sbu = _soloed_by_others_upstream;
-
- if (delta < 0) {
- if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
- _soloed_by_others_upstream += delta;
- } else {
- _soloed_by_others_upstream = 0;
- }
- } else {
- _soloed_by_others_upstream += delta;
- }
-
- DEBUG_TRACE (DEBUG::Solo, string_compose (
- "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
- name(), delta, _soloed_by_others_upstream, old_sbu,
- _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
-
- /* push the inverse solo change to everything that feeds us.
-
- This is important for solo-within-group. When we solo 1 track out of N that
- feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
- on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
- tracks that feed it. This will silence them if they were audible because
- of a bus solo, but the newly soloed track will still be audible (because
- it is self-soloed).
-
- but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
- not in reverse.
- */
-
- if ((_self_solo || _soloed_by_others_downstream) &&
- ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
- (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
-
- if (delta > 0 || !Config->get_exclusive_solo()) {
- DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
- for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
- if (i->sends_only) {
- continue;
- }
- boost::shared_ptr<Route> sr = i->r.lock();
- if (sr) {
- sr->mod_solo_by_others_downstream (-delta);
- }
- }
- }
- }
-
- set_mute_master_solo ();
- solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
-}
-
-void
-Route::mod_solo_by_others_downstream (int32_t delta)
-{
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
- name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
-
- if (delta < 0) {
- if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
- _soloed_by_others_downstream += delta;
+ if (yn) {
+ _monitor_send->activate ();
} else {
- _soloed_by_others_downstream = 0;
+ _monitor_send->deactivate ();
}
- } else {
- _soloed_by_others_downstream += delta;
}
-
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
-
- set_mute_master_solo ();
- solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
-}
-
-void
-Route::set_mute_master_solo ()
-{
- _mute_master->set_soloed_by_self (self_soloed());
- _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
}
void
-Route::mod_solo_isolated_by_upstream (bool yn)
+Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
{
- bool old = solo_isolated ();
- DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod_solo_isolated_by_upstream cur: %2 d: %3\n",
- name(), _solo_isolated_by_upstream, yn ? "+1" : "-1"));
-
- if (!yn) {
- if (_solo_isolated_by_upstream >= 1) {
- _solo_isolated_by_upstream--;
- } else {
- _solo_isolated_by_upstream = 0;
- }
- } else {
- _solo_isolated_by_upstream++;
- }
+ /* nothing to do if we're not using AFL/PFL. But if we are, we need
+ to alter the active state of the monitor send.
+ */
- if (solo_isolated() != old) {
- /* solo isolated status changed */
- _mute_master->set_solo_ignore (solo_isolated());
- solo_isolated_changed (); /* EMIT SIGNAL */
+ if (Config->get_solo_control_is_listen_control ()) {
+ set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
}
}
void
-Route::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override)
+Route::push_solo_isolate_upstream (int32_t delta)
{
- if (is_master() || is_monitor() || is_auditioner()) {
- return;
- }
-
- if (use_group (group_override, &RouteGroup::is_solo)) {
- _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, Controllable::NoGroup));
- return;
- }
-
- bool changed = false;
-
- if (yn) {
- if (_solo_isolated == false) {
- _mute_master->set_solo_ignore (true);
- changed = true;
- }
- _solo_isolated = true;
- } else {
- if (_solo_isolated == true) {
- _solo_isolated = false;
- _mute_master->set_solo_ignore (false);
- changed = true;
- }
- }
-
-
- if (!changed) {
- return;
- }
-
/* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
boost::shared_ptr<RouteList> routes = _session.get_routes ();
for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
- if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+ if ((*i).get() == this || !(*i)->can_solo()) {
continue;
}
@@ -1080,75 +658,26 @@ Route::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_o
bool does_feed = feeds (*i, &sends_only);
if (does_feed && !sends_only) {
- (*i)->mod_solo_isolated_by_upstream (yn);
+ (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
}
}
-
- /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
-
- solo_isolated_changed (); /* EMIT SIGNAL */
- _solo_isolate_control->Changed(); /* EMIT SIGNAL */
-}
-
-bool
-Route::solo_isolated () const
-{
- return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
}
void
-Route::set_mute_points (MuteMaster::MutePoint mp)
+Route::push_solo_upstream (int delta)
{
- _mute_master->set_mute_points (mp);
- mute_points_changed (); /* EMIT SIGNAL */
-
- if (_mute_master->muted_by_self()) {
- mute_changed (); /* EMIT SIGNAL */
- _mute_control->Changed (); /* EMIT SIGNAL */
- }
-}
-
-void
-Route::set_mute (bool yn, Controllable::GroupControlDisposition group_override)
-{
- if (use_group (group_override, &RouteGroup::is_mute)) {
- _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, Controllable::NoGroup));
- return;
- }
-
- if (muted() != yn) {
- _mute_master->set_muted_by_self (yn);
- /* allow any derived classes to respond to the mute change
- before anybody else knows about it.
- */
- act_on_mute ();
- /* tell everyone else */
- mute_changed (); /* EMIT SIGNAL */
- _mute_control->Changed (); /* EMIT SIGNAL */
+ DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
+ for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
+ if (i->sends_only) {
+ continue;
+ }
+ boost::shared_ptr<Route> sr (i->r.lock());
+ if (sr) {
+ sr->solo_control()->mod_solo_by_others_downstream (-delta);
+ }
}
}
-bool
-Route::muted () const
-{
- return _mute_master->muted_by_self();
-}
-
-bool
-Route::muted_by_others () const
-{
- // This method is only used by route_ui for display state.
- // The real thing is MuteMaster::muted_by_others_at()
-
- //master is never muted by others
- if (is_master())
- return false;
-
- //now check to see if something is soloed (and I am not)
- //see also MuteMaster::mute_gain_at()
- return (_session.soloing() && !soloed() && !solo_isolated());
-}
-
#if 0
static void
dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
@@ -1241,89 +770,37 @@ Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<
DEBUG_TRACE (DEBUG::Processors, string_compose (
"%1 adding processor %2\n", name(), processor->name()));
- if (!AudioEngine::instance()->connected() || !processor) {
- return 1;
- }
+ ProcessorList pl;
- {
- Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
- Glib::Threads::RWLock::WriterLock lm (_processor_lock);
- ProcessorState pstate (this);
-
- boost::shared_ptr<PluginInsert> pi;
- boost::shared_ptr<PortInsert> porti;
-
- if (processor == _amp) {
- /* Ensure that only one amp is in the list at any time */
- ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
- if (check != _processors.end()) {
- if (before == _amp) {
- /* Already in position; all is well */
- return 0;
- } else {
- _processors.erase (check);
- }
- }
- }
-
- assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
+ pl.push_back (processor);
+ int rv = add_processors (pl, before, err);
- ProcessorList::iterator loc;
- if (before) {
- /* inserting before a processor; find it */
- loc = find (_processors.begin(), _processors.end(), before);
- if (loc == _processors.end ()) {
- /* Not found */
- return 1;
- }
- } else {
- /* inserting at end */
- loc = _processors.end ();
- }
-
- _processors.insert (loc, processor);
- processor->set_owner (this);
-
- // Set up processor list channels. This will set processor->[input|output]_streams(),
- // configure redirect ports properly, etc.
-
- {
- if (configure_processors_unlocked (err)) {
- pstate.restore ();
- configure_processors_unlocked (0); // it worked before we tried to add it ...
- return -1;
- }
- }
-
- if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
-
- if (pi->has_no_inputs ()) {
- /* generator plugin */
- _have_internal_generator = true;
- }
-
- }
-
- if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
- processor->activate ();
- }
-
- processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
-
- _output->set_user_latency (0);
+ if (rv) {
+ return rv;
}
- reset_instrument_info ();
- processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
- set_processor_positions ();
+ if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
+ processor->activate ();
+ }
return 0;
}
+void
+Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
+{
+ /* We cannot destruct the processor here (usually RT-thread
+ * with various locks held - in case of sends also io_locks).
+ * Queue for deletion in low-priority thread.
+ */
+ Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
+ selfdestruct_sequence.push_back (wp);
+}
+
bool
Route::add_processor_from_xml_2X (const XMLNode& node, int version)
{
- const XMLProperty *prop;
+ XMLProperty const * prop;
try {
boost::shared_ptr<Processor> processor;
@@ -1361,6 +838,7 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
processor.reset (new UnknownProcessor (_session, node));
} else {
processor.reset (new PluginInsert (_session));
+ processor->set_owner (this);
}
} else {
@@ -1404,29 +882,89 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
}
}
+
+inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
+ return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
+}
+
+inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
+ return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
+}
+
int
Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
{
- /* NOTE: this is intended to be used ONLY when copying
- processors from another Route. Hence the subtle
- differences between this and ::add_processor()
- */
+ ProcessorList::iterator loc;
+
+ if (before) {
+ loc = find(_processors.begin(), _processors.end(), before);
+ if (loc == _processors.end ()) {
+ return 1;
+ }
+ } else {
+ /* nothing specified - at end */
+ loc = _processors.end ();
+ }
+
+ if (!AudioEngine::instance()->connected()) {
+ return 1;
+ }
+
+ if (others.empty()) {
+ return 0;
+ }
+
+ ProcessorList to_skip;
+
+ // check if there's an instrument to replace or configure
+ for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
+ continue;
+ }
+ if (!pi->plugin ()->get_info ()->is_instrument ()) {
+ continue;
+ }
+ boost::shared_ptr<Processor> instrument = the_instrument ();
+ ChanCount in (DataType::MIDI, 1);
+ ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
+
+ PluginSetupOptions flags = None;
+ if (instrument) {
+ flags |= CanReplace;
+ in = instrument->input_streams ();
+ out = instrument->output_streams ();
+ }
+ if (pi->has_output_presets (in, out)) {
+ flags |= MultiOut;
+ }
- ProcessorList::iterator loc;
+ pi->set_strict_io (_strict_io);
- if (before) {
- loc = find(_processors.begin(), _processors.end(), before);
- } else {
- /* nothing specified - at end */
- loc = _processors.end ();
- }
+ PluginSetupOptions mask = None;
+ if (Config->get_ask_replace_instrument ()) {
+ mask |= CanReplace;
+ }
+ if (Config->get_ask_setup_instrument ()) {
+ mask |= MultiOut;
+ }
- if (!_session.engine().connected()) {
- return 1;
- }
+ flags &= mask;
- if (others.empty()) {
- return 0;
+ if (flags != None) {
+ boost::optional<int> rv = PluginSetup (shared_from_this (), pi, flags); /* EMIT SIGNAL */
+ switch (rv.get_value_or (0)) {
+ case 1:
+ to_skip.push_back (*i); // don't add this one;
+ break;
+ case 2:
+ replace_processor (instrument, *i, err);
+ to_skip.push_back (*i);
+ break;
+ default:
+ break;
+ }
+ }
}
{
@@ -1439,30 +977,59 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor>
if (*i == _meter) {
continue;
}
+ ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
+ if (check != to_skip.end()) {
+ continue;
+ }
boost::shared_ptr<PluginInsert> pi;
if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
- pi->set_count (1);
+ pi->set_strict_io (_strict_io);
+ }
+
+ if (*i == _amp) {
+ /* Ensure that only one amp is in the list at any time */
+ ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
+ if (check != _processors.end()) {
+ if (before == _amp) {
+ /* Already in position; all is well */
+ continue;
+ } else {
+ _processors.erase (check);
+ }
+ }
}
+ assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
+
_processors.insert (loc, *i);
(*i)->set_owner (this);
- if ((*i)->active()) {
- (*i)->activate ();
- }
-
- /* Think: does this really need to be called for every processor in the loop? */
{
- if (configure_processors_unlocked (err)) {
+ if (configure_processors_unlocked (err, &lm)) {
pstate.restore ();
- configure_processors_unlocked (0); // it worked before we tried to add it ...
+ configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
return -1;
}
}
+ if (pi && pi->has_sidechain ()) {
+ pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
+ }
+
+ if ((*i)->active()) {
+ // emit ActiveChanged() and latency_changed() if needed
+ (*i)->activate ();
+ }
+
(*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
+
+ boost::shared_ptr<Send> send;
+ if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
+ send->SelfDestruct.connect_same_thread (*this,
+ boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
+ }
}
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
@@ -1511,7 +1078,7 @@ Route::disable_processors (Placement p)
placement_range(p, start, end);
for (ProcessorList::iterator i = start; i != end; ++i) {
- (*i)->deactivate ();
+ (*i)->enable (false);
}
_session.set_dirty ();
@@ -1525,7 +1092,7 @@ Route::disable_processors ()
Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- (*i)->deactivate ();
+ (*i)->enable (false);
}
_session.set_dirty ();
@@ -1544,7 +1111,7 @@ Route::disable_plugins (Placement p)
for (ProcessorList::iterator i = start; i != end; ++i) {
if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
- (*i)->deactivate ();
+ (*i)->enable (false);
}
}
@@ -1560,7 +1127,7 @@ Route::disable_plugins ()
for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
- (*i)->deactivate ();
+ (*i)->enable (false);
}
}
@@ -1584,8 +1151,8 @@ Route::ab_plugins (bool forward)
continue;
}
- if ((*i)->active()) {
- (*i)->deactivate ();
+ if ((*i)->enabled ()) {
+ (*i)->enable (false);
(*i)->set_next_ab_is_active (true);
} else {
(*i)->set_next_ab_is_active (false);
@@ -1602,11 +1169,7 @@ Route::ab_plugins (bool forward)
continue;
}
- if ((*i)->get_next_ab_is_active()) {
- (*i)->activate ();
- } else {
- (*i)->deactivate ();
- }
+ (*i)->enable ((*i)->get_next_ab_is_active ());
}
}
@@ -1675,7 +1238,7 @@ Route::clear_processors (Placement p)
}
_processors = new_list;
- configure_processors_unlocked (&err); // this can't fail
+ configure_processors_unlocked (&err, &lm); // this can't fail
}
processor_max_streams.reset();
@@ -1747,9 +1310,15 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
run.
*/
- boost::shared_ptr<IOProcessor> iop;
+ boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
+
+ if (pi != 0) {
+ assert (iop == 0);
+ iop = pi->sidechain();
+ }
- if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
+ if (iop != 0) {
iop->disconnect ();
}
@@ -1769,10 +1338,10 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
return 1;
}
- if (configure_processors_unlocked (err)) {
+ if (configure_processors_unlocked (err, &lm)) {
pstate.restore ();
/* we know this will work, because it worked before :) */
- configure_processors_unlocked (0);
+ configure_processors_unlocked (0, &lm);
return -1;
}
@@ -1802,6 +1371,104 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
}
int
+Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
+{
+ /* these can never be removed */
+ if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
+ return 1;
+ }
+ /* and can't be used as substitute, either */
+ if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
+ return 1;
+ }
+
+ /* I/Os are out, too */
+ if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
+ return 1;
+ }
+
+ /* this function cannot be used to swap/reorder processors */
+ if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
+ return 1;
+ }
+
+ if (!AudioEngine::instance()->connected() || !old || !sub) {
+ return 1;
+ }
+
+ /* ensure that sub is not owned by another route */
+ if (sub->owner ()) {
+ return 1;
+ }
+
+ {
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+ Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+ ProcessorState pstate (this);
+
+ assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
+
+ ProcessorList::iterator i;
+ bool replaced = false;
+ bool enable = old->enabled ();
+
+ for (i = _processors.begin(); i != _processors.end(); ) {
+ if (*i == old) {
+ i = _processors.erase (i);
+ _processors.insert (i, sub);
+ sub->set_owner (this);
+ replaced = true;
+ break;
+ } else {
+ ++i;
+ }
+ }
+
+ if (!replaced) {
+ return 1;
+ }
+
+ if (_strict_io) {
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
+ pi->set_strict_io (true);
+ }
+ }
+
+ if (configure_processors_unlocked (err, &lm)) {
+ pstate.restore ();
+ configure_processors_unlocked (0, &lm);
+ return -1;
+ }
+
+ _have_internal_generator = false;
+
+ for (i = _processors.begin(); i != _processors.end(); ++i) {
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
+ if (pi->has_no_inputs ()) {
+ _have_internal_generator = true;
+ break;
+ }
+ }
+ }
+
+ if (enable) {
+ sub->enable (true);
+ }
+
+ sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
+ _output->set_user_latency (0);
+ }
+
+ reset_instrument_info ();
+ old->drop_references ();
+ processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
+ return 0;
+}
+
+int
Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
{
ProcessorList deleted;
@@ -1843,9 +1510,14 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
run.
*/
- boost::shared_ptr<IOProcessor> iop;
+ boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
+ if (pi != 0) {
+ assert (iop == 0);
+ iop = pi->sidechain();
+ }
- if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
+ if (iop != 0) {
iop->disconnect ();
}
@@ -1860,10 +1532,10 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
_output->set_user_latency (0);
- if (configure_processors_unlocked (err)) {
+ if (configure_processors_unlocked (err, &lm)) {
pstate.restore ();
/* we know this will work, because it worked before :) */
- configure_processors_unlocked (0);
+ configure_processors_unlocked (0, &lm);
return -1;
}
//lx.unlock();
@@ -1914,7 +1586,7 @@ Route::configure_processors (ProcessorStreams* err)
if (!_in_configure_processors) {
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
- return configure_processors_unlocked (err);
+ return configure_processors_unlocked (err, &lm);
}
return 0;
@@ -1948,6 +1620,33 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
if ((*p)->can_support_io_configuration(in, out)) {
+
+ if (boost::dynamic_pointer_cast<Delivery> (*p)
+ && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
+ && !is_auditioner()
+ && (is_monitor() || _strict_io || Profile->get_mixbus ())) {
+ /* with strict I/O the panner + output are forced to
+ * follow the last processor's output.
+ *
+ * Delivery::can_support_io_configuration() will only add ports,
+ * but not remove excess ports.
+ *
+ * This works because the delivery only requires
+ * as many outputs as there are inputs.
+ * Delivery::configure_io() will do the actual removal
+ * by calling _output->ensure_io()
+ */
+ if (!is_master() && _session.master_out () && in.n_audio() > 0) {
+ /* ..but at least as many as there are master-inputs, if
+ * the delivery is dealing with audio */
+ // XXX this may need special-casing for mixbus (master-outputs)
+ // and should maybe be a preference anyway ?!
+ out = ChanCount::max (in, _session.master_out ()->n_inputs ());
+ } else {
+ out = in;
+ }
+ }
+
DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
configuration.push_back(make_pair(in, out));
@@ -2004,7 +1703,7 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
* Return 0 on success, otherwise configuration is impossible.
*/
int
-Route::configure_processors_unlocked (ProcessorStreams* err)
+Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
{
#ifndef PLATFORM_WINDOWS
assert (!AudioEngine::instance()->process_lock().trylock());
@@ -2031,21 +1730,54 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
processor_out_streams = _input->n_ports();
processor_max_streams.reset();
+ /* processor configure_io() may result in adding ports
+ * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
+ *
+ * with jack2 adding ports results in a graph-order callback,
+ * which calls Session::resort_routes() and eventually
+ * Route::direct_feeds_according_to_reality()
+ * which takes a ReaderLock (_processor_lock).
+ *
+ * so we can't hold a WriterLock here until jack2 threading
+ * is fixed.
+ *
+ * NB. we still hold the process lock
+ *
+ * (ardour's own engines do call graph-order from the
+ * process-thread and hence do not have this issue; besides
+ * merely adding ports won't trigger a graph-order, only
+ * making connections does)
+ */
+ lm->release ();
+
+ // TODO check for a potential ReaderLock after ReaderLock ??
+ Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
+
list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
if (!(*p)->configure_io(c->first, c->second)) {
DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
+ _in_configure_processors = false;
+ lr.release ();
+ lm->acquire ();
+ return -1;
}
processor_max_streams = ChanCount::max(processor_max_streams, c->first);
processor_max_streams = ChanCount::max(processor_max_streams, c->second);
+ boost::shared_ptr<IOProcessor> iop;
boost::shared_ptr<PluginInsert> pi;
if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
- /* plugins connected via Split Match may have more channels.
- * route/scratch buffers are needed for all of them*/
- processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
- processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
+ /* plugins connected via Split or Hide Match may have more channels.
+ * route/scratch buffers are needed for all of them
+ * The configuration may only be a subset (both input and output)
+ */
+ processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
+ }
+ else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
+ processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
+ processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
}
out = c->second;
@@ -2062,6 +1794,9 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
}
}
+ lr.release ();
+ lm->acquire ();
+
if (_meter) {
_meter->set_max_channels (processor_max_streams);
@@ -2094,12 +1829,7 @@ Route::all_visible_processors_active (bool state)
if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
continue;
}
-
- if (state) {
- (*i)->activate ();
- } else {
- (*i)->deactivate ();
- }
+ (*i)->enable (state);
}
_session.set_dirty ();
@@ -2249,33 +1979,233 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err
if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
- Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
- Glib::Threads::RWLock::WriterLock lm (_processor_lock);
- ProcessorState pstate (this);
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+ Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+ ProcessorState pstate (this);
+
+ apply_processor_order (new_order);
+
+ if (configure_processors_unlocked (err, &lm)) {
+ pstate.restore ();
+ return -1;
+ }
+
+ lm.release();
+ lx.release();
+
+ processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
+
+ } else {
+ DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+
+ // _pending_processor_order is protected by _processor_lock
+ _pending_processor_order = new_order;
+ g_atomic_int_set (&_pending_process_reorder, 1);
+ }
+
+ return 0;
+}
+
+bool
+Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
+{
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
+ return false;
+ }
+
+ if (pi->has_sidechain () == add) {
+ return true; // ?? call failed, but result is as expected.
+ }
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
+ if (i == _processors.end ()) {
+ return false;
+ }
+ }
+
+ {
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
+ Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+ PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
+
+ lx.release (); // IO::add_port() and ~IO takes process lock - XXX check if this is safe
+ if (add) {
+ if (!pi->add_sidechain ()) {
+ return false;
+ }
+ } else {
+ if (!pi->del_sidechain ()) {
+ return false;
+ }
+ }
+
+ lx.acquire ();
+ list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
+ lx.release ();
+
+ if (c.empty()) {
+ if (add) {
+ pi->del_sidechain ();
+ } else {
+ pi->add_sidechain ();
+ // TODO restore side-chain's state.
+ }
+ return false;
+ }
+ lx.acquire ();
+ configure_processors_unlocked (0, &lm);
+ }
+
+ if (pi->has_sidechain ()) {
+ pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
+ }
+
+ processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ _session.set_dirty ();
+ return true;
+}
+
+bool
+Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
+{
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
+ return false;
+ }
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
+ if (i == _processors.end ()) {
+ return false;
+ }
+ }
+
+ {
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+ Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+
+ const ChanCount& old (pi->preset_out ());
+ if (!pi->set_preset_out (outs)) {
+ return true; // no change, OK
+ }
+
+ list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
+ if (c.empty()) {
+ /* not possible */
+ pi->set_preset_out (old);
+ return false;
+ }
+ configure_processors_unlocked (0, &lm);
+ }
+
+ processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ _session.set_dirty ();
+ return true;
+}
+
+bool
+Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
+{
+ ChanCount unused;
+ return customize_plugin_insert (proc, 0, unused, unused);
+}
+
+bool
+Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
+{
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
+ return false;
+ }
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
+ if (i == _processors.end ()) {
+ return false;
+ }
+ }
+
+ {
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+ Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+
+ bool old_cust = pi->custom_cfg ();
+ uint32_t old_cnt = pi->get_count ();
+ ChanCount old_chan = pi->output_streams ();
+ ChanCount old_sinks = pi->natural_input_streams ();
+
+ if (count == 0) {
+ pi->set_custom_cfg (false);
+ } else {
+ pi->set_custom_cfg (true);
+ pi->set_count (count);
+ pi->set_outputs (outs);
+ pi->set_sinks (sinks);
+ }
+
+ list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
+ if (c.empty()) {
+ /* not possible */
+
+ pi->set_count (old_cnt);
+ pi->set_sinks (old_sinks);
+ pi->set_outputs (old_chan);
+ pi->set_custom_cfg (old_cust);
+
+ return false;
+ }
+ configure_processors_unlocked (0, &lm);
+ }
+
+ processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ _session.set_dirty ();
+ return true;
+}
- apply_processor_order (new_order);
+bool
+Route::set_strict_io (const bool enable)
+{
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
- if (configure_processors_unlocked (err)) {
- pstate.restore ();
- return -1;
+ if (_strict_io != enable) {
+ _strict_io = enable;
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
+ pi->set_strict_io (_strict_io);
+ }
}
- lm.release();
- lx.release();
+ list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
- processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
- set_processor_positions ();
+ if (c.empty()) {
+ // not possible
+ _strict_io = !enable; // restore old value
+ for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
+ boost::shared_ptr<PluginInsert> pi;
+ if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
+ pi->set_strict_io (_strict_io);
+ }
+ }
+ return false;
+ }
+ lm.release ();
- } else {
- DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
- Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ configure_processors (0);
+ lx.release ();
- // _pending_processor_order is protected by _processor_lock
- _pending_processor_order = new_order;
- g_atomic_int_set (&_pending_process_reorder, 1);
+ processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ _session.set_dirty ();
}
-
- return 0;
+ return true;
}
XMLNode&
@@ -2293,6 +2223,7 @@ Route::get_template()
XMLNode&
Route::state(bool full_state)
{
+ LocaleGuard lg;
if (!_session._template_state_dir.empty()) {
assert (!full_state); // only for templates
foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
@@ -2306,15 +2237,12 @@ Route::state(bool full_state)
node->add_property("id", buf);
node->add_property ("name", _name);
node->add_property("default-type", _default_type.to_string());
+ node->add_property ("strict-io", _strict_io);
- if (_flags) {
- node->add_property("flags", enum_2_string (_flags));
- }
+ node->add_child_nocopy (_presentation_info.get_state());
node->add_property("active", _active?"yes":"no");
string p;
- boost::to_string (_phase_invert, p);
- node->add_property("phase-invert", p);
node->add_property("denormal-protection", _denormal_protection?"yes":"no");
node->add_property("meter-point", enum_2_string (_meter_point));
@@ -2324,31 +2252,21 @@ Route::state(bool full_state)
node->add_property("route-group", _route_group->name());
}
- snprintf (buf, sizeof (buf), "%d", _order_key);
- node->add_property ("order-key", buf);
- node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
- snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
- node->add_property ("soloed-by-upstream", buf);
- snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
- node->add_property ("soloed-by-downstream", buf);
- node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
- node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
+ node->add_child_nocopy (_solo_control->get_state ());
+ node->add_child_nocopy (_solo_isolate_control->get_state ());
+ node->add_child_nocopy (_solo_safe_control->get_state ());
node->add_child_nocopy (_input->state (full_state));
node->add_child_nocopy (_output->state (full_state));
- node->add_child_nocopy (_solo_control->get_state ());
- node->add_child_nocopy (_mute_control->get_state ());
node->add_child_nocopy (_mute_master->get_state ());
+ node->add_child_nocopy (_mute_control->get_state ());
+ node->add_child_nocopy (_phase_control->get_state ());
+
if (full_state) {
node->add_child_nocopy (Automatable::get_automation_xml_state ());
}
- XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
- snprintf (buf, sizeof (buf), "%d", _remote_control_id);
- remote_control_node->add_property (X_("id"), buf);
- node->add_child_nocopy (*remote_control_node);
-
if (_comment.length()) {
XMLNode *cmt = node->add_child ("Comment");
cmt->add_content (_comment);
@@ -2358,26 +2276,29 @@ Route::state(bool full_state)
node->add_child_nocopy (_pannable->state (full_state));
}
- for (i = _processors.begin(); i != _processors.end(); ++i) {
- if (!full_state) {
- /* template save: do not include internal sends functioning as
- aux sends because the chance of the target ID
- in the session where this template is used
- is not very likely.
-
- similarly, do not save listen sends which connect to
- the monitor section, because these will always be
- added if necessary.
- */
- boost::shared_ptr<InternalSend> is;
+ {
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ for (i = _processors.begin(); i != _processors.end(); ++i) {
+ if (!full_state) {
+ /* template save: do not include internal sends functioning as
+ aux sends because the chance of the target ID
+ in the session where this template is used
+ is not very likely.
+
+ similarly, do not save listen sends which connect to
+ the monitor section, because these will always be
+ added if necessary.
+ */
+ boost::shared_ptr<InternalSend> is;
- if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
- if (is->role() == Delivery::Listen) {
- continue;
+ if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
+ if (is->role() == Delivery::Listen) {
+ continue;
+ }
}
}
+ node->add_child_nocopy((*i)->state (full_state));
}
- node->add_child_nocopy((*i)->state (full_state));
}
if (_extra_xml) {
@@ -2396,6 +2317,8 @@ Route::state(bool full_state)
foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
}
+ node->add_child_copy (Slavable::get_state());
+
return *node;
}
@@ -2409,7 +2332,7 @@ Route::set_state (const XMLNode& node, int version)
XMLNodeList nlist;
XMLNodeConstIterator niter;
XMLNode *child;
- const XMLProperty *prop;
+ XMLProperty const * prop;
if (node.name() != "Route"){
error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
@@ -2423,14 +2346,10 @@ Route::set_state (const XMLNode& node, int version)
set_id (node);
_initial_io_setup = true;
- if ((prop = node.property (X_("flags"))) != 0) {
- _flags = Flag (string_2_enum (prop->value(), _flags));
- } else {
- _flags = Flag (0);
- }
+ Stripable::set_state (node, version);
- if (is_master() || is_monitor() || is_auditioner()) {
- _mute_master->set_solo_ignore (true);
+ if ((prop = node.property (X_("strict-io"))) != 0) {
+ _strict_io = string_is_affirmative (prop->value());
}
if (is_monitor()) {
@@ -2462,18 +2381,17 @@ Route::set_state (const XMLNode& node, int version)
} else if (prop->value() == "Output") {
_output->set_state (*child, version);
}
- }
- if (child->name() == X_("Processor")) {
+ } else if (child->name() == X_("Processor")) {
processor_state.add_child_copy (*child);
- }
-
- if (child->name() == X_("Pannable")) {
+ } else if (child->name() == X_("Pannable")) {
if (_pannable) {
_pannable->set_state (*child, version);
} else {
warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
}
+ } else if (child->name() == Slavable::xml_node_name) {
+ Slavable::set_state (*child, version);
}
}
@@ -2496,82 +2414,15 @@ Route::set_state (const XMLNode& node, int version)
// this looks up the internal instrument in processors
reset_instrument_info();
- if ((prop = node.property ("self-solo")) != 0) {
- set_self_solo (string_is_affirmative (prop->value()));
- }
-
- if ((prop = node.property ("soloed-by-upstream")) != 0) {
- _soloed_by_others_upstream = 0; // needed for mod_.... () to work
- mod_solo_by_others_upstream (atoi (prop->value()));
- }
-
- if ((prop = node.property ("soloed-by-downstream")) != 0) {
- _soloed_by_others_downstream = 0; // needed for mod_.... () to work
- mod_solo_by_others_downstream (atoi (prop->value()));
- }
-
- if ((prop = node.property ("solo-isolated")) != 0) {
- set_solo_isolated (string_is_affirmative (prop->value()), Controllable::NoGroup);
- }
-
- if ((prop = node.property ("solo-safe")) != 0) {
- set_solo_safe (string_is_affirmative (prop->value()), Controllable::NoGroup);
- }
-
- if ((prop = node.property (X_("phase-invert"))) != 0) {
- set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
- }
-
if ((prop = node.property (X_("denormal-protection"))) != 0) {
set_denormal_protection (string_is_affirmative (prop->value()));
}
if ((prop = node.property (X_("active"))) != 0) {
bool yn = string_is_affirmative (prop->value());
- _active = !yn; // force switch
set_active (yn, this);
}
- if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
- set_order_key (atoi(prop->value()));
- }
-
- if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
-
- int32_t n;
-
- string::size_type colon, equal;
- string remaining = prop->value();
-
- while (remaining.length()) {
-
- if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
- error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
- << endmsg;
- } else {
- if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
- error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
- << endmsg;
- } else {
- string keyname = remaining.substr (0, equal);
-
- if ((keyname == "EditorSort") || (keyname == "editor")) {
- cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
- set_order_key (n);
- }
- }
- }
-
- colon = remaining.find_first_of (':');
-
- if (colon != string::npos) {
- remaining = remaining.substr (colon+1);
- } else {
- break;
- }
- }
- }
-
if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
PBD::ID id (prop->value ());
Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
@@ -2596,21 +2447,25 @@ Route::set_state (const XMLNode& node, int version)
XMLNode *cmt = *(child->children().begin());
_comment = cmt->content();
- } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
- if (prop->value() == "solo") {
- _solo_control->set_state (*child, version);
- } else if (prop->value() == "mute") {
- _mute_control->set_state (*child, version);
+ } else if (child->name() == Controllable::xml_node_name) {
+ if ((prop = child->property (X_("name"))) == 0) {
+ continue;
}
- } else if (child->name() == X_("RemoteControl")) {
- if ((prop = child->property (X_("id"))) != 0) {
- int32_t x;
- sscanf (prop->value().c_str(), "%d", &x);
- set_remote_control_id_internal (x);
+ if (prop->value() == _gain_control->name()) {
+ _gain_control->set_state (*child, version);
+ } else if (prop->value() == _solo_control->name()) {
+ _solo_control->set_state (*child, version);
+ } else if (prop->value() == _solo_safe_control->name()) {
+ _solo_safe_control->set_state (*child, version);
+ } else if (prop->value() == _solo_isolate_control->name()) {
+ _solo_isolate_control->set_state (*child, version);
+ } else if (prop->value() == _solo_control->name()) {
+ _mute_control->set_state (*child, version);
+ } else if (prop->value() == _phase_control->name()) {
+ _phase_control->set_state (*child, version);
}
-
- } else if (child->name() == X_("MuteMaster")) {
+ } else if (child->name() == MuteMaster::xml_node_name) {
_mute_master->set_state (*child, version);
} else if (child->name() == Automatable::xml_node_name) {
@@ -2624,11 +2479,11 @@ Route::set_state (const XMLNode& node, int version)
int
Route::set_state_2X (const XMLNode& node, int version)
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
XMLNodeList nlist;
XMLNodeConstIterator niter;
XMLNode *child;
- const XMLProperty *prop;
+ XMLProperty const * prop;
/* 2X things which still remain to be handled:
* default-type
@@ -2641,38 +2496,12 @@ Route::set_state_2X (const XMLNode& node, int version)
return -1;
}
- if ((prop = node.property (X_("flags"))) != 0) {
- string f = prop->value ();
- boost::replace_all (f, "ControlOut", "MonitorOut");
- _flags = Flag (string_2_enum (f, _flags));
- } else {
- _flags = Flag (0);
- }
-
- if (is_master() || is_monitor() || is_auditioner()) {
- _mute_master->set_solo_ignore (true);
- }
-
- if ((prop = node.property (X_("phase-invert"))) != 0) {
- boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
- if (string_is_affirmative (prop->value ())) {
- p.set ();
- }
- set_phase_invert (p);
- }
+ Stripable::set_state (node, version);
if ((prop = node.property (X_("denormal-protection"))) != 0) {
set_denormal_protection (string_is_affirmative (prop->value()));
}
- if ((prop = node.property (X_("soloed"))) != 0) {
- bool yn = string_is_affirmative (prop->value());
-
- /* XXX force reset of solo status */
-
- set_solo (yn);
- }
-
if ((prop = node.property (X_("muted"))) != 0) {
bool first = true;
@@ -2737,46 +2566,6 @@ Route::set_state_2X (const XMLNode& node, int version)
_meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
}
- /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
- don't mean the same thing.
- */
-
- if ((prop = node.property (X_("order-keys"))) != 0) {
-
- int32_t n;
-
- string::size_type colon, equal;
- string remaining = prop->value();
-
- while (remaining.length()) {
-
- if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
- error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
- << endmsg;
- } else {
- if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
- error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
- << endmsg;
- } else {
- string keyname = remaining.substr (0, equal);
-
- if (keyname == "EditorSort" || keyname == "editor") {
- info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
- set_order_key (n);
- }
- }
- }
-
- colon = remaining.find_first_of (':');
-
- if (colon != string::npos) {
- remaining = remaining.substr (colon+1);
- } else {
- break;
- }
- }
- }
-
/* IOs */
nlist = node.children ();
@@ -2866,13 +2655,6 @@ Route::set_state_2X (const XMLNode& node, int version)
_mute_control->set_state (*child, version);
}
- } else if (child->name() == X_("RemoteControl")) {
- if ((prop = child->property (X_("id"))) != 0) {
- int32_t x;
- sscanf (prop->value().c_str(), "%d", &x);
- set_remote_control_id_internal (x);
- }
-
}
}
@@ -2951,7 +2733,7 @@ Route::set_processor_state (const XMLNode& node)
ProcessorList::iterator o;
for (o = _processors.begin(); o != _processors.end(); ++o) {
- XMLProperty* id_prop = (*niter)->property(X_("id"));
+ XMLProperty const * id_prop = (*niter)->property(X_("id"));
if (id_prop && (*o)->id() == id_prop->value()) {
(*o)->set_state (**niter, Stateful::current_state_version);
new_order.push_back (*o);
@@ -2972,13 +2754,20 @@ Route::set_processor_state (const XMLNode& node)
} else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
prop->value() == "lv2" ||
prop->value() == "windows-vst" ||
- prop->value() == "lxvst" ||
+ prop->value() == "lxvst" ||
+ prop->value() == "luaproc" ||
prop->value() == "audiounit") {
if (_session.get_disable_all_loaded_plugins ()) {
processor.reset (new UnknownProcessor (_session, **niter));
} else {
processor.reset (new PluginInsert (_session));
+ processor->set_owner (this);
+ if (_strict_io) {
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
+ pi->set_strict_io (true);
+ }
+
}
} else if (prop->value() == "port") {
@@ -2987,6 +2776,9 @@ Route::set_processor_state (const XMLNode& node)
} else if (prop->value() == "send") {
processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
+ boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
+ send->SelfDestruct.connect_same_thread (*this,
+ boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
} else {
error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
@@ -2998,6 +2790,12 @@ Route::set_processor_state (const XMLNode& node)
processor.reset (new UnknownProcessor (_session, **niter));
}
+ /* subscribe to Sidechain IO changes */
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
+ if (pi && pi->has_sidechain ()) {
+ pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
+ }
+
/* we have to note the monitor send here, otherwise a new one will be created
and the state of this one will be lost.
*/
@@ -3017,12 +2815,17 @@ Route::set_processor_state (const XMLNode& node)
}
{
- Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+ /* re-assign _processors w/o process-lock.
+ * if there's an IO-processor present in _processors but
+ * not in new_order, it will be deleted and ~IO takes
+ * a process lock.
+ */
_processors = new_order;
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
if (must_configure) {
- configure_processors_unlocked (0);
+ configure_processors_unlocked (0, &lm);
}
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
@@ -3069,6 +2872,8 @@ Route::silence_unlocked (framecnt_t nframes)
{
/* Must be called with the processor lock held */
+ const framepos_t now = _session.transport_frame ();
+
if (!_silent) {
_output->silence (nframes);
@@ -3081,7 +2886,7 @@ Route::silence_unlocked (framecnt_t nframes)
continue;
}
- (*i)->silence (nframes);
+ (*i)->silence (nframes, now);
}
if (nframes == _session.get_block_size()) {
@@ -3287,12 +3092,53 @@ Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
return false;
}
+IOVector
+Route::all_inputs () const
+{
+ /* TODO, if this works as expected,
+ * cache the IOVector and maintain it via
+ * input_change_handler(), sidechain_change_handler() etc
+ */
+ IOVector ios;
+ ios.push_back (_input);
+
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
+
+ boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
+ if (pi != 0) {
+ assert (iop == 0);
+ iop = pi->sidechain();
+ }
+
+ if (iop != 0 && iop->input()) {
+ ios.push_back (iop->input());
+ }
+ }
+ return ios;
+}
+
+IOVector
+Route::all_outputs () const
+{
+ IOVector ios;
+ // _output is included via Delivery
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+ for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
+ boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
+ if (iop != 0 && iop->output()) {
+ ios.push_back (iop->output());
+ }
+ }
+ return ios;
+}
+
bool
Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
{
DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
-
- if (_output->connected_to (other->input())) {
+ if (other->all_inputs().fed_by (_output)) {
DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
if (via_send_only) {
*via_send_only = false;
@@ -3301,13 +3147,25 @@ Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool*
return true;
}
+ Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
- boost::shared_ptr<IOProcessor> iop;
+ boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
+ if (pi != 0) {
+ assert (iop == 0);
+ iop = pi->sidechain();
+ }
- if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
- if (iop->feeds (other)) {
+ if (iop != 0) {
+ boost::shared_ptr<const IO> iop_out = iop->output();
+ if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
+ // TODO this needs a delaylines in the Insert to align connections (!)
+ DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
+ continue;
+ }
+ if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
if (via_send_only) {
*via_send_only = true;
@@ -3332,6 +3190,12 @@ Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* vi
return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
}
+bool
+Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
+{
+ return _session._current_route_graph.feeds (shared_from_this (), other);
+}
+
/** Called from the (non-realtime) butler thread when the transport is stopped */
void
Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
@@ -3364,11 +3228,11 @@ Route::input_change_handler (IOChange change, void * /*src*/)
contains ConfigurationChanged
*/
configure_processors (0);
- _phase_invert.resize (_input->n_ports().n_audio ());
+ _phase_control->resize (_input->n_ports().n_audio ());
io_changed (); /* EMIT SIGNAL */
}
- if (_soloed_by_others_upstream || _solo_isolated_by_upstream) {
+ if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
int sbou = 0;
int ibou = 0;
boost::shared_ptr<RouteList> routes = _session.get_routes ();
@@ -3383,38 +3247,36 @@ Route::input_change_handler (IOChange change, void * /*src*/)
if ((*i)->soloed()) {
++sbou;
}
- if ((*i)->solo_isolated()) {
+ if ((*i)->solo_isolate_control()->solo_isolated()) {
++ibou;
}
}
}
}
- int delta = sbou - _soloed_by_others_upstream;
- int idelta = ibou - _solo_isolated_by_upstream;
+ int delta = sbou - _solo_control->soloed_by_others_upstream();
+ int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
if (idelta < -1) {
PBD::warning << string_compose (
_("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
- _name, ibou, _solo_isolated_by_upstream, idelta)
+ _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
<< endmsg;
}
- if (_soloed_by_others_upstream) {
+ if (_solo_control->soloed_by_others_upstream()) {
// ignore new connections (they're not propagated)
if (delta <= 0) {
- mod_solo_by_others_upstream (delta);
+ _solo_control->mod_solo_by_others_upstream (delta);
}
}
- if (_solo_isolated_by_upstream) {
+ if (_solo_isolate_control->solo_isolated_by_upstream()) {
// solo-isolate currently only propagates downstream
if (idelta < 0) {
- mod_solo_isolated_by_upstream (false);
+ _solo_isolate_control->mod_solo_isolated_by_upstream (1);
}
- // TODO think: mod_solo_isolated_by_upstream() does not take delta arg,
- // but idelta can't be smaller than -1, can it?
//_solo_isolated_by_upstream = ibou;
}
@@ -3427,11 +3289,11 @@ Route::input_change_handler (IOChange change, void * /*src*/)
bool sends_only;
bool does_feed = feeds (*i, &sends_only);
if (delta <= 0 && does_feed && !sends_only) {
- (*i)->mod_solo_by_others_upstream (delta);
+ (*i)->solo_control()->mod_solo_by_others_upstream (delta);
}
if (idelta < 0 && does_feed && !sends_only) {
- (*i)->mod_solo_isolated_by_upstream (false);
+ (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
}
}
}
@@ -3457,7 +3319,7 @@ Route::output_change_handler (IOChange change, void * /*src*/)
io_changed (); /* EMIT SIGNAL */
}
- if (_soloed_by_others_downstream) {
+ if (_solo_control->soloed_by_others_downstream()) {
int sbod = 0;
/* checking all all downstream routes for
* explicit of implict solo is a rather drastic measure,
@@ -3480,20 +3342,20 @@ Route::output_change_handler (IOChange change, void * /*src*/)
}
}
}
- int delta = sbod - _soloed_by_others_downstream;
+ int delta = sbod - _solo_control->soloed_by_others_downstream();
if (delta <= 0) {
// do not allow new connections to change implicit solo (no propagation)
- mod_solo_by_others_downstream (delta);
+ _solo_control->mod_solo_by_others_downstream (delta);
// Session::route_solo_changed() does not propagate indirect solo-changes
// propagate upstream to tracks
for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
- if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+ if ((*i).get() == this || !can_solo()) {
continue;
}
bool sends_only;
bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
if (delta != 0 && does_feed && !sends_only) {
- (*i)->mod_solo_by_others_downstream (delta);
+ (*i)->solo_control()->mod_solo_by_others_downstream (delta);
}
}
@@ -3501,6 +3363,16 @@ Route::output_change_handler (IOChange change, void * /*src*/)
}
}
+void
+Route::sidechain_change_handler (IOChange change, void* src)
+{
+ if (_initial_io_setup || _in_sidechain_setup) {
+ return;
+ }
+
+ input_change_handler (change, src);
+}
+
uint32_t
Route::pans_required () const
{
@@ -3511,6 +3383,22 @@ Route::pans_required () const
return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
}
+void
+Route::flush_processor_buffers_locked (framecnt_t nframes)
+{
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
+ if (d) {
+ d->flush_buffers (nframes);
+ } else {
+ boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
+ if (p) {
+ p->flush_buffers (nframes);
+ }
+ }
+ }
+}
+
int
Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
{
@@ -3549,13 +3437,15 @@ Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
fill_buffers_with_input (bufs, _input, nframes);
if (_meter_point == MeterInput) {
- _meter->run (bufs, start_frame, end_frame, nframes, true);
+ _meter->run (bufs, start_frame, end_frame, 0.0, nframes, true);
}
_amp->apply_gain_automation (false);
_trim->apply_gain_automation (false);
passthru (bufs, start_frame, end_frame, nframes, 0);
+ flush_processor_buffers_locked (nframes);
+
return 0;
}
@@ -3589,11 +3479,13 @@ Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, in
fill_buffers_with_input (bufs, _input, nframes);
if (_meter_point == MeterInput) {
- _meter->run (bufs, start_frame, end_frame, nframes, true);
+ _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
}
passthru (bufs, start_frame, end_frame, nframes, declick);
+ flush_processor_buffers_locked (nframes);
+
return 0;
}
@@ -3601,6 +3493,7 @@ int
Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
{
silence (nframes);
+ flush_processor_buffers_locked (nframes);
return 0;
}
@@ -3658,13 +3551,12 @@ Route::apply_processor_changes_rt ()
g_atomic_int_set (&_pending_signals, emissions);
return true;
}
- return false;
+ return (!selfdestruct_sequence.empty ());
}
void
Route::emit_pending_signals ()
{
-
int sig = g_atomic_int_and (&_pending_signals, 0);
if (sig & EmitMeterChanged) {
_meter->emit_configuration_changed();
@@ -3678,6 +3570,24 @@ Route::emit_pending_signals ()
if (sig & EmitRtProcessorChange) {
processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
}
+
+ /* this would be a job for the butler.
+ * Conceptually we should not take processe/processor locks here.
+ * OTOH its more efficient (less overhead for summoning the butler and
+ * telling her what do do) and signal emission is called
+ * directly after the process callback, which decreases the chance
+ * of x-runs when taking the locks.
+ */
+ while (!selfdestruct_sequence.empty ()) {
+ Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
+ if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
+ boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
+ selfdestruct_sequence.pop_back ();
+ lx.release ();
+ if (proc) {
+ remove_processor (proc);
+ }
+ }
}
void
@@ -3786,10 +3696,10 @@ Route::listen_position_changed ()
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
ProcessorState pstate (this);
- if (configure_processors_unlocked (0)) {
+ if (configure_processors_unlocked (0, &lm)) {
DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
pstate.restore ();
- configure_processors_unlocked (0); // it worked before we tried to add it ...
+ configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
return;
}
}
@@ -3807,10 +3717,12 @@ Route::add_export_point()
Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::WriterLock lw (_processor_lock);
- _capturing_processor.reset (new CapturingProcessor (_session));
+ // this aligns all tracks; but not tracks + busses
+ assert (_session.worst_track_latency () >= _initial_delay);
+ _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
_capturing_processor->activate ();
- configure_processors_unlocked (0);
+ configure_processors_unlocked (0, &lw);
}
@@ -4072,7 +3984,7 @@ Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playli
} else if ((*i)->name() == X_("Processor")) {
- XMLProperty* role = (*i)->property (X_("role"));
+ XMLProperty const * role = (*i)->property (X_("role"));
if (role && role->value() == X_("Main")) {
(*i)->add_property (X_("name"), name);
}
@@ -4106,42 +4018,6 @@ Route::internal_send_for (boost::shared_ptr<const Route> target) const
return boost::shared_ptr<Send>();
}
-/** @param c Audio channel index.
- * @param yn true to invert phase, otherwise false.
- */
-void
-Route::set_phase_invert (uint32_t c, bool yn)
-{
- if (_phase_invert[c] != yn) {
- _phase_invert[c] = yn;
- phase_invert_changed (); /* EMIT SIGNAL */
- _phase_control->Changed(); /* EMIT SIGNAL */
- _session.set_dirty ();
- }
-}
-
-void
-Route::set_phase_invert (boost::dynamic_bitset<> p)
-{
- if (_phase_invert != p) {
- _phase_invert = p;
- phase_invert_changed (); /* EMIT SIGNAL */
- _session.set_dirty ();
- }
-}
-
-bool
-Route::phase_invert (uint32_t c) const
-{
- return _phase_invert[c];
-}
-
-boost::dynamic_bitset<>
-Route::phase_invert () const
-{
- return _phase_invert;
-}
-
void
Route::set_denormal_protection (bool yn)
{
@@ -4209,14 +4085,10 @@ Route::trim_control() const
return _trim_control;
}
-boost::shared_ptr<Route::PhaseControllable>
+boost::shared_ptr<PhaseControl>
Route::phase_control() const
{
- if (phase_invert().size()) {
- return _phase_control;
- } else {
- return boost::shared_ptr<PhaseControllable>();
- }
+ return _phase_control;
}
boost::shared_ptr<AutomationControl>
@@ -4309,12 +4181,6 @@ Route::has_io_processor_named (const string& name)
return false;
}
-MuteMaster::MutePoint
-Route::mute_points () const
-{
- return _mute_master->mute_points ();
-}
-
void
Route::set_processor_positions ()
{
@@ -4349,6 +4215,9 @@ Route::input_port_count_changing (ChanCount to)
bool
Route::output_port_count_changing (ChanCount to)
{
+ if (_strict_io && !_in_configure_processors) {
+ return true;
+ }
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
if (processor_out_streams.get(*t) > to.get(*t)) {
return true;
@@ -4522,12 +4391,13 @@ Route::setup_invisible_processors ()
/* find the amp */
- ProcessorList::iterator amp = new_processors.begin ();
- while (amp != new_processors.end() && *amp != _amp) {
- ++amp;
- }
+ ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
- assert (amp != new_processors.end ());
+ if (amp == new_processors.end ()) {
+ error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
+ new_processors.push_front (_amp);
+ amp = find (new_processors.begin(), new_processors.end(), _amp);
+ }
/* and the processor after the amp */
@@ -4627,10 +4497,17 @@ Route::setup_invisible_processors ()
new_processors.insert (amp, _monitor_control);
}
+ /* TRIMÂ CONTROL */
+
+ if (_trim && _trim->active()) {
+ assert (!_trim->display_to_user ());
+ new_processors.push_front (_trim);
+ }
+
/* INTERNAL RETURN */
- /* doing this here means that any monitor control will come just after
- the return.
+ /* doing this here means that any monitor control will come after
+ the return and trim.
*/
if (_intreturn) {
@@ -4638,10 +4515,6 @@ Route::setup_invisible_processors ()
new_processors.push_front (_intreturn);
}
- if (_trim && _trim->active()) {
- assert (!_trim->display_to_user ());
- new_processors.push_front (_trim);
- }
/* EXPORT PROCESSOR */
if (_capturing_processor) {
@@ -4652,8 +4525,8 @@ Route::setup_invisible_processors ()
_processors = new_processors;
for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
- (*i)->activate ();
+ if (!(*i)->display_to_user () && !(*i)->enabled () && (*i) != _monitor_send) {
+ (*i)->enable (true);
}
}
@@ -4781,11 +4654,9 @@ boost::shared_ptr<Processor>
Route::the_instrument_unlocked () const
{
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
- if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
- if ((*i)->input_streams().n_midi() > 0 &&
- (*i)->output_streams().n_audio() > 0) {
- return (*i);
- }
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
+ if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
+ return (*i);
}
}
return boost::shared_ptr<Processor>();
@@ -5353,3 +5224,47 @@ Route::master_send_enable_controllable () const
return boost::shared_ptr<AutomationControl>();
#endif
}
+
+bool
+Route::slaved () const
+{
+ if (!_gain_control) {
+ return false;
+ }
+ /* just test one particular control, not all of them */
+ return _gain_control->slaved ();
+}
+
+bool
+Route::slaved_to (boost::shared_ptr<VCA> vca) const
+{
+ if (!vca || !_gain_control) {
+ return false;
+ }
+
+ /* just test one particular control, not all of them */
+
+ return _gain_control->slaved_to (vca->gain_control());
+}
+
+bool
+Route::muted_by_others_soloing () const
+{
+ if (!can_be_muted_by_others ()) {
+ return false;
+ }
+
+ return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
+}
+
+void
+Route::clear_all_solo_state ()
+{
+ double v = _solo_safe_control->get_value ();
+
+ _solo_control->clear_all_solo_state ();
+
+ if (v != 0.0) {
+ _solo_safe_control->set_value (v, Controllable::NoGroup);
+ }
+}
diff --git a/libs/ardour/route_controls.cc b/libs/ardour/route_controls.cc
deleted file mode 100644
index 5ab7524..0000000
--- a/libs/ardour/route_controls.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- Copyright (C) 2000 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifdef WAF_BUILD
-#include "libardour-config.h"
-#endif
-
-#include "ardour/automation_control.h"
-#include "ardour/parameter_descriptor.h"
-#include "ardour/route.h"
-#include "ardour/session.h"
-
-#include "i18n.h"
-
-using namespace std;
-using namespace ARDOUR;
-using namespace PBD;
-
-void
-Route::set_control (AutomationType type, double val, PBD::Controllable::GroupControlDisposition group_override)
-{
- boost::shared_ptr<RouteList> rl;
-
- switch (type) {
- case GainAutomation:
- /* route must mediate group control */
- set_gain (val, group_override);
- break;
-
- case TrimAutomation:
- /* route must mediate group control */
- set_trim (val, group_override);
- break;
-
- case RecEnableAutomation:
- /* session must mediate group control */
- rl.reset (new RouteList);
- rl->push_back (shared_from_this());
- _session.set_record_enabled (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
- break;
-
- case SoloAutomation:
- /* session must mediate group control */
- rl.reset (new RouteList);
- rl->push_back (shared_from_this());
- if (Config->get_solo_control_is_listen_control()) {
- _session.set_listen (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
- } else {
- _session.set_solo (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
- }
- break;
-
- case MuteAutomation:
- /* session must mediate group control */
- rl.reset (new RouteList);
- rl->push_back (shared_from_this());
- _session.set_mute (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
- return;
- break;
-
- default:
- /* Not a route automation control */
- fatal << string_compose (_("programming error: %1%2\n"), X_("illegal type of route automation control passed to Route::set_control(): "), enum_2_string(type)) << endmsg;
- /*NOTREACHED*/
- return;
- }
-}
-
-
-Route::RouteAutomationControl::RouteAutomationControl (const std::string& name,
- AutomationType atype,
- boost::shared_ptr<AutomationList> alist,
- boost::shared_ptr<Route> r)
- : AutomationControl (r->session(), Evoral::Parameter (atype),
- ParameterDescriptor (Evoral::Parameter (atype)),
- alist, name)
- , _route (r)
-{
-}
-
-Route::GainControllable::GainControllable (Session& s, AutomationType atype, boost::shared_ptr<Route> r)
- : GainControl (s, Evoral::Parameter(atype))
- , _route (r)
-{
-
-}
-
-Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
- : RouteAutomationControl (name, SoloAutomation, boost::shared_ptr<AutomationList>(), r)
-{
- boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
- gl->set_interpolation(Evoral::ControlList::Discrete);
- set_list (gl);
-}
-
-void
-Route::SoloControllable::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
- if (writable()) {
- _set_value (val, group_override);
- }
-}
-
-void
-Route::SoloControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (!r) {
- return;
- }
- r->set_control (SoloAutomation, val, group_override);
-}
-
-void
-Route::SoloControllable::set_value_unchecked (double val)
-{
- /* Used only by automation playback */
-
- _set_value (val, Controllable::NoGroup);
-}
-
-double
-Route::SoloControllable::get_value () const
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (!r) {
- return 0;
- }
-
- if (Config->get_solo_control_is_listen_control()) {
- return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
- } else {
- return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
- }
-}
-
-Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
- : RouteAutomationControl (name, MuteAutomation, boost::shared_ptr<AutomationList>(), r)
- , _route (r)
-{
- boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
- gl->set_interpolation(Evoral::ControlList::Discrete);
- set_list (gl);
-}
-
-void
-Route::MuteControllable::set_superficial_value(bool muted)
-{
- /* Note we can not use AutomationControl::set_value here since it will emit
- Changed(), but the value will not be correct to the observer. */
-
- const bool to_list = _list && ((AutomationList*)_list.get ())->automation_write ();
- const double where = _session.audible_frame ();
- if (to_list) {
- /* Note that we really need this:
- * if (as == Touch && _list->in_new_write_pass ()) {
- * alist->start_write_pass (_session.audible_frame ());
- * }
- * here in the case of the user calling from a GUI or whatever.
- * Without the ability to distinguish between user and
- * automation-initiated changes, we lose the "touch mute"
- * behaviour we have in AutomationController::toggled ().
- */
- _list->set_in_write_pass (true, false, where);
- }
-
- Control::set_double (muted, where, to_list);
-}
-
-void
-Route::MuteControllable::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
- if (writable()) {
- _set_value (val, group_override);
- }
-}
-
-void
-Route::MuteControllable::set_value_unchecked (double val)
-{
- /* used only automation playback */
- _set_value (val, Controllable::NoGroup);
-}
-
-void
-Route::MuteControllable::_set_value (double val, Controllable::GroupControlDisposition group_override)
-{
- boost::shared_ptr<Route> r = _route.lock ();
-
- if (!r) {
- return;
- }
-
- if (_list && ((AutomationList*)_list.get())->automation_playback()) {
- // Set superficial/automation value to drive controller (and possibly record)
- const bool bval = ((val >= 0.5) ? true : false);
- set_superficial_value (bval);
- // Playing back automation, set route mute directly
- r->set_mute (bval, Controllable::NoGroup);
- } else {
- r->set_control (MuteAutomation, val, group_override);
- }
-}
-
-double
-Route::MuteControllable::get_value () const
-{
- if (_list && ((AutomationList*)_list.get())->automation_playback()) {
- // Playing back automation, get the value from the list
- return AutomationControl::get_value();
- }
-
- // Not playing back automation, get the actual route mute value
- boost::shared_ptr<Route> r = _route.lock ();
- return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
-}
-
-Route::PhaseControllable::PhaseControllable (std::string name, boost::shared_ptr<Route> r)
- : RouteAutomationControl (name, PhaseAutomation, boost::shared_ptr<AutomationList>(), r)
- , _current_phase (0)
-{
- boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(PhaseAutomation)));
- gl->set_interpolation(Evoral::ControlList::Discrete);
- set_list (gl);
-}
-
-void
-Route::PhaseControllable::set_value (double v, PBD::Controllable::GroupControlDisposition /* group_override */)
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (r->phase_invert().size()) {
- if (v == 0 || (v < 1 && v > 0.9) ) {
- r->set_phase_invert (_current_phase, false);
- } else {
- r->set_phase_invert (_current_phase, true);
- }
- }
-}
-
-double
-Route::PhaseControllable::get_value () const
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (!r) {
- return 0.0;
- }
- return (double) r->phase_invert (_current_phase);
-}
-
-void
-Route::PhaseControllable::set_channel (uint32_t c)
-{
- _current_phase = c;
-}
-
-uint32_t
-Route::PhaseControllable::channel () const
-{
- return _current_phase;
-}
-
-Route::SoloIsolateControllable::SoloIsolateControllable (std::string name, boost::shared_ptr<Route> r)
- : RouteAutomationControl (name, SoloIsolateAutomation, boost::shared_ptr<AutomationList>(), r)
-{
- boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloIsolateAutomation)));
- gl->set_interpolation(Evoral::ControlList::Discrete);
- set_list (gl);
-}
-
-
-double
-Route::SoloIsolateControllable::get_value () const
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (!r) {
- return 0.0; /* "false" */
- }
-
- return r->solo_isolated() ? 1.0 : 0.0;
-}
-
-void
-Route::SoloIsolateControllable::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
-{
- _set_value (val, gcd);
-}
-
-void
-Route::SoloIsolateControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition)
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (!r) {
- return;
- }
-
- /* no group semantics yet */
- r->set_solo_isolated (val >= 0.5 ? true : false);
-}
-
-Route::SoloSafeControllable::SoloSafeControllable (std::string name, boost::shared_ptr<Route> r)
- : RouteAutomationControl (name, SoloSafeAutomation, boost::shared_ptr<AutomationList>(), r)
-{
- boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloSafeAutomation)));
- gl->set_interpolation(Evoral::ControlList::Discrete);
- set_list (gl);
-}
-
-void
-Route::SoloSafeControllable::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
-{
- _set_value (val, gcd);
-}
-
-void
-Route::SoloSafeControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition)
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (!r) {
- return;
- }
-
- /* no group semantics yet */
- r->set_solo_safe (val >= 0.5 ? true : false);
-}
-
-double
-Route::SoloSafeControllable::get_value () const
-{
- boost::shared_ptr<Route> r = _route.lock ();
- if (!r) {
- return 0.0; /* "false" */
- }
-
- return r->solo_safe() ? 1.0 : 0.0;
-}
-
diff --git a/libs/ardour/route_graph.cc b/libs/ardour/route_graph.cc
index ab88a0d..dfe61c4 100644
--- a/libs/ardour/route_graph.cc
+++ b/libs/ardour/route_graph.cc
@@ -20,8 +20,9 @@
#include "ardour/route.h"
#include "ardour/route_graph.h"
+#include "ardour/track.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -59,6 +60,24 @@ GraphEdges::find_in_from_to_with_sends (GraphVertex from, GraphVertex to)
return _from_to_with_sends.end ();
}
+GraphEdges::EdgeMapWithSends::iterator
+GraphEdges::find_recursively_in_from_to_with_sends (GraphVertex from, GraphVertex to)
+{
+ typedef EdgeMapWithSends::iterator Iter;
+ pair<Iter, Iter> r = _from_to_with_sends.equal_range (from);
+ for (Iter i = r.first; i != r.second; ++i) {
+ if (i->second.first == to) {
+ return i;
+ }
+ GraphEdges::EdgeMapWithSends::iterator t = find_recursively_in_from_to_with_sends (i->second.first, to);
+ if (t != _from_to_with_sends.end ()) {
+ return t;
+ }
+ }
+
+ return _from_to_with_sends.end ();
+}
+
/** @param via_sends_only if non-0, filled in with true if the edge is a
* path via a send only.
* @return true if the given edge is present.
@@ -78,6 +97,16 @@ GraphEdges::has (GraphVertex from, GraphVertex to, bool* via_sends_only)
return true;
}
+bool
+GraphEdges::feeds (GraphVertex from, GraphVertex to)
+{
+ EdgeMapWithSends::iterator i = find_recursively_in_from_to_with_sends (from, to);
+ if (i == _from_to_with_sends.end ()) {
+ return false;
+ }
+ return true;
+}
+
/** @return the vertices that are fed from `r' */
set<GraphVertex>
GraphEdges::from (GraphVertex r) const
@@ -167,21 +196,41 @@ struct RouteRecEnabledComparator
{
bool operator () (GraphVertex r1, GraphVertex r2) const
{
- if (r1->record_enabled()) {
- if (r2->record_enabled()) {
+ boost::shared_ptr<Track> t1 (boost::dynamic_pointer_cast<Track>(r1));
+ boost::shared_ptr<Track> t2 (boost::dynamic_pointer_cast<Track>(r2));
+ PresentationInfo::order_t r1o = r1->presentation_info().order();
+ PresentationInfo::order_t r2o = r2->presentation_info().order();
+
+ if (!t1) {
+ if (!t2) {
+ /* makes no difference which is first, use presentation order */
+ return r1o < r2o;
+ } else {
+ /* r1 is not a track, r2 is, run it early */
+ return false;
+ }
+ }
+
+ if (!t2) {
+ /* we already tested !t1, so just use presentation order */
+ return r1o < r2o;
+ }
+
+ if (t1->rec_enable_control()->get_value()) {
+ if (t2->rec_enable_control()->get_value()) {
/* both rec-enabled, just use signal order */
- return r1->order_key () < r2->order_key ();
+ return r1o < r2o;
} else {
- /* r1 rec-enabled, r2 not rec-enabled, run r2 early */
+ /* t1 rec-enabled, t2 not rec-enabled, run t2 early */
return false;
}
} else {
- if (r2->record_enabled()) {
- /* r2 rec-enabled, r1 not rec-enabled, run r1 early */
+ if (t2->rec_enable_control()->get_value()) {
+ /* t2 rec-enabled, t1 not rec-enabled, run t1 early */
return true;
} else {
- /* neither rec-enabled, use signal order */
- return r1->order_key () < r2->order_key ();
+ /* neither rec-enabled, use presentation order */
+ return r1o < r2o;
}
}
}
diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc
index 5b5a8f2..1a7b980 100644
--- a/libs/ardour/route_group.cc
+++ b/libs/ardour/route_group.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2000-2009 Paul Davis
+ Copyright (C) 2000-2016 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -24,14 +24,19 @@
#include "pbd/error.h"
#include "pbd/enumwriter.h"
#include "pbd/strsplit.h"
+#include "pbd/debug.h"
#include "ardour/amp.h"
#include "ardour/audio_track.h"
+#include "ardour/debug.h"
+#include "ardour/monitor_control.h"
#include "ardour/route.h"
#include "ardour/route_group.h"
#include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -39,62 +44,70 @@ using namespace std;
namespace ARDOUR {
namespace Properties {
- PropertyDescriptor<bool> relative;
PropertyDescriptor<bool> active;
- PropertyDescriptor<bool> gain;
- PropertyDescriptor<bool> mute;
- PropertyDescriptor<bool> solo;
- PropertyDescriptor<bool> recenable;
- PropertyDescriptor<bool> select;
- PropertyDescriptor<bool> route_active;
- PropertyDescriptor<bool> color;
- PropertyDescriptor<bool> monitoring;
+ PropertyDescriptor<bool> group_relative;
+ PropertyDescriptor<bool> group_gain;
+ PropertyDescriptor<bool> group_mute;
+ PropertyDescriptor<bool> group_solo;
+ PropertyDescriptor<bool> group_recenable;
+ PropertyDescriptor<bool> group_select;
+ PropertyDescriptor<bool> group_route_active;
+ PropertyDescriptor<bool> group_color;
+ PropertyDescriptor<bool> group_monitoring;
+ PropertyDescriptor<int32_t> group_master_number;
}
}
void
RouteGroup::make_property_quarks ()
{
- Properties::relative.property_id = g_quark_from_static_string (X_("relative"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for relative = %1\n", Properties::relative.property_id));
Properties::active.property_id = g_quark_from_static_string (X_("active"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for active = %1\n", Properties::active.property_id));
- Properties::hidden.property_id = g_quark_from_static_string (X_("hidden"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for hidden = %1\n", Properties::hidden.property_id));
- Properties::gain.property_id = g_quark_from_static_string (X_("gain"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for gain = %1\n", Properties::gain.property_id));
- Properties::mute.property_id = g_quark_from_static_string (X_("mute"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for mute = %1\n", Properties::mute.property_id));
- Properties::solo.property_id = g_quark_from_static_string (X_("solo"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for solo = %1\n", Properties::solo.property_id));
- Properties::recenable.property_id = g_quark_from_static_string (X_("recenable"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for recenable = %1\n", Properties::recenable.property_id));
- Properties::select.property_id = g_quark_from_static_string (X_("select"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for select = %1\n", Properties::select.property_id));
- Properties::route_active.property_id = g_quark_from_static_string (X_("route-active"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for route-active = %1\n", Properties::route_active.property_id));
- Properties::color.property_id = g_quark_from_static_string (X_("color"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n", Properties::color.property_id));
- Properties::monitoring.property_id = g_quark_from_static_string (X_("monitoring"));
- DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for monitoring = %1\n", Properties::monitoring.property_id));
-}
-
-#define ROUTE_GROUP_DEFAULT_PROPERTIES _relative (Properties::relative, true) \
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for active = %1\n", Properties::active.property_id));
+
+ Properties::group_relative.property_id = g_quark_from_static_string (X_("relative"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for relative = %1\n", Properties::group_relative.property_id));
+ Properties::group_gain.property_id = g_quark_from_static_string (X_("gain"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for gain = %1\n", Properties::group_gain.property_id));
+ Properties::group_mute.property_id = g_quark_from_static_string (X_("mute"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for mute = %1\n", Properties::group_mute.property_id));
+ Properties::group_solo.property_id = g_quark_from_static_string (X_("solo"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for solo = %1\n", Properties::group_solo.property_id));
+ Properties::group_recenable.property_id = g_quark_from_static_string (X_("recenable"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for recenable = %1\n", Properties::group_recenable.property_id));
+ Properties::group_select.property_id = g_quark_from_static_string (X_("select"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for select = %1\n", Properties::group_select.property_id));
+ Properties::group_route_active.property_id = g_quark_from_static_string (X_("route-active"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for route-active = %1\n", Properties::group_route_active.property_id));
+ Properties::group_color.property_id = g_quark_from_static_string (X_("color"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n", Properties::group_color.property_id));
+ Properties::group_monitoring.property_id = g_quark_from_static_string (X_("monitoring"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for monitoring = %1\n", Properties::group_monitoring.property_id));
+ Properties::group_master_number.property_id = g_quark_from_static_string (X_("group-master-number"));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for group-master-number = %1\n", Properties::group_master_number.property_id));
+}
+
+#define ROUTE_GROUP_DEFAULT_PROPERTIES _relative (Properties::group_relative, true) \
, _active (Properties::active, true) \
, _hidden (Properties::hidden, false) \
- , _gain (Properties::gain, true) \
- , _mute (Properties::mute, true) \
- , _solo (Properties::solo, true) \
- , _recenable (Properties::recenable, true) \
- , _select (Properties::select, true) \
- , _route_active (Properties::route_active, true) \
- , _color (Properties::color, true) \
- , _monitoring (Properties::monitoring, true)
+ , _gain (Properties::group_gain, true) \
+ , _mute (Properties::group_mute, true) \
+ , _solo (Properties::group_solo, true) \
+ , _recenable (Properties::group_recenable, true) \
+ , _select (Properties::group_select, true) \
+ , _route_active (Properties::group_route_active, true) \
+ , _color (Properties::group_color, true) \
+ , _monitoring (Properties::group_monitoring, true) \
+ , _group_master_number (Properties::group_master_number, -1)
RouteGroup::RouteGroup (Session& s, const string &n)
: SessionObject (s, n)
, routes (new RouteList)
, ROUTE_GROUP_DEFAULT_PROPERTIES
+ , _solo_group (new ControlGroup (SoloAutomation))
+ , _mute_group (new ControlGroup (MuteAutomation))
+ , _rec_enable_group (new ControlGroup (RecEnableAutomation))
+ , _gain_group (new GainControlGroup ())
+ , _monitoring_group (new ControlGroup (MonitoringAutomation))
{
_xml_node_name = X_("RouteGroup");
@@ -109,16 +122,29 @@ RouteGroup::RouteGroup (Session& s, const string &n)
add_property (_route_active);
add_property (_color);
add_property (_monitoring);
+ add_property (_group_master_number);
}
RouteGroup::~RouteGroup ()
{
+ _solo_group->clear ();
+ _mute_group->clear ();
+ _gain_group->clear ();
+ _rec_enable_group->clear ();
+ _monitoring_group->clear ();
+
+ boost::shared_ptr<VCA> vca (group_master.lock());
+
for (RouteList::iterator i = routes->begin(); i != routes->end();) {
RouteList::iterator tmp = i;
++tmp;
(*i)->set_route_group (0);
+ if (vca) {
+ (*i)->unassign (vca);
+ }
+
i = tmp;
}
}
@@ -139,9 +165,24 @@ RouteGroup::add (boost::shared_ptr<Route> r)
routes->push_back (r);
+ _solo_group->add_control (r->solo_control());
+ _mute_group->add_control (r->mute_control());
+ _gain_group->add_control (r->gain_control());
+ boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (r);
+ if (trk) {
+ _rec_enable_group->add_control (trk->rec_enable_control());
+ _monitoring_group->add_control (trk->monitoring_control());
+ }
+
r->set_route_group (this);
r->DropReferences.connect_same_thread (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr<Route> (r)));
+ boost::shared_ptr<VCA> vca (group_master.lock());
+
+ if (vca) {
+ r->assign (vca);
+ }
+
_session.set_dirty ();
RouteAdded (this, boost::weak_ptr<Route> (r)); /* EMIT SIGNAL */
return 0;
@@ -164,58 +205,30 @@ RouteGroup::remove (boost::shared_ptr<Route> r)
if ((i = find (routes->begin(), routes->end(), r)) != routes->end()) {
r->set_route_group (0);
- routes->erase (i);
- _session.set_dirty ();
- RouteRemoved (this, boost::weak_ptr<Route> (r)); /* EMIT SIGNAL */
- return 0;
- }
-
- return -1;
-}
+ boost::shared_ptr<VCA> vca = group_master.lock();
-gain_t
-RouteGroup::get_min_factor (gain_t factor)
-{
- for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
- gain_t const g = (*i)->gain_control()->get_value();
-
- if ((g + g * factor) >= 0.0f) {
- continue;
+ if (vca) {
+ r->unassign (vca);
}
- if (g <= 0.0000003f) {
- return 0.0f;
+ _solo_group->remove_control (r->solo_control());
+ _mute_group->remove_control (r->mute_control());
+ _gain_group->remove_control (r->gain_control());
+ boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (r);
+ if (trk) {
+ _rec_enable_group->remove_control (trk->rec_enable_control());
+ _monitoring_group->remove_control (trk->monitoring_control());
}
-
- factor = 0.0000003f / g - 1.0f;
+ routes->erase (i);
+ _session.set_dirty ();
+ RouteRemoved (this, boost::weak_ptr<Route> (r)); /* EMIT SIGNAL */
+ return 0;
}
- return factor;
+ return -1;
}
-gain_t
-RouteGroup::get_max_factor (gain_t factor)
-{
- for (RouteList::iterator i = routes->begin(); i != routes->end(); i++) {
- gain_t const g = (*i)->gain_control()->get_value();
-
- // if the current factor woulnd't raise this route above maximum
- if ((g + g * factor) <= 1.99526231f) {
- continue;
- }
-
- // if route gain is already at peak, return 0.0f factor
- if (g >= 1.99526231f) {
- return 0.0f;
- }
-
- // factor is calculated so that it would raise current route to max
- factor = 1.99526231f / g - 1.0f;
- }
-
- return factor;
-}
XMLNode&
RouteGroup::get_state ()
@@ -248,7 +261,7 @@ RouteGroup::set_state (const XMLNode& node, int version)
return set_state_2X (node, version);
}
- const XMLProperty *prop;
+ XMLProperty const * prop;
set_id (node);
set_values (node);
@@ -268,6 +281,19 @@ RouteGroup::set_state (const XMLNode& node, int version)
}
}
+ if (_group_master_number.val() > 0) {
+ boost::shared_ptr<VCA> vca = _session.vca_manager().vca_by_number (_group_master_number.val());
+ if (vca) {
+ /* no need to do the assignment because slaves will
+ handle that themselves. But we can set group_master
+ to use with future assignments of newly added routes.
+ */
+ group_master = vca;
+ }
+ }
+
+ push_to_groups ();
+
return 0;
}
@@ -292,6 +318,8 @@ RouteGroup::set_state_2X (const XMLNode& node, int /*version*/)
_color = false;
}
+ push_to_groups ();
+
return 0;
}
@@ -301,8 +329,14 @@ RouteGroup::set_gain (bool yn)
if (is_gain() == yn) {
return;
}
+ if (has_control_master()) {
+ return;
+ }
+
_gain = yn;
- send_change (PropertyChange (Properties::gain));
+ _gain_group->set_active (yn);
+
+ send_change (PropertyChange (Properties::group_gain));
}
void
@@ -312,7 +346,9 @@ RouteGroup::set_mute (bool yn)
return;
}
_mute = yn;
- send_change (PropertyChange (Properties::mute));
+ _mute_group->set_active (yn);
+
+ send_change (PropertyChange (Properties::group_mute));
}
void
@@ -322,7 +358,9 @@ RouteGroup::set_solo (bool yn)
return;
}
_solo = yn;
- send_change (PropertyChange (Properties::solo));
+ _solo_group->set_active (yn);
+
+ send_change (PropertyChange (Properties::group_solo));
}
void
@@ -332,7 +370,8 @@ RouteGroup::set_recenable (bool yn)
return;
}
_recenable = yn;
- send_change (PropertyChange (Properties::recenable));
+ _rec_enable_group->set_active (yn);
+ send_change (PropertyChange (Properties::group_recenable));
}
void
@@ -342,7 +381,7 @@ RouteGroup::set_select (bool yn)
return;
}
_select = yn;
- send_change (PropertyChange (Properties::select));
+ send_change (PropertyChange (Properties::group_select));
}
void
@@ -352,7 +391,7 @@ RouteGroup::set_route_active (bool yn)
return;
}
_route_active = yn;
- send_change (PropertyChange (Properties::route_active));
+ send_change (PropertyChange (Properties::group_route_active));
}
void
@@ -363,7 +402,7 @@ RouteGroup::set_color (bool yn)
}
_color = yn;
- send_change (PropertyChange (Properties::color));
+ send_change (PropertyChange (Properties::group_color));
/* This is a bit of a hack, but this might change
our route's effective color, so emit gui_changed
@@ -383,7 +422,9 @@ RouteGroup::set_monitoring (bool yn)
}
_monitoring = yn;
- send_change (PropertyChange (Properties::monitoring));
+ _monitoring_group->set_active (yn);
+
+ send_change (PropertyChange (Properties::group_monitoring));
_session.set_dirty ();
}
@@ -396,6 +437,9 @@ RouteGroup::set_active (bool yn, void* /*src*/)
}
_active = yn;
+
+ push_to_groups ();
+
send_change (PropertyChange (Properties::active));
_session.set_dirty ();
}
@@ -406,8 +450,12 @@ RouteGroup::set_relative (bool yn, void* /*src*/)
if (is_relative() == yn) {
return;
}
+
_relative = yn;
- send_change (PropertyChange (Properties::relative));
+
+ push_to_groups ();
+
+ send_change (PropertyChange (Properties::group_relative));
_session.set_dirty ();
}
@@ -475,7 +523,7 @@ RouteGroup::make_subgroup (bool aux, Placement placement)
* (since tracks can't have fewer outs than ins,
* "nin" currently defines the number of outpus if nin > 2)
*/
- rl = _session.new_audio_route (nin, 2 /*XXX*/, 0, 1);
+ rl = _session.new_audio_route (nin, 2, 0, 1, string(), PresentationInfo::AudioBus, PresentationInfo::max_order);
} catch (...) {
return;
}
@@ -530,3 +578,91 @@ RouteGroup::enabled_property (PBD::PropertyID prop)
return dynamic_cast<const PropertyTemplate<bool>* > (i->second)->val ();
}
+
+void
+RouteGroup::post_set (PBD::PropertyChange const &)
+{
+ push_to_groups ();
+}
+
+void
+RouteGroup::push_to_groups ()
+{
+ if (is_relative()) {
+ _gain_group->set_mode (ControlGroup::Mode (_gain_group->mode()|ControlGroup::Relative));
+ } else {
+ _gain_group->set_mode (ControlGroup::Mode (_gain_group->mode()&~ControlGroup::Relative));
+ }
+
+ if (_active) {
+ _gain_group->set_active (is_gain());
+ _solo_group->set_active (is_solo());
+ _mute_group->set_active (is_mute());
+ _rec_enable_group->set_active (is_recenable());
+ _monitoring_group->set_active (is_monitoring());
+ } else {
+ _gain_group->set_active (false);
+ _solo_group->set_active (false);
+ _mute_group->set_active (false);
+ _rec_enable_group->set_active (false);
+ _monitoring_group->set_active (false);
+ }
+}
+
+void
+RouteGroup::assign_master (boost::shared_ptr<VCA> master)
+{
+ if (!routes || routes->empty()) {
+ return;
+ }
+
+ boost::shared_ptr<Route> front = routes->front ();
+
+ if (front->slaved_to (master)) {
+ return;
+ }
+
+ for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
+ (*r)->assign (master);
+ }
+
+ group_master = master;
+ _group_master_number = master->number();
+}
+
+void
+RouteGroup::unassign_master (boost::shared_ptr<VCA> master)
+{
+ if (!routes || routes->empty()) {
+ return;
+ }
+
+ boost::shared_ptr<Route> front = routes->front ();
+
+ if (!front->slaved_to (master)) {
+ return;
+ }
+
+ for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
+ (*r)->unassign (master);
+ }
+
+ group_master.reset ();
+ _group_master_number = -1;
+}
+
+bool
+RouteGroup::slaved () const
+{
+ if (!routes || routes->empty()) {
+ return false;
+ }
+
+ return routes->front()->slaved ();
+}
+
+bool
+RouteGroup::has_control_master() const
+{
+ return group_master.lock() != 0;
+}
diff --git a/libs/ardour/route_group_member.cc b/libs/ardour/route_group_member.cc
index 9ca94bf..280d193 100644
--- a/libs/ardour/route_group_member.cc
+++ b/libs/ardour/route_group_member.cc
@@ -41,7 +41,7 @@ RouteGroupMember::use_group (PBD::Controllable::GroupControlDisposition gcd, boo
{
bool active_for_predicate = _route_group && (_route_group->*predicate)() && _route_group->is_active();
- return (gcd != PBD::Controllable::NoGroup) &&
+ return ((gcd != PBD::Controllable::NoGroup) && (gcd != PBD::Controllable::ForGroup)) &&
_route_group &&
((active_for_predicate && (gcd != PBD::Controllable::InverseGroup)) ||
(!active_for_predicate && (gcd == PBD::Controllable::InverseGroup)));
diff --git a/libs/ardour/scene_change.cc b/libs/ardour/scene_change.cc
index aed8995..e9d3195 100644
--- a/libs/ardour/scene_change.cc
+++ b/libs/ardour/scene_change.cc
@@ -19,7 +19,7 @@
#include "ardour/midi_scene_change.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
@@ -30,7 +30,7 @@ const uint32_t SceneChange::out_of_bound_color = 0x00000000; /* note: zero alpha
boost::shared_ptr<SceneChange>
SceneChange::factory (const XMLNode& node, int version)
{
- const XMLProperty* prop = node.property (X_("type"));
+ XMLProperty const * prop = node.property (X_("type"));
if (prop->value() == X_("MIDI")) {
return boost::shared_ptr<SceneChange> (new MIDISceneChange (node, version));
diff --git a/libs/ardour/search_paths.cc b/libs/ardour/search_paths.cc
index 50ecac6..96df905 100644
--- a/libs/ardour/search_paths.cc
+++ b/libs/ardour/search_paths.cc
@@ -38,6 +38,7 @@ namespace {
const char * const backend_env_variable_name = "ARDOUR_BACKEND_PATH";
const char * const surfaces_env_variable_name = "ARDOUR_SURFACES_PATH";
const char * const export_env_variable_name = "ARDOUR_EXPORT_FORMATS_PATH";
+ const char * const theme_env_variable_name = "ARDOUR_THEMES_PATH";
const char * const ladspa_env_variable_name = "LADSPA_PATH";
const char * const midi_patch_env_variable_name = "ARDOUR_MIDI_PATCH_PATH";
const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH";
@@ -70,6 +71,16 @@ control_protocol_search_path ()
}
Searchpath
+theme_search_path ()
+{
+ Searchpath spath (ardour_data_search_path ());
+ spath.add_subdirectory_to_paths (theme_dir_name);
+
+ spath += Searchpath(Glib::getenv(theme_env_variable_name));
+ return spath;
+}
+
+Searchpath
export_formats_search_path ()
{
Searchpath spath (ardour_data_search_path());
@@ -163,6 +174,15 @@ route_template_search_path ()
return spath;
}
+Searchpath
+lua_search_path ()
+{
+ Searchpath spath (ardour_data_search_path());
+ spath.add_subdirectory_to_paths(lua_dir_name);
+
+ return spath;
+}
+
#ifdef PLATFORM_WINDOWS
const char*
@@ -195,6 +215,7 @@ vst_search_path ()
}
if (p == 0) {
+#if ( (defined __i386__) || (defined _M_IX86) )
char *pVSTx86 = 0;
std::string pProgFilesX86 = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILESX86);
@@ -209,22 +230,21 @@ vst_search_path ()
g_free (pVSTx86);
}
}
+#else
+ // Look for a VST folder under C:\Program Files
+ char *pVST = 0;
+ std::string pProgFiles = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
- if (p == 0) {
- // Look for a VST folder under C:\Program Files
- char *pVST = 0;
- std::string pProgFiles = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
-
- if (!pProgFiles.empty()) {
- if ((pVST = g_build_filename (pProgFiles.c_str(), "Steinberg", "VSTPlugins", NULL))) {
- if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS))
- if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR))
- p = g_build_filename (pVST, NULL);
+ if (!pProgFiles.empty()) {
+ if ((pVST = g_build_filename (pProgFiles.c_str(), "Steinberg", "VSTPlugins", NULL))) {
+ if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS))
+ if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR))
+ p = g_build_filename (pVST, NULL);
- g_free (pVST);
- }
+ g_free (pVST);
}
}
+#endif
}
if (p == 0) {
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc
index 23ae860..d0049ff 100644
--- a/libs/ardour/send.cc
+++ b/libs/ardour/send.cc
@@ -21,9 +21,9 @@
#include <algorithm>
#include "pbd/xml++.h"
-#include "pbd/boost_debug.h"
#include "ardour/amp.h"
+#include "ardour/boost_debug.h"
#include "ardour/buffer_set.h"
#include "ardour/debug.h"
#include "ardour/gain_control.h"
@@ -33,7 +33,7 @@
#include "ardour/send.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
class AutomationControl;
@@ -77,6 +77,7 @@ Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMas
, _metering (false)
, _delay_in (0)
, _delay_out (0)
+ , _remove_on_disconnect (false)
{
if (_role == Listen) {
/* we don't need to do this but it keeps things looking clean
@@ -99,6 +100,9 @@ Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMas
if (panner_shell()) {
panner_shell()->Changed.connect_same_thread (*this, boost::bind (&Send::panshell_changed, this));
}
+ if (_output) {
+ _output->changed.connect_same_thread (*this, boost::bind (&Send::snd_output_changed, this, _1, _2));
+ }
}
Send::~Send ()
@@ -155,7 +159,7 @@ Send::set_delay_out(framecnt_t delay)
}
void
-Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
{
if (_output->n_ports() == ChanCount::ZERO) {
_meter->reset ();
@@ -181,13 +185,13 @@ Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframe
_amp->set_gain_automation_buffer (_session.send_gain_automation_buffer ());
_amp->setup_gain_automation (start_frame, end_frame, nframes);
- _amp->run (sendbufs, start_frame, end_frame, nframes, true);
+ _amp->run (sendbufs, start_frame, end_frame, speed, nframes, true);
- _delayline->run (sendbufs, start_frame, end_frame, nframes, true);
+ _delayline->run (sendbufs, start_frame, end_frame, speed, nframes, true);
/* deliver to outputs */
- Delivery::run (sendbufs, start_frame, end_frame, nframes, true);
+ Delivery::run (sendbufs, start_frame, end_frame, speed, nframes, true);
/* consider metering */
@@ -195,7 +199,7 @@ Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframe
if (_amp->gain_control()->get_value() == 0) {
_meter->reset();
} else {
- _meter->run (*_output_buffers, start_frame, end_frame, nframes, true);
+ _meter->run (*_output_buffers, start_frame, end_frame, speed, nframes, true);
}
}
@@ -221,6 +225,8 @@ Send::state (bool full)
node.add_property ("bitslot", buf);
}
+ node.add_property("selfdestruct", _remove_on_disconnect ? "yes" : "no");
+
node.add_child_nocopy (_amp->state (full));
return node;
@@ -233,7 +239,7 @@ Send::set_state (const XMLNode& node, int version)
return set_state_2X (node, version);
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
Delivery::set_state (node, version);
@@ -268,6 +274,10 @@ Send::set_state (const XMLNode& node, int version)
}
}
+ if ((prop = node.property (X_("selfdestruct"))) != 0) {
+ _remove_on_disconnect = string_is_affirmative (prop->value());
+ }
+
XMLNodeList nlist = node.children();
for (XMLNodeIterator i = nlist.begin(); i != nlist.end(); ++i) {
if ((*i)->name() == X_("Processor")) {
@@ -399,7 +409,18 @@ Send::display_to_user () const
}
string
-Send::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Send::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
return _amp->value_as_string (ac);
}
+
+void
+Send::snd_output_changed (IOChange change, void* /*src*/)
+{
+ if (change.type & IOChange::ConnectionsChanged) {
+ if (!_output->connected() && _remove_on_disconnect) {
+ _remove_on_disconnect = false;
+ SelfDestruct (); /* EMIT SIGNAL */
+ }
+ }
+}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 75547b5..61bfce1 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -36,12 +36,12 @@
#include <boost/algorithm/string/erase.hpp>
#include "pbd/basename.h"
-#include "pbd/boost_debug.h"
#include "pbd/convert.h"
#include "pbd/convert.h"
#include "pbd/error.h"
#include "pbd/file_utils.h"
#include "pbd/md5.h"
+#include "pbd/pthread_utils.h"
#include "pbd/search_path.h"
#include "pbd/stacktrace.h"
#include "pbd/stl_delete.h"
@@ -58,6 +58,7 @@
#include "ardour/audioengine.h"
#include "ardour/audiofilesource.h"
#include "ardour/auditioner.h"
+#include "ardour/boost_debug.h"
#include "ardour/buffer_manager.h"
#include "ardour/buffer_set.h"
#include "ardour/bundle.h"
@@ -73,6 +74,7 @@
#include "ardour/filename_extensions.h"
#include "ardour/gain_control.h"
#include "ardour/graph.h"
+#include "ardour/luabindings.h"
#include "ardour/midiport_manager.h"
#include "ardour/scene_changer.h"
#include "ardour/midi_patch_manager.h"
@@ -88,25 +90,31 @@
#include "ardour/recent_sessions.h"
#include "ardour/region.h"
#include "ardour/region_factory.h"
+#include "ardour/revision.h"
#include "ardour/route_graph.h"
#include "ardour/route_group.h"
-#include "ardour/route_sorters.h"
#include "ardour/send.h"
#include "ardour/session.h"
#include "ardour/session_directory.h"
#include "ardour/session_playlists.h"
#include "ardour/smf_source.h"
+#include "ardour/solo_isolate_control.h"
#include "ardour/source_factory.h"
#include "ardour/speakers.h"
#include "ardour/tempo.h"
+#include "ardour/ticker.h"
#include "ardour/track.h"
#include "ardour/user_bundle.h"
#include "ardour/utils.h"
+#include "ardour/vca_manager.h"
+#include "ardour/vca.h"
#include "midi++/port.h"
#include "midi++/mmc.h"
-#include "i18n.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
#include <glibmm/checksum.h>
@@ -122,11 +130,13 @@ using namespace PBD;
bool Session::_disable_all_loaded_plugins = false;
bool Session::_bypass_all_loaded_plugins = false;
+guint Session::_name_id_counter = 0;
PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
PBD::Signal1<void,std::string> Session::Dialog;
PBD::Signal0<int> Session::AskAboutPendingState;
PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
+PBD::Signal2<void, framecnt_t, framecnt_t> Session::NotifyAboutSampleRateMismatch;
PBD::Signal0<void> Session::SendFeedback;
PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
@@ -162,12 +172,13 @@ Session::Session (AudioEngine &eng,
, _bounce_processing_active (false)
, waiting_for_sync_offset (false)
, _base_frame_rate (0)
- , _current_frame_rate (0)
, _nominal_frame_rate (0)
+ , _current_frame_rate (0)
, transport_sub_state (0)
, _record_status (Disabled)
, _transport_frame (0)
, _session_range_location (0)
+ , _session_range_end_is_free (true)
, _slave (0)
, _silent (false)
, _transport_speed (0)
@@ -201,8 +212,10 @@ Session::Session (AudioEngine &eng,
, post_export_sync (false)
, post_export_position (0)
, _exporting (false)
- , _export_started (false)
, _export_rolling (false)
+ , _realtime_export (false)
+ , _export_preroll (0)
+ , _export_latency (0)
, _pre_export_mmc_enabled (false)
, _name (snapshot_name)
, _is_new (true)
@@ -227,6 +240,9 @@ Session::Session (AudioEngine &eng,
, pending_locate_flush (false)
, pending_abort (false)
, pending_auto_loop (false)
+ , _mempool ("Session", 2097152)
+ , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
+ , _n_lua_scripts (0)
, _butler (new Butler (*this))
, _post_transport_work (0)
, cumulative_rf_motion (0)
@@ -235,6 +251,8 @@ Session::Session (AudioEngine &eng,
, _ignore_skips_updates (false)
, _rt_thread_active (false)
, _rt_emit_pending (false)
+ , _ac_thread_active (false)
+ , _latency_recompute_pending (0)
, step_speed (0)
, outbound_mtc_timecode_frame (0)
, next_quarter_frame_to_send (-1)
@@ -290,23 +308,34 @@ Session::Session (AudioEngine &eng,
, first_file_header_format_reset (true)
, have_looped (false)
, _have_rec_enabled_track (false)
- , _have_rec_disabled_track (true)
+ , _have_rec_disabled_track (true)
, _step_editors (0)
, _suspend_timecode_transmission (0)
, _speakers (new Speakers)
- , _order_hint (-1)
, ignore_route_processor_changes (false)
+ , midi_clock (0)
, _scene_changer (0)
, _midi_ports (0)
, _mmc (0)
+ , _vca_manager (new VCAManager (*this))
{
uint32_t sr = 0;
+ created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
+
pthread_mutex_init (&_rt_emit_mutex, 0);
pthread_cond_init (&_rt_emit_cond, 0);
+ pthread_mutex_init (&_auto_connect_mutex, 0);
+ pthread_cond_init (&_auto_connect_cond, 0);
+
+ init_name_id_counter (1); // reset for new sessions, start at 1
+ VCA::set_next_vca_number (1); // reset for new sessions, start at 1
+
pre_engine_init (fullpath);
+ setup_lua ();
+
if (_is_new) {
Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
@@ -314,7 +343,7 @@ Session::Session (AudioEngine &eng,
#ifdef USE_TRACKS_CODE_FEATURES
sr = EngineStateController::instance()->get_current_sample_rate();
#endif
- if (ensure_engine (sr)) {
+ if (ensure_engine (sr, true)) {
destroy ();
throw SessionException (_("Cannot connect to audio/midi engine"));
}
@@ -362,13 +391,14 @@ Session::Session (AudioEngine &eng,
*/
if (state_tree) {
- const XMLProperty* prop;
- if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
+ XMLProperty const * prop;
+ XMLNode const * root (state_tree->root());
+ if ((prop = root->property (X_("sample-rate"))) != 0) {
sr = atoi (prop->value());
}
}
- if (ensure_engine (sr)) {
+ if (ensure_engine (sr, false)) {
destroy ();
throw SessionException (_("Cannot connect to audio/midi engine"));
}
@@ -396,6 +426,7 @@ Session::Session (AudioEngine &eng,
EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
emit_thread_start ();
+ auto_connect_thread_start ();
/* hook us up to the engine since we are now completely constructed */
@@ -461,8 +492,26 @@ Session::~Session ()
destroy ();
}
+unsigned int
+Session::next_name_id ()
+{
+ return g_atomic_int_add (&_name_id_counter, 1);
+}
+
+unsigned int
+Session::name_id_counter ()
+{
+ return g_atomic_int_get (&_name_id_counter);
+}
+
+void
+Session::init_name_id_counter (guint n)
+{
+ g_atomic_int_set (&_name_id_counter, n);
+}
+
int
-Session::ensure_engine (uint32_t desired_sample_rate)
+Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
{
if (_engine.current_backend() == 0) {
/* backend is unknown ... */
@@ -470,6 +519,8 @@ Session::ensure_engine (uint32_t desired_sample_rate)
if (r.get_value_or (-1) != 0) {
return -1;
}
+ } else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
+ /* keep engine */
} else if (_engine.setup_required()) {
/* backend is known, but setup is needed */
boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
@@ -482,8 +533,7 @@ Session::ensure_engine (uint32_t desired_sample_rate)
}
}
- /* at this point the engine should be running
- */
+ /* at this point the engine should be running */
if (!_engine.running()) {
return -1;
@@ -521,6 +571,7 @@ Session::immediately_post_engine ()
}
try {
+ LocaleGuard lg;
BootMessage (_("Set up LTC"));
setup_ltc ();
BootMessage (_("Set up Click"));
@@ -555,8 +606,12 @@ Session::destroy ()
_state_of_the_state = StateOfTheState (CannotSave|Deletion);
+ /* stop autoconnecting */
+ auto_connect_thread_terminate ();
+
/* disconnect from any and all signals that we are connected to */
+ Port::PortSignalDrop (); /* EMIT SIGNAL */
drop_connections ();
/* shutdown control surface protocols while we still have ports
@@ -590,8 +645,19 @@ Session::destroy ()
delete state_tree;
state_tree = 0;
- /* reset dynamic state version back to default */
+ // unregister all lua functions, drop held references (if any)
+ (*_lua_cleanup)();
+ lua.do_command ("Session = nil");
+ delete _lua_run;
+ delete _lua_add;
+ delete _lua_del;
+ delete _lua_list;
+ delete _lua_save;
+ delete _lua_load;
+ delete _lua_cleanup;
+ lua.collect_garbage ();
+ /* reset dynamic state version back to default */
Stateful::loading_state_version = 0;
_butler->drop_references ();
@@ -638,6 +704,11 @@ Session::destroy ()
DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
RegionFactory::delete_all_regions ();
+ /* Do this early so that VCAs no longer hold references to routes */
+
+ DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
+ delete _vca_manager;
+
DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
/* reset these three references to special routes before we do the usual route delete thing */
@@ -678,6 +749,9 @@ Session::destroy ()
pthread_cond_destroy (&_rt_emit_cond);
pthread_mutex_destroy (&_rt_emit_mutex);
+ pthread_cond_destroy (&_auto_connect_cond);
+ pthread_mutex_destroy (&_auto_connect_mutex);
+
delete _scene_changer; _scene_changer = 0;
delete midi_control_ui; midi_control_ui = 0;
@@ -685,13 +759,48 @@ Session::destroy ()
delete _midi_ports; _midi_ports = 0;
delete _locations; _locations = 0;
+ delete midi_clock;
delete _tempo_map;
+ /* clear event queue, the session is gone, nobody is interested in
+ * those anymore, but they do leak memory if not removed
+ */
+ while (!immediate_events.empty ()) {
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+ SessionEvent *ev = immediate_events.front ();
+ DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
+ immediate_events.pop_front ();
+ bool remove = true;
+ bool del = true;
+ switch (ev->type) {
+ case SessionEvent::AutoLoop:
+ case SessionEvent::AutoLoopDeclick:
+ case SessionEvent::Skip:
+ case SessionEvent::PunchIn:
+ case SessionEvent::PunchOut:
+ case SessionEvent::StopOnce:
+ case SessionEvent::RangeStop:
+ case SessionEvent::RangeLocate:
+ remove = false;
+ del = false;
+ break;
+ case SessionEvent::RealTimeOperation:
+ process_rtop (ev);
+ del = false;
+ default:
+ break;
+ }
+ if (remove) {
+ del = del && !_remove_event (ev);
+ }
+ if (del) {
+ delete ev;
+ }
+ }
+
DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- boost_debug_list_ptrs ();
-#endif
+ BOOST_SHOW_POINTERS ();
}
void
@@ -1023,11 +1132,16 @@ Session::remove_monitor_section ()
}
remove_route (_monitor_out);
+ if (_state_of_the_state & Deletion) {
+ return;
+ }
+
auto_connect_master_bus ();
if (auditioner) {
auditioner->connect ();
}
+
Config->ParameterChanged ("use-monitor-bus");
}
@@ -1040,15 +1154,14 @@ Session::add_monitor_section ()
return;
}
- boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
+ boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
if (r->init ()) {
return;
}
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
+ BOOST_MARK_ROUTE(r);
+
try {
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
@@ -1059,7 +1172,7 @@ Session::add_monitor_section ()
}
rl.push_back (r);
- add_routes (rl, false, false, false);
+ add_routes (rl, false, false, false, 0);
assert (_monitor_out);
@@ -1099,7 +1212,7 @@ Session::add_monitor_section ()
/* if monitor section is not connected, connect it to physical outs
*/
- if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
+ if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
if (!Config->get_monitor_bus_preferred_bundle().empty()) {
@@ -1205,8 +1318,12 @@ Session::reset_monitor_section ()
_master_out->output()->disconnect (this);
_monitor_out->output()->disconnect (this);
- _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
- _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
+ // monitor section follow master bus - except midi
+ ChanCount mon_chn (_master_out->output()->n_ports());
+ mon_chn.set_midi (0);
+
+ _monitor_out->input()->ensure_io (mon_chn, false, this);
+ _monitor_out->output()->ensure_io (mon_chn, false, this);
for (uint32_t n = 0; n < limit; ++n) {
boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
@@ -1401,7 +1518,7 @@ Session::set_track_monitor_input_status (bool yn)
boost::shared_ptr<RouteList> rl = routes.reader ();
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
- if (tr && tr->record_enabled ()) {
+ if (tr && tr->rec_enable_control()->get_value()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
tr->request_input_monitoring (yn);
}
@@ -1836,15 +1953,9 @@ void
Session::set_all_tracks_record_enabled (bool enable )
{
boost::shared_ptr<RouteList> rl = routes.reader();
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
- if (tr) {
- tr->set_record_enabled (enable, Controllable::NoGroup);
- }
- }
+ set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
}
-
void
Session::disable_record (bool rt_context, bool force)
{
@@ -1919,59 +2030,55 @@ framepos_t
Session::audible_frame () const
{
framepos_t ret;
- framepos_t tf;
- framecnt_t offset;
- offset = worst_playback_latency ();
+ frameoffset_t offset = worst_playback_latency (); // - _engine.samples_since_cycle_start ();
+ offset *= transport_speed ();
if (synced_to_engine()) {
/* Note: this is basically just sync-to-JACK */
- tf = _engine.transport_frame();
+ ret = _engine.transport_frame();
} else {
- tf = _transport_frame;
+ ret = _transport_frame;
}
- ret = tf;
-
- if (!non_realtime_work_pending()) {
-
- /* MOVING */
+ if (transport_rolling()) {
+ ret -= offset;
/* Check to see if we have passed the first guaranteed
- audible frame past our last start position. if not,
- return that last start point because in terms
- of audible frames, we have not moved yet.
-
- `Start position' in this context means the time we last
- either started, located, or changed transport direction.
- */
+ * audible frame past our last start position. if not,
+ * return that last start point because in terms
+ * of audible frames, we have not moved yet.
+ *
+ * `Start position' in this context means the time we last
+ * either started, located, or changed transport direction.
+ */
if (_transport_speed > 0.0f) {
if (!play_loop || !have_looped) {
- if (tf < _last_roll_or_reversal_location + offset) {
+ if (ret < _last_roll_or_reversal_location) {
return _last_roll_or_reversal_location;
}
+ } else {
+ // latent loops
+ Location *location = _locations->auto_loop_location();
+ frameoffset_t lo = location->start() - ret;
+ if (lo > 0) {
+ ret = location->end () - lo;
+ }
}
-
- /* forwards */
- ret -= offset;
-
} else if (_transport_speed < 0.0f) {
/* XXX wot? no backward looping? */
- if (tf > _last_roll_or_reversal_location - offset) {
+ if (ret > _last_roll_or_reversal_location) {
return _last_roll_or_reversal_location;
- } else {
- /* backwards */
- ret += offset;
}
}
}
- return ret;
+ return std::max ((framepos_t)0, ret);
}
void
@@ -1984,7 +2091,12 @@ Session::set_frame_rate (framecnt_t frames_per_second)
here.
*/
- _base_frame_rate = frames_per_second;
+ if (_base_frame_rate == 0) {
+ _base_frame_rate = frames_per_second;
+ }
+ else if (_base_frame_rate != frames_per_second && frames_per_second != _nominal_frame_rate) {
+ NotifyAboutSampleRateMismatch (_base_frame_rate, frames_per_second);
+ }
_nominal_frame_rate = frames_per_second;
sync_time_vars();
@@ -2107,16 +2219,18 @@ Session::resort_routes ()
}
#ifndef NDEBUG
- boost::shared_ptr<RouteList> rl = routes.reader ();
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
+ if (DEBUG_ENABLED(DEBUG::Graph)) {
+ boost::shared_ptr<RouteList> rl = routes.reader ();
+ for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+ DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
- const Route::FedBy& fb ((*i)->fed_by());
+ const Route::FedBy& fb ((*i)->fed_by());
- for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
- boost::shared_ptr<Route> sf = f->r.lock();
- if (sf) {
- DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
+ for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
+ boost::shared_ptr<Route> sf = f->r.lock();
+ if (sf) {
+ DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
+ }
}
}
}
@@ -2198,8 +2312,7 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r)
#ifndef NDEBUG
DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
- DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
- (*i)->name(), (*i)->order_key ()));
+ DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
}
#endif
@@ -2317,8 +2430,10 @@ Session::default_track_name_pattern (DataType t)
* @param instrument plugin info for the instrument to insert pre-fader, if any
*/
list<boost::shared_ptr<MidiTrack> >
-Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
- TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
+Session::new_midi_track (const ChanCount& input, const ChanCount& output,
+ boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
+ RouteGroup* route_group, uint32_t how_many, string name_template, PresentationInfo::order_t order,
+ TrackMode mode)
{
string track_name;
uint32_t track_id = 0;
@@ -2338,17 +2453,20 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
boost::shared_ptr<MidiTrack> track;
try {
- track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
+ track.reset (new MidiTrack (*this, track_name, mode));
if (track->init ()) {
goto failed;
}
+ if (Profile->get_mixbus ()) {
+ track->set_strict_io (true);
+ }
+
track->use_new_diskstream();
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+ BOOST_MARK_TRACK (track);
+
{
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
if (track->input()->ensure_io (input, false, this)) {
@@ -2370,14 +2488,8 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
- if (Config->get_remote_model() == UserOrdered) {
- track->set_remote_control_id (next_control_id());
- }
-
new_routes.push_back (track);
ret.push_back (track);
-
- RouteAddedOrRemoved (true); /* EMIT SIGNAL */
}
catch (failed_constructor &err) {
@@ -2398,14 +2510,17 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
if (!new_routes.empty()) {
StateProtector sp (this);
if (Profile->get_trx()) {
- add_routes (new_routes, false, false, false);
+ add_routes (new_routes, false, false, false, order);
} else {
- add_routes (new_routes, true, true, false);
+ add_routes (new_routes, true, true, false, order);
}
if (instrument) {
for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
PluginPtr plugin = instrument->load (*this);
+ if (pset) {
+ plugin->load_preset (*pset);
+ }
boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
(*r)->add_processor (p, PreFader);
@@ -2416,154 +2531,118 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
return ret;
}
-void
-Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
+RouteList
+Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
+ PresentationInfo::Flag flag, PresentationInfo::order_t order)
{
- boost::shared_ptr<Route> midi_track (wmt.lock());
-
- if (!midi_track) {
- return;
- }
-
- if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
-
- if (change.after.n_audio() <= change.before.n_audio()) {
- return;
- }
-
- /* new audio ports: make sure the audio goes somewhere useful,
- unless the user has no-auto-connect selected.
-
- The existing ChanCounts don't matter for this call as they are only
- to do with matching input and output indices, and we are only changing
- outputs here.
- */
+ string bus_name;
+ uint32_t bus_id = 0;
+ string port;
+ RouteList ret;
- ChanCount dummy;
+ bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
- auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
- }
-}
+ while (how_many) {
+ if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
+ error << "cannot find name for new midi bus" << endmsg;
+ goto failure;
+ }
-/** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
- * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
- * @param output_start As \a input_start, but for outputs.
- */
-void
-Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
- bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
-{
- if (!IO::connecting_legal) {
- return;
- }
+ try {
+ boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
- Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
+ if (bus->init ()) {
+ goto failure;
+ }
- if (with_lock) {
- lm.acquire ();
- }
+ if (Profile->get_mixbus ()) {
+ bus->set_strict_io (true);
+ }
- /* If both inputs and outputs are auto-connected to physical ports,
- use the max of input and output offsets to ensure auto-connected
- port numbers always match up (e.g. the first audio input and the
- first audio output of the route will have the same physical
- port number). Otherwise just use the lowest input or output
- offset possible.
- */
+ BOOST_MARK_ROUTE(bus);
- DEBUG_TRACE (DEBUG::Graph,
- string_compose("Auto-connect: existing in = %1 out = %2\n",
- existing_inputs, existing_outputs));
+ {
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
- const bool in_out_physical =
- (Config->get_input_auto_connect() & AutoConnectPhysical)
- && (Config->get_output_auto_connect() & AutoConnectPhysical)
- && connect_inputs;
+ if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
+ error << _("cannot configure new midi bus input") << endmsg;
+ goto failure;
+ }
- const ChanCount in_offset = in_out_physical
- ? ChanCount::max(existing_inputs, existing_outputs)
- : existing_inputs;
- const ChanCount out_offset = in_out_physical
- ? ChanCount::max(existing_inputs, existing_outputs)
- : existing_outputs;
+ if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
+ error << _("cannot configure new midi bus output") << endmsg;
+ goto failure;
+ }
+ }
- for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
- vector<string> physinputs;
- vector<string> physoutputs;
+ if (route_group) {
+ route_group->add (bus);
+ }
- _engine.get_physical_outputs (*t, physoutputs);
- _engine.get_physical_inputs (*t, physinputs);
+ bus->add_internal_return ();
+ ret.push_back (bus);
+ }
- if (!physinputs.empty() && connect_inputs) {
- uint32_t nphysical_in = physinputs.size();
+ catch (failed_constructor &err) {
+ error << _("Session: could not create new audio route.") << endmsg;
+ goto failure;
+ }
- DEBUG_TRACE (DEBUG::Graph,
- string_compose("There are %1 physical inputs of type %2\n",
- nphysical_in, *t));
+ catch (AudioEngine::PortRegistrationFailure& pfe) {
+ error << pfe.what() << endmsg;
+ goto failure;
+ }
- for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
- string port;
- if (Config->get_input_auto_connect() & AutoConnectPhysical) {
- DEBUG_TRACE (DEBUG::Graph,
- string_compose("Get index %1 + %2 % %3 = %4\n",
- in_offset.get(*t), i, nphysical_in,
- (in_offset.get(*t) + i) % nphysical_in));
- port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
- }
+ --how_many;
+ }
- DEBUG_TRACE (DEBUG::Graph,
- string_compose("Connect route %1 IN to %2\n",
- route->name(), port));
+ failure:
+ if (!ret.empty()) {
+ StateProtector sp (this);
+ add_routes (ret, false, false, false, order);
- if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
- break;
+ if (instrument) {
+ for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
+ PluginPtr plugin = instrument->load (*this);
+ if (pset) {
+ plugin->load_preset (*pset);
}
-
- ChanCount one_added (*t, 1);
- existing_inputs += one_added;
+ boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
+ (*r)->add_processor (p, PreFader);
}
}
+ }
- if (!physoutputs.empty()) {
- uint32_t nphysical_out = physoutputs.size();
- for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
- string port;
+ return ret;
- /* Waves Tracks:
- * do not create new connections if we reached the limit of physical outputs
- * in Multi Out mode
- */
+}
- if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
- ARDOUR::Profile->get_trx () &&
- existing_outputs.get(*t) == nphysical_out ) {
- break;
- }
- if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
- port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
- } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
- /* master bus is audio only */
- if (_master_out && _master_out->n_inputs().get(*t) > 0) {
- port = _master_out->input()->ports().port(*t,
- i % _master_out->input()->n_ports().get(*t))->name();
- }
- }
+void
+Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
+{
+ boost::shared_ptr<Route> midi_track (wmt.lock());
- DEBUG_TRACE (DEBUG::Graph,
- string_compose("Connect route %1 OUT to %2\n",
- route->name(), port));
+ if (!midi_track) {
+ return;
+ }
- if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
- break;
- }
+ if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
- ChanCount one_added (*t, 1);
- existing_outputs += one_added;
- }
+ if (change.after.n_audio() <= change.before.n_audio()) {
+ return;
}
+
+ /* new audio ports: make sure the audio goes somewhere useful,
+ * unless the user has no-auto-connect selected.
+ *
+ * The existing ChanCounts don't matter for this call as they are only
+ * to do with matching input and output indices, and we are only changing
+ * outputs here.
+ */
+ auto_connect_route (midi_track, false, ChanCount(), change.before);
}
}
@@ -2725,8 +2804,6 @@ Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool r
}
}
}
-
- //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
}
_master_out->output()->disconnect (this);
@@ -2851,12 +2928,40 @@ Session::reconnect_mmc_ports(bool inputs)
#endif
+void
+Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
+{
+ if (first_new_order == PresentationInfo::max_order) {
+ /* adding at end, no worries */
+ return;
+ }
+
+ /* create a gap in the presentation info to accomodate @param how_many
+ * new objects.
+ */
+ StripableList sl;
+ get_stripables (sl);
+
+ for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
+ boost::shared_ptr<Stripable> s (*si);
+
+ if (s->is_monitor() || s->is_auditioner()) {
+ continue;
+ }
+
+ if (s->presentation_info().order () >= first_new_order) {
+ s->set_presentation_order (s->presentation_info().order () + how_many);
+ }
+ }
+}
+
/** Caller must not hold process lock
* @param name_template string to use for the start of the name, or "" to use "Audio".
*/
list< boost::shared_ptr<AudioTrack> >
-Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
- uint32_t how_many, string name_template)
+Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
+ uint32_t how_many, string name_template, PresentationInfo::order_t order,
+ TrackMode mode)
{
string track_name;
uint32_t track_id = 0;
@@ -2877,12 +2982,16 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
boost::shared_ptr<AudioTrack> track;
try {
- track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
+ track.reset (new AudioTrack (*this, track_name, mode));
if (track->init ()) {
goto failed;
}
+ if (Profile->get_mixbus ()) {
+ track->set_strict_io (true);
+ }
+
if (ARDOUR::Profile->get_trx ()) {
// TRACKS considers it's not a USE CASE, it's
// a piece of behavior of the session model:
@@ -2893,15 +3002,14 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
// 0 for Stereo Out mode
// 0 Multi Out mode
if (Config->get_output_auto_connect() & AutoConnectMaster) {
- track->set_gain (dB_to_coefficient (0), Controllable::NoGroup);
+ track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
}
}
track->use_new_diskstream();
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+ BOOST_MARK_TRACK (track);
+
{
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
@@ -2929,14 +3037,9 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
track->non_realtime_input_change();
track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
- if (Config->get_remote_model() == UserOrdered) {
- track->set_remote_control_id (next_control_id());
- }
new_routes.push_back (track);
ret.push_back (track);
-
- RouteAddedOrRemoved (true); /* EMIT SIGNAL */
}
catch (failed_constructor &err) {
@@ -2957,9 +3060,9 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
if (!new_routes.empty()) {
StateProtector sp (this);
if (Profile->get_trx()) {
- add_routes (new_routes, false, false, false);
+ add_routes (new_routes, false, false, false, order);
} else {
- add_routes (new_routes, true, true, false);
+ add_routes (new_routes, true, true, false, order);
}
}
@@ -2970,7 +3073,8 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
* @param name_template string to use for the start of the name, or "" to use "Bus".
*/
RouteList
-Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
+Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
+ PresentationInfo::Flag flags, PresentationInfo::order_t order)
{
string bus_name;
uint32_t bus_id = 0;
@@ -2986,15 +3090,18 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
}
try {
- boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
+ boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
if (bus->init ()) {
goto failure;
}
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
-#endif
+ if (Profile->get_mixbus ()) {
+ bus->set_strict_io (true);
+ }
+
+ BOOST_MARK_ROUTE(bus);
+
{
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
@@ -3017,20 +3124,11 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
if (route_group) {
route_group->add (bus);
}
- if (Config->get_remote_model() == UserOrdered) {
- bus->set_remote_control_id (next_control_id());
- }
bus->add_internal_return ();
-
ret.push_back (bus);
-
- RouteAddedOrRemoved (true); /* EMIT SIGNAL */
-
- ARDOUR::GUIIdle ();
}
-
catch (failed_constructor &err) {
error << _("Session: could not create new audio route.") << endmsg;
goto failure;
@@ -3049,9 +3147,9 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
if (!ret.empty()) {
StateProtector sp (this);
if (Profile->get_trx()) {
- add_routes (ret, false, false, false);
+ add_routes (ret, false, false, false, order);
} else {
- add_routes (ret, false, true, true); // autoconnect // outputs only
+ add_routes (ret, false, true, true, order); // autoconnect // outputs only
}
}
@@ -3075,7 +3173,6 @@ RouteList
Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
{
RouteList ret;
- uint32_t control_id;
uint32_t number = 0;
const uint32_t being_added = how_many;
/* This will prevent the use of any existing XML-provided PBD::ID
@@ -3084,8 +3181,6 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
Stateful::ForceIDRegeneration force_ids;
IO::disable_connecting ();
- control_id = next_control_id ();
-
while (how_many) {
/* We're going to modify the node contents a bit so take a
@@ -3127,6 +3222,7 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
case NewPlaylist:
rename_playlist = true;
break;
+ default:
case CopyPlaylist:
case SharePlaylist:
rename_playlist = false;
@@ -3138,10 +3234,52 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
XMLNodeList children = node_copy.children ();
for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
if ((*i)->name() == X_("Processor")) {
- XMLProperty* role = (*i)->property (X_("role"));
+ /* ForceIDRegeneration does not catch the following */
+ XMLProperty const * role = (*i)->property (X_("role"));
+ XMLProperty const * type = (*i)->property (X_("type"));
+ if (role && role->value() == X_("Aux")) {
+ /* check if the target bus exists.
+ * we should not save aux-sends in templates.
+ */
+ XMLProperty const * target = (*i)->property (X_("target"));
+ if (!target) {
+ (*i)->add_property ("type", "dangling-aux-send");
+ continue;
+ }
+ boost::shared_ptr<Route> r = route_by_id (target->value());
+ if (!r || boost::dynamic_pointer_cast<Track>(r)) {
+ (*i)->add_property ("type", "dangling-aux-send");
+ continue;
+ }
+ }
if (role && role->value() == X_("Listen")) {
(*i)->remove_property (X_("bitslot"));
}
+ else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
+ char buf[32];
+ Delivery::Role xrole;
+ uint32_t bitslot = 0;
+ xrole = Delivery::Role (string_2_enum (role->value(), xrole));
+ std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
+ snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
+ (*i)->remove_property (X_("bitslot"));
+ (*i)->remove_property (X_("name"));
+ (*i)->add_property ("bitslot", buf);
+ (*i)->add_property ("name", name);
+ }
+ else if (type && type->value() == X_("intreturn")) {
+ (*i)->remove_property (X_("bitslot"));
+ (*i)->add_property ("ignore-bitslot", "1");
+ }
+ else if (type && type->value() == X_("return")) {
+ // Return::set_state() generates a new one
+ (*i)->remove_property (X_("bitslot"));
+ }
+ else if (type && type->value() == X_("port")) {
+ // PortInsert::set_state() handles the bitslot
+ (*i)->remove_property (X_("bitslot"));
+ (*i)->add_property ("ignore-name", "1");
+ }
}
}
@@ -3167,9 +3305,6 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
route->output()->changed (change, this);
}
- route->set_remote_control_id (control_id);
- ++control_id;
-
boost::shared_ptr<Track> track;
if ((track = boost::dynamic_pointer_cast<Track> (route))) {
@@ -3186,8 +3321,6 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
};
ret.push_back (route);
-
- RouteAddedOrRemoved (true); /* EMIT SIGNAL */
}
catch (failed_constructor &err) {
@@ -3207,9 +3340,9 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
if (!ret.empty()) {
StateProtector sp (this);
if (Profile->get_trx()) {
- add_routes (ret, false, false, false);
+ add_routes (ret, false, false, false, PresentationInfo::max_order);
} else {
- add_routes (ret, true, true, false);
+ add_routes (ret, true, true, false, PresentationInfo::max_order);
}
IO::enable_connecting ();
}
@@ -3218,11 +3351,11 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
}
void
-Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
+Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
{
try {
PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
- add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
+ add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
} catch (...) {
error << _("Adding new tracks/busses failed") << endmsg;
@@ -3239,54 +3372,53 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output
save_state (_current_snapshot_name);
}
- reassign_track_numbers();
-
update_route_record_state ();
RouteAdded (new_routes); /* EMIT SIGNAL */
}
void
-Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
+Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
{
- ChanCount existing_inputs;
- ChanCount existing_outputs;
- uint32_t order = next_control_id();
-
- if (_order_hint > -1) {
- order = _order_hint;
- _order_hint = -1;
- }
+ ChanCount existing_inputs;
+ ChanCount existing_outputs;
+ uint32_t n_routes;
+ uint32_t added = 0;
- count_existing_track_channels (existing_inputs, existing_outputs);
+ count_existing_track_channels (existing_inputs, existing_outputs);
{
RCUWriter<RouteList> writer (routes);
boost::shared_ptr<RouteList> r = writer.get_copy ();
r->insert (r->end(), new_routes.begin(), new_routes.end());
+ n_routes = r->size();
/* if there is no control out and we're not in the middle of loading,
- resort the graph here. if there is a control out, we will resort
- toward the end of this method. if we are in the middle of loading,
- we will resort when done.
- */
+ * resort the graph here. if there is a control out, we will resort
+ * toward the end of this method. if we are in the middle of loading,
+ * we will resort when done.
+ */
if (!_monitor_out && IO::connecting_legal) {
resort_routes_using (r);
}
}
- for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", order, new_routes.size()));
+ ensure_route_presentation_info_gap (order, new_routes.size());
+
+ for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
boost::weak_ptr<Route> wpr (*x);
boost::shared_ptr<Route> r (*x);
- r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
- r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
- r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
- r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
+ r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
+ r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
+ r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
+
r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
+ r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
if (r->is_master()) {
_master_out = r;
@@ -3300,34 +3432,52 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
if (tr) {
tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
track_playlist_changed (boost::weak_ptr<Track> (tr));
- tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
+ tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
if (mt) {
mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
- mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
+ mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
}
}
+ if (!r->presentation_info().special()) {
- if (input_auto_connect || output_auto_connect) {
- auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
- }
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
- /* order keys are a GUI responsibility but we need to set up
- reasonable defaults because they also affect the remote control
- ID in most situations.
- */
+ /* presentation info order may already have been set from XML */
- if (!r->has_order_key ()) {
- if (r->is_auditioner()) {
- /* use an arbitrarily high value */
- r->set_order_key (UINT_MAX);
- } else {
- DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
- r->set_order_key (order);
- order++;
- }
+ if (!r->presentation_info().order_set()) {
+
+ if (order == PresentationInfo::max_order) {
+ /* just add to the end */
+ r->set_presentation_order (n_routes + added, false);
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
+ } else {
+ r->set_presentation_order (order + added);
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
+ }
+ } else {
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
+ }
+ }
+
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
+ /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
+ * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
+ */
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
+ r->name(),
+ r->presentation_info().order(),
+ enum_2_string (r->presentation_info().flags()),
+ r->presentation_info()));
+#endif
+
+
+ if (input_auto_connect || output_auto_connect) {
+ auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
+ existing_inputs += r->n_inputs();
+ existing_outputs += r->n_outputs();
}
ARDOUR::GUIIdle ();
@@ -3340,12 +3490,14 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
if ((*x)->is_monitor()) {
/* relax */
} else if ((*x)->is_master()) {
- /* relax */
+ /* relax */
} else {
(*x)->enable_monitor_send ();
}
}
}
+
+ reassign_track_numbers ();
}
void
@@ -3434,7 +3586,6 @@ Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Pro
graph_reordered ();
}
-
void
Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
{
@@ -3450,7 +3601,7 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
continue;
}
- (*iter)->set_solo (false, Controllable::NoGroup);
+ (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
rs->remove (*iter);
@@ -3504,7 +3655,6 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
} // end of RCU Writer scope
update_route_solo_state ();
- RouteAddedOrRemoved (false); /* EMIT SIGNAL */
update_latency_compensation ();
set_dirty();
@@ -3520,7 +3670,7 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
resort_routes ();
#endif
- if (_process_graph) {
+ if (_process_graph && !(_state_of_the_state & Deletion)) {
_process_graph->clear_other_chain ();
}
@@ -3537,7 +3687,11 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
(*iter)->drop_references ();
}
- Route::RemoteControlIDChange(); /* EMIT SIGNAL */
+ if (_state_of_the_state & Deletion) {
+ return;
+ }
+
+ PresentationInfo::Change(); /* EMIT SIGNAL */
/* save the new state of the world */
@@ -3545,7 +3699,6 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
save_history (_current_snapshot_name);
}
- reassign_track_numbers();
update_route_record_state ();
}
@@ -3566,18 +3719,20 @@ Session::route_mute_changed ()
void
Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
{
- boost::shared_ptr<Route> route = wpr.lock();
+ boost::shared_ptr<Route> route (wpr.lock());
+
if (!route) {
- error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_listen_changed")) << endmsg;
return;
}
- if (route->listening_via_monitor ()) {
+ assert (Config->get_solo_control_is_listen_control());
+
+ if (route->solo_control()->soloed_by_self_or_masters()) {
if (Config->get_exclusive_solo()) {
RouteGroup* rg = route->route_group ();
- const bool group_already_accounted_for = route->use_group (group_override, &RouteGroup::is_solo);
+ const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
boost::shared_ptr<RouteList> r = routes.reader ();
@@ -3587,7 +3742,7 @@ Session::route_listen_changed (Controllable::GroupControlDisposition group_overr
continue;
}
- if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+ if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
/* route does not get solo propagated to it */
continue;
}
@@ -3600,7 +3755,7 @@ Session::route_listen_changed (Controllable::GroupControlDisposition group_overr
*/
continue;
}
- (*i)->set_listen (false, Controllable::NoGroup);
+ (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
}
}
@@ -3613,20 +3768,19 @@ Session::route_listen_changed (Controllable::GroupControlDisposition group_overr
update_route_solo_state ();
}
+
void
Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
{
- boost::shared_ptr<Route> route = wpr.lock ();
+ boost::shared_ptr<Route> route (wpr.lock());
if (!route) {
- /* should not happen */
- error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_isolated_changed")) << endmsg;
return;
}
bool send_changed = false;
- if (route->solo_isolated()) {
+ if (route->solo_isolate_control()->solo_isolated()) {
if (_solo_isolated_cnt == 0) {
send_changed = true;
}
@@ -3644,27 +3798,42 @@ Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
}
void
-Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
+Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
{
- DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_changed));
+
+ boost::shared_ptr<Route> route (wpr.lock());
- if (!self_solo_change) {
- // session doesn't care about changes to soloed-by-others
+ if (!route) {
return;
}
- boost::shared_ptr<Route> route = wpr.lock ();
- assert (route);
+ if (Config->get_solo_control_is_listen_control()) {
+ route_listen_changed (group_override, wpr);
+ return;
+ }
- boost::shared_ptr<RouteList> r = routes.reader ();
- int32_t delta;
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: self %2 masters %3 transition %4\n", route->name(), route->self_soloed(), route->solo_control()->get_masters_value(), route->solo_control()->transitioned_into_solo()));
- if (route->self_soloed()) {
- delta = 1;
- } else {
- delta = -1;
+ if (route->solo_control()->transitioned_into_solo() == 0) {
+ /* route solo changed by upstream/downstream; not interesting
+ to Session.
+ */
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 not self-soloed nor soloed by master (%2), ignoring\n", route->name(), route->solo_control()->get_masters_value()));
+ return;
}
+ if (route->solo_control()->transitioned_into_solo() == 0) {
+ /* reason for being soloed changed (e.g. master went away, we
+ * took over the master state), but actual status did
+ * not. nothing to do.
+ */
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: solo change was change in reason, not status\n", route->name()));
+ }
+
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ int32_t delta = route->solo_control()->transitioned_into_solo ();
+
/* the route may be a member of a group that has shared-solo
* semantics. If so, then all members of that group should follow the
* solo of the changed route. But ... this is optional, controlled by a
@@ -3682,7 +3851,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
*/
RouteGroup* rg = route->route_group ();
- const bool group_already_accounted_for = route->use_group (group_override, &RouteGroup::is_solo);
+ const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
if (delta == 1 && Config->get_exclusive_solo()) {
@@ -3695,7 +3864,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
continue;
}
- if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+ if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
/* route does not get solo propagated to it */
continue;
}
@@ -3709,7 +3878,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
continue;
}
- (*i)->set_solo (false, group_override);
+ (*i)->solo_control()->set_value (0.0, group_override);
}
}
@@ -3728,8 +3897,10 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
continue;
}
- if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+ if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
/* route does not get solo propagated to it */
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 excluded from solo because iso = %2 can_solo = %3\n", (*i)->name(), (*i)->solo_isolate_control()->solo_isolated(),
+ (*i)->can_solo()));
continue;
}
@@ -3750,7 +3921,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
if (!via_sends_only) {
if (!route->soloed_by_others_upstream()) {
- (*i)->mod_solo_by_others_downstream (delta);
+ (*i)->solo_control()->mod_solo_by_others_downstream (delta);
} else {
DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
}
@@ -3771,15 +3942,15 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
sends are involved.
*/
DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
- route->name(),
- (*i)->name(),
- via_sends_only,
- route->soloed_by_others_downstream(),
- route->soloed_by_others_upstream()));
+ route->name(),
+ (*i)->name(),
+ via_sends_only,
+ route->soloed_by_others_downstream(),
+ route->soloed_by_others_upstream()));
if (!via_sends_only) {
//NB. Triggers Invert Push, which handles soloed by downstream
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
- (*i)->mod_solo_by_others_upstream (delta);
+ (*i)->solo_control()->mod_solo_by_others_upstream (delta);
} else {
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
}
@@ -3804,7 +3975,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
(*i)->act_on_mute ();
- (*i)->mute_changed ();
+ (*i)->mute_control()->Changed (false, Controllable::NoGroup);
}
SoloChanged (); /* EMIT SIGNAL */
@@ -3826,20 +3997,21 @@ Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
}
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
- if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
- something_soloed = true;
- }
-
- if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
+ if ((*i)->can_solo()) {
if (Config->get_solo_control_is_listen_control()) {
- listeners++;
- something_listening = true;
+ if ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value()) {
+ listeners++;
+ something_listening = true;
+ }
} else {
- (*i)->set_listen (false, Controllable::NoGroup);
+ (*i)->set_listen (false);
+ if ((*i)->can_solo() && ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value())) {
+ something_soloed = true;
+ }
}
}
- if ((*i)->solo_isolated()) {
+ if ((*i)->solo_isolate_control()->solo_isolated()) {
isolated++;
}
}
@@ -3865,6 +4037,16 @@ Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
something_soloed, listeners, isolated));
}
+void
+Session::get_stripables (StripableList& sl) const
+{
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ sl.insert (sl.end(), r->begin(), r->end());
+
+ VCAList v = _vca_manager->vcas ();
+ sl.insert (sl.end(), v.begin(), v.end());
+}
+
boost::shared_ptr<RouteList>
Session::get_routes_with_internal_returns() const
{
@@ -3880,7 +4062,7 @@ Session::get_routes_with_internal_returns() const
}
bool
-Session::io_name_is_legal (const std::string& name)
+Session::io_name_is_legal (const std::string& name) const
{
boost::shared_ptr<RouteList> r = routes.reader ();
@@ -3989,7 +4171,7 @@ Session::routes_using_input_from (const string& str, RouteList& rl)
}
boost::shared_ptr<Route>
-Session::route_by_name (string name)
+Session::route_by_name (string name) const
{
boost::shared_ptr<RouteList> r = routes.reader ();
@@ -4003,7 +4185,7 @@ Session::route_by_name (string name)
}
boost::shared_ptr<Route>
-Session::route_by_id (PBD::ID id)
+Session::route_by_id (PBD::ID id) const
{
boost::shared_ptr<RouteList> r = routes.reader ();
@@ -4016,8 +4198,23 @@ Session::route_by_id (PBD::ID id)
return boost::shared_ptr<Route> ((Route*) 0);
}
+boost::shared_ptr<Processor>
+Session::processor_by_id (PBD::ID id) const
+{
+ boost::shared_ptr<RouteList> r = routes.reader ();
+
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
+ if (p) {
+ return p;
+ }
+ }
+
+ return boost::shared_ptr<Processor> ();
+}
+
boost::shared_ptr<Track>
-Session::track_by_diskstream_id (PBD::ID id)
+Session::track_by_diskstream_id (PBD::ID id) const
{
boost::shared_ptr<RouteList> r = routes.reader ();
@@ -4032,19 +4229,75 @@ Session::track_by_diskstream_id (PBD::ID id)
}
boost::shared_ptr<Route>
-Session::route_by_remote_id (uint32_t id)
+Session::get_remote_nth_route (PresentationInfo::order_t n) const
+{
+ return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
+}
+
+boost::shared_ptr<Stripable>
+Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
+{
+ StripableList sl;
+ PresentationInfo::order_t match_cnt = 0;
+
+ get_stripables (sl);
+ sl.sort (Stripable::PresentationOrderSorter());
+
+ for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
+
+ if ((*s)->presentation_info().hidden()) {
+ /* if the caller didn't explicitly ask for hidden
+ stripables, ignore hidden ones. This matches
+ the semantics of the pre-PresentationOrder
+ "get by RID" logic of Ardour 4.x and earlier.
+
+ XXX at some point we should likely reverse
+ the logic of the flags, because asking for "the
+ hidden stripables" is not going to be common,
+ whereas asking for visible ones is normal.
+ */
+
+ if (! (flags & PresentationInfo::Hidden)) {
+ continue;
+ }
+ }
+
+ if ((*s)->presentation_info().flag_match (flags)) {
+ if (match_cnt++ == n) {
+ return *s;
+ }
+ }
+ }
+
+ /* there is no nth stripable that matches the given flags */
+ return boost::shared_ptr<Stripable>();
+}
+
+boost::shared_ptr<Route>
+Session::route_by_selected_count (uint32_t id) const
{
boost::shared_ptr<RouteList> r = routes.reader ();
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
- if ((*i)->remote_control_id() == id) {
- return *i;
- }
+ /* NOT IMPLEMENTED */
}
return boost::shared_ptr<Route> ((Route*) 0);
}
+struct PresentationOrderSorter {
+ bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
+ if (a->presentation_info().special() && !b->presentation_info().special()) {
+ /* a is not ordered, b is; b comes before a */
+ return false;
+ } else if (!b->presentation_info().order_set() && a->presentation_info().order_set()) {
+ /* b is not ordered, a is; a comes before b */
+ return true;
+ } else {
+ return a->presentation_info().order() < b->presentation_info().order();
+ }
+ }
+};
void
Session::reassign_track_numbers ()
@@ -4052,7 +4305,7 @@ Session::reassign_track_numbers ()
int64_t tn = 0;
int64_t bn = 0;
RouteList r (*(routes.reader ()));
- SignalOrderRouteSorter sorter;
+ PresentationOrderSorter sorter;
r.sort (sorter);
StateProtector sp (this);
@@ -4079,6 +4332,16 @@ Session::reassign_track_numbers ()
// trigger GUI re-layout
config.ParameterChanged("track-name-number");
}
+
+#ifndef NDEBUG
+ if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
+ boost::shared_ptr<RouteList> rl = routes.reader ();
+ for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
+ }
+ }
+#endif /* NDEBUG */
+
}
void
@@ -4144,13 +4407,19 @@ Session::maybe_update_session_range (framepos_t a, framepos_t b)
_session_range_location->set_start (a);
}
- if (b > _session_range_location->end()) {
+ if (_session_range_end_is_free && (b > _session_range_location->end())) {
_session_range_location->set_end (b);
}
}
}
void
+Session::set_end_is_free (bool yn)
+{
+ _session_range_end_is_free = yn;
+}
+
+void
Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
{
for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
@@ -4868,6 +5137,230 @@ Session::audition_playlist ()
queue_event (ev);
}
+
+void
+Session::register_lua_function (
+ const std::string& name,
+ const std::string& script,
+ const LuaScriptParamList& args
+ )
+{
+ Glib::Threads::Mutex::Lock lm (lua_lock);
+
+ lua_State* L = lua.getState();
+
+ const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+ luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+ for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+ if ((*i)->optional && !(*i)->is_set) { continue; }
+ tbl_arg[(*i)->name] = (*i)->value;
+ }
+ (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
+ set_dirty();
+}
+
+void
+Session::unregister_lua_function (const std::string& name)
+{
+ Glib::Threads::Mutex::Lock lm (lua_lock);
+ (*_lua_del)(name); // throws luabridge::LuaException
+ lua.collect_garbage ();
+ set_dirty();
+}
+
+std::vector<std::string>
+Session::registered_lua_functions ()
+{
+ Glib::Threads::Mutex::Lock lm (lua_lock);
+ std::vector<std::string> rv;
+
+ try {
+ luabridge::LuaRef list ((*_lua_list)());
+ for (luabridge::Iterator i (list); !i.isNil (); ++i) {
+ if (!i.key ().isString ()) { assert(0); continue; }
+ rv.push_back (i.key ().cast<std::string> ());
+ }
+ } catch (luabridge::LuaException const& e) { }
+ return rv;
+}
+
+#ifndef NDEBUG
+static void _lua_print (std::string s) {
+ std::cout << "SessionLua: " << s << "\n";
+}
+#endif
+
+void
+Session::try_run_lua (pframes_t nframes)
+{
+ if (_n_lua_scripts == 0) return;
+ Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
+ if (tm.locked ()) {
+ try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
+ lua.collect_garbage_step ();
+ }
+}
+
+void
+Session::setup_lua ()
+{
+#ifndef NDEBUG
+ lua.Print.connect (&_lua_print);
+#endif
+ lua.tweak_rt_gc ();
+ lua.do_command (
+ "function ArdourSession ()"
+ " local self = { scripts = {}, instances = {} }"
+ ""
+ " local remove = function (n)"
+ " self.scripts[n] = nil"
+ " self.instances[n] = nil"
+ " Session:scripts_changed()" // call back
+ " end"
+ ""
+ " local addinternal = function (n, f, a)"
+ " assert(type(n) == 'string', 'function-name must be string')"
+ " assert(type(f) == 'function', 'Given script is a not a function')"
+ " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+ " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
+ " self.scripts[n] = { ['f'] = f, ['a'] = a }"
+ " local env = _ENV; env.f = nil env.io = nil env.os = nil env.loadfile = nil env.require = nil env.dofile = nil env.package = nil env.debug = nil"
+ " local env = { print = print, tostring = tostring, assert = assert, ipairs = ipairs, error = error, select = select, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall, Session = Session, PBD = PBD, Timecode = Timecode, Evoral = Evoral, C = C, ARDOUR = ARDOUR }"
+ " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
+ " Session:scripts_changed()" // call back
+ " end"
+ ""
+ " local add = function (n, b, a)"
+ " assert(type(b) == 'string', 'ByteCode must be string')"
+ " load (b)()" // assigns f
+ " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+ " addinternal (n, load(f), a)"
+ " end"
+ ""
+ " local run = function (...)"
+ " for n, s in pairs (self.instances) do"
+ " local status, err = pcall (s, ...)"
+ " if not status then"
+ " print ('fn \"'.. n .. '\": ', err)"
+ " remove (n)"
+ " end"
+ " end"
+ " collectgarbage()"
+ " end"
+ ""
+ " local cleanup = function ()"
+ " self.scripts = nil"
+ " self.instances = nil"
+ " end"
+ ""
+ " local list = function ()"
+ " local rv = {}"
+ " for n, _ in pairs (self.scripts) do"
+ " rv[n] = true"
+ " end"
+ " return rv"
+ " end"
+ ""
+ " local function basic_serialize (o)"
+ " if type(o) == \"number\" then"
+ " return tostring(o)"
+ " else"
+ " return string.format(\"%q\", o)"
+ " end"
+ " end"
+ ""
+ " local function serialize (name, value)"
+ " local rv = name .. ' = '"
+ " collectgarbage()"
+ " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+ " return rv .. basic_serialize(value) .. ' '"
+ " elseif type(value) == \"table\" then"
+ " rv = rv .. '{} '"
+ " for k,v in pairs(value) do"
+ " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+ " rv = rv .. serialize(fieldname, v) .. ' '"
+ " collectgarbage()" // string concatenation allocates a new string :(
+ " end"
+ " return rv;"
+ " elseif type(value) == \"function\" then"
+ " return rv .. string.format(\"%q\", string.dump(value, true))"
+ " else"
+ " error('cannot save a ' .. type(value))"
+ " end"
+ " end"
+ ""
+ ""
+ " local save = function ()"
+ " return (serialize('scripts', self.scripts))"
+ " end"
+ ""
+ " local restore = function (state)"
+ " self.scripts = {}"
+ " load (state)()"
+ " for n, s in pairs (scripts) do"
+ " addinternal (n, load(s['f']), s['a'])"
+ " end"
+ " end"
+ ""
+ " return { run = run, add = add, remove = remove,"
+ " list = list, restore = restore, save = save, cleanup = cleanup}"
+ " end"
+ " "
+ " sess = ArdourSession ()"
+ " ArdourSession = nil"
+ " "
+ "function ardour () end"
+ );
+
+ lua_State* L = lua.getState();
+
+ try {
+ luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
+ lua.do_command ("sess = nil"); // hide it.
+ lua.do_command ("collectgarbage()");
+
+ _lua_run = new luabridge::LuaRef(lua_sess["run"]);
+ _lua_add = new luabridge::LuaRef(lua_sess["add"]);
+ _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
+ _lua_list = new luabridge::LuaRef(lua_sess["list"]);
+ _lua_save = new luabridge::LuaRef(lua_sess["save"]);
+ _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
+ _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
+ } catch (luabridge::LuaException const& e) {
+ fatal << string_compose (_("programming error: %1"),
+ X_("Failed to setup Lua interpreter"))
+ << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+
+ LuaBindings::stddef (L);
+ LuaBindings::common (L);
+ LuaBindings::dsp (L);
+ luabridge::push <Session *> (L, this);
+ lua_setglobal (L, "Session");
+}
+
+void
+Session::scripts_changed ()
+{
+ assert (!lua_lock.trylock()); // must hold lua_lock
+
+ try {
+ luabridge::LuaRef list ((*_lua_list)());
+ int cnt = 0;
+ for (luabridge::Iterator i (list); !i.isNil (); ++i) {
+ if (!i.key ().isString ()) { assert(0); continue; }
+ ++cnt;
+ }
+ _n_lua_scripts = cnt;
+ } catch (luabridge::LuaException const& e) {
+ fatal << string_compose (_("programming error: %1"),
+ X_("Indexing Lua Session Scripts failed."))
+ << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+}
+
void
Session::non_realtime_set_audition ()
{
@@ -4906,7 +5399,7 @@ Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::
if (b->is_monitor()) {
return false;
}
- return a->order_key () < b->order_key ();
+ return a->presentation_info().order() < b->presentation_info().order();
}
bool
@@ -5062,6 +5555,16 @@ Session::tempo_map_changed (const PropertyChange&)
}
void
+Session::gui_tempo_map_changed ()
+{
+ clear_clicks ();
+
+ playlists->update_after_tempo_map_change ();
+
+ _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
+}
+
+void
Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
{
for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
@@ -5092,7 +5595,7 @@ Session::next_insert_id ()
/* this doesn't really loop forever. just think about it */
while (true) {
- for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
+ for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
if (!insert_bitset[n]) {
insert_bitset[n] = true;
return n;
@@ -5112,7 +5615,7 @@ Session::next_send_id ()
/* this doesn't really loop forever. just think about it */
while (true) {
- for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
+ for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
if (!send_bitset[n]) {
send_bitset[n] = true;
return n;
@@ -5132,7 +5635,7 @@ Session::next_aux_send_id ()
/* this doesn't really loop forever. just think about it */
while (true) {
- for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
+ for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
if (!aux_send_bitset[n]) {
aux_send_bitset[n] = true;
return n;
@@ -5152,7 +5655,7 @@ Session::next_return_id ()
/* this doesn't really loop forever. just think about it */
while (true) {
- for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
+ for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
if (!return_bitset[n]) {
return_bitset[n] = true;
return n;
@@ -5233,6 +5736,7 @@ Session::unmark_aux_send_id (uint32_t id)
void
Session::unmark_return_id (uint32_t id)
{
+ if (_state_of_the_state & Deletion) { return; }
if (id < return_bitset.size()) {
return_bitset[id] = false;
}
@@ -5583,6 +6087,12 @@ Session::get_scratch_buffers (ChanCount count, bool silence)
}
BufferSet&
+Session::get_noinplace_buffers (ChanCount count)
+{
+ return ProcessThread::get_noinplace_buffers (count);
+}
+
+BufferSet&
Session::get_route_buffers (ChanCount count, bool silence)
{
return ProcessThread::get_route_buffers (count, silence);
@@ -5653,7 +6163,7 @@ Session::update_route_record_state ()
while (i != rl->end ()) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
- if (tr && tr->record_enabled ()) {
+ if (tr && tr->rec_enable_control()->get_value()) {
break;
}
@@ -5670,7 +6180,7 @@ Session::update_route_record_state ()
for (i = rl->begin(); i != rl->end (); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
- if (tr && !tr->record_enabled ()) {
+ if (tr && !tr->rec_enable_control()->get_value()) {
break;
}
}
@@ -5698,12 +6208,15 @@ Session::listen_position_changed ()
void
Session::solo_control_mode_changed ()
{
- /* cancel all solo or all listen when solo control mode changes */
-
- if (soloing()) {
- set_solo (get_routes(), false);
- } else if (listening()) {
- set_listen (get_routes(), false);
+ if (soloing() || listening()) {
+ /* We can't use ::clear_all_solo_state() here because during
+ session loading at program startup, that will queue a call
+ to rt_clear_all_solo_state() that will not execute until
+ AFTER solo states have been established (thus throwing away
+ the session's saved solo state). So just explicitly turn
+ them all off.
+ */
+ set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
}
}
@@ -6019,9 +6532,10 @@ Session::unknown_processors () const
void
Session::update_latency (bool playback)
{
+
DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
- if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
+ if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
return;
}
@@ -6225,75 +6739,25 @@ Session::session_name_is_legal (const string& path)
return 0;
}
-uint32_t
-Session::next_control_id () const
-{
- int subtract = 0;
-
- /* the monitor bus remote ID is in a different
- * "namespace" than regular routes. its existence doesn't
- * affect normal (low) numbered routes.
- */
-
- if (_monitor_out) {
- subtract++;
- }
-
- /* the same about masterbus in Waves Tracks */
-
- if (Profile->get_trx() && _master_out) {
- subtract++;
- }
-
- return nroutes() - subtract;
-}
-
void
-Session::notify_remote_id_change ()
+Session::notify_presentation_info_change ()
{
if (deletion_in_progress()) {
return;
}
- switch (Config->get_remote_model()) {
- case MixerOrdered:
- Route::RemoteControlIDChange (); /* EMIT SIGNAL */
- break;
- default:
- break;
- }
+ PresentationInfo::Change (); /* EMIT SIGNAL */
+ reassign_track_numbers();
#ifdef USE_TRACKS_CODE_FEATURES
- /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
- * if track order has been changed by user
- */
- reconnect_existing_routes(true, true);
+ /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
+ * if track order has been changed by user
+ */
+ reconnect_existing_routes(true, true);
#endif
}
-void
-Session::sync_order_keys ()
-{
- if (deletion_in_progress()) {
- return;
- }
-
- /* tell everyone that something has happened to the sort keys
- and let them sync up with the change(s)
- this will give objects that manage the sort order keys the
- opportunity to keep them in sync if they wish to.
- */
-
- DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
-
- reassign_track_numbers();
-
- Route::SyncOrderKeys (); /* EMIT SIGNAL */
-
- DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
-}
-
bool
Session::operation_in_progress (GQuark op) const
{
@@ -6382,3 +6846,226 @@ Session::clear_object_selection ()
follow_playhead_priority ();
#endif
}
+
+void
+Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
+ const ChanCount& input_start,
+ const ChanCount& output_start,
+ const ChanCount& input_offset,
+ const ChanCount& output_offset)
+{
+ Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
+ _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
+ input_start, output_start,
+ input_offset, output_offset));
+
+ if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
+ pthread_cond_signal (&_auto_connect_cond);
+ pthread_mutex_unlock (&_auto_connect_mutex);
+ }
+}
+
+void
+Session::queue_latency_recompute ()
+{
+ g_atomic_int_inc (&_latency_recompute_pending);
+ if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
+ pthread_cond_signal (&_auto_connect_cond);
+ pthread_mutex_unlock (&_auto_connect_mutex);
+ }
+}
+
+void
+Session::auto_connect (const AutoConnectRequest& ar)
+{
+ boost::shared_ptr<Route> route = ar.route.lock();
+
+ if (!route) { return; }
+
+ if (!IO::connecting_legal) {
+ return;
+ }
+
+ /* If both inputs and outputs are auto-connected to physical ports,
+ * use the max of input and output offsets to ensure auto-connected
+ * port numbers always match up (e.g. the first audio input and the
+ * first audio output of the route will have the same physical
+ * port number). Otherwise just use the lowest input or output
+ * offset possible.
+ */
+
+ const bool in_out_physical =
+ (Config->get_input_auto_connect() & AutoConnectPhysical)
+ && (Config->get_output_auto_connect() & AutoConnectPhysical)
+ && ar.connect_inputs;
+
+ const ChanCount in_offset = in_out_physical
+ ? ChanCount::max(ar.input_offset, ar.output_offset)
+ : ar.input_offset;
+
+ const ChanCount out_offset = in_out_physical
+ ? ChanCount::max(ar.input_offset, ar.output_offset)
+ : ar.output_offset;
+
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ vector<string> physinputs;
+ vector<string> physoutputs;
+
+ _engine.get_physical_outputs (*t, physoutputs);
+ _engine.get_physical_inputs (*t, physinputs);
+
+ if (!physinputs.empty() && ar.connect_inputs) {
+ uint32_t nphysical_in = physinputs.size();
+
+ for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
+ string port;
+
+ if (Config->get_input_auto_connect() & AutoConnectPhysical) {
+ port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
+ }
+
+ if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
+ break;
+ }
+ }
+ }
+
+ if (!physoutputs.empty()) {
+ uint32_t nphysical_out = physoutputs.size();
+ for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
+ string port;
+
+ /* Waves Tracks:
+ * do not create new connections if we reached the limit of physical outputs
+ * in Multi Out mode
+ */
+ if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
+ ARDOUR::Profile->get_trx () &&
+ ar.output_offset.get(*t) == nphysical_out ) {
+ break;
+ }
+
+ if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
+ port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
+ } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
+ /* master bus is audio only */
+ if (_master_out && _master_out->n_inputs().get(*t) > 0) {
+ port = _master_out->input()->ports().port(*t,
+ i % _master_out->input()->n_ports().get(*t))->name();
+ }
+ }
+
+ if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
+ break;
+ }
+ }
+ }
+ }
+}
+
+void
+Session::auto_connect_thread_start ()
+{
+ if (_ac_thread_active) {
+ return;
+ }
+
+ while (!_auto_connect_queue.empty ()) {
+ _auto_connect_queue.pop ();
+ }
+
+ _ac_thread_active = true;
+ if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
+ _ac_thread_active = false;
+ }
+}
+
+void
+Session::auto_connect_thread_terminate ()
+{
+ if (!_ac_thread_active) {
+ return;
+ }
+ _ac_thread_active = false;
+
+ {
+ Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
+ while (!_auto_connect_queue.empty ()) {
+ _auto_connect_queue.pop ();
+ }
+ }
+
+ if (pthread_mutex_lock (&_auto_connect_mutex) == 0) {
+ pthread_cond_signal (&_auto_connect_cond);
+ pthread_mutex_unlock (&_auto_connect_mutex);
+ }
+
+ void *status;
+ pthread_join (_auto_connect_thread, &status);
+}
+
+void *
+Session::auto_connect_thread (void *arg)
+{
+ Session *s = static_cast<Session *>(arg);
+ s->auto_connect_thread_run ();
+ pthread_exit (0);
+ return 0;
+}
+
+void
+Session::auto_connect_thread_run ()
+{
+ pthread_set_name (X_("autoconnect"));
+ SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
+ PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
+ pthread_mutex_lock (&_auto_connect_mutex);
+ while (_ac_thread_active) {
+
+ if (!_auto_connect_queue.empty ()) {
+ // Why would we need the process lock ??
+ // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
+ // graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
+ // All ardour-internal backends use a std::vector xxxAudioBackend::find_port()
+ // We have control over those, but what does jack do?
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+
+ Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
+ while (!_auto_connect_queue.empty ()) {
+ const AutoConnectRequest ar (_auto_connect_queue.front());
+ _auto_connect_queue.pop ();
+ lx.release ();
+ auto_connect (ar);
+ lx.acquire ();
+ }
+ }
+
+ if (!actively_recording ()) { // might not be needed,
+ /* this is only used for updating plugin latencies, the
+ * graph does not change. so it's safe in general.
+ * BUT..
+ * .. update_latency_compensation () entails set_capture_offset()
+ * which calls Diskstream::set_capture_offset () which
+ * modifies the capture offset... which can be a proplem
+ * in "prepare_to_stop"
+ */
+ while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
+ update_latency_compensation ();
+ }
+ }
+
+ pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
+ }
+ pthread_mutex_unlock (&_auto_connect_mutex);
+}
+
+void
+Session::cancel_all_solo ()
+{
+ StripableList sl;
+
+ get_stripables (sl);
+
+ set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
+ clear_all_solo_state (routes.reader());
+}
diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc
index 613233c..259a3a1 100644
--- a/libs/ardour/session_butler.cc
+++ b/libs/ardour/session_butler.cc
@@ -28,7 +28,7 @@
#include "ardour/track.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc
index 4cb556c..9c67ebe 100644
--- a/libs/ardour/session_click.cc
+++ b/libs/ardour/session_click.cc
@@ -31,7 +31,7 @@
#include <sndfile.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -42,8 +42,7 @@ Pool Click::pool ("click", sizeof (Click), 1024);
void
Session::click (framepos_t start, framecnt_t nframes)
{
- TempoMap::BBTPointList::const_iterator points_begin;
- TempoMap::BBTPointList::const_iterator points_end;
+ vector<TempoMap::BBTPoint> points;
Sample *buf;
framecnt_t click_distance;
@@ -72,13 +71,13 @@ Session::click (framepos_t start, framecnt_t nframes)
BufferSet& bufs = get_scratch_buffers(ChanCount(DataType::AUDIO, 1));
buf = bufs.get_audio(0).data();
- _tempo_map->get_grid (points_begin, points_end, start, end);
+ _tempo_map->get_grid (points, start, end);
- if (distance (points_begin, points_end) == 0) {
+ if (distance (points.begin(), points.end()) == 0) {
goto run_clicks;
}
- for (TempoMap::BBTPointList::const_iterator i = points_begin; i != points_end; ++i) {
+ for (vector<TempoMap::BBTPoint>::iterator i = points.begin(); i != points.end(); ++i) {
switch ((*i).beat) {
case 1:
if (click_emphasis_data && Config->get_use_click_emphasis () == true) {
@@ -134,7 +133,7 @@ Session::click (framepos_t start, framecnt_t nframes)
}
}
- _click_gain->run (bufs, 0, 0, nframes, false);
+ _click_gain->run (bufs, 0, 0, 1.0, nframes, false);
_click_io->copy_to_outputs (bufs, DataType::AUDIO, nframes, 0);
}
diff --git a/libs/ardour/session_command.cc b/libs/ardour/session_command.cc
index f2909ea..a99738a 100644
--- a/libs/ardour/session_command.cc
+++ b/libs/ardour/session_command.cc
@@ -43,7 +43,7 @@ class Command;
using namespace PBD;
using namespace ARDOUR;
-#include "i18n.h"
+#include "pbd/i18n.h"
void Session::register_with_memento_command_factory(PBD::ID id, PBD::StatefulDestructible *ptr)
{
@@ -145,7 +145,7 @@ Session::memento_command_factory(XMLNode *n)
}
/* we failed */
- error << string_compose (_("could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"), obj_T, id.to_s()) << endmsg;
+ info << string_compose (_("could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"), obj_T, id.to_s()) << endmsg;
return 0 ;
}
diff --git a/libs/ardour/session_configuration.cc b/libs/ardour/session_configuration.cc
index c8e09ad..b881471 100644
--- a/libs/ardour/session_configuration.cc
+++ b/libs/ardour/session_configuration.cc
@@ -30,7 +30,7 @@
#include "ardour/filesystem_paths.h"
#include "ardour/session_configuration.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -54,7 +54,7 @@ XMLNode&
SessionConfiguration::get_state ()
{
XMLNode* root;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
root = new XMLNode ("Ardour");
root->add_child_nocopy (get_variables ());
@@ -67,7 +67,7 @@ XMLNode&
SessionConfiguration::get_variables ()
{
XMLNode* node;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
node = new XMLNode ("Config");
@@ -159,7 +159,7 @@ SessionConfiguration::load_state ()
XMLNode* node;
if (((node = find_named_node (root, X_("Config"))) != 0)) {
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
set_variables(*node);
info << _("Loaded custom session defaults.") << endmsg;
} else {
diff --git a/libs/ardour/session_directory.cc b/libs/ardour/session_directory.cc
index 3a4d049..c52fe1a 100644
--- a/libs/ardour/session_directory.cc
+++ b/libs/ardour/session_directory.cc
@@ -30,7 +30,7 @@
#include "ardour/session_directory.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ARDOUR {
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc
index 9d11cb0..6e17545 100644
--- a/libs/ardour/session_events.cc
+++ b/libs/ardour/session_events.cc
@@ -28,7 +28,7 @@
#include "ardour/debug.h"
#include "ardour/session_event.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc
index 8908716..463f504 100644
--- a/libs/ardour/session_export.cc
+++ b/libs/ardour/session_export.cc
@@ -31,7 +31,7 @@
#include "ardour/session.h"
#include "ardour/track.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -73,12 +73,16 @@ Session::pre_export ()
}
}
- /* make sure we are actually rolling */
+ /* prepare transport */
+
+ realtime_stop (true, true);
if (get_record_enabled()) {
disable_record (false);
}
+ unset_play_loop ();
+
/* no slaving */
post_export_sync = config.get_external_sync ();
@@ -100,12 +104,35 @@ Session::pre_export ()
/** Called for each range that is being exported */
int
-Session::start_audio_export (framepos_t position)
+Session::start_audio_export (framepos_t position, bool realtime)
{
if (!_exporting) {
pre_export ();
}
- _export_started = false;
+
+ _realtime_export = realtime;
+
+ if (realtime) {
+ _export_preroll = nominal_frame_rate ();
+ } else {
+ _export_preroll = Config->get_export_preroll() * nominal_frame_rate ();
+ }
+
+ if (_export_preroll == 0) {
+ // must be > 0 so that transport is started in sync.
+ _export_preroll = 1;
+ }
+
+ /* "worst_track_latency" is the correct value for stem-exports
+ * see to Route::add_export_point(),
+ *
+ * for master-bus export, we'd need to add the master's latency.
+ * or actually longest-total-session-latency.
+ *
+ * We can't use worst_playback_latency because that includes
+ * includes external latencies and would overcompensate.
+ */
+ _export_latency = worst_track_latency ();
/* We're about to call Track::seek, so the butler must have finished everything
up otherwise it could be doing do_refill in its thread while we are doing
@@ -151,11 +178,19 @@ Session::start_audio_export (framepos_t position)
}
_engine.Freewheel.connect_same_thread (export_freewheel_connection, boost::bind (&Session::process_export_fw, this, _1));
- _export_rolling = true;
- return _engine.freewheel (true);
+
+ if (_realtime_export) {
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+ _export_rolling = true;
+ process_function = &Session::process_export_fw;
+ return 0;
+ } else {
+ _export_rolling = true;
+ return _engine.freewheel (true);
+ }
}
-int
+void
Session::process_export (pframes_t nframes)
{
if (_export_rolling && export_status->stop) {
@@ -163,14 +198,18 @@ Session::process_export (pframes_t nframes)
}
if (_export_rolling) {
- /* make sure we've caught up with disk i/o, since
- we're running faster than realtime c/o JACK.
- */
- _butler->wait_until_finished ();
+ if (!_realtime_export) {
+ /* make sure we've caught up with disk i/o, since
+ * we're running faster than realtime c/o JACK.
+ */
+ _butler->wait_until_finished ();
+ }
/* do the usual stuff */
process_without_events (nframes);
+ } else if (_realtime_export) {
+ fail_roll (nframes); // somehow we need to silence _ALL_ output buffers
}
try {
@@ -181,29 +220,66 @@ Session::process_export (pframes_t nframes)
} catch (std::exception & e) {
error << string_compose (_("Export ended unexpectedly: %1"), e.what()) << endmsg;
export_status->abort (true);
- return -1;
}
-
- return 0;
}
-int
+void
Session::process_export_fw (pframes_t nframes)
{
- if (!_export_started) {
- _export_started = true;
+ const bool need_buffers = _engine.freewheeling ();
+ if (_export_preroll > 0) {
+
+ if (need_buffers) {
+ _engine.main_thread()->get_buffers ();
+ }
+ fail_roll (nframes);
+ if (need_buffers) {
+ _engine.main_thread()->drop_buffers ();
+ }
+
+ _export_preroll -= std::min ((framepos_t)nframes, _export_preroll);
+
+ if (_export_preroll > 0) {
+ // clear out buffers (reverb tails etc).
+ return;
+ }
+
set_transport_speed (1.0, 0, false);
butler_transport_work ();
g_atomic_int_set (&_butler->should_do_transport_work, 0);
post_transport ();
- return 0;
+
+ return;
+ }
+
+ if (_export_latency > 0) {
+ framepos_t remain = std::min ((framepos_t)nframes, _export_latency);
+
+ if (need_buffers) {
+ _engine.main_thread()->get_buffers ();
+ }
+ process_without_events (remain);
+ if (need_buffers) {
+ _engine.main_thread()->drop_buffers ();
+ }
+
+ _export_latency -= remain;
+ nframes -= remain;
+
+ if (nframes == 0) {
+ return;
+ }
}
- _engine.main_thread()->get_buffers ();
+ if (need_buffers) {
+ _engine.main_thread()->get_buffers ();
+ }
process_export (nframes);
- _engine.main_thread()->drop_buffers ();
+ if (need_buffers) {
+ _engine.main_thread()->drop_buffers ();
+ }
- return 0;
+ return;
}
int
@@ -232,8 +308,11 @@ Session::finalize_audio_export ()
/* Clean up */
+ if (_realtime_export) {
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+ process_function = &Session::process_with_events;
+ }
_engine.freewheel (false);
-
export_freewheel_connection.disconnect();
_mmc->enable_send (_pre_export_mmc_enabled);
diff --git a/libs/ardour/session_handle.cc b/libs/ardour/session_handle.cc
index 99358da..2a14f8a 100644
--- a/libs/ardour/session_handle.cc
+++ b/libs/ardour/session_handle.cc
@@ -19,12 +19,12 @@
#include "pbd/demangle.h"
#include "pbd/error.h"
-#include "pbd/boost_debug.h"
+#include "ardour/boost_debug.h"
#include "ardour/session.h"
#include "ardour/session_handle.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc
index 2cd21f9..945f965 100644
--- a/libs/ardour/session_ltc.cc
+++ b/libs/ardour/session_ltc.cc
@@ -27,7 +27,7 @@
#include "ardour/session.h"
#include "ardour/slave.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc
index baff2c7..fa23880 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -48,7 +48,7 @@
#include "ardour/slave.h"
#include "ardour/ticker.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -335,6 +335,36 @@ Session::mmc_shuttle (MIDI::MachineControl &/*mmc*/, float speed, bool forw)
}
}
+boost::shared_ptr<Route>
+Session::get_midi_nth_route_by_id (PresentationInfo::order_t n) const
+{
+ PresentationInfo::Flag f;
+
+ /* These numbers are defined by the MMC specification.
+ */
+
+ if (n == 318) {
+ f = PresentationInfo::MasterOut;
+ } else if (n == 319) {
+ f = PresentationInfo::MonitorOut;
+ } else {
+ f = PresentationInfo::Route;
+ }
+
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ PresentationInfo::order_t match_cnt = 0;
+
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ if ((*i)->presentation_info().flag_match (f)) {
+ if (match_cnt++ == n) {
+ return *i;
+ }
+ }
+ }
+
+ return boost::shared_ptr<Route>();
+}
+
void
Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
{
@@ -342,17 +372,13 @@ Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
return;
}
- RouteList::iterator i;
- boost::shared_ptr<RouteList> r = routes.reader();
+ boost::shared_ptr<Route> r = get_midi_nth_route_by_id (trk);
- for (i = r->begin(); i != r->end(); ++i) {
- AudioTrack *at;
+ if (r) {
+ boost::shared_ptr<AudioTrack> at;
- if ((at = dynamic_cast<AudioTrack*>((*i).get())) != 0) {
- if (trk == at->remote_control_id()) {
- at->set_record_enabled (enabled, Controllable::UseGroup);
- break;
- }
+ if ((at = boost::dynamic_pointer_cast<AudioTrack> (r))) {
+ at->rec_enable_control()->set_value (enabled, Controllable::UseGroup);
}
}
}
@@ -387,16 +413,29 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
framepos_t mtc_tc;
timecode_to_sample(timecode, mtc_tc, true, false);
outbound_mtc_timecode_frame = mtc_tc;
-
transmitting_timecode_time = timecode;
+ LatencyRange mtc_out_latency = {0, 0}; // TODO cache this, update on engine().GraphReordered()
+ _midi_ports->mtc_output_port ()->get_connected_latency_range (ltc_out_latency, true);
+ frameoffset_t mtc_offset = worst_playback_latency() - mtc_out_latency.max;
+
+ // only if rolling.. ?
+ outbound_mtc_timecode_frame += mtc_offset;
+
+ // outbound_mtc_timecode_frame needs to be >= _transport_frame
+ // or a new full timecode will be queued next cycle.
+ while (outbound_mtc_timecode_frame < t) {
+ Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
+ outbound_mtc_timecode_frame += _frames_per_timecode_frame;
+ }
+
double const quarter_frame_duration = ((framecnt_t) _frames_per_timecode_frame) / 4.0;
if (ceil((t - mtc_tc) / quarter_frame_duration) > 0) {
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
}
- DEBUG_TRACE (DEBUG::MTC, string_compose ("Full MTC TC %1\n", outbound_mtc_timecode_frame));
+ DEBUG_TRACE (DEBUG::MTC, string_compose ("Full MTC TC %1 (off %2)\n", outbound_mtc_timecode_frame, mtc_offset));
// I don't understand this bit yet.. [DR]
// I do [rg]:
@@ -407,21 +446,6 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
}
-#if 0 // compensate for audio latency -- disabled [rg]
- /* this needs more thought and work.
- * the proper solution will be to just offset MTC by the MIDI port's latency.
- *
- * using worst_playback_latency() is wrong when the generated MTC is used to sync
- * clients which send audio to Ardour for recording.
- * worst_capture_latency() vs. worst_playback_latency()
- *
- * NB. similarly to session_ltc, the offset should be subtracted from the timecode to send,
- * instead of being added to timestamp when to send the timecode.
- * Otherwise the timestamp may not fall into the jack-cycle of the current _transport frame.
- * and no MTC QF will be sent.
- */
- outbound_mtc_timecode_frame += worst_playback_latency();
-#endif
next_quarter_frame_to_send = 0;
// Sync slave to the same Timecode time as we are on
@@ -456,6 +480,8 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
int
Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_frame, ARDOUR::pframes_t nframes)
{
+ // start_frame == start_frame for normal cycles
+ // start_frame > _transport_frame for split cycles
if (_engine.freewheeling() || !_send_qf_mtc || transmitting_timecode_time.negative || (next_quarter_frame_to_send < 0)) {
// cerr << "(MTC) Not sending MTC\n";
return 0;
@@ -464,6 +490,11 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
return 0;
}
+ if (_transport_speed < 0) {
+ // we don't support rolling backwards
+ return 0;
+ }
+
/* MTC is max. 30 fps - assert() below will fail
* TODO actually limit it to 24,25,29df,30fps
* talk to oofus, first.
@@ -483,7 +514,12 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
next_quarter_frame_to_send, quarter_frame_duration));
if (rint(outbound_mtc_timecode_frame + (next_quarter_frame_to_send * quarter_frame_duration)) < _transport_frame) {
+ // send full timecode and set outbound_mtc_timecode_frame, next_quarter_frame_to_send
send_full_time_code (_transport_frame, nframes);
+ }
+
+ if (rint(outbound_mtc_timecode_frame + (next_quarter_frame_to_send * quarter_frame_duration)) < start_frame) {
+ // no QF for this cycle
return 0;
}
@@ -555,8 +591,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
// Increment timecode time twice
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
- // Re-calculate timing of first quarter frame
- //timecode_to_sample( transmitting_timecode_time, outbound_mtc_timecode_frame, true /* use_offset */, false );
+ // Increment timing of first quarter frame
outbound_mtc_timecode_frame += 2.0 * _frames_per_timecode_frame;
}
}
@@ -687,4 +722,3 @@ Session::mtc_input_port () const
{
return _midi_ports->mtc_input_port ();
}
-
diff --git a/libs/ardour/session_object.cc b/libs/ardour/session_object.cc
index 39b3155..683d174 100644
--- a/libs/ardour/session_object.cc
+++ b/libs/ardour/session_object.cc
@@ -22,7 +22,7 @@
#include "ardour/debug.h"
#include "ardour/session_object.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc
index 649d429..95982b6 100644
--- a/libs/ardour/session_playlists.cc
+++ b/libs/ardour/session_playlists.cc
@@ -23,7 +23,7 @@
#include "ardour/playlist_factory.h"
#include "ardour/session_playlists.h"
#include "ardour/track.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/compose.h"
#include "pbd/xml++.h"
@@ -244,7 +244,6 @@ SessionPlaylists::destroy_region (boost::shared_ptr<Region> r)
}
}
-
void
SessionPlaylists::find_equivalent_playlist_regions (boost::shared_ptr<Region> region, vector<boost::shared_ptr<Region> >& result)
{
@@ -260,6 +259,10 @@ SessionPlaylists::source_use_count (boost::shared_ptr<const Source> src) const
{
uint32_t count = 0;
+ /* XXXX this can go wildly wrong in the presence of circular references
+ * between compound regions.
+ */
+
for (List::const_iterator p = playlists.begin(); p != playlists.end(); ++p) {
if ((*p)->uses_source (src)) {
++count;
@@ -500,3 +503,19 @@ SessionPlaylists::playlists_for_track (boost::shared_ptr<Track> tr) const
return pl_tr;
}
+
+void
+SessionPlaylists::foreach (boost::function<void(boost::shared_ptr<const Playlist>)> functor)
+{
+ Glib::Threads::Mutex::Lock lm (lock);
+ for (List::iterator i = playlists.begin(); i != playlists.end(); i++) {
+ if (!(*i)->hidden()) {
+ functor (*i);
+ }
+ }
+ for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); i++) {
+ if (!(*i)->hidden()) {
+ functor (*i);
+ }
+ }
+}
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 6f4ae53..eaa1d05 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -43,7 +43,7 @@
#include "midi++/mmc.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -358,6 +358,7 @@ Session::process_with_events (pframes_t nframes)
}
if (events.empty() || next_event == events.end()) {
+ try_run_lua (nframes); // also during export ?? ->move to process_without_events()
process_without_events (nframes);
return;
}
@@ -425,6 +426,8 @@ Session::process_with_events (pframes_t nframes)
this_nframes = abs (floor(frames_moved / _transport_speed));
}
+ try_run_lua (this_nframes);
+
if (this_nframes) {
click (_transport_frame, this_nframes);
diff --git a/libs/ardour/session_rtevents.cc b/libs/ardour/session_rtevents.cc
index 132f706..00d966a 100644
--- a/libs/ardour/session_rtevents.cc
+++ b/libs/ardour/session_rtevents.cc
@@ -21,11 +21,13 @@
#include "pbd/error.h"
#include "pbd/compose.h"
-#include "ardour/session.h"
+#include "ardour/monitor_control.h"
#include "ardour/route.h"
+#include "ardour/session.h"
#include "ardour/track.h"
+#include "ardour/vca_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -33,231 +35,59 @@ using namespace ARDOUR;
using namespace Glib;
void
-Session::set_monitoring (boost::shared_ptr<RouteList> rl, MonitorChoice mc,
- SessionEvent::RTeventCallback after,
- Controllable::GroupControlDisposition group_override)
-{
- queue_event (get_rt_event (rl, mc, after, group_override, &Session::rt_set_monitoring));
-}
-
-void
-Session::rt_set_monitoring (boost::shared_ptr<RouteList> rl, MonitorChoice mc, Controllable::GroupControlDisposition group_override)
-{
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if (!(*i)->is_auditioner()) {
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
- if (t) {
- t->set_monitoring (mc, group_override);
- }
- }
- }
-
- set_dirty();
-}
-
-void
-Session::clear_all_solo_state (boost::shared_ptr<RouteList> rl)
-{
- queue_event (get_rt_event (rl, false, rt_cleanup, Controllable::NoGroup, &Session::rt_clear_all_solo_state));
-}
-
-void
-Session::rt_clear_all_solo_state (boost::shared_ptr<RouteList> rl, bool /* yn */, Controllable::GroupControlDisposition /* group_override */)
-{
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if ((*i)->is_auditioner()) {
- continue;
- }
- (*i)->clear_all_solo_state();
- }
- set_dirty();
-}
-
-void
-Session::set_solo (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after,
- Controllable::GroupControlDisposition group_override)
-{
- queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_solo));
-}
-
-void
-Session::rt_set_solo (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
-{
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if (!(*i)->is_auditioner()) {
- (*i)->set_solo (yn, group_override);
- }
- }
-
- set_dirty();
- /* XXX boost::shared_ptr<RouteList> goes out of scope here and is likley free()ed in RT context
- * because boost's shared_ptr does reference counting and free/delete in the dtor.
- * (this also applies to other rt_ methods here)
- */
-}
-
-void
-Session::set_just_one_solo (boost::shared_ptr<Route> r, bool yn, SessionEvent::RTeventCallback after)
-{
- /* its a bit silly to have to do this, but it keeps the API for this public method sane (we're
- only going to solo one route) and keeps our ability to use get_rt_event() for the internal
- private method.
- */
-
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (r);
-
- queue_event (get_rt_event (rl, yn, after, Controllable::NoGroup, &Session::rt_set_just_one_solo));
-}
-
-void
-Session::rt_set_just_one_solo (boost::shared_ptr<RouteList> just_one, bool yn, Controllable::GroupControlDisposition /*ignored*/)
-{
- boost::shared_ptr<RouteList> rl = routes.reader ();
- boost::shared_ptr<Route> r = just_one->front();
-
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if (!(*i)->is_auditioner() && r != *i) {
- (*i)->set_solo (!yn, Controllable::NoGroup);
- }
- }
-
- r->set_solo (yn, Controllable::NoGroup);
-
- set_dirty();
-}
-
-void
-Session::set_listen (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
- queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_listen));
-}
-
-void
-Session::rt_set_listen (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::set_controls (boost::shared_ptr<ControlList> cl, double val, Controllable::GroupControlDisposition gcd)
{
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if (!(*i)->is_auditioner()) {
- (*i)->set_listen (yn, group_override);
- }
+ if (cl->empty()) {
+ return;
}
- set_dirty();
-}
-
-void
-Session::set_mute (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
- /* Set superficial value of mute controls for automation. */
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- boost::shared_ptr<Route::MuteControllable> mc = (*i)->mute_control();
- mc->set_superficial_value(yn);
+ for (ControlList::iterator ci = cl->begin(); ci != cl->end(); ++ci) {
+ /* as of july 2017 this is a no-op for everything except record enable */
+ (*ci)->do_pre_realtime_queue_stuff (val);
}
- queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_mute));
+ queue_event (get_rt_event (cl, val, gcd));
}
void
-Session::rt_set_mute (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::set_control (boost::shared_ptr<AutomationControl> ac, double val, Controllable::GroupControlDisposition gcd)
{
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if (!(*i)->is_monitor() && !(*i)->is_auditioner()) {
- (*i)->set_mute (yn, group_override);
- }
+ if (!ac) {
+ return;
}
- set_dirty();
-}
-
-void
-Session::set_solo_isolated (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
- queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_solo_isolated));
+ boost::shared_ptr<ControlList> cl (new ControlList);
+ cl->push_back (ac);
+ set_controls (cl, val, gcd);
}
void
-Session::rt_set_solo_isolated (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::rt_set_controls (boost::shared_ptr<ControlList> cl, double val, Controllable::GroupControlDisposition gcd)
{
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
- (*i)->set_solo_isolated (yn, group_override);
- }
+ for (ControlList::iterator c = cl->begin(); c != cl->end(); ++c) {
+ (*c)->set_value (val, gcd);
}
-
- set_dirty();
}
void
-Session::set_record_enabled (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
+Session::clear_all_solo_state (boost::shared_ptr<RouteList> rl)
{
- if (!writable()) {
- return;
- }
-
- /* do the non-RT part of rec-enabling first - the RT part will be done
- * on the next process cycle. This does mean that theoretically we are
- * doing things provisionally on the assumption that the rec-enable
- * change will work, but this had better be a solid assumption for
- * other reasons.
- */
-
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if ((*i)->is_auditioner() || (*i)->record_safe ()) {
- continue;
- }
-
- boost::shared_ptr<Track> t;
-
- if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
- t->prep_record_enabled (yn, group_override);
- }
- }
-
- queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_record_enabled));
+ queue_event (get_rt_event (rl, false, rt_cleanup, Controllable::NoGroup, &Session::rt_clear_all_solo_state));
}
void
-Session::rt_set_record_enabled (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::rt_clear_all_solo_state (boost::shared_ptr<RouteList> rl, bool /* yn */, Controllable::GroupControlDisposition /* group_override */)
{
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- if ((*i)->is_auditioner() || (*i)->record_safe ()) {
+ if ((*i)->is_auditioner()) {
continue;
}
-
- boost::shared_ptr<Track> t;
-
- if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
- t->set_record_enabled (yn, group_override);
- }
+ (*i)->clear_all_solo_state();
}
- set_dirty ();
-}
+ _vca_manager->clear_all_solo_state ();
-
-void
-Session::set_record_safe (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
- set_record_enabled (rl, false, after, group_override);
- queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_record_safe));
-}
-
-void
-Session::rt_set_record_safe (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
-{
- for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
- if ((*i)->is_auditioner ()) { // REQUIRES REVIEW Can audiotioner be in Record Safe mode?
- continue;
- }
-
- boost::shared_ptr<Track> t;
-
- if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
- t->set_record_safe (yn, group_override);
- }
- }
-
- set_dirty ();
+ set_dirty();
}
void
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 5ad9769..76cf2d3 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -29,6 +29,7 @@
#include <cerrno>
#include <cstdio> /* snprintf(3) ... grrr */
#include <cmath>
+
#include <unistd.h>
#include <climits>
#include <signal.h>
@@ -38,7 +39,7 @@
#include <sys/vfs.h>
#endif
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__FreeBSD__)
#include <sys/param.h>
#include <sys/mount.h>
#endif
@@ -61,9 +62,7 @@
#include "evoral/SMF.hpp"
-#include "pbd/boost_debug.h"
#include "pbd/basename.h"
-#include "pbd/controllable_descriptor.h"
#include "pbd/debug.h"
#include "pbd/enumwriter.h"
#include "pbd/error.h"
@@ -82,8 +81,11 @@
#include "ardour/audioengine.h"
#include "ardour/audiofilesource.h"
#include "ardour/audioregion.h"
+#include "ardour/auditioner.h"
#include "ardour/automation_control.h"
+#include "ardour/boost_debug.h"
#include "ardour/butler.h"
+#include "ardour/controllable_descriptor.h"
#include "ardour/control_protocol_manager.h"
#include "ardour/directory_names.h"
#include "ardour/filename_extensions.h"
@@ -104,6 +106,7 @@
#include "ardour/proxy_controllable.h"
#include "ardour/recent_sessions.h"
#include "ardour/region_factory.h"
+#include "ardour/revision.h"
#include "ardour/route_group.h"
#include "ardour/send.h"
#include "ardour/session.h"
@@ -119,10 +122,14 @@
#include "ardour/tempo.h"
#include "ardour/ticker.h"
#include "ardour/user_bundle.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
#include "control_protocol/control_protocol.h"
-#include "i18n.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -246,9 +253,11 @@ Session::post_engine_init ()
delete _tempo_map;
_tempo_map = new TempoMap (_current_frame_rate);
_tempo_map->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::tempo_map_changed, this, _1));
+ _tempo_map->MetricPositionChanged.connect_same_thread (*this, boost::bind (&Session::gui_tempo_map_changed, this));
/* MidiClock requires a tempo map */
+ delete midi_clock;
midi_clock = new MidiClockTicker ();
midi_clock->set_session (this);
@@ -621,7 +630,7 @@ Session::create (const string& session_template, BusProfile* bus_profile)
_state_of_the_state = Clean;
- /* set up Master Out and Control Out if necessary */
+ /* set up Master Out and Monitor Out if necessary */
if (bus_profile) {
@@ -630,14 +639,14 @@ Session::create (const string& session_template, BusProfile* bus_profile)
// Waves Tracks: always create master bus for Tracks
if (ARDOUR::Profile->get_trx() || bus_profile->master_out_channels) {
- boost::shared_ptr<Route> r (new Route (*this, _("Master"), Route::MasterOut, DataType::AUDIO));
+ boost::shared_ptr<Route> r (new Route (*this, _("Master"), PresentationInfo::MasterOut, DataType::AUDIO));
if (r->init ()) {
return -1;
}
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
- {
+
+ BOOST_MARK_ROUTE(r);
+
+ {
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
r->input()->ensure_io (count, false, this);
r->output()->ensure_io (count, false, this);
@@ -651,7 +660,7 @@ Session::create (const string& session_template, BusProfile* bus_profile)
}
if (!rl.empty()) {
- add_routes (rl, false, false, false);
+ add_routes (rl, false, false, false, PresentationInfo::max_order);
}
// Waves Tracks: Skip this. Always use autoconnection for Tracks
@@ -756,6 +765,8 @@ Session::remove_state (string snapshot_name)
int
Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot, bool template_only)
{
+ DEBUG_TRACE (DEBUG::Locale, string_compose ("Session::save_state locale '%1'\n", setlocale (LC_NUMERIC, NULL)));
+
XMLTree tree;
std::string xml_path(_session_dir->root_path());
@@ -780,6 +791,10 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
return 1;
}
+#ifndef NDEBUG
+ const int64_t save_start_time = g_get_monotonic_time();
+#endif
+
/* tell sources we're saving first, in case they write out to a new file
* which should be saved with the state rather than the old one */
for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
@@ -877,6 +892,10 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
StateSaved (snapshot_name); /* EMIT SIGNAL */
}
+#ifndef NDEBUG
+ const int64_t elapsed_time_us = g_get_monotonic_time() - save_start_time;
+ cerr << "saved state in " << fixed << setprecision (1) << elapsed_time_us / 1000. << " ms\n";
+#endif
return 0;
}
@@ -938,7 +957,7 @@ Session::load_state (string snapshot_name)
return -1;
}
- XMLNode& root (*state_tree->root());
+ XMLNode const & root (*state_tree->root());
if (root.name() != X_("Session")) {
error << string_compose (_("Session file %1 is not a session"), xmlpath) << endmsg;
@@ -947,7 +966,7 @@ Session::load_state (string snapshot_name)
return -1;
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = root.property ("version")) == 0) {
/* no version implies very old version of Ardour */
@@ -991,7 +1010,7 @@ Session::load_state (string snapshot_name)
int
Session::load_options (const XMLNode& node)
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
config.set_variables (node);
return 0;
}
@@ -1024,6 +1043,7 @@ Session::get_template()
XMLNode&
Session::state (bool full_state)
{
+ LocaleGuard lg;
XMLNode* node = new XMLNode("Session");
XMLNode* child;
@@ -1031,12 +1051,18 @@ Session::state (bool full_state)
snprintf(buf, sizeof(buf), "%d", CURRENT_SESSION_FILE_VERSION);
node->add_property("version", buf);
+ child = node->add_child ("ProgramVersion");
+ child->add_property("created-with", created_with);
+
+ std::string modified_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
+ child->add_property("modified-with", modified_with);
+
/* store configuration settings */
if (full_state) {
node->add_property ("name", _name);
- snprintf (buf, sizeof (buf), "%" PRId64, _nominal_frame_rate);
+ snprintf (buf, sizeof (buf), "%" PRId64, _base_frame_rate);
node->add_property ("sample-rate", buf);
if (session_dirs.size() > 1) {
@@ -1069,16 +1095,26 @@ Session::state (bool full_state)
}
}
+ node->add_property ("end-is-free", _session_range_end_is_free ? X_("yes") : X_("no"));
+
/* save the ID counter */
snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
node->add_property ("id-counter", buf);
+ snprintf (buf, sizeof (buf), "%u", name_id_counter ());
+ node->add_property ("name-counter", buf);
+
/* save the event ID counter */
snprintf (buf, sizeof (buf), "%d", Evoral::event_id_counter());
node->add_property ("event-counter", buf);
+ /* save the VCA counter */
+
+ snprintf (buf, sizeof (buf), "%" PRIu32, VCA::get_next_vca_number());
+ node->add_property ("vca-counter", buf);
+
/* various options */
list<XMLNode*> midi_port_nodes = _midi_ports->get_midi_port_states();
@@ -1193,6 +1229,8 @@ Session::state (bool full_state)
}
}
+ node->add_child_nocopy (_vca_manager->get_state());
+
child = node->add_child ("Routes");
{
boost::shared_ptr<RouteList> r = routes.reader ();
@@ -1201,7 +1239,7 @@ Session::state (bool full_state)
RouteList public_order (*r);
public_order.sort (cmp);
- /* the sort should have put control outs first */
+ /* the sort should have put the monitor out first */
if (_monitor_out) {
assert (_monitor_out == public_order.front());
@@ -1249,6 +1287,26 @@ Session::state (bool full_state)
node->add_child_copy (*_extra_xml);
}
+ {
+ Glib::Threads::Mutex::Lock lm (lua_lock);
+ std::string saved;
+ {
+ luabridge::LuaRef savedstate ((*_lua_save)());
+ saved = savedstate.cast<std::string>();
+ }
+ lua.collect_garbage ();
+ lm.release ();
+
+ gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ());
+ std::string b64s (b64);
+ g_free (b64);
+
+ XMLNode* script_node = new XMLNode (X_("Script"));
+ script_node->add_property (X_("lua"), LUA_VERSION);
+ script_node->add_content (b64s);
+ node->add_child_nocopy (*script_node);
+ }
+
return *node;
}
@@ -1262,9 +1320,10 @@ Session::get_control_protocol_state ()
int
Session::set_state (const XMLNode& node, int version)
{
+ LocaleGuard lg;
XMLNodeList nlist;
XMLNode* child;
- const XMLProperty* prop;
+ XMLProperty const * prop;
int ret = -1;
_state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
@@ -1280,18 +1339,31 @@ Session::set_state (const XMLNode& node, int version)
if ((prop = node.property (X_("sample-rate"))) != 0) {
- _nominal_frame_rate = atoi (prop->value());
+ _base_frame_rate = atoi (prop->value());
+ _nominal_frame_rate = _base_frame_rate;
- if (_nominal_frame_rate != _current_frame_rate) {
- boost::optional<int> r = AskAboutSampleRateMismatch (_nominal_frame_rate, _current_frame_rate);
+ assert (AudioEngine::instance()->running ());
+ if (_base_frame_rate != AudioEngine::instance()->sample_rate ()) {
+ boost::optional<int> r = AskAboutSampleRateMismatch (_base_frame_rate, _current_frame_rate);
if (r.get_value_or (0)) {
goto out;
}
}
}
+ created_with = "unknown";
+ if ((child = find_named_node (node, "ProgramVersion")) != 0) {
+ if ((prop = child->property (X_("created-with"))) != 0) {
+ created_with = prop->value ();
+ }
+ }
+
setup_raid_path(_session_dir->root_path());
+ if ((prop = node.property (X_("end-is-free"))) != 0) {
+ _session_range_end_is_free = string_is_affirmative (prop->value());
+ }
+
if ((prop = node.property (X_("id-counter"))) != 0) {
uint64_t x;
sscanf (prop->value().c_str(), "%" PRIu64, &x);
@@ -1306,10 +1378,21 @@ Session::set_state (const XMLNode& node, int version)
ID::init_counter (now);
}
- if ((prop = node.property (X_("event-counter"))) != 0) {
- Evoral::init_event_id_counter (atoi (prop->value()));
- }
+ if ((prop = node.property (X_("name-counter"))) != 0) {
+ init_name_id_counter (atoi (prop->value()));
+ }
+ if ((prop = node.property (X_("event-counter"))) != 0) {
+ Evoral::init_event_id_counter (atoi (prop->value()));
+ }
+
+ if ((prop = node.property (X_("vca-counter"))) != 0) {
+ uint32_t x;
+ sscanf (prop->value().c_str(), "%" PRIu32, &x);
+ VCA::set_next_vca_number (x);
+ } else {
+ VCA::set_next_vca_number (1);
+ }
if ((child = find_named_node (node, "MIDIPorts")) != 0) {
_midi_ports->set_midi_port_states (child->children());
@@ -1413,6 +1496,10 @@ Session::set_state (const XMLNode& node, int version)
}
}
+ if ((child = find_named_node (node, VCAManager::xml_node_name)) != 0) {
+ _vca_manager->set_state (*child, version);
+ }
+
if ((child = find_named_node (node, "Routes")) == 0) {
error << _("Session: XML state has no routes section") << endmsg;
goto out;
@@ -1420,6 +1507,10 @@ Session::set_state (const XMLNode& node, int version)
goto out;
}
+ /* Now that we have Routes and masters loaded, connect them if appropriate */
+
+ Slavable::Assign (_vca_manager); /* EMIT SIGNAL */
+
/* our diskstreams list is no longer needed as they are now all owned by their Route */
_diskstreams_2X.clear ();
@@ -1459,6 +1550,21 @@ Session::set_state (const XMLNode& node, int version)
ControlProtocolManager::instance().set_state (*child, version);
}
+ if ((child = find_named_node (node, "Script"))) {
+ for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+ if (!(*n)->is_content ()) { continue; }
+ gsize size;
+ guchar* buf = g_base64_decode ((*n)->content ().c_str (), &size);
+ try {
+ Glib::Threads::Mutex::Lock lm (lua_lock);
+ (*_lua_load)(std::string ((const char*)buf, size));
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+ g_free (buf);
+ }
+ }
+
update_route_record_state ();
/* here beginneth the second phase ... */
@@ -1508,7 +1614,7 @@ Session::load_routes (const XMLNode& node, int version)
BootMessage (_("Tracks/busses loaded; Adding to Session"));
- add_routes (new_routes, false, false, false);
+ add_routes (new_routes, false, false, false, PresentationInfo::max_order);
BootMessage (_("Finished adding tracks/busses"));
@@ -1527,7 +1633,7 @@ Session::XMLRouteFactory (const XMLNode& node, int version)
XMLNode* ds_child = find_named_node (node, X_("Diskstream"));
DataType type = DataType::AUDIO;
- const XMLProperty* prop = node.property("default-type");
+ XMLProperty const * prop = node.property("default-type");
if (prop) {
type = DataType (prop->value());
@@ -1553,24 +1659,15 @@ Session::XMLRouteFactory (const XMLNode& node, int version)
return ret;
}
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+ BOOST_MARK_TRACK (track);
ret = track;
} else {
- enum Route::Flag flags = Route::Flag(0);
- const XMLProperty* prop = node.property("flags");
- if (prop) {
- flags = Route::Flag (string_2_enum (prop->value(), flags));
- }
-
+ PresentationInfo::Flag flags = PresentationInfo::get_flags (node);
boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags));
if (r->init () == 0 && r->set_state (node, version) == 0) {
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
+ BOOST_MARK_ROUTE (r);
ret = r;
}
}
@@ -1593,7 +1690,7 @@ Session::XMLRouteFactory_2X (const XMLNode& node, int version)
}
DataType type = DataType::AUDIO;
- const XMLProperty* prop = node.property("default-type");
+ XMLProperty const * prop = node.property("default-type");
if (prop) {
type = DataType (prop->value());
@@ -1631,24 +1728,15 @@ Session::XMLRouteFactory_2X (const XMLNode& node, int version)
track->set_diskstream (*i);
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+ BOOST_MARK_TRACK (track);
ret = track;
} else {
- enum Route::Flag flags = Route::Flag(0);
- const XMLProperty* prop = node.property("flags");
- if (prop) {
- flags = Route::Flag (string_2_enum (prop->value(), flags));
- }
-
+ PresentationInfo::Flag flags = PresentationInfo::get_flags (node);
boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags));
if (r->init () == 0 && r->set_state (node, version) == 0) {
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
- // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
+ BOOST_MARK_ROUTE (r);
ret = r;
}
}
@@ -1670,7 +1758,7 @@ Session::load_regions (const XMLNode& node)
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((region = XMLRegionFactory (**niter, false)) == 0) {
error << _("Session: cannot create Region from XML description.");
- const XMLProperty *name = (**niter).property("name");
+ XMLProperty const * name = (**niter).property("name");
if (name) {
error << " " << string_compose (_("Can not load state for region '%1'"), name->value());
@@ -1688,7 +1776,7 @@ Session::load_compounds (const XMLNode& node)
{
XMLNodeList calist = node.children();
XMLNodeConstIterator caiter;
- XMLProperty *caprop;
+ XMLProperty const * caprop;
for (caiter = calist.begin(); caiter != calist.end(); ++caiter) {
XMLNode* ca = *caiter;
@@ -1735,7 +1823,7 @@ Session::load_nested_sources (const XMLNode& node)
/* it may already exist, so don't recreate it unnecessarily
*/
- XMLProperty* prop = (*niter)->property (X_("id"));
+ XMLProperty const * prop = (*niter)->property (X_("id"));
if (!prop) {
error << _("Nested source has no ID info in session file! (ignored)") << endmsg;
continue;
@@ -1759,7 +1847,7 @@ Session::load_nested_sources (const XMLNode& node)
boost::shared_ptr<Region>
Session::XMLRegionFactory (const XMLNode& node, bool full)
{
- const XMLProperty* type = node.property("type");
+ XMLProperty const * type = node.property("type");
try {
@@ -1788,7 +1876,7 @@ Session::XMLRegionFactory (const XMLNode& node, bool full)
boost::shared_ptr<AudioRegion>
Session::XMLAudioRegionFactory (const XMLNode& node, bool /*full*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
boost::shared_ptr<Source> source;
boost::shared_ptr<AudioSource> as;
SourceList sources;
@@ -1907,7 +1995,7 @@ Session::XMLAudioRegionFactory (const XMLNode& node, bool /*full*/)
boost::shared_ptr<MidiRegion>
Session::XMLMidiRegionFactory (const XMLNode& node, bool /*full*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
boost::shared_ptr<Source> source;
boost::shared_ptr<MidiSource> ms;
SourceList sources;
@@ -2180,7 +2268,7 @@ Session::save_template (string template_name, bool replace_existing)
void
Session::refresh_disk_space ()
{
-#if __APPLE__ || (HAVE_SYS_VFS_H && HAVE_SYS_STATVFS_H)
+#if __APPLE__ || __FreeBSD__ || (HAVE_SYS_VFS_H && HAVE_SYS_STATVFS_H)
Glib::Threads::Mutex::Lock lm (space_lock);
@@ -2569,6 +2657,15 @@ Session::add_command (Command* const cmd)
cmd->name ()));
_current_trans->add_command (cmd);
}
+
+PBD::StatefulDiffCommand*
+Session::add_stateful_diff_command (boost::shared_ptr<PBD::StatefulDestructible> sfd)
+{
+ PBD::StatefulDiffCommand* cmd = new PBD::StatefulDiffCommand (sfd);
+ add_command (cmd);
+ return cmd;
+}
+
void
Session::begin_reversible_command (const string& name)
{
@@ -2730,7 +2827,7 @@ Session::find_all_sources (string path, set<string>& result)
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
- XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = (*niter)->property (X_("type"))) == 0) {
continue;
@@ -2781,14 +2878,17 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th
return 0;
}
- this_snapshot_path = _path;
- this_snapshot_path += legalize_for_path (_current_snapshot_name);
+ this_snapshot_path = Glib::build_filename (_path, legalize_for_path (_current_snapshot_name));
this_snapshot_path += statefile_suffix;
for (vector<string>::iterator i = state_files.begin(); i != state_files.end(); ++i) {
+ cerr << "Looking at snapshot " << (*i) << " ( with this = [" << this_snapshot_path << "])\n";
+
if (exclude_this_snapshot && *i == this_snapshot_path) {
+ cerr << "\texcluded\n";
continue;
+
}
if (find_all_sources (*i, result) < 0) {
@@ -2919,6 +3019,12 @@ Session::cleanup_peakfiles ()
return 0;
}
+static void
+merge_all_sources (boost::shared_ptr<const Playlist> pl, std::set<boost::shared_ptr<Source> >* all_sources)
+{
+ pl->deep_sources (*all_sources);
+}
+
int
Session::cleanup_sources (CleanupReport& rep)
{
@@ -2929,14 +3035,14 @@ Session::cleanup_sources (CleanupReport& rep)
string midi_path;
vector<string> candidates;
vector<string> unused;
- set<string> all_sources;
- bool used;
+ set<string> sources_used_by_all_snapshots;
string spath;
int ret = -1;
string tmppath1;
string tmppath2;
Searchpath asp;
Searchpath msp;
+ set<boost::shared_ptr<Source> > sources_used_by_this_snapshot;
_state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
@@ -3007,12 +3113,21 @@ Session::cleanup_sources (CleanupReport& rep)
find_files_matching_filter (candidates, audio_path, accept_all_audio_files, (void *) 0, true, true);
find_files_matching_filter (candidates, midi_path, accept_all_midi_files, (void *) 0, true, true);
- /* find all sources, but don't use this snapshot because the
- state file on disk still references sources we may have already
- dropped.
+ /* add sources from all other snapshots as "used", but don't use this
+ snapshot because the state file on disk still references sources we
+ may have already dropped.
*/
- find_all_sources_across_snapshots (all_sources, true);
+ find_all_sources_across_snapshots (sources_used_by_all_snapshots, true);
+
+ /* Although the region factory has a list of all regions ever created
+ * for this session, we're only interested in regions actually in
+ * playlists right now. So merge all playlist regions lists together.
+ *
+ * This will include the playlists used within compound regions.
+ */
+
+ playlists->foreach (boost::bind (merge_all_sources, _1, &sources_used_by_this_snapshot));
/* add our current source list
*/
@@ -3022,59 +3137,76 @@ Session::cleanup_sources (CleanupReport& rep)
SourceMap::iterator tmp = i;
++tmp;
- if ((fs = boost::dynamic_pointer_cast<FileSource> (i->second)) != 0) {
+ if ((fs = boost::dynamic_pointer_cast<FileSource> (i->second)) == 0) {
+ /* not a file */
+ i = tmp;
+ continue;
+ }
- /* this is mostly for windows which doesn't allow file
- * renaming if the file is in use. But we don't special
- * case it because we need to know if this causes
- * problems, and the easiest way to notice that is to
- * keep it in place for all platforms.
- */
+ /* this is mostly for windows which doesn't allow file
+ * renaming if the file is in use. But we do not special
+ * case it because we need to know if this causes
+ * problems, and the easiest way to notice that is to
+ * keep it in place for all platforms.
+ */
- fs->close ();
+ fs->close ();
- if (!fs->is_stub()) {
+ if (!fs->is_stub()) {
- if (playlists->source_use_count (fs) != 0) {
- all_sources.insert (fs->path());
- } else {
+ /* Note that we're checking a list of all
+ * sources across all snapshots with the list
+ * of sources used by this snapshot.
+ */
- /* we might not remove this source from disk, because it may be used
- by other snapshots, but its not being used in this version
- so lets get rid of it now, along with any representative regions
- in the region list.
- */
+ if (sources_used_by_this_snapshot.find (i->second) != sources_used_by_this_snapshot.end()) {
+ /* this source is in use by this snapshot */
+ sources_used_by_all_snapshots.insert (fs->path());
+ cerr << "Source from source list found in used_by_this_snapshot (" << fs->path() << ")\n";
+ } else {
+ cerr << "Source from source list NOT found in used_by_this_snapshot (" << fs->path() << ")\n";
+ /* this source is NOT in use by this snapshot
+ */
- RegionFactory::remove_regions_using_source (i->second);
+ /* remove all related regions from RegionFactory master list
+ */
- // also remove source from all_sources
+ RegionFactory::remove_regions_using_source (i->second);
- for (set<string>::iterator j = all_sources.begin(); j != all_sources.end(); ++j) {
- spath = Glib::path_get_basename (*j);
- if (spath == i->second->name()) {
- all_sources.erase (j);
- break;
- }
- }
+ /* remove from our current source list
+ * also. We may not remove it from
+ * disk, because it may be used by
+ * other snapshots, but it isn't used inside this
+ * snapshot anymore, so we don't need a
+ * reference to it.
+ */
- sources.erase (i);
- }
+ sources.erase (i);
}
}
i = tmp;
}
+ /* now check each candidate source to see if it exists in the list of
+ sources_used_by_all_snapshots. If it doesn't, put it into "unused".
+ */
+
+ cerr << "Candidates: " << candidates.size() << endl;
+ cerr << "Used by others: " << sources_used_by_all_snapshots.size() << endl;
+
for (vector<string>::iterator x = candidates.begin(); x != candidates.end(); ++x) {
- used = false;
+ bool used = false;
spath = *x;
- for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
+ for (set<string>::iterator i = sources_used_by_all_snapshots.begin(); i != sources_used_by_all_snapshots.end(); ++i) {
tmppath1 = canonical_path (spath);
tmppath2 = canonical_path ((*i));
+ cerr << "\t => " << tmppath2 << endl;
+
if (tmppath1 == tmppath2) {
used = true;
break;
@@ -3086,6 +3218,14 @@ Session::cleanup_sources (CleanupReport& rep)
}
}
+ cerr << "Actually unused: " << unused.size() << endl;
+
+ if (unused.empty()) {
+ /* Nothing to do */
+ ret = 0;
+ goto out;
+ }
+
/* now try to move all unused files into the "dead" directory(ies) */
for (vector<string>::iterator x = unused.begin(); x != unused.end(); ++x) {
@@ -3148,19 +3288,13 @@ Session::cleanup_sources (CleanupReport& rep)
newpath = newpath_v;
}
- } else {
-
- /* it doesn't exist, or we can't read it or something */
-
}
g_stat ((*x).c_str(), &statbuf);
if (::rename ((*x).c_str(), newpath.c_str()) != 0) {
- error << string_compose (_("cannot rename unused file source from %1 to %2 (%3)"),
- (*x), newpath, strerror (errno))
- << endmsg;
- goto out;
+ error << string_compose (_("cannot rename unused file source from %1 to %2 (%3)"), (*x), newpath, strerror (errno)) << endmsg;
+ continue;
}
/* see if there an easy to find peakfile for this file, and remove it.
@@ -3320,68 +3454,85 @@ boost::shared_ptr<Controllable>
Session::controllable_by_descriptor (const ControllableDescriptor& desc)
{
boost::shared_ptr<Controllable> c;
+ boost::shared_ptr<Stripable> s;
boost::shared_ptr<Route> r;
switch (desc.top_level_type()) {
case ControllableDescriptor::NamedRoute:
{
std::string str = desc.top_level_name();
+
if (str == "Master" || str == "master") {
- r = _master_out;
- } else if (str == "control" || str == "listen") {
- r = _monitor_out;
+ s = _master_out;
+ } else if (str == "control" || str == "listen" || str == "monitor" || str == "Monitor") {
+ s = _monitor_out;
+ } else if (str == "auditioner") {
+ s = auditioner;
} else {
- r = route_by_name (desc.top_level_name());
+ s = route_by_name (desc.top_level_name());
}
+
break;
}
- case ControllableDescriptor::RemoteControlID:
- r = route_by_remote_id (desc.rid());
+ case ControllableDescriptor::PresentationOrderRoute:
+ s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::Route);
+ break;
+
+ case ControllableDescriptor::PresentationOrderTrack:
+ s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::Track);
+ break;
+
+ case ControllableDescriptor::PresentationOrderBus:
+ s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::Bus);
+ break;
+
+ case ControllableDescriptor::PresentationOrderVCA:
+ s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::VCA);
+ break;
+
+ case ControllableDescriptor::SelectionCount:
+ s = route_by_selected_count (desc.selection_id());
break;
}
- if (!r) {
+ if (!s) {
return c;
}
+ r = boost::dynamic_pointer_cast<Route> (s);
+
switch (desc.subtype()) {
case ControllableDescriptor::Gain:
- c = r->gain_control ();
+ c = s->gain_control ();
break;
case ControllableDescriptor::Trim:
- c = r->trim()->gain_control ();
+ c = s->trim_control ();
break;
case ControllableDescriptor::Solo:
- c = r->solo_control();
+ c = s->solo_control();
break;
case ControllableDescriptor::Mute:
- c = r->mute_control();
+ c = s->mute_control();
break;
case ControllableDescriptor::Recenable:
- {
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(r);
-
- if (t) {
- c = t->rec_enable_control ();
- }
+ c = s->rec_enable_control ();
break;
- }
case ControllableDescriptor::PanDirection:
- c = r->pan_azimuth_control();
+ c = s->pan_azimuth_control();
break;
case ControllableDescriptor::PanWidth:
- c = r->pan_width_control();
+ c = s->pan_width_control();
break;
case ControllableDescriptor::PanElevation:
- c = r->pan_elevation_control();
+ c = s->pan_elevation_control();
break;
case ControllableDescriptor::Balance:
@@ -3403,6 +3554,10 @@ Session::controllable_by_descriptor (const ControllableDescriptor& desc)
--parameter_index;
}
+ if (!r) {
+ return c;
+ }
+
boost::shared_ptr<Processor> p = r->nth_plugin (plugin);
if (p) {
@@ -3417,6 +3572,9 @@ Session::controllable_by_descriptor (const ControllableDescriptor& desc)
if (send > 0) {
--send;
}
+ if (!r) {
+ return c;
+ }
c = r->send_level_controllable (send);
break;
}
@@ -3789,7 +3947,7 @@ Session::config_changed (std::string p, bool ours)
} else if (p == "solo-control-is-listen-control") {
solo_control_mode_changed ();
} else if (p == "solo-mute-gain") {
- _solo_cut_control->Changed();
+ _solo_cut_control->Changed (true, Controllable::NoGroup);
} else if (p == "timecode-offset" || p == "timecode-offset-negative") {
last_timecode_valid = false;
} else if (p == "playback-buffer-seconds") {
@@ -4163,27 +4321,29 @@ Session::get_info_from_path (const string& xmlpath, float& sample_rate, SampleFo
/* sample rate */
- const XMLProperty* prop;
- if ((prop = tree.root()->property (X_("sample-rate"))) != 0) {
+ XMLProperty const * prop;
+ XMLNode const * root (tree.root());
+
+ if ((prop = root->property (X_("sample-rate"))) != 0) {
sample_rate = atoi (prop->value());
found_sr = true;
}
- const XMLNodeList& children (tree.root()->children());
+ const XMLNodeList& children (root->children());
for (XMLNodeList::const_iterator c = children.begin(); c != children.end(); ++c) {
const XMLNode* child = *c;
if (child->name() == "Config") {
const XMLNodeList& options (child->children());
for (XMLNodeList::const_iterator oc = options.begin(); oc != options.end(); ++oc) {
- const XMLNode* option = *oc;
- const XMLProperty* name = option->property("name");
+ XMLNode const * option = *oc;
+ XMLProperty const * name = option->property("name");
if (!name) {
continue;
}
if (name->value() == "native-file-data-format") {
- const XMLProperty* value = option->property ("value");
+ XMLProperty const * value = option->property ("value");
if (value) {
SampleFormat fmt = (SampleFormat) string_2_enum (option->property ("value")->value(), fmt);
data_format = fmt;
@@ -4215,7 +4375,7 @@ Session::get_snapshot_from_instant (const std::string& session_dir)
return "";
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNode *last_used_snapshot = tree.root()->child("LastUsedSnapshot");
if (last_used_snapshot && (prop = last_used_snapshot->property ("name")) != 0) {
return prop->value();
diff --git a/libs/ardour/session_state_utils.cc b/libs/ardour/session_state_utils.cc
index 5d5c9cc..28cfbb2 100644
--- a/libs/ardour/session_state_utils.cc
+++ b/libs/ardour/session_state_utils.cc
@@ -30,7 +30,7 @@
#include "ardour/session_state_utils.h"
#include "ardour/filename_extensions.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc
index ab5a470..8f08028 100644
--- a/libs/ardour/session_time.cc
+++ b/libs/ardour/session_time.cc
@@ -35,7 +35,7 @@
#include "ardour/session.h"
#include "ardour/tempo.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -46,7 +46,7 @@ using namespace PBD;
void
Session::bbt_time (framepos_t when, Timecode::BBT_Time& bbt)
{
- _tempo_map->bbt_time (when, bbt);
+ bbt = _tempo_map->bbt_at_frame (when);
}
/* Timecode TIME */
@@ -66,7 +66,7 @@ Session::timecode_drop_frames() const
void
Session::sync_time_vars ()
{
- _current_frame_rate = (framecnt_t) round (_base_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
+ _current_frame_rate = (framecnt_t) round (_nominal_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
_frames_per_timecode_frame = (double) _current_frame_rate / (double) timecode_frames_per_second();
if (timecode_drop_frames()) {
_frames_per_hour = (int32_t)(107892 * _frames_per_timecode_frame);
@@ -226,7 +226,7 @@ Session::convert_to_frames (AnyTime const & position)
switch (position.type) {
case AnyTime::BBT:
- return _tempo_map->frame_time (position.bbt);
+ return _tempo_map->frame_at_bbt (position.bbt);
break;
case AnyTime::Timecode:
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index f1486ad..8771af4 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -47,7 +47,7 @@
#include "ardour/slave.h"
#include "ardour/operations.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -373,6 +373,12 @@ Session::butler_transport_work ()
}
if (ptw & PostTransportAdjustPlaybackBuffering) {
+ /* non_realtime_locate() calls Automatable::transport_located()
+ * for every route. This eventually calls
+ * ARDOUR::AutomationList::state () which has a LocaleGuard,
+ * and would switch locales forth/back every time.
+ */
+ LocaleGuard lg;
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
if (tr) {
@@ -421,7 +427,7 @@ Session::butler_transport_work ()
/* don't seek if locate will take care of that in non_realtime_stop() */
if (!(ptw & PostTransportLocate)) {
-
+ LocaleGuard lg; // see note for non_realtime_locate() above
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
(*i)->non_realtime_locate (_transport_frame);
@@ -530,9 +536,12 @@ Session::non_realtime_locate ()
}
- boost::shared_ptr<RouteList> rl = routes.reader();
- for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
- (*i)->non_realtime_locate (_transport_frame);
+ {
+ LocaleGuard lg; // see note for non_realtime_locate() above
+ boost::shared_ptr<RouteList> rl = routes.reader();
+ for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+ (*i)->non_realtime_locate (_transport_frame);
+ }
}
_scene_changer->locate (_transport_frame);
@@ -789,15 +798,18 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
/* this for() block can be put inside the previous if() and has the effect of ... ??? what */
- DEBUG_TRACE (DEBUG::Transport, X_("Butler PTW: locate\n"));
- for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
- DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler PTW: locate on %1\n", (*i)->name()));
- (*i)->non_realtime_locate (_transport_frame);
+ {
+ LocaleGuard lg; // see note for non_realtime_locate() above
+ DEBUG_TRACE (DEBUG::Transport, X_("Butler PTW: locate\n"));
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler PTW: locate on %1\n", (*i)->name()));
+ (*i)->non_realtime_locate (_transport_frame);
- if (on_entry != g_atomic_int_get (&_butler->should_do_transport_work)) {
- finished = false;
- /* we will be back */
- return;
+ if (on_entry != g_atomic_int_get (&_butler->should_do_transport_work)) {
+ finished = false;
+ /* we will be back */
+ return;
+ }
}
}
@@ -1144,12 +1156,9 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
}
// Update Timecode time
- // [DR] FIXME: find out exactly where this should go below
_transport_frame = target_frame;
_last_roll_or_reversal_location = target_frame;
timecode_time(_transport_frame, transmitting_timecode_time);
- outbound_mtc_timecode_frame = _transport_frame;
- next_quarter_frame_to_send = 0;
/* do "stopped" stuff if:
*
@@ -1256,7 +1265,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
- if (tr && tr->record_enabled ()) {
+ if (tr && tr->rec_enable_control()->get_value()) {
// tell it we've looped, so it can deal with the record state
tr->transport_looped (_transport_frame);
}
diff --git a/libs/ardour/session_vst.cc b/libs/ardour/session_vst.cc
index c6978ed..7b52b3c 100644
--- a/libs/ardour/session_vst.cc
+++ b/libs/ardour/session_vst.cc
@@ -26,6 +26,7 @@
#include "ardour/debug.h"
#include "ardour/session.h"
#include "ardour/tempo.h"
+#include "ardour/plugin_insert.h"
#include "ardour/windows_vst_plugin.h"
#include "ardour/vestige/aeffectx.h"
#include "ardour/vst_types.h"
@@ -33,11 +34,40 @@
#include <fst.h>
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
-#define SHOW_CALLBACK(MSG) DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose (MSG " val = %1 idx = %2", index, value))
+#define SHOW_CALLBACK(MSG) DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose (MSG " val = %1 idx = %2\n", index, value))
+
+static double
+vst_ppq (const TempoMetric& tm, const Timecode::BBT_Time& bbt, double& ppqBar)
+{
+
+ /* PPQ = pulse per quarter
+ * VST's "pulse" is our "division".
+ *
+ * 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1
+ * 8 divisions per bar, 1 division = eighth, so 4 quarters per bar, ppq = 2
+ * 4 divisions per bar, 1 division = quarter, so 4 quarters per bar, ppq = 1
+ * 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5
+ * 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4
+ *
+ * general: divs_per_bar / (note_type / 4.0)
+ */
+ const double ppq_scaling = tm.meter().note_divisor() / 4.0;
+
+ /* Note that this assumes constant meter/tempo throughout the session. Stupid VST */
+ ppqBar = double(bbt.bars - 1) * tm.meter().divisions_per_bar();
+ double ppqBeat = double(bbt.beats - 1);
+ double ppqTick = double(bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
+
+ ppqBar *= ppq_scaling;
+ ppqBeat *= ppq_scaling;
+ ppqTick *= ppq_scaling;
+
+ return ppqBar + ppqBeat + ppqTick;
+}
int Session::vst_current_loading_id = 0;
const char* Session::vst_can_do_strings[] = {
@@ -62,20 +92,24 @@ intptr_t Session::vst_callback (
float opt
)
{
- static VstTimeInfo _timeInfo;
VSTPlugin* plug;
Session* session;
+ static VstTimeInfo _timeinfo; // only uses as fallback
+ VstTimeInfo* timeinfo;
+ int32_t newflags = 0;
if (effect && effect->user) {
plug = (VSTPlugin *) (effect->user);
session = &plug->session();
- DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4, plugin = \"%5\" ",
+ timeinfo = plug->timeinfo ();
+ DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4, plugin = \"%5\"\n",
std::hex, (void*) DEBUG_THREAD_SELF,
std::dec, opcode, plug->name()));
} else {
plug = 0;
session = 0;
- DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4",
+ timeinfo = &_timeinfo;
+ DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4\n",
std::hex, (void*) DEBUG_THREAD_SELF,
std::dec, opcode));
}
@@ -124,11 +158,25 @@ intptr_t Session::vst_callback (
}
switch (value) {
case 0:
+ if (plug->plugin_insert ()) {
+ bool valid;
+ const ChanMapping& map (plug->plugin_insert ()->input_map (plug->plugin_number ()));
+ map.get (DataType::AUDIO, index, &valid);
+ return valid ? 0 : 1;
+ }
if (index < plug->plugin()->numInputs) {
return 0;
}
break;
case 1:
+#if 0 // investigate, the outputs *are* connected to scratch buffers
+ if (plug->plugin_insert ()) {
+ bool valid;
+ const ChanMapping& map (plug->plugin_insert ()->output_map (plug->plugin_number ()));
+ map.get (DataType::AUDIO, index, &valid);
+ return valid ? 0 : 1;
+ }
+#endif
if (index < plug->plugin()->numOutputs) {
return 0;
}
@@ -148,67 +196,46 @@ intptr_t Session::vst_callback (
case audioMasterGetTime:
SHOW_CALLBACK ("audioMasterGetTime");
- // returns const VstTimeInfo* (or 0 if not supported)
- // <value> should contain a mask indicating which fields are required
- // (see valid masks above), as some items may require extensive
- // conversions
- _timeInfo.flags = 0;
+ newflags = kVstNanosValid | kVstAutomationWriting | kVstAutomationReading;
- if (session) {
- framepos_t now = session->transport_frame();
+ timeinfo->nanoSeconds = g_get_monotonic_time () * 1000;
+
+ if (plug && session) {
+ framepos_t now = plug->transport_frame();
- _timeInfo.samplePos = now;
- _timeInfo.sampleRate = session->frame_rate();
+ timeinfo->samplePos = now;
+ timeinfo->sampleRate = session->frame_rate();
const TempoMetric& tm (session->tempo_map().metric_at (now));
if (value & (kVstTempoValid)) {
const Tempo& t (tm.tempo());
- _timeInfo.tempo = t.beats_per_minute ();
- _timeInfo.flags |= (kVstTempoValid);
+ timeinfo->tempo = t.beats_per_minute ();
+ newflags |= (kVstTempoValid);
}
if (value & (kVstTimeSigValid)) {
const Meter& m (tm.meter());
- _timeInfo.timeSigNumerator = m.divisions_per_bar ();
- _timeInfo.timeSigDenominator = m.note_divisor ();
- _timeInfo.flags |= (kVstTimeSigValid);
+ timeinfo->timeSigNumerator = m.divisions_per_bar ();
+ timeinfo->timeSigDenominator = m.note_divisor ();
+ newflags |= (kVstTimeSigValid);
}
if ((value & (kVstPpqPosValid)) || (value & (kVstBarsValid))) {
Timecode::BBT_Time bbt;
try {
- session->tempo_map().bbt_time_rt (now, bbt);
-
- /* PPQ = pulse per quarter
- * VST's "pulse" is our "division".
- *
- * 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1
- * 8 divisions per bar, 1 division = eighth, so 4 quarters per bar, ppq = 2
- * 4 divisions per bar, 1 division = quarter, so 4 quarters per bar, ppq = 1
- * 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5
- * 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4
- *
- * general: divs_per_bar / (note_type / 4.0)
- */
- double ppq_scaling = tm.meter().note_divisor() / 4.0;
-
- /* Note that this assumes constant meter/tempo throughout the session. Stupid VST */
- double ppqBar = double(bbt.bars - 1) * tm.meter().divisions_per_bar();
- double ppqBeat = double(bbt.beats - 1);
- double ppqTick = double(bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
-
- ppqBar *= ppq_scaling;
- ppqBeat *= ppq_scaling;
- ppqTick *= ppq_scaling;
+ bbt = session->tempo_map().bbt_at_frame_rt (now);
+
+ double ppqBar;
+ double ppqPos = vst_ppq (tm, bbt, ppqBar);
if (value & (kVstPpqPosValid)) {
- _timeInfo.ppqPos = ppqBar + ppqBeat + ppqTick;
- _timeInfo.flags |= (kVstPpqPosValid);
+ timeinfo->ppqPos = ppqPos;
+ newflags |= kVstPpqPosValid;
}
if (value & (kVstBarsValid)) {
- _timeInfo.barStartPos = ppqBar;
- _timeInfo.flags |= (kVstBarsValid);
+ timeinfo->barStartPos = ppqBar;
+ newflags |= kVstBarsValid;
}
} catch (...) {
@@ -221,54 +248,73 @@ intptr_t Session::vst_callback (
session->timecode_time (now, t);
- _timeInfo.smpteOffset = (t.hours * t.rate * 60.0 * 60.0) +
+ timeinfo->smpteOffset = (t.hours * t.rate * 60.0 * 60.0) +
(t.minutes * t.rate * 60.0) +
(t.seconds * t.rate) +
(t.frames) +
(t.subframes);
- _timeInfo.smpteOffset *= 80.0; /* VST spec is 1/80th frames */
+ timeinfo->smpteOffset *= 80.0; /* VST spec is 1/80th frames */
if (session->timecode_drop_frames()) {
if (session->timecode_frames_per_second() == 30.0) {
- _timeInfo.smpteFrameRate = 5;
+ timeinfo->smpteFrameRate = 5;
} else {
- _timeInfo.smpteFrameRate = 4; /* 29.97 assumed, thanks VST */
+ timeinfo->smpteFrameRate = 4; /* 29.97 assumed, thanks VST */
}
} else {
if (session->timecode_frames_per_second() == 24.0) {
- _timeInfo.smpteFrameRate = 0;
+ timeinfo->smpteFrameRate = 0;
} else if (session->timecode_frames_per_second() == 24.975) {
- _timeInfo.smpteFrameRate = 2;
+ timeinfo->smpteFrameRate = 2;
} else if (session->timecode_frames_per_second() == 25.0) {
- _timeInfo.smpteFrameRate = 1;
+ timeinfo->smpteFrameRate = 1;
} else {
- _timeInfo.smpteFrameRate = 3; /* 30 fps */
+ timeinfo->smpteFrameRate = 3; /* 30 fps */
}
}
- _timeInfo.flags |= (kVstSmpteValid);
+ newflags |= (kVstSmpteValid);
}
- //ToDo:
- //if this is found to be burdensome to plugins,
- //we should cache the previous state at a global level,
- //and only set this flag when the transport changes state
- _timeInfo.flags |= (kVstTransportChanged);
+ if (session->actively_recording ()) {
+ newflags |= kVstTransportRecording;
+ }
- if (session->transport_speed() != 0.0f) {
- _timeInfo.flags |= (kVstTransportPlaying);
+ if (plug->transport_speed () != 0.0f) {
+ newflags |= kVstTransportPlaying;
}
- if (session->get_play_loop()) {
- _timeInfo.flags |= (kVstTransportCycleActive);
+ if (session->get_play_loop ()) {
+ newflags |= kVstTransportCycleActive;
+ Location * looploc = session->locations ()->auto_loop_location ();
+ if (looploc) try {
+ double ppqBar;
+ Timecode::BBT_Time bbt;
+
+ bbt = session->tempo_map ().bbt_at_frame_rt (looploc->start ());
+ timeinfo->cycleStartPos = vst_ppq (tm, bbt, ppqBar);
+
+ bbt = session->tempo_map ().bbt_at_frame_rt (looploc->end ());
+ timeinfo->cycleEndPos = vst_ppq (tm, bbt, ppqBar);
+
+ newflags |= kVstCyclePosValid;
+ } catch (...) { }
}
} else {
- _timeInfo.samplePos = 0;
- _timeInfo.sampleRate = AudioEngine::instance()->sample_rate();
+ timeinfo->samplePos = 0;
+ timeinfo->sampleRate = AudioEngine::instance()->sample_rate();
+ }
+
+ if ((timeinfo->flags & (kVstTransportPlaying | kVstTransportRecording | kVstTransportCycleActive))
+ !=
+ (newflags & (kVstTransportPlaying | kVstTransportRecording | kVstTransportCycleActive)))
+ {
+ newflags |= kVstTransportChanged;
}
- return (intptr_t) &_timeInfo;
+ timeinfo->flags = newflags;
+ return (intptr_t) timeinfo;
case audioMasterProcessEvents:
SHOW_CALLBACK ("audioMasterProcessEvents");
@@ -292,7 +338,7 @@ intptr_t Session::vst_callback (
SHOW_CALLBACK ("audioMasterTempoAt");
// returns tempo (in bpm * 10000) at sample frame location passed in <value>
if (session) {
- const Tempo& t (session->tempo_map().tempo_at (value));
+ const Tempo& t (session->tempo_map().tempo_at_frame (value));
return t.beats_per_minute() * 1000;
} else {
return 0;
@@ -503,4 +549,3 @@ intptr_t Session::vst_callback (
return 0;
}
-
diff --git a/libs/ardour/sidechain.cc b/libs/ardour/sidechain.cc
new file mode 100644
index 0000000..e759af3
--- /dev/null
+++ b/libs/ardour/sidechain.cc
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2006 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <algorithm>
+
+#include "pbd/xml++.h"
+
+#include "ardour/audioengine.h"
+#include "ardour/buffer.h"
+#include "ardour/buffer_set.h"
+#include "ardour/io.h"
+#include "ardour/session.h"
+#include "ardour/sidechain.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+
+SideChain::SideChain (Session& s, const std::string& name)
+ : IOProcessor (s, true, false, name)
+{
+}
+
+SideChain::~SideChain ()
+{
+ disconnect ();
+}
+
+XMLNode&
+SideChain::state (bool full)
+{
+ XMLNode& node = IOProcessor::state (full);
+ node.add_property ("type", "sidechain");
+ return node;
+}
+
+
+int
+SideChain::set_state (const XMLNode& node, int version)
+{
+ IOProcessor::set_state (node, version);
+ return 0;
+}
+
+void
+SideChain::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double /*speed*/, pframes_t nframes, bool)
+{
+ if (_input->n_ports () == ChanCount::ZERO) {
+ // inplace pass-through
+ return;
+ }
+
+ if (!_active && !_pending_active) {
+ // zero buffers
+ for (DataType::iterator t = DataType::begin (); t != DataType::end (); ++t) {
+ for (uint32_t out = _configured_input.get (*t); out < bufs.count ().get (*t); ++out) {
+ bufs.get (*t, out).silence (nframes);
+ }
+ }
+ return;
+ }
+
+ _input->collect_input (bufs, nframes, _configured_input);
+ bufs.set_count (_configured_output);
+
+ _active = _pending_active;
+}
+
+bool
+SideChain::can_support_io_configuration (const ChanCount& in, ChanCount& out)
+{
+ out = in + _input->n_ports ();
+ return true;
+}
+
+bool
+SideChain::configure_io (ChanCount in, ChanCount out)
+{
+ if (out != in + _input->n_ports ()) {
+ /* disabled for now - see PluginInsert::configure_io() */
+ // return false;
+ }
+ return Processor::configure_io (in, out);
+}
diff --git a/libs/ardour/slavable.cc b/libs/ardour/slavable.cc
new file mode 100644
index 0000000..10eb084
--- /dev/null
+++ b/libs/ardour/slavable.cc
@@ -0,0 +1,210 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <vector>
+
+#include <glibmm/threads.h>
+
+#include "pbd/convert.h"
+#include "pbd/error.h"
+#include "pbd/xml++.h"
+
+#include "ardour/slavable.h"
+#include "ardour/slavable_automation_control.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "pbd/i18n.h"
+
+using namespace PBD;
+using namespace ARDOUR;
+
+std::string Slavable::xml_node_name = X_("Slavable");
+PBD::Signal1<void,VCAManager*> Slavable::Assign; /* signal sent once
+ * assignment is possible */
+
+Slavable::Slavable ()
+{
+ Assign.connect_same_thread (assign_connection, boost::bind (&Slavable::do_assign, this, _1));
+}
+
+XMLNode&
+Slavable::get_state () const
+{
+ XMLNode* node = new XMLNode (xml_node_name);
+ XMLNode* child;
+
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ for (std::set<uint32_t>::const_iterator i = _masters.begin(); i != _masters.end(); ++i) {
+ child = new XMLNode (X_("Master"));
+ child->add_property (X_("number"), to_string (*i, std::dec));
+ node->add_child_nocopy (*child);
+ }
+
+ return *node;
+}
+
+int
+Slavable::set_state (XMLNode const& node, int version)
+{
+ if (node.name() != xml_node_name) {
+ return -1;
+ }
+
+ XMLNodeList const& children (node.children());
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ if ((*i)->name() == X_("Master")) {
+ XMLProperty const* prop = (*i)->property (X_("number"));
+ if (prop) {
+ uint32_t n = atoi (prop->value());
+ _masters.insert (n);
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+int
+Slavable::do_assign (VCAManager* manager)
+{
+ std::vector<boost::shared_ptr<VCA> > vcas;
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+
+ for (std::set<uint32_t>::const_iterator i = _masters.begin(); i != _masters.end(); ++i) {
+ boost::shared_ptr<VCA> v = manager->vca_by_number (*i);
+ if (v) {
+ vcas.push_back (v);
+ } else {
+ warning << string_compose (_("Master #%1 not found, assignment lost"), *i) << endmsg;
+ }
+ }
+ }
+
+ /* now that we've released the lock, we can do the assignments */
+
+ for (std::vector<boost::shared_ptr<VCA> >::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ assign (*v);
+ }
+
+ assign_connection.disconnect ();
+
+ return 0;
+}
+
+void
+Slavable::assign (boost::shared_ptr<VCA> v)
+{
+ assert (v);
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+ if (assign_controls (v) == 0) {
+ _masters.insert (v->number());
+ }
+
+ /* Do NOT use ::unassign() because it will store a
+ * boost::shared_ptr<VCA> in the functor, leaving a dangling ref to the
+ * VCA.
+ */
+
+
+ v->Drop.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v)));
+ v->DropReferences.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v)));
+}
+
+void
+Slavable::weak_unassign (boost::weak_ptr<VCA> v)
+{
+ boost::shared_ptr<VCA> sv (v.lock());
+ if (sv) {
+ unassign (sv);
+ }
+}
+
+void
+Slavable::unassign (boost::shared_ptr<VCA> v)
+{
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+ (void) unassign_controls (v);
+ if (v) {
+ _masters.erase (v->number());
+ } else {
+ _masters.clear ();
+ }
+}
+
+/* Gain, solo & mute are currently the only controls that are
+ * automatically slaved to the master's own equivalent controls.
+ */
+
+static AutomationType auto_slave_types[] = {
+ GainAutomation,
+ SoloAutomation,
+ MuteAutomation,
+ NullAutomation
+};
+
+int
+Slavable::assign_controls (boost::shared_ptr<VCA> vca)
+{
+ boost::shared_ptr<SlavableAutomationControl> slave;
+ boost::shared_ptr<AutomationControl> master;
+
+ for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) {
+
+ slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n]));
+ master = vca->automation_control (auto_slave_types[n]);
+
+ if (slave && master) {
+ slave->add_master (master);
+ }
+ }
+
+ return 0;
+}
+
+int
+Slavable::unassign_controls (boost::shared_ptr<VCA> vca)
+{
+ boost::shared_ptr<SlavableAutomationControl> slave;
+ boost::shared_ptr<AutomationControl> master;
+
+ for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) {
+
+ slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n]));
+
+ if (!vca) {
+ /* unassign from all */
+ if (slave) {
+ slave->clear_masters ();
+ }
+ } else {
+ master = vca->automation_control (auto_slave_types[n]);
+ if (slave && master) {
+ slave->remove_master (master);
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/libs/ardour/slavable_automation_control.cc b/libs/ardour/slavable_automation_control.cc
new file mode 100644
index 0000000..d400234
--- /dev/null
+++ b/libs/ardour/slavable_automation_control.cc
@@ -0,0 +1,334 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_slavable_automation_control_h__
+#define __libardour_slavable_automation_control_h__
+
+#include "pbd/enumwriter.h"
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/session.h"
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+SlavableAutomationControl::SlavableAutomationControl(ARDOUR::Session& s,
+ const Evoral::Parameter& parameter,
+ const ParameterDescriptor& desc,
+ boost::shared_ptr<ARDOUR::AutomationList> l,
+ const std::string& name)
+ : AutomationControl (s, parameter, desc, l, name)
+{
+}
+
+double
+SlavableAutomationControl::get_masters_value_locked () const
+{
+ double v = _desc.normal;
+
+ if (_desc.toggled) {
+ for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+ if (mr->second.master()->get_value()) {
+ return _desc.upper;
+ }
+ }
+ return _desc.lower;
+ }
+
+ for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+ /* get current master value, scale by our current ratio with that master */
+ v *= mr->second.master()->get_value () * mr->second.ratio();
+ }
+
+ return min ((double) _desc.upper, v);
+}
+
+double
+SlavableAutomationControl::get_value_locked() const
+{
+ /* read or write masters lock must be held */
+
+ if (_masters.empty()) {
+ return Control::get_double (false, _session.transport_frame());
+ }
+
+ if (_desc.toggled) {
+ /* for boolean/toggle controls, if this slave OR any master is
+ * enabled, this slave is enabled. So check our own value
+ * first, because if we are enabled, we can return immediately.
+ */
+ if (Control::get_double (false, _session.transport_frame())) {
+ return _desc.upper;
+ }
+ }
+
+ return get_masters_value_locked ();
+}
+
+/** Get the current effective `user' value based on automation state */
+double
+SlavableAutomationControl::get_value() const
+{
+ bool from_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback();
+
+ if (!from_list) {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ return get_value_locked ();
+ } else {
+ return Control::get_double (from_list, _session.transport_frame());
+ }
+}
+
+void
+SlavableAutomationControl::actually_set_value (double val, Controllable::GroupControlDisposition group_override)
+{
+ val = std::max (std::min (val, (double)_desc.upper), (double)_desc.lower);
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+
+ if (!_masters.empty()) {
+ recompute_masters_ratios (val);
+ }
+ }
+
+ /* this sets the Evoral::Control::_user_value for us, which will
+ be retrieved by AutomationControl::get_value ()
+ */
+ AutomationControl::actually_set_value (val, group_override);
+
+ _session.set_dirty ();
+}
+
+void
+SlavableAutomationControl::add_master (boost::shared_ptr<AutomationControl> m)
+{
+ std::pair<Masters::iterator,bool> res;
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+ const double current_value = get_value_locked ();
+
+ /* ratio will be recomputed below */
+
+ pair<PBD::ID,MasterRecord> newpair (m->id(), MasterRecord (m, 1.0));
+ res = _masters.insert (newpair);
+
+ if (res.second) {
+
+ recompute_masters_ratios (current_value);
+
+ /* note that we bind @param m as a weak_ptr<AutomationControl>, thus
+ avoiding holding a reference to the control in the binding
+ itself.
+ */
+
+ m->DropReferences.connect_same_thread (masters_connections, boost::bind (&SlavableAutomationControl::master_going_away, this, boost::weak_ptr<AutomationControl>(m)));
+
+ /* Store the connection inside the MasterRecord, so
+ that when we destroy it, the connection is destroyed
+ and we no longer hear about changes to the
+ AutomationControl.
+
+ Note that this also makes it safe to store a
+ boost::shared_ptr<AutomationControl> in the functor,
+ since we know we will destroy the functor when the
+ connection is destroyed, which happens when we
+ disconnect from the master (for any reason).
+
+ Note that we fix the "from_self" argument that will
+ be given to our own Changed signal to "false",
+ because the change came from the master.
+ */
+
+ m->Changed.connect_same_thread (res.first->second.connection, boost::bind (&SlavableAutomationControl::master_changed, this, _1, _2, m));
+ cerr << this << enum_2_string ((AutomationType) _parameter.type()) << " now listening to Changed from " << m << endl;
+ }
+ }
+
+ if (res.second) {
+ /* this will notify everyone that we're now slaved to the master */
+ MasterStatusChange (); /* EMIT SIGNAL */
+ }
+
+ post_add_master (m);
+
+ update_boolean_masters_records (m);
+}
+
+int32_t
+SlavableAutomationControl::get_boolean_masters () const
+{
+ int32_t n = 0;
+
+ if (_desc.toggled) {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+ if (mr->second.yn()) {
+ ++n;
+ }
+ }
+ }
+
+ return n;
+}
+
+void
+SlavableAutomationControl::update_boolean_masters_records (boost::shared_ptr<AutomationControl> m)
+{
+ if (_desc.toggled) {
+ /* We may modify a MasterRecord, but we not modify the master
+ * map, so we use a ReaderLock
+ */
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ Masters::iterator mi = _masters.find (m->id());
+ if (mi != _masters.end()) {
+ /* update MasterRecord to show whether the master is
+ on/off. We need to store this because the master
+ may change (in the sense of emitting Changed())
+ several times without actually changing the result
+ of ::get_value(). This is a feature of
+ AutomationControls (or even just Controllables,
+ really) which have more than a simple scalar
+ value. For example, the master may be a mute control
+ which can be muted_by_self() and/or
+ muted_by_masters(). When either of those two
+ conditions changes, Changed() will be emitted, even
+ though ::get_value() will return the same value each
+ time (1.0 if either are true, 0.0 if neither is).
+
+ This provides a way for derived types to check
+ the last known state of a Master when the Master
+ changes. We update it after calling
+ ::master_changed() (though derived types must do
+ this themselves).
+ */
+ mi->second.set_yn (m->get_value());
+ }
+ }
+}
+
+void
+SlavableAutomationControl::master_changed (bool /*from_self*/, GroupControlDisposition gcd, boost::shared_ptr<AutomationControl> m)
+{
+ update_boolean_masters_records (m);
+ Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
+}
+
+void
+SlavableAutomationControl::master_going_away (boost::weak_ptr<AutomationControl> wm)
+{
+ boost::shared_ptr<AutomationControl> m = wm.lock();
+ if (m) {
+ remove_master (m);
+ }
+}
+
+void
+SlavableAutomationControl::remove_master (boost::shared_ptr<AutomationControl> m)
+{
+ double current_value;
+ double new_value;
+ bool masters_left;
+ Masters::size_type erased = 0;
+
+ pre_remove_master (m);
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+ current_value = get_value_locked ();
+ erased = _masters.erase (m->id());
+ if (erased && !_session.deletion_in_progress()) {
+ recompute_masters_ratios (current_value);
+ }
+ masters_left = _masters.size ();
+ new_value = get_value_locked ();
+ }
+
+ if (_session.deletion_in_progress()) {
+ /* no reason to care about new values or sending signals */
+ return;
+ }
+
+ if (erased) {
+ MasterStatusChange (); /* EMIT SIGNAL */
+ }
+
+ if (new_value != current_value) {
+ if (masters_left == 0) {
+ /* no masters left, make sure we keep the same value
+ that we had before.
+ */
+ actually_set_value (current_value, Controllable::UseGroup);
+ }
+ }
+
+ /* no need to update boolean masters records, since the MR will have
+ * been removed already.
+ */
+}
+
+void
+SlavableAutomationControl::clear_masters ()
+{
+ double current_value;
+ double new_value;
+ bool had_masters = false;
+
+ /* null ptr means "all masters */
+ pre_remove_master (boost::shared_ptr<AutomationControl>());
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+ current_value = get_value_locked ();
+ if (!_masters.empty()) {
+ had_masters = true;
+ }
+ _masters.clear ();
+ new_value = get_value_locked ();
+ }
+
+ if (had_masters) {
+ MasterStatusChange (); /* EMIT SIGNAL */
+ }
+
+ if (new_value != current_value) {
+ actually_set_value (current_value, Controllable::UseGroup);
+ }
+
+ /* no need to update boolean masters records, since all MRs will have
+ * been removed already.
+ */
+}
+
+bool
+SlavableAutomationControl::slaved_to (boost::shared_ptr<AutomationControl> m) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ return _masters.find (m->id()) != _masters.end();
+}
+
+bool
+SlavableAutomationControl::slaved () const
+{
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ return !_masters.empty();
+}
+
+#endif /* __libardour_slavable_automation_control_h__ */
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index 9d332b5..2aae26d 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -46,7 +46,7 @@
#include "ardour/session.h"
#include "ardour/smf_source.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace Glib;
diff --git a/libs/ardour/sndfile_helpers.cc b/libs/ardour/sndfile_helpers.cc
index 1b69ca2..3bd5473 100644
--- a/libs/ardour/sndfile_helpers.cc
+++ b/libs/ardour/sndfile_helpers.cc
@@ -25,7 +25,7 @@
#include <sndfile.h>
#include "ardour/sndfile_helpers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using std::map;
using namespace std;
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index 73361c3..4522e8a 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -41,7 +41,7 @@
#include "ardour/utils.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/solo_control.cc b/libs/ardour/solo_control.cc
new file mode 100644
index 0000000..c31644b
--- /dev/null
+++ b/libs/ardour/solo_control.cc
@@ -0,0 +1,343 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/debug.h"
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/solo_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+using namespace PBD;
+
+SoloControl::SoloControl (Session& session, std::string const & name, Soloable& s, Muteable& m)
+ : SlavableAutomationControl (session, SoloAutomation, ParameterDescriptor (SoloAutomation),
+ boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(SoloAutomation))),
+ name)
+ , _soloable (s)
+ , _muteable (m)
+ , _self_solo (false)
+ , _soloed_by_others_upstream (0)
+ , _soloed_by_others_downstream (0)
+ , _transition_into_solo (false)
+{
+ _list->set_interpolation (Evoral::ControlList::Discrete);
+ /* solo changes must be synchronized by the process cycle */
+ set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+SoloControl::set_self_solo (bool yn)
+{
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
+ _self_solo = yn;
+ set_mute_master_solo ();
+
+ _transition_into_solo = 0;
+
+ if (yn) {
+ if (get_masters_value() == 0) {
+ _transition_into_solo = 1;
+ }
+ } else {
+ if (get_masters_value() == 0) {
+ _transition_into_solo = -1;
+ }
+ }
+}
+
+void
+SoloControl::set_mute_master_solo ()
+{
+ _muteable.mute_master()->set_soloed_by_self (self_soloed() || get_masters_value());
+
+ if (Config->get_solo_control_is_listen_control()) {
+ _muteable.mute_master()->set_soloed_by_others (false);
+ } else {
+ _muteable.mute_master()->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream() || get_masters_value());
+ }
+}
+
+void
+SoloControl::mod_solo_by_others_downstream (int32_t delta)
+{
+ if (_soloable.is_safe() || !_soloable.can_solo()) {
+ return;
+ }
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
+ name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
+
+ if (delta < 0) {
+ if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
+ _soloed_by_others_downstream += delta;
+ } else {
+ _soloed_by_others_downstream = 0;
+ }
+ } else {
+ _soloed_by_others_downstream += delta;
+ }
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
+
+ set_mute_master_solo ();
+ _transition_into_solo = 0;
+ Changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
+}
+
+void
+SoloControl::mod_solo_by_others_upstream (int32_t delta)
+{
+ if (_soloable.is_safe() || !_soloable.can_solo()) {
+ return;
+ }
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
+ name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
+
+ uint32_t old_sbu = _soloed_by_others_upstream;
+
+ if (delta < 0) {
+ if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
+ _soloed_by_others_upstream += delta;
+ } else {
+ _soloed_by_others_upstream = 0;
+ }
+ } else {
+ _soloed_by_others_upstream += delta;
+ }
+
+ DEBUG_TRACE (DEBUG::Solo, string_compose (
+ "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
+ name(), delta, _soloed_by_others_upstream, old_sbu,
+ _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
+
+
+ /* push the inverse solo change to everything that feeds us.
+
+ This is important for solo-within-group. When we solo 1 track out of N that
+ feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
+ on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
+ tracks that feed it. This will silence them if they were audible because
+ of a bus solo, but the newly soloed track will still be audible (because
+ it is self-soloed).
+
+ but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
+ not in reverse.
+ */
+
+ if ((_self_solo || _soloed_by_others_downstream) &&
+ ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
+ (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
+
+ if (delta > 0 || !Config->get_exclusive_solo()) {
+ _soloable.push_solo_upstream (delta);
+ }
+ }
+
+ set_mute_master_solo ();
+ _transition_into_solo = 0;
+ Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
+}
+
+void
+SoloControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
+{
+ if (_soloable.is_safe() || !_soloable.can_solo()) {
+ return;
+ }
+
+ set_self_solo (val == 1.0);
+
+ /* this sets the Evoral::Control::_user_value for us, which will
+ be retrieved by AutomationControl::get_value (), and emits Changed
+ */
+
+ SlavableAutomationControl::actually_set_value (val, group_override);
+}
+
+double
+SoloControl::get_value () const
+{
+ if (slaved()) {
+ return self_soloed() || get_masters_value ();
+ }
+
+ if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+ // Playing back automation, get the value from the list
+ return AutomationControl::get_value();
+ }
+
+ return soloed();
+}
+
+void
+SoloControl::clear_all_solo_state ()
+{
+ // ideally this function will never do anything, it only exists to forestall Murphy
+
+#ifndef NDEBUG
+ // these are really debug messages, but of possible interest.
+ if (self_soloed()) {
+ PBD::info << string_compose (_("Cleared Explicit solo: %1\n"), name());
+ }
+ if (_soloed_by_others_upstream || _soloed_by_others_downstream) {
+ PBD::info << string_compose (_("Cleared Implicit solo: %1 up:%2 down:%3\n"),
+ name(), _soloed_by_others_upstream, _soloed_by_others_downstream);
+ }
+#endif
+
+ _soloed_by_others_upstream = 0;
+ _soloed_by_others_downstream = 0;
+
+ set_self_solo (false);
+ _transition_into_solo = 0; /* Session does not need to propagate */
+ Changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
+}
+
+int
+SoloControl::set_state (XMLNode const & node, int)
+{
+ XMLProperty const * prop;
+
+ if ((prop = node.property ("self-solo")) != 0) {
+ set_self_solo (string_is_affirmative (prop->value()));
+ }
+
+ if ((prop = node.property ("soloed-by-upstream")) != 0) {
+ _soloed_by_others_upstream = 0; // needed for mod_.... () to work
+ mod_solo_by_others_upstream (atoi (prop->value()));
+ }
+
+ if ((prop = node.property ("soloed-by-downstream")) != 0) {
+ _soloed_by_others_downstream = 0; // needed for mod_.... () to work
+ mod_solo_by_others_downstream (atoi (prop->value()));
+ }
+
+ return 0;
+}
+
+XMLNode&
+SoloControl::get_state ()
+{
+ XMLNode& node (SlavableAutomationControl::get_state());
+
+ node.add_property (X_("self-solo"), _self_solo ? X_("yes") : X_("no"));
+ char buf[32];
+ snprintf (buf, sizeof(buf), "%d", _soloed_by_others_upstream);
+ node.add_property (X_("soloed-by-upstream"), buf);
+ snprintf (buf, sizeof(buf), "%d", _soloed_by_others_downstream);
+ node.add_property (X_("soloed-by-downstream"), buf);
+
+ return node;
+}
+
+void
+SoloControl::master_changed (bool /*from self*/, GroupControlDisposition, boost::shared_ptr<AutomationControl> m)
+{
+ bool send_signal = false;
+
+ _transition_into_solo = 0;
+
+ /* Notice that we call get_boolean_masters() BEFORE we call
+ * update_boolean_masters_records(), in order to know what
+ * our master state was BEFORE it gets changed.
+ */
+
+
+ if (m->get_value()) {
+ /* this master is now enabled */
+ if (!self_soloed() && get_boolean_masters() == 0) {
+ /* not self-soloed, wasn't soloed by masters before */
+ send_signal = true;
+ _transition_into_solo = 1;
+ }
+ } else {
+ if (!self_soloed() && get_boolean_masters() == 1) {
+ /* not self-soloed, soloed by just 1 master before */
+ _transition_into_solo = -1;
+ send_signal = true;
+ }
+ }
+
+ update_boolean_masters_records (m);
+
+ if (send_signal) {
+ set_mute_master_solo ();
+ Changed (false, Controllable::UseGroup);
+ }
+
+}
+
+void
+SoloControl::post_add_master (boost::shared_ptr<AutomationControl> m)
+{
+ if (m->get_value()) {
+
+ /* boolean masters records are not updated until AFTER
+ * ::post_add_master() is called, so we can use them to check
+ * on whether any master was already enabled before the new
+ * one was added.
+ */
+
+ if (!self_soloed() && !get_boolean_masters()) {
+ _transition_into_solo = 1;
+ Changed (false, Controllable::NoGroup);
+ }
+ }
+}
+
+void
+SoloControl::pre_remove_master (boost::shared_ptr<AutomationControl> m)
+{
+ if (!m) {
+ /* null control ptr means we're removing all masters. Nothing
+ * to do. Changed will be emitted in
+ * SlavableAutomationControl::clear_masters()
+ */
+ return;
+ }
+
+ if (m->get_value()) {
+ if (!self_soloed() && (get_boolean_masters() == 1)) {
+ /* we're not self-soloed, this master is, and we're
+ removing
+ it. SlavableAutomationControl::remove_master() will
+ ensure that we reset our own value after actually
+ removing the master, so that our state does not
+ change (this is a precondition of the
+ SlavableAutomationControl API). This will emit
+ Changed(), and we need to make sure that any
+ listener knows that there has been no transition.
+ */
+ _transition_into_solo = 0;
+ } else {
+ _transition_into_solo = 1;
+ }
+ } else {
+ _transition_into_solo = 0;
+ }
+}
+
+bool
+SoloControl::can_solo () const
+{
+ return _soloable.can_solo ();
+}
diff --git a/libs/ardour/solo_isolate_control.cc b/libs/ardour/solo_isolate_control.cc
new file mode 100644
index 0000000..3be57dc
--- /dev/null
+++ b/libs/ardour/solo_isolate_control.cc
@@ -0,0 +1,174 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/debug.h"
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/solo_isolate_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+using namespace PBD;
+
+SoloIsolateControl::SoloIsolateControl (Session& session, std::string const & name, Soloable& s, Muteable& m)
+ : SlavableAutomationControl (session, SoloIsolateAutomation, ParameterDescriptor (SoloIsolateAutomation),
+ boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(SoloIsolateAutomation))),
+ name)
+ , _soloable (s)
+ , _muteable (m)
+ , _solo_isolated (false)
+ , _solo_isolated_by_upstream (0)
+{
+ _list->set_interpolation (Evoral::ControlList::Discrete);
+ /* isolate changes must be synchronized by the process cycle */
+ set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+SoloIsolateControl::master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>)
+{
+ if (!_soloable.can_solo()) {
+ return;
+ }
+
+ bool master_soloed;
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ master_soloed = (bool) get_masters_value_locked ();
+ }
+
+ /* Master is considered equivalent to an upstream solo control, not
+ * direct control over self-soloed.
+ */
+
+ mod_solo_isolated_by_upstream (master_soloed ? 1 : -1);
+
+ /* no need to call AutomationControl::master_changed() since it just
+ emits Changed() which we already did in mod_solo_by_others_upstream()
+ */
+}
+
+void
+SoloIsolateControl::mod_solo_isolated_by_upstream (int32_t delta)
+{
+ bool old = solo_isolated ();
+ DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod_solo_isolated_by_upstream cur: %2 d: %3\n",
+ name(), _solo_isolated_by_upstream, delta));
+
+ if (delta < 0) {
+ if (_solo_isolated_by_upstream >= (uint32_t) abs(delta)) {
+ _solo_isolated_by_upstream += delta;
+ } else {
+ _solo_isolated_by_upstream = 0;
+ }
+ } else {
+ _solo_isolated_by_upstream += delta;
+ }
+
+ if (solo_isolated() != old) {
+ Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
+ }
+}
+
+void
+SoloIsolateControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+ if (!_soloable.can_solo()) {
+ return;
+ }
+
+ set_solo_isolated (val, gcd);
+
+ /* this sets the Evoral::Control::_user_value for us, which will
+ be retrieved by AutomationControl::get_value (), and emits Changed
+ */
+
+ AutomationControl::actually_set_value (val, gcd);
+ _session.set_dirty ();
+}
+
+void
+SoloIsolateControl::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override)
+{
+ if (!_soloable.can_solo()) {
+ return;
+ }
+
+ bool changed = false;
+
+ if (yn) {
+ if (_solo_isolated == false) {
+ changed = true;
+ }
+ _solo_isolated = true;
+ } else {
+ if (_solo_isolated == true) {
+ _solo_isolated = false;
+ changed = true;
+ }
+ }
+
+ if (!changed) {
+ return;
+ }
+
+ _soloable.push_solo_isolate_upstream (yn ? 1 : -1);
+
+ /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
+
+ Changed (true, group_override); /* EMIT SIGNAL */
+}
+
+
+double
+SoloIsolateControl::get_value () const
+{
+ if (slaved()) {
+ return solo_isolated() || get_masters_value ();
+ }
+
+ if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+ // Playing back automation, get the value from the list
+ return AutomationControl::get_value();
+ }
+
+ return solo_isolated ();
+}
+
+int
+SoloIsolateControl::set_state (XMLNode const & node, int)
+{
+ XMLProperty const * prop;
+
+ if ((prop = node.property ("solo-isolated")) != 0) {
+ _solo_isolated = string_is_affirmative (prop->value());
+ }
+
+ return 0;
+}
+
+XMLNode&
+SoloIsolateControl::get_state ()
+{
+ XMLNode& node (SlavableAutomationControl::get_state());
+ node.add_property (X_("solo-isolated"), _solo_isolated ? X_("yes") : X_("no"));
+ return node;
+}
diff --git a/libs/ardour/solo_safe_control.cc b/libs/ardour/solo_safe_control.cc
new file mode 100644
index 0000000..92c6c9e
--- /dev/null
+++ b/libs/ardour/solo_safe_control.cc
@@ -0,0 +1,86 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/debug.h"
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/solo_isolate_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+using namespace PBD;
+
+SoloSafeControl::SoloSafeControl (Session& session, std::string const & name)
+ : SlavableAutomationControl (session, SoloSafeAutomation, ParameterDescriptor (SoloSafeAutomation),
+ boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(SoloSafeAutomation))),
+ name)
+ , _solo_safe (false)
+{
+ _list->set_interpolation(Evoral::ControlList::Discrete);
+}
+
+void
+SoloSafeControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+ _solo_safe = (val ? true : false);
+
+ /* this sets the Evoral::Control::_user_value for us, which will
+ be retrieved by AutomationControl::get_value (), and emits Changed
+ */
+
+ AutomationControl::actually_set_value (val, gcd);
+ _session.set_dirty ();
+}
+
+double
+SoloSafeControl::get_value () const
+{
+ if (slaved()) {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ return get_masters_value_locked () ? 1.0 : 0.0;
+ }
+
+ if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+ // Playing back automation, get the value from the list
+ return AutomationControl::get_value();
+ }
+
+ return _solo_safe ? 1.0 : 0.0;
+}
+
+int
+SoloSafeControl::set_state (XMLNode const & node, int)
+{
+ XMLProperty const * prop;
+
+ if ((prop = node.property ("solo-safe")) != 0) {
+ _solo_safe = string_is_affirmative (prop->value());
+ }
+
+ return 0;
+}
+
+XMLNode&
+SoloSafeControl::get_state ()
+{
+ XMLNode& node (SlavableAutomationControl::get_state());
+ node.add_property (X_("solo-safe"), _solo_safe ? X_("yes") : X_("no"));
+ return node;
+}
diff --git a/libs/ardour/soundcloud_upload.cc b/libs/ardour/soundcloud_upload.cc
index 68ab2fa..caef957 100644
--- a/libs/ardour/soundcloud_upload.cc
+++ b/libs/ardour/soundcloud_upload.cc
@@ -31,7 +31,7 @@
#include <iostream>
#include "pbd/gstdio_compat.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc
index aaa50ff..f9772ec 100644
--- a/libs/ardour/source.cc
+++ b/libs/ardour/source.cc
@@ -40,7 +40,7 @@
#include "ardour/source.h"
#include "ardour/transient_detector.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -113,7 +113,7 @@ Source::get_state ()
int
Source::set_state (const XMLNode& node, int version)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("name")) != 0) {
_name = prop->value();
diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc
index 7697535..834014b 100644
--- a/libs/ardour/source_factory.cc
+++ b/libs/ardour/source_factory.cc
@@ -22,7 +22,6 @@
#include "libardour-config.h"
#endif
-#include "pbd/boost_debug.h"
#include "pbd/error.h"
#include "pbd/convert.h"
#include "pbd/pthread_utils.h"
@@ -30,6 +29,7 @@
#include "ardour/audioplaylist.h"
#include "ardour/audio_playlist_source.h"
+#include "ardour/boost_debug.h"
#include "ardour/midi_playlist.h"
#include "ardour/midi_playlist_source.h"
#include "ardour/source.h"
@@ -44,7 +44,7 @@
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
@@ -150,7 +150,7 @@ boost::shared_ptr<Source>
SourceFactory::create (Session& s, const XMLNode& node, bool defer_peaks)
{
DataType type = DataType::AUDIO;
- const XMLProperty* prop = node.property("type");
+ XMLProperty const * prop = node.property("type");
if (prop) {
type = DataType (prop->value());
diff --git a/libs/ardour/speakers.cc b/libs/ardour/speakers.cc
index 7c7b02f..624ad5c 100644
--- a/libs/ardour/speakers.cc
+++ b/libs/ardour/speakers.cc
@@ -23,7 +23,7 @@
#include "ardour/speaker.h"
#include "ardour/speakers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -245,7 +245,7 @@ Speakers::get_state ()
{
XMLNode* node = new XMLNode (X_("Speakers"));
char buf[32];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
for (vector<Speaker>::const_iterator i = _speakers.begin(); i != _speakers.end(); ++i) {
XMLNode* speaker = new XMLNode (X_("Speaker"));
@@ -267,9 +267,9 @@ int
Speakers::set_state (const XMLNode& node, int /*version*/)
{
XMLNodeConstIterator i;
- const XMLProperty* prop;
+ XMLProperty const * prop;
double a, e, d;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
int n = 0;
_speakers.clear ();
diff --git a/libs/ardour/srcfilesource.cc b/libs/ardour/srcfilesource.cc
index b9421d2..98389bf 100644
--- a/libs/ardour/srcfilesource.cc
+++ b/libs/ardour/srcfilesource.cc
@@ -25,7 +25,7 @@
#include "ardour/debug.h"
#include "ardour/srcfilesource.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
diff --git a/libs/ardour/st_pitch.cc b/libs/ardour/st_pitch.cc
index 8e65ea2..752fdd8 100644
--- a/libs/ardour/st_pitch.cc
+++ b/libs/ardour/st_pitch.cc
@@ -28,7 +28,7 @@
#include "ardour/session.h"
#include "ardour/audioregion.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/st_stretch.cc b/libs/ardour/st_stretch.cc
index b031ee2..d12ceed 100644
--- a/libs/ardour/st_stretch.cc
+++ b/libs/ardour/st_stretch.cc
@@ -28,7 +28,7 @@
#include "ardour/session.h"
#include "ardour/audioregion.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/stripable.cc b/libs/ardour/stripable.cc
new file mode 100644
index 0000000..84d2baf
--- /dev/null
+++ b/libs/ardour/stripable.cc
@@ -0,0 +1,108 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <boost/algorithm/string.hpp>
+
+#include "pbd/compose.h"
+#include "pbd/convert.h"
+
+#include "ardour/debug.h"
+#include "ardour/rc_configuration.h"
+#include "ardour/stripable.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using std::string;
+
+Stripable::Stripable (Session& s, string const & name, PresentationInfo const & pi)
+ : SessionObject (s, name)
+ , _presentation_info (pi)
+{
+}
+
+void
+Stripable::set_presentation_order (PresentationInfo::order_t order, bool notify_class_listeners)
+{
+ _presentation_info.set_order (order);
+
+ if (notify_class_listeners) {
+ PresentationInfo::Change ();
+ }
+}
+
+int
+Stripable::set_state (XMLNode const& node, int version)
+{
+ const XMLProperty *prop;
+ XMLNodeList const & nlist (node.children());
+ XMLNodeConstIterator niter;
+ XMLNode *child;
+
+ if (version > 3001) {
+
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter){
+ child = *niter;
+
+ if (child->name() == PresentationInfo::state_node_name) {
+ _presentation_info.set_state (*child, version);
+ }
+ }
+
+ } else {
+
+ /* Older versions of Ardour stored "_flags" as a property of the Route
+ * node, only for 3 special Routes (MasterOut, MonitorOut, Auditioner.
+ *
+ * Their presentation order was stored in a node called "RemoteControl"
+ *
+ * This information is now part of the PresentationInfo of every Stripable.
+ */
+
+ if ((prop = node.property (X_("flags"))) != 0) {
+
+ /* 4.x and earlier - didn't have Stripable but the
+ * relevant enums have the same names (MasterOut,
+ * MonitorOut, Auditioner), so we can use string_2_enum
+ */
+
+ PresentationInfo::Flag flags;
+
+ if (version < 3000) {
+ string f (prop->value());
+ boost::replace_all (f, "ControlOut", "MonitorOut");
+ flags = PresentationInfo::Flag (string_2_enum (f, flags));
+ } else {
+ flags = PresentationInfo::Flag (string_2_enum (prop->value(), flags));
+ }
+
+ _presentation_info.set_flags (flags);
+
+ }
+
+ if (!_presentation_info.special()) {
+ if ((prop = node.property (X_("order-key"))) != 0) {
+ _presentation_info.set_order (atol (prop->value()));
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/libs/ardour/tape_file_matcher.cc b/libs/ardour/tape_file_matcher.cc
index 0f8594d..0be884c 100644
--- a/libs/ardour/tape_file_matcher.cc
+++ b/libs/ardour/tape_file_matcher.cc
@@ -20,7 +20,7 @@
#include "ardour/tape_file_matcher.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc
index b3207e1..11da2fc 100644
--- a/libs/ardour/tempo.cc
+++ b/libs/ardour/tempo.cc
@@ -24,13 +24,16 @@
#include <unistd.h>
#include <glibmm/threads.h>
+
+#include "pbd/enumwriter.h"
#include "pbd/xml++.h"
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
+
#include "ardour/debug.h"
#include "ardour/lmath.h"
#include "ardour/tempo.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
@@ -70,26 +73,47 @@ Meter::frames_per_bar (const Tempo& tempo, framecnt_t sr) const
const string TempoSection::xml_state_node_name = "Tempo";
TempoSection::TempoSection (const XMLNode& node)
- : MetricSection (BBT_Time()), Tempo (TempoMap::default_tempo())
+ : MetricSection (0.0, 0, MusicTime, true)
+ , Tempo (TempoMap::default_tempo())
+ , _c_func (0.0)
+ , _active (true)
+ , _locked_to_meter (false)
{
- const XMLProperty *prop;
- BBT_Time start;
- LocaleGuard lg (X_("C"));
+ XMLProperty const * prop;
+ LocaleGuard lg;
+ BBT_Time bbt;
+ double pulse;
+ uint32_t frame;
- if ((prop = node.property ("start")) == 0) {
- error << _("TempoSection XML node has no \"start\" property") << endmsg;
- throw failed_constructor();
+ _legacy_bbt = BBT_Time (0, 0, 0);
+
+ if ((prop = node.property ("start")) != 0) {
+ if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
+ &bbt.bars,
+ &bbt.beats,
+ &bbt.ticks) == 3) {
+ /* legacy session - start used to be in bbt*/
+ _legacy_bbt = bbt;
+ pulse = -1.0;
+ info << _("Legacy session detected. TempoSection XML node will be altered.") << endmsg;
+ }
}
- if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
- &start.bars,
- &start.beats,
- &start.ticks) < 3) {
- error << _("TempoSection XML node has an illegal \"start\" value") << endmsg;
- throw failed_constructor();
+ if ((prop = node.property ("pulse")) != 0) {
+ if (sscanf (prop->value().c_str(), "%lf", &pulse) != 1) {
+ error << _("TempoSection XML node has an illegal \"pulse\" value") << endmsg;
+ }
}
- set_start (start);
+ set_pulse (pulse);
+
+ if ((prop = node.property ("frame")) != 0) {
+ if (sscanf (prop->value().c_str(), "%" PRIu32, &frame) != 1) {
+ error << _("TempoSection XML node has an illegal \"frame\" value") << endmsg;
+ } else {
+ set_frame (frame);
+ }
+ }
if ((prop = node.property ("beats-per-minute")) == 0) {
error << _("TempoSection XML node has no \"beats-per-minute\" property") << endmsg;
@@ -118,13 +142,33 @@ TempoSection::TempoSection (const XMLNode& node)
set_movable (string_is_affirmative (prop->value()));
- if ((prop = node.property ("bar-offset")) == 0) {
- _bar_offset = -1.0;
+ if ((prop = node.property ("active")) == 0) {
+ warning << _("TempoSection XML node has no \"active\" property") << endmsg;
+ set_active(true);
} else {
- if (sscanf (prop->value().c_str(), "%lf", &_bar_offset) != 1 || _bar_offset < 0.0) {
- error << _("TempoSection XML node has an illegal \"bar-offset\" value") << endmsg;
- throw failed_constructor();
+ set_active (string_is_affirmative (prop->value()));
+ }
+
+ if ((prop = node.property ("tempo-type")) == 0) {
+ _type = Constant;
+ } else {
+ _type = Type (string_2_enum (prop->value(), _type));
+ }
+
+ if ((prop = node.property ("lock-style")) == 0) {
+ if (movable()) {
+ set_position_lock_style (MusicTime);
+ } else {
+ set_position_lock_style (AudioTime);
}
+ } else {
+ set_position_lock_style (PositionLockStyle (string_2_enum (prop->value(), position_lock_style())));
+ }
+
+ if ((prop = node.property ("locked-to-meter")) == 0) {
+ set_locked_to_meter (false);
+ } else {
+ set_locked_to_meter (string_is_affirmative (prop->value()));
}
}
@@ -133,58 +177,275 @@ TempoSection::get_state() const
{
XMLNode *root = new XMLNode (xml_state_node_name);
char buf[256];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
- snprintf (buf, sizeof (buf), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
- start().bars,
- start().beats,
- start().ticks);
- root->add_property ("start", buf);
- snprintf (buf, sizeof (buf), "%f", _beats_per_minute);
+ snprintf (buf, sizeof (buf), "%lf", pulse());
+ root->add_property ("pulse", buf);
+ snprintf (buf, sizeof (buf), "%li", frame());
+ root->add_property ("frame", buf);
+ snprintf (buf, sizeof (buf), "%lf", _beats_per_minute);
root->add_property ("beats-per-minute", buf);
- snprintf (buf, sizeof (buf), "%f", _note_type);
+ snprintf (buf, sizeof (buf), "%lf", _note_type);
root->add_property ("note-type", buf);
- // snprintf (buf, sizeof (buf), "%f", _bar_offset);
- // root->add_property ("bar-offset", buf);
snprintf (buf, sizeof (buf), "%s", movable()?"yes":"no");
root->add_property ("movable", buf);
+ snprintf (buf, sizeof (buf), "%s", active()?"yes":"no");
+ root->add_property ("active", buf);
+ root->add_property ("tempo-type", enum_2_string (_type));
+ root->add_property ("lock-style", enum_2_string (position_lock_style()));
+ root->add_property ("locked-to-meter", locked_to_meter()?"yes":"no");
return *root;
}
void
+TempoSection::set_type (Type type)
+{
+ _type = type;
+}
-TempoSection::update_bar_offset_from_bbt (const Meter& m)
+/** returns the tempo in whole pulses per minute at the zero-based (relative to session) frame.
+*/
+double
+TempoSection::tempo_at_frame (const framepos_t& f, const framecnt_t& frame_rate) const
{
- _bar_offset = ((start().beats - 1) * BBT_Time::ticks_per_beat + start().ticks) /
- (m.divisions_per_bar() * BBT_Time::ticks_per_beat);
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Tempo set bar offset to %1 from %2 w/%3\n", _bar_offset, start(), m.divisions_per_bar()));
+ if (_type == Constant || _c_func == 0.0) {
+ return pulses_per_minute();
+ }
+
+ return pulse_tempo_at_time (frame_to_minute (f - frame(), frame_rate));
}
-void
-TempoSection::update_bbt_time_from_bar_offset (const Meter& meter)
+/** returns the zero-based frame (relative to session)
+ where the tempo in whole pulses per minute occurs in this section.
+ pulse p is only used for constant tempos.
+ note that the tempo map may have multiple such values.
+*/
+framepos_t
+TempoSection::frame_at_tempo (const double& ppm, const double& p, const framecnt_t& frame_rate) const
{
- BBT_Time new_start;
+ if (_type == Constant || _c_func == 0.0) {
+ return ((p - pulse()) * frames_per_pulse (frame_rate)) + frame();
+ }
- if (_bar_offset < 0.0) {
- /* not set yet */
- return;
+ return minute_to_frame (time_at_pulse_tempo (ppm), frame_rate) + frame();
+}
+/** returns the tempo in pulses per minute at the zero-based (relative to session) beat.
+*/
+double
+TempoSection::tempo_at_pulse (const double& p) const
+{
+
+ if (_type == Constant || _c_func == 0.0) {
+ return pulses_per_minute();
+ }
+ double const ppm = pulse_tempo_at_pulse (p - pulse());
+ return ppm;
+}
+
+/** returns the zero-based beat (relative to session)
+ where the tempo in whole pulses per minute occurs given frame f. frame f is only used for constant tempos.
+ note that the session tempo map may have multiple beats at a given tempo.
+*/
+double
+TempoSection::pulse_at_tempo (const double& ppm, const framepos_t& f, const framecnt_t& frame_rate) const
+{
+ if (_type == Constant || _c_func == 0.0) {
+ double const pulses = ((f - frame()) / frames_per_pulse (frame_rate)) + pulse();
+ return pulses;
+ }
+ return pulse_at_pulse_tempo (ppm) + pulse();
+}
+
+/** returns the zero-based pulse (relative to session origin)
+ where the zero-based frame (relative to session)
+ lies.
+*/
+double
+TempoSection::pulse_at_frame (const framepos_t& f, const framecnt_t& frame_rate) const
+{
+ if (_type == Constant || _c_func == 0.0) {
+ return ((f - frame()) / frames_per_pulse (frame_rate)) + pulse();
+ }
+
+ return pulse_at_time (frame_to_minute (f - frame(), frame_rate)) + pulse();
+}
+
+/** returns the zero-based frame (relative to session start frame)
+ where the zero-based pulse (relative to session start)
+ falls.
+*/
+
+framepos_t
+TempoSection::frame_at_pulse (const double& p, const framecnt_t& frame_rate) const
+{
+ if (_type == Constant || _c_func == 0.0) {
+ return (framepos_t) floor ((p - pulse()) * frames_per_pulse (frame_rate)) + frame();
}
- new_start.bars = start().bars;
+ return minute_to_frame (time_at_pulse (p - pulse()), frame_rate) + frame();
+}
+
+/*
+Ramp Overview
+
+ | *
+Tempo | *
+Tt----|-----------------*|
+Ta----|--------------|* |
+ | * | |
+ | * | |
+ | * | |
+T0----|* | |
+ * | | |
+ _______________|___|____
+ time a t (next tempo)
+ [ c ] defines c
+
+Duration in beats at time a is the integral of some Tempo function.
+In our case, the Tempo function (Tempo at time t) is
+T(t) = T0(e^(ct))
- double ticks = BBT_Time::ticks_per_beat * meter.divisions_per_bar() * _bar_offset;
- new_start.beats = (uint32_t) floor (ticks/BBT_Time::ticks_per_beat);
- new_start.ticks = 0; /* (uint32_t) fmod (ticks, BBT_Time::ticks_per_beat); */
+with function constant
+c = log(Ta/T0)/a
+so
+a = log(Ta/T0)/c
- /* remember the 1-based counting properties of beats */
- new_start.beats += 1;
+The integral over t of our Tempo function (the beat function, which is the duration in beats at some time t) is:
+b(t) = T0(e^(ct) - 1) / c
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("from bar offset %1 and dpb %2, ticks = %3->%4 beats = %5\n",
- _bar_offset, meter.divisions_per_bar(), ticks, new_start.ticks, new_start.beats));
+To find the time t at beat duration b, we use the inverse function of the beat function (the time function) which can be shown to be:
+t(b) = log((c.b / T0) + 1) / c
- set_start (new_start);
+The time t at which Tempo T occurs is a as above:
+t(T) = log(T / T0) / c
+
+The beat at which a Tempo T occurs is:
+b(T) = (T - T0) / c
+
+The Tempo at which beat b occurs is:
+T(b) = b.c + T0
+
+We define c for this tempo ramp by placing a new tempo section at some time t after this one.
+Our problem is that we usually don't know t.
+We almost always know the duration in beats between this and the new section, so we need to find c in terms of the beat function.
+Where a = t (i.e. when a is equal to the time of the next tempo section), the beat function reveals:
+t = b log (Ta / T0) / (T0 (e^(log (Ta / T0)) - 1))
+
+By substituting our expanded t as a in the c function above, our problem is reduced to:
+c = T0 (e^(log (Ta / T0)) - 1) / b
+
+Of course the word 'beat' has been left loosely defined above.
+In music, a beat is defined by the musical pulse (which comes from the tempo)
+and the meter in use at a particular time (how many pulse divisions there are in one bar).
+It would be more accurate to substitute the work 'pulse' for 'beat' above.
+
+Anyway ...
+
+We can now store c for future time calculations.
+If the following tempo section (the one that defines c in conjunction with this one)
+is changed or moved, c is no longer valid.
+
+The public methods are session-relative.
+
+Most of this stuff is taken from this paper:
+
+WHEREâS THE BEAT?
+TOOLS FOR DYNAMIC TEMPO CALCULATIONS
+Jan C. Schacher
+Martin Neukom
+Zurich University of Arts
+Institute for Computer Music and Sound Technology
+
+https://www.zhdk.ch/fileadmin/data_subsites/data_icst/Downloads/Timegrid/ICST_Tempopolyphony_ICMC07.pdf
+
+*/
+
+/*
+ compute this ramp's function constant using the end tempo (in whole pulses per minute)
+ and duration (pulses into global start) of some later tempo section.
+*/
+double
+TempoSection::compute_c_func_pulse (const double& end_bpm, const double& end_pulse, const framecnt_t& frame_rate)
+{
+ double const log_tempo_ratio = log (end_bpm / pulses_per_minute());
+ return pulses_per_minute() * (expm1 (log_tempo_ratio)) / (end_pulse - pulse());
+}
+
+/* compute the function constant from some later tempo section, given tempo (whole pulses/min.) and distance (in frames) from session origin */
+double
+TempoSection::compute_c_func_frame (const double& end_bpm, const framepos_t& end_frame, const framecnt_t& frame_rate) const
+{
+ return c_func (end_bpm, frame_to_minute (end_frame - frame(), frame_rate));
+}
+
+framepos_t
+TempoSection::minute_to_frame (const double& time, const framecnt_t& frame_rate) const
+{
+ return (framepos_t) floor ((time * 60.0 * frame_rate) + 0.5);
+}
+
+double
+TempoSection::frame_to_minute (const framepos_t& frame, const framecnt_t& frame_rate) const
+{
+ return (frame / (double) frame_rate) / 60.0;
+}
+
+/* position function */
+double
+TempoSection::a_func (double end_ppm, double c_func) const
+{
+ return log (end_ppm / pulses_per_minute()) / c_func;
+}
+
+/*function constant*/
+double
+TempoSection::c_func (double end_ppm, double end_time) const
+{
+ return log (end_ppm / pulses_per_minute()) / end_time;
+}
+
+/* tempo in ppm at time in minutes */
+double
+TempoSection::pulse_tempo_at_time (const double& time) const
+{
+ return exp (_c_func * time) * pulses_per_minute();
+}
+
+/* time in minutes at tempo in ppm */
+double
+TempoSection::time_at_pulse_tempo (const double& pulse_tempo) const
+{
+ return log (pulse_tempo / pulses_per_minute()) / _c_func;
+}
+
+/* tick at tempo in ppm */
+double
+TempoSection::pulse_at_pulse_tempo (const double& pulse_tempo) const
+{
+ return (pulse_tempo - pulses_per_minute()) / _c_func;
+}
+
+/* tempo in ppm at tick */
+double
+TempoSection::pulse_tempo_at_pulse (const double& pulse) const
+{
+ return (pulse * _c_func) + pulses_per_minute();
+}
+
+/* pulse at time in minutes */
+double
+TempoSection::pulse_at_time (const double& time) const
+{
+ return expm1 (_c_func * time) * (pulses_per_minute() / _c_func);
+}
+
+/* time in minutes at pulse */
+double
+TempoSection::time_at_pulse (const double& pulse) const
+{
+ return log1p ((_c_func * pulse) / pulses_per_minute()) / _c_func;
}
/***********************************************************************/
@@ -192,26 +453,64 @@ TempoSection::update_bbt_time_from_bar_offset (const Meter& meter)
const string MeterSection::xml_state_node_name = "Meter";
MeterSection::MeterSection (const XMLNode& node)
- : MetricSection (BBT_Time()), Meter (TempoMap::default_meter())
+ : MetricSection (0.0, 0, MusicTime, false), Meter (TempoMap::default_meter())
{
- const XMLProperty *prop;
- BBT_Time start;
- LocaleGuard lg (X_("C"));
+ XMLProperty const * prop;
+ LocaleGuard lg;
+ BBT_Time bbt;
+ double pulse = 0.0;
+ double beat = 0.0;
+ framepos_t frame = 0;
+ pair<double, BBT_Time> start;
+
+ if ((prop = node.property ("start")) != 0) {
+ if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
+ &bbt.bars,
+ &bbt.beats,
+ &bbt.ticks) < 3) {
+ error << _("MeterSection XML node has an illegal \"start\" value") << endmsg;
+ } else {
+ /* legacy session - start used to be in bbt*/
+ info << _("Legacy session detected - MeterSection XML node will be altered.") << endmsg;
+ pulse = -1.0;
+ }
+ }
- if ((prop = node.property ("start")) == 0) {
- error << _("MeterSection XML node has no \"start\" property") << endmsg;
- throw failed_constructor();
+ if ((prop = node.property ("pulse")) != 0) {
+ if (sscanf (prop->value().c_str(), "%lf", &pulse) != 1) {
+ error << _("MeterSection XML node has an illegal \"pulse\" value") << endmsg;
+ }
+ }
+ set_pulse (pulse);
+
+ if ((prop = node.property ("beat")) != 0) {
+ if (sscanf (prop->value().c_str(), "%lf", &beat) != 1) {
+ error << _("MeterSection XML node has an illegal \"beat\" value") << endmsg;
+ }
}
- if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
- &start.bars,
- &start.beats,
- &start.ticks) < 3) {
- error << _("MeterSection XML node has an illegal \"start\" value") << endmsg;
+ start.first = beat;
+
+ if ((prop = node.property ("bbt")) == 0) {
+ warning << _("MeterSection XML node has no \"bbt\" property") << endmsg;
+ } else if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
+ &bbt.bars,
+ &bbt.beats,
+ &bbt.ticks) < 3) {
+ error << _("MeterSection XML node has an illegal \"bbt\" value") << endmsg;
throw failed_constructor();
}
- set_start (start);
+ start.second = bbt;
+ set_beat (start);
+
+ if ((prop = node.property ("frame")) != 0) {
+ if (sscanf (prop->value().c_str(), "%li", &frame) != 1) {
+ error << _("MeterSection XML node has an illegal \"frame\" value") << endmsg;
+ } else {
+ set_frame (frame);
+ }
+ }
/* beats-per-bar is old; divisions-per-bar is new */
@@ -221,9 +520,8 @@ MeterSection::MeterSection (const XMLNode& node)
throw failed_constructor();
}
}
-
if (sscanf (prop->value().c_str(), "%lf", &_divisions_per_bar) != 1 || _divisions_per_bar < 0.0) {
- error << _("MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar\" value") << endmsg;
+ error << _("MeterSection XML node has an illegal \"divisions-per-bar\" value") << endmsg;
throw failed_constructor();
}
@@ -231,7 +529,6 @@ MeterSection::MeterSection (const XMLNode& node)
error << _("MeterSection XML node has no \"note-type\" property") << endmsg;
throw failed_constructor();
}
-
if (sscanf (prop->value().c_str(), "%lf", &_note_type) != 1 || _note_type < 0.0) {
error << _("MeterSection XML node has an illegal \"note-type\" value") << endmsg;
throw failed_constructor();
@@ -243,6 +540,17 @@ MeterSection::MeterSection (const XMLNode& node)
}
set_movable (string_is_affirmative (prop->value()));
+
+ if ((prop = node.property ("lock-style")) == 0) {
+ warning << _("MeterSection XML node has no \"lock-style\" property") << endmsg;
+ if (movable()) {
+ set_position_lock_style (MusicTime);
+ } else {
+ set_position_lock_style (AudioTime);
+ }
+ } else {
+ set_position_lock_style (PositionLockStyle (string_2_enum (prop->value(), position_lock_style())));
+ }
}
XMLNode&
@@ -250,16 +558,23 @@ MeterSection::get_state() const
{
XMLNode *root = new XMLNode (xml_state_node_name);
char buf[256];
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
+ snprintf (buf, sizeof (buf), "%lf", pulse());
+ root->add_property ("pulse", buf);
snprintf (buf, sizeof (buf), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
- start().bars,
- start().beats,
- start().ticks);
- root->add_property ("start", buf);
- snprintf (buf, sizeof (buf), "%f", _note_type);
+ bbt().bars,
+ bbt().beats,
+ bbt().ticks);
+ root->add_property ("bbt", buf);
+ snprintf (buf, sizeof (buf), "%lf", beat());
+ root->add_property ("beat", buf);
+ snprintf (buf, sizeof (buf), "%lf", _note_type);
root->add_property ("note-type", buf);
- snprintf (buf, sizeof (buf), "%f", _divisions_per_bar);
+ snprintf (buf, sizeof (buf), "%li", frame());
+ root->add_property ("frame", buf);
+ root->add_property ("lock-style", enum_2_string (position_lock_style()));
+ snprintf (buf, sizeof (buf), "%lf", _divisions_per_bar);
root->add_property ("divisions-per-bar", buf);
snprintf (buf, sizeof (buf), "%s", movable()?"yes":"no");
root->add_property ("movable", buf);
@@ -268,36 +583,132 @@ MeterSection::get_state() const
}
/***********************************************************************/
+/*
+ Tempo Map Overview
+
+ The Shaggs - Things I Wonder
+ https://www.youtube.com/watch?v=9wQK6zMJOoQ
+
+ Tempo is the rate of the musical pulse.
+ Meters divide the pulses into measures and beats.
+
+ TempoSections - provide pulses in the form of beats_per_minute() and note_type() where note_type is the division of a whole pulse,
+ and beats_per_minute is the number of note_types in one minute (unlike what its name suggests).
+ Note that Tempo::beats_per_minute() has nothing to do with musical beats. It has been left that way because
+ a shorter one hasn't been found yet (pulse_divisions_per_minute()?).
+
+ MeterSecions - divide pulses into measures (via divisions_per_bar) and beats (via note_divisor).
+
+ Both tempos and meters have a pulse position and a frame position.
+ Meters also have a beat position, which is always 0.0 for the first meter.
+ TempoSections and MeterSections may be locked to either audio or music (position lock style).
+ The lock style determines the 'true' position of the section wich is used to calculate the other postion parameters of the section.
+
+ The first tempo and first meter are special. they must move together, and must be locked to audio.
+ Audio locked tempos which lie before the first meter are made inactive.
+ They will be re-activated if the first meter is again placed before them.
+
+ With tepo sections potentially being ramped, meters provide a way of mapping beats to whole pulses without
+ referring to the tempo function(s) involved as the distance in whole pulses between a meter and a subsequent beat is
+ sb->beat() - meter->beat() / meter->note_divisor().
+ Because every meter falls on a known pulse, (derived from its bar), the rest is easy as the duration in pulses between
+ two meters is of course
+ (meater_b->bar - meter_a->bar) * meter_a->divisions_per_bar / meter_a->note_divisor.
+
+ Below, beat calculations are based on meter sections and all pulse and tempo calculations are based on tempo sections.
+ Beat to frame conversion of course requires the use of meter and tempo.
+
+ Remembering that ramped tempo sections interact, it is important to avoid referring to any other tempos when moving tempo sections,
+ Here, beats (meters) are used to determine the new pulse (see predict_tempo_position())
+
+ Recomputing the map is the process where the 'missing' position
+ (tempo pulse or meter pulse & beat in the case of AudioTime, frame for MusicTime) is calculated.
+ We construct the tempo map by first using the frame or pulse position (depending on position lock style) of each tempo.
+ We then use this tempo map (really just the tempos) to find the pulse or frame position of each meter (again depending on lock style).
+
+ Having done this, we can now find any musical duration by selecting the tempo and meter covering the position (or tempo) in question
+ and querying its appropriate meter/tempo.
+
+ It is important to keep the _metrics in an order that makes sense.
+ Because ramped MusicTime and AudioTime tempos can interact with each other,
+ reordering is frequent. Care must be taken to keep _metrics in a solved state.
+ Solved means ordered by frame or pulse with frame-accurate precision (see check_solved()).
+
+ Music and Audio
+ Music and audio-locked objects may seem interchangeable on the surface, but when translating
+ between audio samples and beats, keep in mind that a sample is only a quantised approximation
+ of the actual time (in minutes) of a beat.
+ Thus if a gui user points to the frame occupying the start of a music-locked object on 1|3|0, it does not
+ mean that this frame is the actual location in time of 1|3|0.
+
+ You cannot use a frame measurement to determine beat distance except under special circumstances
+ (e.g. where the user has requested that a beat lie on a SMPTE frame or if the tempo is known to be constant over the duration).
+
+ This means is that a user operating on a musical grid must supply the desired beat position and/or current beat quantization in order for the
+ sample space the user is operating at to be translated correctly to the object.
+
+ The current approach is to interpret the supplied frame using the grid division the user has currently selected.
+ If the user has no musical grid set, they are actually operating in sample space (even SMPTE frames are rounded to audio frame), so
+ the supplied audio frame is interpreted as the desired musical location (beat_at_frame()).
+
+ tldr: Beat, being a function of time, has nothing to do with sample rate, but time quantization can get in the way of precision.
+
+ When frame_at_beat() is called, the position calculation is performed in pulses and minutes.
+ The result is rounded to audio frames.
+ When beat_at_frame() is called, the frame is converted to minutes, with no rounding performed on the result.
+
+ So :
+ frame_at_beat (beat_at_frame (frame)) == frame
+ but :
+ beat_at_frame (frame_at_beat (beat)) != beat due to the time quantization of frame_at_beat().
+
+ Doing the second one will result in a beat distance error of up to 0.5 audio samples.
+ So instead work in pulses and/or beats and only use beat position to caclulate frame position (e.g. after tempo change).
+ For audio-locked objects, use frame position to calculate beat position.
+
+ The above pointless example would then do:
+ beat_at_pulse (pulse_at_beat (beat)) to avoid rounding.
+
+*/
struct MetricSectionSorter {
bool operator() (const MetricSection* a, const MetricSection* b) {
- return a->start() < b->start();
+ return a->pulse() < b->pulse();
+ }
+};
+
+struct MetricSectionFrameSorter {
+ bool operator() (const MetricSection* a, const MetricSection* b) {
+ return a->frame() < b->frame();
}
};
TempoMap::TempoMap (framecnt_t fr)
{
_frame_rate = fr;
- BBT_Time start;
+ BBT_Time start (1, 1, 0);
- start.bars = 1;
- start.beats = 1;
- start.ticks = 0;
-
- TempoSection *t = new TempoSection (start, _default_tempo.beats_per_minute(), _default_tempo.note_type());
- MeterSection *m = new MeterSection (start, _default_meter.divisions_per_bar(), _default_meter.note_divisor());
+ TempoSection *t = new TempoSection (0.0, 0, _default_tempo.beats_per_minute(), _default_tempo.note_type(), TempoSection::Ramp, AudioTime);
+ MeterSection *m = new MeterSection (0.0, 0, 0.0, start, _default_meter.divisions_per_bar(), _default_meter.note_divisor(), AudioTime);
t->set_movable (false);
m->set_movable (false);
/* note: frame time is correct (zero) for both of these */
- metrics.push_back (t);
- metrics.push_back (m);
+ _metrics.push_back (t);
+ _metrics.push_back (m);
+
}
TempoMap::~TempoMap ()
{
+ Metrics::const_iterator d = _metrics.begin();
+ while (d != _metrics.end()) {
+ delete (*d);
+ ++d;
+ }
+ _metrics.clear();
}
void
@@ -309,7 +720,7 @@ TempoMap::remove_tempo (const TempoSection& tempo, bool complete_operation)
Glib::Threads::RWLock::WriterLock lm (lock);
if ((removed = remove_tempo_locked (tempo))) {
if (complete_operation) {
- recompute_map (true);
+ recompute_map (_metrics);
}
}
}
@@ -324,11 +735,12 @@ TempoMap::remove_tempo_locked (const TempoSection& tempo)
{
Metrics::iterator i;
- for (i = metrics.begin(); i != metrics.end(); ++i) {
+ for (i = _metrics.begin(); i != _metrics.end(); ++i) {
if (dynamic_cast<TempoSection*> (*i) != 0) {
if (tempo.frame() == (*i)->frame()) {
if ((*i)->movable()) {
- metrics.erase (i);
+ delete (*i);
+ _metrics.erase (i);
return true;
}
}
@@ -347,7 +759,7 @@ TempoMap::remove_meter (const MeterSection& tempo, bool complete_operation)
Glib::Threads::RWLock::WriterLock lm (lock);
if ((removed = remove_meter_locked (tempo))) {
if (complete_operation) {
- recompute_map (true);
+ recompute_map (_metrics);
}
}
}
@@ -358,15 +770,29 @@ TempoMap::remove_meter (const MeterSection& tempo, bool complete_operation)
}
bool
-TempoMap::remove_meter_locked (const MeterSection& tempo)
+TempoMap::remove_meter_locked (const MeterSection& meter)
{
- Metrics::iterator i;
- for (i = metrics.begin(); i != metrics.end(); ++i) {
+ if (meter.position_lock_style() == AudioTime) {
+ /* remove meter-locked tempo */
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ TempoSection* t = 0;
+ if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+ if (t->locked_to_meter() && meter.frame() == (*i)->frame()) {
+ delete (*i);
+ _metrics.erase (i);
+ break;
+ }
+ }
+ }
+ }
+
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if (dynamic_cast<MeterSection*> (*i) != 0) {
- if (tempo.frame() == (*i)->frame()) {
+ if (meter.frame() == (*i)->frame()) {
if ((*i)->movable()) {
- metrics.erase (i);
+ delete (*i);
+ _metrics.erase (i);
return true;
}
}
@@ -380,34 +806,24 @@ void
TempoMap::do_insert (MetricSection* section)
{
bool need_add = true;
-
- assert (section->start().ticks == 0);
-
/* we only allow new meters to be inserted on beat 1 of an existing
* measure.
*/
+ MeterSection* m = 0;
+ if ((m = dynamic_cast<MeterSection*>(section)) != 0) {
- if (dynamic_cast<MeterSection*>(section)) {
-
- /* we need to (potentially) update the BBT times of tempo
- sections based on this new meter.
- */
-
- if ((section->start().beats != 1) || (section->start().ticks != 0)) {
-
- BBT_Time corrected = section->start();
- corrected.beats = 1;
- corrected.ticks = 0;
+ if ((m->bbt().beats != 1) || (m->bbt().ticks != 0)) {
+ pair<double, BBT_Time> corrected = make_pair (m->beat(), m->bbt());
+ corrected.second.beats = 1;
+ corrected.second.ticks = 0;
+ corrected.first = beat_at_bbt_locked (_metrics, corrected.second);
warning << string_compose (_("Meter changes can only be positioned on the first beat of a bar. Moving from %1 to %2"),
- section->start(), corrected) << endmsg;
-
- section->set_start (corrected);
+ m->bbt(), corrected.second) << endmsg;
+ //m->set_pulse (corrected);
}
}
-
-
/* Look for any existing MetricSection that is of the same type and
in the same bar as the new one, and remove it before adding
the new one. Note that this means that if we find a matching,
@@ -415,51 +831,61 @@ TempoMap::do_insert (MetricSection* section)
guaranteed that there is only one such match.
*/
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
- bool const iter_is_tempo = dynamic_cast<TempoSection*> (*i) != 0;
- bool const insert_is_tempo = dynamic_cast<TempoSection*> (section) != 0;
+ TempoSection* const tempo = dynamic_cast<TempoSection*> (*i);
+ TempoSection* const insert_tempo = dynamic_cast<TempoSection*> (section);
+ MeterSection* const meter = dynamic_cast<MeterSection*> (*i);
+ MeterSection* const insert_meter = dynamic_cast<MeterSection*> (section);
- if (iter_is_tempo && insert_is_tempo) {
+ if (tempo && insert_tempo) {
/* Tempo sections */
+ bool const ipm = insert_tempo->position_lock_style() == MusicTime;
+ if ((ipm && tempo->pulse() == insert_tempo->pulse()) || (!ipm && tempo->frame() == insert_tempo->frame())) {
- if ((*i)->start().bars == section->start().bars &&
- (*i)->start().beats == section->start().beats) {
-
- if (!(*i)->movable()) {
+ if (!tempo->movable()) {
/* can't (re)move this section, so overwrite
* its data content (but not its properties as
* a section).
*/
- *(dynamic_cast<Tempo*>(*i)) = *(dynamic_cast<Tempo*>(section));
+ *(dynamic_cast<Tempo*>(*i)) = *(dynamic_cast<Tempo*>(insert_tempo));
+ (*i)->set_position_lock_style (AudioTime);
+ TempoSection* t;
+ if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+ t->set_type (insert_tempo->type());
+ }
need_add = false;
} else {
- metrics.erase (i);
+ delete (*i);
+ _metrics.erase (i);
}
break;
}
- } else if (!iter_is_tempo && !insert_is_tempo) {
+ } else if (meter && insert_meter) {
/* Meter Sections */
- if ((*i)->start().bars == section->start().bars) {
+ bool const ipm = insert_meter->position_lock_style() == MusicTime;
- if (!(*i)->movable()) {
+ if ((ipm && meter->beat() == insert_meter->beat()) || (!ipm && meter->frame() == insert_meter->frame())) {
+
+ if (!meter->movable()) {
/* can't (re)move this section, so overwrite
* its data content (but not its properties as
* a section
*/
- *(dynamic_cast<Meter*>(*i)) = *(dynamic_cast<Meter*>(section));
+ *(dynamic_cast<Meter*>(*i)) = *(dynamic_cast<Meter*>(insert_meter));
+ (*i)->set_position_lock_style (AudioTime);
need_add = false;
} else {
- metrics.erase (i);
-
+ delete (*i);
+ _metrics.erase (i);
}
break;
@@ -474,34 +900,73 @@ TempoMap::do_insert (MetricSection* section)
*/
if (need_add) {
-
+ MeterSection* const insert_meter = dynamic_cast<MeterSection*> (section);
+ TempoSection* const insert_tempo = dynamic_cast<TempoSection*> (section);
Metrics::iterator i;
-
- for (i = metrics.begin(); i != metrics.end(); ++i) {
- if ((*i)->start() > section->start()) {
- break;
+ if (insert_meter) {
+ for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+ MeterSection* const meter = dynamic_cast<MeterSection*> (*i);
+
+ if (meter) {
+ bool const ipm = insert_meter->position_lock_style() == MusicTime;
+ if ((ipm && meter->beat() > insert_meter->beat()) || (!ipm && meter->frame() > insert_meter->frame())) {
+ break;
+ }
+ }
+ }
+ } else if (insert_tempo) {
+ for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+ TempoSection* const tempo = dynamic_cast<TempoSection*> (*i);
+
+ if (tempo) {
+ bool const ipm = insert_tempo->position_lock_style() == MusicTime;
+ if ((ipm && tempo->pulse() > insert_tempo->pulse()) || (!ipm && tempo->frame() > insert_tempo->frame())) {
+ break;
+ }
+ }
}
}
- metrics.insert (i, section);
+ _metrics.insert (i, section);
+ //dump (_metrics, std::cout);
}
}
+TempoSection*
+TempoMap::add_tempo (const Tempo& tempo, const double& pulse, const framepos_t& frame, ARDOUR::TempoSection::Type type, PositionLockStyle pls)
+{
+ TempoSection* ts = 0;
+ {
+ Glib::Threads::RWLock::WriterLock lm (lock);
+ ts = add_tempo_locked (tempo, pulse, frame, type, pls, true);
+ }
+
+
+ PropertyChanged (PropertyChange ());
+
+ return ts;
+}
+
void
-TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const BBT_Time& where)
+TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const double& pulse, const framepos_t& frame, TempoSection::Type type, PositionLockStyle pls)
{
+ const bool locked_to_meter = ts.locked_to_meter();
+
{
Glib::Threads::RWLock::WriterLock lm (lock);
TempoSection& first (first_tempo());
-
- if (ts.start() != first.start()) {
+ if (ts.frame() != first.frame()) {
remove_tempo_locked (ts);
- add_tempo_locked (tempo, where, true);
+ add_tempo_locked (tempo, pulse, frame, type, pls, true, locked_to_meter);
} else {
+ first.set_type (type);
+ first.set_pulse (0.0);
+ first.set_frame (frame);
+ first.set_position_lock_style (AudioTime);
{
/* cannot move the first tempo section */
*static_cast<Tempo*>(&first) = tempo;
- recompute_map (false);
+ recompute_map (_metrics);
}
}
}
@@ -509,125 +974,128 @@ TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const BBT_T
PropertyChanged (PropertyChange ());
}
-void
-TempoMap::add_tempo (const Tempo& tempo, BBT_Time where)
+TempoSection*
+TempoMap::add_tempo_locked (const Tempo& tempo, double pulse, framepos_t frame
+ , TempoSection::Type type, PositionLockStyle pls, bool recompute, bool locked_to_meter)
+{
+ TempoSection* t = new TempoSection (pulse, frame, tempo.beats_per_minute(), tempo.note_type(), type, pls);
+ t->set_locked_to_meter (locked_to_meter);
+ bool solved = false;
+
+ do_insert (t);
+
+ if (recompute) {
+ if (pls == AudioTime) {
+ solved = solve_map_frame (_metrics, t, t->frame());
+ } else {
+ solved = solve_map_pulse (_metrics, t, t->pulse());
+ }
+ recompute_meters (_metrics);
+ }
+
+ if (!solved && recompute) {
+ warning << "Adding tempo may have left the tempo map unsolved." << endmsg;
+ recompute_map (_metrics);
+ }
+
+ return t;
+}
+
+MeterSection*
+TempoMap::add_meter (const Meter& meter, const double& beat, const Timecode::BBT_Time& where, const framepos_t& frame, PositionLockStyle pls)
{
+ MeterSection* m = 0;
{
Glib::Threads::RWLock::WriterLock lm (lock);
- add_tempo_locked (tempo, where, true);
+ m = add_meter_locked (meter, beat, where, frame, pls, true);
}
+#ifndef NDEBUG
+ if (DEBUG_ENABLED(DEBUG::TempoMap)) {
+ dump (_metrics, std::cerr);
+ }
+#endif
+
PropertyChanged (PropertyChange ());
+ return m;
}
void
-TempoMap::add_tempo_locked (const Tempo& tempo, BBT_Time where, bool recompute)
+TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_Time& where, const framepos_t& frame, PositionLockStyle pls)
{
- /* new tempos always start on a beat */
- where.ticks = 0;
+ {
+ Glib::Threads::RWLock::WriterLock lm (lock);
+ const double beat = beat_at_bbt_locked (_metrics, where);
- TempoSection* ts = new TempoSection (where, tempo.beats_per_minute(), tempo.note_type());
+ if (ms.movable()) {
+ remove_meter_locked (ms);
+ add_meter_locked (meter, beat, where, frame, pls, true);
+ } else {
+ MeterSection& first (first_meter());
+ TempoSection& first_t (first_tempo());
+ /* cannot move the first meter section */
+ *static_cast<Meter*>(&first) = meter;
+ first.set_position_lock_style (AudioTime);
+ first.set_pulse (0.0);
+ first.set_frame (frame);
+ pair<double, BBT_Time> beat = make_pair (0.0, BBT_Time (1, 1, 0));
+ first.set_beat (beat);
+ first_t.set_frame (first.frame());
+ first_t.set_pulse (0.0);
+ first_t.set_position_lock_style (AudioTime);
+ recompute_map (_metrics);
+ }
+ }
- /* find the meter to use to set the bar offset of this
- * tempo section.
- */
+ PropertyChanged (PropertyChange ());
+}
- const Meter* meter = &first_meter();
+MeterSection*
+TempoMap::add_meter_locked (const Meter& meter, double beat, const BBT_Time& where, framepos_t frame, PositionLockStyle pls, bool recompute)
+{
+ const MeterSection& prev_m = meter_section_at_frame_locked (_metrics, frame - 1);
+ const double pulse = ((where.bars - prev_m.bbt().bars) * (prev_m.divisions_per_bar() / prev_m.note_divisor())) + prev_m.pulse();
+ TempoSection* mlt = 0;
- /* as we start, we are *guaranteed* to have m.meter and m.tempo pointing
- at something, because we insert the default tempo and meter during
- TempoMap construction.
+ if (pls == AudioTime) {
+ /* add meter-locked tempo */
+ mlt = add_tempo_locked (tempo_at_frame_locked (_metrics, frame), pulse, frame, TempoSection::Ramp, AudioTime, true, true);
- now see if we can find better candidates.
- */
+ if (!mlt) {
+ return 0;
+ }
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
-
- const MeterSection* m;
-
- if (where < (*i)->start()) {
- break;
- }
-
- if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
- meter = m;
- }
}
- ts->update_bar_offset_from_bbt (*meter);
-
- /* and insert it */
+ MeterSection* new_meter = new MeterSection (pulse, frame, beat, where, meter.divisions_per_bar(), meter.note_divisor(), pls);
+ bool solved = false;
- do_insert (ts);
+ do_insert (new_meter);
if (recompute) {
- recompute_map (false);
- }
-}
-
-void
-TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_Time& where)
-{
- {
- Glib::Threads::RWLock::WriterLock lm (lock);
- MeterSection& first (first_meter());
- if (ms.start() != first.start()) {
- remove_meter_locked (ms);
- add_meter_locked (meter, where, true);
+ if (pls == AudioTime) {
+ solved = solve_map_frame (_metrics, new_meter, frame);
} else {
- /* cannot move the first meter section */
- *static_cast<Meter*>(&first) = meter;
- recompute_map (true);
+ solved = solve_map_bbt (_metrics, new_meter, where);
+ /* required due to resetting the pulse of meter-locked tempi above.
+ Arguably solve_map_bbt() should use solve_map_pulse (_metrics, TempoSection) instead,
+ but afaict this cannot cause the map to be left unsolved (these tempi are all audio locked).
+ */
+ recompute_map (_metrics);
}
}
- PropertyChanged (PropertyChange ());
-}
-
-void
-TempoMap::add_meter (const Meter& meter, BBT_Time where)
-{
- {
- Glib::Threads::RWLock::WriterLock lm (lock);
- add_meter_locked (meter, where, true);
- }
-
-
-#ifndef NDEBUG
- if (DEBUG_ENABLED(DEBUG::TempoMap)) {
- dump (std::cerr);
- }
-#endif
-
- PropertyChanged (PropertyChange ());
-}
-
-void
-TempoMap::add_meter_locked (const Meter& meter, BBT_Time where, bool recompute)
-{
- /* a new meter always starts a new bar on the first beat. so
- round the start time appropriately. remember that
- `where' is based on the existing tempo map, not
- the result after we insert the new meter.
-
- */
-
- if (where.beats != 1) {
- where.beats = 1;
- where.bars++;
- }
-
- /* new meters *always* start on a beat. */
- where.ticks = 0;
-
- do_insert (new MeterSection (where, meter.divisions_per_bar(), meter.note_divisor()));
-
- if (recompute) {
- recompute_map (true);
+ if (!solved && recompute) {
+ /* if this has failed to solve, there is little we can do other than to ensure that
+ the new map is recalculated.
+ */
+ warning << "Adding meter may have left the tempo map unsolved." << endmsg;
+ recompute_map (_metrics);
}
+ return new_meter;
}
void
@@ -636,12 +1104,15 @@ TempoMap::change_initial_tempo (double beats_per_minute, double note_type)
Tempo newtempo (beats_per_minute, note_type);
TempoSection* t;
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+ if (!t->active()) {
+ continue;
+ }
{
Glib::Threads::RWLock::WriterLock lm (lock);
*((Tempo*) t) = newtempo;
- recompute_map (false);
+ recompute_map (_metrics);
}
PropertyChanged (PropertyChange ());
break;
@@ -661,7 +1132,7 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d
/* find the TempoSection immediately preceding "where"
*/
- for (first = 0, i = metrics.begin(), prev = 0; i != metrics.end(); ++i) {
+ for (first = 0, i = _metrics.begin(), prev = 0; i != _metrics.end(); ++i) {
if ((*i)->frame() > where) {
break;
@@ -670,6 +1141,9 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d
TempoSection* t;
if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+ if (!t->active()) {
+ continue;
+ }
if (!first) {
first = t;
}
@@ -692,7 +1166,7 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d
Glib::Threads::RWLock::WriterLock lm (lock);
/* cannot move the first tempo section */
*((Tempo*)prev) = newtempo;
- recompute_map (false);
+ recompute_map (_metrics);
}
PropertyChanged (PropertyChange ());
@@ -703,13 +1177,13 @@ TempoMap::first_meter () const
{
const MeterSection *m = 0;
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((m = dynamic_cast<const MeterSection *> (*i)) != 0) {
return *m;
}
}
- fatal << _("programming error: no tempo section in tempo map!") << endmsg;
+ fatal << _("programming error: no meter section in tempo map!") << endmsg;
abort(); /*NOTREACHED*/
return *m;
}
@@ -721,7 +1195,7 @@ TempoMap::first_meter ()
/* CALLER MUST HOLD LOCK */
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((m = dynamic_cast<MeterSection *> (*i)) != 0) {
return *m;
}
@@ -739,9 +1213,14 @@ TempoMap::first_tempo () const
/* CALLER MUST HOLD LOCK */
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((t = dynamic_cast<const TempoSection *> (*i)) != 0) {
- return *t;
+ if (!t->active()) {
+ continue;
+ }
+ if (!t->movable()) {
+ return *t;
+ }
}
}
@@ -755,9 +1234,14 @@ TempoMap::first_tempo ()
{
TempoSection *t = 0;
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((t = dynamic_cast<TempoSection *> (*i)) != 0) {
- return *t;
+ if (!t->active()) {
+ continue;
+ }
+ if (!t->movable()) {
+ return *t;
+ }
}
}
@@ -765,50 +1249,130 @@ TempoMap::first_tempo ()
abort(); /*NOTREACHED*/
return *t;
}
-
void
-TempoMap::require_map_to (framepos_t pos)
+TempoMap::recompute_tempi (Metrics& metrics)
{
- Glib::Threads::RWLock::WriterLock lm (lock);
+ TempoSection* prev_t = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ TempoSection* t;
+
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if (!t->movable()) {
+ if (!prev_t) {
+ t->set_pulse (0.0);
+ prev_t = t;
+ continue;
+ }
+ }
+ if (prev_t) {
+ if (t->position_lock_style() == AudioTime) {
+ prev_t->set_c_func (prev_t->compute_c_func_frame (t->pulses_per_minute(), t->frame(), _frame_rate));
+ if (!t->locked_to_meter()) {
+ t->set_pulse (prev_t->pulse_at_tempo (t->pulses_per_minute(), t->frame(), _frame_rate));
+ }
+
+ } else {
+ prev_t->set_c_func (prev_t->compute_c_func_pulse (t->pulses_per_minute(), t->pulse(), _frame_rate));
+ t->set_frame (prev_t->frame_at_tempo (t->pulses_per_minute(), t->pulse(), _frame_rate));
- if (_map.empty() || _map.back().frame < pos) {
- extend_map (pos);
+ }
+ }
+ prev_t = t;
+ }
}
+ prev_t->set_c_func (0.0);
}
+/* tempos must be positioned correctly.
+ the current approach is to use a meter's bbt time as its base position unit.
+ an audio-locked meter requires a recomputation of pulse and beat (but not bbt),
+ while a music-locked meter requires recomputations of frame pulse and beat (but not bbt)
+*/
void
-TempoMap::require_map_to (const BBT_Time& bbt)
+TempoMap::recompute_meters (Metrics& metrics)
{
- Glib::Threads::RWLock::WriterLock lm (lock);
+ MeterSection* meter = 0;
+ MeterSection* prev_m = 0;
+
+ for (Metrics::const_iterator mi = metrics.begin(); mi != metrics.end(); ++mi) {
+ if (!(*mi)->is_tempo()) {
+ meter = static_cast<MeterSection*> (*mi);
+ if (meter->position_lock_style() == AudioTime) {
+ double pulse = 0.0;
+ pair<double, BBT_Time> b_bbt;
+ TempoSection* meter_locked_tempo = 0;
+ for (Metrics::const_iterator ii = metrics.begin(); ii != metrics.end(); ++ii) {
+ TempoSection* t;
+ if ((*ii)->is_tempo()) {
+ t = static_cast<TempoSection*> (*ii);
+ if ((t->locked_to_meter() || !t->movable()) && t->frame() == meter->frame()) {
+ meter_locked_tempo = t;
+ break;
+ }
+ }
+ }
- /* since we have no idea where BBT is if its off the map, see the last
- * point in the map is past BBT, and if not add an arbitrary amount of
- * time until it is.
- */
+ if (prev_m) {
+ const double beats = (meter->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar();
+ if (beats + prev_m->beat() != meter->beat()) {
+ /* reordering caused a bbt change */
+ b_bbt = make_pair (beats + prev_m->beat()
+ , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+ pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+
+ } else if (meter->movable()) {
+ b_bbt = make_pair (meter->beat(), meter->bbt());
+ pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+ }
+ } else {
+ b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+ }
+ if (meter_locked_tempo) {
+ meter_locked_tempo->set_pulse (pulse);
+ }
+ meter->set_beat (b_bbt);
+ meter->set_pulse (pulse);
- int additional_minutes = 1;
+ } else {
+ /* MusicTime */
+ double pulse = 0.0;
+ pair<double, BBT_Time> b_bbt;
+ if (prev_m) {
+ const double beats = (meter->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar();
+ if (beats + prev_m->beat() != meter->beat()) {
+ /* reordering caused a bbt change */
+ b_bbt = make_pair (beats + prev_m->beat()
+ , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+ } else {
+ b_bbt = make_pair (beats + prev_m->beat(), meter->bbt());
+ }
+ pulse = (beats / prev_m->note_divisor()) + prev_m->pulse();
+ } else {
+ /* shouldn't happen - the first is audio-locked */
+ pulse = pulse_at_beat_locked (metrics, meter->beat());
+ b_bbt = make_pair (meter->beat(), meter->bbt());
+ }
- while (1) {
- if (!_map.empty() && _map.back().bar >= (bbt.bars + 1)) {
- break;
+ meter->set_beat (b_bbt);
+ meter->set_pulse (pulse);
+ meter->set_frame (frame_at_pulse_locked (metrics, pulse));
+ }
+
+ prev_m = meter;
}
- /* add some more distance, using bigger steps each time */
- extend_map (_map.back().frame + (_frame_rate * 60 * additional_minutes));
- additional_minutes *= 2;
}
}
void
-TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end)
+TempoMap::recompute_map (Metrics& metrics, framepos_t end)
{
/* CALLER MUST HOLD WRITE LOCK */
- MeterSection* meter = 0;
- TempoSection* tempo = 0;
- double current_frame;
- BBT_Time current;
- Metrics::iterator next_metric;
-
if (end < 0) {
/* we will actually stop once we hit
@@ -816,296 +1380,18 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end)
*/
end = max_framepos;
- } else {
- if (!_map.empty ()) {
- /* never allow the map to be shortened */
- end = max (end, _map.back().frame);
- }
}
DEBUG_TRACE (DEBUG::TempoMath, string_compose ("recomputing tempo map, zero to %1\n", end));
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
- MeterSection* ms;
-
- if ((ms = dynamic_cast<MeterSection *> (*i)) != 0) {
- meter = ms;
- break;
- }
- }
-
- assert(meter);
-
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
- TempoSection* ts;
-
- if ((ts = dynamic_cast<TempoSection *> (*i)) != 0) {
- tempo = ts;
- break;
- }
- }
-
- assert(tempo);
-
- /* assumes that the first meter & tempo are at frame zero */
- current_frame = 0;
- meter->set_frame (0);
- tempo->set_frame (0);
-
- /* assumes that the first meter & tempo are at 1|1|0 */
- current.bars = 1;
- current.beats = 1;
- current.ticks = 0;
-
- if (reassign_tempo_bbt) {
-
- MeterSection* rmeter = meter;
-
- DEBUG_TRACE (DEBUG::TempoMath, "\tUpdating tempo marks BBT time from bar offset\n");
-
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
-
- TempoSection* ts;
- MeterSection* ms;
-
- if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) {
-
- /* reassign the BBT time of this tempo section
- * based on its bar offset position.
- */
-
- ts->update_bbt_time_from_bar_offset (*rmeter);
-
- } else if ((ms = dynamic_cast<MeterSection*>(*i)) != 0) {
- rmeter = ms;
- } else {
- fatal << _("programming error: unhandled MetricSection type") << endmsg;
- abort(); /*NOTREACHED*/
- }
- }
- }
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("start with meter = %1 tempo = %2\n", *((Meter*)meter), *((Tempo*)tempo)));
-
- next_metric = metrics.begin();
- ++next_metric; // skip meter (or tempo)
- ++next_metric; // skip tempo (or meter)
-
- _map.clear ();
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add first bar at 1|1 @ %2\n", current.bars, current_frame));
- _map.push_back (BBTPoint (*meter, *tempo,(framepos_t) llrint(current_frame), 1, 1));
-
if (end == 0) {
/* silly call from Session::process() during startup
*/
return;
}
- _extend_map (tempo, meter, next_metric, current, current_frame, end);
-}
-
-void
-TempoMap::extend_map (framepos_t end)
-{
- /* CALLER MUST HOLD WRITE LOCK */
-
- if (_map.empty()) {
- recompute_map (false, end);
- return;
- }
-
- BBTPointList::const_iterator i = _map.end();
- Metrics::iterator next_metric;
-
- --i;
-
- BBT_Time last_metric_start;
-
- if ((*i).tempo->frame() > (*i).meter->frame()) {
- last_metric_start = (*i).tempo->start();
- } else {
- last_metric_start = (*i).meter->start();
- }
-
- /* find the metric immediately after the tempo + meter sections for the
- * last point in the map
- */
-
- for (next_metric = metrics.begin(); next_metric != metrics.end(); ++next_metric) {
- if ((*next_metric)->start() > last_metric_start) {
- break;
- }
- }
-
- /* we cast away const here because this is the one place where we need
- * to actually modify the frame time of each metric section.
- */
-
- _extend_map (const_cast<TempoSection*> ((*i).tempo),
- const_cast<MeterSection*> ((*i).meter),
- next_metric, BBT_Time ((*i).bar, (*i).beat, 0), (*i).frame, end);
-}
-
-void
-TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter,
- Metrics::iterator next_metric,
- BBT_Time current, framepos_t current_frame, framepos_t end)
-{
- /* CALLER MUST HOLD WRITE LOCK */
-
- TempoSection* ts;
- MeterSection* ms;
- double beat_frames;
- double current_frame_exact;
- framepos_t bar_start_frame;
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Extend map to %1 from %2 = %3\n", end, current, current_frame));
-
- if (current.beats == 1) {
- bar_start_frame = current_frame;
- } else {
- bar_start_frame = 0;
- }
-
- beat_frames = meter->frames_per_grid (*tempo,_frame_rate);
- current_frame_exact = current_frame;
-
- while (current_frame < end) {
-
- current.beats++;
- current_frame_exact += beat_frames;
- current_frame = llrint(current_frame_exact);
-
- if (current.beats > meter->divisions_per_bar()) {
- current.bars++;
- current.beats = 1;
- }
-
- if (next_metric != metrics.end()) {
-
- /* no operator >= so invert operator < */
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("now at %1 next metric @ %2\n", current, (*next_metric)->start()));
-
- if (!(current < (*next_metric)->start())) {
-
- set_metrics:
- if (((ts = dynamic_cast<TempoSection*> (*next_metric)) != 0)) {
-
- tempo = ts;
-
- /* new tempo section: if its on a beat,
- * we don't have to do anything other
- * than recompute various distances,
- * done further below as we transition
- * the next metric section.
- *
- * if its not on the beat, we have to
- * compute the duration of the beat it
- * is within, which will be different
- * from the preceding following ones
- * since it takes part of its duration
- * from the preceding tempo and part
- * from this new tempo.
- */
-
- if (tempo->start().ticks != 0) {
-
- double next_beat_frames = tempo->frames_per_beat (_frame_rate);
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("bumped into non-beat-aligned tempo metric at %1 = %2, adjust next beat using %3\n",
- tempo->start(), current_frame, tempo->bar_offset()));
-
- /* back up to previous beat */
- current_frame_exact -= beat_frames;
- current_frame = llrint(current_frame_exact);
-
- /* set tempo section location
- * based on offset from last
- * bar start
- */
- tempo->set_frame (bar_start_frame +
- llrint ((ts->bar_offset() * meter->divisions_per_bar() * beat_frames)));
-
- /* advance to the location of
- * the new (adjusted) beat. do
- * this by figuring out the
- * offset within the beat that
- * would have been there
- * without the tempo
- * change. then stretch the
- * beat accordingly.
- */
-
- double offset_within_old_beat = (tempo->frame() - current_frame) / beat_frames;
-
- current_frame_exact += (offset_within_old_beat * beat_frames) + ((1.0 - offset_within_old_beat) * next_beat_frames);
- current_frame = llrint(current_frame_exact);
-
- /* next metric doesn't have to
- * match this precisely to
- * merit a reloop ...
- */
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Adjusted last beat to %1\n", current_frame));
-
- } else {
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("bumped into beat-aligned tempo metric at %1 = %2\n",
- tempo->start(), current_frame));
- tempo->set_frame (current_frame);
- }
-
- } else if ((ms = dynamic_cast<MeterSection*>(*next_metric)) != 0) {
-
- meter = ms;
-
- /* new meter section: always defines the
- * start of a bar.
- */
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("bumped into meter section at %1 vs %2 (%3)\n",
- meter->start(), current, current_frame));
-
- assert (current.beats == 1);
-
- meter->set_frame (current_frame);
- }
-
- beat_frames = meter->frames_per_grid (*tempo, _frame_rate);
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("New metric with beat frames = %1 dpb %2 meter %3 tempo %4\n",
- beat_frames, meter->divisions_per_bar(), *((Meter*)meter), *((Tempo*)tempo)));
-
- ++next_metric;
-
- if (next_metric != metrics.end() && ((*next_metric)->start() == current)) {
- /* same position so go back and set this one up before advancing
- */
- goto set_metrics;
- }
-
- }
- }
-
- if (current.beats == 1) {
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Bar at %1|1 @ %2\n", current.bars, current_frame));
- _map.push_back (BBTPoint (*meter, *tempo, current_frame, current.bars, 1));
- bar_start_frame = current_frame;
- } else {
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Beat at %1|%2 @ %3\n", current.bars, current.beats, current_frame));
- _map.push_back (BBTPoint (*meter, *tempo, current_frame, current.bars, current.beats));
- }
-
- if (next_metric == metrics.end()) {
- /* no more metrics - we've timestamped them all, stop here */
- if (end == max_framepos) {
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("stop extending map now that we've reach the end @ %1|%2 = %3\n",
- current.bars, current.beats, current_frame));
- break;
- }
- }
- }
+ recompute_tempi (metrics);
+ recompute_meters (metrics);
}
TempoMetric
@@ -1121,7 +1407,7 @@ TempoMap::metric_at (framepos_t frame, Metrics::const_iterator* last) const
now see if we can find better candidates.
*/
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((*i)->frame() > frame) {
break;
@@ -1137,6 +1423,7 @@ TempoMap::metric_at (framepos_t frame, Metrics::const_iterator* last) const
return m;
}
+/* XX meters only */
TempoMetric
TempoMap::metric_at (BBT_Time bbt) const
{
@@ -1150,145 +1437,1583 @@ TempoMap::metric_at (BBT_Time bbt) const
now see if we can find better candidates.
*/
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ MeterSection* mw;
+ if (!(*i)->is_tempo()) {
+ mw = static_cast<MeterSection*> (*i);
+ BBT_Time section_start (mw->bbt());
- BBT_Time section_start ((*i)->start());
+ if (section_start.bars > bbt.bars || (section_start.bars == bbt.bars && section_start.beats > bbt.beats)) {
+ break;
+ }
- if (section_start.bars > bbt.bars || (section_start.bars == bbt.bars && section_start.beats > bbt.beats)) {
- break;
+ m.set_metric (*i);
}
-
- m.set_metric (*i);
}
return m;
}
-void
-TempoMap::bbt_time (framepos_t frame, BBT_Time& bbt)
+double
+TempoMap::beat_at_frame (const framecnt_t& frame) const
{
- require_map_to (frame);
-
Glib::Threads::RWLock::ReaderLock lm (lock);
-
- if (frame < 0) {
- bbt.bars = 1;
- bbt.beats = 1;
- bbt.ticks = 0;
- warning << string_compose (_("tempo map asked for BBT time at frame %1\n"), frame) << endmsg;
- return;
- }
-
- return bbt_time (frame, bbt, bbt_before_or_at (frame));
+ return beat_at_frame_locked (_metrics, frame);
}
-void
-TempoMap::bbt_time_rt (framepos_t frame, BBT_Time& bbt)
+/* meter / tempo section based */
+double
+TempoMap::beat_at_frame_locked (const Metrics& metrics, const framecnt_t& frame) const
{
- Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK);
+ const TempoSection& ts = tempo_section_at_frame_locked (metrics, frame);
+ MeterSection* prev_m = 0;
+ MeterSection* next_m = 0;
- if (!lm.locked()) {
- throw std::logic_error ("TempoMap::bbt_time_rt() could not lock tempo map");
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
+ if (prev_m && (*i)->frame() > frame) {
+ next_m = static_cast<MeterSection*> (*i);
+ break;
+ }
+ prev_m = static_cast<MeterSection*> (*i);
+ }
}
+ if (frame < prev_m->frame()) {
+ return 0.0;
+ }
+ const double beat = prev_m->beat() + (ts.pulse_at_frame (frame, _frame_rate) - prev_m->pulse()) * prev_m->note_divisor();
- if (_map.empty() || _map.back().frame < frame) {
- throw std::logic_error (string_compose ("map not long enough to reach %1", frame));
+ /* audio locked meters fake their beat */
+ if (next_m && next_m->beat() < beat) {
+ return next_m->beat();
}
- return bbt_time (frame, bbt, bbt_before_or_at (frame));
+ return beat;
}
-void
-TempoMap::bbt_time (framepos_t frame, BBT_Time& bbt, const BBTPointList::const_iterator& i)
+framepos_t
+TempoMap::frame_at_beat (const double& beat) const
{
- /* CALLER MUST HOLD READ LOCK */
-
- bbt.bars = (*i).bar;
- bbt.beats = (*i).beat;
-
- if ((*i).frame == frame) {
- bbt.ticks = 0;
- } else {
- bbt.ticks = llrint (((frame - (*i).frame) / (*i).tempo->frames_per_beat(_frame_rate)) *
- BBT_Time::ticks_per_beat);
- }
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return frame_at_beat_locked (_metrics, beat);
}
+/* meter & tempo section based */
framepos_t
-TempoMap::frame_time (const BBT_Time& bbt)
+TempoMap::frame_at_beat_locked (const Metrics& metrics, const double& beat) const
{
- if (bbt.bars < 1) {
- warning << string_compose (_("tempo map asked for frame time at bar < 1 (%1)\n"), bbt) << endmsg;
- return 0;
- }
-
- if (bbt.beats < 1) {
- throw std::logic_error ("beats are counted from one");
- }
+ MeterSection* prev_m = 0;
+ TempoSection* prev_t = 0;
- require_map_to (bbt);
+ MeterSection* m;
- Glib::Threads::RWLock::ReaderLock lm (lock);
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m && m->beat() > beat) {
+ break;
+ }
+ prev_m = m;
+ }
+ }
+
+ TempoSection* t;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (prev_t && ((t->pulse() - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat() > beat) {
+ break;
+ }
+ prev_t = t;
+ }
+
+ }
+
+ return prev_t->frame_at_pulse (((beat - prev_m->beat()) / prev_m->note_divisor()) + prev_m->pulse(), _frame_rate);
+}
+
+Tempo
+TempoMap::tempo_at_frame (const framepos_t& frame) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return tempo_at_frame_locked (_metrics, frame);
+}
+
+Tempo
+TempoMap::tempo_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const
+{
+ TempoSection* prev_t = 0;
+
+ TempoSection* t;
+
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if ((prev_t) && t->frame() > frame) {
+ /* t is the section past frame */
+ const double ret_bpm = prev_t->tempo_at_frame (frame, _frame_rate) * prev_t->note_type();
+ const Tempo ret_tempo (ret_bpm, prev_t->note_type());
+ return ret_tempo;
+ }
+ prev_t = t;
+ }
+ }
+
+ const double ret = prev_t->beats_per_minute();
+ const Tempo ret_tempo (ret, prev_t->note_type ());
+
+ return ret_tempo;
+}
+
+/** returns the frame at which the supplied tempo occurs, or
+ * the frame of the last tempo section (search exhausted)
+ * only the position of the first occurence will be returned
+ * (extend me)
+*/
+framepos_t
+TempoMap::frame_at_tempo (const Tempo& tempo) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return frame_at_tempo_locked (_metrics, tempo);
+}
+
+
+framepos_t
+TempoMap::frame_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) const
+{
+ TempoSection* prev_t = 0;
+ const double tempo_ppm = tempo.beats_per_minute() / tempo.note_type();
+
+ Metrics::const_iterator i;
+
+ for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+ TempoSection* t;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+
+ if (!t->active()) {
+ continue;
+ }
+
+ const double t_ppm = t->beats_per_minute() / t->note_type();
+
+ if (t_ppm == tempo_ppm) {
+ return t->frame();
+ }
+
+ if (prev_t) {
+ const double prev_t_ppm = prev_t->beats_per_minute() / prev_t->note_type();
+
+ if ((t_ppm > tempo_ppm && prev_t_ppm < tempo_ppm) || (t_ppm < tempo_ppm && prev_t_ppm > tempo_ppm)) {
+ return prev_t->frame_at_tempo (tempo_ppm, prev_t->pulse(), _frame_rate);
+ }
+ }
+ prev_t = t;
+ }
+ }
+
+ return prev_t->frame();
+}
+
+/** more precise than doing tempo_at_frame (frame_at_beat (b)),
+ * as there is no intermediate frame rounding.
+ */
+Tempo
+TempoMap::tempo_at_beat (const double& beat) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ const MeterSection* prev_m = &meter_section_at_beat_locked (_metrics, beat);
+ const TempoSection* prev_t = &tempo_section_at_beat_locked (_metrics, beat);
+ const double note_type = prev_t->note_type();
+
+ return Tempo (prev_t->tempo_at_pulse (((beat - prev_m->beat()) / prev_m->note_divisor()) + prev_m->pulse()) * note_type, note_type);
+}
+
+double
+TempoMap::pulse_at_beat (const double& beat) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return pulse_at_beat_locked (_metrics, beat);
+}
+
+double
+TempoMap::pulse_at_beat_locked (const Metrics& metrics, const double& beat) const
+{
+ const MeterSection* prev_m = &meter_section_at_beat_locked (metrics, beat);
+
+ return prev_m->pulse() + ((beat - prev_m->beat()) / prev_m->note_divisor());
+}
+
+double
+TempoMap::beat_at_pulse (const double& pulse) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return beat_at_pulse_locked (_metrics, pulse);
+}
+
+double
+TempoMap::beat_at_pulse_locked (const Metrics& metrics, const double& pulse) const
+{
+ MeterSection* prev_m = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ MeterSection* m;
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m && m->pulse() > pulse) {
+ if (((pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat() > m->beat()) {
+ break;
+ }
+ }
+ prev_m = m;
+ }
+ }
+
+ double const ret = ((pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat();
+ return ret;
+}
+
+double
+TempoMap::pulse_at_frame (const framepos_t& frame) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return pulse_at_frame_locked (_metrics, frame);
+}
+
+/* tempo section based */
+double
+TempoMap::pulse_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const
+{
+ /* HOLD (at least) THE READER LOCK */
+ TempoSection* prev_t = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ TempoSection* t;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if (prev_t && t->frame() > frame) {
+ /*the previous ts is the one containing the frame */
+ const double ret = prev_t->pulse_at_frame (frame, _frame_rate);
+ return ret;
+ }
+ prev_t = t;
+ }
+ }
+
+ /* treated as constant for this ts */
+ const double pulses_in_section = (frame - prev_t->frame()) / prev_t->frames_per_pulse (_frame_rate);
+
+ return pulses_in_section + prev_t->pulse();
+}
+
+framepos_t
+TempoMap::frame_at_pulse (const double& pulse) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return frame_at_pulse_locked (_metrics, pulse);
+}
+
+/* tempo section based */
+framepos_t
+TempoMap::frame_at_pulse_locked (const Metrics& metrics, const double& pulse) const
+{
+ /* HOLD THE READER LOCK */
+
+ const TempoSection* prev_t = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ TempoSection* t;
+
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if (prev_t && t->pulse() > pulse) {
+ return prev_t->frame_at_pulse (pulse, _frame_rate);
+ }
+
+ prev_t = t;
+ }
+ }
+ /* must be treated as constant, irrespective of _type */
+ double const dtime = (pulse - prev_t->pulse()) * prev_t->frames_per_pulse (_frame_rate);
+
+ return (framecnt_t) floor (dtime) + prev_t->frame();
+}
+
+double
+TempoMap::beat_at_bbt (const Timecode::BBT_Time& bbt)
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return beat_at_bbt_locked (_metrics, bbt);
+}
+
+
+double
+TempoMap::beat_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const
+{
+ /* CALLER HOLDS READ LOCK */
+
+ MeterSection* prev_m = 0;
+
+ /* because audio-locked meters have 'fake' integral beats,
+ there is no pulse offset here.
+ */
+ MeterSection* m;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m) {
+ const double bars_to_m = (m->beat() - prev_m->beat()) / prev_m->divisions_per_bar();
+ if ((bars_to_m + (prev_m->bbt().bars - 1)) > (bbt.bars - 1)) {
+ break;
+ }
+ }
+ prev_m = m;
+ }
+ }
+
+ const double remaining_bars = bbt.bars - prev_m->bbt().bars;
+ const double remaining_bars_in_beats = remaining_bars * prev_m->divisions_per_bar();
+ const double ret = remaining_bars_in_beats + prev_m->beat() + (bbt.beats - 1) + (bbt.ticks / BBT_Time::ticks_per_beat);
+
+ return ret;
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_beat (const double& beats)
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return bbt_at_beat_locked (_metrics, beats);
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_beat_locked (const Metrics& metrics, const double& b) const
+{
+ /* CALLER HOLDS READ LOCK */
+ MeterSection* prev_m = 0;
+ const double beats = max (0.0, b);
+
+ MeterSection* m = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m) {
+ if (m->beat() > beats) {
+ /* this is the meter after the one our beat is on*/
+ break;
+ }
+ }
+
+ prev_m = m;
+ }
+ }
+
+ const double beats_in_ms = beats - prev_m->beat();
+ const uint32_t bars_in_ms = (uint32_t) floor (beats_in_ms / prev_m->divisions_per_bar());
+ const uint32_t total_bars = bars_in_ms + (prev_m->bbt().bars - 1);
+ const double remaining_beats = beats_in_ms - (bars_in_ms * prev_m->divisions_per_bar());
+ const double remaining_ticks = (remaining_beats - floor (remaining_beats)) * BBT_Time::ticks_per_beat;
+
+ BBT_Time ret;
+
+ ret.ticks = (uint32_t) floor (remaining_ticks + 0.5);
+ ret.beats = (uint32_t) floor (remaining_beats);
+ ret.bars = total_bars;
+
+ /* 0 0 0 to 1 1 0 - based mapping*/
+ ++ret.bars;
+ ++ret.beats;
+
+ if (ret.ticks >= BBT_Time::ticks_per_beat) {
+ ++ret.beats;
+ ret.ticks -= BBT_Time::ticks_per_beat;
+ }
+
+ if (ret.beats >= prev_m->divisions_per_bar() + 1) {
+ ++ret.bars;
+ ret.beats = 1;
+ }
+
+ return ret;
+}
+
+double
+TempoMap::pulse_at_bbt (const Timecode::BBT_Time& bbt)
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ return pulse_at_bbt_locked (_metrics, bbt);
+}
+
+double
+TempoMap::pulse_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const
+{
+ /* CALLER HOLDS READ LOCK */
+
+ MeterSection* prev_m = 0;
+
+ /* because audio-locked meters have 'fake' integral beats,
+ there is no pulse offset here.
+ */
+ MeterSection* m;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m) {
+ if (m->bbt().bars > bbt.bars) {
+ break;
+ }
+ }
+ prev_m = m;
+ }
+ }
+
+ const double remaining_bars = bbt.bars - prev_m->bbt().bars;
+ const double remaining_pulses = remaining_bars * prev_m->divisions_per_bar() / prev_m->note_divisor();
+ const double ret = remaining_pulses + prev_m->pulse() + (((bbt.beats - 1) + (bbt.ticks / BBT_Time::ticks_per_beat)) / prev_m->note_divisor());
+
+ return ret;
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_pulse (const double& pulse)
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ return bbt_at_pulse_locked (_metrics, pulse);
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_pulse_locked (const Metrics& metrics, const double& pulse) const
+{
+ MeterSection* prev_m = 0;
+
+ MeterSection* m = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+
+ if (prev_m) {
+ double const pulses_to_m = m->pulse() - prev_m->pulse();
+ if (prev_m->pulse() + pulses_to_m > pulse) {
+ /* this is the meter after the one our beat is on*/
+ break;
+ }
+ }
+
+ prev_m = m;
+ }
+ }
+
+ const double beats_in_ms = (pulse - prev_m->pulse()) * prev_m->note_divisor();
+ const uint32_t bars_in_ms = (uint32_t) floor (beats_in_ms / prev_m->divisions_per_bar());
+ const uint32_t total_bars = bars_in_ms + (prev_m->bbt().bars - 1);
+ const double remaining_beats = beats_in_ms - (bars_in_ms * prev_m->divisions_per_bar());
+ const double remaining_ticks = (remaining_beats - floor (remaining_beats)) * BBT_Time::ticks_per_beat;
+
+ BBT_Time ret;
+
+ ret.ticks = (uint32_t) floor (remaining_ticks + 0.5);
+ ret.beats = (uint32_t) floor (remaining_beats);
+ ret.bars = total_bars;
+
+ /* 0 0 0 to 1 1 0 mapping*/
+ ++ret.bars;
+ ++ret.beats;
+
+ if (ret.ticks >= BBT_Time::ticks_per_beat) {
+ ++ret.beats;
+ ret.ticks -= BBT_Time::ticks_per_beat;
+ }
+
+ if (ret.beats >= prev_m->divisions_per_bar() + 1) {
+ ++ret.bars;
+ ret.beats = 1;
+ }
+
+ return ret;
+}
+
+BBT_Time
+TempoMap::bbt_at_frame (framepos_t frame)
+{
+ if (frame < 0) {
+ BBT_Time bbt;
+ bbt.bars = 1;
+ bbt.beats = 1;
+ bbt.ticks = 0;
+ warning << string_compose (_("tempo map asked for BBT time at frame %1\n"), frame) << endmsg;
+ return bbt;
+ }
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ return bbt_at_frame_locked (_metrics, frame);
+}
+
+BBT_Time
+TempoMap::bbt_at_frame_rt (framepos_t frame)
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK);
+
+ if (!lm.locked()) {
+ throw std::logic_error ("TempoMap::bbt_time_rt() could not lock tempo map");
+ }
+
+ return bbt_at_frame_locked (_metrics, frame);
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const
+{
+ if (frame < 0) {
+ BBT_Time bbt;
+ bbt.bars = 1;
+ bbt.beats = 1;
+ bbt.ticks = 0;
+ warning << string_compose (_("tempo map asked for BBT time at frame %1\n"), frame) << endmsg;
+ return bbt;
+ }
+
+ const TempoSection& ts = tempo_section_at_frame_locked (metrics, frame);
+ MeterSection* prev_m = 0;
+ MeterSection* next_m = 0;
+
+ MeterSection* m;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m && m->frame() > frame) {
+ next_m = m;
+ break;
+ }
+ prev_m = m;
+ }
+ }
+
+ double beat = prev_m->beat() + (ts.pulse_at_frame (frame, _frame_rate) - prev_m->pulse()) * prev_m->note_divisor();
+
+ /* handle frame before first meter */
+ if (frame < prev_m->frame()) {
+ beat = 0.0;
+ }
+ /* audio locked meters fake their beat */
+ if (next_m && next_m->beat() < beat) {
+ beat = next_m->beat();
+ }
+
+ beat = max (0.0, beat);
+
+ const double beats_in_ms = beat - prev_m->beat();
+ const uint32_t bars_in_ms = (uint32_t) floor (beats_in_ms / prev_m->divisions_per_bar());
+ const uint32_t total_bars = bars_in_ms + (prev_m->bbt().bars - 1);
+ const double remaining_beats = beats_in_ms - (bars_in_ms * prev_m->divisions_per_bar());
+ const double remaining_ticks = (remaining_beats - floor (remaining_beats)) * BBT_Time::ticks_per_beat;
+
+ BBT_Time ret;
+
+ ret.ticks = (uint32_t) floor (remaining_ticks + 0.5);
+ ret.beats = (uint32_t) floor (remaining_beats);
+ ret.bars = total_bars;
+
+ /* 0 0 0 to 1 1 0 - based mapping*/
+ ++ret.bars;
+ ++ret.beats;
+
+ if (ret.ticks >= BBT_Time::ticks_per_beat) {
+ ++ret.beats;
+ ret.ticks -= BBT_Time::ticks_per_beat;
+ }
+
+ if (ret.beats >= prev_m->divisions_per_bar() + 1) {
+ ++ret.bars;
+ ret.beats = 1;
+ }
+
+ return ret;
+}
+
+framepos_t
+TempoMap::frame_at_bbt (const BBT_Time& bbt)
+{
+ if (bbt.bars < 1) {
+ warning << string_compose (_("tempo map asked for frame time at bar < 1 (%1)\n"), bbt) << endmsg;
+ return 0;
+ }
+
+ if (bbt.beats < 1) {
+ throw std::logic_error ("beats are counted from one");
+ }
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ return frame_at_bbt_locked (_metrics, bbt);
+}
+
+/* meter & tempo section based */
+framepos_t
+TempoMap::frame_at_bbt_locked (const Metrics& metrics, const BBT_Time& bbt) const
+{
+ /* HOLD THE READER LOCK */
+
+ const framepos_t ret = frame_at_beat_locked (metrics, beat_at_bbt_locked (metrics, bbt));
+ return ret;
+}
+
+bool
+TempoMap::check_solved (const Metrics& metrics) const
+{
+ TempoSection* prev_t = 0;
+ MeterSection* prev_m = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ TempoSection* t;
+ MeterSection* m;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if (prev_t) {
+ /* check ordering */
+ if ((t->frame() <= prev_t->frame()) || (t->pulse() <= prev_t->pulse())) {
+ return false;
+ }
+
+ /* precision check ensures tempo and frames align.*/
+ if (t->frame() != prev_t->frame_at_tempo (t->pulses_per_minute(), t->pulse(), _frame_rate)) {
+ if (!t->locked_to_meter()) {
+ return false;
+ }
+ }
+
+ /* gradient limit - who knows what it should be?
+ things are also ok (if a little chaotic) without this
+ */
+ if (fabs (prev_t->c_func()) > 1000.0) {
+ //std::cout << "c : " << prev_t->c_func() << std::endl;
+ return false;
+ }
+ }
+ prev_t = t;
+ }
+
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m && m->position_lock_style() == AudioTime) {
+ const TempoSection* t = &tempo_section_at_frame_locked (metrics, m->frame() - 1);
+ const framepos_t nascent_m_frame = t->frame_at_pulse (m->pulse(), _frame_rate);
+ /* Here we check that a preceding section of music doesn't overlap a subsequent one.
+ It is complicated by the fact that audio locked meters represent a discontinuity in the pulse
+ (they place an exact pulse at a particular time expressed only in frames).
+ This has the effect of shifting the calculated frame at the meter pulse (wrt the previous section of music)
+ away from its actual frame (which is now the frame location of the exact pulse).
+ This can result in the calculated frame (from the previous musical section)
+ differing from the exact frame by one sample.
+ Allow for that.
+ */
+ if (t && (nascent_m_frame > m->frame() + 1 || nascent_m_frame < 0)) {
+ return false;
+ }
+ }
+
+ prev_m = m;
+ }
+
+ }
+
+ return true;
+}
+
+bool
+TempoMap::set_active_tempos (const Metrics& metrics, const framepos_t& frame)
+{
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ TempoSection* t;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->movable()) {
+ t->set_active (true);
+ continue;
+ }
+ if (t->movable() && t->active () && t->position_lock_style() == AudioTime && t->frame() < frame) {
+ t->set_active (false);
+ t->set_pulse (0.0);
+ } else if (t->movable() && t->position_lock_style() == AudioTime && t->frame() > frame) {
+ t->set_active (true);
+ } else if (t->movable() && t->position_lock_style() == AudioTime && t->frame() == frame) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+bool
+TempoMap::solve_map_frame (Metrics& imaginary, TempoSection* section, const framepos_t& frame)
+{
+ TempoSection* prev_t = 0;
+ TempoSection* section_prev = 0;
+ framepos_t first_m_frame = 0;
+
+ /* can't move a tempo before the first meter */
+ for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+ MeterSection* m;
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (!m->movable()) {
+ first_m_frame = m->frame();
+ break;
+ }
+ }
+ }
+ if (section->movable() && frame <= first_m_frame) {
+ return false;
+ }
+
+ section->set_active (true);
+ section->set_frame (frame);
+
+ for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+ TempoSection* t;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+
+ if (!t->active()) {
+ continue;
+ }
+ if (prev_t) {
+ if (t == section) {
+ section_prev = prev_t;
+ if (t->locked_to_meter()) {
+ prev_t = t;
+ }
+ continue;
+ }
+ if (t->position_lock_style() == MusicTime) {
+ prev_t->set_c_func (prev_t->compute_c_func_pulse (t->pulses_per_minute(), t->pulse(), _frame_rate));
+ t->set_frame (prev_t->frame_at_pulse (t->pulse(), _frame_rate));
+ } else {
+ prev_t->set_c_func (prev_t->compute_c_func_frame (t->pulses_per_minute(), t->frame(), _frame_rate));
+ if (!t->locked_to_meter()) {
+ t->set_pulse (prev_t->pulse_at_frame (t->frame(), _frame_rate));
+ }
+ }
+ }
+ prev_t = t;
+ }
+ }
+
+ if (section_prev) {
+ section_prev->set_c_func (section_prev->compute_c_func_frame (section->pulses_per_minute(), frame, _frame_rate));
+ if (!section->locked_to_meter()) {
+ section->set_pulse (section_prev->pulse_at_frame (frame, _frame_rate));
+ }
+ }
+
+#if (0)
+ recompute_tempi (imaginary);
+
+ if (check_solved (imaginary)) {
+ return true;
+ } else {
+ dunp (imaginary, std::cout);
+ }
+#endif
+
+ MetricSectionFrameSorter fcmp;
+ imaginary.sort (fcmp);
+
+ recompute_tempi (imaginary);
+
+ if (check_solved (imaginary)) {
+ return true;
+ }
+
+ return false;
+}
+
+bool
+TempoMap::solve_map_pulse (Metrics& imaginary, TempoSection* section, const double& pulse)
+{
+ TempoSection* prev_t = 0;
+ TempoSection* section_prev = 0;
+
+ section->set_pulse (pulse);
+
+ for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+ TempoSection* t;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if (!t->movable()) {
+ t->set_pulse (0.0);
+ prev_t = t;
+ continue;
+ }
+ if (prev_t) {
+ if (t == section) {
+ section_prev = prev_t;
+ continue;
+ }
+ if (t->position_lock_style() == MusicTime) {
+ prev_t->set_c_func (prev_t->compute_c_func_pulse (t->pulses_per_minute(), t->pulse(), _frame_rate));
+ t->set_frame (prev_t->frame_at_pulse (t->pulse(), _frame_rate));
+ } else {
+ prev_t->set_c_func (prev_t->compute_c_func_frame (t->pulses_per_minute(), t->frame(), _frame_rate));
+ if (!t->locked_to_meter()) {
+ t->set_pulse (prev_t->pulse_at_frame (t->frame(), _frame_rate));
+ }
+ }
+ }
+ prev_t = t;
+ }
+ }
+
+ if (section_prev) {
+ section_prev->set_c_func (section_prev->compute_c_func_pulse (section->pulses_per_minute(), pulse, _frame_rate));
+ section->set_frame (section_prev->frame_at_pulse (pulse, _frame_rate));
+ }
+
+#if (0)
+ recompute_tempi (imaginary);
+
+ if (check_solved (imaginary)) {
+ return true;
+ } else {
+ dunp (imaginary, std::cout);
+ }
+#endif
+
+ MetricSectionSorter cmp;
+ imaginary.sort (cmp);
+
+ recompute_tempi (imaginary);
+ /* Reordering
+ * XX need a restriction here, but only for this case,
+ * as audio locked tempos don't interact in the same way.
+ *
+ * With music-locked tempos, the solution to cross-dragging can fly off the screen
+ * e.g.
+ * |50 bpm |250 bpm |60 bpm
+ * drag 250 to the pulse after 60->
+ * a clue: dragging the second 60 <- past the 250 would cause no such problem.
+ */
+ if (check_solved (imaginary)) {
+ return true;
+ }
+
+ return false;
+}
+
+bool
+TempoMap::solve_map_frame (Metrics& imaginary, MeterSection* section, const framepos_t& frame)
+{
+ /* disallow moving first meter past any subsequent one, and any movable meter before the first one */
+ const MeterSection* other = &meter_section_at_frame_locked (imaginary, frame);
+ if ((!section->movable() && other->movable()) || (!other->movable() && section->movable() && other->frame() >= frame)) {
+ return false;
+ }
+
+ if (!section->movable()) {
+ /* lock the first tempo to our first meter */
+ if (!set_active_tempos (imaginary, frame)) {
+ return false;
+ }
+ }
+
+ TempoSection* meter_locked_tempo = 0;
+
+ for (Metrics::const_iterator ii = imaginary.begin(); ii != imaginary.end(); ++ii) {
+ TempoSection* t;
+ if ((*ii)->is_tempo()) {
+ t = static_cast<TempoSection*> (*ii);
+ if ((t->locked_to_meter() || !t->movable()) && t->frame() == section->frame()) {
+ meter_locked_tempo = t;
+ break;
+ }
+ }
+ }
+
+ if (!meter_locked_tempo) {
+ return false;
+ }
+
+ MeterSection* prev_m = 0;
+ Metrics future_map;
+ TempoSection* tempo_copy = copy_metrics_and_point (imaginary, future_map, meter_locked_tempo);
+ bool solved = false;
+
+ for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+ MeterSection* m;
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (m == section){
+ if (prev_m && section->movable()) {
+ const double beats = (pulse_at_frame_locked (imaginary, frame) - prev_m->pulse()) * prev_m->note_divisor();
+ if (beats + prev_m->beat() < section->beat()) {
+ /* set the frame/pulse corresponding to its musical position,
+ * as an earlier time than this has been requested.
+ */
+ const double new_pulse = ((section->beat() - prev_m->beat())
+ / prev_m->note_divisor()) + prev_m->pulse();
+
+ const framepos_t smallest_frame = frame_at_pulse_locked (future_map, new_pulse);
+
+ if ((solved = solve_map_frame (future_map, tempo_copy, smallest_frame))) {
+ meter_locked_tempo->set_pulse (new_pulse);
+ solve_map_frame (imaginary, meter_locked_tempo, smallest_frame);
+ section->set_frame (smallest_frame);
+ section->set_pulse (new_pulse);
+ } else {
+ solved = false;
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ if (!solved) {
+ return false;
+ }
+ } else {
+ /* all is ok. set section's locked tempo if allowed.
+ possibly disallowed if there is an adjacent audio-locked tempo.
+ XX this check could possibly go. its never actually happened here.
+ */
+ MeterSection* meter_copy = const_cast<MeterSection*> (&meter_section_at_frame_locked (future_map, section->frame()));
+ meter_copy->set_frame (frame);
+
+ if ((solved = solve_map_frame (future_map, tempo_copy, frame))) {
+ section->set_frame (frame);
+ meter_locked_tempo->set_pulse (((section->beat() - prev_m->beat())
+ / prev_m->note_divisor()) + prev_m->pulse());
+ solve_map_frame (imaginary, meter_locked_tempo, frame);
+ } else {
+ solved = false;
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ if (!solved) {
+ return false;
+ }
+ }
+ } else {
+ /* not movable (first meter atm) */
+
+ tempo_copy->set_frame (frame);
+ tempo_copy->set_pulse (0.0);
+
+ if ((solved = solve_map_frame (future_map, tempo_copy, frame))) {
+ section->set_frame (frame);
+ meter_locked_tempo->set_frame (frame);
+ meter_locked_tempo->set_pulse (0.0);
+ solve_map_frame (imaginary, meter_locked_tempo, frame);
+ } else {
+ solved = false;
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ if (!solved) {
+ return false;
+ }
+
+ pair<double, BBT_Time> b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+ section->set_beat (b_bbt);
+ section->set_pulse (0.0);
+
+ }
+ break;
+ }
+
+ prev_m = m;
+ }
+ }
+
+ MetricSectionFrameSorter fcmp;
+ imaginary.sort (fcmp);
+
+ recompute_meters (imaginary);
+
+ return true;
+}
+
+bool
+TempoMap::solve_map_bbt (Metrics& imaginary, MeterSection* section, const BBT_Time& when)
+{
+ /* disallow setting section to an existing meter's bbt */
+ for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+ MeterSection* m;
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (m != section && m->bbt().bars == when.bars) {
+ return false;
+ }
+ }
+ }
+
+ MeterSection* prev_m = 0;
+ MeterSection* section_prev = 0;
+
+ for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+ MeterSection* m;
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ pair<double, BBT_Time> b_bbt;
+ double new_pulse = 0.0;
+
+ if (prev_m && m->bbt().bars > when.bars && !section_prev){
+ section_prev = prev_m;
+ const double beats = (when.bars - section_prev->bbt().bars) * section_prev->divisions_per_bar();
+ const double pulse = (beats / section_prev->note_divisor()) + section_prev->pulse();
+ pair<double, BBT_Time> b_bbt = make_pair (beats + section_prev->beat(), when);
+
+ section->set_beat (b_bbt);
+ section->set_pulse (pulse);
+ section->set_frame (frame_at_pulse_locked (imaginary, pulse));
+ prev_m = section;
+ continue;
+ }
+
+ if (m->position_lock_style() == AudioTime) {
+ TempoSection* meter_locked_tempo = 0;
+
+ for (Metrics::const_iterator ii = imaginary.begin(); ii != imaginary.end(); ++ii) {
+ TempoSection* t;
+ if ((*ii)->is_tempo()) {
+ t = static_cast<TempoSection*> (*ii);
+ if ((t->locked_to_meter() || !t->movable()) && t->frame() == m->frame()) {
+ meter_locked_tempo = t;
+ break;
+ }
+ }
+ }
+
+ if (!meter_locked_tempo) {
+ return false;
+ }
+
+ if (prev_m) {
+ const double beats = ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar());
+
+ if (beats + prev_m->beat() != m->beat()) {
+ /* tempo/ meter change caused a change in beat (bar). */
+ b_bbt = make_pair (beats + prev_m->beat()
+ , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+ new_pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+ } else if (m->movable()) {
+ b_bbt = make_pair (m->beat(), m->bbt());
+ new_pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+ }
+ } else {
+ b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+ }
+
+ meter_locked_tempo->set_pulse (new_pulse);
+ m->set_beat (b_bbt);
+ m->set_pulse (new_pulse);
+
+ } else {
+ /* MusicTime */
+ const double beats = ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar());
+ if (beats + prev_m->beat() != m->beat()) {
+ /* tempo/ meter change caused a change in beat (bar). */
+ b_bbt = make_pair (beats + prev_m->beat()
+ , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+ } else {
+ b_bbt = make_pair (beats + prev_m->beat()
+ , m->bbt());
+ }
+ new_pulse = (beats / prev_m->note_divisor()) + prev_m->pulse();
+ m->set_beat (b_bbt);
+ m->set_pulse (new_pulse);
+ m->set_frame (frame_at_pulse_locked (imaginary, new_pulse));
+ }
+
+ prev_m = m;
+ }
+ }
+
+ if (!section_prev) {
+
+ const double beats = (when.bars - prev_m->bbt().bars) * prev_m->divisions_per_bar();
+ const double pulse = (beats / prev_m->note_divisor()) + prev_m->pulse();
+ pair<double, BBT_Time> b_bbt = make_pair (beats + prev_m->beat(), when);
+
+ section->set_beat (b_bbt);
+ section->set_pulse (pulse);
+ section->set_frame (frame_at_pulse_locked (imaginary, pulse));
+ }
+
+ MetricSectionSorter cmp;
+ imaginary.sort (cmp);
+
+ recompute_meters (imaginary);
+
+ return true;
+}
+
+/** places a copy of _metrics into copy and returns a pointer
+ * to section's equivalent in copy.
+ */
+TempoSection*
+TempoMap::copy_metrics_and_point (const Metrics& metrics, Metrics& copy, TempoSection* section)
+{
+ TempoSection* ret = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ TempoSection* t;
+ MeterSection* m;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (t == section) {
+ ret = new TempoSection (*t);
+ copy.push_back (ret);
+ continue;
+ }
+
+ TempoSection* cp = new TempoSection (*t);
+ copy.push_back (cp);
+ }
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection *> (*i);
+ MeterSection* cp = new MeterSection (*m);
+ copy.push_back (cp);
+ }
+ }
+
+ return ret;
+}
+
+MeterSection*
+TempoMap::copy_metrics_and_point (const Metrics& metrics, Metrics& copy, MeterSection* section)
+{
+ MeterSection* ret = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ TempoSection* t;
+ MeterSection* m;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ TempoSection* cp = new TempoSection (*t);
+ copy.push_back (cp);
+ }
+
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection *> (*i);
+ if (m == section) {
+ ret = new MeterSection (*m);
+ copy.push_back (ret);
+ continue;
+ }
+ MeterSection* cp = new MeterSection (*m);
+ copy.push_back (cp);
+ }
+ }
+
+ return ret;
+}
+
+/** answers the question "is this a valid beat position for this tempo section?".
+ * it returns true if the tempo section can be moved to the requested bbt position,
+ * leaving the tempo map in a solved state.
+ * @param section the tempo section to be moved
+ * @param bbt the requested new position for the tempo section
+ * @return true if the tempo section can be moved to the position, otherwise false.
+ */
+bool
+TempoMap::can_solve_bbt (TempoSection* ts, const BBT_Time& bbt)
+{
+ Metrics copy;
+ TempoSection* tempo_copy = 0;
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ tempo_copy = copy_metrics_and_point (_metrics, copy, ts);
+ if (!tempo_copy) {
+ return false;
+ }
+ }
+
+ const bool ret = solve_map_pulse (copy, tempo_copy, pulse_at_bbt_locked (copy, bbt));
+
+ Metrics::const_iterator d = copy.begin();
+ while (d != copy.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ return ret;
+}
+
+/**
+* This is for a gui that needs to know the pulse or frame of a tempo section if it were to be moved to some bbt time,
+* taking any possible reordering as a consequence of this into account.
+* @param section - the section to be altered
+* @param bbt - the bbt where the altered tempo will fall
+* @return returns - the position in pulses and frames (as a pair) where the new tempo section will lie.
+*/
+pair<double, framepos_t>
+TempoMap::predict_tempo_position (TempoSection* section, const BBT_Time& bbt)
+{
+ Metrics future_map;
+ pair<double, framepos_t> ret = make_pair (0.0, 0);
+
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, section);
+
+ const double beat = beat_at_bbt_locked (future_map, bbt);
+
+ if (solve_map_pulse (future_map, tempo_copy, pulse_at_beat_locked (future_map, beat))) {
+ ret.first = tempo_copy->pulse();
+ ret.second = tempo_copy->frame();
+ } else {
+ ret.first = section->pulse();
+ ret.second = section->frame();
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+ return ret;
+}
+
+void
+TempoMap::gui_move_tempo (TempoSection* ts, const framepos_t& frame, const int& sub_num)
+{
+ Metrics future_map;
+ bool was_musical = ts->position_lock_style() == MusicTime;
+
+ if (sub_num == 0 && was_musical) {
+ /* if we're not snapping to music,
+ AudioTime and MusicTime may be treated identically.
+ */
+ ts->set_position_lock_style (AudioTime);
+ }
- BBTPointList::const_iterator s = bbt_before_or_at (BBT_Time (1, 1, 0));
- BBTPointList::const_iterator e = bbt_before_or_at (BBT_Time (bbt.bars, bbt.beats, 0));
+ if (ts->position_lock_style() == MusicTime) {
+ {
+ /* if we're snapping to a musical grid, set the pulse exactly instead of via the supplied frame. */
+ Glib::Threads::RWLock::WriterLock lm (lock);
+ TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
+ const double beat = exact_beat_at_frame_locked (future_map, frame, sub_num);
+ double pulse = pulse_at_beat_locked (future_map, beat);
+
+ if (solve_map_pulse (future_map, tempo_copy, pulse)) {
+ solve_map_pulse (_metrics, ts, pulse);
+ recompute_meters (_metrics);
+ }
+ }
- if (bbt.ticks != 0) {
- return ((*e).frame - (*s).frame) +
- llrint ((*e).tempo->frames_per_beat (_frame_rate) * (bbt.ticks/BBT_Time::ticks_per_beat));
} else {
- return ((*e).frame - (*s).frame);
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (lock);
+ TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
+ if (solve_map_frame (future_map, tempo_copy, frame)) {
+ solve_map_frame (_metrics, ts, frame);
+ recompute_meters (_metrics);
+ }
+ }
}
+
+ if (sub_num == 0 && was_musical) {
+ ts->set_position_lock_style (MusicTime);
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ MetricPositionChanged (); // Emit Signal
}
-framecnt_t
-TempoMap::bbt_duration_at (framepos_t pos, const BBT_Time& bbt, int dir)
+void
+TempoMap::gui_move_meter (MeterSection* ms, const framepos_t& frame)
{
- BBT_Time when;
- bbt_time (pos, when);
+ Metrics future_map;
- Glib::Threads::RWLock::ReaderLock lm (lock);
- return bbt_duration_at_unlocked (when, bbt, dir);
+ if (ms->position_lock_style() == AudioTime) {
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (lock);
+ MeterSection* copy = copy_metrics_and_point (_metrics, future_map, ms);
+
+ if (solve_map_frame (future_map, copy, frame)) {
+ solve_map_frame (_metrics, ms, frame);
+ recompute_tempi (_metrics);
+ }
+ }
+ } else {
+ {
+ Glib::Threads::RWLock::WriterLock lm (lock);
+ MeterSection* copy = copy_metrics_and_point (_metrics, future_map, ms);
+
+ const double beat = beat_at_frame_locked (_metrics, frame);
+ const Timecode::BBT_Time bbt = bbt_at_beat_locked (_metrics, beat);
+
+ if (solve_map_bbt (future_map, copy, bbt)) {
+ solve_map_bbt (_metrics, ms, bbt);
+ recompute_tempi (_metrics);
+ }
+ }
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ MetricPositionChanged (); // Emit Signal
}
-framecnt_t
-TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, int /*dir*/)
+bool
+TempoMap::gui_change_tempo (TempoSection* ts, const Tempo& bpm)
{
- if (bbt.bars == 0 && bbt.beats == 0 && bbt.ticks == 0) {
- return 0;
+ Metrics future_map;
+ bool can_solve = false;
+ {
+ Glib::Threads::RWLock::WriterLock lm (lock);
+ TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
+ tempo_copy->set_beats_per_minute (bpm.beats_per_minute());
+ recompute_tempi (future_map);
+
+ if (check_solved (future_map)) {
+ ts->set_beats_per_minute (bpm.beats_per_minute());
+ recompute_map (_metrics);
+ can_solve = true;
+ }
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+ if (can_solve) {
+ MetricPositionChanged (); // Emit Signal
}
+ return can_solve;
+}
+
+void
+TempoMap::gui_dilate_tempo (TempoSection* ts, const framepos_t& frame, const framepos_t& end_frame, const double& pulse)
+{
+ /*
+ Ts (future prev_t) Tnext
+ | |
+ | [drag^] |
+ |----------|----------
+ e_f pulse(frame)
+ */
+
+ Metrics future_map;
+
+ {
+ Glib::Threads::RWLock::WriterLock lm (lock);
+
+ if (!ts) {
+ return;
+ }
+
+ TempoSection* prev_t = copy_metrics_and_point (_metrics, future_map, ts);
+ TempoSection* prev_to_prev_t = 0;
+ const frameoffset_t fr_off = end_frame - frame;
+
+ if (prev_t && prev_t->pulse() > 0.0) {
+ prev_to_prev_t = const_cast<TempoSection*>(&tempo_section_at_frame_locked (future_map, prev_t->frame() - 1));
+ }
+
+ TempoSection* next_t = 0;
+ for (Metrics::iterator i = future_map.begin(); i != future_map.end(); ++i) {
+ TempoSection* t = 0;
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (t->frame() > ts->frame()) {
+ next_t = t;
+ break;
+ }
+ }
+ }
+ /* minimum allowed measurement distance in frames */
+ const framepos_t min_dframe = 2;
+
+ /* the change in frames is the result of changing the slope of at most 2 previous tempo sections.
+ constant to constant is straightforward, as the tempo prev to prev_t has constant slope.
+ */
+ double contribution = 0.0;
+
+ if (next_t && prev_to_prev_t && prev_to_prev_t->type() == TempoSection::Ramp) {
+ contribution = (prev_t->frame() - prev_to_prev_t->frame()) / (double) (next_t->frame() - prev_to_prev_t->frame());
+ }
+
+ const frameoffset_t prev_t_frame_contribution = fr_off - (contribution * (double) fr_off);
+
+ const double start_pulse = prev_t->pulse_at_frame (frame, _frame_rate);
+ const double end_pulse = prev_t->pulse_at_frame (end_frame, _frame_rate);
+
+ double new_bpm;
+
+ if (prev_t->type() == TempoSection::Constant || prev_t->c_func() == 0.0) {
+
+ if (prev_t->position_lock_style() == MusicTime) {
+ if (prev_to_prev_t && prev_to_prev_t->type() == TempoSection::Ramp) {
+ if (frame > prev_to_prev_t->frame() + min_dframe && (frame + prev_t_frame_contribution) > prev_to_prev_t->frame() + min_dframe) {
+
+ new_bpm = prev_t->beats_per_minute() * ((frame - prev_to_prev_t->frame())
+ / (double) ((frame + prev_t_frame_contribution) - prev_to_prev_t->frame()));
+ } else {
+ new_bpm = prev_t->beats_per_minute();
+ }
+ } else {
+ /* prev to prev is irrelevant */
+
+ if (start_pulse > prev_t->pulse() && end_pulse > prev_t->pulse()) {
+ new_bpm = prev_t->beats_per_minute() * ((start_pulse - prev_t->pulse()) / (end_pulse - prev_t->pulse()));
+ } else {
+ new_bpm = prev_t->beats_per_minute();
+ }
+ }
+ } else {
+ /* AudioTime */
+ if (prev_to_prev_t && prev_to_prev_t->type() == TempoSection::Ramp) {
+ if (frame > prev_to_prev_t->frame() + min_dframe && end_frame > prev_to_prev_t->frame() + min_dframe) {
+
+ new_bpm = prev_t->beats_per_minute() * ((frame - prev_to_prev_t->frame())
+ / (double) ((end_frame) - prev_to_prev_t->frame()));
+ } else {
+ new_bpm = prev_t->beats_per_minute();
+ }
+ } else {
+ /* prev_to_prev_t is irrelevant */
+
+ if (frame > prev_t->frame() + min_dframe && end_frame > prev_t->frame() + min_dframe) {
+ new_bpm = prev_t->beats_per_minute() * ((frame - prev_t->frame()) / (double) (end_frame - prev_t->frame()));
+ } else {
+ new_bpm = prev_t->beats_per_minute();
+ }
+ }
+ }
+ } else {
- /* round back to the previous precise beat */
- BBTPointList::const_iterator wi = bbt_before_or_at (BBT_Time (when.bars, when.beats, 0));
- BBTPointList::const_iterator start (wi);
+ double frame_ratio = 1.0;
+ double pulse_ratio = 1.0;
+ const framepos_t pulse_pos = prev_t->frame_at_pulse (pulse, _frame_rate);
- assert (wi != _map.end());
+ if (prev_to_prev_t) {
+ if (pulse_pos > prev_to_prev_t->frame() + min_dframe && (pulse_pos - fr_off) > prev_to_prev_t->frame() + min_dframe) {
+ frame_ratio = (((pulse_pos - fr_off) - prev_to_prev_t->frame()) / (double) ((pulse_pos) - prev_to_prev_t->frame()));
+ }
+ if (end_pulse > prev_to_prev_t->pulse() && start_pulse > prev_to_prev_t->pulse()) {
+ pulse_ratio = ((start_pulse - prev_to_prev_t->pulse()) / (end_pulse - prev_to_prev_t->pulse()));
+ }
+ } else {
+ if (pulse_pos > prev_t->frame() + min_dframe && (pulse_pos - fr_off) > prev_t->frame() + min_dframe) {
+ frame_ratio = (((pulse_pos - fr_off) - prev_t->frame()) / (double) ((pulse_pos) - prev_t->frame()));
+ }
+ pulse_ratio = (start_pulse / end_pulse);
+ }
+ new_bpm = prev_t->beats_per_minute() * (pulse_ratio * frame_ratio);
+ }
- uint32_t bars = 0;
- uint32_t beats = 0;
+ /* don't clamp and proceed here.
+ testing has revealed that this can go negative,
+ which is an entirely different thing to just being too low.
+ */
+ if (new_bpm < 0.5) {
+ return;
+ }
+ new_bpm = min (new_bpm, (double) 1000.0);
+ prev_t->set_beats_per_minute (new_bpm);
+ recompute_tempi (future_map);
+ recompute_meters (future_map);
- while (wi != _map.end() && bars < bbt.bars) {
- ++wi;
- if ((*wi).is_bar()) {
- ++bars;
+ if (check_solved (future_map)) {
+ ts->set_beats_per_minute (new_bpm);
+ recompute_tempi (_metrics);
+ recompute_meters (_metrics);
}
}
- assert (wi != _map.end());
- while (wi != _map.end() && beats < bbt.beats) {
- ++wi;
- ++beats;
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
}
- assert (wi != _map.end());
- /* add any additional frames related to ticks in the added value */
+ MetricPositionChanged (); // Emit Signal
+}
- if (bbt.ticks != 0) {
- return ((*wi).frame - (*start).frame) +
- (*wi).tempo->frames_per_beat (_frame_rate) * (bbt.ticks/BBT_Time::ticks_per_beat);
- } else {
- return ((*wi).frame - (*start).frame);
+double
+TempoMap::exact_beat_at_frame (const framepos_t& frame, const int32_t sub_num)
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ return exact_beat_at_frame_locked (_metrics, frame, sub_num);
+}
+
+double
+TempoMap::exact_beat_at_frame_locked (const Metrics& metrics, const framepos_t& frame, const int32_t sub_num)
+{
+ double beat = beat_at_frame_locked (metrics, frame);
+ if (sub_num > 1) {
+ beat = floor (beat) + (floor (((beat - floor (beat)) * (double) sub_num) + 0.5) / sub_num);
+ } else if (sub_num == 1) {
+ /* snap to beat */
+ beat = floor (beat + 0.5);
+ } else if (sub_num == -1) {
+ /* snap to bar */
+ Timecode::BBT_Time bbt = bbt_at_beat_locked (metrics, beat);
+ bbt.beats = 1;
+ bbt.ticks = 0;
+ beat = beat_at_bbt_locked (metrics, bbt);
}
+ return beat;
+}
+
+framecnt_t
+TempoMap::bbt_duration_at (framepos_t pos, const BBT_Time& bbt, int dir)
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ const double tick_at_time = beat_at_frame_locked (_metrics, pos) * BBT_Time::ticks_per_beat;
+ const double bbt_ticks = bbt.ticks + (bbt.beats * BBT_Time::ticks_per_beat);
+ const double total_beats = (tick_at_time + bbt_ticks) / BBT_Time::ticks_per_beat;
+
+ return frame_at_beat_locked (_metrics, total_beats);
}
framepos_t
@@ -1306,52 +3031,39 @@ TempoMap::round_to_beat (framepos_t fr, RoundMode dir)
framepos_t
TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir)
{
- require_map_to (fr);
-
Glib::Threads::RWLock::ReaderLock lm (lock);
- BBTPointList::const_iterator i = bbt_before_or_at (fr);
- BBT_Time the_beat;
- uint32_t ticks_one_subdivisions_worth;
-
- bbt_time (fr, the_beat, i);
-
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("round %1 to nearest 1/%2 beat, before-or-at = %3 @ %4|%5 precise = %6\n",
- fr, sub_num, (*i).frame, (*i).bar, (*i).beat, the_beat));
+ uint32_t ticks = (uint32_t) floor (beat_at_frame_locked (_metrics, fr) * BBT_Time::ticks_per_beat);
+ uint32_t beats = (uint32_t) floor (ticks / BBT_Time::ticks_per_beat);
+ uint32_t ticks_one_subdivisions_worth = (uint32_t) BBT_Time::ticks_per_beat / sub_num;
- ticks_one_subdivisions_worth = (uint32_t)BBT_Time::ticks_per_beat / sub_num;
+ ticks -= beats * BBT_Time::ticks_per_beat;
if (dir > 0) {
-
/* round to next (or same iff dir == RoundUpMaybe) */
- uint32_t mod = the_beat.ticks % ticks_one_subdivisions_worth;
+ uint32_t mod = ticks % ticks_one_subdivisions_worth;
if (mod == 0 && dir == RoundUpMaybe) {
/* right on the subdivision, which is fine, so do nothing */
} else if (mod == 0) {
/* right on the subdivision, so the difference is just the subdivision ticks */
- the_beat.ticks += ticks_one_subdivisions_worth;
+ ticks += ticks_one_subdivisions_worth;
} else {
/* not on subdivision, compute distance to next subdivision */
- the_beat.ticks += ticks_one_subdivisions_worth - mod;
+ ticks += ticks_one_subdivisions_worth - mod;
}
- if (the_beat.ticks > BBT_Time::ticks_per_beat) {
- assert (i != _map.end());
- ++i;
- assert (i != _map.end());
- the_beat.ticks -= BBT_Time::ticks_per_beat;
+ if (ticks >= BBT_Time::ticks_per_beat) {
+ ticks -= BBT_Time::ticks_per_beat;
}
-
-
} else if (dir < 0) {
/* round to previous (or same iff dir == RoundDownMaybe) */
- uint32_t difference = the_beat.ticks % ticks_one_subdivisions_worth;
+ uint32_t difference = ticks % ticks_one_subdivisions_worth;
if (difference == 0 && dir == RoundDownAlways) {
/* right on the subdivision, but force-rounding down,
@@ -1359,245 +3071,161 @@ TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir)
difference = ticks_one_subdivisions_worth;
}
- if (the_beat.ticks < difference) {
- if (i == _map.begin()) {
- /* can't go backwards from wherever pos is, so just return it */
- return fr;
- }
- --i;
- the_beat.ticks = BBT_Time::ticks_per_beat - the_beat.ticks;
+ if (ticks < difference) {
+ ticks = BBT_Time::ticks_per_beat - ticks;
} else {
- the_beat.ticks -= difference;
+ ticks -= difference;
}
} else {
/* round to nearest */
-
double rem;
/* compute the distance to the previous and next subdivision */
- if ((rem = fmod ((double) the_beat.ticks, (double) ticks_one_subdivisions_worth)) > ticks_one_subdivisions_worth/2.0) {
+ if ((rem = fmod ((double) ticks, (double) ticks_one_subdivisions_worth)) > ticks_one_subdivisions_worth/2.0) {
/* closer to the next subdivision, so shift forward */
- the_beat.ticks = lrint (the_beat.ticks + (ticks_one_subdivisions_worth - rem));
+ ticks = lrint (ticks + (ticks_one_subdivisions_worth - rem));
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved forward to %1\n", the_beat.ticks));
+ DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved forward to %1\n", ticks));
- if (the_beat.ticks > BBT_Time::ticks_per_beat) {
- assert (i != _map.end());
- ++i;
- assert (i != _map.end());
- the_beat.ticks -= BBT_Time::ticks_per_beat;
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("fold beat to %1\n", the_beat));
+ if (ticks > BBT_Time::ticks_per_beat) {
+ ++beats;
+ ticks -= BBT_Time::ticks_per_beat;
+ DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("fold beat to %1\n", beats));
}
} else if (rem > 0) {
/* closer to previous subdivision, so shift backward */
- if (rem > the_beat.ticks) {
- if (i == _map.begin()) {
+ if (rem > ticks) {
+ if (beats == 0) {
/* can't go backwards past zero, so ... */
return 0;
}
/* step back to previous beat */
- --i;
- the_beat.ticks = lrint (BBT_Time::ticks_per_beat - rem);
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("step back beat to %1\n", the_beat));
+ --beats;
+ ticks = lrint (BBT_Time::ticks_per_beat - rem);
+ DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("step back beat to %1\n", beats));
} else {
- the_beat.ticks = lrint (the_beat.ticks - rem);
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved backward to %1\n", the_beat.ticks));
+ ticks = lrint (ticks - rem);
+ DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved backward to %1\n", ticks));
}
} else {
/* on the subdivision, do nothing */
}
}
- return (*i).frame + (the_beat.ticks/BBT_Time::ticks_per_beat) *
- (*i).tempo->frames_per_beat (_frame_rate);
+ const framepos_t ret_frame = frame_at_beat_locked (_metrics, beats + (ticks / BBT_Time::ticks_per_beat));
+
+ return ret_frame;
}
framepos_t
TempoMap::round_to_type (framepos_t frame, RoundMode dir, BBTPointType type)
{
- require_map_to (frame);
-
Glib::Threads::RWLock::ReaderLock lm (lock);
- BBTPointList::const_iterator fi;
-
- if (dir > 0) {
- fi = bbt_after_or_at (frame);
- } else {
- fi = bbt_before_or_at (frame);
- }
-
- assert (fi != _map.end());
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("round from %1 (%3|%4 @ %5) to %6 in direction %2\n", frame, dir, (*fi).bar, (*fi).beat, (*fi).frame,
- (type == Bar ? "bar" : "beat")));
+ const double beat_at_framepos = beat_at_frame_locked (_metrics, frame);
+ BBT_Time bbt (bbt_at_beat_locked (_metrics, beat_at_framepos));
switch (type) {
case Bar:
if (dir < 0) {
/* find bar previous to 'frame' */
-
- if (fi == _map.begin()) {
- return 0;
- }
-
- if ((*fi).is_bar() && (*fi).frame == frame) {
- if (dir == RoundDownMaybe) {
- return frame;
- }
- --fi;
- }
-
- while (!(*fi).is_bar()) {
- if (fi == _map.begin()) {
- break;
- }
- fi--;
- }
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to bar: map iter at %1|%2 %3, return\n",
- (*fi).bar, (*fi).beat, (*fi).frame));
- return (*fi).frame;
+ bbt.beats = 1;
+ bbt.ticks = 0;
+ return frame_at_bbt_locked (_metrics, bbt);
} else if (dir > 0) {
-
/* find bar following 'frame' */
-
- if ((*fi).is_bar() && (*fi).frame == frame) {
- if (dir == RoundUpMaybe) {
- return frame;
- }
- ++fi;
- }
-
- while (!(*fi).is_bar()) {
- fi++;
- if (fi == _map.end()) {
- --fi;
- break;
- }
- }
-
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to bar: map iter at %1|%2 %3, return\n",
- (*fi).bar, (*fi).beat, (*fi).frame));
- return (*fi).frame;
-
+ ++bbt.bars;
+ bbt.beats = 1;
+ bbt.ticks = 0;
+ return frame_at_bbt_locked (_metrics, bbt);
} else {
-
/* true rounding: find nearest bar */
-
- BBTPointList::const_iterator prev = fi;
- BBTPointList::const_iterator next = fi;
-
- if ((*fi).frame == frame) {
- return frame;
- }
-
- while ((*prev).beat != 1) {
- if (prev == _map.begin()) {
- break;
- }
- prev--;
- }
-
- while ((next != _map.end()) && (*next).beat != 1) {
- next++;
- }
-
- if ((next == _map.end()) || (frame - (*prev).frame) < ((*next).frame - frame)) {
- return (*prev).frame;
+ framepos_t raw_ft = frame_at_bbt_locked (_metrics, bbt);
+ bbt.beats = 1;
+ bbt.ticks = 0;
+ framepos_t prev_ft = frame_at_bbt_locked (_metrics, bbt);
+ ++bbt.bars;
+ framepos_t next_ft = frame_at_bbt_locked (_metrics, bbt);
+
+ if ((raw_ft - prev_ft) > (next_ft - prev_ft) / 2) {
+ return next_ft;
} else {
- return (*next).frame;
+ return prev_ft;
}
-
}
break;
case Beat:
if (dir < 0) {
-
- if (fi == _map.begin()) {
- return 0;
- }
-
- if ((*fi).frame > frame || ((*fi).frame == frame && dir == RoundDownAlways)) {
- DEBUG_TRACE (DEBUG::SnapBBT, "requested frame is on beat, step back\n");
- --fi;
- }
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to beat: map iter at %1|%2 %3, return\n",
- (*fi).bar, (*fi).beat, (*fi).frame));
- return (*fi).frame;
+ return frame_at_beat_locked (_metrics, floor (beat_at_framepos));
} else if (dir > 0) {
- if ((*fi).frame < frame || ((*fi).frame == frame && dir == RoundUpAlways)) {
- DEBUG_TRACE (DEBUG::SnapBBT, "requested frame is on beat, step forward\n");
- ++fi;
- }
- DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to beat: map iter at %1|%2 %3, return\n",
- (*fi).bar, (*fi).beat, (*fi).frame));
- return (*fi).frame;
+ return frame_at_beat_locked (_metrics, ceil (beat_at_framepos));
} else {
- /* find beat nearest to frame */
- if ((*fi).frame == frame) {
- return frame;
- }
-
- BBTPointList::const_iterator prev = fi;
- BBTPointList::const_iterator next = fi;
-
- /* fi is already the beat before_or_at frame, and
- we've just established that its not at frame, so its
- the beat before frame.
- */
- ++next;
-
- if ((next == _map.end()) || (frame - (*prev).frame) < ((*next).frame - frame)) {
- return (*prev).frame;
- } else {
- return (*next).frame;
- }
+ return frame_at_beat_locked (_metrics, floor (beat_at_framepos + 0.5));
}
break;
}
- abort(); /* NOTREACHED */
return 0;
}
void
-TempoMap::get_grid (TempoMap::BBTPointList::const_iterator& begin,
- TempoMap::BBTPointList::const_iterator& end,
+TempoMap::get_grid (vector<TempoMap::BBTPoint>& points,
framepos_t lower, framepos_t upper)
{
- {
- Glib::Threads::RWLock::WriterLock lm (lock);
- if (_map.empty() || (_map.back().frame < upper)) {
- recompute_map (false, upper);
- }
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ int32_t cnt = ceil (beat_at_frame_locked (_metrics, lower));
+ framecnt_t pos = 0;
+ /* although the map handles negative beats, bbt doesn't. */
+ if (cnt < 0.0) {
+ cnt = 0.0;
+ }
+
+ if (frame_at_beat_locked (_metrics, cnt) >= upper) {
+ return;
}
- begin = lower_bound (_map.begin(), _map.end(), lower);
- end = upper_bound (_map.begin(), _map.end(), upper);
+ while (pos < upper) {
+ pos = frame_at_beat_locked (_metrics, cnt);
+ const TempoSection tempo = tempo_section_at_frame_locked (_metrics, pos);
+ const MeterSection meter = meter_section_at_frame_locked (_metrics, pos);
+ const BBT_Time bbt = bbt_at_beat_locked (_metrics, cnt);
+ points.push_back (BBTPoint (meter, tempo_at_frame_locked (_metrics, pos), pos, bbt.bars, bbt.beats, tempo.c_func()));
+ ++cnt;
+ }
}
const TempoSection&
-TempoMap::tempo_section_at (framepos_t frame) const
+TempoMap::tempo_section_at_frame (framepos_t frame) const
{
Glib::Threads::RWLock::ReaderLock lm (lock);
- Metrics::const_iterator i;
+ return tempo_section_at_frame_locked (_metrics, frame);
+}
+
+const TempoSection&
+TempoMap::tempo_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const
+{
TempoSection* prev = 0;
- for (i = metrics.begin(); i != metrics.end(); ++i) {
- TempoSection* t;
+ TempoSection* t;
- if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
- if ((*i)->frame() > frame) {
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if (prev && t->frame() > frame) {
break;
}
@@ -1613,48 +3241,194 @@ TempoMap::tempo_section_at (framepos_t frame) const
return *prev;
}
-const Tempo&
-TempoMap::tempo_at (framepos_t frame) const
+const TempoSection&
+TempoMap::tempo_section_at_beat_locked (const Metrics& metrics, const double& beat) const
{
- TempoMetric m (metric_at (frame));
- return m.tempo();
+ TempoSection* prev_t = 0;
+ const MeterSection* prev_m = &meter_section_at_beat_locked (metrics, beat);
+
+ TempoSection* t;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (prev_t && ((t->pulse() - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat() > beat) {
+ break;
+ }
+ prev_t = t;
+ }
+
+ }
+ return *prev_t;
}
-const MeterSection&
-TempoMap::meter_section_at (framepos_t frame) const
+/* don't use this to calculate length (the tempo is only correct for this frame).
+ do that stuff based on the beat_at_frame and frame_at_beat api
+*/
+double
+TempoMap::frames_per_beat_at (const framepos_t& frame, const framecnt_t& sr) const
{
Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ const TempoSection* ts_at = 0;
+ const TempoSection* ts_after = 0;
+ Metrics::const_iterator i;
+ TempoSection* t;
+
+ for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+
+ if ((*i)->is_tempo()) {
+ t = static_cast<TempoSection*> (*i);
+ if (!t->active()) {
+ continue;
+ }
+ if (ts_at && (*i)->frame() > frame) {
+ ts_after = t;
+ break;
+ }
+ ts_at = t;
+ }
+ }
+
+ if (ts_after) {
+ return (60.0 * _frame_rate) / (ts_at->tempo_at_frame (frame, _frame_rate) * ts_at->note_type());
+ }
+ /* must be treated as constant tempo */
+ return ts_at->frames_per_beat (_frame_rate);
+}
+
+const MeterSection&
+TempoMap::meter_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const
+{
Metrics::const_iterator i;
MeterSection* prev = 0;
+ MeterSection* m;
+
for (i = metrics.begin(); i != metrics.end(); ++i) {
- MeterSection* t;
- if ((t = dynamic_cast<MeterSection*> (*i)) != 0) {
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
- if ((*i)->frame() > frame) {
+ if (prev && (*i)->frame() > frame) {
break;
}
- prev = t;
+ prev = m;
+ }
+ }
+
+ if (prev == 0) {
+ fatal << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+
+ return *prev;
+}
+
+
+const MeterSection&
+TempoMap::meter_section_at_frame (framepos_t frame) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return meter_section_at_frame_locked (_metrics, frame);
+}
+
+const MeterSection&
+TempoMap::meter_section_at_beat_locked (const Metrics& metrics, const double& beat) const
+{
+ MeterSection* prev_m = 0;
+
+ for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ MeterSection* m;
+ if (!(*i)->is_tempo()) {
+ m = static_cast<MeterSection*> (*i);
+ if (prev_m && m->beat() > beat) {
+ break;
+ }
+ prev_m = m;
}
- }
- if (prev == 0) {
- fatal << endmsg;
- abort(); /*NOTREACHED*/
}
+ return *prev_m;
+}
- return *prev;
+const MeterSection&
+TempoMap::meter_section_at_beat (double beat) const
+{
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+ return meter_section_at_beat_locked (_metrics, beat);
}
const Meter&
-TempoMap::meter_at (framepos_t frame) const
+TempoMap::meter_at_frame (framepos_t frame) const
{
TempoMetric m (metric_at (frame));
return m.meter();
}
+void
+TempoMap::fix_legacy_session ()
+{
+ MeterSection* prev_m = 0;
+ TempoSection* prev_t = 0;
+
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ MeterSection* m;
+ TempoSection* t;
+
+ if ((m = dynamic_cast<MeterSection*>(*i)) != 0) {
+ if (!m->movable()) {
+ pair<double, BBT_Time> bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+ m->set_beat (bbt);
+ m->set_pulse (0.0);
+ m->set_frame (0);
+ m->set_position_lock_style (AudioTime);
+ prev_m = m;
+ continue;
+ }
+ if (prev_m) {
+ pair<double, BBT_Time> start = make_pair (((m->bbt().bars - 1) * prev_m->note_divisor())
+ + (m->bbt().beats - 1)
+ + (m->bbt().ticks / BBT_Time::ticks_per_beat)
+ , m->bbt());
+ m->set_beat (start);
+ const double start_beat = ((m->bbt().bars - 1) * prev_m->note_divisor())
+ + (m->bbt().beats - 1)
+ + (m->bbt().ticks / BBT_Time::ticks_per_beat);
+ m->set_pulse (start_beat / prev_m->note_divisor());
+ }
+ prev_m = m;
+ } else if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+
+ if (!t->active()) {
+ continue;
+ }
+
+ if (!t->movable()) {
+ t->set_pulse (0.0);
+ t->set_frame (0);
+ t->set_position_lock_style (AudioTime);
+ prev_t = t;
+ continue;
+ }
+
+ if (prev_t) {
+ const double beat = ((t->legacy_bbt().bars - 1) * ((prev_m) ? prev_m->note_divisor() : 4.0))
+ + (t->legacy_bbt().beats - 1)
+ + (t->legacy_bbt().ticks / BBT_Time::ticks_per_beat);
+ if (prev_m) {
+ t->set_pulse (beat / prev_m->note_divisor());
+ } else {
+ /* really shouldn't happen but.. */
+ t->set_pulse (beat / 4.0);
+ }
+ }
+ prev_t = t;
+ }
+ }
+}
+
XMLNode&
TempoMap::get_state ()
{
@@ -1663,7 +3437,7 @@ TempoMap::get_state ()
{
Glib::Threads::RWLock::ReaderLock lm (lock);
- for (i = metrics.begin(); i != metrics.end(); ++i) {
+ for (i = _metrics.begin(); i != _metrics.end(); ++i) {
root->add_child_nocopy ((*i)->get_state());
}
}
@@ -1679,9 +3453,8 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
XMLNodeList nlist;
XMLNodeConstIterator niter;
- Metrics old_metrics (metrics);
- MeterSection* last_meter = 0;
- metrics.clear();
+ Metrics old_metrics (_metrics);
+ _metrics.clear();
nlist = node.children();
@@ -1692,18 +3465,13 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
try {
TempoSection* ts = new TempoSection (*child);
- metrics.push_back (ts);
-
- if (ts->bar_offset() < 0.0) {
- if (last_meter) {
- ts->update_bar_offset_from_bbt (*last_meter);
- }
- }
+ _metrics.push_back (ts);
}
catch (failed_constructor& err){
error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
- metrics = old_metrics;
+ _metrics = old_metrics;
+ old_metrics.clear();
break;
}
@@ -1711,13 +3479,13 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
try {
MeterSection* ms = new MeterSection (*child);
- metrics.push_back (ms);
- last_meter = ms;
+ _metrics.push_back (ms);
}
catch (failed_constructor& err) {
error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
- metrics = old_metrics;
+ _metrics = old_metrics;
+ old_metrics.clear();
break;
}
}
@@ -1725,26 +3493,42 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
if (niter == nlist.end()) {
MetricSectionSorter cmp;
- metrics.sort (cmp);
+ _metrics.sort (cmp);
+ }
+
+ /* check for legacy sessions where bbt was the base musical unit for tempo */
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ TempoSection* t;
+ if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+ if (t->legacy_bbt().bars != 0) {
+ fix_legacy_session();
+ break;
+ }
+ break;
+ }
}
/* check for multiple tempo/meters at the same location, which
ardour2 somehow allowed.
*/
- Metrics::iterator prev = metrics.end();
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
- if (prev != metrics.end()) {
- if (dynamic_cast<MeterSection*>(*prev) && dynamic_cast<MeterSection*>(*i)) {
- if ((*prev)->start() == (*i)->start()) {
- cerr << string_compose (_("Multiple meter definitions found at %1"), (*prev)->start()) << endmsg;
- error << string_compose (_("Multiple meter definitions found at %1"), (*prev)->start()) << endmsg;
+ Metrics::iterator prev = _metrics.end();
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ if (prev != _metrics.end()) {
+ MeterSection* ms;
+ MeterSection* prev_m;
+ TempoSection* ts;
+ TempoSection* prev_t;
+ if ((prev_m = dynamic_cast<MeterSection*>(*prev)) != 0 && (ms = dynamic_cast<MeterSection*>(*i)) != 0) {
+ if (prev_m->pulse() == ms->pulse()) {
+ cerr << string_compose (_("Multiple meter definitions found at %1"), prev_m->pulse()) << endmsg;
+ error << string_compose (_("Multiple meter definitions found at %1"), prev_m->pulse()) << endmsg;
return -1;
}
- } else if (dynamic_cast<TempoSection*>(*prev) && dynamic_cast<TempoSection*>(*i)) {
- if ((*prev)->start() == (*i)->start()) {
- cerr << string_compose (_("Multiple tempo definitions found at %1"), (*prev)->start()) << endmsg;
- error << string_compose (_("Multiple tempo definitions found at %1"), (*prev)->start()) << endmsg;
+ } else if ((prev_t = dynamic_cast<TempoSection*>(*prev)) != 0 && (ts = dynamic_cast<TempoSection*>(*i)) != 0) {
+ if (prev_t->pulse() == ts->pulse()) {
+ cerr << string_compose (_("Multiple tempo definitions found at %1"), prev_t->pulse()) << endmsg;
+ error << string_compose (_("Multiple tempo definitions found at %1"), prev_t->pulse()) << endmsg;
return -1;
}
}
@@ -1752,7 +3536,14 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
prev = i;
}
- recompute_map (true, -1);
+ recompute_map (_metrics);
+
+ Metrics::const_iterator d = old_metrics.begin();
+ while (d != old_metrics.end()) {
+ delete (*d);
+ ++d;
+ }
+ old_metrics.clear ();
}
PropertyChanged (PropertyChange ());
@@ -1761,22 +3552,30 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
}
void
-TempoMap::dump (std::ostream& o) const
+TempoMap::dump (const Metrics& metrics, std::ostream& o) const
{
Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK);
const MeterSection* m;
const TempoSection* t;
+ const TempoSection* prev_t = 0;
for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
- o << "Tempo @ " << *i << " (Bar-offset: " << t->bar_offset() << ") " << t->beats_per_minute() << " BPM (pulse = 1/" << t->note_type() << ") at " << t->start() << " frame= " << t->frame() << " (movable? "
- << t->movable() << ')' << endl;
+ o << "Tempo @ " << *i << t->beats_per_minute() << " BPM (pulse = 1/" << t->note_type() << ") at " << t->pulse() << " frame= " << t->frame() << " (movable? "
+ << t->movable() << ')' << " pos lock: " << enum_2_string (t->position_lock_style()) << std::endl;
+ o << "current : " << t->beats_per_minute() << " | " << t->pulse() << " | " << t->frame() << std::endl;
+ if (prev_t) {
+ o << "previous : " << prev_t->beats_per_minute() << " | " << prev_t->pulse() << " | " << prev_t->frame() << std::endl;
+ o << "calculated : " << prev_t->tempo_at_pulse (t->pulse()) * prev_t->note_type() << " | " << prev_t->pulse_at_tempo (t->pulses_per_minute(), t->frame(), _frame_rate) << " | " << prev_t->frame_at_tempo (t->pulses_per_minute(), t->pulse(), _frame_rate) << std::endl;
+ }
+ prev_t = t;
} else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
- o << "Meter @ " << *i << ' ' << m->divisions_per_bar() << '/' << m->note_divisor() << " at " << m->start() << " frame= " << m->frame()
- << " (movable? " << m->movable() << ')' << endl;
+ o << "Meter @ " << *i << ' ' << m->divisions_per_bar() << '/' << m->note_divisor() << " at " << m->bbt() << " frame= " << m->frame()
+ << " pulse: " << m->pulse() << " beat : " << m->beat() << " pos lock: " << enum_2_string (m->position_lock_style()) << " (movable? " << m->movable() << ')' << endl;
}
}
+ o << "------" << std::endl;
}
int
@@ -1785,8 +3584,8 @@ TempoMap::n_tempos() const
Glib::Threads::RWLock::ReaderLock lm (lock);
int cnt = 0;
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
- if (dynamic_cast<const TempoSection*>(*i) != 0) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ if ((*i)->is_tempo()) {
cnt++;
}
}
@@ -1800,8 +3599,8 @@ TempoMap::n_meters() const
Glib::Threads::RWLock::ReaderLock lm (lock);
int cnt = 0;
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
- if (dynamic_cast<const MeterSection*>(*i) != 0) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
cnt++;
}
}
@@ -1814,7 +3613,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount)
{
{
Glib::Threads::RWLock::WriterLock lm (lock);
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((*i)->frame() >= where && (*i)->movable ()) {
(*i)->set_frame ((*i)->frame() + amount);
}
@@ -1842,52 +3641,85 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount)
bool first = true;
MetricSection* prev = 0;
- for (i = metrics.begin(); i != metrics.end(); ++i) {
+ for (i = _metrics.begin(); i != _metrics.end(); ++i) {
BBT_Time bbt;
- TempoMetric metric (*meter, *tempo);
-
+ //TempoMetric metric (*meter, *tempo);
+ MeterSection* ms = const_cast<MeterSection*>(meter);
+ TempoSection* ts = const_cast<TempoSection*>(tempo);
if (prev) {
- metric.set_start (prev->start());
- metric.set_frame (prev->frame());
+ if (ts){
+ if ((t = dynamic_cast<TempoSection*>(prev)) != 0) {
+ if (!t->active()) {
+ continue;
+ }
+ ts->set_pulse (t->pulse());
+ }
+ if ((m = dynamic_cast<MeterSection*>(prev)) != 0) {
+ ts->set_pulse (m->pulse());
+ }
+ ts->set_frame (prev->frame());
+
+ }
+ if (ms) {
+ if ((m = dynamic_cast<MeterSection*>(prev)) != 0) {
+ pair<double, BBT_Time> start = make_pair (m->beat(), m->bbt());
+ ms->set_beat (start);
+ ms->set_pulse (m->pulse());
+ }
+ if ((t = dynamic_cast<TempoSection*>(prev)) != 0) {
+ if (!t->active()) {
+ continue;
+ }
+ const double beat = beat_at_pulse_locked (_metrics, t->pulse());
+ pair<double, BBT_Time> start = make_pair (beat, bbt_at_beat_locked (_metrics, beat));
+ ms->set_beat (start);
+ ms->set_pulse (t->pulse());
+ }
+ ms->set_frame (prev->frame());
+ }
+
} else {
// metric will be at frames=0 bbt=1|1|0 by default
// which is correct for our purpose
}
- BBTPointList::const_iterator bi = bbt_before_or_at ((*i)->frame());
- bbt_time ((*i)->frame(), bbt, bi);
-
- // cerr << "timestamp @ " << (*i)->frame() << " with " << bbt.bars << "|" << bbt.beats << "|" << bbt.ticks << " => ";
-
- if (first) {
- first = false;
- } else {
+ // cerr << bbt << endl;
- if (bbt.ticks > BBT_Time::ticks_per_beat/2) {
- /* round up to next beat */
- bbt.beats += 1;
+ if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+ if (!t->active()) {
+ continue;
}
+ t->set_pulse (pulse_at_frame_locked (_metrics, m->frame()));
+ tempo = t;
+ // cerr << "NEW TEMPO, frame = " << (*i)->frame() << " beat = " << (*i)->pulse() <<endl;
+ } else if ((m = dynamic_cast<MeterSection*>(*i)) != 0) {
+ bbt = bbt_at_frame_locked (_metrics, m->frame());
- bbt.ticks = 0;
+ // cerr << "timestamp @ " << (*i)->frame() << " with " << bbt.bars << "|" << bbt.beats << "|" << bbt.ticks << " => ";
- if (bbt.beats != 1) {
- /* round up to next bar */
- bbt.bars += 1;
- bbt.beats = 1;
- }
- }
+ if (first) {
+ first = false;
+ } else {
- // cerr << bbt << endl;
+ if (bbt.ticks > BBT_Time::ticks_per_beat/2) {
+ /* round up to next beat */
+ bbt.beats += 1;
+ }
- (*i)->set_start (bbt);
+ bbt.ticks = 0;
- if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
- tempo = t;
- // cerr << "NEW TEMPO, frame = " << (*i)->frame() << " start = " << (*i)->start() <<endl;
- } else if ((m = dynamic_cast<MeterSection*>(*i)) != 0) {
+ if (bbt.beats != 1) {
+ /* round up to next bar */
+ bbt.bars += 1;
+ bbt.beats = 1;
+ }
+ }
+ pair<double, BBT_Time> start = make_pair (beat_at_frame_locked (_metrics, m->frame()), bbt);
+ m->set_beat (start);
+ m->set_pulse (pulse_at_frame_locked (_metrics, m->frame()));
meter = m;
- // cerr << "NEW METER, frame = " << (*i)->frame() << " start = " << (*i)->start() <<endl;
+ // cerr << "NEW METER, frame = " << (*i)->frame() << " beat = " << (*i)->pulse() <<endl;
} else {
fatal << _("programming error: unhandled MetricSection type") << endmsg;
abort(); /*NOTREACHED*/
@@ -1896,7 +3728,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount)
prev = (*i);
}
- recompute_map (true);
+ recompute_map (_metrics);
}
@@ -1915,7 +3747,7 @@ TempoMap::remove_time (framepos_t where, framecnt_t amount)
bool meter_after = false; // is there a meter marker likewise?
{
Glib::Threads::RWLock::WriterLock lm (lock);
- for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((*i)->frame() >= where && (*i)->frame() < where+amount) {
metric_kill_list.push_back(*i);
TempoSection *lt = dynamic_cast<TempoSection*> (*i);
@@ -1951,12 +3783,12 @@ TempoMap::remove_time (framepos_t where, framecnt_t amount)
//remove all the remaining metrics
for (std::list<MetricSection*>::iterator i = metric_kill_list.begin(); i != metric_kill_list.end(); ++i) {
- metrics.remove(*i);
+ _metrics.remove(*i);
moved = true;
}
if (moved) {
- recompute_map (true);
+ recompute_map (_metrics);
}
}
PropertyChanged (PropertyChange ());
@@ -1967,94 +3799,32 @@ TempoMap::remove_time (framepos_t where, framecnt_t amount)
* pos can be -ve, if required.
*/
framepos_t
-TempoMap::framepos_plus_beats (framepos_t pos, Evoral::Beats beats) const
+TempoMap::framepos_plus_beats (framepos_t frame, Evoral::Beats beats) const
{
Glib::Threads::RWLock::ReaderLock lm (lock);
- Metrics::const_iterator next_tempo;
- const TempoSection* tempo = 0;
-
- /* Find the starting tempo metric */
- for (next_tempo = metrics.begin(); next_tempo != metrics.end(); ++next_tempo) {
+ const TempoSection& ts = tempo_section_at_frame_locked (_metrics, frame);
+ MeterSection* prev_m = 0;
+ MeterSection* next_m = 0;
- const TempoSection* t;
-
- if ((t = dynamic_cast<const TempoSection*>(*next_tempo)) != 0) {
-
- /* This is a bit of a hack, but pos could be -ve, and if it is,
- we consider the initial metric changes (at time 0) to actually
- be in effect at pos.
- */
-
- framepos_t f = (*next_tempo)->frame ();
-
- if (pos < 0 && f == 0) {
- f = pos;
- }
-
- if (f > pos) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+ if (!(*i)->is_tempo()) {
+ if (prev_m && (*i)->frame() > frame) {
+ next_m = static_cast<MeterSection*> (*i);
break;
}
-
- tempo = t;
+ prev_m = static_cast<MeterSection*> (*i);
}
}
- /* We now have:
-
- tempo -> the Tempo for "pos"
- next_tempo -> first tempo after "pos", possibly metrics.end()
- */
- assert(tempo);
-
- DEBUG_TRACE (DEBUG::TempoMath,
- string_compose ("frame %1 plus %2 beats, start with tempo = %3 @ %4\n",
- pos, beats, *((const Tempo*)tempo), tempo->frame()));
-
- while (!!beats) {
-
- /* Distance to the end of this section in frames */
- framecnt_t distance_frames = (next_tempo == metrics.end() ? max_framepos : ((*next_tempo)->frame() - pos));
-
- /* Distance to the end in beats */
- Evoral::Beats distance_beats = Evoral::Beats::ticks_at_rate(
- distance_frames, tempo->frames_per_beat (_frame_rate));
-
- /* Amount to subtract this time */
- Evoral::Beats const delta = min (distance_beats, beats);
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tdistance to %1 = %2 (%3 beats)\n",
- (next_tempo == metrics.end() ? max_framepos : (*next_tempo)->frame()),
- distance_frames, distance_beats));
-
- /* Update */
- beats -= delta;
- pos += delta.to_ticks(tempo->frames_per_beat (_frame_rate));
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tnow at %1, %2 beats left\n", pos, beats));
-
- /* step forwards to next tempo section */
-
- if (next_tempo != metrics.end()) {
-
- tempo = dynamic_cast<const TempoSection*>(*next_tempo);
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tnew tempo = %1 @ %2 fpb = %3\n",
- *((const Tempo*)tempo), tempo->frame(),
- tempo->frames_per_beat (_frame_rate)));
-
- while (next_tempo != metrics.end ()) {
-
- ++next_tempo;
+ double pos_beat = prev_m->beat() + (ts.pulse_at_frame (frame, _frame_rate) - prev_m->pulse()) * prev_m->note_divisor();
- if (next_tempo != metrics.end() && dynamic_cast<const TempoSection*>(*next_tempo)) {
- break;
- }
- }
- }
+ /* audio locked meters fake their beat */
+ if (next_m && next_m->beat() < pos_beat) {
+ pos_beat = next_m->beat();
}
- return pos;
+ return frame_at_beat_locked (_metrics, pos_beat + beats.to_double());
}
/** Subtract some (fractional) beats from a frame position, and return the result in frames */
@@ -2062,112 +3832,8 @@ framepos_t
TempoMap::framepos_minus_beats (framepos_t pos, Evoral::Beats beats) const
{
Glib::Threads::RWLock::ReaderLock lm (lock);
- Metrics::const_reverse_iterator prev_tempo;
- const TempoSection* tempo = 0;
-
- /* Find the starting tempo metric */
-
- for (prev_tempo = metrics.rbegin(); prev_tempo != metrics.rend(); ++prev_tempo) {
-
- const TempoSection* t;
-
- if ((t = dynamic_cast<const TempoSection*>(*prev_tempo)) != 0) {
-
- /* This is a bit of a hack, but pos could be -ve, and if it is,
- we consider the initial metric changes (at time 0) to actually
- be in effect at pos.
- */
-
- framepos_t f = (*prev_tempo)->frame ();
-
- if (pos < 0 && f == 0) {
- f = pos;
- }
-
- /* this is slightly more complex than the forward case
- because we reach the tempo in effect at pos after
- passing through pos (rather before, as in the
- forward case). having done that, we then need to
- keep going to get the previous tempo (or
- metrics.rend())
- */
-
- if (f <= pos) {
- if (tempo == 0) {
- /* first tempo with position at or
- before pos
- */
- tempo = t;
- } else if (f < pos) {
- /* some other tempo section that
- is even earlier than 'tempo'
- */
- break;
- }
- }
- }
- }
-
- assert(tempo);
- DEBUG_TRACE (DEBUG::TempoMath,
- string_compose ("frame %1 minus %2 beats, start with tempo = %3 @ %4 prev at beg? %5\n",
- pos, beats, *((const Tempo*)tempo), tempo->frame(),
- prev_tempo == metrics.rend()));
-
- /* We now have:
-
- tempo -> the Tempo for "pos"
- prev_tempo -> the first metric before "pos", possibly metrics.rend()
- */
-
- while (!!beats) {
-
- /* Distance to the start of this section in frames */
- framecnt_t distance_frames = (pos - tempo->frame());
-
- /* Distance to the start in beats */
- Evoral::Beats distance_beats = Evoral::Beats::ticks_at_rate(
- distance_frames, tempo->frames_per_beat (_frame_rate));
-
- /* Amount to subtract this time */
- Evoral::Beats const sub = min (distance_beats, beats);
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tdistance to %1 = %2 (%3 beats)\n",
- tempo->frame(), distance_frames, distance_beats));
- /* Update */
-
- beats -= sub;
- pos -= sub.to_double() * tempo->frames_per_beat (_frame_rate);
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tnow at %1, %2 beats left, prev at end ? %3\n", pos, beats,
- (prev_tempo == metrics.rend())));
- /* step backwards to prior TempoSection */
-
- if (prev_tempo != metrics.rend()) {
-
- tempo = dynamic_cast<const TempoSection*>(*prev_tempo);
-
- DEBUG_TRACE (DEBUG::TempoMath,
- string_compose ("\tnew tempo = %1 @ %2 fpb = %3\n",
- *((const Tempo*)tempo), tempo->frame(),
- tempo->frames_per_beat (_frame_rate)));
-
- while (prev_tempo != metrics.rend ()) {
-
- ++prev_tempo;
-
- if (prev_tempo != metrics.rend() && dynamic_cast<const TempoSection*>(*prev_tempo) != 0) {
- break;
- }
- }
- } else {
- pos -= llrint (beats.to_double() * tempo->frames_per_beat (_frame_rate));
- beats = Evoral::Beats();
- }
- }
-
- return pos;
+ return frame_at_beat_locked (_metrics, beat_at_frame_locked (_metrics, pos) - beats.to_double());
}
/** Add the BBT interval op to pos and return the result */
@@ -2175,135 +3841,24 @@ framepos_t
TempoMap::framepos_plus_bbt (framepos_t pos, BBT_Time op) const
{
Glib::Threads::RWLock::ReaderLock lm (lock);
- Metrics::const_iterator i;
- const MeterSection* meter;
- const MeterSection* m;
- const TempoSection* tempo;
- const TempoSection* t;
- double frames_per_beat;
- framepos_t effective_pos = max (pos, (framepos_t) 0);
-
- meter = &first_meter ();
- tempo = &first_tempo ();
-
- assert (meter);
- assert (tempo);
-
- /* find the starting metrics for tempo & meter */
-
- for (i = metrics.begin(); i != metrics.end(); ++i) {
-
- if ((*i)->frame() > effective_pos) {
- break;
- }
-
- if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
- tempo = t;
- } else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
- meter = m;
- }
- }
-
- /* We now have:
-
- meter -> the Meter for "pos"
- tempo -> the Tempo for "pos"
- i -> for first new metric after "pos", possibly metrics.end()
- */
-
- /* now comes the complicated part. we have to add one beat a time,
- checking for a new metric on every beat.
- */
-
- frames_per_beat = tempo->frames_per_beat (_frame_rate);
-
- uint64_t bars = 0;
-
- while (op.bars) {
-
- bars++;
- op.bars--;
-
- /* check if we need to use a new metric section: has adding frames moved us
- to or after the start of the next metric section? in which case, use it.
- */
-
- if (i != metrics.end()) {
- if ((*i)->frame() <= pos) {
-
- /* about to change tempo or meter, so add the
- * number of frames for the bars we've just
- * traversed before we change the
- * frames_per_beat value.
- */
-
- pos += llrint (frames_per_beat * (bars * meter->divisions_per_bar()));
- bars = 0;
-
- if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
- tempo = t;
- } else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
- meter = m;
- }
- ++i;
- frames_per_beat = tempo->frames_per_beat (_frame_rate);
-
- }
- }
+ BBT_Time pos_bbt = bbt_at_beat_locked (_metrics, beat_at_frame_locked (_metrics, pos));
+ pos_bbt.ticks += op.ticks;
+ if (pos_bbt.ticks >= BBT_Time::ticks_per_beat) {
+ ++pos_bbt.beats;
+ pos_bbt.ticks -= BBT_Time::ticks_per_beat;
}
-
- pos += llrint (frames_per_beat * (bars * meter->divisions_per_bar()));
-
- uint64_t beats = 0;
-
- while (op.beats) {
-
- /* given the current meter, have we gone past the end of the bar ? */
-
- beats++;
- op.beats--;
-
- /* check if we need to use a new metric section: has adding frames moved us
- to or after the start of the next metric section? in which case, use it.
- */
-
- if (i != metrics.end()) {
- if ((*i)->frame() <= pos) {
-
- /* about to change tempo or meter, so add the
- * number of frames for the beats we've just
- * traversed before we change the
- * frames_per_beat value.
- */
-
- pos += llrint (beats * frames_per_beat);
- beats = 0;
-
- if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
- tempo = t;
- } else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
- meter = m;
- }
- ++i;
- frames_per_beat = tempo->frames_per_beat (_frame_rate);
- }
- }
- }
-
- pos += llrint (beats * frames_per_beat);
-
- if (op.ticks) {
- if (op.ticks >= BBT_Time::ticks_per_beat) {
- pos += llrint (frames_per_beat + /* extra beat */
- (frames_per_beat * ((op.ticks % (uint32_t) BBT_Time::ticks_per_beat) /
- (double) BBT_Time::ticks_per_beat)));
- } else {
- pos += llrint (frames_per_beat * (op.ticks / (double) BBT_Time::ticks_per_beat));
- }
+ pos_bbt.beats += op.beats;
+ /* the meter in effect will start on the bar */
+ double divisions_per_bar = meter_section_at_beat (beat_at_bbt_locked (_metrics, BBT_Time (pos_bbt.bars + op.bars, 1, 0))).divisions_per_bar();
+ while (pos_bbt.beats >= divisions_per_bar + 1) {
+ ++pos_bbt.bars;
+ divisions_per_bar = meter_section_at_beat (beat_at_bbt_locked (_metrics, BBT_Time (pos_bbt.bars + op.bars, 1, 0))).divisions_per_bar();
+ pos_bbt.beats -= divisions_per_bar;
}
+ pos_bbt.bars += op.bars;
- return pos;
+ return frame_at_bbt_locked (_metrics, pos_bbt);
}
/** Count the number of beats that are equivalent to distance when going forward,
@@ -2313,125 +3868,8 @@ Evoral::Beats
TempoMap::framewalk_to_beats (framepos_t pos, framecnt_t distance) const
{
Glib::Threads::RWLock::ReaderLock lm (lock);
- Metrics::const_iterator next_tempo;
- const TempoSection* tempo = 0;
- framepos_t effective_pos = max (pos, (framepos_t) 0);
-
- /* Find the relevant initial tempo metric */
-
- for (next_tempo = metrics.begin(); next_tempo != metrics.end(); ++next_tempo) {
-
- const TempoSection* t;
-
- if ((t = dynamic_cast<const TempoSection*>(*next_tempo)) != 0) {
-
- if ((*next_tempo)->frame() > effective_pos) {
- break;
- }
-
- tempo = t;
- }
- }
-
- /* We now have:
-
- tempo -> the Tempo for "pos"
- next_tempo -> the next tempo after "pos", possibly metrics.end()
- */
- assert (tempo);
-
- DEBUG_TRACE (DEBUG::TempoMath,
- string_compose ("frame %1 walk by %2 frames, start with tempo = %3 @ %4\n",
- pos, distance, *((const Tempo*)tempo), tempo->frame()));
-
- Evoral::Beats beats = Evoral::Beats();
-
- while (distance) {
-
- /* End of this section */
- framepos_t end;
- /* Distance to `end' in frames */
- framepos_t distance_to_end;
-
- if (next_tempo == metrics.end ()) {
- /* We can't do (end - pos) if end is max_framepos, as it will overflow if pos is -ve */
- end = max_framepos;
- distance_to_end = max_framepos;
- } else {
- end = (*next_tempo)->frame ();
- distance_to_end = end - pos;
- }
-
- /* Amount to subtract this time in frames */
- framecnt_t const sub = min (distance, distance_to_end);
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("to reach end at %1 (end ? %2), distance= %3 sub=%4\n", end, (next_tempo == metrics.end()),
- distance_to_end, sub));
-
- /* Update */
- pos += sub;
- distance -= sub;
- assert (tempo);
- beats += Evoral::Beats::ticks_at_rate(sub, tempo->frames_per_beat (_frame_rate));
-
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("now at %1, beats = %2 distance left %3\n",
- pos, beats, distance));
-
- /* Move on if there's anything to move to */
-
- if (next_tempo != metrics.end()) {
-
- tempo = dynamic_cast<const TempoSection*>(*next_tempo);
-
- DEBUG_TRACE (DEBUG::TempoMath,
- string_compose ("\tnew tempo = %1 @ %2 fpb = %3\n",
- *((const Tempo*)tempo), tempo->frame(),
- tempo->frames_per_beat (_frame_rate)));
-
- while (next_tempo != metrics.end ()) {
- ++next_tempo;
-
- if (next_tempo != metrics.end() && dynamic_cast<const TempoSection*>(*next_tempo)) {
- break;
- }
- }
-
- if (next_tempo == metrics.end()) {
- DEBUG_TRACE (DEBUG::TempoMath, "no more tempo sections\n");
- } else {
- DEBUG_TRACE (DEBUG::TempoMath, string_compose ("next tempo section is %1 @ %2\n",
- **next_tempo, (*next_tempo)->frame()));
- }
-
- }
- assert (tempo);
- }
-
- return beats;
-}
-
-TempoMap::BBTPointList::const_iterator
-TempoMap::bbt_before_or_at (framepos_t pos)
-{
- /* CALLER MUST HOLD READ LOCK */
-
- BBTPointList::const_iterator i;
-
- if (pos < 0) {
- /* not really correct, but we should catch pos < 0 at a higher
- level
- */
- return _map.begin();
- }
-
- i = lower_bound (_map.begin(), _map.end(), pos);
- assert (i != _map.end());
- if ((*i).frame > pos) {
- assert (i != _map.begin());
- --i;
- }
- return i;
+ return Evoral::Beats (beat_at_frame_locked (_metrics, pos + distance) - beat_at_frame_locked (_metrics, pos));
}
struct bbtcmp {
@@ -2440,40 +3878,6 @@ struct bbtcmp {
}
};
-TempoMap::BBTPointList::const_iterator
-TempoMap::bbt_before_or_at (const BBT_Time& bbt)
-{
- BBTPointList::const_iterator i;
- bbtcmp cmp;
-
- i = lower_bound (_map.begin(), _map.end(), bbt, cmp);
- assert (i != _map.end());
- if ((*i).bar > bbt.bars || (*i).beat > bbt.beats) {
- assert (i != _map.begin());
- --i;
- }
- return i;
-}
-
-TempoMap::BBTPointList::const_iterator
-TempoMap::bbt_after_or_at (framepos_t pos)
-{
- /* CALLER MUST HOLD READ LOCK */
-
- BBTPointList::const_iterator i;
-
- if (_map.back().frame == pos) {
- i = _map.end();
- assert (i != _map.begin());
- --i;
- return i;
- }
-
- i = upper_bound (_map.begin(), _map.end(), pos);
- assert (i != _map.end());
- return i;
-}
-
std::ostream&
operator<< (std::ostream& o, const Meter& m) {
return o << m.divisions_per_bar() << '/' << m.note_divisor();
@@ -2487,7 +3891,7 @@ operator<< (std::ostream& o, const Tempo& t) {
std::ostream&
operator<< (std::ostream& o, const MetricSection& section) {
- o << "MetricSection @ " << section.frame() << " aka " << section.start() << ' ';
+ o << "MetricSection @ " << section.frame() << ' ';
const TempoSection* ts;
const MeterSection* ms;
diff --git a/libs/ardour/tempo_map_importer.cc b/libs/ardour/tempo_map_importer.cc
index 5a6a2a4..91e2320 100644
--- a/libs/ardour/tempo_map_importer.cc
+++ b/libs/ardour/tempo_map_importer.cc
@@ -26,7 +26,7 @@
#include "ardour/tempo.h"
#include "pbd/failed_constructor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/ardour/test/bbt_test.cc b/libs/ardour/test/bbt_test.cc
index 416d02b..8ca626d 100644
--- a/libs/ardour/test/bbt_test.cc
+++ b/libs/ardour/test/bbt_test.cc
@@ -16,7 +16,8 @@ BBTTest::addTest ()
Tempo tempo(120);
Meter meter(4.0, 4.0);
- map.add_meter (meter, BBT_Time(1, 1, 0));
+ /* no need to supply the frame for a new music-locked meter */
+ map.add_meter (meter, 4.0, BBT_Time(2, 1, 0), 0, MusicTime);
/* add some good stuff here */
}
diff --git a/libs/ardour/test/control_surfaces_test.cc b/libs/ardour/test/control_surfaces_test.cc
index 82b9653..440339c 100644
--- a/libs/ardour/test/control_surfaces_test.cc
+++ b/libs/ardour/test/control_surfaces_test.cc
@@ -31,7 +31,7 @@ using namespace ARDOUR;
void
ControlSurfacesTest::instantiateAndTeardownTest ()
{
- _session->new_audio_track (1, 2, Normal, 0, 1, "Test");
+ _session->new_audio_track (1, 2, NULL, 1, "Test", PresentationInfo::max_order, Normal);
ControlProtocolManager& m = ControlProtocolManager::instance ();
for (list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
diff --git a/libs/ardour/test/framepos_minus_beats_test.cc b/libs/ardour/test/framepos_minus_beats_test.cc
index 12f020e..85032d2 100644
--- a/libs/ardour/test/framepos_minus_beats_test.cc
+++ b/libs/ardour/test/framepos_minus_beats_test.cc
@@ -22,8 +22,8 @@ FrameposMinusBeatsTest::singleTempoTest ()
Tempo tempo (bpm);
Meter meter (4, 4);
- map.add_meter (meter, BBT_Time (1, 1, 0));
- map.add_tempo (tempo, BBT_Time (1, 1, 0));
+ map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+ map.replace_tempo (map.first_tempo(), tempo, 0.0, 0, TempoSection::Constant, AudioTime);
/* Subtract 1 beat from beat 3 of the first bar */
framepos_t r = map.framepos_minus_beats (frames_per_beat * 2, Beats(1));
@@ -42,7 +42,7 @@ FrameposMinusBeatsTest::doubleTempoTest ()
TempoMap map (sampling_rate);
Meter meter (4, 4);
- map.add_meter (meter, BBT_Time (1, 1, 0));
+ map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
/*
120bpm at bar 1, 240bpm at bar 4
@@ -57,15 +57,16 @@ FrameposMinusBeatsTest::doubleTempoTest ()
120bpm 240bpm
0 beats 12 beats
0 frames 288e3 frames
+ 0 pulses 4 pulses
| | | | |
| 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 4.4 |
*/
Tempo tempoA (120);
- map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+ map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
Tempo tempoB (240);
- map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+ map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
/* Now some tests */
@@ -94,7 +95,7 @@ FrameposMinusBeatsTest::doubleTempoWithMeterTest ()
TempoMap map (sampling_rate);
Meter meterA (4, 4);
- map.add_meter (meterA, BBT_Time (1, 1, 0));
+ map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
/*
120bpm at bar 1, 240bpm at bar 4
@@ -109,17 +110,18 @@ FrameposMinusBeatsTest::doubleTempoWithMeterTest ()
120bpm 240bpm
0 beats 12 beats
0 frames 288e3 frames
+ 0 pulses 3 pulses
| | | | |
| 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 |
*/
Tempo tempoA (120);
- map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+ map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
Tempo tempoB (240);
- map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+ map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
Meter meterB (3, 4);
- map.add_meter (meterB, BBT_Time (4, 1, 0));
+ map.add_meter (meterB, 12.0, BBT_Time (4, 1, 0), 0, MusicTime);
/* Now some tests */
diff --git a/libs/ardour/test/framepos_plus_beats_test.cc b/libs/ardour/test/framepos_plus_beats_test.cc
index 69fd9a5..8193eaf 100644
--- a/libs/ardour/test/framepos_plus_beats_test.cc
+++ b/libs/ardour/test/framepos_plus_beats_test.cc
@@ -21,8 +21,8 @@ FrameposPlusBeatsTest::singleTempoTest ()
Tempo tempo (bpm);
Meter meter (4, 4);
- map.add_meter (meter, BBT_Time (1, 1, 0));
- map.add_tempo (tempo, BBT_Time (1, 1, 0));
+ map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+ map.replace_tempo (map.first_tempo(), tempo, 0.0, 0, TempoSection::Constant, AudioTime);
/* Add 1 beat to beat 3 of the first bar */
framepos_t r = map.framepos_plus_beats (frames_per_beat * 2, Evoral::Beats(1));
@@ -41,7 +41,7 @@ FrameposPlusBeatsTest::doubleTempoTest ()
TempoMap map (sampling_rate);
Meter meter (4, 4);
- map.add_meter (meter, BBT_Time (1, 1, 0));
+ map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
/*
120bpm at bar 1, 240bpm at bar 4
@@ -56,15 +56,16 @@ FrameposPlusBeatsTest::doubleTempoTest ()
120bpm 240bpm
0 beats 12 beats
0 frames 288e3 frames
+ 0 pulses 3 pulses
| | | | |
| 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 4.4 |
*/
Tempo tempoA (120);
- map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+ map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
Tempo tempoB (240);
- map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+ map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
/* Now some tests */
@@ -93,7 +94,7 @@ FrameposPlusBeatsTest::doubleTempoWithMeterTest ()
TempoMap map (sampling_rate);
Meter meterA (4, 4);
- map.add_meter (meterA, BBT_Time (1, 1, 0));
+ map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
/*
120bpm at bar 1, 240bpm at bar 4
@@ -108,17 +109,18 @@ FrameposPlusBeatsTest::doubleTempoWithMeterTest ()
120bpm 240bpm
0 beats 12 beats
0 frames 288e3 frames
+ 0 pulses 3 pulses
| | | | |
| 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 |
*/
Tempo tempoA (120);
- map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+ map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
Tempo tempoB (240);
- map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+ map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
Meter meterB (3, 4);
- map.add_meter (meterB, BBT_Time (4, 1, 0));
+ map.add_meter (meterB, 12.0, BBT_Time (4, 1, 0), 0, MusicTime);
/* Now some tests */
diff --git a/libs/ardour/test/framewalk_to_beats_test.cc b/libs/ardour/test/framewalk_to_beats_test.cc
index 8b7748c..75a1e57 100644
--- a/libs/ardour/test/framewalk_to_beats_test.cc
+++ b/libs/ardour/test/framewalk_to_beats_test.cc
@@ -20,8 +20,8 @@ FramewalkToBeatsTest::singleTempoTest ()
Tempo tempo (bpm);
Meter meter (4, 4);
- map.add_meter (meter, BBT_Time (1, 1, 0));
- map.add_tempo (tempo, BBT_Time (1, 1, 0));
+ map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+ map.replace_tempo (map.tempo_section_at_frame (0), tempo, 0.0, 0, TempoSection::Constant, AudioTime);
/* Walk 1 beats-worth of frames from beat 3 */
double r = map.framewalk_to_beats (frames_per_beat * 2, frames_per_beat * 1).to_double();
@@ -47,7 +47,7 @@ FramewalkToBeatsTest::doubleTempoTest ()
TempoMap map (sampling_rate);
Meter meter (4, 4);
- map.add_meter (meter, BBT_Time (1, 1, 0));
+ map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
/*
120bpm at bar 1, 240bpm at bar 4
@@ -63,6 +63,7 @@ FramewalkToBeatsTest::doubleTempoTest ()
0 beats 12 beats
0 frames 288e3 frames
24e3 frames per beat 12e3 frames per beat
+ 0 pulses 4 pulses
| | | | |
1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 5.1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
@@ -70,9 +71,9 @@ FramewalkToBeatsTest::doubleTempoTest ()
*/
Tempo tempoA (120);
- map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+ map.replace_tempo (map.tempo_section_at_frame (0), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
Tempo tempoB (240);
- map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+ map.add_tempo (tempoB, 12.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
/* Now some tests */
@@ -103,7 +104,7 @@ FramewalkToBeatsTest::tripleTempoTest ()
TempoMap map (sampling_rate);
Meter meter (4, 4);
- map.add_meter (meter, BBT_Time (1, 1, 0));
+ map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
/*
120bpm at bar 1, 240bpm at bar 2, 160bpm at bar 3
@@ -119,17 +120,18 @@ FramewalkToBeatsTest::tripleTempoTest ()
120bpm 240bpm 160bpm
0 beats 4 beats 8 beats
0 frames 96e3 frames 144e3 frames
+ 0 pulses 1 pulse 2 pulses
| | | | |
| 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 4.4 |
*/
Tempo tempoA (120);
- map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+ map.replace_tempo (map.tempo_section_at_frame (0), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
Tempo tempoB (240);
- map.add_tempo (tempoB, BBT_Time (2, 1, 0));
+ map.add_tempo (tempoB, 4.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
Tempo tempoC (160);
- map.add_tempo (tempoC, BBT_Time (3, 1, 0));
+ map.add_tempo (tempoC, 8.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
/* Walk from 1|3 to 4|1 */
double r = map.framewalk_to_beats (2 * 24e3, (2 * 24e3) + (4 * 12e3) + (4 * 18e3)).to_double();
diff --git a/libs/ardour/test/midi_clock_slave_test.h b/libs/ardour/test/midi_clock_slave_test.h
index 0899eed..7bb5e28 100644
--- a/libs/ardour/test/midi_clock_slave_test.h
+++ b/libs/ardour/test/midi_clock_slave_test.h
@@ -48,8 +48,8 @@ class TestSlaveSessionProxy : public ISlaveSessionProxy {
meter (4.0, 4.0)
{
_tempo_map = new TempoMap (FRAME_RATE);
- _tempo_map->add_tempo (tempo, Timecode::BBT_Time(1, 1, 0));
- _tempo_map->add_meter (meter, Timecode::BBT_Time(1, 1, 0));
+ _tempo_map->add_tempo (tempo, 0.0, 0, TempoSection::Constant, AudioTime);
+ _tempo_map->add_meter (meter, 0.0, Timecode::BBT_Time(1, 1, 0), 0, AudioTime);
}
// Controlling the mock object
diff --git a/libs/ardour/test/profiling/lots_of_regions.cc b/libs/ardour/test/profiling/lots_of_regions.cc
index 4467822..0e5a4c2 100644
--- a/libs/ardour/test/profiling/lots_of_regions.cc
+++ b/libs/ardour/test/profiling/lots_of_regions.cc
@@ -29,7 +29,7 @@ main (int argc, char* argv[])
assert (playlist);
/* And the region */
- boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (playlist->region_list().rlist().front());
+ boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (playlist->region_list_property().rlist().front());
assert (region);
/* Duplicate it a lot */
diff --git a/libs/ardour/test/tempo_test.cc b/libs/ardour/test/tempo_test.cc
index 4905259..04bf071 100644
--- a/libs/ardour/test/tempo_test.cc
+++ b/libs/ardour/test/tempo_test.cc
@@ -14,7 +14,7 @@ TempoTest::recomputeMapTest ()
TempoMap map (sampling_rate);
Meter meterA (4, 4);
- map.add_meter (meterA, BBT_Time (1, 1, 0));
+ map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
/*
120bpm at bar 1, 240bpm at bar 4
@@ -29,22 +29,81 @@ TempoTest::recomputeMapTest ()
120bpm 240bpm
0 beats 12 beats
0 frames 288e3 frames
+ 0 pulses 3 pulses
| | | | |
| 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 |
*/
Tempo tempoA (120);
- map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+ map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
Tempo tempoB (240);
- map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+ map.add_tempo (tempoB, 3.0, 0, TempoSection::Constant, MusicTime);
Meter meterB (3, 4);
- map.add_meter (meterB, BBT_Time (4, 1, 0));
+ map.add_meter (meterB, 12.0, BBT_Time (4, 1, 0), 0, MusicTime);
- list<MetricSection*>::iterator i = map.metrics.begin();
+ list<MetricSection*>::iterator i = map._metrics.begin();
CPPUNIT_ASSERT_EQUAL (framepos_t (0), (*i)->frame ());
- i = map.metrics.end();
+ i = map._metrics.end();
--i;
CPPUNIT_ASSERT_EQUAL (framepos_t (288e3), (*i)->frame ());
}
+
+void
+TempoTest::rampTest ()
+{
+ int const sampling_rate = 48000;
+
+ TempoMap map (sampling_rate);
+ Meter meterA (4, 4);
+ Tempo tempoA (77.0, 4.0);
+ Tempo tempoB (217.0, 4.0);
+ map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Ramp, AudioTime);
+ map.add_tempo (tempoB, 0.0, (framepos_t) 60 * sampling_rate, TempoSection::Ramp, AudioTime);
+ map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+
+ /*
+
+ 77bpm / note typeA 217bpm / note type B
+ 0 frames 60 * sample rate frames
+ | | | | |
+ | *|
+ | * |
+ | * |
+ | * |
+ | * |
+ | * |
+ | * |
+ | * | |
+ | * | |
+ | * | | |
+ -------------------|-----------|-----------------------
+ 20 seconds 125.0 bpm / note_type
+ */
+
+ TempoSection* tA = 0;
+ TempoSection* tB;
+ list<MetricSection*>::iterator i;
+
+ for (i = map._metrics.begin(); i != map._metrics.end(); ++i) {
+ if ((tB = dynamic_cast<TempoSection*> (*i)) != 0) {
+ if (tA) {
+ break;
+ }
+ tA = tB;
+ }
+ }
+ map.recompute_map (map._metrics);
+
+ CPPUNIT_ASSERT_EQUAL (tB->frame(), tA->frame_at_tempo (tB->beats_per_minute() / tB->note_type(), 300.0, sampling_rate));
+ CPPUNIT_ASSERT_EQUAL (tB->frame(), tA->frame_at_pulse (tB->pulse(), sampling_rate));
+
+ /* self-check tempo at pulse @ 125 bpm. */
+ CPPUNIT_ASSERT_DOUBLES_EQUAL (125.0 / 4.0, tA->tempo_at_pulse (tA->pulse_at_tempo (125.0 / 4.0, 0, sampling_rate)), 0.00000000000000001);
+
+ /* self-check frame at pulse 20 seconds in. */
+ const framepos_t target = 20 * sampling_rate;
+ const framepos_t result = tA->frame_at_pulse (tA->pulse_at_frame (target, sampling_rate), sampling_rate);
+ CPPUNIT_ASSERT_EQUAL (target, result);
+}
diff --git a/libs/ardour/test/tempo_test.h b/libs/ardour/test/tempo_test.h
index 3252650..e2a6701 100644
--- a/libs/ardour/test/tempo_test.h
+++ b/libs/ardour/test/tempo_test.h
@@ -6,6 +6,7 @@ class TempoTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE (TempoTest);
CPPUNIT_TEST (recomputeMapTest);
+ CPPUNIT_TEST (rampTest);
CPPUNIT_TEST_SUITE_END ();
public:
@@ -13,5 +14,6 @@ public:
void tearDown () {}
void recomputeMapTest ();
+ void rampTest ();
};
diff --git a/libs/ardour/thread_buffers.cc b/libs/ardour/thread_buffers.cc
index 2336ee5..9b08f5c 100644
--- a/libs/ardour/thread_buffers.cc
+++ b/libs/ardour/thread_buffers.cc
@@ -30,6 +30,7 @@ using namespace std;
ThreadBuffers::ThreadBuffers ()
: silent_buffers (new BufferSet)
, scratch_buffers (new BufferSet)
+ , noinplace_buffers (new BufferSet)
, route_buffers (new BufferSet)
, mix_buffers (new BufferSet)
, gain_automation_buffer (0)
@@ -71,6 +72,7 @@ ThreadBuffers::ensure_buffers (ChanCount howmany, size_t custom)
}
scratch_buffers->ensure_buffers (*t, count, size);
+ noinplace_buffers->ensure_buffers (*t, count, size);
mix_buffers->ensure_buffers (*t, count, size);
silent_buffers->ensure_buffers (*t, count, size);
route_buffers->ensure_buffers (*t, count, size);
diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc
index e02143e..def219a 100644
--- a/libs/ardour/ticker.cc
+++ b/libs/ardour/ticker.cc
@@ -68,9 +68,10 @@ public:
s->bbt_time (this->frame, *this);
const TempoMap& tempo = s->tempo_map();
+ const Meter& meter = tempo.meter_at_frame (frame);
- const double divisions = tempo.meter_at(frame).divisions_per_bar();
- const double divisor = tempo.meter_at(frame).note_divisor();
+ const double divisions = meter.divisions_per_bar();
+ const double divisor = meter.note_divisor();
const double qnote_scale = divisor * 0.25f;
double mb;
@@ -307,8 +308,8 @@ MidiClockTicker::tick (const framepos_t& /* transport_frame */, pframes_t nframe
double
MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position)
{
- const Tempo& current_tempo = _session->tempo_map().tempo_at (transport_position);
- double frames_per_beat = current_tempo.frames_per_beat (_session->nominal_frame_rate());
+ const Tempo& current_tempo = _session->tempo_map().tempo_at_frame (transport_position);
+ double frames_per_beat = _session->tempo_map().frames_per_beat_at (transport_position, _session->nominal_frame_rate());
double quarter_notes_per_beat = 4.0 / current_tempo.note_type();
double frames_per_quarter_note = frames_per_beat / quarter_notes_per_beat;
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index f279eae..02c44ed 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -23,26 +23,28 @@
#include "ardour/diskstream.h"
#include "ardour/io_processor.h"
#include "ardour/meter.h"
+#include "ardour/monitor_control.h"
#include "ardour/playlist.h"
#include "ardour/port.h"
#include "ardour/processor.h"
+#include "ardour/record_enable_control.h"
+#include "ardour/record_safe_control.h"
#include "ardour/route_group_specialized.h"
#include "ardour/session.h"
#include "ardour/session_playlists.h"
#include "ardour/track.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
using namespace PBD;
-Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
+Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type)
: Route (sess, name, flag, default_type)
, _saved_meter_point (_meter_point)
, _mode (mode)
- , _monitoring (MonitorAuto)
{
_freeze_record.state = NoFreeze;
_declickable = true;
@@ -62,17 +64,23 @@ Track::init ()
boost::shared_ptr<Route> rp (shared_from_this());
boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
- _rec_enable_control = boost::shared_ptr<RecEnableControl> (new RecEnableControl(rt));
- _rec_enable_control->set_flags (Controllable::Toggle);
- _monitoring_control.reset (new MonitoringControllable (X_("monitoring"), rt));
- /* don't add rec_enable_control to controls because we don't want it to
- * appear as an automatable parameter
- */
- track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this));
+ _record_enable_control.reset (new RecordEnableControl (_session, X_("recenable"), *this));
+ add_control (_record_enable_control);
+
+ _record_safe_control.reset (new RecordSafeControl (_session, X_("recsafe"), *this));
+ add_control (_record_safe_control);
+
+ _monitoring_control.reset (new MonitorControl (_session, X_("monitoring"), *this));
+ add_control (_monitoring_control);
+
_session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
- return 0;
+ _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
+ _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
+ _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
+
+ return 0;
}
void
@@ -97,9 +105,12 @@ XMLNode&
Track::state (bool full)
{
XMLNode& root (Route::state (full));
- root.add_property (X_("monitoring"), enum_2_string (_monitoring));
+
+ root.add_child_nocopy (_monitoring_control->get_state ());
+ root.add_child_nocopy (_record_safe_control->get_state ());
+ root.add_child_nocopy (_record_enable_control->get_state ());
+
root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
- root.add_child_nocopy (_rec_enable_control->get_state());
root.add_child_nocopy (_diskstream->get_state ());
return root;
@@ -134,21 +145,24 @@ Track::set_state (const XMLNode& node, int version)
for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
child = *niter;
- XMLProperty* prop;
- if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
- if (prop->value() == X_("recenable")) {
- _rec_enable_control->set_state (*child, version);
+ XMLProperty const * prop;
+
+ if (child->name() == Controllable::xml_node_name) {
+ if ((prop = child->property ("name")) == 0) {
+ continue;
+ }
+
+ if (prop->value() == _record_enable_control->name()) {
+ _record_enable_control->set_state (*child, version);
+ } else if (prop->value() == _record_safe_control->name()) {
+ _record_safe_control->set_state (*child, version);
+ } else if (prop->value() == _monitoring_control->name()) {
+ _monitoring_control->set_state (*child, version);
}
}
}
- const XMLProperty* prop;
-
- if ((prop = node.property (X_("monitoring"))) != 0) {
- _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
- } else {
- _monitoring = MonitorAuto;
- }
+ XMLProperty const * prop;
if ((prop = node.property (X_("saved-meter-point"))) != 0) {
_saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
@@ -178,62 +192,6 @@ Track::freeze_state() const
return _freeze_record.state;
}
-Track::RecEnableControl::RecEnableControl (boost::shared_ptr<Track> t)
- : AutomationControl (t->session(),
- RecEnableAutomation,
- ParameterDescriptor(Evoral::Parameter(RecEnableAutomation)),
- boost::shared_ptr<AutomationList>(),
- X_("recenable"))
- , track (t)
-{
- boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(RecEnableAutomation)));
- set_list (gl);
-}
-
-void
-Track::RecEnableControl::set_value (double val, Controllable::GroupControlDisposition group_override)
-{
- if (writable()) {
- _set_value (val, group_override);
- }
-}
-
-void
-Track::RecEnableControl::set_value_unchecked (double val)
-{
- if (writable()) {
- _set_value (val, Controllable::NoGroup);
- }
-}
-
-void
-Track::RecEnableControl::_set_value (double val, Controllable::GroupControlDisposition group_override)
-{
- boost::shared_ptr<Track> t = track.lock ();
- if (!t) {
- return;
- }
-
- t->set_record_enabled (val >= 0.5 ? true : false, group_override);
-}
-
-double
-Track::RecEnableControl::get_value () const
-{
- boost::shared_ptr<Track> t = track.lock ();
- if (!t) {
- return 0;
- }
-
- return (t->record_enabled() ? 1.0 : 0.0);
-}
-
-bool
-Track::record_enabled () const
-{
- return _diskstream && _diskstream->record_enabled ();
-}
-
bool
Track::can_record()
{
@@ -246,24 +204,15 @@ Track::can_record()
return will_record;
}
-void
-Track::prep_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
+int
+Track::prep_record_enabled (bool yn)
{
- if (yn && record_safe ()) {
- return;
- }
-
- if (!_session.writable()) {
- return;
- }
-
- if (_freeze_record.state == Frozen) {
- return;
+ if (yn && _record_safe_control->get_value()) {
+ return -1;
}
- if (use_group (group_override, &RouteGroup::is_recenable)) {
- _route_group->apply (&Track::prep_record_enabled, yn, Controllable::NoGroup);
- return;
+ if (!can_be_record_enabled()) {
+ return -1;
}
/* keep track of the meter point as it was before we rec-enabled */
@@ -288,56 +237,32 @@ Track::prep_record_enabled (bool yn, Controllable::GroupControlDisposition group
set_meter_point (_saved_meter_point);
}
}
+
+ return 0;
}
void
-Track::set_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
+Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
{
- if (_diskstream->record_safe ()) {
- return;
- }
-
- if (!_session.writable()) {
- return;
- }
-
- if (_freeze_record.state == Frozen) {
- return;
- }
-
- if (use_group (group_override, &RouteGroup::is_recenable)) {
- _route_group->apply (&Track::set_record_enabled, yn, Controllable::NoGroup);
- return;
- }
-
- _diskstream->set_record_enabled (yn);
+ _diskstream->set_record_enabled (_record_enable_control->get_value());
+}
- _rec_enable_control->Changed ();
+void
+Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
+{
+ _diskstream->set_record_safe (_record_safe_control->get_value());
}
bool
-Track::record_safe () const
+Track::can_be_record_safe ()
{
- return _diskstream && _diskstream->record_safe ();
+ return !_record_enable_control->get_value() && _diskstream && _session.writable() && (_freeze_record.state != Frozen);
}
-void
-Track::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
+bool
+Track::can_be_record_enabled ()
{
- if (!_session.writable()) {
- return;
- }
-
- if (_freeze_record.state == Frozen) {
- return;
- }
-
- if (use_group (group_override, &RouteGroup::is_recenable)) {
- _route_group->apply (&Track::set_record_safe, yn, Controllable::NoGroup);
- return;
- }
-
- _diskstream->set_record_safe (yn);
+ return !_record_safe_control->get_value() && _diskstream && !_diskstream->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
}
void
@@ -367,7 +292,7 @@ Track::set_name (const string& str)
{
bool ret;
- if (record_enabled() && _session.actively_recording()) {
+ if (_record_enable_control->get_value() && _session.actively_recording()) {
/* this messes things up if done while recording */
return false;
}
@@ -448,7 +373,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
if (!_active) {
silence (nframes);
- if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
+ if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
_meter->reset();
}
return 0;
@@ -533,10 +458,10 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
if (no_meter) {
BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
- _meter->run (bufs, 0, 0, nframes, true);
- _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
+ _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
+ _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, speed(), nframes);
} else {
- _input->process_input (_meter, start_frame, end_frame, nframes);
+ _input->process_input (_meter, start_frame, end_frame, speed(), nframes);
}
}
@@ -549,18 +474,13 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
fill_buffers_with_input (bufs, _input, nframes);
if (_meter_point == MeterInput) {
- _meter->run (bufs, start_frame, end_frame, nframes, true);
+ _meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
}
passthru (bufs, start_frame, end_frame, nframes, false);
}
- for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
- if (d) {
- d->flush_buffers (nframes);
- }
- }
+ flush_processor_buffers_locked (nframes);
return 0;
}
@@ -590,6 +510,7 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*
_amp->apply_gain_automation(false);
silence (nframes);
+ flush_processor_buffers_locked (nframes);
framecnt_t playback_distance;
@@ -607,8 +528,6 @@ Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
diskstream_playlist_changed ();
- ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
- ds->RecordSafeChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_safe_changed, this));
ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
}
@@ -620,18 +539,6 @@ Track::diskstream_playlist_changed ()
}
void
-Track::diskstream_record_enable_changed ()
-{
- RecordEnableChanged (); /* EMIT SIGNAL */
-}
-
-void
-Track::diskstream_record_safe_changed ()
-{
- RecordSafeChanged (); /* EMIT SIGNAL */
-}
-
-void
Track::diskstream_speed_changed ()
{
SpeedChanged (); /* EMIT SIGNAL */
@@ -1010,12 +917,13 @@ MonitorState
Track::monitoring_state () const
{
/* Explicit requests */
+ MonitorChoice m (_monitoring_control->monitoring_choice());
- if (_monitoring & MonitorInput) {
+ if (m & MonitorInput) {
return MonitoringInput;
}
- if (_monitoring & MonitorDisk) {
+ if (m & MonitorDisk) {
return MonitoringDisk;
}
@@ -1082,7 +990,7 @@ Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
ditto if we are monitoring inputs.
*/
- if (_have_internal_generator || monitoring_choice() == MonitorInput) {
+ if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
return;
}
@@ -1132,22 +1040,10 @@ Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
}
void
-Track::set_monitoring (MonitorChoice mc, Controllable::GroupControlDisposition gcd)
+Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
{
- if (use_group (gcd, &RouteGroup::is_monitoring)) {
- _route_group->apply (&Track::set_monitoring, mc, Controllable::NoGroup);
- return;
- }
-
- if (mc != _monitoring) {
- _monitoring = mc;
-
- for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- (*i)->monitoring_changed ();
- }
-
- MonitoringChanged (); /* EMIT SIGNAL */
- _monitoring_control->Changed (); /* EMIT SIGNAL */
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ (*i)->monitoring_changed ();
}
}
@@ -1157,64 +1053,10 @@ Track::metering_state () const
bool rv;
if (_session.transport_rolling ()) {
// audio_track.cc || midi_track.cc roll() runs meter IFF:
- rv = _meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled());
+ rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled());
} else {
// track no_roll() always metering if
rv = _meter_point == MeterInput;
}
return rv ? MeteringInput : MeteringRoute;
}
-
-Track::MonitoringControllable::MonitoringControllable (std::string name, boost::shared_ptr<Track> r)
- : RouteAutomationControl (name, MonitoringAutomation, boost::shared_ptr<AutomationList>(), r)
-{
- boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MonitoringAutomation)));
- gl->set_interpolation(Evoral::ControlList::Discrete);
- set_list (gl);
-}
-
-void
-Track::MonitoringControllable::set_value (double val, Controllable::GroupControlDisposition gcd)
-{
- _set_value (val, gcd);
-}
-
-void
-Track::MonitoringControllable::_set_value (double val, Controllable::GroupControlDisposition gcd)
-{
- boost::shared_ptr<Route> r = _route.lock();
- if (!r) {
- return;
- }
-
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
- if (!t) {
- return;
- }
-
- int mc = (int) val;
-
- if (mc < MonitorAuto || mc > MonitorDisk) {
- return;
- }
-
- /* no group effect at present */
-
- t->set_monitoring ((MonitorChoice) mc, gcd);
-}
-
-double
-Track::MonitoringControllable::get_value () const
-{
- boost::shared_ptr<Route> r = _route.lock();
- if (!r) {
- return 0.0;
- }
-
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
- if (!t) {
- return 0.0;
- }
-
- return t->monitoring_choice();
-}
diff --git a/libs/ardour/transient_detector.cc b/libs/ardour/transient_detector.cc
index 41bb51f..6eed836 100644
--- a/libs/ardour/transient_detector.cc
+++ b/libs/ardour/transient_detector.cc
@@ -22,7 +22,7 @@
#include "ardour/readable.h"
#include "ardour/transient_detector.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Vamp;
using namespace ARDOUR;
@@ -86,11 +86,15 @@ TransientDetector::set_threshold (float val)
}
void
-TransientDetector::set_sensitivity (float val)
+TransientDetector::set_sensitivity (uint32_t mode, float val)
{
if (plugin) {
- plugin->selectProgram ("Percussive onsets");
- plugin->setParameter ("sensitivity", val);
+ // see libs/vamp-plugins/OnsetDetect.cpp
+ //plugin->selectProgram ("General purpose"); // dftype = 3, sensitivity = 50, whiten = 0 (default)
+ //plugin->selectProgram ("Percussive onsets"); // dftype = 4, sensitivity = 40, whiten = 0
+ plugin->setParameter ("dftype", mode);
+ plugin->setParameter ("sensitivity", std::min (100.f, std::max (0.f, val)));
+ plugin->setParameter ("whiten", 0);
}
}
@@ -119,7 +123,7 @@ TransientDetector::cleanup_transients (AnalysisFeatureList& t, float sr, float g
// move f until we find a new value that is far enough away
- while ((f != t.end()) && (((*f) - (*i)) < gap_frames)) {
+ while ((f != t.end()) && gap_frames > 0 && (((*f) - (*i)) < gap_frames)) {
++f;
}
diff --git a/libs/ardour/unknown_processor.cc b/libs/ardour/unknown_processor.cc
index df40d4d..8fbb178 100644
--- a/libs/ardour/unknown_processor.cc
+++ b/libs/ardour/unknown_processor.cc
@@ -20,7 +20,7 @@
#include "ardour/audio_buffer.h"
#include "ardour/unknown_processor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -103,12 +103,15 @@ UnknownProcessor::can_support_io_configuration (const ChanCount &in, ChanCount &
out = in;
#endif
return true;
+ } else {
+ PBD::error << _("Using plugin-stub with mismatching i/o configuration for: ") << name() << endmsg;
+ out = in;
}
- return false;
+ return true;
}
void
-UnknownProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+UnknownProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
{
if (!have_ioconfig) {
return;
diff --git a/libs/ardour/uri_map.cc b/libs/ardour/uri_map.cc
index 6fac103..4bdb405 100644
--- a/libs/ardour/uri_map.cc
+++ b/libs/ardour/uri_map.cc
@@ -27,6 +27,7 @@
#include "pbd/error.h"
#include "ardour/uri_map.h"
+#include "ardour/lv2_extensions.h"
namespace ARDOUR {
@@ -46,6 +47,7 @@ URIMap::URIDs::init(URIMap& uri_map)
atom_Float = uri_map.uri_to_id("http://lv2plug.in/ns/ext/atom#Float");
log_Error = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Error");
log_Note = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Note");
+ log_Trace = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Trace");
log_Warning = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Warning");
midi_MidiEvent = uri_map.uri_to_id("http://lv2plug.in/ns/ext/midi#MidiEvent");
time_Position = uri_map.uri_to_id("http://lv2plug.in/ns/ext/time#Position");
@@ -60,6 +62,15 @@ URIMap::URIDs::init(URIMap& uri_map)
patch_Set = uri_map.uri_to_id("http://lv2plug.in/ns/ext/patch#Set");
patch_property = uri_map.uri_to_id("http://lv2plug.in/ns/ext/patch#property");
patch_value = uri_map.uri_to_id("http://lv2plug.in/ns/ext/patch#value");
+#ifdef LV2_EXTENDED
+ auto_event = uri_map.uri_to_id(LV2_AUTOMATE_URI__event);
+ auto_setup = uri_map.uri_to_id(LV2_AUTOMATE_URI__setup);
+ auto_finalize = uri_map.uri_to_id(LV2_AUTOMATE_URI__finalize);
+ auto_start = uri_map.uri_to_id(LV2_AUTOMATE_URI__start);
+ auto_end = uri_map.uri_to_id(LV2_AUTOMATE_URI__end);
+ auto_parameter = uri_map.uri_to_id(LV2_AUTOMATE_URI__parameter);
+ auto_value = uri_map.uri_to_id(LV2_AUTOMATE_URI__value);
+#endif
}
URIMap&
diff --git a/libs/ardour/user_bundle.cc b/libs/ardour/user_bundle.cc
index aaafcb0..dda0a6d 100644
--- a/libs/ardour/user_bundle.cc
+++ b/libs/ardour/user_bundle.cc
@@ -18,7 +18,7 @@
*/
#include "ardour/user_bundle.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/compose.h"
#include "pbd/error.h"
#include "pbd/failed_constructor.h"
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index 08bb610..8e57cde 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -57,7 +57,7 @@
#include "ardour/utils.h"
#include "ardour/rc_configuration.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
@@ -754,3 +754,4 @@ ARDOUR::slider_position_to_gain_with_max (double g, double max_gain)
extern "C" {
void c_stacktrace() { stacktrace (cerr); }
}
+
diff --git a/libs/ardour/vca.cc b/libs/ardour/vca.cc
new file mode 100644
index 0000000..a2b1691
--- /dev/null
+++ b/libs/ardour/vca.cc
@@ -0,0 +1,200 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "pbd/convert.h"
+
+#include "ardour/automation_control.h"
+#include "ardour/debug.h"
+#include "ardour/gain_control.h"
+#include "ardour/monitor_control.h"
+#include "ardour/rc_configuration.h"
+#include "ardour/route.h"
+#include "ardour/session.h"
+#include "ardour/vca.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using std::string;
+
+Glib::Threads::Mutex VCA::number_lock;
+int32_t VCA::next_number = 1;
+string VCA::xml_node_name (X_("VCA"));
+
+string
+VCA::default_name_template ()
+{
+ return _("VCA %n");
+}
+
+int32_t
+VCA::next_vca_number ()
+{
+ /* we could use atomic inc here, but elsewhere we need more complete
+ mutex semantics, so we have to do it here also.
+ */
+ Glib::Threads::Mutex::Lock lm (number_lock);
+ return next_number++;
+}
+
+void
+VCA::set_next_vca_number (int32_t n)
+{
+ Glib::Threads::Mutex::Lock lm (number_lock);
+ next_number = n;
+}
+
+int32_t
+VCA::get_next_vca_number ()
+{
+ Glib::Threads::Mutex::Lock lm (number_lock);
+ return next_number;
+}
+
+VCA::VCA (Session& s, int32_t num, const string& name)
+ : Stripable (s, name, PresentationInfo (num, PresentationInfo::VCA))
+ , Muteable (s, name)
+ , Automatable (s)
+ , _number (num)
+ , _gain_control (new GainControl (s, Evoral::Parameter (GainAutomation), boost::shared_ptr<AutomationList> ()))
+{
+}
+
+int
+VCA::init ()
+{
+ _solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
+ _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
+
+ add_control (_gain_control);
+ add_control (_solo_control);
+ add_control (_mute_control);
+
+ return 0;
+}
+
+VCA::~VCA ()
+{
+ DEBUG_TRACE (DEBUG::Destruction, string_compose ("delete VCA %1\n", number()));
+ {
+ Glib::Threads::Mutex::Lock lm (number_lock);
+ if (_number == next_number - 1) {
+ /* this was the "last" VCA added, so rewind the next number so
+ * that future VCAs get numbered as intended
+ */
+ next_number--;
+ }
+ }
+}
+
+XMLNode&
+VCA::get_state ()
+{
+ XMLNode* node = new XMLNode (xml_node_name);
+ node->add_property (X_("name"), _name);
+ node->add_property (X_("number"), _number);
+
+ node->add_child_nocopy (_presentation_info.get_state());
+
+ node->add_child_nocopy (_gain_control->get_state());
+ node->add_child_nocopy (_solo_control->get_state());
+ node->add_child_nocopy (_mute_control->get_state());
+ node->add_child_nocopy (get_automation_xml_state());
+
+ node->add_child_nocopy (Slavable::get_state());
+
+ return *node;
+}
+
+int
+VCA::set_state (XMLNode const& node, int version)
+{
+ XMLProperty const* prop;
+
+ Stripable::set_state (node, version);
+
+ if ((prop = node.property ("name")) != 0) {
+ set_name (prop->value());
+ }
+
+ if ((prop = node.property ("number")) != 0) {
+ _number = atoi (prop->value());
+ }
+
+ XMLNodeList const &children (node.children());
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ if ((*i)->name() == Controllable::xml_node_name) {
+
+ XMLProperty* prop = (*i)->property ("name");
+
+ if (!prop) {
+ continue;
+ }
+
+ if (prop->value() == _gain_control->name()) {
+ _gain_control->set_state (**i, version);
+ }
+ if (prop->value() == _solo_control->name()) {
+ _solo_control->set_state (**i, version);
+ }
+ if (prop->value() == _mute_control->name()) {
+ _mute_control->set_state (**i, version);
+ }
+ } else if ((*i)->name() == Slavable::xml_node_name) {
+ Slavable::set_state (**i, version);
+ }
+ }
+
+ return 0;
+}
+
+void
+VCA::clear_all_solo_state ()
+{
+ _solo_control->clear_all_solo_state ();
+}
+
+MonitorState
+VCA::monitoring_state () const
+{
+ /* XXX this has to get more complex but not clear how */
+ return MonitoringInput;
+}
+
+bool
+VCA::slaved () const
+{
+ if (!_gain_control) {
+ return false;
+ }
+ /* just test one particular control, not all of them */
+ return _gain_control->slaved ();
+}
+
+bool
+VCA::slaved_to (boost::shared_ptr<VCA> vca) const
+{
+ if (!vca || !_gain_control) {
+ return false;
+ }
+
+ /* just test one particular control, not all of them */
+
+ return _gain_control->slaved_to (vca->gain_control());
+}
diff --git a/libs/ardour/vca_manager.cc b/libs/ardour/vca_manager.cc
new file mode 100644
index 0000000..20e9e38
--- /dev/null
+++ b/libs/ardour/vca_manager.cc
@@ -0,0 +1,199 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "pbd/convert.h"
+#include "pbd/error.h"
+#include "pbd/replace_all.h"
+
+#include "ardour/boost_debug.h"
+#include "ardour/session.h"
+#include "ardour/slavable.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace Glib::Threads;
+using namespace PBD;
+using std::string;
+
+string VCAManager::xml_node_name (X_("VCAManager"));
+
+VCAManager::VCAManager (Session& s)
+ : SessionHandleRef (s)
+ , _vcas_loaded (false)
+{
+}
+
+VCAManager::~VCAManager ()
+{
+ clear ();
+}
+
+void
+VCAManager::clear ()
+{
+ Mutex::Lock lm (lock);
+ for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+ (*i)->DropReferences ();
+ }
+ _vcas.clear ();
+}
+
+VCAList
+VCAManager::vcas () const
+{
+ Mutex::Lock lm (lock);
+ return _vcas;
+}
+
+int
+VCAManager::create_vca (uint32_t howmany, std::string const & name_template)
+{
+ VCAList vcal;
+
+ {
+ Mutex::Lock lm (lock);
+
+ for (uint32_t n = 0; n < howmany; ++n) {
+
+ int num = VCA::next_vca_number ();
+ string name = name_template;
+
+ if (name.find ("%n")) {
+ string sn = PBD::to_string (num, std::dec);
+ replace_all (name, "%n", sn);
+ }
+
+ boost::shared_ptr<VCA> vca = boost::shared_ptr<VCA> (new VCA (_session, num, name));
+ BOOST_MARK_VCA (vca);
+
+ vca->init ();
+
+ _vcas.push_back (vca);
+ vcal.push_back (vca);
+ }
+ }
+
+ VCAAdded (vcal); /* EMIT SIGNAL */
+
+ _session.set_dirty ();
+
+ return 0;
+}
+
+
+void
+VCAManager::remove_vca (boost::shared_ptr<VCA> vca)
+{
+ {
+ Mutex::Lock lm (lock);
+ _vcas.remove (vca);
+ }
+
+ /* this should cause deassignment and deletion */
+
+ vca->DropReferences ();
+
+ _session.set_dirty ();
+}
+
+boost::shared_ptr<VCA>
+VCAManager::vca_by_number (int32_t n) const
+{
+ Mutex::Lock lm (lock);
+
+ for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+ if ((*i)->number() == n) {
+ return *i;
+ }
+ }
+
+ return boost::shared_ptr<VCA>();
+}
+
+XMLNode&
+VCAManager::get_state ()
+{
+ XMLNode* node = new XMLNode (xml_node_name);
+
+ {
+ Mutex::Lock lm (lock);
+
+ for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+ node->add_child_nocopy ((*i)->get_state());
+ }
+ }
+
+ return *node;
+}
+
+int
+VCAManager::set_state (XMLNode const& node, int version)
+{
+ if (node.name() != xml_node_name) {
+ return -1;
+ }
+
+ XMLNodeList const & children = node.children();
+ VCAList vcal;
+
+ _vcas_loaded = false;
+
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ if ((*i)->name() == VCA::xml_node_name) {
+ boost::shared_ptr<VCA> vca = boost::shared_ptr<VCA> (new VCA (_session, 0, X_("tobereset")));
+ BOOST_MARK_VCA (vca);
+
+ if (vca->init() || vca->set_state (**i, version)) {
+ error << _("Cannot set state of a VCA") << endmsg;
+ return -1;
+ }
+
+ /* can't hold the lock for the entire loop,
+ * because the new VCA maybe slaved and needs
+ * to call back into us to set up its own
+ * slave/master relationship
+ */
+
+ {
+ Mutex::Lock lm (lock);
+ _vcas.push_back (vca);
+ vcal.push_back (vca);
+ }
+ }
+ }
+
+ _vcas_loaded = true;
+
+ VCAAdded (vcal); /* EMIT SIGNAL */
+
+ return 0;
+}
+
+void
+VCAManager::clear_all_solo_state ()
+{
+ Mutex::Lock lm (lock);
+
+ for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+ (*i)->clear_all_solo_state ();
+ }
+}
diff --git a/libs/ardour/vst_info_file.cc b/libs/ardour/vst_info_file.cc
index 68b376d..ca2ef91 100644
--- a/libs/ardour/vst_info_file.cc
+++ b/libs/ardour/vst_info_file.cc
@@ -52,7 +52,7 @@
#include "ardour/plugin_types.h"
#include "ardour/vst_info_file.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "sha1.c"
#define MAX_STRING_LEN 256
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index f04aa2b..8188354 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -33,7 +33,7 @@
#include "ardour/filesystem_paths.h"
#include "ardour/audio_buffer.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
@@ -44,8 +44,12 @@ VSTPlugin::VSTPlugin (AudioEngine& engine, Session& session, VSTHandle* handle)
, _handle (handle)
, _state (0)
, _plugin (0)
+ , _pi (0)
+ , _num (0)
+ , _transport_frame (0)
+ , _transport_speed (0.f)
{
-
+ memset (&_timeInfo, 0, sizeof(_timeInfo));
}
VSTPlugin::~VSTPlugin ()
@@ -87,9 +91,9 @@ VSTPlugin::set_block_size (pframes_t nframes)
}
float
-VSTPlugin::default_value (uint32_t)
+VSTPlugin::default_value (uint32_t which)
{
- return 0;
+ return _parameter_defaults[which];
}
float
@@ -158,7 +162,7 @@ VSTPlugin::set_chunk (gchar const * data, bool single)
void
VSTPlugin::add_state (XMLNode* root) const
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
@@ -195,7 +199,7 @@ VSTPlugin::add_state (XMLNode* root) const
int
VSTPlugin::set_state (const XMLNode& node, int version)
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
int ret = -1;
if (node.name() != state_node_name()) {
@@ -319,6 +323,9 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc)
desc.sr_dependent = false;
}
+ desc.normal = get_parameter (which);
+ _parameter_defaults[which] = desc.normal;
+
return 0;
}
@@ -375,7 +382,7 @@ VSTPlugin::load_user_preset (PresetRecord r)
XMLNode* root = t->root ();
for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
- XMLProperty* label = (*i)->property (X_("label"));
+ XMLProperty const * label = (*i)->property (X_("label"));
assert (label);
@@ -409,8 +416,8 @@ VSTPlugin::load_user_preset (PresetRecord r)
for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
if ((*j)->name() == X_("Parameter")) {
- XMLProperty* index = (*j)->property (X_("index"));
- XMLProperty* value = (*j)->property (X_("value"));
+ XMLProperty const * index = (*j)->property (X_("index"));
+ XMLProperty const * value = (*j)->property (X_("value"));
assert (index);
assert (value);
@@ -510,7 +517,11 @@ VSTPlugin::signal_latency () const
return _user_latency;
}
+#if ( defined(__x86_64__) || defined(_M_X64) )
+ return *((int32_t *) (((char *) &_plugin->flags) + 24)); /* initialDelay */
+#else
return *((int32_t *) (((char *) &_plugin->flags) + 12)); /* initialDelay */
+#endif
}
set<Evoral::Parameter>
@@ -527,10 +538,14 @@ VSTPlugin::automatable () const
int
VSTPlugin::connect_and_run (BufferSet& bufs,
+ framepos_t start, framepos_t end, double speed,
ChanMapping in_map, ChanMapping out_map,
pframes_t nframes, framecnt_t offset)
{
- Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
+ Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
+
+ _transport_frame = start;
+ _transport_speed = speed;
ChanCount bufs_count;
bufs_count.set(DataType::AUDIO, 1);
@@ -565,7 +580,12 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
uint32_t out_index = 0;
for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
- outs[i] = scratch_bufs.get_audio(i).data(offset);
+ uint32_t index;
+ bool valid = false;
+ index = out_map.get(DataType::AUDIO, out_index++, &valid);
+ outs[i] = (valid)
+ ? bufs.get_audio(index).data(offset)
+ : scratch_bufs.get_audio(0).data(offset);
}
if (bufs.count().n_midi() > 0) {
@@ -592,16 +612,6 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
_plugin->processReplacing (_plugin, &ins[0], &outs[0], nframes);
_midi_out_buf = 0;
- out_index = 0;
- for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
- uint32_t index;
- bool valid = false;
- index = out_map.get(DataType::AUDIO, out_index++, &valid);
- if (!valid) {
- continue;
- }
- copy_vector (bufs.get_audio(index).data(offset), outs[i], nframes);
- }
return 0;
}
@@ -703,8 +713,8 @@ VSTPlugin::find_presets ()
XMLNode* root = t->root ();
for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
- XMLProperty* uri = (*i)->property (X_("uri"));
- XMLProperty* label = (*i)->property (X_("label"));
+ XMLProperty const * uri = (*i)->property (X_("uri"));
+ XMLProperty const * label = (*i)->property (X_("label"));
assert (uri);
assert (label);
diff --git a/libs/ardour/windows_vst_plugin.cc b/libs/ardour/windows_vst_plugin.cc
index a480642..17cfa1e 100644
--- a/libs/ardour/windows_vst_plugin.cc
+++ b/libs/ardour/windows_vst_plugin.cc
@@ -26,7 +26,7 @@
#include "ardour/windows_vst_plugin.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
@@ -115,8 +115,8 @@ WindowsVSTPluginInfo::get_presets (bool user_only) const
if (t->read ()) {
XMLNode* root = t->root ();
for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
- XMLProperty* uri = (*i)->property (X_("uri"));
- XMLProperty* label = (*i)->property (X_("label"));
+ XMLProperty const * uri = (*i)->property (X_("uri"));
+ XMLProperty const * label = (*i)->property (X_("label"));
p.push_back (Plugin::PresetRecord (uri->value(), label->value(), true));
}
}
diff --git a/libs/ardour/worker.cc b/libs/ardour/worker.cc
index ce71c92..f8a5e44 100644
--- a/libs/ardour/worker.cc
+++ b/libs/ardour/worker.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012 Paul Davis
+ Copyright (C) 2012-2016 Paul Davis
Author: David Robillard
This program is free software; you can redistribute it and/or modify
@@ -27,26 +27,38 @@
namespace ARDOUR {
-Worker::Worker(Workee* workee, uint32_t ring_size)
+Worker::Worker(Workee* workee, uint32_t ring_size, bool threaded)
: _workee(workee)
- , _requests(new RingBuffer<uint8_t>(ring_size))
+ , _requests(threaded ? new RingBuffer<uint8_t>(ring_size) : NULL)
, _responses(new RingBuffer<uint8_t>(ring_size))
, _response((uint8_t*)malloc(ring_size))
- , _sem ("worker_semaphore", 0)
+ , _sem("worker_semaphore", 0)
+ , _thread(NULL)
, _exit(false)
- , _thread (Glib::Threads::Thread::create(sigc::mem_fun(*this, &Worker::run)))
-{}
+ , _synchronous(!threaded)
+{
+ if (threaded) {
+ _thread = Glib::Threads::Thread::create(
+ sigc::mem_fun(*this, &Worker::run));
+ }
+}
Worker::~Worker()
{
_exit = true;
_sem.signal();
- _thread->join();
+ if (_thread) {
+ _thread->join();
+ }
}
bool
Worker::schedule(uint32_t size, const void* data)
{
+ if (_synchronous || !_requests) {
+ _workee->work(*this, size, data);
+ return true;
+ }
if (_requests->write_space() < size + sizeof(size)) {
return false;
}
@@ -63,7 +75,7 @@ Worker::schedule(uint32_t size, const void* data)
bool
Worker::respond(uint32_t size, const void* data)
{
- if (_requests->write_space() < size + sizeof(size)) {
+ if (_responses->write_space() < size + sizeof(size)) {
return false;
}
if (_responses->write((const uint8_t*)&size, sizeof(size)) != sizeof(size)) {
@@ -124,7 +136,7 @@ Worker::run()
while (true) {
_sem.wait();
if (_exit) {
- if (buf) free(buf);
+ free(buf);
return;
}
@@ -163,7 +175,7 @@ Worker::run()
continue; // TODO: This is probably fatal
}
- _workee->work(size, buf);
+ _workee->work(*this, size, buf);
}
}
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index 22aeb21..d85e6a4 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -8,7 +8,7 @@ import subprocess
import sys
# default state file version for this build
-CURRENT_SESSION_FILE_VERSION = 3001
+CURRENT_SESSION_FILE_VERSION = 3002
I18N_PACKAGE = 'ardour'
@@ -21,6 +21,7 @@ path_prefix = 'libs/ardour/'
libardour_sources = [
'amp.cc',
'analyser.cc',
+ 'analysis_graph.cc',
'async_midi_port.cc',
'audio_backend.cc',
'audio_buffer.cc',
@@ -56,6 +57,8 @@ libardour_sources = [
'chan_count.cc',
'chan_mapping.cc',
'config_text.cc',
+ 'controllable_descriptor.cc',
+ 'control_group.cc',
'control_protocol_manager.cc',
'cycle_timer.cc',
'data_type.cc',
@@ -65,6 +68,7 @@ libardour_sources = [
'delivery.cc',
'directory_names.cc',
'diskstream.cc',
+ 'dsp_filter.cc',
'ebur128_analysis.cc',
'element_import_handler.cc',
'element_importer.cc',
@@ -90,6 +94,7 @@ libardour_sources = [
'filesystem_paths.cc',
'filter.cc',
'find_session.cc',
+ 'fixed_delay.cc',
'gain_control.cc',
'globals.cc',
'graph.cc',
@@ -110,6 +115,10 @@ libardour_sources = [
'location_importer.cc',
'ltc_file_reader.cc',
'ltc_slave.cc',
+ 'lua_api.cc',
+ 'luabindings.cc',
+ 'luaproc.cc',
+ 'luascripting.cc',
'meter.cc',
'midi_automation_list_binder.cc',
'midi_buffer.cc',
@@ -130,12 +139,15 @@ libardour_sources = [
'midi_stretch.cc',
'midi_track.cc',
'midi_ui.cc',
+ 'mididm.cc',
'midiport_manager.cc',
'mix.cc',
+ 'monitor_control.cc',
'monitor_processor.cc',
'mtc_slave.cc',
- 'mididm.cc',
'mtdm.cc',
+ 'muteable.cc',
+ 'mute_control.cc',
'mute_master.cc',
'note_fixer.cc',
'onset_detector.cc',
@@ -147,6 +159,7 @@ libardour_sources = [
'panner_shell.cc',
'parameter_descriptor.cc',
'pcm_utils.cc',
+ 'phase_control.cc',
'playlist.cc',
'playlist_factory.cc',
'playlist_source.cc',
@@ -157,19 +170,21 @@ libardour_sources = [
'port_insert.cc',
'port_manager.cc',
'port_set.cc',
+ 'presentation_info.cc',
'process_thread.cc',
'processor.cc',
'progress.cc',
'quantize.cc',
'rc_configuration.cc',
'recent_sessions.cc',
+ 'record_enable_control.cc',
+ 'record_safe_control.cc',
'region_factory.cc',
'resampled_source.cc',
'region.cc',
'return.cc',
'reverse.cc',
'route.cc',
- 'route_controls.cc',
'route_graph.cc',
'route_group.cc',
'route_group_member.cc',
@@ -197,16 +212,23 @@ libardour_sources = [
'session_state_utils.cc',
'session_time.cc',
'session_transport.cc',
+ 'sidechain.cc',
'slave.cc',
+ 'slavable.cc',
+ 'slavable_automation_control.cc',
'smf_source.cc',
'sndfile_helpers.cc',
'sndfileimportable.cc',
'sndfilesource.cc',
+ 'solo_control.cc',
+ 'solo_isolate_control.cc',
+ 'solo_safe_control.cc',
'soundcloud_upload.cc',
'source.cc',
'source_factory.cc',
'speakers.cc',
'srcfilesource.cc',
+ 'stripable.cc',
'strip_silence.cc',
'system_exec.cc',
'revision.cc',
@@ -223,6 +245,8 @@ libardour_sources = [
'unknown_processor.cc',
'user_bundle.cc',
'utils.cc',
+ 'vca.cc',
+ 'vca_manager.cc',
'vumeterdsp.cc',
'worker.cc'
]
@@ -290,6 +314,10 @@ def configure(conf):
atleast_version='0.6.0', mandatory=False)
conf.define ('LV2_SUPPORT', 1)
+ # non-standard LV2 extention -- TODO: add option to disable??
+ if conf.is_defined ('HAVE_LV2_1_10_0'):
+ conf.define ('LV2_EXTENDED', 1)
+
# autowaf.check_pkg(conf, 'soundtouch-1.0', uselib_store='SOUNDTOUCH',
# mandatory=False)
autowaf.check_pkg(conf, 'cppunit', uselib_store='CPPUNIT',
@@ -357,12 +385,13 @@ def build(bld):
obj.includes = ['.', '../surfaces/control_protocol', '..']
obj.name = 'libardour'
obj.target = 'ardour'
- obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
- 'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
+ obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID', 'LO',
+ 'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS', 'GIOMM',
'OSX','BOOST','CURL','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
obj.use = ['libpbd','libmidipp','libevoral',
'libaudiographer',
'libtimecode',
+ 'liblua',
]
if bld.env['build_target'] != 'mingw':
obj.uselib += ['DL']
@@ -442,7 +471,8 @@ def build(bld):
source = avx_sources,
cxxflags = avx_cxxflags,
includes = [ '.' ],
- use = [ 'libtimecode', 'libpbd', 'libevoral', ],
+ use = [ 'libtimecode', 'libpbd', 'libevoral', 'liblua' ],
+ uselib = [ 'GLIBMM', 'XML' ],
target = 'sse_avx_functions')
obj.use += ['sse_avx_functions' ]
diff --git a/libs/ardouralsautil/devicelist.cc b/libs/ardouralsautil/devicelist.cc
index 3fdb140..f642733 100644
--- a/libs/ardouralsautil/devicelist.cc
+++ b/libs/ardouralsautil/devicelist.cc
@@ -18,6 +18,8 @@
*/
#include <alsa/asoundlib.h>
+#include <glib.h>
+
#include "pbd/convert.h"
#include "ardouralsautil/devicelist.h"
@@ -34,6 +36,12 @@ ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices
string devname;
int cardnum = -1;
int device = -1;
+ const char* fixed_name;
+
+ if ((fixed_name = g_getenv ("ARDOUR_ALSA_DEVICE"))) {
+ devices.insert (make_pair<string,string> (fixed_name, fixed_name));
+ return;
+ }
assert (duplex > 0);
diff --git a/libs/ardouralsautil/wscript b/libs/ardouralsautil/wscript
index 60be052..fe53ddb 100644
--- a/libs/ardouralsautil/wscript
+++ b/libs/ardouralsautil/wscript
@@ -34,7 +34,7 @@ def build(bld):
obj.name = 'ardouralsautil'
obj.target = 'ardouralsautil'
obj.use = 'libpbd'
- obj.uselib = [ 'ALSA' ]
+ obj.uselib = [ 'ALSA', 'GLIBMM' ]
obj.vnum = '0.0.1'
obj.install_path = os.path.join(bld.env['LIBDIR'])
diff --git a/libs/audiographer/MSVCaudiographer/audiographer.vcproj b/libs/audiographer/MSVCaudiographer/audiographer.vcproj
index e3ffeaf..40e7d1f 100644
--- a/libs/audiographer/MSVCaudiographer/audiographer.vcproj
+++ b/libs/audiographer/MSVCaudiographer/audiographer.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -122,7 +122,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -201,7 +201,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -281,6 +281,10 @@
>
</File>
<File
+ RelativePath="..\src\general\loudness_reader.cc"
+ >
+ </File>
+ <File
RelativePath="..\src\general\normalizer.cc"
>
</File>
@@ -372,6 +376,10 @@
>
</File>
<File
+ RelativePath="..\audiographer\general\loudness_reader.h"
+ >
+ </File>
+ <File
RelativePath="..\private\gdither\noise.h"
>
</File>
@@ -434,7 +442,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/audiographer/audiographer/flag_debuggable.h b/libs/audiographer/audiographer/flag_debuggable.h
index f5d4fbf..5816fe8 100644
--- a/libs/audiographer/audiographer/flag_debuggable.h
+++ b/libs/audiographer/audiographer/flag_debuggable.h
@@ -14,7 +14,7 @@ namespace AudioGrapher
/// A debugging class for nodes that support a certain set of flags.
template<DebugLevel L = DEFAULT_DEBUG_LEVEL>
-class /*LIBAUDIOGRAPHER_API*/ FlagDebuggable : public Debuggable<L>
+class LIBAUDIOGRAPHER_API FlagDebuggable : public Debuggable<L>
{
public:
typedef FlagField::Flag Flag;
diff --git a/libs/audiographer/audiographer/general/analyser.h b/libs/audiographer/audiographer/general/analyser.h
index e8ca534..9bd49b3 100644
--- a/libs/audiographer/audiographer/general/analyser.h
+++ b/libs/audiographer/audiographer/general/analyser.h
@@ -20,20 +20,13 @@
#define AUDIOGRAPHER_ANALYSER_H
#include <fftw3.h>
-
-#include <vamp-hostsdk/PluginLoader.h>
-#include <vamp-sdk/Plugin.h>
-
-#include "audiographer/visibility.h"
-#include "audiographer/sink.h"
-#include "audiographer/utils/listed_source.h"
-
+#include "loudness_reader.h"
#include "ardour/export_analysis.h"
namespace AudioGrapher
{
-class LIBAUDIOGRAPHER_API Analyser : public ListedSource<float>, public Sink<float>
+class LIBAUDIOGRAPHER_API Analyser : public LoudnessReader
{
public:
Analyser (float sample_rate, unsigned int channels, framecnt_t bufsize, framecnt_t n_samples);
@@ -46,27 +39,20 @@ class LIBAUDIOGRAPHER_API Analyser : public ListedSource<float>, public Sink<flo
_result.norm_gain_factor = gain;
}
- using Sink<float>::process;
-
static const float fft_range_db;
+ using Sink<float>::process;
+
private:
float fft_power_at_bin (const uint32_t b, const float norm) const;
ARDOUR::ExportAnalysis _result;
- Vamp::Plugin* _ebur128_plugin;
- Vamp::Plugin** _dbtp_plugin;
- float _sample_rate;
- unsigned int _channels;
- framecnt_t _bufsize;
framecnt_t _n_samples;
framecnt_t _pos;
framecnt_t _spp;
framecnt_t _fpp;
- float* _bufs[2];
-
float* _hann_window;
uint32_t _fft_data_size;
double _fft_freq_per_bin;
@@ -74,7 +60,6 @@ class LIBAUDIOGRAPHER_API Analyser : public ListedSource<float>, public Sink<flo
float* _fft_data_out;
float* _fft_power;
fftwf_plan _fft_plan;
-
};
} // namespace
diff --git a/libs/audiographer/audiographer/general/loudness_reader.h b/libs/audiographer/audiographer/general/loudness_reader.h
new file mode 100644
index 0000000..7431f5e
--- /dev/null
+++ b/libs/audiographer/audiographer/general/loudness_reader.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef AUDIOGRAPHER_LOUDNESS_READER_H
+#define AUDIOGRAPHER_LOUDNESS_READER_H
+
+#include <vamp-hostsdk/PluginLoader.h>
+#include <vamp-sdk/Plugin.h>
+
+#include "audiographer/visibility.h"
+#include "audiographer/sink.h"
+#include "audiographer/routines.h"
+#include "audiographer/utils/listed_source.h"
+
+namespace AudioGrapher
+{
+
+class LIBAUDIOGRAPHER_API LoudnessReader : public ListedSource<float>, public Sink<float>
+{
+ public:
+ LoudnessReader (float sample_rate, unsigned int channels, framecnt_t bufsize);
+ ~LoudnessReader ();
+
+ void reset ();
+
+ float get_normalize_gain (float target_lufs, float target_dbtp);
+ float get_peak (float target_lufs = -23.f, float target_dbtp = -1.f) {
+ return 1.f / get_normalize_gain (target_lufs, target_dbtp);
+ }
+
+ virtual void process (ProcessContext<float> const & c);
+
+ using Sink<float>::process;
+
+ protected:
+ Vamp::Plugin* _ebur_plugin;
+ Vamp::Plugin** _dbtp_plugin;
+
+ float _sample_rate;
+ unsigned int _channels;
+ framecnt_t _bufsize;
+ framecnt_t _pos;
+ float* _bufs[2];
+};
+
+} // namespace
+
+
+#endif // AUDIOGRAPHER_LOUDNESS_READER_H
diff --git a/libs/audiographer/audiographer/sndfile/sndfile_writer.h b/libs/audiographer/audiographer/sndfile/sndfile_writer.h
index 57ad968..81f0ddb 100644
--- a/libs/audiographer/audiographer/sndfile/sndfile_writer.h
+++ b/libs/audiographer/audiographer/sndfile/sndfile_writer.h
@@ -40,19 +40,13 @@ class SndfileWriter
virtual ~SndfileWriter () {}
- SndfileWriter (SndfileWriter const & other)
- : SndfileHandle (other)
- {
- init();
- }
-
using SndfileHandle::operator=;
framecnt_t get_frames_written() const { return frames_written; }
void reset_frames_written_count() { frames_written = 0; }
/// Writes data to file
- void process (ProcessContext<T> const & c)
+ virtual void process (ProcessContext<T> const & c)
{
check_flags (*this, c);
@@ -88,7 +82,7 @@ class SndfileWriter
init();
}
- void init()
+ virtual void init()
{
frames_written = 0;
add_supported_flag (ProcessContext<T>::EndOfInput);
@@ -97,6 +91,9 @@ class SndfileWriter
protected:
std::string path;
framecnt_t frames_written;
+
+ private:
+ SndfileWriter (SndfileWriter const & other) {}
};
} // namespace
diff --git a/libs/audiographer/audiographer/sndfile/tmp_file.h b/libs/audiographer/audiographer/sndfile/tmp_file.h
index 296fcdf..d6bc554 100644
--- a/libs/audiographer/audiographer/sndfile/tmp_file.h
+++ b/libs/audiographer/audiographer/sndfile/tmp_file.h
@@ -15,36 +15,14 @@ namespace AudioGrapher
/// A temporary file deleted after this class is destructed
template<typename T = DefaultSampleType>
-class TmpFile : public SndfileWriter<T>, public SndfileReader<T>
+class TmpFile
+ : public SndfileWriter<T>
+ , public SndfileReader<T>
{
public:
+ virtual ~TmpFile () {}
+ PBD::Signal0<void> FileFlushed;
- /// \a filename_template must match the requirements for mkstemp, i.e. end in "XXXXXX"
- TmpFile (char * filename_template, int format, ChannelCount channels, framecnt_t samplerate)
- : SndfileHandle (g_mkstemp(filename_template), true, SndfileBase::ReadWrite, format, channels, samplerate)
- , filename (filename_template)
- {}
-
- TmpFile (int format, ChannelCount channels, framecnt_t samplerate)
- : SndfileHandle (fileno (tmpfile()), true, SndfileBase::ReadWrite, format, channels, samplerate)
- {}
-
- TmpFile (TmpFile const & other) : SndfileHandle (other) {}
- using SndfileHandle::operator=;
-
- ~TmpFile()
- {
- /* explicitly close first, some OS (yes I'm looking at you windows)
- * cannot delet files that are still open
- */
- if (!filename.empty()) {
- SndfileBase::close();
- std::remove(filename.c_str());
- }
- }
-
- private:
- std::string filename;
};
} // namespace
diff --git a/libs/audiographer/audiographer/sndfile/tmp_file_rt.h b/libs/audiographer/audiographer/sndfile/tmp_file_rt.h
new file mode 100644
index 0000000..86e363c
--- /dev/null
+++ b/libs/audiographer/audiographer/sndfile/tmp_file_rt.h
@@ -0,0 +1,171 @@
+#ifndef AUDIOGRAPHER_TMP_FILE_RT_H
+#define AUDIOGRAPHER_TMP_FILE_RT_H
+
+#include <cstdio>
+#include <string>
+
+#include <glib.h>
+#include "pbd/gstdio_compat.h"
+#include "pbd/ringbuffer.h"
+
+#include "audiographer/flag_debuggable.h"
+#include "audiographer/sink.h"
+#include "sndfile_writer.h"
+#include "sndfile_reader.h"
+#include "tmp_file.h"
+
+namespace AudioGrapher
+{
+
+ static const framecnt_t rb_chunksize = 8192; // samples
+
+/** A temporary file deleted after this class is destructed
+ * with realtime safe background thread writer.
+ */
+template<typename T = DefaultSampleType>
+class TmpFileRt
+ : public TmpFile<T>
+{
+ public:
+
+ /// \a filename_template must match the requirements for mkstemp, i.e. end in "XXXXXX"
+ TmpFileRt (char * filename_template, int format, ChannelCount channels, framecnt_t samplerate)
+ : SndfileHandle (g_mkstemp(filename_template), true, SndfileBase::ReadWrite, format, channels, samplerate)
+ , filename (filename_template)
+ , _chunksize (rb_chunksize * channels)
+ , _rb (std::max (_chunksize * 16, 5 * samplerate * channels))
+ {
+ init ();
+ }
+
+ using SndfileHandle::operator=;
+
+ ~TmpFileRt()
+ {
+ end_write ();
+ /* explicitly close first, some OS (yes I'm looking at you windows)
+ * cannot delete files that are still open
+ */
+ if (!filename.empty()) {
+ SndfileBase::close();
+ std::remove(filename.c_str());
+ }
+ pthread_mutex_destroy (&_disk_thread_lock);
+ pthread_cond_destroy (&_data_ready);
+ }
+
+ /// Writes data to file
+ void process (ProcessContext<T> const & c)
+ {
+ SndfileWriter<T>::check_flags (*this, c);
+
+ if (SndfileWriter<T>::throw_level (ThrowStrict) && c.channels() != SndfileHandle::channels()) {
+ throw Exception (*this, boost::str (boost::format
+ ("Wrong number of channels given to process(), %1% instead of %2%")
+ % c.channels() % SndfileHandle::channels()));
+ }
+
+ if (SndfileWriter<T>::throw_level (ThrowProcess) && _rb.write_space() < c.frames()) {
+ throw Exception (*this, boost::str (boost::format
+ ("Could not write data to ringbuffer/output file (%1%)")
+ % SndfileHandle::strError()));
+ }
+
+ _rb.write (c.data(), c.frames());
+
+ if (c.has_flag(ProcessContext<T>::EndOfInput)) {
+ _capture = false;
+ SndfileWriter<T>::FileWritten (filename);
+ }
+
+ if (pthread_mutex_trylock (&_disk_thread_lock) == 0) {
+ pthread_cond_signal (&_data_ready);
+ pthread_mutex_unlock (&_disk_thread_lock);
+ }
+ }
+
+ using Sink<T>::process;
+
+ void disk_thread ()
+ {
+ T *framebuf = (T*) malloc (_chunksize * sizeof (T));
+
+ pthread_mutex_lock (&_disk_thread_lock);
+
+ while (_capture) {
+ if ((framecnt_t)_rb.read_space () >= _chunksize) {
+ _rb.read (framebuf, _chunksize);
+ framecnt_t const written = SndfileBase::write (framebuf, _chunksize);
+ assert (written == _chunksize);
+ SndfileWriter<T>::frames_written += written;
+ }
+ if (!_capture) {
+ break;
+ }
+ pthread_cond_wait (&_data_ready, &_disk_thread_lock);
+ }
+
+ // flush ringbuffer
+ while (_rb.read_space () > 0) {
+ size_t remain = std::min ((framecnt_t)_rb.read_space (), _chunksize);
+ _rb.read (framebuf, remain);
+ framecnt_t const written = SndfileBase::write (framebuf, remain);
+ SndfileWriter<T>::frames_written += written;
+ }
+
+ SndfileWriter<T>::writeSync();
+ pthread_mutex_unlock (&_disk_thread_lock);
+ free (framebuf);
+ TmpFile<T>::FileFlushed ();
+ }
+
+ protected:
+ std::string filename;
+
+ bool _capture;
+ framecnt_t _chunksize;
+ RingBuffer<T> _rb;
+
+ pthread_mutex_t _disk_thread_lock;
+ pthread_cond_t _data_ready;
+ pthread_t _thread_id;
+
+ static void * _disk_thread (void *arg)
+ {
+ TmpFileRt *d = static_cast<TmpFileRt *>(arg);
+ d->disk_thread ();
+ pthread_exit (0);
+ return 0;
+ }
+
+ void end_write () {
+ pthread_mutex_lock (&_disk_thread_lock);
+ _capture = false;
+ pthread_cond_signal (&_data_ready);
+ pthread_mutex_unlock (&_disk_thread_lock);
+ pthread_join (_thread_id, NULL);
+ }
+
+ void init()
+ {
+ SndfileWriter<T>::frames_written = 0;
+ _capture = true;
+ SndfileWriter<T>::add_supported_flag (ProcessContext<T>::EndOfInput);
+ pthread_mutex_init (&_disk_thread_lock, 0);
+ pthread_cond_init (&_data_ready, 0);
+
+ if (pthread_create (&_thread_id, NULL, _disk_thread, this)) {
+ _capture = false;
+ if (SndfileWriter<T>::throw_level (ThrowStrict)) {
+ throw Exception (*this, "Cannot create export disk writer");
+ }
+ }
+ }
+
+ private:
+ TmpFileRt (TmpFileRt const & other) : SndfileHandle (other) {}
+};
+
+} // namespace
+
+#endif // AUDIOGRAPHER_TMP_FILE_RT_H
diff --git a/libs/audiographer/audiographer/sndfile/tmp_file_sync.h b/libs/audiographer/audiographer/sndfile/tmp_file_sync.h
new file mode 100644
index 0000000..7807346
--- /dev/null
+++ b/libs/audiographer/audiographer/sndfile/tmp_file_sync.h
@@ -0,0 +1,65 @@
+#ifndef AUDIOGRAPHER_TMP_FILE_SYNC_H
+#define AUDIOGRAPHER_TMP_FILE_SYNC_H
+
+#include <cstdio>
+#include <string>
+
+#include <glib.h>
+#include "pbd/gstdio_compat.h"
+
+#include "sndfile_writer.h"
+#include "sndfile_reader.h"
+#include "tmp_file.h"
+
+namespace AudioGrapher
+{
+
+/// A temporary file deleted after this class is destructed
+template<typename T = DefaultSampleType>
+class TmpFileSync
+ : public TmpFile<T>
+{
+ public:
+
+ /// \a filename_template must match the requirements for mkstemp, i.e. end in "XXXXXX"
+ TmpFileSync (char * filename_template, int format, ChannelCount channels, framecnt_t samplerate)
+ : SndfileHandle (g_mkstemp(filename_template), true, SndfileBase::ReadWrite, format, channels, samplerate)
+ , filename (filename_template)
+ {}
+
+ TmpFileSync (int format, ChannelCount channels, framecnt_t samplerate)
+ : SndfileHandle (fileno (tmpfile()), true, SndfileBase::ReadWrite, format, channels, samplerate)
+ {}
+
+ TmpFileSync (TmpFileSync const & other) : SndfileHandle (other) {}
+ using SndfileHandle::operator=;
+
+ ~TmpFileSync()
+ {
+ /* explicitly close first, some OS (yes I'm looking at you windows)
+ * cannot delete files that are still open
+ */
+ if (!filename.empty()) {
+ SndfileBase::close();
+ std::remove(filename.c_str());
+ }
+ }
+
+ void process (ProcessContext<T> const & c)
+ {
+ SndfileWriter<T>::process (c);
+
+ if (c.has_flag(ProcessContext<T>::EndOfInput)) {
+ TmpFile<T>::FileFlushed ();
+ }
+ }
+
+ using Sink<T>::process;
+
+ private:
+ std::string filename;
+};
+
+} // namespace
+
+#endif // AUDIOGRAPHER_TMP_FILE_SYNC_H
diff --git a/libs/audiographer/audiographer/throwing.h b/libs/audiographer/audiographer/throwing.h
index 8bd8415..0d8c2a8 100644
--- a/libs/audiographer/audiographer/throwing.h
+++ b/libs/audiographer/audiographer/throwing.h
@@ -40,7 +40,7 @@ enum /*LIBAUDIOGRAPHER_API*/ ThrowLevel
* logical and (short-circuiting).
*/
template<ThrowLevel L = DEFAULT_THROW_LEVEL>
-class /*LIBAUDIOGRAPHER_API*/ Throwing
+class LIBAUDIOGRAPHER_API Throwing
{
protected:
Throwing() {}
diff --git a/libs/audiographer/src/general/analyser.cc b/libs/audiographer/src/general/analyser.cc
index 459cd6a..84120b6 100644
--- a/libs/audiographer/src/general/analyser.cc
+++ b/libs/audiographer/src/general/analyser.cc
@@ -24,44 +24,16 @@ using namespace AudioGrapher;
const float Analyser::fft_range_db (120); // dB
Analyser::Analyser (float sample_rate, unsigned int channels, framecnt_t bufsize, framecnt_t n_samples)
- : _ebur128_plugin (0)
- , _dbtp_plugin (0)
- , _sample_rate (sample_rate)
- , _channels (channels)
- , _bufsize (bufsize / channels)
+ : LoudnessReader (sample_rate, channels, bufsize)
, _n_samples (n_samples)
, _pos (0)
{
//printf ("NEW ANALYSER %p r:%.1f c:%d f:%ld l%ld\n", this, sample_rate, channels, bufsize, n_samples);
assert (bufsize % channels == 0);
assert (bufsize > 1);
- if (channels > 0 && channels <= 2) {
- using namespace Vamp::HostExt;
- PluginLoader* loader (PluginLoader::getInstance ());
- _ebur128_plugin = loader->loadPlugin ("libardourvampplugins:ebur128", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
- assert (_ebur128_plugin);
- _ebur128_plugin->reset ();
- if (!_ebur128_plugin->initialise (channels, _bufsize, _bufsize)) {
- delete _ebur128_plugin;
- _ebur128_plugin = 0;
- }
- }
+ assert (_bufsize > 0);
- _dbtp_plugin = (Vamp::Plugin**) malloc (sizeof(Vamp::Plugin*) * channels);
- for (unsigned int c = 0; c < _channels; ++c) {
- using namespace Vamp::HostExt;
- PluginLoader* loader (PluginLoader::getInstance ());
- _dbtp_plugin[c] = loader->loadPlugin ("libardourvampplugins:dBTP", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
- assert (_dbtp_plugin[c]);
- _dbtp_plugin[c]->reset ();
- if (!_dbtp_plugin[c]->initialise (1, _bufsize, _bufsize)) {
- delete _dbtp_plugin[c];
- _dbtp_plugin[c] = 0;
- }
- }
- _bufs[0] = (float*) malloc (sizeof (float) * _bufsize);
- _bufs[1] = (float*) malloc (sizeof (float) * _bufsize);
const size_t peaks = sizeof (_result.peaks) / sizeof (ARDOUR::PeakData::PeakDatum) / 4;
_spp = ceil ((_n_samples + 2.f) / (float) peaks);
@@ -122,13 +94,6 @@ Analyser::Analyser (float sample_rate, unsigned int channels, framecnt_t bufsize
Analyser::~Analyser ()
{
- delete _ebur128_plugin;
- for (unsigned int c = 0; c < _channels; ++c) {
- delete _dbtp_plugin[c];
- }
- free (_dbtp_plugin);
- free (_bufs[0]);
- free (_bufs[1]);
fftwf_destroy_plan (_fft_plan);
fftwf_free (_fft_data_in);
fftwf_free (_fft_data_out);
@@ -161,7 +126,9 @@ Analyser::process (ProcessContext<float> const & ctx)
for (unsigned int c = 0; c < _channels; ++c) {
const float v = *d;
if (fabsf(v) > _result.peak) { _result.peak = fabsf(v); }
- _bufs[c][s] = v;
+ if (c < _result.n_channels) {
+ _bufs[c][s] = v;
+ }
const unsigned int cc = c & cmask;
if (_result.peaks[cc][pbin].min > v) { _result.peaks[cc][pbin].min = *d; }
if (_result.peaks[cc][pbin].max < v) { _result.peaks[cc][pbin].max = *d; }
@@ -172,13 +139,13 @@ Analyser::process (ProcessContext<float> const & ctx)
for (; s < _bufsize; ++s) {
_fft_data_in[s] = 0;
- for (unsigned int c = 0; c < _channels; ++c) {
+ for (unsigned int c = 0; c < _result.n_channels; ++c) {
_bufs[c][s] = 0.f;
}
}
- if (_ebur128_plugin) {
- _ebur128_plugin->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+ if (_ebur_plugin) {
+ _ebur_plugin->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
}
float const * const data = ctx.data ();
@@ -265,8 +232,8 @@ Analyser::result ()
}
}
- if (_ebur128_plugin) {
- Vamp::Plugin::FeatureSet features = _ebur128_plugin->getRemainingFeatures ();
+ if (_ebur_plugin) {
+ Vamp::Plugin::FeatureSet features = _ebur_plugin->getRemainingFeatures ();
if (!features.empty () && features.size () == 3) {
_result.loudness = features[0][0].values[0];
_result.loudness_range = features[1][0].values[0];
diff --git a/libs/audiographer/src/general/loudness_reader.cc b/libs/audiographer/src/general/loudness_reader.cc
new file mode 100644
index 0000000..0c2e361
--- /dev/null
+++ b/libs/audiographer/src/general/loudness_reader.cc
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "audiographer/general/loudness_reader.h"
+#include "pbd/fastlog.h"
+
+using namespace AudioGrapher;
+
+LoudnessReader::LoudnessReader (float sample_rate, unsigned int channels, framecnt_t bufsize)
+ : _ebur_plugin (0)
+ , _dbtp_plugin (0)
+ , _sample_rate (sample_rate)
+ , _channels (channels)
+ , _bufsize (bufsize / channels)
+ , _pos (0)
+{
+ //printf ("NEW LoudnessReader %p r:%.1f c:%d f:%ld\n", this, sample_rate, channels, bufsize);
+ assert (bufsize % channels == 0);
+ assert (bufsize > 1);
+ assert (_bufsize > 0);
+
+ if (channels > 0 && channels <= 2) {
+ using namespace Vamp::HostExt;
+ PluginLoader* loader (PluginLoader::getInstance ());
+ _ebur_plugin = loader->loadPlugin ("libardourvampplugins:ebur128", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
+ assert (_ebur_plugin);
+ _ebur_plugin->reset ();
+ if (!_ebur_plugin->initialise (channels, _bufsize, _bufsize)) {
+ delete _ebur_plugin;
+ _ebur_plugin = 0;
+ }
+ }
+
+ _dbtp_plugin = (Vamp::Plugin**) malloc (sizeof(Vamp::Plugin*) * channels);
+ for (unsigned int c = 0; c < _channels; ++c) {
+ using namespace Vamp::HostExt;
+ PluginLoader* loader (PluginLoader::getInstance ());
+ _dbtp_plugin[c] = loader->loadPlugin ("libardourvampplugins:dBTP", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
+ assert (_dbtp_plugin[c]);
+ _dbtp_plugin[c]->reset ();
+ if (!_dbtp_plugin[c]->initialise (1, _bufsize, _bufsize)) {
+ delete _dbtp_plugin[c];
+ _dbtp_plugin[c] = 0;
+ }
+ }
+
+ _bufs[0] = (float*) malloc (sizeof (float) * _bufsize);
+ _bufs[1] = (float*) malloc (sizeof (float) * _bufsize);
+}
+
+LoudnessReader::~LoudnessReader ()
+{
+ delete _ebur_plugin;
+ for (unsigned int c = 0; c < _channels; ++c) {
+ delete _dbtp_plugin[c];
+ }
+ free (_dbtp_plugin);
+ free (_bufs[0]);
+ free (_bufs[1]);
+}
+
+void
+LoudnessReader::reset ()
+{
+ if (_ebur_plugin) {
+ _ebur_plugin->reset ();
+ }
+
+ for (unsigned int c = 0; c < _channels; ++c) {
+ if (_dbtp_plugin[c]) {
+ _dbtp_plugin[c]->reset ();
+ }
+ }
+}
+
+void
+LoudnessReader::process (ProcessContext<float> const & ctx)
+{
+ const framecnt_t n_samples = ctx.frames () / ctx.channels ();
+ assert (ctx.channels () == _channels);
+ assert (ctx.frames () % ctx.channels () == 0);
+ assert (n_samples <= _bufsize);
+ //printf ("PROC %p @%ld F: %ld, S: %ld C:%d\n", this, _pos, ctx.frames (), n_samples, ctx.channels ());
+
+ unsigned processed_channels = 0;
+ if (_ebur_plugin) {
+ assert (_channels <= 2);
+ processed_channels = _channels;
+ framecnt_t s;
+ float const * d = ctx.data ();
+ for (s = 0; s < n_samples; ++s) {
+ for (unsigned int c = 0; c < _channels; ++c, ++d) {
+ _bufs[c][s] = *d;
+ }
+ }
+ for (; s < _bufsize; ++s) {
+ for (unsigned int c = 0; c < _channels; ++c) {
+ _bufs[c][s] = 0.f;
+ }
+ }
+ _ebur_plugin->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+ if (_dbtp_plugin[0]) {
+ _dbtp_plugin[0]->process (&_bufs[0], Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+ }
+ if (_channels == 2 && _dbtp_plugin[1]) {
+ _dbtp_plugin[0]->process (&_bufs[1], Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+ }
+ }
+
+ for (unsigned int c = processed_channels; c < _channels; ++c) {
+ if (!_dbtp_plugin[c]) {
+ continue;
+ }
+ framecnt_t s;
+ float const * const d = ctx.data ();
+ for (s = 0; s < n_samples; ++s) {
+ _bufs[0][s] = d[s * _channels + c];
+ }
+ for (; s < _bufsize; ++s) {
+ _bufs[0][s] = 0.f;
+ }
+ _dbtp_plugin[c]->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+ }
+
+ _pos += n_samples;
+ ListedSource<float>::output (ctx);
+}
+
+float
+LoudnessReader::get_normalize_gain (float target_lufs, float target_dbtp)
+{
+ float dBTP = 0;
+ float LUFS = -200;
+ uint32_t have_lufs = 0;
+ uint32_t have_dbtp = 0;
+
+ if (_ebur_plugin) {
+ Vamp::Plugin::FeatureSet features = _ebur_plugin->getRemainingFeatures ();
+ if (!features.empty () && features.size () == 3) {
+ const float lufs = features[0][0].values[0];
+ LUFS = std::max (LUFS, lufs);
+ ++have_lufs;
+ }
+ }
+
+ for (unsigned int c = 0; c < _channels; ++c) {
+ if (_dbtp_plugin[c]) {
+ Vamp::Plugin::FeatureSet features = _dbtp_plugin[c]->getRemainingFeatures ();
+ if (!features.empty () && features.size () == 2) {
+ const float dbtp = features[0][0].values[0];
+ dBTP = std::max (dBTP, dbtp);
+ ++have_dbtp;
+ }
+ }
+ }
+
+ float g = 100000.0; // +100dB
+ bool set = false;
+ if (have_lufs && LUFS > -180.0f && target_lufs <= 0.f) {
+ const float ge = pow (10.f, (target_lufs * 0.05f)) / pow (10.f, (LUFS * 0.05f));
+ //printf ("LU: %f LUFS, %f\n", LUFS, ge);
+ g = std::min (g, ge);
+ set = true;
+ }
+
+ // TODO check that all channels were used.. ? (have_dbtp == _channels)
+ if (have_dbtp && dBTP > 0.f && target_dbtp <= 0.f) {
+ const float ge = pow (10.f, (target_dbtp * 0.05f)) / dBTP;
+ //printf ("TP:(%d chn) %fdBTP -> %f\n", have_dbtp, dBTP, ge);
+ g = std::min (g, ge);
+ set = true;
+ }
+
+ if (!set) {
+ g = 1.f;
+ }
+ //printf ("LF %f / %f\n", g, 1.f / g);
+ return g;
+}
diff --git a/libs/audiographer/src/general/sr_converter.cc b/libs/audiographer/src/general/sr_converter.cc
index 9b5fa80..74da2ae 100644
--- a/libs/audiographer/src/general/sr_converter.cc
+++ b/libs/audiographer/src/general/sr_converter.cc
@@ -89,7 +89,7 @@ SampleRateConverter::allocate_buffers (framecnt_t max_frames)
max_leftover_frames = 4 * max_frames;
leftover_data = (float *) realloc (leftover_data, max_leftover_frames * sizeof (float));
if (throw_level (ThrowObject) && !leftover_data) {
- throw Exception (*this, "A memory allocation error occured");
+ throw Exception (*this, "A memory allocation error occurred");
}
max_frames_in = max_frames;
@@ -164,7 +164,7 @@ SampleRateConverter::process (ProcessContext<float> const & c)
err = src_process (src_state, &src_data);
if (throw_level (ThrowProcess) && err) {
throw Exception (*this, str (format
- ("An error occured during sample rate conversion: %1%")
+ ("An error occurred during sample rate conversion: %1%")
% src_strerror (err)));
}
diff --git a/libs/audiographer/tests/sndfile/tmp_file_test.cc b/libs/audiographer/tests/sndfile/tmp_file_test.cc
index 32e3913..9748623 100644
--- a/libs/audiographer/tests/sndfile/tmp_file_test.cc
+++ b/libs/audiographer/tests/sndfile/tmp_file_test.cc
@@ -1,5 +1,5 @@
#include "tests/utils.h"
-#include "audiographer/sndfile/tmp_file.h"
+#include "audiographer/sndfile/tmp_file_sync.h"
using namespace AudioGrapher;
@@ -24,7 +24,7 @@ class TmpFileTest : public CppUnit::TestFixture
void testProcess()
{
uint32_t channels = 2;
- file.reset (new TmpFile<float>(SF_FORMAT_WAV | SF_FORMAT_FLOAT, channels, 44100));
+ file.reset (new TmpFileSync<float>(SF_FORMAT_WAV | SF_FORMAT_FLOAT, channels, 44100));
AllocatingProcessContext<float> c (random_data, frames, channels);
c.set_flag (ProcessContext<float>::EndOfInput);
file->process (c);
@@ -37,7 +37,7 @@ class TmpFileTest : public CppUnit::TestFixture
}
private:
- boost::shared_ptr<TmpFile<float> > file;
+ boost::shared_ptr<TmpFileSync<float> > file;
float * random_data;
framecnt_t frames;
diff --git a/libs/audiographer/wscript b/libs/audiographer/wscript
index 17e7482..7ac9f8f 100644
--- a/libs/audiographer/wscript
+++ b/libs/audiographer/wscript
@@ -66,6 +66,7 @@ def build(bld):
'src/debug_utils.cc',
'src/general/analyser.cc',
'src/general/broadcast_info.cc',
+ 'src/general/loudness_reader.cc',
'src/general/normalizer.cc'
]
if bld.is_defined('HAVE_SAMPLERATE'):
@@ -85,7 +86,7 @@ def build(bld):
audiographer.target = 'audiographer'
audiographer.export_includes = ['.', './src']
audiographer.includes = ['.', './src','../ardour','../timecode','../evoral']
- audiographer.uselib = 'GLIB GLIBMM GTHREAD SAMPLERATE SNDFILE FFTW3F VAMPSDK VAMPHOSTSDK'
+ audiographer.uselib = 'GLIB GLIBMM GTHREAD SAMPLERATE SNDFILE FFTW3F VAMPSDK VAMPHOSTSDK XML'
audiographer.use = 'libpbd'
audiographer.vnum = AUDIOGRAPHER_LIB_VERSION
audiographer.install_path = bld.env['LIBDIR']
diff --git a/libs/backends/MSVCbackends/dummy_audiobackend.vcproj b/libs/backends/MSVCbackends/dummy_audiobackend.vcproj
index f7f45c2..e37ac97 100644
--- a/libs/backends/MSVCbackends/dummy_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/dummy_audiobackend.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\dummy;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\.."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -124,7 +124,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\dummy;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\.."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -206,7 +206,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\dummy;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\.."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -293,7 +293,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/backends/MSVCbackends/jack_audiobackend.vcproj b/libs/backends/MSVCbackends/jack_audiobackend.vcproj
index 2c22fe8..ad93d7f 100644
--- a/libs/backends/MSVCbackends/jack_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/jack_audiobackend.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_JACK_PORT_RENAME=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_JACK_PORT_RENAME=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_JACK_PORT_RENAME=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -324,7 +324,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj b/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
index 5562f42..c8ec8c4 100644
--- a/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -124,7 +124,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -206,7 +206,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -349,7 +349,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/backends/MSVCbackends/waves_audiobackend.vcproj b/libs/backends/MSVCbackends/waves_audiobackend.vcproj
index 06f4ae1..4816b0c 100644
--- a/libs/backends/MSVCbackends/waves_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/waves_audiobackend.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\wavesaudio;..\wavesaudio\wavesapi;..\wavesaudio\wavesapi\wavespublicapi;..\wavesaudio\wavesapi\devicemanager;..\wavesaudio\wavesapi\refmanager;..\wavesaudio\wavesapi\threads;..\wavesaudio\wavesapi\miscutils;..\wavesaudio\portmidi\src\pm_common;..\wavesaudio\portmidi;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3WavesPortaudio\include;..\..\..\..\support\MB3WavesPortaudio\src\hostapi\asio\ASIOSDK\common;..\.."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -124,7 +124,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\wavesaudio;..\wavesaudio\wavesapi;..\wavesaudio\wavesapi\wavespublicapi;..\wavesaudio\wavesapi\devicemanager;..\wavesaudio\wavesapi\refmanager;..\wavesaudio\wavesapi\threads;..\wavesaudio\wavesapi\miscutils;..\wavesaudio\portmidi\src\pm_common;..\wavesaudio\portmidi;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3WavesPortaudio\include;..\..\..\..\support\MB3WavesPortaudio\src\hostapi\asio\ASIOSDK\common;..\.."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -205,7 +205,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\wavesaudio;..\wavesaudio\wavesapi;..\wavesaudio\wavesapi\wavespublicapi;..\wavesaudio\wavesapi\devicemanager;..\wavesaudio\wavesapi\refmanager;..\wavesaudio\wavesapi\threads;..\wavesaudio\wavesapi\miscutils;..\wavesaudio\portmidi\src\pm_common;..\wavesaudio\portmidi;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3WavesPortaudio\include;..\..\..\..\support\MB3WavesPortaudio\src\hostapi\asio\ASIOSDK\common;..\.."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -524,7 +524,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc
index 3658aa3..5c267d6 100644
--- a/libs/backends/alsa/alsa_audiobackend.cc
+++ b/libs/backends/alsa/alsa_audiobackend.cc
@@ -32,7 +32,7 @@
#include "ardour/filesystem_paths.h"
#include "ardour/port_manager.h"
#include "ardouralsautil/devicelist.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -809,13 +809,14 @@ AlsaAudioBackend::_start (bool for_latency_measurement)
return BackendReinitializationError;
}
- if (_ports.size()) {
+ if (_ports.size () || _portmap.size ()) {
PBD::warning << _("AlsaAudioBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
_system_inputs.clear();
_system_outputs.clear();
_system_midi_in.clear();
_system_midi_out.clear();
_ports.clear();
+ _portmap.clear();
}
/* reset internal state */
@@ -1209,11 +1210,20 @@ AlsaAudioBackend::port_name_size () const
int
AlsaAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
{
+ std::string newname (_instance_name + ":" + name);
if (!valid_port (port)) {
- PBD::error << _("AlsaBackend::set_port_name: Invalid Port(s)") << endmsg;
+ PBD::error << _("AlsaBackend::set_port_name: Invalid Port") << endmsg;
return -1;
}
- return static_cast<AlsaPort*>(port)->set_name (_instance_name + ":" + name);
+ if (find_port (newname)) {
+ PBD::error << _("AlsaBackend::set_port_name: Port with given name already exists") << endmsg;
+ return -1;
+ }
+
+ AlsaPort* p = static_cast<AlsaPort*>(port);
+ _portmap.erase (p->name());
+ _portmap.insert (make_pair (newname, p));
+ return p->set_name (newname);
}
std::string
@@ -1243,6 +1253,20 @@ AlsaAudioBackend::get_port_property (PortHandle port, const std::string& key, st
return -1;
}
+int
+AlsaAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+ if (!valid_port (port)) {
+ PBD::warning << _("AlsaBackend::set_port_property: Invalid Port(s)") << endmsg;
+ return -1;
+ }
+ if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+ static_cast<AlsaPort*>(port)->set_pretty_name (value);
+ return 0;
+ }
+ return -1;
+}
+
PortEngine::PortHandle
AlsaAudioBackend::get_port_by_name (const std::string& name) const
{
@@ -1264,8 +1288,9 @@ AlsaAudioBackend::get_ports (
use_regexp = true;
}
}
- for (size_t i = 0; i < _ports.size (); ++i) {
- AlsaPort* port = _ports[i];
+
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ AlsaPort* port = *i;
if ((port->type () == type) && flags == (port->flags () & flags)) {
if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
port_names.push_back (port->name ());
@@ -1324,7 +1349,8 @@ AlsaAudioBackend::add_port (
return 0;
}
- _ports.push_back (port);
+ _ports.insert (port);
+ _portmap.insert (make_pair (name, port));
return port;
}
@@ -1336,12 +1362,13 @@ AlsaAudioBackend::unregister_port (PortEngine::PortHandle port_handle)
return;
}
AlsaPort* port = static_cast<AlsaPort*>(port_handle);
- std::vector<AlsaPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<AlsaPort*>(port_handle));
+ PortIndex::iterator i = std::find (_ports.begin(), _ports.end(), static_cast<AlsaPort*>(port_handle));
if (i == _ports.end ()) {
PBD::error << _("AlsaBackend::unregister_port: Failed to find port") << endmsg;
return;
}
disconnect_all(port_handle);
+ _portmap.erase (port->name());
_ports.erase (i);
delete port;
}
@@ -1490,19 +1517,19 @@ AlsaAudioBackend::register_system_midi_ports(const std::string device)
void
AlsaAudioBackend::unregister_ports (bool system_only)
{
- size_t i = 0;
_system_inputs.clear();
_system_outputs.clear();
_system_midi_in.clear();
_system_midi_out.clear();
- while (i < _ports.size ()) {
- AlsaPort* port = _ports[i];
+
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end ();) {
+ PortIndex::iterator cur = i++;
+ AlsaPort* port = *cur;
if (! system_only || (port->is_physical () && port->is_terminal ())) {
port->disconnect_all ();
+ _portmap.erase (port->name());
delete port;
- _ports.erase (_ports.begin() + i);
- } else {
- ++i;
+ _ports.erase (cur);
}
}
}
@@ -1591,10 +1618,12 @@ bool
AlsaAudioBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
{
AlsaPort* dst_port = find_port (dst);
+#ifndef NDEBUG
if (!valid_port (src) || !dst_port) {
PBD::error << _("AlsaBackend::connected_to: Invalid Port") << endmsg;
return false;
}
+#endif
return static_cast<AlsaPort*>(src)->is_connected (dst_port);
}
@@ -1618,9 +1647,9 @@ AlsaAudioBackend::get_connections (PortEngine::PortHandle port, std::vector<std:
assert (0 == names.size ());
- const std::vector<AlsaPort*>& connected_ports = static_cast<AlsaPort*>(port)->get_connections ();
+ const std::set<AlsaPort*>& connected_ports = static_cast<AlsaPort*>(port)->get_connections ();
- for (std::vector<AlsaPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
+ for (std::set<AlsaPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
names.push_back ((*i)->name ());
}
@@ -1761,8 +1790,8 @@ AlsaAudioBackend::port_is_physical (PortEngine::PortHandle port) const
void
AlsaAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
{
- for (size_t i = 0; i < _ports.size (); ++i) {
- AlsaPort* port = _ports[i];
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ AlsaPort* port = *i;
if ((port->type () == type) && port->is_input () && port->is_physical ()) {
port_names.push_back (port->name ());
}
@@ -1772,8 +1801,8 @@ AlsaAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>&
void
AlsaAudioBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
{
- for (size_t i = 0; i < _ports.size (); ++i) {
- AlsaPort* port = _ports[i];
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ AlsaPort* port = *i;
if ((port->type () == type) && port->is_output () && port->is_physical ()) {
port_names.push_back (port->name ());
}
@@ -1785,8 +1814,8 @@ AlsaAudioBackend::n_physical_outputs () const
{
int n_midi = 0;
int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- AlsaPort* port = _ports[i];
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ AlsaPort* port = *i;
if (port->is_output () && port->is_physical ()) {
switch (port->type ()) {
case DataType::AUDIO: ++n_audio; break;
@@ -1806,8 +1835,8 @@ AlsaAudioBackend::n_physical_inputs () const
{
int n_midi = 0;
int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- AlsaPort* port = _ports[i];
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ AlsaPort* port = *i;
if (port->is_input () && port->is_physical ()) {
switch (port->type ()) {
case DataType::AUDIO: ++n_audio; break;
@@ -2161,7 +2190,7 @@ int AlsaPort::connect (AlsaPort *port)
void AlsaPort::_connect (AlsaPort *port, bool callback)
{
- _connections.push_back (port);
+ _connections.insert (port);
if (callback) {
port->_connect (this, false);
_alsa_backend.port_connect_callback (name(), port->name(), true);
@@ -2187,12 +2216,9 @@ int AlsaPort::disconnect (AlsaPort *port)
void AlsaPort::_disconnect (AlsaPort *port, bool callback)
{
- std::vector<AlsaPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
+ std::set<AlsaPort*>::iterator it = _connections.find (port);
assert (it != _connections.end ());
-
_connections.erase (it);
-
if (callback) {
port->_disconnect (this, false);
_alsa_backend.port_connect_callback (name(), port->name(), false);
@@ -2203,21 +2229,22 @@ void AlsaPort::_disconnect (AlsaPort *port, bool callback)
void AlsaPort::disconnect_all ()
{
while (!_connections.empty ()) {
- _connections.back ()->_disconnect (this, false);
- _alsa_backend.port_connect_callback (name(), _connections.back ()->name(), false);
- _connections.pop_back ();
+ std::set<AlsaPort*>::iterator it = _connections.begin ();
+ (*it)->_disconnect (this, false);
+ _alsa_backend.port_connect_callback (name(), (*it)->name(), false);
+ _connections.erase (it);
}
}
bool
AlsaPort::is_connected (const AlsaPort *port) const
{
- return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
+ return _connections.find (const_cast<AlsaPort *>(port)) != _connections.end ();
}
bool AlsaPort::is_physically_connected () const
{
- for (std::vector<AlsaPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
+ for (std::set<AlsaPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
if ((*it)->is_physical ()) {
return true;
}
@@ -2239,14 +2266,15 @@ AlsaAudioPort::~AlsaAudioPort () { }
void* AlsaAudioPort::get_buffer (pframes_t n_samples)
{
if (is_input ()) {
- std::vector<AlsaPort*>::const_iterator it = get_connections ().begin ();
- if (it == get_connections ().end ()) {
+ const std::set<AlsaPort *>& connections = get_connections ();
+ std::set<AlsaPort*>::const_iterator it = connections.begin ();
+ if (it == connections.end ()) {
memset (_buffer, 0, n_samples * sizeof (Sample));
} else {
AlsaAudioPort const * source = static_cast<const AlsaAudioPort*>(*it);
assert (source && source->is_output ());
memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
- while (++it != get_connections ().end ()) {
+ while (++it != connections.end ()) {
source = static_cast<const AlsaAudioPort*>(*it);
assert (source && source->is_output ());
Sample* dst = buffer ();
@@ -2282,8 +2310,9 @@ void* AlsaMidiPort::get_buffer (pframes_t /* nframes */)
{
if (is_input ()) {
(_buffer[_bufperiod]).clear ();
- for (std::vector<AlsaPort*>::const_iterator i = get_connections ().begin ();
- i != get_connections ().end ();
+ const std::set<AlsaPort*>& connections = get_connections ();
+ for (std::set<AlsaPort*>::const_iterator i = connections.begin ();
+ i != connections.end ();
++i) {
const AlsaMidiBuffer * src = static_cast<const AlsaMidiPort*>(*i)->const_buffer ();
for (AlsaMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h
index 01f7579..d8dfb31 100644
--- a/libs/backends/alsa/alsa_audiobackend.h
+++ b/libs/backends/alsa/alsa_audiobackend.h
@@ -30,6 +30,7 @@
#include <boost/shared_ptr.hpp>
+#include "pbd/natsort.h"
#include "ardour/audio_backend.h"
#include "ardour/dsp_load_calculator.h"
#include "ardour/system_exec.h"
@@ -86,7 +87,7 @@ class AlsaPort {
bool is_connected (const AlsaPort *port) const;
bool is_physically_connected () const;
- const std::vector<AlsaPort *>& get_connections () const { return _connections; }
+ const std::set<AlsaPort *>& get_connections () const { return _connections; }
int connect (AlsaPort *port);
int disconnect (AlsaPort *port);
@@ -118,7 +119,7 @@ class AlsaPort {
const PortFlags _flags;
LatencyRange _capture_latency_range;
LatencyRange _playback_latency_range;
- std::vector<AlsaPort*> _connections;
+ std::set<AlsaPort*> _connections;
void _connect (AlsaPort* , bool);
void _disconnect (AlsaPort* , bool);
@@ -266,7 +267,9 @@ class AlsaAudioBackend : public AudioBackend {
int set_port_name (PortHandle, const std::string&);
std::string get_port_name (PortHandle) const;
PortHandle get_port_by_name (const std::string&) const;
+
int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+ int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
@@ -402,12 +405,24 @@ class AlsaAudioBackend : public AudioBackend {
int register_system_midi_ports (const std::string device = "");
void unregister_ports (bool system_only = false);
- std::vector<AlsaPort *> _ports;
std::vector<AlsaPort *> _system_inputs;
std::vector<AlsaPort *> _system_outputs;
std::vector<AlsaPort *> _system_midi_in;
std::vector<AlsaPort *> _system_midi_out;
+ struct SortByPortName
+ {
+ bool operator ()(const AlsaPort* lhs, const AlsaPort* rhs) const
+ {
+ return PBD::naturally_less (lhs->name ().c_str (), rhs->name ().c_str ());
+ }
+ };
+
+ typedef std::map<std::string, AlsaPort *> PortMap; // fast lookup in _ports
+ typedef std::set<AlsaPort *, SortByPortName> PortIndex; // fast lookup in _ports
+ PortMap _portmap;
+ PortIndex _ports;
+
std::vector<AlsaMidiOut *> _rmidi_out;
std::vector<AlsaMidiIn *> _rmidi_in;
@@ -440,16 +455,15 @@ class AlsaAudioBackend : public AudioBackend {
}
bool valid_port (PortHandle port) const {
- return std::find (_ports.begin (), _ports.end (), (AlsaPort*)port) != _ports.end ();
+ return std::find (_ports.begin(), _ports.end(), static_cast<AlsaPort*>(port)) != _ports.end ();
}
- AlsaPort * find_port (const std::string& port_name) const {
- for (std::vector<AlsaPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
- if ((*it)->name () == port_name) {
- return *it;
- }
+ AlsaPort* find_port (const std::string& port_name) const {
+ PortMap::const_iterator it = _portmap.find (port_name);
+ if (it == _portmap.end()) {
+ return NULL;
}
- return NULL;
+ return (*it).second;
}
void update_systemic_audio_latencies ();
diff --git a/libs/backends/alsa/alsa_midi.cc b/libs/backends/alsa/alsa_midi.cc
index 43c11c3..76738e9 100644
--- a/libs/backends/alsa/alsa_midi.cc
+++ b/libs/backends/alsa/alsa_midi.cc
@@ -24,7 +24,7 @@
#include "rt_thread.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
diff --git a/libs/backends/alsa/alsa_rawmidi.cc b/libs/backends/alsa/alsa_rawmidi.cc
index 303649b..0702c63 100644
--- a/libs/backends/alsa/alsa_rawmidi.cc
+++ b/libs/backends/alsa/alsa_rawmidi.cc
@@ -24,7 +24,7 @@
#include "alsa_rawmidi.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
diff --git a/libs/backends/alsa/alsa_sequencer.cc b/libs/backends/alsa/alsa_sequencer.cc
index cb77c3c..a9c3adf 100644
--- a/libs/backends/alsa/alsa_sequencer.cc
+++ b/libs/backends/alsa/alsa_sequencer.cc
@@ -23,7 +23,7 @@
#include "alsa_sequencer.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
diff --git a/libs/backends/alsa/wscript b/libs/backends/alsa/wscript
index 7a4649f..465260d 100644
--- a/libs/backends/alsa/wscript
+++ b/libs/backends/alsa/wscript
@@ -29,7 +29,7 @@ def build(bld):
obj.name = 'alsa_audiobackend'
obj.target = 'alsa_audiobackend'
obj.use = 'libardour libpbd ardouralsautil'
- obj.uselib = 'ALSA'
+ obj.uselib = 'ALSA GLIBMM XML'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'backends')
obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
'ARDOURBACKEND_DLL_EXPORTS'
diff --git a/libs/backends/alsa/zita-alsa-pcmi.h b/libs/backends/alsa/zita-alsa-pcmi.h
index 27af022..48c2396 100644
--- a/libs/backends/alsa/zita-alsa-pcmi.h
+++ b/libs/backends/alsa/zita-alsa-pcmi.h
@@ -123,7 +123,7 @@ private:
typedef char *(Alsa_pcmi::*play_function)(const float *, char *, int, int);
typedef const char *(Alsa_pcmi::*capt_function) (const char *, float *, int, int);
- enum { MAXPFD = 16, MAXCHAN = 64 };
+ enum { MAXPFD = 16, MAXCHAN = 128 };
void initialise (const char *play_name, const char *capt_name, const char *ctrl_name);
int set_hwpar (snd_pcm_t *handle, snd_pcm_hw_params_t *hwpar, const char *sname, unsigned int nfrag, unsigned int *nchan);
diff --git a/libs/backends/asio/asio_backend.cc b/libs/backends/asio/asio_backend.cc
deleted file mode 100644
index 60b6016..0000000
--- a/libs/backends/asio/asio_backend.cc
+++ /dev/null
@@ -1,1839 +0,0 @@
-/*
- * Copyright (C) 2014 Robin Gareus <robin at gareus.org>
- * Copyright (C) 2013 Paul Davis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <regex.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-
-#include <glibmm.h>
-
-#include "asio_backend.h"
-#include "rt_thread.h"
-
-#include "pbd/compose.h"
-#include "pbd/error.h"
-#include "pbd/file_utils.h"
-#include "ardour/filesystem_paths.h"
-#include "ardour/port_manager.h"
-#include "i18n.h"
-
-using namespace ARDOUR;
-
-static std::string s_instance_name;
-size_t ASIOBackend::_max_buffer_size = 8192;
-std::vector<std::string> ASIOBackend::_midi_options;
-std::vector<AudioBackend::DeviceStatus> ASIOBackend::_audio_device_status;
-
-
-/* static class instance access */
-static void hw_changed_callback_ptr (void *arg)
-{
- ASIOBackend *d = static_cast<ASIOBackend*> (arg);
- d->hw_changed_callback();
-}
-
-static void error_callback_ptr (void *arg)
-{
- ASIOBackend *d = static_cast<ASIOBackend*> (arg);
- d->error_callback();
-}
-
-static void xrun_callback_ptr (void *arg)
-{
- ASIOBackend *d = static_cast<ASIOBackend*> (arg);
- d->xrun_callback();
-}
-
-static void buffer_size_callback_ptr (void *arg)
-{
- ASIOBackend *d = static_cast<ASIOBackend*> (arg);
- d->buffer_size_callback();
-}
-
-static void sample_rate_callback_ptr (void *arg)
-{
- ASIOBackend *d = static_cast<ASIOBackend*> (arg);
- d->sample_rate_callback();
-}
-
-
-ASIOBackend::ASIOBackend (AudioEngine& e, AudioBackendInfo& info)
- : AudioBackend (e, info)
- , _run (false)
- , _active_cb (false)
- , _active_fw (false)
- , _freewheeling (false)
- , _freewheel (false)
- , _freewheel_ack (false)
- , _reinit_thread_callback (false)
- , _measure_latency (false)
- , _last_process_start (0)
- , _audio_device("")
- , _midi_driver_option(_("None"))
- , _samplerate (48000)
- , _samples_per_period (1024)
- , _n_inputs (0)
- , _n_outputs (0)
- , _systemic_audio_input_latency (0)
- , _systemic_audio_output_latency (0)
- , _dsp_load (0)
- , _processed_samples (0)
- , _port_change_flag (false)
-{
- _instance_name = s_instance_name;
- pthread_mutex_init (&_port_callback_mutex, 0);
- pthread_mutex_init (&_process_callback_mutex, 0);
- pthread_mutex_init (&_freewheel_mutex, 0);
- pthread_cond_init (&_freewheel_signal, 0);
-
-#if 0 // TODO
- //_pcmio = new ASIOPCM ();
- //_midiio = new WindowsMidiIo ();
-
- _pcmio->set_hw_changed_callback (hw_changed_callback_ptr, this);
- _pcmio->discover();
-#endif
-}
-
-ASIOBackend::~ASIOBackend ()
-{
-#if 0
- delete _pcmio; _pcmio = 0; // TODO
- delete _midiio; _midiio = 0; // TODO
-#endif
- pthread_mutex_destroy (&_port_callback_mutex);
- pthread_mutex_destroy (&_process_callback_mutex);
- pthread_mutex_destroy (&_freewheel_mutex);
- pthread_cond_destroy (&_freewheel_signal);
-}
-
-/* AUDIOBACKEND API */
-
-std::string
-ASIOBackend::name () const
-{
- return X_("ASIO");
-}
-
-bool
-ASIOBackend::is_realtime () const
-{
- return true;
-}
-
-std::vector<AudioBackend::DeviceStatus>
-ASIOBackend::enumerate_devices () const
-{
- _audio_device_status.clear();
-#if 0 // TODO
- std::map<size_t, std::string> devices;
- _pcmio->device_list(devices);
-
- for (std::map<size_t, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
- if (_audio_device == "") _audio_device = i->second;
- _audio_device_status.push_back (DeviceStatus (i->second, true));
- }
-#endif
- return _audio_device_status;
-}
-
-std::vector<float>
-ASIOBackend::available_sample_rates (const std::string&) const
-{
- std::vector<float> sr;
-#if 0 // TODO
- _pcmio->available_sample_rates(_audio_device, sr);
-#endif
- return sr;
-}
-
-std::vector<uint32_t>
-ASIOBackend::available_buffer_sizes (const std::string&) const
-{
- std::vector<uint32_t> bs;
-#if 0 // TODO
- _pcmio->available_buffer_sizes(_audio_device, bs);
-#endif
- return bs;
-}
-
-uint32_t
-ASIOBackend::available_input_channel_count (const std::string&) const
-{
- return 128; // TODO query current device
-}
-
-uint32_t
-ASIOBackend::available_output_channel_count (const std::string&) const
-{
- return 128; // TODO query current device
-}
-
-bool
-ASIOBackend::can_change_sample_rate_when_running () const
-{
- return false;
-}
-
-bool
-ASIOBackend::can_change_buffer_size_when_running () const
-{
- return true;
-}
-
-int
-ASIOBackend::set_device_name (const std::string& d)
-{
- _audio_device = d;
-#if 0 // TODO
- const float sr = _pcmio->current_sample_rate(_audio_device);
-#endif
- //if (sr > 0) { set_sample_rate(sr); }
- return 0;
-}
-
-int
-ASIOBackend::set_sample_rate (float sr)
-{
- if (sr <= 0) { return -1; }
- // TODO check if it's in the list of valid SR
- _samplerate = sr;
- engine.sample_rate_change (sr);
- return 0;
-}
-
-int
-ASIOBackend::set_buffer_size (uint32_t bs)
-{
- if (bs <= 0 || bs >= _max_buffer_size) {
- return -1;
- }
- _samples_per_period = bs;
-#if 0 // TODO
- _pcmio->set_samples_per_period(bs);
-#endif
- engine.buffer_size_change (bs);
- return 0;
-}
-
-int
-ASIOBackend::set_interleaved (bool yn)
-{
- if (!yn) { return 0; }
- return -1;
-}
-
-int
-ASIOBackend::set_input_channels (uint32_t cc)
-{
- _n_inputs = cc;
- return 0;
-}
-
-int
-ASIOBackend::set_output_channels (uint32_t cc)
-{
- _n_outputs = cc;
- return 0;
-}
-
-int
-ASIOBackend::set_systemic_input_latency (uint32_t sl)
-{
- _systemic_audio_input_latency = sl;
- return 0;
-}
-
-int
-ASIOBackend::set_systemic_output_latency (uint32_t sl)
-{
- _systemic_audio_output_latency = sl;
- return 0;
-}
-
-/* Retrieving parameters */
-std::string
-ASIOBackend::device_name () const
-{
- return _audio_device;
-}
-
-float
-ASIOBackend::sample_rate () const
-{
- return _samplerate;
-}
-
-uint32_t
-ASIOBackend::buffer_size () const
-{
- return _samples_per_period;
-}
-
-bool
-ASIOBackend::interleaved () const
-{
- return false;
-}
-
-uint32_t
-ASIOBackend::input_channels () const
-{
- return _n_inputs;
-}
-
-uint32_t
-ASIOBackend::output_channels () const
-{
- return _n_outputs;
-}
-
-uint32_t
-ASIOBackend::systemic_input_latency () const
-{
- return _systemic_audio_input_latency;
-}
-
-uint32_t
-ASIOBackend::systemic_output_latency () const
-{
- return _systemic_audio_output_latency;
-}
-
-/* MIDI */
-
-std::vector<std::string>
-ASIOBackend::enumerate_midi_options () const
-{
- if (_midi_options.empty()) {
- _midi_options.push_back (_("WindowsMidi"));
- _midi_options.push_back (_("None"));
- }
- return _midi_options;
-}
-
-int
-ASIOBackend::set_midi_option (const std::string& opt)
-{
- if (opt != _("None") && opt != _("WindowsMidi")) {
- return -1;
- }
- _midi_driver_option = opt;
- return 0;
-}
-
-std::string
-ASIOBackend::midi_option () const
-{
- return _midi_driver_option;
-}
-
-void
-ASIOBackend::launch_control_app ()
-{
- // TODO
-}
-
-/* State Control */
-
-static void * pthread_freewheel (void *arg)
-{
- ASIOBackend *d = static_cast<ASIOBackend *>(arg);
- d->freewheel_thread ();
- pthread_exit (0);
- return 0;
-}
-
-static int process_callback_ptr (void *arg, const uint32_t n_samples, const uint64_t host_time)
-{
- ASIOBackend *d = static_cast<ASIOBackend*> (arg);
- return d->process_callback(n_samples, host_time);
-}
-
-int
-ASIOBackend::_start (bool for_latency_measurement)
-{
- if ((!_active_cb || !_active_fw) && _run) {
- // recover from 'halted', reap threads
- stop();
- }
-
- if (_active_cb || _active_fw || _run) {
- PBD::error << _("ASIOBackend: already active.") << endmsg;
- return -1;
- }
-
- if (_ports.size()) {
- PBD::warning << _("ASIOBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
- _system_inputs.clear();
- _system_outputs.clear();
- _system_midi_in.clear();
- _system_midi_out.clear();
- _ports.clear();
- }
-
- assert(_active_cb == false);
- assert(_active_fw == false);
-
- _freewheel_ack = false;
- _reinit_thread_callback = true;
- _last_process_start = 0;
-
-#if 0 // TODO
- _pcmio->set_error_callback (error_callback_ptr, this);
- _pcmio->set_buffer_size_callback (buffer_size_callback_ptr, this);
- _pcmio->set_sample_rate_callback (sample_rate_callback_ptr, this);
-
- _pcmio->pcm_start (device1, device2, _samplerate, _samples_per_period, process_callback_ptr, this);
-
- switch (_pcmio->state ()) {
- case 0: /* OK */ break;
- case -1: PBD::error << _("ASIOBackend: failed to open device.") << endmsg; break;
- default: PBD::error << _("ASIOBackend: initialization failed.") << endmsg; break;
- }
- if (_pcmio->state ()) {
- return -1;
- }
-
- if (_n_outputs != _pcmio->n_playback_channels ()) {
- if (_n_outputs == 0) {
- _n_outputs = _pcmio->n_playback_channels ();
- } else {
- _n_outputs = std::min (_n_outputs, _pcmio->n_playback_channels ());
- }
- PBD::info << _("ASIOBackend: adjusted output channel count to match device.") << endmsg;
- }
-
- if (_n_inputs != _pcmio->n_capture_channels ()) {
- if (_n_inputs == 0) {
- _n_inputs = _pcmio->n_capture_channels ();
- } else {
- _n_inputs = std::min (_n_inputs, _pcmio->n_capture_channels ());
- }
- PBD::info << _("ASIOBackend: adjusted input channel count to match device.") << endmsg;
- }
-
- if (_pcmio->samples_per_period() != _samples_per_period) {
- _samples_per_period = _pcmio->samples_per_period();
- PBD::warning << _("ASIOBackend: samples per period does not match.") << endmsg;
- }
-
- if (_pcmio->sample_rate() != _samplerate) {
- _samplerate = _pcmio->sample_rate();
- engine.sample_rate_change (_samplerate);
- PBD::warning << _("ASIOBackend: sample rate does not match.") << endmsg;
- }
-#endif
-
- _measure_latency = for_latency_measurement;
-
- _preinit = true;
- _run = true;
- _port_change_flag = false;
-
-#if 0 // TODO
- if (_midi_driver_option == _("WindowsMidi")) {
- // TODO
- //_midiio->set_enabled(true);
- //_midiio->set_port_changed_callback(midi_port_change, this);
- //_midiio->start(); // triggers port discovery, callback coremidi_rediscover()
- }
-#endif
-
- if (register_system_audio_ports()) {
- PBD::error << _("ASIOBackend: failed to register system ports.") << endmsg;
- _run = false;
- return -1;
- }
-
- engine.sample_rate_change (_samplerate);
- engine.buffer_size_change (_samples_per_period);
-
- if (engine.reestablish_ports ()) {
- PBD::error << _("ASIOBackend: Could not re-establish ports.") << endmsg;
- _run = false;
- return -1;
- }
-
- if (pthread_create (&_freeewheel_thread, NULL, pthread_freewheel, this))
- {
- PBD::error << _("ASIOBackend: failed to create process thread.") << endmsg;
-#if 0 // TODO
- delete _pcmio; _pcmio = 0;
-#endif
- _run = false;
- return -1;
- }
-
- int timeout = 5000;
- while ((!_active_cb || !_active_fw) && --timeout > 0) { Glib::usleep (1000); }
-
- if (timeout == 0) {
- PBD::error << _("ASIOBackend: failed to start.") << endmsg;
- }
-
- if (!_active_fw) {
- PBD::error << _("ASIOBackend: failed to start freewheeling thread.") << endmsg;
- _run = false;
-#if 0 // TODO
- _pcmio->pcm_stop();
-#endif
- unregister_ports();
- _active_cb = false;
- _active_fw = false;
- return -1;
- }
-
- if (!_active_cb) {
- PBD::error << _("ASIOBackend: failed to start ASIO.") << endmsg;
- stop();
- _run = false;
- return -1;
- }
-
- engine.reconnect_ports ();
-
- // force an initial registration_callback() & latency re-compute
- _port_change_flag = true;
- pre_process ();
-
- // all systems go.
-#if 0 // TODO
- _pcmio->set_xrun_callback (xrun_callback_ptr, this);
-#endif
- _preinit = false;
-
- return 0;
-}
-
-int
-ASIOBackend::stop ()
-{
- void *status;
- if (!_run) {
- return 0;
- }
-
- _run = false;
-#if 0 // TODO
- _pcmio->pcm_stop();
- _midiio->set_port_changed_callback(NULL, NULL);
- _midiio->stop();
-#endif
- pthread_mutex_lock (&_freewheel_mutex);
- pthread_cond_signal (&_freewheel_signal);
- pthread_mutex_unlock (&_freewheel_mutex);
-
- if (pthread_join (_freeewheel_thread, &status)) {
- PBD::error << _("ASIOBackend: failed to terminate.") << endmsg;
- return -1;
- }
-
- unregister_ports();
-
- _active_cb = false;
- _active_fw = false; // ??
-
- return 0;
-}
-
-int
-ASIOBackend::freewheel (bool onoff)
-{
- if (onoff == _freewheeling) {
- return 0;
- }
- _freewheeling = onoff;
- // wake up freewheeling thread
- if (0 == pthread_mutex_trylock (&_freewheel_mutex)) {
- pthread_cond_signal (&_freewheel_signal);
- pthread_mutex_unlock (&_freewheel_mutex);
- }
- return 0;
-}
-
-float
-ASIOBackend::dsp_load () const
-{
- return 100.f * _dsp_load;
-}
-
-size_t
-ASIOBackend::raw_buffer_size (DataType t)
-{
- switch (t) {
- case DataType::AUDIO:
- return _samples_per_period * sizeof(Sample);
- case DataType::MIDI:
- return _max_buffer_size; // XXX not really limited
- }
- return 0;
-}
-
-/* Process time */
-framepos_t
-ASIOBackend::sample_time ()
-{
- return _processed_samples;
-}
-
-framepos_t
-ASIOBackend::sample_time_at_cycle_start ()
-{
- return _processed_samples;
-}
-
-pframes_t
-ASIOBackend::samples_since_cycle_start ()
-{
- if (!_active_cb || !_run || _freewheeling || _freewheel) {
- return 0;
- }
- if (_last_process_start == 0) {
- return 0;
- }
-
-#if 0 // TODO
- const uint64_t now = AudioGetCurrentHostTime ();
- const int64_t elapsed_time_ns = AudioConvertHostTimeToNanos(now - _last_process_start);
- return std::max((pframes_t)0, (pframes_t)rint(1e-9 * elapsed_time_ns * _samplerate));
-#else
- return 0;
-#endif
-}
-
-void *
-ASIOBackend::asio_process_thread (void *arg)
-{
- ThreadData* td = reinterpret_cast<ThreadData*> (arg);
- boost::function<void ()> f = td->f;
- delete td;
- f ();
- return 0;
-}
-
-int
-ASIOBackend::create_process_thread (boost::function<void()> func)
-{
- pthread_t thread_id;
- pthread_attr_t attr;
- size_t stacksize = 100000;
-
- ThreadData* td = new ThreadData (this, func, stacksize);
-
- if (_realtime_pthread_create (SCHED_FIFO, -21, stacksize,
- &thread_id, asio_process_thread, td)) {
- pthread_attr_init (&attr);
- pthread_attr_setstacksize (&attr, stacksize);
- if (pthread_create (&thread_id, &attr, asio_process_thread, td)) {
- PBD::error << _("AudioEngine: cannot create process thread.") << endmsg;
- pthread_attr_destroy (&attr);
- return -1;
- }
- pthread_attr_destroy (&attr);
- }
-
- _threads.push_back (thread_id);
- return 0;
-}
-
-int
-ASIOBackend::join_process_threads ()
-{
- int rv = 0;
-
- for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i)
- {
- void *status;
- if (pthread_join (*i, &status)) {
- PBD::error << _("AudioEngine: cannot terminate process thread.") << endmsg;
- rv -= 1;
- }
- }
- _threads.clear ();
- return rv;
-}
-
-bool
-ASIOBackend::in_process_thread ()
-{
- if (pthread_equal (_main_thread, pthread_self()) != 0) {
- return true;
- }
-
- for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i)
- {
- if (pthread_equal (*i, pthread_self ()) != 0) {
- return true;
- }
- }
- return false;
-}
-
-uint32_t
-ASIOBackend::process_thread_count ()
-{
- return _threads.size ();
-}
-
-void
-ASIOBackend::update_latencies ()
-{
- // trigger latency callback in RT thread (locked graph)
- port_connect_add_remove_callback();
-}
-
-/* PORTENGINE API */
-
-void*
-ASIOBackend::private_handle () const
-{
- return NULL;
-}
-
-const std::string&
-ASIOBackend::my_name () const
-{
- return _instance_name;
-}
-
-bool
-ASIOBackend::available () const
-{
- return _run && _active_fw && _active_cb;
-}
-
-uint32_t
-ASIOBackend::port_name_size () const
-{
- return 256;
-}
-
-int
-ASIOBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackend::set_port_name: Invalid Port(s)") << endmsg;
- return -1;
- }
- return static_cast<ASIOBackendPort*>(port)->set_name (_instance_name + ":" + name);
-}
-
-std::string
-ASIOBackend::get_port_name (PortEngine::PortHandle port) const
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackend::get_port_name: Invalid Port(s)") << endmsg;
- return std::string ();
- }
- return static_cast<ASIOBackendPort*>(port)->name ();
-}
-
-int
-ASIOBackend::get_port_property (PortHandle port, const std::string& key, std::string& value, std::string& type) const
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackend::get_port_name: Invalid Port(s)") << endmsg;
- return -1;
- }
- if (key == "http://jackaudio.org/metadata/pretty-name") {
- type = "";
- value = static_cast<ASIOBackendPort*>(port)->pretty_name ();
- if (!value.empty()) {
- return 0;
- }
- }
- return -1;
-}
-
-PortEngine::PortHandle
-ASIOBackend::get_port_by_name (const std::string& name) const
-{
- PortHandle port = (PortHandle) find_port (name);
- return port;
-}
-
-int
-ASIOBackend::get_ports (
- const std::string& port_name_pattern,
- DataType type, PortFlags flags,
- std::vector<std::string>& port_names) const
-{
- int rv = 0;
- regex_t port_regex;
- bool use_regexp = false;
- if (port_name_pattern.size () > 0) {
- if (!regcomp (&port_regex, port_name_pattern.c_str (), REG_EXTENDED|REG_NOSUB)) {
- use_regexp = true;
- }
- }
- for (size_t i = 0; i < _ports.size (); ++i) {
- ASIOBackendPort* port = _ports[i];
- if ((port->type () == type) && (port->flags () & flags)) {
- if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
- port_names.push_back (port->name ());
- ++rv;
- }
- }
- }
- if (use_regexp) {
- regfree (&port_regex);
- }
- return rv;
-}
-
-DataType
-ASIOBackend::port_data_type (PortEngine::PortHandle port) const
-{
- if (!valid_port (port)) {
- return DataType::NIL;
- }
- return static_cast<ASIOBackendPort*>(port)->type ();
-}
-
-PortEngine::PortHandle
-ASIOBackend::register_port (
- const std::string& name,
- ARDOUR::DataType type,
- ARDOUR::PortFlags flags)
-{
- if (name.size () == 0) { return 0; }
- if (flags & IsPhysical) { return 0; }
- return add_port (_instance_name + ":" + name, type, flags);
-}
-
-PortEngine::PortHandle
-ASIOBackend::add_port (
- const std::string& name,
- ARDOUR::DataType type,
- ARDOUR::PortFlags flags)
-{
- assert(name.size ());
- if (find_port (name)) {
- PBD::error << _("ASIOBackend::register_port: Port already exists:")
- << " (" << name << ")" << endmsg;
- return 0;
- }
- ASIOBackendPort* port = NULL;
- switch (type) {
- case DataType::AUDIO:
- port = new ASIOPort (*this, name, flags);
- break;
- case DataType::MIDI:
- port = new WindowsMidiPort (*this, name, flags);
- break;
- default:
- PBD::error << _("ASIOBackend::register_port: Invalid Data Type.") << endmsg;
- return 0;
- }
-
- _ports.push_back (port);
-
- return port;
-}
-
-void
-ASIOBackend::unregister_port (PortEngine::PortHandle port_handle)
-{
- if (!_run) {
- return;
- }
- ASIOBackendPort* port = static_cast<ASIOBackendPort*>(port_handle);
- std::vector<ASIOBackendPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<ASIOBackendPort*>(port_handle));
- if (i == _ports.end ()) {
- PBD::error << _("ASIOBackend::unregister_port: Failed to find port") << endmsg;
- return;
- }
- disconnect_all(port_handle);
- _ports.erase (i);
- delete port;
-}
-
-int
-ASIOBackend::register_system_audio_ports()
-{
- LatencyRange lr;
-
- const uint32_t a_ins = _n_inputs;
- const uint32_t a_out = _n_outputs;
-
- const uint32_t asio_reported_input_latency = 0; // TODO _pcmio->get_latency(_audio_device, true);
- const uint32_t asio_reported_output_latency = 0; // TODO _pcmio->get_latency(_audio_device, false);
-
- /* audio ports */
- lr.min = lr.max = asio_reported_input_latency + (_measure_latency ? 0 : _systemic_audio_input_latency);
- for (uint32_t i = 0; i < a_ins; ++i) {
- char tmp[64];
- snprintf(tmp, sizeof(tmp), "system:capture_%d", i+1);
- PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
- if (!p) return -1;
- set_latency_range (p, false, lr);
- ASIOBackendPort *cp = static_cast<ASIOBackendPort*>(p);
- //cp->set_pretty_name (_pcmio->cached_port_name(i, true)); // TODO
- _system_inputs.push_back(cp);
- }
-
- lr.min = lr.max = asio_reported_output_latency + (_measure_latency ? 0 : _systemic_audio_output_latency);
- for (uint32_t i = 0; i < a_out; ++i) {
- char tmp[64];
- snprintf(tmp, sizeof(tmp), "system:playback_%d", i+1);
- PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
- if (!p) return -1;
- set_latency_range (p, true, lr);
- ASIOBackendPort *cp = static_cast<ASIOBackendPort*>(p);
- //cp->set_pretty_name (_pcmio->cached_port_name(i, false)); // TODO
- _system_outputs.push_back(cp);
- }
- return 0;
-}
-
-void
-ASIOBackend::unregister_ports (bool system_only)
-{
- size_t i = 0;
- _system_inputs.clear();
- _system_outputs.clear();
- _system_midi_in.clear();
- _system_midi_out.clear();
- while (i < _ports.size ()) {
- ASIOBackendPort* port = _ports[i];
- if (! system_only || (port->is_physical () && port->is_terminal ())) {
- port->disconnect_all ();
- delete port;
- _ports.erase (_ports.begin() + i);
- } else {
- ++i;
- }
- }
-}
-
-int
-ASIOBackend::connect (const std::string& src, const std::string& dst)
-{
- ASIOBackendPort* src_port = find_port (src);
- ASIOBackendPort* dst_port = find_port (dst);
-
- if (!src_port) {
- PBD::error << _("ASIOBackend::connect: Invalid Source port:")
- << " (" << src <<")" << endmsg;
- return -1;
- }
- if (!dst_port) {
- PBD::error << _("ASIOBackend::connect: Invalid Destination port:")
- << " (" << dst <<")" << endmsg;
- return -1;
- }
- return src_port->connect (dst_port);
-}
-
-int
-ASIOBackend::disconnect (const std::string& src, const std::string& dst)
-{
- ASIOBackendPort* src_port = find_port (src);
- ASIOBackendPort* dst_port = find_port (dst);
-
- if (!src_port || !dst_port) {
- PBD::error << _("ASIOBackend::disconnect: Invalid Port(s)") << endmsg;
- return -1;
- }
- return src_port->disconnect (dst_port);
-}
-
-int
-ASIOBackend::connect (PortEngine::PortHandle src, const std::string& dst)
-{
- ASIOBackendPort* dst_port = find_port (dst);
- if (!valid_port (src)) {
- PBD::error << _("ASIOBackend::connect: Invalid Source Port Handle") << endmsg;
- return -1;
- }
- if (!dst_port) {
- PBD::error << _("ASIOBackend::connect: Invalid Destination Port")
- << " (" << dst << ")" << endmsg;
- return -1;
- }
- return static_cast<ASIOBackendPort*>(src)->connect (dst_port);
-}
-
-int
-ASIOBackend::disconnect (PortEngine::PortHandle src, const std::string& dst)
-{
- ASIOBackendPort* dst_port = find_port (dst);
- if (!valid_port (src) || !dst_port) {
- PBD::error << _("ASIOBackend::disconnect: Invalid Port(s)") << endmsg;
- return -1;
- }
- return static_cast<ASIOBackendPort*>(src)->disconnect (dst_port);
-}
-
-int
-ASIOBackend::disconnect_all (PortEngine::PortHandle port)
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackend::disconnect_all: Invalid Port") << endmsg;
- return -1;
- }
- static_cast<ASIOBackendPort*>(port)->disconnect_all ();
- return 0;
-}
-
-bool
-ASIOBackend::connected (PortEngine::PortHandle port, bool /* process_callback_safe*/)
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackend::disconnect_all: Invalid Port") << endmsg;
- return false;
- }
- return static_cast<ASIOBackendPort*>(port)->is_connected ();
-}
-
-bool
-ASIOBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
-{
- ASIOBackendPort* dst_port = find_port (dst);
- if (!valid_port (src) || !dst_port) {
- PBD::error << _("ASIOBackend::connected_to: Invalid Port") << endmsg;
- return false;
- }
- return static_cast<ASIOBackendPort*>(src)->is_connected (dst_port);
-}
-
-bool
-ASIOBackend::physically_connected (PortEngine::PortHandle port, bool /*process_callback_safe*/)
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackend::physically_connected: Invalid Port") << endmsg;
- return false;
- }
- return static_cast<ASIOBackendPort*>(port)->is_physically_connected ();
-}
-
-int
-ASIOBackend::get_connections (PortEngine::PortHandle port, std::vector<std::string>& names, bool /*process_callback_safe*/)
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackend::get_connections: Invalid Port") << endmsg;
- return -1;
- }
-
- assert (0 == names.size ());
-
- const std::vector<ASIOBackendPort*>& connected_ports = static_cast<ASIOBackendPort*>(port)->get_connections ();
-
- for (std::vector<ASIOBackendPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
- names.push_back ((*i)->name ());
- }
-
- return (int)names.size ();
-}
-
-/* MIDI */
-int
-ASIOBackend::midi_event_get (
- pframes_t& timestamp,
- size_t& size, uint8_t** buf, void* port_buffer,
- uint32_t event_index)
-{
- if (!buf || !port_buffer) return -1;
- WindowsMidiBuffer& source = * static_cast<WindowsMidiBuffer*>(port_buffer);
- if (event_index >= source.size ()) {
- return -1;
- }
- WindowsMidiEvent * const event = source[event_index].get ();
-
- timestamp = event->timestamp ();
- size = event->size ();
- *buf = event->data ();
- return 0;
-}
-
-int
-ASIOBackend::midi_event_put (
- void* port_buffer,
- pframes_t timestamp,
- const uint8_t* buffer, size_t size)
-{
- if (!buffer || !port_buffer) return -1;
- WindowsMidiBuffer& dst = * static_cast<WindowsMidiBuffer*>(port_buffer);
- if (dst.size () && (pframes_t)dst.back ()->timestamp () > timestamp) {
-#ifndef NDEBUG
- // nevermind, ::get_buffer() sorts events
- fprintf (stderr, "WindowsMidiBuffer: unordered event: %d > %d\n",
- (pframes_t)dst.back ()->timestamp (), timestamp);
-#endif
- }
- dst.push_back (boost::shared_ptr<WindowsMidiEvent>(new WindowsMidiEvent (timestamp, buffer, size)));
- return 0;
-}
-
-uint32_t
-ASIOBackend::get_midi_event_count (void* port_buffer)
-{
- if (!port_buffer) return 0;
- return static_cast<WindowsMidiBuffer*>(port_buffer)->size ();
-}
-
-void
-ASIOBackend::midi_clear (void* port_buffer)
-{
- if (!port_buffer) return;
- WindowsMidiBuffer * buf = static_cast<WindowsMidiBuffer*>(port_buffer);
- assert (buf);
- buf->clear ();
-}
-
-/* Monitoring */
-
-bool
-ASIOBackend::can_monitor_input () const
-{
- return false;
-}
-
-int
-ASIOBackend::request_input_monitoring (PortEngine::PortHandle, bool)
-{
- return -1;
-}
-
-int
-ASIOBackend::ensure_input_monitoring (PortEngine::PortHandle, bool)
-{
- return -1;
-}
-
-bool
-ASIOBackend::monitoring_input (PortEngine::PortHandle)
-{
- return false;
-}
-
-/* Latency management */
-
-void
-ASIOBackend::set_latency_range (PortEngine::PortHandle port, bool for_playback, LatencyRange latency_range)
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackendPort::set_latency_range (): invalid port.") << endmsg;
- }
- static_cast<ASIOBackendPort*>(port)->set_latency_range (latency_range, for_playback);
-}
-
-LatencyRange
-ASIOBackend::get_latency_range (PortEngine::PortHandle port, bool for_playback)
-{
- LatencyRange r;
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackendPort::get_latency_range (): invalid port.") << endmsg;
- r.min = 0;
- r.max = 0;
- return r;
- }
- ASIOBackendPort* p = static_cast<ASIOBackendPort*>(port);
- assert(p);
-
- r = p->latency_range (for_playback);
- if (p->is_physical() && p->is_terminal() && p->type() == DataType::AUDIO) {
- if (p->is_input() && for_playback) {
- r.min += _samples_per_period;
- r.max += _samples_per_period;
- }
- if (p->is_output() && !for_playback) {
- r.min += _samples_per_period;
- r.max += _samples_per_period;
- }
- }
- return r;
-}
-
-/* Discovering physical ports */
-
-bool
-ASIOBackend::port_is_physical (PortEngine::PortHandle port) const
-{
- if (!valid_port (port)) {
- PBD::error << _("ASIOBackendPort::port_is_physical (): invalid port.") << endmsg;
- return false;
- }
- return static_cast<ASIOBackendPort*>(port)->is_physical ();
-}
-
-void
-ASIOBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
-{
- for (size_t i = 0; i < _ports.size (); ++i) {
- ASIOBackendPort* port = _ports[i];
- if ((port->type () == type) && port->is_input () && port->is_physical ()) {
- port_names.push_back (port->name ());
- }
- }
-}
-
-void
-ASIOBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
-{
- for (size_t i = 0; i < _ports.size (); ++i) {
- ASIOBackendPort* port = _ports[i];
- if ((port->type () == type) && port->is_output () && port->is_physical ()) {
- port_names.push_back (port->name ());
- }
- }
-}
-
-ChanCount
-ASIOBackend::n_physical_outputs () const
-{
- int n_midi = 0;
- int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- ASIOBackendPort* port = _ports[i];
- if (port->is_output () && port->is_physical ()) {
- switch (port->type ()) {
- case DataType::AUDIO: ++n_audio; break;
- case DataType::MIDI: ++n_midi; break;
- default: break;
- }
- }
- }
- ChanCount cc;
- cc.set (DataType::AUDIO, n_audio);
- cc.set (DataType::MIDI, n_midi);
- return cc;
-}
-
-ChanCount
-ASIOBackend::n_physical_inputs () const
-{
- int n_midi = 0;
- int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- ASIOBackendPort* port = _ports[i];
- if (port->is_input () && port->is_physical ()) {
- switch (port->type ()) {
- case DataType::AUDIO: ++n_audio; break;
- case DataType::MIDI: ++n_midi; break;
- default: break;
- }
- }
- }
- ChanCount cc;
- cc.set (DataType::AUDIO, n_audio);
- cc.set (DataType::MIDI, n_midi);
- return cc;
-}
-
-/* Getting access to the data buffer for a port */
-
-void*
-ASIOBackend::get_buffer (PortEngine::PortHandle port, pframes_t nframes)
-{
- if (!port || !valid_port (port)) return NULL;
- return static_cast<ASIOBackendPort*>(port)->get_buffer (nframes);
-}
-
-void
-ASIOBackend::pre_process ()
-{
- bool connections_changed = false;
- bool ports_changed = false;
- if (!pthread_mutex_trylock (&_port_callback_mutex)) {
- if (_port_change_flag) {
- ports_changed = true;
- _port_change_flag = false;
- }
- if (!_port_connection_queue.empty ()) {
- connections_changed = true;
- }
- while (!_port_connection_queue.empty ()) {
- PortConnectData *c = _port_connection_queue.back ();
- manager.connect_callback (c->a, c->b, c->c);
- _port_connection_queue.pop_back ();
- delete c;
- }
- pthread_mutex_unlock (&_port_callback_mutex);
- }
- if (ports_changed) {
- manager.registration_callback();
- }
- if (connections_changed) {
- manager.graph_order_callback();
- }
- if (connections_changed || ports_changed) {
- engine.latency_callback(false);
- engine.latency_callback(true);
- }
-}
-
-void *
-ASIOBackend::freewheel_thread ()
-{
- _active_fw = true;
- bool first_run = false;
- /* Freewheeling - use for export. The first call to
- * engine.process_callback() after engine.freewheel_callback will
- * if the first export cycle.
- * For reliable precise export timing, the calls need to be in sync.
- *
- * Furthermore we need to make sure the registered process thread
- * is correct.
- *
- * _freewheeling = GUI thread state as set by ::freewheel()
- * _freewheel = in sync here (export thread)
- */
- pthread_mutex_lock (&_freewheel_mutex);
- while (_run) {
- // check if we should run,
- if (_freewheeling != _freewheel) {
- if (!_freewheeling) {
- // prepare leaving freewheeling mode
- _freewheel = false; // first mark as disabled
- _reinit_thread_callback = true; // hand over _main_thread
- _freewheel_ack = false; // prepare next handshake
-#if 0 // TODO disable hadrware MIDI threads during freewheeling
- _midiio->set_enabled(true);
-#endif
- } else {
- first_run = true;
- _freewheel = true;
- }
- }
-
- if (!_freewheel || !_freewheel_ack) {
- // wait for a change, we use a timed wait to
- // terminate early in case some error sets _run = 0
- struct timeval tv;
- struct timespec ts;
- gettimeofday (&tv, NULL);
- ts.tv_sec = tv.tv_sec + 3;
- ts.tv_nsec = 0;
- pthread_cond_timedwait (&_freewheel_signal, &_freewheel_mutex, &ts);
- continue;
- }
-
- if (first_run) {
- // tell the engine we're ready to GO.
- engine.freewheel_callback (_freewheeling);
- first_run = false;
- _main_thread = pthread_self();
- AudioEngine::thread_init_callback (this);
-#if 0 // TODO
- _midiio->set_enabled(false);
-#endif
- }
-
- // process port updates first in every cycle.
- pre_process();
-
- // prevent device changes
- pthread_mutex_lock (&_process_callback_mutex);
-
- /* Freewheelin' */
-
- // clear input buffers
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
- memset ((*it)->get_buffer (_samples_per_period), 0, _samples_per_period * sizeof (Sample));
- }
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
- static_cast<WindowsMidiBuffer*>((*it)->get_buffer(0))->clear ();
- }
-
- _last_process_start = 0;
- if (engine.process_callback (_samples_per_period)) {
- pthread_mutex_unlock (&_process_callback_mutex);
- break;
- }
-
- pthread_mutex_unlock (&_process_callback_mutex);
- _dsp_load = 1.0;
- Glib::usleep (100); // don't hog cpu
- }
-
- pthread_mutex_unlock (&_freewheel_mutex);
-
- _active_fw = false;
-
- if (_run) {
- // engine.process_callback() returner error
- engine.halted_callback("ASIO Freehweeling aborted.");
- }
- return 0;
-}
-
-int
-ASIOBackend::process_callback (const uint32_t n_samples, const uint64_t host_time)
-{
- uint32_t i = 0;
- uint64_t clock1, clock2;
-
- _active_cb = true;
-
- if (_run && _freewheel && !_freewheel_ack) {
- // acknowledge freewheeling; hand-over thread ID
- pthread_mutex_lock (&_freewheel_mutex);
- if (_freewheel) _freewheel_ack = true;
- pthread_cond_signal (&_freewheel_signal);
- pthread_mutex_unlock (&_freewheel_mutex);
- }
-
- if (!_run || _freewheel || _preinit) {
- // NB if we return 1, the output is
- // zeroed by the asio callback
- return 1;
- }
-
- if (_reinit_thread_callback || _main_thread != pthread_self()) {
- _reinit_thread_callback = false;
- _main_thread = pthread_self();
- AudioEngine::thread_init_callback (this);
- }
-
- if (pthread_mutex_trylock (&_process_callback_mutex)) {
- // block while devices are added/removed
-#ifndef NDEBUG
- printf("Xrun due to device change\n");
-#endif
- engine.Xrun();
- return 1;
- }
- /* port-connection change */
- pre_process();
-
- // cycle-length in usec
- const double nominal_time = 1e6 * n_samples / _samplerate;
-
- clock1 = g_get_monotonic_time();
-
- /* get midi */
- i=0;
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it, ++i) {
- WindowsMidiBuffer* mbuf = static_cast<WindowsMidiBuffer*>((*it)->get_buffer(0));
- mbuf->clear();
-#if 0 // TODO
- uint64_t time_ns;
- uint8_t data[128];
- size_t size = sizeof(data);
- while (_midiio->recv_event (i, nominal_time, time_ns, data, size)) {
- pframes_t time = floor((float) time_ns * _samplerate * 1e-9);
- assert (time < n_samples);
- midi_event_put((void*)mbuf, time, data, size);
- size = sizeof(data);
- }
-#endif
- }
-
- /* get audio */
- i = 0;
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it, ++i) {
-#if 0 // TODO
- _pcmio->get_capture_channel (i, (float*)((*it)->get_buffer(n_samples)), n_samples);
-#else
- memset ((*it)->get_buffer (n_samples), 0, n_samples * sizeof (Sample));
-#endif
- }
-
- /* clear output buffers */
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it) {
- memset ((*it)->get_buffer (n_samples), 0, n_samples * sizeof (Sample));
- }
-
-#if 0 // TODO; sync Audio + midi
- _midiio->start_cycle();
-#endif
- _last_process_start = host_time;
-
- if (engine.process_callback (n_samples)) {
- fprintf(stderr, "ENGINE PROCESS ERROR\n");
- _active_cb = false;
- pthread_mutex_unlock (&_process_callback_mutex);
- return -1;
- }
-
- /* mixdown midi */
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it) {
- static_cast<WindowsMidiPort*>(*it)->get_buffer(0);
- }
-
- /* queue outgoing midi */
-#if 0 // TODO
- i = 0;
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it, ++i) {
-#if 0 // something's still b0rked with WindowsMidiIo::send_events()
- const WindowsMidiBuffer *src = static_cast<const WindowsMidiPort*>(*it)->const_buffer();
- _midiio->send_events (i, nominal_time, (void*)src);
-#else // works..
- const WindowsMidiBuffer *src = static_cast<const WindowsMidiPort*>(*it)->const_buffer();
- for (WindowsMidiBuffer::const_iterator mit = src->begin (); mit != src->end (); ++mit) {
- _midiio->send_event (i, (*mit)->timestamp() / nominal_time, (*mit)->data(), (*mit)->size());
- }
-#endif
- }
-#endif
-
- /* write back audio */
-#if 0 // TODO
- i = 0;
- for (std::vector<ASIOBackendPort*>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it, ++i) {
- _pcmio->set_playback_channel (i, (float const*)(*it)->get_buffer (n_samples), n_samples);
- }
-#endif
-
- _processed_samples += n_samples;
-
- /* calc DSP load. */
- clock2 = g_get_monotonic_time();
- const int64_t elapsed_time = clock2 - clock1;
- _dsp_load = elapsed_time / nominal_time;
-
- pthread_mutex_unlock (&_process_callback_mutex);
- return 0;
-}
-
-void
-ASIOBackend::error_callback ()
-{
-#if 0 // TODO
- _pcmio->set_error_callback (NULL, NULL);
- _pcmio->set_sample_rate_callback (NULL, NULL);
- _pcmio->set_xrun_callback (NULL, NULL);
- _midiio->set_port_changed_callback(NULL, NULL);
-#endif
- engine.halted_callback("ASIO Process aborted.");
- _active_cb = false;
-}
-
-void
-ASIOBackend::xrun_callback ()
-{
- engine.Xrun ();
-}
-
-void
-ASIOBackend::buffer_size_callback ()
-{
-#if 0 // TODO
- uint32_t bs = _pcmio->samples_per_period();
- if (bs == _samples_per_period) {
- return;
- }
- _samples_per_period = bs;
- engine.buffer_size_change (_samples_per_period);
-#endif
-}
-
-void
-ASIOBackend::sample_rate_callback ()
-{
-#if 0 // TODO
- _pcmio->set_error_callback (NULL, NULL);
- _pcmio->set_sample_rate_callback (NULL, NULL);
- _pcmio->set_xrun_callback (NULL, NULL);
- _midiio->set_port_changed_callback(NULL, NULL);
- engine.halted_callback("Sample Rate Changed.");
- stop();
-#endif
-}
-
-void
-ASIOBackend::hw_changed_callback ()
-{
-#if 0 // TODO
- _reinit_thread_callback = true;
- engine.request_device_list_update();
-#endif
-}
-
-/******************************************************************************/
-
-static boost::shared_ptr<ASIOBackend> _instance;
-
-static boost::shared_ptr<AudioBackend> backend_factory (AudioEngine& e);
-static int instantiate (const std::string& arg1, const std::string& /* arg2 */);
-static int deinstantiate ();
-static bool already_configured ();
-static bool available ();
-
-static ARDOUR::AudioBackendInfo _descriptor = {
- "ASIO",
- instantiate,
- deinstantiate,
- backend_factory,
- already_configured,
- available
-};
-
-static boost::shared_ptr<AudioBackend>
-backend_factory (AudioEngine& e)
-{
- if (!_instance) {
- _instance.reset (new ASIOBackend (e, _descriptor));
- }
- return _instance;
-}
-
-static int
-instantiate (const std::string& arg1, const std::string& /* arg2 */)
-{
- s_instance_name = arg1;
- return 0;
-}
-
-static int
-deinstantiate ()
-{
- _instance.reset ();
- return 0;
-}
-
-static bool
-already_configured ()
-{
- return false;
-}
-
-static bool
-available ()
-{
- return true;
-}
-
-extern "C" ARDOURBACKEND_API ARDOUR::AudioBackendInfo* descriptor ()
-{
- return &_descriptor;
-}
-
-
-/******************************************************************************/
-ASIOBackendPort::ASIOBackendPort (ASIOBackend &b, const std::string& name, PortFlags flags)
- : _osx_backend (b)
- , _name (name)
- , _flags (flags)
-{
- _capture_latency_range.min = 0;
- _capture_latency_range.max = 0;
- _playback_latency_range.min = 0;
- _playback_latency_range.max = 0;
-}
-
-ASIOBackendPort::~ASIOBackendPort () {
- disconnect_all ();
-}
-
-
-int ASIOBackendPort::connect (ASIOBackendPort *port)
-{
- if (!port) {
- PBD::error << _("ASIOBackendPort::connect (): invalid (null) port") << endmsg;
- return -1;
- }
-
- if (type () != port->type ()) {
- PBD::error << _("ASIOBackendPort::connect (): wrong port-type") << endmsg;
- return -1;
- }
-
- if (is_output () && port->is_output ()) {
- PBD::error << _("ASIOBackendPort::connect (): cannot inter-connect output ports.") << endmsg;
- return -1;
- }
-
- if (is_input () && port->is_input ()) {
- PBD::error << _("ASIOBackendPort::connect (): cannot inter-connect input ports.") << endmsg;
- return -1;
- }
-
- if (this == port) {
- PBD::error << _("ASIOBackendPort::connect (): cannot self-connect ports.") << endmsg;
- return -1;
- }
-
- if (is_connected (port)) {
-#if 0 // don't bother to warn about this for now. just ignore it
- PBD::error << _("ASIOBackendPort::connect (): ports are already connected:")
- << " (" << name () << ") -> (" << port->name () << ")"
- << endmsg;
-#endif
- return -1;
- }
-
- _connect (port, true);
- return 0;
-}
-
-
-void ASIOBackendPort::_connect (ASIOBackendPort *port, bool callback)
-{
- _connections.push_back (port);
- if (callback) {
- port->_connect (this, false);
- _osx_backend.port_connect_callback (name(), port->name(), true);
- }
-}
-
-int ASIOBackendPort::disconnect (ASIOBackendPort *port)
-{
- if (!port) {
- PBD::error << _("ASIOBackendPort::disconnect (): invalid (null) port") << endmsg;
- return -1;
- }
-
- if (!is_connected (port)) {
- PBD::error << _("ASIOBackendPort::disconnect (): ports are not connected:")
- << " (" << name () << ") -> (" << port->name () << ")"
- << endmsg;
- return -1;
- }
- _disconnect (port, true);
- return 0;
-}
-
-void ASIOBackendPort::_disconnect (ASIOBackendPort *port, bool callback)
-{
- std::vector<ASIOBackendPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
- assert (it != _connections.end ());
-
- _connections.erase (it);
-
- if (callback) {
- port->_disconnect (this, false);
- _osx_backend.port_connect_callback (name(), port->name(), false);
- }
-}
-
-
-void ASIOBackendPort::disconnect_all ()
-{
- while (!_connections.empty ()) {
- _connections.back ()->_disconnect (this, false);
- _osx_backend.port_connect_callback (name(), _connections.back ()->name(), false);
- _connections.pop_back ();
- }
-}
-
-bool
-ASIOBackendPort::is_connected (const ASIOBackendPort *port) const
-{
- return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
-}
-
-bool ASIOBackendPort::is_physically_connected () const
-{
- for (std::vector<ASIOBackendPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
- if ((*it)->is_physical ()) {
- return true;
- }
- }
- return false;
-}
-
-/******************************************************************************/
-
-ASIOPort::ASIOPort (ASIOBackend &b, const std::string& name, PortFlags flags)
- : ASIOBackendPort (b, name, flags)
-{
- memset (_buffer, 0, sizeof (_buffer));
- mlock(_buffer, sizeof (_buffer));
-}
-
-ASIOPort::~ASIOPort () { }
-
-void* ASIOPort::get_buffer (pframes_t n_samples)
-{
- if (is_input ()) {
- std::vector<ASIOBackendPort*>::const_iterator it = get_connections ().begin ();
- if (it == get_connections ().end ()) {
- memset (_buffer, 0, n_samples * sizeof (Sample));
- } else {
- ASIOPort const * source = static_cast<const ASIOPort*>(*it);
- assert (source && source->is_output ());
- memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
- while (++it != get_connections ().end ()) {
- source = static_cast<const ASIOPort*>(*it);
- assert (source && source->is_output ());
- Sample* dst = buffer ();
- const Sample* src = source->const_buffer ();
- for (uint32_t s = 0; s < n_samples; ++s, ++dst, ++src) {
- *dst += *src;
- }
- }
- }
- }
- return _buffer;
-}
-
-
-WindowsMidiPort::WindowsMidiPort (ASIOBackend &b, const std::string& name, PortFlags flags)
- : ASIOBackendPort (b, name, flags)
- , _n_periods (1)
- , _bufperiod (0)
-{
- _buffer[0].clear ();
- _buffer[1].clear ();
-}
-
-WindowsMidiPort::~WindowsMidiPort () { }
-
-struct MidiEventSorter {
- bool operator() (const boost::shared_ptr<WindowsMidiEvent>& a, const boost::shared_ptr<WindowsMidiEvent>& b) {
- return *a < *b;
- }
-};
-
-void* WindowsMidiPort::get_buffer (pframes_t /* nframes */)
-{
- if (is_input ()) {
- (_buffer[_bufperiod]).clear ();
- for (std::vector<ASIOBackendPort*>::const_iterator i = get_connections ().begin ();
- i != get_connections ().end ();
- ++i) {
- const WindowsMidiBuffer * src = static_cast<const WindowsMidiPort*>(*i)->const_buffer ();
- for (WindowsMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
- (_buffer[_bufperiod]).push_back (boost::shared_ptr<WindowsMidiEvent>(new WindowsMidiEvent (**it)));
- }
- }
- std::sort ((_buffer[_bufperiod]).begin (), (_buffer[_bufperiod]).end (), MidiEventSorter());
- }
- return &(_buffer[_bufperiod]);
-}
-
-WindowsMidiEvent::WindowsMidiEvent (const pframes_t timestamp, const uint8_t* data, size_t size)
- : _size (size)
- , _timestamp (timestamp)
- , _data (0)
-{
- if (size > 0) {
- _data = (uint8_t*) malloc (size);
- memcpy (_data, data, size);
- }
-}
-
-WindowsMidiEvent::WindowsMidiEvent (const WindowsMidiEvent& other)
- : _size (other.size ())
- , _timestamp (other.timestamp ())
- , _data (0)
-{
- if (other.size () && other.const_data ()) {
- _data = (uint8_t*) malloc (other.size ());
- memcpy (_data, other.const_data (), other.size ());
- }
-};
-
-WindowsMidiEvent::~WindowsMidiEvent () {
- free (_data);
-};
diff --git a/libs/backends/asio/asio_backend.h b/libs/backends/asio/asio_backend.h
deleted file mode 100644
index bef1589..0000000
--- a/libs/backends/asio/asio_backend.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Copyright (C) 2014 Robin Gareus <robin at gareus.org>
- * Copyright (C) 2013 Paul Davis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __libbackend_asio_backend_h__
-#define __libbackend_asio_backend_h__
-
-#include <string>
-#include <vector>
-#include <map>
-#include <set>
-
-#include <stdint.h>
-#include <pthread.h>
-
-#include <boost/shared_ptr.hpp>
-
-#include "ardour/audio_backend.h"
-#include "ardour/types.h"
-
-namespace ARDOUR {
-
-class ASIOBackend;
-
-class WindowsMidiEvent {
- public:
- WindowsMidiEvent (const pframes_t timestamp, const uint8_t* data, size_t size);
- WindowsMidiEvent (const WindowsMidiEvent& other);
- ~WindowsMidiEvent ();
- size_t size () const { return _size; };
- pframes_t timestamp () const { return _timestamp; };
- const unsigned char* const_data () const { return _data; };
- unsigned char* data () { return _data; };
- bool operator< (const WindowsMidiEvent &other) const { return timestamp () < other.timestamp (); };
- private:
- size_t _size;
- pframes_t _timestamp;
- uint8_t *_data;
-};
-
-typedef std::vector<boost::shared_ptr<WindowsMidiEvent> > WindowsMidiBuffer;
-
-class ASIOBackendPort {
- protected:
- ASIOBackendPort (ASIOBackend &b, const std::string&, PortFlags);
- public:
- virtual ~ASIOBackendPort ();
-
- const std::string& name () const { return _name; }
- const std::string& pretty_name () const { return _pretty_name; }
- PortFlags flags () const { return _flags; }
-
- int set_name (const std::string &name) { _name = name; return 0; }
- int set_pretty_name (const std::string &name) { _pretty_name = name; return 0; }
-
- virtual DataType type () const = 0;
-
- bool is_input () const { return flags () & IsInput; }
- bool is_output () const { return flags () & IsOutput; }
- bool is_physical () const { return flags () & IsPhysical; }
- bool is_terminal () const { return flags () & IsTerminal; }
- bool is_connected () const { return _connections.size () != 0; }
- bool is_connected (const ASIOBackendPort *port) const;
- bool is_physically_connected () const;
-
- const std::vector<ASIOBackendPort *>& get_connections () const { return _connections; }
-
- int connect (ASIOBackendPort *port);
- int disconnect (ASIOBackendPort *port);
- void disconnect_all ();
-
- virtual void* get_buffer (pframes_t nframes) = 0;
-
- const LatencyRange latency_range (bool for_playback) const
- {
- return for_playback ? _playback_latency_range : _capture_latency_range;
- }
-
- void set_latency_range (const LatencyRange &latency_range, bool for_playback)
- {
- if (for_playback)
- {
- _playback_latency_range = latency_range;
- }
- else
- {
- _capture_latency_range = latency_range;
- }
- }
-
- private:
- ASIOBackend &_osx_backend;
- std::string _name;
- std::string _pretty_name;
- const PortFlags _flags;
- LatencyRange _capture_latency_range;
- LatencyRange _playback_latency_range;
- std::vector<ASIOBackendPort*> _connections;
-
- void _connect (ASIOBackendPort* , bool);
- void _disconnect (ASIOBackendPort* , bool);
-
-}; // class ASIOBackendPort
-
-class ASIOPort : public ASIOBackendPort {
- public:
- ASIOPort (ASIOBackend &b, const std::string&, PortFlags);
- ~ASIOPort ();
-
- DataType type () const { return DataType::AUDIO; };
-
- Sample* buffer () { return _buffer; }
- const Sample* const_buffer () const { return _buffer; }
- void* get_buffer (pframes_t nframes);
-
- private:
- Sample _buffer[8192];
-}; // class ASIOPort
-
-class WindowsMidiPort : public ASIOBackendPort {
- public:
- WindowsMidiPort (ASIOBackend &b, const std::string&, PortFlags);
- ~WindowsMidiPort ();
-
- DataType type () const { return DataType::MIDI; };
-
- void* get_buffer (pframes_t nframes);
- const WindowsMidiBuffer * const_buffer () const { return & _buffer[_bufperiod]; }
-
- void next_period() { if (_n_periods > 1) { get_buffer(0); _bufperiod = (_bufperiod + 1) % _n_periods; } }
- void set_n_periods(int n) { if (n > 0 && n < 3) { _n_periods = n; } }
-
- private:
- WindowsMidiBuffer _buffer[2];
- int _n_periods;
- int _bufperiod;
-}; // class WindowsMidiPort
-
-class ASIOBackend : public AudioBackend {
- friend class ASIOBackendPort;
- public:
- ASIOBackend (AudioEngine& e, AudioBackendInfo& info);
- ~ASIOBackend ();
-
- /* AUDIOBACKEND API */
-
- std::string name () const;
- bool is_realtime () const;
-
- std::vector<DeviceStatus> enumerate_devices () const;
- std::vector<float> available_sample_rates (const std::string& device) const;
- std::vector<uint32_t> available_buffer_sizes (const std::string& device) const;
- uint32_t available_input_channel_count (const std::string& device) const;
- uint32_t available_output_channel_count (const std::string& device) const;
-
- bool can_change_sample_rate_when_running () const;
- bool can_change_buffer_size_when_running () const;
-
- int set_device_name (const std::string&);
- int set_sample_rate (float);
- int set_buffer_size (uint32_t);
- int set_interleaved (bool yn);
- int set_input_channels (uint32_t);
- int set_output_channels (uint32_t);
- int set_systemic_input_latency (uint32_t);
- int set_systemic_output_latency (uint32_t);
- int set_systemic_midi_input_latency (std::string const, uint32_t) { return 0; }
- int set_systemic_midi_output_latency (std::string const, uint32_t) { return 0; }
-
- int reset_device () { return 0; };
-
- /* Retrieving parameters */
- std::string device_name () const;
- float sample_rate () const;
- uint32_t buffer_size () const;
- bool interleaved () const;
- uint32_t input_channels () const;
- uint32_t output_channels () const;
- uint32_t systemic_input_latency () const;
- uint32_t systemic_output_latency () const;
- uint32_t systemic_midi_input_latency (std::string const) const { return 0; }
- uint32_t systemic_midi_output_latency (std::string const) const { return 0; }
-
- bool can_set_systemic_midi_latencies () const { return false; /* TODO */}
-
- /* External control app - TODO */
- std::string control_app_name () const { return std::string (); /* return std::string ("Windows"); */ }
- void launch_control_app ();
-
- /* MIDI */
- std::vector<std::string> enumerate_midi_options () const;
- int set_midi_option (const std::string&);
- std::string midi_option () const;
-
- std::vector<DeviceStatus> enumerate_midi_devices () const {
- return std::vector<AudioBackend::DeviceStatus> ();
- }
- int set_midi_device_enabled (std::string const, bool) {
- return true;
- }
- bool midi_device_enabled (std::string const) const {
- return false;
- }
-
- // really private, but needing static access:
- int process_callback(uint32_t, uint64_t);
- void error_callback();
- void xrun_callback();
- void buffer_size_callback();
- void sample_rate_callback();
- void hw_changed_callback();
-
- protected:
- /* State Control */
- int _start (bool for_latency_measurement);
- public:
- int stop ();
- int freewheel (bool);
- float dsp_load () const;
- size_t raw_buffer_size (DataType t);
-
- /* Process time */
- framepos_t sample_time ();
- framepos_t sample_time_at_cycle_start ();
- pframes_t samples_since_cycle_start ();
-
- int create_process_thread (boost::function<void()> func);
- int join_process_threads ();
- bool in_process_thread ();
- uint32_t process_thread_count ();
-
- void update_latencies ();
-
- /* PORTENGINE API */
-
- void* private_handle () const;
- const std::string& my_name () const;
- bool available () const;
- uint32_t port_name_size () const;
-
- int set_port_name (PortHandle, const std::string&);
- std::string get_port_name (PortHandle) const;
- PortHandle get_port_by_name (const std::string&) const;
- int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
-
- int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
-
- DataType port_data_type (PortHandle) const;
-
- PortHandle register_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags);
- void unregister_port (PortHandle);
-
- int connect (const std::string& src, const std::string& dst);
- int disconnect (const std::string& src, const std::string& dst);
- int connect (PortHandle, const std::string&);
- int disconnect (PortHandle, const std::string&);
- int disconnect_all (PortHandle);
-
- bool connected (PortHandle, bool process_callback_safe);
- bool connected_to (PortHandle, const std::string&, bool process_callback_safe);
- bool physically_connected (PortHandle, bool process_callback_safe);
- int get_connections (PortHandle, std::vector<std::string>&, bool process_callback_safe);
-
- /* MIDI */
- int midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index);
- int midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size);
- uint32_t get_midi_event_count (void* port_buffer);
- void midi_clear (void* port_buffer);
-
- /* Monitoring */
-
- bool can_monitor_input () const;
- int request_input_monitoring (PortHandle, bool);
- int ensure_input_monitoring (PortHandle, bool);
- bool monitoring_input (PortHandle);
-
- /* Latency management */
-
- void set_latency_range (PortHandle, bool for_playback, LatencyRange);
- LatencyRange get_latency_range (PortHandle, bool for_playback);
-
- /* Discovering physical ports */
-
- bool port_is_physical (PortHandle) const;
- void get_physical_outputs (DataType type, std::vector<std::string>&);
- void get_physical_inputs (DataType type, std::vector<std::string>&);
- ChanCount n_physical_outputs () const;
- ChanCount n_physical_inputs () const;
-
- /* Getting access to the data buffer for a port */
-
- void* get_buffer (PortHandle, pframes_t);
-
- void* freewheel_thread ();
- void pre_process ();
-
- private:
- std::string _instance_name;
- //ASIOPCM *_pcmio; // TODO
- //WindowsMidiIo *_midiio; // TODO
-
- bool _run; /* keep going or stop, ardour thread */
- bool _active_cb; /* is running, asio callback */
- bool _active_fw; /* is running, freewheel thread */
- bool _preinit;
- bool _freewheeling;
- bool _freewheel;
- bool _freewheel_ack;
- bool _reinit_thread_callback;
- bool _measure_latency;
-
- uint64_t _last_process_start;
-
- pthread_mutex_t _process_callback_mutex;
-
- pthread_mutex_t _freewheel_mutex;
- pthread_cond_t _freewheel_signal;
-
- static std::vector<std::string> _midi_options;
- static std::vector<AudioBackend::DeviceStatus> _audio_device_status;
- static std::vector<AudioBackend::DeviceStatus> _midi_device_status;
-
- mutable std::string _audio_device;
- std::string _midi_driver_option;
-
- /* audio settings */
- float _samplerate;
- size_t _samples_per_period;
- static size_t _max_buffer_size;
-
- uint32_t _n_inputs;
- uint32_t _n_outputs;
-
- uint32_t _systemic_audio_input_latency;
- uint32_t _systemic_audio_output_latency;
-
- /* processing */
- float _dsp_load;
- uint64_t _processed_samples;
-
- pthread_t _main_thread;
- pthread_t _freeewheel_thread;
-
- /* process threads */
- static void* asio_process_thread (void *);
- std::vector<pthread_t> _threads;
-
- struct ThreadData {
- ASIOBackend* engine;
- boost::function<void ()> f;
- size_t stacksize;
-
- ThreadData (ASIOBackend* e, boost::function<void ()> fp, size_t stacksz)
- : engine (e) , f (fp) , stacksize (stacksz) {}
- };
-
- /* port engine */
- PortHandle add_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags);
- int register_system_audio_ports ();
- void unregister_ports (bool system_only = false);
-
- std::vector<ASIOBackendPort *> _ports;
- std::vector<ASIOBackendPort *> _system_inputs;
- std::vector<ASIOBackendPort *> _system_outputs;
- std::vector<ASIOBackendPort *> _system_midi_in;
- std::vector<ASIOBackendPort *> _system_midi_out;
-
- struct PortConnectData {
- std::string a;
- std::string b;
- bool c;
-
- PortConnectData (const std::string& a, const std::string& b, bool c)
- : a (a) , b (b) , c (c) {}
- };
-
- std::vector<PortConnectData *> _port_connection_queue;
- pthread_mutex_t _port_callback_mutex;
- bool _port_change_flag;
-
- void port_connect_callback (const std::string& a, const std::string& b, bool conn) {
- pthread_mutex_lock (&_port_callback_mutex);
- _port_connection_queue.push_back(new PortConnectData(a, b, conn));
- pthread_mutex_unlock (&_port_callback_mutex);
- }
-
- void port_connect_add_remove_callback () {
- pthread_mutex_lock (&_port_callback_mutex);
- _port_change_flag = true;
- pthread_mutex_unlock (&_port_callback_mutex);
- }
-
- bool valid_port (PortHandle port) const {
- return std::find (_ports.begin (), _ports.end (), (ASIOBackendPort*)port) != _ports.end ();
- }
-
- ASIOBackendPort * find_port (const std::string& port_name) const {
- for (std::vector<ASIOBackendPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
- if ((*it)->name () == port_name) {
- return *it;
- }
- }
- return NULL;
- }
-
- ASIOBackendPort * find_port_in (std::vector<ASIOBackendPort *> plist, const std::string& port_name) const {
- for (std::vector<ASIOBackendPort*>::const_iterator it = plist.begin (); it != plist.end (); ++it) {
- if ((*it)->name () == port_name) {
- return *it;
- }
- }
- return NULL;
- }
-
-}; // class ASIOBackend
-
-} // namespace
-
-#endif /* __libbackend_asio_backend_h__ */
diff --git a/libs/backends/asio/rt_thread.h b/libs/backends/asio/rt_thread.h
deleted file mode 100644
index 0535602..0000000
--- a/libs/backends/asio/rt_thread.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 Robin Gareus <robin at gareus.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __libbackend_portaudio_rthread_h__
-#define __libbackend_portaudio_rthread_h__
-
-#include <pthread.h>
-#include <sched.h>
-
-static int
-_realtime_pthread_create (
- const int policy, int priority, const size_t stacksize,
- pthread_t *thread,
- void *(*start_routine) (void *),
- void *arg)
-{
- int rv;
-
- pthread_attr_t attr;
- struct sched_param parm;
-
- const int p_min = sched_get_priority_min (policy);
- const int p_max = sched_get_priority_max (policy);
- priority += p_max;
- if (priority > p_max) priority = p_max;
- if (priority < p_min) priority = p_min;
- parm.sched_priority = priority;
-
- pthread_attr_init (&attr);
- pthread_attr_setschedpolicy (&attr, policy);
- pthread_attr_setschedparam (&attr, &parm);
- pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
- pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED);
- pthread_attr_setstacksize (&attr, stacksize);
- rv = pthread_create (thread, &attr, start_routine, arg);
- pthread_attr_destroy (&attr);
- return rv;
-}
-
-#endif
diff --git a/libs/backends/asio/wscript b/libs/backends/asio/wscript
deleted file mode 100644
index fd12219..0000000
--- a/libs/backends/asio/wscript
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-from waflib.extras import autowaf as autowaf
-from waflib import Options
-import os
-import sys
-import re
-
-I18N_PACKAGE = 'asio-backend'
-
-# Mandatory variables
-top = '.'
-out = 'build'
-
-def options(opt):
- autowaf.set_options(opt)
-
-def configure(conf):
- autowaf.configure(conf)
-
-def build(bld):
- obj = bld(features = 'cxx cxxshlib')
- obj.source = [ 'asio_backend.cc',
-# 'asio_io.cc',
-# 'mme_io.cc'
- ]
- obj.includes = ['.']
- obj.name = 'asio_backend'
- obj.target = 'asio_backend'
- obj.use = 'libardour libpbd'
- obj.install_path = os.path.join(bld.env['LIBDIR'], 'backends')
- obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
- 'ARDOURBACKEND_DLL_EXPORTS'
- ]
diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc
index a620bf0..a0eeb3d 100644
--- a/libs/backends/coreaudio/coreaudio_backend.cc
+++ b/libs/backends/coreaudio/coreaudio_backend.cc
@@ -31,7 +31,7 @@
#include "pbd/file_utils.h"
#include "ardour/filesystem_paths.h"
#include "ardour/port_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -497,13 +497,14 @@ CoreAudioBackend::_start (bool for_latency_measurement)
return BackendReinitializationError;
}
- if (_ports.size()) {
+ if (_ports.size () || _portmap.size ()) {
PBD::warning << _("CoreAudioBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
_system_inputs.clear();
_system_outputs.clear();
_system_midi_in.clear();
_system_midi_out.clear();
_ports.clear();
+ _portmap.clear();
}
uint32_t device1 = name_to_id(_input_audio_device);
@@ -901,11 +902,20 @@ CoreAudioBackend::port_name_size () const
int
CoreAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
{
+ std::string newname (_instance_name + ":" + name);
if (!valid_port (port)) {
PBD::warning << _("CoreAudioBackend::set_port_name: Invalid Port(s)") << endmsg;
return -1;
}
- return static_cast<CoreBackendPort*>(port)->set_name (_instance_name + ":" + name);
+ if (find_port (newname)) {
+ PBD::error << _("CoreAudioBackend::set_port_name: Port with given name already exists") << endmsg;
+ return -1;
+ }
+
+ CoreBackendPort* p = static_cast<CoreBackendPort*>(port);
+ _portmap.erase (p->name());
+ _portmap.insert (make_pair (newname, p));
+ return p->set_name (newname);
}
std::string
@@ -935,6 +945,20 @@ CoreAudioBackend::get_port_property (PortHandle port, const std::string& key, st
return -1;
}
+int
+CoreAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+ if (!valid_port (port)) {
+ PBD::warning << _("CoreAudioBackend::set_port_property: Invalid Port(s)") << endmsg;
+ return -1;
+ }
+ if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+ static_cast<CoreBackendPort*>(port)->set_pretty_name (value);
+ return 0;
+ }
+ return -1;
+}
+
PortEngine::PortHandle
CoreAudioBackend::get_port_by_name (const std::string& name) const
{
@@ -956,8 +980,9 @@ CoreAudioBackend::get_ports (
use_regexp = true;
}
}
- for (size_t i = 0; i < _ports.size (); ++i) {
- CoreBackendPort* port = _ports[i];
+
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ CoreBackendPort* port = *i;
if ((port->type () == type) && flags == (port->flags () & flags)) {
if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
port_names.push_back (port->name ());
@@ -1016,7 +1041,8 @@ CoreAudioBackend::add_port (
return 0;
}
- _ports.push_back (port);
+ _ports.insert (port);
+ _portmap.insert (make_pair (name, port));
return port;
}
@@ -1028,12 +1054,13 @@ CoreAudioBackend::unregister_port (PortEngine::PortHandle port_handle)
return;
}
CoreBackendPort* port = static_cast<CoreBackendPort*>(port_handle);
- std::vector<CoreBackendPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<CoreBackendPort*>(port_handle));
+ PortIndex::iterator i = std::find (_ports.begin(), _ports.end(), static_cast<CoreBackendPort*>(port_handle));
if (i == _ports.end ()) {
PBD::warning << _("CoreAudioBackend::unregister_port: Failed to find port") << endmsg;
return;
}
disconnect_all(port_handle);
+ _portmap.erase (port->name());
_ports.erase (i);
delete port;
}
@@ -1186,19 +1213,19 @@ CoreAudioBackend::coremidi_rediscover()
void
CoreAudioBackend::unregister_ports (bool system_only)
{
- size_t i = 0;
_system_inputs.clear();
_system_outputs.clear();
_system_midi_in.clear();
_system_midi_out.clear();
- while (i < _ports.size ()) {
- CoreBackendPort* port = _ports[i];
+
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end ();) {
+ PortIndex::iterator cur = i++;
+ CoreBackendPort* port = *cur;
if (! system_only || (port->is_physical () && port->is_terminal ())) {
port->disconnect_all ();
+ _portmap.erase (port->name());
delete port;
- _ports.erase (_ports.begin() + i);
- } else {
- ++i;
+ _ports.erase (cur);
}
}
}
@@ -1287,10 +1314,12 @@ bool
CoreAudioBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
{
CoreBackendPort* dst_port = find_port (dst);
+#ifndef NDEBUG
if (!valid_port (src) || !dst_port) {
PBD::warning << _("CoreAudioBackend::connected_to: Invalid Port") << endmsg;
return false;
}
+#endif
return static_cast<CoreBackendPort*>(src)->is_connected (dst_port);
}
@@ -1314,9 +1343,9 @@ CoreAudioBackend::get_connections (PortEngine::PortHandle port, std::vector<std:
assert (0 == names.size ());
- const std::vector<CoreBackendPort*>& connected_ports = static_cast<CoreBackendPort*>(port)->get_connections ();
+ const std::set<CoreBackendPort*>& connected_ports = static_cast<CoreBackendPort*>(port)->get_connections ();
- for (std::vector<CoreBackendPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
+ for (std::set<CoreBackendPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
names.push_back ((*i)->name ());
}
@@ -1459,8 +1488,8 @@ CoreAudioBackend::port_is_physical (PortEngine::PortHandle port) const
void
CoreAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
{
- for (size_t i = 0; i < _ports.size (); ++i) {
- CoreBackendPort* port = _ports[i];
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ CoreBackendPort* port = *i;
if ((port->type () == type) && port->is_input () && port->is_physical ()) {
port_names.push_back (port->name ());
}
@@ -1470,8 +1499,8 @@ CoreAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>&
void
CoreAudioBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
{
- for (size_t i = 0; i < _ports.size (); ++i) {
- CoreBackendPort* port = _ports[i];
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ CoreBackendPort* port = *i;
if ((port->type () == type) && port->is_output () && port->is_physical ()) {
port_names.push_back (port->name ());
}
@@ -1483,8 +1512,8 @@ CoreAudioBackend::n_physical_outputs () const
{
int n_midi = 0;
int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- CoreBackendPort* port = _ports[i];
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ CoreBackendPort* port = *i;
if (port->is_output () && port->is_physical ()) {
switch (port->type ()) {
case DataType::AUDIO: ++n_audio; break;
@@ -1504,8 +1533,8 @@ CoreAudioBackend::n_physical_inputs () const
{
int n_midi = 0;
int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- CoreBackendPort* port = _ports[i];
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ CoreBackendPort* port = *i;
if (port->is_input () && port->is_physical ()) {
switch (port->type ()) {
case DataType::AUDIO: ++n_audio; break;
@@ -1962,7 +1991,7 @@ int CoreBackendPort::connect (CoreBackendPort *port)
void CoreBackendPort::_connect (CoreBackendPort *port, bool callback)
{
- _connections.push_back (port);
+ _connections.insert (port);
if (callback) {
port->_connect (this, false);
_osx_backend.port_connect_callback (name(), port->name(), true);
@@ -1988,12 +2017,9 @@ int CoreBackendPort::disconnect (CoreBackendPort *port)
void CoreBackendPort::_disconnect (CoreBackendPort *port, bool callback)
{
- std::vector<CoreBackendPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
+ std::set<CoreBackendPort*>::iterator it = _connections.find (port);
assert (it != _connections.end ());
-
_connections.erase (it);
-
if (callback) {
port->_disconnect (this, false);
_osx_backend.port_connect_callback (name(), port->name(), false);
@@ -2004,21 +2030,22 @@ void CoreBackendPort::_disconnect (CoreBackendPort *port, bool callback)
void CoreBackendPort::disconnect_all ()
{
while (!_connections.empty ()) {
- _connections.back ()->_disconnect (this, false);
- _osx_backend.port_connect_callback (name(), _connections.back ()->name(), false);
- _connections.pop_back ();
+ std::set<CoreBackendPort*>::iterator it = _connections.begin ();
+ (*it)->_disconnect (this, false);
+ _osx_backend.port_connect_callback (name(), (*it)->name(), false);
+ _connections.erase (it);
}
}
bool
CoreBackendPort::is_connected (const CoreBackendPort *port) const
{
- return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
+ return _connections.find (const_cast<CoreBackendPort *>(port)) != _connections.end ();
}
bool CoreBackendPort::is_physically_connected () const
{
- for (std::vector<CoreBackendPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
+ for (std::set<CoreBackendPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
if ((*it)->is_physical ()) {
return true;
}
@@ -2040,14 +2067,15 @@ CoreAudioPort::~CoreAudioPort () { }
void* CoreAudioPort::get_buffer (pframes_t n_samples)
{
if (is_input ()) {
- std::vector<CoreBackendPort*>::const_iterator it = get_connections ().begin ();
- if (it == get_connections ().end ()) {
+ const std::set<CoreBackendPort *>& connections = get_connections ();
+ std::set<CoreBackendPort*>::const_iterator it = connections.begin ();
+ if (it == connections.end ()) {
memset (_buffer, 0, n_samples * sizeof (Sample));
} else {
CoreAudioPort const * source = static_cast<const CoreAudioPort*>(*it);
assert (source && source->is_output ());
memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
- while (++it != get_connections ().end ()) {
+ while (++it != connections.end ()) {
source = static_cast<const CoreAudioPort*>(*it);
assert (source && source->is_output ());
Sample* dst = buffer ();
@@ -2090,8 +2118,9 @@ void* CoreMidiPort::get_buffer (pframes_t /* nframes */)
{
if (is_input ()) {
(_buffer[_bufperiod]).clear ();
- for (std::vector<CoreBackendPort*>::const_iterator i = get_connections ().begin ();
- i != get_connections ().end ();
+ const std::set<CoreBackendPort*>& connections = get_connections ();
+ for (std::set<CoreBackendPort*>::const_iterator i = connections.begin ();
+ i != connections.end ();
++i) {
const CoreMidiBuffer * src = static_cast<const CoreMidiPort*>(*i)->const_buffer ();
for (CoreMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h
index e36e936..d37ef6c 100644
--- a/libs/backends/coreaudio/coreaudio_backend.h
+++ b/libs/backends/coreaudio/coreaudio_backend.h
@@ -30,6 +30,7 @@
#include <boost/shared_ptr.hpp>
+#include "pbd/natsort.h"
#include "ardour/audio_backend.h"
#include "ardour/dsp_load_calculator.h"
#include "ardour/types.h"
@@ -82,7 +83,7 @@ class CoreBackendPort {
bool is_connected (const CoreBackendPort *port) const;
bool is_physically_connected () const;
- const std::vector<CoreBackendPort *>& get_connections () const { return _connections; }
+ const std::set<CoreBackendPort *>& get_connections () const { return _connections; }
int connect (CoreBackendPort *port);
int disconnect (CoreBackendPort *port);
@@ -114,7 +115,7 @@ class CoreBackendPort {
const PortFlags _flags;
LatencyRange _capture_latency_range;
LatencyRange _playback_latency_range;
- std::vector<CoreBackendPort*> _connections;
+ std::set<CoreBackendPort*> _connections;
void _connect (CoreBackendPort* , bool);
void _disconnect (CoreBackendPort* , bool);
@@ -330,6 +331,7 @@ class CoreAudioBackend : public AudioBackend {
std::string get_port_name (PortHandle) const;
PortHandle get_port_by_name (const std::string&) const;
int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+ int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
@@ -460,12 +462,24 @@ class CoreAudioBackend : public AudioBackend {
int register_system_audio_ports ();
void unregister_ports (bool system_only = false);
- std::vector<CoreBackendPort *> _ports;
std::vector<CoreBackendPort *> _system_inputs;
std::vector<CoreBackendPort *> _system_outputs;
std::vector<CoreBackendPort *> _system_midi_in;
std::vector<CoreBackendPort *> _system_midi_out;
+ struct SortByPortName
+ {
+ bool operator ()(const CoreBackendPort* lhs, const CoreBackendPort* rhs) const
+ {
+ return PBD::naturally_less (lhs->name ().c_str (), rhs->name ().c_str ());
+ }
+ };
+
+ typedef std::map<std::string, CoreBackendPort *> PortMap; // fast lookup in _ports
+ typedef std::set<CoreBackendPort *, SortByPortName> PortIndex; // fast lookup in _ports
+ PortMap _portmap;
+ PortIndex _ports;
+
struct PortConnectData {
std::string a;
std::string b;
@@ -492,16 +506,15 @@ class CoreAudioBackend : public AudioBackend {
}
bool valid_port (PortHandle port) const {
- return std::find (_ports.begin (), _ports.end (), (CoreBackendPort*)port) != _ports.end ();
+ return std::find (_ports.begin(), _ports.end(), static_cast<CoreBackendPort*>(port)) != _ports.end ();
}
- CoreBackendPort * find_port (const std::string& port_name) const {
- for (std::vector<CoreBackendPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
- if ((*it)->name () == port_name) {
- return *it;
- }
+ CoreBackendPort* find_port (const std::string& port_name) const {
+ PortMap::const_iterator it = _portmap.find (port_name);
+ if (it == _portmap.end()) {
+ return NULL;
}
- return NULL;
+ return (*it).second;
}
CoreBackendPort * find_port_in (std::vector<CoreBackendPort *> plist, const std::string& port_name) const {
diff --git a/libs/backends/coreaudio/wscript b/libs/backends/coreaudio/wscript
index 9aad9cd..8dc0300 100644
--- a/libs/backends/coreaudio/wscript
+++ b/libs/backends/coreaudio/wscript
@@ -29,8 +29,9 @@ def build(bld):
obj.name = 'coreaudio_backend'
obj.target = 'coreaudio_backend'
obj.use = 'libardour libpbd'
+ obj.uselib = 'GLIBMM XML'
obj.framework = [ 'CoreAudio', 'AudioToolbox', 'CoreServices' ]
- if bld.env['build_target'] not in [ 'lion' ] and (not bld.env['build_arch'] == "ppc"):
+ if bld.env['build_target'] not in [ 'lion', 'el_capitan' ] and (not bld.env['build_arch'] == "ppc"):
obj.framework += [ 'CoreMidi' ]
else:
obj.framework += [ 'CoreMIDI' ]
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index 130a92d..28d73d4 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -17,6 +17,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <math.h>
#include <sys/time.h>
#include <regex.h>
#include <stdlib.h>
@@ -33,7 +34,7 @@
#include "pbd/error.h"
#include "ardour/port_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -112,7 +113,10 @@ DummyAudioBackend::enumerate_devices () const
{
if (_device_status.empty()) {
_device_status.push_back (DeviceStatus (_("Silence"), true));
+ _device_status.push_back (DeviceStatus (_("DC -6dBFS (+.5)"), true));
+ _device_status.push_back (DeviceStatus (_("Demolition"), true));
_device_status.push_back (DeviceStatus (_("Sine Wave"), true));
+ _device_status.push_back (DeviceStatus (_("Sine Wave 1K, 1/3 Oct"), true));
_device_status.push_back (DeviceStatus (_("Square Wave"), true));
_device_status.push_back (DeviceStatus (_("Impulses"), true));
_device_status.push_back (DeviceStatus (_("Uniform White Noise"), true));
@@ -427,16 +431,20 @@ DummyAudioBackend::_start (bool /*for_latency_measurement*/)
return BackendReinitializationError;
}
- if (_ports.size()) {
+ if (_ports.size () || _portmap.size ()) {
PBD::warning << _("DummyAudioBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
- for (std::vector<DummyPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
+ for (PortIndex::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
PBD::info << _("DummyAudioBackend: port '") << (*it)->name () << "' exists." << endmsg;
}
+ for (PortMap::const_iterator it = _portmap.begin (); it != _portmap.end (); ++it) {
+ PBD::info << _("DummyAudioBackend: portmap '") << (*it).first << "' exists." << endmsg;
+ }
_system_inputs.clear();
_system_outputs.clear();
_system_midi_in.clear();
_system_midi_out.clear();
_ports.clear();
+ _portmap.clear();
}
if (register_system_ports()) {
@@ -642,11 +650,22 @@ DummyAudioBackend::port_name_size () const
int
DummyAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
{
+ std::string newname (_instance_name + ":" + name);
+
if (!valid_port (port)) {
PBD::error << _("DummyBackend::set_port_name: Invalid Port(s)") << endmsg;
return -1;
}
- return static_cast<DummyPort*>(port)->set_name (_instance_name + ":" + name);
+
+ if (find_port (newname)) {
+ PBD::error << _("DummyBackend::set_port_name: Port with given name already exists") << endmsg;
+ return -1;
+ }
+
+ DummyPort* p = static_cast<DummyPort*>(port);
+ _portmap.erase (p->name());
+ _portmap.insert (make_pair (newname, p));
+ return p->set_name (newname);
}
std::string
@@ -659,6 +678,37 @@ DummyAudioBackend::get_port_name (PortEngine::PortHandle port) const
return static_cast<DummyPort*>(port)->name ();
}
+int
+DummyAudioBackend::get_port_property (PortHandle port, const std::string& key, std::string& value, std::string& type) const
+{
+ if (!valid_port (port)) {
+ PBD::warning << _("DummyBackend::get_port_property: Invalid Port(s)") << endmsg;
+ return -1;
+ }
+ if (key == "http://jackaudio.org/metadata/pretty-name") {
+ type = "";
+ value = static_cast<DummyPort*>(port)->pretty_name ();
+ if (!value.empty()) {
+ return 0;
+ }
+ }
+ return -1;
+}
+
+int
+DummyAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+ if (!valid_port (port)) {
+ PBD::warning << _("DummyBackend::set_port_property: Invalid Port(s)") << endmsg;
+ return -1;
+ }
+ if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+ static_cast<DummyPort*>(port)->set_pretty_name (value);
+ return 0;
+ }
+ return -1;
+}
+
PortEngine::PortHandle
DummyAudioBackend::get_port_by_name (const std::string& name) const
{
@@ -680,8 +730,9 @@ DummyAudioBackend::get_ports (
use_regexp = true;
}
}
- for (size_t i = 0; i < _ports.size (); ++i) {
- DummyPort* port = _ports[i];
+
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ DummyPort* port = *i;
if ((port->type () == type) && flags == (port->flags () & flags)) {
if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
port_names.push_back (port->name ());
@@ -743,7 +794,8 @@ DummyAudioBackend::add_port (
return 0;
}
- _ports.push_back (port);
+ _ports.insert (port);
+ _portmap.insert (make_pair (name, port));
return port;
}
@@ -757,12 +809,13 @@ DummyAudioBackend::unregister_port (PortEngine::PortHandle port_handle)
return;
}
DummyPort* port = static_cast<DummyPort*>(port_handle);
- std::vector<DummyPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<DummyPort*>(port_handle));
+ PortIndex::iterator i = std::find (_ports.begin(), _ports.end(), static_cast<DummyPort*>(port_handle));
if (i == _ports.end ()) {
PBD::error << _("DummyBackend::unregister_port: Failed to find port") << endmsg;
return;
}
disconnect_all(port_handle);
+ _portmap.erase (port->name());
_ports.erase (i);
delete port;
}
@@ -782,6 +835,8 @@ DummyAudioBackend::register_system_ports()
gt = DummyAudioPort::PonyNoise;
} else if (_device == _("Sine Wave")) {
gt = DummyAudioPort::SineWave;
+ } else if (_device == _("Sine Wave 1K, 1/3 Oct")) {
+ gt = DummyAudioPort::SineWaveOctaves;
} else if (_device == _("Square Wave")) {
gt = DummyAudioPort::SquareWave;
} else if (_device == _("Impulses")) {
@@ -796,6 +851,10 @@ DummyAudioBackend::register_system_ports()
gt = DummyAudioPort::SquareSweepSwell;
} else if (_device == _("Loopback")) {
gt = DummyAudioPort::Loopback;
+ } else if (_device == _("Demolition")) {
+ gt = DummyAudioPort::Demolition;
+ } else if (_device == _("DC -6dBFS (+.5)")) {
+ gt = DummyAudioPort::DC05;
} else {
gt = DummyAudioPort::Silence;
}
@@ -819,7 +878,10 @@ DummyAudioBackend::register_system_ports()
if (!p) return -1;
set_latency_range (p, false, lr);
_system_inputs.push_back (static_cast<DummyAudioPort*>(p));
- static_cast<DummyAudioPort*>(p)->setup_generator (gt, _samplerate);
+ std::string name = static_cast<DummyAudioPort*>(p)->setup_generator (gt, _samplerate, i - 1, a_ins);
+ if (!name.empty ()) {
+ static_cast<DummyAudioPort*>(p)->set_pretty_name (name);
+ }
}
lr.min = lr.max = _systemic_output_latency;
@@ -842,7 +904,10 @@ DummyAudioBackend::register_system_ports()
set_latency_range (p, false, lr);
_system_midi_in.push_back (static_cast<DummyMidiPort*>(p));
if (_midi_mode == MidiGenerator) {
- static_cast<DummyMidiPort*>(p)->setup_generator (i % NUM_MIDI_EVENT_GENERATORS, _samplerate);
+ std::string name = static_cast<DummyMidiPort*>(p)->setup_generator (i % NUM_MIDI_EVENT_GENERATORS, _samplerate);
+ if (!name.empty ()) {
+ static_cast<DummyMidiPort*>(p)->set_pretty_name (name);
+ }
}
}
@@ -854,6 +919,17 @@ DummyAudioBackend::register_system_ports()
if (!p) return -1;
set_latency_range (p, true, lr);
_system_midi_out.push_back (static_cast<DummyMidiPort*>(p));
+
+ if (_device == _("Loopback") && _midi_mode == MidiToAudio) {
+ std::stringstream ss;
+ ss << "Midi2Audio";
+ for (int apc = 0; apc < (int)_system_inputs.size(); ++apc) {
+ if ((apc % m_out) + 1 == i) {
+ ss << " >" << (apc + 1);
+ }
+ }
+ static_cast<DummyMidiPort*>(p)->set_pretty_name (ss.str());
+ }
}
return 0;
}
@@ -866,14 +942,14 @@ DummyAudioBackend::unregister_ports (bool system_only)
_system_midi_in.clear();
_system_midi_out.clear();
- for (std::vector<DummyPort*>::iterator i = _ports.begin (); i != _ports.end ();) {
- DummyPort* port = *i;
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end ();) {
+ PortIndex::iterator cur = i++;
+ DummyPort* port = *cur;
if (! system_only || (port->is_physical () && port->is_terminal ())) {
port->disconnect_all ();
+ _portmap.erase (port->name());
delete port;
- i = _ports.erase (i);
- } else {
- ++i;
+ _ports.erase (cur);
}
}
}
@@ -962,10 +1038,12 @@ bool
DummyAudioBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
{
DummyPort* dst_port = find_port (dst);
+#ifndef NDEBUG
if (!valid_port (src) || !dst_port) {
PBD::error << _("DummyBackend::connected_to: Invalid Port") << endmsg;
return false;
}
+#endif
return static_cast<DummyPort*>(src)->is_connected (dst_port);
}
@@ -989,9 +1067,9 @@ DummyAudioBackend::get_connections (PortEngine::PortHandle port, std::vector<std
assert (0 == names.size ());
- const std::vector<DummyPort*>& connected_ports = static_cast<DummyPort*>(port)->get_connections ();
+ const std::set<DummyPort*>& connected_ports = static_cast<DummyPort*>(port)->get_connections ();
- for (std::vector<DummyPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
+ for (std::set<DummyPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
names.push_back ((*i)->name ());
}
@@ -1140,8 +1218,8 @@ DummyAudioBackend::port_is_physical (PortEngine::PortHandle port) const
void
DummyAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
{
- for (size_t i = 0; i < _ports.size (); ++i) {
- DummyPort* port = _ports[i];
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ DummyPort* port = *i;
if ((port->type () == type) && port->is_input () && port->is_physical ()) {
port_names.push_back (port->name ());
}
@@ -1151,8 +1229,8 @@ DummyAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>
void
DummyAudioBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
{
- for (size_t i = 0; i < _ports.size (); ++i) {
- DummyPort* port = _ports[i];
+ for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ DummyPort* port = *i;
if ((port->type () == type) && port->is_output () && port->is_physical ()) {
port_names.push_back (port->name ());
}
@@ -1164,8 +1242,8 @@ DummyAudioBackend::n_physical_outputs () const
{
int n_midi = 0;
int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- DummyPort* port = _ports[i];
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ DummyPort* port = *i;
if (port->is_output () && port->is_physical ()) {
switch (port->type ()) {
case DataType::AUDIO: ++n_audio; break;
@@ -1185,8 +1263,8 @@ DummyAudioBackend::n_physical_inputs () const
{
int n_midi = 0;
int n_audio = 0;
- for (size_t i = 0; i < _ports.size (); ++i) {
- DummyPort* port = _ports[i];
+ for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+ DummyPort* port = *i;
if (port->is_input () && port->is_physical ()) {
switch (port->type ()) {
case DataType::AUDIO: ++n_audio; break;
@@ -1456,7 +1534,7 @@ int DummyPort::connect (DummyPort *port)
void DummyPort::_connect (DummyPort *port, bool callback)
{
- _connections.push_back (port);
+ _connections.insert (port);
if (callback) {
port->_connect (this, false);
_dummy_backend.port_connect_callback (name(), port->name(), true);
@@ -1482,12 +1560,9 @@ int DummyPort::disconnect (DummyPort *port)
void DummyPort::_disconnect (DummyPort *port, bool callback)
{
- std::vector<DummyPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
+ std::set<DummyPort*>::iterator it = _connections.find (port);
assert (it != _connections.end ());
-
_connections.erase (it);
-
if (callback) {
port->_disconnect (this, false);
_dummy_backend.port_connect_callback (name(), port->name(), false);
@@ -1498,21 +1573,22 @@ void DummyPort::_disconnect (DummyPort *port, bool callback)
void DummyPort::disconnect_all ()
{
while (!_connections.empty ()) {
- _connections.back ()->_disconnect (this, false);
- _dummy_backend.port_connect_callback (name(), _connections.back ()->name(), false);
- _connections.pop_back ();
+ std::set<DummyPort*>::iterator it = _connections.begin ();
+ (*it)->_disconnect (this, false);
+ _dummy_backend.port_connect_callback (name(), (*it)->name(), false);
+ _connections.erase (it);
}
}
bool
DummyPort::is_connected (const DummyPort *port) const
{
- return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
+ return _connections.find (const_cast<DummyPort *>(port)) != _connections.end ();
}
bool DummyPort::is_physically_connected () const
{
- for (std::vector<DummyPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
+ for (std::set<DummyPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
if ((*it)->is_physical ()) {
return true;
}
@@ -1588,8 +1664,42 @@ DummyAudioPort::~DummyAudioPort () {
_wavetable = 0;
}
-void DummyAudioPort::setup_generator (GeneratorType const g, float const samplerate)
+static std::string format_hz (float freq) {
+ std::stringstream ss;
+ if (freq >= 10000) {
+ ss << std::setprecision (1) << std::fixed << freq / 1000 << "kHz";
+ } else if (freq >= 1000) {
+ ss << std::setprecision (2) << std::fixed << freq / 1000 << "kHz";
+ } else {
+ ss << std::setprecision (1) << std::fixed << freq << "Hz";
+ }
+ return ss.str ();
+}
+
+static size_t fit_wave (float freq, float rate, float precision = 0.001) {
+ const size_t max_mult = floor (freq * rate);
+ float minErr = 2;
+ size_t fact = 1;
+ for (size_t i = 1; i < max_mult; ++i) {
+ const float isc = rate * (float)i / freq; // ideal sample count
+ const float rsc = rintf (isc); // rounded sample count
+ const float err = fabsf (isc - rsc);
+ if (err < minErr) {
+ minErr = err;
+ fact = i;
+ }
+ if (err < precision) {
+ break;
+ }
+ }
+ //printf(" FIT %8.1f Hz / %8.1f Hz * %ld = %.0f (err: %e)\n", freq, rate, fact, fact * rate / freq, minErr);
+ return fact;
+}
+
+std::string
+DummyAudioPort::setup_generator (GeneratorType const g, float const samplerate, int c, int total)
{
+ std::string name;
DummyPort::setup_random_number_generator();
_gen_type = g;
@@ -1598,16 +1708,37 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler
case PonyNoise:
case UniformWhiteNoise:
case GaussianWhiteNoise:
+ case DC05:
case Silence:
break;
+ case Demolition:
+ _gen_period = 3 * samplerate;
+ break;
case KronekerDelta:
_gen_period = (5 + randi() % (int)(samplerate / 20.f));
+ name = "Delta " + format_hz (samplerate / _gen_period);
break;
case SquareWave:
_gen_period = (5 + randi() % (int)(samplerate / 20.f)) & ~1;
+ name = "Square " + format_hz (samplerate / _gen_period);
+ break;
+ case SineWaveOctaves:
+ {
+ const int x = c - floor (((float)total / 2));
+ float f = powf (2.f, x / 3.f) * 1000.f;
+ f = std::max (10.f, std::min (samplerate *.5f, f));
+ const size_t mult = fit_wave (f, samplerate);
+ _gen_period = rintf ((float)mult * samplerate / f);
+ name = "Sine " + format_hz (samplerate * mult / (float)_gen_period);
+ _wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
+ for (uint32_t i = 0 ; i < _gen_period; ++i) {
+ _wavetable[i] = .12589f * sinf(2.0f * M_PI * (float)mult * (float)i / (float)(_gen_period)); // -18dBFS
+ }
+ }
break;
case SineWave:
_gen_period = 5 + randi() % (int)(samplerate / 20.f);
+ name = "Sine " + format_hz (samplerate / _gen_period);
_wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
for (uint32_t i = 0 ; i < _gen_period; ++i) {
_wavetable[i] = .12589f * sinf(2.0f * M_PI * (float)i / (float)_gen_period); // -18dBFS
@@ -1666,6 +1797,7 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler
_wavetable = (Sample*) malloc (DummyAudioBackend::max_buffer_size() * sizeof(Sample));
break;
}
+ return name;
}
void DummyAudioPort::midi_to_wavetable (DummyMidiBuffer const * const src, size_t n_samples)
@@ -1720,6 +1852,23 @@ float DummyAudioPort::grandf ()
return r * x1;
}
+/* inspired by jack-demolition by Steve Harris */
+static const float _demolition[] = {
+ 0.0f, /* special case - 0dbFS white noise */
+ 0.0f, /* zero, may cause denomrals following a signal */
+ 0.73 / 1e45, /* very small - should be denormal when floated */
+ 3.7f, /* arbitrary number > 0dBFS */
+ -4.3f, /* arbitrary negative number > 0dBFS */
+ 4294967395.0f, /* 2^16 + 100 */
+ -4294967395.0f,
+ HUGE, /* Big, non-inf number */
+ INFINITY, /* +inf */
+ -INFINITY, /* -inf */
+ -NAN, /* -nan */
+ NAN, /* nan */
+ 0.0f, /* some silence to check for recovery */
+};
+
void DummyAudioPort::generate (const pframes_t n_samples)
{
Glib::Threads::Mutex::Lock lm (generator_lock);
@@ -1731,6 +1880,30 @@ void DummyAudioPort::generate (const pframes_t n_samples)
case Silence:
memset (_buffer, 0, n_samples * sizeof (Sample));
break;
+ case DC05:
+ for (pframes_t i = 0 ; i < n_samples; ++i) {
+ _buffer[i] = 0.5f;
+ }
+ break;
+ case Demolition:
+ switch (_gen_count2) {
+ case 0: // noise
+ for (pframes_t i = 0 ; i < n_samples; ++i) {
+ _buffer[i] = randf();
+ }
+ break;
+ default:
+ for (pframes_t i = 0 ; i < n_samples; ++i) {
+ _buffer[i] = _demolition [_gen_count2];
+ }
+ break;
+ }
+ _gen_offset += n_samples;
+ if (_gen_offset > _gen_period) {
+ _gen_offset = 0;
+ _gen_count2 = (_gen_count2 + 1) % (sizeof (_demolition) / sizeof (float));
+ }
+ break;
case SquareWave:
assert(_gen_period > 0);
for (pframes_t i = 0 ; i < n_samples; ++i) {
@@ -1768,6 +1941,7 @@ void DummyAudioPort::generate (const pframes_t n_samples)
case Loopback:
_gen_period = n_samples; // XXX DummyBackend::_samples_per_period;
case SineWave:
+ case SineWaveOctaves:
case SineSweep:
case SquareSweep:
assert(_wavetable && _gen_period > 0);
@@ -1829,8 +2003,9 @@ void DummyAudioPort::generate (const pframes_t n_samples)
void* DummyAudioPort::get_buffer (pframes_t n_samples)
{
if (is_input ()) {
- std::vector<DummyPort*>::const_iterator it = get_connections ().begin ();
- if (it == get_connections ().end ()) {
+ const std::set<DummyPort *>& connections = get_connections ();
+ std::set<DummyPort*>::const_iterator it = connections.begin ();
+ if (it == connections.end ()) {
memset (_buffer, 0, n_samples * sizeof (Sample));
} else {
DummyAudioPort * source = static_cast<DummyAudioPort*>(*it);
@@ -1839,7 +2014,7 @@ void* DummyAudioPort::get_buffer (pframes_t n_samples)
source->get_buffer(n_samples); // generate signal.
}
memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
- while (++it != get_connections ().end ()) {
+ while (++it != connections.end ()) {
source = static_cast<DummyAudioPort*>(*it);
assert (source && source->is_output ());
Sample* dst = buffer ();
@@ -1890,13 +2065,15 @@ void DummyMidiPort::set_loopback (DummyMidiBuffer const * const src)
}
}
-void DummyMidiPort::setup_generator (int seq_id, const float sr)
+std::string
+DummyMidiPort::setup_generator (int seq_id, const float sr)
{
DummyPort::setup_random_number_generator();
_midi_seq_dat = DummyMidiData::sequences[seq_id % NUM_MIDI_EVENT_GENERATORS];
_midi_seq_spb = sr * .5f; // 120 BPM, beat_time 1.0 per beat.
_midi_seq_pos = 0;
_midi_seq_time = 0;
+ return DummyMidiData::sequence_names[seq_id];
}
void DummyMidiPort::midi_generate (const pframes_t n_samples)
@@ -1944,8 +2121,9 @@ void* DummyMidiPort::get_buffer (pframes_t n_samples)
{
if (is_input ()) {
_buffer.clear ();
- for (std::vector<DummyPort*>::const_iterator i = get_connections ().begin ();
- i != get_connections ().end ();
+ const std::set<DummyPort*>& connections = get_connections ();
+ for (std::set<DummyPort*>::const_iterator i = connections.begin ();
+ i != connections.end ();
++i) {
DummyMidiPort * source = static_cast<DummyMidiPort*>(*i);
if (source->is_physical() && source->is_terminal()) {
diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h
index b235d10..db4f191 100644
--- a/libs/backends/dummy/dummy_audiobackend.h
+++ b/libs/backends/dummy/dummy_audiobackend.h
@@ -30,6 +30,7 @@
#include <boost/shared_ptr.hpp>
+#include "pbd/natsort.h"
#include "ardour/types.h"
#include "ardour/audio_backend.h"
#include "ardour/dsp_load_calculator.h"
@@ -42,7 +43,7 @@ namespace DummyMidiData {
typedef struct _MIDISequence {
float beat_time;
uint8_t size;
- uint8_t event[3];
+ uint8_t event[10];
} MIDISequence;
};
@@ -72,9 +73,11 @@ class DummyPort {
virtual ~DummyPort ();
const std::string& name () const { return _name; }
+ const std::string& pretty_name () const { return _pretty_name; }
PortFlags flags () const { return _flags; }
int set_name (const std::string &name) { _name = name; return 0; }
+ int set_pretty_name (const std::string &name) { _pretty_name = name; return 0; }
virtual DataType type () const = 0;
@@ -86,7 +89,7 @@ class DummyPort {
bool is_connected (const DummyPort *port) const;
bool is_physically_connected () const;
- const std::vector<DummyPort *>& get_connections () const { return _connections; }
+ const std::set<DummyPort *>& get_connections () const { return _connections; }
int connect (DummyPort *port);
int disconnect (DummyPort *port);
@@ -115,10 +118,11 @@ class DummyPort {
private:
DummyAudioBackend &_dummy_backend;
std::string _name;
+ std::string _pretty_name;
const PortFlags _flags;
LatencyRange _capture_latency_range;
LatencyRange _playback_latency_range;
- std::vector<DummyPort*> _connections;
+ std::set<DummyPort*> _connections;
void _connect (DummyPort* , bool);
void _disconnect (DummyPort* , bool);
@@ -149,11 +153,14 @@ class DummyAudioPort : public DummyPort {
enum GeneratorType {
Silence,
+ DC05,
+ Demolition,
UniformWhiteNoise,
GaussianWhiteNoise,
PinkNoise,
PonyNoise,
SineWave,
+ SineWaveOctaves,
SquareWave,
KronekerDelta,
SineSweep,
@@ -162,7 +169,7 @@ class DummyAudioPort : public DummyPort {
SquareSweepSwell,
Loopback,
};
- void setup_generator (GeneratorType const, float const);
+ std::string setup_generator (GeneratorType const, float const, int, int);
void fill_wavetable (const float* d, size_t n_samples) { assert(_wavetable != 0); memcpy(_wavetable, d, n_samples * sizeof(float)); }
void midi_to_wavetable (DummyMidiBuffer const * const src, size_t n_samples);
@@ -200,7 +207,7 @@ class DummyMidiPort : public DummyPort {
void* get_buffer (pframes_t nframes);
const DummyMidiBuffer * const_buffer () const { return &_buffer; }
- void setup_generator (int, float const);
+ std::string setup_generator (int, float const);
void set_loopback (DummyMidiBuffer const * const src);
private:
@@ -321,6 +328,9 @@ class DummyAudioBackend : public AudioBackend {
std::string get_port_name (PortHandle) const;
PortHandle get_port_by_name (const std::string&) const;
+ int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+ int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
+
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
DataType port_data_type (PortHandle) const;
@@ -441,7 +451,19 @@ class DummyAudioBackend : public AudioBackend {
std::vector<DummyAudioPort *> _system_outputs;
std::vector<DummyMidiPort *> _system_midi_in;
std::vector<DummyMidiPort *> _system_midi_out;
- std::vector<DummyPort *> _ports;
+
+ struct SortByPortName
+ {
+ bool operator ()(const DummyPort* lhs, const DummyPort* rhs) const
+ {
+ return PBD::naturally_less (lhs->name ().c_str (), rhs->name ().c_str ());
+ }
+ };
+
+ typedef std::map<std::string, DummyPort *> PortMap; // fast lookup in _ports
+ typedef std::set<DummyPort *, SortByPortName> PortIndex; // fast lookup in _ports
+ PortMap _portmap;
+ PortIndex _ports;
struct PortConnectData {
std::string a;
@@ -469,16 +491,15 @@ class DummyAudioBackend : public AudioBackend {
}
bool valid_port (PortHandle port) const {
- return std::find (_ports.begin (), _ports.end (), (DummyPort*)port) != _ports.end ();
+ return std::find (_ports.begin(), _ports.end(), static_cast<DummyPort*>(port)) != _ports.end ();
}
- DummyPort * find_port (const std::string& port_name) const {
- for (std::vector<DummyPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
- if ((*it)->name () == port_name) {
- return *it;
- }
+ DummyPort* find_port (const std::string& port_name) const {
+ PortMap::const_iterator it = _portmap.find (port_name);
+ if (it == _portmap.end()) {
+ return NULL;
}
- return NULL;
+ return (*it).second;
}
}; // class DummyAudioBackend
diff --git a/libs/backends/dummy/dummy_midi_seq.h b/libs/backends/dummy/dummy_midi_seq.h
index 810cb53..e809a47 100644
--- a/libs/backends/dummy/dummy_midi_seq.h
+++ b/libs/backends/dummy/dummy_midi_seq.h
@@ -754,7 +754,20 @@ static const MIDISequence s5[] = { // channel1, CCs only
{ 5.00, 3, {0xff, 255, 0xff} }, // sentinel
};
-static const MIDISequence s6[] = { // channel1, nonsense
+
+static const MIDISequence s6[] = { // Keypressure, Aftertouch
+ { 0.00, 3, {0x90, 64, 0x7f} },
+ { 0.25, 3, {0xa0, 64, 0x40} },
+ { 0.50, 3, {0xa0, 64, 0x60} },
+ { 0.75, 3, {0xa0, 64, 0x7f} },
+ { 1.00, 3, {0xa0, 64, 0x7f} },
+ { 1.25, 3, {0xa0, 64, 0x00} },
+ { 1.50, 3, {0x80, 64, 0x00} },
+ { 2.00, 3, {0xff, 255, 0xff} }, // sentinel
+};
+
+
+static const MIDISequence s7[] = { // channel1, nonsense
{ 0.00, 3, {0x90, 64, 0x7f} }, // note-on
{ 0.50, 3, {0x90, 64, 0x7f} }, // duplicate note-on
{ 1.00, 3, {0x80, 64, 0x00} }, // note-off
@@ -766,8 +779,253 @@ static const MIDISequence s6[] = { // channel1, nonsense
{ 4.00, 3, {0xff, 255, 0xff} }, // sentinel
};
+static const MIDISequence s8[] = { // sysex
+ { 0.00, 10, {0xf0, 0x7f, 0x7f, 0x01, 0x01, /*hour + tc */ 0x20, /*min*/ 0x00, /*sec*/ 0x00, /*frame*/ 0x00, 0xf7} }, // 25fps, 00:00:00:00
+ // quarter frames spacing (in samples) at 25fps: SR / (25 * 4)
+ // DummyMidiPort::setup_generator uses 120bpm ie (SR / 2)
+ // hence the spacing is: SR / (25 * 4) / (SR / 2) = 0.2
+ { 1.00, 2, {0xf1, 0x00} },
+ { 1.02, 2, {0xf1, 0x10} },
+ { 1.04, 2, {0xf1, 0x20} },
+ { 1.06, 2, {0xf1, 0x30} },
+ { 1.08, 2, {0xf1, 0x40} },
+ { 1.10, 2, {0xf1, 0x50} },
+ { 1.12, 2, {0xf1, 0x60} },
+ { 1.14, 2, {0xf1, 0x72} },
+
+ { 1.16, 2, {0xf1, 0x02} },
+ { 1.18, 2, {0xf1, 0x10} },
+ { 1.20, 2, {0xf1, 0x20} },
+ { 1.22, 2, {0xf1, 0x30} },
+ { 1.24, 2, {0xf1, 0x40} },
+ { 1.26, 2, {0xf1, 0x50} },
+ { 1.28, 2, {0xf1, 0x60} },
+ { 1.30, 2, {0xf1, 0x72} },
+
+ { 1.32, 2, {0xf1, 0x04} },
+ { 1.34, 2, {0xf1, 0x10} },
+ { 1.36, 2, {0xf1, 0x20} },
+ { 1.38, 2, {0xf1, 0x30} },
+ { 1.40, 2, {0xf1, 0x40} },
+ { 1.42, 2, {0xf1, 0x50} },
+ { 1.43, 2, {0xf1, 0x60} },
+ { 1.46, 2, {0xf1, 0x72} },
+
+ { 1.48, 2, {0xf1, 0x06} },
+ { 1.50, 2, {0xf1, 0x10} },
+ { 1.52, 2, {0xf1, 0x20} },
+ { 1.54, 2, {0xf1, 0x30} },
+ { 1.56, 2, {0xf1, 0x40} },
+ { 1.58, 2, {0xf1, 0x50} },
+ { 1.60, 2, {0xf1, 0x60} },
+ { 1.62, 2, {0xf1, 0x72} },
+
+ { 1.64, 2, {0xf1, 0x08} },
+ { 1.66, 2, {0xf1, 0x10} },
+ { 1.68, 2, {0xf1, 0x20} },
+ { 1.70, 2, {0xf1, 0x30} },
+ { 1.72, 2, {0xf1, 0x40} },
+ { 1.74, 2, {0xf1, 0x50} },
+ { 1.76, 2, {0xf1, 0x60} },
+ { 1.78, 2, {0xf1, 0x72} },
+
+ { 1.80, 2, {0xf1, 0x0a} },
+ { 1.82, 2, {0xf1, 0x10} },
+ { 1.84, 2, {0xf1, 0x20} },
+ { 1.86, 2, {0xf1, 0x30} },
+ { 1.88, 2, {0xf1, 0x40} },
+ { 1.90, 2, {0xf1, 0x50} },
+ { 1.92, 2, {0xf1, 0x60} },
+ { 1.94, 2, {0xf1, 0x72} },
+
+ { 1.96, 2, {0xf1, 0x0c} },
+ { 1.98, 2, {0xf1, 0x10} },
+ { 2.00, 2, {0xf1, 0x20} },
+ { 2.02, 2, {0xf1, 0x30} },
+ { 2.04, 2, {0xf1, 0x40} },
+ { 2.06, 2, {0xf1, 0x50} },
+ { 2.08, 2, {0xf1, 0x60} },
+ { 2.10, 2, {0xf1, 0x72} },
+
+ { 2.12, 2, {0xf1, 0x0e} },
+ { 2.14, 2, {0xf1, 0x10} },
+ { 2.16, 2, {0xf1, 0x20} },
+ { 2.18, 2, {0xf1, 0x30} },
+ { 2.20, 2, {0xf1, 0x40} },
+ { 2.22, 2, {0xf1, 0x50} },
+ { 2.24, 2, {0xf1, 0x60} },
+ { 2.26, 2, {0xf1, 0x72} },
+
+ { 2.28, 2, {0xf1, 0x00} },
+ { 2.30, 2, {0xf1, 0x11} },
+ { 2.32, 2, {0xf1, 0x20} },
+ { 2.34, 2, {0xf1, 0x30} },
+ { 2.36, 2, {0xf1, 0x40} },
+ { 2.38, 2, {0xf1, 0x50} },
+ { 2.40, 2, {0xf1, 0x60} },
+ { 2.42, 2, {0xf1, 0x72} },
+
+ { 2.44, 2, {0xf1, 0x02} },
+ { 2.46, 2, {0xf1, 0x11} },
+ { 2.48, 2, {0xf1, 0x20} },
+ { 2.50, 2, {0xf1, 0x30} },
+ { 2.52, 2, {0xf1, 0x40} },
+ { 2.54, 2, {0xf1, 0x50} },
+ { 2.56, 2, {0xf1, 0x60} },
+ { 2.58, 2, {0xf1, 0x72} },
+
+ { 2.60, 2, {0xf1, 0x04} },
+ { 2.62, 2, {0xf1, 0x11} },
+ { 2.64, 2, {0xf1, 0x20} },
+ { 2.66, 2, {0xf1, 0x30} },
+ { 2.68, 2, {0xf1, 0x40} },
+ { 2.70, 2, {0xf1, 0x50} },
+ { 2.72, 2, {0xf1, 0x60} },
+ { 2.74, 2, {0xf1, 0x72} },
+
+ { 2.76, 2, {0xf1, 0x06} },
+ { 2.78, 2, {0xf1, 0x11} },
+ { 2.80, 2, {0xf1, 0x20} },
+ { 2.82, 2, {0xf1, 0x30} },
+ { 2.84, 2, {0xf1, 0x40} },
+ { 2.86, 2, {0xf1, 0x50} },
+ { 2.88, 2, {0xf1, 0x60} },
+ { 2.90, 2, {0xf1, 0x72} },
+
+ { 2.92, 2, {0xf1, 0x08} },
+ { 2.94, 2, {0xf1, 0x11} },
+ { 2.96, 2, {0xf1, 0x20} },
+ { 2.98, 2, {0xf1, 0x30} },
+ { 3.00, 2, {0xf1, 0x40} },
+ { 3.02, 2, {0xf1, 0x50} },
+ { 3.04, 2, {0xf1, 0x60} },
+ { 3.06, 2, {0xf1, 0x72} },
+
+ { 3.08, 2, {0xf1, 0x01} },
+ { 3.10, 2, {0xf1, 0x10} },
+ { 3.12, 2, {0xf1, 0x21} },
+ { 3.14, 2, {0xf1, 0x30} },
+ { 3.16, 2, {0xf1, 0x40} },
+ { 3.18, 2, {0xf1, 0x50} },
+ { 3.20, 2, {0xf1, 0x60} },
+ { 3.22, 2, {0xf1, 0x72} },
+
+ { 3.24, 2, {0xf1, 0x03} },
+ { 3.26, 2, {0xf1, 0x10} },
+ { 3.28, 2, {0xf1, 0x21} },
+ { 3.30, 2, {0xf1, 0x30} },
+ { 3.32, 2, {0xf1, 0x40} },
+ { 3.34, 2, {0xf1, 0x50} },
+ { 3.36, 2, {0xf1, 0x60} },
+ { 3.38, 2, {0xf1, 0x72} },
+
+ { 3.40, 2, {0xf1, 0x05} },
+ { 3.42, 2, {0xf1, 0x10} },
+ { 3.44, 2, {0xf1, 0x21} },
+ { 3.46, 2, {0xf1, 0x30} },
+ { 3.48, 2, {0xf1, 0x40} },
+ { 3.50, 2, {0xf1, 0x50} },
+ { 3.52, 2, {0xf1, 0x60} },
+ { 3.54, 2, {0xf1, 0x72} },
+
+ { 3.56, 2, {0xf1, 0x07} },
+ { 3.58, 2, {0xf1, 0x10} },
+ { 3.60, 2, {0xf1, 0x21} },
+ { 3.62, 2, {0xf1, 0x30} },
+ { 3.64, 2, {0xf1, 0x40} },
+ { 3.66, 2, {0xf1, 0x50} },
+ { 3.68, 2, {0xf1, 0x60} },
+ { 3.70, 2, {0xf1, 0x72} },
+
+ { 3.72, 2, {0xf1, 0x09} },
+ { 3.74, 2, {0xf1, 0x10} },
+ { 3.76, 2, {0xf1, 0x21} },
+ { 3.78, 2, {0xf1, 0x30} },
+ { 3.80, 2, {0xf1, 0x40} },
+ { 3.82, 2, {0xf1, 0x50} },
+ { 3.84, 2, {0xf1, 0x60} },
+ { 3.86, 2, {0xf1, 0x72} },
+
+ { 3.88, 2, {0xf1, 0x0b} },
+ { 3.90, 2, {0xf1, 0x10} },
+ { 3.92, 2, {0xf1, 0x21} },
+ { 3.94, 2, {0xf1, 0x30} },
+ { 3.96, 2, {0xf1, 0x40} },
+ { 3.98, 2, {0xf1, 0x50} },
+ { 4.00, 2, {0xf1, 0x60} },
+ { 4.02, 2, {0xf1, 0x72} },
+
+ { 4.04, 2, {0xf1, 0x0d} },
+ { 4.06, 2, {0xf1, 0x10} },
+ { 4.08, 2, {0xf1, 0x21} },
+ { 4.10, 2, {0xf1, 0x30} },
+ { 4.12, 2, {0xf1, 0x40} },
+ { 4.14, 2, {0xf1, 0x50} },
+ { 4.16, 2, {0xf1, 0x60} },
+ { 4.18, 2, {0xf1, 0x72} },
+
+ { 4.20, 2, {0xf1, 0x0f} },
+ { 4.22, 2, {0xf1, 0x10} },
+ { 4.24, 2, {0xf1, 0x21} },
+ { 4.26, 2, {0xf1, 0x30} },
+ { 4.28, 2, {0xf1, 0x40} },
+ { 4.30, 2, {0xf1, 0x50} },
+ { 4.32, 2, {0xf1, 0x60} },
+ { 4.34, 2, {0xf1, 0x72} },
+
+ { 4.36, 2, {0xf1, 0x01} },
+ { 4.38, 2, {0xf1, 0x11} },
+ { 4.40, 2, {0xf1, 0x21} },
+ { 4.42, 2, {0xf1, 0x30} },
+ { 4.44, 2, {0xf1, 0x40} },
+ { 4.46, 2, {0xf1, 0x50} },
+ { 4.48, 2, {0xf1, 0x60} },
+ { 4.50, 2, {0xf1, 0x72} },
+
+ { 4.52, 2, {0xf1, 0x03} },
+ { 4.54, 2, {0xf1, 0x11} },
+ { 4.56, 2, {0xf1, 0x21} },
+ { 4.58, 2, {0xf1, 0x30} },
+ { 4.60, 2, {0xf1, 0x40} },
+ { 4.62, 2, {0xf1, 0x50} },
+ { 4.64, 2, {0xf1, 0x60} },
+ { 4.66, 2, {0xf1, 0x72} },
+
+ { 4.68, 2, {0xf1, 0x05} },
+ { 4.70, 2, {0xf1, 0x11} },
+ { 4.72, 2, {0xf1, 0x21} },
+ { 4.74, 2, {0xf1, 0x30} },
+ { 4.76, 2, {0xf1, 0x40} },
+ { 4.78, 2, {0xf1, 0x50} },
+ { 4.80, 2, {0xf1, 0x60} },
+ { 4.82, 2, {0xf1, 0x72} },
+
+ { 4.84, 2, {0xf1, 0x07} },
+ { 4.86, 2, {0xf1, 0x11} },
+ { 4.88, 2, {0xf1, 0x21} },
+ { 4.90, 2, {0xf1, 0x30} },
+ { 4.92, 2, {0xf1, 0x40} },
+ { 4.94, 2, {0xf1, 0x50} },
+ { 4.96, 2, {0xf1, 0x60} },
+ { 4.98, 2, {0xf1, 0x72} },
+
+ { 5.00, 3, {0xff, 255, 0xff} }, // sentinel
+};
+
static const MIDISequence *sequences[] = {
- s0, s1, s2, s3, s4, s5, s6
+ s0, s1, s2, s3, s4, s5, s6, s7, s8
+};
+
+static const char *sequence_names[] = {
+ "Short Sequence",
+ "Cmaj7, all channels",
+ "Note Sweep, chan 1",
+ "Velocity Sweep, chan 1",
+ "Sustain Pedal Test",
+ "CCs only",
+ "Aftertouch",
+ "Nonsense, Dups",
+ "MTC (2sec)"
};
}} // namespace
diff --git a/libs/backends/dummy/wscript b/libs/backends/dummy/wscript
index e1a5985..e674d35 100644
--- a/libs/backends/dummy/wscript
+++ b/libs/backends/dummy/wscript
@@ -25,6 +25,7 @@ def build(bld):
obj.name = 'dummy_audiobackend'
obj.target = 'dummy_audiobackend'
obj.use = 'libardour libpbd'
+ obj.uselib = 'GLIBMM XML'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'backends')
obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
'ARDOURBACKEND_DLL_EXPORTS'
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc
index 32c9f20..8b9e4af 100644
--- a/libs/backends/jack/jack_audiobackend.cc
+++ b/libs/backends/jack/jack_audiobackend.cc
@@ -36,7 +36,7 @@
#include "jack_utils.h"
#include "jack_session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h
index 54eea35..847b21b 100644
--- a/libs/backends/jack/jack_audiobackend.h
+++ b/libs/backends/jack/jack_audiobackend.h
@@ -133,6 +133,7 @@ class JACKAudioBackend : public AudioBackend {
std::string get_port_name (PortHandle) const;
PortHandle get_port_by_name (const std::string&) const;
int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+ int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
diff --git a/libs/backends/jack/jack_portengine.cc b/libs/backends/jack/jack_portengine.cc
index 10b2efe..934f8b5 100644
--- a/libs/backends/jack/jack_portengine.cc
+++ b/libs/backends/jack/jack_portengine.cc
@@ -27,7 +27,7 @@
#include "ardour/port_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
@@ -147,6 +147,20 @@ JACKAudioBackend::get_port_property (PortHandle port, const std::string& key, st
#endif
}
+int
+JACKAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+#ifdef HAVE_JACK_METADATA // really everyone ought to have this by now.
+ int rv = -1;
+ jack_client_t* client = _jack_connection->jack();
+ jack_uuid_t uuid = jack_port_uuid((jack_port_t*) port);
+ return jack_set_property(client, uuid, key.c_str(), value.c_str(), type.c_str());
+ return rv;
+#else
+ return -1;
+#endif
+}
+
PortEngine::PortHandle
JACKAudioBackend:: get_port_by_name (const std::string& name) const
{
diff --git a/libs/backends/jack/jack_session.cc b/libs/backends/jack/jack_session.cc
index 1e9d956..0c78d9a 100644
--- a/libs/backends/jack/jack_session.cc
+++ b/libs/backends/jack/jack_session.cc
@@ -121,7 +121,7 @@ JACKSession::timebase_callback (jack_transport_state_t /*state*/,
TempoMetric metric (tempo_map.metric_at (tf));
try {
- tempo_map.bbt_time_rt (tf, bbt);
+ bbt = tempo_map.bbt_at_frame (tf);
pos->bar = bbt.bars;
pos->beat = bbt.beats;
diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc
index 6fb3201..b26cb40 100644
--- a/libs/backends/jack/jack_utils.cc
+++ b/libs/backends/jack/jack_utils.cc
@@ -55,7 +55,7 @@
#include <CFBundle.h>
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript
index 17b4d16..8de15ef 100644
--- a/libs/backends/jack/wscript
+++ b/libs/backends/jack/wscript
@@ -49,7 +49,7 @@ def configure(conf):
uselib = 'JACK')
# Check to see if jack_port_rename() is available and working
- if Options.options.libjack_link == 'link':
+ if conf.env['libjack_link'] == 'link':
conf.check_cxx(fragment = "#include <jack/jack.h>\nint main(void) { jack_client_t* c; jack_port_t* p; jack_port_rename (c, p, \"foo\"); return 0; }\n",
mandatory = False,
execute = False,
@@ -108,6 +108,8 @@ def build(bld):
obj.defines += [ 'USE_WEAK_JACK', 'HAVE_JACK_PORT_RENAME' ]
obj.deps = [ 'weak_libjack.def' ]
+ obj.uselib += [ 'GLIBMM', 'XML' ];
+
#
# device discovery code in the jack backend needs ALSA
# on Linux.
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc
index 616ee1d..b25a54f 100644
--- a/libs/backends/portaudio/portaudio_backend.cc
+++ b/libs/backends/portaudio/portaudio_backend.cc
@@ -41,7 +41,7 @@
#include "ardour/filesystem_paths.h"
#include "ardour/port_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "audio_utils.h"
@@ -912,6 +912,7 @@ PortAudioBackend::freewheel_process_thread()
_reinit_thread_callback = true; // hand over _main_thread
_freewheel_ack = false; // prepare next handshake
_midiio->set_enabled(true);
+ engine.freewheel_callback (_freewheeling);
} else {
first_run = true;
_freewheel = true;
@@ -1237,6 +1238,24 @@ PortAudioBackend::get_port_property (PortHandle port,
return -1;
}
+int
+PortAudioBackend::set_port_property (PortHandle port,
+ const std::string& key,
+ const std::string& value,
+ const std::string& type)
+{
+ if (!valid_port (port)) {
+ DEBUG_PORTS("get_port_name: Invalid Port(s)\n");
+ return -1;
+ }
+
+ if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+ static_cast<PamPort*>(port)->set_pretty_name (value);
+ return 0;
+ }
+ return -1;
+}
+
PortEngine::PortHandle
PortAudioBackend::get_port_by_name (const std::string& name) const
{
diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h
index 3e329a4..601c343 100644
--- a/libs/backends/portaudio/portaudio_backend.h
+++ b/libs/backends/portaudio/portaudio_backend.h
@@ -267,6 +267,7 @@ class PortAudioBackend : public AudioBackend {
std::string get_port_name (PortHandle) const;
PortHandle get_port_by_name (const std::string&) const;
int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+ int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
diff --git a/libs/backends/portaudio/winmmemidi_io.cc b/libs/backends/portaudio/winmmemidi_io.cc
index c7e465e..0c321ec 100644
--- a/libs/backends/portaudio/winmmemidi_io.cc
+++ b/libs/backends/portaudio/winmmemidi_io.cc
@@ -18,6 +18,7 @@
#include <windows.h>
#include <mmsystem.h>
+#include <glibmm.h>
#include <sstream>
#include <set>
@@ -29,7 +30,7 @@
#include "winmmemidi_io.h"
#include "debug.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -223,7 +224,7 @@ WinMMEMidiIO::get_input_name_from_index (int index, std::string& name)
capabilities.wMid,
capabilities.wPid));
- name = capabilities.szPname;
+ name = Glib::locale_to_utf8 (capabilities.szPname);
return true;
} else {
DEBUG_MIDI ("Unable to get WinMME input device capabilities\n");
@@ -241,7 +242,8 @@ WinMMEMidiIO::get_output_name_from_index (int index, std::string& name)
capabilities.szPname,
capabilities.wMid,
capabilities.wPid));
- name = capabilities.szPname;
+
+ name = Glib::locale_to_utf8 (capabilities.szPname);
return true;
} else {
DEBUG_MIDI ("Unable to get WinMME output device capabilities\n");
diff --git a/libs/backends/portaudio/wscript b/libs/backends/portaudio/wscript
index 1c6af9f..150b176 100644
--- a/libs/backends/portaudio/wscript
+++ b/libs/backends/portaudio/wscript
@@ -32,7 +32,7 @@ def build_portaudio (bld, name, defines):
obj.name = name
obj.target = name
obj.use = 'libardour libpbd'
- obj.uselib = ['PORTAUDIO']
+ obj.uselib = 'PORTAUDIO GLIBMM XML'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'backends')
obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
'ARDOURBACKEND_DLL_EXPORTS',
diff --git a/libs/canvas/MSVCcanvas/cairocanvas.vcproj b/libs/canvas/MSVCcanvas/cairocanvas.vcproj
index 56f3fb1..7384a89 100644
--- a/libs/canvas/MSVCcanvas/cairocanvas.vcproj
+++ b/libs/canvas/MSVCcanvas/cairocanvas.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;..\..\lua;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -109,8 +109,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;..\..\lua;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -174,8 +174,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;..\..\lua;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -267,6 +267,10 @@
>
</File>
<File
+ RelativePath="..\framed_curve.cc"
+ >
+ </File>
+ <File
RelativePath="..\image.cc"
>
</File>
@@ -405,11 +409,11 @@
>
</File>
<File
- RelativePath="..\canvas\fwd.h"
+ RelativePath="..\canvas\framed_curve.h"
>
</File>
<File
- RelativePath="..\i18n.h"
+ RelativePath="..\canvas\fwd.h"
>
</File>
<File
diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc
index 6bf1959..22c5860 100644
--- a/libs/canvas/canvas.cc
+++ b/libs/canvas/canvas.cc
@@ -32,6 +32,8 @@
#include <gtkmm/label.h>
#include <gtkmm/window.h>
+#include "gtkmm2ext/persistent_tooltip.h"
+
#include "pbd/compose.h"
#include "pbd/stacktrace.h"
@@ -1145,7 +1147,7 @@ GtkCanvas::start_tooltip_timeout (Item* item)
{
stop_tooltip_timeout ();
- if (item) {
+ if (item && Gtkmm2ext::PersistentTooltip::tooltips_enabled ()) {
current_tooltip_item = item;
/* wait for the first idle that happens after this is
@@ -1161,7 +1163,7 @@ GtkCanvas::start_tooltip_timeout (Item* item)
bool
GtkCanvas::really_start_tooltip_timeout ()
{
- /* an idle has occured since we entered a tooltip-bearing widget. Now
+ /* an idle has occurred since we entered a tooltip-bearing widget. Now
* wait 1 second and if the timeout isn't cancelled, show the tooltip.
*/
diff --git a/libs/canvas/canvas/colors.h b/libs/canvas/canvas/colors.h
index 2a3cbb2..b2f6c1e 100644
--- a/libs/canvas/canvas/colors.h
+++ b/libs/canvas/canvas/colors.h
@@ -35,6 +35,7 @@ extern LIBCANVAS_API Color change_alpha (Color, double alpha);
extern LIBCANVAS_API Color hsva_to_color (double h, double s, double v, double a = 1.0);
extern LIBCANVAS_API void color_to_hsva (Color color, double& h, double& s, double& v, double& a);
+extern LIBCANVAS_API Color color_at_alpha (Color, double a);
extern LIBCANVAS_API void color_to_hsv (Color color, double& h, double& s, double& v);
extern LIBCANVAS_API void color_to_rgba (Color, double& r, double& g, double& b, double& a);
extern LIBCANVAS_API Color rgba_to_color (double r, double g, double b, double a);
diff --git a/libs/canvas/canvas/framed_curve.h b/libs/canvas/canvas/framed_curve.h
new file mode 100644
index 0000000..9e99c59
--- /dev/null
+++ b/libs/canvas/canvas/framed_curve.h
@@ -0,0 +1,66 @@
+/*
+ Copyright (C) 2013 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __CANVAS_FRAMED_CURVE_H__
+#define __CANVAS_FRAMED_CURVE_H__
+
+#include "canvas/visibility.h"
+
+#include "canvas/interpolated_curve.h"
+#include "canvas/poly_item.h"
+#include "canvas/fill.h"
+
+/* similar to a Curve, with the first point being a height definition rather than a point to
+ interpolate.
+*/
+
+namespace ArdourCanvas {
+
+class LIBCANVAS_API FramedCurve : public PolyItem, public InterpolatedCurve
+{
+ public:
+ FramedCurve (Canvas*);
+ FramedCurve (Item*);
+
+ enum CurveFill {
+ None,
+ Inside,
+ Outside,
+ };
+
+ void compute_bounding_box () const;
+ void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
+ void set (Points const &);
+
+ void set_points_per_segment (uint32_t n);
+
+ bool covers (Duple const &) const;
+ void set_fill_mode (CurveFill cf) { curve_fill = cf; }
+
+ private:
+ Points samples;
+ Points::size_type n_samples;
+ uint32_t points_per_segment;
+ CurveFill curve_fill;
+
+ void interpolate ();
+};
+
+}
+
+#endif
diff --git a/libs/canvas/canvas/poly_item.h b/libs/canvas/canvas/poly_item.h
index bdb7c20..311ca80 100644
--- a/libs/canvas/canvas/poly_item.h
+++ b/libs/canvas/canvas/poly_item.h
@@ -32,7 +32,7 @@ public:
PolyItem (Canvas*);
PolyItem (Item*);
- void compute_bounding_box () const;
+ virtual void compute_bounding_box () const;
virtual void set (Points const &);
Points const & get () const;
diff --git a/libs/canvas/canvas/poly_line.h b/libs/canvas/canvas/poly_line.h
index fce013d..7c68947 100644
--- a/libs/canvas/canvas/poly_line.h
+++ b/libs/canvas/canvas/poly_line.h
@@ -28,15 +28,16 @@ namespace ArdourCanvas {
class LIBCANVAS_API PolyLine : public PolyItem
{
- public:
+public:
PolyLine (Canvas*);
PolyLine (Item*);
void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
virtual void set_steps (Points const &, bool stepped);
+ virtual void compute_bounding_box () const;
- bool covers (Duple const &) const;
+ bool covers (Duple const &) const;
/**
* Set the distance at which a point will be considered to be covered
* by the line. For the definition of "distance" see
@@ -44,8 +45,11 @@ class LIBCANVAS_API PolyLine : public PolyItem
*/
void set_covers_threshold (double);
- private:
+ void set_fill_y1 (double);
+
+private:
double _threshold;
+ double _y1;
};
}
diff --git a/libs/canvas/canvas/ruler.h b/libs/canvas/canvas/ruler.h
index 0a2e435..751ddcc 100644
--- a/libs/canvas/canvas/ruler.h
+++ b/libs/canvas/canvas/ruler.h
@@ -60,14 +60,18 @@ public:
Ruler (Item*, const Metric& m);
Ruler (Item*, const Metric& m, Rect const&);
+ virtual ~Ruler () {
+ delete _font_description;
+ }
+
void set_range (double lower, double upper);
void set_font_description (Pango::FontDescription);
void set_metric (const Metric&);
void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
- void set_divide_colors (Color top, Color bottom);
- void set_divide_height (double);
+ void set_divide_colors (Color top, Color bottom);
+ void set_divide_height (double);
private:
const Metric* _metric;
@@ -76,9 +80,9 @@ private:
Coord _lower;
Coord _upper;
- double _divide_height;
- Color _divider_color_top;
- Color _divider_color_bottom;
+ double _divide_height;
+ Color _divider_color_top;
+ Color _divider_color_bottom;
Pango::FontDescription* _font_description;
mutable std::vector<Mark> marks;
diff --git a/libs/canvas/colors.cc b/libs/canvas/colors.cc
index 19c5226..7a108e7 100644
--- a/libs/canvas/colors.cc
+++ b/libs/canvas/colors.cc
@@ -259,6 +259,7 @@ HSV::HSV (const std::string& str)
string
HSV::to_string () const
{
+ PBD::LocaleGuard lg;
stringstream ss;
ss << h << ' ';
ss << s << ' ';
@@ -596,7 +597,7 @@ SVAModifier::from_string (string const & str)
string
SVAModifier::to_string () const
{
- PBD::LocaleGuard lg ("C");
+ PBD::LocaleGuard lg;
stringstream ss;
switch (type) {
@@ -658,3 +659,10 @@ SVAModifier::operator () (HSV& hsv) const
return r;
}
+ArdourCanvas::Color
+ArdourCanvas::color_at_alpha (ArdourCanvas::Color c, double a)
+{
+ double r, g, b, unused;
+ color_to_rgba (c, r, g, b, unused);
+ return rgba_to_color( r,g,b, a );
+}
diff --git a/libs/canvas/framed_curve.cc b/libs/canvas/framed_curve.cc
new file mode 100644
index 0000000..748fb03
--- /dev/null
+++ b/libs/canvas/framed_curve.cc
@@ -0,0 +1,287 @@
+/*
+ Copyright (C) 2013 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <cmath>
+#include <exception>
+#include <algorithm>
+
+#include "canvas/framed_curve.h"
+
+using namespace ArdourCanvas;
+using std::min;
+using std::max;
+
+FramedCurve::FramedCurve (Canvas* c)
+ : PolyItem (c)
+ , n_samples (0)
+ , points_per_segment (16)
+ , curve_fill (None)
+{
+}
+
+FramedCurve::FramedCurve (Item* parent)
+ : PolyItem (parent)
+ , n_samples (0)
+ , points_per_segment (16)
+ , curve_fill (None)
+{
+}
+
+/** When rendering the curve, we will always draw a fixed number of straight
+ * line segments to span the x-axis extent of the curve. More segments:
+ * smoother visual rendering. Less rendering: closer to a visibily poly-line
+ * render.
+ */
+void
+FramedCurve::set_points_per_segment (uint32_t n)
+{
+ /* this only changes our appearance rather than the bounding box, so we
+ just need to schedule a redraw rather than notify the parent of any
+ changes
+ */
+ points_per_segment = max (n, (uint32_t) 3);
+ interpolate ();
+ redraw ();
+}
+
+void
+FramedCurve::compute_bounding_box () const
+{
+ PolyItem::compute_bounding_box ();
+
+ /* possibly add extents of any point indicators here if we ever do that */
+}
+
+void
+FramedCurve::set (Points const& p)
+{
+ PolyItem::set (p);
+ interpolate ();
+}
+
+void
+FramedCurve::interpolate ()
+{
+ Points curve_points = _points;
+
+ if (curve_points.size()) {
+ curve_points.erase (curve_points.begin());
+ }
+ samples.clear ();
+
+ InterpolatedCurve::interpolate (curve_points, points_per_segment, CatmullRomCentripetal, false, samples);
+ n_samples = samples.size();
+}
+
+void
+FramedCurve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
+{
+ if (!_outline || _points.size() < 3 || !_bounding_box) {
+ return;
+ }
+
+ Rect self = item_to_window (_bounding_box.get());
+ boost::optional<Rect> d = self.intersection (area);
+ assert (d);
+ Rect draw = d.get ();
+
+ /* Our approach is to always draw n_segments across our total size.
+ *
+ * This is very inefficient if we are asked to only draw a small
+ * section of the curve. For now we rely on cairo clipping to help
+ * with this.
+ */
+
+ /* x-axis limits of the curve, in window space coordinates */
+
+ Duple w1 = item_to_window (Duple (_points.front().x, 0.0));
+ Duple w2 = item_to_window (Duple (_points.back().x, 0.0));
+
+ /* clamp actual draw to area bound by points, rather than our bounding box which is slightly different */
+
+ context->save ();
+ context->rectangle (draw.x0, draw.y0, draw.width(), draw.height());
+ context->clip ();
+
+ /* expand drawing area by several pixels on each side to avoid cairo stroking effects at the boundary.
+ they will still occur, but cairo's clipping will hide them.
+ */
+
+ draw = draw.expand (4.0);
+
+ /* now clip it to the actual points in the curve */
+
+ if (draw.x0 < w1.x) {
+ draw.x0 = w1.x;
+ }
+
+ if (draw.x1 >= w2.x) {
+ draw.x1 = w2.x;
+ }
+
+ setup_outline_context (context);
+
+ if (_points.size() == 3) {
+
+ /* straight line */
+
+ Duple window_space;
+ Points::const_iterator it = _points.begin();
+ window_space = item_to_window (*it);
+ context->move_to (window_space.x, window_space.y);
+ ++it;
+ window_space = item_to_window (*it, false);
+ context->line_to (window_space.x, window_space.y);
+ window_space = item_to_window (_points.back(), false);
+ context->line_to (window_space.x, window_space.y);
+
+ switch (curve_fill) {
+ case None:
+ context->stroke();
+ break;
+ case Inside:
+ context->stroke_preserve ();
+ window_space = item_to_window (Duple(_points.back().x, draw.height()));
+ context->line_to (window_space.x, window_space.y);
+ window_space = item_to_window (Duple(_points.front().x, draw.height()));
+ context->line_to (window_space.x, window_space.y);
+ context->close_path();
+ setup_fill_context(context);
+ context->fill ();
+ break;
+ case Outside:
+ context->stroke_preserve ();
+ window_space = item_to_window (Duple(_points.back().x, 0.0));
+ context->line_to (window_space.x, window_space.y);
+ window_space = item_to_window (Duple(_points.front().x, 0.0));
+ context->line_to (window_space.x, window_space.y);
+ context->close_path();
+ setup_fill_context(context);
+ context->fill ();
+ break;
+ }
+ } else {
+
+ /* curve of at least 3 points */
+
+ /* find left and right-most sample */
+ Duple window_space;
+ Points::size_type left = 0;
+ Points::size_type right = n_samples - 1;
+
+ for (Points::size_type idx = 0; idx < n_samples - 1; ++idx) {
+ window_space = item_to_window (Duple (samples[idx].x, 0.0));
+ if (window_space.x >= draw.x0) {
+ break;
+ }
+ left = idx;
+ }
+
+ for (Points::size_type idx = left; idx < n_samples - 1; ++idx) {
+ window_space = item_to_window (Duple (samples[idx].x, 0.0));
+ if (window_space.x > draw.x1) {
+ right = idx;
+ break;
+ }
+ }
+
+ const Duple first_sample = Duple (samples[left].x, samples[left].y);
+
+ /* move to the first sample's x and the draw height */
+ window_space = item_to_window (Duple (first_sample.x, draw.height()));
+ context->move_to (window_space.x, window_space.y);
+
+ /* draw line to first sample and then between samples */
+ for (uint32_t idx = left; idx <= right; ++idx) {
+ window_space = item_to_window (Duple (samples[idx].x, samples[idx].y), false);
+ context->line_to (window_space.x, window_space.y);
+ }
+
+ /* a redraw may have been requested between the last sample and the last point.
+ if so, draw a line to the last _point.
+ */
+ Duple last_sample = Duple (samples[right].x, samples[right].y);
+
+ if (draw.x1 > last_sample.x) {
+ last_sample = Duple (_points.back().x, _points.back().y);
+ window_space = item_to_window (last_sample, false);
+ context->line_to (window_space.x, window_space.y);
+ }
+
+ switch (curve_fill) {
+ case None:
+ context->stroke();
+ break;
+ case Inside:
+ context->stroke_preserve ();
+ /* close the frame, possibly using the last _point's x rather than samples[right].x */
+ window_space = item_to_window (Duple (last_sample.x, draw.height()));
+ context->line_to (window_space.x, window_space.y);
+ window_space = item_to_window (Duple (first_sample.x, draw.height()));
+ context->line_to (window_space.x, window_space.y);
+ context->close_path();
+ setup_fill_context(context);
+ context->fill ();
+ break;
+ case Outside:
+ context->stroke_preserve ();
+ window_space = item_to_window (Duple (last_sample.x, 0.0));
+ context->line_to (window_space.x, window_space.y);
+ window_space = item_to_window (Duple (first_sample.x, 0.0));
+ context->line_to (window_space.x, window_space.y);
+ context->close_path();
+ setup_fill_context(context);
+ context->fill ();
+ break;
+ }
+ }
+ context->restore ();
+
+#if 0
+ /* add points */
+ setup_outline_context (context);
+ for (Points::const_iterator p = _points.begin(); p != _points.end(); ++p) {
+ Duple window_space (item_to_window (*p));
+ context->arc (window_space.x, window_space.y, 5.0, 0.0, 2 * M_PI);
+ context->stroke ();
+ }
+#endif
+}
+
+bool
+FramedCurve::covers (Duple const & pc) const
+{
+ Duple point = window_to_item (pc);
+
+ /* O(N) N = number of points, and not accurate */
+
+ for (Points::const_iterator p = _points.begin(); p != _points.end(); ++p) {
+
+ const Coord dx = point.x - (*p).x;
+ const Coord dy = point.y - (*p).y;
+ const Coord dx2 = dx * dx;
+ const Coord dy2 = dy * dy;
+
+ if ((dx2 < 2.0 && dy2 < 2.0) || (dx2 + dy2 < 4.0)) {
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/libs/canvas/i18n.h b/libs/canvas/i18n.h
deleted file mode 100644
index 43ae07c..0000000
--- a/libs/canvas/i18n.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text) dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-/** Use this to translate strings that have different meanings in different places.
- * Text should be of the form Context|Message.
- */
-#define S_(Text) PBD::sgettext (PACKAGE, Text)
-
-#endif // __i18n_h__
diff --git a/libs/canvas/poly_line.cc b/libs/canvas/poly_line.cc
index 5d6abb9..c0e233b 100644
--- a/libs/canvas/poly_line.cc
+++ b/libs/canvas/poly_line.cc
@@ -28,18 +28,66 @@ using namespace ArdourCanvas;
PolyLine::PolyLine (Canvas* c)
: PolyItem (c)
, _threshold (1.0)
+ , _y1 (0)
{
}
PolyLine::PolyLine (Item* parent)
: PolyItem (parent)
, _threshold (1.0)
+ , _y1 (0)
{
}
void
+PolyLine::compute_bounding_box () const
+{
+ PolyItem::compute_bounding_box ();
+ if (_y1 > 0 && _bounding_box) {
+ _bounding_box.get().x0 = 0;
+ _bounding_box.get().x1 = COORD_MAX;
+ if (_y1 > _bounding_box.get().y1) {
+ _bounding_box.get().y1 = _y1;
+ }
+ }
+}
+
+void
+PolyLine::set_fill_y1 (double y1) {
+ begin_change ();
+ _bounding_box_dirty = true;
+ _y1 = y1;
+ end_change ();
+}
+
+void
PolyLine::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
{
+ if (_fill && _y1 > 0 && _points.size() > 0) {
+ const ArdourCanvas::Rect& vp (_canvas->visible_area());
+ setup_fill_context (context);
+
+ Duple y (0, _y1);
+ float y1 = item_to_window (y).y;
+ render_path (area, context);
+ Duple c0 (item_to_window (_points.back()));
+ Duple c1 (item_to_window (_points.front()));
+ if (c0.x < vp.x1) {
+ context->line_to (vp.x1, c0.y);
+ context->line_to (vp.x1, y1);
+ } else {
+ context->line_to (vp.x1, y1);
+ }
+ if (c1.x > vp.x0) {
+ context->line_to (vp.x0, y1);
+ context->line_to (vp.x0, c1.y);
+ } else {
+ context->line_to (vp.x0, y1);
+ }
+ context->close_path ();
+ context->fill ();
+ }
+
if (_outline) {
setup_outline_context (context);
render_path (area, context);
diff --git a/libs/canvas/ruler.cc b/libs/canvas/ruler.cc
index e3f23fb..1c11def 100644
--- a/libs/canvas/ruler.cc
+++ b/libs/canvas/ruler.cc
@@ -36,7 +36,8 @@ Ruler::Ruler (Canvas* c, const Metric& m)
, _metric (&m)
, _lower (0)
, _upper (0)
- , _divide_height (-1.0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
@@ -46,7 +47,8 @@ Ruler::Ruler (Canvas* c, const Metric& m, Rect const& r)
, _metric (&m)
, _lower (0)
, _upper (0)
- , _divide_height (-1.0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
@@ -56,7 +58,8 @@ Ruler::Ruler (Item* parent, const Metric& m)
, _metric (&m)
, _lower (0)
, _upper (0)
- , _divide_height (-1.0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
@@ -66,7 +69,8 @@ Ruler::Ruler (Item* parent, const Metric& m, Rect const& r)
, _metric (&m)
, _lower (0)
, _upper (0)
- , _divide_height (-1.0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
@@ -85,6 +89,7 @@ void
Ruler::set_font_description (Pango::FontDescription fd)
{
begin_visual_change ();
+ delete _font_description;
_font_description = new Pango::FontDescription (fd);
end_visual_change ();
}
@@ -165,10 +170,10 @@ Ruler::render (Rect const & area, Cairo::RefPtr<Cairo::Context> cr) const
}
break;
case Mark::Minor:
- cr->rel_line_to (0, -height/4.0);
+ cr->rel_line_to (0, -height/3.0);
break;
case Mark::Micro:
- cr->rel_line_to (0, -height/16.0);
+ cr->rel_line_to (0, -height/5.0);
break;
}
cr->stroke ();
diff --git a/libs/canvas/stateful_image.cc b/libs/canvas/stateful_image.cc
index fb0abf4..5f04d94 100644
--- a/libs/canvas/stateful_image.cc
+++ b/libs/canvas/stateful_image.cc
@@ -11,7 +11,7 @@
#include "canvas/stateful_image.h"
#include "canvas/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ArdourCanvas;
using PBD::error;
diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc
index d1f76eb..3b309e5 100644
--- a/libs/canvas/text.cc
+++ b/libs/canvas/text.cc
@@ -70,6 +70,10 @@ Text::~Text ()
void
Text::set (string const & text)
{
+ if (text == _text) {
+ return;
+ }
+
begin_change ();
_text = text;
@@ -237,6 +241,10 @@ Text::compute_bounding_box () const
void
Text::set_alignment (Pango::Alignment alignment)
{
+ if (alignment == _alignment) {
+ return;
+ }
+
begin_change ();
_alignment = alignment;
@@ -261,6 +269,10 @@ Text::set_font_description (Pango::FontDescription font_description)
void
Text::set_color (Color color)
{
+ if (color == _color) {
+ return;
+ }
+
begin_change ();
_color = color;
diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc
index ca3b43d..17ee860 100644
--- a/libs/canvas/wave_view.cc
+++ b/libs/canvas/wave_view.cc
@@ -73,7 +73,13 @@ WaveView::DrawingRequestQueue WaveView::request_queue;
PBD::Signal0<void> WaveView::VisualPropertiesChanged;
PBD::Signal0<void> WaveView::ClipLevelChanged;
-/*#define ENABLE_THREADED_WAVEFORM_RENDERING */
+/* NO_THREAD_WAVEVIEWS is defined by the top level wscript
+ * if --no-threaded-waveviws is provided at the configure step.
+ */
+
+#ifndef NO_THREADED_WAVEVIEWS
+#define ENABLE_THREADED_WAVEFORM_RENDERING
+#endif
WaveView::WaveView (Canvas* c, boost::shared_ptr<ARDOUR::AudioRegion> region)
: Item (c)
@@ -158,7 +164,7 @@ WaveView::debug_name() const
void
WaveView::image_ready ()
{
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("queue draw for %1 at %2 (vis = %3 CR %4)\n", this, g_get_monotonic_time(), visible(), current_request));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("queue draw for %1 at %2 (vis = %3 CR %4)\n", this, g_get_monotonic_time(), visible(), current_request));
redraw ();
}
@@ -264,7 +270,7 @@ WaveView::set_clip_level (double dB)
void
WaveView::invalidate_image_cache ()
{
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 invalidates image cache and cancels current request\n", this));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 invalidates image cache and cancels current request\n", this));
cancel_my_render_request ();
Glib::Threads::Mutex::Lock lci (current_image_lock);
_current_image.reset ();
@@ -745,7 +751,7 @@ boost::shared_ptr<WaveViewCache::Entry>
WaveView::cache_request_result (boost::shared_ptr<WaveViewThreadRequest> req) const
{
if (!req->image) {
- cerr << "asked to cache null image!!!\n";
+ // cerr << "asked to cache null image!!!\n";
return boost::shared_ptr<WaveViewCache::Entry> ();
}
@@ -792,9 +798,9 @@ WaveView::get_image (framepos_t start, framepos_t end, bool& full_image) const
* while we're here.
*/
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 CR %2 stop? %3 image %4\n", this, current_request,
- (current_request ? current_request->should_stop() : false),
- (current_request ? current_request->image : 0)));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 CR %2 stop? %3 image %4\n", this, current_request,
+ (current_request ? current_request->should_stop() : false),
+ (current_request ? current_request->image : 0)));
if (current_request && !current_request->should_stop() && current_request->image) {
@@ -857,7 +863,7 @@ WaveView::get_image (framepos_t start, framepos_t end, bool& full_image) const
req->height = _height;
req->fill_color = _fill_color;
req->amplitude = _region_amplitude * _amplitude_above_axis;
- req->width = desired_image_width ();
+ req->width = desired_image_width ();
/* draw image in this (the GUI thread) */
@@ -901,21 +907,21 @@ WaveView::get_image_from_cache (framepos_t start, framepos_t end, bool& full) co
framecnt_t
WaveView::desired_image_width () const
{
- /* compute how wide the image should be, in samples.
- *
- * We want at least 1 canvas width's worth, but if that
- * represents less than 1/10th of a second, use 1/10th of
- * a second instead.
- */
+ /* compute how wide the image should be, in samples.
+ *
+ * We want at least 1 canvas width's worth, but if that
+ * represents less than 1/10th of a second, use 1/10th of
+ * a second instead.
+ */
- framecnt_t canvas_width_samples = _canvas->visible_area().width() * _samples_per_pixel;
- const framecnt_t one_tenth_of_second = _region->session().frame_rate() / 10;
+ framecnt_t canvas_width_samples = _canvas->visible_area().width() * _samples_per_pixel;
+ const framecnt_t one_tenth_of_second = _region->session().frame_rate() / 10;
- if (canvas_width_samples > one_tenth_of_second) {
- return canvas_width_samples;
- }
+ if (canvas_width_samples > one_tenth_of_second) {
+ return canvas_width_samples;
+ }
- return one_tenth_of_second;
+ return one_tenth_of_second;
}
void
@@ -932,13 +938,16 @@ WaveView::queue_get_image (boost::shared_ptr<const ARDOUR::Region> region, frame
req->height = _height;
req->fill_color = _fill_color;
req->amplitude = _region_amplitude * _amplitude_above_axis;
- req->width = desired_image_width ();
+ req->width = desired_image_width ();
if (current_request) {
/* this will stop rendering in progress (which might otherwise
be long lived) for any current request.
*/
- current_request->cancel ();
+ Glib::Threads::Mutex::Lock lm (request_queue_lock);
+ if (current_request) {
+ current_request->cancel ();
+ }
}
start_drawing_thread ();
@@ -949,14 +958,14 @@ WaveView::queue_get_image (boost::shared_ptr<const ARDOUR::Region> region, frame
Glib::Threads::Mutex::Lock lm (request_queue_lock);
current_request = req;
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has current request %2\n", this, req));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has current request %2\n", this, req));
- if (request_queue.insert (this).second) {
- /* this waveview was not already in the request queue, make sure we wake
- the rendering thread in case it is asleep.
- */
- request_cond.signal ();
- }
+ if (request_queue.insert (this).second) {
+ /* this waveview was not already in the request queue, make sure we wake
+ the rendering thread in case it is asleep.
+ */
+ request_cond.signal ();
+ }
}
}
@@ -967,8 +976,8 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
/* sample position is canonical here, and we want to generate
* an image that spans about 3x the canvas width. We get to that
- * width by using an image sample count of the screen width added
- * on each side of the desired image center.
+ * width by using an image sample count of the screen width added
+ * on each side of the desired image center.
*/
const framepos_t center = req->start + ((req->end - req->start) / 2);
@@ -979,7 +988,9 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
framepos_t sample_start = max (_region_start, (center - image_samples));
framepos_t sample_end = min (center + image_samples, region_end());
- const int n_peaks = llrintf ((sample_end - sample_start)/ (req->samples_per_pixel));
+ const int n_peaks = std::max (1LL, llrint (ceil ((sample_end - sample_start) / (req->samples_per_pixel))));
+
+ assert (n_peaks > 0 && n_peaks < 32767);
boost::scoped_array<ARDOUR::PeakData> peaks (new PeakData[n_peaks]);
@@ -993,7 +1004,19 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
req->channel,
req->samples_per_pixel);
+ if (req->should_stop()) {
+ // cerr << "Request stopped after reading peaks\n";
+ return;
+ }
+
req->image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, n_peaks, req->height);
+
+ // http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-create
+ // This function always returns a valid pointer, but it will return a pointer to a "nil" surface..
+ // but there's some evidence that req->image can be NULL.
+ // http://tracker.ardour.org/view.php?id=6478
+ assert (req->image);
+
/* make sure we record the sample positions that were actually used */
req->start = sample_start;
req->end = sample_end;
@@ -1018,11 +1041,11 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
draw_absent_image (req->image, peaks.get(), n_peaks);
}
} else {
- cerr << "Request stopped before image generation\n";
+ // cerr << "Request stopped before image generation\n";
}
if (in_render_thread && !req->should_stop()) {
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("done with request for %1 at %2 CR %3 req %4 range %5 .. %6\n", this, g_get_monotonic_time(), current_request, req, req->start, req->end));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("done with request for %1 at %2 CR %3 req %4 range %5 .. %6\n", this, g_get_monotonic_time(), current_request, req, req->start, req->end));
const_cast<WaveView*>(this)->ImageReady (); /* emit signal */
}
@@ -1052,7 +1075,7 @@ WaveView::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons
return;
}
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("render %1 at %2\n", this, g_get_monotonic_time()));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("render %1 at %2\n", this, g_get_monotonic_time()));
/* a WaveView is intimately connected to an AudioRegion. It will
* display the waveform within the region, anywhere from the start of
@@ -1207,13 +1230,12 @@ WaveView::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons
* draw or the available width of the image.
*/
- draw_width = min ((double) image_to_draw->image->get_width() - (draw_start - image_to_draw->start),
- (draw_end - draw_start));
+ draw_width = min ((double) image_to_draw->image->get_width(), (draw_end - draw_start));
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 draw just %2 of %3 (iwidth %4 off %5 img @ %6 rs @ %7)\n", name, draw_width, (draw_end - draw_start),
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 draw just %2 of %3 @ %8 (iwidth %4 off %5 img @ %6 rs @ %7)\n", name, draw_width, (draw_end - draw_start),
image_to_draw->image->get_width(), image_origin_in_self_coordinates,
- image_to_draw->start, _region_start));
+ image_to_draw->start, _region_start, draw_start));
} else {
draw_width = draw_end - draw_start;
DEBUG_TRACE (DEBUG::WaveView, string_compose ("use current image, span entire render width %1..%2\n", draw_start, draw_end));
@@ -1476,19 +1498,19 @@ WaveView::cancel_my_render_request () const
* ever starting up.
*/
+ Glib::Threads::Mutex::Lock lm (request_queue_lock);
+
if (current_request) {
current_request->cancel ();
}
- Glib::Threads::Mutex::Lock lm (request_queue_lock);
-
/* now remove it from the queue and reset our request pointer so that
have no outstanding request (that we know about)
*/
request_queue.erase (this);
current_request.reset ();
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has no request %2\n", this));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has no request %2\n", this));
}
@@ -1554,7 +1576,7 @@ WaveView::drawing_thread ()
requestor = *(request_queue.begin());
request_queue.erase (request_queue.begin());
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("start request for %1 at %2\n", requestor, g_get_monotonic_time()));
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("start request for %1 at %2\n", requestor, g_get_monotonic_time()));
boost::shared_ptr<WaveViewThreadRequest> req = requestor->current_request;
@@ -1567,7 +1589,7 @@ WaveView::drawing_thread ()
* as we do rendering.
*/
- request_queue_lock.unlock (); /* some RAII would be good here */
+ lm.release (); /* some RAII would be good here */
try {
requestor->generate_image (req, true);
@@ -1575,7 +1597,7 @@ WaveView::drawing_thread ()
req->image.clear(); /* just in case it was set before the exception, whatever it was */
}
- request_queue_lock.lock ();
+ lm.acquire ();
req.reset (); /* drop/delete request as appropriate */
}
@@ -1633,25 +1655,25 @@ WaveViewCache::lookup_image (boost::shared_ptr<ARDOUR::AudioSource> src,
continue;
}
- switch (Evoral::coverage (start, end, e->start, e->end)) {
- case Evoral::OverlapExternal: /* required range is inside image range */
- DEBUG_TRACE (DEBUG::WaveView, string_compose ("found image spanning %1..%2 covers %3..%4\n",
- e->start, e->end, start, end));
- use (src, e);
- full_coverage = true;
- return e;
-
- case Evoral::OverlapStart: /* required range start is covered by image range */
- if ((e->end - start) > max_coverage) {
- best_partial = e;
- max_coverage = e->end - start;
- }
- break;
-
- case Evoral::OverlapNone:
- case Evoral::OverlapEnd:
- case Evoral::OverlapInternal:
- break;
+ switch (Evoral::coverage (start, end, e->start, e->end)) {
+ case Evoral::OverlapExternal: /* required range is inside image range */
+ DEBUG_TRACE (DEBUG::WaveView, string_compose ("found image spanning %1..%2 covers %3..%4\n",
+ e->start, e->end, start, end));
+ use (src, e);
+ full_coverage = true;
+ return e;
+
+ case Evoral::OverlapStart: /* required range start is covered by image range */
+ if ((e->end - start) > max_coverage) {
+ best_partial = e;
+ max_coverage = e->end - start;
+ }
+ break;
+
+ case Evoral::OverlapNone:
+ case Evoral::OverlapEnd:
+ case Evoral::OverlapInternal:
+ break;
}
}
diff --git a/libs/canvas/wscript b/libs/canvas/wscript
index 2a4cc0b..b40f724 100644
--- a/libs/canvas/wscript
+++ b/libs/canvas/wscript
@@ -40,6 +40,7 @@ canvas_sources = [
'item.cc',
'fill.cc',
'flag.cc',
+ 'framed_curve.cc',
'image.cc',
'line.cc',
'line_set.cc',
@@ -84,7 +85,7 @@ def build(bld):
obj.export_includes = ['.']
obj.includes = ['.']
- obj.uselib = 'SIGCPP CAIROMM GTKMM BOOST'
+ obj.uselib = 'SIGCPP CAIROMM GTKMM BOOST XML'
obj.use = [ 'libpbd', 'libevoral', 'libardour', 'libgtkmm2ext', 'libevoral' ]
obj.name = 'libcanvas'
obj.target = 'canvas'
@@ -92,7 +93,32 @@ def build(bld):
obj.install_path = bld.env['LIBDIR']
obj.defines += [ 'PACKAGE="' + I18N_PACKAGE + '"' ]
- if bld.env['BUILD_TESTS'] and bld.env['HAVE_CPPUNIT']:
+ # canvas unit-tests are outdated
+ if False and bld.env['BUILD_TESTS'] and bld.is_defined('HAVE_CPPUNIT'):
+ unit_testobj = bld(features = 'cxx cxxprogram')
+ unit_testobj.source = '''
+ test/group.cc
+ test/arrow.cc
+ test/optimizing_lookup_table.cc
+ test/polygon.cc
+ test/types.cc
+ test/render.cc
+ test/xml.cc
+ test/wave_view.cc
+ test/item.cc
+ test/testrunner.cpp
+ '''.split()
+
+ unit_testobj.includes = obj.includes + ['test', '../pbd']
+ unit_testobj.uselib = 'CPPUNIT SIGCPP CAIROMM GTKMM'
+ unit_testobj.uselib_local = 'libcanvas libevoral libardour libgtkmm2ext'
+ unit_testobj.name = 'libcanvas-unit-tests'
+ unit_testobj.target = 'run-tests'
+ unit_testobj.install_path = ''
+ unit_testobj.cxxflags = ['-DPACKAGE="libcanvastest"']
+ unit_testobj.cxxflags += ['-DDATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"']
+ unit_testobj.cxxflags += ['-DCONFIG_DIR="' + os.path.normpath(bld.env['CONFDIR']) + '"']
+ unit_testobj.cxxflags += ['-DMODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"']
manual_tests = '''
test/hello_world.cc
@@ -106,7 +132,7 @@ def build(bld):
for t in manual_tests:
target = t[:-3]
name = t[t.find('/')+1:-3]
- manual_testobj = bld.new_task_gen('cxx', 'program')
+ manual_testobj = bld(features = 'cxx cxxprogram')
manual_testobj.source = t
manual_testobj.includes = obj.includes + ['test', '../pbd']
manual_testobj.uselib = 'CPPUNIT SIGCPP CAIROMM GTKMM'
@@ -115,31 +141,6 @@ def build(bld):
manual_testobj.target = target
manual_testobj.install_path = ''
- unit_testobj = bld.new_task_gen('cxx', 'program')
- unit_testobj.source = '''
- test/group.cc
- test/arrow.cc
- test/optimizing_lookup_table.cc
- test/polygon.cc
- test/types.cc
- test/render.cc
- test/xml.cc
- test/wave_view.cc
- test/item.cc
- test/testrunner.cpp
- '''.split()
-
- unit_testobj.includes = obj.includes + ['test', '../pbd']
- unit_testobj.uselib = 'CPPUNIT SIGCPP CAIROMM GTKMM'
- unit_testobj.uselib_local = 'libcanvas libevoral libardour libgtkmm2ext'
- unit_testobj.name = 'libcanvas-unit-tests'
- unit_testobj.target = 'run-tests'
- unit_testobj.install_path = ''
- unit_testobj.cxxflags = ['-DPACKAGE="libcanvastest"']
- unit_testobj.cxxflags += ['-DDATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"']
- unit_testobj.cxxflags += ['-DCONFIG_DIR="' + os.path.normpath(bld.env['CONFIGDIR']) + '"']
- unit_testobj.cxxflags += ['-DMODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"']
-
benchmarks = '''
benchmark/items_at_point.cc
benchmark/render_parts.cc
@@ -150,7 +151,7 @@ def build(bld):
for t in benchmarks:
target = t[:-3]
name = t[t.find('/')+1:-3]
- manual_testobj = bld.new_task_gen('cxx', 'program')
+ manual_testobj = bld(features = 'cxx cxxprogram')
manual_testobj.source = [ t, 'benchmark/benchmark.cc' ]
manual_testobj.includes = obj.includes + ['test', '../pbd']
manual_testobj.uselib = 'CPPUNIT SIGCPP CAIROMM GTKMM'
diff --git a/libs/canvas/xfade_curve.cc b/libs/canvas/xfade_curve.cc
index c8e4776..e93331e 100644
--- a/libs/canvas/xfade_curve.cc
+++ b/libs/canvas/xfade_curve.cc
@@ -185,7 +185,7 @@ XFadeCurve::get_path(Rect const & area, Cairo::RefPtr<Cairo::Context> context, C
window_space = item_to_window (Duple (c.samples[idx].x, 0.0), false);
if (window_space.x >= area.x0) break;
}
- for (Points::size_type idx = c.n_samples; right > left;) {
+ for (Points::size_type idx = c.n_samples - 1; right > left;) {
if (--idx <= left) break;
window_space = item_to_window (Duple (c.samples[idx].x, 0.0), false);
if (window_space.x <= area.x1) break;
diff --git a/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj b/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj
index 2d0bda0..eec3958 100644
--- a/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj
+++ b/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -123,7 +123,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -202,7 +202,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -363,7 +363,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/clearlooks-newer/animation.c b/libs/clearlooks-newer/animation.c
index 9fd530f..f9b5ba5 100644
--- a/libs/clearlooks-newer/animation.c
+++ b/libs/clearlooks-newer/animation.c
@@ -128,7 +128,7 @@ lookup_animation_info (const GtkWidget *widget)
/* Create all the relevant information for the animation, and insert it into the hash table. */
static void
-add_animation (const GtkWidget *widget, gdouble stop_time)
+add_animation (GtkWidget *widget, gdouble stop_time)
{
AnimationInfo *value;
diff --git a/libs/clearlooks-newer/clearlooks_draw.c b/libs/clearlooks-newer/clearlooks_draw.c
index bf01a00..502d2e7 100644
--- a/libs/clearlooks-newer/clearlooks_draw.c
+++ b/libs/clearlooks-newer/clearlooks_draw.c
@@ -2010,12 +2010,12 @@ clearlooks_draw_radiobutton (cairo_t *cr,
cairo_pattern_t *pt;
gboolean inconsistent;
- gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+ gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
(void) width;
(void) height;
- inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+ inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
draw_bullet |= inconsistent;
if (widget->disabled)
@@ -2095,9 +2095,9 @@ clearlooks_draw_checkbox (cairo_t *cr,
const CairoColor *border;
const CairoColor *dot;
gboolean inconsistent = FALSE;
- gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+ gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
- inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+ inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
draw_bullet |= inconsistent;
if (widget->disabled)
diff --git a/libs/clearlooks-newer/clearlooks_draw_glossy.c b/libs/clearlooks-newer/clearlooks_draw_glossy.c
index cf3c96a..26b239f 100644
--- a/libs/clearlooks-newer/clearlooks_draw_glossy.c
+++ b/libs/clearlooks-newer/clearlooks_draw_glossy.c
@@ -1241,12 +1241,12 @@ clearlooks_glossy_draw_radiobutton (cairo_t *cr,
CairoColor highlight;
cairo_pattern_t *pt;
gboolean inconsistent;
- gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+ gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
(void) width;
(void) height;
- inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+ inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
draw_bullet |= inconsistent;
if (widget->disabled)
@@ -1332,9 +1332,9 @@ clearlooks_glossy_draw_checkbox (cairo_t *cr,
const CairoColor *border;
const CairoColor *dot;
gboolean inconsistent = FALSE;
- gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+ gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
- inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+ inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
draw_bullet |= inconsistent;
if (widget->disabled)
diff --git a/libs/clearlooks-newer/clearlooks_draw_gummy.c b/libs/clearlooks-newer/clearlooks_draw_gummy.c
index 97aca7e..caba520 100644
--- a/libs/clearlooks-newer/clearlooks_draw_gummy.c
+++ b/libs/clearlooks-newer/clearlooks_draw_gummy.c
@@ -1340,12 +1340,12 @@ clearlooks_gummy_draw_radiobutton (cairo_t *cr,
CairoColor highlight;
cairo_pattern_t *pt;
gboolean inconsistent;
- gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+ gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
(void) width;
(void) height;
- inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+ inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
draw_bullet |= inconsistent;
if (widget->disabled)
@@ -1431,9 +1431,9 @@ clearlooks_gummy_draw_checkbox (cairo_t *cr,
const CairoColor *border;
const CairoColor *dot;
gboolean inconsistent = FALSE;
- gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+ gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
- inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+ inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
draw_bullet |= inconsistent;
if (widget->disabled)
diff --git a/libs/clearlooks-newer/clearlooks_style.c b/libs/clearlooks-newer/clearlooks_style.c
index b1257f4..fb0ca33 100644
--- a/libs/clearlooks-newer/clearlooks_style.c
+++ b/libs/clearlooks-newer/clearlooks_style.c
@@ -56,7 +56,7 @@ static ClearlooksStyleClass *clearlooks_style_class;
static GtkStyleClass *clearlooks_parent_class;
static void
-clearlooks_set_widget_parameters (const GtkWidget *widget,
+clearlooks_set_widget_parameters (GtkWidget *widget,
const GtkStyle *style,
GtkStateType state_type,
WidgetParameters *params)
@@ -709,9 +709,9 @@ clearlooks_style_draw_box (DRAW_ARGS)
if (!params.ltr)
{
- if (progressbar.orientation == GTK_PROGRESS_LEFT_TO_RIGHT)
+ if (progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_LEFT_TO_RIGHT)
progressbar.orientation = GTK_PROGRESS_RIGHT_TO_LEFT;
- else if (progressbar.orientation == GTK_PROGRESS_RIGHT_TO_LEFT)
+ else if (progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_RIGHT_TO_LEFT)
progressbar.orientation = GTK_PROGRESS_LEFT_TO_RIGHT;
}
@@ -738,8 +738,8 @@ clearlooks_style_draw_box (DRAW_ARGS)
}
else
{
- if (progressbar.orientation == GTK_PROGRESS_RIGHT_TO_LEFT ||
- progressbar.orientation == GTK_PROGRESS_LEFT_TO_RIGHT)
+ if (progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_RIGHT_TO_LEFT ||
+ progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_LEFT_TO_RIGHT)
{
tmp.x -= 1;
tmp.width += 2;
diff --git a/libs/clearlooks-newer/clearlooks_theme_main.c b/libs/clearlooks-newer/clearlooks_theme_main.c
index e4c35b4..ae85627 100644
--- a/libs/clearlooks-newer/clearlooks_theme_main.c
+++ b/libs/clearlooks-newer/clearlooks_theme_main.c
@@ -4,11 +4,21 @@
#include "clearlooks_style.h"
#include "clearlooks_rc_style.h"
+/* declare those three functions first to avoid warnings using gcc */
GE_EXPORT void
-theme_init (GTypeModule *module)
+theme_init (GTypeModule* module);
+
+GE_EXPORT void
+theme_exit (void);
+
+GE_EXPORT GtkRcStyle*
+theme_create_rc_style (void);
+
+GE_EXPORT void
+theme_init (GTypeModule* module)
{
- clearlooks_rc_style_register_type (module);
- clearlooks_style_register_type (module);
+ clearlooks_rc_style_register_type (module);
+ clearlooks_style_register_type (module);
}
GE_EXPORT void
@@ -16,8 +26,8 @@ theme_exit (void)
{
}
-GE_EXPORT GtkRcStyle *
+GE_EXPORT GtkRcStyle*
theme_create_rc_style (void)
{
- return GTK_RC_STYLE (g_object_new (CLEARLOOKS_TYPE_RC_STYLE, NULL));
+ return GTK_RC_STYLE (g_object_new (CLEARLOOKS_TYPE_RC_STYLE, NULL));
}
diff --git a/libs/clearlooks-newer/widget-information.c b/libs/clearlooks-newer/widget-information.c
index 1a4fe31..41a3c5a 100644
--- a/libs/clearlooks-newer/widget-information.c
+++ b/libs/clearlooks-newer/widget-information.c
@@ -11,7 +11,7 @@
Smooth-Engine.
*/
gboolean
-ge_object_is_a (const GObject * object, const gchar * type_name)
+ge_object_is_a (GObject * object, const gchar * type_name)
{
gboolean result = FALSE;
diff --git a/libs/clearlooks-newer/widget-information.h b/libs/clearlooks-newer/widget-information.h
index a6dd807..75be4c8 100644
--- a/libs/clearlooks-newer/widget-information.h
+++ b/libs/clearlooks-newer/widget-information.h
@@ -73,7 +73,7 @@
#define GE_WIDGET_HAS_DEFAULT(object) ((object) && GE_IS_WIDGET(object) && GTK_WIDGET_HAS_DEFAULT(object))
-GE_INTERNAL gboolean ge_object_is_a (const GObject * object, const gchar * type_name);
+GE_INTERNAL gboolean ge_object_is_a (GObject * object, const gchar * type_name);
GE_INTERNAL gboolean ge_is_combo_box_entry (GtkWidget * widget);
GE_INTERNAL gboolean ge_is_combo_box (GtkWidget * widget, gboolean as_list);
diff --git a/libs/evoral/MSVCevoral/evoral.vcproj b/libs/evoral/MSVCevoral/evoral.vcproj
index 2a299d3..4e2de98 100644
--- a/libs/evoral/MSVCevoral/evoral.vcproj
+++ b/libs/evoral/MSVCevoral/evoral.vcproj
@@ -284,10 +284,6 @@
>
</File>
<File
- RelativePath="..\src\midi_util.cpp"
- >
- </File>
- <File
RelativePath="..\src\MIDIEvent.cpp"
>
</File>
@@ -570,7 +566,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/evoral/evoral/ControlList.hpp b/libs/evoral/evoral/ControlList.hpp
index f1a4627..7d6b294 100644
--- a/libs/evoral/evoral/ControlList.hpp
+++ b/libs/evoral/evoral/ControlList.hpp
@@ -31,7 +31,6 @@
#include "pbd/signals.h"
#include "evoral/visibility.h"
-#include "evoral/types.hpp"
#include "evoral/Range.hpp"
#include "evoral/Parameter.hpp"
#include "evoral/ParameterDescriptor.hpp"
@@ -124,10 +123,17 @@ public:
void slide (iterator before, double distance);
void shift (double before, double distance);
+ /** add automation events
+ * @param when absolute time in samples
+ * @param value parameter value
+ * @param with_guards if true, add guard-points
+ * @param with_initial if true, add an initial point if the list is empty
+ */
virtual void add (double when, double value, bool with_guards=true, bool with_initial=true);
virtual bool editor_add (double when, double value, bool with_guard);
+ /* to be used only for loading pre-sorted data from saved state */
void fast_simple_add (double when, double value);
void erase_range (double start, double end);
@@ -139,9 +145,12 @@ public:
/** Thin the number of events in this list.
*
- * The thinning factor has no units but corresponds to the area of a
- * triangle computed between three points in the list. If the area is
- * large, it indicates significant non-linearity between the points.
+ * The thinning factor corresponds to the area of a triangle computed
+ * between three points in the list (time-difference * value-difference).
+ * If the area is large, it indicates significant non-linearity between
+ * the points.
+ *
+ * Time is measured in samples, value is usually normalized to 0..1.
*
* During automation recording we thin the recorded points using this
* value. If a point is sufficiently co-linear with its neighbours (as
@@ -149,12 +158,19 @@ public:
* not include it in the list. The larger the value, the more points are
* excluded, so this effectively measures the amount of thinning to be
* done.
+ *
+ * @param thinning_factor area-size (default: 20)
*/
void thin (double thinning_factor);
boost::shared_ptr<ControlList> cut (double, double);
boost::shared_ptr<ControlList> copy (double, double);
- void clear (double, double);
+
+ /** remove all automation events between the given time range
+ * @param start start of range (inclusive) in audio samples
+ * @param end end of range (inclusive) in audio samples
+ */
+ void clear (double start, double end);
bool paste (const ControlList&, double position, float times);
@@ -166,8 +182,14 @@ public:
double get_max_y() const { return _max_yval; }
double get_min_y() const { return _min_yval; }
- void truncate_end (double length);
- void truncate_start (double length);
+ /** truncate the event list after the given time
+ * @param last_coordinate last event to include
+ */
+ void truncate_end (double last_coordinate);
+ /** truncate the event list to the given time
+ * @param overall_length overall length
+ */
+ void truncate_start (double overall_length);
iterator begin() { return _events.begin(); }
const_iterator begin() const { return _events.begin(); }
@@ -189,11 +211,20 @@ public:
(obj.*method)(*this);
}
+ /** query value at given time (takes a read-lock, not safe while writing automation)
+ * @param where absolute time in samples
+ * @returns parameter value
+ */
double eval (double where) {
Glib::Threads::RWLock::ReaderLock lm (_lock);
return unlocked_eval (where);
}
+ /** realtime safe version of eval, may fail if read-lock cannot be taken
+ * @param where absolute time in samples
+ * @param ok boolean reference if returned value is valid
+ * @returns parameter value
+ */
double rt_safe_eval (double where, bool& ok) {
Glib::Threads::RWLock::ReaderLock lm (_lock, Glib::Threads::TRY_LOCK);
@@ -257,16 +288,23 @@ public:
Curved
};
+ /** query interpolation style of the automation data
+ * @returns Interpolation Style
+ */
InterpolationStyle interpolation() const { return _interpolation; }
- void set_interpolation (InterpolationStyle);
+
+ /** set the interpolation style of the automation data
+ * @param is interpolation style
+ */
+ void set_interpolation (InterpolationStyle is);
virtual bool touching() const { return false; }
virtual bool writing() const { return false; }
virtual bool touch_enabled() const { return false; }
- void start_write_pass (double time);
- void write_pass_finished (double when, double thinning_factor=0.0);
- void set_in_write_pass (bool, bool add_point = false, double when = 0.0);
- bool in_write_pass () const;
+ void start_write_pass (double when);
+ void write_pass_finished (double when, double thinning_factor=0.0);
+ void set_in_write_pass (bool, bool add_point = false, double when = 0.0);
+ bool in_write_pass () const;
bool in_new_write_pass () { return new_write_pass; }
/** Emitted when mark_dirty() is called on this object */
diff --git a/libs/evoral/evoral/ControlSet.hpp b/libs/evoral/evoral/ControlSet.hpp
index f1c2d96..5a9fc58 100644
--- a/libs/evoral/evoral/ControlSet.hpp
+++ b/libs/evoral/evoral/ControlSet.hpp
@@ -27,7 +27,6 @@
#include "pbd/signals.h"
#include "evoral/visibility.h"
-#include "evoral/types.hpp"
#include "evoral/Parameter.hpp"
#include "evoral/ControlList.hpp"
diff --git a/libs/evoral/evoral/Event.hpp b/libs/evoral/evoral/Event.hpp
index 2a6810a..cbb62e2 100644
--- a/libs/evoral/evoral/Event.hpp
+++ b/libs/evoral/evoral/Event.hpp
@@ -92,6 +92,11 @@ public:
inline bool owns_buffer() const { return _owns_buf; }
+ /** set event data (e.g. midi data)
+ * @param size number of bytes
+ * @param buf raw 8bit data
+ * @param own set to true if the buffer owns the data (copy, allocate/free) or false to reference previously allocated data.
+ */
inline void set_buffer(uint32_t size, uint8_t* buf, bool own) {
if (_owns_buf) {
free(_buf);
diff --git a/libs/evoral/evoral/EventList.hpp b/libs/evoral/evoral/EventList.hpp
index 0766d48..38ade74 100644
--- a/libs/evoral/evoral/EventList.hpp
+++ b/libs/evoral/evoral/EventList.hpp
@@ -20,10 +20,9 @@
#include <list>
-#include "evoral/visibility.h"
-#include "evoral/EventSink.hpp"
-#include "evoral/types.hpp"
#include "evoral/Event.hpp"
+#include "evoral/EventSink.hpp"
+#include "evoral/visibility.h"
namespace Evoral {
diff --git a/libs/evoral/evoral/Sequence.hpp b/libs/evoral/evoral/Sequence.hpp
index 93e97c6..8485f94 100644
--- a/libs/evoral/evoral/Sequence.hpp
+++ b/libs/evoral/evoral/Sequence.hpp
@@ -28,7 +28,6 @@
#include <glibmm/threads.h>
#include "evoral/visibility.h"
-#include "evoral/types.hpp"
#include "evoral/Note.hpp"
#include "evoral/ControlSet.hpp"
#include "evoral/ControlList.hpp"
diff --git a/libs/evoral/evoral/midi_util.h b/libs/evoral/evoral/midi_util.h
index 2ad5b3f..20ff949 100644
--- a/libs/evoral/evoral/midi_util.h
+++ b/libs/evoral/evoral/midi_util.h
@@ -133,8 +133,6 @@ midi_event_is_valid(const uint8_t* buffer, size_t len)
return true;
}
-LIBEVORAL_API std::string midi_note_name (uint8_t noteval);
-
} // namespace Evoral
#endif // EVORAL_MIDI_UTIL_H
diff --git a/libs/evoral/evoral/types.hpp b/libs/evoral/evoral/types.hpp
index 7d3f415..a5d4a8c 100644
--- a/libs/evoral/evoral/types.hpp
+++ b/libs/evoral/evoral/types.hpp
@@ -27,11 +27,7 @@
#include <limits>
#include <list>
-#include "pbd/debug.h"
-
-#include "evoral/Beats.hpp"
#include "evoral/visibility.h"
-
#include "pbd/debug.h"
namespace Evoral {
@@ -44,6 +40,8 @@ typedef int32_t event_id_t;
/** Type of an event (opaque, mapped by application) */
typedef uint32_t EventType;
+class Beats;
+
} // namespace Evoral
namespace PBD {
diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp
index 73c1675..c665b69 100644
--- a/libs/evoral/src/ControlList.cpp
+++ b/libs/evoral/src/ControlList.cpp
@@ -36,6 +36,7 @@
#include "evoral/Curve.hpp"
#include "evoral/ParameterDescriptor.hpp"
#include "evoral/TypeMap.hpp"
+#include "evoral/types.hpp"
#include "pbd/compose.h"
#include "pbd/debug.h"
@@ -138,6 +139,7 @@ ControlList::~ControlList()
for (EventList::iterator x = _events.begin(); x != _events.end(); ++x) {
delete (*x);
}
+ _events.clear ();
delete _curve;
}
@@ -177,6 +179,9 @@ ControlList::copy_events (const ControlList& other)
{
{
Glib::Threads::RWLock::WriterLock lm (_lock);
+ for (EventList::iterator x = _events.begin(); x != _events.end(); ++x) {
+ delete (*x);
+ }
_events.clear ();
for (const_iterator i = other.begin(); i != other.end(); ++i) {
_events.push_back (new ControlEvent ((*i)->when, (*i)->value));
@@ -215,6 +220,9 @@ ControlList::clear ()
{
{
Glib::Threads::RWLock::WriterLock lm (_lock);
+ for (EventList::iterator x = _events.begin(); x != _events.end(); ++x) {
+ delete (*x);
+ }
_events.clear ();
unlocked_invalidate_insert_iterator ();
mark_dirty ();
@@ -1659,6 +1667,12 @@ ControlList::paste (const ControlList& alist, double pos, float /*times*/)
if (alist.parameter() != parameter()) {
const ParameterDescriptor& src_desc = alist.descriptor();
+ // This does not work for logscale and will probably also not do
+ // the right thing for integer_step and sr_dependent parameters.
+ //
+ // TODO various flags from from ARDOUR::ParameterDescriptor
+ // to Evoral::ParameterDescriptor
+
value -= src_desc.lower; // translate to 0-relative
value /= (src_desc.upper - src_desc.lower); // normalize range
value *= (_desc.upper - _desc.lower); // scale to our range
diff --git a/libs/evoral/src/Event.cpp b/libs/evoral/src/Event.cpp
index 64caba3..09b2402 100644
--- a/libs/evoral/src/Event.cpp
+++ b/libs/evoral/src/Event.cpp
@@ -17,7 +17,9 @@
*/
#include <glib.h>
+
#include "evoral/Event.hpp"
+#include "evoral/Beats.hpp"
namespace Evoral {
diff --git a/libs/evoral/src/MIDIEvent.cpp b/libs/evoral/src/MIDIEvent.cpp
index 4985f66..d03a3ff 100644
--- a/libs/evoral/src/MIDIEvent.cpp
+++ b/libs/evoral/src/MIDIEvent.cpp
@@ -17,6 +17,7 @@
*/
#include <string>
+#include "evoral/Beats.hpp"
#include "evoral/MIDIEvent.hpp"
#ifdef EVORAL_MIDI_XML
#include "pbd/xml++.h"
diff --git a/libs/evoral/src/Note.cpp b/libs/evoral/src/Note.cpp
index afd7330..a63bf43 100644
--- a/libs/evoral/src/Note.cpp
+++ b/libs/evoral/src/Note.cpp
@@ -23,6 +23,8 @@
#include "evoral/Note.hpp"
#endif
+#include "evoral/Beats.hpp"
+
namespace Evoral {
template<typename Time>
diff --git a/libs/evoral/src/SMF.cpp b/libs/evoral/src/SMF.cpp
index b6ec8ec..45109b5 100644
--- a/libs/evoral/src/SMF.cpp
+++ b/libs/evoral/src/SMF.cpp
@@ -22,7 +22,11 @@
#include <cmath>
#include <iostream>
#include <stdint.h>
+
+#include <glib/gstdio.h>
+
#include "libsmf/smf.h"
+
#include "evoral/Event.hpp"
#include "evoral/SMF.hpp"
#include "evoral/midi_util.h"
@@ -78,7 +82,7 @@ SMF::seek_to_track(int track)
bool
SMF::test(const std::string& path)
{
- FILE* f = fopen(path.c_str(), "r");
+ FILE* f = g_fopen(path.c_str(), "r");
if (f == 0) {
return false;
}
@@ -108,7 +112,7 @@ SMF::open(const std::string& path, int track) THROW_FILE_ERROR
smf_delete(_smf);
}
- FILE* f = fopen(path.c_str(), "r");
+ FILE* f = g_fopen(path.c_str(), "r");
if (f == 0) {
return -1;
} else if ((_smf = smf_load(f)) == 0) {
@@ -176,7 +180,7 @@ SMF::create(const std::string& path, int track, uint16_t ppqn) THROW_FILE_ERROR
{
/* put a stub file on disk */
- FILE* f = fopen (path.c_str(), "w+");
+ FILE* f = g_fopen (path.c_str(), "w+");
if (f == 0) {
return -1;
}
@@ -405,7 +409,7 @@ SMF::end_write(string const & path) THROW_FILE_ERROR
return;
}
- FILE* f = fopen (path.c_str(), "w+");
+ FILE* f = g_fopen (path.c_str(), "w+");
if (f == 0) {
throw FileError (path);
}
diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp
index 7f03248..19a0fb1 100644
--- a/libs/evoral/src/Sequence.cpp
+++ b/libs/evoral/src/Sequence.cpp
@@ -31,6 +31,7 @@
#include "pbd/compose.h"
#include "pbd/error.h"
+#include "evoral/Beats.hpp"
#include "evoral/Control.hpp"
#include "evoral/ControlList.hpp"
#include "evoral/ControlSet.hpp"
@@ -40,7 +41,7 @@
#include "evoral/TypeMap.hpp"
#include "evoral/midi_util.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/evoral/src/i18n.h b/libs/evoral/src/i18n.h
deleted file mode 100644
index dcbbfcf..0000000
--- a/libs/evoral/src/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text) dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/evoral/src/midi_util.cpp b/libs/evoral/src/midi_util.cpp
deleted file mode 100644
index be7010c..0000000
--- a/libs/evoral/src/midi_util.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/* This file is part of Evoral.
- * Copyright (C) 2008 David Robillard <http://drobilla.net>
- * Copyright (C) 2009 Paul Davis
- *
- * Evoral is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.
- *
- * Evoral is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "evoral/midi_util.h"
-#include <cstdio>
-
-namespace Evoral {
-
-std::string
-midi_note_name (uint8_t val)
-{
- if (val > 127) {
- return "???";
- }
-
- static const char* notes[] = {
- "C",
- "C#",
- "D",
- "D#",
- "E",
- "F",
- "F#",
- "G",
- "G#",
- "A",
- "A#",
- "B"
- };
-
- /* MIDI note 0 is in octave -1 (in scientific pitch notation) */
- int octave = val / 12 - 1;
- static char buf[8];
-
- val = val % 12;
-
- snprintf (buf, sizeof (buf), "%s%d", notes[val], octave);
- return buf;
-}
-
-}
diff --git a/libs/evoral/src/types.cpp b/libs/evoral/src/types.cpp
index 50c2975..db061fd 100644
--- a/libs/evoral/src/types.cpp
+++ b/libs/evoral/src/types.cpp
@@ -18,6 +18,7 @@
#include <limits.h>
+#include "evoral/Beats.hpp"
#include "evoral/types.hpp"
namespace Evoral {
diff --git a/libs/evoral/test/SequenceTest.hpp b/libs/evoral/test/SequenceTest.hpp
index 3207541..de51f71 100644
--- a/libs/evoral/test/SequenceTest.hpp
+++ b/libs/evoral/test/SequenceTest.hpp
@@ -2,6 +2,7 @@
#include <sigc++/sigc++.h>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
+#include "evoral/Beats.hpp"
#include "evoral/Sequence.hpp"
#include "evoral/TypeMap.hpp"
#include "evoral/EventSink.hpp"
diff --git a/libs/evoral/wscript b/libs/evoral/wscript
index 12ebffe..7649bb8 100644
--- a/libs/evoral/wscript
+++ b/libs/evoral/wscript
@@ -82,7 +82,6 @@ def build(bld):
src/ControlSet.cpp
src/Curve.cpp
src/Event.cpp
- src/midi_util.cpp
src/MIDIEvent.cpp
src/Note.cpp
src/SMF.cpp
@@ -107,7 +106,7 @@ def build(bld):
obj.includes = ['.', './src']
obj.name = 'libevoral'
obj.target = 'evoral'
- obj.uselib = 'GLIBMM GTHREAD SMF'
+ obj.uselib = 'GLIBMM GTHREAD SMF XML'
obj.use = 'libsmf libpbd'
obj.vnum = EVORAL_LIB_VERSION
obj.install_path = bld.env['LIBDIR']
@@ -122,7 +121,7 @@ def build(bld):
obj.includes = ['.', './src']
obj.name = 'libevoral_static'
obj.target = 'evoral_static'
- obj.uselib = 'GLIBMM GTHREAD SMF'
+ obj.uselib = 'GLIBMM GTHREAD SMF XML'
obj.use = 'libsmf libpbd'
obj.vnum = EVORAL_LIB_VERSION
obj.install_path = ''
diff --git a/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj b/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
index f86add8..9e61bd4 100644
--- a/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
+++ b/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -122,7 +122,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -201,7 +201,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -294,6 +294,10 @@
>
</File>
<File
+ RelativePath="..\cairo_icon.cc"
+ >
+ </File>
+ <File
RelativePath="..\cairo_packer.cc"
>
</File>
@@ -378,6 +382,10 @@
>
</File>
<File
+ RelativePath="..\pane.cc"
+ >
+ </File>
+ <File
RelativePath="..\paths_dialog.cc"
>
</File>
@@ -406,6 +414,10 @@
>
</File>
<File
+ RelativePath="..\searchbar.cc"
+ >
+ </File>
+ <File
RelativePath="..\selector.cc"
>
</File>
@@ -418,6 +430,10 @@
>
</File>
<File
+ RelativePath="..\tabbable.cc"
+ >
+ </File>
+ <File
RelativePath="..\tearoff.cc"
>
</File>
@@ -442,6 +458,10 @@
>
</File>
<File
+ RelativePath="..\window_proxy.cc"
+ >
+ </File>
+ <File
RelativePath="..\window_title.cc"
>
</File>
@@ -488,6 +508,10 @@
>
</File>
<File
+ RelativePath="..\gtkmm2ext\cairo_icon.h"
+ >
+ </File>
+ <File
RelativePath="..\gtkmm2ext\cairo_packer.h"
>
</File>
@@ -588,6 +612,10 @@
>
</File>
<File
+ RelativePath="..\gtkmm2ext\pane.h"
+ >
+ </File>
+ <File
RelativePath="..\gtkmm2ext\persistent_tooltip.h"
>
</File>
@@ -616,6 +644,10 @@
>
</File>
<File
+ RelativePath="..\gtkmm2ext\searchbar.h"
+ >
+ </File>
+ <File
RelativePath="..\gtkmm2ext\selector.h"
>
</File>
@@ -632,6 +664,10 @@
>
</File>
<File
+ RelativePath="..\gtkmm2ext\tabbable.h"
+ >
+ </File>
+ <File
RelativePath="..\gtkmm2ext\tearoff.h"
>
</File>
@@ -656,6 +692,10 @@
>
</File>
<File
+ RelativePath="..\gtkmm2ext\window_proxy.h"
+ >
+ </File>
+ <File
RelativePath="..\gtkmm2ext\window_title.h"
>
</File>
@@ -666,7 +706,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc
index 9471067..840c9dc 100644
--- a/libs/gtkmm2ext/actions.cc
+++ b/libs/gtkmm2ext/actions.cc
@@ -41,7 +41,7 @@
#include "gtkmm2ext/actions.h"
#include "gtkmm2ext/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -53,234 +53,6 @@ using namespace Gtkmm2ext;
RefPtr<UIManager> ActionManager::ui_manager;
string ActionManager::unbound_string = "--";
-
-RefPtr<Action>
-ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl)
-{
- RefPtr<Action> act;
-
- act = Action::create (name, label);
- group->add (act, sl);
-
- return act;
-}
-
-RefPtr<Action>
-ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label)
-{
- RefPtr<Action> act;
-
- act = Action::create (name, label);
- group->add (act);
-
- return act;
-}
-
-
-RefPtr<Action>
-ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Group& rgroup, const char * name, const char * label, slot<void> sl)
-{
- RefPtr<Action> act;
-
- act = RadioAction::create (rgroup, name, label);
- group->add (act, sl);
-
- return act;
-}
-
-RefPtr<Action>
-ActionManager::register_radio_action (
- RefPtr<ActionGroup> group, RadioAction::Group& rgroup, string const & name, string const & label, string const & tooltip, slot<void> sl
- )
-{
- RefPtr<Action> act;
-
- act = RadioAction::create (rgroup, name, label, tooltip);
- group->add (act, sl);
-
- return act;
-}
-
-RefPtr<Action>
-ActionManager::register_toggle_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl)
-{
- RefPtr<Action> act;
-
- act = ToggleAction::create (name, label);
- group->add (act, sl);
-
- return act;
-}
-
-RefPtr<Action>
-ActionManager::register_toggle_action (RefPtr<ActionGroup> group, string const & name, string const & label, string const & tooltip, slot<void> sl)
-{
- RefPtr<Action> act;
-
- act = ToggleAction::create (name, label, tooltip);
- group->add (act, sl);
-
- return act;
-}
-
-bool
-ActionManager::lookup_entry (const ustring accel_path, Gtk::AccelKey& key)
-{
- GtkAccelKey gkey;
- bool known = gtk_accel_map_lookup_entry (accel_path.c_str(), &gkey);
-
- if (known) {
- key = AccelKey (gkey.accel_key, Gdk::ModifierType (gkey.accel_mods));
- } else {
- key = AccelKey (GDK_VoidSymbol, Gdk::ModifierType (0));
- }
-
- return known;
-}
-
-struct SortActionsByLabel {
- bool operator() (Glib::RefPtr<Gtk::Action> a, Glib::RefPtr<Gtk::Action> b) {
- ustring astr = a->get_accel_path();
- ustring bstr = b->get_accel_path();
- return astr < bstr;
- }
-};
-
-void
-ActionManager::get_all_actions (vector<string>& groups, vector<string>& names, vector<string>& tooltips, vector<AccelKey>& bindings)
-{
- /* the C++ API for functions used here appears to be broken in
- gtkmm2.6, so we fall back to the C level.
- */
-
- GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
- GList* node;
- GList* acts;
-
- for (node = list; node; node = g_list_next (node)) {
-
- GtkActionGroup* group = (GtkActionGroup*) node->data;
-
- /* first pass: collect them all */
-
- typedef std::list<Glib::RefPtr<Gtk::Action> > action_list;
- action_list the_acts;
-
- for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
- GtkAction* action = (GtkAction*) acts->data;
- the_acts.push_back (Glib::wrap (action, true));
- }
-
- /* now sort by label */
-
- SortActionsByLabel cmp;
- the_acts.sort (cmp);
-
- for (action_list::iterator a = the_acts.begin(); a != the_acts.end(); ++a) {
-
- string accel_path = (*a)->get_accel_path ();
-
- groups.push_back (gtk_action_group_get_name(group));
- names.push_back (accel_path.substr (accel_path.find_last_of ('/') + 1));
- tooltips.push_back ((*a)->get_tooltip ());
-
- AccelKey key;
- lookup_entry (accel_path, key);
- bindings.push_back (AccelKey (key.get_key(), Gdk::ModifierType (key.get_mod())));
- }
- }
-}
-
-void
-ActionManager::get_all_actions (vector<string>& names, vector<string>& paths, vector<string>& tooltips, vector<string>& keys, vector<AccelKey>& bindings)
-{
- /* the C++ API for functions used here appears to be broken in
- gtkmm2.6, so we fall back to the C level.
- */
-
- GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
- GList* node;
- GList* acts;
-
- for (node = list; node; node = g_list_next (node)) {
-
- GtkActionGroup* group = (GtkActionGroup*) node->data;
-
- /* first pass: collect them all */
-
- typedef std::list<Glib::RefPtr<Gtk::Action> > action_list;
- action_list the_acts;
-
- for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
- GtkAction* action = (GtkAction*) acts->data;
- the_acts.push_back (Glib::wrap (action, true));
- }
-
- /* now sort by label */
-
- SortActionsByLabel cmp;
- the_acts.sort (cmp);
-
- for (action_list::iterator a = the_acts.begin(); a != the_acts.end(); ++a) {
-
- ustring const label = (*a)->property_label ();
- string const accel_path = (*a)->get_accel_path ();
-
- names.push_back (label);
- paths.push_back (accel_path);
- tooltips.push_back ((*a)->get_tooltip ());
-
- AccelKey key;
- keys.push_back (get_key_representation (accel_path, key));
- bindings.push_back (AccelKey (key.get_key(), Gdk::ModifierType (key.get_mod())));
- }
- }
-}
-
-void
-ActionManager::enable_accelerators ()
-{
- /* the C++ API for functions used here appears to be broken in
- gtkmm2.6, so we fall back to the C level.
- */
-
- GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
- GList* node;
- GList* acts;
- string ui_string = "<ui>";
-
- /* get all actions, build a string describing them all as <accelerator
- * action="name"/>
- */
-
- for (node = list; node; node = g_list_next (node)) {
-
- GtkActionGroup* group = (GtkActionGroup*) node->data;
-
- for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
- ui_string += "<accelerator action=\"";
-
- /* OK, this is pretty stupid ... there is the full
- * accel path returned by gtk_action_get_accel_path ()
- * but of course the UIManager doesn't use that, but
- * just a name, which is the last component of the
- * path. What a totally ridiculous design.
- */
-
- string fullpath = gtk_action_get_accel_path ((GtkAction*) acts->data);
-
- ui_string += Glib::path_get_basename (fullpath);
- ui_string += "\"/>";
- }
- }
-
- ui_string += "</ui>";
-
- /* and load it */
-
- ui_manager->add_ui_from_string (ui_string);
-}
-
struct ActionState {
GtkAction* action;
bool sensitive;
@@ -348,12 +120,6 @@ ActionManager::disable_active_actions ()
actions_disabled = true;
}
-void
-ActionManager::add_action_group (RefPtr<ActionGroup> grp)
-{
- ui_manager->insert_action_group (grp);
-}
-
Widget*
ActionManager::get_widget (const char * name)
{
@@ -401,7 +167,7 @@ ActionManager::get_action (const char* group_name, const char* action_name)
gtkmm2.6, so we fall back to the C level.
*/
- if (ui_manager == 0) {
+ if (! ui_manager) {
return RefPtr<Action> ();
}
@@ -421,36 +187,12 @@ ActionManager::get_action (const char* group_name, const char* action_name)
act = Glib::wrap (_act, true);
break;
}
- }
- }
-
- return act;
-}
-
-RefPtr<Action>
-ActionManager::get_action_from_name (const char* name)
-{
- /* the C++ API for functions used here appears to be broken in
- gtkmm2.6, so we fall back to the C level.
- */
-
- GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
- GList* node;
- GList* acts;
-
- for (node = list; node; node = g_list_next (node)) {
-
- GtkActionGroup* group = (GtkActionGroup*) node->data;
- for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
- GtkAction* action = (GtkAction*) acts->data;
- if (!strcmp (gtk_action_get_name (action), name)) {
- return Glib::wrap (action, true);
- }
+ break;
}
}
- return RefPtr<Action>();
+ return act;
}
void
@@ -522,20 +264,6 @@ ActionManager::set_toggleaction_state (string n, bool s)
delete [] group_name;
}
-string
-ActionManager::get_key_representation (const string& accel_path, AccelKey& key)
-{
- bool known = lookup_entry (accel_path, key);
-
- if (known) {
- uint32_t k = possibly_translate_legal_accelerator_to_real_key (key.get_key());
- key = AccelKey (k, Gdk::ModifierType (key.get_mod()));
- return ui_manager->get_accel_group()->get_label (key.get_key(), Gdk::ModifierType (key.get_mod()));
- }
-
- return unbound_string;
-}
-
void
ActionManager::do_action (const char* group, const char*action)
{
@@ -556,4 +284,3 @@ ActionManager::set_toggle_action (const char* group, const char*action, bool yn)
}
}
}
-
diff --git a/libs/gtkmm2ext/ardour_icon.cc b/libs/gtkmm2ext/ardour_icon.cc
index e06d489..6a7cabe 100644
--- a/libs/gtkmm2ext/ardour_icon.cc
+++ b/libs/gtkmm2ext/ardour_icon.cc
@@ -522,10 +522,15 @@ static void icon_rec_enable (cairo_t *cr, const int width, const int height, con
const double y = height * .5;
const double r = std::min (x, y) * .55;
cairo_arc (cr, x, y, r, 0, 2 * M_PI);
- if (state == Gtkmm2ext::ExplicitActive)
- cairo_set_source_rgba (cr, 0.95, 0.10, 0.10, 1.0);
- else
- cairo_set_source_rgba (cr, 0.95, 0.44, 0.44, 1.0); // #f46f6f
+ if (state == Gtkmm2ext::ExplicitActive) {
+ cairo_set_source_rgba (cr, 1.0, .1, .1, 1.0);
+ }
+ else if (state == Gtkmm2ext::ImplicitActive) {
+ cairo_set_source_rgba (cr, .9, .3, .3, 1.0);
+ }
+ else {
+ cairo_set_source_rgba (cr, .4, .3, .3, 1.0);
+ }
cairo_fill_preserve (cr);
cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.8); // outline
cairo_set_line_width (cr, 1);
@@ -543,9 +548,13 @@ static void icon_rec_tape (cairo_t *cr, const int width, const int height, const
cairo_arc (cr, 0, 0, r, 0, 2 * M_PI);
if (state == Gtkmm2ext::ExplicitActive) {
- cairo_set_source_rgba (cr, .95, .1, .1, 1.);
- } else {
- cairo_set_source_rgba (cr, .95, .44, .44, 1.); // #f46f6f
+ cairo_set_source_rgba (cr, 1.0, .1, .1, 1.0);
+ }
+ else if (state == Gtkmm2ext::ImplicitActive) {
+ cairo_set_source_rgba (cr, .9, .3, .3, 1.0);
+ }
+ else {
+ cairo_set_source_rgba (cr, .4, .3, .3, 1.0);
}
cairo_fill_preserve (cr);
cairo_set_source_rgba (cr, .0, .0, .0, .5);
@@ -580,10 +589,15 @@ static void icon_rec_tape (cairo_t *cr, const int width, const int height, const
cairo_restore (cr);
cairo_arc (cr, 0, 0, r * .3, 0, 2 * M_PI);
- if (state == Gtkmm2ext::ExplicitActive)
- cairo_set_source_rgba (cr, .95, .1, .1, 1.);
- else
- cairo_set_source_rgba (cr, .95, .44, .44, 1.); // #f46f6f
+ if (state == Gtkmm2ext::ExplicitActive) {
+ cairo_set_source_rgba (cr, 1.0, .1, .1, 1.0);
+ }
+ else if (state == Gtkmm2ext::ImplicitActive) {
+ cairo_set_source_rgba (cr, .9, .3, .3, 1.0);
+ }
+ else {
+ cairo_set_source_rgba (cr, .4, .3, .3, 1.0);
+ }
cairo_fill (cr);
cairo_set_source_rgba (cr, .0, .0, .0, 1.0);
cairo_arc (cr, 0, 0, r *.15, 0, 2 * M_PI); // hole in the middle
@@ -849,7 +863,7 @@ static void icon_close_cross (cairo_t *cr, const int width, const int height, co
const double y = height * .5;
const double o = .5 + std::min (x, y) * .4;
ardour_icon_set_source_rgba (cr, fg_color);
- cairo_set_line_width (cr, 1);
+ cairo_set_line_width (cr, 1.0);
cairo_move_to (cr, x-o, y-o);
cairo_line_to (cr, x+o, y+o);
cairo_move_to (cr, x+o, y-o);
@@ -898,15 +912,15 @@ static void icon_strip_width (cairo_t *cr, const int width, const int height, co
const double x1 = width * .8;
const double y0 = height * .25;
- const double y1= height * .75;
+ const double y1 = height * .75;
- const double ym= height * .5;
+ const double ym = height * .5;
// arrow
- const double xa0= height * .39;
- const double xa1= height * .61;
- const double ya0= height * .35;
- const double ya1= height * .65;
+ const double xa0= width * .39;
+ const double xa1= width * .61;
+ const double ya0= height * .35;
+ const double ya1= height * .65;
ardour_icon_set_source_rgba (cr, fg_color);
cairo_set_line_width (cr, 1);
diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc
index 0c777ed..d213f22 100644
--- a/libs/gtkmm2ext/barcontroller.cc
+++ b/libs/gtkmm2ext/barcontroller.cc
@@ -31,7 +31,7 @@
#include "gtkmm2ext/barcontroller.h"
#include "gtkmm2ext/cairo_widget.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
diff --git a/libs/gtkmm2ext/bindable_button.cc b/libs/gtkmm2ext/bindable_button.cc
index 5c0cc3c..cc9695f 100644
--- a/libs/gtkmm2ext/bindable_button.cc
+++ b/libs/gtkmm2ext/bindable_button.cc
@@ -26,7 +26,7 @@
#include "gtkmm2ext/bindable_button.h"
#include "gtkmm2ext/gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace std;
diff --git a/libs/gtkmm2ext/binding_proxy.cc b/libs/gtkmm2ext/binding_proxy.cc
index dfa2b4a..5ba5f7e 100644
--- a/libs/gtkmm2ext/binding_proxy.cc
+++ b/libs/gtkmm2ext/binding_proxy.cc
@@ -25,7 +25,7 @@
#include <gtkmm2ext/binding_proxy.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace std;
diff --git a/libs/gtkmm2ext/bindings.cc b/libs/gtkmm2ext/bindings.cc
index 5efb40e..e25ed20 100644
--- a/libs/gtkmm2ext/bindings.cc
+++ b/libs/gtkmm2ext/bindings.cc
@@ -1,607 +1,1329 @@
/*
- Copyright (C) 2012 Paul Davis
+ Copyright (C) 2012 Paul Davis
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <iostream>
#include "pbd/gstdio_compat.h"
+#include <gtkmm/accelmap.h>
+#include <gtkmm/uimanager.h>
-#include "pbd/xml++.h"
#include "pbd/convert.h"
+#include "pbd/debug.h"
+#include "pbd/error.h"
+#include "pbd/replace_all.h"
+#include "pbd/xml++.h"
#include "gtkmm2ext/actions.h"
#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/debug.h"
#include "gtkmm2ext/keyboard.h"
+#include "gtkmm2ext/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Glib;
using namespace Gtk;
using namespace Gtkmm2ext;
+using namespace PBD;
-uint32_t Bindings::_ignored_state = 0;
+list<Bindings*> Bindings::bindings; /* global. Gulp */
+list<ActionMap*> ActionMap::action_maps; /* global. Gulp */
+PBD::Signal1<void,Bindings*> Bindings::BindingsChanged;
-MouseButton::MouseButton (uint32_t state, uint32_t keycode)
+template <typename IteratorValueType>
+struct ActionNameRegistered
{
- uint32_t ignore = Bindings::ignored_state();
-
- if (gdk_keyval_is_upper (keycode) && gdk_keyval_is_lower (keycode)) {
- /* key is not subject to case, so ignore SHIFT
- */
- ignore |= GDK_SHIFT_MASK;
- }
+ ActionNameRegistered(std::string const& name)
+ : action_name(name)
+ {}
+
+ bool operator()(IteratorValueType elem) const {
+ return elem.second.action_name == action_name;
+ }
+ std::string const& action_name;
+};
- _val = (state & ~ignore);
- _val <<= 32;
- _val |= keycode;
+MouseButton::MouseButton (uint32_t state, uint32_t keycode)
+{
+ uint32_t ignore = ~Keyboard::RelevantModifierKeyMask;
+
+ /* this is a slightly wierd test that relies on
+ * gdk_keyval_is_{upper,lower}() returning true for keys that have no
+ * case-sensitivity. This covers mostly non-alphanumeric keys.
+ */
+
+ if (gdk_keyval_is_upper (keycode) && gdk_keyval_is_lower (keycode)) {
+ /* key is not subject to case, so ignore SHIFT
+ */
+ ignore |= GDK_SHIFT_MASK;
+ }
+
+ _val = (state & ~ignore);
+ _val <<= 32;
+ _val |= keycode;
};
bool
MouseButton::make_button (const string& str, MouseButton& b)
{
- int s = 0;
+ int s = 0;
- if (str.find ("Primary") != string::npos) {
- s |= Keyboard::PrimaryModifier;
- }
+ if (str.find ("Primary") != string::npos) {
+ s |= Keyboard::PrimaryModifier;
+ }
- if (str.find ("Secondary") != string::npos) {
- s |= Keyboard::SecondaryModifier;
- }
+ if (str.find ("Secondary") != string::npos) {
+ s |= Keyboard::SecondaryModifier;
+ }
- if (str.find ("Tertiary") != string::npos) {
- s |= Keyboard::TertiaryModifier;
- }
+ if (str.find ("Tertiary") != string::npos) {
+ s |= Keyboard::TertiaryModifier;
+ }
- if (str.find ("Level4") != string::npos) {
- s |= Keyboard::Level4Modifier;
- }
+ if (str.find ("Level4") != string::npos) {
+ s |= Keyboard::Level4Modifier;
+ }
- string::size_type lastmod = str.find_last_of ('-');
- uint32_t button_number;
+ string::size_type lastmod = str.find_last_of ('-');
+ uint32_t button_number;
- if (lastmod == string::npos) {
- button_number = PBD::atoi (str);
- } else {
- button_number = PBD::atoi (str.substr (lastmod+1));
- }
+ if (lastmod == string::npos) {
+ button_number = PBD::atoi (str);
+ } else {
+ button_number = PBD::atoi (str.substr (lastmod+1));
+ }
- b = MouseButton (s, button_number);
- return true;
+ b = MouseButton (s, button_number);
+ return true;
}
string
MouseButton::name () const
{
- int s = state();
-
- string str;
-
- if (s & Keyboard::PrimaryModifier) {
- str += "Primary";
- }
- if (s & Keyboard::SecondaryModifier) {
- if (!str.empty()) {
- str += '-';
- }
- str += "Secondary";
- }
- if (s & Keyboard::TertiaryModifier) {
- if (!str.empty()) {
- str += '-';
- }
- str += "Tertiary";
- }
- if (s & Keyboard::Level4Modifier) {
- if (!str.empty()) {
- str += '-';
- }
- str += "Level4";
- }
-
- if (!str.empty()) {
- str += '-';
- }
-
- char buf[16];
- snprintf (buf, sizeof (buf), "%u", button());
- str += buf;
-
- return str;
+ int s = state();
+
+ string str;
+
+ if (s & Keyboard::PrimaryModifier) {
+ str += "Primary";
+ }
+ if (s & Keyboard::SecondaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += "Secondary";
+ }
+ if (s & Keyboard::TertiaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += "Tertiary";
+ }
+ if (s & Keyboard::Level4Modifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += "Level4";
+ }
+
+ if (!str.empty()) {
+ str += '-';
+ }
+
+ char buf[16];
+ snprintf (buf, sizeof (buf), "%u", button());
+ str += buf;
+
+ return str;
}
+/*================================ KeyboardKey ================================*/
KeyboardKey::KeyboardKey (uint32_t state, uint32_t keycode)
{
- uint32_t ignore = Bindings::ignored_state();
+ uint32_t ignore = ~Keyboard::RelevantModifierKeyMask;
- if (gdk_keyval_is_upper (keycode) && gdk_keyval_is_lower (keycode)) {
- /* key is not subject to case, so ignore SHIFT
- */
- ignore |= GDK_SHIFT_MASK;
- }
+ _val = (state & ~ignore);
+ _val <<= 32;
+ _val |= keycode;
+}
- _val = (state & ~ignore);
- _val <<= 32;
- _val |= keycode;
-};
+string
+KeyboardKey::display_label () const
+{
+ if (key() == 0) {
+ return string();
+ }
+
+ /* This magically returns a string that will display the right thing
+ * on all platforms, notably the command key on OS X.
+ */
+ uint32_t mod = state();
+
+#ifdef __APPLE__
+ /* We use both bits (MOD2|META) for Primary on OS X,
+ * but we don't want MOD2 showing up in listings. So remove
+ * it and add back META.
+ */
+
+ if (mod & GDK_MOD2_MASK) {
+ mod = (mod & ~GDK_MOD2_MASK) | GDK_META_MASK;
+ }
+#endif
+
+
+ return gtk_accelerator_get_label (key(), (GdkModifierType) mod);
+}
string
KeyboardKey::name () const
{
- int s = state();
-
- string str;
-
- if (s & Keyboard::PrimaryModifier) {
- str += "Primary";
- }
- if (s & Keyboard::SecondaryModifier) {
- if (!str.empty()) {
- str += '-';
- }
- str += "Secondary";
- }
- if (s & Keyboard::TertiaryModifier) {
- if (!str.empty()) {
- str += '-';
- }
- str += "Tertiary";
- }
- if (s & Keyboard::Level4Modifier) {
- if (!str.empty()) {
- str += '-';
- }
- str += "Level4";
- }
-
- if (!str.empty()) {
- str += '-';
- }
-
- str += gdk_keyval_name (key());
-
- return str;
+ int s = state();
+
+ string str;
+
+ if (s & Keyboard::PrimaryModifier) {
+ str += "Primary";
+ }
+ if (s & Keyboard::SecondaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += "Secondary";
+ }
+ if (s & Keyboard::TertiaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += "Tertiary";
+ }
+ if (s & Keyboard::Level4Modifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += "Level4";
+ }
+
+ if (!str.empty()) {
+ str += '-';
+ }
+
+ char const *gdk_name = gdk_keyval_name (key());
+
+ if (gdk_name) {
+ str += gdk_name;
+ } else {
+ /* fail! */
+ return string();
+ }
+
+ return str;
+}
+
+string
+KeyboardKey::native_name () const
+{
+ int s = state();
+
+ string str;
+
+ if (s & Keyboard::PrimaryModifier) {
+ str += Keyboard::primary_modifier_name ();
+ }
+ if (s & Keyboard::SecondaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += Keyboard::secondary_modifier_name ();
+ }
+ if (s & Keyboard::TertiaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += Keyboard::tertiary_modifier_name ();
+ }
+ if (s & Keyboard::Level4Modifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += Keyboard::level4_modifier_name ();
+ }
+
+ if (!str.empty()) {
+ str += '-';
+ }
+
+ char const *gdk_name = gdk_keyval_name (key());
+
+ if (gdk_name) {
+ str += gdk_name;
+ } else {
+ /* fail! */
+ return string();
+ }
+
+ return str;
+}
+
+string
+KeyboardKey::native_short_name () const
+{
+ int s = state();
+
+ string str;
+
+ if (s & Keyboard::PrimaryModifier) {
+ str += Keyboard::primary_modifier_short_name ();
+ }
+ if (s & Keyboard::SecondaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += Keyboard::secondary_modifier_short_name ();
+ }
+ if (s & Keyboard::TertiaryModifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += Keyboard::tertiary_modifier_short_name ();
+ }
+ if (s & Keyboard::Level4Modifier) {
+ if (!str.empty()) {
+ str += '-';
+ }
+ str += Keyboard::level4_modifier_short_name ();
+ }
+
+ if (!str.empty()) {
+ str += '-';
+ }
+
+ char const *gdk_name = gdk_keyval_name (key());
+
+ if (gdk_name) {
+ str += gdk_name;
+ } else {
+ /* fail! */
+ return string();
+ }
+
+ return str;
}
bool
KeyboardKey::make_key (const string& str, KeyboardKey& k)
{
- int s = 0;
+ int s = 0;
+
+ if (str.find ("Primary") != string::npos) {
+ s |= Keyboard::PrimaryModifier;
+ }
+
+ if (str.find ("Secondary") != string::npos) {
+ s |= Keyboard::SecondaryModifier;
+ }
+
+ if (str.find ("Tertiary") != string::npos) {
+ s |= Keyboard::TertiaryModifier;
+ }
+
+ if (str.find ("Level4") != string::npos) {
+ s |= Keyboard::Level4Modifier;
+ }
+
+ /* since all SINGLE key events keycodes are changed to lower case
+ * before looking them up, make sure we only store lower case here. The
+ * Shift part will be stored in the modifier part of the KeyboardKey.
+ *
+ * And yes Mildred, this doesn't cover CapsLock cases. Oh well.
+ */
- if (str.find ("Primary") != string::npos) {
- s |= Keyboard::PrimaryModifier;
- }
+ string actual;
- if (str.find ("Secondary") != string::npos) {
- s |= Keyboard::SecondaryModifier;
- }
+ string::size_type lastmod = str.find_last_of ('-');
- if (str.find ("Tertiary") != string::npos) {
- s |= Keyboard::TertiaryModifier;
- }
+ if (lastmod != string::npos) {
+ actual = str.substr (lastmod+1);
+ }
+ else {
+ actual = str;
+ }
- if (str.find ("Level4") != string::npos) {
- s |= Keyboard::Level4Modifier;
- }
+ if (actual.size() == 1) {
+ actual = PBD::downcase (actual);
+ }
- string::size_type lastmod = str.find_last_of ('-');
- guint keyval;
+ guint keyval;
+ keyval = gdk_keyval_from_name (actual.c_str());
- if (lastmod == string::npos) {
- keyval = gdk_keyval_from_name (str.c_str());
- } else {
- keyval = gdk_keyval_from_name (str.substr (lastmod+1).c_str());
- }
+ if (keyval == GDK_VoidSymbol || keyval == 0) {
+ return false;
+ }
- if (keyval == GDK_VoidSymbol) {
- return false;
- }
+ k = KeyboardKey (s, keyval);
- k = KeyboardKey (s, keyval);
- return true;
+ return true;
}
-Bindings::Bindings ()
- : action_map (0)
+/*================================= Bindings =================================*/
+Bindings::Bindings (std::string const& name)
+ : _name (name)
+ , _action_map (0)
{
+ bindings.push_back (this);
}
Bindings::~Bindings()
{
+ bindings.remove (this);
+}
+
+string
+Bindings::ardour_action_name (RefPtr<Action> action)
+{
+ /* Skip "<Actions>/" */
+ return action->get_accel_path ().substr (10);
+}
+
+KeyboardKey
+Bindings::get_binding_for_action (RefPtr<Action> action, Operation& op)
+{
+ const string action_name = ardour_action_name (action);
+
+ for (KeybindingMap::iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+
+ /* option one: action has already been associated with the
+ * binding
+ */
+
+ if (k->second.action == action) {
+ return k->first;
+ }
+
+ /* option two: action name matches, so lookup the action,
+ * setup the association while we're here, and return the binding.
+ */
+
+ if (_action_map && k->second.action_name == action_name) {
+ k->second.action = _action_map->find_action (action_name);
+ return k->first;
+ }
+
+ }
+
+ for (KeybindingMap::iterator k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+
+ /* option one: action has already been associated with the
+ * binding
+ */
+
+ if (k->second.action == action) {
+ return k->first;
+ }
+
+ /* option two: action name matches, so lookup the action,
+ * setup the association while we're here, and return the binding.
+ */
+
+ if (_action_map && k->second.action_name == action_name) {
+ k->second.action = _action_map->find_action (action_name);
+ return k->first;
+ }
+
+ }
+
+ return KeyboardKey::null_key();
}
void
-Bindings::set_action_map (ActionMap& am)
+Bindings::set_action_map (ActionMap& actions)
+{
+ if (_action_map) {
+ _action_map->set_bindings (0);
+ }
+
+ _action_map = &actions;
+ _action_map->set_bindings (this);
+
+ dissociate ();
+ associate ();
+}
+
+bool
+Bindings::empty_keys() const
+{
+ return press_bindings.empty() && release_bindings.empty();
+}
+
+bool
+Bindings::empty_mouse () const
+{
+ return button_press_bindings.empty() && button_release_bindings.empty();
+}
+
+bool
+Bindings::empty() const
{
- action_map = &am;
- press_bindings.clear ();
- release_bindings.clear ();
+ return empty_keys() && empty_mouse ();
}
bool
Bindings::activate (KeyboardKey kb, Operation op)
{
- KeybindingMap* kbm = 0;
+ KeybindingMap& kbm = get_keymap (op);
+
+ /* if shift was pressed, GDK will send us (e.g) 'E' rather than 'e'.
+ Our bindings all use the lower case character/keyname, so switch
+ to the lower case before doing the lookup.
+ */
- switch (op) {
- case Press:
- kbm = &press_bindings;
- break;
- case Release:
- kbm = &release_bindings;
- break;
- }
+ KeyboardKey unshifted (kb.state(), gdk_keyval_to_lower (kb.key()));
- KeybindingMap::iterator k = kbm->find (kb);
+ KeybindingMap::iterator k = kbm.find (unshifted);
- if (k == kbm->end()) {
- /* no entry for this key in the state map */
- return false;
- }
+ if (k == kbm.end()) {
+ /* no entry for this key in the state map */
+ DEBUG_TRACE (DEBUG::Bindings, string_compose ("no binding for %1\n", unshifted));
+ return false;
+ }
- /* lets do it ... */
+ RefPtr<Action> action;
- k->second->activate ();
- return true;
+ if (k->second.action) {
+ action = k->second.action;
+ } else {
+ if (_action_map) {
+ action = _action_map->find_action (k->second.action_name);
+ }
+ }
+
+ if (action) {
+ /* lets do it ... */
+ DEBUG_TRACE (DEBUG::Bindings, string_compose ("binding for %1: %2\n", unshifted, k->second.action_name));
+ action->activate ();
+ }
+
+ /* return true even if the action could not be found */
+
+ return true;
}
void
-Bindings::add (KeyboardKey kb, Operation op, RefPtr<Action> what)
+Bindings::associate ()
{
- KeybindingMap* kbm = 0;
-
- switch (op) {
- case Press:
- kbm = &press_bindings;
- break;
- case Release:
- kbm = &release_bindings;
- break;
- }
-
- KeybindingMap::iterator k = kbm->find (kb);
+ KeybindingMap::iterator k;
+
+ if (!_action_map) {
+ return;
+ }
+
+ for (k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+ k->second.action = _action_map->find_action (k->second.action_name);
+ if (k->second.action) {
+ push_to_gtk (k->first, k->second.action);
+ } else {
+ cerr << _name << " didn't find " << k->second.action_name << " in " << _action_map->name() << endl;
+ }
+ }
+
+ for (k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+ k->second.action = _action_map->find_action (k->second.action_name);
+ /* no working support in GTK for release bindings */
+ }
+
+ MouseButtonBindingMap::iterator b;
+
+ for (b = button_press_bindings.begin(); b != button_press_bindings.end(); ++b) {
+ b->second.action = _action_map->find_action (b->second.action_name);
+ }
+
+ for (b = button_release_bindings.begin(); b != button_release_bindings.end(); ++b) {
+ b->second.action = _action_map->find_action (b->second.action_name);
+ }
+}
- if (k == kbm->end()) {
- pair<KeyboardKey,RefPtr<Action> > newpair (kb, what);
- kbm->insert (newpair);
- // cerr << "Bindings added " << kb.key() << " w/ " << kb.state() << " => " << what->get_name() << endl;
- } else {
- k->second = what;
- }
+void
+Bindings::dissociate ()
+{
+ KeybindingMap::iterator k;
+
+ for (k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+ k->second.action.clear ();
+ }
+ for (k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+ k->second.action.clear ();
+ }
}
void
-Bindings::remove (KeyboardKey kb, Operation op)
+Bindings::push_to_gtk (KeyboardKey kb, RefPtr<Action> what)
+{
+ /* GTK has the useful feature of showing key bindings for actions in
+ * menus. As of August 2015, we have no interest in trying to
+ * reimplement this functionality, so we will use it even though we no
+ * longer use GTK accelerators for handling key events. To do this, we
+ * need to make sure that there is a fully populated GTK AccelMap set
+ * up with all bindings/actions.
+ */
+
+ Gtk::AccelKey gtk_key;
+ bool entry_exists = Gtk::AccelMap::lookup_entry (what->get_accel_path(), gtk_key);
+
+ if (!entry_exists) {
+
+ /* there is a trick happening here. It turns out that
+ * gtk_accel_map_add_entry() performs no validation checks on
+ * the accelerator keyval. This means we can use it to define
+ * ANY accelerator, even if they violate GTK's rules
+ * (e.g. about not using navigation keys). This works ONLY when
+ * the entry in the GTK accelerator map has not already been
+ * added. The entries will be added by the GTK UIManager when
+ * building menus, so this code must be called before that
+ * happens.
+ */
+
+
+ int mod = kb.state();
+#ifdef __APPLE__
+ /* See comments in Keyboard::Keyboard about GTK handling of MOD2, META and the Command key.
+ *
+ * If we do not do this, GTK+ won't show the correct text for shortcuts in menus.
+ */
+
+ if (mod & GDK_MOD2_MASK) {
+ mod = mod | GDK_META_MASK;
+ }
+#endif
+
+ Gtk::AccelMap::add_entry (what->get_accel_path(), kb.key(), (Gdk::ModifierType) mod);
+ }
+}
+
+bool
+Bindings::replace (KeyboardKey kb, Operation op, string const & action_name, bool can_save)
{
- KeybindingMap* kbm = 0;
+ if (!_action_map) {
+ return false;
+ }
- switch (op) {
- case Press:
- kbm = &press_bindings;
- break;
- case Release:
- kbm = &release_bindings;
- break;
- }
+ if (is_registered(op, action_name)) {
+ remove (op, action_name, can_save);
+ }
- KeybindingMap::iterator k = kbm->find (kb);
+ /* XXX need a way to get the old group name */
+ add (kb, op, action_name, 0, can_save);
- if (k != kbm->end()) {
- kbm->erase (k);
- }
+ return true;
}
bool
+Bindings::add (KeyboardKey kb, Operation op, string const& action_name, XMLProperty const* group, bool can_save)
+{
+ if (is_registered (op, action_name)) {
+ return false;
+ }
+
+ KeybindingMap& kbm = get_keymap (op);
+ if (group) {
+ KeybindingMap::value_type new_pair = make_pair (kb, ActionInfo (action_name, group->value()));
+ (void) kbm.insert (new_pair).first;
+ } else {
+ KeybindingMap::value_type new_pair = make_pair (kb, ActionInfo (action_name));
+ (void) kbm.insert (new_pair).first;
+ }
+
+ if (can_save) {
+ Keyboard::keybindings_changed ();
+ }
+
+ BindingsChanged (this); /* EMIT SIGNAL */
+ return true;
+}
+
+bool
+Bindings::remove (Operation op, std::string const& action_name, bool can_save)
+{
+ bool erased_action = false;
+ KeybindingMap& kbm = get_keymap (op);
+ for (KeybindingMap::iterator k = kbm.begin(); k != kbm.end(); ++k) {
+ if (k->second.action_name == action_name) {
+ kbm.erase (k);
+ erased_action = true;
+ break;
+ }
+ }
+
+ if (!erased_action) {
+ return erased_action;
+ }
+
+ if (can_save) {
+ Keyboard::keybindings_changed ();
+ }
+
+ BindingsChanged (this); /* EMIT SIGNAL */
+ return erased_action;
+}
+
+
+bool
Bindings::activate (MouseButton bb, Operation op)
{
- MouseButtonBindingMap* bbm = 0;
+ MouseButtonBindingMap& bbm = get_mousemap(op);
- switch (op) {
- case Press:
- bbm = &button_press_bindings;
- break;
- case Release:
- bbm = &button_release_bindings;
- break;
- }
+ MouseButtonBindingMap::iterator b = bbm.find (bb);
- MouseButtonBindingMap::iterator b = bbm->find (bb);
+ if (b == bbm.end()) {
+ /* no entry for this key in the state map */
+ return false;
+ }
- if (b == bbm->end()) {
- /* no entry for this key in the state map */
- return false;
- }
+ RefPtr<Action> action;
- /* lets do it ... */
+ if (b->second.action) {
+ action = b->second.action;
+ } else {
+ if (_action_map) {
+ action = _action_map->find_action (b->second.action_name);
+ }
+ }
- b->second->activate ();
- return true;
+ if (action) {
+ /* lets do it ... */
+ DEBUG_TRACE (DEBUG::Bindings, string_compose ("activating action %1\n", ardour_action_name (action)));
+ action->activate ();
+ }
+
+ /* return true even if the action could not be found */
+
+ return true;
}
void
-Bindings::add (MouseButton bb, Operation op, RefPtr<Action> what)
+Bindings::add (MouseButton bb, Operation op, string const& action_name, XMLProperty const* /*group*/)
{
- MouseButtonBindingMap* bbm = 0;
+ MouseButtonBindingMap& bbm = get_mousemap(op);
- switch (op) {
- case Press:
- bbm = &button_press_bindings;
- break;
- case Release:
- bbm = &button_release_bindings;
- break;
- }
+ MouseButtonBindingMap::value_type newpair (bb, ActionInfo (action_name));
+ bbm.insert (newpair);
+}
- MouseButtonBindingMap::iterator b = bbm->find (bb);
+void
+Bindings::remove (MouseButton bb, Operation op)
+{
+ MouseButtonBindingMap& bbm = get_mousemap(op);
+ MouseButtonBindingMap::iterator b = bbm.find (bb);
- if (b == bbm->end()) {
- pair<MouseButton,RefPtr<Action> > newpair (bb, what);
- bbm->insert (newpair);
- // cerr << "Bindings added mouse button " << bb.button() << " w/ " << bb.state() << " => " << what->get_name() << endl;
- } else {
- b->second = what;
- }
+ if (b != bbm.end()) {
+ bbm.erase (b);
+ }
}
void
-Bindings::remove (MouseButton bb, Operation op)
+Bindings::save (XMLNode& root)
{
- MouseButtonBindingMap* bbm = 0;
+ XMLNode* presses = new XMLNode (X_("Press"));
+
+ for (KeybindingMap::iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+ XMLNode* child;
+
+ if (k->first.name().empty()) {
+ continue;
+ }
+
+ child = new XMLNode (X_("Binding"));
+ child->add_property (X_("key"), k->first.name());
+ child->add_property (X_("action"), k->second.action_name);
+ presses->add_child_nocopy (*child);
+ }
+
+ for (MouseButtonBindingMap::iterator k = button_press_bindings.begin(); k != button_press_bindings.end(); ++k) {
+ XMLNode* child;
+ child = new XMLNode (X_("Binding"));
+ child->add_property (X_("button"), k->first.name());
+ child->add_property (X_("action"), k->second.action_name);
+ presses->add_child_nocopy (*child);
+ }
+
+ XMLNode* releases = new XMLNode (X_("Release"));
+
+ for (KeybindingMap::iterator k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+ XMLNode* child;
+
+ if (k->first.name().empty()) {
+ continue;
+ }
+
+ child = new XMLNode (X_("Binding"));
+ child->add_property (X_("key"), k->first.name());
+ child->add_property (X_("action"), k->second.action_name);
+ releases->add_child_nocopy (*child);
+ }
+
+ for (MouseButtonBindingMap::iterator k = button_release_bindings.begin(); k != button_release_bindings.end(); ++k) {
+ XMLNode* child;
+ child = new XMLNode (X_("Binding"));
+ child->add_property (X_("button"), k->first.name());
+ child->add_property (X_("action"), k->second.action_name);
+ releases->add_child_nocopy (*child);
+ }
+
+ root.add_child_nocopy (*presses);
+ root.add_child_nocopy (*releases);
+}
+
+void
+Bindings::save_all_bindings_as_html (ostream& ostr)
+{
+ if (bindings.empty()) {
+ return;
+ }
+
+
+ ostr << "<html>\n<head>\n<title>";
+ ostr << PROGRAM_NAME;
+ ostr << "</title>\n";
- switch (op) {
- case Press:
- bbm = &button_press_bindings;
- break;
- case Release:
- bbm = &button_release_bindings;
- break;
- }
- MouseButtonBindingMap::iterator b = bbm->find (bb);
+ ostr << "<style>\n";
+ ostr << "\n\
+.key-name-even, .key-name-odd\n\
+{\n\
+ font-weight: bold;\n\
+}\n\
+\n\
+.key-action-odd, .key-action-even\n\
+{\n\
+ font-weight: normal;\n\
+ font-style: italic;\n\
+}";
+ ostr << "</style>\n";
+
+ ostr << "</head>\n<body>\n";
+
+ ostr << "<div class=\"container\">\n";
+
+ for (list<Bindings*>::const_iterator b = bindings.begin(); b != bindings.end(); ++b) {
+ (*b)->save_as_html (ostr);
+ }
+
+ ostr << "</div>\n";
+ ostr << "</body>\n";
+ ostr << "</html>\n";
+}
+
+void
+Bindings::save_as_html (ostream& ostr) const
+{
- if (b != bbm->end()) {
- bbm->erase (b);
- }
+ if (!press_bindings.empty()) {
+
+ ostr << "<div class=\"binding-set\">\n";
+ ostr << "<h1>";
+ ostr << name();
+ ostr << "</h1>\n\n";
+
+ /* first pass: separate by group */
+
+ typedef std::map<std::string, std::vector<KeybindingMap::const_iterator> > GroupMap;
+ GroupMap group_map;
+
+ for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+ if (k->first.name().empty()) {
+ continue;
+ }
+
+ string group_name;
+ if (!k->second.group_name.empty()) {
+ group_name = k->second.group_name;
+ } else {
+ group_name = X_("nogroup");
+ }
+
+ GroupMap::iterator gm = group_map.find (group_name);
+ if (gm == group_map.end()) {
+ std::vector<KeybindingMap::const_iterator> li;
+ li.push_back (k);
+ group_map.insert (make_pair (group_name,li));
+ } else {
+ gm->second.push_back (k);
+ }
+ }
+
+ for (GroupMap::const_iterator gm = group_map.begin(); gm != group_map.end(); ++gm) {
+
+ ostr << "<div class=\"group\">\n";
+ ostr << "<div class=\"group-name\">" << gm->first << "</div>\n";
+
+ for (vector<KeybindingMap::const_iterator>::const_iterator k = gm->second.begin(); k != gm->second.end(); ++k) {
+
+ if ((*k)->first.name().empty()) {
+ continue;
+ }
+
+ RefPtr<Action> action;
+
+ if ((*k)->second.action) {
+ action = (*k)->second.action;
+ } else {
+ if (_action_map) {
+ action = _action_map->find_action ((*k)->second.action_name);
+ }
+ }
+
+ if (!action) {
+ continue;
+ }
+
+ string key_name = (*k)->first.native_short_name ();
+ replace_all (key_name, X_("KP_"), X_("Numpad "));
+
+ string::size_type pos;
+
+ char const *targets[] = { X_("Separator"), X_("Add"), X_("Subtract"), X_("Decimal"), X_("Divide"),
+ X_("grave"), X_("comma"), X_("period"), X_("asterisk"), X_("backslash"),
+ X_("apostrophe"), X_("minus"), X_("plus"), X_("slash"), X_("semicolon"),
+ X_("colon"), X_("equal"), X_("bracketleft"), X_("bracketright"),
+ X_("ampersand"), X_("numbersign"), X_("parenleft"), X_("parenright"),
+ X_("quoteright"), X_("quoteleft"), X_("exclam"), X_("quotedbl"),
+ 0
+ };
+
+ char const *replacements[] = { X_("-"), X_("+"), X_("-"), X_("."), X_("/"),
+ X_("`"), X_(","), X_("."), X_("*"), X_("\\"),
+ X_("'"), X_("-"), X_("+"), X_("/"), X_(";"),
+ X_(":"), X_("="), X_("{"), X_("{"),
+ X_("&"), X_("#"), X_("("), X_(")"),
+ X_("`"), X_("'"), X_("!"), X_("\""),
+ };
+
+ for (size_t n = 0; targets[n]; ++n) {
+ if ((pos = key_name.find (targets[n])) != string::npos) {
+ key_name.replace (pos, strlen (targets[n]), replacements[n]);
+ }
+ }
+
+ ostr << "<div class=\"key\">" << key_name << "</div>";
+ ostr << "<div class=\"action\">" << action->get_label() << "</div>\n";
+ }
+ ostr << "</div>\n\n";
+ }
+
+ ostr << "</div>\n";
+ }
}
bool
-Bindings::save (const string& path)
+Bindings::load (XMLNode const& node)
{
- XMLTree tree;
- XMLNode* root = new XMLNode (X_("Bindings"));
- tree.set_root (root);
+ const XMLNodeList& children (node.children());
- save (*root);
+ press_bindings.clear ();
+ release_bindings.clear ();
- if (!tree.write (path)) {
- ::g_unlink (path.c_str());
- return false;
- }
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ /* each node could be Press or Release */
+ load_operation (**i);
+ }
- return true;
+ return true;
}
void
-Bindings::save (XMLNode& root)
+Bindings::load_operation (XMLNode const& node)
+{
+ if (node.name() == X_("Press") || node.name() == X_("Release")) {
+
+ Operation op;
+
+ if (node.name() == X_("Press")) {
+ op = Press;
+ } else {
+ op = Release;
+ }
+
+ const XMLNodeList& children (node.children());
+
+ for (XMLNodeList::const_iterator p = children.begin(); p != children.end(); ++p) {
+
+ XMLProperty const * ap;
+ XMLProperty const * kp;
+ XMLProperty const * bp;
+ XMLProperty const * gp;
+ XMLNode const * child = *p;
+
+ ap = child->property ("action");
+ kp = child->property ("key");
+ bp = child->property ("button");
+ gp = child->property ("group");
+
+ if (!ap || (!kp && !bp)) {
+ continue;
+ }
+
+ if (kp) {
+ KeyboardKey k;
+ if (!KeyboardKey::make_key (kp->value(), k)) {
+ continue;
+ }
+ add (k, op, ap->value(), gp);
+ } else {
+ MouseButton b;
+ if (!MouseButton::make_button (bp->value(), b)) {
+ continue;
+ }
+ add (b, op, ap->value(), gp);
+ }
+ }
+ }
+}
+
+void
+Bindings::get_all_actions (std::vector<std::string>& paths,
+ std::vector<std::string>& labels,
+ std::vector<std::string>& tooltips,
+ std::vector<std::string>& keys,
+ std::vector<RefPtr<Action> >& actions)
{
- XMLNode* presses = new XMLNode (X_("Press"));
- root.add_child_nocopy (*presses);
-
- for (KeybindingMap::iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
- XMLNode* child;
- child = new XMLNode (X_("Binding"));
- child->add_property (X_("key"), k->first.name());
- string ap = k->second->get_accel_path();
- child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
- presses->add_child_nocopy (*child);
- }
-
- for (MouseButtonBindingMap::iterator k = button_press_bindings.begin(); k != button_press_bindings.end(); ++k) {
- XMLNode* child;
- child = new XMLNode (X_("Binding"));
- child->add_property (X_("button"), k->first.name());
- string ap = k->second->get_accel_path();
- child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
- presses->add_child_nocopy (*child);
- }
-
- XMLNode* releases = new XMLNode (X_("Release"));
- root.add_child_nocopy (*releases);
-
- for (KeybindingMap::iterator k = release_bindings.begin(); k != release_bindings.end(); ++k) {
- XMLNode* child;
- child = new XMLNode (X_("Binding"));
- child->add_property (X_("key"), k->first.name());
- string ap = k->second->get_accel_path();
- child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
- releases->add_child_nocopy (*child);
- }
-
- for (MouseButtonBindingMap::iterator k = button_release_bindings.begin(); k != button_release_bindings.end(); ++k) {
- XMLNode* child;
- child = new XMLNode (X_("Binding"));
- child->add_property (X_("button"), k->first.name());
- string ap = k->second->get_accel_path();
- child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
- releases->add_child_nocopy (*child);
- }
+ if (!_action_map) {
+ return;
+ }
+
+ /* build a reverse map from actions to bindings */
+
+ typedef map<Glib::RefPtr<Gtk::Action>,KeyboardKey> ReverseMap;
+ ReverseMap rmap;
+
+ for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+ rmap.insert (make_pair (k->second.action, k->first));
+ }
+
+ /* get a list of all actions */
+
+ ActionMap::Actions all_actions;
+ _action_map->get_actions (all_actions);
+ for (ActionMap::Actions::const_iterator act = all_actions.begin(); act != all_actions.end(); ++act) {
+
+ paths.push_back ((*act)->get_accel_path());
+ labels.push_back ((*act)->get_label());
+ tooltips.push_back ((*act)->get_tooltip());
+
+ ReverseMap::iterator r = rmap.find (*act);
+
+ if (r != rmap.end()) {
+ keys.push_back (r->second.display_label());
+ } else {
+ keys.push_back (string());
+ }
+
+ actions.push_back (*act);
+ }
+}
+
+Bindings*
+Bindings::get_bindings (string const& name, ActionMap& map)
+{
+ for (list<Bindings*>::iterator b = bindings.begin(); b != bindings.end(); b++) {
+ if ((*b)->name() == name) {
+ (*b)->set_action_map (map);
+ return *b;
+ }
+ }
+
+ return 0;
+}
+
+void
+Bindings::associate_all ()
+{
+ for (list<Bindings*>::iterator b = bindings.begin(); b != bindings.end(); b++) {
+ (*b)->associate ();
+ }
}
bool
-Bindings::load (const string& path)
+Bindings::is_bound (KeyboardKey const& kb, Operation op) const
{
- XMLTree tree;
+ const KeybindingMap& km = get_keymap(op);
+ return km.find(kb) != km.end();
+}
- if (!action_map) {
- return false;
- }
+bool
+Bindings::is_registered (Operation op, std::string const& action_name) const
+{
+ const KeybindingMap& km = get_keymap(op);
+ return std::find_if(km.begin(), km.end(), ActionNameRegistered<KeybindingMap::const_iterator::value_type>(action_name)) != km.end();
+}
+
+Bindings::KeybindingMap&
+Bindings::get_keymap (Operation op)
+{
+ switch (op) {
+ case Press:
+ return press_bindings;
+ case Release:
+ default:
+ return release_bindings;
+ }
+}
- if (!tree.read (path)) {
- return false;
- }
+const Bindings::KeybindingMap&
+Bindings::get_keymap (Operation op) const
+{
+ switch (op) {
+ case Press:
+ return press_bindings;
+ case Release:
+ default:
+ return release_bindings;
+ }
+}
+
+Bindings::MouseButtonBindingMap&
+Bindings::get_mousemap (Operation op)
+{
+ switch (op) {
+ case Press:
+ return button_press_bindings;
+ case Release:
+ default:
+ return button_release_bindings;
+ }
+}
- press_bindings.clear ();
- release_bindings.clear ();
+/*==========================================ACTION MAP =========================================*/
- XMLNode& root (*tree.root());
- const XMLNodeList& children (root.children());
+ActionMap::ActionMap (string const & name)
+ : _name (name)
+ , _bindings (0)
+{
+ action_maps.push_back (this);
+}
- for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
- load (**i);
- }
+ActionMap::~ActionMap ()
+{
+ action_maps.remove (this);
+}
- return true;
+void
+ActionMap::set_bindings (Bindings* b)
+{
+ _bindings = b;
}
void
-Bindings::load (const XMLNode& node)
-{
- if (node.name() == X_("Press") || node.name() == X_("Release")) {
-
- Operation op;
-
- if (node.name() == X_("Press")) {
- op = Press;
- } else {
- op = Release;
- }
-
- const XMLNodeList& children (node.children());
-
- for (XMLNodeList::const_iterator p = children.begin(); p != children.end(); ++p) {
-
- XMLProperty* ap;
- XMLProperty* kp;
- XMLProperty* bp;
-
- ap = (*p)->property ("action");
- kp = (*p)->property ("key");
- bp = (*p)->property ("button");
-
- if (!ap || (!kp && !bp)) {
- continue;
- }
-
- RefPtr<Action> act;
-
- if (action_map) {
- act = action_map->find_action (ap->value());
- }
-
- if (!act) {
- string::size_type slash = ap->value().find ('/');
- if (slash != string::npos) {
- string group = ap->value().substr (0, slash);
- string action = ap->value().substr (slash+1);
- act = ActionManager::get_action (group.c_str(), action.c_str());
- }
- }
-
- if (!act) {
- continue;
- }
-
- if (kp) {
- KeyboardKey k;
- if (!KeyboardKey::make_key (kp->value(), k)) {
- continue;
- }
- add (k, op, act);
- } else {
- MouseButton b;
- if (!MouseButton::make_button (bp->value(), b)) {
- continue;
- }
- add (b, op, act);
- }
- }
- }
+ActionMap::get_actions (ActionMap::Actions& acts)
+{
+ for (_ActionMap::iterator a = _actions.begin(); a != _actions.end(); ++a) {
+ acts.push_back (a->second);
+ }
}
RefPtr<Action>
ActionMap::find_action (const string& name)
{
- _ActionMap::iterator a = actions.find (name);
+ _ActionMap::iterator a = _actions.find (name);
+
+ if (a != _actions.end()) {
+ return a->second;
+ }
+
+ return RefPtr<Action>();
+}
+
+RefPtr<ActionGroup>
+ActionMap::create_action_group (const string& name)
+{
+ RefPtr<ActionGroup> g = ActionGroup::create (name);
- if (a != actions.end()) {
- return a->second;
- }
+ /* this is one of the places where our own Action management code
+ has to touch the GTK one, because we want the GtkUIManager to
+ be able to create widgets (particularly Menus) from our actions.
- return RefPtr<Action>();
+ This is a a necessary step for that to happen.
+ */
+
+ if (g) {
+ ActionManager::ui_manager->insert_action_group (g);
+ }
+
+ return g;
+}
+
+RefPtr<Action>
+ActionMap::register_action (RefPtr<ActionGroup> group, const char* name, const char* label)
+{
+ string fullpath;
+
+ RefPtr<Action> act = Action::create (name, label);
+
+ fullpath = group->get_name();
+ fullpath += '/';
+ fullpath += name;
+
+ if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act);
+ return act;
+ }
+
+ /* already registered */
+ return RefPtr<Action> ();
}
RefPtr<Action>
-ActionMap::register_action (const char* path,
+ActionMap::register_action (RefPtr<ActionGroup> group,
const char* name, const char* label, sigc::slot<void> sl)
{
- string fullpath;
+ string fullpath;
- RefPtr<Action> act = Action::create (name, label);
+ RefPtr<Action> act = Action::create (name, label);
- act->signal_activate().connect (sl);
+ fullpath = group->get_name();
+ fullpath += '/';
+ fullpath += name;
- fullpath = path;
- fullpath += '/';
- fullpath += name;
+ if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sl);
+ return act;
+ }
- actions.insert (_ActionMap::value_type (fullpath, act));
- return act;
+ /* already registered */
+ return RefPtr<Action>();
}
RefPtr<Action>
-ActionMap::register_radio_action (const char* path, Gtk::RadioAction::Group& rgroup,
+ActionMap::register_radio_action (RefPtr<ActionGroup> group,
+ Gtk::RadioAction::Group& rgroup,
+ const char* name, const char* label,
+ sigc::slot<void> sl)
+{
+ string fullpath;
+
+ RefPtr<Action> act = RadioAction::create (rgroup, name, label);
+ RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
+
+ fullpath = group->get_name();
+ fullpath += '/';
+ fullpath += name;
+
+ if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sl);
+ return act;
+ }
+
+ /* already registered */
+ return RefPtr<Action>();
+}
+
+RefPtr<Action>
+ActionMap::register_radio_action (RefPtr<ActionGroup> group,
+ Gtk::RadioAction::Group& rgroup,
const char* name, const char* label,
sigc::slot<void,GtkAction*> sl,
int value)
{
- string fullpath;
+ string fullpath;
+
+ RefPtr<Action> act = RadioAction::create (rgroup, name, label);
+ RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
+ ract->property_value() = value;
- RefPtr<Action> act = RadioAction::create (rgroup, name, label);
- RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
- ract->property_value() = value;
+ fullpath = group->get_name();
+ fullpath += '/';
+ fullpath += name;
- act->signal_activate().connect (sigc::bind (sl, act->gobj()));
+ if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sigc::bind (sl, act->gobj()));
+ return act;
+ }
- fullpath = path;
- fullpath += '/';
- fullpath += name;
+ /* already registered */
- actions.insert (_ActionMap::value_type (fullpath, act));
- return act;
+ return RefPtr<Action>();
}
RefPtr<Action>
-ActionMap::register_toggle_action (const char* path,
+ActionMap::register_toggle_action (RefPtr<ActionGroup> group,
const char* name, const char* label, sigc::slot<void> sl)
{
- string fullpath;
+ string fullpath;
+
+ fullpath = group->get_name();
+ fullpath += '/';
+ fullpath += name;
- RefPtr<Action> act = ToggleAction::create (name, label);
+ RefPtr<Action> act = ToggleAction::create (name, label);
- act->signal_activate().connect (sl);
+ if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sl);
+ return act;
+ }
- fullpath = path;
- fullpath += '/';
- fullpath += name;
+ /* already registered */
+ return RefPtr<Action>();
+}
+
+void
+ActionMap::get_all_actions (std::vector<std::string>& paths,
+ std::vector<std::string>& labels,
+ std::vector<std::string>& tooltips,
+ std::vector<std::string>& keys,
+ std::vector<RefPtr<Action> >& actions)
+{
+ for (list<ActionMap*>::const_iterator map = action_maps.begin(); map != action_maps.end(); ++map) {
+
+ ActionMap::Actions these_actions;
+ (*map)->get_actions (these_actions);
+
+ for (ActionMap::Actions::const_iterator act = these_actions.begin(); act != these_actions.end(); ++act) {
+
+ paths.push_back ((*act)->get_accel_path());
+ labels.push_back ((*act)->get_label());
+ tooltips.push_back ((*act)->get_tooltip());
+ actions.push_back (*act);
+
+ Bindings* bindings = (*map)->bindings();
+
+ if (bindings) {
+
+ KeyboardKey key;
+ Bindings::Operation op;
+
+ key = bindings->get_binding_for_action (*act, op);
+
+ if (key == KeyboardKey::null_key()) {
+ keys.push_back (string());
+ } else {
+ keys.push_back (key.display_label());
+ }
+ } else {
+ keys.push_back (string());
+ }
+ }
+
+ these_actions.clear ();
+ }
+}
- actions.insert (_ActionMap::value_type (fullpath, act));
- return act;
+std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k) {
+ char const *gdk_name = gdk_keyval_name (k.key());
+ return out << "Key " << k.key() << " (" << (gdk_name ? gdk_name : "no-key") << ") state " << hex << k.state() << dec;
}
diff --git a/libs/gtkmm2ext/cairo_icon.cc b/libs/gtkmm2ext/cairo_icon.cc
new file mode 100644
index 0000000..11b3726
--- /dev/null
+++ b/libs/gtkmm2ext/cairo_icon.cc
@@ -0,0 +1,115 @@
+/*
+ Copyright (C) 2015 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG
+#define OPTIONAL_CAIRO_IMAGE_SURFACE
+#endif
+
+
+#include "gtkmm2ext/cairo_icon.h"
+#include "gtkmm2ext/gtk_ui.h"
+
+using namespace Gtkmm2ext;
+
+CairoIcon::CairoIcon (ArdourIcon::Icon t, uint32_t foreground_color)
+ : icon_type (t)
+ , fg (foreground_color)
+{
+ add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+}
+
+CairoIcon::~CairoIcon ()
+{
+}
+
+void
+CairoIcon::set_fg (uint32_t color)
+{
+ fg = color;
+ queue_draw ();
+}
+
+void
+CairoIcon::render (cairo_t* cr , cairo_rectangle_t* area)
+{
+ const double scale = UI::instance()->ui_scale;
+ int width = get_width() * scale;
+ int height = get_height () * scale;
+
+ ArdourIcon::render (cr, icon_type, width, height, Off, fg);
+}
+
+bool
+CairoIcon::on_expose_event (GdkEventExpose *ev)
+{
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+ Cairo::RefPtr<Cairo::Context> cr;
+ if (getenv("ARDOUR_IMAGE_SURFACE")) {
+ if (!image_surface) {
+ image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
+ }
+ cr = Cairo::Context::create (image_surface);
+ } else {
+ cr = get_window()->create_cairo_context ();
+ }
+#elif defined USE_CAIRO_IMAGE_SURFACE
+
+ if (!image_surface) {
+ image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
+ }
+
+ Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create (image_surface);
+#else
+ Cairo::RefPtr<Cairo::Context> cr = get_window()->create_cairo_context ();
+#endif
+
+ cr->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ cr->clip ();
+
+ cr->translate (ev->area.x, ev->area.y);
+
+ cairo_rectangle_t expose_area;
+ expose_area.x = ev->area.x;
+ expose_area.y = ev->area.y;
+ expose_area.width = ev->area.width;
+ expose_area.height = ev->area.height;
+
+ CairoIcon::render (cr->cobj(), &expose_area);
+
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+ if (getenv("ARDOUR_IMAGE_SURFACE")) {
+#endif
+#if defined USE_CAIRO_IMAGE_SURFACE || defined OPTIONAL_CAIRO_IMAGE_SURFACE
+ image_surface->flush();
+ /* now blit our private surface back to the GDK one */
+
+ Cairo::RefPtr<Cairo::Context> cairo_context = get_window()->create_cairo_context ();
+
+ cairo_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ cairo_context->clip ();
+ cairo_context->set_source (image_surface, 0, 0);
+ cairo_context->set_operator (Cairo::OPERATOR_SOURCE);
+ cairo_context->paint ();
+#endif
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+ }
+#endif
+
+ return true;
+}
diff --git a/libs/gtkmm2ext/cairo_widget.cc b/libs/gtkmm2ext/cairo_widget.cc
index 0f34a3f..8349a68 100644
--- a/libs/gtkmm2ext/cairo_widget.cc
+++ b/libs/gtkmm2ext/cairo_widget.cc
@@ -23,15 +23,14 @@
#include "gtkmm2ext/cairo_widget.h"
#include "gtkmm2ext/gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
static const char* has_cairo_widget_background_info = "has_cairo_widget_background_info";
bool CairoWidget::_flat_buttons = false;
bool CairoWidget::_widget_prelight = true;
-static void noop() { }
-sigc::slot<void> CairoWidget::focus_handler (sigc::ptr_fun (noop));
+sigc::slot<void,Gtk::Widget*> CairoWidget::focus_handler;
void CairoWidget::set_source_rgb_a( cairo_t* cr, Gdk::Color col, float a) //ToDo: this one and the Canvas version should be in a shared file (?)
{
@@ -61,7 +60,7 @@ CairoWidget::~CairoWidget ()
bool
CairoWidget::on_button_press_event (GdkEventButton*)
{
- focus_handler();
+ focus_handler (this);
return false;
}
@@ -183,15 +182,21 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
#endif
cr->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
- cr->clip_preserve ();
- /* paint expose area the color of the parent window bg
- */
+ if (_need_bg) {
+ cr->clip_preserve ();
+
+ /* paint expose area the color of the parent window bg
+ */
- Gdk::Color bg (get_parent_bg());
+ Gdk::Color bg (get_parent_bg());
- cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
- cr->fill ();
+ cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
+ cr->fill ();
+ } else {
+ std::cerr << get_name() << " skipped bg fill\n";
+ cr->clip ();
+ }
cairo_rectangle_t expose_area;
expose_area.x = ev->area.x;
@@ -388,7 +393,7 @@ CairoWidget::set_widget_prelight (bool yn)
}
void
-CairoWidget::set_focus_handler (sigc::slot<void> s)
+CairoWidget::set_focus_handler (sigc::slot<void,Gtk::Widget*> s)
{
focus_handler = s;
}
diff --git a/libs/gtkmm2ext/cairocell.cc b/libs/gtkmm2ext/cairocell.cc
index 4de898c..7ce7735 100644
--- a/libs/gtkmm2ext/cairocell.cc
+++ b/libs/gtkmm2ext/cairocell.cc
@@ -79,6 +79,10 @@ CairoFontDescription::CairoFontDescription (Pango::FontDescription& fd)
_weight = Cairo::FONT_WEIGHT_BOLD;
break;
+ /* to silence warnings when compiling with newer pango versions. */
+ default:
+ _weight = Cairo::FONT_WEIGHT_NORMAL;
+ break;
}
face = fd.get_family();
diff --git a/libs/gtkmm2ext/cursors.cc b/libs/gtkmm2ext/cursors.cc
index f886283..2ac0dba 100644
--- a/libs/gtkmm2ext/cursors.cc
+++ b/libs/gtkmm2ext/cursors.cc
@@ -25,7 +25,7 @@
#include "gtkmm2ext/cursors.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
diff --git a/libs/gtkmm2ext/dndtreeview.cc b/libs/gtkmm2ext/dndtreeview.cc
index bc6745d..4686702 100644
--- a/libs/gtkmm2ext/dndtreeview.cc
+++ b/libs/gtkmm2ext/dndtreeview.cc
@@ -141,5 +141,3 @@ DnDTreeViewBase::on_drag_drop(const Glib::RefPtr<Gdk::DragContext>& context, int
drag_data.source = 0;
return TreeView::on_drag_drop (context, x, y, time);
}
-
-
diff --git a/libs/gtkmm2ext/emscale.cc b/libs/gtkmm2ext/emscale.cc
index 5d28218..6d4697f 100644
--- a/libs/gtkmm2ext/emscale.cc
+++ b/libs/gtkmm2ext/emscale.cc
@@ -22,7 +22,7 @@
#include "gtkmm2ext/emscale.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
diff --git a/libs/gtkmm2ext/fader.cc b/libs/gtkmm2ext/fader.cc
index 9a2f5a2..f6fe487 100644
--- a/libs/gtkmm2ext/fader.cc
+++ b/libs/gtkmm2ext/fader.cc
@@ -240,7 +240,7 @@ Fader::on_size_allocate (Gtk::Allocation& alloc)
bool
Fader::on_button_press_event (GdkEventButton* ev)
{
- focus_handler();
+ focus_handler(this);
if (_read_only) {
return false;
diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc
index c144a96..f392891 100644
--- a/libs/gtkmm2ext/fastmeter.cc
+++ b/libs/gtkmm2ext/fastmeter.cc
@@ -731,7 +731,7 @@ FastMeter::set (float lvl, float peak)
Glib::RefPtr<Gdk::Window> win;
- if ((win = get_window()) == 0) {
+ if (! (win = get_window())) {
queue_draw ();
return;
}
diff --git a/libs/gtkmm2ext/focus_entry.cc b/libs/gtkmm2ext/focus_entry.cc
index a005fcf..1e2823a 100644
--- a/libs/gtkmm2ext/focus_entry.cc
+++ b/libs/gtkmm2ext/focus_entry.cc
@@ -22,8 +22,8 @@
using namespace Gtkmm2ext;
FocusEntry::FocusEntry ()
+ : next_release_selects (false)
{
- next_release_selects = false;
}
bool
diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc
index b550b6c..c96c31b 100644
--- a/libs/gtkmm2ext/gtk_ui.cc
+++ b/libs/gtkmm2ext/gtk_ui.cc
@@ -35,6 +35,7 @@
#include "pbd/replace_all.h"
#include "gtkmm2ext/application.h"
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/gtk_ui.h"
#include "gtkmm2ext/textviewer.h"
#include "gtkmm2ext/popup.h"
@@ -45,7 +46,7 @@
#include "gtkmm2ext/actions.h"
#include "gtkmm2ext/gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace Gtk;
@@ -53,7 +54,8 @@ using namespace Glib;
using namespace PBD;
using std::map;
-UI *UI::theGtkUI = 0;
+UI* UI::theGtkUI = 0;
+float UI::ui_scale = 1.0;
BaseUI::RequestType Gtkmm2ext::NullMessage = BaseUI::new_request_type();
BaseUI::RequestType Gtkmm2ext::ErrorMessage = BaseUI::new_request_type();
@@ -70,8 +72,8 @@ template class AbstractUI<Gtkmm2ext::UIRequest>;
UI::UI (string application_name, string thread_name, int *argc, char ***argv)
: AbstractUI<UIRequest> (thread_name)
, _receiver (*this)
+ , global_bindings (0)
, errors (0)
-
{
theMain = new Main (argc, argv);
@@ -364,10 +366,22 @@ UI::set_tip (Widget *w, const gchar *tip, const gchar *hlp)
}
if (action) {
- Gtk::AccelKey key;
- ustring ap = action->get_accel_path();
- if (!ap.empty()) {
- string shortcut = ActionManager::get_key_representation (ap, key);
+ Bindings* bindings = (Bindings*) w->get_data ("ardour-bindings");
+ if (!bindings) {
+ Gtk::Window* win = (Gtk::Window*) w->get_toplevel();
+ if (win) {
+ bindings = (Bindings*) win->get_data ("ardour-bindings");
+ }
+ }
+
+ if (!bindings) {
+ bindings = global_bindings;
+ }
+
+ if (bindings) {
+ Bindings::Operation op;
+ KeyboardKey kb = bindings->get_binding_for_action (action, op);
+ string shortcut = kb.display_label ();
if (!shortcut.empty()) {
replace_all (shortcut, "<", "");
replace_all (shortcut, ">", "-");
@@ -714,7 +728,7 @@ UI::popup_error (const string& text)
}
void
-UI::flush_pending ()
+UI::flush_pending (float timeout)
{
if (!caller_is_ui_thread()) {
error << "non-UI threads cannot call UI::flush_pending()"
@@ -722,9 +736,15 @@ UI::flush_pending ()
return;
}
+ int64_t end = g_get_monotonic_time () + timeout * 1e6;
+
gtk_main_iteration();
while (gtk_events_pending()) {
+ if (timeout > 0 && end < g_get_monotonic_time ()) {
+ cerr << "UI::flush_pending timed out after " << timeout << "s.\n";
+ break;
+ }
gtk_main_iteration();
}
}
diff --git a/libs/gtkmm2ext/gtkmm2ext/actions.h b/libs/gtkmm2ext/gtkmm2ext/actions.h
index b03e351..88b9628 100644
--- a/libs/gtkmm2ext/gtkmm2ext/actions.h
+++ b/libs/gtkmm2ext/gtkmm2ext/actions.h
@@ -45,50 +45,10 @@ namespace ActionManager {
LIBGTKMM2EXT_API extern Gtk::Widget* get_widget (const char * name);
LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> get_action (const char* group, const char* name);
LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> get_action (const char* path);
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> get_action_from_name (const char* name);
+
LIBGTKMM2EXT_API extern void do_action (const char* group, const char* name);
LIBGTKMM2EXT_API extern void set_toggle_action (const char* group, const char* name, bool);
- LIBGTKMM2EXT_API extern void add_action_group (Glib::RefPtr<Gtk::ActionGroup>);
- LIBGTKMM2EXT_API extern void enable_accelerators ();
-
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
- const char * name, const char * label);
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
- const char * name, const char * label, sigc::slot<void> sl,
- guint key, Gdk::ModifierType mods);
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
- const char * name, const char * label, sigc::slot<void> sl);
-
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&,
- const char * name, const char * label, sigc::slot<void> sl,
- guint key, Gdk::ModifierType mods);
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&,
- const char * name, const char * label, sigc::slot<void> sl);
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&,
- std::string const &, std::string const &, std::string const &, sigc::slot<void> sl);
-
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
- const char * name, const char * label, sigc::slot<void> sl,
- guint key, Gdk::ModifierType mods);
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
- std::string const &, std::string const &, std::string const &, sigc::slot<void> sl);
- LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
- const char * name, const char * label, sigc::slot<void> sl);
-
- LIBGTKMM2EXT_API extern bool lookup_entry (const Glib::ustring accel_path, Gtk::AccelKey& key);
-
- LIBGTKMM2EXT_API extern void get_all_actions (std::vector<std::string>& names,
- std::vector<std::string>& paths,
- std::vector<std::string>& tooltips,
- std::vector<std::string>& keys,
- std::vector<Gtk::AccelKey>& bindings);
-
- LIBGTKMM2EXT_API extern void get_all_actions (std::vector<std::string>& groups,
- std::vector<std::string>& paths,
- std::vector<std::string>& tooltips,
- std::vector<Gtk::AccelKey>& bindings);
-
LIBGTKMM2EXT_API extern void check_toggleaction (std::string);
LIBGTKMM2EXT_API extern void uncheck_toggleaction (std::string);
LIBGTKMM2EXT_API extern void set_toggleaction_state (std::string, bool);
diff --git a/libs/gtkmm2ext/gtkmm2ext/bindings.h b/libs/gtkmm2ext/gtkmm2ext/bindings.h
index 5277fd7..d216e04 100644
--- a/libs/gtkmm2ext/gtkmm2ext/bindings.h
+++ b/libs/gtkmm2ext/gtkmm2ext/bindings.h
@@ -2,136 +2,242 @@
#define __libgtkmm2ext_bindings_h__
#include <map>
+#include <vector>
+#include <list>
+
#include <stdint.h>
+
#include <gdk/gdkkeysyms.h>
#include <gtkmm/action.h>
-#include <gtkmm/action.h>
#include <gtkmm/radioaction.h>
#include <gtkmm/toggleaction.h>
+#include "pbd/signals.h"
+
#include "gtkmm2ext/visibility.h"
class XMLNode;
+class XMLProperty;
namespace Gtkmm2ext {
class LIBGTKMM2EXT_API KeyboardKey
{
public:
- KeyboardKey () {
- _val = GDK_VoidSymbol;
- }
+ KeyboardKey () {
+ _val = GDK_VoidSymbol;
+ }
+
+ KeyboardKey (uint32_t state, uint32_t keycode);
+
+ static KeyboardKey null_key() { return KeyboardKey (0, 0); }
- KeyboardKey (uint32_t state, uint32_t keycode);
+ uint32_t state() const { return _val >> 32; }
+ uint32_t key() const { return _val & 0xffff; }
- uint32_t state() const { return _val >> 32; }
- uint32_t key() const { return _val & 0xffff; }
+ bool operator<(const KeyboardKey& other) const {
+ return _val < other._val;
+ }
- bool operator<(const KeyboardKey& other) const {
- return _val < other._val;
- }
+ bool operator==(const KeyboardKey& other) const {
+ return _val == other._val;
+ }
- bool operator==(const KeyboardKey& other) const {
- return _val == other._val;
- }
+ std::string name() const;
+ std::string native_name() const;
+ std::string native_short_name() const;
+ static bool make_key (const std::string&, KeyboardKey&);
- std::string name() const;
- static bool make_key (const std::string&, KeyboardKey&);
+ std::string display_label() const;
private:
- uint64_t _val;
+ uint64_t _val;
};
class LIBGTKMM2EXT_API MouseButton {
public:
- MouseButton () {
- _val = ~0ULL;
- }
+ MouseButton () {
+ _val = ~0ULL;
+ }
- MouseButton (uint32_t state, uint32_t button_number);
- uint32_t state() const { return _val >> 32; }
- uint32_t button() const { return _val & 0xffff; }
+ MouseButton (uint32_t state, uint32_t button_number);
+ uint32_t state() const { return _val >> 32; }
+ uint32_t button() const { return _val & 0xffff; }
- bool operator<(const MouseButton& other) const {
- return _val < other._val;
- }
+ bool operator<(const MouseButton& other) const {
+ return _val < other._val;
+ }
- bool operator==(const MouseButton& other) const {
- return _val == other._val;
- }
+ bool operator==(const MouseButton& other) const {
+ return _val == other._val;
+ }
- std::string name() const;
- static bool make_button (const std::string&, MouseButton&);
+ std::string name() const;
+ static bool make_button (const std::string&, MouseButton&);
private:
- uint64_t _val;
+ uint64_t _val;
};
+class LIBGTKMM2EXT_API Bindings;
+
class LIBGTKMM2EXT_API ActionMap {
public:
- ActionMap() {}
- ~ActionMap() {}
+ ActionMap (std::string const& name);
+ ~ActionMap();
- Glib::RefPtr<Gtk::Action> register_action (const char* path,
- const char* name, const char* label, sigc::slot<void> sl);
- Glib::RefPtr<Gtk::Action> register_radio_action (const char* path, Gtk::RadioAction::Group&,
- const char* name, const char* label,
- sigc::slot<void,GtkAction*> sl,
- int value);
- Glib::RefPtr<Gtk::Action> register_toggle_action (const char*path,
- const char* name, const char* label, sigc::slot<void> sl);
+ std::string name() const { return _name; }
- Glib::RefPtr<Gtk::Action> find_action (const std::string& name);
+ Glib::RefPtr<Gtk::ActionGroup> create_action_group (const std::string& group_name);
- private:
- typedef std::map<std::string, Glib::RefPtr<Gtk::Action> > _ActionMap;
- _ActionMap actions;
-};
+ Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group, const char* name, const char* label);
+ Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
+ const char* name, const char* label, sigc::slot<void> sl);
+ Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group,
+ Gtk::RadioAction::Group&,
+ const char* name, const char* label,
+ sigc::slot<void,GtkAction*> sl,
+ int value);
+ Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group,
+ Gtk::RadioAction::Group&,
+ const char* name, const char* label,
+ sigc::slot<void> sl);
+ Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
+ const char* name, const char* label, sigc::slot<void> sl);
-class LIBGTKMM2EXT_API Bindings {
- public:
- enum Operation {
- Press,
- Release
- };
+ Glib::RefPtr<Gtk::Action> find_action (const std::string& name);
- Bindings();
- ~Bindings ();
+ void set_bindings (Bindings*);
+ Bindings* bindings() const { return _bindings; }
- void add (KeyboardKey, Operation, Glib::RefPtr<Gtk::Action>);
- void remove (KeyboardKey, Operation);
- bool activate (KeyboardKey, Operation);
+ typedef std::vector<Glib::RefPtr<Gtk::Action> > Actions;
+ void get_actions (Actions&);
- void add (MouseButton, Operation, Glib::RefPtr<Gtk::Action>);
- void remove (MouseButton, Operation);
- bool activate (MouseButton, Operation);
+ static std::list<ActionMap*> action_maps;
- bool load (const std::string& path);
- void load (const XMLNode& node);
- bool save (const std::string& path);
- void save (XMLNode& root);
+ /* used by control surface protocols and other UIs */
+ static void get_all_actions (std::vector<std::string>& paths,
+ std::vector<std::string>& labels,
+ std::vector<std::string>& tooltips,
+ std::vector<std::string>& keys,
+ std::vector<Glib::RefPtr<Gtk::Action> >& actions);
- void set_action_map (ActionMap&);
+ private:
+ std::string _name;
+
+ /* hash for faster lookup of actions by name */
+
+ typedef std::map<std::string, Glib::RefPtr<Gtk::Action> > _ActionMap;
+ _ActionMap _actions;
+
+ /* initialized to null; set after a Bindings object has ::associated()
+ * itself with this action map.
+ */
+
+ Bindings* _bindings;
- static void set_ignored_state (int mask) {
- _ignored_state = mask;
- }
- static uint32_t ignored_state() { return _ignored_state; }
+};
+
+class LIBGTKMM2EXT_API Bindings {
+ public:
+ enum Operation {
+ Press,
+ Release
+ };
+
+ struct ActionInfo {
+ ActionInfo (std::string const& name) : action_name (name) {}
+ ActionInfo (std::string const& name, std::string const& grp) : action_name (name), group_name (grp) {}
+
+ std::string action_name;
+ std::string group_name; /* may be empty */
+ Glib::RefPtr<Gtk::Action> action;
+ };
+ typedef std::map<KeyboardKey,ActionInfo> KeybindingMap;
+
+ Bindings (std::string const& name);
+ ~Bindings ();
+
+ std::string const& name() const { return _name; }
+
+ void associate ();
+ void dissociate ();
+
+ bool empty() const;
+ bool empty_keys () const;
+ bool empty_mouse () const;
+
+ bool add (KeyboardKey, Operation, std::string const&, XMLProperty const*, bool can_save = false);
+ bool replace (KeyboardKey, Operation, std::string const& action_name, bool can_save = true);
+ bool remove (Operation, std::string const& action_name, bool can_save = false);
+
+ bool activate (KeyboardKey, Operation);
+
+ void add (MouseButton, Operation, std::string const&, XMLProperty const*);
+ void remove (MouseButton, Operation);
+ bool activate (MouseButton, Operation);
+
+ bool is_bound (KeyboardKey const&, Operation) const;
+ bool is_registered (Operation op, std::string const& action_name) const;
+
+ KeyboardKey get_binding_for_action (Glib::RefPtr<Gtk::Action>, Operation& op);
+
+ bool load (XMLNode const& node);
+ void load_operation (XMLNode const& node);
+ void save (XMLNode& root);
+ void save_as_html (std::ostream&) const;
+
+ /* GTK has the following position a Gtk::Action:
+ *
+ * accel_path: <Actions>/GroupName/ActionName
+ * name: ActionName
+ *
+ * We want proper namespacing and we're not interested in
+ * the silly <Actions> "extra" namespace. So in Ardour:
+ *
+ * accel_path: <Actions>/GroupName/ActionName
+ * name: GroupName/ActionName
+ *
+ * This (static) method returns the "ardour" name for the action.
+ */
+ static std::string ardour_action_name (Glib::RefPtr<Gtk::Action>);
+
+ void set_action_map (ActionMap&);
+
+ /* used for editing bindings */
+ void get_all_actions (std::vector<std::string>& paths,
+ std::vector<std::string>& labels,
+ std::vector<std::string>& tooltips,
+ std::vector<std::string>& keys,
+ std::vector<Glib::RefPtr<Gtk::Action> >& actions);
+
+ /* all bindings currently in existence, as grouped into Bindings */
+ static std::list<Bindings*> bindings;
+ static Bindings* get_bindings (std::string const& name, ActionMap&);
+ static void associate_all ();
+ static void save_all_bindings_as_html (std::ostream&);
+
+ static PBD::Signal1<void,Bindings*> BindingsChanged;
private:
- typedef std::map<KeyboardKey,Glib::RefPtr<Gtk::Action> > KeybindingMap;
+ std::string _name;
+ ActionMap* _action_map;
+ KeybindingMap press_bindings;
+ KeybindingMap release_bindings;
- KeybindingMap press_bindings;
- KeybindingMap release_bindings;
+ typedef std::map<MouseButton,ActionInfo> MouseButtonBindingMap;
+ MouseButtonBindingMap button_press_bindings;
+ MouseButtonBindingMap button_release_bindings;
- typedef std::map<MouseButton,Glib::RefPtr<Gtk::Action> > MouseButtonBindingMap;
- MouseButtonBindingMap button_press_bindings;
- MouseButtonBindingMap button_release_bindings;
+ void push_to_gtk (KeyboardKey, Glib::RefPtr<Gtk::Action>);
- ActionMap* action_map;
- static uint32_t _ignored_state;
+ KeybindingMap& get_keymap (Operation op);
+ const KeybindingMap& get_keymap (Operation op) const;
+ MouseButtonBindingMap& get_mousemap (Operation op);
};
} // namespace
+std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k);
+
#endif /* __libgtkmm2ext_bindings_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/cairo_icon.h b/libs/gtkmm2ext/gtkmm2ext/cairo_icon.h
new file mode 100644
index 0000000..aebf577
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/cairo_icon.h
@@ -0,0 +1,53 @@
+/*
+ Copyright (C) 2015 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __gtk2_ardour_cairo_icon_h__
+#define __gtk2_ardour_cairo_icon_h__
+
+#include <gtkmm/bin.h>
+
+#include "gtkmm2ext/visibility.h"
+#include "gtkmm2ext/ardour_icon.h"
+
+/** A parent class for icons that are rendered using Cairo but need to be
+ * widgets for event handling
+ */
+
+namespace Gtkmm2ext {
+
+class LIBGTKMM2EXT_API CairoIcon : public Gtk::Bin
+{
+public:
+ CairoIcon (Gtkmm2ext::ArdourIcon::Icon, uint32_t fg = 0x000000ff);
+ virtual ~CairoIcon ();
+
+ void render (cairo_t *, cairo_rectangle_t*);
+ void set_fg (uint32_t fg);
+
+ bool on_expose_event (GdkEventExpose*);
+
+ private:
+ Cairo::RefPtr<Cairo::Surface> image_surface;
+ ArdourIcon::Icon icon_type;
+ uint32_t fg;
+};
+
+}
+
+#endif /* __gtk2_ardour_cairo_icon_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
index 2a48384..2588adc 100644
--- a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
+++ b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
@@ -93,7 +93,7 @@ public:
they wish to invoke any existing focus handler from their own
button press handler, they can just use: focus_handler();
*/
- static void set_focus_handler (sigc::slot<void>);
+ static void set_focus_handler (sigc::slot<void,Gtk::Widget*>);
protected:
/** Render the widget to the given Cairo context */
@@ -118,7 +118,7 @@ protected:
static bool _widget_prelight;
bool _grabbed;
- static sigc::slot<void> focus_handler;
+ static sigc::slot<void,Gtk::Widget*> focus_handler;
private:
Cairo::RefPtr<Cairo::Surface> image_surface;
diff --git a/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h b/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
index 29ae084..0801058 100644
--- a/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
+++ b/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
@@ -142,11 +142,16 @@ class /*LIBGTKMM2EXT_API*/ DnDTreeView : public DnDTreeViewBase
if (selection_data.get_target() == "GTK_TREE_MODEL_ROW") {
TreeView::on_drag_data_received (context, x, y, selection_data, info, time);
- } else if (selection_data.get_target() == object_type) {
- signal_drop (context, selection_data);
- context->drag_finish (true, false, time);
} else {
- /* some kind of target type added by the app, which will be handled by a signal handler */
+ /* some kind of target type, usually 'object_type' added by the app,
+ * which will be handled by a signal handler */
+ for (std::list<Gtk::TargetEntry>::const_iterator i = draggable.begin(); i != draggable.end (); ++i) {
+ if (selection_data.get_target() == (*i).get_target()) {
+ signal_drop (context, selection_data);
+ context->drag_finish (true, false, time);
+ break;
+ }
+ }
}
}
diff --git a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
index aba413b..750ba5c 100644
--- a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
+++ b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
@@ -46,6 +46,8 @@ public:
virtual bool is_selectable () const = 0;
virtual bool drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &) { return false; }
+
+ virtual bool can_copy_state (DnDVBoxChild*) const = 0;
};
/** A VBox whose contents can be dragged and dropped */
@@ -59,6 +61,7 @@ public:
, _drag_icon (0)
, _expecting_unwanted_button_event (false)
, _placeholder (0)
+ , _drag_child (0)
{
add (_internal_vbox);
@@ -415,6 +418,7 @@ private:
{
delete _drag_icon;
_drag_icon = 0;
+ _drag_source = 0;
_drag_child = 0;
remove_placeholder ();
@@ -440,21 +444,33 @@ private:
return n;
}
- bool drag_motion (Glib::RefPtr<Gdk::DragContext> const &, int /*x*/, int y, guint)
+ bool drag_motion (Glib::RefPtr<Gdk::DragContext> const & ctx, int /*x*/, int y, guint tme)
{
if (_children.empty ()) {
return false;
}
T* before;
- T* at;
+ T* at = NULL;
T* after;
/* decide where we currently are */
double const c = get_children_around_position (y, &before, &at, &after);
/* whether we're in the top or bottom half of the child that we're over */
- bool top_half = (c - int (c)) < 0.5;
+ bool top_half = (c - int (c)) < .5;
+ bool bottom_half = !top_half;
+
+ if (_drag_source != this /* re-order */
+ && _drag_source && at
+ && _drag_source->_drag_child
+ && _drag_source->selection ().size () == 1
+ && at != _drag_source->_drag_child // can't happen or can it?
+ && at->can_copy_state (_drag_source->_drag_child))
+ {
+ top_half = (c - int (c)) < 0.33;
+ bottom_half = (c - int (c)) > 0.8; // increase area >> 0.66; plugin below will move, or there's space
+ }
/* Note that when checking on whether to remove a placeholder, we never do
so if _drag_child is 0 as this means that the child being dragged is
@@ -468,14 +484,24 @@ private:
return false;
}
- if (!top_half && _drag_child && (at == _drag_child || after == _drag_child)) {
+ if (bottom_half && _drag_child && (at == _drag_child || after == _drag_child)) {
/* dropping here would have no effect, so remove the visual cue */
remove_placeholder ();
return false;
}
- create_or_update_placeholder (c);
- return false;
+ if (top_half || bottom_half) {
+ create_or_update_placeholder (c);
+ if (_drag_source == this /* re-order */) {
+ ctx->drag_status (Gdk::ACTION_MOVE, tme);
+ } else {
+ ctx->drag_status (Gdk::ACTION_COPY, tme);
+ }
+ } else {
+ ctx->drag_status (Gdk::ACTION_LINK, tme);
+ remove_placeholder ();
+ }
+ return true;
}
void drag_leave (Glib::RefPtr<Gdk::DragContext> const &, guint)
diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
index acddbe7..dbe1739 100644
--- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
+++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
@@ -58,6 +58,7 @@ class Touchable;
namespace Gtkmm2ext {
class TextViewer;
+class Bindings;
extern BaseUI::RequestType NullMessage;
extern BaseUI::RequestType ErrorMessage;
@@ -135,7 +136,7 @@ class LIBGTKMM2EXT_API UI : public AbstractUI<UIRequest>
void set_state (Gtk::Widget *w, Gtk::StateType state);
void popup_error (const std::string& text);
- void flush_pending ();
+ void flush_pending (float timeout = 0);
void toggle_errors ();
void show_errors ();
void dump_errors (std::ostream&);
@@ -167,6 +168,9 @@ class LIBGTKMM2EXT_API UI : public AbstractUI<UIRequest>
sigc::signal<void> theme_changed;
static bool just_hide_it (GdkEventAny *, Gtk::Window *);
+ static float ui_scale;
+
+ Gtkmm2ext::Bindings* global_bindings;
protected:
virtual void handle_fatal (const char *);
diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
index 4319c9a..58af25f 100644
--- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h
+++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
@@ -24,11 +24,11 @@
#include <vector>
#include <string>
-#include <sigc++/signal.h>
#include <gtk/gtk.h>
#include <gtkmm/accelkey.h>
#include "pbd/stateful.h"
+#include "pbd/signals.h"
#include "gtkmm2ext/visibility.h"
@@ -38,6 +38,9 @@ namespace Gtk {
namespace Gtkmm2ext {
+class Bindings;
+class ActionMap;
+
class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
{
public:
@@ -71,6 +74,11 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
static const char* tertiary_modifier_name ();
static const char* level4_modifier_name ();
+ static const char* primary_modifier_short_name ();
+ static const char* secondary_modifier_short_name ();
+ static const char* tertiary_modifier_short_name ();
+ static const char* level4_modifier_short_name ();
+
static void set_primary_modifier (uint32_t newval) {
set_modifier (newval, PrimaryModifier);
}
@@ -161,22 +169,18 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
static void keybindings_changed ();
static void save_keybindings ();
- static bool load_keybindings (std::string path);
static void set_can_save_keybindings (bool yn);
static std::string current_binding_name () { return _current_binding_name; }
static std::map<std::string,std::string> binding_files;
- int reset_bindings ();
+ static bool catch_user_event_for_pre_dialog_focus (GdkEvent* ev, Gtk::Window* w);
- struct AccelKeyLess {
- bool operator() (const Gtk::AccelKey a, const Gtk::AccelKey b) const {
- if (a.get_key() != b.get_key()) {
- return a.get_key() < b.get_key();
- } else {
- return a.get_mod() < b.get_mod();
- }
- }
- };
+ static bool load_keybindings (std::string const& path);
+ static void save_keybindings (std::string const& path);
+
+ static std::string binding_filename_suffix;
+
+ int reset_bindings ();
sigc::signal0<void> ZoomVerticalModifierReleased;
@@ -203,14 +207,17 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
typedef std::pair<std::string,std::string> two_strings;
- static std::map<Gtk::AccelKey,two_strings,AccelKeyLess> release_keys;
-
static gint _snooper (GtkWidget*, GdkEventKey*, gpointer);
gint snooper (GtkWidget*, GdkEventKey*);
static void set_modifier (uint32_t newval, uint32_t& variable);
static bool _some_magic_widget_has_focus;
+
+ static Gtk::Window* pre_dialog_active_window;
+
+ static int read_keybindings (std::string const& path);
+ static int store_keybindings (std::string const& path);
};
} /* namespace */
diff --git a/libs/gtkmm2ext/gtkmm2ext/pane.h b/libs/gtkmm2ext/gtkmm2ext/pane.h
new file mode 100644
index 0000000..9612da0
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/pane.h
@@ -0,0 +1,131 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libgtkmm2ext_pane_h__
+#define __libgtkmm2ext_pane_h__
+
+#include <vector>
+#include <algorithm>
+
+#include <stdint.h>
+
+#include <gdkmm/cursor.h>
+#include <gtkmm/container.h>
+#include <gtkmm/eventbox.h>
+
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtk {
+ class Widget;
+}
+
+namespace Gtkmm2ext {
+
+class LIBGTKMM2EXT_API Pane : public Gtk::Container
+{
+ private:
+ class Divider;
+
+
+ public:
+ struct Child
+ {
+ Pane* pane;
+ Gtk::Widget* w;
+ int32_t minsize;
+
+ Child (Pane* p, Gtk::Widget* widget, uint32_t ms) : pane (p), w (widget), minsize (ms) {}
+ };
+
+ typedef std::list<Child> Children;
+
+ Pane (bool horizontal);
+ ~Pane();
+
+ void set_divider (std::vector<float>::size_type divider, float fract);
+ float get_divider (std::vector<float>::size_type divider = 0);
+ void set_child_minsize (Gtk::Widget const &, int32_t);
+
+ GType child_type_vfunc() const;
+ void set_drag_cursor (Gdk::Cursor);
+
+ void set_check_divider_position (bool);
+
+ protected:
+ bool horizontal;
+
+ void on_add (Gtk::Widget*);
+ void on_remove (Gtk::Widget*);
+ void on_size_request (GtkRequisition*);
+ void on_size_allocate (Gtk::Allocation&);
+ bool on_expose_event (GdkEventExpose*);
+
+ bool handle_press_event (GdkEventButton*, Divider*);
+ bool handle_release_event (GdkEventButton*, Divider*);
+ bool handle_motion_event (GdkEventMotion*, Divider*);
+ bool handle_enter_event (GdkEventCrossing*, Divider*);
+ bool handle_leave_event (GdkEventCrossing*, Divider*);
+
+ void forall_vfunc (gboolean include_internals, GtkCallback callback, gpointer callback_data);
+
+ private:
+ Gdk::Cursor drag_cursor;
+ bool did_move;
+
+ void reallocate (Gtk::Allocation const &);
+
+ Children children;
+
+ struct Divider : public Gtk::EventBox {
+ Divider ();
+
+ float fract;
+ bool dragging;
+
+ bool on_expose_event (GdkEventExpose* ev);
+ };
+
+ typedef std::list<Divider*> Dividers;
+ Dividers dividers;
+ int divider_width;
+ bool check_fract;
+
+ void add_divider ();
+ void handle_child_visibility ();
+ bool fract_is_ok (Dividers::size_type, float fract);
+
+ static void* notify_child_destroyed (void*);
+ void* child_destroyed (Gtk::Widget*);
+};
+
+class LIBGTKMM2EXT_API HPane : public Pane
+{
+ public:
+ HPane () : Pane (true) {}
+};
+
+class LIBGTKMM2EXT_API VPane : public Pane
+{
+ public:
+ VPane () : Pane (false) {}
+};
+
+} /* namespace */
+
+#endif /* __libgtkmm2ext_pane_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h b/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
index 9883fd2..9e87f89 100644
--- a/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
+++ b/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
@@ -40,8 +40,12 @@ class LIBGTKMM2EXT_API PersistentTooltip : public sigc::trackable
void set_center_alignment (bool align_to_center);
virtual bool dragging () const;
+ static void set_tooltips_enabled (bool en) { _tooltips_enabled = en; }
+ static bool tooltips_enabled () { return _tooltips_enabled; }
private:
+ static bool _tooltips_enabled;
+ static unsigned int _tooltip_timeout;
bool timeout ();
void show ();
void hide ();
diff --git a/libs/gtkmm2ext/gtkmm2ext/searchbar.h b/libs/gtkmm2ext/gtkmm2ext/searchbar.h
new file mode 100644
index 0000000..b8a209c
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/searchbar.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <gtkmm/entry.h>
+#include <string>
+
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtkmm2ext {
+
+class LIBGTKMM2EXT_API SearchBar : public Gtk::Entry
+{
+public:
+ SearchBar(
+ const std::string& placeholder_text = "Search...",
+ bool icon_click_resets = true);
+
+ // resets the searchbar to the initial state
+ void reset ();
+ // emitted when the filter has been updated
+ sigc::signal<void, const std::string&> signal_search_string_updated () { return sig_search_string_updated; }
+protected:
+ bool focus_in_event (GdkEventFocus*);
+ bool focus_out_event (GdkEventFocus*);
+
+ bool key_press_event (GdkEventKey*);
+ void icon_clicked_event (Gtk::EntryIconPosition, const GdkEventButton*);
+
+ const std::string placeholder_text;
+ sigc::signal<void, const std::string&> sig_search_string_updated;
+private:
+ void search_string_changed () const;
+
+ Glib::RefPtr<Gdk::Pixbuf> icon;
+ bool icon_click_resets;
+};
+
+}
diff --git a/libs/gtkmm2ext/gtkmm2ext/tabbable.h b/libs/gtkmm2ext/gtkmm2ext/tabbable.h
new file mode 100644
index 0000000..e72a86d
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/tabbable.h
@@ -0,0 +1,101 @@
+/*
+ Copyright (C) 2015 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __gtkmm2ext_tabbable_h__
+#define __gtkmm2ext_tabbable_h__
+
+#include <gtkmm/bin.h>
+#include <gtkmm/box.h>
+#include <gtkmm/button.h>
+#include <gtkmm/image.h>
+#include <gtkmm/label.h>
+#include <gtkmm/notebook.h>
+
+#include "gtkmm2ext/cairo_icon.h"
+#include "gtkmm2ext/window_proxy.h"
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtk {
+ class Window;
+ class Notebook;
+}
+
+namespace Gtkmm2ext {
+
+class VisibilityTracker;
+
+class LIBGTKMM2EXT_API Tabbable : public WindowProxy {
+ public:
+ Tabbable (Gtk::Widget&, const std::string&);
+ ~Tabbable ();
+
+ void add_to_notebook (Gtk::Notebook& notebook, const std::string& tab_title);
+ void make_visible ();
+ void make_invisible ();
+ void change_visibility ();
+ void attach ();
+ void detach ();
+
+ Gtk::Widget& contents() const { return _contents; }
+
+ Gtk::Window* get (bool create = false);
+ Gtk::Window* own_window () { return get (false); }
+ virtual Gtk::Window* use_own_window (bool and_pack_it);
+
+ void set_default_tabbed (bool yn);
+
+ virtual void show_window ();
+
+ bool window_visible () const;
+ bool tabbed() const;
+ bool tabbed_by_default () const;
+
+ Gtk::Window* current_toplevel () const;
+
+ Gtk::Notebook* tab_root_drop ();
+
+ int set_state (const XMLNode&, int version);
+ XMLNode& get_state ();
+
+ static std::string xml_node_name();
+
+ sigc::signal1<void,Tabbable&> StateChange;
+
+ protected:
+ bool delete_event_handler (GdkEventAny *ev);
+
+ private:
+ Gtk::Widget& _contents;
+ Gtk::Notebook _own_notebook;
+ Gtk::Notebook* _parent_notebook;
+ std::string _tab_title;
+ bool tab_requested_by_state;
+
+ void show_tab ();
+ void hide_tab ();
+ bool tab_close_clicked (GdkEventButton*);
+ void show_own_window (bool and_pack_it);
+ void window_mapped ();
+ void window_unmapped ();
+};
+
+
+}
+
+#endif
diff --git a/libs/gtkmm2ext/gtkmm2ext/utils.h b/libs/gtkmm2ext/gtkmm2ext/utils.h
index 43baf59..bd09e29 100644
--- a/libs/gtkmm2ext/gtkmm2ext/utils.h
+++ b/libs/gtkmm2ext/gtkmm2ext/utils.h
@@ -29,6 +29,7 @@
#include <gtkmm/container.h>
#include <gtkmm/filechooser.h>
+#include <gtkmm/menu.h>
#include <gtkmm/treeview.h>
#include <gdkmm/window.h> /* for WMDecoration */
#include <gdkmm/pixbuf.h>
@@ -54,8 +55,8 @@ namespace Gtkmm2ext {
LIBGTKMM2EXT_API std::string fit_to_pixels (const std::string&, int pixel_width, Pango::FontDescription& font, int& actual_width, bool with_ellipses = false);
LIBGTKMM2EXT_API std::pair<std::string, double> fit_to_pixels (cairo_t *, std::string, double);
- LIBGTKMM2EXT_API int pixel_width (const std::string& str, Pango::FontDescription& font);
- LIBGTKMM2EXT_API void pixel_size (const std::string& str, Pango::FontDescription& font, int& width, int& height);
+ LIBGTKMM2EXT_API int pixel_width (const std::string& str, const Pango::FontDescription& font);
+ LIBGTKMM2EXT_API void pixel_size (const std::string& str, const Pango::FontDescription& font, int& width, int& height);
LIBGTKMM2EXT_API void get_ink_pixel_size (Glib::RefPtr<Pango::Layout>,
int& width, int& height);
@@ -96,6 +97,11 @@ namespace Gtkmm2ext {
int clip_height,
Gdk::Color fg);
+ LIBGTKMM2EXT_API void position_menu_anchored (const Gtk::Menu* const menu,
+ Gtk::Widget* const anchor,
+ const std::string& selected,
+ int& x, int& y, bool& push_in);
+
LIBGTKMM2EXT_API void set_popdown_strings (Gtk::ComboBoxText&,
const std::vector<std::string>&);
@@ -123,7 +129,6 @@ namespace Gtkmm2ext {
LIBGTKMM2EXT_API Glib::RefPtr<Gdk::Window> window_to_draw_on (Gtk::Widget& w, Gtk::Widget** parent);
LIBGTKMM2EXT_API bool possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval);
- LIBGTKMM2EXT_API bool possibly_translate_mod_to_make_legal_accelerator (GdkModifierType& mod);
LIBGTKMM2EXT_API uint32_t possibly_translate_legal_accelerator_to_real_key (uint32_t keyval);
LIBGTKMM2EXT_API int physical_screen_height (Glib::RefPtr<Gdk::Window>);
@@ -173,6 +178,11 @@ namespace Gtkmm2ext {
LIBGTKMM2EXT_API std::string markup_escape_text (std::string const& s);
LIBGTKMM2EXT_API void add_volume_shortcuts (Gtk::FileChooser& c);
+
+ LIBGTKMM2EXT_API float paned_position_as_fraction (Gtk::Paned& paned, bool h);
+ LIBGTKMM2EXT_API void paned_set_position_as_fraction (Gtk::Paned& paned, float fraction, bool h);
+
+ LIBGTKMM2EXT_API std::string show_gdk_event_state (int state);
};
#endif /* __gtkmm2ext_utils_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h b/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h
index 43f5b24..8860aba 100644
--- a/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h
+++ b/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h
@@ -35,6 +35,8 @@ class LIBGTKMM2EXT_API VisibilityTracker : public virtual sigc::trackable {
VisibilityTracker (Gtk::Window&);
virtual ~VisibilityTracker() {}
+ static void set_use_window_manager_visibility (bool);
+ static bool use_window_manager_visibility() { return _use_window_manager_visibility; }
void cycle_visibility ();
bool fully_visible() const;
@@ -46,6 +48,9 @@ class LIBGTKMM2EXT_API VisibilityTracker : public virtual sigc::trackable {
private:
Gtk::Window& _window;
GdkVisibilityState _visibility;
+
+ static bool _use_window_manager_visibility;
+
bool handle_visibility_notify_event (GdkEventVisibility*);
};
diff --git a/libs/gtkmm2ext/gtkmm2ext/window_proxy.h b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h
new file mode 100644
index 0000000..2aa7aec
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h
@@ -0,0 +1,119 @@
+/*
+ Copyright (C) 2015 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __gtkmm2ext_window_proxy_h__
+#define __gtkmm2ext_window_proxy_h__
+
+#include <string>
+#include <gdkmm/event.h>
+#include <glibmm/refptr.h>
+#include <sigc++/trackable.h>
+
+#include "pbd/statefuldestructible.h"
+
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtk {
+class Window;
+class Action;
+}
+
+namespace Gtkmm2ext {
+
+class VisibilityTracker;
+
+class LIBGTKMM2EXT_API WindowProxy : public PBD::StatefulDestructible, public virtual sigc::trackable
+{
+ public:
+ WindowProxy (const std::string& name);
+ WindowProxy (const std::string& name, const std::string& menu_name);
+ WindowProxy (const std::string& name, const std::string& menu_name, const XMLNode&);
+ virtual ~WindowProxy();
+
+ void show ();
+ void show_all ();
+ void hide ();
+ void present ();
+ void maybe_show ();
+
+ bool visible() const;
+ bool fully_visible() const;
+ const std::string& name() const { return _name; }
+ const std::string& menu_name() const { return _menu_name; }
+
+ std::string action_name() const;
+ void set_action (Glib::RefPtr<Gtk::Action>);
+ Glib::RefPtr<Gtk::Action> action() const { return _action; };
+
+ void drop_window ();
+ void use_window (Gtk::Window&);
+
+ virtual Gtk::Window* get (bool create = false) = 0;
+
+ virtual int set_state (const XMLNode&, int version);
+ virtual XMLNode& get_state ();
+
+ enum StateMask {
+ Position = 0x1,
+ Size = 0x2
+ };
+
+ void set_state_mask (StateMask);
+ StateMask state_mask () const { return _state_mask; }
+
+ operator bool() const { return _window != 0; }
+
+ static std::string xml_node_name();
+
+ sigc::signal0<void> signal_map;
+ sigc::signal0<void> signal_unmap;
+
+ protected:
+ std::string _name;
+ std::string _menu_name;
+ Glib::RefPtr<Gtk::Action> _action;
+ Gtk::Window* _window;
+ mutable bool _visible; ///< true if the window should be visible on startup
+ mutable int _x_off; ///< x position
+ mutable int _y_off; ///< y position
+ mutable int _width; ///< width
+ mutable int _height; ///< height
+ Gtkmm2ext::VisibilityTracker* vistracker;
+ StateMask _state_mask;
+ sigc::connection delete_connection;
+ sigc::connection configure_connection;
+ sigc::connection map_connection;
+ sigc::connection unmap_connection;
+
+
+ void save_pos_and_size ();
+ void set_pos_and_size ();
+ void set_pos ();
+
+ virtual bool delete_event_handler (GdkEventAny *ev);
+ virtual bool configure_handler (GdkEventConfigure*);
+ void map_handler ();
+ void unmap_handler ();
+ virtual void setup ();
+ void toggle ();
+};
+
+}
+
+#endif /* __gtkmm2ext_window_proxy_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext3.pot b/libs/gtkmm2ext/gtkmm2ext3.pot
new file mode 100644
index 0000000..0f96336
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext3.pot
@@ -0,0 +1,145 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-08 20:24-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: actions.cc:261
+msgid "Unknown action name: %1"
+msgstr ""
+
+#: binding_proxy.cc:81
+msgid "operate controller now"
+msgstr ""
+
+#: bindable_button.cc:48
+msgid "button cannot watch state of non-existing Controllable\n"
+msgstr ""
+
+#: cursors.cc:82
+msgid "cursor hotspots info file %1 has an error on line %2"
+msgstr ""
+
+#: emscale.cc:52
+msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+#: gtk_ui.cc:119
+msgid "Log"
+msgstr ""
+
+#: gtk_ui.cc:388
+msgid ""
+"\n"
+"\n"
+"Shortcut: "
+msgstr ""
+
+#: gtk_ui.cc:688
+msgid "Press To Exit"
+msgstr ""
+
+#: gtk_ui.cc:724
+msgid "I'm sorry %1, I can't do that"
+msgstr ""
+
+#: keyboard.cc:71
+msgid "Command"
+msgstr ""
+
+#: keyboard.cc:72 keyboard.cc:94
+msgid "Control"
+msgstr ""
+
+#: keyboard.cc:73 keyboard.cc:78 keyboard.cc:96 keyboard.cc:101
+msgid "Key|Shift"
+msgstr ""
+
+#: keyboard.cc:74
+msgid "Option"
+msgstr ""
+
+#: keyboard.cc:76
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:77 keyboard.cc:99
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:79
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:95 keyboard.cc:100
+msgid "Alt"
+msgstr ""
+
+#: keyboard.cc:97
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:102
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:153 keyboard.cc:628
+msgid "Unknown"
+msgstr ""
+
+#: keyboard.cc:639
+msgid "key bindings file not found at \"%2\" or contains errors."
+msgstr ""
+
+#: keyboard.cc:665
+msgid "Keyboard binding found without a name"
+msgstr ""
+
+#: keyboard.cc:695
+msgid "Cannot save key bindings to %1"
+msgstr ""
+
+#: keyboard.cc:711
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr ""
+
+#: paths_dialog.cc:32
+msgid "Add"
+msgstr ""
+
+#: paths_dialog.cc:33
+msgid "Delete"
+msgstr ""
+
+#: paths_dialog.cc:34
+msgid "Reset to Default"
+msgstr ""
+
+#: paths_dialog.cc:109
+msgid "Add folder to search path"
+msgstr ""
+
+#: tearoff.cc:57
+msgid "Click to tear this into its own window"
+msgstr ""
+
+#: tearoff.cc:63
+msgid "Click to put this back in the main window"
+msgstr ""
+
+#: textviewer.cc:32
+msgid "Close"
+msgstr ""
diff --git a/libs/gtkmm2ext/i18n.h b/libs/gtkmm2ext/i18n.h
deleted file mode 100644
index 2f1c52a..0000000
--- a/libs/gtkmm2ext/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include <pbd/compose.h>
-#include <pbd/convert.h>
-#include "gettext.h"
-
-#define _(Text) dgettext (PACKAGE, Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) (Text)
-/** Use this to translate strings that have different meanings in different places.
- * Text should be of the form Context|Message.
- */
-#define S_(Text) PBD::sgettext (PACKAGE, Text)
-
-#endif // __i18n_h__
diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc
index 0f9aeb0..135e1fd 100644
--- a/libs/gtkmm2ext/keyboard.cc
+++ b/libs/gtkmm2ext/keyboard.cc
@@ -38,11 +38,13 @@
#include "pbd/debug.h"
#include "pbd/unwind.h"
-#include "gtkmm2ext/keyboard.h"
#include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/keyboard.h"
#include "gtkmm2ext/debug.h"
+#include "gtkmm2ext/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace Gtk;
@@ -56,7 +58,7 @@ guint Keyboard::delete_mod = GDK_SHIFT_MASK;
guint Keyboard::insert_note_but = 1;
guint Keyboard::insert_note_mod = GDK_CONTROL_MASK;
-#ifdef GTKOSX
+#ifdef __APPLE__
uint Keyboard::PrimaryModifier = GDK_MOD2_MASK; // Command
guint Keyboard::SecondaryModifier = GDK_CONTROL_MASK; // Control
@@ -71,6 +73,11 @@ const char* Keyboard::secondary_modifier_name() { return _("Control"); }
const char* Keyboard::tertiary_modifier_name() { return S_("Key|Shift"); }
const char* Keyboard::level4_modifier_name() { return _("Option"); }
+const char* Keyboard::primary_modifier_short_name() { return _("Cmd"); }
+const char* Keyboard::secondary_modifier_short_name() { return _("Ctrl"); }
+const char* Keyboard::tertiary_modifier_short_name() { return S_("Key|Shift"); }
+const char* Keyboard::level4_modifier_short_name() { return _("Opt"); }
+
guint Keyboard::snap_mod = Keyboard::Level4Modifier|Keyboard::TertiaryModifier; // XXX this is probably completely wrong
guint Keyboard::snap_delta_mod = Keyboard::Level4Modifier;
@@ -89,6 +96,11 @@ const char* Keyboard::secondary_modifier_name() { return _("Alt"); }
const char* Keyboard::tertiary_modifier_name() { return S_("Key|Shift"); }
const char* Keyboard::level4_modifier_name() { return _("Windows"); }
+const char* Keyboard::primary_modifier_short_name() { return _("Ctrl"); }
+const char* Keyboard::secondary_modifier_short_name() { return _("Alt"); }
+const char* Keyboard::tertiary_modifier_short_name() { return S_("Key|Shift"); }
+const char* Keyboard::level4_modifier_short_name() { return _("Win"); }
+
guint Keyboard::snap_mod = Keyboard::SecondaryModifier;
guint Keyboard::snap_delta_mod = Keyboard::SecondaryModifier|Keyboard::Level4Modifier;
@@ -110,10 +122,10 @@ bool Keyboard::can_save_keybindings = false;
bool Keyboard::bindings_changed_after_save_became_legal = false;
map<string,string> Keyboard::binding_files;
string Keyboard::_current_binding_name;
-map<AccelKey,pair<string,string>,Keyboard::AccelKeyLess> Keyboard::release_keys;
+string Keyboard::binding_filename_suffix = X_(".keys");
+Gtk::Window* Keyboard::pre_dialog_active_window = 0;
/* set this to initially contain the modifiers we care about, then track changes in ::set_edit_modifier() etc. */
-
GdkModifierType Keyboard::RelevantModifierKeyMask;
void
@@ -143,11 +155,31 @@ Keyboard::Keyboard ()
RelevantModifierKeyMask = (GdkModifierType) gtk_accelerator_get_default_mod_mask ();
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
+
+ gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
+
#ifdef __APPLE__
/* Remove SUPER,HYPER,META.
*
* GTK on OS X adds META when Command is pressed for various indefensible reasons, since
- * it also uses MOD2 to indicate Command.
+ * it also uses MOD2 to indicate Command. Our code assumes that each
+ * modifier (Primary, Secondary etc.) is represented by a single bit in
+ * the modifier mask, but GTK's (STUPID) design uses two (MOD2 + META)
+ * to represent the Command key. Some discussion about this is here:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=692597
+ *
+ * We cannot do this until AFTER we told GTK what the default modifier
+ * was, because otherwise it will fail to recognize MOD2-META-<key> as
+ * an accelerator.
+ *
+ * Note that in the tabbed branch, we no longer use GTK accelerators
+ * for functional purposes, so this is as critical for that branch.
*/
RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_SUPER_MASK);
@@ -155,15 +187,6 @@ Keyboard::Keyboard ()
RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_META_MASK);
#endif
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
-
- gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
-
snooper_id = gtk_key_snooper_install (_snooper, (gpointer) this);
}
@@ -203,7 +226,7 @@ Keyboard::get_state (void)
int
Keyboard::set_state (const XMLNode& node, int /*version*/)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("copy-modifier")) != 0) {
sscanf (prop->value().c_str(), "%d", &CopyModifier);
@@ -250,64 +273,6 @@ Keyboard::_snooper (GtkWidget *widget, GdkEventKey *event, gpointer data)
return ((Keyboard *) data)->snooper (widget, event);
}
-static string
-show_gdk_event_state (int state)
-{
- string s;
- if (state & GDK_SHIFT_MASK) {
- s += "+SHIFT";
- }
- if (state & GDK_LOCK_MASK) {
- s += "+LOCK";
- }
- if (state & GDK_CONTROL_MASK) {
- s += "+CONTROL";
- }
- if (state & GDK_MOD1_MASK) {
- s += "+MOD1";
- }
- if (state & GDK_MOD2_MASK) {
- s += "+MOD2";
- }
- if (state & GDK_MOD3_MASK) {
- s += "+MOD3";
- }
- if (state & GDK_MOD4_MASK) {
- s += "+MOD4";
- }
- if (state & GDK_MOD5_MASK) {
- s += "+MOD5";
- }
- if (state & GDK_BUTTON1_MASK) {
- s += "+BUTTON1";
- }
- if (state & GDK_BUTTON2_MASK) {
- s += "+BUTTON2";
- }
- if (state & GDK_BUTTON3_MASK) {
- s += "+BUTTON3";
- }
- if (state & GDK_BUTTON4_MASK) {
- s += "+BUTTON4";
- }
- if (state & GDK_BUTTON5_MASK) {
- s += "+BUTTON5";
- }
- if (state & GDK_SUPER_MASK) {
- s += "+SUPER";
- }
- if (state & GDK_HYPER_MASK) {
- s += "+HYPER";
- }
- if (state & GDK_META_MASK) {
- s += "+META";
- }
- if (state & GDK_RELEASE_MASK) {
- s += "+RELEASE";
- }
-
- return s;
-}
gint
Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
@@ -357,6 +322,10 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
prevent auto-repeat events.
*/
+#if 0
+ /* August 2015: we don't have any release bindings
+ */
+
for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
const AccelKey& ak (k->first);
@@ -367,32 +336,7 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
break;
}
}
- }
-
- } else if (event->type == GDK_KEY_RELEASE) {
-
- State::iterator i;
-
- if ((i = find (state.begin(), state.end(), keyval)) != state.end()) {
- state.erase (i);
- sort (state.begin(), state.end());
- }
-
- for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
-
- const AccelKey& ak (k->first);
- two_strings ts (k->second);
-
- if (keyval == ak.get_key() && (Gdk::ModifierType)((event->state & Keyboard::RelevantModifierKeyMask) | Gdk::RELEASE_MASK) == ak.get_mod()) {
- Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (ts.first.c_str(), ts.second.c_str());
- if (act) {
- DEBUG_TRACE (DEBUG::Keyboard, string_compose ("Activate %1 %2\n", ts.first, ts.second));
- act->activate();
- DEBUG_TRACE (DEBUG::Keyboard, string_compose ("Use repeat, suppress other\n", ts.first, ts.second));
- ret = true;
- }
- break;
- }
+#endif
}
}
@@ -421,10 +365,38 @@ Keyboard::close_current_dialog ()
if (current_window) {
current_window->hide ();
current_window = 0;
+
+ if (pre_dialog_active_window) {
+ pre_dialog_active_window->present ();
+ pre_dialog_active_window = 0;
+ }
}
}
bool
+Keyboard::catch_user_event_for_pre_dialog_focus (GdkEvent* ev, Gtk::Window* w)
+{
+ switch (ev->type) {
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ case GDK_KEY_PRESS:
+ case GDK_KEY_RELEASE:
+ pre_dialog_active_window = w;
+ break;
+
+ case GDK_FOCUS_CHANGE:
+ if (ev->focus_change.in) {
+ pre_dialog_active_window = w;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return false;
+}
+
+bool
Keyboard::key_is_down (uint32_t keyval)
{
return find (state.begin(), state.end(), keyval) != state.end();
@@ -458,6 +430,7 @@ Keyboard::leave_window (GdkEventCrossing *ev, Gtk::Window* /*win*/)
current_window = 0;
}
} else {
+ DEBUG_TRACE (DEBUG::Keyboard, "LEAVE window without event\n");
current_window = 0;
}
@@ -479,7 +452,9 @@ Keyboard::focus_out_window (GdkEventFocus * ev, Gtk::Window* win)
state.clear ();
current_window = 0;
} else {
- current_window = 0;
+ if (win == current_window) {
+ current_window = 0;
+ }
}
DEBUG_TRACE (DEBUG::Keyboard, string_compose ("Foucusing out window, title = %1\n", win->get_title()));
@@ -573,7 +548,7 @@ Keyboard::is_insert_note_event (GdkEventButton *ev)
bool
Keyboard::is_button2_event (GdkEventButton* ev)
{
-#ifdef GTKOSX
+#ifdef __APPLE__
return (ev->button == 2) ||
((ev->button == 1) &&
((ev->state & Keyboard::button2_modifiers) == Keyboard::button2_modifiers));
@@ -636,17 +611,19 @@ void
Keyboard::save_keybindings ()
{
if (can_save_keybindings && bindings_changed_after_save_became_legal) {
- Gtk::AccelMap::save (user_keybindings_path);
+ /* Call to specific implementation to save bindings to path */
+ store_keybindings (user_keybindings_path);
}
}
bool
-Keyboard::load_keybindings (string path)
+Keyboard::load_keybindings (string const & path)
{
try {
info << "Loading bindings from " << path << endl;
- Gtk::AccelMap::load (path);
+ /* Call to specific implementation to load bindings from path */
+ read_keybindings (path);
_current_binding_name = _("Unknown");
@@ -664,41 +641,62 @@ Keyboard::load_keybindings (string path)
return false;
}
- /* now find all release-driven bindings */
+ return true;
+}
- vector<string> groups;
- vector<string> names;
- vector<string> tooltips;
- vector<AccelKey> bindings;
+int
+Keyboard::read_keybindings (string const & path)
+{
+ XMLTree tree;
- ActionManager::get_all_actions (groups, names, tooltips, bindings);
+ if (!tree.read (path.c_str())) {
+ return -1;
+ }
- vector<string>::iterator g;
- vector<AccelKey>::iterator b;
- vector<string>::iterator n;
+ /* toplevel node is "BindingSet; children are "Bindings" */
- release_keys.clear ();
+ XMLNodeList const& children = tree.root()->children();
- for (n = names.begin(), b = bindings.begin(), g = groups.begin(); n != names.end(); ++n, ++b, ++g) {
- stringstream s;
- s << "Action: " << *n << " Group: " << *g << " Binding: ";
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ XMLNode const * child = *i;
+ if (child->name() == X_("Bindings")) {
+ XMLProperty const* name = child->property (X_("name"));
+ if (!name) {
+ warning << _("Keyboard binding found without a name") << endmsg;
+ continue;
+ }
- if ((*b).get_key() != GDK_VoidSymbol) {
- s << b->get_key() << " w/mod " << hex << b->get_mod() << dec << " = " << b->get_abbrev () << "\n";
- } else {
- s << "unbound\n";
- }
+ Bindings* b = new Bindings (name->value());
+ b->load (**i);
+ }
+ }
+
+ return 0;
+}
- DEBUG_TRACE (DEBUG::Bindings, s.str ());
+int
+Keyboard::store_keybindings (string const & path)
+{
+ XMLNode* node = new XMLNode (X_("BindingSet"));
+ XMLNode* bnode;
+ int ret = 0;
+
+ for (list<Bindings*>::const_iterator b = Bindings::bindings.begin(); b != Bindings::bindings.end(); ++b) {
+ bnode = new XMLNode (X_("Bindings"));
+ bnode->add_property (X_("name"), (*b)->name());
+ (*b)->save (*bnode);
+ node->add_child_nocopy (*bnode);
}
- for (n = names.begin(), b = bindings.begin(), g = groups.begin(); n != names.end(); ++n, ++b, ++g) {
- if ((*b).get_mod() & Gdk::RELEASE_MASK) {
- release_keys.insert (pair<AccelKey,two_strings> (*b, two_strings (*g, *n)));
- }
+ XMLTree tree;
+ tree.set_root (node); /* tree now owns root and will delete it */
+
+ if (!tree.write (path)) {
+ error << string_compose (_("Cannot save key bindings to %1"), path) << endmsg;
+ ret = -1;
}
- return true;
+ return ret;
}
int
@@ -718,6 +716,7 @@ Keyboard::reset_bindings ()
{
PBD::Unwinder<bool> uw (can_save_keybindings, false);
setup_keybindings ();
+ Bindings::associate_all ();
}
return 0;
diff --git a/libs/gtkmm2ext/pane.cc b/libs/gtkmm2ext/pane.cc
new file mode 100644
index 0000000..be1f63c
--- /dev/null
+++ b/libs/gtkmm2ext/pane.cc
@@ -0,0 +1,610 @@
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <gdkmm/cursor.h>
+#include "gtkmm2ext/pane.h"
+
+#include "pbd/i18n.h"
+
+using namespace PBD;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace std;
+
+Pane::Pane (bool h)
+ : horizontal (h)
+ , did_move (false)
+ , divider_width (2)
+ , check_fract (false)
+{
+ using namespace Gdk;
+
+ set_name ("Pane");
+ set_has_window (false);
+
+ if (horizontal) {
+ drag_cursor = Cursor (SB_H_DOUBLE_ARROW);
+ } else {
+ drag_cursor = Cursor (SB_V_DOUBLE_ARROW);
+ }
+}
+
+Pane::~Pane ()
+{
+ for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+ c->w->remove_destroy_notify_callback (&(*c));
+ c->w->unparent ();
+ }
+}
+
+void
+Pane::set_child_minsize (Gtk::Widget const& w, int32_t minsize)
+{
+ for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+ if (c->w == &w) {
+ c->minsize = minsize;
+ break;
+ }
+ }
+}
+
+void
+Pane::set_drag_cursor (Gdk::Cursor c)
+{
+ drag_cursor = c;
+}
+
+void
+Pane::on_size_request (GtkRequisition* req)
+{
+ GtkRequisition largest;
+
+ /* iterate over all children, get their size requests */
+
+ /* horizontal pane is as high as its tallest child, including the dividers.
+ * Its width is the sum of the children plus the dividers.
+ *
+ * vertical pane is as wide as its widest child, including the dividers.
+ * Its height is the sum of the children plus the dividers.
+ */
+
+ if (horizontal) {
+ largest.width = (children.size() - 1) * divider_width;
+ largest.height = 0;
+ } else {
+ largest.height = (children.size() - 1) * divider_width;
+ largest.width = 0;
+ }
+
+ for (Children::iterator child = children.begin(); child != children.end(); ++child) {
+ GtkRequisition r;
+
+ child->w->size_request (r);
+
+ if (horizontal) {
+ largest.height = max (largest.height, r.height);
+ largest.width += r.width;
+ } else {
+ largest.width = max (largest.width, r.width);
+ largest.height += r.height;
+ }
+ }
+
+ *req = largest;
+}
+
+GType
+Pane::child_type_vfunc() const
+{
+ /* We accept any number of any types of widgets */
+ return Gtk::Widget::get_type();
+}
+
+void
+Pane::add_divider ()
+{
+ Divider* d = new Divider;
+ d->set_name (X_("Divider"));
+ d->signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_press_event), d), false);
+ d->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_release_event), d), false);
+ d->signal_motion_notify_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_motion_event), d), false);
+ d->signal_enter_notify_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_enter_event), d), false);
+ d->signal_leave_notify_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_leave_event), d), false);
+ d->set_parent (*this);
+ d->show ();
+ d->fract = 0.5;
+ dividers.push_back (d);
+}
+
+void
+Pane::handle_child_visibility ()
+{
+ reallocate (get_allocation());
+}
+
+void
+Pane::on_add (Widget* w)
+{
+ children.push_back (Child (this, w, 0));
+
+ w->set_parent (*this);
+ /* Gtkmm 2.4 does not correctly arrange for ::on_remove() to be called
+ for custom containers that derive from Gtk::Container. So ... we need
+ to ensure that we hear about child destruction ourselves.
+ */
+ w->add_destroy_notify_callback (&children.back(), &Pane::notify_child_destroyed);
+
+ w->signal_show().connect (sigc::mem_fun (*this, &Pane::handle_child_visibility));
+ w->signal_hide().connect (sigc::mem_fun (*this, &Pane::handle_child_visibility));
+
+ while (dividers.size() < (children.size() - 1)) {
+ add_divider ();
+ }
+}
+
+void*
+Pane::notify_child_destroyed (void* data)
+{
+ Child* child = reinterpret_cast<Child*> (data);
+ return child->pane->child_destroyed (child->w);
+}
+
+void*
+Pane::child_destroyed (Gtk::Widget* w)
+{
+ for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+ if (c->w == w) {
+ children.erase (c);
+ break;
+ }
+ }
+ return 0;
+}
+
+void
+Pane::on_remove (Widget* w)
+{
+ for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+ if (c->w == w) {
+ w->remove_destroy_notify_callback (&(*c));
+ w->unparent ();
+ children.erase (c);
+ break;
+ }
+ }
+}
+
+void
+Pane::on_size_allocate (Gtk::Allocation& alloc)
+{
+ reallocate (alloc);
+ Container::on_size_allocate (alloc);
+}
+
+void
+Pane::reallocate (Gtk::Allocation const & alloc)
+{
+ int remaining;
+ int xpos = alloc.get_x();
+ int ypos = alloc.get_y();
+ float fract;
+
+ if (children.empty()) {
+ return;
+ }
+
+ if (children.size() == 1) {
+ /* only child gets the full allocation */
+ children.front().w->size_allocate (alloc);
+ return;
+ }
+
+ if (horizontal) {
+ remaining = alloc.get_width ();
+ } else {
+ remaining = alloc.get_height ();
+ }
+
+ Children::iterator child;
+ Children::iterator next;
+ Dividers::iterator div;
+
+ child = children.begin();
+
+ /* skip initial hidden children */
+
+ while (child != children.end()) {
+ if (child->w->is_visible()) {
+ break;
+ }
+ ++child;
+ }
+
+ for (div = dividers.begin(); child != children.end(); ) {
+
+ Gtk::Allocation child_alloc;
+
+ next = child;
+
+ /* Move on to next *visible* child */
+
+ while (++next != children.end()) {
+ if (next->w->is_visible()) {
+ break;
+ }
+ }
+
+ child_alloc.set_x (xpos);
+ child_alloc.set_y (ypos);
+
+ if (next == children.end()) {
+ /* last child gets all the remaining space */
+ fract = 1.0;
+ } else {
+ /* child gets the fraction of the remaining space given by the divider that follows it */
+ fract = (*div)->fract;
+ }
+
+ Gtk::Requisition cr;
+ child->w->size_request (cr);
+
+ if (horizontal) {
+ child_alloc.set_width ((gint) floor (remaining * fract));
+ child_alloc.set_height (alloc.get_height());
+ remaining = max (0, (remaining - child_alloc.get_width()));
+ xpos += child_alloc.get_width();
+ } else {
+ child_alloc.set_width (alloc.get_width());
+ child_alloc.set_height ((gint) floor (remaining * fract));
+ remaining = max (0, (remaining - child_alloc.get_height()));
+ ypos += child_alloc.get_height ();
+ }
+
+ if (child->minsize) {
+ if (horizontal) {
+ child_alloc.set_width (max (child_alloc.get_width(), child->minsize));
+ } else {
+ child_alloc.set_height (max (child_alloc.get_height(), child->minsize));
+ }
+ }
+
+ child->w->size_allocate (child_alloc);
+
+ if (next == children.end()) {
+ /* done, no more children, no need for a divider */
+ break;
+ }
+
+ child = next;
+
+ /* add a divider between children */
+
+ Gtk::Allocation divider_allocation;
+
+ divider_allocation.set_x (xpos);
+ divider_allocation.set_y (ypos);
+
+ if (horizontal) {
+ divider_allocation.set_width (divider_width);
+ divider_allocation.set_height (alloc.get_height());
+ remaining = max (0, remaining - divider_width);
+ xpos += divider_width;
+ } else {
+ divider_allocation.set_width (alloc.get_width());
+ divider_allocation.set_height (divider_width);
+ remaining = max (0, remaining - divider_width);
+ ypos += divider_width;
+ }
+
+ (*div)->size_allocate (divider_allocation);
+ (*div)->show ();
+ ++div;
+ }
+
+ /* hide all remaining dividers */
+
+ while (div != dividers.end()) {
+ (*div)->hide ();
+ ++div;
+ }
+}
+
+bool
+Pane::on_expose_event (GdkEventExpose* ev)
+{
+ Children::iterator child;
+ Dividers::iterator div;
+
+ for (child = children.begin(), div = dividers.begin(); child != children.end(); ++child) {
+
+ if (child->w->is_visible()) {
+ propagate_expose (*(child->w), ev);
+ }
+
+ if (div != dividers.end()) {
+ if ((*div)->is_visible()) {
+ propagate_expose (**div, ev);
+ }
+ ++div;
+ }
+ }
+
+ return true;
+}
+
+bool
+Pane::handle_press_event (GdkEventButton* ev, Divider* d)
+{
+ d->dragging = true;
+ d->queue_draw ();
+
+ return false;
+}
+
+bool
+Pane::handle_release_event (GdkEventButton* ev, Divider* d)
+{
+ d->dragging = false;
+
+ if (did_move && !children.empty()) {
+ children.front().w->queue_resize ();
+ did_move = false;
+ }
+
+ return false;
+}
+void
+Pane::set_check_divider_position (bool yn)
+{
+ check_fract = yn;
+}
+
+bool
+Pane::fract_is_ok (Dividers::size_type div, float fract)
+{
+#ifdef __APPLE__
+ if (!check_fract) {
+ return true;
+ }
+
+
+ if (get_allocation().get_width() == 1 && get_allocation().get_height() == 1) {
+ /* space not * allocated - * divider being set from startup code. Let it pass,
+ since our goal is mostly to catch drags to a position that will interfere with window
+ resizing.
+ */
+ return true;
+ }
+
+ /* On Quartz, if the pane handle (divider) gets to
+ be adjacent to the window edge, you can no longer grab it:
+ any attempt to do so is interpreted by the Quartz window
+ manager ("Finder") as a resize drag on the window edge.
+ */
+
+ if (horizontal) {
+ if (div == dividers.size() - 1) {
+ if (get_allocation().get_width() * (1.0 - fract) < (divider_width*2)) {
+ /* too close to right edge */
+ return false;
+ }
+ }
+
+ if (div == 0) {
+ if (get_allocation().get_width() * fract < (divider_width*2)) {
+ /* too close to left edge */
+ return false;
+ }
+ }
+ } else {
+ if (div == dividers.size() - 1) {
+ if (get_allocation().get_height() * (1.0 - fract) < (divider_width*2)) {
+ /* too close to bottom */
+ return false;
+ }
+ }
+
+ if (div == 0) {
+ if (get_allocation().get_width() * fract < (divider_width*2)) {
+ /* too close to top */
+ return false;
+ }
+ }
+ }
+#endif
+ return true;
+}
+
+bool
+Pane::handle_motion_event (GdkEventMotion* ev, Divider* d)
+{
+ did_move = true;
+
+ if (!d->dragging) {
+ return true;
+ }
+
+ /* determine new position for handle */
+
+ float new_fract;
+ int px, py;
+
+ d->translate_coordinates (*this, ev->x, ev->y, px, py);
+
+ Dividers::iterator prev = dividers.end();
+ Dividers::size_type div = 0;
+
+ for (Dividers::iterator di = dividers.begin(); di != dividers.end(); ++di, ++div) {
+ if (*di == d) {
+ break;
+ }
+ prev = di;
+ }
+
+ int space_remaining;
+ int prev_edge;
+
+ if (horizontal) {
+ if (prev != dividers.end()) {
+ prev_edge = (*prev)->get_allocation().get_x() + (*prev)->get_allocation().get_width();
+ } else {
+ prev_edge = 0;
+ }
+ space_remaining = get_allocation().get_width() - prev_edge;
+ new_fract = (float) (px - prev_edge) / space_remaining;
+ } else {
+ if (prev != dividers.end()) {
+ prev_edge = (*prev)->get_allocation().get_y() + (*prev)->get_allocation().get_height();
+ } else {
+ prev_edge = 0;
+ }
+ space_remaining = get_allocation().get_height() - prev_edge;
+ new_fract = (float) (py - prev_edge) / space_remaining;
+ }
+
+ new_fract = min (1.0f, max (0.0f, new_fract));
+
+ if (!fract_is_ok (div, new_fract)) {
+ return true;
+ }
+
+ if (new_fract != d->fract) {
+ d->fract = new_fract;
+ reallocate (get_allocation ());
+ queue_draw ();
+ }
+
+ return true;
+}
+
+void
+Pane::set_divider (Dividers::size_type div, float fract)
+{
+ Dividers::iterator d = dividers.begin();
+
+ for (d = dividers.begin(); d != dividers.end() && div != 0; ++d, --div) {
+ /* relax */
+ }
+
+ if (d == dividers.end()) {
+ /* caller is trying to set divider that does not exist
+ * yet.
+ */
+ return;
+ }
+
+ fract = max (0.0f, min (1.0f, fract));
+
+ if (!fract_is_ok (div, fract)) {
+ return;
+ }
+
+ if (fract != (*d)->fract) {
+ (*d)->fract = fract;
+ /* our size hasn't changed, but our internal allocations have */
+ reallocate (get_allocation());
+ queue_draw ();
+ }
+}
+
+float
+Pane::get_divider (Dividers::size_type div)
+{
+ Dividers::iterator d = dividers.begin();
+
+ for (d = dividers.begin(); d != dividers.end() && div != 0; ++d, --div) {
+ /* relax */
+ }
+
+ if (d == dividers.end()) {
+ /* caller is trying to set divider that does not exist
+ * yet.
+ */
+ return -1.0f;
+ }
+
+ return (*d)->fract;
+}
+
+void
+Pane::forall_vfunc (gboolean include_internals, GtkCallback callback, gpointer callback_data)
+{
+ /* since the callback could modify the child list(s), make sure we keep
+ * the iterators safe;
+ */
+
+ for (Children::iterator c = children.begin(); c != children.end(); ) {
+ Children::iterator next = c;
+ ++next;
+ callback (c->w->gobj(), callback_data);
+ c = next;
+ }
+
+ if (include_internals) {
+ for (Dividers::iterator d = dividers.begin(); d != dividers.end(); ) {
+ Dividers::iterator next = d;
+ ++next;
+ callback (GTK_WIDGET((*d)->gobj()), callback_data);
+ d = next;
+ }
+ }
+}
+
+Pane::Divider::Divider ()
+ : fract (0.0)
+ , dragging (false)
+{
+ set_events (Gdk::EventMask (Gdk::BUTTON_PRESS|
+ Gdk::BUTTON_RELEASE|
+ Gdk::MOTION_NOTIFY|
+ Gdk::ENTER_NOTIFY|
+ Gdk::LEAVE_NOTIFY));
+}
+
+bool
+Pane::Divider::on_expose_event (GdkEventExpose* ev)
+{
+ Gdk::Color c = (dragging ? get_style()->get_fg (Gtk::STATE_ACTIVE) :
+ get_style()->get_fg (get_state()));
+
+ Cairo::RefPtr<Cairo::Context> draw_context = get_window()->create_cairo_context ();
+ draw_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ draw_context->clip_preserve ();
+ draw_context->set_source_rgba (c.get_red_p(), c.get_green_p(), c.get_blue_p(), 1.0);
+ draw_context->fill ();
+
+ return true;
+}
+
+bool
+Pane::handle_enter_event (GdkEventCrossing*, Divider* d)
+{
+ d->get_window()->set_cursor (drag_cursor);
+ d->set_state (Gtk::STATE_SELECTED);
+ return true;
+}
+
+bool
+Pane::handle_leave_event (GdkEventCrossing*, Divider* d)
+{
+ d->get_window()->set_cursor ();
+ d->set_state (Gtk::STATE_NORMAL);
+ d->queue_draw ();
+ return true;
+}
diff --git a/libs/gtkmm2ext/paths_dialog.cc b/libs/gtkmm2ext/paths_dialog.cc
index f169a5a..2f2ff0c 100644
--- a/libs/gtkmm2ext/paths_dialog.cc
+++ b/libs/gtkmm2ext/paths_dialog.cc
@@ -18,7 +18,7 @@
*/
#include <cstdio>
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/pathexpand.h"
#include "gtkmm2ext/paths_dialog.h"
diff --git a/libs/gtkmm2ext/persistent_tooltip.cc b/libs/gtkmm2ext/persistent_tooltip.cc
index c7cb3f4..d45ef01 100644
--- a/libs/gtkmm2ext/persistent_tooltip.cc
+++ b/libs/gtkmm2ext/persistent_tooltip.cc
@@ -19,16 +19,20 @@
#include <gtkmm/window.h>
#include <gtkmm/label.h>
+#include <gtkmm/settings.h>
#include "gtkmm2ext/persistent_tooltip.h"
#include "pbd/stacktrace.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
using namespace Gtkmm2ext;
+bool PersistentTooltip::_tooltips_enabled = true;
+unsigned int PersistentTooltip::_tooltip_timeout = 500;
+
/** @param target The widget to provide the tooltip for */
PersistentTooltip::PersistentTooltip (Gtk::Widget* target, bool draggable, int margin_y)
: _target (target)
@@ -43,6 +47,7 @@ PersistentTooltip::PersistentTooltip (Gtk::Widget* target, bool draggable, int
target->signal_leave_notify_event().connect (sigc::mem_fun (*this, &PersistentTooltip::leave), false);
target->signal_button_press_event().connect (sigc::mem_fun (*this, &PersistentTooltip::press), false);
target->signal_button_release_event().connect (sigc::mem_fun (*this, &PersistentTooltip::release), false);
+ _tooltip_timeout = Gtk::Settings::get_default()->property_gtk_tooltip_timeout ();
}
PersistentTooltip::~PersistentTooltip ()
@@ -56,7 +61,7 @@ PersistentTooltip::enter (GdkEventCrossing *)
if (_timeout.connected()) {
leave(NULL);
}
- _timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), 500);
+ _timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), _tooltip_timeout);
return false;
}
@@ -115,7 +120,7 @@ PersistentTooltip::hide ()
void
PersistentTooltip::show ()
{
- if (_tip.empty()) {
+ if (_tip.empty() || !_tooltips_enabled) {
return;
}
diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc
index 0c43588..64ee449 100644
--- a/libs/gtkmm2ext/pixfader.cc
+++ b/libs/gtkmm2ext/pixfader.cc
@@ -356,6 +356,9 @@ PixFader::on_size_request (GtkRequisition* req)
void
PixFader::on_size_allocate (Gtk::Allocation& alloc)
{
+ int old_girth = _girth;
+ int old_span = _span;
+
CairoWidget::on_size_allocate(alloc);
if (_orien == VERT) {
@@ -366,7 +369,7 @@ PixFader::on_size_allocate (Gtk::Allocation& alloc)
_span = alloc.get_width ();
}
- if (is_realized()) {
+ if (is_realized() && ((old_girth != _girth) || (old_span != _span))) {
/* recreate patterns in case we've changed size */
create_patterns ();
}
diff --git a/libs/gtkmm2ext/po/cs.mo b/libs/gtkmm2ext/po/cs.mo
new file mode 100644
index 0000000..aa3d1ee
Binary files /dev/null and b/libs/gtkmm2ext/po/cs.mo differ
diff --git a/libs/gtkmm2ext/po/cs.po b/libs/gtkmm2ext/po/cs.po
index 55ff3bb..4392dcd 100644
--- a/libs/gtkmm2ext/po/cs.po
+++ b/libs/gtkmm2ext/po/cs.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2013-06-13 22:33+0200\n"
"Last-Translator: Pavel Fric <pavelfric at seznam.cz>\n"
"Language-Team: Czech <kde-i18n-doc at kde.org>\n"
@@ -17,11 +17,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.5\n"
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr "Neznámý název pro Äinnost: %1"
@@ -41,11 +37,11 @@ msgstr ""
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr "Zápis"
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
@@ -55,65 +51,73 @@ msgstr ""
"\n"
"Kurzbefehl: "
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr "Stisknout pro ukonÄenÃ"
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr "Bohužel to nelze udÄlat, %1"
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr "PÅÃkaz"
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr "Ctrl"
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr "Key|Shift"
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr "Volba"
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
msgid "Alt"
msgstr "Alt"
-#: keyboard.cc:93
-msgid "Meta"
-msgstr "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:152 keyboard.cc:685
msgid "Unknown"
msgstr "Neznámý"
-#: keyboard.cc:551
+#: keyboard.cc:696
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
"Soubor s pÅiÅazenÃm kláves \"%2\"se nepodaÅilo najÃt, nebo obsahuje chyby."
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr ""
-
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
-msgstr ""
-
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
msgstr ""
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
msgstr ""
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
msgstr ""
#: paths_dialog.cc:32
@@ -140,6 +144,9 @@ msgstr "KlepnÄte pro odtrženà do vlastnÃho okna"
msgid "Click to put this back in the main window"
msgstr "KlepnÄte pro ukotvenà do hlavnÃho okna"
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr "ZavÅÃt"
+
+#~ msgid "Meta"
+#~ msgstr "Meta"
diff --git a/libs/gtkmm2ext/po/de.mo b/libs/gtkmm2ext/po/de.mo
new file mode 100644
index 0000000..6b4f324
Binary files /dev/null and b/libs/gtkmm2ext/po/de.mo differ
diff --git a/libs/gtkmm2ext/po/de.po b/libs/gtkmm2ext/po/de.po
index d3b6039..90de990 100644
--- a/libs/gtkmm2ext/po/de.po
+++ b/libs/gtkmm2ext/po/de.po
@@ -1,23 +1,23 @@
# Copyright (C) YEAR "Paul Davis"
# This file is distributed under the same license as the PACKAGE package.
#
-# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2015.
+# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2015, 2016.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-11-11 15:37+0100\n"
-"PO-Revision-Date: 2015-12-09 12:33+0100\n"
-"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
+"POT-Creation-Date: 2016-08-06 14:10+0200\n"
+"PO-Revision-Date: 2016-08-06 15:49+0100\n"
+"Last-Translator: Edgar Aichinger <edgar.aichinger at aon.at>\n"
"Language-Team: German <ardour-dev at lists.ardour.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
-#: actions.cc:519
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr "Unbekannter Aktionsname: %1"
@@ -39,11 +39,11 @@ msgstr "Die Datei mit den Cursor-Hotspot-Infos %1 hat einen Fehler in Zeile %2"
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr "Log"
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
@@ -53,68 +53,75 @@ msgstr ""
"\n"
"Kurzbefehl: "
-#: gtk_ui.cc:670
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr "Zum Beenden drücken"
-#: gtk_ui.cc:706
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr "Leider kann ich das nicht tun, %1"
-#: keyboard.cc:69
+#: keyboard.cc:71
msgid "Command"
msgstr "Befehl"
-#: keyboard.cc:70 keyboard.cc:87
+#: keyboard.cc:72 keyboard.cc:94
msgid "Control"
msgstr "Strg"
-#: keyboard.cc:71 keyboard.cc:89
+#: keyboard.cc:73 keyboard.cc:78 keyboard.cc:96 keyboard.cc:101
msgid "Key|Shift"
-msgstr "Key|Shift"
+msgstr "Umschalt"
-#: keyboard.cc:72
+#: keyboard.cc:74
msgid "Option"
msgstr "Option"
-#: keyboard.cc:88
+#: keyboard.cc:76
+msgid "Cmd"
+msgstr "Cmd"
+
+#: keyboard.cc:77 keyboard.cc:99
+msgid "Ctrl"
+msgstr "Ctrl"
+
+#: keyboard.cc:79
+msgid "Opt"
+msgstr "Alt"
+
+#: keyboard.cc:95 keyboard.cc:100
msgid "Alt"
msgstr "Alt"
-#: keyboard.cc:90
+#: keyboard.cc:97
msgid "Windows"
msgstr "Windows"
-#: keyboard.cc:141 keyboard.cc:580
+#: keyboard.cc:102
+msgid "Win"
+msgstr "Win"
+
+#: keyboard.cc:153 keyboard.cc:628
msgid "Unknown"
msgstr "Unbekannt"
-#: keyboard.cc:591
+#: keyboard.cc:639
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
"Die Tastenkürzel-Datei \"%1\" konnte nicht gefunden werden oder enthält "
"Fehler."
-#: keyboard.cc:642
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr "Kann Ihre eigene Tastaturkürzeldatei nicht umbenennen (%1)"
+#: keyboard.cc:665
+msgid "Keyboard binding found without a name"
+msgstr "Tastenzuordnung ohne Namen gefunden"
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
-msgstr ""
-"motionfeedback: konnte eine Temporärdatei nicht zum Schreiben öffnen: %1"
-
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
-msgstr "motionfeedback: konnte den Satz Bilder nicht in %1 speichern"
-
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr "motionfeedback: abgefangener PixbufError: %1"
+#: keyboard.cc:695
+msgid "Cannot save key bindings to %1"
+msgstr "Kann Tastenzuordnungen nicht nach %1 sichern"
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
-msgstr "motionfeedback: unbekannter Ausnahmefehler"
+#: keyboard.cc:711
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "Kann Ihre eigene Tastaturkürzeldatei nicht umbenennen (%1)"
#: paths_dialog.cc:32
msgid "Add"
@@ -143,3 +150,4 @@ msgstr "Klicken, um an das Hauptfenster anzudocken"
#: textviewer.cc:32
msgid "Close"
msgstr "SchlieÃen"
+
diff --git a/libs/gtkmm2ext/po/el.mo b/libs/gtkmm2ext/po/el.mo
new file mode 100644
index 0000000..2b5e05c
Binary files /dev/null and b/libs/gtkmm2ext/po/el.mo differ
diff --git a/libs/gtkmm2ext/po/el.po b/libs/gtkmm2ext/po/el.po
index c7c5e78..09b13cb 100644
--- a/libs/gtkmm2ext/po/el.po
+++ b/libs/gtkmm2ext/po/el.po
@@ -7,20 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.99beta23\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2005-01-11\n"
"Last-Translator: Muadibas\n"
"Language-Team: Hellenic(Greek) <LL at li.org>\n"
-"Language: \n"
+"Language: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr ""
@@ -40,75 +36,83 @@ msgstr ""
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr ""
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr ""
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr ""
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr ""
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr ""
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr ""
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr ""
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
msgstr ""
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
+#: keyboard.cc:78
+msgid "Opt"
msgstr ""
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
msgstr ""
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
msgstr ""
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
msgstr ""
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
msgstr ""
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
msgstr ""
#: paths_dialog.cc:32
@@ -135,6 +139,6 @@ msgstr ""
msgid "Click to put this back in the main window"
msgstr ""
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr "ÎλείÏιμο"
diff --git a/libs/gtkmm2ext/po/es.mo b/libs/gtkmm2ext/po/es.mo
new file mode 100644
index 0000000..88947ef
Binary files /dev/null and b/libs/gtkmm2ext/po/es.mo differ
diff --git a/libs/gtkmm2ext/po/es.po b/libs/gtkmm2ext/po/es.po
index b844851..f2bdffa 100644
--- a/libs/gtkmm2ext/po/es.po
+++ b/libs/gtkmm2ext/po/es.po
@@ -6,20 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: gtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2013-02-09 16:21+0100\n"
"Last-Translator: Pablo Fernández <pablo.fbus at gmail.com>\n"
"Language-Team: Spanish\n"
-"Language: \n"
+"Language: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr ""
@@ -39,11 +35,11 @@ msgstr ""
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr "Log"
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
@@ -53,66 +49,74 @@ msgstr ""
"\n"
"Atajo: "
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr "Pulse para salir"
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr "Lo siento %1, no puedo hacer eso"
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr ""
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr ""
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr ""
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr "Opción"
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
msgid "Alt"
msgstr ""
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:152 keyboard.cc:685
msgid "Unknown"
msgstr ""
-#: keyboard.cc:551
+#: keyboard.cc:696
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
"El archivo de combinaciones de teclado no se encontró en \"%2\" o contiene "
"errores."
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
msgstr ""
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
msgstr ""
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
-msgstr ""
-
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr ""
-
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
msgstr ""
#: paths_dialog.cc:32
@@ -139,6 +143,6 @@ msgstr "Pulsa para tener esto en su propia ventana"
msgid "Click to put this back in the main window"
msgstr "Pulsa para llevarlo a la ventana principal"
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr "Cerrar"
diff --git a/libs/gtkmm2ext/po/fr.mo b/libs/gtkmm2ext/po/fr.mo
new file mode 100644
index 0000000..c7d2d16
Binary files /dev/null and b/libs/gtkmm2ext/po/fr.mo differ
diff --git a/libs/gtkmm2ext/po/fr.po b/libs/gtkmm2ext/po/fr.po
index 0c1553e..49db41a 100644
--- a/libs/gtkmm2ext/po/fr.po
+++ b/libs/gtkmm2ext/po/fr.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-28 20:55+0100\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2015-03-28 20:57+0100\n"
"Last-Translator: Raphaël Doursenaud <rdoursenaud at free.fr>\n"
"Language-Team: \n"
@@ -18,12 +18,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-Basepath: ../\n"
-#: actions.cc:336
-#, fuzzy
-msgid "programming error: %1"
-msgstr "erreur de programmation : %1"
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr "Nom d'action inconnu : %1"
@@ -43,11 +38,11 @@ msgstr ""
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr "Journal"
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
@@ -57,72 +52,75 @@ msgstr ""
"\n"
"Raccourci : "
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr "Appuyer pour quitter"
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr "Je suis désolé %1, je ne peux pas faire ça"
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr "Commande"
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr "Ctrl"
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr "Maj."
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr "Option"
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
msgid "Alt"
msgstr "Alt"
-#: keyboard.cc:93
-msgid "Meta"
-msgstr "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
msgid "Unknown"
msgstr "Inconnu"
-#: keyboard.cc:551
+#: keyboard.cc:696
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
"fichier de raccourcis claviers contient des erreurs ou introuvable dans "
"« %2 »."
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr "Impossible de renommer votre propre fichier de raccourcis clavier (%1)"
-
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
msgstr ""
-"rétroaction de mouvement : impossible d'ouvrir un fichier temporaire en "
-"écriture : %1"
-# Or is it "image set"?
-#: motionfeedback.cc:516
-#, fuzzy
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
msgstr ""
-"rétroaction de mouvement : impossible de sauvegarder l'image réglée à %1"
-
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr "rétroaction de mouvement : PixbufError attrapée : %1"
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
-msgstr "rétroaction de mouvement : exception inconnue"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "Impossible de renommer votre propre fichier de raccourcis clavier (%1)"
#: paths_dialog.cc:32
msgid "Add"
@@ -148,6 +146,30 @@ msgstr "Cliquez pour afficher dans une fenêtre séparée"
msgid "Click to put this back in the main window"
msgstr "Cliquez pour remettre dans la fenêtre principale"
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr "Fermer"
+
+#, fuzzy
+#~ msgid "programming error: %1"
+#~ msgstr "erreur de programmation : %1"
+
+#~ msgid "Meta"
+#~ msgstr "Meta"
+
+#~ msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#~ msgstr ""
+#~ "rétroaction de mouvement : impossible d'ouvrir un fichier temporaire en "
+#~ "écriture : %1"
+
+# Or is it "image set"?
+#, fuzzy
+#~ msgid "motionfeedback: could not save image set to %1"
+#~ msgstr ""
+#~ "rétroaction de mouvement : impossible de sauvegarder l'image réglée à %1"
+
+#~ msgid "motionfeedback: caught PixbufError: %1"
+#~ msgstr "rétroaction de mouvement : PixbufError attrapée : %1"
+
+#~ msgid "motionfeedback: unknown exception"
+#~ msgstr "rétroaction de mouvement : exception inconnue"
diff --git a/libs/gtkmm2ext/po/nn.mo b/libs/gtkmm2ext/po/nn.mo
new file mode 100644
index 0000000..33ab9ee
Binary files /dev/null and b/libs/gtkmm2ext/po/nn.mo differ
diff --git a/libs/gtkmm2ext/po/nn.po b/libs/gtkmm2ext/po/nn.po
index e33cfbc..d02bf23 100644
--- a/libs/gtkmm2ext/po/nn.po
+++ b/libs/gtkmm2ext/po/nn.po
@@ -8,11 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2013-01-01 20:30+0100\n"
"Last-Translator: Eivind ÃdegÃ¥rd <meinmycell-lists at yahoo.no>\n"
"Language-Team: Nynorsk <i18n-nn at lister.ping.uio.no>\n"
-"Language: \n"
+"Language: Norwegian Nynorsk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -20,11 +20,7 @@ msgstr ""
"X-Poedit-Country: NORWAY\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr ""
@@ -44,75 +40,83 @@ msgstr ""
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr ""
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr ""
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr ""
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr ""
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr ""
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr ""
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr ""
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
msgstr ""
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
-msgstr "Ukjend"
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
msgstr ""
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
msgstr ""
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:101
+msgid "Win"
msgstr ""
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
+msgstr "Ukjend"
+
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
+msgstr ""
+
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
msgstr ""
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
msgstr ""
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
msgstr ""
#: paths_dialog.cc:32
@@ -139,6 +143,6 @@ msgstr ""
msgid "Click to put this back in the main window"
msgstr ""
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr ""
diff --git a/libs/gtkmm2ext/po/pl.mo b/libs/gtkmm2ext/po/pl.mo
new file mode 100644
index 0000000..de5359e
Binary files /dev/null and b/libs/gtkmm2ext/po/pl.mo differ
diff --git a/libs/gtkmm2ext/po/pl.po b/libs/gtkmm2ext/po/pl.po
index 1905a49..ada719f 100644
--- a/libs/gtkmm2ext/po/pl.po
+++ b/libs/gtkmm2ext/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libgtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2008-04-10 10:54+0100\n"
"Last-Translator: Piotr Zaryk <pzaryk at gmail.com>\n"
"Language-Team: Polish <pl at li.org>\n"
@@ -16,11 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr ""
@@ -40,75 +36,83 @@ msgstr ""
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr "Log"
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr "WciÅnij by zakoÅczyÄ"
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr ""
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr ""
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr ""
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr ""
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr ""
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
msgstr ""
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
+#: keyboard.cc:78
+msgid "Opt"
msgstr ""
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
msgstr ""
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
msgstr ""
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
msgstr ""
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
msgstr ""
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
msgstr ""
#: paths_dialog.cc:32
@@ -135,6 +139,6 @@ msgstr ""
msgid "Click to put this back in the main window"
msgstr ""
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr "Zamknij"
diff --git a/libs/gtkmm2ext/po/pt.mo b/libs/gtkmm2ext/po/pt.mo
new file mode 100644
index 0000000..5c966c8
Binary files /dev/null and b/libs/gtkmm2ext/po/pt.mo differ
diff --git a/libs/gtkmm2ext/po/pt.po b/libs/gtkmm2ext/po/pt.po
index 4761f05..d79566a 100644
--- a/libs/gtkmm2ext/po/pt.po
+++ b/libs/gtkmm2ext/po/pt.po
@@ -7,20 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: gtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2004-05-17 20:36+0200\n"
"Last-Translator: Chris Ross <chris.ross at tebibyte.org>\n"
"Language-Team: Portuguese\n"
-"Language: \n"
+"Language: Portugese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr ""
@@ -40,75 +36,83 @@ msgstr ""
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr ""
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr ""
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr ""
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr ""
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr ""
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr ""
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr ""
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
msgstr ""
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
+#: keyboard.cc:78
+msgid "Opt"
msgstr ""
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
msgstr ""
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
msgstr ""
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
msgstr ""
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
msgstr ""
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
msgstr ""
#: paths_dialog.cc:32
@@ -135,6 +139,6 @@ msgstr ""
msgid "Click to put this back in the main window"
msgstr ""
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr "Fechar"
diff --git a/libs/gtkmm2ext/po/ru.mo b/libs/gtkmm2ext/po/ru.mo
new file mode 100644
index 0000000..681e373
Binary files /dev/null and b/libs/gtkmm2ext/po/ru.mo differ
diff --git a/libs/gtkmm2ext/po/ru.po b/libs/gtkmm2ext/po/ru.po
index b89d478..e4c5a7b 100644
--- a/libs/gtkmm2ext/po/ru.po
+++ b/libs/gtkmm2ext/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-23 23:09+0300\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
"PO-Revision-Date: 2014-10-10 23:22+0300\n"
"Last-Translator: ÐлекÑÐ°Ð½Ð´Ñ ÐолÑÑов <ag1455 at mail.ru>\n"
"Language-Team: ÑÑÑÑкий <ru>\n"
@@ -20,11 +20,7 @@ msgstr ""
"%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 1.5.4\n"
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr "пÑогÑÐ°Ð¼Ð¼Ð½Ð°Ñ Ð¾Ñибка: %1"
-
-#: actions.cc:511
+#: actions.cc:261
msgid "Unknown action name: %1"
msgstr "ÐеизвеÑÑное название дейÑÑвиÑ: %1"
@@ -44,11 +40,11 @@ msgstr "ÐнÑоÑмаÑионнÑй Ñайл кÑÑÑоÑа гоÑÑÑиÑ
Ñо
msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
msgstr ""
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
msgid "Log"
msgstr "ÐÑÑнал"
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
msgid ""
"\n"
"\n"
@@ -58,65 +54,73 @@ msgstr ""
"\n"
"ÐомбинаÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ: "
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
msgid "Press To Exit"
msgstr "ÐажмиÑе Ð´Ð»Ñ Ð²ÑÑ
ода"
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
msgid "I'm sorry %1, I can't do that"
msgstr "ÐÑоÑÑиÑе, %1, Ñ Ð½Ðµ Ð¼Ð¾Ð³Ñ ÑÑого ÑделаÑÑ"
-#: keyboard.cc:73
+#: keyboard.cc:70
msgid "Command"
msgstr "Ðоманда"
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
msgid "Control"
msgstr "Ctrl"
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
msgid "Key|Shift"
msgstr "Shift"
-#: keyboard.cc:76
+#: keyboard.cc:73
msgid "Option"
msgstr "ÐпÑии"
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
msgid "Alt"
msgstr "Alt"
-#: keyboard.cc:93
-msgid "Meta"
-msgstr "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:152 keyboard.cc:685
msgid "Unknown"
msgstr "ÐеизвеÑÑно"
-#: keyboard.cc:551
+#: keyboard.cc:696
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr "Файл пÑивÑзки ÐºÐ»Ð°Ð²Ð¸Ñ Ð½Ðµ найден в \"% 2 \" или ÑодеÑÐ¶Ð¸Ñ Ð¾Ñибки."
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr "Ðевозможно пеÑеименоваÑÑ Ð²Ð°Ñ ââÑайл биндинга ÐºÐ»Ð°Ð²Ð¸Ñ (%1)"
-
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
-msgstr "motionfeedback: не ÑдалоÑÑ Ð¾ÑкÑÑÑÑ Ð²ÑеменнÑй Ñайл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: %1"
-
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
-msgstr "motionfeedback: невозможно ÑоÑ
ÑаниÑÑ ÑÑÑановки изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
+msgstr ""
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr "motionfeedback: PixbufError поймал: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
+msgstr ""
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
-msgstr "motionfeedback: неизвеÑÑное иÑклÑÑение"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "Ðевозможно пеÑеименоваÑÑ Ð²Ð°Ñ ââÑайл биндинга ÐºÐ»Ð°Ð²Ð¸Ñ (%1)"
#: paths_dialog.cc:32
msgid "Add"
@@ -142,6 +146,24 @@ msgstr "ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð¿ÑевÑаÑиÑÑ ÑÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð¸
msgid "Click to put this back in the main window"
msgstr "ЩÑлкниÑе, ÑÑÐ¾Ð±Ñ Ð¿ÑевÑаÑиÑÑ ÑÑо плаваÑÑее окно в Ð¿Ð°Ð½ÐµÐ»Ñ Ð¸Ð½ÑÑÑÑменÑов"
-#: textviewer.cc:34
+#: textviewer.cc:32
msgid "Close"
msgstr "ÐакÑÑÑÑ"
+
+#~ msgid "programming error: %1"
+#~ msgstr "пÑогÑÐ°Ð¼Ð¼Ð½Ð°Ñ Ð¾Ñибка: %1"
+
+#~ msgid "Meta"
+#~ msgstr "Meta"
+
+#~ msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#~ msgstr "motionfeedback: не ÑдалоÑÑ Ð¾ÑкÑÑÑÑ Ð²ÑеменнÑй Ñайл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: %1"
+
+#~ msgid "motionfeedback: could not save image set to %1"
+#~ msgstr "motionfeedback: невозможно ÑоÑ
ÑаниÑÑ ÑÑÑановки изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² %1"
+
+#~ msgid "motionfeedback: caught PixbufError: %1"
+#~ msgstr "motionfeedback: PixbufError поймал: %1"
+
+#~ msgid "motionfeedback: unknown exception"
+#~ msgstr "motionfeedback: неизвеÑÑное иÑклÑÑение"
diff --git a/libs/gtkmm2ext/po/zh.mo b/libs/gtkmm2ext/po/zh.mo
new file mode 100644
index 0000000..81de1f1
Binary files /dev/null and b/libs/gtkmm2ext/po/zh.mo differ
diff --git a/libs/gtkmm2ext/po/zh.po b/libs/gtkmm2ext/po/zh.po
new file mode 100644
index 0000000..c86bfcb
--- /dev/null
+++ b/libs/gtkmm2ext/po/zh.po
@@ -0,0 +1,160 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+# ä¸åé±¼ <YQ-YSY at 163.com> ç¿»è¯äº 2016-03-27
+msgid ""
+msgstr ""
+"Project-Id-Version: Ardour 4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
+"PO-Revision-Date: 2016-03-27 10:27+0800\n"
+"Last-Translator: ä¸åé±¼ <YQ-YSY at 163.com>\n"
+"Language-Team: ä¸åé±¼ YQ-YSY at 163.com\n"
+"Language: zh\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.4\n"
+
+#: actions.cc:261
+msgid "Unknown action name: %1"
+msgstr "æªç¥çå¨ä½åç§°ï¼%1"
+
+#: binding_proxy.cc:81
+msgid "operate controller now"
+msgstr "æä½æ§å¶å¨ç°ç¶"
+
+#: bindable_button.cc:48
+msgid "button cannot watch state of non-existing Controllable\n"
+msgstr "æé®æ æ³è§å¯éåå¨ç坿§ç¶æ\n"
+
+#: cursors.cc:82
+msgid "cursor hotspots info file %1 has an error on line %2"
+msgstr "游æ çç¹ä¿¡æ¯æä»¶ %1 å¨çº¿è·¯ %2 䏿ä¸ä¸ªé误"
+
+#: emscale.cc:52
+msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+#: gtk_ui.cc:119
+msgid "Log"
+msgstr "æ¥å¿"
+
+#: gtk_ui.cc:388
+msgid ""
+"\n"
+"\n"
+"Shortcut: "
+msgstr ""
+"\n"
+"\n"
+"å¿«æ·é®ï¼"
+
+#: gtk_ui.cc:688
+msgid "Press To Exit"
+msgstr "æä¸éåº"
+
+#: gtk_ui.cc:724
+msgid "I'm sorry %1, I can't do that"
+msgstr "对ä¸èµ· %1ï¼æä¸è½é£æ ·å"
+
+#: keyboard.cc:70
+msgid "Command"
+msgstr "å½ä»¤"
+
+#: keyboard.cc:71 keyboard.cc:93
+msgid "Control"
+msgstr ""
+
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
+msgid "Key|Shift"
+msgstr "é®|Shift"
+
+#: keyboard.cc:73
+msgid "Option"
+msgstr "é项"
+
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
+msgstr ""
+
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
+msgstr "æªç¥"
+
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
+msgstr "å¨ \"%2\" æ¾ä¸å°æé®ç»å®æä»¶æè
å
嫿é误ã"
+
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
+msgstr "é®çç»å®æªåç°ä¸ä¸ªåç§°"
+
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
+msgstr "æ æ³ä¿åæé®ç»å®å° %1"
+
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "æ æ³éå½åæ¨èªå·±çæé®ç»å®æä»¶ï¼%1ï¼"
+
+#: paths_dialog.cc:32
+msgid "Add"
+msgstr "æ·»å "
+
+#: paths_dialog.cc:33
+msgid "Delete"
+msgstr "å é¤"
+
+#: paths_dialog.cc:34
+msgid "Reset to Default"
+msgstr "é置为é»è®¤"
+
+#: paths_dialog.cc:109
+msgid "Add folder to search path"
+msgstr "æ·»å æä»¶å¤¹å°æç´¢è·¯å¾"
+
+#: tearoff.cc:57
+msgid "Click to tear this into its own window"
+msgstr "ç¹å»å¯æè¿ä¸ªæè§£å°å®èªå·±ççªå£ä¸"
+
+#: tearoff.cc:63
+msgid "Click to put this back in the main window"
+msgstr "ç¹å»å¯æè¿ä¸ªæ¾åå°ä¸»çªå£ä¸"
+
+#: textviewer.cc:32
+msgid "Close"
+msgstr "å
³é"
+
+#~ msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#~ msgstr "è¿å¨åé¦ï¼æå¼ä¸ä¸ªç¨äºåå
¥çæ¨¡æ¿æä»¶å¤±è´¥ï¼%1"
+
+#~ msgid "motionfeedback: could not save image set to %1"
+#~ msgstr "è¿å¨åé¦ï¼æ æ³ä¿åå¾åè®¾ç½®å° %1"
+
+#~ msgid "motionfeedback: caught PixbufError: %1"
+#~ msgstr "è¿å¨åé¦ï¼ææå° Pixbuf é误ï¼%1"
+
+#~ msgid "motionfeedback: unknown exception"
+#~ msgstr "è¿å¨åé¦ï¼æªç¥å¼å¸¸"
diff --git a/libs/gtkmm2ext/prompter.cc b/libs/gtkmm2ext/prompter.cc
index 1f5e13b..51628ab 100644
--- a/libs/gtkmm2ext/prompter.cc
+++ b/libs/gtkmm2ext/prompter.cc
@@ -25,7 +25,7 @@
#include <gtkmm/stock.h>
#include <gtkmm2ext/prompter.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtkmm2ext;
diff --git a/libs/gtkmm2ext/searchbar.cc b/libs/gtkmm2ext/searchbar.cc
new file mode 100644
index 0000000..6bfb7e0
--- /dev/null
+++ b/libs/gtkmm2ext/searchbar.cc
@@ -0,0 +1,93 @@
+#include "gtkmm2ext/searchbar.h"
+#include "gtkmm2ext/keyboard.h"
+#include <iostream>
+
+namespace Gtkmm2ext {
+
+SearchBar::SearchBar (const std::string& label, bool icon_resets)
+ : placeholder_text (label)
+ , icon_click_resets (icon_resets)
+{
+ set_text (placeholder_text);
+ set_alignment (Gtk::ALIGN_CENTER);
+ signal_key_press_event().connect (sigc::mem_fun (*this, &SearchBar::key_press_event));
+ signal_focus_in_event().connect (sigc::mem_fun (*this, &SearchBar::focus_in_event));
+ signal_focus_out_event().connect (sigc::mem_fun (*this, &SearchBar::focus_out_event));
+ signal_changed().connect (sigc::mem_fun (*this, &SearchBar::search_string_changed));
+ signal_icon_release().connect (sigc::mem_fun (*this, &SearchBar::icon_clicked_event));
+}
+
+bool
+SearchBar::focus_in_event (GdkEventFocus*)
+{
+ if (get_text ().compare (placeholder_text) == 0) {
+ set_text ("");
+ }
+
+ icon = get_icon_pixbuf ();
+ if (icon) {
+ set_icon_from_pixbuf (Glib::RefPtr<Gdk::Pixbuf> ());
+ }
+ return true;
+}
+
+bool
+SearchBar::focus_out_event (GdkEventFocus*)
+{
+ if (get_text ().empty ()) {
+ set_text (placeholder_text);
+ }
+
+ if (icon) {
+ set_icon_from_pixbuf (icon);
+ icon.reset ();
+ }
+
+ search_string_changed ();
+ return false;
+}
+
+bool
+SearchBar::key_press_event (GdkEventKey* ev)
+{
+ switch (ev->keyval) {
+ case GDK_Escape:
+ set_text (placeholder_text);
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
+void
+SearchBar::icon_clicked_event (Gtk::EntryIconPosition, const GdkEventButton*)
+{
+ if (icon_click_resets) {
+ reset ();
+ }
+ else {
+ search_string_changed ();
+ }
+}
+
+void
+SearchBar::search_string_changed () const
+{
+ const std::string& text = get_text ();
+ if (text.empty() || text.compare (placeholder_text) == 0) {
+ sig_search_string_updated ("");
+ return;
+ }
+ sig_search_string_updated (text);
+}
+
+void
+SearchBar::reset ()
+{
+ set_text (placeholder_text);
+ search_string_changed ();
+}
+
+}
\ No newline at end of file
diff --git a/libs/gtkmm2ext/slider_controller.cc b/libs/gtkmm2ext/slider_controller.cc
index f0ad19d..9b55efb 100644
--- a/libs/gtkmm2ext/slider_controller.cc
+++ b/libs/gtkmm2ext/slider_controller.cc
@@ -24,7 +24,7 @@
#include <gtkmm2ext/slider_controller.h>
#include "pbd/controllable.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace PBD;
diff --git a/libs/gtkmm2ext/tabbable.cc b/libs/gtkmm2ext/tabbable.cc
new file mode 100644
index 0000000..5e47524
--- /dev/null
+++ b/libs/gtkmm2ext/tabbable.cc
@@ -0,0 +1,384 @@
+/*
+ Copyright (C) 2015 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <gtkmm/action.h>
+#include <gtkmm/notebook.h>
+#include <gtkmm/window.h>
+#include <gtkmm/stock.h>
+
+#include "gtkmm2ext/tabbable.h"
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/visibility_tracker.h"
+
+#include "pbd/stacktrace.h"
+
+#include "pbd/i18n.h"
+
+using namespace Gtkmm2ext;
+using namespace Gtk;
+using std::string;
+
+Tabbable::Tabbable (Widget& w, const string& name)
+ : WindowProxy (name)
+ , _contents (w)
+ , _parent_notebook (0)
+ , tab_requested_by_state (true)
+{
+}
+
+Tabbable::~Tabbable ()
+{
+ if (_window) {
+ delete _window;
+ _window = 0;
+ }
+}
+
+void
+Tabbable::add_to_notebook (Notebook& notebook, const string& tab_title)
+{
+ _parent_notebook = ¬ebook;
+
+ if (tab_requested_by_state) {
+ attach ();
+ }
+}
+
+Window*
+Tabbable::use_own_window (bool and_pack_it)
+{
+ Gtk::Window* win = get (true);
+
+ if (and_pack_it) {
+ Gtk::Container* parent = _contents.get_parent();
+ if (parent) {
+ parent->remove (_contents);
+ }
+ _own_notebook.append_page (_contents);
+ }
+
+ return win;
+
+}
+
+bool
+Tabbable::window_visible () const
+{
+ if (!_window) {
+ return false;
+ }
+
+ return _window->is_visible();
+}
+
+Window*
+Tabbable::get (bool create)
+{
+ if (_window) {
+ return _window;
+ }
+
+ if (!create) {
+ return 0;
+ }
+
+ /* From here on, we're creating the window
+ */
+
+ if ((_window = new Window (WINDOW_TOPLEVEL)) == 0) {
+ return 0;
+ }
+
+ _window->add (_own_notebook);
+ _own_notebook.show ();
+ _own_notebook.set_show_tabs (false);
+
+ _window->signal_map().connect (sigc::mem_fun (*this, &Tabbable::window_mapped));
+ _window->signal_unmap().connect (sigc::mem_fun (*this, &Tabbable::window_unmapped));
+
+ /* do other window-related setup */
+
+ setup ();
+
+ /* window should be ready for derived classes to do something with it */
+
+ return _window;
+}
+
+void
+Tabbable::show_own_window (bool and_pack_it)
+{
+ Gtk::Widget* parent = _contents.get_parent();
+ Gtk::Allocation alloc;
+
+ if (parent) {
+ alloc = parent->get_allocation();
+ }
+
+ (void) use_own_window (and_pack_it);
+
+ if (parent) {
+ _window->set_default_size (alloc.get_width(), alloc.get_height());
+ }
+
+ tab_requested_by_state = false;
+
+ _window->present ();
+}
+
+Gtk::Notebook*
+Tabbable::tab_root_drop ()
+{
+ /* This is called after a drop of a tab onto the root window. Its
+ * responsibility xois to return the notebook that this Tabbable's
+ * contents should be packed into before the drop handling is
+ * completed. It is not responsible for actually taking care of this
+ * packing.
+ */
+
+ show_own_window (false);
+ return &_own_notebook;
+}
+
+void
+Tabbable::show_window ()
+{
+ make_visible ();
+
+ if (_window && (current_toplevel() == _window)) {
+ if (!_visible) { /* was hidden, update status */
+ set_pos_and_size ();
+ }
+ }
+}
+
+/** If this Tabbable is currently parented by a tab, ensure that the tab is the
+ * current one. If it is parented by a window, then toggle the visibility of
+ * that window.
+ */
+void
+Tabbable::change_visibility ()
+{
+ if (tabbed()) {
+ _parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
+ return;
+ }
+
+ if (tab_requested_by_state) {
+ /* should be tabbed, but currently isn't parented by a notebook */
+ return;
+ }
+
+ if (_window && (current_toplevel() == _window)) {
+ /* Use WindowProxy method which will rotate then hide */
+ toggle();
+ }
+}
+
+void
+Tabbable::make_visible ()
+{
+ if (_window && (current_toplevel() == _window)) {
+ set_pos ();
+ _window->present ();
+ } else {
+
+ if (!tab_requested_by_state) {
+ show_own_window (true);
+ } else {
+ show_tab ();
+ }
+ }
+}
+
+void
+Tabbable::make_invisible ()
+{
+ if (_window && (current_toplevel() == _window)) {
+ _window->hide ();
+ } else {
+ hide_tab ();
+ }
+}
+
+void
+Tabbable::detach ()
+{
+ show_own_window (true);
+}
+
+void
+Tabbable::attach ()
+{
+ if (!_parent_notebook) {
+ return;
+ }
+
+ if (tabbed()) {
+ /* already tabbed */
+ return;
+ }
+
+
+ if (_window && current_toplevel() == _window) {
+ /* unpack Tabbable from parent, put it back in the main tabbed
+ * notebook
+ */
+
+ save_pos_and_size ();
+
+ _contents.get_parent()->remove (_contents);
+
+ /* leave the window around */
+
+ _window->hide ();
+ }
+
+ _parent_notebook->append_page (_contents);
+ _parent_notebook->set_tab_detachable (_contents);
+ _parent_notebook->set_tab_reorderable (_contents);
+ _parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
+
+ /* have to force this on, which is semantically correct, since
+ * the user has effectively asked for it.
+ */
+
+ tab_requested_by_state = true;
+ StateChange (*this);
+}
+
+bool
+Tabbable::delete_event_handler (GdkEventAny *ev)
+{
+ _window->hide();
+
+ return true;
+}
+
+bool
+Tabbable::tabbed () const
+{
+ if (_window && (current_toplevel() == _window)) {
+ return false;
+ }
+
+ if (_parent_notebook && (_parent_notebook->page_num (_contents) >= 0)) {
+ return true;
+ }
+
+ return false;
+}
+
+void
+Tabbable::hide_tab ()
+{
+ if (tabbed()) {
+ _parent_notebook->remove_page (_contents);
+ StateChange (*this);
+ }
+}
+
+void
+Tabbable::show_tab ()
+{
+ if (!window_visible() && _parent_notebook) {
+ if (_contents.get_parent() == 0) {
+ tab_requested_by_state = true;
+ add_to_notebook (*_parent_notebook, _tab_title);
+ }
+ _parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
+ current_toplevel()->present ();
+ }
+}
+
+Gtk::Window*
+Tabbable::current_toplevel () const
+{
+ return dynamic_cast<Gtk::Window*> (contents().get_toplevel());
+}
+
+string
+Tabbable::xml_node_name()
+{
+ return WindowProxy::xml_node_name();
+}
+
+bool
+Tabbable::tabbed_by_default() const
+{
+ return tab_requested_by_state;
+}
+
+XMLNode&
+Tabbable::get_state()
+{
+ XMLNode& node (WindowProxy::get_state());
+
+ node.add_property (X_("tabbed"), tabbed() ? X_("yes") : X_("no"));
+
+ return node;
+}
+
+int
+Tabbable::set_state (const XMLNode& node, int version)
+{
+ int ret;
+
+ if ((ret = WindowProxy::set_state (node, version)) != 0) {
+ return ret;
+ }
+
+ if (_visible) {
+ show_own_window (true);
+ }
+
+ XMLNodeList children = node.children ();
+ XMLNode* window_node = node.child ("Window");
+
+ if (window_node) {
+ XMLProperty const * prop = window_node->property (X_("tabbed"));
+ if (prop) {
+ tab_requested_by_state = PBD::string_is_affirmative (prop->value());
+ }
+ }
+
+ if (!_visible) {
+ if (tab_requested_by_state) {
+ attach ();
+ } else {
+ /* this does nothing if not tabbed */
+ hide_tab ();
+ }
+ }
+
+ return ret;
+}
+
+void
+Tabbable::window_mapped ()
+{
+ StateChange (*this);
+}
+
+void
+Tabbable::window_unmapped ()
+{
+ StateChange (*this);
+}
diff --git a/libs/gtkmm2ext/tearoff.cc b/libs/gtkmm2ext/tearoff.cc
index dbe5c3d..bb30e56 100644
--- a/libs/gtkmm2ext/tearoff.cc
+++ b/libs/gtkmm2ext/tearoff.cc
@@ -26,7 +26,7 @@
#include "gtkmm2ext/tearoff.h"
#include "gtkmm2ext/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace Gtkmm2ext;
using namespace Gtk;
@@ -286,7 +286,7 @@ void
TearOff::set_state (const XMLNode& node)
{
Glib::RefPtr<Gdk::Window> win;
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property (X_("tornoff"))) == 0) {
return;
diff --git a/libs/gtkmm2ext/textviewer.cc b/libs/gtkmm2ext/textviewer.cc
index 7de9b02..22c26aa 100644
--- a/libs/gtkmm2ext/textviewer.cc
+++ b/libs/gtkmm2ext/textviewer.cc
@@ -20,7 +20,7 @@
#include <string>
#include <gtkmm2ext/textviewer.h>
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtkmm2ext;
diff --git a/libs/gtkmm2ext/utils.cc b/libs/gtkmm2ext/utils.cc
index a7790e6..2b3a29f 100644
--- a/libs/gtkmm2ext/utils.cc
+++ b/libs/gtkmm2ext/utils.cc
@@ -31,10 +31,12 @@
#include <gtkmm/label.h>
#include <gtkmm/comboboxtext.h>
#include <gtkmm/tooltip.h>
+#include <gtkmm/menuitem.h>
#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/persistent_tooltip.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
@@ -272,6 +274,18 @@ Gtkmm2ext::pixbuf_from_string(const string& name, const Pango::FontDescription&
return *empty_pixbuf;
}
+ if (clip_width <= 0 || clip_height <= 0) {
+ /* negative values mean padding around natural size */
+ int width, height;
+ pixel_size (name, font, width, height);
+ if (clip_width <= 0) {
+ clip_width = width - clip_width;
+ }
+ if (clip_height <= 0) {
+ clip_height = height - clip_height;
+ }
+ }
+
Glib::RefPtr<Gdk::Pixbuf> buf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, true, 8, clip_width, clip_height);
cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, clip_width, clip_height);
@@ -296,6 +310,113 @@ Gtkmm2ext::pixbuf_from_string(const string& name, const Pango::FontDescription&
}
void
+Gtkmm2ext::position_menu_anchored (const Gtk::Menu* const menu,
+ Gtk::Widget* const anchor,
+ const std::string& selected,
+ int& x, int& y, bool& push_in) {
+ using namespace Gdk;
+ using namespace Gtk;
+ using namespace Gtk::Menu_Helpers;
+
+ /* TODO: lacks support for rotated dropdown buttons */
+
+ if (!anchor->has_screen () || !anchor->get_has_window ()) {
+ return;
+ }
+
+ Rectangle monitor;
+ {
+ const int monitor_num = anchor->get_screen ()->get_monitor_at_window (
+ anchor->get_window ());
+ anchor->get_screen ()->get_monitor_geometry (
+ (monitor_num < 0) ? 0 : monitor_num, monitor);
+ }
+
+ const Requisition menu_req = menu->size_request();
+ const Rectangle allocation = anchor->get_allocation();
+
+ /* The x and y position are handled separately.
+ *
+ * For the x position if the direction is LTR (or RTL), then we try in order:
+ * a) align the left (right) of the menu with the left (right) of the button
+ * if there's enough room until the right (left) border of the screen;
+ * b) align the right (left) of the menu with the right (left) of the button
+ * if there's enough room until the left (right) border of the screen;
+ * c) align the right (left) border of the menu with the right (left) border
+ * of the screen if there's enough space;
+ * d) align the left (right) border of the menu with the left (right) border
+ * of the screen, with the rightmost (leftmost) part of the menu that
+ * overflows the screen.
+ * XXX We always align left regardless of the direction because if x is
+ * left of the current monitor, the menu popup code after us notices it
+ * and enforces that the menu stays in the monitor that's at the left...*/
+
+ anchor->get_window ()->get_origin (x, y);
+
+ if (anchor->get_direction() == TEXT_DIR_RTL) {
+ if (monitor.get_x() <= x + allocation.get_width() - menu_req.width) {
+ /* a) align menu right and button right */
+ x += allocation.get_width() - menu_req.width;
+ } else if (x + menu_req.width <= monitor.get_x() + monitor.get_width()) {
+ /* b) align menu left and button left: nothing to do*/
+ } else if (menu_req.width > monitor.get_width()) {
+ /* c) align menu left and screen left, guaranteed to fit */
+ x = monitor.get_x();
+ } else {
+ /* d) XXX align left or the menu might change monitors */
+ x = monitor.get_x();
+ }
+ } else { /* LTR */
+ if (x + menu_req.width <= monitor.get_x() + monitor.get_width()) {
+ /* a) align menu left and button left: nothing to do*/
+ } else if (monitor.get_x() <= x + allocation.get_width() - menu_req.width) {
+ /* b) align menu right and button right */
+ x += allocation.get_width() - menu_req.width;
+ } else if (menu_req.width > monitor.get_width()) {
+ /* c) align menu right and screen right, guaranteed to fit */
+ x = monitor.get_x() + monitor.get_width() - menu_req.width;
+ } else {
+ /* d) align left */
+ x = monitor.get_x();
+ }
+ }
+
+ /* For the y position, try in order:
+ * a) if there is a menu item with the same text as the button, align it
+ * with the button, unless that makes the menu overflow the monitor.
+ * b) align the top of the menu with the bottom of the button if there is
+ * enough room below the button;
+ * c) align the bottom of the menu with the top of the button if there is
+ * enough room above the button;
+ * d) align the bottom of the menu with the bottom of the monitor if there
+ * is enough room, but avoid moving the menu to another monitor */
+
+ const MenuList& items = menu->items ();
+ int offset = 0;
+
+ MenuList::const_iterator i = items.begin();
+ for ( ; i != items.end(); ++i) {
+ if (selected == ((std::string) i->get_label())) {
+ break;
+ }
+ offset += i->size_request().height;
+ }
+ if (i != items.end() &&
+ y - offset >= monitor.get_y() &&
+ y - offset + menu_req.height <= monitor.get_y() + monitor.get_height()) {
+ y -= offset;
+ } else if (y + allocation.get_height() + menu_req.height <= monitor.get_y() + monitor.get_height()) {
+ y += allocation.get_height(); /* a) */
+ } else if ((y - menu_req.height) >= monitor.get_y()) {
+ y -= menu_req.height; /* b) */
+ } else {
+ y = monitor.get_y() + max(0, monitor.get_height() - menu_req.height);
+ }
+
+ push_in = false;
+}
+
+void
Gtkmm2ext::set_popdown_strings (Gtk::ComboBoxText& cr, const vector<string>& strings)
{
vector<string>::const_iterator i;
@@ -382,30 +503,6 @@ Gtkmm2ext::detach_menu (Gtk::Menu& menu)
}
bool
-Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator (GdkModifierType& mod)
-{
-#ifdef GTKOSX
- /* GTK on OS X is currently (February 2012) setting both
- the Meta and Mod2 bits in the event modifier state if
- the Command key is down.
-
- gtk_accel_groups_activate() does not invoke any of the logic
- that gtk_window_activate_key() will that sorts out that stupid
- state of affairs, and as a result it fails to find a match
- for the key event and the current set of accelerators.
-
- to fix this, if the meta bit is set, remove the mod2 bit
- from the modifier. this assumes that our bindings use Primary
- which will have set the meta bit in the accelerator entry.
- */
- if (mod & GDK_META_MASK) {
- mod = GdkModifierType (mod & ~GDK_MOD2_MASK);
- }
-#endif
- return true;
-}
-
-bool
Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval)
{
int fakekey = GDK_VoidSymbol;
@@ -702,7 +799,7 @@ Gtkmm2ext::window_to_draw_on (Gtk::Widget& w, Gtk::Widget** parent)
}
int
-Gtkmm2ext::pixel_width (const string& str, Pango::FontDescription& font)
+Gtkmm2ext::pixel_width (const string& str, const Pango::FontDescription& font)
{
Glib::RefPtr<Pango::Context> context = Glib::wrap (gdk_pango_context_get());
Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (context);
@@ -730,7 +827,7 @@ Gtkmm2ext::pixel_width (const string& str, Pango::FontDescription& font)
}
void
-Gtkmm2ext::pixel_size (const string& str, Pango::FontDescription& font, int& width, int& height)
+Gtkmm2ext::pixel_size (const string& str, const Pango::FontDescription& font, int& width, int& height)
{
Gtk::Label foo;
Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout ("");
@@ -756,9 +853,9 @@ Gtkmm2ext::fit_to_pixels (const string& str, int pixel_width, Pango::FontDescrip
layout->set_width (pixel_width * PANGO_SCALE);
if (with_ellipses) {
- layout->set_ellipsize (Pango::ELLIPSIZE_END);
+ layout->set_ellipsize (Pango::ELLIPSIZE_END);
} else {
- layout->set_wrap (Pango::WRAP_CHAR);
+ layout->set_wrap (Pango::WRAP_CHAR);
}
line = layout->get_line (0);
@@ -848,12 +945,14 @@ void
Gtkmm2ext::enable_tooltips ()
{
gtk_rc_parse_string ("gtk-enable-tooltips = 1");
+ PersistentTooltip::set_tooltips_enabled (true);
}
void
Gtkmm2ext::disable_tooltips ()
{
gtk_rc_parse_string ("gtk-enable-tooltips = 0");
+ PersistentTooltip::set_tooltips_enabled (false);
}
bool
@@ -1001,3 +1100,81 @@ Gtkmm2ext::add_volume_shortcuts (Gtk::FileChooser& c)
}
#endif
}
+
+float
+Gtkmm2ext::paned_position_as_fraction (Gtk::Paned& paned, bool h)
+{
+ const guint pos = gtk_paned_get_position (const_cast<GtkPaned*>(static_cast<const Gtk::Paned*>(&paned)->gobj()));
+ return (double) pos / (h ? paned.get_allocation().get_height() : paned.get_allocation().get_width());
+}
+
+void
+Gtkmm2ext::paned_set_position_as_fraction (Gtk::Paned& paned, float fraction, bool h)
+{
+ gint v = (h ? paned.get_allocation().get_height() : paned.get_allocation().get_width());
+
+ if (v < 1) {
+ return;
+ }
+
+ paned.set_position ((guint) floor (fraction * v));
+}
+
+string
+Gtkmm2ext::show_gdk_event_state (int state)
+{
+ string s;
+ if (state & GDK_SHIFT_MASK) {
+ s += "+SHIFT";
+ }
+ if (state & GDK_LOCK_MASK) {
+ s += "+LOCK";
+ }
+ if (state & GDK_CONTROL_MASK) {
+ s += "+CONTROL";
+ }
+ if (state & GDK_MOD1_MASK) {
+ s += "+MOD1";
+ }
+ if (state & GDK_MOD2_MASK) {
+ s += "+MOD2";
+ }
+ if (state & GDK_MOD3_MASK) {
+ s += "+MOD3";
+ }
+ if (state & GDK_MOD4_MASK) {
+ s += "+MOD4";
+ }
+ if (state & GDK_MOD5_MASK) {
+ s += "+MOD5";
+ }
+ if (state & GDK_BUTTON1_MASK) {
+ s += "+BUTTON1";
+ }
+ if (state & GDK_BUTTON2_MASK) {
+ s += "+BUTTON2";
+ }
+ if (state & GDK_BUTTON3_MASK) {
+ s += "+BUTTON3";
+ }
+ if (state & GDK_BUTTON4_MASK) {
+ s += "+BUTTON4";
+ }
+ if (state & GDK_BUTTON5_MASK) {
+ s += "+BUTTON5";
+ }
+ if (state & GDK_SUPER_MASK) {
+ s += "+SUPER";
+ }
+ if (state & GDK_HYPER_MASK) {
+ s += "+HYPER";
+ }
+ if (state & GDK_META_MASK) {
+ s += "+META";
+ }
+ if (state & GDK_RELEASE_MASK) {
+ s += "+RELEASE";
+ }
+
+ return s;
+}
diff --git a/libs/gtkmm2ext/visibility_tracker.cc b/libs/gtkmm2ext/visibility_tracker.cc
index aac76a5..170036e 100644
--- a/libs/gtkmm2ext/visibility_tracker.cc
+++ b/libs/gtkmm2ext/visibility_tracker.cc
@@ -23,6 +23,8 @@
using namespace Gtkmm2ext;
+bool VisibilityTracker::_use_window_manager_visibility = true;
+
VisibilityTracker::VisibilityTracker (Gtk::Window& win)
: _window (win)
, _visibility (GdkVisibilityState (0))
@@ -31,11 +33,16 @@ VisibilityTracker::VisibilityTracker (Gtk::Window& win)
_window.signal_visibility_notify_event().connect (sigc::mem_fun (*this, &VisibilityTracker::handle_visibility_notify_event));
}
+void
+VisibilityTracker::set_use_window_manager_visibility (bool yn)
+{
+ _use_window_manager_visibility = yn;
+}
+
bool
VisibilityTracker::handle_visibility_notify_event (GdkEventVisibility* ev)
{
_visibility = ev->state;
- // std::cerr << "VT: " << _window.get_title() << " vis event, fv = " << fully_visible() << " pv = " << partially_visible() << " nv = " << not_visible() << std::endl;
return false;
}
@@ -52,17 +59,29 @@ VisibilityTracker::cycle_visibility ()
bool
VisibilityTracker::fully_visible () const
{
- return _window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED);
+ if (_use_window_manager_visibility) {
+ return _window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED);
+ } else {
+ return _window.is_mapped();
+ }
}
bool
VisibilityTracker::not_visible () const
{
- return !_window.is_mapped() || (_visibility == GDK_VISIBILITY_FULLY_OBSCURED);
+ if (_use_window_manager_visibility) {
+ return !_window.is_mapped() || (_visibility == GDK_VISIBILITY_FULLY_OBSCURED);
+ } else {
+ return !_window.is_mapped();
+ }
}
bool
VisibilityTracker::partially_visible () const
{
- return _window.is_mapped() && ((_visibility == GDK_VISIBILITY_PARTIAL) || (_visibility == GDK_VISIBILITY_UNOBSCURED));
+ if (_use_window_manager_visibility) {
+ return _window.is_mapped() && ((_visibility == GDK_VISIBILITY_PARTIAL) || (_visibility == GDK_VISIBILITY_UNOBSCURED));
+ } else {
+ return _window.is_mapped();
+ }
}
diff --git a/libs/gtkmm2ext/window_proxy.cc b/libs/gtkmm2ext/window_proxy.cc
new file mode 100644
index 0000000..1f2fa54
--- /dev/null
+++ b/libs/gtkmm2ext/window_proxy.cc
@@ -0,0 +1,427 @@
+/*
+ Copyright (C) 2015 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <gtkmm/action.h>
+#include <gtkmm/window.h>
+
+#include "pbd/convert.h"
+#include "pbd/xml++.h"
+#include "pbd/stacktrace.h"
+
+#include "gtkmm2ext/window_proxy.h"
+#include "gtkmm2ext/visibility_tracker.h"
+
+#include "pbd/i18n.h"
+
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace PBD;
+
+WindowProxy::WindowProxy (const std::string& name)
+ : _name (name)
+ , _window (0)
+ , _visible (false)
+ , _x_off (-1)
+ , _y_off (-1)
+ , _width (-1)
+ , _height (-1)
+ , vistracker (0)
+ , _state_mask (StateMask (Position|Size))
+{
+}
+
+WindowProxy::WindowProxy (const std::string& name, const std::string& menu_name)
+ : _name (name)
+ , _menu_name (menu_name)
+ , _window (0)
+ , _visible (false)
+ , _x_off (-1)
+ , _y_off (-1)
+ , _width (-1)
+ , _height (-1)
+ , vistracker (0)
+ , _state_mask (StateMask (Position|Size))
+{
+}
+
+WindowProxy::WindowProxy (const std::string& name, const std::string& menu_name, const XMLNode& node)
+ : _name (name)
+ , _menu_name (menu_name)
+ , _window (0)
+ , _visible (false)
+ , _x_off (-1)
+ , _y_off (-1)
+ , _width (-1)
+ , _height (-1)
+ , vistracker (0)
+{
+ set_state (node, 0);
+}
+
+WindowProxy::~WindowProxy ()
+{
+ delete vistracker;
+ delete _window;
+}
+
+int
+WindowProxy::set_state (const XMLNode& node, int /* version */)
+{
+ XMLNodeList children = node.children ();
+ XMLNode const * child;
+ XMLNodeList::const_iterator i = children.begin ();
+
+ while (i != children.end()) {
+ child = *i;
+ XMLProperty const * prop = child->property (X_("name"));
+ if (child->name() == X_("Window") && prop && prop->value() == _name) {
+ break;
+ }
+
+ ++i;
+ }
+
+ if (i != children.end()) {
+
+ XMLProperty const * prop;
+ child = *i;
+
+ if ((prop = child->property (X_("visible"))) != 0) {
+ _visible = PBD::string_is_affirmative (prop->value ());
+ }
+
+ if ((prop = child->property (X_("x-off"))) != 0) {
+ _x_off = atoi (prop->value());
+ }
+ if ((prop = child->property (X_("y-off"))) != 0) {
+ _y_off = atoi (prop->value());
+ }
+ if ((prop = child->property (X_("x-size"))) != 0) {
+ _width = atoi (prop->value());
+ }
+ if ((prop = child->property (X_("y-size"))) != 0) {
+ _height = atoi (prop->value());
+ }
+ }
+
+ if (_window) {
+ setup ();
+ }
+
+ return 0;
+}
+
+void
+WindowProxy::set_action (Glib::RefPtr<Gtk::Action> act)
+{
+ _action = act;
+}
+
+std::string
+WindowProxy::action_name() const
+{
+ return string_compose (X_("toggle-%1"), _name);
+}
+
+void
+WindowProxy::toggle()
+{
+ if (!_window) {
+ (void) get (true);
+ setup ();
+ assert (_window);
+ /* XXX this is a hack - the window object should really
+ ensure its components are all visible. sigh.
+ */
+ _window->show_all();
+ /* we'd like to just call this and nothing else */
+ _window->present ();
+ } else {
+ if (_window->is_mapped()) {
+ save_pos_and_size();
+ }
+
+ vistracker->cycle_visibility ();
+
+ if (_window->is_mapped()) {
+ if (_width != -1 && _height != -1) {
+ _window->set_default_size (_width, _height);
+ }
+ if (_x_off != -1 && _y_off != -1) {
+ _window->move (_x_off, _y_off);
+ }
+ }
+ }
+}
+
+std::string
+WindowProxy::xml_node_name()
+{
+ return X_("Window");
+}
+
+XMLNode&
+WindowProxy::get_state ()
+{
+ XMLNode* node = new XMLNode (xml_node_name());
+ char buf[32];
+
+ node->add_property (X_("name"), _name);
+
+ if (_window && vistracker) {
+
+ /* we have a window, so use current state */
+
+ _visible = vistracker->partially_visible ();
+ _window->get_position (_x_off, _y_off);
+ _window->get_size (_width, _height);
+ }
+
+ int x, y, w, h;
+
+ if (_state_mask & Position) {
+ x = _x_off;
+ y = _y_off;
+ } else {
+ x = -1;
+ y = -1;
+ }
+
+ if (_state_mask & Size) {
+ w = _width;
+ h = _height;
+ } else {
+ w = -1;
+ h = -1;
+ }
+
+ node->add_property (X_("visible"), _visible? X_("yes") : X_("no"));
+ snprintf (buf, sizeof (buf), "%d", x);
+ node->add_property (X_("x-off"), buf);
+ snprintf (buf, sizeof (buf), "%d", y);
+ node->add_property (X_("y-off"), buf);
+ snprintf (buf, sizeof (buf), "%d", w);
+ node->add_property (X_("x-size"), buf);
+ snprintf (buf, sizeof (buf), "%d", h);
+ node->add_property (X_("y-size"), buf);
+
+ return *node;
+}
+
+void
+WindowProxy::drop_window ()
+{
+ if (_window) {
+ delete_connection.disconnect ();
+ configure_connection.disconnect ();
+ map_connection.disconnect ();
+ unmap_connection.disconnect ();
+ _window->hide ();
+ delete _window;
+ _window = 0;
+ delete vistracker;
+ vistracker = 0;
+ }
+}
+
+void
+WindowProxy::use_window (Gtk::Window& win)
+{
+ drop_window ();
+ _window = &win;
+ setup ();
+}
+
+void
+WindowProxy::setup ()
+{
+ assert (_window);
+
+ vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
+
+ delete_connection = _window->signal_delete_event().connect (sigc::mem_fun (*this, &WindowProxy::delete_event_handler));
+ configure_connection = _window->signal_configure_event().connect (sigc::mem_fun (*this, &WindowProxy::configure_handler), false);
+ map_connection = _window->signal_map().connect (sigc::mem_fun (*this, &WindowProxy::map_handler), false);
+ unmap_connection = _window->signal_unmap().connect (sigc::mem_fun (*this, &WindowProxy::unmap_handler), false);
+
+ set_pos_and_size ();
+}
+
+void
+WindowProxy::map_handler ()
+{
+ /* emit our own signal */
+ signal_map ();
+}
+
+void
+WindowProxy::unmap_handler ()
+{
+ /* emit out own signal */
+ signal_unmap ();
+}
+
+bool
+WindowProxy::configure_handler (GdkEventConfigure* ev)
+{
+ /* stupidly, the geometry data in the event isn't the same as we get
+ from the window geometry APIs.so we have to actively interrogate
+ them to get the new information.
+
+ the difference is generally down to window manager framing.
+ */
+ save_pos_and_size ();
+ return false;
+}
+
+
+bool
+WindowProxy::visible() const
+{
+ if (vistracker) {
+ /* update with current state */
+ _visible = vistracker->partially_visible();
+ }
+ return _visible;
+}
+
+bool
+WindowProxy::fully_visible () const
+{
+ if (!vistracker) {
+ /* no vistracker .. no window .. cannot be fully visible */
+ return false;
+ }
+ return vistracker->fully_visible();
+}
+
+void
+WindowProxy::show ()
+{
+ get (true);
+ assert (_window);
+ _window->show ();
+}
+
+void
+WindowProxy::maybe_show ()
+{
+ if (_visible) {
+ show ();
+ }
+}
+
+void
+WindowProxy::show_all ()
+{
+ get (true);
+ assert (_window);
+ _window->show_all ();
+}
+
+void
+WindowProxy::present ()
+{
+ get (true);
+ assert (_window);
+
+ _window->show_all ();
+ _window->present ();
+
+ /* turn off any mouse-based positioning */
+ _window->set_position (Gtk::WIN_POS_NONE);
+}
+
+void
+WindowProxy::hide ()
+{
+ if (_window) {
+ save_pos_and_size();
+ _window->hide ();
+ }
+}
+
+bool
+WindowProxy::delete_event_handler (GdkEventAny* /*ev*/)
+{
+ if (_action) {
+ _action->activate ();
+ } else {
+ hide();
+ }
+
+ return true;
+}
+
+void
+WindowProxy::save_pos_and_size ()
+{
+ if (_window) {
+ _window->get_position (_x_off, _y_off);
+ _window->get_size (_width, _height);
+ }
+}
+
+void
+WindowProxy::set_pos_and_size ()
+{
+ if (!_window) {
+ return;
+ }
+
+ if ((_state_mask & Position) && (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1)) {
+ /* cancel any mouse-based positioning */
+ _window->set_position (Gtk::WIN_POS_NONE);
+ }
+
+ if ((_state_mask & Size) && _width != -1 && _height != -1) {
+ _window->resize (_width, _height);
+ }
+
+ if ((_state_mask & Position) && _x_off != -1 && _y_off != -1) {
+ _window->move (_x_off, _y_off);
+ }
+}
+
+void
+WindowProxy::set_pos ()
+{
+ if (!_window) {
+ return;
+ }
+
+ if (!(_state_mask & Position)) {
+ return;
+ }
+
+ if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
+ /* cancel any mouse-based positioning */
+ _window->set_position (Gtk::WIN_POS_NONE);
+ }
+
+ if (_x_off != -1 && _y_off != -1) {
+ _window->move (_x_off, _y_off);
+ }
+}
+
+void
+WindowProxy::set_state_mask (StateMask sm)
+{
+ _state_mask = sm;
+}
diff --git a/libs/gtkmm2ext/window_title.cc b/libs/gtkmm2ext/window_title.cc
index eaf25a9..5cb9ed9 100644
--- a/libs/gtkmm2ext/window_title.cc
+++ b/libs/gtkmm2ext/window_title.cc
@@ -19,7 +19,7 @@
#include "gtkmm2ext/window_title.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript
index 2e9df40..4e1a031 100644
--- a/libs/gtkmm2ext/wscript
+++ b/libs/gtkmm2ext/wscript
@@ -2,6 +2,8 @@
from waflib.extras import autowaf as autowaf
from waflib import Options
import os
+import sys
+import platform as PLATFORM
# Version of this package (even if built as a child)
MAJOR = '0'
@@ -30,6 +32,7 @@ gtkmm2ext_sources = [
'bindable_button.cc',
'bindings.cc',
'cairocell.cc',
+ 'cairo_icon.cc',
'cairo_packer.cc',
'cairo_widget.cc',
'cell_renderer_color_selector.cc',
@@ -47,6 +50,7 @@ gtkmm2ext_sources = [
'gtkapplication.c',
'idle_adjustment.cc',
'keyboard.cc',
+ 'pane.cc',
'paths_dialog.cc',
'persistent_tooltip.cc',
'pixfader.cc',
@@ -54,14 +58,17 @@ gtkmm2ext_sources = [
'popup.cc',
'prompter.cc',
'scroomer.cc',
+ 'searchbar.cc',
'selector.cc',
'slider_controller.cc',
'stateful_button.cc',
+ 'tabbable.cc',
'tearoff.cc',
'textviewer.cc',
'treeutils.cc',
'utils.cc',
'visibility_tracker.cc',
+ 'window_proxy.cc',
'window_title.cc'
]
@@ -102,7 +109,7 @@ def build(bld):
obj.includes = ['.']
obj.name = 'libgtkmm2ext'
obj.target = 'gtkmm2ext'
- obj.uselib = 'GTKMM GTK GTKOSX OSX GDK'
+ obj.uselib = 'GTKMM GTK XML'
obj.use = [ 'libpbd', 'libardour' ]
obj.vnum = GTKMM2EXT_LIB_VERSION
obj.install_path = bld.env['LIBDIR']
@@ -110,7 +117,7 @@ def build(bld):
'PACKAGE="' + I18N_PACKAGE + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"']
- if bld.is_defined('GTKOSX'):
+ if sys.platform == 'darwin':
obj.source += ['gtkapplication_quartz.mm']
else:
obj.source += ['gtkapplication_x11.c']
diff --git a/libs/lua/LuaBridge/LuaBridge.h b/libs/lua/LuaBridge/LuaBridge.h
new file mode 100644
index 0000000..01f9e90
--- /dev/null
+++ b/libs/lua/LuaBridge/LuaBridge.h
@@ -0,0 +1,197 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2016, Robin Gareus <robin at gareus.org>
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2007, Nathan Reed
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef LUABRIDGE_LUABRIDGE_HEADER
+#define LUABRIDGE_LUABRIDGE_HEADER
+
+// All #include dependencies are listed here
+// instead of in the individual header files.
+//
+#include <cassert>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <typeinfo>
+
+#include <bitset>
+#include <list>
+#include <map>
+#include <set>
+#include <vector>
+
+#include <inttypes.h>
+#include <boost/type_traits.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "lua/luastate.h"
+
+#define LUABRIDGE_MAJOR_VERSION 2
+#define LUABRIDGE_MINOR_VERSION 0
+#define LUABRIDGE_VERSION 200
+
+namespace luabridge
+{
+
+// Forward declaration
+//
+template <class T>
+struct Stack;
+
+#include "detail/LuaHelpers.h"
+
+#include "detail/TypeTraits.h"
+#include "detail/TypeList.h"
+#include "detail/FuncTraits.h"
+#include "detail/Constructor.h"
+#include "detail/Stack.h"
+#include "detail/ClassInfo.h"
+
+class LuaRef;
+
+#include "detail/LuaException.h"
+#include "detail/LuaRef.h"
+#include "detail/Iterator.h"
+#include "detail/FuncArgs.h"
+
+//------------------------------------------------------------------------------
+/**
+ security options.
+*/
+class Security
+{
+public:
+ static bool hideMetatables ()
+ {
+ return getSettings().hideMetatables;
+ }
+
+ static void setHideMetatables (bool shouldHide)
+ {
+ getSettings().hideMetatables = shouldHide;
+ }
+
+private:
+ struct Settings
+ {
+ Settings () : hideMetatables (true)
+ {
+ }
+
+ bool hideMetatables;
+ };
+
+ static Settings& getSettings ()
+ {
+ static Settings settings;
+ return settings;
+ }
+};
+
+//------------------------------------------------------------------------------
+
+#ifdef LUABINDINGDOC
+class LuaBindingDoc
+{
+public:
+ static bool printBindings ()
+ {
+ return getSettings().print_bindings;
+ }
+
+ static void setPrintBindings (bool en)
+ {
+ getSettings().print_bindings = en;
+ }
+
+private:
+ struct Settings
+ {
+ Settings () : print_bindings (false) { }
+ bool print_bindings;
+ };
+
+ static Settings& getSettings ()
+ {
+ static Settings settings;
+ return settings;
+ }
+};
+#endif
+
+//------------------------------------------------------------------------------
+
+
+#include "detail/Userdata.h"
+#include "detail/CFunctions.h"
+#include "detail/Namespace.h"
+
+//------------------------------------------------------------------------------
+/**
+ Push an object onto the Lua stack.
+*/
+template <class T>
+inline void push (lua_State* L, T t)
+{
+ Stack <T>::push (L, t);
+}
+
+//------------------------------------------------------------------------------
+/**
+ Set a global value in the lua_State.
+
+ @note This works on any type specialized by `Stack`, including `LuaRef` and
+ its table proxies.
+*/
+template <class T>
+inline void setGlobal (lua_State* L, T t, char const* name)
+{
+ push (L, t);
+ lua_setglobal (L, name);
+}
+
+//------------------------------------------------------------------------------
+/**
+ Change whether or not metatables are hidden (on by default).
+*/
+inline void setHideMetatables (bool shouldHide)
+{
+ Security::setHideMetatables (shouldHide);
+}
+
+#ifdef LUABINDINGDOC
+inline void setPrintBindings (bool en)
+{
+ LuaBindingDoc::setPrintBindings (en);
+}
+#endif
+
+} // end Namespace
+
+#endif
diff --git a/libs/lua/LuaBridge/README b/libs/lua/LuaBridge/README
new file mode 100644
index 0000000..82cbd53
--- /dev/null
+++ b/libs/lua/LuaBridge/README
@@ -0,0 +1,28 @@
+https://github.com/vinniefalco/LuaBridge -- 1.0.2-111-g04b47d7
+
+LuaBridge is published under the terms of the MIT License.
+
+ Copyright 2012, Vinnie Falco (<vinnie.falco at gmail.com>)
+ Copyright 2008, Nigel Atkinson
+ Copyright 2007, Nathan Reed
+
+ Portions from The Loki Library:
+ Copyright (C) 2001 by Andrei Alexandrescu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/libs/lua/LuaBridge/detail/CFunctions.h b/libs/lua/LuaBridge/detail/CFunctions.h
new file mode 100644
index 0000000..9f17129
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/CFunctions.h
@@ -0,0 +1,1334 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2016, Robin Gareus <robin at gareus.org>
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+// We use a structure so we can define everything in the header.
+//
+struct CFunc
+{
+ //----------------------------------------------------------------------------
+ /**
+ __index metamethod for a namespace or class static members.
+
+ This handles:
+ Retrieving functions and class static methods, stored in the metatable.
+ Reading global and class static data, stored in the __propget table.
+ Reading global and class properties, stored in the __propget table.
+ */
+ static int indexMetaMethod (lua_State* L)
+ {
+ int result = 0;
+ lua_getmetatable (L, 1); // push metatable of arg1
+ for (;;)
+ {
+ lua_pushvalue (L, 2); // push key arg2
+ lua_rawget (L, -2); // lookup key in metatable
+ if (lua_isnil (L, -1)) // not found
+ {
+ lua_pop (L, 1); // discard nil
+ rawgetfield (L, -1, "__propget"); // lookup __propget in metatable
+ lua_pushvalue (L, 2); // push key arg2
+ lua_rawget (L, -2); // lookup key in __propget
+ lua_remove (L, -2); // discard __propget
+ if (lua_iscfunction (L, -1))
+ {
+ lua_remove (L, -2); // discard metatable
+ lua_pushvalue (L, 1); // push arg1
+ lua_call (L, 1, 1); // call cfunction
+ result = 1;
+ break;
+ }
+ else
+ {
+ assert (lua_isnil (L, -1));
+ lua_pop (L, 1); // discard nil and fall through
+ }
+ }
+ else
+ {
+ assert (lua_istable (L, -1) || lua_iscfunction (L, -1));
+ lua_remove (L, -2);
+ result = 1;
+ break;
+ }
+
+ rawgetfield (L, -1, "__parent");
+ if (lua_istable (L, -1))
+ {
+ // Remove metatable and repeat the search in __parent.
+ lua_remove (L, -2);
+ }
+ else
+ {
+ // Discard metatable and return nil.
+ assert (lua_isnil (L, -1));
+ lua_remove (L, -2);
+ result = 1;
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ __newindex metamethod for a namespace or class static members.
+
+ The __propset table stores proxy functions for assignment to:
+ Global and class static data.
+ Global and class properties.
+ */
+ static int newindexMetaMethod (lua_State* L)
+ {
+ int result = 0;
+ lua_getmetatable (L, 1); // push metatable of arg1
+ for (;;)
+ {
+ rawgetfield (L, -1, "__propset"); // lookup __propset in metatable
+ assert (lua_istable (L, -1));
+ lua_pushvalue (L, 2); // push key arg2
+ lua_rawget (L, -2); // lookup key in __propset
+ lua_remove (L, -2); // discard __propset
+ if (lua_iscfunction (L, -1)) // ensure value is a cfunction
+ {
+ lua_remove (L, -2); // discard metatable
+ lua_pushvalue (L, 3); // push new value arg3
+ lua_call (L, 1, 0); // call cfunction
+ result = 0;
+ break;
+ }
+ else
+ {
+ assert (lua_isnil (L, -1));
+ lua_pop (L, 1);
+ }
+
+ rawgetfield (L, -1, "__parent");
+ if (lua_istable (L, -1))
+ {
+ // Remove metatable and repeat the search in __parent.
+ lua_remove (L, -2);
+ }
+ else
+ {
+ assert (lua_isnil (L, -1));
+ lua_pop (L, 2);
+ result = luaL_error (L,"no writable variable '%s'", lua_tostring (L, 2));
+ }
+ }
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to report an error writing to a read-only value.
+
+ The name of the variable is in the first upvalue.
+ */
+ static int readOnlyError (lua_State* L)
+ {
+ std::string s;
+
+ s = s + "'" + lua_tostring (L, lua_upvalueindex (1)) + "' is read-only";
+
+ return luaL_error (L, s.c_str ());
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to get a variable.
+
+ This is used for global variables or class static data members.
+
+ The pointer to the data is in the first upvalue.
+ */
+ template <class T>
+ static int getVariable (lua_State* L)
+ {
+ assert (lua_islightuserdata (L, lua_upvalueindex (1)));
+ T const* ptr = static_cast <T const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (ptr != 0);
+ Stack <T>::push (L, *ptr);
+ return 1;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to set a variable.
+
+ This is used for global variables or class static data members.
+
+ The pointer to the data is in the first upvalue.
+ */
+ template <class T>
+ static int setVariable (lua_State* L)
+ {
+ assert (lua_islightuserdata (L, lua_upvalueindex (1)));
+ T* ptr = static_cast <T*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (ptr != 0);
+ *ptr = Stack <T>::get (L, 1);
+ return 0;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to call a function with a return value.
+
+ This is used for global functions, global properties, class static methods,
+ and class static properties.
+
+ The function pointer is in the first upvalue.
+ */
+ template <class FnPtr,
+ class ReturnType = typename FuncTraits <FnPtr>::ReturnType>
+ struct Call
+ {
+ typedef typename FuncTraits <FnPtr>::Params Params;
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params> args (L);
+ Stack <typename FuncTraits <FnPtr>::ReturnType>::push (L, FuncTraits <FnPtr>::call (fnptr, args));
+ return 1;
+ }
+ };
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to call a function with no return value.
+
+ This is used for global functions, global properties, class static methods,
+ and class static properties.
+
+ The function pointer is in the first upvalue.
+ */
+ template <class FnPtr>
+ struct Call <FnPtr, void>
+ {
+ typedef typename FuncTraits <FnPtr>::Params Params;
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params> args (L);
+ FuncTraits <FnPtr>::call (fnptr, args);
+ return 0;
+ }
+ };
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to call a function with references as arguments.
+ */
+ template <class FnPtr,
+ class ReturnType = typename FuncTraits <FnPtr>::ReturnType>
+ struct CallRef
+ {
+ typedef typename FuncTraits <FnPtr>::Params Params;
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 1> args (L);
+ Stack <typename FuncTraits <FnPtr>::ReturnType>::push (L, FuncTraits <FnPtr>::call (fnptr, args));
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 2;
+ }
+ };
+
+ template <class FnPtr>
+ struct CallRef <FnPtr, void>
+ {
+ typedef typename FuncTraits <FnPtr>::Params Params;
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 1> args (L);
+ FuncTraits <FnPtr>::call (fnptr, args);
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 1;
+ }
+ };
+
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to call a class member function with a return value.
+
+ The member function pointer is in the first upvalue.
+ The class userdata object is at the top of the Lua stack.
+ */
+ template <class MemFnPtr,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallMember
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T* const t = Userdata::get <T> (L, 1, false);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+ return 1;
+ }
+ };
+
+ template <class MemFnPtr,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallConstMember
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T const* const t = Userdata::get <T> (L, 1, true);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args(L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+ return 1;
+ }
+ };
+
+ template <class MemFnPtr, class T,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallMemberPtr
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+ T* const tt = t->get();
+ if (!tt) {
+ return luaL_error (L, "shared_ptr is nil");
+ }
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+ return 1;
+ }
+ };
+
+ template <class T, class R>
+ struct CastMemberPtr
+ {
+ static int f (lua_State* L)
+ {
+ boost::shared_ptr<T> t = luabridge::Stack<boost::shared_ptr<T> >::get (L, 1);
+ Stack <boost::shared_ptr<R> >::push (L, boost::dynamic_pointer_cast<R> (t));
+ return 1;
+ }
+ };
+
+ template <class T>
+ struct ClassEqualCheck
+ {
+ static int f (lua_State* L)
+ {
+ T const* const t0 = Userdata::get <T> (L, 1, true);
+ T const* const t1 = Userdata::get <T> (L, 2, true);
+ Stack <bool>::push (L, t0 == t1);
+ return 1;
+ }
+ };
+
+
+ template <class T, class R>
+ struct CastClass
+ {
+ static int f (lua_State* L)
+ {
+ T * const t = Userdata::get <T> (L, 1, false );
+ Stack <R*>::push (L, dynamic_cast<R*>(t));
+ return 1;
+ }
+ };
+
+ template <class T, class R>
+ struct CastConstClass
+ {
+ static int f (lua_State* L)
+ {
+ T const* const t = Userdata::get <T> (L, 1, true);
+ Stack <R const*>::push (L, dynamic_cast<R const*>(t));
+ return 1;
+ }
+ };
+
+
+ template <class T>
+ struct PtrNullCheck
+ {
+ static int f (lua_State* L)
+ {
+ boost::shared_ptr<T> t = luabridge::Stack<boost::shared_ptr<T> >::get (L, 1);
+ Stack <bool>::push (L, t == 0);
+ return 1;
+ }
+ };
+
+ template <class T>
+ struct WPtrNullCheck
+ {
+ static int f (lua_State* L)
+ {
+ bool rv = true;
+ boost::weak_ptr<T> tw = luabridge::Stack<boost::weak_ptr<T> >::get (L, 1);
+ boost::shared_ptr<T> const t = tw.lock();
+ if (t) {
+ T* const tt = t.get();
+ rv = (tt == 0);
+ }
+ Stack <bool>::push (L, rv);
+ return 1;
+ }
+ };
+
+ template <class MemFnPtr, class T,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallMemberWPtr
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+ boost::shared_ptr<T> const t = tw->lock();
+ if (!t) {
+ return luaL_error (L, "cannot lock weak_ptr");
+ }
+ T* const tt = t.get();
+ if (!tt) {
+ return luaL_error (L, "weak_ptr is nil");
+ }
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+ return 1;
+ }
+ };
+
+ /**
+ lua_CFunction to calls for function references.
+ */
+ template <class MemFnPtr,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallMemberRef
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T* const t = Userdata::get <T> (L, 1, false);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 2;
+ }
+ };
+
+ template <class MemFnPtr,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallConstMemberRef
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T const* const t = Userdata::get <T> (L, 1, true);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args(L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 2;
+ }
+ };
+
+ template <class MemFnPtr, class T,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallMemberRefPtr
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+ T* const tt = t->get();
+ if (!tt) {
+ return luaL_error (L, "shared_ptr is nil");
+ }
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 2;
+ }
+ };
+
+ template <class MemFnPtr, class T,
+ class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+ struct CallMemberRefWPtr
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+ boost::shared_ptr<T> const t = tw->lock();
+ if (!t) {
+ return luaL_error (L, "cannot lock weak_ptr");
+ }
+ T* const tt = t.get();
+ if (!tt) {
+ return luaL_error (L, "weak_ptr is nil");
+ }
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 2;
+ }
+ };
+
+ //----------------------------------------------------------------------------
+ /**
+ lua_CFunction to call a class member function with no return value.
+
+ The member function pointer is in the first upvalue.
+ The class userdata object is at the top of the Lua stack.
+ */
+ template <class MemFnPtr>
+ struct CallMember <MemFnPtr, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T* const t = Userdata::get <T> (L, 1, false);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (t, fnptr, args);
+ return 0;
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallConstMember <MemFnPtr, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T const* const t = Userdata::get <T> (L, 1, true);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (t, fnptr, args);
+ return 0;
+ }
+ };
+
+ template <class MemFnPtr, class T>
+ struct CallMemberPtr <MemFnPtr, T, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+ T* const tt = t->get();
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+ return 0;
+ }
+ };
+
+ template <class MemFnPtr, class T>
+ struct CallMemberWPtr <MemFnPtr, T, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+ boost::shared_ptr<T> const t = tw->lock();
+ if (!t) {
+ return luaL_error (L, "cannot lock weak_ptr");
+ }
+ T* const tt = t.get();
+ if (!tt) {
+ return luaL_error (L, "weak_ptr is nil");
+ }
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+ return 0;
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallMemberRef <MemFnPtr, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T* const t = Userdata::get <T> (L, 1, false);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (t, fnptr, args);
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 1;
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallConstMemberRef <MemFnPtr, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ T const* const t = Userdata::get <T> (L, 1, true);
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (t, fnptr, args);
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 1;
+ }
+ };
+
+ template <class MemFnPtr, class T>
+ struct CallMemberRefPtr <MemFnPtr, T, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+ T* const tt = t->get();
+ if (!tt) {
+ return luaL_error (L, "shared_ptr is nil");
+ }
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 1;
+ }
+ };
+
+ template <class MemFnPtr, class T>
+ struct CallMemberRefWPtr <MemFnPtr, T, void>
+ {
+ typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+ boost::shared_ptr<T> const t = tw->lock();
+ if (!t) {
+ return luaL_error (L, "cannot lock weak_ptr");
+ }
+ T* const tt = t.get();
+ if (!tt) {
+ return luaL_error (L, "weak_ptr is nil");
+ }
+ MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ ArgList <Params, 2> args (L);
+ FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+ LuaRef v (newTable (L));
+ FuncArgs <Params, 0>::refs (v, args);
+ v.push(L);
+ return 1;
+ }
+ };
+
+ //--------------------------------------------------------------------------
+ /**
+ lua_CFunction to call a class member lua_CFunction.
+
+ The member function pointer is in the first upvalue.
+ The class userdata object is at the top of the Lua stack.
+ */
+ template <class T>
+ struct CallMemberCFunction
+ {
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ typedef int (T::*MFP)(lua_State* L);
+ T* const t = Userdata::get <T> (L, 1, false);
+ MFP const& fnptr = *static_cast <MFP const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ return (t->*fnptr) (L);
+ }
+ };
+
+ template <class T>
+ struct CallConstMemberCFunction
+ {
+ static int f (lua_State* L)
+ {
+ assert (isfulluserdata (L, lua_upvalueindex (1)));
+ typedef int (T::*MFP)(lua_State* L);
+ T const* const t = Userdata::get <T> (L, 1, true);
+ MFP const& fnptr = *static_cast <MFP const*> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (fnptr != 0);
+ return (t->*fnptr) (L);
+ }
+ };
+
+ //--------------------------------------------------------------------------
+
+ // SFINAE Helpers
+
+ template <class MemFnPtr, bool isConst>
+ struct CallMemberFunctionHelper
+ {
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallConstMember <MemFnPtr>::f, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -5, name); // const table
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallMemberFunctionHelper <MemFnPtr, false>
+ {
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallMember <MemFnPtr>::f, 1);
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallMemberPtrFunctionHelper
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallMemberPtr <MemFnPtr, T>::f, 1);
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallMemberRefPtrFunctionHelper
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallMemberRefPtr <MemFnPtr, T>::f, 1);
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallMemberWPtrFunctionHelper
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallMemberWPtr <MemFnPtr, T>::f, 1);
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallMemberRefWPtrFunctionHelper
+ {
+ typedef typename FuncTraits <MemFnPtr>::ClassType T;
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallMemberRefWPtr <MemFnPtr, T>::f, 1);
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ template <class MemFnPtr, bool isConst>
+ struct CallMemberRefFunctionHelper
+ {
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallConstMemberRef <MemFnPtr>::f, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -5, name); // const table
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ template <class MemFnPtr>
+ struct CallMemberRefFunctionHelper <MemFnPtr, false>
+ {
+ static void add (lua_State* L, char const* name, MemFnPtr mf)
+ {
+ new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+ lua_pushcclosure (L, &CallMemberRef <MemFnPtr>::f, 1);
+ rawsetfield (L, -3, name); // class table
+ }
+ };
+
+ //--------------------------------------------------------------------------
+ /**
+ __gc metamethod for a class.
+ */
+ template <class C>
+ static int gcMetaMethod (lua_State* L)
+ {
+ Userdata* const ud = Userdata::getExact <C> (L, 1);
+ ud->~Userdata ();
+ return 0;
+ }
+
+ static int gcNOOPMethod (lua_State* L)
+ {
+ return 0;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ lua_CFunction to get a class data member.
+
+ The pointer-to-member is in the first upvalue.
+ The class userdata object is at the top of the Lua stack.
+ */
+ template <class C, typename T>
+ static int getProperty (lua_State* L)
+ {
+ C const* const c = Userdata::get <C> (L, 1, true);
+ T C::** mp = static_cast <T C::**> (lua_touserdata (L, lua_upvalueindex (1)));
+ Stack <T>::push (L, c->**mp);
+ return 1;
+ }
+
+ //--------------------------------------------------------------------------
+
+ /**
+ lua_CFunction to get a constant (enum)
+ */
+ template <typename U>
+ static int getConst (lua_State* L)
+ {
+ U *v = static_cast <U *> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (v);
+ Stack <U>::push (L, *v);
+ return 1;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ lua_CFunction to set a class data member.
+
+ The pointer-to-member is in the first upvalue.
+ The class userdata object is at the top of the Lua stack.
+ */
+ template <class C, typename T>
+ static int setProperty (lua_State* L)
+ {
+ C* const c = Userdata::get <C> (L, 1, false);
+ T C::** mp = static_cast <T C::**> (lua_touserdata (L, lua_upvalueindex (1)));
+ c->**mp = Stack <T>::get (L, 2);
+ return 0;
+ }
+
+ //--------------------------------------------------------------------------
+
+ // metatable callback for "array[index]"
+ template <typename T>
+ static int array_index (lua_State* L) {
+ T** parray = (T**) luaL_checkudata (L, 1, typeid(T).name());
+ int const index = luabridge::Stack<int>::get (L, 2);
+ luabridge::Stack<T>::push (L, (*parray)[index-1]);
+ return 1;
+ }
+
+ // metatable callback for "array[index] = value"
+ template <typename T>
+ static int array_newindex (lua_State* L) {
+ T** parray = (T**) luaL_checkudata (L, 1, typeid(T).name());
+ int const index = luabridge::Stack<int>::get (L, 2);
+ T const value = luabridge::Stack<T>::get (L, 3);
+ (*parray)[index-1] = value;
+ return 0;
+ }
+
+ template <typename T>
+ static int getArray (lua_State* L) {
+ T *v = luabridge::Stack<T*>::get (L, 1);
+ T** parray = (T**) lua_newuserdata(L, sizeof(T**));
+ *parray = v;
+ luaL_getmetatable(L, typeid(T).name());
+ lua_setmetatable(L, -2);
+ return 1;
+ }
+
+ // copy complete c array to lua table
+ template <typename T>
+ static int getTable (lua_State* L) {
+ T *v = luabridge::Stack<T*>::get (L, 1);
+ const int cnt = luabridge::Stack<int>::get (L, 2);
+ LuaRef t (L);
+ t = newTable (L);
+ for (int i = 0; i < cnt; ++i) {
+ t[i + 1] = v[i];
+ }
+ t.push(L);
+ return 1;
+ }
+
+ // copy lua table to c array
+ template <typename T>
+ static int setTable (lua_State* L) {
+ T *v = luabridge::Stack<T*>::get (L, 1);
+ LuaRef t (LuaRef::fromStack(L, 2));
+ const int cnt = luabridge::Stack<int>::get (L, 3);
+ for (int i = 0; i < cnt; ++i) {
+ v[i] = t[i + 1];
+ }
+ return 0;
+ }
+
+ // return same array at an offset
+ template <typename T>
+ static int offsetArray (lua_State* L) {
+ T *v = luabridge::Stack<T*>::get (L, 1);
+ const unsigned int i = luabridge::Stack<unsigned int>::get (L, 2);
+ Stack <T*>::push (L, &v[i]);
+ return 1;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ C++ STL iterators
+ */
+
+ // read lua table into C++ std::list
+ template <class T, class C>
+ static int tableToListHelper (lua_State *L, C * const t)
+ {
+ if (!t) { return luaL_error (L, "invalid pointer to std::list<>/std::vector"); }
+ if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+ lua_pushvalue (L, -1);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ T const value = Stack<T>::get (L, -2);
+ t->push_back (value);
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ lua_pop (L, 2);
+ Stack<C>::push (L, *t);
+ return 1;
+ }
+
+ template <class T, class C>
+ static int tableToList (lua_State *L)
+ {
+ C * const t = Userdata::get<C> (L, 1, false);
+ return tableToListHelper<T, C> (L, t);
+ }
+
+ template <class T, class C>
+ static int ptrTableToList (lua_State *L)
+ {
+ boost::shared_ptr<C> const* const t = Userdata::get<boost::shared_ptr<C> > (L, 1, true);
+ if (!t) { return luaL_error (L, "cannot derefencee shared_ptr"); }
+ return tableToListHelper<T, C> (L, t->get());
+ }
+
+ //--------------------------------------------------------------------------
+ template <class T, class C>
+ static int listIterIter (lua_State *L) {
+ typedef typename C::const_iterator IterType;
+ IterType * const end = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (2)));
+ IterType * const iter = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (end);
+ assert (iter);
+ if ((*iter) == (*end)) {
+ return 0;
+ }
+ Stack <T>::push (L, **iter);
+ ++(*iter);
+ return 1;
+ }
+
+ // generate an iterator
+ template <class T, class C>
+ static int listIterHelper (lua_State *L, C * const t)
+ {
+ if (!t) { return luaL_error (L, "invalid pointer to std::list<>/std::vector"); }
+ typedef typename C::const_iterator IterType;
+ new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->begin());
+ new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->end());
+ lua_pushcclosure (L, listIterIter<T, C>, 2);
+ return 1;
+ }
+
+ template <class T, class C>
+ static int listIter (lua_State *L)
+ {
+ C * const t = Userdata::get <C> (L, 1, false);
+ return listIterHelper<T, C> (L, t);
+ }
+
+ template <class T, class C>
+ static int ptrListIter (lua_State *L)
+ {
+ boost::shared_ptr<C> const* const t = Userdata::get <boost::shared_ptr<C> >(L, 1, true);
+ if (!t) { return luaL_error (L, "cannot derefencee shared_ptr"); }
+ return listIterHelper<T, C> (L, t->get());
+ }
+
+ //--------------------------------------------------------------------------
+ // generate table from std::list
+ template <class T, class C>
+ static int listToTableHelper (lua_State *L, C const* const t)
+ {
+ if (!t) { return luaL_error (L, "invalid pointer to std::list<>/std::vector"); }
+#if 0 // direct lua api
+ lua_createtable(L, t->size(), 0);
+ int newTable = lua_gettop(L);
+ int index = 1;
+ for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter, ++index) {
+ Stack<T>::push(L, (*iter));
+ lua_rawseti (L, newTable, index);
+ }
+#else // luabridge way
+ LuaRef v (L);
+ v = newTable (L);
+ int index = 1;
+ for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter, ++index) {
+ v[index] = (*iter);
+ }
+ v.push(L);
+#endif
+ return 1;
+ }
+
+ template <class T, class C>
+ static int listToTable (lua_State *L)
+ {
+ C const* const t = Userdata::get <C> (L, 1, true);
+ return listToTableHelper<T, C> (L, t);
+ }
+
+ template <class T, class C>
+ static int ptrListToTable (lua_State *L)
+ {
+ boost::shared_ptr<C> const* const t = Userdata::get <boost::shared_ptr<C> > (L, 1, true);
+ if (!t) { return luaL_error (L, "cannot derefencee shared_ptr"); }
+ return listToTableHelper<T, C> (L, t->get());
+ }
+
+ //--------------------------------------------------------------------------
+ // generate std::map from table
+
+ template <class K, class V>
+ static int tableToMap (lua_State *L)
+ {
+ typedef std::map<K, V> C;
+ C * const t = Userdata::get <C> (L, 1, true);
+ if (!t) { return luaL_error (L, "invalid pointer to std::map"); }
+ if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+ lua_pushvalue (L, -1);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ K const key = Stack<K>::get (L, -1);
+ V const value = Stack<V>::get (L, -2);
+ t->insert (std::pair<K,V> (key, value));
+ //(*t)[key] = value;
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ lua_pop (L, 2);
+ Stack<C>::push (L, *t);
+ return 1;
+ }
+
+ // iterate over a std::map
+ template <class K, class V>
+ static int mapIterIter (lua_State *L)
+ {
+ typedef std::map<K, V> C;
+ typedef typename C::const_iterator IterType;
+ IterType * const end = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (2)));
+ IterType * const iter = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (end);
+ assert (iter);
+ if ((*iter) == (*end)) {
+ return 0;
+ }
+ Stack <K>::push (L, (*iter)->first);
+ Stack <V>::push (L, (*iter)->second);
+ ++(*iter);
+ return 2;
+ }
+
+ // generate iterator
+ template <class K, class V>
+ static int mapIter (lua_State *L)
+ {
+ typedef std::map<K, V> C;
+ C * const t = Userdata::get <C> (L, 1, false);
+ if (!t) { return luaL_error (L, "invalid pointer to std::map"); }
+ typedef typename C::const_iterator IterType;
+ new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->begin());
+ new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->end());
+ lua_pushcclosure (L, mapIterIter<K, V>, 2);
+ return 1;
+ }
+
+ // generate table from std::map
+ template <class K, class V>
+ static int mapToTable (lua_State *L)
+ {
+ typedef std::map<K, V> C;
+ C const* const t = Userdata::get <C> (L, 1, true);
+ if (!t) { return luaL_error (L, "invalid pointer to std::map"); }
+
+ LuaRef v (L);
+ v = newTable (L);
+ for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter) {
+ v[(*iter).first] = (*iter).second;
+ }
+ v.push(L);
+ return 1;
+ }
+
+ //--------------------------------------------------------------------------
+ // generate std::set from table keys ( table[member] = true )
+ // http://www.lua.org/pil/11.5.html
+
+ template <class T>
+ static int tableToSet (lua_State *L)
+ {
+ typedef std::set<T> C;
+ C * const t = Userdata::get <C> (L, 1, true);
+ if (!t) { return luaL_error (L, "invalid pointer to std::set"); }
+ if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+ lua_pushvalue (L, -1);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ T const member = Stack<T>::get (L, -1);
+ bool const v = Stack<bool>::get (L, -2);
+ if (v) {
+ t->insert (member);
+ }
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ lua_pop (L, 2);
+ Stack<C>::push (L, *t);
+ return 1;
+ }
+
+ // iterate over a std::set, explicit "true" value.
+ // compare to http://www.lua.org/pil/11.5.html
+ template <class T>
+ static int setIterIter (lua_State *L)
+ {
+ typedef std::set<T> C;
+ typedef typename C::const_iterator IterType;
+ IterType * const end = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (2)));
+ IterType * const iter = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (1)));
+ assert (end);
+ assert (iter);
+ if ((*iter) == (*end)) {
+ return 0;
+ }
+ Stack <T>::push (L, **iter);
+ Stack <bool>::push (L, true);
+ ++(*iter);
+ return 2;
+ }
+
+ // generate iterator
+ template <class T>
+ static int setIter (lua_State *L)
+ {
+ typedef std::set<T> C;
+ C * const t = Userdata::get <C> (L, 1, false);
+ if (!t) { return luaL_error (L, "invalid pointer to std::set"); }
+ typedef typename C::const_iterator IterType;
+ new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->begin());
+ new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->end());
+ lua_pushcclosure (L, setIterIter<T>, 2);
+ return 1;
+ }
+
+ // generate table from std::set
+ template <class T>
+ static int setToTable (lua_State *L)
+ {
+ typedef std::set<T> C;
+ C const* const t = Userdata::get <C> (L, 1, true);
+ if (!t) { return luaL_error (L, "invalid pointer to std::set"); }
+
+ LuaRef v (L);
+ v = newTable (L);
+ for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter) {
+ v[(*iter)] = true;
+ }
+ v.push(L);
+ return 1;
+ }
+
+ //--------------------------------------------------------------------------
+ // bitset { num = true }
+ // compare to http://www.lua.org/pil/11.5.html
+ template <unsigned int T>
+ static int tableToBitSet (lua_State *L)
+ {
+ typedef std::bitset<T> C;
+ C * const t = Userdata::get <C> (L, 1, true);
+ if (!t) { return luaL_error (L, "invalid pointer to std::bitset"); }
+ if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+ lua_pushvalue (L, -1);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ unsigned int const member = Stack<unsigned int>::get (L, -1);
+ bool const v = Stack<bool>::get (L, -2);
+ if (member < T && v) {
+ t->set (member);
+ }
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ lua_pop (L, 2);
+ Stack<C>::push (L, *t);
+ return 1;
+ }
+
+ // generate table from std::bitset
+ template <unsigned int T>
+ static int bitSetToTable (lua_State *L)
+ {
+ typedef std::bitset<T> C;
+ C const* const t = Userdata::get <C> (L, 1, true);
+ if (!t) { return luaL_error (L, "invalid pointer to std::bitset"); }
+
+ LuaRef v (L);
+ v = newTable (L);
+ for (unsigned int i = 0; i < T; ++i) {
+ if (t->test (i)) {
+ v[i] = true;
+ }
+ }
+ v.push(L);
+ return 1;
+ }
+
+};
+
+/* vim: set et sw=2: */
diff --git a/libs/lua/LuaBridge/detail/ClassInfo.h b/libs/lua/LuaBridge/detail/ClassInfo.h
new file mode 100644
index 0000000..8507591
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/ClassInfo.h
@@ -0,0 +1,93 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+#ifdef COMPILER_MSVC
+#ifdef LIBARDOUR_DLL_EXPORTS
+# define LuaBridge_API __declspec(dllexport)
+#else
+# define LuaBridge_API __declspec(dllimport)
+#endif
+#else
+# define LuaBridge_API // mingw is sane WRT to static class members
+#endif
+
+/** Unique Lua registry keys for a class.
+
+ Each registered class inserts three keys into the registry, whose
+ values are the corresponding static, class, and const metatables. This
+ allows a quick and reliable lookup for a metatable from a template type.
+*/
+template <class T>
+class LuaBridge_API ClassInfo
+{
+public:
+#ifdef PLATFORM_WINDOWS
+ /* static symbols on windows (even identical symbols) are not
+ * mapped to the same address when mixing .dll + .exe.
+ * the implementation is moved to libardour/gtk2_ardour.
+ */
+ static void const* getStaticKey ();
+ static void const* getClassKey ();
+ static void const* getConstKey ();
+#else
+ /** Get the key for the static table.
+
+ The static table holds the static data members, static properties, and
+ static member functions for a class.
+ */
+ static void const* getStaticKey ()
+ {
+ static char value;
+ return &value;
+ }
+
+ /** Get the key for the class table.
+
+ The class table holds the data members, properties, and member functions
+ of a class. Read-only data and properties, and const member functions are
+ also placed here (to save a lookup in the const table).
+ */
+ static void const* getClassKey ()
+ {
+ static char value;
+ return &value;
+ }
+
+ /** Get the key for the const table.
+
+ The const table holds read-only data members and properties, and const
+ member functions of a class.
+ */
+ static void const* getConstKey ()
+ {
+ static char value;
+ return &value;
+ }
+#endif
+};
+
diff --git a/libs/lua/LuaBridge/detail/Constructor.h b/libs/lua/LuaBridge/detail/Constructor.h
new file mode 100644
index 0000000..bcd4a37
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Constructor.h
@@ -0,0 +1,204 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2007, Nathan Reed
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef LUABRIDGE_CONSTRUCTOR_HEADER
+#define LUABRIDGE_CONSTRUCTOR_HEADER
+
+/*
+* Constructor generators. These templates allow you to call operator new and
+* pass the contents of a type/value list to the Constructor. Like the
+* function pointer containers, these are only defined up to 8 parameters.
+*/
+
+/** Constructor generators.
+
+ These templates call operator new with the contents of a type/value
+ list passed to the Constructor with up to 8 parameters. Two versions
+ of call() are provided. One performs a regular new, the other performs
+ a placement new.
+*/
+template <class T, typename List>
+struct Constructor {};
+
+template <class T>
+struct Constructor <T, None>
+{
+ static T* call (TypeListValues <None> const&)
+ {
+ return new T;
+ }
+ static T* call (void* mem, TypeListValues <None> const&)
+ {
+ return new (mem) T;
+ }
+};
+
+template <class T, class P1>
+struct Constructor <T, TypeList <P1> >
+{
+ static T* call (const TypeListValues<TypeList <P1> > &tvl)
+ {
+ return new T(tvl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1> > &tvl)
+ {
+ return new (mem) T(tvl.hd);
+ }
+};
+
+template <class T, class P1, class P2>
+struct Constructor <T, TypeList <P1, TypeList <P2> > >
+{
+ static T* call (const TypeListValues<TypeList <P1, TypeList <P2> > > &tvl)
+ {
+ return new T(tvl.hd, tvl.tl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2> > > &tvl)
+ {
+ return new (mem) T(tvl.hd, tvl.tl.hd);
+ }
+};
+
+template <class T, class P1, class P2, class P3>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3> > > >
+{
+ static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3> > > > &tvl)
+ {
+ return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3> > > > &tvl)
+ {
+ return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+};
+
+template <class T, class P1, class P2, class P3, class P4>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+ TypeList <P4> > > > >
+{
+ static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4> > > > > &tvl)
+ {
+ return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4> > > > > &tvl)
+ {
+ return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+ class P5>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+ TypeList <P4, TypeList <P5> > > > > >
+{
+ static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5> > > > > > &tvl)
+ {
+ return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5> > > > > > &tvl)
+ {
+ return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+ class P5, class P6>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+ TypeList <P4, TypeList <P5, TypeList <P6> > > > > > >
+{
+ static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > > &tvl)
+ {
+ return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > > &tvl)
+ {
+ return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+ class P5, class P6, class P7>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+ TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > >
+{
+ static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+ TypeList <P7> > > > > > > > &tvl)
+ {
+ return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+ TypeList <P7> > > > > > > > &tvl)
+ {
+ return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+ class P5, class P6, class P7, class P8>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+ TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7,
+ TypeList <P8> > > > > > > > >
+{
+ static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+ TypeList <P7, TypeList <P8> > > > > > > > > &tvl)
+ {
+ return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+ static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+ TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+ TypeList <P7, TypeList <P8> > > > > > > > > &tvl)
+ {
+ return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+#endif
diff --git a/libs/lua/LuaBridge/detail/FuncArgs.h b/libs/lua/LuaBridge/detail/FuncArgs.h
new file mode 100644
index 0000000..38d0543
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/FuncArgs.h
@@ -0,0 +1,51 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2016, Robin Gareus <robin at gareus.org>
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+template <typename List, int Start = 1>
+struct FuncArgs
+{
+};
+
+template <int Start>
+struct FuncArgs<None, Start>
+{
+ static void refs (LuaRef, TypeListValues <None>)
+ {
+ }
+};
+
+template <typename Head, typename Tail, int Start>
+struct FuncArgs<TypeList <Head, Tail>, Start >
+{
+ static void refs (LuaRef l, TypeListValues <TypeList <Head, Tail> > tvl)
+ {
+ l[Start + 1] = tvl.hd;
+ FuncArgs <Tail, Start + 1>::refs (l, tvl.tl);
+ }
+};
diff --git a/libs/lua/LuaBridge/detail/FuncTraits.h b/libs/lua/LuaBridge/detail/FuncTraits.h
new file mode 100644
index 0000000..5cece7b
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/FuncTraits.h
@@ -0,0 +1,943 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+/**
+ Since the throw specification is part of a function signature, the FuncTraits
+ family of templates needs to be specialized for both types. The
+ LUABRIDGE_THROWSPEC macro controls whether we use the 'throw ()' form, or
+ 'noexcept' (if C++11 is available) to distinguish the functions.
+*/
+#if defined (__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__clang__) || defined(__GNUC__) || \
+ (defined (_MSC_VER) && (_MSC_VER >= 1700))
+// Do not define LUABRIDGE_THROWSPEC since the Xcode and gcc compilers do not
+// distinguish the throw specification in the function signature.
+#else
+// Visual Studio 10 and earlier pay too much mind to useless throw() spec.
+//
+# define LUABRIDGE_THROWSPEC throw()
+#endif
+
+//==============================================================================
+/**
+ Traits for function pointers.
+
+ There are three types of functions: global, non-const member, and const
+ member. These templates determine the type of function, which class type it
+ belongs to if it is a class member, the const-ness if it is a member
+ function, and the type information for the return value and argument list.
+
+ Expansions are provided for functions with up to 8 parameters. This can be
+ manually extended, or expanded to an arbitrary amount using C++11 features.
+*/
+template <class MemFn, class D = MemFn>
+struct FuncTraits
+{
+};
+
+/* Ordinary function pointers. */
+
+template <class R, class D>
+struct FuncTraits <R (*) (), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef None Params;
+ static R call (D fp, TypeListValues <Params>)
+ {
+ return fp ();
+ }
+};
+
+template <class R, class P1, class D>
+struct FuncTraits <R (*) (P1), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1> Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class D>
+struct FuncTraits <R (*) (P1, P2), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2> > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (*) (P1, P2, P3), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8, P9), D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+
+/* Non-const member function pointers. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) (), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef None Params;
+ static R call (T* obj, D fp, TypeListValues <Params>)
+ {
+ return (obj->*fp)();
+ }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1> Params;
+ static R call (T* obj, D fp, TypeListValues <Params> &tvl)
+ {
+ return (obj->*fp)(tvl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2> > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9), D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+
+/* Const member function pointers. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) () const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef None Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>)
+ {
+ return (obj->*fp)();
+ }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1> Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2> > Params;
+ static R call (T const* obj, R (T::*fp) (P1, P2) const,
+ TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) const, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+
+#if defined (LUABRIDGE_THROWSPEC)
+
+/* Ordinary function pointers. */
+
+template <class R, class D>
+struct FuncTraits <R (*) () LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef None Params;
+ static R call (D fp, TypeListValues <Params> const&)
+ {
+ return fp ();
+ }
+};
+
+template <class R, class P1, class D>
+struct FuncTraits <R (*) (P1) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1> Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class D>
+struct FuncTraits <R (*) (P1, P2) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2> > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (*) (P1, P2, P3) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = false;
+ typedef D DeclType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+ static R call (D fp, TypeListValues <Params>& tvl)
+ {
+ return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+/* Non-const member function pointers with THROWSPEC. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) () LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef None Params;
+ static R call (T* obj, D fp, TypeListValues <Params> const&)
+ {
+ return (obj->*fp)();
+ }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1> Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2> > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = false;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+ static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+
+/* Const member function pointers with THROWSPEC. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) () const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef None Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>)
+ {
+ return (obj->*fp)();
+ }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1> Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2> > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+ tvl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) const LUABRIDGE_THROWSPEC, D>
+{
+ static bool const isMemberFunction = true;
+ static bool const isConstMemberFunction = true;
+ typedef D DeclType;
+ typedef T ClassType;
+ typedef R ReturnType;
+ typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+ static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+ {
+ return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+ }
+};
+
+
+#endif
diff --git a/libs/lua/LuaBridge/detail/Iterator.h b/libs/lua/LuaBridge/detail/Iterator.h
new file mode 100644
index 0000000..d383743
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Iterator.h
@@ -0,0 +1,114 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+/** Allows table iteration.
+*/
+class Iterator
+{
+private:
+ lua_State* m_L;
+ LuaRef m_table;
+ LuaRef m_key;
+ LuaRef m_value;
+
+ void next ()
+ {
+ m_table.push(m_L);
+ m_key.push (m_L);
+ if (lua_next (m_L, -2))
+ {
+ m_value.pop (m_L);
+ m_key.pop (m_L);
+ }
+ else
+ {
+ m_key = Nil();
+ m_value = Nil();
+ }
+ lua_pop(m_L, 1);
+ }
+
+public:
+ explicit Iterator (LuaRef table)
+ : m_L (table.state ())
+ , m_table (table)
+ , m_key (table.state ()) // m_key is nil
+ , m_value (table.state ()) // m_value is nil
+ {
+ next (); // get the first (key, value) pair from table
+ }
+
+ lua_State* state () const
+ {
+ return m_L;
+ }
+
+ LuaRef operator* () const
+ {
+ return m_value;
+ }
+
+ LuaRef operator-> () const
+ {
+ return m_value;
+ }
+
+ Iterator& operator++ ()
+ {
+ if (isNil())
+ {
+ // if the iterator reaches the end, do nothing
+ return *this;
+ }
+ else
+ {
+ next();
+ return *this;
+ }
+ }
+
+ inline bool isNil () const
+ {
+ return m_key.isNil ();
+ }
+
+ inline LuaRef key () const
+ {
+ return m_key;
+ }
+
+ inline LuaRef value () const
+ {
+ return m_value;
+ }
+
+private:
+ // Don't use postfix increment, it is less efficient
+ Iterator operator++ (int);
+};
+
diff --git a/libs/lua/LuaBridge/detail/LuaException.h b/libs/lua/LuaBridge/detail/LuaException.h
new file mode 100644
index 0000000..a9a3f28
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/LuaException.h
@@ -0,0 +1,113 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2008, Nigel Atkinson <suprapilot+LuaCode at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+class LuaException : public std::exception
+{
+private:
+ lua_State* m_L;
+ std::string m_what;
+
+public:
+ //----------------------------------------------------------------------------
+ /**
+ Construct a LuaException after a lua_pcall().
+ */
+ LuaException (lua_State* L, int /*code*/)
+ : m_L (L)
+ {
+ whatFromStack ();
+ }
+
+ //----------------------------------------------------------------------------
+
+ LuaException (lua_State *L,
+ char const*,
+ char const*,
+ long)
+ : m_L (L)
+ {
+ whatFromStack ();
+ }
+
+ //----------------------------------------------------------------------------
+
+ ~LuaException() throw ()
+ {
+ }
+
+ //----------------------------------------------------------------------------
+
+ char const* what() const throw ()
+ {
+ return m_what.c_str();
+ }
+
+ //============================================================================
+ /**
+ Throw an exception.
+
+ This centralizes all the exceptions thrown, so that we can set
+ breakpoints before the stack is unwound, or otherwise customize the
+ behavior.
+ */
+ template <class Exception>
+ static void Throw (Exception e)
+ {
+ throw e;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Wrapper for lua_pcall that throws.
+ */
+ static void pcall (lua_State* L, int nargs = 0, int nresults = 0, int msgh = 0)
+ {
+ int code = lua_pcall (L, nargs, nresults, msgh);
+
+ if (code != LUABRIDGE_LUA_OK)
+ Throw (LuaException (L, code));
+ }
+
+ //----------------------------------------------------------------------------
+
+protected:
+ void whatFromStack ()
+ {
+ if (lua_gettop (m_L) > 0)
+ {
+ char const* s = lua_tostring (m_L, -1);
+ m_what = s ? s : "";
+ }
+ else
+ {
+ // stack is empty
+ m_what = "missing error";
+ }
+ }
+};
diff --git a/libs/lua/LuaBridge/detail/LuaHelpers.h b/libs/lua/LuaBridge/detail/LuaHelpers.h
new file mode 100644
index 0000000..02e9b29
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/LuaHelpers.h
@@ -0,0 +1,143 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2007, Nathan Reed
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+// These are for Lua versions prior to 5.2.0.
+//
+#if LUA_VERSION_NUM < 502
+inline int lua_absindex (lua_State* L, int idx)
+{
+ if (idx > LUA_REGISTRYINDEX && idx < 0)
+ return lua_gettop (L) + idx + 1;
+ else
+ return idx;
+}
+
+inline void lua_rawgetp (lua_State* L, int idx, void const* p)
+{
+ idx = lua_absindex (L, idx);
+ lua_pushlightuserdata (L, const_cast <void*> (p));
+ lua_rawget (L,idx);
+}
+
+inline void lua_rawsetp (lua_State* L, int idx, void const* p)
+{
+ idx = lua_absindex (L, idx);
+ lua_pushlightuserdata (L, const_cast <void*> (p));
+ // put key behind value
+ lua_insert (L, -2);
+ lua_rawset (L, idx);
+}
+
+#define LUA_OPEQ 1
+#define LUA_OPLT 2
+#define LUA_OPLE 3
+
+inline int lua_compare (lua_State* L, int idx1, int idx2, int op)
+{
+ switch (op)
+ {
+ case LUA_OPEQ:
+ return lua_equal (L, idx1, idx2);
+ break;
+
+ case LUA_OPLT:
+ return lua_lessthan (L, idx1, idx2);
+ break;
+
+ case LUA_OPLE:
+ return lua_equal (L, idx1, idx2) || lua_lessthan (L, idx1, idx2);
+ break;
+
+ default:
+ return 0;
+ };
+}
+
+inline int get_length (lua_State* L, int idx)
+{
+ return int (lua_objlen (L, idx));
+}
+
+#else
+inline int get_length (lua_State* L, int idx)
+{
+ lua_len (L, idx);
+ int len = int (luaL_checknumber (L, -1));
+ lua_pop (L, 1);
+ return len;
+}
+
+#endif
+
+#ifndef LUA_OK
+# define LUABRIDGE_LUA_OK 0
+#else
+# define LUABRIDGE_LUA_OK LUA_OK
+#endif
+
+/** Get a table value, bypassing metamethods.
+*/
+inline void rawgetfield (lua_State* L, int index, char const* key)
+{
+ assert (lua_istable (L, index));
+ index = lua_absindex (L, index);
+ lua_pushstring (L, key);
+ lua_rawget (L, index);
+}
+
+/** Set a table value, bypassing metamethods.
+*/
+inline void rawsetfield (lua_State* L, int index, char const* key)
+{
+ assert (lua_istable (L, index));
+ index = lua_absindex (L, index);
+ lua_pushstring (L, key);
+ lua_insert (L, -2);
+ lua_rawset (L, index);
+}
+
+/** Returns true if the value is a full userdata (not light).
+*/
+inline bool isfulluserdata (lua_State* L, int index)
+{
+ return lua_isuserdata (L, index) && !lua_islightuserdata (L, index);
+}
+
+/** Test lua_State objects for global equality.
+
+ This can determine if two different lua_State objects really point
+ to the same global state, such as when using coroutines.
+
+ @note This is used for assertions.
+*/
+inline bool equalstates (lua_State* L1, lua_State* L2)
+{
+ return lua_topointer (L1, LUA_REGISTRYINDEX) ==
+ lua_topointer (L2, LUA_REGISTRYINDEX);
+}
diff --git a/libs/lua/LuaBridge/detail/LuaRef.h b/libs/lua/LuaBridge/detail/LuaRef.h
new file mode 100644
index 0000000..46c7564
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/LuaRef.h
@@ -0,0 +1,1221 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2008, Nigel Atkinson <suprapilot+LuaCode at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+//------------------------------------------------------------------------------
+/**
+ Type tag for representing LUA_TNIL.
+
+ Construct one of these using `Nil()` to represent a Lua nil. This is faster
+ than creating a reference in the registry to nil. Example:
+
+ LuaRef t (LuaRef::createTable (L));
+ ...
+ t ["k"] = Nil(); // assign nil
+*/
+struct Nil
+{
+};
+
+//------------------------------------------------------------------------------
+/**
+ Lightweight reference to a Lua object.
+
+ The reference is maintained for the lifetime of the C++ object.
+*/
+class LuaRef
+{
+private:
+ class Proxy;
+ friend struct Stack <Proxy>;
+
+ //----------------------------------------------------------------------------
+ /**
+ Pop the Lua stack.
+
+ Pops the specified number of stack items on destruction. We use this
+ when returning objects, to avoid an explicit temporary variable, since
+ the destructor executes after the return statement. For example:
+
+ template <class U>
+ U cast (lua_State* L)
+ {
+ StackPop p (L, 1);
+ ...
+ return U (); // dtor called after this line
+ }
+
+ @note The `StackPop` object must always be a named local variable.
+ */
+ class StackPop
+ {
+ public:
+ /** Create a StackPop object.
+
+ @param count The number of stack entries to pop on destruction.
+ */
+ StackPop (lua_State* L, int count)
+ : m_L (L)
+ , m_count (count)
+ {
+ }
+
+ ~StackPop ()
+ {
+ lua_pop (m_L, m_count);
+ }
+
+ private:
+ lua_State* m_L;
+ int m_count;
+ };
+
+ //----------------------------------------------------------------------------
+ /**
+ A proxy for representing table values.
+ */
+ class Proxy
+ {
+ private:
+ lua_State* m_L;
+ int m_tableRef;
+ int m_keyRef;
+
+ public:
+ //--------------------------------------------------------------------------
+ /**
+ Construct a Proxy from a table value.
+
+ The table is in the registry, and the key is at the top of the stack.
+ The key is popped off the stack.
+ */
+ Proxy (lua_State* L, int tableRef)
+ : m_L (L)
+ , m_tableRef (tableRef)
+ , m_keyRef (luaL_ref (L, LUA_REGISTRYINDEX))
+ {
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Create a Proxy via copy constructor.
+
+ It is best to avoid code paths that invoke this, because it creates
+ an extra temporary Lua reference. Typically this is done by passing
+ the Proxy parameter as a `const` reference.
+ */
+ Proxy (Proxy const& other)
+ : m_L (other.m_L)
+ , m_tableRef (other.m_tableRef)
+ {
+ // If this assert goes off it means code is taking this path,
+ // which is better avoided.
+ //
+ assert (0);
+
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, other.m_keyRef);
+ m_keyRef = luaL_ref (m_L, LUA_REGISTRYINDEX);
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Destroy the proxy.
+
+ This does not destroy the table value.
+ */
+ ~Proxy ()
+ {
+ luaL_unref (m_L, LUA_REGISTRYINDEX, m_keyRef);
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Return a reference to the table value.
+ */
+ int createRef () const
+ {
+ push (m_L);
+ return luaL_ref (m_L, LUA_REGISTRYINDEX);
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Assign a new value to this table key.
+
+ This may invoke metamethods.
+ */
+ template <class T>
+ Proxy& operator= (T v)
+ {
+ StackPop p (m_L, 1);
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+ Stack <T>::push (m_L, v);
+ lua_rawset (m_L, -3);
+ return *this;
+ }
+
+ // the implementation needs UserdataPtr, which
+ // is not yet defined here.
+ // -> libs/ardour/lua_api.cc
+ Proxy& clone_instance (const void* key, void* p);
+
+ //--------------------------------------------------------------------------
+ /**
+ Assign a new value to this table key.
+
+ The assignment is raw, no metamethods are invoked.
+ */
+ template <class T>
+ Proxy& rawset (T v)
+ {
+ StackPop p (m_L, 1);
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+ Stack <T>::push (m_L, v);
+ lua_settable (m_L, -3);
+ return *this;
+ }
+
+ //==========================================================================
+ //
+ // This group of member functions mirrors the member functions in LuaRef.
+
+ /** Retrieve the lua_State associated with the table value.
+ */
+ lua_State* state () const
+ {
+ return m_L;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Push the value onto the Lua stack.
+ */
+ void push (lua_State* L) const
+ {
+ assert (equalstates (L, m_L));
+ lua_rawgeti (L, LUA_REGISTRYINDEX, m_tableRef);
+ lua_rawgeti (L, LUA_REGISTRYINDEX, m_keyRef);
+ lua_gettable (L, -2);
+ lua_remove (L, -2); // remove the table
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Determine the object type.
+
+ The return values are the same as for `lua_type`.
+ */
+ int type () const
+ {
+ int result;
+ push (m_L);
+ result = lua_type (m_L, -1);
+ lua_pop (m_L, 1);
+ return result;
+ }
+
+ inline bool isNil () const { return type () == LUA_TNIL; }
+ inline bool isBoolean () const { return type () == LUA_TBOOLEAN; }
+ inline bool isNumber () const { return type () == LUA_TNUMBER; }
+ inline bool isString () const { return type () == LUA_TSTRING; }
+ inline bool isTable () const { return type () == LUA_TTABLE; }
+ inline bool isFunction () const { return type () == LUA_TFUNCTION; }
+ inline bool isUserdata () const { return type () == LUA_TUSERDATA; }
+ inline bool isThread () const { return type () == LUA_TTHREAD; }
+ inline bool isLightUserdata () const { return type () == LUA_TLIGHTUSERDATA; }
+
+ //--------------------------------------------------------------------------
+ /**
+ Perform an explicit conversion.
+ */
+ template <class T>
+ T cast () const
+ {
+ StackPop p (m_L, 1);
+ push (m_L);
+
+ // lua_gettop is used because Userdata::getClass() doesn't handle
+ // negative stack indexes.
+ //
+ return Stack <T>::get (m_L, lua_gettop (m_L));
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Universal implicit conversion operator.
+
+ NOTE: Visual Studio 2010 and 2012 have a bug where this function
+ is not used. See:
+
+ http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/e30b2664-a92d-445c-9db2-e8e0fbde2014
+ https://connect.microsoft.com/VisualStudio/feedback/details/771509/correct-code-doesnt-compile
+
+ // This code snippet fails to compile in vs2010,vs2012
+ struct S {
+ template <class T> inline operator T () const { return T (); }
+ };
+ int main () {
+ S () || false;
+ return 0;
+ }
+ */
+ template <class T>
+ inline operator T () const
+ {
+ return cast <T> ();
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Universal comparison operators.
+ */
+ /** @{ */
+ template <class T>
+ bool operator== (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -2, -1, LUA_OPEQ) == 1;
+ }
+
+ template <class T>
+ bool operator< (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -2, -1, LUA_OPLT) == 1;
+ }
+
+ template <class T>
+ bool operator<= (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -2, -1, LUA_OPLE) == 1;
+ }
+
+ template <class T>
+ bool operator> (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -1, -2, LUA_OPLT) == 1;
+ }
+
+ template <class T>
+ bool operator>= (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -1, -2, LUA_OPLE) == 1;
+ }
+
+ template <class T>
+ bool rawequal (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_rawequal (m_L, -1, -2) == 1;
+ }
+ /** @} */
+
+ //--------------------------------------------------------------------------
+ /**
+ Access a table value using a key.
+
+ This invokes metamethods.
+ */
+ template <class T>
+ Proxy operator[] (T key) const
+ {
+ return LuaRef (*this) [key];
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Access a table value using a key.
+
+ The operation is raw, metamethods are not invoked. The result is
+ passed by value and may not be modified.
+ */
+ template <class T>
+ LuaRef rawget (T key) const
+ {
+ StackPop (m_L, 1);
+ push (m_L);
+ Stack <T>::push (m_L, key);
+ lua_rawget (m_L, -2);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Append a value to the table.
+
+ If the table is a sequence this will add another element to it.
+ */
+ template <class T>
+ void append (T v) const
+ {
+ push (m_L);
+ Stack <T>::push (m_L, v);
+ luaL_ref (m_L, -2);
+ lua_pop (m_L, 1);
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Call the length operator.
+
+ This is identical to applying the Lua # operator.
+ */
+ int length () const
+ {
+ StackPop p (m_L, 1);
+ push (m_L);
+ return get_length (m_L, -1);
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Call Lua code.
+
+ These overloads allow Lua code to be called with up to 8 parameters.
+ The return value is provided as a LuaRef (which may be LUA_REFNIL).
+ If an error occurs, a LuaException is thrown.
+ */
+ /** @{ */
+ LuaRef const operator() () const
+ {
+ push (m_L);
+ LuaException::pcall (m_L, 0, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1>
+ LuaRef const operator() (P1 p1) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ LuaException::pcall (m_L, 1, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2>
+ LuaRef const operator() (P1 p1, P2 p2) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ LuaException::pcall (m_L, 2, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ LuaException::pcall (m_L, 3, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ LuaException::pcall (m_L, 4, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ LuaException::pcall (m_L, 5, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5, class P6>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ Stack <P6>::push (m_L, p6);
+ LuaException::pcall (m_L, 6, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5, class P6, class P7>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ Stack <P6>::push (m_L, p6);
+ Stack <P7>::push (m_L, p7);
+ LuaException::pcall (m_L, 7, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ Stack <P6>::push (m_L, p6);
+ Stack <P7>::push (m_L, p7);
+ Stack <P8>::push (m_L, p8);
+ LuaException::pcall (m_L, 8, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+ /** @} */
+
+ //==========================================================================
+ };
+
+private:
+ friend struct Stack <LuaRef>;
+
+ //----------------------------------------------------------------------------
+ /**
+ Type tag for stack construction.
+ */
+ struct FromStack { };
+
+ //----------------------------------------------------------------------------
+ /**
+ Create a reference to an object at the top of the Lua stack and pop it.
+
+ This constructor is private and not invoked directly.
+ Instead, use the `fromStack` function.
+
+ @note The object is popped.
+ */
+ LuaRef (lua_State* L, FromStack)
+ : m_L (L)
+ {
+ m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Create a reference to an object on the Lua stack.
+
+ This constructor is private and not invoked directly.
+ Instead, use the `fromStack` function.
+
+ @note The object is not popped.
+ */
+ LuaRef (lua_State* L, int index, FromStack)
+ : m_L (L)
+ {
+ lua_pushvalue (m_L, index);
+ m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+ }
+
+ //----------------------------------------------------------------------------
+
+ // This type of construction is disallowed, since we don't have a `lua_State`.
+ //
+ template <class T>
+ LuaRef (T)
+ {
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Create a reference to this ref.
+
+ This is used internally.
+ */
+ int createRef () const
+ {
+ if (m_ref != LUA_REFNIL)
+ {
+ push (m_L);
+ return luaL_ref (m_L, LUA_REGISTRYINDEX);
+ }
+ else
+ {
+ return LUA_REFNIL;
+ }
+ }
+
+public:
+ //----------------------------------------------------------------------------
+ /**
+ Create a nil reference.
+
+ The LuaRef may be assigned later.
+ */
+ LuaRef (lua_State* L)
+ : m_L (L)
+ , m_ref (LUA_REFNIL)
+ {
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Create a reference to a value.
+ */
+ template <class T>
+ LuaRef (lua_State* L, T v)
+ : m_L (L)
+ {
+ Stack <T>::push (m_L, v);
+ m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Create a reference to a table value.
+ */
+ LuaRef (Proxy const& v)
+ : m_L (v.state ())
+ , m_ref (v.createRef ())
+ {
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Create a new reference to an existing reference.
+ */
+ LuaRef (LuaRef const& other)
+ : m_L (other.m_L)
+ , m_ref (other.createRef ())
+ {
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Destroy a reference.
+
+ The corresponding Lua registry reference will be released.
+
+ @note If the state refers to a thread, it is the responsibility of the
+ caller to ensure that the thread still exists when the LuaRef
+ is destroyed.
+ */
+ ~LuaRef ()
+ {
+ luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Return a LuaRef from a stack item.
+
+ The stack item is not popped.
+ */
+ static LuaRef fromStack (lua_State* L, int index)
+ {
+ lua_pushvalue (L, index);
+ return LuaRef (L, FromStack ());
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Create a new empty table and return a reference to it.
+
+ It is also possible to use the free function `newTable`.
+
+ @see ::getGlobal
+ */
+ static LuaRef newTable (lua_State* L)
+ {
+ lua_newtable (L);
+ return LuaRef (L, FromStack ());
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Return a reference to a named global.
+
+ It is also possible to use the free function `getGlobal`.
+
+ @see ::getGlobal
+ */
+ static LuaRef getGlobal (lua_State *L, char const* name)
+ {
+ lua_getglobal (L, name);
+ return LuaRef (L, FromStack ());
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Assign a different value to this LuaRef.
+ */
+ template <class T>
+ LuaRef& operator= (T rhs)
+ {
+ luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+ Stack <T>::push (m_L, rhs);
+ m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+ return *this;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Assign another LuaRef to this LuaRef.
+ */
+ LuaRef& operator= (LuaRef const& rhs)
+ {
+ luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+ rhs.push (m_L);
+ m_L = rhs.state ();
+ m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+ return *this;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ converts to a string using luas tostring function
+ */
+ std::string tostring() const
+ {
+ lua_getglobal (m_L, "tostring");
+ push (m_L);
+ lua_call (m_L, 1, 1);
+ const char* str = lua_tostring(m_L, 1);
+ lua_pop(m_L, 1);
+ return std::string(str);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Print a text description of the value to a stream.
+
+ This is used for diagnostics.
+ */
+ void print (std::ostream& os) const
+ {
+ switch (type ())
+ {
+ case LUA_TNIL:
+ os << "nil";
+ break;
+
+ case LUA_TNUMBER:
+ os << cast <lua_Number> ();
+ break;
+
+ case LUA_TBOOLEAN:
+ os << (cast <bool> () ? "true" : "false");
+ break;
+
+ case LUA_TSTRING:
+ os << '"' << cast <std::string> () << '"';
+ break;
+
+ case LUA_TTABLE:
+ os << "table: " << tostring();
+ break;
+
+ case LUA_TFUNCTION:
+ os << "function: " << tostring();
+ break;
+
+ case LUA_TUSERDATA:
+ os << "userdata: " << tostring();
+ break;
+
+ case LUA_TTHREAD:
+ os << "thread: " << tostring();
+ break;
+
+ case LUA_TLIGHTUSERDATA:
+ os << "lightuserdata: " << tostring();
+ break;
+
+ default:
+ os << "unknown";
+ break;
+ }
+ }
+
+ //============================================================================
+ //
+ // This group of member functions is mirrored in Proxy
+ //
+
+ /** Retrieve the lua_State associated with the reference.
+ */
+ lua_State* state () const
+ {
+ return m_L;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Place the object onto the Lua stack.
+ */
+ void push (lua_State* L) const
+ {
+ assert (equalstates (L, m_L));
+ lua_rawgeti (L, LUA_REGISTRYINDEX, m_ref);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Pop the top of Lua stack and assign the ref to m_ref
+ */
+ void pop (lua_State* L)
+ {
+ assert (equalstates (L, m_L));
+ luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+ m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Determine the object type.
+
+ The return values are the same as for `lua_type`.
+ */
+ /** @{ */
+ int type () const
+ {
+ int result;
+ if (m_ref != LUA_REFNIL)
+ {
+ push (m_L);
+ result = lua_type (m_L, -1);
+ lua_pop (m_L, 1);
+ }
+ else
+ {
+ result = LUA_TNIL;
+ }
+
+ return result;
+ }
+
+ // should never happen
+ //inline bool isNone () const { return m_ref == LUA_NOREF; }
+
+ inline bool isNil () const { return type () == LUA_TNIL; }
+ inline bool isNumber () const { return type () == LUA_TNUMBER; }
+ inline bool isString () const { return type () == LUA_TSTRING; }
+ inline bool isTable () const { return type () == LUA_TTABLE; }
+ inline bool isFunction () const { return type () == LUA_TFUNCTION; }
+ inline bool isUserdata () const { return type () == LUA_TUSERDATA; }
+ inline bool isThread () const { return type () == LUA_TTHREAD; }
+ inline bool isLightUserdata () const { return type () == LUA_TLIGHTUSERDATA; }
+ /** @} */
+
+ //----------------------------------------------------------------------------
+ /**
+ Perform an explicit conversion.
+ */
+ template <class T>
+ T cast () const
+ {
+ StackPop p (m_L, 1);
+ push (m_L);
+
+ // lua_gettop is used because Userdata::getClass() doesn't handle
+ // negative stack indexes.
+ //
+ return Stack <T>::get (m_L, lua_gettop (m_L));
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Universal implicit conversion operator.
+
+ NOTE: Visual Studio 2010 and 2012 have a bug where this function
+ is not used. See:
+
+ http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/e30b2664-a92d-445c-9db2-e8e0fbde2014
+ https://connect.microsoft.com/VisualStudio/feedback/details/771509/correct-code-doesnt-compile
+
+ // This code snippet fails to compile in vs2010,vs2012
+ struct S {
+ template <class T> inline operator T () const { return T (); }
+ };
+ int main () {
+ S () || false;
+ return 0;
+ }
+ */
+ template <class T>
+ inline operator T () const
+ {
+ return cast <T> ();
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Universal comparison operators.
+ */
+ /** @{ */
+ template <class T>
+ bool operator== (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -2, -1, LUA_OPEQ) == 1;
+ }
+
+ template <class T>
+ bool operator< (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -2, -1, LUA_OPLT) == 1;
+ }
+
+ template <class T>
+ bool operator<= (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -2, -1, LUA_OPLE) == 1;
+ }
+
+ template <class T>
+ bool operator> (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -1, -2, LUA_OPLT) == 1;
+ }
+
+ template <class T>
+ bool operator>= (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_compare (m_L, -1, -2, LUA_OPLE) == 1;
+ }
+
+ template <class T>
+ bool rawequal (T rhs) const
+ {
+ StackPop p (m_L, 2);
+ push (m_L);
+ Stack <T>::push (m_L, rhs);
+ return lua_rawequal (m_L, -1, -2) == 1;
+ }
+ /** @} */
+
+ //----------------------------------------------------------------------------
+ /**
+ Append a value to the table.
+
+ If the table is a sequence this will add another element to it.
+ */
+ template <class T>
+ void append (T v) const
+ {
+ push (m_L);
+ Stack <T>::push (m_L, v);
+ luaL_ref (m_L, -2);
+ lua_pop (m_L, 1);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Call the length operator.
+
+ This is identical to applying the Lua # operator.
+ */
+ int length () const
+ {
+ StackPop p (m_L, 1);
+ push (m_L);
+ return get_length (m_L, -1);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Access a table value using a key.
+
+ This invokes metamethods.
+ */
+ template <class T>
+ Proxy operator[] (T key) const
+ {
+ Stack <T>::push (m_L, key);
+ return Proxy (m_L, m_ref);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Call Lua code.
+
+ These overloads allow Lua code to be called with up to 8 parameters.
+ The return value is provided as a LuaRef (which may be LUA_REFNIL).
+ If an error occurs, a LuaException is thrown.
+ */
+ /** @{ */
+ LuaRef const operator() () const
+ {
+ push (m_L);
+ LuaException::pcall (m_L, 0, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1>
+ LuaRef const operator() (P1 p1) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ LuaException::pcall (m_L, 1, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2>
+ LuaRef const operator() (P1 p1, P2 p2) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ LuaException::pcall (m_L, 2, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ LuaException::pcall (m_L, 3, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ LuaException::pcall (m_L, 4, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ LuaException::pcall (m_L, 5, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5, class P6>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ Stack <P6>::push (m_L, p6);
+ LuaException::pcall (m_L, 6, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5, class P6, class P7>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ Stack <P6>::push (m_L, p6);
+ Stack <P7>::push (m_L, p7);
+ LuaException::pcall (m_L, 7, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+
+ template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
+ LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) const
+ {
+ push (m_L);
+ Stack <P1>::push (m_L, p1);
+ Stack <P2>::push (m_L, p2);
+ Stack <P3>::push (m_L, p3);
+ Stack <P4>::push (m_L, p4);
+ Stack <P5>::push (m_L, p5);
+ Stack <P6>::push (m_L, p6);
+ Stack <P7>::push (m_L, p7);
+ Stack <P8>::push (m_L, p8);
+ LuaException::pcall (m_L, 8, 1);
+ return LuaRef (m_L, FromStack ());
+ }
+ /** @} */
+
+ //============================================================================
+
+private:
+ lua_State* m_L;
+ int m_ref;
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for Nil
+*/
+template <>
+struct Stack <Nil>
+{
+public:
+ static inline void push (lua_State* L, Nil)
+ {
+ lua_pushnil (L);
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for LuaRef.
+*/
+template <>
+struct Stack <LuaRef>
+{
+public:
+ // The value is const& to prevent a copy construction.
+ //
+ static inline void push (lua_State* L, LuaRef const& v)
+ {
+ v.push (L);
+ }
+
+ static inline LuaRef get (lua_State* L, int index)
+ {
+ return LuaRef (L, index, LuaRef::FromStack ());
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for Proxy.
+*/
+template <>
+struct Stack <LuaRef::Proxy>
+{
+public:
+ // The value is const& to prevent a copy construction.
+ //
+ static inline void push (lua_State* L, LuaRef::Proxy const& v)
+ {
+ v.push (L);
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Create a reference to a new, empty table.
+
+ This is a syntactic abbreviation for LuaRef::newTable().
+*/
+inline LuaRef newTable (lua_State* L)
+{
+ return LuaRef::newTable (L);
+}
+
+//------------------------------------------------------------------------------
+/**
+ Create a reference to a value in the global table.
+
+ This is a syntactic abbreviation for LuaRef::getGlobal().
+*/
+inline LuaRef getGlobal (lua_State *L, char const* name)
+{
+ return LuaRef::getGlobal (L, name);
+}
+
+//------------------------------------------------------------------------------
+/**
+ Write a LuaRef to a stream.
+
+ This allows LuaRef and table proxies to work with streams.
+*/
+inline std::ostream& operator<< (std::ostream& os, LuaRef const& ref)
+{
+ ref.print (os);
+ return os;
+}
+
+//------------------------------------------------------------------------------
+
+// more C++-like cast syntax
+//
+template<class T>
+inline T LuaRef_cast(LuaRef const& lr)
+{
+ return lr.cast<T>();
+}
diff --git a/libs/lua/LuaBridge/detail/Namespace.h b/libs/lua/LuaBridge/detail/Namespace.h
new file mode 100644
index 0000000..92aed81
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Namespace.h
@@ -0,0 +1,1834 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2016, Robin Gareus <robin at gareus.org>
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2007, Nathan Reed
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+#ifdef LUABINDINGDOC
+#include <iostream>
+#include <typeinfo>
+#include <execinfo.h>
+#include <type_traits>
+#include <cxxabi.h>
+#include <memory>
+#include <string>
+#include <cstdlib>
+
+template <class T>
+std::string type_name()
+{
+ typedef typename std::remove_reference<T>::type TR;
+ std::unique_ptr<char, void(*)(void*)> own
+ (
+ abi::__cxa_demangle(typeid(TR).name(), nullptr,
+ nullptr, nullptr),
+ std::free
+ );
+ std::string r = own != nullptr ? own.get() : typeid(TR).name();
+ if (std::is_const<TR>::value)
+ r += " const";
+ if (std::is_volatile<TR>::value)
+ r += " volatile";
+ if (std::is_lvalue_reference<T>::value)
+ r += "&";
+ else if (std::is_rvalue_reference<T>::value)
+ r += "&&";
+ return r;
+}
+
+//#define LUADOCOUT
+
+#ifdef LUADOCOUT // lua
+#define KEYSTA "[\""
+#define KEYEND "\"] = "
+#else // JSON
+#define KEYSTA "\""
+#define KEYEND "\" : "
+#endif
+
+#define CLASSDOC(TYPE, LUANAME, DECL, PARENTDECL) \
+ if (LuaBindingDoc::printBindings ()) { \
+ std::cout << "{ " << KEYSTA << "type" << KEYEND << " \"" << TYPE << "\",\n"; \
+ std::cout << " " << KEYSTA << "lua" << KEYEND << " \"" << LUANAME << "\",\n"; \
+ std::cout << " " << KEYSTA << "decl" << KEYEND << " \"" << DECL << "\",\n"; \
+ std::cout << " " << KEYSTA << "parent" << KEYEND << "\"" << PARENTDECL << "\"\n"; \
+ std::cout << "},\n"; \
+ }
+
+#define PRINTDOC(TYPE, LUANAME, RETVAL, DECL) \
+ if (LuaBindingDoc::printBindings ()) { \
+ std::cout << "{ " << KEYSTA << "type" << KEYEND << " \"" << TYPE << "\",\n"; \
+ std::cout << " " << KEYSTA << "lua" << KEYEND << " \"" << LUANAME << "\",\n"; \
+ if (!(RETVAL).empty()) { \
+ std::cout << " " << KEYSTA << "ret" << KEYEND << " \"" << (RETVAL) << "\",\n"; \
+ } \
+ std::cout << " " << KEYSTA << "decl" << KEYEND << " \"" << DECL << "\"\n"; \
+ std::cout << "},\n"; \
+ }
+
+#define FUNDOC(TYPE, NAME, FUNCTOR) \
+ PRINTDOC(TYPE, _name << NAME, \
+ type_name< typename FuncTraits <FUNCTOR>::ReturnType >(), \
+ type_name< typename FuncTraits <FUNCTOR>::DeclType >())
+
+#define DATADOC(TYPE, NAME, FUNCTOR) \
+ PRINTDOC(TYPE, _name << NAME, \
+ std::string(), \
+ type_name< decltype(FUNCTOR) >())\
+
+
+#else
+
+#define CLASSDOC(TYPE, LUANAME, DECL, PARENTDECL)
+#define PRINTDOC(TYPE, LUANAME, RETVAL, DECL)
+#define FUNDOC(TYPE, NAME, FUNCTOR)
+#define DATADOC(TYPE, NAME, FUNCTOR)
+
+#endif
+
+/** Provides C++ to Lua registration capabilities.
+
+ This class is not instantiated directly, call `getGlobalNamespace` to start
+ the registration process.
+*/
+class Namespace
+{
+private:
+ Namespace& operator= (Namespace const& other);
+
+ lua_State* const L;
+ int mutable m_stackSize;
+
+private:
+ //============================================================================
+ /**
+ Error reporting.
+
+ VF: This function looks handy, why aren't we using it?
+ */
+#if 0
+ static int luaError (lua_State* L, std::string message)
+ {
+ assert (lua_isstring (L, lua_upvalueindex (1)));
+ std::string s;
+
+ // Get information on the caller's caller to format the message,
+ // so the error appears to originate from the Lua source.
+ lua_Debug ar;
+ int result = lua_getstack (L, 2, &ar);
+ if (result != 0)
+ {
+ lua_getinfo (L, "Sl", &ar);
+ s = ar.short_src;
+ if (ar.currentline != -1)
+ {
+ // poor mans int to string to avoid <strstrream>.
+ lua_pushnumber (L, ar.currentline);
+ s = s + ":" + lua_tostring (L, -1) + ": ";
+ lua_pop (L, 1);
+ }
+ }
+
+ s = s + message;
+
+ return luaL_error (L, s.c_str ());
+ }
+#endif
+
+ //----------------------------------------------------------------------------
+ /**
+ Pop the Lua stack.
+ */
+ void pop (int n) const
+ {
+ if (m_stackSize >= n && lua_gettop (L) >= n)
+ {
+ lua_pop (L, n);
+ m_stackSize -= n;
+ }
+ else
+ {
+ throw std::logic_error ("invalid stack");
+ }
+ }
+
+private:
+ /**
+ Factored base to reduce template instantiations.
+ */
+ class ClassBase
+ {
+ private:
+ ClassBase& operator= (ClassBase const& other);
+
+ protected:
+ friend class Namespace;
+
+ lua_State* const L;
+ int mutable m_stackSize;
+
+#ifdef LUABINDINGDOC
+ std::string _name;
+ const Namespace* _parent;
+#endif
+
+ protected:
+ //--------------------------------------------------------------------------
+ /**
+ __index metamethod for a class.
+
+ This implements member functions, data members, and property members.
+ Functions are stored in the metatable and const metatable. Data members
+ and property members are in the __propget table.
+
+ If the key is not found, the search proceeds up the hierarchy of base
+ classes.
+ */
+ static int indexMetaMethod (lua_State* L)
+ {
+ int result = 0;
+
+ assert (lua_isuserdata (L, 1)); // warn on security bypass
+ lua_getmetatable (L, 1); // get metatable for object
+ for (;;)
+ {
+ lua_pushvalue (L, 2); // push key arg2
+ lua_rawget (L, -2); // lookup key in metatable
+ if (lua_iscfunction (L, -1)) // ensure its a cfunction
+ {
+ lua_remove (L, -2); // remove metatable
+ result = 1;
+ break;
+ }
+ else if (lua_isnil (L, -1))
+ {
+ lua_pop (L, 1);
+ }
+ else
+ {
+ lua_pop (L, 2);
+ throw std::logic_error ("not a cfunction");
+ }
+
+ rawgetfield (L, -1, "__propget"); // get __propget table
+ if (lua_istable (L, -1)) // ensure it is a table
+ {
+ lua_pushvalue (L, 2); // push key arg2
+ lua_rawget (L, -2); // lookup key in __propget
+ lua_remove (L, -2); // remove __propget
+ if (lua_iscfunction (L, -1)) // ensure its a cfunction
+ {
+ lua_remove (L, -2); // remove metatable
+ lua_pushvalue (L, 1); // push class arg1
+ lua_call (L, 1, 1);
+ result = 1;
+ break;
+ }
+ else if (lua_isnil (L, -1))
+ {
+ lua_pop (L, 1);
+ }
+ else
+ {
+ lua_pop (L, 2);
+
+ // We only put cfunctions into __propget.
+ throw std::logic_error ("not a cfunction");
+ }
+ }
+ else
+ {
+ lua_pop (L, 2);
+
+ // __propget is missing, or not a table.
+ throw std::logic_error ("missing __propget table");
+ }
+
+ // Repeat the lookup in the __parent metafield,
+ // or return nil if the field doesn't exist.
+ rawgetfield (L, -1, "__parent");
+ if (lua_istable (L, -1))
+ {
+ // Remove metatable and repeat the search in __parent.
+ lua_remove (L, -2);
+ }
+ else if (lua_isnil (L, -1))
+ {
+ result = 1;
+ break;
+ }
+ else
+ {
+ lua_pop (L, 2);
+
+ throw std::logic_error ("__parent is not a table");
+ }
+ }
+
+ return result;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ __newindex metamethod for classes.
+
+ This supports writable variables and properties on class objects. The
+ corresponding object is passed in the first parameter to the set function.
+ */
+ static int newindexMetaMethod (lua_State* L)
+ {
+ int result = 0;
+
+ lua_getmetatable (L, 1);
+
+ for (;;)
+ {
+ // Check __propset
+ rawgetfield (L, -1, "__propset");
+ if (!lua_isnil (L, -1))
+ {
+ lua_pushvalue (L, 2);
+ lua_rawget (L, -2);
+ if (!lua_isnil (L, -1))
+ {
+ // found it, call the setFunction.
+ assert (lua_isfunction (L, -1));
+ lua_pushvalue (L, 1);
+ lua_pushvalue (L, 3);
+ lua_call (L, 2, 0);
+ result = 0;
+ break;
+ }
+ lua_pop (L, 1);
+ }
+ lua_pop (L, 1);
+
+ // Repeat the lookup in the __parent metafield.
+ rawgetfield (L, -1, "__parent");
+ if (lua_isnil (L, -1))
+ {
+ // Either the property or __parent must exist.
+ result = luaL_error (L,
+ "no member named '%s'", lua_tostring (L, 2));
+ }
+ lua_remove (L, -2);
+ }
+
+ return result;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Create the const table.
+ */
+ void createConstTable (char const* name)
+ {
+ lua_newtable (L);
+ lua_pushvalue (L, -1);
+ lua_setmetatable (L, -2);
+ lua_pushboolean (L, 1);
+ lua_rawsetp (L, -2, getIdentityKey ());
+ lua_pushstring (L, (std::string ("const ") + name).c_str ());
+ rawsetfield (L, -2, "__type");
+ lua_pushcfunction (L, &indexMetaMethod);
+ rawsetfield (L, -2, "__index");
+ lua_pushcfunction (L, &newindexMetaMethod);
+ rawsetfield (L, -2, "__newindex");
+ lua_newtable (L);
+ rawsetfield (L, -2, "__propget");
+
+ if (Security::hideMetatables ())
+ {
+ lua_pushnil (L);
+ rawsetfield (L, -2, "__metatable");
+ }
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Create the class table.
+
+ The Lua stack should have the const table on top.
+ */
+ void createClassTable (char const* name)
+ {
+ lua_newtable (L);
+ lua_pushvalue (L, -1);
+ lua_setmetatable (L, -2);
+ lua_pushboolean (L, 1);
+ lua_rawsetp (L, -2, getIdentityKey ());
+ lua_pushstring (L, name);
+ rawsetfield (L, -2, "__type");
+ lua_pushcfunction (L, &indexMetaMethod);
+ rawsetfield (L, -2, "__index");
+ lua_pushcfunction (L, &newindexMetaMethod);
+ rawsetfield (L, -2, "__newindex");
+ lua_newtable (L);
+ rawsetfield (L, -2, "__propget");
+ lua_newtable (L);
+ rawsetfield (L, -2, "__propset");
+
+ lua_pushvalue (L, -2);
+ rawsetfield (L, -2, "__const"); // point to const table
+
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -3, "__class"); // point const table to class table
+
+ if (Security::hideMetatables ())
+ {
+ lua_pushnil (L);
+ rawsetfield (L, -2, "__metatable");
+ }
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Create the static table.
+
+ The Lua stack should have:
+ -1 class table
+ -2 const table
+ -3 enclosing namespace
+ */
+ void createStaticTable (char const* name)
+ {
+ lua_newtable (L);
+ lua_newtable (L);
+ lua_pushvalue (L, -1);
+ lua_setmetatable (L, -3);
+ lua_insert (L, -2);
+ rawsetfield (L, -5, name);
+
+#if 0
+ lua_pushlightuserdata (L, this);
+ lua_pushcclosure (L, &tostringMetaMethod, 1);
+ rawsetfield (L, -2, "__tostring");
+#endif
+ lua_pushcfunction (L, &CFunc::indexMetaMethod);
+ rawsetfield (L, -2, "__index");
+ lua_pushcfunction (L, &CFunc::newindexMetaMethod);
+ rawsetfield (L, -2, "__newindex");
+ lua_newtable (L);
+ rawsetfield (L, -2, "__propget");
+ lua_newtable (L);
+ rawsetfield (L, -2, "__propset");
+
+ lua_pushvalue (L, -2);
+ rawsetfield (L, -2, "__class"); // point to class table
+
+ if (Security::hideMetatables ())
+ {
+ lua_pushnil (L);
+ rawsetfield (L, -2, "__metatable");
+ }
+ }
+
+ //==========================================================================
+ /**
+ lua_CFunction to construct a class object wrapped in a container.
+ */
+ template <class Params, class C>
+ static int ctorContainerProxy (lua_State* L)
+ {
+ typedef typename ContainerTraits <C>::Type T;
+ ArgList <Params, 2> args (L);
+ T* const p = Constructor <T, Params>::call (args);
+ UserdataSharedHelper <C, false>::push (L, p);
+ return 1;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ lua_CFunction to construct a class object in-place in the userdata.
+ */
+ template <class Params, class T>
+ static int ctorPlacementProxy (lua_State* L)
+ {
+ ArgList <Params, 2> args (L);
+ Constructor <T, Params>::call (UserdataValue <T>::place (L), args);
+ return 1;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Pop the Lua stack.
+ */
+ void pop (int n) const
+ {
+ if (m_stackSize >= n && lua_gettop (L) >= n)
+ {
+ lua_pop (L, n);
+ m_stackSize -= n;
+ }
+ else
+ {
+ throw std::logic_error ("invalid stack");
+ }
+ }
+
+ public:
+ //--------------------------------------------------------------------------
+ explicit ClassBase (lua_State* L_)
+ : L (L_)
+ , m_stackSize (0)
+ {
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Copy Constructor.
+ */
+ ClassBase (ClassBase const& other)
+ : L (other.L)
+ , m_stackSize (0)
+#ifdef LUABINDINGDOC
+ , _name (other._name)
+ , _parent (other._parent)
+#endif
+ {
+ m_stackSize = other.m_stackSize;
+ other.m_stackSize = 0;
+ }
+
+ ~ClassBase ()
+ {
+ pop (m_stackSize);
+ }
+ };
+
+ //============================================================================
+ //
+ // Class
+ //
+ //============================================================================
+ /**
+ Provides a class registration in a lua_State.
+
+ After contstruction the Lua stack holds these objects:
+ -1 static table
+ -2 class table
+ -3 const table
+ -4 (enclosing namespace)
+ */
+ template <class T>
+ class Class : virtual public ClassBase
+ {
+ public:
+ //==========================================================================
+ /**
+ Register a new class or add to an existing class registration.
+ */
+ Class (char const* name, Namespace const* parent) : ClassBase (parent->L)
+ {
+#ifdef LUABINDINGDOC
+ _parent = parent;
+ _name = parent->_name + name + ":";
+#endif
+ PRINTDOC ("[C] Class", parent->_name << name, std::string(), type_name <T>())
+ m_stackSize = parent->m_stackSize + 3;
+ parent->m_stackSize = 0;
+
+ assert (lua_istable (L, -1));
+ rawgetfield (L, -1, name);
+
+ if (lua_isnil (L, -1))
+ {
+ lua_pop (L, 1);
+
+ createConstTable (name);
+ lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+ rawsetfield (L, -2, "__gc");
+
+ createClassTable (name);
+ lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+ rawsetfield (L, -2, "__gc");
+
+ createStaticTable (name);
+
+ // Map T back to its tables.
+ lua_pushvalue (L, -1);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+ lua_pushvalue (L, -2);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+ lua_pushvalue (L, -3);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+ }
+ else
+ {
+ lua_pop (L, 1);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+ rawgetfield (L, -1, "__class");
+ rawgetfield (L, -1, "__const");
+
+ // Reverse the top 3 stack elements
+ lua_insert (L, -3);
+ lua_insert (L, -2);
+ }
+ }
+
+ //==========================================================================
+ /**
+ Derive a new class.
+ */
+ Class (char const* name, Namespace const* parent, void const* const staticKey)
+ : ClassBase (parent->L)
+ {
+#ifdef LUABINDINGDOC
+ _parent = parent;
+ _name = parent->_name + name + ":";
+#endif
+ m_stackSize = parent->m_stackSize + 3;
+ parent->m_stackSize = 0;
+
+ assert (lua_istable (L, -1));
+
+ createConstTable (name);
+ lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+ rawsetfield (L, -2, "__gc");
+
+ createClassTable (name);
+ lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+ rawsetfield (L, -2, "__gc");
+
+ createStaticTable (name);
+
+ lua_rawgetp (L, LUA_REGISTRYINDEX, staticKey);
+ assert (lua_istable (L, -1));
+ rawgetfield (L, -1, "__class");
+ assert (lua_istable (L, -1));
+ rawgetfield (L, -1, "__const");
+ assert (lua_istable (L, -1));
+
+ rawsetfield (L, -6, "__parent");
+ rawsetfield (L, -4, "__parent");
+ rawsetfield (L, -2, "__parent");
+
+ lua_pushvalue (L, -1);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+ lua_pushvalue (L, -2);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+ lua_pushvalue (L, -3);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Continue registration in the enclosing namespace.
+ */
+ Namespace endClass ()
+ {
+ return Namespace (this);
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a static data member.
+ */
+ template <class U>
+ Class <T>& addStaticData (char const* name, U* pu, bool isWritable = true)
+ {
+ DATADOC ("Static Data Member", name, pu)
+ assert (lua_istable (L, -1));
+
+ rawgetfield (L, -1, "__propget");
+ assert (lua_istable (L, -1));
+ lua_pushlightuserdata (L, pu);
+ lua_pushcclosure (L, &CFunc::getVariable <U>, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ rawgetfield (L, -1, "__propset");
+ assert (lua_istable (L, -1));
+ if (isWritable)
+ {
+ lua_pushlightuserdata (L, pu);
+ lua_pushcclosure (L, &CFunc::setVariable <U>, 1);
+ }
+ else
+ {
+ lua_pushstring (L, name);
+ lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+ }
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ return *this;
+ }
+
+ //--------------------------------------------------------------------------
+#if 0 // unused
+ /**
+ Add or replace a static property member.
+
+ If the set function is null, the property is read-only.
+ */
+ template <class U>
+ Class <T>& addStaticProperty (char const* name, U (*get)(), void (*set)(U) = 0)
+ {
+ typedef U (*get_t)();
+ typedef void (*set_t)(U);
+
+ assert (lua_istable (L, -1));
+
+ rawgetfield (L, -1, "__propget");
+ assert (lua_istable (L, -1));
+ new (lua_newuserdata (L, sizeof (get))) get_t (get);
+ lua_pushcclosure (L, &CFunc::Call <U (*) (void)>::f, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ rawgetfield (L, -1, "__propset");
+ assert (lua_istable (L, -1));
+ if (set != 0)
+ {
+ new (lua_newuserdata (L, sizeof (set))) set_t (set);
+ lua_pushcclosure (L, &CFunc::Call <void (*) (U)>::f, 1);
+ }
+ else
+ {
+ lua_pushstring (L, name);
+ lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+ }
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ return *this;
+ }
+#endif
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a static member function.
+ */
+ template <class FP>
+ Class <T>& addStaticFunction (char const* name, FP const fp)
+ {
+ FUNDOC ("Static Member Function", name, FP)
+ new (lua_newuserdata (L, sizeof (fp))) FP (fp);
+ lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
+ rawsetfield (L, -2, name);
+
+ return *this;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a lua_CFunction.
+ */
+ Class <T>& addStaticCFunction (char const* name, int (*const fp)(lua_State*))
+ {
+ DATADOC ("Static C Function", name, fp)
+ lua_pushcfunction (L, fp);
+ rawsetfield (L, -2, name);
+ return *this;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a data member.
+ */
+ template <class U>
+ Class <T>& addData (char const* name, const U T::* mp, bool isWritable = true)
+ {
+ DATADOC ("Data Member", name, mp)
+ typedef const U T::*mp_t;
+
+ // Add to __propget in class and const tables.
+ {
+ rawgetfield (L, -2, "__propget");
+ rawgetfield (L, -4, "__propget");
+ new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
+ lua_pushcclosure (L, &CFunc::getProperty <T,U>, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -4, name);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 2);
+ }
+
+ if (isWritable)
+ {
+ // Add to __propset in class table.
+ rawgetfield (L, -2, "__propset");
+ assert (lua_istable (L, -1));
+ new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
+ lua_pushcclosure (L, &CFunc::setProperty <T,U>, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+ }
+
+ return *this;
+ }
+
+#if 0 // unused
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a property member.
+ */
+ template <class TG, class TS>
+ Class <T>& addProperty (char const* name, TG (T::* get) () const, void (T::* set) (TS))
+ {
+ // Add to __propget in class and const tables.
+ {
+ rawgetfield (L, -2, "__propget");
+ rawgetfield (L, -4, "__propget");
+ typedef TG (T::*get_t) () const;
+ new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+ lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -4, name);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 2);
+ }
+
+ {
+ // Add to __propset in class table.
+ rawgetfield (L, -2, "__propset");
+ assert (lua_istable (L, -1));
+ typedef void (T::* set_t) (TS);
+ new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
+ lua_pushcclosure (L, &CFunc::CallMember <set_t>::f, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+ }
+
+ return *this;
+ }
+
+ // read-only
+ template <class TG>
+ Class <T>& addProperty (char const* name, TG (T::* get) () const)
+ {
+ // Add to __propget in class and const tables.
+ rawgetfield (L, -2, "__propget");
+ rawgetfield (L, -4, "__propget");
+ typedef TG (T::*get_t) () const;
+ new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+ lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -4, name);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 2);
+
+ return *this;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a property member, by proxy.
+
+ When a class is closed for modification and does not provide (or cannot
+ provide) the function signatures necessary to implement get or set for
+ a property, this will allow non-member functions act as proxies.
+
+ Both the get and the set functions require a T const* and T* in the first
+ argument respectively.
+ */
+ template <class TG, class TS>
+ Class <T>& addProperty (char const* name, TG (*get) (T const*), void (*set) (T*, TS))
+ {
+ // Add to __propget in class and const tables.
+ {
+ rawgetfield (L, -2, "__propget");
+ rawgetfield (L, -4, "__propget");
+ typedef TG (*get_t) (T const*);
+ new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+ lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -4, name);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 2);
+ }
+
+ if (set != 0)
+ {
+ // Add to __propset in class table.
+ rawgetfield (L, -2, "__propset");
+ assert (lua_istable (L, -1));
+ typedef void (*set_t) (T*, TS);
+ new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
+ lua_pushcclosure (L, &CFunc::Call <set_t>::f, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+ }
+
+ return *this;
+ }
+
+ // read-only
+ template <class TG, class TS>
+ Class <T>& addProperty (char const* name, TG (*get) (T const*))
+ {
+ // Add to __propget in class and const tables.
+ rawgetfield (L, -2, "__propget");
+ rawgetfield (L, -4, "__propget");
+ typedef TG (*get_t) (T const*);
+ new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+ lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -4, name);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 2);
+
+ return *this;
+ }
+#endif
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a member function.
+ */
+ template <class MemFn>
+ Class <T>& addFunction (char const* name, MemFn mf)
+ {
+ FUNDOC("Member Function", name, MemFn)
+ CFunc::CallMemberFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
+ return *this;
+ }
+
+ template <class MemFn>
+ Class <T>& addPtrFunction (char const* name, MemFn mf)
+ {
+ FUNDOC("Member Pointer Function", name, MemFn)
+ CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
+ return *this;
+ }
+
+ template <class MemFn>
+ Class <T>& addWPtrFunction (char const* name, MemFn mf)
+ {
+ FUNDOC("Member Weak Pointer Function", name, MemFn)
+ CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
+ return *this;
+ }
+
+ template <class MemFn>
+ Class <T>& addRefFunction (char const* name, MemFn mf)
+ {
+ FUNDOC("Member Function RefReturn", name, MemFn)
+ CFunc::CallMemberRefFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
+ return *this;
+ }
+
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a member lua_CFunction.
+ */
+ Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*))
+ {
+ DATADOC ("C Function", name, mfp)
+ typedef int (T::*MFP)(lua_State*);
+ assert (lua_istable (L, -1));
+ new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
+ lua_pushcclosure (L, &CFunc::CallMemberCFunction <T>::f, 1);
+ rawsetfield (L, -3, name); // class table
+
+ return *this;
+ }
+
+ // custom callback - extend existing classes
+ // with non-class member functions (e.g STL iterator)
+ Class <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
+ {
+ DATADOC ("Ext C Function", name, fp)
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, fp, 0);
+ rawsetfield (L, -3, name); // class table
+ return *this;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a const member lua_CFunction.
+ */
+ Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*) const)
+ {
+ DATADOC ("Const C Member Function", name, mfp)
+ typedef int (T::*MFP)(lua_State*) const;
+ assert (lua_istable (L, -1));
+ new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
+ lua_pushcclosure (L, &CFunc::CallConstMemberCFunction <T>::f, 1);
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -5, name); // const table
+ rawsetfield (L, -3, name); // class table
+
+ return *this;
+ }
+
+ /**
+ Add or replace a static const data
+ */
+ template <typename U>
+ Class <T>& addConst (char const* name, const U val)
+ {
+ DATADOC ("Constant/Enum Member", name, val)
+ assert (lua_istable (L, -1));
+
+ rawgetfield (L, -1, "__propget"); // static
+ new (lua_newuserdata (L, sizeof (val))) U (val);
+ lua_pushcclosure (L, &CFunc::getConst <U>, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ rawgetfield (L, -1, "__propset"); // static
+ lua_pushstring (L, name);
+ lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+ return *this;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Add or replace a primary Constructor.
+
+ The primary Constructor is invoked when calling the class type table
+ like a function.
+
+ The template parameter should be a function pointer type that matches
+ the desired Constructor (since you can't take the address of a Constructor
+ and pass it as an argument).
+ */
+ template <class MemFn, class C>
+ Class <T>& addConstructor ()
+ {
+ FUNDOC("Constructor", "", MemFn)
+ lua_pushcclosure (L,
+ &ctorContainerProxy <typename FuncTraits <MemFn>::Params, C>, 0);
+ rawsetfield(L, -2, "__call");
+
+ return *this;
+ }
+
+ template <class MemFn>
+ Class <T>& addConstructor ()
+ {
+ FUNDOC("Constructor", "", MemFn)
+ lua_pushcclosure (L,
+ &ctorPlacementProxy <typename FuncTraits <MemFn>::Params, T>, 0);
+ rawsetfield(L, -2, "__call");
+
+ return *this;
+ }
+
+ Class <T>& addVoidConstructor ()
+ {
+ return addConstructor <void (*) ()> ();
+ }
+
+ Class <T>& addEqualCheck ()
+ {
+ PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
+ rawsetfield (L, -3, "sameinstance");
+ return *this;
+ }
+
+ template <class U>
+ Class <T>& addCast (char const* name)
+ {
+ PRINTDOC("Cast", _name << name,
+ type_name< U >(),
+ type_name< U >() << " (" << type_name< T >() << "::*)()")
+
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::CastClass <T, U>::f, 0);
+ rawsetfield (L, -3, name); // class table
+
+ lua_pushcclosure (L, &CFunc::CastConstClass <T, U>::f, 0);
+ rawsetfield (L, -4, name); // const table
+ return *this;
+ }
+
+ };
+
+ /** C Array to/from table */
+ template <typename T>
+ class Array : virtual public ClassBase
+ {
+ public:
+ Array (char const* name, Namespace const* parent) : ClassBase (parent->L)
+ {
+#ifdef LUABINDINGDOC
+ _parent = parent;
+ _name = parent->_name + name + ":";
+#endif
+ PRINTDOC ("[C] Array", parent->_name << name,
+ std::string(), type_name <T>() + "*")
+ PRINTDOC ("Ext C Function", _name << "array",
+ std::string(""), "int (*)(lua_State*)")
+ PRINTDOC ("Ext C Function", _name << "get_table",
+ std::string(""), "int (*)(lua_State*)")
+ PRINTDOC ("Ext C Function", _name << "set_table",
+ std::string(""), "int (*)(lua_State*)")
+ PRINTDOC("Member Function", _name << "sameinstance",
+ std::string("bool"), std::string("bool (*)(" + type_name <T>() + "*)"))
+ PRINTDOC("Member Function", _name << "offset",
+ std::string(type_name <T>() + "*"), std::string(type_name <T>() + "* (*)(unsigned int)"))
+
+ m_stackSize = parent->m_stackSize + 3;
+ parent->m_stackSize = 0;
+
+#if 0 // don't allow to duplicates handlers for same array-type
+ assert (lua_istable (L, -1));
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+ if (lua_istable (L, -1)) {
+ lua_pushnil (L);
+ lua_pushnil (L);
+ return;
+ }
+ lua_pop (L, 1);
+#endif
+
+ assert (lua_istable (L, -1));
+ rawgetfield (L, -1, name);
+
+ if (lua_isnil (L, -1))
+ {
+ lua_pop (L, 1);
+
+ // register array access in global namespace
+ luaL_newmetatable (L, typeid(T).name());
+ lua_pushcclosure (L, CFunc::array_index<T>, 0);
+ lua_setfield(L, -2, "__index");
+ lua_pushcclosure (L, CFunc::array_newindex<T>, 0);
+ lua_setfield(L, -2, "__newindex");
+ lua_pop (L, 1);
+
+ createConstTable (name);
+ lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+ rawsetfield (L, -2, "__gc");
+
+ createClassTable (name);
+ lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+ rawsetfield (L, -2, "__gc");
+
+ createStaticTable (name);
+
+ // Map T back to its tables.
+ lua_pushvalue (L, -1);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+ lua_pushvalue (L, -2);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+ lua_pushvalue (L, -3);
+ lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::getArray <T>, 0);
+ rawsetfield (L, -3, "array"); // class table
+
+ lua_pushcclosure (L, &CFunc::getTable <T>, 0);
+ rawsetfield (L, -3, "get_table"); // class table
+
+ lua_pushcclosure (L, &CFunc::setTable <T>, 0);
+ rawsetfield (L, -3, "set_table"); // class table
+
+ lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
+ rawsetfield (L, -3, "sameinstance");
+
+ lua_pushcclosure (L, &CFunc::offsetArray <T>, 0);
+ rawsetfield (L, -3, "offset"); // class table
+
+ }
+ else
+ {
+ lua_pushnil (L);
+ lua_pushnil (L);
+ }
+ }
+
+ Namespace endArray ()
+ {
+ return Namespace (this);
+ }
+ };
+
+ /** Boost Weak & Shared Pointer Class Wrapper */
+ template <class T>
+ class WSPtrClass : virtual public ClassBase
+ {
+ public:
+ WSPtrClass (char const* name, Namespace const* parent)
+ : ClassBase (parent->L)
+ , weak (name, parent)
+ , shared (name, parent)
+ {
+#ifdef LUABINDINGDOC
+ _parent = parent;
+ _name = parent->_name + name + ":";
+#endif
+ PRINTDOC ("[C] Weak/Shared Pointer Class",
+ parent->_name + name,
+ std::string(), type_name <T>())
+ m_stackSize = weak.m_stackSize;
+ parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
+ lua_pop (L, 3);
+ }
+
+ WSPtrClass (char const* name, Namespace const* parent, void const* const sharedkey, void const* const weakkey)
+ : ClassBase (parent->L)
+ , weak (name, parent, weakkey)
+ , shared (name, parent, sharedkey)
+ {
+#ifdef LUABINDINGDOC
+ _parent = parent;
+ _name = parent->_name + name + ":";
+#endif
+ m_stackSize = weak.m_stackSize;
+ parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
+ lua_pop (L, 3);
+ }
+
+ template <class MemFn>
+ WSPtrClass <T>& addFunction (char const* name, MemFn mf)
+ {
+ FUNDOC ("Weak/Shared Pointer Function", name, MemFn)
+ set_weak_class ();
+ CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
+
+ set_shared_class ();
+ CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
+ return *this;
+ }
+
+ template <class MemFn>
+ WSPtrClass <T>& addRefFunction (char const* name, MemFn mf)
+ {
+ FUNDOC ("Weak/Shared Pointer Function RefReturn", name, MemFn)
+ set_weak_class ();
+ CFunc::CallMemberRefWPtrFunctionHelper <MemFn>::add (L, name, mf);
+
+ set_shared_class ();
+ CFunc::CallMemberRefPtrFunctionHelper <MemFn>::add (L, name, mf);
+ return *this;
+ }
+
+ template <class MemFn>
+ WSPtrClass <T>& addConstructor ()
+ {
+ FUNDOC ("Weak/Shared Pointer Constructor", "", MemFn)
+ set_weak_class ();
+ lua_pushcclosure (L,
+ &weak. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::weak_ptr<T> >, 0);
+ rawsetfield(L, -2, "__call");
+
+ set_shared_class ();
+ lua_pushcclosure (L,
+ &shared. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::shared_ptr<T> >, 0);
+ rawsetfield(L, -2, "__call");
+ return *this;
+ }
+
+ WSPtrClass <T>& addVoidConstructor ()
+ {
+ return addConstructor <void (*) ()> ();
+ }
+
+ WSPtrClass <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
+ {
+ DATADOC ("Weak/Shared Ext C Function", name, fp)
+ set_weak_class ();
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, fp, 0);
+ rawsetfield (L, -3, name); // class table
+
+ set_shared_class ();
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, fp, 0);
+ rawsetfield (L, -3, name); // class table
+
+ return *this;
+ }
+
+ template <class U>
+ WSPtrClass <T>& addCast (char const* name)
+ {
+ PRINTDOC("Weak/Shared Pointer Cast", _name << name,
+ type_name< U >(),
+ type_name< U >() << " (" << type_name< T >() << "::*)()")
+
+ // TODO weak ptr
+ set_shared_class ();
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::CastMemberPtr <T, U>::f, 0);
+ rawsetfield (L, -3, name); // class table
+ return *this;
+ }
+
+ WSPtrClass <T>& addNullCheck ()
+ {
+ PRINTDOC("Weak/Shared Null Check", _name << "isnil", std::string("bool"), std::string("void (*)()"))
+ set_weak_class ();
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::WPtrNullCheck <T>::f, 0);
+ rawsetfield (L, -3, "isnil"); // class table
+
+ set_shared_class ();
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::PtrNullCheck <T>::f, 0);
+ rawsetfield (L, -3, "isnil"); // class table
+
+ return *this;
+ }
+
+
+ Namespace endClass ()
+ {
+ return Namespace (this);
+ }
+
+ private:
+ void set_weak_class () {
+ lua_pop (L, 3);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::weak_ptr<T> >::getStaticKey ());
+ rawgetfield (L, -1, "__class");
+ rawgetfield (L, -1, "__const");
+ lua_insert (L, -3);
+ lua_insert (L, -2);
+ }
+ void set_shared_class () {
+ lua_pop (L, 3);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::shared_ptr<T> >::getStaticKey ());
+ rawgetfield (L, -1, "__class");
+ rawgetfield (L, -1, "__const");
+ lua_insert (L, -3);
+ lua_insert (L, -2);
+ }
+ Class<boost::weak_ptr<T> > weak;
+ Class<boost::shared_ptr<T> > shared;
+ };
+
+
+private:
+ //----------------------------------------------------------------------------
+ /**
+ Open the global namespace for registrations.
+ */
+ explicit Namespace (lua_State* L_)
+ : L (L_)
+ , m_stackSize (0)
+#ifdef LUABINDINGDOC
+ , _name ("")
+ , _parent (0)
+#endif
+ {
+ lua_getglobal (L, "_G");
+ ++m_stackSize;
+ }
+
+#ifdef LUABINDINGDOC
+ std::string _name;
+ Namespace const * _parent;
+#endif
+
+ //----------------------------------------------------------------------------
+ /**
+ Open a namespace for registrations.
+
+ The namespace is created if it doesn't already exist.
+ The parent namespace is at the top of the Lua stack.
+ */
+ Namespace (char const* name, Namespace const* parent)
+ : L (parent->L)
+ , m_stackSize (0)
+#ifdef LUABINDINGDOC
+ , _name (parent->_name + name + ":")
+ , _parent (parent)
+#endif
+ {
+ m_stackSize = parent->m_stackSize + 1;
+ parent->m_stackSize = 0;
+
+ assert (lua_istable (L, -1));
+ rawgetfield (L, -1, name);
+ if (lua_isnil (L, -1))
+ {
+ lua_pop (L, 1);
+
+ lua_newtable (L);
+ lua_pushvalue (L, -1);
+ lua_setmetatable (L, -2);
+ lua_pushcfunction (L, &CFunc::indexMetaMethod);
+ rawsetfield (L, -2, "__index");
+ lua_pushcfunction (L, &CFunc::newindexMetaMethod);
+ rawsetfield (L, -2, "__newindex");
+ lua_newtable (L);
+ rawsetfield (L, -2, "__propget");
+ lua_newtable (L);
+ rawsetfield (L, -2, "__propset");
+ lua_pushvalue (L, -1);
+ rawsetfield (L, -3, name);
+#if 0
+ lua_pushcfunction (L, &tostringMetaMethod);
+ rawsetfield (L, -2, "__tostring");
+#endif
+ }
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Creates a continued registration from a child namespace.
+ */
+ explicit Namespace (Namespace const* child)
+ : L (child->L)
+ , m_stackSize (0)
+#ifdef LUABINDINGDOC
+ , _name (child->_parent ? child->_parent->_name : "")
+ , _parent (child->_parent ? child->_parent->_parent : NULL)
+#endif
+ {
+ m_stackSize = child->m_stackSize - 1;
+ child->m_stackSize = 1;
+ child->pop (1);
+
+ // It is not necessary or valid to call
+ // endNamespace() for the global namespace!
+ //
+ assert (m_stackSize != 0);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Creates a continued registration from a child class.
+ */
+ explicit Namespace (ClassBase const* child)
+ : L (child->L)
+ , m_stackSize (0)
+#ifdef LUABINDINGDOC
+ , _name (child->_parent ? child->_parent->_name : "")
+ , _parent (child->_parent ? child->_parent->_parent : NULL)
+#endif
+ {
+ m_stackSize = child->m_stackSize - 3;
+ child->m_stackSize = 3;
+ child->pop (3);
+ }
+
+public:
+ //----------------------------------------------------------------------------
+ /**
+ Copy Constructor.
+
+ Ownership of the stack is transferred to the new object. This happens
+ when the compiler emits temporaries to hold these objects while chaining
+ registrations across namespaces.
+ */
+ Namespace (Namespace const& other) : L (other.L)
+ {
+ m_stackSize = other.m_stackSize;
+ other.m_stackSize = 0;
+#ifdef LUABINDINGDOC
+ _name = other._name;
+ _parent = other._parent;
+#endif
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Closes this namespace registration.
+ */
+ ~Namespace ()
+ {
+ pop (m_stackSize);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Open the global namespace.
+ */
+ static Namespace getGlobalNamespace (lua_State* L)
+ {
+ return Namespace (L);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Open a new or existing namespace for registrations.
+ */
+ Namespace beginNamespace (char const* name)
+ {
+ return Namespace (name, this);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Continue namespace registration in the parent.
+
+ Do not use this on the global namespace.
+ */
+ Namespace endNamespace ()
+ {
+ return Namespace (this);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Add or replace a variable.
+ */
+ template <class T>
+ Namespace& addVariable (char const* name, T* pt, bool isWritable = true)
+ {
+ assert (lua_istable (L, -1));
+
+ rawgetfield (L, -1, "__propget");
+ assert (lua_istable (L, -1));
+ lua_pushlightuserdata (L, pt);
+ lua_pushcclosure (L, &CFunc::getVariable <T>, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ rawgetfield (L, -1, "__propset");
+ assert (lua_istable (L, -1));
+ if (isWritable)
+ {
+ lua_pushlightuserdata (L, pt);
+ lua_pushcclosure (L, &CFunc::setVariable <T>, 1);
+ }
+ else
+ {
+ lua_pushstring (L, name);
+ lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+ }
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ return *this;
+ }
+
+ template <typename U>
+ Namespace& addConst (char const* name, const U val)
+ {
+ DATADOC ("Constant/Enum", name, val)
+ assert (lua_istable (L, -1));
+ rawgetfield (L, -1, "__propget");
+ new (lua_newuserdata (L, sizeof (val))) U (val);
+ lua_pushcclosure (L, &CFunc::getConst <U>, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ rawgetfield (L, -1, "__propset");
+ assert (lua_istable (L, -1));
+ lua_pushstring (L, name);
+ lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+ return *this;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Add or replace a property.
+
+ If the set function is omitted or null, the property is read-only.
+ */
+ template <class TG, class TS>
+ Namespace& addProperty (char const* name, TG (*get) (), void (*set)(TS) = 0)
+ {
+ assert (lua_istable (L, -1));
+
+ rawgetfield (L, -1, "__propget");
+ assert (lua_istable (L, -1));
+ typedef TG (*get_t) ();
+ new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+ lua_pushcclosure (L, &CFunc::Call <TG (*) (void)>::f, 1);
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ rawgetfield (L, -1, "__propset");
+ assert (lua_istable (L, -1));
+ if (set != 0)
+ {
+ typedef void (*set_t) (TS);
+ new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
+ lua_pushcclosure (L, &CFunc::Call <void (*) (TS)>::f, 1);
+ }
+ else
+ {
+ lua_pushstring (L, name);
+ lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+ }
+ rawsetfield (L, -2, name);
+ lua_pop (L, 1);
+
+ return *this;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Add or replace a free function.
+ */
+ template <class FP>
+ Namespace& addFunction (char const* name, FP const fp)
+ {
+ FUNDOC ("Free Function", name, FP)
+ assert (lua_istable (L, -1));
+
+ new (lua_newuserdata (L, sizeof (fp))) FP (fp);
+ lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
+ rawsetfield (L, -2, name);
+
+ return *this;
+ }
+
+ template <class FP>
+ Namespace& addRefFunction (char const* name, FP const fp)
+ {
+ FUNDOC ("Free Function RefReturn", name, FP)
+ assert (lua_istable (L, -1));
+
+ new (lua_newuserdata (L, sizeof (fp))) FP (fp);
+ lua_pushcclosure (L, &CFunc::CallRef <FP>::f, 1);
+ rawsetfield (L, -2, name);
+
+ return *this;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Add or replace a array type
+ */
+
+ template <typename T>
+ Namespace registerArray (char const* name)
+ {
+ return Array <T> (name, this).endArray();
+ }
+
+
+ //----------------------------------------------------------------------------
+ /**
+ Add or replace a lua_CFunction.
+ */
+ Namespace& addCFunction (char const* name, int (*const fp)(lua_State*))
+ {
+ DATADOC ("Free C Function", name, fp)
+ lua_pushcfunction (L, fp);
+ rawsetfield (L, -2, name);
+
+ return *this;
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Open a new or existing class for registrations.
+ */
+ template <class T>
+ Class <T> beginClass (char const* name)
+ {
+ return Class <T> (name, this);
+ }
+
+ /** weak & shared pointer class */
+ template <class T>
+ WSPtrClass <T> beginWSPtrClass (char const* name)
+ {
+ return WSPtrClass <T> (name, this)
+ .addNullCheck();
+ }
+
+ //----------------------------------------------------------------------------
+
+ template <class K, class V>
+ Class<std::map<K, V> > beginStdMap (char const* name)
+ {
+ typedef std::map<K, V> LT;
+ typedef std::pair<const K, V> T;
+
+ typedef typename std::map<K, V>::size_type T_SIZE;
+
+ return beginClass<LT> (name)
+ .addVoidConstructor ()
+ .addFunction ("empty", <::empty)
+ .addFunction ("size", <::size)
+ .addFunction ("clear", (void (LT::*)())<::clear)
+ .addFunction ("count", (T_SIZE (LT::*)(const K&) const)<::count)
+ .addExtCFunction ("add", &CFunc::tableToMap<K, V>)
+ .addExtCFunction ("iter", &CFunc::mapIter<K, V>)
+ .addExtCFunction ("table", &CFunc::mapToTable<K, V>);
+ }
+
+ template <class T>
+ Class<std::set<T> > beginStdSet (char const* name)
+ {
+ typedef std::set<T> LT;
+ return beginClass<LT> (name)
+ .addVoidConstructor ()
+ .addFunction ("clear", (void (LT::*)())<::clear)
+ .addFunction ("empty", <::empty)
+ .addFunction ("size", <::size)
+ .addExtCFunction ("add", &CFunc::tableToSet<T>)
+ .addExtCFunction ("iter", &CFunc::setIter<T>)
+ .addExtCFunction ("table", &CFunc::setToTable<T>);
+ }
+
+ template <unsigned int T>
+ Class<std::bitset<T> > beginStdBitSet (char const* name)
+ {
+ typedef std::bitset<T> BS;
+ return beginClass<BS> (name)
+ .addVoidConstructor ()
+ .addFunction ("reset", (BS& (BS::*)())&BS::reset)
+ .addFunction ("set", (BS& (BS::*)(size_t, bool))&BS::set)
+ .addFunction ("count", &BS::count)
+ .addFunction ("any", &BS::any)
+ .addFunction ("none", &BS::none)
+ .addFunction ("test", &BS::test)
+ .addFunction ("size", &BS::size)
+ .addExtCFunction ("add", &CFunc::tableToBitSet<T>)
+ .addExtCFunction ("table", &CFunc::bitSetToTable<T>);
+ }
+
+ template <class T>
+ Class<std::list<T> > beginConstStdList (char const* name)
+ {
+ typedef std::list<T> LT;
+ return beginClass<LT> (name)
+ .addVoidConstructor ()
+ .addFunction ("empty", <::empty)
+ .addFunction ("size", <::size)
+ .addFunction ("reverse", <::reverse)
+ .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
+ .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
+ }
+
+ template <class T>
+ Class<std::list<T> > beginStdList (char const* name)
+ {
+ typedef std::list<T> LT;
+ return beginConstStdList<T> (name)
+ .addFunction ("unique", (void (LT::*)())<::unique)
+ .addFunction ("push_back", (void (LT::*)(const T&))<::push_back)
+ .addExtCFunction ("add", &CFunc::tableToList<T, LT>);
+ }
+
+ template <class T>
+ Class<std::vector<T> > beginStdVector (char const* name)
+ {
+ typedef std::vector<T> LT;
+ typedef typename std::vector<T>::reference T_REF;
+ typedef typename std::vector<T>::size_type T_SIZE;
+
+ return beginClass<LT> (name)
+ .addVoidConstructor ()
+ .addFunction ("empty", <::empty)
+ .addFunction ("size", <::size)
+ .addFunction ("push_back", (void (LT::*)(const T&))<::push_back)
+ .addFunction ("at", (T_REF (LT::*)(T_SIZE))<::at)
+ .addExtCFunction ("add", &CFunc::tableToList<T, LT>)
+ .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
+ .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
+ }
+
+ //----------------------------------------------------------------------------
+
+ template <class T>
+ Class<boost::shared_ptr<std::list<T> > > beginPtrStdList (char const* name)
+ {
+ typedef std::list<T> LT;
+
+ return beginClass<boost::shared_ptr<LT> > (name)
+ .addVoidConstructor ()
+ .addPtrFunction ("empty", <::empty)
+ .addPtrFunction ("size", <::size)
+ .addPtrFunction ("reverse", <::reverse)
+ .addPtrFunction ("unique", (void (LT::*)())<::unique)
+ .addPtrFunction ("push_back", (void (LT::*)(const T&))<::push_back)
+ .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
+ .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
+ .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
+ }
+
+ template <class T>
+ Class<boost::shared_ptr<std::vector<T> > > beginPtrStdVector (char const* name)
+ {
+ typedef std::vector<T> LT;
+ typedef typename std::vector<T>::reference T_REF;
+ typedef typename std::vector<T>::size_type T_SIZE;
+
+ return beginClass<boost::shared_ptr<LT> > (name)
+ .addVoidConstructor ()
+ .addPtrFunction ("empty", <::empty)
+ .addPtrFunction ("empty", <::empty)
+ .addPtrFunction ("size", <::size)
+ .addPtrFunction ("push_back", (void (LT::*)(const T&))<::push_back)
+ .addPtrFunction ("at", (T_REF (LT::*)(T_SIZE))<::at)
+ .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
+ .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
+ .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
+ }
+
+ //----------------------------------------------------------------------------
+ /**
+ Derive a new class for registrations.
+
+ To continue registrations for the class later, use beginClass().
+ Do not call deriveClass() again.
+ */
+ template <class T, class U>
+ Class <T> deriveClass (char const* name)
+ {
+ CLASSDOC ("[C] Derived Class", _name << name, type_name <T>(), type_name <U>())
+ return Class <T> (name, this, ClassInfo <U>::getStaticKey ());
+ }
+
+ template <class T, class U>
+ WSPtrClass <T> deriveWSPtrClass (char const* name)
+ {
+
+ CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::shared_ptr<T> >(), type_name <boost::shared_ptr<U> >())
+ CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::weak_ptr<T> >(), type_name <boost::weak_ptr<U> >())
+ CLASSDOC ("[C] Derived Pointer Class", _name << name, type_name <T>(), type_name <U>())
+ return WSPtrClass <T> (name, this,
+ ClassInfo <boost::shared_ptr<U> >::getStaticKey (),
+ ClassInfo <boost::weak_ptr<U> >::getStaticKey ())
+ .addNullCheck();
+ }
+
+};
+
+//------------------------------------------------------------------------------
+/**
+ Retrieve the global namespace.
+
+ It is recommended to put your namespace inside the global namespace, and
+ then add your classes and functions to it, rather than adding many classes
+ and functions directly to the global namespace.
+*/
+inline Namespace getGlobalNamespace (lua_State* L)
+{
+ return Namespace::getGlobalNamespace (L);
+}
+
+
+#undef KEYSTA
+#undef KEYEND
+#undef CLASSDOC
+#undef PRINTDOC
+#undef FUNDOC
+#undef DATADOC
+
+/* vim: set et sw=2: */
diff --git a/libs/lua/LuaBridge/detail/Stack.h b/libs/lua/LuaBridge/detail/Stack.h
new file mode 100644
index 0000000..e6ff637
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Stack.h
@@ -0,0 +1,760 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2016, Robin Gareus <robin at gareus.org>
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2007, Nathan Reed
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+//------------------------------------------------------------------------------
+/**
+ Receive the lua_State* as an argument.
+*/
+template <>
+struct Stack <lua_State*>
+{
+ static lua_State* get (lua_State* L, int)
+ {
+ return L;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Push a lua_CFunction.
+*/
+template <>
+struct Stack <lua_CFunction>
+{
+ static void push (lua_State* L, lua_CFunction f)
+ {
+ lua_pushcfunction (L, f);
+ }
+
+ static lua_CFunction get (lua_State* L, int index)
+ {
+ return lua_tocfunction (L, index);
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for passing references to built-in types.
+
+ This allows to call functions using primitives, but
+ the value assigned by the C++ function is *lost*.
+
+ http://sourceforge.net/p/luabind/mailman/message/32692027/
+
+ Alternatives:
+ - wrap all C++ function that have non const reference arguments
+ (cleanest solution)
+
+ - use a struct to wrap the value (not a primitive)
+ (needs major work to special case arguments in CFunc::)
+
+ - wrap the function and provide the assigned value
+ as addition return values
+
+ Either would place hard constraints on the lua code though.
+
+ We currently only need this for Ardour::Editor::do_import() framecnt_t&
+ and the returned position is not important.
+*/
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `int`.
+*/
+template <>
+struct Stack <int>
+{
+ static inline void push (lua_State* L, int value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline int get (lua_State* L, int index)
+ {
+ return static_cast <int> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <int const&>
+{
+ static inline void push (lua_State* L, int value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline int get (lua_State* L, int index)
+ {
+ return static_cast <int > (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <int &>
+{
+ static inline void push (lua_State* L, int &value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline int& get (lua_State* L, int index)
+ {
+ int l = static_cast <int> (luaL_checknumber (L, index));
+ int* x = new (lua_newuserdata (L, sizeof (int))) int (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `unsigned int`.
+*/
+template <>
+struct Stack <unsigned int>
+{
+ static inline void push (lua_State* L, unsigned int value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline unsigned int get (lua_State* L, int index)
+ {
+ return static_cast <unsigned int> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned int const&>
+{
+ static inline void push (lua_State* L, unsigned int value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned int get (lua_State* L, int index)
+ {
+ return static_cast <unsigned int > (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned int &>
+{
+ static inline void push (lua_State* L, unsigned int& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned int& get (lua_State* L, int index)
+ {
+ unsigned int l = static_cast <unsigned int> (luaL_checknumber (L, index));
+ unsigned int* x = new (lua_newuserdata (L, sizeof (unsigned int))) unsigned int (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `unsigned char`.
+*/
+template <>
+struct Stack <unsigned char>
+{
+ static inline void push (lua_State* L, unsigned char value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline unsigned char get (lua_State* L, int index)
+ {
+ return static_cast <unsigned char> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned char const&>
+{
+ static inline void push (lua_State* L, unsigned char value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned char get (lua_State* L, int index)
+ {
+ return static_cast <unsigned char> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned char &>
+{
+ static inline void push (lua_State* L, unsigned char& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned char& get (lua_State* L, int index)
+ {
+ unsigned char l = static_cast <unsigned char> (luaL_checknumber (L, index));
+ unsigned char* x = new (lua_newuserdata (L, sizeof (unsigned char))) unsigned char (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `short`.
+*/
+template <>
+struct Stack <short>
+{
+ static inline void push (lua_State* L, short value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline short get (lua_State* L, int index)
+ {
+ return static_cast <short> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <short const&>
+{
+ static inline void push (lua_State* L, short value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline short get (lua_State* L, int index)
+ {
+ return static_cast <short> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <short &>
+{
+ static inline void push (lua_State* L, short& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline short& get (lua_State* L, int index)
+ {
+ short l = static_cast <short> (luaL_checknumber (L, index));
+ short* x = new (lua_newuserdata (L, sizeof (short))) short (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `unsigned short`.
+*/
+template <>
+struct Stack <unsigned short>
+{
+ static inline void push (lua_State* L, unsigned short value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline unsigned short get (lua_State* L, int index)
+ {
+ return static_cast <unsigned short> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned short const&>
+{
+ static inline void push (lua_State* L, unsigned short value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned short get (lua_State* L, int index)
+ {
+ return static_cast <unsigned short> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned short &>
+{
+ static inline void push (lua_State* L, unsigned short& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned short& get (lua_State* L, int index)
+ {
+ unsigned short l = static_cast <unsigned short> (luaL_checknumber (L, index));
+ unsigned short* x = new (lua_newuserdata (L, sizeof (unsigned short))) unsigned short (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `long`.
+*/
+template <>
+struct Stack <long>
+{
+ static inline void push (lua_State* L, long value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline long get (lua_State* L, int index)
+ {
+ return static_cast <long> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <long const&>
+{
+ static inline void push (lua_State* L, long value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline long get (lua_State* L, int index)
+ {
+ return static_cast <long> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <long &>
+{
+ static inline void push (lua_State* L, long& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline long& get (lua_State* L, int index)
+ {
+ long l = static_cast <long> (luaL_checknumber (L, index));
+ long* x = new (lua_newuserdata (L, sizeof (long))) long (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `unsigned long`.
+*/
+template <>
+struct Stack <unsigned long>
+{
+ static inline void push (lua_State* L, unsigned long value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline unsigned long get (lua_State* L, int index)
+ {
+ return static_cast <unsigned long> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned long const&>
+{
+ static inline void push (lua_State* L, unsigned long value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned long get (lua_State* L, int index)
+ {
+ return static_cast <unsigned long> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned long &>
+{
+ static inline void push (lua_State* L, unsigned long& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned long& get (lua_State* L, int index)
+ {
+ unsigned long l = static_cast <unsigned long> (luaL_checknumber (L, index));
+ unsigned long* x = new (lua_newuserdata (L, sizeof (unsigned long))) unsigned long (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `long long`.
+*/
+template <>
+struct Stack <long long>
+{
+ static inline void push (lua_State* L, long long value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline long long get (lua_State* L, int index)
+ {
+ return static_cast <long long> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <long long const&>
+{
+ static inline void push (lua_State* L, long long value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline long long get (lua_State* L, int index)
+ {
+ return static_cast <long long> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <long long &>
+{
+ static inline void push (lua_State* L, long long& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline long long& get (lua_State* L, int index)
+ {
+ long long l = static_cast <long long> (luaL_checknumber (L, index));
+ long long* x = new (lua_newuserdata (L, sizeof (long long))) long long (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `unsigned long long`.
+*/
+template <>
+struct Stack <unsigned long long>
+{
+ static inline void push (lua_State* L, unsigned long long value)
+ {
+ lua_pushinteger (L, static_cast <lua_Integer> (value));
+ }
+
+ static inline unsigned long long get (lua_State* L, int index)
+ {
+ return static_cast <unsigned long long> (luaL_checkinteger (L, index));
+ }
+};
+
+template <>
+struct Stack <unsigned long long const&>
+{
+ static inline void push (lua_State* L, unsigned long long value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline unsigned long long get (lua_State* L, int index)
+ {
+ return static_cast <unsigned long long> (luaL_checknumber (L, index));
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `float`.
+*/
+template <>
+struct Stack <float>
+{
+ static inline void push (lua_State* L, float value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline float get (lua_State* L, int index)
+ {
+ return static_cast <float> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <float const&>
+{
+ static inline void push (lua_State* L, float value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline float get (lua_State* L, int index)
+ {
+ return static_cast <float> (luaL_checknumber (L, index));
+ }
+};
+
+template <>
+struct Stack <float &>
+{
+ static inline void push (lua_State* L, float& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline float& get (lua_State* L, int index)
+ {
+ float l = static_cast <float> (luaL_checknumber (L, index));
+ float* x = new (lua_newuserdata (L, sizeof (float))) float (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `double`.
+*/
+template <> struct Stack <double>
+{
+ static inline void push (lua_State* L, double value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline double get (lua_State* L, int index)
+ {
+ return static_cast <double> (luaL_checknumber (L, index));
+ }
+};
+
+template <> struct Stack <double const&>
+{
+ static inline void push (lua_State* L, double value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline double get (lua_State* L, int index)
+ {
+ return static_cast <double> (luaL_checknumber (L, index));
+ }
+};
+
+template <> struct Stack <double &>
+{
+ static inline void push (lua_State* L, double& value)
+ {
+ lua_pushnumber (L, static_cast <lua_Number> (value));
+ }
+
+ static inline double& get (lua_State* L, int index)
+ {
+ double l = static_cast <double> (luaL_checknumber (L, index));
+ double* x = new (lua_newuserdata (L, sizeof (double))) double (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `bool`.
+*/
+template <>
+struct Stack <bool> {
+ static inline void push (lua_State* L, bool value)
+ {
+ lua_pushboolean (L, value ? 1 : 0);
+ }
+
+ static inline bool get (lua_State* L, int index)
+ {
+ return lua_toboolean (L, index) ? true : false;
+ }
+};
+
+template <>
+struct Stack <bool const&> {
+ static inline void push (lua_State* L, bool value)
+ {
+ lua_pushboolean (L, value ? 1 : 0);
+ }
+
+ static inline bool get (lua_State* L, int index)
+ {
+ return lua_toboolean (L, index) ? true : false;
+ }
+};
+
+template <>
+struct Stack <bool &> {
+ static inline void push (lua_State* L, bool& value)
+ {
+ lua_pushboolean (L, value ? 1 : 0);
+ }
+
+ static inline bool& get (lua_State* L, int index)
+ {
+ bool l = lua_toboolean (L, index) ? true : false;
+ bool* x = new (lua_newuserdata (L, sizeof (bool))) bool (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `char`.
+*/
+template <>
+struct Stack <char>
+{
+ static inline void push (lua_State* L, char value)
+ {
+ char str [2] = { value, 0 };
+ lua_pushstring (L, str);
+ }
+
+ static inline char get (lua_State* L, int index)
+ {
+ return luaL_checkstring (L, index) [0];
+ }
+};
+
+template <>
+struct Stack <char const&>
+{
+ static inline void push (lua_State* L, char value)
+ {
+ char str [2] = { value, 0 };
+ lua_pushstring (L, str);
+ }
+
+ static inline char get (lua_State* L, int index)
+ {
+ return luaL_checkstring (L, index) [0];
+ }
+};
+
+template <>
+struct Stack <char const *>
+{
+ static inline void push (lua_State* L, char const* str)
+ {
+ if (str != 0)
+ lua_pushstring (L, str);
+ else
+ lua_pushnil (L);
+ }
+
+ static inline char const *get (lua_State* L, int index)
+ {
+ return lua_isnil (L, index) ? 0 : luaL_checkstring (L, index);
+ }
+};
+
+template <>
+struct Stack <char &>
+{
+ static inline void push (lua_State* L, char& value)
+ {
+ char str [2] = { value, 0 };
+ lua_pushstring (L, str);
+ }
+
+ static inline char get (lua_State* L, int index)
+ {
+ char l = luaL_checkstring (L, index) [0];
+ char* x = new (lua_newuserdata (L, sizeof (char))) char (l);
+ return *x;
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Stack specialization for `std::string`.
+*/
+template <>
+struct Stack <std::string>
+{
+ static inline void push (lua_State* L, std::string const& str)
+ {
+ lua_pushlstring (L, str.c_str (), str.size());
+ }
+
+ static inline std::string get (lua_State* L, int index)
+ {
+ size_t len;
+ const char *str = luaL_checklstring(L, index, &len);
+ return std::string (str, len);
+ }
+};
+
+template <>
+struct Stack <std::string const&>
+{
+ static inline void push (lua_State* L, std::string const& str)
+ {
+ lua_pushstring (L, str.c_str());
+ }
+
+ static inline std::string get (lua_State* L, int index)
+ {
+ size_t len;
+ const char *str = luaL_checklstring(L, index, &len);
+ return std::string (str, len);
+ }
+};
+
+template <>
+struct Stack <std::string &>
+{
+ static inline void push (lua_State* L, std::string& str)
+ {
+ lua_pushlstring (L, str.c_str (), str.size());
+ }
+
+ static inline std::string& get (lua_State* L, int index)
+ {
+ size_t len;
+ const char *str = luaL_checklstring(L, index, &len);
+ std::string* x = new (lua_newuserdata (L, sizeof (std::string))) std::string (str, len);
+ return *x;
+ }
+};
diff --git a/libs/lua/LuaBridge/detail/TypeList.h b/libs/lua/LuaBridge/detail/TypeList.h
new file mode 100644
index 0000000..fc4ce39
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/TypeList.h
@@ -0,0 +1,174 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+ Copyright 2007, Nathan Reed
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+ This file incorporates work covered by the following copyright and
+ permission notice:
+
+ The Loki Library
+ Copyright (c) 2001 by Andrei Alexandrescu
+ This code accompanies the book:
+ Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
+ Patterns Applied". Copyright (c) 2001. Addison-Wesley.
+ Permission to use, copy, modify, distribute and sell this software for any
+ purpose is hereby granted without fee, provided that the above copyright
+ notice appear in all copies and that both that copyright notice and this
+ permission notice appear in supporting documentation.
+ The author or Addison-Welsey Longman make no representations about the
+ suitability of this software for any purpose. It is provided "as is"
+ without express or implied warranty.
+*/
+//==============================================================================
+
+/**
+ None type means void parameters or return value.
+*/
+typedef void None;
+
+template <typename Head, typename Tail = None>
+struct TypeList
+{
+};
+
+/**
+ A TypeList with actual values.
+*/
+template <typename List>
+struct TypeListValues
+{
+ static std::string const tostring (bool)
+ {
+ return "";
+ }
+};
+
+/**
+ TypeListValues recursive template definition.
+*/
+template <typename Head, typename Tail>
+struct TypeListValues <TypeList <Head, Tail> >
+{
+ Head hd;
+ TypeListValues <Tail> tl;
+
+ TypeListValues (Head hd_, TypeListValues <Tail> const& tl_)
+ : hd (hd_), tl (tl_)
+ {
+ }
+
+ static std::string const tostring (bool comma = false)
+ {
+ std::string s;
+
+ if (comma)
+ s = ", ";
+
+ s = s + typeid (Head).name ();
+
+ return s + TypeListValues <Tail>::tostring (true);
+ }
+};
+
+// Specializations of type/value list for head types that are references and
+// const-references. We need to handle these specially since we can't count
+// on the referenced object hanging around for the lifetime of the list.
+
+template <typename Head, typename Tail>
+struct TypeListValues <TypeList <Head&, Tail> >
+{
+ Head hd;
+ TypeListValues <Tail> tl;
+
+ TypeListValues (Head& hd_, TypeListValues <Tail> const& tl_)
+ : hd (hd_), tl (tl_)
+ {
+ }
+
+ static std::string const tostring (bool comma = false)
+ {
+ std::string s;
+
+ if (comma)
+ s = ", ";
+
+ s = s + typeid (Head).name () + "&";
+
+ return s + TypeListValues <Tail>::tostring (true);
+ }
+};
+
+template <typename Head, typename Tail>
+struct TypeListValues <TypeList <Head const&, Tail> >
+{
+ Head hd;
+ TypeListValues <Tail> tl;
+
+ TypeListValues (Head const& hd_, const TypeListValues <Tail>& tl_)
+ : hd (hd_), tl (tl_)
+ {
+ }
+
+ static std::string const tostring (bool comma = false)
+ {
+ std::string s;
+
+ if (comma)
+ s = ", ";
+
+ s = s + typeid (Head).name () + " const&";
+
+ return s + TypeListValues <Tail>::tostring (true);
+ }
+};
+
+//==============================================================================
+/**
+ Subclass of a TypeListValues constructable from the Lua stack.
+*/
+
+template <typename List, int Start = 1>
+struct ArgList
+{
+};
+
+template <int Start>
+struct ArgList <None, Start> : public TypeListValues <None>
+{
+ ArgList (lua_State*)
+ {
+ }
+};
+
+template <typename Head, typename Tail, int Start>
+struct ArgList <TypeList <Head, Tail>, Start>
+ : public TypeListValues <TypeList <Head, Tail> >
+{
+ ArgList (lua_State* L)
+ : TypeListValues <TypeList <Head, Tail> > (Stack <Head>::get (L, Start),
+ ArgList <Tail, Start + 1> (L))
+ {
+ }
+};
diff --git a/libs/lua/LuaBridge/detail/TypeTraits.h b/libs/lua/LuaBridge/detail/TypeTraits.h
new file mode 100644
index 0000000..ffb437f
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/TypeTraits.h
@@ -0,0 +1,135 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef LUABRIDGE_TYPEINFO_HEADER
+#define LUABRIDGE_TYPEINFO_HEADER
+
+//------------------------------------------------------------------------------
+/**
+ Container traits.
+
+ Unspecialized ContainerTraits has the isNotContainer typedef for SFINAE.
+ All user defined containers must supply an appropriate specialization for
+ ContinerTraits (without the typedef isNotContainer). The containers that
+ come with LuaBridge also come with the appropriate ContainerTraits
+ specialization. See the corresponding declaration for details.
+
+ A specialization of ContainerTraits for some generic type ContainerType
+ looks like this:
+
+ template <class T>
+ struct ContainerTraits <ContainerType <T> >
+ {
+ typedef typename T Type;
+
+ static T* get (ContainerType <T> const& c)
+ {
+ return c.get (); // Implementation-dependent on ContainerType
+ }
+ };
+*/
+template <class T>
+struct ContainerTraits
+{
+ typedef bool isNotContainer;
+};
+
+//------------------------------------------------------------------------------
+/**
+ Type traits.
+
+ Specializations return information about a type.
+*/
+struct TypeTraits
+{
+ /** Determine if type T is a container.
+
+ To be considered a container, there must be a specialization of
+ ContainerTraits with the required fields.
+ */
+ template <typename T>
+ class isContainer
+ {
+ private:
+ typedef char yes[1]; // sizeof (yes) == 1
+ typedef char no [2]; // sizeof (no) == 2
+
+ template <typename C>
+ static no& test (typename C::isNotContainer*);
+
+ template <typename>
+ static yes& test (...);
+
+ public:
+ static const bool value = sizeof (test <ContainerTraits <T> >(0)) == sizeof (yes);
+ };
+
+ /** Determine if T is an enum */
+ template <typename T>
+ class isEnum
+ {
+ public:
+ //static const bool value = std::is_enum<T>::value; // C++11
+ static const bool value = boost::is_enum<T>::value;
+ };
+
+
+ /** Determine if T is const qualified.
+ */
+ /** @{ */
+ template <class T>
+ struct isConst
+ {
+ static bool const value = false;
+ };
+
+ template <class T>
+ struct isConst <T const>
+ {
+ static bool const value = true;
+ };
+ /** @} */
+
+ /** Remove the const qualifier from T.
+ */
+ /** @{ */
+ template <class T>
+ struct removeConst
+ {
+ typedef T Type;
+ };
+
+ template <class T>
+ struct removeConst <T const>
+ {
+ typedef T Type;
+ };
+ /**@}*/
+};
+
+#endif
diff --git a/libs/lua/LuaBridge/detail/Userdata.h b/libs/lua/LuaBridge/detail/Userdata.h
new file mode 100644
index 0000000..feab28f
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Userdata.h
@@ -0,0 +1,860 @@
+//------------------------------------------------------------------------------
+/*
+ https://github.com/vinniefalco/LuaBridge
+
+ Copyright 2016, Robin Gareus <robin at gareus.org>
+ Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+ License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+//==============================================================================
+
+//==============================================================================
+/**
+ Return the identity pointer for our lightuserdata tokens.
+
+ LuaBridge metatables are tagged with a security "token." The token is a
+ lightuserdata created from the identity pointer, used as a key in the
+ metatable. The value is a boolean = true, although any value could have been
+ used.
+
+ Because of Lua's dynamic typing and our improvised system of imposing C++
+ class structure, there is the possibility that executing scripts may
+ knowingly or unknowingly cause invalid data to get passed to the C functions
+ created by LuaBridge. In particular, our security model addresses the
+ following:
+
+ Notes:
+ 1. Scripts cannot create a userdata (ignoring the debug lib).
+ 2. Scripts cannot create a lightuserdata (ignoring the debug lib).
+ 3. Scripts cannot set the metatable on a userdata.
+ 4. Our identity key is a unique pointer in the process.
+ 5. Our metatables have a lightuserdata identity key / value pair.
+ 6. Our metatables have "__metatable" set to a boolean = false.
+ 7. Our lightuserdata is unique.
+*/
+
+#ifdef PLATFORM_WINDOWS
+# ifdef COMPILER_MSVC
+#include "LuaBridge/LuaBridge.h" /* Needed for LuaBridge_API */
+LuaBridge_API void* getIdentityKey ();
+# else
+extern void* getIdentityKey ();
+# endif
+#else
+inline void* getIdentityKey ()
+{
+ static char value;
+ return &value;
+}
+#endif
+
+/**
+ Interface to a class pointer retrievable from a userdata.
+*/
+class Userdata
+{
+protected:
+ void* m_p; // subclasses must set this
+
+ //--------------------------------------------------------------------------
+ /**
+ Get an untyped pointer to the contained class.
+ */
+ inline void* getPointer () const
+ {
+ return m_p;
+ }
+
+private:
+ //--------------------------------------------------------------------------
+ /**
+ Validate and retrieve a Userdata on the stack.
+
+ The Userdata must exactly match the corresponding class table or
+ const table, or else a Lua error is raised. This is used for the
+ __gc metamethod.
+ */
+ static Userdata* getExactClass (lua_State* L,
+ int narg,
+ void const* classKey)
+ {
+ Userdata* ud = 0;
+ int const index = lua_absindex (L, narg);
+
+ bool mismatch = false;
+ char const* got = 0;
+
+ lua_rawgetp (L, LUA_REGISTRYINDEX, classKey);
+ assert (lua_istable (L, -1));
+
+ // Make sure we have a userdata.
+ if (!lua_isuserdata (L, index))
+ mismatch = true;
+
+ // Make sure it's metatable is ours.
+ if (!mismatch)
+ {
+ lua_getmetatable (L, index);
+ lua_rawgetp (L, -1, getIdentityKey ());
+ if (lua_isboolean (L, -1))
+ {
+ lua_pop (L, 1);
+ }
+ else
+ {
+ lua_pop (L, 2);
+ mismatch = true;
+ }
+ }
+
+ if (!mismatch)
+ {
+ if (lua_rawequal (L, -1, -2))
+ {
+ // Matches class table.
+ lua_pop (L, 2);
+ ud = static_cast <Userdata*> (lua_touserdata (L, index));
+ }
+ else
+ {
+ rawgetfield (L, -2, "__const");
+ if (lua_rawequal (L, -1, -2))
+ {
+ // Matches const table
+ lua_pop (L, 3);
+ ud = static_cast <Userdata*> (lua_touserdata (L, index));
+ }
+ else
+ {
+ // Mismatch, but its one of ours so get a type name.
+ rawgetfield (L, -2, "__type");
+ lua_insert (L, -4);
+ lua_pop (L, 2);
+ got = lua_tostring (L, -2);
+ mismatch = true;
+ }
+ }
+ }
+
+ if (mismatch)
+ {
+ rawgetfield (L, -1, "__type");
+ assert (lua_type (L, -1) == LUA_TSTRING);
+ char const* const expected = lua_tostring (L, -1);
+
+ if (got == 0)
+ got = lua_typename (L, lua_type (L, index));
+
+ char const* const msg = lua_pushfstring (
+ L, "%s expected, got %s", expected, got);
+
+ if (narg > 0)
+ luaL_argerror (L, narg, msg);
+ else
+ lua_error (L);
+ }
+
+ return ud;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Validate and retrieve a Userdata on the stack.
+
+ The Userdata must be derived from or the same as the given base class,
+ identified by the key. If canBeConst is false, generates an error if
+ the resulting Userdata represents to a const object. We do the type check
+ first so that the error message is informative.
+ */
+ static Userdata* getClass (lua_State* L,
+ int index,
+ void const* baseClassKey,
+ bool canBeConst)
+ {
+ assert (index > 0);
+ Userdata* ud = 0;
+
+ bool mismatch = false;
+ char const* got = 0;
+
+ lua_rawgetp (L, LUA_REGISTRYINDEX, baseClassKey);
+ assert (lua_istable (L, -1));
+
+ // Make sure we have a userdata.
+ if (lua_isuserdata (L, index))
+ {
+ // Make sure it's metatable is ours.
+ lua_getmetatable (L, index);
+ lua_rawgetp (L, -1, getIdentityKey ());
+ if (lua_isboolean (L, -1))
+ {
+ lua_pop (L, 1);
+
+ // If __const is present, object is NOT const.
+ rawgetfield (L, -1, "__const");
+ assert (lua_istable (L, -1) || lua_isnil (L, -1));
+ bool const isConst = lua_isnil (L, -1);
+ lua_pop (L, 1);
+
+ // Replace the class table with the const table if needed.
+ if (isConst)
+ {
+ rawgetfield (L, -2, "__const");
+ assert (lua_istable (L, -1));
+ lua_replace (L, -3);
+ }
+
+ for (;;)
+ {
+ if (lua_rawequal (L, -1, -2))
+ {
+ lua_pop (L, 2);
+
+ // Match, now check const-ness.
+ if (isConst && !canBeConst)
+ {
+ luaL_argerror (L, index, "cannot be const");
+ }
+ else
+ {
+ ud = static_cast <Userdata*> (lua_touserdata (L, index));
+ break;
+ }
+ }
+ else
+ {
+ // Replace current metatable with it's base class.
+ rawgetfield (L, -1, "__parent");
+/*
+ud
+class metatable
+ud metatable
+ud __parent (nil)
+*/
+
+ if (lua_isnil (L, -1))
+ {
+ lua_remove (L, -1);
+ // Mismatch, but its one of ours so get a type name.
+ rawgetfield (L, -1, "__type");
+ lua_insert (L, -3);
+ lua_pop (L, 1);
+ got = lua_tostring (L, -2);
+ mismatch = true;
+ break;
+ }
+ else
+ {
+ lua_remove (L, -2);
+ }
+ }
+ }
+ }
+ else
+ {
+ lua_pop (L, 2);
+ mismatch = true;
+ }
+ }
+ else
+ {
+ mismatch = true;
+ }
+
+ if (mismatch)
+ {
+ assert (lua_type (L, -1) == LUA_TTABLE);
+ rawgetfield (L, -1, "__type");
+ assert (lua_type (L, -1) == LUA_TSTRING);
+ char const* const expected = lua_tostring (L, -1);
+
+ if (got == 0)
+ got = lua_typename (L, lua_type (L, index));
+
+ char const* const msg = lua_pushfstring (
+ L, "%s expected, got %s", expected, got);
+
+ luaL_argerror (L, index, msg);
+ }
+
+ return ud;
+ }
+
+public:
+ virtual ~Userdata () { }
+
+ static void* get_ptr (lua_State* L, int index) {
+ Userdata* ud = static_cast <Userdata*> (lua_touserdata (L, index));
+ return ud->m_p;
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Returns the Userdata* if the class on the Lua stack matches.
+
+ If the class does not match, a Lua error is raised.
+ */
+ template <class T>
+ static inline Userdata* getExact (lua_State* L, int index)
+ {
+ return getExactClass (L, index, ClassInfo <T>::getClassKey ());
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ Get a pointer to the class from the Lua stack.
+
+ If the object is not the class or a subclass, or it violates the
+ const-ness, a Lua error is raised.
+ */
+ template <class T>
+ static inline T* get (lua_State* L, int index, bool canBeConst)
+ {
+ if (lua_isnil (L, index))
+ return 0;
+ else
+ return static_cast <T*> (getClass (L, index,
+ ClassInfo <T>::getClassKey (), canBeConst)->getPointer ());
+ }
+};
+
+//----------------------------------------------------------------------------
+/**
+ Wraps a class object stored in a Lua userdata.
+
+ The lifetime of the object is managed by Lua. The object is constructed
+ inside the userdata using placement new.
+*/
+template <class T>
+class UserdataValue : public Userdata
+{
+private:
+ UserdataValue <T> (UserdataValue <T> const&);
+ UserdataValue <T> operator= (UserdataValue <T> const&);
+
+ char m_storage [sizeof (T)];
+
+ inline T* getObject ()
+ {
+ // If this fails to compile it means you forgot to provide
+ // a Container specialization for your container!
+ //
+ return reinterpret_cast <T*> (&m_storage [0]);
+ }
+
+private:
+ /**
+ Used for placement construction.
+ */
+ UserdataValue ()
+ {
+ m_p = getObject ();
+ }
+
+ ~UserdataValue ()
+ {
+ getObject ()->~T ();
+ }
+
+public:
+ /**
+ Push a T via placement new.
+
+ The caller is responsible for calling placement new using the
+ returned uninitialized storage.
+ */
+ static void* place (lua_State* const L)
+ {
+ UserdataValue <T>* const ud = new (
+ lua_newuserdata (L, sizeof (UserdataValue <T>))) UserdataValue <T> ();
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+ // If this goes off it means you forgot to register the class!
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ return ud->getPointer ();
+ }
+
+ /**
+ Push T via copy construction from U.
+ */
+ template <class U>
+ static inline void push (lua_State* const L, U const& u)
+ {
+ new (place (L)) U (u);
+ }
+};
+
+//----------------------------------------------------------------------------
+/**
+ Wraps a pointer to a class object inside a Lua userdata.
+
+ The lifetime of the object is managed by C++.
+*/
+class UserdataPtr : public Userdata
+{
+private:
+ UserdataPtr (UserdataPtr const&);
+ UserdataPtr operator= (UserdataPtr const&);
+
+private:
+ /** Push non-const pointer to object using metatable key.
+ */
+ static void push (lua_State* L, void* const p, void const* const key)
+ {
+ if (p)
+ {
+ new (lua_newuserdata (L, sizeof (UserdataPtr))) UserdataPtr (p);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, key);
+ // If this goes off it means you forgot to register the class!
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ }
+ else
+ {
+ lua_pushnil (L);
+ }
+ }
+
+ /** Push const pointer to object using metatable key.
+ */
+ static void push (lua_State* L, void const* const p, void const* const key)
+ {
+ if (p)
+ {
+ new (lua_newuserdata (L, sizeof (UserdataPtr)))
+ UserdataPtr (const_cast <void*> (p));
+ lua_rawgetp (L, LUA_REGISTRYINDEX, key);
+ // If this goes off it means you forgot to register the class!
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ }
+ else
+ {
+ lua_pushnil (L);
+ }
+ }
+
+ explicit UserdataPtr (void* const p)
+ {
+ m_p = p;
+
+ // Can't construct with a null pointer!
+ //
+ assert (m_p != 0);
+ }
+
+ friend class LuaRef;
+ static inline void push_raw (lua_State* const L, void* p, const void* classkey)
+ {
+ new (lua_newuserdata (L, sizeof (UserdataPtr))) UserdataPtr (p);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, classkey);
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ }
+
+public:
+ /** Push non-const pointer to object.
+ */
+ template <class T>
+ static inline void push (lua_State* const L, T* const p)
+ {
+ if (p)
+ push (L, p, ClassInfo <T>::getClassKey ());
+ else
+ lua_pushnil (L);
+ }
+
+ /** Push const pointer to object.
+ */
+ template <class T>
+ static inline void push (lua_State* const L, T const* const p)
+ {
+ if (p)
+ push (L, p, ClassInfo <T>::getConstKey ());
+ else
+ lua_pushnil (L);
+ }
+};
+
+//============================================================================
+/**
+ Wraps a container thet references a class object.
+
+ The template argument C is the container type, ContainerTraits must be
+ specialized on C or else a compile error will result.
+*/
+template <class C>
+class UserdataShared : public Userdata
+{
+private:
+ UserdataShared (UserdataShared <C> const&);
+ UserdataShared <C>& operator= (UserdataShared <C> const&);
+
+ typedef typename TypeTraits::removeConst <
+ typename ContainerTraits <C>::Type>::Type T;
+
+ C m_c;
+
+private:
+ ~UserdataShared ()
+ {
+ }
+
+public:
+ /**
+ Construct from a container to the class or a derived class.
+ */
+ template <class U>
+ explicit UserdataShared (U const& u) : m_c (u)
+ {
+ m_p = const_cast <void*> (reinterpret_cast <void const*> (
+ (ContainerTraits <C>::get (m_c))));
+ }
+
+ /**
+ Construct from a pointer to the class or a derived class.
+ */
+ template <class U>
+ explicit UserdataShared (U* u) : m_c (u)
+ {
+ m_p = const_cast <void*> (reinterpret_cast <void const*> (
+ (ContainerTraits <C>::get (m_c))));
+ }
+};
+
+//----------------------------------------------------------------------------
+//
+// SFINAE helpers.
+//
+
+// non-const objects
+template <class C, bool makeObjectConst>
+struct UserdataSharedHelper
+{
+ typedef typename TypeTraits::removeConst <
+ typename ContainerTraits <C>::Type>::Type T;
+
+ static void push (lua_State* L, C const& c)
+ {
+ if (ContainerTraits <C>::get (c) != 0)
+ {
+ new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (c);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+ // If this goes off it means the class T is unregistered!
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ }
+ else
+ {
+ lua_pushnil (L);
+ }
+ }
+
+ static void push (lua_State* L, T* const t)
+ {
+ if (t)
+ {
+ new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (t);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+ // If this goes off it means the class T is unregistered!
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ }
+ else
+ {
+ lua_pushnil (L);
+ }
+ }
+};
+
+// const objects
+template <class C>
+struct UserdataSharedHelper <C, true>
+{
+ typedef typename TypeTraits::removeConst <
+ typename ContainerTraits <C>::Type>::Type T;
+
+ static void push (lua_State* L, C const& c)
+ {
+ if (ContainerTraits <C>::get (c) != 0)
+ {
+ new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (c);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+ // If this goes off it means the class T is unregistered!
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ }
+ else
+ {
+ lua_pushnil (L);
+ }
+ }
+
+ static void push (lua_State* L, T* const t)
+ {
+ if (t)
+ {
+ new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (t);
+ lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+ // If this goes off it means the class T is unregistered!
+ assert (lua_istable (L, -1));
+ lua_setmetatable (L, -2);
+ }
+ else
+ {
+ lua_pushnil (L);
+ }
+ }
+};
+
+/**
+ Pass by container.
+
+ The container controls the object lifetime. Typically this will be a
+ lifetime shared by C++ and Lua using a reference count. Because of type
+ erasure, containers like std::shared_ptr will not work. Containers must
+ either be of the intrusive variety, or in the style of the RefCountedPtr
+ type provided by LuaBridge (that uses a global hash table).
+*/
+template <class C, bool byContainer, bool isEnum>
+struct StackHelper
+{
+ static inline void push (lua_State* L, C const& c)
+ {
+ UserdataSharedHelper <C,
+ TypeTraits::isConst <typename ContainerTraits <C>::Type>::value>::push (L, c);
+ }
+
+ typedef typename TypeTraits::removeConst <
+ typename ContainerTraits <C>::Type>::Type T;
+
+ static inline C get (lua_State* L, int index)
+ {
+ return Userdata::get <T> (L, index, true);
+ }
+};
+
+/**
+ Pass by value.
+
+ Lifetime is managed by Lua. A C++ function which accesses a pointer or
+ reference to an object outside the activation record in which it was
+ retrieved may result in undefined behavior if Lua garbage collected it.
+*/
+template <class T>
+struct StackHelper <T, false, false>
+{
+ static inline void push (lua_State* L, T const& t)
+ {
+ UserdataValue <T>::push (L, t);
+ }
+
+ static inline T const& get (lua_State* L, int index)
+ {
+ return *Userdata::get <T> (L, index, true);
+ }
+};
+
+template <class T>
+struct StackHelper <T, false, true>
+{
+ static inline void push (lua_State* L, T const& t)
+ {
+ int v = static_cast <int> (t);
+ lua_pushinteger (L, static_cast <lua_Integer> (v));
+ }
+
+ static inline T get (lua_State* L, int index)
+ {
+ int v = static_cast <int> (luaL_checkinteger (L, index));
+ return T (v);
+ }
+};
+
+//==============================================================================
+
+/**
+ Lua stack conversions for class objects passed by value.
+*/
+template <class T>
+struct Stack
+{
+public:
+ static inline void push (lua_State* L, T const& t)
+ {
+ StackHelper <T,
+ TypeTraits::isContainer <T>::value,
+ TypeTraits::isEnum<T>::value>::push (L, t);
+ }
+
+ static inline T get (lua_State* L, int index)
+ {
+ return StackHelper <T,
+ TypeTraits::isContainer <T>::value,
+ TypeTraits::isEnum<T>::value>::get (L, index);
+ }
+};
+
+//------------------------------------------------------------------------------
+/**
+ Lua stack conversions for pointers and references to class objects.
+
+ Lifetime is managed by C++. Lua code which remembers a reference to the
+ value may result in undefined behavior if C++ destroys the object. The
+ handling of the const and volatile qualifiers happens in UserdataPtr.
+*/
+
+// pointer
+template <class T>
+struct Stack <T*>
+{
+ static inline void push (lua_State* L, T* const p)
+ {
+ UserdataPtr::push (L, p);
+ }
+
+ static inline T* get (lua_State* L, int index)
+ {
+ return Userdata::get <T> (L, index, false);
+ }
+};
+
+// Strips the const off the right side of *
+template <class T>
+struct Stack <T* const>
+{
+ static inline void push (lua_State* L, T* const p)
+ {
+ UserdataPtr::push (L, p);
+ }
+
+ static inline T* get (lua_State* L, int index)
+ {
+ return Userdata::get <T> (L, index, false);
+ }
+};
+
+// pointer to const
+template <class T>
+struct Stack <T const*>
+{
+ static inline void push (lua_State* L, T const* const p)
+ {
+ UserdataPtr::push (L, p);
+ }
+
+ static inline T const* get (lua_State* L, int index)
+ {
+ return Userdata::get <T> (L, index, true);
+ }
+};
+
+// Strips the const off the right side of *
+template <class T>
+struct Stack <T const* const>
+{
+ static inline void push (lua_State* L, T const* const p)
+ {
+ UserdataPtr::push (L, p);
+ }
+
+ static inline T const* get (lua_State* L, int index)
+ {
+ return Userdata::get <T> (L, index, true);
+ }
+};
+
+// reference
+template <class T>
+struct Stack <T&>
+{
+ static inline void push (lua_State* L, T& t)
+ {
+ UserdataPtr::push (L, &t);
+ }
+
+ static T& get (lua_State* L, int index)
+ {
+ T* const t = Userdata::get <T> (L, index, false);
+ if (!t)
+ luaL_error (L, "nil passed to reference");
+ return *t;
+ }
+};
+
+template <class C, bool byContainer>
+struct RefStackHelper
+{
+ typedef C return_type;
+
+ static inline void push (lua_State* L, C const& t)
+ {
+ UserdataSharedHelper <C,
+ TypeTraits::isConst <typename ContainerTraits <C>::Type>::value>::push (L, t);
+ }
+
+ typedef typename TypeTraits::removeConst <
+ typename ContainerTraits <C>::Type>::Type T;
+
+ static return_type get (lua_State* L, int index)
+ {
+ return Userdata::get <T> (L, index, true);
+ }
+};
+
+template <class T>
+struct RefStackHelper <T, false>
+{
+ typedef T const& return_type;
+
+ static inline void push (lua_State* L, T const& t)
+ {
+ UserdataPtr::push (L, &t);
+ }
+
+ static return_type get (lua_State* L, int index)
+ {
+ T const* const t = Userdata::get <T> (L, index, true);
+
+ if (!t)
+ luaL_error (L, "nil passed to reference");
+ return *t;
+ }
+
+};
+
+// reference to const
+template <class T>
+struct Stack <T const&>
+{
+ typedef RefStackHelper <T, TypeTraits::isContainer <T>::value> helper_t;
+
+ static inline void push (lua_State* L, T const& t)
+ {
+ helper_t::push (L, t);
+ }
+
+ static typename helper_t::return_type get (lua_State* L, int index)
+ {
+ return helper_t::get (L, index);
+ }
+};
diff --git a/libs/lua/LuaBridge/detail/dump.h b/libs/lua/LuaBridge/detail/dump.h
new file mode 100644
index 0000000..b9b79ce
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/dump.h
@@ -0,0 +1,28 @@
+#include <sstream>
+#include <string>
+
+static std::string dumpLuaState(lua_State *L) {
+ std::stringstream ostr;
+ int i;
+ int top = lua_gettop(L);
+ ostr << "top=" << top << ":\n";
+ for (i = 1; i <= top; ++i) {
+ int t = lua_type(L, i);
+ switch(t) {
+ case LUA_TSTRING:
+ ostr << " " << i << ": '" << lua_tostring(L, i) << "'\n";
+ break;
+ case LUA_TBOOLEAN:
+ ostr << " " << i << ": " <<
+ (lua_toboolean(L, i) ? "true" : "false") << "\n";
+ break;
+ case LUA_TNUMBER:
+ ostr << " " << i << ": " << lua_tonumber(L, i) << "\n";
+ break;
+ default:
+ ostr << " " << i << ": TYPE=" << lua_typename(L, t) << ": " << lua_topointer(L, i)<< "\n";
+ break;
+ }
+ }
+ return ostr.str();
+}
diff --git a/libs/lua/MSVClua/lua.vcproj b/libs/lua/MSVClua/lua.vcproj
new file mode 100644
index 0000000..0c34950
--- /dev/null
+++ b/libs/lua/MSVClua/lua.vcproj
@@ -0,0 +1,363 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="lua"
+ ProjectGUID="{1FC0A845-7A3D-40FC-B4DD-95F4DD4B0A2D}"
+ RootNamespace="lua"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug 32|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="0"
+ AdditionalIncludeDirectories="..;"$(GenericIncludeFolder)";"$(GenericIncludeFolder)\ardourext""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_LUA;LIBLUA_DLL_EXPORTS;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;_DEBUG;DEBUG="Debug";LUA_DEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"liblua\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ MinimalRebuild="true"
+ RuntimeLibrary="3"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(DllPrefix)sigc++32-2.0D.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TargetFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release 32|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..;"$(GenericIncludeFolder)";"$(GenericIncludeFolder)\ardourext""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LUA;LIBLUA_DLL_EXPORTS;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"liblua\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ StringPooling="false"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="1"
+ WarningLevel="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(DllPrefix)sigc++32-2.0.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TargetFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release 32 with Debugging Capability|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ WholeProgramOptimization="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="
"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="0"
+ AdditionalIncludeDirectories="..;"$(GenericIncludeFolder)";"$(GenericIncludeFolder)\ardourext""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LUA;LIBLUA_DLL_EXPORTS;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"liblua\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ StringPooling="false"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="1"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(DllPrefix)sigc++32-2.0RDC.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"
copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"
"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\lua.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\luastate.cc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\lua\lua.h"
+ >
+ </File>
+ <File
+ RelativePath="..\lua\luastate.h"
+ >
+ </File>
+ <Filter
+ Name="LuaBridge"
+ >
+ <File
+ RelativePath="..\LuaBridge\LuaBridge.h"
+ >
+ </File>
+ <Filter
+ Name="detail"
+ >
+ <File
+ RelativePath="..\LuaBridge\detail\CFunctions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\ClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\Constructor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\dump.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\FuncArgs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\FuncTraits.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\Iterator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\LuaException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\LuaHelpers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\LuaRef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\Namespace.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\Stack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\TypeList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\TypeTraits.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LuaBridge\detail\Userdata.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/libs/lua/lua-5.3.3/README b/libs/lua/lua-5.3.3/README
new file mode 100644
index 0000000..dd74fdf
--- /dev/null
+++ b/libs/lua/lua-5.3.3/README
@@ -0,0 +1,28 @@
+This is Lua 5.3.3, released on 30 May 2016.
+
+The Lua source is imported in the repository in order to ensure that it
+is compiled with the same C++ compiler as Ardour (setjmp/longjmp, exceptions)
+and available on all platforms that Ardour is.
+
+This directory contains files from src/ directory from lua-5.3.3.
+The original source can be downloaded from https://www.lua.org/ftp/lua-5.3.3.tar.gz
+
+
+Copyright © 1994â2016 Lua.org, PUC-Rio.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/libs/lua/lua-5.3.3/lapi.c b/libs/lua/lua-5.3.3/lapi.c
new file mode 100644
index 0000000..c9455a5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lapi.c
@@ -0,0 +1,1298 @@
+/*
+** $Id: lapi.c,v 2.259 2016/02/29 14:27:14 roberto Exp $
+** Lua API
+** See Copyright Notice in lua.h
+*/
+
+#define lapi_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stdarg.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lundump.h"
+#include "lvm.h"
+
+
+
+const char lua_ident[] =
+ "$LuaVersion: " LUA_COPYRIGHT " $"
+ "$LuaAuthors: " LUA_AUTHORS " $";
+
+
+/* value at a non-valid index */
+#define NONVALIDVALUE cast(TValue *, luaO_nilobject)
+
+/* corresponding test */
+#define isvalid(o) ((o) != luaO_nilobject)
+
+/* test for pseudo index */
+#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX)
+
+/* test for upvalue */
+#define isupvalue(i) ((i) < LUA_REGISTRYINDEX)
+
+/* test for valid but not pseudo index */
+#define isstackindex(i, o) (isvalid(o) && !ispseudo(i))
+
+#define api_checkvalidindex(l,o) api_check(l, isvalid(o), "invalid index")
+
+#define api_checkstackindex(l, i, o) \
+ api_check(l, isstackindex(i, o), "index not in the stack")
+
+
+static TValue *index2addr (lua_State *L, int idx) {
+ CallInfo *ci = L->ci;
+ if (idx > 0) {
+ TValue *o = ci->func + idx;
+ api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index");
+ if (o >= L->top) return NONVALIDVALUE;
+ else return o;
+ }
+ else if (!ispseudo(idx)) { /* negative index */
+ api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
+ return L->top + idx;
+ }
+ else if (idx == LUA_REGISTRYINDEX)
+ return &G(L)->l_registry;
+ else { /* upvalues */
+ idx = LUA_REGISTRYINDEX - idx;
+ api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large");
+ if (ttislcf(ci->func)) /* light C function? */
+ return NONVALIDVALUE; /* it has no upvalues */
+ else {
+ CClosure *func = clCvalue(ci->func);
+ return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE;
+ }
+ }
+}
+
+
+/*
+** to be called by 'lua_checkstack' in protected mode, to grow stack
+** capturing memory errors
+*/
+static void growstack (lua_State *L, void *ud) {
+ int size = *(int *)ud;
+ luaD_growstack(L, size);
+}
+
+
+LUA_API int lua_checkstack (lua_State *L, int n) {
+ int res;
+ CallInfo *ci = L->ci;
+ lua_lock(L);
+ api_check(L, n >= 0, "negative 'n'");
+ if (L->stack_last - L->top > n) /* stack large enough? */
+ res = 1; /* yes; check is OK */
+ else { /* no; need to grow stack */
+ int inuse = cast_int(L->top - L->stack) + EXTRA_STACK;
+ if (inuse > LUAI_MAXSTACK - n) /* can grow without overflow? */
+ res = 0; /* no */
+ else /* try to grow stack */
+ res = (luaD_rawrunprotected(L, &growstack, &n) == LUA_OK);
+ }
+ if (res && ci->top < L->top + n)
+ ci->top = L->top + n; /* adjust frame top */
+ lua_unlock(L);
+ return res;
+}
+
+
+LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
+ int i;
+ if (from == to) return;
+ lua_lock(to);
+ api_checknelems(from, n);
+ api_check(from, G(from) == G(to), "moving among independent states");
+ api_check(from, to->ci->top - to->top >= n, "stack overflow");
+ from->top -= n;
+ for (i = 0; i < n; i++) {
+ setobj2s(to, to->top, from->top + i);
+ to->top++; /* stack already checked by previous 'api_check' */
+ }
+ lua_unlock(to);
+}
+
+
+LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
+ lua_CFunction old;
+ lua_lock(L);
+ old = G(L)->panic;
+ G(L)->panic = panicf;
+ lua_unlock(L);
+ return old;
+}
+
+
+LUA_API const lua_Number *lua_version (lua_State *L) {
+ static const lua_Number version = LUA_VERSION_NUM;
+ if (L == NULL) return &version;
+ else return G(L)->version;
+}
+
+
+
+/*
+** basic stack manipulation
+*/
+
+
+/*
+** convert an acceptable stack index into an absolute index
+*/
+LUA_API int lua_absindex (lua_State *L, int idx) {
+ return (idx > 0 || ispseudo(idx))
+ ? idx
+ : cast_int(L->top - L->ci->func) + idx;
+}
+
+
+LUA_API int lua_gettop (lua_State *L) {
+ return cast_int(L->top - (L->ci->func + 1));
+}
+
+
+LUA_API void lua_settop (lua_State *L, int idx) {
+ StkId func = L->ci->func;
+ lua_lock(L);
+ if (idx >= 0) {
+ api_check(L, idx <= L->stack_last - (func + 1), "new top too large");
+ while (L->top < (func + 1) + idx)
+ setnilvalue(L->top++);
+ L->top = (func + 1) + idx;
+ }
+ else {
+ api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
+ L->top += idx+1; /* 'subtract' index (index is negative) */
+ }
+ lua_unlock(L);
+}
+
+
+/*
+** Reverse the stack segment from 'from' to 'to'
+** (auxiliary to 'lua_rotate')
+*/
+static void reverse (lua_State *L, StkId from, StkId to) {
+ for (; from < to; from++, to--) {
+ TValue temp;
+ setobj(L, &temp, from);
+ setobjs2s(L, from, to);
+ setobj2s(L, to, &temp);
+ }
+}
+
+
+/*
+** Let x = AB, where A is a prefix of length 'n'. Then,
+** rotate x n == BA. But BA == (A^r . B^r)^r.
+*/
+LUA_API void lua_rotate (lua_State *L, int idx, int n) {
+ StkId p, t, m;
+ lua_lock(L);
+ t = L->top - 1; /* end of stack segment being rotated */
+ p = index2addr(L, idx); /* start of segment */
+ api_checkstackindex(L, idx, p);
+ api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'");
+ m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */
+ reverse(L, p, m); /* reverse the prefix with length 'n' */
+ reverse(L, m + 1, t); /* reverse the suffix */
+ reverse(L, p, t); /* reverse the entire segment */
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
+ TValue *fr, *to;
+ lua_lock(L);
+ fr = index2addr(L, fromidx);
+ to = index2addr(L, toidx);
+ api_checkvalidindex(L, to);
+ setobj(L, to, fr);
+ if (isupvalue(toidx)) /* function upvalue? */
+ luaC_barrier(L, clCvalue(L->ci->func), fr);
+ /* LUA_REGISTRYINDEX does not need gc barrier
+ (collector revisits it before finishing collection) */
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_pushvalue (lua_State *L, int idx) {
+ lua_lock(L);
+ setobj2s(L, L->top, index2addr(L, idx));
+ api_incr_top(L);
+ lua_unlock(L);
+}
+
+
+
+/*
+** access functions (stack -> C)
+*/
+
+
+LUA_API int lua_type (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ return (isvalid(o) ? ttnov(o) : LUA_TNONE);
+}
+
+
+LUA_API const char *lua_typename (lua_State *L, int t) {
+ UNUSED(L);
+ api_check(L, LUA_TNONE <= t && t < LUA_NUMTAGS, "invalid tag");
+ return ttypename(t);
+}
+
+
+LUA_API int lua_iscfunction (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ return (ttislcf(o) || (ttisCclosure(o)));
+}
+
+
+LUA_API int lua_isinteger (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ return ttisinteger(o);
+}
+
+
+LUA_API int lua_isnumber (lua_State *L, int idx) {
+ lua_Number n;
+ const TValue *o = index2addr(L, idx);
+ return tonumber(o, &n);
+}
+
+
+LUA_API int lua_isstring (lua_State *L, int idx) {
+ const TValue *o = index2addr(L, idx);
+ return (ttisstring(o) || cvt2str(o));
+}
+
+
+LUA_API int lua_isuserdata (lua_State *L, int idx) {
+ const TValue *o = index2addr(L, idx);
+ return (ttisfulluserdata(o) || ttislightuserdata(o));
+}
+
+
+LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
+ StkId o1 = index2addr(L, index1);
+ StkId o2 = index2addr(L, index2);
+ return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0;
+}
+
+
+LUA_API void lua_arith (lua_State *L, int op) {
+ lua_lock(L);
+ if (op != LUA_OPUNM && op != LUA_OPBNOT)
+ api_checknelems(L, 2); /* all other operations expect two operands */
+ else { /* for unary operations, add fake 2nd operand */
+ api_checknelems(L, 1);
+ setobjs2s(L, L->top, L->top - 1);
+ api_incr_top(L);
+ }
+ /* first operand at top - 2, second at top - 1; result go to top - 2 */
+ luaO_arith(L, op, L->top - 2, L->top - 1, L->top - 2);
+ L->top--; /* remove second operand */
+ lua_unlock(L);
+}
+
+
+LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {
+ StkId o1, o2;
+ int i = 0;
+ lua_lock(L); /* may call tag method */
+ o1 = index2addr(L, index1);
+ o2 = index2addr(L, index2);
+ if (isvalid(o1) && isvalid(o2)) {
+ switch (op) {
+ case LUA_OPEQ: i = luaV_equalobj(L, o1, o2); break;
+ case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break;
+ case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break;
+ default: api_check(L, 0, "invalid option");
+ }
+ }
+ lua_unlock(L);
+ return i;
+}
+
+
+LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {
+ size_t sz = luaO_str2num(s, L->top);
+ if (sz != 0)
+ api_incr_top(L);
+ return sz;
+}
+
+
+LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) {
+ lua_Number n;
+ const TValue *o = index2addr(L, idx);
+ int isnum = tonumber(o, &n);
+ if (!isnum)
+ n = 0; /* call to 'tonumber' may change 'n' even if it fails */
+ if (pisnum) *pisnum = isnum;
+ return n;
+}
+
+
+LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) {
+ lua_Integer res;
+ const TValue *o = index2addr(L, idx);
+ int isnum = tointeger(o, &res);
+ if (!isnum)
+ res = 0; /* call to 'tointeger' may change 'n' even if it fails */
+ if (pisnum) *pisnum = isnum;
+ return res;
+}
+
+
+LUA_API int lua_toboolean (lua_State *L, int idx) {
+ const TValue *o = index2addr(L, idx);
+ return !l_isfalse(o);
+}
+
+
+LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
+ StkId o = index2addr(L, idx);
+ if (!ttisstring(o)) {
+ if (!cvt2str(o)) { /* not convertible? */
+ if (len != NULL) *len = 0;
+ return NULL;
+ }
+ lua_lock(L); /* 'luaO_tostring' may create a new string */
+ luaO_tostring(L, o);
+ luaC_checkGC(L);
+ o = index2addr(L, idx); /* previous call may reallocate the stack */
+ lua_unlock(L);
+ }
+ if (len != NULL)
+ *len = vslen(o);
+ return svalue(o);
+}
+
+
+LUA_API size_t lua_rawlen (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ switch (ttype(o)) {
+ case LUA_TSHRSTR: return tsvalue(o)->shrlen;
+ case LUA_TLNGSTR: return tsvalue(o)->u.lnglen;
+ case LUA_TUSERDATA: return uvalue(o)->len;
+ case LUA_TTABLE: return luaH_getn(hvalue(o));
+ default: return 0;
+ }
+}
+
+
+LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ if (ttislcf(o)) return fvalue(o);
+ else if (ttisCclosure(o))
+ return clCvalue(o)->f;
+ else return NULL; /* not a C function */
+}
+
+
+LUA_API void *lua_touserdata (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ switch (ttnov(o)) {
+ case LUA_TUSERDATA: return getudatamem(uvalue(o));
+ case LUA_TLIGHTUSERDATA: return pvalue(o);
+ default: return NULL;
+ }
+}
+
+
+LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ return (!ttisthread(o)) ? NULL : thvalue(o);
+}
+
+
+LUA_API const void *lua_topointer (lua_State *L, int idx) {
+ StkId o = index2addr(L, idx);
+ switch (ttype(o)) {
+ case LUA_TTABLE: return hvalue(o);
+ case LUA_TLCL: return clLvalue(o);
+ case LUA_TCCL: return clCvalue(o);
+ case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o)));
+ case LUA_TTHREAD: return thvalue(o);
+ case LUA_TUSERDATA: return getudatamem(uvalue(o));
+ case LUA_TLIGHTUSERDATA: return pvalue(o);
+ default: return NULL;
+ }
+}
+
+
+
+/*
+** push functions (C -> stack)
+*/
+
+
+LUA_API void lua_pushnil (lua_State *L) {
+ lua_lock(L);
+ setnilvalue(L->top);
+ api_incr_top(L);
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
+ lua_lock(L);
+ setfltvalue(L->top, n);
+ api_incr_top(L);
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
+ lua_lock(L);
+ setivalue(L->top, n);
+ api_incr_top(L);
+ lua_unlock(L);
+}
+
+
+/*
+** Pushes on the stack a string with given length. Avoid using 's' when
+** 'len' == 0 (as 's' can be NULL in that case), due to later use of
+** 'memcmp' and 'memcpy'.
+*/
+LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {
+ TString *ts;
+ lua_lock(L);
+ ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len);
+ setsvalue2s(L, L->top, ts);
+ api_incr_top(L);
+ luaC_checkGC(L);
+ lua_unlock(L);
+ return getstr(ts);
+}
+
+
+LUA_API const char *lua_pushstring (lua_State *L, const char *s) {
+ lua_lock(L);
+ if (s == NULL)
+ setnilvalue(L->top);
+ else {
+ TString *ts;
+ ts = luaS_new(L, s);
+ setsvalue2s(L, L->top, ts);
+ s = getstr(ts); /* internal copy's address */
+ }
+ api_incr_top(L);
+ luaC_checkGC(L);
+ lua_unlock(L);
+ return s;
+}
+
+
+LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
+ va_list argp) {
+ const char *ret;
+ lua_lock(L);
+ ret = luaO_pushvfstring(L, fmt, argp);
+ luaC_checkGC(L);
+ lua_unlock(L);
+ return ret;
+}
+
+
+LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
+ const char *ret;
+ va_list argp;
+ lua_lock(L);
+ va_start(argp, fmt);
+ ret = luaO_pushvfstring(L, fmt, argp);
+ va_end(argp);
+ luaC_checkGC(L);
+ lua_unlock(L);
+ return ret;
+}
+
+
+LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
+ lua_lock(L);
+ if (n == 0) {
+ setfvalue(L->top, fn);
+ }
+ else {
+ CClosure *cl;
+ api_checknelems(L, n);
+ api_check(L, n <= MAXUPVAL, "upvalue index too large");
+ cl = luaF_newCclosure(L, n);
+ cl->f = fn;
+ L->top -= n;
+ while (n--) {
+ setobj2n(L, &cl->upvalue[n], L->top + n);
+ /* does not need barrier because closure is white */
+ }
+ setclCvalue(L, L->top, cl);
+ }
+ api_incr_top(L);
+ luaC_checkGC(L);
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_pushboolean (lua_State *L, int b) {
+ lua_lock(L);
+ setbvalue(L->top, (b != 0)); /* ensure that true is 1 */
+ api_incr_top(L);
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
+ lua_lock(L);
+ setpvalue(L->top, p);
+ api_incr_top(L);
+ lua_unlock(L);
+}
+
+
+LUA_API int lua_pushthread (lua_State *L) {
+ lua_lock(L);
+ setthvalue(L, L->top, L);
+ api_incr_top(L);
+ lua_unlock(L);
+ return (G(L)->mainthread == L);
+}
+
+
+
+/*
+** get functions (Lua -> stack)
+*/
+
+
+static int auxgetstr (lua_State *L, const TValue *t, const char *k) {
+ const TValue *slot;
+ TString *str = luaS_new(L, k);
+ if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
+ setobj2s(L, L->top, slot);
+ api_incr_top(L);
+ }
+ else {
+ setsvalue2s(L, L->top, str);
+ api_incr_top(L);
+ luaV_finishget(L, t, L->top - 1, L->top - 1, slot);
+ }
+ lua_unlock(L);
+ return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_getglobal (lua_State *L, const char *name) {
+ Table *reg = hvalue(&G(L)->l_registry);
+ lua_lock(L);
+ return auxgetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name);
+}
+
+
+LUA_API int lua_gettable (lua_State *L, int idx) {
+ StkId t;
+ lua_lock(L);
+ t = index2addr(L, idx);
+ luaV_gettable(L, t, L->top - 1, L->top - 1);
+ lua_unlock(L);
+ return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_getfield (lua_State *L, int idx, const char *k) {
+ lua_lock(L);
+ return auxgetstr(L, index2addr(L, idx), k);
+}
+
+
+LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) {
+ StkId t;
+ const TValue *slot;
+ lua_lock(L);
+ t = index2addr(L, idx);
+ if (luaV_fastget(L, t, n, slot, luaH_getint)) {
+ setobj2s(L, L->top, slot);
+ api_incr_top(L);
+ }
+ else {
+ setivalue(L->top, n);
+ api_incr_top(L);
+ luaV_finishget(L, t, L->top - 1, L->top - 1, slot);
+ }
+ lua_unlock(L);
+ return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_rawget (lua_State *L, int idx) {
+ StkId t;
+ lua_lock(L);
+ t = index2addr(L, idx);
+ api_check(L, ttistable(t), "table expected");
+ setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));
+ lua_unlock(L);
+ return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) {
+ StkId t;
+ lua_lock(L);
+ t = index2addr(L, idx);
+ api_check(L, ttistable(t), "table expected");
+ setobj2s(L, L->top, luaH_getint(hvalue(t), n));
+ api_incr_top(L);
+ lua_unlock(L);
+ return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) {
+ StkId t;
+ TValue k;
+ lua_lock(L);
+ t = index2addr(L, idx);
+ api_check(L, ttistable(t), "table expected");
+ setpvalue(&k, cast(void *, p));
+ setobj2s(L, L->top, luaH_get(hvalue(t), &k));
+ api_incr_top(L);
+ lua_unlock(L);
+ return ttnov(L->top - 1);
+}
+
+
+LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
+ Table *t;
+ lua_lock(L);
+ t = luaH_new(L);
+ sethvalue(L, L->top, t);
+ api_incr_top(L);
+ if (narray > 0 || nrec > 0)
+ luaH_resize(L, t, narray, nrec);
+ luaC_checkGC(L);
+ lua_unlock(L);
+}
+
+
+LUA_API int lua_getmetatable (lua_State *L, int objindex) {
+ const TValue *obj;
+ Table *mt;
+ int res = 0;
+ lua_lock(L);
+ obj = index2addr(L, objindex);
+ switch (ttnov(obj)) {
+ case LUA_TTABLE:
+ mt = hvalue(obj)->metatable;
+ break;
+ case LUA_TUSERDATA:
+ mt = uvalue(obj)->metatable;
+ break;
+ default:
+ mt = G(L)->mt[ttnov(obj)];
+ break;
+ }
+ if (mt != NULL) {
+ sethvalue(L, L->top, mt);
+ api_incr_top(L);
+ res = 1;
+ }
+ lua_unlock(L);
+ return res;
+}
+
+
+LUA_API int lua_getuservalue (lua_State *L, int idx) {
+ StkId o;
+ lua_lock(L);
+ o = index2addr(L, idx);
+ api_check(L, ttisfulluserdata(o), "full userdata expected");
+ getuservalue(L, uvalue(o), L->top);
+ api_incr_top(L);
+ lua_unlock(L);
+ return ttnov(L->top - 1);
+}
+
+
+/*
+** set functions (stack -> Lua)
+*/
+
+/*
+** t[k] = value at the top of the stack (where 'k' is a string)
+*/
+static void auxsetstr (lua_State *L, const TValue *t, const char *k) {
+ const TValue *slot;
+ TString *str = luaS_new(L, k);
+ api_checknelems(L, 1);
+ if (luaV_fastset(L, t, str, slot, luaH_getstr, L->top - 1))
+ L->top--; /* pop value */
+ else {
+ setsvalue2s(L, L->top, str); /* push 'str' (to make it a TValue) */
+ api_incr_top(L);
+ luaV_finishset(L, t, L->top - 1, L->top - 2, slot);
+ L->top -= 2; /* pop value and key */
+ }
+ lua_unlock(L); /* lock done by caller */
+}
+
+
+LUA_API void lua_setglobal (lua_State *L, const char *name) {
+ Table *reg = hvalue(&G(L)->l_registry);
+ lua_lock(L); /* unlock done in 'auxsetstr' */
+ auxsetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name);
+}
+
+
+LUA_API void lua_settable (lua_State *L, int idx) {
+ StkId t;
+ lua_lock(L);
+ api_checknelems(L, 2);
+ t = index2addr(L, idx);
+ luaV_settable(L, t, L->top - 2, L->top - 1);
+ L->top -= 2; /* pop index and value */
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
+ lua_lock(L); /* unlock done in 'auxsetstr' */
+ auxsetstr(L, index2addr(L, idx), k);
+}
+
+
+LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {
+ StkId t;
+ const TValue *slot;
+ lua_lock(L);
+ api_checknelems(L, 1);
+ t = index2addr(L, idx);
+ if (luaV_fastset(L, t, n, slot, luaH_getint, L->top - 1))
+ L->top--; /* pop value */
+ else {
+ setivalue(L->top, n);
+ api_incr_top(L);
+ luaV_finishset(L, t, L->top - 1, L->top - 2, slot);
+ L->top -= 2; /* pop value and key */
+ }
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_rawset (lua_State *L, int idx) {
+ StkId o;
+ TValue *slot;
+ lua_lock(L);
+ api_checknelems(L, 2);
+ o = index2addr(L, idx);
+ api_check(L, ttistable(o), "table expected");
+ slot = luaH_set(L, hvalue(o), L->top - 2);
+ setobj2t(L, slot, L->top - 1);
+ invalidateTMcache(hvalue(o));
+ luaC_barrierback(L, hvalue(o), L->top-1);
+ L->top -= 2;
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {
+ StkId o;
+ lua_lock(L);
+ api_checknelems(L, 1);
+ o = index2addr(L, idx);
+ api_check(L, ttistable(o), "table expected");
+ luaH_setint(L, hvalue(o), n, L->top - 1);
+ luaC_barrierback(L, hvalue(o), L->top-1);
+ L->top--;
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
+ StkId o;
+ TValue k, *slot;
+ lua_lock(L);
+ api_checknelems(L, 1);
+ o = index2addr(L, idx);
+ api_check(L, ttistable(o), "table expected");
+ setpvalue(&k, cast(void *, p));
+ slot = luaH_set(L, hvalue(o), &k);
+ setobj2t(L, slot, L->top - 1);
+ luaC_barrierback(L, hvalue(o), L->top - 1);
+ L->top--;
+ lua_unlock(L);
+}
+
+
+LUA_API int lua_setmetatable (lua_State *L, int objindex) {
+ TValue *obj;
+ Table *mt;
+ lua_lock(L);
+ api_checknelems(L, 1);
+ obj = index2addr(L, objindex);
+ if (ttisnil(L->top - 1))
+ mt = NULL;
+ else {
+ api_check(L, ttistable(L->top - 1), "table expected");
+ mt = hvalue(L->top - 1);
+ }
+ switch (ttnov(obj)) {
+ case LUA_TTABLE: {
+ hvalue(obj)->metatable = mt;
+ if (mt) {
+ luaC_objbarrier(L, gcvalue(obj), mt);
+ luaC_checkfinalizer(L, gcvalue(obj), mt);
+ }
+ break;
+ }
+ case LUA_TUSERDATA: {
+ uvalue(obj)->metatable = mt;
+ if (mt) {
+ luaC_objbarrier(L, uvalue(obj), mt);
+ luaC_checkfinalizer(L, gcvalue(obj), mt);
+ }
+ break;
+ }
+ default: {
+ G(L)->mt[ttnov(obj)] = mt;
+ break;
+ }
+ }
+ L->top--;
+ lua_unlock(L);
+ return 1;
+}
+
+
+LUA_API void lua_setuservalue (lua_State *L, int idx) {
+ StkId o;
+ lua_lock(L);
+ api_checknelems(L, 1);
+ o = index2addr(L, idx);
+ api_check(L, ttisfulluserdata(o), "full userdata expected");
+ setuservalue(L, uvalue(o), L->top - 1);
+ luaC_barrier(L, gcvalue(o), L->top - 1);
+ L->top--;
+ lua_unlock(L);
+}
+
+
+/*
+** 'load' and 'call' functions (run Lua code)
+*/
+
+
+#define checkresults(L,na,nr) \
+ api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \
+ "results from function overflow current stack size")
+
+
+LUA_API void lua_callk (lua_State *L, int nargs, int nresults,
+ lua_KContext ctx, lua_KFunction k) {
+ StkId func;
+ lua_lock(L);
+ api_check(L, k == NULL || !isLua(L->ci),
+ "cannot use continuations inside hooks");
+ api_checknelems(L, nargs+1);
+ api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread");
+ checkresults(L, nargs, nresults);
+ func = L->top - (nargs+1);
+ if (k != NULL && L->nny == 0) { /* need to prepare continuation? */
+ L->ci->u.c.k = k; /* save continuation */
+ L->ci->u.c.ctx = ctx; /* save context */
+ luaD_call(L, func, nresults); /* do the call */
+ }
+ else /* no continuation or no yieldable */
+ luaD_callnoyield(L, func, nresults); /* just do the call */
+ adjustresults(L, nresults);
+ lua_unlock(L);
+}
+
+
+
+/*
+** Execute a protected call.
+*/
+struct CallS { /* data to 'f_call' */
+ StkId func;
+ int nresults;
+};
+
+
+static void f_call (lua_State *L, void *ud) {
+ struct CallS *c = cast(struct CallS *, ud);
+ luaD_callnoyield(L, c->func, c->nresults);
+}
+
+
+
+LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,
+ lua_KContext ctx, lua_KFunction k) {
+ struct CallS c;
+ int status;
+ ptrdiff_t func;
+ lua_lock(L);
+ api_check(L, k == NULL || !isLua(L->ci),
+ "cannot use continuations inside hooks");
+ api_checknelems(L, nargs+1);
+ api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread");
+ checkresults(L, nargs, nresults);
+ if (errfunc == 0)
+ func = 0;
+ else {
+ StkId o = index2addr(L, errfunc);
+ api_checkstackindex(L, errfunc, o);
+ func = savestack(L, o);
+ }
+ c.func = L->top - (nargs+1); /* function to be called */
+ if (k == NULL || L->nny > 0) { /* no continuation or no yieldable? */
+ c.nresults = nresults; /* do a 'conventional' protected call */
+ status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);
+ }
+ else { /* prepare continuation (call is already protected by 'resume') */
+ CallInfo *ci = L->ci;
+ ci->u.c.k = k; /* save continuation */
+ ci->u.c.ctx = ctx; /* save context */
+ /* save information for error recovery */
+ ci->extra = savestack(L, c.func);
+ ci->u.c.old_errfunc = L->errfunc;
+ L->errfunc = func;
+ setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */
+ ci->callstatus |= CIST_YPCALL; /* function can do error recovery */
+ luaD_call(L, c.func, nresults); /* do the call */
+ ci->callstatus &= ~CIST_YPCALL;
+ L->errfunc = ci->u.c.old_errfunc;
+ status = LUA_OK; /* if it is here, there were no errors */
+ }
+ adjustresults(L, nresults);
+ lua_unlock(L);
+ return status;
+}
+
+
+LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
+ const char *chunkname, const char *mode) {
+ ZIO z;
+ int status;
+ lua_lock(L);
+ if (!chunkname) chunkname = "?";
+ luaZ_init(L, &z, reader, data);
+ status = luaD_protectedparser(L, &z, chunkname, mode);
+ if (status == LUA_OK) { /* no errors? */
+ LClosure *f = clLvalue(L->top - 1); /* get newly created function */
+ if (f->nupvalues >= 1) { /* does it have an upvalue? */
+ /* get global table from registry */
+ Table *reg = hvalue(&G(L)->l_registry);
+ const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
+ /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */
+ setobj(L, f->upvals[0]->v, gt);
+ luaC_upvalbarrier(L, f->upvals[0]);
+ }
+ }
+ lua_unlock(L);
+ return status;
+}
+
+
+LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) {
+ int status;
+ TValue *o;
+ lua_lock(L);
+ api_checknelems(L, 1);
+ o = L->top - 1;
+ if (isLfunction(o))
+ status = luaU_dump(L, getproto(o), writer, data, strip);
+ else
+ status = 1;
+ lua_unlock(L);
+ return status;
+}
+
+
+LUA_API int lua_status (lua_State *L) {
+ return L->status;
+}
+
+
+/*
+** Garbage-collection function
+*/
+
+LUA_API int lua_gc (lua_State *L, int what, int data) {
+ int res = 0;
+ global_State *g;
+ lua_lock(L);
+ g = G(L);
+ switch (what) {
+ case LUA_GCSTOP: {
+ g->gcrunning = 0;
+ break;
+ }
+ case LUA_GCRESTART: {
+ luaE_setdebt(g, 0);
+ g->gcrunning = 1;
+ break;
+ }
+ case LUA_GCCOLLECT: {
+ luaC_fullgc(L, 0);
+ break;
+ }
+ case LUA_GCCOUNT: {
+ /* GC values are expressed in Kbytes: #bytes/2^10 */
+ res = cast_int(gettotalbytes(g) >> 10);
+ break;
+ }
+ case LUA_GCCOUNTB: {
+ res = cast_int(gettotalbytes(g) & 0x3ff);
+ break;
+ }
+ case LUA_GCSTEP: {
+ l_mem debt = 1; /* =1 to signal that it did an actual step */
+ lu_byte oldrunning = g->gcrunning;
+ g->gcrunning = 1; /* allow GC to run */
+ if (data == 0) {
+ luaE_setdebt(g, -GCSTEPSIZE); /* to do a "small" step */
+ luaC_step(L);
+ }
+ else { /* add 'data' to total debt */
+ debt = cast(l_mem, data) * 1024 + g->GCdebt;
+ luaE_setdebt(g, debt);
+ luaC_checkGC(L);
+ }
+ g->gcrunning = oldrunning; /* restore previous state */
+ if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */
+ res = 1; /* signal it */
+ break;
+ }
+ case LUA_GCSETPAUSE: {
+ res = g->gcpause;
+ g->gcpause = data;
+ break;
+ }
+ case LUA_GCSETSTEPMUL: {
+ res = g->gcstepmul;
+ if (data < 40) data = 40; /* avoid ridiculous low values (and 0) */
+ g->gcstepmul = data;
+ break;
+ }
+ case LUA_GCISRUNNING: {
+ res = g->gcrunning;
+ break;
+ }
+ default: res = -1; /* invalid option */
+ }
+ lua_unlock(L);
+ return res;
+}
+
+
+
+/*
+** miscellaneous functions
+*/
+
+
+LUA_API int lua_error (lua_State *L) {
+ lua_lock(L);
+ api_checknelems(L, 1);
+ luaG_errormsg(L);
+ /* code unreachable; will unlock when control actually leaves the kernel */
+ return 0; /* to avoid warnings */
+}
+
+
+LUA_API int lua_next (lua_State *L, int idx) {
+ StkId t;
+ int more;
+ lua_lock(L);
+ t = index2addr(L, idx);
+ api_check(L, ttistable(t), "table expected");
+ more = luaH_next(L, hvalue(t), L->top - 1);
+ if (more) {
+ api_incr_top(L);
+ }
+ else /* no more elements */
+ L->top -= 1; /* remove key */
+ lua_unlock(L);
+ return more;
+}
+
+
+LUA_API void lua_concat (lua_State *L, int n) {
+ lua_lock(L);
+ api_checknelems(L, n);
+ if (n >= 2) {
+ luaV_concat(L, n);
+ }
+ else if (n == 0) { /* push empty string */
+ setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));
+ api_incr_top(L);
+ }
+ /* else n == 1; nothing to do */
+ luaC_checkGC(L);
+ lua_unlock(L);
+}
+
+
+LUA_API void lua_len (lua_State *L, int idx) {
+ StkId t;
+ lua_lock(L);
+ t = index2addr(L, idx);
+ luaV_objlen(L, L->top, t);
+ api_incr_top(L);
+ lua_unlock(L);
+}
+
+
+LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
+ lua_Alloc f;
+ lua_lock(L);
+ if (ud) *ud = G(L)->ud;
+ f = G(L)->frealloc;
+ lua_unlock(L);
+ return f;
+}
+
+
+LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
+ lua_lock(L);
+ G(L)->ud = ud;
+ G(L)->frealloc = f;
+ lua_unlock(L);
+}
+
+
+LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
+ Udata *u;
+ lua_lock(L);
+ u = luaS_newudata(L, size);
+ setuvalue(L, L->top, u);
+ api_incr_top(L);
+ luaC_checkGC(L);
+ lua_unlock(L);
+ return getudatamem(u);
+}
+
+
+
+static const char *aux_upvalue (StkId fi, int n, TValue **val,
+ CClosure **owner, UpVal **uv) {
+ switch (ttype(fi)) {
+ case LUA_TCCL: { /* C closure */
+ CClosure *f = clCvalue(fi);
+ if (!(1 <= n && n <= f->nupvalues)) return NULL;
+ *val = &f->upvalue[n-1];
+ if (owner) *owner = f;
+ return "";
+ }
+ case LUA_TLCL: { /* Lua closure */
+ LClosure *f = clLvalue(fi);
+ TString *name;
+ Proto *p = f->p;
+ if (!(1 <= n && n <= p->sizeupvalues)) return NULL;
+ *val = f->upvals[n-1]->v;
+ if (uv) *uv = f->upvals[n - 1];
+ name = p->upvalues[n-1].name;
+ return (name == NULL) ? "(*no name)" : getstr(name);
+ }
+ default: return NULL; /* not a closure */
+ }
+}
+
+
+LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
+ const char *name;
+ TValue *val = NULL; /* to avoid warnings */
+ lua_lock(L);
+ name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL, NULL);
+ if (name) {
+ setobj2s(L, L->top, val);
+ api_incr_top(L);
+ }
+ lua_unlock(L);
+ return name;
+}
+
+
+LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
+ const char *name;
+ TValue *val = NULL; /* to avoid warnings */
+ CClosure *owner = NULL;
+ UpVal *uv = NULL;
+ StkId fi;
+ lua_lock(L);
+ fi = index2addr(L, funcindex);
+ api_checknelems(L, 1);
+ name = aux_upvalue(fi, n, &val, &owner, &uv);
+ if (name) {
+ L->top--;
+ setobj(L, val, L->top);
+ if (owner) { luaC_barrier(L, owner, L->top); }
+ else if (uv) { luaC_upvalbarrier(L, uv); }
+ }
+ lua_unlock(L);
+ return name;
+}
+
+
+static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) {
+ LClosure *f;
+ StkId fi = index2addr(L, fidx);
+ api_check(L, ttisLclosure(fi), "Lua function expected");
+ f = clLvalue(fi);
+ api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index");
+ if (pf) *pf = f;
+ return &f->upvals[n - 1]; /* get its upvalue pointer */
+}
+
+
+LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) {
+ StkId fi = index2addr(L, fidx);
+ switch (ttype(fi)) {
+ case LUA_TLCL: { /* lua closure */
+ return *getupvalref(L, fidx, n, NULL);
+ }
+ case LUA_TCCL: { /* C closure */
+ CClosure *f = clCvalue(fi);
+ api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index");
+ return &f->upvalue[n - 1];
+ }
+ default: {
+ api_check(L, 0, "closure expected");
+ return NULL;
+ }
+ }
+}
+
+
+LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1,
+ int fidx2, int n2) {
+ LClosure *f1;
+ UpVal **up1 = getupvalref(L, fidx1, n1, &f1);
+ UpVal **up2 = getupvalref(L, fidx2, n2, NULL);
+ luaC_upvdeccount(L, *up1);
+ *up1 = *up2;
+ (*up1)->refcount++;
+ if (upisopen(*up1)) (*up1)->u.open.touched = 1;
+ luaC_upvalbarrier(L, *up1);
+}
+
+
diff --git a/libs/lua/lua-5.3.3/lapi.h b/libs/lua/lua-5.3.3/lapi.h
new file mode 100644
index 0000000..6d36dee
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lapi.h
@@ -0,0 +1,24 @@
+/*
+** $Id: lapi.h,v 2.9 2015/03/06 19:49:50 roberto Exp $
+** Auxiliary functions from Lua API
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lapi_h
+#define lapi_h
+
+
+#include "llimits.h"
+#include "lstate.h"
+
+#define api_incr_top(L) {L->top++; api_check(L, L->top <= L->ci->top, \
+ "stack overflow");}
+
+#define adjustresults(L,nres) \
+ { if ((nres) == LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; }
+
+#define api_checknelems(L,n) api_check(L, (n) < (L->top - L->ci->func), \
+ "not enough elements in the stack")
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lauxlib.c b/libs/lua/lua-5.3.3/lauxlib.c
new file mode 100644
index 0000000..bacf43b
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lauxlib.c
@@ -0,0 +1,1035 @@
+/*
+** $Id: lauxlib.c,v 1.286 2016/01/08 15:33:09 roberto Exp $
+** Auxiliary functions for building Lua libraries
+** See Copyright Notice in lua.h
+*/
+
+#define lauxlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/*
+** This file uses only the official API of Lua.
+** Any function declared here could be written as an application function.
+*/
+
+#include "lua.h"
+
+#include "lauxlib.h"
+
+
+/*
+** {======================================================
+** Traceback
+** =======================================================
+*/
+
+
+#define LEVELS1 10 /* size of the first part of the stack */
+#define LEVELS2 11 /* size of the second part of the stack */
+
+
+
+/*
+** search for 'objidx' in table at index -1.
+** return 1 + string at top if find a good name.
+*/
+static int findfield (lua_State *L, int objidx, int level) {
+ if (level == 0 || !lua_istable(L, -1))
+ return 0; /* not found */
+ lua_pushnil(L); /* start 'next' loop */
+ while (lua_next(L, -2)) { /* for each pair in table */
+ if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */
+ if (lua_rawequal(L, objidx, -1)) { /* found object? */
+ lua_pop(L, 1); /* remove value (but keep name) */
+ return 1;
+ }
+ else if (findfield(L, objidx, level - 1)) { /* try recursively */
+ lua_remove(L, -2); /* remove table (but keep name) */
+ lua_pushliteral(L, ".");
+ lua_insert(L, -2); /* place '.' between the two names */
+ lua_concat(L, 3);
+ return 1;
+ }
+ }
+ lua_pop(L, 1); /* remove value */
+ }
+ return 0; /* not found */
+}
+
+
+/*
+** Search for a name for a function in all loaded modules
+** (registry._LOADED).
+*/
+static int pushglobalfuncname (lua_State *L, lua_Debug *ar) {
+ int top = lua_gettop(L);
+ lua_getinfo(L, "f", ar); /* push function */
+ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
+ if (findfield(L, top + 1, 2)) {
+ const char *name = lua_tostring(L, -1);
+ if (strncmp(name, "_G.", 3) == 0) { /* name start with '_G.'? */
+ lua_pushstring(L, name + 3); /* push name without prefix */
+ lua_remove(L, -2); /* remove original name */
+ }
+ lua_copy(L, -1, top + 1); /* move name to proper place */
+ lua_pop(L, 2); /* remove pushed values */
+ return 1;
+ }
+ else {
+ lua_settop(L, top); /* remove function and global table */
+ return 0;
+ }
+}
+
+
+static void pushfuncname (lua_State *L, lua_Debug *ar) {
+ if (pushglobalfuncname(L, ar)) { /* try first a global name */
+ lua_pushfstring(L, "function '%s'", lua_tostring(L, -1));
+ lua_remove(L, -2); /* remove name */
+ }
+ else if (*ar->namewhat != '\0') /* is there a name from code? */
+ lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name); /* use it */
+ else if (*ar->what == 'm') /* main? */
+ lua_pushliteral(L, "main chunk");
+ else if (*ar->what != 'C') /* for Lua functions, use <file:line> */
+ lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined);
+ else /* nothing left... */
+ lua_pushliteral(L, "?");
+}
+
+
+static int lastlevel (lua_State *L) {
+ lua_Debug ar;
+ int li = 1, le = 1;
+ /* find an upper bound */
+ while (lua_getstack(L, le, &ar)) { li = le; le *= 2; }
+ /* do a binary search */
+ while (li < le) {
+ int m = (li + le)/2;
+ if (lua_getstack(L, m, &ar)) li = m + 1;
+ else le = m;
+ }
+ return le - 1;
+}
+
+
+LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
+ const char *msg, int level) {
+ lua_Debug ar;
+ int top = lua_gettop(L);
+ int last = lastlevel(L1);
+ int n1 = (last - level > LEVELS1 + LEVELS2) ? LEVELS1 : -1;
+ if (msg)
+ lua_pushfstring(L, "%s\n", msg);
+ luaL_checkstack(L, 10, NULL);
+ lua_pushliteral(L, "stack traceback:");
+ while (lua_getstack(L1, level++, &ar)) {
+ if (n1-- == 0) { /* too many levels? */
+ lua_pushliteral(L, "\n\t..."); /* add a '...' */
+ level = last - LEVELS2 + 1; /* and skip to last ones */
+ }
+ else {
+ lua_getinfo(L1, "Slnt", &ar);
+ lua_pushfstring(L, "\n\t%s:", ar.short_src);
+ if (ar.currentline > 0)
+ lua_pushfstring(L, "%d:", ar.currentline);
+ lua_pushliteral(L, " in ");
+ pushfuncname(L, &ar);
+ if (ar.istailcall)
+ lua_pushliteral(L, "\n\t(...tail calls...)");
+ lua_concat(L, lua_gettop(L) - top);
+ }
+ }
+ lua_concat(L, lua_gettop(L) - top);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Error-report functions
+** =======================================================
+*/
+
+LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) {
+ lua_Debug ar;
+ if (!lua_getstack(L, 0, &ar)) /* no stack frame? */
+ return luaL_error(L, "bad argument #%d (%s)", arg, extramsg);
+ lua_getinfo(L, "n", &ar);
+ if (strcmp(ar.namewhat, "method") == 0) {
+ arg--; /* do not count 'self' */
+ if (arg == 0) /* error is in the self argument itself? */
+ return luaL_error(L, "calling '%s' on bad self (%s)",
+ ar.name, extramsg);
+ }
+ if (ar.name == NULL)
+ ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?";
+ return luaL_error(L, "bad argument #%d to '%s' (%s)",
+ arg, ar.name, extramsg);
+}
+
+
+static int typeerror (lua_State *L, int arg, const char *tname) {
+ const char *msg;
+ const char *typearg; /* name for the type of the actual argument */
+ if (luaL_getmetafield(L, arg, "__name") == LUA_TSTRING)
+ typearg = lua_tostring(L, -1); /* use the given type name */
+ else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA)
+ typearg = "light userdata"; /* special name for messages */
+ else
+ typearg = luaL_typename(L, arg); /* standard name */
+ msg = lua_pushfstring(L, "%s expected, got %s", tname, typearg);
+ return luaL_argerror(L, arg, msg);
+}
+
+
+static void tag_error (lua_State *L, int arg, int tag) {
+ typeerror(L, arg, lua_typename(L, tag));
+}
+
+
+/*
+** The use of 'lua_pushfstring' ensures this function does not
+** need reserved stack space when called.
+*/
+LUALIB_API void luaL_where (lua_State *L, int level) {
+ lua_Debug ar;
+ if (lua_getstack(L, level, &ar)) { /* check function at level */
+ lua_getinfo(L, "Sl", &ar); /* get info about it */
+ if (ar.currentline > 0) { /* is there info? */
+ lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline);
+ return;
+ }
+ }
+ lua_pushfstring(L, ""); /* else, no information available... */
+}
+
+
+/*
+** Again, the use of 'lua_pushvfstring' ensures this function does
+** not need reserved stack space when called. (At worst, it generates
+** an error with "stack overflow" instead of the given message.)
+*/
+LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
+ va_list argp;
+ va_start(argp, fmt);
+ luaL_where(L, 1);
+ lua_pushvfstring(L, fmt, argp);
+ va_end(argp);
+ lua_concat(L, 2);
+ return lua_error(L);
+}
+
+
+LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {
+ int en = errno; /* calls to Lua API may change this value */
+ if (stat) {
+ lua_pushboolean(L, 1);
+ return 1;
+ }
+ else {
+ lua_pushnil(L);
+ if (fname)
+ lua_pushfstring(L, "%s: %s", fname, strerror(en));
+ else
+ lua_pushstring(L, strerror(en));
+ lua_pushinteger(L, en);
+ return 3;
+ }
+}
+
+
+#if !defined(l_inspectstat) /* { */
+
+#if defined(LUA_USE_POSIX)
+
+#include <sys/wait.h>
+
+/*
+** use appropriate macros to interpret 'pclose' return status
+*/
+#define l_inspectstat(stat,what) \
+ if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \
+ else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; }
+
+#else
+
+#define l_inspectstat(stat,what) /* no op */
+
+#endif
+
+#endif /* } */
+
+
+LUALIB_API int luaL_execresult (lua_State *L, int stat) {
+ const char *what = "exit"; /* type of termination */
+ if (stat == -1) /* error? */
+ return luaL_fileresult(L, 0, NULL);
+ else {
+ l_inspectstat(stat, what); /* interpret result */
+ if (*what == 'e' && stat == 0) /* successful termination? */
+ lua_pushboolean(L, 1);
+ else
+ lua_pushnil(L);
+ lua_pushstring(L, what);
+ lua_pushinteger(L, stat);
+ return 3; /* return true/nil,what,code */
+ }
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Userdata's metatable manipulation
+** =======================================================
+*/
+
+LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
+ if (luaL_getmetatable(L, tname) != LUA_TNIL) /* name already in use? */
+ return 0; /* leave previous value on top, but return 0 */
+ lua_pop(L, 1);
+ lua_createtable(L, 0, 2); /* create metatable */
+ lua_pushstring(L, tname);
+ lua_setfield(L, -2, "__name"); /* metatable.__name = tname */
+ lua_pushvalue(L, -1);
+ lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */
+ return 1;
+}
+
+
+LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) {
+ luaL_getmetatable(L, tname);
+ lua_setmetatable(L, -2);
+}
+
+
+LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) {
+ void *p = lua_touserdata(L, ud);
+ if (p != NULL) { /* value is a userdata? */
+ if (lua_getmetatable(L, ud)) { /* does it have a metatable? */
+ luaL_getmetatable(L, tname); /* get correct metatable */
+ if (!lua_rawequal(L, -1, -2)) /* not the same? */
+ p = NULL; /* value is a userdata with wrong metatable */
+ lua_pop(L, 2); /* remove both metatables */
+ return p;
+ }
+ }
+ return NULL; /* value is not a userdata with a metatable */
+}
+
+
+LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {
+ void *p = luaL_testudata(L, ud, tname);
+ if (p == NULL) typeerror(L, ud, tname);
+ return p;
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Argument check functions
+** =======================================================
+*/
+
+LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def,
+ const char *const lst[]) {
+ const char *name = (def) ? luaL_optstring(L, arg, def) :
+ luaL_checkstring(L, arg);
+ int i;
+ for (i=0; lst[i]; i++)
+ if (strcmp(lst[i], name) == 0)
+ return i;
+ return luaL_argerror(L, arg,
+ lua_pushfstring(L, "invalid option '%s'", name));
+}
+
+
+/*
+** Ensures the stack has at least 'space' extra slots, raising an error
+** if it cannot fulfill the request. (The error handling needs a few
+** extra slots to format the error message. In case of an error without
+** this extra space, Lua will generate the same 'stack overflow' error,
+** but without 'msg'.)
+*/
+LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) {
+ if (!lua_checkstack(L, space)) {
+ if (msg)
+ luaL_error(L, "stack overflow (%s)", msg);
+ else
+ luaL_error(L, "stack overflow");
+ }
+}
+
+
+LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) {
+ if (lua_type(L, arg) != t)
+ tag_error(L, arg, t);
+}
+
+
+LUALIB_API void luaL_checkany (lua_State *L, int arg) {
+ if (lua_type(L, arg) == LUA_TNONE)
+ luaL_argerror(L, arg, "value expected");
+}
+
+
+LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) {
+ const char *s = lua_tolstring(L, arg, len);
+ if (!s) tag_error(L, arg, LUA_TSTRING);
+ return s;
+}
+
+
+LUALIB_API const char *luaL_optlstring (lua_State *L, int arg,
+ const char *def, size_t *len) {
+ if (lua_isnoneornil(L, arg)) {
+ if (len)
+ *len = (def ? strlen(def) : 0);
+ return def;
+ }
+ else return luaL_checklstring(L, arg, len);
+}
+
+
+LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) {
+ int isnum;
+ lua_Number d = lua_tonumberx(L, arg, &isnum);
+ if (!isnum)
+ tag_error(L, arg, LUA_TNUMBER);
+ return d;
+}
+
+
+LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) {
+ return luaL_opt(L, luaL_checknumber, arg, def);
+}
+
+
+static void interror (lua_State *L, int arg) {
+ if (lua_isnumber(L, arg))
+ luaL_argerror(L, arg, "number has no integer representation");
+ else
+ tag_error(L, arg, LUA_TNUMBER);
+}
+
+
+LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) {
+ int isnum;
+ lua_Integer d = lua_tointegerx(L, arg, &isnum);
+ if (!isnum) {
+ interror(L, arg);
+ }
+ return d;
+}
+
+
+LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg,
+ lua_Integer def) {
+ return luaL_opt(L, luaL_checkinteger, arg, def);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Generic Buffer manipulation
+** =======================================================
+*/
+
+/* userdata to box arbitrary data */
+typedef struct UBox {
+ void *box;
+ size_t bsize;
+} UBox;
+
+
+static void *resizebox (lua_State *L, int idx, size_t newsize) {
+ void *ud;
+ lua_Alloc allocf = lua_getallocf(L, &ud);
+ UBox *box = (UBox *)lua_touserdata(L, idx);
+ void *temp = allocf(ud, box->box, box->bsize, newsize);
+ if (temp == NULL && newsize > 0) { /* allocation error? */
+ resizebox(L, idx, 0); /* free buffer */
+ luaL_error(L, "not enough memory for buffer allocation");
+ }
+ box->box = temp;
+ box->bsize = newsize;
+ return temp;
+}
+
+
+static int boxgc (lua_State *L) {
+ resizebox(L, 1, 0);
+ return 0;
+}
+
+
+static void *newbox (lua_State *L, size_t newsize) {
+ UBox *box = (UBox *)lua_newuserdata(L, sizeof(UBox));
+ box->box = NULL;
+ box->bsize = 0;
+ if (luaL_newmetatable(L, "LUABOX")) { /* creating metatable? */
+ lua_pushcfunction(L, boxgc);
+ lua_setfield(L, -2, "__gc"); /* metatable.__gc = boxgc */
+ }
+ lua_setmetatable(L, -2);
+ return resizebox(L, -1, newsize);
+}
+
+
+/*
+** check whether buffer is using a userdata on the stack as a temporary
+** buffer
+*/
+#define buffonstack(B) ((B)->b != (B)->initb)
+
+
+/*
+** returns a pointer to a free area with at least 'sz' bytes
+*/
+LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) {
+ lua_State *L = B->L;
+ if (B->size - B->n < sz) { /* not enough space? */
+ char *newbuff;
+ size_t newsize = B->size * 2; /* double buffer size */
+ if (newsize - B->n < sz) /* not big enough? */
+ newsize = B->n + sz;
+ if (newsize < B->n || newsize - B->n < sz)
+ luaL_error(L, "buffer too large");
+ /* create larger buffer */
+ if (buffonstack(B))
+ newbuff = (char *)resizebox(L, -1, newsize);
+ else { /* no buffer yet */
+ newbuff = (char *)newbox(L, newsize);
+ memcpy(newbuff, B->b, B->n * sizeof(char)); /* copy original content */
+ }
+ B->b = newbuff;
+ B->size = newsize;
+ }
+ return &B->b[B->n];
+}
+
+
+LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
+ if (l > 0) { /* avoid 'memcpy' when 's' can be NULL */
+ char *b = luaL_prepbuffsize(B, l);
+ memcpy(b, s, l * sizeof(char));
+ luaL_addsize(B, l);
+ }
+}
+
+
+LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {
+ luaL_addlstring(B, s, strlen(s));
+}
+
+
+LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
+ lua_State *L = B->L;
+ lua_pushlstring(L, B->b, B->n);
+ if (buffonstack(B)) {
+ resizebox(L, -2, 0); /* delete old buffer */
+ lua_remove(L, -2); /* remove its header from the stack */
+ }
+}
+
+
+LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) {
+ luaL_addsize(B, sz);
+ luaL_pushresult(B);
+}
+
+
+LUALIB_API void luaL_addvalue (luaL_Buffer *B) {
+ lua_State *L = B->L;
+ size_t l;
+ const char *s = lua_tolstring(L, -1, &l);
+ if (buffonstack(B))
+ lua_insert(L, -2); /* put value below buffer */
+ luaL_addlstring(B, s, l);
+ lua_remove(L, (buffonstack(B)) ? -2 : -1); /* remove value */
+}
+
+
+LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {
+ B->L = L;
+ B->b = B->initb;
+ B->n = 0;
+ B->size = LUAL_BUFFERSIZE;
+}
+
+
+LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) {
+ luaL_buffinit(L, B);
+ return luaL_prepbuffsize(B, sz);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Reference system
+** =======================================================
+*/
+
+/* index of free-list header */
+#define freelist 0
+
+
+LUALIB_API int luaL_ref (lua_State *L, int t) {
+ int ref;
+ if (lua_isnil(L, -1)) {
+ lua_pop(L, 1); /* remove from stack */
+ return LUA_REFNIL; /* 'nil' has a unique fixed reference */
+ }
+ t = lua_absindex(L, t);
+ lua_rawgeti(L, t, freelist); /* get first free element */
+ ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */
+ lua_pop(L, 1); /* remove it from stack */
+ if (ref != 0) { /* any free element? */
+ lua_rawgeti(L, t, ref); /* remove it from list */
+ lua_rawseti(L, t, freelist); /* (t[freelist] = t[ref]) */
+ }
+ else /* no free elements */
+ ref = (int)lua_rawlen(L, t) + 1; /* get a new reference */
+ lua_rawseti(L, t, ref);
+ return ref;
+}
+
+
+LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
+ if (ref >= 0) {
+ t = lua_absindex(L, t);
+ lua_rawgeti(L, t, freelist);
+ lua_rawseti(L, t, ref); /* t[ref] = t[freelist] */
+ lua_pushinteger(L, ref);
+ lua_rawseti(L, t, freelist); /* t[freelist] = ref */
+ }
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Load functions
+** =======================================================
+*/
+
+typedef struct LoadF {
+ int n; /* number of pre-read characters */
+ FILE *f; /* file being read */
+ char buff[BUFSIZ]; /* area for reading file */
+} LoadF;
+
+
+static const char *getF (lua_State *L, void *ud, size_t *size) {
+ LoadF *lf = (LoadF *)ud;
+ (void)L; /* not used */
+ if (lf->n > 0) { /* are there pre-read characters to be read? */
+ *size = lf->n; /* return them (chars already in buffer) */
+ lf->n = 0; /* no more pre-read characters */
+ }
+ else { /* read a block from file */
+ /* 'fread' can return > 0 *and* set the EOF flag. If next call to
+ 'getF' called 'fread', it might still wait for user input.
+ The next check avoids this problem. */
+ if (feof(lf->f)) return NULL;
+ *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); /* read block */
+ }
+ return lf->buff;
+}
+
+
+static int errfile (lua_State *L, const char *what, int fnameindex) {
+ const char *serr = strerror(errno);
+ const char *filename = lua_tostring(L, fnameindex) + 1;
+ lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);
+ lua_remove(L, fnameindex);
+ return LUA_ERRFILE;
+}
+
+
+static int skipBOM (LoadF *lf) {
+ const char *p = "\xEF\xBB\xBF"; /* UTF-8 BOM mark */
+ int c;
+ lf->n = 0;
+ do {
+ c = getc(lf->f);
+ if (c == EOF || c != *(const unsigned char *)p++) return c;
+ lf->buff[lf->n++] = c; /* to be read by the parser */
+ } while (*p != '\0');
+ lf->n = 0; /* prefix matched; discard it */
+ return getc(lf->f); /* return next character */
+}
+
+
+/*
+** reads the first character of file 'f' and skips an optional BOM mark
+** in its beginning plus its first line if it starts with '#'. Returns
+** true if it skipped the first line. In any case, '*cp' has the
+** first "valid" character of the file (after the optional BOM and
+** a first-line comment).
+*/
+static int skipcomment (LoadF *lf, int *cp) {
+ int c = *cp = skipBOM(lf);
+ if (c == '#') { /* first line is a comment (Unix exec. file)? */
+ do { /* skip first line */
+ c = getc(lf->f);
+ } while (c != EOF && c != '\n');
+ *cp = getc(lf->f); /* skip end-of-line, if present */
+ return 1; /* there was a comment */
+ }
+ else return 0; /* no comment */
+}
+
+
+LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,
+ const char *mode) {
+ LoadF lf;
+ int status, readstatus;
+ int c;
+ int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */
+ if (filename == NULL) {
+ lua_pushliteral(L, "=stdin");
+ lf.f = stdin;
+ }
+ else {
+ lua_pushfstring(L, "@%s", filename);
+ lf.f = fopen(filename, "r");
+ if (lf.f == NULL) return errfile(L, "open", fnameindex);
+ }
+ if (skipcomment(&lf, &c)) /* read initial portion */
+ lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */
+ if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */
+ lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
+ if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
+ skipcomment(&lf, &c); /* re-read initial portion */
+ }
+ if (c != EOF)
+ lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */
+ status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode);
+ readstatus = ferror(lf.f);
+ if (filename) fclose(lf.f); /* close file (even in case of errors) */
+ if (readstatus) {
+ lua_settop(L, fnameindex); /* ignore results from 'lua_load' */
+ return errfile(L, "read", fnameindex);
+ }
+ lua_remove(L, fnameindex);
+ return status;
+}
+
+
+typedef struct LoadS {
+ const char *s;
+ size_t size;
+} LoadS;
+
+
+static const char *getS (lua_State *L, void *ud, size_t *size) {
+ LoadS *ls = (LoadS *)ud;
+ (void)L; /* not used */
+ if (ls->size == 0) return NULL;
+ *size = ls->size;
+ ls->size = 0;
+ return ls->s;
+}
+
+
+LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size,
+ const char *name, const char *mode) {
+ LoadS ls;
+ ls.s = buff;
+ ls.size = size;
+ return lua_load(L, getS, &ls, name, mode);
+}
+
+
+LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {
+ return luaL_loadbuffer(L, s, strlen(s), s);
+}
+
+/* }====================================================== */
+
+
+
+LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {
+ if (!lua_getmetatable(L, obj)) /* no metatable? */
+ return LUA_TNIL;
+ else {
+ int tt;
+ lua_pushstring(L, event);
+ tt = lua_rawget(L, -2);
+ if (tt == LUA_TNIL) /* is metafield nil? */
+ lua_pop(L, 2); /* remove metatable and metafield */
+ else
+ lua_remove(L, -2); /* remove only metatable */
+ return tt; /* return metafield type */
+ }
+}
+
+
+LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
+ obj = lua_absindex(L, obj);
+ if (luaL_getmetafield(L, obj, event) == LUA_TNIL) /* no metafield? */
+ return 0;
+ lua_pushvalue(L, obj);
+ lua_call(L, 1, 1);
+ return 1;
+}
+
+
+LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) {
+ lua_Integer l;
+ int isnum;
+ lua_len(L, idx);
+ l = lua_tointegerx(L, -1, &isnum);
+ if (!isnum)
+ luaL_error(L, "object length is not an integer");
+ lua_pop(L, 1); /* remove object */
+ return l;
+}
+
+
+LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {
+ if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */
+ switch (lua_type(L, idx)) {
+ case LUA_TNUMBER: {
+ if (lua_isinteger(L, idx))
+ lua_pushfstring(L, "%I", lua_tointeger(L, idx));
+ else
+ lua_pushfstring(L, "%f", lua_tonumber(L, idx));
+ break;
+ }
+ case LUA_TSTRING:
+ lua_pushvalue(L, idx);
+ break;
+ case LUA_TBOOLEAN:
+ lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false"));
+ break;
+ case LUA_TNIL:
+ lua_pushliteral(L, "nil");
+ break;
+ default:
+ lua_pushfstring(L, "%s: %p", luaL_typename(L, idx),
+ lua_topointer(L, idx));
+ break;
+ }
+ }
+ return lua_tolstring(L, -1, len);
+}
+
+
+/*
+** {======================================================
+** Compatibility with 5.1 module functions
+** =======================================================
+*/
+#if defined(LUA_COMPAT_MODULE)
+
+static const char *luaL_findtable (lua_State *L, int idx,
+ const char *fname, int szhint) {
+ const char *e;
+ if (idx) lua_pushvalue(L, idx);
+ do {
+ e = strchr(fname, '.');
+ if (e == NULL) e = fname + strlen(fname);
+ lua_pushlstring(L, fname, e - fname);
+ if (lua_rawget(L, -2) == LUA_TNIL) { /* no such field? */
+ lua_pop(L, 1); /* remove this nil */
+ lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */
+ lua_pushlstring(L, fname, e - fname);
+ lua_pushvalue(L, -2);
+ lua_settable(L, -4); /* set new table into field */
+ }
+ else if (!lua_istable(L, -1)) { /* field has a non-table value? */
+ lua_pop(L, 2); /* remove table and value */
+ return fname; /* return problematic part of the name */
+ }
+ lua_remove(L, -2); /* remove previous table */
+ fname = e + 1;
+ } while (*e == '.');
+ return NULL;
+}
+
+
+/*
+** Count number of elements in a luaL_Reg list.
+*/
+static int libsize (const luaL_Reg *l) {
+ int size = 0;
+ for (; l && l->name; l++) size++;
+ return size;
+}
+
+
+/*
+** Find or create a module table with a given name. The function
+** first looks at the _LOADED table and, if that fails, try a
+** global variable with that name. In any case, leaves on the stack
+** the module table.
+*/
+LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname,
+ int sizehint) {
+ luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */
+ if (lua_getfield(L, -1, modname) != LUA_TTABLE) { /* no _LOADED[modname]? */
+ lua_pop(L, 1); /* remove previous result */
+ /* try global variable (and create one if it does not exist) */
+ lua_pushglobaltable(L);
+ if (luaL_findtable(L, 0, modname, sizehint) != NULL)
+ luaL_error(L, "name conflict for module '%s'", modname);
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -3, modname); /* _LOADED[modname] = new table */
+ }
+ lua_remove(L, -2); /* remove _LOADED table */
+}
+
+
+LUALIB_API void luaL_openlib (lua_State *L, const char *libname,
+ const luaL_Reg *l, int nup) {
+ luaL_checkversion(L);
+ if (libname) {
+ luaL_pushmodule(L, libname, libsize(l)); /* get/create library table */
+ lua_insert(L, -(nup + 1)); /* move library table to below upvalues */
+ }
+ if (l)
+ luaL_setfuncs(L, l, nup);
+ else
+ lua_pop(L, nup); /* remove upvalues */
+}
+
+#endif
+/* }====================================================== */
+
+/*
+** set functions from list 'l' into table at top - 'nup'; each
+** function gets the 'nup' elements at the top as upvalues.
+** Returns with only the table at the stack.
+*/
+LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
+ luaL_checkstack(L, nup, "too many upvalues");
+ for (; l->name != NULL; l++) { /* fill the table with given functions */
+ int i;
+ for (i = 0; i < nup; i++) /* copy upvalues to the top */
+ lua_pushvalue(L, -nup);
+ lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */
+ lua_setfield(L, -(nup + 2), l->name);
+ }
+ lua_pop(L, nup); /* remove upvalues */
+}
+
+
+/*
+** ensure that stack[idx][fname] has a table and push that table
+** into the stack
+*/
+LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) {
+ if (lua_getfield(L, idx, fname) == LUA_TTABLE)
+ return 1; /* table already there */
+ else {
+ lua_pop(L, 1); /* remove previous result */
+ idx = lua_absindex(L, idx);
+ lua_newtable(L);
+ lua_pushvalue(L, -1); /* copy to be left at top */
+ lua_setfield(L, idx, fname); /* assign new table to field */
+ return 0; /* false, because did not find table there */
+ }
+}
+
+
+/*
+** Stripped-down 'require': After checking "loaded" table, calls 'openf'
+** to open a module, registers the result in 'package.loaded' table and,
+** if 'glb' is true, also registers the result in the global table.
+** Leaves resulting module on the top.
+*/
+LUALIB_API void luaL_requiref (lua_State *L, const char *modname,
+ lua_CFunction openf, int glb) {
+ luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED");
+ lua_getfield(L, -1, modname); /* _LOADED[modname] */
+ if (!lua_toboolean(L, -1)) { /* package not already loaded? */
+ lua_pop(L, 1); /* remove field */
+ lua_pushcfunction(L, openf);
+ lua_pushstring(L, modname); /* argument to open function */
+ lua_call(L, 1, 1); /* call 'openf' to open module */
+ lua_pushvalue(L, -1); /* make copy of module (call result) */
+ lua_setfield(L, -3, modname); /* _LOADED[modname] = module */
+ }
+ lua_remove(L, -2); /* remove _LOADED table */
+ if (glb) {
+ lua_pushvalue(L, -1); /* copy of module */
+ lua_setglobal(L, modname); /* _G[modname] = module */
+ }
+}
+
+
+LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,
+ const char *r) {
+ const char *wild;
+ size_t l = strlen(p);
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ while ((wild = strstr(s, p)) != NULL) {
+ luaL_addlstring(&b, s, wild - s); /* push prefix */
+ luaL_addstring(&b, r); /* push replacement in place of pattern */
+ s = wild + l; /* continue after 'p' */
+ }
+ luaL_addstring(&b, s); /* push last suffix */
+ luaL_pushresult(&b);
+ return lua_tostring(L, -1);
+}
+
+
+static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
+ (void)ud; (void)osize; /* not used */
+ if (nsize == 0) {
+ free(ptr);
+ return NULL;
+ }
+ else
+ return realloc(ptr, nsize);
+}
+
+
+static int panic (lua_State *L) {
+ lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n",
+ lua_tostring(L, -1));
+ return 0; /* return to Lua to abort */
+}
+
+
+LUALIB_API lua_State *luaL_newstate (void) {
+ lua_State *L = lua_newstate(l_alloc, NULL);
+ if (L) lua_atpanic(L, &panic);
+ return L;
+}
+
+
+LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {
+ const lua_Number *v = lua_version(L);
+ if (sz != LUAL_NUMSIZES) /* check numeric types */
+ luaL_error(L, "core and library have incompatible numeric types");
+ if (v != lua_version(NULL))
+ luaL_error(L, "multiple Lua VMs detected");
+ else if (*v != ver)
+ luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f",
+ ver, *v);
+}
+
diff --git a/libs/lua/lua-5.3.3/lauxlib.h b/libs/lua/lua-5.3.3/lauxlib.h
new file mode 100644
index 0000000..ddb7c22
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lauxlib.h
@@ -0,0 +1,256 @@
+/*
+** $Id: lauxlib.h,v 1.129 2015/11/23 11:29:43 roberto Exp $
+** Auxiliary functions for building Lua libraries
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lauxlib_h
+#define lauxlib_h
+
+
+#include <stddef.h>
+#include <stdio.h>
+
+#include "lua.h"
+
+
+
+/* extra error code for 'luaL_load' */
+#define LUA_ERRFILE (LUA_ERRERR+1)
+
+
+typedef struct luaL_Reg {
+ const char *name;
+ lua_CFunction func;
+} luaL_Reg;
+
+
+#define LUAL_NUMSIZES (sizeof(lua_Integer)*16 + sizeof(lua_Number))
+
+LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz);
+#define luaL_checkversion(L) \
+ luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES)
+
+LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
+LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
+LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len);
+LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg);
+LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg,
+ size_t *l);
+LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg,
+ const char *def, size_t *l);
+LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg);
+LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def);
+
+LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg);
+LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg,
+ lua_Integer def);
+
+LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
+LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t);
+LUALIB_API void (luaL_checkany) (lua_State *L, int arg);
+
+LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname);
+LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname);
+LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);
+LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
+
+LUALIB_API void (luaL_where) (lua_State *L, int lvl);
+LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
+
+LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def,
+ const char *const lst[]);
+
+LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);
+LUALIB_API int (luaL_execresult) (lua_State *L, int stat);
+
+/* predefined references */
+#define LUA_NOREF (-2)
+#define LUA_REFNIL (-1)
+
+LUALIB_API int (luaL_ref) (lua_State *L, int t);
+LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
+
+LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,
+ const char *mode);
+
+#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL)
+
+LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,
+ const char *name, const char *mode);
+LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
+
+LUALIB_API lua_State *(luaL_newstate) (void);
+
+LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);
+
+LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
+ const char *r);
+
+LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
+
+LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname);
+
+LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1,
+ const char *msg, int level);
+
+LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
+ lua_CFunction openf, int glb);
+
+/*
+** ===============================================================
+** some useful macros
+** ===============================================================
+*/
+
+
+#define luaL_newlibtable(L,l) \
+ lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
+
+#define luaL_newlib(L,l) \
+ (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
+
+#define luaL_argcheck(L, cond,arg,extramsg) \
+ ((void)((cond) || luaL_argerror(L, (arg), (extramsg))))
+#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
+#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
+
+#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
+
+#define luaL_dofile(L, fn) \
+ (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
+
+#define luaL_dostring(L, s) \
+ (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
+
+#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n)))
+
+#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
+
+#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL)
+
+
+/*
+** {======================================================
+** Generic Buffer manipulation
+** =======================================================
+*/
+
+typedef struct luaL_Buffer {
+ char *b; /* buffer address */
+ size_t size; /* buffer size */
+ size_t n; /* number of characters in buffer */
+ lua_State *L;
+ char initb[LUAL_BUFFERSIZE]; /* initial buffer */
+} luaL_Buffer;
+
+
+#define luaL_addchar(B,c) \
+ ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \
+ ((B)->b[(B)->n++] = (c)))
+
+#define luaL_addsize(B,s) ((B)->n += (s))
+
+LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
+LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);
+LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
+LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
+LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
+LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
+LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz);
+LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);
+
+#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE)
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** File handles for IO library
+** =======================================================
+*/
+
+/*
+** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
+** initial structure 'luaL_Stream' (it may contain other fields
+** after that initial structure).
+*/
+
+#define LUA_FILEHANDLE "FILE*"
+
+
+typedef struct luaL_Stream {
+ FILE *f; /* stream (NULL for incompletely created streams) */
+ lua_CFunction closef; /* to close stream (NULL for closed streams) */
+} luaL_Stream;
+
+/* }====================================================== */
+
+
+
+/* compatibility with old module system */
+#if defined(LUA_COMPAT_MODULE)
+
+LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname,
+ int sizehint);
+LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,
+ const luaL_Reg *l, int nup);
+
+#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0))
+
+#endif
+
+
+/*
+** {==================================================================
+** "Abstraction Layer" for basic report of messages and errors
+** ===================================================================
+*/
+
+/* print a string */
+#if !defined(lua_writestring)
+#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout)
+#endif
+
+/* print a newline and flush the output */
+#if !defined(lua_writeline)
+#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout))
+#endif
+
+/* print an error message */
+#if !defined(lua_writestringerror)
+#define lua_writestringerror(s,p) \
+ (fprintf(stderr, (s), (p)), fflush(stderr))
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {============================================================
+** Compatibility with deprecated conversions
+** =============================================================
+*/
+#if defined(LUA_COMPAT_APIINTCASTS)
+
+#define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a))
+#define luaL_optunsigned(L,a,d) \
+ ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d)))
+
+#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
+#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
+
+#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
+#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
+
+#endif
+/* }============================================================ */
+
+
+
+#endif
+
+
diff --git a/libs/lua/lua-5.3.3/lbaselib.c b/libs/lua/lua-5.3.3/lbaselib.c
new file mode 100644
index 0000000..d481c4e
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lbaselib.c
@@ -0,0 +1,498 @@
+/*
+** $Id: lbaselib.c,v 1.313 2016/04/11 19:18:40 roberto Exp $
+** Basic library
+** See Copyright Notice in lua.h
+*/
+
+#define lbaselib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+static int luaB_print (lua_State *L) {
+ int n = lua_gettop(L); /* number of arguments */
+ int i;
+ lua_getglobal(L, "tostring");
+ for (i=1; i<=n; i++) {
+ const char *s;
+ size_t l;
+ lua_pushvalue(L, -1); /* function to be called */
+ lua_pushvalue(L, i); /* value to print */
+ lua_call(L, 1, 1);
+ s = lua_tolstring(L, -1, &l); /* get result */
+ if (s == NULL)
+ return luaL_error(L, "'tostring' must return a string to 'print'");
+ if (i>1) lua_writestring("\t", 1);
+ lua_writestring(s, l);
+ lua_pop(L, 1); /* pop result */
+ }
+ lua_writeline();
+ return 0;
+}
+
+
+#define SPACECHARS " \f\n\r\t\v"
+
+static const char *b_str2int (const char *s, int base, lua_Integer *pn) {
+ lua_Unsigned n = 0;
+ int neg = 0;
+ s += strspn(s, SPACECHARS); /* skip initial spaces */
+ if (*s == '-') { s++; neg = 1; } /* handle signal */
+ else if (*s == '+') s++;
+ if (!isalnum((unsigned char)*s)) /* no digit? */
+ return NULL;
+ do {
+ int digit = (isdigit((unsigned char)*s)) ? *s - '0'
+ : (toupper((unsigned char)*s) - 'A') + 10;
+ if (digit >= base) return NULL; /* invalid numeral */
+ n = n * base + digit;
+ s++;
+ } while (isalnum((unsigned char)*s));
+ s += strspn(s, SPACECHARS); /* skip trailing spaces */
+ *pn = (lua_Integer)((neg) ? (0u - n) : n);
+ return s;
+}
+
+
+static int luaB_tonumber (lua_State *L) {
+ if (lua_isnoneornil(L, 2)) { /* standard conversion? */
+ luaL_checkany(L, 1);
+ if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */
+ lua_settop(L, 1); /* yes; return it */
+ return 1;
+ }
+ else {
+ size_t l;
+ const char *s = lua_tolstring(L, 1, &l);
+ if (s != NULL && lua_stringtonumber(L, s) == l + 1)
+ return 1; /* successful conversion to number */
+ /* else not a number */
+ }
+ }
+ else {
+ size_t l;
+ const char *s;
+ lua_Integer n = 0; /* to avoid warnings */
+ lua_Integer base = luaL_checkinteger(L, 2);
+ luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */
+ s = lua_tolstring(L, 1, &l);
+ luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");
+ if (b_str2int(s, (int)base, &n) == s + l) {
+ lua_pushinteger(L, n);
+ return 1;
+ } /* else not a number */
+ } /* else not a number */
+ lua_pushnil(L); /* not a number */
+ return 1;
+}
+
+
+static int luaB_error (lua_State *L) {
+ int level = (int)luaL_optinteger(L, 2, 1);
+ lua_settop(L, 1);
+ if (lua_type(L, 1) == LUA_TSTRING && level > 0) {
+ luaL_where(L, level); /* add extra information */
+ lua_pushvalue(L, 1);
+ lua_concat(L, 2);
+ }
+ return lua_error(L);
+}
+
+
+static int luaB_getmetatable (lua_State *L) {
+ luaL_checkany(L, 1);
+ if (!lua_getmetatable(L, 1)) {
+ lua_pushnil(L);
+ return 1; /* no metatable */
+ }
+ luaL_getmetafield(L, 1, "__metatable");
+ return 1; /* returns either __metatable field (if present) or metatable */
+}
+
+
+static int luaB_setmetatable (lua_State *L) {
+ int t = lua_type(L, 2);
+ luaL_checktype(L, 1, LUA_TTABLE);
+ luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,
+ "nil or table expected");
+ if (luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL)
+ return luaL_error(L, "cannot change a protected metatable");
+ lua_settop(L, 2);
+ lua_setmetatable(L, 1);
+ return 1;
+}
+
+
+static int luaB_rawequal (lua_State *L) {
+ luaL_checkany(L, 1);
+ luaL_checkany(L, 2);
+ lua_pushboolean(L, lua_rawequal(L, 1, 2));
+ return 1;
+}
+
+
+static int luaB_rawlen (lua_State *L) {
+ int t = lua_type(L, 1);
+ luaL_argcheck(L, t == LUA_TTABLE || t == LUA_TSTRING, 1,
+ "table or string expected");
+ lua_pushinteger(L, lua_rawlen(L, 1));
+ return 1;
+}
+
+
+static int luaB_rawget (lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE);
+ luaL_checkany(L, 2);
+ lua_settop(L, 2);
+ lua_rawget(L, 1);
+ return 1;
+}
+
+static int luaB_rawset (lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE);
+ luaL_checkany(L, 2);
+ luaL_checkany(L, 3);
+ lua_settop(L, 3);
+ lua_rawset(L, 1);
+ return 1;
+}
+
+
+static int luaB_collectgarbage (lua_State *L) {
+ static const char *const opts[] = {"stop", "restart", "collect",
+ "count", "step", "setpause", "setstepmul",
+ "isrunning", NULL};
+ static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
+ LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,
+ LUA_GCISRUNNING};
+ int o = optsnum[luaL_checkoption(L, 1, "collect", opts)];
+ int ex = (int)luaL_optinteger(L, 2, 0);
+ int res = lua_gc(L, o, ex);
+ switch (o) {
+ case LUA_GCCOUNT: {
+ int b = lua_gc(L, LUA_GCCOUNTB, 0);
+ lua_pushnumber(L, (lua_Number)res + ((lua_Number)b/1024));
+ return 1;
+ }
+ case LUA_GCSTEP: case LUA_GCISRUNNING: {
+ lua_pushboolean(L, res);
+ return 1;
+ }
+ default: {
+ lua_pushinteger(L, res);
+ return 1;
+ }
+ }
+}
+
+
+static int luaB_type (lua_State *L) {
+ int t = lua_type(L, 1);
+ luaL_argcheck(L, t != LUA_TNONE, 1, "value expected");
+ lua_pushstring(L, lua_typename(L, t));
+ return 1;
+}
+
+
+static int pairsmeta (lua_State *L, const char *method, int iszero,
+ lua_CFunction iter) {
+ if (luaL_getmetafield(L, 1, method) == LUA_TNIL) { /* no metamethod? */
+ luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */
+ lua_pushcfunction(L, iter); /* will return generator, */
+ lua_pushvalue(L, 1); /* state, */
+ if (iszero) lua_pushinteger(L, 0); /* and initial value */
+ else lua_pushnil(L);
+ }
+ else {
+ lua_pushvalue(L, 1); /* argument 'self' to metamethod */
+ lua_call(L, 1, 3); /* get 3 values from metamethod */
+ }
+ return 3;
+}
+
+
+static int luaB_next (lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE);
+ lua_settop(L, 2); /* create a 2nd argument if there isn't one */
+ if (lua_next(L, 1))
+ return 2;
+ else {
+ lua_pushnil(L);
+ return 1;
+ }
+}
+
+
+static int luaB_pairs (lua_State *L) {
+ return pairsmeta(L, "__pairs", 0, luaB_next);
+}
+
+
+/*
+** Traversal function for 'ipairs'
+*/
+static int ipairsaux (lua_State *L) {
+ lua_Integer i = luaL_checkinteger(L, 2) + 1;
+ lua_pushinteger(L, i);
+ return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2;
+}
+
+
+/*
+** 'ipairs' function. Returns 'ipairsaux', given "table", 0.
+** (The given "table" may not be a table.)
+*/
+static int luaB_ipairs (lua_State *L) {
+#if defined(LUA_COMPAT_IPAIRS)
+ return pairsmeta(L, "__ipairs", 1, ipairsaux);
+#else
+ luaL_checkany(L, 1);
+ lua_pushcfunction(L, ipairsaux); /* iteration function */
+ lua_pushvalue(L, 1); /* state */
+ lua_pushinteger(L, 0); /* initial value */
+ return 3;
+#endif
+}
+
+
+static int load_aux (lua_State *L, int status, int envidx) {
+ if (status == LUA_OK) {
+ if (envidx != 0) { /* 'env' parameter? */
+ lua_pushvalue(L, envidx); /* environment for loaded function */
+ if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */
+ lua_pop(L, 1); /* remove 'env' if not used by previous call */
+ }
+ return 1;
+ }
+ else { /* error (message is on top of the stack) */
+ lua_pushnil(L);
+ lua_insert(L, -2); /* put before error message */
+ return 2; /* return nil plus error message */
+ }
+}
+
+
+static int luaB_loadfile (lua_State *L) {
+ const char *fname = luaL_optstring(L, 1, NULL);
+ const char *mode = luaL_optstring(L, 2, NULL);
+ int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */
+ int status = luaL_loadfilex(L, fname, mode);
+ return load_aux(L, status, env);
+}
+
+
+/*
+** {======================================================
+** Generic Read function
+** =======================================================
+*/
+
+
+/*
+** reserved slot, above all arguments, to hold a copy of the returned
+** string to avoid it being collected while parsed. 'load' has four
+** optional arguments (chunk, source name, mode, and environment).
+*/
+#define RESERVEDSLOT 5
+
+
+/*
+** Reader for generic 'load' function: 'lua_load' uses the
+** stack for internal stuff, so the reader cannot change the
+** stack top. Instead, it keeps its resulting string in a
+** reserved slot inside the stack.
+*/
+static const char *generic_reader (lua_State *L, void *ud, size_t *size) {
+ (void)(ud); /* not used */
+ luaL_checkstack(L, 2, "too many nested functions");
+ lua_pushvalue(L, 1); /* get function */
+ lua_call(L, 0, 1); /* call it */
+ if (lua_isnil(L, -1)) {
+ lua_pop(L, 1); /* pop result */
+ *size = 0;
+ return NULL;
+ }
+ else if (!lua_isstring(L, -1))
+ luaL_error(L, "reader function must return a string");
+ lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */
+ return lua_tolstring(L, RESERVEDSLOT, size);
+}
+
+
+static int luaB_load (lua_State *L) {
+ int status;
+ size_t l;
+ const char *s = lua_tolstring(L, 1, &l);
+ const char *mode = luaL_optstring(L, 3, "bt");
+ int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */
+ if (s != NULL) { /* loading a string? */
+ const char *chunkname = luaL_optstring(L, 2, s);
+ status = luaL_loadbufferx(L, s, l, chunkname, mode);
+ }
+ else { /* loading from a reader function */
+ const char *chunkname = luaL_optstring(L, 2, "=(load)");
+ luaL_checktype(L, 1, LUA_TFUNCTION);
+ lua_settop(L, RESERVEDSLOT); /* create reserved slot */
+ status = lua_load(L, generic_reader, NULL, chunkname, mode);
+ }
+ return load_aux(L, status, env);
+}
+
+/* }====================================================== */
+
+
+static int dofilecont (lua_State *L, int d1, lua_KContext d2) {
+ (void)d1; (void)d2; /* only to match 'lua_Kfunction' prototype */
+ return lua_gettop(L) - 1;
+}
+
+
+static int luaB_dofile (lua_State *L) {
+ const char *fname = luaL_optstring(L, 1, NULL);
+ lua_settop(L, 1);
+ if (luaL_loadfile(L, fname) != LUA_OK)
+ return lua_error(L);
+ lua_callk(L, 0, LUA_MULTRET, 0, dofilecont);
+ return dofilecont(L, 0, 0);
+}
+
+
+static int luaB_assert (lua_State *L) {
+ if (lua_toboolean(L, 1)) /* condition is true? */
+ return lua_gettop(L); /* return all arguments */
+ else { /* error */
+ luaL_checkany(L, 1); /* there must be a condition */
+ lua_remove(L, 1); /* remove it */
+ lua_pushliteral(L, "assertion failed!"); /* default message */
+ lua_settop(L, 1); /* leave only message (default if no other one) */
+ return luaB_error(L); /* call 'error' */
+ }
+}
+
+
+static int luaB_select (lua_State *L) {
+ int n = lua_gettop(L);
+ if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') {
+ lua_pushinteger(L, n-1);
+ return 1;
+ }
+ else {
+ lua_Integer i = luaL_checkinteger(L, 1);
+ if (i < 0) i = n + i;
+ else if (i > n) i = n;
+ luaL_argcheck(L, 1 <= i, 1, "index out of range");
+ return n - (int)i;
+ }
+}
+
+
+/*
+** Continuation function for 'pcall' and 'xpcall'. Both functions
+** already pushed a 'true' before doing the call, so in case of success
+** 'finishpcall' only has to return everything in the stack minus
+** 'extra' values (where 'extra' is exactly the number of items to be
+** ignored).
+*/
+static int finishpcall (lua_State *L, int status, lua_KContext extra) {
+ if (status != LUA_OK && status != LUA_YIELD) { /* error? */
+ lua_pushboolean(L, 0); /* first result (false) */
+ lua_pushvalue(L, -2); /* error message */
+ return 2; /* return false, msg */
+ }
+ else
+ return lua_gettop(L) - (int)extra; /* return all results */
+}
+
+
+static int luaB_pcall (lua_State *L) {
+ int status;
+ luaL_checkany(L, 1);
+ lua_pushboolean(L, 1); /* first result if no errors */
+ lua_insert(L, 1); /* put it in place */
+ status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall);
+ return finishpcall(L, status, 0);
+}
+
+
+/*
+** Do a protected call with error handling. After 'lua_rotate', the
+** stack will have <f, err, true, f, [args...]>; so, the function passes
+** 2 to 'finishpcall' to skip the 2 first values when returning results.
+*/
+static int luaB_xpcall (lua_State *L) {
+ int status;
+ int n = lua_gettop(L);
+ luaL_checktype(L, 2, LUA_TFUNCTION); /* check error function */
+ lua_pushboolean(L, 1); /* first result */
+ lua_pushvalue(L, 1); /* function */
+ lua_rotate(L, 3, 2); /* move them below function's arguments */
+ status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall);
+ return finishpcall(L, status, 2);
+}
+
+
+static int luaB_tostring (lua_State *L) {
+ luaL_checkany(L, 1);
+ luaL_tolstring(L, 1, NULL);
+ return 1;
+}
+
+
+static const luaL_Reg base_funcs[] = {
+ {"assert", luaB_assert},
+ {"collectgarbage", luaB_collectgarbage},
+ {"dofile", luaB_dofile},
+ {"error", luaB_error},
+ {"getmetatable", luaB_getmetatable},
+ {"ipairs", luaB_ipairs},
+ {"loadfile", luaB_loadfile},
+ {"load", luaB_load},
+#if defined(LUA_COMPAT_LOADSTRING)
+ {"loadstring", luaB_load},
+#endif
+ {"next", luaB_next},
+ {"pairs", luaB_pairs},
+ {"pcall", luaB_pcall},
+ {"print", luaB_print},
+ {"rawequal", luaB_rawequal},
+ {"rawlen", luaB_rawlen},
+ {"rawget", luaB_rawget},
+ {"rawset", luaB_rawset},
+ {"select", luaB_select},
+ {"setmetatable", luaB_setmetatable},
+ {"tonumber", luaB_tonumber},
+ {"tostring", luaB_tostring},
+ {"type", luaB_type},
+ {"xpcall", luaB_xpcall},
+ /* placeholders */
+ {"_G", NULL},
+ {"_VERSION", NULL},
+ {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_base (lua_State *L) {
+ /* open lib into global table */
+ lua_pushglobaltable(L);
+ luaL_setfuncs(L, base_funcs, 0);
+ /* set global _G */
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -2, "_G");
+ /* set global _VERSION */
+ lua_pushliteral(L, LUA_VERSION);
+ lua_setfield(L, -2, "_VERSION");
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lbitlib.c b/libs/lua/lua-5.3.3/lbitlib.c
new file mode 100644
index 0000000..1cb1d5b
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lbitlib.c
@@ -0,0 +1,233 @@
+/*
+** $Id: lbitlib.c,v 1.30 2015/11/11 19:08:09 roberto Exp $
+** Standard library for bitwise operations
+** See Copyright Notice in lua.h
+*/
+
+#define lbitlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+#if defined(LUA_COMPAT_BITLIB) /* { */
+
+
+#define pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n))
+#define checkunsigned(L,i) ((lua_Unsigned)luaL_checkinteger(L,i))
+
+
+/* number of bits to consider in a number */
+#if !defined(LUA_NBITS)
+#define LUA_NBITS 32
+#endif
+
+
+/*
+** a lua_Unsigned with its first LUA_NBITS bits equal to 1. (Shift must
+** be made in two parts to avoid problems when LUA_NBITS is equal to the
+** number of bits in a lua_Unsigned.)
+*/
+#define ALLONES (~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1))
+
+
+/* macro to trim extra bits */
+#define trim(x) ((x) & ALLONES)
+
+
+/* builds a number with 'n' ones (1 <= n <= LUA_NBITS) */
+#define mask(n) (~((ALLONES << 1) << ((n) - 1)))
+
+
+
+static lua_Unsigned andaux (lua_State *L) {
+ int i, n = lua_gettop(L);
+ lua_Unsigned r = ~(lua_Unsigned)0;
+ for (i = 1; i <= n; i++)
+ r &= checkunsigned(L, i);
+ return trim(r);
+}
+
+
+static int b_and (lua_State *L) {
+ lua_Unsigned r = andaux(L);
+ pushunsigned(L, r);
+ return 1;
+}
+
+
+static int b_test (lua_State *L) {
+ lua_Unsigned r = andaux(L);
+ lua_pushboolean(L, r != 0);
+ return 1;
+}
+
+
+static int b_or (lua_State *L) {
+ int i, n = lua_gettop(L);
+ lua_Unsigned r = 0;
+ for (i = 1; i <= n; i++)
+ r |= checkunsigned(L, i);
+ pushunsigned(L, trim(r));
+ return 1;
+}
+
+
+static int b_xor (lua_State *L) {
+ int i, n = lua_gettop(L);
+ lua_Unsigned r = 0;
+ for (i = 1; i <= n; i++)
+ r ^= checkunsigned(L, i);
+ pushunsigned(L, trim(r));
+ return 1;
+}
+
+
+static int b_not (lua_State *L) {
+ lua_Unsigned r = ~checkunsigned(L, 1);
+ pushunsigned(L, trim(r));
+ return 1;
+}
+
+
+static int b_shift (lua_State *L, lua_Unsigned r, lua_Integer i) {
+ if (i < 0) { /* shift right? */
+ i = -i;
+ r = trim(r);
+ if (i >= LUA_NBITS) r = 0;
+ else r >>= i;
+ }
+ else { /* shift left */
+ if (i >= LUA_NBITS) r = 0;
+ else r <<= i;
+ r = trim(r);
+ }
+ pushunsigned(L, r);
+ return 1;
+}
+
+
+static int b_lshift (lua_State *L) {
+ return b_shift(L, checkunsigned(L, 1), luaL_checkinteger(L, 2));
+}
+
+
+static int b_rshift (lua_State *L) {
+ return b_shift(L, checkunsigned(L, 1), -luaL_checkinteger(L, 2));
+}
+
+
+static int b_arshift (lua_State *L) {
+ lua_Unsigned r = checkunsigned(L, 1);
+ lua_Integer i = luaL_checkinteger(L, 2);
+ if (i < 0 || !(r & ((lua_Unsigned)1 << (LUA_NBITS - 1))))
+ return b_shift(L, r, -i);
+ else { /* arithmetic shift for 'negative' number */
+ if (i >= LUA_NBITS) r = ALLONES;
+ else
+ r = trim((r >> i) | ~(trim(~(lua_Unsigned)0) >> i)); /* add signal bit */
+ pushunsigned(L, r);
+ return 1;
+ }
+}
+
+
+static int b_rot (lua_State *L, lua_Integer d) {
+ lua_Unsigned r = checkunsigned(L, 1);
+ int i = d & (LUA_NBITS - 1); /* i = d % NBITS */
+ r = trim(r);
+ if (i != 0) /* avoid undefined shift of LUA_NBITS when i == 0 */
+ r = (r << i) | (r >> (LUA_NBITS - i));
+ pushunsigned(L, trim(r));
+ return 1;
+}
+
+
+static int b_lrot (lua_State *L) {
+ return b_rot(L, luaL_checkinteger(L, 2));
+}
+
+
+static int b_rrot (lua_State *L) {
+ return b_rot(L, -luaL_checkinteger(L, 2));
+}
+
+
+/*
+** get field and width arguments for field-manipulation functions,
+** checking whether they are valid.
+** ('luaL_error' called without 'return' to avoid later warnings about
+** 'width' being used uninitialized.)
+*/
+static int fieldargs (lua_State *L, int farg, int *width) {
+ lua_Integer f = luaL_checkinteger(L, farg);
+ lua_Integer w = luaL_optinteger(L, farg + 1, 1);
+ luaL_argcheck(L, 0 <= f, farg, "field cannot be negative");
+ luaL_argcheck(L, 0 < w, farg + 1, "width must be positive");
+ if (f + w > LUA_NBITS)
+ luaL_error(L, "trying to access non-existent bits");
+ *width = (int)w;
+ return (int)f;
+}
+
+
+static int b_extract (lua_State *L) {
+ int w;
+ lua_Unsigned r = trim(checkunsigned(L, 1));
+ int f = fieldargs(L, 2, &w);
+ r = (r >> f) & mask(w);
+ pushunsigned(L, r);
+ return 1;
+}
+
+
+static int b_replace (lua_State *L) {
+ int w;
+ lua_Unsigned r = trim(checkunsigned(L, 1));
+ lua_Unsigned v = trim(checkunsigned(L, 2));
+ int f = fieldargs(L, 3, &w);
+ lua_Unsigned m = mask(w);
+ r = (r & ~(m << f)) | ((v & m) << f);
+ pushunsigned(L, r);
+ return 1;
+}
+
+
+static const luaL_Reg bitlib[] = {
+ {"arshift", b_arshift},
+ {"band", b_and},
+ {"bnot", b_not},
+ {"bor", b_or},
+ {"bxor", b_xor},
+ {"btest", b_test},
+ {"extract", b_extract},
+ {"lrotate", b_lrot},
+ {"lshift", b_lshift},
+ {"replace", b_replace},
+ {"rrotate", b_rrot},
+ {"rshift", b_rshift},
+ {NULL, NULL}
+};
+
+
+
+LUAMOD_API int luaopen_bit32 (lua_State *L) {
+ luaL_newlib(L, bitlib);
+ return 1;
+}
+
+
+#else /* }{ */
+
+
+LUAMOD_API int luaopen_bit32 (lua_State *L) {
+ return luaL_error(L, "library 'bit32' has been deprecated");
+}
+
+#endif /* } */
diff --git a/libs/lua/lua-5.3.3/lcode.c b/libs/lua/lua-5.3.3/lcode.c
new file mode 100644
index 0000000..2cd0dd2
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lcode.c
@@ -0,0 +1,1199 @@
+/*
+** $Id: lcode.c,v 2.109 2016/05/13 19:09:21 roberto Exp $
+** Code generator for Lua
+** See Copyright Notice in lua.h
+*/
+
+#define lcode_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "lua.h"
+
+#include "lcode.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "llex.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "lvm.h"
+
+
+/* Maximum number of registers in a Lua function (must fit in 8 bits) */
+#define MAXREGS 255
+
+
+#define hasjumps(e) ((e)->t != (e)->f)
+
+
+/*
+** If expression is a numeric constant, fills 'v' with its value
+** and returns 1. Otherwise, returns 0.
+*/
+static int tonumeral(expdesc *e, TValue *v) {
+ if (hasjumps(e))
+ return 0; /* not a numeral */
+ switch (e->k) {
+ case VKINT:
+ if (v) setivalue(v, e->u.ival);
+ return 1;
+ case VKFLT:
+ if (v) setfltvalue(v, e->u.nval);
+ return 1;
+ default: return 0;
+ }
+}
+
+
+/*
+** Create a OP_LOADNIL instruction, but try to optimize: if the previous
+** instruction is also OP_LOADNIL and ranges are compatible, adjust
+** range of previous instruction instead of emitting a new one. (For
+** instance, 'local a; local b' will generate a single opcode.)
+*/
+void luaK_nil (FuncState *fs, int from, int n) {
+ Instruction *previous;
+ int l = from + n - 1; /* last register to set nil */
+ if (fs->pc > fs->lasttarget) { /* no jumps to current position? */
+ previous = &fs->f->code[fs->pc-1];
+ if (GET_OPCODE(*previous) == OP_LOADNIL) { /* previous is LOADNIL? */
+ int pfrom = GETARG_A(*previous); /* get previous range */
+ int pl = pfrom + GETARG_B(*previous);
+ if ((pfrom <= from && from <= pl + 1) ||
+ (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */
+ if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */
+ if (pl > l) l = pl; /* l = max(l, pl) */
+ SETARG_A(*previous, from);
+ SETARG_B(*previous, l - from);
+ return;
+ }
+ } /* else go through */
+ }
+ luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0); /* else no optimization */
+}
+
+
+/*
+** Gets the destination address of a jump instruction. Used to traverse
+** a list of jumps.
+*/
+static int getjump (FuncState *fs, int pc) {
+ int offset = GETARG_sBx(fs->f->code[pc]);
+ if (offset == NO_JUMP) /* point to itself represents end of list */
+ return NO_JUMP; /* end of list */
+ else
+ return (pc+1)+offset; /* turn offset into absolute position */
+}
+
+
+/*
+** Fix jump instruction at position 'pc' to jump to 'dest'.
+** (Jump addresses are relative in Lua)
+*/
+static void fixjump (FuncState *fs, int pc, int dest) {
+ Instruction *jmp = &fs->f->code[pc];
+ int offset = dest - (pc + 1);
+ lua_assert(dest != NO_JUMP);
+ if (abs(offset) > MAXARG_sBx)
+ luaX_syntaxerror(fs->ls, "control structure too long");
+ SETARG_sBx(*jmp, offset);
+}
+
+
+/*
+** Concatenate jump-list 'l2' into jump-list 'l1'
+*/
+void luaK_concat (FuncState *fs, int *l1, int l2) {
+ if (l2 == NO_JUMP) return; /* nothing to concatenate? */
+ else if (*l1 == NO_JUMP) /* no original list? */
+ *l1 = l2; /* 'l1' points to 'l2' */
+ else {
+ int list = *l1;
+ int next;
+ while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */
+ list = next;
+ fixjump(fs, list, l2); /* last element links to 'l2' */
+ }
+}
+
+
+/*
+** Create a jump instruction and return its position, so its destination
+** can be fixed later (with 'fixjump'). If there are jumps to
+** this position (kept in 'jpc'), link them all together so that
+** 'patchlistaux' will fix all them directly to the final destination.
+*/
+int luaK_jump (FuncState *fs) {
+ int jpc = fs->jpc; /* save list of jumps to here */
+ int j;
+ fs->jpc = NO_JUMP; /* no more jumps to here */
+ j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP);
+ luaK_concat(fs, &j, jpc); /* keep them on hold */
+ return j;
+}
+
+
+/*
+** Code a 'return' instruction
+*/
+void luaK_ret (FuncState *fs, int first, int nret) {
+ luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);
+}
+
+
+/*
+** Code a "conditional jump", that is, a test or comparison opcode
+** followed by a jump. Return jump position.
+*/
+static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
+ luaK_codeABC(fs, op, A, B, C);
+ return luaK_jump(fs);
+}
+
+
+/*
+** returns current 'pc' and marks it as a jump target (to avoid wrong
+** optimizations with consecutive instructions not in the same basic block).
+*/
+int luaK_getlabel (FuncState *fs) {
+ fs->lasttarget = fs->pc;
+ return fs->pc;
+}
+
+
+/*
+** Returns the position of the instruction "controlling" a given
+** jump (that is, its condition), or the jump itself if it is
+** unconditional.
+*/
+static Instruction *getjumpcontrol (FuncState *fs, int pc) {
+ Instruction *pi = &fs->f->code[pc];
+ if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))
+ return pi-1;
+ else
+ return pi;
+}
+
+
+/*
+** Patch destination register for a TESTSET instruction.
+** If instruction in position 'node' is not a TESTSET, return 0 ("fails").
+** Otherwise, if 'reg' is not 'NO_REG', set it as the destination
+** register. Otherwise, change instruction to a simple 'TEST' (produces
+** no register value)
+*/
+static int patchtestreg (FuncState *fs, int node, int reg) {
+ Instruction *i = getjumpcontrol(fs, node);
+ if (GET_OPCODE(*i) != OP_TESTSET)
+ return 0; /* cannot patch other instructions */
+ if (reg != NO_REG && reg != GETARG_B(*i))
+ SETARG_A(*i, reg);
+ else {
+ /* no register to put value or register already has the value;
+ change instruction to simple test */
+ *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i));
+ }
+ return 1;
+}
+
+
+/*
+** Traverse a list of tests ensuring no one produces a value
+*/
+static void removevalues (FuncState *fs, int list) {
+ for (; list != NO_JUMP; list = getjump(fs, list))
+ patchtestreg(fs, list, NO_REG);
+}
+
+
+/*
+** Traverse a list of tests, patching their destination address and
+** registers: tests producing values jump to 'vtarget' (and put their
+** values in 'reg'), other tests jump to 'dtarget'.
+*/
+static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
+ int dtarget) {
+ while (list != NO_JUMP) {
+ int next = getjump(fs, list);
+ if (patchtestreg(fs, list, reg))
+ fixjump(fs, list, vtarget);
+ else
+ fixjump(fs, list, dtarget); /* jump to default target */
+ list = next;
+ }
+}
+
+
+/*
+** Ensure all pending jumps to current position are fixed (jumping
+** to current position with no values) and reset list of pending
+** jumps
+*/
+static void dischargejpc (FuncState *fs) {
+ patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc);
+ fs->jpc = NO_JUMP;
+}
+
+
+/*
+** Add elements in 'list' to list of pending jumps to "here"
+** (current position)
+*/
+void luaK_patchtohere (FuncState *fs, int list) {
+ luaK_getlabel(fs); /* mark "here" as a jump target */
+ luaK_concat(fs, &fs->jpc, list);
+}
+
+
+/*
+** Path all jumps in 'list' to jump to 'target'.
+** (The assert means that we cannot fix a jump to a forward address
+** because we only know addresses once code is generated.)
+*/
+void luaK_patchlist (FuncState *fs, int list, int target) {
+ if (target == fs->pc) /* 'target' is current position? */
+ luaK_patchtohere(fs, list); /* add list to pending jumps */
+ else {
+ lua_assert(target < fs->pc);
+ patchlistaux(fs, list, target, NO_REG, target);
+ }
+}
+
+
+/*
+** Path all jumps in 'list' to close upvalues up to given 'level'
+** (The assertion checks that jumps either were closing nothing
+** or were closing higher levels, from inner blocks.)
+*/
+void luaK_patchclose (FuncState *fs, int list, int level) {
+ level++; /* argument is +1 to reserve 0 as non-op */
+ for (; list != NO_JUMP; list = getjump(fs, list)) {
+ lua_assert(GET_OPCODE(fs->f->code[list]) == OP_JMP &&
+ (GETARG_A(fs->f->code[list]) == 0 ||
+ GETARG_A(fs->f->code[list]) >= level));
+ SETARG_A(fs->f->code[list], level);
+ }
+}
+
+
+/*
+** Emit instruction 'i', checking for array sizes and saving also its
+** line information. Return 'i' position.
+*/
+static int luaK_code (FuncState *fs, Instruction i) {
+ Proto *f = fs->f;
+ dischargejpc(fs); /* 'pc' will change */
+ /* put new instruction in code array */
+ luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction,
+ MAX_INT, "opcodes");
+ f->code[fs->pc] = i;
+ /* save corresponding line information */
+ luaM_growvector(fs->ls->L, f->lineinfo, fs->pc, f->sizelineinfo, int,
+ MAX_INT, "opcodes");
+ f->lineinfo[fs->pc] = fs->ls->lastline;
+ return fs->pc++;
+}
+
+
+/*
+** Format and emit an 'iABC' instruction. (Assertions check consistency
+** of parameters versus opcode.)
+*/
+int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
+ lua_assert(getOpMode(o) == iABC);
+ lua_assert(getBMode(o) != OpArgN || b == 0);
+ lua_assert(getCMode(o) != OpArgN || c == 0);
+ lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C);
+ return luaK_code(fs, CREATE_ABC(o, a, b, c));
+}
+
+
+/*
+** Format and emit an 'iABx' instruction.
+*/
+int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
+ lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx);
+ lua_assert(getCMode(o) == OpArgN);
+ lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx);
+ return luaK_code(fs, CREATE_ABx(o, a, bc));
+}
+
+
+/*
+** Emit an "extra argument" instruction (format 'iAx')
+*/
+static int codeextraarg (FuncState *fs, int a) {
+ lua_assert(a <= MAXARG_Ax);
+ return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a));
+}
+
+
+/*
+** Emit a "load constant" instruction, using either 'OP_LOADK'
+** (if constant index 'k' fits in 18 bits) or an 'OP_LOADKX'
+** instruction with "extra argument".
+*/
+int luaK_codek (FuncState *fs, int reg, int k) {
+ if (k <= MAXARG_Bx)
+ return luaK_codeABx(fs, OP_LOADK, reg, k);
+ else {
+ int p = luaK_codeABx(fs, OP_LOADKX, reg, 0);
+ codeextraarg(fs, k);
+ return p;
+ }
+}
+
+
+/*
+** Check register-stack level, keeping track of its maximum size
+** in field 'maxstacksize'
+*/
+void luaK_checkstack (FuncState *fs, int n) {
+ int newstack = fs->freereg + n;
+ if (newstack > fs->f->maxstacksize) {
+ if (newstack >= MAXREGS)
+ luaX_syntaxerror(fs->ls,
+ "function or expression needs too many registers");
+ fs->f->maxstacksize = cast_byte(newstack);
+ }
+}
+
+
+/*
+** Reserve 'n' registers in register stack
+*/
+void luaK_reserveregs (FuncState *fs, int n) {
+ luaK_checkstack(fs, n);
+ fs->freereg += n;
+}
+
+
+/*
+** Free register 'reg', if it is neither a constant index nor
+** a local variable.
+)
+*/
+static void freereg (FuncState *fs, int reg) {
+ if (!ISK(reg) && reg >= fs->nactvar) {
+ fs->freereg--;
+ lua_assert(reg == fs->freereg);
+ }
+}
+
+
+/*
+** Free register used by expression 'e' (if any)
+*/
+static void freeexp (FuncState *fs, expdesc *e) {
+ if (e->k == VNONRELOC)
+ freereg(fs, e->u.info);
+}
+
+
+/*
+** Free registers used by expressions 'e1' and 'e2' (if any) in proper
+** order.
+*/
+static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) {
+ int r1 = (e1->k == VNONRELOC) ? e1->u.info : -1;
+ int r2 = (e2->k == VNONRELOC) ? e2->u.info : -1;
+ if (r1 > r2) {
+ freereg(fs, r1);
+ freereg(fs, r2);
+ }
+ else {
+ freereg(fs, r2);
+ freereg(fs, r1);
+ }
+}
+
+
+/*
+** Add constant 'v' to prototype's list of constants (field 'k').
+** Use scanner's table to cache position of constants in constant list
+** and try to reuse constants. Because some values should not be used
+** as keys (nil cannot be a key, integer keys can collapse with float
+** keys), the caller must provide a useful 'key' for indexing the cache.
+*/
+static int addk (FuncState *fs, TValue *key, TValue *v) {
+ lua_State *L = fs->ls->L;
+ Proto *f = fs->f;
+ TValue *idx = luaH_set(L, fs->ls->h, key); /* index scanner table */
+ int k, oldsize;
+ if (ttisinteger(idx)) { /* is there an index there? */
+ k = cast_int(ivalue(idx));
+ /* correct value? (warning: must distinguish floats from integers!) */
+ if (k < fs->nk && ttype(&f->k[k]) == ttype(v) &&
+ luaV_rawequalobj(&f->k[k], v))
+ return k; /* reuse index */
+ }
+ /* constant not found; create a new entry */
+ oldsize = f->sizek;
+ k = fs->nk;
+ /* numerical value does not need GC barrier;
+ table has no metatable, so it does not need to invalidate cache */
+ setivalue(idx, k);
+ luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants");
+ while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);
+ setobj(L, &f->k[k], v);
+ fs->nk++;
+ luaC_barrier(L, f, v);
+ return k;
+}
+
+
+/*
+** Add a string to list of constants and return its index.
+*/
+int luaK_stringK (FuncState *fs, TString *s) {
+ TValue o;
+ setsvalue(fs->ls->L, &o, s);
+ return addk(fs, &o, &o); /* use string itself as key */
+}
+
+
+/*
+** Add an integer to list of constants and return its index.
+** Integers use userdata as keys to avoid collision with floats with
+** same value; conversion to 'void*' is used only for hashing, so there
+** are no "precision" problems.
+*/
+int luaK_intK (FuncState *fs, lua_Integer n) {
+ TValue k, o;
+ setpvalue(&k, cast(void*, cast(size_t, n)));
+ setivalue(&o, n);
+ return addk(fs, &k, &o);
+}
+
+/*
+** Add a float to list of constants and return its index.
+*/
+static int luaK_numberK (FuncState *fs, lua_Number r) {
+ TValue o;
+ setfltvalue(&o, r);
+ return addk(fs, &o, &o); /* use number itself as key */
+}
+
+
+/*
+** Add a boolean to list of constants and return its index.
+*/
+static int boolK (FuncState *fs, int b) {
+ TValue o;
+ setbvalue(&o, b);
+ return addk(fs, &o, &o); /* use boolean itself as key */
+}
+
+
+/*
+** Add nil to list of constants and return its index.
+*/
+static int nilK (FuncState *fs) {
+ TValue k, v;
+ setnilvalue(&v);
+ /* cannot use nil as key; instead use table itself to represent nil */
+ sethvalue(fs->ls->L, &k, fs->ls->h);
+ return addk(fs, &k, &v);
+}
+
+
+/*
+** Fix an expression to return the number of results 'nresults'.
+** Either 'e' is a multi-ret expression (function call or vararg)
+** or 'nresults' is LUA_MULTRET (as any expression can satisfy that).
+*/
+void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
+ if (e->k == VCALL) { /* expression is an open function call? */
+ SETARG_C(getinstruction(fs, e), nresults + 1);
+ }
+ else if (e->k == VVARARG) {
+ Instruction *pc = &getinstruction(fs, e);
+ SETARG_B(*pc, nresults + 1);
+ SETARG_A(*pc, fs->freereg);
+ luaK_reserveregs(fs, 1);
+ }
+ else lua_assert(nresults == LUA_MULTRET);
+}
+
+
+/*
+** Fix an expression to return one result.
+** If expression is not a multi-ret expression (function call or
+** vararg), it already returns one result, so nothing needs to be done.
+** Function calls become VNONRELOC expressions (as its result comes
+** fixed in the base register of the call), while vararg expressions
+** become VRELOCABLE (as OP_VARARG puts its results where it wants).
+** (Calls are created returning one result, so that does not need
+** to be fixed.)
+*/
+void luaK_setoneret (FuncState *fs, expdesc *e) {
+ if (e->k == VCALL) { /* expression is an open function call? */
+ /* already returns 1 value */
+ lua_assert(GETARG_C(getinstruction(fs, e)) == 2);
+ e->k = VNONRELOC; /* result has fixed position */
+ e->u.info = GETARG_A(getinstruction(fs, e));
+ }
+ else if (e->k == VVARARG) {
+ SETARG_B(getinstruction(fs, e), 2);
+ e->k = VRELOCABLE; /* can relocate its simple result */
+ }
+}
+
+
+/*
+** Ensure that expression 'e' is not a variable.
+*/
+void luaK_dischargevars (FuncState *fs, expdesc *e) {
+ switch (e->k) {
+ case VLOCAL: { /* already in a register */
+ e->k = VNONRELOC; /* becomes a non-relocatable value */
+ break;
+ }
+ case VUPVAL: { /* move value to some (pending) register */
+ e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0);
+ e->k = VRELOCABLE;
+ break;
+ }
+ case VINDEXED: {
+ OpCode op;
+ freereg(fs, e->u.ind.idx);
+ if (e->u.ind.vt == VLOCAL) { /* is 't' in a register? */
+ freereg(fs, e->u.ind.t);
+ op = OP_GETTABLE;
+ }
+ else {
+ lua_assert(e->u.ind.vt == VUPVAL);
+ op = OP_GETTABUP; /* 't' is in an upvalue */
+ }
+ e->u.info = luaK_codeABC(fs, op, 0, e->u.ind.t, e->u.ind.idx);
+ e->k = VRELOCABLE;
+ break;
+ }
+ case VVARARG: case VCALL: {
+ luaK_setoneret(fs, e);
+ break;
+ }
+ default: break; /* there is one value available (somewhere) */
+ }
+}
+
+
+/*
+** Ensures expression value is in register 'reg' (and therefore
+** 'e' will become a non-relocatable expression).
+*/
+static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
+ luaK_dischargevars(fs, e);
+ switch (e->k) {
+ case VNIL: {
+ luaK_nil(fs, reg, 1);
+ break;
+ }
+ case VFALSE: case VTRUE: {
+ luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);
+ break;
+ }
+ case VK: {
+ luaK_codek(fs, reg, e->u.info);
+ break;
+ }
+ case VKFLT: {
+ luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval));
+ break;
+ }
+ case VKINT: {
+ luaK_codek(fs, reg, luaK_intK(fs, e->u.ival));
+ break;
+ }
+ case VRELOCABLE: {
+ Instruction *pc = &getinstruction(fs, e);
+ SETARG_A(*pc, reg); /* instruction will put result in 'reg' */
+ break;
+ }
+ case VNONRELOC: {
+ if (reg != e->u.info)
+ luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0);
+ break;
+ }
+ default: {
+ lua_assert(e->k == VJMP);
+ return; /* nothing to do... */
+ }
+ }
+ e->u.info = reg;
+ e->k = VNONRELOC;
+}
+
+
+/*
+** Ensures expression value is in any register.
+*/
+static void discharge2anyreg (FuncState *fs, expdesc *e) {
+ if (e->k != VNONRELOC) { /* no fixed register yet? */
+ luaK_reserveregs(fs, 1); /* get a register */
+ discharge2reg(fs, e, fs->freereg-1); /* put value there */
+ }
+}
+
+
+static int code_loadbool (FuncState *fs, int A, int b, int jump) {
+ luaK_getlabel(fs); /* those instructions may be jump targets */
+ return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump);
+}
+
+
+/*
+** check whether list has any jump that do not produce a value
+** or produce an inverted value
+*/
+static int need_value (FuncState *fs, int list) {
+ for (; list != NO_JUMP; list = getjump(fs, list)) {
+ Instruction i = *getjumpcontrol(fs, list);
+ if (GET_OPCODE(i) != OP_TESTSET) return 1;
+ }
+ return 0; /* not found */
+}
+
+
+/*
+** Ensures final expression result (including results from its jump
+** lists) is in register 'reg'.
+** If expression has jumps, need to patch these jumps either to
+** its final position or to "load" instructions (for those tests
+** that do not produce values).
+*/
+static void exp2reg (FuncState *fs, expdesc *e, int reg) {
+ discharge2reg(fs, e, reg);
+ if (e->k == VJMP) /* expression itself is a test? */
+ luaK_concat(fs, &e->t, e->u.info); /* put this jump in 't' list */
+ if (hasjumps(e)) {
+ int final; /* position after whole expression */
+ int p_f = NO_JUMP; /* position of an eventual LOAD false */
+ int p_t = NO_JUMP; /* position of an eventual LOAD true */
+ if (need_value(fs, e->t) || need_value(fs, e->f)) {
+ int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);
+ p_f = code_loadbool(fs, reg, 0, 1);
+ p_t = code_loadbool(fs, reg, 1, 0);
+ luaK_patchtohere(fs, fj);
+ }
+ final = luaK_getlabel(fs);
+ patchlistaux(fs, e->f, final, reg, p_f);
+ patchlistaux(fs, e->t, final, reg, p_t);
+ }
+ e->f = e->t = NO_JUMP;
+ e->u.info = reg;
+ e->k = VNONRELOC;
+}
+
+
+/*
+** Ensures final expression result (including results from its jump
+** lists) is in next available register.
+*/
+void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
+ luaK_dischargevars(fs, e);
+ freeexp(fs, e);
+ luaK_reserveregs(fs, 1);
+ exp2reg(fs, e, fs->freereg - 1);
+}
+
+
+/*
+** Ensures final expression result (including results from its jump
+** lists) is in some (any) register and return that register.
+*/
+int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
+ luaK_dischargevars(fs, e);
+ if (e->k == VNONRELOC) { /* expression already has a register? */
+ if (!hasjumps(e)) /* no jumps? */
+ return e->u.info; /* result is already in a register */
+ if (e->u.info >= fs->nactvar) { /* reg. is not a local? */
+ exp2reg(fs, e, e->u.info); /* put final result in it */
+ return e->u.info;
+ }
+ }
+ luaK_exp2nextreg(fs, e); /* otherwise, use next available register */
+ return e->u.info;
+}
+
+
+/*
+** Ensures final expression result is either in a register or in an
+** upvalue.
+*/
+void luaK_exp2anyregup (FuncState *fs, expdesc *e) {
+ if (e->k != VUPVAL || hasjumps(e))
+ luaK_exp2anyreg(fs, e);
+}
+
+
+/*
+** Ensures final expression result is either in a register or it is
+** a constant.
+*/
+void luaK_exp2val (FuncState *fs, expdesc *e) {
+ if (hasjumps(e))
+ luaK_exp2anyreg(fs, e);
+ else
+ luaK_dischargevars(fs, e);
+}
+
+
+/*
+** Ensures final expression result is in a valid R/K index
+** (that is, it is either in a register or in 'k' with an index
+** in the range of R/K indices).
+** Returns R/K index.
+*/
+int luaK_exp2RK (FuncState *fs, expdesc *e) {
+ luaK_exp2val(fs, e);
+ switch (e->k) { /* move constants to 'k' */
+ case VTRUE: e->u.info = boolK(fs, 1); goto vk;
+ case VFALSE: e->u.info = boolK(fs, 0); goto vk;
+ case VNIL: e->u.info = nilK(fs); goto vk;
+ case VKINT: e->u.info = luaK_intK(fs, e->u.ival); goto vk;
+ case VKFLT: e->u.info = luaK_numberK(fs, e->u.nval); goto vk;
+ case VK:
+ vk:
+ e->k = VK;
+ if (e->u.info <= MAXINDEXRK) /* constant fits in 'argC'? */
+ return RKASK(e->u.info);
+ else break;
+ default: break;
+ }
+ /* not a constant in the right range: put it in a register */
+ return luaK_exp2anyreg(fs, e);
+}
+
+
+/*
+** Generate code to store result of expression 'ex' into variable 'var'.
+*/
+void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
+ switch (var->k) {
+ case VLOCAL: {
+ freeexp(fs, ex);
+ exp2reg(fs, ex, var->u.info); /* compute 'ex' into proper place */
+ return;
+ }
+ case VUPVAL: {
+ int e = luaK_exp2anyreg(fs, ex);
+ luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0);
+ break;
+ }
+ case VINDEXED: {
+ OpCode op = (var->u.ind.vt == VLOCAL) ? OP_SETTABLE : OP_SETTABUP;
+ int e = luaK_exp2RK(fs, ex);
+ luaK_codeABC(fs, op, var->u.ind.t, var->u.ind.idx, e);
+ break;
+ }
+ default: lua_assert(0); /* invalid var kind to store */
+ }
+ freeexp(fs, ex);
+}
+
+
+/*
+** Emit SELF instruction (convert expression 'e' into 'e:key(e,').
+*/
+void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
+ int ereg;
+ luaK_exp2anyreg(fs, e);
+ ereg = e->u.info; /* register where 'e' was placed */
+ freeexp(fs, e);
+ e->u.info = fs->freereg; /* base register for op_self */
+ e->k = VNONRELOC; /* self expression has a fixed register */
+ luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */
+ luaK_codeABC(fs, OP_SELF, e->u.info, ereg, luaK_exp2RK(fs, key));
+ freeexp(fs, key);
+}
+
+
+/*
+** Negate condition 'e' (where 'e' is a comparison).
+*/
+static void negatecondition (FuncState *fs, expdesc *e) {
+ Instruction *pc = getjumpcontrol(fs, e->u.info);
+ lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&
+ GET_OPCODE(*pc) != OP_TEST);
+ SETARG_A(*pc, !(GETARG_A(*pc)));
+}
+
+
+/*
+** Emit instruction to jump if 'e' is 'cond' (that is, if 'cond'
+** is true, code will jump if 'e' is true.) Return jump position.
+** Optimize when 'e' is 'not' something, inverting the condition
+** and removing the 'not'.
+*/
+static int jumponcond (FuncState *fs, expdesc *e, int cond) {
+ if (e->k == VRELOCABLE) {
+ Instruction ie = getinstruction(fs, e);
+ if (GET_OPCODE(ie) == OP_NOT) {
+ fs->pc--; /* remove previous OP_NOT */
+ return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond);
+ }
+ /* else go through */
+ }
+ discharge2anyreg(fs, e);
+ freeexp(fs, e);
+ return condjump(fs, OP_TESTSET, NO_REG, e->u.info, cond);
+}
+
+
+/*
+** Emit code to go through if 'e' is true, jump otherwise.
+*/
+void luaK_goiftrue (FuncState *fs, expdesc *e) {
+ int pc; /* pc of new jump */
+ luaK_dischargevars(fs, e);
+ switch (e->k) {
+ case VJMP: { /* condition? */
+ negatecondition(fs, e); /* jump when it is false */
+ pc = e->u.info; /* save jump position */
+ break;
+ }
+ case VK: case VKFLT: case VKINT: case VTRUE: {
+ pc = NO_JUMP; /* always true; do nothing */
+ break;
+ }
+ default: {
+ pc = jumponcond(fs, e, 0); /* jump when false */
+ break;
+ }
+ }
+ luaK_concat(fs, &e->f, pc); /* insert new jump in false list */
+ luaK_patchtohere(fs, e->t); /* true list jumps to here (to go through) */
+ e->t = NO_JUMP;
+}
+
+
+/*
+** Emit code to go through if 'e' is false, jump otherwise.
+*/
+void luaK_goiffalse (FuncState *fs, expdesc *e) {
+ int pc; /* pc of new jump */
+ luaK_dischargevars(fs, e);
+ switch (e->k) {
+ case VJMP: {
+ pc = e->u.info; /* already jump if true */
+ break;
+ }
+ case VNIL: case VFALSE: {
+ pc = NO_JUMP; /* always false; do nothing */
+ break;
+ }
+ default: {
+ pc = jumponcond(fs, e, 1); /* jump if true */
+ break;
+ }
+ }
+ luaK_concat(fs, &e->t, pc); /* insert new jump in 't' list */
+ luaK_patchtohere(fs, e->f); /* false list jumps to here (to go through) */
+ e->f = NO_JUMP;
+}
+
+
+/*
+** Code 'not e', doing constant folding.
+*/
+static void codenot (FuncState *fs, expdesc *e) {
+ luaK_dischargevars(fs, e);
+ switch (e->k) {
+ case VNIL: case VFALSE: {
+ e->k = VTRUE; /* true == not nil == not false */
+ break;
+ }
+ case VK: case VKFLT: case VKINT: case VTRUE: {
+ e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */
+ break;
+ }
+ case VJMP: {
+ negatecondition(fs, e);
+ break;
+ }
+ case VRELOCABLE:
+ case VNONRELOC: {
+ discharge2anyreg(fs, e);
+ freeexp(fs, e);
+ e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0);
+ e->k = VRELOCABLE;
+ break;
+ }
+ default: lua_assert(0); /* cannot happen */
+ }
+ /* interchange true and false lists */
+ { int temp = e->f; e->f = e->t; e->t = temp; }
+ removevalues(fs, e->f); /* values are useless when negated */
+ removevalues(fs, e->t);
+}
+
+
+/*
+** Create expression 't[k]'. 't' must have its final result already in a
+** register or upvalue.
+*/
+void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
+ lua_assert(!hasjumps(t) && (vkisinreg(t->k) || t->k == VUPVAL));
+ t->u.ind.t = t->u.info; /* register or upvalue index */
+ t->u.ind.idx = luaK_exp2RK(fs, k); /* R/K index for key */
+ t->u.ind.vt = (t->k == VUPVAL) ? VUPVAL : VLOCAL;
+ t->k = VINDEXED;
+}
+
+
+/*
+** Return false if folding can raise an error.
+** Bitwise operations need operands convertible to integers; division
+** operations cannot have 0 as divisor.
+*/
+static int validop (int op, TValue *v1, TValue *v2) {
+ switch (op) {
+ case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR:
+ case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: { /* conversion errors */
+ lua_Integer i;
+ return (tointeger(v1, &i) && tointeger(v2, &i));
+ }
+ case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD: /* division by 0 */
+ return (nvalue(v2) != 0);
+ default: return 1; /* everything else is valid */
+ }
+}
+
+
+/*
+** Try to "constant-fold" an operation; return 1 iff successful.
+** (In this case, 'e1' has the final result.)
+*/
+static int constfolding (FuncState *fs, int op, expdesc *e1, expdesc *e2) {
+ TValue v1, v2, res;
+ if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2))
+ return 0; /* non-numeric operands or not safe to fold */
+ luaO_arith(fs->ls->L, op, &v1, &v2, &res); /* does operation */
+ if (ttisinteger(&res)) {
+ e1->k = VKINT;
+ e1->u.ival = ivalue(&res);
+ }
+ else { /* folds neither NaN nor 0.0 (to avoid problems with -0.0) */
+ lua_Number n = fltvalue(&res);
+ if (luai_numisnan(n) || n == 0)
+ return 0;
+ e1->k = VKFLT;
+ e1->u.nval = n;
+ }
+ return 1;
+}
+
+
+/*
+** Emit code for unary expressions that "produce values"
+** (everything but 'not').
+** Expression to produce final result will be encoded in 'e'.
+*/
+static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) {
+ int r = luaK_exp2anyreg(fs, e); /* opcodes operate only on registers */
+ freeexp(fs, e);
+ e->u.info = luaK_codeABC(fs, op, 0, r, 0); /* generate opcode */
+ e->k = VRELOCABLE; /* all those operations are relocatable */
+ luaK_fixline(fs, line);
+}
+
+
+/*
+** Emit code for binary expressions that "produce values"
+** (everything but logical operators 'and'/'or' and comparison
+** operators).
+** Expression to produce final result will be encoded in 'e1'.
+*/
+static void codebinexpval (FuncState *fs, OpCode op,
+ expdesc *e1, expdesc *e2, int line) {
+ int rk1 = luaK_exp2RK(fs, e1); /* both operands are "RK" */
+ int rk2 = luaK_exp2RK(fs, e2);
+ freeexps(fs, e1, e2);
+ e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */
+ e1->k = VRELOCABLE; /* all those operations are relocatable */
+ luaK_fixline(fs, line);
+}
+
+
+/*
+** Emit code for comparisons.
+** 'e1' was already put in R/K form by 'luaK_infix'.
+*/
+static void codecomp (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
+ int rk1 = (e1->k == VK) ? RKASK(e1->u.info)
+ : check_exp(e1->k == VNONRELOC, e1->u.info);
+ int rk2 = luaK_exp2RK(fs, e2);
+ freeexps(fs, e1, e2);
+ switch (opr) {
+ case OPR_NE: { /* '(a ~= b)' ==> 'not (a == b)' */
+ e1->u.info = condjump(fs, OP_EQ, 0, rk1, rk2);
+ break;
+ }
+ case OPR_GT: case OPR_GE: {
+ /* '(a > b)' ==> '(b < a)'; '(a >= b)' ==> '(b <= a)' */
+ OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ);
+ e1->u.info = condjump(fs, op, 1, rk2, rk1); /* invert operands */
+ break;
+ }
+ default: { /* '==', '<', '<=' use their own opcodes */
+ OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ);
+ e1->u.info = condjump(fs, op, 1, rk1, rk2);
+ break;
+ }
+ }
+ e1->k = VJMP;
+}
+
+
+/*
+** Aplly prefix operation 'op' to expression 'e'.
+*/
+void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
+ static expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP}; /* fake 2nd operand */
+ switch (op) {
+ case OPR_MINUS: case OPR_BNOT:
+ if (constfolding(fs, op + LUA_OPUNM, e, &ef))
+ break;
+ /* FALLTHROUGH */
+ case OPR_LEN:
+ codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line);
+ break;
+ case OPR_NOT: codenot(fs, e); break;
+ default: lua_assert(0);
+ }
+}
+
+
+/*
+** Process 1st operand 'v' of binary operation 'op' before reading
+** 2nd operand.
+*/
+void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
+ switch (op) {
+ case OPR_AND: {
+ luaK_goiftrue(fs, v); /* go ahead only if 'v' is true */
+ break;
+ }
+ case OPR_OR: {
+ luaK_goiffalse(fs, v); /* go ahead only if 'v' is false */
+ break;
+ }
+ case OPR_CONCAT: {
+ luaK_exp2nextreg(fs, v); /* operand must be on the 'stack' */
+ break;
+ }
+ case OPR_ADD: case OPR_SUB:
+ case OPR_MUL: case OPR_DIV: case OPR_IDIV:
+ case OPR_MOD: case OPR_POW:
+ case OPR_BAND: case OPR_BOR: case OPR_BXOR:
+ case OPR_SHL: case OPR_SHR: {
+ if (!tonumeral(v, NULL))
+ luaK_exp2RK(fs, v);
+ /* else keep numeral, which may be folded with 2nd operand */
+ break;
+ }
+ default: {
+ luaK_exp2RK(fs, v);
+ break;
+ }
+ }
+}
+
+
+/*
+** Finalize code for binary operation, after reading 2nd operand.
+** For '(a .. b .. c)' (which is '(a .. (b .. c))', because
+** concatenation is right associative), merge second CONCAT into first
+** one.
+*/
+void luaK_posfix (FuncState *fs, BinOpr op,
+ expdesc *e1, expdesc *e2, int line) {
+ switch (op) {
+ case OPR_AND: {
+ lua_assert(e1->t == NO_JUMP); /* list closed by 'luK_infix' */
+ luaK_dischargevars(fs, e2);
+ luaK_concat(fs, &e2->f, e1->f);
+ *e1 = *e2;
+ break;
+ }
+ case OPR_OR: {
+ lua_assert(e1->f == NO_JUMP); /* list closed by 'luK_infix' */
+ luaK_dischargevars(fs, e2);
+ luaK_concat(fs, &e2->t, e1->t);
+ *e1 = *e2;
+ break;
+ }
+ case OPR_CONCAT: {
+ luaK_exp2val(fs, e2);
+ if (e2->k == VRELOCABLE &&
+ GET_OPCODE(getinstruction(fs, e2)) == OP_CONCAT) {
+ lua_assert(e1->u.info == GETARG_B(getinstruction(fs, e2))-1);
+ freeexp(fs, e1);
+ SETARG_B(getinstruction(fs, e2), e1->u.info);
+ e1->k = VRELOCABLE; e1->u.info = e2->u.info;
+ }
+ else {
+ luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */
+ codebinexpval(fs, OP_CONCAT, e1, e2, line);
+ }
+ break;
+ }
+ case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
+ case OPR_IDIV: case OPR_MOD: case OPR_POW:
+ case OPR_BAND: case OPR_BOR: case OPR_BXOR:
+ case OPR_SHL: case OPR_SHR: {
+ if (!constfolding(fs, op + LUA_OPADD, e1, e2))
+ codebinexpval(fs, cast(OpCode, op + OP_ADD), e1, e2, line);
+ break;
+ }
+ case OPR_EQ: case OPR_LT: case OPR_LE:
+ case OPR_NE: case OPR_GT: case OPR_GE: {
+ codecomp(fs, op, e1, e2);
+ break;
+ }
+ default: lua_assert(0);
+ }
+}
+
+
+/*
+** Change line information associated with current position.
+*/
+void luaK_fixline (FuncState *fs, int line) {
+ fs->f->lineinfo[fs->pc - 1] = line;
+}
+
+
+/*
+** Emit a SETLIST instruction.
+** 'base' is register that keeps table;
+** 'nelems' is #table plus those to be stored now;
+** 'tostore' is number of values (in registers 'base + 1',...) to add to
+** table (or LUA_MULTRET to add up to stack top).
+*/
+void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
+ int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1;
+ int b = (tostore == LUA_MULTRET) ? 0 : tostore;
+ lua_assert(tostore != 0 && tostore <= LFIELDS_PER_FLUSH);
+ if (c <= MAXARG_C)
+ luaK_codeABC(fs, OP_SETLIST, base, b, c);
+ else if (c <= MAXARG_Ax) {
+ luaK_codeABC(fs, OP_SETLIST, base, b, 0);
+ codeextraarg(fs, c);
+ }
+ else
+ luaX_syntaxerror(fs->ls, "constructor too long");
+ fs->freereg = base + 1; /* free registers with list values */
+}
+
diff --git a/libs/lua/lua-5.3.3/lcode.h b/libs/lua/lua-5.3.3/lcode.h
new file mode 100644
index 0000000..cd306d5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lcode.h
@@ -0,0 +1,88 @@
+/*
+** $Id: lcode.h,v 1.64 2016/01/05 16:22:37 roberto Exp $
+** Code generator for Lua
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lcode_h
+#define lcode_h
+
+#include "llex.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+
+
+/*
+** Marks the end of a patch list. It is an invalid value both as an absolute
+** address, and as a list link (would link an element to itself).
+*/
+#define NO_JUMP (-1)
+
+
+/*
+** grep "ORDER OPR" if you change these enums (ORDER OP)
+*/
+typedef enum BinOpr {
+ OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,
+ OPR_DIV,
+ OPR_IDIV,
+ OPR_BAND, OPR_BOR, OPR_BXOR,
+ OPR_SHL, OPR_SHR,
+ OPR_CONCAT,
+ OPR_EQ, OPR_LT, OPR_LE,
+ OPR_NE, OPR_GT, OPR_GE,
+ OPR_AND, OPR_OR,
+ OPR_NOBINOPR
+} BinOpr;
+
+
+typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
+
+
+/* get (pointer to) instruction of given 'expdesc' */
+#define getinstruction(fs,e) ((fs)->f->code[(e)->u.info])
+
+#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)
+
+#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET)
+
+#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t)
+
+LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);
+LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);
+LUAI_FUNC int luaK_codek (FuncState *fs, int reg, int k);
+LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
+LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
+LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);
+LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);
+LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s);
+LUAI_FUNC int luaK_intK (FuncState *fs, lua_Integer n);
+LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);
+LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);
+LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
+LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
+LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);
+LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);
+LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);
+LUAI_FUNC int luaK_jump (FuncState *fs);
+LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);
+LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);
+LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);
+LUAI_FUNC void luaK_patchclose (FuncState *fs, int list, int level);
+LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);
+LUAI_FUNC int luaK_getlabel (FuncState *fs);
+LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line);
+LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);
+LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1,
+ expdesc *v2, int line);
+LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lcorolib.c b/libs/lua/lua-5.3.3/lcorolib.c
new file mode 100644
index 0000000..2303429
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lcorolib.c
@@ -0,0 +1,168 @@
+/*
+** $Id: lcorolib.c,v 1.10 2016/04/11 19:19:55 roberto Exp $
+** Coroutine Library
+** See Copyright Notice in lua.h
+*/
+
+#define lcorolib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdlib.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+static lua_State *getco (lua_State *L) {
+ lua_State *co = lua_tothread(L, 1);
+ luaL_argcheck(L, co, 1, "thread expected");
+ return co;
+}
+
+
+static int auxresume (lua_State *L, lua_State *co, int narg) {
+ int status;
+ if (!lua_checkstack(co, narg)) {
+ lua_pushliteral(L, "too many arguments to resume");
+ return -1; /* error flag */
+ }
+ if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) {
+ lua_pushliteral(L, "cannot resume dead coroutine");
+ return -1; /* error flag */
+ }
+ lua_xmove(L, co, narg);
+ status = lua_resume(co, L, narg);
+ if (status == LUA_OK || status == LUA_YIELD) {
+ int nres = lua_gettop(co);
+ if (!lua_checkstack(L, nres + 1)) {
+ lua_pop(co, nres); /* remove results anyway */
+ lua_pushliteral(L, "too many results to resume");
+ return -1; /* error flag */
+ }
+ lua_xmove(co, L, nres); /* move yielded values */
+ return nres;
+ }
+ else {
+ lua_xmove(co, L, 1); /* move error message */
+ return -1; /* error flag */
+ }
+}
+
+
+static int luaB_coresume (lua_State *L) {
+ lua_State *co = getco(L);
+ int r;
+ r = auxresume(L, co, lua_gettop(L) - 1);
+ if (r < 0) {
+ lua_pushboolean(L, 0);
+ lua_insert(L, -2);
+ return 2; /* return false + error message */
+ }
+ else {
+ lua_pushboolean(L, 1);
+ lua_insert(L, -(r + 1));
+ return r + 1; /* return true + 'resume' returns */
+ }
+}
+
+
+static int luaB_auxwrap (lua_State *L) {
+ lua_State *co = lua_tothread(L, lua_upvalueindex(1));
+ int r = auxresume(L, co, lua_gettop(L));
+ if (r < 0) {
+ if (lua_type(L, -1) == LUA_TSTRING) { /* error object is a string? */
+ luaL_where(L, 1); /* add extra info */
+ lua_insert(L, -2);
+ lua_concat(L, 2);
+ }
+ return lua_error(L); /* propagate error */
+ }
+ return r;
+}
+
+
+static int luaB_cocreate (lua_State *L) {
+ lua_State *NL;
+ luaL_checktype(L, 1, LUA_TFUNCTION);
+ NL = lua_newthread(L);
+ lua_pushvalue(L, 1); /* move function to top */
+ lua_xmove(L, NL, 1); /* move function from L to NL */
+ return 1;
+}
+
+
+static int luaB_cowrap (lua_State *L) {
+ luaB_cocreate(L);
+ lua_pushcclosure(L, luaB_auxwrap, 1);
+ return 1;
+}
+
+
+static int luaB_yield (lua_State *L) {
+ return lua_yield(L, lua_gettop(L));
+}
+
+
+static int luaB_costatus (lua_State *L) {
+ lua_State *co = getco(L);
+ if (L == co) lua_pushliteral(L, "running");
+ else {
+ switch (lua_status(co)) {
+ case LUA_YIELD:
+ lua_pushliteral(L, "suspended");
+ break;
+ case LUA_OK: {
+ lua_Debug ar;
+ if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */
+ lua_pushliteral(L, "normal"); /* it is running */
+ else if (lua_gettop(co) == 0)
+ lua_pushliteral(L, "dead");
+ else
+ lua_pushliteral(L, "suspended"); /* initial state */
+ break;
+ }
+ default: /* some error occurred */
+ lua_pushliteral(L, "dead");
+ break;
+ }
+ }
+ return 1;
+}
+
+
+static int luaB_yieldable (lua_State *L) {
+ lua_pushboolean(L, lua_isyieldable(L));
+ return 1;
+}
+
+
+static int luaB_corunning (lua_State *L) {
+ int ismain = lua_pushthread(L);
+ lua_pushboolean(L, ismain);
+ return 2;
+}
+
+
+static const luaL_Reg co_funcs[] = {
+ {"create", luaB_cocreate},
+ {"resume", luaB_coresume},
+ {"running", luaB_corunning},
+ {"status", luaB_costatus},
+ {"wrap", luaB_cowrap},
+ {"yield", luaB_yield},
+ {"isyieldable", luaB_yieldable},
+ {NULL, NULL}
+};
+
+
+
+LUAMOD_API int luaopen_coroutine (lua_State *L) {
+ luaL_newlib(L, co_funcs);
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lctype.c b/libs/lua/lua-5.3.3/lctype.c
new file mode 100644
index 0000000..ae9367e
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lctype.c
@@ -0,0 +1,55 @@
+/*
+** $Id: lctype.c,v 1.12 2014/11/02 19:19:04 roberto Exp $
+** 'ctype' functions for Lua
+** See Copyright Notice in lua.h
+*/
+
+#define lctype_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include "lctype.h"
+
+#if !LUA_USE_CTYPE /* { */
+
+#include <limits.h>
+
+LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = {
+ 0x00, /* EOZ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0. */
+ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, /* 2. */
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, /* 3. */
+ 0x16, 0x16, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 4. */
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 5. */
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05,
+ 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 6. */
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 7. */
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 8. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 9. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* f. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+#endif /* } */
diff --git a/libs/lua/lua-5.3.3/lctype.h b/libs/lua/lua-5.3.3/lctype.h
new file mode 100644
index 0000000..99c7d12
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lctype.h
@@ -0,0 +1,95 @@
+/*
+** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $
+** 'ctype' functions for Lua
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lctype_h
+#define lctype_h
+
+#include "lua.h"
+
+
+/*
+** WARNING: the functions defined here do not necessarily correspond
+** to the similar functions in the standard C ctype.h. They are
+** optimized for the specific needs of Lua
+*/
+
+#if !defined(LUA_USE_CTYPE)
+
+#if 'A' == 65 && '0' == 48
+/* ASCII case: can use its own tables; faster and fixed */
+#define LUA_USE_CTYPE 0
+#else
+/* must use standard C ctype */
+#define LUA_USE_CTYPE 1
+#endif
+
+#endif
+
+
+#if !LUA_USE_CTYPE /* { */
+
+#include <limits.h>
+
+#include "llimits.h"
+
+
+#define ALPHABIT 0
+#define DIGITBIT 1
+#define PRINTBIT 2
+#define SPACEBIT 3
+#define XDIGITBIT 4
+
+
+#define MASK(B) (1 << (B))
+
+
+/*
+** add 1 to char to allow index -1 (EOZ)
+*/
+#define testprop(c,p) (luai_ctype_[(c)+1] & (p))
+
+/*
+** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_'
+*/
+#define lislalpha(c) testprop(c, MASK(ALPHABIT))
+#define lislalnum(c) testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT)))
+#define lisdigit(c) testprop(c, MASK(DIGITBIT))
+#define lisspace(c) testprop(c, MASK(SPACEBIT))
+#define lisprint(c) testprop(c, MASK(PRINTBIT))
+#define lisxdigit(c) testprop(c, MASK(XDIGITBIT))
+
+/*
+** this 'ltolower' only works for alphabetic characters
+*/
+#define ltolower(c) ((c) | ('A' ^ 'a'))
+
+
+/* two more entries for 0 and -1 (EOZ) */
+LUAI_DDEC const lu_byte luai_ctype_[UCHAR_MAX + 2];
+
+
+#else /* }{ */
+
+/*
+** use standard C ctypes
+*/
+
+#include <ctype.h>
+
+
+#define lislalpha(c) (isalpha(c) || (c) == '_')
+#define lislalnum(c) (isalnum(c) || (c) == '_')
+#define lisdigit(c) (isdigit(c))
+#define lisspace(c) (isspace(c))
+#define lisprint(c) (isprint(c))
+#define lisxdigit(c) (isxdigit(c))
+
+#define ltolower(c) (tolower(c))
+
+#endif /* } */
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/ldblib.c b/libs/lua/lua-5.3.3/ldblib.c
new file mode 100644
index 0000000..786f6cd
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldblib.c
@@ -0,0 +1,456 @@
+/*
+** $Id: ldblib.c,v 1.151 2015/11/23 11:29:43 roberto Exp $
+** Interface from Lua to its debug API
+** See Copyright Notice in lua.h
+*/
+
+#define ldblib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** The hook table at registry[&HOOKKEY] maps threads to their current
+** hook function. (We only need the unique address of 'HOOKKEY'.)
+*/
+static const int HOOKKEY = 0;
+
+
+/*
+** If L1 != L, L1 can be in any state, and therefore there are no
+** guarantees about its stack space; any push in L1 must be
+** checked.
+*/
+static void checkstack (lua_State *L, lua_State *L1, int n) {
+ if (L != L1 && !lua_checkstack(L1, n))
+ luaL_error(L, "stack overflow");
+}
+
+
+static int db_getregistry (lua_State *L) {
+ lua_pushvalue(L, LUA_REGISTRYINDEX);
+ return 1;
+}
+
+
+static int db_getmetatable (lua_State *L) {
+ luaL_checkany(L, 1);
+ if (!lua_getmetatable(L, 1)) {
+ lua_pushnil(L); /* no metatable */
+ }
+ return 1;
+}
+
+
+static int db_setmetatable (lua_State *L) {
+ int t = lua_type(L, 2);
+ luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,
+ "nil or table expected");
+ lua_settop(L, 2);
+ lua_setmetatable(L, 1);
+ return 1; /* return 1st argument */
+}
+
+
+static int db_getuservalue (lua_State *L) {
+ if (lua_type(L, 1) != LUA_TUSERDATA)
+ lua_pushnil(L);
+ else
+ lua_getuservalue(L, 1);
+ return 1;
+}
+
+
+static int db_setuservalue (lua_State *L) {
+ luaL_checktype(L, 1, LUA_TUSERDATA);
+ luaL_checkany(L, 2);
+ lua_settop(L, 2);
+ lua_setuservalue(L, 1);
+ return 1;
+}
+
+
+/*
+** Auxiliary function used by several library functions: check for
+** an optional thread as function's first argument and set 'arg' with
+** 1 if this argument is present (so that functions can skip it to
+** access their other arguments)
+*/
+static lua_State *getthread (lua_State *L, int *arg) {
+ if (lua_isthread(L, 1)) {
+ *arg = 1;
+ return lua_tothread(L, 1);
+ }
+ else {
+ *arg = 0;
+ return L; /* function will operate over current thread */
+ }
+}
+
+
+/*
+** Variations of 'lua_settable', used by 'db_getinfo' to put results
+** from 'lua_getinfo' into result table. Key is always a string;
+** value can be a string, an int, or a boolean.
+*/
+static void settabss (lua_State *L, const char *k, const char *v) {
+ lua_pushstring(L, v);
+ lua_setfield(L, -2, k);
+}
+
+static void settabsi (lua_State *L, const char *k, int v) {
+ lua_pushinteger(L, v);
+ lua_setfield(L, -2, k);
+}
+
+static void settabsb (lua_State *L, const char *k, int v) {
+ lua_pushboolean(L, v);
+ lua_setfield(L, -2, k);
+}
+
+
+/*
+** In function 'db_getinfo', the call to 'lua_getinfo' may push
+** results on the stack; later it creates the result table to put
+** these objects. Function 'treatstackoption' puts the result from
+** 'lua_getinfo' on top of the result table so that it can call
+** 'lua_setfield'.
+*/
+static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) {
+ if (L == L1)
+ lua_rotate(L, -2, 1); /* exchange object and table */
+ else
+ lua_xmove(L1, L, 1); /* move object to the "main" stack */
+ lua_setfield(L, -2, fname); /* put object into table */
+}
+
+
+/*
+** Calls 'lua_getinfo' and collects all results in a new table.
+** L1 needs stack space for an optional input (function) plus
+** two optional outputs (function and line table) from function
+** 'lua_getinfo'.
+*/
+static int db_getinfo (lua_State *L) {
+ lua_Debug ar;
+ int arg;
+ lua_State *L1 = getthread(L, &arg);
+ const char *options = luaL_optstring(L, arg+2, "flnStu");
+ checkstack(L, L1, 3);
+ if (lua_isfunction(L, arg + 1)) { /* info about a function? */
+ options = lua_pushfstring(L, ">%s", options); /* add '>' to 'options' */
+ lua_pushvalue(L, arg + 1); /* move function to 'L1' stack */
+ lua_xmove(L, L1, 1);
+ }
+ else { /* stack level */
+ if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) {
+ lua_pushnil(L); /* level out of range */
+ return 1;
+ }
+ }
+ if (!lua_getinfo(L1, options, &ar))
+ return luaL_argerror(L, arg+2, "invalid option");
+ lua_newtable(L); /* table to collect results */
+ if (strchr(options, 'S')) {
+ settabss(L, "source", ar.source);
+ settabss(L, "short_src", ar.short_src);
+ settabsi(L, "linedefined", ar.linedefined);
+ settabsi(L, "lastlinedefined", ar.lastlinedefined);
+ settabss(L, "what", ar.what);
+ }
+ if (strchr(options, 'l'))
+ settabsi(L, "currentline", ar.currentline);
+ if (strchr(options, 'u')) {
+ settabsi(L, "nups", ar.nups);
+ settabsi(L, "nparams", ar.nparams);
+ settabsb(L, "isvararg", ar.isvararg);
+ }
+ if (strchr(options, 'n')) {
+ settabss(L, "name", ar.name);
+ settabss(L, "namewhat", ar.namewhat);
+ }
+ if (strchr(options, 't'))
+ settabsb(L, "istailcall", ar.istailcall);
+ if (strchr(options, 'L'))
+ treatstackoption(L, L1, "activelines");
+ if (strchr(options, 'f'))
+ treatstackoption(L, L1, "func");
+ return 1; /* return table */
+}
+
+
+static int db_getlocal (lua_State *L) {
+ int arg;
+ lua_State *L1 = getthread(L, &arg);
+ lua_Debug ar;
+ const char *name;
+ int nvar = (int)luaL_checkinteger(L, arg + 2); /* local-variable index */
+ if (lua_isfunction(L, arg + 1)) { /* function argument? */
+ lua_pushvalue(L, arg + 1); /* push function */
+ lua_pushstring(L, lua_getlocal(L, NULL, nvar)); /* push local name */
+ return 1; /* return only name (there is no value) */
+ }
+ else { /* stack-level argument */
+ int level = (int)luaL_checkinteger(L, arg + 1);
+ if (!lua_getstack(L1, level, &ar)) /* out of range? */
+ return luaL_argerror(L, arg+1, "level out of range");
+ checkstack(L, L1, 1);
+ name = lua_getlocal(L1, &ar, nvar);
+ if (name) {
+ lua_xmove(L1, L, 1); /* move local value */
+ lua_pushstring(L, name); /* push name */
+ lua_rotate(L, -2, 1); /* re-order */
+ return 2;
+ }
+ else {
+ lua_pushnil(L); /* no name (nor value) */
+ return 1;
+ }
+ }
+}
+
+
+static int db_setlocal (lua_State *L) {
+ int arg;
+ const char *name;
+ lua_State *L1 = getthread(L, &arg);
+ lua_Debug ar;
+ int level = (int)luaL_checkinteger(L, arg + 1);
+ int nvar = (int)luaL_checkinteger(L, arg + 2);
+ if (!lua_getstack(L1, level, &ar)) /* out of range? */
+ return luaL_argerror(L, arg+1, "level out of range");
+ luaL_checkany(L, arg+3);
+ lua_settop(L, arg+3);
+ checkstack(L, L1, 1);
+ lua_xmove(L, L1, 1);
+ name = lua_setlocal(L1, &ar, nvar);
+ if (name == NULL)
+ lua_pop(L1, 1); /* pop value (if not popped by 'lua_setlocal') */
+ lua_pushstring(L, name);
+ return 1;
+}
+
+
+/*
+** get (if 'get' is true) or set an upvalue from a closure
+*/
+static int auxupvalue (lua_State *L, int get) {
+ const char *name;
+ int n = (int)luaL_checkinteger(L, 2); /* upvalue index */
+ luaL_checktype(L, 1, LUA_TFUNCTION); /* closure */
+ name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);
+ if (name == NULL) return 0;
+ lua_pushstring(L, name);
+ lua_insert(L, -(get+1)); /* no-op if get is false */
+ return get + 1;
+}
+
+
+static int db_getupvalue (lua_State *L) {
+ return auxupvalue(L, 1);
+}
+
+
+static int db_setupvalue (lua_State *L) {
+ luaL_checkany(L, 3);
+ return auxupvalue(L, 0);
+}
+
+
+/*
+** Check whether a given upvalue from a given closure exists and
+** returns its index
+*/
+static int checkupval (lua_State *L, int argf, int argnup) {
+ int nup = (int)luaL_checkinteger(L, argnup); /* upvalue index */
+ luaL_checktype(L, argf, LUA_TFUNCTION); /* closure */
+ luaL_argcheck(L, (lua_getupvalue(L, argf, nup) != NULL), argnup,
+ "invalid upvalue index");
+ return nup;
+}
+
+
+static int db_upvalueid (lua_State *L) {
+ int n = checkupval(L, 1, 2);
+ lua_pushlightuserdata(L, lua_upvalueid(L, 1, n));
+ return 1;
+}
+
+
+static int db_upvaluejoin (lua_State *L) {
+ int n1 = checkupval(L, 1, 2);
+ int n2 = checkupval(L, 3, 4);
+ luaL_argcheck(L, !lua_iscfunction(L, 1), 1, "Lua function expected");
+ luaL_argcheck(L, !lua_iscfunction(L, 3), 3, "Lua function expected");
+ lua_upvaluejoin(L, 1, n1, 3, n2);
+ return 0;
+}
+
+
+/*
+** Call hook function registered at hook table for the current
+** thread (if there is one)
+*/
+static void hookf (lua_State *L, lua_Debug *ar) {
+ static const char *const hooknames[] =
+ {"call", "return", "line", "count", "tail call"};
+ lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY);
+ lua_pushthread(L);
+ if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */
+ lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */
+ if (ar->currentline >= 0)
+ lua_pushinteger(L, ar->currentline); /* push current line */
+ else lua_pushnil(L);
+ lua_assert(lua_getinfo(L, "lS", ar));
+ lua_call(L, 2, 0); /* call hook function */
+ }
+}
+
+
+/*
+** Convert a string mask (for 'sethook') into a bit mask
+*/
+static int makemask (const char *smask, int count) {
+ int mask = 0;
+ if (strchr(smask, 'c')) mask |= LUA_MASKCALL;
+ if (strchr(smask, 'r')) mask |= LUA_MASKRET;
+ if (strchr(smask, 'l')) mask |= LUA_MASKLINE;
+ if (count > 0) mask |= LUA_MASKCOUNT;
+ return mask;
+}
+
+
+/*
+** Convert a bit mask (for 'gethook') into a string mask
+*/
+static char *unmakemask (int mask, char *smask) {
+ int i = 0;
+ if (mask & LUA_MASKCALL) smask[i++] = 'c';
+ if (mask & LUA_MASKRET) smask[i++] = 'r';
+ if (mask & LUA_MASKLINE) smask[i++] = 'l';
+ smask[i] = '\0';
+ return smask;
+}
+
+
+static int db_sethook (lua_State *L) {
+ int arg, mask, count;
+ lua_Hook func;
+ lua_State *L1 = getthread(L, &arg);
+ if (lua_isnoneornil(L, arg+1)) { /* no hook? */
+ lua_settop(L, arg+1);
+ func = NULL; mask = 0; count = 0; /* turn off hooks */
+ }
+ else {
+ const char *smask = luaL_checkstring(L, arg+2);
+ luaL_checktype(L, arg+1, LUA_TFUNCTION);
+ count = (int)luaL_optinteger(L, arg + 3, 0);
+ func = hookf; mask = makemask(smask, count);
+ }
+ if (lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY) == LUA_TNIL) {
+ lua_createtable(L, 0, 2); /* create a hook table */
+ lua_pushvalue(L, -1);
+ lua_rawsetp(L, LUA_REGISTRYINDEX, &HOOKKEY); /* set it in position */
+ lua_pushstring(L, "k");
+ lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */
+ lua_pushvalue(L, -1);
+ lua_setmetatable(L, -2); /* setmetatable(hooktable) = hooktable */
+ }
+ checkstack(L, L1, 1);
+ lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */
+ lua_pushvalue(L, arg + 1); /* value (hook function) */
+ lua_rawset(L, -3); /* hooktable[L1] = new Lua hook */
+ lua_sethook(L1, func, mask, count);
+ return 0;
+}
+
+
+static int db_gethook (lua_State *L) {
+ int arg;
+ lua_State *L1 = getthread(L, &arg);
+ char buff[5];
+ int mask = lua_gethookmask(L1);
+ lua_Hook hook = lua_gethook(L1);
+ if (hook == NULL) /* no hook? */
+ lua_pushnil(L);
+ else if (hook != hookf) /* external hook? */
+ lua_pushliteral(L, "external hook");
+ else { /* hook table must exist */
+ lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY);
+ checkstack(L, L1, 1);
+ lua_pushthread(L1); lua_xmove(L1, L, 1);
+ lua_rawget(L, -2); /* 1st result = hooktable[L1] */
+ lua_remove(L, -2); /* remove hook table */
+ }
+ lua_pushstring(L, unmakemask(mask, buff)); /* 2nd result = mask */
+ lua_pushinteger(L, lua_gethookcount(L1)); /* 3rd result = count */
+ return 3;
+}
+
+
+static int db_debug (lua_State *L) {
+ for (;;) {
+ char buffer[250];
+ lua_writestringerror("%s", "lua_debug> ");
+ if (fgets(buffer, sizeof(buffer), stdin) == 0 ||
+ strcmp(buffer, "cont\n") == 0)
+ return 0;
+ if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||
+ lua_pcall(L, 0, 0, 0))
+ lua_writestringerror("%s\n", lua_tostring(L, -1));
+ lua_settop(L, 0); /* remove eventual returns */
+ }
+}
+
+
+static int db_traceback (lua_State *L) {
+ int arg;
+ lua_State *L1 = getthread(L, &arg);
+ const char *msg = lua_tostring(L, arg + 1);
+ if (msg == NULL && !lua_isnoneornil(L, arg + 1)) /* non-string 'msg'? */
+ lua_pushvalue(L, arg + 1); /* return it untouched */
+ else {
+ int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0);
+ luaL_traceback(L, L1, msg, level);
+ }
+ return 1;
+}
+
+
+static const luaL_Reg dblib[] = {
+ {"debug", db_debug},
+ {"getuservalue", db_getuservalue},
+ {"gethook", db_gethook},
+ {"getinfo", db_getinfo},
+ {"getlocal", db_getlocal},
+ {"getregistry", db_getregistry},
+ {"getmetatable", db_getmetatable},
+ {"getupvalue", db_getupvalue},
+ {"upvaluejoin", db_upvaluejoin},
+ {"upvalueid", db_upvalueid},
+ {"setuservalue", db_setuservalue},
+ {"sethook", db_sethook},
+ {"setlocal", db_setlocal},
+ {"setmetatable", db_setmetatable},
+ {"setupvalue", db_setupvalue},
+ {"traceback", db_traceback},
+ {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_debug (lua_State *L) {
+ luaL_newlib(L, dblib);
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/ldebug.c b/libs/lua/lua-5.3.3/ldebug.c
new file mode 100644
index 0000000..e499ee3
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldebug.c
@@ -0,0 +1,679 @@
+/*
+** $Id: ldebug.c,v 2.120 2016/03/31 19:01:21 roberto Exp $
+** Debug Interface
+** See Copyright Notice in lua.h
+*/
+
+#define ldebug_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "lcode.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lvm.h"
+
+
+
+#define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_TCCL)
+
+
+/* Active Lua function (given call info) */
+#define ci_func(ci) (clLvalue((ci)->func))
+
+
+static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);
+
+
+static int currentpc (CallInfo *ci) {
+ lua_assert(isLua(ci));
+ return pcRel(ci->u.l.savedpc, ci_func(ci)->p);
+}
+
+
+static int currentline (CallInfo *ci) {
+ return getfuncline(ci_func(ci)->p, currentpc(ci));
+}
+
+
+/*
+** If function yielded, its 'func' can be in the 'extra' field. The
+** next function restores 'func' to its correct value for debugging
+** purposes. (It exchanges 'func' and 'extra'; so, when called again,
+** after debugging, it also "re-restores" ** 'func' to its altered value.
+*/
+static void swapextra (lua_State *L) {
+ if (L->status == LUA_YIELD) {
+ CallInfo *ci = L->ci; /* get function that yielded */
+ StkId temp = ci->func; /* exchange its 'func' and 'extra' values */
+ ci->func = restorestack(L, ci->extra);
+ ci->extra = savestack(L, temp);
+ }
+}
+
+
+/*
+** This function can be called asynchronously (e.g. during a signal).
+** Fields 'oldpc', 'basehookcount', and 'hookcount' (set by
+** 'resethookcount') are for debug only, and it is no problem if they
+** get arbitrary values (causes at most one wrong hook call). 'hookmask'
+** is an atomic value. We assume that pointers are atomic too (e.g., gcc
+** ensures that for all platforms where it runs). Moreover, 'hook' is
+** always checked before being called (see 'luaD_hook').
+*/
+LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {
+ if (func == NULL || mask == 0) { /* turn off hooks? */
+ mask = 0;
+ func = NULL;
+ }
+ if (isLua(L->ci))
+ L->oldpc = L->ci->u.l.savedpc;
+ L->hook = func;
+ L->basehookcount = count;
+ resethookcount(L);
+ L->hookmask = cast_byte(mask);
+}
+
+
+LUA_API lua_Hook lua_gethook (lua_State *L) {
+ return L->hook;
+}
+
+
+LUA_API int lua_gethookmask (lua_State *L) {
+ return L->hookmask;
+}
+
+
+LUA_API int lua_gethookcount (lua_State *L) {
+ return L->basehookcount;
+}
+
+
+LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
+ int status;
+ CallInfo *ci;
+ if (level < 0) return 0; /* invalid (negative) level */
+ lua_lock(L);
+ for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous)
+ level--;
+ if (level == 0 && ci != &L->base_ci) { /* level found? */
+ status = 1;
+ ar->i_ci = ci;
+ }
+ else status = 0; /* no such level */
+ lua_unlock(L);
+ return status;
+}
+
+
+static const char *upvalname (Proto *p, int uv) {
+ TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name);
+ if (s == NULL) return "?";
+ else return getstr(s);
+}
+
+
+static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
+ int nparams = clLvalue(ci->func)->p->numparams;
+ if (n >= cast_int(ci->u.l.base - ci->func) - nparams)
+ return NULL; /* no such vararg */
+ else {
+ *pos = ci->func + nparams + n;
+ return "(*vararg)"; /* generic name for any vararg */
+ }
+}
+
+
+static const char *findlocal (lua_State *L, CallInfo *ci, int n,
+ StkId *pos) {
+ const char *name = NULL;
+ StkId base;
+ if (isLua(ci)) {
+ if (n < 0) /* access to vararg values? */
+ return findvararg(ci, -n, pos);
+ else {
+ base = ci->u.l.base;
+ name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci));
+ }
+ }
+ else
+ base = ci->func + 1;
+ if (name == NULL) { /* no 'standard' name? */
+ StkId limit = (ci == L->ci) ? L->top : ci->next->func;
+ if (limit - base >= n && n > 0) /* is 'n' inside 'ci' stack? */
+ name = "(*temporary)"; /* generic name for any valid slot */
+ else
+ return NULL; /* no name */
+ }
+ *pos = base + (n - 1);
+ return name;
+}
+
+
+LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {
+ const char *name;
+ lua_lock(L);
+ swapextra(L);
+ if (ar == NULL) { /* information about non-active function? */
+ if (!isLfunction(L->top - 1)) /* not a Lua function? */
+ name = NULL;
+ else /* consider live variables at function start (parameters) */
+ name = luaF_getlocalname(clLvalue(L->top - 1)->p, n, 0);
+ }
+ else { /* active function; get information through 'ar' */
+ StkId pos = NULL; /* to avoid warnings */
+ name = findlocal(L, ar->i_ci, n, &pos);
+ if (name) {
+ setobj2s(L, L->top, pos);
+ api_incr_top(L);
+ }
+ }
+ swapextra(L);
+ lua_unlock(L);
+ return name;
+}
+
+
+LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
+ StkId pos = NULL; /* to avoid warnings */
+ const char *name;
+ lua_lock(L);
+ swapextra(L);
+ name = findlocal(L, ar->i_ci, n, &pos);
+ if (name) {
+ setobjs2s(L, pos, L->top - 1);
+ L->top--; /* pop value */
+ }
+ swapextra(L);
+ lua_unlock(L);
+ return name;
+}
+
+
+static void funcinfo (lua_Debug *ar, Closure *cl) {
+ if (noLuaClosure(cl)) {
+ ar->source = "=[C]";
+ ar->linedefined = -1;
+ ar->lastlinedefined = -1;
+ ar->what = "C";
+ }
+ else {
+ Proto *p = cl->l.p;
+ ar->source = p->source ? getstr(p->source) : "=?";
+ ar->linedefined = p->linedefined;
+ ar->lastlinedefined = p->lastlinedefined;
+ ar->what = (ar->linedefined == 0) ? "main" : "Lua";
+ }
+ luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);
+}
+
+
+static void collectvalidlines (lua_State *L, Closure *f) {
+ if (noLuaClosure(f)) {
+ setnilvalue(L->top);
+ api_incr_top(L);
+ }
+ else {
+ int i;
+ TValue v;
+ int *lineinfo = f->l.p->lineinfo;
+ Table *t = luaH_new(L); /* new table to store active lines */
+ sethvalue(L, L->top, t); /* push it on stack */
+ api_incr_top(L);
+ setbvalue(&v, 1); /* boolean 'true' to be the value of all indices */
+ for (i = 0; i < f->l.p->sizelineinfo; i++) /* for all lines with code */
+ luaH_setint(L, t, lineinfo[i], &v); /* table[line] = true */
+ }
+}
+
+
+static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
+ Closure *f, CallInfo *ci) {
+ int status = 1;
+ for (; *what; what++) {
+ switch (*what) {
+ case 'S': {
+ funcinfo(ar, f);
+ break;
+ }
+ case 'l': {
+ ar->currentline = (ci && isLua(ci)) ? currentline(ci) : -1;
+ break;
+ }
+ case 'u': {
+ ar->nups = (f == NULL) ? 0 : f->c.nupvalues;
+ if (noLuaClosure(f)) {
+ ar->isvararg = 1;
+ ar->nparams = 0;
+ }
+ else {
+ ar->isvararg = f->l.p->is_vararg;
+ ar->nparams = f->l.p->numparams;
+ }
+ break;
+ }
+ case 't': {
+ ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0;
+ break;
+ }
+ case 'n': {
+ /* calling function is a known Lua function? */
+ if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous))
+ ar->namewhat = getfuncname(L, ci->previous, &ar->name);
+ else
+ ar->namewhat = NULL;
+ if (ar->namewhat == NULL) {
+ ar->namewhat = ""; /* not found */
+ ar->name = NULL;
+ }
+ break;
+ }
+ case 'L':
+ case 'f': /* handled by lua_getinfo */
+ break;
+ default: status = 0; /* invalid option */
+ }
+ }
+ return status;
+}
+
+
+LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
+ int status;
+ Closure *cl;
+ CallInfo *ci;
+ StkId func;
+ lua_lock(L);
+ swapextra(L);
+ if (*what == '>') {
+ ci = NULL;
+ func = L->top - 1;
+ api_check(L, ttisfunction(func), "function expected");
+ what++; /* skip the '>' */
+ L->top--; /* pop function */
+ }
+ else {
+ ci = ar->i_ci;
+ func = ci->func;
+ lua_assert(ttisfunction(ci->func));
+ }
+ cl = ttisclosure(func) ? clvalue(func) : NULL;
+ status = auxgetinfo(L, what, ar, cl, ci);
+ if (strchr(what, 'f')) {
+ setobjs2s(L, L->top, func);
+ api_incr_top(L);
+ }
+ swapextra(L); /* correct before option 'L', which can raise a mem. error */
+ if (strchr(what, 'L'))
+ collectvalidlines(L, cl);
+ lua_unlock(L);
+ return status;
+}
+
+
+/*
+** {======================================================
+** Symbolic Execution
+** =======================================================
+*/
+
+static const char *getobjname (Proto *p, int lastpc, int reg,
+ const char **name);
+
+
+/*
+** find a "name" for the RK value 'c'
+*/
+static void kname (Proto *p, int pc, int c, const char **name) {
+ if (ISK(c)) { /* is 'c' a constant? */
+ TValue *kvalue = &p->k[INDEXK(c)];
+ if (ttisstring(kvalue)) { /* literal constant? */
+ *name = svalue(kvalue); /* it is its own name */
+ return;
+ }
+ /* else no reasonable name found */
+ }
+ else { /* 'c' is a register */
+ const char *what = getobjname(p, pc, c, name); /* search for 'c' */
+ if (what && *what == 'c') { /* found a constant name? */
+ return; /* 'name' already filled */
+ }
+ /* else no reasonable name found */
+ }
+ *name = "?"; /* no reasonable name found */
+}
+
+
+static int filterpc (int pc, int jmptarget) {
+ if (pc < jmptarget) /* is code conditional (inside a jump)? */
+ return -1; /* cannot know who sets that register */
+ else return pc; /* current position sets that register */
+}
+
+
+/*
+** try to find last instruction before 'lastpc' that modified register 'reg'
+*/
+static int findsetreg (Proto *p, int lastpc, int reg) {
+ int pc;
+ int setreg = -1; /* keep last instruction that changed 'reg' */
+ int jmptarget = 0; /* any code before this address is conditional */
+ for (pc = 0; pc < lastpc; pc++) {
+ Instruction i = p->code[pc];
+ OpCode op = GET_OPCODE(i);
+ int a = GETARG_A(i);
+ switch (op) {
+ case OP_LOADNIL: {
+ int b = GETARG_B(i);
+ if (a <= reg && reg <= a + b) /* set registers from 'a' to 'a+b' */
+ setreg = filterpc(pc, jmptarget);
+ break;
+ }
+ case OP_TFORCALL: {
+ if (reg >= a + 2) /* affect all regs above its base */
+ setreg = filterpc(pc, jmptarget);
+ break;
+ }
+ case OP_CALL:
+ case OP_TAILCALL: {
+ if (reg >= a) /* affect all registers above base */
+ setreg = filterpc(pc, jmptarget);
+ break;
+ }
+ case OP_JMP: {
+ int b = GETARG_sBx(i);
+ int dest = pc + 1 + b;
+ /* jump is forward and do not skip 'lastpc'? */
+ if (pc < dest && dest <= lastpc) {
+ if (dest > jmptarget)
+ jmptarget = dest; /* update 'jmptarget' */
+ }
+ break;
+ }
+ default:
+ if (testAMode(op) && reg == a) /* any instruction that set A */
+ setreg = filterpc(pc, jmptarget);
+ break;
+ }
+ }
+ return setreg;
+}
+
+
+static const char *getobjname (Proto *p, int lastpc, int reg,
+ const char **name) {
+ int pc;
+ *name = luaF_getlocalname(p, reg + 1, lastpc);
+ if (*name) /* is a local? */
+ return "local";
+ /* else try symbolic execution */
+ pc = findsetreg(p, lastpc, reg);
+ if (pc != -1) { /* could find instruction? */
+ Instruction i = p->code[pc];
+ OpCode op = GET_OPCODE(i);
+ switch (op) {
+ case OP_MOVE: {
+ int b = GETARG_B(i); /* move from 'b' to 'a' */
+ if (b < GETARG_A(i))
+ return getobjname(p, pc, b, name); /* get name for 'b' */
+ break;
+ }
+ case OP_GETTABUP:
+ case OP_GETTABLE: {
+ int k = GETARG_C(i); /* key index */
+ int t = GETARG_B(i); /* table index */
+ const char *vn = (op == OP_GETTABLE) /* name of indexed variable */
+ ? luaF_getlocalname(p, t + 1, pc)
+ : upvalname(p, t);
+ kname(p, pc, k, name);
+ return (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field";
+ }
+ case OP_GETUPVAL: {
+ *name = upvalname(p, GETARG_B(i));
+ return "upvalue";
+ }
+ case OP_LOADK:
+ case OP_LOADKX: {
+ int b = (op == OP_LOADK) ? GETARG_Bx(i)
+ : GETARG_Ax(p->code[pc + 1]);
+ if (ttisstring(&p->k[b])) {
+ *name = svalue(&p->k[b]);
+ return "constant";
+ }
+ break;
+ }
+ case OP_SELF: {
+ int k = GETARG_C(i); /* key index */
+ kname(p, pc, k, name);
+ return "method";
+ }
+ default: break; /* go through to return NULL */
+ }
+ }
+ return NULL; /* could not find reasonable name */
+}
+
+
+static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
+ TMS tm = (TMS)0; /* to avoid warnings */
+ Proto *p = ci_func(ci)->p; /* calling function */
+ int pc = currentpc(ci); /* calling instruction index */
+ Instruction i = p->code[pc]; /* calling instruction */
+ if (ci->callstatus & CIST_HOOKED) { /* was it called inside a hook? */
+ *name = "?";
+ return "hook";
+ }
+ switch (GET_OPCODE(i)) {
+ case OP_CALL:
+ case OP_TAILCALL: /* get function name */
+ return getobjname(p, pc, GETARG_A(i), name);
+ case OP_TFORCALL: { /* for iterator */
+ *name = "for iterator";
+ return "for iterator";
+ }
+ /* all other instructions can call only through metamethods */
+ case OP_SELF: case OP_GETTABUP: case OP_GETTABLE:
+ tm = TM_INDEX;
+ break;
+ case OP_SETTABUP: case OP_SETTABLE:
+ tm = TM_NEWINDEX;
+ break;
+ case OP_ADD: case OP_SUB: case OP_MUL: case OP_MOD:
+ case OP_POW: case OP_DIV: case OP_IDIV: case OP_BAND:
+ case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: {
+ int offset = cast_int(GET_OPCODE(i)) - cast_int(OP_ADD); /* ORDER OP */
+ tm = cast(TMS, offset + cast_int(TM_ADD)); /* ORDER TM */
+ break;
+ }
+ case OP_UNM: tm = TM_UNM; break;
+ case OP_BNOT: tm = TM_BNOT; break;
+ case OP_LEN: tm = TM_LEN; break;
+ case OP_CONCAT: tm = TM_CONCAT; break;
+ case OP_EQ: tm = TM_EQ; break;
+ case OP_LT: tm = TM_LT; break;
+ case OP_LE: tm = TM_LE; break;
+ default: lua_assert(0); /* other instructions cannot call a function */
+ }
+ *name = getstr(G(L)->tmname[tm]);
+ return "metamethod";
+}
+
+/* }====================================================== */
+
+
+
+/*
+** The subtraction of two potentially unrelated pointers is
+** not ISO C, but it should not crash a program; the subsequent
+** checks are ISO C and ensure a correct result.
+*/
+static int isinstack (CallInfo *ci, const TValue *o) {
+ ptrdiff_t i = o - ci->u.l.base;
+ return (0 <= i && i < (ci->top - ci->u.l.base) && ci->u.l.base + i == o);
+}
+
+
+/*
+** Checks whether value 'o' came from an upvalue. (That can only happen
+** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on
+** upvalues.)
+*/
+static const char *getupvalname (CallInfo *ci, const TValue *o,
+ const char **name) {
+ LClosure *c = ci_func(ci);
+ int i;
+ for (i = 0; i < c->nupvalues; i++) {
+ if (c->upvals[i]->v == o) {
+ *name = upvalname(c->p, i);
+ return "upvalue";
+ }
+ }
+ return NULL;
+}
+
+
+static const char *varinfo (lua_State *L, const TValue *o) {
+ const char *name = NULL; /* to avoid warnings */
+ CallInfo *ci = L->ci;
+ const char *kind = NULL;
+ if (isLua(ci)) {
+ kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */
+ if (!kind && isinstack(ci, o)) /* no? try a register */
+ kind = getobjname(ci_func(ci)->p, currentpc(ci),
+ cast_int(o - ci->u.l.base), &name);
+ }
+ return (kind) ? luaO_pushfstring(L, " (%s '%s')", kind, name) : "";
+}
+
+
+l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
+ const char *t = luaT_objtypename(L, o);
+ luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o));
+}
+
+
+l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) {
+ if (ttisstring(p1) || cvt2str(p1)) p1 = p2;
+ luaG_typeerror(L, p1, "concatenate");
+}
+
+
+l_noret luaG_opinterror (lua_State *L, const TValue *p1,
+ const TValue *p2, const char *msg) {
+ lua_Number temp;
+ if (!tonumber(p1, &temp)) /* first operand is wrong? */
+ p2 = p1; /* now second is wrong */
+ luaG_typeerror(L, p2, msg);
+}
+
+
+/*
+** Error when both values are convertible to numbers, but not to integers
+*/
+l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) {
+ lua_Integer temp;
+ if (!tointeger(p1, &temp))
+ p2 = p1;
+ luaG_runerror(L, "number%s has no integer representation", varinfo(L, p2));
+}
+
+
+l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
+ const char *t1 = luaT_objtypename(L, p1);
+ const char *t2 = luaT_objtypename(L, p2);
+ if (strcmp(t1, t2) == 0)
+ luaG_runerror(L, "attempt to compare two %s values", t1);
+ else
+ luaG_runerror(L, "attempt to compare %s with %s", t1, t2);
+}
+
+
+/* add src:line information to 'msg' */
+const char *luaG_addinfo (lua_State *L, const char *msg, TString *src,
+ int line) {
+ char buff[LUA_IDSIZE];
+ if (src)
+ luaO_chunkid(buff, getstr(src), LUA_IDSIZE);
+ else { /* no source available; use "?" instead */
+ buff[0] = '?'; buff[1] = '\0';
+ }
+ return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg);
+}
+
+
+l_noret luaG_errormsg (lua_State *L) {
+ if (L->errfunc != 0) { /* is there an error handling function? */
+ StkId errfunc = restorestack(L, L->errfunc);
+ setobjs2s(L, L->top, L->top - 1); /* move argument */
+ setobjs2s(L, L->top - 1, errfunc); /* push function */
+ L->top++; /* assume EXTRA_STACK */
+ luaD_callnoyield(L, L->top - 2, 1); /* call it */
+ }
+ luaD_throw(L, LUA_ERRRUN);
+}
+
+
+l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {
+ CallInfo *ci = L->ci;
+ const char *msg;
+ va_list argp;
+ va_start(argp, fmt);
+ msg = luaO_pushvfstring(L, fmt, argp); /* format message */
+ va_end(argp);
+ if (isLua(ci)) /* if Lua function, add source:line information */
+ luaG_addinfo(L, msg, ci_func(ci)->p->source, currentline(ci));
+ luaG_errormsg(L);
+}
+
+
+void luaG_traceexec (lua_State *L) {
+ CallInfo *ci = L->ci;
+ lu_byte mask = L->hookmask;
+ int counthook = (--L->hookcount == 0 && (mask & LUA_MASKCOUNT));
+ if (counthook)
+ resethookcount(L); /* reset count */
+ else if (!(mask & LUA_MASKLINE))
+ return; /* no line hook and count != 0; nothing to be done */
+ if (ci->callstatus & CIST_HOOKYIELD) { /* called hook last time? */
+ ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */
+ return; /* do not call hook again (VM yielded, so it did not move) */
+ }
+ if (counthook)
+ luaD_hook(L, LUA_HOOKCOUNT, -1); /* call count hook */
+ if (mask & LUA_MASKLINE) {
+ Proto *p = ci_func(ci)->p;
+ int npc = pcRel(ci->u.l.savedpc, p);
+ int newline = getfuncline(p, npc);
+ if (npc == 0 || /* call linehook when enter a new function, */
+ ci->u.l.savedpc <= L->oldpc || /* when jump back (loop), or when */
+ newline != getfuncline(p, pcRel(L->oldpc, p))) /* enter a new line */
+ luaD_hook(L, LUA_HOOKLINE, newline); /* call line hook */
+ }
+ L->oldpc = ci->u.l.savedpc;
+ if (L->status == LUA_YIELD) { /* did hook yield? */
+ if (counthook)
+ L->hookcount = 1; /* undo decrement to zero */
+ ci->u.l.savedpc--; /* undo increment (resume will increment it again) */
+ ci->callstatus |= CIST_HOOKYIELD; /* mark that it yielded */
+ ci->func = L->top - 1; /* protect stack below results */
+ luaD_throw(L, LUA_YIELD);
+ }
+}
+
diff --git a/libs/lua/lua-5.3.3/ldebug.h b/libs/lua/lua-5.3.3/ldebug.h
new file mode 100644
index 0000000..0e31546
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldebug.h
@@ -0,0 +1,39 @@
+/*
+** $Id: ldebug.h,v 2.14 2015/05/22 17:45:56 roberto Exp $
+** Auxiliary functions from Debug Interface module
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ldebug_h
+#define ldebug_h
+
+
+#include "lstate.h"
+
+
+#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1)
+
+#define getfuncline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : -1)
+
+#define resethookcount(L) (L->hookcount = L->basehookcount)
+
+
+LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o,
+ const char *opname);
+LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1,
+ const TValue *p2);
+LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1,
+ const TValue *p2,
+ const char *msg);
+LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1,
+ const TValue *p2);
+LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1,
+ const TValue *p2);
+LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...);
+LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg,
+ TString *src, int line);
+LUAI_FUNC l_noret luaG_errormsg (lua_State *L);
+LUAI_FUNC void luaG_traceexec (lua_State *L);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/ldo.c b/libs/lua/lua-5.3.3/ldo.c
new file mode 100644
index 0000000..8804c99
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldo.c
@@ -0,0 +1,800 @@
+/*
+** $Id: ldo.c,v 2.151 2015/12/16 16:40:07 roberto Exp $
+** Stack and Call structure of Lua
+** See Copyright Notice in lua.h
+*/
+
+#define ldo_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <setjmp.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lundump.h"
+#include "lvm.h"
+#include "lzio.h"
+
+
+
+#define errorstatus(s) ((s) > LUA_YIELD)
+
+
+/*
+** {======================================================
+** Error-recovery functions
+** =======================================================
+*/
+
+/*
+** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By
+** default, Lua handles errors with exceptions when compiling as
+** C++ code, with _longjmp/_setjmp when asked to use them, and with
+** longjmp/setjmp otherwise.
+*/
+#if !defined(LUAI_THROW) /* { */
+
+#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP) /* { */
+
+/* C++ exceptions */
+#define LUAI_THROW(L,c) throw(c)
+#define LUAI_TRY(L,c,a) \
+ try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; }
+#define luai_jmpbuf int /* dummy variable */
+
+#elif defined(LUA_USE_POSIX) /* }{ */
+
+/* in POSIX, try _longjmp/_setjmp (more efficient) */
+#define LUAI_THROW(L,c) _longjmp((c)->b, 1)
+#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a }
+#define luai_jmpbuf jmp_buf
+
+#else /* }{ */
+
+/* ISO C handling with long jumps */
+#define LUAI_THROW(L,c) longjmp((c)->b, 1)
+#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a }
+#define luai_jmpbuf jmp_buf
+
+#endif /* } */
+
+#endif /* } */
+
+
+
+/* chain list of long jump buffers */
+struct lua_longjmp {
+ struct lua_longjmp *previous;
+ luai_jmpbuf b;
+ volatile int status; /* error code */
+};
+
+
+static void seterrorobj (lua_State *L, int errcode, StkId oldtop) {
+ switch (errcode) {
+ case LUA_ERRMEM: { /* memory error? */
+ setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */
+ break;
+ }
+ case LUA_ERRERR: {
+ setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));
+ break;
+ }
+ default: {
+ setobjs2s(L, oldtop, L->top - 1); /* error message on current top */
+ break;
+ }
+ }
+ L->top = oldtop + 1;
+}
+
+
+l_noret luaD_throw (lua_State *L, int errcode) {
+ if (L->errorJmp) { /* thread has an error handler? */
+ L->errorJmp->status = errcode; /* set status */
+ LUAI_THROW(L, L->errorJmp); /* jump to it */
+ }
+ else { /* thread has no error handler */
+ global_State *g = G(L);
+ L->status = cast_byte(errcode); /* mark it as dead */
+ if (g->mainthread->errorJmp) { /* main thread has a handler? */
+ setobjs2s(L, g->mainthread->top++, L->top - 1); /* copy error obj. */
+ luaD_throw(g->mainthread, errcode); /* re-throw in main thread */
+ }
+ else { /* no handler at all; abort */
+ if (g->panic) { /* panic function? */
+ seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */
+ if (L->ci->top < L->top)
+ L->ci->top = L->top; /* pushing msg. can break this invariant */
+ lua_unlock(L);
+ g->panic(L); /* call panic function (last chance to jump out) */
+ }
+ abort();
+ }
+ }
+}
+
+
+int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
+ unsigned short oldnCcalls = L->nCcalls;
+ struct lua_longjmp lj;
+ lj.status = LUA_OK;
+ lj.previous = L->errorJmp; /* chain new error handler */
+ L->errorJmp = &lj;
+ LUAI_TRY(L, &lj,
+ (*f)(L, ud);
+ );
+ L->errorJmp = lj.previous; /* restore old error handler */
+ L->nCcalls = oldnCcalls;
+ return lj.status;
+}
+
+/* }====================================================== */
+
+
+/*
+** {==================================================================
+** Stack reallocation
+** ===================================================================
+*/
+static void correctstack (lua_State *L, TValue *oldstack) {
+ CallInfo *ci;
+ UpVal *up;
+ L->top = (L->top - oldstack) + L->stack;
+ for (up = L->openupval; up != NULL; up = up->u.open.next)
+ up->v = (up->v - oldstack) + L->stack;
+ for (ci = L->ci; ci != NULL; ci = ci->previous) {
+ ci->top = (ci->top - oldstack) + L->stack;
+ ci->func = (ci->func - oldstack) + L->stack;
+ if (isLua(ci))
+ ci->u.l.base = (ci->u.l.base - oldstack) + L->stack;
+ }
+}
+
+
+/* some space for error handling */
+#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200)
+
+
+void luaD_reallocstack (lua_State *L, int newsize) {
+ TValue *oldstack = L->stack;
+ int lim = L->stacksize;
+ lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE);
+ lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK);
+ luaM_reallocvector(L, L->stack, L->stacksize, newsize, TValue);
+ for (; lim < newsize; lim++)
+ setnilvalue(L->stack + lim); /* erase new segment */
+ L->stacksize = newsize;
+ L->stack_last = L->stack + newsize - EXTRA_STACK;
+ correctstack(L, oldstack);
+}
+
+
+void luaD_growstack (lua_State *L, int n) {
+ int size = L->stacksize;
+ if (size > LUAI_MAXSTACK) /* error after extra size? */
+ luaD_throw(L, LUA_ERRERR);
+ else {
+ int needed = cast_int(L->top - L->stack) + n + EXTRA_STACK;
+ int newsize = 2 * size;
+ if (newsize > LUAI_MAXSTACK) newsize = LUAI_MAXSTACK;
+ if (newsize < needed) newsize = needed;
+ if (newsize > LUAI_MAXSTACK) { /* stack overflow? */
+ luaD_reallocstack(L, ERRORSTACKSIZE);
+ luaG_runerror(L, "stack overflow");
+ }
+ else
+ luaD_reallocstack(L, newsize);
+ }
+}
+
+
+static int stackinuse (lua_State *L) {
+ CallInfo *ci;
+ StkId lim = L->top;
+ for (ci = L->ci; ci != NULL; ci = ci->previous) {
+ lua_assert(ci->top <= L->stack_last);
+ if (lim < ci->top) lim = ci->top;
+ }
+ return cast_int(lim - L->stack) + 1; /* part of stack in use */
+}
+
+
+void luaD_shrinkstack (lua_State *L) {
+ int inuse = stackinuse(L);
+ int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK;
+ if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK;
+ if (L->stacksize > LUAI_MAXSTACK) /* was handling stack overflow? */
+ luaE_freeCI(L); /* free all CIs (list grew because of an error) */
+ else
+ luaE_shrinkCI(L); /* shrink list */
+ if (inuse <= LUAI_MAXSTACK && /* not handling stack overflow? */
+ goodsize < L->stacksize) /* trying to shrink? */
+ luaD_reallocstack(L, goodsize); /* shrink it */
+ else
+ condmovestack(L,,); /* don't change stack (change only for debugging) */
+}
+
+
+void luaD_inctop (lua_State *L) {
+ luaD_checkstack(L, 1);
+ L->top++;
+}
+
+/* }================================================================== */
+
+
+/*
+** Call a hook for the given event. Make sure there is a hook to be
+** called. (Both 'L->hook' and 'L->hookmask', which triggers this
+** function, can be changed asynchronously by signals.)
+*/
+void luaD_hook (lua_State *L, int event, int line) {
+ lua_Hook hook = L->hook;
+ if (hook && L->allowhook) { /* make sure there is a hook */
+ CallInfo *ci = L->ci;
+ ptrdiff_t top = savestack(L, L->top);
+ ptrdiff_t ci_top = savestack(L, ci->top);
+ lua_Debug ar;
+ ar.event = event;
+ ar.currentline = line;
+ ar.i_ci = ci;
+ luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
+ ci->top = L->top + LUA_MINSTACK;
+ lua_assert(ci->top <= L->stack_last);
+ L->allowhook = 0; /* cannot call hooks inside a hook */
+ ci->callstatus |= CIST_HOOKED;
+ lua_unlock(L);
+ (*hook)(L, &ar);
+ lua_lock(L);
+ lua_assert(!L->allowhook);
+ L->allowhook = 1;
+ ci->top = restorestack(L, ci_top);
+ L->top = restorestack(L, top);
+ ci->callstatus &= ~CIST_HOOKED;
+ }
+}
+
+
+static void callhook (lua_State *L, CallInfo *ci) {
+ int hook = LUA_HOOKCALL;
+ ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */
+ if (isLua(ci->previous) &&
+ GET_OPCODE(*(ci->previous->u.l.savedpc - 1)) == OP_TAILCALL) {
+ ci->callstatus |= CIST_TAIL;
+ hook = LUA_HOOKTAILCALL;
+ }
+ luaD_hook(L, hook, -1);
+ ci->u.l.savedpc--; /* correct 'pc' */
+}
+
+
+static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
+ int i;
+ int nfixargs = p->numparams;
+ StkId base, fixed;
+ /* move fixed parameters to final position */
+ fixed = L->top - actual; /* first fixed argument */
+ base = L->top; /* final position of first argument */
+ for (i = 0; i < nfixargs && i < actual; i++) {
+ setobjs2s(L, L->top++, fixed + i);
+ setnilvalue(fixed + i); /* erase original copy (for GC) */
+ }
+ for (; i < nfixargs; i++)
+ setnilvalue(L->top++); /* complete missing arguments */
+ return base;
+}
+
+
+/*
+** Check whether __call metafield of 'func' is a function. If so, put
+** it in stack below original 'func' so that 'luaD_precall' can call
+** it. Raise an error if __call metafield is not a function.
+*/
+static void tryfuncTM (lua_State *L, StkId func) {
+ const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);
+ StkId p;
+ if (!ttisfunction(tm))
+ luaG_typeerror(L, func, "call");
+ /* Open a hole inside the stack at 'func' */
+ for (p = L->top; p > func; p--)
+ setobjs2s(L, p, p-1);
+ L->top++; /* slot ensured by caller */
+ setobj2s(L, func, tm); /* tag method is the new function to be called */
+}
+
+
+
+#define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L)))
+
+
+/* macro to check stack size, preserving 'p' */
+#define checkstackp(L,n,p) \
+ luaD_checkstackaux(L, n, \
+ ptrdiff_t t__ = savestack(L, p); /* save 'p' */ \
+ luaC_checkGC(L), /* stack grow uses memory */ \
+ p = restorestack(L, t__)) /* 'pos' part: restore 'p' */
+
+
+/*
+** Prepares a function call: checks the stack, creates a new CallInfo
+** entry, fills in the relevant information, calls hook if needed.
+** If function is a C function, does the call, too. (Otherwise, leave
+** the execution ('luaV_execute') to the caller, to allow stackless
+** calls.) Returns true iff function has been executed (C function).
+*/
+int luaD_precall (lua_State *L, StkId func, int nresults) {
+ lua_CFunction f;
+ CallInfo *ci;
+ switch (ttype(func)) {
+ case LUA_TCCL: /* C closure */
+ f = clCvalue(func)->f;
+ goto Cfunc;
+ case LUA_TLCF: /* light C function */
+ f = fvalue(func);
+ Cfunc: {
+ int n; /* number of returns */
+ checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */
+ ci = next_ci(L); /* now 'enter' new function */
+ ci->nresults = nresults;
+ ci->func = func;
+ ci->top = L->top + LUA_MINSTACK;
+ lua_assert(ci->top <= L->stack_last);
+ ci->callstatus = 0;
+ if (L->hookmask & LUA_MASKCALL)
+ luaD_hook(L, LUA_HOOKCALL, -1);
+ lua_unlock(L);
+ n = (*f)(L); /* do the actual call */
+ lua_lock(L);
+ api_checknelems(L, n);
+ luaD_poscall(L, ci, L->top - n, n);
+ return 1;
+ }
+ case LUA_TLCL: { /* Lua function: prepare its call */
+ StkId base;
+ Proto *p = clLvalue(func)->p;
+ int n = cast_int(L->top - func) - 1; /* number of real arguments */
+ int fsize = p->maxstacksize; /* frame size */
+ checkstackp(L, fsize, func);
+ if (p->is_vararg != 1) { /* do not use vararg? */
+ for (; n < p->numparams; n++)
+ setnilvalue(L->top++); /* complete missing arguments */
+ base = func + 1;
+ }
+ else
+ base = adjust_varargs(L, p, n);
+ ci = next_ci(L); /* now 'enter' new function */
+ ci->nresults = nresults;
+ ci->func = func;
+ ci->u.l.base = base;
+ L->top = ci->top = base + fsize;
+ lua_assert(ci->top <= L->stack_last);
+ ci->u.l.savedpc = p->code; /* starting point */
+ ci->callstatus = CIST_LUA;
+ if (L->hookmask & LUA_MASKCALL)
+ callhook(L, ci);
+ return 0;
+ }
+ default: { /* not a function */
+ checkstackp(L, 1, func); /* ensure space for metamethod */
+ tryfuncTM(L, func); /* try to get '__call' metamethod */
+ return luaD_precall(L, func, nresults); /* now it must be a function */
+ }
+ }
+}
+
+
+/*
+** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'.
+** Handle most typical cases (zero results for commands, one result for
+** expressions, multiple results for tail calls/single parameters)
+** separated.
+*/
+static int moveresults (lua_State *L, const TValue *firstResult, StkId res,
+ int nres, int wanted) {
+ switch (wanted) { /* handle typical cases separately */
+ case 0: break; /* nothing to move */
+ case 1: { /* one result needed */
+ if (nres == 0) /* no results? */
+ firstResult = luaO_nilobject; /* adjust with nil */
+ setobjs2s(L, res, firstResult); /* move it to proper place */
+ break;
+ }
+ case LUA_MULTRET: {
+ int i;
+ for (i = 0; i < nres; i++) /* move all results to correct place */
+ setobjs2s(L, res + i, firstResult + i);
+ L->top = res + nres;
+ return 0; /* wanted == LUA_MULTRET */
+ }
+ default: {
+ int i;
+ if (wanted <= nres) { /* enough results? */
+ for (i = 0; i < wanted; i++) /* move wanted results to correct place */
+ setobjs2s(L, res + i, firstResult + i);
+ }
+ else { /* not enough results; use all of them plus nils */
+ for (i = 0; i < nres; i++) /* move all results to correct place */
+ setobjs2s(L, res + i, firstResult + i);
+ for (; i < wanted; i++) /* complete wanted number of results */
+ setnilvalue(res + i);
+ }
+ break;
+ }
+ }
+ L->top = res + wanted; /* top points after the last result */
+ return 1;
+}
+
+
+/*
+** Finishes a function call: calls hook if necessary, removes CallInfo,
+** moves current number of results to proper place; returns 0 iff call
+** wanted multiple (variable number of) results.
+*/
+int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) {
+ StkId res;
+ int wanted = ci->nresults;
+ if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) {
+ if (L->hookmask & LUA_MASKRET) {
+ ptrdiff_t fr = savestack(L, firstResult); /* hook may change stack */
+ luaD_hook(L, LUA_HOOKRET, -1);
+ firstResult = restorestack(L, fr);
+ }
+ L->oldpc = ci->previous->u.l.savedpc; /* 'oldpc' for caller function */
+ }
+ res = ci->func; /* res == final position of 1st result */
+ L->ci = ci->previous; /* back to caller */
+ /* move results to proper place */
+ return moveresults(L, firstResult, res, nres, wanted);
+}
+
+
+/*
+** Check appropriate error for stack overflow ("regular" overflow or
+** overflow while handling stack overflow). If 'nCalls' is larger than
+** LUAI_MAXCCALLS (which means it is handling a "regular" overflow) but
+** smaller than 9/8 of LUAI_MAXCCALLS, does not report an error (to
+** allow overflow handling to work)
+*/
+static void stackerror (lua_State *L) {
+ if (L->nCcalls == LUAI_MAXCCALLS)
+ luaG_runerror(L, "C stack overflow");
+ else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
+ luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
+}
+
+
+/*
+** Call a function (C or Lua). The function to be called is at *func.
+** The arguments are on the stack, right after the function.
+** When returns, all the results are on the stack, starting at the original
+** function position.
+*/
+void luaD_call (lua_State *L, StkId func, int nResults) {
+ if (++L->nCcalls >= LUAI_MAXCCALLS)
+ stackerror(L);
+ if (!luaD_precall(L, func, nResults)) /* is a Lua function? */
+ luaV_execute(L); /* call it */
+ L->nCcalls--;
+}
+
+
+/*
+** Similar to 'luaD_call', but does not allow yields during the call
+*/
+void luaD_callnoyield (lua_State *L, StkId func, int nResults) {
+ L->nny++;
+ luaD_call(L, func, nResults);
+ L->nny--;
+}
+
+
+/*
+** Completes the execution of an interrupted C function, calling its
+** continuation function.
+*/
+static void finishCcall (lua_State *L, int status) {
+ CallInfo *ci = L->ci;
+ int n;
+ /* must have a continuation and must be able to call it */
+ lua_assert(ci->u.c.k != NULL && L->nny == 0);
+ /* error status can only happen in a protected call */
+ lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD);
+ if (ci->callstatus & CIST_YPCALL) { /* was inside a pcall? */
+ ci->callstatus &= ~CIST_YPCALL; /* finish 'lua_pcall' */
+ L->errfunc = ci->u.c.old_errfunc;
+ }
+ /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already
+ handled */
+ adjustresults(L, ci->nresults);
+ /* call continuation function */
+ lua_unlock(L);
+ n = (*ci->u.c.k)(L, status, ci->u.c.ctx);
+ lua_lock(L);
+ api_checknelems(L, n);
+ /* finish 'luaD_precall' */
+ luaD_poscall(L, ci, L->top - n, n);
+}
+
+
+/*
+** Executes "full continuation" (everything in the stack) of a
+** previously interrupted coroutine until the stack is empty (or another
+** interruption long-jumps out of the loop). If the coroutine is
+** recovering from an error, 'ud' points to the error status, which must
+** be passed to the first continuation function (otherwise the default
+** status is LUA_YIELD).
+*/
+static void unroll (lua_State *L, void *ud) {
+ if (ud != NULL) /* error status? */
+ finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */
+ while (L->ci != &L->base_ci) { /* something in the stack */
+ if (!isLua(L->ci)) /* C function? */
+ finishCcall(L, LUA_YIELD); /* complete its execution */
+ else { /* Lua function */
+ luaV_finishOp(L); /* finish interrupted instruction */
+ luaV_execute(L); /* execute down to higher C 'boundary' */
+ }
+ }
+}
+
+
+/*
+** Try to find a suspended protected call (a "recover point") for the
+** given thread.
+*/
+static CallInfo *findpcall (lua_State *L) {
+ CallInfo *ci;
+ for (ci = L->ci; ci != NULL; ci = ci->previous) { /* search for a pcall */
+ if (ci->callstatus & CIST_YPCALL)
+ return ci;
+ }
+ return NULL; /* no pending pcall */
+}
+
+
+/*
+** Recovers from an error in a coroutine. Finds a recover point (if
+** there is one) and completes the execution of the interrupted
+** 'luaD_pcall'. If there is no recover point, returns zero.
+*/
+static int recover (lua_State *L, int status) {
+ StkId oldtop;
+ CallInfo *ci = findpcall(L);
+ if (ci == NULL) return 0; /* no recovery point */
+ /* "finish" luaD_pcall */
+ oldtop = restorestack(L, ci->extra);
+ luaF_close(L, oldtop);
+ seterrorobj(L, status, oldtop);
+ L->ci = ci;
+ L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */
+ L->nny = 0; /* should be zero to be yieldable */
+ luaD_shrinkstack(L);
+ L->errfunc = ci->u.c.old_errfunc;
+ return 1; /* continue running the coroutine */
+}
+
+
+/*
+** signal an error in the call to 'resume', not in the execution of the
+** coroutine itself. (Such errors should not be handled by any coroutine
+** error handler and should not kill the coroutine.)
+*/
+static l_noret resume_error (lua_State *L, const char *msg, StkId firstArg) {
+ L->top = firstArg; /* remove args from the stack */
+ setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */
+ api_incr_top(L);
+ luaD_throw(L, -1); /* jump back to 'lua_resume' */
+}
+
+
+/*
+** Do the work for 'lua_resume' in protected mode. Most of the work
+** depends on the status of the coroutine: initial state, suspended
+** inside a hook, or regularly suspended (optionally with a continuation
+** function), plus erroneous cases: non-suspended coroutine or dead
+** coroutine.
+*/
+static void resume (lua_State *L, void *ud) {
+ int nCcalls = L->nCcalls;
+ int n = *(cast(int*, ud)); /* number of arguments */
+ StkId firstArg = L->top - n; /* first argument */
+ CallInfo *ci = L->ci;
+ if (nCcalls >= LUAI_MAXCCALLS)
+ resume_error(L, "C stack overflow", firstArg);
+ if (L->status == LUA_OK) { /* may be starting a coroutine */
+ if (ci != &L->base_ci) /* not in base level? */
+ resume_error(L, "cannot resume non-suspended coroutine", firstArg);
+ /* coroutine is in base level; start running it */
+ if (!luaD_precall(L, firstArg - 1, LUA_MULTRET)) /* Lua function? */
+ luaV_execute(L); /* call it */
+ }
+ else if (L->status != LUA_YIELD)
+ resume_error(L, "cannot resume dead coroutine", firstArg);
+ else { /* resuming from previous yield */
+ L->status = LUA_OK; /* mark that it is running (again) */
+ ci->func = restorestack(L, ci->extra);
+ if (isLua(ci)) /* yielded inside a hook? */
+ luaV_execute(L); /* just continue running Lua code */
+ else { /* 'common' yield */
+ if (ci->u.c.k != NULL) { /* does it have a continuation function? */
+ lua_unlock(L);
+ n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */
+ lua_lock(L);
+ api_checknelems(L, n);
+ firstArg = L->top - n; /* yield results come from continuation */
+ }
+ luaD_poscall(L, ci, firstArg, n); /* finish 'luaD_precall' */
+ }
+ unroll(L, NULL); /* run continuation */
+ }
+ lua_assert(nCcalls == L->nCcalls);
+}
+
+
+LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) {
+ int status;
+ unsigned short oldnny = L->nny; /* save "number of non-yieldable" calls */
+ lua_lock(L);
+ luai_userstateresume(L, nargs);
+ L->nCcalls = (from) ? from->nCcalls + 1 : 1;
+ L->nny = 0; /* allow yields */
+ api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs);
+ status = luaD_rawrunprotected(L, resume, &nargs);
+ if (status == -1) /* error calling 'lua_resume'? */
+ status = LUA_ERRRUN;
+ else { /* continue running after recoverable errors */
+ while (errorstatus(status) && recover(L, status)) {
+ /* unroll continuation */
+ status = luaD_rawrunprotected(L, unroll, &status);
+ }
+ if (errorstatus(status)) { /* unrecoverable error? */
+ L->status = cast_byte(status); /* mark thread as 'dead' */
+ seterrorobj(L, status, L->top); /* push error message */
+ L->ci->top = L->top;
+ }
+ else lua_assert(status == L->status); /* normal end or yield */
+ }
+ L->nny = oldnny; /* restore 'nny' */
+ L->nCcalls--;
+ lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0));
+ lua_unlock(L);
+ return status;
+}
+
+
+LUA_API int lua_isyieldable (lua_State *L) {
+ return (L->nny == 0);
+}
+
+
+LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx,
+ lua_KFunction k) {
+ CallInfo *ci = L->ci;
+ luai_userstateyield(L, nresults);
+ lua_lock(L);
+ api_checknelems(L, nresults);
+ if (L->nny > 0) {
+ if (L != G(L)->mainthread)
+ luaG_runerror(L, "attempt to yield across a C-call boundary");
+ else
+ luaG_runerror(L, "attempt to yield from outside a coroutine");
+ }
+ L->status = LUA_YIELD;
+ ci->extra = savestack(L, ci->func); /* save current 'func' */
+ if (isLua(ci)) { /* inside a hook? */
+ api_check(L, k == NULL, "hooks cannot continue after yielding");
+ }
+ else {
+ if ((ci->u.c.k = k) != NULL) /* is there a continuation? */
+ ci->u.c.ctx = ctx; /* save context */
+ ci->func = L->top - nresults - 1; /* protect stack below results */
+ luaD_throw(L, LUA_YIELD);
+ }
+ lua_assert(ci->callstatus & CIST_HOOKED); /* must be inside a hook */
+ lua_unlock(L);
+ return 0; /* return to 'luaD_hook' */
+}
+
+
+int luaD_pcall (lua_State *L, Pfunc func, void *u,
+ ptrdiff_t old_top, ptrdiff_t ef) {
+ int status;
+ CallInfo *old_ci = L->ci;
+ lu_byte old_allowhooks = L->allowhook;
+ unsigned short old_nny = L->nny;
+ ptrdiff_t old_errfunc = L->errfunc;
+ L->errfunc = ef;
+ status = luaD_rawrunprotected(L, func, u);
+ if (status != LUA_OK) { /* an error occurred? */
+ StkId oldtop = restorestack(L, old_top);
+ luaF_close(L, oldtop); /* close possible pending closures */
+ seterrorobj(L, status, oldtop);
+ L->ci = old_ci;
+ L->allowhook = old_allowhooks;
+ L->nny = old_nny;
+ luaD_shrinkstack(L);
+ }
+ L->errfunc = old_errfunc;
+ return status;
+}
+
+
+
+/*
+** Execute a protected parser.
+*/
+struct SParser { /* data to 'f_parser' */
+ ZIO *z;
+ Mbuffer buff; /* dynamic structure used by the scanner */
+ Dyndata dyd; /* dynamic structures used by the parser */
+ const char *mode;
+ const char *name;
+};
+
+
+static void checkmode (lua_State *L, const char *mode, const char *x) {
+ if (mode && strchr(mode, x[0]) == NULL) {
+ luaO_pushfstring(L,
+ "attempt to load a %s chunk (mode is '%s')", x, mode);
+ luaD_throw(L, LUA_ERRSYNTAX);
+ }
+}
+
+
+static void f_parser (lua_State *L, void *ud) {
+ LClosure *cl;
+ struct SParser *p = cast(struct SParser *, ud);
+ int c = zgetc(p->z); /* read first character */
+ if (c == LUA_SIGNATURE[0]) {
+ checkmode(L, p->mode, "binary");
+ cl = luaU_undump(L, p->z, p->name);
+ }
+ else {
+ checkmode(L, p->mode, "text");
+ cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c);
+ }
+ lua_assert(cl->nupvalues == cl->p->sizeupvalues);
+ luaF_initupvals(L, cl);
+}
+
+
+int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
+ const char *mode) {
+ struct SParser p;
+ int status;
+ L->nny++; /* cannot yield during parsing */
+ p.z = z; p.name = name; p.mode = mode;
+ p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0;
+ p.dyd.gt.arr = NULL; p.dyd.gt.size = 0;
+ p.dyd.label.arr = NULL; p.dyd.label.size = 0;
+ luaZ_initbuffer(L, &p.buff);
+ status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);
+ luaZ_freebuffer(L, &p.buff);
+ luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size);
+ luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size);
+ luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size);
+ L->nny--;
+ return status;
+}
+
+
diff --git a/libs/lua/lua-5.3.3/ldo.h b/libs/lua/lua-5.3.3/ldo.h
new file mode 100644
index 0000000..4f5d51c
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldo.h
@@ -0,0 +1,58 @@
+/*
+** $Id: ldo.h,v 2.29 2015/12/21 13:02:14 roberto Exp $
+** Stack and Call structure of Lua
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ldo_h
+#define ldo_h
+
+
+#include "lobject.h"
+#include "lstate.h"
+#include "lzio.h"
+
+
+/*
+** Macro to check stack size and grow stack if needed. Parameters
+** 'pre'/'pos' allow the macro to preserve a pointer into the
+** stack across reallocations, doing the work only when needed.
+** 'condmovestack' is used in heavy tests to force a stack reallocation
+** at every check.
+*/
+#define luaD_checkstackaux(L,n,pre,pos) \
+ if (L->stack_last - L->top <= (n)) \
+ { pre; luaD_growstack(L, n); pos; } else { condmovestack(L,pre,pos); }
+
+/* In general, 'pre'/'pos' are empty (nothing to save) */
+#define luaD_checkstack(L,n) luaD_checkstackaux(L,n,(void)0,(void)0)
+
+
+
+#define savestack(L,p) ((char *)(p) - (char *)L->stack)
+#define restorestack(L,n) ((TValue *)((char *)L->stack + (n)))
+
+
+/* type of protected functions, to be ran by 'runprotected' */
+typedef void (*Pfunc) (lua_State *L, void *ud);
+
+LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
+ const char *mode);
+LUAI_FUNC void luaD_hook (lua_State *L, int event, int line);
+LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);
+LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);
+LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults);
+LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,
+ ptrdiff_t oldtop, ptrdiff_t ef);
+LUAI_FUNC int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult,
+ int nres);
+LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);
+LUAI_FUNC void luaD_growstack (lua_State *L, int n);
+LUAI_FUNC void luaD_shrinkstack (lua_State *L);
+LUAI_FUNC void luaD_inctop (lua_State *L);
+
+LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode);
+LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/ldump.c b/libs/lua/lua-5.3.3/ldump.c
new file mode 100644
index 0000000..016e300
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldump.c
@@ -0,0 +1,215 @@
+/*
+** $Id: ldump.c,v 2.37 2015/10/08 15:53:49 roberto Exp $
+** save precompiled Lua chunks
+** See Copyright Notice in lua.h
+*/
+
+#define ldump_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "lobject.h"
+#include "lstate.h"
+#include "lundump.h"
+
+
+typedef struct {
+ lua_State *L;
+ lua_Writer writer;
+ void *data;
+ int strip;
+ int status;
+} DumpState;
+
+
+/*
+** All high-level dumps go through DumpVector; you can change it to
+** change the endianness of the result
+*/
+#define DumpVector(v,n,D) DumpBlock(v,(n)*sizeof((v)[0]),D)
+
+#define DumpLiteral(s,D) DumpBlock(s, sizeof(s) - sizeof(char), D)
+
+
+static void DumpBlock (const void *b, size_t size, DumpState *D) {
+ if (D->status == 0 && size > 0) {
+ lua_unlock(D->L);
+ D->status = (*D->writer)(D->L, b, size, D->data);
+ lua_lock(D->L);
+ }
+}
+
+
+#define DumpVar(x,D) DumpVector(&x,1,D)
+
+
+static void DumpByte (int y, DumpState *D) {
+ lu_byte x = (lu_byte)y;
+ DumpVar(x, D);
+}
+
+
+static void DumpInt (int x, DumpState *D) {
+ DumpVar(x, D);
+}
+
+
+static void DumpNumber (lua_Number x, DumpState *D) {
+ DumpVar(x, D);
+}
+
+
+static void DumpInteger (lua_Integer x, DumpState *D) {
+ DumpVar(x, D);
+}
+
+
+static void DumpString (const TString *s, DumpState *D) {
+ if (s == NULL)
+ DumpByte(0, D);
+ else {
+ size_t size = tsslen(s) + 1; /* include trailing '\0' */
+ const char *str = getstr(s);
+ if (size < 0xFF)
+ DumpByte(cast_int(size), D);
+ else {
+ DumpByte(0xFF, D);
+ DumpVar(size, D);
+ }
+ DumpVector(str, size - 1, D); /* no need to save '\0' */
+ }
+}
+
+
+static void DumpCode (const Proto *f, DumpState *D) {
+ DumpInt(f->sizecode, D);
+ DumpVector(f->code, f->sizecode, D);
+}
+
+
+static void DumpFunction(const Proto *f, TString *psource, DumpState *D);
+
+static void DumpConstants (const Proto *f, DumpState *D) {
+ int i;
+ int n = f->sizek;
+ DumpInt(n, D);
+ for (i = 0; i < n; i++) {
+ const TValue *o = &f->k[i];
+ DumpByte(ttype(o), D);
+ switch (ttype(o)) {
+ case LUA_TNIL:
+ break;
+ case LUA_TBOOLEAN:
+ DumpByte(bvalue(o), D);
+ break;
+ case LUA_TNUMFLT:
+ DumpNumber(fltvalue(o), D);
+ break;
+ case LUA_TNUMINT:
+ DumpInteger(ivalue(o), D);
+ break;
+ case LUA_TSHRSTR:
+ case LUA_TLNGSTR:
+ DumpString(tsvalue(o), D);
+ break;
+ default:
+ lua_assert(0);
+ }
+ }
+}
+
+
+static void DumpProtos (const Proto *f, DumpState *D) {
+ int i;
+ int n = f->sizep;
+ DumpInt(n, D);
+ for (i = 0; i < n; i++)
+ DumpFunction(f->p[i], f->source, D);
+}
+
+
+static void DumpUpvalues (const Proto *f, DumpState *D) {
+ int i, n = f->sizeupvalues;
+ DumpInt(n, D);
+ for (i = 0; i < n; i++) {
+ DumpByte(f->upvalues[i].instack, D);
+ DumpByte(f->upvalues[i].idx, D);
+ }
+}
+
+
+static void DumpDebug (const Proto *f, DumpState *D) {
+ int i, n;
+ n = (D->strip) ? 0 : f->sizelineinfo;
+ DumpInt(n, D);
+ DumpVector(f->lineinfo, n, D);
+ n = (D->strip) ? 0 : f->sizelocvars;
+ DumpInt(n, D);
+ for (i = 0; i < n; i++) {
+ DumpString(f->locvars[i].varname, D);
+ DumpInt(f->locvars[i].startpc, D);
+ DumpInt(f->locvars[i].endpc, D);
+ }
+ n = (D->strip) ? 0 : f->sizeupvalues;
+ DumpInt(n, D);
+ for (i = 0; i < n; i++)
+ DumpString(f->upvalues[i].name, D);
+}
+
+
+static void DumpFunction (const Proto *f, TString *psource, DumpState *D) {
+ if (D->strip || f->source == psource)
+ DumpString(NULL, D); /* no debug info or same source as its parent */
+ else
+ DumpString(f->source, D);
+ DumpInt(f->linedefined, D);
+ DumpInt(f->lastlinedefined, D);
+ DumpByte(f->numparams, D);
+ DumpByte(f->is_vararg, D);
+ DumpByte(f->maxstacksize, D);
+ DumpCode(f, D);
+ DumpConstants(f, D);
+ DumpUpvalues(f, D);
+ DumpProtos(f, D);
+ DumpDebug(f, D);
+}
+
+
+static void DumpHeader (DumpState *D) {
+ DumpLiteral(LUA_SIGNATURE, D);
+ DumpByte(LUAC_VERSION, D);
+ DumpByte(LUAC_FORMAT, D);
+ DumpLiteral(LUAC_DATA, D);
+ DumpByte(sizeof(int), D);
+ DumpByte(sizeof(size_t), D);
+ DumpByte(sizeof(Instruction), D);
+ DumpByte(sizeof(lua_Integer), D);
+ DumpByte(sizeof(lua_Number), D);
+ DumpInteger(LUAC_INT, D);
+ DumpNumber(LUAC_NUM, D);
+}
+
+
+/*
+** dump Lua function as precompiled chunk
+*/
+int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data,
+ int strip) {
+ DumpState D;
+ D.L = L;
+ D.writer = w;
+ D.data = data;
+ D.strip = strip;
+ D.status = 0;
+ DumpHeader(&D);
+ DumpByte(f->sizeupvalues, &D);
+ DumpFunction(f, NULL, &D);
+ return D.status;
+}
+
diff --git a/libs/lua/lua-5.3.3/lfunc.c b/libs/lua/lua-5.3.3/lfunc.c
new file mode 100644
index 0000000..67967da
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lfunc.c
@@ -0,0 +1,151 @@
+/*
+** $Id: lfunc.c,v 2.45 2014/11/02 19:19:04 roberto Exp $
+** Auxiliary functions to manipulate prototypes and closures
+** See Copyright Notice in lua.h
+*/
+
+#define lfunc_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+
+
+
+CClosure *luaF_newCclosure (lua_State *L, int n) {
+ GCObject *o = luaC_newobj(L, LUA_TCCL, sizeCclosure(n));
+ CClosure *c = gco2ccl(o);
+ c->nupvalues = cast_byte(n);
+ return c;
+}
+
+
+LClosure *luaF_newLclosure (lua_State *L, int n) {
+ GCObject *o = luaC_newobj(L, LUA_TLCL, sizeLclosure(n));
+ LClosure *c = gco2lcl(o);
+ c->p = NULL;
+ c->nupvalues = cast_byte(n);
+ while (n--) c->upvals[n] = NULL;
+ return c;
+}
+
+/*
+** fill a closure with new closed upvalues
+*/
+void luaF_initupvals (lua_State *L, LClosure *cl) {
+ int i;
+ for (i = 0; i < cl->nupvalues; i++) {
+ UpVal *uv = luaM_new(L, UpVal);
+ uv->refcount = 1;
+ uv->v = &uv->u.value; /* make it closed */
+ setnilvalue(uv->v);
+ cl->upvals[i] = uv;
+ }
+}
+
+
+UpVal *luaF_findupval (lua_State *L, StkId level) {
+ UpVal **pp = &L->openupval;
+ UpVal *p;
+ UpVal *uv;
+ lua_assert(isintwups(L) || L->openupval == NULL);
+ while (*pp != NULL && (p = *pp)->v >= level) {
+ lua_assert(upisopen(p));
+ if (p->v == level) /* found a corresponding upvalue? */
+ return p; /* return it */
+ pp = &p->u.open.next;
+ }
+ /* not found: create a new upvalue */
+ uv = luaM_new(L, UpVal);
+ uv->refcount = 0;
+ uv->u.open.next = *pp; /* link it to list of open upvalues */
+ uv->u.open.touched = 1;
+ *pp = uv;
+ uv->v = level; /* current value lives in the stack */
+ if (!isintwups(L)) { /* thread not in list of threads with upvalues? */
+ L->twups = G(L)->twups; /* link it to the list */
+ G(L)->twups = L;
+ }
+ return uv;
+}
+
+
+void luaF_close (lua_State *L, StkId level) {
+ UpVal *uv;
+ while (L->openupval != NULL && (uv = L->openupval)->v >= level) {
+ lua_assert(upisopen(uv));
+ L->openupval = uv->u.open.next; /* remove from 'open' list */
+ if (uv->refcount == 0) /* no references? */
+ luaM_free(L, uv); /* free upvalue */
+ else {
+ setobj(L, &uv->u.value, uv->v); /* move value to upvalue slot */
+ uv->v = &uv->u.value; /* now current value lives here */
+ luaC_upvalbarrier(L, uv);
+ }
+ }
+}
+
+
+Proto *luaF_newproto (lua_State *L) {
+ GCObject *o = luaC_newobj(L, LUA_TPROTO, sizeof(Proto));
+ Proto *f = gco2p(o);
+ f->k = NULL;
+ f->sizek = 0;
+ f->p = NULL;
+ f->sizep = 0;
+ f->code = NULL;
+ f->cache = NULL;
+ f->sizecode = 0;
+ f->lineinfo = NULL;
+ f->sizelineinfo = 0;
+ f->upvalues = NULL;
+ f->sizeupvalues = 0;
+ f->numparams = 0;
+ f->is_vararg = 0;
+ f->maxstacksize = 0;
+ f->locvars = NULL;
+ f->sizelocvars = 0;
+ f->linedefined = 0;
+ f->lastlinedefined = 0;
+ f->source = NULL;
+ return f;
+}
+
+
+void luaF_freeproto (lua_State *L, Proto *f) {
+ luaM_freearray(L, f->code, f->sizecode);
+ luaM_freearray(L, f->p, f->sizep);
+ luaM_freearray(L, f->k, f->sizek);
+ luaM_freearray(L, f->lineinfo, f->sizelineinfo);
+ luaM_freearray(L, f->locvars, f->sizelocvars);
+ luaM_freearray(L, f->upvalues, f->sizeupvalues);
+ luaM_free(L, f);
+}
+
+
+/*
+** Look for n-th local variable at line 'line' in function 'func'.
+** Returns NULL if not found.
+*/
+const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
+ int i;
+ for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
+ if (pc < f->locvars[i].endpc) { /* is variable active? */
+ local_number--;
+ if (local_number == 0)
+ return getstr(f->locvars[i].varname);
+ }
+ }
+ return NULL; /* not found */
+}
+
diff --git a/libs/lua/lua-5.3.3/lfunc.h b/libs/lua/lua-5.3.3/lfunc.h
new file mode 100644
index 0000000..2eeb0d5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lfunc.h
@@ -0,0 +1,61 @@
+/*
+** $Id: lfunc.h,v 2.15 2015/01/13 15:49:11 roberto Exp $
+** Auxiliary functions to manipulate prototypes and closures
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lfunc_h
+#define lfunc_h
+
+
+#include "lobject.h"
+
+
+#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \
+ cast(int, sizeof(TValue)*((n)-1)))
+
+#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \
+ cast(int, sizeof(TValue *)*((n)-1)))
+
+
+/* test whether thread is in 'twups' list */
+#define isintwups(L) (L->twups != L)
+
+
+/*
+** maximum number of upvalues in a closure (both C and Lua). (Value
+** must fit in a VM register.)
+*/
+#define MAXUPVAL 255
+
+
+/*
+** Upvalues for Lua closures
+*/
+struct UpVal {
+ TValue *v; /* points to stack or to its own value */
+ lu_mem refcount; /* reference counter */
+ union {
+ struct { /* (when open) */
+ UpVal *next; /* linked list */
+ int touched; /* mark to avoid cycles with dead threads */
+ } open;
+ TValue value; /* the value (when closed) */
+ } u;
+};
+
+#define upisopen(up) ((up)->v != &(up)->u.value)
+
+
+LUAI_FUNC Proto *luaF_newproto (lua_State *L);
+LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems);
+LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems);
+LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl);
+LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
+LUAI_FUNC void luaF_close (lua_State *L, StkId level);
+LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);
+LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,
+ int pc);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lgc.c b/libs/lua/lua-5.3.3/lgc.c
new file mode 100644
index 0000000..7c29fb0
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lgc.c
@@ -0,0 +1,1176 @@
+/*
+** $Id: lgc.c,v 2.212 2016/03/31 19:02:03 roberto Exp $
+** Garbage Collector
+** See Copyright Notice in lua.h
+*/
+
+#define lgc_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+
+
+/*
+** internal state for collector while inside the atomic phase. The
+** collector should never be in this state while running regular code.
+*/
+#define GCSinsideatomic (GCSpause + 1)
+
+/*
+** cost of sweeping one element (the size of a small object divided
+** by some adjust for the sweep speed)
+*/
+#define GCSWEEPCOST ((sizeof(TString) + 4) / 4)
+
+/* maximum number of elements to sweep in each single step */
+#define GCSWEEPMAX (cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4))
+
+/* cost of calling one finalizer */
+#define GCFINALIZECOST GCSWEEPCOST
+
+
+/*
+** macro to adjust 'stepmul': 'stepmul' is actually used like
+** 'stepmul / STEPMULADJ' (value chosen by tests)
+*/
+#define STEPMULADJ 200
+
+
+/*
+** macro to adjust 'pause': 'pause' is actually used like
+** 'pause / PAUSEADJ' (value chosen by tests)
+*/
+#define PAUSEADJ 100
+
+
+/*
+** 'makewhite' erases all color bits then sets only the current white
+** bit
+*/
+#define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS))
+#define makewhite(g,x) \
+ (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g)))
+
+#define white2gray(x) resetbits(x->marked, WHITEBITS)
+#define black2gray(x) resetbit(x->marked, BLACKBIT)
+
+
+#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x)))
+
+#define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n)))
+
+
+#define checkconsistency(obj) \
+ lua_longassert(!iscollectable(obj) || righttt(obj))
+
+
+#define markvalue(g,o) { checkconsistency(o); \
+ if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); }
+
+#define markobject(g,t) { if (iswhite(t)) reallymarkobject(g, obj2gco(t)); }
+
+/*
+** mark an object that can be NULL (either because it is really optional,
+** or it was stripped as debug info, or inside an uncompleted structure)
+*/
+#define markobjectN(g,t) { if (t) markobject(g,t); }
+
+static void reallymarkobject (global_State *g, GCObject *o);
+
+
+/*
+** {======================================================
+** Generic functions
+** =======================================================
+*/
+
+
+/*
+** one after last element in a hash array
+*/
+#define gnodelast(h) gnode(h, cast(size_t, sizenode(h)))
+
+
+/*
+** link collectable object 'o' into list pointed by 'p'
+*/
+#define linkgclist(o,p) ((o)->gclist = (p), (p) = obj2gco(o))
+
+
+/*
+** If key is not marked, mark its entry as dead. This allows key to be
+** collected, but keeps its entry in the table. A dead node is needed
+** when Lua looks up for a key (it may be part of a chain) and when
+** traversing a weak table (key might be removed from the table during
+** traversal). Other places never manipulate dead keys, because its
+** associated nil value is enough to signal that the entry is logically
+** empty.
+*/
+static void removeentry (Node *n) {
+ lua_assert(ttisnil(gval(n)));
+ if (valiswhite(gkey(n)))
+ setdeadvalue(wgkey(n)); /* unused and unmarked key; remove it */
+}
+
+
+/*
+** tells whether a key or value can be cleared from a weak
+** table. Non-collectable objects are never removed from weak
+** tables. Strings behave as 'values', so are never removed too. for
+** other objects: if really collected, cannot keep them; for objects
+** being finalized, keep them in keys, but not in values
+*/
+static int iscleared (global_State *g, const TValue *o) {
+ if (!iscollectable(o)) return 0;
+ else if (ttisstring(o)) {
+ markobject(g, tsvalue(o)); /* strings are 'values', so are never weak */
+ return 0;
+ }
+ else return iswhite(gcvalue(o));
+}
+
+
+/*
+** barrier that moves collector forward, that is, mark the white object
+** being pointed by a black object. (If in sweep phase, clear the black
+** object to white [sweep it] to avoid other barrier calls for this
+** same object.)
+*/
+void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {
+ global_State *g = G(L);
+ lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
+ if (keepinvariant(g)) /* must keep invariant? */
+ reallymarkobject(g, v); /* restore invariant */
+ else { /* sweep phase */
+ lua_assert(issweepphase(g));
+ makewhite(g, o); /* mark main obj. as white to avoid other barriers */
+ }
+}
+
+
+/*
+** barrier that moves collector backward, that is, mark the black object
+** pointing to a white object as gray again.
+*/
+void luaC_barrierback_ (lua_State *L, Table *t) {
+ global_State *g = G(L);
+ lua_assert(isblack(t) && !isdead(g, t));
+ black2gray(t); /* make table gray (again) */
+ linkgclist(t, g->grayagain);
+}
+
+
+/*
+** barrier for assignments to closed upvalues. Because upvalues are
+** shared among closures, it is impossible to know the color of all
+** closures pointing to it. So, we assume that the object being assigned
+** must be marked.
+*/
+void luaC_upvalbarrier_ (lua_State *L, UpVal *uv) {
+ global_State *g = G(L);
+ GCObject *o = gcvalue(uv->v);
+ lua_assert(!upisopen(uv)); /* ensured by macro luaC_upvalbarrier */
+ if (keepinvariant(g))
+ markobject(g, o);
+}
+
+
+void luaC_fix (lua_State *L, GCObject *o) {
+ global_State *g = G(L);
+ lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */
+ white2gray(o); /* they will be gray forever */
+ g->allgc = o->next; /* remove object from 'allgc' list */
+ o->next = g->fixedgc; /* link it to 'fixedgc' list */
+ g->fixedgc = o;
+}
+
+
+/*
+** create a new collectable object (with given type and size) and link
+** it to 'allgc' list.
+*/
+GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
+ global_State *g = G(L);
+ GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz));
+ o->marked = luaC_white(g);
+ o->tt = tt;
+ o->next = g->allgc;
+ g->allgc = o;
+ return o;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** Mark functions
+** =======================================================
+*/
+
+
+/*
+** mark an object. Userdata, strings, and closed upvalues are visited
+** and turned black here. Other objects are marked gray and added
+** to appropriate list to be visited (and turned black) later. (Open
+** upvalues are already linked in 'headuv' list.)
+*/
+static void reallymarkobject (global_State *g, GCObject *o) {
+ reentry:
+ white2gray(o);
+ switch (o->tt) {
+ case LUA_TSHRSTR: {
+ gray2black(o);
+ g->GCmemtrav += sizelstring(gco2ts(o)->shrlen);
+ break;
+ }
+ case LUA_TLNGSTR: {
+ gray2black(o);
+ g->GCmemtrav += sizelstring(gco2ts(o)->u.lnglen);
+ break;
+ }
+ case LUA_TUSERDATA: {
+ TValue uvalue;
+ markobjectN(g, gco2u(o)->metatable); /* mark its metatable */
+ gray2black(o);
+ g->GCmemtrav += sizeudata(gco2u(o));
+ getuservalue(g->mainthread, gco2u(o), &uvalue);
+ if (valiswhite(&uvalue)) { /* markvalue(g, &uvalue); */
+ o = gcvalue(&uvalue);
+ goto reentry;
+ }
+ break;
+ }
+ case LUA_TLCL: {
+ linkgclist(gco2lcl(o), g->gray);
+ break;
+ }
+ case LUA_TCCL: {
+ linkgclist(gco2ccl(o), g->gray);
+ break;
+ }
+ case LUA_TTABLE: {
+ linkgclist(gco2t(o), g->gray);
+ break;
+ }
+ case LUA_TTHREAD: {
+ linkgclist(gco2th(o), g->gray);
+ break;
+ }
+ case LUA_TPROTO: {
+ linkgclist(gco2p(o), g->gray);
+ break;
+ }
+ default: lua_assert(0); break;
+ }
+}
+
+
+/*
+** mark metamethods for basic types
+*/
+static void markmt (global_State *g) {
+ int i;
+ for (i=0; i < LUA_NUMTAGS; i++)
+ markobjectN(g, g->mt[i]);
+}
+
+
+/*
+** mark all objects in list of being-finalized
+*/
+static void markbeingfnz (global_State *g) {
+ GCObject *o;
+ for (o = g->tobefnz; o != NULL; o = o->next)
+ markobject(g, o);
+}
+
+
+/*
+** Mark all values stored in marked open upvalues from non-marked threads.
+** (Values from marked threads were already marked when traversing the
+** thread.) Remove from the list threads that no longer have upvalues and
+** not-marked threads.
+*/
+static void remarkupvals (global_State *g) {
+ lua_State *thread;
+ lua_State **p = &g->twups;
+ while ((thread = *p) != NULL) {
+ lua_assert(!isblack(thread)); /* threads are never black */
+ if (isgray(thread) && thread->openupval != NULL)
+ p = &thread->twups; /* keep marked thread with upvalues in the list */
+ else { /* thread is not marked or without upvalues */
+ UpVal *uv;
+ *p = thread->twups; /* remove thread from the list */
+ thread->twups = thread; /* mark that it is out of list */
+ for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) {
+ if (uv->u.open.touched) {
+ markvalue(g, uv->v); /* remark upvalue's value */
+ uv->u.open.touched = 0;
+ }
+ }
+ }
+ }
+}
+
+
+/*
+** mark root set and reset all gray lists, to start a new collection
+*/
+static void restartcollection (global_State *g) {
+ g->gray = g->grayagain = NULL;
+ g->weak = g->allweak = g->ephemeron = NULL;
+ markobject(g, g->mainthread);
+ markvalue(g, &g->l_registry);
+ markmt(g);
+ markbeingfnz(g); /* mark any finalizing object left from previous cycle */
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Traverse functions
+** =======================================================
+*/
+
+/*
+** Traverse a table with weak values and link it to proper list. During
+** propagate phase, keep it in 'grayagain' list, to be revisited in the
+** atomic phase. In the atomic phase, if table has any white value,
+** put it in 'weak' list, to be cleared.
+*/
+static void traverseweakvalue (global_State *g, Table *h) {
+ Node *n, *limit = gnodelast(h);
+ /* if there is array part, assume it may have white values (it is not
+ worth traversing it now just to check) */
+ int hasclears = (h->sizearray > 0);
+ for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */
+ checkdeadkey(n);
+ if (ttisnil(gval(n))) /* entry is empty? */
+ removeentry(n); /* remove it */
+ else {
+ lua_assert(!ttisnil(gkey(n)));
+ markvalue(g, gkey(n)); /* mark key */
+ if (!hasclears && iscleared(g, gval(n))) /* is there a white value? */
+ hasclears = 1; /* table will have to be cleared */
+ }
+ }
+ if (g->gcstate == GCSpropagate)
+ linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */
+ else if (hasclears)
+ linkgclist(h, g->weak); /* has to be cleared later */
+}
+
+
+/*
+** Traverse an ephemeron table and link it to proper list. Returns true
+** iff any object was marked during this traversal (which implies that
+** convergence has to continue). During propagation phase, keep table
+** in 'grayagain' list, to be visited again in the atomic phase. In
+** the atomic phase, if table has any white->white entry, it has to
+** be revisited during ephemeron convergence (as that key may turn
+** black). Otherwise, if it has any white key, table has to be cleared
+** (in the atomic phase).
+*/
+static int traverseephemeron (global_State *g, Table *h) {
+ int marked = 0; /* true if an object is marked in this traversal */
+ int hasclears = 0; /* true if table has white keys */
+ int hasww = 0; /* true if table has entry "white-key -> white-value" */
+ Node *n, *limit = gnodelast(h);
+ unsigned int i;
+ /* traverse array part */
+ for (i = 0; i < h->sizearray; i++) {
+ if (valiswhite(&h->array[i])) {
+ marked = 1;
+ reallymarkobject(g, gcvalue(&h->array[i]));
+ }
+ }
+ /* traverse hash part */
+ for (n = gnode(h, 0); n < limit; n++) {
+ checkdeadkey(n);
+ if (ttisnil(gval(n))) /* entry is empty? */
+ removeentry(n); /* remove it */
+ else if (iscleared(g, gkey(n))) { /* key is not marked (yet)? */
+ hasclears = 1; /* table must be cleared */
+ if (valiswhite(gval(n))) /* value not marked yet? */
+ hasww = 1; /* white-white entry */
+ }
+ else if (valiswhite(gval(n))) { /* value not marked yet? */
+ marked = 1;
+ reallymarkobject(g, gcvalue(gval(n))); /* mark it now */
+ }
+ }
+ /* link table into proper list */
+ if (g->gcstate == GCSpropagate)
+ linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */
+ else if (hasww) /* table has white->white entries? */
+ linkgclist(h, g->ephemeron); /* have to propagate again */
+ else if (hasclears) /* table has white keys? */
+ linkgclist(h, g->allweak); /* may have to clean white keys */
+ return marked;
+}
+
+
+static void traversestrongtable (global_State *g, Table *h) {
+ Node *n, *limit = gnodelast(h);
+ unsigned int i;
+ for (i = 0; i < h->sizearray; i++) /* traverse array part */
+ markvalue(g, &h->array[i]);
+ for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */
+ checkdeadkey(n);
+ if (ttisnil(gval(n))) /* entry is empty? */
+ removeentry(n); /* remove it */
+ else {
+ lua_assert(!ttisnil(gkey(n)));
+ markvalue(g, gkey(n)); /* mark key */
+ markvalue(g, gval(n)); /* mark value */
+ }
+ }
+}
+
+
+static lu_mem traversetable (global_State *g, Table *h) {
+ const char *weakkey, *weakvalue;
+ const TValue *mode = gfasttm(g, h->metatable, TM_MODE);
+ markobjectN(g, h->metatable);
+ if (mode && ttisstring(mode) && /* is there a weak mode? */
+ ((weakkey = strchr(svalue(mode), 'k')),
+ (weakvalue = strchr(svalue(mode), 'v')),
+ (weakkey || weakvalue))) { /* is really weak? */
+ black2gray(h); /* keep table gray */
+ if (!weakkey) /* strong keys? */
+ traverseweakvalue(g, h);
+ else if (!weakvalue) /* strong values? */
+ traverseephemeron(g, h);
+ else /* all weak */
+ linkgclist(h, g->allweak); /* nothing to traverse now */
+ }
+ else /* not weak */
+ traversestrongtable(g, h);
+ return sizeof(Table) + sizeof(TValue) * h->sizearray +
+ sizeof(Node) * cast(size_t, sizenode(h));
+}
+
+
+/*
+** Traverse a prototype. (While a prototype is being build, its
+** arrays can be larger than needed; the extra slots are filled with
+** NULL, so the use of 'markobjectN')
+*/
+static int traverseproto (global_State *g, Proto *f) {
+ int i;
+ if (f->cache && iswhite(f->cache))
+ f->cache = NULL; /* allow cache to be collected */
+ markobjectN(g, f->source);
+ for (i = 0; i < f->sizek; i++) /* mark literals */
+ markvalue(g, &f->k[i]);
+ for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */
+ markobjectN(g, f->upvalues[i].name);
+ for (i = 0; i < f->sizep; i++) /* mark nested protos */
+ markobjectN(g, f->p[i]);
+ for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */
+ markobjectN(g, f->locvars[i].varname);
+ return sizeof(Proto) + sizeof(Instruction) * f->sizecode +
+ sizeof(Proto *) * f->sizep +
+ sizeof(TValue) * f->sizek +
+ sizeof(int) * f->sizelineinfo +
+ sizeof(LocVar) * f->sizelocvars +
+ sizeof(Upvaldesc) * f->sizeupvalues;
+}
+
+
+static lu_mem traverseCclosure (global_State *g, CClosure *cl) {
+ int i;
+ for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */
+ markvalue(g, &cl->upvalue[i]);
+ return sizeCclosure(cl->nupvalues);
+}
+
+/*
+** open upvalues point to values in a thread, so those values should
+** be marked when the thread is traversed except in the atomic phase
+** (because then the value cannot be changed by the thread and the
+** thread may not be traversed again)
+*/
+static lu_mem traverseLclosure (global_State *g, LClosure *cl) {
+ int i;
+ markobjectN(g, cl->p); /* mark its prototype */
+ for (i = 0; i < cl->nupvalues; i++) { /* mark its upvalues */
+ UpVal *uv = cl->upvals[i];
+ if (uv != NULL) {
+ if (upisopen(uv) && g->gcstate != GCSinsideatomic)
+ uv->u.open.touched = 1; /* can be marked in 'remarkupvals' */
+ else
+ markvalue(g, uv->v);
+ }
+ }
+ return sizeLclosure(cl->nupvalues);
+}
+
+
+static lu_mem traversethread (global_State *g, lua_State *th) {
+ StkId o = th->stack;
+ if (o == NULL)
+ return 1; /* stack not completely built yet */
+ lua_assert(g->gcstate == GCSinsideatomic ||
+ th->openupval == NULL || isintwups(th));
+ for (; o < th->top; o++) /* mark live elements in the stack */
+ markvalue(g, o);
+ if (g->gcstate == GCSinsideatomic) { /* final traversal? */
+ StkId lim = th->stack + th->stacksize; /* real end of stack */
+ for (; o < lim; o++) /* clear not-marked stack slice */
+ setnilvalue(o);
+ /* 'remarkupvals' may have removed thread from 'twups' list */
+ if (!isintwups(th) && th->openupval != NULL) {
+ th->twups = g->twups; /* link it back to the list */
+ g->twups = th;
+ }
+ }
+ else if (g->gckind != KGC_EMERGENCY)
+ luaD_shrinkstack(th); /* do not change stack in emergency cycle */
+ return (sizeof(lua_State) + sizeof(TValue) * th->stacksize +
+ sizeof(CallInfo) * th->nci);
+}
+
+
+/*
+** traverse one gray object, turning it to black (except for threads,
+** which are always gray).
+*/
+static void propagatemark (global_State *g) {
+ lu_mem size;
+ GCObject *o = g->gray;
+ lua_assert(isgray(o));
+ gray2black(o);
+ switch (o->tt) {
+ case LUA_TTABLE: {
+ Table *h = gco2t(o);
+ g->gray = h->gclist; /* remove from 'gray' list */
+ size = traversetable(g, h);
+ break;
+ }
+ case LUA_TLCL: {
+ LClosure *cl = gco2lcl(o);
+ g->gray = cl->gclist; /* remove from 'gray' list */
+ size = traverseLclosure(g, cl);
+ break;
+ }
+ case LUA_TCCL: {
+ CClosure *cl = gco2ccl(o);
+ g->gray = cl->gclist; /* remove from 'gray' list */
+ size = traverseCclosure(g, cl);
+ break;
+ }
+ case LUA_TTHREAD: {
+ lua_State *th = gco2th(o);
+ g->gray = th->gclist; /* remove from 'gray' list */
+ linkgclist(th, g->grayagain); /* insert into 'grayagain' list */
+ black2gray(o);
+ size = traversethread(g, th);
+ break;
+ }
+ case LUA_TPROTO: {
+ Proto *p = gco2p(o);
+ g->gray = p->gclist; /* remove from 'gray' list */
+ size = traverseproto(g, p);
+ break;
+ }
+ default: lua_assert(0); return;
+ }
+ g->GCmemtrav += size;
+}
+
+
+static void propagateall (global_State *g) {
+ while (g->gray) propagatemark(g);
+}
+
+
+static void convergeephemerons (global_State *g) {
+ int changed;
+ do {
+ GCObject *w;
+ GCObject *next = g->ephemeron; /* get ephemeron list */
+ g->ephemeron = NULL; /* tables may return to this list when traversed */
+ changed = 0;
+ while ((w = next) != NULL) {
+ next = gco2t(w)->gclist;
+ if (traverseephemeron(g, gco2t(w))) { /* traverse marked some value? */
+ propagateall(g); /* propagate changes */
+ changed = 1; /* will have to revisit all ephemeron tables */
+ }
+ }
+ } while (changed);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Sweep Functions
+** =======================================================
+*/
+
+
+/*
+** clear entries with unmarked keys from all weaktables in list 'l' up
+** to element 'f'
+*/
+static void clearkeys (global_State *g, GCObject *l, GCObject *f) {
+ for (; l != f; l = gco2t(l)->gclist) {
+ Table *h = gco2t(l);
+ Node *n, *limit = gnodelast(h);
+ for (n = gnode(h, 0); n < limit; n++) {
+ if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) {
+ setnilvalue(gval(n)); /* remove value ... */
+ removeentry(n); /* and remove entry from table */
+ }
+ }
+ }
+}
+
+
+/*
+** clear entries with unmarked values from all weaktables in list 'l' up
+** to element 'f'
+*/
+static void clearvalues (global_State *g, GCObject *l, GCObject *f) {
+ for (; l != f; l = gco2t(l)->gclist) {
+ Table *h = gco2t(l);
+ Node *n, *limit = gnodelast(h);
+ unsigned int i;
+ for (i = 0; i < h->sizearray; i++) {
+ TValue *o = &h->array[i];
+ if (iscleared(g, o)) /* value was collected? */
+ setnilvalue(o); /* remove value */
+ }
+ for (n = gnode(h, 0); n < limit; n++) {
+ if (!ttisnil(gval(n)) && iscleared(g, gval(n))) {
+ setnilvalue(gval(n)); /* remove value ... */
+ removeentry(n); /* and remove entry from table */
+ }
+ }
+ }
+}
+
+
+void luaC_upvdeccount (lua_State *L, UpVal *uv) {
+ lua_assert(uv->refcount > 0);
+ uv->refcount--;
+ if (uv->refcount == 0 && !upisopen(uv))
+ luaM_free(L, uv);
+}
+
+
+static void freeLclosure (lua_State *L, LClosure *cl) {
+ int i;
+ for (i = 0; i < cl->nupvalues; i++) {
+ UpVal *uv = cl->upvals[i];
+ if (uv)
+ luaC_upvdeccount(L, uv);
+ }
+ luaM_freemem(L, cl, sizeLclosure(cl->nupvalues));
+}
+
+
+static void freeobj (lua_State *L, GCObject *o) {
+ switch (o->tt) {
+ case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;
+ case LUA_TLCL: {
+ freeLclosure(L, gco2lcl(o));
+ break;
+ }
+ case LUA_TCCL: {
+ luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues));
+ break;
+ }
+ case LUA_TTABLE: luaH_free(L, gco2t(o)); break;
+ case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break;
+ case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break;
+ case LUA_TSHRSTR:
+ luaS_remove(L, gco2ts(o)); /* remove it from hash table */
+ luaM_freemem(L, o, sizelstring(gco2ts(o)->shrlen));
+ break;
+ case LUA_TLNGSTR: {
+ luaM_freemem(L, o, sizelstring(gco2ts(o)->u.lnglen));
+ break;
+ }
+ default: lua_assert(0);
+ }
+}
+
+
+#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM)
+static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count);
+
+
+/*
+** sweep at most 'count' elements from a list of GCObjects erasing dead
+** objects, where a dead object is one marked with the old (non current)
+** white; change all non-dead objects back to white, preparing for next
+** collection cycle. Return where to continue the traversal or NULL if
+** list is finished.
+*/
+static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
+ global_State *g = G(L);
+ int ow = otherwhite(g);
+ int white = luaC_white(g); /* current white */
+ while (*p != NULL && count-- > 0) {
+ GCObject *curr = *p;
+ int marked = curr->marked;
+ if (isdeadm(ow, marked)) { /* is 'curr' dead? */
+ *p = curr->next; /* remove 'curr' from list */
+ freeobj(L, curr); /* erase 'curr' */
+ }
+ else { /* change mark to 'white' */
+ curr->marked = cast_byte((marked & maskcolors) | white);
+ p = &curr->next; /* go to next element */
+ }
+ }
+ return (*p == NULL) ? NULL : p;
+}
+
+
+/*
+** sweep a list until a live object (or end of list)
+*/
+static GCObject **sweeptolive (lua_State *L, GCObject **p) {
+ GCObject **old = p;
+ do {
+ p = sweeplist(L, p, 1);
+ } while (p == old);
+ return p;
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Finalization
+** =======================================================
+*/
+
+/*
+** If possible, shrink string table
+*/
+static void checkSizes (lua_State *L, global_State *g) {
+ if (g->gckind != KGC_EMERGENCY) {
+ l_mem olddebt = g->GCdebt;
+ if (g->strt.nuse < g->strt.size / 4) /* string table too big? */
+ luaS_resize(L, g->strt.size / 2); /* shrink it a little */
+ g->GCestimate += g->GCdebt - olddebt; /* update estimate */
+ }
+}
+
+
+static GCObject *udata2finalize (global_State *g) {
+ GCObject *o = g->tobefnz; /* get first element */
+ lua_assert(tofinalize(o));
+ g->tobefnz = o->next; /* remove it from 'tobefnz' list */
+ o->next = g->allgc; /* return it to 'allgc' list */
+ g->allgc = o;
+ resetbit(o->marked, FINALIZEDBIT); /* object is "normal" again */
+ if (issweepphase(g))
+ makewhite(g, o); /* "sweep" object */
+ return o;
+}
+
+
+static void dothecall (lua_State *L, void *ud) {
+ UNUSED(ud);
+ luaD_callnoyield(L, L->top - 2, 0);
+}
+
+
+static void GCTM (lua_State *L, int propagateerrors) {
+ global_State *g = G(L);
+ const TValue *tm;
+ TValue v;
+ setgcovalue(L, &v, udata2finalize(g));
+ tm = luaT_gettmbyobj(L, &v, TM_GC);
+ if (tm != NULL && ttisfunction(tm)) { /* is there a finalizer? */
+ int status;
+ lu_byte oldah = L->allowhook;
+ int running = g->gcrunning;
+ L->allowhook = 0; /* stop debug hooks during GC metamethod */
+ g->gcrunning = 0; /* avoid GC steps */
+ setobj2s(L, L->top, tm); /* push finalizer... */
+ setobj2s(L, L->top + 1, &v); /* ... and its argument */
+ L->top += 2; /* and (next line) call the finalizer */
+ status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0);
+ L->allowhook = oldah; /* restore hooks */
+ g->gcrunning = running; /* restore state */
+ if (status != LUA_OK && propagateerrors) { /* error while running __gc? */
+ if (status == LUA_ERRRUN) { /* is there an error object? */
+ const char *msg = (ttisstring(L->top - 1))
+ ? svalue(L->top - 1)
+ : "no message";
+ luaO_pushfstring(L, "error in __gc metamethod (%s)", msg);
+ status = LUA_ERRGCMM; /* error in __gc metamethod */
+ }
+ luaD_throw(L, status); /* re-throw error */
+ }
+ }
+}
+
+
+/*
+** call a few (up to 'g->gcfinnum') finalizers
+*/
+static int runafewfinalizers (lua_State *L) {
+ global_State *g = G(L);
+ unsigned int i;
+ lua_assert(!g->tobefnz || g->gcfinnum > 0);
+ for (i = 0; g->tobefnz && i < g->gcfinnum; i++)
+ GCTM(L, 1); /* call one finalizer */
+ g->gcfinnum = (!g->tobefnz) ? 0 /* nothing more to finalize? */
+ : g->gcfinnum * 2; /* else call a few more next time */
+ return i;
+}
+
+
+/*
+** call all pending finalizers
+*/
+static void callallpendingfinalizers (lua_State *L) {
+ global_State *g = G(L);
+ while (g->tobefnz)
+ GCTM(L, 0);
+}
+
+
+/*
+** find last 'next' field in list 'p' list (to add elements in its end)
+*/
+static GCObject **findlast (GCObject **p) {
+ while (*p != NULL)
+ p = &(*p)->next;
+ return p;
+}
+
+
+/*
+** move all unreachable objects (or 'all' objects) that need
+** finalization from list 'finobj' to list 'tobefnz' (to be finalized)
+*/
+static void separatetobefnz (global_State *g, int all) {
+ GCObject *curr;
+ GCObject **p = &g->finobj;
+ GCObject **lastnext = findlast(&g->tobefnz);
+ while ((curr = *p) != NULL) { /* traverse all finalizable objects */
+ lua_assert(tofinalize(curr));
+ if (!(iswhite(curr) || all)) /* not being collected? */
+ p = &curr->next; /* don't bother with it */
+ else {
+ *p = curr->next; /* remove 'curr' from 'finobj' list */
+ curr->next = *lastnext; /* link at the end of 'tobefnz' list */
+ *lastnext = curr;
+ lastnext = &curr->next;
+ }
+ }
+}
+
+
+/*
+** if object 'o' has a finalizer, remove it from 'allgc' list (must
+** search the list to find it) and link it in 'finobj' list.
+*/
+void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {
+ global_State *g = G(L);
+ if (tofinalize(o) || /* obj. is already marked... */
+ gfasttm(g, mt, TM_GC) == NULL) /* or has no finalizer? */
+ return; /* nothing to be done */
+ else { /* move 'o' to 'finobj' list */
+ GCObject **p;
+ if (issweepphase(g)) {
+ makewhite(g, o); /* "sweep" object 'o' */
+ if (g->sweepgc == &o->next) /* should not remove 'sweepgc' object */
+ g->sweepgc = sweeptolive(L, g->sweepgc); /* change 'sweepgc' */
+ }
+ /* search for pointer pointing to 'o' */
+ for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ }
+ *p = o->next; /* remove 'o' from 'allgc' list */
+ o->next = g->finobj; /* link it in 'finobj' list */
+ g->finobj = o;
+ l_setbit(o->marked, FINALIZEDBIT); /* mark it as such */
+ }
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** GC control
+** =======================================================
+*/
+
+
+/*
+** Set a reasonable "time" to wait before starting a new GC cycle; cycle
+** will start when memory use hits threshold. (Division by 'estimate'
+** should be OK: it cannot be zero (because Lua cannot even start with
+** less than PAUSEADJ bytes).
+*/
+static void setpause (global_State *g) {
+ l_mem threshold, debt;
+ l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */
+ lua_assert(estimate > 0);
+ threshold = (g->gcpause < MAX_LMEM / estimate) /* overflow? */
+ ? estimate * g->gcpause /* no overflow */
+ : MAX_LMEM; /* overflow; truncate to maximum */
+ debt = gettotalbytes(g) - threshold;
+ luaE_setdebt(g, debt);
+}
+
+
+/*
+** Enter first sweep phase.
+** The call to 'sweeplist' tries to make pointer point to an object
+** inside the list (instead of to the header), so that the real sweep do
+** not need to skip objects created between "now" and the start of the
+** real sweep.
+*/
+static void entersweep (lua_State *L) {
+ global_State *g = G(L);
+ g->gcstate = GCSswpallgc;
+ lua_assert(g->sweepgc == NULL);
+ g->sweepgc = sweeplist(L, &g->allgc, 1);
+}
+
+
+void luaC_freeallobjects (lua_State *L) {
+ global_State *g = G(L);
+ separatetobefnz(g, 1); /* separate all objects with finalizers */
+ lua_assert(g->finobj == NULL);
+ callallpendingfinalizers(L);
+ lua_assert(g->tobefnz == NULL);
+ g->currentwhite = WHITEBITS; /* this "white" makes all objects look dead */
+ g->gckind = KGC_NORMAL;
+ sweepwholelist(L, &g->finobj);
+ sweepwholelist(L, &g->allgc);
+ sweepwholelist(L, &g->fixedgc); /* collect fixed objects */
+ lua_assert(g->strt.nuse == 0);
+}
+
+
+static l_mem atomic (lua_State *L) {
+ global_State *g = G(L);
+ l_mem work;
+ GCObject *origweak, *origall;
+ GCObject *grayagain = g->grayagain; /* save original list */
+ lua_assert(g->ephemeron == NULL && g->weak == NULL);
+ lua_assert(!iswhite(g->mainthread));
+ g->gcstate = GCSinsideatomic;
+ g->GCmemtrav = 0; /* start counting work */
+ markobject(g, L); /* mark running thread */
+ /* registry and global metatables may be changed by API */
+ markvalue(g, &g->l_registry);
+ markmt(g); /* mark global metatables */
+ /* remark occasional upvalues of (maybe) dead threads */
+ remarkupvals(g);
+ propagateall(g); /* propagate changes */
+ work = g->GCmemtrav; /* stop counting (do not recount 'grayagain') */
+ g->gray = grayagain;
+ propagateall(g); /* traverse 'grayagain' list */
+ g->GCmemtrav = 0; /* restart counting */
+ convergeephemerons(g);
+ /* at this point, all strongly accessible objects are marked. */
+ /* Clear values from weak tables, before checking finalizers */
+ clearvalues(g, g->weak, NULL);
+ clearvalues(g, g->allweak, NULL);
+ origweak = g->weak; origall = g->allweak;
+ work += g->GCmemtrav; /* stop counting (objects being finalized) */
+ separatetobefnz(g, 0); /* separate objects to be finalized */
+ g->gcfinnum = 1; /* there may be objects to be finalized */
+ markbeingfnz(g); /* mark objects that will be finalized */
+ propagateall(g); /* remark, to propagate 'resurrection' */
+ g->GCmemtrav = 0; /* restart counting */
+ convergeephemerons(g);
+ /* at this point, all resurrected objects are marked. */
+ /* remove dead objects from weak tables */
+ clearkeys(g, g->ephemeron, NULL); /* clear keys from all ephemeron tables */
+ clearkeys(g, g->allweak, NULL); /* clear keys from all 'allweak' tables */
+ /* clear values from resurrected weak tables */
+ clearvalues(g, g->weak, origweak);
+ clearvalues(g, g->allweak, origall);
+ luaS_clearcache(g);
+ g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */
+ work += g->GCmemtrav; /* complete counting */
+ return work; /* estimate of memory marked by 'atomic' */
+}
+
+
+static lu_mem sweepstep (lua_State *L, global_State *g,
+ int nextstate, GCObject **nextlist) {
+ if (g->sweepgc) {
+ l_mem olddebt = g->GCdebt;
+ g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
+ g->GCestimate += g->GCdebt - olddebt; /* update estimate */
+ if (g->sweepgc) /* is there still something to sweep? */
+ return (GCSWEEPMAX * GCSWEEPCOST);
+ }
+ /* else enter next state */
+ g->gcstate = nextstate;
+ g->sweepgc = nextlist;
+ return 0;
+}
+
+
+static lu_mem singlestep (lua_State *L) {
+ global_State *g = G(L);
+ switch (g->gcstate) {
+ case GCSpause: {
+ g->GCmemtrav = g->strt.size * sizeof(GCObject*);
+ restartcollection(g);
+ g->gcstate = GCSpropagate;
+ return g->GCmemtrav;
+ }
+ case GCSpropagate: {
+ g->GCmemtrav = 0;
+ lua_assert(g->gray);
+ propagatemark(g);
+ if (g->gray == NULL) /* no more gray objects? */
+ g->gcstate = GCSatomic; /* finish propagate phase */
+ return g->GCmemtrav; /* memory traversed in this step */
+ }
+ case GCSatomic: {
+ lu_mem work;
+ propagateall(g); /* make sure gray list is empty */
+ work = atomic(L); /* work is what was traversed by 'atomic' */
+ entersweep(L);
+ g->GCestimate = gettotalbytes(g); /* first estimate */;
+ return work;
+ }
+ case GCSswpallgc: { /* sweep "regular" objects */
+ return sweepstep(L, g, GCSswpfinobj, &g->finobj);
+ }
+ case GCSswpfinobj: { /* sweep objects with finalizers */
+ return sweepstep(L, g, GCSswptobefnz, &g->tobefnz);
+ }
+ case GCSswptobefnz: { /* sweep objects to be finalized */
+ return sweepstep(L, g, GCSswpend, NULL);
+ }
+ case GCSswpend: { /* finish sweeps */
+ makewhite(g, g->mainthread); /* sweep main thread */
+ checkSizes(L, g);
+ g->gcstate = GCScallfin;
+ return 0;
+ }
+ case GCScallfin: { /* call remaining finalizers */
+ if (g->tobefnz && g->gckind != KGC_EMERGENCY) {
+ int n = runafewfinalizers(L);
+ return (n * GCFINALIZECOST);
+ }
+ else { /* emergency mode or no more finalizers */
+ g->gcstate = GCSpause; /* finish collection */
+ return 0;
+ }
+ }
+ default: lua_assert(0); return 0;
+ }
+}
+
+
+/*
+** advances the garbage collector until it reaches a state allowed
+** by 'statemask'
+*/
+void luaC_runtilstate (lua_State *L, int statesmask) {
+ global_State *g = G(L);
+ while (!testbit(statesmask, g->gcstate))
+ singlestep(L);
+}
+
+
+/*
+** get GC debt and convert it from Kb to 'work units' (avoid zero debt
+** and overflows)
+*/
+static l_mem getdebt (global_State *g) {
+ l_mem debt = g->GCdebt;
+ int stepmul = g->gcstepmul;
+ if (debt <= 0) return 0; /* minimal debt */
+ else {
+ debt = (debt / STEPMULADJ) + 1;
+ debt = (debt < MAX_LMEM / stepmul) ? debt * stepmul : MAX_LMEM;
+ return debt;
+ }
+}
+
+/*
+** performs a basic GC step when collector is running
+*/
+void luaC_step (lua_State *L) {
+ global_State *g = G(L);
+ l_mem debt = getdebt(g); /* GC deficit (be paid now) */
+ if (!g->gcrunning) { /* not running? */
+ luaE_setdebt(g, -GCSTEPSIZE * 10); /* avoid being called too often */
+ return;
+ }
+ do { /* repeat until pause or enough "credit" (negative debt) */
+ lu_mem work = singlestep(L); /* perform one single step */
+ debt -= work;
+ } while (debt > -GCSTEPSIZE && g->gcstate != GCSpause);
+ if (g->gcstate == GCSpause)
+ setpause(g); /* pause until next cycle */
+ else {
+ debt = (debt / g->gcstepmul) * STEPMULADJ; /* convert 'work units' to Kb */
+ luaE_setdebt(g, debt);
+ runafewfinalizers(L);
+ }
+}
+
+
+/*
+** Performs a full GC cycle; if 'isemergency', set a flag to avoid
+** some operations which could change the interpreter state in some
+** unexpected ways (running finalizers and shrinking some structures).
+** Before running the collection, check 'keepinvariant'; if it is true,
+** there may be some objects marked as black, so the collector has
+** to sweep all objects to turn them back to white (as white has not
+** changed, nothing will be collected).
+*/
+void luaC_fullgc (lua_State *L, int isemergency) {
+ global_State *g = G(L);
+ lua_assert(g->gckind == KGC_NORMAL);
+ if (isemergency) g->gckind = KGC_EMERGENCY; /* set flag */
+ if (keepinvariant(g)) { /* black objects? */
+ entersweep(L); /* sweep everything to turn them back to white */
+ }
+ /* finish any pending sweep phase to start a new cycle */
+ luaC_runtilstate(L, bitmask(GCSpause));
+ luaC_runtilstate(L, ~bitmask(GCSpause)); /* start new collection */
+ luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */
+ /* estimate must be correct after a full GC cycle */
+ lua_assert(g->GCestimate == gettotalbytes(g));
+ luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */
+ g->gckind = KGC_NORMAL;
+ setpause(g);
+}
+
+/* }====================================================== */
+
+
diff --git a/libs/lua/lua-5.3.3/lgc.h b/libs/lua/lua-5.3.3/lgc.h
new file mode 100644
index 0000000..aed3e18
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lgc.h
@@ -0,0 +1,147 @@
+/*
+** $Id: lgc.h,v 2.91 2015/12/21 13:02:14 roberto Exp $
+** Garbage Collector
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lgc_h
+#define lgc_h
+
+
+#include "lobject.h"
+#include "lstate.h"
+
+/*
+** Collectable objects may have one of three colors: white, which
+** means the object is not marked; gray, which means the
+** object is marked, but its references may be not marked; and
+** black, which means that the object and all its references are marked.
+** The main invariant of the garbage collector, while marking objects,
+** is that a black object can never point to a white one. Moreover,
+** any gray object must be in a "gray list" (gray, grayagain, weak,
+** allweak, ephemeron) so that it can be visited again before finishing
+** the collection cycle. These lists have no meaning when the invariant
+** is not being enforced (e.g., sweep phase).
+*/
+
+
+
+/* how much to allocate before next GC step */
+#if !defined(GCSTEPSIZE)
+/* ~100 small strings */
+#define GCSTEPSIZE (cast_int(100 * sizeof(TString)))
+#endif
+
+
+/*
+** Possible states of the Garbage Collector
+*/
+#define GCSpropagate 0
+#define GCSatomic 1
+#define GCSswpallgc 2
+#define GCSswpfinobj 3
+#define GCSswptobefnz 4
+#define GCSswpend 5
+#define GCScallfin 6
+#define GCSpause 7
+
+
+#define issweepphase(g) \
+ (GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend)
+
+
+/*
+** macro to tell when main invariant (white objects cannot point to black
+** ones) must be kept. During a collection, the sweep
+** phase may break the invariant, as objects turned white may point to
+** still-black objects. The invariant is restored when sweep ends and
+** all objects are white again.
+*/
+
+#define keepinvariant(g) ((g)->gcstate <= GCSatomic)
+
+
+/*
+** some useful bit tricks
+*/
+#define resetbits(x,m) ((x) &= cast(lu_byte, ~(m)))
+#define setbits(x,m) ((x) |= (m))
+#define testbits(x,m) ((x) & (m))
+#define bitmask(b) (1<<(b))
+#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2))
+#define l_setbit(x,b) setbits(x, bitmask(b))
+#define resetbit(x,b) resetbits(x, bitmask(b))
+#define testbit(x,b) testbits(x, bitmask(b))
+
+
+/* Layout for bit use in 'marked' field: */
+#define WHITE0BIT 0 /* object is white (type 0) */
+#define WHITE1BIT 1 /* object is white (type 1) */
+#define BLACKBIT 2 /* object is black */
+#define FINALIZEDBIT 3 /* object has been marked for finalization */
+/* bit 7 is currently used by tests (luaL_checkmemory) */
+
+#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT)
+
+
+#define iswhite(x) testbits((x)->marked, WHITEBITS)
+#define isblack(x) testbit((x)->marked, BLACKBIT)
+#define isgray(x) /* neither white nor black */ \
+ (!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT)))
+
+#define tofinalize(x) testbit((x)->marked, FINALIZEDBIT)
+
+#define otherwhite(g) ((g)->currentwhite ^ WHITEBITS)
+#define isdeadm(ow,m) (!(((m) ^ WHITEBITS) & (ow)))
+#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked)
+
+#define changewhite(x) ((x)->marked ^= WHITEBITS)
+#define gray2black(x) l_setbit((x)->marked, BLACKBIT)
+
+#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS)
+
+
+/*
+** Does one step of collection when debt becomes positive. 'pre'/'pos'
+** allows some adjustments to be done only when needed. macro
+** 'condchangemem' is used only for heavy tests (forcing a full
+** GC cycle on every opportunity)
+*/
+#define luaC_condGC(L,pre,pos) \
+ { if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \
+ condchangemem(L,pre,pos); }
+
+/* more often than not, 'pre'/'pos' are empty */
+#define luaC_checkGC(L) luaC_condGC(L,(void)0,(void)0)
+
+
+#define luaC_barrier(L,p,v) ( \
+ (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \
+ luaC_barrier_(L,obj2gco(p),gcvalue(v)) : cast_void(0))
+
+#define luaC_barrierback(L,p,v) ( \
+ (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \
+ luaC_barrierback_(L,p) : cast_void(0))
+
+#define luaC_objbarrier(L,p,o) ( \
+ (isblack(p) && iswhite(o)) ? \
+ luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0))
+
+#define luaC_upvalbarrier(L,uv) ( \
+ (iscollectable((uv)->v) && !upisopen(uv)) ? \
+ luaC_upvalbarrier_(L,uv) : cast_void(0))
+
+LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o);
+LUAI_FUNC void luaC_freeallobjects (lua_State *L);
+LUAI_FUNC void luaC_step (lua_State *L);
+LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);
+LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);
+LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz);
+LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);
+LUAI_FUNC void luaC_barrierback_ (lua_State *L, Table *o);
+LUAI_FUNC void luaC_upvalbarrier_ (lua_State *L, UpVal *uv);
+LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);
+LUAI_FUNC void luaC_upvdeccount (lua_State *L, UpVal *uv);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/linit.c b/libs/lua/lua-5.3.3/linit.c
new file mode 100644
index 0000000..8ce94cc
--- /dev/null
+++ b/libs/lua/lua-5.3.3/linit.c
@@ -0,0 +1,68 @@
+/*
+** $Id: linit.c,v 1.38 2015/01/05 13:48:33 roberto Exp $
+** Initialization of libraries for lua.c and other clients
+** See Copyright Notice in lua.h
+*/
+
+
+#define linit_c
+#define LUA_LIB
+
+/*
+** If you embed Lua in your program and need to open the standard
+** libraries, call luaL_openlibs in your program. If you need a
+** different set of libraries, copy this file to your project and edit
+** it to suit your needs.
+**
+** You can also *preload* libraries, so that a later 'require' can
+** open the library, which is already linked to the application.
+** For that, do the following code:
+**
+** luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
+** lua_pushcfunction(L, luaopen_modname);
+** lua_setfield(L, -2, modname);
+** lua_pop(L, 1); // remove _PRELOAD table
+*/
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "lualib.h"
+#include "lauxlib.h"
+
+
+/*
+** these libs are loaded by lua.c and are readily available to any Lua
+** program
+*/
+static const luaL_Reg loadedlibs[] = {
+ {"_G", luaopen_base},
+ {LUA_LOADLIBNAME, luaopen_package},
+ {LUA_COLIBNAME, luaopen_coroutine},
+ {LUA_TABLIBNAME, luaopen_table},
+ {LUA_IOLIBNAME, luaopen_io},
+ {LUA_OSLIBNAME, luaopen_os},
+ {LUA_STRLIBNAME, luaopen_string},
+ {LUA_MATHLIBNAME, luaopen_math},
+ {LUA_UTF8LIBNAME, luaopen_utf8},
+ {LUA_DBLIBNAME, luaopen_debug},
+#if defined(LUA_COMPAT_BITLIB)
+ {LUA_BITLIBNAME, luaopen_bit32},
+#endif
+ {NULL, NULL}
+};
+
+
+LUALIB_API void luaL_openlibs (lua_State *L) {
+ const luaL_Reg *lib;
+ /* "require" functions from 'loadedlibs' and set results to global table */
+ for (lib = loadedlibs; lib->func; lib++) {
+ luaL_requiref(L, lib->name, lib->func, 1);
+ lua_pop(L, 1); /* remove lib */
+ }
+}
+
diff --git a/libs/lua/lua-5.3.3/liolib.c b/libs/lua/lua-5.3.3/liolib.c
new file mode 100644
index 0000000..aa78e59
--- /dev/null
+++ b/libs/lua/lua-5.3.3/liolib.c
@@ -0,0 +1,768 @@
+/*
+** $Id: liolib.c,v 2.149 2016/05/02 14:03:19 roberto Exp $
+** Standard I/O (and system) library
+** See Copyright Notice in lua.h
+*/
+
+#define liolib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <ctype.h>
+#include <errno.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+
+
+/*
+** Change this macro to accept other modes for 'fopen' besides
+** the standard ones.
+*/
+#if !defined(l_checkmode)
+
+/* accepted extensions to 'mode' in 'fopen' */
+#if !defined(L_MODEEXT)
+#define L_MODEEXT "b"
+#endif
+
+/* Check whether 'mode' matches '[rwa]%+?[L_MODEEXT]*' */
+#define l_checkmode(mode) \
+ (*mode != '\0' && strchr("rwa", *(mode++)) != NULL && \
+ (*mode != '+' || (++mode, 1)) && /* skip if char is '+' */ \
+ (strspn(mode, L_MODEEXT) == strlen(mode)))
+
+#endif
+
+/*
+** {======================================================
+** l_popen spawns a new process connected to the current
+** one through the file streams.
+** =======================================================
+*/
+
+#if !defined(l_popen) /* { */
+
+#if defined(LUA_USE_POSIX) /* { */
+
+#define l_popen(L,c,m) (fflush(NULL), popen(c,m))
+#define l_pclose(L,file) (pclose(file))
+
+#elif defined(LUA_USE_WINDOWS) /* }{ */
+
+#define l_popen(L,c,m) (_popen(c,m))
+#define l_pclose(L,file) (_pclose(file))
+
+#else /* }{ */
+
+/* ISO C definitions */
+#define l_popen(L,c,m) \
+ ((void)((void)c, m), \
+ luaL_error(L, "'popen' not supported"), \
+ (FILE*)0)
+#define l_pclose(L,file) ((void)L, (void)file, -1)
+
+#endif /* } */
+
+#endif /* } */
+
+/* }====================================================== */
+
+
+#if !defined(l_getc) /* { */
+
+#if defined(LUA_USE_POSIX)
+#define l_getc(f) getc_unlocked(f)
+#define l_lockfile(f) flockfile(f)
+#define l_unlockfile(f) funlockfile(f)
+#else
+#define l_getc(f) getc(f)
+#define l_lockfile(f) ((void)0)
+#define l_unlockfile(f) ((void)0)
+#endif
+
+#endif /* } */
+
+
+/*
+** {======================================================
+** l_fseek: configuration for longer offsets
+** =======================================================
+*/
+
+#if !defined(l_fseek) /* { */
+
+#if defined(LUA_USE_POSIX) /* { */
+
+#include <sys/types.h>
+
+#define l_fseek(f,o,w) fseeko(f,o,w)
+#define l_ftell(f) ftello(f)
+#define l_seeknum off_t
+
+#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \
+ && defined(_MSC_VER) && (_MSC_VER >= 1400) /* }{ */
+
+/* Windows (but not DDK) and Visual C++ 2005 or higher */
+#define l_fseek(f,o,w) _fseeki64(f,o,w)
+#define l_ftell(f) _ftelli64(f)
+#define l_seeknum __int64
+
+#else /* }{ */
+
+/* ISO C definitions */
+#define l_fseek(f,o,w) fseek(f,o,w)
+#define l_ftell(f) ftell(f)
+#define l_seeknum long
+
+#endif /* } */
+
+#endif /* } */
+
+/* }====================================================== */
+
+
+#define IO_PREFIX "_IO_"
+#define IOPREF_LEN (sizeof(IO_PREFIX)/sizeof(char) - 1)
+#define IO_INPUT (IO_PREFIX "input")
+#define IO_OUTPUT (IO_PREFIX "output")
+
+
+typedef luaL_Stream LStream;
+
+
+#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE))
+
+#define isclosed(p) ((p)->closef == NULL)
+
+
+static int io_type (lua_State *L) {
+ LStream *p;
+ luaL_checkany(L, 1);
+ p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE);
+ if (p == NULL)
+ lua_pushnil(L); /* not a file */
+ else if (isclosed(p))
+ lua_pushliteral(L, "closed file");
+ else
+ lua_pushliteral(L, "file");
+ return 1;
+}
+
+
+static int f_tostring (lua_State *L) {
+ LStream *p = tolstream(L);
+ if (isclosed(p))
+ lua_pushliteral(L, "file (closed)");
+ else
+ lua_pushfstring(L, "file (%p)", p->f);
+ return 1;
+}
+
+
+static FILE *tofile (lua_State *L) {
+ LStream *p = tolstream(L);
+ if (isclosed(p))
+ luaL_error(L, "attempt to use a closed file");
+ lua_assert(p->f);
+ return p->f;
+}
+
+
+/*
+** When creating file handles, always creates a 'closed' file handle
+** before opening the actual file; so, if there is a memory error, the
+** handle is in a consistent state.
+*/
+static LStream *newprefile (lua_State *L) {
+ LStream *p = (LStream *)lua_newuserdata(L, sizeof(LStream));
+ p->closef = NULL; /* mark file handle as 'closed' */
+ luaL_setmetatable(L, LUA_FILEHANDLE);
+ return p;
+}
+
+
+/*
+** Calls the 'close' function from a file handle. The 'volatile' avoids
+** a bug in some versions of the Clang compiler (e.g., clang 3.0 for
+** 32 bits).
+*/
+static int aux_close (lua_State *L) {
+ LStream *p = tolstream(L);
+ volatile lua_CFunction cf = p->closef;
+ p->closef = NULL; /* mark stream as closed */
+ return (*cf)(L); /* close it */
+}
+
+
+static int io_close (lua_State *L) {
+ if (lua_isnone(L, 1)) /* no argument? */
+ lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use standard output */
+ tofile(L); /* make sure argument is an open stream */
+ return aux_close(L);
+}
+
+
+static int f_gc (lua_State *L) {
+ LStream *p = tolstream(L);
+ if (!isclosed(p) && p->f != NULL)
+ aux_close(L); /* ignore closed and incompletely open files */
+ return 0;
+}
+
+
+/*
+** function to close regular files
+*/
+static int io_fclose (lua_State *L) {
+ LStream *p = tolstream(L);
+ int res = fclose(p->f);
+ return luaL_fileresult(L, (res == 0), NULL);
+}
+
+
+static LStream *newfile (lua_State *L) {
+ LStream *p = newprefile(L);
+ p->f = NULL;
+ p->closef = &io_fclose;
+ return p;
+}
+
+
+static void opencheck (lua_State *L, const char *fname, const char *mode) {
+ LStream *p = newfile(L);
+ p->f = fopen(fname, mode);
+ if (p->f == NULL)
+ luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno));
+}
+
+
+static int io_open (lua_State *L) {
+ const char *filename = luaL_checkstring(L, 1);
+ const char *mode = luaL_optstring(L, 2, "r");
+ LStream *p = newfile(L);
+ const char *md = mode; /* to traverse/check mode */
+ luaL_argcheck(L, l_checkmode(md), 2, "invalid mode");
+ p->f = fopen(filename, mode);
+ return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
+}
+
+
+/*
+** function to close 'popen' files
+*/
+static int io_pclose (lua_State *L) {
+ LStream *p = tolstream(L);
+ return luaL_execresult(L, l_pclose(L, p->f));
+}
+
+
+static int io_popen (lua_State *L) {
+ const char *filename = luaL_checkstring(L, 1);
+ const char *mode = luaL_optstring(L, 2, "r");
+ LStream *p = newprefile(L);
+ p->f = l_popen(L, filename, mode);
+ p->closef = &io_pclose;
+ return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
+}
+
+
+static int io_tmpfile (lua_State *L) {
+ LStream *p = newfile(L);
+ p->f = tmpfile();
+ return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1;
+}
+
+
+static FILE *getiofile (lua_State *L, const char *findex) {
+ LStream *p;
+ lua_getfield(L, LUA_REGISTRYINDEX, findex);
+ p = (LStream *)lua_touserdata(L, -1);
+ if (isclosed(p))
+ luaL_error(L, "standard %s file is closed", findex + IOPREF_LEN);
+ return p->f;
+}
+
+
+static int g_iofile (lua_State *L, const char *f, const char *mode) {
+ if (!lua_isnoneornil(L, 1)) {
+ const char *filename = lua_tostring(L, 1);
+ if (filename)
+ opencheck(L, filename, mode);
+ else {
+ tofile(L); /* check that it's a valid file handle */
+ lua_pushvalue(L, 1);
+ }
+ lua_setfield(L, LUA_REGISTRYINDEX, f);
+ }
+ /* return current value */
+ lua_getfield(L, LUA_REGISTRYINDEX, f);
+ return 1;
+}
+
+
+static int io_input (lua_State *L) {
+ return g_iofile(L, IO_INPUT, "r");
+}
+
+
+static int io_output (lua_State *L) {
+ return g_iofile(L, IO_OUTPUT, "w");
+}
+
+
+static int io_readline (lua_State *L);
+
+
+/*
+** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit
+** in the limit for upvalues of a closure)
+*/
+#define MAXARGLINE 250
+
+static void aux_lines (lua_State *L, int toclose) {
+ int n = lua_gettop(L) - 1; /* number of arguments to read */
+ luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments");
+ lua_pushinteger(L, n); /* number of arguments to read */
+ lua_pushboolean(L, toclose); /* close/not close file when finished */
+ lua_rotate(L, 2, 2); /* move 'n' and 'toclose' to their positions */
+ lua_pushcclosure(L, io_readline, 3 + n);
+}
+
+
+static int f_lines (lua_State *L) {
+ tofile(L); /* check that it's a valid file handle */
+ aux_lines(L, 0);
+ return 1;
+}
+
+
+static int io_lines (lua_State *L) {
+ int toclose;
+ if (lua_isnone(L, 1)) lua_pushnil(L); /* at least one argument */
+ if (lua_isnil(L, 1)) { /* no file name? */
+ lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT); /* get default input */
+ lua_replace(L, 1); /* put it at index 1 */
+ tofile(L); /* check that it's a valid file handle */
+ toclose = 0; /* do not close it after iteration */
+ }
+ else { /* open a new file */
+ const char *filename = luaL_checkstring(L, 1);
+ opencheck(L, filename, "r");
+ lua_replace(L, 1); /* put file at index 1 */
+ toclose = 1; /* close it after iteration */
+ }
+ aux_lines(L, toclose);
+ return 1;
+}
+
+
+/*
+** {======================================================
+** READ
+** =======================================================
+*/
+
+
+/* maximum length of a numeral */
+#if !defined (L_MAXLENNUM)
+#define L_MAXLENNUM 200
+#endif
+
+
+/* auxiliary structure used by 'read_number' */
+typedef struct {
+ FILE *f; /* file being read */
+ int c; /* current character (look ahead) */
+ int n; /* number of elements in buffer 'buff' */
+ char buff[L_MAXLENNUM + 1]; /* +1 for ending '\0' */
+} RN;
+
+
+/*
+** Add current char to buffer (if not out of space) and read next one
+*/
+static int nextc (RN *rn) {
+ if (rn->n >= L_MAXLENNUM) { /* buffer overflow? */
+ rn->buff[0] = '\0'; /* invalidate result */
+ return 0; /* fail */
+ }
+ else {
+ rn->buff[rn->n++] = rn->c; /* save current char */
+ rn->c = l_getc(rn->f); /* read next one */
+ return 1;
+ }
+}
+
+
+/*
+** Accept current char if it is in 'set' (of size 2)
+*/
+static int test2 (RN *rn, const char *set) {
+ if (rn->c == set[0] || rn->c == set[1])
+ return nextc(rn);
+ else return 0;
+}
+
+
+/*
+** Read a sequence of (hex)digits
+*/
+static int readdigits (RN *rn, int hex) {
+ int count = 0;
+ while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn))
+ count++;
+ return count;
+}
+
+
+/*
+** Read a number: first reads a valid prefix of a numeral into a buffer.
+** Then it calls 'lua_stringtonumber' to check whether the format is
+** correct and to convert it to a Lua number
+*/
+static int read_number (lua_State *L, FILE *f) {
+ RN rn;
+ int count = 0;
+ int hex = 0;
+ char decp[2];
+ rn.f = f; rn.n = 0;
+ decp[0] = lua_getlocaledecpoint(); /* get decimal point from locale */
+ decp[1] = '.'; /* always accept a dot */
+ l_lockfile(rn.f);
+ do { rn.c = l_getc(rn.f); } while (isspace(rn.c)); /* skip spaces */
+ test2(&rn, "-+"); /* optional signal */
+ if (test2(&rn, "00")) {
+ if (test2(&rn, "xX")) hex = 1; /* numeral is hexadecimal */
+ else count = 1; /* count initial '0' as a valid digit */
+ }
+ count += readdigits(&rn, hex); /* integral part */
+ if (test2(&rn, decp)) /* decimal point? */
+ count += readdigits(&rn, hex); /* fractional part */
+ if (count > 0 && test2(&rn, (hex ? "pP" : "eE"))) { /* exponent mark? */
+ test2(&rn, "-+"); /* exponent signal */
+ readdigits(&rn, 0); /* exponent digits */
+ }
+ ungetc(rn.c, rn.f); /* unread look-ahead char */
+ l_unlockfile(rn.f);
+ rn.buff[rn.n] = '\0'; /* finish string */
+ if (lua_stringtonumber(L, rn.buff)) /* is this a valid number? */
+ return 1; /* ok */
+ else { /* invalid format */
+ lua_pushnil(L); /* "result" to be removed */
+ return 0; /* read fails */
+ }
+}
+
+
+static int test_eof (lua_State *L, FILE *f) {
+ int c = getc(f);
+ ungetc(c, f); /* no-op when c == EOF */
+ lua_pushliteral(L, "");
+ return (c != EOF);
+}
+
+
+static int read_line (lua_State *L, FILE *f, int chop) {
+ luaL_Buffer b;
+ int c = '\0';
+ luaL_buffinit(L, &b);
+ while (c != EOF && c != '\n') { /* repeat until end of line */
+ char *buff = luaL_prepbuffer(&b); /* preallocate buffer */
+ int i = 0;
+ l_lockfile(f); /* no memory errors can happen inside the lock */
+ while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n')
+ buff[i++] = c;
+ l_unlockfile(f);
+ luaL_addsize(&b, i);
+ }
+ if (!chop && c == '\n') /* want a newline and have one? */
+ luaL_addchar(&b, c); /* add ending newline to result */
+ luaL_pushresult(&b); /* close buffer */
+ /* return ok if read something (either a newline or something else) */
+ return (c == '\n' || lua_rawlen(L, -1) > 0);
+}
+
+
+static void read_all (lua_State *L, FILE *f) {
+ size_t nr;
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ do { /* read file in chunks of LUAL_BUFFERSIZE bytes */
+ char *p = luaL_prepbuffer(&b);
+ nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f);
+ luaL_addsize(&b, nr);
+ } while (nr == LUAL_BUFFERSIZE);
+ luaL_pushresult(&b); /* close buffer */
+}
+
+
+static int read_chars (lua_State *L, FILE *f, size_t n) {
+ size_t nr; /* number of chars actually read */
+ char *p;
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ p = luaL_prepbuffsize(&b, n); /* prepare buffer to read whole block */
+ nr = fread(p, sizeof(char), n, f); /* try to read 'n' chars */
+ luaL_addsize(&b, nr);
+ luaL_pushresult(&b); /* close buffer */
+ return (nr > 0); /* true iff read something */
+}
+
+
+static int g_read (lua_State *L, FILE *f, int first) {
+ int nargs = lua_gettop(L) - 1;
+ int success;
+ int n;
+ clearerr(f);
+ if (nargs == 0) { /* no arguments? */
+ success = read_line(L, f, 1);
+ n = first+1; /* to return 1 result */
+ }
+ else { /* ensure stack space for all results and for auxlib's buffer */
+ luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments");
+ success = 1;
+ for (n = first; nargs-- && success; n++) {
+ if (lua_type(L, n) == LUA_TNUMBER) {
+ size_t l = (size_t)luaL_checkinteger(L, n);
+ success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l);
+ }
+ else {
+ const char *p = luaL_checkstring(L, n);
+ if (*p == '*') p++; /* skip optional '*' (for compatibility) */
+ switch (*p) {
+ case 'n': /* number */
+ success = read_number(L, f);
+ break;
+ case 'l': /* line */
+ success = read_line(L, f, 1);
+ break;
+ case 'L': /* line with end-of-line */
+ success = read_line(L, f, 0);
+ break;
+ case 'a': /* file */
+ read_all(L, f); /* read entire file */
+ success = 1; /* always success */
+ break;
+ default:
+ return luaL_argerror(L, n, "invalid format");
+ }
+ }
+ }
+ }
+ if (ferror(f))
+ return luaL_fileresult(L, 0, NULL);
+ if (!success) {
+ lua_pop(L, 1); /* remove last result */
+ lua_pushnil(L); /* push nil instead */
+ }
+ return n - first;
+}
+
+
+static int io_read (lua_State *L) {
+ return g_read(L, getiofile(L, IO_INPUT), 1);
+}
+
+
+static int f_read (lua_State *L) {
+ return g_read(L, tofile(L), 2);
+}
+
+
+static int io_readline (lua_State *L) {
+ LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1));
+ int i;
+ int n = (int)lua_tointeger(L, lua_upvalueindex(2));
+ if (isclosed(p)) /* file is already closed? */
+ return luaL_error(L, "file is already closed");
+ lua_settop(L , 1);
+ luaL_checkstack(L, n, "too many arguments");
+ for (i = 1; i <= n; i++) /* push arguments to 'g_read' */
+ lua_pushvalue(L, lua_upvalueindex(3 + i));
+ n = g_read(L, p->f, 2); /* 'n' is number of results */
+ lua_assert(n > 0); /* should return at least a nil */
+ if (lua_toboolean(L, -n)) /* read at least one value? */
+ return n; /* return them */
+ else { /* first result is nil: EOF or error */
+ if (n > 1) { /* is there error information? */
+ /* 2nd result is error message */
+ return luaL_error(L, "%s", lua_tostring(L, -n + 1));
+ }
+ if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */
+ lua_settop(L, 0);
+ lua_pushvalue(L, lua_upvalueindex(1));
+ aux_close(L); /* close it */
+ }
+ return 0;
+ }
+}
+
+/* }====================================================== */
+
+
+static int g_write (lua_State *L, FILE *f, int arg) {
+ int nargs = lua_gettop(L) - arg;
+ int status = 1;
+ for (; nargs--; arg++) {
+ if (lua_type(L, arg) == LUA_TNUMBER) {
+ /* optimization: could be done exactly as for strings */
+ int len = lua_isinteger(L, arg)
+ ? fprintf(f, LUA_INTEGER_FMT, lua_tointeger(L, arg))
+ : fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg));
+ status = status && (len > 0);
+ }
+ else {
+ size_t l;
+ const char *s = luaL_checklstring(L, arg, &l);
+ status = status && (fwrite(s, sizeof(char), l, f) == l);
+ }
+ }
+ if (status) return 1; /* file handle already on stack top */
+ else return luaL_fileresult(L, status, NULL);
+}
+
+
+static int io_write (lua_State *L) {
+ return g_write(L, getiofile(L, IO_OUTPUT), 1);
+}
+
+
+static int f_write (lua_State *L) {
+ FILE *f = tofile(L);
+ lua_pushvalue(L, 1); /* push file at the stack top (to be returned) */
+ return g_write(L, f, 2);
+}
+
+
+static int f_seek (lua_State *L) {
+ static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END};
+ static const char *const modenames[] = {"set", "cur", "end", NULL};
+ FILE *f = tofile(L);
+ int op = luaL_checkoption(L, 2, "cur", modenames);
+ lua_Integer p3 = luaL_optinteger(L, 3, 0);
+ l_seeknum offset = (l_seeknum)p3;
+ luaL_argcheck(L, (lua_Integer)offset == p3, 3,
+ "not an integer in proper range");
+ op = l_fseek(f, offset, mode[op]);
+ if (op)
+ return luaL_fileresult(L, 0, NULL); /* error */
+ else {
+ lua_pushinteger(L, (lua_Integer)l_ftell(f));
+ return 1;
+ }
+}
+
+
+static int f_setvbuf (lua_State *L) {
+ static const int mode[] = {_IONBF, _IOFBF, _IOLBF};
+ static const char *const modenames[] = {"no", "full", "line", NULL};
+ FILE *f = tofile(L);
+ int op = luaL_checkoption(L, 2, NULL, modenames);
+ lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);
+ int res = setvbuf(f, NULL, mode[op], (size_t)sz);
+ return luaL_fileresult(L, res == 0, NULL);
+}
+
+
+
+static int io_flush (lua_State *L) {
+ return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL);
+}
+
+
+static int f_flush (lua_State *L) {
+ return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL);
+}
+
+
+/*
+** functions for 'io' library
+*/
+static const luaL_Reg iolib[] = {
+ {"close", io_close},
+ {"flush", io_flush},
+ {"input", io_input},
+ {"lines", io_lines},
+ {"open", io_open},
+ {"output", io_output},
+ {"popen", io_popen},
+ {"read", io_read},
+ {"tmpfile", io_tmpfile},
+ {"type", io_type},
+ {"write", io_write},
+ {NULL, NULL}
+};
+
+
+/*
+** methods for file handles
+*/
+static const luaL_Reg flib[] = {
+ {"close", io_close},
+ {"flush", f_flush},
+ {"lines", f_lines},
+ {"read", f_read},
+ {"seek", f_seek},
+ {"setvbuf", f_setvbuf},
+ {"write", f_write},
+ {"__gc", f_gc},
+ {"__tostring", f_tostring},
+ {NULL, NULL}
+};
+
+
+static void createmeta (lua_State *L) {
+ luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */
+ lua_pushvalue(L, -1); /* push metatable */
+ lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */
+ luaL_setfuncs(L, flib, 0); /* add file methods to new metatable */
+ lua_pop(L, 1); /* pop new metatable */
+}
+
+
+/*
+** function to (not) close the standard files stdin, stdout, and stderr
+*/
+static int io_noclose (lua_State *L) {
+ LStream *p = tolstream(L);
+ p->closef = &io_noclose; /* keep file opened */
+ lua_pushnil(L);
+ lua_pushliteral(L, "cannot close standard file");
+ return 2;
+}
+
+
+static void createstdfile (lua_State *L, FILE *f, const char *k,
+ const char *fname) {
+ LStream *p = newprefile(L);
+ p->f = f;
+ p->closef = &io_noclose;
+ if (k != NULL) {
+ lua_pushvalue(L, -1);
+ lua_setfield(L, LUA_REGISTRYINDEX, k); /* add file to registry */
+ }
+ lua_setfield(L, -2, fname); /* add file to module */
+}
+
+
+LUAMOD_API int luaopen_io (lua_State *L) {
+ luaL_newlib(L, iolib); /* new module */
+ createmeta(L);
+ /* create (and set) default files */
+ createstdfile(L, stdin, IO_INPUT, "stdin");
+ createstdfile(L, stdout, IO_OUTPUT, "stdout");
+ createstdfile(L, stderr, NULL, "stderr");
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/llex.c b/libs/lua/lua-5.3.3/llex.c
new file mode 100644
index 0000000..7032827
--- /dev/null
+++ b/libs/lua/lua-5.3.3/llex.c
@@ -0,0 +1,565 @@
+/*
+** $Id: llex.c,v 2.96 2016/05/02 14:02:12 roberto Exp $
+** Lexical Analyzer
+** See Copyright Notice in lua.h
+*/
+
+#define llex_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <locale.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lctype.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "llex.h"
+#include "lobject.h"
+#include "lparser.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "lzio.h"
+
+
+
+#define next(ls) (ls->current = zgetc(ls->z))
+
+
+
+#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r')
+
+
+/* ORDER RESERVED */
+static const char *const luaX_tokens [] = {
+ "and", "break", "do", "else", "elseif",
+ "end", "false", "for", "function", "goto", "if",
+ "in", "local", "nil", "not", "or", "repeat",
+ "return", "then", "true", "until", "while",
+ "//", "..", "...", "==", ">=", "<=", "~=",
+ "<<", ">>", "::", "<eof>",
+ "<number>", "<integer>", "<name>", "<string>"
+};
+
+
+#define save_and_next(ls) (save(ls, ls->current), next(ls))
+
+
+static l_noret lexerror (LexState *ls, const char *msg, int token);
+
+
+static void save (LexState *ls, int c) {
+ Mbuffer *b = ls->buff;
+ if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) {
+ size_t newsize;
+ if (luaZ_sizebuffer(b) >= MAX_SIZE/2)
+ lexerror(ls, "lexical element too long", 0);
+ newsize = luaZ_sizebuffer(b) * 2;
+ luaZ_resizebuffer(ls->L, b, newsize);
+ }
+ b->buffer[luaZ_bufflen(b)++] = cast(char, c);
+}
+
+
+void luaX_init (lua_State *L) {
+ int i;
+ TString *e = luaS_newliteral(L, LUA_ENV); /* create env name */
+ luaC_fix(L, obj2gco(e)); /* never collect this name */
+ for (i=0; i<NUM_RESERVED; i++) {
+ TString *ts = luaS_new(L, luaX_tokens[i]);
+ luaC_fix(L, obj2gco(ts)); /* reserved words are never collected */
+ ts->extra = cast_byte(i+1); /* reserved word */
+ }
+}
+
+
+const char *luaX_token2str (LexState *ls, int token) {
+ if (token < FIRST_RESERVED) { /* single-byte symbols? */
+ lua_assert(token == cast_uchar(token));
+ return luaO_pushfstring(ls->L, "'%c'", token);
+ }
+ else {
+ const char *s = luaX_tokens[token - FIRST_RESERVED];
+ if (token < TK_EOS) /* fixed format (symbols and reserved words)? */
+ return luaO_pushfstring(ls->L, "'%s'", s);
+ else /* names, strings, and numerals */
+ return s;
+ }
+}
+
+
+static const char *txtToken (LexState *ls, int token) {
+ switch (token) {
+ case TK_NAME: case TK_STRING:
+ case TK_FLT: case TK_INT:
+ save(ls, '\0');
+ return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff));
+ default:
+ return luaX_token2str(ls, token);
+ }
+}
+
+
+static l_noret lexerror (LexState *ls, const char *msg, int token) {
+ msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber);
+ if (token)
+ luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token));
+ luaD_throw(ls->L, LUA_ERRSYNTAX);
+}
+
+
+l_noret luaX_syntaxerror (LexState *ls, const char *msg) {
+ lexerror(ls, msg, ls->t.token);
+}
+
+
+/*
+** creates a new string and anchors it in scanner's table so that
+** it will not be collected until the end of the compilation
+** (by that time it should be anchored somewhere)
+*/
+TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
+ lua_State *L = ls->L;
+ TValue *o; /* entry for 'str' */
+ TString *ts = luaS_newlstr(L, str, l); /* create new string */
+ setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */
+ o = luaH_set(L, ls->h, L->top - 1);
+ if (ttisnil(o)) { /* not in use yet? */
+ /* boolean value does not need GC barrier;
+ table has no metatable, so it does not need to invalidate cache */
+ setbvalue(o, 1); /* t[string] = true */
+ luaC_checkGC(L);
+ }
+ else { /* string already present */
+ ts = tsvalue(keyfromval(o)); /* re-use value previously stored */
+ }
+ L->top--; /* remove string from stack */
+ return ts;
+}
+
+
+/*
+** increment line number and skips newline sequence (any of
+** \n, \r, \n\r, or \r\n)
+*/
+static void inclinenumber (LexState *ls) {
+ int old = ls->current;
+ lua_assert(currIsNewline(ls));
+ next(ls); /* skip '\n' or '\r' */
+ if (currIsNewline(ls) && ls->current != old)
+ next(ls); /* skip '\n\r' or '\r\n' */
+ if (++ls->linenumber >= MAX_INT)
+ lexerror(ls, "chunk has too many lines", 0);
+}
+
+
+void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,
+ int firstchar) {
+ ls->t.token = 0;
+ ls->L = L;
+ ls->current = firstchar;
+ ls->lookahead.token = TK_EOS; /* no look-ahead token */
+ ls->z = z;
+ ls->fs = NULL;
+ ls->linenumber = 1;
+ ls->lastline = 1;
+ ls->source = source;
+ ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */
+ luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */
+}
+
+
+
+/*
+** =======================================================
+** LEXICAL ANALYZER
+** =======================================================
+*/
+
+
+static int check_next1 (LexState *ls, int c) {
+ if (ls->current == c) {
+ next(ls);
+ return 1;
+ }
+ else return 0;
+}
+
+
+/*
+** Check whether current char is in set 'set' (with two chars) and
+** saves it
+*/
+static int check_next2 (LexState *ls, const char *set) {
+ lua_assert(set[2] == '\0');
+ if (ls->current == set[0] || ls->current == set[1]) {
+ save_and_next(ls);
+ return 1;
+ }
+ else return 0;
+}
+
+
+/* LUA_NUMBER */
+/*
+** this function is quite liberal in what it accepts, as 'luaO_str2num'
+** will reject ill-formed numerals.
+*/
+static int read_numeral (LexState *ls, SemInfo *seminfo) {
+ TValue obj;
+ const char *expo = "Ee";
+ int first = ls->current;
+ lua_assert(lisdigit(ls->current));
+ save_and_next(ls);
+ if (first == '0' && check_next2(ls, "xX")) /* hexadecimal? */
+ expo = "Pp";
+ for (;;) {
+ if (check_next2(ls, expo)) /* exponent part? */
+ check_next2(ls, "-+"); /* optional exponent sign */
+ if (lisxdigit(ls->current))
+ save_and_next(ls);
+ else if (ls->current == '.')
+ save_and_next(ls);
+ else break;
+ }
+ save(ls, '\0');
+ if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0) /* format error? */
+ lexerror(ls, "malformed number", TK_FLT);
+ if (ttisinteger(&obj)) {
+ seminfo->i = ivalue(&obj);
+ return TK_INT;
+ }
+ else {
+ lua_assert(ttisfloat(&obj));
+ seminfo->r = fltvalue(&obj);
+ return TK_FLT;
+ }
+}
+
+
+/*
+** skip a sequence '[=*[' or ']=*]'; if sequence is well formed, return
+** its number of '='s; otherwise, return a negative number (-1 iff there
+** are no '='s after initial bracket)
+*/
+static int skip_sep (LexState *ls) {
+ int count = 0;
+ int s = ls->current;
+ lua_assert(s == '[' || s == ']');
+ save_and_next(ls);
+ while (ls->current == '=') {
+ save_and_next(ls);
+ count++;
+ }
+ return (ls->current == s) ? count : (-count) - 1;
+}
+
+
+static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
+ int line = ls->linenumber; /* initial line (for error message) */
+ save_and_next(ls); /* skip 2nd '[' */
+ if (currIsNewline(ls)) /* string starts with a newline? */
+ inclinenumber(ls); /* skip it */
+ for (;;) {
+ switch (ls->current) {
+ case EOZ: { /* error */
+ const char *what = (seminfo ? "string" : "comment");
+ const char *msg = luaO_pushfstring(ls->L,
+ "unfinished long %s (starting at line %d)", what, line);
+ lexerror(ls, msg, TK_EOS);
+ break; /* to avoid warnings */
+ }
+ case ']': {
+ if (skip_sep(ls) == sep) {
+ save_and_next(ls); /* skip 2nd ']' */
+ goto endloop;
+ }
+ break;
+ }
+ case '\n': case '\r': {
+ save(ls, '\n');
+ inclinenumber(ls);
+ if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */
+ break;
+ }
+ default: {
+ if (seminfo) save_and_next(ls);
+ else next(ls);
+ }
+ }
+ } endloop:
+ if (seminfo)
+ seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),
+ luaZ_bufflen(ls->buff) - 2*(2 + sep));
+}
+
+
+static void esccheck (LexState *ls, int c, const char *msg) {
+ if (!c) {
+ if (ls->current != EOZ)
+ save_and_next(ls); /* add current to buffer for error message */
+ lexerror(ls, msg, TK_STRING);
+ }
+}
+
+
+static int gethexa (LexState *ls) {
+ save_and_next(ls);
+ esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected");
+ return luaO_hexavalue(ls->current);
+}
+
+
+static int readhexaesc (LexState *ls) {
+ int r = gethexa(ls);
+ r = (r << 4) + gethexa(ls);
+ luaZ_buffremove(ls->buff, 2); /* remove saved chars from buffer */
+ return r;
+}
+
+
+static unsigned long readutf8esc (LexState *ls) {
+ unsigned long r;
+ int i = 4; /* chars to be removed: '\', 'u', '{', and first digit */
+ save_and_next(ls); /* skip 'u' */
+ esccheck(ls, ls->current == '{', "missing '{'");
+ r = gethexa(ls); /* must have at least one digit */
+ while ((save_and_next(ls), lisxdigit(ls->current))) {
+ i++;
+ r = (r << 4) + luaO_hexavalue(ls->current);
+ esccheck(ls, r <= 0x10FFFF, "UTF-8 value too large");
+ }
+ esccheck(ls, ls->current == '}', "missing '}'");
+ next(ls); /* skip '}' */
+ luaZ_buffremove(ls->buff, i); /* remove saved chars from buffer */
+ return r;
+}
+
+
+static void utf8esc (LexState *ls) {
+ char buff[UTF8BUFFSZ];
+ int n = luaO_utf8esc(buff, readutf8esc(ls));
+ for (; n > 0; n--) /* add 'buff' to string */
+ save(ls, buff[UTF8BUFFSZ - n]);
+}
+
+
+static int readdecesc (LexState *ls) {
+ int i;
+ int r = 0; /* result accumulator */
+ for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */
+ r = 10*r + ls->current - '0';
+ save_and_next(ls);
+ }
+ esccheck(ls, r <= UCHAR_MAX, "decimal escape too large");
+ luaZ_buffremove(ls->buff, i); /* remove read digits from buffer */
+ return r;
+}
+
+
+static void read_string (LexState *ls, int del, SemInfo *seminfo) {
+ save_and_next(ls); /* keep delimiter (for error messages) */
+ while (ls->current != del) {
+ switch (ls->current) {
+ case EOZ:
+ lexerror(ls, "unfinished string", TK_EOS);
+ break; /* to avoid warnings */
+ case '\n':
+ case '\r':
+ lexerror(ls, "unfinished string", TK_STRING);
+ break; /* to avoid warnings */
+ case '\\': { /* escape sequences */
+ int c; /* final character to be saved */
+ save_and_next(ls); /* keep '\\' for error messages */
+ switch (ls->current) {
+ case 'a': c = '\a'; goto read_save;
+ case 'b': c = '\b'; goto read_save;
+ case 'f': c = '\f'; goto read_save;
+ case 'n': c = '\n'; goto read_save;
+ case 'r': c = '\r'; goto read_save;
+ case 't': c = '\t'; goto read_save;
+ case 'v': c = '\v'; goto read_save;
+ case 'x': c = readhexaesc(ls); goto read_save;
+ case 'u': utf8esc(ls); goto no_save;
+ case '\n': case '\r':
+ inclinenumber(ls); c = '\n'; goto only_save;
+ case '\\': case '\"': case '\'':
+ c = ls->current; goto read_save;
+ case EOZ: goto no_save; /* will raise an error next loop */
+ case 'z': { /* zap following span of spaces */
+ luaZ_buffremove(ls->buff, 1); /* remove '\\' */
+ next(ls); /* skip the 'z' */
+ while (lisspace(ls->current)) {
+ if (currIsNewline(ls)) inclinenumber(ls);
+ else next(ls);
+ }
+ goto no_save;
+ }
+ default: {
+ esccheck(ls, lisdigit(ls->current), "invalid escape sequence");
+ c = readdecesc(ls); /* digital escape '\ddd' */
+ goto only_save;
+ }
+ }
+ read_save:
+ next(ls);
+ /* go through */
+ only_save:
+ luaZ_buffremove(ls->buff, 1); /* remove '\\' */
+ save(ls, c);
+ /* go through */
+ no_save: break;
+ }
+ default:
+ save_and_next(ls);
+ }
+ }
+ save_and_next(ls); /* skip delimiter */
+ seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,
+ luaZ_bufflen(ls->buff) - 2);
+}
+
+
+static int llex (LexState *ls, SemInfo *seminfo) {
+ luaZ_resetbuffer(ls->buff);
+ for (;;) {
+ switch (ls->current) {
+ case '\n': case '\r': { /* line breaks */
+ inclinenumber(ls);
+ break;
+ }
+ case ' ': case '\f': case '\t': case '\v': { /* spaces */
+ next(ls);
+ break;
+ }
+ case '-': { /* '-' or '--' (comment) */
+ next(ls);
+ if (ls->current != '-') return '-';
+ /* else is a comment */
+ next(ls);
+ if (ls->current == '[') { /* long comment? */
+ int sep = skip_sep(ls);
+ luaZ_resetbuffer(ls->buff); /* 'skip_sep' may dirty the buffer */
+ if (sep >= 0) {
+ read_long_string(ls, NULL, sep); /* skip long comment */
+ luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */
+ break;
+ }
+ }
+ /* else short comment */
+ while (!currIsNewline(ls) && ls->current != EOZ)
+ next(ls); /* skip until end of line (or end of file) */
+ break;
+ }
+ case '[': { /* long string or simply '[' */
+ int sep = skip_sep(ls);
+ if (sep >= 0) {
+ read_long_string(ls, seminfo, sep);
+ return TK_STRING;
+ }
+ else if (sep != -1) /* '[=...' missing second bracket */
+ lexerror(ls, "invalid long string delimiter", TK_STRING);
+ return '[';
+ }
+ case '=': {
+ next(ls);
+ if (check_next1(ls, '=')) return TK_EQ;
+ else return '=';
+ }
+ case '<': {
+ next(ls);
+ if (check_next1(ls, '=')) return TK_LE;
+ else if (check_next1(ls, '<')) return TK_SHL;
+ else return '<';
+ }
+ case '>': {
+ next(ls);
+ if (check_next1(ls, '=')) return TK_GE;
+ else if (check_next1(ls, '>')) return TK_SHR;
+ else return '>';
+ }
+ case '/': {
+ next(ls);
+ if (check_next1(ls, '/')) return TK_IDIV;
+ else return '/';
+ }
+ case '~': {
+ next(ls);
+ if (check_next1(ls, '=')) return TK_NE;
+ else return '~';
+ }
+ case ':': {
+ next(ls);
+ if (check_next1(ls, ':')) return TK_DBCOLON;
+ else return ':';
+ }
+ case '"': case '\'': { /* short literal strings */
+ read_string(ls, ls->current, seminfo);
+ return TK_STRING;
+ }
+ case '.': { /* '.', '..', '...', or number */
+ save_and_next(ls);
+ if (check_next1(ls, '.')) {
+ if (check_next1(ls, '.'))
+ return TK_DOTS; /* '...' */
+ else return TK_CONCAT; /* '..' */
+ }
+ else if (!lisdigit(ls->current)) return '.';
+ else return read_numeral(ls, seminfo);
+ }
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9': {
+ return read_numeral(ls, seminfo);
+ }
+ case EOZ: {
+ return TK_EOS;
+ }
+ default: {
+ if (lislalpha(ls->current)) { /* identifier or reserved word? */
+ TString *ts;
+ do {
+ save_and_next(ls);
+ } while (lislalnum(ls->current));
+ ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
+ luaZ_bufflen(ls->buff));
+ seminfo->ts = ts;
+ if (isreserved(ts)) /* reserved word? */
+ return ts->extra - 1 + FIRST_RESERVED;
+ else {
+ return TK_NAME;
+ }
+ }
+ else { /* single-char tokens (+ - / ...) */
+ int c = ls->current;
+ next(ls);
+ return c;
+ }
+ }
+ }
+ }
+}
+
+
+void luaX_next (LexState *ls) {
+ ls->lastline = ls->linenumber;
+ if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */
+ ls->t = ls->lookahead; /* use this one */
+ ls->lookahead.token = TK_EOS; /* and discharge it */
+ }
+ else
+ ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */
+}
+
+
+int luaX_lookahead (LexState *ls) {
+ lua_assert(ls->lookahead.token == TK_EOS);
+ ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);
+ return ls->lookahead.token;
+}
+
diff --git a/libs/lua/lua-5.3.3/llex.h b/libs/lua/lua-5.3.3/llex.h
new file mode 100644
index 0000000..2363d87
--- /dev/null
+++ b/libs/lua/lua-5.3.3/llex.h
@@ -0,0 +1,85 @@
+/*
+** $Id: llex.h,v 1.79 2016/05/02 14:02:12 roberto Exp $
+** Lexical Analyzer
+** See Copyright Notice in lua.h
+*/
+
+#ifndef llex_h
+#define llex_h
+
+#include "lobject.h"
+#include "lzio.h"
+
+
+#define FIRST_RESERVED 257
+
+
+#if !defined(LUA_ENV)
+#define LUA_ENV "_ENV"
+#endif
+
+
+/*
+* WARNING: if you change the order of this enumeration,
+* grep "ORDER RESERVED"
+*/
+enum RESERVED {
+ /* terminal symbols denoted by reserved words */
+ TK_AND = FIRST_RESERVED, TK_BREAK,
+ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,
+ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,
+ TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,
+ /* other terminal symbols */
+ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,
+ TK_SHL, TK_SHR,
+ TK_DBCOLON, TK_EOS,
+ TK_FLT, TK_INT, TK_NAME, TK_STRING
+};
+
+/* number of reserved words */
+#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1))
+
+
+typedef union {
+ lua_Number r;
+ lua_Integer i;
+ TString *ts;
+} SemInfo; /* semantics information */
+
+
+typedef struct Token {
+ int token;
+ SemInfo seminfo;
+} Token;
+
+
+/* state of the lexer plus state of the parser when shared by all
+ functions */
+typedef struct LexState {
+ int current; /* current character (charint) */
+ int linenumber; /* input line counter */
+ int lastline; /* line of last token 'consumed' */
+ Token t; /* current token */
+ Token lookahead; /* look ahead token */
+ struct FuncState *fs; /* current function (parser) */
+ struct lua_State *L;
+ ZIO *z; /* input stream */
+ Mbuffer *buff; /* buffer for tokens */
+ Table *h; /* to avoid collection/reuse strings */
+ struct Dyndata *dyd; /* dynamic structures used by the parser */
+ TString *source; /* current source name */
+ TString *envn; /* environment variable name */
+} LexState;
+
+
+LUAI_FUNC void luaX_init (lua_State *L);
+LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,
+ TString *source, int firstchar);
+LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);
+LUAI_FUNC void luaX_next (LexState *ls);
+LUAI_FUNC int luaX_lookahead (LexState *ls);
+LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s);
+LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/llimits.h b/libs/lua/lua-5.3.3/llimits.h
new file mode 100644
index 0000000..f21377f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/llimits.h
@@ -0,0 +1,323 @@
+/*
+** $Id: llimits.h,v 1.141 2015/11/19 19:16:22 roberto Exp $
+** Limits, basic types, and some other 'installation-dependent' definitions
+** See Copyright Notice in lua.h
+*/
+
+#ifndef llimits_h
+#define llimits_h
+
+
+#include <limits.h>
+#include <stddef.h>
+
+
+#include "lua.h"
+
+/*
+** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count
+** the total memory used by Lua (in bytes). Usually, 'size_t' and
+** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines.
+*/
+#if defined(LUAI_MEM) /* { external definitions? */
+typedef LUAI_UMEM lu_mem;
+typedef LUAI_MEM l_mem;
+#elif LUAI_BITSINT >= 32 /* }{ */
+typedef size_t lu_mem;
+typedef ptrdiff_t l_mem;
+#else /* 16-bit ints */ /* }{ */
+typedef unsigned long lu_mem;
+typedef long l_mem;
+#endif /* } */
+
+
+/* chars used as small naturals (so that 'char' is reserved for characters) */
+typedef unsigned char lu_byte;
+
+
+/* maximum value for size_t */
+#define MAX_SIZET ((size_t)(~(size_t)0))
+
+/* maximum size visible for Lua (must be representable in a lua_Integer */
+#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \
+ : (size_t)(LUA_MAXINTEGER))
+
+
+#define MAX_LUMEM ((lu_mem)(~(lu_mem)0))
+
+#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1))
+
+
+#define MAX_INT INT_MAX /* maximum value of an int */
+
+
+/*
+** conversion of pointer to unsigned integer:
+** this is for hashing only; there is no problem if the integer
+** cannot hold the whole pointer value
+*/
+#define point2uint(p) ((unsigned int)((size_t)(p) & UINT_MAX))
+
+
+
+/* type to ensure maximum alignment */
+#if defined(LUAI_USER_ALIGNMENT_T)
+typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
+#else
+typedef union {
+ lua_Number n;
+ double u;
+ void *s;
+ lua_Integer i;
+ long l;
+} L_Umaxalign;
+#endif
+
+
+
+/* types of 'usual argument conversions' for lua_Number and lua_Integer */
+typedef LUAI_UACNUMBER l_uacNumber;
+typedef LUAI_UACINT l_uacInt;
+
+
+/* internal assertions for in-house debugging */
+#if defined(lua_assert)
+#define check_exp(c,e) (lua_assert(c), (e))
+/* to avoid problems with conditions too long */
+#define lua_longassert(c) ((c) ? (void)0 : lua_assert(0))
+#else
+#define lua_assert(c) ((void)0)
+#define check_exp(c,e) (e)
+#define lua_longassert(c) ((void)0)
+#endif
+
+/*
+** assertion for checking API calls
+*/
+#if !defined(luai_apicheck)
+#define luai_apicheck(l,e) lua_assert(e)
+#endif
+
+#define api_check(l,e,msg) luai_apicheck(l,(e) && msg)
+
+
+/* macro to avoid warnings about unused variables */
+#if !defined(UNUSED)
+#define UNUSED(x) ((void)(x))
+#endif
+
+
+/* type casts (a macro highlights casts in the code) */
+#define cast(t, exp) ((t)(exp))
+
+#define cast_void(i) cast(void, (i))
+#define cast_byte(i) cast(lu_byte, (i))
+#define cast_num(i) cast(lua_Number, (i))
+#define cast_int(i) cast(int, (i))
+#define cast_uchar(i) cast(unsigned char, (i))
+
+
+/* cast a signed lua_Integer to lua_Unsigned */
+#if !defined(l_castS2U)
+#define l_castS2U(i) ((lua_Unsigned)(i))
+#endif
+
+/*
+** cast a lua_Unsigned to a signed lua_Integer; this cast is
+** not strict ISO C, but two-complement architectures should
+** work fine.
+*/
+#if !defined(l_castU2S)
+#define l_castU2S(i) ((lua_Integer)(i))
+#endif
+
+
+/*
+** non-return type
+*/
+#if defined(__GNUC__)
+#define l_noret void __attribute__((noreturn))
+#elif defined(_MSC_VER) && _MSC_VER >= 1200
+#define l_noret void __declspec(noreturn)
+#else
+#define l_noret void
+#endif
+
+
+
+/*
+** maximum depth for nested C calls and syntactical nested non-terminals
+** in a program. (Value must fit in an unsigned short int.)
+*/
+#if !defined(LUAI_MAXCCALLS)
+#define LUAI_MAXCCALLS 200
+#endif
+
+
+
+/*
+** type for virtual-machine instructions;
+** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)
+*/
+#if LUAI_BITSINT >= 32
+typedef unsigned int Instruction;
+#else
+typedef unsigned long Instruction;
+#endif
+
+
+
+/*
+** Maximum length for short strings, that is, strings that are
+** internalized. (Cannot be smaller than reserved words or tags for
+** metamethods, as these strings must be internalized;
+** #("function") = 8, #("__newindex") = 10.)
+*/
+#if !defined(LUAI_MAXSHORTLEN)
+#define LUAI_MAXSHORTLEN 40
+#endif
+
+
+/*
+** Initial size for the string table (must be power of 2).
+** The Lua core alone registers ~50 strings (reserved words +
+** metaevent keys + a few others). Libraries would typically add
+** a few dozens more.
+*/
+#if !defined(MINSTRTABSIZE)
+#define MINSTRTABSIZE 128
+#endif
+
+
+/*
+** Size of cache for strings in the API. 'N' is the number of
+** sets (better be a prime) and "M" is the size of each set (M == 1
+** makes a direct cache.)
+*/
+#if !defined(STRCACHE_N)
+#define STRCACHE_N 53
+#define STRCACHE_M 2
+#endif
+
+
+/* minimum size for string buffer */
+#if !defined(LUA_MINBUFFER)
+#define LUA_MINBUFFER 32
+#endif
+
+
+/*
+** macros that are executed whenever program enters the Lua core
+** ('lua_lock') and leaves the core ('lua_unlock')
+*/
+#if !defined(lua_lock)
+#define lua_lock(L) ((void) 0)
+#define lua_unlock(L) ((void) 0)
+#endif
+
+/*
+** macro executed during Lua functions at points where the
+** function can yield.
+*/
+#if !defined(luai_threadyield)
+#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);}
+#endif
+
+
+/*
+** these macros allow user-specific actions on threads when you defined
+** LUAI_EXTRASPACE and need to do something extra when a thread is
+** created/deleted/resumed/yielded.
+*/
+#if !defined(luai_userstateopen)
+#define luai_userstateopen(L) ((void)L)
+#endif
+
+#if !defined(luai_userstateclose)
+#define luai_userstateclose(L) ((void)L)
+#endif
+
+#if !defined(luai_userstatethread)
+#define luai_userstatethread(L,L1) ((void)L)
+#endif
+
+#if !defined(luai_userstatefree)
+#define luai_userstatefree(L,L1) ((void)L)
+#endif
+
+#if !defined(luai_userstateresume)
+#define luai_userstateresume(L,n) ((void)L)
+#endif
+
+#if !defined(luai_userstateyield)
+#define luai_userstateyield(L,n) ((void)L)
+#endif
+
+
+
+/*
+** The luai_num* macros define the primitive operations over numbers.
+*/
+
+/* floor division (defined as 'floor(a/b)') */
+#if !defined(luai_numidiv)
+#define luai_numidiv(L,a,b) ((void)L, l_floor(luai_numdiv(L,a,b)))
+#endif
+
+/* float division */
+#if !defined(luai_numdiv)
+#define luai_numdiv(L,a,b) ((a)/(b))
+#endif
+
+/*
+** modulo: defined as 'a - floor(a/b)*b'; this definition gives NaN when
+** 'b' is huge, but the result should be 'a'. 'fmod' gives the result of
+** 'a - trunc(a/b)*b', and therefore must be corrected when 'trunc(a/b)
+** ~= floor(a/b)'. That happens when the division has a non-integer
+** negative result, which is equivalent to the test below.
+*/
+#if !defined(luai_nummod)
+#define luai_nummod(L,a,b,m) \
+ { (m) = l_mathop(fmod)(a,b); if ((m)*(b) < 0) (m) += (b); }
+#endif
+
+/* exponentiation */
+#if !defined(luai_numpow)
+#define luai_numpow(L,a,b) ((void)L, l_mathop(pow)(a,b))
+#endif
+
+/* the others are quite standard operations */
+#if !defined(luai_numadd)
+#define luai_numadd(L,a,b) ((a)+(b))
+#define luai_numsub(L,a,b) ((a)-(b))
+#define luai_nummul(L,a,b) ((a)*(b))
+#define luai_numunm(L,a) (-(a))
+#define luai_numeq(a,b) ((a)==(b))
+#define luai_numlt(a,b) ((a)<(b))
+#define luai_numle(a,b) ((a)<=(b))
+#define luai_numisnan(a) (!luai_numeq((a), (a)))
+#endif
+
+
+
+
+
+/*
+** macro to control inclusion of some hard tests on stack reallocation
+*/
+#if !defined(HARDSTACKTESTS)
+#define condmovestack(L,pre,pos) ((void)0)
+#else
+/* realloc stack keeping its size */
+#define condmovestack(L,pre,pos) \
+ { int sz_ = (L)->stacksize; pre; luaD_reallocstack((L), sz_); pos; }
+#endif
+
+#if !defined(HARDMEMTESTS)
+#define condchangemem(L,pre,pos) ((void)0)
+#else
+#define condchangemem(L,pre,pos) \
+ { if (G(L)->gcrunning) { pre; luaC_fullgc(L, 0); pos; } }
+#endif
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lmathlib.c b/libs/lua/lua-5.3.3/lmathlib.c
new file mode 100644
index 0000000..94815f1
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lmathlib.c
@@ -0,0 +1,407 @@
+/*
+** $Id: lmathlib.c,v 1.117 2015/10/02 15:39:23 roberto Exp $
+** Standard mathematical library
+** See Copyright Notice in lua.h
+*/
+
+#define lmathlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+#undef PI
+#define PI (l_mathop(3.141592653589793238462643383279502884))
+
+
+#if !defined(l_rand) /* { */
+#if defined(LUA_USE_POSIX)
+#define l_rand() random()
+#define l_srand(x) srandom(x)
+#define L_RANDMAX 2147483647 /* (2^31 - 1), following POSIX */
+#else
+#define l_rand() rand()
+#define l_srand(x) srand(x)
+#define L_RANDMAX RAND_MAX
+#endif
+#endif /* } */
+
+
+static int math_abs (lua_State *L) {
+ if (lua_isinteger(L, 1)) {
+ lua_Integer n = lua_tointeger(L, 1);
+ if (n < 0) n = (lua_Integer)(0u - (lua_Unsigned)n);
+ lua_pushinteger(L, n);
+ }
+ else
+ lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_sin (lua_State *L) {
+ lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_cos (lua_State *L) {
+ lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_tan (lua_State *L) {
+ lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_asin (lua_State *L) {
+ lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_acos (lua_State *L) {
+ lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_atan (lua_State *L) {
+ lua_Number y = luaL_checknumber(L, 1);
+ lua_Number x = luaL_optnumber(L, 2, 1);
+ lua_pushnumber(L, l_mathop(atan2)(y, x));
+ return 1;
+}
+
+
+static int math_toint (lua_State *L) {
+ int valid;
+ lua_Integer n = lua_tointegerx(L, 1, &valid);
+ if (valid)
+ lua_pushinteger(L, n);
+ else {
+ luaL_checkany(L, 1);
+ lua_pushnil(L); /* value is not convertible to integer */
+ }
+ return 1;
+}
+
+
+static void pushnumint (lua_State *L, lua_Number d) {
+ lua_Integer n;
+ if (lua_numbertointeger(d, &n)) /* does 'd' fit in an integer? */
+ lua_pushinteger(L, n); /* result is integer */
+ else
+ lua_pushnumber(L, d); /* result is float */
+}
+
+
+static int math_floor (lua_State *L) {
+ if (lua_isinteger(L, 1))
+ lua_settop(L, 1); /* integer is its own floor */
+ else {
+ lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1));
+ pushnumint(L, d);
+ }
+ return 1;
+}
+
+
+static int math_ceil (lua_State *L) {
+ if (lua_isinteger(L, 1))
+ lua_settop(L, 1); /* integer is its own ceil */
+ else {
+ lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1));
+ pushnumint(L, d);
+ }
+ return 1;
+}
+
+
+static int math_fmod (lua_State *L) {
+ if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) {
+ lua_Integer d = lua_tointeger(L, 2);
+ if ((lua_Unsigned)d + 1u <= 1u) { /* special cases: -1 or 0 */
+ luaL_argcheck(L, d != 0, 2, "zero");
+ lua_pushinteger(L, 0); /* avoid overflow with 0x80000... / -1 */
+ }
+ else
+ lua_pushinteger(L, lua_tointeger(L, 1) % d);
+ }
+ else
+ lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1),
+ luaL_checknumber(L, 2)));
+ return 1;
+}
+
+
+/*
+** next function does not use 'modf', avoiding problems with 'double*'
+** (which is not compatible with 'float*') when lua_Number is not
+** 'double'.
+*/
+static int math_modf (lua_State *L) {
+ if (lua_isinteger(L ,1)) {
+ lua_settop(L, 1); /* number is its own integer part */
+ lua_pushnumber(L, 0); /* no fractional part */
+ }
+ else {
+ lua_Number n = luaL_checknumber(L, 1);
+ /* integer part (rounds toward zero) */
+ lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n);
+ pushnumint(L, ip);
+ /* fractional part (test needed for inf/-inf) */
+ lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip));
+ }
+ return 2;
+}
+
+
+static int math_sqrt (lua_State *L) {
+ lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+
+static int math_ult (lua_State *L) {
+ lua_Integer a = luaL_checkinteger(L, 1);
+ lua_Integer b = luaL_checkinteger(L, 2);
+ lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b);
+ return 1;
+}
+
+static int math_log (lua_State *L) {
+ lua_Number x = luaL_checknumber(L, 1);
+ lua_Number res;
+ if (lua_isnoneornil(L, 2))
+ res = l_mathop(log)(x);
+ else {
+ lua_Number base = luaL_checknumber(L, 2);
+#if !defined(LUA_USE_C89)
+ if (base == 2.0) res = l_mathop(log2)(x); else
+#endif
+ if (base == 10.0) res = l_mathop(log10)(x);
+ else res = l_mathop(log)(x)/l_mathop(log)(base);
+ }
+ lua_pushnumber(L, res);
+ return 1;
+}
+
+static int math_exp (lua_State *L) {
+ lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_deg (lua_State *L) {
+ lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI));
+ return 1;
+}
+
+static int math_rad (lua_State *L) {
+ lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0)));
+ return 1;
+}
+
+
+static int math_min (lua_State *L) {
+ int n = lua_gettop(L); /* number of arguments */
+ int imin = 1; /* index of current minimum value */
+ int i;
+ luaL_argcheck(L, n >= 1, 1, "value expected");
+ for (i = 2; i <= n; i++) {
+ if (lua_compare(L, i, imin, LUA_OPLT))
+ imin = i;
+ }
+ lua_pushvalue(L, imin);
+ return 1;
+}
+
+
+static int math_max (lua_State *L) {
+ int n = lua_gettop(L); /* number of arguments */
+ int imax = 1; /* index of current maximum value */
+ int i;
+ luaL_argcheck(L, n >= 1, 1, "value expected");
+ for (i = 2; i <= n; i++) {
+ if (lua_compare(L, imax, i, LUA_OPLT))
+ imax = i;
+ }
+ lua_pushvalue(L, imax);
+ return 1;
+}
+
+/*
+** This function uses 'double' (instead of 'lua_Number') to ensure that
+** all bits from 'l_rand' can be represented, and that 'RANDMAX + 1.0'
+** will keep full precision (ensuring that 'r' is always less than 1.0.)
+*/
+static int math_random (lua_State *L) {
+ lua_Integer low, up;
+ double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0));
+ switch (lua_gettop(L)) { /* check number of arguments */
+ case 0: { /* no arguments */
+ lua_pushnumber(L, (lua_Number)r); /* Number between 0 and 1 */
+ return 1;
+ }
+ case 1: { /* only upper limit */
+ low = 1;
+ up = luaL_checkinteger(L, 1);
+ break;
+ }
+ case 2: { /* lower and upper limits */
+ low = luaL_checkinteger(L, 1);
+ up = luaL_checkinteger(L, 2);
+ break;
+ }
+ default: return luaL_error(L, "wrong number of arguments");
+ }
+ /* random integer in the interval [low, up] */
+ luaL_argcheck(L, low <= up, 1, "interval is empty");
+ luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1,
+ "interval too large");
+ r *= (double)(up - low) + 1.0;
+ lua_pushinteger(L, (lua_Integer)r + low);
+ return 1;
+}
+
+
+static int math_randomseed (lua_State *L) {
+ l_srand((unsigned int)(lua_Integer)luaL_checknumber(L, 1));
+ (void)l_rand(); /* discard first value to avoid undesirable correlations */
+ return 0;
+}
+
+
+static int math_type (lua_State *L) {
+ if (lua_type(L, 1) == LUA_TNUMBER) {
+ if (lua_isinteger(L, 1))
+ lua_pushliteral(L, "integer");
+ else
+ lua_pushliteral(L, "float");
+ }
+ else {
+ luaL_checkany(L, 1);
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+
+/*
+** {==================================================================
+** Deprecated functions (for compatibility only)
+** ===================================================================
+*/
+#if defined(LUA_COMPAT_MATHLIB)
+
+static int math_cosh (lua_State *L) {
+ lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_sinh (lua_State *L) {
+ lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_tanh (lua_State *L) {
+ lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+static int math_pow (lua_State *L) {
+ lua_Number x = luaL_checknumber(L, 1);
+ lua_Number y = luaL_checknumber(L, 2);
+ lua_pushnumber(L, l_mathop(pow)(x, y));
+ return 1;
+}
+
+static int math_frexp (lua_State *L) {
+ int e;
+ lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));
+ lua_pushinteger(L, e);
+ return 2;
+}
+
+static int math_ldexp (lua_State *L) {
+ lua_Number x = luaL_checknumber(L, 1);
+ int ep = (int)luaL_checkinteger(L, 2);
+ lua_pushnumber(L, l_mathop(ldexp)(x, ep));
+ return 1;
+}
+
+static int math_log10 (lua_State *L) {
+ lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));
+ return 1;
+}
+
+#endif
+/* }================================================================== */
+
+
+
+static const luaL_Reg mathlib[] = {
+ {"abs", math_abs},
+ {"acos", math_acos},
+ {"asin", math_asin},
+ {"atan", math_atan},
+ {"ceil", math_ceil},
+ {"cos", math_cos},
+ {"deg", math_deg},
+ {"exp", math_exp},
+ {"tointeger", math_toint},
+ {"floor", math_floor},
+ {"fmod", math_fmod},
+ {"ult", math_ult},
+ {"log", math_log},
+ {"max", math_max},
+ {"min", math_min},
+ {"modf", math_modf},
+ {"rad", math_rad},
+ {"random", math_random},
+ {"randomseed", math_randomseed},
+ {"sin", math_sin},
+ {"sqrt", math_sqrt},
+ {"tan", math_tan},
+ {"type", math_type},
+#if defined(LUA_COMPAT_MATHLIB)
+ {"atan2", math_atan},
+ {"cosh", math_cosh},
+ {"sinh", math_sinh},
+ {"tanh", math_tanh},
+ {"pow", math_pow},
+ {"frexp", math_frexp},
+ {"ldexp", math_ldexp},
+ {"log10", math_log10},
+#endif
+ /* placeholders */
+ {"pi", NULL},
+ {"huge", NULL},
+ {"maxinteger", NULL},
+ {"mininteger", NULL},
+ {NULL, NULL}
+};
+
+
+/*
+** Open math library
+*/
+LUAMOD_API int luaopen_math (lua_State *L) {
+ luaL_newlib(L, mathlib);
+ lua_pushnumber(L, PI);
+ lua_setfield(L, -2, "pi");
+ lua_pushnumber(L, (lua_Number)HUGE_VAL);
+ lua_setfield(L, -2, "huge");
+ lua_pushinteger(L, LUA_MAXINTEGER);
+ lua_setfield(L, -2, "maxinteger");
+ lua_pushinteger(L, LUA_MININTEGER);
+ lua_setfield(L, -2, "mininteger");
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lmem.c b/libs/lua/lua-5.3.3/lmem.c
new file mode 100644
index 0000000..0a0476c
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lmem.c
@@ -0,0 +1,100 @@
+/*
+** $Id: lmem.c,v 1.91 2015/03/06 19:45:54 roberto Exp $
+** Interface to Memory Manager
+** See Copyright Notice in lua.h
+*/
+
+#define lmem_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+
+
+
+/*
+** About the realloc function:
+** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);
+** ('osize' is the old size, 'nsize' is the new size)
+**
+** * frealloc(ud, NULL, x, s) creates a new block of size 's' (no
+** matter 'x').
+**
+** * frealloc(ud, p, x, 0) frees the block 'p'
+** (in this specific case, frealloc must return NULL);
+** particularly, frealloc(ud, NULL, 0, 0) does nothing
+** (which is equivalent to free(NULL) in ISO C)
+**
+** frealloc returns NULL if it cannot create or reallocate the area
+** (any reallocation to an equal or smaller size cannot fail!)
+*/
+
+
+
+#define MINSIZEARRAY 4
+
+
+void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,
+ int limit, const char *what) {
+ void *newblock;
+ int newsize;
+ if (*size >= limit/2) { /* cannot double it? */
+ if (*size >= limit) /* cannot grow even a little? */
+ luaG_runerror(L, "too many %s (limit is %d)", what, limit);
+ newsize = limit; /* still have at least one free place */
+ }
+ else {
+ newsize = (*size)*2;
+ if (newsize < MINSIZEARRAY)
+ newsize = MINSIZEARRAY; /* minimum size */
+ }
+ newblock = luaM_reallocv(L, block, *size, newsize, size_elems);
+ *size = newsize; /* update only when everything else is OK */
+ return newblock;
+}
+
+
+l_noret luaM_toobig (lua_State *L) {
+ luaG_runerror(L, "memory allocation error: block too big");
+}
+
+
+
+/*
+** generic allocation routine.
+*/
+void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
+ void *newblock;
+ global_State *g = G(L);
+ size_t realosize = (block) ? osize : 0;
+ lua_assert((realosize == 0) == (block == NULL));
+#if defined(HARDMEMTESTS)
+ if (nsize > realosize && g->gcrunning)
+ luaC_fullgc(L, 1); /* force a GC whenever possible */
+#endif
+ newblock = (*g->frealloc)(g->ud, block, osize, nsize);
+ if (newblock == NULL && nsize > 0) {
+ lua_assert(nsize > realosize); /* cannot fail when shrinking a block */
+ if (g->version) { /* is state fully built? */
+ luaC_fullgc(L, 1); /* try to free some memory... */
+ newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */
+ }
+ if (newblock == NULL)
+ luaD_throw(L, LUA_ERRMEM);
+ }
+ lua_assert((nsize == 0) == (newblock == NULL));
+ g->GCdebt = (g->GCdebt + nsize) - realosize;
+ return newblock;
+}
+
diff --git a/libs/lua/lua-5.3.3/lmem.h b/libs/lua/lua-5.3.3/lmem.h
new file mode 100644
index 0000000..30f4848
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lmem.h
@@ -0,0 +1,69 @@
+/*
+** $Id: lmem.h,v 1.43 2014/12/19 17:26:14 roberto Exp $
+** Interface to Memory Manager
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lmem_h
+#define lmem_h
+
+
+#include <stddef.h>
+
+#include "llimits.h"
+#include "lua.h"
+
+
+/*
+** This macro reallocs a vector 'b' from 'on' to 'n' elements, where
+** each element has size 'e'. In case of arithmetic overflow of the
+** product 'n'*'e', it raises an error (calling 'luaM_toobig'). Because
+** 'e' is always constant, it avoids the runtime division MAX_SIZET/(e).
+**
+** (The macro is somewhat complex to avoid warnings: The 'sizeof'
+** comparison avoids a runtime comparison when overflow cannot occur.
+** The compiler should be able to optimize the real test by itself, but
+** when it does it, it may give a warning about "comparison is always
+** false due to limited range of data type"; the +1 tricks the compiler,
+** avoiding this warning but also this optimization.)
+*/
+#define luaM_reallocv(L,b,on,n,e) \
+ (((sizeof(n) >= sizeof(size_t) && cast(size_t, (n)) + 1 > MAX_SIZET/(e)) \
+ ? luaM_toobig(L) : cast_void(0)) , \
+ luaM_realloc_(L, (b), (on)*(e), (n)*(e)))
+
+/*
+** Arrays of chars do not need any test
+*/
+#define luaM_reallocvchar(L,b,on,n) \
+ cast(char *, luaM_realloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char)))
+
+#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0)
+#define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0)
+#define luaM_freearray(L, b, n) luaM_realloc_(L, (b), (n)*sizeof(*(b)), 0)
+
+#define luaM_malloc(L,s) luaM_realloc_(L, NULL, 0, (s))
+#define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t)))
+#define luaM_newvector(L,n,t) \
+ cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))
+
+#define luaM_newobject(L,tag,s) luaM_realloc_(L, NULL, tag, (s))
+
+#define luaM_growvector(L,v,nelems,size,t,limit,e) \
+ if ((nelems)+1 > (size)) \
+ ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))
+
+#define luaM_reallocvector(L, v,oldn,n,t) \
+ ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))
+
+LUAI_FUNC l_noret luaM_toobig (lua_State *L);
+
+/* not to be called directly */
+LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,
+ size_t size);
+LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,
+ size_t size_elem, int limit,
+ const char *what);
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/loadlib.c b/libs/lua/lua-5.3.3/loadlib.c
new file mode 100644
index 0000000..7911928
--- /dev/null
+++ b/libs/lua/lua-5.3.3/loadlib.c
@@ -0,0 +1,787 @@
+/*
+** $Id: loadlib.c,v 1.127 2015/11/23 11:30:45 roberto Exp $
+** Dynamic library loader for Lua
+** See Copyright Notice in lua.h
+**
+** This module contains an implementation of loadlib for Unix systems
+** that have dlfcn, an implementation for Windows, and a stub for other
+** systems.
+*/
+
+#define loadlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
+** variables that Lua check to set its paths.
+*/
+#if !defined(LUA_PATH_VAR)
+#define LUA_PATH_VAR "LUA_PATH"
+#endif
+
+#if !defined(LUA_CPATH_VAR)
+#define LUA_CPATH_VAR "LUA_CPATH"
+#endif
+
+#define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
+
+#define LUA_PATHVARVERSION LUA_PATH_VAR LUA_PATHSUFFIX
+#define LUA_CPATHVARVERSION LUA_CPATH_VAR LUA_PATHSUFFIX
+
+/*
+** LUA_PATH_SEP is the character that separates templates in a path.
+** LUA_PATH_MARK is the string that marks the substitution points in a
+** template.
+** LUA_EXEC_DIR in a Windows path is replaced by the executable's
+** directory.
+** LUA_IGMARK is a mark to ignore all before it when building the
+** luaopen_ function name.
+*/
+#if !defined (LUA_PATH_SEP)
+#define LUA_PATH_SEP ";"
+#endif
+#if !defined (LUA_PATH_MARK)
+#define LUA_PATH_MARK "?"
+#endif
+#if !defined (LUA_EXEC_DIR)
+#define LUA_EXEC_DIR "!"
+#endif
+#if !defined (LUA_IGMARK)
+#define LUA_IGMARK "-"
+#endif
+
+
+/*
+** LUA_CSUBSEP is the character that replaces dots in submodule names
+** when searching for a C loader.
+** LUA_LSUBSEP is the character that replaces dots in submodule names
+** when searching for a Lua loader.
+*/
+#if !defined(LUA_CSUBSEP)
+#define LUA_CSUBSEP LUA_DIRSEP
+#endif
+
+#if !defined(LUA_LSUBSEP)
+#define LUA_LSUBSEP LUA_DIRSEP
+#endif
+
+
+/* prefix for open functions in C libraries */
+#define LUA_POF "luaopen_"
+
+/* separator for open functions in C libraries */
+#define LUA_OFSEP "_"
+
+
+/*
+** unique key for table in the registry that keeps handles
+** for all loaded C libraries
+*/
+static const int CLIBS = 0;
+
+#define LIB_FAIL "open"
+
+#define setprogdir(L) ((void)0)
+
+
+/*
+** system-dependent functions
+*/
+
+/*
+** unload library 'lib'
+*/
+static void lsys_unloadlib (void *lib);
+
+/*
+** load C library in file 'path'. If 'seeglb', load with all names in
+** the library global.
+** Returns the library; in case of error, returns NULL plus an
+** error string in the stack.
+*/
+static void *lsys_load (lua_State *L, const char *path, int seeglb);
+
+/*
+** Try to find a function named 'sym' in library 'lib'.
+** Returns the function; in case of error, returns NULL plus an
+** error string in the stack.
+*/
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym);
+
+
+
+
+#if defined(LUA_USE_DLOPEN) /* { */
+/*
+** {========================================================================
+** This is an implementation of loadlib based on the dlfcn interface.
+** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,
+** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least
+** as an emulation layer on top of native functions.
+** =========================================================================
+*/
+
+#include <dlfcn.h>
+
+/*
+** Macro to convert pointer-to-void* to pointer-to-function. This cast
+** is undefined according to ISO C, but POSIX assumes that it works.
+** (The '__extension__' in gnu compilers is only to avoid warnings.)
+*/
+#if defined(__GNUC__)
+#define cast_func(p) (__extension__ (lua_CFunction)(p))
+#else
+#define cast_func(p) ((lua_CFunction)(p))
+#endif
+
+
+static void lsys_unloadlib (void *lib) {
+ dlclose(lib);
+}
+
+
+static void *lsys_load (lua_State *L, const char *path, int seeglb) {
+ void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL));
+ if (lib == NULL) lua_pushstring(L, dlerror());
+ return lib;
+}
+
+
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
+ lua_CFunction f = cast_func(dlsym(lib, sym));
+ if (f == NULL) lua_pushstring(L, dlerror());
+ return f;
+}
+
+/* }====================================================== */
+
+
+
+#elif defined(LUA_DL_DLL) /* }{ */
+/*
+** {======================================================================
+** This is an implementation of loadlib for Windows using native functions.
+** =======================================================================
+*/
+
+#include <windows.h>
+
+#undef setprogdir
+
+/*
+** optional flags for LoadLibraryEx
+*/
+#if !defined(LUA_LLE_FLAGS)
+#define LUA_LLE_FLAGS 0
+#endif
+
+
+static void setprogdir (lua_State *L) {
+ char buff[MAX_PATH + 1];
+ char *lb;
+ DWORD nsize = sizeof(buff)/sizeof(char);
+ DWORD n = GetModuleFileNameA(NULL, buff, nsize);
+ if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
+ luaL_error(L, "unable to get ModuleFileName");
+ else {
+ *lb = '\0';
+ luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff);
+ lua_remove(L, -2); /* remove original string */
+ }
+}
+
+
+static void pusherror (lua_State *L) {
+ int error = GetLastError();
+ char buffer[128];
+ if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, error, 0, buffer, sizeof(buffer)/sizeof(char), NULL))
+ lua_pushstring(L, buffer);
+ else
+ lua_pushfstring(L, "system error %d\n", error);
+}
+
+static void lsys_unloadlib (void *lib) {
+ FreeLibrary((HMODULE)lib);
+}
+
+
+static void *lsys_load (lua_State *L, const char *path, int seeglb) {
+ HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS);
+ (void)(seeglb); /* not used: symbols are 'global' by default */
+ if (lib == NULL) pusherror(L);
+ return lib;
+}
+
+
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
+ lua_CFunction f = (lua_CFunction)GetProcAddress((HMODULE)lib, sym);
+ if (f == NULL) pusherror(L);
+ return f;
+}
+
+/* }====================================================== */
+
+
+#else /* }{ */
+/*
+** {======================================================
+** Fallback for other systems
+** =======================================================
+*/
+
+#undef LIB_FAIL
+#define LIB_FAIL "absent"
+
+
+#define DLMSG "dynamic libraries not enabled; check your Lua installation"
+
+
+static void lsys_unloadlib (void *lib) {
+ (void)(lib); /* not used */
+}
+
+
+static void *lsys_load (lua_State *L, const char *path, int seeglb) {
+ (void)(path); (void)(seeglb); /* not used */
+ lua_pushliteral(L, DLMSG);
+ return NULL;
+}
+
+
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
+ (void)(lib); (void)(sym); /* not used */
+ lua_pushliteral(L, DLMSG);
+ return NULL;
+}
+
+/* }====================================================== */
+#endif /* } */
+
+
+/*
+** return registry.CLIBS[path]
+*/
+static void *checkclib (lua_State *L, const char *path) {
+ void *plib;
+ lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS);
+ lua_getfield(L, -1, path);
+ plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */
+ lua_pop(L, 2); /* pop CLIBS table and 'plib' */
+ return plib;
+}
+
+
+/*
+** registry.CLIBS[path] = plib -- for queries
+** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries
+*/
+static void addtoclib (lua_State *L, const char *path, void *plib) {
+ lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS);
+ lua_pushlightuserdata(L, plib);
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -3, path); /* CLIBS[path] = plib */
+ lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */
+ lua_pop(L, 1); /* pop CLIBS table */
+}
+
+
+/*
+** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib
+** handles in list CLIBS
+*/
+static int gctm (lua_State *L) {
+ lua_Integer n = luaL_len(L, 1);
+ for (; n >= 1; n--) { /* for each handle, in reverse order */
+ lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */
+ lsys_unloadlib(lua_touserdata(L, -1));
+ lua_pop(L, 1); /* pop handle */
+ }
+ return 0;
+}
+
+
+
+/* error codes for 'lookforfunc' */
+#define ERRLIB 1
+#define ERRFUNC 2
+
+/*
+** Look for a C function named 'sym' in a dynamically loaded library
+** 'path'.
+** First, check whether the library is already loaded; if not, try
+** to load it.
+** Then, if 'sym' is '*', return true (as library has been loaded).
+** Otherwise, look for symbol 'sym' in the library and push a
+** C function with that symbol.
+** Return 0 and 'true' or a function in the stack; in case of
+** errors, return an error code and an error message in the stack.
+*/
+static int lookforfunc (lua_State *L, const char *path, const char *sym) {
+ void *reg = checkclib(L, path); /* check loaded C libraries */
+ if (reg == NULL) { /* must load library? */
+ reg = lsys_load(L, path, *sym == '*'); /* global symbols if 'sym'=='*' */
+ if (reg == NULL) return ERRLIB; /* unable to load library */
+ addtoclib(L, path, reg);
+ }
+ if (*sym == '*') { /* loading only library (no function)? */
+ lua_pushboolean(L, 1); /* return 'true' */
+ return 0; /* no errors */
+ }
+ else {
+ lua_CFunction f = lsys_sym(L, reg, sym);
+ if (f == NULL)
+ return ERRFUNC; /* unable to find function */
+ lua_pushcfunction(L, f); /* else create new function */
+ return 0; /* no errors */
+ }
+}
+
+
+static int ll_loadlib (lua_State *L) {
+ const char *path = luaL_checkstring(L, 1);
+ const char *init = luaL_checkstring(L, 2);
+ int stat = lookforfunc(L, path, init);
+ if (stat == 0) /* no errors? */
+ return 1; /* return the loaded function */
+ else { /* error; error message is on stack top */
+ lua_pushnil(L);
+ lua_insert(L, -2);
+ lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init");
+ return 3; /* return nil, error message, and where */
+ }
+}
+
+
+
+/*
+** {======================================================
+** 'require' function
+** =======================================================
+*/
+
+
+static int readable (const char *filename) {
+ FILE *f = fopen(filename, "r"); /* try to open file */
+ if (f == NULL) return 0; /* open failed */
+ fclose(f);
+ return 1;
+}
+
+
+static const char *pushnexttemplate (lua_State *L, const char *path) {
+ const char *l;
+ while (*path == *LUA_PATH_SEP) path++; /* skip separators */
+ if (*path == '\0') return NULL; /* no more templates */
+ l = strchr(path, *LUA_PATH_SEP); /* find next separator */
+ if (l == NULL) l = path + strlen(path);
+ lua_pushlstring(L, path, l - path); /* template */
+ return l;
+}
+
+
+static const char *searchpath (lua_State *L, const char *name,
+ const char *path,
+ const char *sep,
+ const char *dirsep) {
+ luaL_Buffer msg; /* to build error message */
+ luaL_buffinit(L, &msg);
+ if (*sep != '\0') /* non-empty separator? */
+ name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */
+ while ((path = pushnexttemplate(L, path)) != NULL) {
+ const char *filename = luaL_gsub(L, lua_tostring(L, -1),
+ LUA_PATH_MARK, name);
+ lua_remove(L, -2); /* remove path template */
+ if (readable(filename)) /* does file exist and is readable? */
+ return filename; /* return that file name */
+ lua_pushfstring(L, "\n\tno file '%s'", filename);
+ lua_remove(L, -2); /* remove file name */
+ luaL_addvalue(&msg); /* concatenate error msg. entry */
+ }
+ luaL_pushresult(&msg); /* create error message */
+ return NULL; /* not found */
+}
+
+
+static int ll_searchpath (lua_State *L) {
+ const char *f = searchpath(L, luaL_checkstring(L, 1),
+ luaL_checkstring(L, 2),
+ luaL_optstring(L, 3, "."),
+ luaL_optstring(L, 4, LUA_DIRSEP));
+ if (f != NULL) return 1;
+ else { /* error message is on top of the stack */
+ lua_pushnil(L);
+ lua_insert(L, -2);
+ return 2; /* return nil + error message */
+ }
+}
+
+
+static const char *findfile (lua_State *L, const char *name,
+ const char *pname,
+ const char *dirsep) {
+ const char *path;
+ lua_getfield(L, lua_upvalueindex(1), pname);
+ path = lua_tostring(L, -1);
+ if (path == NULL)
+ luaL_error(L, "'package.%s' must be a string", pname);
+ return searchpath(L, name, path, ".", dirsep);
+}
+
+
+static int checkload (lua_State *L, int stat, const char *filename) {
+ if (stat) { /* module loaded successfully? */
+ lua_pushstring(L, filename); /* will be 2nd argument to module */
+ return 2; /* return open function and file name */
+ }
+ else
+ return luaL_error(L, "error loading module '%s' from file '%s':\n\t%s",
+ lua_tostring(L, 1), filename, lua_tostring(L, -1));
+}
+
+
+static int searcher_Lua (lua_State *L) {
+ const char *filename;
+ const char *name = luaL_checkstring(L, 1);
+ filename = findfile(L, name, "path", LUA_LSUBSEP);
+ if (filename == NULL) return 1; /* module not found in this path */
+ return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename);
+}
+
+
+/*
+** Try to find a load function for module 'modname' at file 'filename'.
+** First, change '.' to '_' in 'modname'; then, if 'modname' has
+** the form X-Y (that is, it has an "ignore mark"), build a function
+** name "luaopen_X" and look for it. (For compatibility, if that
+** fails, it also tries "luaopen_Y".) If there is no ignore mark,
+** look for a function named "luaopen_modname".
+*/
+static int loadfunc (lua_State *L, const char *filename, const char *modname) {
+ const char *openfunc;
+ const char *mark;
+ modname = luaL_gsub(L, modname, ".", LUA_OFSEP);
+ mark = strchr(modname, *LUA_IGMARK);
+ if (mark) {
+ int stat;
+ openfunc = lua_pushlstring(L, modname, mark - modname);
+ openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc);
+ stat = lookforfunc(L, filename, openfunc);
+ if (stat != ERRFUNC) return stat;
+ modname = mark + 1; /* else go ahead and try old-style name */
+ }
+ openfunc = lua_pushfstring(L, LUA_POF"%s", modname);
+ return lookforfunc(L, filename, openfunc);
+}
+
+
+static int searcher_C (lua_State *L) {
+ const char *name = luaL_checkstring(L, 1);
+ const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP);
+ if (filename == NULL) return 1; /* module not found in this path */
+ return checkload(L, (loadfunc(L, filename, name) == 0), filename);
+}
+
+
+static int searcher_Croot (lua_State *L) {
+ const char *filename;
+ const char *name = luaL_checkstring(L, 1);
+ const char *p = strchr(name, '.');
+ int stat;
+ if (p == NULL) return 0; /* is root */
+ lua_pushlstring(L, name, p - name);
+ filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP);
+ if (filename == NULL) return 1; /* root not found */
+ if ((stat = loadfunc(L, filename, name)) != 0) {
+ if (stat != ERRFUNC)
+ return checkload(L, 0, filename); /* real error */
+ else { /* open function not found */
+ lua_pushfstring(L, "\n\tno module '%s' in file '%s'", name, filename);
+ return 1;
+ }
+ }
+ lua_pushstring(L, filename); /* will be 2nd argument to module */
+ return 2;
+}
+
+
+static int searcher_preload (lua_State *L) {
+ const char *name = luaL_checkstring(L, 1);
+ lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD");
+ if (lua_getfield(L, -1, name) == LUA_TNIL) /* not found? */
+ lua_pushfstring(L, "\n\tno field package.preload['%s']", name);
+ return 1;
+}
+
+
+static void findloader (lua_State *L, const char *name) {
+ int i;
+ luaL_Buffer msg; /* to build error message */
+ luaL_buffinit(L, &msg);
+ /* push 'package.searchers' to index 3 in the stack */
+ if (lua_getfield(L, lua_upvalueindex(1), "searchers") != LUA_TTABLE)
+ luaL_error(L, "'package.searchers' must be a table");
+ /* iterate over available searchers to find a loader */
+ for (i = 1; ; i++) {
+ if (lua_rawgeti(L, 3, i) == LUA_TNIL) { /* no more searchers? */
+ lua_pop(L, 1); /* remove nil */
+ luaL_pushresult(&msg); /* create error message */
+ luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1));
+ }
+ lua_pushstring(L, name);
+ lua_call(L, 1, 2); /* call it */
+ if (lua_isfunction(L, -2)) /* did it find a loader? */
+ return; /* module loader found */
+ else if (lua_isstring(L, -2)) { /* searcher returned error message? */
+ lua_pop(L, 1); /* remove extra return */
+ luaL_addvalue(&msg); /* concatenate error message */
+ }
+ else
+ lua_pop(L, 2); /* remove both returns */
+ }
+}
+
+
+static int ll_require (lua_State *L) {
+ const char *name = luaL_checkstring(L, 1);
+ lua_settop(L, 1); /* _LOADED table will be at index 2 */
+ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
+ lua_getfield(L, 2, name); /* _LOADED[name] */
+ if (lua_toboolean(L, -1)) /* is it there? */
+ return 1; /* package is already loaded */
+ /* else must load package */
+ lua_pop(L, 1); /* remove 'getfield' result */
+ findloader(L, name);
+ lua_pushstring(L, name); /* pass name as argument to module loader */
+ lua_insert(L, -2); /* name is 1st argument (before search data) */
+ lua_call(L, 2, 1); /* run loader to load module */
+ if (!lua_isnil(L, -1)) /* non-nil return? */
+ lua_setfield(L, 2, name); /* _LOADED[name] = returned value */
+ if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no value? */
+ lua_pushboolean(L, 1); /* use true as result */
+ lua_pushvalue(L, -1); /* extra copy to be returned */
+ lua_setfield(L, 2, name); /* _LOADED[name] = true */
+ }
+ return 1;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** 'module' function
+** =======================================================
+*/
+#if defined(LUA_COMPAT_MODULE)
+
+/*
+** changes the environment variable of calling function
+*/
+static void set_env (lua_State *L) {
+ lua_Debug ar;
+ if (lua_getstack(L, 1, &ar) == 0 ||
+ lua_getinfo(L, "f", &ar) == 0 || /* get calling function */
+ lua_iscfunction(L, -1))
+ luaL_error(L, "'module' not called from a Lua function");
+ lua_pushvalue(L, -2); /* copy new environment table to top */
+ lua_setupvalue(L, -2, 1);
+ lua_pop(L, 1); /* remove function */
+}
+
+
+static void dooptions (lua_State *L, int n) {
+ int i;
+ for (i = 2; i <= n; i++) {
+ if (lua_isfunction(L, i)) { /* avoid 'calling' extra info. */
+ lua_pushvalue(L, i); /* get option (a function) */
+ lua_pushvalue(L, -2); /* module */
+ lua_call(L, 1, 0);
+ }
+ }
+}
+
+
+static void modinit (lua_State *L, const char *modname) {
+ const char *dot;
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -2, "_M"); /* module._M = module */
+ lua_pushstring(L, modname);
+ lua_setfield(L, -2, "_NAME");
+ dot = strrchr(modname, '.'); /* look for last dot in module name */
+ if (dot == NULL) dot = modname;
+ else dot++;
+ /* set _PACKAGE as package name (full module name minus last part) */
+ lua_pushlstring(L, modname, dot - modname);
+ lua_setfield(L, -2, "_PACKAGE");
+}
+
+
+static int ll_module (lua_State *L) {
+ const char *modname = luaL_checkstring(L, 1);
+ int lastarg = lua_gettop(L); /* last parameter */
+ luaL_pushmodule(L, modname, 1); /* get/create module table */
+ /* check whether table already has a _NAME field */
+ if (lua_getfield(L, -1, "_NAME") != LUA_TNIL)
+ lua_pop(L, 1); /* table is an initialized module */
+ else { /* no; initialize it */
+ lua_pop(L, 1);
+ modinit(L, modname);
+ }
+ lua_pushvalue(L, -1);
+ set_env(L);
+ dooptions(L, lastarg);
+ return 1;
+}
+
+
+static int ll_seeall (lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE);
+ if (!lua_getmetatable(L, 1)) {
+ lua_createtable(L, 0, 1); /* create new metatable */
+ lua_pushvalue(L, -1);
+ lua_setmetatable(L, 1);
+ }
+ lua_pushglobaltable(L);
+ lua_setfield(L, -2, "__index"); /* mt.__index = _G */
+ return 0;
+}
+
+#endif
+/* }====================================================== */
+
+
+
+/* auxiliary mark (for internal use) */
+#define AUXMARK "\1"
+
+
+/*
+** return registry.LUA_NOENV as a boolean
+*/
+static int noenv (lua_State *L) {
+ int b;
+ lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
+ b = lua_toboolean(L, -1);
+ lua_pop(L, 1); /* remove value */
+ return b;
+}
+
+
+static void setpath (lua_State *L, const char *fieldname, const char *envname1,
+ const char *envname2, const char *def) {
+ const char *path = getenv(envname1);
+ if (path == NULL) /* no environment variable? */
+ path = getenv(envname2); /* try alternative name */
+ if (path == NULL || noenv(L)) /* no environment variable? */
+ lua_pushstring(L, def); /* use default */
+ else {
+ /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
+ path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
+ LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
+ luaL_gsub(L, path, AUXMARK, def);
+ lua_remove(L, -2);
+ }
+ setprogdir(L);
+ lua_setfield(L, -2, fieldname);
+}
+
+
+static const luaL_Reg pk_funcs[] = {
+ {"loadlib", ll_loadlib},
+ {"searchpath", ll_searchpath},
+#if defined(LUA_COMPAT_MODULE)
+ {"seeall", ll_seeall},
+#endif
+ /* placeholders */
+ {"preload", NULL},
+ {"cpath", NULL},
+ {"path", NULL},
+ {"searchers", NULL},
+ {"loaded", NULL},
+ {NULL, NULL}
+};
+
+
+static const luaL_Reg ll_funcs[] = {
+#if defined(LUA_COMPAT_MODULE)
+ {"module", ll_module},
+#endif
+ {"require", ll_require},
+ {NULL, NULL}
+};
+
+
+static void createsearcherstable (lua_State *L) {
+ static const lua_CFunction searchers[] =
+ {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL};
+ int i;
+ /* create 'searchers' table */
+ lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0);
+ /* fill it with predefined searchers */
+ for (i=0; searchers[i] != NULL; i++) {
+ lua_pushvalue(L, -2); /* set 'package' as upvalue for all searchers */
+ lua_pushcclosure(L, searchers[i], 1);
+ lua_rawseti(L, -2, i+1);
+ }
+#if defined(LUA_COMPAT_LOADERS)
+ lua_pushvalue(L, -1); /* make a copy of 'searchers' table */
+ lua_setfield(L, -3, "loaders"); /* put it in field 'loaders' */
+#endif
+ lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */
+}
+
+
+/*
+** create table CLIBS to keep track of loaded C libraries,
+** setting a finalizer to close all libraries when closing state.
+*/
+static void createclibstable (lua_State *L) {
+ lua_newtable(L); /* create CLIBS table */
+ lua_createtable(L, 0, 1); /* create metatable for CLIBS */
+ lua_pushcfunction(L, gctm);
+ lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */
+ lua_setmetatable(L, -2);
+ lua_rawsetp(L, LUA_REGISTRYINDEX, &CLIBS); /* set CLIBS table in registry */
+}
+
+
+LUAMOD_API int luaopen_package (lua_State *L) {
+ createclibstable(L);
+ luaL_newlib(L, pk_funcs); /* create 'package' table */
+ createsearcherstable(L);
+ /* set field 'path' */
+ setpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, LUA_PATH_DEFAULT);
+ /* set field 'cpath' */
+ setpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, LUA_CPATH_DEFAULT);
+ /* store config information */
+ lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n"
+ LUA_EXEC_DIR "\n" LUA_IGMARK "\n");
+ lua_setfield(L, -2, "config");
+ /* set field 'loaded' */
+ luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED");
+ lua_setfield(L, -2, "loaded");
+ /* set field 'preload' */
+ luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
+ lua_setfield(L, -2, "preload");
+ lua_pushglobaltable(L);
+ lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */
+ luaL_setfuncs(L, ll_funcs, 1); /* open lib into global table */
+ lua_pop(L, 1); /* pop global table */
+ return 1; /* return 'package' table */
+}
+
diff --git a/libs/lua/lua-5.3.3/lobject.c b/libs/lua/lua-5.3.3/lobject.c
new file mode 100644
index 0000000..9fe441f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lobject.c
@@ -0,0 +1,521 @@
+/*
+** $Id: lobject.c,v 2.111 2016/05/20 14:07:48 roberto Exp $
+** Some generic functions over Lua objects
+** See Copyright Notice in lua.h
+*/
+
+#define lobject_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <locale.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lctype.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "lvm.h"
+
+
+
+LUAI_DDEF const TValue luaO_nilobject_ = {NILCONSTANT};
+
+
+/*
+** converts an integer to a "floating point byte", represented as
+** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if
+** eeeee != 0 and (xxx) otherwise.
+*/
+int luaO_int2fb (unsigned int x) {
+ int e = 0; /* exponent */
+ if (x < 8) return x;
+ while (x >= (8 << 4)) { /* coarse steps */
+ x = (x + 0xf) >> 4; /* x = ceil(x / 16) */
+ e += 4;
+ }
+ while (x >= (8 << 1)) { /* fine steps */
+ x = (x + 1) >> 1; /* x = ceil(x / 2) */
+ e++;
+ }
+ return ((e+1) << 3) | (cast_int(x) - 8);
+}
+
+
+/* converts back */
+int luaO_fb2int (int x) {
+ return (x < 8) ? x : ((x & 7) + 8) << ((x >> 3) - 1);
+}
+
+
+/*
+** Computes ceil(log2(x))
+*/
+int luaO_ceillog2 (unsigned int x) {
+ static const lu_byte log_2[256] = { /* log_2[i] = ceil(log2(i - 1)) */
+ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
+ };
+ int l = 0;
+ x--;
+ while (x >= 256) { l += 8; x >>= 8; }
+ return l + log_2[x];
+}
+
+
+static lua_Integer intarith (lua_State *L, int op, lua_Integer v1,
+ lua_Integer v2) {
+ switch (op) {
+ case LUA_OPADD: return intop(+, v1, v2);
+ case LUA_OPSUB:return intop(-, v1, v2);
+ case LUA_OPMUL:return intop(*, v1, v2);
+ case LUA_OPMOD: return luaV_mod(L, v1, v2);
+ case LUA_OPIDIV: return luaV_div(L, v1, v2);
+ case LUA_OPBAND: return intop(&, v1, v2);
+ case LUA_OPBOR: return intop(|, v1, v2);
+ case LUA_OPBXOR: return intop(^, v1, v2);
+ case LUA_OPSHL: return luaV_shiftl(v1, v2);
+ case LUA_OPSHR: return luaV_shiftl(v1, -v2);
+ case LUA_OPUNM: return intop(-, 0, v1);
+ case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1);
+ default: lua_assert(0); return 0;
+ }
+}
+
+
+static lua_Number numarith (lua_State *L, int op, lua_Number v1,
+ lua_Number v2) {
+ switch (op) {
+ case LUA_OPADD: return luai_numadd(L, v1, v2);
+ case LUA_OPSUB: return luai_numsub(L, v1, v2);
+ case LUA_OPMUL: return luai_nummul(L, v1, v2);
+ case LUA_OPDIV: return luai_numdiv(L, v1, v2);
+ case LUA_OPPOW: return luai_numpow(L, v1, v2);
+ case LUA_OPIDIV: return luai_numidiv(L, v1, v2);
+ case LUA_OPUNM: return luai_numunm(L, v1);
+ case LUA_OPMOD: {
+ lua_Number m;
+ luai_nummod(L, v1, v2, m);
+ return m;
+ }
+ default: lua_assert(0); return 0;
+ }
+}
+
+
+void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2,
+ TValue *res) {
+ switch (op) {
+ case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR:
+ case LUA_OPSHL: case LUA_OPSHR:
+ case LUA_OPBNOT: { /* operate only on integers */
+ lua_Integer i1; lua_Integer i2;
+ if (tointeger(p1, &i1) && tointeger(p2, &i2)) {
+ setivalue(res, intarith(L, op, i1, i2));
+ return;
+ }
+ else break; /* go to the end */
+ }
+ case LUA_OPDIV: case LUA_OPPOW: { /* operate only on floats */
+ lua_Number n1; lua_Number n2;
+ if (tonumber(p1, &n1) && tonumber(p2, &n2)) {
+ setfltvalue(res, numarith(L, op, n1, n2));
+ return;
+ }
+ else break; /* go to the end */
+ }
+ default: { /* other operations */
+ lua_Number n1; lua_Number n2;
+ if (ttisinteger(p1) && ttisinteger(p2)) {
+ setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2)));
+ return;
+ }
+ else if (tonumber(p1, &n1) && tonumber(p2, &n2)) {
+ setfltvalue(res, numarith(L, op, n1, n2));
+ return;
+ }
+ else break; /* go to the end */
+ }
+ }
+ /* could not perform raw operation; try metamethod */
+ lua_assert(L != NULL); /* should not fail when folding (compile time) */
+ luaT_trybinTM(L, p1, p2, res, cast(TMS, (op - LUA_OPADD) + TM_ADD));
+}
+
+
+int luaO_hexavalue (int c) {
+ if (lisdigit(c)) return c - '0';
+ else return (ltolower(c) - 'a') + 10;
+}
+
+
+static int isneg (const char **s) {
+ if (**s == '-') { (*s)++; return 1; }
+ else if (**s == '+') (*s)++;
+ return 0;
+}
+
+
+
+/*
+** {==================================================================
+** Lua's implementation for 'lua_strx2number'
+** ===================================================================
+*/
+
+#if !defined(lua_strx2number)
+
+/* maximum number of significant digits to read (to avoid overflows
+ even with single floats) */
+#define MAXSIGDIG 30
+
+/*
+** convert an hexadecimal numeric string to a number, following
+** C99 specification for 'strtod'
+*/
+static lua_Number lua_strx2number (const char *s, char **endptr) {
+ int dot = lua_getlocaledecpoint();
+ lua_Number r = 0.0; /* result (accumulator) */
+ int sigdig = 0; /* number of significant digits */
+ int nosigdig = 0; /* number of non-significant digits */
+ int e = 0; /* exponent correction */
+ int neg; /* 1 if number is negative */
+ int hasdot = 0; /* true after seen a dot */
+ *endptr = cast(char *, s); /* nothing is valid yet */
+ while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */
+ neg = isneg(&s); /* check signal */
+ if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */
+ return 0.0; /* invalid format (no '0x') */
+ for (s += 2; ; s++) { /* skip '0x' and read numeral */
+ if (*s == dot) {
+ if (hasdot) break; /* second dot? stop loop */
+ else hasdot = 1;
+ }
+ else if (lisxdigit(cast_uchar(*s))) {
+ if (sigdig == 0 && *s == '0') /* non-significant digit (zero)? */
+ nosigdig++;
+ else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */
+ r = (r * cast_num(16.0)) + luaO_hexavalue(*s);
+ else e++; /* too many digits; ignore, but still count for exponent */
+ if (hasdot) e--; /* decimal digit? correct exponent */
+ }
+ else break; /* neither a dot nor a digit */
+ }
+ if (nosigdig + sigdig == 0) /* no digits? */
+ return 0.0; /* invalid format */
+ *endptr = cast(char *, s); /* valid up to here */
+ e *= 4; /* each digit multiplies/divides value by 2^4 */
+ if (*s == 'p' || *s == 'P') { /* exponent part? */
+ int exp1 = 0; /* exponent value */
+ int neg1; /* exponent signal */
+ s++; /* skip 'p' */
+ neg1 = isneg(&s); /* signal */
+ if (!lisdigit(cast_uchar(*s)))
+ return 0.0; /* invalid; must have at least one digit */
+ while (lisdigit(cast_uchar(*s))) /* read exponent */
+ exp1 = exp1 * 10 + *(s++) - '0';
+ if (neg1) exp1 = -exp1;
+ e += exp1;
+ *endptr = cast(char *, s); /* valid up to here */
+ }
+ if (neg) r = -r;
+ return l_mathop(ldexp)(r, e);
+}
+
+#endif
+/* }====================================================== */
+
+
+/* maximum length of a numeral */
+#if !defined (L_MAXLENNUM)
+#define L_MAXLENNUM 200
+#endif
+
+static const char *l_str2dloc (const char *s, lua_Number *result, int mode) {
+ char *endptr;
+ *result = (mode == 'x') ? lua_strx2number(s, &endptr) /* try to convert */
+ : lua_str2number(s, &endptr);
+ if (endptr == s) return NULL; /* nothing recognized? */
+ while (lisspace(cast_uchar(*endptr))) endptr++; /* skip trailing spaces */
+ return (*endptr == '\0') ? endptr : NULL; /* OK if no trailing characters */
+}
+
+
+/*
+** Convert string 's' to a Lua number (put in 'result'). Return NULL
+** on fail or the address of the ending '\0' on success.
+** 'pmode' points to (and 'mode' contains) special things in the string:
+** - 'x'/'X' means an hexadecimal numeral
+** - 'n'/'N' means 'inf' or 'nan' (which should be rejected)
+** - '.' just optimizes the search for the common case (nothing special)
+** This function accepts both the current locale or a dot as the radix
+** mark. If the convertion fails, it may mean number has a dot but
+** locale accepts something else. In that case, the code copies 's'
+** to a buffer (because 's' is read-only), changes the dot to the
+** current locale radix mark, and tries to convert again.
+*/
+static const char *l_str2d (const char *s, lua_Number *result) {
+ const char *endptr;
+ const char *pmode = strpbrk(s, ".xXnN");
+ int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0;
+ if (mode == 'n') /* reject 'inf' and 'nan' */
+ return NULL;
+ endptr = l_str2dloc(s, result, mode); /* try to convert */
+ if (endptr == NULL) { /* failed? may be a different locale */
+ char buff[L_MAXLENNUM + 1];
+ const char *pdot = strchr(s, '.');
+ if (strlen(s) > L_MAXLENNUM || pdot == NULL)
+ return NULL; /* string too long or no dot; fail */
+ strcpy(buff, s); /* copy string to buffer */
+ buff[pdot - s] = lua_getlocaledecpoint(); /* correct decimal point */
+ endptr = l_str2dloc(buff, result, mode); /* try again */
+ if (endptr != NULL)
+ endptr = s + (endptr - buff); /* make relative to 's' */
+ }
+ return endptr;
+}
+
+
+#define MAXBY10 cast(lua_Unsigned, LUA_MAXINTEGER / 10)
+#define MAXLASTD cast_int(LUA_MAXINTEGER % 10)
+
+static const char *l_str2int (const char *s, lua_Integer *result) {
+ lua_Unsigned a = 0;
+ int empty = 1;
+ int neg;
+ while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */
+ neg = isneg(&s);
+ if (s[0] == '0' &&
+ (s[1] == 'x' || s[1] == 'X')) { /* hex? */
+ s += 2; /* skip '0x' */
+ for (; lisxdigit(cast_uchar(*s)); s++) {
+ a = a * 16 + luaO_hexavalue(*s);
+ empty = 0;
+ }
+ }
+ else { /* decimal */
+ for (; lisdigit(cast_uchar(*s)); s++) {
+ int d = *s - '0';
+ if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */
+ return NULL; /* do not accept it (as integer) */
+ a = a * 10 + d;
+ empty = 0;
+ }
+ }
+ while (lisspace(cast_uchar(*s))) s++; /* skip trailing spaces */
+ if (empty || *s != '\0') return NULL; /* something wrong in the numeral */
+ else {
+ *result = l_castU2S((neg) ? 0u - a : a);
+ return s;
+ }
+}
+
+
+size_t luaO_str2num (const char *s, TValue *o) {
+ lua_Integer i; lua_Number n;
+ const char *e;
+ if ((e = l_str2int(s, &i)) != NULL) { /* try as an integer */
+ setivalue(o, i);
+ }
+ else if ((e = l_str2d(s, &n)) != NULL) { /* else try as a float */
+ setfltvalue(o, n);
+ }
+ else
+ return 0; /* conversion failed */
+ return (e - s) + 1; /* success; return string size */
+}
+
+
+int luaO_utf8esc (char *buff, unsigned long x) {
+ int n = 1; /* number of bytes put in buffer (backwards) */
+ lua_assert(x <= 0x10FFFF);
+ if (x < 0x80) /* ascii? */
+ buff[UTF8BUFFSZ - 1] = cast(char, x);
+ else { /* need continuation bytes */
+ unsigned int mfb = 0x3f; /* maximum that fits in first byte */
+ do { /* add continuation bytes */
+ buff[UTF8BUFFSZ - (n++)] = cast(char, 0x80 | (x & 0x3f));
+ x >>= 6; /* remove added bits */
+ mfb >>= 1; /* now there is one less bit available in first byte */
+ } while (x > mfb); /* still needs continuation byte? */
+ buff[UTF8BUFFSZ - n] = cast(char, (~mfb << 1) | x); /* add first byte */
+ }
+ return n;
+}
+
+
+/* maximum length of the conversion of a number to a string */
+#define MAXNUMBER2STR 50
+
+
+/*
+** Convert a number object to a string
+*/
+void luaO_tostring (lua_State *L, StkId obj) {
+ char buff[MAXNUMBER2STR];
+ size_t len;
+ lua_assert(ttisnumber(obj));
+ if (ttisinteger(obj))
+ len = lua_integer2str(buff, sizeof(buff), ivalue(obj));
+ else {
+ len = lua_number2str(buff, sizeof(buff), fltvalue(obj));
+#if !defined(LUA_COMPAT_FLOATSTRING)
+ if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */
+ buff[len++] = lua_getlocaledecpoint();
+ buff[len++] = '0'; /* adds '.0' to result */
+ }
+#endif
+ }
+ setsvalue2s(L, obj, luaS_newlstr(L, buff, len));
+}
+
+
+static void pushstr (lua_State *L, const char *str, size_t l) {
+ setsvalue2s(L, L->top, luaS_newlstr(L, str, l));
+ luaD_inctop(L);
+}
+
+
+/*
+** this function handles only '%d', '%c', '%f', '%p', and '%s'
+ conventional formats, plus Lua-specific '%I' and '%U'
+*/
+const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
+ int n = 0;
+ for (;;) {
+ const char *e = strchr(fmt, '%');
+ if (e == NULL) break;
+ pushstr(L, fmt, e - fmt);
+ switch (*(e+1)) {
+ case 's': { /* zero-terminated string */
+ const char *s = va_arg(argp, char *);
+ if (s == NULL) s = "(null)";
+ pushstr(L, s, strlen(s));
+ break;
+ }
+ case 'c': { /* an 'int' as a character */
+ char buff = cast(char, va_arg(argp, int));
+ if (lisprint(cast_uchar(buff)))
+ pushstr(L, &buff, 1);
+ else /* non-printable character; print its code */
+ luaO_pushfstring(L, "<\\%d>", cast_uchar(buff));
+ break;
+ }
+ case 'd': { /* an 'int' */
+ setivalue(L->top, va_arg(argp, int));
+ goto top2str;
+ }
+ case 'I': { /* a 'lua_Integer' */
+ setivalue(L->top, cast(lua_Integer, va_arg(argp, l_uacInt)));
+ goto top2str;
+ }
+ case 'f': { /* a 'lua_Number' */
+ setfltvalue(L->top, cast_num(va_arg(argp, l_uacNumber)));
+ top2str: /* convert the top element to a string */
+ luaD_inctop(L);
+ luaO_tostring(L, L->top - 1);
+ break;
+ }
+ case 'p': { /* a pointer */
+ char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */
+ int l = l_sprintf(buff, sizeof(buff), "%p", va_arg(argp, void *));
+ pushstr(L, buff, l);
+ break;
+ }
+ case 'U': { /* an 'int' as a UTF-8 sequence */
+ char buff[UTF8BUFFSZ];
+ int l = luaO_utf8esc(buff, cast(long, va_arg(argp, long)));
+ pushstr(L, buff + UTF8BUFFSZ - l, l);
+ break;
+ }
+ case '%': {
+ pushstr(L, "%", 1);
+ break;
+ }
+ default: {
+ luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'",
+ *(e + 1));
+ }
+ }
+ n += 2;
+ fmt = e+2;
+ }
+ luaD_checkstack(L, 1);
+ pushstr(L, fmt, strlen(fmt));
+ if (n > 0) luaV_concat(L, n + 1);
+ return svalue(L->top - 1);
+}
+
+
+const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {
+ const char *msg;
+ va_list argp;
+ va_start(argp, fmt);
+ msg = luaO_pushvfstring(L, fmt, argp);
+ va_end(argp);
+ return msg;
+}
+
+
+/* number of chars of a literal string without the ending \0 */
+#define LL(x) (sizeof(x)/sizeof(char) - 1)
+
+#define RETS "..."
+#define PRE "[string \""
+#define POS "\"]"
+
+#define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) )
+
+void luaO_chunkid (char *out, const char *source, size_t bufflen) {
+ size_t l = strlen(source);
+ if (*source == '=') { /* 'literal' source */
+ if (l <= bufflen) /* small enough? */
+ memcpy(out, source + 1, l * sizeof(char));
+ else { /* truncate it */
+ addstr(out, source + 1, bufflen - 1);
+ *out = '\0';
+ }
+ }
+ else if (*source == '@') { /* file name */
+ if (l <= bufflen) /* small enough? */
+ memcpy(out, source + 1, l * sizeof(char));
+ else { /* add '...' before rest of name */
+ addstr(out, RETS, LL(RETS));
+ bufflen -= LL(RETS);
+ memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char));
+ }
+ }
+ else { /* string; format as [string "source"] */
+ const char *nl = strchr(source, '\n'); /* find first new line (if any) */
+ addstr(out, PRE, LL(PRE)); /* add prefix */
+ bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */
+ if (l < bufflen && nl == NULL) { /* small one-line source? */
+ addstr(out, source, l); /* keep it */
+ }
+ else {
+ if (nl != NULL) l = nl - source; /* stop at first newline */
+ if (l > bufflen) l = bufflen;
+ addstr(out, source, l);
+ addstr(out, RETS, LL(RETS));
+ }
+ memcpy(out, POS, (LL(POS) + 1) * sizeof(char));
+ }
+}
+
diff --git a/libs/lua/lua-5.3.3/lobject.h b/libs/lua/lua-5.3.3/lobject.h
new file mode 100644
index 0000000..2d52b41
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lobject.h
@@ -0,0 +1,549 @@
+/*
+** $Id: lobject.h,v 2.116 2015/11/03 18:33:10 roberto Exp $
+** Type definitions for Lua objects
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lobject_h
+#define lobject_h
+
+
+#include <stdarg.h>
+
+
+#include "llimits.h"
+#include "lua.h"
+
+
+/*
+** Extra tags for non-values
+*/
+#define LUA_TPROTO LUA_NUMTAGS /* function prototypes */
+#define LUA_TDEADKEY (LUA_NUMTAGS+1) /* removed keys in tables */
+
+/*
+** number of all possible tags (including LUA_TNONE but excluding DEADKEY)
+*/
+#define LUA_TOTALTAGS (LUA_TPROTO + 2)
+
+
+/*
+** tags for Tagged Values have the following use of bits:
+** bits 0-3: actual tag (a LUA_T* value)
+** bits 4-5: variant bits
+** bit 6: whether value is collectable
+*/
+
+
+/*
+** LUA_TFUNCTION variants:
+** 0 - Lua function
+** 1 - light C function
+** 2 - regular C function (closure)
+*/
+
+/* Variant tags for functions */
+#define LUA_TLCL (LUA_TFUNCTION | (0 << 4)) /* Lua closure */
+#define LUA_TLCF (LUA_TFUNCTION | (1 << 4)) /* light C function */
+#define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */
+
+
+/* Variant tags for strings */
+#define LUA_TSHRSTR (LUA_TSTRING | (0 << 4)) /* short strings */
+#define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */
+
+
+/* Variant tags for numbers */
+#define LUA_TNUMFLT (LUA_TNUMBER | (0 << 4)) /* float numbers */
+#define LUA_TNUMINT (LUA_TNUMBER | (1 << 4)) /* integer numbers */
+
+
+/* Bit mark for collectable types */
+#define BIT_ISCOLLECTABLE (1 << 6)
+
+/* mark a tag as collectable */
+#define ctb(t) ((t) | BIT_ISCOLLECTABLE)
+
+
+/*
+** Common type for all collectable objects
+*/
+typedef struct GCObject GCObject;
+
+
+/*
+** Common Header for all collectable objects (in macro form, to be
+** included in other objects)
+*/
+#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked
+
+
+/*
+** Common type has only the common header
+*/
+struct GCObject {
+ CommonHeader;
+};
+
+
+
+
+/*
+** Tagged Values. This is the basic representation of values in Lua,
+** an actual value plus a tag with its type.
+*/
+
+/*
+** Union of all Lua values
+*/
+typedef union Value {
+ GCObject *gc; /* collectable objects */
+ void *p; /* light userdata */
+ int b; /* booleans */
+ lua_CFunction f; /* light C functions */
+ lua_Integer i; /* integer numbers */
+ lua_Number n; /* float numbers */
+} Value;
+
+
+#define TValuefields Value value_; int tt_
+
+
+typedef struct lua_TValue {
+ TValuefields;
+} TValue;
+
+
+
+/* macro defining a nil value */
+#define NILCONSTANT {NULL}, LUA_TNIL
+
+
+#define val_(o) ((o)->value_)
+
+
+/* raw type tag of a TValue */
+#define rttype(o) ((o)->tt_)
+
+/* tag with no variants (bits 0-3) */
+#define novariant(x) ((x) & 0x0F)
+
+/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */
+#define ttype(o) (rttype(o) & 0x3F)
+
+/* type tag of a TValue with no variants (bits 0-3) */
+#define ttnov(o) (novariant(rttype(o)))
+
+
+/* Macros to test type */
+#define checktag(o,t) (rttype(o) == (t))
+#define checktype(o,t) (ttnov(o) == (t))
+#define ttisnumber(o) checktype((o), LUA_TNUMBER)
+#define ttisfloat(o) checktag((o), LUA_TNUMFLT)
+#define ttisinteger(o) checktag((o), LUA_TNUMINT)
+#define ttisnil(o) checktag((o), LUA_TNIL)
+#define ttisboolean(o) checktag((o), LUA_TBOOLEAN)
+#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA)
+#define ttisstring(o) checktype((o), LUA_TSTRING)
+#define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR))
+#define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR))
+#define ttistable(o) checktag((o), ctb(LUA_TTABLE))
+#define ttisfunction(o) checktype(o, LUA_TFUNCTION)
+#define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION)
+#define ttisCclosure(o) checktag((o), ctb(LUA_TCCL))
+#define ttisLclosure(o) checktag((o), ctb(LUA_TLCL))
+#define ttislcf(o) checktag((o), LUA_TLCF)
+#define ttisfulluserdata(o) checktag((o), ctb(LUA_TUSERDATA))
+#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD))
+#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY)
+
+
+/* Macros to access values */
+#define ivalue(o) check_exp(ttisinteger(o), val_(o).i)
+#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n)
+#define nvalue(o) check_exp(ttisnumber(o), \
+ (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o)))
+#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc)
+#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p)
+#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc))
+#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc))
+#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc))
+#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc))
+#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc))
+#define fvalue(o) check_exp(ttislcf(o), val_(o).f)
+#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc))
+#define bvalue(o) check_exp(ttisboolean(o), val_(o).b)
+#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc))
+/* a dead value may get the 'gc' field, but cannot access its contents */
+#define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc))
+
+#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
+
+
+#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE)
+
+
+/* Macros for internal tests */
+#define righttt(obj) (ttype(obj) == gcvalue(obj)->tt)
+
+#define checkliveness(L,obj) \
+ lua_longassert(!iscollectable(obj) || \
+ (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj)))))
+
+
+/* Macros to set values */
+#define settt_(o,t) ((o)->tt_=(t))
+
+#define setfltvalue(obj,x) \
+ { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); }
+
+#define chgfltvalue(obj,x) \
+ { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); }
+
+#define setivalue(obj,x) \
+ { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); }
+
+#define chgivalue(obj,x) \
+ { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); }
+
+#define setnilvalue(obj) settt_(obj, LUA_TNIL)
+
+#define setfvalue(obj,x) \
+ { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); }
+
+#define setpvalue(obj,x) \
+ { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); }
+
+#define setbvalue(obj,x) \
+ { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); }
+
+#define setgcovalue(L,obj,x) \
+ { TValue *io = (obj); GCObject *i_g=(x); \
+ val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); }
+
+#define setsvalue(L,obj,x) \
+ { TValue *io = (obj); TString *x_ = (x); \
+ val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \
+ checkliveness(L,io); }
+
+#define setuvalue(L,obj,x) \
+ { TValue *io = (obj); Udata *x_ = (x); \
+ val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \
+ checkliveness(L,io); }
+
+#define setthvalue(L,obj,x) \
+ { TValue *io = (obj); lua_State *x_ = (x); \
+ val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \
+ checkliveness(L,io); }
+
+#define setclLvalue(L,obj,x) \
+ { TValue *io = (obj); LClosure *x_ = (x); \
+ val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \
+ checkliveness(L,io); }
+
+#define setclCvalue(L,obj,x) \
+ { TValue *io = (obj); CClosure *x_ = (x); \
+ val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \
+ checkliveness(L,io); }
+
+#define sethvalue(L,obj,x) \
+ { TValue *io = (obj); Table *x_ = (x); \
+ val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \
+ checkliveness(L,io); }
+
+#define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY)
+
+
+
+#define setobj(L,obj1,obj2) \
+ { TValue *io1=(obj1); *io1 = *(obj2); \
+ (void)L; checkliveness(L,io1); }
+
+
+/*
+** different types of assignments, according to destination
+*/
+
+/* from stack to (same) stack */
+#define setobjs2s setobj
+/* to stack (not from same stack) */
+#define setobj2s setobj
+#define setsvalue2s setsvalue
+#define sethvalue2s sethvalue
+#define setptvalue2s setptvalue
+/* from table to same table */
+#define setobjt2t setobj
+/* to new object */
+#define setobj2n setobj
+#define setsvalue2n setsvalue
+
+/* to table (define it as an expression to be used in macros) */
+#define setobj2t(L,o1,o2) ((void)L, *(o1)=*(o2), checkliveness(L,(o1)))
+
+
+
+
+/*
+** {======================================================
+** types and prototypes
+** =======================================================
+*/
+
+
+typedef TValue *StkId; /* index to stack elements */
+
+
+
+
+/*
+** Header for string value; string bytes follow the end of this structure
+** (aligned according to 'UTString'; see next).
+*/
+typedef struct TString {
+ CommonHeader;
+ lu_byte extra; /* reserved words for short strings; "has hash" for longs */
+ lu_byte shrlen; /* length for short strings */
+ unsigned int hash;
+ union {
+ size_t lnglen; /* length for long strings */
+ struct TString *hnext; /* linked list for hash table */
+ } u;
+} TString;
+
+
+/*
+** Ensures that address after this type is always fully aligned.
+*/
+typedef union UTString {
+ L_Umaxalign dummy; /* ensures maximum alignment for strings */
+ TString tsv;
+} UTString;
+
+
+/*
+** Get the actual string (array of bytes) from a 'TString'.
+** (Access to 'extra' ensures that value is really a 'TString'.)
+*/
+#define getstr(ts) \
+ check_exp(sizeof((ts)->extra), cast(char *, (ts)) + sizeof(UTString))
+
+
+/* get the actual string (array of bytes) from a Lua value */
+#define svalue(o) getstr(tsvalue(o))
+
+/* get string length from 'TString *s' */
+#define tsslen(s) ((s)->tt == LUA_TSHRSTR ? (s)->shrlen : (s)->u.lnglen)
+
+/* get string length from 'TValue *o' */
+#define vslen(o) tsslen(tsvalue(o))
+
+
+/*
+** Header for userdata; memory area follows the end of this structure
+** (aligned according to 'UUdata'; see next).
+*/
+typedef struct Udata {
+ CommonHeader;
+ lu_byte ttuv_; /* user value's tag */
+ struct Table *metatable;
+ size_t len; /* number of bytes */
+ union Value user_; /* user value */
+} Udata;
+
+
+/*
+** Ensures that address after this type is always fully aligned.
+*/
+typedef union UUdata {
+ L_Umaxalign dummy; /* ensures maximum alignment for 'local' udata */
+ Udata uv;
+} UUdata;
+
+
+/*
+** Get the address of memory block inside 'Udata'.
+** (Access to 'ttuv_' ensures that value is really a 'Udata'.)
+*/
+#define getudatamem(u) \
+ check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata)))
+
+#define setuservalue(L,u,o) \
+ { const TValue *io=(o); Udata *iu = (u); \
+ iu->user_ = io->value_; iu->ttuv_ = rttype(io); \
+ checkliveness(L,io); }
+
+
+#define getuservalue(L,u,o) \
+ { TValue *io=(o); const Udata *iu = (u); \
+ io->value_ = iu->user_; settt_(io, iu->ttuv_); \
+ checkliveness(L,io); }
+
+
+/*
+** Description of an upvalue for function prototypes
+*/
+typedef struct Upvaldesc {
+ TString *name; /* upvalue name (for debug information) */
+ lu_byte instack; /* whether it is in stack (register) */
+ lu_byte idx; /* index of upvalue (in stack or in outer function's list) */
+} Upvaldesc;
+
+
+/*
+** Description of a local variable for function prototypes
+** (used for debug information)
+*/
+typedef struct LocVar {
+ TString *varname;
+ int startpc; /* first point where variable is active */
+ int endpc; /* first point where variable is dead */
+} LocVar;
+
+
+/*
+** Function Prototypes
+*/
+typedef struct Proto {
+ CommonHeader;
+ lu_byte numparams; /* number of fixed parameters */
+ lu_byte is_vararg; /* 2: declared vararg; 1: uses vararg */
+ lu_byte maxstacksize; /* number of registers needed by this function */
+ int sizeupvalues; /* size of 'upvalues' */
+ int sizek; /* size of 'k' */
+ int sizecode;
+ int sizelineinfo;
+ int sizep; /* size of 'p' */
+ int sizelocvars;
+ int linedefined; /* debug information */
+ int lastlinedefined; /* debug information */
+ TValue *k; /* constants used by the function */
+ Instruction *code; /* opcodes */
+ struct Proto **p; /* functions defined inside the function */
+ int *lineinfo; /* map from opcodes to source lines (debug information) */
+ LocVar *locvars; /* information about local variables (debug information) */
+ Upvaldesc *upvalues; /* upvalue information */
+ struct LClosure *cache; /* last-created closure with this prototype */
+ TString *source; /* used for debug information */
+ GCObject *gclist;
+} Proto;
+
+
+
+/*
+** Lua Upvalues
+*/
+typedef struct UpVal UpVal;
+
+
+/*
+** Closures
+*/
+
+#define ClosureHeader \
+ CommonHeader; lu_byte nupvalues; GCObject *gclist
+
+typedef struct CClosure {
+ ClosureHeader;
+ lua_CFunction f;
+ TValue upvalue[1]; /* list of upvalues */
+} CClosure;
+
+
+typedef struct LClosure {
+ ClosureHeader;
+ struct Proto *p;
+ UpVal *upvals[1]; /* list of upvalues */
+} LClosure;
+
+
+typedef union Closure {
+ CClosure c;
+ LClosure l;
+} Closure;
+
+
+#define isLfunction(o) ttisLclosure(o)
+
+#define getproto(o) (clLvalue(o)->p)
+
+
+/*
+** Tables
+*/
+
+typedef union TKey {
+ struct {
+ TValuefields;
+ int next; /* for chaining (offset for next node) */
+ } nk;
+ TValue tvk;
+} TKey;
+
+
+/* copy a value into a key without messing up field 'next' */
+#define setnodekey(L,key,obj) \
+ { TKey *k_=(key); const TValue *io_=(obj); \
+ k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \
+ (void)L; checkliveness(L,io_); }
+
+
+typedef struct Node {
+ TValue i_val;
+ TKey i_key;
+} Node;
+
+
+typedef struct Table {
+ CommonHeader;
+ lu_byte flags; /* 1<<p means tagmethod(p) is not present */
+ lu_byte lsizenode; /* log2 of size of 'node' array */
+ unsigned int sizearray; /* size of 'array' array */
+ TValue *array; /* array part */
+ Node *node;
+ Node *lastfree; /* any free position is before this position */
+ struct Table *metatable;
+ GCObject *gclist;
+} Table;
+
+
+
+/*
+** 'module' operation for hashing (size is always a power of 2)
+*/
+#define lmod(s,size) \
+ (check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1)))))
+
+
+#define twoto(x) (1<<(x))
+#define sizenode(t) (twoto((t)->lsizenode))
+
+
+/*
+** (address of) a fixed nil value
+*/
+#define luaO_nilobject (&luaO_nilobject_)
+
+
+LUAI_DDEC const TValue luaO_nilobject_;
+
+/* size of buffer for 'luaO_utf8esc' function */
+#define UTF8BUFFSZ 8
+
+LUAI_FUNC int luaO_int2fb (unsigned int x);
+LUAI_FUNC int luaO_fb2int (int x);
+LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x);
+LUAI_FUNC int luaO_ceillog2 (unsigned int x);
+LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1,
+ const TValue *p2, TValue *res);
+LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o);
+LUAI_FUNC int luaO_hexavalue (int c);
+LUAI_FUNC void luaO_tostring (lua_State *L, StkId obj);
+LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,
+ va_list argp);
+LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);
+LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);
+
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lopcodes.c b/libs/lua/lua-5.3.3/lopcodes.c
new file mode 100644
index 0000000..a1cbef8
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lopcodes.c
@@ -0,0 +1,124 @@
+/*
+** $Id: lopcodes.c,v 1.55 2015/01/05 13:48:33 roberto Exp $
+** Opcodes for Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#define lopcodes_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lopcodes.h"
+
+
+/* ORDER OP */
+
+LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = {
+ "MOVE",
+ "LOADK",
+ "LOADKX",
+ "LOADBOOL",
+ "LOADNIL",
+ "GETUPVAL",
+ "GETTABUP",
+ "GETTABLE",
+ "SETTABUP",
+ "SETUPVAL",
+ "SETTABLE",
+ "NEWTABLE",
+ "SELF",
+ "ADD",
+ "SUB",
+ "MUL",
+ "MOD",
+ "POW",
+ "DIV",
+ "IDIV",
+ "BAND",
+ "BOR",
+ "BXOR",
+ "SHL",
+ "SHR",
+ "UNM",
+ "BNOT",
+ "NOT",
+ "LEN",
+ "CONCAT",
+ "JMP",
+ "EQ",
+ "LT",
+ "LE",
+ "TEST",
+ "TESTSET",
+ "CALL",
+ "TAILCALL",
+ "RETURN",
+ "FORLOOP",
+ "FORPREP",
+ "TFORCALL",
+ "TFORLOOP",
+ "SETLIST",
+ "CLOSURE",
+ "VARARG",
+ "EXTRAARG",
+ NULL
+};
+
+
+#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))
+
+LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
+/* T A B C mode opcode */
+ opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */
+ ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */
+ ,opmode(0, 1, OpArgN, OpArgN, iABx) /* OP_LOADKX */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */
+ ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_LOADNIL */
+ ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */
+ ,opmode(0, 1, OpArgU, OpArgK, iABC) /* OP_GETTABUP */
+ ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETTABLE */
+ ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABUP */
+ ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */
+ ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABLE */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */
+ ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_ADD */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SUB */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MUL */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MOD */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_IDIV */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BAND */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BOR */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BXOR */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SHL */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SHR */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_BNOT */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */
+ ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_CONCAT */
+ ,opmode(0, 0, OpArgR, OpArgN, iAsBx) /* OP_JMP */
+ ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_EQ */
+ ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LT */
+ ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LE */
+ ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TEST */
+ ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TESTSET */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_CALL */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_TAILCALL */
+ ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_RETURN */
+ ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORLOOP */
+ ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORPREP */
+ ,opmode(0, 0, OpArgN, OpArgU, iABC) /* OP_TFORCALL */
+ ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_TFORLOOP */
+ ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */
+ ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */
+ ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */
+ ,opmode(0, 0, OpArgU, OpArgU, iAx) /* OP_EXTRAARG */
+};
+
diff --git a/libs/lua/lua-5.3.3/lopcodes.h b/libs/lua/lua-5.3.3/lopcodes.h
new file mode 100644
index 0000000..864b8e4
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lopcodes.h
@@ -0,0 +1,295 @@
+/*
+** $Id: lopcodes.h,v 1.148 2014/10/25 11:50:46 roberto Exp $
+** Opcodes for Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lopcodes_h
+#define lopcodes_h
+
+#include "llimits.h"
+
+
+/*===========================================================================
+ We assume that instructions are unsigned numbers.
+ All instructions have an opcode in the first 6 bits.
+ Instructions can have the following fields:
+ 'A' : 8 bits
+ 'B' : 9 bits
+ 'C' : 9 bits
+ 'Ax' : 26 bits ('A', 'B', and 'C' together)
+ 'Bx' : 18 bits ('B' and 'C' together)
+ 'sBx' : signed Bx
+
+ A signed argument is represented in excess K; that is, the number
+ value is the unsigned value minus K. K is exactly the maximum value
+ for that argument (so that -max is represented by 0, and +max is
+ represented by 2*max), which is half the maximum for the corresponding
+ unsigned argument.
+===========================================================================*/
+
+
+enum OpMode {iABC, iABx, iAsBx, iAx}; /* basic instruction format */
+
+
+/*
+** size and position of opcode arguments.
+*/
+#define SIZE_C 9
+#define SIZE_B 9
+#define SIZE_Bx (SIZE_C + SIZE_B)
+#define SIZE_A 8
+#define SIZE_Ax (SIZE_C + SIZE_B + SIZE_A)
+
+#define SIZE_OP 6
+
+#define POS_OP 0
+#define POS_A (POS_OP + SIZE_OP)
+#define POS_C (POS_A + SIZE_A)
+#define POS_B (POS_C + SIZE_C)
+#define POS_Bx POS_C
+#define POS_Ax POS_A
+
+
+/*
+** limits for opcode arguments.
+** we use (signed) int to manipulate most arguments,
+** so they must fit in LUAI_BITSINT-1 bits (-1 for sign)
+*/
+#if SIZE_Bx < LUAI_BITSINT-1
+#define MAXARG_Bx ((1<<SIZE_Bx)-1)
+#define MAXARG_sBx (MAXARG_Bx>>1) /* 'sBx' is signed */
+#else
+#define MAXARG_Bx MAX_INT
+#define MAXARG_sBx MAX_INT
+#endif
+
+#if SIZE_Ax < LUAI_BITSINT-1
+#define MAXARG_Ax ((1<<SIZE_Ax)-1)
+#else
+#define MAXARG_Ax MAX_INT
+#endif
+
+
+#define MAXARG_A ((1<<SIZE_A)-1)
+#define MAXARG_B ((1<<SIZE_B)-1)
+#define MAXARG_C ((1<<SIZE_C)-1)
+
+
+/* creates a mask with 'n' 1 bits at position 'p' */
+#define MASK1(n,p) ((~((~(Instruction)0)<<(n)))<<(p))
+
+/* creates a mask with 'n' 0 bits at position 'p' */
+#define MASK0(n,p) (~MASK1(n,p))
+
+/*
+** the following macros help to manipulate instructions
+*/
+
+#define GET_OPCODE(i) (cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0)))
+#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \
+ ((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP))))
+
+#define getarg(i,pos,size) (cast(int, ((i)>>pos) & MASK1(size,0)))
+#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \
+ ((cast(Instruction, v)<<pos)&MASK1(size,pos))))
+
+#define GETARG_A(i) getarg(i, POS_A, SIZE_A)
+#define SETARG_A(i,v) setarg(i, v, POS_A, SIZE_A)
+
+#define GETARG_B(i) getarg(i, POS_B, SIZE_B)
+#define SETARG_B(i,v) setarg(i, v, POS_B, SIZE_B)
+
+#define GETARG_C(i) getarg(i, POS_C, SIZE_C)
+#define SETARG_C(i,v) setarg(i, v, POS_C, SIZE_C)
+
+#define GETARG_Bx(i) getarg(i, POS_Bx, SIZE_Bx)
+#define SETARG_Bx(i,v) setarg(i, v, POS_Bx, SIZE_Bx)
+
+#define GETARG_Ax(i) getarg(i, POS_Ax, SIZE_Ax)
+#define SETARG_Ax(i,v) setarg(i, v, POS_Ax, SIZE_Ax)
+
+#define GETARG_sBx(i) (GETARG_Bx(i)-MAXARG_sBx)
+#define SETARG_sBx(i,b) SETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx))
+
+
+#define CREATE_ABC(o,a,b,c) ((cast(Instruction, o)<<POS_OP) \
+ | (cast(Instruction, a)<<POS_A) \
+ | (cast(Instruction, b)<<POS_B) \
+ | (cast(Instruction, c)<<POS_C))
+
+#define CREATE_ABx(o,a,bc) ((cast(Instruction, o)<<POS_OP) \
+ | (cast(Instruction, a)<<POS_A) \
+ | (cast(Instruction, bc)<<POS_Bx))
+
+#define CREATE_Ax(o,a) ((cast(Instruction, o)<<POS_OP) \
+ | (cast(Instruction, a)<<POS_Ax))
+
+
+/*
+** Macros to operate RK indices
+*/
+
+/* this bit 1 means constant (0 means register) */
+#define BITRK (1 << (SIZE_B - 1))
+
+/* test whether value is a constant */
+#define ISK(x) ((x) & BITRK)
+
+/* gets the index of the constant */
+#define INDEXK(r) ((int)(r) & ~BITRK)
+
+#define MAXINDEXRK (BITRK - 1)
+
+/* code a constant index as a RK value */
+#define RKASK(x) ((x) | BITRK)
+
+
+/*
+** invalid register that fits in 8 bits
+*/
+#define NO_REG MAXARG_A
+
+
+/*
+** R(x) - register
+** Kst(x) - constant (in constant table)
+** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)
+*/
+
+
+/*
+** grep "ORDER OP" if you change these enums
+*/
+
+typedef enum {
+/*----------------------------------------------------------------------
+name args description
+------------------------------------------------------------------------*/
+OP_MOVE,/* A B R(A) := R(B) */
+OP_LOADK,/* A Bx R(A) := Kst(Bx) */
+OP_LOADKX,/* A R(A) := Kst(extra arg) */
+OP_LOADBOOL,/* A B C R(A) := (Bool)B; if (C) pc++ */
+OP_LOADNIL,/* A B R(A), R(A+1), ..., R(A+B) := nil */
+OP_GETUPVAL,/* A B R(A) := UpValue[B] */
+
+OP_GETTABUP,/* A B C R(A) := UpValue[B][RK(C)] */
+OP_GETTABLE,/* A B C R(A) := R(B)[RK(C)] */
+
+OP_SETTABUP,/* A B C UpValue[A][RK(B)] := RK(C) */
+OP_SETUPVAL,/* A B UpValue[B] := R(A) */
+OP_SETTABLE,/* A B C R(A)[RK(B)] := RK(C) */
+
+OP_NEWTABLE,/* A B C R(A) := {} (size = B,C) */
+
+OP_SELF,/* A B C R(A+1) := R(B); R(A) := R(B)[RK(C)] */
+
+OP_ADD,/* A B C R(A) := RK(B) + RK(C) */
+OP_SUB,/* A B C R(A) := RK(B) - RK(C) */
+OP_MUL,/* A B C R(A) := RK(B) * RK(C) */
+OP_MOD,/* A B C R(A) := RK(B) % RK(C) */
+OP_POW,/* A B C R(A) := RK(B) ^ RK(C) */
+OP_DIV,/* A B C R(A) := RK(B) / RK(C) */
+OP_IDIV,/* A B C R(A) := RK(B) // RK(C) */
+OP_BAND,/* A B C R(A) := RK(B) & RK(C) */
+OP_BOR,/* A B C R(A) := RK(B) | RK(C) */
+OP_BXOR,/* A B C R(A) := RK(B) ~ RK(C) */
+OP_SHL,/* A B C R(A) := RK(B) << RK(C) */
+OP_SHR,/* A B C R(A) := RK(B) >> RK(C) */
+OP_UNM,/* A B R(A) := -R(B) */
+OP_BNOT,/* A B R(A) := ~R(B) */
+OP_NOT,/* A B R(A) := not R(B) */
+OP_LEN,/* A B R(A) := length of R(B) */
+
+OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */
+
+OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A - 1) */
+OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */
+OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */
+OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */
+
+OP_TEST,/* A C if not (R(A) <=> C) then pc++ */
+OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */
+
+OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
+OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */
+OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */
+
+OP_FORLOOP,/* A sBx R(A)+=R(A+2);
+ if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
+OP_FORPREP,/* A sBx R(A)-=R(A+2); pc+=sBx */
+
+OP_TFORCALL,/* A C R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); */
+OP_TFORLOOP,/* A sBx if R(A+1) ~= nil then { R(A)=R(A+1); pc += sBx }*/
+
+OP_SETLIST,/* A B C R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B */
+
+OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx]) */
+
+OP_VARARG,/* A B R(A), R(A+1), ..., R(A+B-2) = vararg */
+
+OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
+} OpCode;
+
+
+#define NUM_OPCODES (cast(int, OP_EXTRAARG) + 1)
+
+
+
+/*===========================================================================
+ Notes:
+ (*) In OP_CALL, if (B == 0) then B = top. If (C == 0), then 'top' is
+ set to last_result+1, so next open instruction (OP_CALL, OP_RETURN,
+ OP_SETLIST) may use 'top'.
+
+ (*) In OP_VARARG, if (B == 0) then use actual number of varargs and
+ set top (like in OP_CALL with C == 0).
+
+ (*) In OP_RETURN, if (B == 0) then return up to 'top'.
+
+ (*) In OP_SETLIST, if (B == 0) then B = 'top'; if (C == 0) then next
+ 'instruction' is EXTRAARG(real C).
+
+ (*) In OP_LOADKX, the next 'instruction' is always EXTRAARG.
+
+ (*) For comparisons, A specifies what condition the test should accept
+ (true or false).
+
+ (*) All 'skips' (pc++) assume that next instruction is a jump.
+
+===========================================================================*/
+
+
+/*
+** masks for instruction properties. The format is:
+** bits 0-1: op mode
+** bits 2-3: C arg mode
+** bits 4-5: B arg mode
+** bit 6: instruction set register A
+** bit 7: operator is a test (next instruction must be a jump)
+*/
+
+enum OpArgMask {
+ OpArgN, /* argument is not used */
+ OpArgU, /* argument is used */
+ OpArgR, /* argument is a register or a jump offset */
+ OpArgK /* argument is a constant or register/constant */
+};
+
+LUAI_DDEC const lu_byte luaP_opmodes[NUM_OPCODES];
+
+#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 3))
+#define getBMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3))
+#define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3))
+#define testAMode(m) (luaP_opmodes[m] & (1 << 6))
+#define testTMode(m) (luaP_opmodes[m] & (1 << 7))
+
+
+LUAI_DDEC const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */
+
+
+/* number of list items to accumulate before a SETLIST instruction */
+#define LFIELDS_PER_FLUSH 50
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/loslib.c b/libs/lua/lua-5.3.3/loslib.c
new file mode 100644
index 0000000..4810655
--- /dev/null
+++ b/libs/lua/lua-5.3.3/loslib.c
@@ -0,0 +1,403 @@
+/*
+** $Id: loslib.c,v 1.64 2016/04/18 13:06:55 roberto Exp $
+** Standard Operating System library
+** See Copyright Notice in lua.h
+*/
+
+#define loslib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** {==================================================================
+** List of valid conversion specifiers for the 'strftime' function;
+** options are grouped by length; group of length 2 start with '||'.
+** ===================================================================
+*/
+#if !defined(LUA_STRFTIMEOPTIONS) /* { */
+
+/* options for ANSI C 89 */
+#define L_STRFTIMEC89 "aAbBcdHIjmMpSUwWxXyYZ%"
+
+/* options for ISO C 99 and POSIX */
+#define L_STRFTIMEC99 "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \
+ "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy"
+
+/* options for Windows */
+#define L_STRFTIMEWIN "aAbBcdHIjmMpSUwWxXyYzZ%" \
+ "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y"
+
+#if defined(LUA_USE_WINDOWS)
+#define LUA_STRFTIMEOPTIONS L_STRFTIMEWIN
+#elif defined(LUA_USE_C89)
+#define LUA_STRFTIMEOPTIONS L_STRFTIMEC89
+#else /* C99 specification */
+#define LUA_STRFTIMEOPTIONS L_STRFTIMEC99
+#endif
+
+#endif /* } */
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Configuration for time-related stuff
+** ===================================================================
+*/
+
+#if !defined(l_time_t) /* { */
+/*
+** type to represent time_t in Lua
+*/
+#define l_timet lua_Integer
+#define l_pushtime(L,t) lua_pushinteger(L,(lua_Integer)(t))
+
+static time_t l_checktime (lua_State *L, int arg) {
+ lua_Integer t = luaL_checkinteger(L, arg);
+ luaL_argcheck(L, (time_t)t == t, arg, "time out-of-bounds");
+ return (time_t)t;
+}
+
+#endif /* } */
+
+
+#if !defined(l_gmtime) /* { */
+/*
+** By default, Lua uses gmtime/localtime, except when POSIX is available,
+** where it uses gmtime_r/localtime_r
+*/
+
+#if defined(LUA_USE_POSIX) /* { */
+
+#define l_gmtime(t,r) gmtime_r(t,r)
+#define l_localtime(t,r) localtime_r(t,r)
+
+#else /* }{ */
+
+/* ISO C definitions */
+#define l_gmtime(t,r) ((void)(r)->tm_sec, gmtime(t))
+#define l_localtime(t,r) ((void)(r)->tm_sec, localtime(t))
+
+#endif /* } */
+
+#endif /* } */
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Configuration for 'tmpnam':
+** By default, Lua uses tmpnam except when POSIX is available, where
+** it uses mkstemp.
+** ===================================================================
+*/
+#if !defined(lua_tmpnam) /* { */
+
+#if defined(LUA_USE_POSIX) /* { */
+
+#include <unistd.h>
+
+#define LUA_TMPNAMBUFSIZE 32
+
+#if !defined(LUA_TMPNAMTEMPLATE)
+#define LUA_TMPNAMTEMPLATE "/tmp/lua_XXXXXX"
+#endif
+
+#define lua_tmpnam(b,e) { \
+ strcpy(b, LUA_TMPNAMTEMPLATE); \
+ e = mkstemp(b); \
+ if (e != -1) close(e); \
+ e = (e == -1); }
+
+#else /* }{ */
+
+/* ISO C definitions */
+#define LUA_TMPNAMBUFSIZE L_tmpnam
+#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); }
+
+#endif /* } */
+
+#endif /* } */
+/* }================================================================== */
+
+
+
+
+static int os_execute (lua_State *L) {
+ const char *cmd = luaL_optstring(L, 1, NULL);
+ int stat = system(cmd);
+ if (cmd != NULL)
+ return luaL_execresult(L, stat);
+ else {
+ lua_pushboolean(L, stat); /* true if there is a shell */
+ return 1;
+ }
+}
+
+
+static int os_remove (lua_State *L) {
+ const char *filename = luaL_checkstring(L, 1);
+ return luaL_fileresult(L, remove(filename) == 0, filename);
+}
+
+
+static int os_rename (lua_State *L) {
+ const char *fromname = luaL_checkstring(L, 1);
+ const char *toname = luaL_checkstring(L, 2);
+ return luaL_fileresult(L, rename(fromname, toname) == 0, NULL);
+}
+
+
+static int os_tmpname (lua_State *L) {
+ char buff[LUA_TMPNAMBUFSIZE];
+ int err;
+ lua_tmpnam(buff, err);
+ if (err)
+ return luaL_error(L, "unable to generate a unique filename");
+ lua_pushstring(L, buff);
+ return 1;
+}
+
+
+static int os_getenv (lua_State *L) {
+ lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */
+ return 1;
+}
+
+
+static int os_clock (lua_State *L) {
+ lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC);
+ return 1;
+}
+
+
+/*
+** {======================================================
+** Time/Date operations
+** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S,
+** wday=%w+1, yday=%j, isdst=? }
+** =======================================================
+*/
+
+static void setfield (lua_State *L, const char *key, int value) {
+ lua_pushinteger(L, value);
+ lua_setfield(L, -2, key);
+}
+
+static void setboolfield (lua_State *L, const char *key, int value) {
+ if (value < 0) /* undefined? */
+ return; /* does not set field */
+ lua_pushboolean(L, value);
+ lua_setfield(L, -2, key);
+}
+
+
+/*
+** Set all fields from structure 'tm' in the table on top of the stack
+*/
+static void setallfields (lua_State *L, struct tm *stm) {
+ setfield(L, "sec", stm->tm_sec);
+ setfield(L, "min", stm->tm_min);
+ setfield(L, "hour", stm->tm_hour);
+ setfield(L, "day", stm->tm_mday);
+ setfield(L, "month", stm->tm_mon + 1);
+ setfield(L, "year", stm->tm_year + 1900);
+ setfield(L, "wday", stm->tm_wday + 1);
+ setfield(L, "yday", stm->tm_yday + 1);
+ setboolfield(L, "isdst", stm->tm_isdst);
+}
+
+
+static int getboolfield (lua_State *L, const char *key) {
+ int res;
+ res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1);
+ lua_pop(L, 1);
+ return res;
+}
+
+
+/* maximum value for date fields (to avoid arithmetic overflows with 'int') */
+#if !defined(L_MAXDATEFIELD)
+#define L_MAXDATEFIELD (INT_MAX / 2)
+#endif
+
+static int getfield (lua_State *L, const char *key, int d, int delta) {
+ int isnum;
+ int t = lua_getfield(L, -1, key); /* get field and its type */
+ lua_Integer res = lua_tointegerx(L, -1, &isnum);
+ if (!isnum) { /* field is not an integer? */
+ if (t != LUA_TNIL) /* some other value? */
+ return luaL_error(L, "field '%s' is not an integer", key);
+ else if (d < 0) /* absent field; no default? */
+ return luaL_error(L, "field '%s' missing in date table", key);
+ res = d;
+ }
+ else {
+ if (!(-L_MAXDATEFIELD <= res && res <= L_MAXDATEFIELD))
+ return luaL_error(L, "field '%s' is out-of-bound", key);
+ res -= delta;
+ }
+ lua_pop(L, 1);
+ return (int)res;
+}
+
+
+static const char *checkoption (lua_State *L, const char *conv, char *buff) {
+ const char *option;
+ int oplen = 1;
+ for (option = LUA_STRFTIMEOPTIONS; *option != '\0'; option += oplen) {
+ if (*option == '|') /* next block? */
+ oplen++; /* next length */
+ else if (memcmp(conv, option, oplen) == 0) { /* match? */
+ memcpy(buff, conv, oplen); /* copy valid option to buffer */
+ buff[oplen] = '\0';
+ return conv + oplen; /* return next item */
+ }
+ }
+ luaL_argerror(L, 1,
+ lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv));
+ return conv; /* to avoid warnings */
+}
+
+
+/* maximum size for an individual 'strftime' item */
+#define SIZETIMEFMT 250
+
+
+static int os_date (lua_State *L) {
+ const char *s = luaL_optstring(L, 1, "%c");
+ time_t t = luaL_opt(L, l_checktime, 2, time(NULL));
+ struct tm tmr, *stm;
+ if (*s == '!') { /* UTC? */
+ stm = l_gmtime(&t, &tmr);
+ s++; /* skip '!' */
+ }
+ else
+ stm = l_localtime(&t, &tmr);
+ if (stm == NULL) /* invalid date? */
+ luaL_error(L, "time result cannot be represented in this installation");
+ if (strcmp(s, "*t") == 0) {
+ lua_createtable(L, 0, 9); /* 9 = number of fields */
+ setallfields(L, stm);
+ }
+ else {
+ char cc[4]; /* buffer for individual conversion specifiers */
+ luaL_Buffer b;
+ cc[0] = '%';
+ luaL_buffinit(L, &b);
+ while (*s) {
+ if (*s != '%') /* not a conversion specifier? */
+ luaL_addchar(&b, *s++);
+ else {
+ size_t reslen;
+ char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT);
+ s = checkoption(L, s + 1, cc + 1); /* copy specifier to 'cc' */
+ reslen = strftime(buff, SIZETIMEFMT, cc, stm);
+ luaL_addsize(&b, reslen);
+ }
+ }
+ luaL_pushresult(&b);
+ }
+ return 1;
+}
+
+
+static int os_time (lua_State *L) {
+ time_t t;
+ if (lua_isnoneornil(L, 1)) /* called without args? */
+ t = time(NULL); /* get current time */
+ else {
+ struct tm ts;
+ luaL_checktype(L, 1, LUA_TTABLE);
+ lua_settop(L, 1); /* make sure table is at the top */
+ ts.tm_sec = getfield(L, "sec", 0, 0);
+ ts.tm_min = getfield(L, "min", 0, 0);
+ ts.tm_hour = getfield(L, "hour", 12, 0);
+ ts.tm_mday = getfield(L, "day", -1, 0);
+ ts.tm_mon = getfield(L, "month", -1, 1);
+ ts.tm_year = getfield(L, "year", -1, 1900);
+ ts.tm_isdst = getboolfield(L, "isdst");
+ t = mktime(&ts);
+ setallfields(L, &ts); /* update fields with normalized values */
+ }
+ if (t != (time_t)(l_timet)t || t == (time_t)(-1))
+ luaL_error(L, "time result cannot be represented in this installation");
+ l_pushtime(L, t);
+ return 1;
+}
+
+
+static int os_difftime (lua_State *L) {
+ time_t t1 = l_checktime(L, 1);
+ time_t t2 = l_checktime(L, 2);
+ lua_pushnumber(L, (lua_Number)difftime(t1, t2));
+ return 1;
+}
+
+/* }====================================================== */
+
+
+static int os_setlocale (lua_State *L) {
+ static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY,
+ LC_NUMERIC, LC_TIME};
+ static const char *const catnames[] = {"all", "collate", "ctype", "monetary",
+ "numeric", "time", NULL};
+ const char *l = luaL_optstring(L, 1, NULL);
+ int op = luaL_checkoption(L, 2, "all", catnames);
+ lua_pushstring(L, setlocale(cat[op], l));
+ return 1;
+}
+
+
+static int os_exit (lua_State *L) {
+ int status;
+ if (lua_isboolean(L, 1))
+ status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE);
+ else
+ status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS);
+ if (lua_toboolean(L, 2))
+ lua_close(L);
+ if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */
+ return 0;
+}
+
+
+static const luaL_Reg syslib[] = {
+ {"clock", os_clock},
+ {"date", os_date},
+ {"difftime", os_difftime},
+ {"execute", os_execute},
+ {"exit", os_exit},
+ {"getenv", os_getenv},
+ {"remove", os_remove},
+ {"rename", os_rename},
+ {"setlocale", os_setlocale},
+ {"time", os_time},
+ {"tmpname", os_tmpname},
+ {NULL, NULL}
+};
+
+/* }====================================================== */
+
+
+
+LUAMOD_API int luaopen_os (lua_State *L) {
+ luaL_newlib(L, syslib);
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lparser.c b/libs/lua/lua-5.3.3/lparser.c
new file mode 100644
index 0000000..22530a5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lparser.c
@@ -0,0 +1,1652 @@
+/*
+** $Id: lparser.c,v 2.153 2016/05/13 19:10:16 roberto Exp $
+** Lua Parser
+** See Copyright Notice in lua.h
+*/
+
+#define lparser_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "lcode.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "llex.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+
+
+
+/* maximum number of local variables per function (must be smaller
+ than 250, due to the bytecode format) */
+#define MAXVARS 200
+
+
+#define hasmultret(k) ((k) == VCALL || (k) == VVARARG)
+
+
+/* because all strings are unified by the scanner, the parser
+ can use pointer equality for string equality */
+#define eqstr(a,b) ((a) == (b))
+
+
+/*
+** nodes for block list (list of active blocks)
+*/
+typedef struct BlockCnt {
+ struct BlockCnt *previous; /* chain */
+ int firstlabel; /* index of first label in this block */
+ int firstgoto; /* index of first pending goto in this block */
+ lu_byte nactvar; /* # active locals outside the block */
+ lu_byte upval; /* true if some variable in the block is an upvalue */
+ lu_byte isloop; /* true if 'block' is a loop */
+} BlockCnt;
+
+
+
+/*
+** prototypes for recursive non-terminal functions
+*/
+static void statement (LexState *ls);
+static void expr (LexState *ls, expdesc *v);
+
+
+/* semantic error */
+static l_noret semerror (LexState *ls, const char *msg) {
+ ls->t.token = 0; /* remove "near <token>" from final message */
+ luaX_syntaxerror(ls, msg);
+}
+
+
+static l_noret error_expected (LexState *ls, int token) {
+ luaX_syntaxerror(ls,
+ luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token)));
+}
+
+
+static l_noret errorlimit (FuncState *fs, int limit, const char *what) {
+ lua_State *L = fs->ls->L;
+ const char *msg;
+ int line = fs->f->linedefined;
+ const char *where = (line == 0)
+ ? "main function"
+ : luaO_pushfstring(L, "function at line %d", line);
+ msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s",
+ what, limit, where);
+ luaX_syntaxerror(fs->ls, msg);
+}
+
+
+static void checklimit (FuncState *fs, int v, int l, const char *what) {
+ if (v > l) errorlimit(fs, l, what);
+}
+
+
+static int testnext (LexState *ls, int c) {
+ if (ls->t.token == c) {
+ luaX_next(ls);
+ return 1;
+ }
+ else return 0;
+}
+
+
+static void check (LexState *ls, int c) {
+ if (ls->t.token != c)
+ error_expected(ls, c);
+}
+
+
+static void checknext (LexState *ls, int c) {
+ check(ls, c);
+ luaX_next(ls);
+}
+
+
+#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); }
+
+
+
+static void check_match (LexState *ls, int what, int who, int where) {
+ if (!testnext(ls, what)) {
+ if (where == ls->linenumber)
+ error_expected(ls, what);
+ else {
+ luaX_syntaxerror(ls, luaO_pushfstring(ls->L,
+ "%s expected (to close %s at line %d)",
+ luaX_token2str(ls, what), luaX_token2str(ls, who), where));
+ }
+ }
+}
+
+
+static TString *str_checkname (LexState *ls) {
+ TString *ts;
+ check(ls, TK_NAME);
+ ts = ls->t.seminfo.ts;
+ luaX_next(ls);
+ return ts;
+}
+
+
+static void init_exp (expdesc *e, expkind k, int i) {
+ e->f = e->t = NO_JUMP;
+ e->k = k;
+ e->u.info = i;
+}
+
+
+static void codestring (LexState *ls, expdesc *e, TString *s) {
+ init_exp(e, VK, luaK_stringK(ls->fs, s));
+}
+
+
+static void checkname (LexState *ls, expdesc *e) {
+ codestring(ls, e, str_checkname(ls));
+}
+
+
+static int registerlocalvar (LexState *ls, TString *varname) {
+ FuncState *fs = ls->fs;
+ Proto *f = fs->f;
+ int oldsize = f->sizelocvars;
+ luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,
+ LocVar, SHRT_MAX, "local variables");
+ while (oldsize < f->sizelocvars)
+ f->locvars[oldsize++].varname = NULL;
+ f->locvars[fs->nlocvars].varname = varname;
+ luaC_objbarrier(ls->L, f, varname);
+ return fs->nlocvars++;
+}
+
+
+static void new_localvar (LexState *ls, TString *name) {
+ FuncState *fs = ls->fs;
+ Dyndata *dyd = ls->dyd;
+ int reg = registerlocalvar(ls, name);
+ checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal,
+ MAXVARS, "local variables");
+ luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1,
+ dyd->actvar.size, Vardesc, MAX_INT, "local variables");
+ dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg);
+}
+
+
+static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) {
+ new_localvar(ls, luaX_newstring(ls, name, sz));
+}
+
+#define new_localvarliteral(ls,v) \
+ new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
+
+
+static LocVar *getlocvar (FuncState *fs, int i) {
+ int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx;
+ lua_assert(idx < fs->nlocvars);
+ return &fs->f->locvars[idx];
+}
+
+
+static void adjustlocalvars (LexState *ls, int nvars) {
+ FuncState *fs = ls->fs;
+ fs->nactvar = cast_byte(fs->nactvar + nvars);
+ for (; nvars; nvars--) {
+ getlocvar(fs, fs->nactvar - nvars)->startpc = fs->pc;
+ }
+}
+
+
+static void removevars (FuncState *fs, int tolevel) {
+ fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel);
+ while (fs->nactvar > tolevel)
+ getlocvar(fs, --fs->nactvar)->endpc = fs->pc;
+}
+
+
+static int searchupvalue (FuncState *fs, TString *name) {
+ int i;
+ Upvaldesc *up = fs->f->upvalues;
+ for (i = 0; i < fs->nups; i++) {
+ if (eqstr(up[i].name, name)) return i;
+ }
+ return -1; /* not found */
+}
+
+
+static int newupvalue (FuncState *fs, TString *name, expdesc *v) {
+ Proto *f = fs->f;
+ int oldsize = f->sizeupvalues;
+ checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues");
+ luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,
+ Upvaldesc, MAXUPVAL, "upvalues");
+ while (oldsize < f->sizeupvalues)
+ f->upvalues[oldsize++].name = NULL;
+ f->upvalues[fs->nups].instack = (v->k == VLOCAL);
+ f->upvalues[fs->nups].idx = cast_byte(v->u.info);
+ f->upvalues[fs->nups].name = name;
+ luaC_objbarrier(fs->ls->L, f, name);
+ return fs->nups++;
+}
+
+
+static int searchvar (FuncState *fs, TString *n) {
+ int i;
+ for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) {
+ if (eqstr(n, getlocvar(fs, i)->varname))
+ return i;
+ }
+ return -1; /* not found */
+}
+
+
+/*
+ Mark block where variable at given level was defined
+ (to emit close instructions later).
+*/
+static void markupval (FuncState *fs, int level) {
+ BlockCnt *bl = fs->bl;
+ while (bl->nactvar > level)
+ bl = bl->previous;
+ bl->upval = 1;
+}
+
+
+/*
+ Find variable with given name 'n'. If it is an upvalue, add this
+ upvalue into all intermediate functions.
+*/
+static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
+ if (fs == NULL) /* no more levels? */
+ init_exp(var, VVOID, 0); /* default is global */
+ else {
+ int v = searchvar(fs, n); /* look up locals at current level */
+ if (v >= 0) { /* found? */
+ init_exp(var, VLOCAL, v); /* variable is local */
+ if (!base)
+ markupval(fs, v); /* local will be used as an upval */
+ }
+ else { /* not found as local at current level; try upvalues */
+ int idx = searchupvalue(fs, n); /* try existing upvalues */
+ if (idx < 0) { /* not found? */
+ singlevaraux(fs->prev, n, var, 0); /* try upper levels */
+ if (var->k == VVOID) /* not found? */
+ return; /* it is a global */
+ /* else was LOCAL or UPVAL */
+ idx = newupvalue(fs, n, var); /* will be a new upvalue */
+ }
+ init_exp(var, VUPVAL, idx); /* new or old upvalue */
+ }
+ }
+}
+
+
+static void singlevar (LexState *ls, expdesc *var) {
+ TString *varname = str_checkname(ls);
+ FuncState *fs = ls->fs;
+ singlevaraux(fs, varname, var, 1);
+ if (var->k == VVOID) { /* global name? */
+ expdesc key;
+ singlevaraux(fs, ls->envn, var, 1); /* get environment variable */
+ lua_assert(var->k != VVOID); /* this one must exist */
+ codestring(ls, &key, varname); /* key is variable name */
+ luaK_indexed(fs, var, &key); /* env[varname] */
+ }
+}
+
+
+static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
+ FuncState *fs = ls->fs;
+ int extra = nvars - nexps;
+ if (hasmultret(e->k)) {
+ extra++; /* includes call itself */
+ if (extra < 0) extra = 0;
+ luaK_setreturns(fs, e, extra); /* last exp. provides the difference */
+ if (extra > 1) luaK_reserveregs(fs, extra-1);
+ }
+ else {
+ if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */
+ if (extra > 0) {
+ int reg = fs->freereg;
+ luaK_reserveregs(fs, extra);
+ luaK_nil(fs, reg, extra);
+ }
+ }
+}
+
+
+static void enterlevel (LexState *ls) {
+ lua_State *L = ls->L;
+ ++L->nCcalls;
+ checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels");
+}
+
+
+#define leavelevel(ls) ((ls)->L->nCcalls--)
+
+
+static void closegoto (LexState *ls, int g, Labeldesc *label) {
+ int i;
+ FuncState *fs = ls->fs;
+ Labellist *gl = &ls->dyd->gt;
+ Labeldesc *gt = &gl->arr[g];
+ lua_assert(eqstr(gt->name, label->name));
+ if (gt->nactvar < label->nactvar) {
+ TString *vname = getlocvar(fs, gt->nactvar)->varname;
+ const char *msg = luaO_pushfstring(ls->L,
+ "<goto %s> at line %d jumps into the scope of local '%s'",
+ getstr(gt->name), gt->line, getstr(vname));
+ semerror(ls, msg);
+ }
+ luaK_patchlist(fs, gt->pc, label->pc);
+ /* remove goto from pending list */
+ for (i = g; i < gl->n - 1; i++)
+ gl->arr[i] = gl->arr[i + 1];
+ gl->n--;
+}
+
+
+/*
+** try to close a goto with existing labels; this solves backward jumps
+*/
+static int findlabel (LexState *ls, int g) {
+ int i;
+ BlockCnt *bl = ls->fs->bl;
+ Dyndata *dyd = ls->dyd;
+ Labeldesc *gt = &dyd->gt.arr[g];
+ /* check labels in current block for a match */
+ for (i = bl->firstlabel; i < dyd->label.n; i++) {
+ Labeldesc *lb = &dyd->label.arr[i];
+ if (eqstr(lb->name, gt->name)) { /* correct label? */
+ if (gt->nactvar > lb->nactvar &&
+ (bl->upval || dyd->label.n > bl->firstlabel))
+ luaK_patchclose(ls->fs, gt->pc, lb->nactvar);
+ closegoto(ls, g, lb); /* close it */
+ return 1;
+ }
+ }
+ return 0; /* label not found; cannot close goto */
+}
+
+
+static int newlabelentry (LexState *ls, Labellist *l, TString *name,
+ int line, int pc) {
+ int n = l->n;
+ luaM_growvector(ls->L, l->arr, n, l->size,
+ Labeldesc, SHRT_MAX, "labels/gotos");
+ l->arr[n].name = name;
+ l->arr[n].line = line;
+ l->arr[n].nactvar = ls->fs->nactvar;
+ l->arr[n].pc = pc;
+ l->n = n + 1;
+ return n;
+}
+
+
+/*
+** check whether new label 'lb' matches any pending gotos in current
+** block; solves forward jumps
+*/
+static void findgotos (LexState *ls, Labeldesc *lb) {
+ Labellist *gl = &ls->dyd->gt;
+ int i = ls->fs->bl->firstgoto;
+ while (i < gl->n) {
+ if (eqstr(gl->arr[i].name, lb->name))
+ closegoto(ls, i, lb);
+ else
+ i++;
+ }
+}
+
+
+/*
+** export pending gotos to outer level, to check them against
+** outer labels; if the block being exited has upvalues, and
+** the goto exits the scope of any variable (which can be the
+** upvalue), close those variables being exited.
+*/
+static void movegotosout (FuncState *fs, BlockCnt *bl) {
+ int i = bl->firstgoto;
+ Labellist *gl = &fs->ls->dyd->gt;
+ /* correct pending gotos to current block and try to close it
+ with visible labels */
+ while (i < gl->n) {
+ Labeldesc *gt = &gl->arr[i];
+ if (gt->nactvar > bl->nactvar) {
+ if (bl->upval)
+ luaK_patchclose(fs, gt->pc, bl->nactvar);
+ gt->nactvar = bl->nactvar;
+ }
+ if (!findlabel(fs->ls, i))
+ i++; /* move to next one */
+ }
+}
+
+
+static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {
+ bl->isloop = isloop;
+ bl->nactvar = fs->nactvar;
+ bl->firstlabel = fs->ls->dyd->label.n;
+ bl->firstgoto = fs->ls->dyd->gt.n;
+ bl->upval = 0;
+ bl->previous = fs->bl;
+ fs->bl = bl;
+ lua_assert(fs->freereg == fs->nactvar);
+}
+
+
+/*
+** create a label named 'break' to resolve break statements
+*/
+static void breaklabel (LexState *ls) {
+ TString *n = luaS_new(ls->L, "break");
+ int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc);
+ findgotos(ls, &ls->dyd->label.arr[l]);
+}
+
+/*
+** generates an error for an undefined 'goto'; choose appropriate
+** message when label name is a reserved word (which can only be 'break')
+*/
+static l_noret undefgoto (LexState *ls, Labeldesc *gt) {
+ const char *msg = isreserved(gt->name)
+ ? "<%s> at line %d not inside a loop"
+ : "no visible label '%s' for <goto> at line %d";
+ msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line);
+ semerror(ls, msg);
+}
+
+
+static void leaveblock (FuncState *fs) {
+ BlockCnt *bl = fs->bl;
+ LexState *ls = fs->ls;
+ if (bl->previous && bl->upval) {
+ /* create a 'jump to here' to close upvalues */
+ int j = luaK_jump(fs);
+ luaK_patchclose(fs, j, bl->nactvar);
+ luaK_patchtohere(fs, j);
+ }
+ if (bl->isloop)
+ breaklabel(ls); /* close pending breaks */
+ fs->bl = bl->previous;
+ removevars(fs, bl->nactvar);
+ lua_assert(bl->nactvar == fs->nactvar);
+ fs->freereg = fs->nactvar; /* free registers */
+ ls->dyd->label.n = bl->firstlabel; /* remove local labels */
+ if (bl->previous) /* inner block? */
+ movegotosout(fs, bl); /* update pending gotos to outer block */
+ else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */
+ undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */
+}
+
+
+/*
+** adds a new prototype into list of prototypes
+*/
+static Proto *addprototype (LexState *ls) {
+ Proto *clp;
+ lua_State *L = ls->L;
+ FuncState *fs = ls->fs;
+ Proto *f = fs->f; /* prototype of current function */
+ if (fs->np >= f->sizep) {
+ int oldsize = f->sizep;
+ luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions");
+ while (oldsize < f->sizep)
+ f->p[oldsize++] = NULL;
+ }
+ f->p[fs->np++] = clp = luaF_newproto(L);
+ luaC_objbarrier(L, f, clp);
+ return clp;
+}
+
+
+/*
+** codes instruction to create new closure in parent function.
+** The OP_CLOSURE instruction must use the last available register,
+** so that, if it invokes the GC, the GC knows which registers
+** are in use at that time.
+*/
+static void codeclosure (LexState *ls, expdesc *v) {
+ FuncState *fs = ls->fs->prev;
+ init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1));
+ luaK_exp2nextreg(fs, v); /* fix it at the last register */
+}
+
+
+static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) {
+ Proto *f;
+ fs->prev = ls->fs; /* linked list of funcstates */
+ fs->ls = ls;
+ ls->fs = fs;
+ fs->pc = 0;
+ fs->lasttarget = 0;
+ fs->jpc = NO_JUMP;
+ fs->freereg = 0;
+ fs->nk = 0;
+ fs->np = 0;
+ fs->nups = 0;
+ fs->nlocvars = 0;
+ fs->nactvar = 0;
+ fs->firstlocal = ls->dyd->actvar.n;
+ fs->bl = NULL;
+ f = fs->f;
+ f->source = ls->source;
+ f->maxstacksize = 2; /* registers 0/1 are always valid */
+ enterblock(fs, bl, 0);
+}
+
+
+static void close_func (LexState *ls) {
+ lua_State *L = ls->L;
+ FuncState *fs = ls->fs;
+ Proto *f = fs->f;
+ luaK_ret(fs, 0, 0); /* final return */
+ leaveblock(fs);
+ luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);
+ f->sizecode = fs->pc;
+ luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);
+ f->sizelineinfo = fs->pc;
+ luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue);
+ f->sizek = fs->nk;
+ luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);
+ f->sizep = fs->np;
+ luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
+ f->sizelocvars = fs->nlocvars;
+ luaM_reallocvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc);
+ f->sizeupvalues = fs->nups;
+ lua_assert(fs->bl == NULL);
+ ls->fs = fs->prev;
+ luaC_checkGC(L);
+}
+
+
+
+/*============================================================*/
+/* GRAMMAR RULES */
+/*============================================================*/
+
+
+/*
+** check whether current token is in the follow set of a block.
+** 'until' closes syntactical blocks, but do not close scope,
+** so it is handled in separate.
+*/
+static int block_follow (LexState *ls, int withuntil) {
+ switch (ls->t.token) {
+ case TK_ELSE: case TK_ELSEIF:
+ case TK_END: case TK_EOS:
+ return 1;
+ case TK_UNTIL: return withuntil;
+ default: return 0;
+ }
+}
+
+
+static void statlist (LexState *ls) {
+ /* statlist -> { stat [';'] } */
+ while (!block_follow(ls, 1)) {
+ if (ls->t.token == TK_RETURN) {
+ statement(ls);
+ return; /* 'return' must be last statement */
+ }
+ statement(ls);
+ }
+}
+
+
+static void fieldsel (LexState *ls, expdesc *v) {
+ /* fieldsel -> ['.' | ':'] NAME */
+ FuncState *fs = ls->fs;
+ expdesc key;
+ luaK_exp2anyregup(fs, v);
+ luaX_next(ls); /* skip the dot or colon */
+ checkname(ls, &key);
+ luaK_indexed(fs, v, &key);
+}
+
+
+static void yindex (LexState *ls, expdesc *v) {
+ /* index -> '[' expr ']' */
+ luaX_next(ls); /* skip the '[' */
+ expr(ls, v);
+ luaK_exp2val(ls->fs, v);
+ checknext(ls, ']');
+}
+
+
+/*
+** {======================================================================
+** Rules for Constructors
+** =======================================================================
+*/
+
+
+struct ConsControl {
+ expdesc v; /* last list item read */
+ expdesc *t; /* table descriptor */
+ int nh; /* total number of 'record' elements */
+ int na; /* total number of array elements */
+ int tostore; /* number of array elements pending to be stored */
+};
+
+
+static void recfield (LexState *ls, struct ConsControl *cc) {
+ /* recfield -> (NAME | '['exp1']') = exp1 */
+ FuncState *fs = ls->fs;
+ int reg = ls->fs->freereg;
+ expdesc key, val;
+ int rkkey;
+ if (ls->t.token == TK_NAME) {
+ checklimit(fs, cc->nh, MAX_INT, "items in a constructor");
+ checkname(ls, &key);
+ }
+ else /* ls->t.token == '[' */
+ yindex(ls, &key);
+ cc->nh++;
+ checknext(ls, '=');
+ rkkey = luaK_exp2RK(fs, &key);
+ expr(ls, &val);
+ luaK_codeABC(fs, OP_SETTABLE, cc->t->u.info, rkkey, luaK_exp2RK(fs, &val));
+ fs->freereg = reg; /* free registers */
+}
+
+
+static void closelistfield (FuncState *fs, struct ConsControl *cc) {
+ if (cc->v.k == VVOID) return; /* there is no list item */
+ luaK_exp2nextreg(fs, &cc->v);
+ cc->v.k = VVOID;
+ if (cc->tostore == LFIELDS_PER_FLUSH) {
+ luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */
+ cc->tostore = 0; /* no more items pending */
+ }
+}
+
+
+static void lastlistfield (FuncState *fs, struct ConsControl *cc) {
+ if (cc->tostore == 0) return;
+ if (hasmultret(cc->v.k)) {
+ luaK_setmultret(fs, &cc->v);
+ luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET);
+ cc->na--; /* do not count last expression (unknown number of elements) */
+ }
+ else {
+ if (cc->v.k != VVOID)
+ luaK_exp2nextreg(fs, &cc->v);
+ luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);
+ }
+}
+
+
+static void listfield (LexState *ls, struct ConsControl *cc) {
+ /* listfield -> exp */
+ expr(ls, &cc->v);
+ checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor");
+ cc->na++;
+ cc->tostore++;
+}
+
+
+static void field (LexState *ls, struct ConsControl *cc) {
+ /* field -> listfield | recfield */
+ switch(ls->t.token) {
+ case TK_NAME: { /* may be 'listfield' or 'recfield' */
+ if (luaX_lookahead(ls) != '=') /* expression? */
+ listfield(ls, cc);
+ else
+ recfield(ls, cc);
+ break;
+ }
+ case '[': {
+ recfield(ls, cc);
+ break;
+ }
+ default: {
+ listfield(ls, cc);
+ break;
+ }
+ }
+}
+
+
+static void constructor (LexState *ls, expdesc *t) {
+ /* constructor -> '{' [ field { sep field } [sep] ] '}'
+ sep -> ',' | ';' */
+ FuncState *fs = ls->fs;
+ int line = ls->linenumber;
+ int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);
+ struct ConsControl cc;
+ cc.na = cc.nh = cc.tostore = 0;
+ cc.t = t;
+ init_exp(t, VRELOCABLE, pc);
+ init_exp(&cc.v, VVOID, 0); /* no value (yet) */
+ luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */
+ checknext(ls, '{');
+ do {
+ lua_assert(cc.v.k == VVOID || cc.tostore > 0);
+ if (ls->t.token == '}') break;
+ closelistfield(fs, &cc);
+ field(ls, &cc);
+ } while (testnext(ls, ',') || testnext(ls, ';'));
+ check_match(ls, '}', '{', line);
+ lastlistfield(fs, &cc);
+ SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */
+ SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */
+}
+
+/* }====================================================================== */
+
+
+
+static void parlist (LexState *ls) {
+ /* parlist -> [ param { ',' param } ] */
+ FuncState *fs = ls->fs;
+ Proto *f = fs->f;
+ int nparams = 0;
+ f->is_vararg = 0;
+ if (ls->t.token != ')') { /* is 'parlist' not empty? */
+ do {
+ switch (ls->t.token) {
+ case TK_NAME: { /* param -> NAME */
+ new_localvar(ls, str_checkname(ls));
+ nparams++;
+ break;
+ }
+ case TK_DOTS: { /* param -> '...' */
+ luaX_next(ls);
+ f->is_vararg = 2; /* declared vararg */
+ break;
+ }
+ default: luaX_syntaxerror(ls, "<name> or '...' expected");
+ }
+ } while (!f->is_vararg && testnext(ls, ','));
+ }
+ adjustlocalvars(ls, nparams);
+ f->numparams = cast_byte(fs->nactvar);
+ luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */
+}
+
+
+static void body (LexState *ls, expdesc *e, int ismethod, int line) {
+ /* body -> '(' parlist ')' block END */
+ FuncState new_fs;
+ BlockCnt bl;
+ new_fs.f = addprototype(ls);
+ new_fs.f->linedefined = line;
+ open_func(ls, &new_fs, &bl);
+ checknext(ls, '(');
+ if (ismethod) {
+ new_localvarliteral(ls, "self"); /* create 'self' parameter */
+ adjustlocalvars(ls, 1);
+ }
+ parlist(ls);
+ checknext(ls, ')');
+ statlist(ls);
+ new_fs.f->lastlinedefined = ls->linenumber;
+ check_match(ls, TK_END, TK_FUNCTION, line);
+ codeclosure(ls, e);
+ close_func(ls);
+}
+
+
+static int explist (LexState *ls, expdesc *v) {
+ /* explist -> expr { ',' expr } */
+ int n = 1; /* at least one expression */
+ expr(ls, v);
+ while (testnext(ls, ',')) {
+ luaK_exp2nextreg(ls->fs, v);
+ expr(ls, v);
+ n++;
+ }
+ return n;
+}
+
+
+static void funcargs (LexState *ls, expdesc *f, int line) {
+ FuncState *fs = ls->fs;
+ expdesc args;
+ int base, nparams;
+ switch (ls->t.token) {
+ case '(': { /* funcargs -> '(' [ explist ] ')' */
+ luaX_next(ls);
+ if (ls->t.token == ')') /* arg list is empty? */
+ args.k = VVOID;
+ else {
+ explist(ls, &args);
+ luaK_setmultret(fs, &args);
+ }
+ check_match(ls, ')', '(', line);
+ break;
+ }
+ case '{': { /* funcargs -> constructor */
+ constructor(ls, &args);
+ break;
+ }
+ case TK_STRING: { /* funcargs -> STRING */
+ codestring(ls, &args, ls->t.seminfo.ts);
+ luaX_next(ls); /* must use 'seminfo' before 'next' */
+ break;
+ }
+ default: {
+ luaX_syntaxerror(ls, "function arguments expected");
+ }
+ }
+ lua_assert(f->k == VNONRELOC);
+ base = f->u.info; /* base register for call */
+ if (hasmultret(args.k))
+ nparams = LUA_MULTRET; /* open call */
+ else {
+ if (args.k != VVOID)
+ luaK_exp2nextreg(fs, &args); /* close last argument */
+ nparams = fs->freereg - (base+1);
+ }
+ init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
+ luaK_fixline(fs, line);
+ fs->freereg = base+1; /* call remove function and arguments and leaves
+ (unless changed) one result */
+}
+
+
+
+
+/*
+** {======================================================================
+** Expression parsing
+** =======================================================================
+*/
+
+
+static void primaryexp (LexState *ls, expdesc *v) {
+ /* primaryexp -> NAME | '(' expr ')' */
+ switch (ls->t.token) {
+ case '(': {
+ int line = ls->linenumber;
+ luaX_next(ls);
+ expr(ls, v);
+ check_match(ls, ')', '(', line);
+ luaK_dischargevars(ls->fs, v);
+ return;
+ }
+ case TK_NAME: {
+ singlevar(ls, v);
+ return;
+ }
+ default: {
+ luaX_syntaxerror(ls, "unexpected symbol");
+ }
+ }
+}
+
+
+static void suffixedexp (LexState *ls, expdesc *v) {
+ /* suffixedexp ->
+ primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */
+ FuncState *fs = ls->fs;
+ int line = ls->linenumber;
+ primaryexp(ls, v);
+ for (;;) {
+ switch (ls->t.token) {
+ case '.': { /* fieldsel */
+ fieldsel(ls, v);
+ break;
+ }
+ case '[': { /* '[' exp1 ']' */
+ expdesc key;
+ luaK_exp2anyregup(fs, v);
+ yindex(ls, &key);
+ luaK_indexed(fs, v, &key);
+ break;
+ }
+ case ':': { /* ':' NAME funcargs */
+ expdesc key;
+ luaX_next(ls);
+ checkname(ls, &key);
+ luaK_self(fs, v, &key);
+ funcargs(ls, v, line);
+ break;
+ }
+ case '(': case TK_STRING: case '{': { /* funcargs */
+ luaK_exp2nextreg(fs, v);
+ funcargs(ls, v, line);
+ break;
+ }
+ default: return;
+ }
+ }
+}
+
+
+static void simpleexp (LexState *ls, expdesc *v) {
+ /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... |
+ constructor | FUNCTION body | suffixedexp */
+ switch (ls->t.token) {
+ case TK_FLT: {
+ init_exp(v, VKFLT, 0);
+ v->u.nval = ls->t.seminfo.r;
+ break;
+ }
+ case TK_INT: {
+ init_exp(v, VKINT, 0);
+ v->u.ival = ls->t.seminfo.i;
+ break;
+ }
+ case TK_STRING: {
+ codestring(ls, v, ls->t.seminfo.ts);
+ break;
+ }
+ case TK_NIL: {
+ init_exp(v, VNIL, 0);
+ break;
+ }
+ case TK_TRUE: {
+ init_exp(v, VTRUE, 0);
+ break;
+ }
+ case TK_FALSE: {
+ init_exp(v, VFALSE, 0);
+ break;
+ }
+ case TK_DOTS: { /* vararg */
+ FuncState *fs = ls->fs;
+ check_condition(ls, fs->f->is_vararg,
+ "cannot use '...' outside a vararg function");
+ fs->f->is_vararg = 1; /* function actually uses vararg */
+ init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));
+ break;
+ }
+ case '{': { /* constructor */
+ constructor(ls, v);
+ return;
+ }
+ case TK_FUNCTION: {
+ luaX_next(ls);
+ body(ls, v, 0, ls->linenumber);
+ return;
+ }
+ default: {
+ suffixedexp(ls, v);
+ return;
+ }
+ }
+ luaX_next(ls);
+}
+
+
+static UnOpr getunopr (int op) {
+ switch (op) {
+ case TK_NOT: return OPR_NOT;
+ case '-': return OPR_MINUS;
+ case '~': return OPR_BNOT;
+ case '#': return OPR_LEN;
+ default: return OPR_NOUNOPR;
+ }
+}
+
+
+static BinOpr getbinopr (int op) {
+ switch (op) {
+ case '+': return OPR_ADD;
+ case '-': return OPR_SUB;
+ case '*': return OPR_MUL;
+ case '%': return OPR_MOD;
+ case '^': return OPR_POW;
+ case '/': return OPR_DIV;
+ case TK_IDIV: return OPR_IDIV;
+ case '&': return OPR_BAND;
+ case '|': return OPR_BOR;
+ case '~': return OPR_BXOR;
+ case TK_SHL: return OPR_SHL;
+ case TK_SHR: return OPR_SHR;
+ case TK_CONCAT: return OPR_CONCAT;
+ case TK_NE: return OPR_NE;
+ case TK_EQ: return OPR_EQ;
+ case '<': return OPR_LT;
+ case TK_LE: return OPR_LE;
+ case '>': return OPR_GT;
+ case TK_GE: return OPR_GE;
+ case TK_AND: return OPR_AND;
+ case TK_OR: return OPR_OR;
+ default: return OPR_NOBINOPR;
+ }
+}
+
+
+static const struct {
+ lu_byte left; /* left priority for each binary operator */
+ lu_byte right; /* right priority */
+} priority[] = { /* ORDER OPR */
+ {10, 10}, {10, 10}, /* '+' '-' */
+ {11, 11}, {11, 11}, /* '*' '%' */
+ {14, 13}, /* '^' (right associative) */
+ {11, 11}, {11, 11}, /* '/' '//' */
+ {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */
+ {7, 7}, {7, 7}, /* '<<' '>>' */
+ {9, 8}, /* '..' (right associative) */
+ {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
+ {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
+ {2, 2}, {1, 1} /* and, or */
+};
+
+#define UNARY_PRIORITY 12 /* priority for unary operators */
+
+
+/*
+** subexpr -> (simpleexp | unop subexpr) { binop subexpr }
+** where 'binop' is any binary operator with a priority higher than 'limit'
+*/
+static BinOpr subexpr (LexState *ls, expdesc *v, int limit) {
+ BinOpr op;
+ UnOpr uop;
+ enterlevel(ls);
+ uop = getunopr(ls->t.token);
+ if (uop != OPR_NOUNOPR) {
+ int line = ls->linenumber;
+ luaX_next(ls);
+ subexpr(ls, v, UNARY_PRIORITY);
+ luaK_prefix(ls->fs, uop, v, line);
+ }
+ else simpleexp(ls, v);
+ /* expand while operators have priorities higher than 'limit' */
+ op = getbinopr(ls->t.token);
+ while (op != OPR_NOBINOPR && priority[op].left > limit) {
+ expdesc v2;
+ BinOpr nextop;
+ int line = ls->linenumber;
+ luaX_next(ls);
+ luaK_infix(ls->fs, op, v);
+ /* read sub-expression with higher priority */
+ nextop = subexpr(ls, &v2, priority[op].right);
+ luaK_posfix(ls->fs, op, v, &v2, line);
+ op = nextop;
+ }
+ leavelevel(ls);
+ return op; /* return first untreated operator */
+}
+
+
+static void expr (LexState *ls, expdesc *v) {
+ subexpr(ls, v, 0);
+}
+
+/* }==================================================================== */
+
+
+
+/*
+** {======================================================================
+** Rules for Statements
+** =======================================================================
+*/
+
+
+static void block (LexState *ls) {
+ /* block -> statlist */
+ FuncState *fs = ls->fs;
+ BlockCnt bl;
+ enterblock(fs, &bl, 0);
+ statlist(ls);
+ leaveblock(fs);
+}
+
+
+/*
+** structure to chain all variables in the left-hand side of an
+** assignment
+*/
+struct LHS_assign {
+ struct LHS_assign *prev;
+ expdesc v; /* variable (global, local, upvalue, or indexed) */
+};
+
+
+/*
+** check whether, in an assignment to an upvalue/local variable, the
+** upvalue/local variable is begin used in a previous assignment to a
+** table. If so, save original upvalue/local value in a safe place and
+** use this safe copy in the previous assignment.
+*/
+static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {
+ FuncState *fs = ls->fs;
+ int extra = fs->freereg; /* eventual position to save local variable */
+ int conflict = 0;
+ for (; lh; lh = lh->prev) { /* check all previous assignments */
+ if (lh->v.k == VINDEXED) { /* assigning to a table? */
+ /* table is the upvalue/local being assigned now? */
+ if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) {
+ conflict = 1;
+ lh->v.u.ind.vt = VLOCAL;
+ lh->v.u.ind.t = extra; /* previous assignment will use safe copy */
+ }
+ /* index is the local being assigned? (index cannot be upvalue) */
+ if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) {
+ conflict = 1;
+ lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */
+ }
+ }
+ }
+ if (conflict) {
+ /* copy upvalue/local value to a temporary (in position 'extra') */
+ OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
+ luaK_codeABC(fs, op, extra, v->u.info, 0);
+ luaK_reserveregs(fs, 1);
+ }
+}
+
+
+static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
+ expdesc e;
+ check_condition(ls, vkisvar(lh->v.k), "syntax error");
+ if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */
+ struct LHS_assign nv;
+ nv.prev = lh;
+ suffixedexp(ls, &nv.v);
+ if (nv.v.k != VINDEXED)
+ check_conflict(ls, lh, &nv.v);
+ checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS,
+ "C levels");
+ assignment(ls, &nv, nvars+1);
+ }
+ else { /* assignment -> '=' explist */
+ int nexps;
+ checknext(ls, '=');
+ nexps = explist(ls, &e);
+ if (nexps != nvars) {
+ adjust_assign(ls, nvars, nexps, &e);
+ if (nexps > nvars)
+ ls->fs->freereg -= nexps - nvars; /* remove extra values */
+ }
+ else {
+ luaK_setoneret(ls->fs, &e); /* close last expression */
+ luaK_storevar(ls->fs, &lh->v, &e);
+ return; /* avoid default */
+ }
+ }
+ init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */
+ luaK_storevar(ls->fs, &lh->v, &e);
+}
+
+
+static int cond (LexState *ls) {
+ /* cond -> exp */
+ expdesc v;
+ expr(ls, &v); /* read condition */
+ if (v.k == VNIL) v.k = VFALSE; /* 'falses' are all equal here */
+ luaK_goiftrue(ls->fs, &v);
+ return v.f;
+}
+
+
+static void gotostat (LexState *ls, int pc) {
+ int line = ls->linenumber;
+ TString *label;
+ int g;
+ if (testnext(ls, TK_GOTO))
+ label = str_checkname(ls);
+ else {
+ luaX_next(ls); /* skip break */
+ label = luaS_new(ls->L, "break");
+ }
+ g = newlabelentry(ls, &ls->dyd->gt, label, line, pc);
+ findlabel(ls, g); /* close it if label already defined */
+}
+
+
+/* check for repeated labels on the same block */
+static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) {
+ int i;
+ for (i = fs->bl->firstlabel; i < ll->n; i++) {
+ if (eqstr(label, ll->arr[i].name)) {
+ const char *msg = luaO_pushfstring(fs->ls->L,
+ "label '%s' already defined on line %d",
+ getstr(label), ll->arr[i].line);
+ semerror(fs->ls, msg);
+ }
+ }
+}
+
+
+/* skip no-op statements */
+static void skipnoopstat (LexState *ls) {
+ while (ls->t.token == ';' || ls->t.token == TK_DBCOLON)
+ statement(ls);
+}
+
+
+static void labelstat (LexState *ls, TString *label, int line) {
+ /* label -> '::' NAME '::' */
+ FuncState *fs = ls->fs;
+ Labellist *ll = &ls->dyd->label;
+ int l; /* index of new label being created */
+ checkrepeated(fs, ll, label); /* check for repeated labels */
+ checknext(ls, TK_DBCOLON); /* skip double colon */
+ /* create new entry for this label */
+ l = newlabelentry(ls, ll, label, line, luaK_getlabel(fs));
+ skipnoopstat(ls); /* skip other no-op statements */
+ if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */
+ /* assume that locals are already out of scope */
+ ll->arr[l].nactvar = fs->bl->nactvar;
+ }
+ findgotos(ls, &ll->arr[l]);
+}
+
+
+static void whilestat (LexState *ls, int line) {
+ /* whilestat -> WHILE cond DO block END */
+ FuncState *fs = ls->fs;
+ int whileinit;
+ int condexit;
+ BlockCnt bl;
+ luaX_next(ls); /* skip WHILE */
+ whileinit = luaK_getlabel(fs);
+ condexit = cond(ls);
+ enterblock(fs, &bl, 1);
+ checknext(ls, TK_DO);
+ block(ls);
+ luaK_jumpto(fs, whileinit);
+ check_match(ls, TK_END, TK_WHILE, line);
+ leaveblock(fs);
+ luaK_patchtohere(fs, condexit); /* false conditions finish the loop */
+}
+
+
+static void repeatstat (LexState *ls, int line) {
+ /* repeatstat -> REPEAT block UNTIL cond */
+ int condexit;
+ FuncState *fs = ls->fs;
+ int repeat_init = luaK_getlabel(fs);
+ BlockCnt bl1, bl2;
+ enterblock(fs, &bl1, 1); /* loop block */
+ enterblock(fs, &bl2, 0); /* scope block */
+ luaX_next(ls); /* skip REPEAT */
+ statlist(ls);
+ check_match(ls, TK_UNTIL, TK_REPEAT, line);
+ condexit = cond(ls); /* read condition (inside scope block) */
+ if (bl2.upval) /* upvalues? */
+ luaK_patchclose(fs, condexit, bl2.nactvar);
+ leaveblock(fs); /* finish scope */
+ luaK_patchlist(fs, condexit, repeat_init); /* close the loop */
+ leaveblock(fs); /* finish loop */
+}
+
+
+static int exp1 (LexState *ls) {
+ expdesc e;
+ int reg;
+ expr(ls, &e);
+ luaK_exp2nextreg(ls->fs, &e);
+ lua_assert(e.k == VNONRELOC);
+ reg = e.u.info;
+ return reg;
+}
+
+
+static void forbody (LexState *ls, int base, int line, int nvars, int isnum) {
+ /* forbody -> DO block */
+ BlockCnt bl;
+ FuncState *fs = ls->fs;
+ int prep, endfor;
+ adjustlocalvars(ls, 3); /* control variables */
+ checknext(ls, TK_DO);
+ prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs);
+ enterblock(fs, &bl, 0); /* scope for declared variables */
+ adjustlocalvars(ls, nvars);
+ luaK_reserveregs(fs, nvars);
+ block(ls);
+ leaveblock(fs); /* end of scope for declared variables */
+ luaK_patchtohere(fs, prep);
+ if (isnum) /* numeric for? */
+ endfor = luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP);
+ else { /* generic for */
+ luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars);
+ luaK_fixline(fs, line);
+ endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP);
+ }
+ luaK_patchlist(fs, endfor, prep + 1);
+ luaK_fixline(fs, line);
+}
+
+
+static void fornum (LexState *ls, TString *varname, int line) {
+ /* fornum -> NAME = exp1,exp1[,exp1] forbody */
+ FuncState *fs = ls->fs;
+ int base = fs->freereg;
+ new_localvarliteral(ls, "(for index)");
+ new_localvarliteral(ls, "(for limit)");
+ new_localvarliteral(ls, "(for step)");
+ new_localvar(ls, varname);
+ checknext(ls, '=');
+ exp1(ls); /* initial value */
+ checknext(ls, ',');
+ exp1(ls); /* limit */
+ if (testnext(ls, ','))
+ exp1(ls); /* optional step */
+ else { /* default step = 1 */
+ luaK_codek(fs, fs->freereg, luaK_intK(fs, 1));
+ luaK_reserveregs(fs, 1);
+ }
+ forbody(ls, base, line, 1, 1);
+}
+
+
+static void forlist (LexState *ls, TString *indexname) {
+ /* forlist -> NAME {,NAME} IN explist forbody */
+ FuncState *fs = ls->fs;
+ expdesc e;
+ int nvars = 4; /* gen, state, control, plus at least one declared var */
+ int line;
+ int base = fs->freereg;
+ /* create control variables */
+ new_localvarliteral(ls, "(for generator)");
+ new_localvarliteral(ls, "(for state)");
+ new_localvarliteral(ls, "(for control)");
+ /* create declared variables */
+ new_localvar(ls, indexname);
+ while (testnext(ls, ',')) {
+ new_localvar(ls, str_checkname(ls));
+ nvars++;
+ }
+ checknext(ls, TK_IN);
+ line = ls->linenumber;
+ adjust_assign(ls, 3, explist(ls, &e), &e);
+ luaK_checkstack(fs, 3); /* extra space to call generator */
+ forbody(ls, base, line, nvars - 3, 0);
+}
+
+
+static void forstat (LexState *ls, int line) {
+ /* forstat -> FOR (fornum | forlist) END */
+ FuncState *fs = ls->fs;
+ TString *varname;
+ BlockCnt bl;
+ enterblock(fs, &bl, 1); /* scope for loop and control variables */
+ luaX_next(ls); /* skip 'for' */
+ varname = str_checkname(ls); /* first variable name */
+ switch (ls->t.token) {
+ case '=': fornum(ls, varname, line); break;
+ case ',': case TK_IN: forlist(ls, varname); break;
+ default: luaX_syntaxerror(ls, "'=' or 'in' expected");
+ }
+ check_match(ls, TK_END, TK_FOR, line);
+ leaveblock(fs); /* loop scope ('break' jumps to this point) */
+}
+
+
+static void test_then_block (LexState *ls, int *escapelist) {
+ /* test_then_block -> [IF | ELSEIF] cond THEN block */
+ BlockCnt bl;
+ FuncState *fs = ls->fs;
+ expdesc v;
+ int jf; /* instruction to skip 'then' code (if condition is false) */
+ luaX_next(ls); /* skip IF or ELSEIF */
+ expr(ls, &v); /* read condition */
+ checknext(ls, TK_THEN);
+ if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) {
+ luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */
+ enterblock(fs, &bl, 0); /* must enter block before 'goto' */
+ gotostat(ls, v.t); /* handle goto/break */
+ skipnoopstat(ls); /* skip other no-op statements */
+ if (block_follow(ls, 0)) { /* 'goto' is the entire block? */
+ leaveblock(fs);
+ return; /* and that is it */
+ }
+ else /* must skip over 'then' part if condition is false */
+ jf = luaK_jump(fs);
+ }
+ else { /* regular case (not goto/break) */
+ luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */
+ enterblock(fs, &bl, 0);
+ jf = v.f;
+ }
+ statlist(ls); /* 'then' part */
+ leaveblock(fs);
+ if (ls->t.token == TK_ELSE ||
+ ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */
+ luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */
+ luaK_patchtohere(fs, jf);
+}
+
+
+static void ifstat (LexState *ls, int line) {
+ /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
+ FuncState *fs = ls->fs;
+ int escapelist = NO_JUMP; /* exit list for finished parts */
+ test_then_block(ls, &escapelist); /* IF cond THEN block */
+ while (ls->t.token == TK_ELSEIF)
+ test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */
+ if (testnext(ls, TK_ELSE))
+ block(ls); /* 'else' part */
+ check_match(ls, TK_END, TK_IF, line);
+ luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */
+}
+
+
+static void localfunc (LexState *ls) {
+ expdesc b;
+ FuncState *fs = ls->fs;
+ new_localvar(ls, str_checkname(ls)); /* new local variable */
+ adjustlocalvars(ls, 1); /* enter its scope */
+ body(ls, &b, 0, ls->linenumber); /* function created in next register */
+ /* debug information will only see the variable after this point! */
+ getlocvar(fs, b.u.info)->startpc = fs->pc;
+}
+
+
+static void localstat (LexState *ls) {
+ /* stat -> LOCAL NAME {',' NAME} ['=' explist] */
+ int nvars = 0;
+ int nexps;
+ expdesc e;
+ do {
+ new_localvar(ls, str_checkname(ls));
+ nvars++;
+ } while (testnext(ls, ','));
+ if (testnext(ls, '='))
+ nexps = explist(ls, &e);
+ else {
+ e.k = VVOID;
+ nexps = 0;
+ }
+ adjust_assign(ls, nvars, nexps, &e);
+ adjustlocalvars(ls, nvars);
+}
+
+
+static int funcname (LexState *ls, expdesc *v) {
+ /* funcname -> NAME {fieldsel} [':' NAME] */
+ int ismethod = 0;
+ singlevar(ls, v);
+ while (ls->t.token == '.')
+ fieldsel(ls, v);
+ if (ls->t.token == ':') {
+ ismethod = 1;
+ fieldsel(ls, v);
+ }
+ return ismethod;
+}
+
+
+static void funcstat (LexState *ls, int line) {
+ /* funcstat -> FUNCTION funcname body */
+ int ismethod;
+ expdesc v, b;
+ luaX_next(ls); /* skip FUNCTION */
+ ismethod = funcname(ls, &v);
+ body(ls, &b, ismethod, line);
+ luaK_storevar(ls->fs, &v, &b);
+ luaK_fixline(ls->fs, line); /* definition "happens" in the first line */
+}
+
+
+static void exprstat (LexState *ls) {
+ /* stat -> func | assignment */
+ FuncState *fs = ls->fs;
+ struct LHS_assign v;
+ suffixedexp(ls, &v.v);
+ if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */
+ v.prev = NULL;
+ assignment(ls, &v, 1);
+ }
+ else { /* stat -> func */
+ check_condition(ls, v.v.k == VCALL, "syntax error");
+ SETARG_C(getinstruction(fs, &v.v), 1); /* call statement uses no results */
+ }
+}
+
+
+static void retstat (LexState *ls) {
+ /* stat -> RETURN [explist] [';'] */
+ FuncState *fs = ls->fs;
+ expdesc e;
+ int first, nret; /* registers with returned values */
+ if (block_follow(ls, 1) || ls->t.token == ';')
+ first = nret = 0; /* return no values */
+ else {
+ nret = explist(ls, &e); /* optional return values */
+ if (hasmultret(e.k)) {
+ luaK_setmultret(fs, &e);
+ if (e.k == VCALL && nret == 1) { /* tail call? */
+ SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL);
+ lua_assert(GETARG_A(getinstruction(fs,&e)) == fs->nactvar);
+ }
+ first = fs->nactvar;
+ nret = LUA_MULTRET; /* return all values */
+ }
+ else {
+ if (nret == 1) /* only one single value? */
+ first = luaK_exp2anyreg(fs, &e);
+ else {
+ luaK_exp2nextreg(fs, &e); /* values must go to the stack */
+ first = fs->nactvar; /* return all active values */
+ lua_assert(nret == fs->freereg - first);
+ }
+ }
+ }
+ luaK_ret(fs, first, nret);
+ testnext(ls, ';'); /* skip optional semicolon */
+}
+
+
+static void statement (LexState *ls) {
+ int line = ls->linenumber; /* may be needed for error messages */
+ enterlevel(ls);
+ switch (ls->t.token) {
+ case ';': { /* stat -> ';' (empty statement) */
+ luaX_next(ls); /* skip ';' */
+ break;
+ }
+ case TK_IF: { /* stat -> ifstat */
+ ifstat(ls, line);
+ break;
+ }
+ case TK_WHILE: { /* stat -> whilestat */
+ whilestat(ls, line);
+ break;
+ }
+ case TK_DO: { /* stat -> DO block END */
+ luaX_next(ls); /* skip DO */
+ block(ls);
+ check_match(ls, TK_END, TK_DO, line);
+ break;
+ }
+ case TK_FOR: { /* stat -> forstat */
+ forstat(ls, line);
+ break;
+ }
+ case TK_REPEAT: { /* stat -> repeatstat */
+ repeatstat(ls, line);
+ break;
+ }
+ case TK_FUNCTION: { /* stat -> funcstat */
+ funcstat(ls, line);
+ break;
+ }
+ case TK_LOCAL: { /* stat -> localstat */
+ luaX_next(ls); /* skip LOCAL */
+ if (testnext(ls, TK_FUNCTION)) /* local function? */
+ localfunc(ls);
+ else
+ localstat(ls);
+ break;
+ }
+ case TK_DBCOLON: { /* stat -> label */
+ luaX_next(ls); /* skip double colon */
+ labelstat(ls, str_checkname(ls), line);
+ break;
+ }
+ case TK_RETURN: { /* stat -> retstat */
+ luaX_next(ls); /* skip RETURN */
+ retstat(ls);
+ break;
+ }
+ case TK_BREAK: /* stat -> breakstat */
+ case TK_GOTO: { /* stat -> 'goto' NAME */
+ gotostat(ls, luaK_jump(ls->fs));
+ break;
+ }
+ default: { /* stat -> func | assignment */
+ exprstat(ls);
+ break;
+ }
+ }
+ lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&
+ ls->fs->freereg >= ls->fs->nactvar);
+ ls->fs->freereg = ls->fs->nactvar; /* free registers */
+ leavelevel(ls);
+}
+
+/* }====================================================================== */
+
+
+/*
+** compiles the main function, which is a regular vararg function with an
+** upvalue named LUA_ENV
+*/
+static void mainfunc (LexState *ls, FuncState *fs) {
+ BlockCnt bl;
+ expdesc v;
+ open_func(ls, fs, &bl);
+ fs->f->is_vararg = 2; /* main function is always declared vararg */
+ init_exp(&v, VLOCAL, 0); /* create and... */
+ newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */
+ luaX_next(ls); /* read first token */
+ statlist(ls); /* parse main body */
+ check(ls, TK_EOS);
+ close_func(ls);
+}
+
+
+LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
+ Dyndata *dyd, const char *name, int firstchar) {
+ LexState lexstate;
+ FuncState funcstate;
+ LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */
+ setclLvalue(L, L->top, cl); /* anchor it (to avoid being collected) */
+ luaD_inctop(L);
+ lexstate.h = luaH_new(L); /* create table for scanner */
+ sethvalue(L, L->top, lexstate.h); /* anchor it */
+ luaD_inctop(L);
+ funcstate.f = cl->p = luaF_newproto(L);
+ funcstate.f->source = luaS_new(L, name); /* create and anchor TString */
+ lua_assert(iswhite(funcstate.f)); /* do not need barrier here */
+ lexstate.buff = buff;
+ lexstate.dyd = dyd;
+ dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;
+ luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar);
+ mainfunc(&lexstate, &funcstate);
+ lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
+ /* all scopes should be correctly finished */
+ lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);
+ L->top--; /* remove scanner's table */
+ return cl; /* closure is on the stack, too */
+}
+
diff --git a/libs/lua/lua-5.3.3/lparser.h b/libs/lua/lua-5.3.3/lparser.h
new file mode 100644
index 0000000..02e9b03
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lparser.h
@@ -0,0 +1,133 @@
+/*
+** $Id: lparser.h,v 1.76 2015/12/30 18:16:13 roberto Exp $
+** Lua Parser
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lparser_h
+#define lparser_h
+
+#include "llimits.h"
+#include "lobject.h"
+#include "lzio.h"
+
+
+/*
+** Expression and variable descriptor.
+** Code generation for variables and expressions can be delayed to allow
+** optimizations; An 'expdesc' structure describes a potentially-delayed
+** variable/expression. It has a description of its "main" value plus a
+** list of conditional jumps that can also produce its value (generated
+** by short-circuit operators 'and'/'or').
+*/
+
+/* kinds of variables/expressions */
+typedef enum {
+ VVOID, /* when 'expdesc' describes the last expression a list,
+ this kind means an empty list (so, no expression) */
+ VNIL, /* constant nil */
+ VTRUE, /* constant true */
+ VFALSE, /* constant false */
+ VK, /* constant in 'k'; info = index of constant in 'k' */
+ VKFLT, /* floating constant; nval = numerical float value */
+ VKINT, /* integer constant; nval = numerical integer value */
+ VNONRELOC, /* expression has its value in a fixed register;
+ info = result register */
+ VLOCAL, /* local variable; info = local register */
+ VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */
+ VINDEXED, /* indexed variable;
+ ind.vt = whether 't' is register or upvalue;
+ ind.t = table register or upvalue;
+ ind.idx = key's R/K index */
+ VJMP, /* expression is a test/comparison;
+ info = pc of corresponding jump instruction */
+ VRELOCABLE, /* expression can put result in any register;
+ info = instruction pc */
+ VCALL, /* expression is a function call; info = instruction pc */
+ VVARARG /* vararg expression; info = instruction pc */
+} expkind;
+
+
+#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXED)
+#define vkisinreg(k) ((k) == VNONRELOC || (k) == VLOCAL)
+
+typedef struct expdesc {
+ expkind k;
+ union {
+ lua_Integer ival; /* for VKINT */
+ lua_Number nval; /* for VKFLT */
+ int info; /* for generic use */
+ struct { /* for indexed variables (VINDEXED) */
+ short idx; /* index (R/K) */
+ lu_byte t; /* table (register or upvalue) */
+ lu_byte vt; /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */
+ } ind;
+ } u;
+ int t; /* patch list of 'exit when true' */
+ int f; /* patch list of 'exit when false' */
+} expdesc;
+
+
+/* description of active local variable */
+typedef struct Vardesc {
+ short idx; /* variable index in stack */
+} Vardesc;
+
+
+/* description of pending goto statements and label statements */
+typedef struct Labeldesc {
+ TString *name; /* label identifier */
+ int pc; /* position in code */
+ int line; /* line where it appeared */
+ lu_byte nactvar; /* local level where it appears in current block */
+} Labeldesc;
+
+
+/* list of labels or gotos */
+typedef struct Labellist {
+ Labeldesc *arr; /* array */
+ int n; /* number of entries in use */
+ int size; /* array size */
+} Labellist;
+
+
+/* dynamic structures used by the parser */
+typedef struct Dyndata {
+ struct { /* list of active local variables */
+ Vardesc *arr;
+ int n;
+ int size;
+ } actvar;
+ Labellist gt; /* list of pending gotos */
+ Labellist label; /* list of active labels */
+} Dyndata;
+
+
+/* control of blocks */
+struct BlockCnt; /* defined in lparser.c */
+
+
+/* state needed to generate code for a given function */
+typedef struct FuncState {
+ Proto *f; /* current function header */
+ struct FuncState *prev; /* enclosing function */
+ struct LexState *ls; /* lexical state */
+ struct BlockCnt *bl; /* chain of current blocks */
+ int pc; /* next position to code (equivalent to 'ncode') */
+ int lasttarget; /* 'label' of last 'jump label' */
+ int jpc; /* list of pending jumps to 'pc' */
+ int nk; /* number of elements in 'k' */
+ int np; /* number of elements in 'p' */
+ int firstlocal; /* index of first local var (in Dyndata array) */
+ short nlocvars; /* number of elements in 'f->locvars' */
+ lu_byte nactvar; /* number of active local variables */
+ lu_byte nups; /* number of upvalues */
+ lu_byte freereg; /* first free register */
+} FuncState;
+
+
+LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
+ Dyndata *dyd, const char *name, int firstchar);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lprefix.h b/libs/lua/lua-5.3.3/lprefix.h
new file mode 100644
index 0000000..02daa83
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lprefix.h
@@ -0,0 +1,45 @@
+/*
+** $Id: lprefix.h,v 1.2 2014/12/29 16:54:13 roberto Exp $
+** Definitions for Lua code that must come before any other header file
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lprefix_h
+#define lprefix_h
+
+
+/*
+** Allows POSIX/XSI stuff
+*/
+#if !defined(LUA_USE_C89) /* { */
+
+#if !defined(_XOPEN_SOURCE)
+#define _XOPEN_SOURCE 600
+#elif _XOPEN_SOURCE == 0
+#undef _XOPEN_SOURCE /* use -D_XOPEN_SOURCE=0 to undefine it */
+#endif
+
+/*
+** Allows manipulation of large files in gcc and some other compilers
+*/
+#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS)
+#define _LARGEFILE_SOURCE 1
+#define _FILE_OFFSET_BITS 64
+#endif
+
+#endif /* } */
+
+
+/*
+** Windows stuff
+*/
+#if defined(_WIN32) /* { */
+
+#if !defined(_CRT_SECURE_NO_WARNINGS)
+#define _CRT_SECURE_NO_WARNINGS /* avoid warnings about ISO C functions */
+#endif
+
+#endif /* } */
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lstate.c b/libs/lua/lua-5.3.3/lstate.c
new file mode 100644
index 0000000..9194ac3
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstate.c
@@ -0,0 +1,347 @@
+/*
+** $Id: lstate.c,v 2.133 2015/11/13 12:16:51 roberto Exp $
+** Global State
+** See Copyright Notice in lua.h
+*/
+
+#define lstate_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "llex.h"
+#include "lmem.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+
+
+#if !defined(LUAI_GCPAUSE)
+#define LUAI_GCPAUSE 200 /* 200% */
+#endif
+
+#if !defined(LUAI_GCMUL)
+#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */
+#endif
+
+
+/*
+** a macro to help the creation of a unique random seed when a state is
+** created; the seed is used to randomize hashes.
+*/
+#if !defined(luai_makeseed)
+#include <time.h>
+#define luai_makeseed() cast(unsigned int, time(NULL))
+#endif
+
+
+
+/*
+** thread state + extra space
+*/
+typedef struct LX {
+ lu_byte extra_[LUA_EXTRASPACE];
+ lua_State l;
+} LX;
+
+
+/*
+** Main thread combines a thread state and the global state
+*/
+typedef struct LG {
+ LX l;
+ global_State g;
+} LG;
+
+
+
+#define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l)))
+
+
+/*
+** Compute an initial seed as random as possible. Rely on Address Space
+** Layout Randomization (if present) to increase randomness..
+*/
+#define addbuff(b,p,e) \
+ { size_t t = cast(size_t, e); \
+ memcpy(b + p, &t, sizeof(t)); p += sizeof(t); }
+
+static unsigned int makeseed (lua_State *L) {
+ char buff[4 * sizeof(size_t)];
+ unsigned int h = luai_makeseed();
+ int p = 0;
+ addbuff(buff, p, L); /* heap variable */
+ addbuff(buff, p, &h); /* local variable */
+ addbuff(buff, p, luaO_nilobject); /* global variable */
+ addbuff(buff, p, &lua_newstate); /* public function */
+ lua_assert(p == sizeof(buff));
+ return luaS_hash(buff, p, h);
+}
+
+
+/*
+** set GCdebt to a new value keeping the value (totalbytes + GCdebt)
+** invariant (and avoiding underflows in 'totalbytes')
+*/
+void luaE_setdebt (global_State *g, l_mem debt) {
+ l_mem tb = gettotalbytes(g);
+ lua_assert(tb > 0);
+ if (debt < tb - MAX_LMEM)
+ debt = tb - MAX_LMEM; /* will make 'totalbytes == MAX_LMEM' */
+ g->totalbytes = tb - debt;
+ g->GCdebt = debt;
+}
+
+
+CallInfo *luaE_extendCI (lua_State *L) {
+ CallInfo *ci = luaM_new(L, CallInfo);
+ lua_assert(L->ci->next == NULL);
+ L->ci->next = ci;
+ ci->previous = L->ci;
+ ci->next = NULL;
+ L->nci++;
+ return ci;
+}
+
+
+/*
+** free all CallInfo structures not in use by a thread
+*/
+void luaE_freeCI (lua_State *L) {
+ CallInfo *ci = L->ci;
+ CallInfo *next = ci->next;
+ ci->next = NULL;
+ while ((ci = next) != NULL) {
+ next = ci->next;
+ luaM_free(L, ci);
+ L->nci--;
+ }
+}
+
+
+/*
+** free half of the CallInfo structures not in use by a thread
+*/
+void luaE_shrinkCI (lua_State *L) {
+ CallInfo *ci = L->ci;
+ CallInfo *next2; /* next's next */
+ /* while there are two nexts */
+ while (ci->next != NULL && (next2 = ci->next->next) != NULL) {
+ luaM_free(L, ci->next); /* free next */
+ L->nci--;
+ ci->next = next2; /* remove 'next' from the list */
+ next2->previous = ci;
+ ci = next2; /* keep next's next */
+ }
+}
+
+
+static void stack_init (lua_State *L1, lua_State *L) {
+ int i; CallInfo *ci;
+ /* initialize stack array */
+ L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, TValue);
+ L1->stacksize = BASIC_STACK_SIZE;
+ for (i = 0; i < BASIC_STACK_SIZE; i++)
+ setnilvalue(L1->stack + i); /* erase new stack */
+ L1->top = L1->stack;
+ L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK;
+ /* initialize first ci */
+ ci = &L1->base_ci;
+ ci->next = ci->previous = NULL;
+ ci->callstatus = 0;
+ ci->func = L1->top;
+ setnilvalue(L1->top++); /* 'function' entry for this 'ci' */
+ ci->top = L1->top + LUA_MINSTACK;
+ L1->ci = ci;
+}
+
+
+static void freestack (lua_State *L) {
+ if (L->stack == NULL)
+ return; /* stack not completely built yet */
+ L->ci = &L->base_ci; /* free the entire 'ci' list */
+ luaE_freeCI(L);
+ lua_assert(L->nci == 0);
+ luaM_freearray(L, L->stack, L->stacksize); /* free stack array */
+}
+
+
+/*
+** Create registry table and its predefined values
+*/
+static void init_registry (lua_State *L, global_State *g) {
+ TValue temp;
+ /* create registry */
+ Table *registry = luaH_new(L);
+ sethvalue(L, &g->l_registry, registry);
+ luaH_resize(L, registry, LUA_RIDX_LAST, 0);
+ /* registry[LUA_RIDX_MAINTHREAD] = L */
+ setthvalue(L, &temp, L); /* temp = L */
+ luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp);
+ /* registry[LUA_RIDX_GLOBALS] = table of globals */
+ sethvalue(L, &temp, luaH_new(L)); /* temp = new table (global table) */
+ luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp);
+}
+
+
+/*
+** open parts of the state that may cause memory-allocation errors.
+** ('g->version' != NULL flags that the state was completely build)
+*/
+static void f_luaopen (lua_State *L, void *ud) {
+ global_State *g = G(L);
+ UNUSED(ud);
+ stack_init(L, L); /* init stack */
+ init_registry(L, g);
+ luaS_init(L);
+ luaT_init(L);
+ luaX_init(L);
+ g->gcrunning = 1; /* allow gc */
+ g->version = lua_version(NULL);
+ luai_userstateopen(L);
+}
+
+
+/*
+** preinitialize a thread with consistent values without allocating
+** any memory (to avoid errors)
+*/
+static void preinit_thread (lua_State *L, global_State *g) {
+ G(L) = g;
+ L->stack = NULL;
+ L->ci = NULL;
+ L->nci = 0;
+ L->stacksize = 0;
+ L->twups = L; /* thread has no upvalues */
+ L->errorJmp = NULL;
+ L->nCcalls = 0;
+ L->hook = NULL;
+ L->hookmask = 0;
+ L->basehookcount = 0;
+ L->allowhook = 1;
+ resethookcount(L);
+ L->openupval = NULL;
+ L->nny = 1;
+ L->status = LUA_OK;
+ L->errfunc = 0;
+}
+
+
+static void close_state (lua_State *L) {
+ global_State *g = G(L);
+ luaF_close(L, L->stack); /* close all upvalues for this thread */
+ luaC_freeallobjects(L); /* collect all objects */
+ if (g->version) /* closing a fully built state? */
+ luai_userstateclose(L);
+ luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size);
+ freestack(L);
+ lua_assert(gettotalbytes(g) == sizeof(LG));
+ (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */
+}
+
+
+LUA_API lua_State *lua_newthread (lua_State *L) {
+ global_State *g = G(L);
+ lua_State *L1;
+ lua_lock(L);
+ luaC_checkGC(L);
+ /* create new thread */
+ L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;
+ L1->marked = luaC_white(g);
+ L1->tt = LUA_TTHREAD;
+ /* link it on list 'allgc' */
+ L1->next = g->allgc;
+ g->allgc = obj2gco(L1);
+ /* anchor it on L stack */
+ setthvalue(L, L->top, L1);
+ api_incr_top(L);
+ preinit_thread(L1, g);
+ L1->hookmask = L->hookmask;
+ L1->basehookcount = L->basehookcount;
+ L1->hook = L->hook;
+ resethookcount(L1);
+ /* initialize L1 extra space */
+ memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread),
+ LUA_EXTRASPACE);
+ luai_userstatethread(L, L1);
+ stack_init(L1, L); /* init stack */
+ lua_unlock(L);
+ return L1;
+}
+
+
+void luaE_freethread (lua_State *L, lua_State *L1) {
+ LX *l = fromstate(L1);
+ luaF_close(L1, L1->stack); /* close all upvalues for this thread */
+ lua_assert(L1->openupval == NULL);
+ luai_userstatefree(L, L1);
+ freestack(L1);
+ luaM_free(L, l);
+}
+
+
+LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
+ int i;
+ lua_State *L;
+ global_State *g;
+ LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG)));
+ if (l == NULL) return NULL;
+ L = &l->l.l;
+ g = &l->g;
+ L->next = NULL;
+ L->tt = LUA_TTHREAD;
+ g->currentwhite = bitmask(WHITE0BIT);
+ L->marked = luaC_white(g);
+ preinit_thread(L, g);
+ g->frealloc = f;
+ g->ud = ud;
+ g->mainthread = L;
+ g->seed = makeseed(L);
+ g->gcrunning = 0; /* no GC while building state */
+ g->GCestimate = 0;
+ g->strt.size = g->strt.nuse = 0;
+ g->strt.hash = NULL;
+ setnilvalue(&g->l_registry);
+ g->panic = NULL;
+ g->version = NULL;
+ g->gcstate = GCSpause;
+ g->gckind = KGC_NORMAL;
+ g->allgc = g->finobj = g->tobefnz = g->fixedgc = NULL;
+ g->sweepgc = NULL;
+ g->gray = g->grayagain = NULL;
+ g->weak = g->ephemeron = g->allweak = NULL;
+ g->twups = NULL;
+ g->totalbytes = sizeof(LG);
+ g->GCdebt = 0;
+ g->gcfinnum = 0;
+ g->gcpause = LUAI_GCPAUSE;
+ g->gcstepmul = LUAI_GCMUL;
+ for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL;
+ if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) {
+ /* memory allocation error: free partial state */
+ close_state(L);
+ L = NULL;
+ }
+ return L;
+}
+
+
+LUA_API void lua_close (lua_State *L) {
+ L = G(L)->mainthread; /* only the main thread can be closed */
+ lua_lock(L);
+ close_state(L);
+}
+
+
diff --git a/libs/lua/lua-5.3.3/lstate.h b/libs/lua/lua-5.3.3/lstate.h
new file mode 100644
index 0000000..b3033be
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstate.h
@@ -0,0 +1,234 @@
+/*
+** $Id: lstate.h,v 2.130 2015/12/16 16:39:38 roberto Exp $
+** Global State
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lstate_h
+#define lstate_h
+
+#include "lua.h"
+
+#include "lobject.h"
+#include "ltm.h"
+#include "lzio.h"
+
+
+/*
+
+** Some notes about garbage-collected objects: All objects in Lua must
+** be kept somehow accessible until being freed, so all objects always
+** belong to one (and only one) of these lists, using field 'next' of
+** the 'CommonHeader' for the link:
+**
+** 'allgc': all objects not marked for finalization;
+** 'finobj': all objects marked for finalization;
+** 'tobefnz': all objects ready to be finalized;
+** 'fixedgc': all objects that are not to be collected (currently
+** only small strings, such as reserved words).
+
+*/
+
+
+struct lua_longjmp; /* defined in ldo.c */
+
+
+/*
+** Atomic type (relative to signals) to better ensure that 'lua_sethook'
+** is thread safe
+*/
+#if !defined(l_signalT)
+#include <signal.h>
+#define l_signalT sig_atomic_t
+#endif
+
+
+/* extra stack space to handle TM calls and some other extras */
+#define EXTRA_STACK 5
+
+
+#define BASIC_STACK_SIZE (2*LUA_MINSTACK)
+
+
+/* kinds of Garbage Collection */
+#define KGC_NORMAL 0
+#define KGC_EMERGENCY 1 /* gc was forced by an allocation failure */
+
+
+typedef struct stringtable {
+ TString **hash;
+ int nuse; /* number of elements */
+ int size;
+} stringtable;
+
+
+/*
+** Information about a call.
+** When a thread yields, 'func' is adjusted to pretend that the
+** top function has only the yielded values in its stack; in that
+** case, the actual 'func' value is saved in field 'extra'.
+** When a function calls another with a continuation, 'extra' keeps
+** the function index so that, in case of errors, the continuation
+** function can be called with the correct top.
+*/
+typedef struct CallInfo {
+ StkId func; /* function index in the stack */
+ StkId top; /* top for this function */
+ struct CallInfo *previous, *next; /* dynamic call link */
+ union {
+ struct { /* only for Lua functions */
+ StkId base; /* base for this function */
+ const Instruction *savedpc;
+ } l;
+ struct { /* only for C functions */
+ lua_KFunction k; /* continuation in case of yields */
+ ptrdiff_t old_errfunc;
+ lua_KContext ctx; /* context info. in case of yields */
+ } c;
+ } u;
+ ptrdiff_t extra;
+ short nresults; /* expected number of results from this function */
+ lu_byte callstatus;
+} CallInfo;
+
+
+/*
+** Bits in CallInfo status
+*/
+#define CIST_OAH (1<<0) /* original value of 'allowhook' */
+#define CIST_LUA (1<<1) /* call is running a Lua function */
+#define CIST_HOOKED (1<<2) /* call is running a debug hook */
+#define CIST_FRESH (1<<3) /* call is running on a fresh invocation
+ of luaV_execute */
+#define CIST_YPCALL (1<<4) /* call is a yieldable protected call */
+#define CIST_TAIL (1<<5) /* call was tail called */
+#define CIST_HOOKYIELD (1<<6) /* last hook called yielded */
+#define CIST_LEQ (1<<7) /* using __lt for __le */
+
+#define isLua(ci) ((ci)->callstatus & CIST_LUA)
+
+/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */
+#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v))
+#define getoah(st) ((st) & CIST_OAH)
+
+
+/*
+** 'global state', shared by all threads of this state
+*/
+typedef struct global_State {
+ lua_Alloc frealloc; /* function to reallocate memory */
+ void *ud; /* auxiliary data to 'frealloc' */
+ l_mem totalbytes; /* number of bytes currently allocated - GCdebt */
+ l_mem GCdebt; /* bytes allocated not yet compensated by the collector */
+ lu_mem GCmemtrav; /* memory traversed by the GC */
+ lu_mem GCestimate; /* an estimate of the non-garbage memory in use */
+ stringtable strt; /* hash table for strings */
+ TValue l_registry;
+ unsigned int seed; /* randomized seed for hashes */
+ lu_byte currentwhite;
+ lu_byte gcstate; /* state of garbage collector */
+ lu_byte gckind; /* kind of GC running */
+ lu_byte gcrunning; /* true if GC is running */
+ GCObject *allgc; /* list of all collectable objects */
+ GCObject **sweepgc; /* current position of sweep in list */
+ GCObject *finobj; /* list of collectable objects with finalizers */
+ GCObject *gray; /* list of gray objects */
+ GCObject *grayagain; /* list of objects to be traversed atomically */
+ GCObject *weak; /* list of tables with weak values */
+ GCObject *ephemeron; /* list of ephemeron tables (weak keys) */
+ GCObject *allweak; /* list of all-weak tables */
+ GCObject *tobefnz; /* list of userdata to be GC */
+ GCObject *fixedgc; /* list of objects not to be collected */
+ struct lua_State *twups; /* list of threads with open upvalues */
+ unsigned int gcfinnum; /* number of finalizers to call in each GC step */
+ int gcpause; /* size of pause between successive GCs */
+ int gcstepmul; /* GC 'granularity' */
+ lua_CFunction panic; /* to be called in unprotected errors */
+ struct lua_State *mainthread;
+ const lua_Number *version; /* pointer to version number */
+ TString *memerrmsg; /* memory-error message */
+ TString *tmname[TM_N]; /* array with tag-method names */
+ struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */
+ TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */
+} global_State;
+
+
+/*
+** 'per thread' state
+*/
+struct lua_State {
+ CommonHeader;
+ unsigned short nci; /* number of items in 'ci' list */
+ lu_byte status;
+ StkId top; /* first free slot in the stack */
+ global_State *l_G;
+ CallInfo *ci; /* call info for current function */
+ const Instruction *oldpc; /* last pc traced */
+ StkId stack_last; /* last free slot in the stack */
+ StkId stack; /* stack base */
+ UpVal *openupval; /* list of open upvalues in this stack */
+ GCObject *gclist;
+ struct lua_State *twups; /* list of threads with open upvalues */
+ struct lua_longjmp *errorJmp; /* current error recover point */
+ CallInfo base_ci; /* CallInfo for first level (C calling Lua) */
+ volatile lua_Hook hook;
+ ptrdiff_t errfunc; /* current error handling function (stack index) */
+ int stacksize;
+ int basehookcount;
+ int hookcount;
+ unsigned short nny; /* number of non-yieldable calls in stack */
+ unsigned short nCcalls; /* number of nested C calls */
+ l_signalT hookmask;
+ lu_byte allowhook;
+};
+
+
+#define G(L) (L->l_G)
+
+
+/*
+** Union of all collectable objects (only for conversions)
+*/
+union GCUnion {
+ GCObject gc; /* common header */
+ struct TString ts;
+ struct Udata u;
+ union Closure cl;
+ struct Table h;
+ struct Proto p;
+ struct lua_State th; /* thread */
+};
+
+
+#define cast_u(o) cast(union GCUnion *, (o))
+
+/* macros to convert a GCObject into a specific value */
+#define gco2ts(o) \
+ check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts))
+#define gco2u(o) check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u))
+#define gco2lcl(o) check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l))
+#define gco2ccl(o) check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c))
+#define gco2cl(o) \
+ check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl))
+#define gco2t(o) check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h))
+#define gco2p(o) check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p))
+#define gco2th(o) check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th))
+
+
+/* macro to convert a Lua object into a GCObject */
+#define obj2gco(v) \
+ check_exp(novariant((v)->tt) < LUA_TDEADKEY, (&(cast_u(v)->gc)))
+
+
+/* actual number of total bytes allocated */
+#define gettotalbytes(g) cast(lu_mem, (g)->totalbytes + (g)->GCdebt)
+
+LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);
+LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
+LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);
+LUAI_FUNC void luaE_freeCI (lua_State *L);
+LUAI_FUNC void luaE_shrinkCI (lua_State *L);
+
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lstring.c b/libs/lua/lua-5.3.3/lstring.c
new file mode 100644
index 0000000..9351766
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstring.c
@@ -0,0 +1,248 @@
+/*
+** $Id: lstring.c,v 2.56 2015/11/23 11:32:51 roberto Exp $
+** String table (keeps all strings handled by Lua)
+** See Copyright Notice in lua.h
+*/
+
+#define lstring_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+
+
+#define MEMERRMSG "not enough memory"
+
+
+/*
+** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to
+** compute its hash
+*/
+#if !defined(LUAI_HASHLIMIT)
+#define LUAI_HASHLIMIT 5
+#endif
+
+
+/*
+** equality for long strings
+*/
+int luaS_eqlngstr (TString *a, TString *b) {
+ size_t len = a->u.lnglen;
+ lua_assert(a->tt == LUA_TLNGSTR && b->tt == LUA_TLNGSTR);
+ return (a == b) || /* same instance or... */
+ ((len == b->u.lnglen) && /* equal length and ... */
+ (memcmp(getstr(a), getstr(b), len) == 0)); /* equal contents */
+}
+
+
+unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) {
+ unsigned int h = seed ^ cast(unsigned int, l);
+ size_t step = (l >> LUAI_HASHLIMIT) + 1;
+ for (; l >= step; l -= step)
+ h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1]));
+ return h;
+}
+
+
+unsigned int luaS_hashlongstr (TString *ts) {
+ lua_assert(ts->tt == LUA_TLNGSTR);
+ if (ts->extra == 0) { /* no hash? */
+ ts->hash = luaS_hash(getstr(ts), ts->u.lnglen, ts->hash);
+ ts->extra = 1; /* now it has its hash */
+ }
+ return ts->hash;
+}
+
+
+/*
+** resizes the string table
+*/
+void luaS_resize (lua_State *L, int newsize) {
+ int i;
+ stringtable *tb = &G(L)->strt;
+ if (newsize > tb->size) { /* grow table if needed */
+ luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *);
+ for (i = tb->size; i < newsize; i++)
+ tb->hash[i] = NULL;
+ }
+ for (i = 0; i < tb->size; i++) { /* rehash */
+ TString *p = tb->hash[i];
+ tb->hash[i] = NULL;
+ while (p) { /* for each node in the list */
+ TString *hnext = p->u.hnext; /* save next */
+ unsigned int h = lmod(p->hash, newsize); /* new position */
+ p->u.hnext = tb->hash[h]; /* chain it */
+ tb->hash[h] = p;
+ p = hnext;
+ }
+ }
+ if (newsize < tb->size) { /* shrink table if needed */
+ /* vanishing slice should be empty */
+ lua_assert(tb->hash[newsize] == NULL && tb->hash[tb->size - 1] == NULL);
+ luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *);
+ }
+ tb->size = newsize;
+}
+
+
+/*
+** Clear API string cache. (Entries cannot be empty, so fill them with
+** a non-collectable string.)
+*/
+void luaS_clearcache (global_State *g) {
+ int i, j;
+ for (i = 0; i < STRCACHE_N; i++)
+ for (j = 0; j < STRCACHE_M; j++) {
+ if (iswhite(g->strcache[i][j])) /* will entry be collected? */
+ g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */
+ }
+}
+
+
+/*
+** Initialize the string table and the string cache
+*/
+void luaS_init (lua_State *L) {
+ global_State *g = G(L);
+ int i, j;
+ luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
+ /* pre-create memory-error message */
+ g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
+ luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */
+ for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */
+ for (j = 0; j < STRCACHE_M; j++)
+ g->strcache[i][j] = g->memerrmsg;
+}
+
+
+
+/*
+** creates a new string object
+*/
+static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) {
+ TString *ts;
+ GCObject *o;
+ size_t totalsize; /* total size of TString object */
+ totalsize = sizelstring(l);
+ o = luaC_newobj(L, tag, totalsize);
+ ts = gco2ts(o);
+ ts->hash = h;
+ ts->extra = 0;
+ getstr(ts)[l] = '\0'; /* ending 0 */
+ return ts;
+}
+
+
+TString *luaS_createlngstrobj (lua_State *L, size_t l) {
+ TString *ts = createstrobj(L, l, LUA_TLNGSTR, G(L)->seed);
+ ts->u.lnglen = l;
+ return ts;
+}
+
+
+void luaS_remove (lua_State *L, TString *ts) {
+ stringtable *tb = &G(L)->strt;
+ TString **p = &tb->hash[lmod(ts->hash, tb->size)];
+ while (*p != ts) /* find previous element */
+ p = &(*p)->u.hnext;
+ *p = (*p)->u.hnext; /* remove element from its list */
+ tb->nuse--;
+}
+
+
+/*
+** checks whether short string exists and reuses it or creates a new one
+*/
+static TString *internshrstr (lua_State *L, const char *str, size_t l) {
+ TString *ts;
+ global_State *g = G(L);
+ unsigned int h = luaS_hash(str, l, g->seed);
+ TString **list = &g->strt.hash[lmod(h, g->strt.size)];
+ lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */
+ for (ts = *list; ts != NULL; ts = ts->u.hnext) {
+ if (l == ts->shrlen &&
+ (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) {
+ /* found! */
+ if (isdead(g, ts)) /* dead (but not collected yet)? */
+ changewhite(ts); /* resurrect it */
+ return ts;
+ }
+ }
+ if (g->strt.nuse >= g->strt.size && g->strt.size <= MAX_INT/2) {
+ luaS_resize(L, g->strt.size * 2);
+ list = &g->strt.hash[lmod(h, g->strt.size)]; /* recompute with new size */
+ }
+ ts = createstrobj(L, l, LUA_TSHRSTR, h);
+ memcpy(getstr(ts), str, l * sizeof(char));
+ ts->shrlen = cast_byte(l);
+ ts->u.hnext = *list;
+ *list = ts;
+ g->strt.nuse++;
+ return ts;
+}
+
+
+/*
+** new string (with explicit length)
+*/
+TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
+ if (l <= LUAI_MAXSHORTLEN) /* short string? */
+ return internshrstr(L, str, l);
+ else {
+ TString *ts;
+ if (l >= (MAX_SIZE - sizeof(TString))/sizeof(char))
+ luaM_toobig(L);
+ ts = luaS_createlngstrobj(L, l);
+ memcpy(getstr(ts), str, l * sizeof(char));
+ return ts;
+ }
+}
+
+
+/*
+** Create or reuse a zero-terminated string, first checking in the
+** cache (using the string address as a key). The cache can contain
+** only zero-terminated strings, so it is safe to use 'strcmp' to
+** check hits.
+*/
+TString *luaS_new (lua_State *L, const char *str) {
+ unsigned int i = point2uint(str) % STRCACHE_N; /* hash */
+ int j;
+ TString **p = G(L)->strcache[i];
+ for (j = 0; j < STRCACHE_M; j++) {
+ if (strcmp(str, getstr(p[j])) == 0) /* hit? */
+ return p[j]; /* that is it */
+ }
+ /* normal route */
+ for (j = STRCACHE_M - 1; j > 0; j--)
+ p[j] = p[j - 1]; /* move out last element */
+ /* new element is first in the list */
+ p[0] = luaS_newlstr(L, str, strlen(str));
+ return p[0];
+}
+
+
+Udata *luaS_newudata (lua_State *L, size_t s) {
+ Udata *u;
+ GCObject *o;
+ if (s > MAX_SIZE - sizeof(Udata))
+ luaM_toobig(L);
+ o = luaC_newobj(L, LUA_TUSERDATA, sizeludata(s));
+ u = gco2u(o);
+ u->len = s;
+ u->metatable = NULL;
+ setuservalue(L, u, luaO_nilobject);
+ return u;
+}
+
diff --git a/libs/lua/lua-5.3.3/lstring.h b/libs/lua/lua-5.3.3/lstring.h
new file mode 100644
index 0000000..27efd20
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstring.h
@@ -0,0 +1,49 @@
+/*
+** $Id: lstring.h,v 1.61 2015/11/03 15:36:01 roberto Exp $
+** String table (keep all strings handled by Lua)
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lstring_h
+#define lstring_h
+
+#include "lgc.h"
+#include "lobject.h"
+#include "lstate.h"
+
+
+#define sizelstring(l) (sizeof(union UTString) + ((l) + 1) * sizeof(char))
+
+#define sizeludata(l) (sizeof(union UUdata) + (l))
+#define sizeudata(u) sizeludata((u)->len)
+
+#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \
+ (sizeof(s)/sizeof(char))-1))
+
+
+/*
+** test whether a string is a reserved word
+*/
+#define isreserved(s) ((s)->tt == LUA_TSHRSTR && (s)->extra > 0)
+
+
+/*
+** equality for short strings, which are always internalized
+*/
+#define eqshrstr(a,b) check_exp((a)->tt == LUA_TSHRSTR, (a) == (b))
+
+
+LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed);
+LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts);
+LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b);
+LUAI_FUNC void luaS_resize (lua_State *L, int newsize);
+LUAI_FUNC void luaS_clearcache (global_State *g);
+LUAI_FUNC void luaS_init (lua_State *L);
+LUAI_FUNC void luaS_remove (lua_State *L, TString *ts);
+LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s);
+LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);
+LUAI_FUNC TString *luaS_new (lua_State *L, const char *str);
+LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lstrlib.c b/libs/lua/lua-5.3.3/lstrlib.c
new file mode 100644
index 0000000..cd1ced5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstrlib.c
@@ -0,0 +1,1582 @@
+/*
+** $Id: lstrlib.c,v 1.251 2016/05/20 14:13:21 roberto Exp $
+** Standard library for string operations and pattern-matching
+** See Copyright Notice in lua.h
+*/
+
+#define lstrlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <locale.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** maximum number of captures that a pattern can do during
+** pattern-matching. This limit is arbitrary, but must fit in
+** an unsigned char.
+*/
+#if !defined(LUA_MAXCAPTURES)
+#define LUA_MAXCAPTURES 32
+#endif
+
+
+/* macro to 'unsign' a character */
+#define uchar(c) ((unsigned char)(c))
+
+
+/*
+** Some sizes are better limited to fit in 'int', but must also fit in
+** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.)
+*/
+#define MAX_SIZET ((size_t)(~(size_t)0))
+
+#define MAXSIZE \
+ (sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX))
+
+
+
+
+static int str_len (lua_State *L) {
+ size_t l;
+ luaL_checklstring(L, 1, &l);
+ lua_pushinteger(L, (lua_Integer)l);
+ return 1;
+}
+
+
+/* translate a relative string position: negative means back from end */
+static lua_Integer posrelat (lua_Integer pos, size_t len) {
+ if (pos >= 0) return pos;
+ else if (0u - (size_t)pos > len) return 0;
+ else return (lua_Integer)len + pos + 1;
+}
+
+
+static int str_sub (lua_State *L) {
+ size_t l;
+ const char *s = luaL_checklstring(L, 1, &l);
+ lua_Integer start = posrelat(luaL_checkinteger(L, 2), l);
+ lua_Integer end = posrelat(luaL_optinteger(L, 3, -1), l);
+ if (start < 1) start = 1;
+ if (end > (lua_Integer)l) end = l;
+ if (start <= end)
+ lua_pushlstring(L, s + start - 1, (size_t)(end - start) + 1);
+ else lua_pushliteral(L, "");
+ return 1;
+}
+
+
+static int str_reverse (lua_State *L) {
+ size_t l, i;
+ luaL_Buffer b;
+ const char *s = luaL_checklstring(L, 1, &l);
+ char *p = luaL_buffinitsize(L, &b, l);
+ for (i = 0; i < l; i++)
+ p[i] = s[l - i - 1];
+ luaL_pushresultsize(&b, l);
+ return 1;
+}
+
+
+static int str_lower (lua_State *L) {
+ size_t l;
+ size_t i;
+ luaL_Buffer b;
+ const char *s = luaL_checklstring(L, 1, &l);
+ char *p = luaL_buffinitsize(L, &b, l);
+ for (i=0; i<l; i++)
+ p[i] = tolower(uchar(s[i]));
+ luaL_pushresultsize(&b, l);
+ return 1;
+}
+
+
+static int str_upper (lua_State *L) {
+ size_t l;
+ size_t i;
+ luaL_Buffer b;
+ const char *s = luaL_checklstring(L, 1, &l);
+ char *p = luaL_buffinitsize(L, &b, l);
+ for (i=0; i<l; i++)
+ p[i] = toupper(uchar(s[i]));
+ luaL_pushresultsize(&b, l);
+ return 1;
+}
+
+
+static int str_rep (lua_State *L) {
+ size_t l, lsep;
+ const char *s = luaL_checklstring(L, 1, &l);
+ lua_Integer n = luaL_checkinteger(L, 2);
+ const char *sep = luaL_optlstring(L, 3, "", &lsep);
+ if (n <= 0) lua_pushliteral(L, "");
+ else if (l + lsep < l || l + lsep > MAXSIZE / n) /* may overflow? */
+ return luaL_error(L, "resulting string too large");
+ else {
+ size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep;
+ luaL_Buffer b;
+ char *p = luaL_buffinitsize(L, &b, totallen);
+ while (n-- > 1) { /* first n-1 copies (followed by separator) */
+ memcpy(p, s, l * sizeof(char)); p += l;
+ if (lsep > 0) { /* empty 'memcpy' is not that cheap */
+ memcpy(p, sep, lsep * sizeof(char));
+ p += lsep;
+ }
+ }
+ memcpy(p, s, l * sizeof(char)); /* last copy (not followed by separator) */
+ luaL_pushresultsize(&b, totallen);
+ }
+ return 1;
+}
+
+
+static int str_byte (lua_State *L) {
+ size_t l;
+ const char *s = luaL_checklstring(L, 1, &l);
+ lua_Integer posi = posrelat(luaL_optinteger(L, 2, 1), l);
+ lua_Integer pose = posrelat(luaL_optinteger(L, 3, posi), l);
+ int n, i;
+ if (posi < 1) posi = 1;
+ if (pose > (lua_Integer)l) pose = l;
+ if (posi > pose) return 0; /* empty interval; return no values */
+ if (pose - posi >= INT_MAX) /* arithmetic overflow? */
+ return luaL_error(L, "string slice too long");
+ n = (int)(pose - posi) + 1;
+ luaL_checkstack(L, n, "string slice too long");
+ for (i=0; i<n; i++)
+ lua_pushinteger(L, uchar(s[posi+i-1]));
+ return n;
+}
+
+
+static int str_char (lua_State *L) {
+ int n = lua_gettop(L); /* number of arguments */
+ int i;
+ luaL_Buffer b;
+ char *p = luaL_buffinitsize(L, &b, n);
+ for (i=1; i<=n; i++) {
+ lua_Integer c = luaL_checkinteger(L, i);
+ luaL_argcheck(L, uchar(c) == c, i, "value out of range");
+ p[i - 1] = uchar(c);
+ }
+ luaL_pushresultsize(&b, n);
+ return 1;
+}
+
+
+static int writer (lua_State *L, const void *b, size_t size, void *B) {
+ (void)L;
+ luaL_addlstring((luaL_Buffer *) B, (const char *)b, size);
+ return 0;
+}
+
+
+static int str_dump (lua_State *L) {
+ luaL_Buffer b;
+ int strip = lua_toboolean(L, 2);
+ luaL_checktype(L, 1, LUA_TFUNCTION);
+ lua_settop(L, 1);
+ luaL_buffinit(L,&b);
+ if (lua_dump(L, writer, &b, strip) != 0)
+ return luaL_error(L, "unable to dump given function");
+ luaL_pushresult(&b);
+ return 1;
+}
+
+
+
+/*
+** {======================================================
+** PATTERN MATCHING
+** =======================================================
+*/
+
+
+#define CAP_UNFINISHED (-1)
+#define CAP_POSITION (-2)
+
+
+typedef struct MatchState {
+ const char *src_init; /* init of source string */
+ const char *src_end; /* end ('\0') of source string */
+ const char *p_end; /* end ('\0') of pattern */
+ lua_State *L;
+ int matchdepth; /* control for recursive depth (to avoid C stack overflow) */
+ unsigned char level; /* total number of captures (finished or unfinished) */
+ struct {
+ const char *init;
+ ptrdiff_t len;
+ } capture[LUA_MAXCAPTURES];
+} MatchState;
+
+
+/* recursive function */
+static const char *match (MatchState *ms, const char *s, const char *p);
+
+
+/* maximum recursion depth for 'match' */
+#if !defined(MAXCCALLS)
+#define MAXCCALLS 200
+#endif
+
+
+#define L_ESC '%'
+#define SPECIALS "^$*+?.([%-"
+
+
+static int check_capture (MatchState *ms, int l) {
+ l -= '1';
+ if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)
+ return luaL_error(ms->L, "invalid capture index %%%d", l + 1);
+ return l;
+}
+
+
+static int capture_to_close (MatchState *ms) {
+ int level = ms->level;
+ for (level--; level>=0; level--)
+ if (ms->capture[level].len == CAP_UNFINISHED) return level;
+ return luaL_error(ms->L, "invalid pattern capture");
+}
+
+
+static const char *classend (MatchState *ms, const char *p) {
+ switch (*p++) {
+ case L_ESC: {
+ if (p == ms->p_end)
+ luaL_error(ms->L, "malformed pattern (ends with '%%')");
+ return p+1;
+ }
+ case '[': {
+ if (*p == '^') p++;
+ do { /* look for a ']' */
+ if (p == ms->p_end)
+ luaL_error(ms->L, "malformed pattern (missing ']')");
+ if (*(p++) == L_ESC && p < ms->p_end)
+ p++; /* skip escapes (e.g. '%]') */
+ } while (*p != ']');
+ return p+1;
+ }
+ default: {
+ return p;
+ }
+ }
+}
+
+
+static int match_class (int c, int cl) {
+ int res;
+ switch (tolower(cl)) {
+ case 'a' : res = isalpha(c); break;
+ case 'c' : res = iscntrl(c); break;
+ case 'd' : res = isdigit(c); break;
+ case 'g' : res = isgraph(c); break;
+ case 'l' : res = islower(c); break;
+ case 'p' : res = ispunct(c); break;
+ case 's' : res = isspace(c); break;
+ case 'u' : res = isupper(c); break;
+ case 'w' : res = isalnum(c); break;
+ case 'x' : res = isxdigit(c); break;
+ case 'z' : res = (c == 0); break; /* deprecated option */
+ default: return (cl == c);
+ }
+ return (islower(cl) ? res : !res);
+}
+
+
+static int matchbracketclass (int c, const char *p, const char *ec) {
+ int sig = 1;
+ if (*(p+1) == '^') {
+ sig = 0;
+ p++; /* skip the '^' */
+ }
+ while (++p < ec) {
+ if (*p == L_ESC) {
+ p++;
+ if (match_class(c, uchar(*p)))
+ return sig;
+ }
+ else if ((*(p+1) == '-') && (p+2 < ec)) {
+ p+=2;
+ if (uchar(*(p-2)) <= c && c <= uchar(*p))
+ return sig;
+ }
+ else if (uchar(*p) == c) return sig;
+ }
+ return !sig;
+}
+
+
+static int singlematch (MatchState *ms, const char *s, const char *p,
+ const char *ep) {
+ if (s >= ms->src_end)
+ return 0;
+ else {
+ int c = uchar(*s);
+ switch (*p) {
+ case '.': return 1; /* matches any char */
+ case L_ESC: return match_class(c, uchar(*(p+1)));
+ case '[': return matchbracketclass(c, p, ep-1);
+ default: return (uchar(*p) == c);
+ }
+ }
+}
+
+
+static const char *matchbalance (MatchState *ms, const char *s,
+ const char *p) {
+ if (p >= ms->p_end - 1)
+ luaL_error(ms->L, "malformed pattern (missing arguments to '%%b')");
+ if (*s != *p) return NULL;
+ else {
+ int b = *p;
+ int e = *(p+1);
+ int cont = 1;
+ while (++s < ms->src_end) {
+ if (*s == e) {
+ if (--cont == 0) return s+1;
+ }
+ else if (*s == b) cont++;
+ }
+ }
+ return NULL; /* string ends out of balance */
+}
+
+
+static const char *max_expand (MatchState *ms, const char *s,
+ const char *p, const char *ep) {
+ ptrdiff_t i = 0; /* counts maximum expand for item */
+ while (singlematch(ms, s + i, p, ep))
+ i++;
+ /* keeps trying to match with the maximum repetitions */
+ while (i>=0) {
+ const char *res = match(ms, (s+i), ep+1);
+ if (res) return res;
+ i--; /* else didn't match; reduce 1 repetition to try again */
+ }
+ return NULL;
+}
+
+
+static const char *min_expand (MatchState *ms, const char *s,
+ const char *p, const char *ep) {
+ for (;;) {
+ const char *res = match(ms, s, ep+1);
+ if (res != NULL)
+ return res;
+ else if (singlematch(ms, s, p, ep))
+ s++; /* try with one more repetition */
+ else return NULL;
+ }
+}
+
+
+static const char *start_capture (MatchState *ms, const char *s,
+ const char *p, int what) {
+ const char *res;
+ int level = ms->level;
+ if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures");
+ ms->capture[level].init = s;
+ ms->capture[level].len = what;
+ ms->level = level+1;
+ if ((res=match(ms, s, p)) == NULL) /* match failed? */
+ ms->level--; /* undo capture */
+ return res;
+}
+
+
+static const char *end_capture (MatchState *ms, const char *s,
+ const char *p) {
+ int l = capture_to_close(ms);
+ const char *res;
+ ms->capture[l].len = s - ms->capture[l].init; /* close capture */
+ if ((res = match(ms, s, p)) == NULL) /* match failed? */
+ ms->capture[l].len = CAP_UNFINISHED; /* undo capture */
+ return res;
+}
+
+
+static const char *match_capture (MatchState *ms, const char *s, int l) {
+ size_t len;
+ l = check_capture(ms, l);
+ len = ms->capture[l].len;
+ if ((size_t)(ms->src_end-s) >= len &&
+ memcmp(ms->capture[l].init, s, len) == 0)
+ return s+len;
+ else return NULL;
+}
+
+
+static const char *match (MatchState *ms, const char *s, const char *p) {
+ if (ms->matchdepth-- == 0)
+ luaL_error(ms->L, "pattern too complex");
+ init: /* using goto's to optimize tail recursion */
+ if (p != ms->p_end) { /* end of pattern? */
+ switch (*p) {
+ case '(': { /* start capture */
+ if (*(p + 1) == ')') /* position capture? */
+ s = start_capture(ms, s, p + 2, CAP_POSITION);
+ else
+ s = start_capture(ms, s, p + 1, CAP_UNFINISHED);
+ break;
+ }
+ case ')': { /* end capture */
+ s = end_capture(ms, s, p + 1);
+ break;
+ }
+ case '$': {
+ if ((p + 1) != ms->p_end) /* is the '$' the last char in pattern? */
+ goto dflt; /* no; go to default */
+ s = (s == ms->src_end) ? s : NULL; /* check end of string */
+ break;
+ }
+ case L_ESC: { /* escaped sequences not in the format class[*+?-]? */
+ switch (*(p + 1)) {
+ case 'b': { /* balanced string? */
+ s = matchbalance(ms, s, p + 2);
+ if (s != NULL) {
+ p += 4; goto init; /* return match(ms, s, p + 4); */
+ } /* else fail (s == NULL) */
+ break;
+ }
+ case 'f': { /* frontier? */
+ const char *ep; char previous;
+ p += 2;
+ if (*p != '[')
+ luaL_error(ms->L, "missing '[' after '%%f' in pattern");
+ ep = classend(ms, p); /* points to what is next */
+ previous = (s == ms->src_init) ? '\0' : *(s - 1);
+ if (!matchbracketclass(uchar(previous), p, ep - 1) &&
+ matchbracketclass(uchar(*s), p, ep - 1)) {
+ p = ep; goto init; /* return match(ms, s, ep); */
+ }
+ s = NULL; /* match failed */
+ break;
+ }
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ case '8': case '9': { /* capture results (%0-%9)? */
+ s = match_capture(ms, s, uchar(*(p + 1)));
+ if (s != NULL) {
+ p += 2; goto init; /* return match(ms, s, p + 2) */
+ }
+ break;
+ }
+ default: goto dflt;
+ }
+ break;
+ }
+ default: dflt: { /* pattern class plus optional suffix */
+ const char *ep = classend(ms, p); /* points to optional suffix */
+ /* does not match at least once? */
+ if (!singlematch(ms, s, p, ep)) {
+ if (*ep == '*' || *ep == '?' || *ep == '-') { /* accept empty? */
+ p = ep + 1; goto init; /* return match(ms, s, ep + 1); */
+ }
+ else /* '+' or no suffix */
+ s = NULL; /* fail */
+ }
+ else { /* matched once */
+ switch (*ep) { /* handle optional suffix */
+ case '?': { /* optional */
+ const char *res;
+ if ((res = match(ms, s + 1, ep + 1)) != NULL)
+ s = res;
+ else {
+ p = ep + 1; goto init; /* else return match(ms, s, ep + 1); */
+ }
+ break;
+ }
+ case '+': /* 1 or more repetitions */
+ s++; /* 1 match already done */
+ /* FALLTHROUGH */
+ case '*': /* 0 or more repetitions */
+ s = max_expand(ms, s, p, ep);
+ break;
+ case '-': /* 0 or more repetitions (minimum) */
+ s = min_expand(ms, s, p, ep);
+ break;
+ default: /* no suffix */
+ s++; p = ep; goto init; /* return match(ms, s + 1, ep); */
+ }
+ }
+ break;
+ }
+ }
+ }
+ ms->matchdepth++;
+ return s;
+}
+
+
+
+static const char *lmemfind (const char *s1, size_t l1,
+ const char *s2, size_t l2) {
+ if (l2 == 0) return s1; /* empty strings are everywhere */
+ else if (l2 > l1) return NULL; /* avoids a negative 'l1' */
+ else {
+ const char *init; /* to search for a '*s2' inside 's1' */
+ l2--; /* 1st char will be checked by 'memchr' */
+ l1 = l1-l2; /* 's2' cannot be found after that */
+ while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) {
+ init++; /* 1st char is already checked */
+ if (memcmp(init, s2+1, l2) == 0)
+ return init-1;
+ else { /* correct 'l1' and 's1' to try again */
+ l1 -= init-s1;
+ s1 = init;
+ }
+ }
+ return NULL; /* not found */
+ }
+}
+
+
+static void push_onecapture (MatchState *ms, int i, const char *s,
+ const char *e) {
+ if (i >= ms->level) {
+ if (i == 0) /* ms->level == 0, too */
+ lua_pushlstring(ms->L, s, e - s); /* add whole match */
+ else
+ luaL_error(ms->L, "invalid capture index %%%d", i + 1);
+ }
+ else {
+ ptrdiff_t l = ms->capture[i].len;
+ if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture");
+ if (l == CAP_POSITION)
+ lua_pushinteger(ms->L, (ms->capture[i].init - ms->src_init) + 1);
+ else
+ lua_pushlstring(ms->L, ms->capture[i].init, l);
+ }
+}
+
+
+static int push_captures (MatchState *ms, const char *s, const char *e) {
+ int i;
+ int nlevels = (ms->level == 0 && s) ? 1 : ms->level;
+ luaL_checkstack(ms->L, nlevels, "too many captures");
+ for (i = 0; i < nlevels; i++)
+ push_onecapture(ms, i, s, e);
+ return nlevels; /* number of strings pushed */
+}
+
+
+/* check whether pattern has no special characters */
+static int nospecials (const char *p, size_t l) {
+ size_t upto = 0;
+ do {
+ if (strpbrk(p + upto, SPECIALS))
+ return 0; /* pattern has a special character */
+ upto += strlen(p + upto) + 1; /* may have more after \0 */
+ } while (upto <= l);
+ return 1; /* no special chars found */
+}
+
+
+static void prepstate (MatchState *ms, lua_State *L,
+ const char *s, size_t ls, const char *p, size_t lp) {
+ ms->L = L;
+ ms->matchdepth = MAXCCALLS;
+ ms->src_init = s;
+ ms->src_end = s + ls;
+ ms->p_end = p + lp;
+}
+
+
+static void reprepstate (MatchState *ms) {
+ ms->level = 0;
+ lua_assert(ms->matchdepth == MAXCCALLS);
+}
+
+
+static int str_find_aux (lua_State *L, int find) {
+ size_t ls, lp;
+ const char *s = luaL_checklstring(L, 1, &ls);
+ const char *p = luaL_checklstring(L, 2, &lp);
+ lua_Integer init = posrelat(luaL_optinteger(L, 3, 1), ls);
+ if (init < 1) init = 1;
+ else if (init > (lua_Integer)ls + 1) { /* start after string's end? */
+ lua_pushnil(L); /* cannot find anything */
+ return 1;
+ }
+ /* explicit request or no special characters? */
+ if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) {
+ /* do a plain search */
+ const char *s2 = lmemfind(s + init - 1, ls - (size_t)init + 1, p, lp);
+ if (s2) {
+ lua_pushinteger(L, (s2 - s) + 1);
+ lua_pushinteger(L, (s2 - s) + lp);
+ return 2;
+ }
+ }
+ else {
+ MatchState ms;
+ const char *s1 = s + init - 1;
+ int anchor = (*p == '^');
+ if (anchor) {
+ p++; lp--; /* skip anchor character */
+ }
+ prepstate(&ms, L, s, ls, p, lp);
+ do {
+ const char *res;
+ reprepstate(&ms);
+ if ((res=match(&ms, s1, p)) != NULL) {
+ if (find) {
+ lua_pushinteger(L, (s1 - s) + 1); /* start */
+ lua_pushinteger(L, res - s); /* end */
+ return push_captures(&ms, NULL, 0) + 2;
+ }
+ else
+ return push_captures(&ms, s1, res);
+ }
+ } while (s1++ < ms.src_end && !anchor);
+ }
+ lua_pushnil(L); /* not found */
+ return 1;
+}
+
+
+static int str_find (lua_State *L) {
+ return str_find_aux(L, 1);
+}
+
+
+static int str_match (lua_State *L) {
+ return str_find_aux(L, 0);
+}
+
+
+/* state for 'gmatch' */
+typedef struct GMatchState {
+ const char *src; /* current position */
+ const char *p; /* pattern */
+ const char *lastmatch; /* end of last match */
+ MatchState ms; /* match state */
+} GMatchState;
+
+
+static int gmatch_aux (lua_State *L) {
+ GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3));
+ const char *src;
+ gm->ms.L = L;
+ for (src = gm->src; src <= gm->ms.src_end; src++) {
+ const char *e;
+ reprepstate(&gm->ms);
+ if ((e = match(&gm->ms, src, gm->p)) != NULL && e != gm->lastmatch) {
+ gm->src = gm->lastmatch = e;
+ return push_captures(&gm->ms, src, e);
+ }
+ }
+ return 0; /* not found */
+}
+
+
+static int gmatch (lua_State *L) {
+ size_t ls, lp;
+ const char *s = luaL_checklstring(L, 1, &ls);
+ const char *p = luaL_checklstring(L, 2, &lp);
+ GMatchState *gm;
+ lua_settop(L, 2); /* keep them on closure to avoid being collected */
+ gm = (GMatchState *)lua_newuserdata(L, sizeof(GMatchState));
+ prepstate(&gm->ms, L, s, ls, p, lp);
+ gm->src = s; gm->p = p; gm->lastmatch = NULL;
+ lua_pushcclosure(L, gmatch_aux, 3);
+ return 1;
+}
+
+
+static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,
+ const char *e) {
+ size_t l, i;
+ lua_State *L = ms->L;
+ const char *news = lua_tolstring(L, 3, &l);
+ for (i = 0; i < l; i++) {
+ if (news[i] != L_ESC)
+ luaL_addchar(b, news[i]);
+ else {
+ i++; /* skip ESC */
+ if (!isdigit(uchar(news[i]))) {
+ if (news[i] != L_ESC)
+ luaL_error(L, "invalid use of '%c' in replacement string", L_ESC);
+ luaL_addchar(b, news[i]);
+ }
+ else if (news[i] == '0')
+ luaL_addlstring(b, s, e - s);
+ else {
+ push_onecapture(ms, news[i] - '1', s, e);
+ luaL_tolstring(L, -1, NULL); /* if number, convert it to string */
+ lua_remove(L, -2); /* remove original value */
+ luaL_addvalue(b); /* add capture to accumulated result */
+ }
+ }
+ }
+}
+
+
+static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,
+ const char *e, int tr) {
+ lua_State *L = ms->L;
+ switch (tr) {
+ case LUA_TFUNCTION: {
+ int n;
+ lua_pushvalue(L, 3);
+ n = push_captures(ms, s, e);
+ lua_call(L, n, 1);
+ break;
+ }
+ case LUA_TTABLE: {
+ push_onecapture(ms, 0, s, e);
+ lua_gettable(L, 3);
+ break;
+ }
+ default: { /* LUA_TNUMBER or LUA_TSTRING */
+ add_s(ms, b, s, e);
+ return;
+ }
+ }
+ if (!lua_toboolean(L, -1)) { /* nil or false? */
+ lua_pop(L, 1);
+ lua_pushlstring(L, s, e - s); /* keep original text */
+ }
+ else if (!lua_isstring(L, -1))
+ luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1));
+ luaL_addvalue(b); /* add result to accumulator */
+}
+
+
+static int str_gsub (lua_State *L) {
+ size_t srcl, lp;
+ const char *src = luaL_checklstring(L, 1, &srcl); /* subject */
+ const char *p = luaL_checklstring(L, 2, &lp); /* pattern */
+ const char *lastmatch = NULL; /* end of last match */
+ int tr = lua_type(L, 3); /* replacement type */
+ lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */
+ int anchor = (*p == '^');
+ lua_Integer n = 0; /* replacement count */
+ MatchState ms;
+ luaL_Buffer b;
+ luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||
+ tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,
+ "string/function/table expected");
+ luaL_buffinit(L, &b);
+ if (anchor) {
+ p++; lp--; /* skip anchor character */
+ }
+ prepstate(&ms, L, src, srcl, p, lp);
+ while (n < max_s) {
+ const char *e;
+ reprepstate(&ms); /* (re)prepare state for new match */
+ if ((e = match(&ms, src, p)) != NULL && e != lastmatch) { /* match? */
+ n++;
+ add_value(&ms, &b, src, e, tr); /* add replacement to buffer */
+ src = lastmatch = e;
+ }
+ else if (src < ms.src_end) /* otherwise, skip one character */
+ luaL_addchar(&b, *src++);
+ else break; /* end of subject */
+ if (anchor) break;
+ }
+ luaL_addlstring(&b, src, ms.src_end-src);
+ luaL_pushresult(&b);
+ lua_pushinteger(L, n); /* number of substitutions */
+ return 2;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** STRING FORMAT
+** =======================================================
+*/
+
+#if !defined(lua_number2strx) /* { */
+
+/*
+** Hexadecimal floating-point formatter
+*/
+
+#include <math.h>
+
+#define SIZELENMOD (sizeof(LUA_NUMBER_FRMLEN)/sizeof(char))
+
+
+/*
+** Number of bits that goes into the first digit. It can be any value
+** between 1 and 4; the following definition tries to align the number
+** to nibble boundaries by making what is left after that first digit a
+** multiple of 4.
+*/
+#define L_NBFD ((l_mathlim(MANT_DIG) - 1)%4 + 1)
+
+
+/*
+** Add integer part of 'x' to buffer and return new 'x'
+*/
+static lua_Number adddigit (char *buff, int n, lua_Number x) {
+ lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */
+ int d = (int)dd;
+ buff[n] = (d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */
+ return x - dd; /* return what is left */
+}
+
+
+static int num2straux (char *buff, int sz, lua_Number x) {
+ if (x != x || x == HUGE_VAL || x == -HUGE_VAL) /* inf or NaN? */
+ return l_sprintf(buff, sz, LUA_NUMBER_FMT, x); /* equal to '%g' */
+ else if (x == 0) { /* can be -0... */
+ /* create "0" or "-0" followed by exponent */
+ return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", x);
+ }
+ else {
+ int e;
+ lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */
+ int n = 0; /* character count */
+ if (m < 0) { /* is number negative? */
+ buff[n++] = '-'; /* add signal */
+ m = -m; /* make it positive */
+ }
+ buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */
+ m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */
+ e -= L_NBFD; /* this digit goes before the radix point */
+ if (m > 0) { /* more digits? */
+ buff[n++] = lua_getlocaledecpoint(); /* add radix point */
+ do { /* add as many digits as needed */
+ m = adddigit(buff, n++, m * 16);
+ } while (m > 0);
+ }
+ n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */
+ lua_assert(n < sz);
+ return n;
+ }
+}
+
+
+static int lua_number2strx (lua_State *L, char *buff, int sz,
+ const char *fmt, lua_Number x) {
+ int n = num2straux(buff, sz, x);
+ if (fmt[SIZELENMOD] == 'A') {
+ int i;
+ for (i = 0; i < n; i++)
+ buff[i] = toupper(uchar(buff[i]));
+ }
+ else if (fmt[SIZELENMOD] != 'a')
+ luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented");
+ return n;
+}
+
+#endif /* } */
+
+
+/*
+** Maximum size of each formatted item. This maximum size is produced
+** by format('%.99f', -maxfloat), and is equal to 99 + 3 ('-', '.',
+** and '\0') + number of decimal digits to represent maxfloat (which
+** is maximum exponent + 1). (99+3+1 then rounded to 120 for "extra
+** expenses", such as locale-dependent stuff)
+*/
+#define MAX_ITEM (120 + l_mathlim(MAX_10_EXP))
+
+
+/* valid flags in a format specification */
+#define FLAGS "-+ #0"
+
+/*
+** maximum size of each format specification (such as "%-099.99d")
+*/
+#define MAX_FORMAT 32
+
+
+static void addquoted (luaL_Buffer *b, const char *s, size_t len) {
+ luaL_addchar(b, '"');
+ while (len--) {
+ if (*s == '"' || *s == '\\' || *s == '\n') {
+ luaL_addchar(b, '\\');
+ luaL_addchar(b, *s);
+ }
+ else if (iscntrl(uchar(*s))) {
+ char buff[10];
+ if (!isdigit(uchar(*(s+1))))
+ l_sprintf(buff, sizeof(buff), "\\%d", (int)uchar(*s));
+ else
+ l_sprintf(buff, sizeof(buff), "\\%03d", (int)uchar(*s));
+ luaL_addstring(b, buff);
+ }
+ else
+ luaL_addchar(b, *s);
+ s++;
+ }
+ luaL_addchar(b, '"');
+}
+
+
+/*
+** Ensures the 'buff' string uses a dot as the radix character.
+*/
+static void checkdp (char *buff, int nb) {
+ if (memchr(buff, '.', nb) == NULL) { /* no dot? */
+ char point = lua_getlocaledecpoint(); /* try locale point */
+ char *ppoint = (char*) memchr(buff, point, nb);
+ if (ppoint) *ppoint = '.'; /* change it to a dot */
+ }
+}
+
+
+static void addliteral (lua_State *L, luaL_Buffer *b, int arg) {
+ switch (lua_type(L, arg)) {
+ case LUA_TSTRING: {
+ size_t len;
+ const char *s = lua_tolstring(L, arg, &len);
+ addquoted(b, s, len);
+ break;
+ }
+ case LUA_TNUMBER: {
+ char *buff = luaL_prepbuffsize(b, MAX_ITEM);
+ int nb;
+ if (!lua_isinteger(L, arg)) { /* float? */
+ lua_Number n = lua_tonumber(L, arg); /* write as hexa ('%a') */
+ nb = lua_number2strx(L, buff, MAX_ITEM, "%" LUA_NUMBER_FRMLEN "a", n);
+ checkdp(buff, nb); /* ensure it uses a dot */
+ }
+ else { /* integers */
+ lua_Integer n = lua_tointeger(L, arg);
+ const char *format = (n == LUA_MININTEGER) /* corner case? */
+ ? "0x%" LUA_INTEGER_FRMLEN "x" /* use hexa */
+ : LUA_INTEGER_FMT; /* else use default format */
+ nb = l_sprintf(buff, MAX_ITEM, format, n);
+ }
+ luaL_addsize(b, nb);
+ break;
+ }
+ case LUA_TNIL: case LUA_TBOOLEAN: {
+ luaL_tolstring(L, arg, NULL);
+ luaL_addvalue(b);
+ break;
+ }
+ default: {
+ luaL_argerror(L, arg, "value has no literal form");
+ }
+ }
+}
+
+
+static const char *scanformat (lua_State *L, const char *strfrmt, char *form) {
+ const char *p = strfrmt;
+ while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */
+ if ((size_t)(p - strfrmt) >= sizeof(FLAGS)/sizeof(char))
+ luaL_error(L, "invalid format (repeated flags)");
+ if (isdigit(uchar(*p))) p++; /* skip width */
+ if (isdigit(uchar(*p))) p++; /* (2 digits at most) */
+ if (*p == '.') {
+ p++;
+ if (isdigit(uchar(*p))) p++; /* skip precision */
+ if (isdigit(uchar(*p))) p++; /* (2 digits at most) */
+ }
+ if (isdigit(uchar(*p)))
+ luaL_error(L, "invalid format (width or precision too long)");
+ *(form++) = '%';
+ memcpy(form, strfrmt, ((p - strfrmt) + 1) * sizeof(char));
+ form += (p - strfrmt) + 1;
+ *form = '\0';
+ return p;
+}
+
+
+/*
+** add length modifier into formats
+*/
+static void addlenmod (char *form, const char *lenmod) {
+ size_t l = strlen(form);
+ size_t lm = strlen(lenmod);
+ char spec = form[l - 1];
+ strcpy(form + l - 1, lenmod);
+ form[l + lm - 1] = spec;
+ form[l + lm] = '\0';
+}
+
+
+static int str_format (lua_State *L) {
+ int top = lua_gettop(L);
+ int arg = 1;
+ size_t sfl;
+ const char *strfrmt = luaL_checklstring(L, arg, &sfl);
+ const char *strfrmt_end = strfrmt+sfl;
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ while (strfrmt < strfrmt_end) {
+ if (*strfrmt != L_ESC)
+ luaL_addchar(&b, *strfrmt++);
+ else if (*++strfrmt == L_ESC)
+ luaL_addchar(&b, *strfrmt++); /* %% */
+ else { /* format item */
+ char form[MAX_FORMAT]; /* to store the format ('%...') */
+ char *buff = luaL_prepbuffsize(&b, MAX_ITEM); /* to put formatted item */
+ int nb = 0; /* number of bytes in added item */
+ if (++arg > top)
+ luaL_argerror(L, arg, "no value");
+ strfrmt = scanformat(L, strfrmt, form);
+ switch (*strfrmt++) {
+ case 'c': {
+ nb = l_sprintf(buff, MAX_ITEM, form, (int)luaL_checkinteger(L, arg));
+ break;
+ }
+ case 'd': case 'i':
+ case 'o': case 'u': case 'x': case 'X': {
+ lua_Integer n = luaL_checkinteger(L, arg);
+ addlenmod(form, LUA_INTEGER_FRMLEN);
+ nb = l_sprintf(buff, MAX_ITEM, form, n);
+ break;
+ }
+ case 'a': case 'A':
+ addlenmod(form, LUA_NUMBER_FRMLEN);
+ nb = lua_number2strx(L, buff, MAX_ITEM, form,
+ luaL_checknumber(L, arg));
+ break;
+ case 'e': case 'E': case 'f':
+ case 'g': case 'G': {
+ addlenmod(form, LUA_NUMBER_FRMLEN);
+ nb = l_sprintf(buff, MAX_ITEM, form, luaL_checknumber(L, arg));
+ break;
+ }
+ case 'q': {
+ addliteral(L, &b, arg);
+ break;
+ }
+ case 's': {
+ size_t l;
+ const char *s = luaL_tolstring(L, arg, &l);
+ if (form[2] == '\0') /* no modifiers? */
+ luaL_addvalue(&b); /* keep entire string */
+ else {
+ luaL_argcheck(L, l == strlen(s), arg, "string contains zeros");
+ if (!strchr(form, '.') && l >= 100) {
+ /* no precision and string is too long to be formatted */
+ luaL_addvalue(&b); /* keep entire string */
+ }
+ else { /* format the string into 'buff' */
+ nb = l_sprintf(buff, MAX_ITEM, form, s);
+ lua_pop(L, 1); /* remove result from 'luaL_tolstring' */
+ }
+ }
+ break;
+ }
+ default: { /* also treat cases 'pnLlh' */
+ return luaL_error(L, "invalid option '%%%c' to 'format'",
+ *(strfrmt - 1));
+ }
+ }
+ lua_assert(nb < MAX_ITEM);
+ luaL_addsize(&b, nb);
+ }
+ }
+ luaL_pushresult(&b);
+ return 1;
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** PACK/UNPACK
+** =======================================================
+*/
+
+
+/* value used for padding */
+#if !defined(LUAL_PACKPADBYTE)
+#define LUAL_PACKPADBYTE 0x00
+#endif
+
+/* maximum size for the binary representation of an integer */
+#define MAXINTSIZE 16
+
+/* number of bits in a character */
+#define NB CHAR_BIT
+
+/* mask for one character (NB 1's) */
+#define MC ((1 << NB) - 1)
+
+/* size of a lua_Integer */
+#define SZINT ((int)sizeof(lua_Integer))
+
+
+/* dummy union to get native endianness */
+static const union {
+ int dummy;
+ char little; /* true iff machine is little endian */
+} nativeendian = {1};
+
+
+/* dummy structure to get native alignment requirements */
+struct cD {
+ char c;
+ union { double d; void *p; lua_Integer i; lua_Number n; } u;
+};
+
+#define MAXALIGN (offsetof(struct cD, u))
+
+
+/*
+** Union for serializing floats
+*/
+typedef union Ftypes {
+ float f;
+ double d;
+ lua_Number n;
+ char buff[5 * sizeof(lua_Number)]; /* enough for any float type */
+} Ftypes;
+
+
+/*
+** information to pack/unpack stuff
+*/
+typedef struct Header {
+ lua_State *L;
+ int islittle;
+ int maxalign;
+} Header;
+
+
+/*
+** options for pack/unpack
+*/
+typedef enum KOption {
+ Kint, /* signed integers */
+ Kuint, /* unsigned integers */
+ Kfloat, /* floating-point numbers */
+ Kchar, /* fixed-length strings */
+ Kstring, /* strings with prefixed length */
+ Kzstr, /* zero-terminated strings */
+ Kpadding, /* padding */
+ Kpaddalign, /* padding for alignment */
+ Knop /* no-op (configuration or spaces) */
+} KOption;
+
+
+/*
+** Read an integer numeral from string 'fmt' or return 'df' if
+** there is no numeral
+*/
+static int digit (int c) { return '0' <= c && c <= '9'; }
+
+static int getnum (const char **fmt, int df) {
+ if (!digit(**fmt)) /* no number? */
+ return df; /* return default value */
+ else {
+ int a = 0;
+ do {
+ a = a*10 + (*((*fmt)++) - '0');
+ } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10);
+ return a;
+ }
+}
+
+
+/*
+** Read an integer numeral and raises an error if it is larger
+** than the maximum size for integers.
+*/
+static int getnumlimit (Header *h, const char **fmt, int df) {
+ int sz = getnum(fmt, df);
+ if (sz > MAXINTSIZE || sz <= 0)
+ luaL_error(h->L, "integral size (%d) out of limits [1,%d]",
+ sz, MAXINTSIZE);
+ return sz;
+}
+
+
+/*
+** Initialize Header
+*/
+static void initheader (lua_State *L, Header *h) {
+ h->L = L;
+ h->islittle = nativeendian.little;
+ h->maxalign = 1;
+}
+
+
+/*
+** Read and classify next option. 'size' is filled with option's size.
+*/
+static KOption getoption (Header *h, const char **fmt, int *size) {
+ int opt = *((*fmt)++);
+ *size = 0; /* default */
+ switch (opt) {
+ case 'b': *size = sizeof(char); return Kint;
+ case 'B': *size = sizeof(char); return Kuint;
+ case 'h': *size = sizeof(short); return Kint;
+ case 'H': *size = sizeof(short); return Kuint;
+ case 'l': *size = sizeof(long); return Kint;
+ case 'L': *size = sizeof(long); return Kuint;
+ case 'j': *size = sizeof(lua_Integer); return Kint;
+ case 'J': *size = sizeof(lua_Integer); return Kuint;
+ case 'T': *size = sizeof(size_t); return Kuint;
+ case 'f': *size = sizeof(float); return Kfloat;
+ case 'd': *size = sizeof(double); return Kfloat;
+ case 'n': *size = sizeof(lua_Number); return Kfloat;
+ case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint;
+ case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint;
+ case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring;
+ case 'c':
+ *size = getnum(fmt, -1);
+ if (*size == -1)
+ luaL_error(h->L, "missing size for format option 'c'");
+ return Kchar;
+ case 'z': return Kzstr;
+ case 'x': *size = 1; return Kpadding;
+ case 'X': return Kpaddalign;
+ case ' ': break;
+ case '<': h->islittle = 1; break;
+ case '>': h->islittle = 0; break;
+ case '=': h->islittle = nativeendian.little; break;
+ case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break;
+ default: luaL_error(h->L, "invalid format option '%c'", opt);
+ }
+ return Knop;
+}
+
+
+/*
+** Read, classify, and fill other details about the next option.
+** 'psize' is filled with option's size, 'notoalign' with its
+** alignment requirements.
+** Local variable 'size' gets the size to be aligned. (Kpadal option
+** always gets its full alignment, other options are limited by
+** the maximum alignment ('maxalign'). Kchar option needs no alignment
+** despite its size.
+*/
+static KOption getdetails (Header *h, size_t totalsize,
+ const char **fmt, int *psize, int *ntoalign) {
+ KOption opt = getoption(h, fmt, psize);
+ int align = *psize; /* usually, alignment follows size */
+ if (opt == Kpaddalign) { /* 'X' gets alignment from following option */
+ if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0)
+ luaL_argerror(h->L, 1, "invalid next option for option 'X'");
+ }
+ if (align <= 1 || opt == Kchar) /* need no alignment? */
+ *ntoalign = 0;
+ else {
+ if (align > h->maxalign) /* enforce maximum alignment */
+ align = h->maxalign;
+ if ((align & (align - 1)) != 0) /* is 'align' not a power of 2? */
+ luaL_argerror(h->L, 1, "format asks for alignment not power of 2");
+ *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1);
+ }
+ return opt;
+}
+
+
+/*
+** Pack integer 'n' with 'size' bytes and 'islittle' endianness.
+** The final 'if' handles the case when 'size' is larger than
+** the size of a Lua integer, correcting the extra sign-extension
+** bytes if necessary (by default they would be zeros).
+*/
+static void packint (luaL_Buffer *b, lua_Unsigned n,
+ int islittle, int size, int neg) {
+ char *buff = luaL_prepbuffsize(b, size);
+ int i;
+ buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */
+ for (i = 1; i < size; i++) {
+ n >>= NB;
+ buff[islittle ? i : size - 1 - i] = (char)(n & MC);
+ }
+ if (neg && size > SZINT) { /* negative number need sign extension? */
+ for (i = SZINT; i < size; i++) /* correct extra bytes */
+ buff[islittle ? i : size - 1 - i] = (char)MC;
+ }
+ luaL_addsize(b, size); /* add result to buffer */
+}
+
+
+/*
+** Copy 'size' bytes from 'src' to 'dest', correcting endianness if
+** given 'islittle' is different from native endianness.
+*/
+static void copywithendian (volatile char *dest, volatile const char *src,
+ int size, int islittle) {
+ if (islittle == nativeendian.little) {
+ while (size-- != 0)
+ *(dest++) = *(src++);
+ }
+ else {
+ dest += size - 1;
+ while (size-- != 0)
+ *(dest--) = *(src++);
+ }
+}
+
+
+static int str_pack (lua_State *L) {
+ luaL_Buffer b;
+ Header h;
+ const char *fmt = luaL_checkstring(L, 1); /* format string */
+ int arg = 1; /* current argument to pack */
+ size_t totalsize = 0; /* accumulate total size of result */
+ initheader(L, &h);
+ lua_pushnil(L); /* mark to separate arguments from string buffer */
+ luaL_buffinit(L, &b);
+ while (*fmt != '\0') {
+ int size, ntoalign;
+ KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);
+ totalsize += ntoalign + size;
+ while (ntoalign-- > 0)
+ luaL_addchar(&b, LUAL_PACKPADBYTE); /* fill alignment */
+ arg++;
+ switch (opt) {
+ case Kint: { /* signed integers */
+ lua_Integer n = luaL_checkinteger(L, arg);
+ if (size < SZINT) { /* need overflow check? */
+ lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1);
+ luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow");
+ }
+ packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0));
+ break;
+ }
+ case Kuint: { /* unsigned integers */
+ lua_Integer n = luaL_checkinteger(L, arg);
+ if (size < SZINT) /* need overflow check? */
+ luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)),
+ arg, "unsigned overflow");
+ packint(&b, (lua_Unsigned)n, h.islittle, size, 0);
+ break;
+ }
+ case Kfloat: { /* floating-point options */
+ volatile Ftypes u;
+ char *buff = luaL_prepbuffsize(&b, size);
+ lua_Number n = luaL_checknumber(L, arg); /* get argument */
+ if (size == sizeof(u.f)) u.f = (float)n; /* copy it into 'u' */
+ else if (size == sizeof(u.d)) u.d = (double)n;
+ else u.n = n;
+ /* move 'u' to final result, correcting endianness if needed */
+ copywithendian(buff, u.buff, size, h.islittle);
+ luaL_addsize(&b, size);
+ break;
+ }
+ case Kchar: { /* fixed-size string */
+ size_t len;
+ const char *s = luaL_checklstring(L, arg, &len);
+ luaL_argcheck(L, len <= (size_t)size, arg,
+ "string longer than given size");
+ luaL_addlstring(&b, s, len); /* add string */
+ while (len++ < (size_t)size) /* pad extra space */
+ luaL_addchar(&b, LUAL_PACKPADBYTE);
+ break;
+ }
+ case Kstring: { /* strings with length count */
+ size_t len;
+ const char *s = luaL_checklstring(L, arg, &len);
+ luaL_argcheck(L, size >= (int)sizeof(size_t) ||
+ len < ((size_t)1 << (size * NB)),
+ arg, "string length does not fit in given size");
+ packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */
+ luaL_addlstring(&b, s, len);
+ totalsize += len;
+ break;
+ }
+ case Kzstr: { /* zero-terminated string */
+ size_t len;
+ const char *s = luaL_checklstring(L, arg, &len);
+ luaL_argcheck(L, strlen(s) == len, arg, "string contains zeros");
+ luaL_addlstring(&b, s, len);
+ luaL_addchar(&b, '\0'); /* add zero at the end */
+ totalsize += len + 1;
+ break;
+ }
+ case Kpadding: luaL_addchar(&b, LUAL_PACKPADBYTE); /* FALLTHROUGH */
+ case Kpaddalign: case Knop:
+ arg--; /* undo increment */
+ break;
+ }
+ }
+ luaL_pushresult(&b);
+ return 1;
+}
+
+
+static int str_packsize (lua_State *L) {
+ Header h;
+ const char *fmt = luaL_checkstring(L, 1); /* format string */
+ size_t totalsize = 0; /* accumulate total size of result */
+ initheader(L, &h);
+ while (*fmt != '\0') {
+ int size, ntoalign;
+ KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);
+ size += ntoalign; /* total space used by option */
+ luaL_argcheck(L, totalsize <= MAXSIZE - size, 1,
+ "format result too large");
+ totalsize += size;
+ switch (opt) {
+ case Kstring: /* strings with length count */
+ case Kzstr: /* zero-terminated string */
+ luaL_argerror(L, 1, "variable-length format");
+ /* call never return, but to avoid warnings: *//* FALLTHROUGH */
+ default: break;
+ }
+ }
+ lua_pushinteger(L, (lua_Integer)totalsize);
+ return 1;
+}
+
+
+/*
+** Unpack an integer with 'size' bytes and 'islittle' endianness.
+** If size is smaller than the size of a Lua integer and integer
+** is signed, must do sign extension (propagating the sign to the
+** higher bits); if size is larger than the size of a Lua integer,
+** it must check the unread bytes to see whether they do not cause an
+** overflow.
+*/
+static lua_Integer unpackint (lua_State *L, const char *str,
+ int islittle, int size, int issigned) {
+ lua_Unsigned res = 0;
+ int i;
+ int limit = (size <= SZINT) ? size : SZINT;
+ for (i = limit - 1; i >= 0; i--) {
+ res <<= NB;
+ res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i];
+ }
+ if (size < SZINT) { /* real size smaller than lua_Integer? */
+ if (issigned) { /* needs sign extension? */
+ lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1);
+ res = ((res ^ mask) - mask); /* do sign extension */
+ }
+ }
+ else if (size > SZINT) { /* must check unread bytes */
+ int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC;
+ for (i = limit; i < size; i++) {
+ if ((unsigned char)str[islittle ? i : size - 1 - i] != mask)
+ luaL_error(L, "%d-byte integer does not fit into Lua Integer", size);
+ }
+ }
+ return (lua_Integer)res;
+}
+
+
+static int str_unpack (lua_State *L) {
+ Header h;
+ const char *fmt = luaL_checkstring(L, 1);
+ size_t ld;
+ const char *data = luaL_checklstring(L, 2, &ld);
+ size_t pos = (size_t)posrelat(luaL_optinteger(L, 3, 1), ld) - 1;
+ int n = 0; /* number of results */
+ luaL_argcheck(L, pos <= ld, 3, "initial position out of string");
+ initheader(L, &h);
+ while (*fmt != '\0') {
+ int size, ntoalign;
+ KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign);
+ if ((size_t)ntoalign + size > ~pos || pos + ntoalign + size > ld)
+ luaL_argerror(L, 2, "data string too short");
+ pos += ntoalign; /* skip alignment */
+ /* stack space for item + next position */
+ luaL_checkstack(L, 2, "too many results");
+ n++;
+ switch (opt) {
+ case Kint:
+ case Kuint: {
+ lua_Integer res = unpackint(L, data + pos, h.islittle, size,
+ (opt == Kint));
+ lua_pushinteger(L, res);
+ break;
+ }
+ case Kfloat: {
+ volatile Ftypes u;
+ lua_Number num;
+ copywithendian(u.buff, data + pos, size, h.islittle);
+ if (size == sizeof(u.f)) num = (lua_Number)u.f;
+ else if (size == sizeof(u.d)) num = (lua_Number)u.d;
+ else num = u.n;
+ lua_pushnumber(L, num);
+ break;
+ }
+ case Kchar: {
+ lua_pushlstring(L, data + pos, size);
+ break;
+ }
+ case Kstring: {
+ size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0);
+ luaL_argcheck(L, pos + len + size <= ld, 2, "data string too short");
+ lua_pushlstring(L, data + pos + size, len);
+ pos += len; /* skip string */
+ break;
+ }
+ case Kzstr: {
+ size_t len = (int)strlen(data + pos);
+ lua_pushlstring(L, data + pos, len);
+ pos += len + 1; /* skip string plus final '\0' */
+ break;
+ }
+ case Kpaddalign: case Kpadding: case Knop:
+ n--; /* undo increment */
+ break;
+ }
+ pos += size;
+ }
+ lua_pushinteger(L, pos + 1); /* next position */
+ return n + 1;
+}
+
+/* }====================================================== */
+
+
+static const luaL_Reg strlib[] = {
+ {"byte", str_byte},
+ {"char", str_char},
+ {"dump", str_dump},
+ {"find", str_find},
+ {"format", str_format},
+ {"gmatch", gmatch},
+ {"gsub", str_gsub},
+ {"len", str_len},
+ {"lower", str_lower},
+ {"match", str_match},
+ {"rep", str_rep},
+ {"reverse", str_reverse},
+ {"sub", str_sub},
+ {"upper", str_upper},
+ {"pack", str_pack},
+ {"packsize", str_packsize},
+ {"unpack", str_unpack},
+ {NULL, NULL}
+};
+
+
+static void createmetatable (lua_State *L) {
+ lua_createtable(L, 0, 1); /* table to be metatable for strings */
+ lua_pushliteral(L, ""); /* dummy string */
+ lua_pushvalue(L, -2); /* copy table */
+ lua_setmetatable(L, -2); /* set table as metatable for strings */
+ lua_pop(L, 1); /* pop dummy string */
+ lua_pushvalue(L, -2); /* get string library */
+ lua_setfield(L, -2, "__index"); /* metatable.__index = string */
+ lua_pop(L, 1); /* pop metatable */
+}
+
+
+/*
+** Open string library
+*/
+LUAMOD_API int luaopen_string (lua_State *L) {
+ luaL_newlib(L, strlib);
+ createmetatable(L);
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/ltable.c b/libs/lua/lua-5.3.3/ltable.c
new file mode 100644
index 0000000..7e15b71
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltable.c
@@ -0,0 +1,669 @@
+/*
+** $Id: ltable.c,v 2.117 2015/11/19 19:16:22 roberto Exp $
+** Lua tables (hash)
+** See Copyright Notice in lua.h
+*/
+
+#define ltable_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+/*
+** Implementation of tables (aka arrays, objects, or hash tables).
+** Tables keep its elements in two parts: an array part and a hash part.
+** Non-negative integer keys are all candidates to be kept in the array
+** part. The actual size of the array is the largest 'n' such that
+** more than half the slots between 1 and n are in use.
+** Hash uses a mix of chained scatter table with Brent's variation.
+** A main invariant of these tables is that, if an element is not
+** in its main position (i.e. the 'original' position that its hash gives
+** to it), then the colliding element is in its own main position.
+** Hence even when the load factor reaches 100%, performance remains good.
+*/
+
+#include <math.h>
+#include <limits.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "lvm.h"
+
+
+/*
+** Maximum size of array part (MAXASIZE) is 2^MAXABITS. MAXABITS is
+** the largest integer such that MAXASIZE fits in an unsigned int.
+*/
+#define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1)
+#define MAXASIZE (1u << MAXABITS)
+
+/*
+** Maximum size of hash part is 2^MAXHBITS. MAXHBITS is the largest
+** integer such that 2^MAXHBITS fits in a signed int. (Note that the
+** maximum number of elements in a table, 2^MAXABITS + 2^MAXHBITS, still
+** fits comfortably in an unsigned int.)
+*/
+#define MAXHBITS (MAXABITS - 1)
+
+
+#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t))))
+
+#define hashstr(t,str) hashpow2(t, (str)->hash)
+#define hashboolean(t,p) hashpow2(t, p)
+#define hashint(t,i) hashpow2(t, i)
+
+
+/*
+** for some types, it is better to avoid modulus by power of 2, as
+** they tend to have many 2 factors.
+*/
+#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1))))
+
+
+#define hashpointer(t,p) hashmod(t, point2uint(p))
+
+
+#define dummynode (&dummynode_)
+
+#define isdummy(n) ((n) == dummynode)
+
+static const Node dummynode_ = {
+ {NILCONSTANT}, /* value */
+ {{NILCONSTANT, 0}} /* key */
+};
+
+
+/*
+** Hash for floating-point numbers.
+** The main computation should be just
+** n = frexp(n, &i); return (n * INT_MAX) + i
+** but there are some numerical subtleties.
+** In a two-complement representation, INT_MAX does not has an exact
+** representation as a float, but INT_MIN does; because the absolute
+** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the
+** absolute value of the product 'frexp * -INT_MIN' is smaller or equal
+** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when
+** adding 'i'; the use of '~u' (instead of '-u') avoids problems with
+** INT_MIN.
+*/
+#if !defined(l_hashfloat)
+static int l_hashfloat (lua_Number n) {
+ int i;
+ lua_Integer ni;
+ n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN);
+ if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */
+ lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL));
+ return 0;
+ }
+ else { /* normal case */
+ unsigned int u = cast(unsigned int, i) + cast(unsigned int, ni);
+ return cast_int(u <= cast(unsigned int, INT_MAX) ? u : ~u);
+ }
+}
+#endif
+
+
+/*
+** returns the 'main' position of an element in a table (that is, the index
+** of its hash value)
+*/
+static Node *mainposition (const Table *t, const TValue *key) {
+ switch (ttype(key)) {
+ case LUA_TNUMINT:
+ return hashint(t, ivalue(key));
+ case LUA_TNUMFLT:
+ return hashmod(t, l_hashfloat(fltvalue(key)));
+ case LUA_TSHRSTR:
+ return hashstr(t, tsvalue(key));
+ case LUA_TLNGSTR:
+ return hashpow2(t, luaS_hashlongstr(tsvalue(key)));
+ case LUA_TBOOLEAN:
+ return hashboolean(t, bvalue(key));
+ case LUA_TLIGHTUSERDATA:
+ return hashpointer(t, pvalue(key));
+ case LUA_TLCF:
+ return hashpointer(t, fvalue(key));
+ default:
+ lua_assert(!ttisdeadkey(key));
+ return hashpointer(t, gcvalue(key));
+ }
+}
+
+
+/*
+** returns the index for 'key' if 'key' is an appropriate key to live in
+** the array part of the table, 0 otherwise.
+*/
+static unsigned int arrayindex (const TValue *key) {
+ if (ttisinteger(key)) {
+ lua_Integer k = ivalue(key);
+ if (0 < k && (lua_Unsigned)k <= MAXASIZE)
+ return cast(unsigned int, k); /* 'key' is an appropriate array index */
+ }
+ return 0; /* 'key' did not match some condition */
+}
+
+
+/*
+** returns the index of a 'key' for table traversals. First goes all
+** elements in the array part, then elements in the hash part. The
+** beginning of a traversal is signaled by 0.
+*/
+static unsigned int findindex (lua_State *L, Table *t, StkId key) {
+ unsigned int i;
+ if (ttisnil(key)) return 0; /* first iteration */
+ i = arrayindex(key);
+ if (i != 0 && i <= t->sizearray) /* is 'key' inside array part? */
+ return i; /* yes; that's the index */
+ else {
+ int nx;
+ Node *n = mainposition(t, key);
+ for (;;) { /* check whether 'key' is somewhere in the chain */
+ /* key may be dead already, but it is ok to use it in 'next' */
+ if (luaV_rawequalobj(gkey(n), key) ||
+ (ttisdeadkey(gkey(n)) && iscollectable(key) &&
+ deadvalue(gkey(n)) == gcvalue(key))) {
+ i = cast_int(n - gnode(t, 0)); /* key index in hash table */
+ /* hash elements are numbered after array ones */
+ return (i + 1) + t->sizearray;
+ }
+ nx = gnext(n);
+ if (nx == 0)
+ luaG_runerror(L, "invalid key to 'next'"); /* key not found */
+ else n += nx;
+ }
+ }
+}
+
+
+int luaH_next (lua_State *L, Table *t, StkId key) {
+ unsigned int i = findindex(L, t, key); /* find original element */
+ for (; i < t->sizearray; i++) { /* try first array part */
+ if (!ttisnil(&t->array[i])) { /* a non-nil value? */
+ setivalue(key, i + 1);
+ setobj2s(L, key+1, &t->array[i]);
+ return 1;
+ }
+ }
+ for (i -= t->sizearray; cast_int(i) < sizenode(t); i++) { /* hash part */
+ if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */
+ setobj2s(L, key, gkey(gnode(t, i)));
+ setobj2s(L, key+1, gval(gnode(t, i)));
+ return 1;
+ }
+ }
+ return 0; /* no more elements */
+}
+
+
+/*
+** {=============================================================
+** Rehash
+** ==============================================================
+*/
+
+/*
+** Compute the optimal size for the array part of table 't'. 'nums' is a
+** "count array" where 'nums[i]' is the number of integers in the table
+** between 2^(i - 1) + 1 and 2^i. 'pna' enters with the total number of
+** integer keys in the table and leaves with the number of keys that
+** will go to the array part; return the optimal size.
+*/
+static unsigned int computesizes (unsigned int nums[], unsigned int *pna) {
+ int i;
+ unsigned int twotoi; /* 2^i (candidate for optimal size) */
+ unsigned int a = 0; /* number of elements smaller than 2^i */
+ unsigned int na = 0; /* number of elements to go to array part */
+ unsigned int optimal = 0; /* optimal size for array part */
+ /* loop while keys can fill more than half of total size */
+ for (i = 0, twotoi = 1; *pna > twotoi / 2; i++, twotoi *= 2) {
+ if (nums[i] > 0) {
+ a += nums[i];
+ if (a > twotoi/2) { /* more than half elements present? */
+ optimal = twotoi; /* optimal size (till now) */
+ na = a; /* all elements up to 'optimal' will go to array part */
+ }
+ }
+ }
+ lua_assert((optimal == 0 || optimal / 2 < na) && na <= optimal);
+ *pna = na;
+ return optimal;
+}
+
+
+static int countint (const TValue *key, unsigned int *nums) {
+ unsigned int k = arrayindex(key);
+ if (k != 0) { /* is 'key' an appropriate array index? */
+ nums[luaO_ceillog2(k)]++; /* count as such */
+ return 1;
+ }
+ else
+ return 0;
+}
+
+
+/*
+** Count keys in array part of table 't': Fill 'nums[i]' with
+** number of keys that will go into corresponding slice and return
+** total number of non-nil keys.
+*/
+static unsigned int numusearray (const Table *t, unsigned int *nums) {
+ int lg;
+ unsigned int ttlg; /* 2^lg */
+ unsigned int ause = 0; /* summation of 'nums' */
+ unsigned int i = 1; /* count to traverse all array keys */
+ /* traverse each slice */
+ for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) {
+ unsigned int lc = 0; /* counter */
+ unsigned int lim = ttlg;
+ if (lim > t->sizearray) {
+ lim = t->sizearray; /* adjust upper limit */
+ if (i > lim)
+ break; /* no more elements to count */
+ }
+ /* count elements in range (2^(lg - 1), 2^lg] */
+ for (; i <= lim; i++) {
+ if (!ttisnil(&t->array[i-1]))
+ lc++;
+ }
+ nums[lg] += lc;
+ ause += lc;
+ }
+ return ause;
+}
+
+
+static int numusehash (const Table *t, unsigned int *nums, unsigned int *pna) {
+ int totaluse = 0; /* total number of elements */
+ int ause = 0; /* elements added to 'nums' (can go to array part) */
+ int i = sizenode(t);
+ while (i--) {
+ Node *n = &t->node[i];
+ if (!ttisnil(gval(n))) {
+ ause += countint(gkey(n), nums);
+ totaluse++;
+ }
+ }
+ *pna += ause;
+ return totaluse;
+}
+
+
+static void setarrayvector (lua_State *L, Table *t, unsigned int size) {
+ unsigned int i;
+ luaM_reallocvector(L, t->array, t->sizearray, size, TValue);
+ for (i=t->sizearray; i<size; i++)
+ setnilvalue(&t->array[i]);
+ t->sizearray = size;
+}
+
+
+static void setnodevector (lua_State *L, Table *t, unsigned int size) {
+ int lsize;
+ if (size == 0) { /* no elements to hash part? */
+ t->node = cast(Node *, dummynode); /* use common 'dummynode' */
+ lsize = 0;
+ }
+ else {
+ int i;
+ lsize = luaO_ceillog2(size);
+ if (lsize > MAXHBITS)
+ luaG_runerror(L, "table overflow");
+ size = twoto(lsize);
+ t->node = luaM_newvector(L, size, Node);
+ for (i = 0; i < (int)size; i++) {
+ Node *n = gnode(t, i);
+ gnext(n) = 0;
+ setnilvalue(wgkey(n));
+ setnilvalue(gval(n));
+ }
+ }
+ t->lsizenode = cast_byte(lsize);
+ t->lastfree = gnode(t, size); /* all positions are free */
+}
+
+
+void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
+ unsigned int nhsize) {
+ unsigned int i;
+ int j;
+ unsigned int oldasize = t->sizearray;
+ int oldhsize = t->lsizenode;
+ Node *nold = t->node; /* save old hash ... */
+ if (nasize > oldasize) /* array part must grow? */
+ setarrayvector(L, t, nasize);
+ /* create new hash part with appropriate size */
+ setnodevector(L, t, nhsize);
+ if (nasize < oldasize) { /* array part must shrink? */
+ t->sizearray = nasize;
+ /* re-insert elements from vanishing slice */
+ for (i=nasize; i<oldasize; i++) {
+ if (!ttisnil(&t->array[i]))
+ luaH_setint(L, t, i + 1, &t->array[i]);
+ }
+ /* shrink array */
+ luaM_reallocvector(L, t->array, oldasize, nasize, TValue);
+ }
+ /* re-insert elements from hash part */
+ for (j = twoto(oldhsize) - 1; j >= 0; j--) {
+ Node *old = nold + j;
+ if (!ttisnil(gval(old))) {
+ /* doesn't need barrier/invalidate cache, as entry was
+ already present in the table */
+ setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old));
+ }
+ }
+ if (!isdummy(nold))
+ luaM_freearray(L, nold, cast(size_t, twoto(oldhsize))); /* free old hash */
+}
+
+
+void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) {
+ int nsize = isdummy(t->node) ? 0 : sizenode(t);
+ luaH_resize(L, t, nasize, nsize);
+}
+
+/*
+** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i
+*/
+static void rehash (lua_State *L, Table *t, const TValue *ek) {
+ unsigned int asize; /* optimal size for array part */
+ unsigned int na; /* number of keys in the array part */
+ unsigned int nums[MAXABITS + 1];
+ int i;
+ int totaluse;
+ for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */
+ na = numusearray(t, nums); /* count keys in array part */
+ totaluse = na; /* all those keys are integer keys */
+ totaluse += numusehash(t, nums, &na); /* count keys in hash part */
+ /* count extra key */
+ na += countint(ek, nums);
+ totaluse++;
+ /* compute new size for array part */
+ asize = computesizes(nums, &na);
+ /* resize the table to new computed sizes */
+ luaH_resize(L, t, asize, totaluse - na);
+}
+
+
+
+/*
+** }=============================================================
+*/
+
+
+Table *luaH_new (lua_State *L) {
+ GCObject *o = luaC_newobj(L, LUA_TTABLE, sizeof(Table));
+ Table *t = gco2t(o);
+ t->metatable = NULL;
+ t->flags = cast_byte(~0);
+ t->array = NULL;
+ t->sizearray = 0;
+ setnodevector(L, t, 0);
+ return t;
+}
+
+
+void luaH_free (lua_State *L, Table *t) {
+ if (!isdummy(t->node))
+ luaM_freearray(L, t->node, cast(size_t, sizenode(t)));
+ luaM_freearray(L, t->array, t->sizearray);
+ luaM_free(L, t);
+}
+
+
+static Node *getfreepos (Table *t) {
+ while (t->lastfree > t->node) {
+ t->lastfree--;
+ if (ttisnil(gkey(t->lastfree)))
+ return t->lastfree;
+ }
+ return NULL; /* could not find a free place */
+}
+
+
+
+/*
+** inserts a new key into a hash table; first, check whether key's main
+** position is free. If not, check whether colliding node is in its main
+** position or not: if it is not, move colliding node to an empty place and
+** put new key in its main position; otherwise (colliding node is in its main
+** position), new key goes to an empty position.
+*/
+TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
+ Node *mp;
+ TValue aux;
+ if (ttisnil(key)) luaG_runerror(L, "table index is nil");
+ else if (ttisfloat(key)) {
+ lua_Integer k;
+ if (luaV_tointeger(key, &k, 0)) { /* index is int? */
+ setivalue(&aux, k);
+ key = &aux; /* insert it as an integer */
+ }
+ else if (luai_numisnan(fltvalue(key)))
+ luaG_runerror(L, "table index is NaN");
+ }
+ mp = mainposition(t, key);
+ if (!ttisnil(gval(mp)) || isdummy(mp)) { /* main position is taken? */
+ Node *othern;
+ Node *f = getfreepos(t); /* get a free place */
+ if (f == NULL) { /* cannot find a free place? */
+ rehash(L, t, key); /* grow table */
+ /* whatever called 'newkey' takes care of TM cache */
+ return luaH_set(L, t, key); /* insert key into grown table */
+ }
+ lua_assert(!isdummy(f));
+ othern = mainposition(t, gkey(mp));
+ if (othern != mp) { /* is colliding node out of its main position? */
+ /* yes; move colliding node into free position */
+ while (othern + gnext(othern) != mp) /* find previous */
+ othern += gnext(othern);
+ gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */
+ *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */
+ if (gnext(mp) != 0) {
+ gnext(f) += cast_int(mp - f); /* correct 'next' */
+ gnext(mp) = 0; /* now 'mp' is free */
+ }
+ setnilvalue(gval(mp));
+ }
+ else { /* colliding node is in its own main position */
+ /* new node will go into free position */
+ if (gnext(mp) != 0)
+ gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */
+ else lua_assert(gnext(f) == 0);
+ gnext(mp) = cast_int(f - mp);
+ mp = f;
+ }
+ }
+ setnodekey(L, &mp->i_key, key);
+ luaC_barrierback(L, t, key);
+ lua_assert(ttisnil(gval(mp)));
+ return gval(mp);
+}
+
+
+/*
+** search function for integers
+*/
+const TValue *luaH_getint (Table *t, lua_Integer key) {
+ /* (1 <= key && key <= t->sizearray) */
+ if (l_castS2U(key) - 1 < t->sizearray)
+ return &t->array[key - 1];
+ else {
+ Node *n = hashint(t, key);
+ for (;;) { /* check whether 'key' is somewhere in the chain */
+ if (ttisinteger(gkey(n)) && ivalue(gkey(n)) == key)
+ return gval(n); /* that's it */
+ else {
+ int nx = gnext(n);
+ if (nx == 0) break;
+ n += nx;
+ }
+ }
+ return luaO_nilobject;
+ }
+}
+
+
+/*
+** search function for short strings
+*/
+const TValue *luaH_getshortstr (Table *t, TString *key) {
+ Node *n = hashstr(t, key);
+ lua_assert(key->tt == LUA_TSHRSTR);
+ for (;;) { /* check whether 'key' is somewhere in the chain */
+ const TValue *k = gkey(n);
+ if (ttisshrstring(k) && eqshrstr(tsvalue(k), key))
+ return gval(n); /* that's it */
+ else {
+ int nx = gnext(n);
+ if (nx == 0)
+ return luaO_nilobject; /* not found */
+ n += nx;
+ }
+ }
+}
+
+
+/*
+** "Generic" get version. (Not that generic: not valid for integers,
+** which may be in array part, nor for floats with integral values.)
+*/
+static const TValue *getgeneric (Table *t, const TValue *key) {
+ Node *n = mainposition(t, key);
+ for (;;) { /* check whether 'key' is somewhere in the chain */
+ if (luaV_rawequalobj(gkey(n), key))
+ return gval(n); /* that's it */
+ else {
+ int nx = gnext(n);
+ if (nx == 0)
+ return luaO_nilobject; /* not found */
+ n += nx;
+ }
+ }
+}
+
+
+const TValue *luaH_getstr (Table *t, TString *key) {
+ if (key->tt == LUA_TSHRSTR)
+ return luaH_getshortstr(t, key);
+ else { /* for long strings, use generic case */
+ TValue ko;
+ setsvalue(cast(lua_State *, NULL), &ko, key);
+ return getgeneric(t, &ko);
+ }
+}
+
+
+/*
+** main search function
+*/
+const TValue *luaH_get (Table *t, const TValue *key) {
+ switch (ttype(key)) {
+ case LUA_TSHRSTR: return luaH_getshortstr(t, tsvalue(key));
+ case LUA_TNUMINT: return luaH_getint(t, ivalue(key));
+ case LUA_TNIL: return luaO_nilobject;
+ case LUA_TNUMFLT: {
+ lua_Integer k;
+ if (luaV_tointeger(key, &k, 0)) /* index is int? */
+ return luaH_getint(t, k); /* use specialized version */
+ /* else... */
+ } /* FALLTHROUGH */
+ default:
+ return getgeneric(t, key);
+ }
+}
+
+
+/*
+** beware: when using this function you probably need to check a GC
+** barrier and invalidate the TM cache.
+*/
+TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
+ const TValue *p = luaH_get(t, key);
+ if (p != luaO_nilobject)
+ return cast(TValue *, p);
+ else return luaH_newkey(L, t, key);
+}
+
+
+void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) {
+ const TValue *p = luaH_getint(t, key);
+ TValue *cell;
+ if (p != luaO_nilobject)
+ cell = cast(TValue *, p);
+ else {
+ TValue k;
+ setivalue(&k, key);
+ cell = luaH_newkey(L, t, &k);
+ }
+ setobj2t(L, cell, value);
+}
+
+
+static int unbound_search (Table *t, unsigned int j) {
+ unsigned int i = j; /* i is zero or a present index */
+ j++;
+ /* find 'i' and 'j' such that i is present and j is not */
+ while (!ttisnil(luaH_getint(t, j))) {
+ i = j;
+ if (j > cast(unsigned int, MAX_INT)/2) { /* overflow? */
+ /* table was built with bad purposes: resort to linear search */
+ i = 1;
+ while (!ttisnil(luaH_getint(t, i))) i++;
+ return i - 1;
+ }
+ j *= 2;
+ }
+ /* now do a binary search between them */
+ while (j - i > 1) {
+ unsigned int m = (i+j)/2;
+ if (ttisnil(luaH_getint(t, m))) j = m;
+ else i = m;
+ }
+ return i;
+}
+
+
+/*
+** Try to find a boundary in table 't'. A 'boundary' is an integer index
+** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).
+*/
+int luaH_getn (Table *t) {
+ unsigned int j = t->sizearray;
+ if (j > 0 && ttisnil(&t->array[j - 1])) {
+ /* there is a boundary in the array part: (binary) search for it */
+ unsigned int i = 0;
+ while (j - i > 1) {
+ unsigned int m = (i+j)/2;
+ if (ttisnil(&t->array[m - 1])) j = m;
+ else i = m;
+ }
+ return i;
+ }
+ /* else must find a boundary in hash part */
+ else if (isdummy(t->node)) /* hash part is empty? */
+ return j; /* that is easy... */
+ else return unbound_search(t, j);
+}
+
+
+
+#if defined(LUA_DEBUG)
+
+Node *luaH_mainposition (const Table *t, const TValue *key) {
+ return mainposition(t, key);
+}
+
+int luaH_isdummy (Node *n) { return isdummy(n); }
+
+#endif
diff --git a/libs/lua/lua-5.3.3/ltable.h b/libs/lua/lua-5.3.3/ltable.h
new file mode 100644
index 0000000..213cc13
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltable.h
@@ -0,0 +1,58 @@
+/*
+** $Id: ltable.h,v 2.21 2015/11/03 15:47:30 roberto Exp $
+** Lua tables (hash)
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ltable_h
+#define ltable_h
+
+#include "lobject.h"
+
+
+#define gnode(t,i) (&(t)->node[i])
+#define gval(n) (&(n)->i_val)
+#define gnext(n) ((n)->i_key.nk.next)
+
+
+/* 'const' to avoid wrong writings that can mess up field 'next' */
+#define gkey(n) cast(const TValue*, (&(n)->i_key.tvk))
+
+/*
+** writable version of 'gkey'; allows updates to individual fields,
+** but not to the whole (which has incompatible type)
+*/
+#define wgkey(n) (&(n)->i_key.nk)
+
+#define invalidateTMcache(t) ((t)->flags = 0)
+
+
+/* returns the key, given the value of a table entry */
+#define keyfromval(v) \
+ (gkey(cast(Node *, cast(char *, (v)) - offsetof(Node, i_val))))
+
+
+LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key);
+LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key,
+ TValue *value);
+LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key);
+LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
+LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
+LUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key);
+LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
+LUAI_FUNC Table *luaH_new (lua_State *L);
+LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
+ unsigned int nhsize);
+LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize);
+LUAI_FUNC void luaH_free (lua_State *L, Table *t);
+LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
+LUAI_FUNC int luaH_getn (Table *t);
+
+
+#if defined(LUA_DEBUG)
+LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
+LUAI_FUNC int luaH_isdummy (Node *n);
+#endif
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/ltablib.c b/libs/lua/lua-5.3.3/ltablib.c
new file mode 100644
index 0000000..98b2f87
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltablib.c
@@ -0,0 +1,450 @@
+/*
+** $Id: ltablib.c,v 1.93 2016/02/25 19:41:54 roberto Exp $
+** Library for Table Manipulation
+** See Copyright Notice in lua.h
+*/
+
+#define ltablib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <limits.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** Operations that an object must define to mimic a table
+** (some functions only need some of them)
+*/
+#define TAB_R 1 /* read */
+#define TAB_W 2 /* write */
+#define TAB_L 4 /* length */
+#define TAB_RW (TAB_R | TAB_W) /* read/write */
+
+
+#define aux_getn(L,n,w) (checktab(L, n, (w) | TAB_L), luaL_len(L, n))
+
+
+static int checkfield (lua_State *L, const char *key, int n) {
+ lua_pushstring(L, key);
+ return (lua_rawget(L, -n) != LUA_TNIL);
+}
+
+
+/*
+** Check that 'arg' either is a table or can behave like one (that is,
+** has a metatable with the required metamethods)
+*/
+static void checktab (lua_State *L, int arg, int what) {
+ if (lua_type(L, arg) != LUA_TTABLE) { /* is it not a table? */
+ int n = 1; /* number of elements to pop */
+ if (lua_getmetatable(L, arg) && /* must have metatable */
+ (!(what & TAB_R) || checkfield(L, "__index", ++n)) &&
+ (!(what & TAB_W) || checkfield(L, "__newindex", ++n)) &&
+ (!(what & TAB_L) || checkfield(L, "__len", ++n))) {
+ lua_pop(L, n); /* pop metatable and tested metamethods */
+ }
+ else
+ luaL_checktype(L, arg, LUA_TTABLE); /* force an error */
+ }
+}
+
+
+#if defined(LUA_COMPAT_MAXN)
+static int maxn (lua_State *L) {
+ lua_Number max = 0;
+ luaL_checktype(L, 1, LUA_TTABLE);
+ lua_pushnil(L); /* first key */
+ while (lua_next(L, 1)) {
+ lua_pop(L, 1); /* remove value */
+ if (lua_type(L, -1) == LUA_TNUMBER) {
+ lua_Number v = lua_tonumber(L, -1);
+ if (v > max) max = v;
+ }
+ }
+ lua_pushnumber(L, max);
+ return 1;
+}
+#endif
+
+
+static int tinsert (lua_State *L) {
+ lua_Integer e = aux_getn(L, 1, TAB_RW) + 1; /* first empty element */
+ lua_Integer pos; /* where to insert new element */
+ switch (lua_gettop(L)) {
+ case 2: { /* called with only 2 arguments */
+ pos = e; /* insert new element at the end */
+ break;
+ }
+ case 3: {
+ lua_Integer i;
+ pos = luaL_checkinteger(L, 2); /* 2nd argument is the position */
+ luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds");
+ for (i = e; i > pos; i--) { /* move up elements */
+ lua_geti(L, 1, i - 1);
+ lua_seti(L, 1, i); /* t[i] = t[i - 1] */
+ }
+ break;
+ }
+ default: {
+ return luaL_error(L, "wrong number of arguments to 'insert'");
+ }
+ }
+ lua_seti(L, 1, pos); /* t[pos] = v */
+ return 0;
+}
+
+
+static int tremove (lua_State *L) {
+ lua_Integer size = aux_getn(L, 1, TAB_RW);
+ lua_Integer pos = luaL_optinteger(L, 2, size);
+ if (pos != size) /* validate 'pos' if given */
+ luaL_argcheck(L, 1 <= pos && pos <= size + 1, 1, "position out of bounds");
+ lua_geti(L, 1, pos); /* result = t[pos] */
+ for ( ; pos < size; pos++) {
+ lua_geti(L, 1, pos + 1);
+ lua_seti(L, 1, pos); /* t[pos] = t[pos + 1] */
+ }
+ lua_pushnil(L);
+ lua_seti(L, 1, pos); /* t[pos] = nil */
+ return 1;
+}
+
+
+/*
+** Copy elements (1[f], ..., 1[e]) into (tt[t], tt[t+1], ...). Whenever
+** possible, copy in increasing order, which is better for rehashing.
+** "possible" means destination after original range, or smaller
+** than origin, or copying to another table.
+*/
+static int tmove (lua_State *L) {
+ lua_Integer f = luaL_checkinteger(L, 2);
+ lua_Integer e = luaL_checkinteger(L, 3);
+ lua_Integer t = luaL_checkinteger(L, 4);
+ int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */
+ checktab(L, 1, TAB_R);
+ checktab(L, tt, TAB_W);
+ if (e >= f) { /* otherwise, nothing to move */
+ lua_Integer n, i;
+ luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3,
+ "too many elements to move");
+ n = e - f + 1; /* number of elements to move */
+ luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4,
+ "destination wrap around");
+ if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) {
+ for (i = 0; i < n; i++) {
+ lua_geti(L, 1, f + i);
+ lua_seti(L, tt, t + i);
+ }
+ }
+ else {
+ for (i = n - 1; i >= 0; i--) {
+ lua_geti(L, 1, f + i);
+ lua_seti(L, tt, t + i);
+ }
+ }
+ }
+ lua_pushvalue(L, tt); /* return destination table */
+ return 1;
+}
+
+
+static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) {
+ lua_geti(L, 1, i);
+ if (!lua_isstring(L, -1))
+ luaL_error(L, "invalid value (%s) at index %d in table for 'concat'",
+ luaL_typename(L, -1), i);
+ luaL_addvalue(b);
+}
+
+
+static int tconcat (lua_State *L) {
+ luaL_Buffer b;
+ lua_Integer last = aux_getn(L, 1, TAB_R);
+ size_t lsep;
+ const char *sep = luaL_optlstring(L, 2, "", &lsep);
+ lua_Integer i = luaL_optinteger(L, 3, 1);
+ last = luaL_optinteger(L, 4, last);
+ luaL_buffinit(L, &b);
+ for (; i < last; i++) {
+ addfield(L, &b, i);
+ luaL_addlstring(&b, sep, lsep);
+ }
+ if (i == last) /* add last value (if interval was not empty) */
+ addfield(L, &b, i);
+ luaL_pushresult(&b);
+ return 1;
+}
+
+
+/*
+** {======================================================
+** Pack/unpack
+** =======================================================
+*/
+
+static int pack (lua_State *L) {
+ int i;
+ int n = lua_gettop(L); /* number of elements to pack */
+ lua_createtable(L, n, 1); /* create result table */
+ lua_insert(L, 1); /* put it at index 1 */
+ for (i = n; i >= 1; i--) /* assign elements */
+ lua_seti(L, 1, i);
+ lua_pushinteger(L, n);
+ lua_setfield(L, 1, "n"); /* t.n = number of elements */
+ return 1; /* return table */
+}
+
+
+static int unpack (lua_State *L) {
+ lua_Unsigned n;
+ lua_Integer i = luaL_optinteger(L, 2, 1);
+ lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1));
+ if (i > e) return 0; /* empty range */
+ n = (lua_Unsigned)e - i; /* number of elements minus 1 (avoid overflows) */
+ if (n >= (unsigned int)INT_MAX || !lua_checkstack(L, (int)(++n)))
+ return luaL_error(L, "too many results to unpack");
+ for (; i < e; i++) { /* push arg[i..e - 1] (to avoid overflows) */
+ lua_geti(L, 1, i);
+ }
+ lua_geti(L, 1, e); /* push last element */
+ return (int)n;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** Quicksort
+** (based on 'Algorithms in MODULA-3', Robert Sedgewick;
+** Addison-Wesley, 1993.)
+** =======================================================
+*/
+
+
+/* type for array indices */
+typedef unsigned int IdxT;
+
+
+/*
+** Produce a "random" 'unsigned int' to randomize pivot choice. This
+** macro is used only when 'sort' detects a big imbalance in the result
+** of a partition. (If you don't want/need this "randomness", ~0 is a
+** good choice.)
+*/
+#if !defined(l_randomizePivot) /* { */
+
+#include <time.h>
+
+/* size of 'e' measured in number of 'unsigned int's */
+#define sof(e) (sizeof(e) / sizeof(unsigned int))
+
+/*
+** Use 'time' and 'clock' as sources of "randomness". Because we don't
+** know the types 'clock_t' and 'time_t', we cannot cast them to
+** anything without risking overflows. A safe way to use their values
+** is to copy them to an array of a known type and use the array values.
+*/
+static unsigned int l_randomizePivot (void) {
+ clock_t c = clock();
+ time_t t = time(NULL);
+ unsigned int buff[sof(c) + sof(t)];
+ unsigned int i, rnd = 0;
+ memcpy(buff, &c, sof(c) * sizeof(unsigned int));
+ memcpy(buff + sof(c), &t, sof(t) * sizeof(unsigned int));
+ for (i = 0; i < sof(buff); i++)
+ rnd += buff[i];
+ return rnd;
+}
+
+#endif /* } */
+
+
+/* arrays larger than 'RANLIMIT' may use randomized pivots */
+#define RANLIMIT 100u
+
+
+static void set2 (lua_State *L, IdxT i, IdxT j) {
+ lua_seti(L, 1, i);
+ lua_seti(L, 1, j);
+}
+
+
+/*
+** Return true iff value at stack index 'a' is less than the value at
+** index 'b' (according to the order of the sort).
+*/
+static int sort_comp (lua_State *L, int a, int b) {
+ if (lua_isnil(L, 2)) /* no function? */
+ return lua_compare(L, a, b, LUA_OPLT); /* a < b */
+ else { /* function */
+ int res;
+ lua_pushvalue(L, 2); /* push function */
+ lua_pushvalue(L, a-1); /* -1 to compensate function */
+ lua_pushvalue(L, b-2); /* -2 to compensate function and 'a' */
+ lua_call(L, 2, 1); /* call function */
+ res = lua_toboolean(L, -1); /* get result */
+ lua_pop(L, 1); /* pop result */
+ return res;
+ }
+}
+
+
+/*
+** Does the partition: Pivot P is at the top of the stack.
+** precondition: a[lo] <= P == a[up-1] <= a[up],
+** so it only needs to do the partition from lo + 1 to up - 2.
+** Pos-condition: a[lo .. i - 1] <= a[i] == P <= a[i + 1 .. up]
+** returns 'i'.
+*/
+static IdxT partition (lua_State *L, IdxT lo, IdxT up) {
+ IdxT i = lo; /* will be incremented before first use */
+ IdxT j = up - 1; /* will be decremented before first use */
+ /* loop invariant: a[lo .. i] <= P <= a[j .. up] */
+ for (;;) {
+ /* next loop: repeat ++i while a[i] < P */
+ while (lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) {
+ if (i == up - 1) /* a[i] < P but a[up - 1] == P ?? */
+ luaL_error(L, "invalid order function for sorting");
+ lua_pop(L, 1); /* remove a[i] */
+ }
+ /* after the loop, a[i] >= P and a[lo .. i - 1] < P */
+ /* next loop: repeat --j while P < a[j] */
+ while (lua_geti(L, 1, --j), sort_comp(L, -3, -1)) {
+ if (j < i) /* j < i but a[j] > P ?? */
+ luaL_error(L, "invalid order function for sorting");
+ lua_pop(L, 1); /* remove a[j] */
+ }
+ /* after the loop, a[j] <= P and a[j + 1 .. up] >= P */
+ if (j < i) { /* no elements out of place? */
+ /* a[lo .. i - 1] <= P <= a[j + 1 .. i .. up] */
+ lua_pop(L, 1); /* pop a[j] */
+ /* swap pivot (a[up - 1]) with a[i] to satisfy pos-condition */
+ set2(L, up - 1, i);
+ return i;
+ }
+ /* otherwise, swap a[i] - a[j] to restore invariant and repeat */
+ set2(L, i, j);
+ }
+}
+
+
+/*
+** Choose an element in the middle (2nd-3th quarters) of [lo,up]
+** "randomized" by 'rnd'
+*/
+static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) {
+ IdxT r4 = (up - lo) / 4; /* range/4 */
+ IdxT p = rnd % (r4 * 2) + (lo + r4);
+ lua_assert(lo + r4 <= p && p <= up - r4);
+ return p;
+}
+
+
+/*
+** QuickSort algorithm (recursive function)
+*/
+static void auxsort (lua_State *L, IdxT lo, IdxT up,
+ unsigned int rnd) {
+ while (lo < up) { /* loop for tail recursion */
+ IdxT p; /* Pivot index */
+ IdxT n; /* to be used later */
+ /* sort elements 'lo', 'p', and 'up' */
+ lua_geti(L, 1, lo);
+ lua_geti(L, 1, up);
+ if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */
+ set2(L, lo, up); /* swap a[lo] - a[up] */
+ else
+ lua_pop(L, 2); /* remove both values */
+ if (up - lo == 1) /* only 2 elements? */
+ return; /* already sorted */
+ if (up - lo < RANLIMIT || rnd == 0) /* small interval or no randomize? */
+ p = (lo + up)/2; /* middle element is a good pivot */
+ else /* for larger intervals, it is worth a random pivot */
+ p = choosePivot(lo, up, rnd);
+ lua_geti(L, 1, p);
+ lua_geti(L, 1, lo);
+ if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */
+ set2(L, p, lo); /* swap a[p] - a[lo] */
+ else {
+ lua_pop(L, 1); /* remove a[lo] */
+ lua_geti(L, 1, up);
+ if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */
+ set2(L, p, up); /* swap a[up] - a[p] */
+ else
+ lua_pop(L, 2);
+ }
+ if (up - lo == 2) /* only 3 elements? */
+ return; /* already sorted */
+ lua_geti(L, 1, p); /* get middle element (Pivot) */
+ lua_pushvalue(L, -1); /* push Pivot */
+ lua_geti(L, 1, up - 1); /* push a[up - 1] */
+ set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */
+ p = partition(L, lo, up);
+ /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */
+ if (p - lo < up - p) { /* lower interval is smaller? */
+ auxsort(L, lo, p - 1, rnd); /* call recursively for lower interval */
+ n = p - lo; /* size of smaller interval */
+ lo = p + 1; /* tail call for [p + 1 .. up] (upper interval) */
+ }
+ else {
+ auxsort(L, p + 1, up, rnd); /* call recursively for upper interval */
+ n = up - p; /* size of smaller interval */
+ up = p - 1; /* tail call for [lo .. p - 1] (lower interval) */
+ }
+ if ((up - lo) / 128 > n) /* partition too imbalanced? */
+ rnd = l_randomizePivot(); /* try a new randomization */
+ } /* tail call auxsort(L, lo, up, rnd) */
+}
+
+
+static int sort (lua_State *L) {
+ lua_Integer n = aux_getn(L, 1, TAB_RW);
+ if (n > 1) { /* non-trivial interval? */
+ luaL_argcheck(L, n < INT_MAX, 1, "array too big");
+ if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */
+ luaL_checktype(L, 2, LUA_TFUNCTION); /* must be a function */
+ lua_settop(L, 2); /* make sure there are two arguments */
+ auxsort(L, 1, (IdxT)n, 0);
+ }
+ return 0;
+}
+
+/* }====================================================== */
+
+
+static const luaL_Reg tab_funcs[] = {
+ {"concat", tconcat},
+#if defined(LUA_COMPAT_MAXN)
+ {"maxn", maxn},
+#endif
+ {"insert", tinsert},
+ {"pack", pack},
+ {"unpack", unpack},
+ {"remove", tremove},
+ {"move", tmove},
+ {"sort", sort},
+ {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_table (lua_State *L) {
+ luaL_newlib(L, tab_funcs);
+#if defined(LUA_COMPAT_UNPACK)
+ /* _G.unpack = table.unpack */
+ lua_getfield(L, -1, "unpack");
+ lua_setglobal(L, "unpack");
+#endif
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/ltm.c b/libs/lua/lua-5.3.3/ltm.c
new file mode 100644
index 0000000..4650cc2
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltm.c
@@ -0,0 +1,165 @@
+/*
+** $Id: ltm.c,v 2.37 2016/02/26 19:20:15 roberto Exp $
+** Tag methods
+** See Copyright Notice in lua.h
+*/
+
+#define ltm_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lvm.h"
+
+
+static const char udatatypename[] = "userdata";
+
+LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = {
+ "no value",
+ "nil", "boolean", udatatypename, "number",
+ "string", "table", "function", udatatypename, "thread",
+ "proto" /* this last case is used for tests only */
+};
+
+
+void luaT_init (lua_State *L) {
+ static const char *const luaT_eventname[] = { /* ORDER TM */
+ "__index", "__newindex",
+ "__gc", "__mode", "__len", "__eq",
+ "__add", "__sub", "__mul", "__mod", "__pow",
+ "__div", "__idiv",
+ "__band", "__bor", "__bxor", "__shl", "__shr",
+ "__unm", "__bnot", "__lt", "__le",
+ "__concat", "__call"
+ };
+ int i;
+ for (i=0; i<TM_N; i++) {
+ G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
+ luaC_fix(L, obj2gco(G(L)->tmname[i])); /* never collect these names */
+ }
+}
+
+
+/*
+** function to be used with macro "fasttm": optimized for absence of
+** tag methods
+*/
+const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
+ const TValue *tm = luaH_getshortstr(events, ename);
+ lua_assert(event <= TM_EQ);
+ if (ttisnil(tm)) { /* no tag method? */
+ events->flags |= cast_byte(1u<<event); /* cache this fact */
+ return NULL;
+ }
+ else return tm;
+}
+
+
+const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
+ Table *mt;
+ switch (ttnov(o)) {
+ case LUA_TTABLE:
+ mt = hvalue(o)->metatable;
+ break;
+ case LUA_TUSERDATA:
+ mt = uvalue(o)->metatable;
+ break;
+ default:
+ mt = G(L)->mt[ttnov(o)];
+ }
+ return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : luaO_nilobject);
+}
+
+
+/*
+** Return the name of the type of an object. For tables and userdata
+** with metatable, use their '__name' metafield, if present.
+*/
+const char *luaT_objtypename (lua_State *L, const TValue *o) {
+ Table *mt;
+ if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) ||
+ (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) {
+ const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name"));
+ if (ttisstring(name)) /* is '__name' a string? */
+ return getstr(tsvalue(name)); /* use it as type name */
+ }
+ return ttypename(ttnov(o)); /* else use standard type name */
+}
+
+
+void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
+ const TValue *p2, TValue *p3, int hasres) {
+ ptrdiff_t result = savestack(L, p3);
+ StkId func = L->top;
+ setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */
+ setobj2s(L, func + 1, p1); /* 1st argument */
+ setobj2s(L, func + 2, p2); /* 2nd argument */
+ L->top += 3;
+ if (!hasres) /* no result? 'p3' is third argument */
+ setobj2s(L, L->top++, p3); /* 3rd argument */
+ /* metamethod may yield only when called from Lua code */
+ if (isLua(L->ci))
+ luaD_call(L, func, hasres);
+ else
+ luaD_callnoyield(L, func, hasres);
+ if (hasres) { /* if has result, move it to its place */
+ p3 = restorestack(L, result);
+ setobjs2s(L, p3, --L->top);
+ }
+}
+
+
+int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2,
+ StkId res, TMS event) {
+ const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */
+ if (ttisnil(tm))
+ tm = luaT_gettmbyobj(L, p2, event); /* try second operand */
+ if (ttisnil(tm)) return 0;
+ luaT_callTM(L, tm, p1, p2, res, 1);
+ return 1;
+}
+
+
+void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
+ StkId res, TMS event) {
+ if (!luaT_callbinTM(L, p1, p2, res, event)) {
+ switch (event) {
+ case TM_CONCAT:
+ luaG_concaterror(L, p1, p2);
+ /* call never returns, but to avoid warnings: *//* FALLTHROUGH */
+ case TM_BAND: case TM_BOR: case TM_BXOR:
+ case TM_SHL: case TM_SHR: case TM_BNOT: {
+ lua_Number dummy;
+ if (tonumber(p1, &dummy) && tonumber(p2, &dummy))
+ luaG_tointerror(L, p1, p2);
+ else
+ luaG_opinterror(L, p1, p2, "perform bitwise operation on");
+ }
+ /* calls never return, but to avoid warnings: *//* FALLTHROUGH */
+ default:
+ luaG_opinterror(L, p1, p2, "perform arithmetic on");
+ }
+ }
+}
+
+
+int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2,
+ TMS event) {
+ if (!luaT_callbinTM(L, p1, p2, L->top, event))
+ return -1; /* no metamethod */
+ else
+ return !l_isfalse(L->top);
+}
+
diff --git a/libs/lua/lua-5.3.3/ltm.h b/libs/lua/lua-5.3.3/ltm.h
new file mode 100644
index 0000000..63db726
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltm.h
@@ -0,0 +1,76 @@
+/*
+** $Id: ltm.h,v 2.22 2016/02/26 19:20:15 roberto Exp $
+** Tag methods
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ltm_h
+#define ltm_h
+
+
+#include "lobject.h"
+
+
+/*
+* WARNING: if you change the order of this enumeration,
+* grep "ORDER TM" and "ORDER OP"
+*/
+typedef enum {
+ TM_INDEX,
+ TM_NEWINDEX,
+ TM_GC,
+ TM_MODE,
+ TM_LEN,
+ TM_EQ, /* last tag method with fast access */
+ TM_ADD,
+ TM_SUB,
+ TM_MUL,
+ TM_MOD,
+ TM_POW,
+ TM_DIV,
+ TM_IDIV,
+ TM_BAND,
+ TM_BOR,
+ TM_BXOR,
+ TM_SHL,
+ TM_SHR,
+ TM_UNM,
+ TM_BNOT,
+ TM_LT,
+ TM_LE,
+ TM_CONCAT,
+ TM_CALL,
+ TM_N /* number of elements in the enum */
+} TMS;
+
+
+
+#define gfasttm(g,et,e) ((et) == NULL ? NULL : \
+ ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
+
+#define fasttm(l,et,e) gfasttm(G(l), et, e)
+
+#define ttypename(x) luaT_typenames_[(x) + 1]
+
+LUAI_DDEC const char *const luaT_typenames_[LUA_TOTALTAGS];
+
+
+LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o);
+
+LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
+LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
+ TMS event);
+LUAI_FUNC void luaT_init (lua_State *L);
+
+LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
+ const TValue *p2, TValue *p3, int hasres);
+LUAI_FUNC int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2,
+ StkId res, TMS event);
+LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
+ StkId res, TMS event);
+LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1,
+ const TValue *p2, TMS event);
+
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lua.c b/libs/lua/lua-5.3.3/lua.c
new file mode 100644
index 0000000..545d23d
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lua.c
@@ -0,0 +1,609 @@
+/*
+** $Id: lua.c,v 1.226 2015/08/14 19:11:20 roberto Exp $
+** Lua stand-alone interpreter
+** See Copyright Notice in lua.h
+*/
+
+#define lua_c
+
+#include "lprefix.h"
+
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+#if !defined(LUA_PROMPT)
+#define LUA_PROMPT "> "
+#define LUA_PROMPT2 ">> "
+#endif
+
+#if !defined(LUA_PROGNAME)
+#define LUA_PROGNAME "lua"
+#endif
+
+#if !defined(LUA_MAXINPUT)
+#define LUA_MAXINPUT 512
+#endif
+
+#if !defined(LUA_INIT_VAR)
+#define LUA_INIT_VAR "LUA_INIT"
+#endif
+
+#define LUA_INITVARVERSION \
+ LUA_INIT_VAR "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
+
+
+/*
+** lua_stdin_is_tty detects whether the standard input is a 'tty' (that
+** is, whether we're running lua interactively).
+*/
+#if !defined(lua_stdin_is_tty) /* { */
+
+#if defined(LUA_USE_POSIX) /* { */
+
+#include <unistd.h>
+#define lua_stdin_is_tty() isatty(0)
+
+#elif defined(LUA_USE_WINDOWS) /* }{ */
+
+#include <io.h>
+#define lua_stdin_is_tty() _isatty(_fileno(stdin))
+
+#else /* }{ */
+
+/* ISO C definition */
+#define lua_stdin_is_tty() 1 /* assume stdin is a tty */
+
+#endif /* } */
+
+#endif /* } */
+
+
+/*
+** lua_readline defines how to show a prompt and then read a line from
+** the standard input.
+** lua_saveline defines how to "save" a read line in a "history".
+** lua_freeline defines how to free a line read by lua_readline.
+*/
+#if !defined(lua_readline) /* { */
+
+#if defined(LUA_USE_READLINE) /* { */
+
+#include <readline/readline.h>
+#include <readline/history.h>
+#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL)
+#define lua_saveline(L,line) ((void)L, add_history(line))
+#define lua_freeline(L,b) ((void)L, free(b))
+
+#else /* }{ */
+
+#define lua_readline(L,b,p) \
+ ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \
+ fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */
+#define lua_saveline(L,line) { (void)L; (void)line; }
+#define lua_freeline(L,b) { (void)L; (void)b; }
+
+#endif /* } */
+
+#endif /* } */
+
+
+
+
+static lua_State *globalL = NULL;
+
+static const char *progname = LUA_PROGNAME;
+
+
+/*
+** Hook set by signal function to stop the interpreter.
+*/
+static void lstop (lua_State *L, lua_Debug *ar) {
+ (void)ar; /* unused arg. */
+ lua_sethook(L, NULL, 0, 0); /* reset hook */
+ luaL_error(L, "interrupted!");
+}
+
+
+/*
+** Function to be called at a C signal. Because a C signal cannot
+** just change a Lua state (as there is no proper synchronization),
+** this function only sets a hook that, when called, will stop the
+** interpreter.
+*/
+static void laction (int i) {
+ signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */
+ lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);
+}
+
+
+static void print_usage (const char *badoption) {
+ lua_writestringerror("%s: ", progname);
+ if (badoption[1] == 'e' || badoption[1] == 'l')
+ lua_writestringerror("'%s' needs argument\n", badoption);
+ else
+ lua_writestringerror("unrecognized option '%s'\n", badoption);
+ lua_writestringerror(
+ "usage: %s [options] [script [args]]\n"
+ "Available options are:\n"
+ " -e stat execute string 'stat'\n"
+ " -i enter interactive mode after executing 'script'\n"
+ " -l name require library 'name'\n"
+ " -v show version information\n"
+ " -E ignore environment variables\n"
+ " -- stop handling options\n"
+ " - stop handling options and execute stdin\n"
+ ,
+ progname);
+}
+
+
+/*
+** Prints an error message, adding the program name in front of it
+** (if present)
+*/
+static void l_message (const char *pname, const char *msg) {
+ if (pname) lua_writestringerror("%s: ", pname);
+ lua_writestringerror("%s\n", msg);
+}
+
+
+/*
+** Check whether 'status' is not OK and, if so, prints the error
+** message on the top of the stack. It assumes that the error object
+** is a string, as it was either generated by Lua or by 'msghandler'.
+*/
+static int report (lua_State *L, int status) {
+ if (status != LUA_OK) {
+ const char *msg = lua_tostring(L, -1);
+ l_message(progname, msg);
+ lua_pop(L, 1); /* remove message */
+ }
+ return status;
+}
+
+
+/*
+** Message handler used to run all chunks
+*/
+static int msghandler (lua_State *L) {
+ const char *msg = lua_tostring(L, 1);
+ if (msg == NULL) { /* is error object not a string? */
+ if (luaL_callmeta(L, 1, "__tostring") && /* does it have a metamethod */
+ lua_type(L, -1) == LUA_TSTRING) /* that produces a string? */
+ return 1; /* that is the message */
+ else
+ msg = lua_pushfstring(L, "(error object is a %s value)",
+ luaL_typename(L, 1));
+ }
+ luaL_traceback(L, L, msg, 1); /* append a standard traceback */
+ return 1; /* return the traceback */
+}
+
+
+/*
+** Interface to 'lua_pcall', which sets appropriate message function
+** and C-signal handler. Used to run all chunks.
+*/
+static int docall (lua_State *L, int narg, int nres) {
+ int status;
+ int base = lua_gettop(L) - narg; /* function index */
+ lua_pushcfunction(L, msghandler); /* push message handler */
+ lua_insert(L, base); /* put it under function and args */
+ globalL = L; /* to be available to 'laction' */
+ signal(SIGINT, laction); /* set C-signal handler */
+ status = lua_pcall(L, narg, nres, base);
+ signal(SIGINT, SIG_DFL); /* reset C-signal handler */
+ lua_remove(L, base); /* remove message handler from the stack */
+ return status;
+}
+
+
+static void print_version (void) {
+ lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT));
+ lua_writeline();
+}
+
+
+/*
+** Create the 'arg' table, which stores all arguments from the
+** command line ('argv'). It should be aligned so that, at index 0,
+** it has 'argv[script]', which is the script name. The arguments
+** to the script (everything after 'script') go to positive indices;
+** other arguments (before the script name) go to negative indices.
+** If there is no script name, assume interpreter's name as base.
+*/
+static void createargtable (lua_State *L, char **argv, int argc, int script) {
+ int i, narg;
+ if (script == argc) script = 0; /* no script name? */
+ narg = argc - (script + 1); /* number of positive indices */
+ lua_createtable(L, narg, script + 1);
+ for (i = 0; i < argc; i++) {
+ lua_pushstring(L, argv[i]);
+ lua_rawseti(L, -2, i - script);
+ }
+ lua_setglobal(L, "arg");
+}
+
+
+static int dochunk (lua_State *L, int status) {
+ if (status == LUA_OK) status = docall(L, 0, 0);
+ return report(L, status);
+}
+
+
+static int dofile (lua_State *L, const char *name) {
+ return dochunk(L, luaL_loadfile(L, name));
+}
+
+
+static int dostring (lua_State *L, const char *s, const char *name) {
+ return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name));
+}
+
+
+/*
+** Calls 'require(name)' and stores the result in a global variable
+** with the given name.
+*/
+static int dolibrary (lua_State *L, const char *name) {
+ int status;
+ lua_getglobal(L, "require");
+ lua_pushstring(L, name);
+ status = docall(L, 1, 1); /* call 'require(name)' */
+ if (status == LUA_OK)
+ lua_setglobal(L, name); /* global[name] = require return */
+ return report(L, status);
+}
+
+
+/*
+** Returns the string to be used as a prompt by the interpreter.
+*/
+static const char *get_prompt (lua_State *L, int firstline) {
+ const char *p;
+ lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2");
+ p = lua_tostring(L, -1);
+ if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);
+ return p;
+}
+
+/* mark in error messages for incomplete statements */
+#define EOFMARK "<eof>"
+#define marklen (sizeof(EOFMARK)/sizeof(char) - 1)
+
+
+/*
+** Check whether 'status' signals a syntax error and the error
+** message at the top of the stack ends with the above mark for
+** incomplete statements.
+*/
+static int incomplete (lua_State *L, int status) {
+ if (status == LUA_ERRSYNTAX) {
+ size_t lmsg;
+ const char *msg = lua_tolstring(L, -1, &lmsg);
+ if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) {
+ lua_pop(L, 1);
+ return 1;
+ }
+ }
+ return 0; /* else... */
+}
+
+
+/*
+** Prompt the user, read a line, and push it into the Lua stack.
+*/
+static int pushline (lua_State *L, int firstline) {
+ char buffer[LUA_MAXINPUT];
+ char *b = buffer;
+ size_t l;
+ const char *prmt = get_prompt(L, firstline);
+ int readstatus = lua_readline(L, b, prmt);
+ if (readstatus == 0)
+ return 0; /* no input (prompt will be popped by caller) */
+ lua_pop(L, 1); /* remove prompt */
+ l = strlen(b);
+ if (l > 0 && b[l-1] == '\n') /* line ends with newline? */
+ b[--l] = '\0'; /* remove it */
+ if (firstline && b[0] == '=') /* for compatibility with 5.2, ... */
+ lua_pushfstring(L, "return %s", b + 1); /* change '=' to 'return' */
+ else
+ lua_pushlstring(L, b, l);
+ lua_freeline(L, b);
+ return 1;
+}
+
+
+/*
+** Try to compile line on the stack as 'return <line>;'; on return, stack
+** has either compiled chunk or original line (if compilation failed).
+*/
+static int addreturn (lua_State *L) {
+ const char *line = lua_tostring(L, -1); /* original line */
+ const char *retline = lua_pushfstring(L, "return %s;", line);
+ int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin");
+ if (status == LUA_OK) {
+ lua_remove(L, -2); /* remove modified line */
+ if (line[0] != '\0') /* non empty? */
+ lua_saveline(L, line); /* keep history */
+ }
+ else
+ lua_pop(L, 2); /* pop result from 'luaL_loadbuffer' and modified line */
+ return status;
+}
+
+
+/*
+** Read multiple lines until a complete Lua statement
+*/
+static int multiline (lua_State *L) {
+ for (;;) { /* repeat until gets a complete statement */
+ size_t len;
+ const char *line = lua_tolstring(L, 1, &len); /* get what it has */
+ int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */
+ if (!incomplete(L, status) || !pushline(L, 0)) {
+ lua_saveline(L, line); /* keep history */
+ return status; /* cannot or should not try to add continuation line */
+ }
+ lua_pushliteral(L, "\n"); /* add newline... */
+ lua_insert(L, -2); /* ...between the two lines */
+ lua_concat(L, 3); /* join them */
+ }
+}
+
+
+/*
+** Read a line and try to load (compile) it first as an expression (by
+** adding "return " in front of it) and second as a statement. Return
+** the final status of load/call with the resulting function (if any)
+** in the top of the stack.
+*/
+static int loadline (lua_State *L) {
+ int status;
+ lua_settop(L, 0);
+ if (!pushline(L, 1))
+ return -1; /* no input */
+ if ((status = addreturn(L)) != LUA_OK) /* 'return ...' did not work? */
+ status = multiline(L); /* try as command, maybe with continuation lines */
+ lua_remove(L, 1); /* remove line from the stack */
+ lua_assert(lua_gettop(L) == 1);
+ return status;
+}
+
+
+/*
+** Prints (calling the Lua 'print' function) any values on the stack
+*/
+static void l_print (lua_State *L) {
+ int n = lua_gettop(L);
+ if (n > 0) { /* any result to be printed? */
+ luaL_checkstack(L, LUA_MINSTACK, "too many results to print");
+ lua_getglobal(L, "print");
+ lua_insert(L, 1);
+ if (lua_pcall(L, n, 0, 0) != LUA_OK)
+ l_message(progname, lua_pushfstring(L, "error calling 'print' (%s)",
+ lua_tostring(L, -1)));
+ }
+}
+
+
+/*
+** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and
+** print any results.
+*/
+static void doREPL (lua_State *L) {
+ int status;
+ const char *oldprogname = progname;
+ progname = NULL; /* no 'progname' on errors in interactive mode */
+ while ((status = loadline(L)) != -1) {
+ if (status == LUA_OK)
+ status = docall(L, 0, LUA_MULTRET);
+ if (status == LUA_OK) l_print(L);
+ else report(L, status);
+ }
+ lua_settop(L, 0); /* clear stack */
+ lua_writeline();
+ progname = oldprogname;
+}
+
+
+/*
+** Push on the stack the contents of table 'arg' from 1 to #arg
+*/
+static int pushargs (lua_State *L) {
+ int i, n;
+ if (lua_getglobal(L, "arg") != LUA_TTABLE)
+ luaL_error(L, "'arg' is not a table");
+ n = (int)luaL_len(L, -1);
+ luaL_checkstack(L, n + 3, "too many arguments to script");
+ for (i = 1; i <= n; i++)
+ lua_rawgeti(L, -i, i);
+ lua_remove(L, -i); /* remove table from the stack */
+ return n;
+}
+
+
+static int handle_script (lua_State *L, char **argv) {
+ int status;
+ const char *fname = argv[0];
+ if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0)
+ fname = NULL; /* stdin */
+ status = luaL_loadfile(L, fname);
+ if (status == LUA_OK) {
+ int n = pushargs(L); /* push arguments to script */
+ status = docall(L, n, LUA_MULTRET);
+ }
+ return report(L, status);
+}
+
+
+
+/* bits of various argument indicators in 'args' */
+#define has_error 1 /* bad option */
+#define has_i 2 /* -i */
+#define has_v 4 /* -v */
+#define has_e 8 /* -e */
+#define has_E 16 /* -E */
+
+/*
+** Traverses all arguments from 'argv', returning a mask with those
+** needed before running any Lua code (or an error code if it finds
+** any invalid argument). 'first' returns the first not-handled argument
+** (either the script name or a bad argument in case of error).
+*/
+static int collectargs (char **argv, int *first) {
+ int args = 0;
+ int i;
+ for (i = 1; argv[i] != NULL; i++) {
+ *first = i;
+ if (argv[i][0] != '-') /* not an option? */
+ return args; /* stop handling options */
+ switch (argv[i][1]) { /* else check option */
+ case '-': /* '--' */
+ if (argv[i][2] != '\0') /* extra characters after '--'? */
+ return has_error; /* invalid option */
+ *first = i + 1;
+ return args;
+ case '\0': /* '-' */
+ return args; /* script "name" is '-' */
+ case 'E':
+ if (argv[i][2] != '\0') /* extra characters after 1st? */
+ return has_error; /* invalid option */
+ args |= has_E;
+ break;
+ case 'i':
+ args |= has_i; /* (-i implies -v) *//* FALLTHROUGH */
+ case 'v':
+ if (argv[i][2] != '\0') /* extra characters after 1st? */
+ return has_error; /* invalid option */
+ args |= has_v;
+ break;
+ case 'e':
+ args |= has_e; /* FALLTHROUGH */
+ case 'l': /* both options need an argument */
+ if (argv[i][2] == '\0') { /* no concatenated argument? */
+ i++; /* try next 'argv' */
+ if (argv[i] == NULL || argv[i][0] == '-')
+ return has_error; /* no next argument or it is another option */
+ }
+ break;
+ default: /* invalid option */
+ return has_error;
+ }
+ }
+ *first = i; /* no script name */
+ return args;
+}
+
+
+/*
+** Processes options 'e' and 'l', which involve running Lua code.
+** Returns 0 if some code raises an error.
+*/
+static int runargs (lua_State *L, char **argv, int n) {
+ int i;
+ for (i = 1; i < n; i++) {
+ int option = argv[i][1];
+ lua_assert(argv[i][0] == '-'); /* already checked */
+ if (option == 'e' || option == 'l') {
+ int status;
+ const char *extra = argv[i] + 2; /* both options need an argument */
+ if (*extra == '\0') extra = argv[++i];
+ lua_assert(extra != NULL);
+ status = (option == 'e')
+ ? dostring(L, extra, "=(command line)")
+ : dolibrary(L, extra);
+ if (status != LUA_OK) return 0;
+ }
+ }
+ return 1;
+}
+
+
+static int handle_luainit (lua_State *L) {
+ const char *name = "=" LUA_INITVARVERSION;
+ const char *init = getenv(name + 1);
+ if (init == NULL) {
+ name = "=" LUA_INIT_VAR;
+ init = getenv(name + 1); /* try alternative name */
+ }
+ if (init == NULL) return LUA_OK;
+ else if (init[0] == '@')
+ return dofile(L, init+1);
+ else
+ return dostring(L, init, name);
+}
+
+
+/*
+** Main body of stand-alone interpreter (to be called in protected mode).
+** Reads the options and handles them all.
+*/
+static int pmain (lua_State *L) {
+ int argc = (int)lua_tointeger(L, 1);
+ char **argv = (char **)lua_touserdata(L, 2);
+ int script;
+ int args = collectargs(argv, &script);
+ luaL_checkversion(L); /* check that interpreter has correct version */
+ if (argv[0] && argv[0][0]) progname = argv[0];
+ if (args == has_error) { /* bad arg? */
+ print_usage(argv[script]); /* 'script' has index of bad arg. */
+ return 0;
+ }
+ if (args & has_v) /* option '-v'? */
+ print_version();
+ if (args & has_E) { /* option '-E'? */
+ lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */
+ lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
+ }
+ luaL_openlibs(L); /* open standard libraries */
+ createargtable(L, argv, argc, script); /* create table 'arg' */
+ if (!(args & has_E)) { /* no option '-E'? */
+ if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */
+ return 0; /* error running LUA_INIT */
+ }
+ if (!runargs(L, argv, script)) /* execute arguments -e and -l */
+ return 0; /* something failed */
+ if (script < argc && /* execute main script (if there is one) */
+ handle_script(L, argv + script) != LUA_OK)
+ return 0;
+ if (args & has_i) /* -i option? */
+ doREPL(L); /* do read-eval-print loop */
+ else if (script == argc && !(args & (has_e | has_v))) { /* no arguments? */
+ if (lua_stdin_is_tty()) { /* running in interactive mode? */
+ print_version();
+ doREPL(L); /* do read-eval-print loop */
+ }
+ else dofile(L, NULL); /* executes stdin as a file */
+ }
+ lua_pushboolean(L, 1); /* signal no errors */
+ return 1;
+}
+
+
+int main (int argc, char **argv) {
+ int status, result;
+ lua_State *L = luaL_newstate(); /* create state */
+ if (L == NULL) {
+ l_message(argv[0], "cannot create state: not enough memory");
+ return EXIT_FAILURE;
+ }
+ lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */
+ lua_pushinteger(L, argc); /* 1st argument */
+ lua_pushlightuserdata(L, argv); /* 2nd argument */
+ status = lua_pcall(L, 2, 1, 0); /* do the call */
+ result = lua_toboolean(L, -1); /* get result */
+ report(L, status);
+ lua_close(L);
+ return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
diff --git a/libs/lua/lua-5.3.3/lua.h b/libs/lua/lua-5.3.3/lua.h
new file mode 100644
index 0000000..f78899f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lua.h
@@ -0,0 +1,486 @@
+/*
+** $Id: lua.h,v 1.331 2016/05/30 15:53:28 roberto Exp $
+** Lua - A Scripting Language
+** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
+** See Copyright Notice at the end of this file
+*/
+
+
+#ifndef lua_h
+#define lua_h
+
+#include <stdarg.h>
+#include <stddef.h>
+
+
+#include "luaconf.h"
+
+
+#define LUA_VERSION_MAJOR "5"
+#define LUA_VERSION_MINOR "3"
+#define LUA_VERSION_NUM 503
+#define LUA_VERSION_RELEASE "3"
+
+#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
+#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE
+#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2016 Lua.org, PUC-Rio"
+#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
+
+
+/* mark for precompiled code ('<esc>Lua') */
+#define LUA_SIGNATURE "\x1bLua"
+
+/* option for multiple returns in 'lua_pcall' and 'lua_call' */
+#define LUA_MULTRET (-1)
+
+
+/*
+** Pseudo-indices
+** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty
+** space after that to help overflow detection)
+*/
+#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000)
+#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i))
+
+
+/* thread status */
+#define LUA_OK 0
+#define LUA_YIELD 1
+#define LUA_ERRRUN 2
+#define LUA_ERRSYNTAX 3
+#define LUA_ERRMEM 4
+#define LUA_ERRGCMM 5
+#define LUA_ERRERR 6
+
+
+typedef struct lua_State lua_State;
+
+
+/*
+** basic types
+*/
+#define LUA_TNONE (-1)
+
+#define LUA_TNIL 0
+#define LUA_TBOOLEAN 1
+#define LUA_TLIGHTUSERDATA 2
+#define LUA_TNUMBER 3
+#define LUA_TSTRING 4
+#define LUA_TTABLE 5
+#define LUA_TFUNCTION 6
+#define LUA_TUSERDATA 7
+#define LUA_TTHREAD 8
+
+#define LUA_NUMTAGS 9
+
+
+
+/* minimum Lua stack available to a C function */
+#define LUA_MINSTACK 20
+
+
+/* predefined values in the registry */
+#define LUA_RIDX_MAINTHREAD 1
+#define LUA_RIDX_GLOBALS 2
+#define LUA_RIDX_LAST LUA_RIDX_GLOBALS
+
+
+/* type of numbers in Lua */
+typedef LUA_NUMBER lua_Number;
+
+
+/* type for integer functions */
+typedef LUA_INTEGER lua_Integer;
+
+/* unsigned integer type */
+typedef LUA_UNSIGNED lua_Unsigned;
+
+/* type for continuation-function contexts */
+typedef LUA_KCONTEXT lua_KContext;
+
+
+/*
+** Type for C functions registered with Lua
+*/
+typedef int (*lua_CFunction) (lua_State *L);
+
+/*
+** Type for continuation functions
+*/
+typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx);
+
+
+/*
+** Type for functions that read/write blocks when loading/dumping Lua chunks
+*/
+typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);
+
+typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud);
+
+
+/*
+** Type for memory-allocation functions
+*/
+typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
+
+
+
+/*
+** generic extra include file
+*/
+#if defined(LUA_USER_H)
+#include LUA_USER_H
+#endif
+
+
+/*
+** RCS ident string
+*/
+extern const char lua_ident[];
+
+
+/*
+** state manipulation
+*/
+LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
+LUA_API void (lua_close) (lua_State *L);
+LUA_API lua_State *(lua_newthread) (lua_State *L);
+
+LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
+
+
+LUA_API const lua_Number *(lua_version) (lua_State *L);
+
+
+/*
+** basic stack manipulation
+*/
+LUA_API int (lua_absindex) (lua_State *L, int idx);
+LUA_API int (lua_gettop) (lua_State *L);
+LUA_API void (lua_settop) (lua_State *L, int idx);
+LUA_API void (lua_pushvalue) (lua_State *L, int idx);
+LUA_API void (lua_rotate) (lua_State *L, int idx, int n);
+LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx);
+LUA_API int (lua_checkstack) (lua_State *L, int n);
+
+LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n);
+
+
+/*
+** access functions (stack -> C)
+*/
+
+LUA_API int (lua_isnumber) (lua_State *L, int idx);
+LUA_API int (lua_isstring) (lua_State *L, int idx);
+LUA_API int (lua_iscfunction) (lua_State *L, int idx);
+LUA_API int (lua_isinteger) (lua_State *L, int idx);
+LUA_API int (lua_isuserdata) (lua_State *L, int idx);
+LUA_API int (lua_type) (lua_State *L, int idx);
+LUA_API const char *(lua_typename) (lua_State *L, int tp);
+
+LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum);
+LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum);
+LUA_API int (lua_toboolean) (lua_State *L, int idx);
+LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len);
+LUA_API size_t (lua_rawlen) (lua_State *L, int idx);
+LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx);
+LUA_API void *(lua_touserdata) (lua_State *L, int idx);
+LUA_API lua_State *(lua_tothread) (lua_State *L, int idx);
+LUA_API const void *(lua_topointer) (lua_State *L, int idx);
+
+
+/*
+** Comparison and arithmetic functions
+*/
+
+#define LUA_OPADD 0 /* ORDER TM, ORDER OP */
+#define LUA_OPSUB 1
+#define LUA_OPMUL 2
+#define LUA_OPMOD 3
+#define LUA_OPPOW 4
+#define LUA_OPDIV 5
+#define LUA_OPIDIV 6
+#define LUA_OPBAND 7
+#define LUA_OPBOR 8
+#define LUA_OPBXOR 9
+#define LUA_OPSHL 10
+#define LUA_OPSHR 11
+#define LUA_OPUNM 12
+#define LUA_OPBNOT 13
+
+LUA_API void (lua_arith) (lua_State *L, int op);
+
+#define LUA_OPEQ 0
+#define LUA_OPLT 1
+#define LUA_OPLE 2
+
+LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2);
+LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op);
+
+
+/*
+** push functions (C -> stack)
+*/
+LUA_API void (lua_pushnil) (lua_State *L);
+LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n);
+LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n);
+LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len);
+LUA_API const char *(lua_pushstring) (lua_State *L, const char *s);
+LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
+ va_list argp);
+LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);
+LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
+LUA_API void (lua_pushboolean) (lua_State *L, int b);
+LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p);
+LUA_API int (lua_pushthread) (lua_State *L);
+
+
+/*
+** get functions (Lua -> stack)
+*/
+LUA_API int (lua_getglobal) (lua_State *L, const char *name);
+LUA_API int (lua_gettable) (lua_State *L, int idx);
+LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k);
+LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n);
+LUA_API int (lua_rawget) (lua_State *L, int idx);
+LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n);
+LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p);
+
+LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);
+LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
+LUA_API int (lua_getmetatable) (lua_State *L, int objindex);
+LUA_API int (lua_getuservalue) (lua_State *L, int idx);
+
+
+/*
+** set functions (stack -> Lua)
+*/
+LUA_API void (lua_setglobal) (lua_State *L, const char *name);
+LUA_API void (lua_settable) (lua_State *L, int idx);
+LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);
+LUA_API void (lua_seti) (lua_State *L, int idx, lua_Integer n);
+LUA_API void (lua_rawset) (lua_State *L, int idx);
+LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n);
+LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p);
+LUA_API int (lua_setmetatable) (lua_State *L, int objindex);
+LUA_API void (lua_setuservalue) (lua_State *L, int idx);
+
+
+/*
+** 'load' and 'call' functions (load and run Lua code)
+*/
+LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults,
+ lua_KContext ctx, lua_KFunction k);
+#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL)
+
+LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc,
+ lua_KContext ctx, lua_KFunction k);
+#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL)
+
+LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt,
+ const char *chunkname, const char *mode);
+
+LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip);
+
+
+/*
+** coroutine functions
+*/
+LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx,
+ lua_KFunction k);
+LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg);
+LUA_API int (lua_status) (lua_State *L);
+LUA_API int (lua_isyieldable) (lua_State *L);
+
+#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL)
+
+
+/*
+** garbage-collection function and options
+*/
+
+#define LUA_GCSTOP 0
+#define LUA_GCRESTART 1
+#define LUA_GCCOLLECT 2
+#define LUA_GCCOUNT 3
+#define LUA_GCCOUNTB 4
+#define LUA_GCSTEP 5
+#define LUA_GCSETPAUSE 6
+#define LUA_GCSETSTEPMUL 7
+#define LUA_GCISRUNNING 9
+
+LUA_API int (lua_gc) (lua_State *L, int what, int data);
+
+
+/*
+** miscellaneous functions
+*/
+
+LUA_API int (lua_error) (lua_State *L);
+
+LUA_API int (lua_next) (lua_State *L, int idx);
+
+LUA_API void (lua_concat) (lua_State *L, int n);
+LUA_API void (lua_len) (lua_State *L, int idx);
+
+LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s);
+
+LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
+LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
+
+
+
+/*
+** {==============================================================
+** some useful macros
+** ===============================================================
+*/
+
+#define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE))
+
+#define lua_tonumber(L,i) lua_tonumberx(L,(i),NULL)
+#define lua_tointeger(L,i) lua_tointegerx(L,(i),NULL)
+
+#define lua_pop(L,n) lua_settop(L, -(n)-1)
+
+#define lua_newtable(L) lua_createtable(L, 0, 0)
+
+#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
+
+#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
+
+#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION)
+#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE)
+#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
+#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL)
+#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN)
+#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD)
+#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE)
+#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
+
+#define lua_pushliteral(L, s) lua_pushstring(L, "" s)
+
+#define lua_pushglobaltable(L) \
+ ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS))
+
+#define lua_tostring(L,i) lua_tolstring(L, (i), NULL)
+
+
+#define lua_insert(L,idx) lua_rotate(L, (idx), 1)
+
+#define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1))
+
+#define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1))
+
+/* }============================================================== */
+
+
+/*
+** {==============================================================
+** compatibility macros for unsigned conversions
+** ===============================================================
+*/
+#if defined(LUA_COMPAT_APIINTCASTS)
+
+#define lua_pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n))
+#define lua_tounsignedx(L,i,is) ((lua_Unsigned)lua_tointegerx(L,i,is))
+#define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL)
+
+#endif
+/* }============================================================== */
+
+/*
+** {======================================================================
+** Debug API
+** =======================================================================
+*/
+
+
+/*
+** Event codes
+*/
+#define LUA_HOOKCALL 0
+#define LUA_HOOKRET 1
+#define LUA_HOOKLINE 2
+#define LUA_HOOKCOUNT 3
+#define LUA_HOOKTAILCALL 4
+
+
+/*
+** Event masks
+*/
+#define LUA_MASKCALL (1 << LUA_HOOKCALL)
+#define LUA_MASKRET (1 << LUA_HOOKRET)
+#define LUA_MASKLINE (1 << LUA_HOOKLINE)
+#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT)
+
+typedef struct lua_Debug lua_Debug; /* activation record */
+
+
+/* Functions to be called by the debugger in specific events */
+typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
+
+
+LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar);
+LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);
+LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);
+LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);
+LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n);
+LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n);
+
+LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n);
+LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1,
+ int fidx2, int n2);
+
+LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count);
+LUA_API lua_Hook (lua_gethook) (lua_State *L);
+LUA_API int (lua_gethookmask) (lua_State *L);
+LUA_API int (lua_gethookcount) (lua_State *L);
+
+
+struct lua_Debug {
+ int event;
+ const char *name; /* (n) */
+ const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */
+ const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */
+ const char *source; /* (S) */
+ int currentline; /* (l) */
+ int linedefined; /* (S) */
+ int lastlinedefined; /* (S) */
+ unsigned char nups; /* (u) number of upvalues */
+ unsigned char nparams;/* (u) number of parameters */
+ char isvararg; /* (u) */
+ char istailcall; /* (t) */
+ char short_src[LUA_IDSIZE]; /* (S) */
+ /* private part */
+ struct CallInfo *i_ci; /* active function */
+};
+
+/* }====================================================================== */
+
+
+/******************************************************************************
+* Copyright (C) 1994-2016 Lua.org, PUC-Rio.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lua.hpp b/libs/lua/lua-5.3.3/lua.hpp
new file mode 100644
index 0000000..ec417f5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lua.hpp
@@ -0,0 +1,9 @@
+// lua.hpp
+// Lua header files for C++
+// <<extern "C">> not supplied automatically because Lua also compiles as C++
+
+extern "C" {
+#include "lua.h"
+#include "lualib.h"
+#include "lauxlib.h"
+}
diff --git a/libs/lua/lua-5.3.3/luac.c b/libs/lua/lua-5.3.3/luac.c
new file mode 100644
index 0000000..c0c91d0
--- /dev/null
+++ b/libs/lua/lua-5.3.3/luac.c
@@ -0,0 +1,449 @@
+/*
+** $Id: luac.c,v 1.75 2015/03/12 01:58:27 lhf Exp $
+** Lua compiler (saves bytecodes to files; also lists bytecodes)
+** See Copyright Notice in lua.h
+*/
+
+#define luac_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+#include "lauxlib.h"
+
+#include "lobject.h"
+#include "lstate.h"
+#include "lundump.h"
+
+static void PrintFunction(const Proto* f, int full);
+#define luaU_print PrintFunction
+
+#define PROGNAME "luac" /* default program name */
+#define OUTPUT PROGNAME ".out" /* default output file */
+
+static int listing=0; /* list bytecodes? */
+static int dumping=1; /* dump bytecodes? */
+static int stripping=0; /* strip debug information? */
+static char Output[]={ OUTPUT }; /* default output file name */
+static const char* output=Output; /* actual output file name */
+static const char* progname=PROGNAME; /* actual program name */
+
+static void fatal(const char* message)
+{
+ fprintf(stderr,"%s: %s\n",progname,message);
+ exit(EXIT_FAILURE);
+}
+
+static void cannot(const char* what)
+{
+ fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno));
+ exit(EXIT_FAILURE);
+}
+
+static void usage(const char* message)
+{
+ if (*message=='-')
+ fprintf(stderr,"%s: unrecognized option '%s'\n",progname,message);
+ else
+ fprintf(stderr,"%s: %s\n",progname,message);
+ fprintf(stderr,
+ "usage: %s [options] [filenames]\n"
+ "Available options are:\n"
+ " -l list (use -l -l for full listing)\n"
+ " -o name output to file 'name' (default is \"%s\")\n"
+ " -p parse only\n"
+ " -s strip debug information\n"
+ " -v show version information\n"
+ " -- stop handling options\n"
+ " - stop handling options and process stdin\n"
+ ,progname,Output);
+ exit(EXIT_FAILURE);
+}
+
+#define IS(s) (strcmp(argv[i],s)==0)
+
+static int doargs(int argc, char* argv[])
+{
+ int i;
+ int version=0;
+ if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0];
+ for (i=1; i<argc; i++)
+ {
+ if (*argv[i]!='-') /* end of options; keep it */
+ break;
+ else if (IS("--")) /* end of options; skip it */
+ {
+ ++i;
+ if (version) ++version;
+ break;
+ }
+ else if (IS("-")) /* end of options; use stdin */
+ break;
+ else if (IS("-l")) /* list */
+ ++listing;
+ else if (IS("-o")) /* output file */
+ {
+ output=argv[++i];
+ if (output==NULL || *output==0 || (*output=='-' && output[1]!=0))
+ usage("'-o' needs argument");
+ if (IS("-")) output=NULL;
+ }
+ else if (IS("-p")) /* parse only */
+ dumping=0;
+ else if (IS("-s")) /* strip debug information */
+ stripping=1;
+ else if (IS("-v")) /* show version */
+ ++version;
+ else /* unknown option */
+ usage(argv[i]);
+ }
+ if (i==argc && (listing || !dumping))
+ {
+ dumping=0;
+ argv[--i]=Output;
+ }
+ if (version)
+ {
+ printf("%s\n",LUA_COPYRIGHT);
+ if (version==argc-1) exit(EXIT_SUCCESS);
+ }
+ return i;
+}
+
+#define FUNCTION "(function()end)();"
+
+static const char* reader(lua_State *L, void *ud, size_t *size)
+{
+ UNUSED(L);
+ if ((*(int*)ud)--)
+ {
+ *size=sizeof(FUNCTION)-1;
+ return FUNCTION;
+ }
+ else
+ {
+ *size=0;
+ return NULL;
+ }
+}
+
+#define toproto(L,i) getproto(L->top+(i))
+
+static const Proto* combine(lua_State* L, int n)
+{
+ if (n==1)
+ return toproto(L,-1);
+ else
+ {
+ Proto* f;
+ int i=n;
+ if (lua_load(L,reader,&i,"=(" PROGNAME ")",NULL)!=LUA_OK) fatal(lua_tostring(L,-1));
+ f=toproto(L,-1);
+ for (i=0; i<n; i++)
+ {
+ f->p[i]=toproto(L,i-n-1);
+ if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0;
+ }
+ f->sizelineinfo=0;
+ return f;
+ }
+}
+
+static int writer(lua_State* L, const void* p, size_t size, void* u)
+{
+ UNUSED(L);
+ return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0);
+}
+
+static int pmain(lua_State* L)
+{
+ int argc=(int)lua_tointeger(L,1);
+ char** argv=(char**)lua_touserdata(L,2);
+ const Proto* f;
+ int i;
+ if (!lua_checkstack(L,argc)) fatal("too many input files");
+ for (i=0; i<argc; i++)
+ {
+ const char* filename=IS("-") ? NULL : argv[i];
+ if (luaL_loadfile(L,filename)!=LUA_OK) fatal(lua_tostring(L,-1));
+ }
+ f=combine(L,argc);
+ if (listing) luaU_print(f,listing>1);
+ if (dumping)
+ {
+ FILE* D= (output==NULL) ? stdout : fopen(output,"wb");
+ if (D==NULL) cannot("open");
+ lua_lock(L);
+ luaU_dump(L,f,writer,D,stripping);
+ lua_unlock(L);
+ if (ferror(D)) cannot("write");
+ if (fclose(D)) cannot("close");
+ }
+ return 0;
+}
+
+int main(int argc, char* argv[])
+{
+ lua_State* L;
+ int i=doargs(argc,argv);
+ argc-=i; argv+=i;
+ if (argc<=0) usage("no input files given");
+ L=luaL_newstate();
+ if (L==NULL) fatal("cannot create state: not enough memory");
+ lua_pushcfunction(L,&pmain);
+ lua_pushinteger(L,argc);
+ lua_pushlightuserdata(L,argv);
+ if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1));
+ lua_close(L);
+ return EXIT_SUCCESS;
+}
+
+/*
+** $Id: luac.c,v 1.75 2015/03/12 01:58:27 lhf Exp $
+** print bytecodes
+** See Copyright Notice in lua.h
+*/
+
+#include <ctype.h>
+#include <stdio.h>
+
+#define luac_c
+#define LUA_CORE
+
+#include "ldebug.h"
+#include "lobject.h"
+#include "lopcodes.h"
+
+#define VOID(p) ((const void*)(p))
+
+static void PrintString(const TString* ts)
+{
+ const char* s=getstr(ts);
+ size_t i,n=tsslen(ts);
+ printf("%c",'"');
+ for (i=0; i<n; i++)
+ {
+ int c=(int)(unsigned char)s[i];
+ switch (c)
+ {
+ case '"': printf("\\\""); break;
+ case '\\': printf("\\\\"); break;
+ case '\a': printf("\\a"); break;
+ case '\b': printf("\\b"); break;
+ case '\f': printf("\\f"); break;
+ case '\n': printf("\\n"); break;
+ case '\r': printf("\\r"); break;
+ case '\t': printf("\\t"); break;
+ case '\v': printf("\\v"); break;
+ default: if (isprint(c))
+ printf("%c",c);
+ else
+ printf("\\%03d",c);
+ }
+ }
+ printf("%c",'"');
+}
+
+static void PrintConstant(const Proto* f, int i)
+{
+ const TValue* o=&f->k[i];
+ switch (ttype(o))
+ {
+ case LUA_TNIL:
+ printf("nil");
+ break;
+ case LUA_TBOOLEAN:
+ printf(bvalue(o) ? "true" : "false");
+ break;
+ case LUA_TNUMFLT:
+ {
+ char buff[100];
+ sprintf(buff,LUA_NUMBER_FMT,fltvalue(o));
+ printf("%s",buff);
+ if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0");
+ break;
+ }
+ case LUA_TNUMINT:
+ printf(LUA_INTEGER_FMT,ivalue(o));
+ break;
+ case LUA_TSHRSTR: case LUA_TLNGSTR:
+ PrintString(tsvalue(o));
+ break;
+ default: /* cannot happen */
+ printf("? type=%d",ttype(o));
+ break;
+ }
+}
+
+#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : "-")
+#define MYK(x) (-1-(x))
+
+static void PrintCode(const Proto* f)
+{
+ const Instruction* code=f->code;
+ int pc,n=f->sizecode;
+ for (pc=0; pc<n; pc++)
+ {
+ Instruction i=code[pc];
+ OpCode o=GET_OPCODE(i);
+ int a=GETARG_A(i);
+ int b=GETARG_B(i);
+ int c=GETARG_C(i);
+ int ax=GETARG_Ax(i);
+ int bx=GETARG_Bx(i);
+ int sbx=GETARG_sBx(i);
+ int line=getfuncline(f,pc);
+ printf("\t%d\t",pc+1);
+ if (line>0) printf("[%d]\t",line); else printf("[-]\t");
+ printf("%-9s\t",luaP_opnames[o]);
+ switch (getOpMode(o))
+ {
+ case iABC:
+ printf("%d",a);
+ if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (MYK(INDEXK(b))) : b);
+ if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (MYK(INDEXK(c))) : c);
+ break;
+ case iABx:
+ printf("%d",a);
+ if (getBMode(o)==OpArgK) printf(" %d",MYK(bx));
+ if (getBMode(o)==OpArgU) printf(" %d",bx);
+ break;
+ case iAsBx:
+ printf("%d %d",a,sbx);
+ break;
+ case iAx:
+ printf("%d",MYK(ax));
+ break;
+ }
+ switch (o)
+ {
+ case OP_LOADK:
+ printf("\t; "); PrintConstant(f,bx);
+ break;
+ case OP_GETUPVAL:
+ case OP_SETUPVAL:
+ printf("\t; %s",UPVALNAME(b));
+ break;
+ case OP_GETTABUP:
+ printf("\t; %s",UPVALNAME(b));
+ if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); }
+ break;
+ case OP_SETTABUP:
+ printf("\t; %s",UPVALNAME(a));
+ if (ISK(b)) { printf(" "); PrintConstant(f,INDEXK(b)); }
+ if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); }
+ break;
+ case OP_GETTABLE:
+ case OP_SELF:
+ if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }
+ break;
+ case OP_SETTABLE:
+ case OP_ADD:
+ case OP_SUB:
+ case OP_MUL:
+ case OP_POW:
+ case OP_DIV:
+ case OP_IDIV:
+ case OP_BAND:
+ case OP_BOR:
+ case OP_BXOR:
+ case OP_SHL:
+ case OP_SHR:
+ case OP_EQ:
+ case OP_LT:
+ case OP_LE:
+ if (ISK(b) || ISK(c))
+ {
+ printf("\t; ");
+ if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");
+ printf(" ");
+ if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");
+ }
+ break;
+ case OP_JMP:
+ case OP_FORLOOP:
+ case OP_FORPREP:
+ case OP_TFORLOOP:
+ printf("\t; to %d",sbx+pc+2);
+ break;
+ case OP_CLOSURE:
+ printf("\t; %p",VOID(f->p[bx]));
+ break;
+ case OP_SETLIST:
+ if (c==0) printf("\t; %d",(int)code[++pc]); else printf("\t; %d",c);
+ break;
+ case OP_EXTRAARG:
+ printf("\t; "); PrintConstant(f,ax);
+ break;
+ default:
+ break;
+ }
+ printf("\n");
+ }
+}
+
+#define SS(x) ((x==1)?"":"s")
+#define S(x) (int)(x),SS(x)
+
+static void PrintHeader(const Proto* f)
+{
+ const char* s=f->source ? getstr(f->source) : "=?";
+ if (*s=='@' || *s=='=')
+ s++;
+ else if (*s==LUA_SIGNATURE[0])
+ s="(bstring)";
+ else
+ s="(string)";
+ printf("\n%s <%s:%d,%d> (%d instruction%s at %p)\n",
+ (f->linedefined==0)?"main":"function",s,
+ f->linedefined,f->lastlinedefined,
+ S(f->sizecode),VOID(f));
+ printf("%d%s param%s, %d slot%s, %d upvalue%s, ",
+ (int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams),
+ S(f->maxstacksize),S(f->sizeupvalues));
+ printf("%d local%s, %d constant%s, %d function%s\n",
+ S(f->sizelocvars),S(f->sizek),S(f->sizep));
+}
+
+static void PrintDebug(const Proto* f)
+{
+ int i,n;
+ n=f->sizek;
+ printf("constants (%d) for %p:\n",n,VOID(f));
+ for (i=0; i<n; i++)
+ {
+ printf("\t%d\t",i+1);
+ PrintConstant(f,i);
+ printf("\n");
+ }
+ n=f->sizelocvars;
+ printf("locals (%d) for %p:\n",n,VOID(f));
+ for (i=0; i<n; i++)
+ {
+ printf("\t%d\t%s\t%d\t%d\n",
+ i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);
+ }
+ n=f->sizeupvalues;
+ printf("upvalues (%d) for %p:\n",n,VOID(f));
+ for (i=0; i<n; i++)
+ {
+ printf("\t%d\t%s\t%d\t%d\n",
+ i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx);
+ }
+}
+
+static void PrintFunction(const Proto* f, int full)
+{
+ int i,n=f->sizep;
+ PrintHeader(f);
+ PrintCode(f);
+ if (full) PrintDebug(f);
+ for (i=0; i<n; i++) PrintFunction(f->p[i],full);
+}
diff --git a/libs/lua/lua-5.3.3/luaconf.h b/libs/lua/lua-5.3.3/luaconf.h
new file mode 100644
index 0000000..fd447cc
--- /dev/null
+++ b/libs/lua/lua-5.3.3/luaconf.h
@@ -0,0 +1,767 @@
+/*
+** $Id: luaconf.h,v 1.255 2016/05/01 20:06:09 roberto Exp $
+** Configuration file for Lua
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef luaconf_h
+#define luaconf_h
+
+#include <limits.h>
+#include <stddef.h>
+
+
+/*
+** ===================================================================
+** Search for "@@" to find all configurable definitions.
+** ===================================================================
+*/
+
+
+/*
+** {====================================================================
+** System Configuration: macros to adapt (if needed) Lua to some
+** particular platform, for instance compiling it with 32-bit numbers or
+** restricting it to C89.
+** =====================================================================
+*/
+
+/*
+@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. You
+** can also define LUA_32BITS in the make file, but changing here you
+** ensure that all software connected to Lua will be compiled with the
+** same configuration.
+*/
+/* #define LUA_32BITS */
+
+
+/*
+@@ LUA_USE_C89 controls the use of non-ISO-C89 features.
+** Define it if you want Lua to avoid the use of a few C99 features
+** or Windows-specific features on Windows.
+*/
+/* #define LUA_USE_C89 */
+
+
+/*
+** By default, Lua on Windows use (some) specific Windows features
+*/
+#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE)
+#define LUA_USE_WINDOWS /* enable goodies for regular Windows */
+#endif
+
+
+#if defined(LUA_USE_WINDOWS)
+#define LUA_DL_DLL /* enable support for DLL */
+#define LUA_USE_C89 /* broadly, Windows is C89 */
+#endif
+
+
+#if defined(LUA_USE_LINUX)
+#define LUA_USE_POSIX
+#define LUA_USE_DLOPEN /* needs an extra library: -ldl */
+#define LUA_USE_READLINE /* needs some extra libraries */
+#endif
+
+
+#if defined(LUA_USE_MACOSX)
+#define LUA_USE_POSIX
+#define LUA_USE_DLOPEN /* MacOS does not need -ldl */
+#define LUA_USE_READLINE /* needs an extra library: -lreadline */
+#endif
+
+
+/*
+@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for
+** C89 ('long' and 'double'); Windows always has '__int64', so it does
+** not need to use this case.
+*/
+#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS)
+#define LUA_C89_NUMBERS
+#endif
+
+
+
+/*
+@@ LUAI_BITSINT defines the (minimum) number of bits in an 'int'.
+*/
+/* avoid undefined shifts */
+#if ((INT_MAX >> 15) >> 15) >= 1
+#define LUAI_BITSINT 32
+#else
+/* 'int' always must have at least 16 bits */
+#define LUAI_BITSINT 16
+#endif
+
+
+/*
+@@ LUA_INT_TYPE defines the type for Lua integers.
+@@ LUA_FLOAT_TYPE defines the type for Lua floats.
+** Lua should work fine with any mix of these options (if supported
+** by your C compiler). The usual configurations are 64-bit integers
+** and 'double' (the default), 32-bit integers and 'float' (for
+** restricted platforms), and 'long'/'double' (for C compilers not
+** compliant with C99, which may not have support for 'long long').
+*/
+
+/* predefined options for LUA_INT_TYPE */
+#define LUA_INT_INT 1
+#define LUA_INT_LONG 2
+#define LUA_INT_LONGLONG 3
+
+/* predefined options for LUA_FLOAT_TYPE */
+#define LUA_FLOAT_FLOAT 1
+#define LUA_FLOAT_DOUBLE 2
+#define LUA_FLOAT_LONGDOUBLE 3
+
+#if defined(LUA_32BITS) /* { */
+/*
+** 32-bit integers and 'float'
+*/
+#if LUAI_BITSINT >= 32 /* use 'int' if big enough */
+#define LUA_INT_TYPE LUA_INT_INT
+#else /* otherwise use 'long' */
+#define LUA_INT_TYPE LUA_INT_LONG
+#endif
+#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT
+
+#elif defined(LUA_C89_NUMBERS) /* }{ */
+/*
+** largest types available for C89 ('long' and 'double')
+*/
+#define LUA_INT_TYPE LUA_INT_LONG
+#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE
+
+#endif /* } */
+
+
+/*
+** default configuration for 64-bit Lua ('long long' and 'double')
+*/
+#if !defined(LUA_INT_TYPE)
+#define LUA_INT_TYPE LUA_INT_LONGLONG
+#endif
+
+#if !defined(LUA_FLOAT_TYPE)
+#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE
+#endif
+
+/* }================================================================== */
+
+
+
+
+/*
+** {==================================================================
+** Configuration for Paths.
+** ===================================================================
+*/
+
+/*
+@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for
+** Lua libraries.
+@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for
+** C libraries.
+** CHANGE them if your machine has a non-conventional directory
+** hierarchy or if you want to install your libraries in
+** non-conventional directories.
+*/
+#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
+#if defined(_WIN32) /* { */
+/*
+** In Windows, any exclamation mark ('!') in the path is replaced by the
+** path of the directory of the executable file of the current process.
+*/
+#define LUA_LDIR "!\\lua\\"
+#define LUA_CDIR "!\\"
+#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\"
+#define LUA_PATH_DEFAULT \
+ LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \
+ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \
+ LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \
+ ".\\?.lua;" ".\\?\\init.lua"
+#define LUA_CPATH_DEFAULT \
+ LUA_CDIR"?.dll;" \
+ LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \
+ LUA_CDIR"loadall.dll;" ".\\?.dll"
+
+#else /* }{ */
+
+#define LUA_ROOT "/usr/local/"
+#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/"
+#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/"
+#define LUA_PATH_DEFAULT \
+ LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \
+ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \
+ "./?.lua;" "./?/init.lua"
+#define LUA_CPATH_DEFAULT \
+ LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so"
+#endif /* } */
+
+
+/*
+@@ LUA_DIRSEP is the directory separator (for submodules).
+** CHANGE it if your machine does not use "/" as the directory separator
+** and is not Windows. (On Windows Lua automatically uses "\".)
+*/
+#if defined(_WIN32)
+#define LUA_DIRSEP "\\"
+#else
+#define LUA_DIRSEP "/"
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Marks for exported symbols in the C code
+** ===================================================================
+*/
+
+/*
+@@ LUA_API is a mark for all core API functions.
+@@ LUALIB_API is a mark for all auxiliary library functions.
+@@ LUAMOD_API is a mark for all standard library opening functions.
+** CHANGE them if you need to define those functions in some special way.
+** For instance, if you want to create one Windows DLL with the core and
+** the libraries, you may want to use the following definition (define
+** LUA_BUILD_AS_DLL to get it).
+*/
+#if defined(LUA_BUILD_AS_DLL) /* { */
+
+#if defined(LUA_CORE) || defined(LUA_LIB) /* { */
+#define LUA_API __declspec(dllexport)
+#else /* }{ */
+#define LUA_API __declspec(dllimport)
+#endif /* } */
+
+#else /* }{ */
+
+#define LUA_API extern
+
+#endif /* } */
+
+
+/* more often than not the libs go together with the core */
+#define LUALIB_API LUA_API
+#define LUAMOD_API LUALIB_API
+
+
+/*
+@@ LUAI_FUNC is a mark for all extern functions that are not to be
+** exported to outside modules.
+@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables
+** that are not to be exported to outside modules (LUAI_DDEF for
+** definitions and LUAI_DDEC for declarations).
+** CHANGE them if you need to mark them in some special way. Elf/gcc
+** (versions 3.2 and later) mark them as "hidden" to optimize access
+** when Lua is compiled as a shared library. Not all elf targets support
+** this attribute. Unfortunately, gcc does not offer a way to check
+** whether the target offers that support, and those without support
+** give a warning about it. To avoid these warnings, change to the
+** default definition.
+*/
+#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \
+ defined(__ELF__) /* { */
+#define LUAI_FUNC __attribute__((visibility("hidden"))) extern
+#else /* }{ */
+#define LUAI_FUNC extern
+#endif /* } */
+
+#define LUAI_DDEC LUAI_FUNC
+#define LUAI_DDEF /* empty */
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Compatibility with previous versions
+** ===================================================================
+*/
+
+/*
+@@ LUA_COMPAT_5_2 controls other macros for compatibility with Lua 5.2.
+@@ LUA_COMPAT_5_1 controls other macros for compatibility with Lua 5.1.
+** You can define it to get all options, or change specific options
+** to fit your specific needs.
+*/
+#if defined(LUA_COMPAT_5_2) /* { */
+
+/*
+@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated
+** functions in the mathematical library.
+*/
+#define LUA_COMPAT_MATHLIB
+
+/*
+@@ LUA_COMPAT_BITLIB controls the presence of library 'bit32'.
+*/
+#define LUA_COMPAT_BITLIB
+
+/*
+@@ LUA_COMPAT_IPAIRS controls the effectiveness of the __ipairs metamethod.
+*/
+#define LUA_COMPAT_IPAIRS
+
+/*
+@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for
+** manipulating other integer types (lua_pushunsigned, lua_tounsigned,
+** luaL_checkint, luaL_checklong, etc.)
+*/
+#define LUA_COMPAT_APIINTCASTS
+
+#endif /* } */
+
+
+#if defined(LUA_COMPAT_5_1) /* { */
+
+/* Incompatibilities from 5.2 -> 5.3 */
+#define LUA_COMPAT_MATHLIB
+#define LUA_COMPAT_APIINTCASTS
+
+/*
+@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'.
+** You can replace it with 'table.unpack'.
+*/
+#define LUA_COMPAT_UNPACK
+
+/*
+@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'.
+** You can replace it with 'package.searchers'.
+*/
+#define LUA_COMPAT_LOADERS
+
+/*
+@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall.
+** You can call your C function directly (with light C functions).
+*/
+#define lua_cpcall(L,f,u) \
+ (lua_pushcfunction(L, (f)), \
+ lua_pushlightuserdata(L,(u)), \
+ lua_pcall(L,1,0,0))
+
+
+/*
+@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library.
+** You can rewrite 'log10(x)' as 'log(x, 10)'.
+*/
+#define LUA_COMPAT_LOG10
+
+/*
+@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base
+** library. You can rewrite 'loadstring(s)' as 'load(s)'.
+*/
+#define LUA_COMPAT_LOADSTRING
+
+/*
+@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library.
+*/
+#define LUA_COMPAT_MAXN
+
+/*
+@@ The following macros supply trivial compatibility for some
+** changes in the API. The macros themselves document how to
+** change your code to avoid using them.
+*/
+#define lua_strlen(L,i) lua_rawlen(L, (i))
+
+#define lua_objlen(L,i) lua_rawlen(L, (i))
+
+#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ)
+#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT)
+
+/*
+@@ LUA_COMPAT_MODULE controls compatibility with previous
+** module functions 'module' (Lua) and 'luaL_register' (C).
+*/
+#define LUA_COMPAT_MODULE
+
+#endif /* } */
+
+
+/*
+@@ LUA_COMPAT_FLOATSTRING makes Lua format integral floats without a
+@@ a float mark ('.0').
+** This macro is not on by default even in compatibility mode,
+** because this is not really an incompatibility.
+*/
+/* #define LUA_COMPAT_FLOATSTRING */
+
+/* }================================================================== */
+
+
+
+/*
+** {==================================================================
+** Configuration for Numbers.
+** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_*
+** satisfy your needs.
+** ===================================================================
+*/
+
+/*
+@@ LUA_NUMBER is the floating-point type used by Lua.
+@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'
+@@ over a floating number.
+@@ l_mathlim(x) corrects limit name 'x' to the proper float type
+** by prefixing it with one of FLT/DBL/LDBL.
+@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats.
+@@ LUA_NUMBER_FMT is the format for writing floats.
+@@ lua_number2str converts a float to a string.
+@@ l_mathop allows the addition of an 'l' or 'f' to all math operations.
+@@ l_floor takes the floor of a float.
+@@ lua_str2number converts a decimal numeric string to a number.
+*/
+
+
+/* The following definitions are good for most cases here */
+
+#define l_floor(x) (l_mathop(floor)(x))
+
+#define lua_number2str(s,sz,n) l_sprintf((s), sz, LUA_NUMBER_FMT, (n))
+
+/*
+@@ lua_numbertointeger converts a float number to an integer, or
+** returns 0 if float is not within the range of a lua_Integer.
+** (The range comparisons are tricky because of rounding. The tests
+** here assume a two-complement representation, where MININTEGER always
+** has an exact representation as a float; MAXINTEGER may not have one,
+** and therefore its conversion to float may have an ill-defined value.)
+*/
+#define lua_numbertointeger(n,p) \
+ ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \
+ (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \
+ (*(p) = (LUA_INTEGER)(n), 1))
+
+
+/* now the variable definitions */
+
+#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */
+
+#define LUA_NUMBER float
+
+#define l_mathlim(n) (FLT_##n)
+
+#define LUAI_UACNUMBER double
+
+#define LUA_NUMBER_FRMLEN ""
+#define LUA_NUMBER_FMT "%.7g"
+
+#define l_mathop(op) op##f
+
+#define lua_str2number(s,p) strtof((s), (p))
+
+
+#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */
+
+#define LUA_NUMBER long double
+
+#define l_mathlim(n) (LDBL_##n)
+
+#define LUAI_UACNUMBER long double
+
+#define LUA_NUMBER_FRMLEN "L"
+#define LUA_NUMBER_FMT "%.19Lg"
+
+#define l_mathop(op) op##l
+
+#define lua_str2number(s,p) strtold((s), (p))
+
+#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */
+
+#define LUA_NUMBER double
+
+#define l_mathlim(n) (DBL_##n)
+
+#define LUAI_UACNUMBER double
+
+#define LUA_NUMBER_FRMLEN ""
+#define LUA_NUMBER_FMT "%.14g"
+
+#define l_mathop(op) op
+
+#define lua_str2number(s,p) strtod((s), (p))
+
+#else /* }{ */
+
+#error "numeric float type not defined"
+
+#endif /* } */
+
+
+
+/*
+@@ LUA_INTEGER is the integer type used by Lua.
+**
+@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER.
+**
+@@ LUAI_UACINT is the result of an 'usual argument conversion'
+@@ over a lUA_INTEGER.
+@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers.
+@@ LUA_INTEGER_FMT is the format for writing integers.
+@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER.
+@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER.
+@@ lua_integer2str converts an integer to a string.
+*/
+
+
+/* The following definitions are good for most cases here */
+
+#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d"
+#define lua_integer2str(s,sz,n) l_sprintf((s), sz, LUA_INTEGER_FMT, (n))
+
+#define LUAI_UACINT LUA_INTEGER
+
+/*
+** use LUAI_UACINT here to avoid problems with promotions (which
+** can turn a comparison between unsigneds into a signed comparison)
+*/
+#define LUA_UNSIGNED unsigned LUAI_UACINT
+
+
+/* now the variable definitions */
+
+#if LUA_INT_TYPE == LUA_INT_INT /* { int */
+
+#define LUA_INTEGER int
+#define LUA_INTEGER_FRMLEN ""
+
+#define LUA_MAXINTEGER INT_MAX
+#define LUA_MININTEGER INT_MIN
+
+#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */
+
+#define LUA_INTEGER long
+#define LUA_INTEGER_FRMLEN "l"
+
+#define LUA_MAXINTEGER LONG_MAX
+#define LUA_MININTEGER LONG_MIN
+
+#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */
+
+/* use presence of macro LLONG_MAX as proxy for C99 compliance */
+#if defined(LLONG_MAX) /* { */
+/* use ISO C99 stuff */
+
+#define LUA_INTEGER long long
+#define LUA_INTEGER_FRMLEN "ll"
+
+#define LUA_MAXINTEGER LLONG_MAX
+#define LUA_MININTEGER LLONG_MIN
+
+#elif defined(LUA_USE_WINDOWS) /* }{ */
+/* in Windows, can use specific Windows types */
+
+#define LUA_INTEGER __int64
+#define LUA_INTEGER_FRMLEN "I64"
+
+#define LUA_MAXINTEGER _I64_MAX
+#define LUA_MININTEGER _I64_MIN
+
+#else /* }{ */
+
+#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \
+ or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)"
+
+#endif /* } */
+
+#else /* }{ */
+
+#error "numeric integer type not defined"
+
+#endif /* } */
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Dependencies with C99 and other C details
+** ===================================================================
+*/
+
+/*
+@@ l_sprintf is equivalent to 'snprintf' or 'sprintf' in C89.
+** (All uses in Lua have only one format item.)
+*/
+#if !defined(LUA_USE_C89)
+#define l_sprintf(s,sz,f,i) snprintf(s,sz,f,i)
+#else
+#define l_sprintf(s,sz,f,i) ((void)(sz), sprintf(s,f,i))
+#endif
+
+
+/*
+@@ lua_strx2number converts an hexadecimal numeric string to a number.
+** In C99, 'strtod' does that conversion. Otherwise, you can
+** leave 'lua_strx2number' undefined and Lua will provide its own
+** implementation.
+*/
+#if !defined(LUA_USE_C89)
+#define lua_strx2number(s,p) lua_str2number(s,p)
+#endif
+
+
+/*
+@@ lua_number2strx converts a float to an hexadecimal numeric string.
+** In C99, 'sprintf' (with format specifiers '%a'/'%A') does that.
+** Otherwise, you can leave 'lua_number2strx' undefined and Lua will
+** provide its own implementation.
+*/
+#if !defined(LUA_USE_C89)
+#define lua_number2strx(L,b,sz,f,n) ((void)L, l_sprintf(b,sz,f,n))
+#endif
+
+
+/*
+** 'strtof' and 'opf' variants for math functions are not valid in
+** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the
+** availability of these variants. ('math.h' is already included in
+** all files that use these macros.)
+*/
+#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF))
+#undef l_mathop /* variants not available */
+#undef lua_str2number
+#define l_mathop(op) (lua_Number)op /* no variant */
+#define lua_str2number(s,p) ((lua_Number)strtod((s), (p)))
+#endif
+
+
+/*
+@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation
+** functions. It must be a numerical type; Lua will use 'intptr_t' if
+** available, otherwise it will use 'ptrdiff_t' (the nearest thing to
+** 'intptr_t' in C89)
+*/
+#define LUA_KCONTEXT ptrdiff_t
+
+#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \
+ __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+#if defined(INTPTR_MAX) /* even in C99 this type is optional */
+#undef LUA_KCONTEXT
+#define LUA_KCONTEXT intptr_t
+#endif
+#endif
+
+
+/*
+@@ lua_getlocaledecpoint gets the locale "radix character" (decimal point).
+** Change that if you do not want to use C locales. (Code using this
+** macro must include header 'locale.h'.)
+*/
+#if !defined(lua_getlocaledecpoint)
+#define lua_getlocaledecpoint() (localeconv()->decimal_point[0])
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Language Variations
+** =====================================================================
+*/
+
+/*
+@@ LUA_NOCVTN2S/LUA_NOCVTS2N control how Lua performs some
+** coercions. Define LUA_NOCVTN2S to turn off automatic coercion from
+** numbers to strings. Define LUA_NOCVTS2N to turn off automatic
+** coercion from strings to numbers.
+*/
+/* #define LUA_NOCVTN2S */
+/* #define LUA_NOCVTS2N */
+
+
+/*
+@@ LUA_USE_APICHECK turns on several consistency checks on the C API.
+** Define it as a help when debugging C code.
+*/
+#if defined(LUA_USE_APICHECK)
+#include <assert.h>
+#define luai_apicheck(l,e) assert(e)
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Macros that affect the API and must be stable (that is, must be the
+** same when you compile Lua and when you compile code that links to
+** Lua). You probably do not want/need to change them.
+** =====================================================================
+*/
+
+/*
+@@ LUAI_MAXSTACK limits the size of the Lua stack.
+** CHANGE it if you need a different limit. This limit is arbitrary;
+** its only purpose is to stop Lua from consuming unlimited stack
+** space (and to reserve some numbers for pseudo-indices).
+*/
+#if LUAI_BITSINT >= 32
+#define LUAI_MAXSTACK 1000000
+#else
+#define LUAI_MAXSTACK 15000
+#endif
+
+
+/*
+@@ LUA_EXTRASPACE defines the size of a raw memory area associated with
+** a Lua state with very fast access.
+** CHANGE it if you need a different size.
+*/
+#define LUA_EXTRASPACE (sizeof(void *))
+
+
+/*
+@@ LUA_IDSIZE gives the maximum size for the description of the source
+@@ of a function in debug information.
+** CHANGE it if you want a different size.
+*/
+#define LUA_IDSIZE 60
+
+
+/*
+@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.
+** CHANGE it if it uses too much C-stack space. (For long double,
+** 'string.format("%.99f", 1e4932)' needs ~5030 bytes, so a
+** smaller buffer would force a memory allocation for each call to
+** 'string.format'.)
+*/
+#if defined(LUA_FLOAT_LONGDOUBLE)
+#define LUAL_BUFFERSIZE 8192
+#else
+#define LUAL_BUFFERSIZE ((int)(0x80 * sizeof(void*) * sizeof(lua_Integer)))
+#endif
+
+/* }================================================================== */
+
+
+/*
+@@ LUA_QL describes how error messages quote program elements.
+** Lua does not use these macros anymore; they are here for
+** compatibility only.
+*/
+#define LUA_QL(x) "'" x "'"
+#define LUA_QS LUA_QL("%s")
+
+
+
+
+/* =================================================================== */
+
+/*
+** Local configuration. You can use this space to add your redefinitions
+** without modifying the main part of the file.
+*/
+
+
+
+
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lualib.h b/libs/lua/lua-5.3.3/lualib.h
new file mode 100644
index 0000000..5165c0f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lualib.h
@@ -0,0 +1,58 @@
+/*
+** $Id: lualib.h,v 1.44 2014/02/06 17:32:33 roberto Exp $
+** Lua standard libraries
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lualib_h
+#define lualib_h
+
+#include "lua.h"
+
+
+
+LUAMOD_API int (luaopen_base) (lua_State *L);
+
+#define LUA_COLIBNAME "coroutine"
+LUAMOD_API int (luaopen_coroutine) (lua_State *L);
+
+#define LUA_TABLIBNAME "table"
+LUAMOD_API int (luaopen_table) (lua_State *L);
+
+#define LUA_IOLIBNAME "io"
+LUAMOD_API int (luaopen_io) (lua_State *L);
+
+#define LUA_OSLIBNAME "os"
+LUAMOD_API int (luaopen_os) (lua_State *L);
+
+#define LUA_STRLIBNAME "string"
+LUAMOD_API int (luaopen_string) (lua_State *L);
+
+#define LUA_UTF8LIBNAME "utf8"
+LUAMOD_API int (luaopen_utf8) (lua_State *L);
+
+#define LUA_BITLIBNAME "bit32"
+LUAMOD_API int (luaopen_bit32) (lua_State *L);
+
+#define LUA_MATHLIBNAME "math"
+LUAMOD_API int (luaopen_math) (lua_State *L);
+
+#define LUA_DBLIBNAME "debug"
+LUAMOD_API int (luaopen_debug) (lua_State *L);
+
+#define LUA_LOADLIBNAME "package"
+LUAMOD_API int (luaopen_package) (lua_State *L);
+
+
+/* open all previous libraries */
+LUALIB_API void (luaL_openlibs) (lua_State *L);
+
+
+
+#if !defined(lua_assert)
+#define lua_assert(x) ((void)0)
+#endif
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lundump.c b/libs/lua/lua-5.3.3/lundump.c
new file mode 100644
index 0000000..4080af9
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lundump.c
@@ -0,0 +1,279 @@
+/*
+** $Id: lundump.c,v 2.44 2015/11/02 16:09:30 roberto Exp $
+** load precompiled Lua chunks
+** See Copyright Notice in lua.h
+*/
+
+#define lundump_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstring.h"
+#include "lundump.h"
+#include "lzio.h"
+
+
+#if !defined(luai_verifycode)
+#define luai_verifycode(L,b,f) /* empty */
+#endif
+
+
+typedef struct {
+ lua_State *L;
+ ZIO *Z;
+ const char *name;
+} LoadState;
+
+
+static l_noret error(LoadState *S, const char *why) {
+ luaO_pushfstring(S->L, "%s: %s precompiled chunk", S->name, why);
+ luaD_throw(S->L, LUA_ERRSYNTAX);
+}
+
+
+/*
+** All high-level loads go through LoadVector; you can change it to
+** adapt to the endianness of the input
+*/
+#define LoadVector(S,b,n) LoadBlock(S,b,(n)*sizeof((b)[0]))
+
+static void LoadBlock (LoadState *S, void *b, size_t size) {
+ if (luaZ_read(S->Z, b, size) != 0)
+ error(S, "truncated");
+}
+
+
+#define LoadVar(S,x) LoadVector(S,&x,1)
+
+
+static lu_byte LoadByte (LoadState *S) {
+ lu_byte x;
+ LoadVar(S, x);
+ return x;
+}
+
+
+static int LoadInt (LoadState *S) {
+ int x;
+ LoadVar(S, x);
+ return x;
+}
+
+
+static lua_Number LoadNumber (LoadState *S) {
+ lua_Number x;
+ LoadVar(S, x);
+ return x;
+}
+
+
+static lua_Integer LoadInteger (LoadState *S) {
+ lua_Integer x;
+ LoadVar(S, x);
+ return x;
+}
+
+
+static TString *LoadString (LoadState *S) {
+ size_t size = LoadByte(S);
+ if (size == 0xFF)
+ LoadVar(S, size);
+ if (size == 0)
+ return NULL;
+ else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */
+ char buff[LUAI_MAXSHORTLEN];
+ LoadVector(S, buff, size);
+ return luaS_newlstr(S->L, buff, size);
+ }
+ else { /* long string */
+ TString *ts = luaS_createlngstrobj(S->L, size);
+ LoadVector(S, getstr(ts), size); /* load directly in final place */
+ return ts;
+ }
+}
+
+
+static void LoadCode (LoadState *S, Proto *f) {
+ int n = LoadInt(S);
+ f->code = luaM_newvector(S->L, n, Instruction);
+ f->sizecode = n;
+ LoadVector(S, f->code, n);
+}
+
+
+static void LoadFunction(LoadState *S, Proto *f, TString *psource);
+
+
+static void LoadConstants (LoadState *S, Proto *f) {
+ int i;
+ int n = LoadInt(S);
+ f->k = luaM_newvector(S->L, n, TValue);
+ f->sizek = n;
+ for (i = 0; i < n; i++)
+ setnilvalue(&f->k[i]);
+ for (i = 0; i < n; i++) {
+ TValue *o = &f->k[i];
+ int t = LoadByte(S);
+ switch (t) {
+ case LUA_TNIL:
+ setnilvalue(o);
+ break;
+ case LUA_TBOOLEAN:
+ setbvalue(o, LoadByte(S));
+ break;
+ case LUA_TNUMFLT:
+ setfltvalue(o, LoadNumber(S));
+ break;
+ case LUA_TNUMINT:
+ setivalue(o, LoadInteger(S));
+ break;
+ case LUA_TSHRSTR:
+ case LUA_TLNGSTR:
+ setsvalue2n(S->L, o, LoadString(S));
+ break;
+ default:
+ lua_assert(0);
+ }
+ }
+}
+
+
+static void LoadProtos (LoadState *S, Proto *f) {
+ int i;
+ int n = LoadInt(S);
+ f->p = luaM_newvector(S->L, n, Proto *);
+ f->sizep = n;
+ for (i = 0; i < n; i++)
+ f->p[i] = NULL;
+ for (i = 0; i < n; i++) {
+ f->p[i] = luaF_newproto(S->L);
+ LoadFunction(S, f->p[i], f->source);
+ }
+}
+
+
+static void LoadUpvalues (LoadState *S, Proto *f) {
+ int i, n;
+ n = LoadInt(S);
+ f->upvalues = luaM_newvector(S->L, n, Upvaldesc);
+ f->sizeupvalues = n;
+ for (i = 0; i < n; i++)
+ f->upvalues[i].name = NULL;
+ for (i = 0; i < n; i++) {
+ f->upvalues[i].instack = LoadByte(S);
+ f->upvalues[i].idx = LoadByte(S);
+ }
+}
+
+
+static void LoadDebug (LoadState *S, Proto *f) {
+ int i, n;
+ n = LoadInt(S);
+ f->lineinfo = luaM_newvector(S->L, n, int);
+ f->sizelineinfo = n;
+ LoadVector(S, f->lineinfo, n);
+ n = LoadInt(S);
+ f->locvars = luaM_newvector(S->L, n, LocVar);
+ f->sizelocvars = n;
+ for (i = 0; i < n; i++)
+ f->locvars[i].varname = NULL;
+ for (i = 0; i < n; i++) {
+ f->locvars[i].varname = LoadString(S);
+ f->locvars[i].startpc = LoadInt(S);
+ f->locvars[i].endpc = LoadInt(S);
+ }
+ n = LoadInt(S);
+ for (i = 0; i < n; i++)
+ f->upvalues[i].name = LoadString(S);
+}
+
+
+static void LoadFunction (LoadState *S, Proto *f, TString *psource) {
+ f->source = LoadString(S);
+ if (f->source == NULL) /* no source in dump? */
+ f->source = psource; /* reuse parent's source */
+ f->linedefined = LoadInt(S);
+ f->lastlinedefined = LoadInt(S);
+ f->numparams = LoadByte(S);
+ f->is_vararg = LoadByte(S);
+ f->maxstacksize = LoadByte(S);
+ LoadCode(S, f);
+ LoadConstants(S, f);
+ LoadUpvalues(S, f);
+ LoadProtos(S, f);
+ LoadDebug(S, f);
+}
+
+
+static void checkliteral (LoadState *S, const char *s, const char *msg) {
+ char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */
+ size_t len = strlen(s);
+ LoadVector(S, buff, len);
+ if (memcmp(s, buff, len) != 0)
+ error(S, msg);
+}
+
+
+static void fchecksize (LoadState *S, size_t size, const char *tname) {
+ if (LoadByte(S) != size)
+ error(S, luaO_pushfstring(S->L, "%s size mismatch in", tname));
+}
+
+
+#define checksize(S,t) fchecksize(S,sizeof(t),#t)
+
+static void checkHeader (LoadState *S) {
+ checkliteral(S, LUA_SIGNATURE + 1, "not a"); /* 1st char already checked */
+ if (LoadByte(S) != LUAC_VERSION)
+ error(S, "version mismatch in");
+ if (LoadByte(S) != LUAC_FORMAT)
+ error(S, "format mismatch in");
+ checkliteral(S, LUAC_DATA, "corrupted");
+ checksize(S, int);
+ checksize(S, size_t);
+ checksize(S, Instruction);
+ checksize(S, lua_Integer);
+ checksize(S, lua_Number);
+ if (LoadInteger(S) != LUAC_INT)
+ error(S, "endianness mismatch in");
+ if (LoadNumber(S) != LUAC_NUM)
+ error(S, "float format mismatch in");
+}
+
+
+/*
+** load precompiled chunk
+*/
+LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {
+ LoadState S;
+ LClosure *cl;
+ if (*name == '@' || *name == '=')
+ S.name = name + 1;
+ else if (*name == LUA_SIGNATURE[0])
+ S.name = "binary string";
+ else
+ S.name = name;
+ S.L = L;
+ S.Z = Z;
+ checkHeader(&S);
+ cl = luaF_newLclosure(L, LoadByte(&S));
+ setclLvalue(L, L->top, cl);
+ luaD_inctop(L);
+ cl->p = luaF_newproto(L);
+ LoadFunction(&S, cl->p, NULL);
+ lua_assert(cl->nupvalues == cl->p->sizeupvalues);
+ luai_verifycode(L, buff, cl->p);
+ return cl;
+}
+
diff --git a/libs/lua/lua-5.3.3/lundump.h b/libs/lua/lua-5.3.3/lundump.h
new file mode 100644
index 0000000..aa5cc82
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lundump.h
@@ -0,0 +1,32 @@
+/*
+** $Id: lundump.h,v 1.45 2015/09/08 15:41:05 roberto Exp $
+** load precompiled Lua chunks
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lundump_h
+#define lundump_h
+
+#include "llimits.h"
+#include "lobject.h"
+#include "lzio.h"
+
+
+/* data to catch conversion errors */
+#define LUAC_DATA "\x19\x93\r\n\x1a\n"
+
+#define LUAC_INT 0x5678
+#define LUAC_NUM cast_num(370.5)
+
+#define MYINT(s) (s[0]-'0')
+#define LUAC_VERSION (MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR))
+#define LUAC_FORMAT 0 /* this is the official format */
+
+/* load one chunk; from lundump.c */
+LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name);
+
+/* dump one chunk; from ldump.c */
+LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w,
+ void* data, int strip);
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lutf8lib.c b/libs/lua/lua-5.3.3/lutf8lib.c
new file mode 100644
index 0000000..9042582
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lutf8lib.c
@@ -0,0 +1,256 @@
+/*
+** $Id: lutf8lib.c,v 1.15 2015/03/28 19:16:55 roberto Exp $
+** Standard library for UTF-8 manipulation
+** See Copyright Notice in lua.h
+*/
+
+#define lutf8lib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <assert.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+#define MAXUNICODE 0x10FFFF
+
+#define iscont(p) ((*(p) & 0xC0) == 0x80)
+
+
+/* from strlib */
+/* translate a relative string position: negative means back from end */
+static lua_Integer u_posrelat (lua_Integer pos, size_t len) {
+ if (pos >= 0) return pos;
+ else if (0u - (size_t)pos > len) return 0;
+ else return (lua_Integer)len + pos + 1;
+}
+
+
+/*
+** Decode one UTF-8 sequence, returning NULL if byte sequence is invalid.
+*/
+static const char *utf8_decode (const char *o, int *val) {
+ static const unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF};
+ const unsigned char *s = (const unsigned char *)o;
+ unsigned int c = s[0];
+ unsigned int res = 0; /* final result */
+ if (c < 0x80) /* ascii? */
+ res = c;
+ else {
+ int count = 0; /* to count number of continuation bytes */
+ while (c & 0x40) { /* still have continuation bytes? */
+ int cc = s[++count]; /* read next byte */
+ if ((cc & 0xC0) != 0x80) /* not a continuation byte? */
+ return NULL; /* invalid byte sequence */
+ res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */
+ c <<= 1; /* to test next bit */
+ }
+ res |= ((c & 0x7F) << (count * 5)); /* add first byte */
+ if (count > 3 || res > MAXUNICODE || res <= limits[count])
+ return NULL; /* invalid byte sequence */
+ s += count; /* skip continuation bytes read */
+ }
+ if (val) *val = res;
+ return (const char *)s + 1; /* +1 to include first byte */
+}
+
+
+/*
+** utf8len(s [, i [, j]]) --> number of characters that start in the
+** range [i,j], or nil + current position if 's' is not well formed in
+** that interval
+*/
+static int utflen (lua_State *L) {
+ int n = 0;
+ size_t len;
+ const char *s = luaL_checklstring(L, 1, &len);
+ lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);
+ lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len);
+ luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2,
+ "initial position out of string");
+ luaL_argcheck(L, --posj < (lua_Integer)len, 3,
+ "final position out of string");
+ while (posi <= posj) {
+ const char *s1 = utf8_decode(s + posi, NULL);
+ if (s1 == NULL) { /* conversion error? */
+ lua_pushnil(L); /* return nil ... */
+ lua_pushinteger(L, posi + 1); /* ... and current position */
+ return 2;
+ }
+ posi = s1 - s;
+ n++;
+ }
+ lua_pushinteger(L, n);
+ return 1;
+}
+
+
+/*
+** codepoint(s, [i, [j]]) -> returns codepoints for all characters
+** that start in the range [i,j]
+*/
+static int codepoint (lua_State *L) {
+ size_t len;
+ const char *s = luaL_checklstring(L, 1, &len);
+ lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);
+ lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len);
+ int n;
+ const char *se;
+ luaL_argcheck(L, posi >= 1, 2, "out of range");
+ luaL_argcheck(L, pose <= (lua_Integer)len, 3, "out of range");
+ if (posi > pose) return 0; /* empty interval; return no values */
+ if (pose - posi >= INT_MAX) /* (lua_Integer -> int) overflow? */
+ return luaL_error(L, "string slice too long");
+ n = (int)(pose - posi) + 1;
+ luaL_checkstack(L, n, "string slice too long");
+ n = 0;
+ se = s + pose;
+ for (s += posi - 1; s < se;) {
+ int code;
+ s = utf8_decode(s, &code);
+ if (s == NULL)
+ return luaL_error(L, "invalid UTF-8 code");
+ lua_pushinteger(L, code);
+ n++;
+ }
+ return n;
+}
+
+
+static void pushutfchar (lua_State *L, int arg) {
+ lua_Integer code = luaL_checkinteger(L, arg);
+ luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, "value out of range");
+ lua_pushfstring(L, "%U", (long)code);
+}
+
+
+/*
+** utfchar(n1, n2, ...) -> char(n1)..char(n2)...
+*/
+static int utfchar (lua_State *L) {
+ int n = lua_gettop(L); /* number of arguments */
+ if (n == 1) /* optimize common case of single char */
+ pushutfchar(L, 1);
+ else {
+ int i;
+ luaL_Buffer b;
+ luaL_buffinit(L, &b);
+ for (i = 1; i <= n; i++) {
+ pushutfchar(L, i);
+ luaL_addvalue(&b);
+ }
+ luaL_pushresult(&b);
+ }
+ return 1;
+}
+
+
+/*
+** offset(s, n, [i]) -> index where n-th character counting from
+** position 'i' starts; 0 means character at 'i'.
+*/
+static int byteoffset (lua_State *L) {
+ size_t len;
+ const char *s = luaL_checklstring(L, 1, &len);
+ lua_Integer n = luaL_checkinteger(L, 2);
+ lua_Integer posi = (n >= 0) ? 1 : len + 1;
+ posi = u_posrelat(luaL_optinteger(L, 3, posi), len);
+ luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3,
+ "position out of range");
+ if (n == 0) {
+ /* find beginning of current byte sequence */
+ while (posi > 0 && iscont(s + posi)) posi--;
+ }
+ else {
+ if (iscont(s + posi))
+ luaL_error(L, "initial position is a continuation byte");
+ if (n < 0) {
+ while (n < 0 && posi > 0) { /* move back */
+ do { /* find beginning of previous character */
+ posi--;
+ } while (posi > 0 && iscont(s + posi));
+ n++;
+ }
+ }
+ else {
+ n--; /* do not move for 1st character */
+ while (n > 0 && posi < (lua_Integer)len) {
+ do { /* find beginning of next character */
+ posi++;
+ } while (iscont(s + posi)); /* (cannot pass final '\0') */
+ n--;
+ }
+ }
+ }
+ if (n == 0) /* did it find given character? */
+ lua_pushinteger(L, posi + 1);
+ else /* no such character */
+ lua_pushnil(L);
+ return 1;
+}
+
+
+static int iter_aux (lua_State *L) {
+ size_t len;
+ const char *s = luaL_checklstring(L, 1, &len);
+ lua_Integer n = lua_tointeger(L, 2) - 1;
+ if (n < 0) /* first iteration? */
+ n = 0; /* start from here */
+ else if (n < (lua_Integer)len) {
+ n++; /* skip current byte */
+ while (iscont(s + n)) n++; /* and its continuations */
+ }
+ if (n >= (lua_Integer)len)
+ return 0; /* no more codepoints */
+ else {
+ int code;
+ const char *next = utf8_decode(s + n, &code);
+ if (next == NULL || iscont(next))
+ return luaL_error(L, "invalid UTF-8 code");
+ lua_pushinteger(L, n + 1);
+ lua_pushinteger(L, code);
+ return 2;
+ }
+}
+
+
+static int iter_codes (lua_State *L) {
+ luaL_checkstring(L, 1);
+ lua_pushcfunction(L, iter_aux);
+ lua_pushvalue(L, 1);
+ lua_pushinteger(L, 0);
+ return 3;
+}
+
+
+/* pattern to match a single UTF-8 character */
+#define UTF8PATT "[\0-\x7F\xC2-\xF4][\x80-\xBF]*"
+
+
+static const luaL_Reg funcs[] = {
+ {"offset", byteoffset},
+ {"codepoint", codepoint},
+ {"char", utfchar},
+ {"len", utflen},
+ {"codes", iter_codes},
+ /* placeholders */
+ {"charpattern", NULL},
+ {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_utf8 (lua_State *L) {
+ luaL_newlib(L, funcs);
+ lua_pushlstring(L, UTF8PATT, sizeof(UTF8PATT)/sizeof(char) - 1);
+ lua_setfield(L, -2, "charpattern");
+ return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lvm.c b/libs/lua/lua-5.3.3/lvm.c
new file mode 100644
index 0000000..84ade6b
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lvm.c
@@ -0,0 +1,1322 @@
+/*
+** $Id: lvm.c,v 2.268 2016/02/05 19:59:14 roberto Exp $
+** Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#define lvm_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lvm.h"
+
+
+/* limit for table tag-method chains (to avoid loops) */
+#define MAXTAGLOOP 2000
+
+
+
+/*
+** 'l_intfitsf' checks whether a given integer can be converted to a
+** float without rounding. Used in comparisons. Left undefined if
+** all integers fit in a float precisely.
+*/
+#if !defined(l_intfitsf)
+
+/* number of bits in the mantissa of a float */
+#define NBM (l_mathlim(MANT_DIG))
+
+/*
+** Check whether some integers may not fit in a float, that is, whether
+** (maxinteger >> NBM) > 0 (that implies (1 << NBM) <= maxinteger).
+** (The shifts are done in parts to avoid shifting by more than the size
+** of an integer. In a worst case, NBM == 113 for long double and
+** sizeof(integer) == 32.)
+*/
+#if ((((LUA_MAXINTEGER >> (NBM / 4)) >> (NBM / 4)) >> (NBM / 4)) \
+ >> (NBM - (3 * (NBM / 4)))) > 0
+
+#define l_intfitsf(i) \
+ (-((lua_Integer)1 << NBM) <= (i) && (i) <= ((lua_Integer)1 << NBM))
+
+#endif
+
+#endif
+
+
+
+/*
+** Try to convert a value to a float. The float case is already handled
+** by the macro 'tonumber'.
+*/
+int luaV_tonumber_ (const TValue *obj, lua_Number *n) {
+ TValue v;
+ if (ttisinteger(obj)) {
+ *n = cast_num(ivalue(obj));
+ return 1;
+ }
+ else if (cvt2num(obj) && /* string convertible to number? */
+ luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) {
+ *n = nvalue(&v); /* convert result of 'luaO_str2num' to a float */
+ return 1;
+ }
+ else
+ return 0; /* conversion failed */
+}
+
+
+/*
+** try to convert a value to an integer, rounding according to 'mode':
+** mode == 0: accepts only integral values
+** mode == 1: takes the floor of the number
+** mode == 2: takes the ceil of the number
+*/
+int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode) {
+ TValue v;
+ again:
+ if (ttisfloat(obj)) {
+ lua_Number n = fltvalue(obj);
+ lua_Number f = l_floor(n);
+ if (n != f) { /* not an integral value? */
+ if (mode == 0) return 0; /* fails if mode demands integral value */
+ else if (mode > 1) /* needs ceil? */
+ f += 1; /* convert floor to ceil (remember: n != f) */
+ }
+ return lua_numbertointeger(f, p);
+ }
+ else if (ttisinteger(obj)) {
+ *p = ivalue(obj);
+ return 1;
+ }
+ else if (cvt2num(obj) &&
+ luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) {
+ obj = &v;
+ goto again; /* convert result from 'luaO_str2num' to an integer */
+ }
+ return 0; /* conversion failed */
+}
+
+
+/*
+** Try to convert a 'for' limit to an integer, preserving the
+** semantics of the loop.
+** (The following explanation assumes a non-negative step; it is valid
+** for negative steps mutatis mutandis.)
+** If the limit can be converted to an integer, rounding down, that is
+** it.
+** Otherwise, check whether the limit can be converted to a number. If
+** the number is too large, it is OK to set the limit as LUA_MAXINTEGER,
+** which means no limit. If the number is too negative, the loop
+** should not run, because any initial integer value is larger than the
+** limit. So, it sets the limit to LUA_MININTEGER. 'stopnow' corrects
+** the extreme case when the initial value is LUA_MININTEGER, in which
+** case the LUA_MININTEGER limit would still run the loop once.
+*/
+static int forlimit (const TValue *obj, lua_Integer *p, lua_Integer step,
+ int *stopnow) {
+ *stopnow = 0; /* usually, let loops run */
+ if (!luaV_tointeger(obj, p, (step < 0 ? 2 : 1))) { /* not fit in integer? */
+ lua_Number n; /* try to convert to float */
+ if (!tonumber(obj, &n)) /* cannot convert to float? */
+ return 0; /* not a number */
+ if (luai_numlt(0, n)) { /* if true, float is larger than max integer */
+ *p = LUA_MAXINTEGER;
+ if (step < 0) *stopnow = 1;
+ }
+ else { /* float is smaller than min integer */
+ *p = LUA_MININTEGER;
+ if (step >= 0) *stopnow = 1;
+ }
+ }
+ return 1;
+}
+
+
+/*
+** Finish the table access 'val = t[key]'.
+** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to
+** t[k] entry (which must be nil).
+*/
+void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val,
+ const TValue *slot) {
+ int loop; /* counter to avoid infinite loops */
+ const TValue *tm; /* metamethod */
+ for (loop = 0; loop < MAXTAGLOOP; loop++) {
+ if (slot == NULL) { /* 't' is not a table? */
+ lua_assert(!ttistable(t));
+ tm = luaT_gettmbyobj(L, t, TM_INDEX);
+ if (ttisnil(tm))
+ luaG_typeerror(L, t, "index"); /* no metamethod */
+ /* else will try the metamethod */
+ }
+ else { /* 't' is a table */
+ lua_assert(ttisnil(slot));
+ tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */
+ if (tm == NULL) { /* no metamethod? */
+ setnilvalue(val); /* result is nil */
+ return;
+ }
+ /* else will try the metamethod */
+ }
+ if (ttisfunction(tm)) { /* is metamethod a function? */
+ luaT_callTM(L, tm, t, key, val, 1); /* call it */
+ return;
+ }
+ t = tm; /* else try to access 'tm[key]' */
+ if (luaV_fastget(L,t,key,slot,luaH_get)) { /* fast track? */
+ setobj2s(L, val, slot); /* done */
+ return;
+ }
+ /* else repeat (tail call 'luaV_finishget') */
+ }
+ luaG_runerror(L, "'__index' chain too long; possible loop");
+}
+
+
+/*
+** Finish a table assignment 't[key] = val'.
+** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points
+** to the entry 't[key]', or to 'luaO_nilobject' if there is no such
+** entry. (The value at 'slot' must be nil, otherwise 'luaV_fastset'
+** would have done the job.)
+*/
+void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
+ StkId val, const TValue *slot) {
+ int loop; /* counter to avoid infinite loops */
+ for (loop = 0; loop < MAXTAGLOOP; loop++) {
+ const TValue *tm; /* '__newindex' metamethod */
+ if (slot != NULL) { /* is 't' a table? */
+ Table *h = hvalue(t); /* save 't' table */
+ lua_assert(ttisnil(slot)); /* old value must be nil */
+ tm = fasttm(L, h->metatable, TM_NEWINDEX); /* get metamethod */
+ if (tm == NULL) { /* no metamethod? */
+ if (slot == luaO_nilobject) /* no previous entry? */
+ slot = luaH_newkey(L, h, key); /* create one */
+ /* no metamethod and (now) there is an entry with given key */
+ setobj2t(L, cast(TValue *, slot), val); /* set its new value */
+ invalidateTMcache(h);
+ luaC_barrierback(L, h, val);
+ return;
+ }
+ /* else will try the metamethod */
+ }
+ else { /* not a table; check metamethod */
+ if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))
+ luaG_typeerror(L, t, "index");
+ }
+ /* try the metamethod */
+ if (ttisfunction(tm)) {
+ luaT_callTM(L, tm, t, key, val, 0);
+ return;
+ }
+ t = tm; /* else repeat assignment over 'tm' */
+ if (luaV_fastset(L, t, key, slot, luaH_get, val))
+ return; /* done */
+ /* else loop */
+ }
+ luaG_runerror(L, "'__newindex' chain too long; possible loop");
+}
+
+
+/*
+** Compare two strings 'ls' x 'rs', returning an integer smaller-equal-
+** -larger than zero if 'ls' is smaller-equal-larger than 'rs'.
+** The code is a little tricky because it allows '\0' in the strings
+** and it uses 'strcoll' (to respect locales) for each segments
+** of the strings.
+*/
+static int l_strcmp (const TString *ls, const TString *rs) {
+ const char *l = getstr(ls);
+ size_t ll = tsslen(ls);
+ const char *r = getstr(rs);
+ size_t lr = tsslen(rs);
+ for (;;) { /* for each segment */
+ int temp = strcoll(l, r);
+ if (temp != 0) /* not equal? */
+ return temp; /* done */
+ else { /* strings are equal up to a '\0' */
+ size_t len = strlen(l); /* index of first '\0' in both strings */
+ if (len == lr) /* 'rs' is finished? */
+ return (len == ll) ? 0 : 1; /* check 'ls' */
+ else if (len == ll) /* 'ls' is finished? */
+ return -1; /* 'ls' is smaller than 'rs' ('rs' is not finished) */
+ /* both strings longer than 'len'; go on comparing after the '\0' */
+ len++;
+ l += len; ll -= len; r += len; lr -= len;
+ }
+ }
+}
+
+
+/*
+** Check whether integer 'i' is less than float 'f'. If 'i' has an
+** exact representation as a float ('l_intfitsf'), compare numbers as
+** floats. Otherwise, if 'f' is outside the range for integers, result
+** is trivial. Otherwise, compare them as integers. (When 'i' has no
+** float representation, either 'f' is "far away" from 'i' or 'f' has
+** no precision left for a fractional part; either way, how 'f' is
+** truncated is irrelevant.) When 'f' is NaN, comparisons must result
+** in false.
+*/
+static int LTintfloat (lua_Integer i, lua_Number f) {
+#if defined(l_intfitsf)
+ if (!l_intfitsf(i)) {
+ if (f >= -cast_num(LUA_MININTEGER)) /* -minint == maxint + 1 */
+ return 1; /* f >= maxint + 1 > i */
+ else if (f > cast_num(LUA_MININTEGER)) /* minint < f <= maxint ? */
+ return (i < cast(lua_Integer, f)); /* compare them as integers */
+ else /* f <= minint <= i (or 'f' is NaN) --> not(i < f) */
+ return 0;
+ }
+#endif
+ return luai_numlt(cast_num(i), f); /* compare them as floats */
+}
+
+
+/*
+** Check whether integer 'i' is less than or equal to float 'f'.
+** See comments on previous function.
+*/
+static int LEintfloat (lua_Integer i, lua_Number f) {
+#if defined(l_intfitsf)
+ if (!l_intfitsf(i)) {
+ if (f >= -cast_num(LUA_MININTEGER)) /* -minint == maxint + 1 */
+ return 1; /* f >= maxint + 1 > i */
+ else if (f >= cast_num(LUA_MININTEGER)) /* minint <= f <= maxint ? */
+ return (i <= cast(lua_Integer, f)); /* compare them as integers */
+ else /* f < minint <= i (or 'f' is NaN) --> not(i <= f) */
+ return 0;
+ }
+#endif
+ return luai_numle(cast_num(i), f); /* compare them as floats */
+}
+
+
+/*
+** Return 'l < r', for numbers.
+*/
+static int LTnum (const TValue *l, const TValue *r) {
+ if (ttisinteger(l)) {
+ lua_Integer li = ivalue(l);
+ if (ttisinteger(r))
+ return li < ivalue(r); /* both are integers */
+ else /* 'l' is int and 'r' is float */
+ return LTintfloat(li, fltvalue(r)); /* l < r ? */
+ }
+ else {
+ lua_Number lf = fltvalue(l); /* 'l' must be float */
+ if (ttisfloat(r))
+ return luai_numlt(lf, fltvalue(r)); /* both are float */
+ else if (luai_numisnan(lf)) /* 'r' is int and 'l' is float */
+ return 0; /* NaN < i is always false */
+ else /* without NaN, (l < r) <--> not(r <= l) */
+ return !LEintfloat(ivalue(r), lf); /* not (r <= l) ? */
+ }
+}
+
+
+/*
+** Return 'l <= r', for numbers.
+*/
+static int LEnum (const TValue *l, const TValue *r) {
+ if (ttisinteger(l)) {
+ lua_Integer li = ivalue(l);
+ if (ttisinteger(r))
+ return li <= ivalue(r); /* both are integers */
+ else /* 'l' is int and 'r' is float */
+ return LEintfloat(li, fltvalue(r)); /* l <= r ? */
+ }
+ else {
+ lua_Number lf = fltvalue(l); /* 'l' must be float */
+ if (ttisfloat(r))
+ return luai_numle(lf, fltvalue(r)); /* both are float */
+ else if (luai_numisnan(lf)) /* 'r' is int and 'l' is float */
+ return 0; /* NaN <= i is always false */
+ else /* without NaN, (l <= r) <--> not(r < l) */
+ return !LTintfloat(ivalue(r), lf); /* not (r < l) ? */
+ }
+}
+
+
+/*
+** Main operation less than; return 'l < r'.
+*/
+int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {
+ int res;
+ if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */
+ return LTnum(l, r);
+ else if (ttisstring(l) && ttisstring(r)) /* both are strings? */
+ return l_strcmp(tsvalue(l), tsvalue(r)) < 0;
+ else if ((res = luaT_callorderTM(L, l, r, TM_LT)) < 0) /* no metamethod? */
+ luaG_ordererror(L, l, r); /* error */
+ return res;
+}
+
+
+/*
+** Main operation less than or equal to; return 'l <= r'. If it needs
+** a metamethod and there is no '__le', try '__lt', based on
+** l <= r iff !(r < l) (assuming a total order). If the metamethod
+** yields during this substitution, the continuation has to know
+** about it (to negate the result of r<l); bit CIST_LEQ in the call
+** status keeps that information.
+*/
+int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) {
+ int res;
+ if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */
+ return LEnum(l, r);
+ else if (ttisstring(l) && ttisstring(r)) /* both are strings? */
+ return l_strcmp(tsvalue(l), tsvalue(r)) <= 0;
+ else if ((res = luaT_callorderTM(L, l, r, TM_LE)) >= 0) /* try 'le' */
+ return res;
+ else { /* try 'lt': */
+ L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */
+ res = luaT_callorderTM(L, r, l, TM_LT);
+ L->ci->callstatus ^= CIST_LEQ; /* clear mark */
+ if (res < 0)
+ luaG_ordererror(L, l, r);
+ return !res; /* result is negated */
+ }
+}
+
+
+/*
+** Main operation for equality of Lua values; return 't1 == t2'.
+** L == NULL means raw equality (no metamethods)
+*/
+int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {
+ const TValue *tm;
+ if (ttype(t1) != ttype(t2)) { /* not the same variant? */
+ if (ttnov(t1) != ttnov(t2) || ttnov(t1) != LUA_TNUMBER)
+ return 0; /* only numbers can be equal with different variants */
+ else { /* two numbers with different variants */
+ lua_Integer i1, i2; /* compare them as integers */
+ return (tointeger(t1, &i1) && tointeger(t2, &i2) && i1 == i2);
+ }
+ }
+ /* values have same type and same variant */
+ switch (ttype(t1)) {
+ case LUA_TNIL: return 1;
+ case LUA_TNUMINT: return (ivalue(t1) == ivalue(t2));
+ case LUA_TNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2));
+ case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */
+ case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2);
+ case LUA_TLCF: return fvalue(t1) == fvalue(t2);
+ case LUA_TSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2));
+ case LUA_TLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2));
+ case LUA_TUSERDATA: {
+ if (uvalue(t1) == uvalue(t2)) return 1;
+ else if (L == NULL) return 0;
+ tm = fasttm(L, uvalue(t1)->metatable, TM_EQ);
+ if (tm == NULL)
+ tm = fasttm(L, uvalue(t2)->metatable, TM_EQ);
+ break; /* will try TM */
+ }
+ case LUA_TTABLE: {
+ if (hvalue(t1) == hvalue(t2)) return 1;
+ else if (L == NULL) return 0;
+ tm = fasttm(L, hvalue(t1)->metatable, TM_EQ);
+ if (tm == NULL)
+ tm = fasttm(L, hvalue(t2)->metatable, TM_EQ);
+ break; /* will try TM */
+ }
+ default:
+ return gcvalue(t1) == gcvalue(t2);
+ }
+ if (tm == NULL) /* no TM? */
+ return 0; /* objects are different */
+ luaT_callTM(L, tm, t1, t2, L->top, 1); /* call TM */
+ return !l_isfalse(L->top);
+}
+
+
+/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */
+#define tostring(L,o) \
+ (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1)))
+
+#define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0)
+
+/* copy strings in stack from top - n up to top - 1 to buffer */
+static void copy2buff (StkId top, int n, char *buff) {
+ size_t tl = 0; /* size already copied */
+ do {
+ size_t l = vslen(top - n); /* length of string being copied */
+ memcpy(buff + tl, svalue(top - n), l * sizeof(char));
+ tl += l;
+ } while (--n > 0);
+}
+
+
+/*
+** Main operation for concatenation: concat 'total' values in the stack,
+** from 'L->top - total' up to 'L->top - 1'.
+*/
+void luaV_concat (lua_State *L, int total) {
+ lua_assert(total >= 2);
+ do {
+ StkId top = L->top;
+ int n = 2; /* number of elements handled in this pass (at least 2) */
+ if (!(ttisstring(top-2) || cvt2str(top-2)) || !tostring(L, top-1))
+ luaT_trybinTM(L, top-2, top-1, top-2, TM_CONCAT);
+ else if (isemptystr(top - 1)) /* second operand is empty? */
+ cast_void(tostring(L, top - 2)); /* result is first operand */
+ else if (isemptystr(top - 2)) { /* first operand is an empty string? */
+ setobjs2s(L, top - 2, top - 1); /* result is second op. */
+ }
+ else {
+ /* at least two non-empty string values; get as many as possible */
+ size_t tl = vslen(top - 1);
+ TString *ts;
+ /* collect total length and number of strings */
+ for (n = 1; n < total && tostring(L, top - n - 1); n++) {
+ size_t l = vslen(top - n - 1);
+ if (l >= (MAX_SIZE/sizeof(char)) - tl)
+ luaG_runerror(L, "string length overflow");
+ tl += l;
+ }
+ if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */
+ char buff[LUAI_MAXSHORTLEN];
+ copy2buff(top, n, buff); /* copy strings to buffer */
+ ts = luaS_newlstr(L, buff, tl);
+ }
+ else { /* long string; copy strings directly to final result */
+ ts = luaS_createlngstrobj(L, tl);
+ copy2buff(top, n, getstr(ts));
+ }
+ setsvalue2s(L, top - n, ts); /* create result */
+ }
+ total -= n-1; /* got 'n' strings to create 1 new */
+ L->top -= n-1; /* popped 'n' strings and pushed one */
+ } while (total > 1); /* repeat until only 1 result left */
+}
+
+
+/*
+** Main operation 'ra' = #rb'.
+*/
+void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) {
+ const TValue *tm;
+ switch (ttype(rb)) {
+ case LUA_TTABLE: {
+ Table *h = hvalue(rb);
+ tm = fasttm(L, h->metatable, TM_LEN);
+ if (tm) break; /* metamethod? break switch to call it */
+ setivalue(ra, luaH_getn(h)); /* else primitive len */
+ return;
+ }
+ case LUA_TSHRSTR: {
+ setivalue(ra, tsvalue(rb)->shrlen);
+ return;
+ }
+ case LUA_TLNGSTR: {
+ setivalue(ra, tsvalue(rb)->u.lnglen);
+ return;
+ }
+ default: { /* try metamethod */
+ tm = luaT_gettmbyobj(L, rb, TM_LEN);
+ if (ttisnil(tm)) /* no metamethod? */
+ luaG_typeerror(L, rb, "get length of");
+ break;
+ }
+ }
+ luaT_callTM(L, tm, rb, rb, ra, 1);
+}
+
+
+/*
+** Integer division; return 'm // n', that is, floor(m/n).
+** C division truncates its result (rounds towards zero).
+** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer,
+** otherwise 'floor(q) == trunc(q) - 1'.
+*/
+lua_Integer luaV_div (lua_State *L, lua_Integer m, lua_Integer n) {
+ if (l_castS2U(n) + 1u <= 1u) { /* special cases: -1 or 0 */
+ if (n == 0)
+ luaG_runerror(L, "attempt to divide by zero");
+ return intop(-, 0, m); /* n==-1; avoid overflow with 0x80000...//-1 */
+ }
+ else {
+ lua_Integer q = m / n; /* perform C division */
+ if ((m ^ n) < 0 && m % n != 0) /* 'm/n' would be negative non-integer? */
+ q -= 1; /* correct result for different rounding */
+ return q;
+ }
+}
+
+
+/*
+** Integer modulus; return 'm % n'. (Assume that C '%' with
+** negative operands follows C99 behavior. See previous comment
+** about luaV_div.)
+*/
+lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) {
+ if (l_castS2U(n) + 1u <= 1u) { /* special cases: -1 or 0 */
+ if (n == 0)
+ luaG_runerror(L, "attempt to perform 'n%%0'");
+ return 0; /* m % -1 == 0; avoid overflow with 0x80000...%-1 */
+ }
+ else {
+ lua_Integer r = m % n;
+ if (r != 0 && (m ^ n) < 0) /* 'm/n' would be non-integer negative? */
+ r += n; /* correct result for different rounding */
+ return r;
+ }
+}
+
+
+/* number of bits in an integer */
+#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT)
+
+/*
+** Shift left operation. (Shift right just negates 'y'.)
+*/
+lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {
+ if (y < 0) { /* shift right? */
+ if (y <= -NBITS) return 0;
+ else return intop(>>, x, -y);
+ }
+ else { /* shift left */
+ if (y >= NBITS) return 0;
+ else return intop(<<, x, y);
+ }
+}
+
+
+/*
+** check whether cached closure in prototype 'p' may be reused, that is,
+** whether there is a cached closure with the same upvalues needed by
+** new closure to be created.
+*/
+static LClosure *getcached (Proto *p, UpVal **encup, StkId base) {
+ LClosure *c = p->cache;
+ if (c != NULL) { /* is there a cached closure? */
+ int nup = p->sizeupvalues;
+ Upvaldesc *uv = p->upvalues;
+ int i;
+ for (i = 0; i < nup; i++) { /* check whether it has right upvalues */
+ TValue *v = uv[i].instack ? base + uv[i].idx : encup[uv[i].idx]->v;
+ if (c->upvals[i]->v != v)
+ return NULL; /* wrong upvalue; cannot reuse closure */
+ }
+ }
+ return c; /* return cached closure (or NULL if no cached closure) */
+}
+
+
+/*
+** create a new Lua closure, push it in the stack, and initialize
+** its upvalues. Note that the closure is not cached if prototype is
+** already black (which means that 'cache' was already cleared by the
+** GC).
+*/
+static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,
+ StkId ra) {
+ int nup = p->sizeupvalues;
+ Upvaldesc *uv = p->upvalues;
+ int i;
+ LClosure *ncl = luaF_newLclosure(L, nup);
+ ncl->p = p;
+ setclLvalue(L, ra, ncl); /* anchor new closure in stack */
+ for (i = 0; i < nup; i++) { /* fill in its upvalues */
+ if (uv[i].instack) /* upvalue refers to local variable? */
+ ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx);
+ else /* get upvalue from enclosing function */
+ ncl->upvals[i] = encup[uv[i].idx];
+ ncl->upvals[i]->refcount++;
+ /* new closure is white, so we do not need a barrier here */
+ }
+ if (!isblack(p)) /* cache will not break GC invariant? */
+ p->cache = ncl; /* save it on cache for reuse */
+}
+
+
+/*
+** finish execution of an opcode interrupted by an yield
+*/
+void luaV_finishOp (lua_State *L) {
+ CallInfo *ci = L->ci;
+ StkId base = ci->u.l.base;
+ Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */
+ OpCode op = GET_OPCODE(inst);
+ switch (op) { /* finish its execution */
+ case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV: case OP_IDIV:
+ case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR:
+ case OP_MOD: case OP_POW:
+ case OP_UNM: case OP_BNOT: case OP_LEN:
+ case OP_GETTABUP: case OP_GETTABLE: case OP_SELF: {
+ setobjs2s(L, base + GETARG_A(inst), --L->top);
+ break;
+ }
+ case OP_LE: case OP_LT: case OP_EQ: {
+ int res = !l_isfalse(L->top - 1);
+ L->top--;
+ if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */
+ lua_assert(op == OP_LE);
+ ci->callstatus ^= CIST_LEQ; /* clear mark */
+ res = !res; /* negate result */
+ }
+ lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP);
+ if (res != GETARG_A(inst)) /* condition failed? */
+ ci->u.l.savedpc++; /* skip jump instruction */
+ break;
+ }
+ case OP_CONCAT: {
+ StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */
+ int b = GETARG_B(inst); /* first element to concatenate */
+ int total = cast_int(top - 1 - (base + b)); /* yet to concatenate */
+ setobj2s(L, top - 2, top); /* put TM result in proper position */
+ if (total > 1) { /* are there elements to concat? */
+ L->top = top - 1; /* top is one after last element (at top-2) */
+ luaV_concat(L, total); /* concat them (may yield again) */
+ }
+ /* move final result to final position */
+ setobj2s(L, ci->u.l.base + GETARG_A(inst), L->top - 1);
+ L->top = ci->top; /* restore top */
+ break;
+ }
+ case OP_TFORCALL: {
+ lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_TFORLOOP);
+ L->top = ci->top; /* correct top */
+ break;
+ }
+ case OP_CALL: {
+ if (GETARG_C(inst) - 1 >= 0) /* nresults >= 0? */
+ L->top = ci->top; /* adjust results */
+ break;
+ }
+ case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE:
+ break;
+ default: lua_assert(0);
+ }
+}
+
+
+
+
+/*
+** {==================================================================
+** Function 'luaV_execute': main interpreter loop
+** ===================================================================
+*/
+
+
+/*
+** some macros for common tasks in 'luaV_execute'
+*/
+
+
+#define RA(i) (base+GETARG_A(i))
+#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))
+#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))
+#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \
+ ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))
+#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \
+ ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))
+
+
+/* execute a jump instruction */
+#define dojump(ci,i,e) \
+ { int a = GETARG_A(i); \
+ if (a != 0) luaF_close(L, ci->u.l.base + a - 1); \
+ ci->u.l.savedpc += GETARG_sBx(i) + e; }
+
+/* for test instructions, execute the jump instruction that follows it */
+#define donextjump(ci) { i = *ci->u.l.savedpc; dojump(ci, i, 1); }
+
+
+#define Protect(x) { {x;}; base = ci->u.l.base; }
+
+#define checkGC(L,c) \
+ { luaC_condGC(L, L->top = (c), /* limit of live values */ \
+ Protect(L->top = ci->top)); /* restore top */ \
+ luai_threadyield(L); }
+
+
+/* fetch an instruction and prepare its execution */
+#define vmfetch() { \
+ i = *(ci->u.l.savedpc++); \
+ if (L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) \
+ Protect(luaG_traceexec(L)); \
+ ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \
+ lua_assert(base == ci->u.l.base); \
+ lua_assert(base <= L->top && L->top < L->stack + L->stacksize); \
+}
+
+#define vmdispatch(o) switch(o)
+#define vmcase(l) case l:
+#define vmbreak break
+
+
+/*
+** copy of 'luaV_gettable', but protecting the call to potential
+** metamethod (which can reallocate the stack)
+*/
+#define gettableProtected(L,t,k,v) { const TValue *slot; \
+ if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
+ else Protect(luaV_finishget(L,t,k,v,slot)); }
+
+
+/* same for 'luaV_settable' */
+#define settableProtected(L,t,k,v) { const TValue *slot; \
+ if (!luaV_fastset(L,t,k,slot,luaH_get,v)) \
+ Protect(luaV_finishset(L,t,k,v,slot)); }
+
+
+
+void luaV_execute (lua_State *L) {
+ CallInfo *ci = L->ci;
+ LClosure *cl;
+ TValue *k;
+ StkId base;
+ ci->callstatus |= CIST_FRESH; /* fresh invocation of 'luaV_execute" */
+ newframe: /* reentry point when frame changes (call/return) */
+ lua_assert(ci == L->ci);
+ cl = clLvalue(ci->func); /* local reference to function's closure */
+ k = cl->p->k; /* local reference to function's constant table */
+ base = ci->u.l.base; /* local copy of function's base */
+ /* main loop of interpreter */
+ for (;;) {
+ Instruction i;
+ StkId ra;
+ vmfetch();
+ vmdispatch (GET_OPCODE(i)) {
+ vmcase(OP_MOVE) {
+ setobjs2s(L, ra, RB(i));
+ vmbreak;
+ }
+ vmcase(OP_LOADK) {
+ TValue *rb = k + GETARG_Bx(i);
+ setobj2s(L, ra, rb);
+ vmbreak;
+ }
+ vmcase(OP_LOADKX) {
+ TValue *rb;
+ lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG);
+ rb = k + GETARG_Ax(*ci->u.l.savedpc++);
+ setobj2s(L, ra, rb);
+ vmbreak;
+ }
+ vmcase(OP_LOADBOOL) {
+ setbvalue(ra, GETARG_B(i));
+ if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */
+ vmbreak;
+ }
+ vmcase(OP_LOADNIL) {
+ int b = GETARG_B(i);
+ do {
+ setnilvalue(ra++);
+ } while (b--);
+ vmbreak;
+ }
+ vmcase(OP_GETUPVAL) {
+ int b = GETARG_B(i);
+ setobj2s(L, ra, cl->upvals[b]->v);
+ vmbreak;
+ }
+ vmcase(OP_GETTABUP) {
+ TValue *upval = cl->upvals[GETARG_B(i)]->v;
+ TValue *rc = RKC(i);
+ gettableProtected(L, upval, rc, ra);
+ vmbreak;
+ }
+ vmcase(OP_GETTABLE) {
+ StkId rb = RB(i);
+ TValue *rc = RKC(i);
+ gettableProtected(L, rb, rc, ra);
+ vmbreak;
+ }
+ vmcase(OP_SETTABUP) {
+ TValue *upval = cl->upvals[GETARG_A(i)]->v;
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ settableProtected(L, upval, rb, rc);
+ vmbreak;
+ }
+ vmcase(OP_SETUPVAL) {
+ UpVal *uv = cl->upvals[GETARG_B(i)];
+ setobj(L, uv->v, ra);
+ luaC_upvalbarrier(L, uv);
+ vmbreak;
+ }
+ vmcase(OP_SETTABLE) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ settableProtected(L, ra, rb, rc);
+ vmbreak;
+ }
+ vmcase(OP_NEWTABLE) {
+ int b = GETARG_B(i);
+ int c = GETARG_C(i);
+ Table *t = luaH_new(L);
+ sethvalue(L, ra, t);
+ if (b != 0 || c != 0)
+ luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c));
+ checkGC(L, ra + 1);
+ vmbreak;
+ }
+ vmcase(OP_SELF) {
+ const TValue *aux;
+ StkId rb = RB(i);
+ TValue *rc = RKC(i);
+ TString *key = tsvalue(rc); /* key must be a string */
+ setobjs2s(L, ra + 1, rb);
+ if (luaV_fastget(L, rb, key, aux, luaH_getstr)) {
+ setobj2s(L, ra, aux);
+ }
+ else Protect(luaV_finishget(L, rb, rc, ra, aux));
+ vmbreak;
+ }
+ vmcase(OP_ADD) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Number nb; lua_Number nc;
+ if (ttisinteger(rb) && ttisinteger(rc)) {
+ lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+ setivalue(ra, intop(+, ib, ic));
+ }
+ else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+ setfltvalue(ra, luai_numadd(L, nb, nc));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); }
+ vmbreak;
+ }
+ vmcase(OP_SUB) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Number nb; lua_Number nc;
+ if (ttisinteger(rb) && ttisinteger(rc)) {
+ lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+ setivalue(ra, intop(-, ib, ic));
+ }
+ else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+ setfltvalue(ra, luai_numsub(L, nb, nc));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); }
+ vmbreak;
+ }
+ vmcase(OP_MUL) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Number nb; lua_Number nc;
+ if (ttisinteger(rb) && ttisinteger(rc)) {
+ lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+ setivalue(ra, intop(*, ib, ic));
+ }
+ else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+ setfltvalue(ra, luai_nummul(L, nb, nc));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); }
+ vmbreak;
+ }
+ vmcase(OP_DIV) { /* float division (always with floats) */
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Number nb; lua_Number nc;
+ if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+ setfltvalue(ra, luai_numdiv(L, nb, nc));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); }
+ vmbreak;
+ }
+ vmcase(OP_BAND) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Integer ib; lua_Integer ic;
+ if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+ setivalue(ra, intop(&, ib, ic));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); }
+ vmbreak;
+ }
+ vmcase(OP_BOR) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Integer ib; lua_Integer ic;
+ if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+ setivalue(ra, intop(|, ib, ic));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); }
+ vmbreak;
+ }
+ vmcase(OP_BXOR) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Integer ib; lua_Integer ic;
+ if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+ setivalue(ra, intop(^, ib, ic));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); }
+ vmbreak;
+ }
+ vmcase(OP_SHL) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Integer ib; lua_Integer ic;
+ if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+ setivalue(ra, luaV_shiftl(ib, ic));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); }
+ vmbreak;
+ }
+ vmcase(OP_SHR) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Integer ib; lua_Integer ic;
+ if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+ setivalue(ra, luaV_shiftl(ib, -ic));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); }
+ vmbreak;
+ }
+ vmcase(OP_MOD) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Number nb; lua_Number nc;
+ if (ttisinteger(rb) && ttisinteger(rc)) {
+ lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+ setivalue(ra, luaV_mod(L, ib, ic));
+ }
+ else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+ lua_Number m;
+ luai_nummod(L, nb, nc, m);
+ setfltvalue(ra, m);
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); }
+ vmbreak;
+ }
+ vmcase(OP_IDIV) { /* floor division */
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Number nb; lua_Number nc;
+ if (ttisinteger(rb) && ttisinteger(rc)) {
+ lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+ setivalue(ra, luaV_div(L, ib, ic));
+ }
+ else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+ setfltvalue(ra, luai_numidiv(L, nb, nc));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); }
+ vmbreak;
+ }
+ vmcase(OP_POW) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ lua_Number nb; lua_Number nc;
+ if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+ setfltvalue(ra, luai_numpow(L, nb, nc));
+ }
+ else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); }
+ vmbreak;
+ }
+ vmcase(OP_UNM) {
+ TValue *rb = RB(i);
+ lua_Number nb;
+ if (ttisinteger(rb)) {
+ lua_Integer ib = ivalue(rb);
+ setivalue(ra, intop(-, 0, ib));
+ }
+ else if (tonumber(rb, &nb)) {
+ setfltvalue(ra, luai_numunm(L, nb));
+ }
+ else {
+ Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
+ }
+ vmbreak;
+ }
+ vmcase(OP_BNOT) {
+ TValue *rb = RB(i);
+ lua_Integer ib;
+ if (tointeger(rb, &ib)) {
+ setivalue(ra, intop(^, ~l_castS2U(0), ib));
+ }
+ else {
+ Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));
+ }
+ vmbreak;
+ }
+ vmcase(OP_NOT) {
+ TValue *rb = RB(i);
+ int res = l_isfalse(rb); /* next assignment may change this value */
+ setbvalue(ra, res);
+ vmbreak;
+ }
+ vmcase(OP_LEN) {
+ Protect(luaV_objlen(L, ra, RB(i)));
+ vmbreak;
+ }
+ vmcase(OP_CONCAT) {
+ int b = GETARG_B(i);
+ int c = GETARG_C(i);
+ StkId rb;
+ L->top = base + c + 1; /* mark the end of concat operands */
+ Protect(luaV_concat(L, c - b + 1));
+ ra = RA(i); /* 'luaV_concat' may invoke TMs and move the stack */
+ rb = base + b;
+ setobjs2s(L, ra, rb);
+ checkGC(L, (ra >= rb ? ra + 1 : rb));
+ L->top = ci->top; /* restore top */
+ vmbreak;
+ }
+ vmcase(OP_JMP) {
+ dojump(ci, i, 0);
+ vmbreak;
+ }
+ vmcase(OP_EQ) {
+ TValue *rb = RKB(i);
+ TValue *rc = RKC(i);
+ Protect(
+ if (luaV_equalobj(L, rb, rc) != GETARG_A(i))
+ ci->u.l.savedpc++;
+ else
+ donextjump(ci);
+ )
+ vmbreak;
+ }
+ vmcase(OP_LT) {
+ Protect(
+ if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i))
+ ci->u.l.savedpc++;
+ else
+ donextjump(ci);
+ )
+ vmbreak;
+ }
+ vmcase(OP_LE) {
+ Protect(
+ if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i))
+ ci->u.l.savedpc++;
+ else
+ donextjump(ci);
+ )
+ vmbreak;
+ }
+ vmcase(OP_TEST) {
+ if (GETARG_C(i) ? l_isfalse(ra) : !l_isfalse(ra))
+ ci->u.l.savedpc++;
+ else
+ donextjump(ci);
+ vmbreak;
+ }
+ vmcase(OP_TESTSET) {
+ TValue *rb = RB(i);
+ if (GETARG_C(i) ? l_isfalse(rb) : !l_isfalse(rb))
+ ci->u.l.savedpc++;
+ else {
+ setobjs2s(L, ra, rb);
+ donextjump(ci);
+ }
+ vmbreak;
+ }
+ vmcase(OP_CALL) {
+ int b = GETARG_B(i);
+ int nresults = GETARG_C(i) - 1;
+ if (b != 0) L->top = ra+b; /* else previous instruction set top */
+ if (luaD_precall(L, ra, nresults)) { /* C function? */
+ if (nresults >= 0)
+ L->top = ci->top; /* adjust results */
+ Protect((void)0); /* update 'base' */
+ }
+ else { /* Lua function */
+ ci = L->ci;
+ goto newframe; /* restart luaV_execute over new Lua function */
+ }
+ vmbreak;
+ }
+ vmcase(OP_TAILCALL) {
+ int b = GETARG_B(i);
+ if (b != 0) L->top = ra+b; /* else previous instruction set top */
+ lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);
+ if (luaD_precall(L, ra, LUA_MULTRET)) { /* C function? */
+ Protect((void)0); /* update 'base' */
+ }
+ else {
+ /* tail call: put called frame (n) in place of caller one (o) */
+ CallInfo *nci = L->ci; /* called frame */
+ CallInfo *oci = nci->previous; /* caller frame */
+ StkId nfunc = nci->func; /* called function */
+ StkId ofunc = oci->func; /* caller function */
+ /* last stack slot filled by 'precall' */
+ StkId lim = nci->u.l.base + getproto(nfunc)->numparams;
+ int aux;
+ /* close all upvalues from previous call */
+ if (cl->p->sizep > 0) luaF_close(L, oci->u.l.base);
+ /* move new frame into old one */
+ for (aux = 0; nfunc + aux < lim; aux++)
+ setobjs2s(L, ofunc + aux, nfunc + aux);
+ oci->u.l.base = ofunc + (nci->u.l.base - nfunc); /* correct base */
+ oci->top = L->top = ofunc + (L->top - nfunc); /* correct top */
+ oci->u.l.savedpc = nci->u.l.savedpc;
+ oci->callstatus |= CIST_TAIL; /* function was tail called */
+ ci = L->ci = oci; /* remove new frame */
+ lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize);
+ goto newframe; /* restart luaV_execute over new Lua function */
+ }
+ vmbreak;
+ }
+ vmcase(OP_RETURN) {
+ int b = GETARG_B(i);
+ if (cl->p->sizep > 0) luaF_close(L, base);
+ b = luaD_poscall(L, ci, ra, (b != 0 ? b - 1 : cast_int(L->top - ra)));
+ if (ci->callstatus & CIST_FRESH) /* local 'ci' still from callee */
+ return; /* external invocation: return */
+ else { /* invocation via reentry: continue execution */
+ ci = L->ci;
+ if (b) L->top = ci->top;
+ lua_assert(isLua(ci));
+ lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL);
+ goto newframe; /* restart luaV_execute over new Lua function */
+ }
+ }
+ vmcase(OP_FORLOOP) {
+ if (ttisinteger(ra)) { /* integer loop? */
+ lua_Integer step = ivalue(ra + 2);
+ lua_Integer idx = intop(+, ivalue(ra), step); /* increment index */
+ lua_Integer limit = ivalue(ra + 1);
+ if ((0 < step) ? (idx <= limit) : (limit <= idx)) {
+ ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
+ chgivalue(ra, idx); /* update internal index... */
+ setivalue(ra + 3, idx); /* ...and external index */
+ }
+ }
+ else { /* floating loop */
+ lua_Number step = fltvalue(ra + 2);
+ lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
+ lua_Number limit = fltvalue(ra + 1);
+ if (luai_numlt(0, step) ? luai_numle(idx, limit)
+ : luai_numle(limit, idx)) {
+ ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
+ chgfltvalue(ra, idx); /* update internal index... */
+ setfltvalue(ra + 3, idx); /* ...and external index */
+ }
+ }
+ vmbreak;
+ }
+ vmcase(OP_FORPREP) {
+ TValue *init = ra;
+ TValue *plimit = ra + 1;
+ TValue *pstep = ra + 2;
+ lua_Integer ilimit;
+ int stopnow;
+ if (ttisinteger(init) && ttisinteger(pstep) &&
+ forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) {
+ /* all values are integer */
+ lua_Integer initv = (stopnow ? 0 : ivalue(init));
+ setivalue(plimit, ilimit);
+ setivalue(init, intop(-, initv, ivalue(pstep)));
+ }
+ else { /* try making all values floats */
+ lua_Number ninit; lua_Number nlimit; lua_Number nstep;
+ if (!tonumber(plimit, &nlimit))
+ luaG_runerror(L, "'for' limit must be a number");
+ setfltvalue(plimit, nlimit);
+ if (!tonumber(pstep, &nstep))
+ luaG_runerror(L, "'for' step must be a number");
+ setfltvalue(pstep, nstep);
+ if (!tonumber(init, &ninit))
+ luaG_runerror(L, "'for' initial value must be a number");
+ setfltvalue(init, luai_numsub(L, ninit, nstep));
+ }
+ ci->u.l.savedpc += GETARG_sBx(i);
+ vmbreak;
+ }
+ vmcase(OP_TFORCALL) {
+ StkId cb = ra + 3; /* call base */
+ setobjs2s(L, cb+2, ra+2);
+ setobjs2s(L, cb+1, ra+1);
+ setobjs2s(L, cb, ra);
+ L->top = cb + 3; /* func. + 2 args (state and index) */
+ Protect(luaD_call(L, cb, GETARG_C(i)));
+ L->top = ci->top;
+ i = *(ci->u.l.savedpc++); /* go to next instruction */
+ ra = RA(i);
+ lua_assert(GET_OPCODE(i) == OP_TFORLOOP);
+ goto l_tforloop;
+ }
+ vmcase(OP_TFORLOOP) {
+ l_tforloop:
+ if (!ttisnil(ra + 1)) { /* continue loop? */
+ setobjs2s(L, ra, ra + 1); /* save control variable */
+ ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
+ }
+ vmbreak;
+ }
+ vmcase(OP_SETLIST) {
+ int n = GETARG_B(i);
+ int c = GETARG_C(i);
+ unsigned int last;
+ Table *h;
+ if (n == 0) n = cast_int(L->top - ra) - 1;
+ if (c == 0) {
+ lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG);
+ c = GETARG_Ax(*ci->u.l.savedpc++);
+ }
+ h = hvalue(ra);
+ last = ((c-1)*LFIELDS_PER_FLUSH) + n;
+ if (last > h->sizearray) /* needs more space? */
+ luaH_resizearray(L, h, last); /* preallocate it at once */
+ for (; n > 0; n--) {
+ TValue *val = ra+n;
+ luaH_setint(L, h, last--, val);
+ luaC_barrierback(L, h, val);
+ }
+ L->top = ci->top; /* correct top (in case of previous open call) */
+ vmbreak;
+ }
+ vmcase(OP_CLOSURE) {
+ Proto *p = cl->p->p[GETARG_Bx(i)];
+ LClosure *ncl = getcached(p, cl->upvals, base); /* cached closure */
+ if (ncl == NULL) /* no match? */
+ pushclosure(L, p, cl->upvals, base, ra); /* create a new one */
+ else
+ setclLvalue(L, ra, ncl); /* push cashed closure */
+ checkGC(L, ra + 1);
+ vmbreak;
+ }
+ vmcase(OP_VARARG) {
+ int b = GETARG_B(i) - 1; /* required results */
+ int j;
+ int n = cast_int(base - ci->func) - cl->p->numparams - 1;
+ if (n < 0) /* less arguments than parameters? */
+ n = 0; /* no vararg arguments */
+ if (b < 0) { /* B == 0? */
+ b = n; /* get all var. arguments */
+ Protect(luaD_checkstack(L, n));
+ ra = RA(i); /* previous call may change the stack */
+ L->top = ra + n;
+ }
+ for (j = 0; j < b && j < n; j++)
+ setobjs2s(L, ra + j, base - n + j);
+ for (; j < b; j++) /* complete required results with nil */
+ setnilvalue(ra + j);
+ vmbreak;
+ }
+ vmcase(OP_EXTRAARG) {
+ lua_assert(0);
+ vmbreak;
+ }
+ }
+ }
+}
+
+/* }================================================================== */
+
diff --git a/libs/lua/lua-5.3.3/lvm.h b/libs/lua/lua-5.3.3/lvm.h
new file mode 100644
index 0000000..bcf52d2
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lvm.h
@@ -0,0 +1,113 @@
+/*
+** $Id: lvm.h,v 2.40 2016/01/05 16:07:21 roberto Exp $
+** Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lvm_h
+#define lvm_h
+
+
+#include "ldo.h"
+#include "lobject.h"
+#include "ltm.h"
+
+
+#if !defined(LUA_NOCVTN2S)
+#define cvt2str(o) ttisnumber(o)
+#else
+#define cvt2str(o) 0 /* no conversion from numbers to strings */
+#endif
+
+
+#if !defined(LUA_NOCVTS2N)
+#define cvt2num(o) ttisstring(o)
+#else
+#define cvt2num(o) 0 /* no conversion from strings to numbers */
+#endif
+
+
+/*
+** You can define LUA_FLOORN2I if you want to convert floats to integers
+** by flooring them (instead of raising an error if they are not
+** integral values)
+*/
+#if !defined(LUA_FLOORN2I)
+#define LUA_FLOORN2I 0
+#endif
+
+
+#define tonumber(o,n) \
+ (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n))
+
+#define tointeger(o,i) \
+ (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger(o,i,LUA_FLOORN2I))
+
+#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2))
+
+#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2)
+
+
+/*
+** fast track for 'gettable': if 't' is a table and 't[k]' is not nil,
+** return 1 with 'slot' pointing to 't[k]' (final result). Otherwise,
+** return 0 (meaning it will have to check metamethod) with 'slot'
+** pointing to a nil 't[k]' (if 't' is a table) or NULL (otherwise).
+** 'f' is the raw get function to use.
+*/
+#define luaV_fastget(L,t,k,slot,f) \
+ (!ttistable(t) \
+ ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \
+ : (slot = f(hvalue(t), k), /* else, do raw access */ \
+ !ttisnil(slot))) /* result not nil? */
+
+/*
+** standard implementation for 'gettable'
+*/
+#define luaV_gettable(L,t,k,v) { const TValue *slot; \
+ if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
+ else luaV_finishget(L,t,k,v,slot); }
+
+
+/*
+** Fast track for set table. If 't' is a table and 't[k]' is not nil,
+** call GC barrier, do a raw 't[k]=v', and return true; otherwise,
+** return false with 'slot' equal to NULL (if 't' is not a table) or
+** 'nil'. (This is needed by 'luaV_finishget'.) Note that, if the macro
+** returns true, there is no need to 'invalidateTMcache', because the
+** call is not creating a new entry.
+*/
+#define luaV_fastset(L,t,k,slot,f,v) \
+ (!ttistable(t) \
+ ? (slot = NULL, 0) \
+ : (slot = f(hvalue(t), k), \
+ ttisnil(slot) ? 0 \
+ : (luaC_barrierback(L, hvalue(t), v), \
+ setobj2t(L, cast(TValue *,slot), v), \
+ 1)))
+
+
+#define luaV_settable(L,t,k,v) { const TValue *slot; \
+ if (!luaV_fastset(L,t,k,slot,luaH_get,v)) \
+ luaV_finishset(L,t,k,v,slot); }
+
+
+
+LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);
+LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);
+LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);
+LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);
+LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode);
+LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key,
+ StkId val, const TValue *slot);
+LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
+ StkId val, const TValue *slot);
+LUAI_FUNC void luaV_finishOp (lua_State *L);
+LUAI_FUNC void luaV_execute (lua_State *L);
+LUAI_FUNC void luaV_concat (lua_State *L, int total);
+LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y);
+LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);
+LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y);
+LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lzio.c b/libs/lua/lua-5.3.3/lzio.c
new file mode 100644
index 0000000..c9e1f49
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lzio.c
@@ -0,0 +1,68 @@
+/*
+** $Id: lzio.c,v 1.37 2015/09/08 15:41:05 roberto Exp $
+** Buffered streams
+** See Copyright Notice in lua.h
+*/
+
+#define lzio_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "llimits.h"
+#include "lmem.h"
+#include "lstate.h"
+#include "lzio.h"
+
+
+int luaZ_fill (ZIO *z) {
+ size_t size;
+ lua_State *L = z->L;
+ const char *buff;
+ lua_unlock(L);
+ buff = z->reader(L, z->data, &size);
+ lua_lock(L);
+ if (buff == NULL || size == 0)
+ return EOZ;
+ z->n = size - 1; /* discount char being returned */
+ z->p = buff;
+ return cast_uchar(*(z->p++));
+}
+
+
+void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
+ z->L = L;
+ z->reader = reader;
+ z->data = data;
+ z->n = 0;
+ z->p = NULL;
+}
+
+
+/* --------------------------------------------------------------- read --- */
+size_t luaZ_read (ZIO *z, void *b, size_t n) {
+ while (n) {
+ size_t m;
+ if (z->n == 0) { /* no bytes in buffer? */
+ if (luaZ_fill(z) == EOZ) /* try to read more */
+ return n; /* no more input; return number of missing bytes */
+ else {
+ z->n++; /* luaZ_fill consumed first byte; put it back */
+ z->p--;
+ }
+ }
+ m = (n <= z->n) ? n : z->n; /* min. between n and z->n */
+ memcpy(b, z->p, m);
+ z->n -= m;
+ z->p += m;
+ b = (char *)b + m;
+ n -= m;
+ }
+ return 0;
+}
+
diff --git a/libs/lua/lua-5.3.3/lzio.h b/libs/lua/lua-5.3.3/lzio.h
new file mode 100644
index 0000000..e7b6f34
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lzio.h
@@ -0,0 +1,66 @@
+/*
+** $Id: lzio.h,v 1.31 2015/09/08 15:41:05 roberto Exp $
+** Buffered streams
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lzio_h
+#define lzio_h
+
+#include "lua.h"
+
+#include "lmem.h"
+
+
+#define EOZ (-1) /* end of stream */
+
+typedef struct Zio ZIO;
+
+#define zgetc(z) (((z)->n--)>0 ? cast_uchar(*(z)->p++) : luaZ_fill(z))
+
+
+typedef struct Mbuffer {
+ char *buffer;
+ size_t n;
+ size_t buffsize;
+} Mbuffer;
+
+#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0)
+
+#define luaZ_buffer(buff) ((buff)->buffer)
+#define luaZ_sizebuffer(buff) ((buff)->buffsize)
+#define luaZ_bufflen(buff) ((buff)->n)
+
+#define luaZ_buffremove(buff,i) ((buff)->n -= (i))
+#define luaZ_resetbuffer(buff) ((buff)->n = 0)
+
+
+#define luaZ_resizebuffer(L, buff, size) \
+ ((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \
+ (buff)->buffsize, size), \
+ (buff)->buffsize = size)
+
+#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0)
+
+
+LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader,
+ void *data);
+LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */
+
+
+
+/* --------- Private Part ------------------ */
+
+struct Zio {
+ size_t n; /* bytes still unread */
+ const char *p; /* current position in buffer */
+ lua_Reader reader; /* reader function */
+ void *data; /* additional data */
+ lua_State *L; /* Lua state (for reader) */
+};
+
+
+LUAI_FUNC int luaZ_fill (ZIO *z);
+
+#endif
diff --git a/libs/lua/lua.cc b/libs/lua/lua.cc
new file mode 100644
index 0000000..7eed622
--- /dev/null
+++ b/libs/lua/lua.cc
@@ -0,0 +1,121 @@
+/* This is a C++ wrapper to compile the lua C code
+ * with settings appropriate for including it with
+ * Ardour.
+ */
+
+#include "lua/liblua_visibility.h"
+
+#if _MSC_VER
+# pragma push_macro("_CRT_SECURE_NO_WARNINGS")
+# ifndef _CRT_SECURE_NO_WARNINGS
+# define _CRT_SECURE_NO_WARNINGS
+# endif
+#elif defined(__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wcast-qual"
+#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wcast-qual"
+#endif
+
+// forward ardour's defines to luaconf.h
+#ifdef PLATFORM_WINDOWS
+# define LUA_USE_WINDOWS
+#elif defined __APPLE__
+# define LUA_USE_MACOSX
+#else
+# define LUA_USE_LINUX
+#endif
+
+// forward liblua visibility to luaconf.h
+#ifdef LIBLUA_BUILD_AS_DLL
+#define LUA_BUILD_AS_DLL
+#endif
+
+extern "C"
+{
+
+#define lobject_c
+#define lvm_c
+#define LUA_CORE
+#define LUA_LIB
+#include "lua-5.3.3/luaconf.h"
+#undef lobject_c
+#undef lvm_c
+#undef LUA_CORE
+#undef LUA_LIB
+
+// override luaconf.h symbol export
+#ifdef LIBLUA_STATIC // static lib (no DLL)
+# undef LUA_API
+# undef LUALIB_API
+# undef LUAMOD_API
+# define LUA_API extern "C"
+# define LUALIB_API LUA_API
+# define LUAMOD_API LUALIB_API
+#endif
+
+// disable support for extenal libs
+#undef LUA_DL_DLL
+#undef LUA_USE_DLOPEN
+
+// enable bit lib
+#define LUA_COMPAT_BITLIB
+
+#if _MSC_VER
+#pragma warning (push)
+#pragma warning (disable: 4244) /* Possible loss of data */
+#pragma warning (disable: 4702) /* Unreachable code */
+#endif
+
+#include "lua-5.3.3/ltable.c"
+
+#include "lua-5.3.3/lauxlib.c"
+#include "lua-5.3.3/lbaselib.c"
+
+#include "lua-5.3.3/lbitlib.c"
+#include "lua-5.3.3/lcorolib.c"
+#include "lua-5.3.3/ldblib.c"
+#include "lua-5.3.3/linit.c"
+#include "lua-5.3.3/liolib.c"
+#include "lua-5.3.3/lmathlib.c"
+#include "lua-5.3.3/loslib.c"
+#include "lua-5.3.3/lstrlib.c"
+#include "lua-5.3.3/ltablib.c"
+
+#include "lua-5.3.3/lapi.c"
+#include "lua-5.3.3/lcode.c"
+#include "lua-5.3.3/lctype.c"
+#include "lua-5.3.3/ldebug.c"
+#include "lua-5.3.3/ldo.c"
+#include "lua-5.3.3/ldump.c"
+#include "lua-5.3.3/lfunc.c"
+#include "lua-5.3.3/lgc.c"
+#include "lua-5.3.3/llex.c"
+#include "lua-5.3.3/lmem.c"
+#include "lua-5.3.3/lobject.c"
+#include "lua-5.3.3/lopcodes.c"
+#include "lua-5.3.3/lparser.c"
+#include "lua-5.3.3/lstate.c"
+#include "lua-5.3.3/lstring.c"
+#include "lua-5.3.3/ltm.c"
+#include "lua-5.3.3/lundump.c"
+#include "lua-5.3.3/lutf8lib.c"
+#include "lua-5.3.3/lvm.c"
+#include "lua-5.3.3/lzio.c"
+
+#include "lua-5.3.3/loadlib.c"
+
+#if _MSC_VER
+#pragma warning (pop)
+#endif
+
+} // end extern "C"
+
+#if _MSC_VER
+# pragma pop_macro("_CRT_SECURE_NO_WARNINGS")
+#elif defined(__clang__)
+# pragma clang diagnostic pop
+#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
+# pragma GCC diagnostic pop
+#endif
diff --git a/libs/lua/lua/liblua_visibility.h b/libs/lua/lua/liblua_visibility.h
new file mode 100644
index 0000000..494f936
--- /dev/null
+++ b/libs/lua/lua/liblua_visibility.h
@@ -0,0 +1,35 @@
+#ifndef __liblua_visibility_h__
+#define __liblua_visibility_h__
+
+#if defined(COMPILER_MSVC)
+# define LIBLUA_DLL_IMPORT __declspec(dllimport)
+# define LIBLUA_DLL_EXPORT __declspec(dllexport)
+# define LIBLUA_DLL_LOCAL
+#else
+# define LIBLUA_DLL_IMPORT __attribute__ ((visibility ("default")))
+# define LIBLUA_DLL_EXPORT __attribute__ ((visibility ("default")))
+# define LIBLUA_DLL_LOCAL __attribute__ ((visibility ("hidden")))
+#endif
+
+
+#ifdef COMPILER_MSVC
+// MSVC: build liblua as DLL
+# define LIBLUA_BUILD_AS_DLL
+#else
+// others currently use a static lib (incl. with libardour)
+# define LIBLUA_STATIC
+#endif
+
+
+#ifdef LIBLUA_STATIC
+# define LIBLUA_API
+#else
+// define when building the DLL (instead of using it)
+# ifdef LIBLUA_DLL_EXPORTS
+# define LIBLUA_API LIBLUA_DLL_EXPORT
+# else
+# define LIBLUA_API LIBLUA_DLL_IMPORT
+# endif
+#endif
+
+#endif /* __liblua_visibility_h__ */
diff --git a/libs/lua/lua/lua.h b/libs/lua/lua/lua.h
new file mode 100644
index 0000000..3e9a885
--- /dev/null
+++ b/libs/lua/lua/lua.h
@@ -0,0 +1,6 @@
+#ifndef LUA_LIBRARY_H
+#define LUA_LIBRARY_H
+
+#include "lua-5.3.3/lua.hpp"
+
+#endif
diff --git a/libs/lua/lua/luastate.h b/libs/lua/lua/luastate.h
new file mode 100644
index 0000000..5a5c939
--- /dev/null
+++ b/libs/lua/lua/luastate.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef LUA_STATE_H
+#define LUA_STATE_H
+
+#include <string>
+#include <sigc++/sigc++.h>
+
+#include "lua/liblua_visibility.h"
+#include "lua/lua.h"
+
+class LIBLUA_API LuaState {
+public:
+ LuaState();
+ LuaState(lua_State *ls);
+ ~LuaState();
+
+ int do_command (std::string);
+ int do_file (std::string);
+ void collect_garbage ();
+ void collect_garbage_step ();
+ void tweak_rt_gc ();
+
+ sigc::signal<void,std::string> Print;
+
+ lua_State* getState () { return L; }
+
+protected:
+ lua_State* L;
+
+private:
+ void init ();
+ static int _print (lua_State *L);
+ void print (std::string text);
+
+};
+
+#endif
diff --git a/libs/lua/luastate.cc b/libs/lua/luastate.cc
new file mode 100644
index 0000000..3b8a7ae
--- /dev/null
+++ b/libs/lua/luastate.cc
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <assert.h>
+#include "lua/luastate.h"
+
+// from lauxlib.c
+static int panic (lua_State *L) {
+ lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n",
+ lua_tostring(L, -1));
+ return 0; /* return to Lua to abort */
+}
+
+LuaState::LuaState()
+ : L (luaL_newstate ())
+{
+ assert (L);
+ init ();
+}
+
+LuaState::LuaState(lua_State *ls)
+ : L (ls)
+{
+ assert (L);
+ init ();
+}
+
+LuaState::~LuaState() {
+ lua_close (L);
+}
+
+void
+LuaState::init() {
+ lua_atpanic (L, &panic);
+ luaL_openlibs (L);
+ lua_pushlightuserdata (L, this);
+ lua_pushcclosure (L, &LuaState::_print, 1);
+ lua_setglobal (L, "print");
+}
+
+int
+LuaState::do_command (std::string cmd) {
+ int result = luaL_dostring (L, cmd.c_str());
+ if (result != 0) {
+ print ("Error: " + std::string (lua_tostring (L, -1)));
+ }
+ return result;
+}
+
+int
+LuaState::do_file (std::string fn) {
+ int result = luaL_dofile (L, fn.c_str());
+ if (result != 0) {
+ print ("Error: " + std::string (lua_tostring (L, -1)));
+ }
+ return result;
+}
+
+void
+LuaState::collect_garbage () {
+ lua_gc (L, LUA_GCCOLLECT, 0);
+}
+
+void
+LuaState::collect_garbage_step () {
+ lua_gc (L, LUA_GCSTEP, 0);
+}
+
+void
+LuaState::tweak_rt_gc () {
+ //lua_gc (L, LUA_GCSETPAUSE, 20);
+ lua_gc (L, LUA_GCSETSTEPMUL, 100);
+}
+
+void
+LuaState::print (std::string text) {
+ Print (text); /* EMIT SIGNAL */
+}
+
+int
+LuaState::_print (lua_State *L) {
+ LuaState* const luaState = static_cast <LuaState*> (lua_touserdata (L, lua_upvalueindex (1)));
+ std::string text;
+ int n = lua_gettop(L); /* number of arguments */
+ int i;
+ lua_getglobal(L, "tostring");
+ for (i=1; i<=n; i++) {
+ const char *s;
+ size_t l;
+ lua_pushvalue(L, -1); /* function to be called */
+ lua_pushvalue(L, i); /* value to print */
+ lua_call(L, 1, 1);
+ s = lua_tolstring(L, -1, &l); /* get result */
+ if (s == NULL)
+ return luaL_error(L, "'tostring' must return a string to 'print'");
+ if (i > 1) text += " ";
+ text += std::string (s, l);
+ lua_pop(L, 1); /* pop result */
+ }
+ luaState->print (text);
+ return 0;
+}
diff --git a/libs/lua/wscript b/libs/lua/wscript
new file mode 100644
index 0000000..6598e5a
--- /dev/null
+++ b/libs/lua/wscript
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+from waflib.extras import autowaf as autowaf
+from waflib import TaskGen
+import os
+import sys
+
+# Variables for 'waf dist'
+APPNAME = 'liblua'
+VERSION = "3.5.1"
+I18N_PACKAGE = 'liblua'
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+ autowaf.set_options(opt)
+
+def configure(conf):
+ conf.load('compiler_c')
+ autowaf.configure(conf)
+
+def build(bld):
+ obj=bld.stlib (source = ['lua.cc', 'luastate.cc'],
+ cflags = [ '-fPIC' ],
+ cxxflags = [ '-fPIC' ],
+ includes = ['.'],
+ export_includes = ['.'],
+ target = 'liblua',
+ uselib = [ 'SIGCPP', 'DL' ]
+ )
+ autowaf.ensure_visible_symbols (obj, True)
+
+def shutdown():
+ autowaf.shutdown()
diff --git a/libs/midi++2/MSVCmidi++/midi++.vcproj b/libs/midi++2/MSVCmidi++/midi++.vcproj
index 9325530..361f57b 100644
--- a/libs/midi++2/MSVCmidi++/midi++.vcproj
+++ b/libs/midi++2/MSVCmidi++/midi++.vcproj
@@ -354,7 +354,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/midi++2/midi++/.DS_Store b/libs/midi++2/midi++/.DS_Store
deleted file mode 100644
index 5008ddf..0000000
Binary files a/libs/midi++2/midi++/.DS_Store and /dev/null differ
diff --git a/libs/midi++2/midi++/ipmidi_port.h b/libs/midi++2/midi++/ipmidi_port.h
index 3132088..d870c79 100644
--- a/libs/midi++2/midi++/ipmidi_port.h
+++ b/libs/midi++2/midi++/ipmidi_port.h
@@ -23,7 +23,7 @@
#include <iostream>
#if defined(PLATFORM_WINDOWS)
#include <winsock.h>
-#elif defined(__FREE_BSD__)
+#elif defined(__FreeBSD__)
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/_sockaddr_storage.h>
diff --git a/libs/midi++2/parser.cc b/libs/midi++2/parser.cc
index fcee844..ff0702f 100644
--- a/libs/midi++2/parser.cc
+++ b/libs/midi++2/parser.cc
@@ -100,7 +100,7 @@ Parser::midi_event_type_name (eventType t)
return "active sense";
default:
- return "unknow MIDI event type";
+ return "unknown MIDI event type";
}
}
diff --git a/libs/panners/1in2out/panner_1in2out.cc b/libs/panners/1in2out/panner_1in2out.cc
index b522d65..3dc3b53 100644
--- a/libs/panners/1in2out/panner_1in2out.cc
+++ b/libs/panners/1in2out/panner_1in2out.cc
@@ -51,7 +51,7 @@
#include "ardour/pannable.h"
#include "ardour/profile.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "panner_1in2out.h"
#include "pbd/mathfix.h"
@@ -363,7 +363,7 @@ Panner1in2out::describe_parameter (Evoral::Parameter p)
}
string
-Panner1in2out::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Panner1in2out::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
/* DO NOT USE LocaleGuard HERE */
double val = ac->get_value();
diff --git a/libs/panners/1in2out/panner_1in2out.h b/libs/panners/1in2out/panner_1in2out.h
index 9120720..06d68a7 100644
--- a/libs/panners/1in2out/panner_1in2out.h
+++ b/libs/panners/1in2out/panner_1in2out.h
@@ -56,7 +56,7 @@ class Panner1in2out : public Panner
static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
std::string describe_parameter (Evoral::Parameter);
- std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
XMLNode& get_state ();
diff --git a/libs/panners/1in2out/wscript b/libs/panners/1in2out/wscript
index 2c1d9f1..b28c95d 100644
--- a/libs/panners/1in2out/wscript
+++ b/libs/panners/1in2out/wscript
@@ -22,6 +22,7 @@ def build(bld):
obj.name = 'libardour_pan1in2out'
obj.target = 'pan1in2out'
obj.use = 'libardour libardour_cp libpbd'
+ obj.uselib = 'GLIBMM XML'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
def shutdown():
diff --git a/libs/panners/2in2out/panner_2in2out.cc b/libs/panners/2in2out/panner_2in2out.cc
index d8a7428..9105eff 100644
--- a/libs/panners/2in2out/panner_2in2out.cc
+++ b/libs/panners/2in2out/panner_2in2out.cc
@@ -51,7 +51,7 @@
#include "panner_2in2out.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/mathfix.h"
@@ -508,7 +508,7 @@ Panner2in2out::describe_parameter (Evoral::Parameter p)
}
string
-Panner2in2out::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Panner2in2out::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
/* DO NOT USE LocaleGuard HERE */
double val = ac->get_value();
diff --git a/libs/panners/2in2out/panner_2in2out.h b/libs/panners/2in2out/panner_2in2out.h
index bc81234..4c71a27 100644
--- a/libs/panners/2in2out/panner_2in2out.h
+++ b/libs/panners/2in2out/panner_2in2out.h
@@ -63,7 +63,7 @@ class Panner2in2out : public Panner
static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
std::string describe_parameter (Evoral::Parameter);
- std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
XMLNode& get_state ();
diff --git a/libs/panners/2in2out/wscript b/libs/panners/2in2out/wscript
index bd82526..f49f1cd 100644
--- a/libs/panners/2in2out/wscript
+++ b/libs/panners/2in2out/wscript
@@ -22,6 +22,7 @@ def build(bld):
obj.name = 'libardour_pan2in2out'
obj.target = 'pan2in2out'
obj.use = 'libardour libardour_cp libpbd'
+ obj.uselib = 'GLIBMM XML'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
def shutdown():
diff --git a/libs/panners/MSVCpanners/panner_1in2out.vcproj b/libs/panners/MSVCpanners/panner_1in2out.vcproj
index 445f0f0..67b1a28 100644
--- a/libs/panners/MSVCpanners/panner_1in2out.vcproj
+++ b/libs/panners/MSVCpanners/panner_1in2out.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -288,7 +288,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/panners/MSVCpanners/panner_2in2out.vcproj b/libs/panners/MSVCpanners/panner_2in2out.vcproj
index 648d935..6047de5 100644
--- a/libs/panners/MSVCpanners/panner_2in2out.vcproj
+++ b/libs/panners/MSVCpanners/panner_2in2out.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -288,7 +288,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/panners/MSVCpanners/panner_vbap.vcproj b/libs/panners/MSVCpanners/panner_vbap.vcproj
index 894bbdf..b0893df 100644
--- a/libs/panners/MSVCpanners/panner_vbap.vcproj
+++ b/libs/panners/MSVCpanners/panner_vbap.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -124,7 +124,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -205,7 +205,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -296,7 +296,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/panners/stereobalance/panner_balance.cc b/libs/panners/stereobalance/panner_balance.cc
index b2efb0f..647c92a 100644
--- a/libs/panners/stereobalance/panner_balance.cc
+++ b/libs/panners/stereobalance/panner_balance.cc
@@ -52,7 +52,7 @@
#include "panner_balance.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/mathfix.h"
@@ -296,7 +296,7 @@ Pannerbalance::describe_parameter (Evoral::Parameter p)
}
string
-Pannerbalance::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Pannerbalance::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
/* DO NOT USE LocaleGuard HERE */
double val = ac->get_value();
diff --git a/libs/panners/stereobalance/panner_balance.h b/libs/panners/stereobalance/panner_balance.h
index f381340..dabb1da 100644
--- a/libs/panners/stereobalance/panner_balance.h
+++ b/libs/panners/stereobalance/panner_balance.h
@@ -57,7 +57,7 @@ class Pannerbalance : public Panner
static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
std::string describe_parameter (Evoral::Parameter);
- std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
XMLNode& get_state ();
diff --git a/libs/panners/stereobalance/wscript b/libs/panners/stereobalance/wscript
index 72b7c46..16d69d9 100644
--- a/libs/panners/stereobalance/wscript
+++ b/libs/panners/stereobalance/wscript
@@ -22,6 +22,7 @@ def build(bld):
obj.name = 'libardour_panbalance'
obj.target = 'panbalance'
obj.use = 'libardour libardour_cp libpbd'
+ obj.uselib = 'GLIBMM XML'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
def shutdown():
diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc
index df34ddd..e6cbd36 100644
--- a/libs/panners/vbap/vbap.cc
+++ b/libs/panners/vbap/vbap.cc
@@ -42,7 +42,7 @@
#include "vbap.h"
#include "vbap_speakers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
@@ -420,7 +420,7 @@ VBAPanner::describe_parameter (Evoral::Parameter p)
}
string
-VBAPanner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+VBAPanner::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
{
/* DO NOT USE LocaleGuard HERE */
double val = ac->get_value();
diff --git a/libs/panners/vbap/vbap.h b/libs/panners/vbap/vbap.h
index ab3c2a6..993bbda 100644
--- a/libs/panners/vbap/vbap.h
+++ b/libs/panners/vbap/vbap.h
@@ -57,7 +57,7 @@ public:
void set_azimuth_elevation (double azimuth, double elevation);
std::string describe_parameter (Evoral::Parameter);
- std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+ std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
XMLNode& get_state ();
diff --git a/libs/panners/vbap/wscript b/libs/panners/vbap/wscript
index bb2cb5b..d8f47b2 100644
--- a/libs/panners/vbap/wscript
+++ b/libs/panners/vbap/wscript
@@ -22,6 +22,7 @@ def build(bld):
obj.name = 'libardour_panvbap'
obj.target = 'panvbap'
obj.use = 'libardour libardour_cp libpbd'
+ obj.uselib = 'GLIBMM XML'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
def shutdown():
diff --git a/libs/pbd/MSVCpbd/pbd.vcproj b/libs/pbd/MSVCpbd/pbd.vcproj
index 490090d..906026c 100644
--- a/libs/pbd/MSVCpbd/pbd.vcproj
+++ b/libs/pbd/MSVCpbd/pbd.vcproj
@@ -295,10 +295,6 @@
>
</File>
<File
- RelativePath="..\controllable_descriptor.cc"
- >
- </File>
- <File
RelativePath="..\convert.cc"
>
</File>
@@ -399,6 +395,10 @@
>
</File>
<File
+ RelativePath="..\reallocpool.cc"
+ >
+ </File>
+ <File
RelativePath="..\receiver.cc"
>
</File>
@@ -701,6 +701,10 @@
>
</File>
<File
+ RelativePath="..\pbd\natsort.h"
+ >
+ </File>
+ <File
RelativePath="..\pbd\pathexpand.h"
>
</File>
@@ -725,6 +729,10 @@
>
</File>
<File
+ RelativePath="..\pbd\reallocpool.h"
+ >
+ </File>
+ <File
RelativePath="..\pbd\receiver.h"
>
</File>
@@ -831,7 +839,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/pbd/base_ui.cc b/libs/pbd/base_ui.cc
index d303d88..f22d832 100644
--- a/libs/pbd/base_ui.cc
+++ b/libs/pbd/base_ui.cc
@@ -35,7 +35,7 @@
#include "pbd/compose.h"
#include "pbd/failed_constructor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/debug.h"
diff --git a/libs/pbd/configuration_variable.cc b/libs/pbd/configuration_variable.cc
index cacad87..578114e 100644
--- a/libs/pbd/configuration_variable.cc
+++ b/libs/pbd/configuration_variable.cc
@@ -47,7 +47,7 @@ ConfigVariableBase::set_from_node (XMLNode const & node)
const XMLProperty* prop;
XMLNodeList nlist;
XMLNodeConstIterator niter;
- XMLNode* child;
+ XMLNode const * child;
nlist = node.children();
diff --git a/libs/pbd/controllable.cc b/libs/pbd/controllable.cc
index 2e4b169..b730a42 100644
--- a/libs/pbd/controllable.cc
+++ b/libs/pbd/controllable.cc
@@ -23,7 +23,7 @@
#include "pbd/error.h"
#include "pbd/locale_guard.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace std;
@@ -107,7 +107,7 @@ XMLNode&
Controllable::get_state ()
{
XMLNode* node = new XMLNode (xml_node_name);
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
char buf[64];
/* Waves' "Pressure3" has a parameter called "µ-iness"
@@ -138,7 +138,7 @@ Controllable::get_state ()
int
Controllable::set_state (const XMLNode& node, int /*version*/)
{
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
const XMLProperty* prop;
Stateful::save_extra_xml (node);
diff --git a/libs/pbd/controllable_descriptor.cc b/libs/pbd/controllable_descriptor.cc
deleted file mode 100644
index 0228d00..0000000
--- a/libs/pbd/controllable_descriptor.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- Copyright (C) 2009 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "pbd/controllable_descriptor.h"
-#include "pbd/strsplit.h"
-#include "pbd/convert.h"
-
-using namespace std;
-using namespace PBD;
-
-int
-ControllableDescriptor::set (const std::string& str)
-{
- string::size_type first_space = str.find_first_of (" ");
-
- if (first_space == string::npos) {
- return -1;
- }
-
- string front = str.substr (0, first_space);
- string back = str.substr (first_space);
-
- vector<string> path;
- split (front, path, '/');
-
- if (path.size() < 2) {
- return -1;
- }
-
- vector<string> rest;
- split (back, rest, ' ');
-
- if (rest.size() < 1) {
- return -1;
- }
-
- if (path[0] == "route" || path[0] == "rid") {
-
- _top_level_type = RemoteControlID;
-
- if (rest[0][0] == 'B') {
- _banked = true;
- _rid = atoi (rest[0].substr (1));
- } else if (isdigit (rest[0][0])) {
- _banked = false;
- _rid = atoi (rest[0]);
- } else {
- return -1;
- }
-
- } else if (path[0] == "bus" || path[0] == "track") {
-
- _top_level_type = NamedRoute;
- _top_level_name = rest[0];
- }
-
- if (path[1] == "gain") {
- _subtype = Gain;
-
- } else if (path[1] == "trim") {
- _subtype = Trim;
-
- } else if (path[1] == "solo") {
- _subtype = Solo;
-
- } else if (path[1] == "mute") {
- _subtype = Mute;
-
- } else if (path[1] == "recenable") {
- _subtype = Recenable;
-
- } else if (path[1] == "balance") {
- _subtype = Balance;
-
- } else if (path[1] == "panwidth") {
- _subtype = PanWidth;
-
- } else if (path[1] == "pandirection") {
- _subtype = PanDirection;
-
- } else if (path[1] == "plugin") {
- if (path.size() == 3 && rest.size() == 3) {
- if (path[2] == "parameter") {
- _subtype = PluginParameter;
- _target.push_back (atoi (rest[1]));
- _target.push_back (atoi (rest[2]));
- } else {
- return -1;
- }
- } else {
- return -1;
- }
- } else if (path[1] == "send") {
-
- if (path.size() == 3 && rest.size() == 2) {
- if (path[2] == "gain") {
- _subtype = SendGain;
- _target.push_back (atoi (rest[1]));
- } else {
- return -1;
- }
- } else {
- return -1;
- }
- }
-
- return 0;
-}
-
-uint32_t
-ControllableDescriptor::rid() const
-{
- if (banked()) {
- return _rid + _bank_offset;
- }
-
- return _rid;
-}
-
-uint32_t
-ControllableDescriptor::target (uint32_t n) const
-{
- if (n < _target.size()) {
- return _target[n];
- }
-
- return 0;
-}
diff --git a/libs/pbd/convert.cc b/libs/pbd/convert.cc
index 6608910..dd43475 100644
--- a/libs/pbd/convert.cc
+++ b/libs/pbd/convert.cc
@@ -35,7 +35,7 @@
#include "pbd/convert.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using std::string;
using std::vector;
diff --git a/libs/pbd/cpus.cc b/libs/pbd/cpus.cc
index fb94b47..69421e5 100644
--- a/libs/pbd/cpus.cc
+++ b/libs/pbd/cpus.cc
@@ -43,10 +43,14 @@ hardware_concurrency()
{
#if defined(PTW32_VERSION) || defined(__hpux)
return pthread_num_processors_np();
-#elif defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__APPLE__)
int count;
size_t size=sizeof(count);
return sysctlbyname("hw.physicalcpu",&count,&size,NULL,0)?0:count;
+#elif defined(__FreeBSD__)
+ int count;
+ size_t size=sizeof(count);
+ return sysctlbyname("hw.ncpu",&count,&size,NULL,0)?0:count;
#elif defined(HAVE_UNISTD) && defined(_SC_NPROCESSORS_ONLN)
int const count=sysconf(_SC_NPROCESSORS_ONLN);
return (count>0)?count:0;
diff --git a/libs/pbd/crossthread.posix.cc b/libs/pbd/crossthread.posix.cc
index 72a4fad..5035bc4 100644
--- a/libs/pbd/crossthread.posix.cc
+++ b/libs/pbd/crossthread.posix.cc
@@ -29,11 +29,6 @@ CrossThreadChannel::CrossThreadChannel (bool non_blocking)
CrossThreadChannel::~CrossThreadChannel ()
{
- if (receive_source) {
- g_source_destroy (receive_source);
- receive_source = 0;
- }
-
if (receive_channel) {
g_io_channel_unref (receive_channel);
receive_channel = 0;
diff --git a/libs/pbd/debug.cc b/libs/pbd/debug.cc
index e6d4abc..419c5bf 100644
--- a/libs/pbd/debug.cc
+++ b/libs/pbd/debug.cc
@@ -28,7 +28,7 @@
#include "pbd/debug.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using PBD::DebugBits;
@@ -56,6 +56,7 @@ DebugBits PBD::DEBUG::Configuration = PBD::new_debug_bit ("configuration");
DebugBits PBD::DEBUG::UndoHistory = PBD::new_debug_bit ("undohistory");
DebugBits PBD::DEBUG::Timing = PBD::new_debug_bit ("timing");
DebugBits PBD::DEBUG::Threads = PBD::new_debug_bit ("threads");
+DebugBits PBD::DEBUG::Locale = PBD::new_debug_bit ("locale");
/* These are debug bits that are used by backends. Since these are loaded dynamically,
after command-line parsing, defining them in code that is part of the backend
diff --git a/libs/pbd/enums.cc b/libs/pbd/enums.cc
index e8bb807..fbeed72 100644
--- a/libs/pbd/enums.cc
+++ b/libs/pbd/enums.cc
@@ -39,11 +39,14 @@ setup_libpbd_enums ()
REGISTER_CLASS_ENUM (Controllable, Toggle);
REGISTER_CLASS_ENUM (Controllable, GainLike);
- REGISTER (controllable_flags);
+ REGISTER_CLASS_ENUM (Controllable, RealTime);
+ REGISTER_CLASS_ENUM (Controllable, NotAutomatable);
+ REGISTER_BITS (controllable_flags);
REGISTER_CLASS_ENUM (Controllable, InverseGroup);
REGISTER_CLASS_ENUM (Controllable, UseGroup);
REGISTER_CLASS_ENUM (Controllable, NoGroup);
+ REGISTER_CLASS_ENUM (Controllable, ForGroup);
REGISTER (controllable_group_disposition);
}
diff --git a/libs/pbd/enumwriter.cc b/libs/pbd/enumwriter.cc
index ddc8215..7b3aba9 100644
--- a/libs/pbd/enumwriter.cc
+++ b/libs/pbd/enumwriter.cc
@@ -31,7 +31,7 @@
using namespace std;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
EnumWriter* EnumWriter::_instance = 0;
map<string,string> EnumWriter::hack_table;
diff --git a/libs/pbd/event_loop.cc b/libs/pbd/event_loop.cc
index 08f3c2e..ea3f7a4 100644
--- a/libs/pbd/event_loop.cc
+++ b/libs/pbd/event_loop.cc
@@ -27,7 +27,7 @@
#include "pbd/error.h"
#include "pbd/stacktrace.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace std;
diff --git a/libs/pbd/file_utils.cc b/libs/pbd/file_utils.cc
index 6cf43f3..26f80f9 100644
--- a/libs/pbd/file_utils.cc
+++ b/libs/pbd/file_utils.cc
@@ -57,7 +57,7 @@
#include "pbd/scoped_file_descriptor.h"
#include "pbd/stl_delete.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/libs/pbd/fpu.cc b/libs/pbd/fpu.cc
index 9838b45..7c3e097 100644
--- a/libs/pbd/fpu.cc
+++ b/libs/pbd/fpu.cc
@@ -33,7 +33,7 @@
#include "pbd/fpu.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace std;
@@ -48,32 +48,25 @@ FPU* FPU::_instance (0);
static void
__cpuid(int regs[4], int cpuid_leaf)
{
- int eax, ebx, ecx, edx;
asm volatile (
#if defined(__i386__)
"pushl %%ebx;\n\t"
#endif
- "movl %4, %%eax;\n\t"
"cpuid;\n\t"
- "movl %%eax, %0;\n\t"
- "movl %%ebx, %1;\n\t"
- "movl %%ecx, %2;\n\t"
- "movl %%edx, %3;\n\t"
+ "movl %%eax, (%1);\n\t"
+ "movl %%ebx, 4(%1);\n\t"
+ "movl %%ecx, 8(%1);\n\t"
+ "movl %%edx, 12(%1);\n\t"
#if defined(__i386__)
"popl %%ebx;\n\t"
#endif
- :"=m" (eax), "=m" (ebx), "=m" (ecx), "=m" (edx)
- :"r" (cpuid_leaf)
- :"%eax",
+ :"=a" (cpuid_leaf) /* %eax clobbered by CPUID */
+ :"S" (regs), "a" (cpuid_leaf)
+ :
#if !defined(__i386__)
"%ebx",
#endif
- "%ecx", "%edx");
-
- regs[0] = eax;
- regs[1] = ebx;
- regs[2] = ecx;
- regs[3] = edx;
+ "%ecx", "%edx", "memory");
}
#endif /* !PLATFORM_WINDOWS */
@@ -143,6 +136,11 @@ FPU::FPU ()
error << _("FPU object instantiated more than once") << endmsg;
}
+ if (getenv("ARDOUR_FPU_FLAGS")) {
+ _flags = Flags (atoi (getenv("ARDOUR_FPU_FLAGS")));
+ return;
+ }
+
#if !( (defined __x86_64__) || (defined __i386__) || (defined _M_X64) || (defined _M_IX86) ) // !ARCH_X86
/* Non-Intel architecture, nothing to do here */
return;
diff --git a/libs/pbd/i18n.h b/libs/pbd/i18n.h
deleted file mode 100644
index 35516fa..0000000
--- a/libs/pbd/i18n.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "gettext.h"
-
-#define _(Text) dgettext (PACKAGE, Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) (Text)
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/pbd/locale_guard.cc b/libs/pbd/locale_guard.cc
index 4ec6498..93ff11e 100644
--- a/libs/pbd/locale_guard.cc
+++ b/libs/pbd/locale_guard.cc
@@ -19,36 +19,113 @@
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include <locale.h>
+#include "pbd/compose.h"
+#include "pbd/debug.h"
+#include "pbd/error.h"
#include "pbd/locale_guard.h"
using namespace PBD;
-// try to avoid calling setlocale() recursively. this is not thread-safe.
-std::string PBD::LocaleGuard::current;
+/* Neither C nor C++ pick up a user's preferred locale choice without the
+ * application actively taking steps to make this happen.
+ *
+ * For C: setlocale (LC_ALL, "");
+ * For C++ (assuming that the C version was called):
+ * std::locale::global (std::locale (setlocale (LC_ALL, 0)));
+ *
+ * The application needs to make these calls, probably in main().
+ *
+ * Setting the C++ locale will change the C locale, but not the other way 'round.
+ * and some plugin may change either behind our back.
+ */
-LocaleGuard::LocaleGuard (const char* str)
- : old(0)
+LocaleGuard::LocaleGuard ()
+ : old_c_locale (0)
{
- if (current != str) {
- old = strdup (setlocale (LC_NUMERIC, NULL));
- if (strcmp (old, str)) {
- if (setlocale (LC_NUMERIC, str)) {
- current = str;
- }
+ /* A LocaleGuard object ensures that the
+ * LC_NUMERIC/std::locale::numeric aspect of the C and C++ locales are
+ * set to "C" during its lifetime, so that printf/iostreams use a
+ * portable format for numeric output (i.e. 1234.5 is always 1234.5 and
+ * not sometimes 1234,5, as it would be in fr or de locales)
+ */
+
+ char const * const current_c_locale = setlocale (LC_NUMERIC, 0);
+
+ if (strcmp ("C", current_c_locale) != 0) {
+
+ old_c_locale = strdup (current_c_locale);
+
+ try {
+ /* set the C++ global/default locale to whatever we are using
+ * now, but with "C" numeric handling.
+ *
+ * this also sets the C locale, so no additional call to setlocale() is required.
+ */
+
+ std::locale::global (std::locale (old_cpp_locale, "C", std::locale::numeric));
+ pre_cpp_locale = std::locale();
+ DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: change C & C++ locale from '%1' => %2\n", old_cpp_locale.name(), pre_cpp_locale.name()));
+
+ } catch (...) {
+ /* Apple in particular have historically done a
+ * terrible job supporting setlocale and even more so
+ * with the C++ API. Using any locale other than "C" or
+ * "POSIX" will fail, and in the case of the C++ API,
+ * will throw an exception. In that case, just try to
+ * use setlocale() to reset *only* the numeric aspect
+ * of the current locale settings back to "C", which is
+ * likely to work everywhere.
+ */
+
+ setlocale (LC_NUMERIC, "C");
+ pre_cpp_locale = std::locale();
+ DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: C++ locale API failed, change just C locale from '%1' => 'C' (C++ locale is %2)\n", old_c_locale, pre_cpp_locale.name()));
}
+
}
}
LocaleGuard::~LocaleGuard ()
{
- if (old) {
- if (setlocale (LC_NUMERIC, old)) {
- current = old;
+ char const * current_c_locale = setlocale (LC_NUMERIC, 0);
+ std::locale current_cpp_locale;
+
+ if (current_cpp_locale != pre_cpp_locale) {
+
+ PBD::warning << string_compose ("LocaleGuard: someone (a plugin) changed the C++ locale from\n\t%1\nto\n\t%2\n, expect non-portable session files. Decimal OK ? %2",
+ old_cpp_locale.name(), current_cpp_locale.name(),
+ (std::use_facet<std::numpunct<char> >(std::locale()).decimal_point() == '.'))
+ << endmsg;
+
+ try {
+ /* this resets C & C++ locales */
+ std::locale::global (old_cpp_locale);
+ DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: restore C & C++ locale: '%1'\n", std::locale().name()));
+ } catch (...) {
+ /* see comments in the constructor regarding the
+ * exception.
+ *
+ * This should restore restore numeric handling back to
+ * the default (which may reflect user
+ * preferences). This probably can't fail, because
+ * old_c_locale was already in use during the
+ * constructor for this object.
+ *
+ * Still ... Apple ... locale support ... just sayin' ....
+ */
+ setlocale (LC_NUMERIC, old_c_locale);
+ DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: C++ locale API failed, restore C locale from %1 to\n'%2'\n(C++ is '%3')\n", current_c_locale, old_c_locale, std::locale().name()));
}
- free (old);
+ } else if (old_c_locale && (strcmp (current_c_locale, old_c_locale) != 0)) {
+
+ /* reset only the C locale */
+ setlocale (LC_NUMERIC, old_c_locale);
+ DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: restore C locale from %1 to\n'%2'\n(C++ is '%3')\n", current_c_locale, old_c_locale, std::locale().name()));
}
-}
+ free (const_cast<char*> (old_c_locale));
+}
diff --git a/libs/pbd/malign.cc b/libs/pbd/malign.cc
index c48544d..59c6c44 100644
--- a/libs/pbd/malign.cc
+++ b/libs/pbd/malign.cc
@@ -25,7 +25,7 @@
#include "pbd/malign.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
diff --git a/libs/pbd/msvc/msvc_pbd.cc b/libs/pbd/msvc/msvc_pbd.cc
index ab79d8f..f49ac53 100644
--- a/libs/pbd/msvc/msvc_pbd.cc
+++ b/libs/pbd/msvc/msvc_pbd.cc
@@ -262,6 +262,47 @@ trunc(double x)
return (floor(x));
}
+#if defined(_MSC_VER) && (_MSC_VER < 1800)
+//***************************************************************
+//
+// expm1()
+//
+// Emulates C99 expm1() using exp().
+//
+// Returns:
+//
+// On Success: (('e' raised to the power of 'x') - 1)
+// (e.g. expm1(1) == 1.7182818).
+// On Failure: None, except that calling exp(x) should generate
+// an appropriate error for us (such as INF etc).
+//
+LIBPBD_API double PBD_APICALLTYPE
+expm1(double x)
+{
+ return (exp(x) - (double)1.0);
+}
+
+//***************************************************************
+//
+// log1p()
+//
+// Emulates C99 log1p() using log().
+//
+// Returns:
+//
+// On Success: The natural logarithm of (1 + x)
+// (e.g. log1p(1) == 0.69314718).
+// On Failure: None, except that calling log(x) should generate
+// an appropriate error for us (such as ERANGE etc).
+//
+LIBPBD_API double PBD_APICALLTYPE
+log1p(double x)
+{
+ return (log(x + (double)1.0));
+}
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
//***************************************************************
//
// log2()
@@ -280,6 +321,7 @@ log2(double x)
{
return (log(x) / log((double)2.0));
}
+#endif
namespace PBD {
diff --git a/libs/pbd/msvc/msvc_poll.cc b/libs/pbd/msvc/msvc_poll.cc
index 921638a..c18e706 100644
--- a/libs/pbd/msvc/msvc_poll.cc
+++ b/libs/pbd/msvc/msvc_poll.cc
@@ -71,7 +71,7 @@ int ret = 0;
if (0 > pos)
{
- // An error occured ('errno' should have been set by '_tell()')
+ // An error occurred ('errno' should have been set by '_tell()')
ret = (-1);
fds[loop].revents = POLLERR;
if (fds[loop].events & POLLRDNORM)
diff --git a/libs/pbd/pbd.cc b/libs/pbd/pbd.cc
index 13383c2..ab0f668 100644
--- a/libs/pbd/pbd.cc
+++ b/libs/pbd/pbd.cc
@@ -42,7 +42,7 @@
#include "pbd/windows_mmcss.h"
#endif
-#include "i18n.h"
+#include "pbd/i18n.h"
extern void setup_libpbd_enums ();
diff --git a/libs/pbd/pbd/.DS_Store b/libs/pbd/pbd/.DS_Store
deleted file mode 100644
index 5008ddf..0000000
Binary files a/libs/pbd/pbd/.DS_Store and /dev/null differ
diff --git a/libs/pbd/pbd/abstract_ui.cc b/libs/pbd/pbd/abstract_ui.cc
index 40b4ea8..6f03f25 100644
--- a/libs/pbd/pbd/abstract_ui.cc
+++ b/libs/pbd/pbd/abstract_ui.cc
@@ -26,7 +26,7 @@
#include "pbd/failed_constructor.h"
#include "pbd/debug.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#ifdef COMPILER_MSVC
#include <ardourext/misc.h> // Needed for 'DECLARE_DEFAULT_COMPARISONS'. Objects in an STL container can be
@@ -444,7 +444,7 @@ AbstractUI<RequestObject>::call_slot (InvalidationRecord* invalidation, const bo
template<typename RequestObject> void*
AbstractUI<RequestObject>::request_buffer_factory (uint32_t num_requests)
{
- RequestBuffer* mcr = new RequestBuffer (num_requests);
+ RequestBuffer* mcr = new RequestBuffer (num_requests); // leaks
per_thread_request_buffer.set (mcr);
return mcr;
}
diff --git a/libs/pbd/pbd/command.h b/libs/pbd/pbd/command.h
index 337140e..a9b313f 100644
--- a/libs/pbd/pbd/command.h
+++ b/libs/pbd/pbd/command.h
@@ -28,6 +28,7 @@
#include "pbd/signals.h"
#include "pbd/statefuldestructible.h"
+/** Base class for Undo/Redo commands and changesets */
class LIBPBD_API Command : public PBD::StatefulDestructible, public PBD::ScopedConnectionList
{
public:
diff --git a/libs/pbd/pbd/controllable.h b/libs/pbd/pbd/controllable.h
index 51c9c64..4168bbc 100644
--- a/libs/pbd/pbd/controllable.h
+++ b/libs/pbd/pbd/controllable.h
@@ -37,7 +37,7 @@ class XMLNode;
namespace PBD {
-/* This is a pure virtual class to represent a scalar control.
+/** This is a pure virtual class to represent a scalar control.
*
* Note that it contains no storage/state for the controllable thing that it
* represents. Derived classes must provide set_value()/get_value() methods,
@@ -49,12 +49,13 @@ namespace PBD {
* as a control whose value can range between 0 and 1.0.
*
*/
-
class LIBPBD_API Controllable : public PBD::StatefulDestructible {
public:
enum Flag {
Toggle = 0x1,
GainLike = 0x2,
+ RealTime = 0x4,
+ NotAutomatable = 0x8,
};
Controllable (const std::string& name, Flag f = Flag (0));
@@ -84,7 +85,11 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible {
enum GroupControlDisposition {
InverseGroup, /* set all controls in the same "group" as this one */
NoGroup, /* set only this control */
- UseGroup /* use group settings to decide which group controls are altered */
+ UseGroup, /* use group settings to decide which group controls are altered */
+ ForGroup /* this setting is being done *for* the group
+ (i.e. UseGroup was set in the callchain
+ somewhere).
+ */
};
/** Get and Set `internal' value
@@ -123,7 +128,7 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible {
static PBD::Signal1<void,Controllable*> Destroyed;
- PBD::Signal0<void> Changed;
+ PBD::Signal2<void,bool,PBD::Controllable::GroupControlDisposition> Changed;
int set_state (const XMLNode&, int version);
XMLNode& get_state ();
diff --git a/libs/pbd/pbd/controllable_descriptor.h b/libs/pbd/pbd/controllable_descriptor.h
deleted file mode 100644
index e4366c8..0000000
--- a/libs/pbd/pbd/controllable_descriptor.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- Copyright (C) 2009 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef __pbd_controllable_descriptor_h__
-#define __pbd_controllable_descriptor_h__
-
-#include <vector>
-#include <string>
-#include <stdint.h>
-
-#include "pbd/libpbd_visibility.h"
-
-namespace PBD {
-
-class LIBPBD_API ControllableDescriptor {
-public:
- enum TopLevelType {
- RemoteControlID,
- NamedRoute
- };
-
- enum SubType {
- Gain,
- Trim,
- Solo,
- Mute,
- Recenable,
- PanDirection,
- PanWidth,
- PanElevation,
- Balance,
- SendGain,
- PluginParameter
- };
-
- ControllableDescriptor ()
- : _top_level_type (RemoteControlID)
- , _subtype (Gain)
- , _rid (0)
- , _banked (false)
- , _bank_offset (0)
- {}
-
- int set (const std::string&);
-
- /* it is only valid to call top_level_name() if top_level_type() returns
- NamedRoute
- */
-
- TopLevelType top_level_type() const { return _top_level_type; }
- const std::string& top_level_name() const { return _top_level_name; }
-
- SubType subtype() const { return _subtype; }
-
- uint32_t rid() const;
- uint32_t target (uint32_t n) const;
- bool banked() const { return _banked; }
-
- void set_bank_offset (uint32_t o) { _bank_offset = o; }
-
-private:
- TopLevelType _top_level_type;
- SubType _subtype;
- std::string _top_level_name;
- uint32_t _rid;
- std::vector<uint32_t> _target;
- uint32_t _banked;
- uint32_t _bank_offset;
-};
-
-}
-
-#endif /* __pbd_controllable_descriptor_h__ */
diff --git a/libs/pbd/pbd/debug.h b/libs/pbd/pbd/debug.h
index 3696e7a..8db198e 100644
--- a/libs/pbd/pbd/debug.h
+++ b/libs/pbd/pbd/debug.h
@@ -58,6 +58,7 @@ namespace PBD {
LIBPBD_API extern DebugBits UndoHistory;
LIBPBD_API extern DebugBits Timing;
LIBPBD_API extern DebugBits Threads;
+ LIBPBD_API extern DebugBits Locale;
/* See notes in ../debug.cc on why these are defined here */
diff --git a/libs/pbd/pbd/floating.h b/libs/pbd/pbd/floating.h
index 86ab4a6..d7d6349 100644
--- a/libs/pbd/pbd/floating.h
+++ b/libs/pbd/pbd/floating.h
@@ -28,6 +28,7 @@
#include <stdint.h>
+#include <cstdlib> // abs(int)
#include <cmath>
#include "pbd/libpbd_visibility.h"
diff --git a/gtk2_ardour/i18n.h b/libs/pbd/pbd/i18n.h
similarity index 100%
rename from gtk2_ardour/i18n.h
rename to libs/pbd/pbd/i18n.h
diff --git a/libs/pbd/pbd/id.h b/libs/pbd/pbd/id.h
index 1f33e6d..5316e7c 100644
--- a/libs/pbd/pbd/id.h
+++ b/libs/pbd/pbd/id.h
@@ -29,6 +29,7 @@
namespace PBD {
+/** a unique ID to identify objects numerically */
class LIBPBD_API ID {
public:
ID ();
diff --git a/libs/pbd/pbd/locale_guard.h b/libs/pbd/pbd/locale_guard.h
index dc82ab4..b10e4d3 100644
--- a/libs/pbd/pbd/locale_guard.h
+++ b/libs/pbd/pbd/locale_guard.h
@@ -22,20 +22,20 @@
#include "pbd/libpbd_visibility.h"
-#include <string>
+#include <locale>
namespace PBD {
struct LIBPBD_API LocaleGuard {
- LocaleGuard (const char*);
- ~LocaleGuard ();
-
- static std::string current;
-
-private:
- char* old;
+ public:
+ LocaleGuard ();
+ ~LocaleGuard ();
+
+ private:
+ std::locale old_cpp_locale;
+ std::locale pre_cpp_locale;
+ char const * old_c_locale;
};
-
}
#endif /* __pbd_locale_guard__ */
diff --git a/libs/pbd/pbd/msvc_pbd.h b/libs/pbd/pbd/msvc_pbd.h
index 7529619..5a6b550 100644
--- a/libs/pbd/pbd/msvc_pbd.h
+++ b/libs/pbd/pbd/msvc_pbd.h
@@ -232,7 +232,15 @@ LIBPBD_API ssize_t PBD_APICALLTYPE pwrite(int handle, const void *buf, size_t
LIBPBD_API int PBD_APICALLTYPE poll(struct pollfd *fds, nfds_t nfds, int timeout);
LIBPBD_API double PBD_APICALLTYPE round(double x);
LIBPBD_API double PBD_APICALLTYPE trunc(double x);
-LIBPBD_API double PBD_APICALLTYPE log2(double x);
+
+#if defined(_MSC_VER) && (_MSC_VER < 1800)
+LIBPBD_API double PBD_APICALLTYPE expm1(double x);
+LIBPBD_API double PBD_APICALLTYPE log1p(double x);
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+LIBPBD_API double PBD_APICALLTYPE log2 (double x);
+#endif
namespace PBD {
diff --git a/libs/pbd/pbd/natsort.h b/libs/pbd/pbd/natsort.h
new file mode 100644
index 0000000..31c1dd7
--- /dev/null
+++ b/libs/pbd/pbd/natsort.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef PBD_NATSORT
+#define PBD_NATSORT
+
+#include <ctype.h>
+#include <stdlib.h>
+
+namespace PBD {
+
+inline bool
+naturally_less (const char* a, const char* b)
+{
+ const char* d_a = NULL;
+ const char* d_b = NULL;
+
+ for (;*a && *b; ++a, ++b) {
+ if (isdigit (*a) && isdigit (*b) && !d_a) {
+ d_a = a; d_b = b;
+ continue;
+ }
+ if (d_a) {
+ const int ia = atoi (d_a);
+ const int ib = atoi (d_b);
+ if (ia != ib) {
+ return ia < ib;
+ }
+ }
+ d_a = d_b = NULL;
+ if (*a == *b) {
+ continue;
+ }
+ return *a < *b;
+ }
+
+ if (d_a) {
+ return atoi (d_a) < atoi (d_b);
+ }
+
+ /* if we reach here, either strings are same length and equal
+ * or one is longer than the other.
+ */
+
+ if (*a) { return false; }
+ if (*b) { return true; }
+ return false; // equal
+}
+
+} // namespace PBD
+
+#endif // PBD_NATSORT
diff --git a/libs/pbd/pbd/properties.h b/libs/pbd/pbd/properties.h
index 0ba42b8..c97b472 100644
--- a/libs/pbd/pbd/properties.h
+++ b/libs/pbd/pbd/properties.h
@@ -236,8 +236,8 @@ public:
if (i == children.end()) {
return 0;
}
- XMLProperty* from = (*i)->property ("from");
- XMLProperty* to = (*i)->property ("to");
+ XMLProperty const * from = (*i)->property ("from");
+ XMLProperty const * to = (*i)->property ("to");
if (!from || !to) {
return 0;
diff --git a/libs/pbd/pbd/reallocpool.h b/libs/pbd/pbd/reallocpool.h
new file mode 100644
index 0000000..d6f8c5c
--- /dev/null
+++ b/libs/pbd/pbd/reallocpool.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef _reallocpool_h_
+#define _reallocpool_h_
+
+#ifndef NDEBUG
+//#define RAP_WITH_CALL_STATS // collect statistics on calls counts (light)
+//#define RAP_WITH_HISTOGRAM 513 // collect statistic about allocation size (not bad)
+//#define RAP_WITH_SEGMENT_STATS // collect statistics (expensive)
+#endif
+
+#ifndef RAP_BLOCKSIZE
+#define RAP_BLOCKSIZE 7 // [bytes] power-of-two minus one (optional)
+#endif
+
+#ifdef RAP_WITH_SEGMENT_STATS
+#define RAP_WITH_CALL_STATS
+#endif
+
+#include <string>
+
+#ifndef LIBPBD_API
+#include "pbd/libpbd_visibility.h"
+#endif
+
+namespace PBD {
+
+class LIBPBD_API ReallocPool
+{
+public:
+ ReallocPool (std::string name, size_t bytes);
+ ~ReallocPool ();
+
+ void set_name (const std::string& n) { _name = n; }
+
+ static void * lalloc (void* pool, void *ptr, size_t oldsize, size_t newsize) {
+ return static_cast<ReallocPool*>(pool)->_realloc (ptr, oldsize, newsize);
+ }
+
+ void * malloc (size_t size) {
+ return _realloc (NULL, 0, size);
+ }
+
+ void free (void *ptr) {
+ if (ptr) _realloc (ptr, 0, 0);
+ }
+
+ void * realloc (void *ptr, size_t newsize) {
+ return _realloc (ptr, _asize(ptr), newsize);
+ }
+
+ void printstats ();
+ void dumpsegments ();
+
+#ifdef RAP_WITH_CALL_STATS
+ size_t mem_used () const { return _cur_used; }
+#endif
+
+private:
+ std::string _name;
+ size_t _poolsize;
+ char *_pool;
+ char *_mru;
+
+#ifdef RAP_WITH_SEGMENT_STATS
+ size_t _cur_avail;
+ size_t _cur_allocated;
+ size_t _max_allocated;
+ size_t _seg_cur_count;
+ size_t _seg_max_count;
+ size_t _seg_max_used;
+ size_t _seg_max_avail;
+ void collect_segment_stats ();
+#endif
+#ifdef RAP_WITH_CALL_STATS
+ size_t _n_alloc;
+ size_t _n_grow;
+ size_t _n_shrink;
+ size_t _n_free;
+ size_t _n_noop;
+ size_t _n_oom;
+ size_t _cur_used; // cheaper _cur_allocated
+ size_t _max_used; // cheaper _max_allocated
+#endif
+#ifdef RAP_WITH_HISTOGRAM
+ size_t _hist_alloc [RAP_WITH_HISTOGRAM];
+ size_t _hist_free [RAP_WITH_HISTOGRAM];
+ size_t _hist_grow [RAP_WITH_HISTOGRAM];
+ size_t _hist_shrink [RAP_WITH_HISTOGRAM];
+
+ unsigned int hist_bin (size_t s) const;
+ void print_histogram (size_t const * const histogram) const;
+#endif
+
+ void *_realloc (void *ptr, size_t oldsize, size_t newsize);
+ void *_malloc (size_t);
+ void _free (void *ptr);
+ void _shrink (void *, size_t);
+ size_t _asize (void *);
+ void consolidate_ptr (char *);
+};
+
+} /* namespace */
+#endif // _reallocpool_h_
diff --git a/libs/pbd/pbd/ringbufferNPT.h b/libs/pbd/pbd/ringbufferNPT.h
index f01a6f3..267adf8 100644
--- a/libs/pbd/pbd/ringbufferNPT.h
+++ b/libs/pbd/pbd/ringbufferNPT.h
@@ -59,6 +59,7 @@ class /*LIBPBD_API*/ RingBufferNPT
size_t read (T *dest, size_t cnt);
size_t write (const T *src, size_t cnt);
+ size_t write_one (const T src);
struct rw_vector {
T *buf[2];
@@ -198,6 +199,12 @@ RingBufferNPT<T>::write (const T *src, size_t cnt)
return to_write;
}
+template<class T> /*LIBPBD_API*/ size_t
+RingBufferNPT<T>::write_one (const T src)
+{
+ return write (&src, 1);
+}
+
template<class T> /*LIBPBD_API*/ void
RingBufferNPT<T>::get_read_vector (typename RingBufferNPT<T>::rw_vector *vec)
{
diff --git a/libs/pbd/pbd/signals.h b/libs/pbd/pbd/signals.h
index 97cfa65..42727b7 100644
--- a/libs/pbd/pbd/signals.h
+++ b/libs/pbd/pbd/signals.h
@@ -20,6 +20,8 @@
#ifndef __pbd_signals_h__
#define __pbd_signals_h__
+#include <csignal>
+
#include <list>
#include <map>
@@ -67,7 +69,7 @@ public:
#endif
protected:
- Glib::Threads::Mutex _mutex;
+ mutable Glib::Threads::Mutex _mutex;
#ifdef DEBUG_PBD_SIGNAL_CONNECTIONS
bool _debug_connection;
#endif
diff --git a/libs/pbd/pbd/signals.py b/libs/pbd/pbd/signals.py
index 9495b70..fbcf1d4 100644
--- a/libs/pbd/pbd/signals.py
+++ b/libs/pbd/pbd/signals.py
@@ -268,11 +268,17 @@ def signal(f, n, v):
print("\t}", file=f)
print("""
- bool empty () {
+ bool empty () const {
Glib::Threads::Mutex::Lock lm (_mutex);
return _slots.empty ();
}
""", file=f)
+ print("""
+ bool size () const {
+ Glib::Threads::Mutex::Lock lm (_mutex);
+ return _slots.size ();
+ }
+""", file=f)
if v:
tp = comma_separated(["void"] + An)
@@ -286,14 +292,15 @@ def signal(f, n, v):
print("""
boost::shared_ptr<Connection> _connect (slot_function_type f)
{
+ boost::shared_ptr<Connection> c (new Connection (this));
+ Glib::Threads::Mutex::Lock lm (_mutex);
+ _slots[c] = f;
#ifdef DEBUG_PBD_SIGNAL_CONNECTIONS
if (_debug_connection) {
+ std::cerr << "+++++++ CONNECT " << this << " size now " << _slots.size() << std::endl;
PBD::stacktrace (std::cerr, 10);
}
#endif
- boost::shared_ptr<Connection> c (new Connection (this));
- Glib::Threads::Mutex::Lock lm (_mutex);
- _slots[c] = f;
return c;
}""", file=f)
@@ -302,6 +309,12 @@ def signal(f, n, v):
{
Glib::Threads::Mutex::Lock lm (_mutex);
_slots.erase (c);
+#ifdef DEBUG_PBD_SIGNAL_CONNECTIONS
+ if (_debug_connection) {
+ std::cerr << "------- DISCCONNECT " << this << " size now " << _slots.size() << std::endl;
+ PBD::stacktrace (std::cerr, 10);
+ }
+#endif
}
};
""", file=f)
diff --git a/libs/pbd/pbd/statefuldestructible.h b/libs/pbd/pbd/statefuldestructible.h
index 501633d..4c321d2 100644
--- a/libs/pbd/pbd/statefuldestructible.h
+++ b/libs/pbd/pbd/statefuldestructible.h
@@ -26,6 +26,7 @@
namespace PBD {
+/** Base class for objects with saveable and undoable state with destruction notification */
class LIBPBD_API StatefulDestructible : public Stateful, public Destructible
{
};
diff --git a/libs/pbd/pbd/system_exec.h b/libs/pbd/pbd/system_exec.h
index d5b14c8..a8a30ba 100644
--- a/libs/pbd/pbd/system_exec.h
+++ b/libs/pbd/pbd/system_exec.h
@@ -37,6 +37,9 @@
#undef interface // VKamyshniy: to avoid "include/giomm-2.4/giomm/dbusmessage.h:270:94: error: expected ',' or '...' before 'struct'"
#endif
+#else // posix
+#include <sys/types.h>
+#include <sys/wait.h> /* WNOHANG is part of the exposed API */
#endif
#include <string>
diff --git a/libs/pbd/pbd/tlsf.h b/libs/pbd/pbd/tlsf.h
new file mode 100644
index 0000000..30e53c1
--- /dev/null
+++ b/libs/pbd/pbd/tlsf.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef _tlsf_h_
+#define _tlsf_h_
+
+#include <string>
+
+#ifndef LIBPBD_API
+#include "pbd/libpbd_visibility.h"
+#endif
+
+namespace PBD {
+
+class LIBPBD_API TLSF
+{
+public:
+ TLSF (std::string name, size_t bytes);
+ ~TLSF ();
+
+ void set_name (const std::string& n) { _name = n; }
+
+ static void * lalloc (void* pool, void* ptr, size_t /* oldsize*/, size_t newsize) {
+ return static_cast<TLSF*>(pool)->_realloc (ptr, newsize);
+ }
+
+ void* malloc (size_t size) { return _malloc (size); }
+
+ void* realloc (void *ptr, size_t newsize) { return _realloc (ptr, newsize); }
+
+ void free (void* ptr) { _free (ptr); }
+
+ size_t get_used_size () const;
+ size_t get_max_size () const;
+
+private:
+ std::string _name;
+ char*_mp;
+
+ void* _malloc (size_t);
+ void* _realloc (void *, size_t);
+ void _free (void *);
+};
+
+} /* namespace */
+#endif // _reallocpool_h_
diff --git a/libs/pbd/pbd/xml++.h b/libs/pbd/pbd/xml++.h
index 8e0e015..f0956ed 100644
--- a/libs/pbd/pbd/xml++.h
+++ b/libs/pbd/pbd/xml++.h
@@ -28,7 +28,7 @@
*/
#include <string>
-#include <list>
+#include <vector>
#include <map>
#include <cstdio>
#include <cstdarg>
@@ -43,14 +43,14 @@ class XMLTree;
class XMLNode;
class XMLProperty;
-typedef std::list<XMLNode *> XMLNodeList;
-typedef std::list<boost::shared_ptr<XMLNode> > XMLSharedNodeList;
-typedef XMLNodeList::iterator XMLNodeIterator;
-typedef XMLNodeList::const_iterator XMLNodeConstIterator;
-typedef std::list<XMLProperty*> XMLPropertyList;
-typedef XMLPropertyList::iterator XMLPropertyIterator;
-typedef XMLPropertyList::const_iterator XMLPropertyConstIterator;
-typedef std::map<std::string, XMLProperty*> XMLPropertyMap;
+typedef std::vector<XMLNode *> XMLNodeList;
+typedef std::vector<boost::shared_ptr<XMLNode> > XMLSharedNodeList;
+typedef XMLNodeList::iterator XMLNodeIterator;
+typedef XMLNodeList::const_iterator XMLNodeConstIterator;
+typedef std::vector<XMLProperty*> XMLPropertyList;
+typedef XMLPropertyList::iterator XMLPropertyIterator;
+typedef XMLPropertyList::const_iterator XMLPropertyConstIterator;
+typedef std::map<std::string, XMLProperty*> XMLPropertyMap;
class LIBPBD_API XMLTree {
public:
@@ -117,10 +117,12 @@ public:
std::string attribute_value();
const XMLPropertyList& properties() const { return _proplist; }
- XMLProperty* property(const char*);
- XMLProperty* property(const std::string&);
- const XMLProperty* property(const char* n) const { return const_cast<XMLNode*>(this)->property(n); }
- const XMLProperty* property(const std::string& n) const { return const_cast<XMLNode*>(this)->property(n); }
+ XMLProperty const * property(const char*) const;
+ XMLProperty const * property(const std::string&) const;
+ XMLProperty * property(const char*);
+ XMLProperty * property(const std::string&);
+
+ bool has_property_with_value (const std::string&, const std::string&) const;
XMLProperty* add_property(const char* name, const std::string& value);
XMLProperty* add_property(const char* name, const char* value = "");
diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc
index 7cd25e4..5daa60a 100644
--- a/libs/pbd/pthread_utils.cc
+++ b/libs/pbd/pthread_utils.cc
@@ -146,7 +146,7 @@ pthread_set_name (const char *str)
{
/* copy string and delete it when exiting */
- thread_name.set (strdup (str));
+ thread_name.set (strdup (str)); // leaks
}
const char *
diff --git a/libs/pbd/reallocpool.cc b/libs/pbd/reallocpool.cc
new file mode 100644
index 0000000..0bf37f3
--- /dev/null
+++ b/libs/pbd/reallocpool.cc
@@ -0,0 +1,469 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <cstdio>
+
+#ifndef PLATFORM_WINDOWS
+#include <sys/mman.h>
+#endif
+
+#include "pbd/reallocpool.h"
+
+#ifdef RAP_WITH_SEGMENT_STATS
+#include <assert.h>
+#define STATS_segment collect_segment_stats();
+#define ASSERT assert
+#else
+#define STATS_segment
+#define ASSERT
+#endif
+
+#ifdef RAP_WITH_CALL_STATS
+#define STATS_inc(VAR) ++VAR;
+#define STATS_if(COND, VAR) if (COND) {++VAR;}
+#define STATS_used(DELTA) { _cur_used += (DELTA); if (_cur_used > _max_used) { _max_used = _cur_used; } }
+#else
+#define STATS_inc(VAR)
+#define STATS_if(COND, VAR)
+#define STATS_used(DELTA)
+#endif
+
+#ifdef RAP_WITH_HISTOGRAM
+#define STATS_hist(VAR, SIZE) ++VAR[hist_bin(SIZE)];
+#else
+#define STATS_hist(VAR, SIZE)
+#endif
+
+using namespace PBD;
+
+typedef int poolsize_t;
+
+ReallocPool::ReallocPool (std::string name, size_t bytes)
+ : _name (name)
+ , _poolsize (bytes)
+ , _pool (0)
+#ifdef RAP_WITH_SEGMENT_STATS
+ , _cur_avail (0)
+ , _cur_allocated (0)
+ , _max_allocated (0)
+ , _seg_cur_count (0)
+ , _seg_max_count (0)
+ , _seg_max_used (0)
+ , _seg_max_avail (0)
+#endif
+#ifdef RAP_WITH_CALL_STATS
+ , _n_alloc (0)
+ , _n_grow (0)
+ , _n_shrink (0)
+ , _n_free (0)
+ , _n_noop (0)
+ , _n_oom (0)
+ , _cur_used (0)
+ , _max_used (0)
+#endif
+{
+ _pool = (char*) ::malloc (bytes);
+
+ memset (_pool, 0, bytes); // make resident
+#ifndef PLATFORM_WINDOWS
+ mlock (_pool, bytes);
+#endif
+
+ poolsize_t *in = (poolsize_t*) _pool;
+ *in = - (bytes - sizeof (poolsize_t));
+ _mru = _pool;
+
+#ifdef RAP_WITH_HISTOGRAM
+ for (int i = 0; i < RAP_WITH_HISTOGRAM; ++i) {
+ _hist_alloc[i] = _hist_free[i] = _hist_grow[i] = _hist_shrink[i] = 0;
+ }
+#endif
+}
+
+ReallocPool::~ReallocPool ()
+{
+ STATS_segment;
+ printstats ();
+ ::free (_pool);
+ _pool = NULL;
+}
+
+// realloc() does it all, malloc(), realloc() and free()
+void *
+ReallocPool::_realloc (void *ptr, size_t oldsize, size_t newsize) {
+ void *rv = NULL;
+ ASSERT (!ptr || oldsize <= _asize (ptr));
+ oldsize = _asize (ptr); // ignore provided oldsize
+
+ if (ptr == 0 && newsize == 0) {
+ STATS_inc(_n_noop);
+ return NULL;
+ }
+
+ if (ptr == 0) {
+ rv = _malloc (newsize);
+ STATS_if (!rv, _n_oom);
+ STATS_inc(_n_alloc);
+ STATS_hist(_hist_alloc, newsize);
+ STATS_segment;
+ return rv;
+ }
+
+ if (newsize == 0) {
+ STATS_hist(_hist_free, _asize(ptr));
+ STATS_inc(_n_free);
+ STATS_segment;
+ _free (ptr);
+ return NULL;
+ }
+
+ if (newsize == oldsize) {
+ ASSERT (_asize (ptr) <= newsize);
+ STATS_inc(_n_noop);
+ return ptr;
+ }
+
+ if (newsize > oldsize) {
+#ifdef RAP_BLOCKSIZE
+ const size_t ns = (newsize + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE);
+ if (ns <= _asize(ptr)) {
+ STATS_inc(_n_noop);
+ return ptr;
+ }
+#endif
+ if ((rv = _malloc (newsize))) {
+ memcpy (rv, ptr, oldsize);
+ }
+ if (rv) {
+ _free (ptr);
+ }
+ STATS_if(!rv, _n_oom);
+ STATS_inc(_n_grow);
+ STATS_hist(_hist_grow, newsize);
+ STATS_segment;
+ return rv;
+ }
+
+ if (newsize < oldsize) {
+ ASSERT (_asize (ptr) >= newsize);
+#if 0 // re-allocate
+ if ((rv = _malloc (newsize))) {
+ memccpy (rv, ptr, newsize);
+ }
+ STATS_if(!rv, _n_oom);
+ _free (ptr);
+#elif 1 // shrink current segment
+ const size_t ns = (newsize + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE);
+ _shrink (ptr, ns);
+ rv = ptr;
+#else // do nothing
+ rv = ptr;
+#endif
+ STATS_inc(_n_shrink);
+ STATS_hist (_hist_shrink, newsize);
+ STATS_segment;
+ return rv;
+ }
+ return NULL; // not reached
+}
+
+#define SEGSIZ (*((poolsize_t*) p))
+
+void
+ReallocPool::consolidate_ptr (char *p) {
+ const poolsize_t sop = sizeof(poolsize_t);
+ if (p - SEGSIZ + sop >= _pool + _poolsize) {
+ return; // reached end
+ }
+ poolsize_t *next = (poolsize_t*)(p - SEGSIZ + sop);
+ while (*next < 0) {
+ SEGSIZ = SEGSIZ + (*next) - sop;
+ if (p - SEGSIZ + sop >= _pool + _poolsize) {
+ break;
+ }
+ next = (poolsize_t*)(p -SEGSIZ + sop);
+ }
+ _mru = p;
+}
+
+void *
+ReallocPool::_malloc (size_t s) {
+ const poolsize_t sop = sizeof(poolsize_t);
+ size_t traversed = 0;
+ char *p = _mru;
+
+#ifdef RAP_BLOCKSIZE
+ s = (s + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE); // optional, helps to reduce fragmentation
+#endif
+
+ while (1) { // iterates at most once over the available pool
+ ASSERT (SEGSIZ != 0);
+ while (SEGSIZ > 0) {
+ traversed += SEGSIZ + sop;
+ if (traversed >= _poolsize) {
+ return NULL; // reached last segment. OOM.
+ }
+ p += SEGSIZ + sop;
+ if (p == _pool + _poolsize) {
+ p = _pool;
+ }
+ }
+
+ // found free segment.
+ const poolsize_t avail = -SEGSIZ;
+ const poolsize_t sp = (poolsize_t)s;
+ const poolsize_t ss = sop + s;
+
+ if (sp == avail) {
+ // exact match
+ SEGSIZ = -SEGSIZ;
+ STATS_used (s);
+ return (p + sop);
+ }
+
+ if (ss < avail) {
+ // segment is larger than required space,
+ // (we need to fit data + two non-zero poolsize_t)
+ SEGSIZ = sp; // mark area as used.
+ *((poolsize_t*)(p + ss)) = ss - avail; // mark free space after.
+ consolidate_ptr (p + ss);
+ _mru = p + ss;
+ STATS_used (s);
+ return (p + sop);
+ }
+
+ // segment is not large enough
+ consolidate_ptr (p); // try to consolidate with next segment (if any)
+
+ // check segment (again) and skip over too small free ones
+ while (SEGSIZ < 0 && (-SEGSIZ) <= ss && (-SEGSIZ) != sp) {
+ traversed += -SEGSIZ + sop;
+ if (traversed >= _poolsize) {
+ return NULL; // reached last segment. OOM.
+ }
+ p += (-SEGSIZ) + sop;
+ if (p >= _pool + _poolsize) {
+ p = _pool;
+ if (SEGSIZ < 0) consolidate_ptr (p);
+ }
+ }
+ }
+}
+#undef SEGSIZ
+
+void
+ReallocPool::_free (void *ptr) {
+ poolsize_t *in = (poolsize_t*) ptr;
+ --in;
+ *in = -*in; // mark as free
+ //_mru = p + ss;
+ STATS_used (*in);
+}
+
+void
+ReallocPool::_shrink (void *ptr, size_t newsize) {
+ poolsize_t *in = (poolsize_t*) ptr;
+ --in;
+ const poolsize_t avail = *in;
+ const poolsize_t ss = newsize + sizeof(poolsize_t);
+ if (avail <= ss) {
+ return; // can't shrink
+ }
+ const poolsize_t sp = (poolsize_t)newsize;
+ STATS_used (newsize - avail);
+ *in = sp; // set new size
+ char *p = (char*) in;
+ *((poolsize_t*)(p + ss)) = ss - avail; // mark free space after.
+ //_mru = p + ss;
+}
+
+size_t
+ReallocPool::_asize (void *ptr) {
+ if (ptr == 0) return 0;
+ poolsize_t *in = (poolsize_t*) ptr;
+ --in;
+ return (*in);
+}
+
+
+/** STATS **/
+
+void
+ReallocPool::printstats ()
+{
+#ifdef RAP_WITH_SEGMENT_STATS
+ printf ("ReallocPool '%s': used: %ld (%.1f%%) (max: %ld), free: %ld [bytes]\n"
+ "|| segments: cur: %ld (max: %ld), largest-used: %ld, largest-free: %ld\n",
+ _name.c_str(),
+ _cur_allocated, _cur_allocated * 100.f / _poolsize, _max_allocated, _cur_avail,
+ _seg_cur_count, _seg_max_count, _seg_max_used, _seg_max_avail);
+#elif defined RAP_WITH_CALL_STATS
+ printf ("ReallocPool '%s':\n", _name.c_str());
+#endif
+#ifdef RAP_WITH_CALL_STATS
+ printf("|| malloc(): %ld, free(): %ld, realloc()+:%ld, realloc()-: %ld NOOP:%ld OOM:%ld\n",
+ _n_alloc, _n_free, _n_grow, _n_shrink, _n_noop, _n_oom);
+ printf("|| used: %ld / %ld, max: %ld (%.1f%%)\n",
+ _cur_used, _poolsize,
+ _max_used, 100.f *_max_used / _poolsize);
+#endif
+#ifdef RAP_WITH_HISTOGRAM
+ printf("--- malloc()\n");
+ print_histogram (_hist_alloc);
+ printf("--- realloc()/grow-to\n");
+ print_histogram (_hist_grow);
+ printf("--- realloc()/shrink-to\n");
+ print_histogram (_hist_shrink);
+ printf("--- free() histogram\n");
+ print_histogram (_hist_free);
+ printf("--------------------\n");
+#endif
+}
+
+void
+ReallocPool::dumpsegments ()
+{
+ char *p = _pool;
+ const poolsize_t sop = sizeof(poolsize_t);
+ poolsize_t *in = (poolsize_t*) p;
+ unsigned int traversed = 0;
+#ifdef RAP_WITH_CALL_STATS
+ size_t used = 0;
+#endif
+ printf ("<<<<< %s\n", _name.c_str());
+ while (1) {
+ if ((*in) > 0) {
+ printf ("0x%08x used %4d\n", traversed, *in);
+ printf ("0x%08x data %p\n", traversed + sop , p + sop);
+ traversed += *in + sop;
+ p += *in + sop;
+#ifdef RAP_WITH_CALL_STATS
+ used += *in;
+#endif
+ } else if ((*in) < 0) {
+ printf ("0x%08x free %4d [+%d]\n", traversed, -*in, sop);
+ traversed += -*in + sop;
+ p += -*in + sop;
+ } else {
+ printf ("0x%08x Corrupt!\n", traversed);
+ break;
+ }
+ in = (poolsize_t*) p;
+ if (p == _pool + _poolsize) {
+ printf ("%08x end\n", traversed);
+ break;
+ }
+ if (p > _pool + _poolsize) {
+ printf ("%08x Beyond End!\n", traversed);
+ break;
+ }
+ }
+#ifdef RAP_WITH_CALL_STATS
+ ASSERT (_cur_used == used);
+#endif
+ printf (">>>>>\n");
+}
+
+#ifdef RAP_WITH_SEGMENT_STATS
+void
+ReallocPool::collect_segment_stats ()
+{
+ char *p = _pool;
+ poolsize_t *in = (poolsize_t*) p;
+
+ _cur_allocated = _cur_avail = 0;
+ _seg_cur_count = _seg_max_avail = _seg_max_used = 0;
+
+ while (1) {
+ ++_seg_cur_count;
+ if ((*in) > 0) {
+ _cur_allocated += *in;
+ p += *in;
+ if (*in > (poolsize_t)_seg_max_used) {
+ _seg_max_used = *in;
+ }
+ } else {
+ _cur_avail += -*in;
+ p += -*in;
+ if (-*in > (poolsize_t)_seg_max_avail) {
+ _seg_max_avail = -*in;
+ }
+ }
+ p += sizeof(poolsize_t);
+ in = (poolsize_t*) p;
+ if (p == _pool + _poolsize) {
+ break;
+ }
+ }
+ _seg_cur_count = _seg_cur_count;
+
+ if (_cur_allocated > _max_allocated) {
+ _max_allocated = _cur_allocated;
+ }
+ if (_seg_cur_count > _seg_max_count) {
+ _seg_max_count = _seg_cur_count;
+ }
+}
+#endif
+
+#ifdef RAP_WITH_HISTOGRAM
+void
+ReallocPool::print_histogram (size_t const * const histogram) const
+{
+ size_t maxhist = 0;
+ for (int i = 0; i < RAP_WITH_HISTOGRAM; ++i) {
+ if (histogram[i] > maxhist) maxhist = histogram[i];
+ }
+ const int termwidth = 50;
+#ifdef RAP_BLOCKSIZE
+ const int fact = RAP_BLOCKSIZE + 1;
+#endif
+ if (maxhist > 0) for (int i = 0; i < RAP_WITH_HISTOGRAM; ++i) {
+ if (histogram[i] == 0) { continue; }
+ if (i == RAP_WITH_HISTOGRAM -1 ) {
+#ifdef RAP_BLOCKSIZE
+ printf(" > %4d: %7lu ", i * fact, histogram[i]);
+#else
+ printf(">%4d:%7lu ", i * fact, histogram[i]);
+#endif
+ } else {
+#ifdef RAP_BLOCKSIZE
+ printf("%4d .. %4d: %7lu ", i * fact, (i + 1) * fact -1, histogram[i]);
+#else
+ printf("%4d: %7lu ", i * fact, (i + 1) * fact -1 , histogram[i]);
+#endif
+ }
+ int bar_width = (histogram[i] * termwidth ) / maxhist;
+ if (bar_width == 0 && histogram[i] > 0) bar_width = 1;
+ for (int j = 0; j < bar_width; ++j) printf("#");
+ printf("\n");
+ }
+}
+
+unsigned int
+ReallocPool::hist_bin (size_t s) const {
+#ifdef RAP_BLOCKSIZE
+ s = (s + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE);
+ s /= (RAP_BLOCKSIZE + 1);
+#endif
+ if (s > RAP_WITH_HISTOGRAM - 1) s = RAP_WITH_HISTOGRAM - 1;
+ return s;
+}
+#endif
diff --git a/libs/pbd/stateful.cc b/libs/pbd/stateful.cc
index 3fb11a3..8b8219f 100644
--- a/libs/pbd/stateful.cc
+++ b/libs/pbd/stateful.cc
@@ -35,7 +35,7 @@
#include "pbd/xml++.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
diff --git a/libs/pbd/stateful_diff_command.cc b/libs/pbd/stateful_diff_command.cc
index f7fcd65..5721b58 100644
--- a/libs/pbd/stateful_diff_command.cc
+++ b/libs/pbd/stateful_diff_command.cc
@@ -20,7 +20,7 @@
#include "pbd/stateful_diff_command.h"
#include "pbd/property_list.h"
#include "pbd/demangle.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/pbd/test/natsort_test.cc b/libs/pbd/test/natsort_test.cc
new file mode 100644
index 0000000..6e8d19b
--- /dev/null
+++ b/libs/pbd/test/natsort_test.cc
@@ -0,0 +1,20 @@
+#include "natsort_test.h"
+#include "pbd/natsort.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (NatSortTest);
+
+using namespace std;
+
+
+void
+NatSortTest::testBasic ()
+{
+ CPPUNIT_ASSERT (!PBD::naturally_less ("a32", "a4"));
+ CPPUNIT_ASSERT (!PBD::naturally_less ("a32", "a04"));
+ CPPUNIT_ASSERT ( PBD::naturally_less ("a32", "a40"));
+ CPPUNIT_ASSERT ( PBD::naturally_less ("a32a", "a32b"));
+ CPPUNIT_ASSERT (!PBD::naturally_less ("a32b", "a32a"));
+ CPPUNIT_ASSERT (!PBD::naturally_less ("abcd", "abc"));
+ CPPUNIT_ASSERT ( PBD::naturally_less ("abc", "abcd"));
+ CPPUNIT_ASSERT (!PBD::naturally_less ("abc", "abc"));
+}
diff --git a/libs/pbd/test/natsort_test.h b/libs/pbd/test/natsort_test.h
new file mode 100644
index 0000000..7dea79a
--- /dev/null
+++ b/libs/pbd/test/natsort_test.h
@@ -0,0 +1,15 @@
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+class NatSortTest : public CppUnit::TestFixture
+{
+ CPPUNIT_TEST_SUITE (NatSortTest);
+ CPPUNIT_TEST (testBasic);
+ CPPUNIT_TEST_SUITE_END ();
+
+public:
+ NatSortTest () { }
+ void testBasic ();
+
+private:
+};
diff --git a/libs/pbd/test/reallocpool_test.cc b/libs/pbd/test/reallocpool_test.cc
new file mode 100644
index 0000000..6e6d615
--- /dev/null
+++ b/libs/pbd/test/reallocpool_test.cc
@@ -0,0 +1,41 @@
+#include <string.h>
+#include <stdlib.h>
+#include "reallocpool_test.h"
+#include "pbd/reallocpool.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (ReallocPoolTest);
+
+using namespace std;
+
+ReallocPoolTest::ReallocPoolTest ()
+{
+}
+
+void
+ReallocPoolTest::testBasic ()
+{
+ ::srand (0);
+ PBD::ReallocPool *m = new PBD::ReallocPool("TestPool", 256 * 1024);
+
+ for (int l = 0; l < 2 * 1024 * 1024; ++l) {
+ void *x[32];
+ size_t s[32];
+ int cnt = ::rand() % 32;
+ for (int i = 0; i < cnt; ++i) {
+ s[i] = ::rand() % 1024;
+ x[i] = m->malloc (s[i]);
+ }
+ for (int i = 0; i < cnt; ++i) {
+ if (x[i]) {
+ memset (x[i], 0xa5, s[i]);
+ }
+ }
+ for (int i = 0; i < cnt; ++i) {
+ m->free (x[i]);
+ }
+ }
+#ifdef RAP_WITH_CALL_STATS
+ CPPUNIT_ASSERT (m->mem_used() == 0);
+#endif
+ delete (m);
+}
diff --git a/libs/pbd/test/reallocpool_test.h b/libs/pbd/test/reallocpool_test.h
new file mode 100644
index 0000000..fe1d706
--- /dev/null
+++ b/libs/pbd/test/reallocpool_test.h
@@ -0,0 +1,16 @@
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include "glibmm/threads.h"
+
+class ReallocPoolTest : public CppUnit::TestFixture
+{
+ CPPUNIT_TEST_SUITE (ReallocPoolTest);
+ CPPUNIT_TEST (testBasic);
+ CPPUNIT_TEST_SUITE_END ();
+
+public:
+ ReallocPoolTest ();
+ void testBasic ();
+
+private:
+};
diff --git a/libs/pbd/tlsf.cc b/libs/pbd/tlsf.cc
new file mode 100644
index 0000000..5a83159
--- /dev/null
+++ b/libs/pbd/tlsf.cc
@@ -0,0 +1,628 @@
+/*
+ * Two Levels Segregate Fit memory allocator (TLSF)
+ * Version 2.4.6
+ *
+ * Written by Miguel Masmano Tello <mimastel at doctor.upv.es>
+ *
+ * Thanks to Ismael Ripoll for his suggestions and reviews
+ *
+ * Copyright (C) 2008, 2007, 2006, 2005, 2004
+ *
+ * This code is released using a dual license strategy: GPL/LGPL
+ * You can choose the licence that better fits your requirements.
+ *
+ * Released under the terms of the GNU General Public License Version 2.0
+ * Released under the terms of the GNU Lesser General Public License Version 2.1
+ *
+ */
+
+/*
+ * Code contributions:
+ *
+ * (Jul 28 2007) Herman ten Brugge <hermantenbrugge at home.nl>:
+ *
+ * - Add 64 bit support. It now runs on x86_64 and solaris64.
+ * - I also tested this on vxworks/32and solaris/32 and i386/32 processors.
+ * - Remove assembly code. I could not measure any performance difference
+ * on my core2 processor. This also makes the code more portable.
+ * - Moved defines/typedefs from tlsf.h to tlsf.c
+ * - Changed MIN_BLOCK_SIZE to sizeof (free_ptr_t) and BHDR_OVERHEAD to
+ * (sizeof (bhdr_t) - MIN_BLOCK_SIZE). This does not change the fact
+ * that the minumum size is still sizeof
+ * (bhdr_t).
+ * - Changed all C++ comment style to C style. (// -> /.* ... *./)
+ * - Used ls_bit instead of ffs and ms_bit instead of fls. I did this to
+ * avoid confusion with the standard ffs function which returns
+ * different values.
+ * - Created set_bit/clear_bit fuctions because they are not present
+ * on x86_64.
+ * - Added locking support + extra file target.h to show how to use it.
+ * - Added get_used_size function (REMOVED in 2.4)
+ * - Added rtl_realloc and rtl_calloc function
+ * - Implemented realloc clever support.
+ * - Added some test code in the example directory.
+ * - Bug fixed (discovered by the rockbox project: www.rockbox.org).
+ *
+ * (Oct 23 2006) Adam Scislowicz:
+ *
+ * - Support for ARMv5 implemented
+ *
+ */
+
+//#define TLSF_STATISTIC 1
+
+#ifndef USE_PRINTF
+#define USE_PRINTF (1)
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef TLSF_STATISTIC
+#define TLSF_STATISTIC (0)
+#endif
+
+#if TLSF_STATISTIC
+#define TLSF_ADD_SIZE(tlsf, b) do { \
+ tlsf->used_size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \
+ if (tlsf->used_size > tlsf->max_size) \
+ tlsf->max_size = tlsf->used_size; \
+ } while(0)
+
+#define TLSF_REMOVE_SIZE(tlsf, b) do { \
+ tlsf->used_size -= (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \
+ } while(0)
+#else
+#define TLSF_ADD_SIZE(tlsf, b) do{}while(0)
+#define TLSF_REMOVE_SIZE(tlsf, b) do{}while(0)
+#endif
+
+#include "pbd/tlsf.h"
+
+#if !defined(__GNUC__)
+#ifndef __inline__
+#define __inline__
+#endif
+#endif
+
+/* The debug functions only can be used when _DEBUG_TLSF_ is set. */
+#ifndef _DEBUG_TLSF_
+#define _DEBUG_TLSF_ (0)
+#endif
+
+/*************************************************************************/
+/* Definition of the structures used by TLSF */
+
+
+/* Some IMPORTANT TLSF parameters */
+/* Unlike the preview TLSF versions, now they are statics */
+#define BLOCK_ALIGN (sizeof(void *) * 2)
+
+#define MAX_FLI (30)
+#define MAX_LOG2_SLI (5)
+#define MAX_SLI (1 << MAX_LOG2_SLI) /* MAX_SLI = 2^MAX_LOG2_SLI */
+
+#define FLI_OFFSET (6) /* tlsf structure just will manage blocks bigger */
+/* than 128 bytes */
+#define SMALL_BLOCK (128)
+#define REAL_FLI (MAX_FLI - FLI_OFFSET)
+#define MIN_BLOCK_SIZE (sizeof (free_ptr_t))
+#define BHDR_OVERHEAD (sizeof (bhdr_t) - MIN_BLOCK_SIZE)
+#define TLSF_SIGNATURE (0x2A59FA59)
+
+#define PTR_MASK (sizeof(void *) - 1)
+#define BLOCK_SIZE (0xFFFFFFFF - PTR_MASK)
+
+#define GET_NEXT_BLOCK(_addr, _r) ((bhdr_t *) ((char *) (_addr) + (_r)))
+#define MEM_ALIGN ((BLOCK_ALIGN) - 1)
+#define ROUNDUP_SIZE(_r) (((_r) + MEM_ALIGN) & ~MEM_ALIGN)
+#define ROUNDDOWN_SIZE(_r) ((_r) & ~MEM_ALIGN)
+#define ROUNDUP(_x, _v) ((((~(_x)) + 1) & ((_v)-1)) + (_x))
+
+#define BLOCK_STATE (0x1)
+#define PREV_STATE (0x2)
+
+/* bit 0 of the block size */
+#define FREE_BLOCK (0x1)
+#define USED_BLOCK (0x0)
+
+/* bit 1 of the block size */
+#define PREV_FREE (0x2)
+#define PREV_USED (0x0)
+
+
+#ifdef USE_PRINTF
+#include <stdio.h>
+# define PRINT_MSG(fmt, args...) printf(fmt, ## args)
+# define ERROR_MSG(fmt, args...) printf(fmt, ## args)
+#else
+# if !defined(PRINT_MSG)
+# define PRINT_MSG(fmt, args...)
+# endif
+# if !defined(ERROR_MSG)
+# define ERROR_MSG(fmt, args...)
+# endif
+#endif
+
+typedef unsigned int u32_t; /* NOTE: Make sure that this type is 4 bytes long on your computer */
+typedef unsigned char u8_t; /* NOTE: Make sure that this type is 1 byte on your computer */
+
+typedef struct free_ptr_struct {
+ struct bhdr_struct *prev;
+ struct bhdr_struct *next;
+} free_ptr_t;
+
+typedef struct bhdr_struct {
+ /* This pointer is just valid if the first bit of size is set */
+ struct bhdr_struct *prev_hdr;
+ /* The size is stored in bytes */
+ size_t size; /* bit 0 indicates whether the block is used and */
+ /* bit 1 allows to know whether the previous block is free */
+ union {
+ struct free_ptr_struct free_ptr;
+ u8_t buffer[1]; /*sizeof(struct free_ptr_struct)]; */
+ } ptr;
+} bhdr_t;
+
+/* This structure is embedded at the beginning of each area, giving us
+ * enough information to cope with a set of areas */
+
+typedef struct area_info_struct {
+ bhdr_t *end;
+ struct area_info_struct *next;
+} area_info_t;
+
+typedef struct TLSF_struct {
+ /* the TLSF's structure signature */
+ u32_t tlsf_signature;
+
+#if TLSF_STATISTIC
+ /* These can not be calculated outside tlsf because we
+ * do not know the sizes when freeing/reallocing memory. */
+ size_t used_size;
+ size_t max_size;
+#endif
+
+ /* A linked list holding all the existing areas */
+ area_info_t *area_head;
+
+ /* the first-level bitmap */
+ /* This array should have a size of REAL_FLI bits */
+ u32_t fl_bitmap;
+
+ /* the second-level bitmap */
+ u32_t sl_bitmap[REAL_FLI];
+
+ bhdr_t *matrix[REAL_FLI][MAX_SLI];
+} tlsf_t;
+
+
+/******************************************************************/
+/************** Helping functions **************************/
+/******************************************************************/
+static __inline__ void set_bit(int nr, u32_t * addr);
+static __inline__ void clear_bit(int nr, u32_t * addr);
+static __inline__ int ls_bit(int x);
+static __inline__ int ms_bit(int x);
+static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl);
+static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl);
+static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl);
+static __inline__ bhdr_t *process_area(void *area, size_t size);
+
+static const int table[] = {
+ -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4,
+ 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5,
+ 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6,
+ 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6,
+ 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7,
+ 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7,
+ 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7,
+ 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7,
+ 7, 7, 7, 7, 7, 7, 7
+};
+
+static __inline__ int ls_bit(int i)
+{
+ unsigned int a;
+ unsigned int x = i & -i;
+
+ a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
+ return table[x >> a] + a;
+}
+
+static __inline__ int ms_bit(int i)
+{
+ unsigned int a;
+ unsigned int x = (unsigned int) i;
+
+ a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
+ return table[x >> a] + a;
+}
+
+static __inline__ void set_bit(int nr, u32_t * addr)
+{
+ addr[nr >> 5] |= 1 << (nr & 0x1f);
+}
+
+static __inline__ void clear_bit(int nr, u32_t * addr)
+{
+ addr[nr >> 5] &= ~(1 << (nr & 0x1f));
+}
+
+static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl)
+{
+ int _t;
+
+ if (*_r < SMALL_BLOCK) {
+ *_fl = 0;
+ *_sl = *_r / (SMALL_BLOCK / MAX_SLI);
+ } else {
+ _t = (1 << (ms_bit(*_r) - MAX_LOG2_SLI)) - 1;
+ *_r = *_r + _t;
+ *_fl = ms_bit(*_r);
+ *_sl = (*_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI;
+ *_fl -= FLI_OFFSET;
+ /*if ((*_fl -= FLI_OFFSET) < 0) // FL wil be always >0!
+ *_fl = *_sl = 0;
+ */
+ *_r &= ~_t;
+ }
+}
+
+static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl)
+{
+ if (_r < SMALL_BLOCK) {
+ *_fl = 0;
+ *_sl = _r / (SMALL_BLOCK / MAX_SLI);
+ } else {
+ *_fl = ms_bit(_r);
+ *_sl = (_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI;
+ *_fl -= FLI_OFFSET;
+ }
+}
+
+
+static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl)
+{
+ u32_t _tmp = _tlsf->sl_bitmap[*_fl] & (~0 << *_sl);
+ bhdr_t *_b = NULL;
+
+ if (_tmp) {
+ *_sl = ls_bit(_tmp);
+ _b = _tlsf->matrix[*_fl][*_sl];
+ } else {
+ *_fl = ls_bit(_tlsf->fl_bitmap & (~0 << (*_fl + 1)));
+ if (*_fl > 0) { /* likely */
+ *_sl = ls_bit(_tlsf->sl_bitmap[*_fl]);
+ _b = _tlsf->matrix[*_fl][*_sl];
+ }
+ }
+ return _b;
+}
+
+
+#define EXTRACT_BLOCK_HDR(_b, _tlsf, _fl, _sl) do { \
+ _tlsf -> matrix [_fl] [_sl] = _b -> ptr.free_ptr.next; \
+ if (_tlsf -> matrix[_fl][_sl]) \
+ _tlsf -> matrix[_fl][_sl] -> ptr.free_ptr.prev = NULL; \
+ else { \
+ clear_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \
+ if (!_tlsf -> sl_bitmap [_fl]) \
+ clear_bit (_fl, &_tlsf -> fl_bitmap); \
+ } \
+ _b -> ptr.free_ptr.prev = NULL; \
+ _b -> ptr.free_ptr.next = NULL; \
+ }while(0)
+
+
+#define EXTRACT_BLOCK(_b, _tlsf, _fl, _sl) do { \
+ if (_b -> ptr.free_ptr.next) \
+ _b -> ptr.free_ptr.next -> ptr.free_ptr.prev = _b -> ptr.free_ptr.prev; \
+ if (_b -> ptr.free_ptr.prev) \
+ _b -> ptr.free_ptr.prev -> ptr.free_ptr.next = _b -> ptr.free_ptr.next; \
+ if (_tlsf -> matrix [_fl][_sl] == _b) { \
+ _tlsf -> matrix [_fl][_sl] = _b -> ptr.free_ptr.next; \
+ if (!_tlsf -> matrix [_fl][_sl]) { \
+ clear_bit (_sl, &_tlsf -> sl_bitmap[_fl]); \
+ if (!_tlsf -> sl_bitmap [_fl]) \
+ clear_bit (_fl, &_tlsf -> fl_bitmap); \
+ } \
+ } \
+ _b -> ptr.free_ptr.prev = NULL; \
+ _b -> ptr.free_ptr.next = NULL; \
+ } while(0)
+
+#define INSERT_BLOCK(_b, _tlsf, _fl, _sl) do { \
+ _b -> ptr.free_ptr.prev = NULL; \
+ _b -> ptr.free_ptr.next = _tlsf -> matrix [_fl][_sl]; \
+ if (_tlsf -> matrix [_fl][_sl]) \
+ _tlsf -> matrix [_fl][_sl] -> ptr.free_ptr.prev = _b; \
+ _tlsf -> matrix [_fl][_sl] = _b; \
+ set_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \
+ set_bit (_fl, &_tlsf -> fl_bitmap); \
+ } while(0)
+
+static __inline__ bhdr_t *process_area(void *area, size_t size)
+{
+ bhdr_t *b, *lb, *ib;
+ area_info_t *ai;
+
+ ib = (bhdr_t *) area;
+ ib->size =
+ (sizeof(area_info_t) <
+ MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(sizeof(area_info_t)) | USED_BLOCK | PREV_USED;
+ b = (bhdr_t *) GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE);
+ b->size = ROUNDDOWN_SIZE(size - 3 * BHDR_OVERHEAD - (ib->size & BLOCK_SIZE)) | USED_BLOCK | PREV_USED;
+ b->ptr.free_ptr.prev = b->ptr.free_ptr.next = 0;
+ lb = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+ lb->prev_hdr = b;
+ lb->size = 0 | USED_BLOCK | PREV_FREE;
+ ai = (area_info_t *) ib->ptr.buffer;
+ ai->next = 0;
+ ai->end = lb;
+ return ib;
+}
+
+/* ****************************************************************************/
+
+#ifndef PLATFORM_WINDOWS
+#include <sys/mman.h>
+#endif
+
+PBD::TLSF::TLSF (std::string name, size_t mem_pool_size)
+ : _name (name)
+{
+ mem_pool_size = ROUNDUP_SIZE (mem_pool_size);
+ char * mem_pool = (char*) ::malloc (mem_pool_size);
+
+ assert (mem_pool);
+ assert (mem_pool_size >= sizeof(tlsf_t) + BHDR_OVERHEAD * 8);
+ assert (0 == (((unsigned long)mem_pool) & PTR_MASK));
+
+#ifndef PLATFORM_WINDOWS
+ memset (mem_pool, 0, mem_pool_size); // make resident
+ mlock (mem_pool, mem_pool_size);
+#endif
+
+ bhdr_t *b, *ib;
+
+ tlsf_t *tlsf = (tlsf_t *) mem_pool;
+ _mp = mem_pool;
+
+ /* Zeroing the memory pool */
+ memset(_mp, 0, sizeof(tlsf_t));
+
+ tlsf->tlsf_signature = TLSF_SIGNATURE;
+
+ ib = process_area(GET_NEXT_BLOCK
+ (_mp, ROUNDUP_SIZE(sizeof(tlsf_t))), ROUNDDOWN_SIZE(mem_pool_size - sizeof(tlsf_t)));
+ b = GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE);
+ _free(b->ptr.buffer);
+ tlsf->area_head = (area_info_t *) ib->ptr.buffer;
+
+#if TLSF_STATISTIC
+ tlsf->used_size = mem_pool_size - (b->size & BLOCK_SIZE);
+ tlsf->max_size = tlsf->used_size;
+ PRINT_MSG ("TLSF '%s': free %ld, reserved: %ld [bytes]\n",
+ _name.c_str(),
+ b->size & BLOCK_SIZE,
+ get_used_size());
+#endif
+}
+
+PBD::TLSF::~TLSF ()
+{
+#if TLSF_STATISTIC
+ PRINT_MSG ("TLSF '%s': used: %ld, max: %ld [bytes]\n",
+ _name.c_str(),
+ get_used_size(),
+ get_max_size());
+#endif
+ tlsf_t *tlsf = (tlsf_t *) _mp;
+ tlsf->tlsf_signature = 0;
+ ::free (_mp);
+ _mp = NULL;
+}
+
+size_t
+PBD::TLSF::get_used_size () const
+{
+#if TLSF_STATISTIC
+ return ((tlsf_t *) _mp)->used_size;
+#else
+ return 0;
+#endif
+}
+
+size_t
+PBD::TLSF::get_max_size () const
+{
+#if TLSF_STATISTIC
+ return ((tlsf_t *) _mp)->max_size;
+#else
+ return 0;
+#endif
+}
+
+void *
+PBD::TLSF::_malloc (size_t size)
+{
+ tlsf_t *tlsf = (tlsf_t *) _mp;
+ bhdr_t *b, *b2, *next_b;
+ int fl, sl;
+ size_t tmp_size;
+
+ size = (size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(size);
+
+ /* Rounding up the requested size and calculating fl and sl */
+ MAPPING_SEARCH(&size, &fl, &sl);
+
+ /* Searching a free block, recall that this function changes the values of fl and sl,
+ so they are not longer valid when the function fails */
+ b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl);
+ if (!b)
+ return NULL; /* Not found */
+
+ EXTRACT_BLOCK_HDR(b, tlsf, fl, sl);
+
+ /*-- found: */
+ next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+ /* Should the block be split? */
+ tmp_size = (b->size & BLOCK_SIZE) - size;
+ if (tmp_size >= sizeof(bhdr_t)) {
+ tmp_size -= BHDR_OVERHEAD;
+ b2 = GET_NEXT_BLOCK(b->ptr.buffer, size);
+ b2->size = tmp_size | FREE_BLOCK | PREV_USED;
+ next_b->prev_hdr = b2;
+ MAPPING_INSERT(tmp_size, &fl, &sl);
+ INSERT_BLOCK(b2, tlsf, fl, sl);
+
+ b->size = size | (b->size & PREV_STATE);
+ } else {
+ next_b->size &= (~PREV_FREE);
+ b->size &= (~FREE_BLOCK); /* Now it's used */
+ }
+
+ TLSF_ADD_SIZE(tlsf, b);
+
+ return (void *) b->ptr.buffer;
+}
+
+void
+PBD::TLSF::_free (void *ptr)
+{
+ tlsf_t *tlsf = (tlsf_t *) _mp;
+ bhdr_t *b, *tmp_b;
+ int fl = 0, sl = 0;
+
+ if (!ptr) {
+ return;
+ }
+ b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD);
+ b->size |= FREE_BLOCK;
+
+ TLSF_REMOVE_SIZE(tlsf, b);
+
+ b->ptr.free_ptr.prev = NULL;
+ b->ptr.free_ptr.next = NULL;
+ tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+ if (tmp_b->size & FREE_BLOCK) {
+ MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl);
+ EXTRACT_BLOCK(tmp_b, tlsf, fl, sl);
+ b->size += (tmp_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+ }
+ if (b->size & PREV_FREE) {
+ tmp_b = b->prev_hdr;
+ MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl);
+ EXTRACT_BLOCK(tmp_b, tlsf, fl, sl);
+ tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+ b = tmp_b;
+ }
+ MAPPING_INSERT(b->size & BLOCK_SIZE, &fl, &sl);
+ INSERT_BLOCK(b, tlsf, fl, sl);
+
+ tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+ tmp_b->size |= PREV_FREE;
+ tmp_b->prev_hdr = b;
+}
+
+void*
+PBD::TLSF::_realloc(void *ptr, size_t new_size)
+{
+ tlsf_t *tlsf = (tlsf_t *) _mp;
+ void *ptr_aux;
+ unsigned int cpsize;
+ bhdr_t *b, *tmp_b, *next_b;
+ int fl, sl;
+ size_t tmp_size;
+
+ if (!ptr) {
+ if (new_size)
+ return (void *) _malloc (new_size);
+ if (!new_size)
+ return NULL;
+ } else if (!new_size) {
+ _free(ptr);
+ return NULL;
+ }
+
+ b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD);
+ next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+ new_size = (new_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(new_size);
+ tmp_size = (b->size & BLOCK_SIZE);
+ if (new_size <= tmp_size) {
+ TLSF_REMOVE_SIZE(tlsf, b);
+ if (next_b->size & FREE_BLOCK) {
+ MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl);
+ EXTRACT_BLOCK(next_b, tlsf, fl, sl);
+ tmp_size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+ next_b = GET_NEXT_BLOCK(next_b->ptr.buffer, next_b->size & BLOCK_SIZE);
+ /* We allways reenter this free block because tmp_size will
+ be greater then sizeof (bhdr_t) */
+ }
+ tmp_size -= new_size;
+ if (tmp_size >= sizeof(bhdr_t)) {
+ tmp_size -= BHDR_OVERHEAD;
+ tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size);
+ tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED;
+ next_b->prev_hdr = tmp_b;
+ next_b->size |= PREV_FREE;
+ MAPPING_INSERT(tmp_size, &fl, &sl);
+ INSERT_BLOCK(tmp_b, tlsf, fl, sl);
+ b->size = new_size | (b->size & PREV_STATE);
+ }
+ TLSF_ADD_SIZE(tlsf, b);
+ return (void *) b->ptr.buffer;
+ }
+ if ((next_b->size & FREE_BLOCK)) {
+ if (new_size <= (tmp_size + (next_b->size & BLOCK_SIZE))) {
+ TLSF_REMOVE_SIZE(tlsf, b);
+ MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl);
+ EXTRACT_BLOCK(next_b, tlsf, fl, sl);
+ b->size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+ next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+ next_b->prev_hdr = b;
+ next_b->size &= ~PREV_FREE;
+ tmp_size = (b->size & BLOCK_SIZE) - new_size;
+ if (tmp_size >= sizeof(bhdr_t)) {
+ tmp_size -= BHDR_OVERHEAD;
+ tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size);
+ tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED;
+ next_b->prev_hdr = tmp_b;
+ next_b->size |= PREV_FREE;
+ MAPPING_INSERT(tmp_size, &fl, &sl);
+ INSERT_BLOCK(tmp_b, tlsf, fl, sl);
+ b->size = new_size | (b->size & PREV_STATE);
+ }
+ TLSF_ADD_SIZE(tlsf, b);
+ return (void *) b->ptr.buffer;
+ }
+ }
+
+ if (!(ptr_aux = _malloc (new_size))){
+ return NULL;
+ }
+
+ cpsize = ((b->size & BLOCK_SIZE) > new_size) ? new_size : (b->size & BLOCK_SIZE);
+
+ memcpy(ptr_aux, ptr, cpsize);
+
+ _free(ptr);
+ return ptr_aux;
+}
diff --git a/libs/pbd/windows_timer_utils.cc b/libs/pbd/windows_timer_utils.cc
index ab45e30..0fab935 100644
--- a/libs/pbd/windows_timer_utils.cc
+++ b/libs/pbd/windows_timer_utils.cc
@@ -25,7 +25,7 @@
#include "pbd/debug.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#define DEBUG_TIMING(msg) DEBUG_TRACE (PBD::DEBUG::Timing, msg);
diff --git a/libs/pbd/wscript b/libs/pbd/wscript
index 0d11c85..6f872c9 100644
--- a/libs/pbd/wscript
+++ b/libs/pbd/wscript
@@ -37,7 +37,6 @@ libpbd_sources = [
'configuration_variable.cc',
'convert.cc',
'controllable.cc',
- 'controllable_descriptor.cc',
'crossthread.cc',
'cpus.cc',
'debug.cc',
@@ -62,6 +61,7 @@ libpbd_sources = [
'pool.cc',
'property_list.cc',
'pthread_utils.cc',
+ 'reallocpool.cc',
'receiver.cc',
'resource.cc',
'search_path.cc',
@@ -77,6 +77,7 @@ libpbd_sources = [
'textreceiver.cc',
'timer.cc',
'timing.cc',
+ 'tlsf.cc',
'transmitter.cc',
'undo.cc',
'uuid.cc',
@@ -163,6 +164,8 @@ def build(bld):
test/signals_test.cc
test/convert_test.cc
test/filesystem_test.cc
+ test/natsort_test.cc
+ test/reallocpool_test.cc
test/xml_test.cc
test/test_common.cc
'''.split()
diff --git a/libs/pbd/xml++.cc b/libs/pbd/xml++.cc
index 963531c..80fc882 100644
--- a/libs/pbd/xml++.cc
+++ b/libs/pbd/xml++.cc
@@ -6,7 +6,10 @@
*/
#include <iostream>
+
+#include "pbd/stacktrace.h"
#include "pbd/xml++.h"
+
#include <libxml/debugXML.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
@@ -404,7 +407,32 @@ XMLNode::add_content(const string& c)
return add_child_copy(XMLNode (string(), c));
}
-XMLProperty*
+XMLProperty const *
+XMLNode::property(const char* n) const
+{
+ string ns(n);
+ map<string,XMLProperty*>::const_iterator iter;
+
+ if ((iter = _propmap.find(ns)) != _propmap.end()) {
+ return iter->second;
+ }
+
+ return 0;
+}
+
+XMLProperty const *
+XMLNode::property(const string& ns) const
+{
+ map<string,XMLProperty*>::const_iterator iter;
+
+ if ((iter = _propmap.find(ns)) != _propmap.end()) {
+ return iter->second;
+ }
+
+ return 0;
+}
+
+XMLProperty *
XMLNode::property(const char* n)
{
string ns(n);
@@ -417,7 +445,7 @@ XMLNode::property(const char* n)
return 0;
}
-XMLProperty*
+XMLProperty *
XMLNode::property(const string& ns)
{
map<string,XMLProperty*>::iterator iter;
@@ -429,6 +457,17 @@ XMLNode::property(const string& ns)
return 0;
}
+bool
+XMLNode::has_property_with_value (const string& key, const string& value) const
+{
+ map<string,XMLProperty*>::const_iterator iter = _propmap.find(key);
+ if (iter != _propmap.end()) {
+ const XMLProperty* p = (iter->second);
+ return (p && p->value() == value);
+ }
+ return false;
+}
+
XMLProperty*
XMLNode::add_property(const char* n, const string& v)
{
@@ -472,7 +511,10 @@ XMLNode::remove_property(const string& n)
{
if (_propmap.find(n) != _propmap.end()) {
XMLProperty* p = _propmap[n];
- _proplist.remove (p);
+ XMLPropertyIterator i = std::find(_proplist.begin(), _proplist.end(), p);
+ if (i != _proplist.end ()) {
+ _proplist.erase (i);
+ }
delete p;
_propmap.erase(n);
}
@@ -492,15 +534,12 @@ void
XMLNode::remove_nodes(const string& n)
{
XMLNodeIterator i = _children.begin();
- XMLNodeIterator tmp;
-
while (i != _children.end()) {
- tmp = i;
- ++tmp;
if ((*i)->name() == n) {
- _children.erase (i);
+ i = _children.erase (i);
+ } else {
+ ++i;
}
- i = tmp;
}
}
@@ -508,16 +547,14 @@ void
XMLNode::remove_nodes_and_delete(const string& n)
{
XMLNodeIterator i = _children.begin();
- XMLNodeIterator tmp;
while (i != _children.end()) {
- tmp = i;
- ++tmp;
if ((*i)->name() == n) {
delete *i;
- _children.erase (i);
+ i = _children.erase (i);
+ } else {
+ ++i;
}
- i = tmp;
}
}
@@ -525,20 +562,16 @@ void
XMLNode::remove_nodes_and_delete(const string& propname, const string& val)
{
XMLNodeIterator i = _children.begin();
- XMLNodeIterator tmp;
- XMLProperty* prop;
+ XMLProperty const * prop;
while (i != _children.end()) {
- tmp = i;
- ++tmp;
-
prop = (*i)->property(propname);
if (prop && prop->value() == val) {
delete *i;
- _children.erase(i);
+ i = _children.erase(i);
+ } else {
+ ++i;
}
-
- i = tmp;
}
}
diff --git a/libs/plugins/a-comp.lv2/a-comp#stereo.ttl.in b/libs/plugins/a-comp.lv2/a-comp#stereo.ttl.in
new file mode 100644
index 0000000..591d9c8
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/a-comp#stereo.ttl.in
@@ -0,0 +1,155 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz: <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+
+<http://ardour.org/credits.html>
+ a foaf:Person ;
+ foaf:name "Ardour Team" ;
+ foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-comp#stereo>
+ a lv2:Plugin, doap:Project, lv2:CompressorPlugin ;
+
+ lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable>;
+
+ lv2:port [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 0 ;
+ lv2:name "Attack" ;
+ lv2:symbol "att" ;
+ lv2:default 10.000000 ;
+ lv2:minimum 0.100000 ;
+ lv2:maximum 100.000000 ;
+ unit:unit unit:ms ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 1 ;
+ lv2:name "Release" ;
+ lv2:symbol "rel" ;
+ lv2:default 80.000000 ;
+ lv2:minimum 1.000000 ;
+ lv2:maximum 500.000000 ;
+ unit:unit unit:ms ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 2 ;
+ lv2:name "Knee" ;
+ lv2:symbol "kn" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 8.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 3 ;
+ lv2:name "Ratio" ;
+ lv2:symbol "rat" ;
+ lv2:default 4.000000 ;
+ lv2:minimum 1.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit [
+ rdfs:label " " ;
+ unit:symbol " " ;
+ unit:render "%f " ;
+ ] ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 4 ;
+ lv2:name "Threshold" ;
+ lv2:symbol "thr" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -60.000000 ;
+ lv2:maximum 0.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 5 ;
+ lv2:name "Makeup" ;
+ lv2:symbol "mak" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 30.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:OutputPort, lv2:ControlPort ;
+ lv2:index 6 ;
+ lv2:name "Gain Reduction" ;
+ lv2:symbol "gr" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 45.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:OutputPort, lv2:ControlPort ;
+ lv2:index 7 ;
+ lv2:name "Output Level" ;
+ lv2:symbol "outlevel" ;
+ lv2:default -45.000000 ;
+ lv2:minimum -45.000000 ;
+ lv2:maximum 0.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 8 ;
+ lv2:name "Sidechain" ;
+ lv2:symbol "sidech" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ] ;
+
+ lv2:port [
+ a lv2:InputPort, lv2:AudioPort ;
+ lv2:index 9 ;
+ lv2:symbol "in_1" ;
+ lv2:name "Audio Input 1" ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:AudioPort ;
+ lv2:index 10 ;
+ lv2:symbol "in_2" ;
+ lv2:name "Audio Input 2" ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:AudioPort ;
+ lv2:index 11 ;
+ lv2:symbol "sidechain_in" ;
+ lv2:name "Sidechain Input" ;
+ lv2:portProperty lv2:isSideChain;
+ ],
+ [
+ a lv2:OutputPort, lv2:AudioPort ;
+ lv2:index 12 ;
+ lv2:symbol "out_1" ;
+ lv2:name "Audio Output 1" ;
+ ],
+ [
+ a lv2:OutputPort, lv2:AudioPort ;
+ lv2:index 13 ;
+ lv2:symbol "out_2" ;
+ lv2:name "Audio Output 2" ;
+ ] ;
+
+ rdfs:comment """
+A powerful stereo compressor.
+""" ;
+
+ doap:name "a-Compressor stereo" ;
+ doap:license "GPL v2+" ;
+ doap:maintainer <http://ardour.org/credits.html> ;
+
+ lv2:microVersion 1 ;
+ lv2:minorVersion 1 .
diff --git a/libs/plugins/a-comp.lv2/a-comp.c b/libs/plugins/a-comp.lv2/a-comp.c
new file mode 100644
index 0000000..3b123d2
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/a-comp.c
@@ -0,0 +1,698 @@
+/* a-comp
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#ifdef LV2_EXTENDED
+#include <cairo/cairo.h>
+#include "ardour/lv2_extensions.h"
+#endif
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+#define ACOMP_URI "urn:ardour:a-comp"
+#define ACOMP_STEREO_URI "urn:ardour:a-comp#stereo"
+
+typedef enum {
+ ACOMP_ATTACK = 0,
+ ACOMP_RELEASE,
+ ACOMP_KNEE,
+ ACOMP_RATIO,
+ ACOMP_THRESHOLD,
+ ACOMP_MAKEUP,
+
+ ACOMP_GAINR,
+ ACOMP_OUTLEVEL,
+ ACOMP_SIDECHAIN,
+
+ ACOMP_INPUT,
+ ACOMP_SC,
+ ACOMP_OUTPUT,
+} PortIndexMono;
+
+typedef enum {
+ ACOMP_STEREO_ATTACK = 0,
+ ACOMP_STEREO_RELEASE,
+ ACOMP_STEREO_KNEE,
+ ACOMP_STEREO_RATIO,
+ ACOMP_STEREO_THRESHOLD,
+ ACOMP_STEREO_MAKEUP,
+
+ ACOMP_STEREO_GAINR,
+ ACOMP_STEREO_OUTLEVEL,
+ ACOMP_STEREO_SIDECHAIN,
+
+ ACOMP_STEREO_INPUT0,
+ ACOMP_STEREO_INPUT1,
+ ACOMP_STEREO_SC,
+ ACOMP_STEREO_OUTPUT0,
+ ACOMP_STEREO_OUTPUT1,
+} PortIndexStereo;
+
+typedef struct {
+ float* attack;
+ float* release;
+ float* knee;
+ float* ratio;
+ float* thresdb;
+ float* makeup;
+
+ float* gainr;
+ float* outlevel;
+ float* sidechain;
+
+ float* input0;
+ float* input1;
+ float* sc;
+ float* output0;
+ float* output1;
+
+ float srate;
+ float old_yl;
+ float old_y1;
+ float old_yg;
+
+#ifdef LV2_EXTENDED
+ LV2_Inline_Display_Image_Surface surf;
+ bool need_expose;
+ cairo_surface_t* display;
+ LV2_Inline_Display* queue_draw;
+ uint32_t w, h;
+
+ /* ports pointers are only valid during run so we'll
+ * have to cache them for the display, besides
+ * we do want to check for changes
+ */
+ float v_knee;
+ float v_ratio;
+ float v_thresdb;
+ float v_lvl;
+ float v_lvl_in;
+ float v_lvl_out;
+#endif
+} AComp;
+
+static LV2_Handle
+instantiate(const LV2_Descriptor* descriptor,
+ double rate,
+ const char* bundle_path,
+ const LV2_Feature* const* features)
+{
+ AComp* acomp = (AComp*)calloc(1, sizeof(AComp));
+
+ for (int i=0; features[i]; ++i) {
+#ifdef LV2_EXTENDED
+ if (!strcmp(features[i]->URI, LV2_INLINEDISPLAY__queue_draw)) {
+ acomp->queue_draw = (LV2_Inline_Display*) features[i]->data;
+ }
+#endif
+ }
+
+ acomp->srate = rate;
+ acomp->old_yl=acomp->old_y1=acomp->old_yg=0.f;
+#ifdef LV2_EXTENDED
+ acomp->need_expose = true;
+#endif
+
+ return (LV2_Handle)acomp;
+}
+
+
+static void
+connect_port_mono(LV2_Handle instance,
+ uint32_t port,
+ void* data)
+{
+ AComp* acomp = (AComp*)instance;
+
+ switch ((PortIndexMono)port) {
+ case ACOMP_ATTACK:
+ acomp->attack = (float*)data;
+ break;
+ case ACOMP_RELEASE:
+ acomp->release = (float*)data;
+ break;
+ case ACOMP_KNEE:
+ acomp->knee = (float*)data;
+ break;
+ case ACOMP_RATIO:
+ acomp->ratio = (float*)data;
+ break;
+ case ACOMP_THRESHOLD:
+ acomp->thresdb = (float*)data;
+ break;
+ case ACOMP_MAKEUP:
+ acomp->makeup = (float*)data;
+ break;
+ case ACOMP_GAINR:
+ acomp->gainr = (float*)data;
+ break;
+ case ACOMP_OUTLEVEL:
+ acomp->outlevel = (float*)data;
+ break;
+ case ACOMP_SIDECHAIN:
+ acomp->sidechain = (float*)data;
+ break;
+ case ACOMP_INPUT:
+ acomp->input0 = (float*)data;
+ break;
+ case ACOMP_SC:
+ acomp->sc = (float*)data;
+ break;
+ case ACOMP_OUTPUT:
+ acomp->output0 = (float*)data;
+ break;
+ }
+}
+
+static void
+connect_port_stereo(LV2_Handle instance,
+ uint32_t port,
+ void* data)
+{
+ AComp* acomp = (AComp*)instance;
+
+ switch ((PortIndexStereo)port) {
+ case ACOMP_STEREO_ATTACK:
+ acomp->attack = (float*)data;
+ break;
+ case ACOMP_STEREO_RELEASE:
+ acomp->release = (float*)data;
+ break;
+ case ACOMP_STEREO_KNEE:
+ acomp->knee = (float*)data;
+ break;
+ case ACOMP_STEREO_RATIO:
+ acomp->ratio = (float*)data;
+ break;
+ case ACOMP_STEREO_THRESHOLD:
+ acomp->thresdb = (float*)data;
+ break;
+ case ACOMP_STEREO_MAKEUP:
+ acomp->makeup = (float*)data;
+ break;
+ case ACOMP_STEREO_GAINR:
+ acomp->gainr = (float*)data;
+ break;
+ case ACOMP_STEREO_OUTLEVEL:
+ acomp->outlevel = (float*)data;
+ break;
+ case ACOMP_STEREO_SIDECHAIN:
+ acomp->sidechain = (float*)data;
+ break;
+ case ACOMP_STEREO_INPUT0:
+ acomp->input0 = (float*)data;
+ break;
+ case ACOMP_STEREO_INPUT1:
+ acomp->input1 = (float*)data;
+ break;
+ case ACOMP_STEREO_SC:
+ acomp->sc = (float*)data;
+ break;
+ case ACOMP_STEREO_OUTPUT0:
+ acomp->output0 = (float*)data;
+ break;
+ case ACOMP_STEREO_OUTPUT1:
+ acomp->output1 = (float*)data;
+ break;
+ }
+}
+
+// Force already-denormal float value to zero
+static inline float
+sanitize_denormal(float value) {
+ if (!isnormal(value)) {
+ value = 0.f;
+ }
+ return value;
+}
+
+static inline float
+from_dB(float gdb) {
+ return (exp(gdb/20.f*log(10.f)));
+}
+
+static inline float
+to_dB(float g) {
+ return (20.f*log10(g));
+}
+
+static void
+activate(LV2_Handle instance)
+{
+ AComp* acomp = (AComp*)instance;
+
+ *(acomp->gainr) = 0.0f;
+ *(acomp->outlevel) = -45.0f;
+ acomp->old_yl=acomp->old_y1=acomp->old_yg=0.f;
+}
+
+static void
+run_mono(LV2_Handle instance, uint32_t n_samples)
+{
+ AComp* acomp = (AComp*)instance;
+
+ const float* const input = acomp->input0;
+ const float* const sc = acomp->sc;
+ float* const output = acomp->output0;
+
+ float srate = acomp->srate;
+ float width = (6.f * *(acomp->knee)) + 0.01;
+ float cdb=0.f;
+ float attack_coeff = exp(-1000.f/(*(acomp->attack) * srate));
+ float release_coeff = exp(-1000.f/(*(acomp->release) * srate));
+
+ float max = 0.f;
+ float lgaininp = 0.f;
+ float Lgain = 1.f;
+ float Lxg, Lxl, Lyg, Lyl, Ly1;
+ int usesidechain = (*(acomp->sidechain) < 0.5) ? 0 : 1;
+ uint32_t i;
+ float ingain;
+ float in0;
+ float sc0;
+ float ratio = *(acomp->ratio);
+ float thresdb = *(acomp->thresdb);
+
+#ifdef LV2_EXTENDED
+ if (acomp->v_knee != *acomp->knee) {
+ acomp->v_knee = *acomp->knee;
+ acomp->need_expose = true;
+ }
+
+ if (acomp->v_ratio != *acomp->ratio) {
+ acomp->v_ratio = *acomp->ratio;
+ acomp->need_expose = true;
+ }
+
+ if (acomp->v_thresdb != *acomp->thresdb) {
+ acomp->v_thresdb = *acomp->thresdb;
+ acomp->need_expose = true;
+ }
+#endif
+
+ float in_peak = 0;
+
+ for (i = 0; i < n_samples; i++) {
+ in0 = input[i];
+ sc0 = sc[i];
+ ingain = usesidechain ? fabs(sc0) : fabs(in0);
+ in_peak = fmaxf (in_peak, ingain);
+ Lyg = 0.f;
+ Lxg = (ingain==0.f) ? -160.f : to_dB(ingain);
+ Lxg = sanitize_denormal(Lxg);
+
+
+ if (2.f*(Lxg-thresdb) < -width) {
+ Lyg = Lxg;
+ } else if (2.f*(Lxg-thresdb) > width) {
+ Lyg = thresdb + (Lxg-thresdb)/ratio;
+ Lyg = sanitize_denormal(Lyg);
+ } else {
+ Lyg = Lxg + (1.f/ratio-1.f)*(Lxg-thresdb+width/2.f)*(Lxg-thresdb+width/2.f)/(2.f*width);
+ }
+
+ Lxl = Lxg - Lyg;
+
+ acomp->old_y1 = sanitize_denormal(acomp->old_y1);
+ acomp->old_yl = sanitize_denormal(acomp->old_yl);
+ Ly1 = fmaxf(Lxl, release_coeff * acomp->old_y1+(1.f-release_coeff)*Lxl);
+ Lyl = attack_coeff * acomp->old_yl+(1.f-attack_coeff)*Ly1;
+ Ly1 = sanitize_denormal(Ly1);
+ Lyl = sanitize_denormal(Lyl);
+
+ cdb = -Lyl;
+ Lgain = from_dB(cdb);
+
+ *(acomp->gainr) = Lyl;
+
+ lgaininp = in0 * Lgain;
+ output[i] = lgaininp * from_dB(*(acomp->makeup));
+
+ max = (fabsf(output[i]) > max) ? fabsf(output[i]) : sanitize_denormal(max);
+
+ // TODO re-use local variables on stack
+ // store values back to acomp at the end of the inner-loop
+ acomp->old_yl = Lyl;
+ acomp->old_y1 = Ly1;
+ acomp->old_yg = Lyg;
+ }
+
+ *(acomp->outlevel) = (max < 0.0056f) ? -45.f : to_dB(max);
+
+#ifdef LV2_EXTENDED
+ acomp->v_lvl += .1 * (in_peak - acomp->v_lvl); // crude LPF TODO use n_samples/rate TC
+ const float v_lvl_in = (acomp->v_lvl < 0.001f) ? -60.f : to_dB(acomp->v_lvl);
+ const float v_lvl_out = (max < 0.001f) ? -60.f : to_dB(max);
+ if (fabsf (acomp->v_lvl_out - v_lvl_out) >= 1 || fabsf (acomp->v_lvl_in - v_lvl_in) >= 1) {
+ // >= 1dB difference
+ acomp->need_expose = true;
+ acomp->v_lvl_in = v_lvl_in;
+ acomp->v_lvl_out = v_lvl_out - *acomp->makeup;
+ }
+ if (acomp->need_expose && acomp->queue_draw) {
+ acomp->need_expose = false;
+ acomp->queue_draw->queue_draw (acomp->queue_draw->handle);
+ }
+#endif
+}
+
+static void
+run_stereo(LV2_Handle instance, uint32_t n_samples)
+{
+ AComp* acomp = (AComp*)instance;
+
+ const float* const input0 = acomp->input0;
+ const float* const input1 = acomp->input1;
+ const float* const sc = acomp->sc;
+ float* const output0 = acomp->output0;
+ float* const output1 = acomp->output1;
+
+ float srate = acomp->srate;
+ float width = (6.f * *(acomp->knee)) + 0.01;
+ float cdb=0.f;
+ float attack_coeff = exp(-1000.f/(*(acomp->attack) * srate));
+ float release_coeff = exp(-1000.f/(*(acomp->release) * srate));
+
+ float max = 0.f;
+ float lgaininp = 0.f;
+ float rgaininp = 0.f;
+ float Lgain = 1.f;
+ float Lxg, Lxl, Lyg, Lyl, Ly1;
+ int usesidechain = (*(acomp->sidechain) < 0.5) ? 0 : 1;
+ uint32_t i;
+ float ingain;
+ float in0;
+ float in1;
+ float sc0;
+ float maxabslr;
+ float ratio = *(acomp->ratio);
+ float thresdb = *(acomp->thresdb);
+
+#ifdef LV2_EXTENDED
+ if (acomp->v_knee != *acomp->knee) {
+ acomp->v_knee = *acomp->knee;
+ acomp->need_expose = true;
+ }
+
+ if (acomp->v_ratio != *acomp->ratio) {
+ acomp->v_ratio = *acomp->ratio;
+ acomp->need_expose = true;
+ }
+
+ if (acomp->v_thresdb != *acomp->thresdb) {
+ acomp->v_thresdb = *acomp->thresdb;
+ acomp->need_expose = true;
+ }
+#endif
+
+ float in_peak = 0;
+
+ for (i = 0; i < n_samples; i++) {
+ in0 = input0[i];
+ in1 = input1[i];
+ sc0 = sc[i];
+ maxabslr = fmaxf(fabs(in0), fabs(in1));
+ ingain = usesidechain ? fabs(sc0) : maxabslr;
+ in_peak = fmaxf (in_peak, ingain);
+ Lyg = 0.f;
+ Lxg = (ingain==0.f) ? -160.f : to_dB(ingain);
+ Lxg = sanitize_denormal(Lxg);
+
+
+ if (2.f*(Lxg-thresdb) < -width) {
+ Lyg = Lxg;
+ } else if (2.f*(Lxg-thresdb) > width) {
+ Lyg = thresdb + (Lxg-thresdb)/ratio;
+ Lyg = sanitize_denormal(Lyg);
+ } else {
+ Lyg = Lxg + (1.f/ratio-1.f)*(Lxg-thresdb+width/2.f)*(Lxg-thresdb+width/2.f)/(2.f*width);
+ }
+
+ Lxl = Lxg - Lyg;
+
+ acomp->old_y1 = sanitize_denormal(acomp->old_y1);
+ acomp->old_yl = sanitize_denormal(acomp->old_yl);
+ Ly1 = fmaxf(Lxl, release_coeff * acomp->old_y1+(1.f-release_coeff)*Lxl);
+ Lyl = attack_coeff * acomp->old_yl+(1.f-attack_coeff)*Ly1;
+ Ly1 = sanitize_denormal(Ly1);
+ Lyl = sanitize_denormal(Lyl);
+
+ cdb = -Lyl;
+ Lgain = from_dB(cdb);
+
+ *(acomp->gainr) = Lyl;
+
+ lgaininp = in0 * Lgain;
+ rgaininp = in1 * Lgain;
+ output0[i] = lgaininp * from_dB(*(acomp->makeup));
+ output1[i] = rgaininp * from_dB(*(acomp->makeup));
+
+ max = (fmaxf(fabs(output0[i]), fabs(output1[i])) > max) ? fmaxf(fabs(output0[i]), fabs(output1[i])) : sanitize_denormal(max);
+
+ // TODO re-use local variables on stack
+ // store values back to acomp at the end of the inner-loop
+ acomp->old_yl = Lyl;
+ acomp->old_y1 = Ly1;
+ acomp->old_yg = Lyg;
+ }
+
+ *(acomp->outlevel) = (max < 0.0056f) ? -45.f : to_dB(max);
+
+#ifdef LV2_EXTENDED
+ acomp->v_lvl += .1 * (in_peak - acomp->v_lvl); // crude LPF TODO use n_samples/rate TC
+ const float v_lvl_in = (acomp->v_lvl < 0.001f) ? -60.f : to_dB(acomp->v_lvl);
+ const float v_lvl_out = (max < 0.001f) ? -60.f : to_dB(max);
+ if (fabsf (acomp->v_lvl_out - v_lvl_out) >= 1 || fabsf (acomp->v_lvl_in - v_lvl_in) >= 1) {
+ // >= 1dB difference
+ acomp->need_expose = true;
+ acomp->v_lvl_in = v_lvl_in;
+ acomp->v_lvl_out = v_lvl_out - *acomp->makeup;
+ }
+ if (acomp->need_expose && acomp->queue_draw) {
+ acomp->need_expose = false;
+ acomp->queue_draw->queue_draw (acomp->queue_draw->handle);
+ }
+#endif
+}
+
+static void
+deactivate(LV2_Handle instance)
+{
+ activate(instance);
+}
+
+static void
+cleanup(LV2_Handle instance)
+{
+#ifdef LV2_EXTENDED
+ AComp* acomp = (AComp*)instance;
+ if (acomp->display) {
+ cairo_surface_destroy (acomp->display);
+ }
+#endif
+
+ free(instance);
+}
+
+
+#ifndef MIN
+#define MIN(A,B) ((A) < (B)) ? (A) : (B)
+#endif
+
+#ifdef LV2_EXTENDED
+static float
+comp_curve (AComp* self, float xg) {
+ const float knee = self->v_knee;
+ const float ratio = self->v_ratio;
+ const float thresdb = self->v_thresdb;
+
+ const float width = 6.f * knee + 0.01f;
+ float yg = 0.f;
+
+ if (2.f * (xg - thresdb) < -width) {
+ yg = xg;
+ } else if (2.f * (xg - thresdb) > width) {
+ yg = thresdb + (xg - thresdb) / ratio;
+ } else {
+ yg = xg + (1.f / ratio - 1.f ) * (xg - thresdb + width / 2.f) * (xg - thresdb + width / 2.f) / (2.f * width);
+ }
+ return yg;
+}
+
+static LV2_Inline_Display_Image_Surface *
+render_inline (LV2_Handle instance, uint32_t w, uint32_t max_h)
+{
+ AComp* self = (AComp*)instance;
+ uint32_t h = MIN (w, max_h);
+
+ if (!self->display || self->w != w || self->h != h) {
+ if (self->display) cairo_surface_destroy(self->display);
+ self->display = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+ self->w = w;
+ self->h = h;
+ }
+
+ cairo_t* cr = cairo_create (self->display);
+
+ // clear background
+ cairo_rectangle (cr, 0, 0, w, h);
+ cairo_set_source_rgba (cr, .2, .2, .2, 1.0);
+ cairo_fill (cr);
+
+ cairo_set_line_width(cr, 1.0);
+
+ // draw grid 10dB steps
+ const double dash1[] = {1, 2};
+ const double dash2[] = {1, 3};
+ cairo_save (cr);
+ cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
+ cairo_set_dash(cr, dash2, 2, 2);
+ cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
+
+ for (uint32_t d = 1; d < 6; ++d) {
+ const float x = -.5 + floorf (w * (d * 10.f / 60.f));
+ const float y = -.5 + floorf (h * (d * 10.f / 60.f));
+
+ cairo_move_to (cr, x, 0);
+ cairo_line_to (cr, x, h);
+ cairo_stroke (cr);
+
+ cairo_move_to (cr, 0, y);
+ cairo_line_to (cr, w, y);
+ cairo_stroke (cr);
+ }
+ if (self->v_thresdb < 0) {
+ cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 1.0);
+ const float y = -.5 + floorf (h * (self->v_thresdb / -60.f));
+ cairo_set_dash(cr, dash1, 2, 2);
+ cairo_move_to (cr, 0, y);
+ cairo_line_to (cr, w, y);
+ cairo_stroke (cr);
+ cairo_move_to (cr, 0, h);
+ cairo_line_to (cr, w, 0);
+ cairo_stroke (cr);
+ }
+ cairo_restore (cr);
+
+
+ // draw curve
+ cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+ cairo_move_to (cr, 0, h);
+
+ for (uint32_t x = 0; x < w; ++x) {
+ // plot -60..0 dB
+ const float x_db = 60.f * (-1.f + x / (float)w);
+ const float y_db = comp_curve (self, x_db);
+ const float y = h * (y_db / -60.f);
+ cairo_line_to (cr, x, y);
+ }
+ cairo_stroke_preserve (cr);
+
+ cairo_line_to (cr, w, h);
+ cairo_close_path (cr);
+ cairo_clip (cr);
+
+ // draw signal level & reduction/gradient
+ const float top = comp_curve (self, 0);
+ cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, h);
+ if (top > self->v_thresdb) {
+ cairo_pattern_add_color_stop_rgba (pat, 0.0, 0.8, 0.1, 0.1, 0.5);
+ cairo_pattern_add_color_stop_rgba (pat, top / -60.f, 0.8, 0.1, 0.1, 0.5);
+ }
+ if (self->v_knee > 0) {
+ cairo_pattern_add_color_stop_rgba (pat, (self->v_thresdb / -60.f), 0.7, 0.7, 0.2, 0.5);
+ cairo_pattern_add_color_stop_rgba (pat, ((self->v_thresdb - self->v_knee) / -60.f), 0.5, 0.5, 0.5, 0.5);
+ } else {
+ cairo_pattern_add_color_stop_rgba (pat, (self->v_thresdb / -60.f), 0.7, 0.7, 0.2, 0.5);
+ cairo_pattern_add_color_stop_rgba (pat, ((self->v_thresdb - .01) / -60.f), 0.5, 0.5, 0.5, 0.5);
+ }
+ cairo_pattern_add_color_stop_rgba (pat, 1.0, 0.5, 0.5, 0.5, 0.5);
+
+ // maybe cut off at x-position?
+ const float x = w * (self->v_lvl_in + 60) / 60.f;
+ //const float y = h * (self->v_lvl_out + 60) / 60.f;
+ cairo_rectangle (cr, 0, h - x, x, h);
+ if (self->v_ratio > 1.0) {
+ cairo_set_source (cr, pat);
+ } else {
+ cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
+ }
+ cairo_fill (cr);
+
+ cairo_pattern_destroy (pat); // TODO cache pattern
+
+
+ // create RGBA surface
+ cairo_destroy (cr);
+ cairo_surface_flush (self->display);
+ self->surf.width = cairo_image_surface_get_width (self->display);
+ self->surf.height = cairo_image_surface_get_height (self->display);
+ self->surf.stride = cairo_image_surface_get_stride (self->display);
+ self->surf.data = cairo_image_surface_get_data (self->display);
+
+ return &self->surf;
+}
+#endif
+
+static const void*
+extension_data(const char* uri)
+{
+#ifdef LV2_EXTENDED
+ static const LV2_Inline_Display_Interface display = { render_inline };
+ if (!strcmp(uri, LV2_INLINEDISPLAY__interface)) {
+ return &display;
+ }
+#endif
+ return NULL;
+}
+
+static const LV2_Descriptor descriptor_mono = {
+ ACOMP_URI,
+ instantiate,
+ connect_port_mono,
+ activate,
+ run_mono,
+ deactivate,
+ cleanup,
+ extension_data
+};
+
+static const LV2_Descriptor descriptor_stereo = {
+ ACOMP_STEREO_URI,
+ instantiate,
+ connect_port_stereo,
+ activate,
+ run_stereo,
+ deactivate,
+ cleanup,
+ extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor(uint32_t index)
+{
+ switch (index) {
+ case 0:
+ return &descriptor_mono;
+ case 1:
+ return &descriptor_stereo;
+ default:
+ return NULL;
+ }
+}
diff --git a/libs/plugins/a-comp.lv2/a-comp.ttl.in b/libs/plugins/a-comp.lv2/a-comp.ttl.in
new file mode 100644
index 0000000..058fab8
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/a-comp.ttl.in
@@ -0,0 +1,143 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz: <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+
+<http://ardour.org/credits.html>
+ a foaf:Person ;
+ foaf:name "Ardour Team" ;
+ foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-comp>
+ a lv2:Plugin, doap:Project, lv2:CompressorPlugin ;
+
+ lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable>;
+
+ lv2:port [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 0 ;
+ lv2:name "Attack" ;
+ lv2:symbol "att" ;
+ lv2:default 10.000000 ;
+ lv2:minimum 0.100000 ;
+ lv2:maximum 100.000000 ;
+ unit:unit unit:ms ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 1 ;
+ lv2:name "Release" ;
+ lv2:symbol "rel" ;
+ lv2:default 80.000000 ;
+ lv2:minimum 1.000000 ;
+ lv2:maximum 500.000000 ;
+ unit:unit unit:ms ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 2 ;
+ lv2:name "Knee" ;
+ lv2:symbol "kn" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 8.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 3 ;
+ lv2:name "Ratio" ;
+ lv2:symbol "rat" ;
+ lv2:default 4.000000 ;
+ lv2:minimum 1.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit [
+ rdfs:label " " ;
+ unit:symbol " " ;
+ unit:render "%f " ;
+ ] ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 4 ;
+ lv2:name "Threshold" ;
+ lv2:symbol "thr" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -60.000000 ;
+ lv2:maximum 0.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 5 ;
+ lv2:name "Makeup" ;
+ lv2:symbol "mak" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 30.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:OutputPort, lv2:ControlPort ;
+ lv2:index 6 ;
+ lv2:name "Gain Reduction" ;
+ lv2:symbol "gr" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 45.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:OutputPort, lv2:ControlPort ;
+ lv2:index 7 ;
+ lv2:name "Output Level" ;
+ lv2:symbol "outlevel" ;
+ lv2:default -45.000000 ;
+ lv2:minimum -45.000000 ;
+ lv2:maximum 0.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 8 ;
+ lv2:name "Sidechain" ;
+ lv2:symbol "sidech" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ] ;
+
+ lv2:port [
+ a lv2:InputPort, lv2:AudioPort ;
+ lv2:index 9 ;
+ lv2:symbol "lv2_audio_in_1" ;
+ lv2:name "Audio Input 1" ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:AudioPort ;
+ lv2:index 10 ;
+ lv2:symbol "lv2_sidechain_in" ;
+ lv2:name "Sidechain Input" ;
+ lv2:portProperty lv2:isSideChain;
+ ],
+ [
+ a lv2:OutputPort, lv2:AudioPort ;
+ lv2:index 11 ;
+ lv2:symbol "lv2_audio_out_1" ;
+ lv2:name "Audio Output 1" ;
+ ] ;
+
+ rdfs:comment """
+A powerful mono compressor.
+""" ;
+
+ doap:name "a-Compressor" ;
+ doap:license <http://usefulinc.com/doap/licenses/gpl> ;
+ doap:maintainer <http://ardour.org/credits.html> ;
+
+ lv2:microVersion 1 ;
+ lv2:minorVersion 1 .
diff --git a/libs/plugins/a-comp.lv2/manifest.ttl.in b/libs/plugins/a-comp.lv2/manifest.ttl.in
new file mode 100644
index 0000000..6275985
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/manifest.ttl.in
@@ -0,0 +1,51 @@
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-comp>
+ a lv2:Plugin ;
+ lv2:binary <a-comp at LIB_EXT@> ;
+ rdfs:seeAlso <a-comp.ttl> .
+
+<urn:ardour:a-comp#stereo>
+ a lv2:Plugin ;
+ lv2:binary <a-comp at LIB_EXT@> ;
+ rdfs:seeAlso <a-comp#stereo.ttl> .
+
+<urn:ardour:a-comp#preset001>
+ a pset:Preset ;
+ lv2:appliesTo <urn:ardour:a-comp> ;
+ rdfs:label "Zero" ;
+ rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset002>
+ a pset:Preset ;
+ lv2:appliesTo <urn:ardour:a-comp> ;
+ rdfs:label "PoppySnare" ;
+ rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset003>
+ a pset:Preset ;
+ lv2:appliesTo <urn:ardour:a-comp> ;
+ rdfs:label "VocalLeveller" ;
+ rdfs:seeAlso <presets.ttl> .
+
+
+
+<urn:ardour:a-comp#preset001>
+ a pset:Preset ;
+ lv2:appliesTo <urn:ardour:a-comp#stereo> ;
+ rdfs:label "Zero" ;
+ rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset002>
+ a pset:Preset ;
+ lv2:appliesTo <urn:ardour:a-comp#stereo> ;
+ rdfs:label "PoppySnare" ;
+ rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset003>
+ a pset:Preset ;
+ lv2:appliesTo <urn:ardour:a-comp#stereo> ;
+ rdfs:label "VocalLeveller" ;
+ rdfs:seeAlso <presets.ttl> .
diff --git a/libs/plugins/a-comp.lv2/presets.ttl.in b/libs/plugins/a-comp.lv2/presets.ttl.in
new file mode 100644
index 0000000..9d9b10b
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/presets.ttl.in
@@ -0,0 +1,118 @@
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-comp#preset001>
+ lv2:port [
+ lv2:symbol "att" ;
+ pset:value 10.000000 ;
+ ] ,
+ [
+ lv2:symbol "rel" ;
+ pset:value 80.000000 ;
+ ] ,
+ [
+ lv2:symbol "kn" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "rat" ;
+ pset:value 4.000000 ;
+ ] ,
+ [
+ lv2:symbol "thr" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "mak" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "gr" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "outlevel" ;
+ pset:value -45.000000 ;
+ ] ,
+ [
+ lv2:symbol "sidech" ;
+ pset:value 0.000000 ;
+ ] .
+
+<urn:ardour:a-comp#preset002>
+ lv2:port [
+ lv2:symbol "att" ;
+ pset:value 10.000000 ;
+ ] ,
+ [
+ lv2:symbol "rel" ;
+ pset:value 10.000000 ;
+ ] ,
+ [
+ lv2:symbol "kn" ;
+ pset:value 1.000000 ;
+ ] ,
+ [
+ lv2:symbol "rat" ;
+ pset:value 5.000000 ;
+ ] ,
+ [
+ lv2:symbol "thr" ;
+ pset:value -18.000000 ;
+ ] ,
+ [
+ lv2:symbol "mak" ;
+ pset:value 6.000000 ;
+ ] ,
+ [
+ lv2:symbol "gr" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "outlevel" ;
+ pset:value -45.000000 ;
+ ] ,
+ [
+ lv2:symbol "sidech" ;
+ pset:value 0.000000 ;
+ ] .
+
+<urn:ardour:a-comp#preset003>
+ lv2:port [
+ lv2:symbol "att" ;
+ pset:value 50.000000 ;
+ ] ,
+ [
+ lv2:symbol "rel" ;
+ pset:value 400.000000 ;
+ ] ,
+ [
+ lv2:symbol "kn" ;
+ pset:value 8.000000 ;
+ ] ,
+ [
+ lv2:symbol "rat" ;
+ pset:value 5.000000 ;
+ ] ,
+ [
+ lv2:symbol "thr" ;
+ pset:value -16.000000 ;
+ ] ,
+ [
+ lv2:symbol "mak" ;
+ pset:value 9.000000 ;
+ ] ,
+ [
+ lv2:symbol "gr" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "outlevel" ;
+ pset:value -45.000000 ;
+ ] ,
+ [
+ lv2:symbol "sidech" ;
+ pset:value 0.000000 ;
+ ] .
+
+
diff --git a/libs/plugins/a-comp.lv2/wscript b/libs/plugins/a-comp.lv2/wscript
new file mode 100644
index 0000000..f0ebb1d
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/wscript
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+ autowaf.set_options(opt)
+
+def configure(conf):
+ conf.load('compiler_c')
+ autowaf.configure(conf)
+ if Options.options.lv2:
+ autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+ uselib_store='LV2_1_0_0')
+ autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0')
+
+def build(bld):
+ bundle = 'a-comp.lv2'
+ module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+ module_ext = module_pat[module_pat.rfind('.'):]
+
+ if bld.is_defined ('HAVE_LV2'):
+ # Build RDF files
+ for i in ['manifest.ttl', 'a-comp.ttl', 'a-comp#stereo.ttl', 'presets.ttl']:
+ bld(features = 'subst',
+ source = i + '.in',
+ target = '../../LV2/%s/%s' % (bundle, i),
+ install_path = '${LV2DIR}/%s' % bundle,
+ chmod = Utils.O644,
+ LIB_EXT = module_ext)
+
+ # Build plugin library
+ obj = bld(features = 'c cshlib',
+ source = 'a-comp.c',
+ name = 'a-comp',
+ cflags = [ '-fPIC', bld.env['compiler_flags_dict']['c99'] ],
+ includes = [ '../../ardour' ],
+ target = '../../LV2/%s/a-comp' % bundle,
+ install_path = '${LV2DIR}/%s' % bundle,
+ uselib = 'CAIRO',
+ use = 'LV2_1_0_0'
+ )
+ obj.env.cshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/a-delay.lv2/a-delay.c b/libs/plugins/a-delay.lv2/a-delay.c
new file mode 100644
index 0000000..8ad4265
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/a-delay.c
@@ -0,0 +1,489 @@
+/* a-delay
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+#include "lv2/lv2plug.in/ns/ext/atom/atom.h"
+#include "lv2/lv2plug.in/ns/ext/time/time.h"
+#include "lv2/lv2plug.in/ns/ext/atom/forge.h"
+#include "lv2/lv2plug.in/ns/ext/urid/urid.h"
+
+#define ADELAY_URI "urn:ardour:a-delay"
+
+// 8 seconds of delay at 96kHz
+#define MAX_DELAY 768000
+
+#ifndef M_PI
+# define M_PI 3.1415926
+#endif
+
+typedef enum {
+ ADELAY_INPUT = 0,
+ ADELAY_OUTPUT,
+
+ ADELAY_BPM,
+
+ ADELAY_INV,
+ ADELAY_SYNC,
+ ADELAY_TIME,
+ ADELAY_DIVISOR,
+ ADELAY_WETDRY,
+ ADELAY_FEEDBACK,
+ ADELAY_LPF,
+ ADELAY_GAIN,
+
+ ADELAY_DELAYTIME,
+} PortIndex;
+
+
+typedef struct {
+ LV2_URID atom_Blank;
+ LV2_URID atom_Object;
+ LV2_URID atom_Sequence;
+ LV2_URID atom_Long;
+ LV2_URID atom_Int;
+ LV2_URID atom_Float;
+ LV2_URID atom_Double;
+ LV2_URID time_beatUnit;
+ LV2_URID time_beatsPerMinute;
+ LV2_URID time_Position;
+} DelayURIs;
+
+typedef struct {
+ float* input;
+ float* output;
+
+ const LV2_Atom_Sequence* atombpm;
+
+ float* inv;
+ float* sync;
+ float* time;
+ float* divisor;
+ float* wetdry;
+ float* feedback;
+ float* lpf;
+ float* gain;
+
+ float* delaytime;
+
+ float srate;
+ float bpm;
+ float beatunit;
+ int bpmvalid;
+
+ uint32_t posz;
+ float tap[2];
+ float z[MAX_DELAY];
+ int active;
+ int next;
+ float fbstate;
+ float lpfold;
+ float feedbackold;
+ float divisorold;
+ float gainold;
+ float invertold;
+ float timeold;
+ float delaytimeold;
+ float syncold;
+ float wetdryold;
+ float delaysamplesold;
+ float tau;
+
+ float A0, A1, A2, A3, A4, A5;
+ float B0, B1, B2, B3, B4, B5;
+ float state[4];
+
+ DelayURIs uris;
+ LV2_Atom_Forge forge;
+ LV2_URID_Map* map;
+} ADelay;
+
+static inline void
+map_uris(LV2_URID_Map* map, DelayURIs* uris)
+{
+ uris->atom_Blank = map->map(map->handle, LV2_ATOM__Blank);
+ uris->atom_Object = map->map(map->handle, LV2_ATOM__Object);
+ uris->atom_Sequence = map->map(map->handle, LV2_ATOM__Sequence);
+ uris->atom_Long = map->map(map->handle, LV2_ATOM__Long);
+ uris->atom_Int = map->map(map->handle, LV2_ATOM__Int);
+ uris->atom_Float = map->map(map->handle, LV2_ATOM__Float);
+ uris->atom_Double = map->map(map->handle, LV2_ATOM__Double);
+ uris->time_beatUnit = map->map(map->handle, LV2_TIME__beatUnit);
+ uris->time_beatsPerMinute = map->map(map->handle, LV2_TIME__beatsPerMinute);
+ uris->time_Position = map->map(map->handle, LV2_TIME__Position);
+}
+
+static LV2_Handle
+instantiate(const LV2_Descriptor* descriptor,
+ double rate,
+ const char* bundle_path,
+ const LV2_Feature* const* features)
+{
+ int i;
+ ADelay* adelay = (ADelay*)calloc(1, sizeof(ADelay));
+ if (!adelay) return NULL;
+
+ for (i = 0; features[i]; ++i) {
+ if (!strcmp(features[i]->URI, LV2_URID__map)) {
+ adelay->map = (LV2_URID_Map*)features[i]->data;
+ }
+ }
+
+ if (!adelay->map) {
+ fprintf(stderr, "a-delay.lv2 error: Host does not support urid:map\n");
+ free(adelay);
+ return NULL;
+ }
+
+ map_uris(adelay->map, &adelay->uris);
+ lv2_atom_forge_init(&adelay->forge, adelay->map);
+
+ adelay->srate = rate;
+ adelay->bpmvalid = 0;
+ // 25Hz time constant @ 64fpp
+ adelay->tau = (1.0 - exp(-2.0 * M_PI * 64. * 25. / adelay->srate));
+
+ return (LV2_Handle)adelay;
+}
+
+static void
+connect_port(LV2_Handle instance,
+ uint32_t port,
+ void* data)
+{
+ ADelay* adelay = (ADelay*)instance;
+
+ switch ((PortIndex)port) {
+ case ADELAY_INPUT:
+ adelay->input = (float*)data;
+ break;
+ case ADELAY_OUTPUT:
+ adelay->output = (float*)data;
+ break;
+ case ADELAY_BPM:
+ adelay->atombpm = (const LV2_Atom_Sequence*)data;
+ break;
+ case ADELAY_INV:
+ adelay->inv = (float*)data;
+ break;
+ case ADELAY_SYNC:
+ adelay->sync = (float*)data;
+ break;
+ case ADELAY_TIME:
+ adelay->time = (float*)data;
+ break;
+ case ADELAY_DIVISOR:
+ adelay->divisor = (float*)data;
+ break;
+ case ADELAY_WETDRY:
+ adelay->wetdry = (float*)data;
+ break;
+ case ADELAY_FEEDBACK:
+ adelay->feedback = (float*)data;
+ break;
+ case ADELAY_LPF:
+ adelay->lpf = (float*)data;
+ break;
+ case ADELAY_GAIN:
+ adelay->gain = (float*)data;
+ break;
+ case ADELAY_DELAYTIME:
+ adelay->delaytime = (float*)data;
+ break;
+ }
+}
+
+static inline float
+sanitize_denormal(float value) {
+ if (!isnormal(value)) {
+ value = 0.f;
+ }
+ return value;
+}
+
+static inline float
+from_dB(float gdb) {
+ return (exp(gdb/20.f*log(10.f)));
+}
+
+static inline float
+to_dB(float g) {
+ return (20.f*log10(g));
+}
+
+static inline bool
+is_eq(float a, float b, float small) {
+ return (fabsf(a - b) < small);
+}
+
+static void clearfilter(LV2_Handle instance)
+{
+ ADelay* adelay = (ADelay*)instance;
+
+ adelay->state[0] = adelay->state[1] =
+ adelay->state[2] = adelay->state[3] = 0.f;
+}
+
+static void
+activate(LV2_Handle instance)
+{
+ ADelay* adelay = (ADelay*)instance;
+
+ int i;
+ for (i = 0; i < MAX_DELAY; i++) {
+ adelay->z[i] = 0.f;
+ }
+ adelay->posz = 0;
+ adelay->tap[0] = 0;
+ adelay->tap[1] = 0;
+ adelay->active = 0;
+ adelay->next = 1;
+ adelay->fbstate = 0.f;
+
+ clearfilter(adelay);
+
+ adelay->lpfold = 0.f;
+ adelay->divisorold = 0.f;
+ adelay->gainold = 0.f;
+ adelay->invertold = 0.f;
+ adelay->timeold = 0.f;
+ adelay->delaytimeold = 0.f;
+ adelay->syncold = 0.f;
+ adelay->wetdryold = 0.f;
+ adelay->delaysamplesold = 1.f;
+}
+
+static void lpfRbj(LV2_Handle instance, float fc, float srate)
+{
+ ADelay* adelay = (ADelay*)instance;
+
+ float w0, alpha, cw, sw, q;
+ q = 0.707;
+ w0 = (2. * M_PI * fc / srate);
+ sw = sin(w0);
+ cw = cos(w0);
+ alpha = sw / (2. * q);
+
+ adelay->A0 = 1. + alpha;
+ adelay->A1 = -2. * cw;
+ adelay->A2 = 1. - alpha;
+ adelay->B0 = (1. - cw) / 2.;
+ adelay->B1 = (1. - cw);
+ adelay->B2 = adelay->B0;
+
+ adelay->A3 = 1. + alpha;
+ adelay->A4 = -2. * cw;
+ adelay->A5 = 1. - alpha;
+ adelay->B3 = (1. - cw) / 2.;
+ adelay->B4 = (1. - cw);
+ adelay->B5 = adelay->B3;
+}
+
+static float runfilter(LV2_Handle instance, float in)
+{
+ ADelay* a = (ADelay*)instance;
+
+ float out;
+ in = sanitize_denormal(in);
+
+ out = a->B0/a->A0*in + a->B1/a->A0*a->state[0] + a->B2/a->A0*a->state[1]
+ -a->A1/a->A0*a->state[2] - a->A2/a->A0*a->state[3] + 1e-20;
+
+ a->state[1] = a->state[0];
+ a->state[0] = in;
+ a->state[3] = a->state[2];
+ a->state[2] = out;
+ return out;
+}
+
+static void
+update_bpm(ADelay* self, const LV2_Atom_Object* obj)
+{
+ const DelayURIs* uris = &self->uris;
+
+ // Received new transport bpm/beatunit
+ LV2_Atom *beatunit = NULL, *bpm = NULL;
+ lv2_atom_object_get(obj,
+ uris->time_beatUnit, &beatunit,
+ uris->time_beatsPerMinute, &bpm,
+ NULL);
+ // Tempo changed, update BPM
+ if (bpm && bpm->type == uris->atom_Float) {
+ self->bpm = ((LV2_Atom_Float*)bpm)->body;
+ }
+ // Time signature changed, update beatunit
+ if (beatunit && beatunit->type == uris->atom_Int) {
+ int b = ((LV2_Atom_Int*)beatunit)->body;
+ self->beatunit = (float)b;
+ }
+ if (beatunit && beatunit->type == uris->atom_Double) {
+ double b = ((LV2_Atom_Double*)beatunit)->body;
+ self->beatunit = (float)b;
+ }
+ if (beatunit && beatunit->type == uris->atom_Float) {
+ self->beatunit = ((LV2_Atom_Float*)beatunit)->body;
+ }
+ if (beatunit && beatunit->type == uris->atom_Long) {
+ long int b = ((LV2_Atom_Long*)beatunit)->body;
+ self->beatunit = (float)b;
+ }
+ self->bpmvalid = 1;
+}
+
+static void
+run(LV2_Handle instance, uint32_t n_samples)
+{
+ ADelay* adelay = (ADelay*)instance;
+
+ const float* const input = adelay->input;
+ float* const output = adelay->output;
+
+ float srate = adelay->srate;
+ float tau = adelay->tau;
+
+ uint32_t i;
+ float in;
+ int delaysamples = 0;
+ unsigned int tmp;
+ float inv;
+ float xfade;
+ int recalc;
+ if (*(adelay->inv) < 0.5) {
+ inv = -1.f;
+ } else {
+ inv = 1.f;
+ }
+
+ recalc = 0;
+ if (*(adelay->inv) != adelay->invertold) {
+ recalc = 1;
+ }
+ if (*(adelay->sync) != adelay->syncold) {
+ recalc = 1;
+ }
+ if (*(adelay->time) != adelay->timeold) {
+ recalc = 1;
+ }
+ if (*(adelay->feedback) != adelay->feedbackold) {
+ recalc = 1;
+ }
+ if (*(adelay->divisor) != adelay->divisorold) {
+ recalc = 1;
+ }
+ if (!is_eq(adelay->lpfold, *adelay->lpf, 0.1)) {
+ adelay->lpfold += tau * (*adelay->lpf - adelay->lpfold);
+ recalc = 1;
+ }
+ if (*(adelay->gain) != adelay->gainold) {
+ recalc = 1;
+ }
+
+ if (recalc) {
+ lpfRbj(adelay, adelay->lpfold, srate);
+ if (*(adelay->sync) > 0.5f && adelay->bpmvalid) {
+ *(adelay->delaytime) = adelay->beatunit * 1000.f * 60.f / (adelay->bpm * *(adelay->divisor));
+ } else {
+ *(adelay->delaytime) = *(adelay->time);
+ }
+ delaysamples = (int)(*(adelay->delaytime) * srate) / 1000;
+ adelay->tap[adelay->next] = delaysamples;
+ }
+
+ xfade = 0.f;
+ for (i = 0; i < n_samples; i++) {
+ in = input[i];
+ adelay->z[adelay->posz] = in + *adelay->feedback / 100. * adelay->fbstate;
+ adelay->fbstate = 0.f;
+ int p = adelay->posz - adelay->tap[adelay->active]; // active line
+ if (p<0) p += MAX_DELAY;
+ adelay->fbstate += adelay->z[p];
+
+ if (recalc) {
+ xfade += 1.0f / (float)n_samples;
+ adelay->fbstate *= (1.-xfade);
+ p = adelay->posz - adelay->tap[adelay->next]; // next line
+ if (p<0) p += MAX_DELAY;
+ adelay->fbstate += adelay->z[p] * xfade;
+ }
+ output[i] = from_dB(*(adelay->gain)) * ((100.-*(adelay->wetdry)) / 100. * in + *(adelay->wetdry) / 100. * -inv * runfilter(adelay, adelay->fbstate));
+ if (++(adelay->posz) >= MAX_DELAY) {
+ adelay->posz = 0;
+ }
+ }
+ adelay->feedbackold = *(adelay->feedback);
+ adelay->divisorold = *(adelay->divisor);
+ adelay->gainold = *(adelay->gain);
+ adelay->invertold = *(adelay->inv);
+ adelay->timeold = *(adelay->time);
+ adelay->syncold = *(adelay->sync);
+ adelay->wetdryold = *(adelay->wetdry);
+ adelay->delaytimeold = *(adelay->delaytime);
+ adelay->delaysamplesold = delaysamples;
+ if (recalc) {
+ tmp = adelay->active;
+ adelay->active = adelay->next;
+ adelay->next = tmp;
+ }
+
+ if (adelay->atombpm) {
+ LV2_Atom_Event* ev = lv2_atom_sequence_begin(&(adelay->atombpm)->body);
+ while(!lv2_atom_sequence_is_end(&(adelay->atombpm)->body, (adelay->atombpm)->atom.size, ev)) {
+ if (ev->body.type == adelay->uris.atom_Blank || ev->body.type == adelay->uris.atom_Object) {
+ const LV2_Atom_Object* obj = (LV2_Atom_Object*)&ev->body;
+ if (obj->body.otype == adelay->uris.time_Position) {
+ update_bpm(adelay, obj);
+ }
+ }
+ ev = lv2_atom_sequence_next(ev);
+ }
+ }
+}
+
+static void
+cleanup(LV2_Handle instance)
+{
+ free(instance);
+}
+
+static const void*
+extension_data(const char* uri)
+{
+ return NULL;
+}
+
+static const LV2_Descriptor descriptor = {
+ ADELAY_URI,
+ instantiate,
+ connect_port,
+ activate,
+ run,
+ NULL,
+ cleanup,
+ extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor(uint32_t index)
+{
+ switch (index) {
+ case 0:
+ return &descriptor;
+ default:
+ return NULL;
+ }
+}
diff --git a/libs/plugins/a-delay.lv2/a-delay.ttl.in b/libs/plugins/a-delay.lv2/a-delay.ttl.in
new file mode 100644
index 0000000..2e29038
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/a-delay.ttl.in
@@ -0,0 +1,161 @@
+ at prefix atom: <http://lv2plug.in/ns/ext/atom#> .
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz: <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+ at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+
+<http://ardour.org/credits.html>
+ a foaf:Person ;
+ foaf:name "Ardour Team" ;
+ foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-delay>
+ a lv2:Plugin, doap:Project, lv2:DelayPlugin ;
+
+ lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable>;
+
+ lv2:requiredFeature <http://lv2plug.in/ns/ext/options#options> ,
+ <http://lv2plug.in/ns/ext/urid#map> ;
+
+ lv2:port [
+ a lv2:InputPort, lv2:AudioPort ;
+ lv2:index 0 ;
+ lv2:symbol "in_1" ;
+ lv2:name "Audio Input 1" ;
+ ] ;
+
+ lv2:port [
+ a lv2:OutputPort, lv2:AudioPort ;
+ lv2:index 1 ;
+ lv2:symbol "out_1" ;
+ lv2:name "Audio Output 1" ;
+ ] ;
+
+ lv2:port [
+ a lv2:InputPort, atom:AtomPort ;
+ lv2:index 2 ;
+ lv2:name "BPM Input" ;
+ lv2:symbol "bpm_in" ;
+ rsz:minimumSize 2048 ;
+ atom:bufferType atom:Sequence ;
+ atom:supports <http://lv2plug.in/ns/ext/time#Position> ;
+ ] ;
+
+ lv2:port [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 3 ;
+ lv2:name "Invert" ;
+ lv2:symbol "inv" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 4 ;
+ lv2:name "Sync BPM" ;
+ lv2:symbol "sync" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 5 ;
+ lv2:name "Time" ;
+ lv2:symbol "time" ;
+ lv2:default 160.000000 ;
+ lv2:minimum 1.000000 ;
+ lv2:maximum 8000.000000 ;
+ unit:unit unit:ms ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 6 ;
+ lv2:name "Divisor" ;
+ lv2:symbol "div" ;
+ lv2:default 4 ;
+ lv2:minimum 1 ;
+ lv2:maximum 48 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#hasStrictBounds> ;
+ lv2:portProperty lv2:enumeration ;
+ lv2:portProperty lv2:integer ;
+ lv2:scalePoint [ rdfs:label "a - Whole note"; rdf:value 1 ] ;
+ lv2:scalePoint [ rdfs:label "b - Half note"; rdf:value 2 ] ;
+ lv2:scalePoint [ rdfs:label "c - â©"; rdf:value 4 ] ;
+ lv2:scalePoint [ rdfs:label "d - âª"; rdf:value 8 ] ;
+ lv2:scalePoint [ rdfs:label "e - â¬"; rdf:value 16 ] ;
+ lv2:scalePoint [ rdfs:label "f - 32nd note"; rdf:value 32 ] ;
+ lv2:scalePoint [ rdfs:label "g - â©Â³ (Triplet)"; rdf:value 6 ] ;
+ lv2:scalePoint [ rdfs:label "h - âªÂ³ (Triplet)"; rdf:value 12 ] ;
+ lv2:scalePoint [ rdfs:label "i - â¬Â³ (Triplet)"; rdf:value 24 ] ;
+ lv2:scalePoint [ rdfs:label "j - 32nd note (Triplet)"; rdf:value 48 ] ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 7 ;
+ lv2:name "Dry/Wet" ;
+ lv2:symbol "drywet" ;
+ lv2:default 50.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 100.000000 ;
+ unit:unit unit:pc ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 8 ;
+ lv2:name "Feedback" ;
+ lv2:symbol "feedback" ;
+ lv2:default 20.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 100.000000 ;
+ unit:unit unit:pc ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 9 ;
+ lv2:name "LPF" ;
+ lv2:symbol "lpf" ;
+ lv2:default 6000.000000 ;
+ lv2:minimum 20.000000 ;
+ lv2:maximum 20000.000000 ;
+ unit:unit unit:hz ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 10 ;
+ lv2:name "Output Gain" ;
+ lv2:symbol "gain" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -60.000000 ;
+ lv2:maximum 0.000000 ;
+ unit:unit unit:db ;
+ ] ,
+ [
+ a lv2:OutputPort, lv2:ControlPort ;
+ lv2:index 11 ;
+ lv2:name "Delaytime" ;
+ lv2:symbol "delaytime" ;
+ lv2:default 0.000000 ;
+ lv2:minimum 1.000000 ;
+ lv2:maximum 8000.000000 ;
+ unit:unit unit:ms ;
+ ] ;
+
+ rdfs:comment """
+A simple delay plugin
+""" ;
+
+ doap:name "a-Delay" ;
+ doap:license "GPL v2+" ;
+ doap:maintainer <http://ardour.org/credits.html> ;
+
+ lv2:microVersion 1 ;
+ lv2:minorVersion 1 .
diff --git a/libs/plugins/a-delay.lv2/manifest.ttl.in b/libs/plugins/a-delay.lv2/manifest.ttl.in
new file mode 100644
index 0000000..84ca864
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/manifest.ttl.in
@@ -0,0 +1,20 @@
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+ at prefix ui: <http://lv2plug.in/ns/extensions/ui#> .
+
+<urn:ardour:a-delay>
+ a lv2:Plugin ;
+ lv2:binary <a-delay at LIB_EXT@> ;
+ rdfs:seeAlso <a-delay.ttl> .
+
+#<urn:ardour:a-delay#ui>
+# a ui:GtkUI ;
+# ui:binary <a-delay-ui at LIB_EXT@> ;
+# rdfs:seeAlso <a-delay.ttl> .
+
+<urn:ardour:a-delay#preset001>
+ a pset:Preset ;
+ lv2:appliesTo <urn:ardour:a-delay> ;
+ rdfs:label "Zero" ;
+ rdfs:seeAlso <presets.ttl> .
diff --git a/libs/plugins/a-delay.lv2/presets.ttl.in b/libs/plugins/a-delay.lv2/presets.ttl.in
new file mode 100644
index 0000000..1bde45c
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/presets.ttl.in
@@ -0,0 +1,38 @@
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-delay#preset001>
+ lv2:port [
+ lv2:symbol "inv" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "sync" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "time" ;
+ pset:value 160.000000 ;
+ ] ,
+ [
+ lv2:symbol "div" ;
+ pset:value 3 ;
+ ] ,
+ [
+ lv2:symbol "drywet" ;
+ pset:value 50.000000 ;
+ ] ,
+ [
+ lv2:symbol "lpf" ;
+ pset:value 6000.000000 ;
+ ] ,
+ [
+ lv2:symbol "gain" ;
+ pset:value 0.000000 ;
+ ] ,
+ [
+ lv2:symbol "delaytime" ;
+ pset:value 0.000000 ;
+ ] .
+
+
diff --git a/libs/plugins/a-delay.lv2/wscript b/libs/plugins/a-delay.lv2/wscript
new file mode 100644
index 0000000..666ef0d
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/wscript
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+ autowaf.set_options(opt)
+
+def configure(conf):
+ conf.load('compiler_c')
+ autowaf.configure(conf)
+ if Options.options.lv2:
+ autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+ uselib_store='LV2_1_0_0')
+ autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0')
+
+def build(bld):
+ bundle = 'a-delay.lv2'
+ module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+ module_ext = module_pat[module_pat.rfind('.'):]
+
+ if bld.is_defined ('HAVE_LV2'):
+ # Build RDF files
+ for i in ['manifest.ttl', 'a-delay.ttl', 'presets.ttl']:
+ bld(features = 'subst',
+ source = i + '.in',
+ target = '../../LV2/%s/%s' % (bundle, i),
+ install_path = '${LV2DIR}/%s' % bundle,
+ chmod = Utils.O644,
+ LIB_EXT = module_ext)
+
+ # Build plugin library
+ obj = bld(features = 'c cshlib',
+ source = 'a-delay.c',
+ name = 'a-delay',
+ cflags = [ '-fPIC', bld.env['compiler_flags_dict']['c99'] ],
+ includes = [ '../../ardour' ],
+ target = '../../LV2/%s/a-delay' % bundle,
+ install_path = '${LV2DIR}/%s' % bundle,
+ uselib = 'CAIRO',
+ use = 'LV2_1_0_0'
+ )
+ obj.env.cshlib_PATTERN = module_pat
+ obj.env.cxxshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/a-eq.lv2/a-eq.c b/libs/plugins/a-eq.lv2/a-eq.c
new file mode 100644
index 0000000..bb9840d
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/a-eq.c
@@ -0,0 +1,640 @@
+/* a-eq
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE // needed for M_PI
+#endif
+
+#include <math.h>
+#include <complex.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+#ifdef LV2_EXTENDED
+#include <cairo/cairo.h>
+#include "ardour/lv2_extensions.h"
+#endif
+
+#define AEQ_URI "urn:ardour:a-eq"
+#define BANDS 6
+#ifndef MIN
+#define MIN(A,B) ((A) < (B)) ? (A) : (B)
+#endif
+
+typedef enum {
+ AEQ_FREQL = 0,
+ AEQ_GAINL,
+ AEQ_FREQ1,
+ AEQ_GAIN1,
+ AEQ_BW1,
+ AEQ_FREQ2,
+ AEQ_GAIN2,
+ AEQ_BW2,
+ AEQ_FREQ3,
+ AEQ_GAIN3,
+ AEQ_BW3,
+ AEQ_FREQ4,
+ AEQ_GAIN4,
+ AEQ_BW4,
+ AEQ_FREQH,
+ AEQ_GAINH,
+ AEQ_MASTER,
+ AEQ_FILTOGL,
+ AEQ_FILTOG1,
+ AEQ_FILTOG2,
+ AEQ_FILTOG3,
+ AEQ_FILTOG4,
+ AEQ_FILTOGH,
+ AEQ_INPUT,
+ AEQ_OUTPUT,
+} PortIndex;
+
+static inline double
+to_dB(double g) {
+ return (20.0*log10(g));
+}
+
+static inline double
+from_dB(double gdb) {
+ return (exp(gdb/20.0*log(10.0)));
+}
+
+static inline bool
+is_eq(float a, float b, float small) {
+ return (fabsf(a - b) < small);
+}
+
+struct linear_svf {
+ double g, k;
+ double a[3];
+ double m[3];
+ double s[2];
+};
+
+static void linear_svf_reset(struct linear_svf *self)
+{
+ self->s[0] = self->s[1] = 0.0;
+}
+
+typedef struct {
+ float* f0[BANDS];
+ float* g[BANDS];
+ float* bw[BANDS];
+ float* filtog[BANDS];
+ float* master;
+
+ float srate;
+ float tau;
+
+ float* input;
+ float* output;
+
+ struct linear_svf v_filter[BANDS];
+ float v_g[BANDS];
+ float v_bw[BANDS];
+ float v_f0[BANDS];
+ float v_master;
+
+ bool need_expose;
+
+#ifdef LV2_EXTENDED
+ LV2_Inline_Display_Image_Surface surf;
+ cairo_surface_t* display;
+ LV2_Inline_Display* queue_draw;
+ uint32_t w, h;
+#endif
+} Aeq;
+
+static LV2_Handle
+instantiate(const LV2_Descriptor* descriptor,
+ double rate,
+ const char* bundle_path,
+ const LV2_Feature* const* features)
+{
+ Aeq* aeq = (Aeq*)calloc(1, sizeof(Aeq));
+ aeq->srate = rate;
+ aeq->tau = (1.0 - exp(-2.0 * M_PI * 64 * 25. / aeq->srate)); // 25Hz time constant @ 64fpp
+
+#ifdef LV2_EXTENDED
+ for (int i=0; features[i]; ++i) {
+ if (!strcmp(features[i]->URI, LV2_INLINEDISPLAY__queue_draw)) {
+ aeq->queue_draw = (LV2_Inline_Display*) features[i]->data;
+ }
+ }
+#endif
+
+ for (int i = 0; i < BANDS; i++)
+ linear_svf_reset(&aeq->v_filter[i]);
+
+ aeq->need_expose = true;
+#ifdef LV2_EXTENDED
+ aeq->display = NULL;
+#endif
+
+ return (LV2_Handle)aeq;
+}
+
+static void
+connect_port(LV2_Handle instance,
+ uint32_t port,
+ void* data)
+{
+ Aeq* aeq = (Aeq*)instance;
+
+ switch ((PortIndex)port) {
+ case AEQ_FREQL:
+ aeq->f0[0] = (float*)data;
+ break;
+ case AEQ_GAINL:
+ aeq->g[0] = (float*)data;
+ break;
+ case AEQ_FREQ1:
+ aeq->f0[1] = (float*)data;
+ break;
+ case AEQ_GAIN1:
+ aeq->g[1] = (float*)data;
+ break;
+ case AEQ_BW1:
+ aeq->bw[1] = (float*)data;
+ break;
+ case AEQ_FREQ2:
+ aeq->f0[2] = (float*)data;
+ break;
+ case AEQ_GAIN2:
+ aeq->g[2] = (float*)data;
+ break;
+ case AEQ_BW2:
+ aeq->bw[2] = (float*)data;
+ break;
+ case AEQ_FREQ3:
+ aeq->f0[3] = (float*)data;
+ break;
+ case AEQ_GAIN3:
+ aeq->g[3] = (float*)data;
+ break;
+ case AEQ_BW3:
+ aeq->bw[3] = (float*)data;
+ break;
+ case AEQ_FREQ4:
+ aeq->f0[4] = (float*)data;
+ break;
+ case AEQ_GAIN4:
+ aeq->g[4] = (float*)data;
+ break;
+ case AEQ_BW4:
+ aeq->bw[4] = (float*)data;
+ break;
+ case AEQ_FREQH:
+ aeq->f0[5] = (float*)data;
+ break;
+ case AEQ_GAINH:
+ aeq->g[5] = (float*)data;
+ break;
+ case AEQ_MASTER:
+ aeq->master = (float*)data;
+ break;
+ case AEQ_FILTOGL:
+ aeq->filtog[0] = (float*)data;
+ break;
+ case AEQ_FILTOG1:
+ aeq->filtog[1] = (float*)data;
+ break;
+ case AEQ_FILTOG2:
+ aeq->filtog[2] = (float*)data;
+ break;
+ case AEQ_FILTOG3:
+ aeq->filtog[3] = (float*)data;
+ break;
+ case AEQ_FILTOG4:
+ aeq->filtog[4] = (float*)data;
+ break;
+ case AEQ_FILTOGH:
+ aeq->filtog[5] = (float*)data;
+ break;
+ case AEQ_INPUT:
+ aeq->input = (float*)data;
+ break;
+ case AEQ_OUTPUT:
+ aeq->output = (float*)data;
+ break;
+ }
+}
+
+static void
+activate(LV2_Handle instance)
+{
+ int i;
+ Aeq* aeq = (Aeq*)instance;
+
+ for (i = 0; i < BANDS; i++)
+ linear_svf_reset(&aeq->v_filter[i]);
+}
+
+// SVF filters
+// http://www.cytomic.com/files/dsp/SvfLinearTrapOptimised2.pdf
+
+static void linear_svf_set_peq(struct linear_svf *self, float gdb, float sample_rate, float cutoff, float bandwidth)
+{
+ double f0 = (double)cutoff;
+ double q = (double)pow(2.0, 1.0 / bandwidth) / (pow(2.0, bandwidth) - 1.0);
+ double sr = (double)sample_rate;
+ double A = pow(10.0, gdb/40.0);
+
+ self->g = tan(M_PI * (f0 / sr));
+ self->k = 1.0 / (q * A);
+
+ self->a[0] = 1.0 / (1.0 + self->g * (self->g + self->k));
+ self->a[1] = self->g * self->a[0];
+ self->a[2] = self->g * self->a[1];
+
+ self->m[0] = 1.0;
+ self->m[1] = self->k * (A * A - 1.0);
+ self->m[2] = 0.0;
+}
+
+static void linear_svf_set_highshelf(struct linear_svf *self, float gdb, float sample_rate, float cutoff, float resonance)
+{
+ double f0 = (double)cutoff;
+ double q = (double)resonance;
+ double sr = (double)sample_rate;
+ double A = pow(10.0, gdb/40.0);
+
+ self->g = tan(M_PI * (f0 / sr));
+ self->k = 1.0 / q;
+
+ self->a[0] = 1.0 / (1.0 + self->g * (self->g + self->k));
+ self->a[1] = self->g * self->a[0];
+ self->a[2] = self->g * self->a[1];
+
+ self->m[0] = A * A;
+ self->m[1] = self->k * (1.0 - A) * A;
+ self->m[2] = 1.0 - A * A;
+}
+
+static void linear_svf_set_lowshelf(struct linear_svf *self, float gdb, float sample_rate, float cutoff, float resonance)
+{
+ double f0 = (double)cutoff;
+ double q = (double)resonance;
+ double sr = (double)sample_rate;
+ double A = pow(10.0, gdb/40.0);
+
+ self->g = tan(M_PI * (f0 / sr));
+ self->k = 1.0 / q;
+
+ self->a[0] = 1.0 / (1.0 + self->g * (self->g + self->k));
+ self->a[1] = self->g * self->a[0];
+ self->a[2] = self->g * self->a[1];
+
+ self->m[0] = 1.0;
+ self->m[1] = self->k * (A - 1.0);
+ self->m[2] = A * A - 1.0;
+}
+
+static float run_linear_svf(struct linear_svf *self, float in)
+{
+ double v[3];
+ double din = (double)in;
+ double out;
+
+ v[2] = din - self->s[1];
+ v[0] = (self->a[0] * self->s[0]) + (self->a[1] * v[2]);
+ v[1] = self->s[1] + (self->a[1] * self->s[0]) + (self->a[2] * v[2]);
+
+ self->s[0] = (2.0 * v[0]) - self->s[0];
+ self->s[1] = (2.0 * v[1]) - self->s[1];
+
+ out = (self->m[0] * din)
+ + (self->m[1] * v[0])
+ + (self->m[2] * v[1]);
+
+ return (float)out;
+}
+
+static void set_params(LV2_Handle instance, int band) {
+ Aeq* aeq = (Aeq*)instance;
+
+ switch (band) {
+ case 0:
+ linear_svf_set_lowshelf(&aeq->v_filter[0], aeq->v_g[0], aeq->srate, aeq->v_f0[0], 0.7071068);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ linear_svf_set_peq(&aeq->v_filter[band], aeq->v_g[band], aeq->srate, aeq->v_f0[band], aeq->v_bw[band]);
+ break;
+ case 5:
+ linear_svf_set_highshelf(&aeq->v_filter[5], aeq->v_g[5], aeq->srate, aeq->v_f0[5], 0.7071068);
+ break;
+ }
+}
+
+static void
+run(LV2_Handle instance, uint32_t n_samples)
+{
+ Aeq* aeq = (Aeq*)instance;
+
+ const float* const input = aeq->input;
+ float* const output = aeq->output;
+
+ const float tau = aeq->tau;
+ uint32_t offset = 0;
+
+ while (n_samples > 0) {
+ uint32_t block = n_samples;
+ bool any_changed = false;
+
+ // TODO global en/disable
+ if (!is_eq(aeq->v_master, *aeq->master, 0.1)) {
+ aeq->v_master += tau * (*aeq->master - aeq->v_master);
+ any_changed = true;
+ } else {
+ aeq->v_master = *aeq->master;
+ }
+
+ for (int i = 0; i < BANDS; ++i) {
+ bool changed = false;
+
+ if (!is_eq(aeq->v_f0[i], *aeq->f0[i], 0.1)) {
+ aeq->v_f0[i] += tau * (*aeq->f0[i] - aeq->v_f0[i]);
+ changed = true;
+ } else {
+ aeq->v_f0[i] = *aeq->f0[i];
+ }
+
+ if (*aeq->filtog[i] <= 0) {
+ if (!is_eq(aeq->v_g[i], 0.f, 0.05)) {
+ aeq->v_g[i] += tau * (0.0 - aeq->v_g[i]);
+ changed = true;
+ } else {
+ aeq->v_g[i] = 0.0;
+ }
+ } else {
+ if (!is_eq(aeq->v_g[i], *aeq->g[i], 0.05)) {
+ aeq->v_g[i] += tau * (*aeq->g[i] - aeq->v_g[i]);
+ changed = true;
+ } else {
+ aeq->v_g[i] = *aeq->g[i];
+ }
+ }
+
+ if (i != 0 && i != 5) {
+ if (!is_eq(aeq->v_bw[i], *aeq->bw[i], 0.001)) {
+ aeq->v_bw[i] += tau * (*aeq->bw[i] - aeq->v_bw[i]);
+ changed = true;
+ } else {
+ aeq->v_bw[i] = *aeq->bw[i];
+ }
+ }
+
+ if (changed) {
+ set_params(aeq, i);
+ any_changed = true;
+ }
+ }
+
+ if (any_changed) {
+ aeq->need_expose = true;
+ block = MIN (64, n_samples);
+ }
+
+ for (uint32_t i = 0; i < block; ++i) {
+ float in0, out;
+ in0 = input[i + offset];
+ out = in0;
+ for (uint32_t j = 0; j < BANDS; j++) {
+ out = run_linear_svf(&aeq->v_filter[j], out);
+ }
+ output[i + offset] = out * from_dB(*(aeq->master));
+ }
+ n_samples -= block;
+ offset += block;
+ }
+
+#ifdef LV2_EXTENDED
+ if (aeq->need_expose && aeq->queue_draw) {
+ aeq->need_expose = false;
+ aeq->queue_draw->queue_draw (aeq->queue_draw->handle);
+ }
+#endif
+}
+
+static double
+calc_peq(Aeq* self, int i, double omega) {
+ double complex H = 0.0;
+ double complex z = cexp(I * omega);
+ double complex zz = cexp(2. * I * omega);
+ double complex zm = z - 1.0;
+ double complex zp = z + 1.0;
+ double complex zzm = zz - 1.0;
+
+ double A = pow(10.0, self->v_g[i]/40.0);
+ double g = self->v_filter[i].g;
+ double k = self->v_filter[i].k * A;
+ double m1 = k * (A * A - 1.0) / A;
+
+ H = (g*k*zzm + A*(g*zp*(m1*zm) + (zm*zm + g*g*zp*zp))) / (g*k*zzm + A*(zm*zm + g*g*zp*zp));
+ return cabs(H);
+}
+
+static double
+calc_lowshelf(Aeq* self, double omega) {
+ double complex H = 0.0;
+ double complex z = cexp(I * omega);
+ double complex zz = cexp(2. * I * omega);
+ double complex zm = z - 1.0;
+ double complex zp = z + 1.0;
+ double complex zzm = zz - 1.0;
+
+ double A = pow(10.0, self->v_g[0]/40.0);
+ double g = self->v_filter[0].g;
+ double k = self->v_filter[0].k;
+ double m0 = self->v_filter[0].m[0];
+ double m1 = self->v_filter[0].m[1];
+ double m2 = self->v_filter[0].m[2];
+
+ H = (A*m0*zm*zm + g*g*(m0+m2)*zp*zp + sqrt(A)*g*(k*m0+m1) * zzm) / (A*zm*zm + g*g*zp*zp + sqrt(A)*g*k*zzm);
+ return cabs(H);
+}
+
+static double
+calc_highshelf(Aeq* self, double omega) {
+ double complex H = 0.0;
+ double complex z = cexp(I * omega);
+ double complex zz = cexp(2. * I * omega);
+ double complex zm = z - 1.0;
+ double complex zp = z + 1.0;
+ double complex zzm = zz - 1.0;
+
+ double A = pow(10.0, self->v_g[5]/40.0);
+ double g = self->v_filter[5].g;
+ double k = self->v_filter[5].k;
+ double m0 = self->v_filter[5].m[0];
+ double m1 = self->v_filter[5].m[1];
+ double m2 = self->v_filter[5].m[2];
+
+ H = ( sqrt(A) * g * zp * (m1 * zm + sqrt(A)*g*m2*zp) + m0 * ( zm*zm + A*g*g*zp*zp + sqrt(A)*g*k*zzm)) / (zm*zm + A*g*g*zp*zp + sqrt(A)*g*k*zzm);
+ return cabs(H);
+}
+
+#ifdef LV2_EXTENDED
+static float
+eq_curve (Aeq* self, float f) {
+ double response = 1.0;
+ double SR = (double)self->srate;
+ double omega = f * 2. * M_PI / SR;
+
+ // lowshelf
+ response *= calc_lowshelf(self, omega);
+
+ // peq 1 - 4:
+ response *= calc_peq(self, 1, omega);
+ response *= calc_peq(self, 2, omega);
+ response *= calc_peq(self, 3, omega);
+ response *= calc_peq(self, 4, omega);
+
+ // highshelf:
+ response *= calc_highshelf(self, omega);
+
+ return (float)response;
+}
+
+static LV2_Inline_Display_Image_Surface *
+render_inline (LV2_Handle instance, uint32_t w, uint32_t max_h)
+{
+ Aeq* self = (Aeq*)instance;
+ uint32_t h = MIN (1 | (uint32_t)ceilf (w * 9.f / 16.f), max_h);
+
+ if (!self->display || self->w != w || self->h != h) {
+ if (self->display) cairo_surface_destroy(self->display);
+ self->display = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+ self->w = w;
+ self->h = h;
+ }
+
+ cairo_t* cr = cairo_create (self->display);
+
+ // clear background
+ cairo_rectangle (cr, 0, 0, w, h);
+ cairo_set_source_rgba (cr, .2, .2, .2, 1.0);
+ cairo_fill (cr);
+
+ cairo_set_line_width(cr, 1.0);
+
+ // prepare grid drawing
+ cairo_save (cr);
+ const double dash2[] = {1, 3};
+ //cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
+ cairo_set_dash(cr, dash2, 2, 2);
+ cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
+
+ // draw x-grid 6dB steps
+ for (int32_t d = -18; d <= 18; d+=6) {
+ float y = (float)h * (d / 40.0 + 0.5);
+ y = rint (y) - .5;
+ cairo_move_to (cr, 0, y);
+ cairo_line_to (cr, w, y);
+ cairo_stroke (cr);
+ }
+ // draw y-axis grid 100, 1k, 10K
+ for (int32_t f = 100; f <= 10000; f *= 10) {
+ float x = w * log10 (f / 20.0) / log10 (1000.0);
+ x = rint (x) - .5;
+ cairo_move_to (cr, x, 0);
+ cairo_line_to (cr, x, h);
+ cairo_stroke (cr);
+ }
+
+ cairo_restore (cr);
+
+
+ // draw curve
+ cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+ cairo_move_to (cr, 0, h);
+
+ for (uint32_t x = 0; x < w; ++x) {
+ // plot 20..20kHz +-20dB
+ const float x_hz = 20.f * powf (1000.f, (float)x / (float)w);
+ const float y_db = to_dB(eq_curve(self, x_hz)) + self->v_master;
+ const float y = (float)h * (-y_db / 40.0 + 0.5);
+ cairo_line_to (cr, x, y);
+ }
+ cairo_stroke_preserve (cr);
+
+ cairo_line_to (cr, w, h);
+ cairo_close_path (cr);
+ cairo_clip (cr);
+
+ // create RGBA surface
+ cairo_destroy (cr);
+ cairo_surface_flush (self->display);
+ self->surf.width = cairo_image_surface_get_width (self->display);
+ self->surf.height = cairo_image_surface_get_height (self->display);
+ self->surf.stride = cairo_image_surface_get_stride (self->display);
+ self->surf.data = cairo_image_surface_get_data (self->display);
+
+ return &self->surf;
+}
+#endif
+
+static const void*
+extension_data(const char* uri)
+{
+#ifdef LV2_EXTENDED
+ static const LV2_Inline_Display_Interface display = { render_inline };
+ if (!strcmp(uri, LV2_INLINEDISPLAY__interface)) {
+ return &display;
+ }
+#endif
+ return NULL;
+}
+
+static void
+cleanup(LV2_Handle instance)
+{
+#ifdef LV2_EXTENDED
+ Aeq* aeq = (Aeq*)instance;
+ if (aeq->display) {
+ cairo_surface_destroy (aeq->display);
+ }
+#endif
+ free(instance);
+}
+
+static const LV2_Descriptor descriptor = {
+ AEQ_URI,
+ instantiate,
+ connect_port,
+ activate,
+ run,
+ NULL,
+ cleanup,
+ extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor(uint32_t index)
+{
+ switch (index) {
+ case 0:
+ return &descriptor;
+ default:
+ return NULL;
+ }
+}
diff --git a/libs/plugins/a-eq.lv2/a-eq.ttl.in b/libs/plugins/a-eq.lv2/a-eq.ttl.in
new file mode 100644
index 0000000..429e8ea
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/a-eq.ttl.in
@@ -0,0 +1,291 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz: <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+ at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+
+<http://ardour.org/credits.html>
+ a foaf:Person ;
+ foaf:name "Ardour Team" ;
+ foaf:homepage <http://ardour.org/> .
+
+unit:hz0
+ a unit:Unit ;
+ rdfs:label "hertz" ;
+ unit:prefixConversion [
+ unit:factor 0.001 ;
+ unit:to unit:khz
+ ] ;
+ unit:render "%.0f Hz" ;
+ unit:symbol "Hz" .
+
+<urn:ardour:a-eq>
+ a lv2:Plugin, doap:Project, lv2:FilterPlugin ;
+
+ lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable> ;
+
+ lv2:requiredFeature <http://lv2plug.in/ns/ext/options#options> ,
+ <http://lv2plug.in/ns/ext/urid#map> ;
+
+ lv2:port [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 0 ;
+ lv2:name "Frequency L" ;
+ lv2:symbol "freql" ;
+ lv2:default 160.000000 ;
+ lv2:minimum 20.000000 ;
+ lv2:maximum 20000.000000 ;
+ unit:unit unit:hz0 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 1 ;
+ lv2:name "Gain L" ;
+ lv2:symbol "gl" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -20.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit unit:db ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 2 ;
+ lv2:name "Frequency 1" ;
+ lv2:symbol "freq1" ;
+ lv2:default 300.000000 ;
+ lv2:minimum 20.000000 ;
+ lv2:maximum 20000.000000 ;
+ unit:unit unit:hz0 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 3 ;
+ lv2:name "Gain 1" ;
+ lv2:symbol "g1" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -20.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit unit:db ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 4 ;
+ lv2:name "Bandwidth 1" ;
+ lv2:symbol "bw1" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.1000000 ;
+ lv2:maximum 4.000000 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 5 ;
+ lv2:name "Frequency 2" ;
+ lv2:symbol "freq2" ;
+ lv2:default 1000.000000 ;
+ lv2:minimum 20.000000 ;
+ lv2:maximum 20000.000000 ;
+ unit:unit unit:hz0 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 6 ;
+ lv2:name "Gain 2" ;
+ lv2:symbol "g2" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -20.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit unit:db ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 7 ;
+ lv2:name "Bandwidth 2" ;
+ lv2:symbol "bw2" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.1000000 ;
+ lv2:maximum 4.000000 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 8 ;
+ lv2:name "Frequency 3" ;
+ lv2:symbol "freq3" ;
+ lv2:default 2500.000000 ;
+ lv2:minimum 20.000000 ;
+ lv2:maximum 20000.000000 ;
+ unit:unit unit:hz0 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 9 ;
+ lv2:name "Gain 3" ;
+ lv2:symbol "g3" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -20.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit unit:db ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 10 ;
+ lv2:name "Bandwidth 3" ;
+ lv2:symbol "bw3" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.1000000 ;
+ lv2:maximum 4.000000 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 11 ;
+ lv2:name "Frequency 4" ;
+ lv2:symbol "freq4" ;
+ lv2:default 6000.000000 ;
+ lv2:minimum 20.000000 ;
+ lv2:maximum 20000.000000 ;
+ unit:unit unit:hz0 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 12 ;
+ lv2:name "Gain 4" ;
+ lv2:symbol "g4" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -20.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit unit:db ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 13 ;
+ lv2:name "Bandwidth 4" ;
+ lv2:symbol "bw4" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.1000000 ;
+ lv2:maximum 4.000000 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 14 ;
+ lv2:name "Frequency H" ;
+ lv2:symbol "freqh" ;
+ lv2:default 9000.000000 ;
+ lv2:minimum 20.000000 ;
+ lv2:maximum 20000.000000 ;
+ unit:unit unit:hz0 ;
+ lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 15 ;
+ lv2:name "Gain H" ;
+ lv2:symbol "gh" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -20.000000 ;
+ lv2:maximum 20.000000 ;
+ unit:unit unit:db ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 16 ;
+ lv2:name "Master Gain" ;
+ lv2:symbol "master" ;
+ lv2:default 0.000000 ;
+ lv2:minimum -20.000000 ;
+ lv2:maximum 20.000000 ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 17 ;
+ lv2:name "Filter L" ;
+ lv2:symbol "filtogl" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 18 ;
+ lv2:name "Filter 1" ;
+ lv2:symbol "filtog1" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 19 ;
+ lv2:name "Filter 2" ;
+ lv2:symbol "filtog2" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 20 ;
+ lv2:name "Filter 3" ;
+ lv2:symbol "filtog3" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 21 ;
+ lv2:name "Filter 4" ;
+ lv2:symbol "filtog4" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ],
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 22 ;
+ lv2:name "Filter H" ;
+ lv2:symbol "filtogh" ;
+ lv2:default 1.000000 ;
+ lv2:minimum 0.000000 ;
+ lv2:maximum 1.000000 ;
+ lv2:portProperty lv2:toggled ;
+ ] ;
+
+ lv2:port [
+ a lv2:InputPort, lv2:AudioPort ;
+ lv2:index 23 ;
+ lv2:symbol "in_1" ;
+ lv2:name "Audio Input 1" ;
+ ] ;
+
+ lv2:port [
+ a lv2:OutputPort, lv2:AudioPort ;
+ lv2:index 24 ;
+ lv2:symbol "out_1" ;
+ lv2:name "Audio Output 1" ;
+ ] ;
+
+ rdfs:comment """
+A basic 4 band EQ.
+""" ;
+
+ doap:name "a-EQ" ;
+ doap:license "GPL v2+" ;
+ doap:maintainer <http://ardour.org/credits.html> ;
+
+ lv2:microVersion 0 ;
+ lv2:minorVersion 1 .
diff --git a/libs/plugins/a-eq.lv2/manifest.ttl.in b/libs/plugins/a-eq.lv2/manifest.ttl.in
new file mode 100644
index 0000000..e446245
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/manifest.ttl.in
@@ -0,0 +1,8 @@
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-eq>
+ a lv2:Plugin ;
+ lv2:binary <a-eq at LIB_EXT@> ;
+ rdfs:seeAlso <a-eq.ttl> .
diff --git a/libs/plugins/a-eq.lv2/wscript b/libs/plugins/a-eq.lv2/wscript
new file mode 100644
index 0000000..0610ba2
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/wscript
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+ autowaf.set_options(opt)
+
+def configure(conf):
+ conf.load('compiler_c')
+ autowaf.configure(conf)
+ if Options.options.lv2:
+ autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+ uselib_store='LV2_1_0_0')
+ autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0')
+
+def build(bld):
+ bundle = 'a-eq.lv2'
+ module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+ module_ext = module_pat[module_pat.rfind('.'):]
+
+ if bld.is_defined ('HAVE_LV2'):
+ # Build RDF files
+ for i in ['manifest.ttl', 'a-eq.ttl']:
+ bld(features = 'subst',
+ source = i + '.in',
+ target = '../../LV2/%s/%s' % (bundle, i),
+ install_path = '${LV2DIR}/%s' % bundle,
+ chmod = Utils.O644,
+ LIB_EXT = module_ext)
+
+ # Build plugin library
+ obj = bld(features = 'c cshlib',
+ source = 'a-eq.c',
+ name = 'a-eq',
+ cflags = [ '-fPIC', bld.env['compiler_flags_dict']['c99'] ],
+ includes = [ '../../ardour' ],
+ target = '../../LV2/%s/a-eq' % bundle,
+ install_path = '${LV2DIR}/%s' % bundle,
+ uselib = 'CAIRO',
+ use = 'LV2_1_0_0'
+ )
+ obj.env.cshlib_PATTERN = module_pat
+ obj.env.cxxshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/a-reverb.lv2/a-reverb.c b/libs/plugins/a-reverb.lv2/a-reverb.c
new file mode 100644
index 0000000..8763758
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/a-reverb.c
@@ -0,0 +1,399 @@
+/* a-reverb -- based on b_reverb (setBfree) and FreeVerb
+ *
+ * Copyright (C) 2003-2004 Fredrik Kilander <fk at dsv.su.se>
+ * Copyright (C) 2008-2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2012 Will Panther <pantherb at setbfree.org>
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE // needed for M_PI
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <math.h>
+#include <string.h>
+
+#define RV_NZ 7
+#define DENORMAL_PROTECT (1e-14)
+
+typedef struct {
+ float* delays[2][RV_NZ]; /**< delay line buffer */
+
+ float* idx0[2][RV_NZ]; /**< Reset pointer ref delays[]*/
+ float* idxp[2][RV_NZ]; /**< Index pointer ref delays[]*/
+ float* endp[2][RV_NZ]; /**< End pointer ref delays[]*/
+
+ float gain[RV_NZ]; /**< feedback gains */
+ float yy1_0; /**< Previous output sample */
+ float y_1_0; /**< Feedback sample */
+ float yy1_1; /**< Previous output sample */
+ float y_1_1; /**< Feedback sample */
+
+ int end[2][RV_NZ];
+
+ float inputGain; /**< Input gain value */
+ float fbk; /**< Feedback gain */
+ float wet; /**< Output dry gain */
+ float dry; /**< Output wet gain */
+} b_reverb;
+
+static int
+setReverbPointers (b_reverb *r, int i, int c, const double rate)
+{
+ int e = (r->end[c][i] * rate / 25000.0);
+ e = e | 1;
+ r->delays[c][i] = (float*)realloc ((void*)r->delays[c][i], (e + 2) * sizeof (float));
+ if (!r->delays[c][i]) {
+ return -1;
+ } else {
+ memset (r->delays[c][i], 0 , (e + 2) * sizeof (float));
+ }
+ r->endp[c][i] = r->delays[c][i] + e + 1;
+ r->idx0[c][i] = r->idxp[c][i] = &(r->delays[c][i][0]);
+
+ return 0;
+}
+
+static int
+initReverb (b_reverb *r, const double rate)
+{
+ int err = 0;
+ int stereowidth = 7;
+
+ r->inputGain = powf (10.0, .05 * -20.0); // -20dB
+ r->fbk = -0.015; /* Feedback gain */
+ r->wet = 0.3;
+ r->dry = 0.7;
+
+ /* feedback combfilter */
+ r->gain[0] = 0.773;
+ r->gain[1] = 0.802;
+ r->gain[2] = 0.753;
+ r->gain[3] = 0.733;
+
+ /* all-pass filter */
+ r->gain[4] = sqrtf (0.5);
+ r->gain[5] = sqrtf (0.5);
+ r->gain[6] = sqrtf (0.5);
+
+ /* delay lines left */
+ r->end[0][0] = 1687;
+ r->end[0][1] = 1601;
+ r->end[0][2] = 2053;
+ r->end[0][3] = 2251;
+
+ /* all pass filters left */
+ r->end[0][4] = 347;
+ r->end[0][5] = 113;
+ r->end[0][6] = 37;
+
+ /* delay lines right */
+ r->end[1][0] = 1687 + stereowidth;
+ r->end[1][1] = 1601 + stereowidth;
+ r->end[1][2] = 2053 + stereowidth;
+ r->end[1][3] = 2251 + stereowidth;
+
+ /* all pass filters right */
+ r->end[0][4] = 347 + stereowidth;
+ r->end[0][5] = 113 + stereowidth;
+ r->end[0][6] = 37 + stereowidth;
+
+ for (int i = 0; i < RV_NZ; ++i) {
+ r->delays[0][i] = NULL;
+ r->delays[1][i] = NULL;
+ }
+
+ r->yy1_0 = 0.0;
+ r->y_1_0 = 0.0;
+ r->yy1_1 = 0.0;
+ r->y_1_1 = 0.0;
+
+ for (int i = 0; i < RV_NZ; i++) {
+ err |= setReverbPointers (r, i, 0, rate);
+ err |= setReverbPointers (r, i, 1, rate);
+ }
+ return err;
+}
+
+static void
+reverb (b_reverb* r,
+ const float* inbuf0,
+ const float* inbuf1,
+ float* outbuf0,
+ float* outbuf1,
+ size_t n_samples)
+{
+ float** const idxp0 = r->idxp[0];
+ float** const idxp1 = r->idxp[1];
+ float* const* const endp0 = r->endp[0];
+ float* const* const endp1 = r->endp[1];
+ float* const* const idx00 = r->idx0[0];
+ float* const* const idx01 = r->idx0[1];
+ const float* const gain = r->gain;
+ const float inputGain = r->inputGain;
+ const float fbk = r->fbk;
+ const float wet = r->wet;
+ const float dry = r->dry;
+
+ const float* xp0 = inbuf0;
+ const float* xp1 = inbuf1;
+ float* yp0 = outbuf0;
+ float* yp1 = outbuf1;
+
+ float y_1_0 = r->y_1_0;
+ float yy1_0 = r->yy1_0;
+ float y_1_1 = r->y_1_1;
+ float yy1_1 = r->yy1_1;
+
+ for (size_t i = 0; i < n_samples; ++i) {
+ int j;
+ float y;
+ const float xo0 = *xp0++;
+ const float xo1 = *xp1++;
+ const float x0 = y_1_0 + (inputGain * xo0);
+ const float x1 = y_1_1 + (inputGain * xo1);
+ float xa = 0.0;
+ float xb = 0.0;
+ /* First we do four feedback comb filters (ie parallel delay lines,
+ * each with a single tap at the end that feeds back at the start) */
+
+ for (j = 0; j < 4; ++j) {
+ y = *idxp0[j];
+ *idxp0[j] = x0 + (gain[j] * y);
+ if (endp0[j] <= ++(idxp0[j])) {
+ idxp0[j] = idx00[j];
+ }
+ xa += y;
+ }
+ for (; j < 7; ++j) {
+ y = *idxp0[j];
+ *idxp0[j] = gain[j] * (xa + y);
+ if (endp0[j] <= ++(idxp0[j])) {
+ idxp0[j] = idx00[j];
+ }
+ xa = y - xa;
+ }
+
+ y = 0.5f * (xa + yy1_0);
+ yy1_0 = y;
+ y_1_0 = fbk * xa;
+
+ *yp0++ = ((wet * y) + (dry * xo0));
+
+ for (j = 0; j < 4; ++j) {
+ y = *idxp1[j];
+ *idxp1[j] = x1 + (gain[j] * y);
+ if (endp1[j] <= ++(idxp1[j])) {
+ idxp1[j] = idx01[j];
+ }
+ xb += y;
+ }
+ for (; j < 7; ++j) {
+ y = *idxp1[j];
+ *idxp1[j] = gain[j] * (xb + y);
+ if (endp1[j] <= ++(idxp1[j])) {
+ idxp1[j] = idx01[j];
+ }
+ xb = y - xb;
+ }
+
+ y = 0.5f * (xb + yy1_1);
+ yy1_1 = y;
+ y_1_1 = fbk * xb;
+
+ *yp1++ = ((wet * y) + (dry * xo1));
+ }
+
+ r->y_1_0 = y_1_0 + DENORMAL_PROTECT;
+ r->yy1_0 = yy1_0 + DENORMAL_PROTECT;
+ r->y_1_1 = y_1_1 + DENORMAL_PROTECT;
+ r->yy1_1 = yy1_1 + DENORMAL_PROTECT;
+}
+
+/******************************************************************************
+ * LV2 wrapper
+ */
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+typedef enum {
+ AR_INPUT0 = 0,
+ AR_INPUT1 = 1,
+ AR_OUTPUT0 = 2,
+ AR_OUTPUT1 = 3,
+ AR_MIX = 4,
+ AR_ROOMSZ = 5,
+} PortIndex;
+
+typedef struct {
+ float* input0;
+ float* input1;
+ float* output0;
+ float* output1;
+
+ float* mix;
+ float* roomsz;
+
+ float v_mix;
+ float v_roomsz;
+ float srate;
+
+ b_reverb r;
+} AReverb;
+
+static LV2_Handle
+instantiate (const LV2_Descriptor* descriptor,
+ double rate,
+ const char* bundle_path,
+ const LV2_Feature* const* features)
+{
+ AReverb* self = (AReverb*)calloc (1, sizeof (AReverb));
+ if (!self) {
+ return NULL;
+ }
+ if (initReverb (&self->r, rate)) {
+ return NULL;
+ }
+
+ // these are set in initReverb()
+ self->v_roomsz = 0.75;
+ self->v_mix = 0.1;
+ self->srate = rate;
+
+ return (LV2_Handle)self;
+}
+
+static void
+connect_port (LV2_Handle instance,
+ uint32_t port,
+ void* data)
+{
+ AReverb* self = (AReverb*)instance;
+
+ switch ((PortIndex)port) {
+ case AR_INPUT0:
+ self->input0 = (float*)data;
+ break;
+ case AR_INPUT1:
+ self->input1 = (float*)data;
+ break;
+ case AR_OUTPUT0:
+ self->output0 = (float*)data;
+ break;
+ case AR_OUTPUT1:
+ self->output1 = (float*)data;
+ break;
+ case AR_MIX:
+ self->mix = (float*)data;
+ break;
+ case AR_ROOMSZ:
+ self->roomsz = (float*)data;
+ break;
+ }
+}
+
+static void
+run (LV2_Handle instance, uint32_t n_samples)
+{
+ AReverb* self = (AReverb*)instance;
+
+ const float* const input0 = self->input0;
+ const float* const input1 = self->input1;
+ float* const output0 = self->output0;
+ float* const output1 = self->output1;
+
+ // 15Hz time constant
+ const float tau = (1.0 - exp(-2.0 * M_PI * n_samples * 15. / self->srate));
+
+ if (*self->mix != self->v_mix) {
+ self->v_mix += tau * ( *self->mix - self->v_mix);
+ self->r.wet = self->v_mix;
+ self->r.dry = 1.0 - self->v_mix;
+ }
+ if (*self->roomsz != self->v_roomsz) {
+ self->v_roomsz += tau * ( *self->roomsz - self->v_roomsz);
+ self->r.gain[0] = 0.773 * self->v_roomsz;
+ self->r.gain[1] = 0.802 * self->v_roomsz;
+ self->r.gain[2] = 0.753 * self->v_roomsz;
+ self->r.gain[3] = 0.733 * self->v_roomsz;
+ }
+
+ reverb (&self->r, input0, input1, output0, output1, n_samples);
+}
+
+static void
+activate (LV2_Handle instance)
+{
+ AReverb* self = (AReverb*)instance;
+
+ self->r.y_1_0 = 0;
+ self->r.yy1_0 = 0;
+ self->r.y_1_1 = 0;
+ self->r.yy1_1 = 0;
+ for (int i = 0; i < RV_NZ; ++i) {
+ self->r.delays[0][i] = NULL;
+ self->r.delays[1][i] = NULL;
+ }
+}
+
+static void
+deactivate (LV2_Handle instance)
+{
+ activate(instance);
+}
+
+static void
+cleanup (LV2_Handle instance)
+{
+ AReverb* self = (AReverb*)instance;
+ for (int i = 0; i < RV_NZ; ++i) {
+ free (self->r.delays[0][i]);
+ free (self->r.delays[1][i]);
+ }
+ free (instance);
+}
+
+static const void*
+extension_data (const char* uri)
+{
+ return NULL;
+}
+
+static const LV2_Descriptor descriptor = {
+ "urn:ardour:a-reverb",
+ instantiate,
+ connect_port,
+ activate,
+ run,
+ deactivate,
+ cleanup,
+ extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor (uint32_t index)
+{
+ switch (index) {
+ case 0:
+ return &descriptor;
+ default:
+ return NULL;
+ }
+}
diff --git a/libs/plugins/a-reverb.lv2/a-reverb.ttl.in b/libs/plugins/a-reverb.lv2/a-reverb.ttl.in
new file mode 100644
index 0000000..df9a5d2
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/a-reverb.ttl.in
@@ -0,0 +1,74 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix mod: <http://moddevices.com/ns/mod#> .
+ at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+
+<http://ardour.org/credits.html>
+ a foaf:Person ;
+ foaf:name "Ardour Team" ;
+ foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-reverb>
+ a doap:Project, lv2:Plugin, lv2:SpatialPlugin ;
+
+ doap:name "a-Reverb";
+ rdfs:comment "A Schroeder Reverberator";
+
+ doap:maintainer <http://ardour.org/credits.html> ;
+ doap:license <http://usefulinc.com/doap/licenses/gpl> ;
+
+ lv2:microVersion 0 ; lv2:minorVersion 2 ;
+ lv2:optionalFeature lv2:hardRTCapable ;
+
+ lv2:port
+ [
+ a lv2:AudioPort ,
+ lv2:InputPort ;
+ lv2:index 0 ;
+ lv2:symbol "in0" ;
+ lv2:name "In 0" ;
+ ],
+ [
+ a lv2:AudioPort ,
+ lv2:InputPort ;
+ lv2:index 1 ;
+ lv2:symbol "in1" ;
+ lv2:name "In 1" ;
+ ],
+ [
+ a lv2:AudioPort ,
+ lv2:OutputPort ;
+ lv2:index 2 ;
+ lv2:symbol "out0" ;
+ lv2:name "Out 0" ;
+ ],
+ [
+ a lv2:AudioPort ,
+ lv2:OutputPort ;
+ lv2:index 3 ;
+ lv2:symbol "out1" ;
+ lv2:name "Out 1" ;
+ ],
+ [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 4 ;
+ lv2:symbol "blend" ;
+ lv2:name "Blend";
+ lv2:default 0.3;
+ lv2:minimum 0.0 ;
+ lv2:maximum 1.0 ;
+ ],
+ [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 5 ;
+ lv2:symbol "roomsz" ;
+ lv2:name "Room Size";
+ lv2:default 0.5;
+ lv2:minimum 0.5 ;
+ lv2:maximum 1.0 ;
+ ] .
diff --git a/libs/plugins/a-reverb.lv2/manifest.ttl.in b/libs/plugins/a-reverb.lv2/manifest.ttl.in
new file mode 100644
index 0000000..c685139
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/manifest.ttl.in
@@ -0,0 +1,7 @@
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<urn:ardour:a-reverb>
+ a lv2:Plugin ;
+ lv2:binary <a-reverb at LIB_EXT@> ;
+ rdfs:seeAlso <a-reverb.ttl> .
diff --git a/libs/plugins/a-reverb.lv2/wscript b/libs/plugins/a-reverb.lv2/wscript
new file mode 100644
index 0000000..35601f2
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/wscript
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+ autowaf.set_options(opt)
+
+def configure(conf):
+ conf.load('compiler_c')
+ autowaf.configure(conf)
+ if Options.options.lv2:
+ autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+ uselib_store='LV2_1_0_0')
+
+def build(bld):
+ bundle = 'a-reverb.lv2'
+ module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+ module_ext = module_pat[module_pat.rfind('.'):]
+
+ if bld.is_defined ('HAVE_LV2'):
+ # Build RDF files
+ for i in ['manifest.ttl', 'a-reverb.ttl']:
+ bld(features = 'subst',
+ source = i + '.in',
+ target = '../../LV2/%s/%s' % (bundle, i),
+ install_path = '${LV2DIR}/%s' % bundle,
+ chmod = Utils.O644,
+ LIB_EXT = module_ext)
+
+ # Build plugin library
+ obj = bld(features = 'c cshlib',
+ source = 'a-reverb.c',
+ name = 'a-reverb',
+ cflags = [ '-fPIC', bld.env['compiler_flags_dict']['c99'] ],
+ includes = [ '../../ardour' ],
+ target = '../../LV2/%s/a-reverb' % bundle,
+ install_path = '${LV2DIR}/%s' % bundle,
+ uselib = 'CAIRO',
+ use = 'LV2_1_0_0'
+ )
+ obj.env.cshlib_PATTERN = module_pat
+ obj.env.cxxshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj b/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj
index b97c721..88866e8 100644
--- a/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj
+++ b/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\..\pbd;"$(GenericLibraryFolder)\glib-2.0\include";."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -124,7 +124,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\..\..\pbd;"$(GenericLibraryFolder)\glib-2.0\include";."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -205,7 +205,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\..\pbd;"$(GenericLibraryFolder)\glib-2.0\include";."
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -288,7 +288,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/plugins/reasonablesynth.lv2/lv2.c b/libs/plugins/reasonablesynth.lv2/lv2.c
index 4698cb9..bc3715a 100644
--- a/libs/plugins/reasonablesynth.lv2/lv2.c
+++ b/libs/plugins/reasonablesynth.lv2/lv2.c
@@ -153,6 +153,13 @@ run(LV2_Handle handle, uint32_t n_samples)
)
{
if (ev->body.type == self->midi_MidiEvent) {
+#ifdef DEBUG_MIDI_EVENT // debug midi messages in synth -- not rt-safe(!)
+ printf ("%5d (%d):", ev->time.frames, ev->body.size);
+ for (uint8_t i = 0; i < ev->body.size; ++i) {
+ printf (" %02x", ((const uint8_t*)(ev+1))[i]);
+ }
+ printf ("\n");
+#endif
if (written + BUFFER_SIZE_SAMPLES < ev->time.frames
&& ev->time.frames < n_samples) {
/* first synthesize sound up until the message timestamp */
diff --git a/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in b/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in
index 62921e5..93ade6f 100644
--- a/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in
+++ b/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in
@@ -7,17 +7,16 @@
@prefix pg: <http://lv2plug.in/ns/ext/port-groups#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
-<http://gareus.org/rgareus#me>
+<http://ardour.org/credits.html>
a foaf:Person ;
- foaf:name "Robin Gareus" ;
- foaf:mbox <mailto:robin at gareus.org> ;
- foaf:homepage <http://gareus.org/> .
+ foaf:name "Ardour Team" ;
+ foaf:homepage <http://ardour.org/> .
<https://community.ardour.org/node/7596>
a lv2:Plugin, lv2:InstrumentPlugin, doap:Project;
doap:license <http://usefulinc.com/doap/licenses/gpl> ;
- doap:maintainer <http://gareus.org/rgareus#me> ;
- doap:name "Reasonable Synth";
+ doap:maintainer <http://ardour.org/credits.html> ;
+ doap:name "a-Reasonable Synth";
lv2:optionalFeature lv2:hardRTCapable ;
lv2:requiredFeature urid:map ;
rdfs:comment """A simple synthesizer with no controls at all but a reasonable sound instead. Note that this synth does not respond to any Control or Program Messages. Its main purpose is to act as sensible default on new installations until other plugins are installed.""" ;
diff --git a/libs/ptformat/MSVCptformat/ptformat.vcproj b/libs/ptformat/MSVCptformat/ptformat.vcproj
index 55623e3..aa2b28d 100644
--- a/libs/ptformat/MSVCptformat/ptformat.vcproj
+++ b/libs/ptformat/MSVCptformat/ptformat.vcproj
@@ -60,7 +60,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+ AdditionalDependencies="pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib ws2_32.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0D.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
GenerateDebugInformation="true"
@@ -140,7 +140,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+ AdditionalDependencies="pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib ws2_32.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
SubSystem="2"
@@ -220,7 +220,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+ AdditionalDependencies="pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib ws2_32.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0RDC.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
GenerateDebugInformation="true"
@@ -286,7 +286,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/ptformat/ptfformat.cc b/libs/ptformat/ptfformat.cc
index 6d055d4..1dba1ac 100644
--- a/libs/ptformat/ptfformat.cc
+++ b/libs/ptformat/ptfformat.cc
@@ -14,13 +14,16 @@
*/
-#include "ptfformat.h"
-
#include <stdio.h>
+#include <stdlib.h>
#include <string>
#include <string.h>
#include <assert.h>
+#include <glib/gstdio.h>
+
+#include "ptfformat.h"
+
using namespace std;
static const uint32_t baselut[16] = {
@@ -113,8 +116,9 @@ PTFFormat::load(std::string path, int64_t targetsr) {
uint64_t i;
uint64_t j;
int inv;
+ int err;
- if (! (fp = fopen(path.c_str(), "rb"))) {
+ if (! (fp = g_fopen(path.c_str(), "rb"))) {
return -1;
}
@@ -230,6 +234,12 @@ PTFFormat::load(std::string path, int64_t targetsr) {
unxor10();
}
+ // Special case when ptx is exported to ptf in PT
+ if (v == 3) {
+ version = 11;
+ unxor_ptx_to_ptf();
+ }
+
if (version == 0 || version == 5 || version == 7) {
/* Haven't detected version yet so decipher */
j = 0;
@@ -257,8 +267,12 @@ PTFFormat::load(std::string path, int64_t targetsr) {
}
}
+ if (version < 5 || version > 12)
+ return -1;
targetrate = targetsr;
- parse();
+ err = parse();
+ if (err)
+ return -1;
return 0;
}
@@ -299,35 +313,69 @@ PTFFormat::unxor10(void)
}
void
+PTFFormat::unxor_ptx_to_ptf(void)
+{
+ unsigned char keyy[16] = { 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,
+ 0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0
+ };
+ uint64_t j;
+ uint8_t i;
+
+ for (i = 0, j = 0x10; j < len; j++,i++) {
+ ptfunxored[j] ^= keyy[i];
+ if ((j % 16) == 0) {
+ i = 0;
+ if (ptfunxored[j] % 2 == 0) {
+ ptfunxored[j]++;
+ } else {
+ ptfunxored[j]--;
+ }
+ }
+ }
+}
+
+int
PTFFormat::parse(void) {
if (version == 5) {
parse5header();
setrates();
+ if (sessionrate < 44100 || sessionrate > 192000)
+ return -1;
parseaudio5();
parserest5();
} else if (version == 7) {
parse7header();
setrates();
+ if (sessionrate < 44100 || sessionrate > 192000)
+ return -1;
parseaudio();
parserest89();
} else if (version == 8) {
parse8header();
setrates();
+ if (sessionrate < 44100 || sessionrate > 192000)
+ return -1;
parseaudio();
parserest89();
} else if (version == 9) {
parse9header();
setrates();
+ if (sessionrate < 44100 || sessionrate > 192000)
+ return -1;
parseaudio();
parserest89();
} else if (version == 10 || version == 11 || version == 12) {
parse10header();
setrates();
+ if (sessionrate < 44100 || sessionrate > 192000)
+ return -1;
parseaudio();
parserest10();
} else {
// Should not occur
+ return -1;
}
+ return 0;
}
void
@@ -589,13 +637,18 @@ PTFFormat::parserest5(void) {
vector<track_t>::iterator ti;
vector<track_t>::iterator bt = tracks.begin();
vector<track_t>::iterator et = tracks.end();
- track_t tr ( name, 0, 0, &r);
+ track_t tr = { name, 0, 0, r };
if ((ti = std::find(bt, et, tr)) != et) {
tracknumber = (*ti).index;
} else {
tracknumber = tracks.size() + 1;
}
- track_t t ( name, (uint16_t)tracknumber, uint8_t(0), &r);
+ track_t t = {
+ name,
+ (uint16_t)tracknumber,
+ uint8_t(0),
+ r
+ };
tracks.push_back(t);
} else {
region_t r = {
@@ -610,13 +663,18 @@ PTFFormat::parserest5(void) {
vector<track_t>::iterator ti;
vector<track_t>::iterator bt = tracks.begin();
vector<track_t>::iterator et = tracks.end();
- track_t tr ( name, 0, 0, &r );
+ track_t tr = { name, 0, 0, r };
if ((ti = std::find(bt, et, tr)) != et) {
tracknumber = (*ti).index;
} else {
tracknumber = tracks.size() + 1;
}
- track_t t ( name, (uint16_t)tracknumber, uint8_t(0), &r);
+ track_t t = {
+ name,
+ (uint16_t)tracknumber,
+ uint8_t(0),
+ r
+ };
tracks.push_back(t);
}
rindex++;
@@ -627,11 +685,10 @@ PTFFormat::parserest5(void) {
}
void
-PTFFormat::resort(std::vector<wav_t> *ws) {
+PTFFormat::resort(std::vector<wav_t>& ws) {
int j = 0;
- std::sort((*ws).begin(), (*ws).end());
- for (std::vector<wav_t>::iterator i = (*ws).begin();
- i != (*ws).end(); ++i) {
+ std::sort(ws.begin(), ws.end());
+ for (std::vector<wav_t>::iterator i = ws.begin(); i != ws.end(); ++i) {
(*i).index = j;
j++;
}
@@ -723,8 +780,8 @@ PTFFormat::parseaudio5(void) {
numberofwavs--;
i += 7;
}
- resort(&actualwavs);
- resort(&audiofiles);
+ resort(actualwavs);
+ resort(audiofiles);
}
void
@@ -1297,7 +1354,7 @@ PTFFormat::parserest10(void) {
vector<region_t>::iterator finish = regions.end();
vector<region_t>::iterator found;
if ((found = std::find(begin, finish, tr.reg)) != finish) {
- tr.set_region (&(*found));
+ tr.reg = (*found);
}
i = l+16;
offset = 0;
diff --git a/libs/ptformat/ptfformat.h b/libs/ptformat/ptfformat.h
index 8b2f58d..3a702aa 100644
--- a/libs/ptformat/ptfformat.h
+++ b/libs/ptformat/ptfformat.h
@@ -32,24 +32,24 @@ public:
*/
int load(std::string path, int64_t targetsr);
- typedef struct wav {
+ struct wav_t {
std::string filename;
uint16_t index;
int64_t posabsolute;
int64_t length;
- bool operator <(const struct wav& other) const {
+ bool operator <(const struct wav_t& other) const {
return (strcasecmp(this->filename.c_str(),
other.filename.c_str()) < 0);
}
- bool operator ==(const struct wav& other) const {
+ bool operator ==(const struct wav_t& other) const {
return (this->filename == other.filename ||
this->index == other.index);
}
- } wav_t;
+ };
typedef struct region {
std::string name;
@@ -65,25 +65,6 @@ public:
} region_t;
typedef struct track {
- track ()
- : index (0)
- , playlist (0)
- {
- memset ((void*)®, 0, sizeof(region_t));
- }
-
- track (std::string n, uint16_t i, uint8_t p, region_t *r)
- : name (n)
- , index (i)
- , playlist (p)
- {
- set_region (r);
- }
-
- void set_region (region_t *r) {
- memcpy ((void*)®, (void*)r, sizeof(region_t));
- }
-
std::string name;
uint16_t index;
uint8_t playlist;
@@ -136,8 +117,9 @@ public:
private:
bool foundin(std::string haystack, std::string needle);
- void parse(void);
+ int parse(void);
void unxor10(void);
+ void unxor_ptx_to_ptf(void);
void setrates(void);
void parse5header(void);
void parse7header(void);
@@ -149,7 +131,7 @@ private:
void parserest10(void);
void parseaudio5(void);
void parseaudio(void);
- void resort(std::vector<wav_t> *ws);
+ void resort(std::vector<wav_t>& ws);
uint8_t mostfrequent(uint32_t start, uint32_t stop);
std::vector<wav_t> actualwavs;
float ratefactor;
diff --git a/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj b/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj
index 62fdfa1..6234c26 100644
--- a/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj
+++ b/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -300,7 +300,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc
index fc48b40..74c2802 100644
--- a/libs/surfaces/control_protocol/basic_ui.cc
+++ b/libs/surfaces/control_protocol/basic_ui.cc
@@ -27,7 +27,7 @@
#include "control_protocol/basic_ui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
@@ -70,14 +70,39 @@ BasicUI::access_action ( std::string action_path )
void
BasicUI::loop_toggle ()
{
+ if (!session) {
+ return;
+ }
+
+ Location * looploc = session->locations()->auto_loop_location();
+
+ if (!looploc) {
+ return;
+ }
+
if (session->get_play_loop()) {
+
+ /* looping enabled, our job is to disable it */
+
session->request_play_loop (false);
+
} else {
- session->request_play_loop (true);
- if (!session->transport_rolling()) {
- session->request_transport_speed (1.0);
+
+ /* looping not enabled, our job is to enable it.
+
+ loop-is-NOT-mode: this action always starts the transport rolling.
+ loop-IS-mode: this action simply sets the loop play mechanism, but
+ does not start transport.
+ */
+ if (Config->get_loop_is_mode()) {
+ session->request_play_loop (true, false);
+ } else {
+ session->request_play_loop (true, true);
}
}
+
+ //show the loop markers
+ looploc->set_hidden (false, this);
}
void
@@ -174,22 +199,56 @@ BasicUI::transport_stop ()
void
BasicUI::transport_play (bool from_last_start)
{
- bool rolling = session->transport_rolling ();
+ if (!session) {
+ return;
+ }
- if (session->get_play_loop()) {
- session->request_play_loop (false);
+ if (session->is_auditioning()) {
+ return;
}
- if (session->get_play_range ()) {
- session->request_play_range (0);
+#if 0
+ if (session->config.get_external_sync()) {
+ switch (Config->get_sync_source()) {
+ case Engine:
+ break;
+ default:
+ /* transport controlled by the master */
+ return;
+ }
}
+#endif
+
+ bool rolling = session->transport_rolling();
+
+ if (session->get_play_loop()) {
+
+ /* If loop playback is not a mode, then we should cancel
+ it when this action is requested. If it is a mode
+ we just leave it in place.
+ */
- if (from_last_start && rolling) {
- session->request_locate (session->last_transport_start(), true);
+ if (!Config->get_loop_is_mode()) {
+ /* XXX it is not possible to just leave seamless loop and keep
+ playing at present (nov 4th 2009)
+ */
+ if (!Config->get_seamless_loop()) {
+ /* stop loop playback and stop rolling */
+ session->request_play_loop (false, true);
+ } else if (rolling) {
+ /* stop loop playback but keep rolling */
+ session->request_play_loop (false, false);
+ }
+ }
+ } else if (session->get_play_range () ) {
+ /* stop playing a range if we currently are */
+ session->request_play_range (0, true);
}
- session->request_transport_speed (1.0f);
+ if (!rolling) {
+ session->request_transport_speed (1.0f);
+ }
}
void
@@ -332,28 +391,27 @@ BasicUI::jump_by_seconds (double secs)
{
framepos_t current = session->transport_frame();
double s = (double) current / (double) session->nominal_frame_rate();
-
+
s+= secs;
if (s < 0) current = 0;
s = s * session->nominal_frame_rate();
-
+
session->request_locate ( floor(s) );
}
void
BasicUI::jump_by_bars (double bars)
{
- Timecode::BBT_Time bbt;
TempoMap& tmap (session->tempo_map());
- tmap.bbt_time (session->transport_frame(), bbt);
+ Timecode::BBT_Time bbt (tmap.bbt_at_frame (session->transport_frame()));
bars += bbt.bars;
if (bars < 0) bars = 0;
-
+
AnyTime any;
any.type = AnyTime::BBT;
any.bbt.bars = bars;
-
+
session->request_locate ( session->convert_to_frames (any) );
}
diff --git a/libs/surfaces/control_protocol/control_protocol.cc b/libs/surfaces/control_protocol/control_protocol.cc
index 57b874e..8c2a121 100644
--- a/libs/surfaces/control_protocol/control_protocol.cc
+++ b/libs/surfaces/control_protocol/control_protocol.cc
@@ -22,6 +22,7 @@
#include "ardour/gain_control.h"
#include "ardour/session.h"
+#include "ardour/record_enable_control.h"
#include "ardour/route.h"
#include "ardour/audio_track.h"
#include "ardour/meter.h"
@@ -45,15 +46,23 @@ PBD::Signal0<void> ControlProtocol::VerticalZoomInAll;
PBD::Signal0<void> ControlProtocol::VerticalZoomOutAll;
PBD::Signal0<void> ControlProtocol::VerticalZoomInSelected;
PBD::Signal0<void> ControlProtocol::VerticalZoomOutSelected;
-PBD::Signal1<void,RouteNotificationListPtr> ControlProtocol::TrackSelectionChanged;
-PBD::Signal1<void,uint32_t> ControlProtocol::AddRouteToSelection;
-PBD::Signal1<void,uint32_t> ControlProtocol::SetRouteSelection;
-PBD::Signal1<void,uint32_t> ControlProtocol::ToggleRouteSelection;
-PBD::Signal1<void,uint32_t> ControlProtocol::RemoveRouteFromSelection;
-PBD::Signal0<void> ControlProtocol::ClearRouteSelection;
PBD::Signal0<void> ControlProtocol::StepTracksDown;
PBD::Signal0<void> ControlProtocol::StepTracksUp;
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::AddStripableToSelection;
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::SetStripableSelection;
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::ToggleStripableSelection;
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::RemoveStripableFromSelection;
+PBD::Signal0<void> ControlProtocol::ClearStripableSelection;
+
+PBD::Signal1<void,StripableNotificationListPtr> ControlProtocol::StripableSelectionChanged;
+
+Glib::Threads::Mutex ControlProtocol::first_selected_mutex;
+boost::weak_ptr<Stripable> ControlProtocol::_first_selected_stripable;
+StripableNotificationList ControlProtocol::_last_selected;
+bool ControlProtocol::selection_connected = false;
+PBD::ScopedConnection ControlProtocol::selection_connection;
+
const std::string ControlProtocol::state_node_name ("Protocol");
ControlProtocol::ControlProtocol (Session& s, string str)
@@ -61,6 +70,12 @@ ControlProtocol::ControlProtocol (Session& s, string str)
, _name (str)
, _active (false)
{
+ if (!selection_connected) {
+ /* this is all static, connect it only once (and early), for all ControlProtocols */
+
+ StripableSelectionChanged.connect_same_thread (selection_connection, boost::bind (&ControlProtocol::stripable_selection_changed, _1));
+ selection_connected = true;
+ }
}
ControlProtocol::~ControlProtocol ()
@@ -77,82 +92,18 @@ ControlProtocol::set_active (bool yn)
void
ControlProtocol::next_track (uint32_t initial_id)
{
- uint32_t limit = session->nroutes();
- boost::shared_ptr<Route> cr = route_table[0];
- uint32_t id;
-
- if (cr) {
- id = cr->remote_control_id ();
- } else {
- id = 0;
- }
-
- if (id == limit) {
- id = 0;
- } else {
- id++;
- }
-
- while (id <= limit) {
- if ((cr = session->route_by_remote_id (id)) != 0) {
- break;
- }
- id++;
- }
-
- if (id >= limit) {
- id = 0;
- while (id != initial_id) {
- if ((cr = session->route_by_remote_id (id)) != 0) {
- break;
- }
- id++;
- }
- }
-
- route_table[0] = cr;
+ // STRIPABLE route_table[0] = _session->get_nth_stripable (++initial_id, RemoteControlID::Route);
}
void
ControlProtocol::prev_track (uint32_t initial_id)
{
- uint32_t limit = session->nroutes();
- boost::shared_ptr<Route> cr = route_table[0];
- int32_t id;
-
- if (cr) {
- id = cr->remote_control_id ();
- } else {
- id = 0;
- }
-
- if (id == 0) {
- id = limit;
- } else {
- id--;
- }
-
- while (id >= 0) {
- if ((cr = session->route_by_remote_id (id)) != 0) {
- break;
- }
- id--;
- }
-
- if (id < 0) {
- uint32_t i = limit;
- while (i > initial_id) {
- if ((cr = session->route_by_remote_id (i)) != 0) {
- break;
- }
- i--;
- }
+ if (!initial_id) {
+ return;
}
-
- route_table[0] = cr;
+ // STRIPABLE route_table[0] = _session->get_nth_stripable (--initial_id, RemoteControlID::Route);
}
-
void
ControlProtocol::set_route_table_size (uint32_t size)
{
@@ -176,6 +127,7 @@ ControlProtocol::set_route_table (uint32_t table_index, boost::shared_ptr<ARDOUR
bool
ControlProtocol::set_route_table (uint32_t table_index, uint32_t remote_control_id)
{
+#if 0 // STRIPABLE
boost::shared_ptr<Route> r = session->route_by_remote_id (remote_control_id);
if (!r) {
@@ -183,7 +135,7 @@ ControlProtocol::set_route_table (uint32_t table_index, uint32_t remote_control_
}
set_route_table (table_index, r);
-
+#endif
return true;
}
@@ -199,7 +151,7 @@ ControlProtocol::route_set_rec_enable (uint32_t table_index, bool yn)
boost::shared_ptr<AudioTrack> at = boost::dynamic_pointer_cast<AudioTrack>(r);
if (at) {
- at->set_record_enabled (yn, Controllable::NoGroup);
+ at->rec_enable_control()->set_value (1.0, Controllable::UseGroup);
}
}
@@ -215,7 +167,7 @@ ControlProtocol::route_get_rec_enable (uint32_t table_index)
boost::shared_ptr<AudioTrack> at = boost::dynamic_pointer_cast<AudioTrack>(r);
if (at) {
- return at->record_enabled ();
+ return at->rec_enable_control()->get_value();
}
return false;
@@ -248,7 +200,7 @@ ControlProtocol::route_set_gain (uint32_t table_index, float gain)
boost::shared_ptr<Route> r = route_table[table_index];
if (r != 0) {
- r->set_gain (gain, Controllable::UseGroup);
+ r->gain_control()->set_value (gain, Controllable::UseGroup);
}
}
@@ -282,10 +234,9 @@ ControlProtocol::route_get_peak_input_power (uint32_t table_index, uint32_t whic
return 0.0f;
}
- return r->peak_meter().meter_level (which_input, MeterPeak);
+ return r->peak_meter()->meter_level (which_input, MeterPeak);
}
-
bool
ControlProtocol::route_get_muted (uint32_t table_index)
{
@@ -299,7 +250,7 @@ ControlProtocol::route_get_muted (uint32_t table_index)
return false;
}
- return r->muted ();
+ return r->mute_control()->muted ();
}
void
@@ -312,7 +263,7 @@ ControlProtocol::route_set_muted (uint32_t table_index, bool yn)
boost::shared_ptr<Route> r = route_table[table_index];
if (r != 0) {
- r->set_mute (yn, Controllable::UseGroup);
+ r->mute_control()->set_value (yn ? 1.0 : 0.0, Controllable::UseGroup);
}
}
@@ -343,7 +294,7 @@ ControlProtocol::route_set_soloed (uint32_t table_index, bool yn)
boost::shared_ptr<Route> r = route_table[table_index];
if (r != 0) {
- r->set_solo (yn, Controllable::UseGroup);
+ r->solo_control()->set_value (yn ? 1.0 : 0.0, Controllable::UseGroup);
}
}
@@ -391,3 +342,37 @@ ControlProtocol::set_state (XMLNode const & node, int /* version */)
return 0;
}
+
+boost::shared_ptr<Stripable>
+ControlProtocol::first_selected_stripable ()
+{
+ Glib::Threads::Mutex::Lock lm (first_selected_mutex);
+ return _first_selected_stripable.lock();
+}
+
+void
+ControlProtocol::set_first_selected_stripable (boost::shared_ptr<Stripable> s)
+{
+ Glib::Threads::Mutex::Lock lm (first_selected_mutex);
+ _first_selected_stripable = s;
+}
+
+void
+ControlProtocol::stripable_selection_changed (StripableNotificationListPtr sp)
+{
+ bool had_selection = !_last_selected.empty();
+
+ _last_selected = *sp;
+
+ {
+ Glib::Threads::Mutex::Lock lm (first_selected_mutex);
+
+ if (!_last_selected.empty()) {
+ if (!had_selection) {
+ _first_selected_stripable = _last_selected.front().lock();
+ }
+ } else {
+ _first_selected_stripable = boost::weak_ptr<Stripable>();
+ }
+ }
+}
diff --git a/libs/surfaces/control_protocol/control_protocol/basic_ui.h b/libs/surfaces/control_protocol/control_protocol/basic_ui.h
index 1509602..43ebcfa 100644
--- a/libs/surfaces/control_protocol/control_protocol/basic_ui.h
+++ b/libs/surfaces/control_protocol/control_protocol/basic_ui.h
@@ -27,6 +27,7 @@
#include "pbd/signals.h"
#include "ardour/types.h"
+#include "ardour/presentation_info.h"
#include "timecode/time.h"
@@ -35,6 +36,7 @@
namespace ARDOUR {
class Session;
class SessionEvent;
+ class Stripable;
}
class LIBCONTROLCP_API BasicUI {
@@ -44,7 +46,7 @@ class LIBCONTROLCP_API BasicUI {
void add_marker (const std::string& = std::string());
void remove_marker_at_playhead ();
-
+
// void mark_in();
// void mark_out();
diff --git a/libs/surfaces/control_protocol/control_protocol/control_protocol.h b/libs/surfaces/control_protocol/control_protocol/control_protocol.h
index 71e8754..2485ca8 100644
--- a/libs/surfaces/control_protocol/control_protocol/control_protocol.h
+++ b/libs/surfaces/control_protocol/control_protocol/control_protocol.h
@@ -39,6 +39,7 @@ namespace ARDOUR {
class Route;
class Session;
class Bundle;
+class Stripable;
class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::ScopedConnectionList, public BasicUI
{
@@ -78,18 +79,21 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
static PBD::Signal0<void> StepTracksDown;
static PBD::Signal0<void> StepTracksUp;
- static PBD::Signal1<void,uint32_t> AddRouteToSelection;
- static PBD::Signal1<void,uint32_t> SetRouteSelection;
- static PBD::Signal1<void,uint32_t> ToggleRouteSelection;
- static PBD::Signal1<void,uint32_t> RemoveRouteFromSelection;
- static PBD::Signal0<void> ClearRouteSelection;
+ static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > AddStripableToSelection;
+ static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > SetStripableSelection;
+ static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ToggleStripableSelection;
+ static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > RemoveStripableFromSelection;
+ static PBD::Signal0<void> ClearStripableSelection;
/* signals that one UI (e.g. the GUI) can emit to get all other UI's to
respond. Typically this will always be GUI->"others" - the GUI pays
no attention to these signals.
*/
- static PBD::Signal1<void,RouteNotificationListPtr> TrackSelectionChanged;
+ static PBD::Signal1<void,StripableNotificationListPtr> StripableSelectionChanged;
+
+ static boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable ();
+ static void set_first_selected_stripable (boost::shared_ptr<ARDOUR::Stripable>);
/* the model here is as follows:
@@ -138,6 +142,7 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
int set_state (XMLNode const &, int version);
static const std::string state_node_name;
+ static StripableNotificationList const & last_selected() { return _last_selected; }
protected:
std::vector<boost::shared_ptr<ARDOUR::Route> > route_table;
@@ -149,6 +154,14 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
private:
LIBCONTROLCP_LOCAL ControlProtocol (const ControlProtocol&); /* noncopyable */
bool _active;
+
+
+ static Glib::Threads::Mutex first_selected_mutex;
+ static boost::weak_ptr<ARDOUR::Stripable> _first_selected_stripable;
+ static StripableNotificationList _last_selected;
+ static void stripable_selection_changed (StripableNotificationListPtr);
+ static bool selection_connected;
+ static PBD::ScopedConnection selection_connection;
};
extern "C" {
diff --git a/libs/surfaces/control_protocol/control_protocol/types.h b/libs/surfaces/control_protocol/control_protocol/types.h
index 1d46753..d2e5d07 100644
--- a/libs/surfaces/control_protocol/control_protocol/types.h
+++ b/libs/surfaces/control_protocol/control_protocol/types.h
@@ -26,11 +26,15 @@
namespace ARDOUR {
class Route;
+ class Stripable;
typedef std::vector<boost::weak_ptr<ARDOUR::Route> > RouteNotificationList;
typedef boost::shared_ptr<RouteNotificationList> RouteNotificationListPtr;
-
typedef std::vector<boost::shared_ptr<ARDOUR::Route> > StrongRouteNotificationList;
+
+ typedef std::vector<boost::weak_ptr<ARDOUR::Stripable> > StripableNotificationList;
+ typedef boost::shared_ptr<StripableNotificationList> StripableNotificationListPtr;
+ typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > StrongStripableNotificationList;
}
#endif /* __ardour_control_protocol_types_h__ */
diff --git a/libs/surfaces/control_protocol/wscript b/libs/surfaces/control_protocol/wscript
index b3fcf23..6a11cad 100644
--- a/libs/surfaces/control_protocol/wscript
+++ b/libs/surfaces/control_protocol/wscript
@@ -32,7 +32,8 @@ def build(bld):
obj.includes = ['.', './control_protocol']
obj.name = 'libardour_cp'
obj.target = 'ardourcp'
- obj.use = 'libardour'
+ obj.use = 'libardour libpbd'
+ obj.uselib = 'GLIBMM SIGCPP XML'
obj.install_path = bld.env['LIBDIR']
def shutdown():
diff --git a/libs/surfaces/faderport/faderport.cc b/libs/surfaces/faderport/faderport.cc
index 5f5a1a1..0f32b09 100644
--- a/libs/surfaces/faderport/faderport.cc
+++ b/libs/surfaces/faderport/faderport.cc
@@ -26,7 +26,6 @@
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
-#include "pbd/controllable_descriptor.h"
#include "pbd/error.h"
#include "pbd/failed_constructor.h"
#include "pbd/file_utils.h"
@@ -40,6 +39,7 @@
#include "ardour/audioengine.h"
#include "ardour/amp.h"
#include "ardour/bundle.h"
+#include "ardour/controllable_descriptor.h"
#include "ardour/debug.h"
#include "ardour/filesystem_paths.h"
#include "ardour/midi_port.h"
@@ -47,7 +47,8 @@
#include "ardour/monitor_processor.h"
#include "ardour/profile.h"
#include "ardour/rc_configuration.h"
-#include "ardour/route.h"
+#include "ardour/record_enable_control.h"
+#include "ardour/stripable.h"
#include "ardour/session.h"
#include "ardour/session_configuration.h"
#include "ardour/track.h"
@@ -60,7 +61,7 @@ using namespace PBD;
using namespace Glib;
using namespace std;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/abstract_ui.cc" // instantiate template
@@ -108,7 +109,7 @@ FaderPort::FaderPort (Session& s)
);
- TrackSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::gui_track_selection_changed, this, _1), this);
+ StripableSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::gui_track_selection_changed, this, _1), this);
/* Catch port connections and disconnections */
ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::connection_handler, this, _1, _2, _3, _4, _5), this);
@@ -372,8 +373,8 @@ FaderPort::button_handler (MIDI::Parser &, MIDI::EventTwoBytes* tb)
break;
case FaderTouch:
fader_is_touched = tb->value;
- if (_current_route) {
- boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+ if (_current_stripable) {
+ boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
if (gain) {
framepos_t now = session->engine().sample_time();
if (tb->value) {
@@ -443,7 +444,7 @@ FaderPort::encoder_handler (MIDI::Parser &, MIDI::pitchbend_t pb)
last_good_encoder_delta = delta;
}
- if (_current_route) {
+ if (_current_stripable) {
ButtonState trim_modifier;
ButtonState width_modifier;
@@ -457,7 +458,7 @@ FaderPort::encoder_handler (MIDI::Parser &, MIDI::pitchbend_t pb)
}
if ((button_state & trim_modifier) == trim_modifier ) { // mod+encoder = input trim
- boost::shared_ptr<AutomationControl> trim = _current_route->trim()->gain_control ();
+ boost::shared_ptr<AutomationControl> trim = _current_stripable->trim_control ();
if (trim) {
float val = trim->get_user(); //for gain elements, the "user" value is in dB
val += delta;
@@ -498,16 +499,16 @@ FaderPort::fader_handler (MIDI::Parser &, MIDI::EventTwoBytes* tb)
}
if (was_fader) {
- if (_current_route) {
- boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+ if (_current_stripable) {
+ boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
if (gain) {
int ival = (fader_msb << 7) | fader_lsb;
float val = gain->interface_to_internal (ival/16384.0);
/* even though the faderport only controls a
- single route at a time, allow the fader to
+ single stripable at a time, allow the fader to
modify the group, if appropriate.
*/
- _current_route->set_gain (val, Controllable::UseGroup);
+ _current_stripable->gain_control()->set_value (val, Controllable::UseGroup);
}
}
}
@@ -601,11 +602,11 @@ FaderPort::set_active (bool yn)
bool
FaderPort::periodic ()
{
- if (!_current_route) {
+ if (!_current_stripable) {
return true;
}
- ARDOUR::AutoState gain_state = _current_route->gain_control()->automation_state();
+ ARDOUR::AutoState gain_state = _current_stripable->gain_control()->automation_state();
if (gain_state == ARDOUR::Touch || gain_state == ARDOUR::Play) {
map_gain ();
@@ -652,10 +653,10 @@ FaderPort::close ()
port_connection.disconnect ();
blink_connection.disconnect ();
selection_connection.disconnect ();
- route_connections.drop_connections ();
+ stripable_connections.drop_connections ();
#if 0
- route_connections.drop_connections ();
+ stripable_connections.drop_connections ();
#endif
}
@@ -1104,68 +1105,67 @@ FaderPort::Button::get_state () const
}
void
-FaderPort::gui_track_selection_changed (RouteNotificationListPtr routes)
+FaderPort::gui_track_selection_changed (StripableNotificationListPtr stripables)
{
- boost::shared_ptr<Route> r;
+ boost::shared_ptr<Stripable> r;
- if (!routes->empty()) {
- r = routes->front().lock();
+ if (!stripables->empty()) {
+ r = stripables->front().lock();
}
- set_current_route (r);
+ set_current_stripable (r);
}
void
-FaderPort::drop_current_route ()
+FaderPort::drop_current_stripable ()
{
- if (_current_route) {
- if (_current_route == session->monitor_out()) {
- set_current_route (session->master_out());
+ if (_current_stripable) {
+ if (_current_stripable == session->monitor_out()) {
+ set_current_stripable (session->master_out());
} else {
- set_current_route (boost::shared_ptr<Route>());
+ set_current_stripable (boost::shared_ptr<Stripable>());
}
}
}
void
-FaderPort::set_current_route (boost::shared_ptr<Route> r)
+FaderPort::set_current_stripable (boost::shared_ptr<Stripable> r)
{
- route_connections.drop_connections ();
+ stripable_connections.drop_connections ();
- _current_route = r;
+ _current_stripable = r;
/* turn this off. It will be turned on back on in use_master() or
use_monitor() as appropriate.
*/
get_button(Output).set_led_state (_output_port, false);
- if (_current_route) {
- _current_route->DropReferences.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::drop_current_route, this), this);
+ if (_current_stripable) {
+ _current_stripable->DropReferences.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::drop_current_stripable, this), this);
- _current_route->mute_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_mute, this), this);
- _current_route->solo_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_solo, this), this);
- _current_route->listen_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_listen, this), this);
+ _current_stripable->mute_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_mute, this), this);
+ _current_stripable->solo_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_solo, this), this);
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_route);
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_stripable);
if (t) {
- t->RecordEnableChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_recenable, this), this);
+ t->rec_enable_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_recenable, this), this);
}
- boost::shared_ptr<AutomationControl> control = _current_route->gain_control ();
+ boost::shared_ptr<AutomationControl> control = _current_stripable->gain_control ();
if (control) {
- control->Changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_gain, this), this);
- control->alist()->automation_state_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_auto, this), this);
+ control->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_gain, this), this);
+ control->alist()->automation_state_changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_auto, this), this);
}
- boost::shared_ptr<MonitorProcessor> mp = _current_route->monitor_control();
+ boost::shared_ptr<MonitorProcessor> mp = _current_stripable->monitor_control();
if (mp) {
- mp->cut_control()->Changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_cut, this), this);
+ mp->cut_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_cut, this), this);
}
}
//ToDo: subscribe to the fader automation modes so we can light the LEDs
- map_route_state ();
+ map_stripable_state ();
}
void
@@ -1175,7 +1175,7 @@ FaderPort::map_auto ()
* the Off button, because this will disable the fader.
*/
- boost::shared_ptr<AutomationControl> control = _current_route->gain_control ();
+ boost::shared_ptr<AutomationControl> control = _current_stripable->gain_control ();
const AutoState as = control->automation_state ();
switch (as) {
@@ -1207,7 +1207,7 @@ FaderPort::map_auto ()
void
FaderPort::map_cut ()
{
- boost::shared_ptr<MonitorProcessor> mp = _current_route->monitor_control();
+ boost::shared_ptr<MonitorProcessor> mp = _current_stripable->monitor_control();
if (mp) {
bool yn = mp->cut_all ();
@@ -1224,11 +1224,11 @@ FaderPort::map_cut ()
void
FaderPort::map_mute ()
{
- if (_current_route) {
- if (_current_route->muted()) {
+ if (_current_stripable) {
+ if (_current_stripable->mute_control()->muted()) {
stop_blinking (Mute);
get_button (Mute).set_led_state (_output_port, true);
- } else if (_current_route->muted_by_others()) {
+ } else if (_current_stripable->mute_control()->muted_by_others_soloing () || _current_stripable->mute_control()->muted_by_masters()) {
start_blinking (Mute);
} else {
stop_blinking (Mute);
@@ -1241,18 +1241,8 @@ FaderPort::map_mute ()
void
FaderPort::map_solo ()
{
- if (_current_route) {
- get_button (Solo).set_led_state (_output_port, _current_route->soloed() || _current_route->listening_via_monitor());
- } else {
- get_button (Solo).set_led_state (_output_port, false);
- }
-}
-
-void
-FaderPort::map_listen ()
-{
- if (_current_route) {
- get_button (Solo).set_led_state (_output_port, _current_route->listening_via_monitor());
+ if (_current_stripable) {
+ get_button (Solo).set_led_state (_output_port, _current_stripable->solo_control()->soloed());
} else {
get_button (Solo).set_led_state (_output_port, false);
}
@@ -1261,9 +1251,9 @@ FaderPort::map_listen ()
void
FaderPort::map_recenable ()
{
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_route);
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_stripable);
if (t) {
- get_button (Rec).set_led_state (_output_port, t->record_enabled());
+ get_button (Rec).set_led_state (_output_port, t->rec_enable_control()->get_value());
} else {
get_button (Rec).set_led_state (_output_port, false);
}
@@ -1277,11 +1267,11 @@ FaderPort::map_gain ()
return;
}
- if (!_current_route) {
+ if (!_current_stripable) {
return;
}
- boost::shared_ptr<AutomationControl> control = _current_route->gain_control ();
+ boost::shared_ptr<AutomationControl> control = _current_stripable->gain_control ();
double val;
if (!control) {
@@ -1320,9 +1310,9 @@ FaderPort::map_gain ()
}
void
-FaderPort::map_route_state ()
+FaderPort::map_stripable_state ()
{
- if (!_current_route) {
+ if (!_current_stripable) {
stop_blinking (Mute);
stop_blinking (Solo);
get_button (Rec).set_led_state (_output_port, false);
@@ -1332,7 +1322,7 @@ FaderPort::map_route_state ()
map_gain ();
map_auto ();
- if (_current_route == session->monitor_out()) {
+ if (_current_stripable == session->monitor_out()) {
map_cut ();
} else {
map_mute ();
diff --git a/libs/surfaces/faderport/faderport.h b/libs/surfaces/faderport/faderport.h
index 2706f91..4d5c970 100644
--- a/libs/surfaces/faderport/faderport.h
+++ b/libs/surfaces/faderport/faderport.h
@@ -164,9 +164,9 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq
std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
private:
- boost::shared_ptr<ARDOUR::Route> _current_route;
- boost::weak_ptr<ARDOUR::Route> pre_master_route;
- boost::weak_ptr<ARDOUR::Route> pre_monitor_route;
+ boost::shared_ptr<ARDOUR::Stripable> _current_stripable;
+ boost::weak_ptr<ARDOUR::Stripable> pre_master_stripable;
+ boost::weak_ptr<ARDOUR::Stripable> pre_monitor_stripable;
boost::shared_ptr<ARDOUR::AsyncMIDIPort> _input_port;
boost::shared_ptr<ARDOUR::AsyncMIDIPort> _output_port;
@@ -294,17 +294,16 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq
void start_blinking (ButtonID);
void stop_blinking (ButtonID);
- void set_current_route (boost::shared_ptr<ARDOUR::Route>);
- void drop_current_route ();
+ void set_current_stripable (boost::shared_ptr<ARDOUR::Stripable>);
+ void drop_current_stripable ();
void use_master ();
void use_monitor ();
- void gui_track_selection_changed (ARDOUR::RouteNotificationListPtr);
+ void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr);
PBD::ScopedConnection selection_connection;
- PBD::ScopedConnectionList route_connections;
+ PBD::ScopedConnectionList stripable_connections;
- void map_route_state ();
+ void map_stripable_state ();
void map_solo ();
- void map_listen ();
void map_mute ();
bool rec_enable_state;
void map_recenable ();
diff --git a/libs/surfaces/faderport/gui.cc b/libs/surfaces/faderport/gui.cc
index f56512e..160ba0e 100644
--- a/libs/surfaces/faderport/gui.cc
+++ b/libs/surfaces/faderport/gui.cc
@@ -25,7 +25,7 @@
#include "pbd/strsplit.h"
#include "pbd/file_utils.h"
-#include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/gtk_ui.h"
#include "gtkmm2ext/gui_thread.h"
#include "gtkmm2ext/utils.h"
@@ -36,7 +36,7 @@
#include "faderport.h"
#include "gui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
@@ -357,12 +357,14 @@ FPGUI::build_available_action_menu ()
vector<string> labels;
vector<string> tooltips;
vector<string> keys;
- vector<AccelKey> bindings;
+ vector<Glib::RefPtr<Gtk::Action> > actions;
+
+ Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
+
typedef std::map<string,TreeIter> NodeMap;
NodeMap nodes;
NodeMap::iterator r;
- ActionManager::get_all_actions (labels, paths, tooltips, keys, bindings);
vector<string>::iterator k;
vector<string>::iterator p;
@@ -517,7 +519,7 @@ FPGUI::build_mix_action_combo (Gtk::ComboBox& cb, FaderPort::ButtonState bs)
{
vector<pair<string,string> > actions;
- actions.push_back (make_pair (string (_("Toggle Editor & Mixer Windows")), string (X_("Common/toggle-editor-mixer"))));
+ actions.push_back (make_pair (string (_("Toggle Editor & Mixer Windows")), string (X_("Common/toggle-editor-and-mixer"))));
actions.push_back (make_pair (string (_("Show/Hide Mixer list")), string (X_("Common/ToggleMixerList"))));
actions.push_back (make_pair (string("Toggle Meterbridge"), string(X_("Common/toggle-meterbridge"))));
actions.push_back (make_pair (string (_("Show/Hide Editor mixer strip")), string (X_("Editor/show-editor-mixer"))));
diff --git a/libs/surfaces/faderport/i18n.h b/libs/surfaces/faderport/i18n.h
deleted file mode 100644
index dcbbfcf..0000000
--- a/libs/surfaces/faderport/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text) dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/surfaces/faderport/operations.cc b/libs/surfaces/faderport/operations.cc
index bb72794..ce6bb3e 100644
--- a/libs/surfaces/faderport/operations.cc
+++ b/libs/surfaces/faderport/operations.cc
@@ -22,6 +22,7 @@
#include "ardour/pannable.h"
#include "ardour/plugin_insert.h"
#include "ardour/rc_configuration.h"
+#include "ardour/record_enable_control.h"
#include "ardour/session.h"
#include "ardour/track.h"
#include "ardour/types.h"
@@ -60,8 +61,8 @@ FaderPort::right ()
void
FaderPort::read ()
{
- if (_current_route) {
- boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+ if (_current_stripable) {
+ boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
if (gain) {
gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Play );
}
@@ -71,8 +72,8 @@ FaderPort::read ()
void
FaderPort::write ()
{
- if (_current_route) {
- boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+ if (_current_stripable) {
+ boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
if (gain) {
gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Write );
}
@@ -82,8 +83,8 @@ FaderPort::write ()
void
FaderPort::touch ()
{
- if (_current_route) {
- boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+ if (_current_stripable) {
+ boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
if (gain) {
gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Touch );
}
@@ -93,8 +94,8 @@ FaderPort::touch ()
void
FaderPort::off ()
{
- if (_current_route) {
- boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+ if (_current_stripable) {
+ boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
if (gain) {
gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Off );
}
@@ -119,72 +120,60 @@ FaderPort::redo ()
void
FaderPort::mute ()
{
- if (!_current_route) {
+ if (!_current_stripable) {
return;
}
- if (_current_route == session->monitor_out()) {
- boost::shared_ptr<MonitorProcessor> mp = _current_route->monitor_control();
+ if (_current_stripable == session->monitor_out()) {
+ boost::shared_ptr<MonitorProcessor> mp = _current_stripable->monitor_control();
mp->set_cut_all (!mp->cut_all());
return;
}
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (_current_route);
- session->set_mute (rl, !_current_route->muted());
+ _current_stripable->mute_control()->set_value (!_current_stripable->mute_control()->muted(), PBD::Controllable::UseGroup);
}
void
FaderPort::solo ()
{
- if (!_current_route) {
+ if (!_current_stripable) {
return;
}
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (_current_route);
-
- if (Config->get_solo_control_is_listen_control()) {
- session->set_listen (rl, !_current_route->listening_via_monitor());
- } else {
- session->set_solo (rl, !_current_route->soloed());
- }
+ _current_stripable->solo_control()->set_value (_current_stripable->solo_control()->soloed(), PBD::Controllable::UseGroup);
}
void
FaderPort::rec_enable ()
{
- if (!_current_route) {
+ if (!_current_stripable) {
return;
}
- boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_current_route);
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_current_stripable);
if (!t) {
return;
}
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (_current_route);
-
- session->set_record_enabled (rl, !t->record_enabled());
+ t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup);
}
void
FaderPort::use_master ()
{
- boost::shared_ptr<Route> r = session->master_out();
+ boost::shared_ptr<Stripable> r = session->master_out();
if (r) {
- if (_current_route == r) {
- r = pre_master_route.lock();
- set_current_route (r);
+ if (_current_stripable == r) {
+ r = pre_master_stripable.lock();
+ set_current_stripable (r);
get_button(Output).set_led_state (_output_port, false);
blinkers.remove (Output);
} else {
- if (_current_route != session->master_out() && _current_route != session->monitor_out()) {
- pre_master_route = boost::weak_ptr<Route> (_current_route);
+ if (_current_stripable != session->master_out() && _current_stripable != session->monitor_out()) {
+ pre_master_stripable = boost::weak_ptr<Stripable> (_current_stripable);
}
- set_current_route (r);
+ set_current_stripable (r);
get_button(Output).set_led_state (_output_port, true);
blinkers.remove (Output);
}
@@ -194,19 +183,19 @@ FaderPort::use_master ()
void
FaderPort::use_monitor ()
{
- boost::shared_ptr<Route> r = session->monitor_out();
+ boost::shared_ptr<Stripable> r = session->monitor_out();
if (r) {
- if (_current_route == r) {
- r = pre_monitor_route.lock();
- set_current_route (r);
+ if (_current_stripable == r) {
+ r = pre_monitor_stripable.lock();
+ set_current_stripable (r);
get_button(Output).set_led_state (_output_port, false);
blinkers.remove (Output);
} else {
- if (_current_route != session->master_out() && _current_route != session->monitor_out()) {
- pre_monitor_route = boost::weak_ptr<Route> (_current_route);
+ if (_current_stripable != session->master_out() && _current_stripable != session->monitor_out()) {
+ pre_monitor_stripable = boost::weak_ptr<Stripable> (_current_stripable);
}
- set_current_route (r);
+ set_current_stripable (r);
get_button(Output).set_led_state (_output_port, true);
blinkers.push_back (Output);
}
@@ -217,11 +206,17 @@ FaderPort::use_monitor ()
void
FaderPort::ardour_pan_azimuth (int delta)
{
- if (!_current_route) {
+ if (!_current_stripable) {
+ return;
+ }
+
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_current_stripable);
+
+ if (!r) {
return;
}
- boost::shared_ptr<Pannable> pannable = _current_route->pannable ();
+ boost::shared_ptr<Pannable> pannable = r->pannable ();
if (!pannable) {
return;
@@ -240,11 +235,17 @@ FaderPort::ardour_pan_azimuth (int delta)
void
FaderPort::ardour_pan_width(int delta)
{
- if (!_current_route) {
+ if (!_current_stripable) {
return;
}
- boost::shared_ptr<Pannable> pannable = _current_route->pannable ();
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_current_stripable);
+
+ if (!r) {
+ return;
+ }
+
+ boost::shared_ptr<Pannable> pannable = r->pannable ();
if (!pannable) {
return;
@@ -263,12 +264,18 @@ void
FaderPort::mixbus_pan (int delta)
{
#ifdef MIXBUS
- if (!_current_route) {
+ if (!_current_stripable) {
return;
}
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_current_stripable);
+
+ if (!r) {
+ return;
+ }
+
const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
- boost::shared_ptr<ARDOUR::PluginInsert> plug = _current_route->ch_post();
+ boost::shared_ptr<ARDOUR::PluginInsert> plug = r->ch_post();
if (!plug) {
return;
diff --git a/libs/surfaces/faderport/wscript b/libs/surfaces/faderport/wscript
index a0c3a2e..b13796d 100644
--- a/libs/surfaces/faderport/wscript
+++ b/libs/surfaces/faderport/wscript
@@ -26,7 +26,7 @@ def build(bld):
obj.includes = [ '.', './faderport']
obj.name = 'libardour_faderport'
obj.target = 'ardour_faderport'
- obj.uselib = 'GTKMM GTK GDK'
+ obj.uselib = 'GTKMM GTK GDK XML'
obj.use = 'libardour libardour_cp libgtkmm2ext libpbd'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
diff --git a/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc b/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc
index f093287..5799ab6 100644
--- a/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc
+++ b/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc
@@ -67,7 +67,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/abstract_ui.cc"
diff --git a/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj b/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj
index 860b5c4..189451d 100644
--- a/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj
+++ b/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -328,7 +328,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
index e319f65..d14a9ca 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
@@ -25,7 +25,6 @@
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
-#include "pbd/controllable_descriptor.h"
#include "pbd/error.h"
#include "pbd/failed_constructor.h"
#include "pbd/file_utils.h"
@@ -37,9 +36,9 @@
#include "ardour/async_midi_port.h"
#include "ardour/audioengine.h"
#include "ardour/audioengine.h"
+#include "ardour/controllable_descriptor.h"
#include "ardour/filesystem_paths.h"
#include "ardour/session.h"
-#include "ardour/route.h"
#include "ardour/midi_ui.h"
#include "ardour/rc_configuration.h"
#include "ardour/midiport_manager.h"
@@ -54,7 +53,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace std;
-#include "i18n.h"
+#include "pbd/i18n.h"
#define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */
@@ -95,7 +94,7 @@ GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s)
/* this one is cross-thread */
- Route::RemoteControlIDChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&GenericMidiControlProtocol::reset_controllables, this), midi_ui_context());
+ PresentationInfo::Change.connect (*this, MISSING_INVALIDATOR, boost::bind (&GenericMidiControlProtocol::reset_controllables, this), midi_ui_context());
/* Catch port connections and disconnections (cross-thread) */
ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR,
@@ -168,7 +167,7 @@ GenericMidiControlProtocol::reload_maps ()
MapInfo mi;
- XMLProperty* prop = tree.root()->property ("name");
+ XMLProperty const * prop = tree.root()->property ("name");
if (!prop) {
continue;
@@ -329,9 +328,11 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ) {
ptmp = i;
++ptmp;
- if (((*i)->first)->get_controllable() == c) {
- (*i)->second.disconnect();
- delete (*i)->first;
+ if (((*i)->mc)->get_controllable() == c) {
+ if ((*i)->own_mc) {
+ delete (*i)->mc;
+ }
+ (*i)->connection.disconnect();
delete *i;
pending_controllables.erase (i);
}
@@ -340,6 +341,7 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
}
MIDIControllable* mc = 0;
+ bool own_mc = false;
for (MIDIControllables::iterator i = controllables.begin(); i != controllables.end(); ++i) {
if ((*i)->get_controllable() && ((*i)->get_controllable()->id() == c->id())) {
@@ -350,14 +352,14 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
if (!mc) {
mc = new MIDIControllable (this, *_input_port->parser(), *c, false);
+ own_mc = true;
}
{
Glib::Threads::Mutex::Lock lm (pending_lock);
- MIDIPendingControllable* element = new MIDIPendingControllable;
- element->first = mc;
- c->LearningFinished.connect_same_thread (element->second, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc));
+ MIDIPendingControllable* element = new MIDIPendingControllable (mc, own_mc);
+ c->LearningFinished.connect_same_thread (element->connection, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc));
pending_controllables.push_back (element);
}
@@ -377,8 +379,8 @@ GenericMidiControlProtocol::learning_stopped (MIDIControllable* mc)
tmp = i;
++tmp;
- if ( (*i)->first == mc) {
- (*i)->second.disconnect();
+ if ( (*i)->mc == mc) {
+ (*i)->connection.disconnect();
delete *i;
pending_controllables.erase(i);
}
@@ -401,10 +403,10 @@ GenericMidiControlProtocol::stop_learning (Controllable* c)
*/
for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) {
- if (((*i)->first)->get_controllable() == c) {
- (*i)->first->stop_learning ();
- dptr = (*i)->first;
- (*i)->second.disconnect();
+ if (((*i)->mc)->get_controllable() == c) {
+ (*i)->mc->stop_learning ();
+ dptr = (*i)->mc;
+ (*i)->connection.disconnect();
delete *i;
pending_controllables.erase (i);
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
index a453716..d3709c5 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
@@ -30,11 +30,11 @@
namespace PBD {
class Controllable;
- class ControllableDescriptor;
}
namespace ARDOUR {
class AsyncMIDIPort;
+ class ControllableDescriptor;
class MidiPort;
class Session;
}
@@ -63,7 +63,7 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
int set_feedback (bool yn);
bool get_feedback () const;
- boost::shared_ptr<PBD::Controllable> lookup_controllable (const PBD::ControllableDescriptor&) const;
+ boost::shared_ptr<PBD::Controllable> lookup_controllable (const ARDOUR::ControllableDescriptor&) const;
XMLNode& get_state ();
int set_state (const XMLNode&, int version);
@@ -125,7 +125,16 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
typedef std::list<MIDIAction*> MIDIActions;
MIDIActions actions;
- typedef std::pair<MIDIControllable*,PBD::ScopedConnection> MIDIPendingControllable;
+ struct MIDIPendingControllable {
+ MIDIControllable* mc;
+ bool own_mc;
+ PBD::ScopedConnection connection;
+
+ MIDIPendingControllable (MIDIControllable* c, bool omc)
+ : mc (c)
+ , own_mc (omc)
+ {}
+ };
typedef std::list<MIDIPendingControllable* > MIDIPendingControllables;
MIDIPendingControllables pending_controllables;
Glib::Threads::Mutex controllables_lock;
diff --git a/libs/surfaces/generic_midi/gmcp_gui.cc b/libs/surfaces/generic_midi/gmcp_gui.cc
index 8e861b3..3c2479b 100644
--- a/libs/surfaces/generic_midi/gmcp_gui.cc
+++ b/libs/surfaces/generic_midi/gmcp_gui.cc
@@ -41,7 +41,7 @@
#include "generic_midi_control_protocol.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
class GMCPGUI : public Gtk::VBox
{
diff --git a/libs/surfaces/generic_midi/i18n.h b/libs/surfaces/generic_midi/i18n.h
deleted file mode 100644
index dcbbfcf..0000000
--- a/libs/surfaces/generic_midi/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text) dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index 1051503..b42c9f7 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -23,7 +23,6 @@
#include <iostream>
#include "pbd/error.h"
-#include "pbd/controllable_descriptor.h"
#include "pbd/xml++.h"
#include "pbd/stacktrace.h"
#include "pbd/compose.h"
@@ -34,6 +33,7 @@
#include "ardour/async_midi_port.h"
#include "ardour/automation_control.h"
+#include "ardour/controllable_descriptor.h"
#include "ardour/midi_ui.h"
#include "ardour/utils.h"
#include "ardour/debug.h"
@@ -173,9 +173,9 @@ MIDIControllable::stop_learning ()
int
MIDIControllable::control_to_midi (float val)
{
- if (controllable->is_gain_like()) {
- return gain_to_slider_position (val) * max_value_for_type ();
- }
+ if (controllable->is_gain_like()) {
+ return gain_to_slider_position (val) * max_value_for_type ();
+ }
float control_min = controllable->lower ();
float control_max = controllable->upper ();
diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h
index 8c14856..ebae2e9 100644
--- a/libs/surfaces/generic_midi/midicontrollable.h
+++ b/libs/surfaces/generic_midi/midicontrollable.h
@@ -30,7 +30,7 @@
#include "ardour/types.h"
-namespace PBD {
+namespace ARDOUR {
class ControllableDescriptor;
}
@@ -91,7 +91,7 @@ class MIDIControllable : public PBD::Stateful
void set_controllable (PBD::Controllable*);
const std::string& current_uri() const { return _current_uri; }
- PBD::ControllableDescriptor& descriptor() const { return *_descriptor; }
+ ARDOUR::ControllableDescriptor& descriptor() const { return *_descriptor; }
std::string control_description() const { return _control_description; }
@@ -116,7 +116,7 @@ class MIDIControllable : public PBD::Stateful
GenericMidiControlProtocol* _surface;
PBD::Controllable* controllable;
- PBD::ControllableDescriptor* _descriptor;
+ ARDOUR::ControllableDescriptor* _descriptor;
std::string _current_uri;
MIDI::Parser& _parser;
bool setting;
diff --git a/libs/surfaces/generic_midi/midifunction.cc b/libs/surfaces/generic_midi/midifunction.cc
index 1f3535f..3a60f53 100644
--- a/libs/surfaces/generic_midi/midifunction.cc
+++ b/libs/surfaces/generic_midi/midifunction.cc
@@ -167,7 +167,8 @@ MIDIFunction::execute ()
if (!_argument.empty()) {
uint32_t rid;
sscanf (_argument.c_str(), "%d", &rid);
- _ui->SetRouteSelection (rid);
+ // XX fix me ... need to get stripable, not RID
+ //_ui->toggle_selection (rid, ARDOUR::PresentationInfo::Flag (ARDOUR::PresentationInfo::Route|ARDOUR::PresentationInfo::VCA));
DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Function: SetRouteSelection = %1\n", rid));
}
break;
diff --git a/libs/surfaces/generic_midi/wscript b/libs/surfaces/generic_midi/wscript
index 39a6814..167e1dd 100644
--- a/libs/surfaces/generic_midi/wscript
+++ b/libs/surfaces/generic_midi/wscript
@@ -29,7 +29,7 @@ def build(bld):
obj.includes = [ '.', './generic_midi']
obj.name = 'libardour_generic_midi'
obj.target = 'ardour_generic_midi'
- obj.uselib = 'GTKMM GTK GDK'
+ obj.uselib = 'GTKMM GTK GDK XML'
obj.use = 'libardour libardour_cp libgtkmm2ext libpbd'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
diff --git a/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj b/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj
index a7ceed5..02e74cd 100644
--- a/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj
+++ b/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -456,7 +456,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/surfaces/mackie/device_info.cc b/libs/surfaces/mackie/device_info.cc
index d46937a..dfac991 100644
--- a/libs/surfaces/mackie/device_info.cc
+++ b/libs/surfaces/mackie/device_info.cc
@@ -31,7 +31,7 @@
#include "device_info.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
diff --git a/libs/surfaces/mackie/device_profile.cc b/libs/surfaces/mackie/device_profile.cc
index f67aa3c..ca3f146 100644
--- a/libs/surfaces/mackie/device_profile.cc
+++ b/libs/surfaces/mackie/device_profile.cc
@@ -33,7 +33,7 @@
#include "mackie_control_protocol.h"
#include "device_profile.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace PBD;
using namespace ARDOUR;
diff --git a/libs/surfaces/mackie/gui.cc b/libs/surfaces/mackie/gui.cc
index 5d9208b..0678619 100644
--- a/libs/surfaces/mackie/gui.cc
+++ b/libs/surfaces/mackie/gui.cc
@@ -34,6 +34,7 @@
#include "pbd/stacktrace.h"
#include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
#include "gtkmm2ext/gui_thread.h"
#include "gtkmm2ext/utils.h"
@@ -47,7 +48,7 @@
#include "surface.h"
#include "surface_port.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
@@ -451,12 +452,13 @@ MackieControlProtocolGUI::build_available_action_menu ()
vector<string> labels;
vector<string> tooltips;
vector<string> keys;
- vector<AccelKey> bindings;
+ vector<Glib::RefPtr<Gtk::Action> > actions;
+
typedef std::map<string,TreeIter> NodeMap;
NodeMap nodes;
NodeMap::iterator r;
- ActionManager::get_all_actions (labels, paths, tooltips, keys, bindings);
+ Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
vector<string>::iterator k;
vector<string>::iterator p;
@@ -466,8 +468,9 @@ MackieControlProtocolGUI::build_available_action_menu ()
available_action_model->clear ();
/* Because there are button bindings built in that are not
- in the key binding map, there needs to be a way to undo
- a profile edit. */
+ in the key binding map, there needs to be a way to undo
+ a profile edit.
+ */
TreeIter rowp;
TreeModel::Row parent;
rowp = available_action_model->append();
diff --git a/libs/surfaces/mackie/gui.h b/libs/surfaces/mackie/gui.h
index 754c4ac..15d2666 100644
--- a/libs/surfaces/mackie/gui.h
+++ b/libs/surfaces/mackie/gui.h
@@ -33,7 +33,7 @@ namespace Gtk {
#include "button.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ArdourSurface {
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index a898746..2ea61cc 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -52,6 +52,7 @@
#include "ardour/panner.h"
#include "ardour/panner_shell.h"
#include "ardour/profile.h"
+#include "ardour/record_enable_control.h"
#include "ardour/route.h"
#include "ardour/route_group.h"
#include "ardour/session.h"
@@ -59,6 +60,7 @@
#include "ardour/track.h"
#include "ardour/types.h"
#include "ardour/audioengine.h"
+#include "ardour/vca_manager.h"
#include "mackie_control_protocol.h"
@@ -81,7 +83,7 @@ using namespace Glib;
using namespace ArdourSurface;
using namespace Mackie;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/abstract_ui.cc" // instantiate template
@@ -136,7 +138,7 @@ MackieControlProtocol::MackieControlProtocol (Session& session)
_last_bank[i] = 0;
}
- TrackSelectionChanged.connect (gui_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::gui_track_selection_changed, this, _1, true), this);
+ PresentationInfo::Change.connect (gui_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_presentation_info_changed, this), this);
_instance = this;
@@ -210,7 +212,6 @@ MackieControlProtocol::ping_devices ()
}
// go to the previous track.
-// Assume that get_sorted_routes().size() > route_table.size()
void
MackieControlProtocol::prev_track()
{
@@ -220,145 +221,128 @@ MackieControlProtocol::prev_track()
}
// go to the next track.
-// Assume that get_sorted_routes().size() > route_table.size()
void
MackieControlProtocol::next_track()
{
- Sorted sorted = get_sorted_routes();
+ Sorted sorted = get_sorted_stripables();
if (_current_initial_bank + n_strips() < sorted.size()) {
switch_banks (_current_initial_bank + 1);
}
}
bool
-MackieControlProtocol::route_is_locked_to_strip (boost::shared_ptr<Route> r) const
+MackieControlProtocol::stripable_is_locked_to_strip (boost::shared_ptr<Stripable> r) const
{
for (Surfaces::const_iterator si = surfaces.begin(); si != surfaces.end(); ++si) {
- if ((*si)->route_is_locked_to_strip (r)) {
+ if ((*si)->stripable_is_locked_to_strip (r)) {
return true;
}
}
return false;
}
-// predicate for sort call in get_sorted_routes
-struct RouteByRemoteId
+// predicate for sort call in get_sorted_stripables
+struct StripableByPresentationOrder
{
- bool operator () (const boost::shared_ptr<Route> & a, const boost::shared_ptr<Route> & b) const
+ bool operator () (const boost::shared_ptr<Stripable> & a, const boost::shared_ptr<Stripable> & b) const
{
- return a->remote_control_id() < b->remote_control_id();
+ return a->presentation_info().order() < b->presentation_info().order();
}
- bool operator () (const Route & a, const Route & b) const
+ bool operator () (const Stripable & a, const Stripable & b) const
{
- return a.remote_control_id() < b.remote_control_id();
+ return a.presentation_info().order() < b.presentation_info().order();
}
- bool operator () (const Route * a, const Route * b) const
+ bool operator () (const Stripable * a, const Stripable * b) const
{
- return a->remote_control_id() < b->remote_control_id();
+ return a->presentation_info().order() < b->presentation_info().order();
}
};
MackieControlProtocol::Sorted
-MackieControlProtocol::get_sorted_routes()
+MackieControlProtocol::get_sorted_stripables()
{
Sorted sorted;
- // fetch all routes
- boost::shared_ptr<RouteList> routes = session->get_routes();
- set<uint32_t> remote_ids;
+ // fetch all stripables
+ StripableList stripables;
- // routes with remote_id 0 should never be added
- // TODO verify this with ardour devs
- // remote_ids.insert (0);
+ session->get_stripables (stripables);
- // sort in remote_id order, and exclude master, control and hidden routes
- // and any routes that are already set.
+ // sort in presentation order, and exclude master, control and hidden stripables
+ // and any stripables that are already set.
- for (RouteList::iterator it = routes->begin(); it != routes->end(); ++it) {
+ for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) {
- boost::shared_ptr<Route> route = *it;
+ boost::shared_ptr<Stripable> s = *it;
- if (remote_ids.find (route->remote_control_id()) != remote_ids.end()) {
- continue;
- }
-
- if (route->is_auditioner() || route->is_master() || route->is_monitor()) {
+ if (s->presentation_info().special()) {
continue;
}
/* don't include locked routes */
- if (route_is_locked_to_strip(route)) {
+ if (stripable_is_locked_to_strip (s)) {
continue;
}
switch (_view_mode) {
case Mixer:
- if (! is_hidden(route)) {
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ if (!s->presentation_info().hidden()) {
+ sorted.push_back (s);
}
break;
case AudioTracks:
- if (is_audio_track(route) && !is_hidden(route)) {
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ if (is_audio_track(s) && !s->presentation_info().hidden()) {
+ sorted.push_back (s);
}
break;
case Busses:
if (Profile->get_mixbus()) {
#ifdef MIXBUS
- if (route->mixbus()) {
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ if (s->mixbus()) {
+ sorted.push_back (s);
}
#endif
} else {
- if (!is_track(route) && !is_hidden(route)) {
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ if (!is_track(s) && !s->presentation_info().hidden()) {
+ sorted.push_back (s);
}
}
break;
case MidiTracks:
- if (is_midi_track(route) && !is_hidden(route)) {
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ if (is_midi_track(s) && !s->presentation_info().hidden()) {
+ sorted.push_back (s);
}
break;
case Plugins:
break;
case Auxes: // in ardour, for now aux and buss are same. for mixbus, "Busses" are mixbuses, "Auxes" are ardour buses
#ifdef MIXBUS
- if (!route->mixbus() && !is_track(route) && !is_hidden(route))
+ if (!s->mixbus() && !is_track() && !s->presentation_info().hidden())
#else
- if (!is_track(route) && !is_hidden(route))
+ if (!is_track(s) && !s->presentation_info().hidden())
#endif
{
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ sorted.push_back (s);
}
break;
case Hidden: // Show all the tracks we have hidden
- if (is_hidden(route)) {
+ if (s->presentation_info().hidden()) {
// maybe separate groups
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ sorted.push_back (s);
}
break;
case Selected: // For example: a group (this is USER)
- if (selected(route) && !is_hidden(route)) {
- sorted.push_back (route);
- remote_ids.insert (route->remote_control_id());
+ if (s->presentation_info().selected() && !s->presentation_info().hidden()) {
+ sorted.push_back (s);
}
break;
}
-
}
- sort (sorted.begin(), sorted.end(), RouteByRemoteId());
+ sort (sorted.begin(), sorted.end(), StripableByPresentationOrder());
return sorted;
}
@@ -390,60 +374,68 @@ MackieControlProtocol::switch_banks (uint32_t initial, bool force)
return 0;
}
- Sorted sorted = get_sorted_routes();
+ Sorted sorted = get_sorted_stripables();
uint32_t strip_cnt = n_strips (false); // do not include locked strips
// in this count
- if (initial >= sorted.size()) {
+ if (initial >= sorted.size() && !force) {
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("bank target %1 exceeds route range %2\n",
+ _current_initial_bank, sorted.size()));
/* too high, we can't get there */
return -1;
}
if (sorted.size() <= strip_cnt && _current_initial_bank == 0 && !force) {
- /* no banking - not enough routes to fill all strips and we're
+ /* no banking - not enough stripables to fill all strips and we're
* not at the first one.
*/
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("less routes (%1) than strips (%2) and we're at the end already (%3)\n",
+ sorted.size(), strip_cnt, _current_initial_bank));
return -1;
}
_current_initial_bank = initial;
_current_selected_track = -1;
- // Map current bank of routes onto each surface(+strip)
+ // Map current bank of stripables onto each surface(+strip)
if (_current_initial_bank < sorted.size()) {
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("switch to %1, %2, available routes %3 on %4 surfaces\n",
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("switch to %1, %2, available stripables %3 on %4 surfaces\n",
_current_initial_bank, strip_cnt, sorted.size(),
surfaces.size()));
- // link routes to strips
+ // link stripables to strips
Sorted::iterator r = sorted.begin() + _current_initial_bank;
for (Surfaces::iterator si = surfaces.begin(); si != surfaces.end(); ++si) {
- vector<boost::shared_ptr<Route> > routes;
+ vector<boost::shared_ptr<Stripable> > stripables;
uint32_t added = 0;
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("surface has %1 unlockedstrips\n", (*si)->n_strips (false)));
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("surface has %1 unlocked strips\n", (*si)->n_strips (false)));
for (; r != sorted.end() && added < (*si)->n_strips (false); ++r, ++added) {
- routes.push_back (*r);
+ stripables.push_back (*r);
}
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("give surface %1 routes\n", routes.size()));
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("give surface %1 stripables\n", stripables.size()));
- (*si)->map_routes (routes);
+ (*si)->map_stripables (stripables);
}
} else {
+ /* all strips need to be reset */
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("clear all strips, bank target %1 is outside route range %2\n",
+ _current_initial_bank, sorted.size()));
+ for (Surfaces::iterator si = surfaces.begin(); si != surfaces.end(); ++si) {
+ vector<boost::shared_ptr<Stripable> > stripables;
+ /* pass in an empty stripables list, so that all strips will be reset */
+ (*si)->map_stripables (stripables);
+ }
return -1;
}
- /* make sure selection is correct */
-
- _gui_track_selection_changed (&_last_selected_routes, false, false);
-
/* current bank has not been saved */
session->set_dirty();
@@ -650,7 +642,7 @@ MackieControlProtocol::device_ready ()
{
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("device ready init (active=%1)\n", active()));
update_surfaces ();
- set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Route>());
+ set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Stripable>());
set_flip_mode (Normal);
}
@@ -703,8 +695,10 @@ void
MackieControlProtocol::connect_session_signals()
{
// receive routes added
- session->RouteAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_route_added, this, _1), this);
- session->RouteAddedOrRemoved.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_route_added_or_removed, this), this);
+ session->RouteAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_routes_added, this, _1), this);
+ // receive VCAs added
+ session->vca_manager().VCAAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_vca_added, this, _1), this);
+
// receive record state toggled
session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_record_state_changed, this), this);
// receive transport state changed
@@ -717,12 +711,8 @@ MackieControlProtocol::connect_session_signals()
session->SoloActive.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_solo_active_changed, this, _1), this);
// make sure remote id changed signals reach here
- // see also notify_route_added
- Sorted sorted = get_sorted_routes();
-
- for (Sorted::iterator it = sorted.begin(); it != sorted.end(); ++it) {
- (*it)->RemoteControlIDChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_remote_id_changed, this), this);
- }
+ // see also notify_stripable_added
+ Sorted sorted = get_sorted_stripables();
}
void
@@ -867,7 +857,7 @@ MackieControlProtocol::create_surfaces ()
XMLNode* this_device = 0;
XMLNodeList const& devices = configuration_state->children();
for (XMLNodeList::const_iterator d = devices.begin(); d != devices.end(); ++d) {
- XMLProperty* prop = (*d)->property (X_("name"));
+ XMLProperty const * prop = (*d)->property (X_("name"));
if (prop && prop->value() == _device_info.name()) {
this_device = *d;
break;
@@ -965,7 +955,7 @@ MackieControlProtocol::close()
{
port_connection.disconnect ();
session_connections.drop_connections ();
- route_connections.drop_connections ();
+ stripable_connections.drop_connections ();
periodic_connection.disconnect ();
clear_surfaces();
@@ -1239,7 +1229,7 @@ void MackieControlProtocol::notify_parameter_changed (std::string const & p)
}
void
-MackieControlProtocol::notify_route_added_or_removed ()
+MackieControlProtocol::notify_stripable_removed ()
{
Glib::Threads::Mutex::Lock lm (surfaces_lock);
for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
@@ -1247,9 +1237,15 @@ MackieControlProtocol::notify_route_added_or_removed ()
}
}
-// RouteList is the set of routes that have just been added
void
-MackieControlProtocol::notify_route_added (ARDOUR::RouteList & rl)
+MackieControlProtocol::notify_vca_added (ARDOUR::VCAList& vl)
+{
+ refresh_current_bank ();
+}
+
+// RouteList is the set of Routes that have just been added
+void
+MackieControlProtocol::notify_routes_added (ARDOUR::RouteList & rl)
{
{
Glib::Threads::Mutex::Lock lm (surfaces_lock);
@@ -1274,13 +1270,6 @@ MackieControlProtocol::notify_route_added (ARDOUR::RouteList & rl)
refresh_current_bank();
// otherwise route added, but current bank needs no updating
-
- // make sure remote id changes in the new route are handled
- typedef ARDOUR::RouteList ARS;
-
- for (ARS::iterator it = rl.begin(); it != rl.end(); ++it) {
- (*it)->RemoteControlIDChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_remote_id_changed, this), this);
- }
}
void
@@ -1308,7 +1297,7 @@ MackieControlProtocol::notify_solo_active_changed (bool active)
}
void
-MackieControlProtocol::notify_remote_id_changed()
+MackieControlProtocol::notify_presentation_info_changed ()
{
{
Glib::Threads::Mutex::Lock lm (surfaces_lock);
@@ -1318,7 +1307,7 @@ MackieControlProtocol::notify_remote_id_changed()
}
}
- Sorted sorted = get_sorted_routes();
+ Sorted sorted = get_sorted_stripables();
uint32_t sz = n_strips();
// if a remote id has been moved off the end, we need to shift
@@ -1641,7 +1630,7 @@ MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port)
if (ioc & IO_IN) {
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("something happend on %1\n", port->name()));
+ // DEBUG_TRACE (DEBUG::MackieControl, string_compose ("something happend on %1\n", port->name()));
/* Devices using regular JACK MIDI ports will need to have
the x-thread FIFO drained to avoid burning endless CPU.
@@ -1658,7 +1647,7 @@ MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port)
}
}
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("data available on %1\n", port->name()));
+ // DEBUG_TRACE (DEBUG::MackieControl, string_compose ("data available on %1\n", port->name()));
framepos_t now = session->engine().sample_time();
port->parse (now);
}
@@ -1676,15 +1665,15 @@ MackieControlProtocol::clear_ports ()
}
void
-MackieControlProtocol::notify_subview_route_deleted ()
+MackieControlProtocol::notify_subview_stripable_deleted ()
{
/* return to global/mixer view */
- _subview_route.reset ();
+ _subview_stripable.reset ();
set_view_mode (Mixer);
}
bool
-MackieControlProtocol::subview_mode_would_be_ok (SubViewMode mode, boost::shared_ptr<Route> r)
+MackieControlProtocol::subview_mode_would_be_ok (SubViewMode mode, boost::shared_ptr<Stripable> r)
{
switch (mode) {
case None:
@@ -1737,16 +1726,18 @@ MackieControlProtocol::redisplay_subview_mode ()
}
int
-MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route> r)
+MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Stripable> r)
{
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("set subview mode %1 with stripable %2, current flip mode %3\n", sm, (r ? r->name() : string ("null")), _flip_mode));
+
if (_flip_mode != Normal) {
set_flip_mode (Normal);
}
- boost::shared_ptr<Route> old_route = _subview_route;
-
if (!subview_mode_would_be_ok (sm, r)) {
+ DEBUG_TRACE (DEBUG::MackieControl, "subview mode not OK\n");
+
if (r) {
Glib::Threads::Mutex::Lock lm (surfaces_lock);
@@ -1787,21 +1778,19 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
return -1;
}
- _subview_mode = sm;
+ boost::shared_ptr<Stripable> old_stripable = _subview_stripable;
- if (r) {
- /* retain _subview_route even if it is reset to null implicitly */
- _subview_route = r;
- }
+ _subview_mode = sm;
+ _subview_stripable = r;
- if (r != old_route) {
- subview_route_connections.drop_connections ();
+ if (_subview_stripable != old_stripable) {
+ subview_stripable_connections.drop_connections ();
- /* Catch the current subview route going away */
- if (_subview_route) {
- _subview_route->DropReferences.connect (subview_route_connections, MISSING_INVALIDATOR,
- boost::bind (&MackieControlProtocol::notify_subview_route_deleted, this),
- this);
+ /* Catch the current subview stripable going away */
+ if (_subview_stripable) {
+ _subview_stripable->DropReferences.connect (subview_stripable_connections, MISSING_INVALIDATOR,
+ boost::bind (&MackieControlProtocol::notify_subview_stripable_deleted, this),
+ this);
}
}
@@ -1872,7 +1861,7 @@ MackieControlProtocol::set_view_mode (ViewMode m)
}
/* leave subview mode, whatever it was */
- set_subview_mode (None, boost::shared_ptr<Route>());
+ set_subview_mode (None, boost::shared_ptr<Stripable>());
display_view_mode ();
}
@@ -1907,17 +1896,17 @@ MackieControlProtocol::set_flip_mode (FlipMode fm)
void
MackieControlProtocol::set_master_on_surface_strip (uint32_t surface, uint32_t strip_number)
{
- force_special_route_to_strip (session->master_out(), surface, strip_number);
+ force_special_stripable_to_strip (session->master_out(), surface, strip_number);
}
void
MackieControlProtocol::set_monitor_on_surface_strip (uint32_t surface, uint32_t strip_number)
{
- force_special_route_to_strip (session->monitor_out(), surface, strip_number);
+ force_special_stripable_to_strip (session->monitor_out(), surface, strip_number);
}
void
-MackieControlProtocol::force_special_route_to_strip (boost::shared_ptr<Route> r, uint32_t surface, uint32_t strip_number)
+MackieControlProtocol::force_special_stripable_to_strip (boost::shared_ptr<Stripable> r, uint32_t surface, uint32_t strip_number)
{
if (!r) {
return;
@@ -1929,7 +1918,7 @@ MackieControlProtocol::force_special_route_to_strip (boost::shared_ptr<Route> r,
if ((*s)->number() == surface) {
Strip* strip = (*s)->nth_strip (strip_number);
if (strip) {
- strip->set_route (session->master_out());
+ strip->set_stripable (session->master_out());
strip->lock_controls ();
}
}
@@ -1937,73 +1926,11 @@ MackieControlProtocol::force_special_route_to_strip (boost::shared_ptr<Route> r,
}
void
-MackieControlProtocol::gui_track_selection_changed (ARDOUR::RouteNotificationListPtr rl, bool save_list)
-{
- _gui_track_selection_changed (rl.get(), save_list, true);
-}
-
-void
-MackieControlProtocol::_gui_track_selection_changed (ARDOUR::RouteNotificationList* rl, bool save_list, bool gui_selection_did_change)
-{
- /* We need to keep a list of the most recently selected routes around,
- but we are not allowed to keep shared_ptr<Route> unless we want to
- handle the complexities of route deletion. So instead, the GUI sends
- us a notification using weak_ptr<Route>, which we keep a copy
- of. For efficiency's sake, however, we convert the weak_ptr's into
- shared_ptr<Route> before passing them to however many surfaces (and
- thus strips) that we have.
- */
-
- StrongRouteNotificationList srl;
-
- for (ARDOUR::RouteNotificationList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
- boost::shared_ptr<ARDOUR::Route> r = (*i).lock();
- if (r) {
- srl.push_back (r);
- }
- }
-
- {
- Glib::Threads::Mutex::Lock lm (surfaces_lock);
-
- for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
- (*s)->gui_selection_changed (srl);
- }
- }
-
- if (save_list) {
- _last_selected_routes = *rl;
- }
-
- if (gui_selection_did_change) {
-
- check_fader_automation_state ();
-
- /* note: this method is also called when we switch banks.
- * But ... we don't allow bank switching when in subview mode.
- *
- * so .. we only have to care about subview mode if the
- * GUI selection has changed.
- *
- * It is possible that first_selected_route() may return null if we
- * are no longer displaying/mapping that route. In that case,
- * we will exit subview mode. If first_selected_route() is
- * null, and subview mode is not None, then the first call to
- * set_subview_mode() will fail, and we will reset to None.
- */
-
- if (set_subview_mode (_subview_mode, first_selected_route())) {
- set_subview_mode (None, boost::shared_ptr<Route>());
- }
- }
-}
-
-void
MackieControlProtocol::check_fader_automation_state ()
{
fader_automation_connections.drop_connections ();
- boost::shared_ptr<Route> r = first_selected_route ();
+ boost::shared_ptr<Stripable> r = first_selected_stripable ();
if (!r) {
update_global_button (Button::Read, off);
@@ -2026,7 +1953,7 @@ MackieControlProtocol::check_fader_automation_state ()
void
MackieControlProtocol::update_fader_automation_state ()
{
- boost::shared_ptr<Route> r = first_selected_route ();
+ boost::shared_ptr<Stripable> r = first_selected_stripable ();
if (!r) {
update_global_button (Button::Read, off);
@@ -2100,24 +2027,31 @@ MackieControlProtocol::remove_down_select_button (int surface, int strip)
}
void
-MackieControlProtocol::select_range ()
+MackieControlProtocol::select_range (uint32_t pressed)
{
- RouteList routes;
+ StripableList stripables;
+
+ pull_stripable_range (_down_select_buttons, stripables, pressed);
- pull_route_range (_down_select_buttons, routes);
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("select range: found %1 stripables, first = %2\n", stripables.size(), stripables.front()->name()));
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("select range: found %1 routes\n", routes.size()));
+ if (stripables.empty()) {
+ return;
+ }
- if (!routes.empty()) {
- for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
+ if (stripables.size() == 1 && ControlProtocol::last_selected().size() == 1 && stripables.front()->presentation_info().selected()) {
+ /* cancel selection for one and only selected stripable */
+ ToggleStripableSelection (stripables.front());
+ } else {
+ for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
if (main_modifier_state() == MODIFIER_SHIFT) {
- ToggleRouteSelection ((*r)->remote_control_id ());
+ ToggleStripableSelection (*s);
} else {
- if (r == routes.begin()) {
- SetRouteSelection ((*r)->remote_control_id());
+ if (s == stripables.begin()) {
+ SetStripableSelection (*s);
} else {
- AddRouteToSelection ((*r)->remote_control_id());
+ AddStripableToSelection (*s);
}
}
}
@@ -2159,10 +2093,10 @@ MackieControlProtocol::remove_down_button (AutomationType a, int surface, int st
}
MackieControlProtocol::ControlList
-MackieControlProtocol::down_controls (AutomationType p)
+MackieControlProtocol::down_controls (AutomationType p, uint32_t pressed)
{
ControlList controls;
- RouteList routes;
+ StripableList stripables;
DownButtonMap::iterator m = _down_buttons.find (p);
@@ -2173,29 +2107,29 @@ MackieControlProtocol::down_controls (AutomationType p)
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("looking for down buttons for %1, got %2\n",
p, m->second.size()));
- pull_route_range (m->second, routes);
+ pull_stripable_range (m->second, stripables, pressed);
switch (p) {
case GainAutomation:
- for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
- controls.push_back ((*r)->gain_control());
+ for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+ controls.push_back ((*s)->gain_control());
}
break;
case SoloAutomation:
- for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
- controls.push_back ((*r)->solo_control());
+ for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+ controls.push_back ((*s)->solo_control());
}
break;
case MuteAutomation:
- for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
- controls.push_back ((*r)->mute_control());
+ for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+ controls.push_back ((*s)->mute_control());
}
break;
case RecEnableAutomation:
- for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
- boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (*r);
- if (trk) {
- controls.push_back (trk->rec_enable_control());
+ for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+ boost::shared_ptr<AutomationControl> ac = (*s)->rec_enable_control();
+ if (ac) {
+ controls.push_back (ac);
}
}
break;
@@ -2216,7 +2150,7 @@ struct ButtonRangeSorter {
};
void
-MackieControlProtocol::pull_route_range (DownButtonList& down, RouteList& selected)
+MackieControlProtocol::pull_stripable_range (DownButtonList& down, StripableList& selected, uint32_t pressed)
{
ButtonRangeSorter cmp;
@@ -2266,13 +2200,19 @@ MackieControlProtocol::pull_route_range (DownButtonList& down, RouteList& select
(*s)->number(), fs, ls));
for (uint32_t n = fs; n < ls; ++n) {
- boost::shared_ptr<Route> r = (*s)->nth_strip (n)->route();
+ Strip* strip = (*s)->nth_strip (n);
+ boost::shared_ptr<Stripable> r = strip->stripable();
if (r) {
- selected.push_back (r);
+ if (global_index_locked (*strip) == pressed) {
+ selected.push_front (r);
+ } else {
+ selected.push_back (r);
+ }
}
}
}
}
+
}
void
@@ -2396,97 +2336,97 @@ MackieControlProtocol::connection_handler (boost::weak_ptr<ARDOUR::Port> wp1, st
}
bool
-MackieControlProtocol::is_track (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_track (boost::shared_ptr<Stripable> r) const
{
return boost::dynamic_pointer_cast<Track>(r) != 0;
}
bool
-MackieControlProtocol::is_audio_track (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_audio_track (boost::shared_ptr<Stripable> r) const
{
return boost::dynamic_pointer_cast<AudioTrack>(r) != 0;
}
bool
-MackieControlProtocol::is_midi_track (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_midi_track (boost::shared_ptr<Stripable> r) const
{
return boost::dynamic_pointer_cast<MidiTrack>(r) != 0;
}
bool
-MackieControlProtocol::selected (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_mapped (boost::shared_ptr<Stripable> r) const
{
- const RouteNotificationList* rl = &_last_selected_routes;
+ Glib::Threads::Mutex::Lock lm (surfaces_lock);
- for (ARDOUR::RouteNotificationList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
- boost::shared_ptr<ARDOUR::Route> rt = (*i).lock();
- if (rt == r) {
+ for (Surfaces::const_iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
+ if ((*s)->stripable_is_mapped (r)) {
return true;
}
}
+
return false;
}
-bool
-MackieControlProtocol::is_hidden (boost::shared_ptr<Route> r) const
+void
+MackieControlProtocol::update_selected (boost::shared_ptr<Stripable> s, bool became_selected)
{
- if (!r) {
- return false;
- }
- return (((r->remote_control_id()) >>31) != 0);
-}
+ if (became_selected) {
-bool
-MackieControlProtocol::is_mapped (boost::shared_ptr<Route> r) const
-{
- Glib::Threads::Mutex::Lock lm (surfaces_lock);
+ check_fader_automation_state ();
- for (Surfaces::const_iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
- if ((*s)->route_is_mapped (r)) {
- return true;
+ /* It is possible that first_selected_route() may return null if we
+ * are no longer displaying/mapping that route. In that case,
+ * we will exit subview mode. If first_selected_route() is
+ * null, and subview mode is not None, then the first call to
+ * set_subview_mode() will fail, and we will reset to None.
+ */
+
+ if (set_subview_mode (_subview_mode, first_selected_stripable())) {
+ set_subview_mode (None, boost::shared_ptr<Stripable>());
}
- }
- return false;
+ }
}
-boost::shared_ptr<Route>
-MackieControlProtocol::first_selected_route () const
+boost::shared_ptr<Stripable>
+MackieControlProtocol::first_selected_stripable () const
{
- if (_last_selected_routes.empty()) {
- return boost::shared_ptr<Route>();
- }
+ boost::shared_ptr<Stripable> s = ControlProtocol::first_selected_stripable();
- boost::shared_ptr<Route> r = _last_selected_routes.front().lock();
-
- if (r) {
+ if (s) {
/* check it is on one of our surfaces */
- if (is_mapped (r)) {
- return r;
+ if (is_mapped (s)) {
+ return s;
}
- /* route is not mapped. thus, the currently selected route is
+ /* stripable is not mapped. thus, the currently selected stripable is
* not on the surfaces, and so from our perspective, there is
- * no currently selected route.
+ * no currently selected stripable.
*/
- r.reset ();
+ s.reset ();
}
- return r; /* may be null */
+ return s; /* may be null */
}
-boost::shared_ptr<Route>
-MackieControlProtocol::subview_route () const
+boost::shared_ptr<Stripable>
+MackieControlProtocol::subview_stripable () const
{
- return _subview_route;
+ return _subview_stripable;
}
uint32_t
MackieControlProtocol::global_index (Strip& strip)
{
Glib::Threads::Mutex::Lock lm (surfaces_lock);
+ return global_index_locked (strip);
+}
+
+uint32_t
+MackieControlProtocol::global_index_locked (Strip& strip)
+{
uint32_t global = 0;
for (Surfaces::const_iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
@@ -2513,7 +2453,7 @@ MackieControlProtocol::request_factory (uint32_t num_requests)
void
MackieControlProtocol::set_automation_state (AutoState as)
{
- boost::shared_ptr<Route> r = first_selected_route ();
+ boost::shared_ptr<Stripable> r = first_selected_stripable ();
if (!r) {
return;
diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h
index 667f0c3..8d63162 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -63,26 +63,6 @@ namespace Mackie {
gboolean ipmidi_input_handler (GIOChannel*, GIOCondition condition, void *data);
-/**
- This handles the plugin duties, and the midi encoding and decoding,
- and the signal callbacks, mostly from ARDOUR::Route.
-
- The model of the control surface is handled by classes in controls.h
-
- What happens is that each strip on the control surface has
- a corresponding route in ControlProtocol::route_table. When
- an incoming midi message is signaled, the correct route
- is looked up, and the relevant changes made to it.
-
- For each route currently in route_table, there's a RouteSignal object
- which encapsulates the signals that indicate that there are changes
- to be sent to the surface. The signals are handled by this class.
-
- Calls to signal handlers pass a Route object which is used to look
- up the relevant Strip in Surface. Then the state is retrieved from
- the Route and encoded as the correct midi message.
-*/
-
struct MackieControlUIRequest : public BaseUI::BaseRequestObject {
public:
MackieControlUIRequest () {}
@@ -150,25 +130,24 @@ class MackieControlProtocol
FlipMode flip_mode () const { return _flip_mode; }
ViewMode view_mode () const { return _view_mode; }
SubViewMode subview_mode () const { return _subview_mode; }
- static bool subview_mode_would_be_ok (SubViewMode, boost::shared_ptr<ARDOUR::Route>);
- boost::shared_ptr<ARDOUR::Route> subview_route() const;
+ static bool subview_mode_would_be_ok (SubViewMode, boost::shared_ptr<ARDOUR::Stripable>);
+ boost::shared_ptr<ARDOUR::Stripable> subview_stripable() const;
bool zoom_mode () const { return modifier_state() & MODIFIER_ZOOM; }
bool metering_active () const { return _metering_active; }
- bool is_track (boost::shared_ptr<ARDOUR::Route>) const;
- bool is_audio_track (boost::shared_ptr<ARDOUR::Route>) const;
- bool is_midi_track (boost::shared_ptr<ARDOUR::Route>) const;
- bool selected (boost::shared_ptr<ARDOUR::Route>) const;
- bool is_hidden (boost::shared_ptr<ARDOUR::Route>) const;
- bool is_mapped (boost::shared_ptr<ARDOUR::Route>) const;
- boost::shared_ptr<ARDOUR::Route> first_selected_route () const;
+ bool is_track (boost::shared_ptr<ARDOUR::Stripable>) const;
+ bool is_audio_track (boost::shared_ptr<ARDOUR::Stripable>) const;
+ bool is_midi_track (boost::shared_ptr<ARDOUR::Stripable>) const;
+ bool is_mapped (boost::shared_ptr<ARDOUR::Stripable>) const;
+ boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable () const;
+ void update_selected (boost::shared_ptr<ARDOUR::Stripable>, bool selected);
void check_fader_automation_state ();
void update_fader_automation_state ();
void set_automation_state (ARDOUR::AutoState);
void set_view_mode (ViewMode);
- int set_subview_mode (SubViewMode, boost::shared_ptr<ARDOUR::Route>);
+ int set_subview_mode (SubViewMode, boost::shared_ptr<ARDOUR::Stripable>);
void set_flip_mode (FlipMode);
void display_view_mode ();
@@ -191,6 +170,7 @@ class MackieControlProtocol
boost::shared_ptr<Mackie::Surface> nth_surface (uint32_t) const;
uint32_t global_index (Mackie::Strip&);
+ uint32_t global_index_locked (Mackie::Strip&);
std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
@@ -205,17 +185,19 @@ class MackieControlProtocol
void handle_button_event (Mackie::Surface&, Mackie::Button& button, Mackie::ButtonState);
- void notify_subview_route_deleted ();
- void notify_route_added_or_removed ();
- void notify_route_added (ARDOUR::RouteList &);
- void notify_remote_id_changed();
+ void notify_subview_stripable_deleted ();
+ void notify_stripable_removed ();
+ void notify_routes_added (ARDOUR::RouteList &);
+ void notify_vca_added (ARDOUR::VCAList &);
+
+ void notify_presentation_info_changed();
void recalibrate_faders ();
void toggle_backlight ();
void set_touch_sensitivity (int);
- /// rebuild the current bank. Called on route added/removed and
- /// remote id changed.
+ /// rebuild the current bank. Called on route or vca added/removed and
+ /// presentation info changed.
void refresh_current_bank();
// button-related signals
@@ -247,11 +229,11 @@ class MackieControlProtocol
void add_down_button (ARDOUR::AutomationType, int surface, int strip);
void remove_down_button (ARDOUR::AutomationType, int surface, int strip);
- ControlList down_controls (ARDOUR::AutomationType);
+ ControlList down_controls (ARDOUR::AutomationType, uint32_t pressed);
void add_down_select_button (int surface, int strip);
void remove_down_select_button (int surface, int strip);
- void select_range ();
+ void select_range (uint32_t pressed);
int16_t ipmidi_base() const { return _ipmidi_base; }
void set_ipmidi_base (int16_t);
@@ -274,11 +256,11 @@ class MackieControlProtocol
void zero_all();
/**
- Fetch the set of routes to be considered for control by the
+ Fetch the set of Stripables to be considered for control by the
surface. Excluding master, hidden and control routes, and inactive routes
*/
- typedef std::vector<boost::shared_ptr<ARDOUR::Route> > Sorted;
- Sorted get_sorted_routes();
+ typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > Sorted;
+ Sorted get_sorted_stripables();
// bank switching
int switch_banks (uint32_t first_remote_id, bool force = false);
@@ -296,7 +278,7 @@ class MackieControlProtocol
void thread_init ();
- bool route_is_locked_to_strip (boost::shared_ptr<ARDOUR::Route>) const;
+ bool stripable_is_locked_to_strip (boost::shared_ptr<ARDOUR::Stripable>) const;
private:
@@ -324,8 +306,8 @@ class MackieControlProtocol
uint32_t _current_initial_bank;
PBD::ScopedConnectionList audio_engine_connections;
PBD::ScopedConnectionList session_connections;
- PBD::ScopedConnectionList route_connections;
- PBD::ScopedConnectionList subview_route_connections;
+ PBD::ScopedConnectionList stripable_connections;
+ PBD::ScopedConnectionList subview_stripable_connections;
PBD::ScopedConnectionList gui_connections;
PBD::ScopedConnectionList fader_automation_connections;
// timer for two quick marker left presses
@@ -344,7 +326,7 @@ class MackieControlProtocol
FlipMode _flip_mode;
ViewMode _view_mode;
SubViewMode _subview_mode;
- boost::shared_ptr<ARDOUR::Route> _subview_route;
+ boost::shared_ptr<ARDOUR::Stripable> _subview_stripable;
int _current_selected_track;
int _modifier_state;
ButtonMap button_map;
@@ -352,7 +334,6 @@ class MackieControlProtocol
bool needs_ipmidi_restart;
bool _metering_active;
bool _initialized;
- ARDOUR::RouteNotificationList _last_selected_routes;
XMLNode* configuration_state;
int state_version;
int _last_bank[9];
@@ -377,10 +358,10 @@ class MackieControlProtocol
bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port);
void clear_ports ();
void clear_surfaces ();
- void force_special_route_to_strip (boost::shared_ptr<ARDOUR::Route> r, uint32_t surface, uint32_t strip_number);
+ void force_special_stripable_to_strip (boost::shared_ptr<ARDOUR::Stripable> r, uint32_t surface, uint32_t strip_number);
void build_button_map ();
- void gui_track_selection_changed (ARDOUR::RouteNotificationListPtr, bool save_list);
- void _gui_track_selection_changed (ARDOUR::RouteNotificationList*, bool save_list, bool gui_did_change);
+ void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr, bool save_list);
+ void _gui_track_selection_changed (ARDOUR::StripableNotificationList*, bool save_list, bool gui_did_change);
int ipmidi_restart ();
void initialize ();
int set_device_info (const std::string& device_name);
@@ -398,7 +379,7 @@ class MackieControlProtocol
DownButtonMap _down_buttons;
DownButtonList _down_select_buttons;
- void pull_route_range (DownButtonList&, ARDOUR::RouteList&);
+ void pull_stripable_range (DownButtonList&, ARDOUR::StripableList&, uint32_t pressed);
/* implemented button handlers */
Mackie::LedState stop_press(Mackie::Button &);
diff --git a/libs/surfaces/mackie/mackie_control_protocol_poll.cc b/libs/surfaces/mackie/mackie_control_protocol_poll.cc
index c04eb52..3fcf245 100644
--- a/libs/surfaces/mackie/mackie_control_protocol_poll.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol_poll.cc
@@ -9,7 +9,7 @@
#include "midi++/types.h"
#include "midi++/port.h"
#include "midi++/manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <unistd.h>
#include <fcntl.h>
diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc
index 5678bdf..4733327 100644
--- a/libs/surfaces/mackie/mcp_buttons.cc
+++ b/libs/surfaces/mackie/mcp_buttons.cc
@@ -32,7 +32,7 @@
#include "surface.h"
#include "fader.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
/* handlers for all buttons, broken into a separate file to avoid clutter in
* mackie_control_protocol.cc
@@ -102,7 +102,7 @@ MackieControlProtocol::left_press (Button &)
return none;
}
- Sorted sorted = get_sorted_routes();
+ Sorted sorted = get_sorted_stripables();
uint32_t strip_cnt = n_strips ();
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("bank left with current initial = %1 nstrips = %2 tracks/busses = %3\n",
@@ -130,7 +130,7 @@ MackieControlProtocol::right_press (Button &)
return none;
}
- Sorted sorted = get_sorted_routes();
+ Sorted sorted = get_sorted_stripables();
uint32_t strip_cnt = n_strips();
uint32_t route_cnt = sorted.size();
uint32_t max_bank = route_cnt / strip_cnt * strip_cnt;
@@ -270,7 +270,7 @@ MackieControlProtocol::channel_left_press (Button &)
if (_subview_mode != None) {
return none;
}
- Sorted sorted = get_sorted_routes();
+ Sorted sorted = get_sorted_stripables();
if (sorted.size() > n_strips()) {
prev_track();
return on;
@@ -291,7 +291,7 @@ MackieControlProtocol::channel_right_press (Button &)
if (_subview_mode != None) {
return none;
}
- Sorted sorted = get_sorted_routes();
+ Sorted sorted = get_sorted_stripables();
if (sorted.size() > n_strips()) {
next_track();
return on;
@@ -383,7 +383,7 @@ MackieControlProtocol::save_press (Button &)
} else {
save_state ();
}
-
+
return none;
}
@@ -703,7 +703,7 @@ LedState
MackieControlProtocol::pan_press (Button &)
{
/* XXX eventually pan may have its own subview mode */
- set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Route>());
+ set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Stripable>());
return none;
}
LedState
@@ -726,8 +726,7 @@ MackieControlProtocol::plugin_release (Button &)
LedState
MackieControlProtocol::eq_press (Button &)
{
- boost::shared_ptr<Route> r = first_selected_route ();
- set_subview_mode (EQ, r);
+ set_subview_mode (EQ, first_selected_stripable ());
return none; /* led state handled by set_subview_mode() */
}
@@ -739,8 +738,7 @@ MackieControlProtocol::eq_release (Button &)
LedState
MackieControlProtocol::dyn_press (Button &)
{
- boost::shared_ptr<Route> r = first_selected_route ();
- set_subview_mode (Dynamics, r);
+ set_subview_mode (Dynamics, first_selected_stripable ());
return none; /* led state handled by set_subview_mode() */
}
@@ -796,7 +794,7 @@ MackieControlProtocol::cancel_press (Button &)
if (main_modifier_state() & MODIFIER_SHIFT) {
access_action ("Transport/ToggleExternalSync");
} else {
- access_action ("Editor/escape");
+ access_action ("Main/Escape");
}
return none;
}
@@ -888,15 +886,9 @@ MackieControlProtocol::clearsolo_press (Mackie::Button&)
access_action ("Editor/set-session-from-edit-range");
return none;
}
-
- if (session) {
- if (session->soloing()) {
- session->set_solo (session->get_routes(), false);
- } else if (session->listening()) {
- session->set_listen (session->get_routes(), false);
- }
- session->clear_all_solo_state (session->get_routes()); // safeguard, ideally this won't do anything, check the log-window
+ if (session) {
+ session->cancel_all_solo ();
}
return none;
}
@@ -911,7 +903,7 @@ MackieControlProtocol::clearsolo_release (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::track_press (Mackie::Button&)
{
- set_subview_mode (TrackView, first_selected_route());
+ set_subview_mode (TrackView, first_selected_stripable());
return none;
}
Mackie::LedState
@@ -922,8 +914,7 @@ MackieControlProtocol::track_release (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::send_press (Mackie::Button&)
{
- boost::shared_ptr<Route> r = first_selected_route ();
- set_subview_mode (Sends, r);
+ set_subview_mode (Sends, first_selected_stripable());
return none; /* led state handled by set_subview_mode() */
}
Mackie::LedState
@@ -1066,7 +1057,7 @@ MackieControlProtocol::nudge_release (Mackie::Button&)
_modifier_state &= ~MODIFIER_NUDGE;
/* XXX these action names are stupid, because the action can affect
- * regions, markers or the playhead depending on selection state.
+ * regions, markers or the playhead depending on selection state.
*/
if (main_modifier_state() & MODIFIER_SHIFT) {
diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc
index e71c9a6..1c2fe8d 100644
--- a/libs/surfaces/mackie/strip.cc
+++ b/libs/surfaces/mackie/strip.cc
@@ -37,14 +37,18 @@
#include "ardour/debug.h"
#include "ardour/midi_ui.h"
#include "ardour/meter.h"
+#include "ardour/monitor_control.h"
#include "ardour/plugin_insert.h"
#include "ardour/pannable.h"
#include "ardour/panner.h"
#include "ardour/panner_shell.h"
+#include "ardour/phase_control.h"
#include "ardour/rc_configuration.h"
+#include "ardour/record_enable_control.h"
#include "ardour/route.h"
#include "ardour/session.h"
#include "ardour/send.h"
+#include "ardour/solo_isolate_control.h"
#include "ardour/track.h"
#include "ardour/midi_track.h"
#include "ardour/user_bundle.h"
@@ -163,7 +167,7 @@ Strip::add (Control & control)
}
void
-Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
+Strip::set_stripable (boost::shared_ptr<Stripable> r, bool /*with_messages*/)
{
if (_controls_locked) {
return;
@@ -171,7 +175,7 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
mb_pan_controllable.reset();
- route_connections.drop_connections ();
+ stripable_connections.drop_connections ();
_solo->set_control (boost::shared_ptr<AutomationControl>());
_mute->set_control (boost::shared_ptr<AutomationControl>());
@@ -180,69 +184,68 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
_fader->set_control (boost::shared_ptr<AutomationControl>());
_vpot->set_control (boost::shared_ptr<AutomationControl>());
- _route = r;
+ _stripable = r;
reset_saved_values ();
if (!r) {
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 Strip %2 mapped to null route\n", _surface->number(), _index));
zero ();
return;
}
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 strip %2 now mapping route %3\n",
- _surface->number(), _index, _route->name()));
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 strip %2 now mapping stripable %3\n",
+ _surface->number(), _index, _stripable->name()));
- _solo->set_control (_route->solo_control());
- _mute->set_control (_route->mute_control());
+ _solo->set_control (_stripable->solo_control());
+ _mute->set_control (_stripable->mute_control());
- _route->solo_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context());
- _route->listen_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context());
+ _stripable->solo_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context());
+ _stripable->mute_control()->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_mute_changed, this), ui_context());
- _route->mute_control()->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_mute_changed, this), ui_context());
-
- boost::shared_ptr<AutomationControl> pan_control = _route->pan_azimuth_control();
+ boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control();
if (pan_control) {
- pan_control->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_azi_changed, this, false), ui_context());
+ pan_control->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_azi_changed, this, false), ui_context());
}
- pan_control = _route->pan_width_control();
+ pan_control = _stripable->pan_width_control();
if (pan_control) {
- pan_control->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_width_changed, this, false), ui_context());
+ pan_control->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_width_changed, this, false), ui_context());
}
- _route->gain_control()->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_gain_changed, this, false), ui_context());
- _route->PropertyChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context());
+ _stripable->gain_control()->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_gain_changed, this, false), ui_context());
+ _stripable->PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context());
+ _stripable->presentation_info().PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context());
- boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<ARDOUR::Track>(_route);
+ boost::shared_ptr<AutomationControl> rec_enable_control = _stripable->rec_enable_control ();
- if (trk) {
- _recenable->set_control (trk->rec_enable_control());
- trk->rec_enable_control()->Changed .connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_record_enable_changed, this), ui_context());
+ if (rec_enable_control) {
+ _recenable->set_control (rec_enable_control);
+ rec_enable_control->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_record_enable_changed, this), ui_context());
}
- // TODO this works when a currently-banked route is made inactive, but not
- // when a route is activated which should be currently banked.
+ // TODO this works when a currently-banked stripable is made inactive, but not
+ // when a stripable is activated which should be currently banked.
- _route->active_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_active_changed, this), ui_context());
- _route->DropReferences.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_route_deleted, this), ui_context());
+ _stripable->DropReferences.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_stripable_deleted, this), ui_context());
- /* setup legal VPot modes for this route */
+ /* setup legal VPot modes for this stripable */
possible_pot_parameters.clear();
- if (_route->pan_azimuth_control()) {
+ if (_stripable->pan_azimuth_control()) {
possible_pot_parameters.push_back (PanAzimuthAutomation);
}
- if (_route->pan_width_control()) {
+ if (_stripable->pan_width_control()) {
possible_pot_parameters.push_back (PanWidthAutomation);
}
- if (_route->pan_elevation_control()) {
+ if (_stripable->pan_elevation_control()) {
possible_pot_parameters.push_back (PanElevationAutomation);
}
- if (_route->pan_frontback_control()) {
+ if (_stripable->pan_frontback_control()) {
possible_pot_parameters.push_back (PanFrontBackAutomation);
}
- if (_route->pan_lfe_control()) {
+ if (_stripable->pan_lfe_control()) {
possible_pot_parameters.push_back (PanLFEAutomation);
}
@@ -252,7 +255,7 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
set_vpot_parameter (_pan_mode);
}
- _fader->set_control (_route->gain_control());
+ _fader->set_control (_stripable->gain_control());
notify_all ();
}
@@ -260,7 +263,7 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
void
Strip::notify_all()
{
- if (!_route) {
+ if (!_stripable) {
zero ();
return;
}
@@ -273,6 +276,7 @@ Strip::notify_all()
notify_mute_changed ();
notify_gain_changed ();
notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name));
+ notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::selected));
notify_panner_azi_changed ();
notify_panner_width_changed ();
notify_record_enable_changed ();
@@ -282,8 +286,8 @@ Strip::notify_all()
void
Strip::notify_solo_changed ()
{
- if (_route && _solo) {
- _surface->write (_solo->set_state ((_route->soloed() || _route->listening_via_monitor()) ? on : off));
+ if (_stripable && _solo) {
+ _surface->write (_solo->set_state (_stripable->solo_control()->soloed() ? on : off));
}
}
@@ -291,42 +295,40 @@ void
Strip::notify_mute_changed ()
{
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Strip %1 mute changed\n", _index));
- if (_route && _mute) {
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("\troute muted ? %1\n", _route->muted()));
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("mute message: %1\n", _mute->set_state (_route->muted() ? on : off)));
+ if (_stripable && _mute) {
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("\tstripable muted ? %1\n", _stripable->mute_control()->muted()));
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("mute message: %1\n", _mute->set_state (_stripable->mute_control()->muted() ? on : off)));
- _surface->write (_mute->set_state (_route->muted() ? on : off));
+ _surface->write (_mute->set_state (_stripable->mute_control()->muted() ? on : off));
}
}
void
Strip::notify_record_enable_changed ()
{
- if (_route && _recenable) {
- _surface->write (_recenable->set_state (_route->record_enabled() ? on : off));
+ if (_stripable && _recenable) {
+ boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (_stripable);
+ if (trk) {
+ _surface->write (_recenable->set_state (trk->rec_enable_control()->get_value() ? on : off));
+ }
}
}
void
-Strip::notify_active_changed ()
-{
- _surface->mcp().refresh_current_bank();
-}
-
-void
-Strip::notify_route_deleted ()
+Strip::notify_stripable_deleted ()
{
+ _surface->mcp().notify_stripable_removed ();
_surface->mcp().refresh_current_bank();
}
void
Strip::notify_gain_changed (bool force_update)
{
- if (!_route) {
+ if (!_stripable) {
return;
}
- boost::shared_ptr<AutomationControl> ac = _route->gain_control();
+ boost::shared_ptr<AutomationControl> ac = _stripable->gain_control();
Control* control;
if (!ac) {
@@ -372,15 +374,20 @@ Strip::notify_processor_changed (bool force_update)
void
Strip::notify_property_changed (const PropertyChange& what_changed)
{
- if (!what_changed.contains (ARDOUR::Properties::name)) {
- return;
+ if (what_changed.contains (ARDOUR::Properties::name)) {
+ show_stripable_name ();
}
- show_route_name ();
+ if (what_changed.contains (ARDOUR::Properties::selected)) {
+ if (_stripable) {
+ _surface->write (_select->set_state (_stripable->presentation_info().selected()));
+ _surface->mcp().update_selected (_stripable, _stripable->presentation_info().selected());
+ }
+ }
}
void
-Strip::show_route_name ()
+Strip::show_stripable_name ()
{
MackieControlProtocol::SubViewMode svm = _surface->mcp().subview_mode();
@@ -390,10 +397,10 @@ Strip::show_route_name ()
}
string fullname = string();
- if (!_route) {
+ if (!_stripable) {
fullname = string();
} else {
- fullname = _route->name();
+ fullname = _stripable->name();
}
if (fullname.length() <= 6) {
@@ -406,7 +413,7 @@ Strip::show_route_name ()
void
Strip::notify_send_level_change (AutomationType type, uint32_t send_num, bool force_update)
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
@@ -437,7 +444,7 @@ Strip::notify_send_level_change (AutomationType type, uint32_t send_num, bool fo
void
Strip::notify_trackview_change (AutomationType type, uint32_t send_num, bool force_update)
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
@@ -491,7 +498,7 @@ Strip::notify_trackview_change (AutomationType type, uint32_t send_num, bool for
void
Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update)
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
@@ -539,7 +546,7 @@ Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update)
void
Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate_mode)
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
@@ -593,13 +600,13 @@ Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate
void
Strip::notify_panner_azi_changed (bool force_update)
{
- if (!_route) {
+ if (!_stripable) {
return;
}
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("pan change for strip %1\n", _index));
- boost::shared_ptr<AutomationControl> pan_control = _route->pan_azimuth_control ();
+ boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control ();
if (!pan_control) {
/* basically impossible, since we're here because that control
@@ -628,13 +635,13 @@ Strip::notify_panner_azi_changed (bool force_update)
void
Strip::notify_panner_width_changed (bool force_update)
{
- if (!_route) {
+ if (!_stripable) {
return;
}
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("pan width change for strip %1\n", _index));
- boost::shared_ptr<AutomationControl> pan_control = _route->pan_width_control ();
+ boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_width_control ();
if (!pan_control) {
/* basically impossible, since we're here because that control
@@ -676,7 +683,7 @@ Strip::select_event (Button&, ButtonState bs)
DEBUG_TRACE (DEBUG::MackieControl, "add select button on press\n");
_surface->mcp().add_down_select_button (_surface->number(), _index);
- _surface->mcp().select_range ();
+ _surface->mcp().select_range (_surface->mcp().global_index (*this));
} else {
DEBUG_TRACE (DEBUG::MackieControl, "remove select button on release\n");
@@ -732,7 +739,7 @@ Strip::vselect_event (Button&, ButtonState bs)
* explicitly.
*/
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (r) {
@@ -757,7 +764,7 @@ Strip::vselect_event (Button&, ButtonState bs)
} else {
/* we just turned it on, show the level
*/
- control = _route->send_level_controllable (global_pos);
+ control = _stripable->send_level_controllable (global_pos);
do_parameter_display (BusSendLevel, control->get_value());
}
}
@@ -786,8 +793,8 @@ Strip::vselect_event (Button&, ButtonState bs)
} else {
#ifdef MIXBUS
- if (_route) {
- boost::shared_ptr<AutomationControl> ac = _route->master_send_enable_controllable ();
+ if (_stripable) {
+ boost::shared_ptr<AutomationControl> ac = _stripable->master_send_enable_controllable ();
if (ac) {
Controllable::GroupControlDisposition gcd;
@@ -875,7 +882,8 @@ Strip::handle_button (Button& button, ButtonState bs)
* several down buttons
*/
- MackieControlProtocol::ControlList controls = _surface->mcp().down_controls ((AutomationType) control->parameter().type());
+ MackieControlProtocol::ControlList controls = _surface->mcp().down_controls ((AutomationType) control->parameter().type(),
+ _surface->mcp().global_index(*this));
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("there are %1 buttons down for control type %2, new value = %3\n",
@@ -945,10 +953,10 @@ Strip::do_parameter_display (AutomationType type, float val)
pending_display[1] = buf;
screen_hold = true;
} else {
- if (_route) {
- boost::shared_ptr<Pannable> p = _route->pannable();
- if (p && _route->panner()) {
- pending_display[1] =_route->panner()->value_as_string (p->pan_azimuth_control);
+ if (_stripable) {
+ boost::shared_ptr<AutomationControl> pa = _stripable->pan_azimuth_control();
+ if (pa) {
+ pending_display[1] = pa->get_user_string ();
screen_hold = true;
}
}
@@ -956,7 +964,7 @@ Strip::do_parameter_display (AutomationType type, float val)
break;
case PanWidthAutomation:
- if (_route) {
+ if (_stripable) {
snprintf (buf, sizeof (buf), "%5ld%%", lrintf ((val * 200.0)-100));
pending_display[1] = buf;
screen_hold = true;
@@ -964,7 +972,7 @@ Strip::do_parameter_display (AutomationType type, float val)
break;
case TrimAutomation:
- if (_route) {
+ if (_stripable) {
float dB = accurate_coefficient_to_dB (val);
snprintf (buf, sizeof (buf), "%6.1f", dB);
pending_display[1] = buf;
@@ -973,7 +981,7 @@ Strip::do_parameter_display (AutomationType type, float val)
break;
case PhaseAutomation:
- if (_route) {
+ if (_stripable) {
if (val < 0.5) {
pending_display[1] = "Normal";
} else {
@@ -1005,8 +1013,8 @@ Strip::do_parameter_display (AutomationType type, float val)
}
break;
case CompMode:
- if (_surface->mcp().subview_route()) {
- pending_display[1] = _surface->mcp().subview_route()->comp_mode_name (val);
+ if (_surface->mcp().subview_stripable()) {
+ pending_display[1] = _surface->mcp().subview_stripable()->comp_mode_name (val);
}
break;
case SoloSafeAutomation:
@@ -1187,17 +1195,17 @@ Strip::redisplay (ARDOUR::microseconds_t now, bool force)
void
Strip::update_automation ()
{
- if (!_route) {
+ if (!_stripable) {
return;
}
- ARDOUR::AutoState state = _route->gain_control()->automation_state();
+ ARDOUR::AutoState state = _stripable->gain_control()->automation_state();
if (state == Touch || state == Play) {
notify_gain_changed (false);
}
- boost::shared_ptr<AutomationControl> pan_control = _route->pan_azimuth_control ();
+ boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control ();
if (pan_control) {
state = pan_control->automation_state ();
if (state == Touch || state == Play) {
@@ -1205,7 +1213,7 @@ Strip::update_automation ()
}
}
- pan_control = _route->pan_width_control ();
+ pan_control = _stripable->pan_width_control ();
if (pan_control) {
state = pan_control->automation_state ();
if (state == Touch || state == Play) {
@@ -1217,7 +1225,7 @@ Strip::update_automation ()
void
Strip::update_meter ()
{
- if (!_route) {
+ if (!_stripable) {
return;
}
@@ -1225,8 +1233,8 @@ Strip::update_meter ()
return;
}
- if (_meter && _transport_is_rolling && _metering_active) {
- float dB = const_cast<PeakMeter&> (_route->peak_meter()).meter_level (0, MeterMCP);
+ if (_meter && _transport_is_rolling && _metering_active && _stripable->peak_meter()) {
+ float dB = _stripable->peak_meter()->meter_level (0, MeterMCP);
_meter->send_update (*_surface, dB);
return;
}
@@ -1306,19 +1314,6 @@ Strip::unlock_controls ()
_controls_locked = false;
}
-void
-Strip::gui_selection_changed (const ARDOUR::StrongRouteNotificationList& rl)
-{
- for (ARDOUR::StrongRouteNotificationList::const_iterator i = rl.begin(); i != rl.end(); ++i) {
- if ((*i) == _route) {
- _surface->write (_select->set_state (on));
- return;
- }
- }
-
- _surface->write (_select->set_state (off));
-}
-
string
Strip::vpot_mode_string ()
{
@@ -1359,24 +1354,26 @@ Strip::flip_mode_changed ()
boost::shared_ptr<AutomationControl> fader_control = _fader->control();
if (pot_control && fader_control) {
+
_vpot->set_control (fader_control);
_fader->set_control (pot_control);
- }
- if (_surface->mcp().flip_mode() == MackieControlProtocol::Normal) {
- do_parameter_display (GainAutomation, fader_control->get_value());
- } else {
- do_parameter_display (BusSendLevel, fader_control->get_value());
- }
+ /* update fader with pot value */
- /* update fader */
+ _surface->write (_fader->set_position (pot_control->internal_to_interface (pot_control->get_value ())));
- _surface->write (_fader->set_position (pot_control->internal_to_interface (pot_control->get_value ())));
+ /* update pot with fader value */
- /* update pot */
+ _surface->write (_vpot->set (fader_control->internal_to_interface (fader_control->get_value()), true, Pot::wrap));
- _surface->write (_vpot->set (fader_control->internal_to_interface (fader_control->get_value()), true, Pot::wrap));
+ if (_surface->mcp().flip_mode() == MackieControlProtocol::Normal) {
+ do_parameter_display (GainAutomation, fader_control->get_value());
+ } else {
+ do_parameter_display (BusSendLevel, pot_control->get_value());
+ }
+
+ }
} else {
/* do nothing */
@@ -1405,7 +1402,7 @@ Strip::return_to_vpot_mode_display ()
if (_surface->mcp().subview_mode() != MackieControlProtocol::None) {
/* do nothing - second line shows value of current subview parameter */
return;
- } else if (_route) {
+ } else if (_stripable) {
pending_display[1] = vpot_mode_string();
} else {
pending_display[1] = string();
@@ -1465,7 +1462,7 @@ Strip::next_pot_mode ()
void
Strip::subview_mode_changed ()
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
subview_connections.drop_connections ();
@@ -1473,8 +1470,8 @@ Strip::subview_mode_changed ()
case MackieControlProtocol::None:
set_vpot_parameter (_pan_mode);
/* need to show strip name again */
- show_route_name ();
- if (!_route) {
+ show_stripable_name ();
+ if (!_stripable) {
_surface->write (_vpot->set (0, true, Pot::wrap));
_surface->write (_fader->set_position (0.0));
}
@@ -1519,7 +1516,7 @@ Strip::subview_mode_changed ()
}
void
-Strip::setup_dyn_vpot (boost::shared_ptr<Route> r)
+Strip::setup_dyn_vpot (boost::shared_ptr<Stripable> r)
{
if (!r) {
return;
@@ -1604,7 +1601,7 @@ Strip::setup_dyn_vpot (boost::shared_ptr<Route> r)
}
void
-Strip::setup_eq_vpot (boost::shared_ptr<Route> r)
+Strip::setup_eq_vpot (boost::shared_ptr<Stripable> r)
{
uint32_t bands = r->eq_band_cnt ();
@@ -1739,7 +1736,7 @@ Strip::setup_eq_vpot (boost::shared_ptr<Route> r)
}
void
-Strip::setup_sends_vpot (boost::shared_ptr<Route> r)
+Strip::setup_sends_vpot (boost::shared_ptr<Stripable> r)
{
if (!r) {
return;
@@ -1750,6 +1747,8 @@ Strip::setup_sends_vpot (boost::shared_ptr<Route> r)
boost::shared_ptr<AutomationControl> pc = r->send_level_controllable (global_pos);
if (!pc) {
+ /* nothing to control */
+ _vpot->set_control (boost::shared_ptr<AutomationControl>());
pending_display[0] = string();
pending_display[1] = string();
return;
@@ -1764,7 +1763,7 @@ Strip::setup_sends_vpot (boost::shared_ptr<Route> r)
}
void
-Strip::setup_trackview_vpot (boost::shared_ptr<Route> r)
+Strip::setup_trackview_vpot (boost::shared_ptr<Stripable> r)
{
if (!r) {
return;
@@ -1773,6 +1772,8 @@ Strip::setup_trackview_vpot (boost::shared_ptr<Route> r)
const uint32_t global_pos = _surface->mcp().global_index (*this);
if (global_pos >= 8) {
+ /* nothing to control */
+ _vpot->set_control (boost::shared_ptr<AutomationControl>());
pending_display[0] = string();
pending_display[1] = string();
return;
@@ -1848,7 +1849,7 @@ Strip::setup_trackview_vpot (boost::shared_ptr<Route> r)
void
Strip::set_vpot_parameter (AutomationType p)
{
- if (!_route || (p == NullAutomation)) {
+ if (!_stripable || (p == NullAutomation)) {
_vpot->set_control (boost::shared_ptr<AutomationControl>());
pending_display[1] = string();
return;
@@ -1862,10 +1863,10 @@ Strip::set_vpot_parameter (AutomationType p)
switch (p) {
case PanAzimuthAutomation:
- pan_control = _route->pan_azimuth_control ();
+ pan_control = _stripable->pan_azimuth_control ();
break;
case PanWidthAutomation:
- pan_control = _route->pan_width_control ();
+ pan_control = _stripable->pan_width_control ();
break;
case PanElevationAutomation:
break;
@@ -1888,7 +1889,7 @@ Strip::set_vpot_parameter (AutomationType p)
bool
Strip::is_midi_track () const
{
- return boost::dynamic_pointer_cast<MidiTrack>(_route) != 0;
+ return boost::dynamic_pointer_cast<MidiTrack>(_stripable) != 0;
}
void
@@ -1908,7 +1909,7 @@ Strip::notify_metering_state_changed()
return;
}
- if (!_route || !_meter) {
+ if (!_stripable || !_meter) {
return;
}
diff --git a/libs/surfaces/mackie/strip.h b/libs/surfaces/mackie/strip.h
index 9cce3d2..a095f8e 100644
--- a/libs/surfaces/mackie/strip.h
+++ b/libs/surfaces/mackie/strip.h
@@ -20,7 +20,7 @@
#include "device_info.h"
namespace ARDOUR {
- class Route;
+ class Stripable;
class Bundle;
class ChannelCount;
}
@@ -53,13 +53,13 @@ public:
Strip (Surface&, const std::string & name, int index, const std::map<Button::ID,StripButtonInfo>&);
~Strip();
- boost::shared_ptr<ARDOUR::Route> route() const { return _route; }
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const { return _stripable; }
void add (Control & control);
int index() const { return _index; } // zero based
Surface* surface() const { return _surface; }
- void set_route (boost::shared_ptr<ARDOUR::Route>, bool with_messages = true);
+ void set_stripable (boost::shared_ptr<ARDOUR::Stripable>, bool with_messages = true);
// call all signal handlers manually
void notify_all ();
@@ -84,8 +84,6 @@ public:
void unlock_controls ();
bool locked() const { return _controls_locked; }
- void gui_selection_changed (const ARDOUR::StrongRouteNotificationList&);
-
void notify_metering_state_changed();
void block_screen_display_for (uint32_t msecs);
@@ -115,8 +113,8 @@ private:
std::string current_display[2];
uint64_t _block_screen_redisplay_until;
uint64_t return_to_vpot_mode_display_at;
- boost::shared_ptr<ARDOUR::Route> _route;
- PBD::ScopedConnectionList route_connections;
+ boost::shared_ptr<ARDOUR::Stripable> _stripable;
+ PBD::ScopedConnectionList stripable_connections;
PBD::ScopedConnectionList subview_connections;
PBD::ScopedConnectionList send_connections;
int eq_band;
@@ -135,8 +133,7 @@ private:
void notify_property_changed (const PBD::PropertyChange&);
void notify_panner_azi_changed (bool force_update = true);
void notify_panner_width_changed (bool force_update = true);
- void notify_active_changed ();
- void notify_route_deleted ();
+ void notify_stripable_deleted ();
void notify_processor_changed (bool force_update = true);
void update_automation ();
void update_meter ();
@@ -155,23 +152,23 @@ private:
std::vector<ARDOUR::AutomationType> possible_pot_parameters;
std::vector<ARDOUR::AutomationType> possible_trim_parameters;
void set_vpot_parameter (ARDOUR::AutomationType);
- void show_route_name ();
+ void show_stripable_name ();
void reset_saved_values ();
bool is_midi_track () const;
void notify_eq_change (ARDOUR::AutomationType, uint32_t band, bool force);
- void setup_eq_vpot (boost::shared_ptr<ARDOUR::Route>);
+ void setup_eq_vpot (boost::shared_ptr<ARDOUR::Stripable>);
void notify_dyn_change (ARDOUR::AutomationType, bool force, bool propagate_mode_change);
- void setup_dyn_vpot (boost::shared_ptr<ARDOUR::Route>);
+ void setup_dyn_vpot (boost::shared_ptr<ARDOUR::Stripable>);
void notify_send_level_change (ARDOUR::AutomationType, uint32_t band, bool force);
- void setup_sends_vpot (boost::shared_ptr<ARDOUR::Route>);
+ void setup_sends_vpot (boost::shared_ptr<ARDOUR::Stripable>);
void notify_trackview_change (ARDOUR::AutomationType, uint32_t band, bool force);
- void setup_trackview_vpot (boost::shared_ptr<ARDOUR::Route>);
+ void setup_trackview_vpot (boost::shared_ptr<ARDOUR::Stripable>);
};
}
diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc
index 274f2b4..ec8192f 100644
--- a/libs/surfaces/mackie/surface.cc
+++ b/libs/surfaces/mackie/surface.cc
@@ -57,7 +57,7 @@
#include "jog.h"
#include "meter.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#ifdef PLATFORM_WINDOWS
#define random() rand()
@@ -65,7 +65,7 @@
using namespace std;
using namespace PBD;
-using ARDOUR::Route;
+using ARDOUR::Stripable;
using ARDOUR::Panner;
using ARDOUR::Profile;
using ARDOUR::AutomationControl;
@@ -377,14 +377,16 @@ Surface::master_monitor_may_have_changed ()
void
Surface::setup_master ()
{
- boost::shared_ptr<Route> m;
+ boost::shared_ptr<Stripable> m;
if ((m = _mcp.get_session().monitor_out()) == 0) {
m = _mcp.get_session().master_out();
}
if (!m) {
- _master_fader->set_control (boost::shared_ptr<AutomationControl>());
+ if (_master_fader) {
+ _master_fader->set_control (boost::shared_ptr<AutomationControl>());
+ }
master_connection.disconnect ();
return;
}
@@ -673,8 +675,6 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
{
MidiByteArray bytes (count, raw_bytes);
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
-
if (_mcp.device_info().no_handshake()) {
turn_it_on ();
}
@@ -691,6 +691,9 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
switch (bytes[5]) {
case 0x01:
+ if (!_active) {
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
+ }
/* MCP: Device Ready
LCP: Connection Challenge
*/
@@ -698,12 +701,17 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
DEBUG_TRACE (DEBUG::MackieControl, "Logic Control Device connection challenge\n");
write_sysex (host_connection_query (bytes));
} else {
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mackie Control Device ready, current status = %1\n", _active));
+ if (!_active) {
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mackie Control Device ready, current status = %1\n", _active));
+ }
turn_it_on ();
}
break;
case 0x06:
+ if (!_active) {
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
+ }
/* Behringer X-Touch Compact: Device Ready
*/
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Behringer X-Touch Compact ready, current status = %1\n", _active));
@@ -711,6 +719,7 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
break;
case 0x03: /* LCP Connection Confirmation */
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
DEBUG_TRACE (DEBUG::MackieControl, "Logic Control Device confirms connection, ardour replies\n");
if (bytes[4] == 0x10 || bytes[4] == 0x11) {
write_sysex (host_connection_confirmation (bytes));
@@ -719,11 +728,13 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
break;
case 0x04: /* LCP: Confirmation Denied */
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
DEBUG_TRACE (DEBUG::MackieControl, "Logic Control Device denies connection\n");
_active = false;
break;
default:
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("unknown device ID byte %1", (int) bytes[5]));
error << "MCP: unknown sysex: " << bytes << endmsg;
}
@@ -930,28 +941,29 @@ Surface::write (const MidiByteArray& data)
}
void
-Surface::map_routes (const vector<boost::shared_ptr<Route> >& routes)
+Surface::map_stripables (const vector<boost::shared_ptr<Stripable> >& stripables)
{
- vector<boost::shared_ptr<Route> >::const_iterator r;
+ vector<boost::shared_ptr<Stripable> >::const_iterator r;
Strips::iterator s = strips.begin();
- DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mapping %1 routes\n", routes.size()));
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mapping %1 stripables to %2 strips\n", stripables.size(), strips.size()));
- for (r = routes.begin(); r != routes.end() && s != strips.end(); ++s) {
+ for (r = stripables.begin(); r != stripables.end() && s != strips.end(); ++s) {
- /* don't try to assign routes to a locked strip. it won't
+ /* don't try to assign stripables to a locked strip. it won't
use it anyway, but if we do, then we get out of sync
with the proposed mapping.
*/
if (!(*s)->locked()) {
- (*s)->set_route (*r);
+ (*s)->set_stripable (*r);
++r;
}
}
for (; s != strips.end(); ++s) {
- (*s)->set_route (boost::shared_ptr<Route>());
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("strip %1 being set to null stripable\n", (*s)->index()));
+ (*s)->set_stripable (boost::shared_ptr<Stripable>());
}
}
@@ -1139,14 +1151,6 @@ Surface::update_view_mode_display (bool with_helpful_text)
}
void
-Surface::gui_selection_changed (const ARDOUR::StrongRouteNotificationList& routes)
-{
- for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) {
- (*s)->gui_selection_changed (routes);
- }
-}
-
-void
Surface::say_hello ()
{
/* wakeup for Mackie Control */
@@ -1171,10 +1175,10 @@ Surface::set_jog_mode (JogWheel::Mode)
}
bool
-Surface::route_is_locked_to_strip (boost::shared_ptr<Route> r) const
+Surface::stripable_is_locked_to_strip (boost::shared_ptr<Stripable> stripable) const
{
for (Strips::const_iterator s = strips.begin(); s != strips.end(); ++s) {
- if ((*s)->route() == r && (*s)->locked()) {
+ if ((*s)->stripable() == stripable && (*s)->locked()) {
return true;
}
}
@@ -1182,10 +1186,10 @@ Surface::route_is_locked_to_strip (boost::shared_ptr<Route> r) const
}
bool
-Surface::route_is_mapped (boost::shared_ptr<Route> r) const
+Surface::stripable_is_mapped (boost::shared_ptr<Stripable> stripable) const
{
for (Strips::const_iterator s = strips.begin(); s != strips.end(); ++s) {
- if ((*s)->route() == r) {
+ if ((*s)->stripable() == stripable) {
return true;
}
}
diff --git a/libs/surfaces/mackie/surface.h b/libs/surfaces/mackie/surface.h
index ba79f40..3225e23 100644
--- a/libs/surfaces/mackie/surface.h
+++ b/libs/surfaces/mackie/surface.h
@@ -22,7 +22,7 @@ namespace MIDI {
}
namespace ARDOUR {
- class Route;
+ class Stripable;
class Port;
}
@@ -79,8 +79,8 @@ public:
uint32_t n_strips (bool with_locked_strips = true) const;
Strip* nth_strip (uint32_t n) const;
- bool route_is_locked_to_strip (boost::shared_ptr<ARDOUR::Route>) const;
- bool route_is_mapped (boost::shared_ptr<ARDOUR::Route>) const;
+ bool stripable_is_locked_to_strip (boost::shared_ptr<ARDOUR::Stripable>) const;
+ bool stripable_is_mapped (boost::shared_ptr<ARDOUR::Stripable>) const;
/// This collection owns the groups
typedef std::map<std::string,Group*> Groups;
@@ -88,7 +88,7 @@ public:
SurfacePort& port() const { return *_port; }
- void map_routes (const std::vector<boost::shared_ptr<ARDOUR::Route> >& routes);
+ void map_stripables (const std::vector<boost::shared_ptr<ARDOUR::Stripable> >&);
const MidiByteArray& sysex_hdr() const;
@@ -155,7 +155,6 @@ public:
void update_view_mode_display (bool with_helpful_text);
void update_flip_mode_display ();
- void gui_selection_changed (const ARDOUR::StrongRouteNotificationList&);
void subview_mode_changed ();
MackieControlProtocol& mcp() const { return _mcp; }
diff --git a/libs/surfaces/mackie/surface_port.cc b/libs/surfaces/mackie/surface_port.cc
index 6f6500f..ddc5a7b 100644
--- a/libs/surfaces/mackie/surface_port.cc
+++ b/libs/surfaces/mackie/surface_port.cc
@@ -41,7 +41,7 @@
#include "surface.h"
#include "surface_port.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
diff --git a/libs/surfaces/mackie/wscript b/libs/surfaces/mackie/wscript
index 7657d76..b797b4a 100644
--- a/libs/surfaces/mackie/wscript
+++ b/libs/surfaces/mackie/wscript
@@ -41,7 +41,7 @@ def build(bld):
obj.includes = [ '.' ]
obj.name = 'libardour_mcp'
obj.target = 'ardour_mcp'
- obj.uselib = 'GTKMM'
+ obj.uselib = 'GTKMM XML'
obj.use = 'libardour libardour_cp libgtkmm2ext'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
diff --git a/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj b/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj
index c542d23..b3faa4b 100644
--- a/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj
+++ b/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj
@@ -41,8 +41,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -60,7 +60,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)ardour32D.lib $(DllPrefix)ardour_cp32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)evoral32D.lib libloD.lib intlD.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
+ AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)timecode32D.lib $(DllPrefix)ardour32D.lib $(DllPrefix)ardour_cp32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)evoral32D.lib libloD.lib intlD.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib"
@@ -123,8 +123,8 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -142,7 +142,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)ardour32.lib $(DllPrefix)ardour_cp32.lib $(DllPrefix)midi++32.lib $(DllPrefix)pbd32.lib $(DllPrefix)evoral32.lib liblo.lib intl.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
+ AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)timecode32.lib $(DllPrefix)ardour32.lib $(DllPrefix)ardour_cp32.lib $(DllPrefix)midi++32.lib $(DllPrefix)pbd32.lib $(DllPrefix)evoral32.lib liblo.lib intl.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -204,8 +204,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
- AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -224,7 +224,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)ardour32RDC.lib $(DllPrefix)ardour_cp32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)evoral32RDC.lib libloRDC.lib intlRDC.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
+ AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)ardour32RDC.lib $(DllPrefix)ardour_cp32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)evoral32RDC.lib libloRDC.lib intlRDC.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll"
AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -280,6 +280,10 @@
>
</File>
<File
+ RelativePath="..\osc_global_observer.cc"
+ >
+ </File>
+ <File
RelativePath="..\osc_gui.cc"
>
</File>
@@ -287,6 +291,10 @@
RelativePath="..\osc_route_observer.cc"
>
</File>
+ <File
+ RelativePath="..\osc_select_observer.cc"
+ >
+ </File>
</Filter>
<Filter
Name="Header Files"
@@ -302,9 +310,17 @@
>
</File>
<File
+ RelativePath="..\osc_global_observer.h"
+ >
+ </File>
+ <File
RelativePath="..\osc_route_observer.h"
>
</File>
+ <File
+ RelativePath="..\osc_select_observer.h"
+ >
+ </File>
</Filter>
<Filter
Name="Resource Files"
@@ -312,7 +328,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index f51da26..74f3212 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -26,7 +26,7 @@
#include <fcntl.h>
#include "pbd/gstdio_compat.h"
-#include <glibmm/miscutils.h>
+#include <glibmm.h>
#include <pbd/convert.h>
#include <pbd/pthread_utils.h>
@@ -38,17 +38,25 @@
#include "ardour/route.h"
#include "ardour/audio_track.h"
#include "ardour/midi_track.h"
+#include "ardour/monitor_control.h"
#include "ardour/dB.h"
#include "ardour/filesystem_paths.h"
#include "ardour/panner.h"
#include "ardour/plugin.h"
#include "ardour/plugin_insert.h"
+#include "ardour/presentation_info.h"
#include "ardour/send.h"
+#include "ardour/phase_control.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/vca_manager.h"
+#include "osc_select_observer.h"
#include "osc.h"
#include "osc_controllable.h"
#include "osc_route_observer.h"
-#include "i18n.h"
+#include "osc_global_observer.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
@@ -81,9 +89,10 @@ OSC::OSC (Session& s, uint32_t port)
, _shutdown (false)
, _osc_server (0)
, _osc_unix_server (0)
- , _namespace_root ("/ardour")
, _send_route_changes (true)
, _debugmode (Off)
+ , tick (true)
+ , bank_dirty (false)
, gui (0)
{
_instance = this;
@@ -234,6 +243,25 @@ OSC::start ()
BaseUI::run ();
+ // start timers for metering, timecode and heartbeat.
+ // timecode and metering run at 100
+ Glib::RefPtr<Glib::TimeoutSource> periodic_timeout = Glib::TimeoutSource::create (100); // milliseconds
+ periodic_connection = periodic_timeout->connect (sigc::mem_fun (*this, &OSC::periodic));
+ periodic_timeout->attach (main_loop()->get_context());
+
+ // catch changes to selection for GUI_select mode
+ StripableSelectionChanged.connect (session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::gui_selection_changed, this), this);
+
+ // catch track reordering
+ // receive routes added
+ session->RouteAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::notify_routes_added, this, _1), this);
+ // receive VCAs added
+ session->vca_manager().VCAAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::notify_vca_added, this, _1), this);
+ // order changed
+ PresentationInfo::Change.connect (session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::recalcbanks, this), this);
+
+ _select = boost::shared_ptr<Stripable>();
+
return 0;
}
@@ -251,7 +279,12 @@ OSC::thread_init ()
}
if (_osc_server) {
+#ifdef PLATFORM_WINDOWS
+ Glib::RefPtr<IOChannel> chan = Glib::IOChannel::create_from_win32_socket (lo_server_get_socket_fd (_osc_server));
+ Glib::RefPtr<IOSource> src = IOSource::create (chan, IO_IN|IO_HUP|IO_ERR);
+#else
Glib::RefPtr<IOSource> src = IOSource::create (lo_server_get_socket_fd (_osc_server), IO_IN|IO_HUP|IO_ERR);
+#endif
src->connect (sigc::bind (sigc::mem_fun (*this, &OSC::osc_input_handler), _osc_server));
src->attach (_main_loop->get_context());
remote_server = src->gobj();
@@ -299,6 +332,8 @@ OSC::stop ()
::g_unlink (_osc_url_file.c_str() );
}
+ periodic_connection.disconnect ();
+ session_connections.drop_connections ();
// Delete any active route observers
for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end();) {
@@ -311,6 +346,26 @@ OSC::stop ()
++x;
}
}
+// Should maybe do global_observers too
+ for (GlobalObservers::iterator x = global_observers.begin(); x != global_observers.end();) {
+
+ OSCGlobalObserver* gc;
+
+ if ((gc = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+ delete *x;
+ x = global_observers.erase (x);
+ } else {
+ ++x;
+ }
+ }
+// delete select observers
+ for (uint32_t it = 0; it < _surface.size(); ++it) {
+ OSCSurface* sur = &_surface[it];
+ OSCSelectObserver* so;
+ if ((so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs)) != 0) {
+ delete so;
+ }
+ }
return 0;
}
@@ -335,151 +390,204 @@ OSC::register_callbacks()
#define REGISTER_CALLBACK(serv,path,types, function) lo_server_add_method (serv, path, types, OSC::_ ## function, this)
- REGISTER_CALLBACK (serv, "/routes/list", "", routes_list);
- REGISTER_CALLBACK (serv, "/ardour/add_marker", "", add_marker);
- REGISTER_CALLBACK (serv, "/ardour/access_action", "s", access_action);
- REGISTER_CALLBACK (serv, "/ardour/loop_toggle", "", loop_toggle);
- REGISTER_CALLBACK (serv, "/ardour/loop_location", "ii", loop_location);
- REGISTER_CALLBACK (serv, "/ardour/goto_start", "", goto_start);
- REGISTER_CALLBACK (serv, "/ardour/goto_end", "", goto_end);
- REGISTER_CALLBACK (serv, "/ardour/rewind", "", rewind);
- REGISTER_CALLBACK (serv, "/ardour/ffwd", "", ffwd);
- REGISTER_CALLBACK (serv, "/ardour/transport_stop", "", transport_stop);
- REGISTER_CALLBACK (serv, "/ardour/transport_play", "", transport_play);
- REGISTER_CALLBACK (serv, "/ardour/transport_frame", "", transport_frame);
- REGISTER_CALLBACK (serv, "/ardour/transport_speed", "", transport_speed);
- REGISTER_CALLBACK (serv, "/ardour/record_enabled", "", record_enabled);
- REGISTER_CALLBACK (serv, "/ardour/set_transport_speed", "f", set_transport_speed);
- REGISTER_CALLBACK (serv, "/ardour/locate", "ii", locate);
- REGISTER_CALLBACK (serv, "/ardour/save_state", "", save_state);
- REGISTER_CALLBACK (serv, "/ardour/prev_marker", "", prev_marker);
- REGISTER_CALLBACK (serv, "/ardour/next_marker", "", next_marker);
- REGISTER_CALLBACK (serv, "/ardour/undo", "", undo);
- REGISTER_CALLBACK (serv, "/ardour/redo", "", redo);
- REGISTER_CALLBACK (serv, "/ardour/toggle_punch_in", "", toggle_punch_in);
- REGISTER_CALLBACK (serv, "/ardour/toggle_punch_out", "", toggle_punch_out);
- REGISTER_CALLBACK (serv, "/ardour/rec_enable_toggle", "", rec_enable_toggle);
- REGISTER_CALLBACK (serv, "/ardour/toggle_all_rec_enables", "", toggle_all_rec_enables);
- REGISTER_CALLBACK (serv, "/ardour/all_tracks_rec_in", "f", all_tracks_rec_in);
- REGISTER_CALLBACK (serv, "/ardour/all_tracks_rec_out", "f", all_tracks_rec_out);
- REGISTER_CALLBACK (serv, "/ardour/remove_marker", "", remove_marker_at_playhead);
- REGISTER_CALLBACK (serv, "/ardour/jump_bars", "f", jump_by_bars);
- REGISTER_CALLBACK (serv, "/ardour/jump_seconds", "f", jump_by_seconds);
- REGISTER_CALLBACK (serv, "/ardour/mark_in", "", mark_in);
- REGISTER_CALLBACK (serv, "/ardour/mark_out", "", mark_out);
- REGISTER_CALLBACK (serv, "/ardour/toggle_click", "", toggle_click);
- REGISTER_CALLBACK (serv, "/ardour/midi_panic", "", midi_panic);
- REGISTER_CALLBACK (serv, "/ardour/toggle_roll", "", toggle_roll);
- REGISTER_CALLBACK (serv, "/ardour/stop_forget", "", stop_forget);
- REGISTER_CALLBACK (serv, "/ardour/set_punch_range", "", set_punch_range);
- REGISTER_CALLBACK (serv, "/ardour/set_loop_range", "", set_loop_range);
- REGISTER_CALLBACK (serv, "/ardour/set_session_range", "", set_session_range);
- REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_mute", "", toggle_monitor_mute);
- REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_dim", "", toggle_monitor_dim);
- REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_mono", "", toggle_monitor_mono);
- REGISTER_CALLBACK (serv, "/ardour/quick_snapshot_switch", "", quick_snapshot_switch);
- REGISTER_CALLBACK (serv, "/ardour/quick_snapshot_stay", "", quick_snapshot_stay);
- REGISTER_CALLBACK (serv, "/ardour/fit_1_track", "", fit_1_track);
- REGISTER_CALLBACK (serv, "/ardour/fit_2_tracks", "", fit_2_tracks);
- REGISTER_CALLBACK (serv, "/ardour/fit_4_tracks", "", fit_4_tracks);
- REGISTER_CALLBACK (serv, "/ardour/fit_8_tracks", "", fit_8_tracks);
- REGISTER_CALLBACK (serv, "/ardour/fit_16_tracks", "", fit_16_tracks);
- REGISTER_CALLBACK (serv, "/ardour/fit_32_tracks", "", fit_32_tracks);
- REGISTER_CALLBACK (serv, "/ardour/fit_all_tracks", "", fit_all_tracks);
- REGISTER_CALLBACK (serv, "/ardour/zoom_100_ms", "", zoom_100_ms);
- REGISTER_CALLBACK (serv, "/ardour/zoom_1_sec", "", zoom_1_sec);
- REGISTER_CALLBACK (serv, "/ardour/zoom_10_sec", "", zoom_10_sec);
- REGISTER_CALLBACK (serv, "/ardour/zoom_1_min", "", zoom_1_min);
- REGISTER_CALLBACK (serv, "/ardour/zoom_5_min", "", zoom_5_min);
- REGISTER_CALLBACK (serv, "/ardour/zoom_10_min", "", zoom_10_min);
- REGISTER_CALLBACK (serv, "/ardour/zoom_to_session", "", zoom_to_session);
- REGISTER_CALLBACK (serv, "/ardour/temporal_zoom_in", "f", temporal_zoom_in);
- REGISTER_CALLBACK (serv, "/ardour/temporal_zoom_out", "f", temporal_zoom_out);
- REGISTER_CALLBACK (serv, "/ardour/scroll_up_1_track", "f", scroll_up_1_track);
- REGISTER_CALLBACK (serv, "/ardour/scroll_dn_1_track", "f", scroll_dn_1_track);
- REGISTER_CALLBACK (serv, "/ardour/scroll_up_1_page", "f", scroll_up_1_page);
- REGISTER_CALLBACK (serv, "/ardour/scroll_dn_1_page", "f", scroll_dn_1_page);
-
-
- /*
- * NOTE: these messages are provided for (arguably broken) apps
- * that MUST send float args ( TouchOSC and Lemur ).
- * Normally these ardour transport messages don't require an argument,
- * so we're providing redundant calls with vestigial "float" args.
- *
- * These controls are active on 1.0 only (to prevent duplicate action on
- * press "/button 1", and release "/button 0")
- * http://hexler.net/docs/touchosc-controls-reference
- */
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/loop_toggle", "f", loop_toggle);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/add_marker", "f", add_marker);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/goto_start", "f", goto_start);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/goto_end", "f", goto_end);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/rewind", "f", rewind);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/ffwd", "f", ffwd);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/transport_stop", "f", transport_stop);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/transport_play", "f", transport_play);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/save_state", "f", save_state);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/prev_marker", "f", prev_marker);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/next_marker", "f", next_marker);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/undo", "f", undo);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/redo", "f", redo);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_punch_in", "f", toggle_punch_in);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_punch_out", "f", toggle_punch_out);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/rec_enable_toggle", "f", rec_enable_toggle);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_all_rec_enables", "f", toggle_all_rec_enables);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/all_tracks_rec_in", "f", all_tracks_rec_in);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/all_tracks_rec_out", "f", all_tracks_rec_out);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/remove_marker", "f", remove_marker_at_playhead);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/mark_in", "f", mark_in);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/mark_out", "f", mark_out);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_click", "f", toggle_click);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/midi_panic", "f", midi_panic);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_roll", "f", toggle_roll);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/stop_forget", "f", stop_forget);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_punch_range", "f", set_punch_range);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_loop_range", "f", set_loop_range);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_session_range", "f", set_session_range);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_mute", "f", toggle_monitor_mute);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_dim", "f", toggle_monitor_dim);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_mono", "f", toggle_monitor_mono);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/quick_snapshot_switch", "f", quick_snapshot_switch);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/quick_snapshot_stay", "f", quick_snapshot_stay);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_1_track", "f", fit_1_track);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_2_tracks", "f", fit_2_tracks);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_4_tracks", "f", fit_4_tracks);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_8_tracks", "f", fit_8_tracks);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_16_tracks", "f", fit_16_tracks);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_32_tracks", "f", fit_32_tracks);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_all_tracks", "f", fit_all_tracks);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_100_ms", "f", zoom_100_ms);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_1_sec", "f", zoom_1_sec);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_10_sec", "f", zoom_10_sec);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_1_min", "f", zoom_1_min);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_5_min", "f", zoom_5_min);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_10_min", "f", zoom_10_min);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_to_session", "f", zoom_to_session);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/temporal_zoom_in", "f", temporal_zoom_in);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/temporal_zoom_out", "f", temporal_zoom_out);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_up_1_track", "f", scroll_up_1_track);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_dn_1_track", "f", scroll_dn_1_track);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_up_1_page", "f", scroll_up_1_page);
- REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_dn_1_page", "f", scroll_dn_1_page);
+ // Some controls have optional "f" for feedback or touchosc
+ // http://hexler.net/docs/touchosc-controls-reference
+
+ REGISTER_CALLBACK (serv, "/set_surface", "iiii", set_surface);
+ REGISTER_CALLBACK (serv, "/set_surface/feedback", "i", set_surface_feedback);
+ REGISTER_CALLBACK (serv, "/set_surface/bank_size", "i", set_surface_bank_size);
+ REGISTER_CALLBACK (serv, "/set_surface/gainmode", "i", set_surface_gainmode);
+ REGISTER_CALLBACK (serv, "/set_surface/strip_types", "i", set_surface_strip_types);
+ REGISTER_CALLBACK (serv, "/strip/list", "", routes_list);
+ REGISTER_CALLBACK (serv, "/add_marker", "", add_marker);
+ REGISTER_CALLBACK (serv, "/add_marker", "f", add_marker);
+ REGISTER_CALLBACK (serv, "/access_action", "s", access_action);
+ REGISTER_CALLBACK (serv, "/loop_toggle", "", loop_toggle);
+ REGISTER_CALLBACK (serv, "/loop_toggle", "f", loop_toggle);
+ REGISTER_CALLBACK (serv, "/loop_location", "ii", loop_location);
+ REGISTER_CALLBACK (serv, "/goto_start", "", goto_start);
+ REGISTER_CALLBACK (serv, "/goto_start", "f", goto_start);
+ REGISTER_CALLBACK (serv, "/goto_end", "", goto_end);
+ REGISTER_CALLBACK (serv, "/goto_end", "f", goto_end);
+ REGISTER_CALLBACK (serv, "/rewind", "", rewind);
+ REGISTER_CALLBACK (serv, "/rewind", "f", rewind);
+ REGISTER_CALLBACK (serv, "/ffwd", "", ffwd);
+ REGISTER_CALLBACK (serv, "/ffwd", "f", ffwd);
+ REGISTER_CALLBACK (serv, "/transport_stop", "", transport_stop);
+ REGISTER_CALLBACK (serv, "/transport_stop", "f", transport_stop);
+ REGISTER_CALLBACK (serv, "/transport_play", "", transport_play);
+ REGISTER_CALLBACK (serv, "/transport_play", "f", transport_play);
+ REGISTER_CALLBACK (serv, "/transport_frame", "", transport_frame);
+ REGISTER_CALLBACK (serv, "/transport_speed", "", transport_speed);
+ REGISTER_CALLBACK (serv, "/record_enabled", "", record_enabled);
+ REGISTER_CALLBACK (serv, "/set_transport_speed", "f", set_transport_speed);
+ // locate ii is position and bool roll
+ REGISTER_CALLBACK (serv, "/locate", "ii", locate);
+ REGISTER_CALLBACK (serv, "/save_state", "", save_state);
+ REGISTER_CALLBACK (serv, "/save_state", "f", save_state);
+ REGISTER_CALLBACK (serv, "/prev_marker", "", prev_marker);
+ REGISTER_CALLBACK (serv, "/prev_marker", "f", prev_marker);
+ REGISTER_CALLBACK (serv, "/next_marker", "", next_marker);
+ REGISTER_CALLBACK (serv, "/next_marker", "f", next_marker);
+ REGISTER_CALLBACK (serv, "/undo", "", undo);
+ REGISTER_CALLBACK (serv, "/undo", "f", undo);
+ REGISTER_CALLBACK (serv, "/redo", "", redo);
+ REGISTER_CALLBACK (serv, "/redo", "f", redo);
+ REGISTER_CALLBACK (serv, "/toggle_punch_in", "", toggle_punch_in);
+ REGISTER_CALLBACK (serv, "/toggle_punch_in", "f", toggle_punch_in);
+ REGISTER_CALLBACK (serv, "/toggle_punch_out", "", toggle_punch_out);
+ REGISTER_CALLBACK (serv, "/toggle_punch_out", "f", toggle_punch_out);
+ REGISTER_CALLBACK (serv, "/rec_enable_toggle", "", rec_enable_toggle);
+ REGISTER_CALLBACK (serv, "/rec_enable_toggle", "f", rec_enable_toggle);
+ REGISTER_CALLBACK (serv, "/toggle_all_rec_enables", "", toggle_all_rec_enables);
+ REGISTER_CALLBACK (serv, "/toggle_all_rec_enables", "f", toggle_all_rec_enables);
+ REGISTER_CALLBACK (serv, "/all_tracks_rec_in", "f", all_tracks_rec_in);
+ REGISTER_CALLBACK (serv, "/all_tracks_rec_out", "f", all_tracks_rec_out);
+ REGISTER_CALLBACK (serv, "/cancel_all_solos", "f", cancel_all_solos);
+ REGISTER_CALLBACK (serv, "/remove_marker", "", remove_marker_at_playhead);
+ REGISTER_CALLBACK (serv, "/remove_marker", "f", remove_marker_at_playhead);
+ REGISTER_CALLBACK (serv, "/jump_bars", "f", jump_by_bars);
+ REGISTER_CALLBACK (serv, "/jump_seconds", "f", jump_by_seconds);
+ REGISTER_CALLBACK (serv, "/mark_in", "", mark_in);
+ REGISTER_CALLBACK (serv, "/mark_in", "f", mark_in);
+ REGISTER_CALLBACK (serv, "/mark_out", "", mark_out);
+ REGISTER_CALLBACK (serv, "/mark_out", "f", mark_out);
+ REGISTER_CALLBACK (serv, "/toggle_click", "", toggle_click);
+ REGISTER_CALLBACK (serv, "/toggle_click", "f", toggle_click);
+ REGISTER_CALLBACK (serv, "/midi_panic", "", midi_panic);
+ REGISTER_CALLBACK (serv, "/midi_panic", "f", midi_panic);
+ REGISTER_CALLBACK (serv, "/toggle_roll", "", toggle_roll);
+ REGISTER_CALLBACK (serv, "/toggle_roll", "f", toggle_roll);
+ REGISTER_CALLBACK (serv, "/stop_forget", "", stop_forget);
+ REGISTER_CALLBACK (serv, "/stop_forget", "f", stop_forget);
+ REGISTER_CALLBACK (serv, "/set_punch_range", "", set_punch_range);
+ REGISTER_CALLBACK (serv, "/set_punch_range", "f", set_punch_range);
+ REGISTER_CALLBACK (serv, "/set_loop_range", "", set_loop_range);
+ REGISTER_CALLBACK (serv, "/set_loop_range", "f", set_loop_range);
+ REGISTER_CALLBACK (serv, "/set_session_range", "", set_session_range);
+ REGISTER_CALLBACK (serv, "/set_session_range", "f", set_session_range);
+ // /toggle_monitor_* not working (comented out)
+ REGISTER_CALLBACK (serv, "/toggle_monitor_mute", "", toggle_monitor_mute);
+ REGISTER_CALLBACK (serv, "/toggle_monitor_mute", "f", toggle_monitor_mute);
+ REGISTER_CALLBACK (serv, "/toggle_monitor_dim", "", toggle_monitor_dim);
+ REGISTER_CALLBACK (serv, "/toggle_monitor_dim", "f", toggle_monitor_dim);
+ REGISTER_CALLBACK (serv, "/toggle_monitor_mono", "", toggle_monitor_mono);
+ REGISTER_CALLBACK (serv, "/toggle_monitor_mono", "f", toggle_monitor_mono);
+ REGISTER_CALLBACK (serv, "/quick_snapshot_switch", "", quick_snapshot_switch);
+ REGISTER_CALLBACK (serv, "/quick_snapshot_switch", "f", quick_snapshot_switch);
+ REGISTER_CALLBACK (serv, "/quick_snapshot_stay", "", quick_snapshot_stay);
+ REGISTER_CALLBACK (serv, "/quick_snapshot_stay", "f", quick_snapshot_stay);
+ REGISTER_CALLBACK (serv, "/fit_1_track", "", fit_1_track);
+ REGISTER_CALLBACK (serv, "/fit_1_track", "f", fit_1_track);
+ REGISTER_CALLBACK (serv, "/fit_2_tracks", "", fit_2_tracks);
+ REGISTER_CALLBACK (serv, "/fit_2_tracks", "f", fit_2_tracks);
+ REGISTER_CALLBACK (serv, "/fit_4_tracks", "", fit_4_tracks);
+ REGISTER_CALLBACK (serv, "/fit_4_tracks", "f", fit_4_tracks);
+ REGISTER_CALLBACK (serv, "/fit_8_tracks", "", fit_8_tracks);
+ REGISTER_CALLBACK (serv, "/fit_8_tracks", "f", fit_8_tracks);
+ REGISTER_CALLBACK (serv, "/fit_16_tracks", "", fit_16_tracks);
+ REGISTER_CALLBACK (serv, "/fit_16_tracks", "f", fit_16_tracks);
+ REGISTER_CALLBACK (serv, "/fit_32_tracks", "", fit_32_tracks);
+ REGISTER_CALLBACK (serv, "/fit_32_tracks", "f", fit_32_tracks);
+ REGISTER_CALLBACK (serv, "/fit_all_tracks", "", fit_all_tracks);
+ REGISTER_CALLBACK (serv, "/fit_all_tracks", "f", fit_all_tracks);
+ REGISTER_CALLBACK (serv, "/zoom_100_ms", "", zoom_100_ms);
+ REGISTER_CALLBACK (serv, "/zoom_100_ms", "f", zoom_100_ms);
+ REGISTER_CALLBACK (serv, "/zoom_1_sec", "", zoom_1_sec);
+ REGISTER_CALLBACK (serv, "/zoom_1_sec", "f", zoom_1_sec);
+ REGISTER_CALLBACK (serv, "/zoom_10_sec", "", zoom_10_sec);
+ REGISTER_CALLBACK (serv, "/zoom_10_sec", "f", zoom_10_sec);
+ REGISTER_CALLBACK (serv, "/zoom_1_min", "", zoom_1_min);
+ REGISTER_CALLBACK (serv, "/zoom_1_min", "f", zoom_1_min);
+ REGISTER_CALLBACK (serv, "/zoom_5_min", "", zoom_5_min);
+ REGISTER_CALLBACK (serv, "/zoom_5_min", "f", zoom_5_min);
+ REGISTER_CALLBACK (serv, "/zoom_10_min", "", zoom_10_min);
+ REGISTER_CALLBACK (serv, "/zoom_10_min", "f", zoom_10_min);
+ REGISTER_CALLBACK (serv, "/zoom_to_session", "", zoom_to_session);
+ REGISTER_CALLBACK (serv, "/zoom_to_session", "f", zoom_to_session);
+ REGISTER_CALLBACK (serv, "/temporal_zoom_in", "f", temporal_zoom_in);
+ REGISTER_CALLBACK (serv, "/temporal_zoom_in", "", temporal_zoom_in);
+ REGISTER_CALLBACK (serv, "/temporal_zoom_out", "", temporal_zoom_out);
+ REGISTER_CALLBACK (serv, "/temporal_zoom_out", "f", temporal_zoom_out);
+ REGISTER_CALLBACK (serv, "/scroll_up_1_track", "f", scroll_up_1_track);
+ REGISTER_CALLBACK (serv, "/scroll_up_1_track", "", scroll_up_1_track);
+ REGISTER_CALLBACK (serv, "/scroll_dn_1_track", "f", scroll_dn_1_track);
+ REGISTER_CALLBACK (serv, "/scroll_dn_1_track", "", scroll_dn_1_track);
+ REGISTER_CALLBACK (serv, "/scroll_up_1_page", "f", scroll_up_1_page);
+ REGISTER_CALLBACK (serv, "/scroll_up_1_page", "", scroll_up_1_page);
+ REGISTER_CALLBACK (serv, "/scroll_dn_1_page", "f", scroll_dn_1_page);
+ REGISTER_CALLBACK (serv, "/scroll_dn_1_page", "", scroll_dn_1_page);
+ REGISTER_CALLBACK (serv, "/bank_up", "", bank_up);
+ REGISTER_CALLBACK (serv, "/bank_up", "f", bank_up);
+ REGISTER_CALLBACK (serv, "/bank_down", "", bank_down);
+ REGISTER_CALLBACK (serv, "/bank_down", "f", bank_down);
+
+ // controls for "special" strips
+ REGISTER_CALLBACK (serv, "/master/gain", "f", master_set_gain);
+ REGISTER_CALLBACK (serv, "/master/fader", "f", master_set_fader);
+ REGISTER_CALLBACK (serv, "/master/mute", "i", master_set_mute);
+ REGISTER_CALLBACK (serv, "/master/trimdB", "f", master_set_trim);
+ REGISTER_CALLBACK (serv, "/master/pan_stereo_position", "f", master_set_pan_stereo_position);
+ REGISTER_CALLBACK (serv, "/monitor/gain", "f", monitor_set_gain);
+ REGISTER_CALLBACK (serv, "/monitor/fader", "f", monitor_set_fader);
+
+ // Controls for the Selected strip
+ REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable);
+ REGISTER_CALLBACK (serv, "/select/record_safe", "i", sel_recsafe);
+ REGISTER_CALLBACK (serv, "/select/mute", "i", sel_mute);
+ REGISTER_CALLBACK (serv, "/select/solo", "i", sel_solo);
+ REGISTER_CALLBACK (serv, "/select/solo_iso", "i", sel_solo_iso);
+ REGISTER_CALLBACK (serv, "/select/solo_safe", "i", sel_solo_safe);
+ REGISTER_CALLBACK (serv, "/select/monitor_input", "i", sel_monitor_input);
+ REGISTER_CALLBACK (serv, "/select/monitor_disk", "i", sel_monitor_disk);
+ REGISTER_CALLBACK (serv, "/select/polarity", "i", sel_phase);
+ REGISTER_CALLBACK (serv, "/select/gain", "f", sel_gain);
+ REGISTER_CALLBACK (serv, "/select/fader", "f", sel_fader);
+ REGISTER_CALLBACK (serv, "/select/trimdB", "f", sel_trim);
+ REGISTER_CALLBACK (serv, "/select/pan_stereo_position", "f", sel_pan_position);
+ REGISTER_CALLBACK (serv, "/select/pan_stereo_width", "f", sel_pan_width);
+ REGISTER_CALLBACK (serv, "/select/send_gain", "if", sel_sendgain);
+ REGISTER_CALLBACK (serv, "/select/send_fader", "if", sel_sendfader);
+ REGISTER_CALLBACK (serv, "/select/send_enable", "if", sel_sendenable);
+ REGISTER_CALLBACK (serv, "/select/expand", "i", sel_expand);
+ REGISTER_CALLBACK (serv, "/select/pan_elevation_position", "f", sel_pan_elevation);
+ REGISTER_CALLBACK (serv, "/select/pan_frontback_position", "f", sel_pan_frontback);
+ REGISTER_CALLBACK (serv, "/select/pan_lfe_control", "f", sel_pan_lfe);
+ REGISTER_CALLBACK (serv, "/select/comp_enable", "f", sel_comp_enable);
+ REGISTER_CALLBACK (serv, "/select/comp_threshold", "f", sel_comp_threshold);
+ REGISTER_CALLBACK (serv, "/select/comp_speed", "f", sel_comp_speed);
+ REGISTER_CALLBACK (serv, "/select/comp_mode", "f", sel_comp_mode);
+ REGISTER_CALLBACK (serv, "/select/comp_makeup", "f", sel_comp_makeup);
+ REGISTER_CALLBACK (serv, "/select/eq_enable", "f", sel_eq_enable);
+ REGISTER_CALLBACK (serv, "/select/eq_hpf", "f", sel_eq_hpf);
+ REGISTER_CALLBACK (serv, "/select/eq_gain", "if", sel_eq_gain);
+ REGISTER_CALLBACK (serv, "/select/eq_freq", "if", sel_eq_freq);
+ REGISTER_CALLBACK (serv, "/select/eq_q", "if", sel_eq_q);
+ REGISTER_CALLBACK (serv, "/select/eq_shape", "if", sel_eq_shape);
/* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these */
- REGISTER_CALLBACK (serv, "/ardour/routes/mute", "ii", route_mute);
- REGISTER_CALLBACK (serv, "/ardour/routes/solo", "ii", route_solo);
- REGISTER_CALLBACK (serv, "/ardour/routes/recenable", "ii", route_recenable);
- REGISTER_CALLBACK (serv, "/ardour/routes/gainabs", "if", route_set_gain_abs);
- REGISTER_CALLBACK (serv, "/ardour/routes/gaindB", "if", route_set_gain_dB);
- REGISTER_CALLBACK (serv, "/ardour/routes/trimabs", "if", route_set_trim_abs);
- REGISTER_CALLBACK (serv, "/ardour/routes/trimdB", "if", route_set_trim_dB);
- REGISTER_CALLBACK (serv, "/ardour/routes/pan_stereo_position", "if", route_set_pan_stereo_position);
- REGISTER_CALLBACK (serv, "/ardour/routes/pan_stereo_width", "if", route_set_pan_stereo_width);
- REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter", "iiif", route_plugin_parameter);
- REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter/print", "iii", route_plugin_parameter_print);
- REGISTER_CALLBACK (serv, "/ardour/routes/send/gainabs", "iif", route_set_send_gain_abs);
- REGISTER_CALLBACK (serv, "/ardour/routes/send/gaindB", "iif", route_set_send_gain_dB);
+ REGISTER_CALLBACK (serv, "/strip/mute", "ii", route_mute);
+ REGISTER_CALLBACK (serv, "/strip/solo", "ii", route_solo);
+ REGISTER_CALLBACK (serv, "/strip/solo_iso", "ii", route_solo_iso);
+ REGISTER_CALLBACK (serv, "/strip/solo_safe", "ii", route_solo_safe);
+ REGISTER_CALLBACK (serv, "/strip/recenable", "ii", route_recenable);
+ REGISTER_CALLBACK (serv, "/strip/record_safe", "ii", route_recsafe);
+ REGISTER_CALLBACK (serv, "/strip/monitor_input", "ii", route_monitor_input);
+ REGISTER_CALLBACK (serv, "/strip/monitor_disk", "ii", route_monitor_disk);
+ REGISTER_CALLBACK (serv, "/strip/expand", "ii", strip_expand);
+ REGISTER_CALLBACK (serv, "/strip/select", "ii", strip_gui_select);
+ REGISTER_CALLBACK (serv, "/strip/polarity", "ii", strip_phase);
+ REGISTER_CALLBACK (serv, "/strip/gain", "if", route_set_gain_dB);
+ REGISTER_CALLBACK (serv, "/strip/fader", "if", route_set_gain_fader);
+ REGISTER_CALLBACK (serv, "/strip/trimdB", "if", route_set_trim_dB);
+ REGISTER_CALLBACK (serv, "/strip/pan_stereo_position", "if", route_set_pan_stereo_position);
+ REGISTER_CALLBACK (serv, "/strip/pan_stereo_width", "if", route_set_pan_stereo_width);
+ REGISTER_CALLBACK (serv, "/strip/plugin/parameter", "iiif", route_plugin_parameter);
+ // prints to cerr only
+ REGISTER_CALLBACK (serv, "/strip/plugin/parameter/print", "iii", route_plugin_parameter_print);
+ REGISTER_CALLBACK (serv, "/strip/send/gain", "iif", route_set_send_gain_dB);
+ REGISTER_CALLBACK (serv, "/strip/send/fader", "iif", route_set_send_fader);
+ REGISTER_CALLBACK (serv, "/strip/send/enable", "iif", route_set_send_enable);
/* still not-really-standardized query interface */
//REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value);
@@ -543,8 +651,11 @@ OSC::get_unix_server_url()
}
void
-OSC::listen_to_route (boost::shared_ptr<Route> route, lo_address addr)
+OSC::listen_to_route (boost::shared_ptr<Stripable> strip, lo_address addr)
{
+ if (!strip) {
+ return;
+ }
/* avoid duplicate listens */
for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end(); ++x) {
@@ -553,24 +664,34 @@ OSC::listen_to_route (boost::shared_ptr<Route> route, lo_address addr)
if ((ro = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
- int res = strcmp(lo_address_get_hostname(ro->address()), lo_address_get_hostname(addr));
+ int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr));
- if (ro->route() == route && res == 0) {
+ if (ro->strip() == strip && res == 0) {
return;
}
}
}
- OSCRouteObserver* o = new OSCRouteObserver (route, addr);
+ OSCSurface *s = get_surface(addr);
+ uint32_t ssid = get_sid (strip, addr);
+ OSCRouteObserver* o = new OSCRouteObserver (strip, addr, ssid, s->gainmode, s->feedback);
route_observers.push_back (o);
- route->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::drop_route, this, boost::weak_ptr<Route> (route)), this);
+ strip->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::route_lost, this, boost::weak_ptr<Stripable> (strip)), this);
+}
+
+void
+OSC::route_lost (boost::weak_ptr<Stripable> wr)
+{
+ tick = false;
+ drop_route (wr);
+ bank_dirty = true;
}
void
-OSC::drop_route (boost::weak_ptr<Route> wr)
+OSC::drop_route (boost::weak_ptr<Stripable> wr)
{
- boost::shared_ptr<Route> r = wr.lock ();
+ boost::shared_ptr<Stripable> r = wr.lock ();
if (!r) {
return;
@@ -582,7 +703,7 @@ OSC::drop_route (boost::weak_ptr<Route> wr)
if ((rc = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
- if (rc->route() == r) {
+ if (rc->strip() == r) {
delete *x;
x = route_observers.erase (x);
} else {
@@ -595,7 +716,7 @@ OSC::drop_route (boost::weak_ptr<Route> wr)
}
void
-OSC::end_listen (boost::shared_ptr<Route> r, lo_address addr)
+OSC::end_listen (boost::shared_ptr<Stripable> r, lo_address addr)
{
RouteObservers::iterator x;
@@ -606,9 +727,9 @@ OSC::end_listen (boost::shared_ptr<Route> r, lo_address addr)
if ((ro = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
- int res = strcmp(lo_address_get_hostname(ro->address()), lo_address_get_hostname(addr));
+ int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr));
- if (ro->route() == r && res == 0) {
+ if (ro->strip() == r && res == 0) {
delete *x;
x = route_observers.erase (x);
}
@@ -653,13 +774,13 @@ OSC::send_current_value (const char* path, lo_arg** argv, int argc, lo_message m
lo_message_add_string (reply, "bad syntax");
} else {
id = argv[0]->i;
- r = session->route_by_remote_id (id);
+ r = session->get_remote_nth_route (id);
if (!r) {
lo_message_add_string (reply, "not found");
} else {
- if (strcmp (path, "/routes/state") == 0) {
+ if (strcmp (path, "/strip/state") == 0) {
if (boost::dynamic_pointer_cast<AudioTrack>(r)) {
lo_message_add_string (reply, "AT");
@@ -675,11 +796,11 @@ OSC::send_current_value (const char* path, lo_arg** argv, int argc, lo_message m
lo_message_add_int32 (reply, r->muted());
lo_message_add_int32 (reply, r->soloed());
- } else if (strcmp (path, "/routes/mute") == 0) {
+ } else if (strcmp (path, "/strip/mute") == 0) {
lo_message_add_int32 (reply, (float) r->muted());
- } else if (strcmp (path, "/routes/solo") == 0) {
+ } else if (strcmp (path, "/strip/solo") == 0) {
lo_message_add_int32 (reply, r->soloed());
}
@@ -713,7 +834,7 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
current_value_query (path, len, argv, argc, msg);
ret = 0;
- } else if (strcmp (path, "/routes/listen") == 0) {
+ } else if (strcmp (path, "/strip/listen") == 0) {
cerr << "set up listener\n";
@@ -724,7 +845,7 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
} else {
for (int n = 0; n < argc; ++n) {
- boost::shared_ptr<Route> r = session->route_by_remote_id (argv[n]->i);
+ boost::shared_ptr<Route> r = session->get_remote_nth_route (argv[n]->i);
if (!r) {
lo_message_add_string (reply, "not found");
@@ -743,11 +864,11 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
ret = 0;
- } else if (strcmp (path, "/routes/ignore") == 0) {
+ } else if (strcmp (path, "/strip/ignore") == 0) {
for (int n = 0; n < argc; ++n) {
- boost::shared_ptr<Route> r = session->route_by_remote_id (argv[n]->i);
+ boost::shared_ptr<Route> r = session->get_remote_nth_route (argv[n]->i);
if (r) {
end_listen (r, lo_message_get_source (msg));
@@ -756,31 +877,101 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
ret = 0;
} else if (argc == 1 && types[0] == 'f') { // single float -- probably TouchOSC
- if (!strncmp (path, "/ardour/routes/gainabs/", 23) && strlen (path) > 23) {
- int rid = atoi (&path[23]);
- // use some power-scale mapping??
- route_set_gain_abs (rid, argv[0]->f);
+ if (!strncmp (path, "/strip/gain/", 12) && strlen (path) > 12) {
+ // in dB
+ int ssid = atoi (&path[12]);
+ route_set_gain_dB (ssid, argv[0]->f, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/fader/", 13) && strlen (path) > 13) {
+ // in fader position
+ int ssid = atoi (&path[13]);
+ route_set_gain_fader (ssid, argv[0]->f, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/trimdB/", 14) && strlen (path) > 14) {
+ int ssid = atoi (&path[14]);
+ route_set_trim_dB (ssid, argv[0]->f, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/pan_stereo_position/", 27) && strlen (path) > 27) {
+ int ssid = atoi (&path[27]);
+ route_set_pan_stereo_position (ssid, argv[0]->f, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/mute/", 12) && strlen (path) > 12) {
+ int ssid = atoi (&path[12]);
+ route_mute (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/solo/", 12) && strlen (path) > 12) {
+ int ssid = atoi (&path[12]);
+ route_solo (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/monitor_input/", 21) && strlen (path) > 21) {
+ int ssid = atoi (&path[21]);
+ route_monitor_input (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/monitor_disk/", 20) && strlen (path) > 20) {
+ int ssid = atoi (&path[20]);
+ route_monitor_disk (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/recenable/", 17) && strlen (path) > 17) {
+ int ssid = atoi (&path[17]);
+ route_recenable (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/record_safe/", 19) && strlen (path) > 19) {
+ int ssid = atoi (&path[19]);
+ route_recsafe (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/expand/", 14) && strlen (path) > 14) {
+ int ssid = atoi (&path[14]);
+ strip_expand (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/strip/select/", 14) && strlen (path) > 14) {
+ int ssid = atoi (&path[14]);
+ strip_gui_select (ssid, argv[0]->f == 1.0, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/select/send_gain/", 18) && strlen (path) > 18) {
+ int ssid = atoi (&path[18]);
+ sel_sendgain (ssid, argv[0]->f, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/select/send_fader/", 19) && strlen (path) > 19) {
+ int ssid = atoi (&path[19]);
+ sel_sendfader (ssid, argv[0]->f, msg);
+ ret = 0;
+ }
+ else if (!strncmp (path, "/select/send_enable/", 20) && strlen (path) > 20) {
+ int ssid = atoi (&path[20]);
+ sel_sendenable (ssid, argv[0]->f, msg);
ret = 0;
}
- else if (!strncmp (path, "/ardour/routes/trimabs/", 23) && strlen (path) > 23) {
- int rid = atoi (&path[23]);
- // normalize 0..1 ?
- route_set_trim_abs (rid, argv[0]->f);
+ else if (!strncmp (path, "/select/eq_gain/", 16) && strlen (path) > 16) {
+ int ssid = atoi (&path[16]);
+ sel_eq_gain (ssid, argv[0]->f, msg);
ret = 0;
}
- else if (!strncmp (path, "/ardour/routes/mute/", 20) && strlen (path) > 20) {
- int rid = atoi (&path[20]);
- route_mute (rid, argv[0]->f == 1.0);
+ else if (!strncmp (path, "/select/eq_freq/", 16) && strlen (path) > 16) {
+ int ssid = atoi (&path[16]);
+ sel_eq_freq (ssid, argv[0]->f , msg);
ret = 0;
}
- else if (!strncmp (path, "/ardour/routes/solo/", 20) && strlen (path) > 20) {
- int rid = atoi (&path[20]);
- route_solo (rid, argv[0]->f == 1.0);
+ else if (!strncmp (path, "/select/eq_q/", 13) && strlen (path) > 13) {
+ int ssid = atoi (&path[13]);
+ sel_eq_q (ssid, argv[0]->f, msg);
ret = 0;
}
- else if (!strncmp (path, "/ardour/routes/recenable/", 25) && strlen (path) > 25) {
- int rid = atoi (&path[25]);
- route_recenable (rid, argv[0]->f == 1.0);
+ else if (!strncmp (path, "/select/eq_shape/", 17) && strlen (path) > 17) {
+ int ssid = atoi (&path[17]);
+ sel_eq_shape (ssid, argv[0]->f, msg);
ret = 0;
}
}
@@ -869,6 +1060,7 @@ OSC::session_exported (std::string path, std::string name)
{
lo_address listener = lo_address_new (NULL, "7770");
lo_send (listener, "/session/exported", "ss", path.c_str(), name.c_str());
+ lo_address_free (listener);
}
// end "Application Hook" Handlers //
@@ -943,7 +1135,7 @@ OSC::routes_list (lo_message msg)
}
for (int n = 0; n < (int) session->nroutes(); ++n) {
- boost::shared_ptr<Route> r = session->route_by_remote_id (n);
+ boost::shared_ptr<Route> r = session->get_remote_nth_route (n);
if (r) {
@@ -962,13 +1154,16 @@ OSC::routes_list (lo_message msg)
lo_message_add_int32 (reply, r->n_outputs().n_audio());
lo_message_add_int32 (reply, r->muted());
lo_message_add_int32 (reply, r->soloed());
- lo_message_add_int32 (reply, r->remote_control_id());
+ /* XXX Can only use order at this point */
+ //lo_message_add_int32 (reply, r->presentation_info().order());
+ // try this instead.
+ lo_message_add_int32 (reply, get_sid (r, lo_message_get_source (msg)));
if (boost::dynamic_pointer_cast<AudioTrack>(r)
|| boost::dynamic_pointer_cast<MidiTrack>(r)) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(r);
- lo_message_add_int32 (reply, t->record_enabled());
+ lo_message_add_int32 (reply, (int32_t) t->rec_enable_control()->get_value());
}
//Automatically listen to routes listed
@@ -991,6 +1186,358 @@ OSC::routes_list (lo_message msg)
lo_message_free (reply);
}
+int
+OSC::cancel_all_solos ()
+{
+ session->cancel_all_solo ();
+ return 0;
+}
+
+int
+OSC::set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gm, lo_message msg)
+{
+ OSCSurface *s = get_surface(lo_message_get_source (msg));
+ s->bank_size = b_size;
+ s->strip_types = strips;
+ s->feedback = fb;
+ s->gainmode = gm;
+ // set bank and strip feedback
+ set_bank(s->bank, msg);
+
+ global_feedback (s->feedback, lo_message_get_source (msg), s->gainmode);
+ return 0;
+}
+
+int
+OSC::set_surface_bank_size (uint32_t bs, lo_message msg)
+{
+ OSCSurface *s = get_surface(lo_message_get_source (msg));
+ s->bank_size = bs;
+
+ // set bank and strip feedback
+ set_bank(s->bank, msg);
+ return 0;
+}
+
+int
+OSC::set_surface_strip_types (uint32_t st, lo_message msg)
+{
+ OSCSurface *s = get_surface(lo_message_get_source (msg));
+ s->strip_types = st;
+
+ // set bank and strip feedback
+ set_bank(s->bank, msg);
+ return 0;
+}
+
+
+int
+OSC::set_surface_feedback (uint32_t fb, lo_message msg)
+{
+ OSCSurface *s = get_surface(lo_message_get_source (msg));
+ s->feedback = fb;
+
+ // set bank and strip feedback
+ set_bank(s->bank, msg);
+
+ // Set global/master feedback
+ global_feedback (s->feedback, lo_message_get_source (msg), s->gainmode);
+ return 0;
+}
+
+
+int
+OSC::set_surface_gainmode (uint32_t gm, lo_message msg)
+{
+ OSCSurface *s = get_surface(lo_message_get_source (msg));
+ s->gainmode = gm;
+
+ // set bank and strip feedback
+ set_bank(s->bank, msg);
+
+ // Set global/master feedback
+ global_feedback (s->feedback, lo_message_get_source (msg), s->gainmode);
+ return 0;
+}
+
+OSC::OSCSurface *
+OSC::get_surface (lo_address addr)
+{
+ string r_url;
+ char * rurl;
+ rurl = lo_address_get_url (addr);
+ r_url = rurl;
+ free (rurl);
+ for (uint32_t it = 0; it < _surface.size(); ++it) {
+ //find setup for this server
+ if (!_surface[it].remote_url.find(r_url)){
+ return &_surface[it];
+ }
+ }
+ // if we do this when OSC is started we get the wrong stripable
+ // we don't need this until we actually have a surface to deal with
+ if (!_select || (_select != ControlProtocol::first_selected_stripable())) {
+ gui_selection_changed();
+ }
+
+ // No surface create one with default values
+ OSCSurface s;
+ s.remote_url = r_url;
+ s.bank = 1;
+ s.bank_size = 0; // need to find out how many strips there are
+ s.strip_types = 31; // 31 is tracks, busses, and VCAs (no master/monitor)
+ s.feedback = 0;
+ s.gainmode = 0;
+ s.sel_obs = 0;
+ s.expand = 0;
+ s.expand_enable = false;
+ s.strips = get_sorted_stripables(s.strip_types);
+
+ s.nstrips = s.strips.size();
+ _surface.push_back (s);
+
+ return &_surface[_surface.size() - 1];
+}
+
+// setup global feedback for a surface
+void
+OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode)
+{
+ // first destroy global observer for this surface
+ GlobalObservers::iterator x;
+ for (x = global_observers.begin(); x != global_observers.end();) {
+
+ OSCGlobalObserver* ro;
+
+ if ((ro = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+
+ int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr));
+
+ if (res == 0) {
+ delete *x;
+ x = global_observers.erase (x);
+ } else {
+ ++x;
+ }
+ } else {
+ ++x;
+ }
+ }
+ if (feedback[4] || feedback[3] || feedback[5] || feedback[6]) {
+ // create a new Global Observer for this surface
+ OSCGlobalObserver* o = new OSCGlobalObserver (*session, addr, gainmode, /*s->*/feedback);
+ global_observers.push_back (o);
+ }
+}
+
+void
+OSC::notify_routes_added (ARDOUR::RouteList &)
+{
+ // not sure if we need this PI change seems to cover
+ //recalcbanks();
+}
+
+void
+OSC::notify_vca_added (ARDOUR::VCAList &)
+{
+ // not sure if we need this PI change seems to cover
+ //recalcbanks();
+}
+
+void
+OSC::recalcbanks ()
+{
+ tick = false;
+ bank_dirty = true;
+}
+
+void
+OSC::_recalcbanks ()
+{
+ if (!_select || (_select != ControlProtocol::first_selected_stripable())) {
+ _select = ControlProtocol::first_selected_stripable();
+ }
+
+ // do a set_bank for each surface we know about.
+ for (uint32_t it = 0; it < _surface.size(); ++it) {
+ OSCSurface* sur = &_surface[it];
+ // find lo_address
+ lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
+ _set_bank (sur->bank, addr);
+ }
+}
+
+/*
+ * This gets called not only when bank changes but also:
+ * - bank size change
+ * - feedback change
+ * - strip types changes
+ * - fadermode changes
+ * - stripable creation/deletion/flag
+ * - to refresh what is "displayed"
+ * Basically any time the bank needs to be rebuilt
+ */
+int
+OSC::set_bank (uint32_t bank_start, lo_message msg)
+{
+ return _set_bank (bank_start, lo_message_get_source (msg));
+}
+
+// set bank is callable with either message or address
+int
+OSC::_set_bank (uint32_t bank_start, lo_address addr)
+{
+ if (!session) {
+ return -1;
+ }
+ // no nstripables yet
+ if (!session->nroutes()) {
+ return -1;
+ }
+
+ OSCSurface *s = get_surface (addr);
+
+ // revert any expand to select
+ s->expand = 0;
+ s->expand_enable = false;
+ _strip_select (ControlProtocol::first_selected_stripable(), addr);
+
+ // undo all listeners for this url
+ StripableList stripables;
+ session->get_stripables (stripables);
+ for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) {
+
+ boost::shared_ptr<Stripable> stp = *it;
+ if (stp) {
+ end_listen (stp, addr);
+ }
+ }
+
+ s->strips = get_sorted_stripables(s->strip_types);
+ s->nstrips = s->strips.size();
+
+ uint32_t b_size;
+ if (!s->bank_size) {
+ // no banking - bank includes all stripables
+ b_size = s->nstrips;
+ } else {
+ b_size = s->bank_size;
+ }
+
+ // Do limits checking
+ if (bank_start < 1) bank_start = 1;
+ if (b_size >= s->nstrips) {
+ bank_start = 1;
+ } else if (bank_start > ((s->nstrips - b_size) + 1)) {
+ // top bank is always filled if there are enough strips for at least one bank
+ bank_start = (uint32_t)((s->nstrips - b_size) + 1);
+ }
+ //save bank in case we have had to change it
+ s->bank = bank_start;
+
+ if (s->feedback[0] || s->feedback[1]) {
+
+ for (uint32_t n = bank_start; n < (min ((b_size + bank_start), s->nstrips + 1)); ++n) {
+ if (n <= s->strips.size()) {
+ boost::shared_ptr<Stripable> stp = s->strips[n - 1];
+
+ if (stp) {
+ listen_to_route(stp, addr);
+ }
+ }
+ }
+ }
+ // light bankup or bankdown buttons if it is possible to bank in that direction
+ if (s->feedback[4]) {
+ // these two messages could be bundled
+ lo_message reply;
+ reply = lo_message_new ();
+ if ((s->bank > (s->nstrips - s->bank_size)) || (s->nstrips < s->bank_size)) {
+ lo_message_add_int32 (reply, 0);
+ } else {
+ lo_message_add_int32 (reply, 1);
+ }
+ lo_send_message (addr, "/bank_up", reply);
+ lo_message_free (reply);
+ reply = lo_message_new ();
+ if (s->bank > 1) {
+ lo_message_add_int32 (reply, 1);
+ } else {
+ lo_message_add_int32 (reply, 0);
+ }
+ lo_send_message (addr, "/bank_down", reply);
+ lo_message_free (reply);
+ }
+ bank_dirty = false;
+ tick = true;
+ return 0;
+}
+
+int
+OSC::bank_up (lo_message msg)
+{
+ if (!session) {
+ return -1;
+ }
+ OSCSurface *s = get_surface(lo_message_get_source (msg));
+ set_bank (s->bank + s->bank_size, msg);
+ return 0;
+}
+
+int
+OSC::bank_down (lo_message msg)
+{
+ if (!session) {
+ return -1;
+ }
+ OSCSurface *s = get_surface(lo_message_get_source (msg));
+ if (s->bank < s->bank_size) {
+ set_bank (1, msg);
+ } else {
+ set_bank (s->bank - s->bank_size, msg);
+ }
+ return 0;
+}
+
+uint32_t
+OSC::get_sid (boost::shared_ptr<ARDOUR::Stripable> strip, lo_address addr)
+{
+ if (!strip) {
+ return 0;
+ }
+
+ OSCSurface *s = get_surface(addr);
+
+ uint32_t b_size;
+ if (!s->bank_size) {
+ // no banking
+ b_size = s->nstrips;
+ } else {
+ b_size = s->bank_size;
+ }
+
+ for (uint32_t n = s->bank; n < (min ((b_size + s->bank), s->nstrips + 1)); ++n) {
+ if (n <= s->strips.size()) {
+ if (strip == s->strips[n-1]) {
+ return n - s->bank + 1;
+ }
+ }
+ }
+ // failsafe... should never get here.
+ return 0;
+}
+
+boost::shared_ptr<ARDOUR::Stripable>
+OSC::get_strip (uint32_t ssid, lo_address addr)
+{
+ OSCSurface *s = get_surface(addr);
+ if (ssid && ((ssid + s->bank - 2) < s->nstrips)) {
+ return s->strips[ssid + s->bank - 2];
+ }
+ // guess it is out of range
+ return boost::shared_ptr<ARDOUR::Stripable>();
+}
+
void
OSC::transport_frame (lo_message msg)
{
@@ -1002,7 +1549,7 @@ OSC::transport_frame (lo_message msg)
lo_message reply = lo_message_new ();
lo_message_add_int64 (reply, pos);
- lo_send_message (lo_message_get_source (msg), "/ardour/transport_frame", reply);
+ lo_send_message (lo_message_get_source (msg), "/transport_frame", reply);
lo_message_free (reply);
}
@@ -1018,7 +1565,7 @@ OSC::transport_speed (lo_message msg)
lo_message reply = lo_message_new ();
lo_message_add_double (reply, ts);
- lo_send_message (lo_message_get_source (msg), "/ardour/transport_speed", reply);
+ lo_send_message (lo_message_get_source (msg), "/transport_speed", reply);
lo_message_free (reply);
}
@@ -1034,222 +1581,991 @@ OSC::record_enabled (lo_message msg)
lo_message reply = lo_message_new ();
lo_message_add_int32 (reply, re);
- lo_send_message (lo_message_get_source (msg), "/ardour/record_enabled", reply);
+ lo_send_message (lo_message_get_source (msg), "/record_enabled", reply);
lo_message_free (reply);
}
+// master and monitor calls
+int
+OSC::master_set_gain (float dB)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = session->master_out();
+ if (s) {
+ if (dB < -192) {
+ s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
+ } else {
+ s->gain_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
+ }
+ }
+ return 0;
+}
int
-OSC::route_mute (int rid, int yn)
+OSC::master_set_fader (float position)
{
if (!session) return -1;
+ boost::shared_ptr<Stripable> s = session->master_out();
+ if (s) {
+ s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup);
+ }
+ return 0;
+}
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+int
+OSC::master_set_trim (float dB)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = session->master_out();
- if (r) {
- r->set_mute (yn, PBD::Controllable::NoGroup);
+ if (s) {
+ s->trim_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
}
return 0;
}
int
-OSC::route_solo (int rid, int yn)
+OSC::master_set_pan_stereo_position (float position, lo_message msg)
{
if (!session) return -1;
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+ float endposition = .5;
+ boost::shared_ptr<Stripable> s = session->master_out();
+
+ if (s) {
+ if (s->pan_azimuth_control()) {
+ s->pan_azimuth_control()->set_value (s->pan_azimuth_control()->interface_to_internal (position), PBD::Controllable::NoGroup);
+ endposition = s->pan_azimuth_control()->internal_to_interface (s->pan_azimuth_control()->get_value ());
+ }
+ }
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+
+ if (sur->feedback[4]) {
+ lo_message reply = lo_message_new ();
+ lo_message_add_float (reply, endposition);
- if (r) {
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (r);
- session->set_solo (rl, yn, Session::rt_cleanup, PBD::Controllable::NoGroup);
+ lo_send_message (lo_message_get_source (msg), "/master/pan_stereo_position", reply);
+ lo_message_free (reply);
}
return 0;
}
int
-OSC::route_recenable (int rid, int yn)
+OSC::master_set_mute (uint32_t state)
{
if (!session) return -1;
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+ boost::shared_ptr<Stripable> s = session->master_out();
- if (r) {
- r->set_record_enabled (yn, PBD::Controllable::NoGroup);
+ if (s) {
+ s->mute_control()->set_value (state, PBD::Controllable::NoGroup);
}
return 0;
}
int
-OSC::route_set_gain_abs (int rid, float level)
+OSC::monitor_set_gain (float dB)
{
if (!session) return -1;
+ boost::shared_ptr<Stripable> s = session->monitor_out();
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
- if (r) {
- r->set_gain (level, PBD::Controllable::NoGroup);
+ if (s) {
+ if (dB < -192) {
+ s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
+ } else {
+ s->gain_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
+ }
}
-
return 0;
}
int
-OSC::route_set_gain_dB (int rid, float dB)
+OSC::monitor_set_fader (float position)
{
- return route_set_gain_abs (rid, dB_to_coefficient (dB));
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = session->monitor_out();
+ if (s) {
+ s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup);
+ }
+ return 0;
}
-
+// strip calls
int
-OSC::route_set_trim_abs (int rid, float level)
+OSC::route_mute (int ssid, int yn, lo_message msg)
{
if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
- if (r) {
- r->set_trim (level, PBD::Controllable::NoGroup);
+ if (s) {
+ if (s->mute_control()) {
+ s->mute_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
}
- return 0;
+ return route_send_fail ("mute", ssid, 0, lo_message_get_source (msg));
}
int
-OSC::route_set_trim_dB (int rid, float dB)
+OSC::sel_mute (uint32_t yn, lo_message msg)
{
- return route_set_trim_abs(rid, dB_to_coefficient (dB));
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->mute_control()) {
+ s->mute_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("mute", 0, lo_message_get_source (msg));
}
-
int
-OSC::route_set_pan_stereo_position (int rid, float pos)
+OSC::route_solo (int ssid, int yn, lo_message msg)
{
if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
- if (r) {
- boost::shared_ptr<Panner> panner = r->panner();
- if (panner) {
- panner->set_position (pos);
+ if (s) {
+ if (s->solo_control()) {
+ s->solo_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
}
}
- return 0;
-
+ return route_send_fail ("solo", ssid, 0, lo_message_get_source (msg));
}
int
-OSC::route_set_pan_stereo_width (int rid, float pos)
+OSC::route_solo_iso (int ssid, int yn, lo_message msg)
{
if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
- if (r) {
- boost::shared_ptr<Panner> panner = r->panner();
- if (panner) {
- panner->set_width (pos);
+ if (s) {
+ if (s->solo_isolate_control()) {
+ s->solo_isolate_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
}
}
- return 0;
-
+ return route_send_fail ("solo_iso", ssid, 0, lo_message_get_source (msg));
}
int
-OSC::route_set_send_gain_abs (int rid, int sid, float val)
+OSC::route_solo_safe (int ssid, int yn, lo_message msg)
{
- if (!session) {
- return -1;
- }
-
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
- if (!r) {
- return -1;
+ if (s) {
+ if (s->solo_safe_control()) {
+ s->solo_safe_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
}
- /* revert to zero-based counting */
+ return route_send_fail ("solo_safe", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_solo (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->solo_control()) {
+ s->solo_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("solo", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_solo_iso (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->solo_isolate_control()) {
+ s->solo_isolate_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("solo_iso", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_solo_safe (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->solo_safe_control()) {
+ s->solo_safe_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("solo_safe", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_recenable (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->rec_enable_control()) {
+ s->rec_enable_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("recenable", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_recenable (int ssid, int yn, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ if (s->rec_enable_control()) {
+ s->rec_enable_control()->set_value (yn, PBD::Controllable::UseGroup);
+ if (s->rec_enable_control()->get_value()) {
+ return 0;
+ }
+ }
+ }
+ return route_send_fail ("recenable", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_recsafe (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->rec_safe_control()) {
+ s->rec_safe_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("record_safe", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_recsafe (int ssid, int yn, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+ if (s) {
+ if (s->rec_safe_control()) {
+ s->rec_safe_control()->set_value (yn, PBD::Controllable::UseGroup);
+ if (s->rec_safe_control()->get_value()) {
+ return 0;
+ }
+ }
+ }
+ return route_send_fail ("record_safe", ssid, 0,lo_message_get_source (msg));
+}
+
+int
+OSC::route_monitor_input (int ssid, int yn, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+ if (track) {
+ if (track->monitoring_control()) {
+ track->monitoring_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ }
+
+ return route_send_fail ("monitor_input", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_monitor_input (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+ if (track) {
+ if (track->monitoring_control()) {
+ track->monitoring_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ }
+ return sel_fail ("monitor_input", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+ if (track) {
+ if (track->monitoring_control()) {
+ track->monitoring_control()->set_value (yn ? 2.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ }
+
+ return route_send_fail ("monitor_disk", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_monitor_disk (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+ if (track) {
+ if (track->monitoring_control()) {
+ track->monitoring_control()->set_value (yn ? 2.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ }
+ return sel_fail ("monitor_disk", 0, lo_message_get_source (msg));
+}
+
+
+int
+OSC::strip_phase (int ssid, int yn, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ if (s->phase_control()) {
+ s->phase_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+
+ return route_send_fail ("polarity", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_phase (uint32_t yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->phase_control()) {
+ s->phase_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("polarity", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::strip_expand (int ssid, int yn, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ sur->expand_enable = (bool) yn;
+ sur->expand = ssid;
+ boost::shared_ptr<Stripable> s;
+ if (yn) {
+ s = get_strip (ssid, lo_message_get_source (msg));
+ } else {
+ s = ControlProtocol::first_selected_stripable();
+ }
+
+ return _strip_select (s, lo_message_get_source (msg));
+}
+
+int
+OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
+{
+ if (!session) {
+ return -1;
+ }
+ OSCSurface *sur = get_surface(addr);
+ if (sur->sel_obs) {
+ delete sur->sel_obs;
+ sur->sel_obs = 0;
+ }
+ if (s) {
+ OSCSelectObserver* sel_fb = new OSCSelectObserver (s, addr, sur->gainmode, sur->feedback);
+ s->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::recalcbanks, this), this);
+ sur->sel_obs = sel_fb;
+ } else if (sur->expand_enable) {
+ sur->expand = 0;
+ sur->expand_enable = false;
+ if (_select) {
+ OSCSelectObserver* sel_fb = new OSCSelectObserver (_select, addr, sur->gainmode, sur->feedback);
+ _select->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::recalcbanks, this), this);
+ sur->sel_obs = sel_fb;
+ }
+ } else {
+ route_send_fail ("select", sur->expand, 0 , addr);
+ }
+ //update buttons on surface
+ int b_s = sur->bank_size;
+ if (!b_s) { // bank size 0 means we need to know how many strips there are.
+ b_s = sur->nstrips;
+ }
+ for (int i = 1; i <= b_s; i++) {
+ string path = "expand";
+
+ if ((i == (int) sur->expand) && sur->expand_enable) {
+ lo_message reply = lo_message_new ();
+ if (sur->feedback[2]) {
+ ostringstream os;
+ os << "/strip/" << path << "/" << i;
+ path = os.str();
+ } else {
+ ostringstream os;
+ os << "/strip/" << path;
+ path = os.str();
+ lo_message_add_int32 (reply, i);
+ }
+ lo_message_add_float (reply, (float) 1);
+
+ lo_send_message (addr, path.c_str(), reply);
+ lo_message_free (reply);
+ reply = lo_message_new ();
+ lo_message_add_float (reply, 1.0);
+ lo_send_message (addr, "/select/expand", reply);
+ lo_message_free (reply);
+
+ } else {
+ lo_message reply = lo_message_new ();
+ lo_message_add_int32 (reply, i);
+ lo_message_add_float (reply, 0.0);
+ lo_send_message (addr, "/strip/expand", reply);
+ lo_message_free (reply);
+ }
+ }
+ if (!sur->expand_enable) {
+ lo_message reply = lo_message_new ();
+ lo_message_add_float (reply, 0.0);
+ lo_send_message (addr, "/select/expand", reply);
+ lo_message_free (reply);
+ }
+
+ return 0;
+}
+
+int
+OSC::strip_gui_select (int ssid, int yn, lo_message msg)
+{
+ //ignore button release
+ if (!yn) return 0;
+
+ if (!session) {
+ route_send_fail ("select", ssid, 0, lo_message_get_source (msg));
+ return -1;
+ }
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ sur->expand_enable = false;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+ if (s) {
+ SetStripableSelection (s);
+ } else {
+ route_send_fail ("select", ssid, 0, lo_message_get_source (msg));
+ }
+
+ return 0;
+}
+
+int
+OSC::sel_expand (uint32_t state, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ sur->expand_enable = (bool) state;
+ if (state && sur->expand) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = ControlProtocol::first_selected_stripable();
+ }
+
+ return _strip_select (s, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_gain_abs (int ssid, float level, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ if (s->gain_control()) {
+ s->gain_control()->set_value (level, PBD::Controllable::NoGroup);
+ } else {
+ return 1;
+ }
+ } else {
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+OSC::route_set_gain_dB (int ssid, float dB, lo_message msg)
+{
+ if (!session) {
+ route_send_fail ("gain", ssid, -193, lo_message_get_source (msg));
+ return -1;
+ }
+ int ret;
+ if (dB < -192) {
+ ret = route_set_gain_abs (ssid, 0.0, msg);
+ } else {
+ ret = route_set_gain_abs (ssid, dB_to_coefficient (dB), msg);
+ }
+ if (ret != 0) {
+ return route_send_fail ("gain", ssid, -193, lo_message_get_source (msg));
+ }
+ return 0;
+}
+
+int
+OSC::sel_gain (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ float abs;
+ if (val < -192) {
+ abs = 0;
+ } else {
+ abs = dB_to_coefficient (val);
+ }
+ if (s->gain_control()) {
+ s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("gain", -193, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_gain_fader (int ssid, float pos, lo_message msg)
+{
+ if (!session) {
+ route_send_fail ("fader", ssid, 0, lo_message_get_source (msg));
+ return -1;
+ }
+ int ret;
+ ret = route_set_gain_abs (ssid, slider_position_to_gain_with_max (pos, 2.0), msg);
+ if (ret != 0) {
+ return route_send_fail ("fader", ssid, 0, lo_message_get_source (msg));
+ }
+ return 0;
+}
+
+int
+OSC::sel_fader (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ float abs;
+ abs = slider_position_to_gain_with_max (val, 2.0);
+ if (s->gain_control()) {
+ s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("fader", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_trim_abs (int ssid, float level, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ if (s->trim_control()) {
+ s->trim_control()->set_value (level, PBD::Controllable::NoGroup);
+ return 0;
+ }
+
+ }
+
+ return -1;
+}
+
+int
+OSC::route_set_trim_dB (int ssid, float dB, lo_message msg)
+{
+ int ret;
+ ret = route_set_trim_abs(ssid, dB_to_coefficient (dB), msg);
+ if (ret != 0) {
+ return route_send_fail ("trimdB", ssid, 0, lo_message_get_source (msg));
+ }
+
+return 0;
+}
+
+int
+OSC::sel_trim (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->trim_control()) {
+ s->trim_control()->set_value (dB_to_coefficient (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("trimdB", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_position (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if(s->pan_azimuth_control()) {
+ s->pan_azimuth_control()->set_value (s->pan_azimuth_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return sel_fail ("pan_stereo_position", s->pan_azimuth_control()->internal_to_interface (s->pan_azimuth_control()->get_value ()), lo_message_get_source (msg));
+ return 0;
+ }
+ }
+ return sel_fail ("pan_stereo_position", 0.5, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_width (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->pan_width_control()) {
+ s->pan_width_control()->set_value (s->pan_width_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("pan_stereo_width", 1, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_pan_stereo_position (int ssid, float pos, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ if(s->pan_azimuth_control()) {
+ s->pan_azimuth_control()->set_value (s->pan_azimuth_control()->interface_to_internal (pos), PBD::Controllable::NoGroup);
+ return route_send_fail ("pan_stereo_position", ssid, s->pan_azimuth_control()->internal_to_interface (s->pan_azimuth_control()->get_value ()), lo_message_get_source (msg));
+ }
+ }
+
+ return route_send_fail ("pan_stereo_position", ssid, 0.5, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_pan_stereo_width (int ssid, float pos, lo_message msg)
+{
+ if (!session) return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+ if (s) {
+ if (s->pan_width_control()) {
+ s->pan_width_control()->set_value (pos, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+
+ return route_send_fail ("pan_stereo_width", ssid, 1, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_send_gain_dB (int ssid, int id, float val, lo_message msg)
+{
+ if (!session) {
+ return -1;
+ }
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+ float abs;
+ if (s) {
+ if (id > 0) {
+ --id;
+ }
+#ifdef MIXBUS
+ abs = val;
+#else
+ if (val < -192) {
+ abs = 0;
+ } else {
+ abs = dB_to_coefficient (val);
+ }
+#endif
+ if (s->send_level_controllable (id)) {
+ s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int
+OSC::route_set_send_fader (int ssid, int id, float val, lo_message msg)
+{
+ if (!session) {
+ return -1;
+ }
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+ float abs;
+ if (s) {
+
+ if (id > 0) {
+ --id;
+ }
+
+ if (s->send_level_controllable (id)) {
+#ifdef MIXBUS
+ abs = s->send_level_controllable(id)->interface_to_internal (val);
+#else
+ abs = slider_position_to_gain_with_max (val, 2.0);
+#endif
+ s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return 0;
+}
- if (sid > 0) {
- --sid;
+int
+OSC::sel_sendgain (int id, float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ float abs;
+ if (s) {
+ if (id > 0) {
+ --id;
+ }
+#ifdef MIXBUS
+ abs = val;
+#else
+ if (val < -192) {
+ abs = 0;
+ } else {
+ abs = dB_to_coefficient (val);
+ }
+#endif
+ if (s->send_level_controllable (id)) {
+ s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+ return 0;
+ }
}
+ return sel_send_fail ("send_gain", id + 1, -193, lo_message_get_source (msg));
+}
- boost::shared_ptr<Processor> p = r->nth_send (sid);
+int
+OSC::sel_sendfader (int id, float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ float abs;
+ if (s) {
- if (p) {
- boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p);
- boost::shared_ptr<Amp> a = s->amp();
+ if (id > 0) {
+ --id;
+ }
- if (a) {
- a->gain_control()->set_value (val, PBD::Controllable::NoGroup);
+ if (s->send_level_controllable (id)) {
+#ifdef MIXBUS
+ abs = s->send_level_controllable(id)->interface_to_internal (val);
+#else
+ abs = slider_position_to_gain_with_max (val, 2.0);
+#endif
+ s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+ return 0;
}
}
- return 0;
+ return sel_send_fail ("send_fader", id, 0, lo_message_get_source (msg));
}
int
-OSC::route_set_send_gain_dB (int rid, int sid, float val)
+OSC::route_set_send_enable (int ssid, int sid, float val, lo_message msg)
{
if (!session) {
return -1;
}
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+ if (s) {
- if (!r) {
- return -1;
- }
+ /* revert to zero-based counting */
+
+ if (sid > 0) {
+ --sid;
+ }
- /* revert to zero-based counting */
+ if (s->send_enable_controllable (sid)) {
+ s->send_enable_controllable (sid)->set_value (val, PBD::Controllable::NoGroup);
+ return 0;
+ }
- if (sid > 0) {
- --sid;
- }
+ if (s->send_level_controllable (sid)) {
+ return 0;
+ }
- boost::shared_ptr<Processor> p = r->nth_send (sid);
+ }
- if (p) {
- boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p);
- boost::shared_ptr<Amp> a = s->amp();
+ return -1;
+}
- if (a) {
- a->gain_control()->set_value (dB_to_coefficient (val), PBD::Controllable::NoGroup);
+int
+OSC::sel_sendenable (int id, float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (id > 0) {
+ --id;
+ }
+ if (s->send_enable_controllable (id)) {
+ s->send_enable_controllable (id)->set_value (val, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ if (s->send_level_controllable (id)) {
+ return sel_send_fail ("send_enable", id + 1, 1, lo_message_get_source (msg));
}
}
- return 0;
+ return sel_send_fail ("send_enable", id + 1, 0, lo_message_get_source (msg));
}
int
-OSC::route_plugin_parameter (int rid, int piid, int par, float val)
+OSC::route_plugin_parameter (int ssid, int piid, int par, float val, lo_message msg)
{
if (!session)
return -1;
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (s);
if (!r) {
- PBD::error << "OSC: Invalid Remote Control ID '" << rid << "'" << endmsg;
+ PBD::error << "OSC: Invalid Remote Control ID '" << ssid << "'" << endmsg;
return -1;
}
boost::shared_ptr<Processor> redi=r->nth_plugin (piid);
if (!redi) {
- PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << rid << "'" << endmsg;
+ PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << ssid << "'" << endmsg;
return -1;
}
boost::shared_ptr<PluginInsert> pi;
if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(redi))) {
- PBD::error << "OSC: given processor # " << piid << " on RID '" << rid << "' is not a Plugin." << endmsg;
+ PBD::error << "OSC: given processor # " << piid << " on RID '" << ssid << "' is not a Plugin." << endmsg;
return -1;
}
@@ -1259,39 +2575,41 @@ OSC::route_plugin_parameter (int rid, int piid, int par, float val)
uint32_t controlid = pip->nth_parameter (par,ok);
if (!ok) {
- PBD::error << "OSC: Cannot find parameter # " << par << " for plugin # " << piid << " on RID '" << rid << "'" << endmsg;
+ PBD::error << "OSC: Cannot find parameter # " << par << " for plugin # " << piid << " on RID '" << ssid << "'" << endmsg;
return -1;
}
if (!pip->parameter_is_input(controlid)) {
- PBD::error << "OSC: Parameter # " << par << " for plugin # " << piid << " on RID '" << rid << "' is not a control input" << endmsg;
+ PBD::error << "OSC: Parameter # " << par << " for plugin # " << piid << " on RID '" << ssid << "' is not a control input" << endmsg;
return -1;
}
ParameterDescriptor pd;
pi->plugin()->get_parameter_descriptor (controlid,pd);
- if (val >= pd.lower && val < pd.upper) {
+ if (val >= pd.lower && val <= pd.upper) {
boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));
// cerr << "parameter:" << redi->describe_parameter(controlid) << " val:" << val << "\n";
c->set_value (val, PBD::Controllable::NoGroup);
} else {
- PBD::warning << "OSC: Parameter # " << par << " for plugin # " << piid << " on RID '" << rid << "' is out of range" << endmsg;
+ PBD::warning << "OSC: Parameter # " << par << " for plugin # " << piid << " on RID '" << ssid << "' is out of range" << endmsg;
PBD::info << "OSC: Valid range min=" << pd.lower << " max=" << pd.upper << endmsg;
}
return 0;
}
+//prints to cerr only
int
-OSC::route_plugin_parameter_print (int rid, int piid, int par)
+OSC::route_plugin_parameter_print (int ssid, int piid, int par, lo_message msg)
{
if (!session) {
return -1;
}
+ boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
- boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (s);
if (!r) {
return -1;
@@ -1332,11 +2650,445 @@ OSC::route_plugin_parameter_print (int rid, int piid, int par)
return 0;
}
+// select
+
+int
+OSC::sel_pan_elevation (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->pan_elevation_control()) {
+ s->pan_elevation_control()->set_value (s->pan_elevation_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("pan_elevation_position", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_frontback (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->pan_frontback_control()) {
+ s->pan_frontback_control()->set_value (s->pan_frontback_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("pan_frontback_position", 0.5, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_lfe (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->pan_lfe_control()) {
+ s->pan_lfe_control()->set_value (s->pan_lfe_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("pan_lfe_control", 0, lo_message_get_source (msg));
+}
+
+// compressor control
+int
+OSC::sel_comp_enable (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->comp_enable_controllable()) {
+ s->comp_enable_controllable()->set_value (s->comp_enable_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("comp_enable", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_threshold (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->comp_threshold_controllable()) {
+ s->comp_threshold_controllable()->set_value (s->comp_threshold_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("comp_threshold", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_speed (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->comp_speed_controllable()) {
+ s->comp_speed_controllable()->set_value (s->comp_speed_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("comp_speed", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_mode (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->comp_mode_controllable()) {
+ s->comp_mode_controllable()->set_value (s->comp_mode_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("comp_mode", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_makeup (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->comp_makeup_controllable()) {
+ s->comp_makeup_controllable()->set_value (s->comp_makeup_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("comp_makeup", 0, lo_message_get_source (msg));
+}
+
+// EQ control
+
+int
+OSC::sel_eq_enable (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->eq_enable_controllable()) {
+ s->eq_enable_controllable()->set_value (s->eq_enable_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("eq_enable", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_hpf (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (s->eq_hpf_controllable()) {
+ s->eq_hpf_controllable()->set_value (s->eq_hpf_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_fail ("eq_hpf", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_gain (int id, float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (id > 0) {
+ --id;
+ }
+ if (s->eq_gain_controllable (id)) {
+ s->eq_gain_controllable (id)->set_value (s->eq_gain_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_send_fail ("eq_gain", id + 1, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_freq (int id, float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (id > 0) {
+ --id;
+ }
+ if (s->eq_freq_controllable (id)) {
+ s->eq_freq_controllable (id)->set_value (s->eq_freq_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_send_fail ("eq_freq", id + 1, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_q (int id, float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (id > 0) {
+ --id;
+ }
+ if (s->eq_q_controllable (id)) {
+ s->eq_q_controllable (id)->set_value (s->eq_q_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_send_fail ("eq_q", id + 1, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_shape (int id, float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, lo_message_get_source (msg));
+ } else {
+ s = _select;
+ }
+ if (s) {
+ if (id > 0) {
+ --id;
+ }
+ if (s->eq_shape_controllable (id)) {
+ s->eq_shape_controllable (id)->set_value (s->eq_shape_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return sel_send_fail ("eq_shape", id + 1, 0, lo_message_get_source (msg));
+}
+
+void
+OSC::gui_selection_changed ()
+{
+ boost::shared_ptr<Stripable> strip = ControlProtocol::first_selected_stripable();
+
+ if (strip) {
+ _select = strip;
+ for (uint32_t it = 0; it < _surface.size(); ++it) {
+ OSCSurface* sur = &_surface[it];
+ if(!sur->expand_enable) {
+ lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
+ _strip_select (strip, addr);
+ }
+ }
+ }
+}
+
+// timer callbacks
+bool
+OSC::periodic (void)
+{
+ if (!tick) {
+ Glib::usleep(100); // let flurry of signals subside
+ if (global_init) {
+ for (uint32_t it = 0; it < _surface.size(); it++) {
+ OSCSurface* sur = &_surface[it];
+ lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
+ global_feedback (sur->feedback, addr, sur->gainmode);
+ }
+ global_init = false;
+ tick = true;
+ }
+ if (bank_dirty) {
+ _recalcbanks ();
+ bank_dirty = false;
+ tick = true;
+ }
+ }
+
+ for (GlobalObservers::iterator x = global_observers.begin(); x != global_observers.end(); x++) {
+
+ OSCGlobalObserver* go;
+
+ if ((go = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+ go->tick();
+ }
+ }
+ for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end(); x++) {
+
+ OSCRouteObserver* ro;
+
+ if ((ro = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
+ ro->tick();
+ }
+ }
+ for (uint32_t it = 0; it < _surface.size(); it++) {
+ OSCSurface* sur = &_surface[it];
+ OSCSelectObserver* so;
+ if ((so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs)) != 0) {
+ so->tick();
+ }
+ }
+ return true;
+}
+
+int
+OSC::route_send_fail (string path, uint32_t ssid, float val, lo_address addr)
+{
+ OSCSurface *sur = get_surface(addr);
+
+ ostringstream os;
+ lo_message reply;
+ if (ssid) {
+ reply = lo_message_new ();
+ if (sur->feedback[2]) {
+ os << "/strip/" << path << "/" << ssid;
+ } else {
+ os << "/strip/" << path;
+ lo_message_add_int32 (reply, ssid);
+ }
+ string str_pth = os.str();
+ lo_message_add_float (reply, (float) val);
+
+ lo_send_message (addr, str_pth.c_str(), reply);
+ lo_message_free (reply);
+ }
+ if ((_select == get_strip (ssid, addr)) || ((sur->expand == ssid) && (sur->expand_enable))) {
+ os.str("");
+ os << "/select/" << path;
+ string sel_pth = os.str();
+ reply = lo_message_new ();
+ lo_message_add_float (reply, (float) val);
+ lo_send_message (addr, sel_pth.c_str(), reply);
+ lo_message_free (reply);
+ }
+
+ return 0;
+}
+
+int
+OSC::sel_fail (string path, float val, lo_address addr)
+{
+ ostringstream os;
+ os.str("");
+ os << "/select/" << path;
+ string sel_pth = os.str();
+ lo_message reply = lo_message_new ();
+ lo_message_add_float (reply, (float) val);
+ lo_send_message (addr, sel_pth.c_str(), reply);
+ lo_message_free (reply);
+
+ return 0;
+}
+
+int
+OSC::sel_send_fail (string path, uint32_t id, float val, lo_address addr)
+{
+ OSCSurface *sur = get_surface(addr);
+
+ ostringstream os;
+ lo_message reply;
+ reply = lo_message_new ();
+ if (sur->feedback[2]) {
+ os << "/select/" << path << "/" << id;
+ } else {
+ os << "/select/" << path;
+ lo_message_add_int32 (reply, id);
+ }
+ string str_pth = os.str();
+ lo_message_add_float (reply, (float) val);
+
+ lo_send_message (addr, str_pth.c_str(), reply);
+ lo_message_free (reply);
+
+ return 0;
+}
+
XMLNode&
OSC::get_state ()
{
XMLNode& node (ControlProtocol::get_state());
node.add_property("debugmode", (int) _debugmode); // TODO: enum2str
+ if (_surface.size()) {
+ XMLNode* config = new XMLNode (X_("Configurations"));
+ for (uint32_t it = 0; it < _surface.size(); ++it) {
+ OSCSurface* sur = &_surface[it];
+ XMLNode* devnode = new XMLNode (X_("Configuration"));
+ devnode->add_property (X_("url"), sur->remote_url);
+ devnode->add_property (X_("bank-size"), sur->bank_size);
+ devnode->add_property (X_("strip-types"), sur->strip_types.to_ulong());
+ devnode->add_property (X_("feedback"), sur->feedback.to_ulong());
+ devnode->add_property (X_("gainmode"), sur->gainmode);
+ config->add_child_nocopy (*devnode);
+ }
+ node.add_child_nocopy (*config);
+ }
return node;
}
@@ -1350,6 +3102,116 @@ OSC::set_state (const XMLNode& node, int version)
if (p) {
_debugmode = OSCDebugMode (PBD::atoi(p->value ()));
}
+ XMLNode* cnode = node.child (X_("Configurations"));
+
+ if (cnode) {
+ XMLNodeList const& devices = cnode->children();
+ for (XMLNodeList::const_iterator d = devices.begin(); d != devices.end(); ++d) {
+ XMLProperty const * prop = (*d)->property (X_("url"));
+ if (prop) {
+ OSCSurface s;
+ bank_dirty = true;
+ s.remote_url = prop->value();
+ prop = (*d)->property (X_("bank-size"));
+ if (prop) {
+ s.bank_size = atoi (prop->value().c_str());
+ }
+ prop = (*d)->property (X_("strip-types"));
+ if (prop) {
+ s.strip_types = atoi (prop->value().c_str());
+ }
+ prop = (*d)->property (X_("feedback"));
+ if (prop) {
+ s.feedback = atoi (prop->value().c_str());
+ }
+ prop = (*d)->property (X_("gainmode"));
+ if (prop) {
+ s.gainmode = atoi (prop->value().c_str());
+ }
+ s.bank = 1;
+ s.sel_obs = 0;
+ s.expand = 0;
+ s.expand_enable = false;
+ s.strips = get_sorted_stripables(s.strip_types);
+ s.nstrips = s.strips.size();
+ _surface.push_back (s);
+ }
+ }
+ }
+ global_init = true;
+ tick = false;
return 0;
}
+
+// predicate for sort call in get_sorted_stripables
+struct StripableByPresentationOrder
+{
+ bool operator () (const boost::shared_ptr<Stripable> & a, const boost::shared_ptr<Stripable> & b) const
+ {
+ return a->presentation_info().order() < b->presentation_info().order();
+ }
+
+ bool operator () (const Stripable & a, const Stripable & b) const
+ {
+ return a.presentation_info().order() < b.presentation_info().order();
+ }
+
+ bool operator () (const Stripable * a, const Stripable * b) const
+ {
+ return a->presentation_info().order() < b->presentation_info().order();
+ }
+};
+
+OSC::Sorted
+OSC::get_sorted_stripables(std::bitset<32> types)
+{
+ Sorted sorted;
+
+ // fetch all stripables
+ StripableList stripables;
+
+ session->get_stripables (stripables);
+
+ // Look for stripables that match bit in sur->strip_types
+ for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) {
+
+ boost::shared_ptr<Stripable> s = *it;
+ if ((!types[9]) && (s->presentation_info().flags() & PresentationInfo::Hidden)) {
+ // do nothing... skip it
+ } else {
+
+ if (types[0] && (s->presentation_info().flags() & PresentationInfo::AudioTrack)) {
+ sorted.push_back (s);
+ } else
+ if (types[1] && (s->presentation_info().flags() & PresentationInfo::MidiTrack)) {
+ sorted.push_back (s);
+ } else
+ if (types[2] && (s->presentation_info().flags() & PresentationInfo::AudioBus)) {
+ sorted.push_back (s);
+ } else
+ if (types[3] && (s->presentation_info().flags() & PresentationInfo::MidiBus)) {
+ sorted.push_back (s);
+ } else
+ if (types[4] && (s->presentation_info().flags() & PresentationInfo::VCA)) {
+ sorted.push_back (s);
+ } else
+ if (types[8] && (s->presentation_info().flags() & PresentationInfo::Selected)) {
+ sorted.push_back (s);
+ } else
+ if (types[9] && (s->presentation_info().flags() & PresentationInfo::Hidden)) {
+ sorted.push_back (s);
+ }
+ }
+ }
+ sort (sorted.begin(), sorted.end(), StripableByPresentationOrder());
+ // Master/Monitor might be anywhere... we put them at the end - Sorry ;)
+ if (types[5]) {
+ sorted.push_back (session->master_out());
+ }
+ if (types[6]) {
+ sorted.push_back (session->monitor_out());
+ }
+ return sorted;
+}
+
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index a3b83e0..a30d84e 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -21,6 +21,8 @@
#define ardour_osc_h
#include <string>
+#include <vector>
+#include <bitset>
#include <sys/time.h>
#include <pthread.h>
@@ -37,10 +39,12 @@
#include "ardour/types.h"
#include "control_protocol/control_protocol.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
class OSCControllable;
class OSCRouteObserver;
+class OSCGlobalObserver;
+class OSCSelectObserver;
namespace ARDOUR {
class Session;
@@ -80,7 +84,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int set_feedback (bool yn);
bool get_feedback () const;
- void set_namespace_root (std::string);
int start ();
int stop ();
@@ -93,6 +96,46 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
All
};
+ typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > Sorted;
+ Sorted get_sorted_stripables(std::bitset<32> types);
+
+// keep a surface's global setup by remote server url
+ struct OSCSurface {
+ public:
+ std::string remote_url; // the url these setting belong to
+ uint32_t bank; // current bank
+ uint32_t bank_size; // size of banks for this surface
+ std::bitset<32> strip_types;// what strip types are a part of this bank
+ uint32_t nstrips; // how many strips are there for strip_types
+ std::bitset<32> feedback; // What is fed back? strips/meters/timecode/bar_beat/global
+ int gainmode; // what kind of faders do we have Gain db or position 0 to 1?
+ uint32_t expand; // Used by /select/select
+ bool expand_enable; // use expand instead of select
+ OSCSelectObserver* sel_obs; // So we can sync select feedback with selected channel
+ Sorted strips; // list of stripables for this surface
+ };
+ /*
+ * feedback bits:
+ * [0] - Strips - buttons
+ * [1] - Strips - variables (pots/faders)
+ * [2] - Strips - Send SSID as path extension
+ * [3] - Send heart beat to surface
+ * [4] - Send feedback for master/global buttons/variables
+ * [5] - Send Bar and Beat
+ * [6] - Send Time code
+ * [7] - Send metering as dB or positional depending on gainmode
+ * [8] - Send metering as 16 bits (led strip)
+ * [9] - Send signal present (signal greater than -20dB)
+ * [10] - Send Playhead position as samples
+ * [11] - Send Playhead position as minutes seconds
+ * [12] - Send Playhead position like primary/secondary GUI clocks
+ */
+
+
+// storage for each surface's settings
+ typedef std::vector<OSCSurface> Surface;
+ Surface _surface;
+
std::string get_server_url ();
void set_debug_mode (OSCDebugMode m) { _debugmode = m; }
OSCDebugMode get_debug_mode () { return _debugmode; }
@@ -114,9 +157,12 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
lo_server _osc_unix_server;
std::string _osc_unix_socket_path;
std::string _osc_url_file;
- std::string _namespace_root;
bool _send_route_changes;
OSCDebugMode _debugmode;
+ bool tick;
+ bool bank_dirty;
+ bool global_init;
+ boost::shared_ptr<ARDOUR::Stripable> _select; // which stripable out of /surface/stripables is gui selected
void register_callbacks ();
@@ -129,6 +175,10 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
// end "Application Hook" handles
std::string get_unix_server_url ();
+ OSCSurface * get_surface (lo_address addr);
+ uint32_t get_sid (boost::shared_ptr<ARDOUR::Stripable> strip, lo_address addr);
+ boost::shared_ptr<ARDOUR::Stripable> get_strip (uint32_t ssid, lo_address addr);
+ void global_feedback (std::bitset<32> feedback, lo_address addr, uint32_t gainmode);
void send_current_value (const char* path, lo_arg** argv, int argc, lo_message msg);
void current_value_query (const char* path, size_t len, lo_arg **argv, int argc, lo_message msg);
@@ -154,6 +204,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
} \
int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
OSC_DEBUG; \
+ if (argc > 0 && !strcmp (types, "f") && argv[0]->f != 1.0) { return 0; } \
name (data); \
return 0; \
}
@@ -162,6 +213,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK_MSG(transport_frame);
PATH_CALLBACK_MSG(transport_speed);
PATH_CALLBACK_MSG(record_enabled);
+ PATH_CALLBACK_MSG(bank_up);
+ PATH_CALLBACK_MSG(bank_down);
#define PATH_CALLBACK(name) \
static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -193,6 +246,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK(toggle_all_rec_enables);
PATH_CALLBACK(all_tracks_rec_in);
PATH_CALLBACK(all_tracks_rec_out);
+ PATH_CALLBACK(cancel_all_solos);
PATH_CALLBACK(remove_marker_at_playhead);
PATH_CALLBACK(mark_in);
PATH_CALLBACK(mark_out);
@@ -246,6 +300,57 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK1(jump_by_bars,f,);
PATH_CALLBACK1(jump_by_seconds,f,);
+ PATH_CALLBACK1(master_set_gain,f,);
+ PATH_CALLBACK1(master_set_fader,f,);
+ PATH_CALLBACK1(master_set_trim,f,);
+ PATH_CALLBACK1(master_set_mute,i,);
+ PATH_CALLBACK1(monitor_set_gain,f,);
+ PATH_CALLBACK1(monitor_set_fader,f,);
+
+#define PATH_CALLBACK1_MSG(name,arg1type) \
+ static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
+ return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
+ } \
+ int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
+ OSC_DEBUG; \
+ if (argc > 0) { \
+ name (argv[0]->arg1type, data); \
+ } \
+ return 0; \
+ }
+
+ // pan position needs message info to send feedback
+ PATH_CALLBACK1_MSG(master_set_pan_stereo_position,f);
+
+ PATH_CALLBACK1_MSG(set_surface_bank_size,i);
+ PATH_CALLBACK1_MSG(set_surface_strip_types,i);
+ PATH_CALLBACK1_MSG(set_surface_feedback,i);
+ PATH_CALLBACK1_MSG(set_surface_gainmode,i);
+ PATH_CALLBACK1_MSG(sel_recenable,i);
+ PATH_CALLBACK1_MSG(sel_recsafe,i);
+ PATH_CALLBACK1_MSG(sel_mute,i);
+ PATH_CALLBACK1_MSG(sel_solo,i);
+ PATH_CALLBACK1_MSG(sel_solo_iso,i);
+ PATH_CALLBACK1_MSG(sel_solo_safe,i);
+ PATH_CALLBACK1_MSG(sel_monitor_input,i);
+ PATH_CALLBACK1_MSG(sel_monitor_disk,i);
+ PATH_CALLBACK1_MSG(sel_phase,i);
+ PATH_CALLBACK1_MSG(sel_gain,f);
+ PATH_CALLBACK1_MSG(sel_fader,f);
+ PATH_CALLBACK1_MSG(sel_trim,f);
+ PATH_CALLBACK1_MSG(sel_pan_position,f);
+ PATH_CALLBACK1_MSG(sel_pan_width,f);
+ PATH_CALLBACK1_MSG(sel_pan_elevation,f);
+ PATH_CALLBACK1_MSG(sel_pan_frontback,f);
+ PATH_CALLBACK1_MSG(sel_pan_lfe,f);
+ PATH_CALLBACK1_MSG(sel_comp_enable,f);
+ PATH_CALLBACK1_MSG(sel_comp_threshold,f);
+ PATH_CALLBACK1_MSG(sel_comp_speed,f);
+ PATH_CALLBACK1_MSG(sel_comp_mode,f);
+ PATH_CALLBACK1_MSG(sel_comp_makeup,f);
+ PATH_CALLBACK1_MSG(sel_eq_enable,f);
+ PATH_CALLBACK1_MSG(sel_eq_hpf,f);
+ PATH_CALLBACK1_MSG(sel_expand,i);
#define PATH_CALLBACK2(name,arg1type,arg2type) \
static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -259,14 +364,26 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
return 0; \
}
+#define PATH_CALLBACK2_MSG(name,arg1type,arg2type) \
+ static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
+ return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
+ } \
+ int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
+ OSC_DEBUG; \
+ if (argc > 1) { \
+ name (argv[0]->arg1type, argv[1]->arg2type, data); \
+ } \
+ return 0; \
+ }
+
#define PATH_CALLBACK3(name,arg1type,arg2type,arg3type) \
static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
} \
- int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *) { \
+ int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
OSC_DEBUG; \
if (argc > 1) { \
- name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type); \
+ name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type, data); \
} \
return 0; \
}
@@ -275,55 +392,152 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
} \
- int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *) { \
+ int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
OSC_DEBUG; \
if (argc > 1) { \
- name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type,argv[3]->arg4type); \
+ name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type,argv[3]->arg4type, data); \
} \
return 0; \
}
- PATH_CALLBACK2(locate,i,i);
- PATH_CALLBACK2(loop_location,i,i);
- PATH_CALLBACK2(route_mute,i,i);
- PATH_CALLBACK2(route_solo,i,i);
- PATH_CALLBACK2(route_recenable,i,i);
- PATH_CALLBACK2(route_set_gain_abs,i,f);
- PATH_CALLBACK2(route_set_gain_dB,i,f);
- PATH_CALLBACK2(route_set_trim_abs,i,f);
- PATH_CALLBACK2(route_set_trim_dB,i,f);
- PATH_CALLBACK2(route_set_pan_stereo_position,i,f);
- PATH_CALLBACK2(route_set_pan_stereo_width,i,f);
- PATH_CALLBACK3(route_set_send_gain_abs,i,i,f);
- PATH_CALLBACK3(route_set_send_gain_dB,i,i,f);
- PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
- PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
-
- int route_mute (int rid, int yn);
- int route_solo (int rid, int yn);
- int route_recenable (int rid, int yn);
- int route_set_gain_abs (int rid, float level);
- int route_set_gain_dB (int rid, float dB);
- int route_set_trim_abs (int rid, float level);
- int route_set_trim_dB (int rid, float dB);
- int route_set_pan_stereo_position (int rid, float left_right_fraction);
- int route_set_pan_stereo_width (int rid, float percent);
- int route_set_send_gain_abs (int rid, int sid, float val);
- int route_set_send_gain_dB (int rid, int sid, float val);
- int route_plugin_parameter (int rid, int piid,int par, float val);
- int route_plugin_parameter_print (int rid, int piid,int par);
-
- void listen_to_route (boost::shared_ptr<ARDOUR::Route>, lo_address);
- void end_listen (boost::shared_ptr<ARDOUR::Route>, lo_address);
- void drop_route (boost::weak_ptr<ARDOUR::Route>);
+ PATH_CALLBACK2_MSG(sel_sendgain,i,f);
+ PATH_CALLBACK2_MSG(sel_sendfader,i,f);
+ PATH_CALLBACK2_MSG(sel_sendenable,i,f);
+ PATH_CALLBACK2_MSG(sel_eq_gain,i,f);
+ PATH_CALLBACK2_MSG(sel_eq_freq,i,f);
+ PATH_CALLBACK2_MSG(sel_eq_q,i,f);
+ PATH_CALLBACK2_MSG(sel_eq_shape,i,f);
+
+ PATH_CALLBACK4(set_surface,i,i,i,i);
+ PATH_CALLBACK2(locate,i,i);
+ PATH_CALLBACK2(loop_location,i,i);
+ PATH_CALLBACK2_MSG(route_mute,i,i);
+ PATH_CALLBACK2_MSG(route_solo,i,i);
+ PATH_CALLBACK2_MSG(route_solo_iso,i,i);
+ PATH_CALLBACK2_MSG(route_solo_safe,i,i);
+ PATH_CALLBACK2_MSG(route_recenable,i,i);
+ PATH_CALLBACK2_MSG(route_recsafe,i,i);
+ PATH_CALLBACK2_MSG(route_monitor_input,i,i);
+ PATH_CALLBACK2_MSG(route_monitor_disk,i,i);
+ PATH_CALLBACK2_MSG(strip_phase,i,i);
+ PATH_CALLBACK2_MSG(strip_expand,i,i);
+ PATH_CALLBACK2_MSG(strip_gui_select,i,i);
+ PATH_CALLBACK2_MSG(route_set_gain_dB,i,f);
+ PATH_CALLBACK2_MSG(route_set_gain_fader,i,f);
+ PATH_CALLBACK2_MSG(route_set_trim_dB,i,f);
+ PATH_CALLBACK2_MSG(route_set_pan_stereo_position,i,f);
+ PATH_CALLBACK2_MSG(route_set_pan_stereo_width,i,f);
+ PATH_CALLBACK3(route_set_send_gain_dB,i,i,f);
+ PATH_CALLBACK3(route_set_send_fader,i,i,f);
+ PATH_CALLBACK3(route_set_send_enable,i,i,f);
+ PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
+ PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
+
+ int route_mute (int rid, int yn, lo_message msg);
+ int route_solo (int rid, int yn, lo_message msg);
+ int route_solo_iso (int rid, int yn, lo_message msg);
+ int route_solo_safe (int rid, int yn, lo_message msg);
+ int route_recenable (int rid, int yn, lo_message msg);
+ int route_recsafe (int ssid, int yn, lo_message msg);
+ int route_monitor_input (int rid, int yn, lo_message msg);
+ int route_monitor_disk (int rid, int yn, lo_message msg);
+ int strip_phase (int rid, int yn, lo_message msg);
+ int strip_expand (int rid, int yn, lo_message msg);
+ int _strip_select (boost::shared_ptr<ARDOUR::Stripable> s, lo_address addr);
+ int strip_gui_select (int rid, int yn, lo_message msg);
+ int route_set_gain_abs (int rid, float level, lo_message msg);
+ int route_set_gain_dB (int rid, float dB, lo_message msg);
+ int route_set_gain_fader (int rid, float pos, lo_message msg);
+ int route_set_trim_abs (int rid, float level, lo_message msg);
+ int route_set_trim_dB (int rid, float dB, lo_message msg);
+ int route_set_pan_stereo_position (int rid, float left_right_fraction, lo_message msg);
+ int route_set_pan_stereo_width (int rid, float percent, lo_message msg);
+ int route_set_send_gain_dB (int rid, int sid, float val, lo_message msg);
+ int route_set_send_fader (int rid, int sid, float val, lo_message msg);
+ int route_set_send_enable (int rid, int sid, float val, lo_message msg);
+ int route_plugin_parameter (int rid, int piid,int par, float val, lo_message msg);
+ int route_plugin_parameter_print (int rid, int piid,int par, lo_message msg);
+
+ //banking functions
+ int set_bank (uint32_t bank_start, lo_message msg);
+ int _set_bank (uint32_t bank_start, lo_address addr);
+ int bank_up (lo_message msg);
+ int bank_down (lo_message msg);
+ int set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gmode, lo_message msg);
+ int set_surface_bank_size (uint32_t bs, lo_message msg);
+ int set_surface_strip_types (uint32_t st, lo_message msg);
+ int set_surface_feedback (uint32_t fb, lo_message msg);
+ int set_surface_gainmode (uint32_t gm, lo_message msg);
+
+ int master_set_gain (float dB);
+ int master_set_fader (float position);
+ int master_set_trim (float dB);
+ int master_set_pan_stereo_position (float position, lo_message msg);
+ int master_set_mute (uint32_t state);
+ int monitor_set_gain (float dB);
+ int monitor_set_fader (float position);
+ int sel_recenable (uint32_t state, lo_message msg);
+ int sel_recsafe (uint32_t state, lo_message msg);
+ int sel_mute (uint32_t state, lo_message msg);
+ int sel_solo (uint32_t state, lo_message msg);
+ int sel_solo_iso (uint32_t state, lo_message msg);
+ int sel_solo_safe (uint32_t state, lo_message msg);
+ int sel_monitor_input (uint32_t state, lo_message msg);
+ int sel_monitor_disk (uint32_t state, lo_message msg);
+ int sel_phase (uint32_t state, lo_message msg);
+ int sel_gain (float state, lo_message msg);
+ int sel_fader (float state, lo_message msg);
+ int sel_trim (float val, lo_message msg);
+ int sel_pan_position (float val, lo_message msg);
+ int sel_pan_width (float val, lo_message msg);
+ int sel_sendgain (int id, float dB, lo_message msg);
+ int sel_sendfader (int id, float pos, lo_message msg);
+ int sel_sendenable (int id, float pos, lo_message msg);
+ int sel_expand (uint32_t state, lo_message msg);
+ int sel_pan_elevation (float val, lo_message msg);
+ int sel_pan_frontback (float val, lo_message msg);
+ int sel_pan_lfe (float val, lo_message msg);
+ int sel_comp_enable (float val, lo_message msg);
+ int sel_comp_threshold (float val, lo_message msg);
+ int sel_comp_speed (float val, lo_message msg);
+ int sel_comp_mode (float val, lo_message msg);
+ int sel_comp_makeup (float val, lo_message msg);
+ int sel_eq_enable (float val, lo_message msg);
+ int sel_eq_hpf (float val, lo_message msg);
+ int sel_eq_gain (int id, float val, lo_message msg);
+ int sel_eq_freq (int id, float val, lo_message msg);
+ int sel_eq_q (int id, float val, lo_message msg);
+ int sel_eq_shape (int id, float val, lo_message msg);
+
+ void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
+ void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
+ void drop_route (boost::weak_ptr<ARDOUR::Stripable>);
+ void route_lost (boost::weak_ptr<ARDOUR::Stripable>);
+ void gui_selection_changed (void);
void route_name_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route> r, lo_address addr);
+ void recalcbanks ();
+ void _recalcbanks ();
+ void notify_routes_added (ARDOUR::RouteList &);
+ void notify_vca_added (ARDOUR::VCAList &);
void update_clock ();
+ int cancel_all_solos ();
+ bool periodic (void);
+ sigc::connection periodic_connection;
+ PBD::ScopedConnectionList session_connections;
+
+ int route_send_fail (std::string path, uint32_t ssid, float val, lo_address addr);
+ int sel_send_fail (std::string path, uint32_t id, float val, lo_address addr);
+ int sel_fail (std::string path, float val, lo_address addr);
typedef std::list<OSCRouteObserver*> RouteObservers;
RouteObservers route_observers;
+
+ typedef std::list<OSCGlobalObserver*> GlobalObservers;
+ GlobalObservers global_observers;
+
void debugmsg (const char *prefix, const char *path, const char* types, lo_arg **argv, int argc);
static OSC* _instance;
diff --git a/libs/surfaces/osc/osc_controllable.cc b/libs/surfaces/osc/osc_controllable.cc
index 2cd4c31..23bc4a7 100644
--- a/libs/surfaces/osc/osc_controllable.cc
+++ b/libs/surfaces/osc/osc_controllable.cc
@@ -27,7 +27,6 @@
#include "osc.h"
#include "osc_controllable.h"
-using namespace sigc;
using namespace PBD;
using namespace ARDOUR;
using namespace ArdourSurface;
@@ -90,7 +89,9 @@ OSCRouteControllable::send_change_message ()
{
lo_message msg = lo_message_new ();
- lo_message_add_int32 (msg, _route->remote_control_id());
+ /* Can only send ID part of RID at present */
+
+ lo_message_add_int32 (msg, _route->presentation_info().order());
lo_message_add_float (msg, (float) controllable->get_value());
/* XXX thread issues */
diff --git a/libs/surfaces/osc/osc_global_observer.cc b/libs/surfaces/osc/osc_global_observer.cc
new file mode 100644
index 0000000..72928e3
--- /dev/null
+++ b/libs/surfaces/osc/osc_global_observer.cc
@@ -0,0 +1,382 @@
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "boost/lambda/lambda.hpp"
+
+#include "ardour/session.h"
+#include "ardour/dB.h"
+#include "ardour/meter.h"
+
+#include "osc.h"
+#include "osc_global_observer.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+using namespace ArdourSurface;
+
+OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std::bitset<32> fb)
+ : gainmode (gm)
+ ,feedback (fb)
+{
+ if (feedback[4]) {
+ addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+ session = &s;
+ _last_frame = -1;
+
+ // connect to all the things we want to send feed back from
+
+ /*
+ * Master (todo)
+ * Pan width
+ */
+
+ // Master channel first
+ boost::shared_ptr<Stripable> strip = session->master_out();
+
+ boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
+ mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
+ send_change_message ("/master/mute", strip->mute_control());
+
+ boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
+ trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_trim_message, this, X_("/master/trimdB"), strip->trim_control()), OSC::instance());
+ send_trim_message ("/master/trimdB", strip->trim_control());
+
+ boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
+ if (pan_controllable) {
+ pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/pan_stereo_position"), strip->pan_azimuth_control()), OSC::instance());
+ send_change_message ("/master/pan_stereo_position", strip->pan_azimuth_control());
+ }
+
+ boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
+ if (gainmode) {
+ gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/fader"), strip->gain_control()), OSC::instance());
+ send_gain_message ("/master/fader", strip->gain_control());
+ } else {
+ gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/gain"), strip->gain_control()), OSC::instance());
+ send_gain_message ("/master/gain", strip->gain_control());
+ }
+
+ // monitor stuff next
+ /*
+ * Monitor (todo)
+ * Mute
+ * Dim
+ * Mono
+ * Rude Solo
+ * etc.
+ */
+ strip = session->monitor_out();
+ if (strip) {
+
+ // Hmm, it seems the monitor mute is not at route->mute_control()
+ /*boost::shared_ptr<Controllable> mute_controllable2 = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
+ //mute_controllable = boost::dynamic_pointer_cast<Controllable>(r2->mute_control());
+ mute_controllable2->Changed.connect (monitor_mute_connection, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/monitor/mute"), strip->mute_control()), OSC::instance());
+ send_change_message ("/monitor/mute", strip->mute_control());
+ */
+ gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
+ if (gainmode) {
+ gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/fader"), strip->gain_control()), OSC::instance());
+ send_gain_message ("/monitor/fader", strip->gain_control());
+ } else {
+ gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/gain"), strip->gain_control()), OSC::instance());
+ send_gain_message ("/monitor/gain", strip->gain_control());
+ }
+ }
+
+ /*
+ * Transport (todo)
+ * punchin/out
+ */
+ //Transport feedback
+ session->TransportStateChange.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
+ send_transport_state_changed ();
+ session->TransportLooped.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
+ session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_record_state_changed, this), OSC::instance());
+ send_record_state_changed ();
+
+ // session feedback
+ session->StateSaved.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_session_saved, this, _1), OSC::instance());
+ send_session_saved (session->snap_name());
+ session->SoloActive.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::solo_active, this, _1), OSC::instance());
+ solo_active (session->soloing() || session->listening());
+
+ /*
+ * Maybe (many) more
+ */
+ }
+}
+
+OSCGlobalObserver::~OSCGlobalObserver ()
+{
+
+ strip_connections.drop_connections ();
+ session_connections.drop_connections ();
+
+ lo_address_free (addr);
+}
+
+void
+OSCGlobalObserver::tick ()
+{
+ framepos_t now_frame = session->transport_frame();
+ if (now_frame != _last_frame) {
+ if (feedback[6]) { // timecode enabled
+ Timecode::Time timecode;
+ session->timecode_time (now_frame, timecode);
+
+ // Timecode mode: Hours/Minutes/Seconds/Frames
+ ostringstream os;
+ os << setw(2) << setfill('0') << timecode.hours;
+ os << ':';
+ os << setw(2) << setfill('0') << timecode.minutes;
+ os << ':';
+ os << setw(2) << setfill('0') << timecode.seconds;
+ os << ':';
+ os << setw(2) << setfill('0') << timecode.frames;
+
+ lo_message msg = lo_message_new ();
+ lo_message_add_string (msg, os.str().c_str());
+ lo_send_message (addr, "/position/smpte", msg);
+ lo_message_free (msg);
+ }
+ if (feedback[5]) { // Bar beat enabled
+ Timecode::BBT_Time bbt_time;
+
+ session->bbt_time (now_frame, bbt_time);
+
+ // semantics: BBB/bb/tttt
+ ostringstream os;
+
+ os << setw(3) << setfill('0') << bbt_time.bars;
+ os << '|';
+ os << setw(2) << setfill('0') << bbt_time.beats;
+ os << '|';
+ os << setw(4) << setfill('0') << bbt_time.ticks;
+
+ lo_message msg = lo_message_new ();
+ lo_message_add_string (msg, os.str().c_str());
+ lo_send_message (addr, "/position/bbt", msg);
+ lo_message_free (msg);
+ }
+ if (feedback[11]) { // minutes/seconds enabled
+ framepos_t left = now_frame;
+ int hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+ left -= (framecnt_t) floor (hrs * session->frame_rate() * 60.0f * 60.0f);
+ int mins = (int) floor (left / (session->frame_rate() * 60.0f));
+ left -= (framecnt_t) floor (mins * session->frame_rate() * 60.0f);
+ int secs = (int) floor (left / (float) session->frame_rate());
+ left -= (framecnt_t) floor ((double)(secs * session->frame_rate()));
+ int millisecs = floor (left * 1000.0 / (float) session->frame_rate());
+
+ // Min/sec mode: Hours/Minutes/Seconds/msec
+ ostringstream os;
+ os << setw(2) << setfill('0') << hrs;
+ os << ':';
+ os << setw(2) << setfill('0') << mins;
+ os << ':';
+ os << setw(2) << setfill('0') << secs;
+ os << '.';
+ os << setw(3) << setfill('0') << millisecs;
+
+ lo_message msg = lo_message_new ();
+ lo_message_add_string (msg, os.str().c_str());
+ lo_send_message (addr, "/position/time", msg);
+ lo_message_free (msg);
+ }
+ if (feedback[10]) { // samples
+ ostringstream os;
+ os << now_frame;
+ lo_message msg = lo_message_new ();
+ lo_message_add_string (msg, os.str().c_str());
+ lo_send_message (addr, "/position/samples", msg);
+ lo_message_free (msg);
+ }
+ _last_frame = now_frame;
+ }
+ if (feedback[3]) { //heart beat enabled
+ if (_heartbeat == 10) {
+ lo_message msg = lo_message_new ();
+ lo_message_add_float (msg, 1.0);
+ lo_send_message (addr, "/heartbeat", msg);
+ lo_message_free (msg);
+ }
+ if (!_heartbeat) {
+ lo_message msg = lo_message_new ();
+ lo_message_add_float (msg, 0.0);
+ lo_send_message (addr, "/heartbeat", msg);
+ lo_message_free (msg);
+ }
+ _heartbeat++;
+ if (_heartbeat > 20) _heartbeat = 0;
+ }
+ if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
+ // the only meter here is master
+ float now_meter = session->master_out()->peak_meter()->meter_level(0, MeterMCP);
+ if (now_meter < -94) now_meter = -193;
+ if (_last_meter != now_meter) {
+ if (feedback[7] || feedback[8]) {
+ lo_message msg = lo_message_new ();
+ if (gainmode && feedback[7]) {
+ // change from db to 0-1
+ lo_message_add_float (msg, ((now_meter + 94) / 100));
+ lo_send_message (addr, "/master/meter", msg);
+ } else if ((!gainmode) && feedback[7]) {
+ lo_message_add_float (msg, now_meter);
+ lo_send_message (addr, "/master/meter", msg);
+ } else if (feedback[8]) {
+ uint32_t ledlvl = (uint32_t)(((now_meter + 54) / 3.75)-1);
+ uint32_t ledbits = ~(0xfff<<ledlvl);
+ lo_message_add_int32 (msg, ledbits);
+ lo_send_message (addr, "/master/meter", msg);
+ }
+ lo_message_free (msg);
+ }
+ if (feedback[9]) {
+ lo_message msg = lo_message_new ();
+ float signal;
+ if (now_meter < -40) {
+ signal = 0;
+ } else {
+ signal = 1;
+ }
+ lo_message_add_float (msg, signal);
+ lo_send_message (addr, "/master/signal", msg);
+ lo_message_free (msg);
+ }
+ }
+ _last_meter = now_meter;
+
+ }
+}
+
+void
+OSCGlobalObserver::send_change_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ lo_message_add_float (msg, (float) controllable->get_value());
+
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCGlobalObserver::send_gain_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ if (gainmode) {
+ lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
+ } else {
+ if (controllable->get_value() < 1e-15) {
+ lo_message_add_float (msg, -200);
+ } else {
+ lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
+ }
+ }
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCGlobalObserver::send_trim_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ lo_message_add_float (msg, (float) accurate_coefficient_to_dB (controllable->get_value()));
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+
+void
+OSCGlobalObserver::send_transport_state_changed()
+{
+
+ lo_message msg = lo_message_new ();
+ lo_message_add_int32 (msg, session->get_play_loop());
+ lo_send_message (addr, "/loop_toggle", msg);
+ lo_message_free (msg);
+
+ msg = lo_message_new ();
+ lo_message_add_int32 (msg, session->transport_speed() == 1.0);
+ lo_send_message (addr, "/transport_play", msg);
+ lo_message_free (msg);
+
+ msg = lo_message_new ();
+ lo_message_add_int32 (msg, session->transport_stopped ());
+ lo_send_message (addr, "/transport_stop", msg);
+ lo_message_free (msg);
+
+ msg = lo_message_new ();
+ lo_message_add_int32 (msg, session->transport_speed() < 0.0);
+ lo_send_message (addr, "/rewind", msg);
+ lo_message_free (msg);
+
+ msg = lo_message_new ();
+ lo_message_add_int32 (msg, (session->transport_speed() != 1.0 && session->transport_speed() > 0.0));
+ lo_send_message (addr, "/ffwd", msg);
+ lo_message_free (msg);
+
+}
+
+void
+OSCGlobalObserver::send_record_state_changed ()
+{
+ lo_message msg = lo_message_new ();
+ lo_message_add_int32 (msg, (int)session->get_record_enabled ());
+ lo_send_message (addr, "/rec_enable_toggle", msg);
+ lo_message_free (msg);
+
+ msg = lo_message_new ();
+ if (session->have_rec_enabled_track ()) {
+ lo_message_add_int32 (msg, 1);
+ } else {
+ lo_message_add_int32 (msg, 0);
+ }
+ lo_send_message (addr, "/record_tally", msg);
+ lo_message_free (msg);
+
+}
+
+void
+OSCGlobalObserver::send_session_saved (std::string name)
+{
+ lo_message msg = lo_message_new ();
+ lo_message_add_string (msg, name.c_str());
+ lo_send_message (addr, "/session_name", msg);
+ lo_message_free (msg);
+
+}
+
+void
+OSCGlobalObserver::solo_active (bool active)
+{
+ lo_message msg = lo_message_new ();
+ lo_message_add_float (msg, (float) active);
+ lo_send_message (addr, "/cancel_all_solos", msg);
+ lo_message_free (msg);
+}
diff --git a/libs/surfaces/osc/osc_global_observer.h b/libs/surfaces/osc/osc_global_observer.h
new file mode 100644
index 0000000..845b9b9
--- /dev/null
+++ b/libs/surfaces/osc/osc_global_observer.h
@@ -0,0 +1,66 @@
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __osc_oscglobalobserver_h__
+#define __osc_oscglobalobserver_h__
+
+#include <string>
+#include <boost/shared_ptr.hpp>
+#include <sigc++/sigc++.h>
+#include <lo/lo.h>
+
+#include "pbd/controllable.h"
+#include "pbd/stateful.h"
+#include "ardour/types.h"
+
+class OSCGlobalObserver
+{
+
+ public:
+ OSCGlobalObserver (ARDOUR::Session& s, lo_address addr, uint32_t gainmode, std::bitset<32> feedback);
+ ~OSCGlobalObserver ();
+
+ lo_address address() const { return addr; };
+ void tick (void);
+
+ private:
+
+ PBD::ScopedConnectionList strip_connections;
+ PBD::ScopedConnectionList session_connections;
+
+
+ lo_address addr;
+ std::string path;
+ uint32_t gainmode;
+ std::bitset<32> feedback;
+ ARDOUR::Session* session;
+ framepos_t _last_frame;
+ uint32_t _heartbeat;
+ float _last_meter;
+
+ void send_change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void send_gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void send_trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void send_transport_state_changed(void);
+ void send_record_state_changed (void);
+ void send_session_saved (std::string name);
+ void solo_active (bool active);
+};
+
+#endif /* __osc_oscglobalobserver_h__ */
diff --git a/libs/surfaces/osc/osc_gui.cc b/libs/surfaces/osc/osc_gui.cc
index 7879b75..9fd2fce 100644
--- a/libs/surfaces/osc/osc_gui.cc
+++ b/libs/surfaces/osc/osc_gui.cc
@@ -33,7 +33,7 @@
#include "osc.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
namespace ArdourSurface {
diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc
index 8bb511b..7c9374a 100644
--- a/libs/surfaces/osc/osc_route_observer.cc
+++ b/libs/surfaces/osc/osc_route_observer.cc
@@ -19,73 +19,221 @@
#include "boost/lambda/lambda.hpp"
-#include "ardour/route.h"
-#include "ardour/audio_track.h"
-#include "ardour/midi_track.h"
+#include "ardour/session.h"
+#include "ardour/track.h"
+#include "ardour/monitor_control.h"
+#include "ardour/dB.h"
+#include "ardour/meter.h"
#include "osc.h"
#include "osc_route_observer.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace PBD;
using namespace ARDOUR;
using namespace ArdourSurface;
-OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Route> r, lo_address a)
- : _route (r)
+OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, lo_address a, uint32_t ss, uint32_t gm, std::bitset<32> fb)
+ : _strip (s)
+ ,ssid (ss)
+ ,gainmode (gm)
+ ,feedback (fb)
{
addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
- _route->PropertyChanged.connect (name_changed_connection, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+ if (feedback[0]) { // buttons are separate feedback
+ _strip->PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+ name_changed (ARDOUR::Properties::name);
- if (boost::dynamic_pointer_cast<AudioTrack>(_route) || boost::dynamic_pointer_cast<MidiTrack>(_route)) {
+ _strip->mute_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/mute"), _strip->mute_control()), OSC::instance());
+ send_change_message ("/strip/mute", _strip->mute_control());
- boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track>(r);
- boost::shared_ptr<Controllable> rec_controllable = boost::dynamic_pointer_cast<Controllable>(track->rec_enable_control());
+ _strip->solo_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/solo"), _strip->solo_control()), OSC::instance());
+ send_change_message ("/strip/solo", _strip->solo_control());
- rec_controllable->Changed.connect (rec_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/rec"), track->rec_enable_control()), OSC::instance());
+ boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (_strip);
+ if (track) {
+ track->monitoring_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_monitor_status, this, track->monitoring_control()), OSC::instance());
+ send_monitor_status (track->monitoring_control());
+ }
+
+ boost::shared_ptr<AutomationControl> rec_controllable = _strip->rec_enable_control ();
+ if (rec_controllable) {
+ rec_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/recenable"), _strip->rec_enable_control()), OSC::instance());
+ send_change_message ("/strip/recenable", _strip->rec_enable_control());
+ }
+ boost::shared_ptr<AutomationControl> recsafe_controllable = _strip->rec_safe_control ();
+ if (rec_controllable) {
+ recsafe_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/record_safe"), _strip->rec_safe_control()), OSC::instance());
+ send_change_message ("/strip/record_safe", _strip->rec_safe_control());
+ }
+ _strip->presentation_info().PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_select_status, this, _1), OSC::instance());
+ send_select_status (ARDOUR::Properties::selected);
}
- boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(_route->mute_control());
- mute_controllable->Changed.connect (mute_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/mute"), _route->mute_control()), OSC::instance());
+ if (feedback[1]) { // level controls
+ if (gainmode) {
+ _strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_gain_message, this, X_("/strip/fader"), _strip->gain_control()), OSC::instance());
+ send_gain_message ("/strip/fader", _strip->gain_control());
+ } else {
+ _strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_gain_message, this, X_("/strip/gain"), _strip->gain_control()), OSC::instance());
+ send_gain_message ("/strip/gain", _strip->gain_control());
+ }
- boost::shared_ptr<Controllable> solo_controllable = boost::dynamic_pointer_cast<Controllable>(_route->solo_control());
- solo_controllable->Changed.connect (solo_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/solo"), _route->solo_control()), OSC::instance());
+ boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->trim_control());
+ if (trim_controllable) {
+ trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_trim_message, this, X_("/strip/trimdB"), _strip->trim_control()), OSC::instance());
+ send_trim_message ("/strip/trimdB", _strip->trim_control());
+ }
- boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(_route->gain_control());
- gain_controllable->Changed.connect (gain_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/gain"), _route->gain_control()), OSC::instance());
+ boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_azimuth_control());
+ if (pan_controllable) {
+ pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance());
+ send_change_message ("/strip/pan_stereo_position", _strip->pan_azimuth_control());
+ }
+ }
+ tick();
}
OSCRouteObserver::~OSCRouteObserver ()
{
- name_changed_connection.disconnect();
- rec_changed_connection.disconnect();
- mute_changed_connection.disconnect();
- solo_changed_connection.disconnect();
- gain_changed_connection.disconnect();
+
+ strip_connections.drop_connections ();
+ // all strip buttons should be off and faders 0 and etc.
+ clear_strip ("/strip/expand", 0);
+ if (feedback[0]) { // buttons are separate feedback
+ lo_message msg = lo_message_new ();
+ // name is a string do it first
+ string path = "/strip/name";
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ lo_message_add_string (msg, " ");
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ clear_strip ("/strip/mute", 0);
+ clear_strip ("/strip/solo", 0);
+ clear_strip ("/strip/recenable", 0);
+ clear_strip ("/strip/record_safe", 0);
+ clear_strip ("/strip/monitor_input", 0);
+ clear_strip ("/strip/monitor_disk", 0);
+ clear_strip ("/strip/gui_select", 0);
+ clear_strip ("/strip/select", 0);
+ }
+ if (feedback[1]) { // level controls
+ if (gainmode) {
+ clear_strip ("/strip/fader", 0);
+ } else {
+ clear_strip ("/strip/gain", -193);
+ }
+ clear_strip ("/strip/trimdB", 0);
+ clear_strip ("/strip/pan_stereo_position", 0.5);
+ }
+ if (feedback[9]) {
+ clear_strip ("/strip/signal", 0);
+ }
+ if (feedback[7]) {
+ if (gainmode) {
+ clear_strip ("/strip/meter", 0);
+ } else {
+ clear_strip ("/strip/meter", -193);
+ }
+ }else if (feedback[8]) {
+ clear_strip ("/strip/meter", 0);
+ }
lo_address_free (addr);
}
void
+OSCRouteObserver::tick ()
+{
+ if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
+ // the only meter here is master
+ float now_meter;
+ if (_strip->peak_meter()) {
+ now_meter = _strip->peak_meter()->meter_level(0, MeterMCP);
+ } else {
+ now_meter = -193;
+ }
+ if (now_meter < -120) now_meter = -193;
+ if (_last_meter != now_meter) {
+ if (feedback[7] || feedback[8]) {
+ string path = "/strip/meter";
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ if (gainmode && feedback[7]) {
+ lo_message_add_float (msg, ((now_meter + 94) / 100));
+ lo_send_message (addr, path.c_str(), msg);
+ } else if ((!gainmode) && feedback[7]) {
+ lo_message_add_float (msg, now_meter);
+ lo_send_message (addr, path.c_str(), msg);
+ } else if (feedback[8]) {
+ uint32_t ledlvl = (uint32_t)(((now_meter + 54) / 3.75)-1);
+ uint16_t ledbits = ~(0xfff<<ledlvl);
+ lo_message_add_int32 (msg, ledbits);
+ lo_send_message (addr, path.c_str(), msg);
+ }
+ lo_message_free (msg);
+ }
+ if (feedback[9]) {
+ string path = "/strip/signal";
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ float signal;
+ if (now_meter < -40) {
+ signal = 0;
+ } else {
+ signal = 1;
+ }
+ lo_message_add_float (msg, signal);
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ }
+ }
+ _last_meter = now_meter;
+
+ }
+
+}
+
+void
OSCRouteObserver::name_changed (const PBD::PropertyChange& what_changed)
{
if (!what_changed.contains (ARDOUR::Properties::name)) {
return;
}
- if (!_route) {
+ if (!_strip) {
return;
}
lo_message msg = lo_message_new ();
- lo_message_add_int32 (msg, _route->remote_control_id());
- lo_message_add_string (msg, _route->name().c_str());
+ // ssid is the strip on the surface this observer refers to
+ // not part of the internal ordering.
+ string path = "/strip/name";
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ lo_message_add_string (msg, _strip->name().c_str());
- lo_send_message (addr, "/route/name", msg);
+ lo_send_message (addr, path.c_str(), msg);
lo_message_free (msg);
}
@@ -94,13 +242,146 @@ OSCRouteObserver::send_change_message (string path, boost::shared_ptr<Controllab
{
lo_message msg = lo_message_new ();
- lo_message_add_int32 (msg, _route->remote_control_id());
- lo_message_add_float (msg, (float) controllable->get_value());
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ float val = controllable->get_value();
+ lo_message_add_float (msg, (float) controllable->internal_to_interface (val));
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCRouteObserver::send_monitor_status (boost::shared_ptr<Controllable> controllable)
+{
+ int disk, input;
+ float val = controllable->get_value();
+ switch ((int) val) {
+ case 1:
+ disk = 0;
+ input = 1;
+ break;
+ case 2:
+ disk = 1;
+ input = 0;
+ break;
+ default:
+ disk = 0;
+ input = 0;
+ }
+
+ lo_message msg = lo_message_new ();
+ string path = "/strip/monitor_input";
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ lo_message_add_int32 (msg, (float) input);
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+
+ msg = lo_message_new ();
+ path = "/strip/monitor_disk";
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ lo_message_add_int32 (msg, (float) disk);
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+
+}
+
+void
+OSCRouteObserver::send_trim_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
- /* XXX thread issues */
+ lo_message_add_float (msg, (float) accurate_coefficient_to_dB (controllable->get_value()));
- //std::cerr << "ORC: send " << path << " = " << controllable->get_value() << std::endl;
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCRouteObserver::send_gain_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+
+ if (gainmode) {
+ lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
+ } else {
+ if (controllable->get_value() < 1e-15) {
+ lo_message_add_float (msg, -200);
+ } else {
+ lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
+ }
+ }
lo_send_message (addr, path.c_str(), msg);
lo_message_free (msg);
}
+
+string
+OSCRouteObserver::set_path (string path)
+{
+ if (feedback[2]) {
+ ostringstream os;
+ os << path << "/" << ssid;
+ path = os.str();
+ }
+ return path;
+}
+
+void
+OSCRouteObserver::clear_strip (string path, float val)
+{
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ lo_message_add_float (msg, val);
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+
+}
+
+void
+OSCRouteObserver::send_select_status (const PropertyChange& what)
+{
+ if (what == PropertyChange(ARDOUR::Properties::selected)) {
+ if (_strip) {
+ string path = "/strip/select";
+
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path);
+ } else {
+ lo_message_add_int32 (msg, ssid);
+ }
+ lo_message_add_float (msg, _strip->is_selected());
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ }
+ }
+}
diff --git a/libs/surfaces/osc/osc_route_observer.h b/libs/surfaces/osc/osc_route_observer.h
index 7153da7..7a0213d 100644
--- a/libs/surfaces/osc/osc_route_observer.h
+++ b/libs/surfaces/osc/osc_route_observer.h
@@ -21,6 +21,7 @@
#define __osc_oscrouteobserver_h__
#include <string>
+#include <bitset>
#include <boost/shared_ptr.hpp>
#include <sigc++/sigc++.h>
#include <lo/lo.h>
@@ -33,27 +34,34 @@ class OSCRouteObserver
{
public:
- OSCRouteObserver (boost::shared_ptr<ARDOUR::Route>, lo_address addr);
+ OSCRouteObserver (boost::shared_ptr<ARDOUR::Stripable>, lo_address addr, uint32_t sid, uint32_t gainmode, std::bitset<32> feedback);
~OSCRouteObserver ();
- boost::shared_ptr<ARDOUR::Route> route () const { return _route; }
+ boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
lo_address address() const { return addr; };
+ void tick (void);
+ void send_select_status (const PBD::PropertyChange&);
private:
- boost::shared_ptr<ARDOUR::Route> _route;
- //boost::shared_ptr<Controllable> _controllable;
+ boost::shared_ptr<ARDOUR::Stripable> _strip;
- PBD::ScopedConnection name_changed_connection;
- PBD::ScopedConnection rec_changed_connection;
- PBD::ScopedConnection mute_changed_connection;
- PBD::ScopedConnection solo_changed_connection;
- PBD::ScopedConnection gain_changed_connection;
+ PBD::ScopedConnectionList strip_connections;
lo_address addr;
std::string path;
+ uint32_t ssid;
+ uint32_t gainmode;
+ std::bitset<32> feedback;
+ float _last_meter;
+
void name_changed (const PBD::PropertyChange& what_changed);
void send_change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void send_monitor_status (boost::shared_ptr<PBD::Controllable> controllable);
+ void send_gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void send_trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ std::string set_path (std::string path);
+ void clear_strip (std::string path, float val);
};
#endif /* __osc_oscrouteobserver_h__ */
diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc
new file mode 100644
index 0000000..657b46f
--- /dev/null
+++ b/libs/surfaces/osc/osc_select_observer.cc
@@ -0,0 +1,672 @@
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <vector>
+#include "boost/lambda/lambda.hpp"
+
+#include "ardour/session.h"
+#include "ardour/track.h"
+#include "ardour/monitor_control.h"
+#include "ardour/dB.h"
+#include "ardour/meter.h"
+#include "ardour/phase_control.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/route.h"
+
+#include "osc.h"
+#include "osc_select_observer.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+using namespace ArdourSurface;
+
+OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address a, uint32_t gm, std::bitset<32> fb)
+ : _strip (s)
+ ,gainmode (gm)
+ ,feedback (fb)
+ ,nsends (0)
+{
+ addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+
+ if (feedback[0]) { // buttons are separate feedback
+ _strip->PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+ name_changed (ARDOUR::Properties::name);
+
+ _strip->mute_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/mute"), _strip->mute_control()), OSC::instance());
+ change_message ("/select/mute", _strip->mute_control());
+
+ _strip->solo_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo"), _strip->solo_control()), OSC::instance());
+ change_message ("/select/solo", _strip->solo_control());
+
+ if (_strip->solo_isolate_control()) {
+ _strip->solo_isolate_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo_iso"), _strip->solo_isolate_control()), OSC::instance());
+ change_message ("/select/solo_iso", _strip->solo_isolate_control());
+ }
+
+ if (_strip->solo_safe_control()) {
+ _strip->solo_safe_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo_safe"), _strip->solo_safe_control()), OSC::instance());
+ change_message ("/select/solo_safe", _strip->solo_safe_control());
+ }
+
+ boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (_strip);
+ if (track) {
+ track->monitoring_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::monitor_status, this, track->monitoring_control()), OSC::instance());
+ monitor_status (track->monitoring_control());
+ }
+
+ boost::shared_ptr<AutomationControl> rec_controllable = _strip->rec_enable_control ();
+ if (rec_controllable) {
+ rec_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/recenable"), _strip->rec_enable_control()), OSC::instance());
+ change_message ("/select/recenable", _strip->rec_enable_control());
+ }
+
+ boost::shared_ptr<AutomationControl> recsafe_controllable = _strip->rec_safe_control ();
+ if (recsafe_controllable) {
+ recsafe_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/record_safe"), _strip->rec_safe_control()), OSC::instance());
+ change_message ("/select/record_safe", _strip->rec_safe_control());
+ }
+
+ boost::shared_ptr<AutomationControl> phase_controllable = _strip->phase_control ();
+ if (phase_controllable) {
+ phase_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/polarity"), _strip->phase_control()), OSC::instance());
+ change_message ("/select/polarity", _strip->phase_control());
+ }
+
+ }
+
+ if (feedback[1]) { // level controls
+ if (gainmode) {
+ _strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::gain_message, this, X_("/select/fader"), _strip->gain_control()), OSC::instance());
+ gain_message ("/select/fader", _strip->gain_control());
+ } else {
+ _strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::gain_message, this, X_("/select/gain"), _strip->gain_control()), OSC::instance());
+ gain_message ("/select/gain", _strip->gain_control());
+ }
+
+ boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->trim_control());
+ if (trim_controllable) {
+ trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::trim_message, this, X_("/select/trimdB"), _strip->trim_control()), OSC::instance());
+ trim_message ("/select/trimdB", _strip->trim_control());
+ }
+
+ boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_azimuth_control());
+ if (pan_controllable) {
+ pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance());
+ change_message ("/select/pan_stereo_position", _strip->pan_azimuth_control());
+ }
+
+ boost::shared_ptr<Controllable> width_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_width_control());
+ if (width_controllable) {
+ width_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_width"), _strip->pan_width_control()), OSC::instance());
+ change_message ("/select/pan_stereo_width", _strip->pan_width_control());
+ }
+
+ }
+ if (feedback[13]) { // Well known controls
+ // Rest of possible pan controls... Untested because I can't find a way to get them in the GUI :)
+ if (_strip->pan_elevation_control ()) {
+ _strip->pan_elevation_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_elevation_position"), _strip->pan_elevation_control()), OSC::instance());
+ change_message ("/select/pan_elevation_position", _strip->pan_elevation_control());
+ }
+ if (_strip->pan_frontback_control ()) {
+ _strip->pan_frontback_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_frontback_position"), _strip->pan_frontback_control()), OSC::instance());
+ change_message ("/select/pan_frontback_position", _strip->pan_frontback_control());
+ }
+ if (_strip->pan_lfe_control ()) {
+ _strip->pan_lfe_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_lfe_control"), _strip->pan_lfe_control()), OSC::instance());
+ change_message ("/select/pan_lfe_control", _strip->pan_lfe_control());
+ }
+
+ // sends and eq
+ // detecting processor changes requires cast to route
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(_strip);
+ if (r) {
+ r->processors_changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_restart, this, -1), OSC::instance());
+ send_init();
+ eq_init();
+ }
+
+ // Compressor
+ if (_strip->comp_enable_controllable ()) {
+ _strip->comp_enable_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message, this, X_("/select/comp_enable"), _strip->comp_enable_controllable()), OSC::instance());
+ enable_message ("/select/comp_enable", _strip->comp_enable_controllable());
+ }
+ if (_strip->comp_threshold_controllable ()) {
+ _strip->comp_threshold_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/comp_threshold"), _strip->comp_threshold_controllable()), OSC::instance());
+ change_message ("/select/comp_threshold", _strip->comp_threshold_controllable());
+ }
+ if (_strip->comp_speed_controllable ()) {
+ _strip->comp_speed_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/comp_speed"), _strip->comp_speed_controllable()), OSC::instance());
+ change_message ("/select/comp_speed", _strip->comp_speed_controllable());
+ }
+ if (_strip->comp_mode_controllable ()) {
+ _strip->comp_mode_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::comp_mode, this), OSC::instance());
+ comp_mode ();
+ }
+ if (_strip->comp_makeup_controllable ()) {
+ _strip->comp_makeup_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/comp_makeup"), _strip->comp_makeup_controllable()), OSC::instance());
+ change_message ("/select/comp_makeup", _strip->comp_makeup_controllable());
+ }
+
+ }
+
+ tick();
+}
+
+OSCSelectObserver::~OSCSelectObserver ()
+{
+
+ strip_connections.drop_connections ();
+ // all strip buttons should be off and faders 0 and etc.
+ clear_strip ("/select/expand", 0);
+ if (feedback[0]) { // buttons are separate feedback
+ text_message ("/select/name", " ");
+ text_message ("/select/comment", " ");
+ clear_strip ("/select/mute", 0);
+ clear_strip ("/select/solo", 0);
+ clear_strip ("/select/recenable", 0);
+ clear_strip ("/select/record_safe", 0);
+ clear_strip ("/select/monitor_input", 0);
+ clear_strip ("/select/monitor_disk", 0);
+ clear_strip ("/select/polarity", 0);
+ clear_strip ("/select/n_inputs", 0);
+ clear_strip ("/select/n_outputs", 0);
+ }
+ if (feedback[1]) { // level controls
+ if (gainmode) {
+ clear_strip ("/select/fader", 0);
+ } else {
+ clear_strip ("/select/gain", -193);
+ }
+ clear_strip ("/select/trimdB", 0);
+ clear_strip ("/select/pan_stereo_position", 0.5);
+ clear_strip ("/select/pan_stereo_width", 1);
+ }
+ if (feedback[9]) {
+ clear_strip ("/select/signal", 0);
+ }
+ if (feedback[7]) {
+ if (gainmode) {
+ clear_strip ("/select/meter", 0);
+ } else {
+ clear_strip ("/select/meter", -193);
+ }
+ }else if (feedback[8]) {
+ clear_strip ("/select/meter", 0);
+ }
+ if (feedback[13]) { // Well known controls
+ clear_strip ("/select/pan_elevation_position", 0);
+ clear_strip ("/select/pan_frontback_position", .5);
+ clear_strip ("/select/pan_lfe_control", 0);
+ clear_strip ("/select/comp_enable", 0);
+ clear_strip ("/select/comp_threshold", 0);
+ clear_strip ("/select/comp_speed", 0);
+ clear_strip ("/select/comp_mode", 0);
+ text_message ("/select/comp_mode_name", " ");
+ text_message ("/select/comp_speed_name", " ");
+ clear_strip ("/select/comp_makeup", 0);
+ }
+ send_end();
+ eq_end();
+
+ lo_address_free (addr);
+}
+
+void
+OSCSelectObserver::send_init()
+{
+ // we don't know how many there are, so find out.
+ bool sends;
+ do {
+ sends = false;
+ if (_strip->send_level_controllable (nsends)) {
+ _strip->send_level_controllable(nsends)->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_gain, this, nsends, _strip->send_level_controllable(nsends)), OSC::instance());
+ send_timeout.push_back (0);
+ send_gain (nsends, _strip->send_level_controllable(nsends));
+ sends = true;
+ }
+
+ if (_strip->send_enable_controllable (nsends)) {
+ _strip->send_enable_controllable(nsends)->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message_with_id, this, X_("/select/send_enable"), nsends + 1, _strip->send_enable_controllable(nsends)), OSC::instance());
+ enable_message_with_id ("/select/send_enable", nsends + 1, _strip->send_enable_controllable(nsends));
+ sends = true;
+ } else if (sends) {
+ // not used by Ardour, just mixbus so in Ardour always true
+ clear_strip_with_id ("/select/send_enable", nsends + 1, 1);
+ }
+ // this should get signalled by the route the send goes to, (TODO)
+ if (!gainmode && sends) { // if the gain control is there, this is too
+ text_with_id ("/select/send_name", nsends + 1, _strip->send_name(nsends));
+ }
+ // Send numbers are 0 based, OSC is 1 based so this gets incremented at the end
+ if (sends) {
+ nsends++;
+ }
+ } while (sends);
+}
+
+void
+OSCSelectObserver::send_end ()
+{
+ send_connections.drop_connections ();
+ for (uint32_t i = 1; i <= nsends; i++) {
+ if (gainmode) {
+ clear_strip_with_id ("/select/send_fader", i, 0);
+ } else {
+ clear_strip_with_id ("/select/send_gain", i, -193);
+ }
+ // next enable
+ clear_strip_with_id ("/select/send_enable", i, 0);
+ // next name
+ text_with_id ("/select/send_name", i, " ");
+ }
+ nsends = 0;
+}
+
+void
+OSCSelectObserver::send_restart(int x)
+{
+ send_end();
+ send_init();
+}
+
+void
+OSCSelectObserver::tick ()
+{
+ if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
+ float now_meter;
+ if (_strip->peak_meter()) {
+ now_meter = _strip->peak_meter()->meter_level(0, MeterMCP);
+ } else {
+ now_meter = -193;
+ }
+ if (now_meter < -144) now_meter = -193;
+ if (_last_meter != now_meter) {
+ if (feedback[7] || feedback[8]) {
+ string path = "/select/meter";
+ lo_message msg = lo_message_new ();
+ if (gainmode && feedback[7]) {
+ lo_message_add_float (msg, ((now_meter + 94) / 100));
+ lo_send_message (addr, path.c_str(), msg);
+ } else if ((!gainmode) && feedback[7]) {
+ lo_message_add_float (msg, now_meter);
+ lo_send_message (addr, path.c_str(), msg);
+ } else if (feedback[8]) {
+ uint32_t ledlvl = (uint32_t)(((now_meter + 54) / 3.75)-1);
+ uint16_t ledbits = ~(0xfff<<ledlvl);
+ lo_message_add_int32 (msg, ledbits);
+ lo_send_message (addr, path.c_str(), msg);
+ }
+ lo_message_free (msg);
+ }
+ if (feedback[9]) {
+ string path = "/select/signal";
+ lo_message msg = lo_message_new ();
+ float signal;
+ if (now_meter < -40) {
+ signal = 0;
+ } else {
+ signal = 1;
+ }
+ lo_message_add_float (msg, signal);
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ }
+ }
+ _last_meter = now_meter;
+
+ }
+ if (feedback[1]) {
+ if (gain_timeout) {
+ if (gain_timeout == 1) {
+ text_message ("/select/name", _strip->name());
+ }
+ gain_timeout--;
+ }
+ }
+ if (feedback[13]) {
+ for (uint32_t i = 0; i < send_timeout.size(); i++) {
+ if (send_timeout[i]) {
+ if (send_timeout[i] == 1) {
+ text_with_id ("/select/send_name", i + 1, _strip->send_name(i));
+ }
+ send_timeout[i]--;
+ }
+ }
+ }
+
+}
+
+void
+OSCSelectObserver::name_changed (const PBD::PropertyChange& what_changed)
+{
+ if (!what_changed.contains (ARDOUR::Properties::name)) {
+ return;
+ }
+
+ if (!_strip) {
+ return;
+ }
+
+ text_message ("/select/name", _strip->name());
+ boost::shared_ptr<Route> route = boost::dynamic_pointer_cast<Route> (_strip);
+ if (route) {
+ //spit out the comment at the same time
+ text_message ("/select/comment", route->comment());
+ // lets tell the surface how many inputs this strip has
+ clear_strip ("/select/n_inputs", (float) route->n_inputs().n_total());
+ // lets tell the surface how many outputs this strip has
+ clear_strip ("/select/n_outputs", (float) route->n_outputs().n_total());
+ }
+}
+
+void
+OSCSelectObserver::change_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+ float val = controllable->get_value();
+
+ lo_message_add_float (msg, (float) controllable->internal_to_interface (val));
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::enable_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ float val = controllable->get_value();
+ if (val) {
+ clear_strip (path, 1);
+ } else {
+ clear_strip (path, 0);
+ }
+
+}
+
+void
+OSCSelectObserver::change_message_with_id (string path, uint32_t id, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+ float val = controllable->get_value();
+ if (feedback[2]) {
+ path = set_path (path, id);
+ } else {
+ lo_message_add_int32 (msg, id);
+ }
+
+ lo_message_add_float (msg, (float) controllable->internal_to_interface (val));
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::enable_message_with_id (string path, uint32_t id, boost::shared_ptr<Controllable> controllable)
+{
+ float val = controllable->get_value();
+ if (val) {
+ clear_strip_with_id (path, id, 1);
+ } else {
+ clear_strip_with_id (path, id, 0);
+ }
+}
+
+void
+OSCSelectObserver::text_message (string path, std::string text)
+{
+ lo_message msg = lo_message_new ();
+
+ lo_message_add_string (msg, text.c_str());
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::monitor_status (boost::shared_ptr<Controllable> controllable)
+{
+ int disk, input;
+ float val = controllable->get_value();
+ switch ((int) val) {
+ case 1:
+ disk = 0;
+ input = 1;
+ break;
+ case 2:
+ disk = 1;
+ input = 0;
+ break;
+ default:
+ disk = 0;
+ input = 0;
+ }
+
+ clear_strip ("/select/monitor_input", (float) input);
+ clear_strip ("/select/monitor_disk", (float) disk);
+}
+
+void
+OSCSelectObserver::trim_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ lo_message_add_float (msg, (float) accurate_coefficient_to_dB (controllable->get_value()));
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::gain_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ if (gainmode) {
+ lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
+ text_message ("/select/name", string_compose ("%1%2%3", std::fixed, std::setprecision(2), accurate_coefficient_to_dB (controllable->get_value())));
+ gain_timeout = 8;
+ } else {
+ if (controllable->get_value() < 1e-15) {
+ lo_message_add_float (msg, -200);
+ } else {
+ lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
+ }
+ }
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+ string path;
+ float value;
+ float db;
+#ifdef MIXBUS
+ db = controllable->get_value();
+#else
+ if (controllable->get_value() < 1e-15) {
+ db = -193;
+ } else {
+ db = accurate_coefficient_to_dB (controllable->get_value());
+ }
+#endif
+
+ if (gainmode) {
+ path = "/select/send_fader";
+#ifdef MIXBUS
+ value = controllable->internal_to_interface (controllable->get_value());
+#else
+ value = gain_to_slider_position (controllable->get_value());
+#endif
+ text_with_id ("/select/send_name" , id + 1, string_compose ("%1%2%3", std::fixed, std::setprecision(2), db));
+ if (send_timeout.size() > id) {
+ send_timeout[id] = 8;
+ }
+ } else {
+ path = "/select/send_gain";
+ value = db;
+ }
+
+ if (feedback[2]) {
+ path = set_path (path, id + 1);
+ } else {
+ lo_message_add_int32 (msg, id + 1);
+ }
+
+ lo_message_add_float (msg, value);
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::text_with_id (string path, uint32_t id, string name)
+{
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path, id);
+ } else {
+ lo_message_add_int32 (msg, id);
+ }
+
+ lo_message_add_string (msg, name.c_str());
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::comp_mode ()
+{
+ change_message ("/select/comp_mode", _strip->comp_mode_controllable());
+ text_message ("/select/comp_mode_name", _strip->comp_mode_name(_strip->comp_mode_controllable()->get_value()));
+ text_message ("/select/comp_speed_name", _strip->comp_speed_name(_strip->comp_mode_controllable()->get_value()));
+}
+
+void
+OSCSelectObserver::eq_init()
+{
+ // HPF and enable are special case, rest are in bands
+ if (_strip->eq_hpf_controllable ()) {
+ _strip->eq_hpf_controllable ()->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/eq_hpf"), _strip->eq_hpf_controllable()), OSC::instance());
+ change_message ("/select/eq_hpf", _strip->eq_hpf_controllable());
+ }
+ if (_strip->eq_enable_controllable ()) {
+ _strip->eq_enable_controllable ()->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message, this, X_("/select/eq_enable"), _strip->eq_enable_controllable()), OSC::instance());
+ enable_message ("/select/eq_enable", _strip->eq_enable_controllable());
+ }
+
+ uint32_t eq_bands = _strip->eq_band_cnt ();
+ if (!eq_bands) {
+ return;
+ }
+
+ for (uint32_t i = 0; i < eq_bands; i++) {
+ if (_strip->eq_band_name(i).size()) {
+ text_with_id ("/select/eq_band_name", i + 1, _strip->eq_band_name (i));
+ }
+ if (_strip->eq_gain_controllable (i)) {
+ _strip->eq_gain_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_gain"), i + 1, _strip->eq_gain_controllable(i)), OSC::instance());
+ change_message_with_id ("/select/eq_gain", i + 1, _strip->eq_gain_controllable(i));
+ }
+ if (_strip->eq_freq_controllable (i)) {
+ _strip->eq_freq_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_freq"), i + 1, _strip->eq_freq_controllable(i)), OSC::instance());
+ change_message_with_id ("/select/eq_freq", i + 1, _strip->eq_freq_controllable(i));
+ }
+ if (_strip->eq_q_controllable (i)) {
+ _strip->eq_q_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_q"), i + 1, _strip->eq_q_controllable(i)), OSC::instance());
+ change_message_with_id ("/select/eq_q", i + 1, _strip->eq_q_controllable(i));
+ }
+ if (_strip->eq_shape_controllable (i)) {
+ _strip->eq_shape_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_shape"), i + 1, _strip->eq_shape_controllable(i)), OSC::instance());
+ change_message_with_id ("/select/eq_shape", i + 1, _strip->eq_shape_controllable(i));
+ }
+ }
+}
+
+void
+OSCSelectObserver::eq_end ()
+{
+ //need to check feedback for [13]
+ eq_connections.drop_connections ();
+ clear_strip ("/select/eq_hpf", 0);
+ clear_strip ("/select/eq_enable", 0);
+
+ for (uint32_t i = 1; i <= _strip->eq_band_cnt (); i++) {
+ text_with_id ("/select/eq_band_name", i, " ");
+ clear_strip_with_id ("/select/eq_gain", i, 0);
+ clear_strip_with_id ("/select/eq_freq", i, 0);
+ clear_strip_with_id ("/select/eq_q", i, 0);
+ clear_strip_with_id ("/select/eq_shape", i, 0);
+
+
+ }
+}
+
+void
+OSCSelectObserver::eq_restart(int x)
+{
+ eq_end();
+ eq_init();
+}
+
+string
+OSCSelectObserver::set_path (string path, uint32_t id)
+{
+ if (feedback[2]) {
+ path = string_compose ("%1/%2", path, id);
+ }
+ return path;
+}
+
+void
+OSCSelectObserver::clear_strip (string path, float val)
+{
+ lo_message msg = lo_message_new ();
+ lo_message_add_float (msg, val);
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+
+}
+
+void
+OSCSelectObserver::clear_strip_with_id (string path, uint32_t id, float val)
+{
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path, id);
+ } else {
+ lo_message_add_int32 (msg, id);
+ }
+
+ lo_message_add_float (msg, val);
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+
+}
+
diff --git a/libs/surfaces/osc/osc_select_observer.h b/libs/surfaces/osc/osc_select_observer.h
new file mode 100644
index 0000000..d3abc20
--- /dev/null
+++ b/libs/surfaces/osc/osc_select_observer.h
@@ -0,0 +1,86 @@
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __osc_oscselectobserver_h__
+#define __osc_oscselectobserver_h__
+
+#include <string>
+#include <bitset>
+#include <boost/shared_ptr.hpp>
+#include <sigc++/sigc++.h>
+#include <lo/lo.h>
+
+#include "pbd/controllable.h"
+#include "pbd/stateful.h"
+#include "ardour/types.h"
+
+class OSCSelectObserver
+{
+
+ public:
+ OSCSelectObserver (boost::shared_ptr<ARDOUR::Stripable>, lo_address addr, uint32_t gainmode, std::bitset<32> feedback);
+ ~OSCSelectObserver ();
+
+ boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
+ lo_address address() const { return addr; };
+ void tick (void);
+
+ private:
+ boost::shared_ptr<ARDOUR::Stripable> _strip;
+
+ PBD::ScopedConnectionList strip_connections;
+ // sends and eq need their own
+ PBD::ScopedConnectionList send_connections;
+ PBD::ScopedConnectionList eq_connections;
+
+ lo_address addr;
+ std::string path;
+ uint32_t gainmode;
+ std::bitset<32> feedback;
+ std::vector<int> send_timeout;
+ uint32_t gain_timeout;
+ float _last_meter;
+ uint32_t nsends;
+
+
+ void name_changed (const PBD::PropertyChange& what_changed);
+ void change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void enable_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void comp_mode (void);
+ void change_message_with_id (std::string path, uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+ void enable_message_with_id (std::string path, uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+ void text_message (std::string path, std::string text);
+ void text_with_id (std::string path, uint32_t id, std::string name);
+ void monitor_status (boost::shared_ptr<PBD::Controllable> controllable);
+ void gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ void trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+ // sends stuff
+ void send_init (void);
+ void send_end (void);
+ void send_restart (int);
+ void send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+ void eq_init (void);
+ void eq_end (void);
+ void eq_restart (int);
+ std::string set_path (std::string path, uint32_t id);
+ void clear_strip (std::string path, float val);
+ void clear_strip_with_id (std::string path, uint32_t id, float val);
+};
+
+#endif /* __osc_oscselectobserver_h__ */
diff --git a/libs/surfaces/osc/wscript b/libs/surfaces/osc/wscript
index 48f24f6..6f2bbfa 100644
--- a/libs/surfaces/osc/wscript
+++ b/libs/surfaces/osc/wscript
@@ -18,6 +18,8 @@ def build(bld):
osc.cc
osc_controllable.cc
osc_route_observer.cc
+ osc_select_observer.cc
+ osc_global_observer.cc
interface.cc
osc_gui.cc
'''
diff --git a/libs/surfaces/tranzport/button_events.cc b/libs/surfaces/tranzport/button_events.cc
index 1b070b3..ebc00f9 100644
--- a/libs/surfaces/tranzport/button_events.cc
+++ b/libs/surfaces/tranzport/button_events.cc
@@ -26,7 +26,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <pbd/abstract_ui.cc>
diff --git a/libs/surfaces/tranzport/general.cc b/libs/surfaces/tranzport/general.cc
index 35d2f2b..2b39aaa 100644
--- a/libs/surfaces/tranzport/general.cc
+++ b/libs/surfaces/tranzport/general.cc
@@ -26,7 +26,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <pbd/abstract_ui.cc>
// HA, I don't need this anymore
diff --git a/libs/surfaces/tranzport/init.cc b/libs/surfaces/tranzport/init.cc
index 459da81..1e284b5 100644
--- a/libs/surfaces/tranzport/init.cc
+++ b/libs/surfaces/tranzport/init.cc
@@ -26,7 +26,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <pbd/abstract_ui.cc>
diff --git a/libs/surfaces/tranzport/io_usb.cc b/libs/surfaces/tranzport/io_usb.cc
index 56d270b..c9c595e 100644
--- a/libs/surfaces/tranzport/io_usb.cc
+++ b/libs/surfaces/tranzport/io_usb.cc
@@ -36,7 +36,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <pbd/abstract_ui.cc>
diff --git a/libs/surfaces/tranzport/show.cc b/libs/surfaces/tranzport/show.cc
index 544bb3d..027665e 100644
--- a/libs/surfaces/tranzport/show.cc
+++ b/libs/surfaces/tranzport/show.cc
@@ -44,7 +44,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/abstract_ui.cc"
diff --git a/libs/surfaces/tranzport/state.cc b/libs/surfaces/tranzport/state.cc
index 59eaef0..f9988a1 100644
--- a/libs/surfaces/tranzport/state.cc
+++ b/libs/surfaces/tranzport/state.cc
@@ -38,7 +38,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/abstract_ui.cc"
diff --git a/libs/surfaces/tranzport/wheel.cc b/libs/surfaces/tranzport/wheel.cc
index d90e0e2..00a66f9 100644
--- a/libs/surfaces/tranzport/wheel.cc
+++ b/libs/surfaces/tranzport/wheel.cc
@@ -38,7 +38,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "pbd/abstract_ui.cc"
diff --git a/libs/surfaces/tranzport/wheel_modes.cc b/libs/surfaces/tranzport/wheel_modes.cc
index 6880218..1882ad5 100644
--- a/libs/surfaces/tranzport/wheel_modes.cc
+++ b/libs/surfaces/tranzport/wheel_modes.cc
@@ -48,7 +48,7 @@ using namespace std;
using namespace sigc;
using namespace PBD;
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <pbd/abstract_ui.cc>
diff --git a/libs/surfaces/wiimote/wiimote.cc b/libs/surfaces/wiimote/wiimote.cc
index d86dbbc..df16bc0 100644
--- a/libs/surfaces/wiimote/wiimote.cc
+++ b/libs/surfaces/wiimote/wiimote.cc
@@ -24,7 +24,7 @@
#include "pbd/error.h"
#include "ardour/debug.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "wiimote.h"
diff --git a/libs/timecode/MSVCtimecode/timecode.vcproj b/libs/timecode/MSVCtimecode/timecode.vcproj
index c074235..0e9f13b 100644
--- a/libs/timecode/MSVCtimecode/timecode.vcproj
+++ b/libs/timecode/MSVCtimecode/timecode.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
MinimalRebuild="true"
RuntimeLibrary="3"
WarningLevel="3"
@@ -122,7 +122,7 @@
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -201,7 +201,7 @@
AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
Optimization="0"
AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
- PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
StringPooling="false"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
@@ -290,7 +290,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+ RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
>
</File>
</Filter>
diff --git a/libs/vamp-plugins/Onset.cpp b/libs/vamp-plugins/Onset.cpp
index 93f90f9..03e35ba 100644
--- a/libs/vamp-plugins/Onset.cpp
+++ b/libs/vamp-plugins/Onset.cpp
@@ -166,6 +166,12 @@ Onset::reset()
lrintf(m_inputSampleRate));
m_lastOnset = Vamp::RealTime::zeroTime - m_delay - m_delay;
+#else
+ if (m_onsetdet) aubio_onsetdetection_free(m_onsetdet);
+ if (m_peakpick) del_aubio_peakpicker(m_peakpick);
+
+ m_peakpick = new_aubio_peakpicker(m_threshold);
+ m_onsetdet = new_aubio_onsetdetection(m_onsettype, m_blockSize, m_channelCount);
#endif
}
diff --git a/libs/vamp-plugins/TruePeak.cpp b/libs/vamp-plugins/TruePeak.cpp
index 82c56c8..18f5a26 100644
--- a/libs/vamp-plugins/TruePeak.cpp
+++ b/libs/vamp-plugins/TruePeak.cpp
@@ -439,11 +439,14 @@ TruePeakdsp::reset ()
_p = 0;
}
-void
+bool
TruePeakdsp::init (float fsamp)
{
_src.setup(fsamp, fsamp * 4.0, 1, 24, 1.0);
_buf = (float*) malloc(32768 * sizeof(float));
+ if (!_buf) {
+ return false;
+ }
/* q/d initialize */
float zero[8192];
@@ -455,6 +458,7 @@ TruePeakdsp::init (float fsamp)
_src.out_count = 32768;
_src.out_data = _buf;
_src.process ();
+ return true;
}
}
@@ -522,13 +526,15 @@ VampTruePeak::initialise(size_t channels, size_t stepSize, size_t blockSize)
return false;
}
- if (blockSize > 8192) {
+ if (blockSize == 0 || blockSize > 8192) {
return false;
}
- m_blockSize = blockSize;
+ if (!_meter.init (m_inputSampleRate)) {
+ return false;
+ }
- _meter.init (m_inputSampleRate);
+ m_blockSize = blockSize;
return true;
}
diff --git a/libs/vamp-plugins/TruePeak.h b/libs/vamp-plugins/TruePeak.h
index 5e3ff9d..ab83251 100644
--- a/libs/vamp-plugins/TruePeak.h
+++ b/libs/vamp-plugins/TruePeak.h
@@ -123,7 +123,7 @@ public:
void read (float &m, float &p);
void reset (void);
- void init (float fsamp);
+ bool init (float fsamp);
private:
diff --git a/libs/vamp-plugins/ebu_r128_proc.cc b/libs/vamp-plugins/ebu_r128_proc.cc
index 5675171..b18b9bc 100644
--- a/libs/vamp-plugins/ebu_r128_proc.cc
+++ b/libs/vamp-plugins/ebu_r128_proc.cc
@@ -24,6 +24,14 @@
#include <math.h>
#include "ebu_r128_proc.h"
+#ifdef COMPILER_MSVC
+#include <float.h>
+// C99 'isfinite()' is not available in MSVC.
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local isfinite
+#endif
+
namespace Fons {
float Ebu_r128_hist::_bin_power [100] = { 0.0f };
@@ -223,8 +231,8 @@ void Ebu_r128_proc::process (int nfram, const float *const *input)
_wrind &= 63;
_loudness_M = addfrags (8);
_loudness_S = addfrags (60);
- if (!isfinite(_loudness_M) || _loudness_M < -200.f) _loudness_M = -200.0f;
- if (!isfinite(_loudness_S) || _loudness_S < -200.f) _loudness_S = -200.0f;
+ if (!isfinite_local(_loudness_M) || _loudness_M < -200.f) _loudness_M = -200.0f;
+ if (!isfinite_local(_loudness_S) || _loudness_S < -200.f) _loudness_S = -200.0f;
if (_loudness_M > _maxloudn_M) _maxloudn_M = _loudness_M;
if (_loudness_S > _maxloudn_S) _maxloudn_S = _loudness_S;
if (_integr)
@@ -329,10 +337,10 @@ float Ebu_r128_proc::detect_process (int nfram)
}
if (_nchan == 1) si = 2 * sj;
else si += _chan_gain [i] * sj;
- S->_z1 = !isfinite(z1) ? 0 : z1;
- S->_z2 = !isfinite(z2) ? 0 : z2;
- S->_z3 = !isfinite(z3) ? 0 : z3;
- S->_z4 = !isfinite(z4) ? 0 : z4;
+ S->_z1 = !isfinite_local(z1) ? 0 : z1;
+ S->_z2 = !isfinite_local(z2) ? 0 : z2;
+ S->_z3 = !isfinite_local(z3) ? 0 : z3;
+ S->_z4 = !isfinite_local(z4) ? 0 : z4;
}
return si;
}
diff --git a/libs/vamp-plugins/wscript b/libs/vamp-plugins/wscript
index 856ffe2..f7f64af 100644
--- a/libs/vamp-plugins/wscript
+++ b/libs/vamp-plugins/wscript
@@ -52,9 +52,11 @@ def build(bld):
obj.target = 'ardourvampplugins'
obj.uselib = 'FFTW3F VAMPSDK'
obj.use = 'libvampplugin libqmdsp'
- obj.defines = [ 'ARDOUR_VAMP_PLUGINS_DLL_EPORTS' ]
autowaf.ensure_visible_symbols (obj, True)
- if bld.is_defined('HAVE_AUBIO'):
+ if bld.is_defined('HAVE_AUBIO4'):
+ obj.source += ' Onset.cpp '
+ obj.uselib += ' AUBIO4 '
+ elif bld.is_defined('HAVE_AUBIO'):
obj.source += ' Onset.cpp '
obj.uselib += ' AUBIO '
obj.vnum = LIBARDOURVAMPPLUGINS_LIB_VERSION
diff --git a/libs/vfork/exec_wrapper.c b/libs/vfork/exec_wrapper.c
index e1669fb..adc568f 100644
--- a/libs/vfork/exec_wrapper.c
+++ b/libs/vfork/exec_wrapper.c
@@ -113,5 +113,14 @@ int main(int argc, char *argv[]) {
char buf = 0;
(void) write(pok[1], &buf, 1 );
close_fd(&pok[1]);
+
+#ifdef __clang_analyzer__
+ // the clang static analyzer warns about a memleak here,
+ // but we don't care. The OS will clean up after us in a jiffy.
+ for (i=0; envp && envp[i]; ++i) {
+ free (envp[i]);
+ }
+ free (envp);
+#endif
return -1;
}
diff --git a/midi_maps/M-Audio_Axiom_Air_25_2015_Model_Transport_Only.map b/midi_maps/M-Audio_Axiom_Air_25_2015_Model_Transport_Only.map
new file mode 100644
index 0000000..704b79a
--- /dev/null
+++ b/midi_maps/M-Audio_Axiom_Air_25_2015_Model_Transport_Only.map
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="M-Audio Axiom Air 25 (2015 Model) - Transport Controls">
+
+<!-- Based on file by Chooch Schubert -->
+<!-- Simplified and updated by Guy Sherman in Jan 2016 -->
+
+<!-- NB: loop-toggle and Transport/Record are a bit weird out-of-the-box: it will only stay enabled while you press the button -->
+<!-- To fix them: reconfigure the record button from a Momentary switch to a Toggle switch as in ... -->
+<!-- this manual: http://m-audio.de/download/file/fid/803 On page 8. Then look at page 10 for instructions -->
+<!-- on saving this into the keyboard's persistent memory -->
+
+<!-- Transport Controls -->
+ <Binding channel="1" ctl="113" function="loop-toggle"/>
+ <Binding channel="1" ctl="114" function="transport-start"/>
+ <Binding channel="1" ctl="115" function="transport-end"/>
+ <Binding channel="1" ctl="116" function="transport-stop"/>
+ <Binding channel="1" ctl="117" function="transport-roll"/>
+
+ <Binding channel="1" ctl="118" action="Transport/Record"/>
+
+
+</ArdourMIDIBindings>
diff --git a/midi_maps/M-Audio_Oxygen61v3.map b/midi_maps/M-Audio_Oxygen61v3.map
new file mode 100644
index 0000000..91d709e
--- /dev/null
+++ b/midi_maps/M-Audio_Oxygen61v3.map
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="M-Audio Oxygen 61 v3">
+ <!-- 2016-01-17 Sebastiaan Lokhorst: initial version -->
+ <!-- Preset 1 in the Oxygen 61 v3 -->
+
+ <!-- Faders, mapped to track gain 1-8 and Master -->
+ <Binding channel="1" ctl="74" uri="/route/gain 1"/>
+ <Binding channel="1" ctl="71" uri="/route/gain 2"/>
+ <Binding channel="1" ctl="91" uri="/route/gain 3"/>
+ <Binding channel="1" ctl="93" uri="/route/gain 4"/>
+ <Binding channel="1" ctl="73" uri="/route/gain 5"/>
+ <Binding channel="1" ctl="72" uri="/route/gain 6"/>
+ <Binding channel="1" ctl="5" uri="/route/gain 7"/>
+ <Binding channel="1" ctl="84" uri="/route/gain 8"/>
+ <Binding channel="1" ctl="7" uri="/bus/gain master"/>
+
+ <!-- Buttons below the faders, mapped to track mute 1-8 and Master -->
+ <Binding channel="1" pgm="0" uri="/route/mute 1"/>
+ <Binding channel="1" pgm="1" uri="/route/mute 2"/>
+ <Binding channel="1" pgm="2" uri="/route/mute 3"/>
+ <Binding channel="1" pgm="3" uri="/route/mute 4"/>
+ <Binding channel="1" pgm="4" uri="/route/mute 5"/>
+ <Binding channel="1" pgm="5" uri="/route/mute 6"/>
+ <Binding channel="1" pgm="6" uri="/route/mute 7"/>
+ <Binding channel="1" pgm="7" uri="/route/mute 8"/>
+ <Binding channel="1" pgm="8" uri="/bus/mute master"/>
+
+ <!-- Encoders, mapped to pan direction -->
+ <Binding channel="1" ctl="75" uri="/route/pandirection 1"/>
+ <Binding channel="1" ctl="76" uri="/route/pandirection 2"/>
+ <Binding channel="1" ctl="92" uri="/route/pandirection 3"/>
+ <Binding channel="1" ctl="95" uri="/route/pandirection 4"/>
+ <Binding channel="1" ctl="10" uri="/route/pandirection 5"/>
+ <Binding channel="1" ctl="77" uri="/route/pandirection 6"/>
+ <Binding channel="1" ctl="78" uri="/route/pandirection 7"/>
+ <Binding channel="1" ctl="79" uri="/route/pandirection 8"/>
+
+ <!-- Transport controls -->
+ <Binding channel="16" ctl="113" function="loop-toggle"/>
+ <Binding channel="16" ctl="114" function="transport-start"/>
+ <Binding channel="16" ctl="115" function="transport-end"/>
+ <Binding channel="16" ctl="116" function="transport-stop"/>
+ <Binding channel="16" ctl="117" function="transport-roll"/>
+ <Binding channel="16" ctl="118" function="rec-enable"/>
+
+</ArdourMIDIBindings>
diff --git a/midi_maps/akai-mpd-32.map b/midi_maps/akai-mpd-32.map
new file mode 100644
index 0000000..a11535b
--- /dev/null
+++ b/midi_maps/akai-mpd-32.map
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="AKAI MPD32 by samtuke">
+
+ <!-- NOTE: This map uses 'Cubase' (Preset 3) on the MPD -->
+
+ <!-- Set bank-size to 8 -->
+ <DeviceInfo bank-size="8"/>
+
+ <!-- Unused
+ Set switch track
+ <Binding channel="16" ctl="110" function="prev-bank"/>
+ <Binding channel="16" ctl="111" function="next-bank"/>
+ -->
+
+ <!-- Set basic transport controls -->
+ <Binding channel="1" ctl="115" function="transport-start"/>
+ <Binding channel="1" ctl="116" function="transport-end"/>
+ <Binding channel="1" ctl="117" function="transport-stop"/>
+ <Binding channel="1" ctl="118" function="transport-roll"/>
+ <Binding channel="1" ctl="119" function="rec-enable"/>
+ <Binding channel="1" ctl="119" function="rec-disable"/>
+
+ <!-- Unused
+ Set master volume fader
+ <Binding channel="16" ctl="41" uri="/bus/gain master"/>
+ -->
+
+ <!-- Set faders -->
+ <Binding channel="1" ctl="7" uri="/route/gain 1"/>
+ <Binding channel="2" ctl="7" uri="/route/gain 2"/>
+ <Binding channel="3" ctl="7" uri="/route/gain 3"/>
+ <Binding channel="4" ctl="7" uri="/route/gain 4"/>
+ <Binding channel="5" ctl="7" uri="/route/gain 5"/>
+ <Binding channel="6" ctl="7" uri="/route/gain 6"/>
+ <Binding channel="7" ctl="7" uri="/route/gain 7"/>
+ <Binding channel="8" ctl="7" uri="/route/gain 8"/>
+ <Binding channel="9" ctl="7" uri="/route/gain 9"/>
+ <Binding channel="10" ctl="7" uri="/route/gain 10"/>
+ <Binding channel="11" ctl="7" uri="/route/gain 11"/>
+ <Binding channel="12" ctl="7" uri="/route/gain 12"/>
+ <Binding channel="13" ctl="7" uri="/route/gain 13"/>
+ <Binding channel="14" ctl="7" uri="/route/gain 14"/>
+ <Binding channel="15" ctl="7" uri="/route/gain 15"/>
+ <Binding channel="16" ctl="7" uri="/route/gain 16"/>
+ <Binding channel="17" ctl="7" uri="/route/gain 17"/>
+ <Binding channel="18" ctl="7" uri="/route/gain 18"/>
+ <Binding channel="19" ctl="7" uri="/route/gain 19"/>
+ <Binding channel="20" ctl="7" uri="/route/gain 20"/>
+ <Binding channel="21" ctl="7" uri="/route/gain 21"/>
+ <Binding channel="22" ctl="7" uri="/route/gain 22"/>
+ <Binding channel="23" ctl="7" uri="/route/gain 23"/>
+ <Binding channel="24" ctl="7" uri="/route/gain 24"/>
+
+ <!-- Set knobs to correspond to plugin attributes -->
+ <Binding channel="1" ctl="10" uri="/route/plugin/parameter B1 1 1"/>
+ <Binding channel="2" ctl="10" uri="/route/plugin/parameter B1 1 2"/>
+ <Binding channel="3" ctl="10" uri="/route/plugin/parameter B1 1 3"/>
+ <Binding channel="4" ctl="10" uri="/route/plugin/parameter B1 1 4"/>
+ <Binding channel="5" ctl="10" uri="/route/plugin/parameter B1 1 5"/>
+ <Binding channel="6" ctl="10" uri="/route/plugin/parameter B1 1 6"/>
+ <Binding channel="7" ctl="10" uri="/route/plugin/parameter B1 1 7"/>
+ <Binding channel="8" ctl="10" uri="/route/plugin/parameter B1 1 8"/>
+ <Binding channel="9" ctl="10" uri="/route/plugin/parameter B1 1 9"/>
+ <Binding channel="10" ctl="10" uri="/route/plugin/parameter B1 1 10"/>
+ <Binding channel="11" ctl="10" uri="/route/plugin/parameter B1 1 11"/>
+ <Binding channel="12" ctl="10" uri="/route/plugin/parameter B1 1 12"/>
+ <Binding channel="13" ctl="10" uri="/route/plugin/parameter B1 1 13"/>
+ <Binding channel="14" ctl="10" uri="/route/plugin/parameter B1 1 14"/>
+ <Binding channel="15" ctl="10" uri="/route/plugin/parameter B1 1 15"/>
+ <Binding channel="16" ctl="10" uri="/route/plugin/parameter B1 1 16"/>
+ <Binding channel="17" ctl="10" uri="/route/plugin/parameter B1 1 17"/>
+ <Binding channel="18" ctl="10" uri="/route/plugin/parameter B1 1 18"/>
+ <Binding channel="19" ctl="10" uri="/route/plugin/parameter B1 1 19"/>
+ <Binding channel="20" ctl="10" uri="/route/plugin/parameter B1 1 20"/>
+ <Binding channel="21" ctl="10" uri="/route/plugin/parameter B1 1 21"/>
+ <Binding channel="22" ctl="10" uri="/route/plugin/parameter B1 1 22"/>
+ <Binding channel="23" ctl="10" uri="/route/plugin/parameter B1 1 23"/>
+ <Binding channel="24" ctl="10" uri="/route/plugin/parameter B1 1 24"/>
+
+ <!-- Unused
+ Set master mute button
+ <Binding channel="16" ctl="57" uri="/bus/mute master"/>
+ -->
+
+ <!-- Set mute buttons beneath faders to correspond to banks -->
+ <Binding channel="1" ctl="64" uri="/route/mute B1"/>
+ <Binding channel="2" ctl="64" uri="/route/mute B2"/>
+ <Binding channel="3" ctl="64" uri="/route/mute B3"/>
+ <Binding channel="4" ctl="64" uri="/route/mute B4"/>
+ <Binding channel="5" ctl="64" uri="/route/mute B5"/>
+ <Binding channel="6" ctl="64" uri="/route/mute B6"/>
+ <Binding channel="7" ctl="64" uri="/route/mute B7"/>
+ <Binding channel="8" ctl="64" uri="/route/mute B8"/>
+ <Binding channel="9" ctl="64" uri="/route/mute B9"/>
+ <Binding channel="10" ctl="64" uri="/route/mute B10"/>
+ <Binding channel="11" ctl="64" uri="/route/mute B11"/>
+ <Binding channel="12" ctl="64" uri="/route/mute B12"/>
+ <Binding channel="13" ctl="64" uri="/route/mute B13"/>
+ <Binding channel="14" ctl="64" uri="/route/mute B14"/>
+ <Binding channel="15" ctl="64" uri="/route/mute B15"/>
+ <Binding channel="16" ctl="64" uri="/route/mute B16"/>
+ <Binding channel="17" ctl="64" uri="/route/mute B17"/>
+ <Binding channel="18" ctl="64" uri="/route/mute B18"/>
+ <Binding channel="19" ctl="64" uri="/route/mute B19"/>
+ <Binding channel="20" ctl="64" uri="/route/mute B20"/>
+ <Binding channel="21" ctl="64" uri="/route/mute B21"/>
+ <Binding channel="22" ctl="64" uri="/route/mute B22"/>
+ <Binding channel="23" ctl="64" uri="/route/mute B23"/>
+ <Binding channel="24" ctl="64" uri="/route/mute B24"/>
+
+ <!-- Pan, unused for now
+ <Binding channel="1" ctl="75" uri="/route/pan B2"/>
+ -->
+
+</ArdourMIDIBindings>
diff --git a/midi_maps/m-audio-oxygen61v3.map b/midi_maps/m-audio-oxygen61v3.map
new file mode 100644
index 0000000..08a2707
--- /dev/null
+++ b/midi_maps/m-audio-oxygen61v3.map
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="M-Audio Oxygen61 V3 by samtuke">
+
+ <!-- NOTE: This map uses 'P.10' (program 10) on the keyboard, which is the direct link program. Make sure you have set your program to 10 to use it with this map -->
+
+ <!-- The keyboard has 9 faders, but one of them is always master volume, so set bank-size to 8 -->
+ <DeviceInfo bank-size="8"/>
+
+ <!-- Set arrows labelled 'track' on keyboard to switch banks -->
+ <Binding channel="16" ctl="110" function="prev-bank"/>
+ <Binding channel="16" ctl="111" function="next-bank"/>
+
+ <!-- Set basic transport controls -->
+ <Binding channel="16" ctl="113" function="loop-toggle"/>
+ <Binding channel="16" ctl="114" function="transport-start"/>
+ <Binding channel="16" ctl="115" function="transport-end"/>
+ <Binding channel="16" ctl="116" function="transport-stop"/>
+ <Binding channel="16" ctl="117" function="transport-roll"/>
+ <Binding channel="16" ctl="118" function="rec-enable"/>
+ <Binding channel="16" ctl="118" function="rec-disable"/>
+
+ <!-- Set master volume fader, this is far right most fader labelled C9 and is master volume on all banks by default -->
+ <Binding channel="16" ctl="41" uri="/bus/gain master"/>
+
+ <!-- Set faders 1-8 to corresponding banks -->
+ <Binding channel="16" ctl="33" uri="/route/gain 1"/>
+ <Binding channel="16" ctl="34" uri="/route/gain 2"/>
+ <Binding channel="16" ctl="35" uri="/route/gain 3"/>
+ <Binding channel="16" ctl="36" uri="/route/gain 4"/>
+ <Binding channel="16" ctl="37" uri="/route/gain 5"/>
+ <Binding channel="16" ctl="38" uri="/route/gain 6"/>
+ <Binding channel="16" ctl="39" uri="/route/gain 7"/>
+ <Binding channel="16" ctl="40" uri="/route/gain 8"/>
+
+ <!-- Set knobs to correspond to plugin attributes -->
+ <Binding channel="16" ctl="17" uri="/route/plugin/parameter B1 1 1"/>
+ <Binding channel="16" ctl="18" uri="/route/plugin/parameter B1 1 2"/>
+ <Binding channel="16" ctl="19" uri="/route/plugin/parameter B1 1 3"/>
+ <Binding channel="16" ctl="20" uri="/route/plugin/parameter B1 1 4"/>
+ <Binding channel="16" ctl="21" uri="/route/plugin/parameter B1 1 5"/>
+ <Binding channel="16" ctl="22" uri="/route/plugin/parameter B1 1 6"/>
+ <Binding channel="16" ctl="23" uri="/route/plugin/parameter B1 1 7"/>
+ <Binding channel="16" ctl="24" uri="/route/plugin/parameter B1 1 8"/>
+
+ <!-- Set master mute button -->
+ <Binding channel="16" ctl="57" uri="/bus/mute master"/>
+
+ <!-- Set mute buttons beneath faders to correspond to banks -->
+ <Binding channel="16" ctl="49" uri="/route/mute B1"/>
+ <Binding channel="16" ctl="50" uri="/route/mute B2"/>
+ <Binding channel="16" ctl="51" uri="/route/mute B3"/>
+ <Binding channel="16" ctl="52" uri="/route/mute B4"/>
+ <Binding channel="16" ctl="53" uri="/route/mute B5"/>
+ <Binding channel="16" ctl="54" uri="/route/mute B6"/>
+ <Binding channel="16" ctl="55" uri="/route/mute B7"/>
+ <Binding channel="16" ctl="56" uri="/route/mute B8"/>
+
+ <!-- Pan, unused for now
+ <Binding channel="1" ctl="75" uri="/route/pan B2"/>
+ -->
+
+</ArdourMIDIBindings>
diff --git a/patchfiles/MIDIEvents10.dtd b/patchfiles/MIDIEvents10.dtd
new file mode 100644
index 0000000..cca10cd
--- /dev/null
+++ b/patchfiles/MIDIEvents10.dtd
@@ -0,0 +1,195 @@
+<!--
+ XML DTD for MIDI messages
+
+ Version 1.0, 19 January 2003
+
+ Formal Public Identifier:
+ "-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"
+
+ URI:
+ "http://www.midi.org/dtds/MIDIEvents10.dtd"
+
+ Parameter entities which must be defined before use:
+ %ChannelRequired; #IMPLIED
+ for use in contexts, where the event is always
+ rechannelized
+ #REQUIRED
+ when channel messages require Channel attribute
+
+ e.g.
+ <!ENTITY % MIDIDTD PUBLIC "-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"
+ "http://www.midi.org/dtds/MIDIEvents10.dtd" >
+ %MIDIDTD;
+-->
+
+<!--
+ CHANNEL MESSAGES
+
+ Attribute values:
+ Note, Velocity, Pressure, Control, Value, Number are all 0..127
+ except: PitchBend's Value is 0..16383
+-->
+
+<!ELEMENT NoteOn EMPTY>
+ <!ATTLIST NoteOn
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Note NMTOKEN #REQUIRED
+ Velocity NMTOKEN #REQUIRED>
+
+<!ELEMENT NoteOff EMPTY>
+ <!ATTLIST NoteOff
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Note NMTOKEN #REQUIRED
+ Velocity NMTOKEN #REQUIRED>
+
+<!ELEMENT PolyKeyPressure EMPTY>
+ <!ATTLIST PolyKeyPressure
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Note NMTOKEN #REQUIRED
+ Pressure NMTOKEN #REQUIRED>
+
+<!ELEMENT ControlChange EMPTY>
+ <!ATTLIST ControlChange
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Control NMTOKEN #REQUIRED
+ Value NMTOKEN #REQUIRED>
+
+<!ELEMENT ProgramChange EMPTY>
+ <!ATTLIST ProgramChange
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Number NMTOKEN #REQUIRED>
+
+<!ELEMENT ChannelKeyPressure EMPTY>
+ <!ATTLIST ChannelKeyPressure
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Pressure NMTOKEN #REQUIRED>
+
+<!ELEMENT PitchBendChange EMPTY>
+ <!ATTLIST PitchBendChange
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Value NMTOKEN #REQUIRED>
+
+<!--
+ Channel mode messages
+-->
+<!ELEMENT AllSoundOff EMPTY>
+ <!ATTLIST AllSoundOff
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>
+
+<!ELEMENT ResetAllControllers EMPTY>
+ <!ATTLIST ResetAllControllers
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>
+
+<!ELEMENT LocalControl EMPTY>
+ <!ATTLIST LocalControl
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Value (off|on) #REQUIRED>
+
+<!ELEMENT AllNotesOff EMPTY>
+ <!ATTLIST AllNotesOff
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>
+
+<!ELEMENT OmniOff EMPTY>
+ <!ATTLIST OmniOff
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>
+
+<!ELEMENT OmniOn EMPTY>
+ <!ATTLIST OmniOn
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>
+
+<!ELEMENT MonoMode EMPTY>
+ <!ATTLIST MonoMode
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Value NMTOKEN #REQUIRED>
+
+<!ELEMENT PolyMode EMPTY>
+ <!ATTLIST PolyMode
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;>
+
+<!--
+ 14-bit control changes:
+ Value is 0..16383
+
+ ControlChange14's Control is MSB 0..31
+ RPNN and NRPN are 0..16383
+-->
+
+<!ELEMENT ControlChange14 EMPTY>
+ <!ATTLIST ControlChange14
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ Control NMTOKEN #REQUIRED
+ Value NMTOKEN #REQUIRED>
+
+<!ELEMENT RPNChange EMPTY>
+ <!ATTLIST RPNChange
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ RPN NMTOKEN #REQUIRED
+ Value NMTOKEN #REQUIRED>
+
+<!ELEMENT NRPNChange EMPTY>
+ <!ATTLIST NRPNChange
+ Channel (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16) %ChannelRequired;
+ NRPN NMTOKEN #REQUIRED
+ Value NMTOKEN #REQUIRED>
+
+
+<!--
+ SYSTEM MESSAGES
+-->
+
+<!ELEMENT SysEx (#PCDATA | SysExDeviceID | SysExChannel)*>
+ <!-- contains string of hex bytes without radix information, e.g.:
+ <SysEx>F0 01 02 <SysExDeviceID/> 03 04 05 <SysExChannel Multiplier="1" Offset="32"/> F7</SysEx>
+ -->
+
+<!ELEMENT SysExDeviceID EMPTY> <!-- Byte as a function of user-visible Device ID
+ e.g. 17 as the default on many Roland devices.
+ Most sysex messages will use this element. -->
+ <!ATTLIST SysExDeviceID
+ Multiplier NMTOKEN "1"
+ Offset NMTOKEN "0"> <!-- multiplier and offset are decimal -->
+
+<!ELEMENT SysExChannel EMPTY> <!-- Byte as a function of MIDI Channel 1-16, for
+ specialized situations where a sys-ex message
+ is being directed to a specific MIDI channel.
+ Generally only older devices require use of this. -->
+ <!ATTLIST SysExChannel
+ Multiplier NMTOKEN "1"
+ Offset NMTOKEN "0"> <!-- multiplier and offset are decimal -->
+
+<!ELEMENT MTCQuarterFrame EMPTY>
+ <!ATTLIST MTCQuarterFrame
+ MessageType (FrameLSNibble | FrameMSNibble |
+ SecsLSNibble | SecsMSNibble |
+ MinsLSNibble | MinsMSNibble |
+ HrsLSNibble | HrsMSNibbleSMPTEType) #REQUIRED
+ DataNibble NMTOKEN #REQUIRED>
+
+<!ELEMENT SongPositionPointer EMPTY>
+ <!ATTLIST SongPositionPointer
+ Position NMTOKEN #REQUIRED> <!-- 0-16383 -->
+
+<!ELEMENT SongSelect EMPTY>
+ <!ATTLIST SongSelect
+ Number NMTOKEN #REQUIRED> <!-- 0-127 -->
+
+<!ELEMENT TuneRequest EMPTY>
+<!ELEMENT TimingClock EMPTY>
+<!ELEMENT Start EMPTY>
+<!ELEMENT Continue EMPTY>
+<!ELEMENT Stop EMPTY>
+<!ELEMENT ActiveSensing EMPTY>
+<!ELEMENT SystemReset EMPTY>
+
+<!--
+ ENTITIES
+-->
+
+<!ENTITY % MIDIChannelVoiceMessage "(NoteOn | NoteOff | PolyKeyPressure | ControlChange | ProgramChange
+ | ChannelKeyPressure | PitchBendChange)">
+<!ENTITY % MIDIChannelModeMessage "(AllSoundOff | ResetAllControllers | LocalControl | AllNotesOff
+ | OmniOff | OmniOn | MonoMode | PolyMode)">
+<!ENTITY % MIDIChannelMessage "(%MIDIChannelVoiceMessage; | %MIDIChannelModeMessage;)">
+<!ENTITY % MIDISystemMessage "(SysEx | MTCQuarterFrame | SongPositionPointer | SongSelect
+ | TuneRequest | TimingClock | Start | Continue | Stop | ActiveSensing | SystemReset)">
+<!ENTITY % MIDIMessage "(%MIDIChannelMessage; | %MIDISystemMessage; )">
diff --git a/patchfiles/MIDINameDocument10.dtd b/patchfiles/MIDINameDocument10.dtd
index 24befd1..5a95f64 100644
--- a/patchfiles/MIDINameDocument10.dtd
+++ b/patchfiles/MIDINameDocument10.dtd
@@ -150,7 +150,7 @@
-->
<!ENTITY % ChannelRequired "#IMPLIED">
<!ENTITY % MIDIDTD PUBLIC "-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"
- "http://www.midi.org/dtds/MIDIEvents10.dtd" >
+ "MIDIEvents10.dtd" >
%MIDIDTD;
<!ELEMENT MIDICommands (MIDIDelay | %MIDIChannelMessage; | SysEx)+ >
diff --git a/patchfiles/Waldorf_Blofeld.midnam b/patchfiles/Waldorf_Blofeld.midnam
index 90df745..0675e76 100644
--- a/patchfiles/Waldorf_Blofeld.midnam
+++ b/patchfiles/Waldorf_Blofeld.midnam
@@ -5,7 +5,7 @@
<MasterDeviceNames>
<Manufacturer>Waldorf</Manufacturer>
<Model>Blofeld</Model>
- <CustomDeviceMode Name="">
+ <CustomDeviceMode Name="Default">
<ChannelNameSetAssignments>
<ChannelNameSetAssign Channel="1" NameSet="Presets"/>
<ChannelNameSetAssign Channel="2" NameSet="Presets"/>
@@ -44,6 +44,7 @@
<AvailableChannel Channel="15" Available="true"/>
<AvailableChannel Channel="16" Available="true"/>
</AvailableForChannels>
+ <UsesControlNameList Name="Controls"/>
<PatchBank Name="Presets A" ROM="false">
<MIDICommands>
<ControlChange Control="0" Value="0"/>
@@ -392,7 +393,7 @@
<Patch Number="C036" Name="C036 PolySequencer" ProgramChange="35"/>
<Patch Number="C037" Name="C037 PowerLead" ProgramChange="36"/>
<Patch Number="C038" Name="C038 Harp" ProgramChange="37"/>
- <Patch Number="C039" Name="C039 PPG Nylons  PROX" ProgramChange="38"/>
+ <Patch Number="C039" Name="C039 PPG Nylons PROX" ProgramChange="38"/>
<Patch Number="C040" Name="C040 Pure Key" ProgramChange="39"/>
<Patch Number="C041" Name="C041 PWMaster" ProgramChange="40"/>
<Patch Number="C042" Name="C042 Qazzio" ProgramChange="41"/>
@@ -581,7 +582,7 @@
<Patch Number="D095" Name="D095 Slow Wavetrip" ProgramChange="94"/>
<Patch Number="D096" Name="D096 Soap" ProgramChange="95"/>
<Patch Number="D097" Name="D097 Soar" ProgramChange="96"/>
- <Patch Number="D098" Name="D098 Soft  Pad" ProgramChange="97"/>
+ <Patch Number="D098" Name="D098 Soft Pad" ProgramChange="97"/>
<Patch Number="D099" Name="D099 Sonnenaufgang" ProgramChange="98"/>
<Patch Number="D100" Name="D100 Speak _ Hold" ProgramChange="99"/>
<Patch Number="D101" Name="D101 Straight Pad" ProgramChange="100"/>
@@ -1021,8 +1022,8 @@
<Patch Number="H015" Name="H015 Gastrology" ProgramChange="14"/>
<Patch Number="H016" Name="H016 HawaiGlider" ProgramChange="15"/>
<Patch Number="H017" Name="H017 Into Mout" ProgramChange="16"/>
- <Patch Number="H018" Name="H018 LFO Â Speeddwn" ProgramChange="17"/>
- <Patch Number="H019" Name="H019 LFO Â Speedup" ProgramChange="18"/>
+ <Patch Number="H018" Name="H018 LFO Speeddwn" ProgramChange="17"/>
+ <Patch Number="H019" Name="H019 LFO Speedup" ProgramChange="18"/>
<Patch Number="H020" Name="H020 LilaBell" ProgramChange="19"/>
<Patch Number="H021" Name="H021 Living Water" ProgramChange="20"/>
<Patch Number="H022" Name="H022 LosAngeles2019" ProgramChange="21"/>
@@ -1133,5 +1134,770 @@
<Patch Number="H127" Name="H127 Zap Stick" ProgramChange="126"/>
<Patch Number="H128" Name="H128 Zwitscher 1" ProgramChange="127"/>
</PatchNameList>
+ <ValueNameList Name="Minus64Plus63">
+ <Value Number="0" Name="-64"/>
+ <Value Number="1" Name="-63"/>
+ <Value Number="2" Name="-62"/>
+ <Value Number="3" Name="-61"/>
+ <Value Number="4" Name="-60"/>
+ <Value Number="5" Name="-59"/>
+ <Value Number="6" Name="-58"/>
+ <Value Number="7" Name="-57"/>
+ <Value Number="8" Name="-56"/>
+ <Value Number="9" Name="-55"/>
+ <Value Number="10" Name="-54"/>
+ <Value Number="11" Name="-53"/>
+ <Value Number="12" Name="-52"/>
+ <Value Number="13" Name="-51"/>
+ <Value Number="14" Name="-50"/>
+ <Value Number="15" Name="-49"/>
+ <Value Number="16" Name="-48"/>
+ <Value Number="17" Name="-47"/>
+ <Value Number="18" Name="-46"/>
+ <Value Number="19" Name="-45"/>
+ <Value Number="20" Name="-44"/>
+ <Value Number="21" Name="-43"/>
+ <Value Number="22" Name="-42"/>
+ <Value Number="23" Name="-41"/>
+ <Value Number="24" Name="-40"/>
+ <Value Number="25" Name="-39"/>
+ <Value Number="26" Name="-38"/>
+ <Value Number="27" Name="-37"/>
+ <Value Number="28" Name="-36"/>
+ <Value Number="29" Name="-35"/>
+ <Value Number="30" Name="-34"/>
+ <Value Number="31" Name="-33"/>
+ <Value Number="32" Name="-32"/>
+ <Value Number="33" Name="-31"/>
+ <Value Number="34" Name="-30"/>
+ <Value Number="35" Name="-29"/>
+ <Value Number="36" Name="-28"/>
+ <Value Number="37" Name="-27"/>
+ <Value Number="38" Name="-26"/>
+ <Value Number="39" Name="-25"/>
+ <Value Number="40" Name="-24"/>
+ <Value Number="41" Name="-23"/>
+ <Value Number="42" Name="-22"/>
+ <Value Number="43" Name="-21"/>
+ <Value Number="44" Name="-20"/>
+ <Value Number="45" Name="-19"/>
+ <Value Number="46" Name="-18"/>
+ <Value Number="47" Name="-17"/>
+ <Value Number="48" Name="-16"/>
+ <Value Number="49" Name="-15"/>
+ <Value Number="50" Name="-14"/>
+ <Value Number="51" Name="-13"/>
+ <Value Number="52" Name="-12"/>
+ <Value Number="53" Name="-11"/>
+ <Value Number="54" Name="-10"/>
+ <Value Number="55" Name="-9"/>
+ <Value Number="56" Name="-8"/>
+ <Value Number="57" Name="-7"/>
+ <Value Number="58" Name="-6"/>
+ <Value Number="59" Name="-5"/>
+ <Value Number="60" Name="-4"/>
+ <Value Number="61" Name="-3"/>
+ <Value Number="62" Name="-2"/>
+ <Value Number="63" Name="-1"/>
+ <Value Number="64" Name="0"/>
+ <Value Number="65" Name="+1"/>
+ <Value Number="66" Name="+2"/>
+ <Value Number="67" Name="+3"/>
+ <Value Number="68" Name="+4"/>
+ <Value Number="69" Name="+5"/>
+ <Value Number="70" Name="+6"/>
+ <Value Number="71" Name="+7"/>
+ <Value Number="72" Name="+8"/>
+ <Value Number="73" Name="+9"/>
+ <Value Number="74" Name="+10"/>
+ <Value Number="75" Name="+11"/>
+ <Value Number="76" Name="+12"/>
+ <Value Number="77" Name="+13"/>
+ <Value Number="78" Name="+14"/>
+ <Value Number="79" Name="+15"/>
+ <Value Number="80" Name="+16"/>
+ <Value Number="81" Name="+17"/>
+ <Value Number="82" Name="+18"/>
+ <Value Number="83" Name="+19"/>
+ <Value Number="84" Name="+20"/>
+ <Value Number="85" Name="+21"/>
+ <Value Number="86" Name="+22"/>
+ <Value Number="87" Name="+23"/>
+ <Value Number="88" Name="+24"/>
+ <Value Number="89" Name="+25"/>
+ <Value Number="90" Name="+26"/>
+ <Value Number="91" Name="+27"/>
+ <Value Number="92" Name="+28"/>
+ <Value Number="93" Name="+29"/>
+ <Value Number="94" Name="+30"/>
+ <Value Number="95" Name="+31"/>
+ <Value Number="96" Name="+32"/>
+ <Value Number="97" Name="+33"/>
+ <Value Number="98" Name="+34"/>
+ <Value Number="99" Name="+35"/>
+ <Value Number="100" Name="+36"/>
+ <Value Number="101" Name="+37"/>
+ <Value Number="102" Name="+38"/>
+ <Value Number="103" Name="+39"/>
+ <Value Number="104" Name="+40"/>
+ <Value Number="105" Name="+41"/>
+ <Value Number="106" Name="+42"/>
+ <Value Number="107" Name="+43"/>
+ <Value Number="108" Name="+44"/>
+ <Value Number="109" Name="+45"/>
+ <Value Number="110" Name="+46"/>
+ <Value Number="111" Name="+47"/>
+ <Value Number="112" Name="+48"/>
+ <Value Number="113" Name="+49"/>
+ <Value Number="114" Name="+50"/>
+ <Value Number="115" Name="+51"/>
+ <Value Number="116" Name="+52"/>
+ <Value Number="117" Name="+53"/>
+ <Value Number="118" Name="+54"/>
+ <Value Number="119" Name="+55"/>
+ <Value Number="120" Name="+56"/>
+ <Value Number="121" Name="+57"/>
+ <Value Number="122" Name="+58"/>
+ <Value Number="123" Name="+59"/>
+ <Value Number="124" Name="+60"/>
+ <Value Number="125" Name="+61"/>
+ <Value Number="126" Name="+62"/>
+ <Value Number="127" Name="+63"/>
+ </ValueNameList>
+ <ValueNameList Name="OscShapes">
+ <Value Number="0" Name="Off"/>
+ <Value Number="1" Name="Pulse"/>
+ <Value Number="2" Name="Sawtooth"/>
+ <Value Number="3" Name="Triangle"/>
+ <Value Number="4" Name="Sine"/>
+ <Value Number="5" Name="Alt 1"/>
+ <Value Number="6" Name="Alt 2"/>
+ <Value Number="7" Name="Resonant"/>
+ <Value Number="8" Name="Resonant 2"/>
+ <Value Number="9" Name="MatteSyn"/>
+ <Value Number="10" Name="Sqr-Sweep"/>
+ <Value Number="11" Name="Bellish"/>
+ <Value Number="12" Name="Put-Sweep"/>
+ <Value Number="13" Name="Saw-Sweep"/>
+ <Value Number="14" Name="MellowSaw"/>
+ <Value Number="15" Name="Feedback"/>
+ <Value Number="16" Name="Add Harm"/>
+ <Value Number="17" Name="Reso 3 HP"/>
+ <Value Number="18" Name="Wind Syn"/>
+ <Value Number="19" Name="High Harm"/>
+ <Value Number="20" Name="Clipper"/>
+ <Value Number="21" Name="Organ Syn"/>
+ <Value Number="22" Name="SquareSaw"/>
+ <Value Number="23" Name="Formant 1"/>
+ <Value Number="24" Name="Polated"/>
+ <Value Number="25" Name="Transient"/>
+ <Value Number="26" Name="ElectricP"/>
+ <Value Number="27" Name="Robotic"/>
+ <Value Number="28" Name="StrongHrm"/>
+ <Value Number="29" Name="PercOrgan"/>
+ <Value Number="30" Name="ClipSweep"/>
+ <Value Number="31" Name="ResoHarms"/>
+ <Value Number="32" Name="2 Echoes"/>
+ <Value Number="33" Name="Formant 2"/>
+ <Value Number="34" Name="FmntVocal"/>
+ <Value Number="35" Name="MicroSync"/>
+ <Value Number="36" Name="Micro PWM"/>
+ <Value Number="37" Name="Glassy"/>
+ <Value Number="38" Name="Square HP"/>
+ <Value Number="39" Name="Saw Sync 1"/>
+ <Value Number="40" Name="Saw Sync 2"/>
+ <Value Number="41" Name="Saw Sync 3"/>
+ <Value Number="42" Name="Pulse Sync 1"/>
+ <Value Number="43" Name="Pulse Sync 2"/>
+ <Value Number="44" Name="Pulse Sync 3"/>
+ <Value Number="45" Name="Sine Sync 1"/>
+ <Value Number="46" Name="Sine Sync 2"/>
+ <Value Number="47" Name="Sine Sync 3"/>
+ <Value Number="48" Name="PWM Pulse"/>
+ <Value Number="49" Name="PWM Saw"/>
+ <Value Number="50" Name="Fuzz Wave"/>
+ <Value Number="51" Name="Distorted"/>
+ <Value Number="52" Name="HeavyFuzz"/>
+ <Value Number="53" Name="Fuzz Sync"/>
+ <Value Number="54" Name="K+Strong1"/>
+ <Value Number="55" Name="K+Strong2"/>
+ <Value Number="56" Name="K+Strong3"/>
+ <Value Number="57" Name="1-2-3-4-5"/>
+ <Value Number="58" Name="19/twenty"/>
+ <Value Number="59" Name="Wavetrip1"/>
+ <Value Number="60" Name="Wavetrip2"/>
+ <Value Number="61" Name="Wavetrip3"/>
+ <Value Number="62" Name="Wavetrip4"/>
+ <Value Number="63" Name="MaleVoice"/>
+ <Value Number="64" Name="Low Piano"/>
+ <Value Number="65" Name="ResoSweep"/>
+ <Value Number="66" Name="Xmas Bell"/>
+ <Value Number="67" Name="FM Piano"/>
+ <Value Number="68" Name="Fat Organ"/>
+ <Value Number="69" Name="Vibes"/>
+ <Value Number="70" Name="Chorus 2"/>
+ <Value Number="71" Name="True PWM"/>
+ <Value Number="72" Name="Upper Waves"/>
+ <Value Number="73" Name="reserved"/>
+ <Value Number="74" Name="reserved"/>
+ <Value Number="75" Name="reserved"/>
+ <Value Number="76" Name="reserved"/>
+ <Value Number="77" Name="reserved"/>
+ <Value Number="78" Name="reserved"/>
+ <Value Number="79" Name="reserved"/>
+ <Value Number="80" Name="reserved"/>
+ <Value Number="81" Name="reserved"/>
+ <Value Number="82" Name="reserved"/>
+ <Value Number="83" Name="reserved"/>
+ <Value Number="84" Name="reserved"/>
+ <Value Number="85" Name="reserved"/>
+ <Value Number="86" Name="User Wavetable 80"/>
+ <Value Number="87" Name="User Wavetable 81"/>
+ <Value Number="88" Name="User Wavetable 82"/>
+ <Value Number="89" Name="User Wavetable 83"/>
+ <Value Number="90" Name="User Wavetable 84"/>
+ <Value Number="91" Name="User Wavetable 85"/>
+ <Value Number="92" Name="User Wavetable 86"/>
+ <Value Number="93" Name="User Wavetable 87"/>
+ <Value Number="94" Name="User Wavetable 88"/>
+ <Value Number="95" Name="User Wavetable 89"/>
+ <Value Number="96" Name="User Wavetable 90"/>
+ <Value Number="97" Name="User Wavetable 91"/>
+ <Value Number="98" Name="User Wavetable 92"/>
+ <Value Number="99" Name="User Wavetable 93"/>
+ <Value Number="100" Name="User Wavetable 94"/>
+ <Value Number="101" Name="User Wavetable 95"/>
+ <Value Number="102" Name="User Wavetable 96"/>
+ <Value Number="103" Name="User Wavetable 97"/>
+ <Value Number="104" Name="User Wavetable 98"/>
+ <Value Number="105" Name="User Wavetable 99"/>
+ <Value Number="106" Name="User Wavetable 100"/>
+ <Value Number="107" Name="User Wavetable 101"/>
+ <Value Number="108" Name="User Wavetable 102"/>
+ <Value Number="109" Name="User Wavetable 103"/>
+ <Value Number="110" Name="User Wavetable 104"/>
+ <Value Number="111" Name="User Wavetable 105"/>
+ <Value Number="112" Name="User Wavetable 106"/>
+ <Value Number="113" Name="User Wavetable 107"/>
+ <Value Number="114" Name="User Wavetable 108"/>
+ <Value Number="115" Name="User Wavetable 109"/>
+ <Value Number="116" Name="User Wavetable 110"/>
+ <Value Number="117" Name="User Wavetable 111"/>
+ <Value Number="118" Name="User Wavetable 112"/>
+ <Value Number="119" Name="User Wavetable 113"/>
+ <Value Number="120" Name="User Wavetable 114"/>
+ <Value Number="121" Name="User Wavetable 115"/>
+ <Value Number="122" Name="User Wavetable 116"/>
+ <Value Number="123" Name="User Wavetable 117"/>
+ <Value Number="124" Name="User Wavetable 118"/>
+ <Value Number="125" Name="-"/>
+ <Value Number="126" Name="-"/>
+ <Value Number="127" Name="-"/>
+ </ValueNameList>
+ <ValueNameList Name="LFOShapes">
+ <Value Number="0" Name="Sine"/>
+ <Value Number="1" Name="Triangle"/>
+ <Value Number="2" Name="Square"/>
+ <Value Number="3" Name="Sawtooth"/>
+ <Value Number="4" Name="Random"/>
+ <Value Number="6" Name="S&H"/>
+ </ValueNameList>
+ <ValueNameList Name="OffOn">
+ <Value Number="0" Name="Off"/>
+ <Value Number="2" Name="On"/>
+ </ValueNameList>
+ <ValueNameList Name="Octaves">
+ <Value Number="16" Name="128'"/>
+ <Value Number="28" Name="64'"/>
+ <Value Number="40" Name="32'"/>
+ <Value Number="52" Name="16'"/>
+ <Value Number="64" Name="8'"/>
+ <Value Number="76" Name="4'"/>
+ <Value Number="88" Name="2'"/>
+ <Value Number="100" Name="1'"/>
+ <Value Number="112" Name="1/2'"/>
+ </ValueNameList>
+ <ValueNameList Name="Semitones">
+ <Value Number="52" Name="-12"/>
+ <Value Number="53" Name="-11"/>
+ <Value Number="54" Name="-10"/>
+ <Value Number="55" Name="-9"/>
+ <Value Number="56" Name="-8"/>
+ <Value Number="57" Name="-7"/>
+ <Value Number="58" Name="-6"/>
+ <Value Number="59" Name="-5"/>
+ <Value Number="60" Name="-4"/>
+ <Value Number="61" Name="-3"/>
+ <Value Number="62" Name="-2"/>
+ <Value Number="63" Name="-1"/>
+ <Value Number="64" Name="0"/>
+ <Value Number="65" Name="+1"/>
+ <Value Number="66" Name="+2"/>
+ <Value Number="67" Name="+3"/>
+ <Value Number="68" Name="+4"/>
+ <Value Number="69" Name="+5"/>
+ <Value Number="70" Name="+6"/>
+ <Value Number="71" Name="+7"/>
+ <Value Number="72" Name="+8"/>
+ <Value Number="73" Name="+9"/>
+ <Value Number="74" Name="+10"/>
+ <Value Number="75" Name="+11"/>
+ <Value Number="76" Name="+12"/>
+ </ValueNameList>
+ <ValueNameList Name="Balances">
+ <Value Number="0" Name="F1 64"/>
+ <Value Number="1" Name="F1 63"/>
+ <Value Number="2" Name="F1 62"/>
+ <Value Number="3" Name="F1 61"/>
+ <Value Number="4" Name="F1 60"/>
+ <Value Number="5" Name="F1 59"/>
+ <Value Number="6" Name="F1 58"/>
+ <Value Number="7" Name="F1 57"/>
+ <Value Number="8" Name="F1 56"/>
+ <Value Number="9" Name="F1 55"/>
+ <Value Number="10" Name="F1 54"/>
+ <Value Number="11" Name="F1 53"/>
+ <Value Number="12" Name="F1 52"/>
+ <Value Number="13" Name="F1 51"/>
+ <Value Number="14" Name="F1 50"/>
+ <Value Number="15" Name="F1 49"/>
+ <Value Number="16" Name="F1 48"/>
+ <Value Number="17" Name="F1 47"/>
+ <Value Number="18" Name="F1 46"/>
+ <Value Number="19" Name="F1 45"/>
+ <Value Number="20" Name="F1 44"/>
+ <Value Number="21" Name="F1 43"/>
+ <Value Number="22" Name="F1 42"/>
+ <Value Number="23" Name="F1 41"/>
+ <Value Number="24" Name="F1 40"/>
+ <Value Number="25" Name="F1 39"/>
+ <Value Number="26" Name="F1 38"/>
+ <Value Number="27" Name="F1 37"/>
+ <Value Number="28" Name="F1 36"/>
+ <Value Number="29" Name="F1 35"/>
+ <Value Number="30" Name="F1 34"/>
+ <Value Number="31" Name="F1 33"/>
+ <Value Number="32" Name="F1 32"/>
+ <Value Number="33" Name="F1 31"/>
+ <Value Number="34" Name="F1 30"/>
+ <Value Number="35" Name="F1 29"/>
+ <Value Number="36" Name="F1 28"/>
+ <Value Number="37" Name="F1 27"/>
+ <Value Number="38" Name="F1 26"/>
+ <Value Number="39" Name="F1 25"/>
+ <Value Number="40" Name="F1 24"/>
+ <Value Number="41" Name="F1 23"/>
+ <Value Number="42" Name="F1 22"/>
+ <Value Number="43" Name="F1 21"/>
+ <Value Number="44" Name="F1 20"/>
+ <Value Number="45" Name="F1 19"/>
+ <Value Number="46" Name="F1 18"/>
+ <Value Number="47" Name="F1 17"/>
+ <Value Number="48" Name="F1 16"/>
+ <Value Number="49" Name="F1 15"/>
+ <Value Number="50" Name="F1 14"/>
+ <Value Number="51" Name="F1 13"/>
+ <Value Number="52" Name="F1 12"/>
+ <Value Number="53" Name="F1 11"/>
+ <Value Number="54" Name="F1 10"/>
+ <Value Number="55" Name="F1 9"/>
+ <Value Number="56" Name="F1 8"/>
+ <Value Number="57" Name="F1 7"/>
+ <Value Number="58" Name="F1 6"/>
+ <Value Number="59" Name="F1 5"/>
+ <Value Number="60" Name="F1 4"/>
+ <Value Number="61" Name="F1 3"/>
+ <Value Number="62" Name="F1 2"/>
+ <Value Number="63" Name="F1 1"/>
+ <Value Number="64" Name="middle"/>
+ <Value Number="65" Name="F2 1"/>
+ <Value Number="66" Name="F2 2"/>
+ <Value Number="67" Name="F2 3"/>
+ <Value Number="68" Name="F2 4"/>
+ <Value Number="69" Name="F2 5"/>
+ <Value Number="70" Name="F2 6"/>
+ <Value Number="71" Name="F2 7"/>
+ <Value Number="72" Name="F2 8"/>
+ <Value Number="73" Name="F2 9"/>
+ <Value Number="74" Name="F2 10"/>
+ <Value Number="75" Name="F2 11"/>
+ <Value Number="76" Name="F2 12"/>
+ <Value Number="77" Name="F2 13"/>
+ <Value Number="78" Name="F2 14"/>
+ <Value Number="79" Name="F2 15"/>
+ <Value Number="80" Name="F2 16"/>
+ <Value Number="81" Name="F2 17"/>
+ <Value Number="82" Name="F2 18"/>
+ <Value Number="83" Name="F2 19"/>
+ <Value Number="84" Name="F2 20"/>
+ <Value Number="85" Name="F2 21"/>
+ <Value Number="86" Name="F2 22"/>
+ <Value Number="87" Name="F2 23"/>
+ <Value Number="88" Name="F2 24"/>
+ <Value Number="89" Name="F2 25"/>
+ <Value Number="90" Name="F2 26"/>
+ <Value Number="91" Name="F2 27"/>
+ <Value Number="92" Name="F2 28"/>
+ <Value Number="93" Name="F2 29"/>
+ <Value Number="94" Name="F2 30"/>
+ <Value Number="95" Name="F2 31"/>
+ <Value Number="96" Name="F2 32"/>
+ <Value Number="97" Name="F2 33"/>
+ <Value Number="98" Name="F2 34"/>
+ <Value Number="99" Name="F2 35"/>
+ <Value Number="100" Name="F2 36"/>
+ <Value Number="101" Name="F2 37"/>
+ <Value Number="102" Name="F2 38"/>
+ <Value Number="103" Name="F2 39"/>
+ <Value Number="104" Name="F2 40"/>
+ <Value Number="105" Name="F2 41"/>
+ <Value Number="106" Name="F2 42"/>
+ <Value Number="107" Name="F2 43"/>
+ <Value Number="108" Name="F2 44"/>
+ <Value Number="109" Name="F2 45"/>
+ <Value Number="110" Name="F2 46"/>
+ <Value Number="111" Name="F2 47"/>
+ <Value Number="112" Name="F2 48"/>
+ <Value Number="113" Name="F2 49"/>
+ <Value Number="114" Name="F2 50"/>
+ <Value Number="115" Name="F2 51"/>
+ <Value Number="116" Name="F2 52"/>
+ <Value Number="117" Name="F2 53"/>
+ <Value Number="118" Name="F2 54"/>
+ <Value Number="119" Name="F2 55"/>
+ <Value Number="120" Name="F2 56"/>
+ <Value Number="121" Name="F2 57"/>
+ <Value Number="122" Name="F2 58"/>
+ <Value Number="123" Name="F2 59"/>
+ <Value Number="124" Name="F2 60"/>
+ <Value Number="125" Name="F2 61"/>
+ <Value Number="126" Name="F2 62"/>
+ <Value Number="127" Name="F2 63"/>
+ </ValueNameList>
+ <ValueNameList Name="FilterTypes">
+ <Value Number="0" Name="Bypass"/>
+ <Value Number="1" Name="Low Pass 24dB"/>
+ <Value Number="2" Name="Low Pass 12dB"/>
+ <Value Number="3" Name="Band Pass 24dB"/>
+ <Value Number="4" Name="Band Pass 12dB"/>
+ <Value Number="5" Name="High Pass 24dB"/>
+ <Value Number="6" Name="High Pass 12dB"/>
+ <Value Number="7" Name="Notch 24dB"/>
+ <Value Number="8" Name="Notch 12dB"/>
+ <Value Number="9" Name="Comb+"/>
+ <Value Number="10" Name="Comb-"/>
+ <Value Number="12" Name="PPG Low Pass"/>
+ </ValueNameList>
+ <ControlNameList Name="Controls">
+ <Control Type="7bit" Number="1" Name="Modulation Wheel"/>
+ <Control Type="7bit" Number="2" Name="Breath Control"/>
+ <Control Type="7bit" Number="4" Name="Foot Control"/>
+ <Control Type="7bit" Number="5" Name="Glide Rate"/>
+ <Control Type="7bit" Number="7" Name="Channel Volume"/>
+ <Control Type="7bit" Number="8" Name="Balance"/>
+ <Control Type="7bit" Number="10" Name="Pan"/>
+ <Control Type="7bit" Number="11" Name="Expression"/>
+ <Control Type="7bit" Number="12" Name="Arp Range">
+ <Values Min="0" Max="127">
+ <ValueNameList>
+ <Value Number="0" Name="1 Octave"/>
+ <Value Number="1" Name="2 Octaves"/>
+ <Value Number="2" Name="3 Octaves"/>
+ <Value Number="3" Name="4 Octaves"/>
+ <Value Number="4" Name="5 Octaves"/>
+ <Value Number="5" Name="6 Octaves"/>
+ <Value Number="6" Name="7 Octaves"/>
+ <Value Number="7" Name="8 Octaves"/>
+ <Value Number="8" Name="9 Octaves"/>
+ <Value Number="10" Name="10 Octaves"/>
+ </ValueNameList>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="13" Name="Arp Length">
+ <Values Min="0" Max="127">
+ <ValueNameList>
+ <Value Number="0" Name="1 step"/>
+ <Value Number="1" Name="2 steps"/>
+ <Value Number="2" Name="3 steps"/>
+ <Value Number="3" Name="4 steps"/>
+ <Value Number="4" Name="5 steps"/>
+ <Value Number="5" Name="6 steps"/>
+ <Value Number="6" Name="7 steps"/>
+ <Value Number="7" Name="8 steps"/>
+ <Value Number="8" Name="9 steps"/>
+ <Value Number="9" Name="10 steps"/>
+ <Value Number="10" Name="11 steps"/>
+ <Value Number="11" Name="12 steps"/>
+ <Value Number="12" Name="13 steps"/>
+ <Value Number="13" Name="14 steps"/>
+ <Value Number="14" Name="15 steps"/>
+ <Value Number="16" Name="16 steps"/>
+ </ValueNameList>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="14" Name="Arp Active">
+ <Values Min="0" Max="127">
+ <ValueNameList>
+ <Value Number="0" Name="Off"/>
+ <Value Number="1" Name="On"/>
+ <Value Number="2" Name="One shot"/>
+ <Value Number="4" Name="Hold"/>
+ </ValueNameList>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="15" Name="LFO 1 Shape">
+ <Values Min="0" Max="6">
+ <UsesValueNameList Name="LFOShapes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="16" Name="LFO 1 Speed"/>
+ <Control Type="7bit" Number="17" Name="LFO 1 Sync">
+ <Values Min="0" Max="2">
+ <UsesValueNameList Name="OffOn"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="18" Name="LFO 1 Delay"/>
+ <Control Type="7bit" Number="19" Name="LFO 2 Shape">
+ <Values Min="0" Max="6">
+ <UsesValueNameList Name="LFOShapes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="20" Name="LFO 2 Speed"/>
+ <Control Type="7bit" Number="21" Name="LFO 2 Sync">
+ <Values Min="0" Max="2">
+ <UsesValueNameList Name="OffOn"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="22" Name="LFO 2 Delay"/>
+ <Control Type="7bit" Number="23" Name="LFO 3 Shape">
+ <Values Min="0" Max="6">
+ <UsesValueNameList Name="LFOShapes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="24" Name="LFO 3 Speed"/>
+ <Control Type="7bit" Number="25" Name="LFO 3 Sync">
+ <Values Min="0" Max="2">
+ <UsesValueNameList Name="OffOn"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="26" Name="LFO 3 Delay"/>
+ <Control Type="7bit" Number="27" Name="OSC 1 Octave">
+ <Values Min="16" Max="112">
+ <UsesValueNameList Name="Octaves"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="28" Name="OSC 1 Semitone">
+ <Values Min="52" Max="76">
+ <UsesValueNameList Name="Semitones"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="29" Name="OSC 1 Detune">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Minus64Plus63"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="30" Name="OSC 1 FM"/>
+ <Control Type="7bit" Number="31" Name="OSC 1 Shape">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="OscShapes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="32" Name="Bank Select LSB"/>
+ <Control Type="7bit" Number="33" Name="OSC 1 PW"/>
+ <Control Type="7bit" Number="34" Name="OSC 1 PWM">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Minus64Plus63"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="35" Name="OSC 2 Octave">
+ <Values Min="16" Max="112">
+ <UsesValueNameList Name="Octaves"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="36" Name="OSC 2 Semitone">
+ <Values Min="52" Max="76">
+ <UsesValueNameList Name="Semitones"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="37" Name="OSC 2 Detune">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Minus64Plus63"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="38" Name="OSC 2 FM"/>
+ <Control Type="7bit" Number="39" Name="OSC 2 Shape">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="OscShapes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="40" Name="OSC 2 PW"/>
+ <Control Type="7bit" Number="41" Name="OSC 2 PWM">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Minus64Plus63"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="42" Name="OSC 3 Octave">
+ <Values Min="16" Max="112">
+ <UsesValueNameList Name="Octaves"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="43" Name="OSC 3 Semitone">
+ <Values Min="52" Max="76">
+ <UsesValueNameList Name="Semitones"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="44" Name="OSC 3 Detune">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Minus64Plus63"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="45" Name="OSC 3 FM"/>
+ <Control Type="7bit" Number="46" Name="OSC 3 Shape">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="OscShapes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="47" Name="OSC 3 PW"/>
+ <Control Type="7bit" Number="48" Name="OSC 3 PWM">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Minus64Plus63"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="49" Name="Sync">
+ <Values Min="0" Max="2">
+ <UsesValueNameList Name="OffOn"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="50" Name="Pitchmod"/>
+ <Control Type="7bit" Number="51" Name="Glide Mode">
+ <Values Min="0" Max="4">
+ <ValueNameList>
+ <Value Number="0" Name="Portamento"/>
+ <Value Number="1" Name="Fingered Portamento"/>
+ <Value Number="2" Name="Glissando"/>
+ <Value Number="4" Name="Fingered Glissando"/>
+ </ValueNameList>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="52" Name="OSC 1 Level"/>
+ <Control Type="7bit" Number="53" Name="OSC 1 Balance">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Balances"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="54" Name="Ringmod Level"/>
+ <Control Type="7bit" Number="55" Name="Ringmod Balance">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Balances"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="56" Name="OSC 2 Level"/>
+ <Control Type="7bit" Number="57" Name="OSC 2 Balance">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Balances"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="58" Name="OSC 3 Level"/>
+ <Control Type="7bit" Number="59" Name="OSC 3 Balance">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Balances"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="60" Name="Noise Level"/>
+ <Control Type="7bit" Number="61" Name="Noise Balance">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="Balances"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="62" Name="Noise Colour"/>
+ <Control Type="7bit" Number="64" Name="Sustain Pedal"/>
+ <Control Type="7bit" Number="65" Name="Glide Active">
+ <Values Min="0" Max="2">
+ <UsesValueNameList Name="OffOn"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="66" Name="Sostenuto">
+ <Values Min="0" Max="2">
+ <UsesValueNameList Name="OffOn"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="67" Name="Routing">
+ <Values Min="0" Max="2">
+ <ValueNameList>
+ <Value Number="0" Name="serial"/>
+ <Value Number="2" Name="parallel"/>
+ </ValueNameList>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="68" Name="Filter 1 Type">
+ <Values Min="0" Max="127">
+ <UsesValueNameList Name="FilterTypes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="69" Name="Filter 1 Cutoff"/>
+ <Control Type="7bit" Number="70" Name="Filter 1 Resonance"/>
+ <Control Type="7bit" Number="71" Name="Filter 1 Drive"/>
+ <Control Type="7bit" Number="72" Name="Filter 1 Keytrack"/>
+ <Control Type="7bit" Number="73" Name="Filter 1 Env. Amount"/>
+ <Control Type="7bit" Number="74" Name="Filter 1 Env. Velocity"/>
+ <Control Type="7bit" Number="75" Name="Filter 1 CutoffMod"/>
+ <Control Type="7bit" Number="76" Name="Filter 1 FM"/>
+ <Control Type="7bit" Number="77" Name="Filter 1 Pan"/>
+ <Control Type="7bit" Number="78" Name="Filter 1 Panmod"/>
+ <Control Type="7bit" Number="79" Name="Filter 2 Type">
+ <Values Min="0" Max="12">
+ <UsesValueNameList Name="FilterTypes"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="80" Name="Filter 2 Cutoff"/>
+ <Control Type="7bit" Number="81" Name="Filter 2 Resonance"/>
+ <Control Type="7bit" Number="82" Name="Filter 2 Drive"/>
+ <Control Type="7bit" Number="83" Name="Filter 2 Keytrack"/>
+ <Control Type="7bit" Number="84" Name="Filter 2 Env. Amount"/>
+ <Control Type="7bit" Number="85" Name="Filter 2 Env. Velocity"/>
+ <Control Type="7bit" Number="86" Name="Filter 2 CutoffMod"/>
+ <Control Type="7bit" Number="87" Name="Filter 2 FM"/>
+ <Control Type="7bit" Number="88" Name="Filter 2 Pan"/>
+ <Control Type="7bit" Number="89" Name="Filter 2 Panmod"/>
+ <Control Type="7bit" Number="90" Name="Amp Volume"/>
+ <Control Type="7bit" Number="91" Name="Amp Velocity"/>
+ <Control Type="7bit" Number="92" Name="Amp Mod"/>
+ <Control Type="7bit" Number="93" Name="FX 1 Mix"/>
+ <Control Type="7bit" Number="94" Name="FX 2 Mix"/>
+ <Control Type="7bit" Number="95" Name="Filter Env. Attack"/>
+ <Control Type="7bit" Number="96" Name="Filter Env. Decay"/>
+ <Control Type="7bit" Number="97" Name="Filter Env. Sustain"/>
+ <Control Type="7bit" Number="98" Name="Filter Env. Decay 2"/>
+ <Control Type="7bit" Number="99" Name="Filter Env. Sustain 2"/>
+ <Control Type="7bit" Number="100" Name="Filter Env. Release"/>
+ <Control Type="7bit" Number="101" Name="Amp Env. Attack"/>
+ <Control Type="7bit" Number="102" Name="Amp Env. Decay"/>
+ <Control Type="7bit" Number="103" Name="Amp Env. Sustain"/>
+ <Control Type="7bit" Number="104" Name="Amp Env. Decay 2"/>
+ <Control Type="7bit" Number="105" Name="Amp Env. Sustain 2"/>
+ <Control Type="7bit" Number="106" Name="Amp Env. Release"/>
+ <Control Type="7bit" Number="107" Name="Env. 3 Attack"/>
+ <Control Type="7bit" Number="108" Name="Env. 3 Decay"/>
+ <Control Type="7bit" Number="109" Name="Env. 3 Sustain"/>
+ <Control Type="7bit" Number="110" Name="Env. 3 Decay 2"/>
+ <Control Type="7bit" Number="111" Name="Env. 3 Sustain 2"/>
+ <Control Type="7bit" Number="112" Name="Env. 3 Release"/>
+ <Control Type="7bit" Number="113" Name="Env. 4 Attack"/>
+ <Control Type="7bit" Number="114" Name="Env. 4 Decay"/>
+ <Control Type="7bit" Number="115" Name="Env. 4 Sustain"/>
+ <Control Type="7bit" Number="116" Name="Env. 4 Decay 2"/>
+ <Control Type="7bit" Number="117" Name="Env. 4 Sustain 2"/>
+ <Control Type="7bit" Number="118" Name="Env. 4 Release"/>
+ <Control Type="7bit" Number="121" Name="Reset All Controllers"/>
+ <Control Type="7bit" Number="122" Name="Local Control">
+ <Values Min="0" Max="2">
+ <UsesValueNameList Name="OffOn"/>
+ </Values>
+ </Control>
+ <Control Type="7bit" Number="124" Name="Omni Mode Off"/>
+ <Control Type="7bit" Number="125" Name="Omni Mode On"/>
+ <Control Type="7bit" Number="126" Name="Poly Mode On/Off"/>
+ <Control Type="7bit" Number="127" Name="Poly Mode On"/>
+ </ControlNameList>
</MasterDeviceNames>
</MIDINameDocument>
diff --git a/scripts/HiAndLowPass.lua b/scripts/HiAndLowPass.lua
new file mode 100644
index 0000000..5dd3dfa
--- /dev/null
+++ b/scripts/HiAndLowPass.lua
@@ -0,0 +1,396 @@
+ardour {
+ ["type"] = "dsp",
+ name = "a-High/Low Pass Filter",
+ category = "Filter",
+ license = "GPLv2",
+ author = "Ardour Team",
+ description = [[High and Low Pass Filter with de-zipped controls, written in Ardour-Lua]]
+}
+
+function dsp_ioconfig ()
+ return
+ {
+ -- allow any number of I/O as long as port-count matches
+ { audio_in = -1, audio_out = -1},
+ }
+end
+
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "High Pass Steepness", min = 0, max = 4, default = 1, enum = true, scalepoints =
+ {
+ ["Off"] = 0,
+ ["12dB/oct"] = 1,
+ ["24dB/oct"] = 2,
+ ["36dB/oct"] = 3,
+ ["48dB/oct"] = 4,
+ }
+ },
+ { ["type"] = "input", name = "High Pass Cut off frequency", min = 5, max = 20000, default = 100, unit="Hz", logarithmic = true },
+ { ["type"] = "input", name = "High Pass Resonance", min = 0.1, max = 6, default = .707, logarithmic = true },
+
+ { ["type"] = "input", name = "Low Pass Steepness", min = 0, max = 4, default = 1, enum = true, scalepoints =
+ {
+ ["Off"] = 0,
+ ["12dB/oct"] = 1,
+ ["24dB/oct"] = 2,
+ ["36dB/oct"] = 3,
+ ["48dB/oct"] = 4,
+ }
+ },
+ { ["type"] = "input", name = "Low Pass Cut off frequency", min = 20, max = 20000, default = 18000, unit="Hz", logarithmic = true },
+ { ["type"] = "input", name = "Low Pass Resonance", min = 0.1, max = 6, default = .707, logarithmic = true },
+ }
+end
+
+-- these globals are *not* shared between DSP and UI
+local hp = {} -- the biquad high-pass filter instances (DSP)
+local lp = {} -- the biquad high-pass filter instances (DSP)
+local filt = nil -- the biquad filter instance (GUI, response)
+local cur = {0, 0, 0, 0, 0, 0} -- current parameters
+local lpf = 0.03 -- parameter low-pass filter time-constant
+local chn = 0 -- channel/filter count
+local lpf_chunk = 0 -- chunk size for audio processing when interpolating parameters
+local max_freq = 20000
+
+local mem = nil -- memory x-fade buffer
+
+function dsp_init (rate)
+ -- allocate some mix-buffer
+ mem = ARDOUR.DSP.DspShm (8192)
+
+ -- max allowed cut-off frequency
+ max_freq = .499 * rate
+
+ -- create a table of objects to share with the GUI
+ local tbl = {}
+ tbl['samplerate'] = rate
+ tbl['max_freq'] = max_freq
+ self:table ():set (tbl)
+
+
+ -- Parameter smoothing: we want to filter out parameter changes that are
+ -- faster than 15Hz, and interpolate between parameter values.
+ -- For performance reasons, we want to ensure that two consecutive values
+ -- of the interpolated "steepness" are less that 1 apart. By choosing the
+ -- interpolation chunk size to be 64 in most cases, but 32 if the rate is
+ -- strictly less than 22kHz (there's only 8kHz in standard rates), we can
+ -- ensure that steepness interpolation will never change the parameter by
+ -- more than ~0.86.
+ lpf_chunk = 64
+ if rate < 22000 then lpf_chunk = 32 end
+ -- We apply a discrete version of the standard RC low-pass, with a cutoff
+ -- frequency of 15Hz. For more information about the underlying math, see
+ -- https://en.wikipedia.org/wiki/Low-pass_filter#Discrete-time_realization
+ -- (here Ît is lpf_chunk / rate)
+ local R = 2 * math.pi * lpf_chunk * 15 -- Hz
+ lpf = R / (R + rate)
+end
+
+function dsp_configure (ins, outs)
+ assert (ins:n_audio () == outs:n_audio ())
+ local tbl = self:table ():get () -- get shared memory table
+
+ chn = ins:n_audio ()
+ cur = {0, 0, 0, 0, 0, 0}
+
+ hp = {}
+ lp = {}
+
+ collectgarbage ()
+
+ for c = 1, chn do
+ hp[c] = {}
+ lp[c] = {}
+ -- initialize filters
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:Biquad
+
+ -- A different Biquad is needed for each pass and channel because they
+ -- remember the last two samples seen during the last call of Biquad:run().
+ -- For continuity these have to come from the previous audio chunk of the
+ -- same channel and pass and would be clobbered if the same Biquad was
+ -- called several times by cycle.
+ for k = 1,4 do
+ hp[c][k] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+ lp[c][k] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+ end
+ end
+end
+
+function santize_params (ctrl)
+ -- don't allow manual cross-fades. enforce enums
+ ctrl[1] = math.floor(ctrl[1] + .5)
+ ctrl[4] = math.floor(ctrl[4] + .5)
+
+ -- high pass, clamp range
+ ctrl[2] = math.min (max_freq, math.max (5, ctrl[2]))
+ ctrl[3] = math.min (6, math.max (0.1, ctrl[3]))
+
+ -- low pass, clamp range
+ ctrl[5] = math.min (max_freq, math.max (20, ctrl[5]))
+ ctrl[6] = math.min (6, math.max (0.1, ctrl[6]))
+ return ctrl
+end
+
+-- helper functions for parameter interpolation
+function param_changed (ctrl)
+ for p = 1,6 do
+ if ctrl[p] ~= cur[p] then
+ return true
+ end
+ end
+ return false
+end
+
+function low_pass_filter_param (old, new, limit)
+ if math.abs (old - new) < limit then
+ return new
+ else
+ return old + lpf * (new - old)
+ end
+end
+
+-- apply parameters, re-compute filter coefficients if needed
+function apply_params (ctrl)
+ if not param_changed (ctrl) then
+ return
+ end
+
+ -- low-pass filter ctrl parameter values, smooth transition
+ cur[1] = low_pass_filter_param (cur[1], ctrl[1], 0.05) -- HP order x-fade
+ cur[2] = low_pass_filter_param (cur[2], ctrl[2], 1.0) -- HP freq/Hz
+ cur[3] = low_pass_filter_param (cur[3], ctrl[3], 0.01) -- HP quality
+ cur[4] = low_pass_filter_param (cur[4], ctrl[4], 0.05) -- LP order x-fade
+ cur[5] = low_pass_filter_param (cur[5], ctrl[5], 1.0) -- LP freq/Hz
+ cur[6] = low_pass_filter_param (cur[6], ctrl[6], 0.01) -- LP quality
+
+ for c = 1, chn do
+ for k = 1,4 do
+ hp[c][k]:compute (ARDOUR.DSP.BiquadType.HighPass, cur[2], cur[3], 0)
+ lp[c][k]:compute (ARDOUR.DSP.BiquadType.LowPass, cur[5], cur[6], 0)
+ end
+ end
+end
+
+
+-- the actual DSP callback
+function dsp_run (ins, outs, n_samples)
+ assert (n_samples < 8192)
+ assert (#ins == chn)
+ local ctrl = santize_params (CtrlPorts:array ())
+
+ local changed = false
+ local siz = n_samples
+ local off = 0
+
+ -- if a parameter was changed, process at most lpf_chunk samples
+ -- at a time and interpolate parameters until the current settings
+ -- match the target values
+ if param_changed (ctrl) then
+ changed = true
+ siz = lpf_chunk
+ end
+
+ while n_samples > 0 do
+ if changed then apply_params (ctrl) end
+ if siz > n_samples then siz = n_samples end
+
+ local ho = math.floor(cur[1])
+ local lo = math.floor(cur[4])
+
+ -- process all channels
+ for c = 1, #ins do
+
+ -- High Pass
+ local xfade = cur[1] - ho
+
+ -- prepare scratch memory
+ ARDOUR.DSP.copy_vector (mem:to_float (off), ins[c]:offset (off), siz)
+
+ -- run at least |ho| biquads...
+ for k = 1,ho do
+ hp[c][k]:run (mem:to_float (off), siz)
+ end
+ ARDOUR.DSP.copy_vector (outs[c]:offset (off), mem:to_float (off), siz)
+
+ -- mix the output of |ho| biquads (with weight |1-xfade|)
+ -- with the output of |ho+1| biquads (with weight |xfade|)
+ if xfade > 0 then
+ ARDOUR.DSP.apply_gain_to_buffer (outs[c]:offset (off), siz, 1 - xfade)
+ hp[c][ho+1]:run (mem:to_float (off), siz)
+ ARDOUR.DSP.mix_buffers_with_gain (outs[c]:offset (off), mem:to_float (off), siz, xfade)
+ -- also run the next biquad because it needs to have the correct state
+ -- in case it start affecting the next chunck of output. Higher order
+ -- ones are guaranteed not to be needed for the next run because the
+ -- interpolated order won't increase more than 0.86 in one step thanks
+ -- to the choice of the value of |lpf|.
+ if ho + 2 <= 4 then hp[c][ho+2]:run (mem:to_float (off), siz) end
+ elseif ho + 1 <= 4 then
+ -- run the next biquad in case it is used next chunk
+ hp[c][ho+1]:run (mem:to_float (off), siz)
+ end
+
+ -- Low Pass
+ xfade = cur[4] - lo
+
+ -- prepare scratch memory (from high pass output)
+ ARDOUR.DSP.copy_vector (mem:to_float (off), outs[c]:offset (off), siz)
+
+ -- run at least |lo| biquads...
+ for k = 1,lo do
+ lp[c][k]:run (mem:to_float (off), siz)
+ end
+ ARDOUR.DSP.copy_vector (outs[c]:offset (off), mem:to_float (off), siz)
+
+ -- mix the output of |lo| biquads (with weight |1-xfade|)
+ -- with the output of |lo+1| biquads (with weight |xfade|)
+ if xfade > 0 then
+ ARDOUR.DSP.apply_gain_to_buffer (outs[c]:offset (off), siz, 1 - xfade)
+ lp[c][lo+1]:run (mem:to_float (off), siz)
+ ARDOUR.DSP.mix_buffers_with_gain (outs[c]:offset (off), mem:to_float (off), siz, xfade)
+ -- also run the next biquad in case it start affecting the next
+ -- chunck of output.
+ if lo + 2 <= 4 then lp[c][lo+2]:run (mem:to_float (off), siz) end
+ elseif lo + 1 <= 4 then
+ -- run the next biquad in case it is used next chunk
+ lp[c][lo+1]:run (mem:to_float (off), siz)
+ end
+
+ end
+
+ n_samples = n_samples - siz
+ off = off + siz
+ end
+
+ if changed then
+ -- notify display
+ self:queue_draw ()
+ end
+end
+
+
+-------------------------------------------------------------------------------
+--- inline display
+
+function round (n)
+ return math.floor (n + .5)
+end
+
+function freq_at_x (x, w)
+ -- frequency in Hz at given x-axis pixel
+ return 20 * 1000 ^ (x / w)
+end
+
+function x_at_freq (f, w)
+ -- x-axis pixel for given frequency, power-scale
+ return w * math.log (f / 20.0) / math.log (1000.0)
+end
+
+function db_to_y (db, h)
+ -- y-axis gain mapping
+ if db < -60 then db = -60 end
+ if db > 12 then db = 12 end
+ return -.5 + round (0.2 * h) - h * db / 60
+end
+
+function grid_db (ctx, w, h, db)
+ -- draw horizontal grid line
+ -- note that a cairo pixel at Y spans [Y - 0.5 to Y + 0.5]
+ local y = -.5 + round (db_to_y (db, h))
+ ctx:move_to (0, y)
+ ctx:line_to (w, y)
+ ctx:stroke ()
+end
+
+function grid_freq (ctx, w, h, f)
+ -- draw vertical grid line
+ local x = -.5 + round (x_at_freq (f, w))
+ ctx:move_to (x, 0)
+ ctx:line_to (x, h)
+ ctx:stroke ()
+end
+
+function response (ho, lo, f)
+ -- calculate transfer function response for given
+ -- hi/po pass order at given frequency [Hz]
+ local db = ho * filt['hp']:dB_at_freq (f)
+ return db + lo * filt['lp']:dB_at_freq (f)
+end
+
+function render_inline (ctx, w, max_h)
+ if not filt then
+ local tbl = self:table ():get () -- get shared memory table
+ -- instantiate filter (to calculate the transfer function's response)
+ filt = {}
+ filt['hp'] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+ filt['lp'] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+ max_freq = tbl['max_freq']
+ end
+
+ local ctrl = santize_params (CtrlPorts:array ())
+ -- set filter coefficients if they have changed
+ if param_changed (ctrl) then
+ for k = 1,6 do cur[k] = ctrl[k] end
+ filt['hp']:compute (ARDOUR.DSP.BiquadType.HighPass, cur[2], cur[3], 0)
+ filt['lp']:compute (ARDOUR.DSP.BiquadType.LowPass, cur[5], cur[6], 0)
+ end
+
+ -- calc height of inline display
+ local h = 1 | math.ceil (w * 9 / 16) -- use 16:9 aspect, odd number of y pixels
+ if (h > max_h) then h = max_h end -- but at most max-height
+
+ -- ctx is a http://cairographics.org/ context
+ -- http://manual.ardour.org/lua-scripting/class_reference/#Cairo:Context
+
+ -- clear background
+ ctx:rectangle (0, 0, w, h)
+ ctx:set_source_rgba (.2, .2, .2, 1.0)
+ ctx:fill ()
+ ctx:rectangle (0, 0, w, h)
+ ctx:clip ()
+
+ -- set line width: 1px
+ ctx:set_line_width (1.0)
+
+ -- draw grid
+ local dash3 = C.DoubleVector ()
+ local dash2 = C.DoubleVector ()
+ dash2:add ({1, 2})
+ dash3:add ({1, 3})
+ ctx:set_dash (dash2, 2) -- dotted line: 1 pixel 2 space
+ ctx:set_source_rgba (.5, .5, .5, .8)
+ grid_db (ctx, w, h, 0)
+ ctx:set_dash (dash3, 2) -- dashed line: 1 pixel 3 space
+ ctx:set_source_rgba (.5, .5, .5, .5)
+ grid_db (ctx, w, h, -12)
+ grid_db (ctx, w, h, -24)
+ grid_db (ctx, w, h, -36)
+ grid_freq (ctx, w, h, 100)
+ grid_freq (ctx, w, h, 1000)
+ grid_freq (ctx, w, h, 10000)
+ ctx:unset_dash ()
+
+ -- draw transfer function line
+ local ho = math.floor(cur[1])
+ local lo = math.floor(cur[4])
+
+ ctx:set_source_rgba (.8, .8, .8, 1.0)
+ ctx:move_to (-.5, db_to_y (response(ho, lo, freq_at_x (0, w)), h))
+ for x = 1,w do
+ local db = response(ho, lo, freq_at_x (x, w))
+ ctx:line_to (-.5 + x, db_to_y (db, h))
+ end
+ -- stoke a line, keep the path
+ ctx:stroke_preserve ()
+
+ -- fill area to zero under the curve
+ ctx:line_to (w, -.5 + round (db_to_y (0, h)))
+ ctx:line_to (0, -.5 + round (db_to_y (0, h)))
+ ctx:close_path ()
+ ctx:set_source_rgba (.5, .5, .5, .5)
+ ctx:fill ()
+
+ return {w, h}
+end
diff --git a/scripts/_amp1.lua b/scripts/_amp1.lua
new file mode 100644
index 0000000..03be396
--- /dev/null
+++ b/scripts/_amp1.lua
@@ -0,0 +1,47 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Simple Amp",
+ category = "Example",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[
+ An Example DSP Plugin for processing audio, to
+ be used with Ardour's Lua scripting facility.]]
+}
+
+
+-- return possible i/o configurations
+function dsp_ioconfig ()
+ -- -1, -1 = any number of channels as long as input and output count matches
+ return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+-- optional function, called when configuring the plugin
+function dsp_configure (ins, outs)
+ -- store configuration in global variable
+ audio_ins = ins:n_audio();
+ local audio_outs = outs:n_audio()
+ assert (audio_ins == audio_outs)
+end
+
+-- this variant asks for a complete *copy* of the
+-- audio data in a lua-table.
+-- after processing the data is copied back.
+--
+-- this also exemplifies the direct "connect and run" process function,
+-- where the channel-mapping needs to be done in lua.
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+ for c = 1,audio_ins do
+ -- Note: lua starts counting at 1, ardour's ChanMapping::get() at 0
+ local ib = in_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped input buffer for given channel
+ local ob = out_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped output buffer for given channel
+ assert (ib ~= ARDOUR.ChanMapping.Invalid);
+ assert (ob ~= ARDOUR.ChanMapping.Invalid);
+ local a = bufs:get_audio (ib):data (offset):get_table(n_samples) -- copy audio-data from input buffer
+ for s = 1,n_samples do
+ a[s] = a[s] * 2; -- amplify data in lua table
+ end
+ bufs:get_audio(ob):data(offset):set_table(a, n_samples) -- copy back
+ end
+end
diff --git a/scripts/_amp2.lua b/scripts/_amp2.lua
new file mode 100644
index 0000000..89d11fc
--- /dev/null
+++ b/scripts/_amp2.lua
@@ -0,0 +1,51 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Simple Amp II",
+ category = "Example",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[
+ An Example DSP Plugin for processing audio, to
+ be used with Ardour's Lua scripting facility.]]
+}
+
+-- see amp1.lua
+function dsp_ioconfig ()
+ return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_configure (ins, outs)
+ audio_ins = ins:n_audio();
+ local audio_outs = outs:n_audio()
+ assert (audio_ins == audio_outs)
+end
+
+
+-- this variant modifies the audio data in-place
+-- in Ardour's buffer.
+--
+-- It relies on the fact that by default Ardour requires
+-- plugins to process data in-place (zero copy).
+--
+-- Every assignment directly calls a c-function behind
+-- the scenes to get/set the value.
+-- It's a bit more efficient than "Amp I" on most systems.
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+ for c = 1,audio_ins do
+ -- ensure that processing does happen in-place
+ local ib = in_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped input buffer for given cannel
+ local ob = out_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped output buffer for given cannel
+ assert (ib ~= ARDOUR.ChanMapping.Invalid);
+ assert (ob ~= ARDOUR.ChanMapping.Invalid);
+
+ local bi = bufs:get_audio(ib)
+ local bo = bufs:get_audio(ob)
+ assert (bi:sameinstance(bo))
+
+ local a = bufs:get_audio(ib):data(offset):array() -- get a reference (pointer to array)
+ for s = 1,n_samples do
+ a[s] = a[s] * 2; -- modify data in-place (shared with ardour)
+ end
+ end
+end
diff --git a/scripts/_amp3.lua b/scripts/_amp3.lua
new file mode 100644
index 0000000..bb1a589
--- /dev/null
+++ b/scripts/_amp3.lua
@@ -0,0 +1,44 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Simple Amp III",
+ category = "Example",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[
+ An Example DSP Plugin for processing audio, to
+ be used with Ardour's Lua scripting facility.]]
+}
+
+function dsp_ioconfig ()
+ return
+ {
+ { audio_in = -1, audio_out = -1},
+ }
+end
+
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "Gain", min = -20, max = 20, default = 6, unit="dB", scalepoints = { ["0"] = 0, ["twice as loud"] = 6 , ["half as loud"] = -6 } },
+ }
+end
+
+
+-- use ardour's vectorized functions
+--
+-- This is as efficient as Ardour doing it itself in C++
+-- Lua function overhead is negligible
+--
+-- this also exemplifies the /simpler/ way of delegating the
+-- channel-mapping to ardour.
+
+function dsp_run (ins, outs, n_samples)
+ local ctrl = CtrlPorts:array() -- get control port array (read/write)
+ local gain = ARDOUR.DSP.dB_to_coefficient (ctrl[1])
+ assert (#ins == #outs) -- ensure that we can run in-place (channel count matches)
+ for c = 1,#ins do
+ assert (ins[c]:sameinstance(outs[c])) -- check in-place
+ ARDOUR.DSP.apply_gain_to_buffer (ins[c], n_samples, gain); -- process in-place
+ end
+end
diff --git a/scripts/_biquad_filter.lua b/scripts/_biquad_filter.lua
new file mode 100644
index 0000000..c0dec8b
--- /dev/null
+++ b/scripts/_biquad_filter.lua
@@ -0,0 +1,280 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Biquad Filter",
+ category = "Filter",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[A Versatile Filter Plugin]]
+}
+
+function dsp_ioconfig ()
+ return
+ {
+ -- allow any number of I/O as long as port-count matches
+ { audio_in = -1, audio_out = -1},
+ }
+end
+
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "Enable", min = 0, max = 1, default = 1, bypass = true, toggled = true },
+ { ["type"] = "input", name = "Type", min = 0, max = 4, default = 0, enum = true, scalepoints =
+ {
+ ["Peaking"] = 0,
+ ["Low Shelf"] = 1,
+ ["High Shelf"] = 2,
+ ["Low Pass"] = 3,
+ ["High Pass"] = 4,
+ }
+ },
+ { ["type"] = "input", name = "Gain", min = -20, max = 20, default = 0, unit="dB" },
+ { ["type"] = "input", name = "Freq", min = 20, max = 20000, default = 1000, unit="Hz", logarithmic = true },
+ { ["type"] = "input", name = "Q", min = 0.1, max = 8, default = .707, logarithmic = true },
+ }
+end
+
+-- translate type parameter to DSP enum
+-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR.DSP.Biquad.Type
+function map_type (t)
+ if t == 1 then
+ return ARDOUR.DSP.BiquadType.LowShelf
+ elseif t == 2 then
+ return ARDOUR.DSP.BiquadType.HighShelf
+ elseif t == 3 then
+ return ARDOUR.DSP.BiquadType.LowPass
+ elseif t == 4 then
+ return ARDOUR.DSP.BiquadType.HighPass
+ else
+ return ARDOUR.DSP.BiquadType.Peaking
+ end
+end
+
+function ctrl_data ()
+ local ctrl = CtrlPorts:array ()
+ if ctrl[1] <= 0 then -- when disabled
+ ctrl[3] = 0; -- force gain to 0dB
+ end
+ return ctrl
+end
+
+-- these globals are *not* shared between DSP and UI
+local filters = {} -- the biquad filter instances (DSP)
+local filt -- the biquad filter instance (GUI, response)
+local cur = {0, 0, 0, 0, 0} -- current parameters
+local lpf = 0.03 -- parameter low-pass filter time-constant
+local chn = 0 -- channel/filter count
+
+function dsp_init (rate)
+ self:shmem ():allocate (1) -- shared mem to tell the GUI the samplerate
+ local cfg = self:shmem ():to_int (0):array ()
+ cfg[1] = rate
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:Biquad
+ filt = ARDOUR.DSP.Biquad (rate) -- initialize filter
+ lpf = 13000 / rate -- interpolation time constant
+end
+
+function dsp_configure (ins, outs)
+ assert (ins:n_audio () == outs:n_audio ())
+ local cfg = self:shmem ():to_int (0):array ()
+ local rate = cfg[1]
+ chn = ins:n_audio ()
+ for c = 1, chn do
+ filters[c] = ARDOUR.DSP.Biquad (rate) -- initialize filters
+ end
+ cur = {0, 0, 0, 0, 0}
+end
+
+-- helper functions for parameter interpolation
+function param_changed (ctrl)
+ if ctrl[2] == cur[2] and ctrl[3] == cur[3] and ctrl[4] == cur[4] and ctrl[5] == cur[5] then
+ return false
+ end
+ return true
+end
+
+function low_pass_filter_param (old, new, limit)
+ if math.abs (old - new) < limit then
+ return new
+ else
+ return old + lpf * (new - old)
+ end
+end
+
+-- apply parameters, re-compute filter coefficients if needed
+function apply_params (ctrl)
+ if not param_changed (ctrl) then
+ return
+ end
+
+ if cur[2] ~= ctrl[2] then
+ -- reset filter state when type changes
+ filt:reset ()
+ for k = 2,5 do cur[k] = ctrl[k] end
+ else
+ -- low-pass filter ctrl parameter values, smooth transition
+ cur[3] = low_pass_filter_param (cur[3], ctrl[3], 0.1) -- gain/dB
+ cur[4] = low_pass_filter_param (cur[4], ctrl[4], 1.0) -- freq/Hz
+ cur[5] = low_pass_filter_param (cur[5], ctrl[5], 0.01) -- quality
+ end
+
+ for c = 1, chn do
+ filters[c]:compute (map_type (cur[2]), cur[4], cur[5], cur[3])
+ end
+end
+
+
+-- the actual DSP callback
+function dsp_run (ins, outs, n_samples)
+ local changed = false
+ local siz = n_samples
+ local off = 0
+ local ctrl = ctrl_data ()
+
+ -- if a parameter was changed, process at most 64 samples at a time
+ -- and interpolate parameters until the current settings match
+ -- the target values
+ if param_changed (ctrl) then
+ changed = true
+ siz = 64
+ end
+
+ while n_samples > 0 do
+ if changed then apply_params (ctrl) end
+ if siz > n_samples then siz = n_samples end
+
+ -- process all channels
+ for c = 1,#ins do
+ -- check if output and input buffers for this channel are identical
+ -- http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
+ if ins[c]:sameinstance (outs[c]) then
+ filters[c]:run (ins[c]:offset (off), siz) -- in-place processing
+ else
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+ ARDOUR.DSP.copy_vector (outs[c]:offset (off), ins[c]:offset (off), siz)
+ filters[c]:run (outs[c]:offset (off), siz)
+ end
+ end
+
+ n_samples = n_samples - siz
+ off = off + siz
+ end
+
+ if changed then
+ -- notify display
+ self:queue_draw ()
+ end
+end
+
+
+-------------------------------------------------------------------------------
+--- inline display
+
+function round (n)
+ return math.floor (n + .5)
+end
+
+function freq_at_x (x, w)
+ -- x-axis pixel for given freq, power-scale
+ return 20 * 1000 ^ (x / w)
+end
+
+function x_at_freq (f, w)
+ -- frequency at given x-axis pixel
+ return w * math.log (f / 20.0) / math.log (1000.0)
+end
+
+function db_to_y (db, h)
+ -- y-axis gain mapping
+ if db < -20 then db = -20 end
+ if db > 20 then db = 20 end
+ return -.5 + 0.5 * h * (1 - db / 20)
+end
+
+function grid_db (ctx, w, h, db)
+ -- draw horizontal grid line
+ local y = -.5 + round (db_to_y (db, h))
+ ctx:move_to (0, y)
+ ctx:line_to (w, y)
+ ctx:stroke ()
+end
+
+function grid_freq (ctx, w, h, f)
+ -- draw vertical grid line
+ local x = -.5 + round (x_at_freq (f, w))
+ ctx:move_to (x, 0)
+ ctx:line_to (x, h)
+ ctx:stroke ()
+end
+
+function render_inline (ctx, w, max_h)
+ if not filt then
+ -- the GUI is separate from the DSP, but the GUI needs to know
+ -- the sample-rate that the DSP is using.
+ local shmem = self:shmem () -- get shared memory region
+ local cfg = shmem:to_int (0):array () -- "cast" into lua-table
+ -- instantiate filter (to calculate the transfer function's response)
+ filt = ARDOUR.DSP.Biquad (cfg[1])
+ end
+
+ -- set filter coefficients if they have changed
+ if param_changed (CtrlPorts:array ()) then
+ local ctrl = ctrl_data ()
+ for k = 2,5 do cur[k] = ctrl[k] end
+ filt:compute (map_type (cur[2]), cur[4], cur[5], cur[3])
+ end
+
+ -- calc height of inline display
+ local h = math.ceil (w * 10 / 16) -- use 16:10 aspect
+ h = 2 * round (h / 2) -- with an even number of vertical pixels
+ if (h > max_h) then h = max_h end -- but at most max-height
+
+ -- ctx is a http://cairographics.org/ context
+ -- http://manual.ardour.org/lua-scripting/class_reference/#Cairo:Context
+
+ -- clear background
+ ctx:rectangle (0, 0, w, h)
+ ctx:set_source_rgba (.2, .2, .2, 1.0)
+ ctx:fill ()
+
+ -- set line width: 1px
+ -- Note: a cairo pixel at [1,1] spans [0.5->1.5 , 0.5->1.5]
+ -- hence the offset -0.5 in various move_to(), line_to() calls
+ ctx:set_line_width (1.0)
+
+ -- draw grid
+ local dash3 = C.DoubleVector ()
+ dash3:add ({1, 3})
+ ctx:set_dash (dash3, 2) -- dotted line
+ ctx:set_source_rgba (.5, .5, .5, .5)
+ grid_db (ctx, w, h, 0)
+ grid_db (ctx, w, h, 6)
+ grid_db (ctx, w, h, 12)
+ grid_db (ctx, w, h, 18)
+ grid_db (ctx, w, h, -6)
+ grid_db (ctx, w, h, -12)
+ grid_db (ctx, w, h, -18)
+ grid_freq (ctx, w, h, 100)
+ grid_freq (ctx, w, h, 1000)
+ grid_freq (ctx, w, h, 10000)
+ ctx:unset_dash ()
+
+ -- draw transfer function line
+ ctx:set_source_rgba (.8, .8, .8, 1.0)
+ ctx:move_to (-.5, db_to_y (filt:dB_at_freq (freq_at_x (0, w)), h))
+ for x = 1,w do
+ local db = filt:dB_at_freq (freq_at_x (x, w))
+ ctx:line_to (-.5 + x, db_to_y (db, h))
+ end
+ ctx:stroke_preserve ()
+
+ -- fill area to zero under the curve
+ ctx:line_to (w, -.5 + h * .5)
+ ctx:line_to (0, -.5 + h * .5)
+ ctx:close_path ()
+ ctx:set_source_rgba (.5, .5, .5, .5)
+ ctx:fill ()
+
+ return {w, h}
+end
diff --git a/scripts/_hook_test.lua b/scripts/_hook_test.lua
new file mode 100644
index 0000000..fa5a853
--- /dev/null
+++ b/scripts/_hook_test.lua
@@ -0,0 +1,41 @@
+ardour {
+ ["type"] = "EditorHook",
+ name = "Callback Example",
+ author = "Ardour Lua Task Force",
+ description = "Rewind On Solo Change, Write a file when regions are moved",
+}
+
+function signals ()
+ s = LuaSignal.Set()
+ --s:add ({[LuaSignal.SoloActive] = true, [LuaSignal.RegionPropertyChanged] = true})
+ s:add (
+ {
+ [LuaSignal.SoloActive] = true,
+ [LuaSignal.RegionPropertyChanged] = true
+ }
+ )
+ --for k,v in pairs (s:table()) do print (k, v) end
+ return s
+end
+
+function factory (params)
+ return function (signal, ref, ...)
+ print (signal, ref, ...)
+
+ if (signal == LuaSignal.SoloActive) then
+ Session:goto_start()
+ end
+
+ if (signal == LuaSignal.RegionPropertyChanged) then
+ obj,pch = ...
+ file = io.open ("/tmp/test" ,"a")
+ io.output (file)
+ io.write (string.format ("Region: '%s' pos-changed: %s, length-changed: %s\n",
+ obj:name (),
+ tostring (pch:containsFramePos (ARDOUR.Properties.Start)),
+ tostring (pch:containsFramePos (ARDOUR.Properties.Length))
+ ))
+ io.close (file)
+ end
+ end
+end
diff --git a/scripts/_osc_hook_example.lua b/scripts/_osc_hook_example.lua
new file mode 100644
index 0000000..fdcda4b
--- /dev/null
+++ b/scripts/_osc_hook_example.lua
@@ -0,0 +1,52 @@
+ardour {
+ ["type"] = "EditorHook",
+ name = "OSC Callback Example",
+ author = "Ardour Lua Task Force",
+ description = "Send OSC messages",
+}
+
+function action_params ()
+ return
+ {
+ ["uri"] = { title = "OSC URI ", default = "osc.udp://localhost:7890"},
+ }
+end
+
+
+function signals ()
+ s = LuaSignal.Set()
+ s:add (
+ {
+ [LuaSignal.SoloActive] = true,
+ [LuaSignal.RegionPropertyChanged] = true,
+ [LuaSignal.Exported] = true,
+ [LuaSignal.TransportStateChange] = true
+ }
+ )
+ return s
+end
+
+function factory (params)
+ return function (signal, ref, ...)
+ local uri = params["unique"] or "osc.udp://localhost:7890"
+ local tx = ARDOUR.LuaOSC.Address (uri)
+ -- debug print (stdout)
+ -- print (signal, ref, ...)
+
+ if (signal == LuaSignal.Exported) then
+ tx:send ("/session/exported", "ss", ...)
+ elseif (signal == LuaSignal.SoloActive) then
+ tx:send ("/session/solo_changed", "")
+ elseif (signal == LuaSignal.TransportStateChange) then
+ tx:send ("/session/transport", "if",
+ Session:transport_frame(), Session:transport_speed())
+ elseif (signal == LuaSignal.RegionPropertyChanged) then
+ obj,pch = ...
+ tx:send ("/region_property_changed", "sTTiii",
+ obj:name (),
+ (pch:containsFramePos (ARDOUR.Properties.Start)),
+ (pch:containsFramePos (ARDOUR.Properties.Length)),
+ obj:position (), obj:start (), obj:length ())
+ end
+ end
+end
diff --git a/scripts/_rawmidi.lua b/scripts/_rawmidi.lua
new file mode 100644
index 0000000..672a37d
--- /dev/null
+++ b/scripts/_rawmidi.lua
@@ -0,0 +1,111 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Midi Passthru",
+ category = "Example",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[An Example Audio/MIDI Passthrough Plugin using Buffer Pointers]]
+}
+
+-- return possible audio i/o configurations
+function dsp_ioconfig ()
+ -- -1, -1 = any number of channels as long as input and output count matches
+ -- require 1 MIDI in, 1 MIDI out.
+ return { { midi_in = 1, midi_out = 1, audio_in = -1, audio_out = -1}, }
+end
+
+-- "dsp_runmap" uses Ardour's internal processor API, eqivalent to
+-- 'connect_and_run()". There is no overhead (mapping, translating buffers).
+-- The lua implementation is responsible to map all the buffers directly.
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:ChanMapping
+
+ local ib = in_map:get (ARDOUR.DataType ("midi"), 0) -- get index of the 1st mapped midi input buffer
+ assert (ib ~= ARDOUR.ChanMapping.Invalid)
+
+ if ib ~= ARDOUR.ChanMapping.Invalid then
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:MidiBuffer
+ local mb = bufs:get_midi (ib) -- get the mapped buffer
+ local events = mb:table () -- copy event list into a lua table
+
+ -- iterate over all MIDI events
+ for _, e in pairs (events) do
+ -- e is-a http://manual.ardour.org/lua-scripting/class_reference/#Evoral:MidiEvent
+
+ -- do something with the event e.g.
+ print (e:channel (), e:time (), e:size (), e:buffer ():array ()[1], e:buffer ():get_table (e:size ())[1])
+ end
+ end
+
+ ----
+ -- The following code is needed with "dsp_runmap" to work for arbitrary pin connections
+ -- this passes though all audio/midi data unprocessed.
+
+ ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("audio"))
+ ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("midi"))
+
+ -- equivalent lua code.
+ -- NOTE: the lua implementation below is intended for io-config [-1,-1].
+ -- It only works for actually mapped channels due to in_map:count() out_map:count()
+ -- being identical to the i/o pin count in this case.
+ --
+ -- Plugins that have multiple possible configurations will need to implement
+ -- dsp_configure() and remember the actual channel count.
+ --
+ -- ARDOUR.DSP.process_map() does iterate over the mapping itself and works generally.
+ -- Still the lua code below does lend itself as elaborate example.
+ --
+ --[[
+
+ local audio_ins = in_map:count (): n_audio () -- number of mapped audio input buffers
+ local audio_outs = out_map:count (): n_audio () -- number of mapped audio output buffers
+ assert (audio_outs, audio_ins) -- ioconfig [-1, -1]: must match
+
+ -- copy audio data if any
+ for c = 1, audio_ins do
+ local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped input buffer
+ local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped output buffer
+ if ib ~= ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob then
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:AudioBuffer
+ ARDOUR.DSP.copy_vector (bufs:get_audio (ob):data (offset), bufs:get_audio (ib):data (offset), n_samples)
+ end
+ end
+ -- Clear unconnected output buffers.
+ -- In case we're processing in-place some buffers may be identical,
+ -- so this must be done *after* copying relvant data from that port.
+ for c = 1, audio_outs do
+ local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1)
+ local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1)
+ if ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid then
+ bufs:get_audio (ob):silence (n_samples, offset)
+ end
+ end
+
+ -- copy midi data
+ local midi_ins = in_map:count (): n_midi () -- number of midi input buffers
+ local midi_outs = out_map:count (): n_midi () -- number of midi input buffers
+
+ -- with midi_in=1, midi_out=1 in dsp_ioconfig
+ -- the following will always be true
+ assert (midi_ins == 1)
+ assert (midi_outs == 1)
+
+ for c = 1, midi_ins do
+ local ib = in_map:get (ARDOUR.DataType ("midi"), c - 1)
+ local ob = out_map:get (ARDOUR.DataType ("midi"), c - 1)
+ if ib ~= ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob then
+ bufs:get_midi (ob):copy (bufs:get_midi (ib))
+ end
+ end
+ -- silence unused midi outputs
+ for c = 1, midi_outs do
+ local ib = in_map:get (ARDOUR.DataType ("midi"), c - 1)
+ local ob = out_map:get (ARDOUR.DataType ("midi"), c - 1)
+ if ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid then
+ bufs:get_midi (ob):silence (n_samples, offset)
+ end
+ end
+ --]]
+end
diff --git a/scripts/_session_test.lua b/scripts/_session_test.lua
new file mode 100644
index 0000000..6a4a372
--- /dev/null
+++ b/scripts/_session_test.lua
@@ -0,0 +1,34 @@
+ardour {
+ ["type"] = "session",
+ name = "Good Night",
+ author = "Ardour Lua Task Force",
+ description = [[
+ Example Ardour Session Script.
+ Session scripts are called at the beginning of every process-callback (before doing any audio processing).
+ This example stops the transport after rolling for a configurable time which can be set when instantiating the script.]]
+}
+
+function sess_params ()
+ return
+ {
+ ["print"] = { title = "Debug Print (yes/no)", default = "no", optional = true },
+ ["time"] = { title = "Timeout (sec)", default = "90", optional = false },
+ }
+end
+
+function factory (params)
+ return function (n_samples)
+ local p = params["print"] or "no"
+ local timeout = params["time"] or 90
+ a = a or 0
+ if p ~= "no" then print (a, n_samples, Session:frame_rate (), Session:transport_rolling ()) end -- debug output (not rt safe)
+ if (not Session:transport_rolling()) then
+ a = 0
+ return
+ end
+ a = a + n_samples
+ if (a > timeout * Session:frame_rate()) then
+ Session:request_transport_speed(0.0, true)
+ end
+ end
+end
diff --git a/scripts/_varispeed_callback.lua b/scripts/_varispeed_callback.lua
new file mode 100644
index 0000000..c61a15d
--- /dev/null
+++ b/scripts/_varispeed_callback.lua
@@ -0,0 +1,32 @@
+ardour {
+ ["type"] = "EditorHook",
+ name = "Varispeed Test - 100ms Callback",
+ author = "Ardour Lua Task Force",
+ description = "An example script that invokes a callback a every 0.1sec and modifies the transport speed",
+}
+
+function signals ()
+ s = LuaSignal.Set()
+ s:add (
+ {
+ [LuaSignal.LuaTimerDS] = true,
+ }
+ )
+ return s
+end
+
+function factory (params)
+ -- upindex variables
+ local cnt = 0
+ local speed = 0
+ local delta = 0.01
+ return function (signal, ref, ...)
+ cnt = (cnt + 1) % 5 -- divide clock: every half a second
+ if cnt == 0 then
+ if speed < -0.25 then delta = delta * -1 end
+ if speed > 0.25 then delta = delta * -1 end
+ speed = speed + delta
+ Session:request_transport_speed (speed)
+ end
+ end
+end
diff --git a/scripts/addscopes.lua b/scripts/addscopes.lua
new file mode 100644
index 0000000..d0785dc
--- /dev/null
+++ b/scripts/addscopes.lua
@@ -0,0 +1,57 @@
+ardour {
+ ["type"] = "EditorAction",
+ name = "Add Scopes",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Add 'Inline Scope' Lua Processor to all Tracks]]
+}
+
+function action_params ()
+ return
+ {
+ ["unique"] = { title = "Only add Scope if non is present already (yes/no)", default = "yes"},
+ ["position"] = { title = "Insert Position from top (0,..)", default = "0"},
+ }
+end
+
+
+function factory (params)
+ return function ()
+ -- get configuration
+ local p = params or {}
+ local uniq = p["unique"] or "yes"
+ local pos = p["position"] or 0
+
+ -- loop over all tracks
+ for t in Session:get_tracks():iter() do
+ local insert = true;
+
+ -- check if a scope is already present
+ if uniq ~= "no" then
+ local proc;
+ local i = 0;
+ repeat
+ -- get Nth Ardour::Processor
+ proc = t:nth_plugin (i)
+ -- check if it's a scope
+ if (not proc:isnil() and proc:display_name () == "Inline Scope") then
+ insert = false;
+ end
+ i = i + 1
+ until proc:isnil() or insert == false
+ end
+
+ -- create a new processor and insert it
+ if insert then
+ local a = ARDOUR.LuaAPI.new_luaproc(Session, "Inline Scope");
+ if (not a:isnil()) then
+ t:add_processor_by_index(a, pos, nil, true)
+ ARDOUR.LuaAPI.set_processor_param (a, 0, 5) -- timescale 5sec
+ -- ARDOUR.LuaAPI.set_processor_param (a, 1, 1) -- logscale on
+ -- ARDOUR.LuaAPI.set_processor_param (a, 2, 3) -- "Max" height
+ a = nil -- explicitly drop shared-ptr reference
+ end
+ end
+ end
+ end
+end
diff --git a/scripts/amp4.lua b/scripts/amp4.lua
new file mode 100644
index 0000000..6254082
--- /dev/null
+++ b/scripts/amp4.lua
@@ -0,0 +1,119 @@
+ardour {
+ ["type"] = "dsp",
+ name = "a-Amplifier",
+ category = "Amplifier",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Versatile +/- 20dB multichannel amplifier]]
+}
+
+function dsp_ioconfig ()
+ return
+ {
+ -- -1, -1 = any number of channels as long as input and output count matches
+ { audio_in = -1, audio_out = -1},
+ }
+end
+
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "Gain", min = -20, max = 20, default = 0, unit="dB"},
+ }
+end
+
+local lpf = 0.02 -- parameter low-pass filter time-constant
+local cur_gain = 0 -- current smoothed gain (dB)
+
+-- called once when plugin is instantiated
+function dsp_init (rate)
+ lpf = 780 / rate -- interpolation time constant
+end
+
+function low_pass_filter_param (old, new, limit)
+ if math.abs (old - new) < limit then
+ return new
+ else
+ return old + lpf * (new - old)
+ end
+end
+
+-- the DSP callback function
+-- "ins" and "outs" are http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
+function dsp_run (ins, outs, n_samples)
+ local ctrl = CtrlPorts:array() -- get control port array (read/write)
+ local siz = n_samples -- samples remaining to process
+ local off = 0 -- already processed samples
+ local changed = false
+
+ -- if the gain parameter was changed, process at most 32 samples at a time
+ -- and interpolate gain until the current settings match the target values
+ if cur_gain ~= ctrl[1] then
+ changed = true
+ siz = 32
+ end
+
+ while n_samples > 0 do
+ if siz > n_samples then siz = n_samples end -- process at most "remaining samples"
+ if changed then
+ -- smooth gain changes above 0.02 dB difference
+ cur_gain = low_pass_filter_param (cur_gain, ctrl[1], 0.02)
+ end
+
+ local gain = ARDOUR.DSP.dB_to_coefficient (cur_gain) -- 10 ^ (0.05 * cur_gain)
+
+ for c = 1,#ins do -- process all channels
+ -- check if output and input buffers for this channel are identical
+ -- http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
+ if not ins[c]:sameinstance (outs[c]) then
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+ ARDOUR.DSP.copy_vector (outs[c]:offset (off), ins[c]:offset (off), siz)
+ end
+ ARDOUR.DSP.apply_gain_to_buffer (outs[c]:offset (off), siz, gain); -- apply-gain, process in-place
+ end
+ n_samples = n_samples - siz
+ off = off + siz
+ end
+
+--[[
+ if changed then
+ self:queue_draw () -- notify display
+ end
+--]]
+end
+
+-------------------------------------------------------------------------------
+--- inline display + text example
+
+--[[
+local txt = nil -- cache pango context globally
+
+function render_inline (ctx, w, max_h)
+ local ctrl = CtrlPorts:array () -- get control ports
+
+ if not txt then
+ -- allocate PangoLayout and set font
+ --http://manual.ardour.org/lua-scripting/class_reference/#Cairo:PangoLayout
+ txt = Cairo.PangoLayout (ctx, "Mono 8px")
+ end
+
+ txt:set_text (string.format ("%+.2f dB", ctrl[1]));
+ tw, th = txt:get_pixel_size ()
+
+ local h = th + 4 -- use text-height with 4px padding
+ if (h > max_h) then h = max_h end -- but at most max-height
+
+ -- clear background
+ ctx:rectangle (0, 0, w, h)
+ ctx:set_source_rgba (.2, .2, .2, 1.0)
+ ctx:fill ()
+
+ -- center text
+ ctx:set_source_rgba (.8, .8, .8, 1.0)
+ ctx:move_to (.5 * (w - tw), .5 * (h - th))
+ txt:show_in_cairo_context (ctx)
+
+ return {w, h}
+end
+--]]
diff --git a/scripts/bounce_replace.lua b/scripts/bounce_replace.lua
new file mode 100644
index 0000000..07518a4
--- /dev/null
+++ b/scripts/bounce_replace.lua
@@ -0,0 +1,64 @@
+ardour { ["type"] = "EditorAction", name = "Bounce+Replace Regions",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Bounce selected regions with processing and replace region]]
+}
+
+function factory (params) return function ()
+ -- there is currently no direct way to find the track
+ -- corresponding to a [selected] region
+ function find_track_for_region (region_id)
+ for route in Session:get_tracks():iter() do
+ local track = route:to_track();
+ local pl = track:playlist ()
+ if not pl:region_by_id (region_id):isnil () then
+ return track
+ end
+ end
+ assert (0); -- can't happen, region must be in a playlist
+ end
+
+ -- get selection
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
+ local sel = Editor:get_selection ()
+
+ -- prepare undo operation
+ Session:begin_reversible_command ("Bounce+Replace Regions")
+ local add_undo = false -- keep track if something has changed
+
+ -- Iterate over Regions part of the selection
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection
+ for r in sel.regions:regionlist ():iter () do
+ -- each of the items 'r' is a
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Region
+
+ local track = find_track_for_region (r:to_stateful():id())
+ local playlist = track:playlist ()
+
+ -- clear existing changes, prepare "diff" of state for undo
+ playlist:to_stateful ():clear_changes ()
+
+ -- bounce the region with processing
+ local region = track:bounce_range (r:position (), r:position() + r:length (), ARDOUR.InterThreadInfo (), track:main_outs (), false);
+
+ -- remove old region..
+ playlist:remove_region (r);
+ -- ..and add the newly bounced one
+ playlist:add_region (region, r:position (), 1, false)
+
+ -- create a diff of the performed work, add it to the session's undo stack
+ -- and check if it is not empty
+ if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
+ add_undo = true
+ end
+ end
+
+ -- all done, commit the combined Undo Operation
+ if add_undo then
+ -- the 'nil' Command here mean to use the collected diffs added above
+ Session:commit_reversible_command (nil)
+ else
+ Session:abort_reversible_command ()
+ end
+
+end end
diff --git a/scripts/midi_rewite.lua b/scripts/midi_rewite.lua
new file mode 100644
index 0000000..4dfc28a
--- /dev/null
+++ b/scripts/midi_rewite.lua
@@ -0,0 +1,34 @@
+ardour {
+ ["type"] = "session",
+ name = "Rewrite Midi",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[An example session script preprocesses midi buffers.]]
+}
+
+function factory ()
+ -- this function is called in every process cycle, before processing
+ return function (n_samples)
+ _, t = Session:engine ():get_ports (ARDOUR.DataType.midi (), ARDOUR.PortList ())
+ for p in t[2]:iter () do
+ if not p:receives_input () then goto next end
+
+ if not p:name () == "MIDI/midi_in 1" then goto next end
+
+ midiport = p:to_midiport ()
+ assert (not midiport:isnil ())
+ mb = midiport:get_midi_buffer (n_samples);
+
+ events = mb:table() -- copy event list into lua table
+ mb:silence (n_samples, 0); -- clear existing buffer
+
+ for _,e in pairs (events) do
+ -- e is-a http://manual.ardour.org/lua-scripting/class_reference/#Evoral:MidiEvent
+ e:set_channel (2)
+ mb:push_event (e)
+ end
+
+ ::next::
+ end
+ end
+end
diff --git a/scripts/midifilter.lua b/scripts/midifilter.lua
new file mode 100644
index 0000000..3ff61d3
--- /dev/null
+++ b/scripts/midifilter.lua
@@ -0,0 +1,38 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Midi Filter",
+ category = "Example", -- "Utility"
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[An Example Midi Filter for prototyping.]]
+}
+
+function dsp_ioconfig ()
+ return { { midi_in = 1, midi_out = 1, audio_in = 0, audio_out = 0}, }
+end
+
+function dsp_run (_, _, n_samples)
+ assert (type(midiin) == "table")
+ assert (type(midiout) == "table")
+ local cnt = 1;
+
+ function tx_midi (time, data)
+ midiout[cnt] = {}
+ midiout[cnt]["time"] = time;
+ midiout[cnt]["data"] = data;
+ cnt = cnt + 1;
+ end
+
+ -- for each incoming midi event
+ for _,b in pairs (midiin) do
+ local t = b["time"] -- t = [ 1 .. n_samples ]
+ local d = b["data"] -- get midi-event
+
+ if (#d == 3 and bit32.band (d[1], 240) == 144) then -- note on
+ tx_midi (t, d)
+ end
+ if (#d == 3 and bit32.band (d[1], 240) == 128) then -- note off
+ tx_midi (t, d)
+ end
+ end
+end
diff --git a/scripts/midigenerator.lua b/scripts/midigenerator.lua
new file mode 100644
index 0000000..4ef4bf4
--- /dev/null
+++ b/scripts/midigenerator.lua
@@ -0,0 +1,48 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Midi Generator",
+ category = "Example", -- "Utility"
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[An Example Midi Generator for prototyping.]]
+}
+
+function dsp_ioconfig ()
+ return { { midi_out = 1, audio_in = 0, audio_out = 0}, }
+end
+
+local tme = 0 -- sample-counter
+local seq = 1 -- sequence-step
+local spb = 0 -- samples per beat
+
+local midi_sequence = {
+ { 0x90, 64, 127 },
+ { 0x80, 64, 0 },
+}
+
+function dsp_init (rate)
+ local bpm = 120
+ spb = rate * 60 / bpm
+ if spb < 2 then spb = 2 end
+end
+
+function dsp_run (_, _, n_samples)
+ assert (type(midiout) == "table")
+ assert (spb > 1)
+ local m = 1
+
+ for time = 1,n_samples do -- not very efficient
+ -- TODO, timestamp the sequence in beats, calc/skip to next event
+ tme = tme + 1
+
+ if tme >= spb then
+ midiout[m] = {}
+ midiout[m]["time"] = time
+ midiout[m]["data"] = midi_sequence[seq]
+
+ tme = 0
+ m = m + 1
+ if seq == #midi_sequence then seq = 1 else seq = seq + 1 end
+ end
+ end
+end
diff --git a/scripts/midimon.lua b/scripts/midimon.lua
new file mode 100644
index 0000000..7f58fd3
--- /dev/null
+++ b/scripts/midimon.lua
@@ -0,0 +1,213 @@
+ardour {
+ ["type"] = "dsp",
+ name = "a-MIDI Monitor",
+ category = "Visualization",
+ license = "GPLv2",
+ author = "Ardour Team",
+ description = [[Display recent MIDIÂ events inline in the mixer strip]]
+}
+
+local maxevents = 20
+local ringsize = maxevents * 3
+local evlen = 3
+local hpadding, vpadding = 4, 2
+
+function dsp_ioconfig ()
+ return { { midi_in = 1, midi_out = 1, audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input",
+ name = "Font size",
+ doc = "Text size used by the monitor to display midi events",
+ min = 4, max = 12, default = 7, integer = true },
+ { ["type"] = "input",
+ name = "Line count",
+ doc = "How many events will be shown at most",
+ min = 1, max = maxevents, default = 6, integer = true },
+ { ["type"] = "input",
+ name = "Hexadecimal",
+ doc = "If enabled, values will be printed in hexadecimal notation",
+ min = 0, max = 1, default = 0, toggled = true },
+ { ["type"] = "input",
+ name = "System messages",
+ doc = "If enabled, the monitor will show System Control and Real-Time messages",
+ min = 0, max = 1, default = 0, toggled = true },
+ { ["type"] = "input",
+ name = "Numeric Notes",
+ doc = "If enabled, note-events displayed numerically",
+ min = 0, max = 1, default = 0, toggled = true },
+ }
+end
+
+function dsp_init (rate)
+ -- create a shmem space to hold latest midi events
+ -- a int representing the index of the last event, and
+ -- a C-table as storage for events.
+ self:shmem():allocate(1 + ringsize*evlen)
+ self:shmem():atomic_set_int(0, 1)
+ local buffer = self:shmem():to_int(1):array()
+ for i = 1, ringsize*evlen do
+ buffer[i] = -1 -- sentinel for empty slot
+ end
+end
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+ local pos = self:shmem():atomic_get_int(0)
+ local buffer = self:shmem():to_int(1):array()
+
+ -- passthrough all data
+ ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("audio"))
+ ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("midi"))
+
+ -- then fill the event buffer
+ local ib = in_map:get (ARDOUR.DataType ("midi"), 0) -- index of 1st midi input
+
+ if ib ~= ARDOUR.ChanMapping.Invalid then
+ local events = bufs:get_midi (ib):table () -- copy event list into a lua table
+
+ -- iterate over all MIDI events
+ for _, e in pairs (events) do
+ local ev = e:buffer():array()
+ pos = pos % ringsize + 1
+ -- copy the data
+ for j = 1, math.min(e:size(),evlen) do
+ buffer[(pos-1)*evlen + j] = ev[j]
+ end
+ -- zero unused slots
+ for j = e:size()+1, evlen do
+ buffer[(pos-1)*evlen + j] = 0
+ end
+ end
+ end
+
+ self:shmem():atomic_set_int(0, pos)
+
+ self:queue_draw ()
+end
+
+local txt = nil -- a pango context
+local cursize = 0
+local hex = nil
+local format_note = nil
+local show_scm = nil
+
+function format_note_name(b)
+ return string.format ("%5s", ARDOUR.ParameterDescriptor.midi_note_name (b))
+end
+
+function format_note_num(b)
+ return string.format (hex, b)
+end
+
+
+function show_midi(ctx, x, y, buffer, event)
+ local base = (event - 1) * evlen
+ if buffer[base+1] == -1 then return false end
+ local evtype = buffer[base + 1] >> 4
+ local channel = (buffer[base + 1] & 15) + 1 -- for System Common Messages this has no use
+ if evtype == 8 then
+ txt:set_text(string.format("%02u \u{2669}Off%s" .. hex, channel, format_note(buffer[base+2]), buffer[base+3]))
+ elseif evtype == 9 then
+ txt:set_text(string.format("%02u \u{2669}On %s" .. hex, channel, format_note(buffer[base+2]), buffer[base+3]))
+ elseif evtype == 10 then
+ txt:set_text(string.format("%02u \u{2669}KP %s" .. hex, channel, format_note(buffer[base+2]), buffer[base+3]))
+ elseif evtype == 11 then
+ txt:set_text(string.format("%02u CC " .. hex .. hex, channel, buffer[base+2], buffer[base+3]))
+ elseif evtype == 12 then
+ txt:set_text(string.format("%02u PRG " .. hex, channel, buffer[base+2]))
+ elseif evtype == 13 then
+ txt:set_text(string.format("%02u KP " .. hex, channel, buffer[base+2]))
+ elseif evtype == 14 then
+ txt:set_text(string.format("%02u PBnd" .. hex, channel, buffer[base+2] | buffer[base+3] << 7))
+ elseif show_scm > 0 then -- System Common Message
+ local message = buffer[base + 1] & 15
+ if message == 0 then
+ txt:set_text("-- SysEx")
+ elseif message == 1 then
+ txt:set_text(string.format("-- Time Code" .. hex, buffer[base+2]))
+ elseif message == 2 then
+ txt:set_text(string.format("-- Song Pos" .. hex, buffer[base+2] | buffer[base+3] << 7))
+ elseif message == 3 then
+ txt:set_text(string.format("-- Select Song" .. hex, buffer[base+2]))
+ elseif message == 6 then
+ txt:set_text("-- Tune Rq")
+ elseif message == 8 then
+ txt:set_text("-- Timing")
+ elseif message == 10 then
+ txt:set_text("-- Start")
+ elseif message == 11 then
+ txt:set_text("-- Continue")
+ elseif message == 12 then
+ txt:set_text("-- Stop")
+ elseif message == 14 then
+ txt:set_text("-- Active")
+ elseif message == 15 then
+ txt:set_text("-- Reset")
+ else
+ return false
+ end
+ else
+ return false
+ end
+ ctx:move_to (x, y)
+ txt:show_in_cairo_context (ctx)
+ return true
+end
+
+function render_inline (ctx, displaywidth, max_h)
+ local ctrl = CtrlPorts:array ()
+ local pos = self:shmem():atomic_get_int(0)
+ local buffer = self:shmem():to_int(1):array()
+ local count = ctrl[2]
+
+ if not txt or cursize ~= ctrl[1] then
+ cursize = math.floor(ctrl[1])
+ txt = Cairo.PangoLayout (ctx, "Mono " .. cursize)
+ end
+
+ if ctrl[3] > 0 then hex = " %02X" else hex = " %3u" end
+ show_scm = ctrl[4]
+
+ if ctrl[5] > 0 then
+ format_note = format_note_num
+ else
+ format_note = format_note_name
+ end
+
+ -- compute the size of the display
+ txt:set_text("0")
+ local _, lineheight = txt:get_pixel_size()
+ local displayheight = math.min(vpadding + (lineheight + vpadding) * count, max_h)
+
+ -- compute starting position (pango anchors text at north-west corner)
+ local x, y = hpadding, displayheight - lineheight - vpadding
+
+ -- clear background
+ ctx:rectangle (0, 0, displaywidth, displayheight)
+ ctx:set_source_rgba (.2, .2, .2, 1.0)
+ ctx:fill ()
+
+ -- color of latest event
+ ctx:set_source_rgba (1.0, 1.0, 1.0, 1.0)
+
+ -- print events
+ for i = pos, 1, -1 do
+ if y < 0 then break end
+ if show_midi(ctx, x, y, buffer, i) then
+ y = y - lineheight - vpadding
+ ctx:set_source_rgba (.8, .8, .8, 1.0)
+ end
+ end
+ for i = ringsize, pos+1, -1 do
+ if y < 0 then break end
+ if show_midi(ctx, x, y, buffer, i) then
+ y = y - lineheight - vpadding
+ ctx:set_source_rgba (.8, .8, .8, 1.0)
+ end
+ end
+
+ return {displaywidth, displayheight}
+end
diff --git a/scripts/remove_unknown_procs.lua b/scripts/remove_unknown_procs.lua
new file mode 100644
index 0000000..0461e88
--- /dev/null
+++ b/scripts/remove_unknown_procs.lua
@@ -0,0 +1,23 @@
+ardour { ["type"] = "EditorAction", name = "Remove Unknown Plugins",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Remove all unknown plugins/processors from all tracks and busses]]
+}
+
+function factory (params) return function ()
+ -- iterate over all tracks and busses
+ for route in Session:get_routes ():iter () do
+ -- route is-a http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Route
+ local i = 0;
+ repeat
+ proc = route:nth_processor (i)
+ -- proc is a http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Processor
+ -- try cast it to http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:UnknownProcessor
+ if not proc:isnil () and not proc:to_unknownprocessor ():isnil () then
+ route:remove_processor (proc, nil, true)
+ else
+ i = i + 1
+ end
+ until proc:isnil ()
+ end
+end end
diff --git a/scripts/rewind.lua b/scripts/rewind.lua
new file mode 100644
index 0000000..88e1506
--- /dev/null
+++ b/scripts/rewind.lua
@@ -0,0 +1,12 @@
+ardour {
+ ["type"] = "EditorAction",
+ name = "Rewind",
+ author = "Ardour Lua Task Force",
+ description = [[An Example Ardour Editor Action Script.]]
+}
+
+function factory (params)
+ return function ()
+ Session:goto_start()
+ end
+end
diff --git a/scripts/s_chanmap.lua b/scripts/s_chanmap.lua
new file mode 100644
index 0000000..7bc070c
--- /dev/null
+++ b/scripts/s_chanmap.lua
@@ -0,0 +1,34 @@
+ardour { ["type"] = "Snippet", name = "plugin channel-map dev" }
+
+function factory () return function ()
+ -- first track needs to be stereo and have a stereo plugin
+ -- (x42-eq with spectrum display, per channel processing,
+ -- and pre/post visualization is very handy here)
+
+ function checksetup (r)
+ -- fail if Route ID 1 is not present or not stereo
+ assert (r and not r:isnil())
+ assert (r:n_inputs():n_audio() == 2)
+ -- check first Plugin and make sure it is a "Plugin Insert"
+ if not r:nth_plugin(0):isnil() and not r:nth_plugin(0):to_insert():isnil() then return end
+ -- insert x42-eq at the top.
+ local proc = ARDOUR.LuaAPI.new_plugin(Session, "http://gareus.org/oss/lv2/fil4#stereo", ARDOUR.PluginType.LV2, "");
+ r:add_processor_by_index(proc, 0, nil, true)
+ end
+
+ r = Session:get_remote_nth_route(1)
+ checksetup (r)
+ pi = r:nth_plugin(0):to_insert()
+
+ pi:set_no_inplace (true)
+
+ cm = ARDOUR.ChanMapping()
+ --cm:set(ARDOUR.DataType("Audio"), 0, 0)
+ cm:set(ARDOUR.DataType("Audio"), 1, 0)
+ pi:set_input_map (0, cm)
+
+ cm = ARDOUR.ChanMapping()
+ --cm:set(ARDOUR.DataType("Audio"), 0, 0)
+ cm:set(ARDOUR.DataType("Audio"), 1, 0)
+ pi:set_output_map (0, cm)
+end end
diff --git a/scripts/s_fader_automation.lua b/scripts/s_fader_automation.lua
new file mode 100644
index 0000000..aaac7ad
--- /dev/null
+++ b/scripts/s_fader_automation.lua
@@ -0,0 +1,63 @@
+ardour { ["type"] = "Snippet", name = "Fader Automation" }
+
+function factory () return function ()
+ local playhead = Session:transport_frame ()
+ local samplerate = Session:nominal_frame_rate ()
+
+ -- get selected tracks
+ rl = Editor:get_selection ().tracks:routelist ()
+
+ -- prepare undo operation
+ Session:begin_reversible_command ("Fancy Fade Out")
+ local add_undo = false -- keep track if something has changed
+
+ -- iterate over selected tracks
+ for r in rl:iter () do
+ local ac = r:amp ():gain_control () -- ARDOUR:AutomationControl
+ local al = ac:alist () -- ARDOUR:AutomationList (state, high-level)
+ local cl = al:list () -- Evoral:ControlList (actual events)
+
+ if cl:isnil () then
+ goto out
+ end
+
+ -- set automation state to "Touch"
+ ac:set_automation_state (ARDOUR.AutoState.Touch)
+
+ -- query the value at the playhead position
+ local g = cl:eval (playhead)
+
+ -- get state for undo
+ local before = al:get_state ()
+
+ -- delete all events after the playhead...
+ cl:truncate_end (playhead)
+
+ -- ...and generate some new ones.
+ for i=0,50 do
+ -- use a sqrt fade-out (the shape is recognizable, and otherwise
+ -- not be possible to achieve with existing ardour fade shapes)
+ cl:add (playhead + i * samplerate / 50,
+ g * (1 - math.sqrt (i / 50)),
+ false, true)
+ end
+
+ -- remove dense events
+ cl:thin (20)
+
+ -- save undo
+ local after = al:get_state ()
+ Session:add_command (al:memento_command (before, after))
+ add_undo = true
+
+ ::out::
+ end
+
+ -- all done, commit the combined Undo Operation
+ if add_undo then
+ -- the 'nil' Commend here mean to use the collected diffs added above
+ Session:commit_reversible_command (nil)
+ else
+ Session:abort_reversible_command ()
+ end
+end end
diff --git a/scripts/s_foreach_track.lua b/scripts/s_foreach_track.lua
new file mode 100644
index 0000000..c1c6ed8
--- /dev/null
+++ b/scripts/s_foreach_track.lua
@@ -0,0 +1,10 @@
+ardour { ["type"] = "Snippet", name = "Foreach Track" }
+
+function factory () return function ()
+ for r in Session:get_tracks():iter() do
+ print (r:name())
+ -- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Track
+ -- for available methods e.g.
+ r:set_active (true, nil)
+ end
+end end
diff --git a/scripts/s_plugin_automation.lua b/scripts/s_plugin_automation.lua
new file mode 100644
index 0000000..56129ff
--- /dev/null
+++ b/scripts/s_plugin_automation.lua
@@ -0,0 +1,43 @@
+ardour { ["type"] = "Snippet", name = "Plugin automation" }
+
+function factory () return function ()
+ -- query playhead position and session sample-rate
+ local playhead = Session:transport_frame ()
+ local samplerate = Session:nominal_frame_rate ()
+
+ -- get Track/Bus with RID 3
+ local r = Session:get_remote_nth_route(3)
+ -- make sure the track object exists
+ assert (not r:isnil ())
+
+ -- get AutomationList, ControlList and ParameterDescriptor
+ -- of the first plugin's first parameter
+ -- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:LuaAPI
+ local al, cl, pd = ARDOUR.LuaAPI.plugin_automation (r:nth_plugin (0), 0)
+
+ if not al:isnil () then
+ print ("Parameter Range", pd.lower, pd.upper)
+ print ("Current value", cl:eval (playhead))
+
+ -- prepare undo operation
+ Session:begin_reversible_command ("Automatix")
+ -- remember current AutomationList state
+ local before = al:get_state()
+
+ -- remove future automation
+ cl:truncate_end (playhead)
+
+ -- add new data points after the playhead 1 sec, min..max
+ -- without guard-points, but with initial (..., false, true)
+ for i=0,10 do
+ cl:add (playhead + i * samplerate / 10,
+ pd.lower + math.sqrt (i / 10) * (pd.upper - pd.lower),
+ false, true)
+ end
+
+ -- save undo
+ local after = al:get_state()
+ Session:add_command (al:memento_command(before, after))
+ Session:commit_reversible_command (nil)
+ end
+end end
diff --git a/scripts/s_pluginutils.lua b/scripts/s_pluginutils.lua
new file mode 100644
index 0000000..3af803a
--- /dev/null
+++ b/scripts/s_pluginutils.lua
@@ -0,0 +1,36 @@
+ardour { ["type"] = "Snippet", name = "Plugin Utils" }
+
+function factory () return function ()
+
+ -------------------------------------------------------------------------------
+ -- add a Plugin (here LV2) to all mono tracks that contain the pattern "dru"
+ -- and load a plugin-preset (if it exists)
+ for r in Session:get_routes():iter() do
+ if (string.match (r:name(), "dru") and r:n_inputs():n_audio() == 1) then
+ local proc = ARDOUR.LuaAPI.new_plugin(Session, "http://gareus.org/oss/lv2/fil4#mono", ARDOUR.PluginType.LV2, "cutbass");
+ r:add_processor_by_index(proc, 0, nil, true)
+ end
+ end
+
+
+ -------------------------------------------------------------------------------
+ -- load a plugin preset
+ route = Session:get_remote_nth_route(2)
+ -- to 4th plugin (from top), ardour starts counting at zero
+ plugin = route:nth_plugin(3):to_insert():plugin(0)
+ ps = plugin:preset_by_label("cutbass") -- get preset by name
+ print (ps.uri)
+ plugin:load_preset (ps)
+
+
+ -------------------------------------------------------------------------------
+ -- add a LuaProcessor (here "Scope") to all tracks
+ for t in Session:get_tracks():iter() do
+ local pos = 0 -- insert at the top
+ local proc = ARDOUR.LuaAPI.new_luaproc(Session, "Inline Scope");
+ t:add_processor_by_index(proc, pos, nil, true)
+ -- optionally set some parameters
+ ARDOUR.LuaAPI.set_processor_param (proc, 0, 5) -- timescale 5sec
+ end
+
+end end
diff --git a/scripts/s_portengine.lua b/scripts/s_portengine.lua
new file mode 100644
index 0000000..5bbcabd
--- /dev/null
+++ b/scripts/s_portengine.lua
@@ -0,0 +1,33 @@
+ardour { ["type"] = "Snippet", name = "portengine" }
+function factory () return function ()
+
+ a = Session:engine()
+ print ("----- Port objects from Ardour's engine ----");
+ _, t = a:get_ports (ARDOUR.DataType("audio"), ARDOUR.PortList())
+ -- table 't' holds argument references. t[2] is the PortList
+ for p in t[2]:iter() do
+ print (p:name())
+ end
+
+ print ("----- Port names queries from the backend ----");
+ _, t = a:get_backend_ports ("", ARDOUR.DataType("audio"), 0, C.StringVector())
+ -- table 't' holds argument references. t[4] is the StringVector
+ for n in t[4]:iter() do
+ print (n)
+ end
+
+ print ("----- Connections from the backend ----");
+ _, t = a:get_backend_ports ("", ARDOUR.DataType("audio"), ARDOUR.PortFlags.IsOutput, C.StringVector())
+ for n in t[4]:iter() do
+ local printed_name = false;
+ _, ct = a:get_connections (n, C.StringVector())
+ for c in ct[2]:iter() do
+ if (not printed_name) then
+ printed_name = true;
+ print (n)
+ end
+ print (" ->", c)
+ end
+ end
+
+end end
diff --git a/scripts/s_replaceplugin.lua b/scripts/s_replaceplugin.lua
new file mode 100644
index 0000000..4cef07c
--- /dev/null
+++ b/scripts/s_replaceplugin.lua
@@ -0,0 +1,11 @@
+ardour { ["type"] = "Snippet", name = "Replace Plugin" }
+
+function factory () return function ()
+
+ route = Session:get_remote_nth_route(1)
+ old = route:nth_plugin(0)
+ new = ARDOUR.LuaAPI.new_plugin(Session, "http://gareus.org/oss/lv2/fil4#stereo", ARDOUR.PluginType.LV2, "");
+ route:replace_processor (old, new, nil)
+ old = nil new = nil -- explicitly drop references (unless they're local vars)
+
+end end
diff --git a/scripts/s_selection.lua b/scripts/s_selection.lua
new file mode 100644
index 0000000..1963ac1
--- /dev/null
+++ b/scripts/s_selection.lua
@@ -0,0 +1,60 @@
+ardour { ["type"] = "Snippet", name = "Editor Selection" }
+
+function factory () return function ()
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
+ -- the Ardour Selection can include multiple items
+ -- (regions, tracks, ranges, markers, automation, midi-notes etc)
+ local sel = Editor:get_selection ()
+
+ --
+ -- At the point of writing the following data items are available
+ --
+
+ -- Range selection, total span of all ranges (0, 0 if no time range is selected)
+ if sel.time:start () < sel.time:end_frame () then
+ print ("Total Range:", sel.time:start (), sel.time:end_frame ())
+ end
+
+ -- Range selection, individual ranges.
+ for ar in sel.time:iter () do
+ -- each of the items is a
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:AudioRange
+ print ("Range:", ar.id, ar.start, ar._end)
+ end
+
+ -- Track/Bus Selection
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:TrackSelection
+ for r in sel.tracks:routelist ():iter () do
+ -- each of the items is a
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Route
+ print ("Route:", r:name ())
+ end
+
+ -- Region selection
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection
+ for r in sel.regions:regionlist ():iter () do
+ -- each of the items is a
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Region
+ print ("Region:", r:name ())
+ end
+
+ -- Markers
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:MarkerSelection
+ -- Note: Marker selection is not cleared and currently (Ardour-4.7) points
+ -- to the most recently selected marker.
+ for m in sel.markers:iter () do
+ -- each of the items is a
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOURUI::ArdourMarker
+ print ("Marker:", m:name (), m:position(), m:_type())
+ end
+
+ ----------------------------------------------------------
+ -- The total time extents of all selected regions and ranges
+ local ok, ext = Editor:get_selection_extents (0, 0)
+ if ok then
+ print ("Selection Extents:", ext[1], ext[2])
+ else
+ print ("No region or range is selected")
+ end
+
+end end
diff --git a/scripts/scope.lua b/scripts/scope.lua
new file mode 100644
index 0000000..1952c10
--- /dev/null
+++ b/scripts/scope.lua
@@ -0,0 +1,229 @@
+ardour {
+ ["type"] = "dsp",
+ name = "a-Inline Scope",
+ category = "Visualization",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Mixer strip inline waveform display]]
+}
+
+-- return possible i/o configurations
+function dsp_ioconfig ()
+ -- -1, -1 = any number of channels as long as input and output count matches
+ return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "Timescale", min = .1, max = 5, default = 2, unit="sec", logarithmic = true },
+ { ["type"] = "input", name = "Logscale", min = 0, max = 1, default = 0, toggled = true },
+ { ["type"] = "input", name = "Height (Aspect)", min = 0, max = 3, default = 1, enum = true, scalepoints =
+ {
+ ["Min"] = 0,
+ ["16:10"] = 1,
+ ["1:1"] = 2,
+ ["Max"] = 3
+ }
+ },
+ }
+end
+
+
+function dsp_init (rate)
+ -- global variables (DSP part only)
+ samplerate = rate
+ bufsiz = 6 * rate
+ dpy_hz = rate / 25
+ dpy_wr = 0
+end
+
+function dsp_configure (ins, outs)
+ -- store configuration in global variable
+ audio_ins = ins:n_audio ()
+ -- allocate shared memory area
+ -- this is used to speed up DSP computaton (using a C array)
+ -- and to share data with the GUI
+ self:shmem ():allocate (4 + bufsiz * audio_ins)
+ self:shmem ():clear ()
+ self:shmem ():atomic_set_int (0, 0)
+ local cfg = self:shmem ():to_int (1):array ()
+ cfg[1] = samplerate
+ cfg[2] = bufsiz
+ cfg[3] = audio_ins
+end
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+ local shmem = self:shmem ()
+ local write_ptr = shmem:atomic_get_int (0)
+
+ for c = 1,audio_ins do
+ -- Note: lua starts counting at 1, ardour's ChanMapping::get() at 0
+ local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped input buffer for given cannel
+ local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped output buffer for given cannel
+ local chn_off = 4 + bufsiz * (c - 1)
+ if (ib ~= ARDOUR.ChanMapping.Invalid) then
+ if (write_ptr + n_samples < bufsiz) then
+ ARDOUR.DSP.copy_vector (shmem:to_float (write_ptr + chn_off), bufs:get_audio (ib):data (offset), n_samples)
+ else
+ local w0 = bufsiz - write_ptr;
+ ARDOUR.DSP.copy_vector (shmem:to_float (write_ptr + chn_off), bufs:get_audio (ib):data (offset), w0)
+ ARDOUR.DSP.copy_vector (shmem:to_float (chn_off) , bufs:get_audio (ib):data (offset + w0), n_samples - w0)
+ end
+ if (ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob) then
+ ARDOUR.DSP.copy_vector (bufs:get_audio (ob):data (offset), bufs:get_audio (ib):data (offset), n_samples)
+ end
+ else
+ if (write_ptr + n_samples < bufsiz) then
+ ARDOUR.DSP.memset (shmem:to_float (write_ptr + chn_off), 0, n_samples)
+ else
+ local w0 = bufsiz - write_ptr;
+ ARDOUR.DSP.memset (shmem:to_float (write_ptr + chn_off), 0, w0)
+ ARDOUR.DSP.memset (shmem:to_float (chn_off) , 0, n_samples - w0)
+ end
+ end
+ end
+ -- clear unconnected inplace buffers
+ for c = 1,audio_ins do
+ local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped input buffer for given cannel
+ local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped output buffer for given cannel
+ if (ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid) then
+ bufs:get_audio (ob):silence (n_samples, offset)
+ end
+ end
+
+ write_ptr = (write_ptr + n_samples) % bufsiz
+ shmem:atomic_set_int (0, write_ptr)
+
+ -- emit QueueDraw every FPS
+ dpy_wr = dpy_wr + n_samples
+ if (dpy_wr > dpy_hz) then
+ dpy_wr = dpy_wr % dpy_hz;
+ self:queue_draw ()
+ end
+end
+
+
+-- helper function for drawing symmetric grid
+function gridline (ctx, x, xr, h, val)
+ ctx:move_to (math.floor (.5 + x + val * xr) -.5, 1)
+ ctx:line_to (math.floor (.5 + x + val * xr) -.5, h - 1)
+ ctx:stroke ()
+ ctx:move_to (math.floor (.5 + x - val * xr) -.5, 1)
+ ctx:line_to (math.floor (.5 + x - val * xr) -.5, h - 1)
+ ctx:stroke ()
+end
+
+function render_inline (ctx, w, max_h)
+ local ctrl = CtrlPorts:array () -- get control port array (read/write)
+ local shmem = self:shmem () -- get shared memory region
+ local cfg = shmem:to_int (1):array () -- "cast" into lua-table
+ local rate = cfg[1]
+ local buf_size = cfg[2]
+ local n_chn = cfg[3]
+
+ -- get settings
+ local timescale = ctrl[1] or 1.0 -- display size in seconds
+ local logscale = ctrl[2] or 0; logscale = logscale > 0 -- logscale
+ local hmode = ctrl[3] or 1 -- height mode
+
+ -- calc height
+ if hmode == 0 then
+ h = math.ceil (w * 10 / 16)
+ if (h > 44) then
+ h = 44
+ end
+ elseif (hmode == 2) then
+ h = w
+ elseif (hmode == 3) then
+ h = max_h
+ else
+ h = math.ceil (w * 10 / 16)
+ end
+
+ if (h > max_h) then
+ h = max_h
+ end
+
+ -- display settings
+ local spp = math.floor (timescale * rate / (h - 2)) -- samples per pixel
+ local spl = spp * (h - 1) -- total number of audio samples to read
+ local read_ptr = (shmem:atomic_get_int (0) + buf_size - spl - 1) % buf_size -- read pointer
+ local xr = math.ceil ((w - 2) * (0.47 / n_chn)) -- x-axis range (per channel)
+
+ -- clear background
+ ctx:rectangle (0, 0, w, h)
+ ctx:set_source_rgba (.2, .2, .2, 1.0)
+ ctx:fill ()
+
+ -- prepare drawing
+ ctx:set_line_width (1.0)
+ local dash3 = C.DoubleVector ()
+ dash3:add ({1, 3})
+ local dash4 = C.DoubleVector ()
+ dash4:add ({1, 4})
+
+ -- plot every channel
+ for c = 1,n_chn do
+ local x = math.floor ((w - 2) * (c - .5) / n_chn) + 1.5 -- x-axis center for given channel
+
+ -- draw grid --
+ ctx:set_source_rgba (.5, .5, .5, 1.0)
+ ctx:move_to (x, 1) ctx:line_to (x, h - 1) ctx:stroke ()
+
+ ctx:set_dash (dash4, 2)
+ ctx:set_source_rgba (.4, .4, .4, 1.0)
+ if (logscale) then
+ gridline (ctx, x, xr, h, ARDOUR.DSP.log_meter(-18))
+ gridline (ctx, x, xr, h, ARDOUR.DSP.log_meter(-6))
+ ctx:set_dash (dash3, 2)
+ ctx:set_source_rgba (.5, .1, .1, 1.0)
+ gridline (ctx, x, xr, h, ARDOUR.DSP.log_meter(-3))
+ else
+ gridline (ctx, x, xr, h, .1258)
+ gridline (ctx, x, xr, h, .5)
+ ctx:set_dash (dash3, 2)
+ ctx:set_source_rgba (.5, .1, .1, 1.0)
+ gridline (ctx, x, xr, h, .7079)
+ end
+ ctx:unset_dash ()
+ ctx:set_source_rgba (.5, .1, .1, 0.7)
+ gridline (ctx, x, xr, h, 1)
+
+
+ -- prepare waveform display drawing
+ ctx:set_source_rgba (.8, .8, .8, .7)
+ ctx:save ()
+ ctx:rectangle (math.floor (x - xr), 0, math.ceil (2 * xr), h)
+ ctx:clip ()
+
+ local chn_off = 4 + buf_size * (c - 1)
+ local buf_off = read_ptr;
+
+ -- iterate over every y-axis pixel
+ for y = 1, h - 1 do
+ local s_min = 0
+ local s_max = 0
+ -- calc min/max values for given range
+ if (buf_off + spp < buf_size) then
+ _, s_min, s_max = table.unpack (ARDOUR.DSP.peaks (shmem:to_float (chn_off + buf_off), s_min, s_max, spp))
+ else
+ local r0 = buf_size - buf_off;
+ _, s_min, s_max = table.unpack (ARDOUR.DSP.peaks (shmem:to_float (chn_off + buf_off), s_min, s_max, r0))
+ _, s_min, s_max = table.unpack (ARDOUR.DSP.peaks (shmem:to_float (chn_off) , s_min, s_max, spp - r0))
+ end
+ buf_off = (buf_off + spp) % buf_size;
+
+ if (logscale) then
+ s_max = ARDOUR.DSP.log_meter_coeff (s_max)
+ s_min = - ARDOUR.DSP.log_meter_coeff (-s_min)
+ end
+
+ ctx:move_to (x + s_min * xr, h - y + .5)
+ ctx:line_to (x + s_max * xr, h - y + .5)
+ end
+ ctx:stroke ()
+ ctx:restore ()
+ end
+ return {w, h}
+end
diff --git a/scripts/spectrogram.lua b/scripts/spectrogram.lua
new file mode 100644
index 0000000..4f55a65
--- /dev/null
+++ b/scripts/spectrogram.lua
@@ -0,0 +1,330 @@
+ardour {
+ ["type"] = "dsp",
+ name = "a-Inline Spectrogram",
+ category = "Visualization",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Mixer strip inline spectrum display]]
+}
+
+-- return possible i/o configurations
+function dsp_ioconfig ()
+ -- -1, -1 = any number of channels as long as input and output count matches
+ return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "Logscale", min = 0, max = 1, default = 0, toggled = true },
+ { ["type"] = "input", name = "1/f scale", min = 0, max = 1, default = 1, toggled = true },
+ { ["type"] = "input", name = "FFT Size", min = 0, max = 4, default = 3, enum = true, scalepoints =
+ {
+ ["512"] = 0,
+ ["1024"] = 1,
+ ["2048"] = 2,
+ ["4096"] = 3,
+ ["8192"] = 4,
+ }
+ },
+ { ["type"] = "input", name = "Height (Aspect)", min = 0, max = 3, default = 1, enum = true, scalepoints =
+ {
+ ["Min"] = 0,
+ ["16:10"] = 1,
+ ["1:1"] = 2,
+ ["Max"] = 3
+ }
+ },
+ { ["type"] = "input", name = "Range", min = 20, max = 160, default = 60, unit="dB"},
+ { ["type"] = "input", name = "Offset", min = -40, max = 40, default = 0, unit="dB"},
+ }
+end
+
+-- a C memory area.
+-- It needs to be in global scope.
+-- When the variable is set to nil, the allocated memory is free()ed.
+-- the memory can be interpeted as float* for use in DSP, or read/write
+-- to a C++ Ringbuffer instance.
+-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:DspShm
+local cmem = nil
+
+function dsp_init (rate)
+ -- global variables (DSP part only)
+ dpy_hz = rate / 25
+ dpy_wr = 0
+
+ -- create a ringbuffer to hold (float) audio-data
+ -- http://manual.ardour.org/lua-scripting/class_reference/#PBD:RingBufferF
+ rb = PBD.RingBufferF (2 * rate)
+
+ -- allocate memory, local mix buffer
+ cmem = ARDOUR.DSP.DspShm (8192)
+
+ -- create a table of objects to share with the GUI
+ local tbl = {}
+ tbl['rb'] = rb;
+ tbl['samplerate'] = rate
+
+ -- "self" is a special DSP variable referring
+ -- to the plugin instance itself.
+ --
+ -- "table()" is-a http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR.LuaTableRef
+ -- which allows to store/retrieve lua-tables to share them other interpreters
+ self:table ():set (tbl);
+end
+
+-- "dsp_runmap" uses Ardour's internal processor API, eqivalent to
+-- 'connect_and_run()". There is no overhead (mapping, translating buffers).
+-- The lua implementation is responsible to map all the buffers directly.
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+ -- here we sum all audio input channels channels and then copy the data to a ringbuffer
+ -- for the GUI to process later
+
+ local audio_ins = in_map:count (): n_audio () -- number of audio input buffers
+ local ccnt = 0 -- processed channel count
+ local mem = cmem:to_float(0) -- a "FloatArray", float* for direct C API usage from the previously allocated buffer
+ for c = 1,audio_ins do
+ -- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:ChanMapping
+ -- Note: lua starts counting at 1, ardour's ChanMapping::get() at 0
+ local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped input buffer
+ local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped output buffer
+
+ -- check if the input is connected to a buffer
+ if (ib ~= ARDOUR.ChanMapping.Invalid) then
+
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:AudioBuffer
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+ if c == 1 then
+ -- first channel, copy as-is
+ ARDOUR.DSP.copy_vector (mem, bufs:get_audio (ib):data (offset), n_samples)
+ else
+ -- all other channels, add to existing data.
+ ARDOUR.DSP.mix_buffers_no_gain (mem, bufs:get_audio (ib):data (offset), n_samples)
+ end
+ ccnt = ccnt + 1;
+
+ -- copy data to output (if not processing in-place)
+ if (ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob) then
+ ARDOUR.DSP.copy_vector (bufs:get_audio (ob):data (offset), bufs:get_audio (ib):data (offset), n_samples)
+ end
+ end
+ end
+
+ -- Clear unconnected output buffers.
+ -- In case we're processing in-place some buffers may be identical,
+ -- so this must be done *after processing*.
+ for c = 1,audio_ins do
+ local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1)
+ local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1)
+ if (ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid) then
+ bufs:get_audio (ob):silence (n_samples, offset)
+ end
+ end
+
+ -- Normalize gain (1 / channel-count)
+ if ccnt > 1 then
+ ARDOUR.DSP.apply_gain_to_buffer (mem, n_samples, 1 / ccnt)
+ end
+
+ -- if no channels were processed, feed silence.
+ if ccnt == 0 then
+ ARDOUR.DSP.memset (mem, 0, n_samples)
+ end
+
+ -- write data to the ringbuffer
+ -- http://manual.ardour.org/lua-scripting/class_reference/#PBD:RingBufferF
+ rb:write (mem, n_samples)
+
+ -- emit QueueDraw every FPS
+ -- TODO: call every FFT window-size worth of samples, at most every FPS
+ dpy_wr = dpy_wr + n_samples
+ if (dpy_wr > dpy_hz) then
+ dpy_wr = dpy_wr % dpy_hz
+ self:queue_draw ()
+ end
+end
+
+----------------------------------------------------------------
+-- GUI
+
+local fft = nil
+local read_ptr = 0
+local line = 0
+local img = nil
+local fft_size = 0
+local last_log = false
+
+function render_inline (ctx, w, max_h)
+ local ctrl = CtrlPorts:array () -- get control port array (read/write)
+ local tbl = self:table ():get () -- get shared memory table
+ local rate = tbl['samplerate']
+ if not cmem then
+ cmem = ARDOUR.DSP.DspShm (0)
+ end
+
+ -- get settings
+ local logscale = ctrl[1] or 0; logscale = logscale > 0 -- x-axis logscale
+ local pink = ctrl[2] or 0; pink = pink > 0 -- 1/f scale
+ local fftsizeenum = ctrl[3] or 3 -- fft-size enum
+ local hmode = ctrl[4] or 1 -- height mode enum
+ local dbrange = ctrl[5] or 60
+ local gaindb = ctrl[6] or 0
+
+ local fftsize
+ if fftsizeenum == 0 then fftsize = 512
+ elseif fftsizeenum == 1 then fftsize = 1024
+ elseif fftsizeenum == 2 then fftsize = 2048
+ elseif fftsizeenum == 4 then fftsize = 8192
+ else fftsize = 4096
+ end
+
+ if fftsize ~= fft_size then
+ fft_size = fftsize
+ fft = nil
+ end
+
+ if dbrange < 20 then dbrange = 20; end
+ if dbrange > 160 then dbrange = 160; end
+ if gaindb < -40 then dbrange = -40; end
+ if gaindb > 40 then dbrange = 40; end
+
+
+ if not fft then
+ fft = ARDOUR.DSP.FFTSpectrum (fft_size, rate)
+ cmem:allocate (fft_size)
+ end
+
+ if last_log ~= logscale then
+ last_log = logscale
+ img = nil
+ line = 0
+ end
+
+ -- calc height
+ if hmode == 0 then
+ h = math.ceil (w * 10 / 16)
+ if (h > 44) then
+ h = 44
+ end
+ elseif (hmode == 2) then
+ h = w
+ elseif (hmode == 3) then
+ h = max_h
+ else
+ h = math.ceil (w * 10 / 16)
+ end
+ if (h > max_h) then
+ h = max_h
+ end
+
+ -- re-create image surface
+ if not img or img:get_width() ~= w or img:get_height () ~= h then
+ img = Cairo.ImageSurface (Cairo.Format.ARGB32, w, h)
+ line = 0
+ end
+ local ictx = img:context ()
+
+ local bins = fft_size / 2 - 1 -- fft bin count
+ local bpx = bins / w -- bins per x-pixel (linear)
+ local fpb = rate / fft_size -- freq-step per bin
+ local f_e = rate / 2 / fpb -- log-scale exponent
+ local f_b = w / math.log (fft_size / 2) -- inverse log-scale base
+ local f_l = math.log (fft_size / rate) * f_b -- inverse logscale lower-bound
+
+ local rb = tbl['rb'];
+ local mem = cmem:to_float (0)
+
+ while (rb:read_space() >= fft_size) do
+ -- process one line / buffer
+ rb:read (mem, fft_size)
+ fft:set_data_hann (mem, fft_size, 0)
+ fft:execute ()
+
+ -- draw spectrum
+ assert (bpx >= 1)
+
+ -- scroll
+ if line == 0 then line = h - 1; else line = line - 1; end
+
+ -- clear this line
+ ictx:set_source_rgba (0, 0, 0, 1)
+ ictx:rectangle (0, line, w, 1)
+ ictx:fill ()
+
+ for x = 0, w - 1 do
+ local pk = 0
+ local b0, b1
+ if logscale then
+ -- 20 .. 20k
+ b0 = math.floor (f_e ^ (x / w))
+ b1 = math.floor (f_e ^ ((x + 1) / w))
+ else
+ b0 = math.floor (x * bpx)
+ b1 = math.floor ((x + 1) * bpx)
+ end
+
+ if b1 >= b0 and b1 <= bins and b0 >= 0 then
+ for i = b0, b1 do
+ local level = gaindb + fft:power_at_bin (i, pink and i or 1) -- pink ? i : 1
+ if level > -dbrange then
+ local p = (dbrange + level) / dbrange
+ if p > pk then pk = p; end
+ end
+ end
+ end
+ if pk > 0.0 then
+ if pk > 1.0 then pk = 1.0; end
+ ictx:set_source_rgba (ARDOUR.LuaAPI.hsla_to_rgba (.70 - .72 * pk, .9, .3 + pk * .4));
+ ictx:rectangle (x, line, 1, 1)
+ ictx:fill ()
+ end
+ end
+ end
+
+ -- copy image surface
+ if line == 0 then
+ img:set_as_source (ctx, 0, 0)
+ ctx:rectangle (0, 0, w, h)
+ ctx:fill ()
+ else
+ local yp = h - line - 1;
+ img:set_as_source (ctx, 0, yp)
+ ctx:rectangle (0, yp, w, line)
+ ctx:fill ()
+
+ img:set_as_source (ctx, 0, -line)
+ ctx:rectangle (0, 0, w, yp)
+ ctx:fill ()
+ end
+
+
+ -- draw grid on top
+ function x_at_freq (f)
+ if logscale then
+ return f_l + f_b * math.log (f)
+ else
+ return 2 * w * f / rate;
+ end
+ end
+
+ function grid_freq (f)
+ -- draw vertical grid line
+ local x = .5 + math.floor (x_at_freq (f))
+ ctx:move_to (x, 0)
+ ctx:line_to (x, h)
+ ctx:stroke ()
+ end
+
+ -- draw grid on top
+ local dash3 = C.DoubleVector ()
+ dash3:add ({1, 3})
+ ctx:set_line_width (1.0)
+ ctx:set_dash (dash3, 2) -- dotted line
+ ctx:set_source_rgba (.5, .5, .5, .8)
+ grid_freq (100)
+ grid_freq (1000)
+ grid_freq (10000)
+ ctx:unset_dash ()
+
+ return {w, h}
+end
diff --git a/scripts/split_all_markers.lua b/scripts/split_all_markers.lua
new file mode 100644
index 0000000..8c4cdb1
--- /dev/null
+++ b/scripts/split_all_markers.lua
@@ -0,0 +1,70 @@
+ardour { ["type"] = "EditorAction", name = "Marker Split",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Split regions on selected tracks at all locations markers]]
+}
+
+function factory (params) return function ()
+
+ local loc = Session:locations () -- all marker locations
+
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
+ local sel = Editor:get_selection ()
+
+ -- prepare undo operation
+ -- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Session
+ Session:begin_reversible_command ("Auto Region Split")
+ local add_undo = false -- keep track if something has changed
+
+ -- Track/Bus Selection -- iterate over all Editor-GUI selected tracks
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:TrackSelection
+ for r in sel.tracks:routelist ():iter () do
+ -- each of the items 'r' is-a
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Route
+
+ local track = r:to_track () -- see if it's a track
+ if track:isnil () then
+ -- if not, skip it
+ goto continue
+ end
+
+ -- get track's playlist
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Playlist
+ local playlist = track:playlist ()
+
+ -- clear existing changes, prepare "diff" of state for undo
+ playlist:to_stateful ():clear_changes ()
+
+ -- iterate over all location markers
+ for l in loc:list ():iter () do
+ if l:is_mark() then
+ -- get all regions on the given track's playlist (may be stacked)
+ for reg in playlist:regions_at (l:start ()):iter () do
+ playlist:split_region (reg, l:start (), 0)
+ -- the above operation will invalidate the playlist's region list:
+ -- split creates 2 new regions.
+ --
+ -- Hence this script does it the way it does: the inner-most loop
+ -- is over playlist-regions.
+ end
+ end
+ end
+
+ -- collect undo data
+ if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
+ -- is something has changed, we need to save it at the end.
+ add_undo = true
+ end
+
+ ::continue::
+ end
+
+ -- all done, commit the combined Undo Operation
+ if add_undo then
+ -- the 'nil' Command here mean to use the collected diffs added above
+ Session:commit_reversible_command (nil)
+ else
+ Session:abort_reversible_command ()
+ end
+
+end end
diff --git a/scripts/stop_at_marker.lua b/scripts/stop_at_marker.lua
new file mode 100644
index 0000000..f710a9f
--- /dev/null
+++ b/scripts/stop_at_marker.lua
@@ -0,0 +1,40 @@
+ardour {
+ ["type"] = "session",
+ name = "Stop at Marker",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[An example session script which stops the transport on every location marker when rolling forward.]]
+}
+
+function factory ()
+ return function (n_samples)
+ if (not Session:transport_rolling ()) then
+ -- not rolling, nothing to do.
+ return
+ end
+
+ local pos = Session:transport_frame () -- current playhead position
+ local loc = Session:locations () -- all marker locations
+
+ -- find first marker after the current playhead position, ignore loop + punch ranges
+ -- (this only works when rolling forward, to extend this example see
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Locations )
+ local m = loc:first_mark_after (pos, false)
+
+ if (m == -1) then
+ -- no marker was found
+ return
+ end
+
+ -- since ardour may split the process cycle for events,
+ -- n_samples may be smaller.
+ local blk = Session:get_block_size ()
+
+ -- transport stop can only happen on a process-cycle boundary.
+ -- This callback happens from within the process callback,
+ -- so we need to queue it ahead of time.
+ if (pos + n_samples + blk >= m and pos + n_samples < m) then
+ Session:request_transport_speed (0.0, true)
+ end
+ end
+end
diff --git a/scripts/synth1.lua b/scripts/synth1.lua
new file mode 100644
index 0000000..2a8288b
--- /dev/null
+++ b/scripts/synth1.lua
@@ -0,0 +1,100 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Simple Synth",
+ category = "Instrument",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[An Example Synth for Prototyping.]]
+}
+
+function dsp_ioconfig ()
+ return
+ {
+ -- { midi_in = 1, audio_in = 0, audio_out = -1}, -- any number of channels
+ -- { midi_in = 1, audio_in = 0, audio_out = 1}, -- values > 0, precisely N channels
+ { midi_in = 1, audio_in = 0, audio_out = 2}, -- values > 0, precisely N channels
+ { midi_in = 1, audio_in = 0, audio_out = 4}, -- values > 0, precisely N channels
+ { midi_in = 1, audio_in = 0, audio_out = 8}, -- values > 0, precisely N channels
+ -- { midi_in = 1, audio_in = 0, audio_out = -6}, -- values < -2, up to -N channels, here 1,..,6
+ }
+end
+
+local note_table = {}
+local active_notes = {}
+local phases = {}
+local env = .01;
+
+function dsp_init (rate)
+ for n = 1,128 do
+ note_table [n] = (440 / 32) * 2^((n - 10.0) / 12.0) / rate
+ end
+ env = 100 / rate
+end
+
+function dsp_run (ins, outs, n_samples)
+ -- initialize output buffer
+ local a = {}
+ for s = 1, n_samples do a[s] = 0 end
+
+
+ -- very basic synth, simple sine, basic envelope
+ local function synth (s_start, s_end)
+ for n,v in pairs (active_notes) do
+ local vel = v["vel"] or 0
+ local tgt = v["tvel"];
+ for s = s_start,s_end do
+ local phase = phases[n] or 0
+ vel = vel + env * (tgt - vel)
+ a[s] = a[s] + math.sin(6.283185307 * phase) * vel / 167
+ phase = phase + note_table[n]
+ if (phase > 1.0) then
+ phases[n] = phase - 2.0
+ else
+ phases[n] = phase
+ end
+ end
+ if vel < 1 and tgt == 0 then
+ active_notes[n] = nil
+ else
+ active_notes[n]["vel"] = vel;
+ end
+ end
+ end
+
+ local tme = 1
+ -- parse midi messages
+ assert (type(midiin) == "table") -- global table of midi events (for now)
+ for _,b in pairs (midiin) do
+ local t = b["time"] -- t = [ 1 .. n_samples ]
+
+ -- synth sound until event
+ synth(tme, t)
+ tme = t + 1
+
+ local d = b["data"] -- get midi-event
+ -- we ignore the midi channel
+ if (#d == 3 and bit32.band (d[1], 240) == 144) then -- note on
+ local n = 1 + d[2];
+ active_notes[n] = active_notes[n] or {}
+ active_notes[n]["tvel"] = d[3]
+ end
+ if (#d == 3 and bit32.band (d[1], 240) == 128) then -- note off
+ local n = 1 + d[2];
+ active_notes[n] = active_notes[n] or {}
+ active_notes[n]["tvel"] = 0
+ end
+ if (#d == 3 and bit32.band (d[1], 240) == 176) then -- CC
+ if (d[2] == 120 or d[2] == 123) then -- panic
+ active_notes = {}
+ end
+ end
+ end
+
+ -- synth rest of cycle
+ synth(tme, n_samples)
+
+ -- copy
+ for c = 1,#outs do
+ outs[c]:set_table(a, n_samples)
+ end
+end
diff --git a/scripts/tomsloop.lua b/scripts/tomsloop.lua
new file mode 100644
index 0000000..0f424e7
--- /dev/null
+++ b/scripts/tomsloop.lua
@@ -0,0 +1,125 @@
+ardour { ["type"] = "EditorAction", name = "Tom's Loop",
+ license = "MIT",
+ author = "Ardour Team",
+ description = [[Bounce the loop-range of all non muted audio tracks, paste N times at playhead]]
+}
+
+function action_params ()
+ return { ["times"] = { title = "Number of copies to add", default = "1"}, }
+end
+
+function factory (params) return function ()
+ -- get options
+ local p = params or {}
+ local n_paste = tonumber (p["times"] or 1)
+ assert (n_paste > 0)
+
+ local proc = ARDOUR.LuaAPI.nil_proc () -- bounce w/o processing
+ local itt = ARDOUR.InterThreadInfo () -- bounce progress info (unused)
+
+ local loop = Session:locations ():auto_loop_location ()
+ local playhead = Session:transport_frame ()
+
+ -- make sure we have a loop, and the playhead (edit point) is after it
+ if not loop then
+ print ("A Loop range must be set.")
+ goto errorout
+ end
+ assert (loop:start () < loop:_end ())
+ if loop:_end () >= playhead then
+ print ("The Playhead (paste point) needs to be after the loop.")
+ goto errorout
+ end
+
+ -- prepare undo operation
+ Session:begin_reversible_command ("Tom's Loop")
+ local add_undo = false -- keep track if something has changed
+
+ -- prefer solo'ed tracks
+ local soloed_track_found = false
+ for route in Session:get_tracks ():iter () do
+ if route:soloed () then
+ soloed_track_found = true
+ break
+ end
+ end
+
+ -- count regions that are bounced
+ local n_regions_created = 0
+
+ -- loop over all tracks in the session
+ for route in Session:get_tracks ():iter () do
+ if soloed_track_found then
+ -- skip not soloed tracks
+ if not route:soloed () then
+ goto continue
+ end
+ end
+
+ -- skip muted tracks (also applies to soloed + muted)
+ if route:muted () then
+ goto continue
+ end
+
+ -- at this point the track is either soloed (if at least one track is soloed)
+ -- or not muted (if no track is soloed)
+
+ -- test if bouncing is possible
+ local track = route:to_track ()
+ if not track:bounceable (proc, false) then
+ goto continue
+ end
+
+ -- only audio tracks
+ local playlist = track:playlist ()
+ if playlist:data_type ():to_string () ~= "audio" then
+ goto continue
+ end
+
+ -- check if there is at least one unmuted region in the loop-range
+ local reg_unmuted_count = 0
+ for reg in playlist:regions_touched (loop:start (), loop:_end ()):iter () do
+ if not reg:muted() then
+ reg_unmuted_count = reg_unmuted_count + 1
+ end
+ end
+
+ if reg_unmuted_count < 1 then
+ goto continue
+ end
+
+ -- clear existing changes, prepare "diff" of state for undo
+ playlist:to_stateful ():clear_changes ()
+
+ -- do the actual work
+ local region = track:bounce_range (loop:start (), loop:_end (), itt, proc, false)
+ playlist:add_region (region, playhead, n_paste, false)
+
+ n_regions_created = n_regions_created + 1
+
+ -- create a diff of the performed work, add it to the session's undo stack
+ -- and check if it is not empty
+ if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
+ add_undo = true
+ end
+
+ ::continue::
+ end
+
+ --advance playhead so it's just after the newly added regions
+ if n_regions_created > 0 then
+ Session:request_locate((playhead + loop:length() * n_paste),false)
+ end
+
+ -- all done, commit the combined Undo Operation
+ if add_undo then
+ -- the 'nil' Command here mean to use the collected diffs added above
+ Session:commit_reversible_command (nil)
+ else
+ Session:abort_reversible_command ()
+ end
+
+ print ("bounced " .. n_regions_created .. " regions from loop range (" .. loop:length() .. " frames) to playhead @ frame # " .. playhead)
+
+ ::errorout::
+end end
diff --git a/scripts/voice_activate.lua b/scripts/voice_activate.lua
new file mode 100644
index 0000000..64c1ba0
--- /dev/null
+++ b/scripts/voice_activate.lua
@@ -0,0 +1,53 @@
+ardour {
+ ["type"] = "dsp",
+ name = "Voice/Level Activate",
+ category = "Utility",
+ author = "Ardour Lua Task Force",
+ license = "MIT",
+ description = [[Roll the transport when the signal level on the plugin's input exceeds a given threshold.]]
+}
+
+function dsp_ioconfig ()
+ return
+ {
+ -- support all in/out as long as input port count equals output port count
+ { audio_in = -1, audio_out = -1},
+ }
+end
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "Threshold", min = -20, max = 0, default = -6, doc = "Threshold in dBFS for all channels" },
+ { ["type"] = "output", name = "Level", min = -120, max = 0 },
+ }
+end
+
+function dsp_configure (ins, outs)
+ n_channels = ins:n_audio()
+end
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+ local ctrl = CtrlPorts:array() -- get control port array (read/write)
+
+ if Session:transport_rolling() then
+ -- don't do anything if the transport is already rolling
+ ctrl[2] = -math.huge -- set control output port value
+ return
+ end
+
+ local threshold = 10 ^ (.05 * ctrl[1]) -- dBFS to coefficient
+ local level = -math.huge
+
+ for c = 1,n_channels do
+ local b = in_map:get(ARDOUR.DataType("audio"), c - 1) -- get id of audio-buffer for the given channel
+ if b ~= ARDOUR.ChanMapping.Invalid then -- check if channel is mapped
+ local a = ARDOUR.DSP.compute_peak(bufs:get_audio(b):data(offset), n_samples, 0) -- compute digital peak
+ if a > threshold then
+ Session:request_transport_speed(1.0, true)
+ end
+ if a > level then level = a end -- max level of all channels
+ end
+ end
+ ctrl[2] = ARDOUR.DSP.accurate_coefficient_to_dB (level) -- set control output port value
+end
diff --git a/scripts/wscript b/scripts/wscript
new file mode 100644
index 0000000..a820a1f
--- /dev/null
+++ b/scripts/wscript
@@ -0,0 +1,16 @@
+#!/usr/bin/python
+
+import os
+
+top = '.'
+out = 'build'
+
+def configure(conf):
+ pass
+
+def build(bld):
+ scripts = bld.path.ant_glob ('*.lua', excl=['^_*'])
+ bld.install_files (os.path.join(bld.env['DATADIR'], 'scripts'), scripts)
+
+def options(opt):
+ pass
diff --git a/session_utils/common.cc b/session_utils/common.cc
index 9353c76..8d1cdec 100644
--- a/session_utils/common.cc
+++ b/session_utils/common.cc
@@ -86,7 +86,7 @@ class MyEventLoop : public sigc::trackable, public EventLoop
static MyEventLoop *event_loop;
void
-SessionUtils::init ()
+SessionUtils::init (bool print_log)
{
if (!ARDOUR::init (false, true, localedir)) {
cerr << "Ardour failed to initialize\n" << endl;
@@ -97,10 +97,12 @@ SessionUtils::init ()
EventLoop::set_event_loop_for_thread (event_loop);
SessionEvent::create_per_thread_pool ("util", 512);
- test_receiver.listen_to (error);
- test_receiver.listen_to (info);
- test_receiver.listen_to (fatal);
- test_receiver.listen_to (warning);
+ if (print_log) {
+ test_receiver.listen_to (error);
+ test_receiver.listen_to (info);
+ test_receiver.listen_to (fatal);
+ test_receiver.listen_to (warning);
+ }
}
// TODO return NULL, rather than exit() ?!
@@ -113,6 +115,9 @@ static Session * _load_session (string dir, string state)
::exit (EXIT_FAILURE);
}
+ engine->set_input_channels (256);
+ engine->set_output_channels (256);
+
float sr;
SampleFormat sf;
@@ -120,18 +125,18 @@ static Session * _load_session (string dir, string state)
if (Session::get_info_from_path (s, sr, sf) == 0) {
if (engine->set_sample_rate (sr)) {
std::cerr << "Cannot set session's samplerate.\n";
- ::exit (EXIT_FAILURE);
+ return 0;
}
} else {
std::cerr << "Cannot get samplerate from session.\n";
- ::exit (EXIT_FAILURE);
+ return 0;
}
init_post_engine ();
if (engine->start () != 0) {
std::cerr << "Cannot start Audio/MIDI engine\n";
- ::exit (EXIT_FAILURE);
+ return 0;
}
Session* session = new Session (*engine, dir, state);
@@ -140,7 +145,7 @@ static Session * _load_session (string dir, string state)
}
Session *
-SessionUtils::load_session (string dir, string state)
+SessionUtils::load_session (string dir, string state, bool exit_at_failure)
{
Session* s = 0;
try {
@@ -158,6 +163,9 @@ SessionUtils::load_session (string dir, string state)
cerr << "unknown exception.\n";
::exit (EXIT_FAILURE);
}
+ if (!s && exit_at_failure) {
+ ::exit (EXIT_FAILURE);
+ }
return s;
}
diff --git a/session_utils/common.h b/session_utils/common.h
index 5263e84..fcfd043 100644
--- a/session_utils/common.h
+++ b/session_utils/common.h
@@ -16,7 +16,7 @@ class TestReceiver : public Receiver
namespace SessionUtils {
/** initialize libardour */
- void init ();
+ void init (bool print_log = true);
/** clean up, stop Processing Engine
* @param s Session to close (may me NULL)
@@ -26,7 +26,7 @@ namespace SessionUtils {
/** @param dir Session directory.
* @param state Session state file, without .ardour suffix.
*/
- ARDOUR::Session * load_session (std::string dir, std::string state);
+ ARDOUR::Session * load_session (std::string dir, std::string state, bool exit_at_failure = true);
/** close session and stop engine
* @param s Session to close (may me NULL)
diff --git a/session_utils/copy-mixer.cc b/session_utils/copy-mixer.cc
new file mode 100644
index 0000000..825b4e0
--- /dev/null
+++ b/session_utils/copy-mixer.cc
@@ -0,0 +1,360 @@
+#include <iostream>
+#include <cstdlib>
+#include <getopt.h>
+#include <glibmm.h>
+
+#include "pbd/basename.h"
+#include "pbd/stateful.h"
+#include "ardour/filename_extensions.h"
+#include "ardour/send.h"
+#include "ardour/track.h"
+
+#include "common.h"
+
+#define X_(Text) Text
+
+using namespace std;
+using namespace ARDOUR;
+using namespace SessionUtils;
+
+static bool opt_debug_dump = false;
+static bool opt_copy_busses = false;
+static bool opt_verbose = false;
+static bool opt_log = false;
+
+/* this is copied from Session::new_route_from_template */
+static void
+trim_state_for_mixer_copy (Session*s, XMLNode& node)
+{
+ /* trim bitslots from listen sends so that new ones are used */
+ XMLNodeList children = node.children ();
+ for (XMLNodeList::iterator i = children.begin (); i != children.end (); ++i) {
+ if ((*i)->name() == X_("Processor")) {
+ /* ForceIDRegeneration does not catch the following */
+ XMLProperty const * role = (*i)->property (X_("role"));
+ XMLProperty const * type = (*i)->property (X_("type"));
+ if (role && role->value () == X_("Aux")) {
+ /* check if the target bus exists,
+ * HERE: we use the bus-name (not target-id)
+ */
+ XMLProperty const * target = (*i)->property (X_("name"));
+ if (!target) {
+ (*i)->add_property ("type", "dangling-aux-send");
+ continue;
+ }
+ boost::shared_ptr<Route> r = s->route_by_name (target->value ());
+ if (!r || boost::dynamic_pointer_cast<Track> (r)) {
+ (*i)->add_property ("type", "dangling-aux-send");
+ continue;
+ }
+ (*i)->add_property ("target", r->id ().to_s ());
+ }
+ if (role && role->value () == X_("Listen")) {
+ (*i)->remove_property (X_("bitslot"));
+ }
+ else if (role && (role->value () == X_("Send") || role->value () == X_("Aux"))) {
+ char buf[32];
+ Delivery::Role xrole;
+ uint32_t bitslot = 0;
+ xrole = Delivery::Role (string_2_enum (role->value (), xrole));
+ std::string name = Send::name_and_id_new_send (*s, xrole, bitslot, false);
+ snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
+ (*i)->remove_property (X_("bitslot"));
+ (*i)->remove_property (X_("name"));
+ (*i)->add_property ("bitslot", buf);
+ (*i)->add_property ("name", name);
+ }
+ else if (type && type->value () == X_("intreturn")) {
+ // ignore, in case bus existed in old session,
+ // tracks in old session may be connected to it.
+ // if the bus is new, new_route_from_template()
+ // will have re-created an ID.
+ (*i)->add_property ("type", "ignore-aux-return");
+ }
+ else if (type && type->value () == X_("return")) {
+ // Return::set_state() generates a new one
+ (*i)->remove_property (X_("bitslot"));
+ }
+ else if (type && type->value () == X_("port")) {
+ // PortInsert::set_state() handles the bitslot
+ (*i)->remove_property (X_("bitslot"));
+ (*i)->add_property ("ignore-name", "1");
+ }
+ }
+ }
+}
+
+static void
+copy_mixer_settings (Session*s, boost::shared_ptr<Route> dst, XMLNode& state)
+{
+ PBD::Stateful::ForceIDRegeneration force_ids;
+
+ trim_state_for_mixer_copy (s, state);
+ state.remove_nodes_and_delete ("Diskstream");
+ state.remove_nodes_and_delete ("Automation");
+ if (opt_debug_dump) {
+ state.dump (cout);
+ }
+
+ dst->set_state (state, PBD::Stateful::loading_state_version);
+}
+
+static int
+copy_session_routes (
+ const std::string& src_path, const std::string& src_name,
+ const std::string& dst_path, const std::string& dst_load, const std::string& dst_save)
+{
+ SessionUtils::init (opt_log);
+ Session* s = 0;
+
+ typedef std::map<std::string,XMLNode*> StateMap;
+ StateMap routestate;
+ StateMap buslist;
+
+ s = SessionUtils::load_session (src_path, src_name, false);
+
+ if (!s) {
+ fprintf (stderr, "Cannot load source session %s/%s.\n", src_path.c_str (), src_name.c_str ());
+ SessionUtils::cleanup ();
+ return -1;
+ }
+
+ /* get route state from first session */
+ boost::shared_ptr<RouteList> rl = s->get_routes ();
+ for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
+ boost::shared_ptr<Route> r = *i;
+ if (r->is_master () || r->is_monitor () || r->is_auditioner ()) {
+ continue;
+ }
+ XMLNode& state (r->get_state ());
+ routestate[r->name ()] = &state;
+ if (boost::dynamic_pointer_cast<Track> (r)) {
+ continue;
+ }
+ buslist[r->name ()] = &state;
+ }
+ rl.reset ();
+ SessionUtils::unload_session (s);
+
+
+ /* open target session */
+ s = SessionUtils::load_session (dst_path, dst_load);
+ if (!s) {
+ fprintf (stderr, "Cannot load target session %s/%s.\n", dst_path.c_str (), dst_load.c_str ());
+ SessionUtils::cleanup ();
+ return -1;
+ }
+
+ /* iterate over all busses in the src session, add missing ones to target */
+ if (opt_copy_busses) {
+ rl = s->get_routes ();
+ for (StateMap::const_iterator i = buslist.begin (); i != buslist.end (); ++i) {
+ if (s->route_by_name (i->first)) {
+ continue;
+ }
+ XMLNode& rs (*(i->second));
+ s->new_route_from_template (1, rs, rs.property (X_("name"))->value (), NewPlaylist);
+ }
+ }
+
+ /* iterate over all *busses* in the target session.
+ * setup internal return targets.
+ */
+ rl = s->get_routes ();
+ for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
+ boost::shared_ptr<Route> r = *i;
+ /* skip special busses */
+ if (r->is_master () || r->is_monitor () || r->is_auditioner ()) {
+ continue;
+ }
+ if (boost::dynamic_pointer_cast<Track> (r)) {
+ continue;
+ }
+ /* find matching route by name */
+ std::map<std::string,XMLNode*>::iterator it = routestate.find (r->name ());
+ if (it == routestate.end ()) {
+ if (opt_verbose) {
+ printf (" -- no match for '%s'\n", (*i)->name ().c_str ());
+ }
+ continue;
+ }
+ if (opt_verbose) {
+ printf ("-- found match '%s'\n", (*i)->name ().c_str ());
+ }
+ XMLNode *state = it->second;
+ // copy state
+ copy_mixer_settings (s, r, *state);
+ }
+
+ /* iterate over all tracks in the target session.. */
+ rl = s->get_routes ();
+ for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
+ boost::shared_ptr<Route> r = *i;
+ /* skip special busses */
+ if (r->is_master () || r->is_monitor () || r->is_auditioner ()) {
+ continue;
+ }
+ if (!boost::dynamic_pointer_cast<Track> (r)) {
+ continue;
+ }
+
+ /* find matching route by name */
+ std::map<std::string,XMLNode*>::iterator it = routestate.find (r->name ());
+ if (it == routestate.end ()) {
+ if (opt_verbose) {
+ printf (" -- no match for '%s'\n", (*i)->name ().c_str ());
+ }
+ continue;
+ }
+ if (opt_verbose) {
+ printf ("-- found match '%s'\n", (*i)->name ().c_str ());
+ }
+ XMLNode *state = it->second;
+ /* copy state */
+ copy_mixer_settings (s, r, *state);
+ }
+
+ s->save_state (dst_save);
+
+ rl.reset ();
+ SessionUtils::unload_session (s);
+
+ // clean up.
+ for (StateMap::iterator i = routestate.begin (); i != routestate.end (); ++i) {
+ XMLNode *state = i->second;
+ delete state;
+ }
+
+ SessionUtils::cleanup ();
+ return 0;
+}
+
+
+static void usage (int status) {
+ // help2man compatible format (standard GNU help-text)
+ printf (UTILNAME " - copy mixer settings from one session to another.\n\n");
+ printf ("Usage: " UTILNAME " [ OPTIONS ] <src> <dst>\n\n");
+
+ printf ("Options:\n\
+ -h, --help display this help and exit\n\
+ -b, --bus-copy add busses present in src to dst\n\
+ -d, --debug print pre-processed XML for each route\n\
+ -l, --log-messages display libardour log messages\n\
+ -s, --snapshot <name> create a new snapshot in dst\n\
+ -v, --verbose show perfomed copy opeations\n\
+ -V, --version print version information and exit\n\
+\n");
+
+ printf ("\n\
+This utility copies mixer-settings from the src-session to the dst-session.\n\
+Both <src> and <dst> are paths to .ardour session files.\n\
+If --snapshot is not given, the <dst> session file is overwritten.\n\
+When --snapshot is set, a new snaphot in the <dst> session is created.\n\
+\n");
+
+ printf ("Report bugs to <http://tracker.ardour.org/>\n"
+ "Website: <http://ardour.org/>\n");
+ ::exit (status);
+}
+
+static bool ends_with (std::string const& value, std::string const& ending)
+{
+ if (ending.size() > value.size()) return false;
+ return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
+}
+
+int main (int argc, char* argv[])
+{
+ const char *optstring = "bhls:Vv";
+
+ const struct option longopts[] = {
+ { "bus-copy", required_argument, 0, 'b' },
+ { "debug", no_argument, 0, 'd' },
+ { "help", no_argument, 0, 'h' },
+ { "log-messages", no_argument, 0, 'l' },
+ { "snapshot", no_argument, 0, 's' },
+ { "version", no_argument, 0, 'V' },
+ { "vebose", no_argument, 0, 'v' },
+ };
+
+ int c = 0;
+ std::string dst_snapshot_name = "";
+
+ while (EOF != (c = getopt_long (argc, argv,
+ optstring, longopts, (int *) 0))) {
+ switch (c) {
+ case 'b':
+ opt_copy_busses = true;
+ break;
+
+ case 'd':
+ opt_debug_dump = true;
+ break;
+
+ case 'h':
+ usage (0);
+ break;
+
+ case 'l':
+ opt_log = true;
+ break;
+
+ case 's':
+ dst_snapshot_name = optarg;
+ break;
+
+ case 'V':
+ printf ("ardour-utils version %s\n\n", VERSIONSTRING);
+ printf ("Copyright (C) GPL 2016 Robin Gareus <robin at gareus.org>\n");
+ exit (0);
+ break;
+
+ case 'v':
+ opt_verbose = true;
+ break;
+
+ default:
+ usage (EXIT_FAILURE);
+ break;
+ }
+ }
+
+ // TODO parse path/name from a single argument.
+
+ if (optind + 2 > argc) {
+ usage (EXIT_FAILURE);
+ }
+
+ std::string src = argv[optind];
+ std::string dst = argv[optind + 1];
+
+ // statefile_suffix
+
+ if (!ends_with (src, statefile_suffix)) {
+ fprintf (stderr, "source is not a .ardour session file.\n");
+ exit (1);
+ }
+ if (!ends_with (dst, statefile_suffix)) {
+ fprintf (stderr, "target is not a .ardour session file.\n");
+ exit (1);
+ }
+ if (!Glib::file_test (src, Glib::FILE_TEST_IS_REGULAR)) {
+ fprintf (stderr, "source is not a regular file.\n");
+ exit (1);
+ }
+ if (!Glib::file_test (dst, Glib::FILE_TEST_IS_REGULAR)) {
+ fprintf (stderr, "target is not a regular file.\n");
+ exit (1);
+ }
+
+ std::string src_path = Glib::path_get_dirname (src);
+ std::string src_name = PBD::basename_nosuffix (src);
+ std::string dst_path = Glib::path_get_dirname (dst);
+ std::string dst_name = PBD::basename_nosuffix (dst);
+
+ // TODO check if src != dst ..
+ return copy_session_routes (
+ src_path, src_name,
+ dst_path, dst_name,
+ dst_snapshot_name);
+}
diff --git a/session_utils/export.cc b/session_utils/export.cc
index 13f7898..6ea7e2b 100644
--- a/session_utils/export.cc
+++ b/session_utils/export.cc
@@ -124,7 +124,7 @@ static int export_session (Session *session,
double progress = 0.0;
switch (status->active_job) {
case ExportStatus::Normalizing:
- progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles;
+ progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
printf ("* Normalizing %.1f%% \r", 100. * progress); fflush (stdout);
break;
case ExportStatus::Exporting:
@@ -147,12 +147,12 @@ static int export_session (Session *session,
static void usage (int status) {
// help2man compatible format (standard GNU help-text)
- printf ("export - export an ardour session from the commandline.\n\n");
- printf ("Usage: export [ OPTIONS ] <session-dir> <session-name>\n\n");
+ printf (UTILNAME " - export an ardour session from the commandline.\n\n");
+ printf ("Usage: " UTILNAME " [ OPTIONS ] <session-dir> <session/snapshot-name>\n\n");
printf ("Options:\n\
-h, --help display this help and exit\n\
-n, --normalize normalize signal level (to 0dBFS)\n\
- -o, --output <file> set expected [initial] framerate\n\
+ -o, --output <file> export output file name\n\
-s, --samplerate <rate> samplerate to use (default: 48000)\n\
-V, --version print version information and exit\n\
\n");
diff --git a/session_utils/wscript b/session_utils/wscript
index a001fb9..6218634 100644
--- a/session_utils/wscript
+++ b/session_utils/wscript
@@ -48,13 +48,14 @@ def build_ardour_util(bld, util):
]
obj.defines = [
'VERSIONSTRING="' + str(bld.env['VERSION']) + '"',
+ 'UTILNAME="' + str(pgmprefix + '-' + util) + '"',
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
'PACKAGE="' + "ARDOURUTILS" + '"',
]
obj.install_path = bld.env['LIBDIR'] + '/utils'
- obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL'
+ obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL XML'
obj.uselib += ' FFTW3F'
obj.uselib += ' AUDIOUNITS OSX LO '
obj.uselib += ' TAGLIB '
diff --git a/system_config b/system_config
index 02e4f1e..55f3cf5 100644
--- a/system_config
+++ b/system_config
@@ -4,6 +4,7 @@
<Option name="auto-connect-standard-busses" value="1"/>
<Option name="output-auto-connect" value="2"/>
<Option name="input-auto-connect" value="1"/>
+ <Option name="strict-io" value="1"/>
<Option name="tracks-auto-naming" value="1"/>
<Option name="trace-midi-input" value="0"/>
<Option name="trace-midi-output" value="0"/>
@@ -29,7 +30,6 @@
<Option name="ltc-output-volume" value="0.125893"/>
<Option name="feedback-interval-ms" value="100"/>
<Option name="use-tranzport" value="0"/>
- <Option name="remote-model" value="1"/>
<Option name="minimum-disk-read-bytes" value="262144"/>
<Option name="minimum-disk-write-bytes" value="262144"/>
<Option name="midi-readahead" value="1"/>
@@ -39,6 +39,7 @@
<Option name="midi-track-buffer-seconds" value="1"/>
<Option name="disk-choice-space-threshold" value="57600000"/>
<Option name="auto-analyse-audio" value="0"/>
+ <Option name="transient-sensitivity" value="50"/>
<Option name="osc-port" value="3819"/>
<Option name="use-osc" value="0"/>
<Option name="layer-model" value="1"/>
@@ -72,12 +73,14 @@
<Option name="click-sound" value=""/>
<Option name="click-emphasis-sound" value=""/>
<Option name="click-gain" value="1"/>
+ <Option name="use-click-emphasis" value="1"/>
<Option name="skip-playback" value="1"/>
<Option name="plugins-stop-with-transport" value="0"/>
<Option name="stop-recording-on-xrun" value="0"/>
<Option name="create-xrun-marker" value="1"/>
<Option name="stop-at-session-end" value="0"/>
<Option name="seamless-loop" value="0"/>
+ <Option name="preroll-seconds" value="1"/>
<Option name="loop-is-mode" value="0"/>
<Option name="preroll" value="0"/>
<Option name="postroll" value="0"/>
@@ -94,6 +97,7 @@
<Option name="meter-type-master" value="16"/>
<Option name="meter-type-track" value="4"/>
<Option name="meter-type-bus" value="4"/>
+ <Option name="try-autostart-engine" value="0"/>
<Option name="auditioner-output-left" value="default"/>
<Option name="auditioner-output-right" value="default"/>
<Option name="replicate-missing-region-channels" value="0"/>
@@ -123,6 +127,8 @@
<Option name="verbose-plugin-scan" value="1"/>
<Option name="vst-scan-timeout" value="600"/>
<Option name="discover-audio-units" value="0"/>
+ <Option name="ask-replace-instrument" value="1"/>
+ <Option name="ask-setup-instrument" value="1"/>
<Option name="plugin-path-vst" value="@default@"/>
<Option name="plugin-path-lxvst" value="@default@"/>
<Option name="denormal-protection" value="0"/>
@@ -136,6 +142,8 @@
<Option name="video-server-docroot" value="/"/>
<Option name="show-video-export-info" value="1"/>
<Option name="show-video-server-dialog" value="0"/>
+ <Option name="export-preroll" value="10"/>
+ <Option name="export-silence-threshold" value="-inf"/>
</Config>
<Metadata/>
<ControlProtocols/>
diff --git a/tools/clang-format b/tools/clang-format
new file mode 100644
index 0000000..e014125
--- /dev/null
+++ b/tools/clang-format
@@ -0,0 +1,25 @@
+---
+
+Language: Cpp
+AlignAfterOpenBracket: 'true'
+AlignTrailingComments: 'true'
+AlwaysBreakTemplateDeclarations: 'true'
+AllowShortBlocksOnASingleLine: 'false'
+AllowShortCaseLabelsOnASingleLine: 'false'
+AllowShortFunctionsOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: 'false'
+AllowShortLoopsOnASingleLine: 'false'
+AlwaysBreakAfterDefinitionReturnType: 'true'
+BasedOnStyle: LLVM
+BreakBeforeBraces: 'Linux'
+BreakConstructorInitializersBeforeComma: 'true'
+ColumnLimit: '100'
+ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
+IndentCaseLabels: 'false'
+NamespaceIndentation: 'None'
+PenaltyReturnTypeOnItsOwnLine: '1'
+PointerAlignment: Left
+SpaceBeforeParens: Always
+TabWidth: '2'
+UseTab: ForIndentation
+
diff --git a/tools/ctagsparse.py b/tools/ctagsparse.py
new file mode 100755
index 0000000..989d40c
--- /dev/null
+++ b/tools/ctagsparse.py
@@ -0,0 +1,10 @@
+#!/usr/bin/python
+import csv
+
+# ctags -o /tmp/atag.csv --fields=+afiKkmnsSzt libs/ardour/ardour/export_format_specification.h
+
+f = open('/tmp/atag.csv', 'rb')
+reader = csv.reader(f, delimiter='\t')
+for row in reader:
+ if len(row) > 7:
+ print row[7]
diff --git a/tools/define_versions.sh b/tools/define_versions.sh
index a0642ce..37eca61 100644
--- a/tools/define_versions.sh
+++ b/tools/define_versions.sh
@@ -8,7 +8,7 @@ else
EXTENDED_RE=-r
fi
-GIT_REV_REGEXP='([0-9][0-9]*)\.([0-9][0-9]*)\-?(rc[0-9]*)?-?([0-9][0-9]*)?(-g([a-f0-9]+))?'
+GIT_REV_REGEXP='([0-9][0-9]*)\.([0-9][0-9]*)\-?([pr][rc]e?[0-9]*)?-?([0-9][0-9]*)?(-g([a-f0-9]+))?'
major_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\1/"`
minor_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\2/"`
@@ -20,6 +20,9 @@ micro_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE
#
# RC e.g. 8.1-rc3 (optional)
+# OR
+# PRE e.g. 9.3-pre0 (optional)
+#
# Tracks does not use -rcN based tagging
#
rc=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\3/"`
diff --git a/tools/doxy2json/Makefile b/tools/doxy2json/Makefile
new file mode 100644
index 0000000..885b756
--- /dev/null
+++ b/tools/doxy2json/Makefile
@@ -0,0 +1,18 @@
+TARGET=doxy2json
+
+CXX=clang++
+CXXFLAGS=`llvm-config --cxxflags --ldflags` -lclang -std=c++11 -O2 -Wall -Wextra -pthread
+LOADLIBES=-lclang
+
+ifeq ($(shell uname -s), Darwin)
+CXXFLAGS+=-stdlib=libstdc++
+endif
+
+all: $(TARGET)
+
+$(TARGET): $(TARGET).cc
+
+clean:
+ @rm -f $(TARGET)
+
+.PHONY: test
diff --git a/tools/doxy2json/ardourdoc.sh b/tools/doxy2json/ardourdoc.sh
new file mode 100755
index 0000000..b9e7db8
--- /dev/null
+++ b/tools/doxy2json/ardourdoc.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+cd `dirname $0`
+set -e
+make
+cd ../..
+test -f libs/ardour/ardour/ardour.h
+LLVMINCLUDE="-I /usr/lib/llvm-3.6/include -I /usr/lib/llvm-3.6/lib/clang/3.6.2/include/"
+
+TMPFILE=`mktemp`
+trap 'rm -f $TMPFILE' exit SIGINT SIGTERM
+
+echo "# analyzing source.. -> $TMPFILE"
+time ./tools/doxy2json/doxy2json -j 4 \
+ $LLVMINCLUDE \
+ -D PACKAGE=\"doc\" \
+ -D PROGRAM_NAME=\"Ardour\" -D PROGRAM_VERSION=\"4\" -D LOCALEDIR=\"/\" \
+ -D ARCH_X86 -D CONFIG_ARCH=\"x86_64\" -D WAF_BUILD \
+ -D HAVE_AUBIO=1 -D HAVE_ALSA=1 -D HAVE_GLIB=1 -D HAVE_LIBS_LUA=1 -D HAVE_XML=1 -D PTFORMAT=1 \
+ -D HAVE_SAMPLERATE=1 -D HAVE_LV2=1 -D HAVE_LV2_1_2_0=1 -D HAVE_LV2_1_10_0=1 -D HAVE_SERD=1 -D HAVE_SORD=1 -D HAVE_SRATOM=1 -D HAVE_LILV=1 -D HAVE_LV2_1_0_0=1 \
+ -D HAVE_LILV_0_16_0=1 -D HAVE_LILV_0_19_2=1 -D HAVE_LILV_0_21_3=1 -D HAVE_SUIL=1 -D LV2_SUPPORT=1 -D LV2_EXTENDED=1 -D HAVE_GTK=1 -D HAVE_LIBS_GTKMM2EXT=1 \
+ -D HAVE_X11=1 -D LXVST_64BIT=1 -D LXVST_SUPPORT=1 -D HAVE_TAGLIB=1 -D HAVE_POSIX_MEMALIGN=1 -D HAVE_VAMPSDK=1 -D HAVE_VAMPHOSTSDK=1 -D HAVE_RUBBERBAND=1 -D ENABLE_NLS=1 \
+ -D HAVE_CURL=1 -D HAVE_LO=1 -D HAVE_LRDF=1 \
+ -I libs/ardour -I libs/pbd -I libs/lua -I gtk2_ardour -I libs/timecode -I libs/audiographer -I libs/ptformat -I libs/fst \
+ -I libs/ltc -I libs/evoral -I libs/canvas -I libs/gtkmm2ext -I libs/midi++2 -I libs/surfaces/control_protocol -I libs \
+ -I build/libs/pbd -I build/libs/ardour -I build/gtk2_ardour \
+ `pkg-config --cflags glib-2.0 glibmm-2.4 cairomm-1.0 gtkmm-2.4 libxml-2.0 lilv-0 suil-0 | sed 's/-std=c++11 //;s/-pthread //'` \
+ -X "_" -X "::" -X "sigc" -X "Atk::" -X "Gdk::" -X "Gtk::" -X "Gio::" \
+ -X "Glib::" -X "Pango::" -X "luabridge::" \
+ \
+ libs/ardour/*.cc libs/pbd/*.cc \
+ gtk2_ardour/*.cc \
+ /usr/include/cairomm-1.0/cairomm/context.h \
+> $TMPFILE
+
+ls -lh $TMPFILE
+
+echo "# consolidating JSON"
+php << EOF
+<?php
+\$json = file_get_contents ('$TMPFILE');
+\$api = array ();
+foreach (json_decode (\$json, true) as \$a) {
+ if (!isset (\$a['decl'])) { continue; }
+
+ \$a['decl'] = str_replace ('size_t', 'unsigned long', \$a['decl']);
+ \$a['decl'] = str_replace ('uint32_t', 'unsigned int', \$a['decl']);
+ \$a['decl'] = str_replace ('int32_t', 'int', \$a['decl']);
+ \$a['decl'] = str_replace ('framepos_t', 'long', \$a['decl']);
+ \$a['decl'] = str_replace ('framecnt_t', 'long', \$a['decl']);
+ \$a['decl'] = str_replace ('frameoffset_t', 'long', \$a['decl']);
+ \$a['decl'] = str_replace ('int64_t', 'long', \$a['decl']);
+ \$a['decl'] = str_replace ('uint8_t', 'unsigned char', \$a['decl']);
+ \$a['decl'] = str_replace ('pframes_t', 'unsigned int', \$a['decl']);
+ \$a['decl'] = str_replace ('uint64_t', 'unsigned long', \$a['decl']);
+ \$a['decl'] = str_replace ('const char', 'char', \$a['decl']);
+ \$a['decl'] = str_replace ('const float', 'float', \$a['decl']);
+ \$a['decl'] = str_replace ('const double', 'double', \$a['decl']);
+ \$a['decl'] = str_replace ('const long', 'long', \$a['decl']);
+ \$a['decl'] = str_replace ('const unsigned int', 'unsigned int', \$a['decl']);
+ \$a['decl'] = str_replace ('const unsigned long', 'unsigned long', \$a['decl']);
+ \$canon = str_replace (' *', '*', \$a['decl']);
+ \$api[\$canon] = \$a;
+}
+\$jout = array ();
+foreach (\$api as \$k => \$a) {
+ \$jout[] = \$a;
+}
+file_put_contents('doc/ardourapi.json.gz', gzencode (json_encode (\$jout, JSON_PRETTY_PRINT)));
+EOF
+
+ls -l doc/ardourapi.json.gz
diff --git a/tools/doxy2json/doxy2json.cc b/tools/doxy2json/doxy2json.cc
new file mode 100644
index 0000000..accfdc2
--- /dev/null
+++ b/tools/doxy2json/doxy2json.cc
@@ -0,0 +1,368 @@
+/* extract doxygen comments from C++ header files
+ *
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <pthread.h>
+#include <cstdio>
+#include <cstring>
+#include <sstream>
+#include <iomanip>
+#include <algorithm>
+#include <map>
+#include <vector>
+#include <clang-c/Index.h>
+#include <clang-c/Documentation.h>
+
+struct Dox2jsConfig {
+ Dox2jsConfig () : clang_argc (3), clang_argv (0), excl_argc (0), excl_argv (0)
+ {
+ excl_argv = (char**) calloc (1, sizeof (char*));
+ clang_argv = (char**) malloc (clang_argc * sizeof (char*));
+ clang_argv[0] = strdup ("-x");
+ clang_argv[1] = strdup ("c++");
+ clang_argv[2] = strdup ("-std=c++11");
+ }
+
+ ~Dox2jsConfig () {
+ for (int i = 0; i < clang_argc; ++i) {
+ free (clang_argv[i]);
+ }
+ for (int i = 0; excl_argv[i]; ++i) {
+ free (excl_argv[i]);
+ }
+ free (clang_argv);
+ free (excl_argv);
+ }
+
+ void add_clang_arg (const char *a) {
+ clang_argv = (char**) realloc (clang_argv, (clang_argc + 1) * sizeof (char*));
+ clang_argv[clang_argc++] = strdup (a);
+ }
+
+ void add_exclude (const char *a) {
+ excl_argv = (char**) realloc (excl_argv, (excl_argc + 2) * sizeof (char*));
+ excl_argv[excl_argc++] = strdup (a);
+ excl_argv[excl_argc] = NULL;
+ }
+
+ int clang_argc;
+ char** clang_argv;
+ int excl_argc;
+ char** excl_argv;
+};
+
+typedef std::map <std::string, std::string> ResultMap;
+
+struct dox2js {
+ Dox2jsConfig *cfg;
+ ResultMap results;
+};
+
+struct ProcessQueue {
+ ProcessQueue (std::vector<char*>* files, ResultMap* r, Dox2jsConfig* c, pthread_mutex_t* lck, bool report, bool check)
+ : fq (files)
+ , rm (r)
+ , djc (c)
+ , lock (lck)
+ , total (files->size ())
+ , done (0)
+ , report_progress (report)
+ , check_compile (check)
+ { }
+
+ std::vector<char*>* fq;
+ ResultMap *rm;
+ Dox2jsConfig *djc;
+ pthread_mutex_t* lock;
+ unsigned int total;
+ unsigned int done;
+ bool report_progress;
+ bool check_compile;
+};
+
+
+static const char*
+kind_to_txt (CXCursor cursor)
+{
+ CXCursorKind kind = clang_getCursorKind (cursor);
+ switch (kind) {
+ case CXCursor_StructDecl : return "Struct";
+ case CXCursor_EnumDecl : return "Enum";
+ case CXCursor_UnionDecl : return "Union";
+ case CXCursor_FunctionDecl : return "C Function";
+ case CXCursor_VarDecl : return "Variable";
+ case CXCursor_ClassDecl : return "C++ Class";
+ case CXCursor_CXXMethod : return "C++ Method";
+ case CXCursor_Namespace : return "C++ Namespace";
+ case CXCursor_Constructor : return "C++ Constructor";
+ case CXCursor_Destructor : return "C++ Destructor";
+ case CXCursor_FieldDecl : return "Data Member/Field";
+ default: break;
+ }
+ return "";
+}
+
+static std::string
+escape_json (const std::string &s)
+{
+ std::ostringstream o;
+ for (auto c = s.cbegin (); c != s.cend (); c++) {
+ switch (*c) {
+ case '"': o << "\\\""; break;
+ case '\\': o << "\\\\"; break;
+ case '\n': o << "\\n"; break;
+ case '\r': o << "\\r"; break;
+ case '\t': o << "\\t"; break;
+ default:
+ if ('\x00' <= *c && *c <= '\x1f') {
+ o << "\\u" << std::hex << std::setw (4) << std::setfill ('0') << (int)*c;
+ } else {
+ o << *c;
+ }
+ }
+ }
+ return o.str ();
+}
+
+static std::string
+recurse_parents (CXCursor cr) {
+ std::string rv;
+ CXCursor pc = clang_getCursorSemanticParent (cr);
+ if (CXCursor_TranslationUnit == clang_getCursorKind (pc)) {
+ return rv;
+ }
+ if (!clang_Cursor_isNull (pc)) {
+ rv += recurse_parents (pc);
+ rv += clang_getCString (clang_getCursorDisplayName (pc));
+ rv += "::";
+ }
+ return rv;
+}
+
+static bool
+check_excludes (const std::string& decl, CXClientData d) {
+ struct Dox2jsConfig* djc = (struct Dox2jsConfig*) d;
+ char** excl = djc->excl_argv;
+ for (int i = 0; excl[i]; ++i) {
+ if (decl.compare (0, strlen (excl[i]), excl[i]) == 0) {
+ return true;
+ }
+ }
+ return false;
+}
+
+static enum CXChildVisitResult
+traverse (CXCursor cr, CXCursor /*parent*/, CXClientData d)
+{
+ struct dox2js* dj = (struct dox2js*) d;
+ CXComment c = clang_Cursor_getParsedComment (cr);
+
+ if (clang_Comment_getKind (c) != CXComment_Null
+ && clang_isDeclaration (clang_getCursorKind (cr))
+ && 0 != strlen (kind_to_txt (cr))
+ ) {
+
+ // TODO: resolve typedef enum { .. } name;
+ // use clang_getCursorDefinition (clang_getCanonicalCursor (cr)) ??
+ std::string decl = recurse_parents (cr);
+ decl += clang_getCString (clang_getCursorDisplayName (cr));
+
+ if (decl.empty () || check_excludes (decl, dj->cfg)) {
+ return CXChildVisit_Recurse;
+ }
+
+ std::ostringstream o;
+ o << "{ \"decl\" : \"" << decl << "\",\n";
+
+ if (clang_Cursor_isVariadic (cr)) {
+ o << " \"variadic\" : true,\n";
+ }
+
+ CXSourceLocation loc = clang_getCursorLocation (cr);
+ CXFile file; unsigned line, col, off;
+ clang_getFileLocation (loc, &file, &line, &col, &off);
+
+ o << " \"kind\" : \"" << kind_to_txt (cr) << "\",\n"
+ << " \"src\" : \"" << clang_getCString (clang_getFileName (file)) << ":" << line << "\",\n"
+ << " \"doc\" : \"" << escape_json (clang_getCString (clang_FullComment_getAsHTML (c))) << "\"\n"
+ << "},\n";
+
+ dj->results[decl] = o.str ();
+ }
+ return CXChildVisit_Recurse;
+}
+
+static ResultMap
+process_file (const char* fn, struct Dox2jsConfig *djc, bool check)
+{
+ dox2js dj;
+ dj.cfg = djc;
+
+ if (check) {
+ fprintf (stderr, "--- %s ---\n", fn);
+ }
+ CXIndex index = clang_createIndex (0, check ? 1 : 0);
+ CXTranslationUnit tu = clang_createTranslationUnitFromSourceFile (index, fn, djc->clang_argc, djc->clang_argv, 0, 0);
+
+ if (tu == NULL) {
+ fprintf (stderr, "Cannot create translation unit for src: %s\n", fn);
+ return ResultMap ();
+ }
+
+ clang_visitChildren (clang_getTranslationUnitCursor (tu), traverse, (CXClientData) &dj);
+
+ clang_disposeTranslationUnit (tu);
+ clang_disposeIndex (index);
+ return dj.results;
+}
+
+static void*
+process_thread (void *d)
+{
+ struct ProcessQueue* proc = (struct ProcessQueue*) d;
+ pthread_mutex_lock (proc->lock);
+
+ while (1) {
+ if (proc->fq->empty ()) {
+ break;
+ }
+ char* fn = strdup (proc->fq->back ());
+ proc->fq->pop_back ();
+ pthread_mutex_unlock (proc->lock);
+
+ ResultMap rm = process_file (fn, proc->djc, proc->check_compile);
+ free (fn);
+
+ pthread_mutex_lock (proc->lock);
+ for (ResultMap::const_iterator i = rm.begin (); i != rm.end (); ++i) {
+ (*proc->rm)[i->first] = i->second;
+ }
+ ++proc->done;
+
+ if (proc->report_progress) {
+ fprintf (stderr, "progress: %4.1f%% [%4d / %4d] decl: %ld \r",
+ 100.f * proc->done / (float)proc->total, proc->done, proc->total,
+ proc->rm->size ());
+ }
+ }
+ pthread_mutex_unlock (proc->lock);
+ pthread_exit (NULL);
+ return NULL;
+}
+
+
+static void
+usage (int status)
+{
+ printf ("doxy2json - extract doxygen doc from C++ headers.\n\n");
+ fprintf (stderr, "Usage: dox2json [-I path]* [-X exclude]* <filename> [filename]*\n");
+ exit (status);
+}
+
+int main (int argc, char** argv)
+{
+ struct Dox2jsConfig djc;
+
+#define MAX_THREADS 16
+ pthread_t threads[MAX_THREADS];
+
+ bool report_progress = false;
+ bool check_compile = false;
+ size_t num_threads = 1;
+ int c;
+ while (EOF != (c = getopt (argc, argv, "j:D:I:TX:"))) {
+ switch (c) {
+ case 'j':
+ num_threads = std::max (1, std::min ((int)MAX_THREADS, atoi (optarg)));
+ break;
+ case 'I':
+ djc.add_clang_arg ("-I");
+ djc.add_clang_arg (optarg);
+ break;
+ case 'D':
+ djc.add_clang_arg ("-D");
+ djc.add_clang_arg (optarg);
+ break;
+ case 'X':
+ djc.add_exclude (optarg);
+ break;
+ case 'T':
+ check_compile = true;
+ break;
+ case 'h':
+ usage (0);
+ default:
+ usage (EXIT_FAILURE);
+ break;
+ }
+ }
+
+ if (optind >= argc) {
+ usage (EXIT_FAILURE);
+ }
+
+ const int total = (argc - optind);
+ if (total > 6 && !check_compile) {
+ report_progress = true;
+ }
+
+ ResultMap results;
+ std::vector<char*> src;
+ pthread_mutex_t lock;
+ pthread_mutex_init (&lock, NULL);
+
+ for (int i = optind; i < argc; ++i) {
+ src.push_back (argv[i]);
+ }
+
+ if (check_compile) {
+ num_threads = 1;
+ } else {
+ num_threads = std::min (src.size (), num_threads);
+ }
+
+ struct ProcessQueue proc (&src, &results, &djc, &lock, report_progress, check_compile);
+
+ for (unsigned int i = 0; i < num_threads; ++i) {
+ int rc = pthread_create (&threads[i], NULL, process_thread, (void *)&proc);
+ if (rc) {
+ fprintf (stderr, "failed to create thread.\n");
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ pthread_yield();
+
+ for (unsigned int i = 0; i < num_threads; ++i) {
+ pthread_join (threads[i], NULL);
+ }
+
+ if (!check_compile) {
+ printf ("[\n");
+ for (std::map <std::string, std::string>::const_iterator i = results.begin (); i != results.end (); ++i) {
+ printf ("%s\n", (*i).second.c_str ());
+ }
+ printf ("{} ]\n");
+ }
+
+ pthread_mutex_destroy (&lock);
+
+ return 0;
+}
diff --git a/tools/fmt-bindings b/tools/fmt-bindings
index aa76afe..d2dd1ad 100755
--- a/tools/fmt-bindings
+++ b/tools/fmt-bindings
@@ -2,7 +2,9 @@
# import module
use Getopt::Long;
-
+use File::Basename;
+use File::Spec;
+
$semicolon = ";"; # help out stupid emacs
$title = "Ardour Shortcuts";
$in_group_def = 0;
@@ -12,6 +14,8 @@ $group_key;
$group_number = 0;
%group_names;
%group_text;
+%owner_bindings;
+%group_owners;
%group_bindings;
%modifier_map;
%group_numbering;
@@ -19,8 +23,8 @@ $group_number = 0;
$platform = linux;
$winkey = 'Win';
-$make_cheatsheet = 1;
-$make_accelmap = 0;
+$make_cheatsheet = 0;
+$make_accelmap = 1;
$merge_from = "";
$html = 0;
@@ -31,20 +35,12 @@ GetOptions ("platform=s" => \$platform,
"merge=s" => \$merge_from,
"html" => \$html);
-#
-# The use of a separate @WINDOW@ meta-modifier was a mistake and needs to be removed from the bindings.in file.
-# There is no separate key/modifier we can use for this, so inevitably it will be the same modifier as one of
-# the other meta-modifiers. This means, for example, that @WINDOW at -b could be same as @SECONDARY at -b with no
-# warnings given. One of the bindings will work, one won't.
-#
-
if ($platform eq "darwin") {
$gtk_modifier_map{'PRIMARY'} = 'Primary'; # GTK supports Primary to allow platform-independent binding to the "primary" modifier, which on OS X is Command
$gtk_modifier_map{'SECONDARY'} = 'Control';
$gtk_modifier_map{'TERTIARY'} = 'Shift';
$gtk_modifier_map{'LEVEL4'} = 'Mod1';
- $gtk_modifier_map{'WINDOW'} = 'Control';
# cs_modifier_map == "Cheat Sheet Modifier Map"
# Used to control what gets shown in the
@@ -54,7 +50,6 @@ if ($platform eq "darwin") {
$cs_modifier_map{'SECONDARY'} = 'Control';
$cs_modifier_map{'TERTIARY'} = 'Shift';
$cs_modifier_map{'LEVEL4'} = 'Opt';
- $cs_modifier_map{'WINDOW'} = 'Control';
# used to display what gets shown in the
# cheat sheet for mouse bindings. Differs
@@ -65,7 +60,6 @@ if ($platform eq "darwin") {
$mouse_modifier_map{'SECONDARY'} = 'Ctrl';
$mouse_modifier_map{'TERTIARY'} = 'Shift';
$mouse_modifier_map{'LEVEL4'} = 'Opt';
- $mouse_modifier_map{'WINDOW'} = 'Ctrl';
} else {
@@ -73,7 +67,6 @@ if ($platform eq "darwin") {
$gtk_modifier_map{'SECONDARY'} = 'Alt';
$gtk_modifier_map{'TERTIARY'} = 'Shift';
$gtk_modifier_map{'LEVEL4'} = $winkey; # something like "Mod4><Super"
- $gtk_modifier_map{'WINDOW'} = 'Alt';
# cs_modifier_map == "Cheat Sheet Modifier Map"
# Used to control what gets shown in the
@@ -83,7 +76,6 @@ if ($platform eq "darwin") {
$cs_modifier_map{'SECONDARY'} = 'Alt';
$cs_modifier_map{'TERTIARY'} = 'Shift';
$cs_modifier_map{'LEVEL4'} = 'Win';
- $cs_modifier_map{'WINDOW'} = 'Alt';
# used to display what gets shown in the
# cheat sheet for mouse bindings. Differs
@@ -94,7 +86,6 @@ if ($platform eq "darwin") {
$mouse_modifier_map{'SECONDARY'} = 'Alt';
$mouse_modifier_map{'TERTIARY'} = 'Shift';
$mouse_modifier_map{'LEVEL4'} = 'Win';
- $mouse_modifier_map{'WINDOW'} = 'Alt';
}
%keycodes = ();
@@ -186,10 +177,15 @@ if ($merge_from) {
}
if ($make_accelmap && !$merge_from) {
- print ";; this accelmap was produced by tools/fmt-bindings\n";
+ print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
}
-while (<>) {
+$bindings_name = basename ($ARGV[0]);
+$bindings_name =~ s/.bindings\.in$//;
+
+open SOURCE, "<", $ARGV[0] or die $!;
+
+while (<SOURCE>) {
next if /^$semicolon/;
if (/^\$/) {
@@ -214,7 +210,13 @@ while (<>) {
s/^%//;
chop;
- ($group_key,$group_name) = split (/\s+/, $_, 2);
+ ($group_key,$owner,$group_name) = split (/\s+/, $_, 3);
+ if ($make_accelmap) {
+ if (!exists ($owner_bindings{$owner})) {
+ $owner_bindings{$owner} = [ [] ];
+ }
+ $group_owners{$group_key} = $owner;
+ }
$group_number++;
$group_text = "";
$in_group_def = 1;
@@ -240,6 +242,10 @@ while (<>) {
chop;
($key,$action,$binding,$text) = split (/\|/, $_, 4);
+ $gkey = $key;
+ $gkey =~ s/^-//;
+ $owner = $group_owners{$gkey};
+
# substitute bindings
$gtk_binding = $binding;
@@ -258,18 +264,28 @@ while (<>) {
}
}
- # print the accelmap output
+ # store the accelmap output
if ($key =~ /^\+/) {
# remove + and don't print it in the accelmap
$key =~ s/^\+//;
} else {
- # include this in the accelmap
- if (!$merge_from && $make_accelmap) {
- foreach $k (keys %gtk_modifier_map) {
- $gtk_binding =~ s/\@$k\@/$gtk_modifier_map{$k}/;
- }
- print "(gtk_accel_path \"<Actions>/$action\" \"$gtk_binding\")\n";
+ # include this in the accelmap if it is part of a group that has an "owner"
+ if (!$merge_from && $make_accelmap && exists ($owner_bindings{$owner})) {
+
+ $b = $binding;
+ $b =~ s/<@//g;
+ $b =~ s/@>//g;
+ $b =~ s/PRIMARY/Primary-/;
+ $b =~ s/SECONDARY/Secondary-/;
+ $b =~ s/TERTIARY/Tertiary-/;
+ $b =~ s/LEVEL4/Level4-/;
+
+ $g = $group_names{$gkey};
+ $g =~ s/\\&/&/g;
+
+ $bref = $owner_bindings{$owner};
+ push (@$bref, [ $action, $b, $g]);
}
}
@@ -281,12 +297,43 @@ while (<>) {
$bref = $group_bindings{$key};
push (@$bref, [$binding, $text]);
+ $sref = $section_text{$key};
+ push (@$sref, [$owner]);
+
next;
}
next;
}
+if ($make_accelmap) {
+ print "<BindingSet name=\"" . $bindings_name . "\">\n";
+
+ foreach $owner (keys %owner_bindings) {
+ print " <Bindings name=\"$owner\">\n <Press>\n";
+ $bindings = $owner_bindings{$owner};
+ shift (@$bindings); # remove initial empty element
+ for my $binding (@$bindings) {
+ print ' <Binding key="' . @$binding[1] . '" action="' . @$binding[0] . '" group="' . @$binding[2] . "\"/>\n";
+ }
+ print " </Press>\n </Bindings>\n";
+ }
+
+ # merge in the "fixed" bindings that are not defined by the argument given to this program
+ # this covers things like the step editor, monitor and processor box bindings
+
+ foreach $hardcoded_bindings ("mixer.bindings", "step_editing.bindings", "monitor.bindings", "processor_box.bindings") {
+ $path = File::Spec->catfile (dirname ($ARGV[0]), $hardcoded_bindings);
+ open HARDCODED, "<", $path or die $!;
+ while (<HARDCODED>) {
+ print $_;
+ }
+ close HARDCODED;
+ }
+
+ print "</BindingSet>\n";
+}
+
if ($make_accelmap || !$make_cheatsheet) {
exit 0;
}
diff --git a/tools/fmt-luadoc.php b/tools/fmt-luadoc.php
new file mode 100755
index 0000000..7f7b35d
--- /dev/null
+++ b/tools/fmt-luadoc.php
@@ -0,0 +1,1021 @@
+#!/usr/bin/php
+<?php
+## USAGE
+#
+## generate doc/luadoc.json.gz (lua binding doc)
+# ./waf configure --luadoc ....
+# ./waf
+# ./gtk2_ardour/arluadoc > doc/luadoc.json.gz
+#
+## generate doc/ardourapi.json.gz (ardour header doxygen doc)
+# cd ../../tools/doxy2json
+# ./ardourdoc.sh
+# cd -
+#
+## format HTML (using this scripterl)
+# php tools/fmt-luadoc.php > /tmp/luadoc.html
+#
+
+$options = getopt("m");
+if (isset ($options['m'])) {
+ $HTMLOUTPUT = false; ## set to false to output ardour-manual
+} else {
+ $HTMLOUTPUT = true; ## set to false to output ardour-manual
+}
+
+################################################################################
+################################################################################
+
+$json = gzdecode (file_get_contents (dirname (__FILE__).'/../doc/luadoc.json.gz'));
+$doc = array ();
+$ardourversion = '';
+foreach (json_decode ($json, true) as $b) {
+ if (!isset ($b['type'])) {
+ if (isset ($b['version'])) { $ardourversion = $b['version']; }
+ continue;
+ }
+ # reserved lua words
+ $b ['lua'] = preg_replace ('/:_end/', ':end', $b ['lua']);
+ $b ['lua'] = preg_replace ('/:_type/', ':type', $b ['lua']);
+ $b ['ldec'] = preg_replace ('/ const/', '', preg_replace ('/ const&/', '', $b['decl']));
+ if (isset ($b['ret'])) {
+ $b['ret'] = preg_replace ('/ const/', '', preg_replace ('/ const&/', '', $b['ret']));
+ }
+ $doc[] = $b;
+}
+
+if (count ($doc) == 0) {
+ fwrite (STDERR, "Failed to read luadoc.json\n");
+ exit (1);
+}
+
+################################################################################
+## Global result variables
+################################################################################
+
+$classlist = array ();
+$constlist = array ();
+
+
+################################################################################
+## Pre-process the data, collect functions, parse arguments, cross reference
+################################################################################
+
+
+################################################################################
+# some internal helper functions first
+
+$funclist = array ();
+$classes = array ();
+$consts = array ();
+
+function my_die ($msg) {
+ fwrite (STDERR, $msg."\n");
+ exit (1);
+}
+
+##function ptr_strip ($ctype) {
+# # boost::shared_ptr<std::list<boost::shared_ptr<ARDOUR::Route>> > >
+# # -> std::list<ARDOUR::Route>
+# $ctype = preg_replace ('/boost::shared_ptr<([^>]*)[ ]*>/', '$1', $ctype);
+# return preg_replace ('/boost::shared_ptr<([^>]*)[ ]*>/', '$1', $ctype);
+#}
+
+function arg2lua ($argtype, $flags = 0) {
+ global $classes;
+ global $consts;
+
+ # LuaBridge abstracts C++ references
+ $flags |= preg_match ('/&$/', $argtype);
+ $arg = preg_replace ('/&$/', '', $argtype);
+ $arg = preg_replace ('/ $/', '', $arg);
+
+ # filter out basic types
+ $builtin = array ('float', 'double', 'bool', 'std::string', 'int', 'long', 'unsigned long', 'unsigned int', 'unsigned char', 'char', 'void', 'char*', 'unsigned char*', 'void*');
+ if (in_array ($arg, $builtin)) {
+ return array ($arg => $flags);
+ }
+
+ # check Class declarations first
+ foreach (array_merge ($classes, $consts) as $b) {
+ if ($b['ldec'] == $arg) {
+ return array ($b['lua'] => $flags);
+ }
+ }
+
+ # strip class pointers -- TODO Check C'tor for given class
+ $arg = preg_replace ('/[&*]*$/', '', $argtype);
+ foreach (array_merge ($classes, $consts) as $b) {
+ if ($b['ldec'] == $arg) {
+ return array ($b['lua'] => $flags);
+ }
+ }
+ if ($flags & 2) {
+ return array ($argtype => ($flags | 4));
+ } else {
+ return array ('--MISSING (' . $argtype . ')--' => ($flags | 4));
+ }
+}
+
+function stripclass ($classname, $name) {
+ $classname .= ':';
+ if (strpos ($name, $classname) !== 0) {
+ my_die ('invalid class prefix: ' .$classname. ' -- '. $name);
+ }
+ return substr ($name, strlen ($classname));
+}
+
+function datatype ($decl) {
+ # TODO handle spaces in type. Works because
+ # we don't yet have templated types (with_space <here >)
+ return substr ($decl, 0, strrpos ($decl, ' '));
+}
+
+function luafn2class ($lua) {
+ return substr ($lua, 0, strrpos ($lua, ':'));
+}
+
+function luafn2name ($lua) {
+ $fn = strrpos ($lua, ':');
+ if ($fn !== 0 && strlen($lua) > $fn + 1) {
+ return substr ($lua, $fn + 1);
+ }
+ my_die ('invalid class prefix: '. $name);
+}
+
+
+function checkclass ($b) {
+ global $classlist;
+ if (!isset ($classlist[luafn2class ($b['lua'])])) {
+ my_die ('MISSING CLASS FOR '. print_r ($b['lua'], true));
+ }
+}
+
+# parse functions argument list to lua-names
+function decl2args ($decl) {
+ $start = strrpos ($decl, '(');
+ $end = strrpos ($decl, ')');
+ $args = substr ($decl, $start + 1, $end - $start - 1);
+ $arglist = preg_split ('/, */', $args);
+ $rv = array ();
+ foreach ($arglist as $a) {
+ if (empty ($a)) { continue; }
+ $rv[] = arg2lua ($a);
+ }
+ return $rv;
+}
+
+function canonical_ctor ($b) {
+ $rv = '';
+ if (preg_match('/[^(]*\(([^)*]*)\*\)(\(.*\))/', $b['decl'], $matches)) {
+ $lc = luafn2class ($b['lua']);
+ $cn = str_replace (':', '::', $lc);
+ $fn = substr ($lc, 1 + strrpos ($lc, ':'));
+ $rv = $cn . '::'. $fn . $matches[2];
+ }
+ return $rv;
+}
+
+function canonical_decl ($b) {
+ $rv = '';
+ $pfx = '';
+ # match clang's declatation format
+ if (preg_match('/[^(]*\(([^)*]*)\*\)\((.*)\)/', $b['decl'], $matches)) {
+ if (strpos ($b['type'], 'Free Function') !== false) {
+ $pfx = str_replace (':', '::', luafn2class ($b['lua'])) . '::';
+ }
+ $fn = substr ($b['lua'], 1 + strrpos ($b['lua'], ':'));
+ $rv = $matches[1] . $fn . '(';
+ $arglist = preg_split ('/, */', $matches[2]);
+ $first = true;
+ foreach ($arglist as $a) {
+ if (!$first) { $rv .= ', '; }; $first = false;
+ if (empty ($a)) { continue; }
+ $a = preg_replace ('/([^>]) >/', '$1>', $a);
+ $a = preg_replace ('/^Cairo::/', '', $a); // special case cairo enums
+ $a = preg_replace ('/([^ ])&/', '$1 &', $a);
+ $a = str_replace ('vector', 'std::vector', $a);
+ $a = str_replace ('std::string', 'string', $a);
+ $a = str_replace ('string const', 'const string', $a);
+ $a = str_replace ('string', 'std::string', $a);
+ $rv .= $a;
+ }
+ $rv .= ')';
+ }
+ return $pfx . $rv;
+}
+
+################################################################################
+# step 1: build class indices
+
+foreach ($doc as $b) {
+ if (strpos ($b['type'], "[C] ") === 0) {
+ $classes[] = $b;
+ $classlist[$b['lua']] = $b;
+ if (strpos ($b['type'], 'Pointer Class') === false) {
+ $classdecl[$b['ldec']] = $b;
+ }
+ }
+}
+
+foreach ($classes as $c) {
+ if (strpos ($c['type'], 'Pointer Class') !== false) { continue; }
+ if (isset ($c['parent'])) {
+ if (isset ($classdecl[$c['parent']])) {
+ $classlist[$c['lua']]['luaparent'][] = $classdecl[$c['parent']]['lua'];
+ } else {
+ my_die ('unknown parent class: ' . print_r ($c, true));
+ }
+ }
+}
+
+# step 2: extract constants/enum
+foreach ($doc as $b) {
+ switch ($b['type']) {
+ case "Constant/Enum":
+ case "Constant/Enum Member":
+ if (strpos ($b['ldec'], '::') === false) {
+ # for extern c enums, use the Lua Namespace
+ $b['ldec'] = str_replace (':', '::', luafn2class ($b['lua']));
+ }
+ $ns = str_replace ('::', ':', $b['ldec']);
+ $constlist[$ns][] = $b;
+ # arg2lua lookup
+ $b['lua'] = $ns;
+ $consts[] = $b;
+ break;
+ default:
+ break;
+ }
+}
+
+# step 3: process functions
+foreach ($doc as $b) {
+ switch ($b['type']) {
+ case "Constructor":
+ case "Weak/Shared Pointer Constructor":
+ checkclass ($b);
+ $classlist[luafn2class ($b['lua'])]['ctor'][] = array (
+ 'name' => luafn2class ($b['lua']),
+ 'args' => decl2args ($b['ldec']),
+ 'cand' => canonical_ctor ($b)
+ );
+ break;
+ case "Data Member":
+ checkclass ($b);
+ $classlist[luafn2class ($b['lua'])]['data'][] = array (
+ 'name' => $b['lua'],
+ 'ret' => arg2lua (datatype ($b['ldec']))
+ );
+ break;
+ case "Static C Function":
+ checkclass ($b);
+ if (strpos ($b['lua'], 'ARDOUR:DataType:') === 0) {
+ # special case ARDOUR:DataType convenience c'tor
+ $args = array ();
+ $ret = array (luafn2class ($b['lua']) => 0);
+ $canon = 'ARDOUR::LuaAPI::datatype_ctor_'.strtolower (luafn2name ($b['lua'])).'(lua_State*)';
+ } else {
+ my_die ('unhandled Static C: ' . print_r($b, true));
+ }
+ $classlist[luafn2class ($b['lua'])]['func'][] = array (
+ 'bind' => $b,
+ 'name' => $b['lua'],
+ 'args' => $args,
+ 'ret' => $ret,
+ 'ref' => false,
+ 'ext' => false,
+ 'cand' => $canon
+ );
+ break;
+ case "C Function":
+ # we required C functions to be in a class namespace
+ case "Ext C Function":
+ checkclass ($b);
+ $args = array (array ('--lua--' => 0));
+ $ret = array ('...' => 0);
+ $ns = luafn2class ($b['lua']);
+ $cls = $classlist[$ns];
+ if (preg_match ('/.*<([^>]*)[ ]*>/', $cls['ldec'], $templ)) {
+ # std::vector, std::list types
+ switch (stripclass($ns, $b['lua'])) {
+ case 'add':
+ #$args = array (array ('LuaTable {'.$templ[1].'}' => 0));
+ $args = array (arg2lua ($templ[1], 2));
+ $ret = array ('LuaTable' => 0);
+ break;
+ case 'iter':
+ $args = array ();
+ $ret = array ('LuaIter' => 0);
+ break;
+ case 'table':
+ $args = array ();
+ $ret = array ('LuaTable' => 0);
+ break;
+ default:
+ break;
+ }
+ } else if (strpos ($cls['type'], ' Array') !== false) {
+ # catches C:FloatArray, C:IntArray
+ $templ = preg_replace ('/[&*]*$/', '', $cls['ldec']);
+ switch (stripclass($ns, $b['lua'])) {
+ case 'array':
+ $args = array ();
+ $ret = array ('LuaMetaTable' => 0);
+ break;
+ case 'get_table':
+ $args = array ();
+ $ret = array ('LuaTable' => 0);
+ break;
+ case 'set_table':
+ $args = array (array ('LuaTable {'.$templ.'}' => 0));
+ $ret = array ('void' => 0);
+ break;
+ default:
+ break;
+ }
+ }
+ $classlist[luafn2class ($b['lua'])]['func'][] = array (
+ 'bind' => $b,
+ 'name' => $b['lua'],
+ 'args' => $args,
+ 'ret' => $ret,
+ 'ref' => true,
+ 'ext' => true,
+ 'cand' => canonical_decl ($b)
+ );
+ break;
+ case "Free C Function":
+ $funclist[luafn2class ($b['lua'])][] = array (
+ 'bind' => $b,
+ 'name' => $b['lua'],
+ 'args' => $args,
+ 'ret' => $ret,
+ 'ref' => false,
+ 'ext' => true,
+ 'cand' => str_replace (':', '::', $b['lua']).'(lua_State*)'
+ );
+ break;
+ case "Free Function":
+ case "Free Function RefReturn":
+ $funclist[luafn2class ($b['lua'])][] = array (
+ 'bind' => $b,
+ 'name' => $b['lua'],
+ 'args' => decl2args ($b['ldec']),
+ 'ret' => arg2lua ($b['ret']),
+ 'ref' => (strpos ($b['type'], "RefReturn") !== false),
+ 'cand' => canonical_decl ($b)
+ );
+ break;
+ case "Member Function":
+ case "Member Function RefReturn":
+ case "Member Pointer Function":
+ case "Weak/Shared Pointer Function":
+ case "Weak/Shared Pointer Function RefReturn":
+ case "Weak/Shared Null Check":
+ case "Static Member Function":
+ checkclass ($b);
+ $classlist[luafn2class ($b['lua'])]['func'][] = array (
+ 'bind' => $b,
+ 'name' => $b['lua'],
+ 'args' => decl2args ($b['ldec']),
+ 'ret' => arg2lua ($b['ret']),
+ 'ref' => (strpos ($b['type'], "RefReturn") !== false),
+ 'cand' => canonical_decl ($b)
+ );
+ break;
+ case "Cast":
+ case "Weak/Shared Pointer Cast":
+ checkclass ($b);
+ $classlist[luafn2class ($b['lua'])]['cast'][] = array (
+ 'bind' => $b,
+ 'name' => $b['lua'],
+ 'args' => decl2args ($b['ldec']),
+ 'ret' => arg2lua ($b['ret']),
+ 'ref' => (strpos ($b['type'], "RefReturn") !== false),
+ 'cand' => canonical_decl ($b)
+ );
+ break;
+ case "Constant/Enum":
+ case "Constant/Enum Member":
+ # already handled -> $consts
+ break;
+ default:
+ if (strpos ($b['type'], "[C] ") !== 0) {
+ my_die ('unhandled type: ' . $b['type']);
+ }
+ break;
+ }
+}
+
+
+# step 4: collect/group/sort
+
+# step 4a: unify weak/shared Ptr classes
+foreach ($classlist as $ns => $cl) {
+ if (strpos ($cl['type'], ' Array') !== false) {
+ $classlist[$ns]['arr'] = true;
+ $classlist[$ns]['cdecl'] = $cl['decl'];
+ continue;
+ }
+ foreach ($classes as $c) {
+ if ($c['lua'] == $ns) {
+ if (strpos ($c['type'], 'Pointer Class') !== false) {
+ $classlist[$ns]['ptr'] = true;
+ $classlist[$ns]['cdecl'] = 'boost::shared_ptr< '.$c['decl']. ' >, boost::weak_ptr< '.$c['decl']. ' >';
+ break;
+ } else {
+ $classlist[$ns]['cdecl'] = $c['decl'];
+ }
+ }
+ }
+}
+
+# step4b: sanity check
+foreach ($classlist as $ns => $cl) {
+ if (isset ($classes[$ns]['parent']) && !isset ($classlist[$ns]['luaparent'])) {
+ my_die ('missing parent class: ' . print_r ($cl, true));
+ }
+}
+
+# step 4c: merge free functions into classlist
+foreach ($funclist as $ns => $fl) {
+ if (isset ($classlist[$ns])) {
+ my_die ('Free Funcion in existing namespace: '.$ns.' '. print_r ($ns, true));
+ }
+ $classlist[$ns]['func'] = $fl;
+ $classlist[$ns]['free'] = true;
+}
+
+# step 4d: order to chaos
+# no array_multisort() here, sub-types are sorted after merging parents
+ksort ($classlist);
+
+
+################################################################################
+################################################################################
+################################################################################
+
+
+#### -- split here -- ####
+
+# from here on, only $classlist and $constlist arrays are relevant.
+# we also pull in C++ header annotation from doxygen to $api
+
+
+# read documentation from doxygen
+$json = gzdecode (file_get_contents (dirname (__FILE__).'/../doc/ardourapi.json.gz'));
+$api = array ();
+foreach (json_decode ($json, true) as $a) {
+ if (!isset ($a['decl'])) { continue; }
+ if (empty ($a['decl'])) { continue; }
+ $canon = str_replace (' *', '*', $a['decl']);
+ $api[$canon] = $a;
+}
+
+# keep track of found/missing doc
+$dox_found = 0;
+$dox_miss = 0;
+
+# retrive a value from $api
+function doxydoc ($canonical_declaration) {
+ global $api;
+ global $dox_found;
+ global $dox_miss;
+ if (isset ($api[$canonical_declaration])) {
+ $dox_found++;
+ return $api[$canonical_declaration]['doc'];
+ }
+ // remove template namespace e.g.
+ // "ARDOUR::Track::bounceable(boost::shared_ptr<ARDOUR::Processor>"
+ // "ARDOUR::Track::bounceable(boost::shared_ptr<Processor>"
+ $cn = preg_replace ('/<[^>]*::([^>]*)>/', '<$1>', $canonical_declaration);
+ if (isset ($api[$cn])) {
+ $dox_found++;
+ return $api[$cn]['doc'];
+ }
+ #fwrite (STDERR, $canonical_declaration."\n"); # XXX DEBUG
+
+ $dox_miss++;
+ return '';
+}
+
+################################################################################
+# OUTPUT
+################################################################################
+
+
+################################################################################
+# Helper functions
+define ('NL', "\n");
+
+# constructors, enums (constants) use a dot. (e.g. "LuaOSC.Address" -> "LuaOSC.Address" )
+function ctorname ($name) {
+ return htmlentities (str_replace (':', '.', $name));
+}
+
+# strip class prefix (e.g "Evoral:MidiEvent:channel" -> "channel")
+function shortname ($name) {
+ return htmlentities (substr ($name, strrpos ($name, ':') + 1));
+}
+
+# retrieve variable name from array["VARNAME"] => FLAGS
+function varname ($a) {
+ return array_keys ($a)[0];
+}
+
+# recusively collect class parents (derived classes)
+function traverse_parent ($ns, &$inherited) {
+ global $classlist;
+ $rv = '';
+ if (isset ($classlist[$ns]['luaparent'])) {
+ $parents = array_unique ($classlist[$ns]['luaparent']);
+ asort ($parents);
+ foreach ($parents as $p) {
+ if (!empty ($rv)) { $rv .= ', '; }
+ $rv .= typelink ($p);
+ $inherited[$p] = $classlist[$p];
+ traverse_parent ($p, $inherited);
+ }
+ }
+ return $rv;
+}
+
+# create a cross-reference to a type (class or enum)
+# *all* <a> links are generated here, currently anchors on a single page.
+function typelink ($a, $short = false, $argcls = '', $linkcls = '', $suffix = '') {
+ global $classlist;
+ global $constlist;
+ if (isset($classlist[$a]['free'])) {
+ return '<a class="'.$linkcls.'" href="#'.htmlentities ($a).'">'.($short ? shortname($a) : ctorname($a)).$suffix.'</a>';
+ } else if (in_array ($a, array_keys ($classlist))) {
+ return '<a class="'.$linkcls.'" href="#'.htmlentities($a).'">'.($short ? shortname($a) : htmlentities($a)).$suffix.'</a>';
+ } else if (in_array ($a, array_keys ($constlist))) {
+ return '<a class="'.$linkcls.'" href="#'.ctorname ($a).'">'.($short ? shortname($a) : ctorname($a)).$suffix.'</a>';
+ } else {
+ return '<span class="'.$argcls.'">'.htmlentities($a).$suffix.'</span>';
+ }
+}
+
+# output format function arguments
+function format_args ($args) {
+ $rv = '<span class="functionargs"> (';
+ $first = true;
+ foreach ($args as $a) {
+ if (!$first) { $rv .= ', '; }; $first = false;
+ $flags = $a[varname ($a)];
+ if ($flags & 2) {
+ $rv .= '<em>LuaTable</em> {'.typelink (varname ($a), true, 'em').'}';
+ }
+ elseif ($flags & 1) {
+ $rv .= typelink (varname ($a), true, 'em', '', '&');
+ }
+ else {
+ $rv .= typelink (varname ($a), true, 'em');
+ }
+ }
+ $rv .= ')</span>';
+ return $rv;
+}
+
+# format doxygen documentation for class-definition
+function format_doxyclass ($cl) {
+ $rv = '';
+ if (isset ($cl['decl'])) {
+ $doc = doxydoc ($cl['decl']);
+ if (!empty ($doc)) {
+ $rv.= '<div class="classdox">'.$doc.'</div>'.NL;
+ }
+ }
+ return $rv;
+}
+
+# format doxygen documentation for class-members
+function format_doxydoc ($f) {
+ $rv = '';
+ if (isset ($f['cand'])) {
+ $doc = doxydoc ($f['cand']);
+ if (!empty ($doc)) {
+ $rv.= '<tr><td></td><td class="doc" colspan="2"><div class="dox">'.$doc;
+ $rv.= '</div></td></tr>'.NL;
+ } else if (0) { # debug
+ $rv.= '<tr><td></td><td class="doc" colspan="2"><p>'.htmlentities($f['cand']).'</p>';
+ $rv.= '</td></tr>'.NL;
+ }
+ }
+ return $rv;
+}
+
+# usort() callback for class-members
+function name_sort_cb ($a, $b) {
+ return strcmp ($a['name'], $b['name']);
+}
+
+# main output function for every class
+function format_class_members ($ns, $cl, &$dups) {
+ $rv = '';
+ # print contructor - if any
+ if (isset ($cl['ctor'])) {
+ usort ($cl['ctor'], 'name_sort_cb');
+ $rv.= ' <tr><th colspan="3">Constructor</th></tr>'.NL;
+ foreach ($cl['ctor'] as $f) {
+ $rv.= ' <tr><td class="def">ℂ</td><td class="decl">';
+ $rv.= '<span class="functionname">'.ctorname ($f['name']).'</span>';
+ $rv.= format_args ($f['args']);
+ $rv.= '</td><td class="fill"></td></tr>'.NL;
+ # doxygen documentation (may be empty)
+ $rv.= format_doxydoc($f);
+ }
+ }
+
+ # strip duplicates (inherited or derived methods)
+ # e.g AudioTrack -> Track -> Route -> SessionObject -> Stateful
+ # all 5 have "isnil()"
+ $nondups = array ();
+ if (isset ($cl['func'])) {
+ foreach ($cl['func'] as $f) {
+ if (in_array (stripclass ($ns, $f['name']), $dups)) { continue; }
+ $nondups[] = $f;
+ }
+ }
+
+ # print methods - if any
+ if (count ($nondups) > 0) {
+ usort ($nondups, 'name_sort_cb');
+ $rv.= ' <tr><th colspan="3">Methods</th></tr>'.NL;
+ foreach ($nondups as $f) {
+ $dups[] = stripclass ($ns, $f['name']);
+ # return value/type
+ $rv.= ' <tr><td class="def">';
+ if ($f['ref'] && isset ($f['ext'])) {
+ # external C functions
+ $rv.= '<em>'.varname ($f['ret']).'</em>';
+ } elseif ($f['ref'] && varname ($f['ret']) == 'void') {
+ # void functions with reference args
+ $rv.= '<em>LuaTable</em>(...)';
+ } elseif ($f['ref']) {
+ # functions with reference args and return value
+ $rv.= '<em>LuaTable</em>('.typelink (varname ($f['ret']), true, 'em').', ...)';
+ } else {
+ # normal class members
+ $rv.= typelink (varname ($f['ret']), true, 'em');
+ }
+ # function declaration and arguments
+ $rv.= '</td><td class="decl">';
+ $rv.= '<span class="functionname"><abbr title="'.htmlentities($f['bind']['decl']).'">'.stripclass ($ns, $f['name']).'</abbr></span>';
+ $rv.= format_args ($f['args']);
+ $rv.= '</td><td class="fill"></td></tr>'.NL;
+ # doxygen documentation (may be empty)
+ $rv.= format_doxydoc($f);
+ }
+ }
+ # print cast - if any
+ if (isset ($cl['cast'])) {
+ usort ($cl['cast'], 'name_sort_cb');
+ $rv.= ' <tr><th colspan="3">Cast</th></tr>'.NL;
+ foreach ($cl['cast'] as $f) {
+ $rv.= ' <tr><td class="def">';
+ $rv.= typelink (varname ($f['ret']), true, 'em');
+ # function declaration and arguments
+ $rv.= '</td><td class="decl">';
+ $rv.= '<span class="functionname"><abbr title="'.htmlentities($f['bind']['decl']).'">'.stripclass ($ns, $f['name']).'</abbr></span>';
+ $rv.= format_args ($f['args']);
+ $rv.= '</td><td class="fill"></td></tr>'.NL;
+ # doxygen documentation (may be empty)
+ $rv.= format_doxydoc($f);
+ }
+ }
+
+ # print data members - if any
+ if (isset ($cl['data'])) {
+ usort ($cl['data'], 'name_sort_cb');
+ $rv.= ' <tr><th colspan="3">Data Members</th></tr>'.NL;
+ foreach ($cl['data'] as $f) {
+ $rv.= ' <tr><td class="def">'.typelink (array_keys ($f['ret'])[0], false, 'em').'</td><td class="decl">';
+ $rv.= '<span class="functionname">'.stripclass ($ns, $f['name']).'</span>';
+ $rv.= '</td><td class="fill"></td></tr>'.NL;
+ }
+ }
+ return $rv;
+}
+
+
+################################################################################
+# Start Output
+
+if ($HTMLOUTPUT) {
+
+?><!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<title>Ardour Lua Bindings</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<style type="text/css">
+div.header { text-align:center; }
+div.header h2 { margin:0; }
+div.header p { margin:.25em; text-align:center; }
+div.luafooter { text-align:center; font-size:80%; color: #888; margin: 2em 0; }
+#luaref { max-width:60em; margin: 1em auto; }
+
+#luaref h2 { margin:2em 0 0 0; padding:0em; border-bottom: 1px solid black; }
+#luaref h3.cls { margin:2em 0 0 0; padding: 0 0 0 1em; border: 1px dashed #6666ee; }
+#luaref h3.cls abbr { text-decoration:none; cursor:default; }
+#luaref h4.cls { margin:1em 0 0 0; }
+#luaref h3.class { background-color: #aaee66; }
+#luaref h3.enum { background-color: #aaaaaa; }
+#luaref h3.pointerclass { background-color: #eeaa66; }
+#luaref h3.array { background-color: #66aaee; }
+#luaref h3.opaque { background-color: #6666aa; }
+#luaref p { text-align: justify; }
+#luaref p.cdecl { text-align: right; float:right; font-size:90%; margin:0; padding: 0 0 0 1em; }
+#luaref ul.classindex { columns: 2; -webkit-columns: 2; -moz-columns: 2; }
+#luaref div.clear { clear:both; }
+#luaref p.classinfo { margin: .25em 0; }
+#luaref div.code { width:80%; margin:.5em auto; }
+#luaref div.code div { width:45%; }
+#luaref div.code pre { line-height: 1.2em; margin: .25em 0; }
+#luaref div.code samp { color: green; font-weight: bold; background-color: #eee; }
+#luaref div.classdox { padding: .1em 1em; }
+#luaref div.classdox p { margin: .5em 0 .5em .6em; }
+#luaref div.classdox p { margin: .5em 0 .5em .6em; }
+#luaref div.classdox { padding: .1em 1em; }
+#luaref div.classdox p { margin: .5em 0 .5em .6em; }
+#luaref table.classmembers { width: 100%; }
+#luaref table.classmembers th { text-align:left; border-bottom:1px solid black; padding-top:1em; }
+#luaref table.classmembers td.def { text-align:right; padding-right:.5em; white-space: nowrap; }
+#luaref table.classmembers td.decl { text-align:left; padding-left:.5em; white-space: nowrap; }
+#luaref table.classmembers td.doc { text-align:left; padding-left:.6em; line-height: 1.2em; font-size:80%; }
+#luaref table.classmembers td.doc div.dox {background-color:#eee; padding: .1em 1em; }
+#luaref table.classmembers td.doc p { margin: .5em 0; }
+#luaref table.classmembers td.doc p.para-brief { font-size:120%; }
+#luaref table.classmembers td.doc p.para-returns { font-size:120%; }
+#luaref table.classmembers td.doc dl { font-size:120%; line-height: 1.3em; }
+#luaref table.classmembers td.doc dt { font-style: italic; }
+#luaref table.classmembers td.fill { width: 99%; }
+#luaref table.classmembers span.em { font-style: italic; }
+#luaref span.functionname abbr { text-decoration:none; cursor:default; }
+</style>
+</head>
+<body>
+<div class="header">
+<h2>Ardour Lua Bindings</h2>
+<p>
+<a href="#h_classes">Class Documentation</a>
+ |
+<a href="#h_enum">Enum/Constants</a>
+ |
+<a href="#h_index">Index</a>
+</p>
+</div>
+
+<!-- #### SNIP #### !-->
+
+<?php
+
+} else {
+
+?>
+---
+layout: default
+style: luadoc
+title: Class Reference
+---
+
+<p class="warning">
+This documentation is far from complete may be inaccurate and subject to change.
+</p>
+
+<?php
+}
+?>
+
+<div id="luaref">
+
+<?php
+
+################################################################################
+# some general documentation -- should really go elsehere
+
+?>
+
+<h2 id="h_intro">Overview</h2>
+<p>
+The top-level entry point are <?=typelink('ARDOUR:Session')?> and <?=typelink('ArdourUI:Editor')?>.
+Most other Classes are used indirectly starting with a Session function. e.g. Session:get_routes().
+</p>
+<p>
+A few classes are dedicated to certain script types, e.g. Lua DSP processors have exclusive access to
+<?=typelink('ARDOUR:DSP')?> and <?=typelink('ARDOUR:ChanMapping')?>. Action Hooks Scripts to
+<?=typelink('LuaSignal:Set')?> etc.
+</p>
+<p>
+Detailed documentation (parameter names, method description) is not yet available. Please stay tuned.
+</p>
+<h3>Short introduction to Ardour classes</h3>
+<p>
+Ardour's structure is object oriented. The main object is the Session. A Session contains Audio Tracks, Midi Tracks and Busses.
+Audio and Midi tracks are derived from a more general "Track" Object, which in turn is derived from a "Route" (aka Bus).
+(We say "An Audio Track <em>is-a</em> Track <em>is-a</em> Route").
+Tracks contain specifics. For Example a track <em>has-a</em> diskstream (for file i/o).
+</p>
+<p>
+Operations are performed on objects. One gets a reference to an object and then calls a method.
+e.g <code>obj = Session:route_by_name("Audio") obj:set_name("Guitar")</code>.
+</p>
+<p>
+Lua automatically follows C++ class inheritance. e.g one can directly call all SessionObject and Route methods on Track object. However lua does not automatically promote objects. A Route object which just happens to be a Track needs to be explicily cast to a Track. Methods for casts are provided with each class. Note that the cast may fail and return a <em>nil</em> reference.
+</p>
+<p>
+Likewise multiple inheritance is a <a href="http://www.lua.org/pil/16.3.html">non-trivial issue</a> in lua. To avoid performance penalties involved with lookups, explicit casts are required in this case. One example is <?=typelink('ARDOUR:SessionObject')?> which is-a StatefulDestructible which inhertis from both Stateful and Destructible.
+</p>
+<p>
+Object lifetimes are managed by the Session. Most Objects cannot be directly created, but one asks the Session to create or destroy them. This is mainly due to realtime constrains:
+you cannot simply remove a track that is currently processing audio. There are various <em>factory</em> methods for object creation or removal.
+</p>
+<h3>Pass by Reference</h3>
+<p>
+Since lua functions are closures, C++ methods that pass arguments by reference cannot be used as-is.
+All parameters passed to a C++ method which uses references are returned as Lua Table.
+If the C++ method also returns a value it is prefixed. Two parameters are returned: the value and a Lua Table holding the parameters.
+</p>
+
+<div class="code">
+ <div style="float:left;">C++
+
+<pre><code class="cxx">void set_ref (int& var, long& val)
+{
+ printf ("%d %ld\n", var, val);
+ var = 5;
+ val = 7;
+}
+</code></pre>
+
+ </div>
+ <div style="float:right;">Lua
+
+<pre><code class="lua">local var = 0;
+ref = set_ref (var, 2);
+-- output from C++ printf()
+</code><samp class="lua">0 2</samp><code>
+-- var is still 0 here
+print (ref[1], ref[2])
+</code><samp class="lua">5 7</samp></pre>
+
+ </div>
+</div>
+<div class="clear"></div>
+<div class="code">
+ <div style="float:left;">
+
+<pre><code class="cxx">int set_ref2 (int &var, std::string unused)
+{
+ var = 5;
+ return 3;
+}
+</code></pre>
+
+ </div>
+ <div style="float:right;">
+<pre><code class="lua">rv, ref = set_ref2 (0, "hello");
+print (rv, ref[1], ref[2])
+</code><samp class="lua">3 5 hello</samp></pre>
+ </div>
+</div>
+<div class="clear"></div>
+
+<h3>Pointer Classes</h3>
+<p>
+Libardour makes extensive use of reference counted <code>boost::shared_ptr</code> to manage lifetimes.
+The Lua bindings provide a complete abstration of this. There are no pointers in lua.
+For example a <?=typelink('ARDOUR:Route')?> is a pointer in C++, but lua functions operate on it like it was a class instance.
+</p>
+<p>
+<code>shared_ptr</code> are reference counted. Once assigned to a lua variable, the C++ object will be kept and remains valid.
+It is good practice to assign references to lua <code>local</code> variables or reset the variable to <code>nil</code> to drop the ref.
+</p>
+<p>
+All pointer classes have a <code>isnil ()</code> method. This is for two cases:
+Construction may fail. e.g. <code><?=typelink('ARDOUR:LuaAPI')?>.newplugin()</code>
+may not be able to find the given plugin and hence cannot create an object.
+</p>
+<p>
+The second case if for <code>boost::weak_ptr</code>. As opposed to <code>boost::shared_ptr</code> weak-pointers are not reference counted.
+The object may vanish at any time.
+If lua code calls a method on a nil object, the interpreter will raise an exception and the script will not continue.
+This is not unlike <code>a = nil a:test()</code> which results in en error "<em>attempt to index a nil value</em>".
+</p>
+<p>
+From the lua side of things there is no distinction between weak and shared pointers. They behave identically.
+Below they're inidicated in orange and have an arrow to indicate the pointer type.
+Pointer Classes cannot be created in lua scripts. It always requires a call to C++ to create the Object and obtain a reference to it.
+</p>
+
+
+<?php
+
+#################################
+# Main output function -- Classes
+
+echo '<h2 id="h_classes">Class Documentation</h2>'.NL;
+foreach ($classlist as $ns => $cl) {
+ $dups = array ();
+ $tbl = format_class_members ($ns, $cl, $dups);
+
+ # format class title - depending on type
+ if (empty ($tbl)) {
+ # classes with no members (no ctor, no methods, no data)
+ echo '<h3 id="'.htmlentities ($ns).'" class="cls opaque"><abbr title="Opaque Object">∅</abbr> '.htmlentities ($ns).'</h3>'.NL;
+ }
+ else if (isset ($classlist[$ns]['free'])) {
+ # free functions (no class)
+ echo '<h3 id="'.htmlentities ($ns).'" class="cls freeclass"><abbr title="Namespace">ℕ</abbr> '.ctorname($ns).'</h3>'.NL;
+ }
+ else if (isset ($classlist[$ns]['arr'])) {
+ # C Arrays
+ echo '<h3 id="'.htmlentities ($ns).'" class="cls array"><abbr title="C Array">⋯</abbr> '.htmlentities ($ns).'</h3>'.NL;
+ }
+ else if (isset ($classlist[$ns]['ptr'])) {
+ # Pointer Classes
+ echo '<h3 id="'.htmlentities ($ns).'" class="cls pointerclass"><abbr title="Pointer Class">↠</abbr> '. htmlentities ($ns).'</h3>'.NL;
+ }
+ else {
+ # Normal Class
+ echo '<h3 id="'.htmlentities ($ns).'" class="cls class"><abbr title="Class">∁</abbr> '.htmlentities ($ns).'</h3>'.NL;
+ }
+
+ # show original C++ declaration
+ if (isset ($cl['cdecl'])) {
+ echo '<p class="cdecl"><em>C‡</em>: '.htmlentities ($cl['cdecl']).'</p>'.NL;
+ }
+
+ # print class inheritance (direct parent *name* only)
+ $inherited = array ();
+ $isa = traverse_parent ($ns, $inherited);
+ if (!empty ($isa)) {
+ echo ' <p class="classinfo">is-a: '.$isa.'</p>'.NL;
+ }
+ echo '<div class="clear"></div>'.NL;
+
+
+ # class documentation (if any)
+ echo format_doxyclass ($cl);
+
+ # member documentation
+ if (empty ($tbl)) {
+ echo '<p class="classinfo">This class object is only used indirectly as return-value and function-parameter. It provides no methods by itself.</p>'.NL;
+ } else {
+ echo '<table class="classmembers">'.NL;
+ echo $tbl;
+ echo ' </table>'.NL;
+ }
+
+ # traverse parent classes (all inherited members)
+ foreach ($inherited as $pns => $pcl) {
+ $tbl = format_class_members ($pns, $pcl, $dups);
+ if (!empty ($tbl)) {
+ echo '<h4 class="cls">Inherited from '.$pns.'</h4>'.NL;
+ echo '<table class="classmembers">'.NL;
+ echo $tbl;
+ echo '</table>'.NL;
+ }
+ }
+}
+
+####################
+# Enum and Constants
+
+echo '<h2 id="h_enum">Enum/Constants</h2>'.NL;
+foreach ($constlist as $ns => $cs) {
+ echo '<h3 id="'.ctorname ($ns).'" class="cls enum"><abbr title="Enum">∈</abbr> '.ctorname ($ns).'</h3>'.NL;
+ echo '<ul class="enum">'.NL;
+ foreach ($cs as $c) {
+ echo '<li class="const">'.ctorname ($c['lua']).'</li>'.NL;
+ }
+ echo '</ul>'.NL;
+}
+
+######################
+# Index of all classes
+
+echo '<h2 id="h_index" >Class Index</h2>'.NL;
+echo '<ul class="classindex">'.NL;
+foreach ($classlist as $ns => $cl) {
+ echo '<li>'.typelink($ns).'</li>'.NL;
+}
+echo '</ul>'.NL;
+
+
+# see how far there is still to go...
+fwrite (STDERR, "Found $dox_found annotations. missing: $dox_miss\n");
+echo '<!-- '.$dox_found.' / '.$dox_miss.' !-->'.NL;
+
+?>
+</div>
+<div class="luafooter">Ardour <?=$ardourversion?> - <?=date('r')?></div>
+<?php
+
+if ($HTMLOUTPUT) {
+ echo '<!-- #### SNIP #### !-->'.NL;
+ echo '</body>'.NL;
+ echo '</html>'.NL;
+}
diff --git a/tools/gccabicheck/Makefile b/tools/gccabicheck/Makefile
index 2949e46..e891d85 100644
--- a/tools/gccabicheck/Makefile
+++ b/tools/gccabicheck/Makefile
@@ -1,7 +1,7 @@
CFLAGS = -Wall
LOADLIBES = -ldl
-gcc-glibmm-abi-check:
+gcc-glibmm-abi-check: abicheck.c
$(CC) $(CPPFLAGS) $(CFLAGS) \
-o gcc-glibmm-abi-check \
abicheck.c \
diff --git a/tools/gccabicheck/wscript b/tools/gccabicheck/wscript
index ecef5c6..afdb99f 100644
--- a/tools/gccabicheck/wscript
+++ b/tools/gccabicheck/wscript
@@ -2,6 +2,8 @@
from waflib.extras import autowaf as autowaf
from waflib import Options
import os
+import re
+import sys
# Mandatory variables
top = '.'
@@ -19,5 +21,6 @@ def build(bld):
obj.source = [ 'abicheck.c' ]
obj.target = 'gcc-glibmm-abi-check'
obj.name = 'gcc-glibmm-abi-check'
- obj.lib = 'dl'
+ if re.search ("freebsd", sys.platform) == None:
+ obj.lib = 'dl'
obj.install_path = None
diff --git a/tools/jacktest.c b/tools/jacktest.c
index 62a6a08..d75dad5 100644
--- a/tools/jacktest.c
+++ b/tools/jacktest.c
@@ -10,7 +10,7 @@ jack_port_t *input_port;
jack_port_t *output_port;
jack_client_t *client;
int loopsize = 25000;
-int xrun_occured = 0;
+int xrun_occurred = 0;
int consecutive_xruns = 0;
float first_xrun = 0.0f;
float last_load = 0.0f;
@@ -59,14 +59,14 @@ process (jack_nframes_t nframes, void *arg)
printf ("loopsize = %d\n", loopsize);
}
- if (xrun_occured) {
+ if (xrun_occurred) {
if (consecutive_xruns == 0) {
first_xrun = last_load;
}
consecutive_xruns++;
}
- xrun_occured = 0;
+ xrun_occurred = 0;
if (consecutive_xruns >= 10) {
fprintf (stderr, "Stopping with load = %f (first xrun at %f)\n", last_load, first_xrun);
@@ -90,8 +90,8 @@ jack_shutdown (void *arg)
int
jack_xrun (void *arg)
{
- fprintf (stderr, "xrun occured with loop size = %d\n", loopsize);
- xrun_occured = 1;
+ fprintf (stderr, "xrun occurred with loop size = %d\n", loopsize);
+ xrun_occurred = 1;
return 0;
}
diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build
index f25cd2f..cee48ce 100755
--- a/tools/linux_packaging/build
+++ b/tools/linux_packaging/build
@@ -36,6 +36,7 @@ GCC5ABI=false
USEWINE=false
BUILDTYPE=""
NOSTRIP="libsuil|libserd|libsord|liblilv|libsratom|liblrdf|libardour|libpbd|libevoral"
+: ${HARRISONCHANNELSTRIP=harrison_channelstrip}
if [ $# -eq 0 ] ; then
@@ -66,7 +67,20 @@ while [ $# -gt 0 ] ; do
VENDOR=Harrison ;
EXENAME=mixbus ;
shift ;;
+ --mixbus32c)
+ MIXBUS=1;
+ WITH_HARRISON_LV2=1 ;
+ WITH_X42_LV2=1 ;
+ WITH_NLS=1 ;
+ WITH_LADSPA=;
+ STRIP=all
+ APPNAME=Mixbus32C ;
+ VENDOR=Harrison ;
+ EXENAME=mixbus32c ;
+ major_version=""
+ shift ;;
--public)
+ WITH_HARRISON_LV2=1 ;
WITH_NLS=1 ;
WITH_LADSPA=;
STRIP=all ;
@@ -90,6 +104,7 @@ while [ $# -gt 0 ] ; do
--nls) WITH_NLS=1 ; shift ;;
--harvid) WITH_HARVID=1 ; shift ;;
--gcc5abi) GCC5ABI=true ; shift ;;
+ --chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
*)
#catch all for unknown arguments
@@ -172,11 +187,13 @@ Surfaces=$APPLIB/surfaces
Panners=$APPLIB/panners
Backends=$APPLIB/backends
+Themes=$Shared/themes
Templates=$Shared/templates
ExportFormats=$Shared/export
Locale=$Shared/locale
MidiMaps=$Shared/midi_maps
PatchFiles=$Shared/patchfiles
+LuaScripts=$Shared/scripts
MackieControl=$Shared/mcp
if [ x$PRINT_SYSDEPS != x ] ; then
@@ -205,10 +222,12 @@ mkdir -p $APPBIN
mkdir -p $APPLIB
mkdir -p $Etc
mkdir -p $Shared
+mkdir -p $Themes
mkdir -p $Locale
mkdir -p $Surfaces
mkdir -p $MidiMaps
mkdir -p $PatchFiles
+mkdir -p $LuaScripts
mkdir -p $MackieControl
mkdir -p $ExportFormats
mkdir -p $Panners
@@ -372,6 +391,15 @@ for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
cp "$x" $PatchFiles
done
+# Lua Scripts Files
+# got to be careful with names here
+for x in $BUILD_ROOT/../scripts/*.lua ; do
+ if test "${x:0:1}" = "_"; then
+ continue;
+ fi
+ cp "$x" $LuaScripts
+done
+
# MackieControl data
# got to be careful with names here
for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
@@ -445,7 +473,15 @@ OURLIBS=$OURLIBDIR/vamp-sdk:$OURLIBDIR/surfaces/control_protocol:$OURLIBDIR/ardo
echo $OURLIBS${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
checkedIdx=0
-deplibs=
+
+# these are dynamically loaded by NSS
+deplibs="libfreeblpriv3.so libsoftokn3.so libnsspem.so"
+cp -v $GTKSTACK_ROOT/lib/libsoftokn3.so $Libraries/
+cp -v $GTKSTACK_ROOT/lib/libfreeblpriv3.so $Libraries/
+cp -v $GTKSTACK_ROOT/lib/libnsspem.so $Libraries/
+chrpath -r foo $Libraries/libsoftokn3.so
+chrpath -r foo $Libraries/libfreeblpriv3.so
+chrpath -r foo $Libraries/libnsspem.so
while [ true ] ; do
missing=false
@@ -557,23 +593,25 @@ find $APPLIB/ -name "*.so*" -print0 | xargs -0 chmod a+rx
echo "Copying other stuff to $APPDIR ..."
# these are all generated by waf
-cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings $Etc
+cp $BUILD_ROOT/gtk2_ardour/ardour.keys $Etc
cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Etc
cp $BUILD_ROOT/gtk2_ardour/clearlooks.rc $Etc
cp $BUILD_ROOT/gtk2_ardour/default_ui_config $Etc
# Copied directly from source tree
+mkdir ${Shared}/icons
+mkdir ${Shared}/resources
cp ../../system_config $Etc/system_config
-cp ../../gtk2_ardour/dark.colors $Etc
cp ../../instant.xml $Shared/instant.xml
-cp ../../gtk2_ardour/step_editing.bindings $Etc
-cp ../../gtk2_ardour/mixer.bindings $Etc
-cp -r ../../gtk2_ardour/icons $Shared
-cp -r ../../gtk2_ardour/pixmaps $Shared
-cp -r ../../gtk2_ardour/splash.png $Shared
-cp -r ../../gtk2_ardour/small-splash.png $Shared
-cp -r ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/icons/*.png ${Shared}/icons
+cp -r ../../gtk2_ardour/icons/cursor_* ${Shared}/icons/
+cp ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/resources/${APPNAME}-* ${Shared}/resources/
+
+# Themes: only install those named for this app
+lower_case_appname=`echo $APPNAME | tr '[:upper:]' '[:lower:]'`
+cp ../../gtk2_ardour/themes/*-${lower_case_appname}.colors $Themes
#
# put sooper sekrit ingredients here and they will be copied
@@ -619,34 +657,43 @@ if test -n "$MIXBUS"; then
mkdir -p $APPLIB/ladspa/strip/
curl -s -S --fail -# \
- -z "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
- -o "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
- "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_channelstrip.${HARCH}.so"
+ -z "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${HARCH}.so" \
+ -o "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${HARCH}.so" \
+ "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/${HARRISONCHANNELSTRIP}.${HARCH}.so"
+
+ cp "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${HARCH}.so" \
+ $APPLIB/ladspa/strip/${HARRISONCHANNELSTRIP}.so
+ chmod +x $APPLIB/ladspa/strip/${HARRISONCHANNELSTRIP}.so
+
+ echo "Adding Harrison Vamp Plugins"
+
+ if test "$GCC5ABI" = "true"; then
+ VAMPARCH="${HARCH}gcc5"
+ else
+ VAMPARCH="${HARCH}"
+ fi
+ curl -s -S --fail -# \
+ -z "${CACHEDIR}/harrison_vamp.${VAMPARCH}.so" \
+ -o "${CACHEDIR}/harrison_vamp.${VAMPARCH}.so" \
+ "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_vamp.${VAMPARCH}.so"
- cp "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
- $APPLIB/ladspa/strip/harrison_channelstrip.so
- chmod +x $APPLIB/ladspa/strip/harrison_channelstrip.so
+ cp "${CACHEDIR}/harrison_vamp.${VAMPARCH}.so" \
+ $APPLIB/harrison_vamp.so
+ chmod +x $APPLIB/harrison_vamp.so
fi
if test x$WITH_X42_LV2 != x ; then
- METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/x42-meters.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/linux/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip \
- "${CACHEDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
- unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
-
- SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/setBfree.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/linux/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip \
- "${CACHEDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
- unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
-
- MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/x42-midifilter.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/linux/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip \
- "${CACHEDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
- unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
+ mkdir -p $APPLIB/LV2
+
+ echo "Adding x42 Plugins"
+ for proj in x42-meters x42-midifilter x42-midimap x42-stereoroute x42-eq setBfree; do
+ X42_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/${proj}.latest.txt)
+ rsync -a -q --partial \
+ rsync://x42-plugins.com/x42/linux/${proj}-lv2-linux-${WARCH}-${X42_VERSION}.zip \
+ "${CACHEDIR}/${proj}-lv2-linux-${WARCH}-${X42_VERSION}.zip"
+ unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/${proj}-lv2-linux-${WARCH}-${X42_VERSION}.zip"
+ done
fi
################################################################################
@@ -698,8 +745,8 @@ fi
echo "Building tarball ..."
-rm -f $APPDIR.tar.bz2
-tar -cjf $APPDIR.tar.bz2 $APPDIR
+rm -f $APPDIR.tar
+tar -cf $APPDIR.tar $APPDIR
echo "Calculating bundle size"
du -sb $APPDIR/ | awk '{print $1}' > $APPDIR.size
diff --git a/tools/linux_packaging/package b/tools/linux_packaging/package
index 3614df1..9ec7502 100755
--- a/tools/linux_packaging/package
+++ b/tools/linux_packaging/package
@@ -13,6 +13,8 @@ GCC5ABI="F"
MAKESELF=""
BUILD_ROOT=../../build
+MAKESELFOPTS="--bzip2"
+
if [ $# -eq 0 ] ; then
echo ""
echo "ERROR - Please specify build type"
@@ -36,6 +38,9 @@ while [ $# -gt 0 ] ; do
--mixbus)
APPNAME=Mixbus ;
shift ;;
+ --mixbus32c)
+ APPNAME=Mixbus32C ;
+ shift ;;
--public)
APPNAME=Ardour ;
shift ;;
@@ -48,6 +53,8 @@ while [ $# -gt 0 ] ; do
--gcc5abi) GCC5ABI="T" ; shift ;;
+ --xz) MAKESELFOPTS="--xz --complevel 9" ; shift ;;
+
*)
#catch all for unknown arguments
echo ""
@@ -72,9 +79,9 @@ if [ ! -z ${BUILDTYPE} ]; then
X86_64_BUNDLE="${X86_64_BUNDLE}-${BUILDTYPE}"
fi
-if [ ! -e ${X86_BUNDLE}.tar.bz2 ] ; then
+if [ ! -e ${X86_BUNDLE}.tar ] ; then
echo ""
- echo "Can't locate x86 bundle file ${X86_BUNDLE}.tar.bz2"
+ echo "Can't locate x86 bundle file ${X86_BUNDLE}.tar"
echo ""
elif [ ! -e ${X86_BUNDLE}.size ] ; then
echo ""
@@ -84,9 +91,9 @@ else
X86_BUNDLE_OK="T"
fi
-if [ ! -e ${X86_64_BUNDLE}.tar.bz2 ]; then
+if [ ! -e ${X86_64_BUNDLE}.tar ]; then
echo ""
- echo "Can't locate x86_64 bundle file ${X86_64_BUNDLE}.tar.bz2"
+ echo "Can't locate x86_64 bundle file ${X86_64_BUNDLE}.tar"
echo ""
elif [ ! -e ${X86_64_BUNDLE}.size ]; then
echo ""
@@ -145,7 +152,7 @@ fi
echo "Cleaning up any old package files for this build"
#Get rid of any old packages of this same name.
-rm -f ${PACKAGE}.tar.bz2
+rm -f ${PACKAGE}.tar
rm -rf ${PACKAGE}
@@ -153,12 +160,12 @@ echo "Creating new package dir..."
mkdir ${PACKAGE}
if [ "${X86_BUNDLE_OK}" = "T" ]; then
- mv ${X86_BUNDLE}.tar.bz2 ${PACKAGE}
+ mv ${X86_BUNDLE}.tar ${PACKAGE}
mv ${X86_BUNDLE}.size ${PACKAGE}/.${X86_BUNDLE}.size
fi
if [ "${X86_64_BUNDLE_OK}" = "T" ]; then
- mv ${X86_64_BUNDLE}.tar.bz2 ${PACKAGE}
+ mv ${X86_64_BUNDLE}.tar ${PACKAGE}
mv ${X86_64_BUNDLE}.size ${PACKAGE}/.${X86_64_BUNDLE}.size
fi
@@ -178,7 +185,7 @@ fi
if test -n "$MAKESELF"; then
echo "Creating self-extracting installer"
- $MAKESELF --nocomp ${PACKAGE}/ ${PACKAGE}.run ${APPNAME} ./install.sh
+ $MAKESELF ${MAKESELFOPTS} ${PACKAGE}/ ${PACKAGE}.run ${APPNAME} ./install.sh
else
echo "Creating tarball..."
tar -cf ${PACKAGE}.tar ${PACKAGE}
diff --git a/tools/linux_packaging/stage2.run.in b/tools/linux_packaging/stage2.run.in
index e22162b..eb8e3d5 100755
--- a/tools/linux_packaging/stage2.run.in
+++ b/tools/linux_packaging/stage2.run.in
@@ -31,6 +31,7 @@ USER_NAME=$(logname)
#### Global Variables ####
HAS_XDG="T"
+MULTABI_BUNDLE=""
########################
# Function Definitions
@@ -229,6 +230,20 @@ case `uname -m` in
;;
esac
+###################
+# Determine gcc ABI
+###################
+
+if test -n "$MULTABI_BUNDLE"; then
+ if ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --fail --gcc4 > /dev/null"; then
+ ABI=-gcc4
+ else
+ ABI=-gcc5
+ fi
+else
+ ABI=
+fi
+
####################
# Check disk space
####################
@@ -237,15 +252,15 @@ esac
# in case they are on different devices
echo "Checking for required disk space"
-if [ ! -e .${PGM_NAME}_${ARCH}-*.size ]; then
+if [ ! -e .${PGM_NAME}_${ARCH}${ABI}-*.size ]; then
echo ""
- echo "!!! ERROR !!! Can't locate .size file for ${ARCH} bundle."
- echo "This package is broken or does not support ${ARCH}."
+ echo "!!! ERROR !!! Can't locate .size file for ${ARCH}${ABI} bundle."
+ echo "This package is broken or does not support ${ARCH}${ABI}."
echo ""
read -p "Press ENTER to exit installer:" BLAH
exit 1
else
- REQUIRED_BYTES=$(cat .${PGM_NAME}_${ARCH}-*.size)
+ REQUIRED_BYTES=$(cat .${PGM_NAME}_${ARCH}${ABI}-*.size)
#Installer needs 2x the space since the bundle is unpacked locally and then copied
REQUIRED_BYTES=$(($REQUIRED_BYTES + $REQUIRED_BYTES))
@@ -281,34 +296,36 @@ fi
# Determine C11 stdlibc++ ABI
#############################
-if %REPLACE_GCC5%; then
- # Ardour was compiled with gcc5, warn on gcc4 systems
- if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc5 > /dev/null"; then
- echo ""
- echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
- echo ""
- echo "${PGM_NAME} was compiled with gcc5, your system uses an older version of the"
- echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
- echo "may cause crashes."
- echo ""
- ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
- if test "n" = $ANSWER; then
- exit 1
+if test -z "$ABI"; then
+ if %REPLACE_GCC5%; then
+ # Ardour was compiled with gcc5, warn on gcc4 systems
+ if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc5 > /dev/null"; then
+ echo ""
+ echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
+ echo ""
+ echo "${PGM_NAME} was compiled with gcc5, your system uses an older version of the"
+ echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
+ echo "may cause crashes."
+ echo ""
+ ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
+ if test "n" = $ANSWER; then
+ exit 1
+ fi
fi
- fi
-else
- # Ardour was compiled with gcc4, warn on gcc5 systems
- if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc4 > /dev/null"; then
- echo ""
- echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
- echo ""
- echo "${PGM_NAME} was compiled with gcc4, your system uses a newer version of the"
- echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
- echo "may cause crashes."
- echo ""
- ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
- if test "n" = $ANSWER; then
- exit 1
+ else
+ # Ardour was compiled with gcc4, warn on gcc5 systems
+ if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc4 > /dev/null"; then
+ echo ""
+ echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
+ echo ""
+ echo "${PGM_NAME} was compiled with gcc4, your system uses a newer version of the"
+ echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
+ echo "may cause crashes."
+ echo ""
+ ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
+ if test "n" = $ANSWER; then
+ exit 1
+ fi
fi
fi
fi
@@ -334,19 +351,19 @@ FILESYSTEM_TYPE=$(df -P -T "${PKG_PATH}" | grep / | awk '{print $2}')
echo "Bundle is on ${FILESYSTEM_TYPE} filesystem"
# untar the correct bundle for us to install
-echo "Unpacking bundle for $ARCH"
+echo "Unpacking bundle for $ARCH${ABI}"
-if [ ! -e ${PGM_NAME}_${ARCH}-*.tar.bz2 ]; then
+if [ ! -e ${PGM_NAME}_${ARCH}${ABI}-*.tar ]; then
echo ""
- echo "!!! ERROR !!! Can't locate ${ARCH} bundle file."
+ echo "!!! ERROR !!! Can't locate ${ARCH}${ABI} bundle file."
echo ""
read -p "Press ENTER to exit installer:" BLAH
exit 1
fi
-if ! tar -xjf ${PGM_NAME}_${ARCH}-*.tar.bz2; then
+if ! tar -xf ${PGM_NAME}_${ARCH}${ABI}-*.tar; then
echo ""
- echo "!!! ERROR !!! Can't unpack ${ARCH} bundle file."
+ echo "!!! ERROR !!! Can't unpack ${ARCH}${ABI} bundle file."
echo ""
read -p "Press ENTER to exit installer:" BLAH
exit 1
@@ -410,10 +427,18 @@ if %REPLACE_WINE%; then
# if this check were quick and easy.. it should be done in the startup-script, but it's not
# so here we go... (updating wine may require re-installing ardour)
#
+ # on recent Ubuntu wine does load both:
+ # /usr/lib/i386-linux-gnu/libwine.so.1
+ # AND
+ # /usr/lib/x86_64-linux-gnu/libwine.so.1
+ # so we need to work around this (thanks).
+ # (this hack break 64bit LinuxVST builds, but we don't do those anyway)
+
LIBWINE=$(
LD_DEBUG=files wine `pwd`/${BUNDLE_DIR}/lib/ardour-vst-scanner.exe.so 2>&1 \
| grep -e "calling init:.*libwine" \
| sed 's/^.*calling init: //' \
+ | grep -v x86_64-linux-gnu \
| uniq \
)
if ! test -f "$LIBWINE"; then
@@ -492,7 +517,7 @@ else
fi
PGM_EXEC_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/${PGM_EXEC_FILE}"
-ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share/icons"
+ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share/resources"
MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
################################
@@ -500,7 +525,7 @@ MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
################################
# uninstall any older versions
-UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}*.uninstall.sh")
+UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}-*.uninstall.sh")
if [ ! -z "$UNINSTALLERS" ];
then
for i in $UNINSTALLERS; do
@@ -555,15 +580,15 @@ ${SUPER} mv /tmp/${MENU_FILE} ${MENU_FILE_PATH}/.
if [ "T" = ${HAS_XDG} ];
then
echo "Adding ${PGM_NAME} to the applications menu"
- ${SUPER} xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_16px.png ${ICON_NAME}
- ${SUPER} xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_22px.png ${ICON_NAME}
- ${SUPER} xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_32px.png ${ICON_NAME}
- ${SUPER} xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_48px.png ${ICON_NAME}
- ${SUPER} xdg-icon-resource install --context apps --size 256 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_256px.png ${ICON_NAME}
+ ${SUPER} xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME}-icon_16px.png ${ICON_NAME}
+ ${SUPER} xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME}-icon_22px.png ${ICON_NAME}
+ ${SUPER} xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME}-icon_32px.png ${ICON_NAME}
+ ${SUPER} xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME}-icon_48px.png ${ICON_NAME}
+ ${SUPER} xdg-icon-resource install --context apps --size 256 ${ICON_PATH}/${PGM_NAME}-icon_256px.png ${ICON_NAME}
- if [ -e ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ];
+ if [ -e ${ICON_PATH}/${PGM_NAME}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ];
then
- ${SUPER} cp -f ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
+ ${SUPER} cp -f ${ICON_PATH}/${PGM_NAME}_icon.svg /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
fi
${SUPER} xdg-desktop-menu install ${MENU_FILE_PATH}/${MENU_FILE}
diff --git a/tools/luadevel/ardour-lua.sh.in b/tools/luadevel/ardour-lua.sh.in
new file mode 100644
index 0000000..50d6e6e
--- /dev/null
+++ b/tools/luadevel/ardour-lua.sh.in
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+export LD_LIBRARY_PATH=@LIBDIR@${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
+export ARDOUR_DATA_PATH=@DATADIR@
+export ARDOUR_CONFIG_PATH=@CONFDIR@
+export ARDOUR_DLL_PATH=@LIBDIR@
+export VAMP_PATH=@LIBDIR@/vamp
+
+exec @LIBDIR@/luasession "$@"
diff --git a/tools/luadevel/devel.cc b/tools/luadevel/devel.cc
new file mode 100644
index 0000000..9bbe313
--- /dev/null
+++ b/tools/luadevel/devel.cc
@@ -0,0 +1,587 @@
+#include <stdint.h>
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <list>
+#include <vector>
+
+#define LIBPBD_API
+#include "../../libs/pbd/pbd/reallocpool.h"
+#include "../../libs/pbd/reallocpool.cc"
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#include "lua/luastate.h"
+#include "LuaBridge/LuaBridge.h"
+
+static void my_lua_print (std::string s) {
+ std::cout << s << "\n";
+}
+
+luabridge::LuaRef::Proxy&
+luabridge::LuaRef::Proxy::clone_instance (const void* classkey, void* p) {
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+ lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+
+ luabridge::UserdataPtr::push_raw (m_L, p, classkey);
+
+ lua_rawset (m_L, -3);
+ lua_pop (m_L, 1);
+ return *this;
+}
+
+
+
+class A {
+ public:
+ A() { printf ("CTOR %p\n", this); _int = 4; for (int i = 0; i < 256; ++i) {arr[i] = i; ar2[i] = i/256.0; ar3[i] = i;} }
+ ~A() { printf ("DTOR\n"); }
+
+ void set_int (int a) { _int = a; }
+ int get_int () const { return _int; }
+
+ int& get_ref () { return _int; }
+ int get_arg (int &a) { printf ("a = %d\n", a); a = _int; printf ("a = %d\n", a); return 1; }
+ void get_arg2 (int &a, int& b) { a = _int; b = 100; }
+ void get_args (std::string &a) { a = "hello"; }
+ void set_ref (int const &a) { _int = a; }
+
+ float * get_arr () { return arr; }
+ float * get_ar2 () { return ar2; }
+ int * get_ar3 () { return ar3; }
+
+ void set_list (std::list<std::string> sl) { _sl = sl; }
+ std::list<std::string>& get_list () { return _sl; }
+
+ uint32_t minone() { return -1; }
+ void pointer (float*f) const { printf ("PTR %p", f); }
+
+ enum EN {
+ RV1 = 1, RV2, RV3
+ };
+
+ enum EN ret_enum () { return _en;}
+ void set_enum (enum EN en) { _en = en; }
+
+ private:
+ std::list<std::string> _sl;
+ int _int;
+ enum EN _en;
+ float arr[256];
+ float ar2[256];
+ int ar3[256];
+};
+
+
+class LuaTableRef {
+ public:
+ LuaTableRef () {}
+ ~LuaTableRef () {}
+
+ int get (lua_State* L) {
+ luabridge::LuaRef rv (luabridge::newTable (L));
+ for (std::vector<LuaTableEntry>::const_iterator i = _data.begin (); i != _data.end (); ++i) {
+ switch ((*i).keytype) {
+ case LUA_TSTRING:
+ assign(&rv, i->k_s, *i);
+ break;
+ case LUA_TNUMBER:
+ assign(&rv, i->k_n, *i);
+ break;
+ }
+ }
+ luabridge::push (L, rv);
+ return 1;
+ }
+
+ int set (lua_State* L) {
+ if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+ _data.clear ();
+
+ lua_pushvalue (L, -1);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+
+ LuaTableEntry s (lua_type(L, -1), lua_type(L, -2));
+ switch (lua_type(L, -1)) {
+ case LUA_TSTRING:
+ s.k_s = luabridge::Stack<std::string>::get (L, -1);
+ break;
+ ;
+ case LUA_TNUMBER:
+ s.k_n = luabridge::Stack<unsigned int>::get (L, -1);
+ break;
+ default:
+ // invalid key
+ lua_pop (L, 2);
+ continue;
+ }
+
+ switch(lua_type(L, -2)) {
+ case LUA_TSTRING:
+ s.s = luabridge::Stack<std::string>::get (L, -2);
+ break;
+ case LUA_TBOOLEAN:
+ s.b = lua_toboolean (L, -2);
+ break;
+ case LUA_TNUMBER:
+ s.n = lua_tonumber (L, -2);
+ break;
+ case LUA_TUSERDATA:
+ {
+ bool ok = false;
+ lua_getmetatable (L, -2);
+ lua_rawgetp (L, -1, luabridge::getIdentityKey ());
+ if (lua_isboolean (L, -1)) {
+ lua_pop (L, 1);
+ const void* key = lua_topointer (L, -1);
+ lua_pop (L, 1);
+ void const* classkey = findclasskey (L, key);
+
+ if (classkey) {
+ ok = true;
+ s.c = classkey;
+ s.p = luabridge::Userdata::get_ptr (L, -2);
+ }
+ } else {
+ lua_pop (L, 2);
+ }
+
+ if (ok) {
+ break;
+ }
+ // invalid userdata -- fall through
+ }
+ // no break
+ case LUA_TFUNCTION: // no support -- we could... string.format("%q", string.dump(value, true))
+ case LUA_TTABLE: // no nested tables, sorry.
+ case LUA_TNIL: // fallthrough
+ default:
+ // invalid value
+ lua_pop (L, 2);
+ continue;
+ }
+
+ _data.push_back(s);
+ lua_pop (L, 2);
+ }
+ return 0;
+ }
+
+ static void* findclasskey (lua_State *L, const void* key)
+ {
+ lua_pushvalue(L, LUA_REGISTRYINDEX);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ if (lua_topointer(L, -2) == key) {
+ void* rv = lua_touserdata (L, -1);
+ lua_pop (L, 4);
+ return rv;
+ }
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ return NULL;
+ }
+
+ private:
+ struct LuaTableEntry {
+ LuaTableEntry (int kt, int vt)
+ : keytype (kt)
+ , valuetype (vt)
+ { }
+
+ int keytype;
+ std::string k_s;
+ unsigned int k_n;
+
+ int valuetype;
+ // LUA_TUSERDATA
+ const void* c;
+ void* p;
+ // LUA_TBOOLEAN
+ bool b;
+ // LUA_TSTRING:
+ std::string s;
+ // LUA_TNUMBER:
+ double n;
+ };
+
+ template<typename T>
+ static void assign (luabridge::LuaRef* rv, T key, const LuaTableEntry& s)
+ {
+ switch (s.valuetype) {
+ case LUA_TSTRING:
+ (*rv)[key] = s.s;
+ break;
+ case LUA_TBOOLEAN:
+ (*rv)[key] = s.b;
+ break;
+ case LUA_TNUMBER:
+ (*rv)[key] = s.n;
+ break;
+ case LUA_TUSERDATA:
+ (*rv)[key].clone_instance (s.c, s.p);
+ break;
+ default:
+ assert (0);
+ break;
+ }
+ }
+
+ std::vector<LuaTableEntry> _data;
+};
+
+
+#if 0
+static void* findclasskey (lua_State *L, const void* key)
+{
+ lua_pushvalue(L, LUA_REGISTRYINDEX);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ if (lua_topointer(L, -2) == key) {
+ void* rv = lua_touserdata (L, -1);
+ lua_pop (L, 4);
+ return rv;
+ }
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ return NULL;
+}
+
+static int tableSerialize (lua_State *L)
+{
+ if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+ luabridge::LuaRef rv (luabridge::newTable (L));
+ std::cout << "CLASS A KEY: " << luabridge::ClassInfo <A>::getClassKey () << "\n";
+ lua_rawgetp (L, LUA_REGISTRYINDEX, luabridge::ClassInfo <A>::getClassKey ());
+ std::cout << " CLASS A TABLE PTR=" << lua_topointer (L, -1) << "\n";
+ lua_pop (L, 1);
+ // for k,v in pairs (debug.getregistry ()) do print (k,v) end
+
+ lua_pushvalue (L, -1);
+ lua_pushnil (L);
+ while (lua_next (L, -2)) {
+ lua_pushvalue (L, -2);
+ unsigned int const i = luabridge::Stack<unsigned int>::get (L, -1);
+ int t = lua_type(L, -2);
+ switch(t) {
+ case LUA_TSTRING:
+ std::cout << " " << i << ": '" << lua_tostring(L, -2) << "'\n";
+ rv[i] = lua_tostring(L, -2);
+ break;
+ case LUA_TBOOLEAN:
+ std::cout << " " << i << ": " <<
+ (lua_toboolean(L, -2) ? "true" : "false") << "\n";
+ rv[i] = lua_toboolean(L, -2);
+ break;
+ case LUA_TNUMBER:
+ std::cout << " " << i << ": " << lua_tonumber(L, -2) << "\n";
+ rv[i] = lua_tonumber(L, -2);
+ break;
+ case LUA_TUSERDATA:
+ {
+ lua_getmetatable (L, -2);
+ lua_rawgetp (L, -1, luabridge::getIdentityKey ());
+ if (lua_isboolean (L, -1)) {
+ lua_pop (L, 1);
+ const void* key = lua_topointer (L, -1);
+ lua_pop (L, 1);
+ void const* classkey = findclasskey (L, key);
+
+ if (classkey) {
+ void* p = luabridge::Userdata::get_ptr (L, -2);
+ rv[i].clone_instance (classkey, p);
+ }
+ } else {
+ lua_pop (L, 2);
+ }
+ }
+ break;
+ case LUA_TNIL:
+ case LUA_TTABLE:
+ case LUA_TFUNCTION:
+ case LUA_TLIGHTUSERDATA:
+ default:
+ std::cout << " " << i << ": TYPE=" << t << ": " << lua_topointer(L, -2)<< "\n";
+ break;
+ }
+ lua_pop (L, 2);
+ }
+ lua_pop (L, 1);
+ lua_pop (L, 2);
+
+ luabridge::push (L, rv);
+ return 1;
+}
+#endif
+
+LuaTableRef globalref;
+
+int runone (LuaState& lua)
+{
+#if 0
+ LuaState lua (*new LuaState);
+#elif 0
+ PBD::ReallocPool _mempool ("Devel", 1048576);
+ LuaState lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool));
+#endif
+ lua.Print.connect (&my_lua_print);
+ lua_State* L = lua.getState();
+
+
+#if 1
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Test")
+ .beginStdList <std::string> ("StringList")
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Test")
+ .beginStdVector <std::string> ("StringVector")
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Test")
+ .beginStdMap <std::string,std::string> ("StringStringMap")
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Test")
+ .beginStdSet <std::string> ("StringSet")
+ .endClass ()
+ .endNamespace ();
+
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Test")
+ .registerArray <float> ("FloatArray")
+ .registerArray <int> ("IntArray")
+ .beginClass <A> ("A")
+ .addConstructor <void (*) ()> ()
+ .addFunction ("set_int", &A::set_int)
+ .addFunction ("get_int", &A::get_int)
+ .addRefFunction ("get_arg", &A::get_arg)
+ .addRefFunction ("get_arg2", &A::get_arg2)
+ .addRefFunction ("get_args", &A::get_args)
+ .addFunction ("set_ref", &A::set_ref)
+ .addFunction ("get_list", &A::get_list)
+ .addFunction ("set_list", &A::set_list)
+ .addFunction ("ret_enum", &A::ret_enum)
+ .addFunction ("set_enum", &A::set_enum)
+ .addFunction ("get_arr", &A::get_arr)
+ .addFunction ("get_ar2", &A::get_ar2)
+ .addFunction ("get_ar3", &A::get_ar3)
+ .endClass ()
+ .endNamespace ();
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Test")
+ .beginClass <A> ("A")
+ .addFunction ("pointer", &A::pointer)
+ .addFunction ("minone", &A::minone)
+ .addConst ("cologne", 4711)
+ .endClass ()
+ .addConst ("koln", 4711)
+ .endNamespace ();
+#endif
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("Dump")
+
+ .beginClass <LuaTableRef> ("TableRef")
+ .addCFunction ("get", &LuaTableRef::get)
+ .addCFunction ("set", &LuaTableRef::set)
+ .endClass ()
+
+ //.addCFunction ("dump", tableSerialize)
+ .endNamespace ();
+
+ luabridge::push <LuaTableRef *> (L, &globalref);
+ lua_setglobal (L, "ref");
+
+
+#if 0 // session script test
+ lua.do_command (
+ "function ArdourSession ()"
+ " local self = { scripts = {}, instances = {} }"
+ ""
+ " local foreach = function (fn)"
+ " for n, s in pairs (self.scripts) do"
+ " fn (n, s)"
+ " end"
+ " end"
+ ""
+ " local run = function ()"
+ " for n, s in pairs (self.instances) do"
+ " local status, err = pcall (s)"
+ " if not status then print ('fn \"'.. n .. '\": ', err) end"
+ " end"
+ " collectgarbage()"
+ " end"
+ ""
+ " local add = function (n, f, a)"
+ " assert(type(n) == 'string', 'function-name must be string')"
+ " assert(type(f) == 'function', 'Given script is a not a function')"
+ " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+ " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
+ " self.scripts[n] = { ['f'] = f, ['a'] = a }"
+ " local env = { print = print, Session = Session, tostring = tostring, assert = assert, ipairs = ipairs, error = error, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall }"
+ " self.instances[n] = load (string.dump(f), nil, nil, env)(a)"
+ " end"
+ ""
+ " local remove = function (n)"
+ " self.scripts[n] = nil"
+ " end"
+ ""
+ " local list = function ()"
+ " local rv = {}"
+ " foreach (function (n) rv[n] = true end)"
+ " return rv"
+ " end"
+ ""
+ " local function basic_serialize (o)"
+ " if type(o) == \"number\" then"
+ " return tostring(o)"
+ " else"
+ " return string.format(\"%q\", o)"
+ " end"
+ " end"
+ ""
+ " local function serialize (name, value)"
+ " local rv = name .. ' = '"
+ " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+ " return rv .. basic_serialize(value) .. ' '"
+ " elseif type(value) == \"table\" then"
+ " rv = rv .. '{} '"
+ " for k,v in pairs(value) do"
+ " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+ " rv = rv .. serialize(fieldname, v) .. ' '"
+ " end"
+ " return rv;"
+ " elseif type(value) == \"function\" then"
+ " return rv .. string.format(\"%q\", string.dump(value))"
+ " else"
+ " error('cannot save a ' .. type(value))"
+ " end"
+ " end"
+ ""
+ ""
+ " local save = function ()"
+ " return (serialize('scripts', self.scripts))"
+ " end"
+ ""
+ " local restore = function (state)"
+ " self.scripts = {}"
+ " load (state)()"
+ " print (scripts)"
+ " for n, s in pairs (scripts) do"
+ " add (n, load(s['f']), s['a'])"
+ " end"
+ " end"
+ ""
+ " return { run = run, add = add, remove = remove,"
+ " list = list, foreach = foreach,"
+ " restore = restore, save = save}"
+ " end"
+ " "
+ " sess = ArdourSession ()"
+ " ArdourSession = nil"
+ );
+
+ luabridge::LuaRef *lua_run;
+ luabridge::LuaRef *lua_add;
+ luabridge::LuaRef *lua_del;
+ luabridge::LuaRef *lua_save;
+ luabridge::LuaRef *lua_load;
+ {
+ luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
+ lua.do_command ("sess = nil"); // hide it.
+ lua.do_command ("collectgarbage()");
+
+ lua_run = new luabridge::LuaRef(lua_sess["run"]);
+ lua_add = new luabridge::LuaRef(lua_sess["add"]);
+ lua_del = new luabridge::LuaRef(lua_sess["remove"]);
+ lua_save = new luabridge::LuaRef(lua_sess["save"]);
+ lua_load = new luabridge::LuaRef(lua_sess["restore"]);
+ }
+ lua.do_command ("collectgarbage()");
+
+#if 1
+ lua.do_command ("function factory (t) return function () local p = t or { } local a = t[1] or 'Nibor' print ('Hello ' .. a) end end");
+ luabridge::LuaRef lua_fact = luabridge::getGlobal (L, "factory");
+ luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+ //tbl_arg[1] = "Robin";
+ (*lua_add)("t2", lua_fact, tbl_arg);
+#else
+ lua.do_command ("function factory (t) return function () print ('Boo') end end");
+ luabridge::LuaRef lua_fact = luabridge::getGlobal (L, "factory");
+ (*lua_add)("t2", lua_fact());
+#endif
+
+ lua.do_command ("function factory (t) return function () print ('Ahoy') end end");
+ luabridge::LuaRef lua_fact2 = luabridge::getGlobal (L, "factory");
+ (*lua_add)("t1", lua_fact2);
+
+ luabridge::LuaRef savedstate ((*lua_save)());
+ std::string saved = savedstate.cast<std::string>();
+
+ (*lua_del)("t2");
+
+ try {
+ (*lua_run)();
+ } catch (luabridge::LuaException const& e) { printf ("LuaException: %s\n", e.what ()); }
+
+ (*lua_load)(saved);
+
+ for (int i = 0; i < 2; ++i) {
+ lua.do_command ("collectgarbage()");
+ lua.collect_garbage ();
+ try {
+ (*lua_run)();
+ } catch (luabridge::LuaException const& e) { printf ("LuaException: %s\n", e.what ()); }
+ }
+
+#endif
+
+ add_history("a = Test:A() b = 2 c = 3 d = 'a'");
+ add_history("x = a:get_arg(b) y = a:get_arg2(b, c) z = a:get_args(d) ");
+ add_history("for i,n in ipairs(y) do print (i, n); end");
+ add_history("t = {} t[2] = 7; t[3] = Test:A() t[4] = Test:A() ref:set (t); f = ref:get()");
+
+ /////////////////////////////////////////////////////////////////////////////
+ char *line;
+ while ((line = readline ("> "))) {
+ if (!strcmp (line, "quit")) {
+ break;
+ }
+ if (strlen(line) == 0) {
+ //lua.do_command("collectgarbage();");
+ continue;
+ }
+ if (!lua.do_command (line)) {
+ add_history(line); // OK
+ } else {
+ add_history(line); // :)
+ }
+ }
+ printf("\n");
+ return 0;
+}
+
+int main (int argc, char **argv)
+{
+ LuaState lua1;
+ LuaState lua2;
+ runone (lua1);
+ printf ("=====\n");
+ runone (lua2);
+}
diff --git a/tools/luadevel/luasession.cc b/tools/luadevel/luasession.cc
new file mode 100644
index 0000000..a131bb4
--- /dev/null
+++ b/tools/luadevel/luasession.cc
@@ -0,0 +1,457 @@
+#include <stdint.h>
+#include <assert.h>
+
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <list>
+#include <vector>
+
+#include <glibmm.h>
+
+#include "pbd/debug.h"
+#include "pbd/event_loop.h"
+#include "pbd/error.h"
+#include "pbd/failed_constructor.h"
+#include "pbd/pthread_utils.h"
+#include "pbd/reallocpool.h"
+#include "pbd/receiver.h"
+#include "pbd/transmitter.h"
+
+#include "ardour/ardour.h"
+#include "ardour/audioengine.h"
+#include "ardour/filename_extensions.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/luabindings.h"
+#include "ardour/session.h"
+#include "ardour/types.h"
+#include "ardour/vst_types.h"
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#include "lua/luastate.h"
+#include "LuaBridge/LuaBridge.h"
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+static const char* localedir = LOCALEDIR;
+static PBD::ScopedConnectionList engine_connections;
+static PBD::ScopedConnectionList session_connections;
+static Session* session = NULL;
+static LuaState* lua;
+static bool keep_running = true;
+
+/* extern VST functions */
+int vstfx_init (void*) { return 0; }
+void vstfx_exit () {}
+void vstfx_destroy_editor (VSTState*) {}
+
+class LuaReceiver : public Receiver
+{
+ protected:
+ void receive (Transmitter::Channel chn, const char * str)
+ {
+ const char *prefix = "";
+
+ switch (chn) {
+ case Transmitter::Error:
+ prefix = "[ERROR]: ";
+ break;
+ case Transmitter::Info:
+ /* ignore */
+ return;
+ case Transmitter::Warning:
+ prefix = "[WARNING]: ";
+ break;
+ case Transmitter::Fatal:
+ prefix = "[FATAL]: ";
+ break;
+ case Transmitter::Throw:
+ /* this isn't supposed to happen */
+ abort ();
+ }
+
+ /* note: iostreams are already thread-safe: no external
+ lock required.
+ */
+
+ std::cout << prefix << str << std::endl;
+
+ if (chn == Transmitter::Fatal) {
+ ::exit (9);
+ }
+ }
+};
+
+class MyEventLoop : public sigc::trackable, public EventLoop
+{
+ public:
+ MyEventLoop (std::string const& name) : EventLoop (name) {
+ run_loop_thread = Glib::Threads::Thread::self ();
+ }
+
+ void call_slot (InvalidationRecord* ir, const boost::function<void()>& f) {
+ if (Glib::Threads::Thread::self () == run_loop_thread) {
+ cout << string_compose ("%1/%2 direct dispatch of call slot via functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir);
+ f ();
+ } else {
+ cout << string_compose ("%1/%2 queue call-slot using functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir);
+ assert (!ir);
+ f (); // XXX TODO, queue and process during run ()
+ }
+ }
+
+ void run () {
+ ; // TODO process Events, if any
+ }
+
+ Glib::Threads::Mutex& slot_invalidation_mutex () { return request_buffer_map_lock; }
+
+ private:
+ Glib::Threads::Thread* run_loop_thread;
+ Glib::Threads::Mutex request_buffer_map_lock;
+};
+
+static MyEventLoop *event_loop = NULL;
+
+/* ****************************************************************************/
+/* internal helper fn and callbacks */
+
+static int do_audio_midi_setup (uint32_t desired_sample_rate)
+{
+ return AudioEngine::instance ()->start ();
+}
+
+static void init ()
+{
+ if (!ARDOUR::init (false, true, localedir)) {
+ cerr << "Ardour failed to initialize\n" << endl;
+ ::exit (EXIT_FAILURE);
+ }
+
+ assert (!event_loop);
+ event_loop = new MyEventLoop ("lua");
+ EventLoop::set_event_loop_for_thread (event_loop);
+ SessionEvent::create_per_thread_pool ("lua", 4096);
+
+ static LuaReceiver lua_receiver;
+
+ lua_receiver.listen_to (error);
+ lua_receiver.listen_to (info);
+ lua_receiver.listen_to (fatal);
+ lua_receiver.listen_to (warning);
+
+ ARDOUR::Session::AudioEngineSetupRequired.connect_same_thread (engine_connections, &do_audio_midi_setup);
+}
+
+static void set_session (ARDOUR::Session *s)
+{
+ session = s;
+ assert (lua);
+ lua_State* L = lua->getState ();
+ LuaBindings::set_session (L, session);
+ lua->collect_garbage (); // drop references
+}
+
+static void unset_session ()
+{
+ session_connections.drop_connections ();
+ set_session (NULL);
+}
+
+static int prepare_engine ()
+{
+ AudioEngine* engine = AudioEngine::instance ();
+
+ if (!engine->current_backend ()) {
+ if (!engine->set_backend ("None (Dummy)", "Unit-Test", "")) {
+ std::cerr << "Cannot create Audio/MIDI engine\n";
+ return -1;
+ }
+ }
+
+ if (!engine->current_backend ()) {
+ std::cerr << "Cannot create Audio/MIDI engine\n";
+ return -1;
+ }
+
+ if (engine->running ()) {
+ engine->stop ();
+ }
+ return 0;
+}
+
+static int start_engine (uint32_t rate)
+{
+ AudioEngine* engine = AudioEngine::instance ();
+
+ if (engine->set_sample_rate (rate)) {
+ std::cerr << "Cannot set session's samplerate.\n";
+ return -1;
+ }
+
+ if (engine->start () != 0) {
+ std::cerr << "Cannot start Audio/MIDI engine\n";
+ return -1;
+ }
+
+ init_post_engine ();
+ return 0;
+}
+
+static Session * _create_session (string dir, string state, uint32_t rate) // throws
+{
+ if (prepare_engine ()) {
+ return 0;
+ }
+
+ std::string s = Glib::build_filename (dir, state + statefile_suffix);
+ if (Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) {
+ std::cerr << "Session already exists: " << s << "\n";
+ return 0;
+ }
+
+ if (start_engine (rate)) {
+ return 0;
+ }
+
+ // TODO add option/bindings for this
+ BusProfile bus_profile;
+ bus_profile.master_out_channels = 2;
+ bus_profile.input_ac = AutoConnectPhysical;
+ bus_profile.output_ac = AutoConnectMaster;
+ bus_profile.requested_physical_in = 0; // use all available
+ bus_profile.requested_physical_out = 0; // use all available
+
+ AudioEngine* engine = AudioEngine::instance ();
+ Session* session = new Session (*engine, dir, state, &bus_profile);
+ return session;
+}
+
+static Session * _load_session (string dir, string state) // throws
+{
+ if (prepare_engine ()) {
+ return 0;
+ }
+
+ float sr;
+ SampleFormat sf;
+ std::string s = Glib::build_filename (dir, state + statefile_suffix);
+ if (!Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) {
+ std::cerr << "Cannot find session: " << s << "\n";
+ return 0;
+ }
+
+ if (Session::get_info_from_path (s, sr, sf) != 0) {
+ std::cerr << "Cannot get samplerate from session.\n";
+ return 0;
+ }
+
+ if (start_engine (sr)) {
+ return 0;
+ }
+
+ AudioEngine* engine = AudioEngine::instance ();
+ Session* session = new Session (*engine, dir, state);
+ return session;
+}
+
+/* ****************************************************************************/
+/* lua bound functions */
+
+static Session* create_session (string dir, string state, uint32_t rate)
+{
+ Session* s = 0;
+ if (session) {
+ cerr << "Session already open" << "\n";
+ return 0;
+ }
+ try {
+ s = _create_session (dir, state, rate);
+ } catch (failed_constructor& e) {
+ cerr << "failed_constructor: " << e.what () << "\n";
+ return 0;
+ } catch (AudioEngine::PortRegistrationFailure& e) {
+ cerr << "PortRegistrationFailure: " << e.what () << "\n";
+ return 0;
+ } catch (exception& e) {
+ cerr << "exception: " << e.what () << "\n";
+ return 0;
+ } catch (...) {
+ cerr << "unknown exception.\n";
+ return 0;
+ }
+ Glib::usleep (1000000); // allow signal propagation, callback/thread-pool setup
+ if (!s) {
+ return 0;
+ }
+ set_session (s);
+ s->DropReferences.connect_same_thread (session_connections, &unset_session);
+ return s;
+}
+
+static Session* load_session (string dir, string state)
+{
+ Session* s = 0;
+ if (session) {
+ cerr << "Session already open" << "\n";
+ return 0;
+ }
+ try {
+ s = _load_session (dir, state);
+ } catch (failed_constructor& e) {
+ cerr << "failed_constructor: " << e.what () << "\n";
+ return 0;
+ } catch (AudioEngine::PortRegistrationFailure& e) {
+ cerr << "PortRegistrationFailure: " << e.what () << "\n";
+ return 0;
+ } catch (exception& e) {
+ cerr << "exception: " << e.what () << "\n";
+ return 0;
+ } catch (...) {
+ cerr << "unknown exception.\n";
+ return 0;
+ }
+ Glib::usleep (1000000); // allow signal propagation, callback/thread-pool setup
+ if (!s) {
+ return 0;
+ }
+ set_session (s);
+ s->DropReferences.connect_same_thread (session_connections, &unset_session);
+ return s;
+}
+
+static int set_debug_options (const char *opts)
+{
+ return PBD::parse_debug_options (opts);
+}
+
+static void close_session ()
+{
+ delete session;
+ assert (!session);
+}
+
+static int close_session_lua (lua_State *L)
+{
+ if (!session) {
+ cerr << "No open session" << "\n";
+ return 0;
+ }
+ close_session ();
+ return 0;
+}
+
+static void delay (float d) {
+ if (d > 0) {
+ Glib::usleep (d * 1000000);
+ }
+}
+
+static int do_quit (lua_State *L)
+{
+ keep_running = false;
+ return 0;
+}
+
+/* ****************************************************************************/
+
+static void my_lua_print (std::string s) {
+ std::cout << s << "\n";
+}
+
+static void setup_lua ()
+{
+ assert (!lua);
+
+ lua = new LuaState ();
+ lua->Print.connect (&my_lua_print);
+ lua_State* L = lua->getState ();
+
+ LuaBindings::stddef (L);
+ LuaBindings::common (L);
+ LuaBindings::session (L);
+ LuaBindings::osc (L);
+
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("_G")
+ .addFunction ("create_session", &create_session)
+ .addFunction ("load_session", &load_session)
+ .addFunction ("close_session", &close_session)
+ .addFunction ("sleep", &delay)
+ .addFunction ("quit", &do_quit)
+ .addFunction ("set_debug_options", &set_debug_options)
+ .endNamespace ();
+
+ // add a Session::close() method
+ luabridge::getGlobalNamespace (L)
+ .beginNamespace ("ARDOUR")
+ .beginClass <Session> ("Session")
+ .addExtCFunction ("close", &close_session_lua)
+ .endClass ()
+ .endNamespace ();
+
+ // push instance to global namespace (C++ lifetime)
+ luabridge::push <AudioEngine *> (L, AudioEngine::create ());
+ lua_setglobal (L, "AudioEngine");
+
+ AudioEngine::instance ()->stop ();
+}
+
+int main (int argc, char **argv)
+{
+ init ();
+ setup_lua ();
+
+ using_history ();
+ std::string histfile = Glib::build_filename (user_config_directory(), "/luahist");
+
+ read_history (histfile.c_str());
+
+ char *line = NULL;
+ while (keep_running && (line = readline ("> "))) {
+ event_loop->run();
+ if (!strcmp (line, "quit")) {
+ free (line); line = NULL;
+ break;
+ }
+
+ if (strlen (line) == 0) {
+ free (line); line = NULL;
+ continue;
+ }
+
+ if (lua->do_command (line)) {
+ // error
+ }
+
+ add_history (line);
+ event_loop->run();
+ free (line); line = NULL;
+ }
+ free (line);
+ printf ("\n");
+
+ if (session) {
+ close_session ();
+ }
+
+ engine_connections.drop_connections ();
+
+ delete lua;
+ lua = NULL;
+
+ write_history (histfile.c_str());
+
+ AudioEngine::instance ()->stop ();
+ AudioEngine::destroy ();
+
+ // cleanup
+ ARDOUR::cleanup ();
+ delete event_loop;
+ pthread_cancel_all ();
+ return 0;
+}
diff --git a/tools/luadevel/wscript b/tools/luadevel/wscript
new file mode 100755
index 0000000..3190380
--- /dev/null
+++ b/tools/luadevel/wscript
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+from waflib.extras import autowaf as autowaf
+from waflib import Options, TaskGen
+import waflib.Logs as Logs, waflib.Utils as Utils
+import os
+import shutil
+import sys
+import re
+import time
+from waflib.Task import Task
+
+top = '.'
+out = 'build'
+
+def options(opt):
+ autowaf.set_options(opt)
+
+def configure(conf):
+ conf.load('misc')
+ conf.load('compiler_cxx')
+ conf.check_cc(function_name='readline',
+ header_name='stdio.h readline/readline.h',
+ lib='readline',
+ uselib_store='READLINE',
+ mandatory=False)
+ autowaf.configure(conf)
+
+def build(bld):
+ VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
+ if not bld.is_defined('HAVE_READLINE'):
+ return;
+ # no wine
+ if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
+ return
+
+ if bld.env['build_target'] != 'mingw':
+ # TEST/DEVEL TOOL #######################
+ obj = bld (features = 'cxx c cxxprogram')
+ obj.source = 'devel.cc'
+ obj.target = 'devel'
+ obj.uselib = ['SIGCPP', 'READLINE']
+ obj.use = ['liblua']
+ obj.install_path = None
+ #########################################
+
+ # commandline luasession wrapper
+ obj = bld(features = 'subst')
+ obj.source = 'ardour-lua.sh.in'
+ obj.target = 'ardour' + str (bld.env['MAJOR']) + '-lua'
+ obj.chmod = Utils.O755
+ obj.install_path = bld.env['BINDIR']
+ obj.LIBDIR = os.path.normpath(bld.env['DLLDIR'])
+ obj.DATADIR = os.path.normpath(bld.env['DATADIR'])
+ obj.CONFDIR = os.path.normpath(bld.env['CONFDIR'])
+
+ # commandline luasession
+ obj = bld (features = 'cxx c cxxprogram')
+ obj.source = 'luasession.cc'
+ obj.target = 'luasession'
+ obj.includes = ['../libs']
+ obj.use = ['liblua'
+ 'libpbd',
+ 'libardour',
+ 'libardour_cp',
+ 'libtimecode',
+ 'libmidipp',
+ ]
+ obj.defines = [
+ 'VERSIONSTRING="' + str(bld.env['VERSION']) + '"',
+ 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
+ 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
+ 'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
+ 'PACKAGE="' + "ARDOURUTILS" + '"',
+ ]
+
+ obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL XML'
+ obj.uselib += ' FFTW3F'
+ obj.uselib += ' AUDIOUNITS OSX LO '
+ obj.uselib += ' TAGLIB '
+ obj.uselib += ' READLINE '
+
+ if sys.platform == 'darwin':
+ obj.uselib += ' AUDIOUNITS OSX'
+ obj.use += ' libappleutility'
+
+ #if bld.env['build_target'] == 'mingw':
+ # if bld.env['DEBUG'] == False:
+ # obj.linkflags = ['-mwindows']
+
+ if bld.is_defined('NEED_INTL'):
+ obj.linkflags = ' -lintl'
+
+ obj.install_path = bld.env['DLLDIR']
diff --git a/icons/Ardour Mouse Cursors.svg b/tools/misc_resources/Ardour Mouse Cursors.svg
similarity index 100%
rename from icons/Ardour Mouse Cursors.svg
rename to tools/misc_resources/Ardour Mouse Cursors.svg
diff --git a/icons/Music_dynamic_forte.svg b/tools/misc_resources/Music_dynamic_forte.svg
similarity index 100%
rename from icons/Music_dynamic_forte.svg
rename to tools/misc_resources/Music_dynamic_forte.svg
diff --git a/icons/Music_dynamic_fortissimo.svg b/tools/misc_resources/Music_dynamic_fortissimo.svg
similarity index 100%
rename from icons/Music_dynamic_fortissimo.svg
rename to tools/misc_resources/Music_dynamic_fortissimo.svg
diff --git a/icons/Music_dynamic_fortississimo.svg b/tools/misc_resources/Music_dynamic_fortississimo.svg
similarity index 100%
rename from icons/Music_dynamic_fortississimo.svg
rename to tools/misc_resources/Music_dynamic_fortississimo.svg
diff --git a/icons/Music_dynamic_mezzo_forte.svg b/tools/misc_resources/Music_dynamic_mezzo_forte.svg
similarity index 100%
rename from icons/Music_dynamic_mezzo_forte.svg
rename to tools/misc_resources/Music_dynamic_mezzo_forte.svg
diff --git a/icons/Music_dynamic_mezzo_piano.svg b/tools/misc_resources/Music_dynamic_mezzo_piano.svg
similarity index 100%
rename from icons/Music_dynamic_mezzo_piano.svg
rename to tools/misc_resources/Music_dynamic_mezzo_piano.svg
diff --git a/icons/Music_dynamic_pianissimo.svg b/tools/misc_resources/Music_dynamic_pianissimo.svg
similarity index 100%
rename from icons/Music_dynamic_pianissimo.svg
rename to tools/misc_resources/Music_dynamic_pianissimo.svg
diff --git a/icons/Music_dynamic_pianississimo.svg b/tools/misc_resources/Music_dynamic_pianississimo.svg
similarity index 100%
rename from icons/Music_dynamic_pianississimo.svg
rename to tools/misc_resources/Music_dynamic_pianississimo.svg
diff --git a/icons/Music_dynamic_piano.svg b/tools/misc_resources/Music_dynamic_piano.svg
similarity index 100%
rename from icons/Music_dynamic_piano.svg
rename to tools/misc_resources/Music_dynamic_piano.svg
diff --git a/gtk2_ardour/icons/app-icon_tango.svg b/tools/misc_resources/app-icon_tango.svg
similarity index 100%
rename from gtk2_ardour/icons/app-icon_tango.svg
rename to tools/misc_resources/app-icon_tango.svg
diff --git a/icons/ardour_bw.ai b/tools/misc_resources/ardour_bw.ai
similarity index 100%
rename from icons/ardour_bw.ai
rename to tools/misc_resources/ardour_bw.ai
diff --git a/icons/ardour_bw.svg b/tools/misc_resources/ardour_bw.svg
similarity index 100%
rename from icons/ardour_bw.svg
rename to tools/misc_resources/ardour_bw.svg
diff --git a/icons/ardour_track-bus_list_states.svg b/tools/misc_resources/ardour_track-bus_list_states.svg
similarity index 100%
rename from icons/ardour_track-bus_list_states.svg
rename to tools/misc_resources/ardour_track-bus_list_states.svg
diff --git a/icons/chord.svg b/tools/misc_resources/chord.svg
similarity index 100%
rename from icons/chord.svg
rename to tools/misc_resources/chord.svg
diff --git a/gtk2_ardour/icons/crossfade_in_default.svg b/tools/misc_resources/crossfade_in_default.svg
similarity index 100%
rename from gtk2_ardour/icons/crossfade_in_default.svg
rename to tools/misc_resources/crossfade_in_default.svg
diff --git a/gtk2_ardour/icons/crossfade_out_default.svg b/tools/misc_resources/crossfade_out_default.svg
similarity index 100%
rename from gtk2_ardour/icons/crossfade_out_default.svg
rename to tools/misc_resources/crossfade_out_default.svg
diff --git a/icons/eighthnote.svg b/tools/misc_resources/eighthnote.svg
similarity index 100%
rename from icons/eighthnote.svg
rename to tools/misc_resources/eighthnote.svg
diff --git a/icons/fade_in_cursor.svg b/tools/misc_resources/fade_in_cursor.svg
similarity index 100%
rename from icons/fade_in_cursor.svg
rename to tools/misc_resources/fade_in_cursor.svg
diff --git a/icons/fade_out_cursor.svg b/tools/misc_resources/fade_out_cursor.svg
similarity index 100%
rename from icons/fade_out_cursor.svg
rename to tools/misc_resources/fade_out_cursor.svg
diff --git a/icons/halfnote.svg b/tools/misc_resources/halfnote.svg
similarity index 100%
rename from icons/halfnote.svg
rename to tools/misc_resources/halfnote.svg
diff --git a/icons/i_beam_cursor.svg b/tools/misc_resources/i_beam_cursor.svg
similarity index 100%
rename from icons/i_beam_cursor.svg
rename to tools/misc_resources/i_beam_cursor.svg
diff --git a/icons/icon/ardour.icns b/tools/misc_resources/icon/ardour.icns
similarity index 100%
rename from icons/icon/ardour.icns
rename to tools/misc_resources/icon/ardour.icns
diff --git a/icons/icon/ardour_icon_mac.png b/tools/misc_resources/icon/ardour_icon_mac.png
similarity index 100%
rename from icons/icon/ardour_icon_mac.png
rename to tools/misc_resources/icon/ardour_icon_mac.png
diff --git a/icons/icon/ardour_icon_mac_mask.png b/tools/misc_resources/icon/ardour_icon_mac_mask.png
similarity index 100%
rename from icons/icon/ardour_icon_mac_mask.png
rename to tools/misc_resources/icon/ardour_icon_mac_mask.png
diff --git a/icons/icon/ardour_icon_tango_16px.xcf b/tools/misc_resources/icon/ardour_icon_tango_16px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_16px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_16px.xcf
diff --git a/icons/icon/ardour_icon_tango_16px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_16px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_16px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_16px_blue.png
diff --git a/icons/icon/ardour_icon_tango_16px_red.png b/tools/misc_resources/icon/ardour_icon_tango_16px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_16px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_16px_red.png
diff --git a/icons/icon/ardour_icon_tango_22px.xcf b/tools/misc_resources/icon/ardour_icon_tango_22px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_22px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_22px.xcf
diff --git a/icons/icon/ardour_icon_tango_22px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_22px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_22px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_22px_blue.png
diff --git a/icons/icon/ardour_icon_tango_22px_red.png b/tools/misc_resources/icon/ardour_icon_tango_22px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_22px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_22px_red.png
diff --git a/icons/icon/ardour_icon_tango_32px.xcf b/tools/misc_resources/icon/ardour_icon_tango_32px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_32px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_32px.xcf
diff --git a/icons/icon/ardour_icon_tango_32px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_32px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_32px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_32px_blue.png
diff --git a/icons/icon/ardour_icon_tango_32px_red.png b/tools/misc_resources/icon/ardour_icon_tango_32px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_32px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_32px_red.png
diff --git a/icons/icon/ardour_icon_tango_48px.xcf b/tools/misc_resources/icon/ardour_icon_tango_48px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_48px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_48px.xcf
diff --git a/icons/icon/ardour_icon_tango_48px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_48px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_48px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_48px_blue.png
diff --git a/icons/icon/ardour_icon_tango_48px_red.png b/tools/misc_resources/icon/ardour_icon_tango_48px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_48px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_48px_red.png
diff --git a/gtk2_ardour/icons/join_tools.svg b/tools/misc_resources/join_tools.svg
similarity index 100%
rename from gtk2_ardour/icons/join_tools.svg
rename to tools/misc_resources/join_tools.svg
diff --git a/gtk2_ardour/icons/metronome.svg b/tools/misc_resources/metronome.svg
similarity index 100%
rename from gtk2_ardour/icons/metronome.svg
rename to tools/misc_resources/metronome.svg
diff --git a/gtk2_ardour/icons/midi_panic.svg b/tools/misc_resources/midi_panic.svg
similarity index 100%
rename from gtk2_ardour/icons/midi_panic.svg
rename to tools/misc_resources/midi_panic.svg
diff --git a/icons/midi_socket.svg b/tools/misc_resources/midi_socket.svg
similarity index 100%
rename from icons/midi_socket.svg
rename to tools/misc_resources/midi_socket.svg
diff --git a/icons/quarternote.svg b/tools/misc_resources/quarternote.svg
similarity index 100%
rename from icons/quarternote.svg
rename to tools/misc_resources/quarternote.svg
diff --git a/tools/misc_resources/search.svg b/tools/misc_resources/search.svg
new file mode 100644
index 0000000..2b88568
--- /dev/null
+++ b/tools/misc_resources/search.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="16"
+ height="16"
+ id="svg2"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="search.svg"
+ inkscape:export-filename="/home/buhr/projects/ardour/gtk2_ardour/icons/search.png"
+ inkscape:export-xdpi="135.31609"
+ inkscape:export-ydpi="135.31609">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1390"
+ id="namedview4941"
+ showgrid="false"
+ inkscape:zoom="36.75"
+ inkscape:cx="20.233694"
+ inkscape:cy="2.6993399"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4757">
+ <stop
+ id="stop4759"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4761"
+ style="stop-color:#c1c1c1;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="4.1535583"
+ cy="4.6999545"
+ r="4.5"
+ fx="4.1535583"
+ fy="4.6999545"
+ id="radialGradient4763"
+ xlink:href="#linearGradient4757"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99954653,1.0095465,-0.64253295,0.64896107,3.1580713,-3.0083174)" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path
+ style="fill:none;stroke:#5a5a5a;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 14.7,14.7 10,10"
+ id="path4781"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ style="stroke:#5a5a5a;stroke-opacity:1">
+ <path
+ d="m 11,6.5 a 4.5,4.5 0 1 1 -9,0 4.5,4.5 0 1 1 9,0 z"
+ transform="matrix(1.2222222,0,0,1.2222222,-1.9444445,1034.4178)"
+ id="path3987"
+ style="fill:url(#radialGradient4763);fill-opacity:1;stroke:#5a5a5a;stroke-width:0.81818181;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+</svg>
diff --git a/icons/sixteenthnote.svg b/tools/misc_resources/sixteenthnote.svg
similarity index 100%
rename from icons/sixteenthnote.svg
rename to tools/misc_resources/sixteenthnote.svg
diff --git a/icons/sixyfourthnote.svg b/tools/misc_resources/sixyfourthnote.svg
similarity index 100%
rename from icons/sixyfourthnote.svg
rename to tools/misc_resources/sixyfourthnote.svg
diff --git a/icons/thirtysecondnote.svg b/tools/misc_resources/thirtysecondnote.svg
similarity index 100%
rename from icons/thirtysecondnote.svg
rename to tools/misc_resources/thirtysecondnote.svg
diff --git a/gtk2_ardour/icons/transport_end.svg b/tools/misc_resources/transport_end.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_end.svg
rename to tools/misc_resources/transport_end.svg
diff --git a/gtk2_ardour/icons/transport_icons.svg b/tools/misc_resources/transport_icons.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_icons.svg
rename to tools/misc_resources/transport_icons.svg
diff --git a/gtk2_ardour/icons/transport_play.svg b/tools/misc_resources/transport_play.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_play.svg
rename to tools/misc_resources/transport_play.svg
diff --git a/gtk2_ardour/icons/transport_range.svg b/tools/misc_resources/transport_range.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_range.svg
rename to tools/misc_resources/transport_range.svg
diff --git a/gtk2_ardour/icons/transport_record.svg b/tools/misc_resources/transport_record.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_record.svg
rename to tools/misc_resources/transport_record.svg
diff --git a/gtk2_ardour/icons/transport_start.svg b/tools/misc_resources/transport_start.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_start.svg
rename to tools/misc_resources/transport_start.svg
diff --git a/gtk2_ardour/icons/transport_stop.svg b/tools/misc_resources/transport_stop.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_stop.svg
rename to tools/misc_resources/transport_stop.svg
diff --git a/gtk2_ardour/icons/tw_edit_icons_07.xcf b/tools/misc_resources/tw_edit_icons_07.xcf
similarity index 100%
rename from gtk2_ardour/icons/tw_edit_icons_07.xcf
rename to tools/misc_resources/tw_edit_icons_07.xcf
diff --git a/icons/wholenote.svg b/tools/misc_resources/wholenote.svg
similarity index 100%
rename from icons/wholenote.svg
rename to tools/misc_resources/wholenote.svg
diff --git a/icons/zoom_full.svg b/tools/misc_resources/zoom_full.svg
similarity index 100%
rename from icons/zoom_full.svg
rename to tools/misc_resources/zoom_full.svg
diff --git a/icons/zoom_in.svg b/tools/misc_resources/zoom_in.svg
similarity index 100%
rename from icons/zoom_in.svg
rename to tools/misc_resources/zoom_in.svg
diff --git a/icons/zoom_in_cursor.svg b/tools/misc_resources/zoom_in_cursor.svg
similarity index 100%
rename from icons/zoom_in_cursor.svg
rename to tools/misc_resources/zoom_in_cursor.svg
diff --git a/icons/zoom_out.svg b/tools/misc_resources/zoom_out.svg
similarity index 100%
rename from icons/zoom_out.svg
rename to tools/misc_resources/zoom_out.svg
diff --git a/icons/zoom_out_cursor.svg b/tools/misc_resources/zoom_out_cursor.svg
similarity index 100%
rename from icons/zoom_out_cursor.svg
rename to tools/misc_resources/zoom_out_cursor.svg
diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build
index f7226bc..68bb675 100755
--- a/tools/osx_packaging/osx_build
+++ b/tools/osx_packaging/osx_build
@@ -16,6 +16,7 @@ mkdir -p "$CACHEDIR"
SAE=
MIXBUS=
+MIXBUS32C=
WITH_HARVID=1
WITH_HARRISON_LV2=
WITH_X42_LV2=
@@ -24,6 +25,10 @@ STRIP=1
PRINT_SYSDEPS=
WITH_NLS=
+: ${HARRISONCHANNELSTRIP=harrison_channelstrip}
+
+. ../define_versions.sh
+
while [ $# -gt 0 ] ; do
echo "arg = $1"
case $1 in
@@ -49,9 +54,23 @@ while [ $# -gt 0 ] ; do
PRODUCT_PKG_DIR=Mixbus;
APPNAME=Mixbus ;
shift ;;
+ --mixbus32c) MIXBUS=1;
+ MIXBUS32C=1;
+ WITH_HARRISON_LV2=1 ;
+ WITH_X42_LV2=1 ;
+ WITH_NLS=1 ;
+ SAE= ;
+ WITH_LADSPA=;
+ STRIP= ;
+ PRODUCT_PKG_DIR=Mixbus32C;
+ APPNAME=Mixbus32C-${major_version} ;
+ major_version=""
+ shift ;;
--public)
SAE= ;
WITH_LADSPA=1;
+ WITH_HARRISON_LV2=1 ;
+ WITH_X42_LV2=1 ;
PRODUCT_PKG_DIR=Ardour;
APPNAME=Ardour ;
shift ;;
@@ -71,6 +90,7 @@ while [ $# -gt 0 ] ; do
--nostrip) STRIP= ; shift ;;
--sysdeps) PRINT_SYSDEPS=1; shift ;;
--nls) WITH_NLS=1 ; shift ;;
+ --chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
esac
done
@@ -79,7 +99,6 @@ if test -z "$PRODUCT_PKG_DIR" -o -z "$APPNAME"; then
exit 1
fi
-. ../define_versions.sh
echo "Version is $release_version"
if [ "x$commit" != "x" ] ; then
info_string="$release_version ($commit) built on `hostname` by `whoami` on `date`"
@@ -124,7 +143,9 @@ MidiMaps=$Shared/midi_maps
ExportFormats=$Shared/export
Templates=$Shared/templates
PatchFiles=$Shared/patchfiles
+LuaScripts=$Shared/scripts
MackieControl=$Shared/mcp
+Themes=$Shared/themes
if [ x$PRINT_SYSDEPS != x ] ; then
#
@@ -161,6 +182,8 @@ mkdir -p $Frameworks/modules
mkdir -p $Etc
mkdir -p $MackieControl
mkdir -p $PatchFiles
+mkdir -p $LuaScripts
+mkdir -p $Themes
# maybe set variables
env=""
@@ -174,7 +197,7 @@ if test x$SAE != x ; then
env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>de-nokeypad</string>"
env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui_sae.conf</string>"
elif test x$MIXBUS != x ; then
- appname="Mixbus"
+ appname=$APPNAME
EXECUTABLE=${appname}${major_version}
env="$env<key>ARDOUR_MIXBUS</key><string>true</string>"
#
@@ -236,6 +259,8 @@ cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTAB
if test x$SAE != x ; then
# cp $BUILD_ROOT/gtk2_ardour/evtest $APPROOT/MacOS/gtkevents
cp Ardour3-SAE.icns $Resources/appIcon.icns
+elif test x$MIXBUS32C != x ; then
+ cp Mixbus32C.icns $Resources/appIcon.icns
elif test x$MIXBUS != x ; then
cp Mixbus.icns $Resources/appIcon.icns
else
@@ -373,6 +398,15 @@ for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
cp "$x" $PatchFiles
done
+# Lua Script Files
+# got to be careful with names here
+for x in $BUILD_ROOT/../scripts/*.lua ; do
+ if test "${x:0:1}" = "_"; then
+ continue;
+ fi
+ cp "$x" $LuaScripts
+done
+
# MackieControl data
# got to be careful with names here
for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
@@ -448,25 +482,26 @@ echo
echo "Copying other stuff to $APPDIR ..."
-#cp $BUILD_ROOT/gtk2_ardour/ergonomic-us.bindings $Resources
-
-cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings $Resources
+cp $BUILD_ROOT/gtk2_ardour/ardour.keys $Resources
cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
cp $BUILD_ROOT/gtk2_ardour/default_ui_config $Resources
cp $BUILD_ROOT/gtk2_ardour/clearlooks.rc $Resources
# Copied directly from source tree
+mkdir ${Resources}/icons
+mkdir ${Resources}/resources
cp ../../system_config $Resources/system_config
cp ../../instant.xml $Resources/instant.xml
-cp ../../gtk2_ardour/step_editing.bindings $Resources
-cp ../../gtk2_ardour/mixer.bindings $Resources
-cp -r ../../gtk2_ardour/icons $Resources
-cp -r ../../gtk2_ardour/pixmaps $Resources
-cp ../../gtk2_ardour/dark.colors $Resources
-cp -R ../../gtk2_ardour/splash.png $Shared
-cp -R ../../gtk2_ardour/small-splash.png $Shared
-cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/icons/*.png ${Resources}/icons/
+cp -r ../../gtk2_ardour/icons/cursor_* ${Resources}/icons/
+cp ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/resources/${PRODUCT_PKG_DIR}-* ${Resources}/resources/
+
+
+# Themes: only install those named for this app
+lower_case_appname=`echo $APPNAME | tr '[:upper:]' '[:lower:]'`
+cp ../../gtk2_ardour/themes/*-${lower_case_appname}.colors $Themes
# go through and recursively remove any .svn dirs in the bundle
for svndir in `find $APPDIR -name .svn -type dir`; do
@@ -505,7 +540,7 @@ done
echo "Fixing up library names ..."
# now do the same for all the libraries we include
-for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends ; do
+for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends $Frameworks/LV2/* ; do
libbase=`basename $libdir`
@@ -583,7 +618,7 @@ if file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q x86_64; the
OSX_BENSID=osx64
elif file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q ppc; then
OSX_ARCH=ppc
- OSX_BENSID=ppc
+ OSX_BENSID=osxppc
else
OSX_ARCH=i386
OSX_BENSID=osx32
@@ -644,26 +679,14 @@ if test x$WITH_X42_LV2 != x ; then
echo "bundling x42 plugins"
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
- METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/x42-meters.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/osx/x42-meters-lv2-osx-${METERS_VERSION}.zip \
- "$CACHEDIR/x42-meters-lv2-osx-${METERS_VERSION}.zip"
- bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
- "$CACHEDIR/x42-meters-lv2-osx-${METERS_VERSION}.zip"
-
- SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/setBfree.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/osx/setBfree-lv2-osx-${SETBFREE_VERSION}.zip \
- "$CACHEDIR/setBfree-lv2-osx-${SETBFREE_VERSION}.zip"
- bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
- "$CACHEDIR/setBfree-lv2-osx-${SETBFREE_VERSION}.zip"
-
- MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/x42-midifilter.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/osx/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip \
- "$CACHEDIR/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip"
- bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
- "$CACHEDIR/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip"
+ for proj in x42-meters x42-midifilter x42-midimap x42-stereoroute x42-eq setBfree; do
+ X42_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/${proj}.latest.txt)
+ rsync -a -q --partial \
+ rsync://x42-plugins.com/x42/osx/${proj}-lv2-osx-${X42_VERSION}.zip \
+ "$CACHEDIR/${proj}-lv2-osx-${X42_VERSION}.zip"
+ bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
+ "$CACHEDIR/${proj}-lv2-osx-${X42_VERSION}.zip"
+ done
for file in ${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/*/*.dylib ; do
lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin
@@ -672,17 +695,27 @@ if test x$WITH_X42_LV2 != x ; then
fi
if test -n "$MIXBUS"; then
- echo "deploying harrison tools for $OSX_BENSID"
+ echo "deploying harrison channelstrip for $OSX_BENSID"
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip"
curl -s -S --fail -# \
- -z "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
- -o "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
- "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_channelstrip.${OSX_BENSID}.so"
+ -z "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
+ -o "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
+ "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so"
+
+ cp "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
+ "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip/${HARRISONCHANNELSTRIP}.so"
+
+ echo "deploying harrison vamp plugins for $OSX_BENSID"
+
+ curl -s -S --fail -# \
+ -z "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
+ -o "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
+ "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_vamp.${OSX_BENSID}.dylib"
- cp "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
- "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip/harrison_channelstrip.so"
+ cp "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
+ "${PRODUCT_PKG_DIR}/${APPROOT}/lib/harrison_vamp.dylib"
fi
################################################################################
diff --git a/tools/update_luadoc.sh b/tools/update_luadoc.sh
new file mode 100755
index 0000000..07001ca
--- /dev/null
+++ b/tools/update_luadoc.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+## ardour needs to be configured with --luadoc and build should be up-to date.
+
+cd `dirname $0`
+DIR=`pwd`
+set -e
+test -f ../libs/ardour/ardour/ardour.h
+test -e ../gtk2_ardour/arluadoc
+test -e ../build/gtk2_ardour/luadoc
+
+# generate ../doc/ardourapi.json.gz
+if test -z "$1"; then
+ ./doxy2json/ardourdoc.sh
+fi
+
+# generate ../doc/luadoc.json.gz
+$DIR/../gtk2_ardour/arluadoc
+
+if test -f $HOME/src/ardour-manual/_manual/24_lua-scripting/02_class_reference.html; then
+ php $DIR/fmt-luadoc.php -m > $HOME/src/ardour-manual/_manual/24_lua-scripting/02_class_reference.html
+ ls -l $HOME/src/ardour-manual/_manual/24_lua-scripting/02_class_reference.html
+ cd $HOME/src/ardour-manual/
+ ./build.rb
+else
+ php $DIR/fmt-luadoc.php > /tmp/luadoc.html
+ ls -l /tmp/luadoc.html
+fi
diff --git a/tools/waflib.patch b/tools/waflib.patch
new file mode 100644
index 0000000..c5f2f18
--- /dev/null
+++ b/tools/waflib.patch
@@ -0,0 +1,13 @@
+diff --git a/waflib/Tools/c_config.py b/waflib/Tools/c_config.py
+index ee1c5c2..0672f3d 100644
+--- a/waflib/Tools/c_config.py
++++ b/waflib/Tools/c_config.py
+@@ -150,6 +150,8 @@ def parse_flags(self, line, uselib, env=None, force_static=False):
+ elif st == '-L':
+ if not ot: ot = lst.pop(0)
+ appu('LIBPATH_' + uselib, [ot])
++ elif x.startswith('-std=c++'):
++ app('CXXFLAGS_' + uselib, [x])
+ elif x == '-pthread' or x.startswith('+') or x.startswith('-std'):
+ app('CFLAGS_' + uselib, [x])
+ app('CXXFLAGS_' + uselib, [x])
diff --git a/tools/x-win/package.sh b/tools/x-win/package.sh
index b16c454..9d878dc 100755
--- a/tools/x-win/package.sh
+++ b/tools/x-win/package.sh
@@ -16,6 +16,19 @@ test -f gtk2_ardour/wscript || exit 1
: ${MAKEFLAGS=-j4}
: ${TMPDIR=/var/tmp}
: ${SRCCACHE=/var/tmp/winsrc} # source-code tgz cache
+: ${HARRISONCHANNELSTRIP=harrison_channelstrip}
+
+# see also wscript, video_tool_paths.cc, bundle_env_mingw.cc
+# registry keys based on this are used there
+PROGRAM_NAME=Ardour
+PROGRAM_KEY=Ardour
+PROGRAM_VERSION=${major_version}
+
+PRODUCT_NAME=ardour
+PRODUCT_VERSION=${major_version}
+
+WITH_HARRISON_LV2=1 ;
+WITH_X42_LV2=1 ;
# TODO: grep from build/config.log instead
while [ $# -gt 0 ] ; do
@@ -25,23 +38,27 @@ while [ $# -gt 0 ] ; do
MIXBUS=1
WITH_HARRISON_LV2=1 ;
WITH_X42_LV2=1 ;
+ PROGRAM_NAME=Mixbus
+ PROGRAM_KEY=Mixbus
+ PRODUCT_NAME=mixbus
shift ;;
+ --mixbus32c)
+ MIXBUS=1
+ WITH_HARRISON_LV2=1 ;
+ WITH_X42_LV2=1 ;
+ PRODUCT_NAME=mixbus32c
+ PROGRAM_KEY=Mixbus32C
+ PROGRAM_NAME=Mixbus32C-${PROGRAM_VERSION}
+ PROGRAM_VERSION=""
+ shift ;;
+ --chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
esac
done
-# see also wscript, video_tool_paths.cc, bundle_env_mingw.cc
-# registry keys based on this are used there
-PROGRAM_NAME=Ardour
-PRODUCT_NAME=ardour
-PROGRAM_VERSION=${major_version}
LOWERCASE_DIRNAME=ardour${major_version}
STATEFILE_SUFFIX=ardour # see filename_extensions.cc
-if test -n "$MIXBUS"; then
- PROGRAM_NAME=Mixbus
- PRODUCT_NAME=mixbus
-fi
# derived variables
PRODUCT_ID=${PROGRAM_NAME}${PROGRAM_VERSION}
@@ -233,23 +250,13 @@ if test x$WITH_X42_LV2 != x ; then
echo "Adding x42 Plugins"
- METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/x42-meters.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/win/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip \
- "${SRCCACHE}/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip"
- unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip"
-
- SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/setBfree.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/win/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip \
- "${SRCCACHE}/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip"
- unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip"
-
- MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/x42-midifilter.latest.txt)
- rsync -a -q --partial \
- rsync://x42-plugins.com/x42/win/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip \
- "${SRCCACHE}/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip"
- unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip"
+ for proj in x42-meters x42-midifilter x42-midimap x42-stereoroute x42-eq setBfree; do
+ X42_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/${proj}.latest.txt)
+ rsync -a -q --partial \
+ rsync://x42-plugins.com/x42/win/${proj}-lv2-${WARCH}-${X42_VERSION}.zip \
+ "${SRCCACHE}/${proj}-lv2-${WARCH}-${X42_VERSION}.zip"
+ unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/${proj}-lv2-${WARCH}-${X42_VERSION}.zip"
+ done
fi
if test x$WITH_HARRISON_LV2 != x ; then
@@ -269,12 +276,22 @@ if test -n "$MIXBUS"; then
mkdir -p $ALIBDIR/ladspa/strip
curl -s -S --fail -# \
- -z "${SRCCACHE}/harrison_channelstrip.${WARCH}.dll" \
- -o "${SRCCACHE}/harrison_channelstrip.${WARCH}.dll" \
- "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_channelstrip.${WARCH}.dll"
+ -z "${SRCCACHE}/${HARRISONCHANNELSTRIP}.${WARCH}.dll" \
+ -o "${SRCCACHE}/${HARRISONCHANNELSTRIP}.${WARCH}.dll" \
+ "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/${HARRISONCHANNELSTRIP}.${WARCH}.dll"
+
+ cp "${SRCCACHE}/${HARRISONCHANNELSTRIP}.${WARCH}.dll" \
+ "$ALIBDIR/ladspa/strip/${HARRISONCHANNELSTRIP}.dll"
+
+ echo "Deploying Harrison Vamp Plugins"
+ mkdir -p $ALIBDIR/vamp
+ curl -s -S --fail -# \
+ -z "${SRCCACHE}/harrison_vamp.${WARCH}.dll" \
+ -o "${SRCCACHE}/harrison_vamp.${WARCH}.dll" \
+ "http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_vamp.${WARCH}.dll"
- cp "${SRCCACHE}/harrison_channelstrip.${WARCH}.dll" \
- "$ALIBDIR/ladspa/strip/harrison_channelstrip.dll"
+ cp "${SRCCACHE}/harrison_vamp.${WARCH}.dll" \
+ "$ALIBDIR/vamp/harrison_vamp.dll"
fi
( cd $DESTDIR ; find . ) > ${TMPDIR}/file_list.txt
@@ -313,7 +330,7 @@ Name "${PROGRAM_NAME}${PROGRAM_VERSION}"
OutFile "${OUTFILE}"
RequestExecutionLevel admin
InstallDir "\$${PGF}\\${PRODUCT_ID}"
-InstallDirRegKey HKLM "Software\\${PROGRAM_NAME}\\${PRODUCT_ID}\\$WARCH" "Install_Dir"
+InstallDirRegKey HKLM "Software\\${PRODUCT_NAME}\\${PRODUCT_ID}\\$WARCH" "Install_Dir"
!define MUI_ICON "share\\${PRODUCT_ICON}"
EOF
@@ -362,7 +379,7 @@ Section "${PROGRAM_NAME}${PROGRAM_VERSION} (required)" SecMainProg
File /r share
File /nonfatal debug.bat
File /nonfatal /r gdb
- WriteRegStr HKLM "Software\\${PROGRAM_NAME}\\v${PROGRAM_VERSION}\\$WARCH" "Install_Dir" "\$INSTDIR"
+ WriteRegStr HKLM "Software\\${PROGRAM_KEY}\\v${major_version}\\$WARCH" "Install_Dir" "\$INSTDIR"
WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}" "DisplayName" "${PROGRAM_NAME}${PROGRAM_VERSION}"
WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}" "UninstallString" '"\$INSTDIR\\uninstall.exe"'
WriteRegDWORD HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}" "NoModify" 1
@@ -380,7 +397,7 @@ if test -z "$NOVIDEOTOOLS"; then
cat >> $NSISFILE << EOF
Section "Videotimeline Tools" SecVideo
- WriteRegStr HKLM "Software\\${PROGRAM_NAME}\\v${PROGRAM_VERSION}\\video" "Install_Dir" "\$INSTDIR\\video"
+ WriteRegStr HKLM "Software\\${PROGRAM_KEY}\\v${major_version}\\video" "Install_Dir" "\$INSTDIR\\video"
SetOutPath \$INSTDIR
File /r video
SectionEnd
@@ -441,7 +458,7 @@ Section "Uninstall"
SetShellVarContext all
DeleteRegKey HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}"
DeleteRegKey HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}"
- DeleteRegKey HKLM "Software\\${PROGRAM_NAME}\\v${PROGRAM_VERSION}"
+ DeleteRegKey HKLM "Software\\${PROGRAM_KEY}\\v${major_version}"
RMDir /r "\$INSTDIR\\bin"
RMDir /r "\$INSTDIR\\lib"
RMDir /r "\$INSTDIR\\share"
diff --git a/vst/ardourvst.in b/vst/ardourvst.in
index 9cf8807..639acb4 100644
--- a/vst/ardourvst.in
+++ b/vst/ardourvst.in
@@ -1,13 +1,14 @@
#!/bin/sh
#
-# Running Ardour requires these 3 variables to be set
+# Running Ardour requires these variables to be set
#
export ARDOUR_DATA_PATH=@DATADIR@
export ARDOUR_CONFIG_PATH=@CONFDIR@
export ARDOUR_DLL_PATH=@LIBDIR@
+export VAMP_PATH=@LIBDIR@/vamp${VAMP_PATH:+:$VAMP_PATH}
export GTK_PATH=@LIBDIR@${GTK_PATH:+:$GTK_PATH}
export LD_LIBRARY_PATH=@LIBDIR@${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
@@ -15,5 +16,3 @@ export LD_LIBRARY_PATH=@LIBDIR@${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
export ARDOUR_SELF="$0"
exec wine @LIBDIR@/ardour- at VERSION@-vst.exe.so "$@"
-
-
diff --git a/wscript b/wscript
index 4635eaf..fce1359 100644
--- a/wscript
+++ b/wscript
@@ -135,10 +135,11 @@ clang_dict['sse'] = ''
clang_dict['fpmath-sse'] = ''
clang_dict['xmmintrinsics'] = ''
clang_dict['silence-unused-arguments'] = '-Qunused-arguments'
-clang_dict['extra-cxx-warnings'] = [ '-Woverloaded-virtual', '-Wno-mismatched-tags' ]
+clang_dict['extra-cxx-warnings'] = [ '-Woverloaded-virtual', '-Wno-mismatched-tags', '-Wno-cast-align', '-Wno-unused-local-typedefs' ]
clang_dict['cxx-strict'] = [ '-ansi', '-Wnon-virtual-dtor', '-Woverloaded-virtual', '-fstrict-overflow' ]
clang_dict['strict'] = ['-Wall', '-Wcast-align', '-Wextra', '-Wwrite-strings' ]
clang_dict['generic-x86'] = [ '-arch', 'i386' ]
+clang_dict['full-optimization'] = [ '-O3', '-fomit-frame-pointer', '-ffast-math', ]
compiler_flags_dictionaries['clang'] = clang_dict;
clang_darwin_dict = compiler_flags_dictionaries['clang'].copy();
@@ -147,7 +148,7 @@ clang_darwin_dict['full-optimization'] = [ '-O3', '-ffast-math', '-fstrength-red
compiler_flags_dictionaries['clang-darwin'] = clang_darwin_dict;
def fetch_git_revision ():
- cmd = "git describe HEAD | sed 's/^[A-Za-z]*+//'"
+ cmd = "git describe HEAD | sed 's/^[A-Za-z0-9]*+//'"
output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines()
rev = output[0].decode ('utf-8')
return rev
@@ -203,6 +204,7 @@ children = [
'libs/qm-dsp',
'libs/vamp-plugins',
'libs/libltc',
+ 'libs/lua',
'libs/ptformat',
# core ardour libraries
'libs/pbd',
@@ -217,11 +219,16 @@ children = [
'libs/audiographer',
'libs/canvas',
'libs/plugins/reasonablesynth.lv2',
+ 'libs/plugins/a-comp.lv2',
+ 'libs/plugins/a-delay.lv2',
+ 'libs/plugins/a-eq.lv2',
+ 'libs/plugins/a-reverb.lv2',
'gtk2_ardour',
'export',
'midi_maps',
'mcp',
'patchfiles',
+ 'scripts',
'headless',
'session_utils',
# shared helper binaries (plugin-scanner, exec-wrapper)
@@ -229,6 +236,7 @@ children = [
'libs/vfork',
'libs/ardouralsautil',
'cfgtool',
+ 'tools/luadevel',
]
i18n_children = [
@@ -390,7 +398,7 @@ int main() { return 0; }''',
#
compiler_flags.append ('-U__STRICT_ANSI__')
- if opt.use_libcpp:
+ if opt.use_libcpp or conf.env['build_host'] in [ 'el_capitan' ]:
cxx_flags.append('--stdlib=libc++')
linker_flags.append('--stdlib=libc++')
@@ -402,7 +410,7 @@ int main() { return 0; }''',
# from requiring a full path to requiring just the header name.
cxx_flags.append('-DCARBON_FLAT_HEADERS')
- if not opt.use_libcpp:
+ if not opt.use_libcpp and not conf.env['build_host'] in [ 'el_capitan' ]:
cxx_flags.append('--stdlib=libstdc++')
linker_flags.append('--stdlib=libstdc++')
# Prevents visibility issues in standard headers
@@ -564,6 +572,9 @@ int main() { return 0; }''',
if opt.stl_debug:
cxx_flags.append("-D_GLIBCXX_DEBUG")
+ if re.search ("freebsd", sys.platform) != None:
+ linker_flags.append('-lexecinfo')
+
if conf.env['DEBUG_RT_ALLOC']:
compiler_flags.append('-DDEBUG_RT_ALLOC')
linker_flags.append('-ldl')
@@ -607,6 +618,10 @@ int main() { return 0; }''',
if Options.options.program_name.lower() == "mixbus":
compiler_flags.append ('-DMIXBUS')
+ if Options.options.program_name.lower() == "mixbus32c":
+ compiler_flags.append ('-DMIXBUS')
+ compiler_flags.append ('-DMIXBUS32C')
+
compiler_flags.append ('-DPROGRAM_NAME="' + Options.options.program_name + '"')
compiler_flags.append ('-DPROGRAM_VERSION="' + PROGRAM_VERSION + '"')
@@ -629,6 +644,16 @@ int main() { return 0; }''',
conf.env.append_value('CXXFLAGS', cxx_flags)
conf.env.append_value('LINKFLAGS', linker_flags)
+def create_resource_file(icon):
+ try:
+ text = 'IDI_ICON1 ICON DISCARDABLE "icons/' + icon + '.ico"\n'
+ o = open('gtk2_ardour/windows_icon.rc', 'w')
+ o.write(text)
+ o.close()
+ except IOError:
+ print('Could not open gtk2_ardour/windows_icon.rc for writing\n')
+ sys.exit(-1)
+
def is_tracks_build (conf):
return conf.env['PROGRAM_NAME'] == 'Tracks Live'
@@ -678,6 +703,8 @@ def options(opt):
help='Build internal libs as static libraries')
opt.add_option('--use-external-libs', action='store_true', default=False, dest='use_external_libs',
help='Use external/system versions of some bundled libraries')
+ opt.add_option('--luadoc', action='store_true', default=False, dest='luadoc',
+ help='Compile Tool to dump LuaBindings (needs C++11)')
opt.add_option('--lv2', action='store_true', default=True, dest='lv2',
help='Compile with support for LV2 (if Lilv+Suil is available)')
opt.add_option('--no-lv2', action='store_false', dest='lv2',
@@ -741,6 +768,8 @@ def options(opt):
help='Turn on AddressSanitizer (requires GCC >= 4.8 or clang >= 3.1)')
opt.add_option('--ptformat', action='store_true', default=False, dest='ptformat',
help='Turn on PT session import option')
+ opt.add_option('--no-threaded-waveviews', action='store_true', default=False, dest='no_threaded_waveviews',
+ help='Disable threaded waveview rendering')
for i in children:
opt.recurse(i)
@@ -844,9 +873,7 @@ def configure(conf):
conf.define ('HAVE_COREAUDIO', 1)
conf.define ('AUDIOUNIT_SUPPORT', 1)
- conf.define ('GTKOSX', 1)
conf.define ('TOP_MENUBAR',1)
- conf.define ('GTKOSX',1)
# It would be nice to be able to use this to force back-compatibility with 10.4
# but even by the time of 11, the 10.4 SDK is no longer available in any normal
@@ -894,6 +921,10 @@ def configure(conf):
print ('No Carbon support available for this build\n')
+ if Options.options.luadoc:
+ conf.env['LUABINDINGDOC'] = True
+ conf.define ('LUABINDINGDOC', 1)
+
if Options.options.internal_shared_libs:
conf.define('INTERNAL_SHARED_LIBS', 1)
@@ -916,7 +947,10 @@ def configure(conf):
# executing a test program is n/a when cross-compiling
if Options.options.dist_target != 'mingw':
if Options.options.dist_target != 'msvc':
- conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL')
+ if re.search ("freebsd", sys.platform) != None:
+ conf.check_cc(function_name='dlopen', header_name='dlfcn.h', uselib_store='DL')
+ else:
+ conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL')
conf.check_cxx(fragment = "#include <boost/version.hpp>\nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n",
execute = "1",
mandatory = True,
@@ -1079,7 +1113,10 @@ int main () { return 0; }
if opts.ptformat:
conf.define('PTFORMAT', 1)
conf.env['PTFORMAT'] = True
-
+ if opts.no_threaded_waveviews:
+ conf.define('NO_THREADED_WAVEVIEWS', 1)
+ conf.env['NO_THREADED_WAVEVIEWS'] = True
+
backends = opts.with_backends.split(',')
if not backends:
@@ -1159,8 +1196,10 @@ const char* const ardour_config_info = "\\n\\
write_config_text('Freedesktop files', opts.freedesktop)
write_config_text('Libjack linking', conf.env['libjack_link'])
write_config_text('Libjack metadata', conf.is_defined ('HAVE_JACK_METADATA'))
+ write_config_text('Lua Binding Doc', conf.is_defined('LUABINDINGDOC'))
write_config_text('LV2 UI embedding', conf.is_defined('HAVE_SUIL'))
write_config_text('LV2 support', conf.is_defined('LV2_SUPPORT'))
+ write_config_text('LV2 extensions', conf.is_defined('LV2_EXTENDED'))
write_config_text('LXVST support', conf.is_defined('LXVST_SUPPORT'))
write_config_text('OGG', conf.is_defined('HAVE_OGG'))
write_config_text('Phone home', conf.is_defined('PHONE_HOME'))
@@ -1178,16 +1217,12 @@ const char* const ardour_config_info = "\\n\\
write_config_text('Wiimote support', conf.is_defined('BUILD_WIIMOTE'))
write_config_text('Windows key', opts.windows_key)
- print ('\nBackends:')
-
write_config_text('PortAudio Backend', conf.env['BUILD_PABACKEND'])
write_config_text('CoreAudio/Midi Backend',conf.env['BUILD_CORECRAPPITA'])
write_config_text('ALSA Backend', conf.env['BUILD_ALSABACKEND'])
write_config_text('Dummy backend', conf.env['BUILD_DUMMYBACKEND'])
write_config_text('JACK Backend', conf.env['BUILD_JACKBACKEND'])
- print ('\n')
-
write_config_text('C compiler flags', conf.env['CFLAGS'])
write_config_text('C++ compiler flags', conf.env['CXXFLAGS'])
write_config_text('Linker flags', conf.env['LINKFLAGS'])
@@ -1196,6 +1231,9 @@ const char* const ardour_config_info = "\\n\\
config_text.close ()
print('')
+ if Options.options.dist_target == 'mingw' or Options.options.dist_target == 'msvc':
+ create_resource_file(Options.options.program_name.lower())
+
def build(bld):
create_stored_revision()
--
ardour Debian packaging
More information about the pkg-multimedia-commits
mailing list